{"version":3,"file":"webgazer2.umd.cjs","sources":["../node_modules/@tensorflow/tfjs-core/dist/backends/backend.js","../node_modules/@tensorflow/tfjs-core/dist/util_base.js","../node_modules/@tensorflow/tfjs-core/dist/environment.js","../node_modules/@tensorflow/tfjs-core/dist/global_util.js","../node_modules/@tensorflow/tfjs-core/dist/kernel_names.js","../node_modules/@tensorflow/tfjs-core/dist/log.js","../node_modules/@tensorflow/tfjs-core/dist/kernel_registry.js","../node_modules/long/src/long.js","../node_modules/@tensorflow/tfjs-core/dist/hash_util.js","../node_modules/@tensorflow/tfjs-core/dist/util.js","../node_modules/@tensorflow/tfjs-core/dist/profiler.js","../node_modules/@tensorflow/tfjs-core/dist/tape.js","../node_modules/@tensorflow/tfjs-core/dist/tensor_format.js","../node_modules/@tensorflow/tfjs-core/dist/tensor.js","../node_modules/@tensorflow/tfjs-core/dist/types.js","../node_modules/@tensorflow/tfjs-core/dist/tensor_util.js","../node_modules/@tensorflow/tfjs-core/dist/engine.js","../node_modules/@tensorflow/tfjs-core/dist/device_util.js","../node_modules/@tensorflow/tfjs-core/dist/flags.js","../node_modules/@tensorflow/tfjs-core/dist/tensor_util_env.js","../node_modules/@tensorflow/tfjs-core/dist/ops/operation.js","../node_modules/@tensorflow/tfjs-core/dist/ops/complex.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor_ops_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor.js","../node_modules/@tensorflow/tfjs-core/dist/io/types.js","../node_modules/@tensorflow/tfjs-core/dist/io/io_utils.js","../node_modules/@tensorflow/tfjs-core/dist/io/router_registry.js","../node_modules/@tensorflow/tfjs-core/dist/io/indexed_db.js","../node_modules/@tensorflow/tfjs-core/dist/io/local_storage.js","../node_modules/@tensorflow/tfjs-core/dist/io/model_management.js","../node_modules/@tensorflow/tfjs-core/dist/platforms/platform_browser.js","../node_modules/@tensorflow/tfjs-core/dist/platforms/platform_node.js","../node_modules/@tensorflow/tfjs-core/dist/ops/buffer.js","../node_modules/@tensorflow/tfjs-core/dist/ops/cast.js","../node_modules/@tensorflow/tfjs-core/dist/ops/clone.js","../node_modules/@tensorflow/tfjs-core/dist/ops/print.js","../node_modules/@tensorflow/tfjs-core/dist/base_side_effects.js","../node_modules/@tensorflow/tfjs-core/dist/io/browser_files.js","../node_modules/@tensorflow/tfjs-core/dist/io/progress.js","../node_modules/@tensorflow/tfjs-core/dist/io/weights_loader.js","../node_modules/@tensorflow/tfjs-core/dist/io/http.js","../node_modules/@tensorflow/tfjs-core/dist/io/passthrough.js","../node_modules/@tensorflow/tfjs-core/dist/io/io.js","../node_modules/@tensorflow/tfjs-core/dist/ops/mat_mul.js","../node_modules/@tensorflow/tfjs-core/dist/ops/one_hot.js","../node_modules/@tensorflow/tfjs-core/dist/globals.js","../node_modules/@tensorflow/tfjs-core/dist/ops/imag.js","../node_modules/@tensorflow/tfjs-core/dist/ops/neg.js","../node_modules/@tensorflow/tfjs-core/dist/ops/real.js","../node_modules/@tensorflow/tfjs-core/dist/ops/transpose.js","../node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/browser.js","../node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/slice_util.js","../node_modules/@tensorflow/tfjs-core/dist/serialization.js","../node_modules/@tensorflow/tfjs-core/dist/ops/add.js","../node_modules/@tensorflow/tfjs-core/dist/ops/floorDiv.js","../node_modules/@tensorflow/tfjs-core/dist/ops/div.js","../node_modules/@tensorflow/tfjs-core/dist/ops/mul.js","../node_modules/@tensorflow/tfjs-core/dist/ops/abs.js","../node_modules/@tensorflow/tfjs-core/dist/ops/acos.js","../node_modules/@tensorflow/tfjs-core/dist/ops/acosh.js","../node_modules/@tensorflow/tfjs-core/dist/ops/add_n.js","../node_modules/@tensorflow/tfjs-core/dist/ops/all.js","../node_modules/@tensorflow/tfjs-core/dist/ops/any.js","../node_modules/@tensorflow/tfjs-core/dist/ops/arg_max.js","../node_modules/@tensorflow/tfjs-core/dist/ops/arg_min.js","../node_modules/@tensorflow/tfjs-core/dist/ops/asin.js","../node_modules/@tensorflow/tfjs-core/dist/ops/asinh.js","../node_modules/@tensorflow/tfjs-core/dist/ops/atan.js","../node_modules/@tensorflow/tfjs-core/dist/ops/atan2.js","../node_modules/@tensorflow/tfjs-core/dist/ops/atanh.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/reshape.js","../node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool.js","../node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/concat.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sigmoid.js","../node_modules/@tensorflow/tfjs-core/dist/ops/slice.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tanh.js","../node_modules/@tensorflow/tfjs-core/dist/ops/basic_lstm_cell.js","../node_modules/@tensorflow/tfjs-core/dist/ops/batch_to_space_nd.js","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm.js","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/batchnorm4d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/bincount.js","../node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_args.js","../node_modules/@tensorflow/tfjs-core/dist/ops/broadcast_to.js","../node_modules/@tensorflow/tfjs-core/dist/ops/ceil.js","../node_modules/@tensorflow/tfjs-core/dist/ops/fill.js","../node_modules/@tensorflow/tfjs-core/dist/ops/clip_by_value.js","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_1d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_4d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv1d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_input.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_transpose.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_input.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_transpose.js","../node_modules/@tensorflow/tfjs-core/dist/ops/cos.js","../node_modules/@tensorflow/tfjs-core/dist/ops/cosh.js","../node_modules/@tensorflow/tfjs-core/dist/ops/cumprod.js","../node_modules/@tensorflow/tfjs-core/dist/ops/cumsum.js","../node_modules/@tensorflow/tfjs-core/dist/ops/dense_bincount.js","../node_modules/@tensorflow/tfjs-core/dist/ops/depth_to_space.js","../node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/diag.js","../node_modules/@tensorflow/tfjs-core/dist/ops/dilation2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/equal.js","../node_modules/@tensorflow/tfjs-core/dist/ops/where.js","../node_modules/@tensorflow/tfjs-core/dist/ops/zeros_like.js","../node_modules/@tensorflow/tfjs-core/dist/ops/div_no_nan.js","../node_modules/@tensorflow/tfjs-core/dist/ops/dot.js","../node_modules/@tensorflow/tfjs-core/dist/ops/einsum.js","../node_modules/@tensorflow/tfjs-core/dist/ops/elu.js","../node_modules/@tensorflow/tfjs-core/dist/ops/erf.js","../node_modules/@tensorflow/tfjs-core/dist/ops/axis_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/max.js","../node_modules/@tensorflow/tfjs-core/dist/ops/min.js","../node_modules/@tensorflow/tfjs-core/dist/ops/pow.js","../node_modules/@tensorflow/tfjs-core/dist/ops/scalar.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sqrt.js","../node_modules/@tensorflow/tfjs-core/dist/ops/square.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sum.js","../node_modules/@tensorflow/tfjs-core/dist/ops/norm.js","../node_modules/@tensorflow/tfjs-core/dist/ops/euclidean_norm.js","../node_modules/@tensorflow/tfjs-core/dist/ops/exp.js","../node_modules/@tensorflow/tfjs-core/dist/ops/expand_dims.js","../node_modules/@tensorflow/tfjs-core/dist/ops/expm1.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tile.js","../node_modules/@tensorflow/tfjs-core/dist/ops/eye.js","../node_modules/@tensorflow/tfjs-core/dist/ops/floor.js","../node_modules/@tensorflow/tfjs-core/dist/ops/gather.js","../node_modules/@tensorflow/tfjs-core/dist/ops/greater.js","../node_modules/@tensorflow/tfjs-core/dist/ops/greater_equal.js","../node_modules/@tensorflow/tfjs-core/dist/ops/is_finite.js","../node_modules/@tensorflow/tfjs-core/dist/ops/is_inf.js","../node_modules/@tensorflow/tfjs-core/dist/ops/is_nan.js","../node_modules/@tensorflow/tfjs-core/dist/ops/leaky_relu.js","../node_modules/@tensorflow/tfjs-core/dist/ops/less.js","../node_modules/@tensorflow/tfjs-core/dist/ops/less_equal.js","../node_modules/@tensorflow/tfjs-core/dist/ops/linspace.js","../node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization.js","../node_modules/@tensorflow/tfjs-core/dist/ops/log.js","../node_modules/@tensorflow/tfjs-core/dist/ops/log1p.js","../node_modules/@tensorflow/tfjs-core/dist/gradients.js","../node_modules/@tensorflow/tfjs-core/dist/ops/softplus.js","../node_modules/@tensorflow/tfjs-core/dist/ops/log_sigmoid.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sub.js","../node_modules/@tensorflow/tfjs-core/dist/ops/log_softmax.js","../node_modules/@tensorflow/tfjs-core/dist/ops/log_sum_exp.js","../node_modules/@tensorflow/tfjs-core/dist/ops/logical_and.js","../node_modules/@tensorflow/tfjs-core/dist/ops/logical_not.js","../node_modules/@tensorflow/tfjs-core/dist/ops/logical_or.js","../node_modules/@tensorflow/tfjs-core/dist/ops/logical_xor.js","../node_modules/@tensorflow/tfjs-core/dist/ops/search_sorted.js","../node_modules/@tensorflow/tfjs-core/dist/ops/lower_bound.js","../node_modules/@tensorflow/tfjs-core/dist/ops/max_pool.js","../node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_with_argmax.js","../node_modules/@tensorflow/tfjs-core/dist/ops/maximum.js","../node_modules/@tensorflow/tfjs-core/dist/ops/mean.js","../node_modules/@tensorflow/tfjs-core/dist/ops/zeros.js","../node_modules/@tensorflow/tfjs-core/dist/ops/ones.js","../node_modules/@tensorflow/tfjs-core/dist/ops/meshgrid.js","../node_modules/@tensorflow/tfjs-core/dist/ops/minimum.js","../node_modules/@tensorflow/tfjs-core/dist/ops/mirror_pad.js","../node_modules/@tensorflow/tfjs-core/dist/ops/mod.js","../node_modules/@tensorflow/tfjs-core/dist/ops/moments.js","../node_modules/@tensorflow/tfjs-core/dist/ops/multi_rnn_cell.js","../node_modules/@tensorflow/tfjs-core/dist/ops/multinomial.js","../node_modules/@tensorflow/tfjs-core/dist/ops/not_equal.js","../node_modules/@tensorflow/tfjs-core/dist/ops/ones_like.js","../node_modules/@tensorflow/tfjs-core/dist/ops/outer_product.js","../node_modules/@tensorflow/tfjs-core/dist/ops/pad.js","../node_modules/@tensorflow/tfjs-core/dist/ops/pad1d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/pad2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/pad3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/pad4d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/space_to_batch_nd.js","../node_modules/@tensorflow/tfjs-core/dist/ops/pool.js","../node_modules/@tensorflow/tfjs-core/dist/ops/prelu.js","../node_modules/@tensorflow/tfjs-core/dist/ops/prod.js","../node_modules/@tensorflow/tfjs-core/dist/ops/ragged_gather.js","../node_modules/@tensorflow/tfjs-core/dist/ops/ragged_tensor_to_tensor.js","../node_modules/@tensorflow/tfjs-core/dist/ops/rand.js","../node_modules/seedrandom/lib/alea.js","../node_modules/seedrandom/lib/xor128.js","../node_modules/seedrandom/lib/xorwow.js","../node_modules/seedrandom/lib/xorshift7.js","../node_modules/seedrandom/lib/xor4096.js","../node_modules/seedrandom/lib/tychei.js","../__vite-browser-external","../node_modules/seedrandom/seedrandom.js","../node_modules/seedrandom/index.js","../node_modules/@tensorflow/tfjs-core/dist/ops/rand_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/random_gamma.js","../node_modules/@tensorflow/tfjs-core/dist/ops/random_normal.js","../node_modules/@tensorflow/tfjs-core/dist/ops/random_standard_normal.js","../node_modules/@tensorflow/tfjs-core/dist/ops/random_uniform.js","../node_modules/@tensorflow/tfjs-core/dist/ops/range.js","../node_modules/@tensorflow/tfjs-core/dist/ops/reciprocal.js","../node_modules/@tensorflow/tfjs-core/dist/ops/relu.js","../node_modules/@tensorflow/tfjs-core/dist/ops/relu6.js","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse.js","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse_1d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse_2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse_3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/reverse_4d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/round.js","../node_modules/@tensorflow/tfjs-core/dist/ops/rsqrt.js","../node_modules/@tensorflow/tfjs-core/dist/ops/selu.js","../node_modules/@tensorflow/tfjs-core/dist/ops/separable_conv2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/setdiff1d_async.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sign.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sin.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sinh.js","../node_modules/@tensorflow/tfjs-core/dist/ops/slice1d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/slice2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/slice3d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/slice4d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/softmax.js","../node_modules/@tensorflow/tfjs-core/dist/ops/spectral/fft.js","../node_modules/@tensorflow/tfjs-core/dist/ops/spectral/ifft.js","../node_modules/@tensorflow/tfjs-core/dist/ops/spectral/irfft.js","../node_modules/@tensorflow/tfjs-core/dist/ops/split.js","../node_modules/@tensorflow/tfjs-core/dist/ops/spectral/rfft.js","../node_modules/@tensorflow/tfjs-core/dist/ops/squared_difference.js","../node_modules/@tensorflow/tfjs-core/dist/ops/squeeze.js","../node_modules/@tensorflow/tfjs-core/dist/ops/stack.js","../node_modules/@tensorflow/tfjs-core/dist/ops/step.js","../node_modules/@tensorflow/tfjs-core/dist/ops/strided_slice.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tan.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor1d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor4d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor5d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/tensor6d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/topk.js","../node_modules/@tensorflow/tfjs-core/dist/ops/truncated_normal.js","../node_modules/@tensorflow/tfjs-core/dist/ops/unique.js","../node_modules/@tensorflow/tfjs-core/dist/ops/unsorted_segment_sum.js","../node_modules/@tensorflow/tfjs-core/dist/ops/unstack.js","../node_modules/@tensorflow/tfjs-core/dist/ops/upper_bound.js","../node_modules/@tensorflow/tfjs-core/dist/ops/variable.js","../node_modules/@tensorflow/tfjs-core/dist/backends/where_impl.js","../node_modules/@tensorflow/tfjs-core/dist/ops/where_async.js","../node_modules/@tensorflow/tfjs-core/dist/ops/boolean_mask.js","../node_modules/@tensorflow/tfjs-core/dist/ops/moving_average.js","../node_modules/@tensorflow/tfjs-core/dist/ops/scatter_nd.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse_to_dense.js","../node_modules/@tensorflow/tfjs-core/dist/ops/gather_nd.js","../node_modules/@tensorflow/tfjs-core/dist/ops/dropout_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/dropout.js","../node_modules/@tensorflow/tfjs-core/dist/ops/signal_ops_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/in_top_k.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv2d_backprop_filter.js","../node_modules/@tensorflow/tfjs-core/dist/ops/fused_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/fused/conv2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_filter.js","../node_modules/@tensorflow/tfjs-core/dist/ops/depthwise_conv2d_native_backprop_input.js","../node_modules/@tensorflow/tfjs-core/dist/ops/fused/depthwise_conv2d.js","../node_modules/@tensorflow/tfjs-core/dist/ops/fused/mat_mul.js","../node_modules/@tensorflow/tfjs-core/dist/ops/fused_ops.js","../node_modules/@tensorflow/tfjs-core/dist/ops/signal/hamming_window.js","../node_modules/@tensorflow/tfjs-core/dist/ops/signal/hann_window.js","../node_modules/@tensorflow/tfjs-core/dist/ops/signal/frame.js","../node_modules/@tensorflow/tfjs-core/dist/ops/signal/stft.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/crop_and_resize.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/flip_left_right.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/grayscale_to_rgb.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/rotate_with_offset.js","../node_modules/@tensorflow/tfjs-core/dist/ops/nonmax_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression.js","../node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_util.js","../node_modules/@tensorflow/tfjs-core/dist/backends/non_max_suppression_impl.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_async.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_with_score_async.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/non_max_suppression_padded_async.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_bilinear.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/resize_nearest_neighbor.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/threshold.js","../node_modules/@tensorflow/tfjs-core/dist/ops/image/transform.js","../node_modules/@tensorflow/tfjs-core/dist/ops/linalg/band_part.js","../node_modules/@tensorflow/tfjs-core/dist/ops/linalg/gram_schmidt.js","../node_modules/@tensorflow/tfjs-core/dist/ops/linalg/qr.js","../node_modules/@tensorflow/tfjs-core/dist/ops/loss_ops_utils.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/compute_weighted_loss.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/absolute_difference.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/cosine_distance.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/hinge_loss.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/huber_loss.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/log_loss.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/mean_squared_error.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/sigmoid_cross_entropy.js","../node_modules/@tensorflow/tfjs-core/dist/ops/losses/softmax_cross_entropy.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_mean.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_sum.js","../node_modules/@tensorflow/tfjs-core/dist/ops/string/string_n_grams.js","../node_modules/@tensorflow/tfjs-core/dist/ops/string/string_split.js","../node_modules/@tensorflow/tfjs-core/dist/ops/string/string_to_hash_bucket_fast.js","../node_modules/@tensorflow/tfjs-core/dist/ops/ops.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/adadelta_optimizer.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/adagrad_optimizer.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/adam_optimizer.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/adamax_optimizer.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/sgd_optimizer.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/momentum_optimizer.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/rmsprop_optimizer.js","../node_modules/@tensorflow/tfjs-core/dist/optimizers/optimizer_constructors.js","../node_modules/@tensorflow/tfjs-core/dist/train.js","../node_modules/@tensorflow/tfjs-core/dist/browser_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/concat_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/ragged_to_dense_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/reduce_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/rotate_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/array_ops_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/selu_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/erf_util.js","../node_modules/@tensorflow/tfjs-core/dist/backends/complex_util.js","../node_modules/@tensorflow/tfjs-core/dist/backends/einsum_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/split_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_fill_empty_rows_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_reshape_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/sparse/sparse_segment_reduction_util.js","../node_modules/@tensorflow/tfjs-core/dist/ops/segment_util.js","../node_modules/@tensorflow/tfjs-core/dist/backends/backend_util.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Abs_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Acos_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Acosh_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Add_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/AddN_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/ArgMax_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/ArgMin_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Asin_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Asinh_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Atan2_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Atan_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Atanh_grad.js","../node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_3d_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/AvgPool3D_grad.js","../node_modules/@tensorflow/tfjs-core/dist/ops/avg_pool_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/AvgPool_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/BatchMatMul_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/BatchToSpaceND_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/BroadcastTo_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Cast_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Ceil_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/ClipByValue_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/ComplexAbs_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Concat_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Conv2D_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Conv2DBackpropInput_grad.js","../node_modules/@tensorflow/tfjs-core/dist/ops/conv3d_backprop_filter.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Conv3D_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Cos_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Cosh_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Cumsum_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/DepthwiseConv2dNative_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Dilation2D_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Elu_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Erf_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Exp_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/ExpandDims_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Expm1_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Floor_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/FloorDiv_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/FusedBatchNorm_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/GatherV2_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/GreaterEqual_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Identity_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/IsFinite_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/IsInf_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/IsNan_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/LeakyRelu_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Log1p_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Log_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/LogSoftmax_grad.js","../node_modules/@tensorflow/tfjs-core/dist/ops/local_response_normalization_backprop.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/LRN_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/min_max_grad_util.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Max_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Maximum_grad.js","../node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_3d_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/MaxPool3D_grad.js","../node_modules/@tensorflow/tfjs-core/dist/ops/max_pool_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/MaxPool_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Mean_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Min_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Minimum_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/MirrorPad_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Mod_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Multiply_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Neg_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/OneHot_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/OnesLike_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Pack_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/PadV2_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Pow_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Prelu_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Prod_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/RealDiv_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Reciprocal_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Relu6_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Relu_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Reshape_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/ResizeBilinear_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/ResizeNearestNeighbor_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Reverse_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Round_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Rsqrt_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Select_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Selu_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Sigmoid_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Sign_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Sin_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Sinh_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Slice_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Softmax_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Softplus_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/SpaceToBatchND_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/SplitV_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Sqrt_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Square_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/SquaredDifference_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Step_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Sub_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Sum_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Tan_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Tanh_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Tile_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Transpose_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/Unpack_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/UnsortedSegmentSum_grad.js","../node_modules/@tensorflow/tfjs-core/dist/gradients/ZerosLike_grad.js","../node_modules/@tensorflow/tfjs-core/dist/register_all_gradients.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/abs.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/acos.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/acosh.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/add.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/all.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/any.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/arg_max.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/arg_min.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as_scalar.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as_type.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as1d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as2d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as3d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as4d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/as5d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/asin.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/asinh.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/atan.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/atan2.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/atanh.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/avg_pool.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/batch_to_space_nd.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/batchnorm.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/broadcast_to.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cast.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/ceil.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/clip_by_value.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/concat.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/conv1d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/conv2d_transpose.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/conv2d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cos.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cosh.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cumprod.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/cumsum.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/depth_to_space.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/depthwise_conv2d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/dilation2d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/div_no_nan.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/div.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/dot.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/elu.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/equal.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/erf.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/euclidean_norm.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/exp.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/expand_dims.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/expm1.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/fft.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/flatten.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/floor.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/floorDiv.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/gather.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/greater_equal.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/greater.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/ifft.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/irfft.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/is_finite.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/is_inf.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/is_nan.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/leaky_relu.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/less_equal.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/less.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/local_response_normalization.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log_sigmoid.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log_softmax.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log_sum_exp.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/log1p.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_and.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_not.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_or.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/logical_xor.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mat_mul.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/max_pool.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/max.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/maximum.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mean.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/min.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/minimum.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mirror_pad.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mod.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/mul.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/neg.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/norm.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/not_equal.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/one_hot.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/ones_like.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/pad.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/pool.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/pow.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/prelu.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/prod.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/reciprocal.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/relu.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/relu6.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/reshape_as.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/reshape.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/resize_bilinear.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/resize_nearest_neighbor.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/reverse.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/rfft.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/round.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/rsqrt.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/selu.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/separable_conv2d.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sigmoid.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sign.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sin.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sinh.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/slice.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/softmax.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/softplus.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/space_to_batch_nd.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/split.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sqrt.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/square.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/squared_difference.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/squeeze.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/stack.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/step.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/strided_slice.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sub.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/sum.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/tan.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/tanh.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/tile.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/to_bool.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/to_float.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/to_int.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/topk.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/transpose.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/unique.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/unsorted_segment_sum.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/unstack.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/where.js","../node_modules/@tensorflow/tfjs-core/dist/public/chained_ops/zeros_like.js","../node_modules/@tensorflow/tfjs-layers/dist/errors.js","../node_modules/@tensorflow/tfjs-layers/dist/utils/executor_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/utils/generic_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/backend/state.js","../node_modules/@tensorflow/tfjs-layers/dist/keras_format/common.js","../node_modules/@tensorflow/tfjs-layers/dist/common.js","../node_modules/@tensorflow/tfjs-layers/dist/utils/math_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/backend/common.js","../node_modules/@tensorflow/tfjs-layers/dist/backend/tfjs_backend.js","../node_modules/@tensorflow/tfjs-layers/dist/keras_format/initializer_config.js","../node_modules/@tensorflow/tfjs-layers/dist/initializers.js","../node_modules/@tensorflow/tfjs-layers/dist/utils/types_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/utils/variable_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/variables.js","../node_modules/@tensorflow/tfjs-layers/dist/engine/topology.js","../node_modules/@tensorflow/tfjs-layers/dist/engine/input_layer.js","../node_modules/@tensorflow/tfjs-layers/dist/engine/executor.js","../node_modules/@tensorflow/tfjs-layers/dist/flags_layers.js","../node_modules/@tensorflow/tfjs-layers/dist/constraints.js","../node_modules/@tensorflow/tfjs-layers/dist/logs.js","../node_modules/@tensorflow/tfjs-layers/dist/base_callbacks.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/serialization.js","../node_modules/@tensorflow/tfjs-layers/dist/losses.js","../node_modules/@tensorflow/tfjs-layers/dist/metrics.js","../node_modules/@tensorflow/tfjs-layers/dist/optimizers.js","../node_modules/@tensorflow/tfjs-layers/dist/user_defined_metadata.js","../node_modules/@tensorflow/tfjs-layers/dist/utils/layer_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/utils/serialization_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/version.js","../node_modules/@tensorflow/tfjs-layers/dist/engine/container.js","../node_modules/@tensorflow/tfjs-layers/dist/engine/training_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/engine/training_dataset.js","../node_modules/@tensorflow/tfjs-layers/dist/engine/training_tensors.js","../node_modules/@tensorflow/tfjs-layers/dist/engine/training.js","../node_modules/@tensorflow/tfjs-layers/dist/models.js","../node_modules/@tensorflow/tfjs-layers/dist/activations.js","../node_modules/@tensorflow/tfjs-layers/dist/regularizers.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/advanced_activations.js","../node_modules/@tensorflow/tfjs-layers/dist/utils/conv_utils.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/convolutional.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/convolutional_depthwise.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/recurrent.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/convolutional_recurrent.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/core.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/embeddings.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/merge.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/noise.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/normalization.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/padding.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/pooling.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/wrappers.js","../node_modules/@tensorflow/tfjs-layers/dist/layers/preprocessing/image_preprocessing.js","../node_modules/@tensorflow/tfjs-converter/dist/flags.js","../node_modules/@tensorflow/tfjs-converter/dist/data/compiled_api.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/custom_op/register.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/utils.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/arithmetic.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/basic_math.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/control.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/convolution.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/creation.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/dynamic.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/evaluation.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/graph.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/hash_table.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/image.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/logical.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/matrices.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/normalization.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/reduction.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/slice_join.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/sparse.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/spectral.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/string.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/op_list/transformation.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/operation_mapper.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/custom_op/node_value_impl.js","../node_modules/@tensorflow/tfjs-core/dist/ops/ops_for_converter.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/arithmetic_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/basic_math_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/tensor_utils.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/tensor_array.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/tensor_list.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/control_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/convolution_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/creation_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/dynamic_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/evaluation_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/graph_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/hash_table.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/hash_table_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/image_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/logical_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/matrices_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/normalization_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/reduction_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/slice_join_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/sparse_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/spectral_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/string_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/executors/transformation_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/operations/operation_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/execution_context.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/model_analysis.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/graph_executor.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/resource_manager.js","../node_modules/@tensorflow/tfjs-converter/dist/executor/graph_model.js","../node_modules/@tensorflow/tfjs-data/dist/iterators/lazy_iterator.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/cpu_util.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/backend_cpu.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Abs.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Complex.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/zeros_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Identity.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Real.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cast.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/binary_utils.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Add.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/unary_utils.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Ceil.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Equal.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Exp.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Expm1.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Floor.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd_Impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Greater.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GreaterEqual.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Less.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LessEqual.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Maximum.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Minimum.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multiply.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Neg.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NotEqual.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transpose.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prod.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RaggedGather_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RaggedTensorToTensor_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Rsqrt.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Scatter_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sigmoid.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Slice.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentReduction_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sqrt.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SquaredDifference.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sub.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/shared.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/base.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Elu.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LeakyRelu.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Prelu.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Relu6.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fused_utils.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reshape.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchMatMul.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/_FusedMatMul.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acos.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Acosh.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AddN.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/All.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Any.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMax.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ArgMin.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asin.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Asinh.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atan2.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Atanh.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/pool_utils.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3D.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPool3DGrad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/AvgPoolGrad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchNorm.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BatchToSpaceND.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Bincount.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/BroadcastArgs.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ClipByValue.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ComplexAbs.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Imag.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Concat.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2D.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropFilter.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv2DBackpropInput.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3D.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropFilterV2.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Conv3DBackpropInputV2.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cos.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cosh.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/CropAndResize.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cumprod.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Cumsum.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DenseBincount.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthToSpace.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNative.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/DepthwiseConv2dNativeBackpropInput.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Diag.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2D.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropFilter.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Dilation2DBackpropInput.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sum.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Einsum.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/EluGrad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Erf.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ExpandDims.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RealDiv.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/utils/fft_utils.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FFT.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Fill.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FlipLeftRight.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FloorDiv.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedConv2D.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/FusedDepthwiseConv2D.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherNd.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/GatherV2.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IFFT.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsFinite.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsInf.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/IsNaN.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LinSpace.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Log1p.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalAnd.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalNot.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LogicalOr.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRN.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/LRNGrad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Max.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3D.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPool3DGrad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolGrad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MaxPoolWithArgmax.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mean.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Min.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/MirrorPad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Mod.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softmax.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Multinomial.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV3.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV4.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/NonMaxSuppressionV5.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OneHot.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ZerosLike.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/OnesLike.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pack.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/PadV2.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Pow.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RaggedGather.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RaggedTensorToTensor.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Range.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reciprocal.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinear.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeBilinearGrad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighbor.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ResizeNearestNeighborGrad.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Reverse.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/RotateWithOffset.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Round.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/ScatterNd.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SearchSorted_impl.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SearchSorted.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Select.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Selu.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sign.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sin.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Sinh.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Softplus.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SpaceToBatchND.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseFillEmptyRows.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseReshape.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentMean.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseSegmentSum.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SparseToDense.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/SplitV.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Square.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Step.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StridedSlice.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringNGrams.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringSplit.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/StringToHashBucketFast.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tan.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tanh.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Tile.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/TopK.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Transform.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unique.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/Unpack.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/kernels/UnsortedSegmentSum.js","../node_modules/@tensorflow/tfjs-backend-cpu/dist/register_all_kernels.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/canvas_util.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/tex_util.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/webgl_util.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/flags_webgl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/glsl_version.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler_util.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/shader_compiler.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_math.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/decode_matrix_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_float_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/encode_matrix_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_util.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/gpgpu_context.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/shared.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/packing_util.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/pack_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/reshape_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/texture_manager.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/unaryop_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/unpack_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/backend_webgl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/base.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Identity.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Complex.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LeakyRelu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prelu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/kernel_funcs_utils.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/mulmat_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/binaryop_complex_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multiply.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reshape.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reshape.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/mean_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/reduce_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/reduce.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/transpose_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sum.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transpose.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/_FusedMatMul.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Abs.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acos.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Acosh.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Add.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/addn_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AddN.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/All.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Any.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/argminmax_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/arg_min_max.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMax.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ArgMin.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asin.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Asinh.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atan2.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Atanh.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/pool_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3D.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/avg_pool_backprop_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPool3DGrad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/AvgPoolGrad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchMatMul.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/batchnorm_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchNorm.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/slice_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Slice.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BatchToSpaceND.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Bincount.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/BroadcastArgs.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NotEqual.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Real.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernel_utils/int.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cast.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Ceil.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/clip_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ClipByValue.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/complex_abs_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ComplexAbs.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/concat_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Imag.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Concat.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/im2col_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2D.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropFilter.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv2DBackpropInput.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3D.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropFilterV2.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Conv3DBackpropInputV2.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cos.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cosh.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/crop_and_resize_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/CropAndResize.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/cum_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cum_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumprod.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Cumsum.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DenseBincount.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/depth_to_space_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthToSpace.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_gpu_depthwise.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_packed_gpu_depthwise.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNative.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/conv_backprop_gpu_depthwise.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropFilter.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/DepthwiseConv2dNativeBackpropInput.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/diag_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Diag.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/dilation_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Dilation2D.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Einsum.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Elu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/EluGrad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Equal.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Erf.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Exp.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ExpandDims.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Expm1.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/fft_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FFT.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/fill_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Fill.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/flip_left_right_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FlipLeftRight.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Floor.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FloorDiv.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels_utils/from_pixels_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FromPixels.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedConv2D.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/FusedDepthwiseConv2D.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_nd_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherNd.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/gather_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GatherV2.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Greater.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/GreaterEqual.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IFFT.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsFinite.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsInf.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/IsNaN.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Less.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LessEqual.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LinSpace.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Log1p.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalAnd.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalNot.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LogicalOr.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRN.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/lrn_grad_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/LRNGrad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Max.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Maximum.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3D.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/max_pool_backprop_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPool3DGrad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolGrad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MaxPoolWithArgmax.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean_impl.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mean.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Min.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Minimum.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/mirror_pad_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/MirrorPad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Mod.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/multinomial_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RealDiv.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sub.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softmax.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Multinomial.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Neg.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV3.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV4.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/NonMaxSuppressionV5.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/onehot_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OneHot.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ZerosLike.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/OnesLike.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pack.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/pad_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/PadV2.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Pow.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Prod.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RaggedGather.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RaggedTensorToTensor.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Range.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reciprocal.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Relu6.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinear.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_bilinear_backprop_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeBilinearGrad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighbor.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/resize_nearest_neighbor_backprop_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ResizeNearestNeighborGrad.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/reverse_packed_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Reverse.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/rotate_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/RotateWithOffset.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Round.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Rsqrt.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/scatter_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/ScatterNd.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/search_sorted_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SearchSorted.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/select_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Select.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Selu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sigmoid.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sign.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sin.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sinh.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Softplus.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SpaceToBatchND.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseFillEmptyRows.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseReshape.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentMean.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseSegmentSum.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SparseToDense.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SplitV.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Sqrt.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Square.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/SquaredDifference.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Step.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/strided_slice_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StridedSlice.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringNGrams.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringSplit.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/StringToHashBucketFast.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tan.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tanh.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/tile_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Tile.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/top_k_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/TopK.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/transform_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Transform.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unique.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/Unpack.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/segment_gpu.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/kernels/UnsortedSegmentSum.js","../node_modules/@tensorflow/tfjs-backend-webgl/dist/register_all_kernels.js","../node_modules/regression/dist/regression.js","../src/dom_util.mjs","../node_modules/localforage/dist/localforage.js","../node_modules/@tensorflow-models/face-landmarks-detection/dist/face-landmarks-detection.esm.js","../src/facemesh.mjs","../src/params.mjs","../src/worker_scripts/mat.js","../src/worker_scripts/util.js","../src/util_regression.mjs","../src/ridgeReg.mjs","../src/ridgeWeightedReg.mjs","../src/ridgeRegThreaded.mjs","../src/index.mjs"],"sourcesContent":["/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const EPSILON_FLOAT32 = 1e-7;\nexport const EPSILON_FLOAT16 = 1e-4;\n/** Convenient class for storing tensor-related data. */\nexport class DataStorage {\n    constructor(backend, dataMover) {\n        this.backend = backend;\n        this.dataMover = dataMover;\n        this.data = new WeakMap();\n        this.dataIdsCount = 0;\n    }\n    get(dataId) {\n        if (!this.data.has(dataId)) {\n            this.dataMover.moveData(this.backend, dataId);\n        }\n        return this.data.get(dataId);\n    }\n    set(dataId, value) {\n        this.dataIdsCount++;\n        this.data.set(dataId, value);\n    }\n    has(dataId) {\n        return this.data.has(dataId);\n    }\n    delete(dataId) {\n        this.dataIdsCount--;\n        return this.data.delete(dataId);\n    }\n    numDataIds() {\n        return this.dataIdsCount;\n    }\n}\n/**\n * The interface that defines the kernels that should be implemented when\n * adding a new backend. New backends don't need to implement every one of the\n * methods, this can be done gradually (throw an error for unimplemented\n * methods).\n */\nexport class KernelBackend {\n    refCount(dataId) {\n        return notYetImplemented('refCount');\n    }\n    incRef(dataId) {\n        return notYetImplemented('incRef');\n    }\n    timerAvailable() {\n        return true;\n    }\n    time(f) {\n        return notYetImplemented('time');\n    }\n    read(dataId) {\n        return notYetImplemented('read');\n    }\n    readSync(dataId) {\n        return notYetImplemented('readSync');\n    }\n    readToGPU(dataId, options) {\n        return notYetImplemented('readToGPU');\n    }\n    numDataIds() {\n        return notYetImplemented('numDataIds');\n    }\n    disposeData(dataId, force) {\n        return notYetImplemented('disposeData');\n    }\n    write(values, shape, dtype) {\n        return notYetImplemented('write');\n    }\n    move(dataId, values, shape, dtype, refCount) {\n        return notYetImplemented('move');\n    }\n    memory() {\n        return notYetImplemented('memory');\n    }\n    /** Returns the highest precision for floats in bits (e.g. 16 or 32) */\n    floatPrecision() {\n        return notYetImplemented('floatPrecision');\n    }\n    /** Returns the smallest representable number.  */\n    epsilon() {\n        return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16;\n    }\n    dispose() {\n        return notYetImplemented('dispose');\n    }\n}\nfunction notYetImplemented(kernelName) {\n    throw new Error(`'${kernelName}' not yet implemented or not found in the registry. ` +\n        `This kernel may not be supported by the tfjs backend you have chosen`);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvYmFja2VuZHMvYmFja2VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxJQUFJLENBQUM7QUF1QnBDLHdEQUF3RDtBQUN4RCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUFvQixPQUFzQixFQUFVLFNBQW9CO1FBQXBELFlBQU8sR0FBUCxPQUFPLENBQWU7UUFBVSxjQUFTLEdBQVQsU0FBUyxDQUFXO1FBSGhFLFNBQUksR0FBRyxJQUFJLE9BQU8sRUFBYSxDQUFDO1FBQ2hDLGlCQUFZLEdBQUcsQ0FBQyxDQUFDO0lBRWtELENBQUM7SUFFNUUsR0FBRyxDQUFDLE1BQWM7UUFDaEIsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzFCLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7U0FDL0M7UUFDRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRCxHQUFHLENBQUMsTUFBYyxFQUFFLEtBQVE7UUFDMUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsR0FBRyxDQUFDLE1BQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsTUFBTSxDQUFDLE1BQWM7UUFDbkIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztDQUNGO0FBaUJEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFDeEIsUUFBUSxDQUFDLE1BQWM7UUFDckIsT0FBTyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTSxDQUFDLE1BQWM7UUFDbkIsT0FBTyxpQkFBaUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyQyxDQUFDO0lBQ0QsY0FBYztRQUNaLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUNELElBQUksQ0FBQyxDQUFhO1FBQ2hCLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELElBQUksQ0FBQyxNQUFjO1FBQ2pCLE9BQU8saUJBQWlCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbkMsQ0FBQztJQUNELFFBQVEsQ0FBQyxNQUFjO1FBQ3JCLE9BQU8saUJBQWlCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELFNBQVMsQ0FBQyxNQUFjLEVBQUUsT0FBMEI7UUFDbEQsT0FBTyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBQ0QsVUFBVTtRQUNSLE9BQU8saUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUNELFdBQVcsQ0FBQyxNQUFjLEVBQUUsS0FBZTtRQUN6QyxPQUFPLGlCQUFpQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzFDLENBQUM7SUFDRCxLQUFLLENBQUMsTUFBcUIsRUFBRSxLQUFlLEVBQUUsS0FBZTtRQUMzRCxPQUFPLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLENBQUM7SUFDRCxJQUFJLENBQ0EsTUFBYyxFQUFFLE1BQXFCLEVBQUUsS0FBZSxFQUFFLEtBQWUsRUFDdkUsUUFBZ0I7UUFDbEIsT0FBTyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBQ0QsTUFBTTtRQUNKLE9BQU8saUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUNELHVFQUF1RTtJQUN2RSxjQUFjO1FBQ1osT0FBTyxpQkFBaUIsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFDRCxrREFBa0Q7SUFDbEQsT0FBTztRQUNMLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU87UUFDTCxPQUFPLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3RDLENBQUM7Q0FDRjtBQUVELFNBQVMsaUJBQWlCLENBQUMsVUFBa0I7SUFDM0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxJQUFJLFVBQVUsc0RBQXNEO1FBQ3BFLHNFQUFzRSxDQUFDLENBQUM7QUFDOUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCYWNrZW5kLCBEYXRhSWQsIERhdGFUb0dQVU9wdGlvbnMsIEdQVURhdGF9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge0JhY2tlbmRWYWx1ZXMsIERhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG5cbi8vIFJlcXVpcmVkIGluZm9ybWF0aW9uIGZvciBhbGwgYmFja2VuZHMuXG5leHBvcnQgaW50ZXJmYWNlIEJhY2tlbmRUaW1pbmdJbmZvIHtcbiAga2VybmVsTXM6IG51bWJlcnx7ZXJyb3I6IHN0cmluZ307XG4gIGdldEV4dHJhUHJvZmlsZUluZm8/KCk6IHN0cmluZzsgIC8vIGEgZmllbGQgZm9yIGFkZGl0aW9uYWwgdGltaW5nIGluZm9ybWF0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGUuZy4gcGFja2luZyAvIHVucGFja2luZyBmb3IgV2ViR0wgYmFja2VuZFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvclN0b3JhZ2Uge1xuICByZWFkKGRhdGFJZDogRGF0YUlkKTogUHJvbWlzZTxCYWNrZW5kVmFsdWVzPjtcbiAgcmVhZFN5bmMoZGF0YUlkOiBEYXRhSWQpOiBCYWNrZW5kVmFsdWVzO1xuICBkaXNwb3NlRGF0YShkYXRhSWQ6IERhdGFJZCwgZm9yY2U/OiBib29sZWFuKTogYm9vbGVhbjtcbiAgd3JpdGUodmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSk6IERhdGFJZDtcbiAgbW92ZShcbiAgICAgIGRhdGFJZDogRGF0YUlkLCB2YWx1ZXM6IEJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgICAgcmVmQ291bnQ6IG51bWJlcik6IHZvaWQ7XG4gIG1lbW9yeSgpOiB7dW5yZWxpYWJsZTogYm9vbGVhbjt9OyAgLy8gQmFja2VuZC1zcGVjaWZpYyBpbmZvcm1hdGlvbi5cbiAgLyoqIFJldHVybnMgbnVtYmVyIG9mIGRhdGEgaWRzIGN1cnJlbnRseSBpbiB0aGUgc3RvcmFnZS4gKi9cbiAgbnVtRGF0YUlkcygpOiBudW1iZXI7XG4gIHJlZkNvdW50KGRhdGFJZDogRGF0YUlkKTogbnVtYmVyO1xufVxuXG4vKiogQ29udmVuaWVudCBjbGFzcyBmb3Igc3RvcmluZyB0ZW5zb3ItcmVsYXRlZCBkYXRhLiAqL1xuZXhwb3J0IGNsYXNzIERhdGFTdG9yYWdlPFQ+IHtcbiAgcHJpdmF0ZSBkYXRhID0gbmV3IFdlYWtNYXA8RGF0YUlkLCBUPigpO1xuICBwcml2YXRlIGRhdGFJZHNDb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiYWNrZW5kOiBLZXJuZWxCYWNrZW5kLCBwcml2YXRlIGRhdGFNb3ZlcjogRGF0YU1vdmVyKSB7fVxuXG4gIGdldChkYXRhSWQ6IERhdGFJZCkge1xuICAgIGlmICghdGhpcy5kYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICB0aGlzLmRhdGFNb3Zlci5tb3ZlRGF0YSh0aGlzLmJhY2tlbmQsIGRhdGFJZCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gIH1cblxuICBzZXQoZGF0YUlkOiBEYXRhSWQsIHZhbHVlOiBUKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhSWRzQ291bnQrKztcbiAgICB0aGlzLmRhdGEuc2V0KGRhdGFJZCwgdmFsdWUpO1xuICB9XG5cbiAgaGFzKGRhdGFJZDogRGF0YUlkKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5oYXMoZGF0YUlkKTtcbiAgfVxuXG4gIGRlbGV0ZShkYXRhSWQ6IERhdGFJZCk6IGJvb2xlYW4ge1xuICAgIHRoaXMuZGF0YUlkc0NvdW50LS07XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5kZWxldGUoZGF0YUlkKTtcbiAgfVxuXG4gIG51bURhdGFJZHMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhSWRzQ291bnQ7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBEYXRhTW92ZXIge1xuICAvKipcbiAgICogVG8gYmUgY2FsbGVkIGJ5IGJhY2tlbmRzIHdoZW5ldmVyIHRoZXkgc2VlIGEgZGF0YUlkIHRoYXQgdGhleSBkb24ndCBvd24uXG4gICAqIFVwb24gY2FsbGluZyB0aGlzIG1ldGhvZCwgdGhlIG1vdmVyIHdpbGwgZmV0Y2ggdGhlIHRlbnNvciBmcm9tIGFub3RoZXJcbiAgICogYmFja2VuZCBhbmQgcmVnaXN0ZXIgaXQgd2l0aCB0aGUgY3VycmVudCBhY3RpdmUgYmFja2VuZC5cbiAgICovXG4gIG1vdmVEYXRhKGJhY2tlbmQ6IEtlcm5lbEJhY2tlbmQsIGRhdGFJZDogRGF0YUlkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCYWNrZW5kVGltZXIge1xuICAvLyBjaGVjayBpZiBiYWNrZW5kIHRpbWVyIGlzIGF2YWlsYWJsZVxuICB0aW1lckF2YWlsYWJsZSgpOiBib29sZWFuO1xuICB0aW1lKGY6ICgpID0+IHZvaWQpOiBQcm9taXNlPEJhY2tlbmRUaW1pbmdJbmZvPjtcbn1cblxuLyoqXG4gKiBUaGUgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyB0aGUga2VybmVscyB0aGF0IHNob3VsZCBiZSBpbXBsZW1lbnRlZCB3aGVuXG4gKiBhZGRpbmcgYSBuZXcgYmFja2VuZC4gTmV3IGJhY2tlbmRzIGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IGV2ZXJ5IG9uZSBvZiB0aGVcbiAqIG1ldGhvZHMsIHRoaXMgY2FuIGJlIGRvbmUgZ3JhZHVhbGx5ICh0aHJvdyBhbiBlcnJvciBmb3IgdW5pbXBsZW1lbnRlZFxuICogbWV0aG9kcykuXG4gKi9cbmV4cG9ydCBjbGFzcyBLZXJuZWxCYWNrZW5kIGltcGxlbWVudHMgVGVuc29yU3RvcmFnZSwgQmFja2VuZCwgQmFja2VuZFRpbWVyIHtcbiAgcmVmQ291bnQoZGF0YUlkOiBEYXRhSWQpOiBudW1iZXIge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgncmVmQ291bnQnKTtcbiAgfVxuICBpbmNSZWYoZGF0YUlkOiBEYXRhSWQpOiB2b2lkIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2luY1JlZicpO1xuICB9XG4gIHRpbWVyQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRpbWUoZjogKCkgPT4gdm9pZCk6IFByb21pc2U8QmFja2VuZFRpbWluZ0luZm8+IHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3RpbWUnKTtcbiAgfVxuICByZWFkKGRhdGFJZDogb2JqZWN0KTogUHJvbWlzZTxCYWNrZW5kVmFsdWVzPiB7XG4gICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCdyZWFkJyk7XG4gIH1cbiAgcmVhZFN5bmMoZGF0YUlkOiBvYmplY3QpOiBCYWNrZW5kVmFsdWVzIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ3JlYWRTeW5jJyk7XG4gIH1cbiAgcmVhZFRvR1BVKGRhdGFJZDogb2JqZWN0LCBvcHRpb25zPzogRGF0YVRvR1BVT3B0aW9ucyk6IEdQVURhdGEge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgncmVhZFRvR1BVJyk7XG4gIH1cbiAgbnVtRGF0YUlkcygpOiBudW1iZXIge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnbnVtRGF0YUlkcycpO1xuICB9XG4gIGRpc3Bvc2VEYXRhKGRhdGFJZDogb2JqZWN0LCBmb3JjZT86IGJvb2xlYW4pOiBib29sZWFuIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2Rpc3Bvc2VEYXRhJyk7XG4gIH1cbiAgd3JpdGUodmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSk6IERhdGFJZCB7XG4gICAgcmV0dXJuIG5vdFlldEltcGxlbWVudGVkKCd3cml0ZScpO1xuICB9XG4gIG1vdmUoXG4gICAgICBkYXRhSWQ6IERhdGFJZCwgdmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIHJlZkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ21vdmUnKTtcbiAgfVxuICBtZW1vcnkoKToge3VucmVsaWFibGU6IGJvb2xlYW47IHJlYXNvbnM/OiBzdHJpbmdbXX0ge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnbWVtb3J5Jyk7XG4gIH1cbiAgLyoqIFJldHVybnMgdGhlIGhpZ2hlc3QgcHJlY2lzaW9uIGZvciBmbG9hdHMgaW4gYml0cyAoZS5nLiAxNiBvciAzMikgKi9cbiAgZmxvYXRQcmVjaXNpb24oKTogMTZ8MzIge1xuICAgIHJldHVybiBub3RZZXRJbXBsZW1lbnRlZCgnZmxvYXRQcmVjaXNpb24nKTtcbiAgfVxuICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICBlcHNpbG9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZmxvYXRQcmVjaXNpb24oKSA9PT0gMzIgPyBFUFNJTE9OX0ZMT0FUMzIgOiBFUFNJTE9OX0ZMT0FUMTY7XG4gIH1cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICByZXR1cm4gbm90WWV0SW1wbGVtZW50ZWQoJ2Rpc3Bvc2UnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBub3RZZXRJbXBsZW1lbnRlZChrZXJuZWxOYW1lOiBzdHJpbmcpOiBuZXZlciB7XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGAnJHtrZXJuZWxOYW1lfScgbm90IHlldCBpbXBsZW1lbnRlZCBvciBub3QgZm91bmQgaW4gdGhlIHJlZ2lzdHJ5LiBgICtcbiAgICAgIGBUaGlzIGtlcm5lbCBtYXkgbm90IGJlIHN1cHBvcnRlZCBieSB0aGUgdGZqcyBiYWNrZW5kIHlvdSBoYXZlIGNob3NlbmApO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Shuffles the array in-place using Fisher-Yates algorithm.\n *\n * ```js\n * const a = [1, 2, 3, 4, 5];\n * tf.util.shuffle(a);\n * console.log(a);\n * ```\n *\n * @param array The array to shuffle in-place.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\n// tslint:disable-next-line:no-any\nexport function shuffle(array) {\n    let counter = array.length;\n    let index = 0;\n    // While there are elements in the array\n    while (counter > 0) {\n        // Pick a random index\n        index = (Math.random() * counter) | 0;\n        // Decrease counter by 1\n        counter--;\n        // And swap the last element with it\n        swap(array, counter, index);\n    }\n}\n/**\n * Shuffles two arrays in-place the same way using Fisher-Yates algorithm.\n *\n * ```js\n * const a = [1,2,3,4,5];\n * const b = [11,22,33,44,55];\n * tf.util.shuffleCombo(a, b);\n * console.log(a, b);\n * ```\n *\n * @param array The first array to shuffle in-place.\n * @param array2 The second array to shuffle in-place with the same permutation\n *     as the first array.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function shuffleCombo(\n// tslint:disable-next-line:no-any\narray, \n// tslint:disable-next-line:no-any\narray2) {\n    if (array.length !== array2.length) {\n        throw new Error(`Array sizes must match to be shuffled together ` +\n            `First array length was ${array.length}` +\n            `Second array length was ${array2.length}`);\n    }\n    let counter = array.length;\n    let index = 0;\n    // While there are elements in the array\n    while (counter > 0) {\n        // Pick a random index\n        index = (Math.random() * counter) | 0;\n        // Decrease counter by 1\n        counter--;\n        // And swap the last element of each array with it\n        swap(array, counter, index);\n        swap(array2, counter, index);\n    }\n}\n/** Clamps a value to a specified range. */\nexport function clamp(min, x, max) {\n    return Math.max(min, Math.min(x, max));\n}\nexport function nearestLargerEven(val) {\n    return val % 2 === 0 ? val : val + 1;\n}\nexport function swap(object, left, right) {\n    const temp = object[left];\n    object[left] = object[right];\n    object[right] = temp;\n}\nexport function sum(arr) {\n    let sum = 0;\n    for (let i = 0; i < arr.length; i++) {\n        sum += arr[i];\n    }\n    return sum;\n}\n/**\n * Returns a sample from a uniform [a, b) distribution.\n *\n * @param a The minimum support (inclusive).\n * @param b The maximum support (exclusive).\n * @return A pseudorandom number on the half-open interval [a,b).\n */\nexport function randUniform(a, b) {\n    const r = Math.random();\n    return (b * r) + (1 - r) * a;\n}\n/** Returns the squared Euclidean distance between two vectors. */\nexport function distSquared(a, b) {\n    let result = 0;\n    for (let i = 0; i < a.length; i++) {\n        const diff = Number(a[i]) - Number(b[i]);\n        result += diff * diff;\n    }\n    return result;\n}\n/**\n * Asserts that the expression is true. Otherwise throws an error with the\n * provided message.\n *\n * ```js\n * const x = 2;\n * tf.util.assert(x === 2, 'x is not 2');\n * ```\n *\n * @param expr The expression to assert (as a boolean).\n * @param msg A function that returns the message to report when throwing an\n *     error. We use a function for performance reasons.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function assert(expr, msg) {\n    if (!expr) {\n        throw new Error(typeof msg === 'string' ? msg : msg());\n    }\n}\nexport function assertShapesMatch(shapeA, shapeB, errorMessagePrefix = '') {\n    assert(arraysEqual(shapeA, shapeB), () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`);\n}\nexport function assertNonNull(a) {\n    assert(a != null, () => `The input to the tensor constructor must be a non-null value.`);\n}\n// NOTE: We explicitly type out what T extends instead of any so that\n// util.flatten on a nested array of number doesn't try to infer T as a\n// number[][], causing us to explicitly type util.flatten<number>().\n/**\n *  Flattens an arbitrarily nested array.\n *\n * ```js\n * const a = [[1, 2], [3, 4], [5, [6, [7]]]];\n * const flat = tf.util.flatten(a);\n * console.log(flat);\n * ```\n *\n *  @param arr The nested array to flatten.\n *  @param result The destination array which holds the elements.\n *  @param skipTypedArray If true, avoids flattening the typed arrays. Defaults\n *      to false.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function flatten(arr, result = [], skipTypedArray = false) {\n    if (result == null) {\n        result = [];\n    }\n    if (Array.isArray(arr) || isTypedArray(arr) && !skipTypedArray) {\n        for (let i = 0; i < arr.length; ++i) {\n            flatten(arr[i], result, skipTypedArray);\n        }\n    }\n    else {\n        result.push(arr);\n    }\n    return result;\n}\n/**\n * Returns the size (number of elements) of the tensor given its shape.\n *\n * ```js\n * const shape = [3, 4, 2];\n * const size = tf.util.sizeFromShape(shape);\n * console.log(size);\n * ```\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function sizeFromShape(shape) {\n    if (shape.length === 0) {\n        // Scalar.\n        return 1;\n    }\n    let size = shape[0];\n    for (let i = 1; i < shape.length; i++) {\n        size *= shape[i];\n    }\n    return size;\n}\nexport function isScalarShape(shape) {\n    return shape.length === 0;\n}\nexport function arraysEqual(n1, n2) {\n    if (n1 === n2) {\n        return true;\n    }\n    if (n1 == null || n2 == null) {\n        return false;\n    }\n    if (n1.length !== n2.length) {\n        return false;\n    }\n    for (let i = 0; i < n1.length; i++) {\n        if (n1[i] !== n2[i]) {\n            return false;\n        }\n    }\n    return true;\n}\nexport function isInt(a) {\n    return a % 1 === 0;\n}\nexport function tanh(x) {\n    // tslint:disable-next-line:no-any\n    if (Math.tanh != null) {\n        // tslint:disable-next-line:no-any\n        return Math.tanh(x);\n    }\n    if (x === Infinity) {\n        return 1;\n    }\n    else if (x === -Infinity) {\n        return -1;\n    }\n    else {\n        const e2x = Math.exp(2 * x);\n        return (e2x - 1) / (e2x + 1);\n    }\n}\nexport function sizeToSquarishShape(size) {\n    const width = Math.ceil(Math.sqrt(size));\n    return [width, Math.ceil(size / width)];\n}\n/**\n * Creates a new array with randomized indices to a given quantity.\n *\n * ```js\n * const randomTen = tf.util.createShuffledIndices(10);\n * console.log(randomTen);\n * ```\n *\n * @param number Quantity of how many shuffled indices to create.\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function createShuffledIndices(n) {\n    const shuffledIndices = new Uint32Array(n);\n    for (let i = 0; i < n; ++i) {\n        shuffledIndices[i] = i;\n    }\n    shuffle(shuffledIndices);\n    return shuffledIndices;\n}\nexport function rightPad(a, size) {\n    if (size <= a.length) {\n        return a;\n    }\n    return a + ' '.repeat(size - a.length);\n}\nexport function repeatedTry(checkFn, delayFn = (counter) => 0, maxCounter, scheduleFn = setTimeout) {\n    return new Promise((resolve, reject) => {\n        let tryCount = 0;\n        const tryFn = () => {\n            if (checkFn()) {\n                resolve();\n                return;\n            }\n            tryCount++;\n            const nextBackoff = delayFn(tryCount);\n            if (maxCounter != null && tryCount >= maxCounter) {\n                reject();\n                return;\n            }\n            scheduleFn(tryFn, nextBackoff);\n        };\n        tryFn();\n    });\n}\n/**\n * Given the full size of the array and a shape that may contain -1 as the\n * implicit dimension, returns the inferred shape where -1 is replaced.\n * E.g. For shape=[2, -1, 3] and size=24, it will return [2, 4, 3].\n *\n * @param shape The shape, which may contain -1 in some dimension.\n * @param size The full size (number of elements) of the array.\n * @return The inferred shape where -1 is replaced with the inferred size.\n */\nexport function inferFromImplicitShape(shape, size) {\n    let shapeProd = 1;\n    let implicitIdx = -1;\n    for (let i = 0; i < shape.length; ++i) {\n        if (shape[i] >= 0) {\n            shapeProd *= shape[i];\n        }\n        else if (shape[i] === -1) {\n            if (implicitIdx !== -1) {\n                throw Error(`Shapes can only have 1 implicit size. ` +\n                    `Found -1 at dim ${implicitIdx} and dim ${i}`);\n            }\n            implicitIdx = i;\n        }\n        else if (shape[i] < 0) {\n            throw Error(`Shapes can not be < 0. Found ${shape[i]} at dim ${i}`);\n        }\n    }\n    if (implicitIdx === -1) {\n        if (size > 0 && size !== shapeProd) {\n            throw Error(`Size(${size}) must match the product of shape ${shape}`);\n        }\n        return shape;\n    }\n    if (shapeProd === 0) {\n        throw Error(`Cannot infer the missing size in [${shape}] when ` +\n            `there are 0 elements`);\n    }\n    if (size % shapeProd !== 0) {\n        throw Error(`The implicit shape can't be a fractional number. ` +\n            `Got ${size} / ${shapeProd}`);\n    }\n    const newShape = shape.slice();\n    newShape[implicitIdx] = size / shapeProd;\n    return newShape;\n}\nexport function parseAxisParam(axis, shape) {\n    const rank = shape.length;\n    // Normalize input\n    axis = axis == null ? shape.map((s, i) => i) : [].concat(axis);\n    // Check for valid range\n    assert(axis.every(ax => ax >= -rank && ax < rank), () => `All values in axis param must be in range [-${rank}, ${rank}) but ` +\n        `got axis ${axis}`);\n    // Check for only integers\n    assert(axis.every(ax => isInt(ax)), () => `All values in axis param must be integers but ` +\n        `got axis ${axis}`);\n    // Handle negative axis.\n    return axis.map(a => a < 0 ? rank + a : a);\n}\n/** Reduces the shape by removing all dimensions of shape 1. */\nexport function squeezeShape(shape, axis) {\n    const newShape = [];\n    const keptDims = [];\n    const isEmptyArray = axis != null && Array.isArray(axis) && axis.length === 0;\n    const axes = (axis == null || isEmptyArray) ?\n        null :\n        parseAxisParam(axis, shape).sort();\n    let j = 0;\n    for (let i = 0; i < shape.length; ++i) {\n        if (axes != null) {\n            if (axes[j] === i && shape[i] !== 1) {\n                throw new Error(`Can't squeeze axis ${i} since its dim '${shape[i]}' is not 1`);\n            }\n            if ((axes[j] == null || axes[j] > i) && shape[i] === 1) {\n                newShape.push(shape[i]);\n                keptDims.push(i);\n            }\n            if (axes[j] <= i) {\n                j++;\n            }\n        }\n        if (shape[i] !== 1) {\n            newShape.push(shape[i]);\n            keptDims.push(i);\n        }\n    }\n    return { newShape, keptDims };\n}\nexport function getTypedArrayFromDType(dtype, size) {\n    let values = null;\n    if (dtype == null || dtype === 'float32') {\n        values = new Float32Array(size);\n    }\n    else if (dtype === 'int32') {\n        values = new Int32Array(size);\n    }\n    else if (dtype === 'bool') {\n        values = new Uint8Array(size);\n    }\n    else {\n        throw new Error(`Unknown data type ${dtype}`);\n    }\n    return values;\n}\nexport function getArrayFromDType(dtype, size) {\n    let values = null;\n    if (dtype == null || dtype === 'float32') {\n        values = new Float32Array(size);\n    }\n    else if (dtype === 'int32') {\n        values = new Int32Array(size);\n    }\n    else if (dtype === 'bool') {\n        values = new Uint8Array(size);\n    }\n    else if (dtype === 'string') {\n        values = new Array(size);\n    }\n    else {\n        throw new Error(`Unknown data type ${dtype}`);\n    }\n    return values;\n}\nexport function checkConversionForErrors(vals, dtype) {\n    for (let i = 0; i < vals.length; i++) {\n        const num = vals[i];\n        if (isNaN(num) || !isFinite(num)) {\n            throw Error(`A tensor of type ${dtype} being uploaded contains ${num}.`);\n        }\n    }\n}\n/** Returns true if the dtype is valid. */\nexport function isValidDtype(dtype) {\n    return dtype === 'bool' || dtype === 'complex64' || dtype === 'float32' ||\n        dtype === 'int32' || dtype === 'string';\n}\n/**\n * Returns true if the new type can't encode the old type without loss of\n * precision.\n */\nexport function hasEncodingLoss(oldType, newType) {\n    if (newType === 'complex64') {\n        return false;\n    }\n    if (newType === 'float32' && oldType !== 'complex64') {\n        return false;\n    }\n    if (newType === 'int32' && oldType !== 'float32' && oldType !== 'complex64') {\n        return false;\n    }\n    if (newType === 'bool' && oldType === 'bool') {\n        return false;\n    }\n    return true;\n}\nexport function isTypedArray(a) {\n    return a instanceof Float32Array || a instanceof Int32Array ||\n        a instanceof Uint8Array || a instanceof Uint8ClampedArray;\n}\nexport function bytesPerElement(dtype) {\n    if (dtype === 'float32' || dtype === 'int32') {\n        return 4;\n    }\n    else if (dtype === 'complex64') {\n        return 8;\n    }\n    else if (dtype === 'bool') {\n        return 1;\n    }\n    else {\n        throw new Error(`Unknown dtype ${dtype}`);\n    }\n}\n/**\n * Returns the approximate number of bytes allocated in the string array - 2\n * bytes per character. Computing the exact bytes for a native string in JS\n * is not possible since it depends on the encoding of the html page that\n * serves the website.\n */\nexport function bytesFromStringArray(arr) {\n    if (arr == null) {\n        return 0;\n    }\n    let bytes = 0;\n    arr.forEach(x => bytes += x.length);\n    return bytes;\n}\n/** Returns true if the value is a string. */\nexport function isString(value) {\n    return typeof value === 'string' || value instanceof String;\n}\nexport function isBoolean(value) {\n    return typeof value === 'boolean';\n}\nexport function isNumber(value) {\n    return typeof value === 'number';\n}\nexport function inferDtype(values) {\n    if (Array.isArray(values)) {\n        return inferDtype(values[0]);\n    }\n    if (values instanceof Float32Array) {\n        return 'float32';\n    }\n    else if (values instanceof Int32Array || values instanceof Uint8Array ||\n        values instanceof Uint8ClampedArray) {\n        return 'int32';\n    }\n    else if (isNumber(values)) {\n        return 'float32';\n    }\n    else if (isString(values)) {\n        return 'string';\n    }\n    else if (isBoolean(values)) {\n        return 'bool';\n    }\n    return 'float32';\n}\nexport function isFunction(f) {\n    return !!(f && f.constructor && f.call && f.apply);\n}\nexport function nearestDivisor(size, start) {\n    for (let i = start; i < size; ++i) {\n        if (size % i === 0) {\n            return i;\n        }\n    }\n    return size;\n}\nexport function computeStrides(shape) {\n    const rank = shape.length;\n    if (rank < 2) {\n        return [];\n    }\n    // Last dimension has implicit stride of 1, thus having D-1 (instead of D)\n    // strides.\n    const strides = new Array(rank - 1);\n    strides[rank - 2] = shape[rank - 1];\n    for (let i = rank - 3; i >= 0; --i) {\n        strides[i] = strides[i + 1] * shape[i + 1];\n    }\n    return strides;\n}\nfunction createNestedArray(offset, shape, a, isComplex = false) {\n    const ret = new Array();\n    if (shape.length === 1) {\n        const d = shape[0] * (isComplex ? 2 : 1);\n        for (let i = 0; i < d; i++) {\n            ret[i] = a[offset + i];\n        }\n    }\n    else {\n        const d = shape[0];\n        const rest = shape.slice(1);\n        const len = rest.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1);\n        for (let i = 0; i < d; i++) {\n            ret[i] = createNestedArray(offset + i * len, rest, a, isComplex);\n        }\n    }\n    return ret;\n}\n// Provide a nested array of TypedArray in given shape.\nexport function toNestedArray(shape, a, isComplex = false) {\n    if (shape.length === 0) {\n        // Scalar type should return a single number.\n        return a[0];\n    }\n    const size = shape.reduce((acc, c) => acc * c) * (isComplex ? 2 : 1);\n    if (size === 0) {\n        // A tensor with shape zero should be turned into empty list.\n        return [];\n    }\n    if (size !== a.length) {\n        throw new Error(`[${shape}] does not match the input size ${a.length}${isComplex ? ' for a complex tensor' : ''}.`);\n    }\n    return createNestedArray(0, shape, a, isComplex);\n}\nexport function makeOnesTypedArray(size, dtype) {\n    const array = makeZerosTypedArray(size, dtype);\n    for (let i = 0; i < array.length; i++) {\n        array[i] = 1;\n    }\n    return array;\n}\nexport function makeZerosTypedArray(size, dtype) {\n    if (dtype == null || dtype === 'float32' || dtype === 'complex64') {\n        return new Float32Array(size);\n    }\n    else if (dtype === 'int32') {\n        return new Int32Array(size);\n    }\n    else if (dtype === 'bool') {\n        return new Uint8Array(size);\n    }\n    else {\n        throw new Error(`Unknown data type ${dtype}`);\n    }\n}\n/**\n * Make nested `TypedArray` filled with zeros.\n * @param shape The shape information for the nested array.\n * @param dtype dtype of the array element.\n */\nexport function makeZerosNestedTypedArray(shape, dtype) {\n    const size = shape.reduce((prev, curr) => prev * curr, 1);\n    if (dtype == null || dtype === 'float32') {\n        return toNestedArray(shape, new Float32Array(size));\n    }\n    else if (dtype === 'int32') {\n        return toNestedArray(shape, new Int32Array(size));\n    }\n    else if (dtype === 'bool') {\n        return toNestedArray(shape, new Uint8Array(size));\n    }\n    else {\n        throw new Error(`Unknown data type ${dtype}`);\n    }\n}\nexport function assertNonNegativeIntegerDimensions(shape) {\n    shape.forEach(dimSize => {\n        assert(Number.isInteger(dimSize) && dimSize >= 0, () => `Tensor must have a shape comprised of positive integers but got ` +\n            `shape [${shape}].`);\n    });\n}\n/**\n * Computes flat index for a given location (multidimentionsal index) in a\n * Tensor/multidimensional array.\n *\n * @param locs Location in the tensor.\n * @param rank Rank of the tensor.\n * @param strides Tensor strides.\n */\nexport function locToIndex(locs, rank, strides) {\n    if (rank === 0) {\n        return 0;\n    }\n    else if (rank === 1) {\n        return locs[0];\n    }\n    let index = locs[locs.length - 1];\n    for (let i = 0; i < locs.length - 1; ++i) {\n        index += strides[i] * locs[i];\n    }\n    return index;\n}\n/**\n * Computes the location (multidimensional index) in a\n * tensor/multidimentional array for a given flat index.\n *\n * @param index Index in flat array.\n * @param rank Rank of tensor.\n * @param strides Strides of tensor.\n */\nexport function indexToLoc(index, rank, strides) {\n    if (rank === 0) {\n        return [];\n    }\n    else if (rank === 1) {\n        return [index];\n    }\n    const locs = new Array(rank);\n    for (let i = 0; i < locs.length - 1; ++i) {\n        locs[i] = Math.floor(index / strides[i]);\n        index -= locs[i] * strides[i];\n    }\n    locs[locs.length - 1] = index;\n    return locs;\n}\n/**\n * This method asserts whether an object is a Promise instance.\n * @param object\n */\n// tslint:disable-next-line: no-any\nexport function isPromise(object) {\n    //  We chose to not use 'obj instanceOf Promise' for two reasons:\n    //  1. It only reliably works for es6 Promise, not other Promise\n    //  implementations.\n    //  2. It doesn't work with framework that uses zone.js. zone.js monkey\n    //  patch the async calls, so it is possible the obj (patched) is\n    //  comparing to a pre-patched Promise.\n    return object && object.then && typeof object.then === 'function';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbF9iYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy91dGlsX2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUg7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FDWTtJQUNsQyxJQUFJLE9BQU8sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzNCLElBQUksS0FBSyxHQUFHLENBQUMsQ0FBQztJQUNkLHdDQUF3QztJQUN4QyxPQUFPLE9BQU8sR0FBRyxDQUFDLEVBQUU7UUFDbEIsc0JBQXNCO1FBQ3RCLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEMsd0JBQXdCO1FBQ3hCLE9BQU8sRUFBRSxDQUFDO1FBQ1Ysb0NBQW9DO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzdCO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxZQUFZO0FBQ3hCLGtDQUFrQztBQUNsQyxLQUFnRDtBQUNoRCxrQ0FBa0M7QUFDbEMsTUFBaUQ7SUFDbkQsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FDWCxpREFBaUQ7WUFDakQsMEJBQTBCLEtBQUssQ0FBQyxNQUFNLEVBQUU7WUFDeEMsMkJBQTJCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0tBQ2pEO0lBQ0QsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUMzQixJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCx3Q0FBd0M7SUFDeEMsT0FBTyxPQUFPLEdBQUcsQ0FBQyxF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SUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMvQjtJQUNELElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUM5QixPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFXO0lBQ25DLGlFQUFpRTtJQUNqRSxnRUFBZ0U7SUFDaEUsb0JBQW9CO0lBQ3BCLHVFQUF1RTtJQUN2RSxpRUFBaUU7SUFDakUsdUNBQXVDO0lBQ3ZDLE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLElBQUksT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFVBQVUsQ0FBQztBQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBEYXRhVHlwZU1hcCwgRmxhdFZlY3RvciwgTnVtZXJpY0RhdGFUeXBlLCBSZWN1cnNpdmVBcnJheSwgVGVuc29yTGlrZSwgVHlwZWRBcnJheX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogU2h1ZmZsZXMgdGhlIGFycmF5IGluLXBsYWNlIHVzaW5nIEZpc2hlci1ZYXRlcyBhbGdvcml0aG0uXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSBbMSwgMiwgMywgNCwgNV07XG4gKiB0Zi51dGlsLnNodWZmbGUoYSk7XG4gKiBjb25zb2xlLmxvZyhhKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhcnJheSBUaGUgYXJyYXkgdG8gc2h1ZmZsZSBpbi1wbGFjZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZShhcnJheTogYW55W118VWludDMyQXJyYXl8SW50MzJBcnJheXxcbiAgICAgICAgICAgICAgICAgICAgICAgIEZsb2F0MzJBcnJheSk6IHZvaWQge1xuICBsZXQgY291bnRlciA9IGFycmF5Lmxlbmd0aDtcbiAgbGV0IGluZGV4ID0gMDtcbiAgLy8gV2hpbGUgdGhlcmUgYXJlIGVsZW1lbnRzIGluIHRoZSBhcnJheVxuICB3aGlsZSAoY291bnRlciA+IDApIHtcbiAgICAvLyBQaWNrIGEgcmFuZG9tIGluZGV4XG4gICAgaW5kZXggPSAoTWF0aC5yYW5kb20oKSAqIGNvdW50ZXIpIHwgMDtcbiAgICAvLyBEZWNyZWFzZSBjb3VudGVyIGJ5IDFcbiAgICBjb3VudGVyLS07XG4gICAgLy8gQW5kIHN3YXAgdGhlIGxhc3QgZWxlbWVudCB3aXRoIGl0XG4gICAgc3dhcChhcnJheSwgY291bnRlciwgaW5kZXgpO1xuICB9XG59XG5cbi8qKlxuICogU2h1ZmZsZXMgdHdvIGFycmF5cyBpbi1wbGFjZSB0aGUgc2FtZSB3YXkgdXNpbmcgRmlzaGVyLVlhdGVzIGFsZ29yaXRobS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IFsxLDIsMyw0LDVdO1xuICogY29uc3QgYiA9IFsxMSwyMiwzMyw0NCw1NV07XG4gKiB0Zi51dGlsLnNodWZmbGVDb21ibyhhLCBiKTtcbiAqIGNvbnNvbGUubG9nKGEsIGIpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGFycmF5IFRoZSBmaXJzdCBhcnJheSB0byBzaHVmZmxlIGluLXBsYWNlLlxuICogQHBhcmFtIGFycmF5MiBUaGUgc2Vjb25kIGFycmF5IHRvIHNodWZmbGUgaW4tcGxhY2Ugd2l0aCB0aGUgc2FtZSBwZXJtdXRhdGlvblxuICogICAgIGFzIHRoZSBmaXJzdCBhcnJheS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2h1ZmZsZUNvbWJvKFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBhcnJheTogYW55W118VWludDMyQXJyYXl8SW50MzJBcnJheXxGbG9hdDMyQXJyYXksXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGFycmF5MjogYW55W118VWludDMyQXJyYXl8SW50MzJBcnJheXxGbG9hdDMyQXJyYXkpOiB2b2lkIHtcbiAgaWYgKGFycmF5Lmxlbmd0aCAhPT0gYXJyYXkyLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYEFycmF5IHNpemVzIG11c3QgbWF0Y2ggdG8gYmUgc2h1ZmZsZWQgdG9nZXRoZXIgYCArXG4gICAgICAgIGBGaXJzdCBhcnJheSBsZW5ndGggd2FzICR7YXJyYXkubGVuZ3RofWAgK1xuICAgICAgICBgU2Vjb25kIGFycmF5IGxlbmd0aCB3YXMgJHthcnJheTIubGVuZ3RofWApO1xuICB9XG4gIGxldCBjb3VudGVyID0gYXJyYXkubGVuZ3RoO1xuICBsZXQgaW5kZXggPSAwO1xuICAvLyBXaGlsZSB0aGVyZSBhcmUgZWxlbWVudHMgaW4gdGhlIGFycmF5XG4gIHdoaWxlIChjb3VudGVyID4gMCkge1xuICAgIC8vIFBpY2sgYSByYW5kb20gaW5kZXhcbiAgICBpbmRleCA9IChNYXRoLnJhbmRvbSgpICogY291bnRlcikgfCAwO1xuICAgIC8vIERlY3JlYXNlIGNvdW50ZXIgYnkgMVxuICAgIGNvdW50ZXItLTtcbiAgICAvLyBBbmQgc3dhcCB0aGUgbGFzdCBlbGVtZW50IG9mIGVhY2ggYXJyYXkgd2l0aCBpdFxuICAgIHN3YXAoYXJyYXksIGNvdW50ZXIsIGluZGV4KTtcbiAgICBzd2FwKGFycmF5MiwgY291bnRlciwgaW5kZXgpO1xuICB9XG59XG5cbi8qKiBDbGFtcHMgYSB2YWx1ZSB0byBhIHNwZWNpZmllZCByYW5nZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjbGFtcChtaW46IG51bWJlciwgeDogbnVtYmVyLCBtYXg6IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBNYXRoLm1heChtaW4sIE1hdGgubWluKHgsIG1heCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbmVhcmVzdExhcmdlckV2ZW4odmFsOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gdmFsICUgMiA9PT0gMCA/IHZhbCA6IHZhbCArIDE7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzd2FwPFQ+KFxuICAgIG9iamVjdDoge1tpbmRleDogbnVtYmVyXTogVH0sIGxlZnQ6IG51bWJlciwgcmlnaHQ6IG51bWJlcikge1xuICBjb25zdCB0ZW1wID0gb2JqZWN0W2xlZnRdO1xuICBvYmplY3RbbGVmdF0gPSBvYmplY3RbcmlnaHRdO1xuICBvYmplY3RbcmlnaHRdID0gdGVtcDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN1bShhcnI6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IHN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgc3VtICs9IGFycltpXTtcbiAgfVxuICByZXR1cm4gc3VtO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBzYW1wbGUgZnJvbSBhIHVuaWZvcm0gW2EsIGIpIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBAcGFyYW0gYSBUaGUgbWluaW11bSBzdXBwb3J0IChpbmNsdXNpdmUpLlxuICogQHBhcmFtIGIgVGhlIG1heGltdW0gc3VwcG9ydCAoZXhjbHVzaXZlKS5cbiAqIEByZXR1cm4gQSBwc2V1ZG9yYW5kb20gbnVtYmVyIG9uIHRoZSBoYWxmLW9wZW4gaW50ZXJ2YWwgW2EsYikuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kVW5pZm9ybShhOiBudW1iZXIsIGI6IG51bWJlcikge1xuICBjb25zdCByID0gTWF0aC5yYW5kb20oKTtcbiAgcmV0dXJuIChiICogcikgKyAoMSAtIHIpICogYTtcbn1cblxuLyoqIFJldHVybnMgdGhlIHNxdWFyZWQgRXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHZlY3RvcnMuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzdFNxdWFyZWQoYTogRmxhdFZlY3RvciwgYjogRmxhdFZlY3Rvcik6IG51bWJlciB7XG4gIGxldCByZXN1bHQgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkaWZmID0gTnVtYmVyKGFbaV0pIC0gTnVtYmVyKGJbaV0pO1xuICAgIHJlc3VsdCArPSBkaWZmICogZGlmZjtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIEFzc2VydHMgdGhhdCB0aGUgZXhwcmVzc2lvbiBpcyB0cnVlLiBPdGhlcndpc2UgdGhyb3dzIGFuIGVycm9yIHdpdGggdGhlXG4gKiBwcm92aWRlZCBtZXNzYWdlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gMjtcbiAqIHRmLnV0aWwuYXNzZXJ0KHggPT09IDIsICd4IGlzIG5vdCAyJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZXhwciBUaGUgZXhwcmVzc2lvbiB0byBhc3NlcnQgKGFzIGEgYm9vbGVhbikuXG4gKiBAcGFyYW0gbXNnIEEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBtZXNzYWdlIHRvIHJlcG9ydCB3aGVuIHRocm93aW5nIGFuXG4gKiAgICAgZXJyb3IuIFdlIHVzZSBhIGZ1bmN0aW9uIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJywgbmFtZXNwYWNlOiAndXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQoZXhwcjogYm9vbGVhbiwgbXNnOiAoKSA9PiBzdHJpbmcpIHtcbiAgaWYgKCFleHByKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKHR5cGVvZiBtc2cgPT09ICdzdHJpbmcnID8gbXNnIDogbXNnKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRTaGFwZXNNYXRjaChcbiAgICBzaGFwZUE6IG51bWJlcltdLCBzaGFwZUI6IG51bWJlcltdLCBlcnJvck1lc3NhZ2VQcmVmaXggPSAnJyk6IHZvaWQge1xuICBhc3NlcnQoXG4gICAgICBhcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQiksXG4gICAgICAoKSA9PiBlcnJvck1lc3NhZ2VQcmVmaXggKyBgIFNoYXBlcyAke3NoYXBlQX0gYW5kICR7c2hhcGVCfSBtdXN0IG1hdGNoYCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb25OdWxsKGE6IFRlbnNvckxpa2UpOiB2b2lkIHtcbiAgYXNzZXJ0KFxuICAgICAgYSAhPSBudWxsLFxuICAgICAgKCkgPT4gYFRoZSBpbnB1dCB0byB0aGUgdGVuc29yIGNvbnN0cnVjdG9yIG11c3QgYmUgYSBub24tbnVsbCB2YWx1ZS5gKTtcbn1cblxuLy8gTk9URTogV2UgZXhwbGljaXRseSB0eXBlIG91dCB3aGF0IFQgZXh0ZW5kcyBpbnN0ZWFkIG9mIGFueSBzbyB0aGF0XG4vLyB1dGlsLmZsYXR0ZW4gb24gYSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVyIGRvZXNuJ3QgdHJ5IHRvIGluZmVyIFQgYXMgYVxuLy8gbnVtYmVyW11bXSwgY2F1c2luZyB1cyB0byBleHBsaWNpdGx5IHR5cGUgdXRpbC5mbGF0dGVuPG51bWJlcj4oKS5cbi8qKlxuICogIEZsYXR0ZW5zIGFuIGFyYml0cmFyaWx5IG5lc3RlZCBhcnJheS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IFtbMSwgMl0sIFszLCA0XSwgWzUsIFs2LCBbN11dXV07XG4gKiBjb25zdCBmbGF0ID0gdGYudXRpbC5mbGF0dGVuKGEpO1xuICogY29uc29sZS5sb2coZmxhdCk7XG4gKiBgYGBcbiAqXG4gKiAgQHBhcmFtIGFyciBUaGUgbmVzdGVkIGFycmF5IHRvIGZsYXR0ZW4uXG4gKiAgQHBhcmFtIHJlc3VsdCBUaGUgZGVzdGluYXRpb24gYXJyYXkgd2hpY2ggaG9sZHMgdGhlIGVsZW1lbnRzLlxuICogIEBwYXJhbSBza2lwVHlwZWRBcnJheSBJZiB0cnVlLCBhdm9pZHMgZmxhdHRlbmluZyB0aGUgdHlwZWQgYXJyYXlzLiBEZWZhdWx0c1xuICogICAgICB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb25cbmZsYXR0ZW48VCBleHRlbmRzIG51bWJlcnxib29sZWFufHN0cmluZ3xQcm9taXNlPG51bWJlcj58VHlwZWRBcnJheT4oXG4gICAgYXJyOiBUfFJlY3Vyc2l2ZUFycmF5PFQ+LCByZXN1bHQ6IFRbXSA9IFtdLCBza2lwVHlwZWRBcnJheSA9IGZhbHNlKTogVFtdIHtcbiAgaWYgKHJlc3VsdCA9PSBudWxsKSB7XG4gICAgcmVzdWx0ID0gW107XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkoYXJyKSB8fCBpc1R5cGVkQXJyYXkoYXJyKSAmJiAhc2tpcFR5cGVkQXJyYXkpIHtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkge1xuICAgICAgZmxhdHRlbihhcnJbaV0sIHJlc3VsdCwgc2tpcFR5cGVkQXJyYXkpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICByZXN1bHQucHVzaChhcnIgYXMgVCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBzaXplIChudW1iZXIgb2YgZWxlbWVudHMpIG9mIHRoZSB0ZW5zb3IgZ2l2ZW4gaXRzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBzaGFwZSA9IFszLCA0LCAyXTtcbiAqIGNvbnN0IHNpemUgPSB0Zi51dGlsLnNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICogY29uc29sZS5sb2coc2l6ZSk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2l6ZUZyb21TaGFwZShzaGFwZTogbnVtYmVyW10pOiBudW1iZXIge1xuICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgLy8gU2NhbGFyLlxuICAgIHJldHVybiAxO1xuICB9XG4gIGxldCBzaXplID0gc2hhcGVbMF07XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICBzaXplICo9IHNoYXBlW2ldO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNTY2FsYXJTaGFwZShzaGFwZTogbnVtYmVyW10pOiBib29sZWFuIHtcbiAgcmV0dXJuIHNoYXBlLmxlbmd0aCA9PT0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFycmF5c0VxdWFsKG4xOiBGbGF0VmVjdG9yLCBuMjogRmxhdFZlY3Rvcikge1xuICBpZiAobjEgPT09IG4yKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKG4xID09IG51bGwgfHwgbjIgPT0gbnVsbCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChuMS5sZW5ndGggIT09IG4yLmxlbmd0aCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IG4xLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKG4xW2ldICE9PSBuMltpXSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSW50KGE6IG51bWJlcik6IGJvb2xlYW4ge1xuICByZXR1cm4gYSAlIDEgPT09IDA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0YW5oKHg6IG51bWJlcik6IG51bWJlciB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgaWYgKChNYXRoIGFzIGFueSkudGFuaCAhPSBudWxsKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHJldHVybiAoTWF0aCBhcyBhbnkpLnRhbmgoeCk7XG4gIH1cbiAgaWYgKHggPT09IEluZmluaXR5KSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAoeCA9PT0gLUluZmluaXR5KSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGUyeCA9IE1hdGguZXhwKDIgKiB4KTtcbiAgICByZXR1cm4gKGUyeCAtIDEpIC8gKGUyeCArIDEpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzaXplVG9TcXVhcmlzaFNoYXBlKHNpemU6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCB3aWR0aCA9IE1hdGguY2VpbChNYXRoLnNxcnQoc2l6ZSkpO1xuICByZXR1cm4gW3dpZHRoLCBNYXRoLmNlaWwoc2l6ZSAvIHdpZHRoKV07XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBhcnJheSB3aXRoIHJhbmRvbWl6ZWQgaW5kaWNlcyB0byBhIGdpdmVuIHF1YW50aXR5LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByYW5kb21UZW4gPSB0Zi51dGlsLmNyZWF0ZVNodWZmbGVkSW5kaWNlcygxMCk7XG4gKiBjb25zb2xlLmxvZyhyYW5kb21UZW4pO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG51bWJlciBRdWFudGl0eSBvZiBob3cgbWFueSBzaHVmZmxlZCBpbmRpY2VzIHRvIGNyZWF0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVXRpbCcsIG5hbWVzcGFjZTogJ3V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2h1ZmZsZWRJbmRpY2VzKG46IG51bWJlcik6IFVpbnQzMkFycmF5IHtcbiAgY29uc3Qgc2h1ZmZsZWRJbmRpY2VzID0gbmV3IFVpbnQzMkFycmF5KG4pO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47ICsraSkge1xuICAgIHNodWZmbGVkSW5kaWNlc1tpXSA9IGk7XG4gIH1cbiAgc2h1ZmZsZShzaHVmZmxlZEluZGljZXMpO1xuICByZXR1cm4gc2h1ZmZsZWRJbmRpY2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmlnaHRQYWQoYTogc3RyaW5nLCBzaXplOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAoc2l6ZSA8PSBhLmxlbmd0aCkge1xuICAgIHJldHVybiBhO1xuICB9XG4gIHJldHVybiBhICsgJyAnLnJlcGVhdChzaXplIC0gYS5sZW5ndGgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0ZWRUcnkoXG4gICAgY2hlY2tGbjogKCkgPT4gYm9vbGVhbiwgZGVsYXlGbiA9IChjb3VudGVyOiBudW1iZXIpID0+IDAsXG4gICAgbWF4Q291bnRlcj86IG51bWJlcixcbiAgICBzY2hlZHVsZUZuOiAoZnVuY3Rpb25SZWY6IEZ1bmN0aW9uLCBkZWxheTogbnVtYmVyKSA9PiB2b2lkID1cbiAgICAgICAgc2V0VGltZW91dCk6IFByb21pc2U8dm9pZD4ge1xuICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGxldCB0cnlDb3VudCA9IDA7XG5cbiAgICBjb25zdCB0cnlGbiA9ICgpID0+IHtcbiAgICAgIGlmIChjaGVja0ZuKCkpIHtcbiAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRyeUNvdW50Kys7XG5cbiAgICAgIGNvbnN0IG5leHRCYWNrb2ZmID0gZGVsYXlGbih0cnlDb3VudCk7XG5cbiAgICAgIGlmIChtYXhDb3VudGVyICE9IG51bGwgJiYgdHJ5Q291bnQgPj0gbWF4Q291bnRlcikge1xuICAgICAgICByZWplY3QoKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgc2NoZWR1bGVGbih0cnlGbiwgbmV4dEJhY2tvZmYpO1xuICAgIH07XG5cbiAgICB0cnlGbigpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBHaXZlbiB0aGUgZnVsbCBzaXplIG9mIHRoZSBhcnJheSBhbmQgYSBzaGFwZSB0aGF0IG1heSBjb250YWluIC0xIGFzIHRoZVxuICogaW1wbGljaXQgZGltZW5zaW9uLCByZXR1cm5zIHRoZSBpbmZlcnJlZCBzaGFwZSB3aGVyZSAtMSBpcyByZXBsYWNlZC5cbiAqIEUuZy4gRm9yIHNoYXBlPVsyLCAtMSwgM10gYW5kIHNpemU9MjQsIGl0IHdpbGwgcmV0dXJuIFsyLCA0LCAzXS5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlLCB3aGljaCBtYXkgY29udGFpbiAtMSBpbiBzb21lIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBzaXplIFRoZSBmdWxsIHNpemUgKG51bWJlciBvZiBlbGVtZW50cykgb2YgdGhlIGFycmF5LlxuICogQHJldHVybiBUaGUgaW5mZXJyZWQgc2hhcGUgd2hlcmUgLTEgaXMgcmVwbGFjZWQgd2l0aCB0aGUgaW5mZXJyZWQgc2l6ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGluZmVyRnJvbUltcGxpY2l0U2hhcGUoXG4gICAgc2hhcGU6IG51bWJlcltdLCBzaXplOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGxldCBzaGFwZVByb2QgPSAxO1xuICBsZXQgaW1wbGljaXRJZHggPSAtMTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHNoYXBlW2ldID49IDApIHtcbiAgICAgIHNoYXBlUHJvZCAqPSBzaGFwZVtpXTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlW2ldID09PSAtMSkge1xuICAgICAgaWYgKGltcGxpY2l0SWR4ICE9PSAtMSkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBTaGFwZXMgY2FuIG9ubHkgaGF2ZSAxIGltcGxpY2l0IHNpemUuIGAgK1xuICAgICAgICAgICAgYEZvdW5kIC0xIGF0IGRpbSAke2ltcGxpY2l0SWR4fSBhbmQgZGltICR7aX1gKTtcbiAgICAgIH1cbiAgICAgIGltcGxpY2l0SWR4ID0gaTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlW2ldIDwgMCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNoYXBlcyBjYW4gbm90IGJlIDwgMC4gRm91bmQgJHtzaGFwZVtpXX0gYXQgZGltICR7aX1gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoaW1wbGljaXRJZHggPT09IC0xKSB7XG4gICAgaWYgKHNpemUgPiAwICYmIHNpemUgIT09IHNoYXBlUHJvZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFNpemUoJHtzaXplfSkgbXVzdCBtYXRjaCB0aGUgcHJvZHVjdCBvZiBzaGFwZSAke3NoYXBlfWApO1xuICAgIH1cbiAgICByZXR1cm4gc2hhcGU7XG4gIH1cblxuICBpZiAoc2hhcGVQcm9kID09PSAwKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgaW5mZXIgdGhlIG1pc3Npbmcgc2l6ZSBpbiBbJHtzaGFwZX1dIHdoZW4gYCArXG4gICAgICAgIGB0aGVyZSBhcmUgMCBlbGVtZW50c2ApO1xuICB9XG4gIGlmIChzaXplICUgc2hhcGVQcm9kICE9PSAwKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBUaGUgaW1wbGljaXQgc2hhcGUgY2FuJ3QgYmUgYSBmcmFjdGlvbmFsIG51bWJlci4gYCArXG4gICAgICAgIGBHb3QgJHtzaXplfSAvICR7c2hhcGVQcm9kfWApO1xuICB9XG5cbiAgY29uc3QgbmV3U2hhcGUgPSBzaGFwZS5zbGljZSgpO1xuICBuZXdTaGFwZVtpbXBsaWNpdElkeF0gPSBzaXplIC8gc2hhcGVQcm9kO1xuICByZXR1cm4gbmV3U2hhcGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUF4aXNQYXJhbShcbiAgICBheGlzOiBudW1iZXJ8bnVtYmVyW10sIHNoYXBlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcblxuICAvLyBOb3JtYWxpemUgaW5wdXRcbiAgYXhpcyA9IGF4aXMgPT0gbnVsbCA/IHNoYXBlLm1hcCgocywgaSkgPT4gaSkgOiBbXS5jb25jYXQoYXhpcyk7XG5cbiAgLy8gQ2hlY2sgZm9yIHZhbGlkIHJhbmdlXG4gIGFzc2VydChcbiAgICAgIGF4aXMuZXZlcnkoYXggPT4gYXggPj0gLXJhbmsgJiYgYXggPCByYW5rKSxcbiAgICAgICgpID0+XG4gICAgICAgICAgYEFsbCB2YWx1ZXMgaW4gYXhpcyBwYXJhbSBtdXN0IGJlIGluIHJhbmdlIFstJHtyYW5rfSwgJHtyYW5rfSkgYnV0IGAgK1xuICAgICAgICAgIGBnb3QgYXhpcyAke2F4aXN9YCk7XG5cbiAgLy8gQ2hlY2sgZm9yIG9ubHkgaW50ZWdlcnNcbiAgYXNzZXJ0KFxuICAgICAgYXhpcy5ldmVyeShheCA9PiBpc0ludChheCkpLFxuICAgICAgKCkgPT4gYEFsbCB2YWx1ZXMgaW4gYXhpcyBwYXJhbSBtdXN0IGJlIGludGVnZXJzIGJ1dCBgICtcbiAgICAgICAgICBgZ290IGF4aXMgJHtheGlzfWApO1xuXG4gIC8vIEhhbmRsZSBuZWdhdGl2ZSBheGlzLlxuICByZXR1cm4gYXhpcy5tYXAoYSA9PiBhIDwgMCA/IHJhbmsgKyBhIDogYSk7XG59XG5cbi8qKiBSZWR1Y2VzIHRoZSBzaGFwZSBieSByZW1vdmluZyBhbGwgZGltZW5zaW9ucyBvZiBzaGFwZSAxLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVTaGFwZShzaGFwZTogbnVtYmVyW10sIGF4aXM/OiBudW1iZXJbXSk6XG4gICAge25ld1NoYXBlOiBudW1iZXJbXSwga2VwdERpbXM6IG51bWJlcltdfSB7XG4gIGNvbnN0IG5ld1NoYXBlOiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBrZXB0RGltczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaXNFbXB0eUFycmF5ID0gYXhpcyAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkoYXhpcykgJiYgYXhpcy5sZW5ndGggPT09IDA7XG4gIGNvbnN0IGF4ZXMgPSAoYXhpcyA9PSBudWxsIHx8IGlzRW1wdHlBcnJheSkgP1xuICAgICAgbnVsbCA6XG4gICAgICBwYXJzZUF4aXNQYXJhbShheGlzLCBzaGFwZSkuc29ydCgpO1xuICBsZXQgaiA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoYXhlcyAhPSBudWxsKSB7XG4gICAgICBpZiAoYXhlc1tqXSA9PT0gaSAmJiBzaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2FuJ3Qgc3F1ZWV6ZSBheGlzICR7aX0gc2luY2UgaXRzIGRpbSAnJHtzaGFwZVtpXX0nIGlzIG5vdCAxYCk7XG4gICAgICB9XG4gICAgICBpZiAoKGF4ZXNbal0gPT0gbnVsbCB8fCBheGVzW2pdID4gaSkgJiYgc2hhcGVbaV0gPT09IDEpIHtcbiAgICAgICAgbmV3U2hhcGUucHVzaChzaGFwZVtpXSk7XG4gICAgICAgIGtlcHREaW1zLnB1c2goaSk7XG4gICAgICB9XG4gICAgICBpZiAoYXhlc1tqXSA8PSBpKSB7XG4gICAgICAgIGorKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlW2ldICE9PSAxKSB7XG4gICAgICBuZXdTaGFwZS5wdXNoKHNoYXBlW2ldKTtcbiAgICAgIGtlcHREaW1zLnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHJldHVybiB7bmV3U2hhcGUsIGtlcHREaW1zfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFR5cGVkQXJyYXlGcm9tRFR5cGU8RCBleHRlbmRzIE51bWVyaWNEYXRhVHlwZT4oXG4gICAgZHR5cGU6IEQsIHNpemU6IG51bWJlcik6IERhdGFUeXBlTWFwW0RdIHtcbiAgbGV0IHZhbHVlcyA9IG51bGw7XG4gIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxuICByZXR1cm4gdmFsdWVzIGFzIERhdGFUeXBlTWFwW0RdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0QXJyYXlGcm9tRFR5cGU8RCBleHRlbmRzIERhdGFUeXBlPihcbiAgICBkdHlwZTogRCwgc2l6ZTogbnVtYmVyKTogRGF0YVR5cGVNYXBbRF0ge1xuICBsZXQgdmFsdWVzID0gbnVsbDtcbiAgaWYgKGR0eXBlID09IG51bGwgfHwgZHR5cGUgPT09ICdmbG9hdDMyJykge1xuICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICB2YWx1ZXMgPSBuZXcgSW50MzJBcnJheShzaXplKTtcbiAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgdmFsdWVzID0gbmV3IFVpbnQ4QXJyYXkoc2l6ZSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgdmFsdWVzID0gbmV3IEFycmF5PCdzdHJpbmcnPihzaXplKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gIH1cbiAgcmV0dXJuIHZhbHVlcyBhcyBEYXRhVHlwZU1hcFtEXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQ29udmVyc2lvbkZvckVycm9yczxEIGV4dGVuZHMgRGF0YVR5cGU+KFxuICAgIHZhbHM6IERhdGFUeXBlTWFwW0RdfG51bWJlcltdLCBkdHlwZTogRCk6IHZvaWQge1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBudW0gPSB2YWxzW2ldIGFzIG51bWJlcjtcbiAgICBpZiAoaXNOYU4obnVtKSB8fCAhaXNGaW5pdGUobnVtKSkge1xuICAgICAgdGhyb3cgRXJyb3IoYEEgdGVuc29yIG9mIHR5cGUgJHtkdHlwZX0gYmVpbmcgdXBsb2FkZWQgY29udGFpbnMgJHtudW19LmApO1xuICAgIH1cbiAgfVxufVxuXG4vKiogUmV0dXJucyB0cnVlIGlmIHRoZSBkdHlwZSBpcyB2YWxpZC4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkRHR5cGUoZHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiBkdHlwZSA9PT0gJ2Jvb2wnIHx8IGR0eXBlID09PSAnY29tcGxleDY0JyB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8XG4gICAgICBkdHlwZSA9PT0gJ2ludDMyJyB8fCBkdHlwZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBuZXcgdHlwZSBjYW4ndCBlbmNvZGUgdGhlIG9sZCB0eXBlIHdpdGhvdXQgbG9zcyBvZlxuICogcHJlY2lzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaGFzRW5jb2RpbmdMb3NzKG9sZFR5cGU6IERhdGFUeXBlLCBuZXdUeXBlOiBEYXRhVHlwZSk6IGJvb2xlYW4ge1xuICBpZiAobmV3VHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG5ld1R5cGUgPT09ICdmbG9hdDMyJyAmJiBvbGRUeXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobmV3VHlwZSA9PT0gJ2ludDMyJyAmJiBvbGRUeXBlICE9PSAnZmxvYXQzMicgJiYgb2xkVHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKG5ld1R5cGUgPT09ICdib29sJyAmJiBvbGRUeXBlID09PSAnYm9vbCcpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1R5cGVkQXJyYXkoYToge30pOiBhIGlzIEZsb2F0MzJBcnJheXxJbnQzMkFycmF5fFVpbnQ4QXJyYXl8XG4gICAgVWludDhDbGFtcGVkQXJyYXkge1xuICByZXR1cm4gYSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSB8fCBhIGluc3RhbmNlb2YgSW50MzJBcnJheSB8fFxuICAgICAgYSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHwgYSBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNQZXJFbGVtZW50KGR0eXBlOiBEYXRhVHlwZSk6IG51bWJlciB7XG4gIGlmIChkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIDQ7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgcmV0dXJuIDg7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgYXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBpbiB0aGUgc3RyaW5nIGFycmF5IC0gMlxuICogYnl0ZXMgcGVyIGNoYXJhY3Rlci4gQ29tcHV0aW5nIHRoZSBleGFjdCBieXRlcyBmb3IgYSBuYXRpdmUgc3RyaW5nIGluIEpTXG4gKiBpcyBub3QgcG9zc2libGUgc2luY2UgaXQgZGVwZW5kcyBvbiB0aGUgZW5jb2Rpbmcgb2YgdGhlIGh0bWwgcGFnZSB0aGF0XG4gKiBzZXJ2ZXMgdGhlIHdlYnNpdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBieXRlc0Zyb21TdHJpbmdBcnJheShhcnI6IFVpbnQ4QXJyYXlbXSk6IG51bWJlciB7XG4gIGlmIChhcnIgPT0gbnVsbCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGxldCBieXRlcyA9IDA7XG4gIGFyci5mb3JFYWNoKHggPT4gYnl0ZXMgKz0geC5sZW5ndGgpO1xuICByZXR1cm4gYnl0ZXM7XG59XG5cbi8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIGlzIGEgc3RyaW5nLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlOiB7fSk6IHZhbHVlIGlzIHN0cmluZyB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNCb29sZWFuKHZhbHVlOiB7fSk6IGJvb2xlYW4ge1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc051bWJlcih2YWx1ZToge30pOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZlckR0eXBlKHZhbHVlczogVGVuc29yTGlrZSk6IERhdGFUeXBlIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIHJldHVybiBpbmZlckR0eXBlKHZhbHVlc1swXSk7XG4gIH1cbiAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkge1xuICAgIHJldHVybiAnZmxvYXQzMic7XG4gIH0gZWxzZSBpZiAoXG4gICAgICB2YWx1ZXMgaW5zdGFuY2VvZiBJbnQzMkFycmF5IHx8IHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgfHxcbiAgICAgIHZhbHVlcyBpbnN0YW5jZW9mIFVpbnQ4Q2xhbXBlZEFycmF5KSB7XG4gICAgcmV0dXJuICdpbnQzMic7XG4gIH0gZWxzZSBpZiAoaXNOdW1iZXIodmFsdWVzKSkge1xuICAgIHJldHVybiAnZmxvYXQzMic7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsdWVzKSkge1xuICAgIHJldHVybiAnc3RyaW5nJztcbiAgfSBlbHNlIGlmIChpc0Jvb2xlYW4odmFsdWVzKSkge1xuICAgIHJldHVybiAnYm9vbCc7XG4gIH1cbiAgcmV0dXJuICdmbG9hdDMyJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRnVuY3Rpb24oZjogRnVuY3Rpb24pIHtcbiAgcmV0dXJuICEhKGYgJiYgZi5jb25zdHJ1Y3RvciAmJiBmLmNhbGwgJiYgZi5hcHBseSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBuZWFyZXN0RGl2aXNvcihzaXplOiBudW1iZXIsIHN0YXJ0OiBudW1iZXIpOiBudW1iZXIge1xuICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBzaXplOyArK2kpIHtcbiAgICBpZiAoc2l6ZSAlIGkgPT09IDApIHtcbiAgICAgIHJldHVybiBpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTdHJpZGVzKHNoYXBlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgaWYgKHJhbmsgPCAyKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG5cbiAgLy8gTGFzdCBkaW1lbnNpb24gaGFzIGltcGxpY2l0IHN0cmlkZSBvZiAxLCB0aHVzIGhhdmluZyBELTEgKGluc3RlYWQgb2YgRClcbiAgLy8gc3RyaWRlcy5cbiAgY29uc3Qgc3RyaWRlcyA9IG5ldyBBcnJheShyYW5rIC0gMSk7XG4gIHN0cmlkZXNbcmFuayAtIDJdID0gc2hhcGVbcmFuayAtIDFdO1xuICBmb3IgKGxldCBpID0gcmFuayAtIDM7IGkgPj0gMDsgLS1pKSB7XG4gICAgc3RyaWRlc1tpXSA9IHN0cmlkZXNbaSArIDFdICogc2hhcGVbaSArIDFdO1xuICB9XG4gIHJldHVybiBzdHJpZGVzO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVOZXN0ZWRBcnJheShcbiAgICBvZmZzZXQ6IG51bWJlciwgc2hhcGU6IG51bWJlcltdLCBhOiBUeXBlZEFycmF5LCBpc0NvbXBsZXggPSBmYWxzZSkge1xuICBjb25zdCByZXQgPSBuZXcgQXJyYXkoKTtcbiAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGQgPSBzaGFwZVswXSAqIChpc0NvbXBsZXggPyAyIDogMSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkOyBpKyspIHtcbiAgICAgIHJldFtpXSA9IGFbb2Zmc2V0ICsgaV07XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGNvbnN0IGQgPSBzaGFwZVswXTtcbiAgICBjb25zdCByZXN0ID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgY29uc3QgbGVuID0gcmVzdC5yZWR1Y2UoKGFjYywgYykgPT4gYWNjICogYykgKiAoaXNDb21wbGV4ID8gMiA6IDEpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZDsgaSsrKSB7XG4gICAgICByZXRbaV0gPSBjcmVhdGVOZXN0ZWRBcnJheShvZmZzZXQgKyBpICogbGVuLCByZXN0LCBhLCBpc0NvbXBsZXgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vLyBQcm92aWRlIGEgbmVzdGVkIGFycmF5IG9mIFR5cGVkQXJyYXkgaW4gZ2l2ZW4gc2hhcGUuXG5leHBvcnQgZnVuY3Rpb24gdG9OZXN0ZWRBcnJheShcbiAgICBzaGFwZTogbnVtYmVyW10sIGE6IFR5cGVkQXJyYXksIGlzQ29tcGxleCA9IGZhbHNlKSB7XG4gIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHtcbiAgICAvLyBTY2FsYXIgdHlwZSBzaG91bGQgcmV0dXJuIGEgc2luZ2xlIG51bWJlci5cbiAgICByZXR1cm4gYVswXTtcbiAgfVxuICBjb25zdCBzaXplID0gc2hhcGUucmVkdWNlKChhY2MsIGMpID0+IGFjYyAqIGMpICogKGlzQ29tcGxleCA/IDIgOiAxKTtcbiAgaWYgKHNpemUgPT09IDApIHtcbiAgICAvLyBBIHRlbnNvciB3aXRoIHNoYXBlIHplcm8gc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGVtcHR5IGxpc3QuXG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChzaXplICE9PSBhLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgWyR7c2hhcGV9XSBkb2VzIG5vdCBtYXRjaCB0aGUgaW5wdXQgc2l6ZSAke2EubGVuZ3RofSR7XG4gICAgICAgIGlzQ29tcGxleCA/ICcgZm9yIGEgY29tcGxleCB0ZW5zb3InIDogJyd9LmApO1xuICB9XG5cbiAgcmV0dXJuIGNyZWF0ZU5lc3RlZEFycmF5KDAsIHNoYXBlLCBhLCBpc0NvbXBsZXgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWFrZU9uZXNUeXBlZEFycmF5PEQgZXh0ZW5kcyBEYXRhVHlwZT4oXG4gICAgc2l6ZTogbnVtYmVyLCBkdHlwZTogRCk6IERhdGFUeXBlTWFwW0RdIHtcbiAgY29uc3QgYXJyYXkgPSBtYWtlWmVyb3NUeXBlZEFycmF5KHNpemUsIGR0eXBlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGFycmF5W2ldID0gMTtcbiAgfVxuICByZXR1cm4gYXJyYXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlWmVyb3NUeXBlZEFycmF5PEQgZXh0ZW5kcyBEYXRhVHlwZT4oXG4gICAgc2l6ZTogbnVtYmVyLCBkdHlwZTogRCk6IERhdGFUeXBlTWFwW0RdIHtcbiAgaWYgKGR0eXBlID09IG51bGwgfHwgZHR5cGUgPT09ICdmbG9hdDMyJyB8fCBkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShzaXplKSBhcyBEYXRhVHlwZU1hcFtEXTtcbiAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgIHJldHVybiBuZXcgSW50MzJBcnJheShzaXplKSBhcyBEYXRhVHlwZU1hcFtEXTtcbiAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KHNpemUpIGFzIERhdGFUeXBlTWFwW0RdO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIE1ha2UgbmVzdGVkIGBUeXBlZEFycmF5YCBmaWxsZWQgd2l0aCB6ZXJvcy5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgaW5mb3JtYXRpb24gZm9yIHRoZSBuZXN0ZWQgYXJyYXkuXG4gKiBAcGFyYW0gZHR5cGUgZHR5cGUgb2YgdGhlIGFycmF5IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlWmVyb3NOZXN0ZWRUeXBlZEFycmF5PEQgZXh0ZW5kcyBEYXRhVHlwZT4oXG4gICAgc2hhcGU6IG51bWJlcltdLCBkdHlwZTogRCkge1xuICBjb25zdCBzaXplID0gc2hhcGUucmVkdWNlKChwcmV2LCBjdXJyKSA9PiBwcmV2ICogY3VyciwgMSk7XG4gIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IEZsb2F0MzJBcnJheShzaXplKSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IEludDMyQXJyYXkoc2l6ZSkpO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICByZXR1cm4gdG9OZXN0ZWRBcnJheShzaGFwZSwgbmV3IFVpbnQ4QXJyYXkoc2l6ZSkpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyhzaGFwZTogbnVtYmVyW10pIHtcbiAgc2hhcGUuZm9yRWFjaChkaW1TaXplID0+IHtcbiAgICBhc3NlcnQoXG4gICAgICAgIE51bWJlci5pc0ludGVnZXIoZGltU2l6ZSkgJiYgZGltU2l6ZSA+PSAwLFxuICAgICAgICAoKSA9PlxuICAgICAgICAgICAgYFRlbnNvciBtdXN0IGhhdmUgYSBzaGFwZSBjb21wcmlzZWQgb2YgcG9zaXRpdmUgaW50ZWdlcnMgYnV0IGdvdCBgICtcbiAgICAgICAgICAgIGBzaGFwZSBbJHtzaGFwZX1dLmApO1xuICB9KTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBmbGF0IGluZGV4IGZvciBhIGdpdmVuIGxvY2F0aW9uIChtdWx0aWRpbWVudGlvbnNhbCBpbmRleCkgaW4gYVxuICogVGVuc29yL211bHRpZGltZW5zaW9uYWwgYXJyYXkuXG4gKlxuICogQHBhcmFtIGxvY3MgTG9jYXRpb24gaW4gdGhlIHRlbnNvci5cbiAqIEBwYXJhbSByYW5rIFJhbmsgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBzdHJpZGVzIFRlbnNvciBzdHJpZGVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbG9jVG9JbmRleChcbiAgICBsb2NzOiBudW1iZXJbXSwgcmFuazogbnVtYmVyLCBzdHJpZGVzOiBudW1iZXJbXSk6IG51bWJlciB7XG4gIGlmIChyYW5rID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiBsb2NzWzBdO1xuICB9XG4gIGxldCBpbmRleCA9IGxvY3NbbG9jcy5sZW5ndGggLSAxXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgIGluZGV4ICs9IHN0cmlkZXNbaV0gKiBsb2NzW2ldO1xuICB9XG4gIHJldHVybiBpbmRleDtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9jYXRpb24gKG11bHRpZGltZW5zaW9uYWwgaW5kZXgpIGluIGFcbiAqIHRlbnNvci9tdWx0aWRpbWVudGlvbmFsIGFycmF5IGZvciBhIGdpdmVuIGZsYXQgaW5kZXguXG4gKlxuICogQHBhcmFtIGluZGV4IEluZGV4IGluIGZsYXQgYXJyYXkuXG4gKiBAcGFyYW0gcmFuayBSYW5rIG9mIHRlbnNvci5cbiAqIEBwYXJhbSBzdHJpZGVzIFN0cmlkZXMgb2YgdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5kZXhUb0xvYyhcbiAgICBpbmRleDogbnVtYmVyLCByYW5rOiBudW1iZXIsIHN0cmlkZXM6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBpZiAocmFuayA9PT0gMCkge1xuICAgIHJldHVybiBbXTtcbiAgfSBlbHNlIGlmIChyYW5rID09PSAxKSB7XG4gICAgcmV0dXJuIFtpbmRleF07XG4gIH1cbiAgY29uc3QgbG9jczogbnVtYmVyW10gPSBuZXcgQXJyYXkocmFuayk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jcy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICBsb2NzW2ldID0gTWF0aC5mbG9vcihpbmRleCAvIHN0cmlkZXNbaV0pO1xuICAgIGluZGV4IC09IGxvY3NbaV0gKiBzdHJpZGVzW2ldO1xuICB9XG4gIGxvY3NbbG9jcy5sZW5ndGggLSAxXSA9IGluZGV4O1xuICByZXR1cm4gbG9jcztcbn1cblxuLyoqXG4gKiBUaGlzIG1ldGhvZCBhc3NlcnRzIHdoZXRoZXIgYW4gb2JqZWN0IGlzIGEgUHJvbWlzZSBpbnN0YW5jZS5cbiAqIEBwYXJhbSBvYmplY3RcbiAqL1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBpc1Byb21pc2Uob2JqZWN0OiBhbnkpOiBvYmplY3QgaXMgUHJvbWlzZTx1bmtub3duPiB7XG4gIC8vICBXZSBjaG9zZSB0byBub3QgdXNlICdvYmogaW5zdGFuY2VPZiBQcm9taXNlJyBmb3IgdHdvIHJlYXNvbnM6XG4gIC8vICAxLiBJdCBvbmx5IHJlbGlhYmx5IHdvcmtzIGZvciBlczYgUHJvbWlzZSwgbm90IG90aGVyIFByb21pc2VcbiAgLy8gIGltcGxlbWVudGF0aW9ucy5cbiAgLy8gIDIuIEl0IGRvZXNuJ3Qgd29yayB3aXRoIGZyYW1ld29yayB0aGF0IHVzZXMgem9uZS5qcy4gem9uZS5qcyBtb25rZXlcbiAgLy8gIHBhdGNoIHRoZSBhc3luYyBjYWxscywgc28gaXQgaXMgcG9zc2libGUgdGhlIG9iaiAocGF0Y2hlZCkgaXNcbiAgLy8gIGNvbXBhcmluZyB0byBhIHByZS1wYXRjaGVkIFByb21pc2UuXG4gIHJldHVybiBvYmplY3QgJiYgb2JqZWN0LnRoZW4gJiYgdHlwZW9mIG9iamVjdC50aGVuID09PSAnZnVuY3Rpb24nO1xufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { isPromise } from './util_base';\n// Expects flags from URL in the format ?tfjsflags=FLAG1:1,FLAG2:true.\nconst TENSORFLOWJS_FLAGS_PREFIX = 'tfjsflags';\n/**\n * The environment contains evaluated flags as well as the registered platform.\n * This is always used as a global singleton and can be retrieved with\n * `tf.env()`.\n *\n * @doc {heading: 'Environment'}\n */\nexport class Environment {\n    // tslint:disable-next-line: no-any\n    constructor(global) {\n        this.global = global;\n        this.flags = {};\n        this.flagRegistry = {};\n        this.urlFlags = {};\n        // Jasmine spies on this in 'environment_test.ts'\n        this.getQueryParams = getQueryParams;\n        this.populateURLFlags();\n    }\n    setPlatform(platformName, platform) {\n        if (this.platform != null) {\n            if (!(env().getBool('IS_TEST') || env().getBool('PROD'))) {\n                console.warn(`Platform ${this.platformName} has already been set. ` +\n                    `Overwriting the platform with ${platformName}.`);\n            }\n        }\n        this.platformName = platformName;\n        this.platform = platform;\n    }\n    registerFlag(flagName, evaluationFn, setHook) {\n        this.flagRegistry[flagName] = { evaluationFn, setHook };\n        // Override the flag value from the URL. This has to happen here because\n        // the environment is initialized before flags get registered.\n        if (this.urlFlags[flagName] != null) {\n            const flagValue = this.urlFlags[flagName];\n            if (!(env().getBool('IS_TEST') || env().getBool('PROD'))) {\n                console.warn(`Setting feature override from URL ${flagName}: ${flagValue}.`);\n            }\n            this.set(flagName, flagValue);\n        }\n    }\n    async getAsync(flagName) {\n        if (flagName in this.flags) {\n            return this.flags[flagName];\n        }\n        this.flags[flagName] = await this.evaluateFlag(flagName);\n        return this.flags[flagName];\n    }\n    get(flagName) {\n        if (flagName in this.flags) {\n            return this.flags[flagName];\n        }\n        const flagValue = this.evaluateFlag(flagName);\n        if (isPromise(flagValue)) {\n            throw new Error(`Flag ${flagName} cannot be synchronously evaluated. ` +\n                `Please use getAsync() instead.`);\n        }\n        this.flags[flagName] = flagValue;\n        return this.flags[flagName];\n    }\n    getNumber(flagName) {\n        return this.get(flagName);\n    }\n    getBool(flagName) {\n        return this.get(flagName);\n    }\n    getFlags() {\n        return this.flags;\n    }\n    // For backwards compatibility.\n    get features() {\n        return this.flags;\n    }\n    set(flagName, value) {\n        if (this.flagRegistry[flagName] == null) {\n            throw new Error(`Cannot set flag ${flagName} as it has not been registered.`);\n        }\n        this.flags[flagName] = value;\n        if (this.flagRegistry[flagName].setHook != null) {\n            this.flagRegistry[flagName].setHook(value);\n        }\n    }\n    evaluateFlag(flagName) {\n        if (this.flagRegistry[flagName] == null) {\n            throw new Error(`Cannot evaluate flag '${flagName}': no evaluation function found.`);\n        }\n        return this.flagRegistry[flagName].evaluationFn();\n    }\n    setFlags(flags) {\n        this.flags = Object.assign({}, flags);\n    }\n    reset() {\n        this.flags = {};\n        this.urlFlags = {};\n        this.populateURLFlags();\n    }\n    populateURLFlags() {\n        if (typeof this.global === 'undefined' ||\n            typeof this.global.location === 'undefined' ||\n            typeof this.global.location.search === 'undefined') {\n            return;\n        }\n        const urlParams = this.getQueryParams(this.global.location.search);\n        if (TENSORFLOWJS_FLAGS_PREFIX in urlParams) {\n            const keyValues = urlParams[TENSORFLOWJS_FLAGS_PREFIX].split(',');\n            keyValues.forEach(keyValue => {\n                const [key, value] = keyValue.split(':');\n                this.urlFlags[key] = parseValue(key, value);\n            });\n        }\n    }\n}\nexport function getQueryParams(queryString) {\n    const params = {};\n    queryString.replace(/[?&]([^=?&]+)(?:=([^&]*))?/g, (s, ...t) => {\n        decodeParam(params, t[0], t[1]);\n        return t.join('=');\n    });\n    return params;\n}\nfunction decodeParam(params, name, value) {\n    params[decodeURIComponent(name)] = decodeURIComponent(value || '');\n}\nfunction parseValue(flagName, value) {\n    value = value.toLowerCase();\n    if (value === 'true' || value === 'false') {\n        return value === 'true';\n    }\n    else if (`${+value}` === value) {\n        return +value;\n    }\n    throw new Error(`Could not parse value flag value ${value} for flag ${flagName}.`);\n}\n/**\n * Returns the current environment (a global singleton).\n *\n * The environment object contains the evaluated feature values as well as the\n * active platform.\n *\n * @doc {heading: 'Environment'}\n */\nexport function env() {\n    return ENV;\n}\nexport let ENV = null;\nexport function setEnvironmentGlobal(environment) {\n    ENV = environment;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52aXJvbm1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2Vudmlyb25tZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsc0VBQXNFO0FBQ3RFLE1BQU0seUJBQXlCLEdBQUcsV0FBVyxDQUFDO0FBWTlDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxXQUFXO0lBWXRCLG1DQUFtQztJQUNuQyxZQUFtQixNQUFXO1FBQVgsV0FBTSxHQUFOLE1BQU0sQ0FBSztRQVp0QixVQUFLLEdBQVUsRUFBRSxDQUFDO1FBQ2xCLGlCQUFZLEdBQTRDLEVBQUUsQ0FBQztRQUUzRCxhQUFRLEdBQVUsRUFBRSxDQUFDO1FBSzdCLGlEQUFpRDtRQUNqRCxtQkFBYyxHQUFHLGNBQWMsQ0FBQztRQUk5QixJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsV0FBVyxDQUFDLFlBQW9CLEVBQUUsUUFBa0I7UUFDbEQsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7Z0JBQ3hELE9BQU8sQ0FBQyxJQUFJLENBQ1IsWUFBWSxJQUFJLENBQUMsWUFBWSx5QkFBeUI7b0JBQ3RELGlDQUFpQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZEO1NBQ0Y7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztJQUMzQixDQUFDO0lBRUQsWUFBWSxDQUNSLFFBQWdCLEVBQUUsWUFBOEIsRUFDaEQsT0FB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O0FBRUQsTUFBTSxDQUFDLElBQUksR0FBRyxHQUFnQixJQUFJLENBQUM7QUFDbkMsTUFBTSxVQUFVLG9CQUFvQixDQUFDLFdBQXdCO0lBQzNELEdBQUcsR0FBRyxXQUFXLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnLi9wbGF0Zm9ybXMvcGxhdGZvcm0nO1xuaW1wb3J0IHtpc1Byb21pc2V9IGZyb20gJy4vdXRpbF9iYXNlJztcblxuLy8gRXhwZWN0cyBmbGFncyBmcm9tIFVSTCBpbiB0aGUgZm9ybWF0ID90ZmpzZmxhZ3M9RkxBRzE6MSxGTEFHMjp0cnVlLlxuY29uc3QgVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWCA9ICd0ZmpzZmxhZ3MnO1xuXG50eXBlIEZsYWdWYWx1ZSA9IG51bWJlcnxib29sZWFuO1xudHlwZSBGbGFnRXZhbHVhdGlvbkZuID0gKCgpID0+IEZsYWdWYWx1ZSl8KCgpID0+IFByb21pc2U8RmxhZ1ZhbHVlPik7XG5leHBvcnQgdHlwZSBGbGFncyA9IHtcbiAgW2ZlYXR1cmVOYW1lOiBzdHJpbmddOiBGbGFnVmFsdWVcbn07XG5leHBvcnQgdHlwZSBGbGFnUmVnaXN0cnlFbnRyeSA9IHtcbiAgZXZhbHVhdGlvbkZuOiBGbGFnRXZhbHVhdGlvbkZuO1xuICBzZXRIb29rPzogKHZhbHVlOiBGbGFnVmFsdWUpID0+IHZvaWQ7XG59O1xuXG4vKipcbiAqIFRoZSBlbnZpcm9ubWVudCBjb250YWlucyBldmFsdWF0ZWQgZmxhZ3MgYXMgd2VsbCBhcyB0aGUgcmVnaXN0ZXJlZCBwbGF0Zm9ybS5cbiAqIFRoaXMgaXMgYWx3YXlzIHVzZWQgYXMgYSBnbG9iYWwgc2luZ2xldG9uIGFuZCBjYW4gYmUgcmV0cmlldmVkIHdpdGhcbiAqIGB0Zi5lbnYoKWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50J31cbiAqL1xuZXhwb3J0IGNsYXNzIEVudmlyb25tZW50IHtcbiAgcHJpdmF0ZSBmbGFnczogRmxhZ3MgPSB7fTtcbiAgcHJpdmF0ZSBmbGFnUmVnaXN0cnk6IHtbZmxhZ05hbWU6IHN0cmluZ106IEZsYWdSZWdpc3RyeUVudHJ5fSA9IHt9O1xuXG4gIHByaXZhdGUgdXJsRmxhZ3M6IEZsYWdzID0ge307XG5cbiAgcGxhdGZvcm1OYW1lOiBzdHJpbmc7XG4gIHBsYXRmb3JtOiBQbGF0Zm9ybTtcblxuICAvLyBKYXNtaW5lIHNwaWVzIG9uIHRoaXMgaW4gJ2Vudmlyb25tZW50X3Rlc3QudHMnXG4gIGdldFF1ZXJ5UGFyYW1zID0gZ2V0UXVlcnlQYXJhbXM7XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgY29uc3RydWN0b3IocHVibGljIGdsb2JhbDogYW55KSB7XG4gICAgdGhpcy5wb3B1bGF0ZVVSTEZsYWdzKCk7XG4gIH1cblxuICBzZXRQbGF0Zm9ybShwbGF0Zm9ybU5hbWU6IHN0cmluZywgcGxhdGZvcm06IFBsYXRmb3JtKSB7XG4gICAgaWYgKHRoaXMucGxhdGZvcm0gIT0gbnVsbCkge1xuICAgICAgaWYgKCEoZW52KCkuZ2V0Qm9vbCgnSVNfVEVTVCcpIHx8IGVudigpLmdldEJvb2woJ1BST0QnKSkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFBsYXRmb3JtICR7dGhpcy5wbGF0Zm9ybU5hbWV9IGhhcyBhbHJlYWR5IGJlZW4gc2V0LiBgICtcbiAgICAgICAgICAgIGBPdmVyd3JpdGluZyB0aGUgcGxhdGZvcm0gd2l0aCAke3BsYXRmb3JtTmFtZX0uYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMucGxhdGZvcm1OYW1lID0gcGxhdGZvcm1OYW1lO1xuICAgIHRoaXMucGxhdGZvcm0gPSBwbGF0Zm9ybTtcbiAgfVxuXG4gIHJlZ2lzdGVyRmxhZyhcbiAgICAgIGZsYWdOYW1lOiBzdHJpbmcsIGV2YWx1YXRpb25GbjogRmxhZ0V2YWx1YXRpb25GbixcbiAgICAgIHNldEhvb2s/OiAodmFsdWU6IEZsYWdWYWx1ZSkgPT4gdm9pZCkge1xuICAgIHRoaXMuZmxhZ1JlZ2lzdHJ5W2ZsYWdOYW1lXSA9IHtldmFsdWF0aW9uRm4sIHNldEhvb2t9O1xuXG4gICAgLy8gT3ZlcnJpZGUgdGhlIGZsYWcgdmFsdWUgZnJvbSB0aGUgVVJMLiBUaGlzIGhhcyB0byBoYXBwZW4gaGVyZSBiZWNhdXNlXG4gICAgLy8gdGhlIGVudmlyb25tZW50IGlzIGluaXRpYWxpemVkIGJlZm9yZSBmbGFncyBnZXQgcmVnaXN0ZXJlZC5cbiAgICBpZiAodGhpcy51cmxGbGFnc1tmbGFnTmFtZV0gIT0gbnVsbCkge1xuICAgICAgY29uc3QgZmxhZ1ZhbHVlID0gdGhpcy51cmxGbGFnc1tmbGFnTmFtZV07XG4gICAgICBpZiAoIShlbnYoKS5nZXRCb29sKCdJU19URVNUJykgfHwgZW52KCkuZ2V0Qm9vbCgnUFJPRCcpKSkge1xuICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBgU2V0dGluZyBmZWF0dXJlIG92ZXJyaWRlIGZyb20gVVJMICR7ZmxhZ05hbWV9OiAke2ZsYWdWYWx1ZX0uYCk7XG4gICAgICB9XG4gICAgICB0aGlzLnNldChmbGFnTmFtZSwgZmxhZ1ZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBnZXRBc3luYyhmbGFnTmFtZTogc3RyaW5nKTogUHJvbWlzZTxGbGFnVmFsdWU+IHtcbiAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgIH1cblxuICAgIHRoaXMuZmxhZ3NbZmxhZ05hbWVdID0gYXdhaXQgdGhpcy5ldmFsdWF0ZUZsYWcoZmxhZ05hbWUpO1xuICAgIHJldHVybiB0aGlzLmZsYWdzW2ZsYWdOYW1lXTtcbiAgfVxuXG4gIGdldChmbGFnTmFtZTogc3RyaW5nKTogRmxhZ1ZhbHVlIHtcbiAgICBpZiAoZmxhZ05hbWUgaW4gdGhpcy5mbGFncykge1xuICAgICAgcmV0dXJuIHRoaXMuZmxhZ3NbZmxhZ05hbWVdO1xuICAgIH1cblxuICAgIGNvbnN0IGZsYWdWYWx1ZSA9IHRoaXMuZXZhbHVhdGVGbGFnKGZsYWdOYW1lKTtcbiAgICBpZiAoaXNQcm9taXNlKGZsYWdWYWx1ZSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRmxhZyAke2ZsYWdOYW1lfSBjYW5ub3QgYmUgc3luY2hyb25vdXNseSBldmFsdWF0ZWQuIGAgK1xuICAgICAgICAgIGBQbGVhc2UgdXNlIGdldEFzeW5jKCkgaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmZsYWdzW2ZsYWdOYW1lXSA9IGZsYWdWYWx1ZTtcbiAgICByZXR1cm4gdGhpcy5mbGFnc1tmbGFnTmFtZV07XG4gIH1cblxuICBnZXROdW1iZXIoZmxhZ05hbWU6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0KGZsYWdOYW1lKSBhcyBudW1iZXI7XG4gIH1cblxuICBnZXRCb29sKGZsYWdOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5nZXQoZmxhZ05hbWUpIGFzIGJvb2xlYW47XG4gIH1cblxuICBnZXRGbGFncygpOiBGbGFncyB7XG4gICAgcmV0dXJuIHRoaXMuZmxhZ3M7XG4gIH1cbiAgLy8gRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICBnZXQgZmVhdHVyZXMoKTogRmxhZ3Mge1xuICAgIHJldHVybiB0aGlzLmZsYWdzO1xuICB9XG5cbiAgc2V0KGZsYWdOYW1lOiBzdHJpbmcsIHZhbHVlOiBGbGFnVmFsdWUpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHNldCBmbGFnICR7ZmxhZ05hbWV9IGFzIGl0IGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLmApO1xuICAgIH1cbiAgICB0aGlzLmZsYWdzW2ZsYWdOYW1lXSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0uc2V0SG9vayh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBldmFsdWF0ZUZsYWcoZmxhZ05hbWU6IHN0cmluZyk6IEZsYWdWYWx1ZXxQcm9taXNlPEZsYWdWYWx1ZT4ge1xuICAgIGlmICh0aGlzLmZsYWdSZWdpc3RyeVtmbGFnTmFtZV0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZXZhbHVhdGUgZmxhZyAnJHtmbGFnTmFtZX0nOiBubyBldmFsdWF0aW9uIGZ1bmN0aW9uIGZvdW5kLmApO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5mbGFnUmVnaXN0cnlbZmxhZ05hbWVdLmV2YWx1YXRpb25GbigpO1xuICB9XG5cbiAgc2V0RmxhZ3MoZmxhZ3M6IEZsYWdzKSB7XG4gICAgdGhpcy5mbGFncyA9IE9iamVjdC5hc3NpZ24oe30sIGZsYWdzKTtcbiAgfVxuXG4gIHJlc2V0KCkge1xuICAgIHRoaXMuZmxhZ3MgPSB7fTtcbiAgICB0aGlzLnVybEZsYWdzID0ge307XG4gICAgdGhpcy5wb3B1bGF0ZVVSTEZsYWdzKCk7XG4gIH1cblxuICBwcml2YXRlIHBvcHVsYXRlVVJMRmxhZ3MoKTogdm9pZCB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmdsb2JhbCA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgICAgdHlwZW9mIHRoaXMuZ2xvYmFsLmxvY2F0aW9uID09PSAndW5kZWZpbmVkJyB8fFxuICAgICAgICB0eXBlb2YgdGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoID09PSAndW5kZWZpbmVkJykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVybFBhcmFtcyA9IHRoaXMuZ2V0UXVlcnlQYXJhbXModGhpcy5nbG9iYWwubG9jYXRpb24uc2VhcmNoKTtcbiAgICBpZiAoVEVOU09SRkxPV0pTX0ZMQUdTX1BSRUZJWCBpbiB1cmxQYXJhbXMpIHtcbiAgICAgIGNvbnN0IGtleVZhbHVlcyA9IHVybFBhcmFtc1tURU5TT1JGTE9XSlNfRkxBR1NfUFJFRklYXS5zcGxpdCgnLCcpO1xuICAgICAga2V5VmFsdWVzLmZvckVhY2goa2V5VmFsdWUgPT4ge1xuICAgICAgICBjb25zdCBba2V5LCB2YWx1ZV0gPSBrZXlWYWx1ZS5zcGxpdCgnOicpIGFzIFtzdHJpbmcsIHN0cmluZ107XG4gICAgICAgIHRoaXMudXJsRmxhZ3Nba2V5XSA9IHBhcnNlVmFsdWUoa2V5LCB2YWx1ZSk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFF1ZXJ5UGFyYW1zKHF1ZXJ5U3RyaW5nOiBzdHJpbmcpOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSB7XG4gIGNvbnN0IHBhcmFtcyA9IHt9O1xuICBxdWVyeVN0cmluZy5yZXBsYWNlKC9bPyZdKFtePT8mXSspKD86PShbXiZdKikpPy9nLCAocywgLi4udCkgPT4ge1xuICAgIGRlY29kZVBhcmFtKHBhcmFtcywgdFswXSwgdFsxXSk7XG4gICAgcmV0dXJuIHQuam9pbignPScpO1xuICB9KTtcbiAgcmV0dXJuIHBhcmFtcztcbn1cblxuZnVuY3Rpb24gZGVjb2RlUGFyYW0oXG4gICAgcGFyYW1zOiB7W2tleTogc3RyaW5nXTogc3RyaW5nfSwgbmFtZTogc3RyaW5nLCB2YWx1ZT86IHN0cmluZykge1xuICBwYXJhbXNbZGVjb2RlVVJJQ29tcG9uZW50KG5hbWUpXSA9IGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSB8fCAnJyk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVmFsdWUoZmxhZ05hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IEZsYWdWYWx1ZSB7XG4gIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHZhbHVlID09PSAndHJ1ZScgfHwgdmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICByZXR1cm4gdmFsdWUgPT09ICd0cnVlJztcbiAgfSBlbHNlIGlmIChgJHsrIHZhbHVlfWAgPT09IHZhbHVlKSB7XG4gICAgcmV0dXJuICt2YWx1ZTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ291bGQgbm90IHBhcnNlIHZhbHVlIGZsYWcgdmFsdWUgJHt2YWx1ZX0gZm9yIGZsYWcgJHtmbGFnTmFtZX0uYCk7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudCBlbnZpcm9ubWVudCAoYSBnbG9iYWwgc2luZ2xldG9uKS5cbiAqXG4gKiBUaGUgZW52aXJvbm1lbnQgb2JqZWN0IGNvbnRhaW5zIHRoZSBldmFsdWF0ZWQgZmVhdHVyZSB2YWx1ZXMgYXMgd2VsbCBhcyB0aGVcbiAqIGFjdGl2ZSBwbGF0Zm9ybS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW52KCkge1xuICByZXR1cm4gRU5WO1xufVxuXG5leHBvcnQgbGV0IEVOVjogRW52aXJvbm1lbnQgPSBudWxsO1xuZXhwb3J0IGZ1bmN0aW9uIHNldEVudmlyb25tZW50R2xvYmFsKGVudmlyb25tZW50OiBFbnZpcm9ubWVudCkge1xuICBFTlYgPSBlbnZpcm9ubWVudDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Note that the identifier globalNameSpace is scoped to this module, but will\n// always resolve to the same global object regardless of how the module is\n// resolved.\n// tslint:disable-next-line:no-any\nlet globalNameSpace;\n// tslint:disable-next-line:no-any\nexport function getGlobalNamespace() {\n    if (globalNameSpace == null) {\n        // tslint:disable-next-line:no-any\n        let ns;\n        if (typeof (window) !== 'undefined') {\n            ns = window;\n        }\n        else if (typeof (global) !== 'undefined') {\n            ns = global;\n        }\n        else if (typeof (process) !== 'undefined') {\n            ns = process;\n        }\n        else if (typeof (self) !== 'undefined') {\n            ns = self;\n        }\n        else {\n            throw new Error('Could not find a global object');\n        }\n        globalNameSpace = ns;\n    }\n    return globalNameSpace;\n}\n// tslint:disable-next-line:no-any\nfunction getGlobalMap() {\n    const ns = getGlobalNamespace();\n    if (ns._tfGlobals == null) {\n        ns._tfGlobals = new Map();\n    }\n    return ns._tfGlobals;\n}\n/**\n * Returns a globally accessible 'singleton' object.\n *\n * @param key the name of the object\n * @param init a function to initialize to initialize this object\n *             the first time it is fetched.\n */\nexport function getGlobal(key, init) {\n    const globalMap = getGlobalMap();\n    if (globalMap.has(key)) {\n        return globalMap.get(key);\n    }\n    else {\n        const singleton = init();\n        globalMap.set(key, singleton);\n        return globalMap.get(key);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dsb2JhbF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDhFQUE4RTtBQUM5RSwyRUFBMkU7QUFDM0UsWUFBWTtBQUNaLGtDQUFrQztBQUNsQyxJQUFJLGVBQStDLENBQUM7QUFDcEQsa0NBQWtDO0FBQ2xDLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFO1FBQzNCLGtDQUFrQztRQUNsQyxJQUFJLEVBQU8sQ0FBQztRQUNaLElBQUksT0FBTyxDQUFDLE1BQU0sQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUNuQyxFQUFFLEdBQUcsTUFBTSxDQUFDO1NBQ2I7YUFBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxXQUFXLEVBQUU7WUFDMUMsRUFBRSxHQUFHLE1BQU0sQ0FBQztTQUNiO2FBQU0sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEtBQUssV0FBVyxFQUFFO1lBQzNDLEVBQUUsR0FBRyxPQUFPLENBQUM7U0FDZDthQUFNLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUN4QyxFQUFFLEdBQUcsSUFBSSxDQUFDO1NBQ1g7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLENBQUMsQ0FBQztTQUNuRDtRQUNELGVBQWUsR0FBRyxFQUFFLENBQUM7S0FDdEI7SUFDRCxPQUFPLGVBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsa0NBQWtDO0FBQ2xDLFNBQVMsWUFBWTtJQUNuQixNQUFNLEVBQUUsR0FBRyxrQkFBa0IsRUFBRSxDQUFDO0lBQ2hDLElBQUksRUFBRSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDekIsRUFBRSxDQUFDLFVBQVUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxFQUFFLENBQUMsVUFBVSxDQUFDO0FBQ3ZCLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFJLEdBQVcsRUFBRSxJQUFhO0lBQ3JELE1BQU0sU0FBUyxHQUFHLFlBQVksRUFBRSxDQUFDO0lBQ2pDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUN0QixPQUFPLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDM0I7U0FBTTtRQUNMLE1BQU0sU0FBUyxHQUFHLElBQUksRUFBRSxDQUFDO1FBQ3pCLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLE9BQU8sU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUMzQjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIE5vdGUgdGhhdCB0aGUgaWRlbnRpZmllciBnbG9iYWxOYW1lU3BhY2UgaXMgc2NvcGVkIHRvIHRoaXMgbW9kdWxlLCBidXQgd2lsbFxuLy8gYWx3YXlzIHJlc29sdmUgdG8gdGhlIHNhbWUgZ2xvYmFsIG9iamVjdCByZWdhcmRsZXNzIG9mIGhvdyB0aGUgbW9kdWxlIGlzXG4vLyByZXNvbHZlZC5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmxldCBnbG9iYWxOYW1lU3BhY2U6IHtfdGZHbG9iYWxzOiBNYXA8c3RyaW5nLCBhbnk+fTtcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWxOYW1lc3BhY2UoKToge190Zkdsb2JhbHM6IE1hcDxzdHJpbmcsIGFueT59IHtcbiAgaWYgKGdsb2JhbE5hbWVTcGFjZSA9PSBudWxsKSB7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGxldCBuczogYW55O1xuICAgIGlmICh0eXBlb2YgKHdpbmRvdykgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBucyA9IHdpbmRvdztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAoZ2xvYmFsKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG5zID0gZ2xvYmFsO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIChwcm9jZXNzKSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIG5zID0gcHJvY2VzcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiAoc2VsZikgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBucyA9IHNlbGY7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgYSBnbG9iYWwgb2JqZWN0Jyk7XG4gICAgfVxuICAgIGdsb2JhbE5hbWVTcGFjZSA9IG5zO1xuICB9XG4gIHJldHVybiBnbG9iYWxOYW1lU3BhY2U7XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIGdldEdsb2JhbE1hcCgpOiBNYXA8c3RyaW5nLCBhbnk+IHtcbiAgY29uc3QgbnMgPSBnZXRHbG9iYWxOYW1lc3BhY2UoKTtcbiAgaWYgKG5zLl90Zkdsb2JhbHMgPT0gbnVsbCkge1xuICAgIG5zLl90Zkdsb2JhbHMgPSBuZXcgTWFwKCk7XG4gIH1cbiAgcmV0dXJuIG5zLl90Zkdsb2JhbHM7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGdsb2JhbGx5IGFjY2Vzc2libGUgJ3NpbmdsZXRvbicgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBrZXkgdGhlIG5hbWUgb2YgdGhlIG9iamVjdFxuICogQHBhcmFtIGluaXQgYSBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRvIGluaXRpYWxpemUgdGhpcyBvYmplY3RcbiAqICAgICAgICAgICAgIHRoZSBmaXJzdCB0aW1lIGl0IGlzIGZldGNoZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHbG9iYWw8VD4oa2V5OiBzdHJpbmcsIGluaXQ6ICgpID0+IFQpOiBUIHtcbiAgY29uc3QgZ2xvYmFsTWFwID0gZ2V0R2xvYmFsTWFwKCk7XG4gIGlmIChnbG9iYWxNYXAuaGFzKGtleSkpIHtcbiAgICByZXR1cm4gZ2xvYmFsTWFwLmdldChrZXkpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHNpbmdsZXRvbiA9IGluaXQoKTtcbiAgICBnbG9iYWxNYXAuc2V0KGtleSwgc2luZ2xldG9uKTtcbiAgICByZXR1cm4gZ2xvYmFsTWFwLmdldChrZXkpO1xuICB9XG59XG4iXX0=","export const Abs = 'Abs';\nexport const Acos = 'Acos';\nexport const Acosh = 'Acosh';\nexport const Add = 'Add';\nexport const AddN = 'AddN';\nexport const All = 'All';\nexport const Any = 'Any';\nexport const ArgMax = 'ArgMax';\nexport const ArgMin = 'ArgMin';\nexport const Asin = 'Asin';\nexport const Asinh = 'Asinh';\nexport const Atan = 'Atan';\nexport const Atanh = 'Atanh';\nexport const Atan2 = 'Atan2';\nexport const AvgPool = 'AvgPool';\nexport const AvgPoolGrad = 'AvgPoolGrad';\nexport const AvgPool3D = 'AvgPool3D';\nexport const AvgPool3DGrad = 'AvgPool3DGrad';\nexport const BatchMatMul = 'BatchMatMul';\nexport const BatchToSpaceND = 'BatchToSpaceND';\nexport const Bincount = 'Bincount';\nexport const BroadcastTo = 'BroadcastTo';\nexport const BroadcastArgs = 'BroadcastArgs';\nexport const Cast = 'Cast';\nexport const Ceil = 'Ceil';\nexport const ClipByValue = 'ClipByValue';\nexport const Complex = 'Complex';\nexport const ComplexAbs = 'ComplexAbs';\nexport const Concat = 'Concat';\nexport const Conv2D = 'Conv2D';\nexport const Conv2DBackpropFilter = 'Conv2DBackpropFilter';\nexport const Conv2DBackpropInput = 'Conv2DBackpropInput';\nexport const Conv3D = 'Conv3D';\nexport const Conv3DBackpropFilterV2 = 'Conv3DBackpropFilterV2';\nexport const Conv3DBackpropInputV2 = 'Conv3DBackpropInputV2';\nexport const Cos = 'Cos';\nexport const Cosh = 'Cosh';\nexport const Cumprod = 'Cumprod';\nexport const Cumsum = 'Cumsum';\nexport const CropAndResize = 'CropAndResize';\nexport const DenseBincount = 'DenseBincount';\nexport const DepthToSpace = 'DepthToSpace';\nexport const DepthwiseConv2dNative = 'DepthwiseConv2dNative';\nexport const DepthwiseConv2dNativeBackpropFilter = 'DepthwiseConv2dNativeBackpropFilter';\nexport const DepthwiseConv2dNativeBackpropInput = 'DepthwiseConv2dNativeBackpropInput';\nexport const Diag = 'Diag';\nexport const Dilation2D = 'Dilation2D';\nexport const Dilation2DBackpropInput = 'Dilation2DBackpropInput';\nexport const Dilation2DBackpropFilter = 'Dilation2DBackpropFilter';\nexport const RealDiv = 'RealDiv';\nexport const Einsum = 'Einsum';\nexport const Elu = 'Elu';\nexport const EluGrad = 'EluGrad';\nexport const Erf = 'Erf';\nexport const Equal = 'Equal';\nexport const Exp = 'Exp';\nexport const ExpandDims = 'ExpandDims';\nexport const Expm1 = 'Expm1';\nexport const FFT = 'FFT';\nexport const Fill = 'Fill';\nexport const FlipLeftRight = 'FlipLeftRight';\nexport const Floor = 'Floor';\nexport const FloorDiv = 'FloorDiv';\nexport const FusedBatchNorm = 'FusedBatchNorm';\nexport const GatherV2 = 'GatherV2';\nexport const GatherNd = 'GatherNd';\nexport const Greater = 'Greater';\nexport const GreaterEqual = 'GreaterEqual';\nexport const Identity = 'Identity';\nexport const IFFT = 'IFFT';\nexport const Imag = 'Imag';\nexport const IsFinite = 'IsFinite';\nexport const IsInf = 'IsInf';\nexport const IsNan = 'IsNan';\nexport const LeakyRelu = 'LeakyRelu';\nexport const Less = 'Less';\nexport const LessEqual = 'LessEqual';\nexport const LinSpace = 'LinSpace';\nexport const Log = 'Log';\nexport const Log1p = 'Log1p';\nexport const LogicalAnd = 'LogicalAnd';\nexport const LogicalNot = 'LogicalNot';\nexport const LogicalOr = 'LogicalOr';\nexport const LogicalXor = 'LogicalXor';\nexport const LogSoftmax = 'LogSoftmax';\nexport const LowerBound = 'LowerBound';\nexport const LRN = 'LRN';\nexport const LRNGrad = 'LRNGrad';\nexport const Max = 'Max';\nexport const Maximum = 'Maximum';\nexport const MaxPool = 'MaxPool';\nexport const MaxPoolGrad = 'MaxPoolGrad';\nexport const MaxPool3D = 'MaxPool3D';\nexport const MaxPool3DGrad = 'MaxPool3DGrad';\nexport const MaxPoolWithArgmax = 'MaxPoolWithArgmax';\nexport const Mean = 'Mean';\nexport const Min = 'Min';\nexport const Minimum = 'Minimum';\nexport const MirrorPad = 'MirrorPad';\nexport const Mod = 'Mod';\nexport const Multinomial = 'Multinomial';\nexport const Multiply = 'Multiply';\nexport const Neg = 'Neg';\nexport const NotEqual = 'NotEqual';\nexport const NonMaxSuppressionV3 = 'NonMaxSuppressionV3';\nexport const NonMaxSuppressionV4 = 'NonMaxSuppressionV4';\nexport const NonMaxSuppressionV5 = 'NonMaxSuppressionV5';\nexport const OnesLike = 'OnesLike';\nexport const OneHot = 'OneHot';\nexport const Pack = 'Pack';\nexport const PadV2 = 'PadV2';\nexport const Pool = 'Pool';\nexport const Pow = 'Pow';\nexport const Prelu = 'Prelu';\nexport const Prod = 'Prod';\nexport const RaggedGather = 'RaggedGather';\nexport const RaggedTensorToTensor = 'RaggedTensorToTensor';\nexport const Range = 'Range';\nexport const Real = 'Real';\nexport const Reciprocal = 'Reciprocal';\nexport const Relu = 'Relu';\nexport const Reshape = 'Reshape';\nexport const ResizeNearestNeighbor = 'ResizeNearestNeighbor';\nexport const ResizeNearestNeighborGrad = 'ResizeNearestNeighborGrad';\nexport const ResizeBilinear = 'ResizeBilinear';\nexport const ResizeBilinearGrad = 'ResizeBilinearGrad';\nexport const Relu6 = 'Relu6';\nexport const Reverse = 'Reverse';\nexport const Round = 'Round';\nexport const Rsqrt = 'Rsqrt';\nexport const ScatterNd = 'ScatterNd';\nexport const SearchSorted = 'SearchSorted';\nexport const Select = 'Select';\nexport const Selu = 'Selu';\nexport const Slice = 'Slice';\nexport const Sin = 'Sin';\nexport const Sinh = 'Sinh';\nexport const Sign = 'Sign';\nexport const Sigmoid = 'Sigmoid';\nexport const Softplus = 'Softplus';\nexport const Sqrt = 'Sqrt';\nexport const Sum = 'Sum';\nexport const SpaceToBatchND = 'SpaceToBatchND';\nexport const SplitV = 'SplitV';\nexport const Softmax = 'Softmax';\nexport const SparseFillEmptyRows = 'SparseFillEmptyRows';\nexport const SparseReshape = 'SparseReshape';\nexport const SparseSegmentMean = 'SparseSegmentMean';\nexport const SparseSegmentSum = 'SparseSegmentSum';\nexport const SparseToDense = 'SparseToDense';\nexport const SquaredDifference = 'SquaredDifference';\nexport const Square = 'Square';\nexport const StridedSlice = 'StridedSlice';\nexport const StringNGrams = 'StringNGrams';\nexport const StringSplit = 'StringSplit';\nexport const StringToHashBucketFast = 'StringToHashBucketFast';\nexport const Sub = 'Sub';\nexport const Tan = 'Tan';\nexport const Tanh = 'Tanh';\nexport const Tile = 'Tile';\nexport const TopK = 'TopK';\nexport const Transform = 'Transform';\nexport const Transpose = 'Transpose';\nexport const Unique = 'Unique';\nexport const Unpack = 'Unpack';\nexport const UnsortedSegmentSum = 'UnsortedSegmentSum';\nexport const UpperBound = 'UpperBound';\nexport const ZerosLike = 'ZerosLike';\n/**\n * TensorFlow.js-only kernels\n */\nexport const Step = 'Step';\nexport const FromPixels = 'FromPixels';\nexport const RotateWithOffset = 'RotateWithOffset';\nexport const _FusedMatMul = '_FusedMatMul';\nexport const FusedConv2D = 'FusedConv2D';\nexport const FusedDepthwiseConv2D = 'FusedDepthwiseConv2D';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VybmVsX25hbWVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9rZXJuZWxfbmFtZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBeUJBLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFHekIsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUczQixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDO0FBRzdCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFHekIsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQztBQUczQixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDO0FBT3pCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxLQUFLLENBQUM7QUFPekIsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQztBQU0vQixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDO0FBTS9CLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7QUFHM0IsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUc3QixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDO0FBRzNCLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUM7QUFHN0IsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQztBQUc3QixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDO0FBU2pDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFRekMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQztBQVVyQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUFDO0FBUzdDLE1BQU0sQ0FBQyxNQUFNLFdBQVcs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QUFVLEdBQUcsWUFBWSxDQUFDO0FBU3ZDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGtCQUFrQixDQUFDO0FBUW5ELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxjQUFjLENBQUM7QUFnQjNDLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxhQUFhLENBQUM7QUFpQnpDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLHNCQUFzQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuLy8gQWxsb3cgVXBwZXJDYW1lbENhc2UgdmFyaWFibGUgbmFtZXNcbi8vIHRzbGludDpkaXNhYmxlOiB2YXJpYWJsZS1uYW1lXG4vLyBVbmZvcnR1bmF0ZWx5IGp1c3QgZW5hYmxpbmcgUGFzY2FsQ2FzZSBwZXIgZmlsZSAodHNsaW50OmVuYWJsZTpcbi8vIGFsbG93LXBhc2NhbC1jYXNlKSBkb2Vzbid0IHdvcmsuXG5pbXBvcnQge05hbWVkVGVuc29ySW5mb01hcCwgVGVuc29ySW5mb30gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4vb3BzL2NvbnZfdXRpbCc7XG5pbXBvcnQge0FjdGl2YXRpb259IGZyb20gJy4vb3BzL2Z1c2VkX3R5cGVzJztcbmltcG9ydCB7RGF0YVR5cGUsIFBpeGVsRGF0YX0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBBYnMgPSAnQWJzJztcbmV4cG9ydCB0eXBlIEFic0lucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgQWNvcyA9ICdBY29zJztcbmV4cG9ydCB0eXBlIEFjb3NJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEFjb3NoID0gJ0Fjb3NoJztcbmV4cG9ydCB0eXBlIEFjb3NoSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBBZGQgPSAnQWRkJztcbmV4cG9ydCB0eXBlIEFkZElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEFkZE4gPSAnQWRkTic7XG5leHBvcnQgdHlwZSBBZGROSW5wdXRzID0gVGVuc29ySW5mb1tdO1xuXG5leHBvcnQgY29uc3QgQWxsID0gJ0FsbCc7XG5leHBvcnQgdHlwZSBBbGxJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQWxsQXR0cnMge1xuICBheGlzOiBudW1iZXJ8bnVtYmVyW107XG4gIGtlZXBEaW1zOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQW55ID0gJ0FueSc7XG5leHBvcnQgdHlwZSBBbnlJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQW55QXR0cnMge1xuICBheGlzOiBudW1iZXJ8bnVtYmVyW107XG4gIGtlZXBEaW1zOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgQXJnTWF4ID0gJ0FyZ01heCc7XG5leHBvcnQgdHlwZSBBcmdNYXhJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQXJnTWF4QXR0cnMge1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBBcmdNaW4gPSAnQXJnTWluJztcbmV4cG9ydCB0eXBlIEFyZ01pbklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBBcmdNaW5BdHRycyB7XG4gIGF4aXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEFzaW4gPSAnQXNpbic7XG5leHBvcnQgdHlwZSBBc2luSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBBc2luaCA9ICdBc2luaCc7XG5leHBvcnQgdHlwZSBBc2luaElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgQXRhbiA9ICdBdGFuJztcbmV4cG9ydCB0eXBlIEF0YW5JbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEF0YW5oID0gJ0F0YW5oJztcbmV4cG9ydCB0eXBlIEF0YW5oSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBBdGFuMiA9ICdBdGFuMic7XG5leHBvcnQgdHlwZSBBdGFuMklucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEF2Z1Bvb2wgPSAnQXZnUG9vbCc7XG5leHBvcnQgdHlwZSBBdmdQb29sSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIEF2Z1Bvb2xBdHRycyB7XG4gIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nO1xuICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnO1xufVxuXG5leHBvcnQgY29uc3QgQXZnUG9vbEdyYWQgPSAnQXZnUG9vbEdyYWQnO1xuZXhwb3J0IHR5cGUgQXZnUG9vbEdyYWRJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2R5J3wnaW5wdXQnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQXZnUG9vbEdyYWRBdHRycyB7XG4gIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nO1xufVxuXG5leHBvcnQgY29uc3QgQXZnUG9vbDNEID0gJ0F2Z1Bvb2wzRCc7XG5leHBvcnQgdHlwZSBBdmdQb29sM0RJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQXZnUG9vbDNEQXR0cnMge1xuICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcjtcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbiAgZGF0YUZvcm1hdDogJ05ESFdDJ3wnTkNESFcnO1xufVxuXG5leHBvcnQgY29uc3QgQXZnUG9vbDNER3JhZCA9ICdBdmdQb29sM0RHcmFkJztcbmV4cG9ydCB0eXBlIEF2Z1Bvb2wzREdyYWRJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2R5J3wnaW5wdXQnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQXZnUG9vbDNER3JhZEF0dHJzIHtcbiAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCc7XG59XG5cbmV4cG9ydCBjb25zdCBCYXRjaE1hdE11bCA9ICdCYXRjaE1hdE11bCc7XG5leHBvcnQgdHlwZSBCYXRjaE1hdE11bElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnYSd8J2InPjtcbmV4cG9ydCBpbnRlcmZhY2UgQmF0Y2hNYXRNdWxBdHRycyB7XG4gIHRyYW5zcG9zZUE6IGJvb2xlYW47XG4gIHRyYW5zcG9zZUI6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBCYXRjaFRvU3BhY2VORCA9ICdCYXRjaFRvU3BhY2VORCc7XG5leHBvcnQgdHlwZSBCYXRjaFRvU3BhY2VORElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBCYXRjaFRvU3BhY2VOREF0dHJzIHtcbiAgYmxvY2tTaGFwZTogbnVtYmVyW107XG4gIGNyb3BzOiBudW1iZXJbXVtdO1xufVxuXG5leHBvcnQgdHlwZSBCaW5hcnlJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2EnfCdiJz47XG5cbmV4cG9ydCBjb25zdCBCaW5jb3VudCA9ICdCaW5jb3VudCc7XG5leHBvcnQgdHlwZSBCaW5jb3VudElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J3dlaWdodHMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgQmluY291bnRBdHRycyB7XG4gIHNpemU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEJyb2FkY2FzdFRvID0gJ0Jyb2FkY2FzdFRvJztcbmV4cG9ydCB0eXBlIEJyb2FkY2FzdFRvSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIEJyb2FkQ2FzdFRvQXR0cnMge1xuICBzaGFwZTogbnVtYmVyW107XG4gIGlucHV0U2hhcGU6IG51bWJlcltdOyAgLy8gZm9yIGdyYWRpZW50XG59XG5cbmV4cG9ydCBjb25zdCBCcm9hZGNhc3RBcmdzID0gJ0Jyb2FkY2FzdEFyZ3MnO1xuZXhwb3J0IHR5cGUgQnJvYWRjYXN0QXJnc0lucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnczAnfCdzMSc+O1xuXG5leHBvcnQgY29uc3QgQ2FzdCA9ICdDYXN0JztcbmV4cG9ydCB0eXBlIENhc3RJbnB1dHMgPSBVbmFyeUlucHV0cztcbmV4cG9ydCBpbnRlcmZhY2UgQ2FzdEF0dHJzIHtcbiAgZHR5cGU6IERhdGFUeXBlO1xufVxuXG5leHBvcnQgY29uc3QgQ2VpbCA9ICdDZWlsJztcbmV4cG9ydCB0eXBlIENlaWxJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IENsaXBCeVZhbHVlID0gJ0NsaXBCeVZhbHVlJztcbmV4cG9ydCB0eXBlIENsaXBCeVZhbHVlSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5leHBvcnQgaW50ZXJmYWNlIENsaXBCeVZhbHVlQXR0cnMge1xuICBjbGlwVmFsdWVNaW46IG51bWJlcjtcbiAgY2xpcFZhbHVlTWF4OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBDb21wbGV4ID0gJ0NvbXBsZXgnO1xuZXhwb3J0IHR5cGUgQ29tcGxleElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAncmVhbCd8J2ltYWcnPjtcblxuZXhwb3J0IGNvbnN0IENvbXBsZXhBYnMgPSAnQ29tcGxleEFicyc7XG5leHBvcnQgdHlwZSBDb21wbGV4QWJzSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBDb25jYXQgPSAnQ29uY2F0JztcbmV4cG9ydCB0eXBlIENvbmNhdElucHV0cyA9IFRlbnNvckluZm9bXTtcbmV4cG9ydCBpbnRlcmZhY2UgQ29uY2F0QXR0cnMge1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBDb252MkQgPSAnQ29udjJEJztcbmV4cG9ydCB0eXBlIENvbnYyRElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBDb252MkRBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmc7XG4gIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVyc7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCc7XG59XG5cbmV4cG9ydCBjb25zdCBDb252MkRCYWNrcHJvcEZpbHRlciA9ICdDb252MkRCYWNrcHJvcEZpbHRlcic7XG5leHBvcnQgdHlwZSBDb252MkRCYWNrcHJvcEZpbHRlcklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2R5Jz47XG5leHBvcnQgaW50ZXJmYWNlIENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMge1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nO1xuICBkYXRhRm9ybWF0OiAnTkhXQyd8J05DSFcnO1xuICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnO1xuICBmaWx0ZXJTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBjb25zdCBDb252MkRCYWNrcHJvcElucHV0ID0gJ0NvbnYyREJhY2twcm9wSW5wdXQnO1xuZXhwb3J0IHR5cGUgQ29udjJEQmFja3Byb3BJbnB1dElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnZHknfCdmaWx0ZXInPjtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udjJEQmFja3Byb3BJbnB1dEF0dHJzIHtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbiAgaW5wdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBjb25zdCBDb252M0QgPSAnQ29udjNEJztcbmV4cG9ydCB0eXBlIENvbnYzRElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBDb252M0RBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSc7XG4gIGRhdGFGb3JtYXQ6ICdOREhXQyd8J05DREhXJztcbiAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiA9ICdDb252M0RCYWNrcHJvcEZpbHRlclYyJztcbmV4cG9ydCB0eXBlIENvbnYzREJhY2twcm9wRmlsdGVyVjJJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdkeSc+O1xuXG5leHBvcnQgaW50ZXJmYWNlIENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSc7XG4gIGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgY29uc3QgQ29udjNEQmFja3Byb3BJbnB1dFYyID0gJ0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5leHBvcnQgdHlwZSBDb252M0RCYWNrcHJvcElucHV0VjJJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnZHknfCdmaWx0ZXInPjtcbmV4cG9ydCBpbnRlcmZhY2UgQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMge1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnO1xuICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgY29uc3QgQ29zID0gJ0Nvcyc7XG5leHBvcnQgdHlwZSBDb3NJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IENvc2ggPSAnQ29zaCc7XG5leHBvcnQgdHlwZSBDb3NoSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBDdW1wcm9kID0gJ0N1bXByb2QnO1xuZXhwb3J0IHR5cGUgQ3VtcHJvZElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBDdW1wcm9kQXR0cnMge1xuICBheGlzOiBudW1iZXI7XG4gIGV4Y2x1c2l2ZTogYm9vbGVhbjtcbiAgcmV2ZXJzZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IEN1bXN1bSA9ICdDdW1zdW0nO1xuZXhwb3J0IHR5cGUgQ3Vtc3VtSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIEN1bXN1bUF0dHJzIHtcbiAgYXhpczogbnVtYmVyO1xuICBleGNsdXNpdmU6IGJvb2xlYW47XG4gIHJldmVyc2U6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBDcm9wQW5kUmVzaXplID0gJ0Nyb3BBbmRSZXNpemUnO1xuZXhwb3J0IHR5cGUgQ3JvcEFuZFJlc2l6ZUlucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbWFnZSd8J2JveGVzJ3wnYm94SW5kJz47XG5leHBvcnQgaW50ZXJmYWNlIENyb3BBbmRSZXNpemVBdHRycyB7XG4gIGNyb3BTaXplOiBbbnVtYmVyLCBudW1iZXJdO1xuICBtZXRob2Q6ICdiaWxpbmVhcid8J25lYXJlc3QnO1xuICBleHRyYXBvbGF0aW9uVmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IERlbnNlQmluY291bnQgPSAnRGVuc2VCaW5jb3VudCc7XG5leHBvcnQgdHlwZSBEZW5zZUJpbmNvdW50SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4J3wnd2VpZ2h0cyc+O1xuZXhwb3J0IGludGVyZmFjZSBEZW5zZUJpbmNvdW50QXR0cnMge1xuICBzaXplOiBudW1iZXI7XG4gIGJpbmFyeU91dHB1dD86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBEZXB0aFRvU3BhY2UgPSAnRGVwdGhUb1NwYWNlJztcbmV4cG9ydCB0eXBlIERlcHRoVG9TcGFjZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBEZXB0aFRvU3BhY2VBdHRycyB7XG4gIGJsb2NrU2l6ZTogbnVtYmVyO1xuICBkYXRhRm9ybWF0OiAnTkhXQyd8J05DSFcnO1xufVxuXG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlID0gJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5leHBvcnQgdHlwZSBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBEZXB0aHdpc2VDb252MmROYXRpdmVBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmc7XG4gIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVyc7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCc7XG59XG5cbmV4cG9ydCBjb25zdCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciA9XG4gICAgJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyJztcbmV4cG9ydCB0eXBlIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVySW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdkeSc+O1xuZXhwb3J0IGludGVyZmFjZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckF0dHJzIHtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbiAgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xufVxuXG5leHBvcnQgY29uc3QgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCA9XG4gICAgJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQnO1xuZXhwb3J0IHR5cGUgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkeSd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnMge1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nO1xuICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnO1xuICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbn1cblxuZXhwb3J0IGNvbnN0IERpYWcgPSAnRGlhZyc7XG5leHBvcnQgdHlwZSBEaWFnSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEID0gJ0RpbGF0aW9uMkQnO1xuZXhwb3J0IHR5cGUgRGlsYXRpb24yRElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2ZpbHRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBEaWxhdGlvbjJEQXR0cnMge1xuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXI7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCA9ICdEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCc7XG5leHBvcnQgdHlwZSBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dElucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4J3wnZmlsdGVyJ3wnZHknPjtcblxuZXhwb3J0IGNvbnN0IERpbGF0aW9uMkRCYWNrcHJvcEZpbHRlciA9ICdEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXInO1xuZXhwb3J0IHR5cGUgRGlsYXRpb24yREJhY2twcm9wRmlsdGVySW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdmaWx0ZXInfCdkeSc+O1xuXG5leHBvcnQgY29uc3QgUmVhbERpdiA9ICdSZWFsRGl2JztcbmV4cG9ydCB0eXBlIFJlYWxEaXZJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBFaW5zdW0gPSAnRWluc3VtJztcbmV4cG9ydCB0eXBlIEVpbnN1bUlucHV0cyA9IFRlbnNvckluZm9bXTtcbmV4cG9ydCBpbnRlcmZhY2UgRWluc3VtQXR0cnMge1xuICBlcXVhdGlvbjogc3RyaW5nO1xufVxuXG5leHBvcnQgY29uc3QgRWx1ID0gJ0VsdSc7XG5leHBvcnQgdHlwZSBFbHVJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcblxuZXhwb3J0IGNvbnN0IEVsdUdyYWQgPSAnRWx1R3JhZCc7XG5leHBvcnQgdHlwZSBFbHVHcmFkSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkeSd8J3knPjtcblxuZXhwb3J0IGNvbnN0IEVyZiA9ICdFcmYnO1xuZXhwb3J0IHR5cGUgRXJmSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBFcXVhbCA9ICdFcXVhbCc7XG5leHBvcnQgdHlwZSBFcXVhbElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEV4cCA9ICdFeHAnO1xuZXhwb3J0IHR5cGUgRXhwSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBFeHBhbmREaW1zID0gJ0V4cGFuZERpbXMnO1xuZXhwb3J0IHR5cGUgRXhwYW5kRGltc0lucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW5wdXQnPjtcbmV4cG9ydCBpbnRlcmZhY2UgRXhwYW5kRGltc0F0dHJzIHtcbiAgZGltOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBFeHBtMSA9ICdFeHBtMSc7XG5leHBvcnQgdHlwZSBFeHBtMUlucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgRkZUID0gJ0ZGVCc7XG5leHBvcnQgdHlwZSBGRlRJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2lucHV0Jz47XG5cbmV4cG9ydCBjb25zdCBGaWxsID0gJ0ZpbGwnO1xuZXhwb3J0IGludGVyZmFjZSBGaWxsQXR0cnMge1xuICBzaGFwZTogbnVtYmVyW107XG4gIHZhbHVlOiBudW1iZXJ8c3RyaW5nO1xuICBkdHlwZTogRGF0YVR5cGU7XG59XG5cbmV4cG9ydCBjb25zdCBGbGlwTGVmdFJpZ2h0ID0gJ0ZsaXBMZWZ0UmlnaHQnO1xuZXhwb3J0IHR5cGUgRmxpcExlZnRSaWdodElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW1hZ2UnPjtcblxuZXhwb3J0IGNvbnN0IEZsb29yID0gJ0Zsb29yJztcbmV4cG9ydCB0eXBlIEZsb29ySW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBGbG9vckRpdiA9ICdGbG9vckRpdic7XG5leHBvcnQgdHlwZSBGbG9vckRpdklucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IEZ1c2VkQmF0Y2hOb3JtID0gJ0Z1c2VkQmF0Y2hOb3JtJztcbmV4cG9ydCB0eXBlIEZ1c2VkQmF0Y2hOb3JtSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdzY2FsZSd8J29mZnNldCd8J21lYW4nfCd2YXJpYW5jZSc+O1xuZXhwb3J0IGludGVyZmFjZSBGdXNlZEJhdGNoTm9ybUF0dHJzIHtcbiAgdmFyaWFuY2VFcHNpbG9uOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBHYXRoZXJWMiA9ICdHYXRoZXJWMic7XG5leHBvcnQgdHlwZSBHYXRoZXJWMklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCd8J2luZGljZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgR2F0aGVyVjJBdHRycyB7XG4gIGF4aXM6IG51bWJlcjtcbiAgYmF0Y2hEaW1zOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBHYXRoZXJOZCA9ICdHYXRoZXJOZCc7XG5leHBvcnQgdHlwZSBHYXRoZXJOZElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAncGFyYW1zJ3wnaW5kaWNlcyc+O1xuXG5leHBvcnQgY29uc3QgR3JlYXRlciA9ICdHcmVhdGVyJztcbmV4cG9ydCB0eXBlIEdyZWF0ZXJJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBHcmVhdGVyRXF1YWwgPSAnR3JlYXRlckVxdWFsJztcbmV4cG9ydCB0eXBlIEdyZWF0ZXJFcXVhbElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IElkZW50aXR5ID0gJ0lkZW50aXR5JztcbmV4cG9ydCB0eXBlIElkZW50aXR5SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBJRkZUID0gJ0lGRlQnO1xuZXhwb3J0IHR5cGUgSUZGVElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW5wdXQnPjtcblxuZXhwb3J0IGNvbnN0IEltYWcgPSAnSW1hZyc7XG5leHBvcnQgdHlwZSBJbWFnSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbnB1dCc+O1xuXG5leHBvcnQgY29uc3QgSXNGaW5pdGUgPSAnSXNGaW5pdGUnO1xuZXhwb3J0IHR5cGUgSXNGaW5pdGVJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IElzSW5mID0gJ0lzSW5mJztcbmV4cG9ydCB0eXBlIElzSW5mSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBJc05hbiA9ICdJc05hbic7XG5leHBvcnQgdHlwZSBJc05hbklucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgTGVha3lSZWx1ID0gJ0xlYWt5UmVsdSc7XG5leHBvcnQgdHlwZSBMZWFreVJlbHVJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTGVha3lSZWx1QXR0cnMge1xuICBhbHBoYTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgTGVzcyA9ICdMZXNzJztcbmV4cG9ydCB0eXBlIExlc3NJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBMZXNzRXF1YWwgPSAnTGVzc0VxdWFsJztcbmV4cG9ydCB0eXBlIExlc3NFcXVhbElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IExpblNwYWNlID0gJ0xpblNwYWNlJztcbmV4cG9ydCBpbnRlcmZhY2UgTGluU3BhY2VBdHRycyB7XG4gIHN0YXJ0OiBudW1iZXI7XG4gIHN0b3A6IG51bWJlcjtcbiAgbnVtOiBudW1iZXI7XG59XG5leHBvcnQgY29uc3QgTG9nID0gJ0xvZyc7XG5leHBvcnQgdHlwZSBMb2dJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IExvZzFwID0gJ0xvZzFwJztcbmV4cG9ydCB0eXBlIExvZzFwSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBMb2dpY2FsQW5kID0gJ0xvZ2ljYWxBbmQnO1xuZXhwb3J0IHR5cGUgTG9naWNhbEFuZElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IExvZ2ljYWxOb3QgPSAnTG9naWNhbE5vdCc7XG5leHBvcnQgdHlwZSBMb2dpY2FsTm90SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBMb2dpY2FsT3IgPSAnTG9naWNhbE9yJztcbmV4cG9ydCB0eXBlIExvZ2ljYWxPcklucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IExvZ2ljYWxYb3IgPSAnTG9naWNhbFhvcic7XG5leHBvcnQgdHlwZSBMb2dpY2FsWG9ySW5wdXRzID0gQmluYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgTG9nU29mdG1heCA9ICdMb2dTb2Z0bWF4JztcbmV4cG9ydCB0eXBlIExvZ1NvZnRtYXhJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2xvZ2l0cyc+O1xuZXhwb3J0IGludGVyZmFjZSBMb2dTb2Z0bWF4QXR0cnMge1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBMb3dlckJvdW5kID0gJ0xvd2VyQm91bmQnO1xuZXhwb3J0IHR5cGUgTG93ZXJCb3VuZElucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdzb3J0ZWRTZXF1ZW5jZSd8J3ZhbHVlcyc+O1xuXG5leHBvcnQgY29uc3QgTFJOID0gJ0xSTic7XG5leHBvcnQgdHlwZSBMUk5JbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTFJOQXR0cnMge1xuICBkZXB0aFJhZGl1czogbnVtYmVyO1xuICBiaWFzOiBudW1iZXI7XG4gIGFscGhhOiBudW1iZXI7XG4gIGJldGE6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IExSTkdyYWQgPSAnTFJOR3JhZCc7XG5leHBvcnQgdHlwZSBMUk5HcmFkSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4J3wneSd8J2R5Jz47XG5leHBvcnQgaW50ZXJmYWNlIExSTkdyYWRBdHRycyB7XG4gIGRlcHRoUmFkaXVzOiBudW1iZXI7XG4gIGJpYXM6IG51bWJlcjtcbiAgYWxwaGE6IG51bWJlcjtcbiAgYmV0YTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgTWF4ID0gJ01heCc7XG5leHBvcnQgdHlwZSBNYXhJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTWF4QXR0cnMge1xuICByZWR1Y3Rpb25JbmRpY2VzOiBudW1iZXJ8bnVtYmVyW107XG4gIGtlZXBEaW1zOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgTWF4aW11bSA9ICdNYXhpbXVtJztcbmV4cG9ydCB0eXBlIE1heGltdW1JbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBNYXhQb29sID0gJ01heFBvb2wnO1xuZXhwb3J0IHR5cGUgTWF4UG9vbElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBNYXhQb29sQXR0cnMge1xuICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbn1cblxuZXhwb3J0IGNvbnN0IE1heFBvb2xHcmFkID0gJ01heFBvb2xHcmFkJztcbmV4cG9ydCB0eXBlIE1heFBvb2xHcmFkSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkeSd8J2lucHV0J3wnb3V0cHV0Jz47XG5leHBvcnQgaW50ZXJmYWNlIE1heFBvb2xHcmFkQXR0cnMge1xuICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbn1cblxuZXhwb3J0IGNvbnN0IE1heFBvb2wzRCA9ICdNYXhQb29sM0QnO1xuZXhwb3J0IHR5cGUgTWF4UG9vbDNESW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIE1heFBvb2wzREF0dHJzIHtcbiAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXI7XG4gIGRhdGFGb3JtYXQ6ICdOREhXQyd8J05DREhXJztcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbn1cblxuZXhwb3J0IGNvbnN0IE1heFBvb2wzREdyYWQgPSAnTWF4UG9vbDNER3JhZCc7XG5leHBvcnQgdHlwZSBNYXhQb29sM0RHcmFkSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2R5J3wnaW5wdXQnfCdvdXRwdXQnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTWF4UG9vbDNER3JhZEF0dHJzIHtcbiAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCc7XG59XG5cbmV4cG9ydCBjb25zdCBNYXhQb29sV2l0aEFyZ21heCA9ICdNYXhQb29sV2l0aEFyZ21heCc7XG5leHBvcnQgdHlwZSBNYXhQb29sV2l0aEFyZ21heElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBNYXhQb29sV2l0aEFyZ21heEF0dHJzIHtcbiAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcjtcbiAgaW5jbHVkZUJhdGNoSW5JbmRleDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IE1lYW4gPSAnTWVhbic7XG5leHBvcnQgdHlwZSBNZWFuSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIE1lYW5BdHRycyB7XG4gIGF4aXM6IG51bWJlcnxudW1iZXJbXTtcbiAga2VlcERpbXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBNaW4gPSAnTWluJztcbmV4cG9ydCB0eXBlIE1pbklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBNaW5BdHRycyB7XG4gIGF4aXM6IG51bWJlcnxudW1iZXJbXTtcbiAga2VlcERpbXM6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjb25zdCBNaW5pbXVtID0gJ01pbmltdW0nO1xuZXhwb3J0IHR5cGUgTWluaW11bUlucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IE1pcnJvclBhZCA9ICdNaXJyb3JQYWQnO1xuZXhwb3J0IHR5cGUgTWlycm9yUGFkSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIE1pcnJvclBhZEF0dHJzIHtcbiAgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuICBtb2RlOiAncmVmbGVjdCd8J3N5bW1ldHJpYyc7XG59XG5cbmV4cG9ydCBjb25zdCBNb2QgPSAnTW9kJztcbmV4cG9ydCB0eXBlIE1vZElucHV0cyA9IEJpbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IE11bHRpbm9taWFsID0gJ011bHRpbm9taWFsJztcbmV4cG9ydCB0eXBlIE11bHRpbm9taWFsSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdsb2dpdHMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTXVsdGlub21pYWxBdHRycyB7XG4gIG51bVNhbXBsZXM6IG51bWJlcjtcbiAgc2VlZDogbnVtYmVyO1xuICBub3JtYWxpemVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgTXVsdGlwbHkgPSAnTXVsdGlwbHknO1xuZXhwb3J0IHR5cGUgTXVsdGlwbHlJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBOZWcgPSAnTmVnJztcbmV4cG9ydCB0eXBlIE5lZ0lucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgTm90RXF1YWwgPSAnTm90RXF1YWwnO1xuZXhwb3J0IHR5cGUgTm90RXF1YWxJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBOb25NYXhTdXBwcmVzc2lvblYzID0gJ05vbk1heFN1cHByZXNzaW9uVjMnO1xuZXhwb3J0IHR5cGUgTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdib3hlcyd8J3Njb3Jlcyc+O1xuZXhwb3J0IGludGVyZmFjZSBOb25NYXhTdXBwcmVzc2lvblYzQXR0cnMge1xuICBtYXhPdXRwdXRTaXplOiBudW1iZXI7XG4gIGlvdVRocmVzaG9sZDogbnVtYmVyO1xuICBzY29yZVRocmVzaG9sZDogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNCA9ICdOb25NYXhTdXBwcmVzc2lvblY0JztcbmV4cG9ydCB0eXBlIE5vbk1heFN1cHByZXNzaW9uVjRJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnYm94ZXMnfCdzY29yZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzIHtcbiAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyO1xuICBpb3VUaHJlc2hvbGQ6IG51bWJlcjtcbiAgc2NvcmVUaHJlc2hvbGQ6IG51bWJlcjtcbiAgcGFkVG9NYXhPdXRwdXRTaXplOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgTm9uTWF4U3VwcHJlc3Npb25WNSA9ICdOb25NYXhTdXBwcmVzc2lvblY1JztcbmV4cG9ydCB0eXBlIE5vbk1heFN1cHByZXNzaW9uVjVJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnYm94ZXMnfCdzY29yZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgTm9uTWF4U3VwcHJlc3Npb25WNUF0dHJzIHtcbiAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyO1xuICBpb3VUaHJlc2hvbGQ6IG51bWJlcjtcbiAgc2NvcmVUaHJlc2hvbGQ6IG51bWJlcjtcbiAgc29mdE5tc1NpZ21hOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBPbmVzTGlrZSA9ICdPbmVzTGlrZSc7XG5leHBvcnQgdHlwZSBPbmVzTGlrZUlucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgT25lSG90ID0gJ09uZUhvdCc7XG5leHBvcnQgdHlwZSBPbmVIb3RJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2luZGljZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgT25lSG90QXR0cnMge1xuICBkZXB0aDogbnVtYmVyO1xuICBvblZhbHVlOiBudW1iZXI7XG4gIG9mZlZhbHVlOiBudW1iZXI7XG4gIGR0eXBlOiBEYXRhVHlwZTtcbn1cblxuZXhwb3J0IGNvbnN0IFBhY2sgPSAnUGFjayc7XG5leHBvcnQgdHlwZSBQYWNrSW5wdXRzID0gVGVuc29ySW5mb1tdO1xuZXhwb3J0IGludGVyZmFjZSBQYWNrQXR0cnMge1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBQYWRWMiA9ICdQYWRWMic7XG5leHBvcnQgdHlwZSBQYWRWMklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBQYWRWMkF0dHJzIHtcbiAgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+O1xuICBjb25zdGFudFZhbHVlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBQb29sID0gJ1Bvb2wnO1xuZXhwb3J0IHR5cGUgUG9vbElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW5wdXQnPjtcblxuZXhwb3J0IGNvbnN0IFBvdyA9ICdQb3cnO1xuZXhwb3J0IHR5cGUgUG93SW5wdXRzID0gQmluYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgUHJlbHUgPSAnUHJlbHUnO1xuZXhwb3J0IHR5cGUgUHJlbHVJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdhbHBoYSc+O1xuXG5leHBvcnQgY29uc3QgUHJvZCA9ICdQcm9kJztcbmV4cG9ydCB0eXBlIFByb2RJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgUHJvZEF0dHJzIHtcbiAgYXhpczogbnVtYmVyfG51bWJlcltdO1xuICBrZWVwRGltczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IFJhZ2dlZEdhdGhlciA9ICdSYWdnZWRHYXRoZXInO1xuZXhwb3J0IHR5cGUgUmFnZ2VkR2F0aGVySW5wdXRzID0ge1xuICBwYXJhbXNOZXN0ZWRTcGxpdHM6IFRlbnNvckluZm9bXVxufSZQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3BhcmFtc0RlbnNlVmFsdWVzJ3wnaW5kaWNlcyc+O1xuZXhwb3J0IGludGVyZmFjZSBSYWdnZWRHYXRoZXJBdHRycyB7XG4gIG91dHB1dFJhZ2dlZFJhbms6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFJhZ2dlZFRlbnNvclRvVGVuc29yID0gJ1JhZ2dlZFRlbnNvclRvVGVuc29yJztcbmV4cG9ydCB0eXBlIFJhZ2dlZFRlbnNvclRvVGVuc29ySW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3NoYXBlJ3wndmFsdWVzJ3wnZGVmYXVsdFZhbHVlJz4mXG4gICAge3Jvd1BhcnRpdGlvblRlbnNvcnM6IFRlbnNvckluZm9bXX07XG5leHBvcnQgaW50ZXJmYWNlIFJhZ2dlZFRlbnNvclRvVGVuc29yQXR0cnMge1xuICByb3dQYXJ0aXRpb25UeXBlczogc3RyaW5nW107XG59XG5cbmV4cG9ydCBjb25zdCBSYW5nZSA9ICdSYW5nZSc7XG5leHBvcnQgaW50ZXJmYWNlIFJhbmdlQXR0cnMge1xuICBzdGFydDogbnVtYmVyO1xuICBzdG9wOiBudW1iZXI7XG4gIHN0ZXA6IG51bWJlcjtcbiAgZHR5cGU6ICdmbG9hdDMyJ3wnaW50MzInO1xufVxuXG5leHBvcnQgY29uc3QgUmVhbCA9ICdSZWFsJztcbmV4cG9ydCB0eXBlIFJlYWxJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2lucHV0Jz47XG5cbmV4cG9ydCBjb25zdCBSZWNpcHJvY2FsID0gJ1JlY2lwcm9jYWwnO1xuZXhwb3J0IHR5cGUgUmVjaXByb2NhbElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgUmVsdSA9ICdSZWx1JztcbmV4cG9ydCB0eXBlIFJlbHVJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcblxuZXhwb3J0IGNvbnN0IFJlc2hhcGUgPSAnUmVzaGFwZSc7XG5leHBvcnQgdHlwZSBSZXNoYXBlSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFJlc2hhcGVBdHRycyB7XG4gIHNoYXBlOiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNvbnN0IFJlc2l6ZU5lYXJlc3ROZWlnaGJvciA9ICdSZXNpemVOZWFyZXN0TmVpZ2hib3InO1xuZXhwb3J0IHR5cGUgUmVzaXplTmVhcmVzdE5laWdoYm9ySW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbWFnZXMnPjtcbmV4cG9ydCBpbnRlcmZhY2UgUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnMge1xuICBhbGlnbkNvcm5lcnM6IGJvb2xlYW47XG4gIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW47XG4gIHNpemU6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBjb25zdCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkID0gJ1Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQnO1xuZXhwb3J0IHR5cGUgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbWFnZXMnfCdkeSc+O1xuZXhwb3J0IHR5cGUgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZEF0dHJzID0gUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnM7XG5cbmV4cG9ydCBjb25zdCBSZXNpemVCaWxpbmVhciA9ICdSZXNpemVCaWxpbmVhcic7XG5leHBvcnQgdHlwZSBSZXNpemVCaWxpbmVhcklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW1hZ2VzJz47XG5leHBvcnQgaW50ZXJmYWNlIFJlc2l6ZUJpbGluZWFyQXR0cnMge1xuICBhbGlnbkNvcm5lcnM6IGJvb2xlYW47XG4gIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW47XG4gIHNpemU6IFtudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCBjb25zdCBSZXNpemVCaWxpbmVhckdyYWQgPSAnUmVzaXplQmlsaW5lYXJHcmFkJztcbmV4cG9ydCB0eXBlIFJlc2l6ZUJpbGluZWFyR3JhZElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW1hZ2VzJ3wnZHknPjtcbmV4cG9ydCB0eXBlIFJlc2l6ZUJpbGluZWFyR3JhZEF0dHJzID0gUmVzaXplQmlsaW5lYXJBdHRycztcblxuZXhwb3J0IGNvbnN0IFJlbHU2ID0gJ1JlbHU2JztcbmV4cG9ydCB0eXBlIFJlbHU2SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBSZXZlcnNlID0gJ1JldmVyc2UnO1xuZXhwb3J0IHR5cGUgUmV2ZXJzZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBSZXZlcnNlQXR0cnMge1xuICBkaW1zOiBudW1iZXJ8bnVtYmVyW107XG59XG5cbmV4cG9ydCBjb25zdCBSb3VuZCA9ICdSb3VuZCc7XG5leHBvcnQgdHlwZSBSb3VuZElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgUnNxcnQgPSAnUnNxcnQnO1xuZXhwb3J0IHR5cGUgUnNxcnRJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IFNjYXR0ZXJOZCA9ICdTY2F0dGVyTmQnO1xuZXhwb3J0IHR5cGUgU2NhdHRlck5kSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbmRpY2VzJ3wndXBkYXRlcyc+O1xuZXhwb3J0IGludGVyZmFjZSBTY2F0dGVyTmRBdHRycyB7XG4gIHNoYXBlOiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNvbnN0IFNlYXJjaFNvcnRlZCA9ICdTZWFyY2hTb3J0ZWQnO1xuZXhwb3J0IHR5cGUgU2VhcmNoU29ydGVkSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3NvcnRlZFNlcXVlbmNlJ3wndmFsdWVzJz47XG5leHBvcnQgaW50ZXJmYWNlIFNlYXJjaFNvcnRlZEF0dHJzIHtcbiAgc2lkZTogJ2xlZnQnfCdyaWdodCc7XG59XG5cbmV4cG9ydCBjb25zdCBTZWxlY3QgPSAnU2VsZWN0JztcbmV4cG9ydCB0eXBlIFNlbGVjdElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnY29uZGl0aW9uJ3wndCd8J2UnPjtcblxuZXhwb3J0IGNvbnN0IFNlbHUgPSAnU2VsdSc7XG5leHBvcnQgdHlwZSBTZWx1SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5cbmV4cG9ydCBjb25zdCBTbGljZSA9ICdTbGljZSc7XG5leHBvcnQgdHlwZSBTbGljZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBTbGljZUF0dHJzIHtcbiAgYmVnaW46IG51bWJlcnxudW1iZXJbXTtcbiAgc2l6ZTogbnVtYmVyfG51bWJlcltdO1xufVxuZXhwb3J0IGNvbnN0IFNpbiA9ICdTaW4nO1xuZXhwb3J0IHR5cGUgU2luSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBTaW5oID0gJ1NpbmgnO1xuZXhwb3J0IHR5cGUgU2luaElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgU2lnbiA9ICdTaWduJztcbmV4cG9ydCB0eXBlIFNpZ25JbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IFNpZ21vaWQgPSAnU2lnbW9pZCc7XG5leHBvcnQgdHlwZSBTaWdtb2lkSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBTb2Z0cGx1cyA9ICdTb2Z0cGx1cyc7XG5leHBvcnQgdHlwZSBTb2Z0cGx1c0lucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgU3FydCA9ICdTcXJ0JztcbmV4cG9ydCB0eXBlIFNxcnRJbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IFN1bSA9ICdTdW0nO1xuZXhwb3J0IHR5cGUgU3VtSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFN1bUF0dHJzIHtcbiAgYXhpczogbnVtYmVyfG51bWJlcltdO1xuICBrZWVwRGltczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IFNwYWNlVG9CYXRjaE5EID0gJ1NwYWNlVG9CYXRjaE5EJztcbmV4cG9ydCB0eXBlIFNwYWNlVG9CYXRjaE5ESW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFNwYWNlVG9CYXRjaE5EQXR0cnMge1xuICBibG9ja1NoYXBlOiBudW1iZXJbXTtcbiAgcGFkZGluZ3M6IG51bWJlcltdW107XG59XG5cbmV4cG9ydCBjb25zdCBTcGxpdFYgPSAnU3BsaXRWJztcbmV4cG9ydCB0eXBlIFNwbGl0VklucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBTcGxpdFZBdHRycyB7XG4gIG51bU9yU2l6ZVNwbGl0czogbnVtYmVyW118bnVtYmVyO1xuICBheGlzOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjb25zdCBTb2Z0bWF4ID0gJ1NvZnRtYXgnO1xuZXhwb3J0IHR5cGUgU29mdG1heElucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnbG9naXRzJz47XG5leHBvcnQgaW50ZXJmYWNlIFNvZnRtYXhBdHRycyB7XG4gIGRpbTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgU3BhcnNlRmlsbEVtcHR5Um93cyA9ICdTcGFyc2VGaWxsRW1wdHlSb3dzJztcbmV4cG9ydCB0eXBlIFNwYXJzZUZpbGxFbXB0eVJvd3NJbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnaW5kaWNlcyd8J3ZhbHVlcyd8J2RlbnNlU2hhcGUnfCdkZWZhdWx0VmFsdWUnPjtcblxuZXhwb3J0IGNvbnN0IFNwYXJzZVJlc2hhcGUgPSAnU3BhcnNlUmVzaGFwZSc7XG5leHBvcnQgdHlwZSBTcGFyc2VSZXNoYXBlSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2lucHV0SW5kaWNlcyd8J2lucHV0U2hhcGUnfCduZXdTaGFwZSc+O1xuXG5leHBvcnQgY29uc3QgU3BhcnNlU2VnbWVudE1lYW4gPSAnU3BhcnNlU2VnbWVudE1lYW4nO1xuZXhwb3J0IHR5cGUgU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMgPVxuICAgIFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAnZGF0YSd8J2luZGljZXMnfCdzZWdtZW50SWRzJz47XG5cbmV4cG9ydCBjb25zdCBTcGFyc2VTZWdtZW50U3VtID0gJ1NwYXJzZVNlZ21lbnRTdW0nO1xuZXhwb3J0IHR5cGUgU3BhcnNlU2VnbWVudFN1bUlucHV0cyA9XG4gICAgUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkYXRhJ3wnaW5kaWNlcyd8J3NlZ21lbnRJZHMnPjtcblxuZXhwb3J0IGNvbnN0IFNwYXJzZVRvRGVuc2UgPSAnU3BhcnNlVG9EZW5zZSc7XG5leHBvcnQgdHlwZSBTcGFyc2VUb0RlbnNlSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3NwYXJzZUluZGljZXMnfCdzcGFyc2VWYWx1ZXMnfCdkZWZhdWx0VmFsdWUnPjtcbmV4cG9ydCBpbnRlcmZhY2UgU3BhcnNlVG9EZW5zZUF0dHJzIHtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xufVxuXG5leHBvcnQgY29uc3QgU3F1YXJlZERpZmZlcmVuY2UgPSAnU3F1YXJlZERpZmZlcmVuY2UnO1xuZXhwb3J0IHR5cGUgU3F1YXJlZERpZmZlcmVuY2VJbnB1dHMgPSBCaW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBTcXVhcmUgPSAnU3F1YXJlJztcbmV4cG9ydCB0eXBlIFNxdWFyZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuXG5leHBvcnQgY29uc3QgU3RyaWRlZFNsaWNlID0gJ1N0cmlkZWRTbGljZSc7XG5leHBvcnQgdHlwZSBTdHJpZGVkU2xpY2VJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcbmV4cG9ydCBpbnRlcmZhY2UgU3RyaWRlZFNsaWNlQXR0cnMge1xuICBiZWdpbjogbnVtYmVyW107XG4gIGVuZDogbnVtYmVyW107XG4gIHN0cmlkZXM6IG51bWJlcltdO1xuICBiZWdpbk1hc2s6IG51bWJlcjtcbiAgZW5kTWFzazogbnVtYmVyO1xuICBlbGxpcHNpc01hc2s6IG51bWJlcjtcbiAgbmV3QXhpc01hc2s6IG51bWJlcjtcbiAgc2hyaW5rQXhpc01hc2s6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFN0cmluZ05HcmFtcyA9ICdTdHJpbmdOR3JhbXMnO1xuZXhwb3J0IHR5cGUgU3RyaW5nTkdyYW1zSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdkYXRhJ3wnZGF0YVNwbGl0cyc+O1xuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdOR3JhbXNBdHRycyB7XG4gIHNlcGFyYXRvcjogc3RyaW5nO1xuICBuR3JhbVdpZHRoczogbnVtYmVyW107XG4gIGxlZnRQYWQ6IHN0cmluZztcbiAgcmlnaHRQYWQ6IHN0cmluZztcbiAgcGFkV2lkdGg6IG51bWJlcjtcbiAgcHJlc2VydmVTaG9ydFNlcXVlbmNlczogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNvbnN0IFN0cmluZ1NwbGl0ID0gJ1N0cmluZ1NwbGl0JztcbmV4cG9ydCB0eXBlIFN0cmluZ1NwbGl0SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbnB1dCd8J2RlbGltaXRlcic+O1xuZXhwb3J0IGludGVyZmFjZSBTdHJpbmdTcGxpdEF0dHJzIHtcbiAgc2tpcEVtcHR5OiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCA9ICdTdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmV4cG9ydCB0eXBlIFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2lucHV0Jz47XG5leHBvcnQgaW50ZXJmYWNlIFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RBdHRycyB7XG4gIG51bUJ1Y2tldHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFN1YiA9ICdTdWInO1xuZXhwb3J0IHR5cGUgU3ViSW5wdXRzID0gQmluYXJ5SW5wdXRzO1xuXG5leHBvcnQgY29uc3QgVGFuID0gJ1Rhbic7XG5leHBvcnQgdHlwZSBUYW5JbnB1dHMgPSBVbmFyeUlucHV0cztcblxuZXhwb3J0IGNvbnN0IFRhbmggPSAnVGFuaCc7XG5leHBvcnQgdHlwZSBUYW5oSW5wdXRzID0gVW5hcnlJbnB1dHM7XG5cbmV4cG9ydCBjb25zdCBUaWxlID0gJ1RpbGUnO1xuZXhwb3J0IHR5cGUgVGlsZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBUaWxlQXR0cnMge1xuICByZXBzOiBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNvbnN0IFRvcEsgPSAnVG9wSyc7XG5leHBvcnQgdHlwZSBUb3BLSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFRvcEtBdHRycyB7XG4gIGs6IG51bWJlcjtcbiAgc29ydGVkOiBib29sZWFuO1xufVxuXG5leHBvcnQgY29uc3QgVHJhbnNmb3JtID0gJ1RyYW5zZm9ybSc7XG5leHBvcnQgdHlwZSBUcmFuc2Zvcm1JbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ2ltYWdlJ3wndHJhbnNmb3Jtcyc+O1xuZXhwb3J0IGludGVyZmFjZSBUcmFuc2Zvcm1BdHRycyB7XG4gIGludGVycG9sYXRpb246ICduZWFyZXN0J3wnYmlsaW5lYXInO1xuICBmaWxsTW9kZTogJ2NvbnN0YW50J3wncmVmbGVjdCd8J3dyYXAnfCduZWFyZXN0JztcbiAgZmlsbFZhbHVlOiBudW1iZXI7XG4gIG91dHB1dFNoYXBlPzogW251bWJlciwgbnVtYmVyXTtcbn1cblxuZXhwb3J0IGNvbnN0IFRyYW5zcG9zZSA9ICdUcmFuc3Bvc2UnO1xuZXhwb3J0IHR5cGUgVHJhbnNwb3NlSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd4Jz47XG5leHBvcnQgaW50ZXJmYWNlIFRyYW5zcG9zZUF0dHJzIHtcbiAgcGVybTogbnVtYmVyW107XG59XG5cbmV4cG9ydCBjb25zdCBVbmlxdWUgPSAnVW5pcXVlJztcbmV4cG9ydCB0eXBlIFVuaXF1ZUlucHV0cyA9IFBpY2s8TmFtZWRUZW5zb3JJbmZvTWFwLCAneCc+O1xuZXhwb3J0IGludGVyZmFjZSBVbmlxdWVBdHRycyB7XG4gIGF4aXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgVW5hcnlJbnB1dHMgPSBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnPjtcblxuZXhwb3J0IGNvbnN0IFVucGFjayA9ICdVbnBhY2snO1xuZXhwb3J0IHR5cGUgVW5wYWNrSW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICd2YWx1ZSc+O1xuZXhwb3J0IGludGVyZmFjZSBVbnBhY2tBdHRycyB7XG4gIGF4aXM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFVuc29ydGVkU2VnbWVudFN1bSA9ICdVbnNvcnRlZFNlZ21lbnRTdW0nO1xuZXhwb3J0IHR5cGUgVW5zb3J0ZWRTZWdtZW50U3VtSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3gnfCdzZWdtZW50SWRzJz47XG5leHBvcnQgaW50ZXJmYWNlIFVuc29ydGVkU2VnbWVudFN1bUF0dHJzIHtcbiAgbnVtU2VnbWVudHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFVwcGVyQm91bmQgPSAnVXBwZXJCb3VuZCc7XG5leHBvcnQgdHlwZSBVcHBlckJvdW5kSW5wdXRzID1cbiAgICBQaWNrPE5hbWVkVGVuc29ySW5mb01hcCwgJ3NvcnRlZFNlcXVlbmNlJ3wndmFsdWVzJz47XG5cbmV4cG9ydCBjb25zdCBaZXJvc0xpa2UgPSAnWmVyb3NMaWtlJztcbmV4cG9ydCB0eXBlIFplcm9zTGlrZUlucHV0cyA9IFVuYXJ5SW5wdXRzO1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMtb25seSBrZXJuZWxzXG4gKi9cbmV4cG9ydCBjb25zdCBTdGVwID0gJ1N0ZXAnO1xuZXhwb3J0IHR5cGUgU3RlcElucHV0cyA9IFVuYXJ5SW5wdXRzO1xuZXhwb3J0IGludGVyZmFjZSBTdGVwQXR0cnMge1xuICBhbHBoYTogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgRnJvbVBpeGVscyA9ICdGcm9tUGl4ZWxzJztcbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVBpeGVsc0lucHV0cyB7XG4gIHBpeGVsczogUGl4ZWxEYXRhfEltYWdlRGF0YXxIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fFxuICAgICAgSFRNTFZpZGVvRWxlbWVudHxJbWFnZUJpdG1hcDtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRnJvbVBpeGVsc0F0dHJzIHtcbiAgbnVtQ2hhbm5lbHM6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IFJvdGF0ZVdpdGhPZmZzZXQgPSAnUm90YXRlV2l0aE9mZnNldCc7XG5leHBvcnQgdHlwZSBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzID0gUGljazxOYW1lZFRlbnNvckluZm9NYXAsICdpbWFnZSc+O1xuZXhwb3J0IGludGVyZmFjZSBSb3RhdGVXaXRoT2Zmc2V0QXR0cnMge1xuICByYWRpYW5zOiBudW1iZXI7XG4gIGZpbGxWYWx1ZTogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgY2VudGVyOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXTtcbn1cblxuZXhwb3J0IGNvbnN0IF9GdXNlZE1hdE11bCA9ICdfRnVzZWRNYXRNdWwnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBjbGFzcy1uYW1lXG5leHBvcnQgaW50ZXJmYWNlIF9GdXNlZE1hdE11bElucHV0cyBleHRlbmRzIE5hbWVkVGVuc29ySW5mb01hcCB7XG4gIGE6IFRlbnNvckluZm87XG4gIGI6IFRlbnNvckluZm87XG4gIGJpYXM/OiBUZW5zb3JJbmZvO1xuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzPzogVGVuc29ySW5mbztcbn1cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogY2xhc3MtbmFtZVxuZXhwb3J0IGludGVyZmFjZSBfRnVzZWRNYXRNdWxBdHRycyB7XG4gIHRyYW5zcG9zZUE6IGJvb2xlYW47XG4gIHRyYW5zcG9zZUI6IGJvb2xlYW47XG4gIGFjdGl2YXRpb246IEFjdGl2YXRpb247XG4gIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY29uc3QgRnVzZWRDb252MkQgPSAnRnVzZWRDb252MkQnO1xuZXhwb3J0IGludGVyZmFjZSBGdXNlZENvbnYyRElucHV0cyBleHRlbmRzIE5hbWVkVGVuc29ySW5mb01hcCB7XG4gIHg6IFRlbnNvckluZm87XG4gIGZpbHRlcjogVGVuc29ySW5mbztcbiAgYmlhcz86IFRlbnNvckluZm87XG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHM/OiBUZW5zb3JJbmZvO1xufVxuZXhwb3J0IGludGVyZmFjZSBGdXNlZENvbnYyREF0dHJzIHtcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZztcbiAgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJztcbiAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcjtcbiAgZGltUm91bmRpbmdNb2RlOiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnO1xuICBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICBsZWFreXJlbHVBbHBoYT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNvbnN0IEZ1c2VkRGVwdGh3aXNlQ29udjJEID0gJ0Z1c2VkRGVwdGh3aXNlQ29udjJEJztcbmV4cG9ydCBpbnRlcmZhY2UgRnVzZWREZXB0aHdpc2VDb252MkRJbnB1dHMgZXh0ZW5kcyBOYW1lZFRlbnNvckluZm9NYXAge1xuICB4OiBUZW5zb3JJbmZvO1xuICBmaWx0ZXI6IFRlbnNvckluZm87XG4gIGJpYXM/OiBUZW5zb3JJbmZvO1xuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzPzogVGVuc29ySW5mbztcbn1cbmV4cG9ydCBpbnRlcmZhY2UgRnVzZWREZXB0aHdpc2VDb252MkRBdHRycyB7XG4gIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyO1xuICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmc7XG4gIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVyc7XG4gIGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyXXxudW1iZXI7XG4gIGRpbVJvdW5kaW5nTW9kZTogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJztcbiAgYWN0aXZhdGlvbjogQWN0aXZhdGlvbjtcbiAgbGVha3lyZWx1QWxwaGE/OiBudW1iZXI7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from './environment';\nexport function warn(...msg) {\n    if (!(env().getBool('IS_TEST') || env().getBool('PROD'))) {\n        console.warn(...msg);\n    }\n}\nexport function log(...msg) {\n    if (!(env().getBool('IS_TEST') || env().getBool('PROD'))) {\n        console.log(...msg);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9sb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUVsQyxNQUFNLFVBQVUsSUFBSSxDQUFDLEdBQUcsR0FBYztJQUNwQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUU7UUFDeEQsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ3RCO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxHQUFHLENBQUMsR0FBRyxHQUFjO0lBQ25DLElBQUksQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRTtRQUN4RCxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUM7S0FDckI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3YXJuKC4uLm1zZzogQXJyYXk8e30+KTogdm9pZCB7XG4gIGlmICghKGVudigpLmdldEJvb2woJ0lTX1RFU1QnKSB8fCBlbnYoKS5nZXRCb29sKCdQUk9EJykpKSB7XG4gICAgY29uc29sZS53YXJuKC4uLm1zZyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxvZyguLi5tc2c6IEFycmF5PHt9Pik6IHZvaWQge1xuICBpZiAoIShlbnYoKS5nZXRCb29sKCdJU19URVNUJykgfHwgZW52KCkuZ2V0Qm9vbCgnUFJPRCcpKSkge1xuICAgIGNvbnNvbGUubG9nKC4uLm1zZyk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from './environment';\nimport { getGlobal } from './global_util';\nimport * as log from './log';\nconst kernelRegistry = getGlobal('kernelRegistry', () => new Map());\nconst gradRegistry = getGlobal('gradRegistry', () => new Map());\n/**\n * Returns the kernel function (code) associated with the provided names.\n *\n * @param kernelName The official name of the kernel.\n * @param backendName The official name of the backend.\n */\nexport function getKernel(kernelName, backendName) {\n    const key = makeKey(kernelName, backendName);\n    return kernelRegistry.get(key);\n}\n/**\n * Returns the registered gradient info associated with the provided kernel.\n * @param kernelName The official TF kernel name.\n */\nexport function getGradient(kernelName) {\n    return gradRegistry.get(kernelName);\n}\nexport function getKernelsForBackend(backendName) {\n    const it = kernelRegistry.entries();\n    const result = [];\n    while (true) {\n        const { done, value } = it.next();\n        if (done) {\n            break;\n        }\n        const [key, config] = value;\n        const [backend,] = key.split('_');\n        if (backend === backendName) {\n            result.push(config);\n        }\n    }\n    return result;\n}\n/**\n * Registers the function (forward pass) for the kernel in a global registry.\n *\n * @param config A config object with the following properties:\n * - `kernelName` The official name of the kernel.\n * - `backendName` The official name of the backend.\n * - `kernelFunc` The function to run during the forward pass of the kernel.\n * - `setupFunc` Optional. Gets called once, after the backend initializes.\n * - `disposeFunc` Optional. Gets called once, right before the backend is\n * disposed.\n */\nexport function registerKernel(config) {\n    const { kernelName, backendName } = config;\n    const key = makeKey(kernelName, backendName);\n    if (kernelRegistry.has(key)) {\n        log.warn(`The kernel '${kernelName}' for backend ` +\n            `'${backendName}' is already registered`);\n    }\n    kernelRegistry.set(key, config);\n}\n/**\n * Registers a gradient function for a given kernel in the global registry,\n * to be used during the back-propagation of that kernel.\n *\n * @param config An object with the following properties:\n * - `kernelName` The name of the kernel that the gradient function is for.\n * - `gradFunc` The function to run during back-propagation.\n */\nexport function registerGradient(config) {\n    const { kernelName } = config;\n    if (gradRegistry.has(kernelName)) {\n        // TODO (yassogba) after 3.0 assess whether we need to keep this gated\n        // to debug mode.\n        if (env().getBool('DEBUG')) {\n            log.warn(`Overriding the gradient for '${kernelName}'`);\n        }\n    }\n    gradRegistry.set(kernelName, config);\n}\n/**\n * Removes the kernel function from the registry.\n *\n * @param kernelName The official name of the kernel.\n * @param backendName The official name of the backend.\n *\n */\nexport function unregisterKernel(kernelName, backendName) {\n    const key = makeKey(kernelName, backendName);\n    if (!kernelRegistry.has(key)) {\n        throw new Error(`The kernel '${kernelName}' for backend ` +\n            `'${backendName}' is not registered`);\n    }\n    kernelRegistry.delete(key);\n}\n/** Removes the registered gradient from the global registry. */\nexport function unregisterGradient(kernelName) {\n    if (!gradRegistry.has(kernelName)) {\n        throw new Error(`The gradient '${kernelName}' for backend is not registered`);\n    }\n    gradRegistry.delete(kernelName);\n}\n/**\n * Finds kernels that have already been registered to a backend and re-registers\n * them for a new backend. Useful for registering custom backends.\n * @param registeredBackendName Already registered backend.\n * @param newBackendName New backend.\n */\nexport function copyRegisteredKernels(registeredBackendName, newBackendName) {\n    const kernels = getKernelsForBackend(registeredBackendName);\n    kernels.forEach(kernelConfig => {\n        const newKernelConfig = Object.assign({}, kernelConfig, { backendName: newBackendName });\n        registerKernel(newKernelConfig);\n    });\n}\nfunction makeKey(kernelName, backendName) {\n    return `${backendName}_${kernelName}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VybmVsX3JlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9rZXJuZWxfcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sS0FBSyxHQUFHLE1BQU0sT0FBTyxDQUFDO0FBSzdCLE1BQU0sY0FBYyxHQUNoQixTQUFTLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLEVBQXdCLENBQUMsQ0FBQztBQUN2RSxNQUFNLFlBQVksR0FDZCxTQUFTLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksR0FBRyxFQUFzQixDQUFDLENBQUM7QUE4RG5FOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FDckIsVUFBa0IsRUFBRSxXQUFtQjtJQUN6QyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdDLE9BQU8sY0FBYyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNqQyxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FBQyxVQUFrQjtJQUM1QyxPQUFPLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdEMsQ0FBQztBQUVELE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxXQUFtQjtJQUN0RCxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDcEMsTUFBTSxNQUFNLEdBQW1CLEVBQUUsQ0FBQztJQUVsQyxPQUFPLElBQUksRUFBRTtRQUNYLE1BQU0sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLEdBQUcsRUFBRSxD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QU8sQ0FBQyxVQUFrQixFQUFFLFdBQW1CO0lBQ3RELE9BQU8sR0FBRyxXQUFXLElBQUksVUFBVSxFQUFFLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7ZW52fSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCAqIGFzIGxvZyBmcm9tICcuL2xvZyc7XG5pbXBvcnQge05hbWVkR3JhZGllbnRNYXB9IGZyb20gJy4vdGFwZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgUmVjdXJzaXZlQXJyYXl9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBrZXJuZWxSZWdpc3RyeSA9XG4gICAgZ2V0R2xvYmFsKCdrZXJuZWxSZWdpc3RyeScsICgpID0+IG5ldyBNYXA8c3RyaW5nLCBLZXJuZWxDb25maWc+KCkpO1xuY29uc3QgZ3JhZFJlZ2lzdHJ5ID1cbiAgICBnZXRHbG9iYWwoJ2dyYWRSZWdpc3RyeScsICgpID0+IG5ldyBNYXA8c3RyaW5nLCBHcmFkQ29uZmlnPigpKTtcblxuZXhwb3J0IHR5cGUgRGF0YUlkID0gb2JqZWN0O1xuXG50eXBlIEF0dHJpYnV0ZVZhbHVlID1cbiAgICBudW1iZXJ8bnVtYmVyW118Ym9vbGVhbnxib29sZWFuW118c3RyaW5nfHN0cmluZ1tdfE5hbWVkQXR0ck1hcDtcblxuLyoqIFRoZXNlIGFyZSBleHRyYSBub24tdGVuc29yL3ByaW1pdGl2ZSBwYXJhbXMgcGFzc2VkIHRvIGtlcm5lbCBmdW5jdGlvbnMuICovXG5leHBvcnQgdHlwZSBBdHRyaWJ1dGUgPSBBdHRyaWJ1dGVWYWx1ZXxSZWN1cnNpdmVBcnJheTxBdHRyaWJ1dGVWYWx1ZT47XG5cbi8qKiBTcGVjaWZpZXMgdGhlIGNvZGUgdG8gcnVuIHdoZW4gZXhlY3V0aW5nIGEga2VybmVsLiAqL1xuZXhwb3J0IHR5cGUgS2VybmVsRnVuYyA9IChwYXJhbXM6IHtcbiAgaW5wdXRzOiBOYW1lZFRlbnNvckluZm9NYXAsXG4gIGJhY2tlbmQ6IHt9LFxuICBhdHRycz86IE5hbWVkQXR0ck1hcCxcbn0pID0+IFRlbnNvckluZm98VGVuc29ySW5mb1tdO1xuXG4vKiogVGhlIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIGNvbXB1dGluZyBhIGdyYWRpZW50IGR1cmluZyBiYWNrcHJvcC4gKi9cbmV4cG9ydCB0eXBlIEdyYWRGdW5jID1cbiAgICAoZHk6IFRlbnNvcnxUZW5zb3JbXSwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PlxuICAgICAgICBOYW1lZEdyYWRpZW50TWFwO1xuXG4vKiogRnVuY3Rpb24gdGhhdCBnZXRzIGNhbGxlZCBhZnRlciB0aGUgYmFja2VuZCBpbml0aWFsaXplcy4gKi9cbmV4cG9ydCB0eXBlIEtlcm5lbFNldHVwRnVuYyA9IChiYWNrZW5kOiB7fSkgPT4gdm9pZDtcbi8qKiBGdW5jdGlvbiB0aGF0IGdldHMgY2FsbGVkIHJpZ2h0IGJlZm9yZSB0aGUgYmFja2VuZCBpcyBkaXNwb3NlZC4gKi9cbmV4cG9ydCB0eXBlIEtlcm5lbERpc3Bvc2VGdW5jID0gS2VybmVsU2V0dXBGdW5jO1xuXG4vKiogQ29uZmlnIG9iamVjdCBmb3IgcmVnaXN0ZXJpbmcgYSBrZXJuZWwgaW4gdGhlIGdsb2JhbCByZWdpc3RyeS4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgS2VybmVsQ29uZmlnIHtcbiAga2VybmVsTmFtZTogc3RyaW5nO1xuICBiYWNrZW5kTmFtZTogc3RyaW5nO1xuICBrZXJuZWxGdW5jOiBLZXJuZWxGdW5jO1xuICBzZXR1cEZ1bmM/OiBLZXJuZWxTZXR1cEZ1bmM7XG4gIGRpc3Bvc2VGdW5jPzogS2VybmVsRGlzcG9zZUZ1bmM7XG59XG5cbi8qKiBDb25maWcgb2JqZWN0IGZvciByZWdpc3RlcmluZyBhIGdyYWRpZW50IGluIHRoZSBnbG9iYWwgcmVnaXN0cnkuICovXG5leHBvcnQgaW50ZXJmYWNlIEdyYWRDb25maWcge1xuICBrZXJuZWxOYW1lOiBzdHJpbmc7XG4gIGlucHV0c1RvU2F2ZT86IHN0cmluZ1tdO1xuICAvLyBXaGVuIHNhdmVBbGxJbnB1dHMgaXMgdHJ1ZSwgYWxsIGlucHV0cyB3aWxsIGJlIHNhdmVkLiBPbmx5IHVzZSB0aGlzIGZsYWdcbiAgLy8gaWYgaW5wdXRzIGlzIGFuIGFycmF5IG9mIFRlbnNvcnMuXG4gIHNhdmVBbGxJbnB1dHM/OiBib29sZWFuO1xuICBvdXRwdXRzVG9TYXZlPzogYm9vbGVhbltdO1xuICBncmFkRnVuYzogR3JhZEZ1bmM7XG59XG5cbi8qKiBIb2xkcyBtZXRhZGF0YSBmb3IgYSBnaXZlbiB0ZW5zb3IuICovXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvckluZm8ge1xuICBkYXRhSWQ6IERhdGFJZDtcbiAgc2hhcGU6IG51bWJlcltdO1xuICBkdHlwZTogRGF0YVR5cGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTmFtZWRUZW5zb3JJbmZvTWFwIHtcbiAgW25hbWU6IHN0cmluZ106IFRlbnNvckluZm98dW5kZWZpbmVkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVkQXR0ck1hcCB7XG4gIFtuYW1lOiBzdHJpbmddOiBBdHRyaWJ1dGU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUga2VybmVsIGZ1bmN0aW9uIChjb2RlKSBhc3NvY2lhdGVkIHdpdGggdGhlIHByb3ZpZGVkIG5hbWVzLlxuICpcbiAqIEBwYXJhbSBrZXJuZWxOYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gYmFja2VuZE5hbWUgVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXJuZWwoXG4gICAga2VybmVsTmFtZTogc3RyaW5nLCBiYWNrZW5kTmFtZTogc3RyaW5nKTogS2VybmVsQ29uZmlnIHtcbiAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gIHJldHVybiBrZXJuZWxSZWdpc3RyeS5nZXQoa2V5KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZWdpc3RlcmVkIGdyYWRpZW50IGluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBwcm92aWRlZCBrZXJuZWwuXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgVEYga2VybmVsIG5hbWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRHcmFkaWVudChrZXJuZWxOYW1lOiBzdHJpbmcpOiBHcmFkQ29uZmlnIHtcbiAgcmV0dXJuIGdyYWRSZWdpc3RyeS5nZXQoa2VybmVsTmFtZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRLZXJuZWxzRm9yQmFja2VuZChiYWNrZW5kTmFtZTogc3RyaW5nKTogS2VybmVsQ29uZmlnW10ge1xuICBjb25zdCBpdCA9IGtlcm5lbFJlZ2lzdHJ5LmVudHJpZXMoKTtcbiAgY29uc3QgcmVzdWx0OiBLZXJuZWxDb25maWdbXSA9IFtdO1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgY29uc3Qge2RvbmUsIHZhbHVlfSA9IGl0Lm5leHQoKTtcbiAgICBpZiAoZG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNvbnN0IFtrZXksIGNvbmZpZ10gPSB2YWx1ZTtcbiAgICBjb25zdCBbYmFja2VuZCwgXSA9IGtleS5zcGxpdCgnXycpO1xuICAgIGlmIChiYWNrZW5kID09PSBiYWNrZW5kTmFtZSkge1xuICAgICAgcmVzdWx0LnB1c2goY29uZmlnKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSZWdpc3RlcnMgdGhlIGZ1bmN0aW9uIChmb3J3YXJkIHBhc3MpIGZvciB0aGUga2VybmVsIGluIGEgZ2xvYmFsIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBjb25maWcgQSBjb25maWcgb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBga2VybmVsTmFtZWAgVGhlIG9mZmljaWFsIG5hbWUgb2YgdGhlIGtlcm5lbC5cbiAqIC0gYGJhY2tlbmROYW1lYCBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUgYmFja2VuZC5cbiAqIC0gYGtlcm5lbEZ1bmNgIFRoZSBmdW5jdGlvbiB0byBydW4gZHVyaW5nIHRoZSBmb3J3YXJkIHBhc3Mgb2YgdGhlIGtlcm5lbC5cbiAqIC0gYHNldHVwRnVuY2AgT3B0aW9uYWwuIEdldHMgY2FsbGVkIG9uY2UsIGFmdGVyIHRoZSBiYWNrZW5kIGluaXRpYWxpemVzLlxuICogLSBgZGlzcG9zZUZ1bmNgIE9wdGlvbmFsLiBHZXRzIGNhbGxlZCBvbmNlLCByaWdodCBiZWZvcmUgdGhlIGJhY2tlbmQgaXNcbiAqIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVnaXN0ZXJLZXJuZWwoY29uZmlnOiBLZXJuZWxDb25maWcpIHtcbiAgY29uc3Qge2tlcm5lbE5hbWUsIGJhY2tlbmROYW1lfSA9IGNvbmZpZztcbiAgY29uc3Qga2V5ID0gbWFrZUtleShrZXJuZWxOYW1lLCBiYWNrZW5kTmFtZSk7XG4gIGlmIChrZXJuZWxSZWdpc3RyeS5oYXMoa2V5KSkge1xuICAgIGxvZy53YXJuKFxuICAgICAgICBgVGhlIGtlcm5lbCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgYCArXG4gICAgICAgIGAnJHtiYWNrZW5kTmFtZX0nIGlzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICB9XG4gIGtlcm5lbFJlZ2lzdHJ5LnNldChrZXksIGNvbmZpZyk7XG59XG5cbi8qKlxuICogUmVnaXN0ZXJzIGEgZ3JhZGllbnQgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4ga2VybmVsIGluIHRoZSBnbG9iYWwgcmVnaXN0cnksXG4gKiB0byBiZSB1c2VkIGR1cmluZyB0aGUgYmFjay1wcm9wYWdhdGlvbiBvZiB0aGF0IGtlcm5lbC5cbiAqXG4gKiBAcGFyYW0gY29uZmlnIEFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIC0gYGtlcm5lbE5hbWVgIFRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgdGhhdCB0aGUgZ3JhZGllbnQgZnVuY3Rpb24gaXMgZm9yLlxuICogLSBgZ3JhZEZ1bmNgIFRoZSBmdW5jdGlvbiB0byBydW4gZHVyaW5nIGJhY2stcHJvcGFnYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckdyYWRpZW50KGNvbmZpZzogR3JhZENvbmZpZykge1xuICBjb25zdCB7a2VybmVsTmFtZX0gPSBjb25maWc7XG5cbiAgaWYgKGdyYWRSZWdpc3RyeS5oYXMoa2VybmVsTmFtZSkpIHtcbiAgICAvLyBUT0RPICh5YXNzb2diYSkgYWZ0ZXIgMy4wIGFzc2VzcyB3aGV0aGVyIHdlIG5lZWQgdG8ga2VlcCB0aGlzIGdhdGVkXG4gICAgLy8gdG8gZGVidWcgbW9kZS5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgbG9nLndhcm4oYE92ZXJyaWRpbmcgdGhlIGdyYWRpZW50IGZvciAnJHtrZXJuZWxOYW1lfSdgKTtcbiAgICB9XG4gIH1cbiAgZ3JhZFJlZ2lzdHJ5LnNldChrZXJuZWxOYW1lLCBjb25maWcpO1xufVxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGtlcm5lbCBmdW5jdGlvbiBmcm9tIHRoZSByZWdpc3RyeS5cbiAqXG4gKiBAcGFyYW0ga2VybmVsTmFtZSBUaGUgb2ZmaWNpYWwgbmFtZSBvZiB0aGUga2VybmVsLlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBvZmZpY2lhbCBuYW1lIG9mIHRoZSBiYWNrZW5kLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVucmVnaXN0ZXJLZXJuZWwoXG4gICAga2VybmVsTmFtZTogc3RyaW5nLCBiYWNrZW5kTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGtleSA9IG1ha2VLZXkoa2VybmVsTmFtZSwgYmFja2VuZE5hbWUpO1xuICBpZiAoIWtlcm5lbFJlZ2lzdHJ5LmhhcyhrZXkpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIGtlcm5lbCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgYCArXG4gICAgICAgIGAnJHtiYWNrZW5kTmFtZX0nIGlzIG5vdCByZWdpc3RlcmVkYCk7XG4gIH1cbiAga2VybmVsUmVnaXN0cnkuZGVsZXRlKGtleSk7XG59XG5cbi8qKiBSZW1vdmVzIHRoZSByZWdpc3RlcmVkIGdyYWRpZW50IGZyb20gdGhlIGdsb2JhbCByZWdpc3RyeS4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bnJlZ2lzdGVyR3JhZGllbnQoa2VybmVsTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghZ3JhZFJlZ2lzdHJ5LmhhcyhrZXJuZWxOYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRoZSBncmFkaWVudCAnJHtrZXJuZWxOYW1lfScgZm9yIGJhY2tlbmQgaXMgbm90IHJlZ2lzdGVyZWRgKTtcbiAgfVxuICBncmFkUmVnaXN0cnkuZGVsZXRlKGtlcm5lbE5hbWUpO1xufVxuXG4vKipcbiAqIEZpbmRzIGtlcm5lbHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiByZWdpc3RlcmVkIHRvIGEgYmFja2VuZCBhbmQgcmUtcmVnaXN0ZXJzXG4gKiB0aGVtIGZvciBhIG5ldyBiYWNrZW5kLiBVc2VmdWwgZm9yIHJlZ2lzdGVyaW5nIGN1c3RvbSBiYWNrZW5kcy5cbiAqIEBwYXJhbSByZWdpc3RlcmVkQmFja2VuZE5hbWUgQWxyZWFkeSByZWdpc3RlcmVkIGJhY2tlbmQuXG4gKiBAcGFyYW0gbmV3QmFja2VuZE5hbWUgTmV3IGJhY2tlbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3B5UmVnaXN0ZXJlZEtlcm5lbHMoXG4gICAgcmVnaXN0ZXJlZEJhY2tlbmROYW1lOiBzdHJpbmcsIG5ld0JhY2tlbmROYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgY29uc3Qga2VybmVscyA9IGdldEtlcm5lbHNGb3JCYWNrZW5kKHJlZ2lzdGVyZWRCYWNrZW5kTmFtZSk7XG4gIGtlcm5lbHMuZm9yRWFjaChrZXJuZWxDb25maWcgPT4ge1xuICAgIGNvbnN0IG5ld0tlcm5lbENvbmZpZyA9XG4gICAgICAgIE9iamVjdC5hc3NpZ24oe30sIGtlcm5lbENvbmZpZywge2JhY2tlbmROYW1lOiBuZXdCYWNrZW5kTmFtZX0pO1xuICAgIHJlZ2lzdGVyS2VybmVsKG5ld0tlcm5lbENvbmZpZyk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBtYWtlS2V5KGtlcm5lbE5hbWU6IHN0cmluZywgYmFja2VuZE5hbWU6IHN0cmluZykge1xuICByZXR1cm4gYCR7YmFja2VuZE5hbWV9XyR7a2VybmVsTmFtZX1gO1xufVxuIl19","module.exports = Long;\r\n\r\n/**\r\n * wasm optimizations, to do native i64 multiplication and divide\r\n */\r\nvar wasm = null;\r\n\r\ntry {\r\n  wasm = new WebAssembly.Instance(new WebAssembly.Module(new Uint8Array([\r\n    0, 97, 115, 109, 1, 0, 0, 0, 1, 13, 2, 96, 0, 1, 127, 96, 4, 127, 127, 127, 127, 1, 127, 3, 7, 6, 0, 1, 1, 1, 1, 1, 6, 6, 1, 127, 1, 65, 0, 11, 7, 50, 6, 3, 109, 117, 108, 0, 1, 5, 100, 105, 118, 95, 115, 0, 2, 5, 100, 105, 118, 95, 117, 0, 3, 5, 114, 101, 109, 95, 115, 0, 4, 5, 114, 101, 109, 95, 117, 0, 5, 8, 103, 101, 116, 95, 104, 105, 103, 104, 0, 0, 10, 191, 1, 6, 4, 0, 35, 0, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 126, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 127, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 128, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 129, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11, 36, 1, 1, 126, 32, 0, 173, 32, 1, 173, 66, 32, 134, 132, 32, 2, 173, 32, 3, 173, 66, 32, 134, 132, 130, 34, 4, 66, 32, 135, 167, 36, 0, 32, 4, 167, 11\r\n  ])), {}).exports;\r\n} catch (e) {\r\n  // no wasm support :(\r\n}\r\n\r\n/**\r\n * Constructs a 64 bit two's-complement integer, given its low and high 32 bit values as *signed* integers.\r\n *  See the from* functions below for more convenient ways of constructing Longs.\r\n * @exports Long\r\n * @class A Long class for representing a 64 bit two's-complement integer value.\r\n * @param {number} low The low (signed) 32 bits of the long\r\n * @param {number} high The high (signed) 32 bits of the long\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @constructor\r\n */\r\nfunction Long(low, high, unsigned) {\r\n\r\n    /**\r\n     * The low 32 bits as a signed value.\r\n     * @type {number}\r\n     */\r\n    this.low = low | 0;\r\n\r\n    /**\r\n     * The high 32 bits as a signed value.\r\n     * @type {number}\r\n     */\r\n    this.high = high | 0;\r\n\r\n    /**\r\n     * Whether unsigned or not.\r\n     * @type {boolean}\r\n     */\r\n    this.unsigned = !!unsigned;\r\n}\r\n\r\n// The internal representation of a long is the two given signed, 32-bit values.\r\n// We use 32-bit pieces because these are the size of integers on which\r\n// Javascript performs bit-operations.  For operations like addition and\r\n// multiplication, we split each number into 16 bit pieces, which can easily be\r\n// multiplied within Javascript's floating-point representation without overflow\r\n// or change in sign.\r\n//\r\n// In the algorithms below, we frequently reduce the negative case to the\r\n// positive case by negating the input(s) and then post-processing the result.\r\n// Note that we must ALWAYS check specially whether those values are MIN_VALUE\r\n// (-2^63) because -MIN_VALUE == MIN_VALUE (since 2^63 cannot be represented as\r\n// a positive number, it overflows back into a negative).  Not handling this\r\n// case would often result in infinite recursion.\r\n//\r\n// Common constant values ZERO, ONE, NEG_ONE, etc. are defined below the from*\r\n// methods on which they depend.\r\n\r\n/**\r\n * An indicator used to reliably determine if an object is a Long or not.\r\n * @type {boolean}\r\n * @const\r\n * @private\r\n */\r\nLong.prototype.__isLong__;\r\n\r\nObject.defineProperty(Long.prototype, \"__isLong__\", { value: true });\r\n\r\n/**\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n * @inner\r\n */\r\nfunction isLong(obj) {\r\n    return (obj && obj[\"__isLong__\"]) === true;\r\n}\r\n\r\n/**\r\n * Tests if the specified object is a Long.\r\n * @function\r\n * @param {*} obj Object\r\n * @returns {boolean}\r\n */\r\nLong.isLong = isLong;\r\n\r\n/**\r\n * A cache of the Long representations of small integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar INT_CACHE = {};\r\n\r\n/**\r\n * A cache of the Long representations of small unsigned integer values.\r\n * @type {!Object}\r\n * @inner\r\n */\r\nvar UINT_CACHE = {};\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromInt(value, unsigned) {\r\n    var obj, cachedObj, cache;\r\n    if (unsigned) {\r\n        value >>>= 0;\r\n        if (cache = (0 <= value && value < 256)) {\r\n            cachedObj = UINT_CACHE[value];\r\n            if (cachedObj)\r\n                return cachedObj;\r\n        }\r\n        obj = fromBits(value, (value | 0) < 0 ? -1 : 0, true);\r\n        if (cache)\r\n            UINT_CACHE[value] = obj;\r\n        return obj;\r\n    } else {\r\n        value |= 0;\r\n        if (cache = (-128 <= value && value < 128)) {\r\n            cachedObj = INT_CACHE[value];\r\n            if (cachedObj)\r\n                return cachedObj;\r\n        }\r\n        obj = fromBits(value, value < 0 ? -1 : 0, false);\r\n        if (cache)\r\n            INT_CACHE[value] = obj;\r\n        return obj;\r\n    }\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given 32 bit integer value.\r\n * @function\r\n * @param {number} value The 32 bit integer in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromInt = fromInt;\r\n\r\n/**\r\n * @param {number} value\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromNumber(value, unsigned) {\r\n    if (isNaN(value))\r\n        return unsigned ? UZERO : ZERO;\r\n    if (unsigned) {\r\n        if (value < 0)\r\n            return UZERO;\r\n        if (value >= TWO_PWR_64_DBL)\r\n            return MAX_UNSIGNED_VALUE;\r\n    } else {\r\n        if (value <= -TWO_PWR_63_DBL)\r\n            return MIN_VALUE;\r\n        if (value + 1 >= TWO_PWR_63_DBL)\r\n            return MAX_VALUE;\r\n    }\r\n    if (value < 0)\r\n        return fromNumber(-value, unsigned).neg();\r\n    return fromBits((value % TWO_PWR_32_DBL) | 0, (value / TWO_PWR_32_DBL) | 0, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the given value, provided that it is a finite number. Otherwise, zero is returned.\r\n * @function\r\n * @param {number} value The number in question\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromNumber = fromNumber;\r\n\r\n/**\r\n * @param {number} lowBits\r\n * @param {number} highBits\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromBits(lowBits, highBits, unsigned) {\r\n    return new Long(lowBits, highBits, unsigned);\r\n}\r\n\r\n/**\r\n * Returns a Long representing the 64 bit integer that comes by concatenating the given low and high bits. Each is\r\n *  assumed to use 32 bits.\r\n * @function\r\n * @param {number} lowBits The low 32 bits\r\n * @param {number} highBits The high 32 bits\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromBits = fromBits;\r\n\r\n/**\r\n * @function\r\n * @param {number} base\r\n * @param {number} exponent\r\n * @returns {number}\r\n * @inner\r\n */\r\nvar pow_dbl = Math.pow; // Used 4 times (4*8 to 15+4)\r\n\r\n/**\r\n * @param {string} str\r\n * @param {(boolean|number)=} unsigned\r\n * @param {number=} radix\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromString(str, unsigned, radix) {\r\n    if (str.length === 0)\r\n        throw Error('empty string');\r\n    if (str === \"NaN\" || str === \"Infinity\" || str === \"+Infinity\" || str === \"-Infinity\")\r\n        return ZERO;\r\n    if (typeof unsigned === 'number') {\r\n        // For goog.math.long compatibility\r\n        radix = unsigned,\r\n        unsigned = false;\r\n    } else {\r\n        unsigned = !! unsigned;\r\n    }\r\n    radix = radix || 10;\r\n    if (radix < 2 || 36 < radix)\r\n        throw RangeError('radix');\r\n\r\n    var p;\r\n    if ((p = str.indexOf('-')) > 0)\r\n        throw Error('interior hyphen');\r\n    else if (p === 0) {\r\n        return fromString(str.substring(1), unsigned, radix).neg();\r\n    }\r\n\r\n    // Do several (8) digits each time through the loop, so as to\r\n    // minimize the calls to the very expensive emulated div.\r\n    var radixToPower = fromNumber(pow_dbl(radix, 8));\r\n\r\n    var result = ZERO;\r\n    for (var i = 0; i < str.length; i += 8) {\r\n        var size = Math.min(8, str.length - i),\r\n            value = parseInt(str.substring(i, i + size), radix);\r\n        if (size < 8) {\r\n            var power = fromNumber(pow_dbl(radix, size));\r\n            result = result.mul(power).add(fromNumber(value));\r\n        } else {\r\n            result = result.mul(radixToPower);\r\n            result = result.add(fromNumber(value));\r\n        }\r\n    }\r\n    result.unsigned = unsigned;\r\n    return result;\r\n}\r\n\r\n/**\r\n * Returns a Long representation of the given string, written using the specified radix.\r\n * @function\r\n * @param {string} str The textual representation of the Long\r\n * @param {(boolean|number)=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {number=} radix The radix in which the text is written (2-36), defaults to 10\r\n * @returns {!Long} The corresponding Long value\r\n */\r\nLong.fromString = fromString;\r\n\r\n/**\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val\r\n * @param {boolean=} unsigned\r\n * @returns {!Long}\r\n * @inner\r\n */\r\nfunction fromValue(val, unsigned) {\r\n    if (typeof val === 'number')\r\n        return fromNumber(val, unsigned);\r\n    if (typeof val === 'string')\r\n        return fromString(val, unsigned);\r\n    // Throws for non-objects, converts non-instanceof Long:\r\n    return fromBits(val.low, val.high, typeof unsigned === 'boolean' ? unsigned : val.unsigned);\r\n}\r\n\r\n/**\r\n * Converts the specified value to a Long using the appropriate from* function for its type.\r\n * @function\r\n * @param {!Long|number|string|!{low: number, high: number, unsigned: boolean}} val Value\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {!Long}\r\n */\r\nLong.fromValue = fromValue;\r\n\r\n// NOTE: the compiler should inline these constant values below and then remove these variables, so there should be\r\n// no runtime penalty for these.\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_16_DBL = 1 << 16;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24_DBL = 1 << 24;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_32_DBL = TWO_PWR_16_DBL * TWO_PWR_16_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_64_DBL = TWO_PWR_32_DBL * TWO_PWR_32_DBL;\r\n\r\n/**\r\n * @type {number}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_63_DBL = TWO_PWR_64_DBL / 2;\r\n\r\n/**\r\n * @type {!Long}\r\n * @const\r\n * @inner\r\n */\r\nvar TWO_PWR_24 = fromInt(TWO_PWR_24_DBL);\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ZERO = fromInt(0);\r\n\r\n/**\r\n * Signed zero.\r\n * @type {!Long}\r\n */\r\nLong.ZERO = ZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UZERO = fromInt(0, true);\r\n\r\n/**\r\n * Unsigned zero.\r\n * @type {!Long}\r\n */\r\nLong.UZERO = UZERO;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar ONE = fromInt(1);\r\n\r\n/**\r\n * Signed one.\r\n * @type {!Long}\r\n */\r\nLong.ONE = ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar UONE = fromInt(1, true);\r\n\r\n/**\r\n * Unsigned one.\r\n * @type {!Long}\r\n */\r\nLong.UONE = UONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar NEG_ONE = fromInt(-1);\r\n\r\n/**\r\n * Signed negative one.\r\n * @type {!Long}\r\n */\r\nLong.NEG_ONE = NEG_ONE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_VALUE = fromBits(0xFFFFFFFF|0, 0x7FFFFFFF|0, false);\r\n\r\n/**\r\n * Maximum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_VALUE = MAX_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MAX_UNSIGNED_VALUE = fromBits(0xFFFFFFFF|0, 0xFFFFFFFF|0, true);\r\n\r\n/**\r\n * Maximum unsigned value.\r\n * @type {!Long}\r\n */\r\nLong.MAX_UNSIGNED_VALUE = MAX_UNSIGNED_VALUE;\r\n\r\n/**\r\n * @type {!Long}\r\n * @inner\r\n */\r\nvar MIN_VALUE = fromBits(0, 0x80000000|0, false);\r\n\r\n/**\r\n * Minimum signed value.\r\n * @type {!Long}\r\n */\r\nLong.MIN_VALUE = MIN_VALUE;\r\n\r\n/**\r\n * @alias Long.prototype\r\n * @inner\r\n */\r\nvar LongPrototype = Long.prototype;\r\n\r\n/**\r\n * Converts the Long to a 32 bit integer, assuming it is a 32 bit integer.\r\n * @returns {number}\r\n */\r\nLongPrototype.toInt = function toInt() {\r\n    return this.unsigned ? this.low >>> 0 : this.low;\r\n};\r\n\r\n/**\r\n * Converts the Long to a the nearest floating-point representation of this value (double, 53 bit mantissa).\r\n * @returns {number}\r\n */\r\nLongPrototype.toNumber = function toNumber() {\r\n    if (this.unsigned)\r\n        return ((this.high >>> 0) * TWO_PWR_32_DBL) + (this.low >>> 0);\r\n    return this.high * TWO_PWR_32_DBL + (this.low >>> 0);\r\n};\r\n\r\n/**\r\n * Converts the Long to a string written in the specified radix.\r\n * @param {number=} radix Radix (2-36), defaults to 10\r\n * @returns {string}\r\n * @override\r\n * @throws {RangeError} If `radix` is out of range\r\n */\r\nLongPrototype.toString = function toString(radix) {\r\n    radix = radix || 10;\r\n    if (radix < 2 || 36 < radix)\r\n        throw RangeError('radix');\r\n    if (this.isZero())\r\n        return '0';\r\n    if (this.isNegative()) { // Unsigned Longs are never negative\r\n        if (this.eq(MIN_VALUE)) {\r\n            // We need to change the Long value before it can be negated, so we remove\r\n            // the bottom-most digit in this base and then recurse to do the rest.\r\n            var radixLong = fromNumber(radix),\r\n                div = this.div(radixLong),\r\n                rem1 = div.mul(radixLong).sub(this);\r\n            return div.toString(radix) + rem1.toInt().toString(radix);\r\n        } else\r\n            return '-' + this.neg().toString(radix);\r\n    }\r\n\r\n    // Do several (6) digits each time through the loop, so as to\r\n    // minimize the calls to the very expensive emulated div.\r\n    var radixToPower = fromNumber(pow_dbl(radix, 6), this.unsigned),\r\n        rem = this;\r\n    var result = '';\r\n    while (true) {\r\n        var remDiv = rem.div(radixToPower),\r\n            intval = rem.sub(remDiv.mul(radixToPower)).toInt() >>> 0,\r\n            digits = intval.toString(radix);\r\n        rem = remDiv;\r\n        if (rem.isZero())\r\n            return digits + result;\r\n        else {\r\n            while (digits.length < 6)\r\n                digits = '0' + digits;\r\n            result = '' + digits + result;\r\n        }\r\n    }\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as a signed integer.\r\n * @returns {number} Signed high bits\r\n */\r\nLongPrototype.getHighBits = function getHighBits() {\r\n    return this.high;\r\n};\r\n\r\n/**\r\n * Gets the high 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned high bits\r\n */\r\nLongPrototype.getHighBitsUnsigned = function getHighBitsUnsigned() {\r\n    return this.high >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as a signed integer.\r\n * @returns {number} Signed low bits\r\n */\r\nLongPrototype.getLowBits = function getLowBits() {\r\n    return this.low;\r\n};\r\n\r\n/**\r\n * Gets the low 32 bits as an unsigned integer.\r\n * @returns {number} Unsigned low bits\r\n */\r\nLongPrototype.getLowBitsUnsigned = function getLowBitsUnsigned() {\r\n    return this.low >>> 0;\r\n};\r\n\r\n/**\r\n * Gets the number of bits needed to represent the absolute value of this Long.\r\n * @returns {number}\r\n */\r\nLongPrototype.getNumBitsAbs = function getNumBitsAbs() {\r\n    if (this.isNegative()) // Unsigned Longs are never negative\r\n        return this.eq(MIN_VALUE) ? 64 : this.neg().getNumBitsAbs();\r\n    var val = this.high != 0 ? this.high : this.low;\r\n    for (var bit = 31; bit > 0; bit--)\r\n        if ((val & (1 << bit)) != 0)\r\n            break;\r\n    return this.high != 0 ? bit + 33 : bit + 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isZero = function isZero() {\r\n    return this.high === 0 && this.low === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals zero. This is an alias of {@link Long#isZero}.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eqz = LongPrototype.isZero;\r\n\r\n/**\r\n * Tests if this Long's value is negative.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isNegative = function isNegative() {\r\n    return !this.unsigned && this.high < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is positive.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isPositive = function isPositive() {\r\n    return this.unsigned || this.high >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is odd.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isOdd = function isOdd() {\r\n    return (this.low & 1) === 1;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is even.\r\n * @returns {boolean}\r\n */\r\nLongPrototype.isEven = function isEven() {\r\n    return (this.low & 1) === 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.equals = function equals(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    if (this.unsigned !== other.unsigned && (this.high >>> 31) === 1 && (other.high >>> 31) === 1)\r\n        return false;\r\n    return this.high === other.high && this.low === other.low;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value equals the specified's. This is an alias of {@link Long#equals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.eq = LongPrototype.equals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.notEquals = function notEquals(other) {\r\n    return !this.eq(/* validates */ other);\r\n};\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.neq = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value differs from the specified's. This is an alias of {@link Long#notEquals}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ne = LongPrototype.notEquals;\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThan = function lessThan(other) {\r\n    return this.comp(/* validates */ other) < 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than the specified's. This is an alias of {@link Long#lessThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lt = LongPrototype.lessThan;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lessThanOrEqual = function lessThanOrEqual(other) {\r\n    return this.comp(/* validates */ other) <= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.lte = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is less than or equal the specified's. This is an alias of {@link Long#lessThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.le = LongPrototype.lessThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThan = function greaterThan(other) {\r\n    return this.comp(/* validates */ other) > 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than the specified's. This is an alias of {@link Long#greaterThan}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gt = LongPrototype.greaterThan;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.greaterThanOrEqual = function greaterThanOrEqual(other) {\r\n    return this.comp(/* validates */ other) >= 0;\r\n};\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.gte = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Tests if this Long's value is greater than or equal the specified's. This is an alias of {@link Long#greaterThanOrEqual}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {boolean}\r\n */\r\nLongPrototype.ge = LongPrototype.greaterThanOrEqual;\r\n\r\n/**\r\n * Compares this Long's value with the specified's.\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n *  if the given one is greater\r\n */\r\nLongPrototype.compare = function compare(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    if (this.eq(other))\r\n        return 0;\r\n    var thisNeg = this.isNegative(),\r\n        otherNeg = other.isNegative();\r\n    if (thisNeg && !otherNeg)\r\n        return -1;\r\n    if (!thisNeg && otherNeg)\r\n        return 1;\r\n    // At this point the sign bits are the same\r\n    if (!this.unsigned)\r\n        return this.sub(other).isNegative() ? -1 : 1;\r\n    // Both are positive if at least one is unsigned\r\n    return (other.high >>> 0) > (this.high >>> 0) || (other.high === this.high && (other.low >>> 0) > (this.low >>> 0)) ? -1 : 1;\r\n};\r\n\r\n/**\r\n * Compares this Long's value with the specified's. This is an alias of {@link Long#compare}.\r\n * @function\r\n * @param {!Long|number|string} other Other value\r\n * @returns {number} 0 if they are the same, 1 if the this is greater and -1\r\n *  if the given one is greater\r\n */\r\nLongPrototype.comp = LongPrototype.compare;\r\n\r\n/**\r\n * Negates this Long's value.\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.negate = function negate() {\r\n    if (!this.unsigned && this.eq(MIN_VALUE))\r\n        return MIN_VALUE;\r\n    return this.not().add(ONE);\r\n};\r\n\r\n/**\r\n * Negates this Long's value. This is an alias of {@link Long#negate}.\r\n * @function\r\n * @returns {!Long} Negated Long\r\n */\r\nLongPrototype.neg = LongPrototype.negate;\r\n\r\n/**\r\n * Returns the sum of this and the specified Long.\r\n * @param {!Long|number|string} addend Addend\r\n * @returns {!Long} Sum\r\n */\r\nLongPrototype.add = function add(addend) {\r\n    if (!isLong(addend))\r\n        addend = fromValue(addend);\r\n\r\n    // Divide each number into 4 chunks of 16 bits, and then sum the chunks.\r\n\r\n    var a48 = this.high >>> 16;\r\n    var a32 = this.high & 0xFFFF;\r\n    var a16 = this.low >>> 16;\r\n    var a00 = this.low & 0xFFFF;\r\n\r\n    var b48 = addend.high >>> 16;\r\n    var b32 = addend.high & 0xFFFF;\r\n    var b16 = addend.low >>> 16;\r\n    var b00 = addend.low & 0xFFFF;\r\n\r\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n    c00 += a00 + b00;\r\n    c16 += c00 >>> 16;\r\n    c00 &= 0xFFFF;\r\n    c16 += a16 + b16;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c32 += a32 + b32;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c48 += a48 + b48;\r\n    c48 &= 0xFFFF;\r\n    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long.\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.subtract = function subtract(subtrahend) {\r\n    if (!isLong(subtrahend))\r\n        subtrahend = fromValue(subtrahend);\r\n    return this.add(subtrahend.neg());\r\n};\r\n\r\n/**\r\n * Returns the difference of this and the specified Long. This is an alias of {@link Long#subtract}.\r\n * @function\r\n * @param {!Long|number|string} subtrahend Subtrahend\r\n * @returns {!Long} Difference\r\n */\r\nLongPrototype.sub = LongPrototype.subtract;\r\n\r\n/**\r\n * Returns the product of this and the specified Long.\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.multiply = function multiply(multiplier) {\r\n    if (this.isZero())\r\n        return ZERO;\r\n    if (!isLong(multiplier))\r\n        multiplier = fromValue(multiplier);\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        var low = wasm.mul(this.low,\r\n                           this.high,\r\n                           multiplier.low,\r\n                           multiplier.high);\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    if (multiplier.isZero())\r\n        return ZERO;\r\n    if (this.eq(MIN_VALUE))\r\n        return multiplier.isOdd() ? MIN_VALUE : ZERO;\r\n    if (multiplier.eq(MIN_VALUE))\r\n        return this.isOdd() ? MIN_VALUE : ZERO;\r\n\r\n    if (this.isNegative()) {\r\n        if (multiplier.isNegative())\r\n            return this.neg().mul(multiplier.neg());\r\n        else\r\n            return this.neg().mul(multiplier).neg();\r\n    } else if (multiplier.isNegative())\r\n        return this.mul(multiplier.neg()).neg();\r\n\r\n    // If both longs are small, use float multiplication\r\n    if (this.lt(TWO_PWR_24) && multiplier.lt(TWO_PWR_24))\r\n        return fromNumber(this.toNumber() * multiplier.toNumber(), this.unsigned);\r\n\r\n    // Divide each long into 4 chunks of 16 bits, and then add up 4x4 products.\r\n    // We can skip products that would overflow.\r\n\r\n    var a48 = this.high >>> 16;\r\n    var a32 = this.high & 0xFFFF;\r\n    var a16 = this.low >>> 16;\r\n    var a00 = this.low & 0xFFFF;\r\n\r\n    var b48 = multiplier.high >>> 16;\r\n    var b32 = multiplier.high & 0xFFFF;\r\n    var b16 = multiplier.low >>> 16;\r\n    var b00 = multiplier.low & 0xFFFF;\r\n\r\n    var c48 = 0, c32 = 0, c16 = 0, c00 = 0;\r\n    c00 += a00 * b00;\r\n    c16 += c00 >>> 16;\r\n    c00 &= 0xFFFF;\r\n    c16 += a16 * b00;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c16 += a00 * b16;\r\n    c32 += c16 >>> 16;\r\n    c16 &= 0xFFFF;\r\n    c32 += a32 * b00;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c32 += a16 * b16;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c32 += a00 * b32;\r\n    c48 += c32 >>> 16;\r\n    c32 &= 0xFFFF;\r\n    c48 += a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48;\r\n    c48 &= 0xFFFF;\r\n    return fromBits((c16 << 16) | c00, (c48 << 16) | c32, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the product of this and the specified Long. This is an alias of {@link Long#multiply}.\r\n * @function\r\n * @param {!Long|number|string} multiplier Multiplier\r\n * @returns {!Long} Product\r\n */\r\nLongPrototype.mul = LongPrototype.multiply;\r\n\r\n/**\r\n * Returns this Long divided by the specified. The result is signed if this Long is signed or\r\n *  unsigned if this Long is unsigned.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.divide = function divide(divisor) {\r\n    if (!isLong(divisor))\r\n        divisor = fromValue(divisor);\r\n    if (divisor.isZero())\r\n        throw Error('division by zero');\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        // guard against signed division overflow: the largest\r\n        // negative number / -1 would be 1 larger than the largest\r\n        // positive number, due to two's complement.\r\n        if (!this.unsigned &&\r\n            this.high === -0x80000000 &&\r\n            divisor.low === -1 && divisor.high === -1) {\r\n            // be consistent with non-wasm code path\r\n            return this;\r\n        }\r\n        var low = (this.unsigned ? wasm.div_u : wasm.div_s)(\r\n            this.low,\r\n            this.high,\r\n            divisor.low,\r\n            divisor.high\r\n        );\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    if (this.isZero())\r\n        return this.unsigned ? UZERO : ZERO;\r\n    var approx, rem, res;\r\n    if (!this.unsigned) {\r\n        // This section is only relevant for signed longs and is derived from the\r\n        // closure library as a whole.\r\n        if (this.eq(MIN_VALUE)) {\r\n            if (divisor.eq(ONE) || divisor.eq(NEG_ONE))\r\n                return MIN_VALUE;  // recall that -MIN_VALUE == MIN_VALUE\r\n            else if (divisor.eq(MIN_VALUE))\r\n                return ONE;\r\n            else {\r\n                // At this point, we have |other| >= 2, so |this/other| < |MIN_VALUE|.\r\n                var halfThis = this.shr(1);\r\n                approx = halfThis.div(divisor).shl(1);\r\n                if (approx.eq(ZERO)) {\r\n                    return divisor.isNegative() ? ONE : NEG_ONE;\r\n                } else {\r\n                    rem = this.sub(divisor.mul(approx));\r\n                    res = approx.add(rem.div(divisor));\r\n                    return res;\r\n                }\r\n            }\r\n        } else if (divisor.eq(MIN_VALUE))\r\n            return this.unsigned ? UZERO : ZERO;\r\n        if (this.isNegative()) {\r\n            if (divisor.isNegative())\r\n                return this.neg().div(divisor.neg());\r\n            return this.neg().div(divisor).neg();\r\n        } else if (divisor.isNegative())\r\n            return this.div(divisor.neg()).neg();\r\n        res = ZERO;\r\n    } else {\r\n        // The algorithm below has not been made for unsigned longs. It's therefore\r\n        // required to take special care of the MSB prior to running it.\r\n        if (!divisor.unsigned)\r\n            divisor = divisor.toUnsigned();\r\n        if (divisor.gt(this))\r\n            return UZERO;\r\n        if (divisor.gt(this.shru(1))) // 15 >>> 1 = 7 ; with divisor = 8 ; true\r\n            return UONE;\r\n        res = UZERO;\r\n    }\r\n\r\n    // Repeat the following until the remainder is less than other:  find a\r\n    // floating-point that approximates remainder / other *from below*, add this\r\n    // into the result, and subtract it from the remainder.  It is critical that\r\n    // the approximate value is less than or equal to the real value so that the\r\n    // remainder never becomes negative.\r\n    rem = this;\r\n    while (rem.gte(divisor)) {\r\n        // Approximate the result of division. This may be a little greater or\r\n        // smaller than the actual value.\r\n        approx = Math.max(1, Math.floor(rem.toNumber() / divisor.toNumber()));\r\n\r\n        // We will tweak the approximate result by changing it in the 48-th digit or\r\n        // the smallest non-fractional digit, whichever is larger.\r\n        var log2 = Math.ceil(Math.log(approx) / Math.LN2),\r\n            delta = (log2 <= 48) ? 1 : pow_dbl(2, log2 - 48),\r\n\r\n        // Decrease the approximation until it is smaller than the remainder.  Note\r\n        // that if it is too large, the product overflows and is negative.\r\n            approxRes = fromNumber(approx),\r\n            approxRem = approxRes.mul(divisor);\r\n        while (approxRem.isNegative() || approxRem.gt(rem)) {\r\n            approx -= delta;\r\n            approxRes = fromNumber(approx, this.unsigned);\r\n            approxRem = approxRes.mul(divisor);\r\n        }\r\n\r\n        // We know the answer can't be zero... and actually, zero would cause\r\n        // infinite recursion since we would make no progress.\r\n        if (approxRes.isZero())\r\n            approxRes = ONE;\r\n\r\n        res = res.add(approxRes);\r\n        rem = rem.sub(approxRem);\r\n    }\r\n    return res;\r\n};\r\n\r\n/**\r\n * Returns this Long divided by the specified. This is an alias of {@link Long#divide}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Quotient\r\n */\r\nLongPrototype.div = LongPrototype.divide;\r\n\r\n/**\r\n * Returns this Long modulo the specified.\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.modulo = function modulo(divisor) {\r\n    if (!isLong(divisor))\r\n        divisor = fromValue(divisor);\r\n\r\n    // use wasm support if present\r\n    if (wasm) {\r\n        var low = (this.unsigned ? wasm.rem_u : wasm.rem_s)(\r\n            this.low,\r\n            this.high,\r\n            divisor.low,\r\n            divisor.high\r\n        );\r\n        return fromBits(low, wasm.get_high(), this.unsigned);\r\n    }\r\n\r\n    return this.sub(this.div(divisor).mul(divisor));\r\n};\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.mod = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns this Long modulo the specified. This is an alias of {@link Long#modulo}.\r\n * @function\r\n * @param {!Long|number|string} divisor Divisor\r\n * @returns {!Long} Remainder\r\n */\r\nLongPrototype.rem = LongPrototype.modulo;\r\n\r\n/**\r\n * Returns the bitwise NOT of this Long.\r\n * @returns {!Long}\r\n */\r\nLongPrototype.not = function not() {\r\n    return fromBits(~this.low, ~this.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise AND of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.and = function and(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low & other.low, this.high & other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise OR of this Long and the specified.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.or = function or(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low | other.low, this.high | other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns the bitwise XOR of this Long and the given one.\r\n * @param {!Long|number|string} other Other Long\r\n * @returns {!Long}\r\n */\r\nLongPrototype.xor = function xor(other) {\r\n    if (!isLong(other))\r\n        other = fromValue(other);\r\n    return fromBits(this.low ^ other.low, this.high ^ other.high, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftLeft = function shiftLeft(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    if ((numBits &= 63) === 0)\r\n        return this;\r\n    else if (numBits < 32)\r\n        return fromBits(this.low << numBits, (this.high << numBits) | (this.low >>> (32 - numBits)), this.unsigned);\r\n    else\r\n        return fromBits(0, this.low << (numBits - 32), this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits shifted to the left by the given amount. This is an alias of {@link Long#shiftLeft}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shl = LongPrototype.shiftLeft;\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRight = function shiftRight(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    if ((numBits &= 63) === 0)\r\n        return this;\r\n    else if (numBits < 32)\r\n        return fromBits((this.low >>> numBits) | (this.high << (32 - numBits)), this.high >> numBits, this.unsigned);\r\n    else\r\n        return fromBits(this.high >> (numBits - 32), this.high >= 0 ? 0 : -1, this.unsigned);\r\n};\r\n\r\n/**\r\n * Returns this Long with bits arithmetically shifted to the right by the given amount. This is an alias of {@link Long#shiftRight}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr = LongPrototype.shiftRight;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount.\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shiftRightUnsigned = function shiftRightUnsigned(numBits) {\r\n    if (isLong(numBits))\r\n        numBits = numBits.toInt();\r\n    numBits &= 63;\r\n    if (numBits === 0)\r\n        return this;\r\n    else {\r\n        var high = this.high;\r\n        if (numBits < 32) {\r\n            var low = this.low;\r\n            return fromBits((low >>> numBits) | (high << (32 - numBits)), high >>> numBits, this.unsigned);\r\n        } else if (numBits === 32)\r\n            return fromBits(high, 0, this.unsigned);\r\n        else\r\n            return fromBits(high >>> (numBits - 32), 0, this.unsigned);\r\n    }\r\n};\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shru = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Returns this Long with bits logically shifted to the right by the given amount. This is an alias of {@link Long#shiftRightUnsigned}.\r\n * @function\r\n * @param {number|!Long} numBits Number of bits\r\n * @returns {!Long} Shifted Long\r\n */\r\nLongPrototype.shr_u = LongPrototype.shiftRightUnsigned;\r\n\r\n/**\r\n * Converts this Long to signed.\r\n * @returns {!Long} Signed long\r\n */\r\nLongPrototype.toSigned = function toSigned() {\r\n    if (!this.unsigned)\r\n        return this;\r\n    return fromBits(this.low, this.high, false);\r\n};\r\n\r\n/**\r\n * Converts this Long to unsigned.\r\n * @returns {!Long} Unsigned long\r\n */\r\nLongPrototype.toUnsigned = function toUnsigned() {\r\n    if (this.unsigned)\r\n        return this;\r\n    return fromBits(this.low, this.high, true);\r\n};\r\n\r\n/**\r\n * Converts this Long to its byte representation.\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {!Array.<number>} Byte representation\r\n */\r\nLongPrototype.toBytes = function toBytes(le) {\r\n    return le ? this.toBytesLE() : this.toBytesBE();\r\n};\r\n\r\n/**\r\n * Converts this Long to its little endian byte representation.\r\n * @returns {!Array.<number>} Little endian byte representation\r\n */\r\nLongPrototype.toBytesLE = function toBytesLE() {\r\n    var hi = this.high,\r\n        lo = this.low;\r\n    return [\r\n        lo        & 0xff,\r\n        lo >>>  8 & 0xff,\r\n        lo >>> 16 & 0xff,\r\n        lo >>> 24       ,\r\n        hi        & 0xff,\r\n        hi >>>  8 & 0xff,\r\n        hi >>> 16 & 0xff,\r\n        hi >>> 24\r\n    ];\r\n};\r\n\r\n/**\r\n * Converts this Long to its big endian byte representation.\r\n * @returns {!Array.<number>} Big endian byte representation\r\n */\r\nLongPrototype.toBytesBE = function toBytesBE() {\r\n    var hi = this.high,\r\n        lo = this.low;\r\n    return [\r\n        hi >>> 24       ,\r\n        hi >>> 16 & 0xff,\r\n        hi >>>  8 & 0xff,\r\n        hi        & 0xff,\r\n        lo >>> 24       ,\r\n        lo >>> 16 & 0xff,\r\n        lo >>>  8 & 0xff,\r\n        lo        & 0xff\r\n    ];\r\n};\r\n\r\n/**\r\n * Creates a Long from its byte representation.\r\n * @param {!Array.<number>} bytes Byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @param {boolean=} le Whether little or big endian, defaults to big endian\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytes = function fromBytes(bytes, unsigned, le) {\r\n    return le ? Long.fromBytesLE(bytes, unsigned) : Long.fromBytesBE(bytes, unsigned);\r\n};\r\n\r\n/**\r\n * Creates a Long from its little endian byte representation.\r\n * @param {!Array.<number>} bytes Little endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesLE = function fromBytesLE(bytes, unsigned) {\r\n    return new Long(\r\n        bytes[0]       |\r\n        bytes[1] <<  8 |\r\n        bytes[2] << 16 |\r\n        bytes[3] << 24,\r\n        bytes[4]       |\r\n        bytes[5] <<  8 |\r\n        bytes[6] << 16 |\r\n        bytes[7] << 24,\r\n        unsigned\r\n    );\r\n};\r\n\r\n/**\r\n * Creates a Long from its big endian byte representation.\r\n * @param {!Array.<number>} bytes Big endian byte representation\r\n * @param {boolean=} unsigned Whether unsigned or not, defaults to signed\r\n * @returns {Long} The corresponding Long value\r\n */\r\nLong.fromBytesBE = function fromBytesBE(bytes, unsigned) {\r\n    return new Long(\r\n        bytes[4] << 24 |\r\n        bytes[5] << 16 |\r\n        bytes[6] <<  8 |\r\n        bytes[7],\r\n        bytes[0] << 24 |\r\n        bytes[1] << 16 |\r\n        bytes[2] <<  8 |\r\n        bytes[3],\r\n        unsigned\r\n    );\r\n};\r\n","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Workaround for allowing cjs module to be included in bundle created by\n// rollup.\nimport * as LongExports from 'long';\n// tslint:disable-next-line\nconst Long = \n// tslint:disable-next-line\nLongExports.default || LongExports;\nexport function hexToLong(hex) {\n    return Long.fromString(hex, true, 16);\n}\n// Some primes between 2^63 and 2^64 for various uses.\n// Hex 0xc3a5c85c97cb3127\nconst k0 = hexToLong('c3a5c85c97cb3127');\n// Hex 0xb492b66fbe98f273\nconst k1 = hexToLong('b492b66fbe98f273');\n// Hex 0x9ae16a3b2f90404f\nconst k2 = hexToLong('9ae16a3b2f90404f');\nfunction shiftMix(val) {\n    return val.xor(val.shru(47));\n}\nfunction fetch(s, offset, numBytes) {\n    const bytes = s.slice(offset, offset + numBytes);\n    return Long.fromBytes(Array.from(bytes), true, true);\n}\nfunction fetch64(s, offset) {\n    return fetch(s, offset, 8);\n}\nfunction fetch32(s, offset) {\n    return fetch(s, offset, 4);\n}\nfunction rotate64(val, shift) {\n    // Avoid shifting by 64: doing so yields an undefined result.\n    return shift === 0 ? val : val.shru(shift).or(val.shl(64 - shift));\n}\nfunction hashLen16(u, v, mul = hexToLong('9ddfea08eb382d69')) {\n    // Murmur-inspired hashing.\n    let a = u.xor(v).mul(mul);\n    a = a.xor(a.shru(47));\n    let b = v.xor(a).mul(mul);\n    b = b.xor(b.shru(47));\n    b = b.mul(mul);\n    return b;\n}\n// Return a 16-byte hash for 48 bytes.  Quick and dirty.\n// Callers do best to use \"random-looking\" values for a and b.\nfunction weakHashLen32WithSeeds(w, x, y, z, a, b) {\n    a = a.add(w);\n    b = rotate64(b.add(a).add(z), 21);\n    const c = a;\n    a = a.add(x);\n    a = a.add(y);\n    b = b.add(rotate64(a, 44));\n    return [a.add(z), b.add(c)];\n}\nfunction weakHashLen32WithSeedsStr(s, offset, a, b) {\n    return weakHashLen32WithSeeds(fetch64(s, offset), fetch64(s, offset + 8), fetch64(s, offset + 16), fetch64(s, offset + 24), a, b);\n}\nfunction hashLen0to16(s, len = s.length) {\n    if (len >= 8) {\n        const mul = k2.add(len * 2);\n        const a = fetch64(s, 0).add(k2);\n        const b = fetch64(s, len - 8);\n        const c = rotate64(b, 37).mul(mul).add(a);\n        const d = rotate64(a, 25).add(b).mul(mul);\n        return hashLen16(c, d, mul);\n    }\n    if (len >= 4) {\n        const mul = k2.add(len * 2);\n        const a = fetch32(s, 0);\n        return hashLen16(a.shl(3).add(len), fetch32(s, len - 4), mul);\n    }\n    if (len > 0) {\n        const a = s[0];\n        const b = s[len >> 1];\n        const c = s[len - 1];\n        const y = a + (b << 8);\n        const z = len + (c << 2);\n        return shiftMix(k2.mul(y).xor(k0.mul(z))).mul(k2);\n    }\n    return k2;\n}\nfunction hashLen17to32(s, len = s.length) {\n    const mul = k2.add(len * 2);\n    const a = fetch64(s, 0).mul(k1);\n    const b = fetch64(s, 8);\n    const c = fetch64(s, len - 8).mul(mul);\n    const d = fetch64(s, len - 16).mul(k2);\n    return hashLen16(rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d), a.add(rotate64(b.add(k2), 18)).add(c), mul);\n}\nfunction hashLen33to64(s, len = s.length) {\n    const mul = k2.add(len * 2);\n    const a = fetch64(s, 0).mul(k2);\n    const b = fetch64(s, 8);\n    const c = fetch64(s, len - 8).mul(mul);\n    const d = fetch64(s, len - 16).mul(k2);\n    const y = rotate64(a.add(b), 43).add(rotate64(c, 30)).add(d);\n    const z = hashLen16(y, a.add(rotate64(b.add(k2), 18)).add(c), mul);\n    const e = fetch64(s, 16).mul(mul);\n    const f = fetch64(s, 24);\n    const g = y.add(fetch64(s, len - 32)).mul(mul);\n    const h = z.add(fetch64(s, len - 24)).mul(mul);\n    return hashLen16(rotate64(e.add(f), 43).add(rotate64(g, 30)).add(h), e.add(rotate64(f.add(a), 18)).add(g), mul);\n}\nexport function fingerPrint64(s, len = s.length) {\n    const seed = Long.fromNumber(81, true);\n    if (len <= 32) {\n        if (len <= 16) {\n            return hashLen0to16(s, len);\n        }\n        else {\n            return hashLen17to32(s, len);\n        }\n    }\n    else if (len <= 64) {\n        return hashLen33to64(s, len);\n    }\n    // For strings over 64 bytes we loop.  Internal state consists of\n    // 56 bytes: v, w, x, y, and z.\n    let x = seed;\n    let y = seed.mul(k1).add(113);\n    let z = shiftMix(y.mul(k2).add(113)).mul(k2);\n    let v = [Long.UZERO, Long.UZERO];\n    let w = [Long.UZERO, Long.UZERO];\n    x = x.mul(k2).add(fetch64(s, 0));\n    let offset = 0;\n    // Set end so that after the loop we have 1 to 64 bytes left to process.\n    const end = ((len - 1) >> 6) * 64;\n    const last64 = end + ((len - 1) & 63) - 63;\n    do {\n        x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(k1);\n        y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(k1);\n        x = x.xor(w[1]);\n        y = y.add(v[0]).add(fetch64(s, offset + 40));\n        z = rotate64(z.add(w[0]), 33).mul(k1);\n        v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(k1), x.add(w[0]));\n        w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16)));\n        [z, x] = [x, z];\n        offset += 64;\n    } while (offset !== end);\n    const mul = k1.add(z.and(0xff).shl(1));\n    // Point to the last 64 bytes of input.\n    offset = last64;\n    w[0] = w[0].add((len - 1) & 63);\n    v[0] = v[0].add(w[0]);\n    w[0] = w[0].add(v[0]);\n    x = rotate64(x.add(y).add(v[0]).add(fetch64(s, offset + 8)), 37).mul(mul);\n    y = rotate64(y.add(v[1]).add(fetch64(s, offset + 48)), 42).mul(mul);\n    x = x.xor(w[1].mul(9));\n    y = y.add(v[0].mul(9).add(fetch64(s, offset + 40)));\n    z = rotate64(z.add(w[0]), 33).mul(mul);\n    v = weakHashLen32WithSeedsStr(s, offset, v[1].mul(mul), x.add(w[0]));\n    w = weakHashLen32WithSeedsStr(s, offset + 32, z.add(w[1]), y.add(fetch64(s, offset + 16)));\n    [z, x] = [x, z];\n    return hashLen16(hashLen16(v[0], w[0], mul).add(shiftMix(y).mul(k0)).add(z), hashLen16(v[1], w[1], mul).add(x), mul);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9oYXNoX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gseUVBQXlFO0FBQ3pFLFVBQVU7QUFDVixPQUFPLEtBQUssV0FBVyxNQUFNLE1BQU0sQ0FBQztBQUNwQywyQkFBMkI7QUFDM0IsTUFBTSxJQUFJO0FBQ04sMkJBQTJCO0FBQzFCLFdBQW1CLENBQUMsT0FBTyxJQUFJLFdBQVcsQ0FBQztBQUVoRCxNQUFNLFVBQVUsU0FBUyxDQUFDLEdBQVc7SUFDbkMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELHNEQUFzRDtBQUN0RCx5QkFBeUI7QUFDekIsTUFBTSxFQUFFLEdBQVMsU0FBUyxDQUFDLGtCQUFrQixDQUFDLENBQUM7QUFDL0MseUJBQXlCO0FBQ3pCLE1BQU0sRUFBRSxHQUFTLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQy9DLHlCQUF5QjtBQUN6QixNQUFNLEVBQUUsR0FBUyxTQUFTLENBQUMsa0JBQWtCLENBQUMsQ0FBQztBQUUvQyxTQUFTLFFBQVEsQ0FBQyxHQUFTO0lBQ3pCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELFNBQVMsS0FBSyxDQUFDLENBQWEsRUFBRSxNQUFjLEVBQUUsUUFBZ0I7SUFDNUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsTUFBTSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksRUFBRSxJ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QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDbEQsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNsRCxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUMsQ0FBYSxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsTUFBTTtJQUNsRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM1QixNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUNoQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ3hCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2QyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLEdBQUcsR0FBRyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkMsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0QsTUFBTSxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFD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QUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRTNDLEdBQUc7UUFDRCxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN6RSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ25FLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxHQUFHLHlCQUF5QixDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsQ0FBQyxHQUFHLHlCQUF5QixDQUN6QixDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hCLE1BQU0sSUFBSSxFQUFFLENBQUM7S0FDZCxRQUFRLE1BQU0sS0FBSyxHQUFHLEVBQUU7SUFDekIsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLHVDQUF1QztJQUN2QyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBRWhCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXRCLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzFFLENBQUMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxNQUFNLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDcEUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZDLENBQUMsR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsR0FBRyx5QkFBeUIsQ0FDekIsQ0FBQyxFQUFFLE1BQU0sR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsTUFBTSxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUVoQixPQUFPLFNBQVMsQ0FDWixTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDMUQsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXb3JrYXJvdW5kIGZvciBhbGxvd2luZyBjanMgbW9kdWxlIHRvIGJlIGluY2x1ZGVkIGluIGJ1bmRsZSBjcmVhdGVkIGJ5XG4vLyByb2xsdXAuXG5pbXBvcnQgKiBhcyBMb25nRXhwb3J0cyBmcm9tICdsb25nJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuY29uc3QgTG9uZzogTG9uZ0V4cG9ydHMuTG9uZ0NvbnN0cnVjdG9yID1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAoTG9uZ0V4cG9ydHMgYXMgYW55KS5kZWZhdWx0IHx8IExvbmdFeHBvcnRzO1xuXG5leHBvcnQgZnVuY3Rpb24gaGV4VG9Mb25nKGhleDogc3RyaW5nKTogTG9uZyB7XG4gIHJldHVybiBMb25nLmZyb21TdHJpbmcoaGV4LCB0cnVlLCAxNik7XG59XG5cbi8vIFNvbWUgcHJpbWVzIGJldHdlZW4gMl42MyBhbmQgMl42NCBmb3IgdmFyaW91cyB1c2VzLlxuLy8gSGV4IDB4YzNhNWM4NWM5N2NiMzEyN1xuY29uc3QgazA6IExvbmcgPSBoZXhUb0xvbmcoJ2MzYTVjODVjOTdjYjMxMjcnKTtcbi8vIEhleCAweGI0OTJiNjZmYmU5OGYyNzNcbmNvbnN0IGsxOiBMb25nID0gaGV4VG9Mb25nKCdiNDkyYjY2ZmJlOThmMjczJyk7XG4vLyBIZXggMHg5YWUxNmEzYjJmOTA0MDRmXG5jb25zdCBrMjogTG9uZyA9IGhleFRvTG9uZygnOWFlMTZhM2IyZjkwNDA0ZicpO1xuXG5mdW5jdGlvbiBzaGlmdE1peCh2YWw6IExvbmcpOiBMb25nIHtcbiAgcmV0dXJuIHZhbC54b3IodmFsLnNocnUoNDcpKTtcbn1cblxuZnVuY3Rpb24gZmV0Y2goczogVWludDhBcnJheSwgb2Zmc2V0OiBudW1iZXIsIG51bUJ5dGVzOiBudW1iZXIpOiBMb25nIHtcbiAgY29uc3QgYnl0ZXMgPSBzLnNsaWNlKG9mZnNldCwgb2Zmc2V0ICsgbnVtQnl0ZXMpO1xuICByZXR1cm4gTG9uZy5mcm9tQnl0ZXMoQXJyYXkuZnJvbShieXRlcyksIHRydWUsIHRydWUpO1xufVxuXG5mdW5jdGlvbiBmZXRjaDY0KHM6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyKTogTG9uZyB7XG4gIHJldHVybiBmZXRjaChzLCBvZmZzZXQsIDgpO1xufVxuXG5mdW5jdGlvbiBmZXRjaDMyKHM6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyKTogTG9uZyB7XG4gIHJldHVybiBmZXRjaChzLCBvZmZzZXQsIDQpO1xufVxuXG5mdW5jdGlvbiByb3RhdGU2NCh2YWw6IExvbmcsIHNoaWZ0OiBudW1iZXIpOiBMb25nIHtcbiAgLy8gQXZvaWQgc2hpZnRpbmcgYnkgNjQ6IGRvaW5nIHNvIHlpZWxkcyBhbiB1bmRlZmluZWQgcmVzdWx0LlxuICByZXR1cm4gc2hpZnQgPT09IDAgPyB2YWwgOiB2YWwuc2hydShzaGlmdCkub3IodmFsLnNobCg2NCAtIHNoaWZ0KSk7XG59XG5cbmZ1bmN0aW9uIGhhc2hMZW4xNih1OiBMb25nLCB2OiBMb25nLCBtdWwgPSBoZXhUb0xvbmcoJzlkZGZlYTA4ZWIzODJkNjknKSkge1xuICAvLyBNdXJtdXItaW5zcGlyZWQgaGFzaGluZy5cbiAgbGV0IGEgPSB1Lnhvcih2KS5tdWwobXVsKTtcbiAgYSA9IGEueG9yKGEuc2hydSg0NykpO1xuICBsZXQgYiA9IHYueG9yKGEpLm11bChtdWwpO1xuICBiID0gYi54b3IoYi5zaHJ1KDQ3KSk7XG4gIGIgPSBiLm11bChtdWwpO1xuICByZXR1cm4gYjtcbn1cblxuLy8gUmV0dXJuIGEgMTYtYnl0ZSBoYXNoIGZvciA0OCBieXRlcy4gIFF1aWNrIGFuZCBkaXJ0eS5cbi8vIENhbGxlcnMgZG8gYmVzdCB0byB1c2UgXCJyYW5kb20tbG9va2luZ1wiIHZhbHVlcyBmb3IgYSBhbmQgYi5cbmZ1bmN0aW9uIHdlYWtIYXNoTGVuMzJXaXRoU2VlZHMoXG4gICAgdzogTG9uZywgeDogTG9uZywgeTogTG9uZywgejogTG9uZywgYTogTG9uZywgYjogTG9uZykge1xuICBhID0gYS5hZGQodyk7XG4gIGIgPSByb3RhdGU2NChiLmFkZChhKS5hZGQoeiksIDIxKTtcbiAgY29uc3QgYyA9IGE7XG4gIGEgPSBhLmFkZCh4KTtcbiAgYSA9IGEuYWRkKHkpO1xuICBiID0gYi5hZGQocm90YXRlNjQoYSwgNDQpKTtcbiAgcmV0dXJuIFthLmFkZCh6KSwgYi5hZGQoYyldO1xufVxuXG5mdW5jdGlvbiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKFxuICAgIHM6IFVpbnQ4QXJyYXksIG9mZnNldDogbnVtYmVyLCBhOiBMb25nLCBiOiBMb25nKSB7XG4gIHJldHVybiB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzKFxuICAgICAgZmV0Y2g2NChzLCBvZmZzZXQpLCBmZXRjaDY0KHMsIG9mZnNldCArIDgpLCBmZXRjaDY0KHMsIG9mZnNldCArIDE2KSxcbiAgICAgIGZldGNoNjQocywgb2Zmc2V0ICsgMjQpLCBhLCBiKTtcbn1cblxuZnVuY3Rpb24gaGFzaExlbjB0bzE2KHM6IFVpbnQ4QXJyYXksIGxlbiA9IHMubGVuZ3RoKTogTG9uZyB7XG4gIGlmIChsZW4gPj0gOCkge1xuICAgIGNvbnN0IG11bCA9IGsyLmFkZChsZW4gKiAyKTtcbiAgICBjb25zdCBhID0gZmV0Y2g2NChzLCAwKS5hZGQoazIpO1xuICAgIGNvbnN0IGIgPSBmZXRjaDY0KHMsIGxlbiAtIDgpO1xuICAgIGNvbnN0IGMgPSByb3RhdGU2NChiLCAzNykubXVsKG11bCkuYWRkKGEpO1xuICAgIGNvbnN0IGQgPSByb3RhdGU2NChhLCAyNSkuYWRkKGIpLm11bChtdWwpO1xuICAgIHJldHVybiBoYXNoTGVuMTYoYywgZCwgbXVsKTtcbiAgfVxuICBpZiAobGVuID49IDQpIHtcbiAgICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gICAgY29uc3QgYSA9IGZldGNoMzIocywgMCk7XG4gICAgcmV0dXJuIGhhc2hMZW4xNihhLnNobCgzKS5hZGQobGVuKSwgZmV0Y2gzMihzLCBsZW4gLSA0KSwgbXVsKTtcbiAgfVxuICBpZiAobGVuID4gMCkge1xuICAgIGNvbnN0IGEgPSBzWzBdO1xuICAgIGNvbnN0IGIgPSBzW2xlbiA+PiAxXTtcbiAgICBjb25zdCBjID0gc1tsZW4gLSAxXTtcbiAgICBjb25zdCB5ID0gYSArIChiIDw8IDgpO1xuICAgIGNvbnN0IHogPSBsZW4gKyAoYyA8PCAyKTtcbiAgICByZXR1cm4gc2hpZnRNaXgoazIubXVsKHkpLnhvcihrMC5tdWwoeikpKS5tdWwoazIpO1xuICB9XG4gIHJldHVybiBrMjtcbn1cblxuZnVuY3Rpb24gaGFzaExlbjE3dG8zMihzOiBVaW50OEFycmF5LCBsZW4gPSBzLmxlbmd0aCk6IExvbmcge1xuICBjb25zdCBtdWwgPSBrMi5hZGQobGVuICogMik7XG4gIGNvbnN0IGEgPSBmZXRjaDY0KHMsIDApLm11bChrMSk7XG4gIGNvbnN0IGIgPSBmZXRjaDY0KHMsIDgpO1xuICBjb25zdCBjID0gZmV0Y2g2NChzLCBsZW4gLSA4KS5tdWwobXVsKTtcbiAgY29uc3QgZCA9IGZldGNoNjQocywgbGVuIC0gMTYpLm11bChrMik7XG4gIHJldHVybiBoYXNoTGVuMTYoXG4gICAgICByb3RhdGU2NChhLmFkZChiKSwgNDMpLmFkZChyb3RhdGU2NChjLCAzMCkpLmFkZChkKSxcbiAgICAgIGEuYWRkKHJvdGF0ZTY0KGIuYWRkKGsyKSwgMTgpKS5hZGQoYyksIG11bCk7XG59XG5cbmZ1bmN0aW9uIGhhc2hMZW4zM3RvNjQoczogVWludDhBcnJheSwgbGVuID0gcy5sZW5ndGgpOiBMb25nIHtcbiAgY29uc3QgbXVsID0gazIuYWRkKGxlbiAqIDIpO1xuICBjb25zdCBhID0gZmV0Y2g2NChzLCAwKS5tdWwoazIpO1xuICBjb25zdCBiID0gZmV0Y2g2NChzLCA4KTtcbiAgY29uc3QgYyA9IGZldGNoNjQocywgbGVuIC0gOCkubXVsKG11bCk7XG4gIGNvbnN0IGQgPSBmZXRjaDY0KHMsIGxlbiAtIDE2KS5tdWwoazIpO1xuICBjb25zdCB5ID0gcm90YXRlNjQoYS5hZGQoYiksIDQzKS5hZGQocm90YXRlNjQoYywgMzApKS5hZGQoZCk7XG4gIGNvbnN0IHogPSBoYXNoTGVuMTYoeSwgYS5hZGQocm90YXRlNjQoYi5hZGQoazIpLCAxOCkpLmFkZChjKSwgbXVsKTtcbiAgY29uc3QgZSA9IGZldGNoNjQocywgMTYpLm11bChtdWwpO1xuICBjb25zdCBmID0gZmV0Y2g2NChzLCAyNCk7XG4gIGNvbnN0IGcgPSB5LmFkZChmZXRjaDY0KHMsIGxlbiAtIDMyKSkubXVsKG11bCk7XG4gIGNvbnN0IGggPSB6LmFkZChmZXRjaDY0KHMsIGxlbiAtIDI0KSkubXVsKG11bCk7XG4gIHJldHVybiBoYXNoTGVuMTYoXG4gICAgICByb3RhdGU2NChlLmFkZChmKSwgNDMpLmFkZChyb3RhdGU2NChnLCAzMCkpLmFkZChoKSxcbiAgICAgIGUuYWRkKHJvdGF0ZTY0KGYuYWRkKGEpLCAxOCkpLmFkZChnKSwgbXVsKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmdlclByaW50NjQoczogVWludDhBcnJheSwgbGVuID0gcy5sZW5ndGgpOiBMb25nIHtcbiAgY29uc3Qgc2VlZDogTG9uZyA9IExvbmcuZnJvbU51bWJlcig4MSwgdHJ1ZSk7XG4gIGlmIChsZW4gPD0gMzIpIHtcbiAgICBpZiAobGVuIDw9IDE2KSB7XG4gICAgICByZXR1cm4gaGFzaExlbjB0bzE2KHMsIGxlbik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBoYXNoTGVuMTd0bzMyKHMsIGxlbik7XG4gICAgfVxuICB9IGVsc2UgaWYgKGxlbiA8PSA2NCkge1xuICAgIHJldHVybiBoYXNoTGVuMzN0bzY0KHMsIGxlbik7XG4gIH1cblxuICAvLyBGb3Igc3RyaW5ncyBvdmVyIDY0IGJ5dGVzIHdlIGxvb3AuICBJbnRlcm5hbCBzdGF0ZSBjb25zaXN0cyBvZlxuICAvLyA1NiBieXRlczogdiwgdywgeCwgeSwgYW5kIHouXG4gIGxldCB4ID0gc2VlZDtcbiAgbGV0IHkgPSBzZWVkLm11bChrMSkuYWRkKDExMyk7XG5cbiAgbGV0IHogPSBzaGlmdE1peCh5Lm11bChrMikuYWRkKDExMykpLm11bChrMik7XG4gIGxldCB2ID0gW0xvbmcuVVpFUk8sIExvbmcuVVpFUk9dO1xuICBsZXQgdyA9IFtMb25nLlVaRVJPLCBMb25nLlVaRVJPXTtcbiAgeCA9IHgubXVsKGsyKS5hZGQoZmV0Y2g2NChzLCAwKSk7XG5cbiAgbGV0IG9mZnNldCA9IDA7XG4gIC8vIFNldCBlbmQgc28gdGhhdCBhZnRlciB0aGUgbG9vcCB3ZSBoYXZlIDEgdG8gNjQgYnl0ZXMgbGVmdCB0byBwcm9jZXNzLlxuICBjb25zdCBlbmQgPSAoKGxlbiAtIDEpID4+IDYpICogNjQ7XG4gIGNvbnN0IGxhc3Q2NCA9IGVuZCArICgobGVuIC0gMSkgJiA2MykgLSA2MztcblxuICBkbyB7XG4gICAgeCA9IHJvdGF0ZTY0KHguYWRkKHkpLmFkZCh2WzBdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA4KSksIDM3KS5tdWwoazEpO1xuICAgIHkgPSByb3RhdGU2NCh5LmFkZCh2WzFdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA0OCkpLCA0MikubXVsKGsxKTtcbiAgICB4ID0geC54b3Iod1sxXSk7XG4gICAgeSA9IHkuYWRkKHZbMF0pLmFkZChmZXRjaDY0KHMsIG9mZnNldCArIDQwKSk7XG4gICAgeiA9IHJvdGF0ZTY0KHouYWRkKHdbMF0pLCAzMykubXVsKGsxKTtcbiAgICB2ID0gd2Vha0hhc2hMZW4zMldpdGhTZWVkc1N0cihzLCBvZmZzZXQsIHZbMV0ubXVsKGsxKSwgeC5hZGQod1swXSkpO1xuICAgIHcgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKFxuICAgICAgICBzLCBvZmZzZXQgKyAzMiwgei5hZGQod1sxXSksIHkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgMTYpKSk7XG5cbiAgICBbeiwgeF0gPSBbeCwgel07XG4gICAgb2Zmc2V0ICs9IDY0O1xuICB9IHdoaWxlIChvZmZzZXQgIT09IGVuZCk7XG4gIGNvbnN0IG11bCA9IGsxLmFkZCh6LmFuZCgweGZmKS5zaGwoMSkpO1xuICAvLyBQb2ludCB0byB0aGUgbGFzdCA2NCBieXRlcyBvZiBpbnB1dC5cbiAgb2Zmc2V0ID0gbGFzdDY0O1xuXG4gIHdbMF0gPSB3WzBdLmFkZCgobGVuIC0gMSkgJiA2Myk7XG4gIHZbMF0gPSB2WzBdLmFkZCh3WzBdKTtcbiAgd1swXSA9IHdbMF0uYWRkKHZbMF0pO1xuXG4gIHggPSByb3RhdGU2NCh4LmFkZCh5KS5hZGQodlswXSkuYWRkKGZldGNoNjQocywgb2Zmc2V0ICsgOCkpLCAzNykubXVsKG11bCk7XG4gIHkgPSByb3RhdGU2NCh5LmFkZCh2WzFdKS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA0OCkpLCA0MikubXVsKG11bCk7XG4gIHggPSB4Lnhvcih3WzFdLm11bCg5KSk7XG4gIHkgPSB5LmFkZCh2WzBdLm11bCg5KS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyA0MCkpKTtcbiAgeiA9IHJvdGF0ZTY0KHouYWRkKHdbMF0pLCAzMykubXVsKG11bCk7XG4gIHYgPSB3ZWFrSGFzaExlbjMyV2l0aFNlZWRzU3RyKHMsIG9mZnNldCwgdlsxXS5tdWwobXVsKSwgeC5hZGQod1swXSkpO1xuICB3ID0gd2Vha0hhc2hMZW4zMldpdGhTZWVkc1N0cihcbiAgICAgIHMsIG9mZnNldCArIDMyLCB6LmFkZCh3WzFdKSwgeS5hZGQoZmV0Y2g2NChzLCBvZmZzZXQgKyAxNikpKTtcblxuICBbeiwgeF0gPSBbeCwgel07XG5cbiAgcmV0dXJuIGhhc2hMZW4xNihcbiAgICAgIGhhc2hMZW4xNih2WzBdLCB3WzBdLCBtdWwpLmFkZChzaGlmdE1peCh5KS5tdWwoazApKS5hZGQoeiksXG4gICAgICBoYXNoTGVuMTYodlsxXSwgd1sxXSwgbXVsKS5hZGQoeCksIG11bCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from './environment';\nimport * as base from './util_base';\nexport * from './util_base';\nexport * from './hash_util';\n/**\n * Create typed array for scalar value. Used for storing in `DataStorage`.\n */\nexport function createScalarValue(value, dtype) {\n    if (dtype === 'string') {\n        return encodeString(value);\n    }\n    return toTypedArray([value], dtype);\n}\nfunction noConversionNeeded(a, dtype) {\n    return (a instanceof Float32Array && dtype === 'float32') ||\n        (a instanceof Int32Array && dtype === 'int32') ||\n        (a instanceof Uint8Array && dtype === 'bool');\n}\nexport function toTypedArray(a, dtype) {\n    if (dtype === 'string') {\n        throw new Error('Cannot convert a string[] to a TypedArray');\n    }\n    if (Array.isArray(a)) {\n        a = base.flatten(a);\n    }\n    if (env().getBool('DEBUG')) {\n        base.checkConversionForErrors(a, dtype);\n    }\n    if (noConversionNeeded(a, dtype)) {\n        return a;\n    }\n    if (dtype == null || dtype === 'float32' || dtype === 'complex64') {\n        return new Float32Array(a);\n    }\n    else if (dtype === 'int32') {\n        return new Int32Array(a);\n    }\n    else if (dtype === 'bool') {\n        const bool = new Uint8Array(a.length);\n        for (let i = 0; i < bool.length; ++i) {\n            if (Math.round(a[i]) !== 0) {\n                bool[i] = 1;\n            }\n        }\n        return bool;\n    }\n    else {\n        throw new Error(`Unknown data type ${dtype}`);\n    }\n}\n/**\n * Returns the current high-resolution time in milliseconds relative to an\n * arbitrary time in the past. It works across different platforms (node.js,\n * browsers).\n *\n * ```js\n * console.log(tf.util.now());\n * ```\n *\n * @doc {heading: 'Util', namespace: 'util'}\n */\nexport function now() {\n    return env().platform.now();\n}\n/**\n * Returns a platform-specific implementation of\n * [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).\n *\n * If `fetch` is defined on the global object (`window`, `process`, etc.),\n * `tf.util.fetch` returns that function.\n *\n * If not, `tf.util.fetch` returns a platform-specific solution.\n *\n * ```js\n * const resource = await tf.util.fetch('https://unpkg.com/@tensorflow/tfjs');\n * // handle response\n * ```\n *\n * @doc {heading: 'Util'}\n */\nexport function fetch(path, requestInits) {\n    return env().platform.fetch(path, requestInits);\n}\n/**\n * Encodes the provided string into bytes using the provided encoding scheme.\n *\n * @param s The string to encode.\n * @param encoding The encoding scheme. Defaults to utf-8.\n *\n * @doc {heading: 'Util'}\n */\nexport function encodeString(s, encoding = 'utf-8') {\n    encoding = encoding || 'utf-8';\n    return env().platform.encode(s, encoding);\n}\n/**\n * Decodes the provided bytes into a string using the provided encoding scheme.\n * @param bytes The bytes to decode.\n *\n * @param encoding The encoding scheme. Defaults to utf-8.\n *\n * @doc {heading: 'Util'}\n */\nexport function decodeString(bytes, encoding = 'utf-8') {\n    encoding = encoding || 'utf-8';\n    return env().platform.decode(bytes, encoding);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRWxDLE9BQU8sS0FBSyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQ3BDLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsYUFBYSxDQUFDO0FBRTVCOztHQUVHO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixLQUFlLEVBQUUsS0FBZTtJQUNsQyxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsT0FBTyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDNUI7SUFFRCxPQUFPLFlBQVksQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3RDLENBQUM7QUFFRCxTQUFTLGtCQUFrQixDQUFDLENBQWEsRUFBRSxLQUFlO0lBQ3hELE9BQU8sQ0FBQyxDQUFDLFlBQVksWUFBWSxJQUFJLEtBQUssS0FBSyxTQUFTLENBQUM7UUFDckQsQ0FBQyxDQUFDLFlBQVksVUFBVSxJQUFJLEtBQUssS0FBSyxPQUFPLENBQUM7UUFDOUMsQ0FBQyxDQUFDLFlBQVksVUFBVSxJQUFJLEtBQUssS0FBSyxNQUFNLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFhLEVBQUUsS0FBZTtJQUN6RCxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQywyQ0FBMkMsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7UUFDMUIsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQWEsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUNyRDtJQUNELElBQUksa0JBQWtCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFO1FBQ2hDLE9BQU8sQ0FBZSxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUNqRSxPQUFPLElBQUksWUFBWSxDQUFDLENBQWEsQ0FBQyxDQUFDO0tBQ3hDO1NBQU0sSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO1FBQzVCLE9BQU8sSUFBSSxVQUFVLENBQUMsQ0FBYSxDQUFDLENBQUM7S0FDdEM7U0FBTSxJQUFJLEtBQUssS0FBSyxNQUFNLEVBQUU7UUFDM0IsTUFBTSxJQUFJLEdBQUcsSUFBSSxVQUFVLENBQUUsQ0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3BELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBRSxDQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDYjtTQUNGO1FBQ0QsT0FBTyxJQUFJLENBQUM7S0FDYjtTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvQztBQUNILENBQUM7QUFFRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxVQUFVLEdBQUc7SUFDakIsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQ2pCLElBQVksRUFBRSxZQUEwQjtJQUMxQyxPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxDQUFTLEVBQUUsUUFBUSxHQUFHLE9BQU87SUFDeEQsUUFBUSxHQUFHLFFBQVEsSUFBSSxPQUFPLENBQUM7SUFDL0IsT0FBTyxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1QyxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBaUIsRUFBRSxRQUFRLEdBQUcsT0FBTztJQUNoRSxRQUFRLEdBQUcsUUFBUSxJQUFJLE9BQU8sQ0FBQztJQUMvQixPQUFPLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2hELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52fSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7QmFja2VuZFZhbHVlcywgRGF0YVR5cGUsIFRlbnNvckxpa2UsIFR5cGVkQXJyYXl9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgYmFzZSBmcm9tICcuL3V0aWxfYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL3V0aWxfYmFzZSc7XG5leHBvcnQgKiBmcm9tICcuL2hhc2hfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlIHR5cGVkIGFycmF5IGZvciBzY2FsYXIgdmFsdWUuIFVzZWQgZm9yIHN0b3JpbmcgaW4gYERhdGFTdG9yYWdlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNjYWxhclZhbHVlKFxuICAgIHZhbHVlOiBEYXRhVHlwZSwgZHR5cGU6IERhdGFUeXBlKTogQmFja2VuZFZhbHVlcyB7XG4gIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZW5jb2RlU3RyaW5nKHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiB0b1R5cGVkQXJyYXkoW3ZhbHVlXSwgZHR5cGUpO1xufVxuXG5mdW5jdGlvbiBub0NvbnZlcnNpb25OZWVkZWQoYTogVGVuc29yTGlrZSwgZHR5cGU6IERhdGFUeXBlKTogYm9vbGVhbiB7XG4gIHJldHVybiAoYSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSAmJiBkdHlwZSA9PT0gJ2Zsb2F0MzInKSB8fFxuICAgICAgKGEgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICYmIGR0eXBlID09PSAnaW50MzInKSB8fFxuICAgICAgKGEgaW5zdGFuY2VvZiBVaW50OEFycmF5ICYmIGR0eXBlID09PSAnYm9vbCcpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9UeXBlZEFycmF5KGE6IFRlbnNvckxpa2UsIGR0eXBlOiBEYXRhVHlwZSk6IFR5cGVkQXJyYXkge1xuICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29udmVydCBhIHN0cmluZ1tdIHRvIGEgVHlwZWRBcnJheScpO1xuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KGEpKSB7XG4gICAgYSA9IGJhc2UuZmxhdHRlbihhKTtcbiAgfVxuXG4gIGlmIChlbnYoKS5nZXRCb29sKCdERUJVRycpKSB7XG4gICAgYmFzZS5jaGVja0NvbnZlcnNpb25Gb3JFcnJvcnMoYSBhcyBudW1iZXJbXSwgZHR5cGUpO1xuICB9XG4gIGlmIChub0NvbnZlcnNpb25OZWVkZWQoYSwgZHR5cGUpKSB7XG4gICAgcmV0dXJuIGEgYXMgVHlwZWRBcnJheTtcbiAgfVxuICBpZiAoZHR5cGUgPT0gbnVsbCB8fCBkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGEgYXMgbnVtYmVyW10pO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIG5ldyBJbnQzMkFycmF5KGEgYXMgbnVtYmVyW10pO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICBjb25zdCBib29sID0gbmV3IFVpbnQ4QXJyYXkoKGEgYXMgbnVtYmVyW10pLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBib29sLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoTWF0aC5yb3VuZCgoYSBhcyBudW1iZXJbXSlbaV0pICE9PSAwKSB7XG4gICAgICAgIGJvb2xbaV0gPSAxO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYm9vbDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50IGhpZ2gtcmVzb2x1dGlvbiB0aW1lIGluIG1pbGxpc2Vjb25kcyByZWxhdGl2ZSB0byBhblxuICogYXJiaXRyYXJ5IHRpbWUgaW4gdGhlIHBhc3QuIEl0IHdvcmtzIGFjcm9zcyBkaWZmZXJlbnQgcGxhdGZvcm1zIChub2RlLmpzLFxuICogYnJvd3NlcnMpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zb2xlLmxvZyh0Zi51dGlsLm5vdygpKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJywgbmFtZXNwYWNlOiAndXRpbCd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3coKTogbnVtYmVyIHtcbiAgcmV0dXJuIGVudigpLnBsYXRmb3JtLm5vdygpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZlxuICogW2BmZXRjaGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpLlxuICpcbiAqIElmIGBmZXRjaGAgaXMgZGVmaW5lZCBvbiB0aGUgZ2xvYmFsIG9iamVjdCAoYHdpbmRvd2AsIGBwcm9jZXNzYCwgZXRjLiksXG4gKiBgdGYudXRpbC5mZXRjaGAgcmV0dXJucyB0aGF0IGZ1bmN0aW9uLlxuICpcbiAqIElmIG5vdCwgYHRmLnV0aWwuZmV0Y2hgIHJldHVybnMgYSBwbGF0Zm9ybS1zcGVjaWZpYyBzb2x1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVzb3VyY2UgPSBhd2FpdCB0Zi51dGlsLmZldGNoKCdodHRwczovL3VucGtnLmNvbS9AdGVuc29yZmxvdy90ZmpzJyk7XG4gKiAvLyBoYW5kbGUgcmVzcG9uc2VcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZldGNoKFxuICAgIHBhdGg6IHN0cmluZywgcmVxdWVzdEluaXRzPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gIHJldHVybiBlbnYoKS5wbGF0Zm9ybS5mZXRjaChwYXRoLCByZXF1ZXN0SW5pdHMpO1xufVxuXG4vKipcbiAqIEVuY29kZXMgdGhlIHByb3ZpZGVkIHN0cmluZyBpbnRvIGJ5dGVzIHVzaW5nIHRoZSBwcm92aWRlZCBlbmNvZGluZyBzY2hlbWUuXG4gKlxuICogQHBhcmFtIHMgVGhlIHN0cmluZyB0byBlbmNvZGUuXG4gKiBAcGFyYW0gZW5jb2RpbmcgVGhlIGVuY29kaW5nIHNjaGVtZS4gRGVmYXVsdHMgdG8gdXRmLTguXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1V0aWwnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHM6IHN0cmluZywgZW5jb2RpbmcgPSAndXRmLTgnKTogVWludDhBcnJheSB7XG4gIGVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ3V0Zi04JztcbiAgcmV0dXJuIGVudigpLnBsYXRmb3JtLmVuY29kZShzLCBlbmNvZGluZyk7XG59XG5cbi8qKlxuICogRGVjb2RlcyB0aGUgcHJvdmlkZWQgYnl0ZXMgaW50byBhIHN0cmluZyB1c2luZyB0aGUgcHJvdmlkZWQgZW5jb2Rpbmcgc2NoZW1lLlxuICogQHBhcmFtIGJ5dGVzIFRoZSBieXRlcyB0byBkZWNvZGUuXG4gKlxuICogQHBhcmFtIGVuY29kaW5nIFRoZSBlbmNvZGluZyBzY2hlbWUuIERlZmF1bHRzIHRvIHV0Zi04LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdVdGlsJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVN0cmluZyhieXRlczogVWludDhBcnJheSwgZW5jb2RpbmcgPSAndXRmLTgnKTogc3RyaW5nIHtcbiAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCAndXRmLTgnO1xuICByZXR1cm4gZW52KCkucGxhdGZvcm0uZGVjb2RlKGJ5dGVzLCBlbmNvZGluZyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from './environment';\nimport * as util from './util';\nexport class Profiler {\n    constructor(backendTimer, logger) {\n        this.backendTimer = backendTimer;\n        this.logger = logger;\n        if (logger == null) {\n            this.logger = new Logger();\n        }\n    }\n    profileKernel(kernelName, inputs, f) {\n        let outputs;\n        const holdResultWrapperFn = () => {\n            outputs = f();\n        };\n        let timer;\n        const start = util.now();\n        if (this.backendTimer.timerAvailable()) {\n            timer = this.backendTimer.time(holdResultWrapperFn);\n        }\n        else {\n            holdResultWrapperFn();\n            for (const output of outputs) {\n                output.dataSync();\n            }\n            timer = Promise.resolve({ kernelMs: util.now() - start });\n        }\n        if (env().getBool('CHECK_COMPUTATION_FOR_ERRORS')) {\n            for (let i = 0; i < outputs.length; i++) {\n                const output = outputs[i];\n                // Dangling promise here because we don't want to propagate up\n                // asynchronicity.\n                output.data().then(tensorVals => {\n                    checkComputationForErrors(tensorVals, output.dtype, kernelName);\n                });\n            }\n        }\n        const kernelProfile = {\n            kernelName,\n            outputs,\n            inputs,\n            timeMs: timer.then(timing => timing.kernelMs),\n            extraInfo: timer.then(timing => timing.getExtraProfileInfo != null ?\n                timing.getExtraProfileInfo() :\n                '')\n        };\n        return kernelProfile;\n    }\n    logKernelProfile(kernelProfile) {\n        const { kernelName, outputs, timeMs, inputs, extraInfo } = kernelProfile;\n        outputs.forEach(result => {\n            Promise.all([result.data(), timeMs, extraInfo]).then(valueContainer => {\n                this.logger.logKernelProfile(kernelName, result, valueContainer[0], valueContainer[1], inputs, valueContainer[2]);\n            });\n        });\n    }\n}\nexport function checkComputationForErrors(vals, dtype, kernelName) {\n    if (dtype !== 'float32') {\n        // Only floating point computations will generate NaN values\n        return false;\n    }\n    for (let i = 0; i < vals.length; i++) {\n        const num = vals[i];\n        if (isNaN(num) || !isFinite(num)) {\n            // Throwing custom exception so behavior is testable.\n            console.warn(`Found ${num} in the result of '${kernelName}'`);\n            return true;\n        }\n    }\n    return false;\n}\nexport class Logger {\n    logKernelProfile(name, result, vals, timeMs, inputs, extraInfo) {\n        const time = typeof timeMs === 'number' ? util.rightPad(`${timeMs}ms`, 9) :\n            timeMs['error'];\n        const paddedName = util.rightPad(name, 25);\n        const rank = result.rank;\n        const size = result.size;\n        const shape = util.rightPad(result.shape.toString(), 14);\n        let inputShapesDescription = '';\n        for (const name in inputs) {\n            const input = inputs[name];\n            if (input != null) {\n                // The input might be a non-tensor (e.g HTMLImageElement), in which case\n                // we claim the output shape as input shape.\n                const inputShape = input.shape || result.shape;\n                const inputRank = inputShape.length;\n                inputShapesDescription +=\n                    `${name}: ${inputRank}D ${inputRank > 0 ? inputShape : ''} `;\n            }\n        }\n        console.log(`%c${paddedName}\\t%c${time}\\t%c${rank}D ${shape}\\t%c${size}\\t%c${inputShapesDescription}\\t%c${extraInfo}`, 'font-weight:bold', 'color:red', 'color:blue', 'color: orange', 'color: green', 'color: steelblue');\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZmlsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3Byb2ZpbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFJbEMsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFVL0IsTUFBTSxPQUFPLFFBQVE7SUFDbkIsWUFBb0IsWUFBMEIsRUFBVSxNQUFlO1FBQW5ELGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBQVUsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUNyRSxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7WUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVELGFBQWEsQ0FBQyxVQUFrQixFQUFFLE1BQXNCLEVBQUUsQ0FBaUI7UUFFekUsSUFBSSxPQUFpQixDQUFDO1FBQ3RCLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxFQUFFO1lBQy9CLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUNoQixDQUFDLENBQUM7UUFDRixJQUFJLEtBQWlDLENBQUM7UUFDdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3pCLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLEVBQUUsRUFBRTtZQUN0QyxLQUFLLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0wsbUJBQW1CLEVBQUUsQ0FBQztZQUN0QixLQUFLLE1BQU0sTUFBTSxJQUFJLE9BQU8sRUFBRTtnQkFDNUIsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO2FBQ25CO1lBQ0QsS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBQyxRQUFRLEVBQUUs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Q0FBQyxDQUFDO0lBQzFDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCYWNrZW5kVGltZXIsIEJhY2tlbmRUaW1pbmdJbmZvfSBmcm9tICcuL2JhY2tlbmRzL2JhY2tlbmQnO1xuaW1wb3J0IHtlbnZ9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7RGF0YVR5cGUsIERhdGFUeXBlTWFwLCBUeXBlZEFycmF5fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcblxuZXhwb3J0IHR5cGUgS2VybmVsUHJvZmlsZSA9IHtcbiAga2VybmVsTmFtZTogc3RyaW5nLFxuICBvdXRwdXRzOiBUZW5zb3JbXSxcbiAgaW5wdXRzOiBOYW1lZFRlbnNvck1hcCxcbiAgdGltZU1zOiBQcm9taXNlPG51bWJlcnx7ZXJyb3I6IHN0cmluZ30+LFxuICBleHRyYUluZm86IFByb21pc2U8c3RyaW5nPlxufTtcblxuZXhwb3J0IGNsYXNzIFByb2ZpbGVyIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBiYWNrZW5kVGltZXI6IEJhY2tlbmRUaW1lciwgcHJpdmF0ZSBsb2dnZXI/OiBMb2dnZXIpIHtcbiAgICBpZiAobG9nZ2VyID09IG51bGwpIHtcbiAgICAgIHRoaXMubG9nZ2VyID0gbmV3IExvZ2dlcigpO1xuICAgIH1cbiAgfVxuXG4gIHByb2ZpbGVLZXJuZWwoa2VybmVsTmFtZTogc3RyaW5nLCBpbnB1dHM6IE5hbWVkVGVuc29yTWFwLCBmOiAoKSA9PiBUZW5zb3JbXSk6XG4gICAgICBLZXJuZWxQcm9maWxlIHtcbiAgICBsZXQgb3V0cHV0czogVGVuc29yW107XG4gICAgY29uc3QgaG9sZFJlc3VsdFdyYXBwZXJGbiA9ICgpID0+IHtcbiAgICAgIG91dHB1dHMgPSBmKCk7XG4gICAgfTtcbiAgICBsZXQgdGltZXI6IFByb21pc2U8QmFja2VuZFRpbWluZ0luZm8+O1xuICAgIGNvbnN0IHN0YXJ0ID0gdXRpbC5ub3coKTtcbiAgICBpZiAodGhpcy5iYWNrZW5kVGltZXIudGltZXJBdmFpbGFibGUoKSkge1xuICAgICAgdGltZXIgPSB0aGlzLmJhY2tlbmRUaW1lci50aW1lKGhvbGRSZXN1bHRXcmFwcGVyRm4pO1xuICAgIH0gZWxzZSB7XG4gICAgICBob2xkUmVzdWx0V3JhcHBlckZuKCk7XG4gICAgICBmb3IgKGNvbnN0IG91dHB1dCBvZiBvdXRwdXRzKSB7XG4gICAgICAgIG91dHB1dC5kYXRhU3luYygpO1xuICAgICAgfVxuICAgICAgdGltZXIgPSBQcm9taXNlLnJlc29sdmUoe2tlcm5lbE1zOiB1dGlsLm5vdygpIC0gc3RhcnR9KTtcbiAgICB9XG4gICAgaWYgKGVudigpLmdldEJvb2woJ0NIRUNLX0NPTVBVVEFUSU9OX0ZPUl9FUlJPUlMnKSkge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IG91dHB1dHNbaV07XG4gICAgICAgIC8vIERhbmdsaW5nIHByb21pc2UgaGVyZSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcHJvcGFnYXRlIHVwXG4gICAgICAgIC8vIGFzeW5jaHJvbmljaXR5LlxuICAgICAgICBvdXRwdXQuZGF0YSgpLnRoZW4odGVuc29yVmFscyA9PiB7XG4gICAgICAgICAgY2hlY2tDb21wdXRhdGlvbkZvckVycm9ycyh0ZW5zb3JWYWxzLCBvdXRwdXQuZHR5cGUsIGtlcm5lbE5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBrZXJuZWxQcm9maWxlID0ge1xuICAgICAga2VybmVsTmFtZSxcbiAgICAgIG91dHB1dHMsXG4gICAgICBpbnB1dHMsXG4gICAgICB0aW1lTXM6IHRpbWVyLnRoZW4odGltaW5nID0+IHRpbWluZy5rZXJuZWxNcyksXG4gICAgICBleHRyYUluZm86IHRpbWVyLnRoZW4oXG4gICAgICAgICAgdGltaW5nID0+IHRpbWluZy5nZXRFeHRyYVByb2ZpbGVJbmZvICE9IG51bGwgP1xuICAgICAgICAgICAgICB0aW1pbmcuZ2V0RXh0cmFQcm9maWxlSW5mbygpIDpcbiAgICAgICAgICAgICAgJycpXG4gICAgfTtcbiAgICByZXR1cm4ga2VybmVsUHJvZmlsZTtcbiAgfVxuXG4gIGxvZ0tlcm5lbFByb2ZpbGUoa2VybmVsUHJvZmlsZTogS2VybmVsUHJvZmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IHtrZXJuZWxOYW1lLCBvdXRwdXRzLCB0aW1lTXMsIGlucHV0cywgZXh0cmFJbmZvfSA9IGtlcm5lbFByb2ZpbGU7XG5cbiAgICBvdXRwdXRzLmZvckVhY2gocmVzdWx0ID0+IHtcbiAgICAgIFByb21pc2UuYWxsKFtyZXN1bHQuZGF0YSgpLCB0aW1lTXMsIGV4dHJhSW5mb10pLnRoZW4odmFsdWVDb250YWluZXIgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlci5sb2dLZXJuZWxQcm9maWxlKFxuICAgICAgICAgICAga2VybmVsTmFtZSwgcmVzdWx0LCB2YWx1ZUNvbnRhaW5lclswXSwgdmFsdWVDb250YWluZXJbMV0sIGlucHV0cyxcbiAgICAgICAgICAgIHZhbHVlQ29udGFpbmVyWzJdKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0NvbXB1dGF0aW9uRm9yRXJyb3JzPEQgZXh0ZW5kcyBEYXRhVHlwZT4oXG4gICAgdmFsczogRGF0YVR5cGVNYXBbRF0sIGR0eXBlOiBELCBrZXJuZWxOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAvLyBPbmx5IGZsb2F0aW5nIHBvaW50IGNvbXB1dGF0aW9ucyB3aWxsIGdlbmVyYXRlIE5hTiB2YWx1ZXNcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbnVtID0gdmFsc1tpXSBhcyBudW1iZXI7XG4gICAgaWYgKGlzTmFOKG51bSkgfHwgIWlzRmluaXRlKG51bSkpIHtcbiAgICAgIC8vIFRocm93aW5nIGN1c3RvbSBleGNlcHRpb24gc28gYmVoYXZpb3IgaXMgdGVzdGFibGUuXG4gICAgICBjb25zb2xlLndhcm4oYEZvdW5kICR7bnVtfSBpbiB0aGUgcmVzdWx0IG9mICcke2tlcm5lbE5hbWV9J2ApO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGNsYXNzIExvZ2dlciB7XG4gIGxvZ0tlcm5lbFByb2ZpbGUoXG4gICAgICBuYW1lOiBzdHJpbmcsIHJlc3VsdDogVGVuc29yLCB2YWxzOiBUeXBlZEFycmF5LFxuICAgICAgdGltZU1zOiBudW1iZXJ8e2Vycm9yOiBzdHJpbmd9LCBpbnB1dHM6IE5hbWVkVGVuc29yTWFwLFxuICAgICAgZXh0cmFJbmZvPzogc3RyaW5nKSB7XG4gICAgY29uc3QgdGltZSA9IHR5cGVvZiB0aW1lTXMgPT09ICdudW1iZXInID8gdXRpbC5yaWdodFBhZChgJHt0aW1lTXN9bXNgLCA5KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZU1zWydlcnJvciddO1xuICAgIGNvbnN0IHBhZGRlZE5hbWUgPSB1dGlsLnJpZ2h0UGFkKG5hbWUsIDI1KTtcbiAgICBjb25zdCByYW5rID0gcmVzdWx0LnJhbms7XG4gICAgY29uc3Qgc2l6ZSA9IHJlc3VsdC5zaXplO1xuICAgIGNvbnN0IHNoYXBlID0gdXRpbC5yaWdodFBhZChyZXN1bHQuc2hhcGUudG9TdHJpbmcoKSwgMTQpO1xuICAgIGxldCBpbnB1dFNoYXBlc0Rlc2NyaXB0aW9uID0gJyc7XG5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gaW5wdXRzKSB7XG4gICAgICBjb25zdCBpbnB1dCA9IGlucHV0c1tuYW1lXTtcbiAgICAgIGlmIChpbnB1dCAhPSBudWxsKSB7XG4gICAgICAgIC8vIFRoZSBpbnB1dCBtaWdodCBiZSBhIG5vbi10ZW5zb3IgKGUuZyBIVE1MSW1hZ2VFbGVtZW50KSwgaW4gd2hpY2ggY2FzZVxuICAgICAgICAvLyB3ZSBjbGFpbSB0aGUgb3V0cHV0IHNoYXBlIGFzIGlucHV0IHNoYXBlLlxuICAgICAgICBjb25zdCBpbnB1dFNoYXBlID0gaW5wdXQuc2hhcGUgfHwgcmVzdWx0LnNoYXBlO1xuICAgICAgICBjb25zdCBpbnB1dFJhbmsgPSBpbnB1dFNoYXBlLmxlbmd0aDtcbiAgICAgICAgaW5wdXRTaGFwZXNEZXNjcmlwdGlvbiArPVxuICAgICAgICAgICAgYCR7bmFtZX06ICR7aW5wdXRSYW5rfUQgJHtpbnB1dFJhbmsgPiAwID8gaW5wdXRTaGFwZSA6ICcnfSBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgICBgJWMke3BhZGRlZE5hbWV9XFx0JWMke3RpbWV9XFx0JWMke3Jhbmt9RCAke3NoYXBlfVxcdCVjJHtzaXplfVxcdCVjJHtcbiAgICAgICAgICAgIGlucHV0U2hhcGVzRGVzY3JpcHRpb259XFx0JWMke2V4dHJhSW5mb31gLFxuICAgICAgICAnZm9udC13ZWlnaHQ6Ym9sZCcsICdjb2xvcjpyZWQnLCAnY29sb3I6Ymx1ZScsICdjb2xvcjogb3JhbmdlJyxcbiAgICAgICAgJ2NvbG9yOiBncmVlbicsICdjb2xvcjogc3RlZWxibHVlJyk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from './util';\n/**\n * Computes a list of TapeNodes that connect x to y, filtering everything else\n * out and preserving the order of the original tape elements.\n *\n * @param tape The tape elements to filter.\n * @param xs The input Tensors.\n * @param y The output Tensor.\n */\nexport function getFilteredNodesXToY(tape, xs, y) {\n    // Forward pass to compute all the nodes and Tensors that are transitively a\n    // function of x.\n    const tensorsFromX = {};\n    const nodesFromX = {};\n    for (let i = 0; i < xs.length; i++) {\n        tensorsFromX[xs[i].id] = true;\n    }\n    for (let i = 0; i < tape.length; i++) {\n        const node = tape[i];\n        const nodeInputs = node.inputs;\n        for (const inputName in nodeInputs) {\n            const input = nodeInputs[inputName];\n            let anyInputFromX = false;\n            for (let j = 0; j < xs.length; j++) {\n                if (tensorsFromX[input.id]) {\n                    node.outputs.forEach(output => tensorsFromX[output.id] = true);\n                    anyInputFromX = true;\n                    nodesFromX[node.id] = true;\n                    break;\n                }\n            }\n            if (anyInputFromX) {\n                break;\n            }\n        }\n    }\n    // Backward pass to find all of the nodes and Tensors that lead to y.\n    const tensorsLeadToY = {};\n    tensorsLeadToY[y.id] = true;\n    const nodesToY = {};\n    for (let i = tape.length - 1; i >= 0; i--) {\n        const node = tape[i];\n        const nodeInputs = node.inputs;\n        // If any of the outputs lead to y, mark all of the inputs as leading to y.\n        for (let j = 0; j < node.outputs.length; j++) {\n            if (tensorsLeadToY[node.outputs[j].id]) {\n                for (const inputName in nodeInputs) {\n                    tensorsLeadToY[nodeInputs[inputName].id] = true;\n                    nodesToY[node.id] = true;\n                }\n                break;\n            }\n        }\n    }\n    // Return the paths that come from x and lead to y.\n    const filteredTape = [];\n    for (let i = 0; i < tape.length; i++) {\n        const node = tape[i];\n        if (nodesFromX[node.id] && nodesToY[node.id]) {\n            // Prune the inputs from the node that aren't a function of x.\n            const prunedInputs = {};\n            for (const inputName in node.inputs) {\n                const nodeInput = node.inputs[inputName];\n                if (tensorsFromX[nodeInput.id]) {\n                    prunedInputs[inputName] = nodeInput;\n                }\n            }\n            // Copy the node and overwrite inputsAndArgs to the pruned version.\n            const prunedNode = Object.assign({}, node);\n            prunedNode.inputs = prunedInputs;\n            prunedNode.outputs = node.outputs;\n            filteredTape.push(prunedNode);\n        }\n    }\n    return filteredTape;\n}\n/**\n * Backpropagate gradients through the filtered TapeNodes.\n *\n * @param tensorAccumulatedGradientMap A map of Tensor to its gradient. This map\n * is mutated by this method.\n * @param filteredTape The filtered TapeNodes to backprop through.\n */\nexport function backpropagateGradients(tensorAccumulatedGradientMap, filteredTape, tidy, add) {\n    // Walk the tape backward and keep a map of Tensor to its gradient.\n    for (let i = filteredTape.length - 1; i >= 0; i--) {\n        const node = filteredTape[i];\n        const dys = [];\n        node.outputs.forEach(o => {\n            const gradTensor = tensorAccumulatedGradientMap[o.id];\n            if (gradTensor != null) {\n                dys.push(gradTensor);\n            }\n            else {\n                // This particular output is not in the back-propagation subgraph, so it\n                // does not affect the final output, thus we put null for its dy.\n                dys.push(null);\n            }\n        });\n        if (node.gradient == null) {\n            throw new Error(`Cannot compute gradient: gradient function not found ` +\n                `for ${node.kernelName}.`);\n        }\n        // Backprop dy through this node and accumulate gradients over the inputs.\n        const inputGradients = node.gradient(dys);\n        for (const inputName in node.inputs) {\n            if (!(inputName in inputGradients)) {\n                throw new Error(`Cannot backprop through input ${inputName}. ` +\n                    `Available gradients found: ${Object.keys(inputGradients)}.`);\n            }\n            // Call the gradient function.\n            const dx = tidy(() => inputGradients[inputName]());\n            if (dx.dtype !== 'float32') {\n                throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ` +\n                    `${inputName} must have 'float32' dtype, but has '${dx.dtype}'`);\n            }\n            const x = node.inputs[inputName];\n            if (!util.arraysEqual(dx.shape, x.shape)) {\n                throw new Error(`Error in gradient for op ${node.kernelName}. The gradient of input ` +\n                    `'${inputName}' has shape '${dx.shape}', which does not match ` +\n                    `the shape of the input '${x.shape}'`);\n            }\n            if (tensorAccumulatedGradientMap[x.id] == null) {\n                tensorAccumulatedGradientMap[x.id] = dx;\n            }\n            else {\n                const curGradient = tensorAccumulatedGradientMap[x.id];\n                tensorAccumulatedGradientMap[x.id] = add(curGradient, dx);\n                curGradient.dispose();\n            }\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvdGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQWdCL0I7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDaEMsSUFBZ0IsRUFBRSxFQUFZLEVBQUUsQ0FBUztJQUMzQyw0RUFBNEU7SUFDNUUsaUJBQWlCO0lBQ2pCLE1BQU0sWUFBWSxHQUFrQyxFQUFFLENBQUM7SUFDdkQsTUFBTSxVQUFVLEdBQWdDLEVBQUUsQ0FBQztJQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsQyxZQUFZLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQztLQUMvQjtJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQy9CLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFO1lBQ2xDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUVwQyxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7WUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ2xDLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFB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QUMsQ0FBQztZQUNuRCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUFFO2dCQUMxQixNQUFNLElBQUksS0FBSyxDQUNYLDRCQUNJLElBQUksQ0FBQyxVQUFVLDBCQUEwQjtvQkFDN0MsR0FBRyxTQUFTLHdDQUF3QyxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQzthQUN0RTtZQUNELE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ3hDLE1BQU0sSUFBSSxLQUFLLENBQ1gsNEJBQ0ksSUFBSSxDQUFDLFVBQVUsMEJBQTBCO29CQUM3QyxJQUFJLFNBQVMsZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLDBCQUEwQjtvQkFDL0QsMkJBQTJCLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO2FBQzVDO1lBRUQsSUFBSSw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxFQUFFO2dCQUM5Qyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDO2FBQ3pDO2lCQUFNO2dCQUNMLE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDdkQsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7Z0JBQzFELFdBQVcsQ0FBQyxPQUFPLEVBQUUsQ0FBQzthQUN2QjtTQUNGO0tBQ0Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhcGVOb2RlIHtcbiAgaWQ6IG51bWJlcjtcbiAga2VybmVsTmFtZTogc3RyaW5nO1xuICBvdXRwdXRzOiBUZW5zb3JbXTtcbiAgaW5wdXRzOiBOYW1lZFRlbnNvck1hcDtcbiAgLy8gT3B0aW9uYWwgcGFyYW1zLCBkZWZpbmVkIG9ubHkgZm9yIG9wcyB3aXRoIGdyYWRpZW50IGltcGwuXG4gIGdyYWRpZW50PzogKGR5czogVGVuc29yW10pID0+IE5hbWVkR3JhZGllbnRNYXA7XG4gIHNhdmVkPzogVGVuc29yW107XG59XG5cbmV4cG9ydCB0eXBlIE5hbWVkR3JhZGllbnRNYXAgPSB7XG4gIFtpbnB1dE5hbWU6IHN0cmluZ106ICgpID0+IFRlbnNvcjtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgYSBsaXN0IG9mIFRhcGVOb2RlcyB0aGF0IGNvbm5lY3QgeCB0byB5LCBmaWx0ZXJpbmcgZXZlcnl0aGluZyBlbHNlXG4gKiBvdXQgYW5kIHByZXNlcnZpbmcgdGhlIG9yZGVyIG9mIHRoZSBvcmlnaW5hbCB0YXBlIGVsZW1lbnRzLlxuICpcbiAqIEBwYXJhbSB0YXBlIFRoZSB0YXBlIGVsZW1lbnRzIHRvIGZpbHRlci5cbiAqIEBwYXJhbSB4cyBUaGUgaW5wdXQgVGVuc29ycy5cbiAqIEBwYXJhbSB5IFRoZSBvdXRwdXQgVGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmlsdGVyZWROb2Rlc1hUb1koXG4gICAgdGFwZTogVGFwZU5vZGVbXSwgeHM6IFRlbnNvcltdLCB5OiBUZW5zb3IpOiBUYXBlTm9kZVtdIHtcbiAgLy8gRm9yd2FyZCBwYXNzIHRvIGNvbXB1dGUgYWxsIHRoZSBub2RlcyBhbmQgVGVuc29ycyB0aGF0IGFyZSB0cmFuc2l0aXZlbHkgYVxuICAvLyBmdW5jdGlvbiBvZiB4LlxuICBjb25zdCB0ZW5zb3JzRnJvbVg6IHtbdGVuc29ySWQ6IG51bWJlcl06IGJvb2xlYW59ID0ge307XG4gIGNvbnN0IG5vZGVzRnJvbVg6IHtbbm9kZUlkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhzLmxlbmd0aDsgaSsrKSB7XG4gICAgdGVuc29yc0Zyb21YW3hzW2ldLmlkXSA9IHRydWU7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcGUubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBub2RlID0gdGFwZVtpXTtcbiAgICBjb25zdCBub2RlSW5wdXRzID0gbm9kZS5pbnB1dHM7XG4gICAgZm9yIChjb25zdCBpbnB1dE5hbWUgaW4gbm9kZUlucHV0cykge1xuICAgICAgY29uc3QgaW5wdXQgPSBub2RlSW5wdXRzW2lucHV0TmFtZV07XG5cbiAgICAgIGxldCBhbnlJbnB1dEZyb21YID0gZmFsc2U7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHhzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmICh0ZW5zb3JzRnJvbVhbaW5wdXQuaWRdKSB7XG4gICAgICAgICAgbm9kZS5vdXRwdXRzLmZvckVhY2gob3V0cHV0ID0+IHRlbnNvcnNGcm9tWFtvdXRwdXQuaWRdID0gdHJ1ZSk7XG4gICAgICAgICAgYW55SW5wdXRGcm9tWCA9IHRydWU7XG4gICAgICAgICAgbm9kZXNGcm9tWFtub2RlLmlkXSA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKGFueUlucHV0RnJvbVgpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gQmFja3dhcmQgcGFzcyB0byBmaW5kIGFsbCBvZiB0aGUgbm9kZXMgYW5kIFRlbnNvcnMgdGhhdCBsZWFkIHRvIHkuXG4gIGNvbnN0IHRlbnNvcnNMZWFkVG9ZOiB7W3RlbnNvcklkOiBudW1iZXJdOiBib29sZWFufSA9IHt9O1xuICB0ZW5zb3JzTGVhZFRvWVt5LmlkXSA9IHRydWU7XG4gIGNvbnN0IG5vZGVzVG9ZOiB7W25vZGVJZDogbnVtYmVyXTogYm9vbGVhbn0gPSB7fTtcblxuICBmb3IgKGxldCBpID0gdGFwZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgIGNvbnN0IG5vZGUgPSB0YXBlW2ldO1xuICAgIGNvbnN0IG5vZGVJbnB1dHMgPSBub2RlLmlucHV0cztcblxuICAgIC8vIElmIGFueSBvZiB0aGUgb3V0cHV0cyBsZWFkIHRvIHksIG1hcmsgYWxsIG9mIHRoZSBpbnB1dHMgYXMgbGVhZGluZyB0byB5LlxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5vdXRwdXRzLmxlbmd0aDsgaisrKSB7XG4gICAgICBpZiAodGVuc29yc0xlYWRUb1lbbm9kZS5vdXRwdXRzW2pdLmlkXSkge1xuICAgICAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlSW5wdXRzKSB7XG4gICAgICAgICAgdGVuc29yc0xlYWRUb1lbbm9kZUlucHV0c1tpbnB1dE5hbWVdLmlkXSA9IHRydWU7XG4gICAgICAgICAgbm9kZXNUb1lbbm9kZS5pZF0gPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybiB0aGUgcGF0aHMgdGhhdCBjb21lIGZyb20geCBhbmQgbGVhZCB0byB5LlxuICBjb25zdCBmaWx0ZXJlZFRhcGU6IFRhcGVOb2RlW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0YXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgbm9kZSA9IHRhcGVbaV07XG5cbiAgICBpZiAobm9kZXNGcm9tWFtub2RlLmlkXSAmJiBub2Rlc1RvWVtub2RlLmlkXSkge1xuICAgICAgLy8gUHJ1bmUgdGhlIGlucHV0cyBmcm9tIHRoZSBub2RlIHRoYXQgYXJlbid0IGEgZnVuY3Rpb24gb2YgeC5cbiAgICAgIGNvbnN0IHBydW5lZElucHV0czoge1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0gPSB7fTtcbiAgICAgIGZvciAoY29uc3QgaW5wdXROYW1lIGluIG5vZGUuaW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IG5vZGVJbnB1dCA9IG5vZGUuaW5wdXRzW2lucHV0TmFtZV07XG4gICAgICAgIGlmICh0ZW5zb3JzRnJvbVhbbm9kZUlucHV0LmlkXSkge1xuICAgICAgICAgIHBydW5lZElucHV0c1tpbnB1dE5hbWVdID0gbm9kZUlucHV0O1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENvcHkgdGhlIG5vZGUgYW5kIG92ZXJ3cml0ZSBpbnB1dHNBbmRBcmdzIHRvIHRoZSBwcnVuZWQgdmVyc2lvbi5cbiAgICAgIGNvbnN0IHBydW5lZE5vZGUgPSBPYmplY3QuYXNzaWduKHt9LCBub2RlKTtcbiAgICAgIHBydW5lZE5vZGUuaW5wdXRzID0gcHJ1bmVkSW5wdXRzO1xuICAgICAgcHJ1bmVkTm9kZS5vdXRwdXRzID0gbm9kZS5vdXRwdXRzO1xuXG4gICAgICBmaWx0ZXJlZFRhcGUucHVzaChwcnVuZWROb2RlKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZmlsdGVyZWRUYXBlO1xufVxuXG4vKipcbiAqIEJhY2twcm9wYWdhdGUgZ3JhZGllbnRzIHRocm91Z2ggdGhlIGZpbHRlcmVkIFRhcGVOb2Rlcy5cbiAqXG4gKiBAcGFyYW0gdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcCBBIG1hcCBvZiBUZW5zb3IgdG8gaXRzIGdyYWRpZW50LiBUaGlzIG1hcFxuICogaXMgbXV0YXRlZCBieSB0aGlzIG1ldGhvZC5cbiAqIEBwYXJhbSBmaWx0ZXJlZFRhcGUgVGhlIGZpbHRlcmVkIFRhcGVOb2RlcyB0byBiYWNrcHJvcCB0aHJvdWdoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmFja3Byb3BhZ2F0ZUdyYWRpZW50cyhcbiAgICB0ZW5zb3JBY2N1bXVsYXRlZEdyYWRpZW50TWFwOiB7W3RlbnNvcklkOiBudW1iZXJdOiBUZW5zb3J9LFxuICAgIGZpbHRlcmVkVGFwZTogVGFwZU5vZGVbXSwgdGlkeTogKGY6IEZ1bmN0aW9uKSA9PiBUZW5zb3IsXG4gICAgYWRkOiAoYTogVGVuc29yLCBiOiBUZW5zb3IpID0+IFRlbnNvcikge1xuICAvLyBXYWxrIHRoZSB0YXBlIGJhY2t3YXJkIGFuZCBrZWVwIGEgbWFwIG9mIFRlbnNvciB0byBpdHMgZ3JhZGllbnQuXG4gIGZvciAobGV0IGkgPSBmaWx0ZXJlZFRhcGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBjb25zdCBub2RlID0gZmlsdGVyZWRUYXBlW2ldO1xuXG4gICAgY29uc3QgZHlzOiBUZW5zb3JbXSA9IFtdO1xuICAgIG5vZGUub3V0cHV0cy5mb3JFYWNoKG8gPT4ge1xuICAgICAgY29uc3QgZ3JhZFRlbnNvciA9IHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbby5pZF07XG4gICAgICBpZiAoZ3JhZFRlbnNvciAhPSBudWxsKSB7XG4gICAgICAgIGR5cy5wdXNoKGdyYWRUZW5zb3IpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gVGhpcyBwYXJ0aWN1bGFyIG91dHB1dCBpcyBub3QgaW4gdGhlIGJhY2stcHJvcGFnYXRpb24gc3ViZ3JhcGgsIHNvIGl0XG4gICAgICAgIC8vIGRvZXMgbm90IGFmZmVjdCB0aGUgZmluYWwgb3V0cHV0LCB0aHVzIHdlIHB1dCBudWxsIGZvciBpdHMgZHkuXG4gICAgICAgIGR5cy5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKG5vZGUuZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgY29tcHV0ZSBncmFkaWVudDogZ3JhZGllbnQgZnVuY3Rpb24gbm90IGZvdW5kIGAgK1xuICAgICAgICAgIGBmb3IgJHtub2RlLmtlcm5lbE5hbWV9LmApO1xuICAgIH1cblxuICAgIC8vIEJhY2twcm9wIGR5IHRocm91Z2ggdGhpcyBub2RlIGFuZCBhY2N1bXVsYXRlIGdyYWRpZW50cyBvdmVyIHRoZSBpbnB1dHMuXG4gICAgY29uc3QgaW5wdXRHcmFkaWVudHMgPSBub2RlLmdyYWRpZW50KGR5cyk7XG5cbiAgICBmb3IgKGNvbnN0IGlucHV0TmFtZSBpbiBub2RlLmlucHV0cykge1xuICAgICAgaWYgKCEoaW5wdXROYW1lIGluIGlucHV0R3JhZGllbnRzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGJhY2twcm9wIHRocm91Z2ggaW5wdXQgJHtpbnB1dE5hbWV9LiBgICtcbiAgICAgICAgICAgIGBBdmFpbGFibGUgZ3JhZGllbnRzIGZvdW5kOiAke09iamVjdC5rZXlzKGlucHV0R3JhZGllbnRzKX0uYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIENhbGwgdGhlIGdyYWRpZW50IGZ1bmN0aW9uLlxuICAgICAgY29uc3QgZHggPSB0aWR5KCgpID0+IGlucHV0R3JhZGllbnRzW2lucHV0TmFtZV0oKSk7XG4gICAgICBpZiAoZHguZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wICR7XG4gICAgICAgICAgICAgICAgbm9kZS5rZXJuZWxOYW1lfS4gVGhlIGdyYWRpZW50IG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgYCR7aW5wdXROYW1lfSBtdXN0IGhhdmUgJ2Zsb2F0MzInIGR0eXBlLCBidXQgaGFzICcke2R4LmR0eXBlfSdgKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHggPSBub2RlLmlucHV0c1tpbnB1dE5hbWVdO1xuICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKGR4LnNoYXBlLCB4LnNoYXBlKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXJyb3IgaW4gZ3JhZGllbnQgZm9yIG9wICR7XG4gICAgICAgICAgICAgICAgbm9kZS5rZXJuZWxOYW1lfS4gVGhlIGdyYWRpZW50IG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgYCcke2lucHV0TmFtZX0nIGhhcyBzaGFwZSAnJHtkeC5zaGFwZX0nLCB3aGljaCBkb2VzIG5vdCBtYXRjaCBgICtcbiAgICAgICAgICAgIGB0aGUgc2hhcGUgb2YgdGhlIGlucHV0ICcke3guc2hhcGV9J2ApO1xuICAgICAgfVxuXG4gICAgICBpZiAodGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSA9PSBudWxsKSB7XG4gICAgICAgIHRlbnNvckFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeC5pZF0gPSBkeDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGN1ckdyYWRpZW50ID0gdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXTtcbiAgICAgICAgdGVuc29yQWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSA9IGFkZChjdXJHcmFkaWVudCwgZHgpO1xuICAgICAgICBjdXJHcmFkaWVudC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { computeStrides, isString, rightPad, sizeFromShape } from './util';\n// Maximum number of values before we decide to show ellipsis.\nconst FORMAT_LIMIT_NUM_VALS = 20;\n// Number of first and last values to show when displaying a, b,...,y, z.\nconst FORMAT_NUM_FIRST_LAST_VALS = 3;\n// Number of significant digits to show.\nconst FORMAT_NUM_SIG_DIGITS = 7;\nexport function tensorToString(vals, shape, dtype, verbose) {\n    const strides = computeStrides(shape);\n    const padPerCol = computeMaxSizePerColumn(vals, shape, dtype, strides);\n    const rank = shape.length;\n    const valsLines = subTensorToString(vals, shape, dtype, strides, padPerCol);\n    const lines = ['Tensor'];\n    if (verbose) {\n        lines.push(`  dtype: ${dtype}`);\n        lines.push(`  rank: ${rank}`);\n        lines.push(`  shape: [${shape}]`);\n        lines.push(`  values:`);\n    }\n    lines.push(valsLines.map(l => '    ' + l).join('\\n'));\n    return lines.join('\\n');\n}\nfunction computeMaxSizePerColumn(vals, shape, dtype, strides) {\n    const n = sizeFromShape(shape);\n    const numCols = strides[strides.length - 1];\n    const padPerCol = new Array(numCols).fill(0);\n    const rank = shape.length;\n    const valuesOrTuples = dtype === 'complex64' ? createComplexTuples(vals) : vals;\n    if (rank > 1) {\n        for (let row = 0; row < n / numCols; row++) {\n            const offset = row * numCols;\n            for (let j = 0; j < numCols; j++) {\n                padPerCol[j] = Math.max(padPerCol[j], valToString(valuesOrTuples[offset + j], 0, dtype).length);\n            }\n        }\n    }\n    return padPerCol;\n}\nfunction valToString(val, pad, dtype) {\n    let valStr;\n    if (Array.isArray(val)) {\n        valStr = `${parseFloat(val[0].toFixed(FORMAT_NUM_SIG_DIGITS))} + ` +\n            `${parseFloat(val[1].toFixed(FORMAT_NUM_SIG_DIGITS))}j`;\n    }\n    else if (isString(val)) {\n        valStr = `'${val}'`;\n    }\n    else if (dtype === 'bool') {\n        valStr = boolNumToString(val);\n    }\n    else {\n        valStr = parseFloat(val.toFixed(FORMAT_NUM_SIG_DIGITS)).toString();\n    }\n    return rightPad(valStr, pad);\n}\nfunction boolNumToString(v) {\n    return v === 0 ? 'false' : 'true';\n}\nfunction subTensorToString(vals, shape, dtype, strides, padPerCol, isLast = true) {\n    const storagePerElement = dtype === 'complex64' ? 2 : 1;\n    const size = shape[0];\n    const rank = shape.length;\n    if (rank === 0) {\n        if (dtype === 'complex64') {\n            const complexTuple = createComplexTuples(vals);\n            return [valToString(complexTuple[0], 0, dtype)];\n        }\n        if (dtype === 'bool') {\n            return [boolNumToString(vals[0])];\n        }\n        return [vals[0].toString()];\n    }\n    if (rank === 1) {\n        if (size > FORMAT_LIMIT_NUM_VALS) {\n            const firstValsSize = FORMAT_NUM_FIRST_LAST_VALS * storagePerElement;\n            let firstVals = Array.from(vals.slice(0, firstValsSize));\n            let lastVals = Array.from(vals.slice((size - FORMAT_NUM_FIRST_LAST_VALS) * storagePerElement, size * storagePerElement));\n            if (dtype === 'complex64') {\n                firstVals = createComplexTuples(firstVals);\n                lastVals = createComplexTuples(lastVals);\n            }\n            return [\n                '[' +\n                    firstVals.map((x, i) => valToString(x, padPerCol[i], dtype))\n                        .join(', ') +\n                    ', ..., ' +\n                    lastVals\n                        .map((x, i) => valToString(x, padPerCol[size - FORMAT_NUM_FIRST_LAST_VALS + i], dtype))\n                        .join(', ') +\n                    ']'\n            ];\n        }\n        const displayVals = dtype === 'complex64' ? createComplexTuples(vals) :\n            Array.from(vals);\n        return [\n            '[' +\n                displayVals.map((x, i) => valToString(x, padPerCol[i], dtype))\n                    .join(', ') +\n                ']'\n        ];\n    }\n    // The array is rank 2 or more.\n    const subshape = shape.slice(1);\n    const substrides = strides.slice(1);\n    const stride = strides[0] * storagePerElement;\n    const lines = [];\n    if (size > FORMAT_LIMIT_NUM_VALS) {\n        for (let i = 0; i < FORMAT_NUM_FIRST_LAST_VALS; i++) {\n            const start = i * stride;\n            const end = start + stride;\n            lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, false /* isLast */));\n        }\n        lines.push('...');\n        for (let i = size - FORMAT_NUM_FIRST_LAST_VALS; i < size; i++) {\n            const start = i * stride;\n            const end = start + stride;\n            lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1 /* isLast */));\n        }\n    }\n    else {\n        for (let i = 0; i < size; i++) {\n            const start = i * stride;\n            const end = start + stride;\n            lines.push(...subTensorToString(vals.slice(start, end), subshape, dtype, substrides, padPerCol, i === size - 1 /* isLast */));\n        }\n    }\n    const sep = rank === 2 ? ',' : '';\n    lines[0] = '[' + lines[0] + sep;\n    for (let i = 1; i < lines.length - 1; i++) {\n        lines[i] = ' ' + lines[i] + sep;\n    }\n    let newLineSep = ',\\n';\n    for (let i = 2; i < rank; i++) {\n        newLineSep += '\\n';\n    }\n    lines[lines.length - 1] =\n        ' ' + lines[lines.length - 1] + ']' + (isLast ? '' : newLineSep);\n    return lines;\n}\nfunction createComplexTuples(vals) {\n    const complexTuples = [];\n    for (let i = 0; i < vals.length; i += 2) {\n        complexTuples.push([vals[i], vals[i + 1]]);\n    }\n    return complexTuples;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX2Zvcm1hdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvdGVuc29yX2Zvcm1hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsY0FBYyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRXpFLDhEQUE4RDtBQUM5RCxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQUNqQyx5RUFBeUU7QUFDekUsTUFBTSwwQkFBMEIsR0FBRyxDQUFDLENBQUM7QUFDckMsd0NBQXdDO0FBQ3hDLE1BQU0scUJBQXFCLEdBQUcsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sVUFBVSxjQUFjLENBQzFCLElBQXlCLEVBQUUsS0FBZSxFQUFFLEtBQWUsRUFDM0QsT0FBZ0I7SUFDbEIsTUFBTSxPQUFPLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sU0FBUyxHQUFHLHVCQUF1QixDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDMUIsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sS0FBSyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDekIsSUFBSSxPQUFPLEVBQUU7UUFDWCxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFLENBQUMsQ0FBQztRQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUM5QixLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsS0FBSyxHQUFHLENBQUMsQ0FB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Q0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyRSxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLElBQ1U7SUFDckMsTUFBTSxhQUFhLEdBQTRCLEVBQUUsQ0FBQztJQUNsRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ3ZDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBcUIsQ0FBQyxDQUFDO0tBQ2hFO0lBQ0QsT0FBTyxhQUFhLENBQUM7QUFDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgVHlwZWRBcnJheX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2NvbXB1dGVTdHJpZGVzLCBpc1N0cmluZywgcmlnaHRQYWQsIHNpemVGcm9tU2hhcGV9IGZyb20gJy4vdXRpbCc7XG5cbi8vIE1heGltdW0gbnVtYmVyIG9mIHZhbHVlcyBiZWZvcmUgd2UgZGVjaWRlIHRvIHNob3cgZWxsaXBzaXMuXG5jb25zdCBGT1JNQVRfTElNSVRfTlVNX1ZBTFMgPSAyMDtcbi8vIE51bWJlciBvZiBmaXJzdCBhbmQgbGFzdCB2YWx1ZXMgdG8gc2hvdyB3aGVuIGRpc3BsYXlpbmcgYSwgYiwuLi4seSwgei5cbmNvbnN0IEZPUk1BVF9OVU1fRklSU1RfTEFTVF9WQUxTID0gMztcbi8vIE51bWJlciBvZiBzaWduaWZpY2FudCBkaWdpdHMgdG8gc2hvdy5cbmNvbnN0IEZPUk1BVF9OVU1fU0lHX0RJR0lUUyA9IDc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3JUb1N0cmluZyhcbiAgICB2YWxzOiBUeXBlZEFycmF5fHN0cmluZ1tdLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICB2ZXJib3NlOiBib29sZWFuKSB7XG4gIGNvbnN0IHN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gIGNvbnN0IHBhZFBlckNvbCA9IGNvbXB1dGVNYXhTaXplUGVyQ29sdW1uKHZhbHMsIHNoYXBlLCBkdHlwZSwgc3RyaWRlcyk7XG4gIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHZhbHNMaW5lcyA9IHN1YlRlbnNvclRvU3RyaW5nKHZhbHMsIHNoYXBlLCBkdHlwZSwgc3RyaWRlcywgcGFkUGVyQ29sKTtcbiAgY29uc3QgbGluZXMgPSBbJ1RlbnNvciddO1xuICBpZiAodmVyYm9zZSkge1xuICAgIGxpbmVzLnB1c2goYCAgZHR5cGU6ICR7ZHR5cGV9YCk7XG4gICAgbGluZXMucHVzaChgICByYW5rOiAke3Jhbmt9YCk7XG4gICAgbGluZXMucHVzaChgICBzaGFwZTogWyR7c2hhcGV9XWApO1xuICAgIGxpbmVzLnB1c2goYCAgdmFsdWVzOmApO1xuICB9XG4gIGxpbmVzLnB1c2godmFsc0xpbmVzLm1hcChsID0+ICcgICAgJyArIGwpLmpvaW4oJ1xcbicpKTtcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlTWF4U2l6ZVBlckNvbHVtbihcbiAgICB2YWxzOiBUeXBlZEFycmF5fHN0cmluZ1tdLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICBzdHJpZGVzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgbiA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICBjb25zdCBudW1Db2xzID0gc3RyaWRlc1tzdHJpZGVzLmxlbmd0aCAtIDFdO1xuICBjb25zdCBwYWRQZXJDb2wgPSBuZXcgQXJyYXkobnVtQ29scykuZmlsbCgwKTtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgY29uc3QgdmFsdWVzT3JUdXBsZXMgPVxuICAgICAgZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6IHZhbHM7XG5cbiAgaWYgKHJhbmsgPiAxKSB7XG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgbiAvIG51bUNvbHM7IHJvdysrKSB7XG4gICAgICBjb25zdCBvZmZzZXQgPSByb3cgKiBudW1Db2xzO1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2xzOyBqKyspIHtcbiAgICAgICAgcGFkUGVyQ29sW2pdID0gTWF0aC5tYXgoXG4gICAgICAgICAgICBwYWRQZXJDb2xbal0sXG4gICAgICAgICAgICB2YWxUb1N0cmluZyh2YWx1ZXNPclR1cGxlc1tvZmZzZXQgKyBqXSwgMCwgZHR5cGUpLmxlbmd0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwYWRQZXJDb2w7XG59XG5cbmZ1bmN0aW9uIHZhbFRvU3RyaW5nKFxuICAgIHZhbDogbnVtYmVyfHN0cmluZ3xbbnVtYmVyLCBudW1iZXJdLCBwYWQ6IG51bWJlciwgZHR5cGU6IERhdGFUeXBlKSB7XG4gIGxldCB2YWxTdHI6IHN0cmluZztcbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgIHZhbFN0ciA9IGAke3BhcnNlRmxvYXQodmFsWzBdLnRvRml4ZWQoRk9STUFUX05VTV9TSUdfRElHSVRTKSl9ICsgYCArXG4gICAgICAgIGAke3BhcnNlRmxvYXQodmFsWzFdLnRvRml4ZWQoRk9STUFUX05VTV9TSUdfRElHSVRTKSl9amA7XG4gIH0gZWxzZSBpZiAoaXNTdHJpbmcodmFsKSkge1xuICAgIHZhbFN0ciA9IGAnJHt2YWx9J2A7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgIHZhbFN0ciA9IGJvb2xOdW1Ub1N0cmluZyh2YWwpO1xuICB9IGVsc2Uge1xuICAgIHZhbFN0ciA9IHBhcnNlRmxvYXQodmFsLnRvRml4ZWQoRk9STUFUX05VTV9TSUdfRElHSVRTKSkudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiByaWdodFBhZCh2YWxTdHIsIHBhZCk7XG59XG5cbmZ1bmN0aW9uIGJvb2xOdW1Ub1N0cmluZyh2OiBudW1iZXIpOiBzdHJpbmcge1xuICByZXR1cm4gdiA9PT0gMCA/ICdmYWxzZScgOiAndHJ1ZSc7XG59XG5cbmZ1bmN0aW9uIHN1YlRlbnNvclRvU3RyaW5nKFxuICAgIHZhbHM6IFR5cGVkQXJyYXl8c3RyaW5nW10sIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgIHN0cmlkZXM6IG51bWJlcltdLCBwYWRQZXJDb2w6IG51bWJlcltdLCBpc0xhc3QgPSB0cnVlKTogc3RyaW5nW10ge1xuICBjb25zdCBzdG9yYWdlUGVyRWxlbWVudCA9IGR0eXBlID09PSAnY29tcGxleDY0JyA/IDIgOiAxO1xuXG4gIGNvbnN0IHNpemUgPSBzaGFwZVswXTtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgaWYgKHJhbmsgPT09IDApIHtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBjb25zdCBjb21wbGV4VHVwbGUgPSBjcmVhdGVDb21wbGV4VHVwbGVzKHZhbHMpO1xuICAgICAgcmV0dXJuIFt2YWxUb1N0cmluZyhjb21wbGV4VHVwbGVbMF0sIDAsIGR0eXBlKV07XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICByZXR1cm4gW2Jvb2xOdW1Ub1N0cmluZyh2YWxzWzBdIGFzIG51bWJlcildO1xuICAgIH1cbiAgICByZXR1cm4gW3ZhbHNbMF0udG9TdHJpbmcoKV07XG4gIH1cblxuICBpZiAocmFuayA9PT0gMSkge1xuICAgIGlmIChzaXplID4gRk9STUFUX0xJTUlUX05VTV9WQUxTKSB7XG4gICAgICBjb25zdCBmaXJzdFZhbHNTaXplID0gRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFMgKiBzdG9yYWdlUGVyRWxlbWVudDtcblxuICAgICAgbGV0IGZpcnN0VmFscyA9IEFycmF5LmZyb208bnVtYmVyfHN0cmluZ3xbbnVtYmVyLCBudW1iZXJdPihcbiAgICAgICAgICB2YWxzLnNsaWNlKDAsIGZpcnN0VmFsc1NpemUpKTtcbiAgICAgIGxldCBsYXN0VmFscyA9IEFycmF5LmZyb208bnVtYmVyfHN0cmluZ3xbbnVtYmVyLCBudW1iZXJdPih2YWxzLnNsaWNlKFxuICAgICAgICAgIChzaXplIC0gRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFMpICogc3RvcmFnZVBlckVsZW1lbnQsXG4gICAgICAgICAgc2l6ZSAqIHN0b3JhZ2VQZXJFbGVtZW50KSk7XG4gICAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAgIGZpcnN0VmFscyA9IGNyZWF0ZUNvbXBsZXhUdXBsZXMoZmlyc3RWYWxzKTtcbiAgICAgICAgbGFzdFZhbHMgPSBjcmVhdGVDb21wbGV4VHVwbGVzKGxhc3RWYWxzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXG4gICAgICAgICdbJyArXG4gICAgICAgIGZpcnN0VmFscy5tYXAoKHgsIGkpID0+IHZhbFRvU3RyaW5nKHgsIHBhZFBlckNvbFtpXSwgZHR5cGUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJykgK1xuICAgICAgICAnLCAuLi4sICcgK1xuICAgICAgICBsYXN0VmFsc1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAoeCwgaSkgPT4gdmFsVG9TdHJpbmcoXG4gICAgICAgICAgICAgICAgICAgIHgsIHBhZFBlckNvbFtzaXplIC0gRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFMgKyBpXSwgZHR5cGUpKVxuICAgICAgICAgICAgLmpvaW4oJywgJykgK1xuICAgICAgICAnXSdcbiAgICAgIF07XG4gICAgfVxuICAgIGNvbnN0IGRpc3BsYXlWYWxzOiBBcnJheTxudW1iZXJ8c3RyaW5nfFtudW1iZXIsIG51bWJlcl0+ID1cbiAgICAgICAgZHR5cGUgPT09ICdjb21wbGV4NjQnID8gY3JlYXRlQ29tcGxleFR1cGxlcyh2YWxzKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmZyb208bnVtYmVyfHN0cmluZz4odmFscyk7XG5cbiAgICByZXR1cm4gW1xuICAgICAgJ1snICtcbiAgICAgIGRpc3BsYXlWYWxzLm1hcCgoeCwgaSkgPT4gdmFsVG9TdHJpbmcoeCwgcGFkUGVyQ29sW2ldLCBkdHlwZSkpXG4gICAgICAgICAgLmpvaW4oJywgJykgK1xuICAgICAgJ10nXG4gICAgXTtcbiAgfVxuXG4gIC8vIFRoZSBhcnJheSBpcyByYW5rIDIgb3IgbW9yZS5cbiAgY29uc3Qgc3Vic2hhcGUgPSBzaGFwZS5zbGljZSgxKTtcbiAgY29uc3Qgc3Vic3RyaWRlcyA9IHN0cmlkZXMuc2xpY2UoMSk7XG4gIGNvbnN0IHN0cmlkZSA9IHN0cmlkZXNbMF0gKiBzdG9yYWdlUGVyRWxlbWVudDtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChzaXplID4gRk9STUFUX0xJTUlUX05VTV9WQUxTKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBGT1JNQVRfTlVNX0ZJUlNUX0xBU1RfVkFMUzsgaSsrKSB7XG4gICAgICBjb25zdCBzdGFydCA9IGkgKiBzdHJpZGU7XG4gICAgICBjb25zdCBlbmQgPSBzdGFydCArIHN0cmlkZTtcbiAgICAgIGxpbmVzLnB1c2goLi4uc3ViVGVuc29yVG9TdHJpbmcoXG4gICAgICAgICAgdmFscy5zbGljZShzdGFydCwgZW5kKSwgc3Vic2hhcGUsIGR0eXBlLCBzdWJzdHJpZGVzLCBwYWRQZXJDb2wsXG4gICAgICAgICAgZmFsc2UgLyogaXNMYXN0ICovKSk7XG4gICAgfVxuICAgIGxpbmVzLnB1c2goJy4uLicpO1xuICAgIGZvciAobGV0IGkgPSBzaXplIC0gRk9STUFUX05VTV9GSVJTVF9MQVNUX1ZBTFM7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIHN0cmlkZTtcbiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyaWRlO1xuICAgICAgbGluZXMucHVzaCguLi5zdWJUZW5zb3JUb1N0cmluZyhcbiAgICAgICAgICB2YWxzLnNsaWNlKHN0YXJ0LCBlbmQpLCBzdWJzaGFwZSwgZHR5cGUsIHN1YnN0cmlkZXMsIHBhZFBlckNvbCxcbiAgICAgICAgICBpID09PSBzaXplIC0gMSAvKiBpc0xhc3QgKi8pKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgIGNvbnN0IHN0YXJ0ID0gaSAqIHN0cmlkZTtcbiAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgc3RyaWRlO1xuICAgICAgbGluZXMucHVzaCguLi5zdWJUZW5zb3JUb1N0cmluZyhcbiAgICAgICAgICB2YWxzLnNsaWNlKHN0YXJ0LCBlbmQpLCBzdWJzaGFwZSwgZHR5cGUsIHN1YnN0cmlkZXMsIHBhZFBlckNvbCxcbiAgICAgICAgICBpID09PSBzaXplIC0gMSAvKiBpc0xhc3QgKi8pKTtcbiAgICB9XG4gIH1cbiAgY29uc3Qgc2VwID0gcmFuayA9PT0gMiA/ICcsJyA6ICcnO1xuICBsaW5lc1swXSA9ICdbJyArIGxpbmVzWzBdICsgc2VwO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGxpbmVzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGxpbmVzW2ldID0gJyAnICsgbGluZXNbaV0gKyBzZXA7XG4gIH1cbiAgbGV0IG5ld0xpbmVTZXAgPSAnLFxcbic7XG4gIGZvciAobGV0IGkgPSAyOyBpIDwgcmFuazsgaSsrKSB7XG4gICAgbmV3TGluZVNlcCArPSAnXFxuJztcbiAgfVxuICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSA9XG4gICAgICAnICcgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXSArICddJyArIChpc0xhc3QgPyAnJyA6IG5ld0xpbmVTZXApO1xuICByZXR1cm4gbGluZXM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhUdXBsZXModmFsczogQXJyYXk8e30+fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlZEFycmF5KTogQXJyYXk8W251bWJlciwgbnVtYmVyXT4ge1xuICBjb25zdCBjb21wbGV4VHVwbGVzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBjb21wbGV4VHVwbGVzLnB1c2goW3ZhbHNbaV0sIHZhbHNbaSArIDFdXSBhcyBbbnVtYmVyLCBudW1iZXJdKTtcbiAgfVxuICByZXR1cm4gY29tcGxleFR1cGxlcztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Workaround for: https://github.com/bazelbuild/rules_nodejs/issues/1265\n/// <reference types=\"@webgpu/types/dist\" />\nimport { getGlobal } from './global_util';\nimport { tensorToString } from './tensor_format';\nimport * as util from './util';\nimport { computeStrides, toNestedArray } from './util';\n/**\n * A mutable object, similar to `tf.Tensor`, that allows users to set values\n * at locations before converting to an immutable `tf.Tensor`.\n *\n * See `tf.buffer` for creating a tensor buffer.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\nexport class TensorBuffer {\n    constructor(shape, dtype, values) {\n        this.dtype = dtype;\n        this.shape = shape.slice();\n        this.size = util.sizeFromShape(shape);\n        if (values != null) {\n            const n = values.length;\n            util.assert(n === this.size, () => `Length of values '${n}' does not match the size ` +\n                `inferred by the shape '${this.size}'.`);\n        }\n        if (dtype === 'complex64') {\n            throw new Error(`complex64 dtype TensorBuffers are not supported. Please create ` +\n                `a TensorBuffer for the real and imaginary parts separately and ` +\n                `call tf.complex(real, imag).`);\n        }\n        this.values = values || util.getArrayFromDType(dtype, this.size);\n        this.strides = computeStrides(shape);\n    }\n    /**\n     * Sets a value in the buffer at a given location.\n     *\n     * @param value The value to set.\n     * @param locs  The location indices.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Creation'}\n     */\n    set(value, ...locs) {\n        if (locs.length === 0) {\n            locs = [0];\n        }\n        util.assert(locs.length === this.rank, () => `The number of provided coordinates (${locs.length}) must ` +\n            `match the rank (${this.rank})`);\n        const index = this.locToIndex(locs);\n        this.values[index] = value;\n    }\n    /**\n     * Returns the value in the buffer at the provided location.\n     *\n     * @param locs The location indices.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Creation'}\n     */\n    get(...locs) {\n        if (locs.length === 0) {\n            locs = [0];\n        }\n        let i = 0;\n        for (const loc of locs) {\n            if (loc < 0 || loc >= this.shape[i]) {\n                const msg = `Requested out of range element at ${locs}. ` +\n                    `  Buffer shape=${this.shape}`;\n                throw new Error(msg);\n            }\n            i++;\n        }\n        let index = locs[locs.length - 1];\n        for (let i = 0; i < locs.length - 1; ++i) {\n            index += this.strides[i] * locs[i];\n        }\n        return this.values[index];\n    }\n    locToIndex(locs) {\n        if (this.rank === 0) {\n            return 0;\n        }\n        else if (this.rank === 1) {\n            return locs[0];\n        }\n        let index = locs[locs.length - 1];\n        for (let i = 0; i < locs.length - 1; ++i) {\n            index += this.strides[i] * locs[i];\n        }\n        return index;\n    }\n    indexToLoc(index) {\n        if (this.rank === 0) {\n            return [];\n        }\n        else if (this.rank === 1) {\n            return [index];\n        }\n        const locs = new Array(this.shape.length);\n        for (let i = 0; i < locs.length - 1; ++i) {\n            locs[i] = Math.floor(index / this.strides[i]);\n            index -= locs[i] * this.strides[i];\n        }\n        locs[locs.length - 1] = index;\n        return locs;\n    }\n    get rank() {\n        return this.shape.length;\n    }\n    /**\n     * Creates an immutable `tf.Tensor` object from the buffer.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Creation'}\n     */\n    toTensor() {\n        return trackerFn().makeTensor(this.values, this.shape, this.dtype);\n    }\n}\n// For tracking tensor creation and disposal.\nlet trackerFn = null;\n// Used by chaining methods to call into ops.\nlet opHandler = null;\n// Used to warn about deprecated methods.\nlet deprecationWarningFn = null;\n// This here so that we can use this method on dev branches and keep the\n// functionality at master.\n// tslint:disable-next-line:no-unused-expression\n[deprecationWarningFn];\n/**\n * An external consumer can register itself as the tensor tracker. This way\n * the Tensor class can notify the tracker for every tensor created and\n * disposed.\n */\nexport function setTensorTracker(fn) {\n    trackerFn = fn;\n}\n/**\n * An external consumer can register itself as the op handler. This way the\n * Tensor class can have chaining methods that call into ops via the op\n * handler.\n */\nexport function setOpHandler(handler) {\n    opHandler = handler;\n}\n/**\n * Sets the deprecation warning function to be used by this file. This way the\n * Tensor class can be a leaf but still use the environment.\n */\nexport function setDeprecationWarningFn(fn) {\n    deprecationWarningFn = fn;\n}\n/**\n * A `tf.Tensor` object represents an immutable, multidimensional array of\n * numbers that has a shape and a data type.\n *\n * For performance reasons, functions that create tensors do not necessarily\n * perform a copy of the data passed to them (e.g. if the data is passed as a\n * `Float32Array`), and changes to the data will change the tensor. This is not\n * a feature and is not supported. To avoid this behavior, use the tensor before\n * changing the input data or create a copy with `copy = tf.add(yourTensor, 0)`.\n *\n * See `tf.tensor` for details on how to create a `tf.Tensor`.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\nexport class Tensor {\n    constructor(shape, dtype, dataId, id) {\n        /** Whether this tensor has been globally kept. */\n        this.kept = false;\n        this.isDisposedInternal = false;\n        this.shape = shape.slice();\n        this.dtype = dtype || 'float32';\n        this.size = util.sizeFromShape(shape);\n        this.strides = computeStrides(shape);\n        this.dataId = dataId;\n        this.id = id;\n        this.rankType = (this.rank < 5 ? this.rank.toString() : 'higher');\n    }\n    get rank() {\n        return this.shape.length;\n    }\n    /**\n     * Returns a promise of `tf.TensorBuffer` that holds the underlying data.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    async buffer() {\n        const vals = await this.data();\n        return opHandler.buffer(this.shape, this.dtype, vals);\n    }\n    /**\n     * Returns a `tf.TensorBuffer` that holds the underlying data.\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    bufferSync() {\n        return opHandler.buffer(this.shape, this.dtype, this.dataSync());\n    }\n    /**\n     * Returns the tensor data as a nested array. The transfer of data is done\n     * asynchronously.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    async array() {\n        const vals = await this.data();\n        return toNestedArray(this.shape, vals, this.dtype === 'complex64');\n    }\n    /**\n     * Returns the tensor data as a nested array. The transfer of data is done\n     * synchronously.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    arraySync() {\n        return toNestedArray(this.shape, this.dataSync(), this.dtype === 'complex64');\n    }\n    /**\n     * Asynchronously downloads the values from the `tf.Tensor`. Returns a\n     * promise of `TypedArray` that resolves when the computation has finished.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    async data() {\n        this.throwIfDisposed();\n        const data = trackerFn().read(this.dataId);\n        if (this.dtype === 'string') {\n            const bytes = await data;\n            try {\n                return bytes.map(b => util.decodeString(b));\n            }\n            catch (_a) {\n                throw new Error('Failed to decode the string bytes into utf-8. ' +\n                    'To get the original bytes, call tensor.bytes().');\n            }\n        }\n        return data;\n    }\n    /**\n     * Copy the tensor's data to a new GPU resource. Comparing to the `dataSync()`\n     * and `data()`, this method prevents data from being downloaded to CPU.\n     *\n     * For WebGL backend, the data will be stored on a densely packed texture.\n     * This means that the texture will use the RGBA channels to store value.\n     *\n     * For WebGPU backend, the data will be stored on a buffer. There is no\n     * parameter, so can not use a user-defined size to create the buffer.\n     *\n     * @param options:\n     *     For WebGL,\n     *         - customTexShape: Optional. If set, will use the user defined\n     *     texture shape to create the texture.\n     *\n     * @returns For WebGL backend, a GPUData contains the new texture and\n     *     its information.\n     *     {\n     *        tensorRef: The tensor that is associated with this texture,\n     *        texture: WebGLTexture,\n     *        texShape: [number, number] // [height, width]\n     *     }\n     *\n     *     For WebGPU backend, a GPUData contains the new buffer and\n     *     its information.\n     *     {\n     *        tensorRef: The tensor that is associated with this buffer,\n     *        buffer: GPUBuffer,\n     *        bufSize: number\n     *     }\n     *\n     *     Remember to dispose the GPUData after it is used by\n     *     `res.tensorRef.dispose()`.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    dataToGPU(options) {\n        this.throwIfDisposed();\n        return trackerFn().readToGPU(this.dataId, options);\n    }\n    /**\n     * Synchronously downloads the values from the `tf.Tensor`. This blocks the\n     * UI thread until the values are ready, which can cause performance issues.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    dataSync() {\n        this.throwIfDisposed();\n        const data = trackerFn().readSync(this.dataId);\n        if (this.dtype === 'string') {\n            try {\n                return data.map(b => util.decodeString(b));\n            }\n            catch (_a) {\n                throw new Error('Failed to decode the string bytes into utf-8. ' +\n                    'To get the original bytes, call tensor.bytes().');\n            }\n        }\n        return data;\n    }\n    /** Returns the underlying bytes of the tensor's data. */\n    async bytes() {\n        this.throwIfDisposed();\n        const data = await trackerFn().read(this.dataId);\n        if (this.dtype === 'string') {\n            return data;\n        }\n        else {\n            return new Uint8Array(data.buffer);\n        }\n    }\n    /**\n     * Disposes `tf.Tensor` from memory.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    dispose() {\n        if (this.isDisposed) {\n            return;\n        }\n        trackerFn().disposeTensor(this);\n        this.isDisposedInternal = true;\n    }\n    get isDisposed() {\n        return this.isDisposedInternal;\n    }\n    throwIfDisposed() {\n        if (this.isDisposed) {\n            throw new Error(`Tensor is disposed.`);\n        }\n    }\n    /**\n     * Prints the `tf.Tensor`. See `tf.print` for details.\n     *\n     * @param verbose Whether to print verbose information about the tensor,\n     *    including dtype and size.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    print(verbose = false) {\n        return opHandler.print(this, verbose);\n    }\n    /**\n     * Returns a copy of the tensor. See `tf.clone` for details.\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    clone() {\n        this.throwIfDisposed();\n        return opHandler.clone(this);\n    }\n    /**\n     * Returns a human-readable description of the tensor. Useful for logging.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    toString(verbose = false) {\n        const vals = this.dataSync();\n        return tensorToString(vals, this.shape, this.dtype, verbose);\n    }\n    cast(dtype) {\n        this.throwIfDisposed();\n        return opHandler.cast(this, dtype);\n    }\n    variable(trainable = true, name, dtype) {\n        this.throwIfDisposed();\n        return trackerFn().makeVariable(this, trainable, name, dtype);\n    }\n}\nObject.defineProperty(Tensor, Symbol.hasInstance, {\n    value: (instance) => {\n        // Implementation note: we should use properties of the object that will be\n        // defined before the constructor body has finished executing (methods).\n        // This is because when this code is transpiled by babel, babel will call\n        // classCallCheck before the constructor body is run.\n        // See https://github.com/tensorflow/tfjs/issues/3384 for backstory.\n        return !!instance && instance.data != null && instance.dataSync != null &&\n            instance.throwIfDisposed != null;\n    }\n});\nexport function getGlobalTensorClass() {\n    // Use getGlobal so that we can augment the Tensor class across package\n    // boundaries becase the node resolution alg may result in different modules\n    // being returned for this file depending on the path they are loaded from.\n    return getGlobal('Tensor', () => {\n        return Tensor;\n    });\n}\n// Global side effect. Cache global reference to Tensor class\ngetGlobalTensorClass();\n/**\n * A mutable `tf.Tensor`, useful for persisting state, e.g. for training.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\nexport class Variable extends Tensor {\n    constructor(initialValue, trainable, name, tensorId) {\n        super(initialValue.shape, initialValue.dtype, initialValue.dataId, tensorId);\n        this.trainable = trainable;\n        this.name = name;\n    }\n    /**\n     * Assign a new `tf.Tensor` to this variable. The new `tf.Tensor` must have\n     * the same shape and dtype as the old `tf.Tensor`.\n     *\n     * @param newValue New tensor to be assigned to this variable.\n     *\n     * @doc {heading: 'Tensors', subheading: 'Classes'}\n     */\n    assign(newValue) {\n        if (newValue.dtype !== this.dtype) {\n            throw new Error(`dtype of the new value (${newValue.dtype}) and ` +\n                `previous value (${this.dtype}) must match`);\n        }\n        if (!util.arraysEqual(newValue.shape, this.shape)) {\n            throw new Error(`shape of the new value (${newValue.shape}) and ` +\n                `previous value (${this.shape}) must match`);\n        }\n        trackerFn().disposeTensor(this);\n        this.dataId = newValue.dataId;\n        trackerFn().incRef(this, null /* backend */);\n    }\n    dispose() {\n        trackerFn().disposeVariable(this);\n        this.isDisposedInternal = true;\n    }\n}\nObject.defineProperty(Variable, Symbol.hasInstance, {\n    value: (instance) => {\n        return instance instanceof Tensor && instance.assign != null &&\n            instance.assign instanceof Function;\n    }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy90ZW5zb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgseUVBQXlFO0FBQ3pFLDRDQUE0QztBQUU1QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEtBQUssSUFBSSxNQUFNLFFBQVEsQ0FBQztBQUMvQixPQUFPLEVBQUMsY0FBYyxFQUFFLGFBQWEsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQVdyRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxPQUFPLFlBQVk7SUFNdkIsWUFBWSxLQUFrQixFQUFTLEtBQVEsRUFBRSxNQUF1QjtRQUFqQyxVQUFLLEdBQUwsS0FBSyxDQUFHO1FBQzdDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBaUIsQ0FBQztRQUMxQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdEMsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2xCLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7WUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFDZixHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyw0QkFBNEI7Z0JBQ3BELDBCQUEwQixJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtZQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLGlFQUFpRTtnQkFDakUsaUVBQWlFO2dCQUNqRSw4QkFBOEIsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sR0FB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QVEsQ0FBQztJQUMxQyxDQUFDO0NBQ0YsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBXb3JrYXJvdW5kIGZvcjogaHR0cHM6Ly9naXRodWIuY29tL2JhemVsYnVpbGQvcnVsZXNfbm9kZWpzL2lzc3Vlcy8xMjY1XG4vLy8gPHJlZmVyZW5jZSB0eXBlcz1cIkB3ZWJncHUvdHlwZXMvZGlzdFwiIC8+XG5cbmltcG9ydCB7Z2V0R2xvYmFsfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCB7dGVuc29yVG9TdHJpbmd9IGZyb20gJy4vdGVuc29yX2Zvcm1hdCc7XG5pbXBvcnQge0FycmF5TWFwLCBCYWNrZW5kVmFsdWVzLCBEYXRhVHlwZSwgRGF0YVR5cGVNYXAsIERhdGFWYWx1ZXMsIE51bWVyaWNEYXRhVHlwZSwgUmFuaywgU2hhcGVNYXAsIFNpbmdsZVZhbHVlTWFwLCBUeXBlZEFycmF5fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlsJztcbmltcG9ydCB7Y29tcHV0ZVN0cmlkZXMsIHRvTmVzdGVkQXJyYXl9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVuc29yRGF0YTxEIGV4dGVuZHMgRGF0YVR5cGU+IHtcbiAgZGF0YUlkPzogRGF0YUlkO1xuICB2YWx1ZXM/OiBEYXRhVHlwZU1hcFtEXTtcbn1cblxuLy8gVGhpcyBpbnRlcmZhY2UgbWltaWNzIEtlcm5lbEJhY2tlbmQgKGluIGJhY2tlbmQudHMpLCB3aGljaCB3b3VsZCBjcmVhdGUgYVxuLy8gY2lyY3VsYXIgZGVwZW5kZW5jeSBpZiBpbXBvcnRlZC5cbmV4cG9ydCBpbnRlcmZhY2UgQmFja2VuZCB7fVxuXG4vKipcbiAqIEEgbXV0YWJsZSBvYmplY3QsIHNpbWlsYXIgdG8gYHRmLlRlbnNvcmAsIHRoYXQgYWxsb3dzIHVzZXJzIHRvIHNldCB2YWx1ZXNcbiAqIGF0IGxvY2F0aW9ucyBiZWZvcmUgY29udmVydGluZyB0byBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAuXG4gKlxuICogU2VlIGB0Zi5idWZmZXJgIGZvciBjcmVhdGluZyBhIHRlbnNvciBidWZmZXIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBUZW5zb3JCdWZmZXI8UiBleHRlbmRzIFJhbmssIEQgZXh0ZW5kcyBEYXRhVHlwZSA9ICdmbG9hdDMyJz4ge1xuICBzaXplOiBudW1iZXI7XG4gIHNoYXBlOiBTaGFwZU1hcFtSXTtcbiAgc3RyaWRlczogbnVtYmVyW107XG4gIHZhbHVlczogRGF0YVR5cGVNYXBbRF07XG5cbiAgY29uc3RydWN0b3Ioc2hhcGU6IFNoYXBlTWFwW1JdLCBwdWJsaWMgZHR5cGU6IEQsIHZhbHVlcz86IERhdGFUeXBlTWFwW0RdKSB7XG4gICAgdGhpcy5zaGFwZSA9IHNoYXBlLnNsaWNlKCkgYXMgU2hhcGVNYXBbUl07XG4gICAgdGhpcy5zaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcblxuICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICBuID09PSB0aGlzLnNpemUsXG4gICAgICAgICAgKCkgPT4gYExlbmd0aCBvZiB2YWx1ZXMgJyR7bn0nIGRvZXMgbm90IG1hdGNoIHRoZSBzaXplIGAgK1xuICAgICAgICAgICAgICBgaW5mZXJyZWQgYnkgdGhlIHNoYXBlICcke3RoaXMuc2l6ZX0nLmApO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGNvbXBsZXg2NCBkdHlwZSBUZW5zb3JCdWZmZXJzIGFyZSBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgY3JlYXRlIGAgK1xuICAgICAgICAgIGBhIFRlbnNvckJ1ZmZlciBmb3IgdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBzZXBhcmF0ZWx5IGFuZCBgICtcbiAgICAgICAgICBgY2FsbCB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlcyA9IHZhbHVlcyB8fCB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB0aGlzLnNpemUpO1xuICAgIHRoaXMuc3RyaWRlcyA9IGNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXRzIGEgdmFsdWUgaW4gdGhlIGJ1ZmZlciBhdCBhIGdpdmVuIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC5cbiAgICogQHBhcmFtIGxvY3MgIFRoZSBsb2NhdGlvbiBpbmRpY2VzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gICAqL1xuICBzZXQodmFsdWU6IFNpbmdsZVZhbHVlTWFwW0RdLCAuLi5sb2NzOiBudW1iZXJbXSk6IHZvaWQge1xuICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9jcyA9IFswXTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGxvY3MubGVuZ3RoID09PSB0aGlzLnJhbmssXG4gICAgICAgICgpID0+IGBUaGUgbnVtYmVyIG9mIHByb3ZpZGVkIGNvb3JkaW5hdGVzICgke2xvY3MubGVuZ3RofSkgbXVzdCBgICtcbiAgICAgICAgICAgIGBtYXRjaCB0aGUgcmFuayAoJHt0aGlzLnJhbmt9KWApO1xuXG4gICAgY29uc3QgaW5kZXggPSB0aGlzLmxvY1RvSW5kZXgobG9jcyk7XG4gICAgdGhpcy52YWx1ZXNbaW5kZXhdID0gdmFsdWUgYXMgbnVtYmVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHZhbHVlIGluIHRoZSBidWZmZXIgYXQgdGhlIHByb3ZpZGVkIGxvY2F0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gbG9jcyBUaGUgbG9jYXRpb24gaW5kaWNlcy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICAgKi9cbiAgZ2V0KC4uLmxvY3M6IG51bWJlcltdKTogU2luZ2xlVmFsdWVNYXBbRF0ge1xuICAgIGlmIChsb2NzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgbG9jcyA9IFswXTtcbiAgICB9XG4gICAgbGV0IGkgPSAwO1xuICAgIGZvciAoY29uc3QgbG9jIG9mIGxvY3MpIHtcbiAgICAgIGlmIChsb2MgPCAwIHx8IGxvYyA+PSB0aGlzLnNoYXBlW2ldKSB7XG4gICAgICAgIGNvbnN0IG1zZyA9IGBSZXF1ZXN0ZWQgb3V0IG9mIHJhbmdlIGVsZW1lbnQgYXQgJHtsb2NzfS4gYCArXG4gICAgICAgICAgICBgICBCdWZmZXIgc2hhcGU9JHt0aGlzLnNoYXBlfWA7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgaSsrO1xuICAgIH1cbiAgICBsZXQgaW5kZXggPSBsb2NzW2xvY3MubGVuZ3RoIC0gMV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgaW5kZXggKz0gdGhpcy5zdHJpZGVzW2ldICogbG9jc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudmFsdWVzW2luZGV4XSBhcyBTaW5nbGVWYWx1ZU1hcFtEXTtcbiAgfVxuXG4gIGxvY1RvSW5kZXgobG9jczogbnVtYmVyW10pOiBudW1iZXIge1xuICAgIGlmICh0aGlzLnJhbmsgPT09IDApIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICByZXR1cm4gbG9jc1swXTtcbiAgICB9XG4gICAgbGV0IGluZGV4ID0gbG9jc1tsb2NzLmxlbmd0aCAtIDFdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jcy5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgIGluZGV4ICs9IHRoaXMuc3RyaWRlc1tpXSAqIGxvY3NbaV07XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIGluZGV4VG9Mb2MoaW5kZXg6IG51bWJlcik6IG51bWJlcltdIHtcbiAgICBpZiAodGhpcy5yYW5rID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfSBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDEpIHtcbiAgICAgIHJldHVybiBbaW5kZXhdO1xuICAgIH1cbiAgICBjb25zdCBsb2NzOiBudW1iZXJbXSA9IG5ldyBBcnJheSh0aGlzLnNoYXBlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NzLmxlbmd0aCAtIDE7ICsraSkge1xuICAgICAgbG9jc1tpXSA9IE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLnN0cmlkZXNbaV0pO1xuICAgICAgaW5kZXggLT0gbG9jc1tpXSAqIHRoaXMuc3RyaWRlc1tpXTtcbiAgICB9XG4gICAgbG9jc1tsb2NzLmxlbmd0aCAtIDFdID0gaW5kZXg7XG4gICAgcmV0dXJuIGxvY3M7XG4gIH1cblxuICBnZXQgcmFuaygpIHtcbiAgICByZXR1cm4gdGhpcy5zaGFwZS5sZW5ndGg7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhbiBpbW11dGFibGUgYHRmLlRlbnNvcmAgb2JqZWN0IGZyb20gdGhlIGJ1ZmZlci5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICAgKi9cbiAgdG9UZW5zb3IoKTogVGVuc29yPFI+IHtcbiAgICByZXR1cm4gdHJhY2tlckZuKCkubWFrZVRlbnNvcih0aGlzLnZhbHVlcywgdGhpcy5zaGFwZSwgdGhpcy5kdHlwZSkgYXNcbiAgICAgICAgVGVuc29yPFI+O1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGF0YVRvR1BVV2ViR0xPcHRpb24ge1xuICBjdXN0b21UZXhTaGFwZT86IFtudW1iZXIsIG51bWJlcl07XG59XG5cbmV4cG9ydCB0eXBlIERhdGFUb0dQVU9wdGlvbnMgPSBEYXRhVG9HUFVXZWJHTE9wdGlvbjtcblxuZXhwb3J0IGludGVyZmFjZSBHUFVEYXRhIHtcbiAgdGVuc29yUmVmOiBUZW5zb3I7XG4gIHRleHR1cmU/OiBXZWJHTFRleHR1cmU7XG4gIGJ1ZmZlcj86IEdQVUJ1ZmZlcjtcbiAgdGV4U2hhcGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICBidWZTaXplPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvclRyYWNrZXIge1xuICBtYWtlVGVuc29yKFxuICAgICAgdmFsdWVzOiBEYXRhVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIGJhY2tlbmQ/OiBCYWNrZW5kKTogVGVuc29yO1xuICBtYWtlVmFyaWFibGUoXG4gICAgICBpbml0aWFsVmFsdWU6IFRlbnNvciwgdHJhaW5hYmxlPzogYm9vbGVhbiwgbmFtZT86IHN0cmluZyxcbiAgICAgIGR0eXBlPzogRGF0YVR5cGUpOiBWYXJpYWJsZTtcbiAgaW5jUmVmKGE6IFRlbnNvciwgYmFja2VuZDogQmFja2VuZCk6IHZvaWQ7XG4gIGRpc3Bvc2VUZW5zb3IodDogVGVuc29yKTogdm9pZDtcbiAgZGlzcG9zZVZhcmlhYmxlKHY6IFZhcmlhYmxlKTogdm9pZDtcbiAgcmVhZChkYXRhSWQ6IERhdGFJZCk6IFByb21pc2U8QmFja2VuZFZhbHVlcz47XG4gIHJlYWRTeW5jKGRhdGFJZDogRGF0YUlkKTogQmFja2VuZFZhbHVlcztcbiAgcmVhZFRvR1BVKGRhdGFJZDogRGF0YUlkLCBvcHRpb25zPzogRGF0YVRvR1BVT3B0aW9ucyk6IEdQVURhdGE7XG59XG5cbi8qKlxuICogVGhlIFRlbnNvciBjbGFzcyBjYWxscyBpbnRvIHRoaXMgaGFuZGxlciB0byBkZWxlZ2F0ZSBjaGFpbmluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wSGFuZGxlciB7XG4gIGNhc3Q8VCBleHRlbmRzIFRlbnNvcj4oeDogVCwgZHR5cGU6IERhdGFUeXBlKTogVDtcbiAgYnVmZmVyPFIgZXh0ZW5kcyBSYW5rLCBEIGV4dGVuZHMgRGF0YVR5cGU+KFxuICAgICAgc2hhcGU6IFNoYXBlTWFwW1JdLCBkdHlwZTogRCxcbiAgICAgIHZhbHVlcz86IERhdGFUeXBlTWFwW0RdKTogVGVuc29yQnVmZmVyPFIsIEQ+O1xuICBwcmludDxUIGV4dGVuZHMgVGVuc29yPih4OiBULCB2ZXJib3NlOiBib29sZWFuKTogdm9pZDtcbiAgY2xvbmU8VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6IFQ7XG4gIC8vIFRPRE8oeWFzc29nYmEpIGJyaW5nIHJlc2hhcGUgYmFjaz9cbn1cblxuLy8gRm9yIHRyYWNraW5nIHRlbnNvciBjcmVhdGlvbiBhbmQgZGlzcG9zYWwuXG5sZXQgdHJhY2tlckZuOiAoKSA9PiBUZW5zb3JUcmFja2VyID0gbnVsbDtcbi8vIFVzZWQgYnkgY2hhaW5pbmcgbWV0aG9kcyB0byBjYWxsIGludG8gb3BzLlxubGV0IG9wSGFuZGxlcjogT3BIYW5kbGVyID0gbnVsbDtcbi8vIFVzZWQgdG8gd2FybiBhYm91dCBkZXByZWNhdGVkIG1ldGhvZHMuXG5sZXQgZGVwcmVjYXRpb25XYXJuaW5nRm46IChtc2c6IHN0cmluZykgPT4gdm9pZCA9IG51bGw7XG4vLyBUaGlzIGhlcmUgc28gdGhhdCB3ZSBjYW4gdXNlIHRoaXMgbWV0aG9kIG9uIGRldiBicmFuY2hlcyBhbmQga2VlcCB0aGVcbi8vIGZ1bmN0aW9uYWxpdHkgYXQgbWFzdGVyLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5bZGVwcmVjYXRpb25XYXJuaW5nRm5dO1xuXG4vKipcbiAqIEFuIGV4dGVybmFsIGNvbnN1bWVyIGNhbiByZWdpc3RlciBpdHNlbGYgYXMgdGhlIHRlbnNvciB0cmFja2VyLiBUaGlzIHdheVxuICogdGhlIFRlbnNvciBjbGFzcyBjYW4gbm90aWZ5IHRoZSB0cmFja2VyIGZvciBldmVyeSB0ZW5zb3IgY3JlYXRlZCBhbmRcbiAqIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VGVuc29yVHJhY2tlcihmbjogKCkgPT4gVGVuc29yVHJhY2tlcikge1xuICB0cmFja2VyRm4gPSBmbjtcbn1cblxuLyoqXG4gKiBBbiBleHRlcm5hbCBjb25zdW1lciBjYW4gcmVnaXN0ZXIgaXRzZWxmIGFzIHRoZSBvcCBoYW5kbGVyLiBUaGlzIHdheSB0aGVcbiAqIFRlbnNvciBjbGFzcyBjYW4gaGF2ZSBjaGFpbmluZyBtZXRob2RzIHRoYXQgY2FsbCBpbnRvIG9wcyB2aWEgdGhlIG9wXG4gKiBoYW5kbGVyLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0T3BIYW5kbGVyKGhhbmRsZXI6IE9wSGFuZGxlcikge1xuICBvcEhhbmRsZXIgPSBoYW5kbGVyO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGRlcHJlY2F0aW9uIHdhcm5pbmcgZnVuY3Rpb24gdG8gYmUgdXNlZCBieSB0aGlzIGZpbGUuIFRoaXMgd2F5IHRoZVxuICogVGVuc29yIGNsYXNzIGNhbiBiZSBhIGxlYWYgYnV0IHN0aWxsIHVzZSB0aGUgZW52aXJvbm1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXREZXByZWNhdGlvbldhcm5pbmdGbihmbjogKG1zZzogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGRlcHJlY2F0aW9uV2FybmluZ0ZuID0gZm47XG59XG5cbi8qKlxuICogV2Ugd3JhcCBkYXRhIGlkIHNpbmNlIHdlIHVzZSB3ZWFrIG1hcCB0byBhdm9pZCBtZW1vcnkgbGVha3MuXG4gKiBTaW5jZSB3ZSBoYXZlIG91ciBvd24gbWVtb3J5IG1hbmFnZW1lbnQsIHdlIGhhdmUgYSByZWZlcmVuY2UgY291bnRlclxuICogbWFwcGluZyBhIHRlbnNvciB0byBpdHMgZGF0YSwgc28gdGhlcmUgaXMgYWx3YXlzIGEgcG9pbnRlciAoZXZlbiBpZiB0aGF0XG4gKiBkYXRhIGlzIG90aGVyd2lzZSBnYXJiYWdlIGNvbGxlY3RhYmxlKS5cbiAqIFNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9cbiAqIEdsb2JhbF9PYmplY3RzL1dlYWtNYXBcbiAqL1xuZXhwb3J0IHR5cGUgRGF0YUlkID0gb2JqZWN0OyAgLy8gb2JqZWN0IGluc3RlYWQgb2Yge30gdG8gZm9yY2Ugbm9uLXByaW1pdGl2ZS5cblxuLy8gRGVjbGFyZSB0aGlzIG5hbWVzcGFjZSB0byBtYWtlIFRlbnNvciBjbGFzcyBhdWdtZW50YXRpb24gd29yayBpbiBnb29nbGUzLlxuZXhwb3J0IGRlY2xhcmUgbmFtZXNwYWNlIFRlbnNvciB7fVxuLyoqXG4gKiBBIGB0Zi5UZW5zb3JgIG9iamVjdCByZXByZXNlbnRzIGFuIGltbXV0YWJsZSwgbXVsdGlkaW1lbnNpb25hbCBhcnJheSBvZlxuICogbnVtYmVycyB0aGF0IGhhcyBhIHNoYXBlIGFuZCBhIGRhdGEgdHlwZS5cbiAqXG4gKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgZnVuY3Rpb25zIHRoYXQgY3JlYXRlIHRlbnNvcnMgZG8gbm90IG5lY2Vzc2FyaWx5XG4gKiBwZXJmb3JtIGEgY29weSBvZiB0aGUgZGF0YSBwYXNzZWQgdG8gdGhlbSAoZS5nLiBpZiB0aGUgZGF0YSBpcyBwYXNzZWQgYXMgYVxuICogYEZsb2F0MzJBcnJheWApLCBhbmQgY2hhbmdlcyB0byB0aGUgZGF0YSB3aWxsIGNoYW5nZSB0aGUgdGVuc29yLiBUaGlzIGlzIG5vdFxuICogYSBmZWF0dXJlIGFuZCBpcyBub3Qgc3VwcG9ydGVkLiBUbyBhdm9pZCB0aGlzIGJlaGF2aW9yLCB1c2UgdGhlIHRlbnNvciBiZWZvcmVcbiAqIGNoYW5naW5nIHRoZSBpbnB1dCBkYXRhIG9yIGNyZWF0ZSBhIGNvcHkgd2l0aCBgY29weSA9IHRmLmFkZCh5b3VyVGVuc29yLCAwKWAuXG4gKlxuICogU2VlIGB0Zi50ZW5zb3JgIGZvciBkZXRhaWxzIG9uIGhvdyB0byBjcmVhdGUgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgLyoqIFVuaXF1ZSBpZCBvZiB0aGlzIHRlbnNvci4gKi9cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgLyoqXG4gICAqIElkIG9mIHRoZSBidWNrZXQgaG9sZGluZyB0aGUgZGF0YSBmb3IgdGhpcyB0ZW5zb3IuIE11bHRpcGxlIGFycmF5cyBjYW5cbiAgICogcG9pbnQgdG8gdGhlIHNhbWUgYnVja2V0IChlLmcuIHdoZW4gY2FsbGluZyBhcnJheS5yZXNoYXBlKCkpLlxuICAgKi9cbiAgZGF0YUlkOiBEYXRhSWQ7XG4gIC8qKiBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gKi9cbiAgcmVhZG9ubHkgc2hhcGU6IFNoYXBlTWFwW1JdO1xuICAvKiogTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB0ZW5zb3IuICovXG4gIHJlYWRvbmx5IHNpemU6IG51bWJlcjtcbiAgLyoqIFRoZSBkYXRhIHR5cGUgZm9yIHRoZSBhcnJheS4gKi9cbiAgcmVhZG9ubHkgZHR5cGU6IERhdGFUeXBlO1xuICAvKiogVGhlIHJhbmsgdHlwZSBmb3IgdGhlIGFycmF5IChzZWUgYFJhbmtgIGVudW0pLiAqL1xuICByZWFkb25seSByYW5rVHlwZTogUjtcblxuICAvKiogV2hldGhlciB0aGlzIHRlbnNvciBoYXMgYmVlbiBnbG9iYWxseSBrZXB0LiAqL1xuICBrZXB0ID0gZmFsc2U7XG4gIC8qKiBUaGUgaWQgb2YgdGhlIHNjb3BlIHRoaXMgdGVuc29yIGlzIGJlaW5nIHRyYWNrZWQgaW4uICovXG4gIHNjb3BlSWQ6IG51bWJlcjtcblxuICAvKipcbiAgICogTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNraXAgaW4gZWFjaCBkaW1lbnNpb24gd2hlbiBpbmRleGluZy4gU2VlXG4gICAqIGh0dHBzOi8vZG9jcy5zY2lweS5vcmcvZG9jL251bXB5L3JlZmVyZW5jZS9nZW5lcmF0ZWQvXFxcbiAgICogbnVtcHkubmRhcnJheS5zdHJpZGVzLmh0bWxcbiAgICovXG4gIHJlYWRvbmx5IHN0cmlkZXM6IG51bWJlcltdO1xuXG4gIGNvbnN0cnVjdG9yKHNoYXBlOiBTaGFwZU1hcFtSXSwgZHR5cGU6IERhdGFUeXBlLCBkYXRhSWQ6IERhdGFJZCwgaWQ6IG51bWJlcikge1xuICAgIHRoaXMuc2hhcGUgPSBzaGFwZS5zbGljZSgpIGFzIFNoYXBlTWFwW1JdO1xuICAgIHRoaXMuZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgdGhpcy5zaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICB0aGlzLnN0cmlkZXMgPSBjb21wdXRlU3RyaWRlcyhzaGFwZSk7XG4gICAgdGhpcy5kYXRhSWQgPSBkYXRhSWQ7XG4gICAgdGhpcy5pZCA9IGlkO1xuICAgIHRoaXMucmFua1R5cGUgPSAodGhpcy5yYW5rIDwgNSA/IHRoaXMucmFuay50b1N0cmluZygpIDogJ2hpZ2hlcicpIGFzIFI7XG4gIH1cblxuICBnZXQgcmFuaygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNoYXBlLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgcHJvbWlzZSBvZiBgdGYuVGVuc29yQnVmZmVyYCB0aGF0IGhvbGRzIHRoZSB1bmRlcmx5aW5nIGRhdGEuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgYnVmZmVyPEQgZXh0ZW5kcyBEYXRhVHlwZSA9ICdmbG9hdDMyJz4oKTogUHJvbWlzZTxUZW5zb3JCdWZmZXI8UiwgRD4+IHtcbiAgICBjb25zdCB2YWxzID0gYXdhaXQgdGhpcy5kYXRhPEQ+KCk7XG4gICAgcmV0dXJuIG9wSGFuZGxlci5idWZmZXIodGhpcy5zaGFwZSwgdGhpcy5kdHlwZSBhcyBELCB2YWxzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGEgYHRmLlRlbnNvckJ1ZmZlcmAgdGhhdCBob2xkcyB0aGUgdW5kZXJseWluZyBkYXRhLlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGJ1ZmZlclN5bmM8RCBleHRlbmRzIERhdGFUeXBlID0gJ2Zsb2F0MzInPigpOiBUZW5zb3JCdWZmZXI8UiwgRD4ge1xuICAgIHJldHVybiBvcEhhbmRsZXIuYnVmZmVyKHRoaXMuc2hhcGUsIHRoaXMuZHR5cGUgYXMgRCwgdGhpcy5kYXRhU3luYygpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgKiBhc3luY2hyb25vdXNseS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyBhcnJheSgpOiBQcm9taXNlPEFycmF5TWFwW1JdPiB7XG4gICAgY29uc3QgdmFscyA9IGF3YWl0IHRoaXMuZGF0YSgpO1xuICAgIHJldHVybiB0b05lc3RlZEFycmF5KHRoaXMuc2hhcGUsIHZhbHMsIHRoaXMuZHR5cGUgPT09ICdjb21wbGV4NjQnKSBhc1xuICAgICAgICBBcnJheU1hcFtSXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSB0ZW5zb3IgZGF0YSBhcyBhIG5lc3RlZCBhcnJheS4gVGhlIHRyYW5zZmVyIG9mIGRhdGEgaXMgZG9uZVxuICAgKiBzeW5jaHJvbm91c2x5LlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFycmF5U3luYygpOiBBcnJheU1hcFtSXSB7XG4gICAgcmV0dXJuIHRvTmVzdGVkQXJyYXkoXG4gICAgICAgICAgICAgICB0aGlzLnNoYXBlLCB0aGlzLmRhdGFTeW5jKCksIHRoaXMuZHR5cGUgPT09ICdjb21wbGV4NjQnKSBhc1xuICAgICAgICBBcnJheU1hcFtSXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBc3luY2hyb25vdXNseSBkb3dubG9hZHMgdGhlIHZhbHVlcyBmcm9tIHRoZSBgdGYuVGVuc29yYC4gUmV0dXJucyBhXG4gICAqIHByb21pc2Ugb2YgYFR5cGVkQXJyYXlgIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY29tcHV0YXRpb24gaGFzIGZpbmlzaGVkLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFzeW5jIGRhdGE8RCBleHRlbmRzIERhdGFUeXBlID0gTnVtZXJpY0RhdGFUeXBlPigpOiBQcm9taXNlPERhdGFUeXBlTWFwW0RdPiB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBkYXRhID0gdHJhY2tlckZuKCkucmVhZCh0aGlzLmRhdGFJZCk7XG4gICAgaWYgKHRoaXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBieXRlcyA9IGF3YWl0IGRhdGEgYXMgVWludDhBcnJheVtdO1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGJ5dGVzLm1hcChiID0+IHV0aWwuZGVjb2RlU3RyaW5nKGIpKSBhcyBEYXRhVHlwZU1hcFtEXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnRmFpbGVkIHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTguICcgK1xuICAgICAgICAgICAgJ1RvIGdldCB0aGUgb3JpZ2luYWwgYnl0ZXMsIGNhbGwgdGVuc29yLmJ5dGVzKCkuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhIGFzIFByb21pc2U8RGF0YVR5cGVNYXBbRF0+O1xuICB9XG5cbiAgLyoqXG4gICAqIENvcHkgdGhlIHRlbnNvcidzIGRhdGEgdG8gYSBuZXcgR1BVIHJlc291cmNlLiBDb21wYXJpbmcgdG8gdGhlIGBkYXRhU3luYygpYFxuICAgKiBhbmQgYGRhdGEoKWAsIHRoaXMgbWV0aG9kIHByZXZlbnRzIGRhdGEgZnJvbSBiZWluZyBkb3dubG9hZGVkIHRvIENQVS5cbiAgICpcbiAgICogRm9yIFdlYkdMIGJhY2tlbmQsIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkIG9uIGEgZGVuc2VseSBwYWNrZWQgdGV4dHVyZS5cbiAgICogVGhpcyBtZWFucyB0aGF0IHRoZSB0ZXh0dXJlIHdpbGwgdXNlIHRoZSBSR0JBIGNoYW5uZWxzIHRvIHN0b3JlIHZhbHVlLlxuICAgKlxuICAgKiBGb3IgV2ViR1BVIGJhY2tlbmQsIHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkIG9uIGEgYnVmZmVyLiBUaGVyZSBpcyBub1xuICAgKiBwYXJhbWV0ZXIsIHNvIGNhbiBub3QgdXNlIGEgdXNlci1kZWZpbmVkIHNpemUgdG8gY3JlYXRlIHRoZSBidWZmZXIuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zOlxuICAgKiAgICAgRm9yIFdlYkdMLFxuICAgKiAgICAgICAgIC0gY3VzdG9tVGV4U2hhcGU6IE9wdGlvbmFsLiBJZiBzZXQsIHdpbGwgdXNlIHRoZSB1c2VyIGRlZmluZWRcbiAgICogICAgIHRleHR1cmUgc2hhcGUgdG8gY3JlYXRlIHRoZSB0ZXh0dXJlLlxuICAgKlxuICAgKiBAcmV0dXJucyBGb3IgV2ViR0wgYmFja2VuZCwgYSBHUFVEYXRhIGNvbnRhaW5zIHRoZSBuZXcgdGV4dHVyZSBhbmRcbiAgICogICAgIGl0cyBpbmZvcm1hdGlvbi5cbiAgICogICAgIHtcbiAgICogICAgICAgIHRlbnNvclJlZjogVGhlIHRlbnNvciB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRleHR1cmUsXG4gICAqICAgICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAqICAgICAgICB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSAvLyBbaGVpZ2h0LCB3aWR0aF1cbiAgICogICAgIH1cbiAgICpcbiAgICogICAgIEZvciBXZWJHUFUgYmFja2VuZCwgYSBHUFVEYXRhIGNvbnRhaW5zIHRoZSBuZXcgYnVmZmVyIGFuZFxuICAgKiAgICAgaXRzIGluZm9ybWF0aW9uLlxuICAgKiAgICAge1xuICAgKiAgICAgICAgdGVuc29yUmVmOiBUaGUgdGVuc29yIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgYnVmZmVyLFxuICAgKiAgICAgICAgYnVmZmVyOiBHUFVCdWZmZXIsXG4gICAqICAgICAgICBidWZTaXplOiBudW1iZXJcbiAgICogICAgIH1cbiAgICpcbiAgICogICAgIFJlbWVtYmVyIHRvIGRpc3Bvc2UgdGhlIEdQVURhdGEgYWZ0ZXIgaXQgaXMgdXNlZCBieVxuICAgKiAgICAgYHJlcy50ZW5zb3JSZWYuZGlzcG9zZSgpYC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBkYXRhVG9HUFUob3B0aW9ucz86IERhdGFUb0dQVU9wdGlvbnMpOiBHUFVEYXRhIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiB0cmFja2VyRm4oKS5yZWFkVG9HUFUodGhpcy5kYXRhSWQsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFN5bmNocm9ub3VzbHkgZG93bmxvYWRzIHRoZSB2YWx1ZXMgZnJvbSB0aGUgYHRmLlRlbnNvcmAuIFRoaXMgYmxvY2tzIHRoZVxuICAgKiBVSSB0aHJlYWQgdW50aWwgdGhlIHZhbHVlcyBhcmUgcmVhZHksIHdoaWNoIGNhbiBjYXVzZSBwZXJmb3JtYW5jZSBpc3N1ZXMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgZGF0YVN5bmM8RCBleHRlbmRzIERhdGFUeXBlID0gTnVtZXJpY0RhdGFUeXBlPigpOiBEYXRhVHlwZU1hcFtEXSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBkYXRhID0gdHJhY2tlckZuKCkucmVhZFN5bmModGhpcy5kYXRhSWQpO1xuICAgIGlmICh0aGlzLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIChkYXRhIGFzIFVpbnQ4QXJyYXlbXSkubWFwKGIgPT4gdXRpbC5kZWNvZGVTdHJpbmcoYikpIGFzXG4gICAgICAgICAgICBEYXRhVHlwZU1hcFtEXTtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnRmFpbGVkIHRvIGRlY29kZSB0aGUgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTguICcgK1xuICAgICAgICAgICAgJ1RvIGdldCB0aGUgb3JpZ2luYWwgYnl0ZXMsIGNhbGwgdGVuc29yLmJ5dGVzKCkuJyk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkYXRhIGFzIERhdGFUeXBlTWFwW0RdO1xuICB9XG5cbiAgLyoqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgb2YgdGhlIHRlbnNvcidzIGRhdGEuICovXG4gIGFzeW5jIGJ5dGVzKCk6IFByb21pc2U8VWludDhBcnJheVtdfFVpbnQ4QXJyYXk+IHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGNvbnN0IGRhdGEgPSBhd2FpdCB0cmFja2VyRm4oKS5yZWFkKHRoaXMuZGF0YUlkKTtcbiAgICBpZiAodGhpcy5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBkYXRhIGFzIFVpbnQ4QXJyYXlbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KChkYXRhIGFzIFR5cGVkQXJyYXkpLmJ1ZmZlcik7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGB0Zi5UZW5zb3JgIGZyb20gbWVtb3J5LlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cmFja2VyRm4oKS5kaXNwb3NlVGVuc29yKHRoaXMpO1xuICAgIHRoaXMuaXNEaXNwb3NlZEludGVybmFsID0gdHJ1ZTtcbiAgfVxuXG4gIHByb3RlY3RlZCBpc0Rpc3Bvc2VkSW50ZXJuYWwgPSBmYWxzZTtcbiAgZ2V0IGlzRGlzcG9zZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuaXNEaXNwb3NlZEludGVybmFsO1xuICB9XG5cbiAgdGhyb3dJZkRpc3Bvc2VkKCkge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yIGlzIGRpc3Bvc2VkLmApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcmludHMgdGhlIGB0Zi5UZW5zb3JgLiBTZWUgYHRmLnByaW50YCBmb3IgZGV0YWlscy5cbiAgICpcbiAgICogQHBhcmFtIHZlcmJvc2UgV2hldGhlciB0byBwcmludCB2ZXJib3NlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0ZW5zb3IsXG4gICAqICAgIGluY2x1ZGluZyBkdHlwZSBhbmQgc2l6ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBwcmludCh2ZXJib3NlID0gZmFsc2UpOiB2b2lkIHtcbiAgICByZXR1cm4gb3BIYW5kbGVyLnByaW50KHRoaXMsIHZlcmJvc2UpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSB0ZW5zb3IuIFNlZSBgdGYuY2xvbmVgIGZvciBkZXRhaWxzLlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGNsb25lPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBvcEhhbmRsZXIuY2xvbmUodGhpcyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZW5zb3IuIFVzZWZ1bCBmb3IgbG9nZ2luZy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICB0b1N0cmluZyh2ZXJib3NlID0gZmFsc2UpOiBzdHJpbmcge1xuICAgIGNvbnN0IHZhbHMgPSB0aGlzLmRhdGFTeW5jKCk7XG4gICAgcmV0dXJuIHRlbnNvclRvU3RyaW5nKHZhbHMsIHRoaXMuc2hhcGUsIHRoaXMuZHR5cGUsIHZlcmJvc2UpO1xuICB9XG5cbiAgY2FzdDxUIGV4dGVuZHMgdGhpcz4oZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gb3BIYW5kbGVyLmNhc3QodGhpcyBhcyBULCBkdHlwZSk7XG4gIH1cbiAgdmFyaWFibGUodHJhaW5hYmxlID0gdHJ1ZSwgbmFtZT86IHN0cmluZywgZHR5cGU/OiBEYXRhVHlwZSk6IFZhcmlhYmxlPFI+IHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiB0cmFja2VyRm4oKS5tYWtlVmFyaWFibGUodGhpcywgdHJhaW5hYmxlLCBuYW1lLCBkdHlwZSkgYXNcbiAgICAgICAgVmFyaWFibGU8Uj47XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFRlbnNvciwgU3ltYm9sLmhhc0luc3RhbmNlLCB7XG4gIHZhbHVlOiAoaW5zdGFuY2U6IFRlbnNvcikgPT4ge1xuICAgIC8vIEltcGxlbWVudGF0aW9uIG5vdGU6IHdlIHNob3VsZCB1c2UgcHJvcGVydGllcyBvZiB0aGUgb2JqZWN0IHRoYXQgd2lsbCBiZVxuICAgIC8vIGRlZmluZWQgYmVmb3JlIHRoZSBjb25zdHJ1Y3RvciBib2R5IGhhcyBmaW5pc2hlZCBleGVjdXRpbmcgKG1ldGhvZHMpLlxuICAgIC8vIFRoaXMgaXMgYmVjYXVzZSB3aGVuIHRoaXMgY29kZSBpcyB0cmFuc3BpbGVkIGJ5IGJhYmVsLCBiYWJlbCB3aWxsIGNhbGxcbiAgICAvLyBjbGFzc0NhbGxDaGVjayBiZWZvcmUgdGhlIGNvbnN0cnVjdG9yIGJvZHkgaXMgcnVuLlxuICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8zMzg0IGZvciBiYWNrc3RvcnkuXG4gICAgcmV0dXJuICEhaW5zdGFuY2UgJiYgaW5zdGFuY2UuZGF0YSAhPSBudWxsICYmIGluc3RhbmNlLmRhdGFTeW5jICE9IG51bGwgJiZcbiAgICAgICAgaW5zdGFuY2UudGhyb3dJZkRpc3Bvc2VkICE9IG51bGw7XG4gIH1cbn0pO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKSB7XG4gIC8vIFVzZSBnZXRHbG9iYWwgc28gdGhhdCB3ZSBjYW4gYXVnbWVudCB0aGUgVGVuc29yIGNsYXNzIGFjcm9zcyBwYWNrYWdlXG4gIC8vIGJvdW5kYXJpZXMgYmVjYXNlIHRoZSBub2RlIHJlc29sdXRpb24gYWxnIG1heSByZXN1bHQgaW4gZGlmZmVyZW50IG1vZHVsZXNcbiAgLy8gYmVpbmcgcmV0dXJuZWQgZm9yIHRoaXMgZmlsZSBkZXBlbmRpbmcgb24gdGhlIHBhdGggdGhleSBhcmUgbG9hZGVkIGZyb20uXG4gIHJldHVybiBnZXRHbG9iYWwoJ1RlbnNvcicsICgpID0+IHtcbiAgICByZXR1cm4gVGVuc29yO1xuICB9KTtcbn1cblxuLy8gR2xvYmFsIHNpZGUgZWZmZWN0LiBDYWNoZSBnbG9iYWwgcmVmZXJlbmNlIHRvIFRlbnNvciBjbGFzc1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKTtcblxuZXhwb3J0IGludGVyZmFjZSBOdW1lcmljVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4gZXh0ZW5kcyBUZW5zb3I8Uj4ge1xuICBkdHlwZTogTnVtZXJpY0RhdGFUeXBlO1xuICBkYXRhU3luYzxEIGV4dGVuZHMgRGF0YVR5cGUgPSBOdW1lcmljRGF0YVR5cGU+KCk6IERhdGFUeXBlTWFwW0RdO1xuICBkYXRhPEQgZXh0ZW5kcyBEYXRhVHlwZSA9IE51bWVyaWNEYXRhVHlwZT4oKTogUHJvbWlzZTxEYXRhVHlwZU1hcFtEXT47XG4gIGRhdGFUb0dQVShvcHRpb25zPzogRGF0YVRvR1BVT3B0aW9ucyk6IEdQVURhdGE7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3RyaW5nVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4gZXh0ZW5kcyBUZW5zb3I8Uj4ge1xuICBkdHlwZTogJ3N0cmluZyc7XG4gIGRhdGFTeW5jPEQgZXh0ZW5kcyBEYXRhVHlwZSA9ICdzdHJpbmcnPigpOiBEYXRhVHlwZU1hcFtEXTtcbiAgZGF0YTxEIGV4dGVuZHMgRGF0YVR5cGUgPSAnc3RyaW5nJz4oKTogUHJvbWlzZTxEYXRhVHlwZU1hcFtEXT47XG59XG5cbi8qKiBAZG9jbGluayBUZW5zb3IgKi9cbmV4cG9ydCB0eXBlIFNjYWxhciA9IFRlbnNvcjxSYW5rLlIwPjtcbi8qKiBAZG9jbGluayBUZW5zb3IgKi9cbmV4cG9ydCB0eXBlIFRlbnNvcjFEID0gVGVuc29yPFJhbmsuUjE+O1xuLyoqIEBkb2NsaW5rIFRlbnNvciAqL1xuZXhwb3J0IHR5cGUgVGVuc29yMkQgPSBUZW5zb3I8UmFuay5SMj47XG4vKiogQGRvY2xpbmsgVGVuc29yICovXG5leHBvcnQgdHlwZSBUZW5zb3IzRCA9IFRlbnNvcjxSYW5rLlIzPjtcbi8qKiBAZG9jbGluayBUZW5zb3IgKi9cbmV4cG9ydCB0eXBlIFRlbnNvcjREID0gVGVuc29yPFJhbmsuUjQ+O1xuLyoqIEBkb2NsaW5rIFRlbnNvciAqL1xuZXhwb3J0IHR5cGUgVGVuc29yNUQgPSBUZW5zb3I8UmFuay5SNT47XG4vKiogQGRvY2xpbmsgVGVuc29yICovXG5leHBvcnQgdHlwZSBUZW5zb3I2RCA9IFRlbnNvcjxSYW5rLlI2PjtcblxuLyoqXG4gKiBBIG11dGFibGUgYHRmLlRlbnNvcmAsIHVzZWZ1bCBmb3IgcGVyc2lzdGluZyBzdGF0ZSwgZS5nLiBmb3IgdHJhaW5pbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBWYXJpYWJsZTxSIGV4dGVuZHMgUmFuayA9IFJhbms+IGV4dGVuZHMgVGVuc29yPFI+IHtcbiAgbmFtZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW5pdGlhbFZhbHVlOiBUZW5zb3I8Uj4sIHB1YmxpYyB0cmFpbmFibGU6IGJvb2xlYW4sIG5hbWU6IHN0cmluZyxcbiAgICAgIHRlbnNvcklkOiBudW1iZXIpIHtcbiAgICBzdXBlcihcbiAgICAgICAgaW5pdGlhbFZhbHVlLnNoYXBlLCBpbml0aWFsVmFsdWUuZHR5cGUsIGluaXRpYWxWYWx1ZS5kYXRhSWQsIHRlbnNvcklkKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLyoqXG4gICAqIEFzc2lnbiBhIG5ldyBgdGYuVGVuc29yYCB0byB0aGlzIHZhcmlhYmxlLiBUaGUgbmV3IGB0Zi5UZW5zb3JgIG11c3QgaGF2ZVxuICAgKiB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUgYXMgdGhlIG9sZCBgdGYuVGVuc29yYC5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZhbHVlIE5ldyB0ZW5zb3IgdG8gYmUgYXNzaWduZWQgdG8gdGhpcyB2YXJpYWJsZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3NpZ24obmV3VmFsdWU6IFRlbnNvcjxSPik6IHZvaWQge1xuICAgIGlmIChuZXdWYWx1ZS5kdHlwZSAhPT0gdGhpcy5kdHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBkdHlwZSBvZiB0aGUgbmV3IHZhbHVlICgke25ld1ZhbHVlLmR0eXBlfSkgYW5kIGAgK1xuICAgICAgICAgIGBwcmV2aW91cyB2YWx1ZSAoJHt0aGlzLmR0eXBlfSkgbXVzdCBtYXRjaGApO1xuICAgIH1cbiAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwobmV3VmFsdWUuc2hhcGUsIHRoaXMuc2hhcGUpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHNoYXBlIG9mIHRoZSBuZXcgdmFsdWUgKCR7bmV3VmFsdWUuc2hhcGV9KSBhbmQgYCArXG4gICAgICAgICAgYHByZXZpb3VzIHZhbHVlICgke3RoaXMuc2hhcGV9KSBtdXN0IG1hdGNoYCk7XG4gICAgfVxuICAgIHRyYWNrZXJGbigpLmRpc3Bvc2VUZW5zb3IodGhpcyk7XG4gICAgdGhpcy5kYXRhSWQgPSBuZXdWYWx1ZS5kYXRhSWQ7XG4gICAgdHJhY2tlckZuKCkuaW5jUmVmKHRoaXMsIG51bGwgLyogYmFja2VuZCAqLyk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRyYWNrZXJGbigpLmRpc3Bvc2VWYXJpYWJsZSh0aGlzKTtcbiAgICB0aGlzLmlzRGlzcG9zZWRJbnRlcm5hbCA9IHRydWU7XG4gIH1cbn1cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KFZhcmlhYmxlLCBTeW1ib2wuaGFzSW5zdGFuY2UsIHtcbiAgdmFsdWU6IChpbnN0YW5jZTogVmFyaWFibGUpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2UgaW5zdGFuY2VvZiBUZW5zb3IgJiYgaW5zdGFuY2UuYXNzaWduICE9IG51bGwgJiZcbiAgICAgICAgaW5zdGFuY2UuYXNzaWduIGluc3RhbmNlb2YgRnVuY3Rpb247XG4gIH1cbn0pO1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport var Rank;\n(function (Rank) {\n    Rank[\"R0\"] = \"R0\";\n    Rank[\"R1\"] = \"R1\";\n    Rank[\"R2\"] = \"R2\";\n    Rank[\"R3\"] = \"R3\";\n    Rank[\"R4\"] = \"R4\";\n    Rank[\"R5\"] = \"R5\";\n    Rank[\"R6\"] = \"R6\";\n})(Rank || (Rank = {}));\n// Looks for upcasting types. Used, for example, in operations with mixed dtype\n// inputs.\nvar UpcastInt32AndMap;\n(function (UpcastInt32AndMap) {\n    UpcastInt32AndMap[\"float32\"] = \"float32\";\n    UpcastInt32AndMap[\"int32\"] = \"int32\";\n    UpcastInt32AndMap[\"bool\"] = \"int32\";\n    UpcastInt32AndMap[\"complex64\"] = \"complex64\";\n})(UpcastInt32AndMap || (UpcastInt32AndMap = {}));\nvar UpcastBoolAndMap;\n(function (UpcastBoolAndMap) {\n    UpcastBoolAndMap[\"float32\"] = \"float32\";\n    UpcastBoolAndMap[\"int32\"] = \"int32\";\n    UpcastBoolAndMap[\"bool\"] = \"bool\";\n    UpcastBoolAndMap[\"complex64\"] = \"complex64\";\n})(UpcastBoolAndMap || (UpcastBoolAndMap = {}));\nvar UpcastFloat32AndMap;\n(function (UpcastFloat32AndMap) {\n    UpcastFloat32AndMap[\"float32\"] = \"float32\";\n    UpcastFloat32AndMap[\"int32\"] = \"float32\";\n    UpcastFloat32AndMap[\"bool\"] = \"float32\";\n    UpcastFloat32AndMap[\"complex64\"] = \"complex64\";\n})(UpcastFloat32AndMap || (UpcastFloat32AndMap = {}));\nvar UpcastComplex64AndMap;\n(function (UpcastComplex64AndMap) {\n    UpcastComplex64AndMap[\"float32\"] = \"complex64\";\n    UpcastComplex64AndMap[\"int32\"] = \"complex64\";\n    UpcastComplex64AndMap[\"bool\"] = \"complex64\";\n    UpcastComplex64AndMap[\"complex64\"] = \"complex64\";\n})(UpcastComplex64AndMap || (UpcastComplex64AndMap = {}));\nconst upcastTypeMap = {\n    'float32': UpcastFloat32AndMap,\n    'int32': UpcastInt32AndMap,\n    'bool': UpcastBoolAndMap,\n    'complex64': UpcastComplex64AndMap\n};\nexport function upcastType(typeA, typeB) {\n    if (typeA === 'string' || typeB === 'string') {\n        if (typeA === 'string' && typeB === 'string') {\n            return 'string';\n        }\n        throw new Error(`Can not upcast ${typeA} with ${typeB}`);\n    }\n    return upcastTypeMap[typeA][typeB];\n}\n/** Returns the output type after summation. */\nexport function sumOutType(type) {\n    return upcastType(type, 'int32');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQWlESCxNQUFNLENBQU4sSUFBWSxJQVFYO0FBUkQsV0FBWSxJQUFJO0lBQ2QsaUJBQVMsQ0FBQTtJQUNULGlCQUFTLENBQUE7SUFDVCxpQkFBUyxDQUFBO0lBQ1QsaUJBQVMsQ0FBQTtJQUNULGlCQUFTLENBQUE7SUFDVCxpQkFBUyxDQUFBO0lBQ1QsaUJBQVMsQ0FBQTtBQUNYLENBQUMsRUFSVyxJQUFJLEtBQUosSUFBSSxRQVFmO0FBV0QsK0VBQStFO0FBQy9FLFVBQVU7QUFDVixJQUFLLGlCQUtKO0FBTEQsV0FBSyxpQkFBaUI7SUFDcEIsd0NBQXFCLENBQUE7SUFDckIsb0NBQWlCLENBQUE7SUFDakIsbUNBQWdCLENBQUE7SUFDaEIsNENBQXlCLENBQUE7QUFDM0IsQ0FBQyxFQUxJLGlCQUFpQixLQUFqQixpQkFBaUIsUUFLckI7QUFFRCxJQUFLLGdCQUtKO0FBTEQsV0FBSyxnQkFBZ0I7SUFDbkIsdUNBQXFCLENBQUE7SUFDckIsbUNBQWlCLENBQUE7SUFDakIsaUNBQWUsQ0FBQTtJQUNmLDJDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMSSxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBS3BCO0FBRUQsSUFBSyxtQkFLSjtBQUxELFdBQUssbUJBQW1CO0lBQ3RCLDBDQUFxQixDQUFBO0lBQ3JCLHdDQUFtQixDQUFBO0lBQ25CLHVDQUFrQixDQUFBO0lBQ2xCLDhDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMSSxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBS3ZCO0FBRUQsSUFBSyxxQkFLSjtBQUxELFdBQUsscUJBQXFCO0lBQ3hCLDhDQUF1QixDQUFBO0lBQ3ZCLDRDQUFxQixDQUFBO0lBQ3JCLDJDQUFvQixDQUFBO0lBQ3BCLGdEQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMSSxxQkFBcUIsS0FBckIscUJBQXFCLFFBS3pCO0FBRUQsTUFBTSxhQUFhLEdBQUc7SUFDcEIsU0FBUyxFQUFFLG1CQUFtQjtJQUM5QixPQUFPLEVBQUUsaUJBQWlCO0lBQzFCLE1BQU0sRUFBRSxnQkFBZ0I7SUFDeEIsV0FBVyxFQUFFLHFCQUFxQjtDQUNuQyxDQUFDO0FBRUYsTUFBTSxVQUFVLFVBQVUsQ0FBQyxLQUFlLEVBQUUsS0FBZTtJQUN6RCxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM1QyxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM1QyxPQUFPLFFBQVEsQ0FBQztTQUNqQjtRQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsa0JBQWtCLEtBQUssU0FBUyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsT0FBTyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDckMsQ0FBQztBQUVELCtDQUErQztBQUMvQyxNQUFNLFVBQVUsVUFBVSxDQUFDLElBQWM7SUFDdkMsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKiBAZG9jYWxpYXMgbnVtYmVyW10gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2hhcGVNYXAge1xuICBSMDogbnVtYmVyW107XG4gIFIxOiBbbnVtYmVyXTtcbiAgUjI6IFtudW1iZXIsIG51bWJlcl07XG4gIFIzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIFI0OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgUjU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIFI2OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG59XG5cbi8qKiBAZG9jYWxpYXMgbnVtYmVyW10gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXJyYXlNYXAge1xuICBSMDogbnVtYmVyO1xuICBSMTogbnVtYmVyW107XG4gIFIyOiBudW1iZXJbXVtdO1xuICBSMzogbnVtYmVyW11bXVtdO1xuICBSNDogbnVtYmVyW11bXVtdW107XG4gIFI1OiBudW1iZXJbXVtdW11bXVtdO1xuICBSNjogbnVtYmVyW11bXVtdW11bXVtdO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIERhdGFUeXBlTWFwIHtcbiAgZmxvYXQzMjogRmxvYXQzMkFycmF5O1xuICBpbnQzMjogSW50MzJBcnJheTtcbiAgYm9vbDogVWludDhBcnJheTtcbiAgY29tcGxleDY0OiBGbG9hdDMyQXJyYXk7XG4gIHN0cmluZzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2luZ2xlVmFsdWVNYXAge1xuICBib29sOiBib29sZWFuO1xuICBpbnQzMjogbnVtYmVyO1xuICBmbG9hdDMyOiBudW1iZXI7XG4gIGNvbXBsZXg2NDogbnVtYmVyO1xuICBzdHJpbmc6IHN0cmluZztcbn1cblxuLyoqIEBkb2NhbGlhcyAnZmxvYXQzMid8J2ludDMyJ3wnYm9vbCd8J2NvbXBsZXg2NCd8J3N0cmluZycgKi9cbmV4cG9ydCB0eXBlIERhdGFUeXBlID0ga2V5b2YgRGF0YVR5cGVNYXA7XG5leHBvcnQgdHlwZSBOdW1lcmljRGF0YVR5cGUgPSAnZmxvYXQzMid8J2ludDMyJ3wnYm9vbCd8J2NvbXBsZXg2NCc7XG5leHBvcnQgdHlwZSBUeXBlZEFycmF5ID0gRmxvYXQzMkFycmF5fEludDMyQXJyYXl8VWludDhBcnJheTtcbi8qKiBUZW5zb3IgZGF0YSB1c2VkIGluIHRlbnNvciBjcmVhdGlvbiBhbmQgdXNlci1mYWNpbmcgQVBJLiAqL1xuZXhwb3J0IHR5cGUgRGF0YVZhbHVlcyA9IERhdGFUeXBlTWFwW0RhdGFUeXBlXTtcbi8qKiBUaGUgdW5kZXJseWluZyB0ZW5zb3IgZGF0YSB0aGF0IGdldHMgc3RvcmVkIGluIGEgYmFja2VuZC4gKi9cbmV4cG9ydCB0eXBlIEJhY2tlbmRWYWx1ZXMgPSBGbG9hdDMyQXJyYXl8SW50MzJBcnJheXxVaW50OEFycmF5fFVpbnQ4QXJyYXlbXTtcblxuZXhwb3J0IGVudW0gUmFuayB7XG4gIFIwID0gJ1IwJyxcbiAgUjEgPSAnUjEnLFxuICBSMiA9ICdSMicsXG4gIFIzID0gJ1IzJyxcbiAgUjQgPSAnUjQnLFxuICBSNSA9ICdSNScsXG4gIFI2ID0gJ1I2J1xufVxuXG5leHBvcnQgdHlwZSBGbGF0VmVjdG9yID0gYm9vbGVhbltdfG51bWJlcltdfFR5cGVkQXJyYXk7XG5leHBvcnQgdHlwZSBSZWd1bGFyQXJyYXk8VD4gPVxuICAgIFRbXXxUW11bXXxUW11bXVtdfFRbXVtdW11bXXxUW11bXVtdW11bXXxUW11bXVtdW11bXVtdO1xuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgaW50ZXJmYWNlIFJlY3Vyc2l2ZUFycmF5PFQgZXh0ZW5kcyBhbnk+IHtcbiAgW2luZGV4OiBudW1iZXJdOiBUfFJlY3Vyc2l2ZUFycmF5PFQ+O1xufVxuXG4vLyBMb29rcyBmb3IgdXBjYXN0aW5nIHR5cGVzLiBVc2VkLCBmb3IgZXhhbXBsZSwgaW4gb3BlcmF0aW9ucyB3aXRoIG1peGVkIGR0eXBlXG4vLyBpbnB1dHMuXG5lbnVtIFVwY2FzdEludDMyQW5kTWFwIHtcbiAgJ2Zsb2F0MzInID0gJ2Zsb2F0MzInLFxuICAnaW50MzInID0gJ2ludDMyJyxcbiAgJ2Jvb2wnID0gJ2ludDMyJyxcbiAgJ2NvbXBsZXg2NCcgPSAnY29tcGxleDY0J1xufVxuXG5lbnVtIFVwY2FzdEJvb2xBbmRNYXAge1xuICAnZmxvYXQzMicgPSAnZmxvYXQzMicsXG4gICdpbnQzMicgPSAnaW50MzInLFxuICAnYm9vbCcgPSAnYm9vbCcsXG4gICdjb21wbGV4NjQnID0gJ2NvbXBsZXg2NCdcbn1cblxuZW51bSBVcGNhc3RGbG9hdDMyQW5kTWFwIHtcbiAgJ2Zsb2F0MzInID0gJ2Zsb2F0MzInLFxuICAnaW50MzInID0gJ2Zsb2F0MzInLFxuICAnYm9vbCcgPSAnZmxvYXQzMicsXG4gICdjb21wbGV4NjQnID0gJ2NvbXBsZXg2NCdcbn1cblxuZW51bSBVcGNhc3RDb21wbGV4NjRBbmRNYXAge1xuICAnZmxvYXQzMicgPSAnY29tcGxleDY0JyxcbiAgJ2ludDMyJyA9ICdjb21wbGV4NjQnLFxuICAnYm9vbCcgPSAnY29tcGxleDY0JyxcbiAgJ2NvbXBsZXg2NCcgPSAnY29tcGxleDY0J1xufVxuXG5jb25zdCB1cGNhc3RUeXBlTWFwID0ge1xuICAnZmxvYXQzMic6IFVwY2FzdEZsb2F0MzJBbmRNYXAsXG4gICdpbnQzMic6IFVwY2FzdEludDMyQW5kTWFwLFxuICAnYm9vbCc6IFVwY2FzdEJvb2xBbmRNYXAsXG4gICdjb21wbGV4NjQnOiBVcGNhc3RDb21wbGV4NjRBbmRNYXBcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGNhc3RUeXBlKHR5cGVBOiBEYXRhVHlwZSwgdHlwZUI6IERhdGFUeXBlKTogRGF0YVR5cGUge1xuICBpZiAodHlwZUEgPT09ICdzdHJpbmcnIHx8IHR5cGVCID09PSAnc3RyaW5nJykge1xuICAgIGlmICh0eXBlQSA9PT0gJ3N0cmluZycgJiYgdHlwZUIgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihgQ2FuIG5vdCB1cGNhc3QgJHt0eXBlQX0gd2l0aCAke3R5cGVCfWApO1xuICB9XG4gIHJldHVybiB1cGNhc3RUeXBlTWFwW3R5cGVBXVt0eXBlQl07XG59XG5cbi8qKiBSZXR1cm5zIHRoZSBvdXRwdXQgdHlwZSBhZnRlciBzdW1tYXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gc3VtT3V0VHlwZSh0eXBlOiBEYXRhVHlwZSk6IERhdGFUeXBlIHtcbiAgcmV0dXJuIHVwY2FzdFR5cGUodHlwZSwgJ2ludDMyJyk7XG59XG5cbi8qKiBAZG9jYWxpYXMgVHlwZWRBcnJheXxBcnJheSAqL1xuZXhwb3J0IHR5cGUgVGVuc29yTGlrZSA9XG4gICAgVHlwZWRBcnJheXxudW1iZXJ8Ym9vbGVhbnxzdHJpbmd8UmVjdXJzaXZlQXJyYXk8bnVtYmVyfG51bWJlcltdfFR5cGVkQXJyYXk+fFxuICAgIFJlY3Vyc2l2ZUFycmF5PGJvb2xlYW4+fFJlY3Vyc2l2ZUFycmF5PHN0cmluZz58VWludDhBcnJheVtdO1xuZXhwb3J0IHR5cGUgU2NhbGFyTGlrZSA9IG51bWJlcnxib29sZWFufHN0cmluZ3xVaW50OEFycmF5O1xuLyoqIEBkb2NhbGlhcyBUeXBlZEFycmF5fEFycmF5ICovXG5leHBvcnQgdHlwZSBUZW5zb3JMaWtlMUQgPSBUeXBlZEFycmF5fG51bWJlcltdfGJvb2xlYW5bXXxzdHJpbmdbXXxVaW50OEFycmF5W107XG4vKiogQGRvY2FsaWFzIFR5cGVkQXJyYXl8QXJyYXkgKi9cbmV4cG9ydCB0eXBlIFRlbnNvckxpa2UyRCA9IFR5cGVkQXJyYXl8bnVtYmVyW118bnVtYmVyW11bXXxib29sZWFuW118Ym9vbGVhbltdW118XG4gICAgc3RyaW5nW118c3RyaW5nW11bXXxVaW50OEFycmF5W118VWludDhBcnJheVtdW107XG4vKiogQGRvY2FsaWFzIFR5cGVkQXJyYXl8QXJyYXkgKi9cbmV4cG9ydCB0eXBlIFRlbnNvckxpa2UzRCA9IFR5cGVkQXJyYXl8bnVtYmVyW118bnVtYmVyW11bXVtdfGJvb2xlYW5bXXxcbiAgICBib29sZWFuW11bXVtdfHN0cmluZ1tdfHN0cmluZ1tdW11bXXxVaW50OEFycmF5W118VWludDhBcnJheVtdW11bXTtcbi8qKiBAZG9jYWxpYXMgVHlwZWRBcnJheXxBcnJheSAqL1xuZXhwb3J0IHR5cGUgVGVuc29yTGlrZTREID0gVHlwZWRBcnJheXxudW1iZXJbXXxudW1iZXJbXVtdW11bXXxib29sZWFuW118XG4gICAgYm9vbGVhbltdW11bXVtdfHN0cmluZ1tdfHN0cmluZ1tdW11bXVtdfFVpbnQ4QXJyYXlbXXxVaW50OEFycmF5W11bXVtdW107XG4vKiogQGRvY2FsaWFzIFR5cGVkQXJyYXl8QXJyYXkgKi9cbmV4cG9ydCB0eXBlIFRlbnNvckxpa2U1RCA9XG4gICAgVHlwZWRBcnJheXxudW1iZXJbXXxudW1iZXJbXVtdW11bXVtdfGJvb2xlYW5bXXxib29sZWFuW11bXVtdW11bXXxzdHJpbmdbXXxcbiAgICBzdHJpbmdbXVtdW11bXVtdfFVpbnQ4QXJyYXlbXXxVaW50OEFycmF5W11bXVtdW11bXTtcbi8qKiBAZG9jYWxpYXMgVHlwZWRBcnJheXxBcnJheSAqL1xuZXhwb3J0IHR5cGUgVGVuc29yTGlrZTZEID1cbiAgICBUeXBlZEFycmF5fG51bWJlcltdfG51bWJlcltdW11bXVtdW11bXXxib29sZWFuW118Ym9vbGVhbltdW11bXVtdW11bXXxcbiAgICBzdHJpbmdbXXxzdHJpbmdbXVtdW11bXVtdW118VWludDhBcnJheVtdfFVpbnQ4QXJyYXlbXVtdW11bXVtdO1xuXG4vKiogVHlwZSBmb3IgcmVwcmVzZW50aW5nIGltYWdlIGRhdGEgaW4gVWludDhBcnJheSB0eXBlLiAqL1xuZXhwb3J0IGludGVyZmFjZSBQaXhlbERhdGEge1xuICB3aWR0aDogbnVtYmVyO1xuICBoZWlnaHQ6IG51bWJlcjtcbiAgZGF0YTogVWludDhBcnJheTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tensor } from './tensor';\nimport { upcastType } from './types';\nimport { assert } from './util';\nexport function makeTypesMatch(a, b) {\n    if (a.dtype === b.dtype) {\n        return [a, b];\n    }\n    const dtype = upcastType(a.dtype, b.dtype);\n    return [a.cast(dtype), b.cast(dtype)];\n}\nexport function assertTypesMatch(a, b) {\n    assert(a.dtype === b.dtype, () => `The dtypes of the first(${a.dtype}) and` +\n        ` second(${b.dtype}) input must match`);\n}\nexport function isTensorInList(tensor, tensorList) {\n    return tensorList.some(x => x.id === tensor.id);\n}\n/**\n * Extracts any `Tensor`s found within the provided object.\n *\n * @param container an object that may be a `Tensor` or may directly contain\n *   `Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. In general it\n *   is safe to pass any object here, except that `Promise`s are not\n *   supported.\n * @returns An array of `Tensors` found within the passed object. If the\n *   argument is simply a `Tensor', a list containing that `Tensor` is\n *   returned. If the object is not a `Tensor` or does not\n *   contain `Tensors`, an empty list is returned.\n */\nexport function getTensorsInContainer(result) {\n    const list = [];\n    const seen = new Set();\n    walkTensorContainer(result, list, seen);\n    return list;\n}\nfunction walkTensorContainer(container, list, seen) {\n    if (container == null) {\n        return;\n    }\n    if (container instanceof Tensor) {\n        list.push(container);\n        return;\n    }\n    if (!isIterable(container)) {\n        return;\n    }\n    // Iteration over keys works also for arrays.\n    const iterable = container;\n    for (const k in iterable) {\n        const val = iterable[k];\n        if (!seen.has(val)) {\n            seen.add(val);\n            walkTensorContainer(val, list, seen);\n        }\n    }\n}\n// tslint:disable-next-line:no-any\nfunction isIterable(obj) {\n    return Array.isArray(obj) || typeof obj === 'object';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3RlbnNvcl91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTlCLE1BQU0sVUFBVSxjQUFjLENBQW1CLENBQUksRUFBRSxDQUFJO0lBQ3pELElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDZjtJQUNELE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxDQUFTLEVBQUUsQ0FBUztJQUNuRCxNQUFNLENBQ0YsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUNuQixHQUFHLEVBQUUsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDLEtBQUssT0FBTztRQUMzQyxXQUFXLENBQUMsQ0FBQyxLQUFLLG9CQUFvQixDQUFDLENBQUM7QUFDbEQsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQUMsTUFBYyxFQUFFLFVBQW9CO0lBQ2pFLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2xELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxNQUF1QjtJQUMzRCxNQUFNLElBQUksR0FBYSxFQUFFLENBQUM7SUFDMUIsTUFBTSxJQUFJLEdBQUcsSUFBSSxHQUFHLEVBQVcsQ0FBQztJQUNoQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hDLE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQ3hCLFNBQTBCLEVBQUUsSUFBYyxFQUFFLElBQWtCO0lBQ2hFLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixPQUFPO0tBQ1I7SUFDRCxJQUFJLFNBQVMsWUFBWSxNQUFNLEVBQUU7UUFDL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNyQixPQUFPO0tBQ1I7SUFDRCxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1FBQzFCLE9BQU87S0FDUjtJQUNELDZDQUE2QztJQUM3QyxNQUFNLFFBQVEsR0FBRyxTQUFpQyxDQUFDO0lBQ25ELEtBQUssTUFBTSxDQUFDLElBQUksUUFBUSxFQUFFO1FBQ3hCLE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNsQixJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2QsbUJBQW1CLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUN0QztLQUNGO0FBQ0gsQ0FBQztBQUVELGtDQUFrQztBQUNsQyxTQUFTLFVBQVUsQ0FBQyxHQUFRO0lBQzFCLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLENBQUM7QUFDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yQ29udGFpbmVyLCBUZW5zb3JDb250YWluZXJBcnJheX0gZnJvbSAnLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHt1cGNhc3RUeXBlfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWFrZVR5cGVzTWF0Y2g8VCBleHRlbmRzIFRlbnNvcj4oYTogVCwgYjogVCk6IFtULCBUXSB7XG4gIGlmIChhLmR0eXBlID09PSBiLmR0eXBlKSB7XG4gICAgcmV0dXJuIFthLCBiXTtcbiAgfVxuICBjb25zdCBkdHlwZSA9IHVwY2FzdFR5cGUoYS5kdHlwZSwgYi5kdHlwZSk7XG4gIHJldHVybiBbYS5jYXN0KGR0eXBlKSwgYi5jYXN0KGR0eXBlKV07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnRUeXBlc01hdGNoKGE6IFRlbnNvciwgYjogVGVuc29yKTogdm9pZCB7XG4gIGFzc2VydChcbiAgICAgIGEuZHR5cGUgPT09IGIuZHR5cGUsXG4gICAgICAoKSA9PiBgVGhlIGR0eXBlcyBvZiB0aGUgZmlyc3QoJHthLmR0eXBlfSkgYW5kYCArXG4gICAgICAgICAgYCBzZWNvbmQoJHtiLmR0eXBlfSkgaW5wdXQgbXVzdCBtYXRjaGApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNUZW5zb3JJbkxpc3QodGVuc29yOiBUZW5zb3IsIHRlbnNvckxpc3Q6IFRlbnNvcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiB0ZW5zb3JMaXN0LnNvbWUoeCA9PiB4LmlkID09PSB0ZW5zb3IuaWQpO1xufVxuXG4vKipcbiAqIEV4dHJhY3RzIGFueSBgVGVuc29yYHMgZm91bmQgd2l0aGluIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lciBhbiBvYmplY3QgdGhhdCBtYXkgYmUgYSBgVGVuc29yYCBvciBtYXkgZGlyZWN0bHkgY29udGFpblxuICogICBgVGVuc29yYHMsIHN1Y2ggYXMgYSBgVGVuc29yW11gIG9yIGB7a2V5OiBUZW5zb3IsIC4uLn1gLiBJbiBnZW5lcmFsIGl0XG4gKiAgIGlzIHNhZmUgdG8gcGFzcyBhbnkgb2JqZWN0IGhlcmUsIGV4Y2VwdCB0aGF0IGBQcm9taXNlYHMgYXJlIG5vdFxuICogICBzdXBwb3J0ZWQuXG4gKiBAcmV0dXJucyBBbiBhcnJheSBvZiBgVGVuc29yc2AgZm91bmQgd2l0aGluIHRoZSBwYXNzZWQgb2JqZWN0LiBJZiB0aGVcbiAqICAgYXJndW1lbnQgaXMgc2ltcGx5IGEgYFRlbnNvcicsIGEgbGlzdCBjb250YWluaW5nIHRoYXQgYFRlbnNvcmAgaXNcbiAqICAgcmV0dXJuZWQuIElmIHRoZSBvYmplY3QgaXMgbm90IGEgYFRlbnNvcmAgb3IgZG9lcyBub3RcbiAqICAgY29udGFpbiBgVGVuc29yc2AsIGFuIGVtcHR5IGxpc3QgaXMgcmV0dXJuZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3JzSW5Db250YWluZXIocmVzdWx0OiBUZW5zb3JDb250YWluZXIpOiBUZW5zb3JbXSB7XG4gIGNvbnN0IGxpc3Q6IFRlbnNvcltdID0gW107XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHt9fHZvaWQ+KCk7XG4gIHdhbGtUZW5zb3JDb250YWluZXIocmVzdWx0LCBsaXN0LCBzZWVuKTtcbiAgcmV0dXJuIGxpc3Q7XG59XG5cbmZ1bmN0aW9uIHdhbGtUZW5zb3JDb250YWluZXIoXG4gICAgY29udGFpbmVyOiBUZW5zb3JDb250YWluZXIsIGxpc3Q6IFRlbnNvcltdLCBzZWVuOiBTZXQ8e318dm9pZD4pOiB2b2lkIHtcbiAgaWYgKGNvbnRhaW5lciA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChjb250YWluZXIgaW5zdGFuY2VvZiBUZW5zb3IpIHtcbiAgICBsaXN0LnB1c2goY29udGFpbmVyKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKCFpc0l0ZXJhYmxlKGNvbnRhaW5lcikpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gSXRlcmF0aW9uIG92ZXIga2V5cyB3b3JrcyBhbHNvIGZvciBhcnJheXMuXG4gIGNvbnN0IGl0ZXJhYmxlID0gY29udGFpbmVyIGFzIFRlbnNvckNvbnRhaW5lckFycmF5O1xuICBmb3IgKGNvbnN0IGsgaW4gaXRlcmFibGUpIHtcbiAgICBjb25zdCB2YWwgPSBpdGVyYWJsZVtrXTtcbiAgICBpZiAoIXNlZW4uaGFzKHZhbCkpIHtcbiAgICAgIHNlZW4uYWRkKHZhbCk7XG4gICAgICB3YWxrVGVuc29yQ29udGFpbmVyKHZhbCwgbGlzdCwgc2Vlbik7XG4gICAgfVxuICB9XG59XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmZ1bmN0aW9uIGlzSXRlcmFibGUob2JqOiBhbnkpOiBib29sZWFuIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKSB8fCB0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { KernelBackend } from './backends/backend';\nimport { Environment, setEnvironmentGlobal } from './environment';\nimport { getGlobalNamespace } from './global_util';\nimport { Add, Cast, Identity } from './kernel_names';\nimport { getGradient, getKernel, getKernelsForBackend } from './kernel_registry';\nimport * as log from './log';\nimport { Profiler } from './profiler';\nimport { backpropagateGradients, getFilteredNodesXToY } from './tape';\nimport { setTensorTracker, Tensor, Variable } from './tensor';\nimport { getTensorsInContainer } from './tensor_util';\nimport * as util from './util';\nimport { bytesFromStringArray, makeOnesTypedArray, now, sizeFromShape } from './util';\nfunction isRegisteredKernelInvocation(kernelInvocation) {\n    return kernelInvocation.kernelName != null;\n}\nclass EngineState {\n    constructor() {\n        // Public since optimizers will use it.\n        this.registeredVariables = {};\n        this.nextTapeNodeId = 0;\n        this.numBytes = 0;\n        this.numTensors = 0;\n        this.numStringTensors = 0;\n        this.numDataBuffers = 0;\n        // Number of nested tf.grad() statements when computing higher-order\n        // gradients. E.g. `1` for first-order gradients and `2` for second-order\n        // gradients. Used to track if the tape should be removed after a backprop.\n        this.gradientDepth = 0;\n        // Number of nested kernel calls. When kernel depth is greater than 1, we turn\n        // off the tape.\n        this.kernelDepth = 0;\n        this.scopeStack = [];\n        /**\n         * Keeps track of the number of data moves during a kernel execution. We\n         * maintain a stack since kernels can call other kernels, recursively.\n         */\n        this.numDataMovesStack = [];\n        this.nextScopeId = 0;\n        this.tensorInfo = new WeakMap();\n        this.profiling = false;\n        this.activeProfile = {\n            newBytes: 0,\n            newTensors: 0,\n            peakBytes: 0,\n            kernels: [],\n            result: null,\n            get kernelNames() {\n                return Array.from(new Set(this.kernels.map(k => k.name)));\n            }\n        };\n    }\n    dispose() {\n        for (const variableName in this.registeredVariables) {\n            this.registeredVariables[variableName].dispose();\n        }\n    }\n}\nexport class Engine {\n    constructor(ENV) {\n        this.ENV = ENV;\n        this.registry = {};\n        this.registryFactory = {};\n        this.pendingBackendInitId = 0;\n        this.state = new EngineState();\n    }\n    async ready() {\n        if (this.pendingBackendInit != null) {\n            return this.pendingBackendInit.then(() => { });\n        }\n        if (this.backendInstance != null) {\n            return;\n        }\n        const sortedBackends = this.getSortedBackends();\n        for (let i = 0; i < sortedBackends.length; i++) {\n            const backendName = sortedBackends[i];\n            const success = await this.initializeBackend(backendName).success;\n            if (success) {\n                await this.setBackend(backendName);\n                return;\n            }\n        }\n        throw new Error(`Could not initialize any backends, all backend initializations ` +\n            `failed.`);\n    }\n    get backend() {\n        if (this.pendingBackendInit != null) {\n            throw new Error(`Backend '${this.backendName}' has not yet been initialized. Make ` +\n                `sure to await tf.ready() or await tf.setBackend() before calling ` +\n                `other methods`);\n        }\n        if (this.backendInstance == null) {\n            const { name, asyncInit } = this.initializeBackendsAndReturnBest();\n            if (asyncInit) {\n                throw new Error(`The highest priority backend '${name}' has not yet been ` +\n                    `initialized. Make sure to await tf.ready() or ` +\n                    `await tf.setBackend() before calling other methods`);\n            }\n            this.setBackend(name);\n        }\n        return this.backendInstance;\n    }\n    backendNames() {\n        return Object.keys(this.registryFactory);\n    }\n    findBackend(backendName) {\n        if (!(backendName in this.registry)) {\n            // If the backend hasn't been initialized but we have a registry entry for\n            // it, initialize it and return it.\n            if (backendName in this.registryFactory) {\n                const { asyncInit } = this.initializeBackend(backendName);\n                if (asyncInit) {\n                    // Backend is not ready yet.\n                    return null;\n                }\n            }\n            else {\n                return null;\n            }\n        }\n        return this.registry[backendName];\n    }\n    findBackendFactory(backendName) {\n        if (!(backendName in this.registryFactory)) {\n            return null;\n        }\n        return this.registryFactory[backendName].factory;\n    }\n    registerBackend(backendName, factory, priority = 1) {\n        if (backendName in this.registryFactory) {\n            log.warn(`${backendName} backend was already registered. ` +\n                `Reusing existing backend factory.`);\n            return false;\n        }\n        this.registryFactory[backendName] = { factory, priority };\n        return true;\n    }\n    async setBackend(backendName) {\n        if (this.registryFactory[backendName] == null) {\n            throw new Error(`Backend name '${backendName}' not found in registry`);\n        }\n        this.backendName = backendName;\n        if (this.registry[backendName] == null) {\n            this.backendInstance = null;\n            const { success, asyncInit } = this.initializeBackend(backendName);\n            const result = asyncInit ? await success : success;\n            if (!result) {\n                return false;\n            }\n        }\n        this.backendInstance = this.registry[backendName];\n        this.setupRegisteredKernels();\n        // Reset the profiler.\n        this.profiler = new Profiler(this.backendInstance);\n        return true;\n    }\n    setupRegisteredKernels() {\n        const kernels = getKernelsForBackend(this.backendName);\n        kernels.forEach(kernel => {\n            if (kernel.setupFunc != null) {\n                kernel.setupFunc(this.backendInstance);\n            }\n        });\n    }\n    disposeRegisteredKernels(backendName) {\n        const kernels = getKernelsForBackend(backendName);\n        kernels.forEach(kernel => {\n            if (kernel.disposeFunc != null) {\n                kernel.disposeFunc(this.registry[backendName]);\n            }\n        });\n    }\n    /**\n     * Initializes a backend by looking up the backend name in the factory\n     * registry and calling the factory method. Returns a boolean representing\n     * whether the initialization of the backend suceeded. Throws an error if\n     * there is no backend in the factory registry.\n     */\n    initializeBackend(backendName) {\n        const registryFactoryEntry = this.registryFactory[backendName];\n        if (registryFactoryEntry == null) {\n            throw new Error(`Cannot initialize backend ${backendName}, no registration found.`);\n        }\n        try {\n            const backend = registryFactoryEntry.factory();\n            /* Test if the factory returns a promise.\n            Done in a more liberal way than\n            previous 'Promise.resolve(backend)===backend'\n            as we needed to account for custom Promise\n            implementations (e.g. Angular) */\n            if (backend && !(backend instanceof KernelBackend) &&\n                typeof backend.then === 'function') {\n                const promiseId = ++this.pendingBackendInitId;\n                const success = backend\n                    .then(backendInstance => {\n                    // Outdated promise. Another backend was set in the meantime.\n                    if (promiseId < this.pendingBackendInitId) {\n                        return false;\n                    }\n                    this.registry[backendName] = backendInstance;\n                    this.pendingBackendInit = null;\n                    return true;\n                })\n                    .catch(err => {\n                    // Outdated promise. Another backend was set in the meantime.\n                    if (promiseId < this.pendingBackendInitId) {\n                        return false;\n                    }\n                    this.pendingBackendInit = null;\n                    log.warn(`Initialization of backend ${backendName} failed`);\n                    log.warn(err.stack || err.message);\n                    return false;\n                });\n                this.pendingBackendInit = success;\n                return { success, asyncInit: true };\n            }\n            else {\n                this.registry[backendName] = backend;\n                return { success: true, asyncInit: false };\n            }\n        }\n        catch (err) {\n            log.warn(`Initialization of backend ${backendName} failed`);\n            log.warn(err.stack || err.message);\n            return { success: false, asyncInit: false };\n        }\n    }\n    removeBackend(backendName) {\n        if (!(backendName in this.registryFactory)) {\n            throw new Error(`${backendName} backend not found in registry`);\n        }\n        if (this.backendName === backendName && this.pendingBackendInit != null) {\n            // There is a pending promise of the backend we want to remove. Make it\n            // obsolete.\n            this.pendingBackendInitId++;\n        }\n        if (backendName in this.registry) {\n            this.disposeRegisteredKernels(backendName);\n            this.registry[backendName].dispose();\n            delete this.registry[backendName];\n        }\n        delete this.registryFactory[backendName];\n        // Unset the backend if it is active.\n        if (this.backendName === backendName) {\n            this.pendingBackendInit = null;\n            this.backendName = null;\n            this.backendInstance = null;\n        }\n    }\n    getSortedBackends() {\n        if (Object.keys(this.registryFactory).length === 0) {\n            throw new Error('No backend found in registry.');\n        }\n        return Object.keys(this.registryFactory).sort((a, b) => {\n            // Highest priority comes first.\n            return this.registryFactory[b].priority -\n                this.registryFactory[a].priority;\n        });\n    }\n    initializeBackendsAndReturnBest() {\n        const sortedBackends = this.getSortedBackends();\n        for (let i = 0; i < sortedBackends.length; i++) {\n            const backendName = sortedBackends[i];\n            const { success, asyncInit } = this.initializeBackend(backendName);\n            if (asyncInit || success) {\n                return { name: backendName, asyncInit };\n            }\n        }\n        throw new Error(`Could not initialize any backends, all backend initializations ` +\n            `failed.`);\n    }\n    moveData(backend, dataId) {\n        const info = this.state.tensorInfo.get(dataId);\n        const srcBackend = info.backend;\n        const values = this.readSync(dataId);\n        const refCount = srcBackend.refCount(dataId);\n        // Delete the tensor from the old backend and move it to the new\n        // backend.\n        srcBackend.disposeData(dataId, true);\n        info.backend = backend;\n        backend.move(dataId, values, info.shape, info.dtype, refCount);\n        if (this.shouldCheckForMemLeaks()) {\n            // Track the number of moves during a kernel execution to correctly\n            // detect memory leaks.\n            this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1]++;\n        }\n    }\n    tidy(nameOrFn, fn) {\n        let name = null;\n        if (fn == null) {\n            // Called with only 1 argument.\n            if (typeof nameOrFn !== 'function') {\n                throw new Error('Please provide a function to tidy()');\n            }\n            fn = nameOrFn;\n        }\n        else {\n            // Called with 2 arguments.\n            if (typeof nameOrFn !== 'string' && !(nameOrFn instanceof String)) {\n                throw new Error('When calling with two arguments, the first argument ' +\n                    'to tidy() must be a string');\n            }\n            if (typeof fn !== 'function') {\n                throw new Error('When calling with two arguments, the 2nd argument ' +\n                    'to tidy() must be a function');\n            }\n            name = nameOrFn;\n            // TODO(nsthorat,smilkov): Do operation logging and performance\n            // profiling.\n        }\n        let result;\n        return this.scopedRun(() => this.startScope(name), () => this.endScope(result), () => {\n            result = fn();\n            if (result instanceof Promise) {\n                console.error('Cannot return a Promise inside of tidy.');\n            }\n            return result;\n        });\n    }\n    scopedRun(start, end, f) {\n        start();\n        try {\n            const res = f();\n            end();\n            return res;\n        }\n        catch (ex) {\n            end();\n            throw ex;\n        }\n    }\n    nextTensorId() {\n        return Engine.nextTensorId++;\n    }\n    nextVariableId() {\n        return Engine.nextVariableId++;\n    }\n    /**\n     * This method is called instead of the public-facing tensor.clone() when\n     * saving a tensor for backwards pass. It makes sure to add the clone\n     * operation to the tape regardless of being called inside a kernel\n     * execution.\n     */\n    clone(x) {\n        const y = ENGINE.runKernel(Identity, { x });\n        const inputs = { x };\n        const grad = (dy) => ({\n            x: () => {\n                const dtype = 'float32';\n                const gradInputs = { x: dy };\n                const attrs = { dtype };\n                return ENGINE.runKernel(Cast, gradInputs, \n                // tslint:disable-next-line: no-unnecessary-type-assertion\n                attrs);\n            }\n        });\n        const saved = [];\n        this.addTapeNode(this.state.activeScope.name, inputs, [y], grad, saved, {});\n        return y;\n    }\n    /**\n     * Execute a kernel with the given name and return the output tensor.\n     *\n     * @param kernelName The name of the kernel to execute.\n     * @param inputs A map of input names to tensors.\n     * @param attrs A map of attribute names to their values. An attribute is a\n     *     primitive (non-tensor) input to the kernel.\n     * @param inputsToSave A list of tensors, inputs to save for the backprop\n     *     computation.\n     * @param outputsToSave A list of booleans, specifying which output to save\n     *     for the backprop computation. These are booleans since the output\n     * tensors are not visible to the user.\n     */\n    runKernel(kernelName, inputs, attrs) {\n        if (this.backendName == null) {\n            // backend has not been initialized yet (backend initialization is lazy\n            // can be deferred until an op/ kernel is run).\n            // The below getter has side effects that will try to initialize the\n            // backend and set properties like this.backendName\n            // tslint:disable-next-line: no-unused-expression\n            this.backend;\n        }\n        const hasKernel = getKernel(kernelName, this.backendName) != null;\n        if (!hasKernel) {\n            throw new Error(`Kernel '${kernelName}' not registered for backend '${this.backendName}'`);\n        }\n        return this.runKernelFunc({ kernelName, inputs, attrs });\n    }\n    shouldCheckForMemLeaks() {\n        return this.ENV.getBool('IS_TEST');\n    }\n    checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos) {\n        const numDataIdsAfter = this.backend.numDataIds();\n        // Count the number of data ids associated with the result of the kernel.\n        let numOutputDataIds = 0;\n        outInfos.forEach(info => {\n            // Complex numbers allocate 3 data ids, one for 'real', one for\n            // 'imaginary', and one for the container that holds the former two.\n            numOutputDataIds += (info.dtype === 'complex64' ? 3 : 1);\n        });\n        // Account for the number of moves during kernel execution. A \"data move\"\n        // can happen in the middle of a kernel execution, placing a new (key,value)\n        // pair in the data storage. Since data moves have net zero effect (we\n        // always remove the data from the old backend), we have to cancel them out\n        // when detecting memory leaks.\n        const numMoves = this.state.numDataMovesStack[this.state.numDataMovesStack.length - 1];\n        const dataIdsLeaked = numDataIdsAfter - numDataIdsBefore - numOutputDataIds - numMoves;\n        if (dataIdsLeaked > 0) {\n            throw new Error(`Backend '${this.backendName}' has an internal memory leak ` +\n                `(${dataIdsLeaked} data ids) after running '${kernelName}'`);\n        }\n    }\n    /**\n     * Internal helper method to execute a kernel Func\n     *\n     * Use `runKernel` to execute kernels from outside of engine.\n     */\n    runKernelFunc(kernelParams) {\n        let outputs;\n        let saved = [];\n        const isTapeOn = this.isTapeOn();\n        const startingBytecount = this.state.numBytes;\n        const startingNumTensors = this.state.numTensors;\n        if (this.shouldCheckForMemLeaks()) {\n            this.state.numDataMovesStack.push(0);\n        }\n        let kernelFunc;\n        if (this.backendName == null) {\n            // backend has not been initialized yet (backend initialization is lazy\n            // can be deferred until an op/ kernel is run).\n            // The below getter has side effects that will try to initialize the\n            // backend and set properties like this.backendName\n            // tslint:disable-next-line: no-unused-expression\n            this.backend;\n        }\n        let out;\n        const kernelOrScopeName = isRegisteredKernelInvocation(kernelParams) ?\n            kernelParams.kernelName :\n            this.state.activeScope != null ? this.state.activeScope.name : '';\n        // Create the kernelFunc from either a registered kernel OR passed in\n        // forward/backward functions (used by custom grad). In this context a\n        // kernelFunc wraps a kernel implementation with some bookkeeping.\n        if (isRegisteredKernelInvocation(kernelParams)) {\n            const { kernelName, inputs, attrs } = kernelParams;\n            if (this.backendName == null) {\n                // backend has not been initialized yet (backend initialization is lazy\n                // can be deferred until an op/ kernel is run).\n                // The below getter has side effects that will try to initialize the\n                // backend and set properties like this.backendName\n                // tslint:disable-next-line: no-unused-expression\n                this.backend;\n            }\n            const kernel = getKernel(kernelName, this.backendName);\n            util.assert(kernel != null, () => `Cannot find registered kernel '${kernelName}' for backend '${this.backendName}'`);\n            kernelFunc = () => {\n                const numDataIdsBefore = this.backend.numDataIds();\n                out = kernel.kernelFunc({ inputs, attrs, backend: this.backend });\n                const outInfos = Array.isArray(out) ? out : [out];\n                if (this.shouldCheckForMemLeaks()) {\n                    this.checkKernelForMemLeak(kernelName, numDataIdsBefore, outInfos);\n                }\n                const outTensors = outInfos.map((outInfo) => {\n                    // todo (yassogba) remove this option (Tensor) when node backend\n                    // methods have been modularized and they all return tensorInfo.\n                    // TensorInfos do not have a rank attribute.\n                    if (outInfo.rank != null) {\n                        return outInfo;\n                    }\n                    return this.makeTensorFromTensorInfo(outInfo);\n                });\n                // Save any required inputs and outputs.\n                // Do not save unless we are recording to the tape. Otherwise it would\n                // cause a mem leak since there would be no backprop for these tensors\n                // (which would otherwise dispose them).\n                if (isTapeOn) {\n                    const tensorsToSave = this.getTensorsForGradient(kernelName, inputs, outTensors);\n                    saved = this.saveTensorsForBackwardMode(tensorsToSave);\n                }\n                return outTensors;\n            };\n        }\n        else {\n            const { forwardFunc } = kernelParams;\n            // Running a customGrad op.\n            const saveFunc = (tensors) => {\n                // Do not save unless we are recording to the tape. Otherwise it would\n                // cause a mem leak since we would never run backprop, which disposes\n                // the kept tensors.\n                if (!isTapeOn) {\n                    return;\n                }\n                saved = tensors.map(tensor => this.keep(this.clone(tensor)));\n            };\n            kernelFunc = () => {\n                const numDataIdsBefore = this.backend.numDataIds();\n                out = this.tidy(() => forwardFunc(this.backend, saveFunc));\n                const outs = (Array.isArray(out) ? out : [out]);\n                if (this.shouldCheckForMemLeaks()) {\n                    // Scope name is used to print a more helpful error message if needed.\n                    this.checkKernelForMemLeak(kernelOrScopeName, numDataIdsBefore, outs);\n                }\n                return outs;\n            };\n        }\n        //\n        // Run the kernelFunc. Optionally profiling it.\n        //\n        const { inputs, attrs } = kernelParams;\n        const backwardsFunc = isRegisteredKernelInvocation(kernelParams) ?\n            null :\n            kernelParams.backwardsFunc;\n        let kernelProfile;\n        this.scopedRun(\n        // Stop recording to a tape when running a kernel.\n        () => this.state.kernelDepth++, () => this.state.kernelDepth--, () => {\n            if (!this.ENV.getBool('DEBUG') && !this.state.profiling) {\n                outputs = kernelFunc();\n            }\n            else {\n                kernelProfile = this.profiler.profileKernel(kernelOrScopeName, inputs, () => kernelFunc());\n                if (this.ENV.getBool('DEBUG')) {\n                    this.profiler.logKernelProfile(kernelProfile);\n                }\n                outputs = kernelProfile.outputs;\n            }\n        });\n        if (isTapeOn) {\n            this.addTapeNode(kernelOrScopeName, inputs, outputs, backwardsFunc, saved, attrs);\n        }\n        if (this.state.profiling) {\n            this.state.activeProfile.kernels.push({\n                name: kernelOrScopeName,\n                bytesAdded: this.state.numBytes - startingBytecount,\n                totalBytesSnapshot: this.state.numBytes,\n                tensorsAdded: this.state.numTensors - startingNumTensors,\n                totalTensorsSnapshot: this.state.numTensors,\n                inputShapes: Object.keys(inputs).map(key => inputs[key] != null ? inputs[key].shape : null),\n                outputShapes: outputs.map(item => item.shape),\n                kernelTimeMs: kernelProfile.timeMs,\n                extraInfo: kernelProfile.extraInfo\n            });\n        }\n        return (Array.isArray(out) ? outputs : outputs[0]);\n    }\n    /**\n     * Saves tensors used in forward mode for use in backward mode.\n     *\n     * @param tensors the list of tensors to save.\n     */\n    saveTensorsForBackwardMode(tensors) {\n        const saved = tensors.map(tensor => this.keep(this.clone(tensor)));\n        return saved;\n    }\n    /**\n     * Returns a list of tensors to save for a given gradient calculation.\n     *\n     * @param kernelName name of kernel to look up gradient for.\n     * @param inputs a map of input tensors.\n     * @param outputs an array of output tensors from forward mode of kernel.\n     */\n    getTensorsForGradient(kernelName, inputs, outputs) {\n        const gradConfig = getGradient(kernelName);\n        if (gradConfig != null) {\n            const inputsToSave = gradConfig.inputsToSave || [];\n            const outputsToSave = gradConfig.outputsToSave || [];\n            // If saveAllInputs is true, all inputs will be saved. Otherwise, inputs\n            // specified in inputsToSave will be saved.\n            let inputTensorsToSave;\n            if (gradConfig.saveAllInputs) {\n                util.assert(Array.isArray(inputs), () => 'saveAllInputs is true, expected inputs to be an array.');\n                inputTensorsToSave = Object.keys(inputs).map((key) => inputs[key]);\n            }\n            else {\n                inputTensorsToSave = inputsToSave.map((inputName) => inputs[inputName]);\n            }\n            const outputTensorsToSave = outputs.filter((_, i) => outputsToSave[i]);\n            return inputTensorsToSave.concat(outputTensorsToSave);\n        }\n        // We return an empty list rather than throw an error because the kernel we\n        // are looking up may not actually be relevant to backproping through the\n        // overall function\n        //\n        // See 'does not error if irrelevant (pruned) ops are missing grads' test\n        // in gradients_test.ts for an example.\n        return [];\n    }\n    /**\n     * Internal method used by public APIs for tensor creation. Makes a new\n     * tensor with the provided shape, dtype and values. It always\n     * creates a new data id and writes the values to the underlying backend.\n     */\n    makeTensor(values, shape, dtype, backend) {\n        if (values == null) {\n            throw new Error('Values passed to engine.makeTensor() are null');\n        }\n        dtype = dtype || 'float32';\n        backend = backend || this.backend;\n        let backendVals = values;\n        if (dtype === 'string' && util.isString(values[0])) {\n            backendVals = values.map(d => util.encodeString(d));\n        }\n        const dataId = backend.write(backendVals, shape, dtype);\n        const t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n        this.trackTensor(t, backend);\n        // Count bytes for string tensors.\n        if (dtype === 'string') {\n            const info = this.state.tensorInfo.get(dataId);\n            const newBytes = bytesFromStringArray(backendVals);\n            this.state.numBytes += newBytes - info.bytes;\n            info.bytes = newBytes;\n        }\n        return t;\n    }\n    /**\n     * Internal method used by backends. Makes a new tensor\n     * that is a wrapper around an existing data id. It doesn't create\n     * a new data id, only increments the ref count used in memory tracking.\n     * @deprecated\n     */\n    makeTensorFromDataId(dataId, shape, dtype, backend) {\n        dtype = dtype || 'float32';\n        const tensorInfo = { dataId, shape, dtype };\n        return this.makeTensorFromTensorInfo(tensorInfo, backend);\n    }\n    /**\n     * Internal method used by backends. Makes a new tensor that is a wrapper\n     * around an existing data id in TensorInfo. It doesn't create a new data id,\n     * only increments the ref count used in memory tracking.\n     */\n    makeTensorFromTensorInfo(tensorInfo, backend) {\n        const { dataId, shape, dtype } = tensorInfo;\n        const t = new Tensor(shape, dtype, dataId, this.nextTensorId());\n        this.trackTensor(t, backend);\n        return t;\n    }\n    makeVariable(initialValue, trainable = true, name, dtype) {\n        name = name || this.nextVariableId().toString();\n        if (dtype != null && dtype !== initialValue.dtype) {\n            initialValue = initialValue.cast(dtype);\n        }\n        const v = new Variable(initialValue, trainable, name, this.nextTensorId());\n        if (this.state.registeredVariables[v.name] != null) {\n            throw new Error(`Variable with name ${v.name} was already registered`);\n        }\n        this.state.registeredVariables[v.name] = v;\n        this.incRef(v, this.backend);\n        return v;\n    }\n    trackTensor(a, backend) {\n        this.state.numTensors++;\n        if (a.dtype === 'string') {\n            this.state.numStringTensors++;\n        }\n        // Bytes for complex numbers are counted by their components. Bytes for\n        // string tensors are counted when writing values.\n        let bytes = 0;\n        if (a.dtype !== 'complex64' && a.dtype !== 'string') {\n            bytes = a.size * util.bytesPerElement(a.dtype);\n        }\n        this.state.numBytes += bytes;\n        if (!this.state.tensorInfo.has(a.dataId)) {\n            this.state.numDataBuffers++;\n            this.state.tensorInfo.set(a.dataId, {\n                backend: backend || this.backend,\n                dtype: a.dtype,\n                shape: a.shape,\n                bytes\n            });\n        }\n        if (!(a instanceof Variable)) {\n            this.track(a);\n        }\n    }\n    // Track the tensor by dataId and increase the refCount for the dataId in the\n    // backend.\n    // TODO(pyu10055): This is currently used by makeVariable method, to increase\n    // refCount on the backend for the dataId. It can potentially be replaced with\n    // Identity op indead of calling backend directly.\n    incRef(a, backend) {\n        this.trackTensor(a, backend);\n        this.backend.incRef(a.dataId);\n    }\n    removeDataId(dataId, backend) {\n        if (this.state.tensorInfo.has(dataId) &&\n            this.state.tensorInfo.get(dataId).backend === backend) {\n            this.state.tensorInfo.delete(dataId);\n            this.state.numDataBuffers--;\n        }\n    }\n    disposeTensor(a) {\n        if (!this.state.tensorInfo.has(a.dataId)) {\n            return;\n        }\n        const info = this.state.tensorInfo.get(a.dataId);\n        this.state.numTensors--;\n        if (a.dtype === 'string') {\n            this.state.numStringTensors--;\n            this.state.numBytes -= info.bytes;\n        }\n        // Don't count bytes for complex numbers as they are counted by their\n        // components.\n        if (a.dtype !== 'complex64' && a.dtype !== 'string') {\n            const bytes = a.size * util.bytesPerElement(a.dtype);\n            this.state.numBytes -= bytes;\n        }\n        // Remove the reference to dataId if backend dispose the data successfully\n        if (info.backend.disposeData(a.dataId)) {\n            this.removeDataId(a.dataId, info.backend);\n        }\n        // TODO(nsthorat): Construct an error and save the stack trace for\n        // debugging when in debug mode. Creating a stack trace is too expensive\n        // to do unconditionally.\n    }\n    disposeVariables() {\n        for (const varName in this.state.registeredVariables) {\n            const v = this.state.registeredVariables[varName];\n            this.disposeVariable(v);\n        }\n    }\n    disposeVariable(v) {\n        this.disposeTensor(v);\n        if (this.state.registeredVariables[v.name] != null) {\n            delete this.state.registeredVariables[v.name];\n        }\n    }\n    memory() {\n        const info = this.backend.memory();\n        info.numTensors = this.state.numTensors;\n        info.numDataBuffers = this.state.numDataBuffers;\n        info.numBytes = this.state.numBytes;\n        if (this.state.numStringTensors > 0) {\n            info.unreliable = true;\n            if (info.reasons == null) {\n                info.reasons = [];\n            }\n            info.reasons.push('Memory usage by string tensors is approximate ' +\n                '(2 bytes per character)');\n        }\n        return info;\n    }\n    async profile(query) {\n        this.state.profiling = true;\n        const startBytes = this.state.numBytes;\n        const startNumTensors = this.state.numTensors;\n        this.state.activeProfile.kernels = [];\n        this.state.activeProfile.result = await query();\n        this.state.profiling = false;\n        this.state.activeProfile.peakBytes = Math.max(...this.state.activeProfile.kernels.map(d => d.totalBytesSnapshot));\n        this.state.activeProfile.newBytes = this.state.numBytes - startBytes;\n        this.state.activeProfile.newTensors =\n            this.state.numTensors - startNumTensors;\n        for (const kernel of this.state.activeProfile.kernels) {\n            kernel.kernelTimeMs = await kernel.kernelTimeMs;\n            kernel.extraInfo = await kernel.extraInfo;\n        }\n        return this.state.activeProfile;\n    }\n    isTapeOn() {\n        return this.state.gradientDepth > 0 && this.state.kernelDepth === 0;\n    }\n    addTapeNode(kernelName, inputs, outputs, gradientsFunc, saved, attrs) {\n        const tapeNode = { id: this.state.nextTapeNodeId++, kernelName, inputs, outputs, saved };\n        const gradConfig = getGradient(kernelName);\n        if (gradConfig != null) {\n            gradientsFunc = gradConfig.gradFunc;\n        }\n        if (gradientsFunc != null) {\n            tapeNode.gradient = (dys) => {\n                // TODO(smilkov): To optimize back-prop, pass dys that are not used in\n                // the backprop graph to the user as null instead of zeros\n                dys = dys.map((dy, i) => {\n                    if (dy == null) {\n                        const output = outputs[i];\n                        const vals = util.makeZerosTypedArray(output.size, output.dtype);\n                        return this.makeTensor(vals, output.shape, output.dtype);\n                    }\n                    return dy;\n                });\n                // Grad functions of ops with single outputs expect a dy, while ops\n                // with multiple outputs expect dys (array of dy).\n                return gradientsFunc(dys.length > 1 ? dys : dys[0], saved, attrs);\n            };\n        }\n        this.state.activeTape.push(tapeNode);\n    }\n    keep(result) {\n        result.kept = true;\n        return result;\n    }\n    startTape() {\n        if (this.state.gradientDepth === 0) {\n            this.state.activeTape = [];\n        }\n        this.state.gradientDepth++;\n    }\n    endTape() {\n        this.state.gradientDepth--;\n    }\n    /**\n     * Start a scope. Use this with endScope() to achieve the same functionality\n     * as scope() without the need for a function closure.\n     */\n    startScope(name) {\n        const scopeInfo = {\n            track: [],\n            name: 'unnamed scope',\n            id: this.state.nextScopeId++\n        };\n        if (name) {\n            scopeInfo.name = name;\n        }\n        this.state.scopeStack.push(scopeInfo);\n        this.state.activeScope = scopeInfo;\n    }\n    /**\n     * End a scope. Use this with startScope() to achieve the same functionality\n     * as scope() without the need for a function closure.\n     */\n    endScope(result) {\n        const tensorsToTrackInParent = getTensorsInContainer(result);\n        const tensorsToTrackInParentSet = new Set(tensorsToTrackInParent.map(t => t.id));\n        // Dispose the arrays tracked in this scope.\n        for (let i = 0; i < this.state.activeScope.track.length; i++) {\n            const tensor = this.state.activeScope.track[i];\n            if (!tensor.kept && !tensorsToTrackInParentSet.has(tensor.id)) {\n                tensor.dispose();\n            }\n        }\n        const oldScope = this.state.scopeStack.pop();\n        this.state.activeScope = this.state.scopeStack.length === 0 ?\n            null :\n            this.state.scopeStack[this.state.scopeStack.length - 1];\n        // Track the current result in the parent scope.\n        tensorsToTrackInParent.forEach(tensor => {\n            // Only track the tensor if was allocated in the inner scope and is not\n            // globally kept.\n            if (!tensor.kept && tensor.scopeId === oldScope.id) {\n                this.track(tensor);\n            }\n        });\n    }\n    /**\n     * Returns gradients of `f` with respect to each of the `xs`. The gradients\n     * returned are of the same length as `xs`, but some might be null if `f`\n     * was not a function of that `x`. It also takes optional dy to multiply the\n     * gradient, which defaults to `1`.\n     */\n    gradients(f, xs, dy, allowNoGradients = false) {\n        util.assert(xs.length > 0, () => 'gradients() received an empty list of xs.');\n        if (dy != null && dy.dtype !== 'float32') {\n            throw new Error(`dy must have 'float32' dtype, but has '${dy.dtype}'`);\n        }\n        const y = this.scopedRun(() => this.startTape(), () => this.endTape(), () => this.tidy('forward', f));\n        util.assert(y instanceof Tensor, () => 'The result y returned by f() must be a tensor.');\n        // Filter out the nodes that don't connect x => y.\n        const filteredTape = getFilteredNodesXToY(this.state.activeTape, xs, y);\n        if (!allowNoGradients && filteredTape.length === 0 && xs.length > 0) {\n            throw new Error('Cannot compute gradient of y=f(x) with respect to x. Make sure ' +\n                'that the f you passed encloses all operations that lead from x ' +\n                'to y.');\n        }\n        return this.tidy('backward', () => {\n            const accumulatedGradientMap = {};\n            accumulatedGradientMap[y.id] = (dy == null) ? ones(y.shape) : dy;\n            // Backprop gradients through the filtered nodes.\n            backpropagateGradients(accumulatedGradientMap, filteredTape, \n            // Pass the tidy function to avoid circular dep with `tape.ts`.\n            f => this.tidy(f), \n            // Pass an add function to avoide a circular dep with `tape.ts`.\n            add);\n            const grads = xs.map(x => accumulatedGradientMap[x.id]);\n            if (this.state.gradientDepth === 0) {\n                // This means that we are not computing higher-order gradients\n                // and can clean up the tape.\n                this.state.activeTape.forEach(node => {\n                    for (const tensor of node.saved) {\n                        tensor.dispose();\n                    }\n                });\n                this.state.activeTape = null;\n            }\n            return { value: y, grads };\n        });\n    }\n    customGrad(f) {\n        util.assert(util.isFunction(f), () => 'The f passed in customGrad(f) must be a function.');\n        return (...inputs) => {\n            util.assert(inputs.every(t => t instanceof Tensor), () => 'The args passed in customGrad(f)(x1, x2,...) must all be ' +\n                'tensors');\n            let res;\n            const inputMap = {};\n            inputs.forEach((input, i) => {\n                inputMap[i] = input;\n            });\n            const forwardFunc = (_, save) => {\n                res = f(...[...inputs, save]);\n                util.assert(res.value instanceof Tensor, () => 'The function f passed in customGrad(f) must return an ' +\n                    'object where `obj.value` is a tensor');\n                util.assert(util.isFunction(res.gradFunc), () => 'The function f passed in customGrad(f) must return an ' +\n                    'object where `obj.gradFunc` is a function.');\n                return res.value;\n            };\n            const backwardsFunc = (dy, saved) => {\n                const gradRes = res.gradFunc(dy, saved);\n                const grads = Array.isArray(gradRes) ? gradRes : [gradRes];\n                util.assert(grads.length === inputs.length, () => 'The function f passed in customGrad(f) must return an ' +\n                    'object where `obj.gradFunc` is a function that returns ' +\n                    'the same number of tensors as inputs passed to f(...).');\n                util.assert(grads.every(t => t instanceof Tensor), () => 'The function f passed in customGrad(f) must return an ' +\n                    'object where `obj.gradFunc` is a function that returns ' +\n                    'a list of only tensors.');\n                const gradMap = {};\n                grads.forEach((grad, i) => {\n                    gradMap[i] = () => grad;\n                });\n                return gradMap;\n            };\n            return this.runKernelFunc({\n                forwardFunc,\n                backwardsFunc,\n                inputs: inputMap,\n            });\n        };\n    }\n    readSync(dataId) {\n        // Route the read to the correct backend.\n        const info = this.state.tensorInfo.get(dataId);\n        return info.backend.readSync(dataId);\n    }\n    read(dataId) {\n        // Route the read to the correct backend.\n        const info = this.state.tensorInfo.get(dataId);\n        return info.backend.read(dataId);\n    }\n    readToGPU(dataId, options) {\n        // Route the read to the correct backend.\n        const info = this.state.tensorInfo.get(dataId);\n        return info.backend.readToGPU(dataId, options);\n    }\n    async time(query) {\n        const start = now();\n        const timingInfo = await this.backend.time(query);\n        timingInfo.wallMs = now() - start;\n        return timingInfo;\n    }\n    /**\n     * Tracks a Tensor in the current scope to be automatically cleaned up\n     * when the current scope ends, and returns the value.\n     *\n     * @param result The Tensor to track in the current scope.\n     */\n    track(result) {\n        if (this.state.activeScope != null) {\n            result.scopeId = this.state.activeScope.id;\n            this.state.activeScope.track.push(result);\n        }\n        return result;\n    }\n    get registeredVariables() {\n        return this.state.registeredVariables;\n    }\n    /**\n     * Resets the engine state. Removes all backends but does not remove\n     * registered backend factories.\n     */\n    reset() {\n        // Make any pending promise obsolete.\n        this.pendingBackendInitId++;\n        this.state.dispose();\n        this.ENV.reset();\n        this.state = new EngineState();\n        for (const backendName in this.registry) {\n            this.disposeRegisteredKernels(backendName);\n            this.registry[backendName].dispose();\n            delete this.registry[backendName];\n        }\n        this.backendName = null;\n        this.backendInstance = null;\n        this.pendingBackendInit = null;\n    }\n}\nEngine.nextTensorId = 0;\nEngine.nextVariableId = 0;\nfunction ones(shape) {\n    const values = makeOnesTypedArray(sizeFromShape(shape), 'float32');\n    return ENGINE.makeTensor(values, shape, 'float32');\n}\nexport function getOrMakeEngine() {\n    const ns = getGlobalNamespace();\n    if (ns._tfengine == null) {\n        const environment = new Environment(ns);\n        ns._tfengine = new Engine(environment);\n    }\n    setEnvironmentGlobal(ns._tfengine.ENV);\n    // Tell the current tensor interface that the global engine is responsible\n    // for tracking.\n    setTensorTracker(() => ns._tfengine);\n    return ns._tfengine;\n}\nexport const ENGINE = getOrMakeEngine();\n/**\n * A implementation of the add op for use within engine and tape.\n *\n * This allows us to avoid a circular dependency between add.ts and engine.\n * It is exported to be available in tape tests.\n */\nexport function add(a, b) {\n    // We duplicate Add here to avoid a circular dependency with add.ts.\n    const inputs = { a, b };\n    return ENGINE.runKernel(Add, inputs);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5naW5lLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9lbmdpbmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUErQixhQUFhLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMvRSxPQUFPLEVBQUMsV0FBVyxFQUFFLG9CQUFvQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNqRCxPQUFPLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxvQkFBb0IsRUFBcUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNuSCxPQUFPLEtBQUssR0FBRyxNQUFNLE9BQU8sQ0FBQztBQUM3QixPQUFPLEVBQWdCLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQVcsTUFBTSxRQUFRLENBQUM7QUFDOUUsT0FBTyxFQUFvQyxnQkFBZ0IsRUFBRSxNQUFNLEVBQWlCLFFBQVEsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUU5RyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFcEQsT0FBTyxLQUFLLElBQUksTUFBTSxRQUFRLENBQUM7QUFDL0IsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGtCQUFrQixFQUFFLEdBQUcsRUFBRSxhQUFhLEVBQUMsTUFBTSxRQUFRLENBQUM7QUF1RXBGLFNBQVMsNEJBQTRCLENBRWpDLGdCQUNnQztJQUVsQyxPQUFRLGdCQUFrRCxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sV0FBVztJQUFqQjtRQUNFLHVDQUF1QztRQUN2Qyx3QkFBbUIs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eEJwQyxTQUFTLElBQUksQ0FBQyxLQUFlO0lBQzNCLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNuRSxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWU7SUFDN0IsTUFBTSxFQUFFLEdBQUcsa0JBQWtCLEVBQStCLENBQUM7SUFDN0QsSUFBSSxFQUFFLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtRQUN4QixNQUFNLFdBQVcsR0FBRyxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN4QyxFQUFFLENBQUMsU0FBUyxHQUFHLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0tBQ3hDO0lBQ0Qsb0JBQW9CLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2QywwRUFBMEU7SUFDMUUsZ0JBQWdCO0lBQ2hCLGdCQUFnQixDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNyQyxPQUFPLEVBQUUsQ0FBQyxTQUFTLENBQUM7QUFDdEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxlQUFlLEVBQUUsQ0FBQztBQUV4Qzs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxHQUFHLENBQUMsQ0FBUyxFQUFFLENBQVM7SUFDdEMsb0VBQW9FO0lBQ3BFLE1BQU0sTUFBTSxHQUFHLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ3RCLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QmFja2VuZFRpbWluZ0luZm8sIERhdGFNb3ZlciwgS2VybmVsQmFja2VuZH0gZnJvbSAnLi9iYWNrZW5kcy9iYWNrZW5kJztcbmltcG9ydCB7RW52aXJvbm1lbnQsIHNldEVudmlyb25tZW50R2xvYmFsfSBmcm9tICcuL2Vudmlyb25tZW50JztcbmltcG9ydCB7Z2V0R2xvYmFsTmFtZXNwYWNlfSBmcm9tICcuL2dsb2JhbF91dGlsJztcbmltcG9ydCB7QWRkLCBDYXN0LCBJZGVudGl0eX0gZnJvbSAnLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtnZXRHcmFkaWVudCwgZ2V0S2VybmVsLCBnZXRLZXJuZWxzRm9yQmFja2VuZCwgR3JhZEZ1bmMsIE5hbWVkQXR0ck1hcCwgVGVuc29ySW5mb30gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0ICogYXMgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7S2VybmVsUHJvZmlsZSwgUHJvZmlsZXJ9IGZyb20gJy4vcHJvZmlsZXInO1xuaW1wb3J0IHtiYWNrcHJvcGFnYXRlR3JhZGllbnRzLCBnZXRGaWx0ZXJlZE5vZGVzWFRvWSwgVGFwZU5vZGV9IGZyb20gJy4vdGFwZSc7XG5pbXBvcnQge0RhdGFJZCwgRGF0YVRvR1BVT3B0aW9ucywgR1BVRGF0YSwgc2V0VGVuc29yVHJhY2tlciwgVGVuc29yLCBUZW5zb3JUcmFja2VyLCBWYXJpYWJsZX0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHtHcmFkU2F2ZUZ1bmMsIE5hbWVkVGVuc29yTWFwLCBOYW1lZFZhcmlhYmxlTWFwLCBUZW5zb3JDb250YWluZXJ9IGZyb20gJy4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Z2V0VGVuc29yc0luQ29udGFpbmVyfSBmcm9tICcuL3RlbnNvcl91dGlsJztcbmltcG9ydCB7QmFja2VuZFZhbHVlcywgRGF0YVR5cGUsIERhdGFWYWx1ZXN9IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuL3V0aWwnO1xuaW1wb3J0IHtieXRlc0Zyb21TdHJpbmdBcnJheSwgbWFrZU9uZXNUeXBlZEFycmF5LCBub3csIHNpemVGcm9tU2hhcGV9IGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogQSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIGFuIG91dHB1dC4gVGhlIHNhdmUgZnVuY3Rpb24gaXMgZm9yIHNhdmluZyB0ZW5zb3JzXG4gKiBjb21wdXRlZCBpbiB0aGUgZm9yd2FyZCBwYXNzLCB0aGF0IHdlIG5lZWQgaW4gdGhlIGJhY2t3YXJkIHBhc3MuXG4gKi9cbmV4cG9ydCB0eXBlIEZvcndhcmRGdW5jPFQ+ID0gKGJhY2tlbmQ6IEtlcm5lbEJhY2tlbmQsIHNhdmU/OiBHcmFkU2F2ZUZ1bmMpID0+IFQ7XG5cbi8qKlxuICogQGRvY2FsaWFzIChhOiBUZW5zb3IsIGI6IFRlbnNvciwuLi4sIHNhdmU/OiBGdW5jdGlvbikgPT4ge1xuICogICB2YWx1ZTogVGVuc29yLFxuICogICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkPzogTmFtZWRUZW5zb3JNYXApID0+IFRlbnNvciB8IFRlbnNvcltdXG4gKiB9XG4gKi9cbmV4cG9ydCB0eXBlIEN1c3RvbUdyYWRpZW50RnVuYzxUIGV4dGVuZHMgVGVuc29yPiA9XG4gICAgKC4uLmlucHV0czogQXJyYXk8VGVuc29yfEdyYWRTYXZlRnVuYz4pID0+IHtcbiAgICAgIHZhbHVlOiBUO1xuICAgICAgZ3JhZEZ1bmM6IChkeTogVCwgc2F2ZWQ6IFRlbnNvcltdKSA9PiBUZW5zb3IgfCBUZW5zb3JbXTtcbiAgICB9O1xuXG5leHBvcnQgdHlwZSBNZW1vcnlJbmZvID0ge1xuICBudW1UZW5zb3JzOiBudW1iZXI7IG51bURhdGFCdWZmZXJzOiBudW1iZXI7IG51bUJ5dGVzOiBudW1iZXI7XG4gIHVucmVsaWFibGU/OiBib29sZWFuOyByZWFzb25zOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgS2VybmVsSW5mbyA9IHtcbiAgbmFtZTogc3RyaW5nOyBieXRlc0FkZGVkOiBudW1iZXI7IHRvdGFsQnl0ZXNTbmFwc2hvdDogbnVtYmVyO1xuICB0ZW5zb3JzQWRkZWQ6IG51bWJlcjtcbiAgdG90YWxUZW5zb3JzU25hcHNob3Q6IG51bWJlcjtcbiAgaW5wdXRTaGFwZXM6IG51bWJlcltdW107XG4gIG91dHB1dFNoYXBlczogbnVtYmVyW11bXTtcbiAga2VybmVsVGltZU1zOiBudW1iZXIgfCB7ZXJyb3I6IHN0cmluZ30gfCBQcm9taXNlPG51bWJlcnx7ZXJyb3I6IHN0cmluZ30+O1xuICBleHRyYUluZm86IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPjtcbn07XG5cbmV4cG9ydCB0eXBlIFByb2ZpbGVJbmZvID0ge1xuICBuZXdCeXRlczogbnVtYmVyOyBuZXdUZW5zb3JzOiBudW1iZXI7IHBlYWtCeXRlczogbnVtYmVyO1xuICBrZXJuZWxzOiBLZXJuZWxJbmZvW107XG4gIHJlc3VsdDogVGVuc29yQ29udGFpbmVyO1xuICBrZXJuZWxOYW1lczogc3RyaW5nW107XG59O1xuXG5leHBvcnQgaW50ZXJmYWNlIFRpbWluZ0luZm8gZXh0ZW5kcyBCYWNrZW5kVGltaW5nSW5mbyB7XG4gIHdhbGxNczogbnVtYmVyO1xufVxuXG4vKiogQGRvY2FsaWFzIEZ1bmN0aW9uICovXG5leHBvcnQgdHlwZSBTY29wZUZuPFQgZXh0ZW5kcyBUZW5zb3JDb250YWluZXI+ID0gKCkgPT4gVDtcblxuaW50ZXJmYWNlIFNjb3BlU3RhdGUge1xuICB0cmFjazogVGVuc29yW107XG4gIG5hbWU6IHN0cmluZztcbiAgaWQ6IG51bWJlcjtcbn1cblxuaW50ZXJmYWNlIFJlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uPEkgZXh0ZW5kcyBOYW1lZFRlbnNvck1hcD4ge1xuICBrZXJuZWxOYW1lOiBzdHJpbmc7XG4gIGlucHV0czogSTtcbiAgYXR0cnM/OiBOYW1lZEF0dHJNYXA7XG59XG5cbmludGVyZmFjZSBDdXN0b21HcmFkS2VybmVsSW52b2NhdGlvbjxUIGV4dGVuZHMgVGVuc29yfFRlbnNvcltdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJIGV4dGVuZHMgTmFtZWRUZW5zb3JNYXA+IHtcbiAgZm9yd2FyZEZ1bmM6IEZvcndhcmRGdW5jPFQ+O1xuICBiYWNrd2FyZHNGdW5jOiAoZHk6IFQsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIFtQIGluIGtleW9mIEldOiAoKSA9PiBJW1BdXG4gIH07XG4gIGlucHV0czogSTtcbiAgYXR0cnM/OiBOYW1lZEF0dHJNYXA7XG59XG5cbmZ1bmN0aW9uIGlzUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb248VCBleHRlbmRzIFRlbnNvcnxUZW5zb3JbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEkgZXh0ZW5kcyBOYW1lZFRlbnNvck1hcD4oXG4gICAga2VybmVsSW52b2NhdGlvbjogUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb248ST58XG4gICAgQ3VzdG9tR3JhZEtlcm5lbEludm9jYXRpb248VCwgST4pOlxuICAgIGtlcm5lbEludm9jYXRpb24gaXMgUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb248ST4ge1xuICByZXR1cm4gKGtlcm5lbEludm9jYXRpb24gYXMgUmVnaXN0ZXJlZEtlcm5lbEludm9jYXRpb248ST4pLmtlcm5lbE5hbWUgIT0gbnVsbDtcbn1cblxuY2xhc3MgRW5naW5lU3RhdGUge1xuICAvLyBQdWJsaWMgc2luY2Ugb3B0aW1pemVycyB3aWxsIHVzZSBpdC5cbiAgcmVnaXN0ZXJlZFZhcmlhYmxlczogTmFtZWRWYXJpYWJsZU1hcCA9IHt9O1xuXG4gIG5leHRUYXBlTm9kZUlkID0gMDtcbiAgbnVtQnl0ZXMgPSAwO1xuICBudW1UZW5zb3JzID0gMDtcbiAgbnVtU3RyaW5nVGVuc29ycyA9IDA7XG4gIG51bURhdGFCdWZmZXJzID0gMDtcblxuICBhY3RpdmVUYXBlOiBUYXBlTm9kZVtdO1xuICAvLyBOdW1iZXIgb2YgbmVzdGVkIHRmLmdyYWQoKSBzdGF0ZW1lbnRzIHdoZW4gY29tcHV0aW5nIGhpZ2hlci1vcmRlclxuICAvLyBncmFkaWVudHMuIEUuZy4gYDFgIGZvciBmaXJzdC1vcmRlciBncmFkaWVudHMgYW5kIGAyYCBmb3Igc2Vjb25kLW9yZGVyXG4gIC8vIGdyYWRpZW50cy4gVXNlZCB0byB0cmFjayBpZiB0aGUgdGFwZSBzaG91bGQgYmUgcmVtb3ZlZCBhZnRlciBhIGJhY2twcm9wLlxuICBncmFkaWVudERlcHRoID0gMDtcbiAgLy8gTnVtYmVyIG9mIG5lc3RlZCBrZXJuZWwgY2FsbHMuIFdoZW4ga2VybmVsIGRlcHRoIGlzIGdyZWF0ZXIgdGhhbiAxLCB3ZSB0dXJuXG4gIC8vIG9mZiB0aGUgdGFwZS5cbiAga2VybmVsRGVwdGggPSAwO1xuXG4gIC8vIEtlZXAgVGVuc29ycyB0aGF0IHBhcmFsbGVsIHRoZSB0YXBlcy5cbiAgYWN0aXZlU2NvcGU6IFNjb3BlU3RhdGU7XG4gIHNjb3BlU3RhY2s6IFNjb3BlU3RhdGVbXSA9IFtdO1xuICAvKipcbiAgICogS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBkYXRhIG1vdmVzIGR1cmluZyBhIGtlcm5lbCBleGVjdXRpb24uIFdlXG4gICAqIG1haW50YWluIGEgc3RhY2sgc2luY2Uga2VybmVscyBjYW4gY2FsbCBvdGhlciBrZXJuZWxzLCByZWN1cnNpdmVseS5cbiAgICovXG4gIG51bURhdGFNb3Zlc1N0YWNrOiBudW1iZXJbXSA9IFtdO1xuICBuZXh0U2NvcGVJZCA9IDA7XG5cbiAgdGVuc29ySW5mbyA9IG5ldyBXZWFrTWFwPERhdGFJZCwge1xuICAgIGJhY2tlbmQ6IEtlcm5lbEJhY2tlbmQsXG4gICAgYnl0ZXM6IG51bWJlcixcbiAgICBkdHlwZTogRGF0YVR5cGUsXG4gICAgc2hhcGU6IG51bWJlcltdXG4gIH0+KCk7XG5cbiAgcHJvZmlsaW5nID0gZmFsc2U7XG4gIGFjdGl2ZVByb2ZpbGU6IFByb2ZpbGVJbmZvID0ge1xuICAgIG5ld0J5dGVzOiAwLFxuICAgIG5ld1RlbnNvcnM6IDAsXG4gICAgcGVha0J5dGVzOiAwLFxuICAgIGtlcm5lbHM6IFtdLFxuICAgIHJlc3VsdDogbnVsbCxcbiAgICBnZXQga2VybmVsTmFtZXMoKTpcbiAgICAgICAgc3RyaW5nW10ge1xuICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKG5ldyBTZXQodGhpcy5rZXJuZWxzLm1hcChrID0+IGsubmFtZSkpKTtcbiAgICAgICAgfVxuICB9O1xuXG4gIGRpc3Bvc2UoKSB7XG4gICAgZm9yIChjb25zdCB2YXJpYWJsZU5hbWUgaW4gdGhpcy5yZWdpc3RlcmVkVmFyaWFibGVzKSB7XG4gICAgICB0aGlzLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdmFyaWFibGVOYW1lXS5kaXNwb3NlKCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBFbmdpbmUgaW1wbGVtZW50cyBUZW5zb3JUcmFja2VyLCBEYXRhTW92ZXIge1xuICBzdGF0ZTogRW5naW5lU3RhdGU7XG4gIGJhY2tlbmROYW1lOiBzdHJpbmc7XG4gIHJlZ2lzdHJ5OiB7W2lkOiBzdHJpbmddOiBLZXJuZWxCYWNrZW5kfSA9IHt9O1xuICByZWdpc3RyeUZhY3Rvcnk6IHtcbiAgICBbaWQ6IHN0cmluZ106IHtcbiAgICAgIGZhY3Rvcnk6ICgpID0+IEtlcm5lbEJhY2tlbmQgfCBQcm9taXNlPEtlcm5lbEJhY2tlbmQ+LFxuICAgICAgcHJpb3JpdHk6IG51bWJlclxuICAgIH1cbiAgfSA9IHt9O1xuXG4gIHByaXZhdGUgcHJvZmlsZXI6IFByb2ZpbGVyO1xuICBwcml2YXRlIGJhY2tlbmRJbnN0YW5jZTogS2VybmVsQmFja2VuZDtcbiAgcHJpdmF0ZSBwZW5kaW5nQmFja2VuZEluaXQ6IFByb21pc2U8Ym9vbGVhbj47XG4gIHByaXZhdGUgcGVuZGluZ0JhY2tlbmRJbml0SWQgPSAwO1xuXG4gIGNvbnN0cnVjdG9yKHB1YmxpYyBFTlY6IEVudmlyb25tZW50KSB7XG4gICAgdGhpcy5zdGF0ZSA9IG5ldyBFbmdpbmVTdGF0ZSgpO1xuICB9XG5cbiAgYXN5bmMgcmVhZHkoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdC50aGVuKCgpID0+IHt9KTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFja2VuZEluc3RhbmNlICE9IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc29ydGVkQmFja2VuZHMgPSB0aGlzLmdldFNvcnRlZEJhY2tlbmRzKCk7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNvcnRlZEJhY2tlbmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBiYWNrZW5kTmFtZSA9IHNvcnRlZEJhY2tlbmRzW2ldO1xuICAgICAgY29uc3Qgc3VjY2VzcyA9IGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpLnN1Y2Nlc3M7XG4gICAgICBpZiAoc3VjY2Vzcykge1xuICAgICAgICBhd2FpdCB0aGlzLnNldEJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGluaXRpYWxpemUgYW55IGJhY2tlbmRzLCBhbGwgYmFja2VuZCBpbml0aWFsaXphdGlvbnMgYCArXG4gICAgICAgIGBmYWlsZWQuYCk7XG4gIH1cblxuICBnZXQgYmFja2VuZCgpOiBLZXJuZWxCYWNrZW5kIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBCYWNrZW5kICcke3RoaXMuYmFja2VuZE5hbWV9JyBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLiBNYWtlIGAgK1xuICAgICAgICAgIGBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYXdhaXQgdGYuc2V0QmFja2VuZCgpIGJlZm9yZSBjYWxsaW5nIGAgK1xuICAgICAgICAgIGBvdGhlciBtZXRob2RzYCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmJhY2tlbmRJbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICBjb25zdCB7bmFtZSwgYXN5bmNJbml0fSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmRzQW5kUmV0dXJuQmVzdCgpO1xuICAgICAgaWYgKGFzeW5jSW5pdCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgVGhlIGhpZ2hlc3QgcHJpb3JpdHkgYmFja2VuZCAnJHtuYW1lfScgaGFzIG5vdCB5ZXQgYmVlbiBgICtcbiAgICAgICAgICAgIGBpbml0aWFsaXplZC4gTWFrZSBzdXJlIHRvIGF3YWl0IHRmLnJlYWR5KCkgb3IgYCArXG4gICAgICAgICAgICBgYXdhaXQgdGYuc2V0QmFja2VuZCgpIGJlZm9yZSBjYWxsaW5nIG90aGVyIG1ldGhvZHNgKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2V0QmFja2VuZChuYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmFja2VuZEluc3RhbmNlO1xuICB9XG5cbiAgYmFja2VuZE5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZWdpc3RyeUZhY3RvcnkpO1xuICB9XG5cbiAgZmluZEJhY2tlbmQoYmFja2VuZE5hbWU6IHN0cmluZyk6IEtlcm5lbEJhY2tlbmQge1xuICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnkpKSB7XG4gICAgICAvLyBJZiB0aGUgYmFja2VuZCBoYXNuJ3QgYmVlbiBpbml0aWFsaXplZCBidXQgd2UgaGF2ZSBhIHJlZ2lzdHJ5IGVudHJ5IGZvclxuICAgICAgLy8gaXQsIGluaXRpYWxpemUgaXQgYW5kIHJldHVybiBpdC5cbiAgICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkge1xuICAgICAgICBjb25zdCB7YXN5bmNJbml0fSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgICBpZiAoYXN5bmNJbml0KSB7XG4gICAgICAgICAgLy8gQmFja2VuZCBpcyBub3QgcmVhZHkgeWV0LlxuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdO1xuICB9XG5cbiAgZmluZEJhY2tlbmRGYWN0b3J5KGJhY2tlbmROYW1lOiBzdHJpbmcpOlxuICAgICAgKCkgPT4gS2VybmVsQmFja2VuZCB8IFByb21pc2U8S2VybmVsQmFja2VuZD4ge1xuICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnlGYWN0b3J5KSkge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiYWNrZW5kTmFtZV0uZmFjdG9yeTtcbiAgfVxuXG4gIHJlZ2lzdGVyQmFja2VuZChcbiAgICAgIGJhY2tlbmROYW1lOiBzdHJpbmcsXG4gICAgICBmYWN0b3J5OiAoKSA9PiBLZXJuZWxCYWNrZW5kIHwgUHJvbWlzZTxLZXJuZWxCYWNrZW5kPixcbiAgICAgIHByaW9yaXR5ID0gMSk6IGJvb2xlYW4ge1xuICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkge1xuICAgICAgbG9nLndhcm4oXG4gICAgICAgICAgYCR7YmFja2VuZE5hbWV9IGJhY2tlbmQgd2FzIGFscmVhZHkgcmVnaXN0ZXJlZC4gYCArXG4gICAgICAgICAgYFJldXNpbmcgZXhpc3RpbmcgYmFja2VuZCBmYWN0b3J5LmApO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICB0aGlzLnJlZ2lzdHJ5RmFjdG9yeVtiYWNrZW5kTmFtZV0gPSB7ZmFjdG9yeSwgcHJpb3JpdHl9O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgYXN5bmMgc2V0QmFja2VuZChiYWNrZW5kTmFtZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEJhY2tlbmQgbmFtZSAnJHtiYWNrZW5kTmFtZX0nIG5vdCBmb3VuZCBpbiByZWdpc3RyeWApO1xuICAgIH1cbiAgICB0aGlzLmJhY2tlbmROYW1lID0gYmFja2VuZE5hbWU7XG4gICAgaWYgKHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdID09IG51bGwpIHtcbiAgICAgIHRoaXMuYmFja2VuZEluc3RhbmNlID0gbnVsbDtcbiAgICAgIGNvbnN0IHtzdWNjZXNzLCBhc3luY0luaXR9ID0gdGhpcy5pbml0aWFsaXplQmFja2VuZChiYWNrZW5kTmFtZSk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhc3luY0luaXQgPyBhd2FpdCBzdWNjZXNzIDogc3VjY2VzcztcbiAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXTtcbiAgICB0aGlzLnNldHVwUmVnaXN0ZXJlZEtlcm5lbHMoKTtcbiAgICAvLyBSZXNldCB0aGUgcHJvZmlsZXIuXG4gICAgdGhpcy5wcm9maWxlciA9IG5ldyBQcm9maWxlcih0aGlzLmJhY2tlbmRJbnN0YW5jZSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSZWdpc3RlcmVkS2VybmVscygpOiB2b2lkIHtcbiAgICBjb25zdCBrZXJuZWxzID0gZ2V0S2VybmVsc0ZvckJhY2tlbmQodGhpcy5iYWNrZW5kTmFtZSk7XG4gICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICBpZiAoa2VybmVsLnNldHVwRnVuYyAhPSBudWxsKSB7XG4gICAgICAgIGtlcm5lbC5zZXR1cEZ1bmModGhpcy5iYWNrZW5kSW5zdGFuY2UpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlUmVnaXN0ZXJlZEtlcm5lbHMoYmFja2VuZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGtlcm5lbHMgPSBnZXRLZXJuZWxzRm9yQmFja2VuZChiYWNrZW5kTmFtZSk7XG4gICAga2VybmVscy5mb3JFYWNoKGtlcm5lbCA9PiB7XG4gICAgICBpZiAoa2VybmVsLmRpc3Bvc2VGdW5jICE9IG51bGwpIHtcbiAgICAgICAga2VybmVsLmRpc3Bvc2VGdW5jKHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplcyBhIGJhY2tlbmQgYnkgbG9va2luZyB1cCB0aGUgYmFja2VuZCBuYW1lIGluIHRoZSBmYWN0b3J5XG4gICAqIHJlZ2lzdHJ5IGFuZCBjYWxsaW5nIHRoZSBmYWN0b3J5IG1ldGhvZC4gUmV0dXJucyBhIGJvb2xlYW4gcmVwcmVzZW50aW5nXG4gICAqIHdoZXRoZXIgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBiYWNrZW5kIHN1Y2VlZGVkLiBUaHJvd3MgYW4gZXJyb3IgaWZcbiAgICogdGhlcmUgaXMgbm8gYmFja2VuZCBpbiB0aGUgZmFjdG9yeSByZWdpc3RyeS5cbiAgICovXG4gIHByaXZhdGUgaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWU6IHN0cmluZyk6XG4gICAgICB7c3VjY2VzczogYm9vbGVhbnxQcm9taXNlPGJvb2xlYW4+LCBhc3luY0luaXQ6IGJvb2xlYW59IHtcbiAgICBjb25zdCByZWdpc3RyeUZhY3RvcnlFbnRyeSA9IHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXTtcbiAgICBpZiAocmVnaXN0cnlGYWN0b3J5RW50cnkgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBiYWNrZW5kICR7YmFja2VuZE5hbWV9LCBubyByZWdpc3RyYXRpb24gZm91bmQuYCk7XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGJhY2tlbmQgPSByZWdpc3RyeUZhY3RvcnlFbnRyeS5mYWN0b3J5KCk7XG4gICAgICAvKiBUZXN0IGlmIHRoZSBmYWN0b3J5IHJldHVybnMgYSBwcm9taXNlLlxuICAgICAgRG9uZSBpbiBhIG1vcmUgbGliZXJhbCB3YXkgdGhhblxuICAgICAgcHJldmlvdXMgJ1Byb21pc2UucmVzb2x2ZShiYWNrZW5kKT09PWJhY2tlbmQnXG4gICAgICBhcyB3ZSBuZWVkZWQgdG8gYWNjb3VudCBmb3IgY3VzdG9tIFByb21pc2VcbiAgICAgIGltcGxlbWVudGF0aW9ucyAoZS5nLiBBbmd1bGFyKSAqL1xuICAgICAgaWYgKGJhY2tlbmQgJiYgIShiYWNrZW5kIGluc3RhbmNlb2YgS2VybmVsQmFja2VuZCkgJiZcbiAgICAgICAgICB0eXBlb2YgYmFja2VuZC50aGVuID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IHByb21pc2VJZCA9ICsrdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZDtcbiAgICAgICAgY29uc3Qgc3VjY2VzcyA9XG4gICAgICAgICAgICBiYWNrZW5kXG4gICAgICAgICAgICAgICAgLnRoZW4oYmFja2VuZEluc3RhbmNlID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIE91dGRhdGVkIHByb21pc2UuIEFub3RoZXIgYmFja2VuZCB3YXMgc2V0IGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlSWQgPCB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0cnlbYmFja2VuZE5hbWVdID0gYmFja2VuZEluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIE91dGRhdGVkIHByb21pc2UuIEFub3RoZXIgYmFja2VuZCB3YXMgc2V0IGluIHRoZSBtZWFudGltZS5cbiAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlSWQgPCB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdElkKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgIGxvZy53YXJuKGBJbml0aWFsaXphdGlvbiBvZiBiYWNrZW5kICR7YmFja2VuZE5hbWV9IGZhaWxlZGApO1xuICAgICAgICAgICAgICAgICAgbG9nLndhcm4oZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgPSBzdWNjZXNzO1xuICAgICAgICByZXR1cm4ge3N1Y2Nlc3MsIGFzeW5jSW5pdDogdHJ1ZX07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXSA9IGJhY2tlbmQgYXMgS2VybmVsQmFja2VuZDtcbiAgICAgICAgcmV0dXJuIHtzdWNjZXNzOiB0cnVlLCBhc3luY0luaXQ6IGZhbHNlfTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGxvZy53YXJuKGBJbml0aWFsaXphdGlvbiBvZiBiYWNrZW5kICR7YmFja2VuZE5hbWV9IGZhaWxlZGApO1xuICAgICAgbG9nLndhcm4oZXJyLnN0YWNrIHx8IGVyci5tZXNzYWdlKTtcbiAgICAgIHJldHVybiB7c3VjY2VzczogZmFsc2UsIGFzeW5jSW5pdDogZmFsc2V9O1xuICAgIH1cbiAgfVxuXG4gIHJlbW92ZUJhY2tlbmQoYmFja2VuZE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghKGJhY2tlbmROYW1lIGluIHRoaXMucmVnaXN0cnlGYWN0b3J5KSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGAke2JhY2tlbmROYW1lfSBiYWNrZW5kIG5vdCBmb3VuZCBpbiByZWdpc3RyeWApO1xuICAgIH1cbiAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUgJiYgdGhpcy5wZW5kaW5nQmFja2VuZEluaXQgIT0gbnVsbCkge1xuICAgICAgLy8gVGhlcmUgaXMgYSBwZW5kaW5nIHByb21pc2Ugb2YgdGhlIGJhY2tlbmQgd2Ugd2FudCB0byByZW1vdmUuIE1ha2UgaXRcbiAgICAgIC8vIG9ic29sZXRlLlxuICAgICAgdGhpcy5wZW5kaW5nQmFja2VuZEluaXRJZCsrO1xuICAgIH1cblxuICAgIGlmIChiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICB0aGlzLmRpc3Bvc2VSZWdpc3RlcmVkS2VybmVscyhiYWNrZW5kTmFtZSk7XG4gICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXS5kaXNwb3NlKCk7XG4gICAgICBkZWxldGUgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV07XG4gICAgfVxuXG4gICAgZGVsZXRlIHRoaXMucmVnaXN0cnlGYWN0b3J5W2JhY2tlbmROYW1lXTtcblxuICAgIC8vIFVuc2V0IHRoZSBiYWNrZW5kIGlmIGl0IGlzIGFjdGl2ZS5cbiAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PT0gYmFja2VuZE5hbWUpIHtcbiAgICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0ID0gbnVsbDtcbiAgICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgICAgdGhpcy5iYWNrZW5kSW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0U29ydGVkQmFja2VuZHMoKTogc3RyaW5nW10ge1xuICAgIGlmIChPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGJhY2tlbmQgZm91bmQgaW4gcmVnaXN0cnkuJyk7XG4gICAgfVxuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlZ2lzdHJ5RmFjdG9yeSkuc29ydCgoYTogc3RyaW5nLCBiOiBzdHJpbmcpID0+IHtcbiAgICAgIC8vIEhpZ2hlc3QgcHJpb3JpdHkgY29tZXMgZmlyc3QuXG4gICAgICByZXR1cm4gdGhpcy5yZWdpc3RyeUZhY3RvcnlbYl0ucHJpb3JpdHkgLVxuICAgICAgICAgIHRoaXMucmVnaXN0cnlGYWN0b3J5W2FdLnByaW9yaXR5O1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBpbml0aWFsaXplQmFja2VuZHNBbmRSZXR1cm5CZXN0KCk6XG4gICAgICB7bmFtZTogc3RyaW5nLCBhc3luY0luaXQ6IGJvb2xlYW59IHtcbiAgICBjb25zdCBzb3J0ZWRCYWNrZW5kcyA9IHRoaXMuZ2V0U29ydGVkQmFja2VuZHMoKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkQmFja2VuZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGJhY2tlbmROYW1lID0gc29ydGVkQmFja2VuZHNbaV07XG4gICAgICBjb25zdCB7c3VjY2VzcywgYXN5bmNJbml0fSA9IHRoaXMuaW5pdGlhbGl6ZUJhY2tlbmQoYmFja2VuZE5hbWUpO1xuICAgICAgaWYgKGFzeW5jSW5pdCB8fCBzdWNjZXNzKSB7XG4gICAgICAgIHJldHVybiB7bmFtZTogYmFja2VuZE5hbWUsIGFzeW5jSW5pdH07XG4gICAgICB9XG4gICAgfVxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENvdWxkIG5vdCBpbml0aWFsaXplIGFueSBiYWNrZW5kcywgYWxsIGJhY2tlbmQgaW5pdGlhbGl6YXRpb25zIGAgK1xuICAgICAgICBgZmFpbGVkLmApO1xuICB9XG5cbiAgbW92ZURhdGEoYmFja2VuZDogS2VybmVsQmFja2VuZCwgZGF0YUlkOiBEYXRhSWQpIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHNyY0JhY2tlbmQgPSBpbmZvLmJhY2tlbmQ7XG4gICAgY29uc3QgdmFsdWVzID0gdGhpcy5yZWFkU3luYyhkYXRhSWQpO1xuICAgIGNvbnN0IHJlZkNvdW50ID0gc3JjQmFja2VuZC5yZWZDb3VudChkYXRhSWQpO1xuICAgIC8vIERlbGV0ZSB0aGUgdGVuc29yIGZyb20gdGhlIG9sZCBiYWNrZW5kIGFuZCBtb3ZlIGl0IHRvIHRoZSBuZXdcbiAgICAvLyBiYWNrZW5kLlxuICAgIHNyY0JhY2tlbmQuZGlzcG9zZURhdGEoZGF0YUlkLCB0cnVlKTtcbiAgICBpbmZvLmJhY2tlbmQgPSBiYWNrZW5kO1xuICAgIGJhY2tlbmQubW92ZShkYXRhSWQsIHZhbHVlcywgaW5mby5zaGFwZSwgaW5mby5kdHlwZSwgcmVmQ291bnQpO1xuICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgLy8gVHJhY2sgdGhlIG51bWJlciBvZiBtb3ZlcyBkdXJpbmcgYSBrZXJuZWwgZXhlY3V0aW9uIHRvIGNvcnJlY3RseVxuICAgICAgLy8gZGV0ZWN0IG1lbW9yeSBsZWFrcy5cbiAgICAgIHRoaXMuc3RhdGUubnVtRGF0YU1vdmVzU3RhY2tbdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5sZW5ndGggLSAxXSsrO1xuICAgIH1cbiAgfVxuXG4gIHRpZHk8VCBleHRlbmRzIFRlbnNvckNvbnRhaW5lcj4obmFtZU9yRm46IHN0cmluZ3xTY29wZUZuPFQ+LCBmbj86IFNjb3BlRm48VD4pOlxuICAgICAgVCB7XG4gICAgbGV0IG5hbWU6IHN0cmluZyA9IG51bGw7XG4gICAgaWYgKGZuID09IG51bGwpIHtcbiAgICAgIC8vIENhbGxlZCB3aXRoIG9ubHkgMSBhcmd1bWVudC5cbiAgICAgIGlmICh0eXBlb2YgbmFtZU9yRm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdQbGVhc2UgcHJvdmlkZSBhIGZ1bmN0aW9uIHRvIHRpZHkoKScpO1xuICAgICAgfVxuICAgICAgZm4gPSBuYW1lT3JGbjtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQ2FsbGVkIHdpdGggMiBhcmd1bWVudHMuXG4gICAgICBpZiAodHlwZW9mIG5hbWVPckZuICE9PSAnc3RyaW5nJyAmJiAhKG5hbWVPckZuIGluc3RhbmNlb2YgU3RyaW5nKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnV2hlbiBjYWxsaW5nIHdpdGggdHdvIGFyZ3VtZW50cywgdGhlIGZpcnN0IGFyZ3VtZW50ICcgK1xuICAgICAgICAgICAgJ3RvIHRpZHkoKSBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdXaGVuIGNhbGxpbmcgd2l0aCB0d28gYXJndW1lbnRzLCB0aGUgMm5kIGFyZ3VtZW50ICcgK1xuICAgICAgICAgICAgJ3RvIHRpZHkoKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgIH1cbiAgICAgIG5hbWUgPSBuYW1lT3JGbiBhcyBzdHJpbmc7XG4gICAgICAvLyBUT0RPKG5zdGhvcmF0LHNtaWxrb3YpOiBEbyBvcGVyYXRpb24gbG9nZ2luZyBhbmQgcGVyZm9ybWFuY2VcbiAgICAgIC8vIHByb2ZpbGluZy5cbiAgICB9XG4gICAgbGV0IHJlc3VsdDogVDtcbiAgICByZXR1cm4gdGhpcy5zY29wZWRSdW4oXG4gICAgICAgICgpID0+IHRoaXMuc3RhcnRTY29wZShuYW1lKSwgKCkgPT4gdGhpcy5lbmRTY29wZShyZXN1bHQpLCAoKSA9PiB7XG4gICAgICAgICAgcmVzdWx0ID0gZm4oKTtcbiAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBzY29wZWRSdW48VD4oc3RhcnQ6ICgpID0+IHZvaWQsIGVuZDogKCkgPT4gdm9pZCwgZjogKCkgPT4gVCk6IFQge1xuICAgIHN0YXJ0KCk7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJlcyA9IGYoKTtcbiAgICAgIGVuZCgpO1xuICAgICAgcmV0dXJuIHJlcztcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgZW5kKCk7XG4gICAgICB0aHJvdyBleDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBuZXh0VGVuc29ySWQgPSAwO1xuICBwcml2YXRlIG5leHRUZW5zb3JJZCgpOiBudW1iZXIge1xuICAgIHJldHVybiBFbmdpbmUubmV4dFRlbnNvcklkKys7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBuZXh0VmFyaWFibGVJZCA9IDA7XG4gIHByaXZhdGUgbmV4dFZhcmlhYmxlSWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gRW5naW5lLm5leHRWYXJpYWJsZUlkKys7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluc3RlYWQgb2YgdGhlIHB1YmxpYy1mYWNpbmcgdGVuc29yLmNsb25lKCkgd2hlblxuICAgKiBzYXZpbmcgYSB0ZW5zb3IgZm9yIGJhY2t3YXJkcyBwYXNzLiBJdCBtYWtlcyBzdXJlIHRvIGFkZCB0aGUgY2xvbmVcbiAgICogb3BlcmF0aW9uIHRvIHRoZSB0YXBlIHJlZ2FyZGxlc3Mgb2YgYmVpbmcgY2FsbGVkIGluc2lkZSBhIGtlcm5lbFxuICAgKiBleGVjdXRpb24uXG4gICAqL1xuICBwcml2YXRlIGNsb25lKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgY29uc3QgeTogVGVuc29yID0gRU5HSU5FLnJ1bktlcm5lbChJZGVudGl0eSwge3h9IGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbiAgICBjb25zdCBpbnB1dHMgPSB7eH07XG4gICAgY29uc3QgZ3JhZCA9IChkeTogVGVuc29yKSA9PiAoe1xuICAgICAgeDogKCkgPT4ge1xuICAgICAgICBjb25zdCBkdHlwZSA9ICdmbG9hdDMyJztcbiAgICAgICAgY29uc3QgZ3JhZElucHV0cyA9IHt4OiBkeX07XG4gICAgICAgIGNvbnN0IGF0dHJzID0ge2R0eXBlfTtcblxuICAgICAgICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgICBDYXN0LCBncmFkSW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFRlbnNvcjtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBzYXZlZDogVGVuc29yW10gPSBbXTtcbiAgICB0aGlzLmFkZFRhcGVOb2RlKHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUubmFtZSwgaW5wdXRzLCBbeV0sIGdyYWQsIHNhdmVkLCB7fSk7XG4gICAgcmV0dXJuIHk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIGtlcm5lbCB3aXRoIHRoZSBnaXZlbiBuYW1lIGFuZCByZXR1cm4gdGhlIG91dHB1dCB0ZW5zb3IuXG4gICAqXG4gICAqIEBwYXJhbSBrZXJuZWxOYW1lIFRoZSBuYW1lIG9mIHRoZSBrZXJuZWwgdG8gZXhlY3V0ZS5cbiAgICogQHBhcmFtIGlucHV0cyBBIG1hcCBvZiBpbnB1dCBuYW1lcyB0byB0ZW5zb3JzLlxuICAgKiBAcGFyYW0gYXR0cnMgQSBtYXAgb2YgYXR0cmlidXRlIG5hbWVzIHRvIHRoZWlyIHZhbHVlcy4gQW4gYXR0cmlidXRlIGlzIGFcbiAgICogICAgIHByaW1pdGl2ZSAobm9uLXRlbnNvcikgaW5wdXQgdG8gdGhlIGtlcm5lbC5cbiAgICogQHBhcmFtIGlucHV0c1RvU2F2ZSBBIGxpc3Qgb2YgdGVuc29ycywgaW5wdXRzIHRvIHNhdmUgZm9yIHRoZSBiYWNrcHJvcFxuICAgKiAgICAgY29tcHV0YXRpb24uXG4gICAqIEBwYXJhbSBvdXRwdXRzVG9TYXZlIEEgbGlzdCBvZiBib29sZWFucywgc3BlY2lmeWluZyB3aGljaCBvdXRwdXQgdG8gc2F2ZVxuICAgKiAgICAgZm9yIHRoZSBiYWNrcHJvcCBjb21wdXRhdGlvbi4gVGhlc2UgYXJlIGJvb2xlYW5zIHNpbmNlIHRoZSBvdXRwdXRcbiAgICogdGVuc29ycyBhcmUgbm90IHZpc2libGUgdG8gdGhlIHVzZXIuXG4gICAqL1xuICBydW5LZXJuZWw8VCBleHRlbmRzIFRlbnNvcnxUZW5zb3JbXT4oXG4gICAgICBrZXJuZWxOYW1lOiBzdHJpbmcsIGlucHV0czogTmFtZWRUZW5zb3JNYXAsIGF0dHJzPzogTmFtZWRBdHRyTWFwKTogVCB7XG4gICAgaWYgKHRoaXMuYmFja2VuZE5hbWUgPT0gbnVsbCkge1xuICAgICAgLy8gYmFja2VuZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChiYWNrZW5kIGluaXRpYWxpemF0aW9uIGlzIGxhenlcbiAgICAgIC8vIGNhbiBiZSBkZWZlcnJlZCB1bnRpbCBhbiBvcC8ga2VybmVsIGlzIHJ1bikuXG4gICAgICAvLyBUaGUgYmVsb3cgZ2V0dGVyIGhhcyBzaWRlIGVmZmVjdHMgdGhhdCB3aWxsIHRyeSB0byBpbml0aWFsaXplIHRoZVxuICAgICAgLy8gYmFja2VuZCBhbmQgc2V0IHByb3BlcnRpZXMgbGlrZSB0aGlzLmJhY2tlbmROYW1lXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICB0aGlzLmJhY2tlbmQ7XG4gICAgfVxuICAgIGNvbnN0IGhhc0tlcm5lbCA9IGdldEtlcm5lbChrZXJuZWxOYW1lLCB0aGlzLmJhY2tlbmROYW1lKSAhPSBudWxsO1xuICAgIGlmICghaGFzS2VybmVsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEtlcm5lbCAnJHtrZXJuZWxOYW1lfScgbm90IHJlZ2lzdGVyZWQgZm9yIGJhY2tlbmQgJyR7XG4gICAgICAgICAgdGhpcy5iYWNrZW5kTmFtZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnJ1bktlcm5lbEZ1bmMoe2tlcm5lbE5hbWUsIGlucHV0cywgYXR0cnN9KTtcbiAgfVxuXG4gIHByaXZhdGUgc2hvdWxkQ2hlY2tGb3JNZW1MZWFrcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5FTlYuZ2V0Qm9vbCgnSVNfVEVTVCcpO1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0tlcm5lbEZvck1lbUxlYWsoXG4gICAgICBrZXJuZWxOYW1lOiBzdHJpbmcsIG51bURhdGFJZHNCZWZvcmU6IG51bWJlcixcbiAgICAgIG91dEluZm9zOiBUZW5zb3JJbmZvW10pOiB2b2lkIHtcbiAgICBjb25zdCBudW1EYXRhSWRzQWZ0ZXIgPSB0aGlzLmJhY2tlbmQubnVtRGF0YUlkcygpO1xuXG4gICAgLy8gQ291bnQgdGhlIG51bWJlciBvZiBkYXRhIGlkcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUga2VybmVsLlxuICAgIGxldCBudW1PdXRwdXREYXRhSWRzID0gMDtcbiAgICBvdXRJbmZvcy5mb3JFYWNoKGluZm8gPT4ge1xuICAgICAgLy8gQ29tcGxleCBudW1iZXJzIGFsbG9jYXRlIDMgZGF0YSBpZHMsIG9uZSBmb3IgJ3JlYWwnLCBvbmUgZm9yXG4gICAgICAvLyAnaW1hZ2luYXJ5JywgYW5kIG9uZSBmb3IgdGhlIGNvbnRhaW5lciB0aGF0IGhvbGRzIHRoZSBmb3JtZXIgdHdvLlxuICAgICAgbnVtT3V0cHV0RGF0YUlkcyArPSAoaW5mby5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcgPyAzIDogMSk7XG4gICAgfSk7XG5cbiAgICAvLyBBY2NvdW50IGZvciB0aGUgbnVtYmVyIG9mIG1vdmVzIGR1cmluZyBrZXJuZWwgZXhlY3V0aW9uLiBBIFwiZGF0YSBtb3ZlXCJcbiAgICAvLyBjYW4gaGFwcGVuIGluIHRoZSBtaWRkbGUgb2YgYSBrZXJuZWwgZXhlY3V0aW9uLCBwbGFjaW5nIGEgbmV3IChrZXksdmFsdWUpXG4gICAgLy8gcGFpciBpbiB0aGUgZGF0YSBzdG9yYWdlLiBTaW5jZSBkYXRhIG1vdmVzIGhhdmUgbmV0IHplcm8gZWZmZWN0ICh3ZVxuICAgIC8vIGFsd2F5cyByZW1vdmUgdGhlIGRhdGEgZnJvbSB0aGUgb2xkIGJhY2tlbmQpLCB3ZSBoYXZlIHRvIGNhbmNlbCB0aGVtIG91dFxuICAgIC8vIHdoZW4gZGV0ZWN0aW5nIG1lbW9yeSBsZWFrcy5cbiAgICBjb25zdCBudW1Nb3ZlcyA9XG4gICAgICAgIHRoaXMuc3RhdGUubnVtRGF0YU1vdmVzU3RhY2tbdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5sZW5ndGggLSAxXTtcbiAgICBjb25zdCBkYXRhSWRzTGVha2VkID1cbiAgICAgICAgbnVtRGF0YUlkc0FmdGVyIC0gbnVtRGF0YUlkc0JlZm9yZSAtIG51bU91dHB1dERhdGFJZHMgLSBudW1Nb3ZlcztcbiAgICBpZiAoZGF0YUlkc0xlYWtlZCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQmFja2VuZCAnJHt0aGlzLmJhY2tlbmROYW1lfScgaGFzIGFuIGludGVybmFsIG1lbW9yeSBsZWFrIGAgK1xuICAgICAgICAgIGAoJHtkYXRhSWRzTGVha2VkfSBkYXRhIGlkcykgYWZ0ZXIgcnVubmluZyAnJHtrZXJuZWxOYW1lfSdgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSW50ZXJuYWwgaGVscGVyIG1ldGhvZCB0byBleGVjdXRlIGEga2VybmVsIEZ1bmNcbiAgICpcbiAgICogVXNlIGBydW5LZXJuZWxgIHRvIGV4ZWN1dGUga2VybmVscyBmcm9tIG91dHNpZGUgb2YgZW5naW5lLlxuICAgKi9cbiAgcHJpdmF0ZSBydW5LZXJuZWxGdW5jPFQgZXh0ZW5kcyBUZW5zb3J8VGVuc29yW10sIEkgZXh0ZW5kcyBOYW1lZFRlbnNvck1hcD4oXG4gICAgICBrZXJuZWxQYXJhbXM6IFJlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uPEk+fFxuICAgICAgQ3VzdG9tR3JhZEtlcm5lbEludm9jYXRpb248VCwgST4pOiBUIHtcbiAgICBsZXQgb3V0cHV0czogVGVuc29yW107XG4gICAgbGV0IHNhdmVkOiBUZW5zb3JbXSA9IFtdO1xuICAgIGNvbnN0IGlzVGFwZU9uID0gdGhpcy5pc1RhcGVPbigpO1xuXG4gICAgY29uc3Qgc3RhcnRpbmdCeXRlY291bnQgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgIGNvbnN0IHN0YXJ0aW5nTnVtVGVuc29ycyA9IHRoaXMuc3RhdGUubnVtVGVuc29ycztcblxuICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhTW92ZXNTdGFjay5wdXNoKDApO1xuICAgIH1cblxuICAgIGxldCBrZXJuZWxGdW5jOiAoKSA9PiBUZW5zb3JbXTtcbiAgICBpZiAodGhpcy5iYWNrZW5kTmFtZSA9PSBudWxsKSB7XG4gICAgICAvLyBiYWNrZW5kIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCB5ZXQgKGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gaXMgbGF6eVxuICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgIC8vIFRoZSBiZWxvdyBnZXR0ZXIgaGFzIHNpZGUgZWZmZWN0cyB0aGF0IHdpbGwgdHJ5IHRvIGluaXRpYWxpemUgdGhlXG4gICAgICAvLyBiYWNrZW5kIGFuZCBzZXQgcHJvcGVydGllcyBsaWtlIHRoaXMuYmFja2VuZE5hbWVcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgIHRoaXMuYmFja2VuZDtcbiAgICB9XG5cbiAgICBsZXQgb3V0OiBUZW5zb3JJbmZvfFRlbnNvckluZm9bXTtcblxuICAgIGNvbnN0IGtlcm5lbE9yU2NvcGVOYW1lID0gaXNSZWdpc3RlcmVkS2VybmVsSW52b2NhdGlvbihrZXJuZWxQYXJhbXMpID9cbiAgICAgICAga2VybmVsUGFyYW1zLmtlcm5lbE5hbWUgOlxuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlICE9IG51bGwgPyB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLm5hbWUgOiAnJztcblxuICAgIC8vIENyZWF0ZSB0aGUga2VybmVsRnVuYyBmcm9tIGVpdGhlciBhIHJlZ2lzdGVyZWQga2VybmVsIE9SIHBhc3NlZCBpblxuICAgIC8vIGZvcndhcmQvYmFja3dhcmQgZnVuY3Rpb25zICh1c2VkIGJ5IGN1c3RvbSBncmFkKS4gSW4gdGhpcyBjb250ZXh0IGFcbiAgICAvLyBrZXJuZWxGdW5jIHdyYXBzIGEga2VybmVsIGltcGxlbWVudGF0aW9uIHdpdGggc29tZSBib29ra2VlcGluZy5cblxuICAgIGlmIChpc1JlZ2lzdGVyZWRLZXJuZWxJbnZvY2F0aW9uKGtlcm5lbFBhcmFtcykpIHtcbiAgICAgIGNvbnN0IHtrZXJuZWxOYW1lLCBpbnB1dHMsIGF0dHJzfSA9IGtlcm5lbFBhcmFtcztcbiAgICAgIGlmICh0aGlzLmJhY2tlbmROYW1lID09IG51bGwpIHtcbiAgICAgICAgLy8gYmFja2VuZCBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0IChiYWNrZW5kIGluaXRpYWxpemF0aW9uIGlzIGxhenlcbiAgICAgICAgLy8gY2FuIGJlIGRlZmVycmVkIHVudGlsIGFuIG9wLyBrZXJuZWwgaXMgcnVuKS5cbiAgICAgICAgLy8gVGhlIGJlbG93IGdldHRlciBoYXMgc2lkZSBlZmZlY3RzIHRoYXQgd2lsbCB0cnkgdG8gaW5pdGlhbGl6ZSB0aGVcbiAgICAgICAgLy8gYmFja2VuZCBhbmQgc2V0IHByb3BlcnRpZXMgbGlrZSB0aGlzLmJhY2tlbmROYW1lXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICAgICAgdGhpcy5iYWNrZW5kO1xuICAgICAgfVxuICAgICAgY29uc3Qga2VybmVsID0gZ2V0S2VybmVsKGtlcm5lbE5hbWUsIHRoaXMuYmFja2VuZE5hbWUpO1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAga2VybmVsICE9IG51bGwsXG4gICAgICAgICAgKCkgPT4gYENhbm5vdCBmaW5kIHJlZ2lzdGVyZWQga2VybmVsICcke2tlcm5lbE5hbWV9JyBmb3IgYmFja2VuZCAnJHtcbiAgICAgICAgICAgICAgdGhpcy5iYWNrZW5kTmFtZX0nYCk7XG5cbiAgICAgIGtlcm5lbEZ1bmMgPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IG51bURhdGFJZHNCZWZvcmUgPSB0aGlzLmJhY2tlbmQubnVtRGF0YUlkcygpO1xuICAgICAgICBvdXQgPSBrZXJuZWwua2VybmVsRnVuYyh7aW5wdXRzLCBhdHRycywgYmFja2VuZDogdGhpcy5iYWNrZW5kfSk7XG4gICAgICAgIGNvbnN0IG91dEluZm9zID0gQXJyYXkuaXNBcnJheShvdXQpID8gb3V0IDogW291dF07XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgIHRoaXMuY2hlY2tLZXJuZWxGb3JNZW1MZWFrKGtlcm5lbE5hbWUsIG51bURhdGFJZHNCZWZvcmUsIG91dEluZm9zKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG91dFRlbnNvcnMgPSBvdXRJbmZvcy5tYXAoKG91dEluZm86IFRlbnNvckluZm98VGVuc29yKSA9PiB7XG4gICAgICAgICAgLy8gdG9kbyAoeWFzc29nYmEpIHJlbW92ZSB0aGlzIG9wdGlvbiAoVGVuc29yKSB3aGVuIG5vZGUgYmFja2VuZFxuICAgICAgICAgIC8vIG1ldGhvZHMgaGF2ZSBiZWVuIG1vZHVsYXJpemVkIGFuZCB0aGV5IGFsbCByZXR1cm4gdGVuc29ySW5mby5cbiAgICAgICAgICAvLyBUZW5zb3JJbmZvcyBkbyBub3QgaGF2ZSBhIHJhbmsgYXR0cmlidXRlLlxuICAgICAgICAgIGlmICgob3V0SW5mbyBhcyBUZW5zb3IpLnJhbmsgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dEluZm8gYXMgVGVuc29yO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5tYWtlVGVuc29yRnJvbVRlbnNvckluZm8ob3V0SW5mbyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFNhdmUgYW55IHJlcXVpcmVkIGlucHV0cyBhbmQgb3V0cHV0cy5cblxuICAgICAgICAvLyBEbyBub3Qgc2F2ZSB1bmxlc3Mgd2UgYXJlIHJlY29yZGluZyB0byB0aGUgdGFwZS4gT3RoZXJ3aXNlIGl0IHdvdWxkXG4gICAgICAgIC8vIGNhdXNlIGEgbWVtIGxlYWsgc2luY2UgdGhlcmUgd291bGQgYmUgbm8gYmFja3Byb3AgZm9yIHRoZXNlIHRlbnNvcnNcbiAgICAgICAgLy8gKHdoaWNoIHdvdWxkIG90aGVyd2lzZSBkaXNwb3NlIHRoZW0pLlxuICAgICAgICBpZiAoaXNUYXBlT24pIHtcbiAgICAgICAgICBjb25zdCB0ZW5zb3JzVG9TYXZlID1cbiAgICAgICAgICAgICAgdGhpcy5nZXRUZW5zb3JzRm9yR3JhZGllbnQoa2VybmVsTmFtZSwgaW5wdXRzLCBvdXRUZW5zb3JzKTtcbiAgICAgICAgICBzYXZlZCA9IHRoaXMuc2F2ZVRlbnNvcnNGb3JCYWNrd2FyZE1vZGUodGVuc29yc1RvU2F2ZSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dFRlbnNvcnM7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7Zm9yd2FyZEZ1bmN9ID0ga2VybmVsUGFyYW1zO1xuICAgICAgLy8gUnVubmluZyBhIGN1c3RvbUdyYWQgb3AuXG4gICAgICBjb25zdCBzYXZlRnVuYzogR3JhZFNhdmVGdW5jID0gKHRlbnNvcnMpID0+IHtcbiAgICAgICAgLy8gRG8gbm90IHNhdmUgdW5sZXNzIHdlIGFyZSByZWNvcmRpbmcgdG8gdGhlIHRhcGUuIE90aGVyd2lzZSBpdCB3b3VsZFxuICAgICAgICAvLyBjYXVzZSBhIG1lbSBsZWFrIHNpbmNlIHdlIHdvdWxkIG5ldmVyIHJ1biBiYWNrcHJvcCwgd2hpY2ggZGlzcG9zZXNcbiAgICAgICAgLy8gdGhlIGtlcHQgdGVuc29ycy5cbiAgICAgICAgaWYgKCFpc1RhcGVPbikge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBzYXZlZCA9IHRlbnNvcnMubWFwKHRlbnNvciA9PiB0aGlzLmtlZXAodGhpcy5jbG9uZSh0ZW5zb3IpKSk7XG4gICAgICB9O1xuXG4gICAgICBrZXJuZWxGdW5jID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBudW1EYXRhSWRzQmVmb3JlID0gdGhpcy5iYWNrZW5kLm51bURhdGFJZHMoKTtcbiAgICAgICAgb3V0ID0gdGhpcy50aWR5KCgpID0+IGZvcndhcmRGdW5jKHRoaXMuYmFja2VuZCwgc2F2ZUZ1bmMpKTtcbiAgICAgICAgY29uc3Qgb3V0cyA9IChBcnJheS5pc0FycmF5KG91dCkgPyBvdXQgOiBbb3V0XSkgYXMgVGVuc29yW107XG4gICAgICAgIGlmICh0aGlzLnNob3VsZENoZWNrRm9yTWVtTGVha3MoKSkge1xuICAgICAgICAgIC8vIFNjb3BlIG5hbWUgaXMgdXNlZCB0byBwcmludCBhIG1vcmUgaGVscGZ1bCBlcnJvciBtZXNzYWdlIGlmIG5lZWRlZC5cbiAgICAgICAgICB0aGlzLmNoZWNrS2VybmVsRm9yTWVtTGVhayhrZXJuZWxPclNjb3BlTmFtZSwgbnVtRGF0YUlkc0JlZm9yZSwgb3V0cyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dHM7XG4gICAgICB9O1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gUnVuIHRoZSBrZXJuZWxGdW5jLiBPcHRpb25hbGx5IHByb2ZpbGluZyBpdC5cbiAgICAvL1xuICAgIGNvbnN0IHtpbnB1dHMsIGF0dHJzfSA9IGtlcm5lbFBhcmFtcztcbiAgICBjb25zdCBiYWNrd2FyZHNGdW5jID0gaXNSZWdpc3RlcmVkS2VybmVsSW52b2NhdGlvbihrZXJuZWxQYXJhbXMpID9cbiAgICAgICAgbnVsbCA6XG4gICAgICAgIGtlcm5lbFBhcmFtcy5iYWNrd2FyZHNGdW5jO1xuXG4gICAgbGV0IGtlcm5lbFByb2ZpbGU6IEtlcm5lbFByb2ZpbGU7XG4gICAgdGhpcy5zY29wZWRSdW4oXG4gICAgICAgIC8vIFN0b3AgcmVjb3JkaW5nIHRvIGEgdGFwZSB3aGVuIHJ1bm5pbmcgYSBrZXJuZWwuXG4gICAgICAgICgpID0+IHRoaXMuc3RhdGUua2VybmVsRGVwdGgrKywgKCkgPT4gdGhpcy5zdGF0ZS5rZXJuZWxEZXB0aC0tLCAoKSA9PiB7XG4gICAgICAgICAgaWYgKCF0aGlzLkVOVi5nZXRCb29sKCdERUJVRycpICYmICF0aGlzLnN0YXRlLnByb2ZpbGluZykge1xuICAgICAgICAgICAgb3V0cHV0cyA9IGtlcm5lbEZ1bmMoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAga2VybmVsUHJvZmlsZSA9IHRoaXMucHJvZmlsZXIucHJvZmlsZUtlcm5lbChcbiAgICAgICAgICAgICAgICBrZXJuZWxPclNjb3BlTmFtZSwgaW5wdXRzLCAoKSA9PiBrZXJuZWxGdW5jKCkpO1xuICAgICAgICAgICAgaWYgKHRoaXMuRU5WLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICAgICAgICAgICAgdGhpcy5wcm9maWxlci5sb2dLZXJuZWxQcm9maWxlKGtlcm5lbFByb2ZpbGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0cyA9IGtlcm5lbFByb2ZpbGUub3V0cHV0cztcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgaWYgKGlzVGFwZU9uKSB7XG4gICAgICB0aGlzLmFkZFRhcGVOb2RlKFxuICAgICAgICAgIGtlcm5lbE9yU2NvcGVOYW1lLCBpbnB1dHMsIG91dHB1dHMsIGJhY2t3YXJkc0Z1bmMsIHNhdmVkLCBhdHRycyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc3RhdGUucHJvZmlsaW5nKSB7XG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUua2VybmVscy5wdXNoKHtcbiAgICAgICAgbmFtZToga2VybmVsT3JTY29wZU5hbWUsXG4gICAgICAgIGJ5dGVzQWRkZWQ6IHRoaXMuc3RhdGUubnVtQnl0ZXMgLSBzdGFydGluZ0J5dGVjb3VudCxcbiAgICAgICAgdG90YWxCeXRlc1NuYXBzaG90OiB0aGlzLnN0YXRlLm51bUJ5dGVzLFxuICAgICAgICB0ZW5zb3JzQWRkZWQ6IHRoaXMuc3RhdGUubnVtVGVuc29ycyAtIHN0YXJ0aW5nTnVtVGVuc29ycyxcbiAgICAgICAgdG90YWxUZW5zb3JzU25hcHNob3Q6IHRoaXMuc3RhdGUubnVtVGVuc29ycyxcbiAgICAgICAgaW5wdXRTaGFwZXM6IE9iamVjdC5rZXlzKGlucHV0cykubWFwKFxuICAgICAgICAgICAga2V5ID0+IGlucHV0c1trZXldICE9IG51bGwgPyBpbnB1dHNba2V5XS5zaGFwZSA6IG51bGwpLFxuICAgICAgICBvdXRwdXRTaGFwZXM6IG91dHB1dHMubWFwKGl0ZW0gPT4gaXRlbS5zaGFwZSksXG4gICAgICAgIGtlcm5lbFRpbWVNczoga2VybmVsUHJvZmlsZS50aW1lTXMsXG4gICAgICAgIGV4dHJhSW5mbzoga2VybmVsUHJvZmlsZS5leHRyYUluZm9cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gKEFycmF5LmlzQXJyYXkob3V0KSA/IG91dHB1dHMgOiBvdXRwdXRzWzBdKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmVzIHRlbnNvcnMgdXNlZCBpbiBmb3J3YXJkIG1vZGUgZm9yIHVzZSBpbiBiYWNrd2FyZCBtb2RlLlxuICAgKlxuICAgKiBAcGFyYW0gdGVuc29ycyB0aGUgbGlzdCBvZiB0ZW5zb3JzIHRvIHNhdmUuXG4gICAqL1xuICBwcml2YXRlIHNhdmVUZW5zb3JzRm9yQmFja3dhcmRNb2RlKHRlbnNvcnM6IFRlbnNvcltdKTogVGVuc29yW10ge1xuICAgIGNvbnN0IHNhdmVkID0gdGVuc29ycy5tYXAodGVuc29yID0+IHRoaXMua2VlcCh0aGlzLmNsb25lKHRlbnNvcikpKTtcbiAgICByZXR1cm4gc2F2ZWQ7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIGxpc3Qgb2YgdGVuc29ycyB0byBzYXZlIGZvciBhIGdpdmVuIGdyYWRpZW50IGNhbGN1bGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0ga2VybmVsTmFtZSBuYW1lIG9mIGtlcm5lbCB0byBsb29rIHVwIGdyYWRpZW50IGZvci5cbiAgICogQHBhcmFtIGlucHV0cyBhIG1hcCBvZiBpbnB1dCB0ZW5zb3JzLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBhbiBhcnJheSBvZiBvdXRwdXQgdGVuc29ycyBmcm9tIGZvcndhcmQgbW9kZSBvZiBrZXJuZWwuXG4gICAqL1xuICBwcml2YXRlIGdldFRlbnNvcnNGb3JHcmFkaWVudChcbiAgICAgIGtlcm5lbE5hbWU6IHN0cmluZywgaW5wdXRzOiBOYW1lZFRlbnNvck1hcCxcbiAgICAgIG91dHB1dHM6IFRlbnNvcltdKTogVGVuc29yW118bnVsbCB7XG4gICAgY29uc3QgZ3JhZENvbmZpZyA9IGdldEdyYWRpZW50KGtlcm5lbE5hbWUpO1xuICAgIGlmIChncmFkQ29uZmlnICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGlucHV0c1RvU2F2ZTogc3RyaW5nW10gPSBncmFkQ29uZmlnLmlucHV0c1RvU2F2ZSB8fCBbXTtcbiAgICAgIGNvbnN0IG91dHB1dHNUb1NhdmU6IGJvb2xlYW5bXSA9IGdyYWRDb25maWcub3V0cHV0c1RvU2F2ZSB8fCBbXTtcblxuICAgICAgLy8gSWYgc2F2ZUFsbElucHV0cyBpcyB0cnVlLCBhbGwgaW5wdXRzIHdpbGwgYmUgc2F2ZWQuIE90aGVyd2lzZSwgaW5wdXRzXG4gICAgICAvLyBzcGVjaWZpZWQgaW4gaW5wdXRzVG9TYXZlIHdpbGwgYmUgc2F2ZWQuXG4gICAgICBsZXQgaW5wdXRUZW5zb3JzVG9TYXZlOiBUZW5zb3JbXTtcbiAgICAgIGlmIChncmFkQ29uZmlnLnNhdmVBbGxJbnB1dHMpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGlucHV0cyksXG4gICAgICAgICAgICAoKSA9PiAnc2F2ZUFsbElucHV0cyBpcyB0cnVlLCBleHBlY3RlZCBpbnB1dHMgdG8gYmUgYW4gYXJyYXkuJyk7XG5cbiAgICAgICAgaW5wdXRUZW5zb3JzVG9TYXZlID0gT2JqZWN0LmtleXMoaW5wdXRzKS5tYXAoKGtleSkgPT4gaW5wdXRzW2tleV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXRUZW5zb3JzVG9TYXZlID0gaW5wdXRzVG9TYXZlLm1hcCgoaW5wdXROYW1lKSA9PiBpbnB1dHNbaW5wdXROYW1lXSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG91dHB1dFRlbnNvcnNUb1NhdmU6IFRlbnNvcltdID1cbiAgICAgICAgICBvdXRwdXRzLmZpbHRlcigoXywgaSkgPT4gb3V0cHV0c1RvU2F2ZVtpXSk7XG5cbiAgICAgIHJldHVybiBpbnB1dFRlbnNvcnNUb1NhdmUuY29uY2F0KG91dHB1dFRlbnNvcnNUb1NhdmUpO1xuICAgIH1cbiAgICAvLyBXZSByZXR1cm4gYW4gZW1wdHkgbGlzdCByYXRoZXIgdGhhbiB0aHJvdyBhbiBlcnJvciBiZWNhdXNlIHRoZSBrZXJuZWwgd2VcbiAgICAvLyBhcmUgbG9va2luZyB1cCBtYXkgbm90IGFjdHVhbGx5IGJlIHJlbGV2YW50IHRvIGJhY2twcm9waW5nIHRocm91Z2ggdGhlXG4gICAgLy8gb3ZlcmFsbCBmdW5jdGlvblxuICAgIC8vXG4gICAgLy8gU2VlICdkb2VzIG5vdCBlcnJvciBpZiBpcnJlbGV2YW50IChwcnVuZWQpIG9wcyBhcmUgbWlzc2luZyBncmFkcycgdGVzdFxuICAgIC8vIGluIGdyYWRpZW50c190ZXN0LnRzIGZvciBhbiBleGFtcGxlLlxuICAgIHJldHVybiBbXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBwdWJsaWMgQVBJcyBmb3IgdGVuc29yIGNyZWF0aW9uLiBNYWtlcyBhIG5ld1xuICAgKiB0ZW5zb3Igd2l0aCB0aGUgcHJvdmlkZWQgc2hhcGUsIGR0eXBlIGFuZCB2YWx1ZXMuIEl0IGFsd2F5c1xuICAgKiBjcmVhdGVzIGEgbmV3IGRhdGEgaWQgYW5kIHdyaXRlcyB0aGUgdmFsdWVzIHRvIHRoZSB1bmRlcmx5aW5nIGJhY2tlbmQuXG4gICAqL1xuICBtYWtlVGVuc29yKFxuICAgICAgdmFsdWVzOiBEYXRhVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIGJhY2tlbmQ/OiBLZXJuZWxCYWNrZW5kKTogVGVuc29yIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVmFsdWVzIHBhc3NlZCB0byBlbmdpbmUubWFrZVRlbnNvcigpIGFyZSBudWxsJyk7XG4gICAgfVxuICAgIGR0eXBlID0gZHR5cGUgfHwgJ2Zsb2F0MzInO1xuICAgIGJhY2tlbmQgPSBiYWNrZW5kIHx8IHRoaXMuYmFja2VuZDtcbiAgICBsZXQgYmFja2VuZFZhbHMgPSB2YWx1ZXMgYXMgQmFja2VuZFZhbHVlcztcbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnICYmIHV0aWwuaXNTdHJpbmcodmFsdWVzWzBdKSkge1xuICAgICAgYmFja2VuZFZhbHMgPSAodmFsdWVzIGFzIHN0cmluZ1tdKS5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG4gICAgfVxuICAgIGNvbnN0IGRhdGFJZCA9IGJhY2tlbmQud3JpdGUoYmFja2VuZFZhbHMsIHNoYXBlLCBkdHlwZSk7XG4gICAgY29uc3QgdCA9IG5ldyBUZW5zb3Ioc2hhcGUsIGR0eXBlLCBkYXRhSWQsIHRoaXMubmV4dFRlbnNvcklkKCkpO1xuICAgIHRoaXMudHJhY2tUZW5zb3IodCwgYmFja2VuZCk7XG5cbiAgICAvLyBDb3VudCBieXRlcyBmb3Igc3RyaW5nIHRlbnNvcnMuXG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgY29uc3QgaW5mbyA9IHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKTtcbiAgICAgIGNvbnN0IG5ld0J5dGVzID0gYnl0ZXNGcm9tU3RyaW5nQXJyYXkoYmFja2VuZFZhbHMgYXMgVWludDhBcnJheVtdKTtcbiAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgKz0gbmV3Qnl0ZXMgLSBpbmZvLmJ5dGVzO1xuICAgICAgaW5mby5ieXRlcyA9IG5ld0J5dGVzO1xuICAgIH1cbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBiYWNrZW5kcy4gTWFrZXMgYSBuZXcgdGVuc29yXG4gICAqIHRoYXQgaXMgYSB3cmFwcGVyIGFyb3VuZCBhbiBleGlzdGluZyBkYXRhIGlkLiBJdCBkb2Vzbid0IGNyZWF0ZVxuICAgKiBhIG5ldyBkYXRhIGlkLCBvbmx5IGluY3JlbWVudHMgdGhlIHJlZiBjb3VudCB1c2VkIGluIG1lbW9yeSB0cmFja2luZy5cbiAgICogQGRlcHJlY2F0ZWRcbiAgICovXG4gIG1ha2VUZW5zb3JGcm9tRGF0YUlkKFxuICAgIGRhdGFJZDogRGF0YUlkLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICBiYWNrZW5kPzogS2VybmVsQmFja2VuZCk6IFRlbnNvciB7XG4gICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgY29uc3QgdGVuc29ySW5mbzogVGVuc29ySW5mbyA9IHtkYXRhSWQsIHNoYXBlLCBkdHlwZX07XG4gICAgcmV0dXJuIHRoaXMubWFrZVRlbnNvckZyb21UZW5zb3JJbmZvKHRlbnNvckluZm8sIGJhY2tlbmQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEludGVybmFsIG1ldGhvZCB1c2VkIGJ5IGJhY2tlbmRzLiBNYWtlcyBhIG5ldyB0ZW5zb3IgdGhhdCBpcyBhIHdyYXBwZXJcbiAgICogYXJvdW5kIGFuIGV4aXN0aW5nIGRhdGEgaWQgaW4gVGVuc29ySW5mby4gSXQgZG9lc24ndCBjcmVhdGUgYSBuZXcgZGF0YSBpZCxcbiAgICogb25seSBpbmNyZW1lbnRzIHRoZSByZWYgY291bnQgdXNlZCBpbiBtZW1vcnkgdHJhY2tpbmcuXG4gICAqL1xuICBtYWtlVGVuc29yRnJvbVRlbnNvckluZm8odGVuc29ySW5mbzogVGVuc29ySW5mbywgYmFja2VuZD86IEtlcm5lbEJhY2tlbmQpOlxuICAgICAgVGVuc29yIHtcbiAgICBjb25zdCB7ZGF0YUlkLCBzaGFwZSwgZHR5cGV9ID0gdGVuc29ySW5mbztcbiAgICBjb25zdCB0ID0gbmV3IFRlbnNvcihzaGFwZSwgZHR5cGUsIGRhdGFJZCwgdGhpcy5uZXh0VGVuc29ySWQoKSk7XG4gICAgdGhpcy50cmFja1RlbnNvcih0LCBiYWNrZW5kKTtcbiAgICByZXR1cm4gdDtcbiAgfVxuXG4gIG1ha2VWYXJpYWJsZShcbiAgICAgIGluaXRpYWxWYWx1ZTogVGVuc29yLCB0cmFpbmFibGUgPSB0cnVlLCBuYW1lPzogc3RyaW5nLFxuICAgICAgZHR5cGU/OiBEYXRhVHlwZSk6IFZhcmlhYmxlIHtcbiAgICBuYW1lID0gbmFtZSB8fCB0aGlzLm5leHRWYXJpYWJsZUlkKCkudG9TdHJpbmcoKTtcbiAgICBpZiAoZHR5cGUgIT0gbnVsbCAmJiBkdHlwZSAhPT0gaW5pdGlhbFZhbHVlLmR0eXBlKSB7XG4gICAgICBpbml0aWFsVmFsdWUgPSBpbml0aWFsVmFsdWUuY2FzdChkdHlwZSk7XG4gICAgfVxuICAgIGNvbnN0IHYgPSBuZXcgVmFyaWFibGUoaW5pdGlhbFZhbHVlLCB0cmFpbmFibGUsIG5hbWUsIHRoaXMubmV4dFRlbnNvcklkKCkpO1xuICAgIGlmICh0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXSAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFZhcmlhYmxlIHdpdGggbmFtZSAke3YubmFtZX0gd2FzIGFscmVhZHkgcmVnaXN0ZXJlZGApO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlLnJlZ2lzdGVyZWRWYXJpYWJsZXNbdi5uYW1lXSA9IHY7XG4gICAgdGhpcy5pbmNSZWYodiwgdGhpcy5iYWNrZW5kKTtcbiAgICByZXR1cm4gdjtcbiAgfVxuXG4gIHRyYWNrVGVuc29yKGE6IFRlbnNvciwgYmFja2VuZDogS2VybmVsQmFja2VuZCk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUubnVtVGVuc29ycysrO1xuICAgIGlmIChhLmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdGhpcy5zdGF0ZS5udW1TdHJpbmdUZW5zb3JzKys7XG4gICAgfVxuICAgIC8vIEJ5dGVzIGZvciBjb21wbGV4IG51bWJlcnMgYXJlIGNvdW50ZWQgYnkgdGhlaXIgY29tcG9uZW50cy4gQnl0ZXMgZm9yXG4gICAgLy8gc3RyaW5nIHRlbnNvcnMgYXJlIGNvdW50ZWQgd2hlbiB3cml0aW5nIHZhbHVlcy5cbiAgICBsZXQgYnl0ZXMgPSAwO1xuICAgIGlmIChhLmR0eXBlICE9PSAnY29tcGxleDY0JyAmJiBhLmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgICAgYnl0ZXMgPSBhLnNpemUgKiB1dGlsLmJ5dGVzUGVyRWxlbWVudChhLmR0eXBlKTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5udW1CeXRlcyArPSBieXRlcztcblxuICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgIHRoaXMuc3RhdGUubnVtRGF0YUJ1ZmZlcnMrKztcbiAgICAgIHRoaXMuc3RhdGUudGVuc29ySW5mby5zZXQoYS5kYXRhSWQsIHtcbiAgICAgICAgYmFja2VuZDogYmFja2VuZCB8fCB0aGlzLmJhY2tlbmQsXG4gICAgICAgIGR0eXBlOiBhLmR0eXBlLFxuICAgICAgICBzaGFwZTogYS5zaGFwZSxcbiAgICAgICAgYnl0ZXNcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICghKGEgaW5zdGFuY2VvZiBWYXJpYWJsZSkpIHtcbiAgICAgIHRoaXMudHJhY2soYSk7XG4gICAgfVxuICB9XG5cbiAgLy8gVHJhY2sgdGhlIHRlbnNvciBieSBkYXRhSWQgYW5kIGluY3JlYXNlIHRoZSByZWZDb3VudCBmb3IgdGhlIGRhdGFJZCBpbiB0aGVcbiAgLy8gYmFja2VuZC5cbiAgLy8gVE9ETyhweXUxMDA1NSk6IFRoaXMgaXMgY3VycmVudGx5IHVzZWQgYnkgbWFrZVZhcmlhYmxlIG1ldGhvZCwgdG8gaW5jcmVhc2VcbiAgLy8gcmVmQ291bnQgb24gdGhlIGJhY2tlbmQgZm9yIHRoZSBkYXRhSWQuIEl0IGNhbiBwb3RlbnRpYWxseSBiZSByZXBsYWNlZCB3aXRoXG4gIC8vIElkZW50aXR5IG9wIGluZGVhZCBvZiBjYWxsaW5nIGJhY2tlbmQgZGlyZWN0bHkuXG4gIGluY1JlZihhOiBUZW5zb3IsIGJhY2tlbmQ6IEtlcm5lbEJhY2tlbmQpOiB2b2lkIHtcbiAgICB0aGlzLnRyYWNrVGVuc29yKGEsIGJhY2tlbmQpO1xuICAgIHRoaXMuYmFja2VuZC5pbmNSZWYoYS5kYXRhSWQpO1xuICB9XG5cbiAgcmVtb3ZlRGF0YUlkKGRhdGFJZDogRGF0YUlkLCBiYWNrZW5kOiBLZXJuZWxCYWNrZW5kKSB7XG4gICAgaWYgKHRoaXMuc3RhdGUudGVuc29ySW5mby5oYXMoZGF0YUlkKSAmJlxuICAgICAgICB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCkuYmFja2VuZCA9PT0gYmFja2VuZCkge1xuICAgICAgdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmRlbGV0ZShkYXRhSWQpO1xuICAgICAgdGhpcy5zdGF0ZS5udW1EYXRhQnVmZmVycy0tO1xuICAgIH1cbiAgfVxuICBkaXNwb3NlVGVuc29yKGE6IFRlbnNvcik6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0ZS50ZW5zb3JJbmZvLmhhcyhhLmRhdGFJZCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgaW5mbyA9IHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoYS5kYXRhSWQpO1xuXG4gICAgdGhpcy5zdGF0ZS5udW1UZW5zb3JzLS07XG4gICAgaWYgKGEuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnN0YXRlLm51bVN0cmluZ1RlbnNvcnMtLTtcbiAgICAgIHRoaXMuc3RhdGUubnVtQnl0ZXMgLT0gaW5mby5ieXRlcztcbiAgICB9XG4gICAgLy8gRG9uJ3QgY291bnQgYnl0ZXMgZm9yIGNvbXBsZXggbnVtYmVycyBhcyB0aGV5IGFyZSBjb3VudGVkIGJ5IHRoZWlyXG4gICAgLy8gY29tcG9uZW50cy5cbiAgICBpZiAoYS5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgYS5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGJ5dGVzID0gYS5zaXplICogdXRpbC5ieXRlc1BlckVsZW1lbnQoYS5kdHlwZSk7XG4gICAgICB0aGlzLnN0YXRlLm51bUJ5dGVzIC09IGJ5dGVzO1xuICAgIH1cblxuICAgIC8vIFJlbW92ZSB0aGUgcmVmZXJlbmNlIHRvIGRhdGFJZCBpZiBiYWNrZW5kIGRpc3Bvc2UgdGhlIGRhdGEgc3VjY2Vzc2Z1bGx5XG4gICAgaWYgKGluZm8uYmFja2VuZC5kaXNwb3NlRGF0YShhLmRhdGFJZCkpIHtcbiAgICAgIHRoaXMucmVtb3ZlRGF0YUlkKGEuZGF0YUlkLCBpbmZvLmJhY2tlbmQpO1xuICAgIH1cblxuICAgIC8vIFRPRE8obnN0aG9yYXQpOiBDb25zdHJ1Y3QgYW4gZXJyb3IgYW5kIHNhdmUgdGhlIHN0YWNrIHRyYWNlIGZvclxuICAgIC8vIGRlYnVnZ2luZyB3aGVuIGluIGRlYnVnIG1vZGUuIENyZWF0aW5nIGEgc3RhY2sgdHJhY2UgaXMgdG9vIGV4cGVuc2l2ZVxuICAgIC8vIHRvIGRvIHVuY29uZGl0aW9uYWxseS5cbiAgfVxuXG4gIGRpc3Bvc2VWYXJpYWJsZXMoKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCB2YXJOYW1lIGluIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlcykge1xuICAgICAgY29uc3QgdiA9IHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2YXJOYW1lXTtcbiAgICAgIHRoaXMuZGlzcG9zZVZhcmlhYmxlKHYpO1xuICAgIH1cbiAgfVxuXG4gIGRpc3Bvc2VWYXJpYWJsZSh2OiBWYXJpYWJsZSk6IHZvaWQge1xuICAgIHRoaXMuZGlzcG9zZVRlbnNvcih2KTtcbiAgICBpZiAodGhpcy5zdGF0ZS5yZWdpc3RlcmVkVmFyaWFibGVzW3YubmFtZV0gIT0gbnVsbCkge1xuICAgICAgZGVsZXRlIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2Lm5hbWVdO1xuICAgIH1cbiAgfVxuXG4gIG1lbW9yeSgpOiBNZW1vcnlJbmZvIHtcbiAgICBjb25zdCBpbmZvID0gdGhpcy5iYWNrZW5kLm1lbW9yeSgpIGFzIE1lbW9yeUluZm87XG4gICAgaW5mby5udW1UZW5zb3JzID0gdGhpcy5zdGF0ZS5udW1UZW5zb3JzO1xuICAgIGluZm8ubnVtRGF0YUJ1ZmZlcnMgPSB0aGlzLnN0YXRlLm51bURhdGFCdWZmZXJzO1xuICAgIGluZm8ubnVtQnl0ZXMgPSB0aGlzLnN0YXRlLm51bUJ5dGVzO1xuICAgIGlmICh0aGlzLnN0YXRlLm51bVN0cmluZ1RlbnNvcnMgPiAwKSB7XG4gICAgICBpbmZvLnVucmVsaWFibGUgPSB0cnVlO1xuICAgICAgaWYgKGluZm8ucmVhc29ucyA9PSBudWxsKSB7XG4gICAgICAgIGluZm8ucmVhc29ucyA9IFtdO1xuICAgICAgfVxuICAgICAgaW5mby5yZWFzb25zLnB1c2goXG4gICAgICAgICAgJ01lbW9yeSB1c2FnZSBieSBzdHJpbmcgdGVuc29ycyBpcyBhcHByb3hpbWF0ZSAnICtcbiAgICAgICAgICAnKDIgYnl0ZXMgcGVyIGNoYXJhY3RlciknKTtcbiAgICB9XG4gICAgcmV0dXJuIGluZm87XG4gIH1cblxuICBhc3luYyBwcm9maWxlKHF1ZXJ5OiAoKSA9PiAoVGVuc29yQ29udGFpbmVyIHwgUHJvbWlzZTxUZW5zb3JDb250YWluZXI+KSk6XG4gICAgICBQcm9taXNlPFByb2ZpbGVJbmZvPiB7XG4gICAgdGhpcy5zdGF0ZS5wcm9maWxpbmcgPSB0cnVlO1xuXG4gICAgY29uc3Qgc3RhcnRCeXRlcyA9IHRoaXMuc3RhdGUubnVtQnl0ZXM7XG4gICAgY29uc3Qgc3RhcnROdW1UZW5zb3JzID0gdGhpcy5zdGF0ZS5udW1UZW5zb3JzO1xuXG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMgPSBbXTtcbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUucmVzdWx0ID0gYXdhaXQgcXVlcnkoKTtcblxuICAgIHRoaXMuc3RhdGUucHJvZmlsaW5nID0gZmFsc2U7XG5cbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGUucGVha0J5dGVzID0gTWF0aC5tYXgoXG4gICAgICAgIC4uLnRoaXMuc3RhdGUuYWN0aXZlUHJvZmlsZS5rZXJuZWxzLm1hcChkID0+IGQudG90YWxCeXRlc1NuYXBzaG90KSk7XG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLm5ld0J5dGVzID0gdGhpcy5zdGF0ZS5udW1CeXRlcyAtIHN0YXJ0Qnl0ZXM7XG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLm5ld1RlbnNvcnMgPVxuICAgICAgICB0aGlzLnN0YXRlLm51bVRlbnNvcnMgLSBzdGFydE51bVRlbnNvcnM7XG4gICAgZm9yIChjb25zdCBrZXJuZWwgb2YgdGhpcy5zdGF0ZS5hY3RpdmVQcm9maWxlLmtlcm5lbHMpIHtcbiAgICAgIGtlcm5lbC5rZXJuZWxUaW1lTXMgPSBhd2FpdCBrZXJuZWwua2VybmVsVGltZU1zO1xuICAgICAga2VybmVsLmV4dHJhSW5mbyA9IGF3YWl0IGtlcm5lbC5leHRyYUluZm87XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnN0YXRlLmFjdGl2ZVByb2ZpbGU7XG4gIH1cblxuICBpc1RhcGVPbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5ncmFkaWVudERlcHRoID4gMCAmJiB0aGlzLnN0YXRlLmtlcm5lbERlcHRoID09PSAwO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRUYXBlTm9kZShcbiAgICAgIGtlcm5lbE5hbWU6IHN0cmluZywgaW5wdXRzOiBOYW1lZFRlbnNvck1hcCwgb3V0cHV0czogVGVuc29yW10sXG4gICAgICBncmFkaWVudHNGdW5jOiBHcmFkRnVuYywgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKTogdm9pZCB7XG4gICAgY29uc3QgdGFwZU5vZGU6IFRhcGVOb2RlID1cbiAgICAgICAge2lkOiB0aGlzLnN0YXRlLm5leHRUYXBlTm9kZUlkKyssIGtlcm5lbE5hbWUsIGlucHV0cywgb3V0cHV0cywgc2F2ZWR9O1xuXG4gICAgY29uc3QgZ3JhZENvbmZpZyA9IGdldEdyYWRpZW50KGtlcm5lbE5hbWUpO1xuICAgIGlmIChncmFkQ29uZmlnICE9IG51bGwpIHtcbiAgICAgIGdyYWRpZW50c0Z1bmMgPSBncmFkQ29uZmlnLmdyYWRGdW5jO1xuICAgIH1cbiAgICBpZiAoZ3JhZGllbnRzRnVuYyAhPSBudWxsKSB7XG4gICAgICB0YXBlTm9kZS5ncmFkaWVudCA9IChkeXM6IFRlbnNvcltdKSA9PiB7XG4gICAgICAgIC8vIFRPRE8oc21pbGtvdik6IFRvIG9wdGltaXplIGJhY2stcHJvcCwgcGFzcyBkeXMgdGhhdCBhcmUgbm90IHVzZWQgaW5cbiAgICAgICAgLy8gdGhlIGJhY2twcm9wIGdyYXBoIHRvIHRoZSB1c2VyIGFzIG51bGwgaW5zdGVhZCBvZiB6ZXJvc1xuICAgICAgICBkeXMgPSBkeXMubWFwKChkeSwgaSkgPT4ge1xuICAgICAgICAgIGlmIChkeSA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBvdXRwdXRzW2ldO1xuICAgICAgICAgICAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRwdXQuc2l6ZSwgb3V0cHV0LmR0eXBlKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ha2VUZW5zb3IodmFscywgb3V0cHV0LnNoYXBlLCBvdXRwdXQuZHR5cGUpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZHk7XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBHcmFkIGZ1bmN0aW9ucyBvZiBvcHMgd2l0aCBzaW5nbGUgb3V0cHV0cyBleHBlY3QgYSBkeSwgd2hpbGUgb3BzXG4gICAgICAgIC8vIHdpdGggbXVsdGlwbGUgb3V0cHV0cyBleHBlY3QgZHlzIChhcnJheSBvZiBkeSkuXG4gICAgICAgIHJldHVybiBncmFkaWVudHNGdW5jKGR5cy5sZW5ndGggPiAxID8gZHlzIDogZHlzWzBdLCBzYXZlZCwgYXR0cnMpO1xuICAgICAgfTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5hY3RpdmVUYXBlLnB1c2godGFwZU5vZGUpO1xuICB9XG5cbiAga2VlcDxUIGV4dGVuZHMgVGVuc29yPihyZXN1bHQ6IFQpOiBUIHtcbiAgICByZXN1bHQua2VwdCA9IHRydWU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgc3RhcnRUYXBlKCkge1xuICAgIGlmICh0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPT09IDApIHtcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlVGFwZSA9IFtdO1xuICAgIH1cbiAgICB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGgrKztcbiAgfVxuXG4gIHByaXZhdGUgZW5kVGFwZSgpIHtcbiAgICB0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGgtLTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydCBhIHNjb3BlLiBVc2UgdGhpcyB3aXRoIGVuZFNjb3BlKCkgdG8gYWNoaWV2ZSB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5XG4gICAqIGFzIHNjb3BlKCkgd2l0aG91dCB0aGUgbmVlZCBmb3IgYSBmdW5jdGlvbiBjbG9zdXJlLlxuICAgKi9cbiAgc3RhcnRTY29wZShuYW1lPzogc3RyaW5nKSB7XG4gICAgY29uc3Qgc2NvcGVJbmZvOiBTY29wZVN0YXRlID0ge1xuICAgICAgdHJhY2s6IFtdLFxuICAgICAgbmFtZTogJ3VubmFtZWQgc2NvcGUnLFxuICAgICAgaWQ6IHRoaXMuc3RhdGUubmV4dFNjb3BlSWQrK1xuICAgIH07XG4gICAgaWYgKG5hbWUpIHtcbiAgICAgIHNjb3BlSW5mby5uYW1lID0gbmFtZTtcbiAgICB9XG4gICAgdGhpcy5zdGF0ZS5zY29wZVN0YWNrLnB1c2goc2NvcGVJbmZvKTtcbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlID0gc2NvcGVJbmZvO1xuICB9XG5cbiAgLyoqXG4gICAqIEVuZCBhIHNjb3BlLiBVc2UgdGhpcyB3aXRoIHN0YXJ0U2NvcGUoKSB0byBhY2hpZXZlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHlcbiAgICogYXMgc2NvcGUoKSB3aXRob3V0IHRoZSBuZWVkIGZvciBhIGZ1bmN0aW9uIGNsb3N1cmUuXG4gICAqL1xuICBlbmRTY29wZShyZXN1bHQ/OiBUZW5zb3JDb250YWluZXIpIHtcbiAgICBjb25zdCB0ZW5zb3JzVG9UcmFja0luUGFyZW50ID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKHJlc3VsdCk7XG4gICAgY29uc3QgdGVuc29yc1RvVHJhY2tJblBhcmVudFNldCA9XG4gICAgICAgIG5ldyBTZXQodGVuc29yc1RvVHJhY2tJblBhcmVudC5tYXAodCA9PiB0LmlkKSk7XG5cbiAgICAvLyBEaXNwb3NlIHRoZSBhcnJheXMgdHJhY2tlZCBpbiB0aGlzIHNjb3BlLlxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zdGF0ZS5hY3RpdmVTY29wZS50cmFjay5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgdGVuc29yID0gdGhpcy5zdGF0ZS5hY3RpdmVTY29wZS50cmFja1tpXTtcbiAgICAgIGlmICghdGVuc29yLmtlcHQgJiYgIXRlbnNvcnNUb1RyYWNrSW5QYXJlbnRTZXQuaGFzKHRlbnNvci5pZCkpIHtcbiAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvbGRTY29wZSA9IHRoaXMuc3RhdGUuc2NvcGVTdGFjay5wb3AoKTtcbiAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlID0gdGhpcy5zdGF0ZS5zY29wZVN0YWNrLmxlbmd0aCA9PT0gMCA/XG4gICAgICAgIG51bGwgOlxuICAgICAgICB0aGlzLnN0YXRlLnNjb3BlU3RhY2tbdGhpcy5zdGF0ZS5zY29wZVN0YWNrLmxlbmd0aCAtIDFdO1xuXG4gICAgLy8gVHJhY2sgdGhlIGN1cnJlbnQgcmVzdWx0IGluIHRoZSBwYXJlbnQgc2NvcGUuXG4gICAgdGVuc29yc1RvVHJhY2tJblBhcmVudC5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICAvLyBPbmx5IHRyYWNrIHRoZSB0ZW5zb3IgaWYgd2FzIGFsbG9jYXRlZCBpbiB0aGUgaW5uZXIgc2NvcGUgYW5kIGlzIG5vdFxuICAgICAgLy8gZ2xvYmFsbHkga2VwdC5cbiAgICAgIGlmICghdGVuc29yLmtlcHQgJiYgdGVuc29yLnNjb3BlSWQgPT09IG9sZFNjb3BlLmlkKSB7XG4gICAgICAgIHRoaXMudHJhY2sodGVuc29yKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIGdyYWRpZW50cyBvZiBgZmAgd2l0aCByZXNwZWN0IHRvIGVhY2ggb2YgdGhlIGB4c2AuIFRoZSBncmFkaWVudHNcbiAgICogcmV0dXJuZWQgYXJlIG9mIHRoZSBzYW1lIGxlbmd0aCBhcyBgeHNgLCBidXQgc29tZSBtaWdodCBiZSBudWxsIGlmIGBmYFxuICAgKiB3YXMgbm90IGEgZnVuY3Rpb24gb2YgdGhhdCBgeGAuIEl0IGFsc28gdGFrZXMgb3B0aW9uYWwgZHkgdG8gbXVsdGlwbHkgdGhlXG4gICAqIGdyYWRpZW50LCB3aGljaCBkZWZhdWx0cyB0byBgMWAuXG4gICAqL1xuICBncmFkaWVudHM8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICBmOiAoKSA9PiBULCB4czogVGVuc29yW10sIGR5PzogVCxcbiAgICAgIGFsbG93Tm9HcmFkaWVudHMgPSBmYWxzZSk6IHt2YWx1ZTogVCwgZ3JhZHM6IFRlbnNvcltdfSB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHhzLmxlbmd0aCA+IDAsICgpID0+ICdncmFkaWVudHMoKSByZWNlaXZlZCBhbiBlbXB0eSBsaXN0IG9mIHhzLicpO1xuICAgIGlmIChkeSAhPSBudWxsICYmIGR5LmR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZHkgbXVzdCBoYXZlICdmbG9hdDMyJyBkdHlwZSwgYnV0IGhhcyAnJHtkeS5kdHlwZX0nYCk7XG4gICAgfVxuXG4gICAgY29uc3QgeSA9IHRoaXMuc2NvcGVkUnVuKFxuICAgICAgICAoKSA9PiB0aGlzLnN0YXJ0VGFwZSgpLCAoKSA9PiB0aGlzLmVuZFRhcGUoKSxcbiAgICAgICAgKCkgPT4gdGhpcy50aWR5KCdmb3J3YXJkJywgZikpO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHkgaW5zdGFuY2VvZiBUZW5zb3IsXG4gICAgICAgICgpID0+ICdUaGUgcmVzdWx0IHkgcmV0dXJuZWQgYnkgZigpIG11c3QgYmUgYSB0ZW5zb3IuJyk7XG4gICAgLy8gRmlsdGVyIG91dCB0aGUgbm9kZXMgdGhhdCBkb24ndCBjb25uZWN0IHggPT4geS5cbiAgICBjb25zdCBmaWx0ZXJlZFRhcGUgPSBnZXRGaWx0ZXJlZE5vZGVzWFRvWSh0aGlzLnN0YXRlLmFjdGl2ZVRhcGUsIHhzLCB5KTtcbiAgICBpZiAoIWFsbG93Tm9HcmFkaWVudHMgJiYgZmlsdGVyZWRUYXBlLmxlbmd0aCA9PT0gMCAmJiB4cy5sZW5ndGggPiAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Nhbm5vdCBjb21wdXRlIGdyYWRpZW50IG9mIHk9Zih4KSB3aXRoIHJlc3BlY3QgdG8geC4gTWFrZSBzdXJlICcgK1xuICAgICAgICAgICd0aGF0IHRoZSBmIHlvdSBwYXNzZWQgZW5jbG9zZXMgYWxsIG9wZXJhdGlvbnMgdGhhdCBsZWFkIGZyb20geCAnICtcbiAgICAgICAgICAndG8geS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy50aWR5KCdiYWNrd2FyZCcsICgpID0+IHtcbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZGllbnRNYXA6IHtbdGVuc29ySWQ6IG51bWJlcl06IFRlbnNvcn0gPSB7fTtcbiAgICAgIGFjY3VtdWxhdGVkR3JhZGllbnRNYXBbeS5pZF0gPSAoZHkgPT0gbnVsbCkgPyBvbmVzKHkuc2hhcGUpIDogZHk7XG5cbiAgICAgIC8vIEJhY2twcm9wIGdyYWRpZW50cyB0aHJvdWdoIHRoZSBmaWx0ZXJlZCBub2Rlcy5cbiAgICAgIGJhY2twcm9wYWdhdGVHcmFkaWVudHMoXG4gICAgICAgICAgYWNjdW11bGF0ZWRHcmFkaWVudE1hcCwgZmlsdGVyZWRUYXBlLFxuICAgICAgICAgIC8vIFBhc3MgdGhlIHRpZHkgZnVuY3Rpb24gdG8gYXZvaWQgY2lyY3VsYXIgZGVwIHdpdGggYHRhcGUudHNgLlxuICAgICAgICAgIGYgPT4gdGhpcy50aWR5KGYgYXMgU2NvcGVGbjxUZW5zb3I+KSxcbiAgICAgICAgICAvLyBQYXNzIGFuIGFkZCBmdW5jdGlvbiB0byBhdm9pZGUgYSBjaXJjdWxhciBkZXAgd2l0aCBgdGFwZS50c2AuXG4gICAgICAgICAgYWRkKTtcbiAgICAgIGNvbnN0IGdyYWRzID0geHMubWFwKHggPT4gYWNjdW11bGF0ZWRHcmFkaWVudE1hcFt4LmlkXSk7XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlLmdyYWRpZW50RGVwdGggPT09IDApIHtcbiAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIGFyZSBub3QgY29tcHV0aW5nIGhpZ2hlci1vcmRlciBncmFkaWVudHNcbiAgICAgICAgLy8gYW5kIGNhbiBjbGVhbiB1cCB0aGUgdGFwZS5cbiAgICAgICAgdGhpcy5zdGF0ZS5hY3RpdmVUYXBlLmZvckVhY2gobm9kZSA9PiB7XG4gICAgICAgICAgZm9yIChjb25zdCB0ZW5zb3Igb2Ygbm9kZS5zYXZlZCkge1xuICAgICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZVRhcGUgPSBudWxsO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHt2YWx1ZTogeSwgZ3JhZHN9O1xuICAgIH0pO1xuICB9XG5cbiAgY3VzdG9tR3JhZDxUIGV4dGVuZHMgVGVuc29yPihmOiBDdXN0b21HcmFkaWVudEZ1bmM8VD4pOlxuICAgICAgKC4uLmFyZ3M6IEFycmF5PFRlbnNvcnxHcmFkU2F2ZUZ1bmM+KSA9PiBUIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdXRpbC5pc0Z1bmN0aW9uKGYpLFxuICAgICAgICAoKSA9PiAnVGhlIGYgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICAgIHJldHVybiAoLi4uaW5wdXRzOiBUZW5zb3JbXSk6IFQgPT4ge1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgaW5wdXRzLmV2ZXJ5KHQgPT4gdCBpbnN0YW5jZW9mIFRlbnNvciksXG4gICAgICAgICAgKCkgPT4gJ1RoZSBhcmdzIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpKHgxLCB4MiwuLi4pIG11c3QgYWxsIGJlICcgK1xuICAgICAgICAgICAgICAndGVuc29ycycpO1xuXG4gICAgICBsZXQgcmVzOiB7XG4gICAgICAgIHZhbHVlOiBULFxuICAgICAgICBncmFkRnVuYzogKGR5OiBULCBzYXZlZDogVGVuc29yW10pID0+IFRlbnNvciB8IFRlbnNvcltdLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGlucHV0TWFwOiBOYW1lZFRlbnNvck1hcCA9IHt9O1xuICAgICAgaW5wdXRzLmZvckVhY2goKGlucHV0LCBpKSA9PiB7XG4gICAgICAgIGlucHV0TWFwW2ldID0gaW5wdXQ7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZm9yd2FyZEZ1bmM6IEZvcndhcmRGdW5jPFQ+ID0gKF8sIHNhdmUpID0+IHtcbiAgICAgICAgcmVzID0gZiguLi5bLi4uaW5wdXRzLCBzYXZlXSk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICAgcmVzLnZhbHVlIGluc3RhbmNlb2YgVGVuc29yLFxuICAgICAgICAgICAgKCkgPT4gJ1RoZSBmdW5jdGlvbiBmIHBhc3NlZCBpbiBjdXN0b21HcmFkKGYpIG11c3QgcmV0dXJuIGFuICcgK1xuICAgICAgICAgICAgICAgICdvYmplY3Qgd2hlcmUgYG9iai52YWx1ZWAgaXMgYSB0ZW5zb3InKTtcbiAgICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgICB1dGlsLmlzRnVuY3Rpb24ocmVzLmdyYWRGdW5jKSxcbiAgICAgICAgICAgICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAnb2JqZWN0IHdoZXJlIGBvYmouZ3JhZEZ1bmNgIGlzIGEgZnVuY3Rpb24uJyk7XG4gICAgICAgIHJldHVybiByZXMudmFsdWU7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBiYWNrd2FyZHNGdW5jID0gKGR5OiBULCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICAgICAgY29uc3QgZ3JhZFJlcyA9IHJlcy5ncmFkRnVuYyhkeSwgc2F2ZWQpO1xuICAgICAgICBjb25zdCBncmFkczogVGVuc29yW10gPSBBcnJheS5pc0FycmF5KGdyYWRSZXMpID8gZ3JhZFJlcyA6IFtncmFkUmVzXTtcbiAgICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgICBncmFkcy5sZW5ndGggPT09IGlucHV0cy5sZW5ndGgsXG4gICAgICAgICAgICAoKSA9PiAnVGhlIGZ1bmN0aW9uIGYgcGFzc2VkIGluIGN1c3RvbUdyYWQoZikgbXVzdCByZXR1cm4gYW4gJyArXG4gICAgICAgICAgICAgICAgJ29iamVjdCB3aGVyZSBgb2JqLmdyYWRGdW5jYCBpcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyAnICtcbiAgICAgICAgICAgICAgICAndGhlIHNhbWUgbnVtYmVyIG9mIHRlbnNvcnMgYXMgaW5wdXRzIHBhc3NlZCB0byBmKC4uLikuJyk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICAgZ3JhZHMuZXZlcnkodCA9PiB0IGluc3RhbmNlb2YgVGVuc29yKSxcbiAgICAgICAgICAgICgpID0+ICdUaGUgZnVuY3Rpb24gZiBwYXNzZWQgaW4gY3VzdG9tR3JhZChmKSBtdXN0IHJldHVybiBhbiAnICtcbiAgICAgICAgICAgICAgICAnb2JqZWN0IHdoZXJlIGBvYmouZ3JhZEZ1bmNgIGlzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zICcgK1xuICAgICAgICAgICAgICAgICdhIGxpc3Qgb2Ygb25seSB0ZW5zb3JzLicpO1xuICAgICAgICBjb25zdCBncmFkTWFwOiB7W2tleTogc3RyaW5nXTogKCkgPT4gVGVuc29yfSA9IHt9O1xuICAgICAgICBncmFkcy5mb3JFYWNoKChncmFkLCBpKSA9PiB7XG4gICAgICAgICAgZ3JhZE1hcFtpXSA9ICgpID0+IGdyYWQ7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZ3JhZE1hcDtcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiB0aGlzLnJ1bktlcm5lbEZ1bmMoe1xuICAgICAgICBmb3J3YXJkRnVuYyxcbiAgICAgICAgYmFja3dhcmRzRnVuYyxcbiAgICAgICAgaW5wdXRzOiBpbnB1dE1hcCxcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICByZWFkU3luYyhkYXRhSWQ6IERhdGFJZCk6IEJhY2tlbmRWYWx1ZXMge1xuICAgIC8vIFJvdXRlIHRoZSByZWFkIHRvIHRoZSBjb3JyZWN0IGJhY2tlbmQuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKTtcbiAgICByZXR1cm4gaW5mby5iYWNrZW5kLnJlYWRTeW5jKGRhdGFJZCk7XG4gIH1cbiAgcmVhZChkYXRhSWQ6IERhdGFJZCk6IFByb21pc2U8QmFja2VuZFZhbHVlcz4ge1xuICAgIC8vIFJvdXRlIHRoZSByZWFkIHRvIHRoZSBjb3JyZWN0IGJhY2tlbmQuXG4gICAgY29uc3QgaW5mbyA9IHRoaXMuc3RhdGUudGVuc29ySW5mby5nZXQoZGF0YUlkKTtcbiAgICByZXR1cm4gaW5mby5iYWNrZW5kLnJlYWQoZGF0YUlkKTtcbiAgfVxuXG4gIHJlYWRUb0dQVShkYXRhSWQ6IERhdGFJZCwgb3B0aW9ucz86IERhdGFUb0dQVU9wdGlvbnMpOiBHUFVEYXRhIHtcbiAgICAvLyBSb3V0ZSB0aGUgcmVhZCB0byB0aGUgY29ycmVjdCBiYWNrZW5kLlxuICAgIGNvbnN0IGluZm8gPSB0aGlzLnN0YXRlLnRlbnNvckluZm8uZ2V0KGRhdGFJZCk7XG4gICAgcmV0dXJuIGluZm8uYmFja2VuZC5yZWFkVG9HUFUoZGF0YUlkLCBvcHRpb25zKTtcbiAgfVxuXG4gIGFzeW5jIHRpbWUocXVlcnk6ICgpID0+IHZvaWQpOiBQcm9taXNlPFRpbWluZ0luZm8+IHtcbiAgICBjb25zdCBzdGFydCA9IG5vdygpO1xuICAgIGNvbnN0IHRpbWluZ0luZm8gPSBhd2FpdCB0aGlzLmJhY2tlbmQudGltZShxdWVyeSkgYXMgVGltaW5nSW5mbztcbiAgICB0aW1pbmdJbmZvLndhbGxNcyA9IG5vdygpIC0gc3RhcnQ7XG4gICAgcmV0dXJuIHRpbWluZ0luZm87XG4gIH1cblxuICAvKipcbiAgICogVHJhY2tzIGEgVGVuc29yIGluIHRoZSBjdXJyZW50IHNjb3BlIHRvIGJlIGF1dG9tYXRpY2FsbHkgY2xlYW5lZCB1cFxuICAgKiB3aGVuIHRoZSBjdXJyZW50IHNjb3BlIGVuZHMsIGFuZCByZXR1cm5zIHRoZSB2YWx1ZS5cbiAgICpcbiAgICogQHBhcmFtIHJlc3VsdCBUaGUgVGVuc29yIHRvIHRyYWNrIGluIHRoZSBjdXJyZW50IHNjb3BlLlxuICAgKi9cbiAgcHJpdmF0ZSB0cmFjazxUIGV4dGVuZHMgVGVuc29yPihyZXN1bHQ6IFQpOiBUIHtcbiAgICBpZiAodGhpcy5zdGF0ZS5hY3RpdmVTY29wZSAhPSBudWxsKSB7XG4gICAgICByZXN1bHQuc2NvcGVJZCA9IHRoaXMuc3RhdGUuYWN0aXZlU2NvcGUuaWQ7XG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZVNjb3BlLnRyYWNrLnB1c2gocmVzdWx0KTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0IHJlZ2lzdGVyZWRWYXJpYWJsZXMoKTogTmFtZWRWYXJpYWJsZU1hcCB7XG4gICAgcmV0dXJuIHRoaXMuc3RhdGUucmVnaXN0ZXJlZFZhcmlhYmxlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNldHMgdGhlIGVuZ2luZSBzdGF0ZS4gUmVtb3ZlcyBhbGwgYmFja2VuZHMgYnV0IGRvZXMgbm90IHJlbW92ZVxuICAgKiByZWdpc3RlcmVkIGJhY2tlbmQgZmFjdG9yaWVzLlxuICAgKi9cbiAgcmVzZXQoKTogdm9pZCB7XG4gICAgLy8gTWFrZSBhbnkgcGVuZGluZyBwcm9taXNlIG9ic29sZXRlLlxuICAgIHRoaXMucGVuZGluZ0JhY2tlbmRJbml0SWQrKztcblxuICAgIHRoaXMuc3RhdGUuZGlzcG9zZSgpO1xuICAgIHRoaXMuRU5WLnJlc2V0KCk7XG4gICAgdGhpcy5zdGF0ZSA9IG5ldyBFbmdpbmVTdGF0ZSgpO1xuXG4gICAgZm9yIChjb25zdCBiYWNrZW5kTmFtZSBpbiB0aGlzLnJlZ2lzdHJ5KSB7XG4gICAgICB0aGlzLmRpc3Bvc2VSZWdpc3RlcmVkS2VybmVscyhiYWNrZW5kTmFtZSk7XG4gICAgICB0aGlzLnJlZ2lzdHJ5W2JhY2tlbmROYW1lXS5kaXNwb3NlKCk7XG4gICAgICBkZWxldGUgdGhpcy5yZWdpc3RyeVtiYWNrZW5kTmFtZV07XG4gICAgfVxuICAgIHRoaXMuYmFja2VuZE5hbWUgPSBudWxsO1xuICAgIHRoaXMuYmFja2VuZEluc3RhbmNlID0gbnVsbDtcbiAgICB0aGlzLnBlbmRpbmdCYWNrZW5kSW5pdCA9IG51bGw7XG4gIH1cbn1cblxuZnVuY3Rpb24gb25lcyhzaGFwZTogbnVtYmVyW10pOiBUZW5zb3Ige1xuICBjb25zdCB2YWx1ZXMgPSBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZUZyb21TaGFwZShzaGFwZSksICdmbG9hdDMyJyk7XG4gIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3JNYWtlRW5naW5lKCk6IEVuZ2luZSB7XG4gIGNvbnN0IG5zID0gZ2V0R2xvYmFsTmFtZXNwYWNlKCkgYXMge30gYXMge190ZmVuZ2luZTogRW5naW5lfTtcbiAgaWYgKG5zLl90ZmVuZ2luZSA9PSBudWxsKSB7XG4gICAgY29uc3QgZW52aXJvbm1lbnQgPSBuZXcgRW52aXJvbm1lbnQobnMpO1xuICAgIG5zLl90ZmVuZ2luZSA9IG5ldyBFbmdpbmUoZW52aXJvbm1lbnQpO1xuICB9XG4gIHNldEVudmlyb25tZW50R2xvYmFsKG5zLl90ZmVuZ2luZS5FTlYpO1xuXG4gIC8vIFRlbGwgdGhlIGN1cnJlbnQgdGVuc29yIGludGVyZmFjZSB0aGF0IHRoZSBnbG9iYWwgZW5naW5lIGlzIHJlc3BvbnNpYmxlXG4gIC8vIGZvciB0cmFja2luZy5cbiAgc2V0VGVuc29yVHJhY2tlcigoKSA9PiBucy5fdGZlbmdpbmUpO1xuICByZXR1cm4gbnMuX3RmZW5naW5lO1xufVxuXG5leHBvcnQgY29uc3QgRU5HSU5FID0gZ2V0T3JNYWtlRW5naW5lKCk7XG5cbi8qKlxuICogQSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWRkIG9wIGZvciB1c2Ugd2l0aGluIGVuZ2luZSBhbmQgdGFwZS5cbiAqXG4gKiBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiBhZGQudHMgYW5kIGVuZ2luZS5cbiAqIEl0IGlzIGV4cG9ydGVkIHRvIGJlIGF2YWlsYWJsZSBpbiB0YXBlIHRlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkKGE6IFRlbnNvciwgYjogVGVuc29yKTogVGVuc29yIHtcbiAgLy8gV2UgZHVwbGljYXRlIEFkZCBoZXJlIHRvIGF2b2lkIGEgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aXRoIGFkZC50cy5cbiAgY29uc3QgaW5wdXRzID0ge2EsIGJ9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBZGQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line:no-any\nfunction _isNavigatorDefined() {\n    return typeof navigator !== 'undefined' && navigator != null;\n}\nlet isMobileMockValue;\nexport function mockIsMobile(value) {\n    isMobileMockValue = value;\n}\nexport function isMobile(nav) {\n    if (isMobileMockValue !== undefined) {\n        return isMobileMockValue;\n    }\n    if (nav || _isNavigatorDefined()) {\n        if (!nav) {\n            nav = navigator;\n        }\n        if (nav.product === 'ReactNative') {\n            return true;\n        }\n        const a = nav.userAgent || nav.vendor ||\n            // tslint:disable-next-line:no-any\n            (typeof window !== 'undefined' ? window.opera : '');\n        // Use `navigator.userAgentData.mobile` as fallback.\n        if (!a) {\n            // tslint:disable-next-line:no-any\n            const navAny = nav;\n            return navAny.userAgentData && navAny.userAgentData.mobile;\n        }\n        // tslint:disable-next-line:max-line-length\n        return /(android|bb\\d+|meego).+mobile|avantgo|bada\\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i\n            .test(a) ||\n            // tslint:disable-next-line:max-line-length\n            /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\\-(n|u)|c55\\/|capi|ccwa|cdm\\-|cell|chtm|cldc|cmd\\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\\-s|devi|dica|dmob|do(c|p)o|ds(12|\\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\\-|_)|g1 u|g560|gene|gf\\-5|g\\-mo|go(\\.w|od)|gr(ad|un)|haie|hcit|hd\\-(m|p|t)|hei\\-|hi(pt|ta)|hp( i|ip)|hs\\-c|ht(c(\\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\\-(20|go|ma)|i230|iac( |\\-|\\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\\/)|klon|kpt |kwc\\-|kyo(c|k)|le(no|xi)|lg( g|\\/(k|l|u)|50|54|\\-[a-w])|libw|lynx|m1\\-w|m3ga|m50\\/|ma(te|ui|xo)|mc(01|21|ca)|m\\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\\-2|po(ck|rt|se)|prox|psio|pt\\-g|qa\\-a|qc(07|12|21|32|60|\\-[2-7]|i\\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\\-|oo|p\\-)|sdk\\/|se(c(\\-|0|1)|47|mc|nd|ri)|sgh\\-|shar|sie(\\-|m)|sk\\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\\-|v\\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\\-|tdg\\-|tel(i|m)|tim\\-|t\\-mo|to(pl|sh)|ts(70|m\\-|m3|m5)|tx\\-9|up(\\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\\-|your|zeto|zte\\-/i\n                .test(a.substr(0, 4));\n    }\n    return false;\n}\nexport function isBrowser() {\n    return (typeof window !== 'undefined' && window.document != null) ||\n        //@ts-ignore\n        (typeof WorkerGlobalScope !== 'undefined');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2aWNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2RldmljZV91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtDQUFrQztBQUNsQyxTQUFTLG1CQUFtQjtJQUMxQixPQUFPLE9BQU8sU0FBUyxLQUFLLFdBQVcsSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDO0FBQy9ELENBQUM7QUFFRCxJQUFJLGlCQUFvQyxDQUFDO0FBRXpDLE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBd0I7SUFDbkQsaUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsUUFBUSxDQUFDLEdBQWU7SUFDdEMsSUFBSSxpQkFBaUIsS0FBSyxTQUFTLEVBQUU7UUFDbkMsT0FBTyxpQkFBaUIsQ0FBQztLQUMxQjtJQUNELElBQUksR0FBRyxJQUFJLG1CQUFtQixFQUFFLEVBQUU7UUFDaEMsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNSLEdBQUcsR0FBRyxTQUFTLENBQUM7U0FDakI7UUFDRCxJQUFJLEdBQUcsQ0FBQyxPQUFPLEtBQUssYUFBYSxFQUFFO1lBQ2pDLE9BQU8sSUFBSSxDQUFDO1NBQ2I7UUFFRCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsU0FBUyxJQUFJLEdBQUcsQ0FBQyxNQUFNO1lBQ2pDLGtDQUFrQztZQUNsQyxDQUFDLE9BQU8sTUFBTSxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUUsTUFBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDakUsb0RBQW9EO1FBQ3BELElBQUksQ0FBQyxDQUFDLEVBQUU7WUFDTixrQ0FBa0M7WUFDbEMsTUFBTSxNQUFNLEdBQUcsR0FBVSxDQUFDO1lBQzFCLE9BQU8sTUFBTSxDQUFDLGFBQWEsSUFBSSxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQztTQUM1RDtRQUNELDJDQUEyQztRQUMzQyxPQUFPLDBUQUEwVDthQUNyVCxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ2YsMkNBQTJDO1lBQzNDLHlrREFBeWtEO2lCQUNwa0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0I7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxNQUFNLFVBQVUsU0FBUztJQUN2QixPQUFPLENBQUMsT0FBTyxNQUFNLEtBQUssV0FBVyxJQUFJLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDO1FBQzdELFlBQVk7UUFDWixDQUFDLE9BQU8saUJBQWlCLEtBQUssV0FBVyxDQUFDLENBQUM7QUFDakQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuZnVuY3Rpb24gX2lzTmF2aWdhdG9yRGVmaW5lZCgpOiBib29sZWFuIHtcbiAgcmV0dXJuIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvciAhPSBudWxsO1xufVxuXG5sZXQgaXNNb2JpbGVNb2NrVmFsdWU6IGJvb2xlYW58dW5kZWZpbmVkO1xuXG5leHBvcnQgZnVuY3Rpb24gbW9ja0lzTW9iaWxlKHZhbHVlOiBib29sZWFufHVuZGVmaW5lZCkge1xuICBpc01vYmlsZU1vY2tWYWx1ZSA9IHZhbHVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNNb2JpbGUobmF2PzogTmF2aWdhdG9yKTogYm9vbGVhbiB7XG4gIGlmIChpc01vYmlsZU1vY2tWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGlzTW9iaWxlTW9ja1ZhbHVlO1xuICB9XG4gIGlmIChuYXYgfHwgX2lzTmF2aWdhdG9yRGVmaW5lZCgpKSB7XG4gICAgaWYgKCFuYXYpIHtcbiAgICAgIG5hdiA9IG5hdmlnYXRvcjtcbiAgICB9XG4gICAgaWYgKG5hdi5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBjb25zdCBhID0gbmF2LnVzZXJBZ2VudCB8fCBuYXYudmVuZG9yIHx8XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gKHdpbmRvdyBhcyBhbnkpLm9wZXJhIDogJycpO1xuICAgIC8vIFVzZSBgbmF2aWdhdG9yLnVzZXJBZ2VudERhdGEubW9iaWxlYCBhcyBmYWxsYmFjay5cbiAgICBpZiAoIWEpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgIGNvbnN0IG5hdkFueSA9IG5hdiBhcyBhbnk7XG4gICAgICByZXR1cm4gbmF2QW55LnVzZXJBZ2VudERhdGEgJiYgbmF2QW55LnVzZXJBZ2VudERhdGEubW9iaWxlO1xuICAgIH1cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgcmV0dXJuIC8oYW5kcm9pZHxiYlxcZCt8bWVlZ28pLittb2JpbGV8YXZhbnRnb3xiYWRhXFwvfGJsYWNrYmVycnl8YmxhemVyfGNvbXBhbHxlbGFpbmV8ZmVubmVjfGhpcHRvcHxpZW1vYmlsZXxpcChob25lfG9kKXxpcmlzfGtpbmRsZXxsZ2UgfG1hZW1vfG1pZHB8bW1wfG1vYmlsZS4rZmlyZWZveHxuZXRmcm9udHxvcGVyYSBtKG9ifGluKWl8cGFsbSggb3MpP3xwaG9uZXxwKGl4aXxyZSlcXC98cGx1Y2tlcnxwb2NrZXR8cHNwfHNlcmllcyg0fDYpMHxzeW1iaWFufHRyZW98dXBcXC4oYnJvd3NlcnxsaW5rKXx2b2RhZm9uZXx3YXB8d2luZG93cyBjZXx4ZGF8eGlpbm8vaVxuICAgICAgICAgICAgICAgLnRlc3QoYSkgfHxcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICAvMTIwN3w2MzEwfDY1OTB8M2dzb3w0dGhwfDUwWzEtNl1pfDc3MHN8ODAyc3xhIHdhfGFiYWN8YWMoZXJ8b298c1xcLSl8YWkoa298cm4pfGFsKGF2fGNhfGNvKXxhbW9pfGFuKGV4fG55fHl3KXxhcHR1fGFyKGNofGdvKXxhcyh0ZXx1cyl8YXR0d3xhdShkaXxcXC1tfHIgfHMgKXxhdmFufGJlKGNrfGxsfG5xKXxiaShsYnxyZCl8YmwoYWN8YXopfGJyKGV8dil3fGJ1bWJ8YndcXC0obnx1KXxjNTVcXC98Y2FwaXxjY3dhfGNkbVxcLXxjZWxsfGNodG18Y2xkY3xjbWRcXC18Y28obXB8bmQpfGNyYXd8ZGEoaXR8bGx8bmcpfGRidGV8ZGNcXC1zfGRldml8ZGljYXxkbW9ifGRvKGN8cClvfGRzKDEyfFxcLWQpfGVsKDQ5fGFpKXxlbShsMnx1bCl8ZXIoaWN8azApfGVzbDh8ZXooWzQtN10wfG9zfHdhfHplKXxmZXRjfGZseShcXC18Xyl8ZzEgdXxnNTYwfGdlbmV8Z2ZcXC01fGdcXC1tb3xnbyhcXC53fG9kKXxncihhZHx1bil8aGFpZXxoY2l0fGhkXFwtKG18cHx0KXxoZWlcXC18aGkocHR8dGEpfGhwKCBpfGlwKXxoc1xcLWN8aHQoYyhcXC18IHxffGF8Z3xwfHN8dCl8dHApfGh1KGF3fHRjKXxpXFwtKDIwfGdvfG1hKXxpMjMwfGlhYyggfFxcLXxcXC8pfGlicm98aWRlYXxpZzAxfGlrb218aW0xa3xpbm5vfGlwYXF8aXJpc3xqYSh0fHYpYXxqYnJvfGplbXV8amlnc3xrZGRpfGtlaml8a2d0KCB8XFwvKXxrbG9ufGtwdCB8a3djXFwtfGt5byhjfGspfGxlKG5vfHhpKXxsZyggZ3xcXC8oa3xsfHUpfDUwfDU0fFxcLVthLXddKXxsaWJ3fGx5bnh8bTFcXC13fG0zZ2F8bTUwXFwvfG1hKHRlfHVpfHhvKXxtYygwMXwyMXxjYSl8bVxcLWNyfG1lKHJjfHJpKXxtaShvOHxvYXx0cyl8bW1lZnxtbygwMXwwMnxiaXxkZXxkb3x0KFxcLXwgfG98dil8enopfG10KDUwfHAxfHYgKXxtd2JwfG15d2F8bjEwWzAtMl18bjIwWzItM118bjMwKDB8Mil8bjUwKDB8Mnw1KXxuNygwKDB8MSl8MTApfG5lKChjfG0pXFwtfG9ufHRmfHdmfHdnfHd0KXxub2soNnxpKXxuenBofG8yaW18b3AodGl8d3YpfG9yYW58b3dnMXxwODAwfHBhbihhfGR8dCl8cGR4Z3xwZygxM3xcXC0oWzEtOF18YykpfHBoaWx8cGlyZXxwbChheXx1Yyl8cG5cXC0yfHBvKGNrfHJ0fHNlKXxwcm94fHBzaW98cHRcXC1nfHFhXFwtYXxxYygwN3wxMnwyMXwzMnw2MHxcXC1bMi03XXxpXFwtKXxxdGVrfHIzODB8cjYwMHxyYWtzfHJpbTl8cm8odmV8em8pfHM1NVxcL3xzYShnZXxtYXxtbXxtc3xueXx2YSl8c2MoMDF8aFxcLXxvb3xwXFwtKXxzZGtcXC98c2UoYyhcXC18MHwxKXw0N3xtY3xuZHxyaSl8c2doXFwtfHNoYXJ8c2llKFxcLXxtKXxza1xcLTB8c2woNDV8aWQpfHNtKGFsfGFyfGIzfGl0fHQ1KXxzbyhmdHxueSl8c3AoMDF8aFxcLXx2XFwtfHYgKXxzeSgwMXxtYil8dDIoMTh8NTApfHQ2KDAwfDEwfDE4KXx0YShndHxsayl8dGNsXFwtfHRkZ1xcLXx0ZWwoaXxtKXx0aW1cXC18dFxcLW1vfHRvKHBsfHNoKXx0cyg3MHxtXFwtfG0zfG01KXx0eFxcLTl8dXAoXFwuYnxnMXxzaSl8dXRzdHx2NDAwfHY3NTB8dmVyaXx2aShyZ3x0ZSl8dmsoNDB8NVswLTNdfFxcLXYpfHZtNDB8dm9kYXx2dWxjfHZ4KDUyfDUzfDYwfDYxfDcwfDgwfDgxfDgzfDg1fDk4KXx3M2MoXFwtfCApfHdlYmN8d2hpdHx3aShnIHxuY3xudyl8d21sYnx3b251fHg3MDB8eWFzXFwtfHlvdXJ8emV0b3x6dGVcXC0vaVxuICAgICAgICAgICAgLnRlc3QoYS5zdWJzdHIoMCwgNCkpO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzQnJvd3NlcigpOiBib29sZWFuIHtcbiAgcmV0dXJuICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuZG9jdW1lbnQgIT0gbnVsbCkgfHxcbiAgICAgIC8vQHRzLWlnbm9yZVxuICAgICAgKHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcpO1xufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport './engine';\nimport * as device_util from './device_util';\nimport { env } from './environment';\nconst ENV = env();\n/**\n * This file contains environment-related flag registrations.\n */\n/** Whether to enable debug mode. */\nENV.registerFlag('DEBUG', () => false, debugValue => {\n    if (debugValue) {\n        console.warn('Debugging mode is ON. The output of every math call will ' +\n            'be downloaded to CPU and checked for NaNs. ' +\n            'This significantly impacts performance.');\n    }\n});\n/** Whether we are in a browser (as versus, say, node.js) environment. */\nENV.registerFlag('IS_BROWSER', () => device_util.isBrowser());\n/** Whether we are in a browser (as versus, say, node.js) environment. */\nENV.registerFlag('IS_NODE', () => (typeof process !== 'undefined') &&\n    (typeof process.versions !== 'undefined') &&\n    (typeof process.versions.node !== 'undefined'));\n/** Whether this browser is Chrome. */\nENV.registerFlag('IS_CHROME', () => typeof navigator !== 'undefined' && navigator != null &&\n    navigator.userAgent != null && /Chrome/.test(navigator.userAgent) &&\n    /Google Inc/.test(navigator.vendor));\n/**\n * True when the environment is \"production\" where we disable safety checks\n * to gain performance.\n */\nENV.registerFlag('PROD', () => false);\n/**\n * Whether to do sanity checks when inferring a shape from user-provided\n * values, used when creating a new tensor.\n */\nENV.registerFlag('TENSORLIKE_CHECK_SHAPE_CONSISTENCY', () => ENV.getBool('DEBUG'));\n/** Whether deprecation warnings are enabled. */\nENV.registerFlag('DEPRECATION_WARNINGS_ENABLED', () => true);\n/** True if running unit tests. */\nENV.registerFlag('IS_TEST', () => false);\n/** Whether to check computation result for errors. */\nENV.registerFlag('CHECK_COMPUTATION_FOR_ERRORS', () => true);\n/** Whether the backend needs to wrap input to imageBitmap. */\nENV.registerFlag('WRAP_TO_IMAGEBITMAP', () => false);\n/** Experimental flag, whether enter compile only phase. */\nENV.registerFlag('ENGINE_COMPILE_ONLY', () => false);\n/** Whether to enable canvas2d willReadFrequently for GPU backends */\nENV.registerFlag('CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU', () => false);\n/** Whether to use setTimeoutCustom */\nENV.registerFlag('USE_SETTIMEOUTCUSTOM', () => false);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2ZsYWdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sVUFBVSxDQUFDO0FBRWxCLE9BQU8sS0FBSyxXQUFXLE1BQU0sZUFBZSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFbEMsTUFBTSxHQUFHLEdBQUcsR0FBRyxFQUFFLENBQUM7QUFFbEI7O0dBRUc7QUFFSCxvQ0FBb0M7QUFDcEMsR0FBRyxDQUFDLFlBQVksQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFO0lBQ2xELElBQUksVUFBVSxFQUFFO1FBQ2QsT0FBTyxDQUFDLElBQUksQ0FDUiwyREFBMkQ7WUFDM0QsNkNBQTZDO1lBQzdDLHlDQUF5QyxDQUFDLENBQUM7S0FDaEQ7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILHlFQUF5RTtBQUN6RSxHQUFHLENBQUMsWUFBWSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUU5RCx5RUFBeUU7QUFDekUsR0FBRyxDQUFDLFlBQVksQ0FDWixTQUFTLEVBQ1QsR0FBRyxFQUFFLENBQUMsQ0FBQyxPQUFPLE9BQU8sS0FBSyxXQUFXLENBQUM7SUFDbEMsQ0FBQyxPQUFPLE9BQU8sQ0FBQyxRQUFRLEtBQUssV0FBVyxDQUFDO0lBQ3pDLENBQUMsT0FBTyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBRXhELHNDQUFzQztBQUN0QyxHQUFHLENBQUMsWUFBWSxDQUNaLFdBQVcsRUFDWCxHQUFHLEVBQUUsQ0FBQyxPQUFPLFNBQVMsS0FBSyxXQUFXLElBQUksU0FBUyxJQUFJLElBQUk7SUFDdkQsU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDO0lBQ2pFLFlBQVksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7QUFFN0M7OztHQUdHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFdEM7OztHQUdHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FDWixvQ0FBb0MsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFdEUsZ0RBQWdEO0FBQ2hELEdBQUcsQ0FBQyxZQUFZLENBQUMsOEJBQThCLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFN0Qsa0NBQWtDO0FBQ2xDLEdBQUcsQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXpDLHNEQUFzRDtBQUN0RCxHQUFHLENBQUMsWUFBWSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRTdELDhEQUE4RDtBQUM5RCxHQUFHLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJELDJEQUEyRDtBQUMzRCxHQUFHLENBQUMsWUFBWSxDQUFDLHFCQUFxQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXJELHFFQUFxRTtBQUNyRSxHQUFHLENBQUMsWUFBWSxDQUFDLHVDQUF1QyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRXZFLHNDQUFzQztBQUN0QyxHQUFHLENBQUMsWUFBWSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICcuL2VuZ2luZSc7XG5cbmltcG9ydCAqIGFzIGRldmljZV91dGlsIGZyb20gJy4vZGV2aWNlX3V0aWwnO1xuaW1wb3J0IHtlbnZ9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuXG5jb25zdCBFTlYgPSBlbnYoKTtcblxuLyoqXG4gKiBUaGlzIGZpbGUgY29udGFpbnMgZW52aXJvbm1lbnQtcmVsYXRlZCBmbGFnIHJlZ2lzdHJhdGlvbnMuXG4gKi9cblxuLyoqIFdoZXRoZXIgdG8gZW5hYmxlIGRlYnVnIG1vZGUuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdERUJVRycsICgpID0+IGZhbHNlLCBkZWJ1Z1ZhbHVlID0+IHtcbiAgaWYgKGRlYnVnVmFsdWUpIHtcbiAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICdEZWJ1Z2dpbmcgbW9kZSBpcyBPTi4gVGhlIG91dHB1dCBvZiBldmVyeSBtYXRoIGNhbGwgd2lsbCAnICtcbiAgICAgICAgJ2JlIGRvd25sb2FkZWQgdG8gQ1BVIGFuZCBjaGVja2VkIGZvciBOYU5zLiAnICtcbiAgICAgICAgJ1RoaXMgc2lnbmlmaWNhbnRseSBpbXBhY3RzIHBlcmZvcm1hbmNlLicpO1xuICB9XG59KTtcblxuLyoqIFdoZXRoZXIgd2UgYXJlIGluIGEgYnJvd3NlciAoYXMgdmVyc3VzLCBzYXksIG5vZGUuanMpIGVudmlyb25tZW50LiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnSVNfQlJPV1NFUicsICgpID0+IGRldmljZV91dGlsLmlzQnJvd3NlcigpKTtcblxuLyoqIFdoZXRoZXIgd2UgYXJlIGluIGEgYnJvd3NlciAoYXMgdmVyc3VzLCBzYXksIG5vZGUuanMpIGVudmlyb25tZW50LiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnSVNfTk9ERScsXG4gICAgKCkgPT4gKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgKHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zICE9PSAndW5kZWZpbmVkJykgJiZcbiAgICAgICAgKHR5cGVvZiBwcm9jZXNzLnZlcnNpb25zLm5vZGUgIT09ICd1bmRlZmluZWQnKSk7XG5cbi8qKiBXaGV0aGVyIHRoaXMgYnJvd3NlciBpcyBDaHJvbWUuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdJU19DSFJPTUUnLFxuICAgICgpID0+IHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIG5hdmlnYXRvciAhPSBudWxsICYmXG4gICAgICAgIG5hdmlnYXRvci51c2VyQWdlbnQgIT0gbnVsbCAmJiAvQ2hyb21lLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmXG4gICAgICAgIC9Hb29nbGUgSW5jLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpKTtcblxuLyoqXG4gKiBUcnVlIHdoZW4gdGhlIGVudmlyb25tZW50IGlzIFwicHJvZHVjdGlvblwiIHdoZXJlIHdlIGRpc2FibGUgc2FmZXR5IGNoZWNrc1xuICogdG8gZ2FpbiBwZXJmb3JtYW5jZS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnUFJPRCcsICgpID0+IGZhbHNlKTtcblxuLyoqXG4gKiBXaGV0aGVyIHRvIGRvIHNhbml0eSBjaGVja3Mgd2hlbiBpbmZlcnJpbmcgYSBzaGFwZSBmcm9tIHVzZXItcHJvdmlkZWRcbiAqIHZhbHVlcywgdXNlZCB3aGVuIGNyZWF0aW5nIGEgbmV3IHRlbnNvci5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnVEVOU09STElLRV9DSEVDS19TSEFQRV9DT05TSVNURU5DWScsICgpID0+IEVOVi5nZXRCb29sKCdERUJVRycpKTtcblxuLyoqIFdoZXRoZXIgZGVwcmVjYXRpb24gd2FybmluZ3MgYXJlIGVuYWJsZWQuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdERVBSRUNBVElPTl9XQVJOSU5HU19FTkFCTEVEJywgKCkgPT4gdHJ1ZSk7XG5cbi8qKiBUcnVlIGlmIHJ1bm5pbmcgdW5pdCB0ZXN0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0lTX1RFU1QnLCAoKSA9PiBmYWxzZSk7XG5cbi8qKiBXaGV0aGVyIHRvIGNoZWNrIGNvbXB1dGF0aW9uIHJlc3VsdCBmb3IgZXJyb3JzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnQ0hFQ0tfQ09NUFVUQVRJT05fRk9SX0VSUk9SUycsICgpID0+IHRydWUpO1xuXG4vKiogV2hldGhlciB0aGUgYmFja2VuZCBuZWVkcyB0byB3cmFwIGlucHV0IHRvIGltYWdlQml0bWFwLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV1JBUF9UT19JTUFHRUJJVE1BUCcsICgpID0+IGZhbHNlKTtcblxuLyoqIEV4cGVyaW1lbnRhbCBmbGFnLCB3aGV0aGVyIGVudGVyIGNvbXBpbGUgb25seSBwaGFzZS4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ0VOR0lORV9DT01QSUxFX09OTFknLCAoKSA9PiBmYWxzZSk7XG5cbi8qKiBXaGV0aGVyIHRvIGVuYWJsZSBjYW52YXMyZCB3aWxsUmVhZEZyZXF1ZW50bHkgZm9yIEdQVSBiYWNrZW5kcyAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnQ0FOVkFTMkRfV0lMTF9SRUFEX0ZSRVFVRU5UTFlfRk9SX0dQVScsICgpID0+IGZhbHNlKTtcblxuLyoqIFdoZXRoZXIgdG8gdXNlIHNldFRpbWVvdXRDdXN0b20gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1VTRV9TRVRUSU1FT1VUQ1VTVE9NJywgKCkgPT4gZmFsc2UpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from './engine';\nimport { env } from './environment';\nimport { Tensor } from './tensor';\nimport { assert, flatten, inferDtype, isTypedArray, toTypedArray } from './util';\nexport function inferShape(val, dtype) {\n    let firstElem = val;\n    if (isTypedArray(val)) {\n        return dtype === 'string' ? [] : [val.length];\n    }\n    if (!Array.isArray(val)) {\n        return []; // Scalar.\n    }\n    const shape = [];\n    while (Array.isArray(firstElem) ||\n        isTypedArray(firstElem) && dtype !== 'string') {\n        shape.push(firstElem.length);\n        firstElem = firstElem[0];\n    }\n    if (Array.isArray(val) &&\n        env().getBool('TENSORLIKE_CHECK_SHAPE_CONSISTENCY')) {\n        deepAssertShapeConsistency(val, shape, []);\n    }\n    return shape;\n}\nfunction deepAssertShapeConsistency(val, shape, indices) {\n    indices = indices || [];\n    if (!(Array.isArray(val)) && !isTypedArray(val)) {\n        assert(shape.length === 0, () => `Element arr[${indices.join('][')}] is a primitive, ` +\n            `but should be an array/TypedArray of ${shape[0]} elements`);\n        return;\n    }\n    assert(shape.length > 0, () => `Element arr[${indices.join('][')}] should be a primitive, ` +\n        `but is an array of ${val.length} elements`);\n    assert(val.length === shape[0], () => `Element arr[${indices.join('][')}] should have ${shape[0]} ` +\n        `elements, but has ${val.length} elements`);\n    const subShape = shape.slice(1);\n    for (let i = 0; i < val.length; ++i) {\n        deepAssertShapeConsistency(val[i], subShape, indices.concat(i));\n    }\n}\nfunction assertDtype(expectedDtype, actualDType, argName, functionName) {\n    if (expectedDtype === 'string_or_numeric') {\n        return;\n    }\n    if (expectedDtype == null) {\n        throw new Error(`Expected dtype cannot be null.`);\n    }\n    if (expectedDtype !== 'numeric' && expectedDtype !== actualDType ||\n        expectedDtype === 'numeric' && actualDType === 'string') {\n        throw new Error(`Argument '${argName}' passed to '${functionName}' must ` +\n            `be ${expectedDtype} tensor, but got ${actualDType} tensor`);\n    }\n}\nexport function convertToTensor(x, argName, functionName, parseAsDtype = 'numeric') {\n    if (x instanceof Tensor) {\n        assertDtype(parseAsDtype, x.dtype, argName, functionName);\n        return x;\n    }\n    let inferredDtype = inferDtype(x);\n    // If the user expects a bool/int/float, use that info to update the\n    // inferredDtype when it is not a string.\n    if (inferredDtype !== 'string' &&\n        ['bool', 'int32', 'float32'].indexOf(parseAsDtype) >= 0) {\n        inferredDtype = parseAsDtype;\n    }\n    assertDtype(parseAsDtype, inferredDtype, argName, functionName);\n    if ((x == null) ||\n        (!isTypedArray(x) && !Array.isArray(x) && typeof x !== 'number' &&\n            typeof x !== 'boolean' && typeof x !== 'string')) {\n        const type = x == null ? 'null' : x.constructor.name;\n        throw new Error(`Argument '${argName}' passed to '${functionName}' must be a ` +\n            `Tensor or TensorLike, but got '${type}'`);\n    }\n    const inferredShape = inferShape(x, inferredDtype);\n    if (!isTypedArray(x) && !Array.isArray(x)) {\n        x = [x];\n    }\n    const skipTypedArray = true;\n    const values = inferredDtype !== 'string' ?\n        toTypedArray(x, inferredDtype) :\n        flatten(x, [], skipTypedArray);\n    return ENGINE.makeTensor(values, inferredShape, inferredDtype);\n}\nexport function convertToTensorArray(arg, argName, functionName, parseAsDtype = 'numeric') {\n    if (!Array.isArray(arg)) {\n        throw new Error(`Argument ${argName} passed to ${functionName} must be a ` +\n            '`Tensor[]` or `TensorLike[]`');\n    }\n    const tensors = arg;\n    return tensors.map((t, i) => convertToTensor(t, `${argName}[${i}]`, functionName, parseAsDtype));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX3V0aWxfZW52LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy90ZW5zb3JfdXRpbF9lbnYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFaEMsT0FBTyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFL0UsTUFBTSxVQUFVLFVBQVUsQ0FBQyxHQUFlLEVBQUUsS0FBZ0I7SUFDMUQsSUFBSSxTQUFTLEdBQWUsR0FBRyxDQUFDO0lBRWhDLElBQUksWUFBWSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMvQztJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sRUFBRSxDQUFDLENBQUUsVUFBVTtLQUN2QjtJQUNELE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUUzQixPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQ3hCLFlBQVksQ0FBQyxTQUFTLENBQUMsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdCLFNBQVMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDMUI7SUFDRCxJQUFJLEtBQUssQ0FB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QUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBTSxDQUFDO0FBQ3RFLENBQUM7QUFFRCxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLEdBQXdCLEVBQUUsT0FBZSxFQUFFLFlBQW9CLEVBQy9ELGVBQXVELFNBQVM7SUFDbEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZLE9BQU8sY0FBYyxZQUFZLGFBQWE7WUFDMUQsOEJBQThCLENBQUMsQ0FBQztLQUNyQztJQUNELE1BQU0sT0FBTyxHQUFHLEdBQVUsQ0FBQztJQUMzQixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQ2QsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDTCxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO0FBQzlFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuL2VuZ2luZSc7XG5pbXBvcnQge2Vudn0gZnJvbSAnLi9lbnZpcm9ubWVudCc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgVGVuc29yTGlrZX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydCwgZmxhdHRlbiwgaW5mZXJEdHlwZSwgaXNUeXBlZEFycmF5LCB0b1R5cGVkQXJyYXl9IGZyb20gJy4vdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbmZlclNoYXBlKHZhbDogVGVuc29yTGlrZSwgZHR5cGU/OiBEYXRhVHlwZSk6IG51bWJlcltdIHtcbiAgbGV0IGZpcnN0RWxlbTogdHlwZW9mIHZhbCA9IHZhbDtcblxuICBpZiAoaXNUeXBlZEFycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gZHR5cGUgPT09ICdzdHJpbmcnID8gW10gOiBbdmFsLmxlbmd0aF07XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHZhbCkpIHtcbiAgICByZXR1cm4gW107ICAvLyBTY2FsYXIuXG4gIH1cbiAgY29uc3Qgc2hhcGU6IG51bWJlcltdID0gW107XG5cbiAgd2hpbGUgKEFycmF5LmlzQXJyYXkoZmlyc3RFbGVtKSB8fFxuICAgICAgICAgaXNUeXBlZEFycmF5KGZpcnN0RWxlbSkgJiYgZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgc2hhcGUucHVzaChmaXJzdEVsZW0ubGVuZ3RoKTtcbiAgICBmaXJzdEVsZW0gPSBmaXJzdEVsZW1bMF07XG4gIH1cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsKSAmJlxuICAgICAgZW52KCkuZ2V0Qm9vbCgnVEVOU09STElLRV9DSEVDS19TSEFQRV9DT05TSVNURU5DWScpKSB7XG4gICAgZGVlcEFzc2VydFNoYXBlQ29uc2lzdGVuY3kodmFsLCBzaGFwZSwgW10pO1xuICB9XG5cbiAgcmV0dXJuIHNoYXBlO1xufVxuXG5mdW5jdGlvbiBkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeShcbiAgICB2YWw6IFRlbnNvckxpa2UsIHNoYXBlOiBudW1iZXJbXSwgaW5kaWNlczogbnVtYmVyW10pIHtcbiAgaW5kaWNlcyA9IGluZGljZXMgfHwgW107XG4gIGlmICghKEFycmF5LmlzQXJyYXkodmFsKSkgJiYgIWlzVHlwZWRBcnJheSh2YWwpKSB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBzaGFwZS5sZW5ndGggPT09IDAsXG4gICAgICAgICgpID0+IGBFbGVtZW50IGFyclske2luZGljZXMuam9pbignXVsnKX1dIGlzIGEgcHJpbWl0aXZlLCBgICtcbiAgICAgICAgICAgIGBidXQgc2hvdWxkIGJlIGFuIGFycmF5L1R5cGVkQXJyYXkgb2YgJHtzaGFwZVswXX0gZWxlbWVudHNgKTtcbiAgICByZXR1cm47XG4gIH1cbiAgYXNzZXJ0KFxuICAgICAgc2hhcGUubGVuZ3RoID4gMCxcbiAgICAgICgpID0+IGBFbGVtZW50IGFyclske2luZGljZXMuam9pbignXVsnKX1dIHNob3VsZCBiZSBhIHByaW1pdGl2ZSwgYCArXG4gICAgICAgICAgYGJ1dCBpcyBhbiBhcnJheSBvZiAke3ZhbC5sZW5ndGh9IGVsZW1lbnRzYCk7XG4gIGFzc2VydChcbiAgICAgIHZhbC5sZW5ndGggPT09IHNoYXBlWzBdLFxuICAgICAgKCkgPT4gYEVsZW1lbnQgYXJyWyR7aW5kaWNlcy5qb2luKCddWycpfV0gc2hvdWxkIGhhdmUgJHtzaGFwZVswXX0gYCArXG4gICAgICAgICAgYGVsZW1lbnRzLCBidXQgaGFzICR7dmFsLmxlbmd0aH0gZWxlbWVudHNgKTtcbiAgY29uc3Qgc3ViU2hhcGUgPSBzaGFwZS5zbGljZSgxKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWwubGVuZ3RoOyArK2kpIHtcbiAgICBkZWVwQXNzZXJ0U2hhcGVDb25zaXN0ZW5jeSh2YWxbaV0sIHN1YlNoYXBlLCBpbmRpY2VzLmNvbmNhdChpKSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0RHR5cGUoXG4gICAgZXhwZWN0ZWREdHlwZTogRGF0YVR5cGV8J251bWVyaWMnfCdzdHJpbmdfb3JfbnVtZXJpYycsXG4gICAgYWN0dWFsRFR5cGU6IERhdGFUeXBlLCBhcmdOYW1lOiBzdHJpbmcsIGZ1bmN0aW9uTmFtZTogc3RyaW5nKSB7XG4gIGlmIChleHBlY3RlZER0eXBlID09PSAnc3RyaW5nX29yX251bWVyaWMnKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChleHBlY3RlZER0eXBlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGR0eXBlIGNhbm5vdCBiZSBudWxsLmApO1xuICB9XG4gIGlmIChleHBlY3RlZER0eXBlICE9PSAnbnVtZXJpYycgJiYgZXhwZWN0ZWREdHlwZSAhPT0gYWN0dWFsRFR5cGUgfHxcbiAgICAgIGV4cGVjdGVkRHR5cGUgPT09ICdudW1lcmljJyAmJiBhY3R1YWxEVHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcmd1bWVudCAnJHthcmdOYW1lfScgcGFzc2VkIHRvICcke2Z1bmN0aW9uTmFtZX0nIG11c3QgYCArXG4gICAgICAgIGBiZSAke2V4cGVjdGVkRHR5cGV9IHRlbnNvciwgYnV0IGdvdCAke2FjdHVhbERUeXBlfSB0ZW5zb3JgKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFRvVGVuc29yPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgYXJnTmFtZTogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwYXJzZUFzRHR5cGU6IERhdGFUeXBlfCdudW1lcmljJ3wnc3RyaW5nX29yX251bWVyaWMnID0gJ251bWVyaWMnKTogVCB7XG4gIGlmICh4IGluc3RhbmNlb2YgVGVuc29yKSB7XG4gICAgYXNzZXJ0RHR5cGUocGFyc2VBc0R0eXBlLCB4LmR0eXBlLCBhcmdOYW1lLCBmdW5jdGlvbk5hbWUpO1xuICAgIHJldHVybiB4O1xuICB9XG4gIGxldCBpbmZlcnJlZER0eXBlID0gaW5mZXJEdHlwZSh4KTtcbiAgLy8gSWYgdGhlIHVzZXIgZXhwZWN0cyBhIGJvb2wvaW50L2Zsb2F0LCB1c2UgdGhhdCBpbmZvIHRvIHVwZGF0ZSB0aGVcbiAgLy8gaW5mZXJyZWREdHlwZSB3aGVuIGl0IGlzIG5vdCBhIHN0cmluZy5cbiAgaWYgKGluZmVycmVkRHR5cGUgIT09ICdzdHJpbmcnICYmXG4gICAgICBbJ2Jvb2wnLCAnaW50MzInLCAnZmxvYXQzMiddLmluZGV4T2YocGFyc2VBc0R0eXBlKSA+PSAwKSB7XG4gICAgaW5mZXJyZWREdHlwZSA9IHBhcnNlQXNEdHlwZSBhcyBEYXRhVHlwZTtcbiAgfVxuICBhc3NlcnREdHlwZShwYXJzZUFzRHR5cGUsIGluZmVycmVkRHR5cGUsIGFyZ05hbWUsIGZ1bmN0aW9uTmFtZSk7XG5cbiAgaWYgKCh4ID09IG51bGwpIHx8XG4gICAgICAoIWlzVHlwZWRBcnJheSh4KSAmJiAhQXJyYXkuaXNBcnJheSh4KSAmJiB0eXBlb2YgeCAhPT0gJ251bWJlcicgJiZcbiAgICAgICB0eXBlb2YgeCAhPT0gJ2Jvb2xlYW4nICYmIHR5cGVvZiB4ICE9PSAnc3RyaW5nJykpIHtcbiAgICBjb25zdCB0eXBlID0geCA9PSBudWxsID8gJ251bGwnIDogKHggYXMge30pLmNvbnN0cnVjdG9yLm5hbWU7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXJndW1lbnQgJyR7YXJnTmFtZX0nIHBhc3NlZCB0byAnJHtmdW5jdGlvbk5hbWV9JyBtdXN0IGJlIGEgYCArXG4gICAgICAgIGBUZW5zb3Igb3IgVGVuc29yTGlrZSwgYnV0IGdvdCAnJHt0eXBlfSdgKTtcbiAgfVxuICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh4LCBpbmZlcnJlZER0eXBlKTtcbiAgaWYgKCFpc1R5cGVkQXJyYXkoeCkgJiYgIUFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICB4ID0gW3hdIGFzIG51bWJlcltdO1xuICB9XG4gIGNvbnN0IHNraXBUeXBlZEFycmF5ID0gdHJ1ZTtcbiAgY29uc3QgdmFsdWVzID0gaW5mZXJyZWREdHlwZSAhPT0gJ3N0cmluZycgP1xuICAgICAgdG9UeXBlZEFycmF5KHgsIGluZmVycmVkRHR5cGUgYXMgRGF0YVR5cGUpIDpcbiAgICAgIGZsYXR0ZW4oeCBhcyBzdHJpbmdbXSwgW10sIHNraXBUeXBlZEFycmF5KSBhcyBzdHJpbmdbXTtcbiAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgaW5mZXJyZWRTaGFwZSwgaW5mZXJyZWREdHlwZSkgYXMgVDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnZlcnRUb1RlbnNvckFycmF5PFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGFyZzogQXJyYXk8VHxUZW5zb3JMaWtlPiwgYXJnTmFtZTogc3RyaW5nLCBmdW5jdGlvbk5hbWU6IHN0cmluZyxcbiAgICBwYXJzZUFzRHR5cGU6IERhdGFUeXBlfCdudW1lcmljJ3wnc3RyaW5nX29yX251bWVyaWMnID0gJ251bWVyaWMnKTogVFtdIHtcbiAgaWYgKCFBcnJheS5pc0FycmF5KGFyZykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBBcmd1bWVudCAke2FyZ05hbWV9IHBhc3NlZCB0byAke2Z1bmN0aW9uTmFtZX0gbXVzdCBiZSBhIGAgK1xuICAgICAgICAnYFRlbnNvcltdYCBvciBgVGVuc29yTGlrZVtdYCcpO1xuICB9XG4gIGNvbnN0IHRlbnNvcnMgPSBhcmcgYXMgVFtdO1xuICByZXR1cm4gdGVuc29ycy5tYXAoXG4gICAgICAodCwgaSkgPT5cbiAgICAgICAgICBjb252ZXJ0VG9UZW5zb3IodCwgYCR7YXJnTmFtZX1bJHtpfV1gLCBmdW5jdGlvbk5hbWUsIHBhcnNlQXNEdHlwZSkpO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { isPromise } from '../util';\nexport const OP_SCOPE_SUFFIX = '__op';\n/**\n * Used for wrapping functions that perform math operations on\n * Tensors. The function will be wrapped in a named scope that cleans all\n * memory usage after the function is done.\n */\nexport function op(f) {\n    const keys = Object.keys(f);\n    if (keys.length !== 1) {\n        throw new Error(`Please provide an object with a single key ` +\n            `(operation name) mapping to a function. Got an object with ` +\n            `${keys.length} keys.`);\n    }\n    let opName = keys[0];\n    const fn = f[opName];\n    // Strip the underscore from the end of the function name.\n    if (opName.endsWith('_')) {\n        opName = opName.substring(0, opName.length - 1);\n    }\n    // add an __op suffix to distinguish ops from kernels in tf.profile\n    opName = opName + OP_SCOPE_SUFFIX;\n    // tslint:disable-next-line:no-any\n    const f2 = (...args) => {\n        ENGINE.startScope(opName);\n        try {\n            const result = fn(...args);\n            if (isPromise(result)) {\n                console.error('Cannot return a Promise inside of tidy.');\n            }\n            ENGINE.endScope(result);\n            return result;\n        }\n        catch (ex) {\n            ENGINE.endScope(null);\n            throw ex;\n        }\n    };\n    Object.defineProperty(f2, 'name', { value: opName, configurable: true });\n    // tslint:disable-next-line:no-any\n    return f2;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvb3BlcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVsQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxDQUFDO0FBRXRDOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsRUFBRSxDQUFxQixDQUFzQjtJQUMzRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FDWCw2Q0FBNkM7WUFDN0MsNkRBQTZEO1lBQzdELEdBQUcsSUFBSSxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUM7S0FDN0I7SUFFRCxJQUFJLE1BQU0sR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsTUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXJCLDBEQUEwRDtJQUMxRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDakQ7SUFFRCxtRUFBbUU7SUFDbkUsTUFBTSxHQUFHLE1BQU0sR0FBRyxlQUFlLENBQUM7SUFFbEMsa0NBQWtDO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxJQUFXLEVBQUUsRUFBRTtRQUM1QixNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLElBQUk7WUFDRixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUMzQixJQUFJLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRTtnQkFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDO2FBQzFEO1lBQ0QsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN4QixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQUMsT0FBTyxFQUFFLEVBQUU7WUFDWCxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sRUFBRSxDQUFDO1NBQ1Y7SUFDSCxDQUFDLENBQUM7SUFDRixNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0lBRXZFLGtDQUFrQztJQUNsQyxPQUFPLEVBQWMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2lzUHJvbWlzZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBPUF9TQ09QRV9TVUZGSVggPSAnX19vcCc7XG5cbi8qKlxuICogVXNlZCBmb3Igd3JhcHBpbmcgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBtYXRoIG9wZXJhdGlvbnMgb25cbiAqIFRlbnNvcnMuIFRoZSBmdW5jdGlvbiB3aWxsIGJlIHdyYXBwZWQgaW4gYSBuYW1lZCBzY29wZSB0aGF0IGNsZWFucyBhbGxcbiAqIG1lbW9yeSB1c2FnZSBhZnRlciB0aGUgZnVuY3Rpb24gaXMgZG9uZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9wPFQgZXh0ZW5kcyBGdW5jdGlvbj4oZjoge1tuYW1lOiBzdHJpbmddOiBUfSk6IFQge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZik7XG4gIGlmIChrZXlzLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFBsZWFzZSBwcm92aWRlIGFuIG9iamVjdCB3aXRoIGEgc2luZ2xlIGtleSBgICtcbiAgICAgICAgYChvcGVyYXRpb24gbmFtZSkgbWFwcGluZyB0byBhIGZ1bmN0aW9uLiBHb3QgYW4gb2JqZWN0IHdpdGggYCArXG4gICAgICAgIGAke2tleXMubGVuZ3RofSBrZXlzLmApO1xuICB9XG5cbiAgbGV0IG9wTmFtZSA9IGtleXNbMF07XG4gIGNvbnN0IGZuID0gZltvcE5hbWVdO1xuXG4gIC8vIFN0cmlwIHRoZSB1bmRlcnNjb3JlIGZyb20gdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gbmFtZS5cbiAgaWYgKG9wTmFtZS5lbmRzV2l0aCgnXycpKSB7XG4gICAgb3BOYW1lID0gb3BOYW1lLnN1YnN0cmluZygwLCBvcE5hbWUubGVuZ3RoIC0gMSk7XG4gIH1cblxuICAvLyBhZGQgYW4gX19vcCBzdWZmaXggdG8gZGlzdGluZ3Vpc2ggb3BzIGZyb20ga2VybmVscyBpbiB0Zi5wcm9maWxlXG4gIG9wTmFtZSA9IG9wTmFtZSArIE9QX1NDT1BFX1NVRkZJWDtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGNvbnN0IGYyID0gKC4uLmFyZ3M6IGFueVtdKSA9PiB7XG4gICAgRU5HSU5FLnN0YXJ0U2NvcGUob3BOYW1lKTtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcmVzdWx0ID0gZm4oLi4uYXJncyk7XG4gICAgICBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignQ2Fubm90IHJldHVybiBhIFByb21pc2UgaW5zaWRlIG9mIHRpZHkuJyk7XG4gICAgICB9XG4gICAgICBFTkdJTkUuZW5kU2NvcGUocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIEVOR0lORS5lbmRTY29wZShudWxsKTtcbiAgICAgIHRocm93IGV4O1xuICAgIH1cbiAgfTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGYyLCAnbmFtZScsIHt2YWx1ZTogb3BOYW1lLCBjb25maWd1cmFibGU6IHRydWV9KTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHJldHVybiBmMiBhcyBhbnkgYXMgVDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Complex } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Converts two real numbers to a complex number.\n *\n * Given a tensor `real` representing the real part of a complex number, and a\n * tensor `imag` representing the imaginary part of a complex number, this\n * operation returns complex numbers elementwise of the form [r0, i0, r1, i1],\n * where r represents the real part and i represents the imag part.\n *\n * The input tensors real and imag must have the same shape.\n *\n * ```js\n * const real = tf.tensor1d([2.25, 3.25]);\n * const imag = tf.tensor1d([4.75, 5.75]);\n * const complex = tf.complex(real, imag);\n *\n * complex.print();\n * ```\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction complex_(real, imag) {\n    const $real = convertToTensor(real, 'real', 'complex');\n    const $imag = convertToTensor(imag, 'imag', 'complex');\n    util.assertShapesMatch($real.shape, $imag.shape, `real and imag shapes, ${$real.shape} and ${$imag.shape}, ` +\n        `must match in call to tf.complex().`);\n    const inputs = { real: $real, imag: $imag };\n    return ENGINE.runKernel(Complex, inputs);\n}\nexport const complex = op({ complex_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbXBsZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxRQUFRLENBQW1CLElBQWtCLEVBQUUsSUFBa0I7SUFDeEUsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLGlCQUFpQixDQUNsQixLQUFLLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQ3hCLHlCQUF5QixLQUFLLENBQUMsS0FBSyxRQUFRLEtBQUssQ0FBQyxLQUFLLElBQUk7UUFDdkQscUNBQXFDLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBa0IsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUN6RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Q29tcGxleCwgQ29tcGxleElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29udmVydHMgdHdvIHJlYWwgbnVtYmVycyB0byBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGByZWFsYCByZXByZXNlbnRpbmcgdGhlIHJlYWwgcGFydCBvZiBhIGNvbXBsZXggbnVtYmVyLCBhbmQgYVxuICogdGVuc29yIGBpbWFnYCByZXByZXNlbnRpbmcgdGhlIGltYWdpbmFyeSBwYXJ0IG9mIGEgY29tcGxleCBudW1iZXIsIHRoaXNcbiAqIG9wZXJhdGlvbiByZXR1cm5zIGNvbXBsZXggbnVtYmVycyBlbGVtZW50d2lzZSBvZiB0aGUgZm9ybSBbcjAsIGkwLCByMSwgaTFdLFxuICogd2hlcmUgciByZXByZXNlbnRzIHRoZSByZWFsIHBhcnQgYW5kIGkgcmVwcmVzZW50cyB0aGUgaW1hZyBwYXJ0LlxuICpcbiAqIFRoZSBpbnB1dCB0ZW5zb3JzIHJlYWwgYW5kIGltYWcgbXVzdCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzIuMjUsIDMuMjVdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbNC43NSwgNS43NV0pO1xuICogY29uc3QgY29tcGxleCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogY29tcGxleC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBjb21wbGV4XzxUIGV4dGVuZHMgVGVuc29yPihyZWFsOiBUfFRlbnNvckxpa2UsIGltYWc6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkcmVhbCA9IGNvbnZlcnRUb1RlbnNvcihyZWFsLCAncmVhbCcsICdjb21wbGV4Jyk7XG4gIGNvbnN0ICRpbWFnID0gY29udmVydFRvVGVuc29yKGltYWcsICdpbWFnJywgJ2NvbXBsZXgnKTtcbiAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICRyZWFsLnNoYXBlLCAkaW1hZy5zaGFwZSxcbiAgICAgIGByZWFsIGFuZCBpbWFnIHNoYXBlcywgJHskcmVhbC5zaGFwZX0gYW5kICR7JGltYWcuc2hhcGV9LCBgICtcbiAgICAgICAgICBgbXVzdCBtYXRjaCBpbiBjYWxsIHRvIHRmLmNvbXBsZXgoKS5gKTtcblxuICBjb25zdCBpbnB1dHM6IENvbXBsZXhJbnB1dHMgPSB7cmVhbDogJHJlYWwsIGltYWc6ICRpbWFnfTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ29tcGxleCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBsZXggPSBvcCh7Y29tcGxleF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { assert, assertNonNegativeIntegerDimensions, flatten, inferDtype, isTypedArray, sizeFromShape, toTypedArray } from '../util';\n/** This is shared code across all tensor creation methods. */\nexport function makeTensor(values, shape, inferredShape, dtype) {\n    if (dtype == null) {\n        dtype = inferDtype(values);\n    }\n    if (dtype === 'complex64') {\n        throw new Error(`Cannot construct a complex64 tensor directly. ` +\n            `Please use tf.complex(real, imag).`);\n    }\n    if (!isTypedArray(values) && !Array.isArray(values) &&\n        typeof values !== 'number' && typeof values !== 'boolean' &&\n        typeof values !== 'string') {\n        throw new Error('values passed to tensor(values) must be a number/boolean/string or ' +\n            'an array of numbers/booleans/strings, or a TypedArray');\n    }\n    if (shape != null) {\n        assertNonNegativeIntegerDimensions(shape);\n        const providedSize = sizeFromShape(shape);\n        const inferredSize = sizeFromShape(inferredShape);\n        assert(providedSize === inferredSize, () => `Based on the provided shape, [${shape}], the tensor should have ` +\n            `${providedSize} values but has ${inferredSize}`);\n        for (let i = 0; i < inferredShape.length; ++i) {\n            const inferred = inferredShape[i];\n            const flatDimsDontMatch = i === inferredShape.length - 1 ?\n                inferred !== sizeFromShape(shape.slice(i)) :\n                true;\n            assert(inferredShape[i] === shape[i] || !flatDimsDontMatch, () => `Error creating a new Tensor. Inferred shape ` +\n                `(${inferredShape}) does not match the provided ` +\n                `shape (${shape}). `);\n        }\n    }\n    if (!isTypedArray(values) && !Array.isArray(values)) {\n        values = [values];\n    }\n    shape = shape || inferredShape;\n    values = dtype !== 'string' ?\n        toTypedArray(values, dtype) :\n        flatten(values, [], true);\n    return ENGINE.makeTensor(values, shape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX29wc191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdGVuc29yX29wc191dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFJakMsT0FBTyxFQUFDLE1BQU0sRUFBRSxrQ0FBa0MsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRW5JLDhEQUE4RDtBQUM5RCxNQUFNLFVBQVUsVUFBVSxDQUN0QixNQUFrQixFQUFFLEtBQWUsRUFBRSxhQUF1QixFQUM1RCxLQUFnQjtJQUNsQixJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDakIsS0FBSyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUM1QjtJQUNELElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLGdEQUFnRDtZQUNoRCxvQ0FBb0MsQ0FBQyxDQUFDO0tBQzNDO0lBQ0QsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQy9DLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxTQUFTO1FBQ3pELE9BQU8sTUFBTSxLQUFLLFFBQVEsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUNYLHFFQUFxRTtZQUNyRSx1REFBdUQsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLGtDQUFrQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRTFDLE1BQU0sWUFBWSxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLFlBQVksR0FBRyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDbEQsTUFBTSxDQUNGLFlBQVksS0FBSyxZQUFZLEVBQzdCLEdBQUcsRUFBRSxDQUNELGlDQUFpQyxLQUFLLDRCQUE0QjtZQUNsRSxHQUFHLFlBQVksbUJBQW1CLFlBQVksRUFBRSxDQUFDLENBQUM7UUFFMUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDN0MsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xDLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxLQUFLLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RELFFBQVEsS0FBSyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzVDLElBQUksQ0FBQztZQUNULE1BQU0sQ0FDRixhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQ25ELEdBQUcsRUFBRSxDQUFDLDhDQUE4QztnQkFDaEQsSUFBSSxhQUFhLGdDQUFnQztnQkFDakQsVUFBVSxLQUFLLEtBQUssQ0FBQyxDQUFDO1NBQy9CO0tBQ0Y7SUFFRCxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUNuRCxNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQWEsQ0FBQztLQUMvQjtJQUVELEtBQUssR0FBRyxLQUFLLElBQUksYUFBYSxDQUFDO0lBQy9CLE1BQU0sR0FBRyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUM7UUFDekIsWUFBWSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdCLE9BQU8sQ0FBQyxNQUFrQixFQUFFLEVBQUUsRUFBRSxJQUFJLENBQWEsQ0FBQztJQUN0RCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBb0IsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZSwgVHlwZWRBcnJheX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnQsIGFzc2VydE5vbk5lZ2F0aXZlSW50ZWdlckRpbWVuc2lvbnMsIGZsYXR0ZW4sIGluZmVyRHR5cGUsIGlzVHlwZWRBcnJheSwgc2l6ZUZyb21TaGFwZSwgdG9UeXBlZEFycmF5fSBmcm9tICcuLi91dGlsJztcblxuLyoqIFRoaXMgaXMgc2hhcmVkIGNvZGUgYWNyb3NzIGFsbCB0ZW5zb3IgY3JlYXRpb24gbWV0aG9kcy4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlVGVuc29yKFxuICAgIHZhbHVlczogVGVuc29yTGlrZSwgc2hhcGU6IG51bWJlcltdLCBpbmZlcnJlZFNoYXBlOiBudW1iZXJbXSxcbiAgICBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yIHtcbiAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICBkdHlwZSA9IGluZmVyRHR5cGUodmFsdWVzKTtcbiAgfVxuICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGNvbnN0cnVjdCBhIGNvbXBsZXg2NCB0ZW5zb3IgZGlyZWN0bHkuIGAgK1xuICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICB9XG4gIGlmICghaXNUeXBlZEFycmF5KHZhbHVlcykgJiYgIUFycmF5LmlzQXJyYXkodmFsdWVzKSAmJlxuICAgICAgdHlwZW9mIHZhbHVlcyAhPT0gJ251bWJlcicgJiYgdHlwZW9mIHZhbHVlcyAhPT0gJ2Jvb2xlYW4nICYmXG4gICAgICB0eXBlb2YgdmFsdWVzICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3ZhbHVlcyBwYXNzZWQgdG8gdGVuc29yKHZhbHVlcykgbXVzdCBiZSBhIG51bWJlci9ib29sZWFuL3N0cmluZyBvciAnICtcbiAgICAgICAgJ2FuIGFycmF5IG9mIG51bWJlcnMvYm9vbGVhbnMvc3RyaW5ncywgb3IgYSBUeXBlZEFycmF5Jyk7XG4gIH1cbiAgaWYgKHNoYXBlICE9IG51bGwpIHtcbiAgICBhc3NlcnROb25OZWdhdGl2ZUludGVnZXJEaW1lbnNpb25zKHNoYXBlKTtcblxuICAgIGNvbnN0IHByb3ZpZGVkU2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgIGNvbnN0IGluZmVycmVkU2l6ZSA9IHNpemVGcm9tU2hhcGUoaW5mZXJyZWRTaGFwZSk7XG4gICAgYXNzZXJ0KFxuICAgICAgICBwcm92aWRlZFNpemUgPT09IGluZmVycmVkU2l6ZSxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGBCYXNlZCBvbiB0aGUgcHJvdmlkZWQgc2hhcGUsIFske3NoYXBlfV0sIHRoZSB0ZW5zb3Igc2hvdWxkIGhhdmUgYCArXG4gICAgICAgICAgICBgJHtwcm92aWRlZFNpemV9IHZhbHVlcyBidXQgaGFzICR7aW5mZXJyZWRTaXplfWApO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmZlcnJlZFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBpbmZlcnJlZCA9IGluZmVycmVkU2hhcGVbaV07XG4gICAgICBjb25zdCBmbGF0RGltc0RvbnRNYXRjaCA9IGkgPT09IGluZmVycmVkU2hhcGUubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgaW5mZXJyZWQgIT09IHNpemVGcm9tU2hhcGUoc2hhcGUuc2xpY2UoaSkpIDpcbiAgICAgICAgICB0cnVlO1xuICAgICAgYXNzZXJ0KFxuICAgICAgICAgIGluZmVycmVkU2hhcGVbaV0gPT09IHNoYXBlW2ldIHx8ICFmbGF0RGltc0RvbnRNYXRjaCxcbiAgICAgICAgICAoKSA9PiBgRXJyb3IgY3JlYXRpbmcgYSBuZXcgVGVuc29yLiBJbmZlcnJlZCBzaGFwZSBgICtcbiAgICAgICAgICAgICAgYCgke2luZmVycmVkU2hhcGV9KSBkb2VzIG5vdCBtYXRjaCB0aGUgcHJvdmlkZWQgYCArXG4gICAgICAgICAgICAgIGBzaGFwZSAoJHtzaGFwZX0pLiBgKTtcbiAgICB9XG4gIH1cblxuICBpZiAoIWlzVHlwZWRBcnJheSh2YWx1ZXMpICYmICFBcnJheS5pc0FycmF5KHZhbHVlcykpIHtcbiAgICB2YWx1ZXMgPSBbdmFsdWVzXSBhcyBudW1iZXJbXTtcbiAgfVxuXG4gIHNoYXBlID0gc2hhcGUgfHwgaW5mZXJyZWRTaGFwZTtcbiAgdmFsdWVzID0gZHR5cGUgIT09ICdzdHJpbmcnID9cbiAgICAgIHRvVHlwZWRBcnJheSh2YWx1ZXMsIGR0eXBlKSA6XG4gICAgICBmbGF0dGVuKHZhbHVlcyBhcyBzdHJpbmdbXSwgW10sIHRydWUpIGFzIHN0cmluZ1tdO1xuICByZXR1cm4gRU5HSU5FLm1ha2VUZW5zb3IodmFsdWVzIGFzIFR5cGVkQXJyYXksIHNoYXBlLCBkdHlwZSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates a `tf.Tensor` with the provided values, shape and dtype.\n *\n * ```js\n * // Pass an array of values to create a vector.\n * tf.tensor([1, 2, 3, 4]).print();\n * ```\n *\n * ```js\n * // Pass a nested array of values to make a matrix or a higher\n * // dimensional tensor.\n * tf.tensor([[1, 2], [3, 4]]).print();\n * ```\n *\n * ```js\n * // Pass a flat array and specify a shape yourself.\n * tf.tensor([1, 2, 3, 4], [2, 2]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n *     or a flat array, or a `TypedArray`. If the values are strings,\n *     they will be encoded as utf-8 and kept as `Uint8Array[]`.\n * @param shape The shape of the tensor. Optional. If not provided,\n *   it is inferred from `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor(values, shape, dtype) {\n    const inferredShape = inferShape(values, dtype);\n    return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdGVuc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUk5QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILE1BQU0sVUFBVSxNQUFNLENBQ2xCLE1BQWtCLEVBQUUsS0FBbUIsRUFBRSxLQUFnQjtJQUMzRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBYyxDQUFDO0FBQ3RFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtpbmZlclNoYXBlfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlLCBSYW5rLCBTaGFwZU1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge21ha2VUZW5zb3J9IGZyb20gJy4vdGVuc29yX29wc191dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogYGBganNcbiAqIC8vIFBhc3MgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIGNyZWF0ZSBhIHZlY3Rvci5cbiAqIHRmLnRlbnNvcihbMSwgMiwgMywgNF0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIG5lc3RlZCBhcnJheSBvZiB2YWx1ZXMgdG8gbWFrZSBhIG1hdHJpeCBvciBhIGhpZ2hlclxuICogLy8gZGltZW5zaW9uYWwgdGVuc29yLlxuICogdGYudGVuc29yKFtbMSwgMl0sIFszLCA0XV0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZSB5b3Vyc2VsZi5cbiAqIHRmLnRlbnNvcihbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC4gSWYgdGhlIHZhbHVlcyBhcmUgc3RyaW5ncyxcbiAqICAgICB0aGV5IHdpbGwgYmUgZW5jb2RlZCBhcyB1dGYtOCBhbmQga2VwdCBhcyBgVWludDhBcnJheVtdYC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjxSIGV4dGVuZHMgUmFuaz4oXG4gICAgdmFsdWVzOiBUZW5zb3JMaWtlLCBzaGFwZT86IFNoYXBlTWFwW1JdLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yPFI+IHtcbiAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSBhcyBUZW5zb3I8Uj47XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/* Type definitions for exporting and importing of models. */\n/**\n * A map from Tensor dtype to number of bytes per element of the Tensor.\n */\nexport const DTYPE_VALUE_SIZE_MAP = {\n    'float32': 4,\n    'float16': 2,\n    'int32': 4,\n    'uint16': 2,\n    'uint8': 1,\n    'bool': 1,\n    'complex64': 8\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDZEQUE2RDtBQUU3RDs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUE4QjtJQUM3RCxTQUFTLEVBQUUsQ0FBQztJQUNaLFNBQVMsRUFBRSxDQUFDO0lBQ1osT0FBTyxFQUFFLENBQUM7SUFDVixRQUFRLEVBQUUsQ0FBQztJQUNYLE9BQU8sRUFBRSxDQUFDO0lBQ1YsTUFBTSxFQUFFLENBQUM7SUFDVCxXQUFXLEVBQUUsQ0FBQztDQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIFR5cGUgZGVmaW5pdGlvbnMgZm9yIGV4cG9ydGluZyBhbmQgaW1wb3J0aW5nIG9mIG1vZGVscy4gKi9cblxuLyoqXG4gKiBBIG1hcCBmcm9tIFRlbnNvciBkdHlwZSB0byBudW1iZXIgb2YgYnl0ZXMgcGVyIGVsZW1lbnQgb2YgdGhlIFRlbnNvci5cbiAqL1xuZXhwb3J0IGNvbnN0IERUWVBFX1ZBTFVFX1NJWkVfTUFQOiB7W2R0eXBlOiBzdHJpbmddOiBudW1iZXJ9ID0ge1xuICAnZmxvYXQzMic6IDQsXG4gICdmbG9hdDE2JzogMixcbiAgJ2ludDMyJzogNCxcbiAgJ3VpbnQxNic6IDIsXG4gICd1aW50OCc6IDEsXG4gICdib29sJzogMSxcbiAgJ2NvbXBsZXg2NCc6IDhcbn07XG5cbi8qKlxuICogQSB3ZWlnaHQgbWFuaWZlc3QuXG4gKlxuICogVGhlIHdlaWdodCBtYW5pZmVzdCBjb25zaXN0cyBvZiBhbiBvcmRlcmVkIGxpc3Qgb2Ygd2VpZ2h0LW1hbmlmZXN0IGdyb3Vwcy5cbiAqIEVhY2ggd2VpZ2h0LW1hbmlmZXN0IGdyb3VwIChcImdyb3VwXCIgZm9yIHNob3J0IGhlcmVhZnRlcikgY29uc2lzdHMgb2YgYVxuICogbnVtYmVyIG9mIHdlaWdodCB2YWx1ZXMgc3RvcmVkIGluIGEgbnVtYmVyIG9mIHBhdGhzLlxuICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIGBXZWlnaHRNYW5pZmVzdEdyb3VwQ29uZmlnYCBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgZGVjbGFyZSB0eXBlIFdlaWdodHNNYW5pZmVzdENvbmZpZyA9IFdlaWdodHNNYW5pZmVzdEdyb3VwQ29uZmlnW107XG5cbi8qKlxuICogQSB3ZWlnaHQtbWFuaWZlc3QgZ3JvdXAuXG4gKlxuICogQ29uc2lzdHMgb2YgYW4gb3JkZXJlZCBsaXN0IG9mIHdlaWdodCB2YWx1ZXMgZW5jb2RlZCBpbiBiaW5hcnkgZm9ybWF0LFxuICogc3RvcmVkIGluIGFuIG9yZGVyZWQgbGlzdCBvZiBwYXRocy5cbiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFdlaWdodHNNYW5pZmVzdEdyb3VwQ29uZmlnIHtcbiAgLyoqXG4gICAqIEFuIG9yZGVyZWQgbGlzdCBvZiBwYXRocy5cbiAgICpcbiAgICogUGF0aHMgYXJlIGludGVudGlvbmFsbHkgYWJzdHJhY3QgaW4gb3JkZXIgdG8gYmUgZ2VuZXJhbC4gRm9yIGV4YW1wbGUsIHRoZXlcbiAgICogY2FuIGJlIHJlbGF0aXZlIFVSTCBwYXRocyBvciByZWxhdGl2ZSBwYXRocyBvbiB0aGUgZmlsZSBzeXN0ZW0uXG4gICAqL1xuICBwYXRoczogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIFNwZWNpZmljYXRpb25zIG9mIHRoZSB3ZWlnaHRzIHN0b3JlZCBpbiB0aGUgcGF0aHMuXG4gICAqL1xuICB3ZWlnaHRzOiBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdO1xufVxuXG4vKipcbiAqIEdyb3VwIHRvIHdoaWNoIHRoZSB3ZWlnaHQgYmVsb25ncy5cbiAqXG4gKiAtICdvcHRpbWl6ZXInOiBXZWlnaHQgZnJvbSBhIHN0YXRlZnVsIG9wdGltaXplci5cbiAqL1xuZXhwb3J0IHR5cGUgV2VpZ2h0R3JvdXAgPSAnbW9kZWwnfCdvcHRpbWl6ZXInO1xuXG4vKipcbiAqIEFuIGVudHJ5IGluIHRoZSB3ZWlnaHQgbWFuaWZlc3QuXG4gKlxuICogVGhlIGVudHJ5IGNvbnRhaW5zIHNwZWNpZmljYXRpb24gb2YgYSB3ZWlnaHQuXG4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBXZWlnaHRzTWFuaWZlc3RFbnRyeSB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSB3ZWlnaHQsIGUuZy4sICdEZW5zZV8xL2JpYXMnXG4gICAqL1xuICBuYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFNoYXBlIG9mIHRoZSB3ZWlnaHQuXG4gICAqL1xuICBzaGFwZTogbnVtYmVyW107XG5cbiAgLyoqXG4gICAqIERhdGEgdHlwZSBvZiB0aGUgd2VpZ2h0LlxuICAgKi9cbiAgZHR5cGU6ICdmbG9hdDMyJ3wnaW50MzInfCdib29sJ3wnc3RyaW5nJ3wnY29tcGxleDY0JztcblxuICAvKipcbiAgICogVHlwZSBvZiB0aGUgd2VpZ2h0LlxuICAgKlxuICAgKiBPcHRpb25hbC5cbiAgICpcbiAgICogVGhlIHZhbHVlICdvcHRpbWl6ZXInIGluZGljYXRlcyB0aGUgd2VpZ2h0IGJlbG9uZ3MgdG8gYW4gb3B0aW1pemVyXG4gICAqIChpLmUuLCB1c2VkIG9ubHkgZHVyaW5nIG1vZGVsIHRyYWluaW5nIGFuZCBub3QgZHVyaW5nIGluZmVyZW5jZSkuXG4gICAqL1xuICBncm91cD86IFdlaWdodEdyb3VwO1xuXG4gIC8qKlxuICAgKiBJbmZvcm1hdGlvbiBmb3IgZGVxdWFudGl6YXRpb24gb2YgdGhlIHdlaWdodC5cbiAgICovXG4gIHF1YW50aXphdGlvbj86IHtcbiAgICBzY2FsZT86IG51bWJlciwgIC8vIFRoZSBzY2FsaW5nIGNvbnN0YW50IHRvIG11bHRpcGx5IGJ5LlxuICAgIG1pbj86IG51bWJlciwgICAgLy8gVGhlIChwb3NzaWJseSBudWRnZWQpIG1pbmltdW0gd2VpZ2h0IHRvIGFkZC5cbiAgICAgICBkdHlwZTogJ3VpbnQxNid8J3VpbnQ4J3wnZmxvYXQxNicgIC8vIFRoZSBkdHlwZSBvZiB0aGUgcXVhbnRpemVkIHdlaWdodHMuXG4gIH07XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3Igc2F2aW5nIGEgbW9kZWwuXG4gKiBAaW5uYW1lc3BhY2UgaW9cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTYXZlQ29uZmlnIHtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2F2ZSBvbmx5IHRoZSB0cmFpbmFibGUgd2VpZ2h0cyBvZiB0aGUgbW9kZWwsIGlnbm9yaW5nIHRoZVxuICAgKiBub24tdHJhaW5hYmxlIG9uZXMuXG4gICAqL1xuICB0cmFpbmFibGVPbmx5PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgb3B0aW1pemVyIHdpbGwgYmUgc2F2ZWQgKGlmIGV4aXN0cykuXG4gICAqXG4gICAqIERlZmF1bHQ6IGBmYWxzZWAuXG4gICAqL1xuICBpbmNsdWRlT3B0aW1pemVyPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBSZXN1bHQgb2YgYSBzYXZpbmcgb3BlcmF0aW9uLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNhdmVSZXN1bHQge1xuICAvKipcbiAgICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGVsIGFydGlmYWN0cyBzYXZlZC5cbiAgICovXG4gIG1vZGVsQXJ0aWZhY3RzSW5mbzogTW9kZWxBcnRpZmFjdHNJbmZvO1xuXG4gIC8qKlxuICAgKiBIVFRQIHJlc3BvbnNlcyBmcm9tIHRoZSBzZXJ2ZXIgdGhhdCBoYW5kbGVkIHRoZSBtb2RlbC1zYXZpbmcgcmVxdWVzdCAoaWZcbiAgICogYW55KS4gVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgdG8gc2VydmVyLWJhc2VkIHNhdmluZyByb3V0ZXMuXG4gICAqL1xuICByZXNwb25zZXM/OiBSZXNwb25zZVtdO1xuXG4gIC8qKlxuICAgKiBFcnJvciBtZXNzYWdlcyBhbmQgcmVsYXRlZCBkYXRhIChpZiBhbnkpLlxuICAgKi9cbiAgZXJyb3JzPzogQXJyYXk8e318c3RyaW5nPjtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE1vZGVsQXJ0aWZhY3RzSW5mbyB7XG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgZm9yIHdoZW4gdGhlIG1vZGVsIGlzIHNhdmVkLlxuICAgKi9cbiAgZGF0ZVNhdmVkOiBEYXRlO1xuXG4gIC8qKlxuICAgKiBUT0RPIChjYWlzLHlhc3NvZ2JhKSBjb25zaWRlciByZW1vdmluZyBHcmFwaERlZiBhcyBHcmFwaERlZnMgbm93XG4gICAqIGNvbWUgaW4gYSBKU09OIGZvcm1hdCBhbmQgbm9uZSBvZiBvdXIgSU9IYW5kbGVycyBzdXBwb3J0IGEgbm9uIGpzb25cbiAgICogZm9ybWF0LiBXZSBjb3VsZCBjb25kZXIgcmVwbGFjaW5nIHRoaXMgd2l0aCAnQmluYXJ5JyBpZiB3ZSB3YW50IHRvXG4gICAqIGFsbG93IGZ1dHVyZSBoYW5kbGVycyB0byBzYXZlIHRvIG5vbiBqc29uIGZvcm1hdHMgKHRob3VnaCB0aGV5IHdpbGxcbiAgICogcHJvYmFibHkgd2FudCBtb3JlIGluZm9ybWF0aW9uIHRoYW4gJ0JpbmFyeScpLlxuICAgKiBUeXBlIG9mIHRoZSBtb2RlbCB0b3BvbG9neVxuICAgKlxuICAgKiBUeXBlIG9mIHRoZSBtb2RlbCB0b3BvbG9neVxuICAgKlxuICAgKiBQb3NzaWJsZSB2YWx1ZXM6XG4gICAqICAgLSBKU09OOiBKU09OIGNvbmZpZyAoaHVtYW4tcmVhZGFibGUsIGUuZy4sIEtlcmFzIEpTT04pLlxuICAgKiAgIC0gR3JhcGhEZWY6IFRlbnNvckZsb3dcbiAgICogICAgIFtHcmFwaERlZl0oaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZXh0ZW5kL3Rvb2xfZGV2ZWxvcGVycy8jZ3JhcGhkZWYpXG4gICAqICAgICBwcm90b2NvbCBidWZmZXIgKGJpbmFyeSkuXG4gICAqL1xuICBtb2RlbFRvcG9sb2d5VHlwZTogJ0pTT04nfCdHcmFwaERlZic7XG5cbiAgLyoqXG4gICAqIFNpemUgb2YgbW9kZWwgdG9wb2xvZ3kgKEtlcmFzIEpTT04gb3IgR3JhcGhEZWYpLCBpbiBieXRlcy5cbiAgICovXG4gIG1vZGVsVG9wb2xvZ3lCeXRlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogU2l6ZSBvZiB3ZWlnaHQgc3BlY2lmaWNhdGlvbiBvciBtYW5pZmVzdCwgaW4gYnl0ZXMuXG4gICAqL1xuICB3ZWlnaHRTcGVjc0J5dGVzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBTaXplIG9mIHdlaWdodCB2YWx1ZSBkYXRhLCBpbiBieXRlcy5cbiAgICovXG4gIHdlaWdodERhdGFCeXRlcz86IG51bWJlcjtcbn1cblxuLyoqIE1vZGVsIHRyYWluaW5nIGNvbmZpZ3VyYXRpb24uICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVHJhaW5pbmdDb25maWcge1xuICAvLyBUT0RPKGNhaXMpOiBUaWdodGVuIHRoZSB0eXBpbmcgb25jZSBrZXJhcyBzcGVjIGlzIGF2YWlsYWJsZSB0byB0ZmpzLWNvcmUuXG4gIC8vIFNlZVxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMtbGF5ZXJzL2Jsb2IvbWFzdGVyL3NyYy9rZXJhc19mb3JtYXQvdHJhaW5pbmdfY29uZmlnLnRzXG4gIC8qKiBPcHRpbWl6ZXIgdXNlZCBmb3IgdGhlIG1vZGVsIHRyYWluaW5nLiAqL1xuICBvcHRpbWl6ZXJfY29uZmlnOiB7fTtcblxuICAvLyBUT0RPKGNhaXMpOiBUaWdodGVuIHRoZSB0eXBpbmcgb25jZSBrZXJhcyBzcGVjIGlzIGF2YWlsYWJsZSB0byB0ZmpzLWNvcmUuXG4gIC8qKiBMb3NzIGZ1bmN0aW9uKHMpIGZvciB0aGUgbW9kZWwncyBvdXRwdXQocykuICovXG4gIGxvc3M6IHN0cmluZ3xzdHJpbmdbXXx7W2tleTogc3RyaW5nXTogc3RyaW5nfTtcblxuICAvLyBUT0RPKGNhaXMpOiBUaWdodGVuIHRoZSB0eXBpbmcgb25jZSBrZXJhcyBzcGVjIGlzIGF2YWlsYWJsZSB0byB0ZmpzLWNvcmUuXG4gIC8qKiBNZXRyaWMgZnVuY3Rpb24ocykgZm9yIHRoZSBtb2RlbCdzIG91dHB1dChzKS4gKi9cbiAgbWV0cmljcz86IHN0cmluZ1tdfHtba2V5OiBzdHJpbmddOiBzdHJpbmd9O1xuXG4gIC8vIFRPRE8oY2Fpcyk6IFRpZ2h0ZW4gdGhlIHR5cGluZyBvbmNlIGtlcmFzIHNwZWMgaXMgYXZhaWxhYmxlIHRvIHRmanMtY29yZS5cbiAgd2VpZ2h0ZWRfbWV0cmljcz86IHN0cmluZ1tdO1xuXG4gIC8vIFRPRE8oY2Fpcyk6IFRpZ2h0ZW4gdGhlIHR5cGluZyBvbmNlIGtlcmFzIHNwZWMgaXMgYXZhaWxhYmxlIHRvIHRmanMtY29yZS5cbiAgc2FtcGxlX3dlaWdodF9tb2RlPzogc3RyaW5nO1xuXG4gIGxvc3Nfd2VpZ2h0cz86IG51bWJlcltdfHtba2V5OiBzdHJpbmddOiBudW1iZXJ9O1xufVxuXG4vKipcbiAqIFRoZSBzZXJpYWxpemVkIGFydGlmYWN0cyBvZiBhIG1vZGVsLCBpbmNsdWRpbmcgdG9wb2xvZ3kgYW5kIHdlaWdodHMuXG4gKlxuICogVGhlIGBtb2RlbFRvcG9sb2d5YCwgYHRyYWluaW5nQ29uZmlnYCwgYHdlaWdodFNwZWNzYCBhbmQgYHdlaWdodERhdGFgIGZpZWxkc1xuICogb2YgdGhpcyBpbnRlcmZhY2UgYXJlIG9wdGlvbmFsLCBpbiBvcmRlciB0byBzdXBwb3J0IHRvcG9sb2d5LSBvciB3ZWlnaHRzLW9ubHlcbiAqIHNhdmluZyBhbmQgbG9hZGluZy5cbiAqXG4gKiBOb3RlIHRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgaW50ZXJuYWxseSBpbiBJT0hhbmRsZXJzLiAgRm9yIHRoZSBmaWxlIGZvcm1hdFxuICogd3JpdHRlbiB0byBkaXNrIGFzIGBtb2RlbC5qc29uYCwgc2VlIGBNb2RlbEpTT05gLlxuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgTW9kZWxBcnRpZmFjdHMge1xuICAvKipcbiAgICogTW9kZWwgdG9wb2xvZ3kuXG4gICAqXG4gICAqIEZvciBLZXJhcy1zdHlsZSBgdGYuTW9kZWxgcywgdGhpcyBpcyBhIEpTT04gb2JqZWN0LlxuICAgKiBGb3IgVGVuc29yRmxvdy1zdHlsZSBtb2RlbHMgKGUuZy4sIGBTYXZlZE1vZGVsYCksIHRoaXMgaXMgdGhlIEpTT05cbiAgICogZW5jb2Rpbmcgb2YgdGhlIGBHcmFwaERlZmAgcHJvdG9jb2wgYnVmZmVyLlxuICAgKi9cbiAgbW9kZWxUb3BvbG9neT86IHt9fEFycmF5QnVmZmVyO1xuXG4gIC8qKlxuICAgKiBTZXJpYWxpemVkIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBtb2RlbCdzIHRyYWluaW5nLlxuICAgKi9cbiAgdHJhaW5pbmdDb25maWc/OiBUcmFpbmluZ0NvbmZpZztcblxuICAvKipcbiAgICogV2VpZ2h0IHNwZWNpZmljYXRpb25zLlxuICAgKlxuICAgKiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSB3ZWlnaHRzRGF0YSBiZWxvdy5cbiAgICovXG4gIHdlaWdodFNwZWNzPzogV2VpZ2h0c01hbmlmZXN0RW50cnlbXTtcblxuICAvKipcbiAgICogQmluYXJ5IGJ1ZmZlciBmb3IgYWxsIHdlaWdodCB2YWx1ZXMgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWRcbiAgICogYnkgYHdlaWdodFNwZWNzYC5cbiAgICovXG4gIHdlaWdodERhdGE/OiBBcnJheUJ1ZmZlcjtcblxuICAvKipcbiAgICogSGFyZC1jb2RlZCBmb3JtYXQgbmFtZSBmb3IgbW9kZWxzIHNhdmVkIGZyb20gVGVuc29yRmxvdy5qcyBvciBjb252ZXJ0ZWRcbiAgICogYnkgVGVuc29yRmxvdy5qcyBDb252ZXJ0ZXIuXG4gICAqL1xuICBmb3JtYXQ/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgbGlicmFyeSBpcyByZXNwb25zaWJsZSBmb3Igb3JpZ2luYWxseSBnZW5lcmF0aW5nIHRoaXMgYXJ0aWZhY3QuXG4gICAqXG4gICAqIFVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gRS5nLiwgJ1RlbnNvckZsb3cuanMgdjEuMC4wJy5cbiAgICovXG4gIGdlbmVyYXRlZEJ5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBXaGF0IGxpYnJhcnkgb3IgdG9vbCBpcyByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyB0aGUgb3JpZ2luYWwgbW9kZWxcbiAgICogdG8gdGhpcyBmb3JtYXQsIGFwcGxpY2FibGUgb25seSBpZiB0aGUgbW9kZWwgaXMgb3V0cHV0IGJ5IGEgY29udmVydGVyLlxuICAgKlxuICAgKiBVc2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuICBFLmcuLCAnVGVuc29yRmxvdy5qcyBDb252ZXJ0ZXIgdjEuMC4wJy5cbiAgICpcbiAgICogQSB2YWx1ZSBvZiBgbnVsbGAgbWVhbnMgdGhlIG1vZGVsIGFydGlmYWN0cyBhcmUgZ2VuZXJhdGVkIHdpdGhvdXQgYW55XG4gICAqIGNvbnZlcnNpb24gcHJvY2VzcyAoZS5nLiwgc2F2ZWQgZGlyZWN0bHkgZnJvbSBhIFRlbnNvckZsb3cuanNcbiAgICogYHRmLkxheWVyc01vZGVsYCBpbnN0YW5jZS4pXG4gICAqL1xuICBjb252ZXJ0ZWRCeT86IHN0cmluZ3xudWxsO1xuXG4gIC8qKlxuICAgKiBJbnB1dHMgYW5kIG91dHB1dHMgc2lnbmF0dXJlIGZvciBzYXZlZCBtb2RlbC5cbiAgICovXG4gIHNpZ25hdHVyZT86IHt9O1xuXG4gIC8qKlxuICAgKiBVc2VyLWRlZmluZWQgbWV0YWRhdGEgYWJvdXQgdGhlIG1vZGVsLlxuICAgKi9cbiAgdXNlckRlZmluZWRNZXRhZGF0YT86IHtba2V5OiBzdHJpbmddOiB7fX07XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgbW9kZWwuXG4gICAqL1xuICBtb2RlbEluaXRpYWxpemVyPzoge307XG59XG5cbi8qKlxuICogVGhlIG9uLWRpc2sgZm9ybWF0IG9mIHRoZSBgbW9kZWwuanNvbmAgZmlsZS5cbiAqXG4gKiBURi5qcyAxLjAgYWx3YXlzIHBvcHVsYXRlcyB0aGUgb3B0aW9uYWwgZmllbGRzIHdoZW4gd3JpdGluZyBtb2RlbC5qc29uLlxuICogUHJpb3IgdmVyc2lvbnMgZGlkIG5vdCBwcm92aWRlIHRob3NlIGZpZWxkcy5cbiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE1vZGVsSlNPTiB7XG4gIC8qKlxuICAgKiBNb2RlbCB0b3BvbG9neS5cbiAgICpcbiAgICogRm9yIEtlcmFzLXN0eWxlIGB0Zi5Nb2RlbGBzLCB0aGlzIGlzIGEgSlNPTiBvYmplY3QuXG4gICAqIEZvciBUZW5zb3JGbG93LXN0eWxlIG1vZGVscyAoZS5nLiwgYFNhdmVkTW9kZWxgKSwgdGhpcyBpcyB0aGUgSlNPTlxuICAgKiBlbmNvZGluZyBvZiB0aGUgYEdyYXBoRGVmYCBwcm90b2NvbCBidWZmZXIuXG4gICAqL1xuICBtb2RlbFRvcG9sb2d5OiB7fTtcblxuICAvKiogTW9kZWwgdHJhaW5pbmcgY29uZmlndXJhdGlvbi4gKi9cbiAgdHJhaW5pbmdDb25maWc/OiBUcmFpbmluZ0NvbmZpZztcblxuICAvKipcbiAgICogV2VpZ2h0cyBtYW5pZmVzdC5cbiAgICpcbiAgICogVGhlIHdlaWdodHMgbWFuaWZlc3QgY29uc2lzdHMgb2YgYW4gb3JkZXJlZCBsaXN0IG9mIHdlaWdodC1tYW5pZmVzdFxuICAgKiBncm91cHMuIEVhY2ggd2VpZ2h0LW1hbmlmZXN0IGdyb3VwIGNvbnNpc3RzIG9mIGEgbnVtYmVyIG9mIHdlaWdodCB2YWx1ZXNcbiAgICogc3RvcmVkIGluIGEgbnVtYmVyIG9mIHBhdGhzLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gb2ZcbiAgICogYFdlaWdodHNNYW5pZmVzdENvbmZpZ2AgZm9yIG1vcmUgZGV0YWlscy5cbiAgICovXG4gIHdlaWdodHNNYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnO1xuXG4gIC8qKlxuICAgKiBIYXJkLWNvZGVkIGZvcm1hdCBuYW1lIGZvciBtb2RlbHMgc2F2ZWQgZnJvbSBUZW5zb3JGbG93LmpzIG9yIGNvbnZlcnRlZFxuICAgKiBieSBUZW5zb3JGbG93LmpzIENvbnZlcnRlci5cbiAgICovXG4gIGZvcm1hdD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hhdCBsaWJyYXJ5IGlzIHJlc3BvbnNpYmxlIGZvciBvcmlnaW5hbGx5IGdlbmVyYXRpbmcgdGhpcyBhcnRpZmFjdC5cbiAgICpcbiAgICogVXNlZCBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBFLmcuLCAnVGVuc29yRmxvdy5qcyB2MS4wLjAnLlxuICAgKi9cbiAgZ2VuZXJhdGVkQnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFdoYXQgbGlicmFyeSBvciB0b29sIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIHRoZSBvcmlnaW5hbCBtb2RlbFxuICAgKiB0byB0aGlzIGZvcm1hdCwgYXBwbGljYWJsZSBvbmx5IGlmIHRoZSBtb2RlbCBpcyBvdXRwdXQgYnkgYSBjb252ZXJ0ZXIuXG4gICAqXG4gICAqIFVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4gIEUuZy4sICdUZW5zb3JGbG93LmpzIENvbnZlcnRlciB2MS4wLjAnLlxuICAgKlxuICAgKiBBIHZhbHVlIG9mIGBudWxsYCBtZWFucyB0aGUgbW9kZWwgYXJ0aWZhY3RzIGFyZSBnZW5lcmF0ZWQgd2l0aG91dCBhbnlcbiAgICogY29udmVyc2lvbiBwcm9jZXNzIChlLmcuLCBzYXZlZCBkaXJlY3RseSBmcm9tIGEgVGVuc29yRmxvdy5qc1xuICAgKiBgdGYuTGF5ZXJzTW9kZWxgIGluc3RhbmNlLilcbiAgICovXG4gIGNvbnZlcnRlZEJ5Pzogc3RyaW5nfG51bGw7XG5cbiAgLyoqXG4gICAqIElucHV0cyBhbmQgb3V0cHV0cyBzaWduYXR1cmUgZm9yIHNhdmVkIG1vZGVsLlxuICAgKi9cbiAgc2lnbmF0dXJlPzoge307XG5cbiAgLyoqXG4gICAqIFVzZXItZGVmaW5lZCBtZXRhZGF0YSBhYm91dCB0aGUgbW9kZWwuXG4gICAqL1xuICB1c2VyRGVmaW5lZE1ldGFkYXRhPzoge1trZXk6IHN0cmluZ106IHt9fTtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBtb2RlbC5cbiAgICovXG4gIG1vZGVsSW5pdGlhbGl6ZXI/OiB7fTtcbn1cblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGhhbmRsZXJzIG9mIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9hZEhhbmRsZXIgPSAoKSA9PiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzPjtcblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGhhbmRsZXJzIG9mIHNhdmluZyBvcGVyYXRpb25zLlxuICovXG5leHBvcnQgdHlwZSBTYXZlSGFuZGxlciA9IChtb2RlbEFydGlmYWN0OiBNb2RlbEFydGlmYWN0cykgPT5cbiAgICBQcm9taXNlPFNhdmVSZXN1bHQ+O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgYSBtb2RlbCBpbXBvcnQvZXhwb3J0IGhhbmRsZXIuXG4gKlxuICogVGhlIGBzYXZlYCBhbmQgYGxvYWRgIGhhbmRsZXJzIGFyZSBib3RoIG9wdGlvbmFsLCBpbiBvcmRlciB0byBhbGxvdyBoYW5kbGVyc1xuICogdGhhdCBzdXBwb3J0IG9ubHkgc2F2aW5nIG9yIGxvYWRpbmcuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTppbnRlcmZhY2UtbmFtZVxuZXhwb3J0IGludGVyZmFjZSBJT0hhbmRsZXIge1xuICBzYXZlPzogU2F2ZUhhbmRsZXI7XG4gIGxvYWQ/OiBMb2FkSGFuZGxlcjtcbn1cblxuLyoqXG4gKiBUeXBlIGRlZmluaXRpb24gZm9yIGhhbmRsZXJzIG9mIHN5bmNocm9ub3VzIGxvYWRpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgTG9hZEhhbmRsZXJTeW5jID0gKCkgPT4gTW9kZWxBcnRpZmFjdHM7XG5cbi8qKlxuICogVHlwZSBkZWZpbml0aW9uIGZvciBoYW5kbGVycyBvZiBzeW5jaHJvbm91cyBzYXZpbmcgb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IHR5cGUgU2F2ZUhhbmRsZXJTeW5jID0gKG1vZGVsQXJ0aWZhY3Q6IE1vZGVsQXJ0aWZhY3RzKSA9PiBTYXZlUmVzdWx0O1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgYSBzeW5jaHJvbm91cyBtb2RlbCBpbXBvcnQvZXhwb3J0IGhhbmRsZXIuXG4gKlxuICogVGhlIGBzYXZlYCBhbmQgYGxvYWRgIGhhbmRsZXJzIGFyZSBib3RoIG9wdGlvbmFsLCBpbiBvcmRlciB0byBhbGxvdyBoYW5kbGVyc1xuICogdGhhdCBzdXBwb3J0IG9ubHkgc2F2aW5nIG9yIGxvYWRpbmcuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTppbnRlcmZhY2UtbmFtZVxuZXhwb3J0IHR5cGUgSU9IYW5kbGVyU3luYyA9IHtcbiAgc2F2ZT86IFNhdmVIYW5kbGVyU3luYztcbiAgbG9hZD86IExvYWRIYW5kbGVyU3luYztcbn07XG5cbi8qKlxuICogQW4gaW50ZXJmYWNlIGZvciB0aGUgbWFuYWdlciBvZiBhIG1vZGVsIHN0b3JlLlxuICpcbiAqIEEgbW9kZWwgc3RvcmUgaXMgZGVmaW5lZCBhcyBhIHN0b3JhZ2UgbWVkaXVtIG9uIHdoaWNoIG11bHRpcGxlIG1vZGVscyBjYW5cbiAqIGJlIHN0b3JlZC4gRWFjaCBzdG9yZWQgbW9kZWwgaGFzIGEgdW5pcXVlIGBwYXRoYCBhcyBpdHMgaWRlbnRpZmllci5cbiAqIEEgYE1vZGVsU3RvcmVNYW5hZ2VyYCBmb3IgdGhlIHN0b3JlIGFsbG93cyBhY3Rpb25zIGluY2x1ZGluZ1xuICpcbiAqIC0gTGlzdGluZyB0aGUgbW9kZWxzIHN0b3JlZCBpbiB0aGUgc3RvcmUuXG4gKiAtIERlbGV0aW5nIGEgbW9kZWwgZnJvbSB0aGUgc3RvcmUuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxTdG9yZU1hbmFnZXIge1xuICAvKipcbiAgICogTGlzdCBhbGwgbW9kZWxzIGluIHRoZSBtb2RlbCBzdG9yZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBkaWN0aW9uYXJ5IG1hcHBpbmcgcGF0aHMgb2YgZXhpc3RpbmcgbW9kZWxzIHRvIHRoZWlyXG4gICAqICAgbW9kZWwgYXJ0aWZhY3RzIGluZm8uIE1vZGVsIGFydGlmYWN0cyBpbmZvIGluY2x1ZGUgdHlwZSBvZiB0aGUgbW9kZWwnc1xuICAgKiAgIHRvcG9sb2d5LCBieXRlIHNpemVzIG9mIHRoZSB0b3BvbG9neSwgd2VpZ2h0cywgZXRjLlxuICAgKi9cbiAgbGlzdE1vZGVscygpOiBQcm9taXNlPHtbcGF0aDogc3RyaW5nXTogTW9kZWxBcnRpZmFjdHNJbmZvfT47XG5cbiAgLyoqXG4gICAqIFJlbW92ZSBhIG1vZGVsIHNwZWNpZmllZCBieSBgcGF0aGAuXG4gICAqXG4gICAqIEBwYXJhbSBwYXRoXG4gICAqIEByZXR1cm5zIE1vZGVsQXJ0aWZhY3RzSW5mbyBvZiB0aGUgZGVsZXRlZCBtb2RlbCAoaWYgYW5kIG9ubHkgaWYgZGVsZXRpb25cbiAgICogICBpcyBzdWNjZXNzZnVsKS5cbiAgICogQHRocm93cyBFcnJvciBpZiBkZWxldGlvbiBmYWlscywgZS5nLiwgaWYgbm8gbW9kZWwgZXhpc3RzIGF0IGBwYXRoYC5cbiAgICovXG4gIHJlbW92ZU1vZGVsKHBhdGg6IHN0cmluZyk6IFByb21pc2U8TW9kZWxBcnRpZmFjdHNJbmZvPjtcbn1cblxuLyoqXG4gKiBDYWxsYmFjayBmb3IgdGhlIHByb2dyZXNzIG9mIGEgbG9uZy1ydW5uaW5nIGFjdGlvbiBzdWNoIGFzIGFuIEhUVFBcbiAqIHJlcXVlc3QgZm9yIGEgbGFyZ2UgYmluYXJ5IG9iamVjdC5cbiAqXG4gKiBgZnJhY3Rpb25gIHNob3VsZCBiZSBhIG51bWJlciBpbiB0aGUgWzAsIDFdIGludGVydmFsLCBpbmRpY2F0aW5nIGhvd1xuICogbXVjaCBvZiB0aGUgYWN0aW9uIGhhcyBjb21wbGV0ZWQuXG4gKi9cbmV4cG9ydCB0eXBlIE9uUHJvZ3Jlc3NDYWxsYmFjayA9IChmcmFjdGlvbjogbnVtYmVyKSA9PiB2b2lkO1xuXG4vKiogQGlubmFtZXNwYWNlIGlvICovXG5leHBvcnQgaW50ZXJmYWNlIExvYWRPcHRpb25zIHtcbiAgLyoqXG4gICAqIFJlcXVlc3RJbml0IChvcHRpb25zKSBmb3IgSFRUUCByZXF1ZXN0cy5cbiAgICpcbiAgICogRm9yIGRldGFpbGVkIGluZm9ybWF0aW9uIG9uIHRoZSBzdXBwb3J0ZWQgZmllbGRzLCBzZWVcbiAgICogW2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9SZXF1ZXN0L1JlcXVlc3RdKFxuICAgKiAgICAgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1JlcXVlc3QvUmVxdWVzdClcbiAgICovXG4gIHJlcXVlc3RJbml0PzogUmVxdWVzdEluaXQ7XG5cbiAgLyoqXG4gICAqIFByb2dyZXNzIGNhbGxiYWNrLlxuICAgKi9cbiAgb25Qcm9ncmVzcz86IE9uUHJvZ3Jlc3NDYWxsYmFjaztcblxuICAvKipcbiAgICogQSBmdW5jdGlvbiB1c2VkIHRvIG92ZXJyaWRlIHRoZSBgd2luZG93LmZldGNoYCBmdW5jdGlvbi5cbiAgICovXG4gIGZldGNoRnVuYz86IEZ1bmN0aW9uO1xuXG4gIC8qKlxuICAgKiBTdHJpY3QgbG9hZGluZyBtb2RlbDogd2hldGhlciBleHRyYW5lb3VzIHdlaWdodHMgb3IgbWlzc2luZ1xuICAgKiB3ZWlnaHRzIHNob3VsZCB0cmlnZ2VyIGFuIGBFcnJvcmAuXG4gICAqXG4gICAqIElmIGB0cnVlYCwgcmVxdWlyZSB0aGF0IHRoZSBwcm92aWRlZCB3ZWlnaHRzIGV4YWN0bHkgbWF0Y2ggdGhvc2VcbiAgICogcmVxdWlyZWQgYnkgdGhlIGxheWVycy4gYGZhbHNlYCBtZWFucyB0aGF0IGJvdGggZXh0cmEgd2VpZ2h0c1xuICAgKiBhbmQgbWlzc2luZyB3ZWlnaHRzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC5cbiAgICpcbiAgICogRGVmYXVsdDogYHRydWVgLlxuICAgKi9cbiAgc3RyaWN0PzogYm9vbGVhbjtcblxuICAvKipcbiAgICogUGF0aCBwcmVmaXggZm9yIHdlaWdodCBmaWxlcywgYnkgZGVmYXVsdCB0aGlzIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGVcbiAgICogcGF0aCBvZiB0aGUgbW9kZWwgSlNPTiBmaWxlLlxuICAgKlxuICAgKiBGb3IgaW5zdGFuY2UsIGlmIHRoZSBwYXRoIHRvIHRoZSBtb2RlbCBKU09OIGZpbGUgaXNcbiAgICogYGh0dHA6Ly9sb2NhbGhvc3QvZm9vL21vZGVsLmpzb25gLCB0aGVuIHRoZSBkZWZhdWx0IHBhdGggcHJlZml4IHdpbGwgYmVcbiAgICogYGh0dHA6Ly9sb2NhbGhvc3QvZm9vL2AuIElmIGEgd2VpZ2h0IGZpbGUgaGFzIHRoZSBwYXRoIHZhbHVlXG4gICAqIGBncm91cDEtc2hhcmQxb2YyYCBpbiB0aGUgd2VpZ2h0IG1hbmlmZXN0LCB0aGVuIHRoZSB3ZWlnaHQgZmlsZSB3aWxsIGJlXG4gICAqIGxvYWRlZCBmcm9tIGBodHRwOi8vbG9jYWxob3N0L2Zvby9ncm91cDEtc2hhcmQxb2YyYCBieSBkZWZhdWx0LiBIb3dldmVyLFxuICAgKiBpZiB5b3UgcHJvdmlkZSBhIGB3ZWlnaHRQYXRoUHJlZml4YCB2YWx1ZSBvZlxuICAgKiBgaHR0cDovL2xvY2FsaG9zdC9mb28vYWx0LXdlaWdodHNgLCB0aGVuIHRoZSB3ZWlnaHQgZmlsZSB3aWxsIGJlIGxvYWRlZFxuICAgKiBmcm9tIHRoZSBwYXRoIGBodHRwOi8vbG9jYWxob3N0L2Zvby9hbHQtd2VpZ2h0cy9ncm91cDEtc2hhcmQxb2YyYCBpbnN0ZWFkLlxuICAgKi9cbiAgd2VpZ2h0UGF0aFByZWZpeD86IHN0cmluZztcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbW9kdWxlIG9yIG1vZGVsIGlzIHRvIGJlIGxvYWRlZCBmcm9tIFRGIEh1Yi5cbiAgICpcbiAgICogU2V0dGluZyB0aGlzIHRvIGB0cnVlYCBhbGxvd3MgcGFzc2luZyBhIFRGLUh1YiBtb2R1bGUgVVJMLCBvbWl0dGluZyB0aGVcbiAgICogc3RhbmRhcmQgbW9kZWwgZmlsZSBuYW1lIGFuZCB0aGUgcXVlcnkgcGFyYW1ldGVycy5cbiAgICpcbiAgICogRGVmYXVsdDogYGZhbHNlYC5cbiAgICovXG4gIGZyb21URkh1Yj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEFuIGFzeW5jIGZ1bmN0aW9uIHRvIGNvbnZlcnQgd2VpZ2h0IGZpbGUgbmFtZSB0byBVUkwuIFRoZSB3ZWlnaHQgZmlsZVxuICAgKiBuYW1lcyBhcmUgc3RvcmVkIGluIG1vZGVsLmpzb24ncyB3ZWlnaHRzTWFuaWZlc3QucGF0aHMgZmllbGQuIEJ5IGRlZmF1bHQgd2VcbiAgICogY29uc2lkZXIgd2VpZ2h0IGZpbGVzIGFyZSBjb2xvY2F0ZWQgd2l0aCB0aGUgbW9kZWwuanNvbiBmaWxlLiBGb3IgZXhhbXBsZTpcbiAgICogICAgIG1vZGVsLmpzb24gVVJMOiBodHRwczovL3d3dy5nb29nbGUuY29tL21vZGVscy8xL21vZGVsLmpzb25cbiAgICogICAgIGdyb3VwMS1zaGFyZDFvZjEuYmluIHVybDpcbiAgICogICAgICAgIGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vbW9kZWxzLzEvZ3JvdXAxLXNoYXJkMW9mMS5iaW5cbiAgICpcbiAgICogV2l0aCB0aGlzIGZ1bmMgeW91IGNhbiBjb252ZXJ0IHRoZSB3ZWlnaHQgZmlsZSBuYW1lIHRvIGFueSBVUkwuXG4gICAqL1xuICB3ZWlnaHRVcmxDb252ZXJ0ZXI/OiAod2VpZ2h0RmlsZU5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+O1xufVxuXG4vKipcbiAqIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgUGxhdGZvcm0uZmV0Y2hcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0RGV0YWlscyB7XG4gIC8qKlxuICAgKiBJcyB0aGlzIHJlcXVlc3QgZm9yIGEgYmluYXJ5IGZpbGUgKGFzIG9wcG9zZWQgdG8gYSBqc29uIGZpbGUpXG4gICAqL1xuICBpc0JpbmFyeT86IGJvb2xlYW47XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { complex } from '../ops/complex';\nimport { tensor } from '../ops/tensor';\nimport { sizeFromShape } from '../util';\nimport { DTYPE_VALUE_SIZE_MAP } from './types';\n/** Number of bytes reserved for the length of the string. (32bit integer). */\nconst NUM_BYTES_STRING_LENGTH = 4;\n/**\n * Encode a map from names to weight values as an ArrayBuffer, along with an\n * `Array` of `WeightsManifestEntry` as specification of the encoded weights.\n *\n * This function does not perform sharding.\n *\n * This function is the reverse of `decodeWeights`.\n *\n * @param tensors A map (\"dict\") from names to tensors.\n * @param group Group to which the weights belong (optional).\n * @returns A `Promise` of\n *   - A flat `ArrayBuffer` with all the binary values of the `Tensor`s\n *     concatenated.\n *   - An `Array` of `WeightManifestEntry`s, carrying information including\n *     tensor names, `dtype`s and shapes.\n * @throws Error: on unsupported tensor `dtype`.\n */\nexport async function encodeWeights(tensors, group) {\n    // TODO(adarob, cais): Support quantization.\n    const specs = [];\n    const dataPromises = [];\n    const names = Array.isArray(tensors) ?\n        tensors.map(tensor => tensor.name) :\n        Object.keys(tensors);\n    for (let i = 0; i < names.length; ++i) {\n        const name = names[i];\n        const t = Array.isArray(tensors) ? tensors[i].tensor : tensors[name];\n        if (t.dtype !== 'float32' && t.dtype !== 'int32' && t.dtype !== 'bool' &&\n            t.dtype !== 'string' && t.dtype !== 'complex64') {\n            throw new Error(`Unsupported dtype in weight '${name}': ${t.dtype}`);\n        }\n        const spec = { name, shape: t.shape, dtype: t.dtype };\n        if (t.dtype === 'string') {\n            const utf8bytes = new Promise(async (resolve) => {\n                const vals = await t.bytes();\n                const totalNumBytes = vals.reduce((p, c) => p + c.length, 0) +\n                    NUM_BYTES_STRING_LENGTH * vals.length;\n                const bytes = new Uint8Array(totalNumBytes);\n                let offset = 0;\n                for (let i = 0; i < vals.length; i++) {\n                    const val = vals[i];\n                    const bytesOfLength = new Uint8Array(new Uint32Array([val.length]).buffer);\n                    bytes.set(bytesOfLength, offset);\n                    offset += NUM_BYTES_STRING_LENGTH;\n                    bytes.set(val, offset);\n                    offset += val.length;\n                }\n                resolve(bytes);\n            });\n            dataPromises.push(utf8bytes);\n        }\n        else {\n            dataPromises.push(t.data());\n        }\n        if (group != null) {\n            spec.group = group;\n        }\n        specs.push(spec);\n    }\n    const tensorValues = await Promise.all(dataPromises);\n    return { data: concatenateTypedArrays(tensorValues), specs };\n}\n/**\n * Decode flat ArrayBuffer as weights.\n *\n * This function does not handle sharding.\n *\n * This function is the reverse of `encodeWeights`.\n *\n * @param buffer A flat ArrayBuffer carrying the binary values of the tensors\n *   concatenated in the order specified in `specs`.\n * @param specs Specifications of the names, dtypes and shapes of the tensors\n *   whose value are encoded by `buffer`.\n * @return A map from tensor name to tensor value, with the names corresponding\n *   to names in `specs`.\n * @throws Error, if any of the tensors has unsupported dtype.\n */\nexport function decodeWeights(buffer, specs) {\n    // TODO(adarob, cais): Support quantization.\n    const out = {};\n    let float16Decode;\n    let offset = 0;\n    for (const spec of specs) {\n        const name = spec.name;\n        const dtype = spec.dtype;\n        const shape = spec.shape;\n        const size = sizeFromShape(shape);\n        let values;\n        if ('quantization' in spec) {\n            const quantization = spec.quantization;\n            if (quantization.dtype === 'uint8' || quantization.dtype === 'uint16') {\n                if (!('min' in quantization && 'scale' in quantization)) {\n                    throw new Error(`Weight ${spec.name} with quantization ${quantization.dtype} ` +\n                        `doesn't have corresponding metadata min and scale.`);\n                }\n            }\n            else if (quantization.dtype === 'float16') {\n                if (dtype !== 'float32') {\n                    throw new Error(`Weight ${spec.name} is quantized with ${quantization.dtype} ` +\n                        `which only supports weights of type float32 not ${dtype}.`);\n                }\n            }\n            else {\n                throw new Error(`Weight ${spec.name} has unknown ` +\n                    `quantization dtype ${quantization.dtype}. ` +\n                    `Supported quantization dtypes are: ` +\n                    `'uint8', 'uint16', and 'float16'.`);\n            }\n            const quantizationSizeFactor = DTYPE_VALUE_SIZE_MAP[quantization.dtype];\n            const byteBuffer = buffer.slice(offset, offset + size * quantizationSizeFactor);\n            const quantizedArray = (quantization.dtype === 'uint8') ?\n                new Uint8Array(byteBuffer) :\n                new Uint16Array(byteBuffer);\n            if (dtype === 'float32') {\n                if (quantization.dtype === 'uint8' || quantization.dtype === 'uint16') {\n                    values = new Float32Array(quantizedArray.length);\n                    for (let i = 0; i < quantizedArray.length; i++) {\n                        const v = quantizedArray[i];\n                        values[i] = v * quantization.scale + quantization.min;\n                    }\n                }\n                else if (quantization.dtype === 'float16') {\n                    if (float16Decode === undefined) {\n                        float16Decode = getFloat16Decoder();\n                    }\n                    values = float16Decode(quantizedArray);\n                }\n                else {\n                    throw new Error(`Unsupported quantization type ${quantization.dtype} ` +\n                        `for weight type float32.`);\n                }\n            }\n            else if (dtype === 'int32') {\n                if (quantization.dtype !== 'uint8' && quantization.dtype !== 'uint16') {\n                    throw new Error(`Unsupported quantization type ${quantization.dtype} ` +\n                        `for weight type int32.`);\n                }\n                values = new Int32Array(quantizedArray.length);\n                for (let i = 0; i < quantizedArray.length; i++) {\n                    const v = quantizedArray[i];\n                    values[i] = Math.round(v * quantization.scale + quantization.min);\n                }\n            }\n            else {\n                throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`);\n            }\n            offset += size * quantizationSizeFactor;\n        }\n        else if (dtype === 'string') {\n            const size = sizeFromShape(spec.shape);\n            values = [];\n            for (let i = 0; i < size; i++) {\n                const byteLength = new Uint32Array(buffer.slice(offset, offset + NUM_BYTES_STRING_LENGTH))[0];\n                offset += NUM_BYTES_STRING_LENGTH;\n                const bytes = new Uint8Array(buffer.slice(offset, offset + byteLength));\n                values.push(bytes);\n                offset += byteLength;\n            }\n        }\n        else {\n            const dtypeFactor = DTYPE_VALUE_SIZE_MAP[dtype];\n            const byteBuffer = buffer.slice(offset, offset + size * dtypeFactor);\n            if (dtype === 'float32') {\n                values = new Float32Array(byteBuffer);\n            }\n            else if (dtype === 'int32') {\n                values = new Int32Array(byteBuffer);\n            }\n            else if (dtype === 'bool') {\n                values = new Uint8Array(byteBuffer);\n            }\n            else if (dtype === 'complex64') {\n                values = new Float32Array(byteBuffer);\n                const real = new Float32Array(values.length / 2);\n                const image = new Float32Array(values.length / 2);\n                for (let i = 0; i < real.length; i++) {\n                    real[i] = values[i * 2];\n                    image[i] = values[i * 2 + 1];\n                }\n                const realTensor = tensor(real, shape, 'float32');\n                const imageTensor = tensor(image, shape, 'float32');\n                out[name] = complex(realTensor, imageTensor);\n                realTensor.dispose();\n                imageTensor.dispose();\n            }\n            else {\n                throw new Error(`Unsupported dtype in weight '${name}': ${dtype}`);\n            }\n            offset += size * dtypeFactor;\n        }\n        if (dtype !== 'complex64') {\n            out[name] = tensor(values, shape, dtype);\n        }\n    }\n    return out;\n}\n/**\n * Concatenate TypedArrays into an ArrayBuffer.\n */\nexport function concatenateTypedArrays(xs) {\n    // TODO(adarob, cais): Support quantization.\n    if (xs === null) {\n        throw new Error(`Invalid input value: ${JSON.stringify(xs)}`);\n    }\n    let totalByteLength = 0;\n    // `normalizedXs` is here for this reason: a `TypedArray`'s `buffer'\n    // can have a different byte length from that of the `TypedArray` itself,\n    // for example, when the `TypedArray` is created from an offset in an\n    // `ArrayBuffer`. `normliazedXs` holds `TypedArray`s whose `buffer`s match\n    // the `TypedArray` in byte length. If an element of `xs` does not show\n    // this property, a new `TypedArray` that satisfy this property will be\n    // constructed and pushed into `normalizedXs`.\n    const normalizedXs = [];\n    xs.forEach((x) => {\n        totalByteLength += x.byteLength;\n        // tslint:disable:no-any\n        normalizedXs.push(x.byteLength === x.buffer.byteLength ? x :\n            new x.constructor(x));\n        if (!(x instanceof Float32Array || x instanceof Int32Array ||\n            x instanceof Uint8Array)) {\n            throw new Error(`Unsupported TypedArray subtype: ${x.constructor.name}`);\n        }\n        // tslint:enable:no-any\n    });\n    const y = new Uint8Array(totalByteLength);\n    let offset = 0;\n    normalizedXs.forEach((x) => {\n        y.set(new Uint8Array(x.buffer), offset);\n        offset += x.byteLength;\n    });\n    return y.buffer;\n}\n// Use Buffer on Node.js instead of Blob/atob/btoa\nconst useNodeBuffer = typeof Buffer !== 'undefined' &&\n    (typeof Blob === 'undefined' || typeof atob === 'undefined' ||\n        typeof btoa === 'undefined');\n/**\n * Calculate the byte length of a JavaScript string.\n *\n * Note that a JavaScript string can contain wide characters, therefore the\n * length of the string is not necessarily equal to the byte length.\n *\n * @param str Input string.\n * @returns Byte length.\n */\nexport function stringByteLength(str) {\n    if (useNodeBuffer) {\n        return Buffer.byteLength(str);\n    }\n    return new Blob([str]).size;\n}\n/**\n * Encode an ArrayBuffer as a base64 encoded string.\n *\n * @param buffer `ArrayBuffer` to be converted.\n * @returns A string that base64-encodes `buffer`.\n */\nexport function arrayBufferToBase64String(buffer) {\n    if (useNodeBuffer) {\n        return Buffer.from(buffer).toString('base64');\n    }\n    const buf = new Uint8Array(buffer);\n    let s = '';\n    for (let i = 0, l = buf.length; i < l; i++) {\n        s += String.fromCharCode(buf[i]);\n    }\n    return btoa(s);\n}\n/**\n * Decode a base64 string as an ArrayBuffer.\n *\n * @param str Base64 string.\n * @returns Decoded `ArrayBuffer`.\n */\nexport function base64StringToArrayBuffer(str) {\n    if (useNodeBuffer) {\n        const buf = Buffer.from(str, 'base64');\n        return buf.buffer.slice(buf.byteOffset, buf.byteOffset + buf.byteLength);\n    }\n    const s = atob(str);\n    const buffer = new Uint8Array(s.length);\n    for (let i = 0; i < s.length; ++i) {\n        buffer.set([s.charCodeAt(i)], i);\n    }\n    return buffer.buffer;\n}\n/**\n * Concatenate a number of ArrayBuffers into one.\n *\n * @param buffers A number of array buffers to concatenate.\n * @returns Result of concatenating `buffers` in order.\n */\nexport function concatenateArrayBuffers(buffers) {\n    if (buffers.length === 1) {\n        return buffers[0];\n    }\n    let totalByteLength = 0;\n    buffers.forEach((buffer) => {\n        totalByteLength += buffer.byteLength;\n    });\n    const temp = new Uint8Array(totalByteLength);\n    let offset = 0;\n    buffers.forEach((buffer) => {\n        temp.set(new Uint8Array(buffer), offset);\n        offset += buffer.byteLength;\n    });\n    return temp.buffer;\n}\n/**\n * Get the basename of a path.\n *\n * Behaves in a way analogous to Linux's basename command.\n *\n * @param path\n */\nexport function basename(path) {\n    const SEPARATOR = '/';\n    path = path.trim();\n    while (path.endsWith(SEPARATOR)) {\n        path = path.slice(0, path.length - 1);\n    }\n    const items = path.split(SEPARATOR);\n    return items[items.length - 1];\n}\n/**\n * Create `ModelJSON` from `ModelArtifacts`.\n *\n * @param artifacts Model artifacts, describing the model and its weights.\n * @param manifest Weight manifest, describing where the weights of the\n *     `ModelArtifacts` are stored, and some metadata about them.\n * @returns Object representing the `model.json` file describing the model\n *     artifacts and weights\n */\nexport function getModelJSONForModelArtifacts(artifacts, manifest) {\n    const result = {\n        modelTopology: artifacts.modelTopology,\n        format: artifacts.format,\n        generatedBy: artifacts.generatedBy,\n        convertedBy: artifacts.convertedBy,\n        weightsManifest: manifest\n    };\n    if (artifacts.signature != null) {\n        result.signature = artifacts.signature;\n    }\n    if (artifacts.userDefinedMetadata != null) {\n        result.userDefinedMetadata = artifacts.userDefinedMetadata;\n    }\n    if (artifacts.modelInitializer != null) {\n        result.modelInitializer = artifacts.modelInitializer;\n    }\n    if (artifacts.trainingConfig != null) {\n        result.trainingConfig = artifacts.trainingConfig;\n    }\n    return result;\n}\n/**\n * Create `ModelArtifacts` from a JSON file and weights.\n *\n * @param modelJSON Object containing the parsed JSON of `model.json`\n * @param weightSpecs The list of WeightsManifestEntry for the model. Must be\n *     passed if the modelJSON has a weightsManifest.\n * @param weightData An ArrayBuffer of weight data for the model corresponding\n *     to the weights in weightSpecs. Must be passed if the modelJSON has a\n *     weightsManifest.\n * @returns A Promise of the `ModelArtifacts`, as described by the JSON file.\n */\nexport function getModelArtifactsForJSONSync(modelJSON, weightSpecs, weightData) {\n    const modelArtifacts = {\n        modelTopology: modelJSON.modelTopology,\n        format: modelJSON.format,\n        generatedBy: modelJSON.generatedBy,\n        convertedBy: modelJSON.convertedBy\n    };\n    if (modelJSON.trainingConfig != null) {\n        modelArtifacts.trainingConfig = modelJSON.trainingConfig;\n    }\n    if (modelJSON.weightsManifest != null) {\n        if (!weightSpecs) {\n            throw new Error('modelJSON has weightsManifest but weightSpecs is null');\n        }\n        if (!weightData) {\n            throw new Error('modelJSON has weightsManifest but weightData is null');\n        }\n        modelArtifacts.weightSpecs = weightSpecs;\n        modelArtifacts.weightData = weightData;\n    }\n    if (modelJSON.signature != null) {\n        modelArtifacts.signature = modelJSON.signature;\n    }\n    if (modelJSON.userDefinedMetadata != null) {\n        modelArtifacts.userDefinedMetadata = modelJSON.userDefinedMetadata;\n    }\n    if (modelJSON.modelInitializer != null) {\n        modelArtifacts.modelInitializer = modelJSON.modelInitializer;\n    }\n    return modelArtifacts;\n}\n/**\n * Create `ModelArtifacts` from a JSON file.\n *\n * @param modelJSON Object containing the parsed JSON of `model.json`\n * @param loadWeights Function that takes the JSON file's weights manifest,\n *     reads weights from the listed path(s), and returns a Promise of the\n *     weight manifest entries along with the weights data.\n * @returns A Promise of the `ModelArtifacts`, as described by the JSON file.\n */\nexport async function getModelArtifactsForJSON(modelJSON, loadWeights) {\n    let weightSpecs;\n    let weightData;\n    if (modelJSON.weightsManifest != null) {\n        [weightSpecs, weightData] = await loadWeights(modelJSON.weightsManifest);\n    }\n    return getModelArtifactsForJSONSync(modelJSON, weightSpecs, weightData);\n}\n/**\n * Populate ModelArtifactsInfo fields for a model with JSON topology.\n * @param modelArtifacts\n * @returns A ModelArtifactsInfo object.\n */\nexport function getModelArtifactsInfoForJSON(modelArtifacts) {\n    if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n        throw new Error('Expected JSON model topology, received ArrayBuffer.');\n    }\n    return {\n        dateSaved: new Date(),\n        modelTopologyType: 'JSON',\n        modelTopologyBytes: modelArtifacts.modelTopology == null ?\n            0 :\n            stringByteLength(JSON.stringify(modelArtifacts.modelTopology)),\n        weightSpecsBytes: modelArtifacts.weightSpecs == null ?\n            0 :\n            stringByteLength(JSON.stringify(modelArtifacts.weightSpecs)),\n        weightDataBytes: modelArtifacts.weightData == null ?\n            0 :\n            modelArtifacts.weightData.byteLength,\n    };\n}\n/**\n * Concatenate the weights stored in a WeightsManifestConfig into a list of\n * WeightsManifestEntry\n *\n * @param weightsManifest The WeightsManifestConfig to extract weights from.\n * @returns A list of WeightsManifestEntry of the weights in the weightsManifest\n */\nexport function getWeightSpecs(weightsManifest) {\n    const weightSpecs = [];\n    for (const entry of weightsManifest) {\n        weightSpecs.push(...entry.weights);\n    }\n    return weightSpecs;\n}\n/**\n * Computes mantisa table for casting Float16 to Float32\n * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n *\n * @returns Uint32Array, 2048 mantissa lookup values.\n */\nfunction computeFloat16MantisaTable() {\n    const convertMantissa = (i) => {\n        let m = i << 13;\n        let e = 0;\n        while ((m & 0x00800000) === 0) {\n            e -= 0x00800000;\n            m <<= 1;\n        }\n        m &= ~0x00800000;\n        e += 0x38800000;\n        return m | e;\n    };\n    const mantisaTable = new Uint32Array(2048);\n    mantisaTable[0] = 0;\n    for (let i = 1; i < 1024; i++) {\n        mantisaTable[i] = convertMantissa(i);\n    }\n    for (let i = 1024; i < 2048; i++) {\n        mantisaTable[i] = 0x38000000 + ((i - 1024) << 13);\n    }\n    return mantisaTable;\n}\n/**\n * Computes exponent table for casting Float16 to Float32\n * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n *\n * @returns Uint32Array, 64 exponent lookup values.\n */\nfunction computeFloat16ExponentTable() {\n    const exponentTable = new Uint32Array(64);\n    exponentTable[0] = 0;\n    exponentTable[31] = 0x47800000;\n    exponentTable[32] = 0x80000000;\n    exponentTable[63] = 0xc7800000;\n    for (let i = 1; i < 31; i++) {\n        exponentTable[i] = i << 23;\n    }\n    for (let i = 33; i < 63; i++) {\n        exponentTable[i] = 0x80000000 + ((i - 32) << 23);\n    }\n    return exponentTable;\n}\n/**\n * Computes offset table for casting Float16 to Float32\n * See http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n *\n * @returns Uint32Array, 6d offset values.\n */\nfunction computeFloat16OffsetTable() {\n    const offsetTable = new Uint32Array(64);\n    for (let i = 0; i < 64; i++) {\n        offsetTable[i] = 1024;\n    }\n    offsetTable[0] = offsetTable[32] = 0;\n    return offsetTable;\n}\n/**\n * Retrieve a Float16 decoder which will decode a ByteArray of Float16 values\n * to a Float32Array.\n *\n * @returns Function (buffer: Uint16Array) => Float32Array which decodes\n *          the Uint16Array of Float16 bytes to a Float32Array.\n */\nexport function getFloat16Decoder() {\n    // Algorithm is based off of\n    // http://www.fox-toolkit.org/ftp/fasthalffloatconversion.pdf\n    // Cache lookup tables\n    const mantisaTable = computeFloat16MantisaTable();\n    const exponentTable = computeFloat16ExponentTable();\n    const offsetTable = computeFloat16OffsetTable();\n    return (quantizedArray) => {\n        const buffer = new ArrayBuffer(4 * quantizedArray.length);\n        const bufferUint32View = new Uint32Array(buffer);\n        for (let index = 0; index < quantizedArray.length; index++) {\n            const float16Bits = quantizedArray[index];\n            const float32Bits = mantisaTable[offsetTable[float16Bits >> 10] + (float16Bits & 0x3ff)] +\n                exponentTable[float16Bits >> 10];\n            bufferUint32View[index] = float32Bits;\n        }\n        return new Float32Array(buffer);\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW9fdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL2lvX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3JDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsT0FBTyxFQUFDLG9CQUFvQixFQUEwRyxNQUFNLFNBQVMsQ0FBQztBQUV0Siw4RUFBOEU7QUFDOUUsTUFBTSx1QkFBdUIsR0FBRyxDQUFDLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGFBQWEsQ0FDL0IsT0FBcUMsRUFBRSxLQUFtQjtJQUU1RCw0Q0FBNEM7SUFDNUMsTUFBTSxLQUFLLEdBQTJCLEVBQUUsQ0FBQztJQUN6QyxNQUFNLFlBQVksR0FBK0IsRUFBRSxDQUFDO0lBRXBELE1BQU0sS0FBSyxHQUFhLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUV6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNyQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMs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QUMsR0FBRyxXQUFXLENBQUM7U0FDdkM7UUFDRCxPQUFPLElBQUksWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi4vb3BzL2NvbXBsZXgnO1xuaW1wb3J0IHt0ZW5zb3J9IGZyb20gJy4uL29wcy90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvciwgTmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge1R5cGVkQXJyYXl9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7c2l6ZUZyb21TaGFwZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7RFRZUEVfVkFMVUVfU0laRV9NQVAsIE1vZGVsQXJ0aWZhY3RzLCBNb2RlbEFydGlmYWN0c0luZm8sIE1vZGVsSlNPTiwgV2VpZ2h0R3JvdXAsIFdlaWdodHNNYW5pZmVzdENvbmZpZywgV2VpZ2h0c01hbmlmZXN0RW50cnl9IGZyb20gJy4vdHlwZXMnO1xuXG4vKiogTnVtYmVyIG9mIGJ5dGVzIHJlc2VydmVkIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICgzMmJpdCBpbnRlZ2VyKS4gKi9cbmNvbnN0IE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIID0gNDtcblxuLyoqXG4gKiBFbmNvZGUgYSBtYXAgZnJvbSBuYW1lcyB0byB3ZWlnaHQgdmFsdWVzIGFzIGFuIEFycmF5QnVmZmVyLCBhbG9uZyB3aXRoIGFuXG4gKiBgQXJyYXlgIG9mIGBXZWlnaHRzTWFuaWZlc3RFbnRyeWAgYXMgc3BlY2lmaWNhdGlvbiBvZiB0aGUgZW5jb2RlZCB3ZWlnaHRzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcGVyZm9ybSBzaGFyZGluZy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIHRoZSByZXZlcnNlIG9mIGBkZWNvZGVXZWlnaHRzYC5cbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIG1hcCAoXCJkaWN0XCIpIGZyb20gbmFtZXMgdG8gdGVuc29ycy5cbiAqIEBwYXJhbSBncm91cCBHcm91cCB0byB3aGljaCB0aGUgd2VpZ2h0cyBiZWxvbmcgKG9wdGlvbmFsKS5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mXG4gKiAgIC0gQSBmbGF0IGBBcnJheUJ1ZmZlcmAgd2l0aCBhbGwgdGhlIGJpbmFyeSB2YWx1ZXMgb2YgdGhlIGBUZW5zb3Jgc1xuICogICAgIGNvbmNhdGVuYXRlZC5cbiAqICAgLSBBbiBgQXJyYXlgIG9mIGBXZWlnaHRNYW5pZmVzdEVudHJ5YHMsIGNhcnJ5aW5nIGluZm9ybWF0aW9uIGluY2x1ZGluZ1xuICogICAgIHRlbnNvciBuYW1lcywgYGR0eXBlYHMgYW5kIHNoYXBlcy5cbiAqIEB0aHJvd3MgRXJyb3I6IG9uIHVuc3VwcG9ydGVkIHRlbnNvciBgZHR5cGVgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZW5jb2RlV2VpZ2h0cyhcbiAgICB0ZW5zb3JzOiBOYW1lZFRlbnNvck1hcHxOYW1lZFRlbnNvcltdLCBncm91cD86IFdlaWdodEdyb3VwKTpcbiAgICBQcm9taXNlPHtkYXRhOiBBcnJheUJ1ZmZlciwgc3BlY3M6IFdlaWdodHNNYW5pZmVzdEVudHJ5W119PiB7XG4gIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gIGNvbnN0IHNwZWNzOiBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdID0gW107XG4gIGNvbnN0IGRhdGFQcm9taXNlczogQXJyYXk8UHJvbWlzZTxUeXBlZEFycmF5Pj4gPSBbXTtcblxuICBjb25zdCBuYW1lczogc3RyaW5nW10gPSBBcnJheS5pc0FycmF5KHRlbnNvcnMpID9cbiAgICAgIHRlbnNvcnMubWFwKHRlbnNvciA9PiB0ZW5zb3IubmFtZSkgOlxuICAgICAgT2JqZWN0LmtleXModGVuc29ycyk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG5hbWUgPSBuYW1lc1tpXTtcbiAgICBjb25zdCB0ID0gQXJyYXkuaXNBcnJheSh0ZW5zb3JzKSA/IHRlbnNvcnNbaV0udGVuc29yIDogdGVuc29yc1tuYW1lXTtcbiAgICBpZiAodC5kdHlwZSAhPT0gJ2Zsb2F0MzInICYmIHQuZHR5cGUgIT09ICdpbnQzMicgJiYgdC5kdHlwZSAhPT0gJ2Jvb2wnICYmXG4gICAgICAgIHQuZHR5cGUgIT09ICdzdHJpbmcnICYmIHQuZHR5cGUgIT09ICdjb21wbGV4NjQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnJHtuYW1lfSc6ICR7dC5kdHlwZX1gKTtcbiAgICB9XG4gICAgY29uc3Qgc3BlYzogV2VpZ2h0c01hbmlmZXN0RW50cnkgPSB7bmFtZSwgc2hhcGU6IHQuc2hhcGUsIGR0eXBlOiB0LmR0eXBlfTtcbiAgICBpZiAodC5kdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IHV0ZjhieXRlcyA9IG5ldyBQcm9taXNlPFR5cGVkQXJyYXk+KGFzeW5jIHJlc29sdmUgPT4ge1xuICAgICAgICBjb25zdCB2YWxzID0gYXdhaXQgdC5ieXRlcygpIGFzIFVpbnQ4QXJyYXlbXTtcbiAgICAgICAgY29uc3QgdG90YWxOdW1CeXRlcyA9IHZhbHMucmVkdWNlKChwLCBjKSA9PiBwICsgYy5sZW5ndGgsIDApICtcbiAgICAgICAgICAgIE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIICogdmFscy5sZW5ndGg7XG4gICAgICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkodG90YWxOdW1CeXRlcyk7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICBjb25zdCB2YWwgPSB2YWxzW2ldO1xuICAgICAgICAgIGNvbnN0IGJ5dGVzT2ZMZW5ndGggPVxuICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShuZXcgVWludDMyQXJyYXkoW3ZhbC5sZW5ndGhdKS5idWZmZXIpO1xuICAgICAgICAgIGJ5dGVzLnNldChieXRlc09mTGVuZ3RoLCBvZmZzZXQpO1xuICAgICAgICAgIG9mZnNldCArPSBOVU1fQllURVNfU1RSSU5HX0xFTkdUSDtcbiAgICAgICAgICBieXRlcy5zZXQodmFsLCBvZmZzZXQpO1xuICAgICAgICAgIG9mZnNldCArPSB2YWwubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIHJlc29sdmUoYnl0ZXMpO1xuICAgICAgfSk7XG4gICAgICBkYXRhUHJvbWlzZXMucHVzaCh1dGY4Ynl0ZXMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYXRhUHJvbWlzZXMucHVzaCh0LmRhdGEoKSk7XG4gICAgfVxuICAgIGlmIChncm91cCAhPSBudWxsKSB7XG4gICAgICBzcGVjLmdyb3VwID0gZ3JvdXA7XG4gICAgfVxuICAgIHNwZWNzLnB1c2goc3BlYyk7XG4gIH1cblxuICBjb25zdCB0ZW5zb3JWYWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChkYXRhUHJvbWlzZXMpO1xuICByZXR1cm4ge2RhdGE6IGNvbmNhdGVuYXRlVHlwZWRBcnJheXModGVuc29yVmFsdWVzKSwgc3BlY3N9O1xufVxuXG4vKipcbiAqIERlY29kZSBmbGF0IEFycmF5QnVmZmVyIGFzIHdlaWdodHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBoYW5kbGUgc2hhcmRpbmcuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBpcyB0aGUgcmV2ZXJzZSBvZiBgZW5jb2RlV2VpZ2h0c2AuXG4gKlxuICogQHBhcmFtIGJ1ZmZlciBBIGZsYXQgQXJyYXlCdWZmZXIgY2FycnlpbmcgdGhlIGJpbmFyeSB2YWx1ZXMgb2YgdGhlIHRlbnNvcnNcbiAqICAgY29uY2F0ZW5hdGVkIGluIHRoZSBvcmRlciBzcGVjaWZpZWQgaW4gYHNwZWNzYC5cbiAqIEBwYXJhbSBzcGVjcyBTcGVjaWZpY2F0aW9ucyBvZiB0aGUgbmFtZXMsIGR0eXBlcyBhbmQgc2hhcGVzIG9mIHRoZSB0ZW5zb3JzXG4gKiAgIHdob3NlIHZhbHVlIGFyZSBlbmNvZGVkIGJ5IGBidWZmZXJgLlxuICogQHJldHVybiBBIG1hcCBmcm9tIHRlbnNvciBuYW1lIHRvIHRlbnNvciB2YWx1ZSwgd2l0aCB0aGUgbmFtZXMgY29ycmVzcG9uZGluZ1xuICogICB0byBuYW1lcyBpbiBgc3BlY3NgLlxuICogQHRocm93cyBFcnJvciwgaWYgYW55IG9mIHRoZSB0ZW5zb3JzIGhhcyB1bnN1cHBvcnRlZCBkdHlwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZVdlaWdodHMoXG4gICAgYnVmZmVyOiBBcnJheUJ1ZmZlciwgc3BlY3M6IFdlaWdodHNNYW5pZmVzdEVudHJ5W10pOiBOYW1lZFRlbnNvck1hcCB7XG4gIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gIGNvbnN0IG91dDogTmFtZWRUZW5zb3JNYXAgPSB7fTtcbiAgbGV0IGZsb2F0MTZEZWNvZGU6IChidWZmZXI6IFVpbnQxNkFycmF5KSA9PiBGbG9hdDMyQXJyYXkgfCB1bmRlZmluZWQ7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGNvbnN0IHNwZWMgb2Ygc3BlY3MpIHtcbiAgICBjb25zdCBuYW1lID0gc3BlYy5uYW1lO1xuICAgIGNvbnN0IGR0eXBlID0gc3BlYy5kdHlwZTtcbiAgICBjb25zdCBzaGFwZSA9IHNwZWMuc2hhcGU7XG4gICAgY29uc3Qgc2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICAgIGxldCB2YWx1ZXM6IFR5cGVkQXJyYXl8c3RyaW5nW118VWludDhBcnJheVtdO1xuXG4gICAgaWYgKCdxdWFudGl6YXRpb24nIGluIHNwZWMpIHtcbiAgICAgIGNvbnN0IHF1YW50aXphdGlvbiA9IHNwZWMucXVhbnRpemF0aW9uO1xuICAgICAgaWYgKHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQ4JyB8fCBxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50MTYnKSB7XG4gICAgICAgIGlmICghKCdtaW4nIGluIHF1YW50aXphdGlvbiAmJiAnc2NhbGUnIGluIHF1YW50aXphdGlvbikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBXZWlnaHQgJHtzcGVjLm5hbWV9IHdpdGggcXVhbnRpemF0aW9uICR7cXVhbnRpemF0aW9uLmR0eXBlfSBgICtcbiAgICAgICAgICAgICAgYGRvZXNuJ3QgaGF2ZSBjb3JyZXNwb25kaW5nIG1ldGFkYXRhIG1pbiBhbmQgc2NhbGUuYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAocXVhbnRpemF0aW9uLmR0eXBlID09PSAnZmxvYXQxNicpIHtcbiAgICAgICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBXZWlnaHQgJHtzcGVjLm5hbWV9IGlzIHF1YW50aXplZCB3aXRoICR7cXVhbnRpemF0aW9uLmR0eXBlfSBgICtcbiAgICAgICAgICAgICAgYHdoaWNoIG9ubHkgc3VwcG9ydHMgd2VpZ2h0cyBvZiB0eXBlIGZsb2F0MzIgbm90ICR7ZHR5cGV9LmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgV2VpZ2h0ICR7c3BlYy5uYW1lfSBoYXMgdW5rbm93biBgICtcbiAgICAgICAgICAgIGBxdWFudGl6YXRpb24gZHR5cGUgJHtxdWFudGl6YXRpb24uZHR5cGV9LiBgICtcbiAgICAgICAgICAgIGBTdXBwb3J0ZWQgcXVhbnRpemF0aW9uIGR0eXBlcyBhcmU6IGAgK1xuICAgICAgICAgICAgYCd1aW50OCcsICd1aW50MTYnLCBhbmQgJ2Zsb2F0MTYnLmApO1xuICAgICAgfVxuICAgICAgY29uc3QgcXVhbnRpemF0aW9uU2l6ZUZhY3RvciA9IERUWVBFX1ZBTFVFX1NJWkVfTUFQW3F1YW50aXphdGlvbi5kdHlwZV07XG4gICAgICBjb25zdCBieXRlQnVmZmVyID1cbiAgICAgICAgICBidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBzaXplICogcXVhbnRpemF0aW9uU2l6ZUZhY3Rvcik7XG4gICAgICBjb25zdCBxdWFudGl6ZWRBcnJheSA9IChxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50OCcpID9cbiAgICAgICAgICBuZXcgVWludDhBcnJheShieXRlQnVmZmVyKSA6XG4gICAgICAgICAgbmV3IFVpbnQxNkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgaWYgKGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgaWYgKHF1YW50aXphdGlvbi5kdHlwZSA9PT0gJ3VpbnQ4JyB8fCBxdWFudGl6YXRpb24uZHR5cGUgPT09ICd1aW50MTYnKSB7XG4gICAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShxdWFudGl6ZWRBcnJheS5sZW5ndGgpO1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcXVhbnRpemVkQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHYgPSBxdWFudGl6ZWRBcnJheVtpXTtcbiAgICAgICAgICAgIHZhbHVlc1tpXSA9IHYgKiBxdWFudGl6YXRpb24uc2NhbGUgKyBxdWFudGl6YXRpb24ubWluO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChxdWFudGl6YXRpb24uZHR5cGUgPT09ICdmbG9hdDE2Jykge1xuICAgICAgICAgIGlmIChmbG9hdDE2RGVjb2RlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGZsb2F0MTZEZWNvZGUgPSBnZXRGbG9hdDE2RGVjb2RlcigpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWx1ZXMgPSBmbG9hdDE2RGVjb2RlKHF1YW50aXplZEFycmF5IGFzIFVpbnQxNkFycmF5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBxdWFudGl6YXRpb24gdHlwZSAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgIGBmb3Igd2VpZ2h0IHR5cGUgZmxvYXQzMi5gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICBpZiAocXVhbnRpemF0aW9uLmR0eXBlICE9PSAndWludDgnICYmIHF1YW50aXphdGlvbi5kdHlwZSAhPT0gJ3VpbnQxNicpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBVbnN1cHBvcnRlZCBxdWFudGl6YXRpb24gdHlwZSAke3F1YW50aXphdGlvbi5kdHlwZX0gYCArXG4gICAgICAgICAgICAgIGBmb3Igd2VpZ2h0IHR5cGUgaW50MzIuYCk7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkocXVhbnRpemVkQXJyYXkubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBxdWFudGl6ZWRBcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHYgPSBxdWFudGl6ZWRBcnJheVtpXTtcbiAgICAgICAgICB2YWx1ZXNbaV0gPSBNYXRoLnJvdW5kKHYgKiBxdWFudGl6YXRpb24uc2NhbGUgKyBxdWFudGl6YXRpb24ubWluKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkdHlwZSBpbiB3ZWlnaHQgJyR7bmFtZX0nOiAke2R0eXBlfWApO1xuICAgICAgfVxuICAgICAgb2Zmc2V0ICs9IHNpemUgKiBxdWFudGl6YXRpb25TaXplRmFjdG9yO1xuICAgIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBzaXplID0gc2l6ZUZyb21TaGFwZShzcGVjLnNoYXBlKTtcbiAgICAgIHZhbHVlcyA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICAgICAgY29uc3QgYnl0ZUxlbmd0aCA9IG5ldyBVaW50MzJBcnJheShcbiAgICAgICAgICAgIGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIE5VTV9CWVRFU19TVFJJTkdfTEVOR1RIKSlbMF07XG4gICAgICAgIG9mZnNldCArPSBOVU1fQllURVNfU1RSSU5HX0xFTkdUSDtcbiAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBieXRlTGVuZ3RoKSk7XG4gICAgICAgICh2YWx1ZXMgYXMgVWludDhBcnJheVtdKS5wdXNoKGJ5dGVzKTtcbiAgICAgICAgb2Zmc2V0ICs9IGJ5dGVMZW5ndGg7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGR0eXBlRmFjdG9yID0gRFRZUEVfVkFMVUVfU0laRV9NQVBbZHR5cGVdO1xuICAgICAgY29uc3QgYnl0ZUJ1ZmZlciA9IGJ1ZmZlci5zbGljZShvZmZzZXQsIG9mZnNldCArIHNpemUgKiBkdHlwZUZhY3Rvcik7XG5cbiAgICAgIGlmIChkdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkoYnl0ZUJ1ZmZlcik7XG4gICAgICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KGJ5dGVCdWZmZXIpO1xuICAgICAgfSBlbHNlIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgdmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheShieXRlQnVmZmVyKTtcbiAgICAgICAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBpbWFnZSA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCAvIDIpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlYWwubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICByZWFsW2ldID0gdmFsdWVzW2kgKiAyXTtcbiAgICAgICAgICBpbWFnZVtpXSA9IHZhbHVlc1tpICogMiArIDFdO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHJlYWxUZW5zb3IgPSB0ZW5zb3IocmVhbCwgc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgICAgIGNvbnN0IGltYWdlVGVuc29yID0gdGVuc29yKGltYWdlLCBzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICAgICAgb3V0W25hbWVdID0gY29tcGxleChyZWFsVGVuc29yLCBpbWFnZVRlbnNvcik7XG4gICAgICAgIHJlYWxUZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICBpbWFnZVRlbnNvci5kaXNwb3NlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGR0eXBlIGluIHdlaWdodCAnJHtuYW1lfSc6ICR7ZHR5cGV9YCk7XG4gICAgICB9XG4gICAgICBvZmZzZXQgKz0gc2l6ZSAqIGR0eXBlRmFjdG9yO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgIT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBvdXRbbmFtZV0gPSB0ZW5zb3IodmFsdWVzLCBzaGFwZSwgZHR5cGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIENvbmNhdGVuYXRlIFR5cGVkQXJyYXlzIGludG8gYW4gQXJyYXlCdWZmZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRlbmF0ZVR5cGVkQXJyYXlzKHhzOiBUeXBlZEFycmF5W10pOiBBcnJheUJ1ZmZlciB7XG4gIC8vIFRPRE8oYWRhcm9iLCBjYWlzKTogU3VwcG9ydCBxdWFudGl6YXRpb24uXG4gIGlmICh4cyA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBpbnB1dCB2YWx1ZTogJHtKU09OLnN0cmluZ2lmeSh4cyl9YCk7XG4gIH1cblxuICBsZXQgdG90YWxCeXRlTGVuZ3RoID0gMDtcblxuICAvLyBgbm9ybWFsaXplZFhzYCBpcyBoZXJlIGZvciB0aGlzIHJlYXNvbjogYSBgVHlwZWRBcnJheWAncyBgYnVmZmVyJ1xuICAvLyBjYW4gaGF2ZSBhIGRpZmZlcmVudCBieXRlIGxlbmd0aCBmcm9tIHRoYXQgb2YgdGhlIGBUeXBlZEFycmF5YCBpdHNlbGYsXG4gIC8vIGZvciBleGFtcGxlLCB3aGVuIHRoZSBgVHlwZWRBcnJheWAgaXMgY3JlYXRlZCBmcm9tIGFuIG9mZnNldCBpbiBhblxuICAvLyBgQXJyYXlCdWZmZXJgLiBgbm9ybWxpYXplZFhzYCBob2xkcyBgVHlwZWRBcnJheWBzIHdob3NlIGBidWZmZXJgcyBtYXRjaFxuICAvLyB0aGUgYFR5cGVkQXJyYXlgIGluIGJ5dGUgbGVuZ3RoLiBJZiBhbiBlbGVtZW50IG9mIGB4c2AgZG9lcyBub3Qgc2hvd1xuICAvLyB0aGlzIHByb3BlcnR5LCBhIG5ldyBgVHlwZWRBcnJheWAgdGhhdCBzYXRpc2Z5IHRoaXMgcHJvcGVydHkgd2lsbCBiZVxuICAvLyBjb25zdHJ1Y3RlZCBhbmQgcHVzaGVkIGludG8gYG5vcm1hbGl6ZWRYc2AuXG4gIGNvbnN0IG5vcm1hbGl6ZWRYczogVHlwZWRBcnJheVtdID0gW107XG4gIHhzLmZvckVhY2goKHg6IFR5cGVkQXJyYXkpID0+IHtcbiAgICB0b3RhbEJ5dGVMZW5ndGggKz0geC5ieXRlTGVuZ3RoO1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuICAgIG5vcm1hbGl6ZWRYcy5wdXNoKFxuICAgICAgICB4LmJ5dGVMZW5ndGggPT09IHguYnVmZmVyLmJ5dGVMZW5ndGggPyB4IDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3ICh4LmNvbnN0cnVjdG9yIGFzIGFueSkoeCkpO1xuICAgIGlmICghKHggYXMgYW55IGluc3RhbmNlb2YgRmxvYXQzMkFycmF5IHx8IHggYXMgYW55IGluc3RhbmNlb2YgSW50MzJBcnJheSB8fFxuICAgICAgICAgIHggYXMgYW55IGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgVHlwZWRBcnJheSBzdWJ0eXBlOiAke3guY29uc3RydWN0b3IubmFtZX1gKTtcbiAgICB9XG4gICAgLy8gdHNsaW50OmVuYWJsZTpuby1hbnlcbiAgfSk7XG5cbiAgY29uc3QgeSA9IG5ldyBVaW50OEFycmF5KHRvdGFsQnl0ZUxlbmd0aCk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBub3JtYWxpemVkWHMuZm9yRWFjaCgoeDogVHlwZWRBcnJheSkgPT4ge1xuICAgIHkuc2V0KG5ldyBVaW50OEFycmF5KHguYnVmZmVyKSwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0geC5ieXRlTGVuZ3RoO1xuICB9KTtcblxuICByZXR1cm4geS5idWZmZXI7XG59XG5cbi8vIFVzZSBCdWZmZXIgb24gTm9kZS5qcyBpbnN0ZWFkIG9mIEJsb2IvYXRvYi9idG9hXG5jb25zdCB1c2VOb2RlQnVmZmVyID0gdHlwZW9mIEJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAodHlwZW9mIEJsb2IgPT09ICd1bmRlZmluZWQnIHx8IHR5cGVvZiBhdG9iID09PSAndW5kZWZpbmVkJyB8fFxuICAgICB0eXBlb2YgYnRvYSA9PT0gJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgYnl0ZSBsZW5ndGggb2YgYSBKYXZhU2NyaXB0IHN0cmluZy5cbiAqXG4gKiBOb3RlIHRoYXQgYSBKYXZhU2NyaXB0IHN0cmluZyBjYW4gY29udGFpbiB3aWRlIGNoYXJhY3RlcnMsIHRoZXJlZm9yZSB0aGVcbiAqIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIG5vdCBuZWNlc3NhcmlseSBlcXVhbCB0byB0aGUgYnl0ZSBsZW5ndGguXG4gKlxuICogQHBhcmFtIHN0ciBJbnB1dCBzdHJpbmcuXG4gKiBAcmV0dXJucyBCeXRlIGxlbmd0aC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ0J5dGVMZW5ndGgoc3RyOiBzdHJpbmcpOiBudW1iZXIge1xuICBpZiAodXNlTm9kZUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICB9XG4gIHJldHVybiBuZXcgQmxvYihbc3RyXSkuc2l6ZTtcbn1cblxuLyoqXG4gKiBFbmNvZGUgYW4gQXJyYXlCdWZmZXIgYXMgYSBiYXNlNjQgZW5jb2RlZCBzdHJpbmcuXG4gKlxuICogQHBhcmFtIGJ1ZmZlciBgQXJyYXlCdWZmZXJgIHRvIGJlIGNvbnZlcnRlZC5cbiAqIEByZXR1cm5zIEEgc3RyaW5nIHRoYXQgYmFzZTY0LWVuY29kZXMgYGJ1ZmZlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhcnJheUJ1ZmZlclRvQmFzZTY0U3RyaW5nKGJ1ZmZlcjogQXJyYXlCdWZmZXIpOiBzdHJpbmcge1xuICBpZiAodXNlTm9kZUJ1ZmZlcikge1xuICAgIHJldHVybiBCdWZmZXIuZnJvbShidWZmZXIpLnRvU3RyaW5nKCdiYXNlNjQnKTtcbiAgfVxuICBjb25zdCBidWYgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBsZXQgcyA9ICcnO1xuICBmb3IgKGxldCBpID0gMCwgbCA9IGJ1Zi5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKTtcbiAgfVxuICByZXR1cm4gYnRvYShzKTtcbn1cblxuLyoqXG4gKiBEZWNvZGUgYSBiYXNlNjQgc3RyaW5nIGFzIGFuIEFycmF5QnVmZmVyLlxuICpcbiAqIEBwYXJhbSBzdHIgQmFzZTY0IHN0cmluZy5cbiAqIEByZXR1cm5zIERlY29kZWQgYEFycmF5QnVmZmVyYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIoc3RyOiBzdHJpbmcpOiBBcnJheUJ1ZmZlciB7XG4gIGlmICh1c2VOb2RlQnVmZmVyKSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20oc3RyLCAnYmFzZTY0Jyk7XG4gICAgcmV0dXJuIGJ1Zi5idWZmZXIuc2xpY2UoYnVmLmJ5dGVPZmZzZXQsIGJ1Zi5ieXRlT2Zmc2V0ICsgYnVmLmJ5dGVMZW5ndGgpO1xuICB9XG4gIGNvbnN0IHMgPSBhdG9iKHN0cik7XG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHMubGVuZ3RoKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzLmxlbmd0aDsgKytpKSB7XG4gICAgYnVmZmVyLnNldChbcy5jaGFyQ29kZUF0KGkpXSwgaSk7XG4gIH1cbiAgcmV0dXJuIGJ1ZmZlci5idWZmZXI7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgYSBudW1iZXIgb2YgQXJyYXlCdWZmZXJzIGludG8gb25lLlxuICpcbiAqIEBwYXJhbSBidWZmZXJzIEEgbnVtYmVyIG9mIGFycmF5IGJ1ZmZlcnMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgY29uY2F0ZW5hdGluZyBgYnVmZmVyc2AgaW4gb3JkZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhidWZmZXJzOiBBcnJheUJ1ZmZlcltdKTogQXJyYXlCdWZmZXIge1xuICBpZiAoYnVmZmVycy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYnVmZmVyc1swXTtcbiAgfVxuXG4gIGxldCB0b3RhbEJ5dGVMZW5ndGggPSAwO1xuICBidWZmZXJzLmZvckVhY2goKGJ1ZmZlcjogQXJyYXlCdWZmZXIpID0+IHtcbiAgICB0b3RhbEJ5dGVMZW5ndGggKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH0pO1xuXG4gIGNvbnN0IHRlbXAgPSBuZXcgVWludDhBcnJheSh0b3RhbEJ5dGVMZW5ndGgpO1xuICBsZXQgb2Zmc2V0ID0gMDtcbiAgYnVmZmVycy5mb3JFYWNoKChidWZmZXI6IEFycmF5QnVmZmVyKSA9PiB7XG4gICAgdGVtcC5zZXQobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSwgb2Zmc2V0KTtcbiAgICBvZmZzZXQgKz0gYnVmZmVyLmJ5dGVMZW5ndGg7XG4gIH0pO1xuICByZXR1cm4gdGVtcC5idWZmZXI7XG59XG5cbi8qKlxuICogR2V0IHRoZSBiYXNlbmFtZSBvZiBhIHBhdGguXG4gKlxuICogQmVoYXZlcyBpbiBhIHdheSBhbmFsb2dvdXMgdG8gTGludXgncyBiYXNlbmFtZSBjb21tYW5kLlxuICpcbiAqIEBwYXJhbSBwYXRoXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiYXNlbmFtZShwYXRoOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBTRVBBUkFUT1IgPSAnLyc7XG4gIHBhdGggPSBwYXRoLnRyaW0oKTtcbiAgd2hpbGUgKHBhdGguZW5kc1dpdGgoU0VQQVJBVE9SKSkge1xuICAgIHBhdGggPSBwYXRoLnNsaWNlKDAsIHBhdGgubGVuZ3RoIC0gMSk7XG4gIH1cbiAgY29uc3QgaXRlbXMgPSBwYXRoLnNwbGl0KFNFUEFSQVRPUik7XG4gIHJldHVybiBpdGVtc1tpdGVtcy5sZW5ndGggLSAxXTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYE1vZGVsSlNPTmAgZnJvbSBgTW9kZWxBcnRpZmFjdHNgLlxuICpcbiAqIEBwYXJhbSBhcnRpZmFjdHMgTW9kZWwgYXJ0aWZhY3RzLCBkZXNjcmliaW5nIHRoZSBtb2RlbCBhbmQgaXRzIHdlaWdodHMuXG4gKiBAcGFyYW0gbWFuaWZlc3QgV2VpZ2h0IG1hbmlmZXN0LCBkZXNjcmliaW5nIHdoZXJlIHRoZSB3ZWlnaHRzIG9mIHRoZVxuICogICAgIGBNb2RlbEFydGlmYWN0c2AgYXJlIHN0b3JlZCwgYW5kIHNvbWUgbWV0YWRhdGEgYWJvdXQgdGhlbS5cbiAqIEByZXR1cm5zIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGBtb2RlbC5qc29uYCBmaWxlIGRlc2NyaWJpbmcgdGhlIG1vZGVsXG4gKiAgICAgYXJ0aWZhY3RzIGFuZCB3ZWlnaHRzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0cyhcbiAgICBhcnRpZmFjdHM6IE1vZGVsQXJ0aWZhY3RzLCBtYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnKTogTW9kZWxKU09OIHtcbiAgY29uc3QgcmVzdWx0OiBNb2RlbEpTT04gPSB7XG4gICAgbW9kZWxUb3BvbG9neTogYXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3ksXG4gICAgZm9ybWF0OiBhcnRpZmFjdHMuZm9ybWF0LFxuICAgIGdlbmVyYXRlZEJ5OiBhcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgY29udmVydGVkQnk6IGFydGlmYWN0cy5jb252ZXJ0ZWRCeSxcbiAgICB3ZWlnaHRzTWFuaWZlc3Q6IG1hbmlmZXN0XG4gIH07XG4gIGlmIChhcnRpZmFjdHMuc2lnbmF0dXJlICE9IG51bGwpIHtcbiAgICByZXN1bHQuc2lnbmF0dXJlID0gYXJ0aWZhY3RzLnNpZ25hdHVyZTtcbiAgfVxuICBpZiAoYXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGEgIT0gbnVsbCkge1xuICAgIHJlc3VsdC51c2VyRGVmaW5lZE1ldGFkYXRhID0gYXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gIH1cbiAgaWYgKGFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyICE9IG51bGwpIHtcbiAgICByZXN1bHQubW9kZWxJbml0aWFsaXplciA9IGFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyO1xuICB9XG4gIGlmIChhcnRpZmFjdHMudHJhaW5pbmdDb25maWcgIT0gbnVsbCkge1xuICAgIHJlc3VsdC50cmFpbmluZ0NvbmZpZyA9IGFydGlmYWN0cy50cmFpbmluZ0NvbmZpZztcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIENyZWF0ZSBgTW9kZWxBcnRpZmFjdHNgIGZyb20gYSBKU09OIGZpbGUgYW5kIHdlaWdodHMuXG4gKlxuICogQHBhcmFtIG1vZGVsSlNPTiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIEpTT04gb2YgYG1vZGVsLmpzb25gXG4gKiBAcGFyYW0gd2VpZ2h0U3BlY3MgVGhlIGxpc3Qgb2YgV2VpZ2h0c01hbmlmZXN0RW50cnkgZm9yIHRoZSBtb2RlbC4gTXVzdCBiZVxuICogICAgIHBhc3NlZCBpZiB0aGUgbW9kZWxKU09OIGhhcyBhIHdlaWdodHNNYW5pZmVzdC5cbiAqIEBwYXJhbSB3ZWlnaHREYXRhIEFuIEFycmF5QnVmZmVyIG9mIHdlaWdodCBkYXRhIGZvciB0aGUgbW9kZWwgY29ycmVzcG9uZGluZ1xuICogICAgIHRvIHRoZSB3ZWlnaHRzIGluIHdlaWdodFNwZWNzLiBNdXN0IGJlIHBhc3NlZCBpZiB0aGUgbW9kZWxKU09OIGhhcyBhXG4gKiAgICAgd2VpZ2h0c01hbmlmZXN0LlxuICogQHJldHVybnMgQSBQcm9taXNlIG9mIHRoZSBgTW9kZWxBcnRpZmFjdHNgLCBhcyBkZXNjcmliZWQgYnkgdGhlIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTlN5bmMoXG4gICAgbW9kZWxKU09OOiBNb2RlbEpTT04sIHdlaWdodFNwZWNzPzogV2VpZ2h0c01hbmlmZXN0RW50cnlbXSxcbiAgICB3ZWlnaHREYXRhPzogQXJyYXlCdWZmZXIpOiBNb2RlbEFydGlmYWN0cyB7XG5cbiAgY29uc3QgbW9kZWxBcnRpZmFjdHM6IE1vZGVsQXJ0aWZhY3RzID0ge1xuICAgIG1vZGVsVG9wb2xvZ3k6IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5LFxuICAgIGZvcm1hdDogbW9kZWxKU09OLmZvcm1hdCxcbiAgICBnZW5lcmF0ZWRCeTogbW9kZWxKU09OLmdlbmVyYXRlZEJ5LFxuICAgIGNvbnZlcnRlZEJ5OiBtb2RlbEpTT04uY29udmVydGVkQnlcbiAgfTtcblxuICBpZiAobW9kZWxKU09OLnRyYWluaW5nQ29uZmlnICE9IG51bGwpIHtcbiAgICBtb2RlbEFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyA9IG1vZGVsSlNPTi50cmFpbmluZ0NvbmZpZztcbiAgfVxuICBpZiAobW9kZWxKU09OLndlaWdodHNNYW5pZmVzdCAhPSBudWxsKSB7XG4gICAgaWYgKCF3ZWlnaHRTcGVjcykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtb2RlbEpTT04gaGFzIHdlaWdodHNNYW5pZmVzdCBidXQgd2VpZ2h0U3BlY3MgaXMgbnVsbCcpO1xuICAgIH1cbiAgICBpZiAoIXdlaWdodERhdGEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignbW9kZWxKU09OIGhhcyB3ZWlnaHRzTWFuaWZlc3QgYnV0IHdlaWdodERhdGEgaXMgbnVsbCcpO1xuICAgIH1cbiAgICBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcyA9IHdlaWdodFNwZWNzO1xuICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEgPSB3ZWlnaHREYXRhO1xuICB9XG4gIGlmIChtb2RlbEpTT04uc2lnbmF0dXJlICE9IG51bGwpIHtcbiAgICBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgPSBtb2RlbEpTT04uc2lnbmF0dXJlO1xuICB9XG4gIGlmIChtb2RlbEpTT04udXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSA9IG1vZGVsSlNPTi51c2VyRGVmaW5lZE1ldGFkYXRhO1xuICB9XG4gIGlmIChtb2RlbEpTT04ubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgbW9kZWxBcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciA9IG1vZGVsSlNPTi5tb2RlbEluaXRpYWxpemVyO1xuICB9XG5cbiAgcmV0dXJuIG1vZGVsQXJ0aWZhY3RzO1xufVxuXG4vKipcbiAqIENyZWF0ZSBgTW9kZWxBcnRpZmFjdHNgIGZyb20gYSBKU09OIGZpbGUuXG4gKlxuICogQHBhcmFtIG1vZGVsSlNPTiBPYmplY3QgY29udGFpbmluZyB0aGUgcGFyc2VkIEpTT04gb2YgYG1vZGVsLmpzb25gXG4gKiBAcGFyYW0gbG9hZFdlaWdodHMgRnVuY3Rpb24gdGhhdCB0YWtlcyB0aGUgSlNPTiBmaWxlJ3Mgd2VpZ2h0cyBtYW5pZmVzdCxcbiAqICAgICByZWFkcyB3ZWlnaHRzIGZyb20gdGhlIGxpc3RlZCBwYXRoKHMpLCBhbmQgcmV0dXJucyBhIFByb21pc2Ugb2YgdGhlXG4gKiAgICAgd2VpZ2h0IG1hbmlmZXN0IGVudHJpZXMgYWxvbmcgd2l0aCB0aGUgd2VpZ2h0cyBkYXRhLlxuICogQHJldHVybnMgQSBQcm9taXNlIG9mIHRoZSBgTW9kZWxBcnRpZmFjdHNgLCBhcyBkZXNjcmliZWQgYnkgdGhlIEpTT04gZmlsZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihcbiAgICBtb2RlbEpTT046IE1vZGVsSlNPTixcbiAgICBsb2FkV2VpZ2h0czogKHdlaWdodHNNYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnKSA9PiBQcm9taXNlPFtcbiAgICAgIC8qIHdlaWdodFNwZWNzICovIFdlaWdodHNNYW5pZmVzdEVudHJ5W10sIC8qIHdlaWdodERhdGEgKi8gQXJyYXlCdWZmZXJcbiAgICBdPik6IFByb21pc2U8TW9kZWxBcnRpZmFjdHM+IHtcbiAgbGV0IHdlaWdodFNwZWNzOiBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdIHwgdW5kZWZpbmVkO1xuICBsZXQgd2VpZ2h0RGF0YTogQXJyYXlCdWZmZXIgfCB1bmRlZmluZWQ7XG5cbiAgaWYgKG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3QgIT0gbnVsbCkge1xuICAgIFt3ZWlnaHRTcGVjcywgd2VpZ2h0RGF0YV0gPSBhd2FpdCBsb2FkV2VpZ2h0cyhtb2RlbEpTT04ud2VpZ2h0c01hbmlmZXN0KTtcbiAgfVxuXG4gIHJldHVybiBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT05TeW5jKG1vZGVsSlNPTiwgd2VpZ2h0U3BlY3MsIHdlaWdodERhdGEpO1xufVxuXG4vKipcbiAqIFBvcHVsYXRlIE1vZGVsQXJ0aWZhY3RzSW5mbyBmaWVsZHMgZm9yIGEgbW9kZWwgd2l0aCBKU09OIHRvcG9sb2d5LlxuICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzXG4gKiBAcmV0dXJucyBBIE1vZGVsQXJ0aWZhY3RzSW5mbyBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cyk6XG4gICAgTW9kZWxBcnRpZmFjdHNJbmZvIHtcbiAgaWYgKG1vZGVsQXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgSlNPTiBtb2RlbCB0b3BvbG9neSwgcmVjZWl2ZWQgQXJyYXlCdWZmZXIuJyk7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRhdGVTYXZlZDogbmV3IERhdGUoKSxcbiAgICBtb2RlbFRvcG9sb2d5VHlwZTogJ0pTT04nLFxuICAgIG1vZGVsVG9wb2xvZ3lCeXRlczogbW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSA9PSBudWxsID9cbiAgICAgICAgMCA6XG4gICAgICAgIHN0cmluZ0J5dGVMZW5ndGgoSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSkpLFxuICAgIHdlaWdodFNwZWNzQnl0ZXM6IG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID09IG51bGwgP1xuICAgICAgICAwIDpcbiAgICAgICAgc3RyaW5nQnl0ZUxlbmd0aChKU09OLnN0cmluZ2lmeShtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcykpLFxuICAgIHdlaWdodERhdGFCeXRlczogbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSA9PSBudWxsID9cbiAgICAgICAgMCA6XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEuYnl0ZUxlbmd0aCxcbiAgfTtcbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSB0aGUgd2VpZ2h0cyBzdG9yZWQgaW4gYSBXZWlnaHRzTWFuaWZlc3RDb25maWcgaW50byBhIGxpc3Qgb2ZcbiAqIFdlaWdodHNNYW5pZmVzdEVudHJ5XG4gKlxuICogQHBhcmFtIHdlaWdodHNNYW5pZmVzdCBUaGUgV2VpZ2h0c01hbmlmZXN0Q29uZmlnIHRvIGV4dHJhY3Qgd2VpZ2h0cyBmcm9tLlxuICogQHJldHVybnMgQSBsaXN0IG9mIFdlaWdodHNNYW5pZmVzdEVudHJ5IG9mIHRoZSB3ZWlnaHRzIGluIHRoZSB3ZWlnaHRzTWFuaWZlc3RcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFdlaWdodFNwZWNzKHdlaWdodHNNYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnKTpcbiAgICBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdIHtcbiAgY29uc3Qgd2VpZ2h0U3BlY3M6IFdlaWdodHNNYW5pZmVzdEVudHJ5W10gPSBbXTtcbiAgZm9yIChjb25zdCBlbnRyeSBvZiB3ZWlnaHRzTWFuaWZlc3QpIHtcbiAgICB3ZWlnaHRTcGVjcy5wdXNoKC4uLmVudHJ5LndlaWdodHMpO1xuICB9XG4gIHJldHVybiB3ZWlnaHRTcGVjcztcbn1cblxuLyoqXG4gKiBDb21wdXRlcyBtYW50aXNhIHRhYmxlIGZvciBjYXN0aW5nIEZsb2F0MTYgdG8gRmxvYXQzMlxuICogU2VlIGh0dHA6Ly93d3cuZm94LXRvb2xraXQub3JnL2Z0cC9mYXN0aGFsZmZsb2F0Y29udmVyc2lvbi5wZGZcbiAqXG4gKiBAcmV0dXJucyBVaW50MzJBcnJheSwgMjA0OCBtYW50aXNzYSBsb29rdXAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxvYXQxNk1hbnRpc2FUYWJsZSgpOiBVaW50MzJBcnJheSB7XG4gIGNvbnN0IGNvbnZlcnRNYW50aXNzYSA9IChpOiBudW1iZXIpOiBudW1iZXIgPT4ge1xuICAgIGxldCBtID0gaSA8PCAxMztcbiAgICBsZXQgZSA9IDA7XG5cbiAgICB3aGlsZSAoKG0gJiAweDAwODAwMDAwKSA9PT0gMCkge1xuICAgICAgZSAtPSAweDAwODAwMDAwO1xuICAgICAgbSA8PD0gMTtcbiAgICB9XG4gICAgbSAmPSB+MHgwMDgwMDAwMDtcbiAgICBlICs9IDB4Mzg4MDAwMDA7XG5cbiAgICByZXR1cm4gbSB8IGU7XG4gIH07XG5cbiAgY29uc3QgbWFudGlzYVRhYmxlID0gbmV3IFVpbnQzMkFycmF5KDIwNDgpO1xuXG4gIG1hbnRpc2FUYWJsZVswXSA9IDA7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgMTAyNDsgaSsrKSB7XG4gICAgbWFudGlzYVRhYmxlW2ldID0gY29udmVydE1hbnRpc3NhKGkpO1xuICB9XG4gIGZvciAobGV0IGkgPSAxMDI0OyBpIDwgMjA0ODsgaSsrKSB7XG4gICAgbWFudGlzYVRhYmxlW2ldID0gMHgzODAwMDAwMCArICgoaSAtIDEwMjQpIDw8IDEzKTtcbiAgfVxuXG4gIHJldHVybiBtYW50aXNhVGFibGU7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnQgdGFibGUgZm9yIGNhc3RpbmcgRmxvYXQxNiB0byBGbG9hdDMyXG4gKiBTZWUgaHR0cDovL3d3dy5mb3gtdG9vbGtpdC5vcmcvZnRwL2Zhc3RoYWxmZmxvYXRjb252ZXJzaW9uLnBkZlxuICpcbiAqIEByZXR1cm5zIFVpbnQzMkFycmF5LCA2NCBleHBvbmVudCBsb29rdXAgdmFsdWVzLlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmxvYXQxNkV4cG9uZW50VGFibGUoKTogVWludDMyQXJyYXkge1xuICBjb25zdCBleHBvbmVudFRhYmxlID0gbmV3IFVpbnQzMkFycmF5KDY0KTtcblxuICBleHBvbmVudFRhYmxlWzBdID0gMDtcbiAgZXhwb25lbnRUYWJsZVszMV0gPSAweDQ3ODAwMDAwO1xuICBleHBvbmVudFRhYmxlWzMyXSA9IDB4ODAwMDAwMDA7XG4gIGV4cG9uZW50VGFibGVbNjNdID0gMHhjNzgwMDAwMDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCAzMTsgaSsrKSB7XG4gICAgZXhwb25lbnRUYWJsZVtpXSA9IGkgPDwgMjM7XG4gIH1cbiAgZm9yIChsZXQgaSA9IDMzOyBpIDwgNjM7IGkrKykge1xuICAgIGV4cG9uZW50VGFibGVbaV0gPSAweDgwMDAwMDAwICsgKChpIC0gMzIpIDw8IDIzKTtcbiAgfVxuXG4gIHJldHVybiBleHBvbmVudFRhYmxlO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIG9mZnNldCB0YWJsZSBmb3IgY2FzdGluZyBGbG9hdDE2IHRvIEZsb2F0MzJcbiAqIFNlZSBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXG4gKlxuICogQHJldHVybnMgVWludDMyQXJyYXksIDZkIG9mZnNldCB2YWx1ZXMuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVGbG9hdDE2T2Zmc2V0VGFibGUoKTogVWludDMyQXJyYXkge1xuICBjb25zdCBvZmZzZXRUYWJsZSA9IG5ldyBVaW50MzJBcnJheSg2NCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCA2NDsgaSsrKSB7XG4gICAgb2Zmc2V0VGFibGVbaV0gPSAxMDI0O1xuICB9XG4gIG9mZnNldFRhYmxlWzBdID0gb2Zmc2V0VGFibGVbMzJdID0gMDtcblxuICByZXR1cm4gb2Zmc2V0VGFibGU7XG59XG5cbi8qKlxuICogUmV0cmlldmUgYSBGbG9hdDE2IGRlY29kZXIgd2hpY2ggd2lsbCBkZWNvZGUgYSBCeXRlQXJyYXkgb2YgRmxvYXQxNiB2YWx1ZXNcbiAqIHRvIGEgRmxvYXQzMkFycmF5LlxuICpcbiAqIEByZXR1cm5zIEZ1bmN0aW9uIChidWZmZXI6IFVpbnQxNkFycmF5KSA9PiBGbG9hdDMyQXJyYXkgd2hpY2ggZGVjb2Rlc1xuICogICAgICAgICAgdGhlIFVpbnQxNkFycmF5IG9mIEZsb2F0MTYgYnl0ZXMgdG8gYSBGbG9hdDMyQXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbG9hdDE2RGVjb2RlcigpOiAoYnVmZmVyOiBVaW50MTZBcnJheSkgPT4gRmxvYXQzMkFycmF5IHtcbiAgLy8gQWxnb3JpdGhtIGlzIGJhc2VkIG9mZiBvZlxuICAvLyBodHRwOi8vd3d3LmZveC10b29sa2l0Lm9yZy9mdHAvZmFzdGhhbGZmbG9hdGNvbnZlcnNpb24ucGRmXG5cbiAgLy8gQ2FjaGUgbG9va3VwIHRhYmxlc1xuICBjb25zdCBtYW50aXNhVGFibGUgPSBjb21wdXRlRmxvYXQxNk1hbnRpc2FUYWJsZSgpO1xuICBjb25zdCBleHBvbmVudFRhYmxlID0gY29tcHV0ZUZsb2F0MTZFeHBvbmVudFRhYmxlKCk7XG4gIGNvbnN0IG9mZnNldFRhYmxlID0gY29tcHV0ZUZsb2F0MTZPZmZzZXRUYWJsZSgpO1xuXG4gIHJldHVybiAocXVhbnRpemVkQXJyYXk6IFVpbnQxNkFycmF5KSA9PiB7XG4gICAgY29uc3QgYnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKDQgKiBxdWFudGl6ZWRBcnJheS5sZW5ndGgpO1xuICAgIGNvbnN0IGJ1ZmZlclVpbnQzMlZpZXcgPSBuZXcgVWludDMyQXJyYXkoYnVmZmVyKTtcbiAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcXVhbnRpemVkQXJyYXkubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICBjb25zdCBmbG9hdDE2Qml0cyA9IHF1YW50aXplZEFycmF5W2luZGV4XTtcbiAgICAgIGNvbnN0IGZsb2F0MzJCaXRzID1cbiAgICAgICAgICBtYW50aXNhVGFibGVbb2Zmc2V0VGFibGVbZmxvYXQxNkJpdHMgPj4gMTBdICsgKGZsb2F0MTZCaXRzICYgMHgzZmYpXSArXG4gICAgICAgICAgZXhwb25lbnRUYWJsZVtmbG9hdDE2Qml0cyA+PiAxMF07XG4gICAgICBidWZmZXJVaW50MzJWaWV3W2luZGV4XSA9IGZsb2F0MzJCaXRzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZsb2F0MzJBcnJheShidWZmZXIpO1xuICB9O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class IORouterRegistry {\n    constructor() {\n        this.saveRouters = [];\n        this.loadRouters = [];\n    }\n    static getInstance() {\n        if (IORouterRegistry.instance == null) {\n            IORouterRegistry.instance = new IORouterRegistry();\n        }\n        return IORouterRegistry.instance;\n    }\n    /**\n     * Register a save-handler router.\n     *\n     * @param saveRouter A function that maps a URL-like string onto an instance\n     * of `IOHandler` with the `save` method defined or `null`.\n     */\n    static registerSaveRouter(saveRouter) {\n        IORouterRegistry.getInstance().saveRouters.push(saveRouter);\n    }\n    /**\n     * Register a load-handler router.\n     *\n     * @param loadRouter A function that maps a URL-like string onto an instance\n     * of `IOHandler` with the `load` method defined or `null`.\n     */\n    static registerLoadRouter(loadRouter) {\n        IORouterRegistry.getInstance().loadRouters.push(loadRouter);\n    }\n    /**\n     * Look up IOHandler for saving, given a URL-like string.\n     *\n     * @param url\n     * @returns If only one match is found, an instance of IOHandler with the\n     * `save` method defined. If no match is found, `null`.\n     * @throws Error, if more than one match is found.\n     */\n    static getSaveHandlers(url) {\n        return IORouterRegistry.getHandlers(url, 'save');\n    }\n    /**\n     * Look up IOHandler for loading, given a URL-like string.\n     *\n     * @param url\n     * @param loadOptions Optional, custom load options.\n     * @returns All valid handlers for `url`, given the currently registered\n     *   handler routers.\n     */\n    static getLoadHandlers(url, loadOptions) {\n        return IORouterRegistry.getHandlers(url, 'load', loadOptions);\n    }\n    static getHandlers(url, handlerType, loadOptions) {\n        const validHandlers = [];\n        const routers = handlerType === 'load' ?\n            IORouterRegistry.getInstance().loadRouters :\n            IORouterRegistry.getInstance().saveRouters;\n        routers.forEach(router => {\n            const handler = router(url, loadOptions);\n            if (handler !== null) {\n                validHandlers.push(handler);\n            }\n        });\n        return validHandlers;\n    }\n}\nexport const registerSaveRouter = (loudRouter) => IORouterRegistry.registerSaveRouter(loudRouter);\nexport const registerLoadRouter = (loudRouter) => IORouterRegistry.registerLoadRouter(loudRouter);\nexport const getSaveHandlers = (url) => IORouterRegistry.getSaveHandlers(url);\nexport const getLoadHandlers = (url, loadOptions) => IORouterRegistry.getLoadHandlers(url, loadOptions);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyX3JlZ2lzdHJ5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9pby9yb3V0ZXJfcmVnaXN0cnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBT0gsTUFBTSxPQUFPLGdCQUFnQjtJQU8zQjtRQUNFLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO0lBQ3hCLENBQUM7SUFFTyxNQUFNLENBQUMsV0FBVztRQUN4QixJQUFJLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDckMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztTQUNwRDtRQUNELE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFvQjtRQUM1QyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxVQUFvQjtRQUM1QyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzlELENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsTUFBTSxDQUFDLGVBQWUsQ0FBQyxHQUFvQjtRQUN6QyxPQUFPLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLEdBQW9CLEVBQUUsV0FBeUI7UUFFcEUsT0FBTyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRSxDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVcsQ0FDdEIsR0FBb0IsRUFBRSxXQUEwQixFQUNoRCxXQUF5QjtRQUMzQixNQUFNLGFBQWEsR0FBZ0IsRUFBRSxDQUFDO1FBQ3RDLE1BQU0sT0FBTyxHQUFHLFdBQVcsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNwQyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUM1QyxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDL0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUN2QixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDcEIsYUFBYSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzthQUM3QjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxhQUFhLENBQUM7SUFDdkIsQ0FBQztDQUNGO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxVQUFvQixFQUFFLEVBQUUsQ0FDdkQsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxVQUFvQixFQUFFLEVBQUUsQ0FDdkQsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLENBQUMsR0FBb0IsRUFBRSxFQUFFLENBQ3BELGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUMxQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQ3hCLENBQUMsR0FBb0IsRUFBRSxXQUF5QixFQUFFLEVBQUUsQ0FDaEQsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJT0hhbmRsZXIsIExvYWRPcHRpb25zfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IHR5cGUgSU9Sb3V0ZXIgPSAodXJsOiBzdHJpbmd8c3RyaW5nW10sIGxvYWRPcHRpb25zPzogTG9hZE9wdGlvbnMpID0+XG4gICAgSU9IYW5kbGVyO1xuXG5leHBvcnQgY2xhc3MgSU9Sb3V0ZXJSZWdpc3RyeSB7XG4gIC8vIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IElPUm91dGVyUmVnaXN0cnk7XG5cbiAgcHJpdmF0ZSBzYXZlUm91dGVyczogSU9Sb3V0ZXJbXTtcbiAgcHJpdmF0ZSBsb2FkUm91dGVyczogSU9Sb3V0ZXJbXTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuc2F2ZVJvdXRlcnMgPSBbXTtcbiAgICB0aGlzLmxvYWRSb3V0ZXJzID0gW107XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBnZXRJbnN0YW5jZSgpOiBJT1JvdXRlclJlZ2lzdHJ5IHtcbiAgICBpZiAoSU9Sb3V0ZXJSZWdpc3RyeS5pbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICBJT1JvdXRlclJlZ2lzdHJ5Lmluc3RhbmNlID0gbmV3IElPUm91dGVyUmVnaXN0cnkoKTtcbiAgICB9XG4gICAgcmV0dXJuIElPUm91dGVyUmVnaXN0cnkuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBzYXZlLWhhbmRsZXIgcm91dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gc2F2ZVJvdXRlciBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIFVSTC1saWtlIHN0cmluZyBvbnRvIGFuIGluc3RhbmNlXG4gICAqIG9mIGBJT0hhbmRsZXJgIHdpdGggdGhlIGBzYXZlYCBtZXRob2QgZGVmaW5lZCBvciBgbnVsbGAuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJTYXZlUm91dGVyKHNhdmVSb3V0ZXI6IElPUm91dGVyKSB7XG4gICAgSU9Sb3V0ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLnNhdmVSb3V0ZXJzLnB1c2goc2F2ZVJvdXRlcik7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSBsb2FkLWhhbmRsZXIgcm91dGVyLlxuICAgKlxuICAgKiBAcGFyYW0gbG9hZFJvdXRlciBBIGZ1bmN0aW9uIHRoYXQgbWFwcyBhIFVSTC1saWtlIHN0cmluZyBvbnRvIGFuIGluc3RhbmNlXG4gICAqIG9mIGBJT0hhbmRsZXJgIHdpdGggdGhlIGBsb2FkYCBtZXRob2QgZGVmaW5lZCBvciBgbnVsbGAuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXJMb2FkUm91dGVyKGxvYWRSb3V0ZXI6IElPUm91dGVyKSB7XG4gICAgSU9Sb3V0ZXJSZWdpc3RyeS5nZXRJbnN0YW5jZSgpLmxvYWRSb3V0ZXJzLnB1c2gobG9hZFJvdXRlcik7XG4gIH1cblxuICAvKipcbiAgICogTG9vayB1cCBJT0hhbmRsZXIgZm9yIHNhdmluZywgZ2l2ZW4gYSBVUkwtbGlrZSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB1cmxcbiAgICogQHJldHVybnMgSWYgb25seSBvbmUgbWF0Y2ggaXMgZm91bmQsIGFuIGluc3RhbmNlIG9mIElPSGFuZGxlciB3aXRoIHRoZVxuICAgKiBgc2F2ZWAgbWV0aG9kIGRlZmluZWQuIElmIG5vIG1hdGNoIGlzIGZvdW5kLCBgbnVsbGAuXG4gICAqIEB0aHJvd3MgRXJyb3IsIGlmIG1vcmUgdGhhbiBvbmUgbWF0Y2ggaXMgZm91bmQuXG4gICAqL1xuICBzdGF0aWMgZ2V0U2F2ZUhhbmRsZXJzKHVybDogc3RyaW5nfHN0cmluZ1tdKTogSU9IYW5kbGVyW10ge1xuICAgIHJldHVybiBJT1JvdXRlclJlZ2lzdHJ5LmdldEhhbmRsZXJzKHVybCwgJ3NhdmUnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rIHVwIElPSGFuZGxlciBmb3IgbG9hZGluZywgZ2l2ZW4gYSBVUkwtbGlrZSBzdHJpbmcuXG4gICAqXG4gICAqIEBwYXJhbSB1cmxcbiAgICogQHBhcmFtIGxvYWRPcHRpb25zIE9wdGlvbmFsLCBjdXN0b20gbG9hZCBvcHRpb25zLlxuICAgKiBAcmV0dXJucyBBbGwgdmFsaWQgaGFuZGxlcnMgZm9yIGB1cmxgLCBnaXZlbiB0aGUgY3VycmVudGx5IHJlZ2lzdGVyZWRcbiAgICogICBoYW5kbGVyIHJvdXRlcnMuXG4gICAqL1xuICBzdGF0aWMgZ2V0TG9hZEhhbmRsZXJzKHVybDogc3RyaW5nfHN0cmluZ1tdLCBsb2FkT3B0aW9ucz86IExvYWRPcHRpb25zKTpcbiAgICAgIElPSGFuZGxlcltdIHtcbiAgICByZXR1cm4gSU9Sb3V0ZXJSZWdpc3RyeS5nZXRIYW5kbGVycyh1cmwsICdsb2FkJywgbG9hZE9wdGlvbnMpO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGF0aWMgZ2V0SGFuZGxlcnMoXG4gICAgICB1cmw6IHN0cmluZ3xzdHJpbmdbXSwgaGFuZGxlclR5cGU6ICdzYXZlJ3wnbG9hZCcsXG4gICAgICBsb2FkT3B0aW9ucz86IExvYWRPcHRpb25zKTogSU9IYW5kbGVyW10ge1xuICAgIGNvbnN0IHZhbGlkSGFuZGxlcnM6IElPSGFuZGxlcltdID0gW107XG4gICAgY29uc3Qgcm91dGVycyA9IGhhbmRsZXJUeXBlID09PSAnbG9hZCcgP1xuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkubG9hZFJvdXRlcnMgOlxuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkuc2F2ZVJvdXRlcnM7XG4gICAgcm91dGVycy5mb3JFYWNoKHJvdXRlciA9PiB7XG4gICAgICBjb25zdCBoYW5kbGVyID0gcm91dGVyKHVybCwgbG9hZE9wdGlvbnMpO1xuICAgICAgaWYgKGhhbmRsZXIgIT09IG51bGwpIHtcbiAgICAgICAgdmFsaWRIYW5kbGVycy5wdXNoKGhhbmRsZXIpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiB2YWxpZEhhbmRsZXJzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCByZWdpc3RlclNhdmVSb3V0ZXIgPSAobG91ZFJvdXRlcjogSU9Sb3V0ZXIpID0+XG4gICAgSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIobG91ZFJvdXRlcik7XG5leHBvcnQgY29uc3QgcmVnaXN0ZXJMb2FkUm91dGVyID0gKGxvdWRSb3V0ZXI6IElPUm91dGVyKSA9PlxuICAgIElPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGxvdWRSb3V0ZXIpO1xuZXhwb3J0IGNvbnN0IGdldFNhdmVIYW5kbGVycyA9ICh1cmw6IHN0cmluZ3xzdHJpbmdbXSkgPT5cbiAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldFNhdmVIYW5kbGVycyh1cmwpO1xuZXhwb3J0IGNvbnN0IGdldExvYWRIYW5kbGVycyA9XG4gICAgKHVybDogc3RyaW5nfHN0cmluZ1tdLCBsb2FkT3B0aW9ucz86IExvYWRPcHRpb25zKSA9PlxuICAgICAgICBJT1JvdXRlclJlZ2lzdHJ5LmdldExvYWRIYW5kbGVycyh1cmwsIGxvYWRPcHRpb25zKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport '../flags';\nimport { env } from '../environment';\nimport { getModelArtifactsInfoForJSON } from './io_utils';\nimport { IORouterRegistry } from './router_registry';\nconst DATABASE_NAME = 'tensorflowjs';\nconst DATABASE_VERSION = 1;\n// Model data and ModelArtifactsInfo (metadata) are stored in two separate\n// stores for efficient access of the list of stored models and their metadata.\n// 1. The object store for model data: topology, weights and weight manifests.\nconst MODEL_STORE_NAME = 'models_store';\n// 2. The object store for ModelArtifactsInfo, including meta-information such\n//    as the type of topology (JSON vs binary), byte size of the topology, byte\n//    size of the weights, etc.\nconst INFO_STORE_NAME = 'model_info_store';\n/**\n * Delete the entire database for tensorflow.js, including the models store.\n */\nexport async function deleteDatabase() {\n    const idbFactory = getIndexedDBFactory();\n    return new Promise((resolve, reject) => {\n        const deleteRequest = idbFactory.deleteDatabase(DATABASE_NAME);\n        deleteRequest.onsuccess = () => resolve();\n        deleteRequest.onerror = error => reject(error);\n    });\n}\nfunction getIndexedDBFactory() {\n    if (!env().getBool('IS_BROWSER')) {\n        // TODO(cais): Add more info about what IOHandler subtypes are available.\n        //   Maybe point to a doc page on the web and/or automatically determine\n        //   the available IOHandlers and print them in the error message.\n        throw new Error('Failed to obtain IndexedDB factory because the current environment' +\n            'is not a web browser.');\n    }\n    // tslint:disable-next-line:no-any\n    const theWindow = typeof window === 'undefined' ? self : window;\n    const factory = theWindow.indexedDB || theWindow.mozIndexedDB ||\n        theWindow.webkitIndexedDB || theWindow.msIndexedDB ||\n        theWindow.shimIndexedDB;\n    if (factory == null) {\n        throw new Error('The current browser does not appear to support IndexedDB.');\n    }\n    return factory;\n}\nfunction setUpDatabase(openRequest) {\n    const db = openRequest.result;\n    db.createObjectStore(MODEL_STORE_NAME, { keyPath: 'modelPath' });\n    db.createObjectStore(INFO_STORE_NAME, { keyPath: 'modelPath' });\n}\n/**\n * IOHandler subclass: Browser IndexedDB.\n *\n * See the doc string of `browserIndexedDB` for more details.\n */\nexport class BrowserIndexedDB {\n    constructor(modelPath) {\n        this.indexedDB = getIndexedDBFactory();\n        if (modelPath == null || !modelPath) {\n            throw new Error('For IndexedDB, modelPath must not be null, undefined or empty.');\n        }\n        this.modelPath = modelPath;\n    }\n    async save(modelArtifacts) {\n        // TODO(cais): Support saving GraphDef models.\n        if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n            throw new Error('BrowserLocalStorage.save() does not support saving model topology ' +\n                'in binary formats yet.');\n        }\n        return this.databaseAction(this.modelPath, modelArtifacts);\n    }\n    async load() {\n        return this.databaseAction(this.modelPath);\n    }\n    /**\n     * Perform database action to put model artifacts into or read model artifacts\n     * from IndexedDB object store.\n     *\n     * Whether the action is put or get depends on whether `modelArtifacts` is\n     * specified. If it is specified, the action will be put; otherwise the action\n     * will be get.\n     *\n     * @param modelPath A unique string path for the model.\n     * @param modelArtifacts If specified, it will be the model artifacts to be\n     *   stored in IndexedDB.\n     * @returns A `Promise` of `SaveResult`, if the action is put, or a `Promise`\n     *   of `ModelArtifacts`, if the action is get.\n     */\n    databaseAction(modelPath, modelArtifacts) {\n        return new Promise((resolve, reject) => {\n            const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n            openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n            openRequest.onsuccess = () => {\n                const db = openRequest.result;\n                if (modelArtifacts == null) {\n                    // Read model out from object store.\n                    const modelTx = db.transaction(MODEL_STORE_NAME, 'readonly');\n                    const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n                    const getRequest = modelStore.get(this.modelPath);\n                    getRequest.onsuccess = () => {\n                        if (getRequest.result == null) {\n                            db.close();\n                            return reject(new Error(`Cannot find model with path '${this.modelPath}' ` +\n                                `in IndexedDB.`));\n                        }\n                        else {\n                            resolve(getRequest.result.modelArtifacts);\n                        }\n                    };\n                    getRequest.onerror = error => {\n                        db.close();\n                        return reject(getRequest.error);\n                    };\n                    modelTx.oncomplete = () => db.close();\n                }\n                else {\n                    // Put model into object store.\n                    const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n                    // First, put ModelArtifactsInfo into info store.\n                    const infoTx = db.transaction(INFO_STORE_NAME, 'readwrite');\n                    let infoStore = infoTx.objectStore(INFO_STORE_NAME);\n                    const putInfoRequest = infoStore.put({ modelPath: this.modelPath, modelArtifactsInfo });\n                    let modelTx;\n                    putInfoRequest.onsuccess = () => {\n                        // Second, put model data into model store.\n                        modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite');\n                        const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n                        const putModelRequest = modelStore.put({\n                            modelPath: this.modelPath,\n                            modelArtifacts,\n                            modelArtifactsInfo\n                        });\n                        putModelRequest.onsuccess = () => resolve({ modelArtifactsInfo });\n                        putModelRequest.onerror = error => {\n                            // If the put-model request fails, roll back the info entry as\n                            // well.\n                            infoStore = infoTx.objectStore(INFO_STORE_NAME);\n                            const deleteInfoRequest = infoStore.delete(this.modelPath);\n                            deleteInfoRequest.onsuccess = () => {\n                                db.close();\n                                return reject(putModelRequest.error);\n                            };\n                            deleteInfoRequest.onerror = error => {\n                                db.close();\n                                return reject(putModelRequest.error);\n                            };\n                        };\n                    };\n                    putInfoRequest.onerror = error => {\n                        db.close();\n                        return reject(putInfoRequest.error);\n                    };\n                    infoTx.oncomplete = () => {\n                        if (modelTx == null) {\n                            db.close();\n                        }\n                        else {\n                            modelTx.oncomplete = () => db.close();\n                        }\n                    };\n                }\n            };\n            openRequest.onerror = error => reject(openRequest.error);\n        });\n    }\n}\nBrowserIndexedDB.URL_SCHEME = 'indexeddb://';\nexport const indexedDBRouter = (url) => {\n    if (!env().getBool('IS_BROWSER')) {\n        return null;\n    }\n    else {\n        if (!Array.isArray(url) && url.startsWith(BrowserIndexedDB.URL_SCHEME)) {\n            return browserIndexedDB(url.slice(BrowserIndexedDB.URL_SCHEME.length));\n        }\n        else {\n            return null;\n        }\n    }\n};\nIORouterRegistry.registerSaveRouter(indexedDBRouter);\nIORouterRegistry.registerLoadRouter(indexedDBRouter);\n/**\n * Creates a browser IndexedDB IOHandler for saving and loading models.\n *\n * ```js\n * const model = tf.sequential();\n * model.add(\n *     tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'}));\n *\n * const saveResult = await model.save('indexeddb://MyModel'));\n * console.log(saveResult);\n * ```\n *\n * @param modelPath A unique identifier for the model to be saved. Must be a\n *   non-empty string.\n * @returns An instance of `BrowserIndexedDB` (sublcass of `IOHandler`),\n *   which can be used with, e.g., `tf.Model.save`.\n */\nexport function browserIndexedDB(modelPath) {\n    return new BrowserIndexedDB(modelPath);\n}\nfunction maybeStripScheme(key) {\n    return key.startsWith(BrowserIndexedDB.URL_SCHEME) ?\n        key.slice(BrowserIndexedDB.URL_SCHEME.length) :\n        key;\n}\nexport class BrowserIndexedDBManager {\n    constructor() {\n        this.indexedDB = getIndexedDBFactory();\n    }\n    async listModels() {\n        return new Promise((resolve, reject) => {\n            const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n            openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n            openRequest.onsuccess = () => {\n                const db = openRequest.result;\n                const tx = db.transaction(INFO_STORE_NAME, 'readonly');\n                const store = tx.objectStore(INFO_STORE_NAME);\n                // tslint:disable:max-line-length\n                // Need to cast `store` as `any` here because TypeScript's DOM\n                // library does not have the `getAll()` method even though the\n                // method is supported in the latest version of most mainstream\n                // browsers:\n                // https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/getAll\n                // tslint:enable:max-line-length\n                // tslint:disable-next-line:no-any\n                const getAllInfoRequest = store.getAll();\n                getAllInfoRequest.onsuccess = () => {\n                    const out = {};\n                    for (const item of getAllInfoRequest.result) {\n                        out[item.modelPath] = item.modelArtifactsInfo;\n                    }\n                    resolve(out);\n                };\n                getAllInfoRequest.onerror = error => {\n                    db.close();\n                    return reject(getAllInfoRequest.error);\n                };\n                tx.oncomplete = () => db.close();\n            };\n            openRequest.onerror = error => reject(openRequest.error);\n        });\n    }\n    async removeModel(path) {\n        path = maybeStripScheme(path);\n        return new Promise((resolve, reject) => {\n            const openRequest = this.indexedDB.open(DATABASE_NAME, DATABASE_VERSION);\n            openRequest.onupgradeneeded = () => setUpDatabase(openRequest);\n            openRequest.onsuccess = () => {\n                const db = openRequest.result;\n                const infoTx = db.transaction(INFO_STORE_NAME, 'readwrite');\n                const infoStore = infoTx.objectStore(INFO_STORE_NAME);\n                const getInfoRequest = infoStore.get(path);\n                let modelTx;\n                getInfoRequest.onsuccess = () => {\n                    if (getInfoRequest.result == null) {\n                        db.close();\n                        return reject(new Error(`Cannot find model with path '${path}' ` +\n                            `in IndexedDB.`));\n                    }\n                    else {\n                        // First, delete the entry in the info store.\n                        const deleteInfoRequest = infoStore.delete(path);\n                        const deleteModelData = () => {\n                            // Second, delete the entry in the model store.\n                            modelTx = db.transaction(MODEL_STORE_NAME, 'readwrite');\n                            const modelStore = modelTx.objectStore(MODEL_STORE_NAME);\n                            const deleteModelRequest = modelStore.delete(path);\n                            deleteModelRequest.onsuccess = () => resolve(getInfoRequest.result.modelArtifactsInfo);\n                            deleteModelRequest.onerror = error => reject(getInfoRequest.error);\n                        };\n                        // Proceed with deleting model data regardless of whether deletion\n                        // of info data succeeds or not.\n                        deleteInfoRequest.onsuccess = deleteModelData;\n                        deleteInfoRequest.onerror = error => {\n                            deleteModelData();\n                            db.close();\n                            return reject(getInfoRequest.error);\n                        };\n                    }\n                };\n                getInfoRequest.onerror = error => {\n                    db.close();\n                    return reject(getInfoRequest.error);\n                };\n                infoTx.oncomplete = () => {\n                    if (modelTx == null) {\n                        db.close();\n                    }\n                    else {\n                        modelTx.oncomplete = () => db.close();\n                    }\n                };\n            };\n            openRequest.onerror = error => reject(openRequest.error);\n        });\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXhlZF9kYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vaW5kZXhlZF9kYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLFVBQVUsQ0FBQztBQUVsQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3hELE9BQU8sRUFBVyxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzdELE1BQU0sYUFBYSxHQUFHLGNBQWMsQ0FBQztBQUNyQyxNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQiwwRUFBMEU7QUFDMUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSxNQUFNLGdCQUFnQixHQUFHLGNBQWMsQ0FBQztBQUN4Qyw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLCtCQUErQjtBQUMvQixNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztBQUUzQzs7R0FFRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsY0FBYztJQUNsQyxNQUFNLFVBQVUsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO0lBRXpDLE9BQU8sSUFBSSxPQUFPLENBQU8sQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEVBQUU7UUFDM0MsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLGNBQWMsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMvRCxhQUFhLENBQUMsU0FBUyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQzFDLGFBQWEsQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxtQkFBbUI7SUFDMUIsSUFBSSxD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QUMsRUFBRSxDQUNqQyxNQUFNLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO3dCQUNuQyxDQUFDLENBQUM7d0JBQ0Ysa0VBQWtFO3dCQUNsRSxnQ0FBZ0M7d0JBQ2hDLGlCQUFpQixDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7d0JBQzlDLGlCQUFpQixDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRTs0QkFDbEMsZUFBZSxFQUFFLENBQUM7NEJBQ2xCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs0QkFDWCxPQUFPLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7d0JBQ3RDLENBQUMsQ0FBQztxQkFDSDtnQkFDSCxDQUFDLENBQUM7Z0JBQ0YsY0FBYyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRTtvQkFDL0IsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO29CQUNYLE9BQU8sTUFBTSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFDO2dCQUVGLE1BQU0sQ0FBQyxVQUFVLEdBQUcsR0FBRyxFQUFFO29CQUN2QixJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7d0JBQ25CLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDWjt5QkFBTTt3QkFDTCxPQUFPLENBQUMsVUFBVSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztxQkFDdkM7Z0JBQ0gsQ0FBQyxDQUFDO1lBQ0osQ0FBQyxDQUFDO1lBQ0YsV0FBVyxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAnLi4vZmxhZ3MnO1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge2dldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT059IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHtJT1JvdXRlciwgSU9Sb3V0ZXJSZWdpc3RyeX0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuaW1wb3J0IHtJT0hhbmRsZXIsIE1vZGVsQXJ0aWZhY3RzLCBNb2RlbEFydGlmYWN0c0luZm8sIE1vZGVsU3RvcmVNYW5hZ2VyLCBTYXZlUmVzdWx0fSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgREFUQUJBU0VfTkFNRSA9ICd0ZW5zb3JmbG93anMnO1xuY29uc3QgREFUQUJBU0VfVkVSU0lPTiA9IDE7XG5cbi8vIE1vZGVsIGRhdGEgYW5kIE1vZGVsQXJ0aWZhY3RzSW5mbyAobWV0YWRhdGEpIGFyZSBzdG9yZWQgaW4gdHdvIHNlcGFyYXRlXG4vLyBzdG9yZXMgZm9yIGVmZmljaWVudCBhY2Nlc3Mgb2YgdGhlIGxpc3Qgb2Ygc3RvcmVkIG1vZGVscyBhbmQgdGhlaXIgbWV0YWRhdGEuXG4vLyAxLiBUaGUgb2JqZWN0IHN0b3JlIGZvciBtb2RlbCBkYXRhOiB0b3BvbG9neSwgd2VpZ2h0cyBhbmQgd2VpZ2h0IG1hbmlmZXN0cy5cbmNvbnN0IE1PREVMX1NUT1JFX05BTUUgPSAnbW9kZWxzX3N0b3JlJztcbi8vIDIuIFRoZSBvYmplY3Qgc3RvcmUgZm9yIE1vZGVsQXJ0aWZhY3RzSW5mbywgaW5jbHVkaW5nIG1ldGEtaW5mb3JtYXRpb24gc3VjaFxuLy8gICAgYXMgdGhlIHR5cGUgb2YgdG9wb2xvZ3kgKEpTT04gdnMgYmluYXJ5KSwgYnl0ZSBzaXplIG9mIHRoZSB0b3BvbG9neSwgYnl0ZVxuLy8gICAgc2l6ZSBvZiB0aGUgd2VpZ2h0cywgZXRjLlxuY29uc3QgSU5GT19TVE9SRV9OQU1FID0gJ21vZGVsX2luZm9fc3RvcmUnO1xuXG4vKipcbiAqIERlbGV0ZSB0aGUgZW50aXJlIGRhdGFiYXNlIGZvciB0ZW5zb3JmbG93LmpzLCBpbmNsdWRpbmcgdGhlIG1vZGVscyBzdG9yZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGRlbGV0ZURhdGFiYXNlKCk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBpZGJGYWN0b3J5ID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuXG4gIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgZGVsZXRlUmVxdWVzdCA9IGlkYkZhY3RvcnkuZGVsZXRlRGF0YWJhc2UoREFUQUJBU0VfTkFNRSk7XG4gICAgZGVsZXRlUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgZGVsZXRlUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4gcmVqZWN0KGVycm9yKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGdldEluZGV4ZWREQkZhY3RvcnkoKTogSURCRmFjdG9yeSB7XG4gIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIG1vcmUgaW5mbyBhYm91dCB3aGF0IElPSGFuZGxlciBzdWJ0eXBlcyBhcmUgYXZhaWxhYmxlLlxuICAgIC8vICAgTWF5YmUgcG9pbnQgdG8gYSBkb2MgcGFnZSBvbiB0aGUgd2ViIGFuZC9vciBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgIC8vICAgdGhlIGF2YWlsYWJsZSBJT0hhbmRsZXJzIGFuZCBwcmludCB0aGVtIGluIHRoZSBlcnJvciBtZXNzYWdlLlxuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ZhaWxlZCB0byBvYnRhaW4gSW5kZXhlZERCIGZhY3RvcnkgYmVjYXVzZSB0aGUgY3VycmVudCBlbnZpcm9ubWVudCcgK1xuICAgICAgICAnaXMgbm90IGEgd2ViIGJyb3dzZXIuJyk7XG4gIH1cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjb25zdCB0aGVXaW5kb3c6IGFueSA9IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHdpbmRvdztcbiAgY29uc3QgZmFjdG9yeSA9IHRoZVdpbmRvdy5pbmRleGVkREIgfHwgdGhlV2luZG93Lm1vekluZGV4ZWREQiB8fFxuICAgICAgdGhlV2luZG93LndlYmtpdEluZGV4ZWREQiB8fCB0aGVXaW5kb3cubXNJbmRleGVkREIgfHxcbiAgICAgIHRoZVdpbmRvdy5zaGltSW5kZXhlZERCO1xuICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVGhlIGN1cnJlbnQgYnJvd3NlciBkb2VzIG5vdCBhcHBlYXIgdG8gc3VwcG9ydCBJbmRleGVkREIuJyk7XG4gIH1cbiAgcmV0dXJuIGZhY3Rvcnk7XG59XG5cbmZ1bmN0aW9uIHNldFVwRGF0YWJhc2Uob3BlblJlcXVlc3Q6IElEQlJlcXVlc3QpIHtcbiAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQgYXMgSURCRGF0YWJhc2U7XG4gIGRiLmNyZWF0ZU9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUsIHtrZXlQYXRoOiAnbW9kZWxQYXRoJ30pO1xuICBkYi5jcmVhdGVPYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUsIHtrZXlQYXRoOiAnbW9kZWxQYXRoJ30pO1xufVxuXG4vKipcbiAqIElPSGFuZGxlciBzdWJjbGFzczogQnJvd3NlciBJbmRleGVkREIuXG4gKlxuICogU2VlIHRoZSBkb2Mgc3RyaW5nIG9mIGBicm93c2VySW5kZXhlZERCYCBmb3IgbW9yZSBkZXRhaWxzLlxuICovXG5leHBvcnQgY2xhc3MgQnJvd3NlckluZGV4ZWREQiBpbXBsZW1lbnRzIElPSGFuZGxlciB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpbmRleGVkREI6IElEQkZhY3Rvcnk7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RlbFBhdGg6IHN0cmluZztcblxuICBzdGF0aWMgcmVhZG9ubHkgVVJMX1NDSEVNRSA9ICdpbmRleGVkZGI6Ly8nO1xuXG4gIGNvbnN0cnVjdG9yKG1vZGVsUGF0aDogc3RyaW5nKSB7XG4gICAgdGhpcy5pbmRleGVkREIgPSBnZXRJbmRleGVkREJGYWN0b3J5KCk7XG5cbiAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgIW1vZGVsUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdGb3IgSW5kZXhlZERCLCBtb2RlbFBhdGggbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yIGVtcHR5LicpO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsUGF0aCA9IG1vZGVsUGF0aDtcbiAgfVxuXG4gIGFzeW5jIHNhdmUobW9kZWxBcnRpZmFjdHM6IE1vZGVsQXJ0aWZhY3RzKTogUHJvbWlzZTxTYXZlUmVzdWx0PiB7XG4gICAgLy8gVE9ETyhjYWlzKTogU3VwcG9ydCBzYXZpbmcgR3JhcGhEZWYgbW9kZWxzLlxuICAgIGlmIChtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQnJvd3NlckxvY2FsU3RvcmFnZS5zYXZlKCkgZG9lcyBub3Qgc3VwcG9ydCBzYXZpbmcgbW9kZWwgdG9wb2xvZ3kgJyArXG4gICAgICAgICAgJ2luIGJpbmFyeSBmb3JtYXRzIHlldC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUFjdGlvbih0aGlzLm1vZGVsUGF0aCwgbW9kZWxBcnRpZmFjdHMpIGFzXG4gICAgICAgIFByb21pc2U8U2F2ZVJlc3VsdD47XG4gIH1cblxuICBhc3luYyBsb2FkKCk6IFByb21pc2U8TW9kZWxBcnRpZmFjdHM+IHtcbiAgICByZXR1cm4gdGhpcy5kYXRhYmFzZUFjdGlvbih0aGlzLm1vZGVsUGF0aCkgYXMgUHJvbWlzZTxNb2RlbEFydGlmYWN0cz47XG4gIH1cblxuICAvKipcbiAgICogUGVyZm9ybSBkYXRhYmFzZSBhY3Rpb24gdG8gcHV0IG1vZGVsIGFydGlmYWN0cyBpbnRvIG9yIHJlYWQgbW9kZWwgYXJ0aWZhY3RzXG4gICAqIGZyb20gSW5kZXhlZERCIG9iamVjdCBzdG9yZS5cbiAgICpcbiAgICogV2hldGhlciB0aGUgYWN0aW9uIGlzIHB1dCBvciBnZXQgZGVwZW5kcyBvbiB3aGV0aGVyIGBtb2RlbEFydGlmYWN0c2AgaXNcbiAgICogc3BlY2lmaWVkLiBJZiBpdCBpcyBzcGVjaWZpZWQsIHRoZSBhY3Rpb24gd2lsbCBiZSBwdXQ7IG90aGVyd2lzZSB0aGUgYWN0aW9uXG4gICAqIHdpbGwgYmUgZ2V0LlxuICAgKlxuICAgKiBAcGFyYW0gbW9kZWxQYXRoIEEgdW5pcXVlIHN0cmluZyBwYXRoIGZvciB0aGUgbW9kZWwuXG4gICAqIEBwYXJhbSBtb2RlbEFydGlmYWN0cyBJZiBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGhlIG1vZGVsIGFydGlmYWN0cyB0byBiZVxuICAgKiAgIHN0b3JlZCBpbiBJbmRleGVkREIuXG4gICAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mIGBTYXZlUmVzdWx0YCwgaWYgdGhlIGFjdGlvbiBpcyBwdXQsIG9yIGEgYFByb21pc2VgXG4gICAqICAgb2YgYE1vZGVsQXJ0aWZhY3RzYCwgaWYgdGhlIGFjdGlvbiBpcyBnZXQuXG4gICAqL1xuICBwcml2YXRlIGRhdGFiYXNlQWN0aW9uKG1vZGVsUGF0aDogc3RyaW5nLCBtb2RlbEFydGlmYWN0cz86IE1vZGVsQXJ0aWZhY3RzKTpcbiAgICAgIFByb21pc2U8TW9kZWxBcnRpZmFjdHN8U2F2ZVJlc3VsdD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTxNb2RlbEFydGlmYWN0c3xTYXZlUmVzdWx0PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvcGVuUmVxdWVzdCA9IHRoaXMuaW5kZXhlZERCLm9wZW4oREFUQUJBU0VfTkFNRSwgREFUQUJBU0VfVkVSU0lPTik7XG4gICAgICBvcGVuUmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiBzZXRVcERhdGFiYXNlKG9wZW5SZXF1ZXN0KTtcblxuICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYiA9IG9wZW5SZXF1ZXN0LnJlc3VsdDtcblxuICAgICAgICBpZiAobW9kZWxBcnRpZmFjdHMgPT0gbnVsbCkge1xuICAgICAgICAgIC8vIFJlYWQgbW9kZWwgb3V0IGZyb20gb2JqZWN0IHN0b3JlLlxuICAgICAgICAgIGNvbnN0IG1vZGVsVHggPSBkYi50cmFuc2FjdGlvbihNT0RFTF9TVE9SRV9OQU1FLCAncmVhZG9ubHknKTtcbiAgICAgICAgICBjb25zdCBtb2RlbFN0b3JlID0gbW9kZWxUeC5vYmplY3RTdG9yZShNT0RFTF9TVE9SRV9OQU1FKTtcbiAgICAgICAgICBjb25zdCBnZXRSZXF1ZXN0ID0gbW9kZWxTdG9yZS5nZXQodGhpcy5tb2RlbFBhdGgpO1xuICAgICAgICAgIGdldFJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGdldFJlcXVlc3QucmVzdWx0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kZWwgd2l0aCBwYXRoICcke3RoaXMubW9kZWxQYXRofScgYCArXG4gICAgICAgICAgICAgICAgICBgaW4gSW5kZXhlZERCLmApKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHJlc29sdmUoZ2V0UmVxdWVzdC5yZXN1bHQubW9kZWxBcnRpZmFjdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgZ2V0UmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0UmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBtb2RlbFR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIFB1dCBtb2RlbCBpbnRvIG9iamVjdCBzdG9yZS5cbiAgICAgICAgICBjb25zdCBtb2RlbEFydGlmYWN0c0luZm86IE1vZGVsQXJ0aWZhY3RzSW5mbyA9XG4gICAgICAgICAgICAgIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04obW9kZWxBcnRpZmFjdHMpO1xuICAgICAgICAgIC8vIEZpcnN0LCBwdXQgTW9kZWxBcnRpZmFjdHNJbmZvIGludG8gaW5mbyBzdG9yZS5cbiAgICAgICAgICBjb25zdCBpbmZvVHggPSBkYi50cmFuc2FjdGlvbihJTkZPX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICBsZXQgaW5mb1N0b3JlID0gaW5mb1R4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgY29uc3QgcHV0SW5mb1JlcXVlc3QgPVxuICAgICAgICAgICAgICBpbmZvU3RvcmUucHV0KHttb2RlbFBhdGg6IHRoaXMubW9kZWxQYXRoLCBtb2RlbEFydGlmYWN0c0luZm99KTtcbiAgICAgICAgICBsZXQgbW9kZWxUeDogSURCVHJhbnNhY3Rpb247XG4gICAgICAgICAgcHV0SW5mb1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgLy8gU2Vjb25kLCBwdXQgbW9kZWwgZGF0YSBpbnRvIG1vZGVsIHN0b3JlLlxuICAgICAgICAgICAgbW9kZWxUeCA9IGRiLnRyYW5zYWN0aW9uKE1PREVMX1NUT1JFX05BTUUsICdyZWFkd3JpdGUnKTtcbiAgICAgICAgICAgIGNvbnN0IG1vZGVsU3RvcmUgPSBtb2RlbFR4Lm9iamVjdFN0b3JlKE1PREVMX1NUT1JFX05BTUUpO1xuICAgICAgICAgICAgY29uc3QgcHV0TW9kZWxSZXF1ZXN0ID0gbW9kZWxTdG9yZS5wdXQoe1xuICAgICAgICAgICAgICBtb2RlbFBhdGg6IHRoaXMubW9kZWxQYXRoLFxuICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cyxcbiAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHNJbmZvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHB1dE1vZGVsUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiByZXNvbHZlKHttb2RlbEFydGlmYWN0c0luZm99KTtcbiAgICAgICAgICAgIHB1dE1vZGVsUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAvLyBJZiB0aGUgcHV0LW1vZGVsIHJlcXVlc3QgZmFpbHMsIHJvbGwgYmFjayB0aGUgaW5mbyBlbnRyeSBhc1xuICAgICAgICAgICAgICAvLyB3ZWxsLlxuICAgICAgICAgICAgICBpbmZvU3RvcmUgPSBpbmZvVHgub2JqZWN0U3RvcmUoSU5GT19TVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgY29uc3QgZGVsZXRlSW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZGVsZXRlKHRoaXMubW9kZWxQYXRoKTtcbiAgICAgICAgICAgICAgZGVsZXRlSW5mb1JlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChwdXRNb2RlbFJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChwdXRNb2RlbFJlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICB9O1xuICAgICAgICAgIHB1dEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChwdXRJbmZvUmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpbmZvVHgub25jb21wbGV0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgIGlmIChtb2RlbFR4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG1vZGVsVHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3Qob3BlblJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBpbmRleGVkREJSb3V0ZXI6IElPUm91dGVyID0gKHVybDogc3RyaW5nfHN0cmluZ1tdKSA9PiB7XG4gIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHVybCkgJiYgdXJsLnN0YXJ0c1dpdGgoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FKSkge1xuICAgICAgcmV0dXJuIGJyb3dzZXJJbmRleGVkREIodXJsLnNsaWNlKEJyb3dzZXJJbmRleGVkREIuVVJMX1NDSEVNRS5sZW5ndGgpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG59O1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlclNhdmVSb3V0ZXIoaW5kZXhlZERCUm91dGVyKTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJMb2FkUm91dGVyKGluZGV4ZWREQlJvdXRlcik7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGJyb3dzZXIgSW5kZXhlZERCIElPSGFuZGxlciBmb3Igc2F2aW5nIGFuZCBsb2FkaW5nIG1vZGVscy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQoXG4gKiAgICAgdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gYXdhaXQgbW9kZWwuc2F2ZSgnaW5kZXhlZGRiOi8vTXlNb2RlbCcpKTtcbiAqIGNvbnNvbGUubG9nKHNhdmVSZXN1bHQpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG1vZGVsUGF0aCBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgbW9kZWwgdG8gYmUgc2F2ZWQuIE11c3QgYmUgYVxuICogICBub24tZW1wdHkgc3RyaW5nLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgYEJyb3dzZXJJbmRleGVkREJgIChzdWJsY2FzcyBvZiBgSU9IYW5kbGVyYCksXG4gKiAgIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGgsIGUuZy4sIGB0Zi5Nb2RlbC5zYXZlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJyb3dzZXJJbmRleGVkREIobW9kZWxQYXRoOiBzdHJpbmcpOiBJT0hhbmRsZXIge1xuICByZXR1cm4gbmV3IEJyb3dzZXJJbmRleGVkREIobW9kZWxQYXRoKTtcbn1cblxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXk6IHN0cmluZykge1xuICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FKSA/XG4gICAgICBrZXkuc2xpY2UoQnJvd3NlckluZGV4ZWREQi5VUkxfU0NIRU1FLmxlbmd0aCkgOlxuICAgICAga2V5O1xufVxuXG5leHBvcnQgY2xhc3MgQnJvd3NlckluZGV4ZWREQk1hbmFnZXIgaW1wbGVtZW50cyBNb2RlbFN0b3JlTWFuYWdlciB7XG4gIHByaXZhdGUgaW5kZXhlZERCOiBJREJGYWN0b3J5O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaW5kZXhlZERCID0gZ2V0SW5kZXhlZERCRmFjdG9yeSgpO1xuICB9XG5cbiAgYXN5bmMgbGlzdE1vZGVscygpOiBQcm9taXNlPHtbcGF0aDogc3RyaW5nXTogTW9kZWxBcnRpZmFjdHNJbmZvfT4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx7W3BhdGg6IHN0cmluZ106IE1vZGVsQXJ0aWZhY3RzSW5mb30+KFxuICAgICAgICAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgY29uc3Qgb3BlblJlcXVlc3QgPVxuICAgICAgICAgICAgICB0aGlzLmluZGV4ZWREQi5vcGVuKERBVEFCQVNFX05BTUUsIERBVEFCQVNFX1ZFUlNJT04pO1xuICAgICAgICAgIG9wZW5SZXF1ZXN0Lm9udXBncmFkZW5lZWRlZCA9ICgpID0+IHNldFVwRGF0YWJhc2Uob3BlblJlcXVlc3QpO1xuXG4gICAgICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGIgPSBvcGVuUmVxdWVzdC5yZXN1bHQ7XG4gICAgICAgICAgICBjb25zdCB0eCA9IGRiLnRyYW5zYWN0aW9uKElORk9fU1RPUkVfTkFNRSwgJ3JlYWRvbmx5Jyk7XG4gICAgICAgICAgICBjb25zdCBzdG9yZSA9IHR4Lm9iamVjdFN0b3JlKElORk9fU1RPUkVfTkFNRSk7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTptYXgtbGluZS1sZW5ndGhcbiAgICAgICAgICAgIC8vIE5lZWQgdG8gY2FzdCBgc3RvcmVgIGFzIGBhbnlgIGhlcmUgYmVjYXVzZSBUeXBlU2NyaXB0J3MgRE9NXG4gICAgICAgICAgICAvLyBsaWJyYXJ5IGRvZXMgbm90IGhhdmUgdGhlIGBnZXRBbGwoKWAgbWV0aG9kIGV2ZW4gdGhvdWdoIHRoZVxuICAgICAgICAgICAgLy8gbWV0aG9kIGlzIHN1cHBvcnRlZCBpbiB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgbW9zdCBtYWluc3RyZWFtXG4gICAgICAgICAgICAvLyBicm93c2VyczpcbiAgICAgICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JREJPYmplY3RTdG9yZS9nZXRBbGxcbiAgICAgICAgICAgIC8vIHRzbGludDplbmFibGU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgICBjb25zdCBnZXRBbGxJbmZvUmVxdWVzdCA9IChzdG9yZSBhcyBhbnkpLmdldEFsbCgpIGFzIElEQlJlcXVlc3Q7XG4gICAgICAgICAgICBnZXRBbGxJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IG91dDoge1twYXRoOiBzdHJpbmddOiBNb2RlbEFydGlmYWN0c0luZm99ID0ge307XG4gICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBnZXRBbGxJbmZvUmVxdWVzdC5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBvdXRbaXRlbS5tb2RlbFBhdGhdID0gaXRlbS5tb2RlbEFydGlmYWN0c0luZm87XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzb2x2ZShvdXQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGdldEFsbEluZm9SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiB7XG4gICAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0QWxsSW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHR4Lm9uY29tcGxldGUgPSAoKSA9PiBkYi5jbG9zZSgpO1xuICAgICAgICAgIH07XG4gICAgICAgICAgb3BlblJlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHJlamVjdChvcGVuUmVxdWVzdC5lcnJvcik7XG4gICAgICAgIH0pO1xuICB9XG5cbiAgYXN5bmMgcmVtb3ZlTW9kZWwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxNb2RlbEFydGlmYWN0c0luZm8+IHtcbiAgICBwYXRoID0gbWF5YmVTdHJpcFNjaGVtZShwYXRoKTtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8TW9kZWxBcnRpZmFjdHNJbmZvPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBjb25zdCBvcGVuUmVxdWVzdCA9IHRoaXMuaW5kZXhlZERCLm9wZW4oREFUQUJBU0VfTkFNRSwgREFUQUJBU0VfVkVSU0lPTik7XG4gICAgICBvcGVuUmVxdWVzdC5vbnVwZ3JhZGVuZWVkZWQgPSAoKSA9PiBzZXRVcERhdGFiYXNlKG9wZW5SZXF1ZXN0KTtcblxuICAgICAgb3BlblJlcXVlc3Qub25zdWNjZXNzID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBkYiA9IG9wZW5SZXF1ZXN0LnJlc3VsdDtcbiAgICAgICAgY29uc3QgaW5mb1R4ID0gZGIudHJhbnNhY3Rpb24oSU5GT19TVE9SRV9OQU1FLCAncmVhZHdyaXRlJyk7XG4gICAgICAgIGNvbnN0IGluZm9TdG9yZSA9IGluZm9UeC5vYmplY3RTdG9yZShJTkZPX1NUT1JFX05BTUUpO1xuXG4gICAgICAgIGNvbnN0IGdldEluZm9SZXF1ZXN0ID0gaW5mb1N0b3JlLmdldChwYXRoKTtcbiAgICAgICAgbGV0IG1vZGVsVHg6IElEQlRyYW5zYWN0aW9uO1xuICAgICAgICBnZXRJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PiB7XG4gICAgICAgICAgaWYgKGdldEluZm9SZXF1ZXN0LnJlc3VsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHJlamVjdChuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgYENhbm5vdCBmaW5kIG1vZGVsIHdpdGggcGF0aCAnJHtwYXRofScgYCArXG4gICAgICAgICAgICAgICAgYGluIEluZGV4ZWREQi5gKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZpcnN0LCBkZWxldGUgdGhlIGVudHJ5IGluIHRoZSBpbmZvIHN0b3JlLlxuICAgICAgICAgICAgY29uc3QgZGVsZXRlSW5mb1JlcXVlc3QgPSBpbmZvU3RvcmUuZGVsZXRlKHBhdGgpO1xuICAgICAgICAgICAgY29uc3QgZGVsZXRlTW9kZWxEYXRhID0gKCkgPT4ge1xuICAgICAgICAgICAgICAvLyBTZWNvbmQsIGRlbGV0ZSB0aGUgZW50cnkgaW4gdGhlIG1vZGVsIHN0b3JlLlxuICAgICAgICAgICAgICBtb2RlbFR4ID0gZGIudHJhbnNhY3Rpb24oTU9ERUxfU1RPUkVfTkFNRSwgJ3JlYWR3cml0ZScpO1xuICAgICAgICAgICAgICBjb25zdCBtb2RlbFN0b3JlID0gbW9kZWxUeC5vYmplY3RTdG9yZShNT0RFTF9TVE9SRV9OQU1FKTtcbiAgICAgICAgICAgICAgY29uc3QgZGVsZXRlTW9kZWxSZXF1ZXN0ID0gbW9kZWxTdG9yZS5kZWxldGUocGF0aCk7XG4gICAgICAgICAgICAgIGRlbGV0ZU1vZGVsUmVxdWVzdC5vbnN1Y2Nlc3MgPSAoKSA9PlxuICAgICAgICAgICAgICAgICAgcmVzb2x2ZShnZXRJbmZvUmVxdWVzdC5yZXN1bHQubW9kZWxBcnRpZmFjdHNJbmZvKTtcbiAgICAgICAgICAgICAgZGVsZXRlTW9kZWxSZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PlxuICAgICAgICAgICAgICAgICAgcmVqZWN0KGdldEluZm9SZXF1ZXN0LmVycm9yKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICAvLyBQcm9jZWVkIHdpdGggZGVsZXRpbmcgbW9kZWwgZGF0YSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgZGVsZXRpb25cbiAgICAgICAgICAgIC8vIG9mIGluZm8gZGF0YSBzdWNjZWVkcyBvciBub3QuXG4gICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbnN1Y2Nlc3MgPSBkZWxldGVNb2RlbERhdGE7XG4gICAgICAgICAgICBkZWxldGVJbmZvUmVxdWVzdC5vbmVycm9yID0gZXJyb3IgPT4ge1xuICAgICAgICAgICAgICBkZWxldGVNb2RlbERhdGEoKTtcbiAgICAgICAgICAgICAgZGIuY2xvc2UoKTtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChnZXRJbmZvUmVxdWVzdC5lcnJvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgZ2V0SW5mb1JlcXVlc3Qub25lcnJvciA9IGVycm9yID0+IHtcbiAgICAgICAgICBkYi5jbG9zZSgpO1xuICAgICAgICAgIHJldHVybiByZWplY3QoZ2V0SW5mb1JlcXVlc3QuZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGluZm9UeC5vbmNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgICAgIGlmIChtb2RlbFR4ID09IG51bGwpIHtcbiAgICAgICAgICAgIGRiLmNsb3NlKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1vZGVsVHgub25jb21wbGV0ZSA9ICgpID0+IGRiLmNsb3NlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIG9wZW5SZXF1ZXN0Lm9uZXJyb3IgPSBlcnJvciA9PiByZWplY3Qob3BlblJlcXVlc3QuZXJyb3IpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport '../flags';\nimport { env } from '../environment';\nimport { assert } from '../util';\nimport { arrayBufferToBase64String, base64StringToArrayBuffer, getModelArtifactsInfoForJSON } from './io_utils';\nimport { IORouterRegistry } from './router_registry';\nconst PATH_SEPARATOR = '/';\nconst PATH_PREFIX = 'tensorflowjs_models';\nconst INFO_SUFFIX = 'info';\nconst MODEL_TOPOLOGY_SUFFIX = 'model_topology';\nconst WEIGHT_SPECS_SUFFIX = 'weight_specs';\nconst WEIGHT_DATA_SUFFIX = 'weight_data';\nconst MODEL_METADATA_SUFFIX = 'model_metadata';\n/**\n * Purge all tensorflow.js-saved model artifacts from local storage.\n *\n * @returns Paths of the models purged.\n */\nexport function purgeLocalStorageArtifacts() {\n    if (!env().getBool('IS_BROWSER') || typeof window === 'undefined' ||\n        typeof window.localStorage === 'undefined') {\n        throw new Error('purgeLocalStorageModels() cannot proceed because local storage is ' +\n            'unavailable in the current environment.');\n    }\n    const LS = window.localStorage;\n    const purgedModelPaths = [];\n    for (let i = 0; i < LS.length; ++i) {\n        const key = LS.key(i);\n        const prefix = PATH_PREFIX + PATH_SEPARATOR;\n        if (key.startsWith(prefix) && key.length > prefix.length) {\n            LS.removeItem(key);\n            const modelName = getModelPathFromKey(key);\n            if (purgedModelPaths.indexOf(modelName) === -1) {\n                purgedModelPaths.push(modelName);\n            }\n        }\n    }\n    return purgedModelPaths;\n}\nfunction getModelKeys(path) {\n    return {\n        info: [PATH_PREFIX, path, INFO_SUFFIX].join(PATH_SEPARATOR),\n        topology: [PATH_PREFIX, path, MODEL_TOPOLOGY_SUFFIX].join(PATH_SEPARATOR),\n        weightSpecs: [PATH_PREFIX, path, WEIGHT_SPECS_SUFFIX].join(PATH_SEPARATOR),\n        weightData: [PATH_PREFIX, path, WEIGHT_DATA_SUFFIX].join(PATH_SEPARATOR),\n        modelMetadata: [PATH_PREFIX, path, MODEL_METADATA_SUFFIX].join(PATH_SEPARATOR)\n    };\n}\nfunction removeItems(keys) {\n    for (const key of Object.values(keys)) {\n        window.localStorage.removeItem(key);\n    }\n}\n/**\n * Get model path from a local-storage key.\n *\n * E.g., 'tensorflowjs_models/my/model/1/info' --> 'my/model/1'\n *\n * @param key\n */\nfunction getModelPathFromKey(key) {\n    const items = key.split(PATH_SEPARATOR);\n    if (items.length < 3) {\n        throw new Error(`Invalid key format: ${key}`);\n    }\n    return items.slice(1, items.length - 1).join(PATH_SEPARATOR);\n}\nfunction maybeStripScheme(key) {\n    return key.startsWith(BrowserLocalStorage.URL_SCHEME) ?\n        key.slice(BrowserLocalStorage.URL_SCHEME.length) :\n        key;\n}\n/**\n * IOHandler subclass: Browser Local Storage.\n *\n * See the doc string to `browserLocalStorage` for more details.\n */\nexport class BrowserLocalStorage {\n    constructor(modelPath) {\n        if (!env().getBool('IS_BROWSER') || typeof window === 'undefined' ||\n            typeof window.localStorage === 'undefined') {\n            // TODO(cais): Add more info about what IOHandler subtypes are\n            // available.\n            //   Maybe point to a doc page on the web and/or automatically determine\n            //   the available IOHandlers and print them in the error message.\n            throw new Error('The current environment does not support local storage.');\n        }\n        this.LS = window.localStorage;\n        if (modelPath == null || !modelPath) {\n            throw new Error('For local storage, modelPath must not be null, undefined or empty.');\n        }\n        this.modelPath = modelPath;\n        this.keys = getModelKeys(this.modelPath);\n    }\n    /**\n     * Save model artifacts to browser local storage.\n     *\n     * See the documentation to `browserLocalStorage` for details on the saved\n     * artifacts.\n     *\n     * @param modelArtifacts The model artifacts to be stored.\n     * @returns An instance of SaveResult.\n     */\n    async save(modelArtifacts) {\n        if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n            throw new Error('BrowserLocalStorage.save() does not support saving model topology ' +\n                'in binary formats yet.');\n        }\n        else {\n            const topology = JSON.stringify(modelArtifacts.modelTopology);\n            const weightSpecs = JSON.stringify(modelArtifacts.weightSpecs);\n            const modelArtifactsInfo = getModelArtifactsInfoForJSON(modelArtifacts);\n            try {\n                this.LS.setItem(this.keys.info, JSON.stringify(modelArtifactsInfo));\n                this.LS.setItem(this.keys.topology, topology);\n                this.LS.setItem(this.keys.weightSpecs, weightSpecs);\n                this.LS.setItem(this.keys.weightData, arrayBufferToBase64String(modelArtifacts.weightData));\n                // Note that JSON.stringify doesn't write out keys that have undefined\n                // values, so for some keys, we set undefined instead of a null-ish\n                // value.\n                const metadata = {\n                    format: modelArtifacts.format,\n                    generatedBy: modelArtifacts.generatedBy,\n                    convertedBy: modelArtifacts.convertedBy,\n                    signature: modelArtifacts.signature != null ?\n                        modelArtifacts.signature :\n                        undefined,\n                    userDefinedMetadata: modelArtifacts.userDefinedMetadata != null ?\n                        modelArtifacts.userDefinedMetadata :\n                        undefined,\n                    modelInitializer: modelArtifacts.modelInitializer != null ?\n                        modelArtifacts.modelInitializer :\n                        undefined,\n                    trainingConfig: modelArtifacts.trainingConfig != null ?\n                        modelArtifacts.trainingConfig :\n                        undefined\n                };\n                this.LS.setItem(this.keys.modelMetadata, JSON.stringify(metadata));\n                return { modelArtifactsInfo };\n            }\n            catch (err) {\n                // If saving failed, clean up all items saved so far.\n                removeItems(this.keys);\n                throw new Error(`Failed to save model '${this.modelPath}' to local storage: ` +\n                    `size quota being exceeded is a possible cause of this failure: ` +\n                    `modelTopologyBytes=${modelArtifactsInfo.modelTopologyBytes}, ` +\n                    `weightSpecsBytes=${modelArtifactsInfo.weightSpecsBytes}, ` +\n                    `weightDataBytes=${modelArtifactsInfo.weightDataBytes}.`);\n            }\n        }\n    }\n    /**\n     * Load a model from local storage.\n     *\n     * See the documentation to `browserLocalStorage` for details on the saved\n     * artifacts.\n     *\n     * @returns The loaded model (if loading succeeds).\n     */\n    async load() {\n        const info = JSON.parse(this.LS.getItem(this.keys.info));\n        if (info == null) {\n            throw new Error(`In local storage, there is no model with name '${this.modelPath}'`);\n        }\n        if (info.modelTopologyType !== 'JSON') {\n            throw new Error('BrowserLocalStorage does not support loading non-JSON model ' +\n                'topology yet.');\n        }\n        const out = {};\n        // Load topology.\n        const topology = JSON.parse(this.LS.getItem(this.keys.topology));\n        if (topology == null) {\n            throw new Error(`In local storage, the topology of model '${this.modelPath}' ` +\n                `is missing.`);\n        }\n        out.modelTopology = topology;\n        // Load weight specs.\n        const weightSpecs = JSON.parse(this.LS.getItem(this.keys.weightSpecs));\n        if (weightSpecs == null) {\n            throw new Error(`In local storage, the weight specs of model '${this.modelPath}' ` +\n                `are missing.`);\n        }\n        out.weightSpecs = weightSpecs;\n        // Load meta-data fields.\n        const metadataString = this.LS.getItem(this.keys.modelMetadata);\n        if (metadataString != null) {\n            const metadata = JSON.parse(metadataString);\n            out.format = metadata.format;\n            out.generatedBy = metadata.generatedBy;\n            out.convertedBy = metadata.convertedBy;\n            if (metadata.signature != null) {\n                out.signature = metadata.signature;\n            }\n            if (metadata.userDefinedMetadata != null) {\n                out.userDefinedMetadata = metadata.userDefinedMetadata;\n            }\n            if (metadata.modelInitializer != null) {\n                out.modelInitializer = metadata.modelInitializer;\n            }\n            if (metadata.trainingConfig != null) {\n                out.trainingConfig = metadata.trainingConfig;\n            }\n        }\n        // Load weight data.\n        const weightDataBase64 = this.LS.getItem(this.keys.weightData);\n        if (weightDataBase64 == null) {\n            throw new Error(`In local storage, the binary weight values of model ` +\n                `'${this.modelPath}' are missing.`);\n        }\n        out.weightData = base64StringToArrayBuffer(weightDataBase64);\n        return out;\n    }\n}\nBrowserLocalStorage.URL_SCHEME = 'localstorage://';\nexport const localStorageRouter = (url) => {\n    if (!env().getBool('IS_BROWSER')) {\n        return null;\n    }\n    else {\n        if (!Array.isArray(url) && url.startsWith(BrowserLocalStorage.URL_SCHEME)) {\n            return browserLocalStorage(url.slice(BrowserLocalStorage.URL_SCHEME.length));\n        }\n        else {\n            return null;\n        }\n    }\n};\nIORouterRegistry.registerSaveRouter(localStorageRouter);\nIORouterRegistry.registerLoadRouter(localStorageRouter);\n/**\n * Factory function for local storage IOHandler.\n *\n * This `IOHandler` supports both `save` and `load`.\n *\n * For each model's saved artifacts, four items are saved to local storage.\n *   - `${PATH_SEPARATOR}/${modelPath}/info`: Contains meta-info about the\n *     model, such as date saved, type of the topology, size in bytes, etc.\n *   - `${PATH_SEPARATOR}/${modelPath}/topology`: Model topology. For Keras-\n *     style models, this is a stringized JSON.\n *   - `${PATH_SEPARATOR}/${modelPath}/weight_specs`: Weight specs of the\n *     model, can be used to decode the saved binary weight values (see\n *     item below).\n *   - `${PATH_SEPARATOR}/${modelPath}/weight_data`: Concatenated binary\n *     weight values, stored as a base64-encoded string.\n *\n * Saving may throw an `Error` if the total size of the artifacts exceed the\n * browser-specific quota.\n *\n * @param modelPath A unique identifier for the model to be saved. Must be a\n *   non-empty string.\n * @returns An instance of `IOHandler`, which can be used with, e.g.,\n *   `tf.Model.save`.\n */\nexport function browserLocalStorage(modelPath) {\n    return new BrowserLocalStorage(modelPath);\n}\nexport class BrowserLocalStorageManager {\n    constructor() {\n        assert(env().getBool('IS_BROWSER'), () => 'Current environment is not a web browser');\n        assert(typeof window === 'undefined' ||\n            typeof window.localStorage !== 'undefined', () => 'Current browser does not appear to support localStorage');\n        this.LS = window.localStorage;\n    }\n    async listModels() {\n        const out = {};\n        const prefix = PATH_PREFIX + PATH_SEPARATOR;\n        const suffix = PATH_SEPARATOR + INFO_SUFFIX;\n        for (let i = 0; i < this.LS.length; ++i) {\n            const key = this.LS.key(i);\n            if (key.startsWith(prefix) && key.endsWith(suffix)) {\n                const modelPath = getModelPathFromKey(key);\n                out[modelPath] = JSON.parse(this.LS.getItem(key));\n            }\n        }\n        return out;\n    }\n    async removeModel(path) {\n        path = maybeStripScheme(path);\n        const keys = getModelKeys(path);\n        if (this.LS.getItem(keys.info) == null) {\n            throw new Error(`Cannot find model at path '${path}'`);\n        }\n        const info = JSON.parse(this.LS.getItem(keys.info));\n        removeItems(keys);\n        return info;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxfc3RvcmFnZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vbG9jYWxfc3RvcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMseUJBQXlCLEVBQUUseUJBQXlCLEVBQUUsNEJBQTRCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDOUcsT0FBTyxFQUFXLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHN0QsTUFBTSxjQUFjLEdBQUcsR0FBRyxDQUFDO0FBQzNCLE1BQU0sV0FBVyxHQUFHLHFCQUFxQixDQUFDO0FBQzFDLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQztBQUMzQixNQUFNLHFCQUFxQixHQUFHLGdCQUFnQixDQUFDO0FBQy9DLE1BQU0sbUJBQW1CLEdBQUcsY0FBYyxDQUFDO0FBQzNDLE1BQU0sa0JBQWtCLEdBQUcsYUFBYSxDQUFDO0FBQ3pDLE1BQU0scUJBQXFCLEdBQUcsZ0JBQWdCLENBQUM7QUFFL0M7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXO1FBQzdELE9BQU8sTUFBTSxDQUFDLFlBQVksS0FBSyxXQUFXLEVBQUU7UUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FDWCxvRUFBb0U7WUFDcEUseUNBQXlDLENBQUMsQ0FBQztLQUNoRDtJQUNELE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDL0IsTUFBTSxnQkFBZ0IsR0FBYSxFQUFFLENB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Q0FBQyxDQUF1QixDQUFDO2FBQ3pFO1NBQ0Y7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxLQUFLLENBQUMsV0FBVyxDQUFDLElBQVk7UUFDNUIsSUFBSSxHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUU7WUFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsSUFBSSxHQUFHLENBQUMsQ0FBQztTQUN4RDtRQUNELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUF1QixDQUFDO1FBQzFFLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge2FycmF5QnVmZmVyVG9CYXNlNjRTdHJpbmcsIGJhc2U2NFN0cmluZ1RvQXJyYXlCdWZmZXIsIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT059IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHtJT1JvdXRlciwgSU9Sb3V0ZXJSZWdpc3RyeX0gZnJvbSAnLi9yb3V0ZXJfcmVnaXN0cnknO1xuaW1wb3J0IHtJT0hhbmRsZXIsIE1vZGVsQXJ0aWZhY3RzLCBNb2RlbEFydGlmYWN0c0luZm8sIE1vZGVsSlNPTiwgTW9kZWxTdG9yZU1hbmFnZXIsIFNhdmVSZXN1bHR9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBQQVRIX1NFUEFSQVRPUiA9ICcvJztcbmNvbnN0IFBBVEhfUFJFRklYID0gJ3RlbnNvcmZsb3dqc19tb2RlbHMnO1xuY29uc3QgSU5GT19TVUZGSVggPSAnaW5mbyc7XG5jb25zdCBNT0RFTF9UT1BPTE9HWV9TVUZGSVggPSAnbW9kZWxfdG9wb2xvZ3knO1xuY29uc3QgV0VJR0hUX1NQRUNTX1NVRkZJWCA9ICd3ZWlnaHRfc3BlY3MnO1xuY29uc3QgV0VJR0hUX0RBVEFfU1VGRklYID0gJ3dlaWdodF9kYXRhJztcbmNvbnN0IE1PREVMX01FVEFEQVRBX1NVRkZJWCA9ICdtb2RlbF9tZXRhZGF0YSc7XG5cbi8qKlxuICogUHVyZ2UgYWxsIHRlbnNvcmZsb3cuanMtc2F2ZWQgbW9kZWwgYXJ0aWZhY3RzIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAqXG4gKiBAcmV0dXJucyBQYXRocyBvZiB0aGUgbW9kZWxzIHB1cmdlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHB1cmdlTG9jYWxTdG9yYWdlQXJ0aWZhY3RzKCk6IHN0cmluZ1tdIHtcbiAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykgfHwgdHlwZW9mIHdpbmRvdyA9PT0gJ3VuZGVmaW5lZCcgfHxcbiAgICAgIHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3B1cmdlTG9jYWxTdG9yYWdlTW9kZWxzKCkgY2Fubm90IHByb2NlZWQgYmVjYXVzZSBsb2NhbCBzdG9yYWdlIGlzICcgK1xuICAgICAgICAndW5hdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuJyk7XG4gIH1cbiAgY29uc3QgTFMgPSB3aW5kb3cubG9jYWxTdG9yYWdlO1xuICBjb25zdCBwdXJnZWRNb2RlbFBhdGhzOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IExTLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qga2V5ID0gTFMua2V5KGkpO1xuICAgIGNvbnN0IHByZWZpeCA9IFBBVEhfUFJFRklYICsgUEFUSF9TRVBBUkFUT1I7XG4gICAgaWYgKGtleS5zdGFydHNXaXRoKHByZWZpeCkgJiYga2V5Lmxlbmd0aCA+IHByZWZpeC5sZW5ndGgpIHtcbiAgICAgIExTLnJlbW92ZUl0ZW0oa2V5KTtcbiAgICAgIGNvbnN0IG1vZGVsTmFtZSA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgIGlmIChwdXJnZWRNb2RlbFBhdGhzLmluZGV4T2YobW9kZWxOYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgcHVyZ2VkTW9kZWxQYXRocy5wdXNoKG1vZGVsTmFtZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiBwdXJnZWRNb2RlbFBhdGhzO1xufVxuXG50eXBlIExvY2FsU3RvcmFnZUtleXMgPSB7XG4gIC8qKiBLZXkgb2YgdGhlIGxvY2FsU3RvcmFnZSBlbnRyeSBzdG9yaW5nIGBNb2RlbEFydGlmYWN0c0luZm9gLiAqL1xuICBpbmZvOiBzdHJpbmcsXG4gIC8qKlxuICAgKiBLZXkgb2YgdGhlIGxvY2FsU3RvcmFnZSBlbnRyeSBzdG9yaW5nIHRoZSAnbW9kZWxUb3BvbG9neScga2V5IG9mXG4gICAqIGBtb2RlbC5qc29uYFxuICAgKi9cbiAgdG9wb2xvZ3k6IHN0cmluZyxcbiAgLyoqXG4gICAqIEtleSBvZiB0aGUgbG9jYWxTdG9yYWdlIGVudHJ5IHN0b3JpbmcgdGhlIGB3ZWlnaHRzTWFuaWZlc3Qud2VpZ2h0c2AgZW50cmllc1xuICAgKiBvZiBgbW9kZWwuanNvbmBcbiAgICovXG4gIHdlaWdodFNwZWNzOiBzdHJpbmcsXG4gIC8qKiBLZXkgb2YgdGhlIGxvY2FsU3RvcmFnZSBlbnRyeSBzdG9yaW5nIHRoZSB3ZWlnaHQgZGF0YSBpbiBCYXNlNjQgKi9cbiAgd2VpZ2h0RGF0YTogc3RyaW5nLFxuICAvKipcbiAgICogS2V5IG9mIHRoZSBsb2NhbFN0b3JhZ2UgZW50cnkgc3RvcmluZyB0aGUgcmVtYWluaW5nIGZpZWxkcyBvZiBgbW9kZWwuanNvbmBcbiAgICogQHNlZSB7QGxpbmsgTW9kZWxNZXRhZGF0YX1cbiAgICovXG4gIG1vZGVsTWV0YWRhdGE6IHN0cmluZyxcbn07XG5cbnR5cGUgTW9kZWxNZXRhZGF0YSA9IE9taXQ8TW9kZWxKU09OLCAnbW9kZWxUb3BvbG9neSd8J3dlaWdodHNNYW5pZmVzdCc+O1xuXG5mdW5jdGlvbiBnZXRNb2RlbEtleXMocGF0aDogc3RyaW5nKTogTG9jYWxTdG9yYWdlS2V5cyB7XG4gIHJldHVybiB7XG4gICAgaW5mbzogW1BBVEhfUFJFRklYLCBwYXRoLCBJTkZPX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgdG9wb2xvZ3k6IFtQQVRIX1BSRUZJWCwgcGF0aCwgTU9ERUxfVE9QT0xPR1lfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKSxcbiAgICB3ZWlnaHRTcGVjczogW1BBVEhfUFJFRklYLCBwYXRoLCBXRUlHSFRfU1BFQ1NfU1VGRklYXS5qb2luKFBBVEhfU0VQQVJBVE9SKSxcbiAgICB3ZWlnaHREYXRhOiBbUEFUSF9QUkVGSVgsIHBhdGgsIFdFSUdIVF9EQVRBX1NVRkZJWF0uam9pbihQQVRIX1NFUEFSQVRPUiksXG4gICAgbW9kZWxNZXRhZGF0YTpcbiAgICAgICAgW1BBVEhfUFJFRklYLCBwYXRoLCBNT0RFTF9NRVRBREFUQV9TVUZGSVhdLmpvaW4oUEFUSF9TRVBBUkFUT1IpXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlbW92ZUl0ZW1zKGtleXM6IExvY2FsU3RvcmFnZUtleXMpOiB2b2lkIHtcbiAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LnZhbHVlcyhrZXlzKSkge1xuICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShrZXkpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IG1vZGVsIHBhdGggZnJvbSBhIGxvY2FsLXN0b3JhZ2Uga2V5LlxuICpcbiAqIEUuZy4sICd0ZW5zb3JmbG93anNfbW9kZWxzL215L21vZGVsLzEvaW5mbycgLS0+ICdteS9tb2RlbC8xJ1xuICpcbiAqIEBwYXJhbSBrZXlcbiAqL1xuZnVuY3Rpb24gZ2V0TW9kZWxQYXRoRnJvbUtleShrZXk6IHN0cmluZykge1xuICBjb25zdCBpdGVtcyA9IGtleS5zcGxpdChQQVRIX1NFUEFSQVRPUik7XG4gIGlmIChpdGVtcy5sZW5ndGggPCAzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGtleSBmb3JtYXQ6ICR7a2V5fWApO1xuICB9XG4gIHJldHVybiBpdGVtcy5zbGljZSgxLCBpdGVtcy5sZW5ndGggLSAxKS5qb2luKFBBVEhfU0VQQVJBVE9SKTtcbn1cblxuZnVuY3Rpb24gbWF5YmVTdHJpcFNjaGVtZShrZXk6IHN0cmluZykge1xuICByZXR1cm4ga2V5LnN0YXJ0c1dpdGgoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FKSA/XG4gICAgICBrZXkuc2xpY2UoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FLmxlbmd0aCkgOlxuICAgICAga2V5O1xufVxuXG4vKipcbiAqIElPSGFuZGxlciBzdWJjbGFzczogQnJvd3NlciBMb2NhbCBTdG9yYWdlLlxuICpcbiAqIFNlZSB0aGUgZG9jIHN0cmluZyB0byBgYnJvd3NlckxvY2FsU3RvcmFnZWAgZm9yIG1vcmUgZGV0YWlscy5cbiAqL1xuZXhwb3J0IGNsYXNzIEJyb3dzZXJMb2NhbFN0b3JhZ2UgaW1wbGVtZW50cyBJT0hhbmRsZXIge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgTFM6IFN0b3JhZ2U7XG4gIHByb3RlY3RlZCByZWFkb25seSBtb2RlbFBhdGg6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGtleXM6IExvY2FsU3RvcmFnZUtleXM7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFVSTF9TQ0hFTUUgPSAnbG9jYWxzdG9yYWdlOi8vJztcblxuICBjb25zdHJ1Y3Rvcihtb2RlbFBhdGg6IHN0cmluZykge1xuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpIHx8IHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgIHR5cGVvZiB3aW5kb3cubG9jYWxTdG9yYWdlID09PSAndW5kZWZpbmVkJykge1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIG1vcmUgaW5mbyBhYm91dCB3aGF0IElPSGFuZGxlciBzdWJ0eXBlcyBhcmVcbiAgICAgIC8vIGF2YWlsYWJsZS5cbiAgICAgIC8vICAgTWF5YmUgcG9pbnQgdG8gYSBkb2MgcGFnZSBvbiB0aGUgd2ViIGFuZC9vciBhdXRvbWF0aWNhbGx5IGRldGVybWluZVxuICAgICAgLy8gICB0aGUgYXZhaWxhYmxlIElPSGFuZGxlcnMgYW5kIHByaW50IHRoZW0gaW4gdGhlIGVycm9yIG1lc3NhZ2UuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ1RoZSBjdXJyZW50IGVudmlyb25tZW50IGRvZXMgbm90IHN1cHBvcnQgbG9jYWwgc3RvcmFnZS4nKTtcbiAgICB9XG4gICAgdGhpcy5MUyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG5cbiAgICBpZiAobW9kZWxQYXRoID09IG51bGwgfHwgIW1vZGVsUGF0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdGb3IgbG9jYWwgc3RvcmFnZSwgbW9kZWxQYXRoIG11c3Qgbm90IGJlIG51bGwsIHVuZGVmaW5lZCBvciBlbXB0eS4nKTtcbiAgICB9XG4gICAgdGhpcy5tb2RlbFBhdGggPSBtb2RlbFBhdGg7XG4gICAgdGhpcy5rZXlzID0gZ2V0TW9kZWxLZXlzKHRoaXMubW9kZWxQYXRoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIG1vZGVsIGFydGlmYWN0cyB0byBicm93c2VyIGxvY2FsIHN0b3JhZ2UuXG4gICAqXG4gICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiB0byBgYnJvd3NlckxvY2FsU3RvcmFnZWAgZm9yIGRldGFpbHMgb24gdGhlIHNhdmVkXG4gICAqIGFydGlmYWN0cy5cbiAgICpcbiAgICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzIFRoZSBtb2RlbCBhcnRpZmFjdHMgdG8gYmUgc3RvcmVkLlxuICAgKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBTYXZlUmVzdWx0LlxuICAgKi9cbiAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0czogTW9kZWxBcnRpZmFjdHMpOiBQcm9taXNlPFNhdmVSZXN1bHQ+IHtcbiAgICBpZiAobW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Jyb3dzZXJMb2NhbFN0b3JhZ2Uuc2F2ZSgpIGRvZXMgbm90IHN1cHBvcnQgc2F2aW5nIG1vZGVsIHRvcG9sb2d5ICcgK1xuICAgICAgICAgICdpbiBiaW5hcnkgZm9ybWF0cyB5ZXQuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRvcG9sb2d5ID0gSlNPTi5zdHJpbmdpZnkobW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSk7XG4gICAgICBjb25zdCB3ZWlnaHRTcGVjcyA9IEpTT04uc3RyaW5naWZ5KG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzKTtcblxuICAgICAgY29uc3QgbW9kZWxBcnRpZmFjdHNJbmZvOiBNb2RlbEFydGlmYWN0c0luZm8gPVxuICAgICAgICAgIGdldE1vZGVsQXJ0aWZhY3RzSW5mb0ZvckpTT04obW9kZWxBcnRpZmFjdHMpO1xuXG4gICAgICB0cnkge1xuICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLmluZm8sIEpTT04uc3RyaW5naWZ5KG1vZGVsQXJ0aWZhY3RzSW5mbykpO1xuICAgICAgICB0aGlzLkxTLnNldEl0ZW0odGhpcy5rZXlzLnRvcG9sb2d5LCB0b3BvbG9neSk7XG4gICAgICAgIHRoaXMuTFMuc2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0U3BlY3MsIHdlaWdodFNwZWNzKTtcbiAgICAgICAgdGhpcy5MUy5zZXRJdGVtKFxuICAgICAgICAgICAgdGhpcy5rZXlzLndlaWdodERhdGEsXG4gICAgICAgICAgICBhcnJheUJ1ZmZlclRvQmFzZTY0U3RyaW5nKG1vZGVsQXJ0aWZhY3RzLndlaWdodERhdGEpKTtcblxuICAgICAgICAvLyBOb3RlIHRoYXQgSlNPTi5zdHJpbmdpZnkgZG9lc24ndCB3cml0ZSBvdXQga2V5cyB0aGF0IGhhdmUgdW5kZWZpbmVkXG4gICAgICAgIC8vIHZhbHVlcywgc28gZm9yIHNvbWUga2V5cywgd2Ugc2V0IHVuZGVmaW5lZCBpbnN0ZWFkIG9mIGEgbnVsbC1pc2hcbiAgICAgICAgLy8gdmFsdWUuXG4gICAgICAgIGNvbnN0IG1ldGFkYXRhOiBSZXF1aXJlZDxNb2RlbE1ldGFkYXRhPiA9IHtcbiAgICAgICAgICBmb3JtYXQ6IG1vZGVsQXJ0aWZhY3RzLmZvcm1hdCxcbiAgICAgICAgICBnZW5lcmF0ZWRCeTogbW9kZWxBcnRpZmFjdHMuZ2VuZXJhdGVkQnksXG4gICAgICAgICAgY29udmVydGVkQnk6IG1vZGVsQXJ0aWZhY3RzLmNvbnZlcnRlZEJ5LFxuICAgICAgICAgIHNpZ25hdHVyZTogbW9kZWxBcnRpZmFjdHMuc2lnbmF0dXJlICE9IG51bGwgP1xuICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5zaWduYXR1cmUgOlxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdXNlckRlZmluZWRNZXRhZGF0YTogbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsID9cbiAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSA6XG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBtb2RlbEluaXRpYWxpemVyOiBtb2RlbEFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyICE9IG51bGwgP1xuICAgICAgICAgICAgICBtb2RlbEFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyIDpcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgIHRyYWluaW5nQ29uZmlnOiBtb2RlbEFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyAhPSBudWxsID9cbiAgICAgICAgICAgICAgbW9kZWxBcnRpZmFjdHMudHJhaW5pbmdDb25maWcgOlxuICAgICAgICAgICAgICB1bmRlZmluZWRcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5MUy5zZXRJdGVtKHRoaXMua2V5cy5tb2RlbE1ldGFkYXRhLCBKU09OLnN0cmluZ2lmeShtZXRhZGF0YSkpO1xuXG4gICAgICAgIHJldHVybiB7bW9kZWxBcnRpZmFjdHNJbmZvfTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAvLyBJZiBzYXZpbmcgZmFpbGVkLCBjbGVhbiB1cCBhbGwgaXRlbXMgc2F2ZWQgc28gZmFyLlxuICAgICAgICByZW1vdmVJdGVtcyh0aGlzLmtleXMpO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGYWlsZWQgdG8gc2F2ZSBtb2RlbCAnJHt0aGlzLm1vZGVsUGF0aH0nIHRvIGxvY2FsIHN0b3JhZ2U6IGAgK1xuICAgICAgICAgICAgYHNpemUgcXVvdGEgYmVpbmcgZXhjZWVkZWQgaXMgYSBwb3NzaWJsZSBjYXVzZSBvZiB0aGlzIGZhaWx1cmU6IGAgK1xuICAgICAgICAgICAgYG1vZGVsVG9wb2xvZ3lCeXRlcz0ke21vZGVsQXJ0aWZhY3RzSW5mby5tb2RlbFRvcG9sb2d5Qnl0ZXN9LCBgICtcbiAgICAgICAgICAgIGB3ZWlnaHRTcGVjc0J5dGVzPSR7bW9kZWxBcnRpZmFjdHNJbmZvLndlaWdodFNwZWNzQnl0ZXN9LCBgICtcbiAgICAgICAgICAgIGB3ZWlnaHREYXRhQnl0ZXM9JHttb2RlbEFydGlmYWN0c0luZm8ud2VpZ2h0RGF0YUJ5dGVzfS5gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBhIG1vZGVsIGZyb20gbG9jYWwgc3RvcmFnZS5cbiAgICpcbiAgICogU2VlIHRoZSBkb2N1bWVudGF0aW9uIHRvIGBicm93c2VyTG9jYWxTdG9yYWdlYCBmb3IgZGV0YWlscyBvbiB0aGUgc2F2ZWRcbiAgICogYXJ0aWZhY3RzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgbG9hZGVkIG1vZGVsIChpZiBsb2FkaW5nIHN1Y2NlZWRzKS5cbiAgICovXG4gIGFzeW5jIGxvYWQoKTogUHJvbWlzZTxNb2RlbEFydGlmYWN0cz4ge1xuICAgIGNvbnN0IGluZm8gPVxuICAgICAgICBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMuaW5mbykpIGFzIE1vZGVsQXJ0aWZhY3RzSW5mbztcbiAgICBpZiAoaW5mbyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEluIGxvY2FsIHN0b3JhZ2UsIHRoZXJlIGlzIG5vIG1vZGVsIHdpdGggbmFtZSAnJHt0aGlzLm1vZGVsUGF0aH0nYCk7XG4gICAgfVxuXG4gICAgaWYgKGluZm8ubW9kZWxUb3BvbG9neVR5cGUgIT09ICdKU09OJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdCcm93c2VyTG9jYWxTdG9yYWdlIGRvZXMgbm90IHN1cHBvcnQgbG9hZGluZyBub24tSlNPTiBtb2RlbCAnICtcbiAgICAgICAgICAndG9wb2xvZ3kgeWV0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dDogTW9kZWxBcnRpZmFjdHMgPSB7fTtcblxuICAgIC8vIExvYWQgdG9wb2xvZ3kuXG4gICAgY29uc3QgdG9wb2xvZ3kgPSBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMudG9wb2xvZ3kpKTtcbiAgICBpZiAodG9wb2xvZ3kgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbiBsb2NhbCBzdG9yYWdlLCB0aGUgdG9wb2xvZ3kgb2YgbW9kZWwgJyR7dGhpcy5tb2RlbFBhdGh9JyBgICtcbiAgICAgICAgICBgaXMgbWlzc2luZy5gKTtcbiAgICB9XG4gICAgb3V0Lm1vZGVsVG9wb2xvZ3kgPSB0b3BvbG9neTtcblxuICAgIC8vIExvYWQgd2VpZ2h0IHNwZWNzLlxuICAgIGNvbnN0IHdlaWdodFNwZWNzID0gSlNPTi5wYXJzZSh0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLndlaWdodFNwZWNzKSk7XG4gICAgaWYgKHdlaWdodFNwZWNzID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW4gbG9jYWwgc3RvcmFnZSwgdGhlIHdlaWdodCBzcGVjcyBvZiBtb2RlbCAnJHt0aGlzLm1vZGVsUGF0aH0nIGAgK1xuICAgICAgICAgIGBhcmUgbWlzc2luZy5gKTtcbiAgICB9XG4gICAgb3V0LndlaWdodFNwZWNzID0gd2VpZ2h0U3BlY3M7XG5cbiAgICAvLyBMb2FkIG1ldGEtZGF0YSBmaWVsZHMuXG4gICAgY29uc3QgbWV0YWRhdGFTdHJpbmcgPSB0aGlzLkxTLmdldEl0ZW0odGhpcy5rZXlzLm1vZGVsTWV0YWRhdGEpO1xuICAgIGlmIChtZXRhZGF0YVN0cmluZyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBtZXRhZGF0YSA9IEpTT04ucGFyc2UobWV0YWRhdGFTdHJpbmcpIGFzIE1vZGVsTWV0YWRhdGE7XG4gICAgICBvdXQuZm9ybWF0ID0gbWV0YWRhdGEuZm9ybWF0O1xuICAgICAgb3V0LmdlbmVyYXRlZEJ5ID0gbWV0YWRhdGEuZ2VuZXJhdGVkQnk7XG4gICAgICBvdXQuY29udmVydGVkQnkgPSBtZXRhZGF0YS5jb252ZXJ0ZWRCeTtcbiAgICAgIGlmIChtZXRhZGF0YS5zaWduYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBvdXQuc2lnbmF0dXJlID0gbWV0YWRhdGEuc2lnbmF0dXJlO1xuICAgICAgfVxuICAgICAgaWYgKG1ldGFkYXRhLnVzZXJEZWZpbmVkTWV0YWRhdGEgIT0gbnVsbCkge1xuICAgICAgICBvdXQudXNlckRlZmluZWRNZXRhZGF0YSA9IG1ldGFkYXRhLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgICB9XG4gICAgICBpZiAobWV0YWRhdGEubW9kZWxJbml0aWFsaXplciAhPSBudWxsKSB7XG4gICAgICAgIG91dC5tb2RlbEluaXRpYWxpemVyID0gbWV0YWRhdGEubW9kZWxJbml0aWFsaXplcjtcbiAgICAgIH1cbiAgICAgIGlmIChtZXRhZGF0YS50cmFpbmluZ0NvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgIG91dC50cmFpbmluZ0NvbmZpZyA9IG1ldGFkYXRhLnRyYWluaW5nQ29uZmlnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgd2VpZ2h0IGRhdGEuXG4gICAgY29uc3Qgd2VpZ2h0RGF0YUJhc2U2NCA9IHRoaXMuTFMuZ2V0SXRlbSh0aGlzLmtleXMud2VpZ2h0RGF0YSk7XG4gICAgaWYgKHdlaWdodERhdGFCYXNlNjQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBJbiBsb2NhbCBzdG9yYWdlLCB0aGUgYmluYXJ5IHdlaWdodCB2YWx1ZXMgb2YgbW9kZWwgYCArXG4gICAgICAgICAgYCcke3RoaXMubW9kZWxQYXRofScgYXJlIG1pc3NpbmcuYCk7XG4gICAgfVxuICAgIG91dC53ZWlnaHREYXRhID0gYmFzZTY0U3RyaW5nVG9BcnJheUJ1ZmZlcih3ZWlnaHREYXRhQmFzZTY0KTtcblxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGxvY2FsU3RvcmFnZVJvdXRlcjogSU9Sb3V0ZXIgPSAodXJsOiBzdHJpbmd8c3RyaW5nW10pID0+IHtcbiAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmwuc3RhcnRzV2l0aChCcm93c2VyTG9jYWxTdG9yYWdlLlVSTF9TQ0hFTUUpKSB7XG4gICAgICByZXR1cm4gYnJvd3NlckxvY2FsU3RvcmFnZShcbiAgICAgICAgICB1cmwuc2xpY2UoQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FLmxlbmd0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihsb2NhbFN0b3JhZ2VSb3V0ZXIpO1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIobG9jYWxTdG9yYWdlUm91dGVyKTtcblxuLyoqXG4gKiBGYWN0b3J5IGZ1bmN0aW9uIGZvciBsb2NhbCBzdG9yYWdlIElPSGFuZGxlci5cbiAqXG4gKiBUaGlzIGBJT0hhbmRsZXJgIHN1cHBvcnRzIGJvdGggYHNhdmVgIGFuZCBgbG9hZGAuXG4gKlxuICogRm9yIGVhY2ggbW9kZWwncyBzYXZlZCBhcnRpZmFjdHMsIGZvdXIgaXRlbXMgYXJlIHNhdmVkIHRvIGxvY2FsIHN0b3JhZ2UuXG4gKiAgIC0gYCR7UEFUSF9TRVBBUkFUT1J9LyR7bW9kZWxQYXRofS9pbmZvYDogQ29udGFpbnMgbWV0YS1pbmZvIGFib3V0IHRoZVxuICogICAgIG1vZGVsLCBzdWNoIGFzIGRhdGUgc2F2ZWQsIHR5cGUgb2YgdGhlIHRvcG9sb2d5LCBzaXplIGluIGJ5dGVzLCBldGMuXG4gKiAgIC0gYCR7UEFUSF9TRVBBUkFUT1J9LyR7bW9kZWxQYXRofS90b3BvbG9neWA6IE1vZGVsIHRvcG9sb2d5LiBGb3IgS2VyYXMtXG4gKiAgICAgc3R5bGUgbW9kZWxzLCB0aGlzIGlzIGEgc3RyaW5naXplZCBKU09OLlxuICogICAtIGAke1BBVEhfU0VQQVJBVE9SfS8ke21vZGVsUGF0aH0vd2VpZ2h0X3NwZWNzYDogV2VpZ2h0IHNwZWNzIG9mIHRoZVxuICogICAgIG1vZGVsLCBjYW4gYmUgdXNlZCB0byBkZWNvZGUgdGhlIHNhdmVkIGJpbmFyeSB3ZWlnaHQgdmFsdWVzIChzZWVcbiAqICAgICBpdGVtIGJlbG93KS5cbiAqICAgLSBgJHtQQVRIX1NFUEFSQVRPUn0vJHttb2RlbFBhdGh9L3dlaWdodF9kYXRhYDogQ29uY2F0ZW5hdGVkIGJpbmFyeVxuICogICAgIHdlaWdodCB2YWx1ZXMsIHN0b3JlZCBhcyBhIGJhc2U2NC1lbmNvZGVkIHN0cmluZy5cbiAqXG4gKiBTYXZpbmcgbWF5IHRocm93IGFuIGBFcnJvcmAgaWYgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGFydGlmYWN0cyBleGNlZWQgdGhlXG4gKiBicm93c2VyLXNwZWNpZmljIHF1b3RhLlxuICpcbiAqIEBwYXJhbSBtb2RlbFBhdGggQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIG1vZGVsIHRvIGJlIHNhdmVkLiBNdXN0IGJlIGFcbiAqICAgbm9uLWVtcHR5IHN0cmluZy5cbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIGBJT0hhbmRsZXJgLCB3aGljaCBjYW4gYmUgdXNlZCB3aXRoLCBlLmcuLFxuICogICBgdGYuTW9kZWwuc2F2ZWAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBicm93c2VyTG9jYWxTdG9yYWdlKG1vZGVsUGF0aDogc3RyaW5nKTogSU9IYW5kbGVyIHtcbiAgcmV0dXJuIG5ldyBCcm93c2VyTG9jYWxTdG9yYWdlKG1vZGVsUGF0aCk7XG59XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyTG9jYWxTdG9yYWdlTWFuYWdlciBpbXBsZW1lbnRzIE1vZGVsU3RvcmVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBMUzogU3RvcmFnZTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBhc3NlcnQoXG4gICAgICAgIGVudigpLmdldEJvb2woJ0lTX0JST1dTRVInKSxcbiAgICAgICAgKCkgPT4gJ0N1cnJlbnQgZW52aXJvbm1lbnQgaXMgbm90IGEgd2ViIGJyb3dzZXInKTtcbiAgICBhc3NlcnQoXG4gICAgICAgIHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8XG4gICAgICAgICAgICB0eXBlb2Ygd2luZG93LmxvY2FsU3RvcmFnZSAhPT0gJ3VuZGVmaW5lZCcsXG4gICAgICAgICgpID0+ICdDdXJyZW50IGJyb3dzZXIgZG9lcyBub3QgYXBwZWFyIHRvIHN1cHBvcnQgbG9jYWxTdG9yYWdlJyk7XG4gICAgdGhpcy5MUyA9IHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG4gIH1cblxuICBhc3luYyBsaXN0TW9kZWxzKCk6IFByb21pc2U8e1twYXRoOiBzdHJpbmddOiBNb2RlbEFydGlmYWN0c0luZm99PiB7XG4gICAgY29uc3Qgb3V0OiB7W3BhdGg6IHN0cmluZ106IE1vZGVsQXJ0aWZhY3RzSW5mb30gPSB7fTtcbiAgICBjb25zdCBwcmVmaXggPSBQQVRIX1BSRUZJWCArIFBBVEhfU0VQQVJBVE9SO1xuICAgIGNvbnN0IHN1ZmZpeCA9IFBBVEhfU0VQQVJBVE9SICsgSU5GT19TVUZGSVg7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLkxTLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLkxTLmtleShpKTtcbiAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChwcmVmaXgpICYmIGtleS5lbmRzV2l0aChzdWZmaXgpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGF0aCA9IGdldE1vZGVsUGF0aEZyb21LZXkoa2V5KTtcbiAgICAgICAgb3V0W21vZGVsUGF0aF0gPSBKU09OLnBhcnNlKHRoaXMuTFMuZ2V0SXRlbShrZXkpKSBhcyBNb2RlbEFydGlmYWN0c0luZm87XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBhc3luYyByZW1vdmVNb2RlbChwYXRoOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzSW5mbz4ge1xuICAgIHBhdGggPSBtYXliZVN0cmlwU2NoZW1lKHBhdGgpO1xuICAgIGNvbnN0IGtleXMgPSBnZXRNb2RlbEtleXMocGF0aCk7XG4gICAgaWYgKHRoaXMuTFMuZ2V0SXRlbShrZXlzLmluZm8pID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgYXQgcGF0aCAnJHtwYXRofSdgKTtcbiAgICB9XG4gICAgY29uc3QgaW5mbyA9IEpTT04ucGFyc2UodGhpcy5MUy5nZXRJdGVtKGtleXMuaW5mbykpIGFzIE1vZGVsQXJ0aWZhY3RzSW5mbztcbiAgICByZW1vdmVJdGVtcyhrZXlzKTtcbiAgICByZXR1cm4gaW5mbztcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Classes and functions for model management across multiple storage mediums.\n *\n * Supported client actions:\n * - Listing models on all registered storage mediums.\n * - Remove model by URL from any registered storage mediums, by using URL\n *   string.\n * - Moving or copying model from one path to another in the same medium or from\n *   one medium to another, by using URL strings.\n */\nimport { assert } from '../util';\nimport { IORouterRegistry } from './router_registry';\nconst URL_SCHEME_SUFFIX = '://';\nexport class ModelStoreManagerRegistry {\n    constructor() {\n        this.managers = {};\n    }\n    static getInstance() {\n        if (ModelStoreManagerRegistry.instance == null) {\n            ModelStoreManagerRegistry.instance = new ModelStoreManagerRegistry();\n        }\n        return ModelStoreManagerRegistry.instance;\n    }\n    /**\n     * Register a save-handler router.\n     *\n     * @param saveRouter A function that maps a URL-like string onto an instance\n     * of `IOHandler` with the `save` method defined or `null`.\n     */\n    static registerManager(scheme, manager) {\n        assert(scheme != null, () => 'scheme must not be undefined or null.');\n        if (scheme.endsWith(URL_SCHEME_SUFFIX)) {\n            scheme = scheme.slice(0, scheme.indexOf(URL_SCHEME_SUFFIX));\n        }\n        assert(scheme.length > 0, () => 'scheme must not be an empty string.');\n        const registry = ModelStoreManagerRegistry.getInstance();\n        assert(registry.managers[scheme] == null, () => `A model store manager is already registered for scheme '${scheme}'.`);\n        registry.managers[scheme] = manager;\n    }\n    static getManager(scheme) {\n        const manager = ModelStoreManagerRegistry.getInstance().managers[scheme];\n        if (manager == null) {\n            throw new Error(`Cannot find model manager for scheme '${scheme}'`);\n        }\n        return manager;\n    }\n    static getSchemes() {\n        return Object.keys(ModelStoreManagerRegistry.getInstance().managers);\n    }\n}\n/**\n * Helper method for parsing a URL string into a scheme and a path.\n *\n * @param url E.g., 'localstorage://my-model'\n * @returns A dictionary with two fields: scheme and path.\n *   Scheme: e.g., 'localstorage' in the example above.\n *   Path: e.g., 'my-model' in the example above.\n */\nfunction parseURL(url) {\n    if (url.indexOf(URL_SCHEME_SUFFIX) === -1) {\n        throw new Error(`The url string provided does not contain a scheme. ` +\n            `Supported schemes are: ` +\n            `${ModelStoreManagerRegistry.getSchemes().join(',')}`);\n    }\n    return {\n        scheme: url.split(URL_SCHEME_SUFFIX)[0],\n        path: url.split(URL_SCHEME_SUFFIX)[1],\n    };\n}\nasync function cloneModelInternal(sourceURL, destURL, deleteSource = false) {\n    assert(sourceURL !== destURL, () => `Old path and new path are the same: '${sourceURL}'`);\n    const loadHandlers = IORouterRegistry.getLoadHandlers(sourceURL);\n    assert(loadHandlers.length > 0, () => `Copying failed because no load handler is found for source URL ${sourceURL}.`);\n    assert(loadHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) ` +\n        `load handlers for source URL ${sourceURL}.`);\n    const loadHandler = loadHandlers[0];\n    const saveHandlers = IORouterRegistry.getSaveHandlers(destURL);\n    assert(saveHandlers.length > 0, () => `Copying failed because no save handler is found for destination ` +\n        `URL ${destURL}.`);\n    assert(saveHandlers.length < 2, () => `Copying failed because more than one (${loadHandlers.length}) ` +\n        `save handlers for destination URL ${destURL}.`);\n    const saveHandler = saveHandlers[0];\n    const sourceScheme = parseURL(sourceURL).scheme;\n    const sourcePath = parseURL(sourceURL).path;\n    const sameMedium = sourceScheme === parseURL(sourceURL).scheme;\n    const modelArtifacts = await loadHandler.load();\n    // If moving within the same storage medium, remove the old model as soon as\n    // the loading is done. Without doing this, it is possible that the combined\n    // size of the two models will cause the cloning to fail.\n    if (deleteSource && sameMedium) {\n        await ModelStoreManagerRegistry.getManager(sourceScheme)\n            .removeModel(sourcePath);\n    }\n    const saveResult = await saveHandler.save(modelArtifacts);\n    // If moving between mediums, the deletion is done after the save succeeds.\n    // This guards against the case in which saving to the destination medium\n    // fails.\n    if (deleteSource && !sameMedium) {\n        await ModelStoreManagerRegistry.getManager(sourceScheme)\n            .removeModel(sourcePath);\n    }\n    return saveResult.modelArtifactsInfo;\n}\n/**\n * List all models stored in registered storage mediums.\n *\n * For a web browser environment, the registered mediums are Local Storage and\n * IndexedDB.\n *\n * ```js\n * // First create and save a model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * await model.save('localstorage://demo/management/model1');\n *\n * // Then list existing models.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Delete the model.\n * await tf.io.removeModel('localstorage://demo/management/model1');\n *\n * // List models again.\n * console.log(JSON.stringify(await tf.io.listModels()));\n * ```\n *\n * @returns A `Promise` of a dictionary mapping URLs of existing models to\n * their model artifacts info. URLs include medium-specific schemes, e.g.,\n *   'indexeddb://my/model/1'. Model artifacts info include type of the\n * model's topology, byte sizes of the topology, weights, etc.\n *\n * @doc {\n *   heading: 'Models',\n *   subheading: 'Management',\n *   namespace: 'io',\n *   ignoreCI: true\n * }\n */\nasync function listModels() {\n    const schemes = ModelStoreManagerRegistry.getSchemes();\n    const out = {};\n    for (const scheme of schemes) {\n        const schemeOut = await ModelStoreManagerRegistry.getManager(scheme).listModels();\n        for (const path in schemeOut) {\n            const url = scheme + URL_SCHEME_SUFFIX + path;\n            out[url] = schemeOut[path];\n        }\n    }\n    return out;\n}\n/**\n * Remove a model specified by URL from a registered storage medium.\n *\n * ```js\n * // First create and save a model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * await model.save('localstorage://demo/management/model1');\n *\n * // Then list existing models.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Delete the model.\n * await tf.io.removeModel('localstorage://demo/management/model1');\n *\n * // List models again.\n * console.log(JSON.stringify(await tf.io.listModels()));\n * ```\n *\n * @param url A URL to a stored model, with a scheme prefix, e.g.,\n *   'localstorage://my-model-1', 'indexeddb://my/model/2'.\n * @returns ModelArtifactsInfo of the deleted model (if and only if deletion\n *   is successful).\n * @throws Error if deletion fails, e.g., if no model exists at `path`.\n *\n * @doc {\n *   heading: 'Models',\n *   subheading: 'Management',\n *   namespace: 'io',\n *   ignoreCI: true\n * }\n */\nasync function removeModel(url) {\n    const schemeAndPath = parseURL(url);\n    const manager = ModelStoreManagerRegistry.getManager(schemeAndPath.scheme);\n    return manager.removeModel(schemeAndPath.path);\n}\n/**\n * Copy a model from one URL to another.\n *\n * This function supports:\n *\n * 1. Copying within a storage medium, e.g.,\n *    `tf.io.copyModel('localstorage://model-1', 'localstorage://model-2')`\n * 2. Copying between two storage mediums, e.g.,\n *    `tf.io.copyModel('localstorage://model-1', 'indexeddb://model-1')`\n *\n * ```js\n * // First create and save a model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * await model.save('localstorage://demo/management/model1');\n *\n * // Then list existing models.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Copy the model, from Local Storage to IndexedDB.\n * await tf.io.copyModel(\n *     'localstorage://demo/management/model1',\n *     'indexeddb://demo/management/model1');\n *\n * // List models again.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Remove both models.\n * await tf.io.removeModel('localstorage://demo/management/model1');\n * await tf.io.removeModel('indexeddb://demo/management/model1');\n * ```\n *\n * @param sourceURL Source URL of copying.\n * @param destURL Destination URL of copying.\n * @returns ModelArtifactsInfo of the copied model (if and only if copying\n *   is successful).\n * @throws Error if copying fails, e.g., if no model exists at `sourceURL`, or\n *   if `oldPath` and `newPath` are identical.\n *\n * @doc {\n *   heading: 'Models',\n *   subheading: 'Management',\n *   namespace: 'io',\n *   ignoreCI: true\n * }\n */\nasync function copyModel(sourceURL, destURL) {\n    const deleteSource = false;\n    return cloneModelInternal(sourceURL, destURL, deleteSource);\n}\n/**\n * Move a model from one URL to another.\n *\n * This function supports:\n *\n * 1. Moving within a storage medium, e.g.,\n *    `tf.io.moveModel('localstorage://model-1', 'localstorage://model-2')`\n * 2. Moving between two storage mediums, e.g.,\n *    `tf.io.moveModel('localstorage://model-1', 'indexeddb://model-1')`\n *\n * ```js\n * // First create and save a model.\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * await model.save('localstorage://demo/management/model1');\n *\n * // Then list existing models.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Move the model, from Local Storage to IndexedDB.\n * await tf.io.moveModel(\n *     'localstorage://demo/management/model1',\n *     'indexeddb://demo/management/model1');\n *\n * // List models again.\n * console.log(JSON.stringify(await tf.io.listModels()));\n *\n * // Remove the moved model.\n * await tf.io.removeModel('indexeddb://demo/management/model1');\n * ```\n *\n * @param sourceURL Source URL of moving.\n * @param destURL Destination URL of moving.\n * @returns ModelArtifactsInfo of the copied model (if and only if copying\n *   is successful).\n * @throws Error if moving fails, e.g., if no model exists at `sourceURL`, or\n *   if `oldPath` and `newPath` are identical.\n *\n * @doc {\n *   heading: 'Models',\n *   subheading: 'Management',\n *   namespace: 'io',\n *   ignoreCI: true\n * }\n */\nasync function moveModel(sourceURL, destURL) {\n    const deleteSource = true;\n    return cloneModelInternal(sourceURL, destURL, deleteSource);\n}\nexport { moveModel, copyModel, removeModel, listModels };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxfbWFuYWdlbWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vbW9kZWxfbWFuYWdlbWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7Ozs7O0dBU0c7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRS9CLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBR25ELE1BQU0saUJBQWlCLEdBQUcsS0FBSyxDQUFDO0FBRWhDLE1BQU0sT0FBTyx5QkFBeUI7SUFNcEM7UUFDRSxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRU8sTUFBTSxDQUFDLFdBQVc7UUFDeEIsSUFBSSx5QkFBeUIsQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQzlDLHlCQUF5QixDQUFDLFFBQVEsR0FBRyxJQUFJLHlCQUF5QixFQUFFLENBQUM7U0FDdEU7UUFDRCxPQUFPLHlCQUF5QixDQUFDLFFBQVEsQ0FBQztJQUM1QyxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxNQUFNLENBQUMsZUFBZSxDQUFDLE1BQWMsRUFBRSxPQUEwQjtRQUMvRCxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO1FBQ3RFLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLGlCQUFpQixDQUFDLENBQUMsQ0FBQztTQUM3RDtRQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0s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R0FBRyxDQUFDLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzVCO0tBQ0Y7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFDSCxLQUFLLFVBQVUsV0FBVyxDQUFDLEdBQVc7SUFDcEMsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sT0FBTyxHQUFHLHlCQUF5QixDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDM0UsT0FBTyxPQUFPLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFDSCxLQUFLLFVBQVUsU0FBUyxDQUNwQixTQUFpQixFQUFFLE9BQWU7SUFDcEMsTUFBTSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzNCLE9BQU8sa0JBQWtCLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRztBQUNILEtBQUssVUFBVSxTQUFTLENBQ3BCLFNBQWlCLEVBQUUsT0FBZTtJQUNwQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDMUIsT0FBTyxrQkFBa0IsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxPQUFPLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogQ2xhc3NlcyBhbmQgZnVuY3Rpb25zIGZvciBtb2RlbCBtYW5hZ2VtZW50IGFjcm9zcyBtdWx0aXBsZSBzdG9yYWdlIG1lZGl1bXMuXG4gKlxuICogU3VwcG9ydGVkIGNsaWVudCBhY3Rpb25zOlxuICogLSBMaXN0aW5nIG1vZGVscyBvbiBhbGwgcmVnaXN0ZXJlZCBzdG9yYWdlIG1lZGl1bXMuXG4gKiAtIFJlbW92ZSBtb2RlbCBieSBVUkwgZnJvbSBhbnkgcmVnaXN0ZXJlZCBzdG9yYWdlIG1lZGl1bXMsIGJ5IHVzaW5nIFVSTFxuICogICBzdHJpbmcuXG4gKiAtIE1vdmluZyBvciBjb3B5aW5nIG1vZGVsIGZyb20gb25lIHBhdGggdG8gYW5vdGhlciBpbiB0aGUgc2FtZSBtZWRpdW0gb3IgZnJvbVxuICogICBvbmUgbWVkaXVtIHRvIGFub3RoZXIsIGJ5IHVzaW5nIFVSTCBzdHJpbmdzLlxuICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtJT1JvdXRlclJlZ2lzdHJ5fSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5pbXBvcnQge01vZGVsQXJ0aWZhY3RzSW5mbywgTW9kZWxTdG9yZU1hbmFnZXJ9IGZyb20gJy4vdHlwZXMnO1xuXG5jb25zdCBVUkxfU0NIRU1FX1NVRkZJWCA9ICc6Ly8nO1xuXG5leHBvcnQgY2xhc3MgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeSB7XG4gIC8vIFNpbmdsZXRvbiBpbnN0YW5jZS5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnk7XG5cbiAgcHJpdmF0ZSBtYW5hZ2Vyczoge1tzY2hlbWU6IHN0cmluZ106IE1vZGVsU3RvcmVNYW5hZ2VyfTtcblxuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMubWFuYWdlcnMgPSB7fTtcbiAgfVxuXG4gIHByaXZhdGUgc3RhdGljIGdldEluc3RhbmNlKCk6IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkge1xuICAgIGlmIChNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5Lmluc3RhbmNlID09IG51bGwpIHtcbiAgICAgIE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuaW5zdGFuY2UgPSBuZXcgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeSgpO1xuICAgIH1cbiAgICByZXR1cm4gTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5pbnN0YW5jZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIHNhdmUtaGFuZGxlciByb3V0ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzYXZlUm91dGVyIEEgZnVuY3Rpb24gdGhhdCBtYXBzIGEgVVJMLWxpa2Ugc3RyaW5nIG9udG8gYW4gaW5zdGFuY2VcbiAgICogb2YgYElPSGFuZGxlcmAgd2l0aCB0aGUgYHNhdmVgIG1ldGhvZCBkZWZpbmVkIG9yIGBudWxsYC5cbiAgICovXG4gIHN0YXRpYyByZWdpc3Rlck1hbmFnZXIoc2NoZW1lOiBzdHJpbmcsIG1hbmFnZXI6IE1vZGVsU3RvcmVNYW5hZ2VyKSB7XG4gICAgYXNzZXJ0KHNjaGVtZSAhPSBudWxsLCAoKSA9PiAnc2NoZW1lIG11c3Qgbm90IGJlIHVuZGVmaW5lZCBvciBudWxsLicpO1xuICAgIGlmIChzY2hlbWUuZW5kc1dpdGgoVVJMX1NDSEVNRV9TVUZGSVgpKSB7XG4gICAgICBzY2hlbWUgPSBzY2hlbWUuc2xpY2UoMCwgc2NoZW1lLmluZGV4T2YoVVJMX1NDSEVNRV9TVUZGSVgpKTtcbiAgICB9XG4gICAgYXNzZXJ0KHNjaGVtZS5sZW5ndGggPiAwLCAoKSA9PiAnc2NoZW1lIG11c3Qgbm90IGJlIGFuIGVtcHR5IHN0cmluZy4nKTtcbiAgICBjb25zdCByZWdpc3RyeSA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKTtcbiAgICBhc3NlcnQoXG4gICAgICAgIHJlZ2lzdHJ5Lm1hbmFnZXJzW3NjaGVtZV0gPT0gbnVsbCxcbiAgICAgICAgKCkgPT4gYEEgbW9kZWwgc3RvcmUgbWFuYWdlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHNjaGVtZSAnJHtcbiAgICAgICAgICAgIHNjaGVtZX0nLmApO1xuICAgIHJlZ2lzdHJ5Lm1hbmFnZXJzW3NjaGVtZV0gPSBtYW5hZ2VyO1xuICB9XG5cbiAgc3RhdGljIGdldE1hbmFnZXIoc2NoZW1lOiBzdHJpbmcpOiBNb2RlbFN0b3JlTWFuYWdlciB7XG4gICAgY29uc3QgbWFuYWdlciA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0SW5zdGFuY2UoKS5tYW5hZ2Vyc1tzY2hlbWVdO1xuICAgIGlmIChtYW5hZ2VyID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgbW9kZWwgbWFuYWdlciBmb3Igc2NoZW1lICcke3NjaGVtZX0nYCk7XG4gICAgfVxuICAgIHJldHVybiBtYW5hZ2VyO1xuICB9XG5cbiAgc3RhdGljIGdldFNjaGVtZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyhNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldEluc3RhbmNlKCkubWFuYWdlcnMpO1xuICB9XG59XG5cbi8qKlxuICogSGVscGVyIG1ldGhvZCBmb3IgcGFyc2luZyBhIFVSTCBzdHJpbmcgaW50byBhIHNjaGVtZSBhbmQgYSBwYXRoLlxuICpcbiAqIEBwYXJhbSB1cmwgRS5nLiwgJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsJ1xuICogQHJldHVybnMgQSBkaWN0aW9uYXJ5IHdpdGggdHdvIGZpZWxkczogc2NoZW1lIGFuZCBwYXRoLlxuICogICBTY2hlbWU6IGUuZy4sICdsb2NhbHN0b3JhZ2UnIGluIHRoZSBleGFtcGxlIGFib3ZlLlxuICogICBQYXRoOiBlLmcuLCAnbXktbW9kZWwnIGluIHRoZSBleGFtcGxlIGFib3ZlLlxuICovXG5mdW5jdGlvbiBwYXJzZVVSTCh1cmw6IHN0cmluZyk6IHtzY2hlbWU6IHN0cmluZywgcGF0aDogc3RyaW5nfSB7XG4gIGlmICh1cmwuaW5kZXhPZihVUkxfU0NIRU1FX1NVRkZJWCkgPT09IC0xKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgVGhlIHVybCBzdHJpbmcgcHJvdmlkZWQgZG9lcyBub3QgY29udGFpbiBhIHNjaGVtZS4gYCArXG4gICAgICAgIGBTdXBwb3J0ZWQgc2NoZW1lcyBhcmU6IGAgK1xuICAgICAgICBgJHtNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldFNjaGVtZXMoKS5qb2luKCcsJyl9YCk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBzY2hlbWU6IHVybC5zcGxpdChVUkxfU0NIRU1FX1NVRkZJWClbMF0sXG4gICAgcGF0aDogdXJsLnNwbGl0KFVSTF9TQ0hFTUVfU1VGRklYKVsxXSxcbiAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gY2xvbmVNb2RlbEludGVybmFsKFxuICAgIHNvdXJjZVVSTDogc3RyaW5nLCBkZXN0VVJMOiBzdHJpbmcsXG4gICAgZGVsZXRlU291cmNlID0gZmFsc2UpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzSW5mbz4ge1xuICBhc3NlcnQoXG4gICAgICBzb3VyY2VVUkwgIT09IGRlc3RVUkwsXG4gICAgICAoKSA9PiBgT2xkIHBhdGggYW5kIG5ldyBwYXRoIGFyZSB0aGUgc2FtZTogJyR7c291cmNlVVJMfSdgKTtcblxuICBjb25zdCBsb2FkSGFuZGxlcnMgPSBJT1JvdXRlclJlZ2lzdHJ5LmdldExvYWRIYW5kbGVycyhzb3VyY2VVUkwpO1xuICBhc3NlcnQoXG4gICAgICBsb2FkSGFuZGxlcnMubGVuZ3RoID4gMCxcbiAgICAgICgpID0+IGBDb3B5aW5nIGZhaWxlZCBiZWNhdXNlIG5vIGxvYWQgaGFuZGxlciBpcyBmb3VuZCBmb3Igc291cmNlIFVSTCAke1xuICAgICAgICAgIHNvdXJjZVVSTH0uYCk7XG4gIGFzc2VydChcbiAgICAgIGxvYWRIYW5kbGVycy5sZW5ndGggPCAyLFxuICAgICAgKCkgPT4gYENvcHlpbmcgZmFpbGVkIGJlY2F1c2UgbW9yZSB0aGFuIG9uZSAoJHtsb2FkSGFuZGxlcnMubGVuZ3RofSkgYCArXG4gICAgICAgICAgYGxvYWQgaGFuZGxlcnMgZm9yIHNvdXJjZSBVUkwgJHtzb3VyY2VVUkx9LmApO1xuICBjb25zdCBsb2FkSGFuZGxlciA9IGxvYWRIYW5kbGVyc1swXTtcblxuICBjb25zdCBzYXZlSGFuZGxlcnMgPSBJT1JvdXRlclJlZ2lzdHJ5LmdldFNhdmVIYW5kbGVycyhkZXN0VVJMKTtcbiAgYXNzZXJ0KFxuICAgICAgc2F2ZUhhbmRsZXJzLmxlbmd0aCA+IDAsXG4gICAgICAoKSA9PiBgQ29weWluZyBmYWlsZWQgYmVjYXVzZSBubyBzYXZlIGhhbmRsZXIgaXMgZm91bmQgZm9yIGRlc3RpbmF0aW9uIGAgK1xuICAgICAgICAgIGBVUkwgJHtkZXN0VVJMfS5gKTtcbiAgYXNzZXJ0KFxuICAgICAgc2F2ZUhhbmRsZXJzLmxlbmd0aCA8IDIsXG4gICAgICAoKSA9PiBgQ29weWluZyBmYWlsZWQgYmVjYXVzZSBtb3JlIHRoYW4gb25lICgke2xvYWRIYW5kbGVycy5sZW5ndGh9KSBgICtcbiAgICAgICAgICBgc2F2ZSBoYW5kbGVycyBmb3IgZGVzdGluYXRpb24gVVJMICR7ZGVzdFVSTH0uYCk7XG4gIGNvbnN0IHNhdmVIYW5kbGVyID0gc2F2ZUhhbmRsZXJzWzBdO1xuXG4gIGNvbnN0IHNvdXJjZVNjaGVtZSA9IHBhcnNlVVJMKHNvdXJjZVVSTCkuc2NoZW1lO1xuICBjb25zdCBzb3VyY2VQYXRoID0gcGFyc2VVUkwoc291cmNlVVJMKS5wYXRoO1xuICBjb25zdCBzYW1lTWVkaXVtID0gc291cmNlU2NoZW1lID09PSBwYXJzZVVSTChzb3VyY2VVUkwpLnNjaGVtZTtcblxuICBjb25zdCBtb2RlbEFydGlmYWN0cyA9IGF3YWl0IGxvYWRIYW5kbGVyLmxvYWQoKTtcblxuICAvLyBJZiBtb3Zpbmcgd2l0aGluIHRoZSBzYW1lIHN0b3JhZ2UgbWVkaXVtLCByZW1vdmUgdGhlIG9sZCBtb2RlbCBhcyBzb29uIGFzXG4gIC8vIHRoZSBsb2FkaW5nIGlzIGRvbmUuIFdpdGhvdXQgZG9pbmcgdGhpcywgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgY29tYmluZWRcbiAgLy8gc2l6ZSBvZiB0aGUgdHdvIG1vZGVscyB3aWxsIGNhdXNlIHRoZSBjbG9uaW5nIHRvIGZhaWwuXG4gIGlmIChkZWxldGVTb3VyY2UgJiYgc2FtZU1lZGl1bSkge1xuICAgIGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzb3VyY2VTY2hlbWUpXG4gICAgICAgIC5yZW1vdmVNb2RlbChzb3VyY2VQYXRoKTtcbiAgfVxuXG4gIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBzYXZlSGFuZGxlci5zYXZlKG1vZGVsQXJ0aWZhY3RzKTtcblxuICAvLyBJZiBtb3ZpbmcgYmV0d2VlbiBtZWRpdW1zLCB0aGUgZGVsZXRpb24gaXMgZG9uZSBhZnRlciB0aGUgc2F2ZSBzdWNjZWVkcy5cbiAgLy8gVGhpcyBndWFyZHMgYWdhaW5zdCB0aGUgY2FzZSBpbiB3aGljaCBzYXZpbmcgdG8gdGhlIGRlc3RpbmF0aW9uIG1lZGl1bVxuICAvLyBmYWlscy5cbiAgaWYgKGRlbGV0ZVNvdXJjZSAmJiAhc2FtZU1lZGl1bSkge1xuICAgIGF3YWl0IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzb3VyY2VTY2hlbWUpXG4gICAgICAgIC5yZW1vdmVNb2RlbChzb3VyY2VQYXRoKTtcbiAgfVxuXG4gIHJldHVybiBzYXZlUmVzdWx0Lm1vZGVsQXJ0aWZhY3RzSW5mbztcbn1cblxuLyoqXG4gKiBMaXN0IGFsbCBtb2RlbHMgc3RvcmVkIGluIHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW1zLlxuICpcbiAqIEZvciBhIHdlYiBicm93c2VyIGVudmlyb25tZW50LCB0aGUgcmVnaXN0ZXJlZCBtZWRpdW1zIGFyZSBMb2NhbCBTdG9yYWdlIGFuZFxuICogSW5kZXhlZERCLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBGaXJzdCBjcmVhdGUgYW5kIHNhdmUgYSBtb2RlbC5cbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZShcbiAqICAgICB7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBUaGVuIGxpc3QgZXhpc3RpbmcgbW9kZWxzLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gRGVsZXRlIHRoZSBtb2RlbC5cbiAqIGF3YWl0IHRmLmlvLnJlbW92ZU1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gTGlzdCBtb2RlbHMgYWdhaW4uXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqIGBgYFxuICpcbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mIGEgZGljdGlvbmFyeSBtYXBwaW5nIFVSTHMgb2YgZXhpc3RpbmcgbW9kZWxzIHRvXG4gKiB0aGVpciBtb2RlbCBhcnRpZmFjdHMgaW5mby4gVVJMcyBpbmNsdWRlIG1lZGl1bS1zcGVjaWZpYyBzY2hlbWVzLCBlLmcuLFxuICogICAnaW5kZXhlZGRiOi8vbXkvbW9kZWwvMScuIE1vZGVsIGFydGlmYWN0cyBpbmZvIGluY2x1ZGUgdHlwZSBvZiB0aGVcbiAqIG1vZGVsJ3MgdG9wb2xvZ3ksIGJ5dGUgc2l6ZXMgb2YgdGhlIHRvcG9sb2d5LCB3ZWlnaHRzLCBldGMuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTWFuYWdlbWVudCcsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gbGlzdE1vZGVscygpOiBQcm9taXNlPHtbdXJsOiBzdHJpbmddOiBNb2RlbEFydGlmYWN0c0luZm99PiB7XG4gIGNvbnN0IHNjaGVtZXMgPSBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LmdldFNjaGVtZXMoKTtcbiAgY29uc3Qgb3V0OiB7W3VybDogc3RyaW5nXTogTW9kZWxBcnRpZmFjdHNJbmZvfSA9IHt9O1xuICBmb3IgKGNvbnN0IHNjaGVtZSBvZiBzY2hlbWVzKSB7XG4gICAgY29uc3Qgc2NoZW1lT3V0ID1cbiAgICAgICAgYXdhaXQgTW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeS5nZXRNYW5hZ2VyKHNjaGVtZSkubGlzdE1vZGVscygpO1xuICAgIGZvciAoY29uc3QgcGF0aCBpbiBzY2hlbWVPdXQpIHtcbiAgICAgIGNvbnN0IHVybCA9IHNjaGVtZSArIFVSTF9TQ0hFTUVfU1VGRklYICsgcGF0aDtcbiAgICAgIG91dFt1cmxdID0gc2NoZW1lT3V0W3BhdGhdO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIFJlbW92ZSBhIG1vZGVsIHNwZWNpZmllZCBieSBVUkwgZnJvbSBhIHJlZ2lzdGVyZWQgc3RvcmFnZSBtZWRpdW0uXG4gKlxuICogYGBganNcbiAqIC8vIEZpcnN0IGNyZWF0ZSBhbmQgc2F2ZSBhIG1vZGVsLlxuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKFxuICogICAgIHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICogYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIFRoZW4gbGlzdCBleGlzdGluZyBtb2RlbHMuXG4gKiBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhd2FpdCB0Zi5pby5saXN0TW9kZWxzKCkpKTtcbiAqXG4gKiAvLyBEZWxldGUgdGhlIG1vZGVsLlxuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqXG4gKiAvLyBMaXN0IG1vZGVscyBhZ2Fpbi5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHVybCBBIFVSTCB0byBhIHN0b3JlZCBtb2RlbCwgd2l0aCBhIHNjaGVtZSBwcmVmaXgsIGUuZy4sXG4gKiAgICdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbC0xJywgJ2luZGV4ZWRkYjovL215L21vZGVsLzInLlxuICogQHJldHVybnMgTW9kZWxBcnRpZmFjdHNJbmZvIG9mIHRoZSBkZWxldGVkIG1vZGVsIChpZiBhbmQgb25seSBpZiBkZWxldGlvblxuICogICBpcyBzdWNjZXNzZnVsKS5cbiAqIEB0aHJvd3MgRXJyb3IgaWYgZGVsZXRpb24gZmFpbHMsIGUuZy4sIGlmIG5vIG1vZGVsIGV4aXN0cyBhdCBgcGF0aGAuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTWFuYWdlbWVudCcsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVtb3ZlTW9kZWwodXJsOiBzdHJpbmcpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzSW5mbz4ge1xuICBjb25zdCBzY2hlbWVBbmRQYXRoID0gcGFyc2VVUkwodXJsKTtcbiAgY29uc3QgbWFuYWdlciA9IE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkuZ2V0TWFuYWdlcihzY2hlbWVBbmRQYXRoLnNjaGVtZSk7XG4gIHJldHVybiBtYW5hZ2VyLnJlbW92ZU1vZGVsKHNjaGVtZUFuZFBhdGgucGF0aCk7XG59XG5cbi8qKlxuICogQ29weSBhIG1vZGVsIGZyb20gb25lIFVSTCB0byBhbm90aGVyLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gc3VwcG9ydHM6XG4gKlxuICogMS4gQ29weWluZyB3aXRoaW4gYSBzdG9yYWdlIG1lZGl1bSwgZS5nLixcbiAqICAgIGB0Zi5pby5jb3B5TW9kZWwoJ2xvY2Fsc3RvcmFnZTovL21vZGVsLTEnLCAnbG9jYWxzdG9yYWdlOi8vbW9kZWwtMicpYFxuICogMi4gQ29weWluZyBiZXR3ZWVuIHR3byBzdG9yYWdlIG1lZGl1bXMsIGUuZy4sXG4gKiAgICBgdGYuaW8uY29weU1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0xJywgJ2luZGV4ZWRkYjovL21vZGVsLTEnKWBcbiAqXG4gKiBgYGBqc1xuICogLy8gRmlyc3QgY3JlYXRlIGFuZCBzYXZlIGEgbW9kZWwuXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBhd2FpdCBtb2RlbC5zYXZlKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gVGhlbiBsaXN0IGV4aXN0aW5nIG1vZGVscy5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIENvcHkgdGhlIG1vZGVsLCBmcm9tIExvY2FsIFN0b3JhZ2UgdG8gSW5kZXhlZERCLlxuICogYXdhaXQgdGYuaW8uY29weU1vZGVsKFxuICogICAgICdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyxcbiAqICAgICAnaW5kZXhlZGRiOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIExpc3QgbW9kZWxzIGFnYWluLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gUmVtb3ZlIGJvdGggbW9kZWxzLlxuICogYXdhaXQgdGYuaW8ucmVtb3ZlTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL2RlbW8vbWFuYWdlbWVudC9tb2RlbDEnKTtcbiAqIGF3YWl0IHRmLmlvLnJlbW92ZU1vZGVsKCdpbmRleGVkZGI6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc291cmNlVVJMIFNvdXJjZSBVUkwgb2YgY29weWluZy5cbiAqIEBwYXJhbSBkZXN0VVJMIERlc3RpbmF0aW9uIFVSTCBvZiBjb3B5aW5nLlxuICogQHJldHVybnMgTW9kZWxBcnRpZmFjdHNJbmZvIG9mIHRoZSBjb3BpZWQgbW9kZWwgKGlmIGFuZCBvbmx5IGlmIGNvcHlpbmdcbiAqICAgaXMgc3VjY2Vzc2Z1bCkuXG4gKiBAdGhyb3dzIEVycm9yIGlmIGNvcHlpbmcgZmFpbHMsIGUuZy4sIGlmIG5vIG1vZGVsIGV4aXN0cyBhdCBgc291cmNlVVJMYCwgb3JcbiAqICAgaWYgYG9sZFBhdGhgIGFuZCBgbmV3UGF0aGAgYXJlIGlkZW50aWNhbC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiBjb3B5TW9kZWwoXG4gICAgc291cmNlVVJMOiBzdHJpbmcsIGRlc3RVUkw6IHN0cmluZyk6IFByb21pc2U8TW9kZWxBcnRpZmFjdHNJbmZvPiB7XG4gIGNvbnN0IGRlbGV0ZVNvdXJjZSA9IGZhbHNlO1xuICByZXR1cm4gY2xvbmVNb2RlbEludGVybmFsKHNvdXJjZVVSTCwgZGVzdFVSTCwgZGVsZXRlU291cmNlKTtcbn1cblxuLyoqXG4gKiBNb3ZlIGEgbW9kZWwgZnJvbSBvbmUgVVJMIHRvIGFub3RoZXIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBzdXBwb3J0czpcbiAqXG4gKiAxLiBNb3Zpbmcgd2l0aGluIGEgc3RvcmFnZSBtZWRpdW0sIGUuZy4sXG4gKiAgICBgdGYuaW8ubW92ZU1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0xJywgJ2xvY2Fsc3RvcmFnZTovL21vZGVsLTInKWBcbiAqIDIuIE1vdmluZyBiZXR3ZWVuIHR3byBzdG9yYWdlIG1lZGl1bXMsIGUuZy4sXG4gKiAgICBgdGYuaW8ubW92ZU1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9tb2RlbC0xJywgJ2luZGV4ZWRkYjovL21vZGVsLTEnKWBcbiAqXG4gKiBgYGBqc1xuICogLy8gRmlyc3QgY3JlYXRlIGFuZCBzYXZlIGEgbW9kZWwuXG4gKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2UoXG4gKiAgICAge3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdLCBhY3RpdmF0aW9uOiAnc2lnbW9pZCd9KSk7XG4gKiBhd2FpdCBtb2RlbC5zYXZlKCdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKlxuICogLy8gVGhlbiBsaXN0IGV4aXN0aW5nIG1vZGVscy5cbiAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGF3YWl0IHRmLmlvLmxpc3RNb2RlbHMoKSkpO1xuICpcbiAqIC8vIE1vdmUgdGhlIG1vZGVsLCBmcm9tIExvY2FsIFN0b3JhZ2UgdG8gSW5kZXhlZERCLlxuICogYXdhaXQgdGYuaW8ubW92ZU1vZGVsKFxuICogICAgICdsb2NhbHN0b3JhZ2U6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyxcbiAqICAgICAnaW5kZXhlZGRiOi8vZGVtby9tYW5hZ2VtZW50L21vZGVsMScpO1xuICpcbiAqIC8vIExpc3QgbW9kZWxzIGFnYWluLlxuICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkoYXdhaXQgdGYuaW8ubGlzdE1vZGVscygpKSk7XG4gKlxuICogLy8gUmVtb3ZlIHRoZSBtb3ZlZCBtb2RlbC5cbiAqIGF3YWl0IHRmLmlvLnJlbW92ZU1vZGVsKCdpbmRleGVkZGI6Ly9kZW1vL21hbmFnZW1lbnQvbW9kZWwxJyk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc291cmNlVVJMIFNvdXJjZSBVUkwgb2YgbW92aW5nLlxuICogQHBhcmFtIGRlc3RVUkwgRGVzdGluYXRpb24gVVJMIG9mIG1vdmluZy5cbiAqIEByZXR1cm5zIE1vZGVsQXJ0aWZhY3RzSW5mbyBvZiB0aGUgY29waWVkIG1vZGVsIChpZiBhbmQgb25seSBpZiBjb3B5aW5nXG4gKiAgIGlzIHN1Y2Nlc3NmdWwpLlxuICogQHRocm93cyBFcnJvciBpZiBtb3ZpbmcgZmFpbHMsIGUuZy4sIGlmIG5vIG1vZGVsIGV4aXN0cyBhdCBgc291cmNlVVJMYCwgb3JcbiAqICAgaWYgYG9sZFBhdGhgIGFuZCBgbmV3UGF0aGAgYXJlIGlkZW50aWNhbC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdNYW5hZ2VtZW50JyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5hc3luYyBmdW5jdGlvbiBtb3ZlTW9kZWwoXG4gICAgc291cmNlVVJMOiBzdHJpbmcsIGRlc3RVUkw6IHN0cmluZyk6IFByb21pc2U8TW9kZWxBcnRpZmFjdHNJbmZvPiB7XG4gIGNvbnN0IGRlbGV0ZVNvdXJjZSA9IHRydWU7XG4gIHJldHVybiBjbG9uZU1vZGVsSW50ZXJuYWwoc291cmNlVVJMLCBkZXN0VVJMLCBkZWxldGVTb3VyY2UpO1xufVxuXG5leHBvcnQge21vdmVNb2RlbCwgY29weU1vZGVsLCByZW1vdmVNb2RlbCwgbGlzdE1vZGVsc307XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport '../flags';\nimport { env } from '../environment';\nimport { BrowserIndexedDB, BrowserIndexedDBManager } from '../io/indexed_db';\nimport { BrowserLocalStorage, BrowserLocalStorageManager } from '../io/local_storage';\nimport { ModelStoreManagerRegistry } from '../io/model_management';\nexport class PlatformBrowser {\n    constructor() {\n        // For setTimeoutCustom\n        this.messageName = 'setTimeoutCustom';\n        this.functionRefs = [];\n        this.handledMessageCount = 0;\n        this.hasEventListener = false;\n    }\n    fetch(path, init) {\n        return fetch(path, init);\n    }\n    now() {\n        return performance.now();\n    }\n    encode(text, encoding) {\n        if (encoding !== 'utf-8' && encoding !== 'utf8') {\n            throw new Error(`Browser's encoder only supports utf-8, but got ${encoding}`);\n        }\n        if (this.textEncoder == null) {\n            this.textEncoder = new TextEncoder();\n        }\n        return this.textEncoder.encode(text);\n    }\n    decode(bytes, encoding) {\n        return new TextDecoder(encoding).decode(bytes);\n    }\n    // If the setTimeout nesting level is greater than 5 and timeout is less\n    // than 4ms, timeout will be clamped to 4ms, which hurts the perf.\n    // Interleaving window.postMessage and setTimeout will trick the browser and\n    // avoid the clamp.\n    setTimeoutCustom(functionRef, delay) {\n        if (!window || !env().getBool('USE_SETTIMEOUTCUSTOM')) {\n            setTimeout(functionRef, delay);\n            return;\n        }\n        this.functionRefs.push(functionRef);\n        setTimeout(() => {\n            window.postMessage({ name: this.messageName, index: this.functionRefs.length - 1 }, '*');\n        }, delay);\n        if (!this.hasEventListener) {\n            this.hasEventListener = true;\n            window.addEventListener('message', (event) => {\n                if (event.source === window && event.data.name === this.messageName) {\n                    event.stopPropagation();\n                    const functionRef = this.functionRefs[event.data.index];\n                    functionRef();\n                    this.handledMessageCount++;\n                    if (this.handledMessageCount === this.functionRefs.length) {\n                        this.functionRefs = [];\n                        this.handledMessageCount = 0;\n                    }\n                }\n            }, true);\n        }\n    }\n}\nif (env().get('IS_BROWSER')) {\n    env().setPlatform('browser', new PlatformBrowser());\n    // Register LocalStorage IOHandler\n    try {\n        ModelStoreManagerRegistry.registerManager(BrowserLocalStorage.URL_SCHEME, new BrowserLocalStorageManager());\n    }\n    catch (err) {\n    }\n    // Register IndexedDB IOHandler\n    try {\n        ModelStoreManagerRegistry.registerManager(BrowserIndexedDB.URL_SCHEME, new BrowserIndexedDBManager());\n    }\n    catch (err) {\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm1fYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcGxhdGZvcm1zL3BsYXRmb3JtX2Jyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxVQUFVLENBQUM7QUFFbEIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ25DLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSx1QkFBdUIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzNFLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3BGLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBSWpFLE1BQU0sT0FBTyxlQUFlO0lBQTVCO1FBS0UsdUJBQXVCO1FBQ2YsZ0JBQVcsR0FBRyxrQkFBa0IsQ0FBQztRQUNqQyxpQkFBWSxHQUFlLEVBQUUsQ0FBQztRQUM5Qix3QkFBbUIsR0FBRyxDQUFDLENBQUM7UUFDeEIscUJBQWdCLEdBQUcsS0FBSyxDQUFDO0lBd0RuQyxDQUFDO0lBdERDLEtBQUssQ0FBQyxJQUFZLEVBQUUsSUFBa0I7UUFDcEMsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxHQUFHO1FBQ0QsT0FBTyxXQUFXLENBQUMsR0FBRyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7UUFDbkMsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxrREFBa0QsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNuRTtRQUNELElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLFdBQVcsRUFBRSxDQUFDO1NBQ3RDO1FBQ0QsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsTUFBTSxDQUFDLEtBQWlCLEVBQUUsUUFBZ0I7UUFDeEMsT0FBTyxJQUFJLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVELHdFQUF3RTtJQUN4RSxrRUFBa0U7SUFDbEUsNEVBQTRFO0lBQzVFLG1CQUFtQjtJQUNuQixnQkFBZ0IsQ0FBQyxXQUFxQixFQUFFLEtBQWE7UUFDbkQsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxFQUFFO1lBQ3JELFVBQVUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDL0IsT0FBTztTQUNSO1FBRUQsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDcEMsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUNkLE1BQU0sQ0FBQyxXQUFXLENBQ2QsRUFBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDMUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRVYsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUMxQixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxLQUFtQixFQUFFLEVBQUU7Z0JBQ3pELElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLFdBQVcsRUFBRTtvQkFDbkUsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO29CQUN4QixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3hELFdBQVcsRUFBRSxDQUFDO29CQUNkLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO29CQUMzQixJQUFJLElBQUksQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sRUFBRTt3QkFDekQsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7d0JBQ3ZCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUM7cUJBQzlCO2lCQUNGO1lBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ1Y7SUFDSCxDQUFDO0NBQ0Y7QUFFRCxJQUFJLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRTtJQUMzQixHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLElBQUksZUFBZSxFQUFFLENBQUMsQ0FBQztJQUVwRCxrQ0FBa0M7SUFDbEMsSUFBSTtRQUNGLHlCQUF5QixDQUFDLGVBQWUsQ0FDckMsbUJBQW1CLENBQUMsVUFBVSxFQUFFLElBQUksMEJBQTBCLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZFO0lBQUMsT0FBTyxHQUFHLEVBQUU7S0FDYjtJQUVELCtCQUErQjtJQUMvQixJQUFJO1FBQ0YseUJBQXlCLENBQUMsZUFBZSxDQUNyQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsSUFBSSx1QkFBdUIsRUFBRSxDQUFDLENBQUM7S0FDakU7SUFBQyxPQUFPLEdBQUcsRUFBRTtLQUNiO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAnLi4vZmxhZ3MnO1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtCcm93c2VySW5kZXhlZERCLCBCcm93c2VySW5kZXhlZERCTWFuYWdlcn0gZnJvbSAnLi4vaW8vaW5kZXhlZF9kYic7XG5pbXBvcnQge0Jyb3dzZXJMb2NhbFN0b3JhZ2UsIEJyb3dzZXJMb2NhbFN0b3JhZ2VNYW5hZ2VyfSBmcm9tICcuLi9pby9sb2NhbF9zdG9yYWdlJztcbmltcG9ydCB7TW9kZWxTdG9yZU1hbmFnZXJSZWdpc3RyeX0gZnJvbSAnLi4vaW8vbW9kZWxfbWFuYWdlbWVudCc7XG5cbmltcG9ydCB7UGxhdGZvcm19IGZyb20gJy4vcGxhdGZvcm0nO1xuXG5leHBvcnQgY2xhc3MgUGxhdGZvcm1Ccm93c2VyIGltcGxlbWVudHMgUGxhdGZvcm0ge1xuICAvLyBBY2NvcmRpbmcgdG8gdGhlIHNwZWMsIHRoZSBidWlsdC1pbiBlbmNvZGVyIGNhbiBkbyBvbmx5IFVURi04IGVuY29kaW5nLlxuICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvVGV4dEVuY29kZXIvVGV4dEVuY29kZXJcbiAgcHJpdmF0ZSB0ZXh0RW5jb2RlcjogVGV4dEVuY29kZXI7XG5cbiAgLy8gRm9yIHNldFRpbWVvdXRDdXN0b21cbiAgcHJpdmF0ZSBtZXNzYWdlTmFtZSA9ICdzZXRUaW1lb3V0Q3VzdG9tJztcbiAgcHJpdmF0ZSBmdW5jdGlvblJlZnM6IEZ1bmN0aW9uW10gPSBbXTtcbiAgcHJpdmF0ZSBoYW5kbGVkTWVzc2FnZUNvdW50ID0gMDtcbiAgcHJpdmF0ZSBoYXNFdmVudExpc3RlbmVyID0gZmFsc2U7XG5cbiAgZmV0Y2gocGF0aDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgcmV0dXJuIGZldGNoKHBhdGgsIGluaXQpO1xuICB9XG5cbiAgbm93KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHBlcmZvcm1hbmNlLm5vdygpO1xuICB9XG5cbiAgZW5jb2RlKHRleHQ6IHN0cmluZywgZW5jb2Rpbmc6IHN0cmluZyk6IFVpbnQ4QXJyYXkge1xuICAgIGlmIChlbmNvZGluZyAhPT0gJ3V0Zi04JyAmJiBlbmNvZGluZyAhPT0gJ3V0ZjgnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEJyb3dzZXIncyBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgdXRmLTgsIGJ1dCBnb3QgJHtlbmNvZGluZ31gKTtcbiAgICB9XG4gICAgaWYgKHRoaXMudGV4dEVuY29kZXIgPT0gbnVsbCkge1xuICAgICAgdGhpcy50ZXh0RW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy50ZXh0RW5jb2Rlci5lbmNvZGUodGV4dCk7XG4gIH1cbiAgZGVjb2RlKGJ5dGVzOiBVaW50OEFycmF5LCBlbmNvZGluZzogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gbmV3IFRleHREZWNvZGVyKGVuY29kaW5nKS5kZWNvZGUoYnl0ZXMpO1xuICB9XG5cbiAgLy8gSWYgdGhlIHNldFRpbWVvdXQgbmVzdGluZyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gNSBhbmQgdGltZW91dCBpcyBsZXNzXG4gIC8vIHRoYW4gNG1zLCB0aW1lb3V0IHdpbGwgYmUgY2xhbXBlZCB0byA0bXMsIHdoaWNoIGh1cnRzIHRoZSBwZXJmLlxuICAvLyBJbnRlcmxlYXZpbmcgd2luZG93LnBvc3RNZXNzYWdlIGFuZCBzZXRUaW1lb3V0IHdpbGwgdHJpY2sgdGhlIGJyb3dzZXIgYW5kXG4gIC8vIGF2b2lkIHRoZSBjbGFtcC5cbiAgc2V0VGltZW91dEN1c3RvbShmdW5jdGlvblJlZjogRnVuY3Rpb24sIGRlbGF5OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoIXdpbmRvdyB8fCAhZW52KCkuZ2V0Qm9vbCgnVVNFX1NFVFRJTUVPVVRDVVNUT00nKSkge1xuICAgICAgc2V0VGltZW91dChmdW5jdGlvblJlZiwgZGVsYXkpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZnVuY3Rpb25SZWZzLnB1c2goZnVuY3Rpb25SZWYpO1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgd2luZG93LnBvc3RNZXNzYWdlKFxuICAgICAgICAgIHtuYW1lOiB0aGlzLm1lc3NhZ2VOYW1lLCBpbmRleDogdGhpcy5mdW5jdGlvblJlZnMubGVuZ3RoIC0gMX0sICcqJyk7XG4gICAgfSwgZGVsYXkpO1xuXG4gICAgaWYgKCF0aGlzLmhhc0V2ZW50TGlzdGVuZXIpIHtcbiAgICAgIHRoaXMuaGFzRXZlbnRMaXN0ZW5lciA9IHRydWU7XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIChldmVudDogTWVzc2FnZUV2ZW50KSA9PiB7XG4gICAgICAgIGlmIChldmVudC5zb3VyY2UgPT09IHdpbmRvdyAmJiBldmVudC5kYXRhLm5hbWUgPT09IHRoaXMubWVzc2FnZU5hbWUpIHtcbiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICBjb25zdCBmdW5jdGlvblJlZiA9IHRoaXMuZnVuY3Rpb25SZWZzW2V2ZW50LmRhdGEuaW5kZXhdO1xuICAgICAgICAgIGZ1bmN0aW9uUmVmKCk7XG4gICAgICAgICAgdGhpcy5oYW5kbGVkTWVzc2FnZUNvdW50Kys7XG4gICAgICAgICAgaWYgKHRoaXMuaGFuZGxlZE1lc3NhZ2VDb3VudCA9PT0gdGhpcy5mdW5jdGlvblJlZnMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZ1bmN0aW9uUmVmcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5oYW5kbGVkTWVzc2FnZUNvdW50ID0gMDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sIHRydWUpO1xuICAgIH1cbiAgfVxufVxuXG5pZiAoZW52KCkuZ2V0KCdJU19CUk9XU0VSJykpIHtcbiAgZW52KCkuc2V0UGxhdGZvcm0oJ2Jyb3dzZXInLCBuZXcgUGxhdGZvcm1Ccm93c2VyKCkpO1xuXG4gIC8vIFJlZ2lzdGVyIExvY2FsU3RvcmFnZSBJT0hhbmRsZXJcbiAgdHJ5IHtcbiAgICBNb2RlbFN0b3JlTWFuYWdlclJlZ2lzdHJ5LnJlZ2lzdGVyTWFuYWdlcihcbiAgICAgICAgQnJvd3NlckxvY2FsU3RvcmFnZS5VUkxfU0NIRU1FLCBuZXcgQnJvd3NlckxvY2FsU3RvcmFnZU1hbmFnZXIoKSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICB9XG5cbiAgLy8gUmVnaXN0ZXIgSW5kZXhlZERCIElPSGFuZGxlclxuICB0cnkge1xuICAgIE1vZGVsU3RvcmVNYW5hZ2VyUmVnaXN0cnkucmVnaXN0ZXJNYW5hZ2VyKFxuICAgICAgICBCcm93c2VySW5kZXhlZERCLlVSTF9TQ0hFTUUsIG5ldyBCcm93c2VySW5kZXhlZERCTWFuYWdlcigpKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '../environment';\n// We are wrapping this within an object so it can be stubbed by Jasmine.\nexport const getNodeFetch = {\n    // tslint:disable-next-line:no-require-imports\n    importFetch: () => require('node-fetch')\n};\nlet systemFetch;\n// These getters and setters are for testing so we don't export a mutable\n// variable.\nexport function resetSystemFetch() {\n    systemFetch = null;\n}\nexport function setSystemFetch(fetchFn) {\n    systemFetch = fetchFn;\n}\nexport function getSystemFetch() {\n    return systemFetch;\n}\nexport class PlatformNode {\n    constructor() {\n        // tslint:disable-next-line:no-require-imports\n        this.util = require('util');\n        // According to the spec, the built-in encoder can do only UTF-8 encoding.\n        // https://developer.mozilla.org/en-US/docs/Web/API/TextEncoder/TextEncoder\n        this.textEncoder = new this.util.TextEncoder();\n    }\n    fetch(path, requestInits) {\n        if (env().global.fetch != null) {\n            return env().global.fetch(path, requestInits);\n        }\n        if (systemFetch == null) {\n            systemFetch = getNodeFetch.importFetch();\n        }\n        return systemFetch(path, requestInits);\n    }\n    now() {\n        const time = process.hrtime();\n        return time[0] * 1000 + time[1] / 1000000;\n    }\n    encode(text, encoding) {\n        if (encoding !== 'utf-8' && encoding !== 'utf8') {\n            throw new Error(`Node built-in encoder only supports utf-8, but got ${encoding}`);\n        }\n        return this.textEncoder.encode(text);\n    }\n    decode(bytes, encoding) {\n        if (bytes.length === 0) {\n            return '';\n        }\n        return new this.util.TextDecoder(encoding).decode(bytes);\n    }\n}\nif (env().get('IS_NODE') && !env().get('IS_BROWSER')) {\n    env().setPlatform('node', new PlatformNode());\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm1fbm9kZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcGxhdGZvcm1zL3BsYXRmb3JtX25vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR25DLHlFQUF5RTtBQUN6RSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUc7SUFDMUIsOENBQThDO0lBQzlDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDO0NBQ3pDLENBQUM7QUFHRixJQUFJLFdBQW9CLENBQUM7QUFDekIseUVBQXlFO0FBQ3pFLFlBQVk7QUFDWixNQUFNLFVBQVUsZ0JBQWdCO0lBQzlCLFdBQVcsR0FBRyxJQUFJLENBQUM7QUFDckIsQ0FBQztBQUNELE1BQU0sVUFBVSxjQUFjLENBQUMsT0FBZ0I7SUFDN0MsV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUN4QixDQUFDO0FBQ0QsTUFBTSxVQUFVLGNBQWM7SUFDNUIsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sT0FBTyxZQUFZO0lBS3ZCO1FBQ0UsOENBQThDO1FBQzlDLElBQUksQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVCLDBFQUEwRTtRQUMxRSwyRUFBMkU7UUFDM0UsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDakQsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFZLEVBQUUsWUFBMEI7UUFDNUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUM5QixPQUFPLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxDQUFDO1NBQy9DO1FBRUQsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1lBQ3ZCLFdBQVcsR0FBRyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDMUM7UUFDRCxPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELEdBQUc7UUFDRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUIsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFZLEVBQUUsUUFBZ0I7UUFDbkMsSUFBSSxRQUFRLEtBQUssT0FBTyxJQUFJLFFBQVEsS0FBSyxNQUFNLEVBQUU7WUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxzREFBc0QsUUFBUSxFQUFFLENBQUMsQ0FBQztTQUN2RTtRQUNELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUNELE1BQU0sQ0FBQyxLQUFpQixFQUFFLFFBQWdCO1FBQ3hDLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsT0FBTyxFQUFFLENBQUM7U0FDWDtRQUNELE9BQU8sSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0QsQ0FBQztDQUNGO0FBRUQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUU7SUFDcEQsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxJQUFJLFlBQVksRUFBRSxDQUFDLENBQUM7Q0FDL0MiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtQbGF0Zm9ybX0gZnJvbSAnLi9wbGF0Zm9ybSc7XG5cbi8vIFdlIGFyZSB3cmFwcGluZyB0aGlzIHdpdGhpbiBhbiBvYmplY3Qgc28gaXQgY2FuIGJlIHN0dWJiZWQgYnkgSmFzbWluZS5cbmV4cG9ydCBjb25zdCBnZXROb2RlRmV0Y2ggPSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1yZXF1aXJlLWltcG9ydHNcbiAgaW1wb3J0RmV0Y2g6ICgpID0+IHJlcXVpcmUoJ25vZGUtZmV0Y2gnKVxufTtcblxudHlwZSBGZXRjaEZuID0gKHVybDogc3RyaW5nLCBpbml0PzogUmVxdWVzdEluaXQpID0+IFByb21pc2U8UmVzcG9uc2U+O1xubGV0IHN5c3RlbUZldGNoOiBGZXRjaEZuO1xuLy8gVGhlc2UgZ2V0dGVycyBhbmQgc2V0dGVycyBhcmUgZm9yIHRlc3Rpbmcgc28gd2UgZG9uJ3QgZXhwb3J0IGEgbXV0YWJsZVxuLy8gdmFyaWFibGUuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRTeXN0ZW1GZXRjaCgpIHtcbiAgc3lzdGVtRmV0Y2ggPSBudWxsO1xufVxuZXhwb3J0IGZ1bmN0aW9uIHNldFN5c3RlbUZldGNoKGZldGNoRm46IEZldGNoRm4pIHtcbiAgc3lzdGVtRmV0Y2ggPSBmZXRjaEZuO1xufVxuZXhwb3J0IGZ1bmN0aW9uIGdldFN5c3RlbUZldGNoKCk6IEZldGNoRm4ge1xuICByZXR1cm4gc3lzdGVtRmV0Y2g7XG59XG5cbmV4cG9ydCBjbGFzcyBQbGF0Zm9ybU5vZGUgaW1wbGVtZW50cyBQbGF0Zm9ybSB7XG4gIHByaXZhdGUgdGV4dEVuY29kZXI6IFRleHRFbmNvZGVyO1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIHV0aWw6IGFueTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tcmVxdWlyZS1pbXBvcnRzXG4gICAgdGhpcy51dGlsID0gcmVxdWlyZSgndXRpbCcpO1xuICAgIC8vIEFjY29yZGluZyB0byB0aGUgc3BlYywgdGhlIGJ1aWx0LWluIGVuY29kZXIgY2FuIGRvIG9ubHkgVVRGLTggZW5jb2RpbmcuXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL1RleHRFbmNvZGVyL1RleHRFbmNvZGVyXG4gICAgdGhpcy50ZXh0RW5jb2RlciA9IG5ldyB0aGlzLnV0aWwuVGV4dEVuY29kZXIoKTtcbiAgfVxuXG4gIGZldGNoKHBhdGg6IHN0cmluZywgcmVxdWVzdEluaXRzPzogUmVxdWVzdEluaXQpOiBQcm9taXNlPFJlc3BvbnNlPiB7XG4gICAgaWYgKGVudigpLmdsb2JhbC5mZXRjaCAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZW52KCkuZ2xvYmFsLmZldGNoKHBhdGgsIHJlcXVlc3RJbml0cyk7XG4gICAgfVxuXG4gICAgaWYgKHN5c3RlbUZldGNoID09IG51bGwpIHtcbiAgICAgIHN5c3RlbUZldGNoID0gZ2V0Tm9kZUZldGNoLmltcG9ydEZldGNoKCk7XG4gICAgfVxuICAgIHJldHVybiBzeXN0ZW1GZXRjaChwYXRoLCByZXF1ZXN0SW5pdHMpO1xuICB9XG5cbiAgbm93KCk6IG51bWJlciB7XG4gICAgY29uc3QgdGltZSA9IHByb2Nlc3MuaHJ0aW1lKCk7XG4gICAgcmV0dXJuIHRpbWVbMF0gKiAxMDAwICsgdGltZVsxXSAvIDEwMDAwMDA7XG4gIH1cblxuICBlbmNvZGUodGV4dDogc3RyaW5nLCBlbmNvZGluZzogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgaWYgKGVuY29kaW5nICE9PSAndXRmLTgnICYmIGVuY29kaW5nICE9PSAndXRmOCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTm9kZSBidWlsdC1pbiBlbmNvZGVyIG9ubHkgc3VwcG9ydHMgdXRmLTgsIGJ1dCBnb3QgJHtlbmNvZGluZ31gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudGV4dEVuY29kZXIuZW5jb2RlKHRleHQpO1xuICB9XG4gIGRlY29kZShieXRlczogVWludDhBcnJheSwgZW5jb2Rpbmc6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgaWYgKGJ5dGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMudXRpbC5UZXh0RGVjb2RlcihlbmNvZGluZykuZGVjb2RlKGJ5dGVzKTtcbiAgfVxufVxuXG5pZiAoZW52KCkuZ2V0KCdJU19OT0RFJykgJiYgIWVudigpLmdldCgnSVNfQlJPV1NFUicpKSB7XG4gIGVudigpLnNldFBsYXRmb3JtKCdub2RlJywgbmV3IFBsYXRmb3JtTm9kZSgpKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { TensorBuffer } from '../tensor';\nimport * as util from '../util';\n/**\n * Creates an empty `tf.TensorBuffer` with the specified `shape` and `dtype`.\n *\n * The values are stored in CPU as `TypedArray`. Fill the buffer using\n * `buffer.set()`, or by modifying directly `buffer.values`.\n *\n * When done, call `buffer.toTensor()` to get an immutable `tf.Tensor` with\n * those values.\n *\n * ```js\n * // Create a buffer and set values at particular indices.\n * const buffer = tf.buffer([2, 2]);\n * buffer.set(3, 0, 0);\n * buffer.set(5, 1, 0);\n *\n * // Convert the buffer back to a tensor.\n * buffer.toTensor().print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param dtype The dtype of the buffer. Defaults to 'float32'.\n * @param values The values of the buffer as `TypedArray`. Defaults to\n * zeros.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function buffer(shape, dtype = 'float32', values) {\n    dtype = dtype || 'float32';\n    util.assertNonNegativeIntegerDimensions(shape);\n    return new TensorBuffer(shape, dtype, values);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVmZmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYnVmZmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFdkMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F5Qkc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUNsQixLQUFrQixFQUFFLFFBQVcsU0FBYyxFQUM3QyxNQUF1QjtJQUN6QixLQUFLLEdBQUcsS0FBSyxJQUFJLFNBQWMsQ0FBQztJQUNoQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTyxJQUFJLFlBQVksQ0FBTyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yQnVmZmVyfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgRGF0YVR5cGVNYXAsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gZW1wdHkgYHRmLlRlbnNvckJ1ZmZlcmAgd2l0aCB0aGUgc3BlY2lmaWVkIGBzaGFwZWAgYW5kIGBkdHlwZWAuXG4gKlxuICogVGhlIHZhbHVlcyBhcmUgc3RvcmVkIGluIENQVSBhcyBgVHlwZWRBcnJheWAuIEZpbGwgdGhlIGJ1ZmZlciB1c2luZ1xuICogYGJ1ZmZlci5zZXQoKWAsIG9yIGJ5IG1vZGlmeWluZyBkaXJlY3RseSBgYnVmZmVyLnZhbHVlc2AuXG4gKlxuICogV2hlbiBkb25lLCBjYWxsIGBidWZmZXIudG9UZW5zb3IoKWAgdG8gZ2V0IGFuIGltbXV0YWJsZSBgdGYuVGVuc29yYCB3aXRoXG4gKiB0aG9zZSB2YWx1ZXMuXG4gKlxuICogYGBganNcbiAqIC8vIENyZWF0ZSBhIGJ1ZmZlciBhbmQgc2V0IHZhbHVlcyBhdCBwYXJ0aWN1bGFyIGluZGljZXMuXG4gKiBjb25zdCBidWZmZXIgPSB0Zi5idWZmZXIoWzIsIDJdKTtcbiAqIGJ1ZmZlci5zZXQoMywgMCwgMCk7XG4gKiBidWZmZXIuc2V0KDUsIDEsIDApO1xuICpcbiAqIC8vIENvbnZlcnQgdGhlIGJ1ZmZlciBiYWNrIHRvIGEgdGVuc29yLlxuICogYnVmZmVyLnRvVGVuc29yKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZHR5cGUgb2YgdGhlIGJ1ZmZlci4gRGVmYXVsdHMgdG8gJ2Zsb2F0MzInLlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSBidWZmZXIgYXMgYFR5cGVkQXJyYXlgLiBEZWZhdWx0cyB0b1xuICogemVyb3MuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnVmZmVyPFIgZXh0ZW5kcyBSYW5rLCBEIGV4dGVuZHMgRGF0YVR5cGUgPSAnZmxvYXQzMic+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgZHR5cGU6IEQgPSAnZmxvYXQzMicgYXMgRCxcbiAgICB2YWx1ZXM/OiBEYXRhVHlwZU1hcFtEXSk6IFRlbnNvckJ1ZmZlcjxSLCBEPiB7XG4gIGR0eXBlID0gZHR5cGUgfHwgJ2Zsb2F0MzInIGFzIEQ7XG4gIHV0aWwuYXNzZXJ0Tm9uTmVnYXRpdmVJbnRlZ2VyRGltZW5zaW9ucyhzaGFwZSk7XG4gIHJldHVybiBuZXcgVGVuc29yQnVmZmVyPFIsIEQ+KHNoYXBlLCBkdHlwZSwgdmFsdWVzKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cast } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Casts a `tf.Tensor` to a new dtype.\n *\n * ```js\n * const x = tf.tensor1d([1.5, 2.5, 3]);\n * tf.cast(x, 'int32').print();\n * ```\n * @param x The input tensor to be casted.\n * @param dtype The dtype to cast the input tensor to.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction cast_(x, dtype) {\n    const $x = convertToTensor(x, 'x', 'cast');\n    // Sanity checks.\n    if (!util.isValidDtype(dtype)) {\n        throw new Error(`Failed to cast to unknown dtype ${dtype}`);\n    }\n    if (dtype === 'string' && $x.dtype !== 'string' ||\n        dtype !== 'string' && $x.dtype === 'string') {\n        throw new Error('Only strings can be casted to strings');\n    }\n    const inputs = { x: $x };\n    const attrs = { dtype };\n    return ENGINE.runKernel(Cast, inputs, attrs);\n}\nexport const cast = op({ cast_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Nhc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxLQUFLLENBQW1CLENBQWUsRUFBRSxLQUFlO0lBQy9ELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNDLGlCQUFpQjtJQUNqQixJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsSUFBSSxLQUFLLEtBQUssUUFBUSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssUUFBUTtRQUMzQyxLQUFLLEtBQUssUUFBUSxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQUMsdUNBQXVDLENBQUMsQ0FBQztLQUMxRDtJQUVELE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFjLEVBQUMsS0FBSyxFQUFDLENBQUM7SUFFakMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixJQUFJLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0Nhc3QsIENhc3RBdHRycywgQ2FzdElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge0RhdGFUeXBlLCBUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ2FzdHMgYSBgdGYuVGVuc29yYCB0byBhIG5ldyBkdHlwZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLjUsIDIuNSwgM10pO1xuICogdGYuY2FzdCh4LCAnaW50MzInKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIGNhc3RlZC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZHR5cGUgdG8gY2FzdCB0aGUgaW5wdXQgdGVuc29yIHRvLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGNhc3RfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSwgZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Nhc3QnKTtcblxuICAvLyBTYW5pdHkgY2hlY2tzLlxuICBpZiAoIXV0aWwuaXNWYWxpZER0eXBlKGR0eXBlKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRmFpbGVkIHRvIGNhc3QgdG8gdW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICB9XG4gIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgJHguZHR5cGUgIT09ICdzdHJpbmcnIHx8XG4gICAgICBkdHlwZSAhPT0gJ3N0cmluZycgJiYgJHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdPbmx5IHN0cmluZ3MgY2FuIGJlIGNhc3RlZCB0byBzdHJpbmdzJyk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IENhc3RJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogQ2FzdEF0dHJzID0ge2R0eXBlfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIENhc3QsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNhc3QgPSBvcCh7Y2FzdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Identity } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Creates a new tensor with the same values and shape as the specified\n * tensor.\n *\n * ```js\n * const x = tf.tensor([1, 2]);\n *\n * x.clone().print();\n * ```\n *\n * @param x The tensor to clone.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction clone_(x) {\n    const $x = convertToTensor(x, 'x', 'clone', 'string_or_numeric');\n    const inputs = { x: $x };\n    // Note this op is called tf.identity in python. Hence the kernel name used\n    // here.\n    return ENGINE.runKernel(Identity, inputs);\n}\nexport const clone = op({ clone_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xvbmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9jbG9uZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFHekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsTUFBTSxDQUFtQixDQUFlO0lBQy9DLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV2QywyRUFBMkU7SUFDM0UsUUFBUTtJQUNSLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0lkZW50aXR5LCBJZGVudGl0eUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRlbnNvciB3aXRoIHRoZSBzYW1lIHZhbHVlcyBhbmQgc2hhcGUgYXMgdGhlIHNwZWNpZmllZFxuICogdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyXSk7XG4gKlxuICogeC5jbG9uZSgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIGNsb25lLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY2xvbmVfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjbG9uZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBjb25zdCBpbnB1dHM6IElkZW50aXR5SW5wdXRzID0ge3g6ICR4fTtcblxuICAvLyBOb3RlIHRoaXMgb3AgaXMgY2FsbGVkIHRmLmlkZW50aXR5IGluIHB5dGhvbi4gSGVuY2UgdGhlIGtlcm5lbCBuYW1lIHVzZWRcbiAgLy8gaGVyZS5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoSWRlbnRpdHksIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBjbG9uZSA9IG9wKHtjbG9uZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Prints information about the `tf.Tensor` including its data.\n *\n * ```js\n * const verbose = true;\n * tf.tensor2d([1, 2, 3, 4], [2, 2]).print(verbose);\n * ```\n * @param x The tensor to be printed.\n * @param verbose Whether to print verbose information about the ` Tensor`,\n * including dtype and size.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function print(x, verbose = false) {\n    console.log(x.toString(verbose));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJpbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wcmludC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFtQixDQUFJLEVBQUUsT0FBTyxHQUFHLEtBQUs7SUFDM0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogUHJpbnRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBgdGYuVGVuc29yYCBpbmNsdWRpbmcgaXRzIGRhdGEuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHZlcmJvc2UgPSB0cnVlO1xuICogdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pLnByaW50KHZlcmJvc2UpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIGJlIHByaW50ZWQuXG4gKiBAcGFyYW0gdmVyYm9zZSBXaGV0aGVyIHRvIHByaW50IHZlcmJvc2UgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGAgVGVuc29yYCxcbiAqIGluY2x1ZGluZyBkdHlwZSBhbmQgc2l6ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludDxUIGV4dGVuZHMgVGVuc29yPih4OiBULCB2ZXJib3NlID0gZmFsc2UpOiB2b2lkIHtcbiAgY29uc29sZS5sb2coeC50b1N0cmluZyh2ZXJib3NlKSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Required side effectful code for tfjs-core\n// Set up Engine and ENV\nimport { getOrMakeEngine } from './engine';\ngetOrMakeEngine();\n// Register backend-agnostic flags.\nimport './flags';\n// Register platforms\nimport './platforms/platform_browser';\nimport './platforms/platform_node';\n// Set up OpHandler\nimport { buffer } from './ops/buffer';\nimport { cast } from './ops/cast';\nimport { clone } from './ops/clone';\nimport { print } from './ops/print';\nimport { setOpHandler } from './tensor';\nconst opHandler = {\n    buffer,\n    cast,\n    clone,\n    print\n};\nsetOpHandler(opHandler);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9zaWRlX2VmZmVjdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2Jhc2Vfc2lkZV9lZmZlY3RzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDZDQUE2QztBQUU3Qyx3QkFBd0I7QUFDeEIsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN6QyxlQUFlLEVBQUUsQ0FBQztBQUVsQixtQ0FBbUM7QUFDbkMsT0FBTyxTQUFTLENBQUM7QUFDakIscUJBQXFCO0FBQ3JCLE9BQU8sOEJBQThCLENBQUM7QUFDdEMsT0FBTywyQkFBMkIsQ0FBQztBQUVuQyxtQkFBbUI7QUFDbkIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDbEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNsQyxPQUFPLEVBQVksWUFBWSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2pELE1BQU0sU0FBUyxHQUFjO0lBQzNCLE1BQU07SUFDTixJQUFJO0lBQ0osS0FBSztJQUNMLEtBQUs7Q0FDTixDQUFDO0FBQ0YsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBSZXF1aXJlZCBzaWRlIGVmZmVjdGZ1bCBjb2RlIGZvciB0ZmpzLWNvcmVcblxuLy8gU2V0IHVwIEVuZ2luZSBhbmQgRU5WXG5pbXBvcnQge2dldE9yTWFrZUVuZ2luZX0gZnJvbSAnLi9lbmdpbmUnO1xuZ2V0T3JNYWtlRW5naW5lKCk7XG5cbi8vIFJlZ2lzdGVyIGJhY2tlbmQtYWdub3N0aWMgZmxhZ3MuXG5pbXBvcnQgJy4vZmxhZ3MnO1xuLy8gUmVnaXN0ZXIgcGxhdGZvcm1zXG5pbXBvcnQgJy4vcGxhdGZvcm1zL3BsYXRmb3JtX2Jyb3dzZXInO1xuaW1wb3J0ICcuL3BsYXRmb3Jtcy9wbGF0Zm9ybV9ub2RlJztcblxuLy8gU2V0IHVwIE9wSGFuZGxlclxuaW1wb3J0IHtidWZmZXJ9IGZyb20gJy4vb3BzL2J1ZmZlcic7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtjbG9uZX0gZnJvbSAnLi9vcHMvY2xvbmUnO1xuaW1wb3J0IHtwcmludH0gZnJvbSAnLi9vcHMvcHJpbnQnO1xuaW1wb3J0IHtPcEhhbmRsZXIsIHNldE9wSGFuZGxlcn0gZnJvbSAnLi90ZW5zb3InO1xuY29uc3Qgb3BIYW5kbGVyOiBPcEhhbmRsZXIgPSB7XG4gIGJ1ZmZlcixcbiAgY2FzdCxcbiAgY2xvbmUsXG4gIHByaW50XG59O1xuc2V0T3BIYW5kbGVyKG9wSGFuZGxlcik7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * IOHandlers related to files, such as browser-triggered file downloads,\n * user-selected files in browser.\n */\nimport '../flags';\nimport { env } from '../environment';\nimport { basename, concatenateArrayBuffers, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getModelJSONForModelArtifacts } from './io_utils';\nimport { IORouterRegistry } from './router_registry';\nconst DEFAULT_FILE_NAME_PREFIX = 'model';\nconst DEFAULT_JSON_EXTENSION_NAME = '.json';\nconst DEFAULT_WEIGHT_DATA_EXTENSION_NAME = '.weights.bin';\nfunction defer(f) {\n    return new Promise(resolve => setTimeout(resolve)).then(f);\n}\nexport class BrowserDownloads {\n    constructor(fileNamePrefix) {\n        if (!env().getBool('IS_BROWSER')) {\n            // TODO(cais): Provide info on what IOHandlers are available under the\n            //   current environment.\n            throw new Error('browserDownloads() cannot proceed because the current environment ' +\n                'is not a browser.');\n        }\n        if (fileNamePrefix.startsWith(BrowserDownloads.URL_SCHEME)) {\n            fileNamePrefix = fileNamePrefix.slice(BrowserDownloads.URL_SCHEME.length);\n        }\n        if (fileNamePrefix == null || fileNamePrefix.length === 0) {\n            fileNamePrefix = DEFAULT_FILE_NAME_PREFIX;\n        }\n        this.modelJsonFileName = fileNamePrefix + DEFAULT_JSON_EXTENSION_NAME;\n        this.weightDataFileName =\n            fileNamePrefix + DEFAULT_WEIGHT_DATA_EXTENSION_NAME;\n    }\n    async save(modelArtifacts) {\n        if (typeof (document) === 'undefined') {\n            throw new Error('Browser downloads are not supported in ' +\n                'this environment since `document` is not present');\n        }\n        const weightsURL = window.URL.createObjectURL(new Blob([modelArtifacts.weightData], { type: 'application/octet-stream' }));\n        if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n            throw new Error('BrowserDownloads.save() does not support saving model topology ' +\n                'in binary formats yet.');\n        }\n        else {\n            const weightsManifest = [{\n                    paths: ['./' + this.weightDataFileName],\n                    weights: modelArtifacts.weightSpecs\n                }];\n            const modelJSON = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest);\n            const modelJsonURL = window.URL.createObjectURL(new Blob([JSON.stringify(modelJSON)], { type: 'application/json' }));\n            // If anchor elements are not provided, create them without attaching them\n            // to parents, so that the downloaded file names can be controlled.\n            const jsonAnchor = this.modelJsonAnchor == null ?\n                document.createElement('a') :\n                this.modelJsonAnchor;\n            jsonAnchor.download = this.modelJsonFileName;\n            jsonAnchor.href = modelJsonURL;\n            // Trigger downloads by evoking a click event on the download anchors.\n            // When multiple downloads are started synchronously, Firefox will only\n            // save the last one.\n            await defer(() => jsonAnchor.dispatchEvent(new MouseEvent('click')));\n            if (modelArtifacts.weightData != null) {\n                const weightDataAnchor = this.weightDataAnchor == null ?\n                    document.createElement('a') :\n                    this.weightDataAnchor;\n                weightDataAnchor.download = this.weightDataFileName;\n                weightDataAnchor.href = weightsURL;\n                await defer(() => weightDataAnchor.dispatchEvent(new MouseEvent('click')));\n            }\n            return { modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts) };\n        }\n    }\n}\nBrowserDownloads.URL_SCHEME = 'downloads://';\nclass BrowserFiles {\n    constructor(files) {\n        if (files == null || files.length < 1) {\n            throw new Error(`When calling browserFiles, at least 1 file is required, ` +\n                `but received ${files}`);\n        }\n        this.jsonFile = files[0];\n        this.weightsFiles = files.slice(1);\n    }\n    async load() {\n        return new Promise((resolve, reject) => {\n            const jsonReader = new FileReader();\n            jsonReader.onload = (event) => {\n                // tslint:disable-next-line:no-any\n                const modelJSON = JSON.parse(event.target.result);\n                const modelTopology = modelJSON.modelTopology;\n                if (modelTopology == null) {\n                    reject(new Error(`modelTopology field is missing from file ${this.jsonFile.name}`));\n                    return;\n                }\n                const weightsManifest = modelJSON.weightsManifest;\n                if (weightsManifest == null) {\n                    reject(new Error(`weightManifest field is missing from file ${this.jsonFile.name}`));\n                    return;\n                }\n                if (this.weightsFiles.length === 0) {\n                    resolve({ modelTopology });\n                    return;\n                }\n                const modelArtifactsPromise = getModelArtifactsForJSON(modelJSON, (weightsManifest) => this.loadWeights(weightsManifest));\n                resolve(modelArtifactsPromise);\n            };\n            jsonReader.onerror = error => reject(`Failed to read model topology and weights manifest JSON ` +\n                `from file '${this.jsonFile.name}'. BrowserFiles supports loading ` +\n                `Keras-style tf.Model artifacts only.`);\n            jsonReader.readAsText(this.jsonFile);\n        });\n    }\n    loadWeights(weightsManifest) {\n        const weightSpecs = [];\n        const paths = [];\n        for (const entry of weightsManifest) {\n            weightSpecs.push(...entry.weights);\n            paths.push(...entry.paths);\n        }\n        const pathToFile = this.checkManifestAndWeightFiles(weightsManifest);\n        const promises = paths.map(path => this.loadWeightsFile(path, pathToFile[path]));\n        return Promise.all(promises).then(buffers => [weightSpecs, concatenateArrayBuffers(buffers)]);\n    }\n    loadWeightsFile(path, file) {\n        return new Promise((resolve, reject) => {\n            const weightFileReader = new FileReader();\n            weightFileReader.onload = (event) => {\n                // tslint:disable-next-line:no-any\n                const weightData = event.target.result;\n                resolve(weightData);\n            };\n            weightFileReader.onerror = error => reject(`Failed to weights data from file of path '${path}'.`);\n            weightFileReader.readAsArrayBuffer(file);\n        });\n    }\n    /**\n     * Check the compatibility between weights manifest and weight files.\n     */\n    checkManifestAndWeightFiles(manifest) {\n        const basenames = [];\n        const fileNames = this.weightsFiles.map(file => basename(file.name));\n        const pathToFile = {};\n        for (const group of manifest) {\n            group.paths.forEach(path => {\n                const pathBasename = basename(path);\n                if (basenames.indexOf(pathBasename) !== -1) {\n                    throw new Error(`Duplicate file basename found in weights manifest: ` +\n                        `'${pathBasename}'`);\n                }\n                basenames.push(pathBasename);\n                if (fileNames.indexOf(pathBasename) === -1) {\n                    throw new Error(`Weight file with basename '${pathBasename}' is not provided.`);\n                }\n                else {\n                    pathToFile[path] = this.weightsFiles[fileNames.indexOf(pathBasename)];\n                }\n            });\n        }\n        if (basenames.length !== this.weightsFiles.length) {\n            throw new Error(`Mismatch in the number of files in weights manifest ` +\n                `(${basenames.length}) and the number of weight files provided ` +\n                `(${this.weightsFiles.length}).`);\n        }\n        return pathToFile;\n    }\n}\nexport const browserDownloadsRouter = (url) => {\n    if (!env().getBool('IS_BROWSER')) {\n        return null;\n    }\n    else {\n        if (!Array.isArray(url) && url.startsWith(BrowserDownloads.URL_SCHEME)) {\n            return browserDownloads(url.slice(BrowserDownloads.URL_SCHEME.length));\n        }\n        else {\n            return null;\n        }\n    }\n};\nIORouterRegistry.registerSaveRouter(browserDownloadsRouter);\n/**\n * Creates an IOHandler that triggers file downloads from the browser.\n *\n * The returned `IOHandler` instance can be used as model exporting methods such\n * as `tf.Model.save` and supports only saving.\n *\n * ```js\n * const model = tf.sequential();\n * model.add(tf.layers.dense(\n *     {units: 1, inputShape: [10], activation: 'sigmoid'}));\n * const saveResult = await model.save('downloads://mymodel');\n * // This will trigger downloading of two files:\n * //   'mymodel.json' and 'mymodel.weights.bin'.\n * console.log(saveResult);\n * ```\n *\n * @param fileNamePrefix Prefix name of the files to be downloaded. For use with\n *   `tf.Model`, `fileNamePrefix` should follow either of the following two\n *   formats:\n *   1. `null` or `undefined`, in which case the default file\n *      names will be used:\n *      - 'model.json' for the JSON file containing the model topology and\n *        weights manifest.\n *      - 'model.weights.bin' for the binary file containing the binary weight\n *        values.\n *   2. A single string or an Array of a single string, as the file name prefix.\n *      For example, if `'foo'` is provided, the downloaded JSON\n *      file and binary weights file will be named 'foo.json' and\n *      'foo.weights.bin', respectively.\n * @param config Additional configuration for triggering downloads.\n * @returns An instance of `BrowserDownloads` `IOHandler`.\n *\n * @doc {\n *   heading: 'Models',\n *   subheading: 'Loading',\n *   namespace: 'io',\n *   ignoreCI: true\n * }\n */\nexport function browserDownloads(fileNamePrefix = 'model') {\n    return new BrowserDownloads(fileNamePrefix);\n}\n/**\n * Creates an IOHandler that loads model artifacts from user-selected files.\n *\n * This method can be used for loading from files such as user-selected files\n * in the browser.\n * When used in conjunction with `tf.loadLayersModel`, an instance of\n * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts.\n *\n * ```js\n * // Note: This code snippet won't run properly without the actual file input\n * //   elements in the HTML DOM.\n *\n * // Suppose there are two HTML file input (`<input type=\"file\" ...>`)\n * // elements.\n * const uploadJSONInput = document.getElementById('upload-json');\n * const uploadWeightsInput = document.getElementById('upload-weights');\n * const model = await tf.loadLayersModel(tf.io.browserFiles(\n *     [uploadJSONInput.files[0], uploadWeightsInput.files[0]]));\n * ```\n *\n * @param files `File`s to load from. Currently, this function supports only\n *   loading from files that contain Keras-style models (i.e., `tf.Model`s), for\n *   which an `Array` of `File`s is expected (in that order):\n *   - A JSON file containing the model topology and weight manifest.\n *   - Optionally, one or more binary files containing the binary weights.\n *     These files must have names that match the paths in the `weightsManifest`\n *     contained by the aforementioned JSON file, or errors will be thrown\n *     during loading. These weights files have the same format as the ones\n *     generated by `tensorflowjs_converter` that comes with the `tensorflowjs`\n *     Python PIP package. If no weights files are provided, only the model\n *     topology will be loaded from the JSON file above.\n * @returns An instance of `Files` `IOHandler`.\n *\n * @doc {\n *   heading: 'Models',\n *   subheading: 'Loading',\n *   namespace: 'io',\n *   ignoreCI: true\n * }\n */\nexport function browserFiles(files) {\n    return new BrowserFiles(files);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlcl9maWxlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vYnJvd3Nlcl9maWxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7O0dBR0c7QUFFSCxPQUFPLFVBQVUsQ0FBQztBQUNsQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFbkMsT0FBTyxFQUFDLFFBQVEsRUFBRSx1QkFBdUIsRUFBRSx3QkFBd0IsRUFBRSw0QkFBNEIsRUFBRSw2QkFBNkIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwSixPQUFPLEVBQVcsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc3RCxNQUFNLHdCQUF3QixHQUFHLE9BQU8sQ0FBQztBQUN6QyxNQUFNLDJCQUEyQixHQUFHLE9BQU8sQ0FBQztBQUM1QyxNQUFNLGtDQUFrQyxHQUFHLGNBQWMsQ0FBQztBQUUxRCxTQUFTLEtBQUssQ0FBSSxDQUFVO0lBQzFCLE9BQU8sSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQztBQUVELE1BQU0sT0FBTyxnQkFBZ0I7SUFRM0IsWUFBWSxjQUF1QjtRQUNqQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO1lBQ2hDLHNFQUFzRTtZQUN0RSx5QkFBeUI7WUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDWCxvRUFBb0U7Z0JBQ3BFLG1CQUFtQixDQUFDLENBQUM7U0FDMUI7UUFFRCxJQUFJLGNBQWMsQ0FBQyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDMUQsY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENB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VUFBVSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3RFLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUN4RTthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUM7U0FDYjtLQUNGO0FBQ0gsQ0FBQyxDQUFDO0FBQ0YsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQ0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsY0FBYyxHQUFHLE9BQU87SUFDdkQsT0FBTyxJQUFJLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFhO0lBQ3hDLE9BQU8sSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJT0hhbmRsZXJzIHJlbGF0ZWQgdG8gZmlsZXMsIHN1Y2ggYXMgYnJvd3Nlci10cmlnZ2VyZWQgZmlsZSBkb3dubG9hZHMsXG4gKiB1c2VyLXNlbGVjdGVkIGZpbGVzIGluIGJyb3dzZXIuXG4gKi9cblxuaW1wb3J0ICcuLi9mbGFncyc7XG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge2Jhc2VuYW1lLCBjb25jYXRlbmF0ZUFycmF5QnVmZmVycywgZ2V0TW9kZWxBcnRpZmFjdHNGb3JKU09OLCBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OLCBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0c30gZnJvbSAnLi9pb191dGlscyc7XG5pbXBvcnQge0lPUm91dGVyLCBJT1JvdXRlclJlZ2lzdHJ5fSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5pbXBvcnQge0lPSGFuZGxlciwgTW9kZWxBcnRpZmFjdHMsIE1vZGVsSlNPTiwgU2F2ZVJlc3VsdCwgV2VpZ2h0c01hbmlmZXN0Q29uZmlnLCBXZWlnaHRzTWFuaWZlc3RFbnRyeX0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IERFRkFVTFRfRklMRV9OQU1FX1BSRUZJWCA9ICdtb2RlbCc7XG5jb25zdCBERUZBVUxUX0pTT05fRVhURU5TSU9OX05BTUUgPSAnLmpzb24nO1xuY29uc3QgREVGQVVMVF9XRUlHSFRfREFUQV9FWFRFTlNJT05fTkFNRSA9ICcud2VpZ2h0cy5iaW4nO1xuXG5mdW5jdGlvbiBkZWZlcjxUPihmOiAoKSA9PiBUKTogUHJvbWlzZTxUPiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSkpLnRoZW4oZik7XG59XG5cbmV4cG9ydCBjbGFzcyBCcm93c2VyRG93bmxvYWRzIGltcGxlbWVudHMgSU9IYW5kbGVyIHtcbiAgcHJpdmF0ZSByZWFkb25seSBtb2RlbEpzb25GaWxlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHdlaWdodERhdGFGaWxlTmFtZTogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vZGVsSnNvbkFuY2hvcjogSFRNTEFuY2hvckVsZW1lbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2VpZ2h0RGF0YUFuY2hvcjogSFRNTEFuY2hvckVsZW1lbnQ7XG5cbiAgc3RhdGljIHJlYWRvbmx5IFVSTF9TQ0hFTUUgPSAnZG93bmxvYWRzOi8vJztcblxuICBjb25zdHJ1Y3RvcihmaWxlTmFtZVByZWZpeD86IHN0cmluZykge1xuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfQlJPV1NFUicpKSB7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBQcm92aWRlIGluZm8gb24gd2hhdCBJT0hhbmRsZXJzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gICAgICAvLyAgIGN1cnJlbnQgZW52aXJvbm1lbnQuXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ2Jyb3dzZXJEb3dubG9hZHMoKSBjYW5ub3QgcHJvY2VlZCBiZWNhdXNlIHRoZSBjdXJyZW50IGVudmlyb25tZW50ICcgK1xuICAgICAgICAgICdpcyBub3QgYSBicm93c2VyLicpO1xuICAgIH1cblxuICAgIGlmIChmaWxlTmFtZVByZWZpeC5zdGFydHNXaXRoKEJyb3dzZXJEb3dubG9hZHMuVVJMX1NDSEVNRSkpIHtcbiAgICAgIGZpbGVOYW1lUHJlZml4ID0gZmlsZU5hbWVQcmVmaXguc2xpY2UoQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FLmxlbmd0aCk7XG4gICAgfVxuICAgIGlmIChmaWxlTmFtZVByZWZpeCA9PSBudWxsIHx8IGZpbGVOYW1lUHJlZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgZmlsZU5hbWVQcmVmaXggPSBERUZBVUxUX0ZJTEVfTkFNRV9QUkVGSVg7XG4gICAgfVxuXG4gICAgdGhpcy5tb2RlbEpzb25GaWxlTmFtZSA9IGZpbGVOYW1lUHJlZml4ICsgREVGQVVMVF9KU09OX0VYVEVOU0lPTl9OQU1FO1xuICAgIHRoaXMud2VpZ2h0RGF0YUZpbGVOYW1lID1cbiAgICAgICAgZmlsZU5hbWVQcmVmaXggKyBERUZBVUxUX1dFSUdIVF9EQVRBX0VYVEVOU0lPTl9OQU1FO1xuICB9XG5cbiAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0czogTW9kZWxBcnRpZmFjdHMpOiBQcm9taXNlPFNhdmVSZXN1bHQ+IHtcbiAgICBpZiAodHlwZW9mIChkb2N1bWVudCkgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Jyb3dzZXIgZG93bmxvYWRzIGFyZSBub3Qgc3VwcG9ydGVkIGluICcgK1xuICAgICAgICAgICd0aGlzIGVudmlyb25tZW50IHNpbmNlIGBkb2N1bWVudGAgaXMgbm90IHByZXNlbnQnKTtcbiAgICB9XG4gICAgY29uc3Qgd2VpZ2h0c1VSTCA9IHdpbmRvdy5VUkwuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFxuICAgICAgICBbbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YV0sIHt0eXBlOiAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJ30pKTtcblxuICAgIGlmIChtb2RlbEFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQnJvd3NlckRvd25sb2Fkcy5zYXZlKCkgZG9lcyBub3Qgc3VwcG9ydCBzYXZpbmcgbW9kZWwgdG9wb2xvZ3kgJyArXG4gICAgICAgICAgJ2luIGJpbmFyeSBmb3JtYXRzIHlldC4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgd2VpZ2h0c01hbmlmZXN0OiBXZWlnaHRzTWFuaWZlc3RDb25maWcgPSBbe1xuICAgICAgICBwYXRoczogWycuLycgKyB0aGlzLndlaWdodERhdGFGaWxlTmFtZV0sXG4gICAgICAgIHdlaWdodHM6IG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzXG4gICAgICB9XTtcbiAgICAgIGNvbnN0IG1vZGVsSlNPTjogTW9kZWxKU09OID1cbiAgICAgICAgICBnZXRNb2RlbEpTT05Gb3JNb2RlbEFydGlmYWN0cyhtb2RlbEFydGlmYWN0cywgd2VpZ2h0c01hbmlmZXN0KTtcblxuICAgICAgY29uc3QgbW9kZWxKc29uVVJMID0gd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwoXG4gICAgICAgICAgbmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KG1vZGVsSlNPTildLCB7dHlwZTogJ2FwcGxpY2F0aW9uL2pzb24nfSkpO1xuXG4gICAgICAvLyBJZiBhbmNob3IgZWxlbWVudHMgYXJlIG5vdCBwcm92aWRlZCwgY3JlYXRlIHRoZW0gd2l0aG91dCBhdHRhY2hpbmcgdGhlbVxuICAgICAgLy8gdG8gcGFyZW50cywgc28gdGhhdCB0aGUgZG93bmxvYWRlZCBmaWxlIG5hbWVzIGNhbiBiZSBjb250cm9sbGVkLlxuICAgICAgY29uc3QganNvbkFuY2hvciA9IHRoaXMubW9kZWxKc29uQW5jaG9yID09IG51bGwgP1xuICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKSA6XG4gICAgICAgICAgdGhpcy5tb2RlbEpzb25BbmNob3I7XG4gICAgICBqc29uQW5jaG9yLmRvd25sb2FkID0gdGhpcy5tb2RlbEpzb25GaWxlTmFtZTtcbiAgICAgIGpzb25BbmNob3IuaHJlZiA9IG1vZGVsSnNvblVSTDtcbiAgICAgIC8vIFRyaWdnZXIgZG93bmxvYWRzIGJ5IGV2b2tpbmcgYSBjbGljayBldmVudCBvbiB0aGUgZG93bmxvYWQgYW5jaG9ycy5cbiAgICAgIC8vIFdoZW4gbXVsdGlwbGUgZG93bmxvYWRzIGFyZSBzdGFydGVkIHN5bmNocm9ub3VzbHksIEZpcmVmb3ggd2lsbCBvbmx5XG4gICAgICAvLyBzYXZlIHRoZSBsYXN0IG9uZS5cbiAgICAgIGF3YWl0IGRlZmVyKCgpID0+IGpzb25BbmNob3IuZGlzcGF0Y2hFdmVudChuZXcgTW91c2VFdmVudCgnY2xpY2snKSkpO1xuXG4gICAgICBpZiAobW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHdlaWdodERhdGFBbmNob3IgPSB0aGlzLndlaWdodERhdGFBbmNob3IgPT0gbnVsbCA/XG4gICAgICAgICAgICBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJykgOlxuICAgICAgICAgICAgdGhpcy53ZWlnaHREYXRhQW5jaG9yO1xuICAgICAgICB3ZWlnaHREYXRhQW5jaG9yLmRvd25sb2FkID0gdGhpcy53ZWlnaHREYXRhRmlsZU5hbWU7XG4gICAgICAgIHdlaWdodERhdGFBbmNob3IuaHJlZiA9IHdlaWdodHNVUkw7XG4gICAgICAgIGF3YWl0IGRlZmVyKFxuICAgICAgICAgICAgKCkgPT4gd2VpZ2h0RGF0YUFuY2hvci5kaXNwYXRjaEV2ZW50KG5ldyBNb3VzZUV2ZW50KCdjbGljaycpKSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7bW9kZWxBcnRpZmFjdHNJbmZvOiBnZXRNb2RlbEFydGlmYWN0c0luZm9Gb3JKU09OKG1vZGVsQXJ0aWZhY3RzKX07XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIEJyb3dzZXJGaWxlcyBpbXBsZW1lbnRzIElPSGFuZGxlciB7XG4gIHByaXZhdGUgcmVhZG9ubHkganNvbkZpbGU6IEZpbGU7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2VpZ2h0c0ZpbGVzOiBGaWxlW107XG5cbiAgY29uc3RydWN0b3IoZmlsZXM6IEZpbGVbXSkge1xuICAgIGlmIChmaWxlcyA9PSBudWxsIHx8IGZpbGVzLmxlbmd0aCA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2hlbiBjYWxsaW5nIGJyb3dzZXJGaWxlcywgYXQgbGVhc3QgMSBmaWxlIGlzIHJlcXVpcmVkLCBgICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7ZmlsZXN9YCk7XG4gICAgfVxuICAgIHRoaXMuanNvbkZpbGUgPSBmaWxlc1swXTtcbiAgICB0aGlzLndlaWdodHNGaWxlcyA9IGZpbGVzLnNsaWNlKDEpO1xuICB9XG5cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IGpzb25SZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAganNvblJlYWRlci5vbmxvYWQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgY29uc3QgbW9kZWxKU09OID0gSlNPTi5wYXJzZSgoZXZlbnQudGFyZ2V0IGFzIGFueSkucmVzdWx0KSBhcyBNb2RlbEpTT047XG5cbiAgICAgICAgY29uc3QgbW9kZWxUb3BvbG9neSA9IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5O1xuICAgICAgICBpZiAobW9kZWxUb3BvbG9neSA9PSBudWxsKSB7XG4gICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihgbW9kZWxUb3BvbG9neSBmaWVsZCBpcyBtaXNzaW5nIGZyb20gZmlsZSAke1xuICAgICAgICAgICAgICB0aGlzLmpzb25GaWxlLm5hbWV9YCkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgICAgIGlmICh3ZWlnaHRzTWFuaWZlc3QgPT0gbnVsbCkge1xuICAgICAgICAgIHJlamVjdChuZXcgRXJyb3IoYHdlaWdodE1hbmlmZXN0IGZpZWxkIGlzIG1pc3NpbmcgZnJvbSBmaWxlICR7XG4gICAgICAgICAgICAgIHRoaXMuanNvbkZpbGUubmFtZX1gKSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMud2VpZ2h0c0ZpbGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIHJlc29sdmUoe21vZGVsVG9wb2xvZ3l9KTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbEFydGlmYWN0c1Byb21pc2UgPSBnZXRNb2RlbEFydGlmYWN0c0ZvckpTT04oXG4gICAgICAgICAgICBtb2RlbEpTT04sICh3ZWlnaHRzTWFuaWZlc3QpID0+IHRoaXMubG9hZFdlaWdodHMod2VpZ2h0c01hbmlmZXN0KSk7XG4gICAgICAgIHJlc29sdmUobW9kZWxBcnRpZmFjdHNQcm9taXNlKTtcbiAgICAgIH07XG5cbiAgICAgIGpzb25SZWFkZXIub25lcnJvciA9IGVycm9yID0+IHJlamVjdChcbiAgICAgICAgICBgRmFpbGVkIHRvIHJlYWQgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodHMgbWFuaWZlc3QgSlNPTiBgICtcbiAgICAgICAgICBgZnJvbSBmaWxlICcke3RoaXMuanNvbkZpbGUubmFtZX0nLiBCcm93c2VyRmlsZXMgc3VwcG9ydHMgbG9hZGluZyBgICtcbiAgICAgICAgICBgS2VyYXMtc3R5bGUgdGYuTW9kZWwgYXJ0aWZhY3RzIG9ubHkuYCk7XG4gICAgICBqc29uUmVhZGVyLnJlYWRBc1RleHQodGhpcy5qc29uRmlsZSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRXZWlnaHRzKHdlaWdodHNNYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnKTogUHJvbWlzZTxbXG4gICAgLyogd2VpZ2h0U3BlY3MgKi8gV2VpZ2h0c01hbmlmZXN0RW50cnlbXSwgLyogd2VpZ2h0RGF0YSAqLyBBcnJheUJ1ZmZlclxuICBdPiB7XG4gICAgY29uc3Qgd2VpZ2h0U3BlY3M6IFdlaWdodHNNYW5pZmVzdEVudHJ5W10gPSBbXTtcbiAgICBjb25zdCBwYXRoczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHdlaWdodHNNYW5pZmVzdCkge1xuICAgICAgd2VpZ2h0U3BlY3MucHVzaCguLi5lbnRyeS53ZWlnaHRzKTtcbiAgICAgIHBhdGhzLnB1c2goLi4uZW50cnkucGF0aHMpO1xuICAgIH1cblxuICAgIGNvbnN0IHBhdGhUb0ZpbGU6IHtbcGF0aDogc3RyaW5nXTogRmlsZX0gPVxuICAgICAgICB0aGlzLmNoZWNrTWFuaWZlc3RBbmRXZWlnaHRGaWxlcyh3ZWlnaHRzTWFuaWZlc3QpO1xuXG4gICAgY29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8QXJyYXlCdWZmZXI+PiA9XG4gICAgICAgIHBhdGhzLm1hcChwYXRoID0+IHRoaXMubG9hZFdlaWdodHNGaWxlKHBhdGgsIHBhdGhUb0ZpbGVbcGF0aF0pKTtcblxuICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcykudGhlbihcbiAgICAgICAgYnVmZmVycyA9PiBbd2VpZ2h0U3BlY3MsIGNvbmNhdGVuYXRlQXJyYXlCdWZmZXJzKGJ1ZmZlcnMpXSk7XG4gIH1cblxuICBwcml2YXRlIGxvYWRXZWlnaHRzRmlsZShwYXRoOiBzdHJpbmcsIGZpbGU6IEZpbGUpOiBQcm9taXNlPEFycmF5QnVmZmVyPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHdlaWdodEZpbGVSZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgICAgd2VpZ2h0RmlsZVJlYWRlci5vbmxvYWQgPSAoZXZlbnQ6IEV2ZW50KSA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgY29uc3Qgd2VpZ2h0RGF0YSA9IChldmVudC50YXJnZXQgYXMgYW55KS5yZXN1bHQgYXMgQXJyYXlCdWZmZXI7XG4gICAgICAgIHJlc29sdmUod2VpZ2h0RGF0YSk7XG4gICAgICB9O1xuICAgICAgd2VpZ2h0RmlsZVJlYWRlci5vbmVycm9yID0gZXJyb3IgPT5cbiAgICAgICAgICByZWplY3QoYEZhaWxlZCB0byB3ZWlnaHRzIGRhdGEgZnJvbSBmaWxlIG9mIHBhdGggJyR7cGF0aH0nLmApO1xuICAgICAgd2VpZ2h0RmlsZVJlYWRlci5yZWFkQXNBcnJheUJ1ZmZlcihmaWxlKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVjayB0aGUgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHdlaWdodHMgbWFuaWZlc3QgYW5kIHdlaWdodCBmaWxlcy5cbiAgICovXG4gIHByaXZhdGUgY2hlY2tNYW5pZmVzdEFuZFdlaWdodEZpbGVzKG1hbmlmZXN0OiBXZWlnaHRzTWFuaWZlc3RDb25maWcpOlxuICAgICAge1twYXRoOiBzdHJpbmddOiBGaWxlfSB7XG4gICAgY29uc3QgYmFzZW5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGZpbGVOYW1lcyA9IHRoaXMud2VpZ2h0c0ZpbGVzLm1hcChmaWxlID0+IGJhc2VuYW1lKGZpbGUubmFtZSkpO1xuICAgIGNvbnN0IHBhdGhUb0ZpbGU6IHtbcGF0aDogc3RyaW5nXTogRmlsZX0gPSB7fTtcbiAgICBmb3IgKGNvbnN0IGdyb3VwIG9mIG1hbmlmZXN0KSB7XG4gICAgICBncm91cC5wYXRocy5mb3JFYWNoKHBhdGggPT4ge1xuICAgICAgICBjb25zdCBwYXRoQmFzZW5hbWUgPSBiYXNlbmFtZShwYXRoKTtcbiAgICAgICAgaWYgKGJhc2VuYW1lcy5pbmRleE9mKHBhdGhCYXNlbmFtZSkgIT09IC0xKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRHVwbGljYXRlIGZpbGUgYmFzZW5hbWUgZm91bmQgaW4gd2VpZ2h0cyBtYW5pZmVzdDogYCArXG4gICAgICAgICAgICAgIGAnJHtwYXRoQmFzZW5hbWV9J2ApO1xuICAgICAgICB9XG4gICAgICAgIGJhc2VuYW1lcy5wdXNoKHBhdGhCYXNlbmFtZSk7XG4gICAgICAgIGlmIChmaWxlTmFtZXMuaW5kZXhPZihwYXRoQmFzZW5hbWUpID09PSAtMSkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgYFdlaWdodCBmaWxlIHdpdGggYmFzZW5hbWUgJyR7cGF0aEJhc2VuYW1lfScgaXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBhdGhUb0ZpbGVbcGF0aF0gPSB0aGlzLndlaWdodHNGaWxlc1tmaWxlTmFtZXMuaW5kZXhPZihwYXRoQmFzZW5hbWUpXTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKGJhc2VuYW1lcy5sZW5ndGggIT09IHRoaXMud2VpZ2h0c0ZpbGVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBNaXNtYXRjaCBpbiB0aGUgbnVtYmVyIG9mIGZpbGVzIGluIHdlaWdodHMgbWFuaWZlc3QgYCArXG4gICAgICAgICAgYCgke2Jhc2VuYW1lcy5sZW5ndGh9KSBhbmQgdGhlIG51bWJlciBvZiB3ZWlnaHQgZmlsZXMgcHJvdmlkZWQgYCArXG4gICAgICAgICAgYCgke3RoaXMud2VpZ2h0c0ZpbGVzLmxlbmd0aH0pLmApO1xuICAgIH1cbiAgICByZXR1cm4gcGF0aFRvRmlsZTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgYnJvd3NlckRvd25sb2Fkc1JvdXRlcjogSU9Sb3V0ZXIgPSAodXJsOiBzdHJpbmd8c3RyaW5nW10pID0+IHtcbiAgaWYgKCFlbnYoKS5nZXRCb29sKCdJU19CUk9XU0VSJykpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfSBlbHNlIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodXJsKSAmJiB1cmwuc3RhcnRzV2l0aChCcm93c2VyRG93bmxvYWRzLlVSTF9TQ0hFTUUpKSB7XG4gICAgICByZXR1cm4gYnJvd3NlckRvd25sb2Fkcyh1cmwuc2xpY2UoQnJvd3NlckRvd25sb2Fkcy5VUkxfU0NIRU1FLmxlbmd0aCkpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gIH1cbn07XG5JT1JvdXRlclJlZ2lzdHJ5LnJlZ2lzdGVyU2F2ZVJvdXRlcihicm93c2VyRG93bmxvYWRzUm91dGVyKTtcblxuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciB0aGF0IHRyaWdnZXJzIGZpbGUgZG93bmxvYWRzIGZyb20gdGhlIGJyb3dzZXIuXG4gKlxuICogVGhlIHJldHVybmVkIGBJT0hhbmRsZXJgIGluc3RhbmNlIGNhbiBiZSB1c2VkIGFzIG1vZGVsIGV4cG9ydGluZyBtZXRob2RzIHN1Y2hcbiAqIGFzIGB0Zi5Nb2RlbC5zYXZlYCBhbmQgc3VwcG9ydHMgb25seSBzYXZpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCgpO1xuICogbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZShcbiAqICAgICB7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBtb2RlbC5zYXZlKCdkb3dubG9hZHM6Ly9teW1vZGVsJyk7XG4gKiAvLyBUaGlzIHdpbGwgdHJpZ2dlciBkb3dubG9hZGluZyBvZiB0d28gZmlsZXM6XG4gKiAvLyAgICdteW1vZGVsLmpzb24nIGFuZCAnbXltb2RlbC53ZWlnaHRzLmJpbicuXG4gKiBjb25zb2xlLmxvZyhzYXZlUmVzdWx0KTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmaWxlTmFtZVByZWZpeCBQcmVmaXggbmFtZSBvZiB0aGUgZmlsZXMgdG8gYmUgZG93bmxvYWRlZC4gRm9yIHVzZSB3aXRoXG4gKiAgIGB0Zi5Nb2RlbGAsIGBmaWxlTmFtZVByZWZpeGAgc2hvdWxkIGZvbGxvdyBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB0d29cbiAqICAgZm9ybWF0czpcbiAqICAgMS4gYG51bGxgIG9yIGB1bmRlZmluZWRgLCBpbiB3aGljaCBjYXNlIHRoZSBkZWZhdWx0IGZpbGVcbiAqICAgICAgbmFtZXMgd2lsbCBiZSB1c2VkOlxuICogICAgICAtICdtb2RlbC5qc29uJyBmb3IgdGhlIEpTT04gZmlsZSBjb250YWluaW5nIHRoZSBtb2RlbCB0b3BvbG9neSBhbmRcbiAqICAgICAgICB3ZWlnaHRzIG1hbmlmZXN0LlxuICogICAgICAtICdtb2RlbC53ZWlnaHRzLmJpbicgZm9yIHRoZSBiaW5hcnkgZmlsZSBjb250YWluaW5nIHRoZSBiaW5hcnkgd2VpZ2h0XG4gKiAgICAgICAgdmFsdWVzLlxuICogICAyLiBBIHNpbmdsZSBzdHJpbmcgb3IgYW4gQXJyYXkgb2YgYSBzaW5nbGUgc3RyaW5nLCBhcyB0aGUgZmlsZSBuYW1lIHByZWZpeC5cbiAqICAgICAgRm9yIGV4YW1wbGUsIGlmIGAnZm9vJ2AgaXMgcHJvdmlkZWQsIHRoZSBkb3dubG9hZGVkIEpTT05cbiAqICAgICAgZmlsZSBhbmQgYmluYXJ5IHdlaWdodHMgZmlsZSB3aWxsIGJlIG5hbWVkICdmb28uanNvbicgYW5kXG4gKiAgICAgICdmb28ud2VpZ2h0cy5iaW4nLCByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0gY29uZmlnIEFkZGl0aW9uYWwgY29uZmlndXJhdGlvbiBmb3IgdHJpZ2dlcmluZyBkb3dubG9hZHMuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgQnJvd3NlckRvd25sb2Fkc2AgYElPSGFuZGxlcmAuXG4gKlxuICogQGRvYyB7XG4gKiAgIGhlYWRpbmc6ICdNb2RlbHMnLFxuICogICBzdWJoZWFkaW5nOiAnTG9hZGluZycsXG4gKiAgIG5hbWVzcGFjZTogJ2lvJyxcbiAqICAgaWdub3JlQ0k6IHRydWVcbiAqIH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJyb3dzZXJEb3dubG9hZHMoZmlsZU5hbWVQcmVmaXggPSAnbW9kZWwnKTogSU9IYW5kbGVyIHtcbiAgcmV0dXJuIG5ldyBCcm93c2VyRG93bmxvYWRzKGZpbGVOYW1lUHJlZml4KTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciB0aGF0IGxvYWRzIG1vZGVsIGFydGlmYWN0cyBmcm9tIHVzZXItc2VsZWN0ZWQgZmlsZXMuXG4gKlxuICogVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgZm9yIGxvYWRpbmcgZnJvbSBmaWxlcyBzdWNoIGFzIHVzZXItc2VsZWN0ZWQgZmlsZXNcbiAqIGluIHRoZSBicm93c2VyLlxuICogV2hlbiB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggYHRmLmxvYWRMYXllcnNNb2RlbGAsIGFuIGluc3RhbmNlIG9mXG4gKiBgdGYuTGF5ZXJzTW9kZWxgIChLZXJhcy1zdHlsZSkgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20gdGhlIGxvYWRlZCBhcnRpZmFjdHMuXG4gKlxuICogYGBganNcbiAqIC8vIE5vdGU6IFRoaXMgY29kZSBzbmlwcGV0IHdvbid0IHJ1biBwcm9wZXJseSB3aXRob3V0IHRoZSBhY3R1YWwgZmlsZSBpbnB1dFxuICogLy8gICBlbGVtZW50cyBpbiB0aGUgSFRNTCBET00uXG4gKlxuICogLy8gU3VwcG9zZSB0aGVyZSBhcmUgdHdvIEhUTUwgZmlsZSBpbnB1dCAoYDxpbnB1dCB0eXBlPVwiZmlsZVwiIC4uLj5gKVxuICogLy8gZWxlbWVudHMuXG4gKiBjb25zdCB1cGxvYWRKU09OSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndXBsb2FkLWpzb24nKTtcbiAqIGNvbnN0IHVwbG9hZFdlaWdodHNJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd1cGxvYWQtd2VpZ2h0cycpO1xuICogY29uc3QgbW9kZWwgPSBhd2FpdCB0Zi5sb2FkTGF5ZXJzTW9kZWwodGYuaW8uYnJvd3NlckZpbGVzKFxuICogICAgIFt1cGxvYWRKU09OSW5wdXQuZmlsZXNbMF0sIHVwbG9hZFdlaWdodHNJbnB1dC5maWxlc1swXV0pKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmaWxlcyBgRmlsZWBzIHRvIGxvYWQgZnJvbS4gQ3VycmVudGx5LCB0aGlzIGZ1bmN0aW9uIHN1cHBvcnRzIG9ubHlcbiAqICAgbG9hZGluZyBmcm9tIGZpbGVzIHRoYXQgY29udGFpbiBLZXJhcy1zdHlsZSBtb2RlbHMgKGkuZS4sIGB0Zi5Nb2RlbGBzKSwgZm9yXG4gKiAgIHdoaWNoIGFuIGBBcnJheWAgb2YgYEZpbGVgcyBpcyBleHBlY3RlZCAoaW4gdGhhdCBvcmRlcik6XG4gKiAgIC0gQSBKU09OIGZpbGUgY29udGFpbmluZyB0aGUgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodCBtYW5pZmVzdC5cbiAqICAgLSBPcHRpb25hbGx5LCBvbmUgb3IgbW9yZSBiaW5hcnkgZmlsZXMgY29udGFpbmluZyB0aGUgYmluYXJ5IHdlaWdodHMuXG4gKiAgICAgVGhlc2UgZmlsZXMgbXVzdCBoYXZlIG5hbWVzIHRoYXQgbWF0Y2ggdGhlIHBhdGhzIGluIHRoZSBgd2VpZ2h0c01hbmlmZXN0YFxuICogICAgIGNvbnRhaW5lZCBieSB0aGUgYWZvcmVtZW50aW9uZWQgSlNPTiBmaWxlLCBvciBlcnJvcnMgd2lsbCBiZSB0aHJvd25cbiAqICAgICBkdXJpbmcgbG9hZGluZy4gVGhlc2Ugd2VpZ2h0cyBmaWxlcyBoYXZlIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgb25lc1xuICogICAgIGdlbmVyYXRlZCBieSBgdGVuc29yZmxvd2pzX2NvbnZlcnRlcmAgdGhhdCBjb21lcyB3aXRoIHRoZSBgdGVuc29yZmxvd2pzYFxuICogICAgIFB5dGhvbiBQSVAgcGFja2FnZS4gSWYgbm8gd2VpZ2h0cyBmaWxlcyBhcmUgcHJvdmlkZWQsIG9ubHkgdGhlIG1vZGVsXG4gKiAgICAgdG9wb2xvZ3kgd2lsbCBiZSBsb2FkZWQgZnJvbSB0aGUgSlNPTiBmaWxlIGFib3ZlLlxuICogQHJldHVybnMgQW4gaW5zdGFuY2Ugb2YgYEZpbGVzYCBgSU9IYW5kbGVyYC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdMb2FkaW5nJyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckZpbGVzKGZpbGVzOiBGaWxlW10pOiBJT0hhbmRsZXIge1xuICByZXR1cm4gbmV3IEJyb3dzZXJGaWxlcyhmaWxlcyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assert } from '../util';\n/**\n * Monitor Promise.all progress, fire onProgress callback function.\n *\n * @param promises Promise list going to be monitored\n * @param onProgress Callback function. Fired when a promise resolved.\n * @param startFraction Optional fraction start. Default to 0.\n * @param endFraction Optional fraction end. Default to 1.\n */\nexport function monitorPromisesProgress(promises, onProgress, startFraction, endFraction) {\n    checkPromises(promises);\n    startFraction = startFraction == null ? 0 : startFraction;\n    endFraction = endFraction == null ? 1 : endFraction;\n    checkFraction(startFraction, endFraction);\n    let resolvedPromise = 0;\n    const registerMonitor = (promise) => {\n        promise.then(value => {\n            const fraction = startFraction +\n                ++resolvedPromise / promises.length * (endFraction - startFraction);\n            // pass fraction as parameter to callback function.\n            onProgress(fraction);\n            return value;\n        });\n        return promise;\n    };\n    function checkPromises(promises) {\n        assert(promises != null && Array.isArray(promises) && promises.length > 0, () => 'promises must be a none empty array');\n    }\n    function checkFraction(startFraction, endFraction) {\n        assert(startFraction >= 0 && startFraction <= 1, () => `Progress fraction must be in range [0, 1], but ` +\n            `got startFraction ${startFraction}`);\n        assert(endFraction >= 0 && endFraction <= 1, () => `Progress fraction must be in range [0, 1], but ` +\n            `got endFraction ${endFraction}`);\n        assert(endFraction >= startFraction, () => `startFraction must be no more than endFraction, but ` +\n            `got startFraction ${startFraction} and endFraction ` +\n            `${endFraction}`);\n    }\n    return Promise.all(promises.map(registerMonitor));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL3Byb2dyZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFJL0I7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDbkMsUUFBaUMsRUFBRSxVQUE4QixFQUNqRSxhQUFzQixFQUFFLFdBQW9CO0lBQzlDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN4QixhQUFhLEdBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDMUQsV0FBVyxHQUFHLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO0lBQ3BELGFBQWEsQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUMsSUFBSSxlQUFlLEdBQUcsQ0FBQyxDQUFDO0lBRXhCLE1BQU0sZUFBZSxHQUFHLENBQUMsT0FBb0IsRUFBRSxFQUFFO1FBQy9DLE9BQU8sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbkIsTUFBTSxRQUFRLEdBQUcsYUFBYTtnQkFDMUIsRUFBRSxlQUFlLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLFdBQVcsR0FBRyxhQUFhLENBQUMsQ0FBQztZQUN4RSxtREFBbUQ7WUFDbkQsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3JCLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE9BQU8sQ0FBQztJQUNqQixDQUFDLENBQUM7SUFFRixTQUFTLGFBQWEsQ0FBQyxRQUFpQztRQUN0RCxNQUFNLENBQ0YsUUFBUSxJQUFJLElBQUksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUNsRSxHQUFHLEVBQUUsQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFRCxTQUFTLGFBQWEsQ0FBQyxhQUFxQixFQUFFLFdBQW1CO1FBQy9ELE1BQU0sQ0FDRixhQUFhLElBQUksQ0FBQyxJQUFJLGFBQWEsSUFBSSxDQUFDLEVBQ3hDLEdBQUcsRUFBRSxDQUFDLGlEQUFpRDtZQUNuRCxxQkFBcUIsYUFBYSxFQUFFLENBQUMsQ0FBQztRQUM5QyxNQUFNLENBQ0YsV0FBVyxJQUFJLENBQUMsSUFBSSxXQUFXLElBQUksQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQyxpREFBaUQ7WUFDbkQsbUJBQW1CLFdBQVcsRUFBRSxDQUFDLENBQUM7UUFDMUMsTUFBTSxDQUNGLFdBQVcsSUFBSSxhQUFhLEVBQzVCLEdBQUcsRUFBRSxDQUFDLHNEQUFzRDtZQUN4RCxxQkFBcUIsYUFBYSxtQkFBbUI7WUFDckQsR0FBRyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtPblByb2dyZXNzQ2FsbGJhY2t9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIE1vbml0b3IgUHJvbWlzZS5hbGwgcHJvZ3Jlc3MsIGZpcmUgb25Qcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbi5cbiAqXG4gKiBAcGFyYW0gcHJvbWlzZXMgUHJvbWlzZSBsaXN0IGdvaW5nIHRvIGJlIG1vbml0b3JlZFxuICogQHBhcmFtIG9uUHJvZ3Jlc3MgQ2FsbGJhY2sgZnVuY3Rpb24uIEZpcmVkIHdoZW4gYSBwcm9taXNlIHJlc29sdmVkLlxuICogQHBhcmFtIHN0YXJ0RnJhY3Rpb24gT3B0aW9uYWwgZnJhY3Rpb24gc3RhcnQuIERlZmF1bHQgdG8gMC5cbiAqIEBwYXJhbSBlbmRGcmFjdGlvbiBPcHRpb25hbCBmcmFjdGlvbiBlbmQuIERlZmF1bHQgdG8gMS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1vbml0b3JQcm9taXNlc1Byb2dyZXNzKFxuICAgIHByb21pc2VzOiBBcnJheTxQcm9taXNlPHt9fHZvaWQ+Piwgb25Qcm9ncmVzczogT25Qcm9ncmVzc0NhbGxiYWNrLFxuICAgIHN0YXJ0RnJhY3Rpb24/OiBudW1iZXIsIGVuZEZyYWN0aW9uPzogbnVtYmVyKSB7XG4gIGNoZWNrUHJvbWlzZXMocHJvbWlzZXMpO1xuICBzdGFydEZyYWN0aW9uID0gc3RhcnRGcmFjdGlvbiA9PSBudWxsID8gMCA6IHN0YXJ0RnJhY3Rpb247XG4gIGVuZEZyYWN0aW9uID0gZW5kRnJhY3Rpb24gPT0gbnVsbCA/IDEgOiBlbmRGcmFjdGlvbjtcbiAgY2hlY2tGcmFjdGlvbihzdGFydEZyYWN0aW9uLCBlbmRGcmFjdGlvbik7XG4gIGxldCByZXNvbHZlZFByb21pc2UgPSAwO1xuXG4gIGNvbnN0IHJlZ2lzdGVyTW9uaXRvciA9IChwcm9taXNlOiBQcm9taXNlPHt9PikgPT4ge1xuICAgIHByb21pc2UudGhlbih2YWx1ZSA9PiB7XG4gICAgICBjb25zdCBmcmFjdGlvbiA9IHN0YXJ0RnJhY3Rpb24gK1xuICAgICAgICAgICsrcmVzb2x2ZWRQcm9taXNlIC8gcHJvbWlzZXMubGVuZ3RoICogKGVuZEZyYWN0aW9uIC0gc3RhcnRGcmFjdGlvbik7XG4gICAgICAvLyBwYXNzIGZyYWN0aW9uIGFzIHBhcmFtZXRlciB0byBjYWxsYmFjayBmdW5jdGlvbi5cbiAgICAgIG9uUHJvZ3Jlc3MoZnJhY3Rpb24pO1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH0pO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9O1xuXG4gIGZ1bmN0aW9uIGNoZWNrUHJvbWlzZXMocHJvbWlzZXM6IEFycmF5PFByb21pc2U8e318dm9pZD4+KTogdm9pZCB7XG4gICAgYXNzZXJ0KFxuICAgICAgICBwcm9taXNlcyAhPSBudWxsICYmIEFycmF5LmlzQXJyYXkocHJvbWlzZXMpICYmIHByb21pc2VzLmxlbmd0aCA+IDAsXG4gICAgICAgICgpID0+ICdwcm9taXNlcyBtdXN0IGJlIGEgbm9uZSBlbXB0eSBhcnJheScpO1xuICB9XG5cbiAgZnVuY3Rpb24gY2hlY2tGcmFjdGlvbihzdGFydEZyYWN0aW9uOiBudW1iZXIsIGVuZEZyYWN0aW9uOiBudW1iZXIpOiB2b2lkIHtcbiAgICBhc3NlcnQoXG4gICAgICAgIHN0YXJ0RnJhY3Rpb24gPj0gMCAmJiBzdGFydEZyYWN0aW9uIDw9IDEsXG4gICAgICAgICgpID0+IGBQcm9ncmVzcyBmcmFjdGlvbiBtdXN0IGJlIGluIHJhbmdlIFswLCAxXSwgYnV0IGAgK1xuICAgICAgICAgICAgYGdvdCBzdGFydEZyYWN0aW9uICR7c3RhcnRGcmFjdGlvbn1gKTtcbiAgICBhc3NlcnQoXG4gICAgICAgIGVuZEZyYWN0aW9uID49IDAgJiYgZW5kRnJhY3Rpb24gPD0gMSxcbiAgICAgICAgKCkgPT4gYFByb2dyZXNzIGZyYWN0aW9uIG11c3QgYmUgaW4gcmFuZ2UgWzAsIDFdLCBidXQgYCArXG4gICAgICAgICAgICBgZ290IGVuZEZyYWN0aW9uICR7ZW5kRnJhY3Rpb259YCk7XG4gICAgYXNzZXJ0KFxuICAgICAgICBlbmRGcmFjdGlvbiA+PSBzdGFydEZyYWN0aW9uLFxuICAgICAgICAoKSA9PiBgc3RhcnRGcmFjdGlvbiBtdXN0IGJlIG5vIG1vcmUgdGhhbiBlbmRGcmFjdGlvbiwgYnV0IGAgK1xuICAgICAgICAgICAgYGdvdCBzdGFydEZyYWN0aW9uICR7c3RhcnRGcmFjdGlvbn0gYW5kIGVuZEZyYWN0aW9uIGAgK1xuICAgICAgICAgICAgYCR7ZW5kRnJhY3Rpb259YCk7XG4gIH1cblxuICByZXR1cm4gUHJvbWlzZS5hbGwocHJvbWlzZXMubWFwKHJlZ2lzdGVyTW9uaXRvcikpO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '../environment';\nimport * as util from '../util';\nimport { decodeWeights } from './io_utils';\nimport { monitorPromisesProgress } from './progress';\nimport { DTYPE_VALUE_SIZE_MAP } from './types';\n/**\n * Reads binary weights data from a number of URLs.\n *\n * @param fetchURLs URLs to send the HTTP requests at, using `fetch` calls.\n * @param requestOptions RequestInit (options) for the HTTP requests.\n * @param fetchFunc Optional overriding value for the `window.fetch` function.\n * @param onProgress Optional, progress callback function, fired periodically\n *   before the load is completed.\n * @returns A `Promise` of an Array of `ArrayBuffer`. The Array has the same\n *   length as `fetchURLs`.\n */\nexport async function loadWeightsAsArrayBuffer(fetchURLs, loadOptions) {\n    if (loadOptions == null) {\n        loadOptions = {};\n    }\n    const fetchFunc = loadOptions.fetchFunc == null ? env().platform.fetch :\n        loadOptions.fetchFunc;\n    // Create the requests for all of the weights in parallel.\n    const requests = fetchURLs.map(fetchURL => fetchFunc(fetchURL, loadOptions.requestInit, { isBinary: true }));\n    const fetchStartFraction = 0;\n    const fetchEndFraction = 0.5;\n    const responses = loadOptions.onProgress == null ?\n        await Promise.all(requests) :\n        await monitorPromisesProgress(requests, loadOptions.onProgress, fetchStartFraction, fetchEndFraction);\n    const bufferPromises = responses.map(response => response.arrayBuffer());\n    const bufferStartFraction = 0.5;\n    const bufferEndFraction = 1;\n    const buffers = loadOptions.onProgress == null ?\n        await Promise.all(bufferPromises) :\n        await monitorPromisesProgress(bufferPromises, loadOptions.onProgress, bufferStartFraction, bufferEndFraction);\n    return buffers;\n}\n/**\n * Reads a weights manifest JSON configuration, fetches the weights and\n * returns them as `Tensor`s.\n *\n * @param manifest The weights manifest JSON.\n * @param filePathPrefix The path prefix for filenames given in the manifest.\n *     Defaults to the empty string.\n * @param weightNames The names of the weights to be fetched.\n */\nexport async function loadWeights(manifest, filePathPrefix = '', weightNames, requestInit) {\n    // TODO(nsthorat): Groups are currently fetched atomically. If you need a\n    // single weight from a group, the whole group will be fetched. At a future\n    // date, we should support fetching only the individual shards within a\n    // group that are needed to reconstruct the requested weight.\n    // TODO(cais): Use `decodeWeights` for implementation.\n    const fetchWeights = (fetchUrls) => loadWeightsAsArrayBuffer(fetchUrls, { requestInit });\n    const loadWeights = weightsLoaderFactory(fetchWeights);\n    return loadWeights(manifest, filePathPrefix, weightNames);\n}\n/**\n * Creates a function, which reads a weights manifest JSON configuration,\n * fetches the weight files using the specified function and returns them as\n * `Tensor`s.\n *\n * ```js\n * // example for creating a nodejs weight loader, which reads the weight files\n * // from disk using fs.readFileSync\n *\n * import * as fs from 'fs'\n *\n * const fetchWeightsFromDisk = (filePaths: string[]) =>\n *   filePaths.map(filePath => fs.readFileSync(filePath).buffer)\n *\n * const loadWeights = tf.io.weightsLoaderFactory(fetchWeightsFromDisk)\n *\n * const manifest = JSON.parse(\n *   fs.readFileSync('./my_model-weights_manifest').toString()\n * )\n * const weightMap = await loadWeights(manifest, './')\n * ```\n * @param fetchWeightsFunction The function used for fetching the weight files.\n * @returns Weight loading function.\n */\nexport function weightsLoaderFactory(fetchWeightsFunction) {\n    return async (manifest, filePathPrefix = '', weightNames) => {\n        // Collect all the groups, weights, and their relative offsets to be\n        // fetched.\n        const groupIndicesToFetchMap = manifest.map(() => false);\n        const groupWeightsToFetch = {};\n        const weightsFound = weightNames != null ? weightNames.map(() => false) : [];\n        const allManifestWeightNames = [];\n        manifest.forEach((manifestGroupConfig, groupIndex) => {\n            let groupOffset = 0;\n            manifestGroupConfig.weights.forEach(weightsEntry => {\n                const rawDtype = ('quantization' in weightsEntry) ?\n                    weightsEntry.quantization.dtype :\n                    weightsEntry.dtype;\n                const weightsBytes = DTYPE_VALUE_SIZE_MAP[rawDtype] *\n                    util.sizeFromShape(weightsEntry.shape);\n                const enqueueWeightsForFetchingFn = () => {\n                    groupIndicesToFetchMap[groupIndex] = true;\n                    if (groupWeightsToFetch[groupIndex] == null) {\n                        groupWeightsToFetch[groupIndex] = [];\n                    }\n                    groupWeightsToFetch[groupIndex].push({\n                        manifestEntry: weightsEntry,\n                        groupOffset,\n                        sizeBytes: weightsBytes\n                    });\n                };\n                if (weightNames != null) {\n                    weightNames.forEach((weightName, weightIndex) => {\n                        if (weightName === weightsEntry.name) {\n                            enqueueWeightsForFetchingFn();\n                            weightsFound[weightIndex] = true;\n                        }\n                    });\n                }\n                else {\n                    enqueueWeightsForFetchingFn();\n                }\n                allManifestWeightNames.push(weightsEntry.name);\n                groupOffset += weightsBytes;\n            });\n        });\n        if (!weightsFound.every(found => found)) {\n            const weightsNotFound = weightNames.filter((_, i) => !weightsFound[i]);\n            throw new Error(`Could not find weights in manifest with names: ` +\n                `${weightsNotFound.join(', ')}. \\n` +\n                `Manifest JSON has weights with names: ` +\n                `${allManifestWeightNames.join(', ')}.`);\n        }\n        // Convert the one-hot boolean groupId => shouldFetch map to a list of group\n        // IDs.\n        const groupIndicesToFetch = groupIndicesToFetchMap.reduce((accumulator, shouldFetch, i) => {\n            if (shouldFetch) {\n                accumulator.push(i);\n            }\n            return accumulator;\n        }, []);\n        const fetchUrls = [];\n        groupIndicesToFetch.forEach(i => {\n            manifest[i].paths.forEach(filepath => {\n                const fetchUrl = filePathPrefix +\n                    (!filePathPrefix.endsWith('/') ? '/' : '') + filepath;\n                fetchUrls.push(fetchUrl);\n            });\n        });\n        const buffers = await fetchWeightsFunction(fetchUrls);\n        const weightsTensorMap = {};\n        let bufferIndexOffset = 0;\n        groupIndicesToFetch.forEach(i => {\n            const numBuffers = manifest[i].paths.length;\n            let groupBytes = 0;\n            for (let i = 0; i < numBuffers; i++) {\n                groupBytes += buffers[bufferIndexOffset + i].byteLength;\n            }\n            // Create a buffer for the whole group.\n            const groupBuffer = new ArrayBuffer(groupBytes);\n            const groupByteBuffer = new Uint8Array(groupBuffer);\n            let groupBufferOffset = 0;\n            for (let i = 0; i < numBuffers; i++) {\n                const buffer = new Uint8Array(buffers[bufferIndexOffset + i]);\n                groupByteBuffer.set(buffer, groupBufferOffset);\n                groupBufferOffset += buffer.byteLength;\n            }\n            const weightsEntries = groupWeightsToFetch[i];\n            weightsEntries.forEach(weightsEntry => {\n                const byteBuffer = groupBuffer.slice(weightsEntry.groupOffset, weightsEntry.groupOffset + weightsEntry.sizeBytes);\n                const nameToTensorMap = decodeWeights(byteBuffer, [weightsEntry.manifestEntry]);\n                for (const name in nameToTensorMap) {\n                    weightsTensorMap[name] = nameToTensorMap[name];\n                }\n            });\n            bufferIndexOffset += numBuffers;\n        });\n        return weightsTensorMap;\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2VpZ2h0c19sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL3dlaWdodHNfbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUduQyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUMsb0JBQW9CLEVBQTJELE1BQU0sU0FBUyxDQUFDO0FBRXZHOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLHdCQUF3QixDQUMxQyxTQUFtQixFQUFFLFdBQXlCO0lBQ2hELElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixXQUFXLEdBQUcsRUFBRSxDQUFDO0tBQ2xCO0lBRUQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN0QixXQUFXLENBQUMsU0FBUyxDQUFDO0lBRXhFLDBEQUEwRDtJQUMxRCxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUMxQixRQUFRLENBQUMsRUFBRSxDQUNQLFNBQVMsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFFeEUsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUM7SUFDN0IsTUFBTSxnQkFBZ0IsR0FBRyxHQUFHLENBQUM7SUFFN0IsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUM5QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztRQUM3QixNQUFNLHVCQUF1QixDQUN6QixRQUFRLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxrQkFBa0IsRUFDcEQsZ0JBQWdCLENBQUMsQ0FBQztJQUUxQixNQUFNLGNBQWMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFFekUsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLENBQUM7SUFDaEMsTUFBTSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7SUFFNUIsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsQ0FBQztRQUM1QyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLHVCQUF1QixDQUN6QixjQUFjLEVBQUUsV0FBVyxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsRUFDM0QsaUJBQWlCLENBQUMsQ0FBQztJQUMzQixPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFdBQVcsQ0FDN0IsUUFBK0IsRUFBRSxjQUFjLEdBQUcsRUFBRSxFQUNwRCxXQUFzQixFQUN0QixXQUF5QjtJQUMzQix5RUFBeUU7SUFDekUsMkVBQTJFO0lBQzNFLHVFQUF1RTtJQUN2RSw2REFBNkQ7SUFDN0Qsc0RBQXNEO0lBRXRELE1BQU0sWUFBWSxHQUFHLENBQUMsU0FBbUIsRUFBRSxFQUFFLENBQ3pDLHdCQUF3QixDQUFDLFNBQVMsRUFBRSxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUM7SUFDdkQsTUFBTSxXQUFXLEdBQUcsb0JBQW9CLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFdkQsT0FBTyxXQUFXLENBQUMsUUFBUSxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUJHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxvQkFBcUU7SUFHdkUsT0FBTyxLQUFLLEVBQ0QsUUFBK0IsRUFBRSxjQUFjLEdBQUcsRUFBRSxFQUNwRCxXQUFzQixFQUEyQixFQUFFO1FBQzVELG9FQUFvRTtRQUNwRSxXQUFXO1FBQ1gsTUFBTSxzQkFBc0IsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3pELE1BQU0sbUJBQW1CLEdBS3JCLEVBQUUsQ0FBQztRQUNQLE1BQU0sWUFBWSxHQUNkLFdBQVcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxNQUFNLHNCQUFzQixHQUFhLEVBQUUsQ0FBQztRQUM1QyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLEVBQUU7WUFDbkQsSUFBSSxXQUFXLEdBQUcsQ0FBQyxDQUFDO1lBQ3BCLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQ2pELE1BQU0sUUFBUSxHQUFHLENBQUMsY0FBYyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUM7b0JBQy9DLFlBQVksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ2pDLFlBQVksQ0FBQyxLQUFLLENBQUM7Z0JBRXZCLE1BQU0sWUFBWSxHQUFHLG9CQUFvQixDQUFDLFFBQVEsQ0FBQztvQkFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBRTNDLE1BQU0sMkJBQTJCLEdBQUcsR0FBRyxFQUFFO29CQUN2QyxzQkFBc0IsQ0FBQyxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUM7b0JBQzFDLElBQUksbUJBQW1CLENBQUMsVUFBVSxDQUFDLElBQUksSUFBSSxFQUFFO3dCQUMzQyxtQkFBbUIsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7cUJBQ3RDO29CQUVELG1CQUFtQixDQUFDLFVBQVUsQ0FBQyxDQUFDLElBQUksQ0FBQzt3QkFDbkMsYUFBYSxFQUFFLFlBQVk7d0JBQzNCLFdBQVc7d0JBQ1gsU0FBUyxFQUFFLFlBQVk7cUJBQ3hCLENBQUMsQ0FBQztnQkFDTCxDQUFDLENBQUM7Z0JBRUYsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO29CQUN2QixXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxFQUFFO3dCQUM5QyxJQUFJLFVBQVUsS0FBSyxZQUFZLENBQUMsSUFBSSxFQUFFOzRCQUNwQywyQkFBMkIsRUFBRSxDQUFDOzRCQUM5QixZQUFZLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDO3lCQUNsQztvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtxQkFBTTtvQkFDTCwyQkFBMkIsRUFBRSxDQUFDO2lCQUMvQjtnQkFFRCxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvQyxXQUFXLElBQUksWUFBWSxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3ZDLE1BQU0sZUFBZSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxLQUFLLENBQ1gsaURBQWlEO2dCQUNqRCxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU07Z0JBQ25DLHdDQUF3QztnQkFDeEMsR0FBRyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzlDO1FBRUQsNEVBQTRFO1FBQzVFLE9BQU87UUFDUCxNQUFNLG1CQUFtQixHQUNyQixzQkFBc0IsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzVELElBQUksV0FBVyxFQUFFO2dCQUNmLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDckI7WUFDRCxPQUFPLFdBQVcsQ0FBQztRQUNyQixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFWCxNQUFNLFNBQVMsR0FBYSxFQUFFLENBQUM7UUFDL0IsbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzlCLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO2dCQUNuQyxNQUFNLFFBQVEsR0FBRyxjQUFjO29CQUMzQixDQUFDLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUM7Z0JBQzFELFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLE1BQU0sb0JBQW9CLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFdEQsTUFBTSxnQkFBZ0IsR0FBbUIsRUFBRSxDQUFDO1FBQzVDLElBQUksaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO1FBQzFCLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUM5QixNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztZQUU1QyxJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7WUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsVUFBVSxJQUFJLE9BQU8sQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7YUFDekQ7WUFFRCx1Q0FBdUM7WUFDdkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDaEQsTUFBTSxlQUFlLEdBQUcsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDcEQsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7WUFDMUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbkMsTUFBTSxNQUFNLEdBQUcsSUFBSSxVQUFVLENBQUMsT0FBTyxDQUFDLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzlELGVBQWUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQy9DLGlCQUFpQixJQUFJLE1BQU0sQ0FBQyxVQUFVLENBQUM7YUFDeEM7WUFFRCxNQUFNLGNBQWMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM5QyxjQUFjLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxFQUFFO2dCQUNwQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsS0FBSyxDQUNoQyxZQUFZLENBQUMsV0FBVyxFQUN4QixZQUFZLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDdkQsTUFBTSxlQUFlLEdBQ2pCLGFBQWEsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztnQkFDNUQsS0FBSyxNQUFNLElBQUksSUFBSSxlQUFlLEVBQUU7b0JBQ2xDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDaEQ7WUFDSCxDQUFDLENBQUMsQ0FBQztZQUVILGlCQUFpQixJQUFJLFVBQVUsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUVILE9BQU8sZ0JBQWdCLENBQUM7SUFDMUIsQ0FBQyxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnZ9IGZyb20gJy4uL2Vudmlyb25tZW50JztcblxuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge2RlY29kZVdlaWdodHN9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHttb25pdG9yUHJvbWlzZXNQcm9ncmVzc30gZnJvbSAnLi9wcm9ncmVzcyc7XG5pbXBvcnQge0RUWVBFX1ZBTFVFX1NJWkVfTUFQLCBMb2FkT3B0aW9ucywgV2VpZ2h0c01hbmlmZXN0Q29uZmlnLCBXZWlnaHRzTWFuaWZlc3RFbnRyeX0gZnJvbSAnLi90eXBlcyc7XG5cbi8qKlxuICogUmVhZHMgYmluYXJ5IHdlaWdodHMgZGF0YSBmcm9tIGEgbnVtYmVyIG9mIFVSTHMuXG4gKlxuICogQHBhcmFtIGZldGNoVVJMcyBVUkxzIHRvIHNlbmQgdGhlIEhUVFAgcmVxdWVzdHMgYXQsIHVzaW5nIGBmZXRjaGAgY2FsbHMuXG4gKiBAcGFyYW0gcmVxdWVzdE9wdGlvbnMgUmVxdWVzdEluaXQgKG9wdGlvbnMpIGZvciB0aGUgSFRUUCByZXF1ZXN0cy5cbiAqIEBwYXJhbSBmZXRjaEZ1bmMgT3B0aW9uYWwgb3ZlcnJpZGluZyB2YWx1ZSBmb3IgdGhlIGB3aW5kb3cuZmV0Y2hgIGZ1bmN0aW9uLlxuICogQHBhcmFtIG9uUHJvZ3Jlc3MgT3B0aW9uYWwsIHByb2dyZXNzIGNhbGxiYWNrIGZ1bmN0aW9uLCBmaXJlZCBwZXJpb2RpY2FsbHlcbiAqICAgYmVmb3JlIHRoZSBsb2FkIGlzIGNvbXBsZXRlZC5cbiAqIEByZXR1cm5zIEEgYFByb21pc2VgIG9mIGFuIEFycmF5IG9mIGBBcnJheUJ1ZmZlcmAuIFRoZSBBcnJheSBoYXMgdGhlIHNhbWVcbiAqICAgbGVuZ3RoIGFzIGBmZXRjaFVSTHNgLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdlaWdodHNBc0FycmF5QnVmZmVyKFxuICAgIGZldGNoVVJMczogc3RyaW5nW10sIGxvYWRPcHRpb25zPzogTG9hZE9wdGlvbnMpOiBQcm9taXNlPEFycmF5QnVmZmVyW10+IHtcbiAgaWYgKGxvYWRPcHRpb25zID09IG51bGwpIHtcbiAgICBsb2FkT3B0aW9ucyA9IHt9O1xuICB9XG5cbiAgY29uc3QgZmV0Y2hGdW5jID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jID09IG51bGwgPyBlbnYoKS5wbGF0Zm9ybS5mZXRjaCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE9wdGlvbnMuZmV0Y2hGdW5jO1xuXG4gIC8vIENyZWF0ZSB0aGUgcmVxdWVzdHMgZm9yIGFsbCBvZiB0aGUgd2VpZ2h0cyBpbiBwYXJhbGxlbC5cbiAgY29uc3QgcmVxdWVzdHMgPSBmZXRjaFVSTHMubWFwKFxuICAgICAgZmV0Y2hVUkwgPT5cbiAgICAgICAgICBmZXRjaEZ1bmMoZmV0Y2hVUkwsIGxvYWRPcHRpb25zLnJlcXVlc3RJbml0LCB7aXNCaW5hcnk6IHRydWV9KSk7XG5cbiAgY29uc3QgZmV0Y2hTdGFydEZyYWN0aW9uID0gMDtcbiAgY29uc3QgZmV0Y2hFbmRGcmFjdGlvbiA9IDAuNTtcblxuICBjb25zdCByZXNwb25zZXMgPSBsb2FkT3B0aW9ucy5vblByb2dyZXNzID09IG51bGwgP1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWVzdHMpIDpcbiAgICAgIGF3YWl0IG1vbml0b3JQcm9taXNlc1Byb2dyZXNzKFxuICAgICAgICAgIHJlcXVlc3RzLCBsb2FkT3B0aW9ucy5vblByb2dyZXNzLCBmZXRjaFN0YXJ0RnJhY3Rpb24sXG4gICAgICAgICAgZmV0Y2hFbmRGcmFjdGlvbik7XG5cbiAgY29uc3QgYnVmZmVyUHJvbWlzZXMgPSByZXNwb25zZXMubWFwKHJlc3BvbnNlID0+IHJlc3BvbnNlLmFycmF5QnVmZmVyKCkpO1xuXG4gIGNvbnN0IGJ1ZmZlclN0YXJ0RnJhY3Rpb24gPSAwLjU7XG4gIGNvbnN0IGJ1ZmZlckVuZEZyYWN0aW9uID0gMTtcblxuICBjb25zdCBidWZmZXJzID0gbG9hZE9wdGlvbnMub25Qcm9ncmVzcyA9PSBudWxsID9cbiAgICAgIGF3YWl0IFByb21pc2UuYWxsKGJ1ZmZlclByb21pc2VzKSA6XG4gICAgICBhd2FpdCBtb25pdG9yUHJvbWlzZXNQcm9ncmVzcyhcbiAgICAgICAgICBidWZmZXJQcm9taXNlcywgbG9hZE9wdGlvbnMub25Qcm9ncmVzcywgYnVmZmVyU3RhcnRGcmFjdGlvbixcbiAgICAgICAgICBidWZmZXJFbmRGcmFjdGlvbik7XG4gIHJldHVybiBidWZmZXJzO1xufVxuXG4vKipcbiAqIFJlYWRzIGEgd2VpZ2h0cyBtYW5pZmVzdCBKU09OIGNvbmZpZ3VyYXRpb24sIGZldGNoZXMgdGhlIHdlaWdodHMgYW5kXG4gKiByZXR1cm5zIHRoZW0gYXMgYFRlbnNvcmBzLlxuICpcbiAqIEBwYXJhbSBtYW5pZmVzdCBUaGUgd2VpZ2h0cyBtYW5pZmVzdCBKU09OLlxuICogQHBhcmFtIGZpbGVQYXRoUHJlZml4IFRoZSBwYXRoIHByZWZpeCBmb3IgZmlsZW5hbWVzIGdpdmVuIGluIHRoZSBtYW5pZmVzdC5cbiAqICAgICBEZWZhdWx0cyB0byB0aGUgZW1wdHkgc3RyaW5nLlxuICogQHBhcmFtIHdlaWdodE5hbWVzIFRoZSBuYW1lcyBvZiB0aGUgd2VpZ2h0cyB0byBiZSBmZXRjaGVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbG9hZFdlaWdodHMoXG4gICAgbWFuaWZlc3Q6IFdlaWdodHNNYW5pZmVzdENvbmZpZywgZmlsZVBhdGhQcmVmaXggPSAnJyxcbiAgICB3ZWlnaHROYW1lcz86IHN0cmluZ1tdLFxuICAgIHJlcXVlc3RJbml0PzogUmVxdWVzdEluaXQpOiBQcm9taXNlPE5hbWVkVGVuc29yTWFwPiB7XG4gIC8vIFRPRE8obnN0aG9yYXQpOiBHcm91cHMgYXJlIGN1cnJlbnRseSBmZXRjaGVkIGF0b21pY2FsbHkuIElmIHlvdSBuZWVkIGFcbiAgLy8gc2luZ2xlIHdlaWdodCBmcm9tIGEgZ3JvdXAsIHRoZSB3aG9sZSBncm91cCB3aWxsIGJlIGZldGNoZWQuIEF0IGEgZnV0dXJlXG4gIC8vIGRhdGUsIHdlIHNob3VsZCBzdXBwb3J0IGZldGNoaW5nIG9ubHkgdGhlIGluZGl2aWR1YWwgc2hhcmRzIHdpdGhpbiBhXG4gIC8vIGdyb3VwIHRoYXQgYXJlIG5lZWRlZCB0byByZWNvbnN0cnVjdCB0aGUgcmVxdWVzdGVkIHdlaWdodC5cbiAgLy8gVE9ETyhjYWlzKTogVXNlIGBkZWNvZGVXZWlnaHRzYCBmb3IgaW1wbGVtZW50YXRpb24uXG5cbiAgY29uc3QgZmV0Y2hXZWlnaHRzID0gKGZldGNoVXJsczogc3RyaW5nW10pID0+XG4gICAgICBsb2FkV2VpZ2h0c0FzQXJyYXlCdWZmZXIoZmV0Y2hVcmxzLCB7cmVxdWVzdEluaXR9KTtcbiAgY29uc3QgbG9hZFdlaWdodHMgPSB3ZWlnaHRzTG9hZGVyRmFjdG9yeShmZXRjaFdlaWdodHMpO1xuXG4gIHJldHVybiBsb2FkV2VpZ2h0cyhtYW5pZmVzdCwgZmlsZVBhdGhQcmVmaXgsIHdlaWdodE5hbWVzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgZnVuY3Rpb24sIHdoaWNoIHJlYWRzIGEgd2VpZ2h0cyBtYW5pZmVzdCBKU09OIGNvbmZpZ3VyYXRpb24sXG4gKiBmZXRjaGVzIHRoZSB3ZWlnaHQgZmlsZXMgdXNpbmcgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBhbmQgcmV0dXJucyB0aGVtIGFzXG4gKiBgVGVuc29yYHMuXG4gKlxuICogYGBganNcbiAqIC8vIGV4YW1wbGUgZm9yIGNyZWF0aW5nIGEgbm9kZWpzIHdlaWdodCBsb2FkZXIsIHdoaWNoIHJlYWRzIHRoZSB3ZWlnaHQgZmlsZXNcbiAqIC8vIGZyb20gZGlzayB1c2luZyBmcy5yZWFkRmlsZVN5bmNcbiAqXG4gKiBpbXBvcnQgKiBhcyBmcyBmcm9tICdmcydcbiAqXG4gKiBjb25zdCBmZXRjaFdlaWdodHNGcm9tRGlzayA9IChmaWxlUGF0aHM6IHN0cmluZ1tdKSA9PlxuICogICBmaWxlUGF0aHMubWFwKGZpbGVQYXRoID0+IGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCkuYnVmZmVyKVxuICpcbiAqIGNvbnN0IGxvYWRXZWlnaHRzID0gdGYuaW8ud2VpZ2h0c0xvYWRlckZhY3RvcnkoZmV0Y2hXZWlnaHRzRnJvbURpc2spXG4gKlxuICogY29uc3QgbWFuaWZlc3QgPSBKU09OLnBhcnNlKFxuICogICBmcy5yZWFkRmlsZVN5bmMoJy4vbXlfbW9kZWwtd2VpZ2h0c19tYW5pZmVzdCcpLnRvU3RyaW5nKClcbiAqIClcbiAqIGNvbnN0IHdlaWdodE1hcCA9IGF3YWl0IGxvYWRXZWlnaHRzKG1hbmlmZXN0LCAnLi8nKVxuICogYGBgXG4gKiBAcGFyYW0gZmV0Y2hXZWlnaHRzRnVuY3Rpb24gVGhlIGZ1bmN0aW9uIHVzZWQgZm9yIGZldGNoaW5nIHRoZSB3ZWlnaHQgZmlsZXMuXG4gKiBAcmV0dXJucyBXZWlnaHQgbG9hZGluZyBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHdlaWdodHNMb2FkZXJGYWN0b3J5KFxuICAgIGZldGNoV2VpZ2h0c0Z1bmN0aW9uOiAoZmV0Y2hVcmxzOiBzdHJpbmdbXSkgPT4gUHJvbWlzZTxBcnJheUJ1ZmZlcltdPik6XG4gICAgKG1hbmlmZXN0OiBXZWlnaHRzTWFuaWZlc3RDb25maWcsIGZpbGVQYXRoUHJlZml4Pzogc3RyaW5nLFxuICAgICB3ZWlnaHROYW1lcz86IHN0cmluZ1tdKSA9PiBQcm9taXNlPE5hbWVkVGVuc29yTWFwPiB7XG4gIHJldHVybiBhc3luYyhcbiAgICAgICAgICAgICBtYW5pZmVzdDogV2VpZ2h0c01hbmlmZXN0Q29uZmlnLCBmaWxlUGF0aFByZWZpeCA9ICcnLFxuICAgICAgICAgICAgIHdlaWdodE5hbWVzPzogc3RyaW5nW10pOiBQcm9taXNlPE5hbWVkVGVuc29yTWFwPiA9PiB7XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIGdyb3Vwcywgd2VpZ2h0cywgYW5kIHRoZWlyIHJlbGF0aXZlIG9mZnNldHMgdG8gYmVcbiAgICAvLyBmZXRjaGVkLlxuICAgIGNvbnN0IGdyb3VwSW5kaWNlc1RvRmV0Y2hNYXAgPSBtYW5pZmVzdC5tYXAoKCkgPT4gZmFsc2UpO1xuICAgIGNvbnN0IGdyb3VwV2VpZ2h0c1RvRmV0Y2g6IHtcbiAgICAgIFtncm91cDogbnVtYmVyXTogQXJyYXk8e1xuICAgICAgICBtYW5pZmVzdEVudHJ5OiBXZWlnaHRzTWFuaWZlc3RFbnRyeTsgZ3JvdXBPZmZzZXQ6IG51bWJlcjtcbiAgICAgICAgc2l6ZUJ5dGVzOiBudW1iZXI7XG4gICAgICB9PlxuICAgIH0gPSB7fTtcbiAgICBjb25zdCB3ZWlnaHRzRm91bmQgPVxuICAgICAgICB3ZWlnaHROYW1lcyAhPSBudWxsID8gd2VpZ2h0TmFtZXMubWFwKCgpID0+IGZhbHNlKSA6IFtdO1xuICAgIGNvbnN0IGFsbE1hbmlmZXN0V2VpZ2h0TmFtZXM6IHN0cmluZ1tdID0gW107XG4gICAgbWFuaWZlc3QuZm9yRWFjaCgobWFuaWZlc3RHcm91cENvbmZpZywgZ3JvdXBJbmRleCkgPT4ge1xuICAgICAgbGV0IGdyb3VwT2Zmc2V0ID0gMDtcbiAgICAgIG1hbmlmZXN0R3JvdXBDb25maWcud2VpZ2h0cy5mb3JFYWNoKHdlaWdodHNFbnRyeSA9PiB7XG4gICAgICAgIGNvbnN0IHJhd0R0eXBlID0gKCdxdWFudGl6YXRpb24nIGluIHdlaWdodHNFbnRyeSkgP1xuICAgICAgICAgICAgd2VpZ2h0c0VudHJ5LnF1YW50aXphdGlvbi5kdHlwZSA6XG4gICAgICAgICAgICB3ZWlnaHRzRW50cnkuZHR5cGU7XG5cbiAgICAgICAgY29uc3Qgd2VpZ2h0c0J5dGVzID0gRFRZUEVfVkFMVUVfU0laRV9NQVBbcmF3RHR5cGVdICpcbiAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSh3ZWlnaHRzRW50cnkuc2hhcGUpO1xuXG4gICAgICAgIGNvbnN0IGVucXVldWVXZWlnaHRzRm9yRmV0Y2hpbmdGbiA9ICgpID0+IHtcbiAgICAgICAgICBncm91cEluZGljZXNUb0ZldGNoTWFwW2dyb3VwSW5kZXhdID0gdHJ1ZTtcbiAgICAgICAgICBpZiAoZ3JvdXBXZWlnaHRzVG9GZXRjaFtncm91cEluZGV4XSA9PSBudWxsKSB7XG4gICAgICAgICAgICBncm91cFdlaWdodHNUb0ZldGNoW2dyb3VwSW5kZXhdID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZ3JvdXBXZWlnaHRzVG9GZXRjaFtncm91cEluZGV4XS5wdXNoKHtcbiAgICAgICAgICAgIG1hbmlmZXN0RW50cnk6IHdlaWdodHNFbnRyeSxcbiAgICAgICAgICAgIGdyb3VwT2Zmc2V0LFxuICAgICAgICAgICAgc2l6ZUJ5dGVzOiB3ZWlnaHRzQnl0ZXNcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAod2VpZ2h0TmFtZXMgIT0gbnVsbCkge1xuICAgICAgICAgIHdlaWdodE5hbWVzLmZvckVhY2goKHdlaWdodE5hbWUsIHdlaWdodEluZGV4KSA9PiB7XG4gICAgICAgICAgICBpZiAod2VpZ2h0TmFtZSA9PT0gd2VpZ2h0c0VudHJ5Lm5hbWUpIHtcbiAgICAgICAgICAgICAgZW5xdWV1ZVdlaWdodHNGb3JGZXRjaGluZ0ZuKCk7XG4gICAgICAgICAgICAgIHdlaWdodHNGb3VuZFt3ZWlnaHRJbmRleF0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVucXVldWVXZWlnaHRzRm9yRmV0Y2hpbmdGbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgYWxsTWFuaWZlc3RXZWlnaHROYW1lcy5wdXNoKHdlaWdodHNFbnRyeS5uYW1lKTtcbiAgICAgICAgZ3JvdXBPZmZzZXQgKz0gd2VpZ2h0c0J5dGVzO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAoIXdlaWdodHNGb3VuZC5ldmVyeShmb3VuZCA9PiBmb3VuZCkpIHtcbiAgICAgIGNvbnN0IHdlaWdodHNOb3RGb3VuZCA9IHdlaWdodE5hbWVzLmZpbHRlcigoXywgaSkgPT4gIXdlaWdodHNGb3VuZFtpXSk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENvdWxkIG5vdCBmaW5kIHdlaWdodHMgaW4gbWFuaWZlc3Qgd2l0aCBuYW1lczogYCArXG4gICAgICAgICAgYCR7d2VpZ2h0c05vdEZvdW5kLmpvaW4oJywgJyl9LiBcXG5gICtcbiAgICAgICAgICBgTWFuaWZlc3QgSlNPTiBoYXMgd2VpZ2h0cyB3aXRoIG5hbWVzOiBgICtcbiAgICAgICAgICBgJHthbGxNYW5pZmVzdFdlaWdodE5hbWVzLmpvaW4oJywgJyl9LmApO1xuICAgIH1cblxuICAgIC8vIENvbnZlcnQgdGhlIG9uZS1ob3QgYm9vbGVhbiBncm91cElkID0+IHNob3VsZEZldGNoIG1hcCB0byBhIGxpc3Qgb2YgZ3JvdXBcbiAgICAvLyBJRHMuXG4gICAgY29uc3QgZ3JvdXBJbmRpY2VzVG9GZXRjaCA9XG4gICAgICAgIGdyb3VwSW5kaWNlc1RvRmV0Y2hNYXAucmVkdWNlKChhY2N1bXVsYXRvciwgc2hvdWxkRmV0Y2gsIGkpID0+IHtcbiAgICAgICAgICBpZiAoc2hvdWxkRmV0Y2gpIHtcbiAgICAgICAgICAgIGFjY3VtdWxhdG9yLnB1c2goaSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjtcbiAgICAgICAgfSwgW10pO1xuXG4gICAgY29uc3QgZmV0Y2hVcmxzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGdyb3VwSW5kaWNlc1RvRmV0Y2guZm9yRWFjaChpID0+IHtcbiAgICAgIG1hbmlmZXN0W2ldLnBhdGhzLmZvckVhY2goZmlsZXBhdGggPT4ge1xuICAgICAgICBjb25zdCBmZXRjaFVybCA9IGZpbGVQYXRoUHJlZml4ICtcbiAgICAgICAgICAgICghZmlsZVBhdGhQcmVmaXguZW5kc1dpdGgoJy8nKSA/ICcvJyA6ICcnKSArIGZpbGVwYXRoO1xuICAgICAgICBmZXRjaFVybHMucHVzaChmZXRjaFVybCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBjb25zdCBidWZmZXJzID0gYXdhaXQgZmV0Y2hXZWlnaHRzRnVuY3Rpb24oZmV0Y2hVcmxzKTtcblxuICAgIGNvbnN0IHdlaWdodHNUZW5zb3JNYXA6IE5hbWVkVGVuc29yTWFwID0ge307XG4gICAgbGV0IGJ1ZmZlckluZGV4T2Zmc2V0ID0gMDtcbiAgICBncm91cEluZGljZXNUb0ZldGNoLmZvckVhY2goaSA9PiB7XG4gICAgICBjb25zdCBudW1CdWZmZXJzID0gbWFuaWZlc3RbaV0ucGF0aHMubGVuZ3RoO1xuXG4gICAgICBsZXQgZ3JvdXBCeXRlcyA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykge1xuICAgICAgICBncm91cEJ5dGVzICs9IGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXS5ieXRlTGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICAvLyBDcmVhdGUgYSBidWZmZXIgZm9yIHRoZSB3aG9sZSBncm91cC5cbiAgICAgIGNvbnN0IGdyb3VwQnVmZmVyID0gbmV3IEFycmF5QnVmZmVyKGdyb3VwQnl0ZXMpO1xuICAgICAgY29uc3QgZ3JvdXBCeXRlQnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoZ3JvdXBCdWZmZXIpO1xuICAgICAgbGV0IGdyb3VwQnVmZmVyT2Zmc2V0ID0gMDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQnVmZmVyczsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcnNbYnVmZmVySW5kZXhPZmZzZXQgKyBpXSk7XG4gICAgICAgIGdyb3VwQnl0ZUJ1ZmZlci5zZXQoYnVmZmVyLCBncm91cEJ1ZmZlck9mZnNldCk7XG4gICAgICAgIGdyb3VwQnVmZmVyT2Zmc2V0ICs9IGJ1ZmZlci5ieXRlTGVuZ3RoO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB3ZWlnaHRzRW50cmllcyA9IGdyb3VwV2VpZ2h0c1RvRmV0Y2hbaV07XG4gICAgICB3ZWlnaHRzRW50cmllcy5mb3JFYWNoKHdlaWdodHNFbnRyeSA9PiB7XG4gICAgICAgIGNvbnN0IGJ5dGVCdWZmZXIgPSBncm91cEJ1ZmZlci5zbGljZShcbiAgICAgICAgICAgIHdlaWdodHNFbnRyeS5ncm91cE9mZnNldCxcbiAgICAgICAgICAgIHdlaWdodHNFbnRyeS5ncm91cE9mZnNldCArIHdlaWdodHNFbnRyeS5zaXplQnl0ZXMpO1xuICAgICAgICBjb25zdCBuYW1lVG9UZW5zb3JNYXAgPVxuICAgICAgICAgICAgZGVjb2RlV2VpZ2h0cyhieXRlQnVmZmVyLCBbd2VpZ2h0c0VudHJ5Lm1hbmlmZXN0RW50cnldKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIGluIG5hbWVUb1RlbnNvck1hcCkge1xuICAgICAgICAgIHdlaWdodHNUZW5zb3JNYXBbbmFtZV0gPSBuYW1lVG9UZW5zb3JNYXBbbmFtZV07XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICBidWZmZXJJbmRleE9mZnNldCArPSBudW1CdWZmZXJzO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHdlaWdodHNUZW5zb3JNYXA7XG4gIH07XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * IOHandler implementations based on HTTP requests in the web browser.\n *\n * Uses [`fetch`](https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API).\n */\nimport { env } from '../environment';\nimport { assert } from '../util';\nimport { concatenateArrayBuffers, getModelArtifactsForJSON, getModelArtifactsInfoForJSON, getModelJSONForModelArtifacts, getWeightSpecs } from './io_utils';\nimport { IORouterRegistry } from './router_registry';\nimport { loadWeightsAsArrayBuffer } from './weights_loader';\nconst OCTET_STREAM_MIME_TYPE = 'application/octet-stream';\nconst JSON_TYPE = 'application/json';\nexport class HTTPRequest {\n    constructor(path, loadOptions) {\n        this.DEFAULT_METHOD = 'POST';\n        if (loadOptions == null) {\n            loadOptions = {};\n        }\n        this.weightPathPrefix = loadOptions.weightPathPrefix;\n        this.onProgress = loadOptions.onProgress;\n        this.weightUrlConverter = loadOptions.weightUrlConverter;\n        if (loadOptions.fetchFunc != null) {\n            assert(typeof loadOptions.fetchFunc === 'function', () => 'Must pass a function that matches the signature of ' +\n                '`fetch` (see ' +\n                'https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)');\n            this.fetch = loadOptions.fetchFunc;\n        }\n        else {\n            this.fetch = env().platform.fetch;\n        }\n        assert(path != null && path.length > 0, () => 'URL path for http must not be null, undefined or ' +\n            'empty.');\n        if (Array.isArray(path)) {\n            assert(path.length === 2, () => 'URL paths for http must have a length of 2, ' +\n                `(actual length is ${path.length}).`);\n        }\n        this.path = path;\n        if (loadOptions.requestInit != null &&\n            loadOptions.requestInit.body != null) {\n            throw new Error('requestInit is expected to have no pre-existing body, but has one.');\n        }\n        this.requestInit = loadOptions.requestInit || {};\n    }\n    async save(modelArtifacts) {\n        if (modelArtifacts.modelTopology instanceof ArrayBuffer) {\n            throw new Error('BrowserHTTPRequest.save() does not support saving model topology ' +\n                'in binary formats yet.');\n        }\n        const init = Object.assign({ method: this.DEFAULT_METHOD }, this.requestInit);\n        init.body = new FormData();\n        const weightsManifest = [{\n                paths: ['./model.weights.bin'],\n                weights: modelArtifacts.weightSpecs,\n            }];\n        const modelTopologyAndWeightManifest = getModelJSONForModelArtifacts(modelArtifacts, weightsManifest);\n        init.body.append('model.json', new Blob([JSON.stringify(modelTopologyAndWeightManifest)], { type: JSON_TYPE }), 'model.json');\n        if (modelArtifacts.weightData != null) {\n            init.body.append('model.weights.bin', new Blob([modelArtifacts.weightData], { type: OCTET_STREAM_MIME_TYPE }), 'model.weights.bin');\n        }\n        const response = await this.fetch(this.path, init);\n        if (response.ok) {\n            return {\n                modelArtifactsInfo: getModelArtifactsInfoForJSON(modelArtifacts),\n                responses: [response],\n            };\n        }\n        else {\n            throw new Error(`BrowserHTTPRequest.save() failed due to HTTP response status ` +\n                `${response.status}.`);\n        }\n    }\n    /**\n     * Load model artifacts via HTTP request(s).\n     *\n     * See the documentation to `tf.io.http` for details on the saved\n     * artifacts.\n     *\n     * @returns The loaded model artifacts (if loading succeeds).\n     */\n    async load() {\n        const modelConfigRequest = await this.fetch(this.path, this.requestInit);\n        if (!modelConfigRequest.ok) {\n            throw new Error(`Request to ${this.path} failed with status code ` +\n                `${modelConfigRequest.status}. Please verify this URL points to ` +\n                `the model JSON of the model to load.`);\n        }\n        let modelJSON;\n        try {\n            modelJSON = await modelConfigRequest.json();\n        }\n        catch (e) {\n            let message = `Failed to parse model JSON of response from ${this.path}.`;\n            // TODO(nsthorat): Remove this after some time when we're comfortable that\n            // .pb files are mostly gone.\n            if (this.path.endsWith('.pb')) {\n                message += ' Your path contains a .pb file extension. ' +\n                    'Support for .pb models have been removed in TensorFlow.js 1.0 ' +\n                    'in favor of .json models. You can re-convert your Python ' +\n                    'TensorFlow model using the TensorFlow.js 1.0 conversion scripts ' +\n                    'or you can convert your.pb models with the \\'pb2json\\'' +\n                    'NPM script in the tensorflow/tfjs-converter repository.';\n            }\n            else {\n                message += ' Please make sure the server is serving valid ' +\n                    'JSON for this request.';\n            }\n            throw new Error(message);\n        }\n        // We do not allow both modelTopology and weightsManifest to be missing.\n        const modelTopology = modelJSON.modelTopology;\n        const weightsManifest = modelJSON.weightsManifest;\n        if (modelTopology == null && weightsManifest == null) {\n            throw new Error(`The JSON from HTTP path ${this.path} contains neither model ` +\n                `topology or manifest for weights.`);\n        }\n        return getModelArtifactsForJSON(modelJSON, (weightsManifest) => this.loadWeights(weightsManifest));\n    }\n    async loadWeights(weightsManifest) {\n        const weightPath = Array.isArray(this.path) ? this.path[1] : this.path;\n        const [prefix, suffix] = parseUrl(weightPath);\n        const pathPrefix = this.weightPathPrefix || prefix;\n        const weightSpecs = getWeightSpecs(weightsManifest);\n        const fetchURLs = [];\n        const urlPromises = [];\n        for (const weightsGroup of weightsManifest) {\n            for (const path of weightsGroup.paths) {\n                if (this.weightUrlConverter != null) {\n                    urlPromises.push(this.weightUrlConverter(path));\n                }\n                else {\n                    fetchURLs.push(pathPrefix + path + suffix);\n                }\n            }\n        }\n        if (this.weightUrlConverter) {\n            fetchURLs.push(...await Promise.all(urlPromises));\n        }\n        const buffers = await loadWeightsAsArrayBuffer(fetchURLs, {\n            requestInit: this.requestInit,\n            fetchFunc: this.fetch,\n            onProgress: this.onProgress\n        });\n        return [weightSpecs, concatenateArrayBuffers(buffers)];\n    }\n}\nHTTPRequest.URL_SCHEME_REGEX = /^https?:\\/\\//;\n/**\n * Extract the prefix and suffix of the url, where the prefix is the path before\n * the last file, and suffix is the search params after the last file.\n * ```\n * const url = 'http://tfhub.dev/model/1/tensorflowjs_model.pb?tfjs-format=file'\n * [prefix, suffix] = parseUrl(url)\n * // prefix = 'http://tfhub.dev/model/1/'\n * // suffix = '?tfjs-format=file'\n * ```\n * @param url the model url to be parsed.\n */\nexport function parseUrl(url) {\n    const lastSlash = url.lastIndexOf('/');\n    const lastSearchParam = url.lastIndexOf('?');\n    const prefix = url.substring(0, lastSlash);\n    const suffix = lastSearchParam > lastSlash ? url.substring(lastSearchParam) : '';\n    return [prefix + '/', suffix];\n}\nexport function isHTTPScheme(url) {\n    return url.match(HTTPRequest.URL_SCHEME_REGEX) != null;\n}\nexport const httpRouter = (url, loadOptions) => {\n    if (typeof fetch === 'undefined' &&\n        (loadOptions == null || loadOptions.fetchFunc == null)) {\n        // `http` uses `fetch` or `node-fetch`, if one wants to use it in\n        // an environment that is not the browser or node they have to setup a\n        // global fetch polyfill.\n        return null;\n    }\n    else {\n        let isHTTP = true;\n        if (Array.isArray(url)) {\n            isHTTP = url.every(urlItem => isHTTPScheme(urlItem));\n        }\n        else {\n            isHTTP = isHTTPScheme(url);\n        }\n        if (isHTTP) {\n            return http(url, loadOptions);\n        }\n    }\n    return null;\n};\nIORouterRegistry.registerSaveRouter(httpRouter);\nIORouterRegistry.registerLoadRouter(httpRouter);\n/**\n * Creates an IOHandler subtype that sends model artifacts to HTTP server.\n *\n * An HTTP request of the `multipart/form-data` mime type will be sent to the\n * `path` URL. The form data includes artifacts that represent the topology\n * and/or weights of the model. In the case of Keras-style `tf.Model`, two\n * blobs (files) exist in form-data:\n *   - A JSON file consisting of `modelTopology` and `weightsManifest`.\n *   - A binary weights file consisting of the concatenated weight values.\n * These files are in the same format as the one generated by\n * [tfjs_converter](https://js.tensorflow.org/tutorials/import-keras.html).\n *\n * The following code snippet exemplifies the client-side code that uses this\n * function:\n *\n * ```js\n * const model = tf.sequential();\n * model.add(\n *     tf.layers.dense({units: 1, inputShape: [100], activation: 'sigmoid'}));\n *\n * const saveResult = await model.save(tf.io.http(\n *     'http://model-server:5000/upload', {requestInit: {method: 'PUT'}}));\n * console.log(saveResult);\n * ```\n *\n * If the default `POST` method is to be used, without any custom parameters\n * such as headers, you can simply pass an HTTP or HTTPS URL to `model.save`:\n *\n * ```js\n * const saveResult = await model.save('http://model-server:5000/upload');\n * ```\n *\n * The following GitHub Gist\n * https://gist.github.com/dsmilkov/1b6046fd6132d7408d5257b0976f7864\n * implements a server based on [flask](https://github.com/pallets/flask) that\n * can receive the request. Upon receiving the model artifacts via the requst,\n * this particular server reconstitutes instances of [Keras\n * Models](https://keras.io/models/model/) in memory.\n *\n *\n * @param path A URL path to the model.\n *   Can be an absolute HTTP path (e.g.,\n *   'http://localhost:8000/model-upload)') or a relative path (e.g.,\n *   './model-upload').\n * @param requestInit Request configurations to be used when sending\n *    HTTP request to server using `fetch`. It can contain fields such as\n *    `method`, `credentials`, `headers`, `mode`, etc. See\n *    https://developer.mozilla.org/en-US/docs/Web/API/Request/Request\n *    for more information. `requestInit` must not have a body, because the\n * body will be set by TensorFlow.js. File blobs representing the model\n * topology (filename: 'model.json') and the weights of the model (filename:\n * 'model.weights.bin') will be appended to the body. If `requestInit` has a\n * `body`, an Error will be thrown.\n * @param loadOptions Optional configuration for the loading. It includes the\n *   following fields:\n *   - weightPathPrefix Optional, this specifies the path prefix for weight\n *     files, by default this is calculated from the path param.\n *   - fetchFunc Optional, custom `fetch` function. E.g., in Node.js,\n *     the `fetch` from node-fetch can be used here.\n *   - onProgress Optional, progress callback function, fired periodically\n *     before the load is completed.\n * @returns An instance of `IOHandler`.\n *\n * @doc {\n *   heading: 'Models',\n *   subheading: 'Loading',\n *   namespace: 'io',\n *   ignoreCI: true\n * }\n */\nexport function http(path, loadOptions) {\n    return new HTTPRequest(path, loadOptions);\n}\n/**\n * Deprecated. Use `tf.io.http`.\n * @param path\n * @param loadOptions\n */\nexport function browserHTTPRequest(path, loadOptions) {\n    return http(path, loadOptions);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvaW8vaHR0cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7OztHQUlHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRW5DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDL0IsT0FBTyxFQUFDLHVCQUF1QixFQUFFLHdCQUF3QixFQUFFLDRCQUE0QixFQUFFLDZCQUE2QixFQUFFLGNBQWMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMxSixPQUFPLEVBQVcsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUxRCxNQUFNLHNCQUFzQixHQUFHLDBCQUEwQixDQUFDO0FBQzFELE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDO0FBQ3JDLE1BQU0sT0FBTyxXQUFXO0lBY3RCLFlBQVksSUFBWSxFQUFFLFdBQXlCO1FBUDFDLG1CQUFjLEdBQUcsTUFBTSxDQUFDO1FBUS9CLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtZQUN2QixXQUFXLEdBQUcsRUFBRSxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQztRQUNyRCxJQUFJLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxVQUFVLENBQUM7UUFDekMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFdBQVcsQ0FBQyxrQkFBa0IsQ0FBQztRQUV6RCxJQUFJLFdBQVcsQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ2pDLE1BQU0sQ0FDRixPQUFPLFdBQVcsQ0FBQyxTQUFTLEtBQUssVUFBVSxFQUMzQyxHQUFHLEVBQUUsQ0FBQyxxREFBcUQ7Z0JBQ3ZELGVB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b2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJT0hhbmRsZXIgaW1wbGVtZW50YXRpb25zIGJhc2VkIG9uIEhUVFAgcmVxdWVzdHMgaW4gdGhlIHdlYiBicm93c2VyLlxuICpcbiAqIFVzZXMgW2BmZXRjaGBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpLlxuICovXG5cbmltcG9ydCB7ZW52fSBmcm9tICcuLi9lbnZpcm9ubWVudCc7XG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7Y29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0TW9kZWxKU09ORm9yTW9kZWxBcnRpZmFjdHMsIGdldFdlaWdodFNwZWNzfSBmcm9tICcuL2lvX3V0aWxzJztcbmltcG9ydCB7SU9Sb3V0ZXIsIElPUm91dGVyUmVnaXN0cnl9IGZyb20gJy4vcm91dGVyX3JlZ2lzdHJ5JztcbmltcG9ydCB7SU9IYW5kbGVyLCBMb2FkT3B0aW9ucywgTW9kZWxBcnRpZmFjdHMsIE1vZGVsSlNPTiwgT25Qcm9ncmVzc0NhbGxiYWNrLCBTYXZlUmVzdWx0LCBXZWlnaHRzTWFuaWZlc3RDb25maWcsIFdlaWdodHNNYW5pZmVzdEVudHJ5fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7bG9hZFdlaWdodHNBc0FycmF5QnVmZmVyfSBmcm9tICcuL3dlaWdodHNfbG9hZGVyJztcblxuY29uc3QgT0NURVRfU1RSRUFNX01JTUVfVFlQRSA9ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuY29uc3QgSlNPTl9UWVBFID0gJ2FwcGxpY2F0aW9uL2pzb24nO1xuZXhwb3J0IGNsYXNzIEhUVFBSZXF1ZXN0IGltcGxlbWVudHMgSU9IYW5kbGVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlcXVlc3RJbml0OiBSZXF1ZXN0SW5pdDtcblxuICBwcml2YXRlIHJlYWRvbmx5IGZldGNoOiBGdW5jdGlvbjtcbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRVcmxDb252ZXJ0ZXI6ICh3ZWlnaHROYW1lOiBzdHJpbmcpID0+IFByb21pc2U8c3RyaW5nPjtcblxuICByZWFkb25seSBERUZBVUxUX01FVEhPRCA9ICdQT1NUJztcblxuICBzdGF0aWMgcmVhZG9ubHkgVVJMX1NDSEVNRV9SRUdFWCA9IC9eaHR0cHM/OlxcL1xcLy87XG5cbiAgcHJpdmF0ZSByZWFkb25seSB3ZWlnaHRQYXRoUHJlZml4OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25Qcm9ncmVzczogT25Qcm9ncmVzc0NhbGxiYWNrO1xuXG4gIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZywgbG9hZE9wdGlvbnM/OiBMb2FkT3B0aW9ucykge1xuICAgIGlmIChsb2FkT3B0aW9ucyA9PSBudWxsKSB7XG4gICAgICBsb2FkT3B0aW9ucyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLndlaWdodFBhdGhQcmVmaXggPSBsb2FkT3B0aW9ucy53ZWlnaHRQYXRoUHJlZml4O1xuICAgIHRoaXMub25Qcm9ncmVzcyA9IGxvYWRPcHRpb25zLm9uUHJvZ3Jlc3M7XG4gICAgdGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIgPSBsb2FkT3B0aW9ucy53ZWlnaHRVcmxDb252ZXJ0ZXI7XG5cbiAgICBpZiAobG9hZE9wdGlvbnMuZmV0Y2hGdW5jICE9IG51bGwpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgICB0eXBlb2YgbG9hZE9wdGlvbnMuZmV0Y2hGdW5jID09PSAnZnVuY3Rpb24nLFxuICAgICAgICAgICgpID0+ICdNdXN0IHBhc3MgYSBmdW5jdGlvbiB0aGF0IG1hdGNoZXMgdGhlIHNpZ25hdHVyZSBvZiAnICtcbiAgICAgICAgICAgICAgJ2BmZXRjaGAgKHNlZSAnICtcbiAgICAgICAgICAgICAgJ2h0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9GZXRjaF9BUEkpJyk7XG4gICAgICB0aGlzLmZldGNoID0gbG9hZE9wdGlvbnMuZmV0Y2hGdW5jO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmZldGNoID0gZW52KCkucGxhdGZvcm0uZmV0Y2g7XG4gICAgfVxuXG4gICAgYXNzZXJ0KFxuICAgICAgICBwYXRoICE9IG51bGwgJiYgcGF0aC5sZW5ndGggPiAwLFxuICAgICAgICAoKSA9PiAnVVJMIHBhdGggZm9yIGh0dHAgbXVzdCBub3QgYmUgbnVsbCwgdW5kZWZpbmVkIG9yICcgK1xuICAgICAgICAgICAgJ2VtcHR5LicpO1xuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgICBwYXRoLmxlbmd0aCA9PT0gMixcbiAgICAgICAgICAoKSA9PiAnVVJMIHBhdGhzIGZvciBodHRwIG11c3QgaGF2ZSBhIGxlbmd0aCBvZiAyLCAnICtcbiAgICAgICAgICAgICAgYChhY3R1YWwgbGVuZ3RoIGlzICR7cGF0aC5sZW5ndGh9KS5gKTtcbiAgICB9XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcblxuICAgIGlmIChsb2FkT3B0aW9ucy5yZXF1ZXN0SW5pdCAhPSBudWxsICYmXG4gICAgICAgIGxvYWRPcHRpb25zLnJlcXVlc3RJbml0LmJvZHkgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdyZXF1ZXN0SW5pdCBpcyBleHBlY3RlZCB0byBoYXZlIG5vIHByZS1leGlzdGluZyBib2R5LCBidXQgaGFzIG9uZS4nKTtcbiAgICB9XG4gICAgdGhpcy5yZXF1ZXN0SW5pdCA9IGxvYWRPcHRpb25zLnJlcXVlc3RJbml0IHx8IHt9O1xuICB9XG5cbiAgYXN5bmMgc2F2ZShtb2RlbEFydGlmYWN0czogTW9kZWxBcnRpZmFjdHMpOiBQcm9taXNlPFNhdmVSZXN1bHQ+IHtcbiAgICBpZiAobW9kZWxBcnRpZmFjdHMubW9kZWxUb3BvbG9neSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Jyb3dzZXJIVFRQUmVxdWVzdC5zYXZlKCkgZG9lcyBub3Qgc3VwcG9ydCBzYXZpbmcgbW9kZWwgdG9wb2xvZ3kgJyArXG4gICAgICAgICAgJ2luIGJpbmFyeSBmb3JtYXRzIHlldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbml0ID0gT2JqZWN0LmFzc2lnbih7bWV0aG9kOiB0aGlzLkRFRkFVTFRfTUVUSE9EfSwgdGhpcy5yZXF1ZXN0SW5pdCk7XG4gICAgaW5pdC5ib2R5ID0gbmV3IEZvcm1EYXRhKCk7XG5cbiAgICBjb25zdCB3ZWlnaHRzTWFuaWZlc3Q6IFdlaWdodHNNYW5pZmVzdENvbmZpZyA9IFt7XG4gICAgICBwYXRoczogWycuL21vZGVsLndlaWdodHMuYmluJ10sXG4gICAgICB3ZWlnaHRzOiBtb2RlbEFydGlmYWN0cy53ZWlnaHRTcGVjcyxcbiAgICB9XTtcbiAgICBjb25zdCBtb2RlbFRvcG9sb2d5QW5kV2VpZ2h0TWFuaWZlc3Q6IE1vZGVsSlNPTiA9XG4gICAgICAgIGdldE1vZGVsSlNPTkZvck1vZGVsQXJ0aWZhY3RzKG1vZGVsQXJ0aWZhY3RzLCB3ZWlnaHRzTWFuaWZlc3QpO1xuXG4gICAgaW5pdC5ib2R5LmFwcGVuZChcbiAgICAgICAgJ21vZGVsLmpzb24nLFxuICAgICAgICBuZXcgQmxvYihcbiAgICAgICAgICAgIFtKU09OLnN0cmluZ2lmeShtb2RlbFRvcG9sb2d5QW5kV2VpZ2h0TWFuaWZlc3QpXSxcbiAgICAgICAgICAgIHt0eXBlOiBKU09OX1RZUEV9KSxcbiAgICAgICAgJ21vZGVsLmpzb24nKTtcblxuICAgIGlmIChtb2RlbEFydGlmYWN0cy53ZWlnaHREYXRhICE9IG51bGwpIHtcbiAgICAgIGluaXQuYm9keS5hcHBlbmQoXG4gICAgICAgICAgJ21vZGVsLndlaWdodHMuYmluJyxcbiAgICAgICAgICBuZXcgQmxvYihbbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YV0sIHt0eXBlOiBPQ1RFVF9TVFJFQU1fTUlNRV9UWVBFfSksXG4gICAgICAgICAgJ21vZGVsLndlaWdodHMuYmluJyk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmZldGNoKHRoaXMucGF0aCwgaW5pdCk7XG5cbiAgICBpZiAocmVzcG9uc2Uub2spIHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIG1vZGVsQXJ0aWZhY3RzSW5mbzogZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTihtb2RlbEFydGlmYWN0cyksXG4gICAgICAgIHJlc3BvbnNlczogW3Jlc3BvbnNlXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQnJvd3NlckhUVFBSZXF1ZXN0LnNhdmUoKSBmYWlsZWQgZHVlIHRvIEhUVFAgcmVzcG9uc2Ugc3RhdHVzIGAgK1xuICAgICAgICAgIGAke3Jlc3BvbnNlLnN0YXR1c30uYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbW9kZWwgYXJ0aWZhY3RzIHZpYSBIVFRQIHJlcXVlc3QocykuXG4gICAqXG4gICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiB0byBgdGYuaW8uaHR0cGAgZm9yIGRldGFpbHMgb24gdGhlIHNhdmVkXG4gICAqIGFydGlmYWN0cy5cbiAgICpcbiAgICogQHJldHVybnMgVGhlIGxvYWRlZCBtb2RlbCBhcnRpZmFjdHMgKGlmIGxvYWRpbmcgc3VjY2VlZHMpLlxuICAgKi9cbiAgYXN5bmMgbG9hZCgpOiBQcm9taXNlPE1vZGVsQXJ0aWZhY3RzPiB7XG4gICAgY29uc3QgbW9kZWxDb25maWdSZXF1ZXN0ID0gYXdhaXQgdGhpcy5mZXRjaCh0aGlzLnBhdGgsIHRoaXMucmVxdWVzdEluaXQpO1xuXG4gICAgaWYgKCFtb2RlbENvbmZpZ1JlcXVlc3Qub2spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgUmVxdWVzdCB0byAke3RoaXMucGF0aH0gZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgYCArXG4gICAgICAgICAgYCR7bW9kZWxDb25maWdSZXF1ZXN0LnN0YXR1c30uIFBsZWFzZSB2ZXJpZnkgdGhpcyBVUkwgcG9pbnRzIHRvIGAgK1xuICAgICAgICAgIGB0aGUgbW9kZWwgSlNPTiBvZiB0aGUgbW9kZWwgdG8gbG9hZC5gKTtcbiAgICB9XG4gICAgbGV0IG1vZGVsSlNPTjogTW9kZWxKU09OO1xuICAgIHRyeSB7XG4gICAgICBtb2RlbEpTT04gPSBhd2FpdCBtb2RlbENvbmZpZ1JlcXVlc3QuanNvbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGxldCBtZXNzYWdlID0gYEZhaWxlZCB0byBwYXJzZSBtb2RlbCBKU09OIG9mIHJlc3BvbnNlIGZyb20gJHt0aGlzLnBhdGh9LmA7XG4gICAgICAvLyBUT0RPKG5zdGhvcmF0KTogUmVtb3ZlIHRoaXMgYWZ0ZXIgc29tZSB0aW1lIHdoZW4gd2UncmUgY29tZm9ydGFibGUgdGhhdFxuICAgICAgLy8gLnBiIGZpbGVzIGFyZSBtb3N0bHkgZ29uZS5cbiAgICAgIGlmICh0aGlzLnBhdGguZW5kc1dpdGgoJy5wYicpKSB7XG4gICAgICAgIG1lc3NhZ2UgKz0gJyBZb3VyIHBhdGggY29udGFpbnMgYSAucGIgZmlsZSBleHRlbnNpb24uICcgK1xuICAgICAgICAgICAgJ1N1cHBvcnQgZm9yIC5wYiBtb2RlbHMgaGF2ZSBiZWVuIHJlbW92ZWQgaW4gVGVuc29yRmxvdy5qcyAxLjAgJyArXG4gICAgICAgICAgICAnaW4gZmF2b3Igb2YgLmpzb24gbW9kZWxzLiBZb3UgY2FuIHJlLWNvbnZlcnQgeW91ciBQeXRob24gJyArXG4gICAgICAgICAgICAnVGVuc29yRmxvdyBtb2RlbCB1c2luZyB0aGUgVGVuc29yRmxvdy5qcyAxLjAgY29udmVyc2lvbiBzY3JpcHRzICcgK1xuICAgICAgICAgICAgJ29yIHlvdSBjYW4gY29udmVydCB5b3VyLnBiIG1vZGVscyB3aXRoIHRoZSBcXCdwYjJqc29uXFwnJyArXG4gICAgICAgICAgICAnTlBNIHNjcmlwdCBpbiB0aGUgdGVuc29yZmxvdy90ZmpzLWNvbnZlcnRlciByZXBvc2l0b3J5Lic7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtZXNzYWdlICs9ICcgUGxlYXNlIG1ha2Ugc3VyZSB0aGUgc2VydmVyIGlzIHNlcnZpbmcgdmFsaWQgJyArXG4gICAgICAgICAgICAnSlNPTiBmb3IgdGhpcyByZXF1ZXN0Lic7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IobWVzc2FnZSk7XG4gICAgfVxuXG4gICAgLy8gV2UgZG8gbm90IGFsbG93IGJvdGggbW9kZWxUb3BvbG9neSBhbmQgd2VpZ2h0c01hbmlmZXN0IHRvIGJlIG1pc3NpbmcuXG4gICAgY29uc3QgbW9kZWxUb3BvbG9neSA9IG1vZGVsSlNPTi5tb2RlbFRvcG9sb2d5O1xuICAgIGNvbnN0IHdlaWdodHNNYW5pZmVzdCA9IG1vZGVsSlNPTi53ZWlnaHRzTWFuaWZlc3Q7XG4gICAgaWYgKG1vZGVsVG9wb2xvZ3kgPT0gbnVsbCAmJiB3ZWlnaHRzTWFuaWZlc3QgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgSlNPTiBmcm9tIEhUVFAgcGF0aCAke3RoaXMucGF0aH0gY29udGFpbnMgbmVpdGhlciBtb2RlbCBgICtcbiAgICAgICAgICBgdG9wb2xvZ3kgb3IgbWFuaWZlc3QgZm9yIHdlaWdodHMuYCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTihcbiAgICAgICAgbW9kZWxKU09OLCAod2VpZ2h0c01hbmlmZXN0KSA9PiB0aGlzLmxvYWRXZWlnaHRzKHdlaWdodHNNYW5pZmVzdCkpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBsb2FkV2VpZ2h0cyh3ZWlnaHRzTWFuaWZlc3Q6IFdlaWdodHNNYW5pZmVzdENvbmZpZyk6XG4gICAgICBQcm9taXNlPFtXZWlnaHRzTWFuaWZlc3RFbnRyeVtdLCBBcnJheUJ1ZmZlcl0+IHtcbiAgICBjb25zdCB3ZWlnaHRQYXRoID0gQXJyYXkuaXNBcnJheSh0aGlzLnBhdGgpID8gdGhpcy5wYXRoWzFdIDogdGhpcy5wYXRoO1xuICAgIGNvbnN0IFtwcmVmaXgsIHN1ZmZpeF0gPSBwYXJzZVVybCh3ZWlnaHRQYXRoKTtcbiAgICBjb25zdCBwYXRoUHJlZml4ID0gdGhpcy53ZWlnaHRQYXRoUHJlZml4IHx8IHByZWZpeDtcblxuICAgIGNvbnN0IHdlaWdodFNwZWNzID0gZ2V0V2VpZ2h0U3BlY3Mod2VpZ2h0c01hbmlmZXN0KTtcblxuICAgIGNvbnN0IGZldGNoVVJMczogc3RyaW5nW10gPSBbXTtcbiAgICBjb25zdCB1cmxQcm9taXNlczogQXJyYXk8UHJvbWlzZTxzdHJpbmc+PiA9IFtdO1xuICAgIGZvciAoY29uc3Qgd2VpZ2h0c0dyb3VwIG9mIHdlaWdodHNNYW5pZmVzdCkge1xuICAgICAgZm9yIChjb25zdCBwYXRoIG9mIHdlaWdodHNHcm91cC5wYXRocykge1xuICAgICAgICBpZiAodGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIgIT0gbnVsbCkge1xuICAgICAgICAgIHVybFByb21pc2VzLnB1c2godGhpcy53ZWlnaHRVcmxDb252ZXJ0ZXIocGF0aCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGZldGNoVVJMcy5wdXNoKHBhdGhQcmVmaXggKyBwYXRoICsgc3VmZml4KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLndlaWdodFVybENvbnZlcnRlcikge1xuICAgICAgZmV0Y2hVUkxzLnB1c2goLi4uYXdhaXQgUHJvbWlzZS5hbGwodXJsUHJvbWlzZXMpKTtcbiAgICB9XG5cbiAgICBjb25zdCBidWZmZXJzID0gYXdhaXQgbG9hZFdlaWdodHNBc0FycmF5QnVmZmVyKGZldGNoVVJMcywge1xuICAgICAgcmVxdWVzdEluaXQ6IHRoaXMucmVxdWVzdEluaXQsXG4gICAgICBmZXRjaEZ1bmM6IHRoaXMuZmV0Y2gsXG4gICAgICBvblByb2dyZXNzOiB0aGlzLm9uUHJvZ3Jlc3NcbiAgICB9KTtcbiAgICByZXR1cm4gW3dlaWdodFNwZWNzLCBjb25jYXRlbmF0ZUFycmF5QnVmZmVycyhidWZmZXJzKV07XG4gIH1cbn1cblxuLyoqXG4gKiBFeHRyYWN0IHRoZSBwcmVmaXggYW5kIHN1ZmZpeCBvZiB0aGUgdXJsLCB3aGVyZSB0aGUgcHJlZml4IGlzIHRoZSBwYXRoIGJlZm9yZVxuICogdGhlIGxhc3QgZmlsZSwgYW5kIHN1ZmZpeCBpcyB0aGUgc2VhcmNoIHBhcmFtcyBhZnRlciB0aGUgbGFzdCBmaWxlLlxuICogYGBgXG4gKiBjb25zdCB1cmwgPSAnaHR0cDovL3RmaHViLmRldi9tb2RlbC8xL3RlbnNvcmZsb3dqc19tb2RlbC5wYj90ZmpzLWZvcm1hdD1maWxlJ1xuICogW3ByZWZpeCwgc3VmZml4XSA9IHBhcnNlVXJsKHVybClcbiAqIC8vIHByZWZpeCA9ICdodHRwOi8vdGZodWIuZGV2L21vZGVsLzEvJ1xuICogLy8gc3VmZml4ID0gJz90ZmpzLWZvcm1hdD1maWxlJ1xuICogYGBgXG4gKiBAcGFyYW0gdXJsIHRoZSBtb2RlbCB1cmwgdG8gYmUgcGFyc2VkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VVcmwodXJsOiBzdHJpbmcpOiBbc3RyaW5nLCBzdHJpbmddIHtcbiAgY29uc3QgbGFzdFNsYXNoID0gdXJsLmxhc3RJbmRleE9mKCcvJyk7XG4gIGNvbnN0IGxhc3RTZWFyY2hQYXJhbSA9IHVybC5sYXN0SW5kZXhPZignPycpO1xuICBjb25zdCBwcmVmaXggPSB1cmwuc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCk7XG4gIGNvbnN0IHN1ZmZpeCA9XG4gICAgICBsYXN0U2VhcmNoUGFyYW0gPiBsYXN0U2xhc2ggPyB1cmwuc3Vic3RyaW5nKGxhc3RTZWFyY2hQYXJhbSkgOiAnJztcbiAgcmV0dXJuIFtwcmVmaXggKyAnLycsIHN1ZmZpeF07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0hUVFBTY2hlbWUodXJsOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgcmV0dXJuIHVybC5tYXRjaChIVFRQUmVxdWVzdC5VUkxfU0NIRU1FX1JFR0VYKSAhPSBudWxsO1xufVxuXG5leHBvcnQgY29uc3QgaHR0cFJvdXRlcjogSU9Sb3V0ZXIgPVxuICAgICh1cmw6IHN0cmluZywgbG9hZE9wdGlvbnM/OiBMb2FkT3B0aW9ucykgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBmZXRjaCA9PT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAobG9hZE9wdGlvbnMgPT0gbnVsbCB8fCBsb2FkT3B0aW9ucy5mZXRjaEZ1bmMgPT0gbnVsbCkpIHtcbiAgICAgICAgLy8gYGh0dHBgIHVzZXMgYGZldGNoYCBvciBgbm9kZS1mZXRjaGAsIGlmIG9uZSB3YW50cyB0byB1c2UgaXQgaW5cbiAgICAgICAgLy8gYW4gZW52aXJvbm1lbnQgdGhhdCBpcyBub3QgdGhlIGJyb3dzZXIgb3Igbm9kZSB0aGV5IGhhdmUgdG8gc2V0dXAgYVxuICAgICAgICAvLyBnbG9iYWwgZmV0Y2ggcG9seWZpbGwuXG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbGV0IGlzSFRUUCA9IHRydWU7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVybCkpIHtcbiAgICAgICAgICBpc0hUVFAgPSB1cmwuZXZlcnkodXJsSXRlbSA9PiBpc0hUVFBTY2hlbWUodXJsSXRlbSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlzSFRUUCA9IGlzSFRUUFNjaGVtZSh1cmwpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0hUVFApIHtcbiAgICAgICAgICByZXR1cm4gaHR0cCh1cmwsIGxvYWRPcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfTtcbklPUm91dGVyUmVnaXN0cnkucmVnaXN0ZXJTYXZlUm91dGVyKGh0dHBSb3V0ZXIpO1xuSU9Sb3V0ZXJSZWdpc3RyeS5yZWdpc3RlckxvYWRSb3V0ZXIoaHR0cFJvdXRlcik7XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXIgc3VidHlwZSB0aGF0IHNlbmRzIG1vZGVsIGFydGlmYWN0cyB0byBIVFRQIHNlcnZlci5cbiAqXG4gKiBBbiBIVFRQIHJlcXVlc3Qgb2YgdGhlIGBtdWx0aXBhcnQvZm9ybS1kYXRhYCBtaW1lIHR5cGUgd2lsbCBiZSBzZW50IHRvIHRoZVxuICogYHBhdGhgIFVSTC4gVGhlIGZvcm0gZGF0YSBpbmNsdWRlcyBhcnRpZmFjdHMgdGhhdCByZXByZXNlbnQgdGhlIHRvcG9sb2d5XG4gKiBhbmQvb3Igd2VpZ2h0cyBvZiB0aGUgbW9kZWwuIEluIHRoZSBjYXNlIG9mIEtlcmFzLXN0eWxlIGB0Zi5Nb2RlbGAsIHR3b1xuICogYmxvYnMgKGZpbGVzKSBleGlzdCBpbiBmb3JtLWRhdGE6XG4gKiAgIC0gQSBKU09OIGZpbGUgY29uc2lzdGluZyBvZiBgbW9kZWxUb3BvbG9neWAgYW5kIGB3ZWlnaHRzTWFuaWZlc3RgLlxuICogICAtIEEgYmluYXJ5IHdlaWdodHMgZmlsZSBjb25zaXN0aW5nIG9mIHRoZSBjb25jYXRlbmF0ZWQgd2VpZ2h0IHZhbHVlcy5cbiAqIFRoZXNlIGZpbGVzIGFyZSBpbiB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG9uZSBnZW5lcmF0ZWQgYnlcbiAqIFt0ZmpzX2NvbnZlcnRlcl0oaHR0cHM6Ly9qcy50ZW5zb3JmbG93Lm9yZy90dXRvcmlhbHMvaW1wb3J0LWtlcmFzLmh0bWwpLlxuICpcbiAqIFRoZSBmb2xsb3dpbmcgY29kZSBzbmlwcGV0IGV4ZW1wbGlmaWVzIHRoZSBjbGllbnQtc2lkZSBjb2RlIHRoYXQgdXNlcyB0aGlzXG4gKiBmdW5jdGlvbjpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiBtb2RlbC5hZGQoXG4gKiAgICAgdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwMF0sIGFjdGl2YXRpb246ICdzaWdtb2lkJ30pKTtcbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gYXdhaXQgbW9kZWwuc2F2ZSh0Zi5pby5odHRwKFxuICogICAgICdodHRwOi8vbW9kZWwtc2VydmVyOjUwMDAvdXBsb2FkJywge3JlcXVlc3RJbml0OiB7bWV0aG9kOiAnUFVUJ319KSk7XG4gKiBjb25zb2xlLmxvZyhzYXZlUmVzdWx0KTtcbiAqIGBgYFxuICpcbiAqIElmIHRoZSBkZWZhdWx0IGBQT1NUYCBtZXRob2QgaXMgdG8gYmUgdXNlZCwgd2l0aG91dCBhbnkgY3VzdG9tIHBhcmFtZXRlcnNcbiAqIHN1Y2ggYXMgaGVhZGVycywgeW91IGNhbiBzaW1wbHkgcGFzcyBhbiBIVFRQIG9yIEhUVFBTIFVSTCB0byBgbW9kZWwuc2F2ZWA6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBhd2FpdCBtb2RlbC5zYXZlKCdodHRwOi8vbW9kZWwtc2VydmVyOjUwMDAvdXBsb2FkJyk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZm9sbG93aW5nIEdpdEh1YiBHaXN0XG4gKiBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9kc21pbGtvdi8xYjYwNDZmZDYxMzJkNzQwOGQ1MjU3YjA5NzZmNzg2NFxuICogaW1wbGVtZW50cyBhIHNlcnZlciBiYXNlZCBvbiBbZmxhc2tdKGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxsZXRzL2ZsYXNrKSB0aGF0XG4gKiBjYW4gcmVjZWl2ZSB0aGUgcmVxdWVzdC4gVXBvbiByZWNlaXZpbmcgdGhlIG1vZGVsIGFydGlmYWN0cyB2aWEgdGhlIHJlcXVzdCxcbiAqIHRoaXMgcGFydGljdWxhciBzZXJ2ZXIgcmVjb25zdGl0dXRlcyBpbnN0YW5jZXMgb2YgW0tlcmFzXG4gKiBNb2RlbHNdKGh0dHBzOi8va2VyYXMuaW8vbW9kZWxzL21vZGVsLykgaW4gbWVtb3J5LlxuICpcbiAqXG4gKiBAcGFyYW0gcGF0aCBBIFVSTCBwYXRoIHRvIHRoZSBtb2RlbC5cbiAqICAgQ2FuIGJlIGFuIGFic29sdXRlIEhUVFAgcGF0aCAoZS5nLixcbiAqICAgJ2h0dHA6Ly9sb2NhbGhvc3Q6ODAwMC9tb2RlbC11cGxvYWQpJykgb3IgYSByZWxhdGl2ZSBwYXRoIChlLmcuLFxuICogICAnLi9tb2RlbC11cGxvYWQnKS5cbiAqIEBwYXJhbSByZXF1ZXN0SW5pdCBSZXF1ZXN0IGNvbmZpZ3VyYXRpb25zIHRvIGJlIHVzZWQgd2hlbiBzZW5kaW5nXG4gKiAgICBIVFRQIHJlcXVlc3QgdG8gc2VydmVyIHVzaW5nIGBmZXRjaGAuIEl0IGNhbiBjb250YWluIGZpZWxkcyBzdWNoIGFzXG4gKiAgICBgbWV0aG9kYCwgYGNyZWRlbnRpYWxzYCwgYGhlYWRlcnNgLCBgbW9kZWAsIGV0Yy4gU2VlXG4gKiAgICBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvUmVxdWVzdC9SZXF1ZXN0XG4gKiAgICBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gYHJlcXVlc3RJbml0YCBtdXN0IG5vdCBoYXZlIGEgYm9keSwgYmVjYXVzZSB0aGVcbiAqIGJvZHkgd2lsbCBiZSBzZXQgYnkgVGVuc29yRmxvdy5qcy4gRmlsZSBibG9icyByZXByZXNlbnRpbmcgdGhlIG1vZGVsXG4gKiB0b3BvbG9neSAoZmlsZW5hbWU6ICdtb2RlbC5qc29uJykgYW5kIHRoZSB3ZWlnaHRzIG9mIHRoZSBtb2RlbCAoZmlsZW5hbWU6XG4gKiAnbW9kZWwud2VpZ2h0cy5iaW4nKSB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBib2R5LiBJZiBgcmVxdWVzdEluaXRgIGhhcyBhXG4gKiBgYm9keWAsIGFuIEVycm9yIHdpbGwgYmUgdGhyb3duLlxuICogQHBhcmFtIGxvYWRPcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBsb2FkaW5nLiBJdCBpbmNsdWRlcyB0aGVcbiAqICAgZm9sbG93aW5nIGZpZWxkczpcbiAqICAgLSB3ZWlnaHRQYXRoUHJlZml4IE9wdGlvbmFsLCB0aGlzIHNwZWNpZmllcyB0aGUgcGF0aCBwcmVmaXggZm9yIHdlaWdodFxuICogICAgIGZpbGVzLCBieSBkZWZhdWx0IHRoaXMgaXMgY2FsY3VsYXRlZCBmcm9tIHRoZSBwYXRoIHBhcmFtLlxuICogICAtIGZldGNoRnVuYyBPcHRpb25hbCwgY3VzdG9tIGBmZXRjaGAgZnVuY3Rpb24uIEUuZy4sIGluIE5vZGUuanMsXG4gKiAgICAgdGhlIGBmZXRjaGAgZnJvbSBub2RlLWZldGNoIGNhbiBiZSB1c2VkIGhlcmUuXG4gKiAgIC0gb25Qcm9ncmVzcyBPcHRpb25hbCwgcHJvZ3Jlc3MgY2FsbGJhY2sgZnVuY3Rpb24sIGZpcmVkIHBlcmlvZGljYWxseVxuICogICAgIGJlZm9yZSB0aGUgbG9hZCBpcyBjb21wbGV0ZWQuXG4gKiBAcmV0dXJucyBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYC5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ01vZGVscycsXG4gKiAgIHN1YmhlYWRpbmc6ICdMb2FkaW5nJyxcbiAqICAgbmFtZXNwYWNlOiAnaW8nLFxuICogICBpZ25vcmVDSTogdHJ1ZVxuICogfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaHR0cChwYXRoOiBzdHJpbmcsIGxvYWRPcHRpb25zPzogTG9hZE9wdGlvbnMpOiBJT0hhbmRsZXIge1xuICByZXR1cm4gbmV3IEhUVFBSZXF1ZXN0KHBhdGgsIGxvYWRPcHRpb25zKTtcbn1cblxuLyoqXG4gKiBEZXByZWNhdGVkLiBVc2UgYHRmLmlvLmh0dHBgLlxuICogQHBhcmFtIHBhdGhcbiAqIEBwYXJhbSBsb2FkT3B0aW9uc1xuICovXG5leHBvcnQgZnVuY3Rpb24gYnJvd3NlckhUVFBSZXF1ZXN0KFxuICAgIHBhdGg6IHN0cmluZywgbG9hZE9wdGlvbnM/OiBMb2FkT3B0aW9ucyk6IElPSGFuZGxlciB7XG4gIHJldHVybiBodHRwKHBhdGgsIGxvYWRPcHRpb25zKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nclass PassthroughLoader {\n    constructor(modelArtifacts) {\n        this.modelArtifacts = modelArtifacts;\n    }\n    load() {\n        return this.modelArtifacts;\n    }\n}\nclass PassthroughSaver {\n    constructor(saveHandler) {\n        this.saveHandler = saveHandler;\n    }\n    save(modelArtifacts) {\n        return this.saveHandler(modelArtifacts);\n    }\n}\nclass PassthroughAsync {\n    constructor(handler) {\n        if (handler.load) {\n            this.load = () => Promise.resolve(handler.load());\n        }\n        if (handler.save) {\n            this.save = (modelArtifacts) => Promise.resolve(handler.save(modelArtifacts));\n        }\n    }\n}\n/**\n * Creates an IOHandler that loads model artifacts from memory.\n *\n * When used in conjunction with `tf.loadLayersModel`, an instance of\n * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts.\n *\n * ```js\n * const model = await tf.loadLayersModel(tf.io.fromMemory(\n *     modelTopology, weightSpecs, weightData));\n * ```\n *\n * @param modelArtifacts a object containing model topology (i.e., parsed from\n *   the JSON format).\n * @param weightSpecs An array of `WeightsManifestEntry` objects describing the\n *   names, shapes, types, and quantization of the weight data. Optional.\n * @param weightData A single `ArrayBuffer` containing the weight data,\n *   concatenated in the order described by the weightSpecs. Optional.\n * @param trainingConfig Model training configuration. Optional.\n *\n * @returns A passthrough `IOHandler` that simply loads the provided data.\n */\nexport function fromMemory(modelArtifacts, weightSpecs, weightData, trainingConfig) {\n    const args = arguments;\n    return new PassthroughAsync(fromMemorySync(...args));\n}\n/**\n * Creates an IOHandler that loads model artifacts from memory.\n *\n * When used in conjunction with `tf.loadLayersModel`, an instance of\n * `tf.LayersModel` (Keras-style) can be constructed from the loaded artifacts.\n *\n * ```js\n * const model = await tf.loadLayersModel(tf.io.fromMemory(\n *     modelTopology, weightSpecs, weightData));\n * ```\n *\n * @param modelArtifacts a object containing model topology (i.e., parsed from\n *   the JSON format).\n * @param weightSpecs An array of `WeightsManifestEntry` objects describing the\n *   names, shapes, types, and quantization of the weight data. Optional.\n * @param weightData A single `ArrayBuffer` containing the weight data,\n *   concatenated in the order described by the weightSpecs. Optional.\n * @param trainingConfig Model training configuration. Optional.\n *\n * @returns A passthrough `IOHandlerSync` that simply loads the provided data.\n */\nexport function fromMemorySync(modelArtifacts, weightSpecs, weightData, trainingConfig) {\n    if (arguments.length === 1) {\n        const isModelArtifacts = modelArtifacts.modelTopology != null ||\n            modelArtifacts.weightSpecs != null;\n        if (isModelArtifacts) {\n            return new PassthroughLoader(modelArtifacts);\n        }\n        else {\n            // Legacy support: with only modelTopology.\n            // TODO(cais): Remove this deprecated API.\n            console.warn('Please call tf.io.fromMemory() with only one argument. ' +\n                'The argument should be of type ModelArtifacts. ' +\n                'The multi-argument signature of tf.io.fromMemory() has been ' +\n                'deprecated and will be removed in a future release.');\n            return new PassthroughLoader({ modelTopology: modelArtifacts });\n        }\n    }\n    else {\n        // Legacy support.\n        // TODO(cais): Remove this deprecated API.\n        console.warn('Please call tf.io.fromMemory() with only one argument. ' +\n            'The argument should be of type ModelArtifacts. ' +\n            'The multi-argument signature of tf.io.fromMemory() has been ' +\n            'deprecated and will be removed in a future release.');\n        return new PassthroughLoader({\n            modelTopology: modelArtifacts,\n            weightSpecs,\n            weightData,\n            trainingConfig\n        });\n    }\n}\n/**\n * Creates an IOHandler that passes saved model artifacts to a callback.\n *\n * ```js\n * function handleSave(artifacts) {\n *   // ... do something with the artifacts ...\n *   return {modelArtifactsInfo: {...}, ...};\n * }\n *\n * const saveResult = model.save(tf.io.withSaveHandler(handleSave));\n * ```\n *\n * @param saveHandler A function that accepts a `ModelArtifacts` and returns a\n *     promise that resolves to a `SaveResult`.\n */\nexport function withSaveHandler(saveHandler) {\n    return new PassthroughSaver(saveHandler);\n}\n/**\n * Creates an IOHandlerSync that passes saved model artifacts to a callback.\n *\n * ```js\n * function handleSave(artifacts) {\n *   // ... do something with the artifacts ...\n *   return {modelArtifactsInfo: {...}, ...};\n * }\n *\n * const saveResult = model.save(tf.io.withSaveHandler(handleSave));\n * ```\n *\n * @param saveHandler A function that accepts a `ModelArtifacts` and returns a\n *     `SaveResult`.\n */\nexport function withSaveHandlerSync(saveHandler) {\n    return new PassthroughSaver(saveHandler);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3Rocm91Z2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL3Bhc3N0aHJvdWdoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQVFILE1BQU0saUJBQWlCO0lBQ3JCLFlBQTZCLGNBQStCO1FBQS9CLG1CQUFjLEdBQWQsY0FBYyxDQUFpQjtJQUFHLENBQUM7SUFFaEUsSUFBSTtRQUNGLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQztJQUM3QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLGdCQUFnQjtJQUNwQixZQUNtQixXQUE2QztRQUE3QyxnQkFBVyxHQUFYLFdBQVcsQ0FBa0M7SUFBRyxDQUFDO0lBRXBFLElBQUksQ0FBQyxjQUE4QjtRQUNqQyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDMUMsQ0FBQztDQUNGO0FBRUQsTUFBTSxnQkFBZ0I7SUFJcEIsWUFBWSxPQUFzQjtRQUNoQyxJQUFJLE9BQU8sQ0FBQyxJQUFJLEVBQUU7WUFDaEIsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsSUFBSSxPQUFPLENBQUMsSUFBSSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxjQUE4QixFQUFFLEVBQUUsQ0FDN0MsT0FBTyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7U0FDakQ7SUFDSCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvQkc7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN0QixjQUFpQyxFQUFFLFdBQW9DLEVBQ3ZFLFVBQXdCLEVBQUUsY0FBK0I7SUFFM0QsTUFBTSxJQUFJLEdBQUcsU0FBcUQsQ0FBQztJQUNuRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDMUIsY0FBaUMsRUFBRSxXQUFvQyxFQUN2RSxVQUF3QixFQUFFLGNBQStCO0lBQzNELElBQUksU0FBUyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxnQkFBZ0IsR0FDakIsY0FBaUMsQ0FBQyxhQUFhLElBQUksSUFBSTtZQUN2RCxjQUFpQyxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUM7UUFDM0QsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixPQUFPLElBQUksaUJBQWlCLENBQUMsY0FBZ0MsQ0FBQyxDQUFDO1NBQ2hFO2FBQU07WUFDTCwyQ0FBMkM7WUFDM0MsMENBQTBDO1lBQzFDLE9BQU8sQ0FBQyxJQUFJLENBQ1IseURBQXlEO2dCQUN6RCxpREFBaUQ7Z0JBQ2pELDhEQUE4RDtnQkFDOUQscURBQXFELENBQUMsQ0FBQztZQUMzRCxPQUFPLElBQUksaUJBQWlCLENBQUMsRUFBQyxhQUFhLEVBQUUsY0FBb0IsRUFBQyxDQUFDLENBQUM7U0FDckU7S0FDRjtTQUFNO1FBQ0wsa0JBQWtCO1FBQ2xCLDBDQUEwQztRQUMxQyxPQUFPLENBQUMsSUFBSSxDQUNSLHlEQUF5RDtZQUN6RCxpREFBaUQ7WUFDakQsOERBQThEO1lBQzlELHFEQUFxRCxDQUFDLENBQUM7UUFDM0QsT0FBTyxJQUFJLGlCQUFpQixDQUFDO1lBQzNCLGFBQWEsRUFBRSxjQUFvQjtZQUNuQyxXQUFXO1lBQ1gsVUFBVTtZQUNWLGNBQWM7U0FDZixDQUFDLENBQUM7S0FDSjtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQzNCLFdBQ3VCO0lBQ3pCLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQy9CLFdBQXNEO0lBQ3hELE9BQU8sSUFBSSxnQkFBZ0IsQ0FBYSxXQUFXLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIElPSGFuZGxlcnMgdGhhdCBwYXNzIHRocm91Z2ggdGhlIGluLW1lbW9yeSBNb2RlbEFydGlmYWN0cyBmb3JtYXQuXG4gKi9cblxuaW1wb3J0IHtJT0hhbmRsZXIsIElPSGFuZGxlclN5bmMsIExvYWRIYW5kbGVyLCBNb2RlbEFydGlmYWN0cywgU2F2ZUhhbmRsZXIsIFNhdmVSZXN1bHQsIFRyYWluaW5nQ29uZmlnLCBXZWlnaHRzTWFuaWZlc3RFbnRyeX0gZnJvbSAnLi90eXBlcyc7XG5cbmNsYXNzIFBhc3N0aHJvdWdoTG9hZGVyIGltcGxlbWVudHMgSU9IYW5kbGVyU3luYyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbW9kZWxBcnRpZmFjdHM/OiBNb2RlbEFydGlmYWN0cykge31cblxuICBsb2FkKCk6IE1vZGVsQXJ0aWZhY3RzIHtcbiAgICByZXR1cm4gdGhpcy5tb2RlbEFydGlmYWN0cztcbiAgfVxufVxuXG5jbGFzcyBQYXNzdGhyb3VnaFNhdmVyPFIgZXh0ZW5kcyBTYXZlUmVzdWx0IHwgUHJvbWlzZTxTYXZlUmVzdWx0Pj4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IHNhdmVIYW5kbGVyOiAoYXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cykgPT4gUikge31cblxuICBzYXZlKG1vZGVsQXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cyk6IFIge1xuICAgIHJldHVybiB0aGlzLnNhdmVIYW5kbGVyKG1vZGVsQXJ0aWZhY3RzKTtcbiAgfVxufVxuXG5jbGFzcyBQYXNzdGhyb3VnaEFzeW5jIGltcGxlbWVudHMgSU9IYW5kbGVyIHtcbiAgbG9hZD86IExvYWRIYW5kbGVyO1xuICBzYXZlPzogU2F2ZUhhbmRsZXI7XG5cbiAgY29uc3RydWN0b3IoaGFuZGxlcjogSU9IYW5kbGVyU3luYykge1xuICAgIGlmIChoYW5kbGVyLmxvYWQpIHtcbiAgICAgIHRoaXMubG9hZCA9ICgpID0+IFByb21pc2UucmVzb2x2ZShoYW5kbGVyLmxvYWQoKSk7XG4gICAgfVxuICAgIGlmIChoYW5kbGVyLnNhdmUpIHtcbiAgICAgIHRoaXMuc2F2ZSA9IChtb2RlbEFydGlmYWN0czogTW9kZWxBcnRpZmFjdHMpID0+XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShoYW5kbGVyLnNhdmUobW9kZWxBcnRpZmFjdHMpKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciB0aGF0IGxvYWRzIG1vZGVsIGFydGlmYWN0cyBmcm9tIG1lbW9yeS5cbiAqXG4gKiBXaGVuIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBgdGYubG9hZExheWVyc01vZGVsYCwgYW4gaW5zdGFuY2Ugb2ZcbiAqIGB0Zi5MYXllcnNNb2RlbGAgKEtlcmFzLXN0eWxlKSBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSB0aGUgbG9hZGVkIGFydGlmYWN0cy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSBhd2FpdCB0Zi5sb2FkTGF5ZXJzTW9kZWwodGYuaW8uZnJvbU1lbW9yeShcbiAqICAgICBtb2RlbFRvcG9sb2d5LCB3ZWlnaHRTcGVjcywgd2VpZ2h0RGF0YSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG1vZGVsQXJ0aWZhY3RzIGEgb2JqZWN0IGNvbnRhaW5pbmcgbW9kZWwgdG9wb2xvZ3kgKGkuZS4sIHBhcnNlZCBmcm9tXG4gKiAgIHRoZSBKU09OIGZvcm1hdCkuXG4gKiBAcGFyYW0gd2VpZ2h0U3BlY3MgQW4gYXJyYXkgb2YgYFdlaWdodHNNYW5pZmVzdEVudHJ5YCBvYmplY3RzIGRlc2NyaWJpbmcgdGhlXG4gKiAgIG5hbWVzLCBzaGFwZXMsIHR5cGVzLCBhbmQgcXVhbnRpemF0aW9uIG9mIHRoZSB3ZWlnaHQgZGF0YS4gT3B0aW9uYWwuXG4gKiBAcGFyYW0gd2VpZ2h0RGF0YSBBIHNpbmdsZSBgQXJyYXlCdWZmZXJgIGNvbnRhaW5pbmcgdGhlIHdlaWdodCBkYXRhLFxuICogICBjb25jYXRlbmF0ZWQgaW4gdGhlIG9yZGVyIGRlc2NyaWJlZCBieSB0aGUgd2VpZ2h0U3BlY3MuIE9wdGlvbmFsLlxuICogQHBhcmFtIHRyYWluaW5nQ29uZmlnIE1vZGVsIHRyYWluaW5nIGNvbmZpZ3VyYXRpb24uIE9wdGlvbmFsLlxuICpcbiAqIEByZXR1cm5zIEEgcGFzc3Rocm91Z2ggYElPSGFuZGxlcmAgdGhhdCBzaW1wbHkgbG9hZHMgdGhlIHByb3ZpZGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWVtb3J5KFxuICAgIG1vZGVsQXJ0aWZhY3RzOiB7fXxNb2RlbEFydGlmYWN0cywgd2VpZ2h0U3BlY3M/OiBXZWlnaHRzTWFuaWZlc3RFbnRyeVtdLFxuICAgIHdlaWdodERhdGE/OiBBcnJheUJ1ZmZlciwgdHJhaW5pbmdDb25maWc/OiBUcmFpbmluZ0NvbmZpZyk6IElPSGFuZGxlciB7XG5cbiAgY29uc3QgYXJncyA9IGFyZ3VtZW50cyBhcyB1bmtub3duIGFzIFBhcmFtZXRlcnM8dHlwZW9mIGZyb21NZW1vcnk+O1xuICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoQXN5bmMoZnJvbU1lbW9yeVN5bmMoLi4uYXJncykpO1xufVxuXG4vKipcbiAqIENyZWF0ZXMgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIGZyb20gbWVtb3J5LlxuICpcbiAqIFdoZW4gdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGB0Zi5sb2FkTGF5ZXJzTW9kZWxgLCBhbiBpbnN0YW5jZSBvZlxuICogYHRmLkxheWVyc01vZGVsYCAoS2VyYXMtc3R5bGUpIGNhbiBiZSBjb25zdHJ1Y3RlZCBmcm9tIHRoZSBsb2FkZWQgYXJ0aWZhY3RzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCh0Zi5pby5mcm9tTWVtb3J5KFxuICogICAgIG1vZGVsVG9wb2xvZ3ksIHdlaWdodFNwZWNzLCB3ZWlnaHREYXRhKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbW9kZWxBcnRpZmFjdHMgYSBvYmplY3QgY29udGFpbmluZyBtb2RlbCB0b3BvbG9neSAoaS5lLiwgcGFyc2VkIGZyb21cbiAqICAgdGhlIEpTT04gZm9ybWF0KS5cbiAqIEBwYXJhbSB3ZWlnaHRTcGVjcyBBbiBhcnJheSBvZiBgV2VpZ2h0c01hbmlmZXN0RW50cnlgIG9iamVjdHMgZGVzY3JpYmluZyB0aGVcbiAqICAgbmFtZXMsIHNoYXBlcywgdHlwZXMsIGFuZCBxdWFudGl6YXRpb24gb2YgdGhlIHdlaWdodCBkYXRhLiBPcHRpb25hbC5cbiAqIEBwYXJhbSB3ZWlnaHREYXRhIEEgc2luZ2xlIGBBcnJheUJ1ZmZlcmAgY29udGFpbmluZyB0aGUgd2VpZ2h0IGRhdGEsXG4gKiAgIGNvbmNhdGVuYXRlZCBpbiB0aGUgb3JkZXIgZGVzY3JpYmVkIGJ5IHRoZSB3ZWlnaHRTcGVjcy4gT3B0aW9uYWwuXG4gKiBAcGFyYW0gdHJhaW5pbmdDb25maWcgTW9kZWwgdHJhaW5pbmcgY29uZmlndXJhdGlvbi4gT3B0aW9uYWwuXG4gKlxuICogQHJldHVybnMgQSBwYXNzdGhyb3VnaCBgSU9IYW5kbGVyU3luY2AgdGhhdCBzaW1wbHkgbG9hZHMgdGhlIHByb3ZpZGVkIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tTWVtb3J5U3luYyhcbiAgICBtb2RlbEFydGlmYWN0czoge318TW9kZWxBcnRpZmFjdHMsIHdlaWdodFNwZWNzPzogV2VpZ2h0c01hbmlmZXN0RW50cnlbXSxcbiAgICB3ZWlnaHREYXRhPzogQXJyYXlCdWZmZXIsIHRyYWluaW5nQ29uZmlnPzogVHJhaW5pbmdDb25maWcpOiBJT0hhbmRsZXJTeW5jIHtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICBjb25zdCBpc01vZGVsQXJ0aWZhY3RzID1cbiAgICAgICAgKG1vZGVsQXJ0aWZhY3RzIGFzIE1vZGVsQXJ0aWZhY3RzKS5tb2RlbFRvcG9sb2d5ICE9IG51bGwgfHxcbiAgICAgICAgKG1vZGVsQXJ0aWZhY3RzIGFzIE1vZGVsQXJ0aWZhY3RzKS53ZWlnaHRTcGVjcyAhPSBudWxsO1xuICAgIGlmIChpc01vZGVsQXJ0aWZhY3RzKSB7XG4gICAgICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoTG9hZGVyKG1vZGVsQXJ0aWZhY3RzIGFzIE1vZGVsQXJ0aWZhY3RzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gTGVnYWN5IHN1cHBvcnQ6IHdpdGggb25seSBtb2RlbFRvcG9sb2d5LlxuICAgICAgLy8gVE9ETyhjYWlzKTogUmVtb3ZlIHRoaXMgZGVwcmVjYXRlZCBBUEkuXG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ1BsZWFzZSBjYWxsIHRmLmlvLmZyb21NZW1vcnkoKSB3aXRoIG9ubHkgb25lIGFyZ3VtZW50LiAnICtcbiAgICAgICAgICAnVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLiAnICtcbiAgICAgICAgICAnVGhlIG11bHRpLWFyZ3VtZW50IHNpZ25hdHVyZSBvZiB0Zi5pby5mcm9tTWVtb3J5KCkgaGFzIGJlZW4gJyArXG4gICAgICAgICAgJ2RlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLicpO1xuICAgICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcih7bW9kZWxUb3BvbG9neTogbW9kZWxBcnRpZmFjdHMgYXMge319KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gTGVnYWN5IHN1cHBvcnQuXG4gICAgLy8gVE9ETyhjYWlzKTogUmVtb3ZlIHRoaXMgZGVwcmVjYXRlZCBBUEkuXG4gICAgY29uc29sZS53YXJuKFxuICAgICAgICAnUGxlYXNlIGNhbGwgdGYuaW8uZnJvbU1lbW9yeSgpIHdpdGggb25seSBvbmUgYXJndW1lbnQuICcgK1xuICAgICAgICAnVGhlIGFyZ3VtZW50IHNob3VsZCBiZSBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLiAnICtcbiAgICAgICAgJ1RoZSBtdWx0aS1hcmd1bWVudCBzaWduYXR1cmUgb2YgdGYuaW8uZnJvbU1lbW9yeSgpIGhhcyBiZWVuICcgK1xuICAgICAgICAnZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuJyk7XG4gICAgcmV0dXJuIG5ldyBQYXNzdGhyb3VnaExvYWRlcih7XG4gICAgICBtb2RlbFRvcG9sb2d5OiBtb2RlbEFydGlmYWN0cyBhcyB7fSxcbiAgICAgIHdlaWdodFNwZWNzLFxuICAgICAgd2VpZ2h0RGF0YSxcbiAgICAgIHRyYWluaW5nQ29uZmlnXG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGFuIElPSGFuZGxlciB0aGF0IHBhc3NlcyBzYXZlZCBtb2RlbCBhcnRpZmFjdHMgdG8gYSBjYWxsYmFjay5cbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gaGFuZGxlU2F2ZShhcnRpZmFjdHMpIHtcbiAqICAgLy8gLi4uIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBhcnRpZmFjdHMgLi4uXG4gKiAgIHJldHVybiB7bW9kZWxBcnRpZmFjdHNJbmZvOiB7Li4ufSwgLi4ufTtcbiAqIH1cbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0ID0gbW9kZWwuc2F2ZSh0Zi5pby53aXRoU2F2ZUhhbmRsZXIoaGFuZGxlU2F2ZSkpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNhdmVIYW5kbGVyIEEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGEgYE1vZGVsQXJ0aWZhY3RzYCBhbmQgcmV0dXJucyBhXG4gKiAgICAgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHRvIGEgYFNhdmVSZXN1bHRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gd2l0aFNhdmVIYW5kbGVyKFxuICAgIHNhdmVIYW5kbGVyOiAoYXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cykgPT5cbiAgICAgICAgUHJvbWlzZTxTYXZlUmVzdWx0Pik6IElPSGFuZGxlciB7XG4gIHJldHVybiBuZXcgUGFzc3Rocm91Z2hTYXZlcihzYXZlSGFuZGxlcik7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBJT0hhbmRsZXJTeW5jIHRoYXQgcGFzc2VzIHNhdmVkIG1vZGVsIGFydGlmYWN0cyB0byBhIGNhbGxiYWNrLlxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBoYW5kbGVTYXZlKGFydGlmYWN0cykge1xuICogICAvLyAuLi4gZG8gc29tZXRoaW5nIHdpdGggdGhlIGFydGlmYWN0cyAuLi5cbiAqICAgcmV0dXJuIHttb2RlbEFydGlmYWN0c0luZm86IHsuLi59LCAuLi59O1xuICogfVxuICpcbiAqIGNvbnN0IHNhdmVSZXN1bHQgPSBtb2RlbC5zYXZlKHRmLmlvLndpdGhTYXZlSGFuZGxlcihoYW5kbGVTYXZlKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2F2ZUhhbmRsZXIgQSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgYSBgTW9kZWxBcnRpZmFjdHNgIGFuZCByZXR1cm5zIGFcbiAqICAgICBgU2F2ZVJlc3VsdGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoU2F2ZUhhbmRsZXJTeW5jKFxuICAgIHNhdmVIYW5kbGVyOiAoYXJ0aWZhY3RzOiBNb2RlbEFydGlmYWN0cykgPT4gU2F2ZVJlc3VsdCk6IElPSGFuZGxlclN5bmMge1xuICByZXR1cm4gbmV3IFBhc3N0aHJvdWdoU2F2ZXI8U2F2ZVJlc3VsdD4oc2F2ZUhhbmRsZXIpO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Importing local_storage and indexed_db is necessary for the routers to be\n// registered.\nimport './indexed_db';\nimport './local_storage';\nimport { browserFiles } from './browser_files';\nimport { browserHTTPRequest, http, isHTTPScheme } from './http';\nimport { concatenateArrayBuffers, decodeWeights, encodeWeights, getModelArtifactsForJSON, getModelArtifactsForJSONSync, getModelArtifactsInfoForJSON, getWeightSpecs } from './io_utils';\nimport { fromMemory, fromMemorySync, withSaveHandler, withSaveHandlerSync } from './passthrough';\nimport { getLoadHandlers, getSaveHandlers, registerLoadRouter, registerSaveRouter } from './router_registry';\nimport { loadWeights, weightsLoaderFactory } from './weights_loader';\nexport { copyModel, listModels, moveModel, removeModel } from './model_management';\nexport { browserFiles, browserHTTPRequest, concatenateArrayBuffers, decodeWeights, encodeWeights, fromMemory, fromMemorySync, getLoadHandlers, getModelArtifactsForJSON, getModelArtifactsForJSONSync, getModelArtifactsInfoForJSON, getSaveHandlers, getWeightSpecs, http, isHTTPScheme, loadWeights, registerLoadRouter, registerSaveRouter, weightsLoaderFactory, withSaveHandler, withSaveHandlerSync, };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW8uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2lvL2lvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDRFQUE0RTtBQUM1RSxjQUFjO0FBQ2QsT0FBTyxjQUFjLENBQUM7QUFDdEIsT0FBTyxpQkFBaUIsQ0FBQztBQUV6QixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLGtCQUFrQixFQUFFLElBQUksRUFBRSxZQUFZLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDOUQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsd0JBQXdCLEVBQUUsNEJBQTRCLEVBQUUsNEJBQTRCLEVBQUUsY0FBYyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3ZMLE9BQU8sRUFBQyxVQUFVLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvRixPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRTNHLE9BQU8sRUFBQyxXQUFXLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVuRSxPQUFPLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDakYsT0FBTyxFQUNMLFlBQVksRUFDWixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLGFBQWEsRUFDYixhQUFhLEVBQ2IsVUFBVSxFQUNWLGNBQWMsRUFDZCxlQUFlLEVBQ2Ysd0JBQXdCLEVBQ3hCLDRCQUE0QixFQUM1Qiw0QkFBNEIsRUFDNUIsZUFBZSxFQUNmLGNBQWMsRUFDZCxJQUFJLEVBR0osWUFBWSxFQUdaLFdBQVcsRUFNWCxrQkFBa0IsRUFDbEIsa0JBQWtCLEVBT2xCLG9CQUFvQixFQUdwQixlQUFlLEVBQ2YsbUJBQW1CLEdBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIEltcG9ydGluZyBsb2NhbF9zdG9yYWdlIGFuZCBpbmRleGVkX2RiIGlzIG5lY2Vzc2FyeSBmb3IgdGhlIHJvdXRlcnMgdG8gYmVcbi8vIHJlZ2lzdGVyZWQuXG5pbXBvcnQgJy4vaW5kZXhlZF9kYic7XG5pbXBvcnQgJy4vbG9jYWxfc3RvcmFnZSc7XG5cbmltcG9ydCB7YnJvd3NlckZpbGVzfSBmcm9tICcuL2Jyb3dzZXJfZmlsZXMnO1xuaW1wb3J0IHticm93c2VySFRUUFJlcXVlc3QsIGh0dHAsIGlzSFRUUFNjaGVtZX0gZnJvbSAnLi9odHRwJztcbmltcG9ydCB7Y29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsIGRlY29kZVdlaWdodHMsIGVuY29kZVdlaWdodHMsIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTiwgZ2V0TW9kZWxBcnRpZmFjdHNGb3JKU09OU3luYywgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTiwgZ2V0V2VpZ2h0U3BlY3N9IGZyb20gJy4vaW9fdXRpbHMnO1xuaW1wb3J0IHtmcm9tTWVtb3J5LCBmcm9tTWVtb3J5U3luYywgd2l0aFNhdmVIYW5kbGVyLCB3aXRoU2F2ZUhhbmRsZXJTeW5jfSBmcm9tICcuL3Bhc3N0aHJvdWdoJztcbmltcG9ydCB7Z2V0TG9hZEhhbmRsZXJzLCBnZXRTYXZlSGFuZGxlcnMsIHJlZ2lzdGVyTG9hZFJvdXRlciwgcmVnaXN0ZXJTYXZlUm91dGVyfSBmcm9tICcuL3JvdXRlcl9yZWdpc3RyeSc7XG5pbXBvcnQge0lPSGFuZGxlciwgSU9IYW5kbGVyU3luYywgTG9hZEhhbmRsZXIsIExvYWRPcHRpb25zLCBNb2RlbEFydGlmYWN0cywgTW9kZWxBcnRpZmFjdHNJbmZvLCBNb2RlbEpTT04sIE1vZGVsU3RvcmVNYW5hZ2VyLCBPblByb2dyZXNzQ2FsbGJhY2ssIFJlcXVlc3REZXRhaWxzLCBTYXZlQ29uZmlnLCBTYXZlSGFuZGxlciwgU2F2ZVJlc3VsdCwgVHJhaW5pbmdDb25maWcsIFdlaWdodEdyb3VwLCBXZWlnaHRzTWFuaWZlc3RDb25maWcsIFdlaWdodHNNYW5pZmVzdEVudHJ5fSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7bG9hZFdlaWdodHMsIHdlaWdodHNMb2FkZXJGYWN0b3J5fSBmcm9tICcuL3dlaWdodHNfbG9hZGVyJztcblxuZXhwb3J0IHtjb3B5TW9kZWwsIGxpc3RNb2RlbHMsIG1vdmVNb2RlbCwgcmVtb3ZlTW9kZWx9IGZyb20gJy4vbW9kZWxfbWFuYWdlbWVudCc7XG5leHBvcnQge1xuICBicm93c2VyRmlsZXMsXG4gIGJyb3dzZXJIVFRQUmVxdWVzdCxcbiAgY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMsXG4gIGRlY29kZVdlaWdodHMsXG4gIGVuY29kZVdlaWdodHMsXG4gIGZyb21NZW1vcnksXG4gIGZyb21NZW1vcnlTeW5jLFxuICBnZXRMb2FkSGFuZGxlcnMsXG4gIGdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTixcbiAgZ2V0TW9kZWxBcnRpZmFjdHNGb3JKU09OU3luYyxcbiAgZ2V0TW9kZWxBcnRpZmFjdHNJbmZvRm9ySlNPTixcbiAgZ2V0U2F2ZUhhbmRsZXJzLFxuICBnZXRXZWlnaHRTcGVjcyxcbiAgaHR0cCxcbiAgSU9IYW5kbGVyLFxuICBJT0hhbmRsZXJTeW5jLFxuICBpc0hUVFBTY2hlbWUsXG4gIExvYWRIYW5kbGVyLFxuICBMb2FkT3B0aW9ucyxcbiAgbG9hZFdlaWdodHMsXG4gIE1vZGVsQXJ0aWZhY3RzLFxuICBNb2RlbEFydGlmYWN0c0luZm8sXG4gIE1vZGVsSlNPTixcbiAgTW9kZWxTdG9yZU1hbmFnZXIsXG4gIE9uUHJvZ3Jlc3NDYWxsYmFjayxcbiAgcmVnaXN0ZXJMb2FkUm91dGVyLFxuICByZWdpc3RlclNhdmVSb3V0ZXIsXG4gIFJlcXVlc3REZXRhaWxzLFxuICBTYXZlQ29uZmlnLFxuICBTYXZlSGFuZGxlcixcbiAgU2F2ZVJlc3VsdCxcbiAgVHJhaW5pbmdDb25maWcsXG4gIFdlaWdodEdyb3VwLFxuICB3ZWlnaHRzTG9hZGVyRmFjdG9yeSxcbiAgV2VpZ2h0c01hbmlmZXN0Q29uZmlnLFxuICBXZWlnaHRzTWFuaWZlc3RFbnRyeSxcbiAgd2l0aFNhdmVIYW5kbGVyLFxuICB3aXRoU2F2ZUhhbmRsZXJTeW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { BatchMatMul } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the dot product of two matrices, A * B. These must be matrices.\n *\n * ```js\n * const a = tf.tensor2d([1, 2], [1, 2]);\n * const b = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * a.matMul(b).print();  // or tf.matMul(a, b)\n * ```\n * @param a First matrix in dot product operation.\n * @param b Second matrix in dot product operation.\n * @param transposeA If true, `a` is transposed before multiplication.\n * @param transposeB If true, `b` is transposed before multiplication.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction matMul_(a, b, transposeA = false, transposeB = false) {\n    let $a = convertToTensor(a, 'a', 'matMul');\n    let $b = convertToTensor(b, 'b', 'matMul');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const inputs = { a: $a, b: $b };\n    const attrs = { transposeA, transposeB };\n    return ENGINE.runKernel(BatchMatMul, inputs, attrs);\n}\nexport const matMul = op({ matMul_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0X211bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21hdF9tdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFzQyxNQUFNLGlCQUFpQixDQUFDO0FBSWpGLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLE9BQU8sQ0FDWixDQUFvQixFQUFFLENBQW9CLEVBQUUsVUFBVSxHQUFHLEtBQUssRUFDOUQsVUFBVSxHQUFHLEtBQUs7SUFDcEIsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0MsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDM0MsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxNQUFNLE1BQU0sR0FBc0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNqRCxNQUFNLEtBQUssR0FBcUIsRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFFekQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixXQUFXLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0JhdGNoTWF0TXVsLCBCYXRjaE1hdE11bEF0dHJzLCBCYXRjaE1hdE11bElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBkb3QgcHJvZHVjdCBvZiB0d28gbWF0cmljZXMsIEEgKiBCLiBUaGVzZSBtdXN0IGJlIG1hdHJpY2VzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoWzEsIDJdLCBbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBhLm1hdE11bChiKS5wcmludCgpOyAgLy8gb3IgdGYubWF0TXVsKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIEZpcnN0IG1hdHJpeCBpbiBkb3QgcHJvZHVjdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gYiBTZWNvbmQgbWF0cml4IGluIGRvdCBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB0cmFuc3Bvc2VBIElmIHRydWUsIGBhYCBpcyB0cmFuc3Bvc2VkIGJlZm9yZSBtdWx0aXBsaWNhdGlvbi5cbiAqIEBwYXJhbSB0cmFuc3Bvc2VCIElmIHRydWUsIGBiYCBpcyB0cmFuc3Bvc2VkIGJlZm9yZSBtdWx0aXBsaWNhdGlvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNYXRyaWNlcyd9XG4gKi9cbmZ1bmN0aW9uIG1hdE11bF88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlLCB0cmFuc3Bvc2VBID0gZmFsc2UsXG4gICAgdHJhbnNwb3NlQiA9IGZhbHNlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtYXRNdWwnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ21hdE11bCcpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgY29uc3QgaW5wdXRzOiBCYXRjaE1hdE11bElucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuICBjb25zdCBhdHRyczogQmF0Y2hNYXRNdWxBdHRycyA9IHt0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIEJhdGNoTWF0TXVsLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXRNdWwgPSBvcCh7bWF0TXVsX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { OneHot } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Creates a one-hot `tf.Tensor`. The locations represented by `indices` take\n * value `onValue` (defaults to 1), while all other locations take value\n * `offValue` (defaults to 0). If `indices` is rank `R`, the output has rank\n * `R+1` with the last axis of size `depth`.\n * `indices` used to encode prediction class must start from 0. For example,\n *  if you have 3 classes of data, class 1 should be encoded as 0, class 2\n *  should be 1, and class 3 should be 2.\n *\n * ```js\n * tf.oneHot(tf.tensor1d([0, 1], 'int32'), 3).print();\n * ```\n *\n * @param indices `tf.Tensor` of indices with dtype `int32`. Indices must\n * start from 0.\n * @param depth The depth of the one hot dimension.\n * @param onValue A number used to fill in the output when the index matches\n * the location.\n * @param offValue A number used to fill in the output when the index does\n *     not match the location.\n * @param dtype The dtype of the output tensor, default to 'int32'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction oneHot_(indices, depth, onValue = 1, offValue = 0, dtype = 'int32') {\n    if (depth < 2) {\n        throw new Error(`Error in oneHot: depth must be >=2, but it is ${depth}`);\n    }\n    const $indices = convertToTensor(indices, 'indices', 'oneHot', 'int32');\n    const inputs = { indices: $indices };\n    const attrs = { dtype, depth, onValue, offValue };\n    return ENGINE.runKernel(OneHot, inputs, attrs);\n}\nexport const oneHot = op({ oneHot_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lX2hvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL29uZV9ob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUE0QixNQUFNLGlCQUFpQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsT0FBTyxDQUNaLE9BQTBCLEVBQUUsS0FBYSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUMsRUFDcEUsUUFBa0IsT0FBTztJQUMzQixJQUFJLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDYixNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzNFO0lBQ0QsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXhFLE1BQU0sTUFBTSxHQUFpQixFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUNqRCxNQUFNLEtBQUssR0FBZ0IsRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUU3RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE1BQU0sRUFBRSxNQUFtQyxFQUMzQyxLQUFnQyxDQUFDLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7T25lSG90LCBPbmVIb3RBdHRycywgT25lSG90SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7RGF0YVR5cGUsIFRlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBvbmUtaG90IGB0Zi5UZW5zb3JgLiBUaGUgbG9jYXRpb25zIHJlcHJlc2VudGVkIGJ5IGBpbmRpY2VzYCB0YWtlXG4gKiB2YWx1ZSBgb25WYWx1ZWAgKGRlZmF1bHRzIHRvIDEpLCB3aGlsZSBhbGwgb3RoZXIgbG9jYXRpb25zIHRha2UgdmFsdWVcbiAqIGBvZmZWYWx1ZWAgKGRlZmF1bHRzIHRvIDApLiBJZiBgaW5kaWNlc2AgaXMgcmFuayBgUmAsIHRoZSBvdXRwdXQgaGFzIHJhbmtcbiAqIGBSKzFgIHdpdGggdGhlIGxhc3QgYXhpcyBvZiBzaXplIGBkZXB0aGAuXG4gKiBgaW5kaWNlc2AgdXNlZCB0byBlbmNvZGUgcHJlZGljdGlvbiBjbGFzcyBtdXN0IHN0YXJ0IGZyb20gMC4gRm9yIGV4YW1wbGUsXG4gKiAgaWYgeW91IGhhdmUgMyBjbGFzc2VzIG9mIGRhdGEsIGNsYXNzIDEgc2hvdWxkIGJlIGVuY29kZWQgYXMgMCwgY2xhc3MgMlxuICogIHNob3VsZCBiZSAxLCBhbmQgY2xhc3MgMyBzaG91bGQgYmUgMi5cbiAqXG4gKiBgYGBqc1xuICogdGYub25lSG90KHRmLnRlbnNvcjFkKFswLCAxXSwgJ2ludDMyJyksIDMpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaW5kaWNlcyBgdGYuVGVuc29yYCBvZiBpbmRpY2VzIHdpdGggZHR5cGUgYGludDMyYC4gSW5kaWNlcyBtdXN0XG4gKiBzdGFydCBmcm9tIDAuXG4gKiBAcGFyYW0gZGVwdGggVGhlIGRlcHRoIG9mIHRoZSBvbmUgaG90IGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBvblZhbHVlIEEgbnVtYmVyIHVzZWQgdG8gZmlsbCBpbiB0aGUgb3V0cHV0IHdoZW4gdGhlIGluZGV4IG1hdGNoZXNcbiAqIHRoZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSBvZmZWYWx1ZSBBIG51bWJlciB1c2VkIHRvIGZpbGwgaW4gdGhlIG91dHB1dCB3aGVuIHRoZSBpbmRleCBkb2VzXG4gKiAgICAgbm90IG1hdGNoIHRoZSBsb2NhdGlvbi5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZHR5cGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IsIGRlZmF1bHQgdG8gJ2ludDMyJy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG9uZUhvdF8oXG4gICAgaW5kaWNlczogVGVuc29yfFRlbnNvckxpa2UsIGRlcHRoOiBudW1iZXIsIG9uVmFsdWUgPSAxLCBvZmZWYWx1ZSA9IDAsXG4gICAgZHR5cGU6IERhdGFUeXBlID0gJ2ludDMyJyk6IFRlbnNvciB7XG4gIGlmIChkZXB0aCA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG9uZUhvdDogZGVwdGggbXVzdCBiZSA+PTIsIGJ1dCBpdCBpcyAke2RlcHRofWApO1xuICB9XG4gIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ29uZUhvdCcsICdpbnQzMicpO1xuXG4gIGNvbnN0IGlucHV0czogT25lSG90SW5wdXRzID0ge2luZGljZXM6ICRpbmRpY2VzfTtcbiAgY29uc3QgYXR0cnM6IE9uZUhvdEF0dHJzID0ge2R0eXBlLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWV9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgT25lSG90LCBpbnB1dHMgYXMgdW5rbm93biBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgIGF0dHJzIGFzIHVua25vd24gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IG9uZUhvdCA9IG9wKHtvbmVIb3RffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from './engine';\nimport { env } from './environment';\nimport { setDeprecationWarningFn } from './tensor';\nimport { getTensorsInContainer } from './tensor_util';\n/**\n * Enables production mode which disables correctness checks in favor of\n * performance.\n *\n * @doc {heading: 'Environment'}\n */\nexport function enableProdMode() {\n    env().set('PROD', true);\n}\n/**\n * Enables debug mode which will log information about all executed kernels:\n * the elapsed time of the kernel execution, as well as the rank, shape, and\n * size of the output tensor.\n *\n * Debug mode will significantly slow down your application as it will\n * download the result of every operation to the CPU. This should not be used in\n * production. Debug mode does not affect the timing information of the kernel\n * execution as we do not measure download time in the kernel execution time.\n *\n * See also: `tf.profile`, `tf.memory`.\n *\n * @doc {heading: 'Environment'}\n */\nexport function enableDebugMode() {\n    env().set('DEBUG', true);\n}\n/** Globally disables deprecation warnings */\nexport function disableDeprecationWarnings() {\n    env().set('DEPRECATION_WARNINGS_ENABLED', false);\n    console.warn(`TensorFlow.js deprecation warnings have been disabled.`);\n}\n/** Warn users about deprecated functionality. */\nexport function deprecationWarn(msg) {\n    if (env().getBool('DEPRECATION_WARNINGS_ENABLED')) {\n        console.warn(msg + ' You can disable deprecation warnings with ' +\n            'tf.disableDeprecationWarnings().');\n    }\n}\nsetDeprecationWarningFn(deprecationWarn);\n/**\n * Dispose all variables kept in backend engine.\n *\n * @doc {heading: 'Environment'}\n */\nexport function disposeVariables() {\n    ENGINE.disposeVariables();\n}\n/**\n * It returns the global engine that keeps track of all tensors and backends.\n *\n * @doc {heading: 'Environment'}\n */\nexport function engine() {\n    return ENGINE;\n}\n/**\n * Returns memory info at the current time in the program. The result is an\n * object with the following properties:\n *\n * - `numBytes`: Number of bytes allocated (undisposed) at this time.\n * - `numTensors`: Number of unique tensors allocated.\n * - `numDataBuffers`: Number of unique data buffers allocated\n *   (undisposed) at this time, which is ≤ the number of tensors\n *   (e.g. `a.reshape(newShape)` makes a new Tensor that shares the same\n *   data buffer with `a`).\n * - `unreliable`: True if the memory usage is unreliable. See `reasons` when\n *    `unreliable` is true.\n * - `reasons`: `string[]`, reasons why the memory is unreliable, present if\n *    `unreliable` is true.\n *\n * WebGL Properties:\n * - `numBytesInGPU`: Number of bytes allocated (undisposed) in the GPU only at\n *     this time.\n *\n * @doc {heading: 'Performance', subheading: 'Memory'}\n */\nexport function memory() {\n    return ENGINE.memory();\n}\n/**\n * Executes the provided function `f()` and returns a promise that resolves\n * with information about the function's memory use:\n * - `newBytes`: the number of new bytes allocated\n * - `newTensors`: the number of new tensors created\n * - `peakBytes`: the peak number of bytes allocated\n * - `kernels`: an array of objects for each kernel involved that reports\n * their input and output shapes, number of bytes used, and number of new\n * tensors created.\n * - `kernelNames`: an array of unique strings with just the names of the\n * kernels in the `kernels` array.\n *\n * ```js\n * const profile = await tf.profile(() => {\n *   const x = tf.tensor1d([1, 2, 3]);\n *   let x2 = x.square();\n *   x2.dispose();\n *   x2 = x.square();\n *   x2.dispose();\n *   return x;\n * });\n *\n * console.log(`newBytes: ${profile.newBytes}`);\n * console.log(`newTensors: ${profile.newTensors}`);\n * console.log(`byte usage over all kernels: ${profile.kernels.map(k =>\n * k.totalBytesSnapshot)}`);\n * ```\n *\n *\n * @doc {heading: 'Performance', subheading: 'Profile'}\n */\nexport function profile(f) {\n    return ENGINE.profile(f);\n}\n/**\n * Executes the provided function `fn` and after it is executed, cleans up all\n * intermediate tensors allocated by `fn` except those returned by `fn`.\n * `fn` must not return a Promise (async functions not allowed). The returned\n * result can be a complex object.\n *\n * Using this method helps avoid memory leaks. In general, wrap calls to\n * operations in `tf.tidy` for automatic memory cleanup.\n *\n * NOTE: Variables do *not* get cleaned up when inside a tidy(). If you want to\n * dispose variables, please use `tf.disposeVariables` or call dispose()\n * directly on variables.\n *\n * ```js\n * // y = 2 ^ 2 + 1\n * const y = tf.tidy(() => {\n *   // a, b, and one will be cleaned up when the tidy ends.\n *   const one = tf.scalar(1);\n *   const a = tf.scalar(2);\n *   const b = a.square();\n *\n *   console.log('numTensors (in tidy): ' + tf.memory().numTensors);\n *\n *   // The value returned inside the tidy function will return\n *   // through the tidy, in this case to the variable y.\n *   return b.add(one);\n * });\n *\n * console.log('numTensors (outside tidy): ' + tf.memory().numTensors);\n * y.print();\n * ```\n *\n * @param nameOrFn The name of the closure, or the function to execute.\n *     If a name is provided, the 2nd argument should be the function.\n *     If debug mode is on, the timing and the memory usage of the function\n *     will be tracked and displayed on the console using the provided name.\n * @param fn The function to execute.\n *\n * @doc {heading: 'Performance', subheading: 'Memory'}\n */\nexport function tidy(nameOrFn, fn) {\n    return ENGINE.tidy(nameOrFn, fn);\n}\n/**\n * Disposes any `tf.Tensor`s found within the provided object.\n *\n * @param container an object that may be a `tf.Tensor` or may directly\n *     contain `tf.Tensor`s, such as a `Tensor[]` or `{key: Tensor, ...}`. If\n *     the object is not a `tf.Tensor` or does not contain `Tensors`, nothing\n *     happens. In general it is safe to pass any object here, except that\n *     `Promise`s are not supported.\n *\n * @doc {heading: 'Performance', subheading: 'Memory'}\n */\nexport function dispose(container) {\n    const tensors = getTensorsInContainer(container);\n    tensors.forEach(tensor => tensor.dispose());\n}\n/**\n * Keeps a `tf.Tensor` generated inside a `tf.tidy` from being disposed\n * automatically.\n *\n * ```js\n * let b;\n * const y = tf.tidy(() => {\n *   const one = tf.scalar(1);\n *   const a = tf.scalar(2);\n *\n *   // b will not be cleaned up by the tidy. a and one will be cleaned up\n *   // when the tidy ends.\n *   b = tf.keep(a.square());\n *\n *   console.log('numTensors (in tidy): ' + tf.memory().numTensors);\n *\n *   // The value returned inside the tidy function will return\n *   // through the tidy, in this case to the variable y.\n *   return b.add(one);\n * });\n *\n * console.log('numTensors (outside tidy): ' + tf.memory().numTensors);\n * console.log('y:');\n * y.print();\n * console.log('b:');\n * b.print();\n * ```\n *\n * @param result The tensor to keep from being disposed.\n *\n * @doc {heading: 'Performance', subheading: 'Memory'}\n */\nexport function keep(result) {\n    return ENGINE.keep(result);\n}\n/**\n * Executes `f()` and returns a promise that resolves with timing\n * information.\n *\n * The result is an object with the following properties:\n *\n * - `wallMs`: Wall execution time.\n * - `kernelMs`: Kernel execution time, ignoring data transfer. If using the\n * WebGL backend and the query timer extension is not available, this will\n * return an error object.\n * - On `WebGL` The following additional properties exist:\n *   - `uploadWaitMs`: CPU blocking time on texture uploads.\n *   - `downloadWaitMs`: CPU blocking time on texture downloads (readPixels).\n *\n * ```js\n * const x = tf.randomNormal([20, 20]);\n * const time = await tf.time(() => x.matMul(x));\n *\n * console.log(`kernelMs: ${time.kernelMs}, wallTimeMs: ${time.wallMs}`);\n * ```\n *\n * @param f The function to execute and time.\n *\n * @doc {heading: 'Performance', subheading: 'Timing'}\n */\nexport function time(f) {\n    return ENGINE.time(f);\n}\n/**\n * Sets the backend (cpu, webgl, wasm, etc) responsible for creating tensors and\n * executing operations on those tensors. Returns a promise that resolves\n * to a boolean if the backend initialization was successful.\n *\n * Note this disposes the current backend, if any, as well as any tensors\n * associated with it. A new backend is initialized, even if it is of the\n * same type as the previous one.\n *\n * @param backendName The name of the backend. Currently supports\n *     `'webgl'|'cpu'` in the browser, `'tensorflow'` under node.js\n *     (requires tfjs-node), and `'wasm'` (requires tfjs-backend-wasm).\n *\n * @doc {heading: 'Backends'}\n */\nexport function setBackend(backendName) {\n    return ENGINE.setBackend(backendName);\n}\n/**\n * Returns a promise that resolves when the currently selected backend (or the\n * highest priority one) has initialized. Await this promise when you are using\n * a backend that has async initialization.\n *\n * @doc {heading: 'Backends'}\n */\nexport function ready() {\n    return ENGINE.ready();\n}\n/**\n * Returns the current backend name (cpu, webgl, etc). The backend is\n * responsible for creating tensors and executing operations on those tensors.\n *\n * @doc {heading: 'Backends'}\n */\nexport function getBackend() {\n    return ENGINE.backendName;\n}\n/**\n * Removes a backend and the registered factory.\n *\n * @doc {heading: 'Backends'}\n */\nexport function removeBackend(name) {\n    ENGINE.removeBackend(name);\n}\n/**\n * Finds the backend registered under the provided name. Returns null if the\n * name is not in the registry, or the registration hasn't finished yet.\n */\nexport function findBackend(name) {\n    return ENGINE.findBackend(name);\n}\n/**\n * Finds the backend factory registered under the provided name. Returns a\n * function that produces a new backend when called. Returns null if the name\n * is not in the registry.\n */\nexport function findBackendFactory(name) {\n    return ENGINE.findBackendFactory(name);\n}\n/**\n * Registers a global backend. The registration should happen when importing\n * a module file (e.g. when importing `backend_webgl.ts`), and is used for\n * modular builds (e.g. custom tfjs bundle with only webgl support).\n *\n * @param factory The backend factory function. When called, it should\n * return a backend instance, or a promise of an instance.\n * @param priority The priority of the backend (higher = more important).\n *     In case multiple backends are registered, the priority is used to find\n *     the best backend. Defaults to 1.\n * @return False if there is already a registered backend under this name, true\n *     if not.\n *\n * @doc {heading: 'Backends'}\n */\nexport function registerBackend(name, factory, priority = 1) {\n    return ENGINE.registerBackend(name, factory, priority);\n}\n/**\n * Gets the current backend. If no backends have been initialized, this will\n * attempt to initialize the best backend. Will throw an error if the highest\n * priority backend has async initialization, in which case you should call\n * 'await tf.ready()' before running other code.\n *\n * @doc {heading: 'Backends'}\n */\nexport function backend() {\n    return ENGINE.backend;\n}\n/**\n * Sets the global platform.\n *\n * @param platformName The name of this platform.\n * @param platform A platform implementation.\n */\nexport function setPlatform(platformName, platform) {\n    env().setPlatform(platformName, platform);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ2xvYmFscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsTUFBTSxFQUF1RCxNQUFNLFVBQVUsQ0FBQztBQUN0RixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR2xDLE9BQU8sRUFBQyx1QkFBdUIsRUFBUyxNQUFNLFVBQVUsQ0FBQztBQUV6RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFcEQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsY0FBYztJQUM1QixHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsTUFBTSxVQUFVLGVBQWU7SUFDN0IsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsNkNBQTZDO0FBQzdDLE1BQU0sVUFBVSwwQkFBMEI7SUFDeEMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsaURBQWlEO0FBQ2pELE1BQU0sVUFBVSxlQUFlLENBQUMsR0FBVztJQUN6QyxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxFQUFFO1FBQ2pELE9BQU8sQ0FBQyxJQUFJLENBQ1IsR0FBRyxHQUFHLDZDQUE2QztZQUNuRCxrQ0FBa0MsQ0FBQyxDQUFDO0tBQ3pDO0FBQ0gsQ0FBQztBQUNELHVCQUF1QixDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBRXpDOzs7O0dBSUc7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LEVBQUUsUUFBa0I7SUFDbEUsR0FBRyxFQUFFLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbEJhY2tlbmR9IGZyb20gJy4vYmFja2VuZHMvYmFja2VuZCc7XG5pbXBvcnQge0VOR0lORSwgRW5naW5lLCBNZW1vcnlJbmZvLCBQcm9maWxlSW5mbywgU2NvcGVGbiwgVGltaW5nSW5mb30gZnJvbSAnLi9lbmdpbmUnO1xuaW1wb3J0IHtlbnZ9IGZyb20gJy4vZW52aXJvbm1lbnQnO1xuXG5pbXBvcnQge1BsYXRmb3JtfSBmcm9tICcuL3BsYXRmb3Jtcy9wbGF0Zm9ybSc7XG5pbXBvcnQge3NldERlcHJlY2F0aW9uV2FybmluZ0ZuLCBUZW5zb3J9IGZyb20gJy4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yQ29udGFpbmVyfSBmcm9tICcuL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2dldFRlbnNvcnNJbkNvbnRhaW5lcn0gZnJvbSAnLi90ZW5zb3JfdXRpbCc7XG5cbi8qKlxuICogRW5hYmxlcyBwcm9kdWN0aW9uIG1vZGUgd2hpY2ggZGlzYWJsZXMgY29ycmVjdG5lc3MgY2hlY2tzIGluIGZhdm9yIG9mXG4gKiBwZXJmb3JtYW5jZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlUHJvZE1vZGUoKTogdm9pZCB7XG4gIGVudigpLnNldCgnUFJPRCcsIHRydWUpO1xufVxuXG4vKipcbiAqIEVuYWJsZXMgZGVidWcgbW9kZSB3aGljaCB3aWxsIGxvZyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgZXhlY3V0ZWQga2VybmVsczpcbiAqIHRoZSBlbGFwc2VkIHRpbWUgb2YgdGhlIGtlcm5lbCBleGVjdXRpb24sIGFzIHdlbGwgYXMgdGhlIHJhbmssIHNoYXBlLCBhbmRcbiAqIHNpemUgb2YgdGhlIG91dHB1dCB0ZW5zb3IuXG4gKlxuICogRGVidWcgbW9kZSB3aWxsIHNpZ25pZmljYW50bHkgc2xvdyBkb3duIHlvdXIgYXBwbGljYXRpb24gYXMgaXQgd2lsbFxuICogZG93bmxvYWQgdGhlIHJlc3VsdCBvZiBldmVyeSBvcGVyYXRpb24gdG8gdGhlIENQVS4gVGhpcyBzaG91bGQgbm90IGJlIHVzZWQgaW5cbiAqIHByb2R1Y3Rpb24uIERlYnVnIG1vZGUgZG9lcyBub3QgYWZmZWN0IHRoZSB0aW1pbmcgaW5mb3JtYXRpb24gb2YgdGhlIGtlcm5lbFxuICogZXhlY3V0aW9uIGFzIHdlIGRvIG5vdCBtZWFzdXJlIGRvd25sb2FkIHRpbWUgaW4gdGhlIGtlcm5lbCBleGVjdXRpb24gdGltZS5cbiAqXG4gKiBTZWUgYWxzbzogYHRmLnByb2ZpbGVgLCBgdGYubWVtb3J5YC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5hYmxlRGVidWdNb2RlKCk6IHZvaWQge1xuICBlbnYoKS5zZXQoJ0RFQlVHJywgdHJ1ZSk7XG59XG5cbi8qKiBHbG9iYWxseSBkaXNhYmxlcyBkZXByZWNhdGlvbiB3YXJuaW5ncyAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVEZXByZWNhdGlvbldhcm5pbmdzKCk6IHZvaWQge1xuICBlbnYoKS5zZXQoJ0RFUFJFQ0FUSU9OX1dBUk5JTkdTX0VOQUJMRUQnLCBmYWxzZSk7XG4gIGNvbnNvbGUud2FybihgVGVuc29yRmxvdy5qcyBkZXByZWNhdGlvbiB3YXJuaW5ncyBoYXZlIGJlZW4gZGlzYWJsZWQuYCk7XG59XG5cbi8qKiBXYXJuIHVzZXJzIGFib3V0IGRlcHJlY2F0ZWQgZnVuY3Rpb25hbGl0eS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXByZWNhdGlvbldhcm4obXNnOiBzdHJpbmcpIHtcbiAgaWYgKGVudigpLmdldEJvb2woJ0RFUFJFQ0FUSU9OX1dBUk5JTkdTX0VOQUJMRUQnKSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgbXNnICsgJyBZb3UgY2FuIGRpc2FibGUgZGVwcmVjYXRpb24gd2FybmluZ3Mgd2l0aCAnICtcbiAgICAgICAgJ3RmLmRpc2FibGVEZXByZWNhdGlvbldhcm5pbmdzKCkuJyk7XG4gIH1cbn1cbnNldERlcHJlY2F0aW9uV2FybmluZ0ZuKGRlcHJlY2F0aW9uV2Fybik7XG5cbi8qKlxuICogRGlzcG9zZSBhbGwgdmFyaWFibGVzIGtlcHQgaW4gYmFja2VuZCBlbmdpbmUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0Vudmlyb25tZW50J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRpc3Bvc2VWYXJpYWJsZXMoKTogdm9pZCB7XG4gIEVOR0lORS5kaXNwb3NlVmFyaWFibGVzKCk7XG59XG5cbi8qKlxuICogSXQgcmV0dXJucyB0aGUgZ2xvYmFsIGVuZ2luZSB0aGF0IGtlZXBzIHRyYWNrIG9mIGFsbCB0ZW5zb3JzIGFuZCBiYWNrZW5kcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnRW52aXJvbm1lbnQnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZW5naW5lKCk6IEVuZ2luZSB7XG4gIHJldHVybiBFTkdJTkU7XG59XG5cbi8qKlxuICogUmV0dXJucyBtZW1vcnkgaW5mbyBhdCB0aGUgY3VycmVudCB0aW1lIGluIHRoZSBwcm9ncmFtLiBUaGUgcmVzdWx0IGlzIGFuXG4gKiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKlxuICogLSBgbnVtQnl0ZXNgOiBOdW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUuXG4gKiAtIGBudW1UZW5zb3JzYDogTnVtYmVyIG9mIHVuaXF1ZSB0ZW5zb3JzIGFsbG9jYXRlZC5cbiAqIC0gYG51bURhdGFCdWZmZXJzYDogTnVtYmVyIG9mIHVuaXF1ZSBkYXRhIGJ1ZmZlcnMgYWxsb2NhdGVkXG4gKiAgICh1bmRpc3Bvc2VkKSBhdCB0aGlzIHRpbWUsIHdoaWNoIGlzIOKJpCB0aGUgbnVtYmVyIG9mIHRlbnNvcnNcbiAqICAgKGUuZy4gYGEucmVzaGFwZShuZXdTaGFwZSlgIG1ha2VzIGEgbmV3IFRlbnNvciB0aGF0IHNoYXJlcyB0aGUgc2FtZVxuICogICBkYXRhIGJ1ZmZlciB3aXRoIGBhYCkuXG4gKiAtIGB1bnJlbGlhYmxlYDogVHJ1ZSBpZiB0aGUgbWVtb3J5IHVzYWdlIGlzIHVucmVsaWFibGUuIFNlZSBgcmVhc29uc2Agd2hlblxuICogICAgYHVucmVsaWFibGVgIGlzIHRydWUuXG4gKiAtIGByZWFzb25zYDogYHN0cmluZ1tdYCwgcmVhc29ucyB3aHkgdGhlIG1lbW9yeSBpcyB1bnJlbGlhYmxlLCBwcmVzZW50IGlmXG4gKiAgICBgdW5yZWxpYWJsZWAgaXMgdHJ1ZS5cbiAqXG4gKiBXZWJHTCBQcm9wZXJ0aWVzOlxuICogLSBgbnVtQnl0ZXNJbkdQVWA6IE51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgKHVuZGlzcG9zZWQpIGluIHRoZSBHUFUgb25seSBhdFxuICogICAgIHRoaXMgdGltZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnUGVyZm9ybWFuY2UnLCBzdWJoZWFkaW5nOiAnTWVtb3J5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1lbW9yeSgpOiBNZW1vcnlJbmZvIHtcbiAgcmV0dXJuIEVOR0lORS5tZW1vcnkoKTtcbn1cblxuLyoqXG4gKiBFeGVjdXRlcyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXNcbiAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZ1bmN0aW9uJ3MgbWVtb3J5IHVzZTpcbiAqIC0gYG5ld0J5dGVzYDogdGhlIG51bWJlciBvZiBuZXcgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBuZXdUZW5zb3JzYDogdGhlIG51bWJlciBvZiBuZXcgdGVuc29ycyBjcmVhdGVkXG4gKiAtIGBwZWFrQnl0ZXNgOiB0aGUgcGVhayBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkXG4gKiAtIGBrZXJuZWxzYDogYW4gYXJyYXkgb2Ygb2JqZWN0cyBmb3IgZWFjaCBrZXJuZWwgaW52b2x2ZWQgdGhhdCByZXBvcnRzXG4gKiB0aGVpciBpbnB1dCBhbmQgb3V0cHV0IHNoYXBlcywgbnVtYmVyIG9mIGJ5dGVzIHVzZWQsIGFuZCBudW1iZXIgb2YgbmV3XG4gKiB0ZW5zb3JzIGNyZWF0ZWQuXG4gKiAtIGBrZXJuZWxOYW1lc2A6IGFuIGFycmF5IG9mIHVuaXF1ZSBzdHJpbmdzIHdpdGgganVzdCB0aGUgbmFtZXMgb2YgdGhlXG4gKiBrZXJuZWxzIGluIHRoZSBga2VybmVsc2AgYXJyYXkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHByb2ZpbGUgPSBhd2FpdCB0Zi5wcm9maWxlKCgpID0+IHtcbiAqICAgY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiAgIGxldCB4MiA9IHguc3F1YXJlKCk7XG4gKiAgIHgyLmRpc3Bvc2UoKTtcbiAqICAgeDIgPSB4LnNxdWFyZSgpO1xuICogICB4Mi5kaXNwb3NlKCk7XG4gKiAgIHJldHVybiB4O1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coYG5ld0J5dGVzOiAke3Byb2ZpbGUubmV3Qnl0ZXN9YCk7XG4gKiBjb25zb2xlLmxvZyhgbmV3VGVuc29yczogJHtwcm9maWxlLm5ld1RlbnNvcnN9YCk7XG4gKiBjb25zb2xlLmxvZyhgYnl0ZSB1c2FnZSBvdmVyIGFsbCBrZXJuZWxzOiAke3Byb2ZpbGUua2VybmVscy5tYXAoayA9PlxuICogay50b3RhbEJ5dGVzU25hcHNob3QpfWApO1xuICogYGBgXG4gKlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdQcm9maWxlJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByb2ZpbGUoZjogKCkgPT4gKFRlbnNvckNvbnRhaW5lciB8IFByb21pc2U8VGVuc29yQ29udGFpbmVyPikpOlxuICAgIFByb21pc2U8UHJvZmlsZUluZm8+IHtcbiAgcmV0dXJuIEVOR0lORS5wcm9maWxlKGYpO1xufVxuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiBgZm5gIGFuZCBhZnRlciBpdCBpcyBleGVjdXRlZCwgY2xlYW5zIHVwIGFsbFxuICogaW50ZXJtZWRpYXRlIHRlbnNvcnMgYWxsb2NhdGVkIGJ5IGBmbmAgZXhjZXB0IHRob3NlIHJldHVybmVkIGJ5IGBmbmAuXG4gKiBgZm5gIG11c3Qgbm90IHJldHVybiBhIFByb21pc2UgKGFzeW5jIGZ1bmN0aW9ucyBub3QgYWxsb3dlZCkuIFRoZSByZXR1cm5lZFxuICogcmVzdWx0IGNhbiBiZSBhIGNvbXBsZXggb2JqZWN0LlxuICpcbiAqIFVzaW5nIHRoaXMgbWV0aG9kIGhlbHBzIGF2b2lkIG1lbW9yeSBsZWFrcy4gSW4gZ2VuZXJhbCwgd3JhcCBjYWxscyB0b1xuICogb3BlcmF0aW9ucyBpbiBgdGYudGlkeWAgZm9yIGF1dG9tYXRpYyBtZW1vcnkgY2xlYW51cC5cbiAqXG4gKiBOT1RFOiBWYXJpYWJsZXMgZG8gKm5vdCogZ2V0IGNsZWFuZWQgdXAgd2hlbiBpbnNpZGUgYSB0aWR5KCkuIElmIHlvdSB3YW50IHRvXG4gKiBkaXNwb3NlIHZhcmlhYmxlcywgcGxlYXNlIHVzZSBgdGYuZGlzcG9zZVZhcmlhYmxlc2Agb3IgY2FsbCBkaXNwb3NlKClcbiAqIGRpcmVjdGx5IG9uIHZhcmlhYmxlcy5cbiAqXG4gKiBgYGBqc1xuICogLy8geSA9IDIgXiAyICsgMVxuICogY29uc3QgeSA9IHRmLnRpZHkoKCkgPT4ge1xuICogICAvLyBhLCBiLCBhbmQgb25lIHdpbGwgYmUgY2xlYW5lZCB1cCB3aGVuIHRoZSB0aWR5IGVuZHMuXG4gKiAgIGNvbnN0IG9uZSA9IHRmLnNjYWxhcigxKTtcbiAqICAgY29uc3QgYSA9IHRmLnNjYWxhcigyKTtcbiAqICAgY29uc3QgYiA9IGEuc3F1YXJlKCk7XG4gKlxuICogICBjb25zb2xlLmxvZygnbnVtVGVuc29ycyAoaW4gdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqXG4gKiAgIC8vIFRoZSB2YWx1ZSByZXR1cm5lZCBpbnNpZGUgdGhlIHRpZHkgZnVuY3Rpb24gd2lsbCByZXR1cm5cbiAqICAgLy8gdGhyb3VnaCB0aGUgdGlkeSwgaW4gdGhpcyBjYXNlIHRvIHRoZSB2YXJpYWJsZSB5LlxuICogICByZXR1cm4gYi5hZGQob25lKTtcbiAqIH0pO1xuICpcbiAqIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChvdXRzaWRlIHRpZHkpOiAnICsgdGYubWVtb3J5KCkubnVtVGVuc29ycyk7XG4gKiB5LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gbmFtZU9yRm4gVGhlIG5hbWUgb2YgdGhlIGNsb3N1cmUsIG9yIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlLlxuICogICAgIElmIGEgbmFtZSBpcyBwcm92aWRlZCwgdGhlIDJuZCBhcmd1bWVudCBzaG91bGQgYmUgdGhlIGZ1bmN0aW9uLlxuICogICAgIElmIGRlYnVnIG1vZGUgaXMgb24sIHRoZSB0aW1pbmcgYW5kIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgdGhlIGZ1bmN0aW9uXG4gKiAgICAgd2lsbCBiZSB0cmFja2VkIGFuZCBkaXNwbGF5ZWQgb24gdGhlIGNvbnNvbGUgdXNpbmcgdGhlIHByb3ZpZGVkIG5hbWUuXG4gKiBAcGFyYW0gZm4gVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ01lbW9yeSd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aWR5PFQgZXh0ZW5kcyBUZW5zb3JDb250YWluZXI+KFxuICAgIG5hbWVPckZuOiBzdHJpbmd8U2NvcGVGbjxUPiwgZm4/OiBTY29wZUZuPFQ+KTogVCB7XG4gIHJldHVybiBFTkdJTkUudGlkeShuYW1lT3JGbiwgZm4pO1xufVxuXG4vKipcbiAqIERpc3Bvc2VzIGFueSBgdGYuVGVuc29yYHMgZm91bmQgd2l0aGluIHRoZSBwcm92aWRlZCBvYmplY3QuXG4gKlxuICogQHBhcmFtIGNvbnRhaW5lciBhbiBvYmplY3QgdGhhdCBtYXkgYmUgYSBgdGYuVGVuc29yYCBvciBtYXkgZGlyZWN0bHlcbiAqICAgICBjb250YWluIGB0Zi5UZW5zb3Jgcywgc3VjaCBhcyBhIGBUZW5zb3JbXWAgb3IgYHtrZXk6IFRlbnNvciwgLi4ufWAuIElmXG4gKiAgICAgdGhlIG9iamVjdCBpcyBub3QgYSBgdGYuVGVuc29yYCBvciBkb2VzIG5vdCBjb250YWluIGBUZW5zb3JzYCwgbm90aGluZ1xuICogICAgIGhhcHBlbnMuIEluIGdlbmVyYWwgaXQgaXMgc2FmZSB0byBwYXNzIGFueSBvYmplY3QgaGVyZSwgZXhjZXB0IHRoYXRcbiAqICAgICBgUHJvbWlzZWBzIGFyZSBub3Qgc3VwcG9ydGVkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZShjb250YWluZXI6IFRlbnNvckNvbnRhaW5lcikge1xuICBjb25zdCB0ZW5zb3JzID0gZ2V0VGVuc29yc0luQ29udGFpbmVyKGNvbnRhaW5lcik7XG4gIHRlbnNvcnMuZm9yRWFjaCh0ZW5zb3IgPT4gdGVuc29yLmRpc3Bvc2UoKSk7XG59XG5cbi8qKlxuICogS2VlcHMgYSBgdGYuVGVuc29yYCBnZW5lcmF0ZWQgaW5zaWRlIGEgYHRmLnRpZHlgIGZyb20gYmVpbmcgZGlzcG9zZWRcbiAqIGF1dG9tYXRpY2FsbHkuXG4gKlxuICogYGBganNcbiAqIGxldCBiO1xuICogY29uc3QgeSA9IHRmLnRpZHkoKCkgPT4ge1xuICogICBjb25zdCBvbmUgPSB0Zi5zY2FsYXIoMSk7XG4gKiAgIGNvbnN0IGEgPSB0Zi5zY2FsYXIoMik7XG4gKlxuICogICAvLyBiIHdpbGwgbm90IGJlIGNsZWFuZWQgdXAgYnkgdGhlIHRpZHkuIGEgYW5kIG9uZSB3aWxsIGJlIGNsZWFuZWQgdXBcbiAqICAgLy8gd2hlbiB0aGUgdGlkeSBlbmRzLlxuICogICBiID0gdGYua2VlcChhLnNxdWFyZSgpKTtcbiAqXG4gKiAgIGNvbnNvbGUubG9nKCdudW1UZW5zb3JzIChpbiB0aWR5KTogJyArIHRmLm1lbW9yeSgpLm51bVRlbnNvcnMpO1xuICpcbiAqICAgLy8gVGhlIHZhbHVlIHJldHVybmVkIGluc2lkZSB0aGUgdGlkeSBmdW5jdGlvbiB3aWxsIHJldHVyblxuICogICAvLyB0aHJvdWdoIHRoZSB0aWR5LCBpbiB0aGlzIGNhc2UgdG8gdGhlIHZhcmlhYmxlIHkuXG4gKiAgIHJldHVybiBiLmFkZChvbmUpO1xuICogfSk7XG4gKlxuICogY29uc29sZS5sb2coJ251bVRlbnNvcnMgKG91dHNpZGUgdGlkeSk6ICcgKyB0Zi5tZW1vcnkoKS5udW1UZW5zb3JzKTtcbiAqIGNvbnNvbGUubG9nKCd5OicpO1xuICogeS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ2I6Jyk7XG4gKiBiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gcmVzdWx0IFRoZSB0ZW5zb3IgdG8ga2VlcCBmcm9tIGJlaW5nIGRpc3Bvc2VkLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdQZXJmb3JtYW5jZScsIHN1YmhlYWRpbmc6ICdNZW1vcnknfVxuICovXG5leHBvcnQgZnVuY3Rpb24ga2VlcDxUIGV4dGVuZHMgVGVuc29yPihyZXN1bHQ6IFQpOiBUIHtcbiAgcmV0dXJuIEVOR0lORS5rZWVwKHJlc3VsdCk7XG59XG5cbi8qKlxuICogRXhlY3V0ZXMgYGYoKWAgYW5kIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aW1pbmdcbiAqIGluZm9ybWF0aW9uLlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICpcbiAqIC0gYHdhbGxNc2A6IFdhbGwgZXhlY3V0aW9uIHRpbWUuXG4gKiAtIGBrZXJuZWxNc2A6IEtlcm5lbCBleGVjdXRpb24gdGltZSwgaWdub3JpbmcgZGF0YSB0cmFuc2Zlci4gSWYgdXNpbmcgdGhlXG4gKiBXZWJHTCBiYWNrZW5kIGFuZCB0aGUgcXVlcnkgdGltZXIgZXh0ZW5zaW9uIGlzIG5vdCBhdmFpbGFibGUsIHRoaXMgd2lsbFxuICogcmV0dXJuIGFuIGVycm9yIG9iamVjdC5cbiAqIC0gT24gYFdlYkdMYCBUaGUgZm9sbG93aW5nIGFkZGl0aW9uYWwgcHJvcGVydGllcyBleGlzdDpcbiAqICAgLSBgdXBsb2FkV2FpdE1zYDogQ1BVIGJsb2NraW5nIHRpbWUgb24gdGV4dHVyZSB1cGxvYWRzLlxuICogICAtIGBkb3dubG9hZFdhaXRNc2A6IENQVSBibG9ja2luZyB0aW1lIG9uIHRleHR1cmUgZG93bmxvYWRzIChyZWFkUGl4ZWxzKS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnJhbmRvbU5vcm1hbChbMjAsIDIwXSk7XG4gKiBjb25zdCB0aW1lID0gYXdhaXQgdGYudGltZSgoKSA9PiB4Lm1hdE11bCh4KSk7XG4gKlxuICogY29uc29sZS5sb2coYGtlcm5lbE1zOiAke3RpbWUua2VybmVsTXN9LCB3YWxsVGltZU1zOiAke3RpbWUud2FsbE1zfWApO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHRpbWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ1RpbWluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0aW1lKGY6ICgpID0+IHZvaWQpOiBQcm9taXNlPFRpbWluZ0luZm8+IHtcbiAgcmV0dXJuIEVOR0lORS50aW1lKGYpO1xufVxuXG4vKipcbiAqIFNldHMgdGhlIGJhY2tlbmQgKGNwdSwgd2ViZ2wsIHdhc20sIGV0YykgcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRlbnNvcnMgYW5kXG4gKiBleGVjdXRpbmcgb3BlcmF0aW9ucyBvbiB0aG9zZSB0ZW5zb3JzLiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzXG4gKiB0byBhIGJvb2xlYW4gaWYgdGhlIGJhY2tlbmQgaW5pdGlhbGl6YXRpb24gd2FzIHN1Y2Nlc3NmdWwuXG4gKlxuICogTm90ZSB0aGlzIGRpc3Bvc2VzIHRoZSBjdXJyZW50IGJhY2tlbmQsIGlmIGFueSwgYXMgd2VsbCBhcyBhbnkgdGVuc29yc1xuICogYXNzb2NpYXRlZCB3aXRoIGl0LiBBIG5ldyBiYWNrZW5kIGlzIGluaXRpYWxpemVkLCBldmVuIGlmIGl0IGlzIG9mIHRoZVxuICogc2FtZSB0eXBlIGFzIHRoZSBwcmV2aW91cyBvbmUuXG4gKlxuICogQHBhcmFtIGJhY2tlbmROYW1lIFRoZSBuYW1lIG9mIHRoZSBiYWNrZW5kLiBDdXJyZW50bHkgc3VwcG9ydHNcbiAqICAgICBgJ3dlYmdsJ3wnY3B1J2AgaW4gdGhlIGJyb3dzZXIsIGAndGVuc29yZmxvdydgIHVuZGVyIG5vZGUuanNcbiAqICAgICAocmVxdWlyZXMgdGZqcy1ub2RlKSwgYW5kIGAnd2FzbSdgIChyZXF1aXJlcyB0ZmpzLWJhY2tlbmQtd2FzbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldEJhY2tlbmQoYmFja2VuZE5hbWU6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gRU5HSU5FLnNldEJhY2tlbmQoYmFja2VuZE5hbWUpO1xufVxuXG4vKipcbiAqIFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGJhY2tlbmQgKG9yIHRoZVxuICogaGlnaGVzdCBwcmlvcml0eSBvbmUpIGhhcyBpbml0aWFsaXplZC4gQXdhaXQgdGhpcyBwcm9taXNlIHdoZW4geW91IGFyZSB1c2luZ1xuICogYSBiYWNrZW5kIHRoYXQgaGFzIGFzeW5jIGluaXRpYWxpemF0aW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCYWNrZW5kcyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWFkeSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIEVOR0lORS5yZWFkeSgpO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGN1cnJlbnQgYmFja2VuZCBuYW1lIChjcHUsIHdlYmdsLCBldGMpLiBUaGUgYmFja2VuZCBpc1xuICogcmVzcG9uc2libGUgZm9yIGNyZWF0aW5nIHRlbnNvcnMgYW5kIGV4ZWN1dGluZyBvcGVyYXRpb25zIG9uIHRob3NlIHRlbnNvcnMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEJhY2tlbmQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIEVOR0lORS5iYWNrZW5kTmFtZTtcbn1cblxuLyoqXG4gKiBSZW1vdmVzIGEgYmFja2VuZCBhbmQgdGhlIHJlZ2lzdGVyZWQgZmFjdG9yeS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQmFja2VuZHMnfVxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVtb3ZlQmFja2VuZChuYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgRU5HSU5FLnJlbW92ZUJhY2tlbmQobmFtZSk7XG59XG5cbi8qKlxuICogRmluZHMgdGhlIGJhY2tlbmQgcmVnaXN0ZXJlZCB1bmRlciB0aGUgcHJvdmlkZWQgbmFtZS4gUmV0dXJucyBudWxsIGlmIHRoZVxuICogbmFtZSBpcyBub3QgaW4gdGhlIHJlZ2lzdHJ5LCBvciB0aGUgcmVnaXN0cmF0aW9uIGhhc24ndCBmaW5pc2hlZCB5ZXQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQmFja2VuZChuYW1lOiBzdHJpbmcpOiBLZXJuZWxCYWNrZW5kIHtcbiAgcmV0dXJuIEVOR0lORS5maW5kQmFja2VuZChuYW1lKTtcbn1cblxuLyoqXG4gKiBGaW5kcyB0aGUgYmFja2VuZCBmYWN0b3J5IHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHByb3ZpZGVkIG5hbWUuIFJldHVybnMgYVxuICogZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBhIG5ldyBiYWNrZW5kIHdoZW4gY2FsbGVkLiBSZXR1cm5zIG51bGwgaWYgdGhlIG5hbWVcbiAqIGlzIG5vdCBpbiB0aGUgcmVnaXN0cnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQmFja2VuZEZhY3RvcnkobmFtZTogc3RyaW5nKTogKCkgPT5cbiAgICBLZXJuZWxCYWNrZW5kIHwgUHJvbWlzZTxLZXJuZWxCYWNrZW5kPiB7XG4gIHJldHVybiBFTkdJTkUuZmluZEJhY2tlbmRGYWN0b3J5KG5hbWUpO1xufVxuXG4vKipcbiAqIFJlZ2lzdGVycyBhIGdsb2JhbCBiYWNrZW5kLiBUaGUgcmVnaXN0cmF0aW9uIHNob3VsZCBoYXBwZW4gd2hlbiBpbXBvcnRpbmdcbiAqIGEgbW9kdWxlIGZpbGUgKGUuZy4gd2hlbiBpbXBvcnRpbmcgYGJhY2tlbmRfd2ViZ2wudHNgKSwgYW5kIGlzIHVzZWQgZm9yXG4gKiBtb2R1bGFyIGJ1aWxkcyAoZS5nLiBjdXN0b20gdGZqcyBidW5kbGUgd2l0aCBvbmx5IHdlYmdsIHN1cHBvcnQpLlxuICpcbiAqIEBwYXJhbSBmYWN0b3J5IFRoZSBiYWNrZW5kIGZhY3RvcnkgZnVuY3Rpb24uIFdoZW4gY2FsbGVkLCBpdCBzaG91bGRcbiAqIHJldHVybiBhIGJhY2tlbmQgaW5zdGFuY2UsIG9yIGEgcHJvbWlzZSBvZiBhbiBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwcmlvcml0eSBUaGUgcHJpb3JpdHkgb2YgdGhlIGJhY2tlbmQgKGhpZ2hlciA9IG1vcmUgaW1wb3J0YW50KS5cbiAqICAgICBJbiBjYXNlIG11bHRpcGxlIGJhY2tlbmRzIGFyZSByZWdpc3RlcmVkLCB0aGUgcHJpb3JpdHkgaXMgdXNlZCB0byBmaW5kXG4gKiAgICAgdGhlIGJlc3QgYmFja2VuZC4gRGVmYXVsdHMgdG8gMS5cbiAqIEByZXR1cm4gRmFsc2UgaWYgdGhlcmUgaXMgYWxyZWFkeSBhIHJlZ2lzdGVyZWQgYmFja2VuZCB1bmRlciB0aGlzIG5hbWUsIHRydWVcbiAqICAgICBpZiBub3QuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyQmFja2VuZChcbiAgICBuYW1lOiBzdHJpbmcsIGZhY3Rvcnk6ICgpID0+IEtlcm5lbEJhY2tlbmQgfCBQcm9taXNlPEtlcm5lbEJhY2tlbmQ+LFxuICAgIHByaW9yaXR5ID0gMSk6IGJvb2xlYW4ge1xuICByZXR1cm4gRU5HSU5FLnJlZ2lzdGVyQmFja2VuZChuYW1lLCBmYWN0b3J5LCBwcmlvcml0eSk7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgY3VycmVudCBiYWNrZW5kLiBJZiBubyBiYWNrZW5kcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQsIHRoaXMgd2lsbFxuICogYXR0ZW1wdCB0byBpbml0aWFsaXplIHRoZSBiZXN0IGJhY2tlbmQuIFdpbGwgdGhyb3cgYW4gZXJyb3IgaWYgdGhlIGhpZ2hlc3RcbiAqIHByaW9yaXR5IGJhY2tlbmQgaGFzIGFzeW5jIGluaXRpYWxpemF0aW9uLCBpbiB3aGljaCBjYXNlIHlvdSBzaG91bGQgY2FsbFxuICogJ2F3YWl0IHRmLnJlYWR5KCknIGJlZm9yZSBydW5uaW5nIG90aGVyIGNvZGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ0JhY2tlbmRzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhY2tlbmQoKTogS2VybmVsQmFja2VuZCB7XG4gIHJldHVybiBFTkdJTkUuYmFja2VuZDtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBnbG9iYWwgcGxhdGZvcm0uXG4gKlxuICogQHBhcmFtIHBsYXRmb3JtTmFtZSBUaGUgbmFtZSBvZiB0aGlzIHBsYXRmb3JtLlxuICogQHBhcmFtIHBsYXRmb3JtIEEgcGxhdGZvcm0gaW1wbGVtZW50YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRQbGF0Zm9ybShwbGF0Zm9ybU5hbWU6IHN0cmluZywgcGxhdGZvcm06IFBsYXRmb3JtKSB7XG4gIGVudigpLnNldFBsYXRmb3JtKHBsYXRmb3JtTmFtZSwgcGxhdGZvcm0pO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Imag } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the imaginary part of a complex (or real) tensor.\n *\n * Given a tensor input, this operation returns a tensor of type float that is\n * the imaginary part of each element in input considered as a complex number.\n * If input is real, a tensor of all zeros is returned.\n *\n * ```js\n * const x = tf.complex([-2.25, 3.25], [4.75, 5.75]);\n * tf.imag(x).print();\n * ```\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction imag_(input) {\n    const $input = convertToTensor(input, 'input', 'imag');\n    const inputs = { input: $input };\n    return ENGINE.runKernel(Imag, inputs);\n}\nexport const imag = op({ imag_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ltYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsS0FBSyxDQUFtQixLQUFtQjtJQUNsRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUV2RCxNQUFNLE1BQU0sR0FBZSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQztJQUMzQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtJbWFnLCBJbWFnSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbi8qKlxuICogUmV0dXJucyB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgYSBjb21wbGV4IChvciByZWFsKSB0ZW5zb3IuXG4gKlxuICogR2l2ZW4gYSB0ZW5zb3IgaW5wdXQsIHRoaXMgb3BlcmF0aW9uIHJldHVybnMgYSB0ZW5zb3Igb2YgdHlwZSBmbG9hdCB0aGF0IGlzXG4gKiB0aGUgaW1hZ2luYXJ5IHBhcnQgb2YgZWFjaCBlbGVtZW50IGluIGlucHV0IGNvbnNpZGVyZWQgYXMgYSBjb21wbGV4IG51bWJlci5cbiAqIElmIGlucHV0IGlzIHJlYWwsIGEgdGVuc29yIG9mIGFsbCB6ZXJvcyBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgoWy0yLjI1LCAzLjI1XSwgWzQuNzUsIDUuNzVdKTtcbiAqIHRmLmltYWcoeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gaW1hZ188VCBleHRlbmRzIFRlbnNvcj4oaW5wdXQ6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdpbWFnJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBJbWFnSW5wdXRzID0ge2lucHV0OiAkaW5wdXR9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJbWFnLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgaW1hZyA9IG9wKHtpbWFnX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Neg } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes `-1 * x` element-wise.\n *\n * ```js\n * const x = tf.tensor2d([1, 2, -2, 0], [2, 2]);\n *\n * x.neg().print();  // or tf.neg(x)\n * ```\n *\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction neg_(x) {\n    const $x = convertToTensor(x, 'x', 'neg');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Neg, inputs);\n}\nexport const neg = op({ neg_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbmVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsSUFBSSxDQUFtQixDQUFlO0lBQzdDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge05lZywgTmVnSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGAtMSAqIHhgIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAtMiwgMF0sIFsyLCAyXSk7XG4gKlxuICogeC5uZWcoKS5wcmludCgpOyAgLy8gb3IgdGYubmVnKHgpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBuZWdfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICduZWcnKTtcblxuICBjb25zdCBpbnB1dHM6IE5lZ0lucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE5lZywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBuZWcgPSBvcCh7bmVnX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Real } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the real part of a complex (or real) tensor.\n *\n * Given a tensor input, this operation returns a tensor of type float that is\n * the real part of each element in input considered as a complex number.\n *\n * If the input is real, it simply makes a clone.\n *\n * ```js\n * const x = tf.complex([-2.25, 3.25], [4.75, 5.75]);\n * tf.real(x).print();\n * ```\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction real_(input) {\n    const $input = convertToTensor(input, 'input', 'real');\n    const inputs = { input: $input };\n    return ENGINE.runKernel(Real, inputs);\n}\nexport const real = op({ real_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JlYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsS0FBbUI7SUFDbEQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFdkQsTUFBTSxNQUFNLEdBQWUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDM0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVhbCwgUmVhbElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgcmVhbCBwYXJ0IG9mIGEgY29tcGxleCAob3IgcmVhbCkgdGVuc29yLlxuICpcbiAqIEdpdmVuIGEgdGVuc29yIGlucHV0LCB0aGlzIG9wZXJhdGlvbiByZXR1cm5zIGEgdGVuc29yIG9mIHR5cGUgZmxvYXQgdGhhdCBpc1xuICogdGhlIHJlYWwgcGFydCBvZiBlYWNoIGVsZW1lbnQgaW4gaW5wdXQgY29uc2lkZXJlZCBhcyBhIGNvbXBsZXggbnVtYmVyLlxuICpcbiAqIElmIHRoZSBpbnB1dCBpcyByZWFsLCBpdCBzaW1wbHkgbWFrZXMgYSBjbG9uZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgoWy0yLjI1LCAzLjI1XSwgWzQuNzUsIDUuNzVdKTtcbiAqIHRmLnJlYWwoeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gcmVhbF88VCBleHRlbmRzIFRlbnNvcj4oaW5wdXQ6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdyZWFsJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBSZWFsSW5wdXRzID0ge2lucHV0OiAkaW5wdXR9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSZWFsLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgcmVhbCA9IG9wKHtyZWFsX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { tidy } from '../globals';\nimport { Transpose } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { complex } from './complex';\nimport { imag } from './imag';\nimport { neg } from './neg';\nimport { op } from './operation';\nimport { real } from './real';\n/**\n * Transposes the `tf.Tensor`. Permutes the dimensions according to `perm`.\n *\n * The returned `tf.Tensor`'s dimension `i` will correspond to the input\n * dimension `perm[i]`. If `perm` is not given, it is set to `[n-1...0]`,\n * where `n` is the rank of the input `tf.Tensor`. Hence by default, this\n * operation performs a regular matrix transpose on 2-D input `tf.Tensor`s.\n *\n * ```js\n * const a = tf.tensor2d([1, 2, 3, 4, 5, 6], [2, 3]);\n *\n * a.transpose().print();  // or tf.transpose(a)\n * ```\n *\n * @param x The tensor to transpose.\n * @param perm The permutation of the dimensions of a.\n * @param conjugate Will conjugate complex input if true.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction transpose_(x, perm, conjugate) {\n    const $x = convertToTensor(x, 'x', 'transpose');\n    if (perm == null) {\n        perm = $x.shape.map((s, i) => i).reverse();\n    }\n    util.assert($x.rank === perm.length, () => `Error in transpose: rank of input ${$x.rank} ` +\n        `must match length of perm ${perm}.`);\n    perm.forEach(axis => {\n        util.assert(axis >= 0 && axis < $x.rank, () => `All entries in 'perm' must be between 0 and ${$x.rank - 1}` +\n            ` but got ${perm}`);\n    });\n    if ($x.rank <= 1) {\n        return $x.clone();\n    }\n    const inputs = { x: $x };\n    const attrs = { perm };\n    if ($x.dtype === 'complex64') {\n        return tidy(() => {\n            let $real = real($x);\n            let $imag = imag($x);\n            $real = ENGINE.runKernel(Transpose, { x: $real }, attrs);\n            $imag = ENGINE.runKernel(Transpose, { x: $imag }, attrs);\n            if (conjugate) {\n                $imag = neg($imag);\n            }\n            return complex($real, $imag);\n        });\n    }\n    return ENGINE.runKernel(Transpose, inputs, attrs);\n}\nexport const transpose = op({ transpose_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdHJhbnNwb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNoQyxPQUFPLEVBQUMsU0FBUyxFQUFrQyxNQUFNLGlCQUFpQixDQUFDO0FBSTNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxTQUFTLFVBQVUsQ0FDZixDQUFlLEVBQUUsSUFBZSxFQUFFLFNBQW1CO0lBQ3ZELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRWhELElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtRQUNoQixJQUFJLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUM1QztJQUNELElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsTUFBTSxFQUN2QixHQUFHLEVBQUUsQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDLElBQUksR0FBRztRQUNqRCw2QkFBNkIsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM5QyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1FBQ2xCLElBQUksQ0FBQyxNQUFNLENBQ1AsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEdBQUcsRUFBRSxDQUFDLElBQUksRUFDM0IsR0FBRyxFQUFFLENBQUMsK0NBQStDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQzlELFlBQVksSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5QixDQUFDLENBQUMsQ0FBQztJQUVILElBQUksRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUU7UUFDaEIsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDbkI7SUFFRCxNQUFNLE1BQU0sR0FBb0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDeEMsTUFBTSxLQUFLLEdBQW1CLEVBQUMsSUFBSSxFQUFDLENBQUM7SUFFckMsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUM1QixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLEtBQUssR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDckIsSUFBSSxLQUFLLEdBQUcsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ3JCLEtBQUssR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNwQixTQUFTLEVBQUUsRUFBQyxDQUFDLEVBQUUsS0FBSyxFQUF5QixFQUM3QyxLQUEyQixDQUFDLENBQUM7WUFDakMsS0FBSyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ3BCLFNBQVMsRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQXlCLEVBQzdDLEtBQTJCLENBQUMsQ0FBQztZQUNqQyxJQUFJLFNBQVMsRUFBRTtnQkFDYixLQUFLLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3BCO1lBQ0QsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFNBQVMsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHt0aWR5fSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7VHJhbnNwb3NlLCBUcmFuc3Bvc2VBdHRycywgVHJhbnNwb3NlSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9jb21wbGV4JztcbmltcG9ydCB7aW1hZ30gZnJvbSAnLi9pbWFnJztcbmltcG9ydCB7bmVnfSBmcm9tICcuL25lZyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vcmVhbCc7XG5cbi8qKlxuICogVHJhbnNwb3NlcyB0aGUgYHRmLlRlbnNvcmAuIFBlcm11dGVzIHRoZSBkaW1lbnNpb25zIGFjY29yZGluZyB0byBgcGVybWAuXG4gKlxuICogVGhlIHJldHVybmVkIGB0Zi5UZW5zb3JgJ3MgZGltZW5zaW9uIGBpYCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlIGlucHV0XG4gKiBkaW1lbnNpb24gYHBlcm1baV1gLiBJZiBgcGVybWAgaXMgbm90IGdpdmVuLCBpdCBpcyBzZXQgdG8gYFtuLTEuLi4wXWAsXG4gKiB3aGVyZSBgbmAgaXMgdGhlIHJhbmsgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgLiBIZW5jZSBieSBkZWZhdWx0LCB0aGlzXG4gKiBvcGVyYXRpb24gcGVyZm9ybXMgYSByZWd1bGFyIG1hdHJpeCB0cmFuc3Bvc2Ugb24gMi1EIGlucHV0IGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2XSwgWzIsIDNdKTtcbiAqXG4gKiBhLnRyYW5zcG9zZSgpLnByaW50KCk7ICAvLyBvciB0Zi50cmFuc3Bvc2UoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSB0ZW5zb3IgdG8gdHJhbnNwb3NlLlxuICogQHBhcmFtIHBlcm0gVGhlIHBlcm11dGF0aW9uIG9mIHRoZSBkaW1lbnNpb25zIG9mIGEuXG4gKiBAcGFyYW0gY29uanVnYXRlIFdpbGwgY29uanVnYXRlIGNvbXBsZXggaW5wdXQgaWYgdHJ1ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNYXRyaWNlcyd9XG4gKi9cbmZ1bmN0aW9uIHRyYW5zcG9zZV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBwZXJtPzogbnVtYmVyW10sIGNvbmp1Z2F0ZT86IGJvb2xlYW4pOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndHJhbnNwb3NlJyk7XG5cbiAgaWYgKHBlcm0gPT0gbnVsbCkge1xuICAgIHBlcm0gPSAkeC5zaGFwZS5tYXAoKHMsIGkpID0+IGkpLnJldmVyc2UoKTtcbiAgfVxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IHBlcm0ubGVuZ3RoLFxuICAgICAgKCkgPT4gYEVycm9yIGluIHRyYW5zcG9zZTogcmFuayBvZiBpbnB1dCAkeyR4LnJhbmt9IGAgK1xuICAgICAgICAgIGBtdXN0IG1hdGNoIGxlbmd0aCBvZiBwZXJtICR7cGVybX0uYCk7XG4gIHBlcm0uZm9yRWFjaChheGlzID0+IHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgYXhpcyA+PSAwICYmIGF4aXMgPCAkeC5yYW5rLFxuICAgICAgICAoKSA9PiBgQWxsIGVudHJpZXMgaW4gJ3Blcm0nIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAkeyR4LnJhbmsgLSAxfWAgK1xuICAgICAgICAgICAgYCBidXQgZ290ICR7cGVybX1gKTtcbiAgfSk7XG5cbiAgaWYgKCR4LnJhbmsgPD0gMSkge1xuICAgIHJldHVybiAkeC5jbG9uZSgpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBUcmFuc3Bvc2VJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogVHJhbnNwb3NlQXR0cnMgPSB7cGVybX07XG5cbiAgaWYgKCR4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCAkcmVhbCA9IHJlYWwoJHgpO1xuICAgICAgbGV0ICRpbWFnID0gaW1hZygkeCk7XG4gICAgICAkcmVhbCA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgVHJhbnNwb3NlLCB7eDogJHJlYWx9IGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gICAgICAkaW1hZyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgVHJhbnNwb3NlLCB7eDogJGltYWd9IGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gICAgICBpZiAoY29uanVnYXRlKSB7XG4gICAgICAgICRpbWFnID0gbmVnKCRpbWFnKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBjb21wbGV4KCRyZWFsLCAkaW1hZyk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFRyYW5zcG9zZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNwb3NlID0gb3Aoe3RyYW5zcG9zZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Returns the dimensions in the input shape that are broadcasted to\n * produce the provided output shape.\n *\n * The returned dimensions are 0-indexed and sorted. An example:\n * inShape = [4, 1, 3]\n * outShape = [5, 4, 3, 3]\n * result = [1]. Dimension 1 (2nd dimension of input) gets broadcasted 1 => 3.\n */\nexport function getBroadcastDims(inShape, outShape) {\n    const inRank = inShape.length;\n    const dims = [];\n    for (let i = 0; i < inRank; i++) {\n        const dim = inRank - 1 - i;\n        const a = inShape[dim] || 1;\n        const b = outShape[outShape.length - 1 - i] || 1;\n        if (b > 1 && a === 1) {\n            dims.unshift(dim);\n        }\n    }\n    return dims;\n}\n/**\n * Returns the axes in the output space that should be reduced to produce\n * the input space.\n */\nexport function getReductionAxes(inShape, outShape) {\n    const result = [];\n    for (let i = 0; i < outShape.length; i++) {\n        const inDim = inShape[inShape.length - i - 1];\n        const outAxis = outShape.length - i - 1;\n        const outDim = outShape[outAxis];\n        if (inDim == null || (inDim === 1 && outDim > 1)) {\n            result.unshift(outAxis);\n        }\n    }\n    return result;\n}\nexport function assertAndGetBroadcastShape(shapeA, shapeB) {\n    const result = [];\n    const l = Math.max(shapeA.length, shapeB.length);\n    for (let i = 0; i < l; i++) {\n        let a = shapeA[shapeA.length - i - 1];\n        if (a == null) {\n            a = 1;\n        }\n        let b = shapeB[shapeB.length - i - 1];\n        if (b == null) {\n            b = 1;\n        }\n        if (a === 1) {\n            result.unshift(b);\n        }\n        else if (b === 1) {\n            result.unshift(a);\n        }\n        else if (a !== b) {\n            const errMsg = `Operands could not be broadcast together with shapes ` +\n                `${shapeA} and ${shapeB}.`;\n            throw Error(errMsg);\n        }\n        else {\n            result.unshift(a);\n        }\n    }\n    return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9icm9hZGNhc3RfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsT0FBaUIsRUFBRSxRQUFrQjtJQUN2QyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO0lBQzlCLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQy9CLE1BQU0sR0FBRyxHQUFHLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDNUIsTUFBTSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ25CO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLE9BQWlCLEVBQUUsUUFBa0I7SUFDdkMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksS0FBSyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxDQUFDLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFO1lBQ2hELE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDekI7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsMEJBQTBCLENBQ3RDLE1BQWdCLEVBQUUsTUFBZ0I7SUFDcEMsTUFBTSxNQUFNLEdBQWEsRUFBRSxDQUFDO0lBQzVCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFakQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixJQUFJLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNQO1FBQ0QsSUFBSSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNiLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDUDtRQUNELElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNYLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbkI7YUFBTSxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQjthQUFNLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNsQixNQUFNLE1BQU0sR0FBRyx1REFBdUQ7Z0JBQ2xFLEdBQUcsTUFBTSxRQUFRLE1BQU0sR0FBRyxDQUFDO1lBQy9CLE1BQU0sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3JCO2FBQU07WUFDTCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25CO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGlucHV0IHNoYXBlIHRoYXQgYXJlIGJyb2FkY2FzdGVkIHRvXG4gKiBwcm9kdWNlIHRoZSBwcm92aWRlZCBvdXRwdXQgc2hhcGUuXG4gKlxuICogVGhlIHJldHVybmVkIGRpbWVuc2lvbnMgYXJlIDAtaW5kZXhlZCBhbmQgc29ydGVkLiBBbiBleGFtcGxlOlxuICogaW5TaGFwZSA9IFs0LCAxLCAzXVxuICogb3V0U2hhcGUgPSBbNSwgNCwgMywgM11cbiAqIHJlc3VsdCA9IFsxXS4gRGltZW5zaW9uIDEgKDJuZCBkaW1lbnNpb24gb2YgaW5wdXQpIGdldHMgYnJvYWRjYXN0ZWQgMSA9PiAzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0QnJvYWRjYXN0RGltcyhcbiAgICBpblNoYXBlOiBudW1iZXJbXSwgb3V0U2hhcGU6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBpblJhbmsgPSBpblNoYXBlLmxlbmd0aDtcbiAgY29uc3QgZGltczogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpblJhbms7IGkrKykge1xuICAgIGNvbnN0IGRpbSA9IGluUmFuayAtIDEgLSBpO1xuICAgIGNvbnN0IGEgPSBpblNoYXBlW2RpbV0gfHwgMTtcbiAgICBjb25zdCBiID0gb3V0U2hhcGVbb3V0U2hhcGUubGVuZ3RoIC0gMSAtIGldIHx8IDE7XG4gICAgaWYgKGIgPiAxICYmIGEgPT09IDEpIHtcbiAgICAgIGRpbXMudW5zaGlmdChkaW0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGltcztcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBheGVzIGluIHRoZSBvdXRwdXQgc3BhY2UgdGhhdCBzaG91bGQgYmUgcmVkdWNlZCB0byBwcm9kdWNlXG4gKiB0aGUgaW5wdXQgc3BhY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWR1Y3Rpb25BeGVzKFxuICAgIGluU2hhcGU6IG51bWJlcltdLCBvdXRTaGFwZTogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGluRGltID0gaW5TaGFwZVtpblNoYXBlLmxlbmd0aCAtIGkgLSAxXTtcbiAgICBjb25zdCBvdXRBeGlzID0gb3V0U2hhcGUubGVuZ3RoIC0gaSAtIDE7XG4gICAgY29uc3Qgb3V0RGltID0gb3V0U2hhcGVbb3V0QXhpc107XG4gICAgaWYgKGluRGltID09IG51bGwgfHwgKGluRGltID09PSAxICYmIG91dERpbSA+IDEpKSB7XG4gICAgICByZXN1bHQudW5zaGlmdChvdXRBeGlzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKFxuICAgIHNoYXBlQTogbnVtYmVyW10sIHNoYXBlQjogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgbCA9IE1hdGgubWF4KHNoYXBlQS5sZW5ndGgsIHNoYXBlQi5sZW5ndGgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgbGV0IGEgPSBzaGFwZUFbc2hhcGVBLmxlbmd0aCAtIGkgLSAxXTtcbiAgICBpZiAoYSA9PSBudWxsKSB7XG4gICAgICBhID0gMTtcbiAgICB9XG4gICAgbGV0IGIgPSBzaGFwZUJbc2hhcGVCLmxlbmd0aCAtIGkgLSAxXTtcbiAgICBpZiAoYiA9PSBudWxsKSB7XG4gICAgICBiID0gMTtcbiAgICB9XG4gICAgaWYgKGEgPT09IDEpIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KGIpO1xuICAgIH0gZWxzZSBpZiAoYiA9PT0gMSkge1xuICAgICAgcmVzdWx0LnVuc2hpZnQoYSk7XG4gICAgfSBlbHNlIGlmIChhICE9PSBiKSB7XG4gICAgICBjb25zdCBlcnJNc2cgPSBgT3BlcmFuZHMgY291bGQgbm90IGJlIGJyb2FkY2FzdCB0b2dldGhlciB3aXRoIHNoYXBlcyBgICtcbiAgICAgICAgICBgJHtzaGFwZUF9IGFuZCAke3NoYXBlQn0uYDtcbiAgICAgIHRocm93IEVycm9yKGVyck1zZyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdC51bnNoaWZ0KGEpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-3 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor3d` as it makes the code more readable.\n *\n *  ```js\n * // Pass a nested array.\n * tf.tensor3d([[[1], [2]], [[3], [4]]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor3d([1, 2, 3, 4], [2, 2, 1]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n *     or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. If not provided,  it is inferred from\n *     `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor3d(values, shape, dtype) {\n    assertNonNull(values);\n    if (shape != null && shape.length !== 3) {\n        throw new Error('tensor3d() requires shape to have three numbers');\n    }\n    const inferredShape = inferShape(values, dtype);\n    if (inferredShape.length !== 3 && inferredShape.length !== 1) {\n        throw new Error('tensor3d() requires values to be number[][][] or flat/TypedArray');\n    }\n    if (inferredShape.length === 1 && shape == null) {\n        throw new Error('tensor3d() requires shape to be provided when `values` ' +\n            'are a flat array');\n    }\n    return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3IzZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUFFLEtBQWdDLEVBQ3RELEtBQWdCO0lBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsa0VBQWtFLENBQUMsQ0FBQztLQUN6RTtJQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFhLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IzRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZTNEfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydE5vbk51bGx9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHttYWtlVGVuc29yfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlcyByYW5rLTMgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yM2RgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yM2QoW1tbMV0sIFsyXV0sIFtbM10sIFs0XV1dKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZS5cbiAqIHRmLnRlbnNvcjNkKFsxLCAyLCAzLCA0XSwgWzIsIDIsIDFdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBJZiBub3QgcHJvdmlkZWQsICBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IzZChcbiAgICB2YWx1ZXM6IFRlbnNvckxpa2UzRCwgc2hhcGU/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvcjNEIHtcbiAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICBpZiAoc2hhcGUgIT0gbnVsbCAmJiBzaGFwZS5sZW5ndGggIT09IDMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RlbnNvcjNkKCkgcmVxdWlyZXMgc2hhcGUgdG8gaGF2ZSB0aHJlZSBudW1iZXJzJyk7XG4gIH1cbiAgY29uc3QgaW5mZXJyZWRTaGFwZSA9IGluZmVyU2hhcGUodmFsdWVzLCBkdHlwZSk7XG4gIGlmIChpbmZlcnJlZFNoYXBlLmxlbmd0aCAhPT0gMyAmJiBpbmZlcnJlZFNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RlbnNvcjNkKCkgcmVxdWlyZXMgdmFsdWVzIHRvIGJlIG51bWJlcltdW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgfVxuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RlbnNvcjNkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgfVxuICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSkgYXMgVGVuc29yM0Q7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { env } from '../environment';\nimport { FromPixels } from '../kernel_names';\nimport { getKernel } from '../kernel_registry';\nimport { Tensor } from '../tensor';\nimport { convertToTensor } from '../tensor_util_env';\nimport { cast } from './cast';\nimport { op } from './operation';\nimport { tensor3d } from './tensor3d';\nlet fromPixels2DContext;\n/**\n * Creates a `tf.Tensor` from an image.\n *\n * ```js\n * const image = new ImageData(1, 1);\n * image.data[0] = 100;\n * image.data[1] = 150;\n * image.data[2] = 200;\n * image.data[3] = 255;\n *\n * tf.browser.fromPixels(image).print();\n * ```\n *\n * @param pixels The input image to construct the tensor from. The\n * supported image types are all 4-channel. You can also pass in an image\n * object with following attributes:\n * `{data: Uint8Array; width: number; height: number}`\n * @param numChannels The number of channels of the output tensor. A\n * numChannels value less than 4 allows you to ignore channels. Defaults to\n * 3 (ignores alpha channel of input image).\n *\n * @returns A Tensor3D with the shape `[height, width, numChannels]`.\n *\n * Note: fromPixels can be lossy in some cases, same image may result in\n * slightly different tensor values, if rendered by different rendering\n * engines. This means that results from different browsers, or even same\n * browser with CPU and GPU rendering engines can be different. See discussion\n * in details:\n * https://github.com/tensorflow/tfjs/issues/5482\n *\n * @doc {heading: 'Browser', namespace: 'browser', ignoreCI: true}\n */\nfunction fromPixels_(pixels, numChannels = 3) {\n    // Sanity checks.\n    if (numChannels > 4) {\n        throw new Error('Cannot construct Tensor with more than 4 channels from pixels.');\n    }\n    if (pixels == null) {\n        throw new Error('pixels passed to tf.browser.fromPixels() can not be null');\n    }\n    let isPixelData = false;\n    let isImageData = false;\n    let isVideo = false;\n    let isImage = false;\n    let isCanvasLike = false;\n    let isImageBitmap = false;\n    if (pixels.data instanceof Uint8Array) {\n        isPixelData = true;\n    }\n    else if (typeof (ImageData) !== 'undefined' && pixels instanceof ImageData) {\n        isImageData = true;\n    }\n    else if (typeof (HTMLVideoElement) !== 'undefined' &&\n        pixels instanceof HTMLVideoElement) {\n        isVideo = true;\n    }\n    else if (typeof (HTMLImageElement) !== 'undefined' &&\n        pixels instanceof HTMLImageElement) {\n        isImage = true;\n        // tslint:disable-next-line: no-any\n    }\n    else if (pixels.getContext != null) {\n        isCanvasLike = true;\n    }\n    else if (typeof (ImageBitmap) !== 'undefined' && pixels instanceof ImageBitmap) {\n        isImageBitmap = true;\n    }\n    else {\n        throw new Error('pixels passed to tf.browser.fromPixels() must be either an ' +\n            `HTMLVideoElement, HTMLImageElement, HTMLCanvasElement, ImageData ` +\n            `in browser, or OffscreenCanvas, ImageData in webworker` +\n            ` or {data: Uint32Array, width: number, height: number}, ` +\n            `but was ${pixels.constructor.name}`);\n    }\n    // If the current backend has 'FromPixels' registered, it has a more\n    // efficient way of handling pixel uploads, so we call that.\n    const kernel = getKernel(FromPixels, ENGINE.backendName);\n    if (kernel != null) {\n        const inputs = { pixels };\n        const attrs = { numChannels };\n        return ENGINE.runKernel(FromPixels, inputs, attrs);\n    }\n    const [width, height] = isVideo ?\n        [\n            pixels.videoWidth,\n            pixels.videoHeight\n        ] :\n        [pixels.width, pixels.height];\n    let vals;\n    if (isCanvasLike) {\n        vals =\n            // tslint:disable-next-line:no-any\n            pixels.getContext('2d').getImageData(0, 0, width, height).data;\n    }\n    else if (isImageData || isPixelData) {\n        vals = pixels.data;\n    }\n    else if (isImage || isVideo || isImageBitmap) {\n        if (fromPixels2DContext == null) {\n            if (typeof document === 'undefined') {\n                if (typeof OffscreenCanvas !== 'undefined' &&\n                    typeof OffscreenCanvasRenderingContext2D !== 'undefined') {\n                    // @ts-ignore\n                    fromPixels2DContext = new OffscreenCanvas(1, 1).getContext('2d');\n                }\n                else {\n                    throw new Error('Cannot parse input in current context. ' +\n                        'Reason: OffscreenCanvas Context2D rendering is not supported.');\n                }\n            }\n            else {\n                fromPixels2DContext =\n                    document.createElement('canvas').getContext('2d', { willReadFrequently: true });\n            }\n        }\n        fromPixels2DContext.canvas.width = width;\n        fromPixels2DContext.canvas.height = height;\n        fromPixels2DContext.drawImage(pixels, 0, 0, width, height);\n        vals = fromPixels2DContext.getImageData(0, 0, width, height).data;\n    }\n    let values;\n    if (numChannels === 4) {\n        values = new Int32Array(vals);\n    }\n    else {\n        const numPixels = width * height;\n        values = new Int32Array(numPixels * numChannels);\n        for (let i = 0; i < numPixels; i++) {\n            for (let channel = 0; channel < numChannels; ++channel) {\n                values[i * numChannels + channel] = vals[i * 4 + channel];\n            }\n        }\n    }\n    const outShape = [height, width, numChannels];\n    return tensor3d(values, outShape, 'int32');\n}\n// Helper functions for |fromPixelsAsync| to check whether the input can\n// be wrapped into imageBitmap.\nfunction isPixelData(pixels) {\n    return (pixels != null) && (pixels.data instanceof Uint8Array);\n}\nfunction isImageBitmapFullySupported() {\n    return typeof window !== 'undefined' &&\n        typeof (ImageBitmap) !== 'undefined' &&\n        window.hasOwnProperty('createImageBitmap');\n}\nfunction isNonEmptyPixels(pixels) {\n    return pixels != null && pixels.width !== 0 && pixels.height !== 0;\n}\nfunction canWrapPixelsToImageBitmap(pixels) {\n    return isImageBitmapFullySupported() && !(pixels instanceof ImageBitmap) &&\n        isNonEmptyPixels(pixels) && !isPixelData(pixels);\n}\n/**\n * Creates a `tf.Tensor` from an image in async way.\n *\n * ```js\n * const image = new ImageData(1, 1);\n * image.data[0] = 100;\n * image.data[1] = 150;\n * image.data[2] = 200;\n * image.data[3] = 255;\n *\n * (await tf.browser.fromPixelsAsync(image)).print();\n * ```\n * This API is the async version of fromPixels. The API will first\n * check |WRAP_TO_IMAGEBITMAP| flag, and try to wrap the input to\n * imageBitmap if the flag is set to true.\n *\n * @param pixels The input image to construct the tensor from. The\n * supported image types are all 4-channel. You can also pass in an image\n * object with following attributes:\n * `{data: Uint8Array; width: number; height: number}`\n * @param numChannels The number of channels of the output tensor. A\n * numChannels value less than 4 allows you to ignore channels. Defaults to\n * 3 (ignores alpha channel of input image).\n *\n * @doc {heading: 'Browser', namespace: 'browser', ignoreCI: true}\n */\nexport async function fromPixelsAsync(pixels, numChannels = 3) {\n    let inputs = null;\n    // Check whether the backend needs to wrap |pixels| to imageBitmap and\n    // whether |pixels| can be wrapped to imageBitmap.\n    if (env().getBool('WRAP_TO_IMAGEBITMAP') &&\n        canWrapPixelsToImageBitmap(pixels)) {\n        // Force the imageBitmap creation to not do any premultiply alpha\n        // ops.\n        let imageBitmap;\n        try {\n            // wrap in try-catch block, because createImageBitmap may not work\n            // properly in some browsers, e.g.\n            // https://bugzilla.mozilla.org/show_bug.cgi?id=1335594\n            // tslint:disable-next-line: no-any\n            imageBitmap = await createImageBitmap(pixels, { premultiplyAlpha: 'none' });\n        }\n        catch (e) {\n            imageBitmap = null;\n        }\n        // createImageBitmap will clip the source size.\n        // In some cases, the input will have larger size than its content.\n        // E.g. new Image(10, 10) but with 1 x 1 content. Using\n        // createImageBitmap will clip the size from 10 x 10 to 1 x 1, which\n        // is not correct. We should avoid wrapping such resouce to\n        // imageBitmap.\n        if (imageBitmap != null && imageBitmap.width === pixels.width &&\n            imageBitmap.height === pixels.height) {\n            inputs = imageBitmap;\n        }\n        else {\n            inputs = pixels;\n        }\n    }\n    else {\n        inputs = pixels;\n    }\n    return fromPixels_(inputs, numChannels);\n}\n/**\n * Draws a `tf.Tensor` of pixel values to a byte array or optionally a\n * canvas.\n *\n * When the dtype of the input is 'float32', we assume values in the range\n * [0-1]. Otherwise, when input is 'int32', we assume values in the range\n * [0-255].\n *\n * Returns a promise that resolves when the canvas has been drawn to.\n *\n * @param img A rank-2 tensor with shape `[height, width]`, or a rank-3 tensor\n * of shape `[height, width, numChannels]`. If rank-2, draws grayscale. If\n * rank-3, must have depth of 1, 3 or 4. When depth of 1, draws\n * grayscale. When depth of 3, we draw with the first three components of\n * the depth dimension corresponding to r, g, b and alpha = 1. When depth of\n * 4, all four components of the depth dimension correspond to r, g, b, a.\n * @param canvas The canvas to draw to.\n *\n * @doc {heading: 'Browser', namespace: 'browser'}\n */\nexport async function toPixels(img, canvas) {\n    let $img = convertToTensor(img, 'img', 'toPixels');\n    if (!(img instanceof Tensor)) {\n        // Assume int32 if user passed a native array.\n        const originalImgTensor = $img;\n        $img = cast(originalImgTensor, 'int32');\n        originalImgTensor.dispose();\n    }\n    if ($img.rank !== 2 && $img.rank !== 3) {\n        throw new Error(`toPixels only supports rank 2 or 3 tensors, got rank ${$img.rank}.`);\n    }\n    const [height, width] = $img.shape.slice(0, 2);\n    const depth = $img.rank === 2 ? 1 : $img.shape[2];\n    if (depth > 4 || depth === 2) {\n        throw new Error(`toPixels only supports depth of size ` +\n            `1, 3 or 4 but got ${depth}`);\n    }\n    if ($img.dtype !== 'float32' && $img.dtype !== 'int32') {\n        throw new Error(`Unsupported type for toPixels: ${$img.dtype}.` +\n            ` Please use float32 or int32 tensors.`);\n    }\n    const data = await $img.data();\n    const multiplier = $img.dtype === 'float32' ? 255 : 1;\n    const bytes = new Uint8ClampedArray(width * height * 4);\n    for (let i = 0; i < height * width; ++i) {\n        const rgba = [0, 0, 0, 255];\n        for (let d = 0; d < depth; d++) {\n            const value = data[i * depth + d];\n            if ($img.dtype === 'float32') {\n                if (value < 0 || value > 1) {\n                    throw new Error(`Tensor values for a float32 Tensor must be in the ` +\n                        `range [0 - 1] but encountered ${value}.`);\n                }\n            }\n            else if ($img.dtype === 'int32') {\n                if (value < 0 || value > 255) {\n                    throw new Error(`Tensor values for a int32 Tensor must be in the ` +\n                        `range [0 - 255] but encountered ${value}.`);\n                }\n            }\n            if (depth === 1) {\n                rgba[0] = value * multiplier;\n                rgba[1] = value * multiplier;\n                rgba[2] = value * multiplier;\n            }\n            else {\n                rgba[d] = value * multiplier;\n            }\n        }\n        const j = i * 4;\n        bytes[j + 0] = Math.round(rgba[0]);\n        bytes[j + 1] = Math.round(rgba[1]);\n        bytes[j + 2] = Math.round(rgba[2]);\n        bytes[j + 3] = Math.round(rgba[3]);\n    }\n    if (canvas != null) {\n        canvas.width = width;\n        canvas.height = height;\n        const ctx = canvas.getContext('2d');\n        const imageData = new ImageData(bytes, width, height);\n        ctx.putImageData(imageData, 0, 0);\n    }\n    if ($img !== img) {\n        $img.dispose();\n    }\n    return bytes;\n}\nexport const fromPixels = op({ fromPixels_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Jyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxFQUFDLFVBQVUsRUFBb0MsTUFBTSxpQkFBaUIsQ0FBQztBQUM5RSxPQUFPLEVBQUMsU0FBUyxFQUFlLE1BQU0sb0JBQW9CLENBQUM7QUFDM0QsT0FBTyxFQUFDLE1BQU0sRUFBcUIsTUFBTSxXQUFXLENBQUM7QUFFckQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXBDLElBQUksbUJBQTZDLENBQUM7QUFFbEQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxTQUFTLFdBQVcsQ0FDaEIsTUFDNEIsRUFDNUIsV0FBVyxHQUFHLENBQUM7SUFDakIsaUJBQWlCO0lBQ2pCLElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUNYLGdFQUFnRSxDQUFDLENBQUM7S0FDdkU7SUFDRCxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0tBQzdFO0lBQ0QsSUFBSSxXQUFXLEdBQUcsS0FBSyxDQUFDO0lBQ3hCLElBQUksV0FBVyxHQUFHLEtBQUssQ0FBQztJQUN4QixJQUFJLE9BQU8sR0FB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b250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2Vudn0gZnJvbSAnLi4vZW52aXJvbm1lbnQnO1xuaW1wb3J0IHtGcm9tUGl4ZWxzLCBGcm9tUGl4ZWxzQXR0cnMsIEZyb21QaXhlbHNJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge2dldEtlcm5lbCwgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjJELCBUZW5zb3IzRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7UGl4ZWxEYXRhLCBUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7dGVuc29yM2R9IGZyb20gJy4vdGVuc29yM2QnO1xuXG5sZXQgZnJvbVBpeGVsczJEQ29udGV4dDogQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCBmcm9tIGFuIGltYWdlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbWFnZSA9IG5ldyBJbWFnZURhdGEoMSwgMSk7XG4gKiBpbWFnZS5kYXRhWzBdID0gMTAwO1xuICogaW1hZ2UuZGF0YVsxXSA9IDE1MDtcbiAqIGltYWdlLmRhdGFbMl0gPSAyMDA7XG4gKiBpbWFnZS5kYXRhWzNdID0gMjU1O1xuICpcbiAqIHRmLmJyb3dzZXIuZnJvbVBpeGVscyhpbWFnZSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwaXhlbHMgVGhlIGlucHV0IGltYWdlIHRvIGNvbnN0cnVjdCB0aGUgdGVuc29yIGZyb20uIFRoZVxuICogc3VwcG9ydGVkIGltYWdlIHR5cGVzIGFyZSBhbGwgNC1jaGFubmVsLiBZb3UgY2FuIGFsc28gcGFzcyBpbiBhbiBpbWFnZVxuICogb2JqZWN0IHdpdGggZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiBge2RhdGE6IFVpbnQ4QXJyYXk7IHdpZHRoOiBudW1iZXI7IGhlaWdodDogbnVtYmVyfWBcbiAqIEBwYXJhbSBudW1DaGFubmVscyBUaGUgbnVtYmVyIG9mIGNoYW5uZWxzIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBBXG4gKiBudW1DaGFubmVscyB2YWx1ZSBsZXNzIHRoYW4gNCBhbGxvd3MgeW91IHRvIGlnbm9yZSBjaGFubmVscy4gRGVmYXVsdHMgdG9cbiAqIDMgKGlnbm9yZXMgYWxwaGEgY2hhbm5lbCBvZiBpbnB1dCBpbWFnZSkuXG4gKlxuICogQHJldHVybnMgQSBUZW5zb3IzRCB3aXRoIHRoZSBzaGFwZSBgW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXWAuXG4gKlxuICogTm90ZTogZnJvbVBpeGVscyBjYW4gYmUgbG9zc3kgaW4gc29tZSBjYXNlcywgc2FtZSBpbWFnZSBtYXkgcmVzdWx0IGluXG4gKiBzbGlnaHRseSBkaWZmZXJlbnQgdGVuc29yIHZhbHVlcywgaWYgcmVuZGVyZWQgYnkgZGlmZmVyZW50IHJlbmRlcmluZ1xuICogZW5naW5lcy4gVGhpcyBtZWFucyB0aGF0IHJlc3VsdHMgZnJvbSBkaWZmZXJlbnQgYnJvd3NlcnMsIG9yIGV2ZW4gc2FtZVxuICogYnJvd3NlciB3aXRoIENQVSBhbmQgR1BVIHJlbmRlcmluZyBlbmdpbmVzIGNhbiBiZSBkaWZmZXJlbnQuIFNlZSBkaXNjdXNzaW9uXG4gKiBpbiBkZXRhaWxzOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNTQ4MlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdCcm93c2VyJywgbmFtZXNwYWNlOiAnYnJvd3NlcicsIGlnbm9yZUNJOiB0cnVlfVxuICovXG5mdW5jdGlvbiBmcm9tUGl4ZWxzXyhcbiAgICBwaXhlbHM6IFBpeGVsRGF0YXxJbWFnZURhdGF8SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxcbiAgICBIVE1MVmlkZW9FbGVtZW50fEltYWdlQml0bWFwLFxuICAgIG51bUNoYW5uZWxzID0gMyk6IFRlbnNvcjNEIHtcbiAgLy8gU2FuaXR5IGNoZWNrcy5cbiAgaWYgKG51bUNoYW5uZWxzID4gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBjb25zdHJ1Y3QgVGVuc29yIHdpdGggbW9yZSB0aGFuIDQgY2hhbm5lbHMgZnJvbSBwaXhlbHMuJyk7XG4gIH1cbiAgaWYgKHBpeGVscyA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwaXhlbHMgcGFzc2VkIHRvIHRmLmJyb3dzZXIuZnJvbVBpeGVscygpIGNhbiBub3QgYmUgbnVsbCcpO1xuICB9XG4gIGxldCBpc1BpeGVsRGF0YSA9IGZhbHNlO1xuICBsZXQgaXNJbWFnZURhdGEgPSBmYWxzZTtcbiAgbGV0IGlzVmlkZW8gPSBmYWxzZTtcbiAgbGV0IGlzSW1hZ2UgPSBmYWxzZTtcbiAgbGV0IGlzQ2FudmFzTGlrZSA9IGZhbHNlO1xuICBsZXQgaXNJbWFnZUJpdG1hcCA9IGZhbHNlO1xuICBpZiAoKHBpeGVscyBhcyBQaXhlbERhdGEpLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgaXNQaXhlbERhdGEgPSB0cnVlO1xuICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIChJbWFnZURhdGEpICE9PSAndW5kZWZpbmVkJyAmJiBwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZURhdGEpIHtcbiAgICBpc0ltYWdlRGF0YSA9IHRydWU7XG4gIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgKEhUTUxWaWRlb0VsZW1lbnQpICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgcGl4ZWxzIGluc3RhbmNlb2YgSFRNTFZpZGVvRWxlbWVudCkge1xuICAgIGlzVmlkZW8gPSB0cnVlO1xuICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIChIVE1MSW1hZ2VFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHBpeGVscyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQpIHtcbiAgICBpc0ltYWdlID0gdHJ1ZTtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICB9IGVsc2UgaWYgKChwaXhlbHMgYXMgYW55KS5nZXRDb250ZXh0ICE9IG51bGwpIHtcbiAgICBpc0NhbnZhc0xpa2UgPSB0cnVlO1xuICB9IGVsc2UgaWYgKFxuICAgICAgdHlwZW9mIChJbWFnZUJpdG1hcCkgIT09ICd1bmRlZmluZWQnICYmIHBpeGVscyBpbnN0YW5jZW9mIEltYWdlQml0bWFwKSB7XG4gICAgaXNJbWFnZUJpdG1hcCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAncGl4ZWxzIHBhc3NlZCB0byB0Zi5icm93c2VyLmZyb21QaXhlbHMoKSBtdXN0IGJlIGVpdGhlciBhbiAnICtcbiAgICAgICAgYEhUTUxWaWRlb0VsZW1lbnQsIEhUTUxJbWFnZUVsZW1lbnQsIEhUTUxDYW52YXNFbGVtZW50LCBJbWFnZURhdGEgYCArXG4gICAgICAgIGBpbiBicm93c2VyLCBvciBPZmZzY3JlZW5DYW52YXMsIEltYWdlRGF0YSBpbiB3ZWJ3b3JrZXJgICtcbiAgICAgICAgYCBvciB7ZGF0YTogVWludDMyQXJyYXksIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyfSwgYCArXG4gICAgICAgIGBidXQgd2FzICR7KHBpeGVscyBhcyB7fSkuY29uc3RydWN0b3IubmFtZX1gKTtcbiAgfVxuICAvLyBJZiB0aGUgY3VycmVudCBiYWNrZW5kIGhhcyAnRnJvbVBpeGVscycgcmVnaXN0ZXJlZCwgaXQgaGFzIGEgbW9yZVxuICAvLyBlZmZpY2llbnQgd2F5IG9mIGhhbmRsaW5nIHBpeGVsIHVwbG9hZHMsIHNvIHdlIGNhbGwgdGhhdC5cbiAgY29uc3Qga2VybmVsID0gZ2V0S2VybmVsKEZyb21QaXhlbHMsIEVOR0lORS5iYWNrZW5kTmFtZSk7XG4gIGlmIChrZXJuZWwgIT0gbnVsbCkge1xuICAgIGNvbnN0IGlucHV0czogRnJvbVBpeGVsc0lucHV0cyA9IHtwaXhlbHN9O1xuICAgIGNvbnN0IGF0dHJzOiBGcm9tUGl4ZWxzQXR0cnMgPSB7bnVtQ2hhbm5lbHN9O1xuICAgIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICBGcm9tUGl4ZWxzLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gIH1cblxuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPSBpc1ZpZGVvID9cbiAgICAgIFtcbiAgICAgICAgKHBpeGVscyBhcyBIVE1MVmlkZW9FbGVtZW50KS52aWRlb1dpZHRoLFxuICAgICAgICAocGl4ZWxzIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnZpZGVvSGVpZ2h0XG4gICAgICBdIDpcbiAgICAgIFtwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHRdO1xuICBsZXQgdmFsczogVWludDhDbGFtcGVkQXJyYXl8VWludDhBcnJheTtcblxuICBpZiAoaXNDYW52YXNMaWtlKSB7XG4gICAgdmFscyA9XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgKHBpeGVscyBhcyBhbnkpLmdldENvbnRleHQoJzJkJykuZ2V0SW1hZ2VEYXRhKDAsIDAsIHdpZHRoLCBoZWlnaHQpLmRhdGE7XG4gIH0gZWxzZSBpZiAoaXNJbWFnZURhdGEgfHwgaXNQaXhlbERhdGEpIHtcbiAgICB2YWxzID0gKHBpeGVscyBhcyBQaXhlbERhdGEgfCBJbWFnZURhdGEpLmRhdGE7XG4gIH0gZWxzZSBpZiAoaXNJbWFnZSB8fCBpc1ZpZGVvIHx8IGlzSW1hZ2VCaXRtYXApIHtcbiAgICBpZiAoZnJvbVBpeGVsczJEQ29udGV4dCA9PSBudWxsKSB7XG4gICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICBpZiAodHlwZW9mIE9mZnNjcmVlbkNhbnZhcyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgICAgIHR5cGVvZiBPZmZzY3JlZW5DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQgPSBuZXcgT2Zmc2NyZWVuQ2FudmFzKDEsIDEpLmdldENvbnRleHQoJzJkJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAnQ2Fubm90IHBhcnNlIGlucHV0IGluIGN1cnJlbnQgY29udGV4dC4gJyArXG4gICAgICAgICAgICAgICdSZWFzb246IE9mZnNjcmVlbkNhbnZhcyBDb250ZXh0MkQgcmVuZGVyaW5nIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZyb21QaXhlbHMyRENvbnRleHQgPVxuICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJykuZ2V0Q29udGV4dChcbiAgICAgICAgICAgICAgICAnMmQnLCB7d2lsbFJlYWRGcmVxdWVudGx5OiB0cnVlfSkgYXMgQ2FudmFzUmVuZGVyaW5nQ29udGV4dDJEO1xuICAgICAgfVxuICAgIH1cbiAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGZyb21QaXhlbHMyRENvbnRleHQuY2FudmFzLmhlaWdodCA9IGhlaWdodDtcbiAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmRyYXdJbWFnZShcbiAgICAgICAgcGl4ZWxzIGFzIEhUTUxWaWRlb0VsZW1lbnQsIDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIHZhbHMgPSBmcm9tUGl4ZWxzMkRDb250ZXh0LmdldEltYWdlRGF0YSgwLCAwLCB3aWR0aCwgaGVpZ2h0KS5kYXRhO1xuICB9XG4gIGxldCB2YWx1ZXM6IEludDMyQXJyYXk7XG4gIGlmIChudW1DaGFubmVscyA9PT0gNCkge1xuICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KHZhbHMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG51bVBpeGVscyA9IHdpZHRoICogaGVpZ2h0O1xuICAgIHZhbHVlcyA9IG5ldyBJbnQzMkFycmF5KG51bVBpeGVscyAqIG51bUNoYW5uZWxzKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVBpeGVsczsgaSsrKSB7XG4gICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG51bUNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgICAgdmFsdWVzW2kgKiBudW1DaGFubmVscyArIGNoYW5uZWxdID0gdmFsc1tpICogNCArIGNoYW5uZWxdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICBjb25zdCBvdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXTtcbiAgcmV0dXJuIHRlbnNvcjNkKHZhbHVlcywgb3V0U2hhcGUsICdpbnQzMicpO1xufVxuXG4vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciB8ZnJvbVBpeGVsc0FzeW5jfCB0byBjaGVjayB3aGV0aGVyIHRoZSBpbnB1dCBjYW5cbi8vIGJlIHdyYXBwZWQgaW50byBpbWFnZUJpdG1hcC5cbmZ1bmN0aW9uIGlzUGl4ZWxEYXRhKHBpeGVsczogUGl4ZWxEYXRhfEltYWdlRGF0YXxIVE1MSW1hZ2VFbGVtZW50fFxuICAgICAgICAgICAgICAgICAgICAgSFRNTENhbnZhc0VsZW1lbnR8SFRNTFZpZGVvRWxlbWVudHxcbiAgICAgICAgICAgICAgICAgICAgIEltYWdlQml0bWFwKTogcGl4ZWxzIGlzIFBpeGVsRGF0YSB7XG4gIHJldHVybiAocGl4ZWxzICE9IG51bGwpICYmICgocGl4ZWxzIGFzIFBpeGVsRGF0YSkuZGF0YSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpO1xufVxuXG5mdW5jdGlvbiBpc0ltYWdlQml0bWFwRnVsbHlTdXBwb3J0ZWQoKSB7XG4gIHJldHVybiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgdHlwZW9mIChJbWFnZUJpdG1hcCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICB3aW5kb3cuaGFzT3duUHJvcGVydHkoJ2NyZWF0ZUltYWdlQml0bWFwJyk7XG59XG5cbmZ1bmN0aW9uIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzOiBQaXhlbERhdGF8SW1hZ2VEYXRhfEhUTUxJbWFnZUVsZW1lbnR8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIEhUTUxDYW52YXNFbGVtZW50fEhUTUxWaWRlb0VsZW1lbnR8SW1hZ2VCaXRtYXApIHtcbiAgcmV0dXJuIHBpeGVscyAhPSBudWxsICYmIHBpeGVscy53aWR0aCAhPT0gMCAmJiBwaXhlbHMuaGVpZ2h0ICE9PSAwO1xufVxuXG5mdW5jdGlvbiBjYW5XcmFwUGl4ZWxzVG9JbWFnZUJpdG1hcChwaXhlbHM6IFBpeGVsRGF0YXxJbWFnZURhdGF8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVE1MSW1hZ2VFbGVtZW50fEhUTUxDYW52YXNFbGVtZW50fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRNTFZpZGVvRWxlbWVudHxJbWFnZUJpdG1hcCkge1xuICByZXR1cm4gaXNJbWFnZUJpdG1hcEZ1bGx5U3VwcG9ydGVkKCkgJiYgIShwaXhlbHMgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCkgJiZcbiAgICAgIGlzTm9uRW1wdHlQaXhlbHMocGl4ZWxzKSAmJiAhaXNQaXhlbERhdGEocGl4ZWxzKTtcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZnJvbSBhbiBpbWFnZSBpbiBhc3luYyB3YXkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGltYWdlID0gbmV3IEltYWdlRGF0YSgxLCAxKTtcbiAqIGltYWdlLmRhdGFbMF0gPSAxMDA7XG4gKiBpbWFnZS5kYXRhWzFdID0gMTUwO1xuICogaW1hZ2UuZGF0YVsyXSA9IDIwMDtcbiAqIGltYWdlLmRhdGFbM10gPSAyNTU7XG4gKlxuICogKGF3YWl0IHRmLmJyb3dzZXIuZnJvbVBpeGVsc0FzeW5jKGltYWdlKSkucHJpbnQoKTtcbiAqIGBgYFxuICogVGhpcyBBUEkgaXMgdGhlIGFzeW5jIHZlcnNpb24gb2YgZnJvbVBpeGVscy4gVGhlIEFQSSB3aWxsIGZpcnN0XG4gKiBjaGVjayB8V1JBUF9UT19JTUFHRUJJVE1BUHwgZmxhZywgYW5kIHRyeSB0byB3cmFwIHRoZSBpbnB1dCB0b1xuICogaW1hZ2VCaXRtYXAgaWYgdGhlIGZsYWcgaXMgc2V0IHRvIHRydWUuXG4gKlxuICogQHBhcmFtIHBpeGVscyBUaGUgaW5wdXQgaW1hZ2UgdG8gY29uc3RydWN0IHRoZSB0ZW5zb3IgZnJvbS4gVGhlXG4gKiBzdXBwb3J0ZWQgaW1hZ2UgdHlwZXMgYXJlIGFsbCA0LWNoYW5uZWwuIFlvdSBjYW4gYWxzbyBwYXNzIGluIGFuIGltYWdlXG4gKiBvYmplY3Qgd2l0aCBmb2xsb3dpbmcgYXR0cmlidXRlczpcbiAqIGB7ZGF0YTogVWludDhBcnJheTsgd2lkdGg6IG51bWJlcjsgaGVpZ2h0OiBudW1iZXJ9YFxuICogQHBhcmFtIG51bUNoYW5uZWxzIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIG91dHB1dCB0ZW5zb3IuIEFcbiAqIG51bUNoYW5uZWxzIHZhbHVlIGxlc3MgdGhhbiA0IGFsbG93cyB5b3UgdG8gaWdub3JlIGNoYW5uZWxzLiBEZWZhdWx0cyB0b1xuICogMyAoaWdub3JlcyBhbHBoYSBjaGFubmVsIG9mIGlucHV0IGltYWdlKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQnJvd3NlcicsIG5hbWVzcGFjZTogJ2Jyb3dzZXInLCBpZ25vcmVDSTogdHJ1ZX1cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZyb21QaXhlbHNBc3luYyhcbiAgICBwaXhlbHM6IFBpeGVsRGF0YXxJbWFnZURhdGF8SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxcbiAgICBIVE1MVmlkZW9FbGVtZW50fEltYWdlQml0bWFwLFxuICAgIG51bUNoYW5uZWxzID0gMykge1xuICBsZXQgaW5wdXRzOiBQaXhlbERhdGF8SW1hZ2VEYXRhfEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8XG4gICAgICBIVE1MVmlkZW9FbGVtZW50fEltYWdlQml0bWFwID0gbnVsbDtcblxuICAvLyBDaGVjayB3aGV0aGVyIHRoZSBiYWNrZW5kIG5lZWRzIHRvIHdyYXAgfHBpeGVsc3wgdG8gaW1hZ2VCaXRtYXAgYW5kXG4gIC8vIHdoZXRoZXIgfHBpeGVsc3wgY2FuIGJlIHdyYXBwZWQgdG8gaW1hZ2VCaXRtYXAuXG4gIGlmIChlbnYoKS5nZXRCb29sKCdXUkFQX1RPX0lNQUdFQklUTUFQJykgJiZcbiAgICAgIGNhbldyYXBQaXhlbHNUb0ltYWdlQml0bWFwKHBpeGVscykpIHtcbiAgICAvLyBGb3JjZSB0aGUgaW1hZ2VCaXRtYXAgY3JlYXRpb24gdG8gbm90IGRvIGFueSBwcmVtdWx0aXBseSBhbHBoYVxuICAgIC8vIG9wcy5cbiAgICBsZXQgaW1hZ2VCaXRtYXA7XG5cbiAgICB0cnkge1xuICAgICAgLy8gd3JhcCBpbiB0cnktY2F0Y2ggYmxvY2ssIGJlY2F1c2UgY3JlYXRlSW1hZ2VCaXRtYXAgbWF5IG5vdCB3b3JrXG4gICAgICAvLyBwcm9wZXJseSBpbiBzb21lIGJyb3dzZXJzLCBlLmcuXG4gICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzM1NTk0XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgaW1hZ2VCaXRtYXAgPSBhd2FpdCAoY3JlYXRlSW1hZ2VCaXRtYXAgYXMgYW55KShcbiAgICAgICAgICBwaXhlbHMgYXMgSW1hZ2VCaXRtYXBTb3VyY2UsIHtwcmVtdWx0aXBseUFscGhhOiAnbm9uZSd9KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBpbWFnZUJpdG1hcCA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gY3JlYXRlSW1hZ2VCaXRtYXAgd2lsbCBjbGlwIHRoZSBzb3VyY2Ugc2l6ZS5cbiAgICAvLyBJbiBzb21lIGNhc2VzLCB0aGUgaW5wdXQgd2lsbCBoYXZlIGxhcmdlciBzaXplIHRoYW4gaXRzIGNvbnRlbnQuXG4gICAgLy8gRS5nLiBuZXcgSW1hZ2UoMTAsIDEwKSBidXQgd2l0aCAxIHggMSBjb250ZW50LiBVc2luZ1xuICAgIC8vIGNyZWF0ZUltYWdlQml0bWFwIHdpbGwgY2xpcCB0aGUgc2l6ZSBmcm9tIDEwIHggMTAgdG8gMSB4IDEsIHdoaWNoXG4gICAgLy8gaXMgbm90IGNvcnJlY3QuIFdlIHNob3VsZCBhdm9pZCB3cmFwcGluZyBzdWNoIHJlc291Y2UgdG9cbiAgICAvLyBpbWFnZUJpdG1hcC5cbiAgICBpZiAoaW1hZ2VCaXRtYXAgIT0gbnVsbCAmJiBpbWFnZUJpdG1hcC53aWR0aCA9PT0gcGl4ZWxzLndpZHRoICYmXG4gICAgICAgIGltYWdlQml0bWFwLmhlaWdodCA9PT0gcGl4ZWxzLmhlaWdodCkge1xuICAgICAgaW5wdXRzID0gaW1hZ2VCaXRtYXA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlucHV0cyA9IHBpeGVscztcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaW5wdXRzID0gcGl4ZWxzO1xuICB9XG5cbiAgcmV0dXJuIGZyb21QaXhlbHNfKGlucHV0cywgbnVtQ2hhbm5lbHMpO1xufVxuXG4vKipcbiAqIERyYXdzIGEgYHRmLlRlbnNvcmAgb2YgcGl4ZWwgdmFsdWVzIHRvIGEgYnl0ZSBhcnJheSBvciBvcHRpb25hbGx5IGFcbiAqIGNhbnZhcy5cbiAqXG4gKiBXaGVuIHRoZSBkdHlwZSBvZiB0aGUgaW5wdXQgaXMgJ2Zsb2F0MzInLCB3ZSBhc3N1bWUgdmFsdWVzIGluIHRoZSByYW5nZVxuICogWzAtMV0uIE90aGVyd2lzZSwgd2hlbiBpbnB1dCBpcyAnaW50MzInLCB3ZSBhc3N1bWUgdmFsdWVzIGluIHRoZSByYW5nZVxuICogWzAtMjU1XS5cbiAqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIGNhbnZhcyBoYXMgYmVlbiBkcmF3biB0by5cbiAqXG4gKiBAcGFyYW0gaW1nIEEgcmFuay0yIHRlbnNvciB3aXRoIHNoYXBlIGBbaGVpZ2h0LCB3aWR0aF1gLCBvciBhIHJhbmstMyB0ZW5zb3JcbiAqIG9mIHNoYXBlIGBbaGVpZ2h0LCB3aWR0aCwgbnVtQ2hhbm5lbHNdYC4gSWYgcmFuay0yLCBkcmF3cyBncmF5c2NhbGUuIElmXG4gKiByYW5rLTMsIG11c3QgaGF2ZSBkZXB0aCBvZiAxLCAzIG9yIDQuIFdoZW4gZGVwdGggb2YgMSwgZHJhd3NcbiAqIGdyYXlzY2FsZS4gV2hlbiBkZXB0aCBvZiAzLCB3ZSBkcmF3IHdpdGggdGhlIGZpcnN0IHRocmVlIGNvbXBvbmVudHMgb2ZcbiAqIHRoZSBkZXB0aCBkaW1lbnNpb24gY29ycmVzcG9uZGluZyB0byByLCBnLCBiIGFuZCBhbHBoYSA9IDEuIFdoZW4gZGVwdGggb2ZcbiAqIDQsIGFsbCBmb3VyIGNvbXBvbmVudHMgb2YgdGhlIGRlcHRoIGRpbWVuc2lvbiBjb3JyZXNwb25kIHRvIHIsIGcsIGIsIGEuXG4gKiBAcGFyYW0gY2FudmFzIFRoZSBjYW52YXMgdG8gZHJhdyB0by5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnQnJvd3NlcicsIG5hbWVzcGFjZTogJ2Jyb3dzZXInfVxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gdG9QaXhlbHMoXG4gICAgaW1nOiBUZW5zb3IyRHxUZW5zb3IzRHxUZW5zb3JMaWtlLFxuICAgIGNhbnZhcz86IEhUTUxDYW52YXNFbGVtZW50KTogUHJvbWlzZTxVaW50OENsYW1wZWRBcnJheT4ge1xuICBsZXQgJGltZyA9IGNvbnZlcnRUb1RlbnNvcihpbWcsICdpbWcnLCAndG9QaXhlbHMnKTtcbiAgaWYgKCEoaW1nIGluc3RhbmNlb2YgVGVuc29yKSkge1xuICAgIC8vIEFzc3VtZSBpbnQzMiBpZiB1c2VyIHBhc3NlZCBhIG5hdGl2ZSBhcnJheS5cbiAgICBjb25zdCBvcmlnaW5hbEltZ1RlbnNvciA9ICRpbWc7XG4gICAgJGltZyA9IGNhc3Qob3JpZ2luYWxJbWdUZW5zb3IsICdpbnQzMicpO1xuICAgIG9yaWdpbmFsSW1nVGVuc29yLmRpc3Bvc2UoKTtcbiAgfVxuICBpZiAoJGltZy5yYW5rICE9PSAyICYmICRpbWcucmFuayAhPT0gMykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHRvUGl4ZWxzIG9ubHkgc3VwcG9ydHMgcmFuayAyIG9yIDMgdGVuc29ycywgZ290IHJhbmsgJHskaW1nLnJhbmt9LmApO1xuICB9XG4gIGNvbnN0IFtoZWlnaHQsIHdpZHRoXSA9ICRpbWcuc2hhcGUuc2xpY2UoMCwgMik7XG4gIGNvbnN0IGRlcHRoID0gJGltZy5yYW5rID09PSAyID8gMSA6ICRpbWcuc2hhcGVbMl07XG5cbiAgaWYgKGRlcHRoID4gNCB8fCBkZXB0aCA9PT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYHRvUGl4ZWxzIG9ubHkgc3VwcG9ydHMgZGVwdGggb2Ygc2l6ZSBgICtcbiAgICAgICAgYDEsIDMgb3IgNCBidXQgZ290ICR7ZGVwdGh9YCk7XG4gIH1cblxuICBpZiAoJGltZy5kdHlwZSAhPT0gJ2Zsb2F0MzInICYmICRpbWcuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBVbnN1cHBvcnRlZCB0eXBlIGZvciB0b1BpeGVsczogJHskaW1nLmR0eXBlfS5gICtcbiAgICAgICAgYCBQbGVhc2UgdXNlIGZsb2F0MzIgb3IgaW50MzIgdGVuc29ycy5gKTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBhd2FpdCAkaW1nLmRhdGEoKTtcbiAgY29uc3QgbXVsdGlwbGllciA9ICRpbWcuZHR5cGUgPT09ICdmbG9hdDMyJyA/IDI1NSA6IDE7XG4gIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4Q2xhbXBlZEFycmF5KHdpZHRoICogaGVpZ2h0ICogNCk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWlnaHQgKiB3aWR0aDsgKytpKSB7XG4gICAgY29uc3QgcmdiYSA9IFswLCAwLCAwLCAyNTVdO1xuXG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBkZXB0aDsgZCsrKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGRhdGFbaSAqIGRlcHRoICsgZF07XG5cbiAgICAgIGlmICgkaW1nLmR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICAgICAgaWYgKHZhbHVlIDwgMCB8fCB2YWx1ZSA+IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBUZW5zb3IgdmFsdWVzIGZvciBhIGZsb2F0MzIgVGVuc29yIG11c3QgYmUgaW4gdGhlIGAgK1xuICAgICAgICAgICAgICBgcmFuZ2UgWzAgLSAxXSBidXQgZW5jb3VudGVyZWQgJHt2YWx1ZX0uYCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoJGltZy5kdHlwZSA9PT0gJ2ludDMyJykge1xuICAgICAgICBpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gMjU1KSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgVGVuc29yIHZhbHVlcyBmb3IgYSBpbnQzMiBUZW5zb3IgbXVzdCBiZSBpbiB0aGUgYCArXG4gICAgICAgICAgICAgIGByYW5nZSBbMCAtIDI1NV0gYnV0IGVuY291bnRlcmVkICR7dmFsdWV9LmApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChkZXB0aCA9PT0gMSkge1xuICAgICAgICByZ2JhWzBdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgICByZ2JhWzFdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgICByZ2JhWzJdID0gdmFsdWUgKiBtdWx0aXBsaWVyO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmdiYVtkXSA9IHZhbHVlICogbXVsdGlwbGllcjtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBqID0gaSAqIDQ7XG4gICAgYnl0ZXNbaiArIDBdID0gTWF0aC5yb3VuZChyZ2JhWzBdKTtcbiAgICBieXRlc1tqICsgMV0gPSBNYXRoLnJvdW5kKHJnYmFbMV0pO1xuICAgIGJ5dGVzW2ogKyAyXSA9IE1hdGgucm91bmQocmdiYVsyXSk7XG4gICAgYnl0ZXNbaiArIDNdID0gTWF0aC5yb3VuZChyZ2JhWzNdKTtcbiAgfVxuXG4gIGlmIChjYW52YXMgIT0gbnVsbCkge1xuICAgIGNhbnZhcy53aWR0aCA9IHdpZHRoO1xuICAgIGNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgY29uc3QgY3R4ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7XG4gICAgY29uc3QgaW1hZ2VEYXRhID0gbmV3IEltYWdlRGF0YShieXRlcywgd2lkdGgsIGhlaWdodCk7XG4gICAgY3R4LnB1dEltYWdlRGF0YShpbWFnZURhdGEsIDAsIDApO1xuICB9XG4gIGlmICgkaW1nICE9PSBpbWcpIHtcbiAgICAkaW1nLmRpc3Bvc2UoKTtcbiAgfVxuICByZXR1cm4gYnl0ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBmcm9tUGl4ZWxzID0gb3Aoe2Zyb21QaXhlbHNffSk7XG4iXX0=","import { computeStrides, sizeFromShape } from '../util';\n/**\n * Validate gather nd inputs.\n *\n * @param tensor The tensor contains the source values.\n * @param indices The tensor contains the indices to slice the source.\n *\n * @returns [resultShape, numUpdates, sliceSize, strides]\n */\nexport function prepareAndValidate(tensor, indices) {\n    const tensorRank = tensor.shape.length;\n    const indicesRank = indices.shape.length;\n    if (tensorRank < 1) {\n        throw new Error('tf.gatherND() expects the input to be rank 1 or higher,' +\n            ` but the rank was ${tensorRank}.`);\n    }\n    if (indicesRank < 1) {\n        throw new Error('tf.gatherND() expects the indices to be rank 1 or higher,' +\n            ` but the rank was ${indicesRank}.`);\n    }\n    if (indices.dtype !== 'int32') {\n        throw new Error('tf.gatherND() expects the indices to be int32 type,' +\n            ` but the dtype was ${indices.dtype}.`);\n    }\n    if (indices.shape[indicesRank - 1] > tensorRank) {\n        throw new Error('index innermost dimension length must be <= tensor rank; saw: ' +\n            `${indices.shape[indicesRank - 1]} vs. ${tensorRank}`);\n    }\n    if (sizeFromShape(tensor.shape) === 0) {\n        throw new Error('Requested more than 0 entries, but input is empty.' +\n            ` Input shape: ${tensor.shape}.`);\n    }\n    const indicesShape = indices.shape;\n    const sliceRank = indicesShape[indicesShape.length - 1];\n    // The result shape is\n    //   indices.shape[:-1] + params.shape[indices.shape[-1]:]\n    let nResult = 1;\n    for (let i = 0; i < indicesShape.length - 1; ++i) {\n        nResult *= indicesShape[i];\n    }\n    const inputShape = tensor.shape;\n    const resultShape = indicesShape.slice();\n    resultShape.pop();\n    let sliceSize = 1;\n    for (let i = sliceRank; i < tensorRank; ++i) {\n        sliceSize *= inputShape[i];\n        resultShape.push(inputShape[i]);\n    }\n    const strides = [...computeStrides(tensor.shape).map(stride => stride / sliceSize),\n        1].slice(0, sliceRank);\n    return [resultShape, nResult, sliceSize, strides];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyX25kX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9nYXRoZXJfbmRfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGNBQWMsRUFBRSxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxNQUFrQixFQUFFLE9BQW1CO0lBRXhFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3ZDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pDLElBQUksVUFBVSxHQUFHLENBQUMsRUFBRTtRQUNsQixNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCxxQkFBcUIsVUFBVSxHQUFHLENBQUMsQ0FBQztLQUN6QztJQUNELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRDtZQUMzRCxxQkFBcUIsV0FBVyxHQUFHLENBQUMsQ0FBQztLQUMxQztJQUNELElBQUksT0FBTyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDWCxxREFBcUQ7WUFDckQsc0JBQXNCLE9BQU8sQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQzdDO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLEVBQUU7UUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxnRUFBZ0U7WUFDaEUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUMsUUFBUSxVQUFVLEVBQUUsQ0FBQyxDQUFDO0tBQzVEO0lBRUQsSUFBSSxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNyQyxNQUFNLElBQUksS0FBSyxDQUNYLG9EQUFvRDtZQUNwRCxpQkFBaUIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7S0FDdkM7SUFFRCxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ25DLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXhELHNCQUFzQjtJQUN0QiwwREFBMEQ7SUFDMUQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO0lBQ2hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNoRCxPQUFPLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzVCO0lBRUQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUVoQyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDekMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBRWxCLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLFNBQVMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNqQztJQUVELE1BQU0sT0FBTyxHQUNULENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUM7UUFDakUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUU1QixPQUFPLENBQUMsV0FBVyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y29tcHV0ZVN0cmlkZXMsIHNpemVGcm9tU2hhcGV9IGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIFZhbGlkYXRlIGdhdGhlciBuZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHRlbnNvciBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSBzb3VyY2UgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgVGhlIHRlbnNvciBjb250YWlucyB0aGUgaW5kaWNlcyB0byBzbGljZSB0aGUgc291cmNlLlxuICpcbiAqIEByZXR1cm5zIFtyZXN1bHRTaGFwZSwgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzXVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcGFyZUFuZFZhbGlkYXRlKHRlbnNvcjogVGVuc29ySW5mbywgaW5kaWNlczogVGVuc29ySW5mbyk6XG4gICAgW251bWJlcltdLCBudW1iZXIsIG51bWJlciwgbnVtYmVyW11dIHtcbiAgY29uc3QgdGVuc29yUmFuayA9IHRlbnNvci5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gIGlmICh0ZW5zb3JSYW5rIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RmLmdhdGhlck5EKCkgZXhwZWN0cyB0aGUgaW5wdXQgdG8gYmUgcmFuayAxIG9yIGhpZ2hlciwnICtcbiAgICAgICAgYCBidXQgdGhlIHJhbmsgd2FzICR7dGVuc29yUmFua30uYCk7XG4gIH1cbiAgaWYgKGluZGljZXNSYW5rIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RmLmdhdGhlck5EKCkgZXhwZWN0cyB0aGUgaW5kaWNlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICBgIGJ1dCB0aGUgcmFuayB3YXMgJHtpbmRpY2VzUmFua30uYCk7XG4gIH1cbiAgaWYgKGluZGljZXMuZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0Zi5nYXRoZXJORCgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgYCBidXQgdGhlIGR0eXBlIHdhcyAke2luZGljZXMuZHR5cGV9LmApO1xuICB9XG4gIGlmIChpbmRpY2VzLnNoYXBlW2luZGljZXNSYW5rIC0gMV0gPiB0ZW5zb3JSYW5rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnaW5kZXggaW5uZXJtb3N0IGRpbWVuc2lvbiBsZW5ndGggbXVzdCBiZSA8PSB0ZW5zb3IgcmFuazsgc2F3OiAnICtcbiAgICAgICAgYCR7aW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdfSB2cy4gJHt0ZW5zb3JSYW5rfWApO1xuICB9XG5cbiAgaWYgKHNpemVGcm9tU2hhcGUodGVuc29yLnNoYXBlKSA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JlcXVlc3RlZCBtb3JlIHRoYW4gMCBlbnRyaWVzLCBidXQgaW5wdXQgaXMgZW1wdHkuJyArXG4gICAgICAgIGAgSW5wdXQgc2hhcGU6ICR7dGVuc29yLnNoYXBlfS5gKTtcbiAgfVxuXG4gIGNvbnN0IGluZGljZXNTaGFwZSA9IGluZGljZXMuc2hhcGU7XG4gIGNvbnN0IHNsaWNlUmFuayA9IGluZGljZXNTaGFwZVtpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMV07XG5cbiAgLy8gVGhlIHJlc3VsdCBzaGFwZSBpc1xuICAvLyAgIGluZGljZXMuc2hhcGVbOi0xXSArIHBhcmFtcy5zaGFwZVtpbmRpY2VzLnNoYXBlWy0xXTpdXG4gIGxldCBuUmVzdWx0ID0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgblJlc3VsdCAqPSBpbmRpY2VzU2hhcGVbaV07XG4gIH1cblxuICBjb25zdCBpbnB1dFNoYXBlID0gdGVuc29yLnNoYXBlO1xuXG4gIGNvbnN0IHJlc3VsdFNoYXBlID0gaW5kaWNlc1NoYXBlLnNsaWNlKCk7XG4gIHJlc3VsdFNoYXBlLnBvcCgpO1xuXG4gIGxldCBzbGljZVNpemUgPSAxO1xuICBmb3IgKGxldCBpID0gc2xpY2VSYW5rOyBpIDwgdGVuc29yUmFuazsgKytpKSB7XG4gICAgc2xpY2VTaXplICo9IGlucHV0U2hhcGVbaV07XG4gICAgcmVzdWx0U2hhcGUucHVzaChpbnB1dFNoYXBlW2ldKTtcbiAgfVxuXG4gIGNvbnN0IHN0cmlkZXMgPVxuICAgICAgWy4uLmNvbXB1dGVTdHJpZGVzKHRlbnNvci5zaGFwZSkubWFwKHN0cmlkZSA9PiBzdHJpZGUgLyBzbGljZVNpemUpLFxuICAgICAgIDFdLnNsaWNlKDAsIHNsaWNlUmFuayk7XG5cbiAgcmV0dXJuIFtyZXN1bHRTaGFwZSwgblJlc3VsdCwgc2xpY2VTaXplLCBzdHJpZGVzXTtcbn1cbiJdfQ==","import { computeStrides, sizeFromShape } from '../util';\n/**\n * Check whether updates.shape = indices.shape[:batchDim] +\n * shape[sliceDim:]\n *\n * @param x The input tensor.\n */\nexport function validateUpdateShape(shape, indices, updates) {\n    const sliceDim = (indices.rank > 1) ? indices.shape[indices.rank - 1] : 1;\n    const batchDim = (indices.rank > 1) ? indices.rank - 1 : 1;\n    const shapeError = 'Must have updates.shape = indices.shape[:batchDim] + ' +\n        `shape[sliceDim:], got updates.shape: ${updates.shape}` +\n        `, indices.shape: ${indices.shape}, shape: ${shape}` +\n        `, sliceDim: ${sliceDim}, and batchDim: ${batchDim}.`;\n    if (updates.rank < batchDim) {\n        throw new Error(shapeError + ` update.rank < ${batchDim}. `);\n    }\n    if (shape.length < sliceDim + (updates.rank - batchDim)) {\n        throw new Error(shapeError +\n            ` Output shape length < ${sliceDim + (updates.rank - batchDim)}`);\n    }\n    if (updates.rank !== batchDim + shape.length - sliceDim) {\n        throw new Error(shapeError + ` update.rank != ${batchDim + shape.length - sliceDim}`);\n    }\n    for (let d = 0; d < batchDim; ++d) {\n        if (updates.shape[d] !== indices.shape[d]) {\n            throw new Error(shapeError +\n                ` updates.shape[${d}] (${updates.shape[d]}) != indices.shape[${d}] (${indices.shape[d]}).`);\n        }\n    }\n    for (let d = 0; d < updates.rank - batchDim; ++d) {\n        if (updates.shape[d + batchDim] !== shape[d + sliceDim]) {\n            throw new Error(shapeError +\n                ` updates.shape[${d + batchDim}] (${updates.shape[d + batchDim]}) != shape[${d + batchDim}] (${shape[d + batchDim]})`);\n        }\n    }\n}\n/**\n * Validate scatter nd inputs.\n *\n * @param update The tensor contains the update values.\n * @param indices The tensor contains the indices for the update values.\n * @param shape The shape of the output tensor.\n */\nexport function validateInput(updates, indices, shape) {\n    if (indices.rank < 1) {\n        throw new Error('tf.scatterND() expects the indices to be rank 1 or higher,' +\n            ` but the rank was ${indices.rank}.`);\n    }\n    if (updates.rank < 1) {\n        throw new Error('tf.scatterND() expects the updates to be rank 1 or higher,' +\n            ` but the rank was ${updates.rank}.`);\n    }\n    if (indices.dtype !== 'int32') {\n        throw new Error(`The dtype of 'indices' should be int32, but got dtype: ${indices.dtype}`);\n    }\n    if (shape.length < 1) {\n        throw new Error(`Output rank must be greater or equal to 1, but got shape: ${shape}`);\n    }\n    if (shape.length === 0) {\n        if (indices.size === 0) {\n            throw new Error(`Indices specified for empty output. indices shape: ${indices.shape}`);\n        }\n        if (updates.size === 0) {\n            throw new Error(`Updates specified for empty output. updates shape: ${updates.shape}`);\n        }\n    }\n    validateUpdateShape(shape, indices, updates);\n}\n/**\n * Calculate the shape information for the output.\n *\n * @param update The tensor contains the update values.\n * @param indices The tensor contains the indices for the update values.\n * @param shape The shape of the output tensor.\n *\n * @returns ScatterShapeInfo\n */\nexport function calculateShapes(updates, indices, shape) {\n    // Calculate the number of dimensions in indices\n    const indicesRank = indices.shape.length;\n    const sliceRank = (indicesRank > 1) ? indices.shape[indicesRank - 1] : 1;\n    // Calculate the number of elements that make up each slice of our updated\n    // tensor. This allows us to work with flattened tensors and copy over whole\n    // slices at a time.\n    const totalNd = shape.length;\n    let sliceSize = 1;\n    for (let i = sliceRank; i < totalNd; ++i) {\n        sliceSize *= shape[i];\n    }\n    const safeSliceDim = (sliceRank < 1) ? 1 : sliceRank;\n    const numUpdates = sizeFromShape(indices.shape) / safeSliceDim;\n    const strides = [...computeStrides(shape.slice(0, sliceRank)), 1];\n    const outputSize = sizeFromShape(shape);\n    return { sliceRank, numUpdates, sliceSize, strides, outputSize };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhdHRlcl9uZF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2NhdHRlcl9uZF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWtCQSxPQUFPLEVBQUMsY0FBYyxFQUFFLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0RDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FDL0IsS0FBZSxFQUFFLE9BQWUsRUFBRSxPQUFlO0lBQ25ELE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsTUFBTSxRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTNELE1BQU0sVUFBVSxHQUFHLHVEQUF1RDtRQUN0RSx3Q0FBd0MsT0FBTyxDQUFDLEtBQUssRUFBRTtRQUN2RCxvQkFBb0IsT0FBTyxDQUFDLEtBQUssWUFBWSxLQUFLLEVBQUU7UUFDcEQsZUFBZSxRQUFRLG1CQUFtQixRQUFRLEdBQUcsQ0FBQztJQUUxRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxFQUFFO1FBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsVUFBVSxHQUFHLGtCQUFrQixRQUFRLElBQUksQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLFFBQVEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxJQUFJLEdBQUcsUUFBUSxDQUFDLEVBQUU7UUFDdkQsTUFBTSxJQUFJLEtBQUssQ0FDWCxVQUFVO1lB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cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvckluZm99IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29tcHV0ZVN0cmlkZXMsIHNpemVGcm9tU2hhcGV9IGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdXBkYXRlcy5zaGFwZSA9IGluZGljZXMuc2hhcGVbOmJhdGNoRGltXSArXG4gKiBzaGFwZVtzbGljZURpbTpdXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlVXBkYXRlU2hhcGUoXG4gICAgc2hhcGU6IG51bWJlcltdLCBpbmRpY2VzOiBUZW5zb3IsIHVwZGF0ZXM6IFRlbnNvcikge1xuICBjb25zdCBzbGljZURpbSA9IChpbmRpY2VzLnJhbmsgPiAxKSA/IGluZGljZXMuc2hhcGVbaW5kaWNlcy5yYW5rIC0gMV0gOiAxO1xuICBjb25zdCBiYXRjaERpbSA9IChpbmRpY2VzLnJhbmsgPiAxKSA/IGluZGljZXMucmFuayAtIDEgOiAxO1xuXG4gIGNvbnN0IHNoYXBlRXJyb3IgPSAnTXVzdCBoYXZlIHVwZGF0ZXMuc2hhcGUgPSBpbmRpY2VzLnNoYXBlWzpiYXRjaERpbV0gKyAnICtcbiAgICAgIGBzaGFwZVtzbGljZURpbTpdLCBnb3QgdXBkYXRlcy5zaGFwZTogJHt1cGRhdGVzLnNoYXBlfWAgK1xuICAgICAgYCwgaW5kaWNlcy5zaGFwZTogJHtpbmRpY2VzLnNoYXBlfSwgc2hhcGU6ICR7c2hhcGV9YCArXG4gICAgICBgLCBzbGljZURpbTogJHtzbGljZURpbX0sIGFuZCBiYXRjaERpbTogJHtiYXRjaERpbX0uYDtcblxuICBpZiAodXBkYXRlcy5yYW5rIDwgYmF0Y2hEaW0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3Ioc2hhcGVFcnJvciArIGAgdXBkYXRlLnJhbmsgPCAke2JhdGNoRGltfS4gYCk7XG4gIH1cbiAgaWYgKHNoYXBlLmxlbmd0aCA8IHNsaWNlRGltICsgKHVwZGF0ZXMucmFuayAtIGJhdGNoRGltKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2hhcGVFcnJvciArXG4gICAgICAgIGAgT3V0cHV0IHNoYXBlIGxlbmd0aCA8ICR7c2xpY2VEaW0gKyAodXBkYXRlcy5yYW5rIC0gYmF0Y2hEaW0pfWApO1xuICB9XG4gIGlmICh1cGRhdGVzLnJhbmsgIT09IGJhdGNoRGltICsgc2hhcGUubGVuZ3RoIC0gc2xpY2VEaW0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNoYXBlRXJyb3IgKyBgIHVwZGF0ZS5yYW5rICE9ICR7YmF0Y2hEaW0gKyBzaGFwZS5sZW5ndGggLSBzbGljZURpbX1gKTtcbiAgfVxuICBmb3IgKGxldCBkID0gMDsgZCA8IGJhdGNoRGltOyArK2QpIHtcbiAgICBpZiAodXBkYXRlcy5zaGFwZVtkXSAhPT0gaW5kaWNlcy5zaGFwZVtkXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIHNoYXBlRXJyb3IgK1xuICAgICAgICAgIGAgdXBkYXRlcy5zaGFwZVske2R9XSAoJHt1cGRhdGVzLnNoYXBlW2RdfSkgIT0gaW5kaWNlcy5zaGFwZVske2R9XSAoJHtcbiAgICAgICAgICAgICAgaW5kaWNlcy5zaGFwZVtkXX0pLmApO1xuICAgIH1cbiAgfVxuICBmb3IgKGxldCBkID0gMDsgZCA8IHVwZGF0ZXMucmFuayAtIGJhdGNoRGltOyArK2QpIHtcbiAgICBpZiAodXBkYXRlcy5zaGFwZVtkICsgYmF0Y2hEaW1dICE9PSBzaGFwZVtkICsgc2xpY2VEaW1dKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgc2hhcGVFcnJvciArXG4gICAgICAgICAgYCB1cGRhdGVzLnNoYXBlWyR7ZCArIGJhdGNoRGltfV0gKCR7XG4gICAgICAgICAgICAgIHVwZGF0ZXMuc2hhcGVbZCArIGJhdGNoRGltXX0pICE9IHNoYXBlWyR7ZCArIGJhdGNoRGltfV0gKCR7XG4gICAgICAgICAgICAgIHNoYXBlW2QgKyBiYXRjaERpbV19KWApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNjYXR0ZXJTaGFwZUluZm8ge1xuICBzbGljZVJhbms6IG51bWJlcjtcbiAgbnVtVXBkYXRlczogbnVtYmVyO1xuICBzbGljZVNpemU6IG51bWJlcjtcbiAgc3RyaWRlczogbnVtYmVyW107XG4gIG91dHB1dFNpemU6IG51bWJlcjtcbn1cbi8qKlxuICogVmFsaWRhdGUgc2NhdHRlciBuZCBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHVwZGF0ZSBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIGluZGljZXMgVGhlIHRlbnNvciBjb250YWlucyB0aGUgaW5kaWNlcyBmb3IgdGhlIHVwZGF0ZSB2YWx1ZXMuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dChcbiAgICB1cGRhdGVzOiBUZW5zb3IsIGluZGljZXM6IFRlbnNvciwgc2hhcGU6IG51bWJlcltdKSB7XG4gIGlmIChpbmRpY2VzLnJhbmsgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGYuc2NhdHRlck5EKCkgZXhwZWN0cyB0aGUgaW5kaWNlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICBgIGJ1dCB0aGUgcmFuayB3YXMgJHtpbmRpY2VzLnJhbmt9LmApO1xuICB9XG4gIGlmICh1cGRhdGVzLnJhbmsgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGYuc2NhdHRlck5EKCkgZXhwZWN0cyB0aGUgdXBkYXRlcyB0byBiZSByYW5rIDEgb3IgaGlnaGVyLCcgK1xuICAgICAgICBgIGJ1dCB0aGUgcmFuayB3YXMgJHt1cGRhdGVzLnJhbmt9LmApO1xuICB9XG4gIGlmIChpbmRpY2VzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgZHR5cGUgb2YgJ2luZGljZXMnIHNob3VsZCBiZSBpbnQzMiwgYnV0IGdvdCBkdHlwZTogJHtcbiAgICAgICAgaW5kaWNlcy5kdHlwZX1gKTtcbiAgfVxuICBpZiAoc2hhcGUubGVuZ3RoIDwgMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE91dHB1dCByYW5rIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAxLCBidXQgZ290IHNoYXBlOiAke3NoYXBlfWApO1xuICB9XG5cbiAgaWYgKHNoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpbmRpY2VzLnNpemUgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBzcGVjaWZpZWQgZm9yIGVtcHR5IG91dHB1dC4gaW5kaWNlcyBzaGFwZTogJHtcbiAgICAgICAgICBpbmRpY2VzLnNoYXBlfWApO1xuICAgIH1cbiAgICBpZiAodXBkYXRlcy5zaXplID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVwZGF0ZXMgc3BlY2lmaWVkIGZvciBlbXB0eSBvdXRwdXQuIHVwZGF0ZXMgc2hhcGU6ICR7XG4gICAgICAgICAgdXBkYXRlcy5zaGFwZX1gKTtcbiAgICB9XG4gIH1cblxuICB2YWxpZGF0ZVVwZGF0ZVNoYXBlKHNoYXBlLCBpbmRpY2VzLCB1cGRhdGVzKTtcbn1cblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIHNoYXBlIGluZm9ybWF0aW9uIGZvciB0aGUgb3V0cHV0LlxuICpcbiAqIEBwYXJhbSB1cGRhdGUgVGhlIHRlbnNvciBjb250YWlucyB0aGUgdXBkYXRlIHZhbHVlcy5cbiAqIEBwYXJhbSBpbmRpY2VzIFRoZSB0ZW5zb3IgY29udGFpbnMgdGhlIGluZGljZXMgZm9yIHRoZSB1cGRhdGUgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBAcmV0dXJucyBTY2F0dGVyU2hhcGVJbmZvXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjYWxjdWxhdGVTaGFwZXMoXG4gICAgdXBkYXRlczogVGVuc29ySW5mbywgaW5kaWNlczogVGVuc29ySW5mbyxcbiAgICBzaGFwZTogbnVtYmVyW10pOiBTY2F0dGVyU2hhcGVJbmZvIHtcbiAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucyBpbiBpbmRpY2VzXG4gIGNvbnN0IGluZGljZXNSYW5rID0gaW5kaWNlcy5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHNsaWNlUmFuayA9IChpbmRpY2VzUmFuayA+IDEpID8gaW5kaWNlcy5zaGFwZVtpbmRpY2VzUmFuayAtIDFdIDogMTtcblxuICAvLyBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IG1ha2UgdXAgZWFjaCBzbGljZSBvZiBvdXIgdXBkYXRlZFxuICAvLyB0ZW5zb3IuIFRoaXMgYWxsb3dzIHVzIHRvIHdvcmsgd2l0aCBmbGF0dGVuZWQgdGVuc29ycyBhbmQgY29weSBvdmVyIHdob2xlXG4gIC8vIHNsaWNlcyBhdCBhIHRpbWUuXG4gIGNvbnN0IHRvdGFsTmQgPSBzaGFwZS5sZW5ndGg7XG5cbiAgbGV0IHNsaWNlU2l6ZSA9IDE7XG4gIGZvciAobGV0IGkgPSBzbGljZVJhbms7IGkgPCB0b3RhbE5kOyArK2kpIHtcbiAgICBzbGljZVNpemUgKj0gc2hhcGVbaV07XG4gIH1cblxuICBjb25zdCBzYWZlU2xpY2VEaW0gPSAoc2xpY2VSYW5rIDwgMSkgPyAxIDogc2xpY2VSYW5rO1xuICBjb25zdCBudW1VcGRhdGVzID0gc2l6ZUZyb21TaGFwZShpbmRpY2VzLnNoYXBlKSAvIHNhZmVTbGljZURpbTtcblxuICBjb25zdCBzdHJpZGVzID0gWy4uLmNvbXB1dGVTdHJpZGVzKHNoYXBlLnNsaWNlKDAsIHNsaWNlUmFuaykpLCAxXTtcbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IHNpemVGcm9tU2hhcGUoc2hhcGUpO1xuICByZXR1cm4ge3NsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\nconst NEW_AXIS = -2;\nconst SHRINK_AXIS = -1;\nexport function assertParamsValid(input, begin, size) {\n    const inputRank = input.shape.length;\n    util.assert(inputRank === begin.length, () => `Error in slice${inputRank}D: Length of begin ${begin} must ` +\n        `match the rank of the array (${inputRank}).`);\n    util.assert(inputRank === size.length, () => `Error in slice${inputRank}D: Length of size ${size} must ` +\n        `match the rank of the array (${inputRank}).`);\n    for (let i = 0; i < inputRank; ++i) {\n        util.assert(begin[i] + size[i] <= input.shape[i], () => `Error in slice${inputRank}D: begin[${i}] + size[${i}] ` +\n            `(${begin[i] + size[i]}) would overflow input.shape[${i}] (${input.shape[i]})`);\n    }\n}\n/** Converts a binary mask to an array of axes. Used in stridedSlice(). */\nexport function maskToAxes(mask) {\n    const axes = [];\n    let axis = 0;\n    while (mask > 0) {\n        if (mask & 1) {\n            axes.push(axis);\n        }\n        mask /= 2;\n        axis++;\n    }\n    return axes;\n}\n/** Computes the output shape given the strided slice params. */\nexport function computeOutShape(begin, end, strides) {\n    const size = [];\n    for (let axis = 0; axis < begin.length; axis++) {\n        size[axis] = Math.ceil((end[axis] - begin[axis]) / strides[axis]);\n    }\n    return size;\n}\n// Creates full selection at the elided dimensions. If the dimension matches\n// the ellipsis mask, override the current stride value. Otherwise, insert.\nexport function stridesWithElidedDims(strides, ellipsisInsertionIndex, numElidedAxes, inputShape) {\n    const newStrides = [...strides];\n    for (let i = newStrides.length; i < inputShape.length; i++) {\n        newStrides.push(1);\n    }\n    for (let i = 0; i < numElidedAxes; i++) {\n        if (i === 0) {\n            newStrides[ellipsisInsertionIndex] = 1;\n        }\n        else {\n            newStrides.splice(ellipsisInsertionIndex, 0 /* num elements to delete */, 1 /* element to add */);\n            newStrides.pop();\n        }\n    }\n    return newStrides;\n}\nfunction unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, normalizedAxis) {\n    if (normalizedAxis <= ellipsisInsertionIndex) {\n        return normalizedAxis;\n    }\n    return normalizedAxis - (numElidedAxes - 1);\n}\nfunction getElidedAxes(numElidedAxes, ellipsisInsertionIndex) {\n    const elidedAxes = [];\n    for (let i = 0; i < numElidedAxes; i++) {\n        elidedAxes.push(ellipsisInsertionIndex + i);\n    }\n    return elidedAxes;\n}\n// Normalize the start, end and strides.\nexport function getNormalizedAxes(inputShape, ellipsisAxes, numInterpolatedAxes, begin, end, strides, beginMask, endMask, ellipsisMask) {\n    const inputRank = inputShape.length;\n    let normalizedBegin = new Array(inputRank), normalizedEnd = new Array(inputRank), normalizedStrides = new Array(inputRank);\n    if (ellipsisAxes.length && numInterpolatedAxes > 0) {\n        const fullIndex = ellipsisAxes[0];\n        // The ellipsis applies to the masked index as well as any dimensions\n        // that are interpolated.\n        const numElidedAxes = numInterpolatedAxes + 1;\n        normalizedBegin = startIndicesWithElidedDims(beginMask, fullIndex, numElidedAxes, begin, inputShape);\n        normalizedEnd = stopIndicesWithElidedDims(endMask, fullIndex, numElidedAxes, end, inputShape);\n        normalizedStrides =\n            stridesWithElidedDims(strides, fullIndex, numElidedAxes, inputShape);\n    }\n    else {\n        for (let axis = 0; axis < inputRank; axis++) {\n            normalizedBegin[axis] = startForAxis(beginMask, begin, strides, inputShape, axis, ellipsisMask);\n            normalizedEnd[axis] =\n                stopForAxis(endMask, end, strides, inputShape, axis, ellipsisMask);\n            normalizedStrides[axis] = stridesForAxis(strides, axis, ellipsisMask);\n        }\n    }\n    return {\n        begin: normalizedBegin,\n        end: normalizedEnd,\n        strides: normalizedStrides\n    };\n}\n// Creates full selection at the elided dimensions. If the dimension matches\n// the ellipsis mask, override the current start value. Otherwise, insert.\nexport function startIndicesWithElidedDims(beginMask, ellipsisInsertionIndex, numElidedAxes, originalBegin, inputShape) {\n    const newIndices = [...inputShape];\n    const elidedAxes = getElidedAxes(numElidedAxes, ellipsisInsertionIndex);\n    for (let axis = 0; axis < newIndices.length; axis++) {\n        if (elidedAxes.indexOf(axis) > -1) {\n            newIndices[axis] = 0;\n        }\n        else {\n            const originalAxis = unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, axis);\n            let originalValue = originalBegin[originalAxis];\n            if (beginMask & 1 << originalAxis) {\n                originalValue = 0;\n            }\n            newIndices[axis] = originalValue;\n        }\n    }\n    return newIndices;\n}\n// Creates full selection at the elided dimensions. If the dimension matches\n// the ellipsis mask, override the current stop value. Otherwise, insert.\nexport function stopIndicesWithElidedDims(endMask, ellipsisInsertionIndex, numElidedAxes, originalEnd, inputShape) {\n    const newIndices = [...inputShape];\n    const elidedAxes = getElidedAxes(numElidedAxes, ellipsisInsertionIndex);\n    for (let axis = 0; axis < newIndices.length; axis++) {\n        if (elidedAxes.indexOf(axis) > -1) {\n            newIndices[axis] = Number.MAX_SAFE_INTEGER;\n        }\n        else {\n            const originalAxis = unnormalizeAxis(ellipsisInsertionIndex, numElidedAxes, axis);\n            let originalValue = originalEnd[originalAxis];\n            if (endMask & 1 << originalAxis) {\n                originalValue = Number.MAX_SAFE_INTEGER;\n            }\n            newIndices[axis] = originalValue;\n        }\n    }\n    for (let i = 0; i < newIndices.length; i++) {\n        // Handle negative indices\n        const axisSize = inputShape[i];\n        if (newIndices[i] < 0) {\n            newIndices[i] += axisSize;\n        }\n        newIndices[i] = util.clamp(0, newIndices[i], inputShape[i]);\n    }\n    return newIndices;\n}\nexport function stridesForAxis(strides, axis, ellipsisMask) {\n    let stride = strides[axis];\n    if (ellipsisMask & (1 << axis) || stride == null) {\n        stride = 1;\n    }\n    return stride;\n}\nexport function startForAxis(beginMask, startIndices, strides, inputShape, axis, ellipsisMask) {\n    // Begin with the specified index\n    let start = startIndices[axis];\n    const stride = strides[axis] || 1;\n    // Check the axis bit from right of masked axes, or the begin index is not set\n    // for the axis.\n    if (beginMask & 1 << axis || ellipsisMask & 1 << axis || start == null) {\n        if (stride > 0) {\n            // Forward iteration - use the first element. These values will get\n            // clamped below (Note: We could have set them to 0 and axis_size-1, but\n            // use lowest() and max() to maintain symmetry with StopForAxis())\n            start = Number.MIN_SAFE_INTEGER;\n        }\n        else {\n            // Backward iteration - use the last element.\n            start = Number.MAX_SAFE_INTEGER;\n        }\n    }\n    // Handle negative indices\n    const axisSize = inputShape[axis];\n    if (start < 0) {\n        start += axisSize;\n    }\n    // Clamping\n    start = util.clamp(0, start, axisSize - 1);\n    return start;\n}\nexport function stopForAxis(endMask, stopIndices, strides, inputShape, axis, ellipsisMask) {\n    // Begin with the specified index\n    let stop = stopIndices[axis];\n    const stride = strides[axis] || 1;\n    // Check the axis bit from right of masked axes, or if the stop index is not\n    // set for this axis.\n    if (endMask & (1 << axis) || ellipsisMask & (1 << axis) || stop == null) {\n        if (stride > 0) {\n            // Forward iteration - use the last element. These values will get\n            // clamped below\n            stop = Number.MAX_SAFE_INTEGER;\n        }\n        else {\n            // Backward iteration - use the first element.\n            stop = Number.MIN_SAFE_INTEGER;\n        }\n    }\n    // Handle negative indices\n    const axisSize = inputShape[axis];\n    if (stop < 0) {\n        stop += axisSize;\n    }\n    // Clamping\n    // Because the end index points one past the last element, we need slightly\n    // different clamping ranges depending on the direction.\n    if (stride > 0) {\n        // Forward iteration\n        stop = util.clamp(0, stop, axisSize);\n    }\n    else {\n        // Backward iteration\n        stop = util.clamp(-1, stop, axisSize - 1);\n    }\n    return stop;\n}\n/**\n * Returns true if the slice occupies a continous set of elements in the\n * 'flat' space.\n */\nexport function isSliceContinous(shape, begin, size) {\n    // Index of the first axis that has size > 1.\n    let firstNonOneAxis = size.length;\n    for (let i = 0; i < size.length; i++) {\n        if (size[i] > 1) {\n            firstNonOneAxis = i;\n            break;\n        }\n    }\n    for (let i = firstNonOneAxis + 1; i < size.length; i++) {\n        if (begin[i] > 0 || size[i] !== shape[i]) {\n            return false;\n        }\n    }\n    return true;\n}\nexport function computeFlatOffset(begin, strides) {\n    let flatOffset = begin.length > 0 ? begin[begin.length - 1] : 1;\n    for (let i = 0; i < begin.length - 1; i++) {\n        flatOffset += begin[i] * strides[i];\n    }\n    return flatOffset;\n}\nexport function parseSliceParams(x, begin, size) {\n    // The following logic allows for more ergonomic calls.\n    let begin_;\n    const xRank = x.shape.length;\n    if (typeof begin === 'number') {\n        begin_ = [begin, ...new Array(xRank - 1).fill(0)];\n    }\n    else if (begin.length < xRank) {\n        begin_ = begin.concat(new Array(xRank - begin.length).fill(0));\n    }\n    else {\n        begin_ = begin.slice();\n    }\n    begin_.forEach(d => {\n        util.assert(d !== -1, () => 'slice() does not support negative begin indexing.');\n    });\n    let size_;\n    if (size == null) {\n        size_ = new Array(xRank).fill(-1);\n    }\n    else if (typeof size === 'number') {\n        size_ = [size, ...new Array(xRank - 1).fill(-1)];\n    }\n    else if (size.length < xRank) {\n        size_ = size.concat(new Array(xRank - size.length).fill(-1));\n    }\n    else {\n        size_ = size;\n    }\n    size_ = size_.map((d, i) => {\n        if (d >= 0) {\n            return d;\n        }\n        else {\n            util.assert(d === -1, () => `Negative size values should be exactly -1 but got ` +\n                `${d} for the slice() size at index ${i}.`);\n            return x.shape[i] - begin_[i];\n        }\n    });\n    return [begin_, size_];\n}\n// Convert the slicing specification from a sparse representation to a dense\n// representation. This means that all ellipses and newaxis are expanded out.\nexport function sliceInfo(xShape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask) {\n    let stridesNonNull;\n    if (strides == null) {\n        stridesNonNull = new Array(begin.length);\n        stridesNonNull.fill(1);\n    }\n    else {\n        stridesNonNull = strides;\n    }\n    // Only one non-zero bit is allowed in ellipsisMask, which means ellipsisMask\n    // is a power of 2. Use bit compares to ensure ellipsisMask is 0 or a power\n    // of 2. When i is a power of 2, i & (i - 1) is always 0.\n    // Also ref:\n    // https://stackoverflow.com/questions/600293/how-to-check-if-a-number-is-a-power-of-2\n    if (ellipsisMask != null && (ellipsisMask & (ellipsisMask - 1)) !== 0) {\n        throw new Error('Multiple ellipses in slice is not allowed.');\n    }\n    // Step 1: Account for ellipsis and new axis.\n    // Check for ellipsis and count how many non-newaxis there are after.\n    let ellipsisSeen = false;\n    const sparseSpec = {\n        dims: stridesNonNull.length,\n        numAddAxisAfterEllipsis: 0,\n        begin: begin.slice(),\n        end: end.slice(),\n        strides: stridesNonNull.slice(),\n        beginMask,\n        endMask,\n        ellipsisMask,\n        newAxisMask,\n        shrinkAxisMask\n    };\n    for (let i = 0; i < sparseSpec.dims; i++) {\n        if (ellipsisSeen && ((1 << i) & newAxisMask) !== 0) {\n            sparseSpec.numAddAxisAfterEllipsis++;\n        }\n        if ((1 << i) & ellipsisMask) {\n            ellipsisSeen = true;\n        }\n    }\n    // If no ellipsis insert one at the end.\n    if (!ellipsisSeen) {\n        sparseSpec.ellipsisMask |= (1 << sparseSpec.dims);\n        sparseSpec.dims++; // this effects loop iteration below\n    }\n    // Step 2: Make a sparse spec into a full index spec.\n    //\n    // The sparse spec deos not correspond to the number of dimensions.\n    // Make a dense spec that cooresponds to the number of dimensions.\n    //\n    // For example suppose foo[...,3:] on foo.shape = [2, 2, 3] then we need to\n    // produce the missing beginMask for the first two dimensions i.e. from\n    // beginMaskSpec = 0, endMaskSpec = 2, we achieve beginMask = 6 (110),\n    // endMask = 7 (111).\n    const denseSpec = {\n        dims: xShape.length,\n        beginMask: 0,\n        endMask: 0,\n        beginValid: false,\n        endValid: false\n    };\n    buildDenseSpec(sparseSpec, denseSpec);\n    // Step 3: Make implicit ranges (non-zero beginMasks and endMasks) explicit\n    // and bounds check.\n    let isIdentity = true;\n    let sliceDim0 = true;\n    let isSimpleSlice = true;\n    const processingShape = [];\n    const finalShape = [];\n    for (let i = 0; i < xShape.length; ++i) {\n        if (denseSpec.strides[i] === 0) {\n            throw Error(`strides[${i}] must be non-zero`);\n        }\n        const shrinkI = !!(denseSpec.shrinkAxisMask & (1 << i));\n        const dimI = xShape[i];\n        if (dimI === -1) {\n            processingShape.push(shrinkI ? 1 : -1);\n            continue;\n        }\n        const masks = [denseSpec.beginMask & (1 << i), denseSpec.endMask & (1 << i)];\n        const validRange = [\n            denseSpec.strides[i] > 0 ? 0 : -1,\n            denseSpec.strides[i] > 0 ? dimI : dimI - 1\n        ];\n        if (shrinkI && denseSpec.strides[i] <= 0) {\n            throw Error('only stride 1 allowed on non-range indexing.');\n        }\n        isSimpleSlice = isSimpleSlice && (denseSpec.strides[i] === 1);\n        const beginAndEndMasked = !!((denseSpec.beginMask & (1 << i)) && (denseSpec.endMask & (1 << i)));\n        if (denseSpec.beginValid && denseSpec.endValid) {\n            if (shrinkI) {\n                // If we are shrinking, the end index is now possibly incorrect. In\n                // particular foo[-1] produces sparseBegin = -1, sparseEnd = 0.\n                // and canonical puts these to n-1 and 0, which implies a degenerate\n                // interval. Fortunately, it is now safe to re-create end as begin + 1.\n                const xFwd = denseSpec.begin[i] < 0 ? dimI + denseSpec.begin[i] :\n                    denseSpec.begin[i];\n                denseSpec.begin[i] = xFwd;\n                denseSpec.end[i] = denseSpec.begin[i] + 1;\n                if (xFwd < 0 || xFwd >= dimI) {\n                    throw Error(`slice index ${denseSpec.begin[i]} of dimension ${i} out of bounds.`);\n                }\n            }\n            else {\n                denseSpec.begin[i] = canonical(denseSpec.begin[i], 0, denseSpec.strides[i], dimI, masks, validRange);\n                denseSpec.end[i] = canonical(denseSpec.end[i], 1, denseSpec.strides[i], dimI, masks, validRange);\n            }\n            // Update optimization values\n            const takeAllInDimension = denseSpec.strides[i] === 1 &&\n                denseSpec.begin[i] === 0 && denseSpec.end[i] === dimI;\n            isIdentity = isIdentity && takeAllInDimension;\n            sliceDim0 = sliceDim0 &&\n                ((i === 0 && denseSpec.strides[i] === 1) || takeAllInDimension);\n        }\n        else {\n            isIdentity =\n                isIdentity && ((denseSpec.strides[i] === 1) && beginAndEndMasked);\n            sliceDim0 = sliceDim0 &&\n                ((i === 0 && denseSpec.strides[i] === 1) || beginAndEndMasked);\n        }\n        // Compute the processing shape (the intermediate Eigen will produce)\n        let intervalLength;\n        let knownInterval = false;\n        if (denseSpec.beginValid && denseSpec.endValid) {\n            intervalLength = denseSpec.end[i] - denseSpec.begin[i];\n            knownInterval = true;\n        }\n        else if (shrinkI) {\n            // The dimension is still known as 1 for the processingShape, but will be\n            // discarded for the final shape.\n            intervalLength = 1;\n            knownInterval = true;\n        }\n        else if (beginAndEndMasked) {\n            // Even if we don't have values for begin or end, we do know that this\n            // dimension covers the whole interval. If we have shape information for\n            // this dimension, that tells us the interval length.\n            if (dimI >= 0) {\n                if (denseSpec.strides[i] < 0) {\n                    intervalLength = -dimI;\n                }\n                else {\n                    intervalLength = dimI;\n                }\n                knownInterval = true;\n            }\n        }\n        if (knownInterval) {\n            let sizeI;\n            // Hold zero if the interval is degenerate, otherwise account for\n            // remainder\n            if (intervalLength === 0 ||\n                ((intervalLength < 0) !== (denseSpec.strides[i] < 0))) {\n                sizeI = 0;\n            }\n            else {\n                sizeI = Math.trunc(intervalLength / denseSpec.strides[i]) +\n                    (intervalLength % denseSpec.strides[i] !== 0 ? 1 : 0);\n            }\n            processingShape.push(sizeI);\n        }\n        else {\n            processingShape.push(-1);\n        }\n    }\n    // Step 4: Compute the final shape\n    //\n    // newAxis will increase dimension by 1 (with a one-size dimension)\n    // slices like foo[3, ...] will reduce dimension by 1.\n    // This cannot be done earlier, because it depends on Step 3.\n    for (let denseDim = 0; denseDim < denseSpec.finalShapeGatherIndices.length; ++denseDim) {\n        const gatherIndex = denseSpec.finalShapeGatherIndices[denseDim];\n        if (gatherIndex >= 0) {\n            finalShape.push(processingShape[gatherIndex]);\n        }\n        else if (gatherIndex === NEW_AXIS) {\n            finalShape.push(1);\n        }\n    }\n    const finalShapeSparse = finalShape.filter((dim, i) => denseSpec.finalShapeGatherIndices[i] !== NEW_AXIS);\n    return {\n        finalShapeSparse,\n        finalShape,\n        isIdentity,\n        sliceDim0,\n        isSimpleSlice,\n        begin: denseSpec.begin,\n        end: denseSpec.end,\n        strides: denseSpec.strides\n    };\n}\nfunction buildDenseSpec(sparse, dense) {\n    dense.beginMask = 0;\n    dense.endMask = 0;\n    dense.shrinkAxisMask = 0;\n    let fullIndex = 0;\n    dense.beginValid = sparse.begin != null;\n    dense.endValid = sparse.end != null;\n    dense.begin = new Array(dense.dims);\n    dense.end = new Array(dense.dims);\n    dense.strides = new Array(dense.dims);\n    dense.finalShapeGatherIndices = [];\n    dense.finalShapeGatherIndicesSparse = [];\n    dense.inputShapeGatherIndicesSparse = new Array(dense.dims);\n    for (let i = 0; i < sparse.dims; i++) {\n        if ((1 << i) & sparse.ellipsisMask) {\n            // Only the bit that has ellipsis will fall in this condition.\n            // Expand the ellipsis into the appropriate indices\n            // Note: this only works because we guaranteed one ellipsis.\n            const nextIndex = Math.min(dense.dims - (sparse.dims - i) + 1 + sparse.numAddAxisAfterEllipsis, dense.dims);\n            for (; fullIndex < nextIndex; fullIndex++) {\n                // newAxis aren't real axis so you have to skip.\n                dense.begin[fullIndex] = 0;\n                dense.end[fullIndex] = 0;\n                dense.strides[fullIndex] = 1;\n                dense.beginMask |= (1 << fullIndex);\n                dense.endMask |= (1 << fullIndex);\n                dense.finalShapeGatherIndices.push(fullIndex);\n                dense.finalShapeGatherIndicesSparse.push(-1);\n                dense.inputShapeGatherIndicesSparse[fullIndex] = i;\n            }\n        }\n        else if ((1 << i) & sparse.newAxisMask) {\n            // Only the bit that has newAxis will fall in this condition.\n            dense.finalShapeGatherIndices.push(NEW_AXIS);\n            dense.finalShapeGatherIndicesSparse.push(-1);\n        }\n        else {\n            if (fullIndex === dense.begin.length) {\n                throw Error(`Index out of range using input dim ${fullIndex}; input ` +\n                    `has only ${dense.dims} dims, ${dense.begin.length}.`);\n            }\n            // Gather slicing spec into appropriate index.\n            if (sparse.begin != null) {\n                dense.begin[fullIndex] = sparse.begin[i];\n            }\n            if (sparse.end != null) {\n                dense.end[fullIndex] = sparse.end[i];\n            }\n            dense.strides[fullIndex] = sparse.strides[i];\n            if (sparse.beginMask & (1 << i)) {\n                dense.beginMask |= (1 << fullIndex);\n            }\n            if (sparse.endMask & (1 << i)) {\n                dense.endMask |= (1 << fullIndex);\n            }\n            // If shrink, record where to get the dimensionality from (i.e. newAxis)\n            // creates a fake 1 size dimension. Also remember shrink axis (now in\n            // dense form) so we can ignore dense.end below.\n            if (sparse.shrinkAxisMask & (1 << i)) {\n                dense.finalShapeGatherIndices.push(SHRINK_AXIS);\n                dense.finalShapeGatherIndicesSparse.push(-1);\n                dense.shrinkAxisMask |= (1 << fullIndex);\n            }\n            else {\n                dense.finalShapeGatherIndices.push(fullIndex);\n                // Remember that where in the sparse shape the dense dim comes from.\n                dense.finalShapeGatherIndicesSparse.push(i);\n            }\n            dense.inputShapeGatherIndicesSparse[fullIndex] = i;\n            fullIndex++;\n        }\n    }\n}\nfunction canonical(x, c, strideI, dimI, masks, validRange) {\n    if (masks[c]) {\n        return strideI > 0 ? validRange[c] : validRange[(c + 1) & 1];\n    }\n    else {\n        const xFwd = x < 0 ? dimI + x : x; // make negative indices positive\n        return xFwd < validRange[0] ? validRange[0] :\n            xFwd > validRange[1] ? validRange[1] : xFwd;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDcEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUE2RHZCLE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsS0FBaUIsRUFBRSxLQUFlLEVBQUUsSUFBYztJQUNwRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUNyQyxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsS0FBSyxLQUFLLENBQUMsTUFBTSxFQUMxQixHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsU0FBUyxzQkFBc0IsS0FBSyxRQUFRO1FBQy9ELGdDQUFnQyxTQUFTLElBQUksQ0FBQyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQ3pCLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixTQUFTLHFCQUFxQixJQUFJLFFBQVE7UUFDN0QsZ0NBQWdDLFNBQVMsSUFBSSxDQUFDLENBQUM7SUFFdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNsQyxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDcEMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLFNBQVMsWUFBWSxDQUFDLFlBQVksQ0FBQyxJQUFJO1lBQzFELElBQUksS0FBSyxDQUFD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UyxDQUFDLENBQUM7Z0JBQzlDLG9FQUFvRTtnQkFDcEUsS0FBSyxDQUFDLDZCQUE2QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM3QztZQUNELEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkQsU0FBUyxFQUFFLENBQUM7U0FDYjtLQUNGO0FBQ0gsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUNkLENBQVMsRUFBRSxDQUFTLEVBQUUsT0FBZSxFQUFFLElBQVksRUFBRSxLQUFlLEVBQ3BFLFVBQW9CO0lBQ3RCLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ1osT0FBTyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUM5RDtTQUFNO1FBQ0wsTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsaUNBQWlDO1FBQ3JFLE9BQU8sSUFBSSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDZixJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUMzRTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmNvbnN0IE5FV19BWElTID0gLTI7XG5jb25zdCBTSFJJTktfQVhJUyA9IC0xO1xuXG4vLyBTcGFyc2Ugc2xpY2luZyBzcGVjaWZpY2F0aW9uXG4vLyBpZiBvbmUgZG9lcyBmb29bMzo1LCAuLi4sIC0zXSwgdGhlIGJlZ2luLCBlbmQgYW5kIHN0cmlkZXMgd2lsbCBoYXZlIGxlbmd0aFxuLy8gb2YgMy5cbmludGVyZmFjZSBTdHJpZGVkU2xpY2VTcGFyc2VTcGVjIHtcbiAgZGltczogbnVtYmVyO1xuICBudW1BZGRBeGlzQWZ0ZXJFbGxpcHNpczogbnVtYmVyO1xuICBiZWdpbjogbnVtYmVyW107XG4gIGVuZDogbnVtYmVyW107XG4gIHN0cmlkZXM6IG51bWJlcltdO1xuICBiZWdpbk1hc2s6IG51bWJlcjtcbiAgZW5kTWFzazogbnVtYmVyO1xuICBlbGxpcHNpc01hc2s6IG51bWJlcjtcbiAgbmV3QXhpc01hc2s6IG51bWJlcjtcbiAgc2hyaW5rQXhpc01hc2s6IG51bWJlcjtcbn1cblxuLy8gRGVuc2Ugc2xpY2luZyBzcGVjaWZpY2F0aW9uXG4vLyBhbGwgZWxsaXBzZXMgYW5kIG5ld2F4aXMgYXJlIGV4cGFuZGVkIG91dC4gU28gaWYgZm9vWzM6NSwgLi4uLCAtM10gd2hlcmUgZm9vXG4vLyBpcyAxMCBkaW1lbnNpb25hbCwgZWFjaCBhcnJheSBvZiBiZWdpbiwgZW5kLCBzdHJpZGVzIHdpbGwgaGF2ZSAxMCBlbnRyaWVzXG4vLyB3aGVyZSBhcyB0aGUgc3BhcnNlIGNhbiBoYXZlIGxlbmd0aCBsZXNzIHRoYW4gdGhlIHJhbmsgb2YgZm9vLlxuaW50ZXJmYWNlIFN0cmlkZWRTbGljZURlbnNlU3BlYyB7XG4gIGRpbXM6IG51bWJlcjtcbiAgYmVnaW5NYXNrPzogbnVtYmVyO1xuICBlbmRNYXNrPzogbnVtYmVyO1xuICBiZWdpblZhbGlkOiBib29sZWFuO1xuICBlbmRWYWxpZDogYm9vbGVhbjtcbiAgYmVnaW4/OiBudW1iZXJbXTtcbiAgZW5kPzogbnVtYmVyW107XG4gIHN0cmlkZXM/OiBudW1iZXJbXTtcbiAgLy8gVGhpcyBhcnJheSBoZWxwcyBjb25zdHJ1Y3QgdGhlIGZpbmFsIHNoYXBlIG9mIHRoZSBzbGljZS5cbiAgLy8gVGhlIGZpbmFsIHRlbnNvciBpcyByZWR1Y2VkIGluIHJhbmsgd2hlbmV2ZXIgYSBzaW5nbGUgaW5kZXggZS5nLiBmb29bM11cbiAgLy8gaXMgY2FsbGVkIGZvci4gVGhlIGZpbmFsIHRlbnNvciBpbmNyZWFzZXMgaW4gcmFuayB3aXRoIG5ld0F4aXMgZW50cmllcy5cbiAgLy8gSWYgYW4gaW5kZXggaW4gdGhpcyBhcnJheSBpcyBwb3NpdGl2ZSwgdGhlIHNpemUgb2YgdGhlIGRpbWVuc2lvbiBpc1xuICAvLyBvYnRhaW5lZCBmcm9tIGNhbm9uaWNhbCBlbmQtYmVnaW4uICBPdGhlcndpc2UsIGlmIGl0IGlzIGEgTkVXX0FYSVMsIGl0IHdpbGxcbiAgLy8gYmUgMS4gQSBzaHJ1bmsgZGltZW5zaW9uIGlzIHNraXBwZWQuXG4gIGZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzPzogbnVtYmVyW107XG4gIC8vIFRoaXMgYXJyYXkgaGFzIHRoZSBzYW1lIHNpemUgYXMgZmluYWxTaGFwZUdhdGhlckluZGljZXMsIGJ1dCBpdCByZW1lbWJlcnNcbiAgLy8gdGhlIHNwYXJzZSBpbmRleCB0aGF0IGEgZGltZW5zaW9uIGNvbWVzIGZyb20sIGluc3RlYWQgb2YgZGVuc2UgaW5kZXguXG4gIC8vIEEgLTEgaW4gdGhpcyB2ZWN0b3IgbWVhbnMgdGhlIGluZGV4IGlzIG5vdCBmcm9tIHRoZSBzcGFyc2UgaW5wdXQuXG4gIGZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzU3BhcnNlPzogbnVtYmVyW107XG4gIGlucHV0U2hhcGVHYXRoZXJJbmRpY2VzU3BhcnNlPzogbnVtYmVyW107XG4gIC8vIFRoZSBkZW5zZSBpbmRleGVkIHNocmluayBtYXNrIGlzIHdoaWNoIHByb2Nlc3NpbmcgZGltZW5zaW9ucyBzaG91bGQgYmVcbiAgLy8gc2hydW5rLiBGb3IgZXhhbXBsZSwgaWYgZm9vLnNoYXBlID0gWzEwLCAxMCwgMTAsIDEwXSwgZm9vWzMsIC4uLiwgNV0gaGFzXG4gIC8vIHNwYXJzZVNocmlua0F4aXNNYXNrIG9mIDUgKDAxMDEpIGFuZCBkZW5zZVNocmlua0F4aXNNYXNrIG9mIDkgKDEwMDEpLFxuICAvLyB5aWVsZGluZyBhIGZpbmFsIHNoYXBlIFsxMCwgMTBdLlxuICBzaHJpbmtBeGlzTWFzaz86IG51bWJlcjtcbn1cblxuZXhwb3J0IHR5cGUgU2xpY2VJbmZvID0ge1xuICBmaW5hbFNoYXBlU3BhcnNlOiBudW1iZXJbXSxcbiAgZmluYWxTaGFwZTogbnVtYmVyW10sXG4gIGlzSWRlbnRpdHk6IGJvb2xlYW4sXG4gIHNsaWNlRGltMDogYm9vbGVhbixcbiAgaXNTaW1wbGVTbGljZTogYm9vbGVhbixcbiAgYmVnaW46IG51bWJlcltdLFxuICBlbmQ6IG51bWJlcltdLFxuICBzdHJpZGVzOiBudW1iZXJbXVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFBhcmFtc1ZhbGlkKFxuICAgIGlucHV0OiBUZW5zb3JJbmZvLCBiZWdpbjogbnVtYmVyW10sIHNpemU6IG51bWJlcltdKTogdm9pZCB7XG4gIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dFJhbmsgPT09IGJlZ2luLmxlbmd0aCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBiZWdpbiAke2JlZ2lufSBtdXN0IGAgK1xuICAgICAgICAgIGBtYXRjaCB0aGUgcmFuayBvZiB0aGUgYXJyYXkgKCR7aW5wdXRSYW5rfSkuYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5wdXRSYW5rID09PSBzaXplLmxlbmd0aCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzbGljZSR7aW5wdXRSYW5rfUQ6IExlbmd0aCBvZiBzaXplICR7c2l6ZX0gbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggdGhlIHJhbmsgb2YgdGhlIGFycmF5ICgke2lucHV0UmFua30pLmApO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRSYW5rOyArK2kpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgYmVnaW5baV0gKyBzaXplW2ldIDw9IGlucHV0LnNoYXBlW2ldLFxuICAgICAgICAoKSA9PiBgRXJyb3IgaW4gc2xpY2Uke2lucHV0UmFua31EOiBiZWdpblske2l9XSArIHNpemVbJHtpfV0gYCArXG4gICAgICAgICAgICBgKCR7YmVnaW5baV0gKyBzaXplW2ldfSkgd291bGQgb3ZlcmZsb3cgaW5wdXQuc2hhcGVbJHtpfV0gKCR7XG4gICAgICAgICAgICAgICAgICBpbnB1dC5zaGFwZVtpXX0pYCk7XG4gIH1cbn1cblxuLyoqIENvbnZlcnRzIGEgYmluYXJ5IG1hc2sgdG8gYW4gYXJyYXkgb2YgYXhlcy4gVXNlZCBpbiBzdHJpZGVkU2xpY2UoKS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXNrVG9BeGVzKG1hc2s6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgYXhlcyA9IFtdO1xuICBsZXQgYXhpcyA9IDA7XG4gIHdoaWxlIChtYXNrID4gMCkge1xuICAgIGlmIChtYXNrICYgMSkge1xuICAgICAgYXhlcy5wdXNoKGF4aXMpO1xuICAgIH1cbiAgICBtYXNrIC89IDI7XG4gICAgYXhpcysrO1xuICB9XG4gIHJldHVybiBheGVzO1xufVxuXG4vKiogQ29tcHV0ZXMgdGhlIG91dHB1dCBzaGFwZSBnaXZlbiB0aGUgc3RyaWRlZCBzbGljZSBwYXJhbXMuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dFNoYXBlKFxuICAgIGJlZ2luOiBudW1iZXJbXSwgZW5kOiBudW1iZXJbXSwgc3RyaWRlczogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHNpemUgPSBbXTtcbiAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBiZWdpbi5sZW5ndGg7IGF4aXMrKykge1xuICAgIHNpemVbYXhpc10gPSBNYXRoLmNlaWwoKGVuZFtheGlzXSAtIGJlZ2luW2F4aXNdKSAvIHN0cmlkZXNbYXhpc10pO1xuICB9XG4gIHJldHVybiBzaXplO1xufVxuXG4vLyBDcmVhdGVzIGZ1bGwgc2VsZWN0aW9uIGF0IHRoZSBlbGlkZWQgZGltZW5zaW9ucy4gSWYgdGhlIGRpbWVuc2lvbiBtYXRjaGVzXG4vLyB0aGUgZWxsaXBzaXMgbWFzaywgb3ZlcnJpZGUgdGhlIGN1cnJlbnQgc3RyaWRlIHZhbHVlLiBPdGhlcndpc2UsIGluc2VydC5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVzV2l0aEVsaWRlZERpbXMoXG4gICAgc3RyaWRlczogbnVtYmVyW10sIGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXg6IG51bWJlciwgbnVtRWxpZGVkQXhlczogbnVtYmVyLFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBuZXdTdHJpZGVzID0gWy4uLnN0cmlkZXNdO1xuICBmb3IgKGxldCBpID0gbmV3U3RyaWRlcy5sZW5ndGg7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgbmV3U3RyaWRlcy5wdXNoKDEpO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtRWxpZGVkQXhlczsgaSsrKSB7XG4gICAgaWYgKGkgPT09IDApIHtcbiAgICAgIG5ld1N0cmlkZXNbZWxsaXBzaXNJbnNlcnRpb25JbmRleF0gPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBuZXdTdHJpZGVzLnNwbGljZShcbiAgICAgICAgICBlbGxpcHNpc0luc2VydGlvbkluZGV4LCAwIC8qIG51bSBlbGVtZW50cyB0byBkZWxldGUgKi8sXG4gICAgICAgICAgMSAvKiBlbGVtZW50IHRvIGFkZCAqLyk7XG4gICAgICBuZXdTdHJpZGVzLnBvcCgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmV3U3RyaWRlcztcbn1cblxuZnVuY3Rpb24gdW5ub3JtYWxpemVBeGlzKFxuICAgIGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXg6IG51bWJlciwgbnVtRWxpZGVkQXhlczogbnVtYmVyLFxuICAgIG5vcm1hbGl6ZWRBeGlzOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAobm9ybWFsaXplZEF4aXMgPD0gZWxsaXBzaXNJbnNlcnRpb25JbmRleCkge1xuICAgIHJldHVybiBub3JtYWxpemVkQXhpcztcbiAgfVxuXG4gIHJldHVybiBub3JtYWxpemVkQXhpcyAtIChudW1FbGlkZWRBeGVzIC0gMSk7XG59XG5cbmZ1bmN0aW9uIGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlczogbnVtYmVyLCBlbGxpcHNpc0luc2VydGlvbkluZGV4OiBudW1iZXIpIHtcbiAgY29uc3QgZWxpZGVkQXhlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUVsaWRlZEF4ZXM7IGkrKykge1xuICAgIGVsaWRlZEF4ZXMucHVzaChlbGxpcHNpc0luc2VydGlvbkluZGV4ICsgaSk7XG4gIH1cbiAgcmV0dXJuIGVsaWRlZEF4ZXM7XG59XG5cbi8vIE5vcm1hbGl6ZSB0aGUgc3RhcnQsIGVuZCBhbmQgc3RyaWRlcy5cbmV4cG9ydCBmdW5jdGlvbiBnZXROb3JtYWxpemVkQXhlcyhcbiAgICBpbnB1dFNoYXBlOiBudW1iZXJbXSwgZWxsaXBzaXNBeGVzOiBudW1iZXJbXSwgbnVtSW50ZXJwb2xhdGVkQXhlczogbnVtYmVyLFxuICAgIGJlZ2luOiBudW1iZXJbXSwgZW5kOiBudW1iZXJbXSwgc3RyaWRlczogbnVtYmVyW10sIGJlZ2luTWFzazogbnVtYmVyLFxuICAgIGVuZE1hc2s6IG51bWJlcixcbiAgICBlbGxpcHNpc01hc2s6IG51bWJlcik6IHtiZWdpbjogbnVtYmVyW10sIGVuZDogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdfSB7XG4gIGNvbnN0IGlucHV0UmFuayA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICBsZXQgbm9ybWFsaXplZEJlZ2luID0gbmV3IEFycmF5KGlucHV0UmFuayksXG4gICAgICBub3JtYWxpemVkRW5kID0gbmV3IEFycmF5KGlucHV0UmFuayksXG4gICAgICBub3JtYWxpemVkU3RyaWRlcyA9IG5ldyBBcnJheShpbnB1dFJhbmspO1xuICBpZiAoZWxsaXBzaXNBeGVzLmxlbmd0aCAmJiBudW1JbnRlcnBvbGF0ZWRBeGVzID4gMCkge1xuICAgIGNvbnN0IGZ1bGxJbmRleCA9IGVsbGlwc2lzQXhlc1swXTtcblxuICAgIC8vIFRoZSBlbGxpcHNpcyBhcHBsaWVzIHRvIHRoZSBtYXNrZWQgaW5kZXggYXMgd2VsbCBhcyBhbnkgZGltZW5zaW9uc1xuICAgIC8vIHRoYXQgYXJlIGludGVycG9sYXRlZC5cbiAgICBjb25zdCBudW1FbGlkZWRBeGVzID0gbnVtSW50ZXJwb2xhdGVkQXhlcyArIDE7XG4gICAgbm9ybWFsaXplZEJlZ2luID0gc3RhcnRJbmRpY2VzV2l0aEVsaWRlZERpbXMoXG4gICAgICAgIGJlZ2luTWFzaywgZnVsbEluZGV4LCBudW1FbGlkZWRBeGVzLCBiZWdpbiwgaW5wdXRTaGFwZSk7XG4gICAgbm9ybWFsaXplZEVuZCA9IHN0b3BJbmRpY2VzV2l0aEVsaWRlZERpbXMoXG4gICAgICAgIGVuZE1hc2ssIGZ1bGxJbmRleCwgbnVtRWxpZGVkQXhlcywgZW5kLCBpbnB1dFNoYXBlKTtcbiAgICBub3JtYWxpemVkU3RyaWRlcyA9XG4gICAgICAgIHN0cmlkZXNXaXRoRWxpZGVkRGltcyhzdHJpZGVzLCBmdWxsSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGlucHV0U2hhcGUpO1xuICB9IGVsc2Uge1xuICAgIGZvciAobGV0IGF4aXMgPSAwOyBheGlzIDwgaW5wdXRSYW5rOyBheGlzKyspIHtcbiAgICAgIG5vcm1hbGl6ZWRCZWdpbltheGlzXSA9IHN0YXJ0Rm9yQXhpcyhcbiAgICAgICAgICBiZWdpbk1hc2ssIGJlZ2luLCBzdHJpZGVzLCBpbnB1dFNoYXBlLCBheGlzLCBlbGxpcHNpc01hc2spO1xuICAgICAgbm9ybWFsaXplZEVuZFtheGlzXSA9XG4gICAgICAgICAgc3RvcEZvckF4aXMoZW5kTWFzaywgZW5kLCBzdHJpZGVzLCBpbnB1dFNoYXBlLCBheGlzLCBlbGxpcHNpc01hc2spO1xuICAgICAgbm9ybWFsaXplZFN0cmlkZXNbYXhpc10gPSBzdHJpZGVzRm9yQXhpcyhzdHJpZGVzLCBheGlzLCBlbGxpcHNpc01hc2spO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYmVnaW46IG5vcm1hbGl6ZWRCZWdpbixcbiAgICBlbmQ6IG5vcm1hbGl6ZWRFbmQsXG4gICAgc3RyaWRlczogbm9ybWFsaXplZFN0cmlkZXNcbiAgfTtcbn1cblxuLy8gQ3JlYXRlcyBmdWxsIHNlbGVjdGlvbiBhdCB0aGUgZWxpZGVkIGRpbWVuc2lvbnMuIElmIHRoZSBkaW1lbnNpb24gbWF0Y2hlc1xuLy8gdGhlIGVsbGlwc2lzIG1hc2ssIG92ZXJyaWRlIHRoZSBjdXJyZW50IHN0YXJ0IHZhbHVlLiBPdGhlcndpc2UsIGluc2VydC5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEluZGljZXNXaXRoRWxpZGVkRGltcyhcbiAgICBiZWdpbk1hc2s6IG51bWJlciwgZWxsaXBzaXNJbnNlcnRpb25JbmRleDogbnVtYmVyLCBudW1FbGlkZWRBeGVzOiBudW1iZXIsXG4gICAgb3JpZ2luYWxCZWdpbjogbnVtYmVyW10sIGlucHV0U2hhcGU6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCBuZXdJbmRpY2VzID0gWy4uLmlucHV0U2hhcGVdO1xuICBjb25zdCBlbGlkZWRBeGVzID0gZ2V0RWxpZGVkQXhlcyhudW1FbGlkZWRBeGVzLCBlbGxpcHNpc0luc2VydGlvbkluZGV4KTtcblxuICBmb3IgKGxldCBheGlzID0gMDsgYXhpcyA8IG5ld0luZGljZXMubGVuZ3RoOyBheGlzKyspIHtcbiAgICBpZiAoZWxpZGVkQXhlcy5pbmRleE9mKGF4aXMpID4gLTEpIHtcbiAgICAgIG5ld0luZGljZXNbYXhpc10gPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBvcmlnaW5hbEF4aXMgPVxuICAgICAgICAgIHVubm9ybWFsaXplQXhpcyhlbGxpcHNpc0luc2VydGlvbkluZGV4LCBudW1FbGlkZWRBeGVzLCBheGlzKTtcbiAgICAgIGxldCBvcmlnaW5hbFZhbHVlID0gb3JpZ2luYWxCZWdpbltvcmlnaW5hbEF4aXNdO1xuICAgICAgaWYgKGJlZ2luTWFzayAmIDEgPDwgb3JpZ2luYWxBeGlzKSB7XG4gICAgICAgIG9yaWdpbmFsVmFsdWUgPSAwO1xuICAgICAgfVxuXG4gICAgICBuZXdJbmRpY2VzW2F4aXNdID0gb3JpZ2luYWxWYWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG5ld0luZGljZXM7XG59XG5cbi8vIENyZWF0ZXMgZnVsbCBzZWxlY3Rpb24gYXQgdGhlIGVsaWRlZCBkaW1lbnNpb25zLiBJZiB0aGUgZGltZW5zaW9uIG1hdGNoZXNcbi8vIHRoZSBlbGxpcHNpcyBtYXNrLCBvdmVycmlkZSB0aGUgY3VycmVudCBzdG9wIHZhbHVlLiBPdGhlcndpc2UsIGluc2VydC5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wSW5kaWNlc1dpdGhFbGlkZWREaW1zKFxuICAgIGVuZE1hc2s6IG51bWJlciwgZWxsaXBzaXNJbnNlcnRpb25JbmRleDogbnVtYmVyLCBudW1FbGlkZWRBeGVzOiBudW1iZXIsXG4gICAgb3JpZ2luYWxFbmQ6IG51bWJlcltdLCBpbnB1dFNoYXBlOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgbmV3SW5kaWNlcyA9IFsuLi5pbnB1dFNoYXBlXTtcbiAgY29uc3QgZWxpZGVkQXhlcyA9IGdldEVsaWRlZEF4ZXMobnVtRWxpZGVkQXhlcywgZWxsaXBzaXNJbnNlcnRpb25JbmRleCk7XG5cbiAgZm9yIChsZXQgYXhpcyA9IDA7IGF4aXMgPCBuZXdJbmRpY2VzLmxlbmd0aDsgYXhpcysrKSB7XG4gICAgaWYgKGVsaWRlZEF4ZXMuaW5kZXhPZihheGlzKSA+IC0xKSB7XG4gICAgICBuZXdJbmRpY2VzW2F4aXNdID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG9yaWdpbmFsQXhpcyA9XG4gICAgICAgICAgdW5ub3JtYWxpemVBeGlzKGVsbGlwc2lzSW5zZXJ0aW9uSW5kZXgsIG51bUVsaWRlZEF4ZXMsIGF4aXMpO1xuICAgICAgbGV0IG9yaWdpbmFsVmFsdWUgPSBvcmlnaW5hbEVuZFtvcmlnaW5hbEF4aXNdO1xuICAgICAgaWYgKGVuZE1hc2sgJiAxIDw8IG9yaWdpbmFsQXhpcykge1xuICAgICAgICBvcmlnaW5hbFZhbHVlID0gTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVI7XG4gICAgICB9XG4gICAgICBuZXdJbmRpY2VzW2F4aXNdID0gb3JpZ2luYWxWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0luZGljZXMubGVuZ3RoOyBpKyspIHtcbiAgICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgIGNvbnN0IGF4aXNTaXplID0gaW5wdXRTaGFwZVtpXTtcbiAgICBpZiAobmV3SW5kaWNlc1tpXSA8IDApIHtcbiAgICAgIG5ld0luZGljZXNbaV0gKz0gYXhpc1NpemU7XG4gICAgfVxuICAgIG5ld0luZGljZXNbaV0gPSB1dGlsLmNsYW1wKDAsIG5ld0luZGljZXNbaV0sIGlucHV0U2hhcGVbaV0pO1xuICB9XG4gIHJldHVybiBuZXdJbmRpY2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaWRlc0ZvckF4aXMoXG4gICAgc3RyaWRlczogbnVtYmVyW10sIGF4aXM6IG51bWJlciwgZWxsaXBzaXNNYXNrOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgc3RyaWRlID0gc3RyaWRlc1theGlzXTtcbiAgaWYgKGVsbGlwc2lzTWFzayAmICgxIDw8IGF4aXMpIHx8IHN0cmlkZSA9PSBudWxsKSB7XG4gICAgc3RyaWRlID0gMTtcbiAgfVxuXG4gIHJldHVybiBzdHJpZGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdGFydEZvckF4aXMoXG4gICAgYmVnaW5NYXNrOiBudW1iZXIsIHN0YXJ0SW5kaWNlczogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdLFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLCBheGlzOiBudW1iZXIsIGVsbGlwc2lzTWFzazogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gQmVnaW4gd2l0aCB0aGUgc3BlY2lmaWVkIGluZGV4XG4gIGxldCBzdGFydCA9IHN0YXJ0SW5kaWNlc1theGlzXTtcbiAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuXG4gIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciB0aGUgYmVnaW4gaW5kZXggaXMgbm90IHNldFxuICAvLyBmb3IgdGhlIGF4aXMuXG4gIGlmIChiZWdpbk1hc2sgJiAxIDw8IGF4aXMgfHwgZWxsaXBzaXNNYXNrICYgMSA8PCBheGlzIHx8IHN0YXJ0ID09IG51bGwpIHtcbiAgICBpZiAoc3RyaWRlID4gMCkge1xuICAgICAgLy8gRm9yd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGZpcnN0IGVsZW1lbnQuIFRoZXNlIHZhbHVlcyB3aWxsIGdldFxuICAgICAgLy8gY2xhbXBlZCBiZWxvdyAoTm90ZTogV2UgY291bGQgaGF2ZSBzZXQgdGhlbSB0byAwIGFuZCBheGlzX3NpemUtMSwgYnV0XG4gICAgICAvLyB1c2UgbG93ZXN0KCkgYW5kIG1heCgpIHRvIG1haW50YWluIHN5bW1ldHJ5IHdpdGggU3RvcEZvckF4aXMoKSlcbiAgICAgIHN0YXJ0ID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEJhY2t3YXJkIGl0ZXJhdGlvbiAtIHVzZSB0aGUgbGFzdCBlbGVtZW50LlxuICAgICAgc3RhcnQgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUjtcbiAgICB9XG4gIH1cblxuICAvLyBIYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICBjb25zdCBheGlzU2l6ZSA9IGlucHV0U2hhcGVbYXhpc107XG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBheGlzU2l6ZTtcbiAgfVxuXG4gIC8vIENsYW1waW5nXG4gIHN0YXJ0ID0gdXRpbC5jbGFtcCgwLCBzdGFydCwgYXhpc1NpemUgLSAxKTtcblxuICByZXR1cm4gc3RhcnQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzdG9wRm9yQXhpcyhcbiAgICBlbmRNYXNrOiBudW1iZXIsIHN0b3BJbmRpY2VzOiBudW1iZXJbXSwgc3RyaWRlczogbnVtYmVyW10sXG4gICAgaW5wdXRTaGFwZTogbnVtYmVyW10sIGF4aXM6IG51bWJlciwgZWxsaXBzaXNNYXNrOiBudW1iZXIpOiBudW1iZXIge1xuICAvLyBCZWdpbiB3aXRoIHRoZSBzcGVjaWZpZWQgaW5kZXhcbiAgbGV0IHN0b3AgPSBzdG9wSW5kaWNlc1theGlzXTtcbiAgY29uc3Qgc3RyaWRlID0gc3RyaWRlc1theGlzXSB8fCAxO1xuXG4gIC8vIENoZWNrIHRoZSBheGlzIGJpdCBmcm9tIHJpZ2h0IG9mIG1hc2tlZCBheGVzLCBvciBpZiB0aGUgc3RvcCBpbmRleCBpcyBub3RcbiAgLy8gc2V0IGZvciB0aGlzIGF4aXMuXG4gIGlmIChlbmRNYXNrICYgKDEgPDwgYXhpcykgfHwgZWxsaXBzaXNNYXNrICYgKDEgPDwgYXhpcykgfHwgc3RvcCA9PSBudWxsKSB7XG4gICAgaWYgKHN0cmlkZSA+IDApIHtcbiAgICAgIC8vIEZvcndhcmQgaXRlcmF0aW9uIC0gdXNlIHRoZSBsYXN0IGVsZW1lbnQuIFRoZXNlIHZhbHVlcyB3aWxsIGdldFxuICAgICAgLy8gY2xhbXBlZCBiZWxvd1xuICAgICAgc3RvcCA9IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBCYWNrd2FyZCBpdGVyYXRpb24gLSB1c2UgdGhlIGZpcnN0IGVsZW1lbnQuXG4gICAgICBzdG9wID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgfVxuICB9XG5cbiAgLy8gSGFuZGxlIG5lZ2F0aXZlIGluZGljZXNcbiAgY29uc3QgYXhpc1NpemUgPSBpbnB1dFNoYXBlW2F4aXNdO1xuICBpZiAoc3RvcCA8IDApIHtcbiAgICBzdG9wICs9IGF4aXNTaXplO1xuICB9XG5cbiAgLy8gQ2xhbXBpbmdcbiAgLy8gQmVjYXVzZSB0aGUgZW5kIGluZGV4IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBlbGVtZW50LCB3ZSBuZWVkIHNsaWdodGx5XG4gIC8vIGRpZmZlcmVudCBjbGFtcGluZyByYW5nZXMgZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24uXG4gIGlmIChzdHJpZGUgPiAwKSB7XG4gICAgLy8gRm9yd2FyZCBpdGVyYXRpb25cbiAgICBzdG9wID0gdXRpbC5jbGFtcCgwLCBzdG9wLCBheGlzU2l6ZSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gQmFja3dhcmQgaXRlcmF0aW9uXG4gICAgc3RvcCA9IHV0aWwuY2xhbXAoLTEsIHN0b3AsIGF4aXNTaXplIC0gMSk7XG4gIH1cblxuICByZXR1cm4gc3RvcDtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNsaWNlIG9jY3VwaWVzIGEgY29udGlub3VzIHNldCBvZiBlbGVtZW50cyBpbiB0aGVcbiAqICdmbGF0JyBzcGFjZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzU2xpY2VDb250aW5vdXMoXG4gICAgc2hhcGU6IG51bWJlcltdLCBiZWdpbjogbnVtYmVyW10sIHNpemU6IG51bWJlcltdKSB7XG4gIC8vIEluZGV4IG9mIHRoZSBmaXJzdCBheGlzIHRoYXQgaGFzIHNpemUgPiAxLlxuICBsZXQgZmlyc3ROb25PbmVBeGlzID0gc2l6ZS5sZW5ndGg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChzaXplW2ldID4gMSkge1xuICAgICAgZmlyc3ROb25PbmVBeGlzID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGZvciAobGV0IGkgPSBmaXJzdE5vbk9uZUF4aXMgKyAxOyBpIDwgc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChiZWdpbltpXSA+IDAgfHwgc2l6ZVtpXSAhPT0gc2hhcGVbaV0pIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlRmxhdE9mZnNldChiZWdpbjogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdKTogbnVtYmVyIHtcbiAgbGV0IGZsYXRPZmZzZXQgPSBiZWdpbi5sZW5ndGggPiAwID8gYmVnaW5bYmVnaW4ubGVuZ3RoIC0gMV0gOiAxO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJlZ2luLmxlbmd0aCAtIDE7IGkrKykge1xuICAgIGZsYXRPZmZzZXQgKz0gYmVnaW5baV0gKiBzdHJpZGVzW2ldO1xuICB9XG4gIHJldHVybiBmbGF0T2Zmc2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTbGljZVBhcmFtcyhcbiAgICB4OiBUZW5zb3JJbmZvLCBiZWdpbjogbnVtYmVyfG51bWJlcltdLCBzaXplPzogbnVtYmVyfG51bWJlcltdKSB7XG4gIC8vIFRoZSBmb2xsb3dpbmcgbG9naWMgYWxsb3dzIGZvciBtb3JlIGVyZ29ub21pYyBjYWxscy5cbiAgbGV0IGJlZ2luXzogbnVtYmVyW107XG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGlmICh0eXBlb2YgYmVnaW4gPT09ICdudW1iZXInKSB7XG4gICAgYmVnaW5fID0gW2JlZ2luLCAuLi5uZXcgQXJyYXkoeFJhbmsgLSAxKS5maWxsKDApXTtcbiAgfSBlbHNlIGlmIChiZWdpbi5sZW5ndGggPCB4UmFuaykge1xuICAgIGJlZ2luXyA9IGJlZ2luLmNvbmNhdChuZXcgQXJyYXkoeFJhbmsgLSBiZWdpbi5sZW5ndGgpLmZpbGwoMCkpO1xuICB9IGVsc2Uge1xuICAgIGJlZ2luXyA9IGJlZ2luLnNsaWNlKCk7XG4gIH1cbiAgYmVnaW5fLmZvckVhY2goZCA9PiB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGQgIT09IC0xLCAoKSA9PiAnc2xpY2UoKSBkb2VzIG5vdCBzdXBwb3J0IG5lZ2F0aXZlIGJlZ2luIGluZGV4aW5nLicpO1xuICB9KTtcbiAgbGV0IHNpemVfOiBudW1iZXJbXTtcbiAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgIHNpemVfID0gbmV3IEFycmF5KHhSYW5rKS5maWxsKC0xKTtcbiAgfSBlbHNlIGlmICh0eXBlb2Ygc2l6ZSA9PT0gJ251bWJlcicpIHtcbiAgICBzaXplXyA9IFtzaXplLCAuLi5uZXcgQXJyYXkoeFJhbmsgLSAxKS5maWxsKC0xKV07XG4gIH0gZWxzZSBpZiAoc2l6ZS5sZW5ndGggPCB4UmFuaykge1xuICAgIHNpemVfID0gc2l6ZS5jb25jYXQobmV3IEFycmF5KHhSYW5rIC0gc2l6ZS5sZW5ndGgpLmZpbGwoLTEpKTtcbiAgfSBlbHNlIHtcbiAgICBzaXplXyA9IHNpemU7XG4gIH1cbiAgc2l6ZV8gPSBzaXplXy5tYXAoKGQsIGkpID0+IHtcbiAgICBpZiAoZCA+PSAwKSB7XG4gICAgICByZXR1cm4gZDtcbiAgICB9IGVsc2Uge1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgZCA9PT0gLTEsXG4gICAgICAgICAgKCkgPT4gYE5lZ2F0aXZlIHNpemUgdmFsdWVzIHNob3VsZCBiZSBleGFjdGx5IC0xIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICAgIGAke2R9IGZvciB0aGUgc2xpY2UoKSBzaXplIGF0IGluZGV4ICR7aX0uYCk7XG4gICAgICByZXR1cm4geC5zaGFwZVtpXSAtIGJlZ2luX1tpXTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gW2JlZ2luXywgc2l6ZV9dO1xufVxuXG4vLyBDb252ZXJ0IHRoZSBzbGljaW5nIHNwZWNpZmljYXRpb24gZnJvbSBhIHNwYXJzZSByZXByZXNlbnRhdGlvbiB0byBhIGRlbnNlXG4vLyByZXByZXNlbnRhdGlvbi4gVGhpcyBtZWFucyB0aGF0IGFsbCBlbGxpcHNlcyBhbmQgbmV3YXhpcyBhcmUgZXhwYW5kZWQgb3V0LlxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW5mbyhcbiAgICB4U2hhcGU6IG51bWJlcltdLCBiZWdpbjogbnVtYmVyW10sIGVuZDogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdLFxuICAgIGJlZ2luTWFzazogbnVtYmVyLCBlbmRNYXNrOiBudW1iZXIsIGVsbGlwc2lzTWFzazogbnVtYmVyLFxuICAgIG5ld0F4aXNNYXNrOiBudW1iZXIsIHNocmlua0F4aXNNYXNrOiBudW1iZXIpOiBTbGljZUluZm8ge1xuICBsZXQgc3RyaWRlc05vbk51bGw7XG4gIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICBzdHJpZGVzTm9uTnVsbCA9IG5ldyBBcnJheShiZWdpbi5sZW5ndGgpO1xuICAgIHN0cmlkZXNOb25OdWxsLmZpbGwoMSk7XG4gIH0gZWxzZSB7XG4gICAgc3RyaWRlc05vbk51bGwgPSBzdHJpZGVzO1xuICB9XG5cbiAgLy8gT25seSBvbmUgbm9uLXplcm8gYml0IGlzIGFsbG93ZWQgaW4gZWxsaXBzaXNNYXNrLCB3aGljaCBtZWFucyBlbGxpcHNpc01hc2tcbiAgLy8gaXMgYSBwb3dlciBvZiAyLiBVc2UgYml0IGNvbXBhcmVzIHRvIGVuc3VyZSBlbGxpcHNpc01hc2sgaXMgMCBvciBhIHBvd2VyXG4gIC8vIG9mIDIuIFdoZW4gaSBpcyBhIHBvd2VyIG9mIDIsIGkgJiAoaSAtIDEpIGlzIGFsd2F5cyAwLlxuICAvLyBBbHNvIHJlZjpcbiAgLy8gaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNjAwMjkzL2hvdy10by1jaGVjay1pZi1hLW51bWJlci1pcy1hLXBvd2VyLW9mLTJcbiAgaWYgKGVsbGlwc2lzTWFzayAhPSBudWxsICYmIChlbGxpcHNpc01hc2sgJiAoZWxsaXBzaXNNYXNrIC0gMSkpICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNdWx0aXBsZSBlbGxpcHNlcyBpbiBzbGljZSBpcyBub3QgYWxsb3dlZC4nKTtcbiAgfVxuXG4gIC8vIFN0ZXAgMTogQWNjb3VudCBmb3IgZWxsaXBzaXMgYW5kIG5ldyBheGlzLlxuICAvLyBDaGVjayBmb3IgZWxsaXBzaXMgYW5kIGNvdW50IGhvdyBtYW55IG5vbi1uZXdheGlzIHRoZXJlIGFyZSBhZnRlci5cbiAgbGV0IGVsbGlwc2lzU2VlbiA9IGZhbHNlO1xuXG4gIGNvbnN0IHNwYXJzZVNwZWM6IFN0cmlkZWRTbGljZVNwYXJzZVNwZWMgPSB7XG4gICAgZGltczogc3RyaWRlc05vbk51bGwubGVuZ3RoLFxuICAgIG51bUFkZEF4aXNBZnRlckVsbGlwc2lzOiAwLFxuICAgIGJlZ2luOiBiZWdpbi5zbGljZSgpLFxuICAgIGVuZDogZW5kLnNsaWNlKCksXG4gICAgc3RyaWRlczogc3RyaWRlc05vbk51bGwuc2xpY2UoKSxcbiAgICBiZWdpbk1hc2ssXG4gICAgZW5kTWFzayxcbiAgICBlbGxpcHNpc01hc2ssXG4gICAgbmV3QXhpc01hc2ssXG4gICAgc2hyaW5rQXhpc01hc2tcbiAgfTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZVNwZWMuZGltczsgaSsrKSB7XG4gICAgaWYgKGVsbGlwc2lzU2VlbiAmJiAoKDEgPDwgaSkgJiBuZXdBeGlzTWFzaykgIT09IDApIHtcbiAgICAgIHNwYXJzZVNwZWMubnVtQWRkQXhpc0FmdGVyRWxsaXBzaXMrKztcbiAgICB9XG4gICAgaWYgKCgxIDw8IGkpICYgZWxsaXBzaXNNYXNrKSB7XG4gICAgICBlbGxpcHNpc1NlZW4gPSB0cnVlO1xuICAgIH1cbiAgfVxuICAvLyBJZiBubyBlbGxpcHNpcyBpbnNlcnQgb25lIGF0IHRoZSBlbmQuXG4gIGlmICghZWxsaXBzaXNTZWVuKSB7XG4gICAgc3BhcnNlU3BlYy5lbGxpcHNpc01hc2sgfD0gKDEgPDwgc3BhcnNlU3BlYy5kaW1zKTtcbiAgICBzcGFyc2VTcGVjLmRpbXMrKzsgIC8vIHRoaXMgZWZmZWN0cyBsb29wIGl0ZXJhdGlvbiBiZWxvd1xuICB9XG5cbiAgLy8gU3RlcCAyOiBNYWtlIGEgc3BhcnNlIHNwZWMgaW50byBhIGZ1bGwgaW5kZXggc3BlYy5cbiAgLy9cbiAgLy8gVGhlIHNwYXJzZSBzcGVjIGRlb3Mgbm90IGNvcnJlc3BvbmQgdG8gdGhlIG51bWJlciBvZiBkaW1lbnNpb25zLlxuICAvLyBNYWtlIGEgZGVuc2Ugc3BlYyB0aGF0IGNvb3Jlc3BvbmRzIHRvIHRoZSBudW1iZXIgb2YgZGltZW5zaW9ucy5cbiAgLy9cbiAgLy8gRm9yIGV4YW1wbGUgc3VwcG9zZSBmb29bLi4uLDM6XSBvbiBmb28uc2hhcGUgPSBbMiwgMiwgM10gdGhlbiB3ZSBuZWVkIHRvXG4gIC8vIHByb2R1Y2UgdGhlIG1pc3NpbmcgYmVnaW5NYXNrIGZvciB0aGUgZmlyc3QgdHdvIGRpbWVuc2lvbnMgaS5lLiBmcm9tXG4gIC8vIGJlZ2luTWFza1NwZWMgPSAwLCBlbmRNYXNrU3BlYyA9IDIsIHdlIGFjaGlldmUgYmVnaW5NYXNrID0gNiAoMTEwKSxcbiAgLy8gZW5kTWFzayA9IDcgKDExMSkuXG4gIGNvbnN0IGRlbnNlU3BlYzogU3RyaWRlZFNsaWNlRGVuc2VTcGVjID0ge1xuICAgIGRpbXM6IHhTaGFwZS5sZW5ndGgsXG4gICAgYmVnaW5NYXNrOiAwLFxuICAgIGVuZE1hc2s6IDAsXG4gICAgYmVnaW5WYWxpZDogZmFsc2UsXG4gICAgZW5kVmFsaWQ6IGZhbHNlXG4gIH07XG5cbiAgYnVpbGREZW5zZVNwZWMoc3BhcnNlU3BlYywgZGVuc2VTcGVjKTtcblxuICAvLyBTdGVwIDM6IE1ha2UgaW1wbGljaXQgcmFuZ2VzIChub24temVybyBiZWdpbk1hc2tzIGFuZCBlbmRNYXNrcykgZXhwbGljaXRcbiAgLy8gYW5kIGJvdW5kcyBjaGVjay5cbiAgbGV0IGlzSWRlbnRpdHkgPSB0cnVlO1xuICBsZXQgc2xpY2VEaW0wID0gdHJ1ZTtcbiAgbGV0IGlzU2ltcGxlU2xpY2UgPSB0cnVlO1xuICBjb25zdCBwcm9jZXNzaW5nU2hhcGUgPSBbXTtcbiAgY29uc3QgZmluYWxTaGFwZSA9IFtdO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGRlbnNlU3BlYy5zdHJpZGVzW2ldID09PSAwKSB7XG4gICAgICB0aHJvdyBFcnJvcihgc3RyaWRlc1ske2l9XSBtdXN0IGJlIG5vbi16ZXJvYCk7XG4gICAgfVxuICAgIGNvbnN0IHNocmlua0kgPSAhIShkZW5zZVNwZWMuc2hyaW5rQXhpc01hc2sgJiAoMSA8PCBpKSk7XG4gICAgY29uc3QgZGltSSA9IHhTaGFwZVtpXTtcbiAgICBpZiAoZGltSSA9PT0gLTEpIHtcbiAgICAgIHByb2Nlc3NpbmdTaGFwZS5wdXNoKHNocmlua0kgPyAxIDogLTEpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgY29uc3QgbWFza3MgPVxuICAgICAgICBbZGVuc2VTcGVjLmJlZ2luTWFzayAmICgxIDw8IGkpLCBkZW5zZVNwZWMuZW5kTWFzayAmICgxIDw8IGkpXTtcbiAgICBjb25zdCB2YWxpZFJhbmdlID0gW1xuICAgICAgZGVuc2VTcGVjLnN0cmlkZXNbaV0gPiAwID8gMCA6IC0xLFxuICAgICAgZGVuc2VTcGVjLnN0cmlkZXNbaV0gPiAwID8gZGltSSA6IGRpbUkgLSAxXG4gICAgXTtcblxuICAgIGlmIChzaHJpbmtJICYmIGRlbnNlU3BlYy5zdHJpZGVzW2ldIDw9IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdvbmx5IHN0cmlkZSAxIGFsbG93ZWQgb24gbm9uLXJhbmdlIGluZGV4aW5nLicpO1xuICAgIH1cblxuICAgIGlzU2ltcGxlU2xpY2UgPSBpc1NpbXBsZVNsaWNlICYmIChkZW5zZVNwZWMuc3RyaWRlc1tpXSA9PT0gMSk7XG5cbiAgICBjb25zdCBiZWdpbkFuZEVuZE1hc2tlZCA9XG4gICAgICAgICEhKChkZW5zZVNwZWMuYmVnaW5NYXNrICYgKDEgPDwgaSkpICYmIChkZW5zZVNwZWMuZW5kTWFzayAmICgxIDw8IGkpKSk7XG5cbiAgICBpZiAoZGVuc2VTcGVjLmJlZ2luVmFsaWQgJiYgZGVuc2VTcGVjLmVuZFZhbGlkKSB7XG4gICAgICBpZiAoc2hyaW5rSSkge1xuICAgICAgICAvLyBJZiB3ZSBhcmUgc2hyaW5raW5nLCB0aGUgZW5kIGluZGV4IGlzIG5vdyBwb3NzaWJseSBpbmNvcnJlY3QuIEluXG4gICAgICAgIC8vIHBhcnRpY3VsYXIgZm9vWy0xXSBwcm9kdWNlcyBzcGFyc2VCZWdpbiA9IC0xLCBzcGFyc2VFbmQgPSAwLlxuICAgICAgICAvLyBhbmQgY2Fub25pY2FsIHB1dHMgdGhlc2UgdG8gbi0xIGFuZCAwLCB3aGljaCBpbXBsaWVzIGEgZGVnZW5lcmF0ZVxuICAgICAgICAvLyBpbnRlcnZhbC4gRm9ydHVuYXRlbHksIGl0IGlzIG5vdyBzYWZlIHRvIHJlLWNyZWF0ZSBlbmQgYXMgYmVnaW4gKyAxLlxuICAgICAgICBjb25zdCB4RndkID0gZGVuc2VTcGVjLmJlZ2luW2ldIDwgMCA/IGRpbUkgKyBkZW5zZVNwZWMuYmVnaW5baV0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbnNlU3BlYy5iZWdpbltpXTtcbiAgICAgICAgZGVuc2VTcGVjLmJlZ2luW2ldID0geEZ3ZDtcbiAgICAgICAgZGVuc2VTcGVjLmVuZFtpXSA9IGRlbnNlU3BlYy5iZWdpbltpXSArIDE7XG4gICAgICAgIGlmICh4RndkIDwgMCB8fCB4RndkID49IGRpbUkpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihgc2xpY2UgaW5kZXggJHtkZW5zZVNwZWMuYmVnaW5baV19IG9mIGRpbWVuc2lvbiAke1xuICAgICAgICAgICAgICBpfSBvdXQgb2YgYm91bmRzLmApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZW5zZVNwZWMuYmVnaW5baV0gPSBjYW5vbmljYWwoXG4gICAgICAgICAgICBkZW5zZVNwZWMuYmVnaW5baV0sIDAsIGRlbnNlU3BlYy5zdHJpZGVzW2ldLCBkaW1JLCBtYXNrcyxcbiAgICAgICAgICAgIHZhbGlkUmFuZ2UpO1xuICAgICAgICBkZW5zZVNwZWMuZW5kW2ldID0gY2Fub25pY2FsKFxuICAgICAgICAgICAgZGVuc2VTcGVjLmVuZFtpXSwgMSwgZGVuc2VTcGVjLnN0cmlkZXNbaV0sIGRpbUksIG1hc2tzLCB2YWxpZFJhbmdlKTtcbiAgICAgIH1cbiAgICAgIC8vIFVwZGF0ZSBvcHRpbWl6YXRpb24gdmFsdWVzXG4gICAgICBjb25zdCB0YWtlQWxsSW5EaW1lbnNpb24gPSBkZW5zZVNwZWMuc3RyaWRlc1tpXSA9PT0gMSAmJlxuICAgICAgICAgIGRlbnNlU3BlYy5iZWdpbltpXSA9PT0gMCAmJiBkZW5zZVNwZWMuZW5kW2ldID09PSBkaW1JO1xuICAgICAgaXNJZGVudGl0eSA9IGlzSWRlbnRpdHkgJiYgdGFrZUFsbEluRGltZW5zaW9uO1xuICAgICAgc2xpY2VEaW0wID0gc2xpY2VEaW0wICYmXG4gICAgICAgICAgKChpID09PSAwICYmIGRlbnNlU3BlYy5zdHJpZGVzW2ldID09PSAxKSB8fCB0YWtlQWxsSW5EaW1lbnNpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpc0lkZW50aXR5ID1cbiAgICAgICAgICBpc0lkZW50aXR5ICYmICgoZGVuc2VTcGVjLnN0cmlkZXNbaV0gPT09IDEpICYmIGJlZ2luQW5kRW5kTWFza2VkKTtcbiAgICAgIHNsaWNlRGltMCA9IHNsaWNlRGltMCAmJlxuICAgICAgICAgICgoaSA9PT0gMCAmJiBkZW5zZVNwZWMuc3RyaWRlc1tpXSA9PT0gMSkgfHwgYmVnaW5BbmRFbmRNYXNrZWQpO1xuICAgIH1cbiAgICAvLyBDb21wdXRlIHRoZSBwcm9jZXNzaW5nIHNoYXBlICh0aGUgaW50ZXJtZWRpYXRlIEVpZ2VuIHdpbGwgcHJvZHVjZSlcbiAgICBsZXQgaW50ZXJ2YWxMZW5ndGg7XG4gICAgbGV0IGtub3duSW50ZXJ2YWwgPSBmYWxzZTtcbiAgICBpZiAoZGVuc2VTcGVjLmJlZ2luVmFsaWQgJiYgZGVuc2VTcGVjLmVuZFZhbGlkKSB7XG4gICAgICBpbnRlcnZhbExlbmd0aCA9IGRlbnNlU3BlYy5lbmRbaV0gLSBkZW5zZVNwZWMuYmVnaW5baV07XG4gICAgICBrbm93bkludGVydmFsID0gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKHNocmlua0kpIHtcbiAgICAgIC8vIFRoZSBkaW1lbnNpb24gaXMgc3RpbGwga25vd24gYXMgMSBmb3IgdGhlIHByb2Nlc3NpbmdTaGFwZSwgYnV0IHdpbGwgYmVcbiAgICAgIC8vIGRpc2NhcmRlZCBmb3IgdGhlIGZpbmFsIHNoYXBlLlxuICAgICAgaW50ZXJ2YWxMZW5ndGggPSAxO1xuICAgICAga25vd25JbnRlcnZhbCA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChiZWdpbkFuZEVuZE1hc2tlZCkge1xuICAgICAgLy8gRXZlbiBpZiB3ZSBkb24ndCBoYXZlIHZhbHVlcyBmb3IgYmVnaW4gb3IgZW5kLCB3ZSBkbyBrbm93IHRoYXQgdGhpc1xuICAgICAgLy8gZGltZW5zaW9uIGNvdmVycyB0aGUgd2hvbGUgaW50ZXJ2YWwuIElmIHdlIGhhdmUgc2hhcGUgaW5mb3JtYXRpb24gZm9yXG4gICAgICAvLyB0aGlzIGRpbWVuc2lvbiwgdGhhdCB0ZWxscyB1cyB0aGUgaW50ZXJ2YWwgbGVuZ3RoLlxuICAgICAgaWYgKGRpbUkgPj0gMCkge1xuICAgICAgICBpZiAoZGVuc2VTcGVjLnN0cmlkZXNbaV0gPCAwKSB7XG4gICAgICAgICAgaW50ZXJ2YWxMZW5ndGggPSAtZGltSTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbnRlcnZhbExlbmd0aCA9IGRpbUk7XG4gICAgICAgIH1cbiAgICAgICAga25vd25JbnRlcnZhbCA9IHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChrbm93bkludGVydmFsKSB7XG4gICAgICBsZXQgc2l6ZUk7XG4gICAgICAvLyBIb2xkIHplcm8gaWYgdGhlIGludGVydmFsIGlzIGRlZ2VuZXJhdGUsIG90aGVyd2lzZSBhY2NvdW50IGZvclxuICAgICAgLy8gcmVtYWluZGVyXG4gICAgICBpZiAoaW50ZXJ2YWxMZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAoKGludGVydmFsTGVuZ3RoIDwgMCkgIT09IChkZW5zZVNwZWMuc3RyaWRlc1tpXSA8IDApKSkge1xuICAgICAgICBzaXplSSA9IDA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzaXplSSA9IE1hdGgudHJ1bmMoaW50ZXJ2YWxMZW5ndGggLyBkZW5zZVNwZWMuc3RyaWRlc1tpXSkgK1xuICAgICAgICAgICAgKGludGVydmFsTGVuZ3RoICUgZGVuc2VTcGVjLnN0cmlkZXNbaV0gIT09IDAgPyAxIDogMCk7XG4gICAgICB9XG4gICAgICBwcm9jZXNzaW5nU2hhcGUucHVzaChzaXplSSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2Nlc3NpbmdTaGFwZS5wdXNoKC0xKTtcbiAgICB9XG4gIH1cblxuICAvLyBTdGVwIDQ6IENvbXB1dGUgdGhlIGZpbmFsIHNoYXBlXG4gIC8vXG4gIC8vIG5ld0F4aXMgd2lsbCBpbmNyZWFzZSBkaW1lbnNpb24gYnkgMSAod2l0aCBhIG9uZS1zaXplIGRpbWVuc2lvbilcbiAgLy8gc2xpY2VzIGxpa2UgZm9vWzMsIC4uLl0gd2lsbCByZWR1Y2UgZGltZW5zaW9uIGJ5IDEuXG4gIC8vIFRoaXMgY2Fubm90IGJlIGRvbmUgZWFybGllciwgYmVjYXVzZSBpdCBkZXBlbmRzIG9uIFN0ZXAgMy5cbiAgZm9yIChsZXQgZGVuc2VEaW0gPSAwOyBkZW5zZURpbSA8IGRlbnNlU3BlYy5maW5hbFNoYXBlR2F0aGVySW5kaWNlcy5sZW5ndGg7XG4gICAgICAgKytkZW5zZURpbSkge1xuICAgIGNvbnN0IGdhdGhlckluZGV4ID0gZGVuc2VTcGVjLmZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzW2RlbnNlRGltXTtcbiAgICBpZiAoZ2F0aGVySW5kZXggPj0gMCkge1xuICAgICAgZmluYWxTaGFwZS5wdXNoKHByb2Nlc3NpbmdTaGFwZVtnYXRoZXJJbmRleF0pO1xuICAgIH0gZWxzZSBpZiAoZ2F0aGVySW5kZXggPT09IE5FV19BWElTKSB7XG4gICAgICBmaW5hbFNoYXBlLnB1c2goMSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgZmluYWxTaGFwZVNwYXJzZSA9IGZpbmFsU2hhcGUuZmlsdGVyKFxuICAgICAgKGRpbSwgaSkgPT4gZGVuc2VTcGVjLmZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzW2ldICE9PSBORVdfQVhJUyk7XG5cbiAgcmV0dXJuIHtcbiAgICBmaW5hbFNoYXBlU3BhcnNlLFxuICAgIGZpbmFsU2hhcGUsXG4gICAgaXNJZGVudGl0eSxcbiAgICBzbGljZURpbTAsXG4gICAgaXNTaW1wbGVTbGljZSxcbiAgICBiZWdpbjogZGVuc2VTcGVjLmJlZ2luLFxuICAgIGVuZDogZGVuc2VTcGVjLmVuZCxcbiAgICBzdHJpZGVzOiBkZW5zZVNwZWMuc3RyaWRlc1xuICB9O1xufVxuXG5mdW5jdGlvbiBidWlsZERlbnNlU3BlYyhcbiAgICBzcGFyc2U6IFN0cmlkZWRTbGljZVNwYXJzZVNwZWMsIGRlbnNlOiBTdHJpZGVkU2xpY2VEZW5zZVNwZWMpIHtcbiAgZGVuc2UuYmVnaW5NYXNrID0gMDtcbiAgZGVuc2UuZW5kTWFzayA9IDA7XG4gIGRlbnNlLnNocmlua0F4aXNNYXNrID0gMDtcblxuICBsZXQgZnVsbEluZGV4ID0gMDtcbiAgZGVuc2UuYmVnaW5WYWxpZCA9IHNwYXJzZS5iZWdpbiAhPSBudWxsO1xuICBkZW5zZS5lbmRWYWxpZCA9IHNwYXJzZS5lbmQgIT0gbnVsbDtcblxuICBkZW5zZS5iZWdpbiA9IG5ldyBBcnJheShkZW5zZS5kaW1zKTtcbiAgZGVuc2UuZW5kID0gbmV3IEFycmF5KGRlbnNlLmRpbXMpO1xuICBkZW5zZS5zdHJpZGVzID0gbmV3IEFycmF5KGRlbnNlLmRpbXMpO1xuICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlcyA9IFtdO1xuICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZSA9IFtdO1xuICBkZW5zZS5pbnB1dFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZSA9IG5ldyBBcnJheShkZW5zZS5kaW1zKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXJzZS5kaW1zOyBpKyspIHtcbiAgICBpZiAoKDEgPDwgaSkgJiBzcGFyc2UuZWxsaXBzaXNNYXNrKSB7XG4gICAgICAvLyBPbmx5IHRoZSBiaXQgdGhhdCBoYXMgZWxsaXBzaXMgd2lsbCBmYWxsIGluIHRoaXMgY29uZGl0aW9uLlxuICAgICAgLy8gRXhwYW5kIHRoZSBlbGxpcHNpcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBpbmRpY2VzXG4gICAgICAvLyBOb3RlOiB0aGlzIG9ubHkgd29ya3MgYmVjYXVzZSB3ZSBndWFyYW50ZWVkIG9uZSBlbGxpcHNpcy5cbiAgICAgIGNvbnN0IG5leHRJbmRleCA9IE1hdGgubWluKFxuICAgICAgICAgIGRlbnNlLmRpbXMgLSAoc3BhcnNlLmRpbXMgLSBpKSArIDEgKyBzcGFyc2UubnVtQWRkQXhpc0FmdGVyRWxsaXBzaXMsXG4gICAgICAgICAgZGVuc2UuZGltcyk7XG4gICAgICBmb3IgKDsgZnVsbEluZGV4IDwgbmV4dEluZGV4OyBmdWxsSW5kZXgrKykge1xuICAgICAgICAvLyBuZXdBeGlzIGFyZW4ndCByZWFsIGF4aXMgc28geW91IGhhdmUgdG8gc2tpcC5cbiAgICAgICAgZGVuc2UuYmVnaW5bZnVsbEluZGV4XSA9IDA7XG4gICAgICAgIGRlbnNlLmVuZFtmdWxsSW5kZXhdID0gMDtcbiAgICAgICAgZGVuc2Uuc3RyaWRlc1tmdWxsSW5kZXhdID0gMTtcbiAgICAgICAgZGVuc2UuYmVnaW5NYXNrIHw9ICgxIDw8IGZ1bGxJbmRleCk7XG4gICAgICAgIGRlbnNlLmVuZE1hc2sgfD0gKDEgPDwgZnVsbEluZGV4KTtcbiAgICAgICAgZGVuc2UuZmluYWxTaGFwZUdhdGhlckluZGljZXMucHVzaChmdWxsSW5kZXgpO1xuICAgICAgICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZS5wdXNoKC0xKTtcbiAgICAgICAgZGVuc2UuaW5wdXRTaGFwZUdhdGhlckluZGljZXNTcGFyc2VbZnVsbEluZGV4XSA9IGk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICgoMSA8PCBpKSAmIHNwYXJzZS5uZXdBeGlzTWFzaykge1xuICAgICAgLy8gT25seSB0aGUgYml0IHRoYXQgaGFzIG5ld0F4aXMgd2lsbCBmYWxsIGluIHRoaXMgY29uZGl0aW9uLlxuICAgICAgZGVuc2UuZmluYWxTaGFwZUdhdGhlckluZGljZXMucHVzaChORVdfQVhJUyk7XG4gICAgICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZS5wdXNoKC0xKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZ1bGxJbmRleCA9PT0gZGVuc2UuYmVnaW4ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYEluZGV4IG91dCBvZiByYW5nZSB1c2luZyBpbnB1dCBkaW0gJHtmdWxsSW5kZXh9OyBpbnB1dCBgICtcbiAgICAgICAgICAgIGBoYXMgb25seSAke2RlbnNlLmRpbXN9IGRpbXMsICR7ZGVuc2UuYmVnaW4ubGVuZ3RofS5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gR2F0aGVyIHNsaWNpbmcgc3BlYyBpbnRvIGFwcHJvcHJpYXRlIGluZGV4LlxuICAgICAgaWYgKHNwYXJzZS5iZWdpbiAhPSBudWxsKSB7XG4gICAgICAgIGRlbnNlLmJlZ2luW2Z1bGxJbmRleF0gPSBzcGFyc2UuYmVnaW5baV07XG4gICAgICB9XG4gICAgICBpZiAoc3BhcnNlLmVuZCAhPSBudWxsKSB7XG4gICAgICAgIGRlbnNlLmVuZFtmdWxsSW5kZXhdID0gc3BhcnNlLmVuZFtpXTtcbiAgICAgIH1cbiAgICAgIGRlbnNlLnN0cmlkZXNbZnVsbEluZGV4XSA9IHNwYXJzZS5zdHJpZGVzW2ldO1xuICAgICAgaWYgKHNwYXJzZS5iZWdpbk1hc2sgJiAoMSA8PCBpKSkge1xuICAgICAgICBkZW5zZS5iZWdpbk1hc2sgfD0gKDEgPDwgZnVsbEluZGV4KTtcbiAgICAgIH1cbiAgICAgIGlmIChzcGFyc2UuZW5kTWFzayAmICgxIDw8IGkpKSB7XG4gICAgICAgIGRlbnNlLmVuZE1hc2sgfD0gKDEgPDwgZnVsbEluZGV4KTtcbiAgICAgIH1cbiAgICAgIC8vIElmIHNocmluaywgcmVjb3JkIHdoZXJlIHRvIGdldCB0aGUgZGltZW5zaW9uYWxpdHkgZnJvbSAoaS5lLiBuZXdBeGlzKVxuICAgICAgLy8gY3JlYXRlcyBhIGZha2UgMSBzaXplIGRpbWVuc2lvbi4gQWxzbyByZW1lbWJlciBzaHJpbmsgYXhpcyAobm93IGluXG4gICAgICAvLyBkZW5zZSBmb3JtKSBzbyB3ZSBjYW4gaWdub3JlIGRlbnNlLmVuZCBiZWxvdy5cbiAgICAgIGlmIChzcGFyc2Uuc2hyaW5rQXhpc01hc2sgJiAoMSA8PCBpKSkge1xuICAgICAgICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlcy5wdXNoKFNIUklOS19BWElTKTtcbiAgICAgICAgZGVuc2UuZmluYWxTaGFwZUdhdGhlckluZGljZXNTcGFyc2UucHVzaCgtMSk7XG4gICAgICAgIGRlbnNlLnNocmlua0F4aXNNYXNrIHw9ICgxIDw8IGZ1bGxJbmRleCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZW5zZS5maW5hbFNoYXBlR2F0aGVySW5kaWNlcy5wdXNoKGZ1bGxJbmRleCk7XG4gICAgICAgIC8vIFJlbWVtYmVyIHRoYXQgd2hlcmUgaW4gdGhlIHNwYXJzZSBzaGFwZSB0aGUgZGVuc2UgZGltIGNvbWVzIGZyb20uXG4gICAgICAgIGRlbnNlLmZpbmFsU2hhcGVHYXRoZXJJbmRpY2VzU3BhcnNlLnB1c2goaSk7XG4gICAgICB9XG4gICAgICBkZW5zZS5pbnB1dFNoYXBlR2F0aGVySW5kaWNlc1NwYXJzZVtmdWxsSW5kZXhdID0gaTtcbiAgICAgIGZ1bGxJbmRleCsrO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBjYW5vbmljYWwoXG4gICAgeDogbnVtYmVyLCBjOiBudW1iZXIsIHN0cmlkZUk6IG51bWJlciwgZGltSTogbnVtYmVyLCBtYXNrczogbnVtYmVyW10sXG4gICAgdmFsaWRSYW5nZTogbnVtYmVyW10pIHtcbiAgaWYgKG1hc2tzW2NdKSB7XG4gICAgcmV0dXJuIHN0cmlkZUkgPiAwID8gdmFsaWRSYW5nZVtjXSA6IHZhbGlkUmFuZ2VbKGMgKyAxKSAmIDFdO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHhGd2QgPSB4IDwgMCA/IGRpbUkgKyB4IDogeDsgIC8vIG1ha2UgbmVnYXRpdmUgaW5kaWNlcyBwb3NpdGl2ZVxuICAgIHJldHVybiB4RndkIDwgdmFsaWRSYW5nZVswXSA/IHZhbGlkUmFuZ2VbMF0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhGd2QgPiB2YWxpZFJhbmdlWzFdID8gdmFsaWRSYW5nZVsxXSA6IHhGd2Q7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assert } from './util';\n/**\n * Serializable defines the serialization contract.\n *\n * TFJS requires serializable classes to return their className when asked\n * to avoid issues with minification.\n */\nexport class Serializable {\n    /**\n     * Return the class name for this class to use in serialization contexts.\n     *\n     * Generally speaking this will be the same thing that constructor.name\n     * would have returned.  However, the class name needs to be robust\n     * against minification for serialization/deserialization to work properly.\n     *\n     * There's also places such as initializers.VarianceScaling, where\n     * implementation details between different languages led to different\n     * class hierarchies and a non-leaf node is used for serialization purposes.\n     */\n    getClassName() {\n        return this.constructor\n            .className;\n    }\n    /**\n     * Creates an instance of T from a ConfigDict.\n     *\n     * This works for most descendants of serializable.  A few need to\n     * provide special handling.\n     * @param cls A Constructor for the class to instantiate.\n     * @param config The Configuration for the object.\n     */\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config);\n    }\n}\n/**\n * Maps string keys to class constructors.\n *\n * Used during (de)serialization from the cross-language JSON format, which\n * requires the class name in the serialization format matches the class\n * names as used in Python, should it exist.\n */\nexport class SerializationMap {\n    constructor() {\n        this.classNameMap = {};\n    }\n    /**\n     * Returns the singleton instance of the map.\n     */\n    static getMap() {\n        if (SerializationMap.instance == null) {\n            SerializationMap.instance = new SerializationMap();\n        }\n        return SerializationMap.instance;\n    }\n    /**\n     * Registers the class as serializable.\n     */\n    static register(cls) {\n        SerializationMap.getMap().classNameMap[cls.className] =\n            [cls, cls.fromConfig];\n    }\n}\n/**\n * Register a class with the serialization map of TensorFlow.js.\n *\n * This is often used for registering custom Layers, so they can be\n * serialized and deserialized.\n *\n * Example:\n *\n * ```js\n * class MyCustomLayer extends tf.layers.Layer {\n *   static className = 'MyCustomLayer';\n *\n *   constructor(config) {\n *     super(config);\n *   }\n * }\n * tf.serialization.registerClass(MyCustomLayer);\n * ```\n *\n * @param cls The class to be registered. It must have a public static member\n *   called `className` defined and the value must be a non-empty string.\n *\n * @doc {heading: 'Models', subheading: 'Serialization', ignoreCI: true}\n */\nexport function registerClass(cls) {\n    assert(cls.className != null, () => `Class being registered does not have the static className ` +\n        `property defined.`);\n    assert(typeof cls.className === 'string', () => `className is required to be a string, but got type ` +\n        typeof cls.className);\n    assert(cls.className.length > 0, () => `Class being registered has an empty-string as its className, ` +\n        `which is disallowed.`);\n    SerializationMap.register(cls);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvc2VyaWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBdUM5Qjs7Ozs7R0FLRztBQUNILE1BQU0sT0FBZ0IsWUFBWTtJQUNoQzs7Ozs7Ozs7OztPQVVHO0lBQ0gsWUFBWTtRQUNWLE9BQVEsSUFBSSxDQUFDLFdBQXFEO2FBQzdELFNBQVMsQ0FBQztJQUNqQixDQUFDO0lBT0Q7Ozs7Ozs7T0FPRztJQUNILGtCQUFrQjtJQUNsQixNQUFNLENBQUMsVUFBVSxDQUNiLEdBQStCLEVBQUUsTUFBa0I7UUFDckQsT0FBTyxJQUFJLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6QixDQUFDO0NBQ0Y7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sZ0JBQWdCO0lBTzNCO1FBQ0UsSUFBSSxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE1BQU07UUFDWCxJQUFJLGdCQUFnQixDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDckMsZ0JBQWdCLENBQUMsUUFBUSxHQUFHLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztTQUNwRDtRQUNELE9BQU8sZ0JBQWdCLENBQUMsUUFBUSxDQUFDO0lBQ25DLENBQUM7SUFFRDs7T0FFRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQXlCLEdBQStCO1FBQ3JFLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDO1lBQ2pELENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUN6QixHQUErQjtJQUNqQyxNQUFNLENBQ0YsR0FBRyxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQ3JCLEdBQUcsRUFBRSxDQUFDLDREQUE0RDtRQUM5RCxtQkFBbUIsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sQ0FDRixPQUFPLEdBQUcsQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUNqQyxHQUFHLEVBQUUsQ0FBQyxxREFBcUQ7UUFDdkQsT0FBTyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDOUIsTUFBTSxDQUNGLEdBQUcsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDeEIsR0FBRyxFQUFFLENBQUMsK0RBQStEO1FBQ2pFLHNCQUFzQixDQUFDLENBQUM7SUFFaEMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ2pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuL3V0aWwnO1xuXG4vKipcbiAqIFR5cGVzIHRvIHN1cHBvcnQgSlNPTi1lc3F1ZSBkYXRhIHN0cnVjdHVyZXMgaW50ZXJuYWxseS5cbiAqXG4gKiBJbnRlcm5hbGx5IENvbmZpZ0RpY3QncyB1c2UgY2FtZWxDYXNlIGtleXMgYW5kIHZhbHVlcyB3aGVyZSB0aGVcbiAqIHZhbHVlcyBhcmUgY2xhc3MgbmFtZXMgdG8gYmUgaW5zdGFudGlhdGVkLiAgT24gdGhlIHB5dGhvbiBzaWRlLCB0aGVzZVxuICogd2lsbCBiZSBzbmFrZV9jYXNlLiAgSW50ZXJuYWxseSB3ZSBhbGxvdyBFbnVtcyBpbnRvIHRoZSB2YWx1ZXMgZm9yIGJldHRlclxuICogdHlwZSBzYWZldHksIGJ1dCB0aGVzZSBuZWVkIHRvIGJlIGNvbnZlcnRlZCB0byByYXcgcHJpbWl0aXZlcyAodXN1YWxseVxuICogc3RyaW5ncykgZm9yIHJvdW5kLXRyaXBwaW5nIHdpdGggcHl0aG9uLlxuICpcbiAqIHRvQ29uZmlnIHJldHVybnMgdGhlIFRTLWZyaWVuZGx5IHJlcHJlc2VudGF0aW9uLiBtb2RlbC50b0pTT04oKSByZXR1cm5zXG4gKiB0aGUgcHl0aG9uaWMgdmVyc2lvbiBhcyB0aGF0J3MgdGhlIHBvcnRhYmxlIGZvcm1hdC4gIElmIHlvdSBuZWVkIHRvXG4gKiBweXRob24taWZ5IGEgbm9uLW1vZGVsIGxldmVsIHRvQ29uZmlnIG91dHB1dCwgeW91J2xsIG5lZWQgdG8gdXNlIGFcbiAqIGNvbnZlcnRUc1RvUHl0aG9uaWMgZnJvbSBzZXJpYWxpemF0aW9uX3V0aWxzIGluIC1MYXllcnMuXG4gKlxuICovXG5leHBvcnQgZGVjbGFyZSB0eXBlIENvbmZpZ0RpY3RWYWx1ZSA9XG4gICAgYm9vbGVhbiB8IG51bWJlciB8IHN0cmluZyB8IG51bGwgfCBDb25maWdEaWN0QXJyYXkgfCBDb25maWdEaWN0O1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIENvbmZpZ0RpY3Qge1xuICBba2V5OiBzdHJpbmddOiBDb25maWdEaWN0VmFsdWU7XG59XG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQ29uZmlnRGljdEFycmF5IGV4dGVuZHMgQXJyYXk8Q29uZmlnRGljdFZhbHVlPiB7fVxuXG4vKipcbiAqIFR5cGUgdG8gcmVwcmVzZW50IHRoZSBjbGFzcy10eXBlIG9mIFNlcmlhbGl6YWJsZSBvYmplY3RzLlxuICpcbiAqIEllIHRoZSBjbGFzcyBwcm90b3R5cGUgd2l0aCBhY2Nlc3MgdG8gdGhlIGNvbnN0cnVjdG9yIGFuZCBhbnlcbiAqIHN0YXRpYyBtZW1iZXJzL21ldGhvZHMuIEluc3RhbmNlIG1ldGhvZHMgYXJlIG5vdCBsaXN0ZWQgaGVyZS5cbiAqXG4gKiBTb3VyY2UgZm9yIHRoaXMgaWRlYTogaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQzNjA3MjU1XG4gKi9cbmV4cG9ydCBkZWNsYXJlIHR5cGUgU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4gPSB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgbmV3ICguLi5hcmdzOiBhbnlbXSk6IFQ7IGNsYXNzTmFtZTogc3RyaW5nOyBmcm9tQ29uZmlnOiBGcm9tQ29uZmlnTWV0aG9kPFQ+O1xufTtcbmV4cG9ydCBkZWNsYXJlIHR5cGUgRnJvbUNvbmZpZ01ldGhvZDxUIGV4dGVuZHMgU2VyaWFsaXphYmxlPiA9XG4gICAgKGNsczogU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sIGNvbmZpZzogQ29uZmlnRGljdCkgPT4gVDtcblxuLyoqXG4gKiBTZXJpYWxpemFibGUgZGVmaW5lcyB0aGUgc2VyaWFsaXphdGlvbiBjb250cmFjdC5cbiAqXG4gKiBURkpTIHJlcXVpcmVzIHNlcmlhbGl6YWJsZSBjbGFzc2VzIHRvIHJldHVybiB0aGVpciBjbGFzc05hbWUgd2hlbiBhc2tlZFxuICogdG8gYXZvaWQgaXNzdWVzIHdpdGggbWluaWZpY2F0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgU2VyaWFsaXphYmxlIHtcbiAgLyoqXG4gICAqIFJldHVybiB0aGUgY2xhc3MgbmFtZSBmb3IgdGhpcyBjbGFzcyB0byB1c2UgaW4gc2VyaWFsaXphdGlvbiBjb250ZXh0cy5cbiAgICpcbiAgICogR2VuZXJhbGx5IHNwZWFraW5nIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSB0aGluZyB0aGF0IGNvbnN0cnVjdG9yLm5hbWVcbiAgICogd291bGQgaGF2ZSByZXR1cm5lZC4gIEhvd2V2ZXIsIHRoZSBjbGFzcyBuYW1lIG5lZWRzIHRvIGJlIHJvYnVzdFxuICAgKiBhZ2FpbnN0IG1pbmlmaWNhdGlvbiBmb3Igc2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gdG8gd29yayBwcm9wZXJseS5cbiAgICpcbiAgICogVGhlcmUncyBhbHNvIHBsYWNlcyBzdWNoIGFzIGluaXRpYWxpemVycy5WYXJpYW5jZVNjYWxpbmcsIHdoZXJlXG4gICAqIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYmV0d2VlbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzIGxlZCB0byBkaWZmZXJlbnRcbiAgICogY2xhc3MgaGllcmFyY2hpZXMgYW5kIGEgbm9uLWxlYWYgbm9kZSBpcyB1c2VkIGZvciBzZXJpYWxpemF0aW9uIHB1cnBvc2VzLlxuICAgKi9cbiAgZ2V0Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuICh0aGlzLmNvbnN0cnVjdG9yIGFzIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFNlcmlhbGl6YWJsZT4pXG4gICAgICAgIC5jbGFzc05hbWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJuIGFsbCB0aGUgbm9uLXdlaWdodCBzdGF0ZSBuZWVkZWQgdG8gc2VyaWFsaXplIHRoaXMgb2JqZWN0LlxuICAgKi9cbiAgYWJzdHJhY3QgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Q7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgVCBmcm9tIGEgQ29uZmlnRGljdC5cbiAgICpcbiAgICogVGhpcyB3b3JrcyBmb3IgbW9zdCBkZXNjZW5kYW50cyBvZiBzZXJpYWxpemFibGUuICBBIGZldyBuZWVkIHRvXG4gICAqIHByb3ZpZGUgc3BlY2lhbCBoYW5kbGluZy5cbiAgICogQHBhcmFtIGNscyBBIENvbnN0cnVjdG9yIGZvciB0aGUgY2xhc3MgdG8gaW5zdGFudGlhdGUuXG4gICAqIEBwYXJhbSBjb25maWcgVGhlIENvbmZpZ3VyYXRpb24gZm9yIHRoZSBvYmplY3QuXG4gICAqL1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICB9XG59XG5cbi8qKlxuICogTWFwcyBzdHJpbmcga2V5cyB0byBjbGFzcyBjb25zdHJ1Y3RvcnMuXG4gKlxuICogVXNlZCBkdXJpbmcgKGRlKXNlcmlhbGl6YXRpb24gZnJvbSB0aGUgY3Jvc3MtbGFuZ3VhZ2UgSlNPTiBmb3JtYXQsIHdoaWNoXG4gKiByZXF1aXJlcyB0aGUgY2xhc3MgbmFtZSBpbiB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQgbWF0Y2hlcyB0aGUgY2xhc3NcbiAqIG5hbWVzIGFzIHVzZWQgaW4gUHl0aG9uLCBzaG91bGQgaXQgZXhpc3QuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZXJpYWxpemF0aW9uTWFwIHtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IFNlcmlhbGl6YXRpb25NYXA7XG4gIGNsYXNzTmFtZU1hcDoge1xuICAgIFtjbGFzc05hbWU6IHN0cmluZ106XG4gICAgICAgIFtTZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxTZXJpYWxpemFibGU+LCBGcm9tQ29uZmlnTWV0aG9kPFNlcmlhbGl6YWJsZT5dXG4gIH07XG5cbiAgcHJpdmF0ZSBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmNsYXNzTmFtZU1hcCA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiB0aGUgbWFwLlxuICAgKi9cbiAgc3RhdGljIGdldE1hcCgpOiBTZXJpYWxpemF0aW9uTWFwIHtcbiAgICBpZiAoU2VyaWFsaXphdGlvbk1hcC5pbnN0YW5jZSA9PSBudWxsKSB7XG4gICAgICBTZXJpYWxpemF0aW9uTWFwLmluc3RhbmNlID0gbmV3IFNlcmlhbGl6YXRpb25NYXAoKTtcbiAgICB9XG4gICAgcmV0dXJuIFNlcmlhbGl6YXRpb25NYXAuaW5zdGFuY2U7XG4gIH1cblxuICAvKipcbiAgICogUmVnaXN0ZXJzIHRoZSBjbGFzcyBhcyBzZXJpYWxpemFibGUuXG4gICAqL1xuICBzdGF0aWMgcmVnaXN0ZXI8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oY2xzOiBTZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPikge1xuICAgIFNlcmlhbGl6YXRpb25NYXAuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwW2Nscy5jbGFzc05hbWVdID1cbiAgICAgICAgW2NscywgY2xzLmZyb21Db25maWddO1xuICB9XG59XG5cbi8qKlxuICogUmVnaXN0ZXIgYSBjbGFzcyB3aXRoIHRoZSBzZXJpYWxpemF0aW9uIG1hcCBvZiBUZW5zb3JGbG93LmpzLlxuICpcbiAqIFRoaXMgaXMgb2Z0ZW4gdXNlZCBmb3IgcmVnaXN0ZXJpbmcgY3VzdG9tIExheWVycywgc28gdGhleSBjYW4gYmVcbiAqIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZC5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjbGFzcyBNeUN1c3RvbUxheWVyIGV4dGVuZHMgdGYubGF5ZXJzLkxheWVyIHtcbiAqICAgc3RhdGljIGNsYXNzTmFtZSA9ICdNeUN1c3RvbUxheWVyJztcbiAqXG4gKiAgIGNvbnN0cnVjdG9yKGNvbmZpZykge1xuICogICAgIHN1cGVyKGNvbmZpZyk7XG4gKiAgIH1cbiAqIH1cbiAqIHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNeUN1c3RvbUxheWVyKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjbHMgVGhlIGNsYXNzIHRvIGJlIHJlZ2lzdGVyZWQuIEl0IG11c3QgaGF2ZSBhIHB1YmxpYyBzdGF0aWMgbWVtYmVyXG4gKiAgIGNhbGxlZCBgY2xhc3NOYW1lYCBkZWZpbmVkIGFuZCB0aGUgdmFsdWUgbXVzdCBiZSBhIG5vbi1lbXB0eSBzdHJpbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdTZXJpYWxpemF0aW9uJywgaWdub3JlQ0k6IHRydWV9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZWdpc3RlckNsYXNzPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KFxuICAgIGNsczogU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4pIHtcbiAgYXNzZXJ0KFxuICAgICAgY2xzLmNsYXNzTmFtZSAhPSBudWxsLFxuICAgICAgKCkgPT4gYENsYXNzIGJlaW5nIHJlZ2lzdGVyZWQgZG9lcyBub3QgaGF2ZSB0aGUgc3RhdGljIGNsYXNzTmFtZSBgICtcbiAgICAgICAgICBgcHJvcGVydHkgZGVmaW5lZC5gKTtcbiAgYXNzZXJ0KFxuICAgICAgdHlwZW9mIGNscy5jbGFzc05hbWUgPT09ICdzdHJpbmcnLFxuICAgICAgKCkgPT4gYGNsYXNzTmFtZSBpcyByZXF1aXJlZCB0byBiZSBhIHN0cmluZywgYnV0IGdvdCB0eXBlIGAgK1xuICAgICAgICAgIHR5cGVvZiBjbHMuY2xhc3NOYW1lKTtcbiAgYXNzZXJ0KFxuICAgICAgY2xzLmNsYXNzTmFtZS5sZW5ndGggPiAwLFxuICAgICAgKCkgPT4gYENsYXNzIGJlaW5nIHJlZ2lzdGVyZWQgaGFzIGFuIGVtcHR5LXN0cmluZyBhcyBpdHMgY2xhc3NOYW1lLCBgICtcbiAgICAgICAgICBgd2hpY2ggaXMgZGlzYWxsb3dlZC5gKTtcblxuICBTZXJpYWxpemF0aW9uTWFwLnJlZ2lzdGVyKGNscyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Add } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Adds two `tf.Tensor`s element-wise, A + B. Supports broadcasting.\n *\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3, 4]);\n * const b = tf.tensor1d([10, 20, 30, 40]);\n *\n * a.add(b).print();  // or tf.add(a, b)\n * ```\n *\n * ```js\n * // Broadcast add a with b.\n * const a = tf.scalar(5);\n * const b = tf.tensor1d([10, 20, 30, 40]);\n *\n * a.add(b).print();  // or tf.add(a, b)\n * ```\n * @param a The first `tf.Tensor` to add.\n * @param b The second `tf.Tensor` to add. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction add_(a, b) {\n    let $a = convertToTensor(a, 'a', 'add');\n    let $b = convertToTensor(b, 'b', 'add');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Add, inputs);\n}\nexport const add = op({ add_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYWRkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsSUFBSSxDQUFtQixDQUFvQixFQUFFLENBQW9CO0lBQ3hFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QWRkLCBBZGRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge21ha2VUeXBlc01hdGNofSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQWRkcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSArIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICpcbiAqIGEuYWRkKGIpLnByaW50KCk7ICAvLyBvciB0Zi5hZGQoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgYWRkIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnNjYWxhcig1KTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMTAsIDIwLCAzMCwgNDBdKTtcbiAqXG4gKiBhLmFkZChiKS5wcmludCgpOyAgLy8gb3IgdGYuYWRkKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBhZGQuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGB0Zi5UZW5zb3JgIHRvIGFkZC4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBhZGRfPFQgZXh0ZW5kcyBUZW5zb3I+KGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnYWRkJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdhZGQnKTtcbiAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuXG4gIGNvbnN0IGlucHV0czogQWRkSW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQWRkLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYWRkID0gb3Aoe2FkZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { FloorDiv } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting.\n * The result is rounded with floor function.\n *\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 9, 16]);\n * const b = tf.tensor1d([1, 2, 3, 4]);\n *\n * a.floorDiv(b).print();  // or tf.div(a, b)\n * ```\n *\n * ```js\n * // Broadcast div a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(2);\n *\n * a.floorDiv(b).print();  // or tf.floorDiv(a, b)\n * ```\n *\n * @param a The first tensor as the numerator.\n * @param b The second tensor as the denominator. Must have the same dtype as\n * `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction floorDiv_(a, b) {\n    let $a = convertToTensor(a, 'a', 'floorDiv');\n    let $b = convertToTensor(b, 'b', 'floorDiv');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(FloorDiv, inputs);\n}\nexport const floorDiv = op({ floorDiv_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3JEaXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9mbG9vckRpdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFHekQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsU0FBUyxTQUFTLENBQ2QsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1QyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3QyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRTlDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0Zsb29yRGl2LCBGbG9vckRpdklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBEaXZpZGVzIHR3byBgdGYuVGVuc29yYHMgZWxlbWVudC13aXNlLCBBIC8gQi4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICogVGhlIHJlc3VsdCBpcyByb3VuZGVkIHdpdGggZmxvb3IgZnVuY3Rpb24uXG4gKlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDksIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiBhLmZsb29yRGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICpcbiAqIGEuZmxvb3JEaXYoYikucHJpbnQoKTsgIC8vIG9yIHRmLmZsb29yRGl2KGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yIGFzIHRoZSBudW1lcmF0b3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvciBhcyB0aGUgZGVub21pbmF0b3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhc1xuICogYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBmbG9vckRpdl88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdmbG9vckRpdicpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZmxvb3JEaXYnKTtcbiAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuXG4gIGNvbnN0IGlucHV0czogRmxvb3JEaXZJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChGbG9vckRpdiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZsb29yRGl2ID0gb3Aoe2Zsb29yRGl2X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { RealDiv } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { floorDiv } from './floorDiv';\nimport { op } from './operation';\n/**\n * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 9, 16]);\n * const b = tf.tensor1d([1, 2, 3, 4]);\n *\n * a.div(b).print();  // or tf.div(a, b)\n * ```\n *\n * ```js\n * // Broadcast div a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(2);\n *\n * a.div(b).print();  // or tf.div(a, b)\n * ```\n *\n * @param a The first tensor as the numerator.\n * @param b The second tensor as the denominator. Must have the same dtype as\n * `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction div_(a, b) {\n    let $a = convertToTensor(a, 'a', 'div');\n    let $b = convertToTensor(b, 'b', 'div');\n    [$a, $b] = makeTypesMatch($a, $b);\n    if ($a.dtype === 'int32' && $b.dtype === 'int32') {\n        return floorDiv($a, $b);\n    }\n    const inputs = { a: $a, b: $b };\n    const attrs = {};\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    return ENGINE.runKernel(RealDiv, inputs, attrs);\n}\nexport const div = op({ div_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZGl2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE9BQU8sRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUd2RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxTQUFTLElBQUksQ0FBbUIsQ0FBb0IsRUFBRSxDQUFvQjtJQUN4RSxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN4QyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDaEQsT0FBTyxRQUFRLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0lBRWpCLDBEQUEwRDtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQThCLEVBQUUsS0FBSyxDQUFNLENBQUM7QUFDL0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVhbERpdiwgUmVhbERpdklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Zmxvb3JEaXZ9IGZyb20gJy4vZmxvb3JEaXYnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIERpdmlkZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgLyBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgNCwgOSwgMTZdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBCcm9hZGNhc3QgZGl2IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDIpO1xuICpcbiAqIGEuZGl2KGIpLnByaW50KCk7ICAvLyBvciB0Zi5kaXYoYSwgYilcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgYXMgdGhlIG51bWVyYXRvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yIGFzIHRoZSBkZW5vbWluYXRvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzXG4gKiBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIGRpdl88VCBleHRlbmRzIFRlbnNvcj4oYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdkaXYnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2RpdicpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgaWYgKCRhLmR0eXBlID09PSAnaW50MzInICYmICRiLmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIGZsb29yRGl2KCRhLCAkYik7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IFJlYWxEaXZJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcbiAgY29uc3QgYXR0cnMgPSB7fTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlYWxEaXYsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMpIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBkaXYgPSBvcCh7ZGl2X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Multiply } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Multiplies two `tf.Tensor`s element-wise, A * B. Supports broadcasting.\n *\n * We also expose `tf.mulStrict` which has the same signature as this op and\n * asserts that `a` and `b` are the same shape (does not broadcast).\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3, 4]);\n * const b = tf.tensor1d([2, 3, 4, 5]);\n *\n * a.mul(b).print();  // or tf.mul(a, b)\n * ```\n *\n * ```js\n * // Broadcast mul a with b.\n * const a = tf.tensor1d([1, 2, 3, 4]);\n * const b = tf.scalar(5);\n *\n * a.mul(b).print();  // or tf.mul(a, b)\n * ```\n * @param a The first tensor to multiply.\n * @param b The second tensor to multiply. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction mul_(a, b) {\n    let $a = convertToTensor(a, 'a', 'mul');\n    let $b = convertToTensor(b, 'b', 'mul');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Multiply, inputs);\n}\nexport const mul = op({ mul_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbXVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdCRztBQUNILFNBQVMsSUFBSSxDQUFtQixDQUFvQixFQUFFLENBQW9CO0lBQ3hFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsTUFBTSxNQUFNLEdBQW1CLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFOUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TXVsdGlwbHksIE11bHRpcGx5SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIEEgKiBCLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogV2UgYWxzbyBleHBvc2UgYHRmLm11bFN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDMsIDQsIDVdKTtcbiAqXG4gKiBhLm11bChiKS5wcmludCgpOyAgLy8gb3IgdGYubXVsKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IG11bCBhIHdpdGggYi5cbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLm11bChiKS5wcmludCgpOyAgLy8gb3IgdGYubXVsKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCB0ZW5zb3IgdG8gbXVsdGlwbHkuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIHRlbnNvciB0byBtdWx0aXBseS4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gbXVsXzxUIGV4dGVuZHMgVGVuc29yPihhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ211bCcpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnbXVsJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBjb25zdCBpbnB1dHM6IE11bHRpcGx5SW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTXVsdGlwbHksIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgbXVsID0gb3Aoe211bF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Abs, ComplexAbs } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes absolute value element-wise: `abs(x)`\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.abs().print();  // or tf.abs(x)\n * ```\n * @param x The input `tf.Tensor`.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction abs_(x) {\n    const $x = convertToTensor(x, 'x', 'abs');\n    if ($x.dtype === 'complex64') {\n        const inputs = { x: $x };\n        return ENGINE.runKernel(ComplexAbs, inputs);\n    }\n    else {\n        const inputs = { x: $x };\n        return ENGINE.runKernel(Abs, inputs);\n    }\n}\nexport const abs = op({ abs_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBYSxVQUFVLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFHN0UsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLElBQUksQ0FBbUIsQ0FBZTtJQUM3QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUxQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQzVCLE1BQU0sTUFBTSxHQUFxQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUN6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLE1BQThCLENBQUMsQ0FBQztLQUNyRTtTQUFNO1FBQ0wsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUE4QixDQUFDLENBQUM7S0FDOUQ7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBYnMsIEFic0lucHV0cywgQ29tcGxleEFicywgQ29tcGxleEFic0lucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBhYnNvbHV0ZSB2YWx1ZSBlbGVtZW50LXdpc2U6IGBhYnMoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA0XSk7XG4gKlxuICogeC5hYnMoKS5wcmludCgpOyAgLy8gb3IgdGYuYWJzKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWJzXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWJzJyk7XG5cbiAgaWYgKCR4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IGlucHV0czogQ29tcGxleEFic0lucHV0cyA9IHt4OiAkeH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQ29tcGxleEFicywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBpbnB1dHM6IEFic0lucHV0cyA9IHt4OiAkeH07XG4gICAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQWJzLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBhYnMgPSBvcCh7YWJzX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Acos } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes acos of the input `tf.Tensor` element-wise: `acos(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.acos().print();  // or tf.acos(x)\n * ```\n * @param x The input tensor.\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction acos_(x) {\n    const $x = convertToTensor(x, 'x', 'acos');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Acos, inputs);\n}\nexport const acos = op({ acos_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Fjb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsS0FBSyxDQUFtQixDQUFlO0lBQzlDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRW5DLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBY29zLCBBY29zSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGFjb3Mgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGFjb3MoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgLTEsIC43XSk7XG4gKlxuICogeC5hY29zKCkucHJpbnQoKTsgIC8vIG9yIHRmLmFjb3MoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBhY29zXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWNvcycpO1xuICBjb25zdCBpbnB1dHM6IEFjb3NJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEFjb3MsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgYWNvcyA9IG9wKHthY29zX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Acosh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the inverse hyperbolic cos of the input `tf.Tensor` element-wise:\n * `acosh(x)`\n *\n * ```js\n * const x = tf.tensor1d([10, 1, 3, 5.7]);\n *\n * x.acosh().print();  // or tf.acosh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction acosh_(x) {\n    const $x = convertToTensor(x, 'x', 'acosh');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Acosh, inputs);\n}\nexport const acosh = op({ acosh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hY29zaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QWNvc2gsIEFjb3NoSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbnZlcnNlIGh5cGVyYm9saWMgY29zIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgYWNvc2goeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMTAsIDEsIDMsIDUuN10pO1xuICpcbiAqIHguYWNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuYWNvc2goeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYWNvc2hfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhY29zaCcpO1xuICBjb25zdCBpbnB1dHM6IEFjb3NoSW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBY29zaCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBhY29zaCA9IG9wKHthY29zaF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AddN } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Adds a list of `tf.Tensor`s element-wise, each with the same shape and dtype.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor1d([3, 4]);\n * const c = tf.tensor1d([5, 6]);\n *\n * tf.addN([a, b, c]).print();\n * ```\n * @param tensors A list of tensors with the same shape and dtype.\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction addN_(tensors) {\n    util.assert(Array.isArray(tensors), () => 'The argument passed to tf.addN() must be a list of tensors');\n    util.assert(tensors.length >= 1, () => `Must pass at least one tensor to tf.addN(), but got ` +\n        `${tensors.length}`);\n    const $tensors = tensors.map((t, i) => convertToTensor(t, `tensors${i}`, 'addN'));\n    const firstTensor = $tensors[0];\n    $tensors.forEach(t => {\n        if (t.dtype !== firstTensor.dtype) {\n            throw new Error('All tensors passed to tf.addN() must have the same dtype');\n        }\n    });\n    $tensors.forEach(t => {\n        if (!util.arraysEqual(t.shape, firstTensor.shape)) {\n            throw new Error('All tensors passed to tf.addN() must have the same shape');\n        }\n    });\n    const inputs = $tensors;\n    return ENGINE.runKernel(AddN, inputs);\n}\nexport const addN = op({ addN_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkX24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hZGRfbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQWEsTUFBTSxpQkFBaUIsQ0FBQztBQUdqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLEtBQUssQ0FBbUIsT0FBNEI7SUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUN0QixHQUFHLEVBQUUsQ0FBQyw0REFBNEQsQ0FBQyxDQUFDO0lBQ3hFLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQ25CLEdBQUcsRUFBRSxDQUFDLHNEQUFzRDtRQUN4RCxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTdCLE1BQU0sUUFBUSxHQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUVyRSxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNuQixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxDQUFDLEtBQUssRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUNYLDBEQUEwRCxDQUFDLENBQUM7U0FDakU7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDbkIsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDakQsTUFBTSxJQUFJLEtBQUssQ0FDWCwwREFBMEQsQ0FBQyxDQUFDO1NBQ2pFO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLE1BQU0sR0FBZSxRQUFRLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0FkZE4sIEFkZE5JbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEFkZHMgYSBsaXN0IG9mIGB0Zi5UZW5zb3JgcyBlbGVtZW50LXdpc2UsIGVhY2ggd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBjb25zdCBjID0gdGYudGVuc29yMWQoWzUsIDZdKTtcbiAqXG4gKiB0Zi5hZGROKFthLCBiLCBjXSkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHRlbnNvcnMgQSBsaXN0IG9mIHRlbnNvcnMgd2l0aCB0aGUgc2FtZSBzaGFwZSBhbmQgZHR5cGUuXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gYWRkTl88VCBleHRlbmRzIFRlbnNvcj4odGVuc29yczogQXJyYXk8VHxUZW5zb3JMaWtlPik6IFQge1xuICB1dGlsLmFzc2VydChcbiAgICAgIEFycmF5LmlzQXJyYXkodGVuc29ycyksXG4gICAgICAoKSA9PiAnVGhlIGFyZ3VtZW50IHBhc3NlZCB0byB0Zi5hZGROKCkgbXVzdCBiZSBhIGxpc3Qgb2YgdGVuc29ycycpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHRlbnNvcnMubGVuZ3RoID49IDEsXG4gICAgICAoKSA9PiBgTXVzdCBwYXNzIGF0IGxlYXN0IG9uZSB0ZW5zb3IgdG8gdGYuYWRkTigpLCBidXQgZ290IGAgK1xuICAgICAgICAgIGAke3RlbnNvcnMubGVuZ3RofWApO1xuXG4gIGNvbnN0ICR0ZW5zb3JzID1cbiAgICAgIHRlbnNvcnMubWFwKCh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ2FkZE4nKSk7XG5cbiAgY29uc3QgZmlyc3RUZW5zb3IgPSAkdGVuc29yc1swXTtcbiAgJHRlbnNvcnMuZm9yRWFjaCh0ID0+IHtcbiAgICBpZiAodC5kdHlwZSAhPT0gZmlyc3RUZW5zb3IuZHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHRmLmFkZE4oKSBtdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUnKTtcbiAgICB9XG4gIH0pO1xuXG4gICR0ZW5zb3JzLmZvckVhY2godCA9PiB7XG4gICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKHQuc2hhcGUsIGZpcnN0VGVuc29yLnNoYXBlKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gdGYuYWRkTigpIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZScpO1xuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgaW5wdXRzOiBBZGROSW5wdXRzID0gJHRlbnNvcnM7XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQWRkTiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGFkZE4gPSBvcCh7YWRkTl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { All } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the logical and of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If `axes` has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 1, 1], 'bool');\n *\n * x.all().print();  // or tf.all(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool');\n *\n * const axis = 1;\n * x.all(axis).print();  // or tf.all(x, axis)\n * ```\n *\n * @param x The input tensor. Must be of dtype bool.\n * @param axis The dimension(s) to reduce. By default it reduces\n *     all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction all_(x, axis = null, keepDims = false) {\n    const $x = convertToTensor(x, 'x', 'all', 'bool');\n    const inputs = { x: $x };\n    const attrs = { axis, keepDims };\n    return ENGINE.runKernel(All, inputs, attrs);\n}\nexport const all = op({ all_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVsRCxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBYSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLEdBQUcsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBbGwsIEFsbEF0dHJzLCBBbGxJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9naWNhbCBhbmQgb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMV0sICdib29sJyk7XG4gKlxuICogeC5hbGwoKS5wcmludCgpOyAgLy8gb3IgdGYuYWxsKHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAxLCAwLCAwXSwgWzIsIDJdLCAnYm9vbCcpO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hbGwoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFsbCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGFsbF88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIGF4aXM6IG51bWJlcnxudW1iZXJbXSA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYWxsJywgJ2Jvb2wnKTtcblxuICBjb25zdCBpbnB1dHM6IEFsbElucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBBbGxBdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBBbGwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGFsbCA9IG9wKHthbGxffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Any } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the logical or of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If `axes` has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 1, 1], 'bool');\n *\n * x.any().print();  // or tf.any(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 1, 0, 0], [2, 2], 'bool');\n *\n * const axis = 1;\n * x.any(axis).print();  // or tf.any(x, axis)\n * ```\n *\n * @param x The input tensor. Must be of dtype bool.\n * @param axis The dimension(s) to reduce. By default it reduces\n *     all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction any_(x, axis = null, keepDims = false) {\n    const $x = convertToTensor(x, 'x', 'any', 'bool');\n    const inputs = { x: $x };\n    const attrs = { axis, keepDims };\n    return ENGINE.runKernel(Any, inputs, attrs);\n}\n// tslint:disable-next-line:variable-name\nexport const any = op({ any_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYW55LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVsRCxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBYSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLEdBQUcsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQseUNBQXlDO0FBQ3pDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QW55LCBBbnlBdHRycywgQW55SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvZ2ljYWwgb3Igb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIHRoZSBpbnB1dCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhlc2AuIFVubGVzcyBga2VlcERpbXNgXG4gKiBpcyB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluXG4gKiBgYXhlc2AuIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aFxuICogbGVuZ3RoIDEuIElmIGBheGVzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMSwgMV0sICdib29sJyk7XG4gKlxuICogeC5hbnkoKS5wcmludCgpOyAgLy8gb3IgdGYuYW55KHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAxLCAwLCAwXSwgWzIsIDJdLCAnYm9vbCcpO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hbnkoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFueSh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGFueV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIGF4aXM6IG51bWJlcnxudW1iZXJbXSA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYW55JywgJ2Jvb2wnKTtcblxuICBjb25zdCBpbnB1dHM6IEFueUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBBbnlBdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBBbnksIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBhbnkgPSBvcCh7YW55X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ArgMax } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the indices of the maximum values along an `axis`.\n *\n * The result has the same shape as `input` with the dimension along `axis`\n * removed.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.argMax().print();  // or tf.argMax(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]);\n *\n * const axis = 1;\n * x.argMax(axis).print();  // or tf.argMax(x, axis)\n * ```\n *\n * @param x The input tensor.\n * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension).\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction argMax_(x, axis = 0) {\n    const $x = convertToTensor(x, 'x', 'argMax');\n    const inputs = { x: $x };\n    const attrs = { axis };\n    return ENGINE.runKernel(ArgMax, inputs, attrs);\n}\nexport const argMax = op({ argMax_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2FyZ19tYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUE0QixNQUFNLGlCQUFpQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsT0FBTyxDQUFtQixDQUFvQixFQUFFLElBQUksR0FBRyxDQUFDO0lBQy9ELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFpQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBZ0IsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUVsQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE1BQU0sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBcmdNYXgsIEFyZ01heEF0dHJzLCBBcmdNYXhJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBtYXhpbXVtIHZhbHVlcyBhbG9uZyBhbiBgYXhpc2AuXG4gKlxuICogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGlucHV0YCB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgXG4gKiByZW1vdmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LmFyZ01heCgpLnByaW50KCk7ICAvLyBvciB0Zi5hcmdNYXgoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDQsIDNdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hcmdNYXgoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01heCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gdG8gcmVkdWNlLiBEZWZhdWx0cyB0byAwIChvdXRlci1tb3N0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYXJnTWF4XzxUIGV4dGVuZHMgVGVuc29yPih4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcyA9IDApOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXJnTWF4Jyk7XG5cbiAgY29uc3QgaW5wdXRzOiBBcmdNYXhJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogQXJnTWF4QXR0cnMgPSB7YXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBBcmdNYXgsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGFyZ01heCA9IG9wKHthcmdNYXhffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ArgMin } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the indices of the minimum values along an `axis`.\n *\n * The result has the same shape as `input` with the dimension along `axis`\n * removed.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.argMin().print();  // or tf.argMin(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 4, 3], [2, 2]);\n *\n * const axis = 1;\n * x.argMin(axis).print();  // or tf.argMin(x, axis)\n * ```\n *\n * @param x The input tensor.\n * @param axis The dimension to reduce. Defaults to 0 (outer-most dimension).\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction argMin_(x, axis = 0) {\n    const $x = convertToTensor(x, 'x', 'argMin');\n    const inputs = { x: $x };\n    const attrs = { axis };\n    return ENGINE.runKernel(ArgMin, inputs, attrs);\n}\nexport const argMin = op({ argMin_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2FyZ19taW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUE0QixNQUFNLGlCQUFpQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsT0FBTyxDQUFtQixDQUFvQixFQUFFLElBQUksR0FBRyxDQUFDO0lBQy9ELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFpQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBZ0IsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUVsQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE1BQU0sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBcmdNaW4sIEFyZ01pbkF0dHJzLCBBcmdNaW5JbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbmRpY2VzIG9mIHRoZSBtaW5pbXVtIHZhbHVlcyBhbG9uZyBhbiBgYXhpc2AuXG4gKlxuICogVGhlIHJlc3VsdCBoYXMgdGhlIHNhbWUgc2hhcGUgYXMgYGlucHV0YCB3aXRoIHRoZSBkaW1lbnNpb24gYWxvbmcgYGF4aXNgXG4gKiByZW1vdmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4LmFyZ01pbigpLnByaW50KCk7ICAvLyBvciB0Zi5hcmdNaW4oeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDQsIDNdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5hcmdNaW4oYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLmFyZ01pbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gdG8gcmVkdWNlLiBEZWZhdWx0cyB0byAwIChvdXRlci1tb3N0IGRpbWVuc2lvbikuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYXJnTWluXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcyA9IDApOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXJnTWluJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBBcmdNaW5JbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogQXJnTWluQXR0cnMgPSB7YXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBBcmdNaW4sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGFyZ01pbiA9IG9wKHthcmdNaW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Asin } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes asin of the input `tf.Tensor` element-wise: `asin(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.asin().print();  // or tf.asin(x)\n * ```\n * @param x The input tensor.\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction asin_(x) {\n    const $x = convertToTensor(x, 'x', 'asin');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Asin, inputs);\n}\nexport const asin = op({ asin_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2FzaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsS0FBSyxDQUFtQixDQUFlO0lBQzlDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRW5DLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0FzaW4sIEFzaW5JbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgYXNpbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgYXNpbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmFzaW4oKS5wcmludCgpOyAgLy8gb3IgdGYuYXNpbih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGFzaW5fPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhc2luJyk7XG4gIGNvbnN0IGlucHV0czogQXNpbklucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoQXNpbiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luID0gb3Aoe2FzaW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Asinh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes inverse hyperbolic sin of the input `tf.Tensor` element-wise:\n * `asinh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.asinh().print();  // or tf.asinh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction asinh_(x) {\n    const $x = convertToTensor(x, 'x', 'asinh');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Asinh, inputs);\n}\nexport const asinh = op({ asinh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hc2luaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QXNpbmgsIEFzaW5oSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGludmVyc2UgaHlwZXJib2xpYyBzaW4gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTpcbiAqIGBhc2luaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmFzaW5oKCkucHJpbnQoKTsgIC8vIG9yIHRmLmFzaW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGFzaW5oXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYXNpbmgnKTtcblxuICBjb25zdCBpbnB1dHM6IEFzaW5oSW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChBc2luaCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBhc2luaCA9IG9wKHthc2luaF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Atan } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes atan of the input `tf.Tensor` element-wise: `atan(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.atan().print();  // or tf.atan(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction atan_(x) {\n    const $x = convertToTensor(x, 'x', 'atan');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Atan, inputs);\n}\nexport const atan = op({ atan_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2F0YW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUUzQyxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUVuQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBdGFuLCBBdGFuSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGF0YW4gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGF0YW4oeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgLTEsIC43XSk7XG4gKlxuICogeC5hdGFuKCkucHJpbnQoKTsgIC8vIG9yIHRmLmF0YW4oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXRhbl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F0YW4nKTtcblxuICBjb25zdCBpbnB1dHM6IEF0YW5JbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgYXRhbiA9IG9wKHthdGFuX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Atan2 } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes arctangent of `tf.Tensor`s a / b element-wise: `atan2(a, b)`.\n * Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1.0, 1.0, -1.0, .7]);\n * const b = tf.tensor1d([2.0, 13.0, 3.5, .21]);\n *\n * tf.atan2(a, b).print()\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction atan2_(a, b) {\n    let $a = convertToTensor(a, 'a', 'atan2');\n    let $b = convertToTensor(b, 'b', 'atan2');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Atan2, inputs);\n}\nexport const atan2 = op({ atan2_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hdGFuMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxNQUFNLENBQ1gsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1QyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLE1BQU0sTUFBTSxHQUFnQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRTNDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0F0YW4yLCBBdGFuMklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBhcmN0YW5nZW50IG9mIGB0Zi5UZW5zb3JgcyBhIC8gYiBlbGVtZW50LXdpc2U6IGBhdGFuMihhLCBiKWAuXG4gKiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMS4wLCAxLjAsIC0xLjAsIC43XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIuMCwgMTMuMCwgMy41LCAuMjFdKTtcbiAqXG4gKiB0Zi5hdGFuMihhLCBiKS5wcmludCgpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGF0YW4yXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2F0YW4yJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdhdGFuMicpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgY29uc3QgaW5wdXRzOiBBdGFuMklucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW4yLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYXRhbjIgPSBvcCh7YXRhbjJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Atanh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes inverse hyperbolic tan of the input `tf.Tensor` element-wise:\n * `atanh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, .1, -.1, .7]);\n *\n * x.atanh().print();  // or tf.atanh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction atanh_(x) {\n    const $x = convertToTensor(x, 'x', 'atanh');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Atanh, inputs);\n}\nexport const atanh = op({ atanh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hdGFuaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7QXRhbmgsIEF0YW5oSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGludmVyc2UgaHlwZXJib2xpYyB0YW4gb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTpcbiAqIGBhdGFuaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAuMSwgLS4xLCAuN10pO1xuICpcbiAqIHguYXRhbmgoKS5wcmludCgpOyAgLy8gb3IgdGYuYXRhbmgoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gYXRhbmhfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdhdGFuaCcpO1xuXG4gIGNvbnN0IGlucHV0czogQXRhbmhJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEF0YW5oLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IGF0YW5oID0gb3Aoe2F0YW5oX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\n/**\n *\n * @param inputShape Input tensor shape is of the following dimensions:\n *     `[batch, height, width, inChannels]`.\n * @param filterShape The filter shape is of the following dimensions:\n *     `[filterHeight, filterWidth, depth]`.\n * @param strides The strides of the sliding window for each dimension of the\n *     input tensor: `[strideHeight, strideWidth]`.\n *     If `strides` is a single number,\n *     then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1*1x1.\n *    - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat The data format of the input and output data.\n *     Defaults to 'NHWC'.\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`.\n *     Defaults to `[1, 1]`. If `dilations` is a single number, then\n *     `dilationHeight == dilationWidth`.\n */\nexport function computeDilation2DInfo(inputShape, filterShape, strides, pad, dataFormat = 'NHWC', dilations) {\n    // `computerConv2DInfo` require filterShape to be in the dimension of:\n    // `[filterHeight, filterWidth, depth, outDepth]`, dilation2d doesn't have\n    // outDepth, it should have the same depth as the input.\n    // Input shape: [batch, height, width, inChannels]\n    const inputChannels = inputShape[3];\n    const $filterShape = [...filterShape, inputChannels];\n    const $dataFormat = convertConv2DDataFormat(dataFormat);\n    return computeConv2DInfo(inputShape, $filterShape, strides, dilations, pad, null /* roundingMode */, null /* depthWise */, $dataFormat);\n}\nexport function computePool2DInfo(inShape, filterSize, strides, dilations, pad, roundingMode, dataFormat = 'channelsLast') {\n    const [filterHeight, filterWidth] = parseTupleParam(filterSize);\n    let filterShape;\n    if (dataFormat === 'channelsLast') {\n        filterShape = [filterHeight, filterWidth, inShape[3], inShape[3]];\n    }\n    else if (dataFormat === 'channelsFirst') {\n        filterShape = [filterHeight, filterWidth, inShape[1], inShape[1]];\n    }\n    else {\n        throw new Error(`Unknown dataFormat ${dataFormat}`);\n    }\n    return computeConv2DInfo(inShape, filterShape, strides, dilations, pad, roundingMode, false, dataFormat);\n}\n/**\n * Computes the information for a forward pass of a pooling3D operation.\n */\nexport function computePool3DInfo(inShape, filterSize, strides, dilations, pad, roundingMode, dataFormat = 'NDHWC') {\n    const [filterDepth, filterHeight, filterWidth] = parse3TupleParam(filterSize);\n    let filterShape;\n    let $dataFormat;\n    if (dataFormat === 'NDHWC') {\n        $dataFormat = 'channelsLast';\n        filterShape =\n            [filterDepth, filterHeight, filterWidth, inShape[4], inShape[4]];\n    }\n    else if (dataFormat === 'NCDHW') {\n        $dataFormat = 'channelsFirst';\n        filterShape =\n            [filterDepth, filterHeight, filterWidth, inShape[1], inShape[1]];\n    }\n    else {\n        throw new Error(`Unknown dataFormat ${dataFormat}`);\n    }\n    return computeConv3DInfo(inShape, filterShape, strides, dilations, pad, false, $dataFormat, roundingMode);\n}\n/**\n * Computes the information for a forward pass of a convolution/pooling\n * operation.\n */\nexport function computeConv2DInfo(inShape, filterShape, strides, dilations, pad, roundingMode, depthwise = false, dataFormat = 'channelsLast') {\n    let [batchSize, inHeight, inWidth, inChannels] = [-1, -1, -1, -1];\n    if (dataFormat === 'channelsLast') {\n        [batchSize, inHeight, inWidth, inChannels] = inShape;\n    }\n    else if (dataFormat === 'channelsFirst') {\n        [batchSize, inChannels, inHeight, inWidth] = inShape;\n    }\n    else {\n        throw new Error(`Unknown dataFormat ${dataFormat}`);\n    }\n    const [filterHeight, filterWidth, , filterChannels] = filterShape;\n    const [strideHeight, strideWidth] = parseTupleParam(strides);\n    const [dilationHeight, dilationWidth] = parseTupleParam(dilations);\n    const effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n    const effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n    const { padInfo, outHeight, outWidth } = getPadAndOutInfo(pad, inHeight, inWidth, strideHeight, strideWidth, effectiveFilterHeight, effectiveFilterWidth, roundingMode, dataFormat);\n    const outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n    let outShape;\n    if (dataFormat === 'channelsFirst') {\n        outShape = [batchSize, outChannels, outHeight, outWidth];\n    }\n    else if (dataFormat === 'channelsLast') {\n        outShape = [batchSize, outHeight, outWidth, outChannels];\n    }\n    return {\n        batchSize,\n        dataFormat,\n        inHeight,\n        inWidth,\n        inChannels,\n        outHeight,\n        outWidth,\n        outChannels,\n        padInfo,\n        strideHeight,\n        strideWidth,\n        filterHeight,\n        filterWidth,\n        effectiveFilterHeight,\n        effectiveFilterWidth,\n        dilationHeight,\n        dilationWidth,\n        inShape,\n        outShape,\n        filterShape\n    };\n}\n/**\n * Computes the information for a forward pass of a 3D convolution/pooling\n * operation.\n */\nexport function computeConv3DInfo(inShape, filterShape, strides, dilations, pad, depthwise = false, dataFormat = 'channelsLast', roundingMode) {\n    let [batchSize, inDepth, inHeight, inWidth, inChannels] = [-1, -1, -1, -1, -1];\n    if (dataFormat === 'channelsLast') {\n        [batchSize, inDepth, inHeight, inWidth, inChannels] = inShape;\n    }\n    else if (dataFormat === 'channelsFirst') {\n        [batchSize, inChannels, inDepth, inHeight, inWidth] = inShape;\n    }\n    else {\n        throw new Error(`Unknown dataFormat ${dataFormat}`);\n    }\n    const [filterDepth, filterHeight, filterWidth, , filterChannels] = filterShape;\n    const [strideDepth, strideHeight, strideWidth] = parse3TupleParam(strides);\n    const [dilationDepth, dilationHeight, dilationWidth] = parse3TupleParam(dilations);\n    const effectiveFilterDepth = getEffectiveFilterSize(filterDepth, dilationDepth);\n    const effectiveFilterHeight = getEffectiveFilterSize(filterHeight, dilationHeight);\n    const effectiveFilterWidth = getEffectiveFilterSize(filterWidth, dilationWidth);\n    const { padInfo, outDepth, outHeight, outWidth } = get3DPadAndOutInfo(pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, effectiveFilterDepth, effectiveFilterHeight, effectiveFilterWidth, roundingMode);\n    const outChannels = depthwise ? filterChannels * inChannels : filterChannels;\n    let outShape;\n    if (dataFormat === 'channelsFirst') {\n        outShape = [batchSize, outChannels, outDepth, outHeight, outWidth];\n    }\n    else if (dataFormat === 'channelsLast') {\n        outShape = [batchSize, outDepth, outHeight, outWidth, outChannels];\n    }\n    return {\n        batchSize,\n        dataFormat,\n        inDepth,\n        inHeight,\n        inWidth,\n        inChannels,\n        outDepth,\n        outHeight,\n        outWidth,\n        outChannels,\n        padInfo,\n        strideDepth,\n        strideHeight,\n        strideWidth,\n        filterDepth,\n        filterHeight,\n        filterWidth,\n        effectiveFilterDepth,\n        effectiveFilterHeight,\n        effectiveFilterWidth,\n        dilationDepth,\n        dilationHeight,\n        dilationWidth,\n        inShape,\n        outShape,\n        filterShape\n    };\n}\nfunction computeOutputShape2D(inShape, fieldSize, stride, zeroPad, roundingMode) {\n    if (zeroPad == null) {\n        zeroPad = computeDefaultPad(inShape, fieldSize, stride);\n    }\n    const inputRows = inShape[0];\n    const inputCols = inShape[1];\n    const outputRows = round((inputRows - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n    const outputCols = round((inputCols - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n    return [outputRows, outputCols];\n}\nfunction computeOutputShape4D(inShape, fieldSize, outChannels, stride, zeroPad, roundingMode) {\n    if (zeroPad == null) {\n        zeroPad = computeDefaultPad(inShape, fieldSize, stride);\n    }\n    const inputDepth = inShape[0];\n    const inputRows = inShape[1];\n    const inputCols = inShape[2];\n    const outputDepths = round((inputDepth - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n    const outputRows = round((inputRows - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n    const outputCols = round((inputCols - fieldSize + 2 * zeroPad) / stride + 1, roundingMode);\n    return [outputDepths, outputRows, outputCols, outChannels];\n}\nexport function computeDefaultPad(inputShape, fieldSize, stride, dilation = 1) {\n    const effectiveFieldSize = getEffectiveFilterSize(fieldSize, dilation);\n    return Math.floor((inputShape[0] * (stride - 1) - stride + effectiveFieldSize) / 2);\n}\nfunction parseTupleParam(param) {\n    if (typeof param === 'number') {\n        return [param, param, param];\n    }\n    if (param.length === 2) {\n        return [param[0], param[1], 1];\n    }\n    return param;\n}\nfunction parse3TupleParam(param) {\n    return typeof param === 'number' ? [param, param, param] : param;\n}\n/* See https://www.tensorflow.org/api_docs/python/tf/nn/atrous_conv2d\n * Atrous convolution is equivalent to standard convolution with upsampled\n * filters with effective_filter_height =\n * filter_height + (filter_height - 1) * (dilation - 1)\n * and effective_filter_width =\n * filter_width + (filter_width - 1) * (dilation - 1),\n * produced by inserting dilation - 1 zeros along consecutive elements across\n * the filters' spatial dimensions.\n * When there is a dilation, this converts a filter dimension to the\n * effective filter dimension, so it can be used in a standard convolution.\n */\nfunction getEffectiveFilterSize(filterSize, dilation) {\n    if (dilation <= 1) {\n        return filterSize;\n    }\n    return filterSize + (filterSize - 1) * (dilation - 1);\n}\nfunction getPadAndOutInfo(pad, inHeight, inWidth, strideHeight, strideWidth, filterHeight, filterWidth, roundingMode, dataFormat) {\n    let padInfo;\n    let outHeight;\n    let outWidth;\n    if (typeof pad === 'number') {\n        const padType = (pad === 0) ? 'VALID' : 'NUMBER';\n        padInfo = { top: pad, bottom: pad, left: pad, right: pad, type: padType };\n        const outShape = computeOutputShape2D([inHeight, inWidth], filterHeight, strideHeight, pad, roundingMode);\n        outHeight = outShape[0];\n        outWidth = outShape[1];\n    }\n    else if (pad === 'same') {\n        outHeight = Math.ceil(inHeight / strideHeight);\n        outWidth = Math.ceil(inWidth / strideWidth);\n        const padAlongHeight = Math.max(0, (outHeight - 1) * strideHeight + filterHeight - inHeight);\n        const padAlongWidth = Math.max(0, (outWidth - 1) * strideWidth + filterWidth - inWidth);\n        const top = Math.floor(padAlongHeight / 2);\n        const bottom = padAlongHeight - top;\n        const left = Math.floor(padAlongWidth / 2);\n        const right = padAlongWidth - left;\n        padInfo = { top, bottom, left, right, type: 'SAME' };\n    }\n    else if (pad === 'valid') {\n        padInfo = { top: 0, bottom: 0, left: 0, right: 0, type: 'VALID' };\n        outHeight = Math.ceil((inHeight - filterHeight + 1) / strideHeight);\n        outWidth = Math.ceil((inWidth - filterWidth + 1) / strideWidth);\n    }\n    else if (typeof pad === 'object') {\n        const top = dataFormat === 'channelsLast' ? pad[1][0] : pad[2][0];\n        const bottom = dataFormat === 'channelsLast' ? pad[1][1] : pad[2][1];\n        const left = dataFormat === 'channelsLast' ? pad[2][0] : pad[3][0];\n        const right = dataFormat === 'channelsLast' ? pad[2][1] : pad[3][1];\n        const padType = (top === 0 && bottom === 0 && left === 0 && right === 0) ?\n            'VALID' :\n            'EXPLICIT';\n        padInfo = { top, bottom, left, right, type: padType };\n        outHeight = round((inHeight - filterHeight + top + bottom) / strideHeight + 1, roundingMode);\n        outWidth = round((inWidth - filterWidth + left + right) / strideWidth + 1, roundingMode);\n    }\n    else {\n        throw Error(`Unknown padding parameter: ${pad}`);\n    }\n    return { padInfo, outHeight, outWidth };\n}\nfunction get3DPadAndOutInfo(pad, inDepth, inHeight, inWidth, strideDepth, strideHeight, strideWidth, filterDepth, filterHeight, filterWidth, roundingMode) {\n    let padInfo;\n    let outDepth;\n    let outHeight;\n    let outWidth;\n    if (typeof pad === 'number') {\n        const padType = (pad === 0) ? 'VALID' : 'NUMBER';\n        padInfo = {\n            top: pad,\n            bottom: pad,\n            left: pad,\n            right: pad,\n            front: pad,\n            back: pad,\n            type: padType\n        };\n        const outShape = computeOutputShape4D([inDepth, inHeight, inWidth, 1], filterDepth, 1, strideDepth, pad, roundingMode);\n        outDepth = outShape[0];\n        outHeight = outShape[1];\n        outWidth = outShape[2];\n    }\n    else if (pad === 'same') {\n        outDepth = Math.ceil(inDepth / strideDepth);\n        outHeight = Math.ceil(inHeight / strideHeight);\n        outWidth = Math.ceil(inWidth / strideWidth);\n        const padAlongDepth = (outDepth - 1) * strideDepth + filterDepth - inDepth;\n        const padAlongHeight = (outHeight - 1) * strideHeight + filterHeight - inHeight;\n        const padAlongWidth = (outWidth - 1) * strideWidth + filterWidth - inWidth;\n        const front = Math.floor(padAlongDepth / 2);\n        const back = padAlongDepth - front;\n        const top = Math.floor(padAlongHeight / 2);\n        const bottom = padAlongHeight - top;\n        const left = Math.floor(padAlongWidth / 2);\n        const right = padAlongWidth - left;\n        padInfo = { top, bottom, left, right, front, back, type: 'SAME' };\n    }\n    else if (pad === 'valid') {\n        padInfo = {\n            top: 0,\n            bottom: 0,\n            left: 0,\n            right: 0,\n            front: 0,\n            back: 0,\n            type: 'VALID'\n        };\n        outDepth = Math.ceil((inDepth - filterDepth + 1) / strideDepth);\n        outHeight = Math.ceil((inHeight - filterHeight + 1) / strideHeight);\n        outWidth = Math.ceil((inWidth - filterWidth + 1) / strideWidth);\n    }\n    else {\n        throw Error(`Unknown padding parameter: ${pad}`);\n    }\n    return { padInfo, outDepth, outHeight, outWidth };\n}\n/**\n * Rounds a value depending on the rounding mode\n * @param value\n * @param roundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n */\nfunction round(value, roundingMode) {\n    if (!roundingMode) {\n        return Math.trunc(value);\n    }\n    switch (roundingMode) {\n        case 'round':\n            // used for Caffe Conv\n            return Math.round(value);\n        case 'ceil':\n            // used for Caffe Pool\n            return Math.ceil(value);\n        case 'floor':\n            return Math.floor(value);\n        default:\n            throw new Error(`Unknown roundingMode ${roundingMode}`);\n    }\n}\nexport function tupleValuesAreOne(param) {\n    const [dimA, dimB, dimC] = parseTupleParam(param);\n    return dimA === 1 && dimB === 1 && dimC === 1;\n}\nexport function eitherStridesOrDilationsAreOne(strides, dilations) {\n    return tupleValuesAreOne(strides) || tupleValuesAreOne(dilations);\n}\n/**\n * Convert Conv2D dataFormat from 'NHWC'|'NCHW' to\n *    'channelsLast'|'channelsFirst'\n * @param dataFormat in 'NHWC'|'NCHW' mode\n * @return dataFormat in 'channelsLast'|'channelsFirst' mode\n * @throws unknown dataFormat\n */\nexport function convertConv2DDataFormat(dataFormat) {\n    if (dataFormat === 'NHWC') {\n        return 'channelsLast';\n    }\n    else if (dataFormat === 'NCHW') {\n        return 'channelsFirst';\n    }\n    else {\n        throw new Error(`Unknown dataFormat ${dataFormat}`);\n    }\n}\n/**\n * Check validity of pad when using dimRoundingMode.\n * @param opDesc A string of op description\n * @param pad The type of padding algorithm.\n *   - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *   - `valid` output will be smaller than input if filter is larger\n *       than 1x1.\n *   - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n * @throws unknown padding parameter\n */\nexport function checkPadOnDimRoundingMode(opDesc, pad, dimRoundingMode) {\n    if (dimRoundingMode != null) {\n        if (typeof pad === 'string') {\n            throw Error(`Error in ${opDesc}: pad must be an integer when using ` +\n                `dimRoundingMode ${dimRoundingMode} but got pad ${pad}.`);\n        }\n        else if (typeof pad === 'number') {\n            util.assert(util.isInt(pad), () => `Error in ${opDesc}: pad must be an integer when using ` +\n                `dimRoundingMode ${dimRoundingMode} but got pad ${pad}.`);\n        }\n        else if (typeof pad === 'object') {\n            pad.forEach(p => {\n                p.forEach(v => {\n                    util.assert(util.isInt(v), () => `Error in ${opDesc}: pad must be an integer when using ` +\n                        `dimRoundingMode ${dimRoundingMode} but got pad ${v}.`);\n                });\n            });\n        }\n        else {\n            throw Error(`Error in ${opDesc}: Unknown padding parameter: ${pad}`);\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udl91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBMERoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxNQUFNLFVBQVUscUJBQXFCLENBQ2pDLFVBQTRDLEVBQzVDLFdBQXFDLEVBQUUsT0FBZ0MsRUFDdkUsR0FBMEIsRUFBRSxhQUFxQixNQUFNLEVBQ3ZELFNBQWtDO0lBQ3BDLHNFQUFzRTtJQUN0RSwwRUFBMEU7SUFDMUUsd0RBQXdEO0lBQ3hELGtEQUFrRDtJQUNsRCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxZQUFZLEdBQ2QsQ0FBQyxHQUFHLFdBQVcsRUFBRSxhQUFhLENBQXFDLENBQUM7SUFDeEUsTUFBTSxXQUFXLEdBQUcsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFeEQsT0FBTyxpQkFBaUIsQ0FDcEIsVUFBVSxFQUFFLFlBQVksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFDakQsSUFBSSxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FDN0IsT0FBeUMsRUFDekMsVUFBbUMsRUFBRSxPQUFnQyxFQUNyRSxTQUFrQyxFQUNsQyxHQUEwQyxFQUMxQyxZQUFxQyxFQUNyQyxhQUE2QyxjQUFjO0lBQzdELE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBRWhFLElBQUksV0FBNkMsQ0FBQztJQUNsRCxJQUFJLFVBQVUsS0FBSyxjQUFjLEVB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LEdBQUcsRUFBRSxDQUFDLFlBQVksTUFBTSxzQ0FBc0M7d0JBQzFELG1CQUFtQixlQUFlLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoRSxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLE1BQU0sS0FBSyxDQUFDLFlBQVksTUFBTSxnQ0FBZ0MsR0FBRyxFQUFFLENBQUMsQ0FBQztTQUN0RTtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxudHlwZSBQYWRUeXBlID0gJ1NBTUUnfCdWQUxJRCd8J05VTUJFUid8J0VYUExJQ0lUJztcblxuLy8gRm9yIE5IV0Mgc2hvdWxkIGJlIGluIHRoZSBmb2xsb3dpbmcgZm9ybTpcbi8vICBbWzAsIDBdLCBbcGFkX3RvcCxwYWRfYm90dG9tXSwgW3BhZF9sZWZ0LCBwYWRfcmlnaHRdLCBbMCwgMF1dXG4vLyBGb3IgTkNIVyBzaG91bGQgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtOlxuLy8gIFtbMCwgMF0sIFswLCAwXSwgW3BhZF90b3AscGFkX2JvdHRvbV0sIFtwYWRfbGVmdCwgcGFkX3JpZ2h0XV1cbi8vIFJlZmVyZW5jZTogaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnYyZFxuZXhwb3J0IHR5cGUgRXhwbGljaXRQYWRkaW5nID1cbiAgICBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07XG5cbmV4cG9ydCB0eXBlIFBhZEluZm8gPSB7XG4gIHRvcDogbnVtYmVyLFxuICBsZWZ0OiBudW1iZXIsXG4gIHJpZ2h0OiBudW1iZXIsXG4gIGJvdHRvbTogbnVtYmVyLFxuICB0eXBlOiBQYWRUeXBlXG59O1xuXG5leHBvcnQgdHlwZSBQYWRJbmZvM0QgPSB7XG4gIHRvcDogbnVtYmVyLFxuICBsZWZ0OiBudW1iZXIsXG4gIHJpZ2h0OiBudW1iZXIsXG4gIGJvdHRvbTogbnVtYmVyLFxuICBmcm9udDogbnVtYmVyLFxuICBiYWNrOiBudW1iZXIsXG4gIHR5cGU6IFBhZFR5cGVcbn07XG5cbi8qKlxuICogSW5mb3JtYXRpb24gYWJvdXQgdGhlIGZvcndhcmQgcGFzcyBvZiBhIGNvbnZvbHV0aW9uL3Bvb2xpbmcgb3BlcmF0aW9uLlxuICogSXQgaW5jbHVkZXMgaW5wdXQgYW5kIG91dHB1dCBzaGFwZSwgc3RyaWRlcywgZmlsdGVyIHNpemUgYW5kIHBhZGRpbmdcbiAqIGluZm9ybWF0aW9uLlxuICovXG5leHBvcnQgdHlwZSBDb252MkRJbmZvID0ge1xuICBiYXRjaFNpemU6IG51bWJlcixcbiAgaW5IZWlnaHQ6IG51bWJlcixcbiAgaW5XaWR0aDogbnVtYmVyLFxuICBpbkNoYW5uZWxzOiBudW1iZXIsXG4gIG91dEhlaWdodDogbnVtYmVyLFxuICBvdXRXaWR0aDogbnVtYmVyLFxuICBvdXRDaGFubmVsczogbnVtYmVyLFxuICBkYXRhRm9ybWF0OiAnY2hhbm5lbHNGaXJzdCd8J2NoYW5uZWxzTGFzdCcsXG4gIHN0cmlkZUhlaWdodDogbnVtYmVyLFxuICBzdHJpZGVXaWR0aDogbnVtYmVyLFxuICBkaWxhdGlvbkhlaWdodDogbnVtYmVyLFxuICBkaWxhdGlvbldpZHRoOiBudW1iZXIsXG4gIGZpbHRlckhlaWdodDogbnVtYmVyLFxuICBmaWx0ZXJXaWR0aDogbnVtYmVyLFxuICBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ6IG51bWJlcixcbiAgZWZmZWN0aXZlRmlsdGVyV2lkdGg6IG51bWJlcixcbiAgcGFkSW5mbzogUGFkSW5mbyxcbiAgaW5TaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gIG91dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdXG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0gaW5wdXRTaGFwZSBJbnB1dCB0ZW5zb3Igc2hhcGUgaXMgb2YgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25zOlxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaGFwZSBUaGUgZmlsdGVyIHNoYXBlIGlzIG9mIHRoZSBmb2xsb3dpbmcgZGltZW5zaW9uczpcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGRlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgc2xpZGluZyB3aW5kb3cgZm9yIGVhY2ggZGltZW5zaW9uIG9mIHRoZVxuICogICAgIGlucHV0IHRlbnNvcjogYFtzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXWAuXG4gKiAgICAgSWYgYHN0cmlkZXNgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMSoxeDEuXG4gKiAgICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgVGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuXG4gKiAgICAgRGVmYXVsdHMgdG8gJ05IV0MnLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYC5cbiAqICAgICBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYGRpbGF0aW9uc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuXG4gKiAgICAgYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZURpbGF0aW9uMkRJbmZvKFxuICAgIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXM6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdLFxuICAgIHBhZDogJ3NhbWUnfCd2YWxpZCd8bnVtYmVyLCBkYXRhRm9ybWF0OiAnTkhXQycgPSAnTkhXQycsXG4gICAgZGlsYXRpb25zOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXSkge1xuICAvLyBgY29tcHV0ZXJDb252MkRJbmZvYCByZXF1aXJlIGZpbHRlclNoYXBlIHRvIGJlIGluIHRoZSBkaW1lbnNpb24gb2Y6XG4gIC8vIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgZGVwdGgsIG91dERlcHRoXWAsIGRpbGF0aW9uMmQgZG9lc24ndCBoYXZlXG4gIC8vIG91dERlcHRoLCBpdCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBkZXB0aCBhcyB0aGUgaW5wdXQuXG4gIC8vIElucHV0IHNoYXBlOiBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdXG4gIGNvbnN0IGlucHV0Q2hhbm5lbHMgPSBpbnB1dFNoYXBlWzNdO1xuICBjb25zdCAkZmlsdGVyU2hhcGUgPVxuICAgICAgWy4uLmZpbHRlclNoYXBlLCBpbnB1dENoYW5uZWxzXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBjb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcblxuICByZXR1cm4gY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICBpbnB1dFNoYXBlLCAkZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLFxuICAgICAgbnVsbCAvKiByb3VuZGluZ01vZGUgKi8sIG51bGwgLyogZGVwdGhXaXNlICovLCAkZGF0YUZvcm1hdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUG9vbDJESW5mbyhcbiAgICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciwgc3RyaWRlczogbnVtYmVyfFtudW1iZXIsIG51bWJlcl0sXG4gICAgZGlsYXRpb25zOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXSxcbiAgICBwYWQ6ICdzYW1lJ3wndmFsaWQnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsXG4gICAgcm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyxcbiAgICBkYXRhRm9ybWF0OiAnY2hhbm5lbHNGaXJzdCd8J2NoYW5uZWxzTGFzdCcgPSAnY2hhbm5lbHNMYXN0Jyk6IENvbnYyREluZm8ge1xuICBjb25zdCBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF0gPSBwYXJzZVR1cGxlUGFyYW0oZmlsdGVyU2l6ZSk7XG5cbiAgbGV0IGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgZmlsdGVyU2hhcGUgPSBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVszXSwgaW5TaGFwZVszXV07XG4gIH0gZWxzZSBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgZmlsdGVyU2hhcGUgPSBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVsxXSwgaW5TaGFwZVsxXV07XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgaW5TaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCByb3VuZGluZ01vZGUsIGZhbHNlLFxuICAgICAgZGF0YUZvcm1hdCk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGZvcndhcmQgcGFzcyBvZiBhIHBvb2xpbmczRCBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlUG9vbDNESW5mbyhcbiAgICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGZpbHRlclNpemU6IG51bWJlcnxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlczogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBkaWxhdGlvbnM6IG51bWJlcnxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHBhZDogJ3NhbWUnfCd2YWxpZCd8bnVtYmVyLFxuICAgIHJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcsXG4gICAgZGF0YUZvcm1hdDogJ05ESFdDJ3wnTkNESFcnID0gJ05ESFdDJyk6IENvbnYzREluZm8ge1xuICBjb25zdCBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdID0gcGFyc2UzVHVwbGVQYXJhbShmaWx0ZXJTaXplKTtcblxuICBsZXQgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIGxldCAkZGF0YUZvcm1hdDogJ2NoYW5uZWxzRmlyc3QnfCdjaGFubmVsc0xhc3QnO1xuICBpZiAoZGF0YUZvcm1hdCA9PT0gJ05ESFdDJykge1xuICAgICRkYXRhRm9ybWF0ID0gJ2NoYW5uZWxzTGFzdCc7XG4gICAgZmlsdGVyU2hhcGUgPVxuICAgICAgICBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluU2hhcGVbNF0sIGluU2hhcGVbNF1dO1xuICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0RIVycpIHtcbiAgICAkZGF0YUZvcm1hdCA9ICdjaGFubmVsc0ZpcnN0JztcbiAgICBmaWx0ZXJTaGFwZSA9XG4gICAgICAgIFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5TaGFwZVsxXSwgaW5TaGFwZVsxXV07XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICB9XG5cbiAgcmV0dXJuIGNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgaW5TaGFwZSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBmYWxzZSwgJGRhdGFGb3JtYXQsXG4gICAgICByb3VuZGluZ01vZGUpO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBpbmZvcm1hdGlvbiBmb3IgYSBmb3J3YXJkIHBhc3Mgb2YgYSBjb252b2x1dGlvbi9wb29saW5nXG4gKiBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlQ29udjJESW5mbyhcbiAgICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmaWx0ZXJTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlczogbnVtYmVyfFtudW1iZXIsIG51bWJlcl0sIGRpbGF0aW9uczogbnVtYmVyfFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFkOiAnc2FtZSd8J3ZhbGlkJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLFxuICAgIHJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcsIGRlcHRod2lzZSA9IGZhbHNlLFxuICAgIGRhdGFGb3JtYXQ6ICdjaGFubmVsc0ZpcnN0J3wnY2hhbm5lbHNMYXN0JyA9ICdjaGFubmVsc0xhc3QnKTogQ29udjJESW5mbyB7XG4gIGxldCBbYmF0Y2hTaXplLCBpbkhlaWdodCwgaW5XaWR0aCwgaW5DaGFubmVsc10gPSBbLTEsIC0xLCAtMSwgLTFdO1xuICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICBbYmF0Y2hTaXplLCBpbkhlaWdodCwgaW5XaWR0aCwgaW5DaGFubmVsc10gPSBpblNoYXBlO1xuICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgIFtiYXRjaFNpemUsIGluQ2hhbm5lbHMsIGluSGVpZ2h0LCBpbldpZHRoXSA9IGluU2hhcGU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGRhdGFGb3JtYXQgJHtkYXRhRm9ybWF0fWApO1xuICB9XG5cbiAgY29uc3QgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsICwgZmlsdGVyQ2hhbm5lbHNdID0gZmlsdGVyU2hhcGU7XG4gIGNvbnN0IFtzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXSA9IHBhcnNlVHVwbGVQYXJhbShzdHJpZGVzKTtcbiAgY29uc3QgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXSA9IHBhcnNlVHVwbGVQYXJhbShkaWxhdGlvbnMpO1xuXG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9XG4gICAgICBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlckhlaWdodCwgZGlsYXRpb25IZWlnaHQpO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9XG4gICAgICBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlcldpZHRoLCBkaWxhdGlvbldpZHRoKTtcbiAgY29uc3Qge3BhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGh9ID0gZ2V0UGFkQW5kT3V0SW5mbyhcbiAgICAgIHBhZCwgaW5IZWlnaHQsIGluV2lkdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCxcbiAgICAgIGVmZmVjdGl2ZUZpbHRlcldpZHRoLCByb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IG91dENoYW5uZWxzID0gZGVwdGh3aXNlID8gZmlsdGVyQ2hhbm5lbHMgKiBpbkNoYW5uZWxzIDogZmlsdGVyQ2hhbm5lbHM7XG5cbiAgbGV0IG91dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgIG91dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0Q2hhbm5lbHMsIG91dEhlaWdodCwgb3V0V2lkdGhdO1xuICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgb3V0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVsc107XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhdGNoU2l6ZSxcbiAgICBkYXRhRm9ybWF0LFxuICAgIGluSGVpZ2h0LFxuICAgIGluV2lkdGgsXG4gICAgaW5DaGFubmVscyxcbiAgICBvdXRIZWlnaHQsXG4gICAgb3V0V2lkdGgsXG4gICAgb3V0Q2hhbm5lbHMsXG4gICAgcGFkSW5mbyxcbiAgICBzdHJpZGVIZWlnaHQsXG4gICAgc3RyaWRlV2lkdGgsXG4gICAgZmlsdGVySGVpZ2h0LFxuICAgIGZpbHRlcldpZHRoLFxuICAgIGVmZmVjdGl2ZUZpbHRlckhlaWdodCxcbiAgICBlZmZlY3RpdmVGaWx0ZXJXaWR0aCxcbiAgICBkaWxhdGlvbkhlaWdodCxcbiAgICBkaWxhdGlvbldpZHRoLFxuICAgIGluU2hhcGUsXG4gICAgb3V0U2hhcGUsXG4gICAgZmlsdGVyU2hhcGVcbiAgfTtcbn1cblxuLyoqXG4gKiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZm9yd2FyZCBwYXNzIG9mIGEgM0QgY29udm9sdXRpb24vcG9vbGluZyBvcGVyYXRpb24uXG4gKiBJdCBpbmNsdWRlcyBpbnB1dCBhbmQgb3V0cHV0IHNoYXBlLCBzdHJpZGVzLCBmaWx0ZXIgc2l6ZSBhbmQgcGFkZGluZ1xuICogaW5mb3JtYXRpb24uXG4gKi9cbmV4cG9ydCB0eXBlIENvbnYzREluZm8gPSB7XG4gIGJhdGNoU2l6ZTogbnVtYmVyLFxuICBpbkRlcHRoOiBudW1iZXIsXG4gIGluSGVpZ2h0OiBudW1iZXIsXG4gIGluV2lkdGg6IG51bWJlcixcbiAgaW5DaGFubmVsczogbnVtYmVyLFxuICBvdXREZXB0aDogbnVtYmVyLFxuICBvdXRIZWlnaHQ6IG51bWJlcixcbiAgb3V0V2lkdGg6IG51bWJlcixcbiAgb3V0Q2hhbm5lbHM6IG51bWJlcixcbiAgZGF0YUZvcm1hdDogJ2NoYW5uZWxzRmlyc3QnfCdjaGFubmVsc0xhc3QnLFxuICBzdHJpZGVEZXB0aDogbnVtYmVyLFxuICBzdHJpZGVIZWlnaHQ6IG51bWJlcixcbiAgc3RyaWRlV2lkdGg6IG51bWJlcixcbiAgZGlsYXRpb25EZXB0aDogbnVtYmVyLFxuICBkaWxhdGlvbkhlaWdodDogbnVtYmVyLFxuICBkaWxhdGlvbldpZHRoOiBudW1iZXIsXG4gIGZpbHRlckRlcHRoOiBudW1iZXIsXG4gIGZpbHRlckhlaWdodDogbnVtYmVyLFxuICBmaWx0ZXJXaWR0aDogbnVtYmVyLFxuICBlZmZlY3RpdmVGaWx0ZXJEZXB0aDogbnVtYmVyLFxuICBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ6IG51bWJlcixcbiAgZWZmZWN0aXZlRmlsdGVyV2lkdGg6IG51bWJlcixcbiAgcGFkSW5mbzogUGFkSW5mbzNELFxuICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICBvdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl1cbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGluZm9ybWF0aW9uIGZvciBhIGZvcndhcmQgcGFzcyBvZiBhIDNEIGNvbnZvbHV0aW9uL3Bvb2xpbmdcbiAqIG9wZXJhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVDb252M0RJbmZvKFxuICAgIGluU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlczogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBkaWxhdGlvbnM6IG51bWJlcnxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHBhZDogJ3NhbWUnfCd2YWxpZCd8bnVtYmVyLFxuICAgIGRlcHRod2lzZSA9IGZhbHNlLFxuICAgIGRhdGFGb3JtYXQ6ICdjaGFubmVsc0ZpcnN0J3wnY2hhbm5lbHNMYXN0JyA9ICdjaGFubmVsc0xhc3QnLFxuICAgIHJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBDb252M0RJbmZvIHtcbiAgbGV0IFtiYXRjaFNpemUsIGluRGVwdGgsIGluSGVpZ2h0LCBpbldpZHRoLCBpbkNoYW5uZWxzXSA9XG4gICAgICBbLTEsIC0xLCAtMSwgLTEsIC0xXTtcbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgW2JhdGNoU2l6ZSwgaW5EZXB0aCwgaW5IZWlnaHQsIGluV2lkdGgsIGluQ2hhbm5lbHNdID0gaW5TaGFwZTtcbiAgfSBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICBbYmF0Y2hTaXplLCBpbkNoYW5uZWxzLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aF0gPSBpblNoYXBlO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgfVxuXG4gIGNvbnN0IFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgLCBmaWx0ZXJDaGFubmVsc10gPVxuICAgICAgZmlsdGVyU2hhcGU7XG4gIGNvbnN0IFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF0gPSBwYXJzZTNUdXBsZVBhcmFtKHN0cmlkZXMpO1xuICBjb25zdCBbZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdID1cbiAgICAgIHBhcnNlM1R1cGxlUGFyYW0oZGlsYXRpb25zKTtcblxuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9XG4gICAgICBnZXRFZmZlY3RpdmVGaWx0ZXJTaXplKGZpbHRlckRlcHRoLCBkaWxhdGlvbkRlcHRoKTtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID1cbiAgICAgIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVySGVpZ2h0LCBkaWxhdGlvbkhlaWdodCk7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID1cbiAgICAgIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyV2lkdGgsIGRpbGF0aW9uV2lkdGgpO1xuICBjb25zdCB7cGFkSW5mbywgb3V0RGVwdGgsIG91dEhlaWdodCwgb3V0V2lkdGh9ID0gZ2V0M0RQYWRBbmRPdXRJbmZvKFxuICAgICAgcGFkLCBpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGgsXG4gICAgICBlZmZlY3RpdmVGaWx0ZXJEZXB0aCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCxcbiAgICAgIHJvdW5kaW5nTW9kZSk7XG5cbiAgY29uc3Qgb3V0Q2hhbm5lbHMgPSBkZXB0aHdpc2UgPyBmaWx0ZXJDaGFubmVscyAqIGluQ2hhbm5lbHMgOiBmaWx0ZXJDaGFubmVscztcblxuICBsZXQgb3V0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dENoYW5uZWxzLCBvdXREZXB0aCwgb3V0SGVpZ2h0LCBvdXRXaWR0aF07XG4gIH0gZWxzZSBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICBvdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBvdXRDaGFubmVsc107XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGJhdGNoU2l6ZSxcbiAgICBkYXRhRm9ybWF0LFxuICAgIGluRGVwdGgsXG4gICAgaW5IZWlnaHQsXG4gICAgaW5XaWR0aCxcbiAgICBpbkNoYW5uZWxzLFxuICAgIG91dERlcHRoLFxuICAgIG91dEhlaWdodCxcbiAgICBvdXRXaWR0aCxcbiAgICBvdXRDaGFubmVscyxcbiAgICBwYWRJbmZvLFxuICAgIHN0cmlkZURlcHRoLFxuICAgIHN0cmlkZUhlaWdodCxcbiAgICBzdHJpZGVXaWR0aCxcbiAgICBmaWx0ZXJEZXB0aCxcbiAgICBmaWx0ZXJIZWlnaHQsXG4gICAgZmlsdGVyV2lkdGgsXG4gICAgZWZmZWN0aXZlRmlsdGVyRGVwdGgsXG4gICAgZWZmZWN0aXZlRmlsdGVySGVpZ2h0LFxuICAgIGVmZmVjdGl2ZUZpbHRlcldpZHRoLFxuICAgIGRpbGF0aW9uRGVwdGgsXG4gICAgZGlsYXRpb25IZWlnaHQsXG4gICAgZGlsYXRpb25XaWR0aCxcbiAgICBpblNoYXBlLFxuICAgIG91dFNoYXBlLFxuICAgIGZpbHRlclNoYXBlXG4gIH07XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVPdXRwdXRTaGFwZTJEKFxuICAgIGluU2hhcGU6IFtudW1iZXIsIG51bWJlcl0sIGZpZWxkU2l6ZTogbnVtYmVyLCBzdHJpZGU6IG51bWJlcixcbiAgICB6ZXJvUGFkPzogbnVtYmVyLCByb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGlmICh6ZXJvUGFkID09IG51bGwpIHtcbiAgICB6ZXJvUGFkID0gY29tcHV0ZURlZmF1bHRQYWQoaW5TaGFwZSwgZmllbGRTaXplLCBzdHJpZGUpO1xuICB9XG4gIGNvbnN0IGlucHV0Um93cyA9IGluU2hhcGVbMF07XG4gIGNvbnN0IGlucHV0Q29scyA9IGluU2hhcGVbMV07XG5cbiAgY29uc3Qgb3V0cHV0Um93cyA9XG4gICAgICByb3VuZCgoaW5wdXRSb3dzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgY29uc3Qgb3V0cHV0Q29scyA9XG4gICAgICByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcblxuICByZXR1cm4gW291dHB1dFJvd3MsIG91dHB1dENvbHNdO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlT3V0cHV0U2hhcGU0RChcbiAgICBpblNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmllbGRTaXplOiBudW1iZXIsXG4gICAgb3V0Q2hhbm5lbHM6IG51bWJlciwgc3RyaWRlOiBudW1iZXIsIHplcm9QYWQ/OiBudW1iZXIsXG4gICAgcm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgaWYgKHplcm9QYWQgPT0gbnVsbCkge1xuICAgIHplcm9QYWQgPSBjb21wdXRlRGVmYXVsdFBhZChpblNoYXBlLCBmaWVsZFNpemUsIHN0cmlkZSk7XG4gIH1cbiAgY29uc3QgaW5wdXREZXB0aCA9IGluU2hhcGVbMF07XG4gIGNvbnN0IGlucHV0Um93cyA9IGluU2hhcGVbMV07XG4gIGNvbnN0IGlucHV0Q29scyA9IGluU2hhcGVbMl07XG5cbiAgY29uc3Qgb3V0cHV0RGVwdGhzID1cbiAgICAgIHJvdW5kKChpbnB1dERlcHRoIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgY29uc3Qgb3V0cHV0Um93cyA9XG4gICAgICByb3VuZCgoaW5wdXRSb3dzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcbiAgY29uc3Qgb3V0cHV0Q29scyA9XG4gICAgICByb3VuZCgoaW5wdXRDb2xzIC0gZmllbGRTaXplICsgMiAqIHplcm9QYWQpIC8gc3RyaWRlICsgMSwgcm91bmRpbmdNb2RlKTtcblxuICByZXR1cm4gW291dHB1dERlcHRocywgb3V0cHV0Um93cywgb3V0cHV0Q29scywgb3V0Q2hhbm5lbHNdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZURlZmF1bHRQYWQoXG4gICAgaW5wdXRTaGFwZTogW251bWJlciwgbnVtYmVyXXxbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBmaWVsZFNpemU6IG51bWJlciwgc3RyaWRlOiBudW1iZXIsIGRpbGF0aW9uID0gMSk6IG51bWJlciB7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpZWxkU2l6ZSA9IGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmllbGRTaXplLCBkaWxhdGlvbik7XG4gIHJldHVybiBNYXRoLmZsb29yKFxuICAgICAgKGlucHV0U2hhcGVbMF0gKiAoc3RyaWRlIC0gMSkgLSBzdHJpZGUgKyBlZmZlY3RpdmVGaWVsZFNpemUpIC8gMik7XG59XG5cbmZ1bmN0aW9uIHBhcnNlVHVwbGVQYXJhbShwYXJhbTogbnVtYmVyfG51bWJlcltdKTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgaWYgKHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gW3BhcmFtLCBwYXJhbSwgcGFyYW1dO1xuICB9XG4gIGlmIChwYXJhbS5sZW5ndGggPT09IDIpIHtcbiAgICByZXR1cm4gW3BhcmFtWzBdLCBwYXJhbVsxXSwgMV07XG4gIH1cbiAgcmV0dXJuIHBhcmFtIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbn1cblxuZnVuY3Rpb24gcGFyc2UzVHVwbGVQYXJhbShwYXJhbTogbnVtYmVyfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6XG4gICAgW251bWJlciwgbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIHR5cGVvZiBwYXJhbSA9PT0gJ251bWJlcicgPyBbcGFyYW0sIHBhcmFtLCBwYXJhbV0gOiBwYXJhbTtcbn1cblxuLyogU2VlIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9hdHJvdXNfY29udjJkXG4gKiBBdHJvdXMgY29udm9sdXRpb24gaXMgZXF1aXZhbGVudCB0byBzdGFuZGFyZCBjb252b2x1dGlvbiB3aXRoIHVwc2FtcGxlZFxuICogZmlsdGVycyB3aXRoIGVmZmVjdGl2ZV9maWx0ZXJfaGVpZ2h0ID1cbiAqIGZpbHRlcl9oZWlnaHQgKyAoZmlsdGVyX2hlaWdodCAtIDEpICogKGRpbGF0aW9uIC0gMSlcbiAqIGFuZCBlZmZlY3RpdmVfZmlsdGVyX3dpZHRoID1cbiAqIGZpbHRlcl93aWR0aCArIChmaWx0ZXJfd2lkdGggLSAxKSAqIChkaWxhdGlvbiAtIDEpLFxuICogcHJvZHVjZWQgYnkgaW5zZXJ0aW5nIGRpbGF0aW9uIC0gMSB6ZXJvcyBhbG9uZyBjb25zZWN1dGl2ZSBlbGVtZW50cyBhY3Jvc3NcbiAqIHRoZSBmaWx0ZXJzJyBzcGF0aWFsIGRpbWVuc2lvbnMuXG4gKiBXaGVuIHRoZXJlIGlzIGEgZGlsYXRpb24sIHRoaXMgY29udmVydHMgYSBmaWx0ZXIgZGltZW5zaW9uIHRvIHRoZVxuICogZWZmZWN0aXZlIGZpbHRlciBkaW1lbnNpb24sIHNvIGl0IGNhbiBiZSB1c2VkIGluIGEgc3RhbmRhcmQgY29udm9sdXRpb24uXG4gKi9cbmZ1bmN0aW9uIGdldEVmZmVjdGl2ZUZpbHRlclNpemUoZmlsdGVyU2l6ZTogbnVtYmVyLCBkaWxhdGlvbjogbnVtYmVyKSB7XG4gIGlmIChkaWxhdGlvbiA8PSAxKSB7XG4gICAgcmV0dXJuIGZpbHRlclNpemU7XG4gIH1cblxuICByZXR1cm4gZmlsdGVyU2l6ZSArIChmaWx0ZXJTaXplIC0gMSkgKiAoZGlsYXRpb24gLSAxKTtcbn1cblxuZnVuY3Rpb24gZ2V0UGFkQW5kT3V0SW5mbyhcbiAgICBwYWQ6ICdzYW1lJ3wndmFsaWQnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsIGluSGVpZ2h0OiBudW1iZXIsXG4gICAgaW5XaWR0aDogbnVtYmVyLCBzdHJpZGVIZWlnaHQ6IG51bWJlciwgc3RyaWRlV2lkdGg6IG51bWJlcixcbiAgICBmaWx0ZXJIZWlnaHQ6IG51bWJlciwgZmlsdGVyV2lkdGg6IG51bWJlcixcbiAgICByb3VuZGluZ01vZGU6ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcsXG4gICAgZGF0YUZvcm1hdDogJ2NoYW5uZWxzRmlyc3QnfFxuICAgICdjaGFubmVsc0xhc3QnKToge3BhZEluZm86IFBhZEluZm8sIG91dEhlaWdodDogbnVtYmVyLCBvdXRXaWR0aDogbnVtYmVyfSB7XG4gIGxldCBwYWRJbmZvOiBQYWRJbmZvO1xuICBsZXQgb3V0SGVpZ2h0OiBudW1iZXI7XG4gIGxldCBvdXRXaWR0aDogbnVtYmVyO1xuXG4gIGlmICh0eXBlb2YgcGFkID09PSAnbnVtYmVyJykge1xuICAgIGNvbnN0IHBhZFR5cGUgPSAocGFkID09PSAwKSA/ICdWQUxJRCcgOiAnTlVNQkVSJztcbiAgICBwYWRJbmZvID0ge3RvcDogcGFkLCBib3R0b206IHBhZCwgbGVmdDogcGFkLCByaWdodDogcGFkLCB0eXBlOiBwYWRUeXBlfTtcbiAgICBjb25zdCBvdXRTaGFwZSA9IGNvbXB1dGVPdXRwdXRTaGFwZTJEKFxuICAgICAgICBbaW5IZWlnaHQsIGluV2lkdGhdLCBmaWx0ZXJIZWlnaHQsIHN0cmlkZUhlaWdodCwgcGFkLCByb3VuZGluZ01vZGUpO1xuICAgIG91dEhlaWdodCA9IG91dFNoYXBlWzBdO1xuICAgIG91dFdpZHRoID0gb3V0U2hhcGVbMV07XG4gIH0gZWxzZSBpZiAocGFkID09PSAnc2FtZScpIHtcbiAgICBvdXRIZWlnaHQgPSBNYXRoLmNlaWwoaW5IZWlnaHQgLyBzdHJpZGVIZWlnaHQpO1xuICAgIG91dFdpZHRoID0gTWF0aC5jZWlsKGluV2lkdGggLyBzdHJpZGVXaWR0aCk7XG4gICAgY29uc3QgcGFkQWxvbmdIZWlnaHQgPVxuICAgICAgICBNYXRoLm1heCgwLCAob3V0SGVpZ2h0IC0gMSkgKiBzdHJpZGVIZWlnaHQgKyBmaWx0ZXJIZWlnaHQgLSBpbkhlaWdodCk7XG4gICAgY29uc3QgcGFkQWxvbmdXaWR0aCA9XG4gICAgICAgIE1hdGgubWF4KDAsIChvdXRXaWR0aCAtIDEpICogc3RyaWRlV2lkdGggKyBmaWx0ZXJXaWR0aCAtIGluV2lkdGgpO1xuICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IocGFkQWxvbmdIZWlnaHQgLyAyKTtcbiAgICBjb25zdCBib3R0b20gPSBwYWRBbG9uZ0hlaWdodCAtIHRvcDtcbiAgICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcihwYWRBbG9uZ1dpZHRoIC8gMik7XG4gICAgY29uc3QgcmlnaHQgPSBwYWRBbG9uZ1dpZHRoIC0gbGVmdDtcbiAgICBwYWRJbmZvID0ge3RvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgdHlwZTogJ1NBTUUnfTtcbiAgfSBlbHNlIGlmIChwYWQgPT09ICd2YWxpZCcpIHtcbiAgICBwYWRJbmZvID0ge3RvcDogMCwgYm90dG9tOiAwLCBsZWZ0OiAwLCByaWdodDogMCwgdHlwZTogJ1ZBTElEJ307XG4gICAgb3V0SGVpZ2h0ID0gTWF0aC5jZWlsKChpbkhlaWdodCAtIGZpbHRlckhlaWdodCArIDEpIC8gc3RyaWRlSGVpZ2h0KTtcbiAgICBvdXRXaWR0aCA9IE1hdGguY2VpbCgoaW5XaWR0aCAtIGZpbHRlcldpZHRoICsgMSkgLyBzdHJpZGVXaWR0aCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHBhZCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCB0b3AgPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsxXVswXSA6IHBhZFsyXVswXTtcbiAgICBjb25zdCBib3R0b20gPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsxXVsxXSA6IHBhZFsyXVsxXTtcbiAgICBjb25zdCBsZWZ0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCcgPyBwYWRbMl1bMF0gOiBwYWRbM11bMF07XG4gICAgY29uc3QgcmlnaHQgPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JyA/IHBhZFsyXVsxXSA6IHBhZFszXVsxXTtcbiAgICBjb25zdCBwYWRUeXBlID0gKHRvcCA9PT0gMCAmJiBib3R0b20gPT09IDAgJiYgbGVmdCA9PT0gMCAmJiByaWdodCA9PT0gMCkgP1xuICAgICAgICAnVkFMSUQnIDpcbiAgICAgICAgJ0VYUExJQ0lUJztcbiAgICBwYWRJbmZvID0ge3RvcCwgYm90dG9tLCBsZWZ0LCByaWdodCwgdHlwZTogcGFkVHlwZX07XG4gICAgb3V0SGVpZ2h0ID0gcm91bmQoXG4gICAgICAgIChpbkhlaWdodCAtIGZpbHRlckhlaWdodCArIHRvcCArIGJvdHRvbSkgLyBzdHJpZGVIZWlnaHQgKyAxLFxuICAgICAgICByb3VuZGluZ01vZGUpO1xuICAgIG91dFdpZHRoID0gcm91bmQoXG4gICAgICAgIChpbldpZHRoIC0gZmlsdGVyV2lkdGggKyBsZWZ0ICsgcmlnaHQpIC8gc3RyaWRlV2lkdGggKyAxLCByb3VuZGluZ01vZGUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGBVbmtub3duIHBhZGRpbmcgcGFyYW1ldGVyOiAke3BhZH1gKTtcbiAgfVxuICByZXR1cm4ge3BhZEluZm8sIG91dEhlaWdodCwgb3V0V2lkdGh9O1xufVxuXG5mdW5jdGlvbiBnZXQzRFBhZEFuZE91dEluZm8oXG4gICAgcGFkOiAnc2FtZSd8J3ZhbGlkJ3xudW1iZXIsIGluRGVwdGg6IG51bWJlciwgaW5IZWlnaHQ6IG51bWJlcixcbiAgICBpbldpZHRoOiBudW1iZXIsIHN0cmlkZURlcHRoOiBudW1iZXIsIHN0cmlkZUhlaWdodDogbnVtYmVyLFxuICAgIHN0cmlkZVdpZHRoOiBudW1iZXIsIGZpbHRlckRlcHRoOiBudW1iZXIsIGZpbHRlckhlaWdodDogbnVtYmVyLFxuICAgIGZpbHRlcldpZHRoOiBudW1iZXIsIHJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiB7XG4gIHBhZEluZm86IFBhZEluZm8zRCxcbiAgb3V0RGVwdGg6IG51bWJlcixcbiAgb3V0SGVpZ2h0OiBudW1iZXIsXG4gIG91dFdpZHRoOiBudW1iZXJcbn0ge1xuICBsZXQgcGFkSW5mbzogUGFkSW5mbzNEO1xuICBsZXQgb3V0RGVwdGg6IG51bWJlcjtcbiAgbGV0IG91dEhlaWdodDogbnVtYmVyO1xuICBsZXQgb3V0V2lkdGg6IG51bWJlcjtcblxuICBpZiAodHlwZW9mIHBhZCA9PT0gJ251bWJlcicpIHtcbiAgICBjb25zdCBwYWRUeXBlID0gKHBhZCA9PT0gMCkgPyAnVkFMSUQnIDogJ05VTUJFUic7XG4gICAgcGFkSW5mbyA9IHtcbiAgICAgIHRvcDogcGFkLFxuICAgICAgYm90dG9tOiBwYWQsXG4gICAgICBsZWZ0OiBwYWQsXG4gICAgICByaWdodDogcGFkLFxuICAgICAgZnJvbnQ6IHBhZCxcbiAgICAgIGJhY2s6IHBhZCxcbiAgICAgIHR5cGU6IHBhZFR5cGVcbiAgICB9O1xuICAgIGNvbnN0IG91dFNoYXBlID0gY29tcHV0ZU91dHB1dFNoYXBlNEQoXG4gICAgICAgIFtpbkRlcHRoLCBpbkhlaWdodCwgaW5XaWR0aCwgMV0sIGZpbHRlckRlcHRoLCAxLCBzdHJpZGVEZXB0aCwgcGFkLFxuICAgICAgICByb3VuZGluZ01vZGUpO1xuICAgIG91dERlcHRoID0gb3V0U2hhcGVbMF07XG4gICAgb3V0SGVpZ2h0ID0gb3V0U2hhcGVbMV07XG4gICAgb3V0V2lkdGggPSBvdXRTaGFwZVsyXTtcbiAgfSBlbHNlIGlmIChwYWQgPT09ICdzYW1lJykge1xuICAgIG91dERlcHRoID0gTWF0aC5jZWlsKGluRGVwdGggLyBzdHJpZGVEZXB0aCk7XG4gICAgb3V0SGVpZ2h0ID0gTWF0aC5jZWlsKGluSGVpZ2h0IC8gc3RyaWRlSGVpZ2h0KTtcbiAgICBvdXRXaWR0aCA9IE1hdGguY2VpbChpbldpZHRoIC8gc3RyaWRlV2lkdGgpO1xuICAgIGNvbnN0IHBhZEFsb25nRGVwdGggPSAob3V0RGVwdGggLSAxKSAqIHN0cmlkZURlcHRoICsgZmlsdGVyRGVwdGggLSBpbkRlcHRoO1xuICAgIGNvbnN0IHBhZEFsb25nSGVpZ2h0ID1cbiAgICAgICAgKG91dEhlaWdodCAtIDEpICogc3RyaWRlSGVpZ2h0ICsgZmlsdGVySGVpZ2h0IC0gaW5IZWlnaHQ7XG4gICAgY29uc3QgcGFkQWxvbmdXaWR0aCA9IChvdXRXaWR0aCAtIDEpICogc3RyaWRlV2lkdGggKyBmaWx0ZXJXaWR0aCAtIGluV2lkdGg7XG4gICAgY29uc3QgZnJvbnQgPSBNYXRoLmZsb29yKHBhZEFsb25nRGVwdGggLyAyKTtcbiAgICBjb25zdCBiYWNrID0gcGFkQWxvbmdEZXB0aCAtIGZyb250O1xuICAgIGNvbnN0IHRvcCA9IE1hdGguZmxvb3IocGFkQWxvbmdIZWlnaHQgLyAyKTtcbiAgICBjb25zdCBib3R0b20gPSBwYWRBbG9uZ0hlaWdodCAtIHRvcDtcbiAgICBjb25zdCBsZWZ0ID0gTWF0aC5mbG9vcihwYWRBbG9uZ1dpZHRoIC8gMik7XG4gICAgY29uc3QgcmlnaHQgPSBwYWRBbG9uZ1dpZHRoIC0gbGVmdDtcblxuICAgIHBhZEluZm8gPSB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0LCBmcm9udCwgYmFjaywgdHlwZTogJ1NBTUUnfTtcbiAgfSBlbHNlIGlmIChwYWQgPT09ICd2YWxpZCcpIHtcbiAgICBwYWRJbmZvID0ge1xuICAgICAgdG9wOiAwLFxuICAgICAgYm90dG9tOiAwLFxuICAgICAgbGVmdDogMCxcbiAgICAgIHJpZ2h0OiAwLFxuICAgICAgZnJvbnQ6IDAsXG4gICAgICBiYWNrOiAwLFxuICAgICAgdHlwZTogJ1ZBTElEJ1xuICAgIH07XG4gICAgb3V0RGVwdGggPSBNYXRoLmNlaWwoKGluRGVwdGggLSBmaWx0ZXJEZXB0aCArIDEpIC8gc3RyaWRlRGVwdGgpO1xuICAgIG91dEhlaWdodCA9IE1hdGguY2VpbCgoaW5IZWlnaHQgLSBmaWx0ZXJIZWlnaHQgKyAxKSAvIHN0cmlkZUhlaWdodCk7XG4gICAgb3V0V2lkdGggPSBNYXRoLmNlaWwoKGluV2lkdGggLSBmaWx0ZXJXaWR0aCArIDEpIC8gc3RyaWRlV2lkdGgpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEVycm9yKGBVbmtub3duIHBhZGRpbmcgcGFyYW1ldGVyOiAke3BhZH1gKTtcbiAgfVxuICByZXR1cm4ge3BhZEluZm8sIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRofTtcbn1cblxuLyoqXG4gKiBSb3VuZHMgYSB2YWx1ZSBkZXBlbmRpbmcgb24gdGhlIHJvdW5kaW5nIG1vZGVcbiAqIEBwYXJhbSB2YWx1ZVxuICogQHBhcmFtIHJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiByb3VuZCh2YWx1ZTogbnVtYmVyLCByb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKSB7XG4gIGlmICghcm91bmRpbmdNb2RlKSB7XG4gICAgcmV0dXJuIE1hdGgudHJ1bmModmFsdWUpO1xuICB9XG4gIHN3aXRjaCAocm91bmRpbmdNb2RlKSB7XG4gICAgY2FzZSAncm91bmQnOlxuICAgICAgLy8gdXNlZCBmb3IgQ2FmZmUgQ29udlxuICAgICAgcmV0dXJuIE1hdGgucm91bmQodmFsdWUpO1xuICAgIGNhc2UgJ2NlaWwnOlxuICAgICAgLy8gdXNlZCBmb3IgQ2FmZmUgUG9vbFxuICAgICAgcmV0dXJuIE1hdGguY2VpbCh2YWx1ZSk7XG4gICAgY2FzZSAnZmxvb3InOlxuICAgICAgcmV0dXJuIE1hdGguZmxvb3IodmFsdWUpO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcm91bmRpbmdNb2RlICR7cm91bmRpbmdNb2RlfWApO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0dXBsZVZhbHVlc0FyZU9uZShwYXJhbTogbnVtYmVyfG51bWJlcltdKTogYm9vbGVhbiB7XG4gIGNvbnN0IFtkaW1BLCBkaW1CLCBkaW1DXSA9IHBhcnNlVHVwbGVQYXJhbShwYXJhbSk7XG4gIHJldHVybiBkaW1BID09PSAxICYmIGRpbUIgPT09IDEgJiYgZGltQyA9PT0gMTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShcbiAgICBzdHJpZGVzOiBudW1iZXJ8bnVtYmVyW10sIGRpbGF0aW9uczogbnVtYmVyfG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiB0dXBsZVZhbHVlc0FyZU9uZShzdHJpZGVzKSB8fCB0dXBsZVZhbHVlc0FyZU9uZShkaWxhdGlvbnMpO1xufVxuXG4vKipcbiAqIENvbnZlcnQgQ29udjJEIGRhdGFGb3JtYXQgZnJvbSAnTkhXQyd8J05DSFcnIHRvXG4gKiAgICAnY2hhbm5lbHNMYXN0J3wnY2hhbm5lbHNGaXJzdCdcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IGluICdOSFdDJ3wnTkNIVycgbW9kZVxuICogQHJldHVybiBkYXRhRm9ybWF0IGluICdjaGFubmVsc0xhc3QnfCdjaGFubmVsc0ZpcnN0JyBtb2RlXG4gKiBAdGhyb3dzIHVua25vd24gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyk6XG4gICAgJ2NoYW5uZWxzTGFzdCd8J2NoYW5uZWxzRmlyc3QnIHtcbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgIHJldHVybiAnY2hhbm5lbHNMYXN0JztcbiAgfSBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnTkNIVycpIHtcbiAgICByZXR1cm4gJ2NoYW5uZWxzRmlyc3QnO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhRm9ybWF0ICR7ZGF0YUZvcm1hdH1gKTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrIHZhbGlkaXR5IG9mIHBhZCB3aGVuIHVzaW5nIGRpbVJvdW5kaW5nTW9kZS5cbiAqIEBwYXJhbSBvcERlc2MgQSBzdHJpbmcgb2Ygb3AgZGVzY3JpcHRpb25cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgLSBgdmFsaWRgIG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEB0aHJvd3MgdW5rbm93biBwYWRkaW5nIHBhcmFtZXRlclxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZShcbiAgICBvcERlc2M6IHN0cmluZywgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpIHtcbiAgaWYgKGRpbVJvdW5kaW5nTW9kZSAhPSBudWxsKSB7XG4gICAgaWYgKHR5cGVvZiBwYWQgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3IgaW4gJHtvcERlc2N9OiBwYWQgbXVzdCBiZSBhbiBpbnRlZ2VyIHdoZW4gdXNpbmcgYCAgK1xuICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7cGFkfS5gKTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBwYWQgPT09ICdudW1iZXInKSB7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdXRpbC5pc0ludChwYWQpLFxuICAgICAgICAgICgpID0+IGBFcnJvciBpbiAke29wRGVzY306IHBhZCBtdXN0IGJlIGFuIGludGVnZXIgd2hlbiB1c2luZyBgICtcbiAgICAgICAgICAgICAgYGRpbVJvdW5kaW5nTW9kZSAke2RpbVJvdW5kaW5nTW9kZX0gYnV0IGdvdCBwYWQgJHtwYWR9LmApO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHBhZCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIChwYWQgYXMgRXhwbGljaXRQYWRkaW5nKS5mb3JFYWNoKHAgPT4ge3AuZm9yRWFjaCh2ID0+e1xuICAgICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICB1dGlsLmlzSW50KHYpLFxuICAgICAgICAgICAgKCkgPT4gYEVycm9yIGluICR7b3BEZXNjfTogcGFkIG11c3QgYmUgYW4gaW50ZWdlciB3aGVuIHVzaW5nIGAgK1xuICAgICAgICAgICAgICAgIGBkaW1Sb3VuZGluZ01vZGUgJHtkaW1Sb3VuZGluZ01vZGV9IGJ1dCBnb3QgcGFkICR7dn0uYCk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IEVycm9yKGBFcnJvciBpbiAke29wRGVzY306IFVua25vd24gcGFkZGluZyBwYXJhbWV0ZXI6ICR7cGFkfWApO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Reshape } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Reshapes a `tf.Tensor` to a given shape.\n *\n * Given an input tensor, returns a new tensor with the same values as the\n * input tensor with shape `shape`.\n *\n * If one component of shape is the special value -1, the size of that\n * dimension is computed so that the total size remains constant. In\n * particular, a shape of [-1] flattens into 1-D. At most one component of\n * shape can be -1.\n *\n * If shape is 1-D or higher, then the operation returns a tensor with shape\n * shape filled with the values of tensor. In this case, the number of\n * elements implied by shape must be the same as the number of elements in\n * tensor.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * x.reshape([2, 2]).print();\n * ```\n *\n * @param x The input tensor to be reshaped.\n * @param shape An array of integers defining the output tensor shape.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction reshape_(x, shape) {\n    const $x = convertToTensor(x, 'x', 'reshape', 'string_or_numeric');\n    const inputs = { x: $x };\n    const attrs = { shape };\n    return ENGINE.runKernel(Reshape, inputs, attrs);\n}\nexport const reshape = op({ reshape_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3Jlc2hhcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUE4QixNQUFNLGlCQUFpQixDQUFDO0FBSXJFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBeUJHO0FBQ0gsU0FBUyxRQUFRLENBQ2IsQ0FBb0IsRUFBRSxLQUFrQjtJQUMxQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUVuRSxNQUFNLE1BQU0sR0FBa0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDdEMsTUFBTSxLQUFLLEdBQWlCLEVBQUMsS0FBSyxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixPQUFPLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVzaGFwZSwgUmVzaGFwZUF0dHJzLCBSZXNoYXBlSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7UmFuaywgU2hhcGVNYXAsIFRlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJlc2hhcGVzIGEgYHRmLlRlbnNvcmAgdG8gYSBnaXZlbiBzaGFwZS5cbiAqXG4gKiBHaXZlbiBhbiBpbnB1dCB0ZW5zb3IsIHJldHVybnMgYSBuZXcgdGVuc29yIHdpdGggdGhlIHNhbWUgdmFsdWVzIGFzIHRoZVxuICogaW5wdXQgdGVuc29yIHdpdGggc2hhcGUgYHNoYXBlYC5cbiAqXG4gKiBJZiBvbmUgY29tcG9uZW50IG9mIHNoYXBlIGlzIHRoZSBzcGVjaWFsIHZhbHVlIC0xLCB0aGUgc2l6ZSBvZiB0aGF0XG4gKiBkaW1lbnNpb24gaXMgY29tcHV0ZWQgc28gdGhhdCB0aGUgdG90YWwgc2l6ZSByZW1haW5zIGNvbnN0YW50LiBJblxuICogcGFydGljdWxhciwgYSBzaGFwZSBvZiBbLTFdIGZsYXR0ZW5zIGludG8gMS1ELiBBdCBtb3N0IG9uZSBjb21wb25lbnQgb2ZcbiAqIHNoYXBlIGNhbiBiZSAtMS5cbiAqXG4gKiBJZiBzaGFwZSBpcyAxLUQgb3IgaGlnaGVyLCB0aGVuIHRoZSBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciB3aXRoIHNoYXBlXG4gKiBzaGFwZSBmaWxsZWQgd2l0aCB0aGUgdmFsdWVzIG9mIHRlbnNvci4gSW4gdGhpcyBjYXNlLCB0aGUgbnVtYmVyIG9mXG4gKiBlbGVtZW50cyBpbXBsaWVkIGJ5IHNoYXBlIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpblxuICogdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIHgucmVzaGFwZShbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGJlIHJlc2hhcGVkLlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIHJlc2hhcGVfPFIgZXh0ZW5kcyBSYW5rPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgc2hhcGU6IFNoYXBlTWFwW1JdKTogVGVuc29yPFI+IHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmVzaGFwZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuXG4gIGNvbnN0IGlucHV0czogUmVzaGFwZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBSZXNoYXBlQXR0cnMgPSB7c2hhcGV9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFJlc2hhcGUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cbmV4cG9ydCBjb25zdCByZXNoYXBlID0gb3Aoe3Jlc2hhcGVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AvgPool } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { cast } from './cast';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the 2D average pooling of an image.\n *\n * @param x The input tensor, of rank 4 or rank 3 of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n *     `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm:\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *    - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *         https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n */\nfunction avgPool_(x, filterSize, strides, pad, dimRoundingMode) {\n    const $x = convertToTensor(x, 'x', 'avgPool', 'float32');\n    const dilations = 1;\n    util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    util.assert(x4D.rank === 4, () => `Error in avgPool: x must be rank 4 but got rank ${x4D.rank}.`);\n    conv_util.checkPadOnDimRoundingMode('avgPool', pad, dimRoundingMode);\n    const inputs = { x: x4D };\n    const attrs = { filterSize, strides, pad, dimRoundingMode };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    let res = ENGINE.runKernel(AvgPool, inputs, attrs);\n    res = cast(res, $x.dtype);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const avgPool = op({ avgPool_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hdmdfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFJckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxRQUFRLENBQ2IsQ0FBZSxFQUFFLFVBQW1DLEVBQ3BELE9BQWdDLEVBQ2hDLEdBQW9ELEVBQ3BELGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxTQUFTLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUM1RCxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsZUFBZSxPQUFPLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRS9ELElBQUksR0FBRyxHQUFHLEVBQWMsQ0FBQztJQUN6QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLEdBQUcsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMvRDtJQUVELElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMsbURBQW1ELEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzFFLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sTUFBTSxHQUFrQixFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQztJQUN2QyxNQUFNLEtBQUssR0FBaUIsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsQ0FBQztJQUV4RSwwREFBMEQ7SUFDMUQsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixPQUFPLEVBQUUsTUFBOEIsRUFDdkMsS0FBMkIsQ0FBTSxDQUFDO0lBRWhELEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxQixJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7S0FDdEU7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0F2Z1Bvb2wsIEF2Z1Bvb2xBdHRycywgQXZnUG9vbElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIDJEIGF2ZXJhZ2UgcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobTpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBhdmdQb29sXzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8Y29udl91dGlsLkV4cGxpY2l0UGFkZGluZyxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F2Z1Bvb2wnLCAnZmxvYXQzMicpO1xuICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGF2Z1Bvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBsZXQgeDREID0gJHggYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2w6IHggbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7eDRELnJhbmt9LmApO1xuICBjb252X3V0aWwuY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZSgnYXZnUG9vbCcsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgaW5wdXRzOiBBdmdQb29sSW5wdXRzID0ge3g6IHg0RH07XG4gIGNvbnN0IGF0dHJzOiBBdmdQb29sQXR0cnMgPSB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgbGV0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgQXZnUG9vbCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICByZXMgPSBjYXN0KHJlcywgJHguZHR5cGUpO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sID0gb3Aoe2F2Z1Bvb2xffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AvgPool3D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { checkPadOnDimRoundingMode } from './conv_util';\nimport { cast } from './cast';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the 3D average pooling.\n *\n * ```js\n * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]);\n * const result = tf.avgPool3d(x, 2, 1, 'valid');\n * result.print();\n * ```\n *\n * @param x The input tensor, of rank 5 or rank 4 of shape\n *     `[batch, depth, height, width, inChannels]`.\n * @param filterSize The filter size:\n *     `[filterDepth, filterHeight, filterWidth]`.\n *     If `filterSize` is a single number,\n *     then `filterDepth == filterHeight == filterWidth`.\n * @param strides The strides of the pooling:\n *     `[strideDepth, strideHeight, strideWidth]`.\n *     If `strides` is a single number,\n *     then `strideDepth == strideHeight == strideWidth`.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1*1x1.\n *    - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n *     \"NDHWC\". Specify the data format of the input and output data. With the\n *     default format \"NDHWC\", the data is stored in the order of: [batch,\n *     depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction avgPool3d_(x, filterSize, strides, pad, dimRoundingMode, dataFormat = 'NDHWC') {\n    const $x = convertToTensor(x, 'x', 'avgPool3d', 'float32');\n    let x5D = $x;\n    let reshapedTo5D = false;\n    if ($x.rank === 4) {\n        reshapedTo5D = true;\n        x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n    }\n    util.assert(x5D.rank === 5, () => `Error in avgPool3d: x must be rank 5 but got rank ${x5D.rank}.`);\n    util.assert(dataFormat === 'NDHWC', () => `Error in avgPool3d: Only NDHWC is currently supported, ` +\n        `but got dataFormat of ${dataFormat}`);\n    checkPadOnDimRoundingMode('avgPool3d', pad, dimRoundingMode);\n    const inputs = { x: x5D };\n    const attrs = { filterSize, strides, pad, dimRoundingMode, dataFormat };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    let res = ENGINE.runKernel(AvgPool3D, inputs, attrs);\n    res = cast(res, x5D.dtype);\n    if (reshapedTo5D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n    }\n    return res;\n}\nexport const avgPool3d = op({ avgPool3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2xfM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hdmdfcG9vbF8zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxTQUFTLEVBQWtDLE1BQU0saUJBQWlCLENBQUM7QUFJM0UsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQ0c7QUFDSCxTQUFTLFVBQVUsQ0FDZixDQUFlLEVBQUUsVUFBMkMsRUFDNUQsT0FBd0MsRUFBRSxHQUEwQixFQUNwRSxlQUF3QyxFQUN4QyxhQUE4QixPQUFPO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUUzRCxJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1RTtJQUVELElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMscURBQXFELEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzVFLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxLQUFLLE9BQU8sRUFDdEIsR0FBRyxFQUFFLENBQUMseURBQXlEO1FBQzNELHlCQUF5QixVQUFVLEVBQUUsQ0FBQyxDQUFDO0lBQy9DLHlCQUF5QixDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0QsTUFBTSxNQUFNLEdBQW9CLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxDQUFDO0lBQ3pDLE1BQU0sS0FBSyxHQUNVLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxDQUFDO0lBRTdFLDBEQUEwRDtJQUMxRCxJQUFJLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLFNBQVMsRUFBRSxNQUE4QixFQUN6QyxLQUEyQixDQUFNLENBQUM7SUFFaEQsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTNCLElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUNILEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztLQUNQO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtBdmdQb29sM0QsIEF2Z1Bvb2wzREF0dHJzLCBBdmdQb29sM0RJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yNEQsIFRlbnNvcjVEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2NoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGV9IGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgM0QgYXZlcmFnZSBwb29saW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yNWQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMSwgMiwgMiwgMiwgMV0pO1xuICogY29uc3QgcmVzdWx0ID0gdGYuYXZnUG9vbDNkKHgsIDIsIDEsICd2YWxpZCcpO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgSWYgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlRGVwdGggPT0gc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGF2Z1Bvb2wzZF88VCBleHRlbmRzIFRlbnNvcjREfFRlbnNvcjVEPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlciwgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyxcbiAgICBkYXRhRm9ybWF0OiAnTkRIV0MnfCdOQ0RIVycgPSAnTkRIV0MnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2F2Z1Bvb2wzZCcsICdmbG9hdDMyJyk7XG5cbiAgbGV0IHg1RCA9ICR4IGFzIFRlbnNvcjVEO1xuICBsZXQgcmVzaGFwZWRUbzVEID0gZmFsc2U7XG4gIGlmICgkeC5yYW5rID09PSA0KSB7XG4gICAgcmVzaGFwZWRUbzVEID0gdHJ1ZTtcbiAgICB4NUQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXSwgJHguc2hhcGVbM11dKTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDVELnJhbmsgPT09IDUsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbDNkOiB4IG11c3QgYmUgcmFuayA1IGJ1dCBnb3QgcmFuayAke3g1RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBkYXRhRm9ybWF0ID09PSAnTkRIV0MnLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2wzZDogT25seSBOREhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgICBgYnV0IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH1gKTtcbiAgY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZSgnYXZnUG9vbDNkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbnB1dHM6IEF2Z1Bvb2wzRElucHV0cyA9IHt4OiB4NUR9O1xuICBjb25zdCBhdHRyczpcbiAgICAgIEF2Z1Bvb2wzREF0dHJzID0ge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0fTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGxldCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgIEF2Z1Bvb2wzRCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICByZXMgPSBjYXN0KHJlcywgeDVELmR0eXBlKTtcblxuICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICAgICAgICAgICByZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKSBhc1xuICAgICAgICBUO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzZCA9IG9wKHthdmdQb29sM2RffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Concat } from '../kernel_names';\nimport { convertToTensorArray } from '../tensor_util_env';\nimport { assert } from '../util';\nimport { clone } from './clone';\nimport { op } from './operation';\n/**\n * Concatenates a list of `tf.Tensor`s along a given axis.\n *\n * The tensors ranks and types must match, and their sizes must match in all\n * dimensions except `axis`.\n *\n * Also available are stricter rank-specific methods that assert that\n * `tensors` are of the given rank:\n *   - `tf.concat1d`\n *   - `tf.concat2d`\n *   - `tf.concat3d`\n *   - `tf.concat4d`\n *\n * Except `tf.concat1d` (which does not have axis param), all methods have\n * same signature as this method.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor1d([3, 4]);\n * a.concat(b).print();  // or a.concat(b)\n * ```\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor1d([3, 4]);\n * const c = tf.tensor1d([5, 6]);\n * tf.concat([a, b, c]).print();\n * ```\n *\n * ```js\n * const a = tf.tensor2d([[1, 2], [10, 20]]);\n * const b = tf.tensor2d([[3, 4], [30, 40]]);\n * const axis = 1;\n * tf.concat([a, b], axis).print();\n * ```\n * @param tensors A list of tensors to concatenate.\n * @param axis The axis to concatenate along. Defaults to 0 (the first dim).\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction concat_(tensors, axis = 0) {\n    assert(tensors.length >= 1, () => 'Pass at least one tensor to concat');\n    const $tensors = convertToTensorArray(tensors, 'tensors', 'concat', 'string_or_numeric');\n    if ($tensors[0].dtype === 'complex64') {\n        $tensors.forEach(tensor => {\n            if (tensor.dtype !== 'complex64') {\n                throw new Error(`Cannot concatenate complex64 tensors with a tensor\n          with dtype ${tensor.dtype}. `);\n            }\n        });\n    }\n    if ($tensors.length === 1) {\n        return clone($tensors[0]);\n    }\n    const inputs = $tensors;\n    const attr = { axis };\n    return ENGINE.runKernel(Concat, inputs, attr);\n}\nexport const concat = op({ concat_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUV4RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRS9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdUNHO0FBQ0gsU0FBUyxPQUFPLENBQW1CLE9BQTRCLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDdkUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7SUFFeEUsTUFBTSxRQUFRLEdBQ1Ysb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUU1RSxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ3JDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDeEIsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtnQkFDaEMsTUFBTSxJQUFJLEtBQUssQ0FBQzt1QkFDRCxNQUFNLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQzthQUNsQztRQUNILENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3pCLE9BQU8sS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzNCO0lBRUQsTUFBTSxNQUFNLEdBQWlCLFFBQVEsQ0FBQztJQUN0QyxNQUFNLElBQUksR0FBZ0IsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUVqQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE1BQU0sRUFBRSxNQUE4QixFQUFFLElBQTBCLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Q29uY2F0LCBDb25jYXRBdHRycywgQ29uY2F0SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvckFycmF5fSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2xvbmV9IGZyb20gJy4vY2xvbmUnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIGFsb25nIGEgZ2l2ZW4gYXhpcy5cbiAqXG4gKiBUaGUgdGVuc29ycyByYW5rcyBhbmQgdHlwZXMgbXVzdCBtYXRjaCwgYW5kIHRoZWlyIHNpemVzIG11c3QgbWF0Y2ggaW4gYWxsXG4gKiBkaW1lbnNpb25zIGV4Y2VwdCBgYXhpc2AuXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB0aGF0IGFzc2VydCB0aGF0XG4gKiBgdGVuc29yc2AgYXJlIG9mIHRoZSBnaXZlbiByYW5rOlxuICogICAtIGB0Zi5jb25jYXQxZGBcbiAqICAgLSBgdGYuY29uY2F0MmRgXG4gKiAgIC0gYHRmLmNvbmNhdDNkYFxuICogICAtIGB0Zi5jb25jYXQ0ZGBcbiAqXG4gKiBFeGNlcHQgYHRmLmNvbmNhdDFkYCAod2hpY2ggZG9lcyBub3QgaGF2ZSBheGlzIHBhcmFtKSwgYWxsIG1ldGhvZHMgaGF2ZVxuICogc2FtZSBzaWduYXR1cmUgYXMgdGhpcyBtZXRob2QuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBhLmNvbmNhdChiKS5wcmludCgpOyAgLy8gb3IgYS5jb25jYXQoYilcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMywgNF0pO1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjFkKFs1LCA2XSk7XG4gKiB0Zi5jb25jYXQoW2EsIGIsIGNdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMTAsIDIwXV0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFtbMywgNF0sIFszMCwgNDBdXSk7XG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHRmLmNvbmNhdChbYSwgYl0sIGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiB0ZW5zb3JzIHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gY29uY2F0ZW5hdGUgYWxvbmcuIERlZmF1bHRzIHRvIDAgKHRoZSBmaXJzdCBkaW0pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiBjb25jYXRfPFQgZXh0ZW5kcyBUZW5zb3I+KHRlbnNvcnM6IEFycmF5PFR8VGVuc29yTGlrZT4sIGF4aXMgPSAwKTogVCB7XG4gIGFzc2VydCh0ZW5zb3JzLmxlbmd0aCA+PSAxLCAoKSA9PiAnUGFzcyBhdCBsZWFzdCBvbmUgdGVuc29yIHRvIGNvbmNhdCcpO1xuXG4gIGNvbnN0ICR0ZW5zb3JzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvckFycmF5KHRlbnNvcnMsICd0ZW5zb3JzJywgJ2NvbmNhdCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuXG4gIGlmICgkdGVuc29yc1swXS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAkdGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICBpZiAodGVuc29yLmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBjb25jYXRlbmF0ZSBjb21wbGV4NjQgdGVuc29ycyB3aXRoIGEgdGVuc29yXG4gICAgICAgICAgd2l0aCBkdHlwZSAke3RlbnNvci5kdHlwZX0uIGApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgaWYgKCR0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBjbG9uZSgkdGVuc29yc1swXSk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IENvbmNhdElucHV0cyA9ICR0ZW5zb3JzO1xuICBjb25zdCBhdHRyOiBDb25jYXRBdHRycyA9IHtheGlzfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIENvbmNhdCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRyIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25jYXQgPSBvcCh7Y29uY2F0X30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sigmoid } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes sigmoid element-wise, `1 / (1 + exp(-x))`\n *\n * ```js\n * const x = tf.tensor1d([0, -1, 2, -3]);\n *\n * x.sigmoid().print();  // or tf.sigmoid(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sigmoid_(x) {\n    const $x = convertToTensor(x, 'x', 'sigmoid', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Sigmoid, inputs);\n}\nexport const sigmoid = op({ sigmoid_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbW9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NpZ21vaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxRQUFRLENBQW1CLENBQWU7SUFDakQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXpELE1BQU0sTUFBTSxHQUFrQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV0QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTaWdtb2lkLCBTaWdtb2lkSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHNpZ21vaWQgZWxlbWVudC13aXNlLCBgMSAvICgxICsgZXhwKC14KSlgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgLTEsIDIsIC0zXSk7XG4gKlxuICogeC5zaWdtb2lkKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpZ21vaWQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc2lnbW9pZF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpZ21vaWQnLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGlucHV0czogU2lnbW9pZElucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2lnbW9pZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBzaWdtb2lkID0gb3Aoe3NpZ21vaWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Slice } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Extracts a slice from a `tf.Tensor` starting at coordinates `begin`\n * and is of size `size`.\n *\n * Also available are stricter rank-specific methods with the same signature\n * as this method that assert that `x` is of the given rank:\n *   - `tf.slice1d`\n *   - `tf.slice2d`\n *   - `tf.slice3d`\n *   - `tf.slice4d`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * x.slice([1], [2]).print();\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * x.slice([1, 0], [1, 2]).print();\n * ```\n * @param x The input `tf.Tensor` to slice from.\n * @param begin The coordinates to start the slice from. The length can be\n *     less than the rank of x - the rest of the axes will have implicit 0 as\n *     start. Can also be a single number, in which case it specifies the\n *     first axis.\n * @param size The size of the slice. The length can be less than the rank of\n *     x - the rest of the axes will have implicit -1. A value of -1 requests\n *     the rest of the dimensions in the axis. Can also be a single number,\n *     in which case it specifies the size of the first axis.\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction slice_(x, begin, size) {\n    const $x = convertToTensor(x, 'x', 'slice', 'string_or_numeric');\n    if ($x.rank === 0) {\n        throw new Error('Slicing scalar is not possible');\n    }\n    const inputs = { x: $x };\n    const attrs = { begin, size };\n    return ENGINE.runKernel(Slice, inputs, attrs);\n}\nexport const slice = op({ slice_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zbGljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQTBCLE1BQU0saUJBQWlCLENBQUM7QUFJL0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILFNBQVMsTUFBTSxDQUNYLENBQWUsRUFBRSxLQUFzQixFQUFFLElBQXNCO0lBQ2pFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRWpFLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0tBQ25EO0lBRUQsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3BDLE1BQU0sS0FBSyxHQUFlLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDO0lBRXhDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsS0FBSyxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NsaWNlLCBTbGljZUF0dHJzLCBTbGljZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgc2xpY2UgZnJvbSBhIGB0Zi5UZW5zb3JgIHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmBcbiAqIGFuZCBpcyBvZiBzaXplIGBzaXplYC5cbiAqXG4gKiBBbHNvIGF2YWlsYWJsZSBhcmUgc3RyaWN0ZXIgcmFuay1zcGVjaWZpYyBtZXRob2RzIHdpdGggdGhlIHNhbWUgc2lnbmF0dXJlXG4gKiBhcyB0aGlzIG1ldGhvZCB0aGF0IGFzc2VydCB0aGF0IGB4YCBpcyBvZiB0aGUgZ2l2ZW4gcmFuazpcbiAqICAgLSBgdGYuc2xpY2UxZGBcbiAqICAgLSBgdGYuc2xpY2UyZGBcbiAqICAgLSBgdGYuc2xpY2UzZGBcbiAqICAgLSBgdGYuc2xpY2U0ZGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5zbGljZShbMV0sIFsyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIHguc2xpY2UoWzEsIDBdLCBbMSwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBgdGYuVGVuc29yYCB0byBzbGljZSBmcm9tLlxuICogQHBhcmFtIGJlZ2luIFRoZSBjb29yZGluYXRlcyB0byBzdGFydCB0aGUgc2xpY2UgZnJvbS4gVGhlIGxlbmd0aCBjYW4gYmVcbiAqICAgICBsZXNzIHRoYW4gdGhlIHJhbmsgb2YgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAwIGFzXG4gKiAgICAgc3RhcnQuIENhbiBhbHNvIGJlIGEgc2luZ2xlIG51bWJlciwgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlXG4gKiAgICAgZmlyc3QgYXhpcy5cbiAqIEBwYXJhbSBzaXplIFRoZSBzaXplIG9mIHRoZSBzbGljZS4gVGhlIGxlbmd0aCBjYW4gYmUgbGVzcyB0aGFuIHRoZSByYW5rIG9mXG4gKiAgICAgeCAtIHRoZSByZXN0IG9mIHRoZSBheGVzIHdpbGwgaGF2ZSBpbXBsaWNpdCAtMS4gQSB2YWx1ZSBvZiAtMSByZXF1ZXN0c1xuICogICAgIHRoZSByZXN0IG9mIHRoZSBkaW1lbnNpb25zIGluIHRoZSBheGlzLiBDYW4gYWxzbyBiZSBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgaW4gd2hpY2ggY2FzZSBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGZpcnN0IGF4aXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNsaWNlXzxSIGV4dGVuZHMgUmFuaywgVCBleHRlbmRzIFRlbnNvcjxSPj4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBiZWdpbjogbnVtYmVyfG51bWJlcltdLCBzaXplPzogbnVtYmVyfG51bWJlcltdKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG5cbiAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NsaWNpbmcgc2NhbGFyIGlzIG5vdCBwb3NzaWJsZScpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBTbGljZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBTbGljZUF0dHJzID0ge2JlZ2luLCBzaXplfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFNsaWNlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBzbGljZSA9IG9wKHtzbGljZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Tanh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes hyperbolic tangent of the input `tf.Tensor` element-wise: `tanh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, 70]);\n *\n * x.tanh().print();  // or tf.tanh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction tanh_(x) {\n    const $x = convertToTensor(x, 'x', 'tanh', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Tanh, inputs);\n}\nexport const tanh = op({ tanh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3RhbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdEQsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7VGFuaCwgVGFuaElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBoeXBlcmJvbGljIHRhbmdlbnQgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYHRhbmgoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgLTEsIDcwXSk7XG4gKlxuICogeC50YW5oKCkucHJpbnQoKTsgIC8vIG9yIHRmLnRhbmgoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gdGFuaF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3RhbmgnLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGlucHV0czogVGFuaElucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGFuaCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCB0YW5oID0gb3Aoe3RhbmhffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { add } from './add';\nimport { concat } from './concat';\nimport { matMul } from './mat_mul';\nimport { mul } from './mul';\nimport { op } from './operation';\nimport { sigmoid } from './sigmoid';\nimport { slice } from './slice';\nimport { tanh } from './tanh';\n/**\n * Computes the next state and output of a BasicLSTMCell.\n *\n * Returns `[newC, newH]`.\n *\n * Derived from tf.contrib.rnn.BasicLSTMCell.\n *\n * @param forgetBias Forget bias for the cell.\n * @param lstmKernel The weights for the cell.\n * @param lstmBias The bias for the cell.\n * @param data The input to the cell.\n * @param c Previous cell state.\n * @param h Previous cell output.\n *\n * @doc {heading: 'Operations', subheading: 'RNN'}\n */\nfunction basicLSTMCell_(forgetBias, lstmKernel, lstmBias, data, c, h) {\n    const $forgetBias = convertToTensor(forgetBias, 'forgetBias', 'basicLSTMCell');\n    const $lstmKernel = convertToTensor(lstmKernel, 'lstmKernel', 'basicLSTMCell');\n    const $lstmBias = convertToTensor(lstmBias, 'lstmBias', 'basicLSTMCell');\n    const $data = convertToTensor(data, 'data', 'basicLSTMCell');\n    const $c = convertToTensor(c, 'c', 'basicLSTMCell');\n    const $h = convertToTensor(h, 'h', 'basicLSTMCell');\n    const combined = concat([$data, $h], 1);\n    const weighted = matMul(combined, $lstmKernel);\n    const res = add(weighted, $lstmBias);\n    // i = input_gate, j = new_input, f = forget_gate, o = output_gate\n    const batchSize = res.shape[0];\n    const sliceCols = res.shape[1] / 4;\n    const sliceSize = [batchSize, sliceCols];\n    const i = slice(res, [0, 0], sliceSize);\n    const j = slice(res, [0, sliceCols], sliceSize);\n    const f = slice(res, [0, sliceCols * 2], sliceSize);\n    const o = slice(res, [0, sliceCols * 3], sliceSize);\n    const newC = add(mul(sigmoid(i), tanh(j)), mul($c, sigmoid(add($forgetBias, f))));\n    const newH = mul(tanh(newC), sigmoid(o));\n    return [newC, newH];\n}\nexport const basicLSTMCell = op({ basicLSTMCell_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfbHN0bV9jZWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYmFzaWNfbHN0bV9jZWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUI7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxjQUFjLENBQ25CLFVBQTZCLEVBQUUsVUFBK0IsRUFDOUQsUUFBNkIsRUFBRSxJQUF5QixFQUN4RCxDQUFzQixFQUFFLENBQXNCO0lBQ2hELE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXBELE1BQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFhLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFL0Msa0VBQWtFO0lBQ2xFLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkMsTUFBTSxTQUFTLEdBQXFCLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNoRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNwRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVwRCxNQUFNLElBQUksR0FDTixHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDeEIsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBYSxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLElBQUksR0FBYSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25ELE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1NjYWxhciwgVGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHthZGR9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7Y29uY2F0fSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7bXVsfSBmcm9tICcuL211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3NpZ21vaWR9IGZyb20gJy4vc2lnbW9pZCc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuL3NsaWNlJztcbmltcG9ydCB7dGFuaH0gZnJvbSAnLi90YW5oJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbmV4dCBzdGF0ZSBhbmQgb3V0cHV0IG9mIGEgQmFzaWNMU1RNQ2VsbC5cbiAqXG4gKiBSZXR1cm5zIGBbbmV3QywgbmV3SF1gLlxuICpcbiAqIERlcml2ZWQgZnJvbSB0Zi5jb250cmliLnJubi5CYXNpY0xTVE1DZWxsLlxuICpcbiAqIEBwYXJhbSBmb3JnZXRCaWFzIEZvcmdldCBiaWFzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtS2VybmVsIFRoZSB3ZWlnaHRzIGZvciB0aGUgY2VsbC5cbiAqIEBwYXJhbSBsc3RtQmlhcyBUaGUgYmlhcyBmb3IgdGhlIGNlbGwuXG4gKiBAcGFyYW0gZGF0YSBUaGUgaW5wdXQgdG8gdGhlIGNlbGwuXG4gKiBAcGFyYW0gYyBQcmV2aW91cyBjZWxsIHN0YXRlLlxuICogQHBhcmFtIGggUHJldmlvdXMgY2VsbCBvdXRwdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUk5OJ31cbiAqL1xuZnVuY3Rpb24gYmFzaWNMU1RNQ2VsbF8oXG4gICAgZm9yZ2V0QmlhczogU2NhbGFyfFRlbnNvckxpa2UsIGxzdG1LZXJuZWw6IFRlbnNvcjJEfFRlbnNvckxpa2UsXG4gICAgbHN0bUJpYXM6IFRlbnNvcjFEfFRlbnNvckxpa2UsIGRhdGE6IFRlbnNvcjJEfFRlbnNvckxpa2UsXG4gICAgYzogVGVuc29yMkR8VGVuc29yTGlrZSwgaDogVGVuc29yMkR8VGVuc29yTGlrZSk6IFtUZW5zb3IyRCwgVGVuc29yMkRdIHtcbiAgY29uc3QgJGZvcmdldEJpYXMgPVxuICAgICAgY29udmVydFRvVGVuc29yKGZvcmdldEJpYXMsICdmb3JnZXRCaWFzJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgY29uc3QgJGxzdG1LZXJuZWwgPVxuICAgICAgY29udmVydFRvVGVuc29yKGxzdG1LZXJuZWwsICdsc3RtS2VybmVsJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgY29uc3QgJGxzdG1CaWFzID0gY29udmVydFRvVGVuc29yKGxzdG1CaWFzLCAnbHN0bUJpYXMnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdiYXNpY0xTVE1DZWxsJyk7XG4gIGNvbnN0ICRjID0gY29udmVydFRvVGVuc29yKGMsICdjJywgJ2Jhc2ljTFNUTUNlbGwnKTtcbiAgY29uc3QgJGggPSBjb252ZXJ0VG9UZW5zb3IoaCwgJ2gnLCAnYmFzaWNMU1RNQ2VsbCcpO1xuXG4gIGNvbnN0IGNvbWJpbmVkID0gY29uY2F0KFskZGF0YSwgJGhdLCAxKTtcbiAgY29uc3Qgd2VpZ2h0ZWQgPSBtYXRNdWwoY29tYmluZWQsICRsc3RtS2VybmVsKTtcbiAgY29uc3QgcmVzOiBUZW5zb3IyRCA9IGFkZCh3ZWlnaHRlZCwgJGxzdG1CaWFzKTtcblxuICAvLyBpID0gaW5wdXRfZ2F0ZSwgaiA9IG5ld19pbnB1dCwgZiA9IGZvcmdldF9nYXRlLCBvID0gb3V0cHV0X2dhdGVcbiAgY29uc3QgYmF0Y2hTaXplID0gcmVzLnNoYXBlWzBdO1xuICBjb25zdCBzbGljZUNvbHMgPSByZXMuc2hhcGVbMV0gLyA0O1xuICBjb25zdCBzbGljZVNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbYmF0Y2hTaXplLCBzbGljZUNvbHNdO1xuICBjb25zdCBpID0gc2xpY2UocmVzLCBbMCwgMF0sIHNsaWNlU2l6ZSk7XG4gIGNvbnN0IGogPSBzbGljZShyZXMsIFswLCBzbGljZUNvbHNdLCBzbGljZVNpemUpO1xuICBjb25zdCBmID0gc2xpY2UocmVzLCBbMCwgc2xpY2VDb2xzICogMl0sIHNsaWNlU2l6ZSk7XG4gIGNvbnN0IG8gPSBzbGljZShyZXMsIFswLCBzbGljZUNvbHMgKiAzXSwgc2xpY2VTaXplKTtcblxuICBjb25zdCBuZXdDOiBUZW5zb3IyRCA9XG4gICAgICBhZGQobXVsKHNpZ21vaWQoaSksIHRhbmgoaikpLFxuICAgICAgICAgIG11bCgkYywgc2lnbW9pZChhZGQoJGZvcmdldEJpYXMsIGYpKSBhcyBUZW5zb3IyRCkpO1xuICBjb25zdCBuZXdIOiBUZW5zb3IyRCA9IG11bCh0YW5oKG5ld0MpLCBzaWdtb2lkKG8pKTtcbiAgcmV0dXJuIFtuZXdDLCBuZXdIXTtcbn1cblxuZXhwb3J0IGNvbnN0IGJhc2ljTFNUTUNlbGwgPSBvcCh7YmFzaWNMU1RNQ2VsbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { BatchToSpaceND } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * This operation reshapes the \"batch\" dimension 0 into `M + 1` dimensions of\n * shape `blockShape + [batch]`, interleaves these blocks back into the grid\n * defined by the spatial dimensions `[1, ..., M]`, to obtain a result with\n * the same rank as the input. The spatial dimensions of this intermediate\n * result are then optionally cropped according to `crops` to produce the\n * output. This is the reverse of `tf.spaceToBatchND`. See below for a precise\n * description.\n *\n * ```js\n * const x = tf.tensor4d([1, 2, 3, 4], [4, 1, 1, 1]);\n * const blockShape = [2, 2];\n * const crops = [[0, 0], [0, 0]];\n *\n * x.batchToSpaceND(blockShape, crops).print();\n * ```\n *\n * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape +\n * remainingShape`, where spatialShape has `M` dimensions.\n * @param blockShape A 1-D array. Must have shape `[M]`, all values must\n * be >= 1.\n * @param crops A 2-D array.  Must have shape `[M, 2]`, all values must be >= 0.\n * `crops[i] = [cropStart, cropEnd]` specifies the amount to crop from input\n * dimension `i + 1`, which corresponds to spatial dimension `i`. It is required\n * that `cropStart[i] + cropEnd[i] <= blockShape[i] * inputShape[i + 1]`\n *\n * This operation is equivalent to the following steps:\n *\n * 1. Reshape `x` to `reshaped` of shape: `[blockShape[0], ...,\n * blockShape[M-1], batch / prod(blockShape), x.shape[1], ...,\n * x.shape[N-1]]`\n *\n * 2. Permute dimensions of `reshaped` to produce `permuted` of shape `[batch /\n * prod(blockShape),x.shape[1], blockShape[0], ..., x.shape[M],\n * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]`\n *\n * 3. Reshape `permuted` to produce `reshapedPermuted` of shape `[batch /\n * prod(blockShape),x.shape[1] * blockShape[0], ..., x.shape[M] *\n * blockShape[M-1],x.shape[M+1], ..., x.shape[N-1]]`\n *\n * 4. Crop the start and end of dimensions `[1, ..., M]` of `reshapedPermuted`\n * according to `crops` to produce the output of shape: `[batch /\n * prod(blockShape),x.shape[1] * blockShape[0] - crops[0,0] - crops[0,1],\n * ..., x.shape[M] * blockShape[M-1] - crops[M-1,0] -\n * crops[M-1,1],x.shape[M+1], ..., x.shape[N-1]]`\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction batchToSpaceND_(x, blockShape, crops) {\n    const $x = convertToTensor(x, 'x', 'batchToSpaceND');\n    const prod = blockShape.reduce((a, b) => a * b);\n    util.assert($x.rank >= 1 + blockShape.length, () => `input rank is ${$x.rank} but should be > than blockShape.length ${blockShape.length}`);\n    util.assert(crops.length === blockShape.length, () => `crops.length is ${crops.length} but should be equal to blockShape.length  ${blockShape.length}`);\n    util.assert($x.shape[0] % prod === 0, () => `input tensor batch is ${$x.shape[0]} but is not divisible by the product of ` +\n        `the elements of blockShape ${blockShape.join(' * ')} === ${prod}`);\n    const inputs = { x: $x };\n    const attrs = { blockShape, crops };\n    return ENGINE.runKernel(BatchToSpaceND, inputs, attrs);\n}\nexport const batchToSpaceND = op({ batchToSpaceND_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdG9fc3BhY2VfbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaF90b19zcGFjZV9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxjQUFjLEVBQTRDLE1BQU0saUJBQWlCLENBQUM7QUFJMUYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBQ0gsU0FBUyxlQUFlLENBQ3BCLENBQWUsRUFBRSxVQUFvQixFQUFFLEtBQWlCO0lBQzFELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDckQsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQ2hDLEdBQUcsRUFBRSxDQUFDLGlCQUFpQixFQUFFLENBQUMsSUFBSSwyQ0FDMUIsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFN0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQ2xDLEdBQUcsRUFBRSxDQUFDLG1CQUNGLEtBQUssQ0FBQyxNQUFNLDhDQUNaLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTdCLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxFQUN4QixHQUFHLEVBQUUsQ0FBQyx5QkFDSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQywwQ0FBMEM7UUFDM0QsOEJBQThCLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUU1RSxNQUFNLE1BQU0sR0FBeUIsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQXdCLEVBQUMsVUFBVSxFQUFFLEtBQUssRUFBQyxDQUFDO0lBRXZELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsY0FBYyxFQUFFLE1BQThCLEVBQzlDLEtBQTJCLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtCYXRjaFRvU3BhY2VORCwgQmF0Y2hUb1NwYWNlTkRBdHRycywgQmF0Y2hUb1NwYWNlTkRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogVGhpcyBvcGVyYXRpb24gcmVzaGFwZXMgdGhlIFwiYmF0Y2hcIiBkaW1lbnNpb24gMCBpbnRvIGBNICsgMWAgZGltZW5zaW9ucyBvZlxuICogc2hhcGUgYGJsb2NrU2hhcGUgKyBbYmF0Y2hdYCwgaW50ZXJsZWF2ZXMgdGhlc2UgYmxvY2tzIGJhY2sgaW50byB0aGUgZ3JpZFxuICogZGVmaW5lZCBieSB0aGUgc3BhdGlhbCBkaW1lbnNpb25zIGBbMSwgLi4uLCBNXWAsIHRvIG9idGFpbiBhIHJlc3VsdCB3aXRoXG4gKiB0aGUgc2FtZSByYW5rIGFzIHRoZSBpbnB1dC4gVGhlIHNwYXRpYWwgZGltZW5zaW9ucyBvZiB0aGlzIGludGVybWVkaWF0ZVxuICogcmVzdWx0IGFyZSB0aGVuIG9wdGlvbmFsbHkgY3JvcHBlZCBhY2NvcmRpbmcgdG8gYGNyb3BzYCB0byBwcm9kdWNlIHRoZVxuICogb3V0cHV0LiBUaGlzIGlzIHRoZSByZXZlcnNlIG9mIGB0Zi5zcGFjZVRvQmF0Y2hORGAuIFNlZSBiZWxvdyBmb3IgYSBwcmVjaXNlXG4gKiBkZXNjcmlwdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjRkKFsxLCAyLCAzLCA0XSwgWzQsIDEsIDEsIDFdKTtcbiAqIGNvbnN0IGJsb2NrU2hhcGUgPSBbMiwgMl07XG4gKiBjb25zdCBjcm9wcyA9IFtbMCwgMF0sIFswLCAwXV07XG4gKlxuICogeC5iYXRjaFRvU3BhY2VORChibG9ja1NoYXBlLCBjcm9wcykucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgYHRmLlRlbnNvcmAuIE4tRCB3aXRoIGB4LnNoYXBlYCA9IGBbYmF0Y2hdICsgc3BhdGlhbFNoYXBlICtcbiAqIHJlbWFpbmluZ1NoYXBlYCwgd2hlcmUgc3BhdGlhbFNoYXBlIGhhcyBgTWAgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBibG9ja1NoYXBlIEEgMS1EIGFycmF5LiBNdXN0IGhhdmUgc2hhcGUgYFtNXWAsIGFsbCB2YWx1ZXMgbXVzdFxuICogYmUgPj0gMS5cbiAqIEBwYXJhbSBjcm9wcyBBIDItRCBhcnJheS4gIE11c3QgaGF2ZSBzaGFwZSBgW00sIDJdYCwgYWxsIHZhbHVlcyBtdXN0IGJlID49IDAuXG4gKiBgY3JvcHNbaV0gPSBbY3JvcFN0YXJ0LCBjcm9wRW5kXWAgc3BlY2lmaWVzIHRoZSBhbW91bnQgdG8gY3JvcCBmcm9tIGlucHV0XG4gKiBkaW1lbnNpb24gYGkgKyAxYCwgd2hpY2ggY29ycmVzcG9uZHMgdG8gc3BhdGlhbCBkaW1lbnNpb24gYGlgLiBJdCBpcyByZXF1aXJlZFxuICogdGhhdCBgY3JvcFN0YXJ0W2ldICsgY3JvcEVuZFtpXSA8PSBibG9ja1NoYXBlW2ldICogaW5wdXRTaGFwZVtpICsgMV1gXG4gKlxuICogVGhpcyBvcGVyYXRpb24gaXMgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIHN0ZXBzOlxuICpcbiAqIDEuIFJlc2hhcGUgYHhgIHRvIGByZXNoYXBlZGAgb2Ygc2hhcGU6IGBbYmxvY2tTaGFwZVswXSwgLi4uLFxuICogYmxvY2tTaGFwZVtNLTFdLCBiYXRjaCAvIHByb2QoYmxvY2tTaGFwZSksIHguc2hhcGVbMV0sIC4uLixcbiAqIHguc2hhcGVbTi0xXV1gXG4gKlxuICogMi4gUGVybXV0ZSBkaW1lbnNpb25zIG9mIGByZXNoYXBlZGAgdG8gcHJvZHVjZSBgcGVybXV0ZWRgIG9mIHNoYXBlIGBbYmF0Y2ggL1xuICogcHJvZChibG9ja1NoYXBlKSx4LnNoYXBlWzFdLCBibG9ja1NoYXBlWzBdLCAuLi4sIHguc2hhcGVbTV0sXG4gKiBibG9ja1NoYXBlW00tMV0seC5zaGFwZVtNKzFdLCAuLi4sIHguc2hhcGVbTi0xXV1gXG4gKlxuICogMy4gUmVzaGFwZSBgcGVybXV0ZWRgIHRvIHByb2R1Y2UgYHJlc2hhcGVkUGVybXV0ZWRgIG9mIHNoYXBlIGBbYmF0Y2ggL1xuICogcHJvZChibG9ja1NoYXBlKSx4LnNoYXBlWzFdICogYmxvY2tTaGFwZVswXSwgLi4uLCB4LnNoYXBlW01dICpcbiAqIGJsb2NrU2hhcGVbTS0xXSx4LnNoYXBlW00rMV0sIC4uLiwgeC5zaGFwZVtOLTFdXWBcbiAqXG4gKiA0LiBDcm9wIHRoZSBzdGFydCBhbmQgZW5kIG9mIGRpbWVuc2lvbnMgYFsxLCAuLi4sIE1dYCBvZiBgcmVzaGFwZWRQZXJtdXRlZGBcbiAqIGFjY29yZGluZyB0byBgY3JvcHNgIHRvIHByb2R1Y2UgdGhlIG91dHB1dCBvZiBzaGFwZTogYFtiYXRjaCAvXG4gKiBwcm9kKGJsb2NrU2hhcGUpLHguc2hhcGVbMV0gKiBibG9ja1NoYXBlWzBdIC0gY3JvcHNbMCwwXSAtIGNyb3BzWzAsMV0sXG4gKiAuLi4sIHguc2hhcGVbTV0gKiBibG9ja1NoYXBlW00tMV0gLSBjcm9wc1tNLTEsMF0gLVxuICogY3JvcHNbTS0xLDFdLHguc2hhcGVbTSsxXSwgLi4uLCB4LnNoYXBlW04tMV1dYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJhdGNoVG9TcGFjZU5EXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGJsb2NrU2hhcGU6IG51bWJlcltdLCBjcm9wczogbnVtYmVyW11bXSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaFRvU3BhY2VORCcpO1xuICBjb25zdCBwcm9kID0gYmxvY2tTaGFwZS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPj0gMSArIGJsb2NrU2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gYGlucHV0IHJhbmsgaXMgJHskeC5yYW5rfSBidXQgc2hvdWxkIGJlID4gdGhhbiBibG9ja1NoYXBlLmxlbmd0aCAke1xuICAgICAgICAgIGJsb2NrU2hhcGUubGVuZ3RofWApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgY3JvcHMubGVuZ3RoID09PSBibG9ja1NoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+IGBjcm9wcy5sZW5ndGggaXMgJHtcbiAgICAgICAgICBjcm9wcy5sZW5ndGh9IGJ1dCBzaG91bGQgYmUgZXF1YWwgdG8gYmxvY2tTaGFwZS5sZW5ndGggICR7XG4gICAgICAgICAgYmxvY2tTaGFwZS5sZW5ndGh9YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5zaGFwZVswXSAlIHByb2QgPT09IDAsXG4gICAgICAoKSA9PiBgaW5wdXQgdGVuc29yIGJhdGNoIGlzICR7XG4gICAgICAgICAgICAgICAgJHguc2hhcGVbMF19IGJ1dCBpcyBub3QgZGl2aXNpYmxlIGJ5IHRoZSBwcm9kdWN0IG9mIGAgK1xuICAgICAgICAgIGB0aGUgZWxlbWVudHMgb2YgYmxvY2tTaGFwZSAke2Jsb2NrU2hhcGUuam9pbignICogJyl9ID09PSAke3Byb2R9YCk7XG5cbiAgY29uc3QgaW5wdXRzOiBCYXRjaFRvU3BhY2VORElucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBCYXRjaFRvU3BhY2VOREF0dHJzID0ge2Jsb2NrU2hhcGUsIGNyb3BzfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIEJhdGNoVG9TcGFjZU5ELCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkQgPSBvcCh7YmF0Y2hUb1NwYWNlTkRffSk7XG4iXX0=","import { reshape } from './reshape';\nexport function xAs4D(x) {\n    let x4D;\n    if (x.rank === 0 || x.rank === 1) {\n        x4D = reshape(x, [1, 1, 1, x.size]);\n    }\n    else if (x.rank === 2) {\n        x4D = reshape(x, [1, 1, x.shape[0], x.shape[1]]);\n    }\n    else if (x.rank === 3) {\n        x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n    }\n    else {\n        x4D = x;\n    }\n    return x4D;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm1fdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsS0FBSyxDQUFpQixDQUFZO0lBQ2hELElBQUksR0FBYSxDQUFDO0lBQ2xCLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDaEMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUNyQztTQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDdkIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7U0FBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMzRDtTQUFNO1FBQ0wsR0FBRyxHQUFHLENBQWEsQ0FBQztLQUNyQjtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yLCBUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24geEFzNEQ8UiBleHRlbmRzIFJhbms+KHg6IFRlbnNvcjxSPikge1xuICBsZXQgeDREOiBUZW5zb3I0RDtcbiAgaWYgKHgucmFuayA9PT0gMCB8fCB4LnJhbmsgPT09IDEpIHtcbiAgICB4NEQgPSByZXNoYXBlKHgsIFsxLCAxLCAxLCB4LnNpemVdKTtcbiAgfSBlbHNlIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICB4NEQgPSByZXNoYXBlKHgsIFsxLCAxLCB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdXSk7XG4gIH0gZWxzZSBpZiAoeC5yYW5rID09PSAzKSB7XG4gICAgeDREID0gcmVzaGFwZSh4LCBbMSwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXV0pO1xuICB9IGVsc2Uge1xuICAgIHg0RCA9IHggYXMgVGVuc29yNEQ7XG4gIH1cblxuICByZXR1cm4geDREO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { FusedBatchNorm } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { xAs4D } from './batchnorm_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Batch normalization.\n *\n * As described in\n * [http://arxiv.org/abs/1502.03167](http://arxiv.org/abs/1502.03167).\n *\n * Mean, variance, scale, and offset can be of two shapes:\n *   - The same shape as the input.\n *   - In the common case, the depth dimension is the last dimension of x, so\n *     the values would be a `tf.Tensor1D` of shape [depth].\n *\n * Also available are stricter rank-specific methods with the same signature\n * as this method that assert that parameters passed are of given rank\n *   - `tf.batchNorm2d`\n *   - `tf.batchNorm3d`\n *   - `tf.batchNorm4d`\n *\n * @param x The input Tensor.\n * @param mean A mean Tensor.\n * @param variance A variance Tensor.\n * @param offset An offset Tensor.\n * @param scale A scale Tensor.\n * @param varianceEpsilon A small float number to avoid dividing by 0.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction batchNorm_(x, mean, variance, offset, scale, varianceEpsilon) {\n    if (varianceEpsilon == null) {\n        varianceEpsilon = 0.001;\n    }\n    const $x = convertToTensor(x, 'x', 'batchNorm');\n    const $mean = convertToTensor(mean, 'mean', 'batchNorm');\n    const $variance = convertToTensor(variance, 'variance', 'batchNorm');\n    let $scale;\n    if (scale != null) {\n        $scale = convertToTensor(scale, 'scale', 'batchNorm');\n    }\n    let $offset;\n    if (offset != null) {\n        $offset = convertToTensor(offset, 'offset', 'batchNorm');\n    }\n    util.assert($mean.rank === $variance.rank, () => 'Batch normalization gradient requires mean and variance to have ' +\n        'equal ranks.');\n    util.assert($offset == null || $mean.rank === $offset.rank, () => 'Batch normalization gradient requires mean and offset to have ' +\n        'equal ranks.');\n    util.assert($scale == null || $mean.rank === $scale.rank, () => 'Batch normalization gradient requires mean and scale to have ' +\n        'equal ranks.');\n    const x4D = xAs4D($x);\n    const inputs = {\n        x: x4D,\n        scale: $scale,\n        offset: $offset,\n        mean: $mean,\n        variance: $variance\n    };\n    const attrs = { varianceEpsilon };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(FusedBatchNorm, inputs, attrs);\n    return reshape(res, $x.shape);\n}\nexport const batchNorm = op({ batchNorm_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYmF0Y2hub3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLGNBQWMsRUFBNEMsTUFBTSxpQkFBaUIsQ0FBQztBQUkxRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILFNBQVMsVUFBVSxDQUNmLENBQXVCLEVBQUUsSUFBbUMsRUFDNUQsUUFBdUMsRUFDdkMsTUFBc0MsRUFDdEMsS0FBcUMsRUFDckMsZUFBd0I7SUFDMUIsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFO1FBQzNCLGVBQWUsR0FBRyxLQUFLLENBQUM7S0FDekI7SUFDRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRSxJQUFJLE1BQTBCLENBQUM7SUFDL0IsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksT0FBMkIsQ0FBQztJQUNoQyxJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQzdCLEdBQUcsRUFBRSxDQUFDLGtFQUFrRTtRQUNwRSxjQUFjLENBQUMsQ0FBQztJQUN4QixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsSUFBSSxFQUM5QyxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsY0FBYyxDQUFDLENBQUM7SUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLElBQUksRUFDNUMsR0FBRyxFQUFFLENBQUMsK0RBQStEO1FBQ2pFLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLE1BQU0sR0FBRyxHQUFhLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVoQyxNQUFNLE1BQU0sR0FBeUI7UUFDbkMsQ0FBQyxFQUFFLEdBQUc7UUFDTixLQUFLLEVBQUUsTUFBTTtRQUNiLE1BQU0sRUFBRSxPQUFPO1FBQ2YsSUFBSSxFQUFFLEtBQUs7UUFDWCxRQUFRLEVBQUUsU0FBUztLQUNwQixDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQXdCLEVBQUMsZUFBZSxFQUFDLENBQUM7SUFFckQsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osY0FBYyxFQUFFLE1BQThCLEVBQzlDLEtBQTJCLENBQWMsQ0FBQztJQUUxRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0Z1c2VkQmF0Y2hOb3JtLCBGdXNlZEJhdGNoTm9ybUF0dHJzLCBGdXNlZEJhdGNoTm9ybUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFELCBUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHt4QXM0RH0gZnJvbSAnLi9iYXRjaG5vcm1fdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbi5cbiAqXG4gKiBBcyBkZXNjcmliZWQgaW5cbiAqIFtodHRwOi8vYXJ4aXYub3JnL2Ficy8xNTAyLjAzMTY3XShodHRwOi8vYXJ4aXYub3JnL2Ficy8xNTAyLjAzMTY3KS5cbiAqXG4gKiBNZWFuLCB2YXJpYW5jZSwgc2NhbGUsIGFuZCBvZmZzZXQgY2FuIGJlIG9mIHR3byBzaGFwZXM6XG4gKiAgIC0gVGhlIHNhbWUgc2hhcGUgYXMgdGhlIGlucHV0LlxuICogICAtIEluIHRoZSBjb21tb24gY2FzZSwgdGhlIGRlcHRoIGRpbWVuc2lvbiBpcyB0aGUgbGFzdCBkaW1lbnNpb24gb2YgeCwgc29cbiAqICAgICB0aGUgdmFsdWVzIHdvdWxkIGJlIGEgYHRmLlRlbnNvcjFEYCBvZiBzaGFwZSBbZGVwdGhdLlxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVcbiAqIGFzIHRoaXMgbWV0aG9kIHRoYXQgYXNzZXJ0IHRoYXQgcGFyYW1ldGVycyBwYXNzZWQgYXJlIG9mIGdpdmVuIHJhbmtcbiAqICAgLSBgdGYuYmF0Y2hOb3JtMmRgXG4gKiAgIC0gYHRmLmJhdGNoTm9ybTNkYFxuICogICAtIGB0Zi5iYXRjaE5vcm00ZGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICogQHBhcmFtIG1lYW4gQSBtZWFuIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZSBBIHZhcmlhbmNlIFRlbnNvci5cbiAqIEBwYXJhbSBvZmZzZXQgQW4gb2Zmc2V0IFRlbnNvci5cbiAqIEBwYXJhbSBzY2FsZSBBIHNjYWxlIFRlbnNvci5cbiAqIEBwYXJhbSB2YXJpYW5jZUVwc2lsb24gQSBzbWFsbCBmbG9hdCBudW1iZXIgdG8gYXZvaWQgZGl2aWRpbmcgYnkgMC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gYmF0Y2hOb3JtXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgeDogVGVuc29yPFI+fFRlbnNvckxpa2UsIG1lYW46IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHZhcmlhbmNlOiBUZW5zb3I8Uj58VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3I8Uj58VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBzY2FsZT86IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHZhcmlhbmNlRXBzaWxvbj86IG51bWJlcik6IFRlbnNvcjxSPiB7XG4gIGlmICh2YXJpYW5jZUVwc2lsb24gPT0gbnVsbCkge1xuICAgIHZhcmlhbmNlRXBzaWxvbiA9IDAuMDAxO1xuICB9XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2JhdGNoTm9ybScpO1xuICBjb25zdCAkbWVhbiA9IGNvbnZlcnRUb1RlbnNvcihtZWFuLCAnbWVhbicsICdiYXRjaE5vcm0nKTtcbiAgY29uc3QgJHZhcmlhbmNlID0gY29udmVydFRvVGVuc29yKHZhcmlhbmNlLCAndmFyaWFuY2UnLCAnYmF0Y2hOb3JtJyk7XG4gIGxldCAkc2NhbGU6IFRlbnNvcjxSPnxUZW5zb3IxRDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgfVxuICBsZXQgJG9mZnNldDogVGVuc29yPFI+fFRlbnNvcjFEO1xuICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICAkb2Zmc2V0ID0gY29udmVydFRvVGVuc29yKG9mZnNldCwgJ29mZnNldCcsICdiYXRjaE5vcm0nKTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJG1lYW4ucmFuayA9PT0gJHZhcmlhbmNlLnJhbmssXG4gICAgICAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlICcgK1xuICAgICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkb2Zmc2V0ID09IG51bGwgfHwgJG1lYW4ucmFuayA9PT0gJG9mZnNldC5yYW5rLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgb2Zmc2V0IHRvIGhhdmUgJyArXG4gICAgICAgICAgJ2VxdWFsIHJhbmtzLicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRzY2FsZSA9PSBudWxsIHx8ICRtZWFuLnJhbmsgPT09ICRzY2FsZS5yYW5rLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgc2NhbGUgdG8gaGF2ZSAnICtcbiAgICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG5cbiAgY29uc3QgeDREOiBUZW5zb3I0RCA9IHhBczREKCR4KTtcblxuICBjb25zdCBpbnB1dHM6IEZ1c2VkQmF0Y2hOb3JtSW5wdXRzID0ge1xuICAgIHg6IHg0RCxcbiAgICBzY2FsZTogJHNjYWxlLFxuICAgIG9mZnNldDogJG9mZnNldCxcbiAgICBtZWFuOiAkbWVhbixcbiAgICB2YXJpYW5jZTogJHZhcmlhbmNlXG4gIH07XG5cbiAgY29uc3QgYXR0cnM6IEZ1c2VkQmF0Y2hOb3JtQXR0cnMgPSB7dmFyaWFuY2VFcHNpbG9ufTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBGdXNlZEJhdGNoTm9ybSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUZW5zb3I8Uj47XG5cbiAgcmV0dXJuIHJlc2hhcGUocmVzLCAkeC5zaGFwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm0gPSBvcCh7YmF0Y2hOb3JtX30pO1xuIl19","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { batchNorm } from './batchnorm';\nimport { op } from './operation';\n/**\n * Batch normalization, strictly for 2D. For the more relaxed version, see\n * `tf.batchNorm`.\n *\n * @param x The input Tensor.\n * @param mean A mean Tensor.\n * @param variance A variance Tensor.\n * @param offset An offset Tensor.\n * @param scale A scale Tensor.\n * @param varianceEpsilon A small float number to avoid dividing by 0.\n */\nfunction batchNorm2d_(x, mean, variance, offset, scale, varianceEpsilon) {\n    const $x = convertToTensor(x, 'x', 'batchNorm');\n    const $mean = convertToTensor(mean, 'mean', 'batchNorm');\n    const $variance = convertToTensor(variance, 'variance', 'batchNorm');\n    let $scale;\n    if (scale != null) {\n        $scale = convertToTensor(scale, 'scale', 'batchNorm');\n    }\n    let $offset;\n    if (offset != null) {\n        $offset = convertToTensor(offset, 'offset', 'batchNorm');\n    }\n    util.assert($x.rank === 2, () => `Error in batchNorm2D: x must be rank 2 but got rank ` +\n        `${$x.rank}.`);\n    util.assert($mean.rank === 2 || $mean.rank === 1, () => `Error in batchNorm2D: mean must be rank 2 or rank 1 but ` +\n        `got rank ${$mean.rank}.`);\n    util.assert($variance.rank === 2 || $variance.rank === 1, () => `Error in batchNorm2D: variance must be rank 2 or rank 1 ` +\n        `but got rank ${$variance.rank}.`);\n    if ($scale != null) {\n        util.assert($scale.rank === 2 || $scale.rank === 1, () => `Error in batchNorm2D: scale must be rank 2 or rank 1 ` +\n            `but got rank ${$scale.rank}.`);\n    }\n    if ($offset != null) {\n        util.assert($offset.rank === 2 || $offset.rank === 1, () => `Error in batchNorm2D: offset must be rank 2 or rank 1 ` +\n            `but got rank ${$offset.rank}.`);\n    }\n    return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n}\nexport const batchNorm2d = op({ batchNorm2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtMmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm0yZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxZQUFZLENBQ2pCLENBQXNCLEVBQUUsSUFBa0MsRUFDMUQsUUFBc0MsRUFDdEMsTUFBcUMsRUFBRSxLQUFvQyxFQUMzRSxlQUF3QjtJQUMxQixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRSxJQUFJLE1BQXlCLENBQUM7SUFDOUIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksT0FBMEIsQ0FBQztJQUMvQixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7UUFDeEQsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsWUFBWSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM1QyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUN0QyxHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7WUFDekQsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ3hDLEdBQUcsRUFBRSxDQUFDLHdEQUF3RDtZQUMxRCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDMUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YmF0Y2hOb3JtfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDJELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm0yZF8oXG4gICAgeDogVGVuc29yMkR8VGVuc29yTGlrZSwgbWVhbjogVGVuc29yMkR8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICB2YXJpYW5jZTogVGVuc29yMkR8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3IyRHxUZW5zb3IxRHxUZW5zb3JMaWtlLCBzY2FsZT86IFRlbnNvcjJEfFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgdmFyaWFuY2VFcHNpbG9uPzogbnVtYmVyKTogVGVuc29yMkQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICBsZXQgJHNjYWxlOiBUZW5zb3IyRHxUZW5zb3IxRDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgfVxuICBsZXQgJG9mZnNldDogVGVuc29yMkR8VGVuc29yMUQ7XG4gIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMixcbiAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogeCBtdXN0IGJlIHJhbmsgMiBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJG1lYW4ucmFuayA9PT0gMiB8fCAkbWVhbi5yYW5rID09PSAxLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTJEOiBtZWFuIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHZhcmlhbmNlLnJhbmsgPT09IDIgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtMkQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgJHNjYWxlLnJhbmsgPT09IDIgfHwgJHNjYWxlLnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogc2NhbGUgbXVzdCBiZSByYW5rIDIgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgfVxuICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICRvZmZzZXQucmFuayA9PT0gMiB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0yRDogb2Zmc2V0IG11c3QgYmUgcmFuayAyIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICB9XG5cbiAgcmV0dXJuIGJhdGNoTm9ybSgkeCwgJG1lYW4sICR2YXJpYW5jZSwgJG9mZnNldCwgJHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xufVxuXG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtMmQgPSBvcCh7YmF0Y2hOb3JtMmRffSk7XG4iXX0=","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { batchNorm } from './batchnorm';\nimport { op } from './operation';\n/**\n * Batch normalization, strictly for 3D. For the more relaxed version, see\n * `tf.batchNorm`.\n *\n * @param x The input Tensor.\n * @param mean A mean Tensor.\n * @param variance A variance Tensor.\n * @param offset An offset Tensor.\n * @param scale A scale Tensor.\n * @param varianceEpsilon A small float number to avoid dividing by 0.\n */\nfunction batchNorm3d_(x, mean, variance, offset, scale, varianceEpsilon) {\n    const $x = convertToTensor(x, 'x', 'batchNorm');\n    const $mean = convertToTensor(mean, 'mean', 'batchNorm');\n    const $variance = convertToTensor(variance, 'variance', 'batchNorm');\n    let $scale;\n    if (scale != null) {\n        $scale = convertToTensor(scale, 'scale', 'batchNorm');\n    }\n    let $offset;\n    if (offset != null) {\n        $offset = convertToTensor(offset, 'offset', 'batchNorm');\n    }\n    util.assert($x.rank === 3, () => `Error in batchNorm3D: x must be rank 3 but got rank ` +\n        `${$x.rank}.`);\n    util.assert($mean.rank === 3 || $mean.rank === 1, () => `Error in batchNorm3D: mean must be rank 3 or rank 1 but ` +\n        `got rank ${$mean.rank}.`);\n    util.assert($variance.rank === 3 || $variance.rank === 1, () => `Error in batchNorm3D: variance must be rank 3 or rank 1 ` +\n        `but got rank ${$variance.rank}.`);\n    if ($scale != null) {\n        util.assert($scale.rank === 3 || $scale.rank === 1, () => `Error in batchNorm3D: scale must be rank 3 or rank 1 ` +\n            `but got rank ${$scale.rank}.`);\n    }\n    if ($offset != null) {\n        util.assert($offset.rank === 3 || $offset.rank === 1, () => `Error in batchNorm3D: offset must be rank 3 or rank 1 ` +\n            `but got rank ${$offset.rank}.`);\n    }\n    return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n}\nexport const batchNorm3d = op({ batchNorm3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm0zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxZQUFZLENBQ2pCLENBQXNCLEVBQUUsSUFBa0MsRUFDMUQsUUFBc0MsRUFDdEMsTUFBcUMsRUFBRSxLQUFvQyxFQUMzRSxlQUF3QjtJQUMxQixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRSxJQUFJLE1BQXlCLENBQUM7SUFDOUIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksT0FBMEIsQ0FBQztJQUMvQixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7UUFDeEQsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsWUFBWSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM1QyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUN0QyxHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7WUFDekQsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ3hDLEdBQUcsRUFBRSxDQUFDLHdEQUF3RDtZQUMxRCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDMUM7SUFFRCxPQUFPLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjNEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YmF0Y2hOb3JtfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDNELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm0zZF8oXG4gICAgeDogVGVuc29yM0R8VGVuc29yTGlrZSwgbWVhbjogVGVuc29yM0R8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICB2YXJpYW5jZTogVGVuc29yM0R8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3IzRHxUZW5zb3IxRHxUZW5zb3JMaWtlLCBzY2FsZT86IFRlbnNvcjNEfFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgdmFyaWFuY2VFcHNpbG9uPzogbnVtYmVyKTogVGVuc29yM0Qge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICBsZXQgJHNjYWxlOiBUZW5zb3IzRHxUZW5zb3IxRDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgfVxuICBsZXQgJG9mZnNldDogVGVuc29yM0R8VGVuc29yMUQ7XG4gIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMyxcbiAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogeCBtdXN0IGJlIHJhbmsgMyBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJG1lYW4ucmFuayA9PT0gMyB8fCAkbWVhbi5yYW5rID09PSAxLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTNEOiBtZWFuIG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHZhcmlhbmNlLnJhbmsgPT09IDMgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtM0Q6IHZhcmlhbmNlIG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgJHNjYWxlLnJhbmsgPT09IDMgfHwgJHNjYWxlLnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogc2NhbGUgbXVzdCBiZSByYW5rIDMgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgfVxuICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICRvZmZzZXQucmFuayA9PT0gMyB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm0zRDogb2Zmc2V0IG11c3QgYmUgcmFuayAzIG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICB9XG5cbiAgcmV0dXJuIGJhdGNoTm9ybSgkeCwgJG1lYW4sICR2YXJpYW5jZSwgJG9mZnNldCwgJHNjYWxlLCB2YXJpYW5jZUVwc2lsb24pO1xufVxuXG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtM2QgPSBvcCh7YmF0Y2hOb3JtM2RffSk7XG4iXX0=","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { batchNorm } from './batchnorm';\nimport { op } from './operation';\n/**\n * Batch normalization, strictly for 4D. For the more relaxed version, see\n * `tf.batchNorm`.\n *\n * @param x The input Tensor.\n * @param mean A mean Tensor.\n * @param variance A variance Tensor.\n * @param offset An offset Tensor.\n * @param scale A scale Tensor.\n * @param varianceEpsilon A small float number to avoid dividing by 0.\n */\nfunction batchNorm4d_(x, mean, variance, offset, scale, varianceEpsilon) {\n    const $x = convertToTensor(x, 'x', 'batchNorm');\n    const $mean = convertToTensor(mean, 'mean', 'batchNorm');\n    const $variance = convertToTensor(variance, 'variance', 'batchNorm');\n    let $scale;\n    if (scale != null) {\n        $scale = convertToTensor(scale, 'scale', 'batchNorm');\n    }\n    let $offset;\n    if (offset != null) {\n        $offset = convertToTensor(offset, 'offset', 'batchNorm');\n    }\n    util.assert($x.rank === 4, () => `Error in batchNorm4D: x must be rank 4 but got rank ` +\n        `${$x.rank}.`);\n    util.assert($mean.rank === 4 || $mean.rank === 1, () => `Error in batchNorm4D: mean must be rank 4 or rank 1 but ` +\n        `got rank ${$mean.rank}.`);\n    util.assert($variance.rank === 4 || $variance.rank === 1, () => `Error in batchNorm4D: variance must be rank 4 or rank 1 ` +\n        `but got rank ${$variance.rank}.`);\n    if ($scale != null) {\n        util.assert($scale.rank === 4 || $scale.rank === 1, () => `Error in batchNorm4D: scale must be rank 4 or rank 1 ` +\n            `but got rank ${$scale.rank}.`);\n    }\n    if ($offset != null) {\n        util.assert($offset.rank === 4 || $offset.rank === 1, () => `Error in batchNorm4D: offset must be rank 4 or rank 1 ` +\n            `but got rank ${$offset.rank}.`);\n    }\n    return batchNorm($x, $mean, $variance, $offset, $scale, varianceEpsilon);\n}\nexport const batchNorm4d = op({ batchNorm4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtNGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iYXRjaG5vcm00ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxZQUFZLENBQ2pCLENBQXNCLEVBQUUsSUFBa0MsRUFDMUQsUUFBc0MsRUFDdEMsTUFBcUMsRUFBRSxLQUFvQyxFQUMzRSxlQUF3QjtJQUMxQixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN6RCxNQUFNLFNBQVMsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNyRSxJQUFJLE1BQXlCLENBQUM7SUFDOUIsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztLQUN2RDtJQUNELElBQUksT0FBMEIsQ0FBQztJQUMvQixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUU7UUFDbEIsT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzFEO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7UUFDeEQsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNwQyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsWUFBWSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNuQyxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM1QyxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsZ0JBQWdCLFNBQVMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUN0QyxHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7WUFDekQsZ0JBQWdCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBQ0QsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ3hDLEdBQUcsRUFBRSxDQUFDLHdEQUF3RDtZQUMxRCxnQkFBZ0IsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDMUM7SUFDRCxPQUFPLFNBQVMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLGVBQWUsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YmF0Y2hOb3JtfSBmcm9tICcuL2JhdGNobm9ybSc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiwgc3RyaWN0bHkgZm9yIDRELiBGb3IgdGhlIG1vcmUgcmVsYXhlZCB2ZXJzaW9uLCBzZWVcbiAqIGB0Zi5iYXRjaE5vcm1gLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBBIG1lYW4gVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlIEEgdmFyaWFuY2UgVGVuc29yLlxuICogQHBhcmFtIG9mZnNldCBBbiBvZmZzZXQgVGVuc29yLlxuICogQHBhcmFtIHNjYWxlIEEgc2NhbGUgVGVuc29yLlxuICogQHBhcmFtIHZhcmlhbmNlRXBzaWxvbiBBIHNtYWxsIGZsb2F0IG51bWJlciB0byBhdm9pZCBkaXZpZGluZyBieSAwLlxuICovXG5mdW5jdGlvbiBiYXRjaE5vcm00ZF8oXG4gICAgeDogVGVuc29yNER8VGVuc29yTGlrZSwgbWVhbjogVGVuc29yNER8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICB2YXJpYW5jZTogVGVuc29yNER8VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3I0RHxUZW5zb3IxRHxUZW5zb3JMaWtlLCBzY2FsZT86IFRlbnNvcjREfFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgdmFyaWFuY2VFcHNpbG9uPzogbnVtYmVyKTogVGVuc29yNEQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdiYXRjaE5vcm0nKTtcbiAgY29uc3QgJG1lYW4gPSBjb252ZXJ0VG9UZW5zb3IobWVhbiwgJ21lYW4nLCAnYmF0Y2hOb3JtJyk7XG4gIGNvbnN0ICR2YXJpYW5jZSA9IGNvbnZlcnRUb1RlbnNvcih2YXJpYW5jZSwgJ3ZhcmlhbmNlJywgJ2JhdGNoTm9ybScpO1xuICBsZXQgJHNjYWxlOiBUZW5zb3I0RHxUZW5zb3IxRDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICAkc2NhbGUgPSBjb252ZXJ0VG9UZW5zb3Ioc2NhbGUsICdzY2FsZScsICdiYXRjaE5vcm0nKTtcbiAgfVxuICBsZXQgJG9mZnNldDogVGVuc29yNER8VGVuc29yMUQ7XG4gIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgICRvZmZzZXQgPSBjb252ZXJ0VG9UZW5zb3Iob2Zmc2V0LCAnb2Zmc2V0JywgJ2JhdGNoTm9ybScpO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogeCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJG1lYW4ucmFuayA9PT0gNCB8fCAkbWVhbi5yYW5rID09PSAxLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJhdGNoTm9ybTREOiBtZWFuIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBidXQgYCArXG4gICAgICAgICAgYGdvdCByYW5rICR7JG1lYW4ucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHZhcmlhbmNlLnJhbmsgPT09IDQgfHwgJHZhcmlhbmNlLnJhbmsgPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYmF0Y2hOb3JtNEQ6IHZhcmlhbmNlIG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBgICtcbiAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JHZhcmlhbmNlLnJhbmt9LmApO1xuICBpZiAoJHNjYWxlICE9IG51bGwpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgJHNjYWxlLnJhbmsgPT09IDQgfHwgJHNjYWxlLnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogc2NhbGUgbXVzdCBiZSByYW5rIDQgb3IgcmFuayAxIGAgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRzY2FsZS5yYW5rfS5gKTtcbiAgfVxuICBpZiAoJG9mZnNldCAhPSBudWxsKSB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICRvZmZzZXQucmFuayA9PT0gNCB8fCAkb2Zmc2V0LnJhbmsgPT09IDEsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBiYXRjaE5vcm00RDogb2Zmc2V0IG11c3QgYmUgcmFuayA0IG9yIHJhbmsgMSBgICtcbiAgICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskb2Zmc2V0LnJhbmt9LmApO1xuICB9XG4gIHJldHVybiBiYXRjaE5vcm0oJHgsICRtZWFuLCAkdmFyaWFuY2UsICRvZmZzZXQsICRzY2FsZSwgdmFyaWFuY2VFcHNpbG9uKTtcbn1cblxuZXhwb3J0IGNvbnN0IGJhdGNoTm9ybTRkID0gb3Aoe2JhdGNoTm9ybTRkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Bincount } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Outputs a vector with length `size` and the same dtype as `weights`.\n *\n * If `weights` are empty, then index `i` stores the number of times the value\n * `i` is counted in `x`. If `weights` are non-empty, then index `i` stores the\n * sum of the value in `weights` at each index where the corresponding value in\n * `x` is `i`.\n *\n * Values in `x` outside of the range [0, size) are ignored.\n *\n * @param x The input int tensor, rank 1.\n * @param weights The weights tensor, must have the same shape as x, or a\n *     length-0 Tensor, in which case it acts as all weights equal to 1.\n * @param size Non-negative integer.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction bincount_(x, weights, size) {\n    const $x = convertToTensor(x, 'x', 'bincount');\n    const $weights = convertToTensor(weights, 'weights', 'bincount');\n    util.assert($x.dtype === 'int32', () => `Error in bincount: input ` +\n        `dtype must be int32, but got ${$x.dtype}`);\n    util.assert(size >= 0, () => `size must be non-negative, but got ${size}.`);\n    util.assert($weights.size === $x.size || $weights.size === 0, () => `Error in bincount: weights must have the same size as input or` +\n        `0-length, but got input shape: ${$x.shape}, weights shape: ` +\n        `${$weights.shape}.`);\n    const inputs = { x: $x, weights: $weights };\n    const attrs = { size };\n    return ENGINE.runKernel(Bincount, inputs, attrs);\n}\nexport const bincount = op({ bincount_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9iaW5jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWdDLE1BQU0saUJBQWlCLENBQUM7QUFJeEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLFNBQVMsQ0FDZCxDQUFlLEVBQUUsT0FBcUIsRUFBRSxJQUFZO0lBQ3RELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRWpFLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQ3BCLEdBQUcsRUFBRSxDQUFDLDJCQUEyQjtRQUM3QixnQ0FBZ0MsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNDQUFzQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzVFLElBQUksQ0FBQyxNQUFNLENBQ1AsUUFBUSxDQUFDLElBQUksS0FBSyxFQUFFLENBQUMsSUFBSSxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNoRCxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsa0NBQWtDLEVBQUUsQ0FBQyxLQUFLLG1CQUFtQjtRQUM3RCxHQUFHLFFBQVEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRTlCLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQzFELE1BQU0sS0FBSyxHQUFrQixFQUFDLElBQUksRUFBQyxDQUFDO0lBRXBDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsUUFBUSxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0JpbmNvdW50LCBCaW5jb3VudEF0dHJzLCBCaW5jb3VudElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIE91dHB1dHMgYSB2ZWN0b3Igd2l0aCBsZW5ndGggYHNpemVgIGFuZCB0aGUgc2FtZSBkdHlwZSBhcyBgd2VpZ2h0c2AuXG4gKlxuICogSWYgYHdlaWdodHNgIGFyZSBlbXB0eSwgdGhlbiBpbmRleCBgaWAgc3RvcmVzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHZhbHVlXG4gKiBgaWAgaXMgY291bnRlZCBpbiBgeGAuIElmIGB3ZWlnaHRzYCBhcmUgbm9uLWVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlXG4gKiBzdW0gb2YgdGhlIHZhbHVlIGluIGB3ZWlnaHRzYCBhdCBlYWNoIGluZGV4IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluXG4gKiBgeGAgaXMgYGlgLlxuICpcbiAqIFZhbHVlcyBpbiBgeGAgb3V0c2lkZSBvZiB0aGUgcmFuZ2UgWzAsIHNpemUpIGFyZSBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBpbnQgdGVuc29yLCByYW5rIDEuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUaGUgd2VpZ2h0cyB0ZW5zb3IsIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyB4LCBvciBhXG4gKiAgICAgbGVuZ3RoLTAgVGVuc29yLCBpbiB3aGljaCBjYXNlIGl0IGFjdHMgYXMgYWxsIHdlaWdodHMgZXF1YWwgdG8gMS5cbiAqIEBwYXJhbSBzaXplIE5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIGJpbmNvdW50XzxUIGV4dGVuZHMgVGVuc29yMUQ+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgd2VpZ2h0czogVHxUZW5zb3JMaWtlLCBzaXplOiBudW1iZXIpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnYmluY291bnQnKTtcbiAgY29uc3QgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnYmluY291bnQnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LmR0eXBlID09PSAnaW50MzInLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJpbmNvdW50OiBpbnB1dCBgICtcbiAgICAgICAgICBgZHR5cGUgbXVzdCBiZSBpbnQzMiwgYnV0IGdvdCAkeyR4LmR0eXBlfWApO1xuICB1dGlsLmFzc2VydChzaXplID49IDAsICgpID0+IGBzaXplIG11c3QgYmUgbm9uLW5lZ2F0aXZlLCBidXQgZ290ICR7c2l6ZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHdlaWdodHMuc2l6ZSA9PT0gJHguc2l6ZSB8fCAkd2VpZ2h0cy5zaXplID09PSAwLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGJpbmNvdW50OiB3ZWlnaHRzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIGlucHV0IG9yYCArXG4gICAgICAgICAgYDAtbGVuZ3RoLCBidXQgZ290IGlucHV0IHNoYXBlOiAkeyR4LnNoYXBlfSwgd2VpZ2h0cyBzaGFwZTogYCArXG4gICAgICAgICAgYCR7JHdlaWdodHMuc2hhcGV9LmApO1xuXG4gIGNvbnN0IGlucHV0czogQmluY291bnRJbnB1dHMgPSB7eDogJHgsIHdlaWdodHM6ICR3ZWlnaHRzfTtcbiAgY29uc3QgYXR0cnM6IEJpbmNvdW50QXR0cnMgPSB7c2l6ZX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBCaW5jb3VudCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYmluY291bnQgPSBvcCh7YmluY291bnRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { BroadcastArgs } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Return the shape of s0 op s1 with broadcast.\n *\n * compute r0, the broadcasted shape as a tensor.\n * s0, s1 and r0 are all integer vectors.\n *\n * This function returns the shape of the result of an operation between\n * two tensors of size s0 and s1 performed with broadcast.\n *\n * @param s0 A tensor representing a shape\n * @param s1 A tensor representing a shape\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction broadcastArgs_(s0, s1) {\n    const shape1Input = convertToTensor(s0, 's0', 'broadcastArgs', 'int32');\n    const shape2Input = convertToTensor(s1, 's1', 'broadcastArgs', 'int32');\n    if (shape1Input.rank !== 1) {\n        throw new Error('broadcastArgs(): first input must be a vector (rank=1). ' +\n            `Has rank ${shape1Input.rank}`);\n    }\n    if (shape2Input.rank !== 1) {\n        throw new Error('broadcastArgs(): second input must be a vector (rank=1). ' +\n            `Has rank ${shape2Input.rank}`);\n    }\n    const inputs = { s0: shape1Input, s1: shape2Input };\n    return ENGINE.runKernel(BroadcastArgs, inputs);\n}\nexport const broadcastArgs = op({ broadcastArgs_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0X2FyZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9icm9hZGNhc3RfYXJncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ25DLE9BQU8sRUFBRSxhQUFhLEVBQXVCLE1BQU0saUJBQWlCLENBQUM7QUFFckUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBR3JELE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFakM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsY0FBYyxDQUNyQixFQUF1QixFQUFFLEVBQXVCO0lBQ2hELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RSxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFeEUsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUNiLDBEQUEwRDtZQUMxRCxZQUFZLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ25DO0lBRUQsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUNiLDJEQUEyRDtZQUMzRCxZQUFZLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ25DO0lBRUQsTUFBTSxNQUFNLEdBQXdCLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLENBQUM7SUFDekUsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgeyBOYW1lZFRlbnNvck1hcCB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQgeyBFTkdJTkUgfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHsgQnJvYWRjYXN0QXJncywgQnJvYWRjYXN0QXJnc0lucHV0cyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBUZW5zb3IgfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHsgY29udmVydFRvVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7IFJhbmssIFRlbnNvckxpa2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7IG9wIH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc2hhcGUgb2YgczAgb3AgczEgd2l0aCBicm9hZGNhc3QuXG4gKlxuICogY29tcHV0ZSByMCwgdGhlIGJyb2FkY2FzdGVkIHNoYXBlIGFzIGEgdGVuc29yLlxuICogczAsIHMxIGFuZCByMCBhcmUgYWxsIGludGVnZXIgdmVjdG9ycy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNoYXBlIG9mIHRoZSByZXN1bHQgb2YgYW4gb3BlcmF0aW9uIGJldHdlZW5cbiAqIHR3byB0ZW5zb3JzIG9mIHNpemUgczAgYW5kIHMxIHBlcmZvcm1lZCB3aXRoIGJyb2FkY2FzdC5cbiAqXG4gKiBAcGFyYW0gczAgQSB0ZW5zb3IgcmVwcmVzZW50aW5nIGEgc2hhcGVcbiAqIEBwYXJhbSBzMSBBIHRlbnNvciByZXByZXNlbnRpbmcgYSBzaGFwZVxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJyb2FkY2FzdEFyZ3NfPFIgZXh0ZW5kcyBSYW5rPihcbiAgczA6IFRlbnNvciB8IFRlbnNvckxpa2UsIHMxOiBUZW5zb3IgfCBUZW5zb3JMaWtlKTogVGVuc29yPFI+IHtcbiAgY29uc3Qgc2hhcGUxSW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoczAsICdzMCcsICdicm9hZGNhc3RBcmdzJywgJ2ludDMyJyk7XG4gIGNvbnN0IHNoYXBlMklucHV0ID0gY29udmVydFRvVGVuc29yKHMxLCAnczEnLCAnYnJvYWRjYXN0QXJncycsICdpbnQzMicpO1xuXG4gIGlmIChzaGFwZTFJbnB1dC5yYW5rICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ2Jyb2FkY2FzdEFyZ3MoKTogZmlyc3QgaW5wdXQgbXVzdCBiZSBhIHZlY3RvciAocmFuaz0xKS4gJyArXG4gICAgICBgSGFzIHJhbmsgJHtzaGFwZTFJbnB1dC5yYW5rfWApO1xuICB9XG5cbiAgaWYgKHNoYXBlMklucHV0LnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnYnJvYWRjYXN0QXJncygpOiBzZWNvbmQgaW5wdXQgbXVzdCBiZSBhIHZlY3RvciAocmFuaz0xKS4gJyArXG4gICAgICBgSGFzIHJhbmsgJHtzaGFwZTJJbnB1dC5yYW5rfWApO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBCcm9hZGNhc3RBcmdzSW5wdXRzID0geyBzMDogc2hhcGUxSW5wdXQsIHMxOiBzaGFwZTJJbnB1dCB9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChCcm9hZGNhc3RBcmdzLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgYnJvYWRjYXN0QXJncyA9IG9wKHsgYnJvYWRjYXN0QXJnc18gfSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Tile } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { clone } from './clone';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Broadcast an array to a compatible shape NumPy-style.\n *\n * The tensor's shape is compared to the broadcast shape from end to beginning.\n * Ones are prepended to the tensor's shape until it has the same length as\n * the broadcast shape. If input.shape[i]==shape[i], the (i+1)-th axis is\n * already broadcast-compatible. If input.shape[i]==1 and shape[i]==N, then\n * the input tensor is tiled N times along that axis (using tf.tile).\n *\n * @param input The tensor that is to be broadcasted.\n * @param shape The input is to be broadcast to this shape.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction broadcastTo_(x, shape) {\n    let input = convertToTensor(x, 'broadcastTo', 'x');\n    const xShape = input.shape;\n    if (shape.some(d => !(d > 0) || d % 1 !== 0)) {\n        throw new Error(`broadcastTo(): Invalid broadcast shape [${shape}].`);\n    }\n    if (shape.length < input.rank) {\n        throw new Error(`broadcastTo(): shape.length=${shape.length} < input.rank=${input.rank}.`);\n    }\n    if (shape.length > input.rank) {\n        const newShape = input.shape.slice();\n        while (newShape.length < shape.length) {\n            newShape.unshift(1);\n        }\n        input = reshape(input, newShape);\n    }\n    const inputShape = input.shape;\n    const reps = Array.from(shape);\n    for (let i = shape.length - 1; i >= 0; i--) {\n        if (inputShape[i] === shape[i]) {\n            reps[i] = 1;\n        }\n        else if (input.shape[i] !== 1) {\n            throw new Error(`broadcastTo(): [${xShape}] cannot be broadcast to [${shape}].`);\n        }\n    }\n    const axes = reps.map((n, i) => n > 1 ? i : -1).filter(i => i >= 0);\n    if (axes.length === 0) {\n        return clone(input);\n    }\n    // TODO call broadcastTo kernel directly once backends implement broadcstTo\n    const inputs = { x: input };\n    const attrs = { reps };\n    return ENGINE.runKernel(Tile, inputs, attrs);\n}\nexport const broadcastTo = op({ broadcastTo_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0X3RvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYnJvYWRjYXN0X3RvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBd0IsTUFBTSxpQkFBaUIsQ0FBQztBQUk1RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsWUFBWSxDQUNqQixDQUFvQixFQUFFLEtBQWtCO0lBQzFDLElBQUksS0FBSyxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsYUFBYSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFFM0IsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLEtBQUssSUFBSSxDQUFDLENBQUM7S0FDdkU7SUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixLQUFLLENBQUMsTUFBTSxpQkFDdkQsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7S0FDcEI7SUFFRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLElBQUksRUFBRTtRQUM3QixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3JDLE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ3JDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDckI7UUFDRCxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztLQUNsQztJQUVELE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDL0IsTUFBTSxJQUFJLEdBQWEsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsSUFBSSxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzlCLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDYjthQUFNLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDWCxtQkFBbUIsTUFBTSw2QkFBNkIsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUN0RTtLQUNGO0lBQ0QsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7SUFFcEUsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixPQUFPLEtBQUssQ0FBQyxLQUFLLENBQWMsQ0FBQztLQUNsQztJQUVELDJFQUEyRTtJQUMzRSxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsQ0FBQztJQUN0QyxNQUFNLEtBQUssR0FBYyxFQUFDLElBQUksRUFBQyxDQUFDO0lBQ2hDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsSUFBSSxFQUFFLE1BQThCLEVBQUUsS0FBZ0MsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RpbGUsIFRpbGVBdHRycywgVGlsZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1JhbmssIFNoYXBlTWFwLCBUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y2xvbmV9IGZyb20gJy4vY2xvbmUnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIEJyb2FkY2FzdCBhbiBhcnJheSB0byBhIGNvbXBhdGlibGUgc2hhcGUgTnVtUHktc3R5bGUuXG4gKlxuICogVGhlIHRlbnNvcidzIHNoYXBlIGlzIGNvbXBhcmVkIHRvIHRoZSBicm9hZGNhc3Qgc2hhcGUgZnJvbSBlbmQgdG8gYmVnaW5uaW5nLlxuICogT25lcyBhcmUgcHJlcGVuZGVkIHRvIHRoZSB0ZW5zb3IncyBzaGFwZSB1bnRpbCBpdCBoYXMgdGhlIHNhbWUgbGVuZ3RoIGFzXG4gKiB0aGUgYnJvYWRjYXN0IHNoYXBlLiBJZiBpbnB1dC5zaGFwZVtpXT09c2hhcGVbaV0sIHRoZSAoaSsxKS10aCBheGlzIGlzXG4gKiBhbHJlYWR5IGJyb2FkY2FzdC1jb21wYXRpYmxlLiBJZiBpbnB1dC5zaGFwZVtpXT09MSBhbmQgc2hhcGVbaV09PU4sIHRoZW5cbiAqIHRoZSBpbnB1dCB0ZW5zb3IgaXMgdGlsZWQgTiB0aW1lcyBhbG9uZyB0aGF0IGF4aXMgKHVzaW5nIHRmLnRpbGUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dCBUaGUgdGVuc29yIHRoYXQgaXMgdG8gYmUgYnJvYWRjYXN0ZWQuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIGlucHV0IGlzIHRvIGJlIGJyb2FkY2FzdCB0byB0aGlzIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGJyb2FkY2FzdFRvXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIHNoYXBlOiBTaGFwZU1hcFtSXSk6IFRlbnNvcjxSPiB7XG4gIGxldCBpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcih4LCAnYnJvYWRjYXN0VG8nLCAneCcpO1xuICBjb25zdCB4U2hhcGUgPSBpbnB1dC5zaGFwZTtcblxuICBpZiAoc2hhcGUuc29tZShkID0+ICEoZCA+IDApIHx8IGQgJSAxICE9PSAwKSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgYnJvYWRjYXN0VG8oKTogSW52YWxpZCBicm9hZGNhc3Qgc2hhcGUgWyR7c2hhcGV9XS5gKTtcbiAgfVxuXG4gIGlmIChzaGFwZS5sZW5ndGggPCBpbnB1dC5yYW5rKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBicm9hZGNhc3RUbygpOiBzaGFwZS5sZW5ndGg9JHtzaGFwZS5sZW5ndGh9IDwgaW5wdXQucmFuaz0ke1xuICAgICAgICBpbnB1dC5yYW5rfS5gKTtcbiAgfVxuXG4gIGlmIChzaGFwZS5sZW5ndGggPiBpbnB1dC5yYW5rKSB7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICAgIHdoaWxlIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICAgIG5ld1NoYXBlLnVuc2hpZnQoMSk7XG4gICAgfVxuICAgIGlucHV0ID0gcmVzaGFwZShpbnB1dCwgbmV3U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICBjb25zdCByZXBzOiBudW1iZXJbXSA9IEFycmF5LmZyb20oc2hhcGUpO1xuICBmb3IgKGxldCBpID0gc2hhcGUubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoaW5wdXRTaGFwZVtpXSA9PT0gc2hhcGVbaV0pIHtcbiAgICAgIHJlcHNbaV0gPSAxO1xuICAgIH0gZWxzZSBpZiAoaW5wdXQuc2hhcGVbaV0gIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgYnJvYWRjYXN0VG8oKTogWyR7eFNoYXBlfV0gY2Fubm90IGJlIGJyb2FkY2FzdCB0byBbJHtzaGFwZX1dLmApO1xuICAgIH1cbiAgfVxuICBjb25zdCBheGVzID0gcmVwcy5tYXAoKG4sIGkpID0+IG4gPiAxID8gaSA6IC0xKS5maWx0ZXIoaSA9PiBpID49IDApO1xuXG4gIGlmIChheGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBjbG9uZShpbnB1dCkgYXMgVGVuc29yPFI+O1xuICB9XG5cbiAgLy8gVE9ETyBjYWxsIGJyb2FkY2FzdFRvIGtlcm5lbCBkaXJlY3RseSBvbmNlIGJhY2tlbmRzIGltcGxlbWVudCBicm9hZGNzdFRvXG4gIGNvbnN0IGlucHV0czogVGlsZUlucHV0cyA9IHt4OiBpbnB1dH07XG4gIGNvbnN0IGF0dHJzOiBUaWxlQXR0cnMgPSB7cmVwc307XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgVGlsZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB1bmtub3duIGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBicm9hZGNhc3RUbyA9IG9wKHticm9hZGNhc3RUb199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Ceil } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes ceiling of input `tf.Tensor` element-wise: `ceil(x)`\n *\n * ```js\n * const x = tf.tensor1d([.6, 1.1, -3.3]);\n *\n * x.ceil().print();  // or tf.ceil(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction ceil_(x) {\n    const $x = convertToTensor(x, 'x', 'ceil', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Ceil, inputs);\n}\nexport const ceil = op({ ceil_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NlaWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdEQsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Q2VpbCwgQ2VpbElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBjZWlsaW5nIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYGNlaWwoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHguY2VpbCgpLnByaW50KCk7ICAvLyBvciB0Zi5jZWlsKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNlaWxfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjZWlsJywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHM6IENlaWxJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChDZWlsLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IGNlaWwgPSBvcCh7Y2VpbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Fill } from '../kernel_names';\n/**\n * Creates a `tf.Tensor` filled with a scalar value.\n *\n * ```js\n * tf.fill([2, 2], 4).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param value The scalar value to fill the tensor with.\n * @param dtype The type of an element in the resulting tensor. Defaults to\n * 'float'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction fill(shape, value, dtype) {\n    const attrs = { shape, value, dtype };\n    return ENGINE.runKernel(Fill, {}, attrs);\n}\nexport { fill };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ZpbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFZLE1BQU0saUJBQWlCLENBQUM7QUFLaEQ7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsSUFBSSxDQUNULEtBQWtCLEVBQUUsS0FBb0IsRUFBRSxLQUFnQjtJQUM1RCxNQUFNLEtBQUssR0FBYyxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFDLENBQUM7SUFFL0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxPQUFPLEVBQUMsSUFBSSxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtGaWxsLCBGaWxsQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgUmFuaywgU2hhcGVNYXB9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgZmlsbGVkIHdpdGggYSBzY2FsYXIgdmFsdWUuXG4gKlxuICogYGBganNcbiAqIHRmLmZpbGwoWzIsIDJdLCA0KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIHZhbHVlIFRoZSBzY2FsYXIgdmFsdWUgdG8gZmlsbCB0aGUgdGVuc29yIHdpdGguXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRGVmYXVsdHMgdG9cbiAqICdmbG9hdCcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBmaWxsPFIgZXh0ZW5kcyBSYW5rPihcbiAgICBzaGFwZTogU2hhcGVNYXBbUl0sIHZhbHVlOiBudW1iZXJ8c3RyaW5nLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yPFI+IHtcbiAgY29uc3QgYXR0cnM6IEZpbGxBdHRycyA9IHtzaGFwZSwgdmFsdWUsIGR0eXBlfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChGaWxsLCB7fSwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IHtmaWxsfTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ClipByValue } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { fill } from './fill';\nimport { op } from './operation';\n/**\n * Clips values element-wise. `max(min(x, clipValueMax), clipValueMin)`\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.clipByValue(-2, 3).print();  // or tf.clipByValue(x, -2, 3)\n * ```\n * @param x The input tensor.\n * @param clipValueMin Lower bound of range to be clipped to.\n * @param clipValueMax Upper bound of range to be clipped to.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction clipByValue_(x, clipValueMin, clipValueMax) {\n    const $x = convertToTensor(x, 'x', 'clipByValue');\n    util.assert((clipValueMin <= clipValueMax), () => `Error in clip: min (${clipValueMin}) must be ` +\n        `less than or equal to max (${clipValueMax}).`);\n    if (clipValueMin === clipValueMax) {\n        return fill($x.shape, clipValueMin, $x.dtype);\n    }\n    const inputs = { x: $x };\n    const attrs = { clipValueMin, clipValueMax };\n    return ENGINE.runKernel(ClipByValue, inputs, attrs);\n}\nexport const clipByValue = op({ clipByValue_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcF9ieV92YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NsaXBfYnlfdmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFzQyxNQUFNLGlCQUFpQixDQUFDO0FBSWpGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsWUFBWSxDQUNqQixDQUFlLEVBQUUsWUFBb0IsRUFBRSxZQUFvQjtJQUM3RCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNsRCxJQUFJLENBQUMsTUFBTSxDQUNQLENBQUMsWUFBWSxJQUFJLFlBQVksQ0FBQyxFQUM5QixHQUFHLEVBQUUsQ0FBQyx1QkFBdUIsWUFBWSxZQUFZO1FBQ2pELDhCQUE4QixZQUFZLElBQUksQ0FBQyxDQUFDO0lBRXhELElBQUksWUFBWSxLQUFLLFlBQVksRUFBRTtRQUNqQyxPQUFPLElBQUksQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFNLENBQUM7S0FDcEQ7SUFFRCxNQUFNLE1BQU0sR0FBc0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQXFCLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBQyxDQUFDO0lBRTdELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsV0FBVyxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtDbGlwQnlWYWx1ZSwgQ2xpcEJ5VmFsdWVBdHRycywgQ2xpcEJ5VmFsdWVJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtmaWxsfSBmcm9tICcuL2ZpbGwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ2xpcHMgdmFsdWVzIGVsZW1lbnQtd2lzZS4gYG1heChtaW4oeCwgY2xpcFZhbHVlTWF4KSwgY2xpcFZhbHVlTWluKWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LmNsaXBCeVZhbHVlKC0yLCAzKS5wcmludCgpOyAgLy8gb3IgdGYuY2xpcEJ5VmFsdWUoeCwgLTIsIDMpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWluIExvd2VyIGJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKiBAcGFyYW0gY2xpcFZhbHVlTWF4IFVwcGVyIGJvdW5kIG9mIHJhbmdlIHRvIGJlIGNsaXBwZWQgdG8uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNsaXBCeVZhbHVlXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGNsaXBWYWx1ZU1pbjogbnVtYmVyLCBjbGlwVmFsdWVNYXg6IG51bWJlcik6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjbGlwQnlWYWx1ZScpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIChjbGlwVmFsdWVNaW4gPD0gY2xpcFZhbHVlTWF4KSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjbGlwOiBtaW4gKCR7Y2xpcFZhbHVlTWlufSkgbXVzdCBiZSBgICtcbiAgICAgICAgICBgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIG1heCAoJHtjbGlwVmFsdWVNYXh9KS5gKTtcblxuICBpZiAoY2xpcFZhbHVlTWluID09PSBjbGlwVmFsdWVNYXgpIHtcbiAgICByZXR1cm4gZmlsbCgkeC5zaGFwZSwgY2xpcFZhbHVlTWluLCAkeC5kdHlwZSkgYXMgVDtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogQ2xpcEJ5VmFsdWVJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogQ2xpcEJ5VmFsdWVBdHRycyA9IHtjbGlwVmFsdWVNaW4sIGNsaXBWYWx1ZU1heH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBDbGlwQnlWYWx1ZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgY2xpcEJ5VmFsdWUgPSBvcCh7Y2xpcEJ5VmFsdWVffSk7XG4iXX0=","import { concat } from './concat';\nimport { op } from './operation';\n/**\n * Concatenates a list of`tf.Tensor1D`s along an axis. See `concat` for details.\n *\n * For example, if:\n * A: shape(3) = |r1, g1, b1|\n * B: shape(2) = |r2, g2|\n * C = tf.concat1d([A, B]) == |r1, g1, b1, r2, g2|\n *\n * @param tensors A list of`tf.Tensor`s to concatenate.\n * @return The concatenated array.\n */\nfunction concat1d_(tensors) {\n    return concat(tensors, 0 /* axis */);\n}\nexport const concat1d = op({ concat1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0XzFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0XzFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsU0FBUyxDQUFDLE9BQW1DO0lBQ3BELE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2ZgdGYuVGVuc29yMURgcyBhbG9uZyBhbiBheGlzLiBTZWUgYGNvbmNhdGAgZm9yIGRldGFpbHMuXG4gKlxuICogRm9yIGV4YW1wbGUsIGlmOlxuICogQTogc2hhcGUoMykgPSB8cjEsIGcxLCBiMXxcbiAqIEI6IHNoYXBlKDIpID0gfHIyLCBnMnxcbiAqIEMgPSB0Zi5jb25jYXQxZChbQSwgQl0pID09IHxyMSwgZzEsIGIxLCByMiwgZzJ8XG4gKlxuICogQHBhcmFtIHRlbnNvcnMgQSBsaXN0IG9mYHRmLlRlbnNvcmBzIHRvIGNvbmNhdGVuYXRlLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQxZF8odGVuc29yczogQXJyYXk8VGVuc29yMUR8VGVuc29yTGlrZT4pOiBUZW5zb3IxRCB7XG4gIHJldHVybiBjb25jYXQodGVuc29ycywgMCAvKiBheGlzICovKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmNhdDFkID0gb3Aoe2NvbmNhdDFkX30pO1xuIl19","import { concat } from './concat';\nimport { op } from './operation';\n/**\n * Concatenates a list of`tf.Tensor2D`s along an axis. See `concat` for details.\n *\n * For example, if:\n * A: shape(2, 3) = | r1, g1, b1 |\n *                  | r2, g2, b2 |\n *\n * B: shape(2, 3) = | r3, g3, b3 |\n *                  | r4, g4, b4 |\n *\n * C = tf.concat2d([A, B], axis)\n *\n * if axis = 0:\n * C: shape(4, 3) = | r1, g1, b1 |\n *                  | r2, g2, b2 |\n *                  | r3, g3, b3 |\n *                  | r4, g4, b4 |\n *\n * if axis = 1:\n * C = shape(2, 6) = | r1, g1, b1, r3, g3, b3 |\n *                   | r2, g2, b2, r4, g4, b4 |\n *\n *\n * @param tensors A list of `tf.Tensor`s to concatenate.\n * @param axis The axis to concatenate along.\n * @return The concatenated array.\n */\nfunction concat2d_(tensors, axis) {\n    return concat(tensors, axis);\n}\nexport const concat2d = op({ concat2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0XzJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0XzJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMEJHO0FBQ0gsU0FBUyxTQUFTLENBQ2QsT0FBbUMsRUFBRSxJQUFZO0lBQ25ELE9BQU8sTUFBTSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y29uY2F0fSBmcm9tICcuL2NvbmNhdCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZmB0Zi5UZW5zb3IyRGBzIGFsb25nIGFuIGF4aXMuIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgyLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKlxuICogQjogc2hhcGUoMiwgMykgPSB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIEMgPSB0Zi5jb25jYXQyZChbQSwgQl0sIGF4aXMpXG4gKlxuICogaWYgYXhpcyA9IDA6XG4gKiBDOiBzaGFwZSg0LCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKiAgICAgICAgICAgICAgICAgIHwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgIHwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDE6XG4gKiBDID0gc2hhcGUoMiwgNikgPSB8IHIxLCBnMSwgYjEsIHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgfCByMiwgZzIsIGIyLCByNCwgZzQsIGI0IHxcbiAqXG4gKlxuICogQHBhcmFtIHRlbnNvcnMgQSBsaXN0IG9mIGB0Zi5UZW5zb3JgcyB0byBjb25jYXRlbmF0ZS5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIGNvbmNhdGVuYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQyZF8oXG4gICAgdGVuc29yczogQXJyYXk8VGVuc29yMkR8VGVuc29yTGlrZT4sIGF4aXM6IG51bWJlcik6IFRlbnNvcjJEIHtcbiAgcmV0dXJuIGNvbmNhdCh0ZW5zb3JzLCBheGlzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmNhdDJkID0gb3Aoe2NvbmNhdDJkX30pO1xuIl19","import { concat } from './concat';\nimport { op } from './operation';\n/**\n * Concatenates a list of `tf.Tensor3D`s along an axis.\n * See `concat` for details.\n *\n * For example, if:\n * A: shape(2, 1, 3) = | r1, g1, b1 |\n *                     | r2, g2, b2 |\n *\n * B: shape(2, 1, 3) = | r3, g3, b3 |\n *                     | r4, g4, b4 |\n *\n * C = tf.concat3d([A, B], axis)\n *\n * if axis = 0:\n * C: shape(4, 1, 3) = | r1, g1, b1 |\n *                     | r2, g2, b2 |\n *                     | r3, g3, b3 |\n *                     | r4, g4, b4 |\n *\n * if axis = 1:\n * C: shape(2, 2, 3) = | r1, g1, b1, r3, g3, b3 |\n *                     | r2, g2, b2, r4, g4, b4 |\n *\n * if axis = 2:\n * C = shape(2, 1, 6) = | r1, g1, b1, r3, g3, b3 |\n *                      | r2, g2, b2, r4, g4, b4 |\n *\n * @param tensors A list of`tf.Tensor`s to concatenate.\n * @param axis The axis to concate along.\n * @return The concatenated array.\n */\nfunction concat3d_(tensors, axis) {\n    return concat(tensors, axis);\n}\nexport const concat3d = op({ concat3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0XzNkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0XzNkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILFNBQVMsU0FBUyxDQUNkLE9BQW1DLEVBQUUsSUFBWTtJQUNuRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IzRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcjNEYHMgYWxvbmcgYW4gYXhpcy5cbiAqIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgaWY6XG4gKiBBOiBzaGFwZSgyLCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKlxuICogQjogc2hhcGUoMiwgMSwgMykgPSB8IHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICB8IHI0LCBnNCwgYjQgfFxuICpcbiAqIEMgPSB0Zi5jb25jYXQzZChbQSwgQl0sIGF4aXMpXG4gKlxuICogaWYgYXhpcyA9IDA6XG4gKiBDOiBzaGFwZSg0LCAxLCAzKSA9IHwgcjEsIGcxLCBiMSB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDE6XG4gKiBDOiBzaGFwZSgyLCAyLCAzKSA9IHwgcjEsIGcxLCBiMSwgcjMsIGczLCBiMyB8XG4gKiAgICAgICAgICAgICAgICAgICAgIHwgcjIsIGcyLCBiMiwgcjQsIGc0LCBiNCB8XG4gKlxuICogaWYgYXhpcyA9IDI6XG4gKiBDID0gc2hhcGUoMiwgMSwgNikgPSB8IHIxLCBnMSwgYjEsIHIzLCBnMywgYjMgfFxuICogICAgICAgICAgICAgICAgICAgICAgfCByMiwgZzIsIGIyLCByNCwgZzQsIGI0IHxcbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2ZgdGYuVGVuc29yYHMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyB0byBjb25jYXRlIGFsb25nLlxuICogQHJldHVybiBUaGUgY29uY2F0ZW5hdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBjb25jYXQzZF8oXG4gICAgdGVuc29yczogQXJyYXk8VGVuc29yM0R8VGVuc29yTGlrZT4sIGF4aXM6IG51bWJlcik6IFRlbnNvcjNEIHtcbiAgcmV0dXJuIGNvbmNhdCh0ZW5zb3JzLCBheGlzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmNhdDNkID0gb3Aoe2NvbmNhdDNkX30pO1xuIl19","import { concat } from './concat';\nimport { op } from './operation';\n/**\n * Concatenates a list of `tf.Tensor4D`s along an axis.\n * See `concat` for details.\n *\n * @param tensors A list of `tf.Tensor`s to concatenate.\n * @param axis The axis to concate along.\n * @return The concatenated array.\n */\nfunction concat4d_(tensors, axis) {\n    return concat(tensors, axis);\n}\nexport const concat4d = op({ concat4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0XzRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29uY2F0XzRkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7R0FPRztBQUNILFNBQVMsU0FBUyxDQUNkLE9BQW1DLEVBQUUsSUFBWTtJQUNuRCxPQUFPLE1BQU0sQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDL0IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9jb25jYXQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgYHRmLlRlbnNvcjREYHMgYWxvbmcgYW4gYXhpcy5cbiAqIFNlZSBgY29uY2F0YCBmb3IgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0gdGVuc29ycyBBIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIHRvIGNvbmNhdGVuYXRlLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgdG8gY29uY2F0ZSBhbG9uZy5cbiAqIEByZXR1cm4gVGhlIGNvbmNhdGVuYXRlZCBhcnJheS5cbiAqL1xuZnVuY3Rpb24gY29uY2F0NGRfKFxuICAgIHRlbnNvcnM6IEFycmF5PFRlbnNvcjREfFRlbnNvckxpa2U+LCBheGlzOiBudW1iZXIpOiBUZW5zb3I0RCB7XG4gIHJldHVybiBjb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25jYXQ0ZCA9IG9wKHtjb25jYXQ0ZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv2D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes a 2D convolution over the input x.\n *\n * @param x The input tensor, of rank 4 or rank 3, of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter, rank 4, of shape\n *     `[filterHeight, filterWidth, inDepth, outDepth]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *   - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n *     \"NHWC\". Specify the data format of the input and output data. With the\n *     default format \"NHWC\", the data is stored in the order of: [batch,\n *     height, width, channels].\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n *     in which we sample input values across the height and width dimensions\n *     in atrous convolution. Defaults to `[1, 1]`. If `dilations` is a single\n *     number, then `dilationHeight == dilationWidth`. If it is greater than\n *     1, then all values of `strides` must be 1.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv2d_(x, filter, strides, pad, dataFormat = 'NHWC', dilations = [1, 1], dimRoundingMode) {\n    const $x = convertToTensor(x, 'x', 'conv2d', 'float32');\n    const $filter = convertToTensor(filter, 'filter', 'conv2d', 'float32');\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    util.assert(x4D.rank === 4, () => `Error in conv2d: input must be rank 4, but got rank ${x4D.rank}.`);\n    util.assert($filter.rank === 4, () => `Error in conv2d: filter must be rank 4, but got rank ` +\n        `${$filter.rank}.`);\n    conv_util.checkPadOnDimRoundingMode('conv2d', pad, dimRoundingMode);\n    const inDepth = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n    util.assert(inDepth === $filter.shape[2], () => `Error in conv2d: depth of input (${inDepth}) must match ` +\n        `input depth for filter ${$filter.shape[2]}.`);\n    util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in conv2D: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    const inputs = { x: x4D, filter: $filter };\n    const attrs = { strides, pad, dataFormat, dilations, dimRoundingMode };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(Conv2D, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const conv2d = op({ conv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBQ0gsU0FBUyxPQUFPLENBQ1osQ0FBZSxFQUFFLE1BQTJCLEVBQzVDLE9BQWdDLEVBQ2hDLEdBQW9ELEVBQ3BELGFBQTRCLE1BQU0sRUFDbEMsWUFBcUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNDLGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN4RCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdkUsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUV6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZCxHQUFHLEVBQUUsQ0FBQyx1REFBdUQsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDbEIsR0FBRyxFQUFFLENBQUMsdURBQXVEO1FBQ3pELEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDNUIsU0FBUyxDQUFDLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQUcsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUM1QixHQUFHLEVBQUUsQ0FBQyxvQ0FBb0MsT0FBTyxlQUFlO1FBQzVELDBCQUEwQixPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN2RCxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQzVELEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxlQUFlLE9BQU8sbUJBQW1CLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFL0QsTUFBTSxNQUFNLEdBQWlCLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQ08sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFDLENBQUM7SUFFekUsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osTUFBTSxFQUFFLE1BQThCLEVBQ3RDLEtBQTJCLENBQU0sQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7S0FDdEU7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtDb252MkQsIENvbnYyREF0dHJzLCBDb252MkRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIGEgMkQgY29udm9sdXRpb24gb3ZlciB0aGUgaW5wdXQgeC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS5cbiAqIEBwYXJhbSBkaWxhdGlvbnMgVGhlIGRpbGF0aW9uIHJhdGVzOiBgW2RpbGF0aW9uSGVpZ2h0LCBkaWxhdGlvbldpZHRoXWBcbiAqICAgICBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGFjcm9zcyB0aGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zXG4gKiAgICAgaW4gYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgWzEsIDFdYC4gSWYgYGRpbGF0aW9uc2AgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYyZF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxjb252X3V0aWwuRXhwbGljaXRQYWRkaW5nLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQycsXG4gICAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciA9IFsxLCAxXSxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYyZCcsICdmbG9hdDMyJyk7XG4gIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2NvbnYyZCcsICdmbG9hdDMyJyk7XG5cbiAgbGV0IHg0RCA9ICR4IGFzIFRlbnNvcjREO1xuICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG5cbiAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayAke3g0RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkZmlsdGVyLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHskZmlsdGVyLnJhbmt9LmApO1xuICBjb252X3V0aWwuY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZSgnY29udjJkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbkRlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8geDRELnNoYXBlWzNdIDogeDRELnNoYXBlWzFdO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGluRGVwdGggPT09ICRmaWx0ZXIuc2hhcGVbMl0sXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjJkOiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBtYXRjaCBgICtcbiAgICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSxcbiAgICAgICgpID0+ICdFcnJvciBpbiBjb252MkQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBpbnB1dHM6IENvbnYyRElucHV0cyA9IHt4OiB4NEQsIGZpbHRlcjogJGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOlxuICAgICAgQ29udjJEQXR0cnMgPSB7c3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgQ29udjJELCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MmQgPSBvcCh7Y29udjJkX30pO1xuIl19","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { conv2d } from './conv2d';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes a 1D convolution over the input x.\n *\n * @param x The input tensor, of rank 3 or rank 2, of shape\n *     `[batch, width, inChannels]`. If rank 2, batch of 1 is assumed.\n * @param filter The filter, rank 3, of shape\n *     `[filterWidth, inDepth, outDepth]`.\n * @param stride The number of entries by which the filter is moved right at\n *     each step.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *   - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat An optional string from \"NWC\", \"NCW\". Defaults to \"NWC\",\n *     the data is stored in the order of [batch, in_width, in_channels]. Only\n *     \"NWC\" is currently supported.\n * @param dilation The dilation rate in which we sample input values in\n *     atrous convolution. Defaults to `1`. If it is greater than 1, then\n *     stride must be `1`.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv1d_(x, filter, stride, pad, dataFormat = 'NWC', dilation = 1, dimRoundingMode) {\n    const $x = convertToTensor(x, 'x', 'conv1d');\n    const $filter = convertToTensor(filter, 'filter', 'conv1d');\n    let x3D = $x;\n    let reshapedTo3D = false;\n    if ($x.rank === 2) {\n        reshapedTo3D = true;\n        x3D = reshape($x, [1, $x.shape[0], $x.shape[1]]);\n    }\n    util.assert(x3D.rank === 3, () => `Error in conv1d: input must be rank 3, but got rank ${x3D.rank}.`);\n    util.assert($filter.rank === 3, () => `Error in conv1d: filter must be rank 3, but got rank ` +\n        `${$filter.rank}.`);\n    conv_util.checkPadOnDimRoundingMode('conv1d', pad, dimRoundingMode);\n    util.assert(x3D.shape[2] === $filter.shape[1], () => `Error in conv1d: depth of input (${x3D.shape[2]}) must match ` +\n        `input depth for filter ${$filter.shape[1]}.`);\n    util.assert(conv_util.eitherStridesOrDilationsAreOne(stride, dilation), () => 'Error in conv1D: Either stride or dilation must be 1. ' +\n        `Got stride ${stride} and dilation '${dilation}'`);\n    util.assert(dataFormat === 'NWC', () => `Error in conv1d: got dataFormat of ${dataFormat} but only NWC is currently supported.`);\n    const filter4D = reshape($filter, [1, $filter.shape[0], $filter.shape[1], $filter.shape[2]]);\n    const input4D = reshape(x3D, [x3D.shape[0], 1, x3D.shape[1], x3D.shape[2]]);\n    const strides = [1, stride];\n    const dilations = [1, dilation];\n    const conv2dDataFormat = 'NHWC';\n    const res = conv2d(input4D, filter4D, strides, pad, conv2dDataFormat, dilations, dimRoundingMode);\n    if (reshapedTo3D) {\n        return reshape(res, [res.shape[2], res.shape[3]]);\n    }\n    return reshape(res, [res.shape[0], res.shape[2], res.shape[3]]);\n}\nexport const conv1d = op({ conv1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILFNBQVMsT0FBTyxDQUNaLENBQWUsRUFBRSxNQUEyQixFQUFFLE1BQWMsRUFDNUQsR0FBb0QsRUFDcEQsYUFBMEIsS0FBSyxFQUFFLFFBQVEsR0FBRyxDQUFDLEVBQzdDLGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTVELElBQUksR0FBRyxHQUFHLEVBQWMsQ0FBQztJQUN6QixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLEdBQUcsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbEQ7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLHVEQUF1RCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM5RSxJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNsQixHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7UUFDekQsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QixTQUFTLENBQUMseUJBQXlCLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNwRSxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFDakMsR0FBRyxFQUFFLENBQUMsb0NBQW9DLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGVBQWU7UUFDakUsMEJBQTBCLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxDQUFDLDhCQUE4QixDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsRUFDMUQsR0FBRyxFQUFFLENBQUMsd0RBQXdEO1FBQzFELGNBQWMsTUFBTSxrQkFBa0IsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUMzRCxJQUFJLENBQUMsTUFBTSxDQUNQLFVBQVUsS0FBSyxLQUFLLEVBQ3BCLEdBQUcsRUFBRSxDQUFDLHNDQUNGLFVBQVUsdUNBQXVDLENBQUMsQ0FBQztJQUUzRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQ3BCLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxPQUFPLEdBQXFCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE1BQU0sU0FBUyxHQUFxQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVsRCxNQUFNLGdCQUFnQixHQUFHLE1BQU0sQ0FBQztJQUVoQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQ2IsT0FBb0IsRUFBRyxRQUFxQixFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQzNELGdCQUFnQixFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3hEO0lBRUQsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yMkQsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2NvbnYyZH0gZnJvbSAnLi9jb252MmQnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyBhIDFEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHguXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayAzIG9yIHJhbmsgMiwgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDIsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyV2lkdGgsIGluRGVwdGgsIG91dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlIFRoZSBudW1iZXIgb2YgZW50cmllcyBieSB3aGljaCB0aGUgZmlsdGVyIGlzIG1vdmVkIHJpZ2h0IGF0XG4gKiAgICAgZWFjaCBzdGVwLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb20gXCJOV0NcIiwgXCJOQ1dcIi4gRGVmYXVsdHMgdG8gXCJOV0NcIixcbiAqICAgICB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mIFtiYXRjaCwgaW5fd2lkdGgsIGluX2NoYW5uZWxzXS4gT25seVxuICogICAgIFwiTldDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBkaWxhdGlvbiBUaGUgZGlsYXRpb24gcmF0ZSBpbiB3aGljaCB3ZSBzYW1wbGUgaW5wdXQgdmFsdWVzIGluXG4gKiAgICAgYXRyb3VzIGNvbnZvbHV0aW9uLiBEZWZhdWx0cyB0byBgMWAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGVuXG4gKiAgICAgc3RyaWRlIG11c3QgYmUgYDFgLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gY29udjFkXzxUIGV4dGVuZHMgVGVuc29yMkR8VGVuc29yM0Q+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgZmlsdGVyOiBUZW5zb3IzRHxUZW5zb3JMaWtlLCBzdHJpZGU6IG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxjb252X3V0aWwuRXhwbGljaXRQYWRkaW5nLFxuICAgIGRhdGFGb3JtYXQ6ICdOV0MnfCdOQ1cnID0gJ05XQycsIGRpbGF0aW9uID0gMSxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYxZCcpO1xuICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdjb252MWQnKTtcblxuICBsZXQgeDNEID0gJHggYXMgVGVuc29yM0Q7XG4gIGxldCByZXNoYXBlZFRvM0QgPSBmYWxzZTtcbiAgaWYgKCR4LnJhbmsgPT09IDIpIHtcbiAgICByZXNoYXBlZFRvM0QgPSB0cnVlO1xuICAgIHgzRCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV1dKTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDNELnJhbmsgPT09IDMsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBpbnB1dCBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rICR7eDNELnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRmaWx0ZXIucmFuayA9PT0gMyxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MWQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gIGNvbnZfdXRpbC5jaGVja1BhZE9uRGltUm91bmRpbmdNb2RlKCdjb252MWQnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDNELnNoYXBlWzJdID09PSAkZmlsdGVyLnNoYXBlWzFdLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYxZDogZGVwdGggb2YgaW5wdXQgKCR7eDNELnNoYXBlWzJdfSkgbXVzdCBtYXRjaCBgICtcbiAgICAgICAgICBgaW5wdXQgZGVwdGggZm9yIGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMV19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlLCBkaWxhdGlvbiksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gY29udjFEOiBFaXRoZXIgc3RyaWRlIG9yIGRpbGF0aW9uIG11c3QgYmUgMS4gJyArXG4gICAgICAgICAgYEdvdCBzdHJpZGUgJHtzdHJpZGV9IGFuZCBkaWxhdGlvbiAnJHtkaWxhdGlvbn0nYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZGF0YUZvcm1hdCA9PT0gJ05XQycsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjFkOiBnb3QgZGF0YUZvcm1hdCBvZiAke1xuICAgICAgICAgIGRhdGFGb3JtYXR9IGJ1dCBvbmx5IE5XQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLmApO1xuXG4gIGNvbnN0IGZpbHRlcjREID0gcmVzaGFwZShcbiAgICAgICRmaWx0ZXIsIFsxLCAkZmlsdGVyLnNoYXBlWzBdLCAkZmlsdGVyLnNoYXBlWzFdLCAkZmlsdGVyLnNoYXBlWzJdXSk7XG4gIGNvbnN0IGlucHV0NEQgPSByZXNoYXBlKHgzRCwgW3gzRC5zaGFwZVswXSwgMSwgeDNELnNoYXBlWzFdLCB4M0Quc2hhcGVbMl1dKTtcbiAgY29uc3Qgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSA9IFsxLCBzdHJpZGVdO1xuICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl0gPSBbMSwgZGlsYXRpb25dO1xuXG4gIGNvbnN0IGNvbnYyZERhdGFGb3JtYXQgPSAnTkhXQyc7XG5cbiAgY29uc3QgcmVzID0gY29udjJkKFxuICAgICAgKGlucHV0NEQgYXMgVGVuc29yNEQpLCAoZmlsdGVyNEQgYXMgVGVuc29yNEQpLCBzdHJpZGVzLCBwYWQsXG4gICAgICBjb252MmREYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSk7XG5cbiAgaWYgKHJlc2hhcGVkVG8zRCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuXG4gIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVswXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xufVxuXG5leHBvcnQgY29uc3QgY29udjFkID0gb3Aoe2NvbnYxZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv2DBackpropInput } from '../kernel_names';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the derivative of the input of a 2D convolution.\n *\n * @param xShape The shape of the input: [batch, height, width, inDepth].\n * If length of 3, batch of 1 is assumed.\n * @param dy The derivative of the output, of rank 4 or rank 3 of shape\n *   `[batch, outHeight, outWidth, outDepth]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter, rank 4, of shape\n *     `[filterHeight, filterWidth, inDepth, outDepth]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm used:\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n *     \"NHWC\". Specify the data format of the input and output data. With the\n *     default format \"NHWC\", the data is stored in the order of: [batch,\n *     height, width, channels].\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n */\nfunction conv2DBackpropInput_(xShape, dy, filter, strides, pad, dataFormat = 'NHWC', dimRoundingMode) {\n    util.assert(xShape.length === dy.rank, () => `Length of inShape ` +\n        `(${xShape.length}) and rank of dy (${dy.rank}) must match`);\n    let xShape4D = xShape;\n    let dy4D = dy;\n    let reshapedTo4D = false;\n    if (dy.rank === 3) {\n        reshapedTo4D = true;\n        dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n        xShape4D = [1, xShape[0], xShape[1], xShape[2]];\n    }\n    util.assert(xShape4D.length === 4, () => `Error in conv2dDerInput: inShape must be length 4, but got length ` +\n        `${xShape4D.length}.`);\n    util.assert(dy4D.rank === 4, () => `Error in conv2dDerInput: dy must be rank 4, but got ` +\n        `rank ${dy4D.rank}`);\n    util.assert(filter.rank === 4, () => `Error in conv2dDerInput: filter must be rank 4, but got ` +\n        `rank ${filter.rank}`);\n    const inDepth = dataFormat === 'NHWC' ? xShape4D[3] : xShape4D[1];\n    const outDepth = dataFormat === 'NHWC' ? dy4D.shape[3] : dy4D.shape[1];\n    util.assert(inDepth === filter.shape[2], () => `Error in conv2dDerInput: depth of input (${inDepth}) must ` +\n        `match input depth for filter ${filter.shape[2]}.`);\n    util.assert(outDepth === filter.shape[3], () => `Error in conv2dDerInput: depth of output (${outDepth}) must ` +\n        `match output depth for filter ${filter.shape[3]}.`);\n    conv_util.checkPadOnDimRoundingMode('conv2dDerInput', pad, dimRoundingMode);\n    const inputs = { dy: dy4D, filter };\n    const attrs = { strides, pad, dataFormat, dimRoundingMode, inputShape: xShape4D };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(Conv2DBackpropInput, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const conv2DBackpropInput = op({ conv2DBackpropInput_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkX2JhY2twcm9wX2lucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjJkX2JhY2twcm9wX2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLG1CQUFtQixFQUFzRCxNQUFNLGlCQUFpQixDQUFDO0FBSXpHLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sS0FBSyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxTQUFTLG9CQUFvQixDQUN6QixNQUFpRSxFQUFFLEVBQUssRUFDeEUsTUFBZ0IsRUFBRSxPQUFnQyxFQUNsRCxHQUFvRCxFQUNwRCxhQUE0QixNQUFNLEVBQ2xDLGVBQXdDO0lBQzFDLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLE1BQU0sS0FBSyxFQUFFLENBQUMsSUFBSSxFQUN6QixHQUFHLEVBQUUsQ0FBQyxvQkFBb0I7UUFDdEIsSUFBSSxNQUFNLENBQUMsTUFBTSxxQkFBcUIsRUFBRSxDQUFDLElBQUksY0FBYyxDQUFDLENBQUM7SUFFckUsSUFBSSxRQUFRLEdBQUcsTUFBMEMsQ0FBQztJQUMxRCxJQUFJLElBQUksR0FBRyxFQUFjLENBQUM7SUFDMUIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixJQUFJLEdBQUcsT0FBTyxDQUFD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bGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0NvbnYyREJhY2twcm9wSW5wdXQsIENvbnYyREJhY2twcm9wSW5wdXRBdHRycywgQ29udjJEQmFja3Byb3BJbnB1dElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGVyaXZhdGl2ZSBvZiB0aGUgaW5wdXQgb2YgYSAyRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geFNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgaW5wdXQ6IFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF0uXG4gKiBJZiBsZW5ndGggb2YgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGR5IFRoZSBkZXJpdmF0aXZlIG9mIHRoZSBvdXRwdXQsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgYFtiYXRjaCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgb3V0RGVwdGhdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQ6XG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0XzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIHhTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl18W251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBkeTogVCxcbiAgICBmaWx0ZXI6IFRlbnNvcjRELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxjb252X3V0aWwuRXhwbGljaXRQYWRkaW5nLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQycsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaGFwZS5sZW5ndGggPT09IGR5LnJhbmssXG4gICAgICAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgICAgYCgke3hTaGFwZS5sZW5ndGh9KSBhbmQgcmFuayBvZiBkeSAoJHtkeS5yYW5rfSkgbXVzdCBtYXRjaGApO1xuXG4gIGxldCB4U2hhcGU0RCA9IHhTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgbGV0IGR5NEQgPSBkeSBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICBpZiAoZHkucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gICAgeFNoYXBlNEQgPSBbMSwgeFNoYXBlWzBdLCB4U2hhcGVbMV0sIHhTaGFwZVsyXV07XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaGFwZTRELmxlbmd0aCA9PT0gNCxcbiAgICAgICgpID0+XG4gICAgICAgICAgYEVycm9yIGluIGNvbnYyZERlcklucHV0OiBpblNoYXBlIG11c3QgYmUgbGVuZ3RoIDQsIGJ1dCBnb3QgbGVuZ3RoIGAgK1xuICAgICAgICAgIGAke3hTaGFwZTRELmxlbmd0aH0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlcklucHV0OiBkeSBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAke2R5NEQucmFua31gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBmaWx0ZXIucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IGAgK1xuICAgICAgICAgIGByYW5rICR7ZmlsdGVyLnJhbmt9YCk7XG4gIGNvbnN0IGluRGVwdGggPSBkYXRhRm9ybWF0ID09PSAnTkhXQycgPyB4U2hhcGU0RFszXSA6IHhTaGFwZTREWzFdO1xuICBjb25zdCBvdXREZXB0aCA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IGR5NEQuc2hhcGVbM10gOiBkeTRELnNoYXBlWzFdO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGluRGVwdGggPT09IGZpbHRlci5zaGFwZVsyXSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MmREZXJJbnB1dDogZGVwdGggb2YgaW5wdXQgKCR7aW5EZXB0aH0pIG11c3QgYCArXG4gICAgICAgICAgYG1hdGNoIGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbMl19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIG91dERlcHRoID09PSBmaWx0ZXIuc2hhcGVbM10sXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVySW5wdXQ6IGRlcHRoIG9mIG91dHB1dCAoJHtvdXREZXB0aH0pIG11c3QgYCArXG4gICAgICAgICAgYG1hdGNoIG91dHB1dCBkZXB0aCBmb3IgZmlsdGVyICR7ZmlsdGVyLnNoYXBlWzNdfS5gKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ2NvbnYyZERlcklucHV0JywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbnB1dHM6IENvbnYyREJhY2twcm9wSW5wdXRJbnB1dHMgPSB7ZHk6IGR5NEQsIGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOiBDb252MkRCYWNrcHJvcElucHV0QXR0cnMgPVxuICAgICAge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBpbnB1dFNoYXBlOiB4U2hhcGU0RH07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgQ29udjJEQmFja3Byb3BJbnB1dCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BJbnB1dCA9IG9wKHtjb252MkRCYWNrcHJvcElucHV0X30pO1xuIl19","import { convertToTensor } from '../tensor_util_env';\nimport { conv2DBackpropInput } from './conv2d_backprop_input';\nimport { op } from './operation';\n/**\n * Computes the transposed 2D convolution of an image, also known as a\n * deconvolution.\n *\n * @param x The input image, of rank 4 or rank 3, of shape\n *   `[batch, height, width, inDepth]`. If rank 3, batch of 1 is assumed.\n * @param filter The filter, rank 4, of shape\n *     `[filterHeight, filterWidth, outDepth, inDepth]`.\n *     `inDepth` must match `inDepth` in `x`.\n * @param outputShape Output shape, of rank 4 or rank 3:\n *     `[batch, height, width, outDepth]`. If rank 3, batch of 1 is assumed.\n * @param strides The strides of the original convolution:\n *     `[strideHeight, strideWidth]`.\n * @param pad  The type of padding algorithm used in the non-transpose version\n *    of the op.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv2dTranspose_(x, filter, outputShape, strides, pad, dimRoundingMode) {\n    const $x = convertToTensor(x, 'x', 'conv2dTranspose');\n    const $filter = convertToTensor(filter, 'filter', 'conv2dTranspose');\n    return conv2DBackpropInput(outputShape, $x, $filter, strides, pad, 'NHWC', dimRoundingMode);\n}\nexport const conv2dTranspose = op({ conv2dTranspose_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkX3RyYW5zcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbnYyZF90cmFuc3Bvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDckIsQ0FBZSxFQUFFLE1BQTJCLEVBQzVDLFdBQXNFLEVBQ3RFLE9BQWdDLEVBQ2hDLEdBQTBDLEVBQzFDLGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDdEQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUVyRSxPQUFPLG1CQUFtQixDQUN0QixXQUFXLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGdCQUFnQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtjb252MkRCYWNrcHJvcElucHV0fSBmcm9tICcuL2NvbnYyZF9iYWNrcHJvcF9pbnB1dCc7XG5pbXBvcnQge0V4cGxpY2l0UGFkZGluZ30gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSB0cmFuc3Bvc2VkIDJEIGNvbnZvbHV0aW9uIG9mIGFuIGltYWdlLCBhbHNvIGtub3duIGFzIGFcbiAqIGRlY29udm9sdXRpb24uXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGltYWdlLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkRlcHRoXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBvdXREZXB0aCwgaW5EZXB0aF1gLlxuICogICAgIGBpbkRlcHRoYCBtdXN0IG1hdGNoIGBpbkRlcHRoYCBpbiBgeGAuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGUgT3V0cHV0IHNoYXBlLCBvZiByYW5rIDQgb3IgcmFuayAzOlxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIG9yaWdpbmFsIGNvbnZvbHV0aW9uOlxuICogICAgIGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCAgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZCBpbiB0aGUgbm9uLXRyYW5zcG9zZSB2ZXJzaW9uXG4gKiAgICBvZiB0aGUgb3AuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBjb252MmRUcmFuc3Bvc2VfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBmaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2UsXG4gICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjb252MmRUcmFuc3Bvc2UnKTtcbiAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjJkVHJhbnNwb3NlJyk7XG5cbiAgcmV0dXJuIGNvbnYyREJhY2twcm9wSW5wdXQoXG4gICAgICBvdXRwdXRTaGFwZSwgJHgsICRmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgJ05IV0MnLCBkaW1Sb3VuZGluZ01vZGUpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJkVHJhbnNwb3NlID0gb3Aoe2NvbnYyZFRyYW5zcG9zZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv3D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { eitherStridesOrDilationsAreOne } from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes a 3D convolution over the input x.\n *\n * @param x The input tensor, of rank 5 or rank 4, of shape\n *     `[batch, depth, height, width, channels]`. If rank 4,\n * batch of 1 is assumed.\n * @param filter The filter, rank 5, of shape\n *     `[filterDepth, filterHeight, filterWidth, inChannels, outChannels]`.\n *      inChannels must match between input and filter.\n * @param strides The strides of the convolution: `[strideDepth, strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *   - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat: An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n *     \"NDHWC\". Specify the data format of the input and output data. With the\n *     default format \"NDHWC\", the data is stored in the order of: [batch,\n *     depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n * @param dilations The dilation rates: `[dilationDepth, dilationHeight,\n *     dilationWidth]` in which we sample input values across the height\n *     and width dimensions in atrous convolution. Defaults to `[1, 1, 1]`.\n *     If `dilations` is a single number, then\n *     `dilationDepth == dilationHeight == dilationWidth`. If it is greater\n *     than 1, then all values of `strides` must be 1.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv3d_(x, filter, strides, pad, dataFormat = 'NDHWC', dilations = [1, 1, 1]) {\n    const $x = convertToTensor(x, 'x', 'conv3d');\n    const $filter = convertToTensor(filter, 'filter', 'conv3d');\n    let x5D = $x;\n    let reshapedTo5D = false;\n    if ($x.rank === 4) {\n        reshapedTo5D = true;\n        x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n    }\n    util.assert(x5D.rank === 5, () => `Error in conv3d: input must be rank 5, but got rank ${x5D.rank}.`);\n    util.assert($filter.rank === 5, () => `Error in conv3d: filter must be rank 5, but got rank ` +\n        `${$filter.rank}.`);\n    util.assert(x5D.shape[4] === $filter.shape[3], () => `Error in conv3d: depth of input (${x5D.shape[4]}) must match ` +\n        `input depth for filter ${$filter.shape[3]}.`);\n    util.assert(eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in conv3D: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    util.assert(dataFormat === 'NDHWC', () => `Error in conv3d: got dataFormat of ${dataFormat} but only NDHWC is currently supported.`);\n    const inputs = { x: x5D, filter: $filter };\n    const attrs = { strides, pad, dataFormat, dilations };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(Conv3D, inputs, attrs);\n    if (reshapedTo5D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n    }\n    return res;\n}\nexport const conv3d = op({ conv3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjNkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjNkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzNELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStCRztBQUNILFNBQVMsT0FBTyxDQUNaLENBQWUsRUFBRSxNQUEyQixFQUM1QyxPQUF3QyxFQUFFLEdBQW1CLEVBQzdELGFBQThCLE9BQU8sRUFDckMsWUFBNkMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN4RCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU1RCxJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXpCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM1RTtJQUNELElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMsdURBQXVELEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzlFLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLHVEQUF1RDtRQUN6RCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNqQyxHQUFHLEVBQUUsQ0FBQyxvQ0FBb0MsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsZUFBZTtRQUNqRSwwQkFBMEIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkQsSUFBSSxDQUFDLE1BQU0sQ0FDUCw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQ2xELEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxlQUFlLE9BQU8sbUJBQW1CLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDL0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxVQUFVLEtBQUssT0FBTyxFQUN0QixHQUFHLEVBQUUsQ0FBQyxzQ0FDRixVQUFVLHlDQUF5QyxDQUFDLENBQUM7SUFFN0QsTUFBTSxNQUFNLEdBQWlCLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFFdkQsTUFBTSxLQUFLLEdBQWdCLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFDLENBQUM7SUFFakUsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osTUFBTSxFQUFFLE1BQThCLEVBQ3RDLEtBQTJCLENBQU0sQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FDSCxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25FLENBQUM7S0FDUDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0NvbnYzRCwgQ29udjNEQXR0cnMsIENvbnYzRElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RCwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7ZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lfSBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgYSAzRCBjb252b2x1dGlvbiBvdmVyIHRoZSBpbnB1dCB4LlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNSBvciByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXWAuIElmIHJhbmsgNCxcbiAqIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA1LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIG91dENoYW5uZWxzXWAuXG4gKiAgICAgIGluQ2hhbm5lbHMgbXVzdCBtYXRjaCBiZXR3ZWVuIGlucHV0IGFuZCBmaWx0ZXIuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGF0YUZvcm1hdDogQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25EZXB0aCwgZGlsYXRpb25IZWlnaHQsXG4gKiAgICAgZGlsYXRpb25XaWR0aF1gIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHRcbiAqICAgICBhbmQgd2lkdGggZGltZW5zaW9ucyBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMSwgMV1gLlxuICogICAgIElmIGBkaWxhdGlvbnNgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlblxuICogICAgIGBkaWxhdGlvbkRlcHRoID09IGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyXG4gKiAgICAgdGhhbiAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYzZF88VCBleHRlbmRzIFRlbnNvcjREfFRlbnNvcjVEPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yNUR8VGVuc29yTGlrZSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwYWQ6ICd2YWxpZCd8J3NhbWUnLFxuICAgIGRhdGFGb3JtYXQ6ICdOREhXQyd8J05DREhXJyA9ICdOREhXQycsXG4gICAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyID0gWzEsIDEsIDFdKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvbnYzZCcpO1xuICBjb25zdCAkZmlsdGVyID0gY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdjb252M2QnKTtcblxuICBsZXQgeDVEID0gJHggYXMgVGVuc29yNUQ7XG4gIGxldCByZXNoYXBlZFRvNUQgPSBmYWxzZTtcblxuICBpZiAoJHgucmFuayA9PT0gNCkge1xuICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgeDVEID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl0sICR4LnNoYXBlWzNdXSk7XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2Q6IGlucHV0IG11c3QgYmUgcmFuayA1LCBidXQgZ290IHJhbmsgJHt4NUQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGZpbHRlci5yYW5rID09PSA1LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZDogZmlsdGVyIG11c3QgYmUgcmFuayA1LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NUQuc2hhcGVbNF0gPT09ICRmaWx0ZXIuc2hhcGVbM10sXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjNkOiBkZXB0aCBvZiBpbnB1dCAoJHt4NUQuc2hhcGVbNF19KSBtdXN0IG1hdGNoIGAgK1xuICAgICAgICAgIGBpbnB1dCBkZXB0aCBmb3IgZmlsdGVyICR7JGZpbHRlci5zaGFwZVszXX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gY29udjNEOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZGF0YUZvcm1hdCA9PT0gJ05ESFdDJyxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2Q6IGdvdCBkYXRhRm9ybWF0IG9mICR7XG4gICAgICAgICAgZGF0YUZvcm1hdH0gYnV0IG9ubHkgTkRIV0MgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5gKTtcblxuICBjb25zdCBpbnB1dHM6IENvbnYzRElucHV0cyA9IHt4OiB4NUQsIGZpbHRlcjogJGZpbHRlcn07XG5cbiAgY29uc3QgYXR0cnM6IENvbnYzREF0dHJzID0ge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBDb252M0QsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICAgICAgICAgICByZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKSBhc1xuICAgICAgICBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBjb252M2QgPSBvcCh7Y29udjNkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv3DBackpropInputV2 } from '../kernel_names';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the derivative of the input of a 3D convolution.\n *\n * @param xShape The shape of the input: [batch, depth, height, width,\n * in_channels]. If length of 4, batch of 1 is assumed.\n * @param dy The derivative of the output, of rank 5 or rank 4 of shape\n *   `[batch, outDepth, outHeight, outWidth, in_channels]`.\n * If rank 4, batch of 1 is assumed.\n * @param filter The filter, rank 5, of shape\n *     `[filterDepth, filterHeight, filterWidth, inDepth, outDepth]`.\n * @param strides The strides of the convolution: `[strideDepth, strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm used:\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n */\nfunction conv3DBackpropInput_(xShape, dy, filter, strides, pad) {\n    util.assert(xShape.length === dy.rank, () => `Length of inShape ` +\n        `(${xShape.length}) and rank of dy (${dy.rank}) must match`);\n    let xShape5D = xShape;\n    let dy5D = dy;\n    let reshapedTo5D = false;\n    if (dy.rank === 4) {\n        reshapedTo5D = true;\n        dy5D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2], dy.shape[3]]);\n        xShape5D = [1, xShape[0], xShape[1], xShape[2], xShape[3]];\n    }\n    const inDepth = xShape5D[4];\n    const outDepth = dy5D.shape[4];\n    util.assert(xShape5D.length === 5, () => `Error in conv3dDerInput: inShape must be length 5, but got length ` +\n        `${xShape5D.length}.`);\n    util.assert(dy5D.rank === 5, () => `Error in conv3dDerInput: dy must be rank 5, but got ` +\n        `rank ${dy5D.rank}`);\n    util.assert(filter.rank === 5, () => `Error in conv3dDerInput: filter must be rank 5, but got ` +\n        `rank ${filter.rank}`);\n    util.assert(inDepth === filter.shape[3], () => `Error in conv3dDerInput: depth of input (${inDepth}) must ` +\n        `match input depth for filter ${filter.shape[3]}.`);\n    util.assert(outDepth === filter.shape[4], () => `Error in conv3dDerInput: depth of output (${outDepth}) must ` +\n        `match output depth for filter ${filter.shape[4]}.`);\n    const inputs = { dy: dy5D, filter };\n    const attrs = { pad, strides, inputShape: xShape5D };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(Conv3DBackpropInputV2, inputs, attrs);\n    if (reshapedTo5D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n    }\n    return res;\n}\nexport const conv3DBackpropInput = op({ conv3DBackpropInput_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjNkX2JhY2twcm9wX2lucHV0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29udjNkX2JhY2twcm9wX2lucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLHFCQUFxQixFQUEwRCxNQUFNLGlCQUFpQixDQUFDO0FBSS9HLE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLG9CQUFvQixDQUN6QixNQUU2QyxFQUM3QyxFQUFLLEVBQUUsTUFBZ0IsRUFBRSxPQUF3QyxFQUNqRSxHQUFtQjtJQUNyQixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDLElBQUksRUFDekIsR0FBRyxFQUFFLENBQUMsb0JBQW9CO1FBQ3RCLElBQUksTUFBTSxDQUFDLE1BQU0scUJBQXFCLEVBQUUsQ0FBQyxJQUFJLGNBQWMsQ0FBQyxDQUFDO0lBRXJFLElBQUksUUFBUSxHQUFHLE1BQWtELENBQUM7SUFDbEUsSUFBSSxJQUFJLEdBQUcsRUFBYyxDQUFDO0lBQzFCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsSUFBSSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUUsUUFBUSxHQUFHLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzVEO0lBRUQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQ0Qsb0VBQW9FO1FBQ3BFLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZixHQUFHLEVBQUUsQ0FBQyxzREFBc0Q7UUFDeEQsUUFBUSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNqQixHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsUUFBUSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMvQixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUMzQixHQUFHLEVBQUUsQ0FBQyw0Q0FBNEMsT0FBTyxTQUFTO1FBQzlELGdDQUFnQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1RCxJQUFJLENBQUMsTUFBTSxDQUNQLFFBQVEsS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUM1QixHQUFHLEVBQUUsQ0FBQyw2Q0FBNkMsUUFBUSxTQUFTO1FBQ2hFLGlDQUFpQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU3RCxNQUFNLE1BQU0sR0FBZ0MsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBRS9ELE1BQU0sS0FBSyxHQUNzQixFQUFDLEdBQUcsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBRXRFLDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLHFCQUFxQixFQUFFLE1BQThCLEVBQ3JELEtBQTJCLENBQU0sQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FDSCxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ25FLENBQUM7S0FDUDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsQ0FBQyxFQUFDLG9CQUFvQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtDb252M0RCYWNrcHJvcElucHV0VjIsIENvbnYzREJhY2twcm9wSW5wdXRWMkF0dHJzLCBDb252M0RCYWNrcHJvcElucHV0VjJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yNEQsIFRlbnNvcjVEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZGVyaXZhdGl2ZSBvZiB0aGUgaW5wdXQgb2YgYSAzRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geFNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgaW5wdXQ6IFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsXG4gKiBpbl9jaGFubmVsc10uIElmIGxlbmd0aCBvZiA0LCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGRlcml2YXRpdmUgb2YgdGhlIG91dHB1dCwgb2YgcmFuayA1IG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBvdXREZXB0aCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgaW5fY2hhbm5lbHNdYC5cbiAqIElmIHJhbmsgNCwgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyLCByYW5rIDUsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0gdXNlZDpcbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICovXG5mdW5jdGlvbiBjb252M0RCYWNrcHJvcElucHV0XzxUIGV4dGVuZHMgVGVuc29yNER8VGVuc29yNUQ+KFxuICAgIHhTaGFwZTpcbiAgICAgICAgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcixcbiAgICAgICAgIG51bWJlcl18W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgZHk6IFQsIGZpbHRlcjogVGVuc29yNUQsIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJyk6IFQge1xuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaGFwZS5sZW5ndGggPT09IGR5LnJhbmssXG4gICAgICAoKSA9PiBgTGVuZ3RoIG9mIGluU2hhcGUgYCArXG4gICAgICAgICAgYCgke3hTaGFwZS5sZW5ndGh9KSBhbmQgcmFuayBvZiBkeSAoJHtkeS5yYW5rfSkgbXVzdCBtYXRjaGApO1xuXG4gIGxldCB4U2hhcGU1RCA9IHhTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICBsZXQgZHk1RCA9IGR5IGFzIFRlbnNvcjVEO1xuICBsZXQgcmVzaGFwZWRUbzVEID0gZmFsc2U7XG4gIGlmIChkeS5yYW5rID09PSA0KSB7XG4gICAgcmVzaGFwZWRUbzVEID0gdHJ1ZTtcbiAgICBkeTVEID0gcmVzaGFwZShkeSwgWzEsIGR5LnNoYXBlWzBdLCBkeS5zaGFwZVsxXSwgZHkuc2hhcGVbMl0sIGR5LnNoYXBlWzNdXSk7XG4gICAgeFNoYXBlNUQgPSBbMSwgeFNoYXBlWzBdLCB4U2hhcGVbMV0sIHhTaGFwZVsyXSwgeFNoYXBlWzNdXTtcbiAgfVxuXG4gIGNvbnN0IGluRGVwdGggPSB4U2hhcGU1RFs0XTtcbiAgY29uc3Qgb3V0RGVwdGggPSBkeTVELnNoYXBlWzRdO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHhTaGFwZTVELmxlbmd0aCA9PT0gNSxcbiAgICAgICgpID0+XG4gICAgICAgICAgYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBpblNoYXBlIG11c3QgYmUgbGVuZ3RoIDUsIGJ1dCBnb3QgbGVuZ3RoIGAgK1xuICAgICAgICAgIGAke3hTaGFwZTVELmxlbmd0aH0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk1RC5yYW5rID09PSA1LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkeSBtdXN0IGJlIHJhbmsgNSwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAke2R5NUQucmFua31gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBmaWx0ZXIucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZmlsdGVyIG11c3QgYmUgcmFuayA1LCBidXQgZ290IGAgK1xuICAgICAgICAgIGByYW5rICR7ZmlsdGVyLnJhbmt9YCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5EZXB0aCA9PT0gZmlsdGVyLnNoYXBlWzNdLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlcklucHV0OiBkZXB0aCBvZiBpbnB1dCAoJHtpbkRlcHRofSkgbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggaW5wdXQgZGVwdGggZm9yIGZpbHRlciAke2ZpbHRlci5zaGFwZVszXX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgb3V0RGVwdGggPT09IGZpbHRlci5zaGFwZVs0XSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJJbnB1dDogZGVwdGggb2Ygb3V0cHV0ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggb3V0cHV0IGRlcHRoIGZvciBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbNF19LmApO1xuXG4gIGNvbnN0IGlucHV0czogQ29udjNEQmFja3Byb3BJbnB1dFYySW5wdXRzID0ge2R5OiBkeTVELCBmaWx0ZXJ9O1xuXG4gIGNvbnN0IGF0dHJzOlxuICAgICAgQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMgPSB7cGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlOiB4U2hhcGU1RH07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgQ29udjNEQmFja3Byb3BJbnB1dFYyLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgIHJldHVybiByZXNoYXBlKFxuICAgICAgICAgICAgICAgcmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXSwgcmVzLnNoYXBlWzRdXSkgYXNcbiAgICAgICAgVDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BJbnB1dCA9IG9wKHtjb252M0RCYWNrcHJvcElucHV0X30pO1xuIl19","import { convertToTensor } from '../tensor_util_env';\nimport { conv3DBackpropInput } from './conv3d_backprop_input';\nimport { op } from './operation';\n/**\n * Computes the transposed 3D convolution of a volume, also known as a\n * deconvolution.\n *\n * @param x The input image, of rank 5 or rank 4, of shape\n *   `[batch, depth, height, width, inDepth]`. If rank 4, batch of 1 is assumed.\n * @param filter The filter, rank 4, of shape\n *     `[depth, filterHeight, filterWidth, outDepth, inDepth]`.\n *     `inDepth` must match `inDepth` in `x`.\n * @param outputShape Output shape, of rank 5 or rank 4:\n *     `[batch, depth, height, width, outDepth]`. If rank 3, batch of 1 is\n *    assumed.\n * @param strides The strides of the original convolution:\n *     `[strideDepth, strideHeight, strideWidth]`.\n * @param pad  The type of padding algorithm used in the non-transpose version\n *    of the op.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction conv3dTranspose_(x, filter, outputShape, strides, pad) {\n    const $x = convertToTensor(x, 'x', 'conv3dTranspose');\n    const $filter = convertToTensor(filter, 'filter', 'conv3dTranspose');\n    return conv3DBackpropInput(outputShape, $x, $filter, strides, pad);\n}\nexport const conv3dTranspose = op({ conv3dTranspose_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjNkX3RyYW5zcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbnYzZF90cmFuc3Bvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxTQUFTLGdCQUFnQixDQUNyQixDQUFlLEVBQUUsTUFBMkIsRUFDNUMsV0FFNkMsRUFDN0MsT0FBd0MsRUFBRSxHQUFtQjtJQUMvRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFFckUsT0FBTyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUMsRUFBQyxnQkFBZ0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjRELCBUZW5zb3I1RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y29udjNEQmFja3Byb3BJbnB1dH0gZnJvbSAnLi9jb252M2RfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSB0cmFuc3Bvc2VkIDNEIGNvbnZvbHV0aW9uIG9mIGEgdm9sdW1lLCBhbHNvIGtub3duIGFzIGFcbiAqIGRlY29udm9sdXRpb24uXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGltYWdlLCBvZiByYW5rIDUgb3IgcmFuayA0LCBvZiBzaGFwZVxuICogICBgW2JhdGNoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgaW5EZXB0aF1gLiBJZiByYW5rIDQsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIG91dERlcHRoLCBpbkRlcHRoXWAuXG4gKiAgICAgYGluRGVwdGhgIG11c3QgbWF0Y2ggYGluRGVwdGhgIGluIGB4YC5cbiAqIEBwYXJhbSBvdXRwdXRTaGFwZSBPdXRwdXQgc2hhcGUsIG9mIHJhbmsgNSBvciByYW5rIDQ6XG4gKiAgICAgYFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogICAgYXNzdW1lZC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBvcmlnaW5hbCBjb252b2x1dGlvbjpcbiAqICAgICBgW3N0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXWAuXG4gKiBAcGFyYW0gcGFkICBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobSB1c2VkIGluIHRoZSBub24tdHJhbnNwb3NlIHZlcnNpb25cbiAqICAgIG9mIHRoZSBvcC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGNvbnYzZFRyYW5zcG9zZV88VCBleHRlbmRzIFRlbnNvcjREfFRlbnNvcjVEPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yNUR8VGVuc29yTGlrZSxcbiAgICBvdXRwdXRTaGFwZTpcbiAgICAgICAgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcixcbiAgICAgICAgIG51bWJlcl18W251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlciwgcGFkOiAndmFsaWQnfCdzYW1lJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjb252M2RUcmFuc3Bvc2UnKTtcbiAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjNkVHJhbnNwb3NlJyk7XG5cbiAgcmV0dXJuIGNvbnYzREJhY2twcm9wSW5wdXQob3V0cHV0U2hhcGUsICR4LCAkZmlsdGVyLCBzdHJpZGVzLCBwYWQpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNkVHJhbnNwb3NlID0gb3Aoe2NvbnYzZFRyYW5zcG9zZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cos } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes cos of the input `tf.Tensor` element-wise: `cos(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n *\n * x.cos().print();  // or tf.cos(x)\n * ```\n * @param x The input tensor. Must be float32 type.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction cos_(x) {\n    const $x = convertToTensor(x, 'x', 'cos', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Cos, inputs);\n}\nexport const cos = op({ cos_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY29zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0NvcywgQ29zSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIE1hdGguUEkgLyAyLCBNYXRoLlBJICogMyAvIDRdKTtcbiAqXG4gKiB4LmNvcygpLnByaW50KCk7ICAvLyBvciB0Zi5jb3MoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gTXVzdCBiZSBmbG9hdDMyIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGNvc188VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2NvcycsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBDb3NJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvcywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBjb3MgPSBvcCh7Y29zX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cosh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes hyperbolic cos of the input `tf.Tensor` element-wise: `cosh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.cosh().print();  // or tf.cosh(x)\n * ```\n * @param x The input tensor. Must be float32 type.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction cosh_(x) {\n    const $x = convertToTensor(x, 'x', 'cosh', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Cosh, inputs);\n}\nexport const cosh = op({ cosh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Nvc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Q29zaCwgQ29zaElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBoeXBlcmJvbGljIGNvcyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgY29zaCh4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmNvc2goKS5wcmludCgpOyAgLy8gb3IgdGYuY29zaCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBNdXN0IGJlIGZsb2F0MzIgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gY29zaF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2Nvc2gnLCAnZmxvYXQzMicpO1xuICBjb25zdCBpbnB1dHM6IENvc2hJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKENvc2gsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgY29zaCA9IG9wKHtjb3NoX30pO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cumprod } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the cumulative product of a `tf.Tensor` along `axis`.\n *\n * ```js\n * const x = tf.tensor([1, 2, 3, 4]);\n * x.cumprod().print();\n * ```\n * ```js\n * const x = tf.tensor([[1, 2], [3, 4]]);\n * x.cumprod().print();\n * ```\n *\n * @param x The input tensor to cumulatively multiply.\n * @param axis The axis along which to multiply. Optional. Defaults to 0.\n * @param exclusive Whether to perform exclusive cumulative product. Optional.\n *     Defaults to false. If set to true then the product of each tensor entry\n *     does not include its own value, but only the values previous to it\n *     along the specified axis.\n * @param reverse Whether to multiply in the opposite direction. Optional.\n *     Defaults to false.\n *\n * @doc {heading: 'Operations', subheading: 'Scan'}\n */\nfunction cumprod_(x, axis = 0, exclusive = false, reverse = false) {\n    const $x = convertToTensor(x, 'x', 'cumprod');\n    const inputs = { x: $x };\n    const attrs = { axis, exclusive, reverse };\n    return ENGINE.runKernel(Cumprod, inputs, attrs);\n}\nexport const cumprod = op({ cumprod_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VtcHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2N1bXByb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNuQyxPQUFPLEVBQUUsT0FBTyxFQUErQixNQUFNLGlCQUFpQixDQUFDO0FBSXZFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUdyRCxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRWpDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsU0FBUyxRQUFRLENBQ2YsQ0FBc0IsRUFDdEIsSUFBSSxHQUFHLENBQUMsRUFDUixTQUFTLEdBQUcsS0FBSyxFQUNqQixPQUFPLEdBQUcsS0FBSztJQUVmLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLE1BQU0sTUFBTSxHQUFrQixFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQztJQUN4QyxNQUFNLEtBQUssR0FBaUIsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBRXpELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDckIsT0FBTyxFQUNQLE1BQThCLEVBQzlCLEtBQTJCLENBQzVCLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHsgRU5HSU5FIH0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7IEN1bXByb2QsIEN1bXByb2RBdHRycywgQ3VtcHJvZElucHV0cyB9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQgeyBOYW1lZEF0dHJNYXAgfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHsgVGVuc29yIH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7IE5hbWVkVGVuc29yTWFwIH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQgeyBUZW5zb3JMaWtlIH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQgeyBvcCB9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgY3VtdWxhdGl2ZSBwcm9kdWN0IG9mIGEgYHRmLlRlbnNvcmAgYWxvbmcgYGF4aXNgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yKFsxLCAyLCAzLCA0XSk7XG4gKiB4LmN1bXByb2QoKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKTtcbiAqIHguY3VtcHJvZCgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGN1bXVsYXRpdmVseSBtdWx0aXBseS5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIGFsb25nIHdoaWNoIHRvIG11bHRpcGx5LiBPcHRpb25hbC4gRGVmYXVsdHMgdG8gMC5cbiAqIEBwYXJhbSBleGNsdXNpdmUgV2hldGhlciB0byBwZXJmb3JtIGV4Y2x1c2l2ZSBjdW11bGF0aXZlIHByb2R1Y3QuIE9wdGlvbmFsLlxuICogICAgIERlZmF1bHRzIHRvIGZhbHNlLiBJZiBzZXQgdG8gdHJ1ZSB0aGVuIHRoZSBwcm9kdWN0IG9mIGVhY2ggdGVuc29yIGVudHJ5XG4gKiAgICAgZG9lcyBub3QgaW5jbHVkZSBpdHMgb3duIHZhbHVlLCBidXQgb25seSB0aGUgdmFsdWVzIHByZXZpb3VzIHRvIGl0XG4gKiAgICAgYWxvbmcgdGhlIHNwZWNpZmllZCBheGlzLlxuICogQHBhcmFtIHJldmVyc2UgV2hldGhlciB0byBtdWx0aXBseSBpbiB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLiBPcHRpb25hbC5cbiAqICAgICBEZWZhdWx0cyB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTY2FuJ31cbiAqL1xuZnVuY3Rpb24gY3VtcHJvZF88VCBleHRlbmRzIFRlbnNvcj4oXG4gIHg6IFRlbnNvciB8IFRlbnNvckxpa2UsXG4gIGF4aXMgPSAwLFxuICBleGNsdXNpdmUgPSBmYWxzZSxcbiAgcmV2ZXJzZSA9IGZhbHNlXG4pOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY3VtcHJvZCcpO1xuXG4gIGNvbnN0IGlucHV0czogQ3VtcHJvZElucHV0cyA9IHsgeDogJHggfTtcbiAgY29uc3QgYXR0cnM6IEN1bXByb2RBdHRycyA9IHsgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlIH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgQ3VtcHJvZCxcbiAgICBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwXG4gICk7XG59XG5cbmV4cG9ydCBjb25zdCBjdW1wcm9kID0gb3AoeyBjdW1wcm9kXyB9KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Cumsum } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the cumulative sum of a `tf.Tensor` along `axis`.\n *\n * ```js\n * const x = tf.tensor([1, 2, 3, 4]);\n * x.cumsum().print();\n * ```\n * ```js\n * const x = tf.tensor([[1, 2], [3, 4]]);\n * x.cumsum().print();\n * ```\n *\n * @param x The input tensor to be summed.\n * @param axis The axis along which to sum. Optional. Defaults to 0.\n * @param exclusive Whether to perform exclusive cumulative sum. Optional.\n *     Defaults to false. If set to true then the sum of each tensor entry\n *     does not include its own value, but only the values previous to it\n *     along the specified axis.\n * @param reverse Whether to sum in the opposite direction. Optional.\n *     Defaults to false.\n *\n * @doc {heading: 'Operations', subheading: 'Scan'}\n */\nfunction cumsum_(x, axis = 0, exclusive = false, reverse = false) {\n    const $x = convertToTensor(x, 'x', 'cumsum');\n    const inputs = { x: $x };\n    const attrs = { axis, exclusive, reverse };\n    return ENGINE.runKernel(Cumsum, inputs, attrs);\n}\nexport const cumsum = op({ cumsum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Vtc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvY3Vtc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsT0FBTyxDQUNaLENBQW9CLEVBQUUsSUFBSSxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsS0FBSyxFQUFFLE9BQU8sR0FBRyxLQUFLO0lBQ3BFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFpQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNyQyxNQUFNLEtBQUssR0FBZ0IsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxDQUFDO0lBRXRELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsTUFBTSxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0N1bXN1bSwgQ3Vtc3VtQXR0cnMsIEN1bXN1bUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjdW11bGF0aXZlIHN1bSBvZiBhIGB0Zi5UZW5zb3JgIGFsb25nIGBheGlzYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMiwgMywgNF0pO1xuICogeC5jdW1zdW0oKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKTtcbiAqIHguY3Vtc3VtKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgc3VtbWVkLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgYWxvbmcgd2hpY2ggdG8gc3VtLiBPcHRpb25hbC4gRGVmYXVsdHMgdG8gMC5cbiAqIEBwYXJhbSBleGNsdXNpdmUgV2hldGhlciB0byBwZXJmb3JtIGV4Y2x1c2l2ZSBjdW11bGF0aXZlIHN1bS4gT3B0aW9uYWwuXG4gKiAgICAgRGVmYXVsdHMgdG8gZmFsc2UuIElmIHNldCB0byB0cnVlIHRoZW4gdGhlIHN1bSBvZiBlYWNoIHRlbnNvciBlbnRyeVxuICogICAgIGRvZXMgbm90IGluY2x1ZGUgaXRzIG93biB2YWx1ZSwgYnV0IG9ubHkgdGhlIHZhbHVlcyBwcmV2aW91cyB0byBpdFxuICogICAgIGFsb25nIHRoZSBzcGVjaWZpZWQgYXhpcy5cbiAqIEBwYXJhbSByZXZlcnNlIFdoZXRoZXIgdG8gc3VtIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24uIE9wdGlvbmFsLlxuICogICAgIERlZmF1bHRzIHRvIGZhbHNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NjYW4nfVxuICovXG5mdW5jdGlvbiBjdW1zdW1fPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzID0gMCwgZXhjbHVzaXZlID0gZmFsc2UsIHJldmVyc2UgPSBmYWxzZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdjdW1zdW0nKTtcblxuICBjb25zdCBpbnB1dHM6IEN1bXN1bUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBDdW1zdW1BdHRycyA9IHtheGlzLCBleGNsdXNpdmUsIHJldmVyc2V9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgQ3Vtc3VtLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBjdW1zdW0gPSBvcCh7Y3Vtc3VtX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DenseBincount } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Outputs a vector with length `size` and the same dtype as `weights`.\n *\n * If `weights` are empty, then index `i` stores the number of times the value\n * `i` is counted in `x`. If `weights` are non-empty, then index `i` stores the\n * sum of the value in `weights` at each index where the corresponding value in\n * `x` is `i`.\n *\n * Values in `x` outside of the range [0, size) are ignored.\n *\n * @param x The input int tensor, rank 1 or rank 2.\n * @param weights The weights tensor, must have the same shape as x, or a\n *     length-0 Tensor, in which case it acts as all weights equal to 1.\n * @param size Non-negative integer.\n * @param binaryOutput Optional. Whether the kernel should count the appearance\n *     or number of occurrences. Defaults to False.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction denseBincount_(x, weights, size, binaryOutput = false) {\n    const $x = convertToTensor(x, 'x', 'denseBincount');\n    const $weights = convertToTensor(weights, 'weights', 'denseBincount');\n    util.assert($x.dtype === 'int32', () => `Error in denseBincount: input ` +\n        `dtype must be int32, but got ${$x.dtype}`);\n    util.assert($x.rank <= 2, () => `Error in denseBincount: input must be at most rank 2, but got ` +\n        `rank ${$x.rank}.`);\n    util.assert(size >= 0, () => `size must be non-negative, but got ${size}.`);\n    util.assert($weights.size === $x.size || $weights.size === 0, () => `Error in denseBincount: weights must have the same shape as x or ` +\n        `0-length, but got x shape: ${$x.shape}, weights shape: ` +\n        `${$weights.shape}.`);\n    const inputs = { x: $x, weights: $weights };\n    const attrs = { size, binaryOutput };\n    return ENGINE.runKernel(DenseBincount, inputs, attrs);\n}\nexport const denseBincount = op({ denseBincount_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVuc2VfYmluY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9kZW5zZV9iaW5jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxhQUFhLEVBQTBDLE1BQU0saUJBQWlCLENBQUM7QUFJdkYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQVMsY0FBYyxDQUNuQixDQUFlLEVBQUUsT0FBcUIsRUFBRSxJQUFZLEVBQ3BELFlBQVksR0FBRyxLQUFLO0lBQ3RCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQ3BCLEdBQUcsRUFBRSxDQUFDLGdDQUFnQztRQUNsQyxnQ0FBZ0MsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDcEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsRUFDWixHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsUUFBUSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsc0NBQXNDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDNUUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2hELEdBQUcsRUFBRSxDQUNELG1FQUFtRTtRQUNuRSw4QkFBOEIsRUFBRSxDQUFDLEtBQUssbUJBQW1CO1FBQ3pELEdBQUcsUUFBUSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFFOUIsTUFBTSxNQUFNLEdBQXdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFDL0QsTUFBTSxLQUFLLEdBQXVCLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBQyxDQUFDO0lBRXZELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsYUFBYSxFQUFFLE1BQThCLEVBQzdDLEtBQTJCLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEZW5zZUJpbmNvdW50LCBEZW5zZUJpbmNvdW50QXR0cnMsIERlbnNlQmluY291bnRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogT3V0cHV0cyBhIHZlY3RvciB3aXRoIGxlbmd0aCBgc2l6ZWAgYW5kIHRoZSBzYW1lIGR0eXBlIGFzIGB3ZWlnaHRzYC5cbiAqXG4gKiBJZiBgd2VpZ2h0c2AgYXJlIGVtcHR5LCB0aGVuIGluZGV4IGBpYCBzdG9yZXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgdmFsdWVcbiAqIGBpYCBpcyBjb3VudGVkIGluIGB4YC4gSWYgYHdlaWdodHNgIGFyZSBub24tZW1wdHksIHRoZW4gaW5kZXggYGlgIHN0b3JlcyB0aGVcbiAqIHN1bSBvZiB0aGUgdmFsdWUgaW4gYHdlaWdodHNgIGF0IGVhY2ggaW5kZXggd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgaW5cbiAqIGB4YCBpcyBgaWAuXG4gKlxuICogVmFsdWVzIGluIGB4YCBvdXRzaWRlIG9mIHRoZSByYW5nZSBbMCwgc2l6ZSkgYXJlIGlnbm9yZWQuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IGludCB0ZW5zb3IsIHJhbmsgMSBvciByYW5rIDIuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUaGUgd2VpZ2h0cyB0ZW5zb3IsIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyB4LCBvciBhXG4gKiAgICAgbGVuZ3RoLTAgVGVuc29yLCBpbiB3aGljaCBjYXNlIGl0IGFjdHMgYXMgYWxsIHdlaWdodHMgZXF1YWwgdG8gMS5cbiAqIEBwYXJhbSBzaXplIE5vbi1uZWdhdGl2ZSBpbnRlZ2VyLlxuICogQHBhcmFtIGJpbmFyeU91dHB1dCBPcHRpb25hbC4gV2hldGhlciB0aGUga2VybmVsIHNob3VsZCBjb3VudCB0aGUgYXBwZWFyYW5jZVxuICogICAgIG9yIG51bWJlciBvZiBvY2N1cnJlbmNlcy4gRGVmYXVsdHMgdG8gRmFsc2UuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGVuc2VCaW5jb3VudF88VCBleHRlbmRzIFRlbnNvcjFEfFRlbnNvcjJEPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIHdlaWdodHM6IFR8VGVuc29yTGlrZSwgc2l6ZTogbnVtYmVyLFxuICAgIGJpbmFyeU91dHB1dCA9IGZhbHNlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RlbnNlQmluY291bnQnKTtcbiAgY29uc3QgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnZGVuc2VCaW5jb3VudCcpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHguZHR5cGUgPT09ICdpbnQzMicsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZGVuc2VCaW5jb3VudDogaW5wdXQgYCArXG4gICAgICAgICAgYGR0eXBlIG11c3QgYmUgaW50MzIsIGJ1dCBnb3QgJHskeC5kdHlwZX1gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5yYW5rIDw9IDIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZGVuc2VCaW5jb3VudDogaW5wdXQgbXVzdCBiZSBhdCBtb3N0IHJhbmsgMiwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAkeyR4LnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChzaXplID49IDAsICgpID0+IGBzaXplIG11c3QgYmUgbm9uLW5lZ2F0aXZlLCBidXQgZ290ICR7c2l6ZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHdlaWdodHMuc2l6ZSA9PT0gJHguc2l6ZSB8fCAkd2VpZ2h0cy5zaXplID09PSAwLFxuICAgICAgKCkgPT5cbiAgICAgICAgICBgRXJyb3IgaW4gZGVuc2VCaW5jb3VudDogd2VpZ2h0cyBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYXMgeCBvciBgICtcbiAgICAgICAgICBgMC1sZW5ndGgsIGJ1dCBnb3QgeCBzaGFwZTogJHskeC5zaGFwZX0sIHdlaWdodHMgc2hhcGU6IGAgK1xuICAgICAgICAgIGAkeyR3ZWlnaHRzLnNoYXBlfS5gKTtcblxuICBjb25zdCBpbnB1dHM6IERlbnNlQmluY291bnRJbnB1dHMgPSB7eDogJHgsIHdlaWdodHM6ICR3ZWlnaHRzfTtcbiAgY29uc3QgYXR0cnM6IERlbnNlQmluY291bnRBdHRycyA9IHtzaXplLCBiaW5hcnlPdXRwdXR9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgRGVuc2VCaW5jb3VudCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlbnNlQmluY291bnQgPSBvcCh7ZGVuc2VCaW5jb3VudF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DepthToSpace } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Rearranges data from depth into blocks of spatial data. More specifically,\n * this op outputs a copy of the input tensor where values from the `depth`\n * dimension are moved in spatial blocks to the `height` and `width` dimensions.\n * The attr `blockSize` indicates the input block size and how the data is\n * moved.\n *\n *  - Chunks of data of size `blockSize * blockSize` from depth are rearranged\n * into non-overlapping blocks of size `blockSize x blockSize`\n *\n *  - The width the output tensor is `inputWidth * blockSize`, whereas the\n * height is `inputHeight * blockSize`\n *\n *  - The Y, X coordinates within each block of the output image are determined\n * by the high order component of the input channel index\n *\n *  - The depth of the input tensor must be divisible by `blockSize *\n * blockSize`\n *\n * The `dataFormat` attr specifies the layout of the input and output tensors\n * with the following options: \"NHWC\": [ `batch, height, width, channels` ]\n * \"NCHW\": [ `batch, channels, height, width` ]\n *\n * ```js\n * const x = tf.tensor4d([1, 2, 3, 4], [1, 1, 1, 4]);\n * const blockSize = 2;\n * const dataFormat = \"NHWC\";\n *\n * tf.depthToSpace(x, blockSize, dataFormat).print();\n * ```\n *\n * @param x The input tensor of rank 4\n * @param blockSIze  An `int` that is `>= 2`. The size of the spatial block\n * @param dataFormat An optional string from: \"NHWC\", \"NCHW\". Defaults to \"NHWC\"\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction depthToSpace_(x, blockSize, dataFormat = 'NHWC') {\n    const $x = convertToTensor(x, 'x', 'depthToSpace', 'float32');\n    const inputHeight = (dataFormat === 'NHWC') ? $x.shape[1] : $x.shape[2];\n    const inputWidth = (dataFormat === 'NHWC') ? $x.shape[2] : $x.shape[3];\n    const inputDepth = (dataFormat === 'NHWC') ? $x.shape[3] : $x.shape[1];\n    util.assert(blockSize > 1, () => `blockSize should be > 1 for depthToSpace, but was: ${blockSize}`);\n    util.assert(inputHeight * blockSize >= 0, () => `Negative dimension size caused by overflow when multiplying\n    ${inputHeight} and ${blockSize}  for depthToSpace with input shape\n    ${$x.shape}`);\n    util.assert(inputWidth * blockSize >= 0, () => `Negative dimension size caused by overflow when multiplying\n    ${inputWidth} and ${blockSize} for depthToSpace with input shape\n        ${$x.shape}`);\n    util.assert((inputDepth % (blockSize * blockSize) === 0), () => `Dimension size must be evenly divisible by ${blockSize * blockSize} but is ${inputDepth} for depthToSpace with input shape ${$x.shape}`);\n    const inputs = { x: $x };\n    const attrs = { blockSize, dataFormat };\n    return ENGINE.runKernel(DepthToSpace, inputs, attrs);\n}\nexport const depthToSpace = op({ depthToSpace_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGhfdG9fc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9kZXB0aF90b19zcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxZQUFZLEVBQXdDLE1BQU0saUJBQWlCLENBQUM7QUFJcEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9DRztBQUNILFNBQVMsYUFBYSxDQUNsQixDQUF3QixFQUFFLFNBQWlCLEVBQzNDLGFBQTRCLE1BQU07SUFDcEMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLFNBQVMsQ0FBYSxDQUFDO0lBRTFFLE1BQU0sV0FBVyxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXZFLElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxHQUFHLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxzREFBc0QsU0FBUyxFQUFFLENBQUMsQ0FBQztJQUU3RSxJQUFJLENBQUMsTUFBTSxDQUNQLFdBQVcsR0FBRyxTQUFTLElBQUksQ0FBQyxFQUM1QixHQUFHLEVBQUUsQ0FBQztNQUNOLFdBQVcsUUFBUSxTQUFTO01BQzVCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBRWhCLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxHQUFHLFNBQVMsSUFBSSxDQUFDLEVBQzNCLEdBQUcsRUFBRSxDQUFDO01BQ04sVUFBVSxRQUFRLFNBQVM7VUFDdkIsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLFVBQVUsR0FBRyxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsRUFDNUMsR0FBRyxFQUFFLENBQUMsOENBQ0YsU0FBUyxHQUFHLFNBQVMsV0FDckIsVUFBVSxzQ0FBc0MsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFcEUsTUFBTSxNQUFNLEdBQXVCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFzQixFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQztJQUV6RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFlBQVksRUFBRSxNQUE4QixFQUM1QyxLQUEyQixDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RGVwdGhUb1NwYWNlLCBEZXB0aFRvU3BhY2VBdHRycywgRGVwdGhUb1NwYWNlSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlNER9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZWFycmFuZ2VzIGRhdGEgZnJvbSBkZXB0aCBpbnRvIGJsb2NrcyBvZiBzcGF0aWFsIGRhdGEuIE1vcmUgc3BlY2lmaWNhbGx5LFxuICogdGhpcyBvcCBvdXRwdXRzIGEgY29weSBvZiB0aGUgaW5wdXQgdGVuc29yIHdoZXJlIHZhbHVlcyBmcm9tIHRoZSBgZGVwdGhgXG4gKiBkaW1lbnNpb24gYXJlIG1vdmVkIGluIHNwYXRpYWwgYmxvY2tzIHRvIHRoZSBgaGVpZ2h0YCBhbmQgYHdpZHRoYCBkaW1lbnNpb25zLlxuICogVGhlIGF0dHIgYGJsb2NrU2l6ZWAgaW5kaWNhdGVzIHRoZSBpbnB1dCBibG9jayBzaXplIGFuZCBob3cgdGhlIGRhdGEgaXNcbiAqIG1vdmVkLlxuICpcbiAqICAtIENodW5rcyBvZiBkYXRhIG9mIHNpemUgYGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZWAgZnJvbSBkZXB0aCBhcmUgcmVhcnJhbmdlZFxuICogaW50byBub24tb3ZlcmxhcHBpbmcgYmxvY2tzIG9mIHNpemUgYGJsb2NrU2l6ZSB4IGJsb2NrU2l6ZWBcbiAqXG4gKiAgLSBUaGUgd2lkdGggdGhlIG91dHB1dCB0ZW5zb3IgaXMgYGlucHV0V2lkdGggKiBibG9ja1NpemVgLCB3aGVyZWFzIHRoZVxuICogaGVpZ2h0IGlzIGBpbnB1dEhlaWdodCAqIGJsb2NrU2l6ZWBcbiAqXG4gKiAgLSBUaGUgWSwgWCBjb29yZGluYXRlcyB3aXRoaW4gZWFjaCBibG9jayBvZiB0aGUgb3V0cHV0IGltYWdlIGFyZSBkZXRlcm1pbmVkXG4gKiBieSB0aGUgaGlnaCBvcmRlciBjb21wb25lbnQgb2YgdGhlIGlucHV0IGNoYW5uZWwgaW5kZXhcbiAqXG4gKiAgLSBUaGUgZGVwdGggb2YgdGhlIGlucHV0IHRlbnNvciBtdXN0IGJlIGRpdmlzaWJsZSBieSBgYmxvY2tTaXplICpcbiAqIGJsb2NrU2l6ZWBcbiAqXG4gKiBUaGUgYGRhdGFGb3JtYXRgIGF0dHIgc3BlY2lmaWVzIHRoZSBsYXlvdXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgdGVuc29yc1xuICogd2l0aCB0aGUgZm9sbG93aW5nIG9wdGlvbnM6IFwiTkhXQ1wiOiBbIGBiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNgIF1cbiAqIFwiTkNIV1wiOiBbIGBiYXRjaCwgY2hhbm5lbHMsIGhlaWdodCwgd2lkdGhgIF1cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjRkKFsxLCAyLCAzLCA0XSwgWzEsIDEsIDEsIDRdKTtcbiAqIGNvbnN0IGJsb2NrU2l6ZSA9IDI7XG4gKiBjb25zdCBkYXRhRm9ybWF0ID0gXCJOSFdDXCI7XG4gKlxuICogdGYuZGVwdGhUb1NwYWNlKHgsIGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3Igb2YgcmFuayA0XG4gKiBAcGFyYW0gYmxvY2tTSXplICBBbiBgaW50YCB0aGF0IGlzIGA+PSAyYC4gVGhlIHNpemUgb2YgdGhlIHNwYXRpYWwgYmxvY2tcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvIFwiTkhXQ1wiXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gZGVwdGhUb1NwYWNlXyhcbiAgICB4OiBUZW5zb3I0RHxUZW5zb3JMaWtlNEQsIGJsb2NrU2l6ZTogbnVtYmVyLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQycpOiBUZW5zb3I0RCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RlcHRoVG9TcGFjZScsICdmbG9hdDMyJykgYXMgVGVuc29yNEQ7XG5cbiAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzFdIDogJHguc2hhcGVbMl07XG4gIGNvbnN0IGlucHV0V2lkdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzJdIDogJHguc2hhcGVbM107XG4gIGNvbnN0IGlucHV0RGVwdGggPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/ICR4LnNoYXBlWzNdIDogJHguc2hhcGVbMV07XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBibG9ja1NpemUgPiAxLFxuICAgICAgKCkgPT4gYGJsb2NrU2l6ZSBzaG91bGQgYmUgPiAxIGZvciBkZXB0aFRvU3BhY2UsIGJ1dCB3YXM6ICR7YmxvY2tTaXplfWApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5wdXRIZWlnaHQgKiBibG9ja1NpemUgPj0gMCxcbiAgICAgICgpID0+IGBOZWdhdGl2ZSBkaW1lbnNpb24gc2l6ZSBjYXVzZWQgYnkgb3ZlcmZsb3cgd2hlbiBtdWx0aXBseWluZ1xuICAgICR7aW5wdXRIZWlnaHR9IGFuZCAke2Jsb2NrU2l6ZX0gIGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZVxuICAgICR7JHguc2hhcGV9YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dFdpZHRoICogYmxvY2tTaXplID49IDAsXG4gICAgICAoKSA9PiBgTmVnYXRpdmUgZGltZW5zaW9uIHNpemUgY2F1c2VkIGJ5IG92ZXJmbG93IHdoZW4gbXVsdGlwbHlpbmdcbiAgICAke2lucHV0V2lkdGh9IGFuZCAke2Jsb2NrU2l6ZX0gZm9yIGRlcHRoVG9TcGFjZSB3aXRoIGlucHV0IHNoYXBlXG4gICAgICAgICR7JHguc2hhcGV9YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAoaW5wdXREZXB0aCAlIChibG9ja1NpemUgKiBibG9ja1NpemUpID09PSAwKSxcbiAgICAgICgpID0+IGBEaW1lbnNpb24gc2l6ZSBtdXN0IGJlIGV2ZW5seSBkaXZpc2libGUgYnkgJHtcbiAgICAgICAgICBibG9ja1NpemUgKiBibG9ja1NpemV9IGJ1dCBpcyAke1xuICAgICAgICAgIGlucHV0RGVwdGh9IGZvciBkZXB0aFRvU3BhY2Ugd2l0aCBpbnB1dCBzaGFwZSAkeyR4LnNoYXBlfWApO1xuXG4gIGNvbnN0IGlucHV0czogRGVwdGhUb1NwYWNlSW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IERlcHRoVG9TcGFjZUF0dHJzID0ge2Jsb2NrU2l6ZSwgZGF0YUZvcm1hdH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBEZXB0aFRvU3BhY2UsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2UgPSBvcCh7ZGVwdGhUb1NwYWNlX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DepthwiseConv2dNative } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Depthwise 2D convolution.\n *\n * Given a 4D `input` array and a `filter` array of shape\n * `[filterHeight, filterWidth, inChannels, channelMultiplier]` containing\n * `inChannels` convolutional filters of depth 1, this op applies a\n * different filter to each input channel (expanding from 1 channel to\n * `channelMultiplier` channels for each), then concatenates the results\n * together. The output has `inChannels * channelMultiplier` channels.\n *\n * See\n * [https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d](\n *     https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d)\n * for more details.\n *\n * @param x The input tensor, of rank 4 or rank 3, of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter tensor, rank 4, of shape\n *     `[filterHeight, filterWidth, inChannels, channelMultiplier]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`. If strides is a single number, then `strideHeight ==\n * strideWidth`.\n * @param pad The type of padding algorithm.\n *   - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *   - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *   - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n *     in which we sample input values across the height and width dimensions\n *     in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n *     number, then `dilationHeight == dilationWidth`. If it is greater than\n *     1, then all values of `strides` must be 1.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n *     \"NHWC\". Specify the data format of the input and output data. With the\n *     default format \"NHWC\", the data is stored in the order of: [batch,\n *     height, width, channels]. Only \"NHWC\" is currently supported.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction depthwiseConv2d_(x, filter, strides, pad, dataFormat = 'NHWC', dilations = [1, 1], dimRoundingMode) {\n    const $x = convertToTensor(x, 'x', 'depthwiseConv2d', 'float32');\n    const $filter = convertToTensor(filter, 'filter', 'depthwiseConv2d', 'float32');\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    util.assert(x4D.rank === 4, () => `Error in depthwiseConv2d: input must be rank 4, but got ` +\n        `rank ${x4D.rank}.`);\n    util.assert($filter.rank === 4, () => `Error in depthwiseConv2d: filter must be rank 4, but got rank ` +\n        `${$filter.rank}.`);\n    const inChannels = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n    util.assert(inChannels === $filter.shape[2], () => `Error in depthwiseConv2d: number of input channels ` +\n        `(${inChannels}) must match the inChannels dimension in ` +\n        `filter ${$filter.shape[2]}.`);\n    conv_util.checkPadOnDimRoundingMode('depthwiseConv2d', pad, dimRoundingMode);\n    const inputs = { x: x4D, filter: $filter };\n    const attrs = { strides, pad, dataFormat, dilations, dimRoundingMode };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(DepthwiseConv2dNative, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const depthwiseConv2d = op({ depthwiseConv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2RlcHRod2lzZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMscUJBQXFCLEVBQTBELE1BQU0saUJBQWlCLENBQUM7QUFJL0csT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sS0FBSyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E0Q0c7QUFDSCxTQUFTLGdCQUFnQixDQUNyQixDQUFlLEVBQUUsTUFBMkIsRUFDNUMsT0FBZ0MsRUFDaEMsR0FBb0QsRUFDcEQsYUFBNEIsTUFBTSxFQUNsQyxZQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDM0MsZUFBd0M7SUFDMUMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFcEUsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9EO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZCxHQUFHLEVBQUUsQ0FBQywwREFBMEQ7UUFDNUQsUUFBUSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM3QixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNsQixHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QixNQUFNLFVBQVUsR0FBRyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxLQUFLLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQy9CLEdBQUcsRUFBRSxDQUFDLHFEQUFxRDtRQUN2RCxJQUFJLFVBQVUsMkNBQTJDO1FBQ3pELFVBQVUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkMsU0FBUyxDQUFDLHlCQUF5QixDQUFDLGlCQUFpQixFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUM3RSxNQUFNLE1BQU0sR0FBZ0MsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUN0RSxNQUFNLEtBQUssR0FDUCxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUMsQ0FBQztJQUUzRCwwREFBMEQ7SUFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixxQkFBcUIsRUFBRSxNQUE4QixFQUNyRCxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGdCQUFnQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEZXB0aHdpc2VDb252MmROYXRpdmUsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUF0dHJzLCBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIERlcHRod2lzZSAyRCBjb252b2x1dGlvbi5cbiAqXG4gKiBHaXZlbiBhIDREIGBpbnB1dGAgYXJyYXkgYW5kIGEgYGZpbHRlcmAgYXJyYXkgb2Ygc2hhcGVcbiAqIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYCBjb250YWluaW5nXG4gKiBgaW5DaGFubmVsc2AgY29udm9sdXRpb25hbCBmaWx0ZXJzIG9mIGRlcHRoIDEsIHRoaXMgb3AgYXBwbGllcyBhXG4gKiBkaWZmZXJlbnQgZmlsdGVyIHRvIGVhY2ggaW5wdXQgY2hhbm5lbCAoZXhwYW5kaW5nIGZyb20gMSBjaGFubmVsIHRvXG4gKiBgY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzIGZvciBlYWNoKSwgdGhlbiBjb25jYXRlbmF0ZXMgdGhlIHJlc3VsdHNcbiAqIHRvZ2V0aGVyLiBUaGUgb3V0cHV0IGhhcyBgaW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyYCBjaGFubmVscy5cbiAqXG4gKiBTZWVcbiAqIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZF0oXG4gKiAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2RlcHRod2lzZV9jb252MmQpXG4gKiBmb3IgbW9yZSBkZXRhaWxzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdGVuc29yLCByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBgW3N0cmlkZUhlaWdodCxcbiAqIHN0cmlkZVdpZHRoXWAuIElmIHN0cmlkZXMgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT1cbiAqIHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gZGlsYXRpb25zIFRoZSBkaWxhdGlvbiByYXRlczogYFtkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aF1gXG4gKiAgICAgaW4gd2hpY2ggd2Ugc2FtcGxlIGlucHV0IHZhbHVlcyBhY3Jvc3MgdGhlIGhlaWdodCBhbmQgd2lkdGggZGltZW5zaW9uc1xuICogICAgIGluIGF0cm91cyBjb252b2x1dGlvbi4gRGVmYXVsdHMgdG8gYFsxLCAxXWAuIElmIGByYXRlYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRhdGFGb3JtYXQ6IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5IV0NcIiwgXCJOQ0hXXCIuIERlZmF1bHRzIHRvXG4gKiAgICAgXCJOSFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIE9ubHkgXCJOSFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdDb252b2x1dGlvbid9XG4gKi9cbmZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxjb252X3V0aWwuRXhwbGljaXRQYWRkaW5nLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycgPSAnTkhXQycsXG4gICAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciA9IFsxLCAxXSxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2RlcHRod2lzZUNvbnYyZCcsICdmbG9hdDMyJyk7XG4gIGNvbnN0ICRmaWx0ZXIgPVxuICAgICAgY29udmVydFRvVGVuc29yKGZpbHRlciwgJ2ZpbHRlcicsICdkZXB0aHdpc2VDb252MmQnLCAnZmxvYXQzMicpO1xuXG4gIGxldCB4NEQgPSAkeCBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgfVxuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgICAgYHJhbmsgJHt4NEQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGZpbHRlci5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgY29uc3QgaW5DaGFubmVscyA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IHg0RC5zaGFwZVszXSA6IHg0RC5zaGFwZVsxXTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbkNoYW5uZWxzID09PSAkZmlsdGVyLnNoYXBlWzJdLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRlcHRod2lzZUNvbnYyZDogbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzIGAgK1xuICAgICAgICAgIGAoJHtpbkNoYW5uZWxzfSkgbXVzdCBtYXRjaCB0aGUgaW5DaGFubmVscyBkaW1lbnNpb24gaW4gYCArXG4gICAgICAgICAgYGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICBjb252X3V0aWwuY2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZSgnZGVwdGh3aXNlQ29udjJkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbnB1dHM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUlucHV0cyA9IHt4OiB4NEQsIGZpbHRlcjogJGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVBdHRycyA9XG4gICAgICB7c3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgRGVwdGh3aXNlQ29udjJkTmF0aXZlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmQgPSBvcCh7ZGVwdGh3aXNlQ29udjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Diag } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns a diagonal tensor with given diagonal values.\n *\n * Given a diagonal, this operation returns a tensor with the diagonal and\n * everything else padded with zeros.\n *\n * Assume the input has dimensions `[D1,..., Dk]`, then the output is a tensor\n * of rank 2k with dimensions `[D1,..., Dk, D1,..., Dk]`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * tf.diag(x).print()\n * ```\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4, 5, 6, 6, 8], [4, 2])\n *\n * tf.diag(x).print()\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction diag_(x) {\n    const $x = convertToTensor(x, 'x', 'diag');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Diag, inputs);\n}\nexport const diag = op({ diag_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2RpYWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxTQUFTLEtBQUssQ0FBQyxDQUFTO0lBQ3RCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRW5DLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0RpYWcsIERpYWdJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgYSBkaWFnb25hbCB0ZW5zb3Igd2l0aCBnaXZlbiBkaWFnb25hbCB2YWx1ZXMuXG4gKlxuICogR2l2ZW4gYSBkaWFnb25hbCwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIHRlbnNvciB3aXRoIHRoZSBkaWFnb25hbCBhbmRcbiAqIGV2ZXJ5dGhpbmcgZWxzZSBwYWRkZWQgd2l0aCB6ZXJvcy5cbiAqXG4gKiBBc3N1bWUgdGhlIGlucHV0IGhhcyBkaW1lbnNpb25zIGBbRDEsLi4uLCBEa11gLCB0aGVuIHRoZSBvdXRwdXQgaXMgYSB0ZW5zb3JcbiAqIG9mIHJhbmsgMmsgd2l0aCBkaW1lbnNpb25zIGBbRDEsLi4uLCBEaywgRDEsLi4uLCBEa11gXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIHRmLmRpYWcoeCkucHJpbnQoKVxuICogYGBgXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0LCA1LCA2LCA2LCA4XSwgWzQsIDJdKVxuICpcbiAqIHRmLmRpYWcoeCkucHJpbnQoKVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGlhZ18oeDogVGVuc29yKTogVGVuc29yIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGlhZycpO1xuXG4gIGNvbnN0IGlucHV0czogRGlhZ0lucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRGlhZywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRpYWcgPSBvcCh7ZGlhZ199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Dilation2D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the grayscale dilation over the input `x`.\n *\n * @param x The input tensor, rank 3 or rank 4 of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param filter The filter tensor, rank 3, of shape\n *     `[filterHeight, filterWidth, depth]`.\n * @param strides The strides of the sliding window for each dimension of the\n *     input tensor: `[strideHeight, strideWidth]`.\n *     If `strides` is a single number,\n *     then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1*1x1.\n *    - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat Specify the data format of the input and output data.\n *      Defaults to 'NHWC'. Only 'NHWC' is currently supported. With the\n *      default format \"NHWC\", the data is stored in the order of: [batch,\n *      height, width, channels].\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n *     in which we sample input values across the height and width dimensions\n *     for atrous morphological dilation. Defaults to `[1, 1]`. If `dilations`\n *     is a single number, then `dilationHeight == dilationWidth`. If it is\n *     greater than 1, then all values of `strides` must be 1.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction dilation2d_(x, filter, strides, pad, dilations = [1, 1], dataFormat = 'NHWC') {\n    const $x = convertToTensor(x, 'x', 'dilation2d');\n    const $filter = convertToTensor(filter, 'filter', 'dilation2d');\n    util.assert($x.rank === 3 || $x.rank === 4, () => `Error in dilation2d: input must be rank 3 or 4, but got rank ` +\n        `${$x.rank}.`);\n    util.assert($filter.rank === 3, () => `Error in dilation2d: filter must be rank 3, but got rank ` +\n        `${$filter.rank}.`);\n    util.assert(dataFormat === 'NHWC', () => `Error in dilation2d: Only NHWC is currently supported, ` +\n        `but got dataFormat of ${dataFormat}`);\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n        reshapedTo4D = true;\n    }\n    const inputs = { x: x4D, filter: $filter };\n    const attrs = { strides, pad, dilations };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(Dilation2D, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const dilation2d = op({ dilation2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlsYXRpb24yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2RpbGF0aW9uMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsVUFBVSxFQUFvQyxNQUFNLGlCQUFpQixDQUFDO0FBSTlFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQThCRztBQUNILFNBQVMsV0FBVyxDQUNoQixDQUFlLEVBQUUsTUFBMkIsRUFDNUMsT0FBZ0MsRUFBRSxHQUFtQixFQUNyRCxZQUFxQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDM0MsYUFBcUIsTUFBTTtJQUM3QixNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUNqRCxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVoRSxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM5QixHQUFHLEVBQUUsQ0FBQywrREFBK0Q7UUFDakUsR0FBRyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNsQixHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1QixJQUFJLENBQUMsTUFBTSxDQUNQLFVBQVUsS0FBSyxNQUFNLEVBQ3JCLEdBQUcsRUFBRSxDQUFDLHlEQUF5RDtRQUMzRCx5QkFBeUIsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUUvQyxJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBRXpCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlELFlBQVksR0FBRyxJQUFJLENBQUM7S0FDckI7SUFFRCxNQUFNLE1BQU0sR0FBcUIsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUMzRCxNQUFNLEtBQUssR0FBb0IsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBRXpELDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLFVBQVUsRUFBRSxNQUE4QixFQUMxQyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEaWxhdGlvbjJELCBEaWxhdGlvbjJEQXR0cnMsIERpbGF0aW9uMkRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGdyYXlzY2FsZSBkaWxhdGlvbiBvdmVyIHRoZSBpbnB1dCBgeGAuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgcmFuayAzIG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyIFRoZSBmaWx0ZXIgdGVuc29yLCByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1gLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHNsaWRpbmcgd2luZG93IGZvciBlYWNoIGRpbWVuc2lvbiBvZiB0aGVcbiAqICAgICBpbnB1dCB0ZW5zb3I6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLlxuICogICAgIElmIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDEqMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkYXRhRm9ybWF0IFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuXG4gKiAgICAgIERlZmF1bHRzIHRvICdOSFdDJy4gT25seSAnTkhXQycgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4gV2l0aCB0aGVcbiAqICAgICAgZGVmYXVsdCBmb3JtYXQgXCJOSFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBmb3IgYXRyb3VzIG1vcnBob2xvZ2ljYWwgZGlsYXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYFxuICogICAgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzXG4gKiAgICAgZ3JlYXRlciB0aGFuIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0NvbnZvbHV0aW9uJ31cbiAqL1xuZnVuY3Rpb24gZGlsYXRpb24yZF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlcjogVGVuc29yM0R8VGVuc29yTGlrZSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciwgcGFkOiAndmFsaWQnfCdzYW1lJyxcbiAgICBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyID0gWzEsIDFdLFxuICAgIGRhdGFGb3JtYXQ6ICdOSFdDJyA9ICdOSFdDJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkaWxhdGlvbjJkJyk7XG4gIGNvbnN0ICRmaWx0ZXIgPSBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2RpbGF0aW9uMmQnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDMgfHwgJHgucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBkaWxhdGlvbjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgMyBvciA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGZpbHRlci5yYW5rID09PSAzLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRpbGF0aW9uMmQ6IGZpbHRlciBtdXN0IGJlIHJhbmsgMywgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAkeyRmaWx0ZXIucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZGF0YUZvcm1hdCA9PT0gJ05IV0MnLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRpbGF0aW9uMmQ6IE9ubHkgTkhXQyBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBgICtcbiAgICAgICAgICBgYnV0IGdvdCBkYXRhRm9ybWF0IG9mICR7ZGF0YUZvcm1hdH1gKTtcblxuICBsZXQgeDREID0gJHggYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcblxuICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogRGlsYXRpb24yRElucHV0cyA9IHt4OiB4NEQsIGZpbHRlcjogJGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOiBEaWxhdGlvbjJEQXR0cnMgPSB7c3RyaWRlcywgcGFkLCBkaWxhdGlvbnN9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIERpbGF0aW9uMkQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pIGFzIFQ7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgZGlsYXRpb24yZCA9IG9wKHtkaWxhdGlvbjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Equal } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a == b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.equal(b).print();\n * ```\n *\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction equal_(a, b) {\n    let $a = convertToTensor(a, 'a', 'equal', 'string_or_numeric');\n    let $b = convertToTensor(b, 'b', 'equal', 'string_or_numeric');\n    [$a, $b] = makeTypesMatch($a, $b);\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Equal, inputs);\n}\nexport const equal = op({ equal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9lcXVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFvQixFQUFFLENBQW9CO0lBQzVDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9ELElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQy9ELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFM0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0VxdWFsLCBFcXVhbElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIChhID09IGIpIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbMiwgMiwgMl0pO1xuICpcbiAqIGEuZXF1YWwoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gZXF1YWxfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2VxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogRXF1YWxJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFcXVhbCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGVxdWFsID0gb3Aoe2VxdWFsX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Select } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { broadcastTo } from './broadcast_to';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the elements, either `a` or `b` depending on the `condition`.\n *\n * If the condition is true, select from `a`, otherwise select from `b`.\n *\n * ```js\n * const cond = tf.tensor1d([false, false, true], 'bool');\n * const a = tf.tensor1d([1 , 2, 3]);\n * const b = tf.tensor1d([-1, -2, -3]);\n *\n * a.where(cond, b).print();\n * ```\n *\n * @param condition The input condition. Must be of dtype bool.\n * @param a If `condition` is rank 1, `a` may have a higher rank but\n *     its first dimension must match the size of `condition`.\n * @param b A tensor with the same dtype as `a` and with shape that is\n *     compatible with `a`.\n * @return A tensor with same dtype as `a` and `b`, and shape that is\n *     broadcastable from `a` and `b`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction where_(condition, a, b) {\n    const $a = convertToTensor(a, 'a', 'where');\n    const $b = convertToTensor(b, 'b', 'where');\n    const $condition = convertToTensor(condition, 'condition', 'where', 'bool');\n    // TODO: move this logic to forward function when the broadcastTo op is\n    // implemented in WASM.\n    // Find the broadcastable shape for $condition, $a, and $b.\n    const broadcastShape = assertAndGetBroadcastShape(assertAndGetBroadcastShape($condition.shape, $a.shape), $b.shape);\n    const $broadcastedCondition = broadcastTo($condition, broadcastShape);\n    const $broadcastedA = broadcastTo($a, broadcastShape);\n    const $broadcastedB = broadcastTo($b, broadcastShape);\n    const inputs = {\n        condition: $broadcastedCondition,\n        t: $broadcastedA,\n        e: $broadcastedB\n    };\n    return ENGINE.runKernel(Select, inputs);\n}\nexport const where = op({ where_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy93aGVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUdyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxTQUE0QixFQUFFLENBQWUsRUFBRSxDQUFlO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1RSx1RUFBdUU7SUFDdkUsdUJBQXVCO0lBQ3ZCLDJEQUEyRDtJQUMzRCxNQUFNLGNBQWMsR0FBRywwQkFBMEIsQ0FDN0MsMEJBQTBCLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3RFLE1BQU0scUJBQXFCLEdBQUcsV0FBVyxDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN0RSxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sYUFBYSxHQUFHLFdBQVcsQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFdEQsTUFBTSxNQUFNLEdBQWlCO1FBQzNCLFNBQVMsRUFBRSxxQkFBcUI7UUFDaEMsQ0FBQyxFQUFFLGFBQWE7UUFDaEIsQ0FBQyxFQUFFLGFBQWE7S0FDakIsQ0FBQztJQUNGLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NlbGVjdCwgU2VsZWN0SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHticm9hZGNhc3RUb30gZnJvbSAnLi9icm9hZGNhc3RfdG8nO1xuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZWxlbWVudHMsIGVpdGhlciBgYWAgb3IgYGJgIGRlcGVuZGluZyBvbiB0aGUgYGNvbmRpdGlvbmAuXG4gKlxuICogSWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLCBzZWxlY3QgZnJvbSBgYWAsIG90aGVyd2lzZSBzZWxlY3QgZnJvbSBgYmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGNvbmQgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSAsIDIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTEsIC0yLCAtM10pO1xuICpcbiAqIGEud2hlcmUoY29uZCwgYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBjb25kaXRpb24gVGhlIGlucHV0IGNvbmRpdGlvbi4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICogQHBhcmFtIGEgSWYgYGNvbmRpdGlvbmAgaXMgcmFuayAxLCBgYWAgbWF5IGhhdmUgYSBoaWdoZXIgcmFuayBidXRcbiAqICAgICBpdHMgZmlyc3QgZGltZW5zaW9uIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgYGNvbmRpdGlvbmAuXG4gKiBAcGFyYW0gYiBBIHRlbnNvciB3aXRoIHRoZSBzYW1lIGR0eXBlIGFzIGBhYCBhbmQgd2l0aCBzaGFwZSB0aGF0IGlzXG4gKiAgICAgY29tcGF0aWJsZSB3aXRoIGBhYC5cbiAqIEByZXR1cm4gQSB0ZW5zb3Igd2l0aCBzYW1lIGR0eXBlIGFzIGBhYCBhbmQgYGJgLCBhbmQgc2hhcGUgdGhhdCBpc1xuICogICAgIGJyb2FkY2FzdGFibGUgZnJvbSBgYWAgYW5kIGBiYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gd2hlcmVfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGNvbmRpdGlvbjogVGVuc29yfFRlbnNvckxpa2UsIGE6IFR8VGVuc29yTGlrZSwgYjogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ3doZXJlJyk7XG4gIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ3doZXJlJyk7XG4gIGNvbnN0ICRjb25kaXRpb24gPSBjb252ZXJ0VG9UZW5zb3IoY29uZGl0aW9uLCAnY29uZGl0aW9uJywgJ3doZXJlJywgJ2Jvb2wnKTtcbiAgLy8gVE9ETzogbW92ZSB0aGlzIGxvZ2ljIHRvIGZvcndhcmQgZnVuY3Rpb24gd2hlbiB0aGUgYnJvYWRjYXN0VG8gb3AgaXNcbiAgLy8gaW1wbGVtZW50ZWQgaW4gV0FTTS5cbiAgLy8gRmluZCB0aGUgYnJvYWRjYXN0YWJsZSBzaGFwZSBmb3IgJGNvbmRpdGlvbiwgJGEsIGFuZCAkYi5cbiAgY29uc3QgYnJvYWRjYXN0U2hhcGUgPSBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShcbiAgICAgIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRjb25kaXRpb24uc2hhcGUsICRhLnNoYXBlKSwgJGIuc2hhcGUpO1xuICBjb25zdCAkYnJvYWRjYXN0ZWRDb25kaXRpb24gPSBicm9hZGNhc3RUbygkY29uZGl0aW9uLCBicm9hZGNhc3RTaGFwZSk7XG4gIGNvbnN0ICRicm9hZGNhc3RlZEEgPSBicm9hZGNhc3RUbygkYSwgYnJvYWRjYXN0U2hhcGUpO1xuICBjb25zdCAkYnJvYWRjYXN0ZWRCID0gYnJvYWRjYXN0VG8oJGIsIGJyb2FkY2FzdFNoYXBlKTtcblxuICBjb25zdCBpbnB1dHM6IFNlbGVjdElucHV0cyA9IHtcbiAgICBjb25kaXRpb246ICRicm9hZGNhc3RlZENvbmRpdGlvbixcbiAgICB0OiAkYnJvYWRjYXN0ZWRBLFxuICAgIGU6ICRicm9hZGNhc3RlZEJcbiAgfTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2VsZWN0LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3Qgd2hlcmUgPSBvcCh7d2hlcmVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ZerosLike } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Creates a `tf.Tensor` with all elements set to 0 with the same shape as the\n * given tensor.\n *\n * ```js\n * const x = tf.tensor([1, 2]);\n * tf.zerosLike(x).print();\n * ```\n *\n * @param x The tensor of required shape.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction zerosLike_(x) {\n    const $x = convertToTensor(x, 'x', 'zerosLike');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(ZerosLike, inputs);\n}\nexport const zerosLike = op({ zerosLike_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVyb3NfbGlrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3plcm9zX2xpa2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsVUFBVSxDQUFtQixDQUFlO0lBQ25ELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFvQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUN4QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtaZXJvc0xpa2UsIFplcm9zTGlrZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCBhbGwgZWxlbWVudHMgc2V0IHRvIDAgd2l0aCB0aGUgc2FtZSBzaGFwZSBhcyB0aGVcbiAqIGdpdmVuIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcihbMSwgMl0pO1xuICogdGYuemVyb3NMaWtlKHgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIG9mIHJlcXVpcmVkIHNoYXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gemVyb3NMaWtlXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnemVyb3NMaWtlJyk7XG4gIGNvbnN0IGlucHV0czogWmVyb3NMaWtlSW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoWmVyb3NMaWtlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IHplcm9zTGlrZSA9IG9wKHt6ZXJvc0xpa2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { div } from './div';\nimport { equal } from './equal';\nimport { op } from './operation';\nimport { where } from './where';\nimport { zerosLike } from './zeros_like';\n/**\n * Divides two `tf.Tensor`s element-wise, A / B. Supports broadcasting. Return 0\n * if denominator is 0.\n *\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 9, 16]);\n * const b = tf.tensor1d([1, 2, 3, 4]);\n * const c = tf.tensor1d([0, 0, 0, 0]);\n *\n * a.divNoNan(b).print();  // or tf.divNoNan(a, b)\n * a.divNoNan(c).print();  // or tf.divNoNan(a, c)\n * ```\n *\n * ```js\n * // Broadcast div a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(2);\n * const c = tf.scalar(0);\n *\n * a.divNoNan(b).print();  // or tf.divNoNan(a, b)\n * a.divNoNan(c).print();  // or tf.divNoNan(a, c)\n * ```\n *\n * @param a The first tensor as the numerator.\n * @param b The second tensor as the denominator. Must have the same dtype as\n * `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction divNoNan_(a, b) {\n    // TODO: Make this into its own kernel.\n    let $a = convertToTensor(a, 'a', 'div');\n    let $b = convertToTensor(b, 'b', 'div');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const divResult = div($a, $b);\n    const zeros = zerosLike(divResult);\n    const bEqualsZero = equal($b, zeros);\n    return where(bEqualsZero, zeros, divResult);\n}\nexport const divNoNan = op({ divNoNan_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2X25vX25hbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Rpdl9ub19uYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsU0FBUyxTQUFTLENBQ2QsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1Qyx1Q0FBdUM7SUFDdkMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNuQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3JDLE9BQU8sS0FBSyxDQUFDLFdBQVcsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFNLENBQUM7QUFDbkQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7ZGl2fSBmcm9tICcuL2Rpdic7XG5pbXBvcnQge2VxdWFsfSBmcm9tICcuL2VxdWFsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7d2hlcmV9IGZyb20gJy4vd2hlcmUnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4vemVyb3NfbGlrZSc7XG5cbi8qKlxuICogRGl2aWRlcyB0d28gYHRmLlRlbnNvcmBzIGVsZW1lbnQtd2lzZSwgQSAvIEIuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy4gUmV0dXJuIDBcbiAqIGlmIGRlbm9taW5hdG9yIGlzIDAuXG4gKlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDksIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IxZChbMCwgMCwgMCwgMF0pO1xuICpcbiAqIGEuZGl2Tm9OYW4oYikucHJpbnQoKTsgIC8vIG9yIHRmLmRpdk5vTmFuKGEsIGIpXG4gKiBhLmRpdk5vTmFuKGMpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBjKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBkaXYgYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoMik7XG4gKiBjb25zdCBjID0gdGYuc2NhbGFyKDApO1xuICpcbiAqIGEuZGl2Tm9OYW4oYikucHJpbnQoKTsgIC8vIG9yIHRmLmRpdk5vTmFuKGEsIGIpXG4gKiBhLmRpdk5vTmFuKGMpLnByaW50KCk7ICAvLyBvciB0Zi5kaXZOb05hbihhLCBjKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvciBhcyB0aGUgbnVtZXJhdG9yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IgYXMgdGhlIGRlbm9taW5hdG9yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXNcbiAqIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gZGl2Tm9OYW5fPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICAvLyBUT0RPOiBNYWtlIHRoaXMgaW50byBpdHMgb3duIGtlcm5lbC5cbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2RpdicpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZGl2Jyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBjb25zdCBkaXZSZXN1bHQgPSBkaXYoJGEsICRiKTtcbiAgY29uc3QgemVyb3MgPSB6ZXJvc0xpa2UoZGl2UmVzdWx0KTtcbiAgY29uc3QgYkVxdWFsc1plcm8gPSBlcXVhbCgkYiwgemVyb3MpO1xuICByZXR1cm4gd2hlcmUoYkVxdWFsc1plcm8sIHplcm9zLCBkaXZSZXN1bHQpIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBkaXZOb05hbiA9IG9wKHtkaXZOb05hbl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { matMul } from './mat_mul';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the dot product of two matrices and/or vectors, `t1` and `t2`.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor2d([[1, 2], [3, 4]]);\n * const c = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);\n *\n * a.dot(b).print();  // or tf.dot(a, b)\n * b.dot(a).print();\n * b.dot(c).print();\n * ```\n * @param t1 The first tensor in the dot operation.\n * @param t2 The second tensor in the dot operation.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction dot_(t1, t2) {\n    const $t1 = convertToTensor(t1, 't1', 'dot');\n    const $t2 = convertToTensor(t2, 't2', 'dot');\n    util.assert(($t1.rank === 1 || $t1.rank === 2) && ($t2.rank === 1 || $t2.rank === 2), () => `Error in dot: inputs must all be rank 1 or 2, but got ranks ` +\n        `${$t1.rank} and ${$t2.rank}.`);\n    const t1Inner = ($t1.rank === 1 ? $t1.size : $t1.shape[1]);\n    const t2Inner = ($t2.rank === 1 ? $t2.size : $t2.shape[0]);\n    util.assert(t1Inner === t2Inner, () => `Error in dot: inner dimensions of inputs must match, but got ` +\n        `${t1Inner} and ${t2Inner}.`);\n    if ($t1.rank === 1 && $t2.rank === 1) {\n        const t12D = reshape($t1, [1, -1]);\n        const t22D = reshape($t2, [-1, 1]);\n        const t1t2 = matMul(t12D, t22D);\n        return reshape(t1t2, []);\n    }\n    else if ($t1.rank === 1 && $t2.rank === 2) {\n        const t12D = reshape($t1, [1, -1]);\n        const t22D = reshape($t2, [$t2.shape[0], $t2.shape[1]]);\n        const t1t2 = matMul(t12D, t22D);\n        return reshape(t1t2, [t1t2.size]);\n    }\n    else if ($t1.rank === 2 && $t2.rank === 1) {\n        const t22D = reshape($t2, [-1, 1]);\n        const t1t2 = matMul($t1, t22D);\n        return reshape(t1t2, [t1t2.size]);\n    }\n    else {\n        const t22D = reshape($t2, [$t2.shape[0], $t2.shape[1]]);\n        const t1t2 = matMul($t1, t22D);\n        return t1t2;\n    }\n}\nexport const dot = op({ dot_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsSUFBSSxDQUFDLEVBQXFCLEVBQUUsRUFBcUI7SUFDeEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0MsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFN0MsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxFQUN4RSxHQUFHLEVBQUUsQ0FBQyw4REFBOEQ7UUFDaEUsR0FBRyxHQUFHLENBQUMsSUFBSSxRQUFRLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMzRCxNQUFNLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFM0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLEtBQUssT0FBTyxFQUNuQixHQUFHLEVBQUUsQ0FBQywrREFBK0Q7UUFDakUsR0FBRyxPQUFPLFFBQVEsT0FBTyxHQUFHLENBQUMsQ0FBQztJQUV0QyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDaEMsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzFCO1NBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMzQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2hDLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ25DO1NBQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMzQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0tBQ25DO1NBQU07UUFDTCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9CLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi9tYXRfbXVsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIGFuZC9vciB2ZWN0b3JzLCBgdDFgIGFuZCBgdDJgLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDJdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGNvbnN0IGMgPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqXG4gKiBhLmRvdChiKS5wcmludCgpOyAgLy8gb3IgdGYuZG90KGEsIGIpXG4gKiBiLmRvdChhKS5wcmludCgpO1xuICogYi5kb3QoYykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHQxIFRoZSBmaXJzdCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKiBAcGFyYW0gdDIgVGhlIHNlY29uZCB0ZW5zb3IgaW4gdGhlIGRvdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBkb3RfKHQxOiBUZW5zb3J8VGVuc29yTGlrZSwgdDI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVGVuc29yIHtcbiAgY29uc3QgJHQxID0gY29udmVydFRvVGVuc29yKHQxLCAndDEnLCAnZG90Jyk7XG4gIGNvbnN0ICR0MiA9IGNvbnZlcnRUb1RlbnNvcih0MiwgJ3QyJywgJ2RvdCcpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgKCR0MS5yYW5rID09PSAxIHx8ICR0MS5yYW5rID09PSAyKSAmJiAoJHQyLnJhbmsgPT09IDEgfHwgJHQyLnJhbmsgPT09IDIpLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGRvdDogaW5wdXRzIG11c3QgYWxsIGJlIHJhbmsgMSBvciAyLCBidXQgZ290IHJhbmtzIGAgK1xuICAgICAgICAgIGAkeyR0MS5yYW5rfSBhbmQgJHskdDIucmFua30uYCk7XG5cbiAgY29uc3QgdDFJbm5lciA9ICgkdDEucmFuayA9PT0gMSA/ICR0MS5zaXplIDogJHQxLnNoYXBlWzFdKTtcbiAgY29uc3QgdDJJbm5lciA9ICgkdDIucmFuayA9PT0gMSA/ICR0Mi5zaXplIDogJHQyLnNoYXBlWzBdKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgIHQxSW5uZXIgPT09IHQySW5uZXIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZG90OiBpbm5lciBkaW1lbnNpb25zIG9mIGlucHV0cyBtdXN0IG1hdGNoLCBidXQgZ290IGAgK1xuICAgICAgICAgIGAke3QxSW5uZXJ9IGFuZCAke3QySW5uZXJ9LmApO1xuXG4gIGlmICgkdDEucmFuayA9PT0gMSAmJiAkdDIucmFuayA9PT0gMSkge1xuICAgIGNvbnN0IHQxMkQgPSByZXNoYXBlKCR0MSwgWzEsIC0xXSk7XG4gICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbLTEsIDFdKTtcbiAgICBjb25zdCB0MXQyID0gbWF0TXVsKHQxMkQsIHQyMkQpO1xuICAgIHJldHVybiByZXNoYXBlKHQxdDIsIFtdKTtcbiAgfSBlbHNlIGlmICgkdDEucmFuayA9PT0gMSAmJiAkdDIucmFuayA9PT0gMikge1xuICAgIGNvbnN0IHQxMkQgPSByZXNoYXBlKCR0MSwgWzEsIC0xXSk7XG4gICAgY29uc3QgdDIyRCA9IHJlc2hhcGUoJHQyLCBbJHQyLnNoYXBlWzBdLCAkdDIuc2hhcGVbMV1dKTtcbiAgICBjb25zdCB0MXQyID0gbWF0TXVsKHQxMkQsIHQyMkQpO1xuICAgIHJldHVybiByZXNoYXBlKHQxdDIsIFt0MXQyLnNpemVdKTtcbiAgfSBlbHNlIGlmICgkdDEucmFuayA9PT0gMiAmJiAkdDIucmFuayA9PT0gMSkge1xuICAgIGNvbnN0IHQyMkQgPSByZXNoYXBlKCR0MiwgWy0xLCAxXSk7XG4gICAgY29uc3QgdDF0MiA9IG1hdE11bCgkdDEsIHQyMkQpO1xuICAgIHJldHVybiByZXNoYXBlKHQxdDIsIFt0MXQyLnNpemVdKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB0MjJEID0gcmVzaGFwZSgkdDIsIFskdDIuc2hhcGVbMF0sICR0Mi5zaGFwZVsxXV0pO1xuICAgIGNvbnN0IHQxdDIgPSBtYXRNdWwoJHQxLCB0MjJEKTtcbiAgICByZXR1cm4gdDF0MjtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZG90ID0gb3Aoe2RvdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Einsum } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Tensor contraction over specified indices and outer product.\n *\n * `einsum` allows defining Tensors by defining their element-wise computation.\n * This computation is based on\n * [Einstein summation](https://en.wikipedia.org/wiki/Einstein_notation).\n *\n * Some special cases include:\n *\n * Matrix multiplication:\n * ```js\n * const x = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);\n * const y = tf.tensor2d([[0, 1], [2, 3], [4, 5]]);\n * x.print();\n * y.print();\n * tf.einsum('ij,jk->ik', x, y).print();\n * ```\n *\n * Dot product:\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n * const y = tf.tensor1d([0, 1, 2]);\n * x.print();\n * y.print();\n * tf.einsum('i,i->', x, y).print();\n * ```\n *\n * Batch dot product:\n * ```js\n * const x = tf.tensor2d([[1, 2, 3], [4, 5, 6]]);\n * const y = tf.tensor2d([[0, 1, 2], [3, 4, 5]]);\n * x.print();\n * y.print();\n * tf.einsum('bi,bi->b', x, y).print();\n * ```\n *\n * Outer prouduct:\n * ```js\n * const x = tf.tensor1d([1, 3, 5]);\n * const y = tf.tensor1d([2, 4, 6]);\n * x.print();\n * y.print();\n * tf.einsum('i,j->ij', x, y).print();\n * ```\n *\n * Matrix transpose:\n * ```js\n * const x = tf.tensor2d([[1, 2], [3, 4]]);\n * x.print();\n * tf.einsum('ij->ji', x).print();\n * ```\n *\n * Batch matrix transpose:\n * ```js\n * const x = tf.tensor3d([[[1, 2], [3, 4]], [[-1, -2], [-3, -4]]]);\n * x.print();\n * tf.einsum('bij->bji', x).print();\n * ```\n *\n * Limitations:\n *\n * This implementation of einsum has the following limitations:\n *\n * - Does not support >2 input tensors.\n * - Does not support duplicate axes for any given input tensor. E.g., equation\n *   'ii->' is not supported.\n * - The `...` notation is not supported.\n *\n * @param equation a string describing the contraction, in the same format as\n * [numpy.einsum](https://numpy.org/doc/stable/reference/generated/numpy.einsum.html).\n * @param tensors the input(s) to contract (each one a Tensor), whose shapes\n *     should be consistent with equation.\n * @returns The output tensor.\n *\n * @doc {heading: 'Tensors', subheading: 'Matrices'}\n */\nexport function einsum_(equation, ...tensors) {\n    const $tensors = tensors.map((t, i) => convertToTensor(t, `tensors${i}`, 'einsum'));\n    const attrs = { equation };\n    return ENGINE.runKernel(Einsum, $tensors, attrs);\n}\nexport const einsum = op({ einsum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWluc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZWluc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBSXBELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0EyRUc7QUFDSCxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCLEVBQUUsR0FBRyxPQUFpQjtJQUM1RCxNQUFNLFFBQVEsR0FDVixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsZUFBZSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxLQUFLLEdBQWdCLEVBQUMsUUFBUSxFQUFDLENBQUM7SUFDdEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixNQUFNLEVBQUUsUUFBZ0MsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxPQUFPLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RWluc3VtLCBFaW5zdW1BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBUZW5zb3IgY29udHJhY3Rpb24gb3ZlciBzcGVjaWZpZWQgaW5kaWNlcyBhbmQgb3V0ZXIgcHJvZHVjdC5cbiAqXG4gKiBgZWluc3VtYCBhbGxvd3MgZGVmaW5pbmcgVGVuc29ycyBieSBkZWZpbmluZyB0aGVpciBlbGVtZW50LXdpc2UgY29tcHV0YXRpb24uXG4gKiBUaGlzIGNvbXB1dGF0aW9uIGlzIGJhc2VkIG9uXG4gKiBbRWluc3RlaW4gc3VtbWF0aW9uXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FaW5zdGVpbl9ub3RhdGlvbikuXG4gKlxuICogU29tZSBzcGVjaWFsIGNhc2VzIGluY2x1ZGU6XG4gKlxuICogTWF0cml4IG11bHRpcGxpY2F0aW9uOlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbWzEsIDIsIDNdLCBbNCwgNSwgNl1dKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IyZChbWzAsIDFdLCBbMiwgM10sIFs0LCA1XV0pO1xuICogeC5wcmludCgpO1xuICogeS5wcmludCgpO1xuICogdGYuZWluc3VtKCdpaixqay0+aWsnLCB4LCB5KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogRG90IHByb2R1Y3Q6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCB5ID0gdGYudGVuc29yMWQoWzAsIDEsIDJdKTtcbiAqIHgucHJpbnQoKTtcbiAqIHkucHJpbnQoKTtcbiAqIHRmLmVpbnN1bSgnaSxpLT4nLCB4LCB5KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQmF0Y2ggZG90IHByb2R1Y3Q6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbMSwgMiwgM10sIFs0LCA1LCA2XV0pO1xuICogY29uc3QgeSA9IHRmLnRlbnNvcjJkKFtbMCwgMSwgMl0sIFszLCA0LCA1XV0pO1xuICogeC5wcmludCgpO1xuICogeS5wcmludCgpO1xuICogdGYuZWluc3VtKCdiaSxiaS0+YicsIHgsIHkpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBPdXRlciBwcm91ZHVjdDpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDMsIDVdKTtcbiAqIGNvbnN0IHkgPSB0Zi50ZW5zb3IxZChbMiwgNCwgNl0pO1xuICogeC5wcmludCgpO1xuICogeS5wcmludCgpO1xuICogdGYuZWluc3VtKCdpLGotPmlqJywgeCwgeSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIE1hdHJpeCB0cmFuc3Bvc2U6XG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbMSwgMl0sIFszLCA0XV0pO1xuICogeC5wcmludCgpO1xuICogdGYuZWluc3VtKCdpai0+amknLCB4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQmF0Y2ggbWF0cml4IHRyYW5zcG9zZTpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yM2QoW1tbMSwgMl0sIFszLCA0XV0sIFtbLTEsIC0yXSwgWy0zLCAtNF1dXSk7XG4gKiB4LnByaW50KCk7XG4gKiB0Zi5laW5zdW0oJ2Jpai0+YmppJywgeCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIExpbWl0YXRpb25zOlxuICpcbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gb2YgZWluc3VtIGhhcyB0aGUgZm9sbG93aW5nIGxpbWl0YXRpb25zOlxuICpcbiAqIC0gRG9lcyBub3Qgc3VwcG9ydCA+MiBpbnB1dCB0ZW5zb3JzLlxuICogLSBEb2VzIG5vdCBzdXBwb3J0IGR1cGxpY2F0ZSBheGVzIGZvciBhbnkgZ2l2ZW4gaW5wdXQgdGVuc29yLiBFLmcuLCBlcXVhdGlvblxuICogICAnaWktPicgaXMgbm90IHN1cHBvcnRlZC5cbiAqIC0gVGhlIGAuLi5gIG5vdGF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIGVxdWF0aW9uIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIGNvbnRyYWN0aW9uLCBpbiB0aGUgc2FtZSBmb3JtYXQgYXNcbiAqIFtudW1weS5laW5zdW1dKGh0dHBzOi8vbnVtcHkub3JnL2RvYy9zdGFibGUvcmVmZXJlbmNlL2dlbmVyYXRlZC9udW1weS5laW5zdW0uaHRtbCkuXG4gKiBAcGFyYW0gdGVuc29ycyB0aGUgaW5wdXQocykgdG8gY29udHJhY3QgKGVhY2ggb25lIGEgVGVuc29yKSwgd2hvc2Ugc2hhcGVzXG4gKiAgICAgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBlcXVhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSBvdXRwdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ01hdHJpY2VzJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVpbnN1bV8oZXF1YXRpb246IHN0cmluZywgLi4udGVuc29yczogVGVuc29yW10pOiBUZW5zb3Ige1xuICBjb25zdCAkdGVuc29ycyA9XG4gICAgICB0ZW5zb3JzLm1hcCgodCwgaSkgPT4gY29udmVydFRvVGVuc29yKHQsIGB0ZW5zb3JzJHtpfWAsICdlaW5zdW0nKSk7XG4gIGNvbnN0IGF0dHJzOiBFaW5zdW1BdHRycyA9IHtlcXVhdGlvbn07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgRWluc3VtLCAkdGVuc29ycyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGVpbnN1bSA9IG9wKHtlaW5zdW1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Elu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes exponential linear element-wise: `x > 0 ? x : (e ^ x) - 1`.\n *\n * ```js\n * const x = tf.tensor1d([-1, 1, -3, 2]);\n *\n * x.elu().print();  // or tf.elu(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction elu_(x) {\n    const $x = convertToTensor(x, 'x', 'elu', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Elu, inputs);\n}\nexport const elu = op({ elu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0VsdSwgRWx1SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGV4cG9uZW50aWFsIGxpbmVhciBlbGVtZW50LXdpc2U6IGB4ID4gMCA/IHggOiAoZSBeIHgpIC0gMWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDEsIC0zLCAyXSk7XG4gKlxuICogeC5lbHUoKS5wcmludCgpOyAgLy8gb3IgdGYuZWx1KHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGVsdV88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2VsdScsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBFbHVJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEVsdSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGVsdSA9IG9wKHtlbHVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Erf } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Computes Gauss error function of the input `tf.Tensor` element-wise:\n * `erf(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, .1, -.1, .7]);\n *\n * x.erf().print(); // or tf.erf(x);\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction erf_(x) {\n    let $x = convertToTensor(x, 'x', 'erf');\n    util.assert($x.dtype === 'int32' || $x.dtype === 'float32', () => 'Input dtype must be `int32` or `float32`.');\n    if ($x.dtype === 'int32') {\n        $x = cast($x, 'float32');\n    }\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Erf, inputs);\n}\nexport const erf = op({ erf_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZXJmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsS0FBSyxLQUFLLE9BQU8sSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFDOUMsR0FBRyxFQUFFLENBQUMsMkNBQTJDLENBQUMsQ0FBQztJQUV2RCxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUFFO1FBQ3hCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQzFCO0lBRUQsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RXJmLCBFcmZJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtjYXN0fSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIEdhdXNzIGVycm9yIGZ1bmN0aW9uIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgZXJmKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIC4xLCAtLjEsIC43XSk7XG4gKlxuICogeC5lcmYoKS5wcmludCgpOyAvLyBvciB0Zi5lcmYoeCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGVyZl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdlcmYnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5kdHlwZSA9PT0gJ2ludDMyJyB8fCAkeC5kdHlwZSA9PT0gJ2Zsb2F0MzInLFxuICAgICAgKCkgPT4gJ0lucHV0IGR0eXBlIG11c3QgYmUgYGludDMyYCBvciBgZmxvYXQzMmAuJyk7XG5cbiAgaWYgKCR4LmR0eXBlID09PSAnaW50MzInKSB7XG4gICAgJHggPSBjYXN0KCR4LCAnZmxvYXQzMicpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBFcmZJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFcmYsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgZXJmID0gb3Aoe2VyZl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\n/**\n * Returns true if the axis specifies the inner most dimensions of the\n * array.\n */\nexport function axesAreInnerMostDims(axes, rank) {\n    for (let i = 0; i < axes.length; ++i) {\n        if (axes[axes.length - i - 1] !== rank - 1 - i) {\n            return false;\n        }\n    }\n    return true;\n}\nexport function combineLocations(outputLoc, reduceLoc, axes) {\n    const rank = outputLoc.length + reduceLoc.length;\n    const loc = [];\n    let outIdx = 0;\n    let reduceIdx = 0;\n    for (let dim = 0; dim < rank; dim++) {\n        if (axes.indexOf(dim) === -1) {\n            loc.push(outputLoc[outIdx++]);\n        }\n        else {\n            loc.push(reduceLoc[reduceIdx++]);\n        }\n    }\n    return loc;\n}\nexport function computeOutAndReduceShapes(aShape, axes) {\n    const outShape = [];\n    const rank = aShape.length;\n    for (let dim = 0; dim < rank; dim++) {\n        if (axes.indexOf(dim) === -1) {\n            outShape.push(aShape[dim]);\n        }\n    }\n    const reduceShape = axes.map(dim => aShape[dim]);\n    return [outShape, reduceShape];\n}\nexport function expandShapeToKeepDim(shape, axes) {\n    const reduceSubShape = axes.map(x => 1);\n    return combineLocations(shape, reduceSubShape, axes);\n}\nexport function assertAxesAreInnerMostDims(msg, axes, rank) {\n    util.assert(axesAreInnerMostDims(axes, rank), () => `${msg} supports only inner-most axes for now. ` +\n        `Got axes ${axes} and rank-${rank} input.`);\n}\n/**\n * Returns the axes permutation to be used with `tf.transpose`, if such\n * permutation is necessary. Otherwise it returns null. This method is used by\n * operations that operate only on inner-most axes.\n */\nexport function getAxesPermutation(axes, rank) {\n    if (axesAreInnerMostDims(axes, rank)) {\n        return null;\n    }\n    const result = [];\n    for (let i = 0; i < rank; ++i) {\n        if (axes.indexOf(i) === -1) {\n            result.push(i);\n        }\n    }\n    axes.forEach(axis => result.push(axis));\n    return result;\n}\n/** Returns the axes permutation that undoes the original permutation. */\nexport function getUndoAxesPermutation(axes) {\n    return axes.map((axis, i) => [i, axis])\n        .sort((a, b) => a[1] - b[1])\n        .map(x => x[0]);\n}\nexport function getInnerMostAxes(numAxes, rank) {\n    const res = [];\n    for (let i = rank - numAxes; i < rank; ++i) {\n        res.push(i);\n    }\n    return res;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXhpc191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYXhpc191dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDOzs7R0FHRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFjLEVBQUUsSUFBWTtJQUMvRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM5QyxPQUFPLEtBQUssQ0FBQztTQUNkO0tBQ0Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLFNBQW1CLEVBQUUsU0FBbUIsRUFBRSxJQUFjO0lBQzFELE1BQU0sSUFBSSxHQUFHLFNBQVMsQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQztJQUNqRCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFDZixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDaEIsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxHQUFHLEVBQUUsRUFBRTtRQUNyQyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDNUIsR0FBRyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQy9CO2FBQU07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QUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxPQUFPLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMxQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2I7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBheGlzIHNwZWNpZmllcyB0aGUgaW5uZXIgbW9zdCBkaW1lbnNpb25zIG9mIHRoZVxuICogYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzOiBudW1iZXJbXSwgcmFuazogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXhlcy5sZW5ndGg7ICsraSkge1xuICAgIGlmIChheGVzW2F4ZXMubGVuZ3RoIC0gaSAtIDFdICE9PSByYW5rIC0gMSAtIGkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lTG9jYXRpb25zKFxuICAgIG91dHB1dExvYzogbnVtYmVyW10sIHJlZHVjZUxvYzogbnVtYmVyW10sIGF4ZXM6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCByYW5rID0gb3V0cHV0TG9jLmxlbmd0aCArIHJlZHVjZUxvYy5sZW5ndGg7XG4gIGNvbnN0IGxvYyA9IFtdO1xuICBsZXQgb3V0SWR4ID0gMDtcbiAgbGV0IHJlZHVjZUlkeCA9IDA7XG4gIMKgIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IHJhbms7IGRpbSsrKSB7XG4gICAgaWYgKGF4ZXMuaW5kZXhPZihkaW0pID09PSAtMSkge1xuICAgICAgbG9jLnB1c2gob3V0cHV0TG9jW291dElkeCsrXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYy5wdXNoKHJlZHVjZUxvY1tyZWR1Y2VJZHgrK10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbG9jO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhcbiAgICBhU2hhcGU6IG51bWJlcltdLCBheGVzOiBudW1iZXJbXSk6IFtudW1iZXJbXSwgbnVtYmVyW11dIHtcbiAgY29uc3Qgb3V0U2hhcGUgPSBbXTtcbiAgY29uc3QgcmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gIGZvciAobGV0IGRpbSA9IDA7IGRpbSA8IHJhbms7IGRpbSsrKSB7XG4gICAgaWYgKGF4ZXMuaW5kZXhPZihkaW0pID09PSAtMSkge1xuICAgICAgb3V0U2hhcGUucHVzaChhU2hhcGVbZGltXSk7XG4gICAgfVxuICB9XG4gIGNvbnN0IHJlZHVjZVNoYXBlID0gYXhlcy5tYXAoZGltID0+IGFTaGFwZVtkaW1dKTtcbiAgcmV0dXJuIFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kU2hhcGVUb0tlZXBEaW0oXG4gICAgc2hhcGU6IG51bWJlcltdLCBheGVzOiBudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgY29uc3QgcmVkdWNlU3ViU2hhcGUgPSBheGVzLm1hcCh4ID0+IDEpO1xuICByZXR1cm4gY29tYmluZUxvY2F0aW9ucyhzaGFwZSwgcmVkdWNlU3ViU2hhcGUsIGF4ZXMpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXG4gICAgbXNnOiBzdHJpbmcsIGF4ZXM6IG51bWJlcltdLCByYW5rOiBudW1iZXIpOiB2b2lkIHtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSxcbiAgICAgICgpID0+IGAke21zZ30gc3VwcG9ydHMgb25seSBpbm5lci1tb3N0IGF4ZXMgZm9yIG5vdy4gYCArXG4gICAgICAgICAgYEdvdCBheGVzICR7YXhlc30gYW5kIHJhbmstJHtyYW5rfSBpbnB1dC5gKTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBheGVzIHBlcm11dGF0aW9uIHRvIGJlIHVzZWQgd2l0aCBgdGYudHJhbnNwb3NlYCwgaWYgc3VjaFxuICogcGVybXV0YXRpb24gaXMgbmVjZXNzYXJ5LiBPdGhlcndpc2UgaXQgcmV0dXJucyBudWxsLiBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5XG4gKiBvcGVyYXRpb25zIHRoYXQgb3BlcmF0ZSBvbmx5IG9uIGlubmVyLW1vc3QgYXhlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEF4ZXNQZXJtdXRhdGlvbihheGVzOiBudW1iZXJbXSwgcmFuazogbnVtYmVyKTogbnVtYmVyW118XG4gICAgbnVsbCB7XG4gIGlmIChheGVzQXJlSW5uZXJNb3N0RGltcyhheGVzLCByYW5rKSkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyArK2kpIHtcbiAgICBpZiAoYXhlcy5pbmRleE9mKGkpID09PSAtMSkge1xuICAgICAgcmVzdWx0LnB1c2goaSk7XG4gICAgfVxuICB9XG4gIGF4ZXMuZm9yRWFjaChheGlzID0+IHJlc3VsdC5wdXNoKGF4aXMpKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqIFJldHVybnMgdGhlIGF4ZXMgcGVybXV0YXRpb24gdGhhdCB1bmRvZXMgdGhlIG9yaWdpbmFsIHBlcm11dGF0aW9uLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuZG9BeGVzUGVybXV0YXRpb24oYXhlczogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIHJldHVybiBheGVzLm1hcCgoYXhpcywgaSkgPT4gW2ksIGF4aXNdKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IGFbMV0gLSBiWzFdKVxuICAgICAgLm1hcCh4ID0+IHhbMF0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW5uZXJNb3N0QXhlcyhudW1BeGVzOiBudW1iZXIsIHJhbms6IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgcmVzOiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gcmFuayAtIG51bUF4ZXM7IGkgPCByYW5rOyArK2kpIHtcbiAgICByZXMucHVzaChpKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Max } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the maximum of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If `axes` has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.max().print();  // or tf.max(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.max(axis).print();  // or tf.max(x, axis)\n * ```\n *\n * @param x The input tensor.\n * @param axis The dimension(s) to reduce. By default it reduces\n *     all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction max_(x, axis = null, keepDims = false) {\n    const $x = convertToTensor(x, 'x', 'max');\n    const inputs = { x: $x };\n    const attrs = { reductionIndices: axis, keepDims };\n    return ENGINE.runKernel(Max, inputs, attrs);\n}\nexport const max = op({ max_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbWF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFhLEVBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBRTNELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsR0FBRyxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge01heCwgTWF4QXR0cnMsIE1heElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtYXhpbXVtIG9mIGVsZW1lbnRzIGFjcm9zcyBkaW1lbnNpb25zIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGB0Zi5UZW5zb3JgIGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpblxuICogYGF4ZXNgLiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGhcbiAqIGxlbmd0aCAxLiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYVxuICogYHRmLlRlbnNvcmAgd2l0aCBhIHNpbmdsZSBlbGVtZW50IGlzIHJldHVybmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiB4Lm1heCgpLnByaW50KCk7ICAvLyBvciB0Zi5tYXgoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5tYXgoYXhpcykucHJpbnQoKTsgIC8vIG9yIHRmLm1heCh4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtYXhfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ21heCcpO1xuXG4gIGNvbnN0IGlucHV0czogTWF4SW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IE1heEF0dHJzID0ge3JlZHVjdGlvbkluZGljZXM6IGF4aXMsIGtlZXBEaW1zfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIE1heCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgbWF4ID0gb3Aoe21heF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Min } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the minimum value from the input.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the array is reduced by 1 for each entry in `axes`.\n * If `keepDims` is true, the reduced dimensions are retained with length 1.\n * If `axes` has no entries, all dimensions are reduced, and an array with a\n * single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.min().print();  // or tf.min(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.min(axis).print();  // or tf.min(x, axis)\n * ```\n *\n * @param x The input Tensor.\n * @param axis The dimension(s) to reduce. By default it reduces\n *     all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction min_(x, axis = null, keepDims = false) {\n    const $x = convertToTensor(x, 'x', 'min');\n    const inputs = { x: $x };\n    const attrs = { axis, keepDims };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    return ENGINE.runKernel(Min, inputs, attrs);\n}\nexport const min = op({ min_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFhLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBRXpDLDBEQUEwRDtJQUMxRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ1osR0FBRyxFQUFFLE1BQThCLEVBQ25DLEtBQTJCLENBQU0sQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWluLCBNaW5BdHRycywgTWluSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgZnJvbSB0aGUgaW5wdXQuXG4gKlxuICogUmVkdWNlcyB0aGUgaW5wdXQgYWxvbmcgdGhlIGRpbWVuc2lvbnMgZ2l2ZW4gaW4gYGF4ZXNgLiBVbmxlc3MgYGtlZXBEaW1zYFxuICogaXMgdHJ1ZSwgdGhlIHJhbmsgb2YgdGhlIGFycmF5IGlzIHJlZHVjZWQgYnkgMSBmb3IgZWFjaCBlbnRyeSBpbiBgYXhlc2AuXG4gKiBJZiBga2VlcERpbXNgIGlzIHRydWUsIHRoZSByZWR1Y2VkIGRpbWVuc2lvbnMgYXJlIHJldGFpbmVkIHdpdGggbGVuZ3RoIDEuXG4gKiBJZiBgYXhlc2AgaGFzIG5vIGVudHJpZXMsIGFsbCBkaW1lbnNpb25zIGFyZSByZWR1Y2VkLCBhbmQgYW4gYXJyYXkgd2l0aCBhXG4gKiBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5taW4oKS5wcmludCgpOyAgLy8gb3IgdGYubWluKHgpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHgubWluKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5taW4oeCwgYXhpcylcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uKHMpIHRvIHJlZHVjZS4gQnkgZGVmYXVsdCBpdCByZWR1Y2VzXG4gKiAgICAgYWxsIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ga2VlcERpbXMgSWYgdHJ1ZSwgcmV0YWlucyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBzaXplIDEuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnUmVkdWN0aW9uJ31cbiAqL1xuZnVuY3Rpb24gbWluXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpczogbnVtYmVyfG51bWJlcltdID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtaW4nKTtcblxuICBjb25zdCBpbnB1dHM6IE1pbklucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBNaW5BdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICBNaW4sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBtaW4gPSBvcCh7bWluX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Pow } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the power of one `tf.Tensor` to another. Supports broadcasting.\n *\n * Given a `tf.Tensor` x and a `tf.Tensor` y, this operation computes x^y for\n * corresponding elements in x and y. The result's dtype will be the upcasted\n * type of the `base` and `exp` dtypes.\n *\n * ```js\n * const a = tf.tensor([[2, 3], [4, 5]])\n * const b = tf.tensor([[1, 2], [3, 0]]).toInt();\n *\n * a.pow(b).print();  // or tf.pow(a, b)\n * ```\n *\n * ```js\n * const a = tf.tensor([[1, 2], [3, 4]])\n * const b = tf.tensor(2).toInt();\n *\n * a.pow(b).print();  // or tf.pow(a, b)\n * ```\n * We also expose `powStrict` which has the same signature as this op and\n * asserts that `base` and `exp` are the same shape (does not broadcast).\n *\n * @param base The base `tf.Tensor` to pow element-wise.\n * @param exp The exponent `tf.Tensor` to pow element-wise.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction pow_(base, exp) {\n    let $base = convertToTensor(base, 'base', 'pow');\n    let $exp = convertToTensor(exp, 'exp', 'pow');\n    [$base, $exp] = makeTypesMatch($base, $exp);\n    const inputs = { a: $base, b: $exp };\n    return ENGINE.runKernel(Pow, inputs);\n}\nexport const pow = op({ pow_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBUyxJQUFJLENBQ1QsSUFBdUIsRUFBRSxHQUFzQjtJQUNqRCxJQUFJLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqRCxJQUFJLElBQUksR0FBRyxlQUFlLENBQUMsR0FBRyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5QyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRTVDLE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFFOUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1BvdywgUG93SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBwb3dlciBvZiBvbmUgYHRmLlRlbnNvcmAgdG8gYW5vdGhlci4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIEdpdmVuIGEgYHRmLlRlbnNvcmAgeCBhbmQgYSBgdGYuVGVuc29yYCB5LCB0aGlzIG9wZXJhdGlvbiBjb21wdXRlcyB4XnkgZm9yXG4gKiBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIGluIHggYW5kIHkuIFRoZSByZXN1bHQncyBkdHlwZSB3aWxsIGJlIHRoZSB1cGNhc3RlZFxuICogdHlwZSBvZiB0aGUgYGJhc2VgIGFuZCBgZXhwYCBkdHlwZXMuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IoW1syLCAzXSwgWzQsIDVdXSlcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IoW1sxLCAyXSwgWzMsIDBdXSkudG9JbnQoKTtcbiAqXG4gKiBhLnBvdyhiKS5wcmludCgpOyAgLy8gb3IgdGYucG93KGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcihbWzEsIDJdLCBbMywgNF1dKVxuICogY29uc3QgYiA9IHRmLnRlbnNvcigyKS50b0ludCgpO1xuICpcbiAqIGEucG93KGIpLnByaW50KCk7ICAvLyBvciB0Zi5wb3coYSwgYilcbiAqIGBgYFxuICogV2UgYWxzbyBleHBvc2UgYHBvd1N0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBiYXNlYCBhbmQgYGV4cGAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIEBwYXJhbSBiYXNlIFRoZSBiYXNlIGB0Zi5UZW5zb3JgIHRvIHBvdyBlbGVtZW50LXdpc2UuXG4gKiBAcGFyYW0gZXhwIFRoZSBleHBvbmVudCBgdGYuVGVuc29yYCB0byBwb3cgZWxlbWVudC13aXNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0FyaXRobWV0aWMnfVxuICovXG5mdW5jdGlvbiBwb3dfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGJhc2U6IFRlbnNvcnxUZW5zb3JMaWtlLCBleHA6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYmFzZSA9IGNvbnZlcnRUb1RlbnNvcihiYXNlLCAnYmFzZScsICdwb3cnKTtcbiAgbGV0ICRleHAgPSBjb252ZXJ0VG9UZW5zb3IoZXhwLCAnZXhwJywgJ3BvdycpO1xuICBbJGJhc2UsICRleHBdID0gbWFrZVR5cGVzTWF0Y2goJGJhc2UsICRleHApO1xuXG4gIGNvbnN0IGlucHV0czogUG93SW5wdXRzID0ge2E6ICRiYXNlLCBiOiAkZXhwfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQb3csIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBwb3cgPSBvcCh7cG93X30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { isTypedArray } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-0 `tf.Tensor` (scalar) with the provided value and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.scalar` as it makes the code more readable.\n *\n * ```js\n * tf.scalar(3.14).print();\n * ```\n *\n * @param value The value of the scalar.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function scalar(value, dtype) {\n    if (((isTypedArray(value) && dtype !== 'string') || Array.isArray(value)) &&\n        dtype !== 'complex64') {\n        throw new Error('Error creating a new Scalar: value must be a primitive ' +\n            '(number|boolean|string)');\n    }\n    if (dtype === 'string' && isTypedArray(value) &&\n        !(value instanceof Uint8Array)) {\n        throw new Error('When making a scalar from encoded string, ' +\n            'the value must be `Uint8Array`.');\n    }\n    const shape = [];\n    const inferredShape = [];\n    return makeTensor(value, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhbGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2NhbGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRTdDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsS0FBdUMsRUFBRSxLQUFnQjtJQUMzRCxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckUsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCx5QkFBeUIsQ0FBQyxDQUFDO0tBQ2hDO0lBQ0QsSUFBSSxLQUFLLEtBQUssUUFBUSxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUM7UUFDekMsQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsRUFBRTtRQUNsQyxNQUFNLElBQUksS0FBSyxDQUNYLDRDQUE0QztZQUM1QyxpQ0FBaUMsQ0FBQyxDQUFDO0tBQ3hDO0lBQ0QsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFDO0lBQzNCLE1BQU0sYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUNuQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLENBQVcsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1NjYWxhcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGV9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7aXNUeXBlZEFycmF5fSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7bWFrZVRlbnNvcn0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgcmFuay0wIGB0Zi5UZW5zb3JgIChzY2FsYXIpIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlIGFuZCBkdHlwZS5cbiAqXG4gKiBUaGUgc2FtZSBmdW5jdGlvbmFsaXR5IGNhbiBiZSBhY2hpZXZlZCB3aXRoIGB0Zi50ZW5zb3JgLCBidXQgaW4gZ2VuZXJhbFxuICogd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi5zY2FsYXJgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogYGBganNcbiAqIHRmLnNjYWxhcigzLjE0KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgc2NhbGFyLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gc2NhbGFyKFxuICAgIHZhbHVlOiBudW1iZXJ8Ym9vbGVhbnxzdHJpbmd8VWludDhBcnJheSwgZHR5cGU/OiBEYXRhVHlwZSk6IFNjYWxhciB7XG4gIGlmICgoKGlzVHlwZWRBcnJheSh2YWx1ZSkgJiYgZHR5cGUgIT09ICdzdHJpbmcnKSB8fCBBcnJheS5pc0FycmF5KHZhbHVlKSkgJiZcbiAgICAgIGR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Vycm9yIGNyZWF0aW5nIGEgbmV3IFNjYWxhcjogdmFsdWUgbXVzdCBiZSBhIHByaW1pdGl2ZSAnICtcbiAgICAgICAgJyhudW1iZXJ8Ym9vbGVhbnxzdHJpbmcpJyk7XG4gIH1cbiAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiBpc1R5cGVkQXJyYXkodmFsdWUpICYmXG4gICAgICAhKHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdXaGVuIG1ha2luZyBhIHNjYWxhciBmcm9tIGVuY29kZWQgc3RyaW5nLCAnICtcbiAgICAgICAgJ3RoZSB2YWx1ZSBtdXN0IGJlIGBVaW50OEFycmF5YC4nKTtcbiAgfVxuICBjb25zdCBzaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgY29uc3QgaW5mZXJyZWRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWUsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSkgYXMgU2NhbGFyO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sqrt } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes square root of the input `tf.Tensor` element-wise: `y = sqrt(x)`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 4, -1]);\n *\n * x.sqrt().print();  // or tf.sqrt(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sqrt_(x) {\n    const $x = convertToTensor(x, 'x', 'sqrt', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Sqrt, inputs);\n}\nexport const sqrt = op({ sqrt_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NxcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdEQsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3FydCwgU3FydElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBzcXVhcmUgcm9vdCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOiBgeSA9IHNxcnQoeClgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgNCwgLTFdKTtcbiAqXG4gKiB4LnNxcnQoKS5wcmludCgpOyAgLy8gb3IgdGYuc3FydCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzcXJ0XzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3FydCcsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBTcXJ0SW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChTcXJ0LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IHNxcnQgPSBvcCh7c3FydF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes square of `x` element-wise: `x ^ 2`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, Math.sqrt(2), -1]);\n *\n * x.square().print();  // or tf.square(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction square_(x) {\n    const $x = convertToTensor(x, 'x', 'square');\n    const attrs = {};\n    return ENGINE.runKernel('Square', { x: $x }, attrs);\n}\nexport const square = op({ square_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3F1YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFakMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLE9BQU8sQ0FBbUIsQ0FBZTtJQUNoRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7SUFDakIsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNwRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHNxdWFyZSBvZiBgeGAgZWxlbWVudC13aXNlOiBgeCBeIDJgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgTWF0aC5zcXJ0KDIpLCAtMV0pO1xuICpcbiAqIHguc3F1YXJlKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNxdWFyZSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzcXVhcmVfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzcXVhcmUnKTtcbiAgY29uc3QgYXR0cnMgPSB7fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoJ1NxdWFyZScsIHt4OiAkeH0sIGF0dHJzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNxdWFyZSA9IG9wKHtzcXVhcmVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sum } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Computes the sum of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If axes has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.sum().print();  // or tf.sum(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.sum(axis).print();  // or tf.sum(x, axis)\n * ```\n *\n * @param x The input tensor to compute the sum over. If the dtype is `bool`\n *   it will be converted to `int32` and the output dtype will be `int32`.\n * @param axis The dimension(s) to reduce. By default it reduces\n *     all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction sum_(x, axis = null, keepDims = false) {\n    let $x = convertToTensor(x, 'x', 'sum');\n    if ($x.dtype === 'bool') {\n        $x = cast($x, 'int32');\n    }\n    const inputs = { x: $x };\n    const attrs = { axis, keepDims };\n    return ENGINE.runKernel(Sum, inputs, attrs);\n}\nexport const sum = op({ sum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUl6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZCRztBQUNILFNBQVMsSUFBSSxDQUNULENBQW9CLEVBQUUsT0FBd0IsSUFBSSxFQUFFLFFBQVEsR0FBRyxLQUFLO0lBQ3RFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksRUFBRSxDQUFDLEtBQUssS0FBSyxNQUFNLEVBQUU7UUFDdkIsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDeEI7SUFFRCxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBYSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLEdBQUcsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3VtLCBTdW1BdHRycywgU3VtSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Nhc3R9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHN1bSBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGVzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW5cbiAqIGBheGVzYC4gSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoXG4gKiBsZW5ndGggMS4gSWYgYXhlcyBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhXG4gKiBgdGYuVGVuc29yYCB3aXRoIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHguc3VtKCkucHJpbnQoKTsgIC8vIG9yIHRmLnN1bSh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LnN1bShheGlzKS5wcmludCgpOyAgLy8gb3IgdGYuc3VtKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGNvbXB1dGUgdGhlIHN1bSBvdmVyLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgXG4gKiAgIGl0IHdpbGwgYmUgY29udmVydGVkIHRvIGBpbnQzMmAgYW5kIHRoZSBvdXRwdXQgZHR5cGUgd2lsbCBiZSBgaW50MzJgLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSB0byByZWR1Y2UuIEJ5IGRlZmF1bHQgaXQgcmVkdWNlc1xuICogICAgIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHJldGFpbnMgcmVkdWNlZCBkaW1lbnNpb25zIHdpdGggc2l6ZSAxLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JlZHVjdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHN1bV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIGF4aXM6IG51bWJlcnxudW1iZXJbXSA9IG51bGwsIGtlZXBEaW1zID0gZmFsc2UpOiBUIHtcbiAgbGV0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3N1bScpO1xuICBpZiAoJHguZHR5cGUgPT09ICdib29sJykge1xuICAgICR4ID0gY2FzdCgkeCwgJ2ludDMyJyk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IFN1bUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBTdW1BdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBTdW0sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN1bSA9IG9wKHtzdW1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { parseAxisParam } from '../util';\nimport { abs } from './abs';\nimport * as axis_util from './axis_util';\nimport { max } from './max';\nimport { min } from './min';\nimport { op } from './operation';\nimport { pow } from './pow';\nimport { reshape } from './reshape';\nimport { scalar } from './scalar';\nimport { sqrt } from './sqrt';\nimport { square } from './square';\nimport { sum } from './sum';\n/**\n * Computes the norm of scalar, vectors, and matrices.\n * This function can compute several different vector norms (the 1-norm, the\n * Euclidean or 2-norm, the inf-norm, and in general the p-norm for p > 0)\n * and matrix norms (Frobenius, 1-norm, and inf-norm).\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * x.norm().print();  // or tf.norm(x)\n * ```\n *\n * @param x The input array.\n * @param ord Optional. Order of the norm. Supported norm types are\n * following:\n *\n *  | ord        | norm for matrices         | norm for vectors\n *  |------------|---------------------------|---------------------\n *  |'euclidean' |Frobenius norm             |2-norm\n *  |'fro'       |Frobenius norm\t           |\n *  |Infinity    |max(sum(abs(x), axis=1))   |max(abs(x))\n *  |-Infinity   |min(sum(abs(x), axis=1))   |min(abs(x))\n *  |1           |max(sum(abs(x), axis=0))   |sum(abs(x))\n *  |2           |                           |sum(abs(x)^2)^(1/2)\n *\n * @param axis Optional. If axis is null (the default), the input is\n * considered a vector and a single vector norm is computed over the entire\n * set of values in the Tensor, i.e. norm(x, ord) is equivalent\n * to norm(x.reshape([-1]), ord). If axis is an integer, the input\n * is considered a batch of vectors, and axis determines the axis in x\n * over which to compute vector norms. If axis is a 2-tuple of integer it is\n * considered a batch of matrices and axis determines the axes in NDArray\n * over which to compute a matrix norm.\n * @param keepDims Optional. If true, the norm has the same dimensionality\n * as the input.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction norm_(x, ord = 'euclidean', axis = null, keepDims = false) {\n    x = convertToTensor(x, 'x', 'norm');\n    const norm = normImpl(x, ord, axis);\n    let keepDimsShape = norm.shape;\n    if (keepDims) {\n        const axes = parseAxisParam(axis, x.shape);\n        keepDimsShape = axis_util.expandShapeToKeepDim(norm.shape, axes);\n    }\n    return reshape(norm, keepDimsShape);\n}\nfunction normImpl(x, p, axis = null) {\n    if (x.rank === 0) {\n        return abs(x);\n    }\n    // consider vector when no axis is specified\n    if (x.rank !== 1 && axis === null) {\n        return normImpl(reshape(x, [-1]), p, axis);\n    }\n    // vector\n    if (x.rank === 1 || typeof axis === 'number' ||\n        Array.isArray(axis) && axis.length === 1) {\n        if (p === 1) {\n            return sum(abs(x), axis);\n        }\n        if (p === Infinity) {\n            return max(abs(x), axis);\n        }\n        if (p === -Infinity) {\n            return min(abs(x), axis);\n        }\n        if (p === 'euclidean' || p === 2) {\n            // norm(x, 2) = sum(abs(xi) ^ 2) ^ 1/2\n            return sqrt(sum(pow(abs(x), scalar(2, 'int32')), axis));\n        }\n        throw new Error(`Error in norm: invalid ord value: ${p}`);\n    }\n    // matrix (assumption axis[0] < axis[1])\n    if (Array.isArray(axis) && axis.length === 2) {\n        if (p === 1) {\n            return max(sum(abs(x), axis[0]), axis[1] - 1);\n        }\n        if (p === Infinity) {\n            return max(sum(abs(x), axis[1]), axis[0]);\n        }\n        if (p === -Infinity) {\n            return min(sum(abs(x), axis[1]), axis[0]);\n        }\n        if (p === 'fro' || p === 'euclidean') {\n            // norm(x) = sqrt(sum(pow(x, 2)))\n            return sqrt(sum(square(x), axis));\n        }\n        throw new Error(`Error in norm: invalid ord value: ${p}`);\n    }\n    throw new Error(`Error in norm: invalid axis: ${axis}`);\n}\nexport const norm = op({ norm_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL25vcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUUxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUNILFNBQVMsS0FBSyxDQUNWLENBQW9CLEVBQUUsTUFBZ0MsV0FBVyxFQUNqRSxPQUF3QixJQUFJLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDaEQsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRXBDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxD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QUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0M7UUFDRCxJQUFJLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLLFdBQVcsRUFBRTtZQUNwQyxpQ0FBaUM7WUFDakMsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQ0FBcUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMzRDtJQUVELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLElBQUksRUFBRSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3BhcnNlQXhpc1BhcmFtfSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHthYnN9IGZyb20gJy4vYWJzJztcbmltcG9ydCAqIGFzIGF4aXNfdXRpbCBmcm9tICcuL2F4aXNfdXRpbCc7XG5pbXBvcnQge21heH0gZnJvbSAnLi9tYXgnO1xuaW1wb3J0IHttaW59IGZyb20gJy4vbWluJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cG93fSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi9zY2FsYXInO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuL3NxcnQnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4vc3F1YXJlJztcbmltcG9ydCB7c3VtfSBmcm9tICcuL3N1bSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG5vcm0gb2Ygc2NhbGFyLCB2ZWN0b3JzLCBhbmQgbWF0cmljZXMuXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiBjb21wdXRlIHNldmVyYWwgZGlmZmVyZW50IHZlY3RvciBub3JtcyAodGhlIDEtbm9ybSwgdGhlXG4gKiBFdWNsaWRlYW4gb3IgMi1ub3JtLCB0aGUgaW5mLW5vcm0sIGFuZCBpbiBnZW5lcmFsIHRoZSBwLW5vcm0gZm9yIHAgPiAwKVxuICogYW5kIG1hdHJpeCBub3JtcyAoRnJvYmVuaXVzLCAxLW5vcm0sIGFuZCBpbmYtbm9ybSkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICpcbiAqIHgubm9ybSgpLnByaW50KCk7ICAvLyBvciB0Zi5ub3JtKHgpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgYXJyYXkuXG4gKiBAcGFyYW0gb3JkIE9wdGlvbmFsLiBPcmRlciBvZiB0aGUgbm9ybS4gU3VwcG9ydGVkIG5vcm0gdHlwZXMgYXJlXG4gKiBmb2xsb3dpbmc6XG4gKlxuICogIHwgb3JkICAgICAgICB8IG5vcm0gZm9yIG1hdHJpY2VzICAgICAgICAgfCBub3JtIGZvciB2ZWN0b3JzXG4gKiAgfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgfCdldWNsaWRlYW4nIHxGcm9iZW5pdXMgbm9ybSAgICAgICAgICAgICB8Mi1ub3JtXG4gKiAgfCdmcm8nICAgICAgIHxGcm9iZW5pdXMgbm9ybVx0ICAgICAgICAgICB8XG4gKiAgfEluZmluaXR5ICAgIHxtYXgoc3VtKGFicyh4KSwgYXhpcz0xKSkgICB8bWF4KGFicyh4KSlcbiAqICB8LUluZmluaXR5ICAgfG1pbihzdW0oYWJzKHgpLCBheGlzPTEpKSAgIHxtaW4oYWJzKHgpKVxuICogIHwxICAgICAgICAgICB8bWF4KHN1bShhYnMoeCksIGF4aXM9MCkpICAgfHN1bShhYnMoeCkpXG4gKiAgfDIgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICB8c3VtKGFicyh4KV4yKV4oMS8yKVxuICpcbiAqIEBwYXJhbSBheGlzIE9wdGlvbmFsLiBJZiBheGlzIGlzIG51bGwgKHRoZSBkZWZhdWx0KSwgdGhlIGlucHV0IGlzXG4gKiBjb25zaWRlcmVkIGEgdmVjdG9yIGFuZCBhIHNpbmdsZSB2ZWN0b3Igbm9ybSBpcyBjb21wdXRlZCBvdmVyIHRoZSBlbnRpcmVcbiAqIHNldCBvZiB2YWx1ZXMgaW4gdGhlIFRlbnNvciwgaS5lLiBub3JtKHgsIG9yZCkgaXMgZXF1aXZhbGVudFxuICogdG8gbm9ybSh4LnJlc2hhcGUoWy0xXSksIG9yZCkuIElmIGF4aXMgaXMgYW4gaW50ZWdlciwgdGhlIGlucHV0XG4gKiBpcyBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgdmVjdG9ycywgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhpcyBpbiB4XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgdmVjdG9yIG5vcm1zLiBJZiBheGlzIGlzIGEgMi10dXBsZSBvZiBpbnRlZ2VyIGl0IGlzXG4gKiBjb25zaWRlcmVkIGEgYmF0Y2ggb2YgbWF0cmljZXMgYW5kIGF4aXMgZGV0ZXJtaW5lcyB0aGUgYXhlcyBpbiBOREFycmF5XG4gKiBvdmVyIHdoaWNoIHRvIGNvbXB1dGUgYSBtYXRyaXggbm9ybS5cbiAqIEBwYXJhbSBrZWVwRGltcyBPcHRpb25hbC4gSWYgdHJ1ZSwgdGhlIG5vcm0gaGFzIHRoZSBzYW1lIGRpbWVuc2lvbmFsaXR5XG4gKiBhcyB0aGUgaW5wdXQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBub3JtXyhcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgb3JkOiBudW1iZXJ8J2V1Y2xpZGVhbid8J2ZybycgPSAnZXVjbGlkZWFuJyxcbiAgICBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKTogVGVuc29yIHtcbiAgeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdub3JtJyk7XG5cbiAgY29uc3Qgbm9ybSA9IG5vcm1JbXBsKHgsIG9yZCwgYXhpcyk7XG4gIGxldCBrZWVwRGltc1NoYXBlID0gbm9ybS5zaGFwZTtcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgY29uc3QgYXhlcyA9IHBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICAgIGtlZXBEaW1zU2hhcGUgPSBheGlzX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obm9ybS5zaGFwZSwgYXhlcyk7XG4gIH1cbiAgcmV0dXJuIHJlc2hhcGUobm9ybSwga2VlcERpbXNTaGFwZSk7XG59XG5cbmZ1bmN0aW9uIG5vcm1JbXBsKFxuICAgIHg6IFRlbnNvciwgcDogbnVtYmVyfHN0cmluZywgYXhpczogbnVtYmVyfG51bWJlcltdID0gbnVsbCk6IFRlbnNvciB7XG4gIGlmICh4LnJhbmsgPT09IDApIHtcbiAgICByZXR1cm4gYWJzKHgpO1xuICB9XG5cbiAgLy8gY29uc2lkZXIgdmVjdG9yIHdoZW4gbm8gYXhpcyBpcyBzcGVjaWZpZWRcbiAgaWYgKHgucmFuayAhPT0gMSAmJiBheGlzID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG5vcm1JbXBsKHJlc2hhcGUoeCwgWy0xXSksIHAsIGF4aXMpO1xuICB9XG5cbiAgLy8gdmVjdG9yXG4gIGlmICh4LnJhbmsgPT09IDEgfHwgdHlwZW9mIGF4aXMgPT09ICdudW1iZXInIHx8XG4gICAgICBBcnJheS5pc0FycmF5KGF4aXMpICYmIGF4aXMubGVuZ3RoID09PSAxKSB7XG4gICAgaWYgKHAgPT09IDEpIHtcbiAgICAgIHJldHVybiBzdW0oYWJzKHgpLCBheGlzKTtcbiAgICB9XG4gICAgaWYgKHAgPT09IEluZmluaXR5KSB7XG4gICAgICByZXR1cm4gbWF4KGFicyh4KSwgYXhpcyk7XG4gICAgfVxuICAgIGlmIChwID09PSAtSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiBtaW4oYWJzKHgpLCBheGlzKTtcbiAgICB9XG4gICAgaWYgKHAgPT09ICdldWNsaWRlYW4nIHx8IHAgPT09IDIpIHtcbiAgICAgIC8vIG5vcm0oeCwgMikgPSBzdW0oYWJzKHhpKSBeIDIpIF4gMS8yXG4gICAgICByZXR1cm4gc3FydChzdW0ocG93KGFicyh4KSwgc2NhbGFyKDIsICdpbnQzMicpKSwgYXhpcykpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBFcnJvcihgRXJyb3IgaW4gbm9ybTogaW52YWxpZCBvcmQgdmFsdWU6ICR7cH1gKTtcbiAgfVxuXG4gIC8vIG1hdHJpeCAoYXNzdW1wdGlvbiBheGlzWzBdIDwgYXhpc1sxXSlcbiAgaWYgKEFycmF5LmlzQXJyYXkoYXhpcykgJiYgYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICBpZiAocCA9PT0gMSkge1xuICAgICAgcmV0dXJuIG1heChzdW0oYWJzKHgpLCBheGlzWzBdKSwgYXhpc1sxXSAtIDEpO1xuICAgIH1cbiAgICBpZiAocCA9PT0gSW5maW5pdHkpIHtcbiAgICAgIHJldHVybiBtYXgoc3VtKGFicyh4KSwgYXhpc1sxXSksIGF4aXNbMF0pO1xuICAgIH1cbiAgICBpZiAocCA9PT0gLUluZmluaXR5KSB7XG4gICAgICByZXR1cm4gbWluKHN1bShhYnMoeCksIGF4aXNbMV0pLCBheGlzWzBdKTtcbiAgICB9XG4gICAgaWYgKHAgPT09ICdmcm8nIHx8IHAgPT09ICdldWNsaWRlYW4nKSB7XG4gICAgICAvLyBub3JtKHgpID0gc3FydChzdW0ocG93KHgsIDIpKSlcbiAgICAgIHJldHVybiBzcXJ0KHN1bShzcXVhcmUoeCksIGF4aXMpKTtcbiAgICB9XG5cbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG5vcm06IGludmFsaWQgb3JkIHZhbHVlOiAke3B9YCk7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIG5vcm06IGludmFsaWQgYXhpczogJHtheGlzfWApO1xufVxuXG5leHBvcnQgY29uc3Qgbm9ybSA9IG9wKHtub3JtX30pO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { norm } from './norm';\nimport { op } from './operation';\n/**\n * Computes the Euclidean norm of scalar, vectors, and matrices.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * x.euclideanNorm().print();  // or tf.euclideanNorm(x)\n * ```\n *\n * @param x The input array.\n * @param axis Optional. If axis is null (the default), the input is\n * considered a vector and a single vector norm is computed over the entire\n * set of values in the Tensor, i.e. euclideanNorm(x) is equivalent\n * to euclideanNorm(x.reshape([-1])). If axis is an integer, the input\n * is considered a batch of vectors, and axis determines the axis in x\n * over which to compute vector norms. If axis is a 2-tuple of integer it is\n * considered a batch of matrices and axis determines the axes in NDArray\n * over which to compute a matrix norm.\n * @param keepDims Optional. If true, the norm has the same dimensionality\n * as the input.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction euclideanNorm_(x, axis = null, keepDims = false) {\n    return norm(x, 'euclidean', axis, keepDims);\n}\nexport const euclideanNorm = op({ euclideanNorm_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVjbGlkZWFuX25vcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9ldWNsaWRlYW5fbm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxTQUFTLGNBQWMsQ0FDbkIsQ0FBb0IsRUFBRSxPQUF3QixJQUFJLEVBQ2xELFFBQVEsR0FBRyxLQUFLO0lBQ2xCLE9BQU8sSUFBSSxDQUFDLENBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtub3JtfSBmcm9tICcuL25vcm0nO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBFdWNsaWRlYW4gbm9ybSBvZiBzY2FsYXIsIHZlY3RvcnMsIGFuZCBtYXRyaWNlcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzLCA0XSk7XG4gKlxuICogeC5ldWNsaWRlYW5Ob3JtKCkucHJpbnQoKTsgIC8vIG9yIHRmLmV1Y2xpZGVhbk5vcm0oeClcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBhcnJheS5cbiAqIEBwYXJhbSBheGlzIE9wdGlvbmFsLiBJZiBheGlzIGlzIG51bGwgKHRoZSBkZWZhdWx0KSwgdGhlIGlucHV0IGlzXG4gKiBjb25zaWRlcmVkIGEgdmVjdG9yIGFuZCBhIHNpbmdsZSB2ZWN0b3Igbm9ybSBpcyBjb21wdXRlZCBvdmVyIHRoZSBlbnRpcmVcbiAqIHNldCBvZiB2YWx1ZXMgaW4gdGhlIFRlbnNvciwgaS5lLiBldWNsaWRlYW5Ob3JtKHgpIGlzIGVxdWl2YWxlbnRcbiAqIHRvIGV1Y2xpZGVhbk5vcm0oeC5yZXNoYXBlKFstMV0pKS4gSWYgYXhpcyBpcyBhbiBpbnRlZ2VyLCB0aGUgaW5wdXRcbiAqIGlzIGNvbnNpZGVyZWQgYSBiYXRjaCBvZiB2ZWN0b3JzLCBhbmQgYXhpcyBkZXRlcm1pbmVzIHRoZSBheGlzIGluIHhcbiAqIG92ZXIgd2hpY2ggdG8gY29tcHV0ZSB2ZWN0b3Igbm9ybXMuIElmIGF4aXMgaXMgYSAyLXR1cGxlIG9mIGludGVnZXIgaXQgaXNcbiAqIGNvbnNpZGVyZWQgYSBiYXRjaCBvZiBtYXRyaWNlcyBhbmQgYXhpcyBkZXRlcm1pbmVzIHRoZSBheGVzIGluIE5EQXJyYXlcbiAqIG92ZXIgd2hpY2ggdG8gY29tcHV0ZSBhIG1hdHJpeCBub3JtLlxuICogQHBhcmFtIGtlZXBEaW1zIE9wdGlvbmFsLiBJZiB0cnVlLCB0aGUgbm9ybSBoYXMgdGhlIHNhbWUgZGltZW5zaW9uYWxpdHlcbiAqIGFzIHRoZSBpbnB1dC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdNYXRyaWNlcyd9XG4gKi9cbmZ1bmN0aW9uIGV1Y2xpZGVhbk5vcm1fKFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLFxuICAgIGtlZXBEaW1zID0gZmFsc2UpOiBUZW5zb3Ige1xuICByZXR1cm4gbm9ybSh4LCAnZXVjbGlkZWFuJywgYXhpcywga2VlcERpbXMpO1xufVxuXG5leHBvcnQgY29uc3QgZXVjbGlkZWFuTm9ybSA9IG9wKHtldWNsaWRlYW5Ob3JtX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Exp } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes exponential of the input `tf.Tensor` element-wise. `e ^ x`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, -3]);\n *\n * x.exp().print();  // or tf.exp(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction exp_(x) {\n    const $x = convertToTensor(x, 'x', 'exp');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Exp, inputs);\n}\nexport const exp = op({ exp_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZXhwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFMUMsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RXhwLCBFeHBJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgZXhwb25lbnRpYWwgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZS4gYGUgXiB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIC0zXSk7XG4gKlxuICogeC5leHAoKS5wcmludCgpOyAgLy8gb3IgdGYuZXhwKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGV4cF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2V4cCcpO1xuXG4gIGNvbnN0IGlucHV0czogRXhwSW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoRXhwLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IGV4cCA9IG9wKHtleHBffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ExpandDims } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Returns a `tf.Tensor` that has expanded rank, by inserting a dimension\n * into the tensor's shape.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * const axis = 1;\n * x.expandDims(axis).print();\n * ```\n *\n * @param x The input tensor whose dimensions are to be expanded.\n * @param axis The dimension index at which to insert shape of `1`. Defaults\n *     to 0 (the first dimension).\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction expandDims_(x, axis = 0) {\n    const $x = convertToTensor(x, 'x', 'expandDims', 'string_or_numeric');\n    util.assert(axis <= $x.rank, () => 'Axis must be <= rank of the tensor');\n    const inputs = { input: $x };\n    const attrs = { dim: axis };\n    return ENGINE.runKernel(ExpandDims, inputs, attrs);\n}\nexport const expandDims = op({ expandDims_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kX2RpbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9leHBhbmRfZGltcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQW9DLE1BQU0saUJBQWlCLENBQUM7QUFJOUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLENBQW9CLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDbkUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFdEUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sTUFBTSxHQUFxQixFQUFDLEtBQUssRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBb0IsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFFM0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixVQUFVLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RXhwYW5kRGltcywgRXhwYW5kRGltc0F0dHJzLCBFeHBhbmREaW1zSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgYSBgdGYuVGVuc29yYCB0aGF0IGhhcyBleHBhbmRlZCByYW5rLCBieSBpbnNlcnRpbmcgYSBkaW1lbnNpb25cbiAqIGludG8gdGhlIHRlbnNvcidzIHNoYXBlLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5leHBhbmREaW1zKGF4aXMpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHdob3NlIGRpbWVuc2lvbnMgYXJlIHRvIGJlIGV4cGFuZGVkLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgc2hhcGUgb2YgYDFgLiBEZWZhdWx0c1xuICogICAgIHRvIDAgKHRoZSBmaXJzdCBkaW1lbnNpb24pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIGV4cGFuZERpbXNfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzID0gMCk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdleHBhbmREaW1zJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG5cbiAgdXRpbC5hc3NlcnQoYXhpcyA8PSAkeC5yYW5rLCAoKSA9PiAnQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvcicpO1xuXG4gIGNvbnN0IGlucHV0czogRXhwYW5kRGltc0lucHV0cyA9IHtpbnB1dDogJHh9O1xuICBjb25zdCBhdHRyczogRXhwYW5kRGltc0F0dHJzID0ge2RpbTogYXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBFeHBhbmREaW1zLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBleHBhbmREaW1zID0gb3Aoe2V4cGFuZERpbXNffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Expm1 } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes exponential of the input `tf.Tensor` minus one element-wise.\n * `e ^ x - 1`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, -3]);\n *\n * x.expm1().print();  // or tf.expm1(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction expm1_(x) {\n    const $x = convertToTensor(x, 'x', 'expm1');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Expm1, inputs);\n}\nexport const expm1 = op({ expm1_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9leHBtMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7RXhwbTEsIEV4cG0xSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGV4cG9uZW50aWFsIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBtaW51cyBvbmUgZWxlbWVudC13aXNlLlxuICogYGUgXiB4IC0gMWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAtM10pO1xuICpcbiAqIHguZXhwbTEoKS5wcmludCgpOyAgLy8gb3IgdGYuZXhwbTEoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gZXhwbTFfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdleHBtMScpO1xuXG4gIGNvbnN0IGlucHV0czogRXhwbTFJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChFeHBtMSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBleHBtMSA9IG9wKHtleHBtMV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Tile } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Construct a tensor by repeating it the number of times given by reps.\n *\n * This operation creates a new tensor by replicating `input` `reps`\n * times. The output tensor's `i`th dimension has `input.shape[i] *\n * reps[i]` elements, and the values of `input` are replicated\n * `reps[i]` times along the `i`th dimension. For example, tiling\n * `[a, b, c, d]` by `[2]` produces `[a, b, c, d, a, b, c, d]`.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n *\n * a.tile([2]).print();    // or a.tile([2])\n * ```\n *\n * ```js\n * const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * a.tile([1, 2]).print();  // or a.tile([1, 2])\n * ```\n * @param x The tensor to tile.\n * @param reps Determines the number of replications per dimension.\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction tile_(x, reps) {\n    const $x = convertToTensor(x, 'x', 'tile', 'string_or_numeric');\n    util.assert($x.rank === reps.length, () => `Error in transpose: rank of input ${$x.rank} ` +\n        `must match length of reps ${reps}.`);\n    const inputs = { x: $x };\n    const attrs = { reps };\n    return ENGINE.runKernel(Tile, inputs, attrs);\n}\nexport const tile = op({ tile_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3RpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F3Qkc7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZSxFQUFFLElBQWM7SUFDOUQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDaEUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLElBQUksQ0FBQyxNQUFNLEVBQ3ZCLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsSUFBSSxHQUFHO1FBQ2pELDZCQUE2QixJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRTlDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFjLEVBQUMsSUFBSSxFQUFDLENBQUM7SUFFaEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixJQUFJLEVBQUUsTUFBbUMsRUFDekMsS0FBZ0MsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RpbGUsIFRpbGVBdHRycywgVGlsZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb25zdHJ1Y3QgYSB0ZW5zb3IgYnkgcmVwZWF0aW5nIGl0IHRoZSBudW1iZXIgb2YgdGltZXMgZ2l2ZW4gYnkgcmVwcy5cbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBjcmVhdGVzIGEgbmV3IHRlbnNvciBieSByZXBsaWNhdGluZyBgaW5wdXRgIGByZXBzYFxuICogdGltZXMuIFRoZSBvdXRwdXQgdGVuc29yJ3MgYGlgdGggZGltZW5zaW9uIGhhcyBgaW5wdXQuc2hhcGVbaV0gKlxuICogcmVwc1tpXWAgZWxlbWVudHMsIGFuZCB0aGUgdmFsdWVzIG9mIGBpbnB1dGAgYXJlIHJlcGxpY2F0ZWRcbiAqIGByZXBzW2ldYCB0aW1lcyBhbG9uZyB0aGUgYGlgdGggZGltZW5zaW9uLiBGb3IgZXhhbXBsZSwgdGlsaW5nXG4gKiBgW2EsIGIsIGMsIGRdYCBieSBgWzJdYCBwcm9kdWNlcyBgW2EsIGIsIGMsIGQsIGEsIGIsIGMsIGRdYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gKlxuICogYS50aWxlKFsyXSkucHJpbnQoKTsgICAgLy8gb3IgYS50aWxlKFsyXSlcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGEudGlsZShbMSwgMl0pLnByaW50KCk7ICAvLyBvciBhLnRpbGUoWzEsIDJdKVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHRpbGUuXG4gKiBAcGFyYW0gcmVwcyBEZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgcmVwbGljYXRpb25zIHBlciBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHRpbGVfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSwgcmVwczogbnVtYmVyW10pOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGlsZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IHJlcHMubGVuZ3RoLFxuICAgICAgKCkgPT4gYEVycm9yIGluIHRyYW5zcG9zZTogcmFuayBvZiBpbnB1dCAkeyR4LnJhbmt9IGAgK1xuICAgICAgICAgIGBtdXN0IG1hdGNoIGxlbmd0aCBvZiByZXBzICR7cmVwc30uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBUaWxlSW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IFRpbGVBdHRycyA9IHtyZXBzfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFRpbGUsIGlucHV0cyBhcyB1bmtub3duIGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgYXR0cnMgYXMgdW5rbm93biBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdGlsZSA9IG9wKHt0aWxlX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { expandDims } from './expand_dims';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nimport { tile } from './tile';\n/**\n * Create an identity matrix.\n *\n * @param numRows Number of rows.\n * @param numColumns Number of columns. Defaults to `numRows`.\n * @param batchShape If provided, will add the batch shape to the beginning\n *   of the shape of the returned `tf.Tensor` by repeating the identity\n *   matrix.\n * @param dtype Data type.\n * @returns Identity matrix of the specified size and data type, possibly\n *   with batch repetition if `batchShape` is specified.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction eye_(numRows, numColumns, batchShape, dtype = 'float32') {\n    if (numColumns == null) {\n        numColumns = numRows;\n    }\n    const buff = buffer([numRows, numColumns], dtype);\n    const n = numRows <= numColumns ? numRows : numColumns;\n    for (let i = 0; i < n; ++i) {\n        buff.set(1, i, i);\n    }\n    const out = reshape(buff.toTensor(), [numRows, numColumns]);\n    if (batchShape == null) {\n        return out;\n    }\n    else {\n        if (batchShape.length === 1) {\n            return tile(expandDims(out, 0), [batchShape[0], 1, 1]);\n        }\n        else if (batchShape.length === 2) {\n            // tslint:disable-next-line:no-unnecessary-type-assertion\n            return tile(expandDims(expandDims(out, 0), 0), [batchShape[0], batchShape[1], 1, 1]);\n        }\n        else if (batchShape.length === 3) {\n            // tslint:disable-next-line:no-unnecessary-type-assertion\n            return tile(expandDims(expandDims(expandDims(out, 0), 0), 0), [\n                batchShape[0], batchShape[1], batchShape[2], 1, 1\n            ]);\n        }\n        else {\n            throw new Error(`eye() currently supports only 1D and 2D ` +\n                // tslint:disable-next-line:no-any\n                `batchShapes, but received ${batchShape.length}D.`);\n        }\n    }\n}\nexport const eye = op({ eye_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXllLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZXllLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUU1Qjs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBUyxJQUFJLENBQ1QsT0FBZSxFQUFFLFVBQW1CLEVBQ3BDLFVBSXdFLEVBQ3hFLFFBQWtCLFNBQVM7SUFDN0IsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3RCLFVBQVUsR0FBRyxPQUFPLENBQUM7S0FDdEI7SUFDRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEQsTUFBTSxDQUFDLEdBQUcsT0FBTyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUM7SUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUMxQixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDbkI7SUFDRCxNQUFNLEdBQUcsR0FBYSxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDdEUsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3RCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7U0FBTTtRQUNMLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDM0IsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQWEsQ0FBQztTQUNwRTthQUFNLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEMseURBQXlEO1lBQ3pELE9BQU8sSUFBSSxDQUNBLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNqQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFhLENBQUM7U0FDOUQ7YUFBTSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ2xDLHlEQUF5RDtZQUN6RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3JELFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDO2FBQ2xELENBQWEsQ0FBQztTQUN2QjthQUFNO1lBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDWCwwQ0FBMEM7Z0JBQzFDLGtDQUFrQztnQkFDbEMsNkJBQThCLFVBQWtCLENBQUMsTUFBTSxJQUFJLENBQUMsQ0FBQztTQUNsRTtLQUNGO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBQyxJQUFJLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2J1ZmZlcn0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHtleHBhbmREaW1zfSBmcm9tICcuL2V4cGFuZF9kaW1zJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7dGlsZX0gZnJvbSAnLi90aWxlJztcblxuLyoqXG4gKiBDcmVhdGUgYW4gaWRlbnRpdHkgbWF0cml4LlxuICpcbiAqIEBwYXJhbSBudW1Sb3dzIE51bWJlciBvZiByb3dzLlxuICogQHBhcmFtIG51bUNvbHVtbnMgTnVtYmVyIG9mIGNvbHVtbnMuIERlZmF1bHRzIHRvIGBudW1Sb3dzYC5cbiAqIEBwYXJhbSBiYXRjaFNoYXBlIElmIHByb3ZpZGVkLCB3aWxsIGFkZCB0aGUgYmF0Y2ggc2hhcGUgdG8gdGhlIGJlZ2lubmluZ1xuICogICBvZiB0aGUgc2hhcGUgb2YgdGhlIHJldHVybmVkIGB0Zi5UZW5zb3JgIGJ5IHJlcGVhdGluZyB0aGUgaWRlbnRpdHlcbiAqICAgbWF0cml4LlxuICogQHBhcmFtIGR0eXBlIERhdGEgdHlwZS5cbiAqIEByZXR1cm5zIElkZW50aXR5IG1hdHJpeCBvZiB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIGRhdGEgdHlwZSwgcG9zc2libHlcbiAqICAgd2l0aCBiYXRjaCByZXBldGl0aW9uIGlmIGBiYXRjaFNoYXBlYCBpcyBzcGVjaWZpZWQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5mdW5jdGlvbiBleWVfKFxuICAgIG51bVJvd3M6IG51bWJlciwgbnVtQ29sdW1ucz86IG51bWJlcixcbiAgICBiYXRjaFNoYXBlPzpcbiAgICAgICAgW1xuICAgICAgICAgIG51bWJlclxuICAgICAgICBdfFtudW1iZXIsXG4gICAgICAgICAgIG51bWJlcl18W251bWJlciwgbnVtYmVyLCBudW1iZXJdfFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGR0eXBlOiBEYXRhVHlwZSA9ICdmbG9hdDMyJyk6IFRlbnNvcjJEIHtcbiAgaWYgKG51bUNvbHVtbnMgPT0gbnVsbCkge1xuICAgIG51bUNvbHVtbnMgPSBudW1Sb3dzO1xuICB9XG4gIGNvbnN0IGJ1ZmYgPSBidWZmZXIoW251bVJvd3MsIG51bUNvbHVtbnNdLCBkdHlwZSk7XG4gIGNvbnN0IG4gPSBudW1Sb3dzIDw9IG51bUNvbHVtbnMgPyBudW1Sb3dzIDogbnVtQ29sdW1ucztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyArK2kpIHtcbiAgICBidWZmLnNldCgxLCBpLCBpKTtcbiAgfVxuICBjb25zdCBvdXQ6IFRlbnNvcjJEID0gcmVzaGFwZShidWZmLnRvVGVuc29yKCksIFtudW1Sb3dzLCBudW1Db2x1bW5zXSk7XG4gIGlmIChiYXRjaFNoYXBlID09IG51bGwpIHtcbiAgICByZXR1cm4gb3V0O1xuICB9IGVsc2Uge1xuICAgIGlmIChiYXRjaFNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIHRpbGUoZXhwYW5kRGltcyhvdXQsIDApLCBbYmF0Y2hTaGFwZVswXSwgMSwgMV0pIGFzIFRlbnNvcjJEO1xuICAgIH0gZWxzZSBpZiAoYmF0Y2hTaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgcmV0dXJuIHRpbGUoXG4gICAgICAgICAgICAgICAgIGV4cGFuZERpbXMoZXhwYW5kRGltcyhvdXQsIDApLCAwKSxcbiAgICAgICAgICAgICAgICAgW2JhdGNoU2hhcGVbMF0sIGJhdGNoU2hhcGVbMV0sIDEsIDFdKSBhcyBUZW5zb3IyRDtcbiAgICB9IGVsc2UgaWYgKGJhdGNoU2hhcGUubGVuZ3RoID09PSAzKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgIHJldHVybiB0aWxlKGV4cGFuZERpbXMoZXhwYW5kRGltcyhleHBhbmREaW1zKG91dCwgMCksIDApLCAwKSwgW1xuICAgICAgICAgICAgICAgYmF0Y2hTaGFwZVswXSwgYmF0Y2hTaGFwZVsxXSwgYmF0Y2hTaGFwZVsyXSwgMSwgMVxuICAgICAgICAgICAgIF0pIGFzIFRlbnNvcjJEO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYGV5ZSgpIGN1cnJlbnRseSBzdXBwb3J0cyBvbmx5IDFEIGFuZCAyRCBgICtcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAgICAgYGJhdGNoU2hhcGVzLCBidXQgcmVjZWl2ZWQgJHsoYmF0Y2hTaGFwZSBhcyBhbnkpLmxlbmd0aH1ELmApO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgY29uc3QgZXllID0gb3Aoe2V5ZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Floor } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes floor of input `tf.Tensor` element-wise: `floor(x)`.\n *\n * ```js\n * const x = tf.tensor1d([.6, 1.1, -3.3]);\n *\n * x.floor().print();  // or tf.floor(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction floor_(x) {\n    const $x = convertToTensor(x, 'x', 'floor', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Floor, inputs);\n}\nexport const floor = op({ floor_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9mbG9vci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsTUFBTSxDQUFtQixDQUFlO0lBQy9DLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV2RCxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0Zsb29yLCBGbG9vcklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBmbG9vciBvZiBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBmbG9vcih4KWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHguZmxvb3IoKS5wcmludCgpOyAgLy8gb3IgdGYuZmxvb3IoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gZmxvb3JfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdmbG9vcicsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBGbG9vcklucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZsb29yLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IGZsb29yID0gb3Aoe2Zsb29yX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { GatherV2 } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Gather slices from tensor `x`'s axis `axis` according to `indices`.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * const indices = tf.tensor1d([1, 3, 3], 'int32');\n *\n * x.gather(indices).print();\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const indices = tf.tensor1d([1, 1, 0], 'int32');\n *\n * x.gather(indices).print();\n * ```\n * @param x The input tensor whose slices are to be gathered.\n * @param indices The indices of the values to extract.\n * @param axis The axis over which to select values. Defaults to 0.\n * @param batchDims Optional. The number of batch dimensions. It must be less\n *     than or equal to rank(indices). Defaults to 0.\n *     The output tensor will have shape of\n *     `x.shape[:axis] + indices.shape[batchDims:] + x.shape[axis + 1:]`\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction gather_(x, indices, axis = 0, batchDims = 0) {\n    const $x = convertToTensor(x, 'x', 'gather');\n    const $indices = convertToTensor(indices, 'indices', 'gather', 'int32');\n    const inputs = { x: $x, indices: $indices };\n    const attrs = { axis, batchDims };\n    return ENGINE.runKernel(GatherV2, inputs, attrs);\n}\nexport const gather = op({ gather_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZ2F0aGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBZ0MsTUFBTSxpQkFBaUIsQ0FBQztBQUl4RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXlCRztBQUNILFNBQVMsT0FBTyxDQUNaLENBQWUsRUFBRSxPQUEwQixFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsU0FBUyxHQUFHLENBQUM7SUFDdEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDN0MsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXhFLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQzFELE1BQU0sS0FBSyxHQUFrQixFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsQ0FBQztJQUUvQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFFBQVEsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQyxFQUFDLE9BQU8sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtHYXRoZXJWMiwgR2F0aGVyVjJBdHRycywgR2F0aGVyVjJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBHYXRoZXIgc2xpY2VzIGZyb20gdGVuc29yIGB4YCdzIGF4aXMgYGF4aXNgIGFjY29yZGluZyB0byBgaW5kaWNlc2AuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjFkKFsxLCAzLCAzXSwgJ2ludDMyJyk7XG4gKlxuICogeC5nYXRoZXIoaW5kaWNlcykucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjFkKFsxLCAxLCAwXSwgJ2ludDMyJyk7XG4gKlxuICogeC5nYXRoZXIoaW5kaWNlcykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB3aG9zZSBzbGljZXMgYXJlIHRvIGJlIGdhdGhlcmVkLlxuICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgb2YgdGhlIHZhbHVlcyB0byBleHRyYWN0LlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgb3ZlciB3aGljaCB0byBzZWxlY3QgdmFsdWVzLiBEZWZhdWx0cyB0byAwLlxuICogQHBhcmFtIGJhdGNoRGltcyBPcHRpb25hbC4gVGhlIG51bWJlciBvZiBiYXRjaCBkaW1lbnNpb25zLiBJdCBtdXN0IGJlIGxlc3NcbiAqICAgICB0aGFuIG9yIGVxdWFsIHRvIHJhbmsoaW5kaWNlcykuIERlZmF1bHRzIHRvIDAuXG4gKiAgICAgVGhlIG91dHB1dCB0ZW5zb3Igd2lsbCBoYXZlIHNoYXBlIG9mXG4gKiAgICAgYHguc2hhcGVbOmF4aXNdICsgaW5kaWNlcy5zaGFwZVtiYXRjaERpbXM6XSArIHguc2hhcGVbYXhpcyArIDE6XWBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gZ2F0aGVyXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGluZGljZXM6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzID0gMCwgYmF0Y2hEaW1zID0gMCk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdnYXRoZXInKTtcbiAgY29uc3QgJGluZGljZXMgPSBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnZ2F0aGVyJywgJ2ludDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBHYXRoZXJWMklucHV0cyA9IHt4OiAkeCwgaW5kaWNlczogJGluZGljZXN9O1xuICBjb25zdCBhdHRyczogR2F0aGVyVjJBdHRycyA9IHtheGlzLCBiYXRjaERpbXN9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgR2F0aGVyVjIsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdhdGhlciA9IG9wKHtnYXRoZXJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Greater } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a > b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.greater(b).print();\n * ```\n *\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction greater_(a, b) {\n    let $a = convertToTensor(a, 'a', 'greater', 'string_or_numeric');\n    let $b = convertToTensor(b, 'b', 'greater', 'string_or_numeric');\n    [$a, $b] = makeTypesMatch($a, $b);\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Greater, inputs);\n}\nexport const greater = op({ greater_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2dyZWF0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsUUFBUSxDQUNiLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDakUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDakUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBa0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUU3QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7R3JlYXRlciwgR3JlYXRlcklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIChhID4gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5ncmVhdGVyKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIGdyZWF0ZXJfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnZ3JlYXRlcicsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZ3JlYXRlcicsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcblxuICBjb25zdCBpbnB1dHM6IEdyZWF0ZXJJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChHcmVhdGVyLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgZ3JlYXRlciA9IG9wKHtncmVhdGVyX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { GreaterEqual } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a >= b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.greaterEqual(b).print();\n * ```\n *\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction greaterEqual_(a, b) {\n    let $a = convertToTensor(a, 'a', 'greaterEqual', 'string_or_numeric');\n    let $b = convertToTensor(b, 'b', 'greaterEqual', 'string_or_numeric');\n    [$a, $b] = makeTypesMatch($a, $b);\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(GreaterEqual, inputs);\n}\nexport const greaterEqual = op({ greaterEqual_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlYXRlcl9lcXVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2dyZWF0ZXJfZXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUFxQixNQUFNLGlCQUFpQixDQUFDO0FBR2pFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsYUFBYSxDQUNsQixDQUFvQixFQUFFLENBQW9CO0lBQzVDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQXVCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbEQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0dyZWF0ZXJFcXVhbCwgR3JlYXRlckVxdWFsSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgPj0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5ncmVhdGVyRXF1YWwoYikucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gZ3JlYXRlckVxdWFsXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ2dyZWF0ZXJFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZ3JlYXRlckVxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogR3JlYXRlckVxdWFsSW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoR3JlYXRlckVxdWFsLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuXG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsID0gb3Aoe2dyZWF0ZXJFcXVhbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { IsFinite } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns which elements of x are finite.\n *\n * ```js\n * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n *\n * x.isFinite().print();  // or tf.isNaN(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction isFinite_(x) {\n    const $x = convertToTensor(x, 'x', 'isFinite');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(IsFinite, inputs);\n}\nexport const isFinite = op({ isFinite_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfZmluaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaXNfZmluaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsU0FBUyxDQUFtQixDQUFlO0lBQ2xELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV2QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtJc0Zpbml0ZSwgSXNGaW5pdGVJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB3aGljaCBlbGVtZW50cyBvZiB4IGFyZSBmaW5pdGUuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbTmFOLCBJbmZpbml0eSwgLUluZmluaXR5LCAwLCAxXSk7XG4gKlxuICogeC5pc0Zpbml0ZSgpLnByaW50KCk7ICAvLyBvciB0Zi5pc05hTih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgVGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBpc0Zpbml0ZV88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2lzRmluaXRlJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBJc0Zpbml0ZUlucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoSXNGaW5pdGUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgaXNGaW5pdGUgPSBvcCh7aXNGaW5pdGVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { IsInf } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns which elements of x are Infinity or -Infinity.\n *\n * ```js\n * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n *\n * x.isInf().print();  // or tf.isNaN(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction isInf_(x) {\n    const $x = convertToTensor(x, 'x', 'isInf');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(IsInf, inputs);\n}\nexport const isInf = op({ isInf_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfaW5mLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaXNfaW5mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEtBQUssRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBR25ELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxNQUFNLENBQW1CLENBQWU7SUFDL0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUMsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXBDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0lzSW5mLCBJc0luZklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHdoaWNoIGVsZW1lbnRzIG9mIHggYXJlIEluZmluaXR5IG9yIC1JbmZpbml0eS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFtOYU4sIEluZmluaXR5LCAtSW5maW5pdHksIDAsIDFdKTtcbiAqXG4gKiB4LmlzSW5mKCkucHJpbnQoKTsgIC8vIG9yIHRmLmlzTmFOKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGlzSW5mXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnaXNJbmYnKTtcblxuICBjb25zdCBpbnB1dHM6IElzSW5mSW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChJc0luZiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBpc0luZiA9IG9wKHtpc0luZl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { IsNan } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns which elements of x are NaN.\n *\n * ```js\n * const x = tf.tensor1d([NaN, Infinity, -Infinity, 0, 1]);\n *\n * x.isNaN().print();  // or tf.isNaN(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction isNaN_(x) {\n    const $x = convertToTensor(x, 'x', 'isNaN');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(IsNan, inputs);\n}\nexport const isNaN = op({ isNaN_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfbmFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaXNfbmFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEtBQUssRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBR25ELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxNQUFNLENBQW1CLENBQWU7SUFDL0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXBDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0lzTmFuLCBJc05hbklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHdoaWNoIGVsZW1lbnRzIG9mIHggYXJlIE5hTi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFtOYU4sIEluZmluaXR5LCAtSW5maW5pdHksIDAsIDFdKTtcbiAqXG4gKiB4LmlzTmFOKCkucHJpbnQoKTsgIC8vIG9yIHRmLmlzTmFOKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCBUZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGlzTmFOXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnaXNOYU4nKTtcbiAgY29uc3QgaW5wdXRzOiBJc05hbklucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoSXNOYW4sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgaXNOYU4gPSBvcCh7aXNOYU5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LeakyRelu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes leaky rectified linear element-wise.\n *\n * See\n * [http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf](\n *     http://web.stanford.edu/~awni/papers/relu_hybrid_icml2013_final.pdf)\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.leakyRelu(0.1).print();  // or tf.leakyRelu(x, 0.1)\n * ```\n * @param x The input tensor.\n * @param alpha The scaling factor for negative values, defaults to 0.2.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction leakyRelu_(x, alpha = 0.2) {\n    const $x = convertToTensor(x, 'x', 'leakyRelu');\n    const inputs = { x: $x };\n    const attrs = { alpha };\n    return ENGINE.runKernel(LeakyRelu, inputs, attrs);\n}\nexport const leakyRelu = op({ leakyRelu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVha3lfcmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xlYWt5X3JlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQyxNQUFNLGlCQUFpQixDQUFDO0FBSTNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxVQUFVLENBQW1CLENBQWUsRUFBRSxLQUFLLEdBQUcsR0FBRztJQUNoRSxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVoRCxNQUFNLE1BQU0sR0FBb0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDeEMsTUFBTSxLQUFLLEdBQW1CLEVBQUMsS0FBSyxFQUFDLENBQUM7SUFFdEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixTQUFTLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDOUUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TGVha3lSZWx1LCBMZWFreVJlbHVBdHRycywgTGVha3lSZWx1SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgbGVha3kgcmVjdGlmaWVkIGxpbmVhciBlbGVtZW50LXdpc2UuXG4gKlxuICogU2VlXG4gKiBbaHR0cDovL3dlYi5zdGFuZm9yZC5lZHUvfmF3bmkvcGFwZXJzL3JlbHVfaHlicmlkX2ljbWwyMDEzX2ZpbmFsLnBkZl0oXG4gKiAgICAgaHR0cDovL3dlYi5zdGFuZm9yZC5lZHUvfmF3bmkvcGFwZXJzL3JlbHVfaHlicmlkX2ljbWwyMDEzX2ZpbmFsLnBkZilcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LmxlYWt5UmVsdSgwLjEpLnByaW50KCk7ICAvLyBvciB0Zi5sZWFreVJlbHUoeCwgMC4xKVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGFscGhhIFRoZSBzY2FsaW5nIGZhY3RvciBmb3IgbmVnYXRpdmUgdmFsdWVzLCBkZWZhdWx0cyB0byAwLjIuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGxlYWt5UmVsdV88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlLCBhbHBoYSA9IDAuMik6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdsZWFreVJlbHUnKTtcblxuICBjb25zdCBpbnB1dHM6IExlYWt5UmVsdUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBMZWFreVJlbHVBdHRycyA9IHthbHBoYX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBMZWFreVJlbHUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdSA9IG9wKHtsZWFreVJlbHVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Less } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a < b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.less(b).print();\n * ```\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction less_(a, b) {\n    let $a = convertToTensor(a, 'a', 'less', 'string_or_numeric');\n    let $b = convertToTensor(b, 'b', 'less', 'string_or_numeric');\n    [$a, $b] = makeTypesMatch($a, $b);\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Less, inputs);\n}\nexport const less = op({ less_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLEtBQUssQ0FDVixDQUFvQixFQUFFLENBQW9CO0lBQzVDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlELElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQzlELENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUUxQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TGVzcywgTGVzc0lucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIHRydXRoIHZhbHVlIG9mIChhIDwgYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsyLCAyLCAyXSk7XG4gKlxuICogYS5sZXNzKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIGR0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdMb2dpY2FsJ31cbiAqL1xuZnVuY3Rpb24gbGVzc188VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdsZXNzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogTGVzc0lucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExlc3MsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBsZXNzID0gb3Aoe2xlc3NffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LessEqual } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a <= b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([2, 2, 2]);\n *\n * a.lessEqual(b).print();\n * ```\n *\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction lessEqual_(a, b) {\n    let $a = convertToTensor(a, 'a', 'lessEqual', 'string_or_numeric');\n    let $b = convertToTensor(b, 'b', 'lessEqual', 'string_or_numeric');\n    [$a, $b] = makeTypesMatch($a, $b);\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(LessEqual, inputs);\n}\nexport const lessEqual = op({ lessEqual_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzc19lcXVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xlc3NfZXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsVUFBVSxDQUNmLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbkUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbkUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBb0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUUvQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TGVzc0VxdWFsLCBMZXNzRXF1YWxJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge21ha2VUeXBlc01hdGNofSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Fzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiAoYSA8PSBiKSBlbGVtZW50LXdpc2UuIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzIsIDIsIDJdKTtcbiAqXG4gKiBhLmxlc3NFcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgaW5wdXQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXMgYGFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsZXNzRXF1YWxfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbGVzc0VxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsZXNzRXF1YWwnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuXG4gIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG5cbiAgY29uc3QgaW5wdXRzOiBMZXNzRXF1YWxJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChMZXNzRXF1YWwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWwgPSBvcCh7bGVzc0VxdWFsX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LinSpace } from '../kernel_names';\n/**\n * Return an evenly spaced sequence of numbers over the given interval.\n *\n * ```js\n * tf.linspace(0, 9, 10).print();\n * ```\n * @param start The start value of the sequence.\n * @param stop The end value of the sequence.\n * @param num The number of values to generate.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function linspace(start, stop, num) {\n    if (num <= 0) {\n        throw new Error('The number of values should be positive.');\n    }\n    const attrs = { start, stop, num };\n    return ENGINE.runKernel(LinSpace, {}, attrs);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGluc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9saW5zcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWdCLE1BQU0saUJBQWlCLENBQUM7QUFJeEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUFDLEtBQWEsRUFBRSxJQUFZLEVBQUUsR0FBVztJQUMvRCxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7UUFDWixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxNQUFNLEtBQUssR0FBa0IsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxDQUFDO0lBQ2hELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUNyRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TGluU3BhY2UsIExpblNwYWNlQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogUmV0dXJuIGFuIGV2ZW5seSBzcGFjZWQgc2VxdWVuY2Ugb2YgbnVtYmVycyBvdmVyIHRoZSBnaXZlbiBpbnRlcnZhbC5cbiAqXG4gKiBgYGBqc1xuICogdGYubGluc3BhY2UoMCwgOSwgMTApLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBzdGFydCBUaGUgc3RhcnQgdmFsdWUgb2YgdGhlIHNlcXVlbmNlLlxuICogQHBhcmFtIHN0b3AgVGhlIGVuZCB2YWx1ZSBvZiB0aGUgc2VxdWVuY2UuXG4gKiBAcGFyYW0gbnVtIFRoZSBudW1iZXIgb2YgdmFsdWVzIHRvIGdlbmVyYXRlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpbnNwYWNlKHN0YXJ0OiBudW1iZXIsIHN0b3A6IG51bWJlciwgbnVtOiBudW1iZXIpOiBUZW5zb3IxRCB7XG4gIGlmIChudW0gPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignVGhlIG51bWJlciBvZiB2YWx1ZXMgc2hvdWxkIGJlIHBvc2l0aXZlLicpO1xuICB9XG5cbiAgY29uc3QgYXR0cnM6IExpblNwYWNlQXR0cnMgPSB7c3RhcnQsIHN0b3AsIG51bX07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExpblNwYWNlLCB7fSwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LRN } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Normalizes the activation of a local neighborhood across or within\n * channels.\n *\n * @param x The input tensor. The 4-D input tensor is treated as a 3-D array\n *     of 1D vectors (along the last dimension), and each vector is\n *     normalized independently.\n * @param depthRadius The number of adjacent channels in the 1D normalization\n *     window.\n * @param bias A constant bias term for the basis.\n * @param alpha A scale factor, usually positive.\n * @param beta An exponent.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction localResponseNormalization_(x, depthRadius = 5, bias = 1, alpha = 1, beta = 0.5) {\n    const $x = convertToTensor(x, 'x', 'localResponseNormalization');\n    util.assert($x.rank === 4 || $x.rank === 3, () => `Error in localResponseNormalization: x must be rank 3 or 4 but got\n               rank ${$x.rank}.`);\n    util.assert(util.isInt(depthRadius), () => `Error in localResponseNormalization: depthRadius must be an ` +\n        `integer but got depthRadius ${depthRadius}.`);\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    const inputs = { x: x4D };\n    const attrs = { depthRadius, bias, alpha, beta };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(LRN, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    else {\n        return res;\n    }\n}\nexport const localResponseNormalization = op({ localResponseNormalization_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFzQixNQUFNLGlCQUFpQixDQUFDO0FBSXpELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLDJCQUEyQixDQUNoQyxDQUFlLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUc7SUFDbkUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsNEJBQTRCLENBQUMsQ0FBQztJQUNqRSxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUM5QixHQUFHLEVBQUUsQ0FBQztzQkFDVSxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNoQyxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQ3ZCLEdBQUcsRUFBRSxDQUFDLDhEQUE4RDtRQUNoRSwrQkFBK0IsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUV2RCxJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0Q7SUFFRCxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQztJQUVuQyxNQUFNLEtBQUssR0FBYSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxDQUFDO0lBRXpELDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLEdBQUcsRUFBRSxNQUE4QixFQUNuQyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO1NBQU07UUFDTCxPQUFPLEdBQUcsQ0FBQztLQUNaO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQyxFQUFDLDJCQUEyQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0xSTiwgTFJOQXR0cnMsIExSTklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBOb3JtYWxpemVzIHRoZSBhY3RpdmF0aW9uIG9mIGEgbG9jYWwgbmVpZ2hib3Job29kIGFjcm9zcyBvciB3aXRoaW5cbiAqIGNoYW5uZWxzLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuIFRoZSA0LUQgaW5wdXQgdGVuc29yIGlzIHRyZWF0ZWQgYXMgYSAzLUQgYXJyYXlcbiAqICAgICBvZiAxRCB2ZWN0b3JzIChhbG9uZyB0aGUgbGFzdCBkaW1lbnNpb24pLCBhbmQgZWFjaCB2ZWN0b3IgaXNcbiAqICAgICBub3JtYWxpemVkIGluZGVwZW5kZW50bHkuXG4gKiBAcGFyYW0gZGVwdGhSYWRpdXMgVGhlIG51bWJlciBvZiBhZGphY2VudCBjaGFubmVscyBpbiB0aGUgMUQgbm9ybWFsaXphdGlvblxuICogICAgIHdpbmRvdy5cbiAqIEBwYXJhbSBiaWFzIEEgY29uc3RhbnQgYmlhcyB0ZXJtIGZvciB0aGUgYmFzaXMuXG4gKiBAcGFyYW0gYWxwaGEgQSBzY2FsZSBmYWN0b3IsIHVzdWFsbHkgcG9zaXRpdmUuXG4gKiBAcGFyYW0gYmV0YSBBbiBleHBvbmVudC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25fPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBkZXB0aFJhZGl1cyA9IDUsIGJpYXMgPSAxLCBhbHBoYSA9IDEsIGJldGEgPSAwLjUpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb24nKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5yYW5rID09PSA0IHx8ICR4LnJhbmsgPT09IDMsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IHggbXVzdCBiZSByYW5rIDMgb3IgNCBidXQgZ290XG4gICAgICAgICAgICAgICByYW5rICR7JHgucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdXRpbC5pc0ludChkZXB0aFJhZGl1cyksXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb246IGRlcHRoUmFkaXVzIG11c3QgYmUgYW4gYCArXG4gICAgICAgICAgYGludGVnZXIgYnV0IGdvdCBkZXB0aFJhZGl1cyAke2RlcHRoUmFkaXVzfS5gKTtcblxuICBsZXQgeDREID0gJHggYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgaWYgKCR4LnJhbmsgPT09IDMpIHtcbiAgICByZXNoYXBlZFRvNEQgPSB0cnVlO1xuICAgIHg0RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdXSk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IExSTklucHV0cyA9IHt4OiB4NER9O1xuXG4gIGNvbnN0IGF0dHJzOiBMUk5BdHRycyA9IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIExSTiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbiA9IG9wKHtsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Log } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes natural logarithm of the input `tf.Tensor` element-wise: `ln(x)`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, Math.E]);\n *\n * x.log().print();  // or tf.log(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction log_(x) {\n    const $x = convertToTensor(x, 'x', 'log', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Log, inputs);\n}\nexport const log = op({ log_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2xDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0xvZywgTG9nSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBsbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCBNYXRoLkVdKTtcbiAqXG4gKiB4LmxvZygpLnByaW50KCk7ICAvLyBvciB0Zi5sb2coeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gbG9nXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nJywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHM6IExvZ0lucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBsb2cgPSBvcCh7bG9nX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Log1p } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes natural logarithm of the input `tf.Tensor` plus one\n * element-wise: `ln(1 + x)`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, Math.E - 1]);\n *\n * x.log1p().print();  // or tf.log1p(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction log1p_(x) {\n    const $x = convertToTensor(x, 'x', 'log1p');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Log1p, inputs);\n}\nexport const log1p = op({ log1p_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nMXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2cxcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TG9nMXAsIExvZzFwSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIG5hdHVyYWwgbG9nYXJpdGhtIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBwbHVzIG9uZVxuICogZWxlbWVudC13aXNlOiBgbG4oMSArIHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIE1hdGguRSAtIDFdKTtcbiAqXG4gKiB4LmxvZzFwKCkucHJpbnQoKTsgIC8vIG9yIHRmLmxvZzFwKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIGxvZzFwXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nMXAnKTtcblxuICBjb25zdCBpbnB1dHM6IExvZzFwSW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTG9nMXAsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgbG9nMXAgPSBvcCh7bG9nMXBffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from './engine';\nimport { Tensor, Variable } from './tensor';\nimport { convertToTensor, convertToTensorArray } from './tensor_util_env';\nimport * as util from './util';\n/**\n * Provided `f(x)`, returns another function `g(x, dy?)`, which gives the\n * gradient of `f(x)` with respect to `x`.\n *\n * If `dy` is provided, the gradient of `f(x).mul(dy).sum()` with respect to\n * `x` is computed instead. `f(x)` must take a single tensor `x` and return a\n * single tensor `y`. If `f()` takes multiple inputs, use `tf.grads` instead.\n *\n * ```js\n * // f(x) = x ^ 2\n * const f = x => x.square();\n * // f'(x) = 2x\n * const g = tf.grad(f);\n *\n * const x = tf.tensor1d([2, 3]);\n * g(x).print();\n * ```\n *\n * ```js\n * // f(x) = x ^ 3\n * const f = x => x.pow(tf.scalar(3, 'int32'));\n * // f'(x) = 3x ^ 2\n * const g = tf.grad(f);\n * // f''(x) = 6x\n * const gg = tf.grad(g);\n *\n * const x = tf.tensor1d([2, 3]);\n * gg(x).print();\n * ```\n *\n * @param f The function f(x), to compute gradient for.\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction grad(f) {\n    util.assert(util.isFunction(f), () => 'The f passed in grad(f) must be a function');\n    return (x, dy) => {\n        // x can be of any dtype, thus null as the last argument.\n        const $x = convertToTensor(x, 'x', 'tf.grad', 'string_or_numeric');\n        const $dy = (dy != null) ? convertToTensor(dy, 'dy', 'tf.grad') : null;\n        return ENGINE.tidy(() => {\n            const { value, grads } = ENGINE.gradients(() => f($x), [$x], $dy);\n            if ($dy != null) {\n                util.assertShapesMatch(value.shape, $dy.shape, 'The shape of dy passed in grad(f)(x, dy) must match the shape ' +\n                    'returned by f(x)');\n            }\n            checkGrads(grads);\n            return grads[0];\n        });\n    };\n}\n/**\n * Provided `f(x1, x2,...)`, returns another function `g([x1, x2,...], dy?)`,\n * which gives an array of gradients of `f()` with respect to each input\n * [`x1`,`x2`,...].\n *\n * If `dy` is passed when calling `g()`, the gradient of\n * `f(x1,...).mul(dy).sum()` with respect to each input is computed instead.\n * The provided `f` must take one or more tensors and return a single tensor\n * `y`. If `f()` takes a single input, we recommend using `tf.grad` instead.\n *\n * ```js\n * // f(a, b) = a * b\n * const f = (a, b) => a.mul(b);\n * // df / da = b, df / db = a\n * const g = tf.grads(f);\n *\n * const a = tf.tensor1d([2, 3]);\n * const b = tf.tensor1d([-2, -3]);\n * const [da, db] = g([a, b]);\n * console.log('da');\n * da.print();\n * console.log('db');\n * db.print();\n * ```\n *\n * @param f The function `f(x1, x2,...)` to compute gradients for.\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction grads(f) {\n    util.assert(util.isFunction(f), () => 'The f passed in grads(f) must be a function');\n    return (args, dy) => {\n        util.assert(Array.isArray(args), () => 'The args passed in grads(f)(args) must be an array ' +\n            'of `Tensor`s or `TensorLike`s');\n        // args can be of any dtype, thus null as the last argument.\n        const $args = convertToTensorArray(args, 'args', 'tf.grads', 'string_or_numeric');\n        const $dy = (dy != null) ? convertToTensor(dy, 'dy', 'tf.grads') : null;\n        return ENGINE.tidy(() => {\n            const { value, grads } = ENGINE.gradients(() => f(...$args), $args, $dy);\n            if ($dy != null) {\n                util.assertShapesMatch(value.shape, $dy.shape, 'The shape of dy passed in grads(f)([x1,...], dy) must ' +\n                    'match the shape returned by f([x1,...])');\n            }\n            checkGrads(grads);\n            return grads;\n        });\n    };\n}\n/**\n * Like `tf.grad`, but also returns the value of `f()`. Useful when `f()`\n * returns a metric you want to show.\n *\n * The result is a rich object with the following properties:\n * - grad: The gradient of `f(x)` w.r.t. `x` (result of `tf.grad`).\n * - value: The value returned by `f(x)`.\n *\n * ```js\n * // f(x) = x ^ 2\n * const f = x => x.square();\n * // f'(x) = 2x\n * const g = tf.valueAndGrad(f);\n *\n * const x = tf.tensor1d([2, 3]);\n * const {value, grad} = g(x);\n *\n * console.log('value');\n * value.print();\n * console.log('grad');\n * grad.print();\n * ```\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction valueAndGrad(f) {\n    util.assert(util.isFunction(f), () => 'The f passed in valueAndGrad(f) must be a function');\n    return (x, dy) => {\n        util.assert(x instanceof Tensor, () => 'The x passed in valueAndGrad(f)(x) must be a tensor');\n        util.assert(dy == null || dy instanceof Tensor, () => 'The dy passed in valueAndGrad(f)(x, dy) must be a tensor');\n        const { grads, value } = ENGINE.gradients(() => f(x), [x], dy);\n        checkGrads(grads);\n        return { grad: grads[0], value };\n    };\n}\n/**\n * Like `tf.grads`, but returns also the value of `f()`. Useful when `f()`\n * returns a metric you want to show.\n *\n * The result is a rich object with the following properties:\n * - grads: The gradients of `f()` w.r.t. each input (result of `tf.grads`).\n * - value: The value returned by `f(x)`.\n *\n * ```js\n * // f(a, b) = a * b\n * const f = (a, b) => a.mul(b);\n * // df/da = b, df/db = a\n * const g = tf.valueAndGrads(f);\n *\n * const a = tf.tensor1d([2, 3]);\n * const b = tf.tensor1d([-2, -3]);\n * const {value, grads} = g([a, b]);\n *\n * const [da, db] = grads;\n *\n * console.log('value');\n * value.print();\n *\n * console.log('da');\n * da.print();\n * console.log('db');\n * db.print();\n * ```\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction valueAndGrads(f) {\n    util.assert(util.isFunction(f), () => 'The f passed in valueAndGrads(f) must be a function');\n    return (args, dy) => {\n        util.assert(Array.isArray(args) && args.every(arg => arg instanceof Tensor), () => 'The args passed in valueAndGrads(f)(args) must be array of ' +\n            'tensors');\n        util.assert(dy == null || dy instanceof Tensor, () => 'The dy passed in valueAndGrads(f)(args, dy) must be a tensor');\n        const res = ENGINE.gradients(() => f(...args), args, dy);\n        if (dy != null) {\n            util.assertShapesMatch(res.value.shape, dy.shape, 'The shape of dy passed in valueAndGrads(f)([x1,...], dy) must ' +\n                'match the shape returned by f([x1,...])');\n        }\n        checkGrads(res.grads);\n        return res;\n    };\n}\n/**\n * Computes and returns the gradient of f(x) with respect to the list of\n * trainable variables provided by `varList`. If no list is provided, it\n * defaults to all trainable variables.\n *\n * ```js\n * const a = tf.variable(tf.tensor1d([3, 4]));\n * const b = tf.variable(tf.tensor1d([5, 6]));\n * const x = tf.tensor1d([1, 2]);\n *\n * // f(a, b) = a * x ^ 2 + b * x\n * const f = () => a.mul(x.square()).add(b.mul(x)).sum();\n * // df/da = x ^ 2, df/db = x\n * const {value, grads} = tf.variableGrads(f);\n *\n * Object.keys(grads).forEach(varName => grads[varName].print());\n * ```\n *\n * @param f The function to execute. f() should return a scalar.\n * @param varList The list of variables to compute the gradients with respect\n *     to. Defaults to all trainable variables.\n * @returns An object with the following keys and values:\n *   - `value`: The value of the function `f`.\n *   - `grads`: A map from the names of the variables to the gradients.\n *     If the `varList` argument is provided explicitly and contains a subset of\n *     non-trainable variables, this map in the return value will contain keys\n *     that map the names of the non-trainable variables to `null`.\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction variableGrads(f, varList) {\n    util.assert(util.isFunction(f), () => 'The f passed in variableGrads(f) must be a function');\n    util.assert(varList == null ||\n        Array.isArray(varList) && varList.every(v => v instanceof Variable), () => 'The varList passed in variableGrads(f, varList) must be an array ' +\n        'of variables');\n    const specifiedVarList = varList != null;\n    if (!specifiedVarList) {\n        // Get all of the trainable variables.\n        varList = [];\n        for (const varName in ENGINE.registeredVariables) {\n            varList.push(ENGINE.registeredVariables[varName]);\n        }\n    }\n    const specifiedNonTrainable = specifiedVarList ? varList.filter(variable => !variable.trainable) : null;\n    // Prune non-trainable variables.\n    const originalVarCount = varList.length;\n    varList = varList.filter(variable => variable.trainable);\n    util.assert(varList.length > 0, () => `variableGrads() expects at least one of the input variables to ` +\n        `be trainable, but none of the ${originalVarCount} variables is ` +\n        `trainable.`);\n    const allowNoGradients = true;\n    const { value, grads } = ENGINE.gradients(f, varList, null, allowNoGradients);\n    util.assert(grads.some(g => g != null), () => 'Cannot find a connection between any variable and the result of ' +\n        'the loss function y=f(x). Please make sure the operations that ' +\n        'use variables are inside the function f passed to minimize().');\n    util.assert(value.rank === 0, () => `The f passed in variableGrads(f) must return a scalar, but it ` +\n        `returned a rank-${value.rank} tensor`);\n    const namedGrads = {};\n    varList.forEach((v, i) => {\n        if (grads[i] != null) {\n            namedGrads[v.name] = grads[i];\n        }\n    });\n    if (specifiedNonTrainable != null) {\n        // If varList is explicitly provided and contains non-trainable values,\n        // add them to the returned gradients with `null` values.\n        specifiedNonTrainable.forEach(v => namedGrads[v.name] = null);\n    }\n    return { value, grads: namedGrads };\n}\n/**\n * Overrides the gradient computation of a function `f`.\n *\n * Takes a function\n * `f(...inputs, save) => {value: Tensor, gradFunc: (dy, saved) => Tensor[]}`\n * and returns another function `g(...inputs)` which takes the same inputs as\n * `f`. When called, `g` returns `f().value`. In backward mode, custom gradients\n * with respect to each input of `f` are computed using `f().gradFunc`.\n *\n * The `save` function passed to `f` should be used for saving tensors needed\n * in the gradient. And the `saved` passed to the `gradFunc` is a\n * `NamedTensorMap`, which contains those saved tensors.\n *\n * ```js\n * const customOp = tf.customGrad((x, save) => {\n *   // Save x to make sure it's available later for the gradient.\n *   save([x]);\n *   // Override gradient of our custom x ^ 2 op to be dy * abs(x);\n *   return {\n *     value: x.square(),\n *     // Note `saved.x` which points to the `x` we saved earlier.\n *     gradFunc: (dy, saved) => [dy.mul(saved[0].abs())]\n *   };\n * });\n *\n * const x = tf.tensor1d([-1, -2, 3]);\n * const dx = tf.grad(x => customOp(x));\n *\n * console.log(`f(x):`);\n * customOp(x).print();\n * console.log(`f'(x):`);\n * dx(x).print();\n * ```\n *\n * @param f The function to evaluate in forward mode, which should return\n *     `{value: Tensor, gradFunc: (dy, saved) => Tensor[]}`, where `gradFunc`\n *     returns the custom gradients of `f` with respect to its inputs.\n *\n * @doc {heading: 'Training', subheading: 'Gradients'}\n */\nfunction customGrad(f) {\n    return ENGINE.customGrad(f);\n}\nfunction checkGrads(grads) {\n    const numNullGradients = grads.filter(g => g == null).length;\n    if (numNullGradients > 0) {\n        throw new Error(`Cannot compute gradient of y=f(x) with respect to x. Make sure that\n    the f you passed encloses all operations that lead from x to y.`);\n    }\n}\nexport { customGrad, variableGrads, valueAndGrad, valueAndGrads, grad, grads, };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhZGllbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFxQixNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDcEQsT0FBTyxFQUFTLE1BQU0sRUFBRSxRQUFRLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbEQsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXhFLE9BQU8sS0FBSyxJQUFJLE1BQU0sUUFBUSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFDSCxTQUFTLElBQUksQ0FBQyxDQUF3QjtJQUVwQyxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsNENBQTRDLENBQUMsQ0FBQztJQUM1RSxPQUFPLENBQUMsQ0FBb0IsRUFBRSxFQUFzQixFQUFVLEVBQUU7UUFDOUQseURBQXlEO1FBQ3pELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sR0FBRyxHQUNMLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQy9ELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDdEIsTUFBTSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFB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LEVBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVDRztBQUNILFNBQVMsVUFBVSxDQUFtQixDQUF3QjtJQUU1RCxPQUFPLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWU7SUFDakMsTUFBTSxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUM3RCxJQUFJLGdCQUFnQixHQUFHLENBQUMsRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUNYO29FQUM0RCxDQUFDLENBQUM7S0FDbkU7QUFDSCxDQUFDO0FBRUQsT0FBTyxFQUNMLFVBQVUsRUFDVixhQUFhLEVBQ2IsWUFBWSxFQUNaLGFBQWEsRUFDYixJQUFJLEVBQ0osS0FBSyxHQUNOLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q3VzdG9tR3JhZGllbnRGdW5jLCBFTkdJTkV9IGZyb20gJy4vZW5naW5lJztcbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFZhcmlhYmxlfSBmcm9tICcuL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvciwgY29udmVydFRvVGVuc29yQXJyYXl9IGZyb20gJy4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4vdXRpbCc7XG5cbi8qKlxuICogUHJvdmlkZWQgYGYoeClgLCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gYGcoeCwgZHk/KWAsIHdoaWNoIGdpdmVzIHRoZVxuICogZ3JhZGllbnQgb2YgYGYoeClgIHdpdGggcmVzcGVjdCB0byBgeGAuXG4gKlxuICogSWYgYGR5YCBpcyBwcm92aWRlZCwgdGhlIGdyYWRpZW50IG9mIGBmKHgpLm11bChkeSkuc3VtKClgIHdpdGggcmVzcGVjdCB0b1xuICogYHhgIGlzIGNvbXB1dGVkIGluc3RlYWQuIGBmKHgpYCBtdXN0IHRha2UgYSBzaW5nbGUgdGVuc29yIGB4YCBhbmQgcmV0dXJuIGFcbiAqIHNpbmdsZSB0ZW5zb3IgYHlgLiBJZiBgZigpYCB0YWtlcyBtdWx0aXBsZSBpbnB1dHMsIHVzZSBgdGYuZ3JhZHNgIGluc3RlYWQuXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gMlxuICogY29uc3QgZiA9IHggPT4geC5zcXVhcmUoKTtcbiAqIC8vIGYnKHgpID0gMnhcbiAqIGNvbnN0IGcgPSB0Zi5ncmFkKGYpO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMiwgM10pO1xuICogZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIGYoeCkgPSB4IF4gM1xuICogY29uc3QgZiA9IHggPT4geC5wb3codGYuc2NhbGFyKDMsICdpbnQzMicpKTtcbiAqIC8vIGYnKHgpID0gM3ggXiAyXG4gKiBjb25zdCBnID0gdGYuZ3JhZChmKTtcbiAqIC8vIGYnJyh4KSA9IDZ4XG4gKiBjb25zdCBnZyA9IHRmLmdyYWQoZyk7XG4gKlxuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsyLCAzXSk7XG4gKiBnZyh4KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIGYoeCksIHRvIGNvbXB1dGUgZ3JhZGllbnQgZm9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBncmFkKGY6ICh4OiBUZW5zb3IpID0+IFRlbnNvcik6IChcbiAgICB4OiBUZW5zb3JMaWtlfFRlbnNvciwgZHk/OiBUZW5zb3JMaWtlfFRlbnNvcikgPT4gVGVuc29yIHtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICB1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZChmKSBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgcmV0dXJuICh4OiBUZW5zb3JMaWtlfFRlbnNvciwgZHk/OiBUZW5zb3JMaWtlfFRlbnNvcik6IFRlbnNvciA9PiB7XG4gICAgLy8geCBjYW4gYmUgb2YgYW55IGR0eXBlLCB0aHVzIG51bGwgYXMgdGhlIGxhc3QgYXJndW1lbnQuXG4gICAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGYuZ3JhZCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICAgIGNvbnN0ICRkeTogVGVuc29yID1cbiAgICAgICAgKGR5ICE9IG51bGwpID8gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAndGYuZ3JhZCcpIDogbnVsbDtcbiAgICByZXR1cm4gRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBncmFkc30gPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoJHgpLCBbJHhdLCAkZHkpO1xuICAgICAgaWYgKCRkeSAhPSBudWxsKSB7XG4gICAgICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAgICAgICB2YWx1ZS5zaGFwZSwgJGR5LnNoYXBlLFxuICAgICAgICAgICAgJ1RoZSBzaGFwZSBvZiBkeSBwYXNzZWQgaW4gZ3JhZChmKSh4LCBkeSkgbXVzdCBtYXRjaCB0aGUgc2hhcGUgJyArXG4gICAgICAgICAgICAgICAgJ3JldHVybmVkIGJ5IGYoeCknKTtcbiAgICAgIH1cbiAgICAgIGNoZWNrR3JhZHMoZ3JhZHMpO1xuICAgICAgcmV0dXJuIGdyYWRzWzBdO1xuICAgIH0pO1xuICB9O1xufVxuXG4vKipcbiAqIFByb3ZpZGVkIGBmKHgxLCB4MiwuLi4pYCwgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uIGBnKFt4MSwgeDIsLi4uXSwgZHk/KWAsXG4gKiB3aGljaCBnaXZlcyBhbiBhcnJheSBvZiBncmFkaWVudHMgb2YgYGYoKWAgd2l0aCByZXNwZWN0IHRvIGVhY2ggaW5wdXRcbiAqIFtgeDFgLGB4MmAsLi4uXS5cbiAqXG4gKiBJZiBgZHlgIGlzIHBhc3NlZCB3aGVuIGNhbGxpbmcgYGcoKWAsIHRoZSBncmFkaWVudCBvZlxuICogYGYoeDEsLi4uKS5tdWwoZHkpLnN1bSgpYCB3aXRoIHJlc3BlY3QgdG8gZWFjaCBpbnB1dCBpcyBjb21wdXRlZCBpbnN0ZWFkLlxuICogVGhlIHByb3ZpZGVkIGBmYCBtdXN0IHRha2Ugb25lIG9yIG1vcmUgdGVuc29ycyBhbmQgcmV0dXJuIGEgc2luZ2xlIHRlbnNvclxuICogYHlgLiBJZiBgZigpYCB0YWtlcyBhIHNpbmdsZSBpbnB1dCwgd2UgcmVjb21tZW5kIHVzaW5nIGB0Zi5ncmFkYCBpbnN0ZWFkLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBmKGEsIGIpID0gYSAqIGJcbiAqIGNvbnN0IGYgPSAoYSwgYikgPT4gYS5tdWwoYik7XG4gKiAvLyBkZiAvIGRhID0gYiwgZGYgLyBkYiA9IGFcbiAqIGNvbnN0IGcgPSB0Zi5ncmFkcyhmKTtcbiAqXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTIsIC0zXSk7XG4gKiBjb25zdCBbZGEsIGRiXSA9IGcoW2EsIGJdKTtcbiAqIGNvbnNvbGUubG9nKCdkYScpO1xuICogZGEucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdkYicpO1xuICogZGIucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmIFRoZSBmdW5jdGlvbiBgZih4MSwgeDIsLi4uKWAgdG8gY29tcHV0ZSBncmFkaWVudHMgZm9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBncmFkcyhmOiAoLi4uYXJnczogVGVuc29yW10pID0+IFRlbnNvcik6IChcbiAgICBhcmdzOiBBcnJheTxUZW5zb3J8VGVuc29yTGlrZT4sIGR5PzogVGVuc29yfFRlbnNvckxpa2UpID0+IFRlbnNvcltdIHtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICB1dGlsLmlzRnVuY3Rpb24oZiksICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gZ3JhZHMoZikgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIHJldHVybiAoYXJnczogQXJyYXk8VGVuc29yfFRlbnNvckxpa2U+LCBkeT86IFRlbnNvcnxUZW5zb3JMaWtlKTogVGVuc29yW10gPT4ge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3MpLFxuICAgICAgICAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIGdyYWRzKGYpKGFyZ3MpIG11c3QgYmUgYW4gYXJyYXkgJyArXG4gICAgICAgICAgICAnb2YgYFRlbnNvcmBzIG9yIGBUZW5zb3JMaWtlYHMnKTtcbiAgICAvLyBhcmdzIGNhbiBiZSBvZiBhbnkgZHR5cGUsIHRodXMgbnVsbCBhcyB0aGUgbGFzdCBhcmd1bWVudC5cbiAgICBjb25zdCAkYXJncyA9XG4gICAgICAgIGNvbnZlcnRUb1RlbnNvckFycmF5KGFyZ3MsICdhcmdzJywgJ3RmLmdyYWRzJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gICAgY29uc3QgJGR5OiBUZW5zb3IgPVxuICAgICAgICAoZHkgIT0gbnVsbCkgPyBjb252ZXJ0VG9UZW5zb3IoZHksICdkeScsICd0Zi5ncmFkcycpIDogbnVsbDtcbiAgICByZXR1cm4gRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3Qge3ZhbHVlLCBncmFkc30gPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoLi4uJGFyZ3MpLCAkYXJncywgJGR5KTtcbiAgICAgIGlmICgkZHkgIT0gbnVsbCkge1xuICAgICAgICB1dGlsLmFzc2VydFNoYXBlc01hdGNoKFxuICAgICAgICAgICAgdmFsdWUuc2hhcGUsICRkeS5zaGFwZSxcbiAgICAgICAgICAgICdUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIGdyYWRzKGYpKFt4MSwuLi5dLCBkeSkgbXVzdCAnICtcbiAgICAgICAgICAgICAgICAnbWF0Y2ggdGhlIHNoYXBlIHJldHVybmVkIGJ5IGYoW3gxLC4uLl0pJyk7XG4gICAgICB9XG4gICAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICAgIHJldHVybiBncmFkcztcbiAgICB9KTtcbiAgfTtcbn1cblxuLyoqXG4gKiBMaWtlIGB0Zi5ncmFkYCwgYnV0IGFsc28gcmV0dXJucyB0aGUgdmFsdWUgb2YgYGYoKWAuIFVzZWZ1bCB3aGVuIGBmKClgXG4gKiByZXR1cm5zIGEgbWV0cmljIHlvdSB3YW50IHRvIHNob3cuXG4gKlxuICogVGhlIHJlc3VsdCBpcyBhIHJpY2ggb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogLSBncmFkOiBUaGUgZ3JhZGllbnQgb2YgYGYoeClgIHcuci50LiBgeGAgKHJlc3VsdCBvZiBgdGYuZ3JhZGApLlxuICogLSB2YWx1ZTogVGhlIHZhbHVlIHJldHVybmVkIGJ5IGBmKHgpYC5cbiAqXG4gKiBgYGBqc1xuICogLy8gZih4KSA9IHggXiAyXG4gKiBjb25zdCBmID0geCA9PiB4LnNxdWFyZSgpO1xuICogLy8gZicoeCkgPSAyeFxuICogY29uc3QgZyA9IHRmLnZhbHVlQW5kR3JhZChmKTtcbiAqXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IHt2YWx1ZSwgZ3JhZH0gPSBnKHgpO1xuICpcbiAqIGNvbnNvbGUubG9nKCd2YWx1ZScpO1xuICogdmFsdWUucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdncmFkJyk7XG4gKiBncmFkLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFsdWVBbmRHcmFkPEkgZXh0ZW5kcyBUZW5zb3IsIE8gZXh0ZW5kcyBUZW5zb3I+KGY6ICh4OiBJKSA9PiBPKTogKFxuICAgIHg6IEksIGR5PzogTykgPT4ge1xuICB2YWx1ZTogTztcbiAgZ3JhZDogSTtcbn0ge1xuICB1dGlsLmFzc2VydChcbiAgICAgIHV0aWwuaXNGdW5jdGlvbihmKSxcbiAgICAgICgpID0+ICdUaGUgZiBwYXNzZWQgaW4gdmFsdWVBbmRHcmFkKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICByZXR1cm4gKHg6IEksIGR5PzogTykgPT4ge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB4IGluc3RhbmNlb2YgVGVuc29yLFxuICAgICAgICAoKSA9PiAnVGhlIHggcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSh4KSBtdXN0IGJlIGEgdGVuc29yJyk7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGR5ID09IG51bGwgfHwgZHkgaW5zdGFuY2VvZiBUZW5zb3IsXG4gICAgICAgICgpID0+ICdUaGUgZHkgcGFzc2VkIGluIHZhbHVlQW5kR3JhZChmKSh4LCBkeSkgbXVzdCBiZSBhIHRlbnNvcicpO1xuICAgIGNvbnN0IHtncmFkcywgdmFsdWV9ID0gRU5HSU5FLmdyYWRpZW50cygoKSA9PiBmKHgpLCBbeF0sIGR5KTtcbiAgICBjaGVja0dyYWRzKGdyYWRzKTtcbiAgICByZXR1cm4ge2dyYWQ6IGdyYWRzWzBdIGFzIEksIHZhbHVlfTtcbiAgfTtcbn1cblxuLyoqXG4gKiBMaWtlIGB0Zi5ncmFkc2AsIGJ1dCByZXR1cm5zIGFsc28gdGhlIHZhbHVlIG9mIGBmKClgLiBVc2VmdWwgd2hlbiBgZigpYFxuICogcmV0dXJucyBhIG1ldHJpYyB5b3Ugd2FudCB0byBzaG93LlxuICpcbiAqIFRoZSByZXN1bHQgaXMgYSByaWNoIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqIC0gZ3JhZHM6IFRoZSBncmFkaWVudHMgb2YgYGYoKWAgdy5yLnQuIGVhY2ggaW5wdXQgKHJlc3VsdCBvZiBgdGYuZ3JhZHNgKS5cbiAqIC0gdmFsdWU6IFRoZSB2YWx1ZSByZXR1cm5lZCBieSBgZih4KWAuXG4gKlxuICogYGBganNcbiAqIC8vIGYoYSwgYikgPSBhICogYlxuICogY29uc3QgZiA9IChhLCBiKSA9PiBhLm11bChiKTtcbiAqIC8vIGRmL2RhID0gYiwgZGYvZGIgPSBhXG4gKiBjb25zdCBnID0gdGYudmFsdWVBbmRHcmFkcyhmKTtcbiAqXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDNdKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbLTIsIC0zXSk7XG4gKiBjb25zdCB7dmFsdWUsIGdyYWRzfSA9IGcoW2EsIGJdKTtcbiAqXG4gKiBjb25zdCBbZGEsIGRiXSA9IGdyYWRzO1xuICpcbiAqIGNvbnNvbGUubG9nKCd2YWx1ZScpO1xuICogdmFsdWUucHJpbnQoKTtcbiAqXG4gKiBjb25zb2xlLmxvZygnZGEnKTtcbiAqIGRhLnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnZGInKTtcbiAqIGRiLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFsdWVBbmRHcmFkczxPIGV4dGVuZHMgVGVuc29yPihmOiAoLi4uYXJnczogVGVuc29yW10pID0+IE8pOiAoXG4gICAgYXJnczogVGVuc29yW10sIGR5PzogTykgPT4ge1xuICBncmFkczogVGVuc29yW107XG4gIHZhbHVlOiBPO1xufSB7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdXRpbC5pc0Z1bmN0aW9uKGYpLFxuICAgICAgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiB2YWx1ZUFuZEdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICByZXR1cm4gKGFyZ3M6IFRlbnNvcltdLCBkeT86IE8pID0+IHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgQXJyYXkuaXNBcnJheShhcmdzKSAmJiBhcmdzLmV2ZXJ5KGFyZyA9PiBhcmcgaW5zdGFuY2VvZiBUZW5zb3IpLFxuICAgICAgICAoKSA9PiAnVGhlIGFyZ3MgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikoYXJncykgbXVzdCBiZSBhcnJheSBvZiAnICtcbiAgICAgICAgICAgICd0ZW5zb3JzJyk7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGR5ID09IG51bGwgfHwgZHkgaW5zdGFuY2VvZiBUZW5zb3IsXG4gICAgICAgICgpID0+ICdUaGUgZHkgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikoYXJncywgZHkpIG11c3QgYmUgYSB0ZW5zb3InKTtcbiAgICBjb25zdCByZXMgPSBFTkdJTkUuZ3JhZGllbnRzKCgpID0+IGYoLi4uYXJncyksIGFyZ3MsIGR5KTtcbiAgICBpZiAoZHkgIT0gbnVsbCkge1xuICAgICAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICAgICByZXMudmFsdWUuc2hhcGUsIGR5LnNoYXBlLFxuICAgICAgICAgICdUaGUgc2hhcGUgb2YgZHkgcGFzc2VkIGluIHZhbHVlQW5kR3JhZHMoZikoW3gxLC4uLl0sIGR5KSBtdXN0ICcgK1xuICAgICAgICAgICAgICAnbWF0Y2ggdGhlIHNoYXBlIHJldHVybmVkIGJ5IGYoW3gxLC4uLl0pJyk7XG4gICAgfVxuICAgIGNoZWNrR3JhZHMocmVzLmdyYWRzKTtcbiAgICByZXR1cm4gcmVzO1xuICB9O1xufVxuXG4vKipcbiAqIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBncmFkaWVudCBvZiBmKHgpIHdpdGggcmVzcGVjdCB0byB0aGUgbGlzdCBvZlxuICogdHJhaW5hYmxlIHZhcmlhYmxlcyBwcm92aWRlZCBieSBgdmFyTGlzdGAuIElmIG5vIGxpc3QgaXMgcHJvdmlkZWQsIGl0XG4gKiBkZWZhdWx0cyB0byBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnZhcmlhYmxlKHRmLnRlbnNvcjFkKFszLCA0XSkpO1xuICogY29uc3QgYiA9IHRmLnZhcmlhYmxlKHRmLnRlbnNvcjFkKFs1LCA2XSkpO1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyXSk7XG4gKlxuICogLy8gZihhLCBiKSA9IGEgKiB4IF4gMiArIGIgKiB4XG4gKiBjb25zdCBmID0gKCkgPT4gYS5tdWwoeC5zcXVhcmUoKSkuYWRkKGIubXVsKHgpKS5zdW0oKTtcbiAqIC8vIGRmL2RhID0geCBeIDIsIGRmL2RiID0geFxuICogY29uc3Qge3ZhbHVlLCBncmFkc30gPSB0Zi52YXJpYWJsZUdyYWRzKGYpO1xuICpcbiAqIE9iamVjdC5rZXlzKGdyYWRzKS5mb3JFYWNoKHZhck5hbWUgPT4gZ3JhZHNbdmFyTmFtZV0ucHJpbnQoKSk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZS4gZigpIHNob3VsZCByZXR1cm4gYSBzY2FsYXIuXG4gKiBAcGFyYW0gdmFyTGlzdCBUaGUgbGlzdCBvZiB2YXJpYWJsZXMgdG8gY29tcHV0ZSB0aGUgZ3JhZGllbnRzIHdpdGggcmVzcGVjdFxuICogICAgIHRvLiBEZWZhdWx0cyB0byBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5cyBhbmQgdmFsdWVzOlxuICogICAtIGB2YWx1ZWA6IFRoZSB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gYGZgLlxuICogICAtIGBncmFkc2A6IEEgbWFwIGZyb20gdGhlIG5hbWVzIG9mIHRoZSB2YXJpYWJsZXMgdG8gdGhlIGdyYWRpZW50cy5cbiAqICAgICBJZiB0aGUgYHZhckxpc3RgIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGV4cGxpY2l0bHkgYW5kIGNvbnRhaW5zIGEgc3Vic2V0IG9mXG4gKiAgICAgbm9uLXRyYWluYWJsZSB2YXJpYWJsZXMsIHRoaXMgbWFwIGluIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBjb250YWluIGtleXNcbiAqICAgICB0aGF0IG1hcCB0aGUgbmFtZXMgb2YgdGhlIG5vbi10cmFpbmFibGUgdmFyaWFibGVzIHRvIGBudWxsYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnR3JhZGllbnRzJ31cbiAqL1xuZnVuY3Rpb24gdmFyaWFibGVHcmFkcyhmOiAoKSA9PiBTY2FsYXIsIHZhckxpc3Q/OiBWYXJpYWJsZVtdKTpcbiAgICB7dmFsdWU6IFNjYWxhciwgZ3JhZHM6IE5hbWVkVGVuc29yTWFwfSB7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdXRpbC5pc0Z1bmN0aW9uKGYpLFxuICAgICAgKCkgPT4gJ1RoZSBmIHBhc3NlZCBpbiB2YXJpYWJsZUdyYWRzKGYpIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHZhckxpc3QgPT0gbnVsbCB8fFxuICAgICAgICAgIEFycmF5LmlzQXJyYXkodmFyTGlzdCkgJiYgdmFyTGlzdC5ldmVyeSh2ID0+IHYgaW5zdGFuY2VvZiBWYXJpYWJsZSksXG4gICAgICAoKSA9PlxuICAgICAgICAgICdUaGUgdmFyTGlzdCBwYXNzZWQgaW4gdmFyaWFibGVHcmFkcyhmLCB2YXJMaXN0KSBtdXN0IGJlIGFuIGFycmF5ICcgK1xuICAgICAgICAgICdvZiB2YXJpYWJsZXMnKTtcblxuICBjb25zdCBzcGVjaWZpZWRWYXJMaXN0ID0gdmFyTGlzdCAhPSBudWxsO1xuICBpZiAoIXNwZWNpZmllZFZhckxpc3QpIHtcbiAgICAvLyBHZXQgYWxsIG9mIHRoZSB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgIHZhckxpc3QgPSBbXTtcbiAgICBmb3IgKGNvbnN0IHZhck5hbWUgaW4gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXMpIHtcbiAgICAgIHZhckxpc3QucHVzaChFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1t2YXJOYW1lXSk7XG4gICAgfVxuICB9XG5cbiAgY29uc3Qgc3BlY2lmaWVkTm9uVHJhaW5hYmxlOiBWYXJpYWJsZVtdID1cbiAgICAgIHNwZWNpZmllZFZhckxpc3QgPyB2YXJMaXN0LmZpbHRlcih2YXJpYWJsZSA9PiAhdmFyaWFibGUudHJhaW5hYmxlKSA6IG51bGw7XG5cbiAgLy8gUHJ1bmUgbm9uLXRyYWluYWJsZSB2YXJpYWJsZXMuXG4gIGNvbnN0IG9yaWdpbmFsVmFyQ291bnQgPSB2YXJMaXN0Lmxlbmd0aDtcbiAgdmFyTGlzdCA9IHZhckxpc3QuZmlsdGVyKHZhcmlhYmxlID0+IHZhcmlhYmxlLnRyYWluYWJsZSk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdmFyTGlzdC5sZW5ndGggPiAwLFxuICAgICAgKCkgPT4gYHZhcmlhYmxlR3JhZHMoKSBleHBlY3RzIGF0IGxlYXN0IG9uZSBvZiB0aGUgaW5wdXQgdmFyaWFibGVzIHRvIGAgK1xuICAgICAgICAgIGBiZSB0cmFpbmFibGUsIGJ1dCBub25lIG9mIHRoZSAke29yaWdpbmFsVmFyQ291bnR9IHZhcmlhYmxlcyBpcyBgICtcbiAgICAgICAgICBgdHJhaW5hYmxlLmApO1xuXG4gIGNvbnN0IGFsbG93Tm9HcmFkaWVudHMgPSB0cnVlO1xuICBjb25zdCB7dmFsdWUsIGdyYWRzfSA9IEVOR0lORS5ncmFkaWVudHMoZiwgdmFyTGlzdCwgbnVsbCwgYWxsb3dOb0dyYWRpZW50cyk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBncmFkcy5zb21lKGcgPT4gZyAhPSBudWxsKSxcbiAgICAgICgpID0+ICdDYW5ub3QgZmluZCBhIGNvbm5lY3Rpb24gYmV0d2VlbiBhbnkgdmFyaWFibGUgYW5kIHRoZSByZXN1bHQgb2YgJyArXG4gICAgICAgICAgJ3RoZSBsb3NzIGZ1bmN0aW9uIHk9Zih4KS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGUgb3BlcmF0aW9ucyB0aGF0ICcgK1xuICAgICAgICAgICd1c2UgdmFyaWFibGVzIGFyZSBpbnNpZGUgdGhlIGZ1bmN0aW9uIGYgcGFzc2VkIHRvIG1pbmltaXplKCkuJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgdmFsdWUucmFuayA9PT0gMCxcbiAgICAgICgpID0+IGBUaGUgZiBwYXNzZWQgaW4gdmFyaWFibGVHcmFkcyhmKSBtdXN0IHJldHVybiBhIHNjYWxhciwgYnV0IGl0IGAgK1xuICAgICAgICAgIGByZXR1cm5lZCBhIHJhbmstJHt2YWx1ZS5yYW5rfSB0ZW5zb3JgKTtcblxuICBjb25zdCBuYW1lZEdyYWRzOiBOYW1lZFRlbnNvck1hcCA9IHt9O1xuICB2YXJMaXN0LmZvckVhY2goKHYsIGkpID0+IHtcbiAgICBpZiAoZ3JhZHNbaV0gIT0gbnVsbCkge1xuICAgICAgbmFtZWRHcmFkc1t2Lm5hbWVdID0gZ3JhZHNbaV07XG4gICAgfVxuICB9KTtcbiAgaWYgKHNwZWNpZmllZE5vblRyYWluYWJsZSAhPSBudWxsKSB7XG4gICAgLy8gSWYgdmFyTGlzdCBpcyBleHBsaWNpdGx5IHByb3ZpZGVkIGFuZCBjb250YWlucyBub24tdHJhaW5hYmxlIHZhbHVlcyxcbiAgICAvLyBhZGQgdGhlbSB0byB0aGUgcmV0dXJuZWQgZ3JhZGllbnRzIHdpdGggYG51bGxgIHZhbHVlcy5cbiAgICBzcGVjaWZpZWROb25UcmFpbmFibGUuZm9yRWFjaCh2ID0+IG5hbWVkR3JhZHNbdi5uYW1lXSA9IG51bGwpO1xuICB9XG4gIHJldHVybiB7dmFsdWUsIGdyYWRzOiBuYW1lZEdyYWRzfTtcbn1cblxuLyoqXG4gKiBPdmVycmlkZXMgdGhlIGdyYWRpZW50IGNvbXB1dGF0aW9uIG9mIGEgZnVuY3Rpb24gYGZgLlxuICpcbiAqIFRha2VzIGEgZnVuY3Rpb25cbiAqIGBmKC4uLmlucHV0cywgc2F2ZSkgPT4ge3ZhbHVlOiBUZW5zb3IsIGdyYWRGdW5jOiAoZHksIHNhdmVkKSA9PiBUZW5zb3JbXX1gXG4gKiBhbmQgcmV0dXJucyBhbm90aGVyIGZ1bmN0aW9uIGBnKC4uLmlucHV0cylgIHdoaWNoIHRha2VzIHRoZSBzYW1lIGlucHV0cyBhc1xuICogYGZgLiBXaGVuIGNhbGxlZCwgYGdgIHJldHVybnMgYGYoKS52YWx1ZWAuIEluIGJhY2t3YXJkIG1vZGUsIGN1c3RvbSBncmFkaWVudHNcbiAqIHdpdGggcmVzcGVjdCB0byBlYWNoIGlucHV0IG9mIGBmYCBhcmUgY29tcHV0ZWQgdXNpbmcgYGYoKS5ncmFkRnVuY2AuXG4gKlxuICogVGhlIGBzYXZlYCBmdW5jdGlvbiBwYXNzZWQgdG8gYGZgIHNob3VsZCBiZSB1c2VkIGZvciBzYXZpbmcgdGVuc29ycyBuZWVkZWRcbiAqIGluIHRoZSBncmFkaWVudC4gQW5kIHRoZSBgc2F2ZWRgIHBhc3NlZCB0byB0aGUgYGdyYWRGdW5jYCBpcyBhXG4gKiBgTmFtZWRUZW5zb3JNYXBgLCB3aGljaCBjb250YWlucyB0aG9zZSBzYXZlZCB0ZW5zb3JzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjdXN0b21PcCA9IHRmLmN1c3RvbUdyYWQoKHgsIHNhdmUpID0+IHtcbiAqICAgLy8gU2F2ZSB4IHRvIG1ha2Ugc3VyZSBpdCdzIGF2YWlsYWJsZSBsYXRlciBmb3IgdGhlIGdyYWRpZW50LlxuICogICBzYXZlKFt4XSk7XG4gKiAgIC8vIE92ZXJyaWRlIGdyYWRpZW50IG9mIG91ciBjdXN0b20geCBeIDIgb3AgdG8gYmUgZHkgKiBhYnMoeCk7XG4gKiAgIHJldHVybiB7XG4gKiAgICAgdmFsdWU6IHguc3F1YXJlKCksXG4gKiAgICAgLy8gTm90ZSBgc2F2ZWQueGAgd2hpY2ggcG9pbnRzIHRvIHRoZSBgeGAgd2Ugc2F2ZWQgZWFybGllci5cbiAqICAgICBncmFkRnVuYzogKGR5LCBzYXZlZCkgPT4gW2R5Lm11bChzYXZlZFswXS5hYnMoKSldXG4gKiAgIH07XG4gKiB9KTtcbiAqXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAtMiwgM10pO1xuICogY29uc3QgZHggPSB0Zi5ncmFkKHggPT4gY3VzdG9tT3AoeCkpO1xuICpcbiAqIGNvbnNvbGUubG9nKGBmKHgpOmApO1xuICogY3VzdG9tT3AoeCkucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKGBmJyh4KTpgKTtcbiAqIGR4KHgpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXZhbHVhdGUgaW4gZm9yd2FyZCBtb2RlLCB3aGljaCBzaG91bGQgcmV0dXJuXG4gKiAgICAgYHt2YWx1ZTogVGVuc29yLCBncmFkRnVuYzogKGR5LCBzYXZlZCkgPT4gVGVuc29yW119YCwgd2hlcmUgYGdyYWRGdW5jYFxuICogICAgIHJldHVybnMgdGhlIGN1c3RvbSBncmFkaWVudHMgb2YgYGZgIHdpdGggcmVzcGVjdCB0byBpdHMgaW5wdXRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdHcmFkaWVudHMnfVxuICovXG5mdW5jdGlvbiBjdXN0b21HcmFkPFQgZXh0ZW5kcyBUZW5zb3I+KGY6IEN1c3RvbUdyYWRpZW50RnVuYzxUPik6XG4gICAgKC4uLmFyZ3M6IFRlbnNvcltdKSA9PiBUIHtcbiAgcmV0dXJuIEVOR0lORS5jdXN0b21HcmFkKGYpO1xufVxuXG5mdW5jdGlvbiBjaGVja0dyYWRzKGdyYWRzOiBUZW5zb3JbXSkge1xuICBjb25zdCBudW1OdWxsR3JhZGllbnRzID0gZ3JhZHMuZmlsdGVyKGcgPT4gZyA9PSBudWxsKS5sZW5ndGg7XG4gIGlmIChudW1OdWxsR3JhZGllbnRzID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYENhbm5vdCBjb21wdXRlIGdyYWRpZW50IG9mIHk9Zih4KSB3aXRoIHJlc3BlY3QgdG8geC4gTWFrZSBzdXJlIHRoYXRcbiAgICB0aGUgZiB5b3UgcGFzc2VkIGVuY2xvc2VzIGFsbCBvcGVyYXRpb25zIHRoYXQgbGVhZCBmcm9tIHggdG8geS5gKTtcbiAgfVxufVxuXG5leHBvcnQge1xuICBjdXN0b21HcmFkLFxuICB2YXJpYWJsZUdyYWRzLFxuICB2YWx1ZUFuZEdyYWQsXG4gIHZhbHVlQW5kR3JhZHMsXG4gIGdyYWQsXG4gIGdyYWRzLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Softplus } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes softplus of the input `tf.Tensor` element-wise: `log(exp(x) + 1)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.softplus().print();  // or tf.softplus(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction softplus_(x) {\n    const $x = convertToTensor(x, 'x', 'softplus');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Softplus, inputs);\n}\nexport const softplus = op({ softplus_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHBsdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zb2Z0cGx1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxRQUFRLEVBQWlCLE1BQU0saUJBQWlCLENBQUM7QUFHekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLFNBQVMsQ0FBbUIsQ0FBZTtJQUNsRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBbUIsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDdkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxFQUFFLENBQUMsRUFBQyxTQUFTLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U29mdHBsdXMsIFNvZnRwbHVzSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHNvZnRwbHVzIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBsb2coZXhwKHgpICsgMSlgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMSwgLTEsIC43XSk7XG4gKlxuICogeC5zb2Z0cGx1cygpLnByaW50KCk7ICAvLyBvciB0Zi5zb2Z0cGx1cyh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzb2Z0cGx1c188VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NvZnRwbHVzJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBTb2Z0cGx1c0lucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNvZnRwbHVzLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IHNvZnRwbHVzID0gb3Aoe3NvZnRwbHVzX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { customGrad } from '../gradients';\nimport { convertToTensor } from '../tensor_util_env';\nimport { mul } from './mul';\nimport { neg } from './neg';\nimport { op } from './operation';\nimport { sigmoid } from './sigmoid';\nimport { softplus } from './softplus';\n/**\n * Computes log sigmoid of the input `tf.Tensor` element-wise:\n * `logSigmoid(x)`. For numerical stability, we use `-tf.softplus(-x)`.\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.logSigmoid().print();  // or tf.logSigmoid(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction logSigmoid_(x) {\n    const $x = convertToTensor(x, 'x', 'logSigmoid');\n    // Use a custom gradient to maintain previous implementation.\n    // There is no LogSigmoid kernel in TF so we can't use engine.runKernel\n    // directly\n    const customOp = customGrad((x) => {\n        // TODO(yassogba) we can remove the chained softplus call here only\n        // after backends have modualrized softplus at which point we can call\n        // engine runKernel(..., Sotfplus, ...) directly.\n        const value = neg(softplus(neg(x)));\n        const gradFunc = (dy) => {\n            const derX = mul(dy, sigmoid(neg(x)));\n            return derX;\n        };\n        return { value, gradFunc };\n    });\n    return customOp($x);\n}\nexport const logSigmoid = op({ logSigmoid_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3NpZ21vaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dfc2lnbW9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEM7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLENBQWU7SUFDcEQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFakQsNkRBQTZEO0lBQzdELHVFQUF1RTtJQUN2RSxXQUFXO0lBQ1gsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBUyxFQUFFLEVBQUU7UUFDeEMsbUVBQW1FO1FBQ25FLHNFQUFzRTtRQUN0RSxpREFBaUQ7UUFDakQsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXBDLE1BQU0sUUFBUSxHQUFHLENBQUMsRUFBSyxFQUFFLEVBQUU7WUFDekIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFFSCxPQUFPLFFBQVEsQ0FBQyxFQUFFLENBQU0sQ0FBQztBQUMzQixDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Y3VzdG9tR3JhZH0gZnJvbSAnLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHttdWx9IGZyb20gJy4vbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuL25lZyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3NpZ21vaWR9IGZyb20gJy4vc2lnbW9pZCc7XG5pbXBvcnQge3NvZnRwbHVzfSBmcm9tICcuL3NvZnRwbHVzJztcblxuLyoqXG4gKiBDb21wdXRlcyBsb2cgc2lnbW9pZCBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlOlxuICogYGxvZ1NpZ21vaWQoeClgLiBGb3IgbnVtZXJpY2FsIHN0YWJpbGl0eSwgd2UgdXNlIGAtdGYuc29mdHBsdXMoLXgpYC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCAxLCAtMSwgLjddKTtcbiAqXG4gKiB4LmxvZ1NpZ21vaWQoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU2lnbW9pZCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBsb2dTaWdtb2lkXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9nU2lnbW9pZCcpO1xuXG4gIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCB0byBtYWludGFpbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVGhlcmUgaXMgbm8gTG9nU2lnbW9pZCBrZXJuZWwgaW4gVEYgc28gd2UgY2FuJ3QgdXNlIGVuZ2luZS5ydW5LZXJuZWxcbiAgLy8gZGlyZWN0bHlcbiAgY29uc3QgY3VzdG9tT3AgPSBjdXN0b21HcmFkKCh4OiBUZW5zb3IpID0+IHtcbiAgICAvLyBUT0RPKHlhc3NvZ2JhKSB3ZSBjYW4gcmVtb3ZlIHRoZSBjaGFpbmVkIHNvZnRwbHVzIGNhbGwgaGVyZSBvbmx5XG4gICAgLy8gYWZ0ZXIgYmFja2VuZHMgaGF2ZSBtb2R1YWxyaXplZCBzb2Z0cGx1cyBhdCB3aGljaCBwb2ludCB3ZSBjYW4gY2FsbFxuICAgIC8vIGVuZ2luZSBydW5LZXJuZWwoLi4uLCBTb3RmcGx1cywgLi4uKSBkaXJlY3RseS5cbiAgICBjb25zdCB2YWx1ZSA9IG5lZyhzb2Z0cGx1cyhuZWcoeCkpKTtcblxuICAgIGNvbnN0IGdyYWRGdW5jID0gKGR5OiBUKSA9PiB7XG4gICAgICBjb25zdCBkZXJYID0gbXVsKGR5LCBzaWdtb2lkKG5lZyh4KSkpO1xuICAgICAgcmV0dXJuIGRlclg7XG4gICAgfTtcbiAgICByZXR1cm4ge3ZhbHVlLCBncmFkRnVuY307XG4gIH0pO1xuXG4gIHJldHVybiBjdXN0b21PcCgkeCkgYXMgVDtcbn1cbmV4cG9ydCBjb25zdCBsb2dTaWdtb2lkID0gb3Aoe2xvZ1NpZ21vaWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sub } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Subtracts two `tf.Tensor`s element-wise, A - B. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([10, 20, 30, 40]);\n * const b = tf.tensor1d([1, 2, 3, 4]);\n *\n * a.sub(b).print();  // or tf.sub(a, b)\n * ```\n *\n * ```js\n * // Broadcast subtract a with b.\n * const a = tf.tensor1d([10, 20, 30, 40]);\n * const b = tf.scalar(5);\n *\n * a.sub(b).print();  // or tf.sub(a, b)\n * ```\n * @param a The first `tf.Tensor` to subtract from.\n * @param b The second `tf.Tensor` to be subtracted. Must have the same dtype as\n * `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction sub_(a, b) {\n    let $a = convertToTensor(a, 'a', 'sub');\n    let $b = convertToTensor(b, 'b', 'sub');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Sub, inputs);\n}\nexport const sub = op({ sub_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3ViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsSUFBSSxDQUFtQixDQUFvQixFQUFFLENBQW9CO0lBQ3hFLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFbEMsTUFBTSxNQUFNLEdBQWMsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxFQUFDLElBQUksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3ViLCBTdWJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge21ha2VUeXBlc01hdGNofSBmcm9tICcuLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogU3VidHJhY3RzIHR3byBgdGYuVGVuc29yYHMgZWxlbWVudC13aXNlLCBBIC0gQi4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEwLCAyMCwgMzAsIDQwXSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IHN1YnRyYWN0IGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxMCwgMjAsIDMwLCA0MF0pO1xuICogY29uc3QgYiA9IHRmLnNjYWxhcig1KTtcbiAqXG4gKiBhLnN1YihiKS5wcmludCgpOyAgLy8gb3IgdGYuc3ViKGEsIGIpXG4gKiBgYGBcbiAqIEBwYXJhbSBhIFRoZSBmaXJzdCBgdGYuVGVuc29yYCB0byBzdWJ0cmFjdCBmcm9tLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBgdGYuVGVuc29yYCB0byBiZSBzdWJ0cmFjdGVkLiBNdXN0IGhhdmUgdGhlIHNhbWUgZHR5cGUgYXNcbiAqIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3ViXzxUIGV4dGVuZHMgVGVuc29yPihhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ3N1YicpO1xuICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnc3ViJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBjb25zdCBpbnB1dHM6IFN1YklucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN1YiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN1YiA9IG9wKHtzdWJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { customGrad } from '../gradients';\nimport { convertToTensor } from '../tensor_util_env';\nimport { cast } from './cast';\nimport { exp } from './exp';\nimport { log } from './log';\nimport { max } from './max';\nimport { mul } from './mul';\nimport { op } from './operation';\nimport { sub } from './sub';\nimport { sum } from './sum';\n/**\n * Computes the log softmax.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n *\n * a.logSoftmax().print();  // or tf.logSoftmax(a)\n * ```\n *\n * ```js\n * const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]);\n *\n * a.logSoftmax().print();  // or tf.logSoftmax(a)\n * ```\n *\n * @param logits The logits array.\n * @param axis The dimension softmax would be performed on. Defaults to `-1`\n *     which indicates the last dimension.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction logSoftmax_(logits, axis = -1) {\n    const $logits = convertToTensor(logits, 'logits', 'logSoftmax');\n    if (axis === -1) {\n        axis = $logits.rank - 1;\n    }\n    if (axis !== $logits.rank - 1) {\n        throw Error('Log Softmax along a non-last dimension is not yet supported. ' +\n            `Logits was rank ${$logits.rank} and axis was ${axis}`);\n    }\n    // const forward: ForwardFunc<Tensor> = (backend, save) => {\n    //   const keepDims = true;\n    //   const xMax = max(logits, axis, true);\n    //   const shifted = sub(logits, xMax);\n    //   const value =\n    //       sub(cast(shifted, 'float32'), log(sum(exp(shifted), axis,\n    //       keepDims)));\n    //   save([value]);\n    //   return value;\n    // };\n    // Use a custom gradient for numerical stability.\n    const customOp = customGrad((logits, save) => {\n        const keepDims = true;\n        const xMax = max(logits, axis, true);\n        const shifted = sub(logits, xMax);\n        const value = sub(cast(shifted, 'float32'), log(sum(exp(shifted), axis, keepDims)));\n        save([value]);\n        const gradFunc = (dy, saved) => {\n            const [value] = saved;\n            const keepDims = true;\n            const softmax = exp(value);\n            return sub(dy, mul(sum(dy, axis, keepDims), softmax));\n        };\n        return { value, gradFunc };\n    });\n    return customOp($logits);\n    // TODO Use Engine.runKernel when CPU/WebGL/WASM backends implement this.\n    // const inputs: LogSoftmaxInputs = {logits: $logits};\n    // const attrs: LogSoftmaxAttrs = {axis};\n    // return ENGINE.runKernel(\n    //            LogSoftmax, inputs as {} as NamedTensorMap,\n    //            attrs as {} as NamedAttrMap);\n}\nexport const logSoftmax = op({ logSoftmax_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3NvZnRtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dfc29mdG1heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBSXhDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLE1BQW9CLEVBQUUsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVoRSxJQUFJLElBQUksS0FBSyxDQUFDLENBQUMsRUFBRTtRQUNmLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztLQUN6QjtJQUNELElBQUksSUFBSSxLQUFLLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQzdCLE1BQU0sS0FBSyxDQUNQLCtEQUErRDtZQUMvRCxtQkFBbUIsT0FBTyxDQUFDLElBQUksaUJBQWlCLElBQUksRUFBRSxDQUFDLENBQUM7S0FDN0Q7SUFFRCw0REFBNEQ7SUFDNUQsMkJBQTJCO0lBQzNCLDBDQUEwQztJQUMxQyx1Q0FBdUM7SUFDdkMsa0JBQWtCO0lBQ2xCLGtFQUFrRTtJQUNsRSxxQkFBcUI7SUFDckIsbUJBQW1CO0lBQ25CLGtCQUFrQjtJQUNsQixLQUFLO0lBRUwsaURBQWlEO0lBQ2pELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLE1BQWMsRUFBRSxJQUFrQixFQUFFLEVBQUU7UUFDakUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDbEMsTUFBTSxLQUFLLEdBQ1AsR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBRWQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7WUFDL0MsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztZQUN0QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDdEIsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzNCLE9BQU8sR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUN4RCxDQUFDLENBQUM7UUFDRixPQUFPLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQzNCLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFNLENBQUM7SUFFOUIseUVBQXlFO0lBQ3pFLHNEQUFzRDtJQUN0RCx5Q0FBeUM7SUFDekMsMkJBQTJCO0lBQzNCLHlEQUF5RDtJQUN6RCwyQ0FBMkM7QUFDN0MsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUMsRUFBQyxXQUFXLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2N1c3RvbUdyYWR9IGZyb20gJy4uL2dyYWRpZW50cyc7XG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtHcmFkU2F2ZUZ1bmN9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Nhc3R9IGZyb20gJy4vY2FzdCc7XG5pbXBvcnQge2V4cH0gZnJvbSAnLi9leHAnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4vbG9nJztcbmltcG9ydCB7bWF4fSBmcm9tICcuL21heCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi9tdWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4vc3ViJztcbmltcG9ydCB7c3VtfSBmcm9tICcuL3N1bSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGxvZyBzb2Z0bWF4LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiBhLmxvZ1NvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU29mdG1heChhKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMiwgNCwgNiwgMSwgMiwgM10sIFsyLCAzXSk7XG4gKlxuICogYS5sb2dTb2Z0bWF4KCkucHJpbnQoKTsgIC8vIG9yIHRmLmxvZ1NvZnRtYXgoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cyBhcnJheS5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24gc29mdG1heCB3b3VsZCBiZSBwZXJmb3JtZWQgb24uIERlZmF1bHRzIHRvIGAtMWBcbiAqICAgICB3aGljaCBpbmRpY2F0ZXMgdGhlIGxhc3QgZGltZW5zaW9uLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ05vcm1hbGl6YXRpb24nfVxuICovXG5mdW5jdGlvbiBsb2dTb2Z0bWF4XzxUIGV4dGVuZHMgVGVuc29yPihsb2dpdHM6IFR8VGVuc29yTGlrZSwgYXhpcyA9IC0xKTogVCB7XG4gIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ2xvZ1NvZnRtYXgnKTtcblxuICBpZiAoYXhpcyA9PT0gLTEpIHtcbiAgICBheGlzID0gJGxvZ2l0cy5yYW5rIC0gMTtcbiAgfVxuICBpZiAoYXhpcyAhPT0gJGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgICAnTG9nIFNvZnRtYXggYWxvbmcgYSBub24tbGFzdCBkaW1lbnNpb24gaXMgbm90IHlldCBzdXBwb3J0ZWQuICcgK1xuICAgICAgICBgTG9naXRzIHdhcyByYW5rICR7JGxvZ2l0cy5yYW5rfSBhbmQgYXhpcyB3YXMgJHtheGlzfWApO1xuICB9XG5cbiAgLy8gY29uc3QgZm9yd2FyZDogRm9yd2FyZEZ1bmM8VGVuc29yPiA9IChiYWNrZW5kLCBzYXZlKSA9PiB7XG4gIC8vICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAvLyAgIGNvbnN0IHhNYXggPSBtYXgobG9naXRzLCBheGlzLCB0cnVlKTtcbiAgLy8gICBjb25zdCBzaGlmdGVkID0gc3ViKGxvZ2l0cywgeE1heCk7XG4gIC8vICAgY29uc3QgdmFsdWUgPVxuICAvLyAgICAgICBzdWIoY2FzdChzaGlmdGVkLCAnZmxvYXQzMicpLCBsb2coc3VtKGV4cChzaGlmdGVkKSwgYXhpcyxcbiAgLy8gICAgICAga2VlcERpbXMpKSk7XG4gIC8vICAgc2F2ZShbdmFsdWVdKTtcbiAgLy8gICByZXR1cm4gdmFsdWU7XG4gIC8vIH07XG5cbiAgLy8gVXNlIGEgY3VzdG9tIGdyYWRpZW50IGZvciBudW1lcmljYWwgc3RhYmlsaXR5LlxuICBjb25zdCBjdXN0b21PcCA9IGN1c3RvbUdyYWQoKGxvZ2l0czogVGVuc29yLCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgY29uc3QgeE1heCA9IG1heChsb2dpdHMsIGF4aXMsIHRydWUpO1xuICAgIGNvbnN0IHNoaWZ0ZWQgPSBzdWIobG9naXRzLCB4TWF4KTtcbiAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgIHN1YihjYXN0KHNoaWZ0ZWQsICdmbG9hdDMyJyksIGxvZyhzdW0oZXhwKHNoaWZ0ZWQpLCBheGlzLCBrZWVwRGltcykpKTtcbiAgICBzYXZlKFt2YWx1ZV0pO1xuXG4gICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgICBjb25zdCBbdmFsdWVdID0gc2F2ZWQ7XG4gICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICBjb25zdCBzb2Z0bWF4ID0gZXhwKHZhbHVlKTtcbiAgICAgIHJldHVybiBzdWIoZHksIG11bChzdW0oZHksIGF4aXMsIGtlZXBEaW1zKSwgc29mdG1heCkpO1xuICAgIH07XG4gICAgcmV0dXJuIHt2YWx1ZSwgZ3JhZEZ1bmN9O1xuICB9KTtcblxuICByZXR1cm4gY3VzdG9tT3AoJGxvZ2l0cykgYXMgVDtcblxuICAvLyBUT0RPIFVzZSBFbmdpbmUucnVuS2VybmVsIHdoZW4gQ1BVL1dlYkdML1dBU00gYmFja2VuZHMgaW1wbGVtZW50IHRoaXMuXG4gIC8vIGNvbnN0IGlucHV0czogTG9nU29mdG1heElucHV0cyA9IHtsb2dpdHM6ICRsb2dpdHN9O1xuICAvLyBjb25zdCBhdHRyczogTG9nU29mdG1heEF0dHJzID0ge2F4aXN9O1xuICAvLyByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgLy8gICAgICAgICAgICBMb2dTb2Z0bWF4LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gIC8vICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1NvZnRtYXggPSBvcCh7bG9nU29mdG1heF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { parseAxisParam } from '../util';\nimport { add } from './add';\nimport { expandShapeToKeepDim } from './axis_util';\nimport { exp } from './exp';\nimport { log } from './log';\nimport { max } from './max';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nimport { sub } from './sub';\nimport { sum } from './sum';\n/**\n * Computes the log(sum(exp(elements across the reduction dimensions))).\n *\n * Reduces the input along the dimensions given in `axis`. Unless `keepDims`\n * is true, the rank of the array is reduced by 1 for each entry in `axis`.\n * If `keepDims` is true, the reduced dimensions are retained with length 1.\n * If `axis` has no entries, all dimensions are reduced, and an array with a\n * single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.logSumExp().print();  // or tf.logSumExp(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.logSumExp(axis).print();  // or tf.logSumExp(a, axis)\n * ```\n * @param x The input tensor.\n * @param axis The dimension(s) to reduce. If null (the default),\n *     reduces all dimensions.\n * @param keepDims If true, retains reduced dimensions with length\n *     of 1. Defaults to false.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction logSumExp_(x, axis = null, keepDims = false) {\n    const $x = convertToTensor(x, 'x', 'logSumExp');\n    const axes = parseAxisParam(axis, $x.shape);\n    const xMax = max($x, axes, true /* keepDims */);\n    const a = sub($x, xMax);\n    const b = exp(a);\n    const c = sum(b, axes);\n    const d = log(c);\n    const res = add(reshape(xMax, d.shape), d);\n    if (keepDims) {\n        const newShape = expandShapeToKeepDim(res.shape, axes);\n        return reshape(res, newShape);\n    }\n    return res;\n}\nexport const logSumExp = op({ logSumExp_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3N1bV9leHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dfc3VtX2V4cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsU0FBUyxVQUFVLENBQ2YsQ0FBb0IsRUFBRSxPQUF3QixJQUFJLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDdEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFaEQsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUUzQyxJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sUUFBUSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdkQsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBTSxDQUFDO0tBQ3BDO0lBQ0QsT0FBTyxHQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3BhcnNlQXhpc1BhcmFtfSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHthZGR9IGZyb20gJy4vYWRkJztcbmltcG9ydCB7ZXhwYW5kU2hhcGVUb0tlZXBEaW19IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7ZXhwfSBmcm9tICcuL2V4cCc7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi9sb2cnO1xuaW1wb3J0IHttYXh9IGZyb20gJy4vbWF4JztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7c3VifSBmcm9tICcuL3N1Yic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9zdW0nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBsb2coc3VtKGV4cChlbGVtZW50cyBhY3Jvc3MgdGhlIHJlZHVjdGlvbiBkaW1lbnNpb25zKSkpLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGlzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBhcnJheSBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW4gYGF4aXNgLlxuICogSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoIGxlbmd0aCAxLlxuICogSWYgYGF4aXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGFuIGFycmF5IHdpdGggYVxuICogc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHgubG9nU3VtRXhwKCkucHJpbnQoKTsgIC8vIG9yIHRmLmxvZ1N1bUV4cCh4KVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LmxvZ1N1bUV4cChheGlzKS5wcmludCgpOyAgLy8gb3IgdGYubG9nU3VtRXhwKGEsIGF4aXMpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uKHMpIHRvIHJlZHVjZS4gSWYgbnVsbCAodGhlIGRlZmF1bHQpLFxuICogICAgIHJlZHVjZXMgYWxsIGRpbWVuc2lvbnMuXG4gKiBAcGFyYW0ga2VlcERpbXMgSWYgdHJ1ZSwgcmV0YWlucyByZWR1Y2VkIGRpbWVuc2lvbnMgd2l0aCBsZW5ndGhcbiAqICAgICBvZiAxLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBsb2dTdW1FeHBfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLCBrZWVwRGltcyA9IGZhbHNlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2xvZ1N1bUV4cCcpO1xuXG4gIGNvbnN0IGF4ZXMgPSBwYXJzZUF4aXNQYXJhbShheGlzLCAkeC5zaGFwZSk7XG4gIGNvbnN0IHhNYXggPSBtYXgoJHgsIGF4ZXMsIHRydWUgLyoga2VlcERpbXMgKi8pO1xuICBjb25zdCBhID0gc3ViKCR4LCB4TWF4KTtcbiAgY29uc3QgYiA9IGV4cChhKTtcbiAgY29uc3QgYyA9IHN1bShiLCBheGVzKTtcbiAgY29uc3QgZCA9IGxvZyhjKTtcbiAgY29uc3QgcmVzID0gYWRkKHJlc2hhcGUoeE1heCwgZC5zaGFwZSksIGQpO1xuXG4gIGlmIChrZWVwRGltcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0ocmVzLnNoYXBlLCBheGVzKTtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIG5ld1NoYXBlKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXMgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGxvZ1N1bUV4cCA9IG9wKHtsb2dTdW1FeHBffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LogicalAnd } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of `a AND b` element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([false, false, true, true], 'bool');\n * const b = tf.tensor1d([false, true, false, true], 'bool');\n *\n * a.logicalAnd(b).print();\n * ```\n *\n * @param a The first input tensor. Must be of dtype bool.\n * @param b The second input tensor. Must be of dtype bool.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction logicalAnd_(a, b) {\n    const $a = convertToTensor(a, 'a', 'logicalAnd', 'bool');\n    const $b = convertToTensor(b, 'b', 'logicalAnd', 'bool');\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(LogicalAnd, inputs);\n}\nexport const logicalAnd = op({ logicalAnd_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dpY2FsX2FuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFHN0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLFdBQVcsQ0FDaEIsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFxQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWhELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtMb2dpY2FsQW5kLCBMb2dpY2FsQW5kSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYGEgQU5EIGJgIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoW2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKlxuICogYS5sb2dpY2FsQW5kKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsb2dpY2FsQW5kXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbG9naWNhbEFuZCcsICdib29sJyk7XG4gIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2xvZ2ljYWxBbmQnLCAnYm9vbCcpO1xuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogTG9naWNhbEFuZElucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZ2ljYWxBbmQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gb3Aoe2xvZ2ljYWxBbmRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LogicalNot } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the truth value of `NOT x` element-wise.\n *\n * ```js\n * const a = tf.tensor1d([false, true], 'bool');\n *\n * a.logicalNot().print();\n * ```\n *\n * @param x The input tensor. Must be of dtype 'bool'.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction logicalNot_(x) {\n    const $x = convertToTensor(x, 'x', 'logicalNot', 'bool');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(LogicalNot, inputs);\n}\nexport const logicalNot = op({ logicalNot_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9ub3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dpY2FsX25vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxVQUFVLEVBQW1CLE1BQU0saUJBQWlCLENBQUM7QUFHN0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLENBQWU7SUFDcEQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFxQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUN6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFdBQVcsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtMb2dpY2FsTm90LCBMb2dpY2FsTm90SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSB0cnV0aCB2YWx1ZSBvZiBgTk9UIHhgIGVsZW1lbnQtd2lzZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFtmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKlxuICogYS5sb2dpY2FsTm90KCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuIE11c3QgYmUgb2YgZHR5cGUgJ2Jvb2wnLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsb2dpY2FsTm90XzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbG9naWNhbE5vdCcsICdib29sJyk7XG4gIGNvbnN0IGlucHV0czogTG9naWNhbE5vdElucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZ2ljYWxOb3QsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsTm90ID0gb3Aoe2xvZ2ljYWxOb3RffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LogicalOr } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of `a OR b` element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([false, false, true, true], 'bool');\n * const b = tf.tensor1d([false, true, false, true], 'bool');\n *\n * a.logicalOr(b).print();\n * ```\n * @param a The first input tensor. Must be of dtype bool.\n * @param b The second input tensor. Must be of dtype bool.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction logicalOr_(a, b) {\n    const $a = convertToTensor(a, 'a', 'logicalOr', 'bool');\n    const $b = convertToTensor(b, 'b', 'logicalOr', 'bool');\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(LogicalOr, inputs);\n}\nexport const logicalOr = op({ logicalOr_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9vci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvZ2ljYWxfb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQixNQUFNLGlCQUFpQixDQUFDO0FBRzNELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLFVBQVUsQ0FDZixDQUFvQixFQUFFLENBQW9CO0lBQzVDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQW9CLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDL0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDckUsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TG9naWNhbE9yLCBMb2dpY2FsT3JJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYGEgT1IgYmAgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IGIgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqXG4gKiBhLmxvZ2ljYWxPcihiKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsb2dpY2FsT3JfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdsb2dpY2FsT3InLCAnYm9vbCcpO1xuICBjb25zdCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdsb2dpY2FsT3InLCAnYm9vbCcpO1xuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogTG9naWNhbE9ySW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKExvZ2ljYWxPciwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBsb2dpY2FsT3IgPSBvcCh7bG9naWNhbE9yX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { logicalAnd } from './logical_and';\nimport { logicalNot } from './logical_not';\nimport { logicalOr } from './logical_or';\nimport { op } from './operation';\n/**\n * Returns the truth value of `a XOR b` element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([false, false, true, true], 'bool');\n * const b = tf.tensor1d([false, true, false, true], 'bool');\n *\n * a.logicalXor(b).print();\n * ```\n *\n * @param a The first input tensor. Must be of dtype bool.\n * @param b The second input tensor. Must be of dtype bool.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction logicalXor_(a, b) {\n    const $a = convertToTensor(a, 'a', 'logicalXor', 'bool');\n    const $b = convertToTensor(b, 'b', 'logicalXor', 'bool');\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    // x ^ y = (x | y) & ~(x & y)\n    return logicalAnd(logicalOr(a, b), logicalNot(logicalAnd(a, b)));\n}\nexport const logicalXor = op({ logicalXor_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF94b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb2dpY2FsX3hvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsV0FBVyxDQUNoQixDQUFvQixFQUFFLENBQW9CO0lBQzVDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN6RCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDekQsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsNkJBQTZCO0lBQzdCLE9BQU8sVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Fzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlfSBmcm9tICcuL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7bG9naWNhbEFuZH0gZnJvbSAnLi9sb2dpY2FsX2FuZCc7XG5pbXBvcnQge2xvZ2ljYWxOb3R9IGZyb20gJy4vbG9naWNhbF9ub3QnO1xuaW1wb3J0IHtsb2dpY2FsT3J9IGZyb20gJy4vbG9naWNhbF9vcic7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgYGEgWE9SIGJgIGVsZW1lbnQtd2lzZS4gU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoW2ZhbHNlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZV0sICdib29sJyk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoW2ZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZV0sICdib29sJyk7XG4gKlxuICogYS5sb2dpY2FsWG9yKGIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLiBNdXN0IGJlIG9mIGR0eXBlIGJvb2wuXG4gKiBAcGFyYW0gYiBUaGUgc2Vjb25kIGlucHV0IHRlbnNvci4gTXVzdCBiZSBvZiBkdHlwZSBib29sLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5mdW5jdGlvbiBsb2dpY2FsWG9yXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnbG9naWNhbFhvcicsICdib29sJyk7XG4gIGNvbnN0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ2xvZ2ljYWxYb3InLCAnYm9vbCcpO1xuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIC8vIHggXiB5ID0gKHggfCB5KSAmIH4oeCAmIHkpXG4gIHJldHVybiBsb2dpY2FsQW5kKGxvZ2ljYWxPcihhLCBiKSwgbG9naWNhbE5vdChsb2dpY2FsQW5kKGEsIGIpKSk7XG59XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsWG9yID0gb3Aoe2xvZ2ljYWxYb3JffSk7XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SearchSorted } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { sizeFromShape } from '../util_base';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nconst INT32_MAX = 2147483648;\n/**\n * Searches for where a value would go in a sorted sequence.\n *\n * This is not a method for checking containment (like javascript in).\n *\n * The typical use case for this operation is \"binning\", \"bucketing\", or\n * \"discretizing\". The values are assigned to bucket-indices based on the edges\n * listed in 'sortedSequence'. This operation returns the bucket-index for each\n * value.\n *\n * The side argument controls which index is returned if a value lands exactly\n * on an edge.\n *\n * The axis is not settable for this operation. It always operates on the\n * innermost dimension (axis=-1). The operation will accept any number of outer\n * dimensions.\n *\n * Note: This operation assumes that 'sortedSequence' is sorted along the\n * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not\n * sorted no error is raised and the content of the returned tensor is not well\n * defined.\n *\n * ```js\n * const edges = tf.tensor1d([-1, 3.3, 9.1, 10.0]);\n * let values = tf.tensor1d([0.0, 4.1, 12.0]);\n * const result1 = tf.searchSorted(edges, values, 'left');\n * result1.print(); // [1, 2, 4]\n *\n * const seq = tf.tensor1d([0, 3, 9, 10, 10]);\n * values = tf.tensor1d([0, 4, 10]);\n * const result2 = tf.searchSorted(seq, values, 'left');\n * result2.print(); // [0, 2, 3]\n * const result3 = tf.searchSorted(seq, values, 'right');\n * result3.print(); // [1, 2, 5]\n *\n * const sortedSequence = tf.tensor2d([[0., 3., 8., 9., 10.],\n *                                     [1., 2., 3., 4., 5.]]);\n * values = tf.tensor2d([[9.8, 2.1, 4.3],\n *                       [0.1, 6.6, 4.5, ]]);\n * const result4 = tf.searchSorted(sortedSequence, values, 'left');\n * result4.print(); // [[4, 1, 2], [0, 5, 4]]\n * ```\n * @param sortedSequence: N-D. Sorted sequence.\n * @param values: N-D. Search values.\n * @param side: 'left'|'right'. Defaults to 'left'. 'left' corresponds to lower\n *     bound and 'right' to upper bound.\n * @return An N-D int32 tensor the size of values containing the result of\n *     applying either lower bound or upper bound (depending on side) to each\n *     value. The result is not a global index to the entire Tensor, but the\n *     index in the last dimension.\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nfunction searchSorted_(sortedSequence, values, side = 'left') {\n    const $sortedSequence = convertToTensor(sortedSequence, 'sortedSequence', 'searchSorted');\n    const $values = convertToTensor(values, 'values', 'searchSorted');\n    const sequenceSize = $sortedSequence.shape[$sortedSequence.shape.length - 1];\n    const valuesSize = $values.shape[$values.shape.length - 1];\n    const $sortedSequence2D = reshape($sortedSequence, [-1, sequenceSize]);\n    const $values2D = reshape($values, [-1, valuesSize]);\n    if ($sortedSequence2D.rank < 2) {\n        throw new Error(`Sorted input argument must be at least 2-dimensional`);\n    }\n    if ($sortedSequence2D.shape[0] !== $values2D.shape[0]) {\n        throw new Error(`Leading dimension of 'sortedSequence' and 'values' must match.`);\n    }\n    if (sizeFromShape($values2D.shape) >= INT32_MAX) {\n        throw new Error(`values tensor size must less than ${INT32_MAX}`);\n    }\n    if ($sortedSequence2D.shape[1] >= INT32_MAX) {\n        throw new Error(`trailing dim_size must less than ${INT32_MAX} for int32 output type, was ${$sortedSequence2D.shape[1]}`);\n    }\n    const inputs = {\n        sortedSequence: $sortedSequence2D,\n        values: $values2D,\n    };\n    const attrs = { side };\n    return ENGINE.runKernel(SearchSorted, inputs, attrs);\n}\nexport const searchSorted = op({ searchSorted_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoX3NvcnRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NlYXJjaF9zb3J0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBRXBGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUM7QUFDN0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1ERztBQUNILFNBQVMsYUFBYSxDQUNsQixjQUFpQyxFQUFFLE1BQXlCLEVBQzVELE9BQXVCLE1BQU07SUFDL0IsTUFBTSxlQUFlLEdBQ2pCLGVBQWUsQ0FBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDdEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFbEUsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM3RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzNELE1BQU0saUJBQWlCLEdBQUcsT0FBTyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDdkUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFckQsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsc0RBQXNELENBQUMsQ0FBQztLQUN6RTtJQUNELElBQUksaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckQsTUFBTSxJQUFJLEtBQUssQ0FDWCxnRUFBZ0UsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLFNBQVMsRUFBRTtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUFDLHFDQUFxQyxTQUFTLEVBQUUsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsSUFBSSxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksU0FBUyxFQUFFO1FBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQ1osU0FBUywrQkFBK0IsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUMzRTtJQUVELE1BQU0sTUFBTSxHQUF1QjtRQUNqQyxjQUFjLEVBQUUsaUJBQWlCO1FBQ2pDLE1BQU0sRUFBRSxTQUFTO0tBQ2xCLENBQUM7SUFDRixNQUFNLEtBQUssR0FBc0IsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUV4QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLE1BQVksRUFBRSxLQUFXLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTZWFyY2hTb3J0ZWQsIFNlYXJjaFNvcnRlZEF0dHJzLCBTZWFyY2hTb3J0ZWRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3NpemVGcm9tU2hhcGV9IGZyb20gJy4uL3V0aWxfYmFzZSc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbmNvbnN0IElOVDMyX01BWCA9IDIxNDc0ODM2NDg7XG4vKipcbiAqIFNlYXJjaGVzIGZvciB3aGVyZSBhIHZhbHVlIHdvdWxkIGdvIGluIGEgc29ydGVkIHNlcXVlbmNlLlxuICpcbiAqIFRoaXMgaXMgbm90IGEgbWV0aG9kIGZvciBjaGVja2luZyBjb250YWlubWVudCAobGlrZSBqYXZhc2NyaXB0IGluKS5cbiAqXG4gKiBUaGUgdHlwaWNhbCB1c2UgY2FzZSBmb3IgdGhpcyBvcGVyYXRpb24gaXMgXCJiaW5uaW5nXCIsIFwiYnVja2V0aW5nXCIsIG9yXG4gKiBcImRpc2NyZXRpemluZ1wiLiBUaGUgdmFsdWVzIGFyZSBhc3NpZ25lZCB0byBidWNrZXQtaW5kaWNlcyBiYXNlZCBvbiB0aGUgZWRnZXNcbiAqIGxpc3RlZCBpbiAnc29ydGVkU2VxdWVuY2UnLiBUaGlzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBidWNrZXQtaW5kZXggZm9yIGVhY2hcbiAqIHZhbHVlLlxuICpcbiAqIFRoZSBzaWRlIGFyZ3VtZW50IGNvbnRyb2xzIHdoaWNoIGluZGV4IGlzIHJldHVybmVkIGlmIGEgdmFsdWUgbGFuZHMgZXhhY3RseVxuICogb24gYW4gZWRnZS5cbiAqXG4gKiBUaGUgYXhpcyBpcyBub3Qgc2V0dGFibGUgZm9yIHRoaXMgb3BlcmF0aW9uLiBJdCBhbHdheXMgb3BlcmF0ZXMgb24gdGhlXG4gKiBpbm5lcm1vc3QgZGltZW5zaW9uIChheGlzPS0xKS4gVGhlIG9wZXJhdGlvbiB3aWxsIGFjY2VwdCBhbnkgbnVtYmVyIG9mIG91dGVyXG4gKiBkaW1lbnNpb25zLlxuICpcbiAqIE5vdGU6IFRoaXMgb3BlcmF0aW9uIGFzc3VtZXMgdGhhdCAnc29ydGVkU2VxdWVuY2UnIGlzIHNvcnRlZCBhbG9uZyB0aGVcbiAqIGlubmVybW9zdCBheGlzLCBtYXliZSB1c2luZyAnc29ydCguLi4sIGF4aXM9LTEpJy4gSWYgdGhlIHNlcXVlbmNlIGlzIG5vdFxuICogc29ydGVkIG5vIGVycm9yIGlzIHJhaXNlZCBhbmQgdGhlIGNvbnRlbnQgb2YgdGhlIHJldHVybmVkIHRlbnNvciBpcyBub3Qgd2VsbFxuICogZGVmaW5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgZWRnZXMgPSB0Zi50ZW5zb3IxZChbLTEsIDMuMywgOS4xLCAxMC4wXSk7XG4gKiBsZXQgdmFsdWVzID0gdGYudGVuc29yMWQoWzAuMCwgNC4xLCAxMi4wXSk7XG4gKiBjb25zdCByZXN1bHQxID0gdGYuc2VhcmNoU29ydGVkKGVkZ2VzLCB2YWx1ZXMsICdsZWZ0Jyk7XG4gKiByZXN1bHQxLnByaW50KCk7IC8vIFsxLCAyLCA0XVxuICpcbiAqIGNvbnN0IHNlcSA9IHRmLnRlbnNvcjFkKFswLCAzLCA5LCAxMCwgMTBdKTtcbiAqIHZhbHVlcyA9IHRmLnRlbnNvcjFkKFswLCA0LCAxMF0pO1xuICogY29uc3QgcmVzdWx0MiA9IHRmLnNlYXJjaFNvcnRlZChzZXEsIHZhbHVlcywgJ2xlZnQnKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gWzAsIDIsIDNdXG4gKiBjb25zdCByZXN1bHQzID0gdGYuc2VhcmNoU29ydGVkKHNlcSwgdmFsdWVzLCAncmlnaHQnKTtcbiAqIHJlc3VsdDMucHJpbnQoKTsgLy8gWzEsIDIsIDVdXG4gKlxuICogY29uc3Qgc29ydGVkU2VxdWVuY2UgPSB0Zi50ZW5zb3IyZChbWzAuLCAzLiwgOC4sIDkuLCAxMC5dLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEuLCAyLiwgMy4sIDQuLCA1Ll1dKTtcbiAqIHZhbHVlcyA9IHRmLnRlbnNvcjJkKFtbOS44LCAyLjEsIDQuM10sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgWzAuMSwgNi42LCA0LjUsIF1dKTtcbiAqIGNvbnN0IHJlc3VsdDQgPSB0Zi5zZWFyY2hTb3J0ZWQoc29ydGVkU2VxdWVuY2UsIHZhbHVlcywgJ2xlZnQnKTtcbiAqIHJlc3VsdDQucHJpbnQoKTsgLy8gW1s0LCAxLCAyXSwgWzAsIDUsIDRdXVxuICogYGBgXG4gKiBAcGFyYW0gc29ydGVkU2VxdWVuY2U6IE4tRC4gU29ydGVkIHNlcXVlbmNlLlxuICogQHBhcmFtIHZhbHVlczogTi1ELiBTZWFyY2ggdmFsdWVzLlxuICogQHBhcmFtIHNpZGU6ICdsZWZ0J3wncmlnaHQnLiBEZWZhdWx0cyB0byAnbGVmdCcuICdsZWZ0JyBjb3JyZXNwb25kcyB0byBsb3dlclxuICogICAgIGJvdW5kIGFuZCAncmlnaHQnIHRvIHVwcGVyIGJvdW5kLlxuICogQHJldHVybiBBbiBOLUQgaW50MzIgdGVuc29yIHRoZSBzaXplIG9mIHZhbHVlcyBjb250YWluaW5nIHRoZSByZXN1bHQgb2ZcbiAqICAgICBhcHBseWluZyBlaXRoZXIgbG93ZXIgYm91bmQgb3IgdXBwZXIgYm91bmQgKGRlcGVuZGluZyBvbiBzaWRlKSB0byBlYWNoXG4gKiAgICAgdmFsdWUuIFRoZSByZXN1bHQgaXMgbm90IGEgZ2xvYmFsIGluZGV4IHRvIHRoZSBlbnRpcmUgVGVuc29yLCBidXQgdGhlXG4gKiAgICAgaW5kZXggaW4gdGhlIGxhc3QgZGltZW5zaW9uLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnRXZhbHVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNlYXJjaFNvcnRlZF8oXG4gICAgc29ydGVkU2VxdWVuY2U6IFRlbnNvcnxUZW5zb3JMaWtlLCB2YWx1ZXM6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIHNpZGU6ICdsZWZ0J3wncmlnaHQnID0gJ2xlZnQnKTogVGVuc29yIHtcbiAgY29uc3QgJHNvcnRlZFNlcXVlbmNlID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihzb3J0ZWRTZXF1ZW5jZSwgJ3NvcnRlZFNlcXVlbmNlJywgJ3NlYXJjaFNvcnRlZCcpO1xuICBjb25zdCAkdmFsdWVzID0gY29udmVydFRvVGVuc29yKHZhbHVlcywgJ3ZhbHVlcycsICdzZWFyY2hTb3J0ZWQnKTtcblxuICBjb25zdCBzZXF1ZW5jZVNpemUgPSAkc29ydGVkU2VxdWVuY2Uuc2hhcGVbJHNvcnRlZFNlcXVlbmNlLnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCB2YWx1ZXNTaXplID0gJHZhbHVlcy5zaGFwZVskdmFsdWVzLnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCAkc29ydGVkU2VxdWVuY2UyRCA9IHJlc2hhcGUoJHNvcnRlZFNlcXVlbmNlLCBbLTEsIHNlcXVlbmNlU2l6ZV0pO1xuICBjb25zdCAkdmFsdWVzMkQgPSByZXNoYXBlKCR2YWx1ZXMsIFstMSwgdmFsdWVzU2l6ZV0pO1xuXG4gIGlmICgkc29ydGVkU2VxdWVuY2UyRC5yYW5rIDwgMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgU29ydGVkIGlucHV0IGFyZ3VtZW50IG11c3QgYmUgYXQgbGVhc3QgMi1kaW1lbnNpb25hbGApO1xuICB9XG4gIGlmICgkc29ydGVkU2VxdWVuY2UyRC5zaGFwZVswXSAhPT0gJHZhbHVlczJELnNoYXBlWzBdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgTGVhZGluZyBkaW1lbnNpb24gb2YgJ3NvcnRlZFNlcXVlbmNlJyBhbmQgJ3ZhbHVlcycgbXVzdCBtYXRjaC5gKTtcbiAgfVxuICBpZiAoc2l6ZUZyb21TaGFwZSgkdmFsdWVzMkQuc2hhcGUpID49IElOVDMyX01BWCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgdmFsdWVzIHRlbnNvciBzaXplIG11c3QgbGVzcyB0aGFuICR7SU5UMzJfTUFYfWApO1xuICB9XG4gIGlmICgkc29ydGVkU2VxdWVuY2UyRC5zaGFwZVsxXSA+PSBJTlQzMl9NQVgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHRyYWlsaW5nIGRpbV9zaXplIG11c3QgbGVzcyB0aGFuICR7XG4gICAgICAgIElOVDMyX01BWH0gZm9yIGludDMyIG91dHB1dCB0eXBlLCB3YXMgJHskc29ydGVkU2VxdWVuY2UyRC5zaGFwZVsxXX1gKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogU2VhcmNoU29ydGVkSW5wdXRzID0ge1xuICAgIHNvcnRlZFNlcXVlbmNlOiAkc29ydGVkU2VxdWVuY2UyRCxcbiAgICB2YWx1ZXM6ICR2YWx1ZXMyRCxcbiAgfTtcbiAgY29uc3QgYXR0cnM6IFNlYXJjaFNvcnRlZEF0dHJzID0ge3NpZGV9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNlYXJjaFNvcnRlZCwgaW5wdXRzIGFzIHt9LCBhdHRycyBhcyB7fSk7XG59XG5cbmV4cG9ydCBjb25zdCBzZWFyY2hTb3J0ZWQgPSBvcCh7c2VhcmNoU29ydGVkX30pO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { searchSorted } from './search_sorted';\n/**\n * Searches for where a value would go in a sorted sequence.\n *\n * This is not a method for checking containment (like javascript in).\n *\n * The typical use case for this operation is \"binning\", \"bucketing\", or\n * \"discretizing\". The values are assigned to bucket-indices based on the edges\n * listed in 'sortedSequence'. This operation returns the bucket-index for each\n * value.\n *\n * The index returned corresponds to the first edge greater than or equal to the\n * value.\n *\n * The axis is not settable for this operation. It always operates on the\n * innermost dimension (axis=-1). The operation will accept any number of outer\n * dimensions.\n *\n * Note: This operation assumes that 'lowerBound' is sorted along the\n * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not\n * sorted no error is raised and the content of the returned tensor is not well\n * defined.\n *\n * ```js\n * const edges = tf.tensor1d([-1, 3.3, 9.1, 10.0]);\n * let values = tf.tensor1d([0.0, 4.1, 12.0]);\n * const result1 = tf.lowerBound(edges, values);\n * result1.print(); // [1, 2, 4]\n *\n * const seq = tf.tensor1d([0, 3, 9, 10, 10]);\n * values = tf.tensor1d([0, 4, 10]);\n * const result2 = tf.lowerBound(seq, values);\n * result2.print(); // [0, 2, 3]\n *\n * const sortedSequence = tf.tensor2d([[0., 3., 8., 9., 10.],\n *                                     [1., 2., 3., 4., 5.]]);\n * values = tf.tensor2d([[9.8, 2.1, 4.3],\n *                       [0.1, 6.6, 4.5, ]]);\n * const result3 = tf.lowerBound(sortedSequence, values);\n * result3.print(); // [[4, 1, 2], [0, 5, 4]]\n * ```\n * @param sortedSequence: N-D. Sorted sequence.\n * @param values: N-D. Search values.\n * @return An N-D int32 tensor the size of values containing the result of\n *     applying lower bound to each value. The result is not a global index to\n *     the entire Tensor, but the index in the last dimension.\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nexport function lowerBound(sortedSequence, values) {\n    return searchSorted(sortedSequence, values, 'left');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG93ZXJfYm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb3dlcl9ib3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Q0c7QUFDSCxNQUFNLFVBQVUsVUFBVSxDQUN0QixjQUFpQyxFQUFFLE1BQXlCO0lBQzlELE9BQU8sWUFBWSxDQUFDLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7c2VhcmNoU29ydGVkfSBmcm9tICcuL3NlYXJjaF9zb3J0ZWQnO1xuXG4vKipcbiAqIFNlYXJjaGVzIGZvciB3aGVyZSBhIHZhbHVlIHdvdWxkIGdvIGluIGEgc29ydGVkIHNlcXVlbmNlLlxuICpcbiAqIFRoaXMgaXMgbm90IGEgbWV0aG9kIGZvciBjaGVja2luZyBjb250YWlubWVudCAobGlrZSBqYXZhc2NyaXB0IGluKS5cbiAqXG4gKiBUaGUgdHlwaWNhbCB1c2UgY2FzZSBmb3IgdGhpcyBvcGVyYXRpb24gaXMgXCJiaW5uaW5nXCIsIFwiYnVja2V0aW5nXCIsIG9yXG4gKiBcImRpc2NyZXRpemluZ1wiLiBUaGUgdmFsdWVzIGFyZSBhc3NpZ25lZCB0byBidWNrZXQtaW5kaWNlcyBiYXNlZCBvbiB0aGUgZWRnZXNcbiAqIGxpc3RlZCBpbiAnc29ydGVkU2VxdWVuY2UnLiBUaGlzIG9wZXJhdGlvbiByZXR1cm5zIHRoZSBidWNrZXQtaW5kZXggZm9yIGVhY2hcbiAqIHZhbHVlLlxuICpcbiAqIFRoZSBpbmRleCByZXR1cm5lZCBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgZWRnZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlXG4gKiB2YWx1ZS5cbiAqXG4gKiBUaGUgYXhpcyBpcyBub3Qgc2V0dGFibGUgZm9yIHRoaXMgb3BlcmF0aW9uLiBJdCBhbHdheXMgb3BlcmF0ZXMgb24gdGhlXG4gKiBpbm5lcm1vc3QgZGltZW5zaW9uIChheGlzPS0xKS4gVGhlIG9wZXJhdGlvbiB3aWxsIGFjY2VwdCBhbnkgbnVtYmVyIG9mIG91dGVyXG4gKiBkaW1lbnNpb25zLlxuICpcbiAqIE5vdGU6IFRoaXMgb3BlcmF0aW9uIGFzc3VtZXMgdGhhdCAnbG93ZXJCb3VuZCcgaXMgc29ydGVkIGFsb25nIHRoZVxuICogaW5uZXJtb3N0IGF4aXMsIG1heWJlIHVzaW5nICdzb3J0KC4uLiwgYXhpcz0tMSknLiBJZiB0aGUgc2VxdWVuY2UgaXMgbm90XG4gKiBzb3J0ZWQgbm8gZXJyb3IgaXMgcmFpc2VkIGFuZCB0aGUgY29udGVudCBvZiB0aGUgcmV0dXJuZWQgdGVuc29yIGlzIG5vdCB3ZWxsXG4gKiBkZWZpbmVkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBlZGdlcyA9IHRmLnRlbnNvcjFkKFstMSwgMy4zLCA5LjEsIDEwLjBdKTtcbiAqIGxldCB2YWx1ZXMgPSB0Zi50ZW5zb3IxZChbMC4wLCA0LjEsIDEyLjBdKTtcbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5sb3dlckJvdW5kKGVkZ2VzLCB2YWx1ZXMpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbMSwgMiwgNF1cbiAqXG4gKiBjb25zdCBzZXEgPSB0Zi50ZW5zb3IxZChbMCwgMywgOSwgMTAsIDEwXSk7XG4gKiB2YWx1ZXMgPSB0Zi50ZW5zb3IxZChbMCwgNCwgMTBdKTtcbiAqIGNvbnN0IHJlc3VsdDIgPSB0Zi5sb3dlckJvdW5kKHNlcSwgdmFsdWVzKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gWzAsIDIsIDNdXG4gKlxuICogY29uc3Qgc29ydGVkU2VxdWVuY2UgPSB0Zi50ZW5zb3IyZChbWzAuLCAzLiwgOC4sIDkuLCAxMC5dLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEuLCAyLiwgMy4sIDQuLCA1Ll1dKTtcbiAqIHZhbHVlcyA9IHRmLnRlbnNvcjJkKFtbOS44LCAyLjEsIDQuM10sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgWzAuMSwgNi42LCA0LjUsIF1dKTtcbiAqIGNvbnN0IHJlc3VsdDMgPSB0Zi5sb3dlckJvdW5kKHNvcnRlZFNlcXVlbmNlLCB2YWx1ZXMpO1xuICogcmVzdWx0My5wcmludCgpOyAvLyBbWzQsIDEsIDJdLCBbMCwgNSwgNF1dXG4gKiBgYGBcbiAqIEBwYXJhbSBzb3J0ZWRTZXF1ZW5jZTogTi1ELiBTb3J0ZWQgc2VxdWVuY2UuXG4gKiBAcGFyYW0gdmFsdWVzOiBOLUQuIFNlYXJjaCB2YWx1ZXMuXG4gKiBAcmV0dXJuIEFuIE4tRCBpbnQzMiB0ZW5zb3IgdGhlIHNpemUgb2YgdmFsdWVzIGNvbnRhaW5pbmcgdGhlIHJlc3VsdCBvZlxuICogICAgIGFwcGx5aW5nIGxvd2VyIGJvdW5kIHRvIGVhY2ggdmFsdWUuIFRoZSByZXN1bHQgaXMgbm90IGEgZ2xvYmFsIGluZGV4IHRvXG4gKiAgICAgdGhlIGVudGlyZSBUZW5zb3IsIGJ1dCB0aGUgaW5kZXggaW4gdGhlIGxhc3QgZGltZW5zaW9uLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnRXZhbHVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb3dlckJvdW5kKFxuICAgIHNvcnRlZFNlcXVlbmNlOiBUZW5zb3J8VGVuc29yTGlrZSwgdmFsdWVzOiBUZW5zb3J8VGVuc29yTGlrZSk6IFRlbnNvciB7XG4gIHJldHVybiBzZWFyY2hTb3J0ZWQoc29ydGVkU2VxdWVuY2UsIHZhbHVlcywgJ2xlZnQnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPool } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the 2D max pooling of an image.\n *\n * @param x The input tensor, of rank 4 or rank 3 of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n *     `strides` is a single number, then `strideHeight == strideWidth`.\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n *     in which we sample input values across the height and width dimensions\n *     in dilated pooling. Defaults to `[1, 1]`. If `dilations` is a single\n *     number, then `dilationHeight == dilationWidth`. If it is greater than\n *     1, then all values of `strides` must be 1.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *    - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n */\nfunction maxPool_(x, filterSize, strides, pad, dimRoundingMode) {\n    const $x = convertToTensor(x, 'x', 'maxPool');\n    const dilations = 1;\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    util.assert(x4D.rank === 4, () => `Error in maxPool: input must be rank 4 but got rank ${x4D.rank}.`);\n    util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    conv_util.checkPadOnDimRoundingMode('maxPool', pad, dimRoundingMode);\n    const inputs = { x: x4D };\n    const attrs = { filterSize, strides, pad, dimRoundingMode };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(MaxPool, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const maxPool = op({ maxPool_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tYXhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQThCLE1BQU0saUJBQWlCLENBQUM7QUFJckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sS0FBSyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsU0FBUyxRQUFRLENBQ2IsQ0FBZSxFQUFFLFVBQW1DLEVBQ3BELE9BQWdDLEVBQ2hDLEdBQW9ELEVBQ3BELGVBQXdDO0lBQzFDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQztJQUVwQixJQUFJLEdBQUcsR0FBRyxFQUFjLENBQUM7SUFDekIsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDL0Q7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLHVEQUF1RCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM5RSxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLEVBQzVELEdBQUcsRUFBRSxDQUFDLDJEQUEyRDtRQUM3RCxlQUFlLE9BQU8sbUJBQW1CLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDL0QsU0FBUyxDQUFDLHlCQUF5QixDQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxDQUFDO0lBQ3ZDLE1BQU0sS0FBSyxHQUFpQixFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxDQUFDO0lBRXhFLDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLE9BQU8sRUFBRSxNQUE4QixFQUN2QyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtNYXhQb29sLCBNYXhQb29sQXR0cnMsIE1heFBvb2xJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSAyRCBtYXggcG9vbGluZyBvZiBhbiBpbWFnZS5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBkaWxhdGVkIHBvb2xpbmcuIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAgLSBGb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfGNvbnZfdXRpbC5FeHBsaWNpdFBhZGRpbmcsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sJyk7XG4gIGNvbnN0IGRpbGF0aW9ucyA9IDE7XG5cbiAgbGV0IHg0RCA9ICR4IGFzIFRlbnNvcjREO1xuICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NEQucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgJHt4NEQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgY29udl91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ21heFBvb2wnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGlucHV0czogTWF4UG9vbElucHV0cyA9IHt4OiB4NER9O1xuICBjb25zdCBhdHRyczogTWF4UG9vbEF0dHJzID0ge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBNYXhQb29sLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sID0gb3Aoe21heFBvb2xffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPool3D } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { checkPadOnDimRoundingMode } from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the 3D max pooling.\n *\n * ```js\n * const x = tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]);\n * const result = tf.maxPool3d(x, 2, 1, 'valid');\n * result.print();\n * ```\n *\n * @param x The input tensor, of rank 5 or rank 4 of shape\n *     `[batch, depth, height, width, inChannels]`.\n * @param filterSize The filter size:\n *     `[filterDepth, filterHeight, filterWidth]`.\n *     If `filterSize` is a single number,\n *     then `filterDepth == filterHeight == filterWidth`.\n * @param strides The strides of the pooling:\n *     `[strideDepth, strideHeight, strideWidth]`.\n *     If `strides` is a single number,\n *     then `strideDepth == strideHeight == strideWidth`.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1*1x1.\n *    - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n *     \"NDHWC\". Specify the data format of the input and output data. With the\n *     default format \"NDHWC\", the data is stored in the order of: [batch,\n *     depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction maxPool3d_(x, filterSize = [1, 1, 1], strides, pad, dimRoundingMode, dataFormat = 'NDHWC') {\n    const $x = convertToTensor(x, 'x', 'maxPool3d');\n    let x5D = $x;\n    let reshapedTo5D = false;\n    if ($x.rank === 4) {\n        reshapedTo5D = true;\n        x5D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2], $x.shape[3]]);\n    }\n    util.assert(x5D.rank === 5, () => `Error in maxPool3d: x must be rank 5 but got rank ${x5D.rank}.`);\n    util.assert(dataFormat === 'NDHWC', () => `Error in maxPool3d: Only NDHWC is currently supported, ` +\n        `but got dataFormat of ${dataFormat}`);\n    checkPadOnDimRoundingMode('maxPool3d', pad, dimRoundingMode);\n    const inputs = { x: x5D };\n    const attrs = { filterSize, strides, pad, dimRoundingMode, dataFormat };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(MaxPool3D, inputs, attrs);\n    if (reshapedTo5D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n    }\n    return res;\n}\nexport const maxPool3d = op({ maxPool3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tYXhfcG9vbF8zZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxTQUFTLEVBQWtDLE1BQU0saUJBQWlCLENBQUM7QUFJM0UsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxTQUFTLFVBQVUsQ0FDZixDQUFlLEVBQUUsYUFBOEMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUN4RSxPQUF3QyxFQUFFLEdBQTBCLEVBQ3BFLGVBQXdDLEVBQ3hDLGFBQThCLE9BQU87SUFDdkMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFaEQsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDNUU7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLHFEQUFxRCxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUM1RSxJQUFJLENBQUMsTUFBTSxDQUNQLFVBQVUsS0FBSyxPQUFPLEVBQ3RCLEdBQUcsRUFBRSxDQUFDLHlEQUF5RDtRQUMzRCx5QkFBeUIsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUMvQyx5QkFBeUIsQ0FBQyxXQUFXLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQzdELE1BQU0sTUFBTSxHQUFvQixFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsQ0FBQztJQUN6QyxNQUFNLEtBQUssR0FDVSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsQ0FBQztJQUU3RSwwREFBMEQ7SUFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixTQUFTLEVBQUUsTUFBOEIsRUFDekMsS0FBMkIsQ0FBTSxDQUFDO0lBRWxELElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUNILEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztLQUNQO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtNYXhQb29sM0QsIE1heFBvb2wzREF0dHJzLCBNYXhQb29sM0RJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yNEQsIFRlbnNvcjVEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2NoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGV9IGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgM0QgbWF4IHBvb2xpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I1ZChbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsxLCAyLCAyLCAyLCAxXSk7XG4gKiBjb25zdCByZXN1bHQgPSB0Zi5tYXhQb29sM2QoeCwgMiwgMSwgJ3ZhbGlkJyk7XG4gKiByZXN1bHQucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNSBvciByYW5rIDQgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc11gLlxuICogQHBhcmFtIGZpbHRlclNpemUgVGhlIGZpbHRlciBzaXplOlxuICogICAgIGBbZmlsdGVyRGVwdGgsIGZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdYC5cbiAqICAgICBJZiBgZmlsdGVyU2l6ZWAgaXMgYSBzaW5nbGUgbnVtYmVyLFxuICogICAgIHRoZW4gYGZpbHRlckRlcHRoID09IGZpbHRlckhlaWdodCA9PSBmaWx0ZXJXaWR0aGAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgcG9vbGluZzpcbiAqICAgICBgW3N0cmlkZURlcHRoLCBzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXWAuXG4gKiAgICAgSWYgYHN0cmlkZXNgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBzdHJpZGVEZXB0aCA9PSBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgIC0gYHNhbWVgIGFuZCBzdHJpZGUgMTogb3V0cHV0IHdpbGwgYmUgb2Ygc2FtZSBzaXplIGFzIGlucHV0LFxuICogICAgICAgcmVnYXJkbGVzcyBvZiBmaWx0ZXIgc2l6ZS5cbiAqICAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMSoxeDEuXG4gKiAgICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkRIV0NcIiwgXCJOQ0RIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkRIV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5ESFdDXCIsIHRoZSBkYXRhIGlzIHN0b3JlZCBpbiB0aGUgb3JkZXIgb2Y6IFtiYXRjaCxcbiAqICAgICBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkRIV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBtYXhQb29sM2RfPFQgZXh0ZW5kcyBUZW5zb3I0RHxUZW5zb3I1RD4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyID0gWzEsIDEsIDFdLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcsXG4gICAgZGF0YUZvcm1hdDogJ05ESFdDJ3wnTkNESFcnID0gJ05ESFdDJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtYXhQb29sM2QnKTtcblxuICBsZXQgeDVEID0gJHggYXMgVGVuc29yNUQ7XG4gIGxldCByZXNoYXBlZFRvNUQgPSBmYWxzZTtcbiAgaWYgKCR4LnJhbmsgPT09IDQpIHtcbiAgICByZXNoYXBlZFRvNUQgPSB0cnVlO1xuICAgIHg1RCA9IHJlc2hhcGUoJHgsIFsxLCAkeC5zaGFwZVswXSwgJHguc2hhcGVbMV0sICR4LnNoYXBlWzJdLCAkeC5zaGFwZVszXV0pO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sM2Q6IHggbXVzdCBiZSByYW5rIDUgYnV0IGdvdCByYW5rICR7eDVELnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGRhdGFGb3JtYXQgPT09ICdOREhXQycsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDNkOiBPbmx5IE5ESFdDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQsIGAgK1xuICAgICAgICAgIGBidXQgZ290IGRhdGFGb3JtYXQgb2YgJHtkYXRhRm9ybWF0fWApO1xuICBjaGVja1BhZE9uRGltUm91bmRpbmdNb2RlKCdtYXhQb29sM2QnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGlucHV0czogTWF4UG9vbDNESW5wdXRzID0ge3g6IHg1RH07XG4gIGNvbnN0IGF0dHJzOlxuICAgICAgTWF4UG9vbDNEQXR0cnMgPSB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXR9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIE1heFBvb2wzRCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUO1xuXG4gIGlmIChyZXNoYXBlZFRvNUQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShcbiAgICAgICAgICAgICAgIHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM10sIHJlcy5zaGFwZVs0XV0pIGFzXG4gICAgICAgIFQ7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgbWF4UG9vbDNkID0gb3Aoe21heFBvb2wzZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPoolWithArgmax } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the 2D max pooling of an image with Argmax index.\n * The indices in argmax are flattened, so that a maximum value at position `[b,\n * y, x, c]` becomes flattened index: `(y * width + x) * channels + c` if\n * include_batch_in_index is False; `((b * height + y) * width + x) * channels\n * +c` if include_batch_in_index is True.\n *\n * The indices returned are always in `[0, height) x [0, width)` before\n * flattening.\n *\n * @param x The input tensor, of rank 4 or rank 3 of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n *     `strides` is a single number, then `strideHeight == strideWidth`.\n * @param dataFormat An optional string from: \"NDHWC\", \"NCDHW\". Defaults to\n *     \"NDHWC\". Specify the data format of the input and output data. With the\n *     default format \"NDHWC\", the data is stored in the order of: [batch,\n *     depth, height, width, channels]. Only \"NDHWC\" is currently supported.\n * @param pad The type of padding algorithm.\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *    - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param includeBatchIndex Defaults to False. Whether to include batch\n *    dimension in flattened index of argmax.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction maxPoolWithArgmax_(x, filterSize, strides, pad, includeBatchInIndex = false) {\n    const $x = convertToTensor(x, 'x', 'maxPoolWithArgmax');\n    const inputs = { x: $x };\n    const attrs = { filterSize, strides, pad, includeBatchInIndex };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const result = ENGINE.runKernel(MaxPoolWithArgmax, inputs, attrs);\n    return { result: result[0], indexes: result[1] };\n}\nexport const maxPoolWithArgmax = op({ maxPoolWithArgmax_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfd2l0aF9hcmdtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tYXhfcG9vbF93aXRoX2FyZ21heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxpQkFBaUIsRUFBa0QsTUFBTSxpQkFBaUIsQ0FBQztBQUluRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQ0c7QUFDSCxTQUFTLGtCQUFrQixDQUN2QixDQUFlLEVBQUUsVUFBbUMsRUFDcEQsT0FBZ0MsRUFBRSxHQUEwQixFQUM1RCxtQkFBbUIsR0FBRyxLQUFLO0lBQzdCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFeEQsTUFBTSxNQUFNLEdBQTRCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ2hELE1BQU0sS0FBSyxHQUNrQixFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixFQUFDLENBQUM7SUFFN0UsMERBQTBEO0lBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osaUJBQWlCLEVBQUUsTUFBOEIsRUFDakQsS0FBMkIsQ0FBYSxDQUFDO0lBRTVELE9BQU8sRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLEVBQUMsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWF4UG9vbFdpdGhBcmdtYXgsIE1heFBvb2xXaXRoQXJnbWF4QXR0cnMsIE1heFBvb2xXaXRoQXJnbWF4SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSAyRCBtYXggcG9vbGluZyBvZiBhbiBpbWFnZSB3aXRoIEFyZ21heCBpbmRleC5cbiAqIFRoZSBpbmRpY2VzIGluIGFyZ21heCBhcmUgZmxhdHRlbmVkLCBzbyB0aGF0IGEgbWF4aW11bSB2YWx1ZSBhdCBwb3NpdGlvbiBgW2IsXG4gKiB5LCB4LCBjXWAgYmVjb21lcyBmbGF0dGVuZWQgaW5kZXg6IGAoeSAqIHdpZHRoICsgeCkgKiBjaGFubmVscyArIGNgIGlmXG4gKiBpbmNsdWRlX2JhdGNoX2luX2luZGV4IGlzIEZhbHNlOyBgKChiICogaGVpZ2h0ICsgeSkgKiB3aWR0aCArIHgpICogY2hhbm5lbHNcbiAqICtjYCBpZiBpbmNsdWRlX2JhdGNoX2luX2luZGV4IGlzIFRydWUuXG4gKlxuICogVGhlIGluZGljZXMgcmV0dXJuZWQgYXJlIGFsd2F5cyBpbiBgWzAsIGhlaWdodCkgeCBbMCwgd2lkdGgpYCBiZWZvcmVcbiAqIGZsYXR0ZW5pbmcuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMyBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gZmlsdGVyU2l6ZSBUaGUgZmlsdGVyIHNpemU6IGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF1gLiBJZlxuICogICAgIGBmaWx0ZXJTaXplYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYGZpbHRlckhlaWdodCA9PSBmaWx0ZXJXaWR0aGAuXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgcG9vbGluZzogYFtzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoXWAuIElmXG4gKiAgICAgYHN0cmlkZXNgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09IHN0cmlkZVdpZHRoYC5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IEFuIG9wdGlvbmFsIHN0cmluZyBmcm9tOiBcIk5ESFdDXCIsIFwiTkNESFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5ESFdDXCIuIFNwZWNpZnkgdGhlIGRhdGEgZm9ybWF0IG9mIHRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEuIFdpdGggdGhlXG4gKiAgICAgZGVmYXVsdCBmb3JtYXQgXCJOREhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5ESFdDXCIgaXMgY3VycmVudGx5IHN1cHBvcnRlZC5cbiAqIEBwYXJhbSBwYWQgVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG0uXG4gKiAgICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgICAtIGB2YWxpZGA6IG91dHB1dCB3aWxsIGJlIHNtYWxsZXIgdGhhbiBpbnB1dCBpZiBmaWx0ZXIgaXMgbGFyZ2VyXG4gKiAgICAgICB0aGFuIDF4MS5cbiAqICAgIC0gRm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb24pXG4gKiBAcGFyYW0gaW5jbHVkZUJhdGNoSW5kZXggRGVmYXVsdHMgdG8gRmFsc2UuIFdoZXRoZXIgdG8gaW5jbHVkZSBiYXRjaFxuICogICAgZGltZW5zaW9uIGluIGZsYXR0ZW5lZCBpbmRleCBvZiBhcmdtYXguXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBtYXhQb29sV2l0aEFyZ21heF88VCBleHRlbmRzIFRlbnNvcjREPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcixcbiAgICBpbmNsdWRlQmF0Y2hJbkluZGV4ID0gZmFsc2UpOiBOYW1lZFRlbnNvck1hcCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ21heFBvb2xXaXRoQXJnbWF4Jyk7XG5cbiAgY29uc3QgaW5wdXRzOiBNYXhQb29sV2l0aEFyZ21heElucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOlxuICAgICAgTWF4UG9vbFdpdGhBcmdtYXhBdHRycyA9IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXh9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgICAgIE1heFBvb2xXaXRoQXJnbWF4LCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFRlbnNvcltdO1xuXG4gIHJldHVybiB7cmVzdWx0OiByZXN1bHRbMF0sIGluZGV4ZXM6IHJlc3VsdFsxXX07XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sV2l0aEFyZ21heCA9IG9wKHttYXhQb29sV2l0aEFyZ21heF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Maximum } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Returns the max of a and b (`a > b ? a : b`) element-wise.\n * Supports broadcasting.\n *\n * We also expose `tf.maximumStrict` which has the same signature as this op and\n * asserts that `a` and `b` are the same shape (does not broadcast).\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 3, 16]);\n * const b = tf.tensor1d([1, 2, 9, 4]);\n *\n * a.maximum(b).print();  // or tf.maximum(a, b)\n * ```\n *\n * ```js\n * // Broadcast maximum a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(5);\n *\n * a.maximum(b).print();  // or tf.maximum(a, b)\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction maximum_(a, b) {\n    let $a = convertToTensor(a, 'a', 'maximum');\n    let $b = convertToTensor(b, 'b', 'maximum');\n    [$a, $b] = makeTypesMatch($a, $b);\n    if ($a.dtype === 'bool') {\n        $a = cast($a, 'int32');\n        $b = cast($b, 'int32');\n    }\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Maximum, inputs);\n}\nexport const maximum = op({ maximum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4aW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21heGltdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQVMsUUFBUSxDQUNiLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFN0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWF4aW11bSwgTWF4aW11bUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCBvZiBhIGFuZCBiIChgYSA+IGIgPyBhIDogYmApIGVsZW1lbnQtd2lzZS5cbiAqIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgdGYubWF4aW11bVN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCAzLCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCA5LCA0XSk7XG4gKlxuICogYS5tYXhpbXVtKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tYXhpbXVtKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IG1heGltdW0gYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoNSk7XG4gKlxuICogYS5tYXhpbXVtKGIpLnByaW50KCk7ICAvLyBvciB0Zi5tYXhpbXVtKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gbWF4aW11bV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtYXhpbXVtJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdtYXhpbXVtJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICRhID0gY2FzdCgkYSwgJ2ludDMyJyk7XG4gICAgJGIgPSBjYXN0KCRiLCAnaW50MzInKTtcbiAgfVxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogTWF4aW11bUlucHV0cyA9IHthOiAkYSwgYjogJGJ9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKE1heGltdW0sIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhpbXVtID0gb3Aoe21heGltdW1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Mean } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the mean of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces `x` along the dimensions given in `axis`. Unless `keepDims` is\n * true, the rank of the `tf.Tensor` is reduced by 1 for each entry in `axis`.\n * If `keepDims` is true, the reduced dimensions are retained with length 1.\n * If `axis` has no entries, all dimensions are reduced, and a `tf.Tensor` with\n * a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.mean().print();  // or tf.mean(a)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.mean(axis).print();  // or tf.mean(x, axis)\n * ```\n *\n * @param x The input tensor.\n * @param axis The dimension(s) to reduce. By default it reduces\n *     all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction mean_(x, axis = null, keepDims = false) {\n    const $x = convertToTensor(x, 'x', 'mean');\n    const inputs = { x: $x };\n    const attrs = { axis, keepDims };\n    return ENGINE.runKernel(Mean, inputs, attrs);\n}\nexport const mean = op({ mean_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21lYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsU0FBUyxLQUFLLENBQ1YsQ0FBb0IsRUFBRSxPQUF3QixJQUFJLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDdEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0MsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQWMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFFMUMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixJQUFJLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWVhbiwgTWVhbkF0dHJzLCBNZWFuSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1lYW4gb2YgZWxlbWVudHMgYWNyb3NzIGRpbWVuc2lvbnMgb2YgYSBgdGYuVGVuc29yYC5cbiAqXG4gKiBSZWR1Y2VzIGB4YCBhbG9uZyB0aGUgZGltZW5zaW9ucyBnaXZlbiBpbiBgYXhpc2AuIFVubGVzcyBga2VlcERpbXNgIGlzXG4gKiB0cnVlLCB0aGUgcmFuayBvZiB0aGUgYHRmLlRlbnNvcmAgaXMgcmVkdWNlZCBieSAxIGZvciBlYWNoIGVudHJ5IGluIGBheGlzYC5cbiAqIElmIGBrZWVwRGltc2AgaXMgdHJ1ZSwgdGhlIHJlZHVjZWQgZGltZW5zaW9ucyBhcmUgcmV0YWluZWQgd2l0aCBsZW5ndGggMS5cbiAqIElmIGBheGlzYCBoYXMgbm8gZW50cmllcywgYWxsIGRpbWVuc2lvbnMgYXJlIHJlZHVjZWQsIGFuZCBhIGB0Zi5UZW5zb3JgIHdpdGhcbiAqIGEgc2luZ2xlIGVsZW1lbnQgaXMgcmV0dXJuZWQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHgubWVhbigpLnByaW50KCk7ICAvLyBvciB0Zi5tZWFuKGEpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiBjb25zdCBheGlzID0gMTtcbiAqIHgubWVhbihheGlzKS5wcmludCgpOyAgLy8gb3IgdGYubWVhbih4LCBheGlzKVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBtZWFuXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpczogbnVtYmVyfG51bWJlcltdID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtZWFuJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBNZWFuSW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IE1lYW5BdHRycyA9IHtheGlzLCBrZWVwRGltc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBNZWFuLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBtZWFuID0gb3Aoe21lYW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { makeZerosTypedArray, sizeFromShape } from '../util';\nimport { complex } from './complex';\n/**\n * Creates a `tf.Tensor` with all elements set to 0.\n *\n * ```js\n * tf.zeros([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param dtype The type of an element in the resulting tensor. Can\n *     be 'float32', 'int32' or 'bool'. Defaults to 'float'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function zeros(shape, dtype = 'float32') {\n    if (dtype === 'complex64') {\n        const real = zeros(shape, 'float32');\n        const imag = zeros(shape, 'float32');\n        return complex(real, imag);\n    }\n    const values = makeZerosTypedArray(sizeFromShape(shape), dtype);\n    return ENGINE.makeTensor(values, shape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVyb3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy96ZXJvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBR2pDLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFM0QsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUNqQixLQUFrQixFQUFFLFFBQWtCLFNBQVM7SUFDakQsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDckMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDNUI7SUFDRCxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEUsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFjLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge21ha2VaZXJvc1R5cGVkQXJyYXksIHNpemVGcm9tU2hhcGV9IGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vY29tcGxleCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAwLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi56ZXJvcyhbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gQ2FuXG4gKiAgICAgYmUgJ2Zsb2F0MzInLCAnaW50MzInIG9yICdib29sJy4gRGVmYXVsdHMgdG8gJ2Zsb2F0Jy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvczxSIGV4dGVuZHMgUmFuaz4oXG4gICAgc2hhcGU6IFNoYXBlTWFwW1JdLCBkdHlwZTogRGF0YVR5cGUgPSAnZmxvYXQzMicpOiBUZW5zb3I8Uj4ge1xuICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgcmVhbCA9IHplcm9zKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltYWcgPSB6ZXJvcyhzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICByZXR1cm4gY29tcGxleChyZWFsLCBpbWFnKTtcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBtYWtlWmVyb3NUeXBlZEFycmF5KHNpemVGcm9tU2hhcGUoc2hhcGUpLCBkdHlwZSk7XG4gIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSkgYXMgVGVuc29yPFI+O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { makeOnesTypedArray, sizeFromShape } from '../util';\nimport { complex } from './complex';\nimport { zeros } from './zeros';\n/**\n * Creates a `tf.Tensor` with all elements set to 1.\n *\n * ```js\n * tf.ones([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param dtype The type of an element in the resulting tensor. Defaults to\n *     'float'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function ones(shape, dtype = 'float32') {\n    if (dtype === 'complex64') {\n        const real = ones(shape, 'float32');\n        const imag = zeros(shape, 'float32');\n        return complex(real, imag);\n    }\n    const values = makeOnesTypedArray(sizeFromShape(shape), dtype);\n    return ENGINE.makeTensor(values, shape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL29uZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdqQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTFELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsSUFBSSxDQUNoQixLQUFrQixFQUFFLFFBQWtCLFNBQVM7SUFDakQsSUFBSSxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNyQyxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7S0FDNUI7SUFDRCxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDL0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFjLENBQUM7QUFDOUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge21ha2VPbmVzVHlwZWRBcnJheSwgc2l6ZUZyb21TaGFwZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9jb21wbGV4JztcbmltcG9ydCB7emVyb3N9IGZyb20gJy4vemVyb3MnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIGFsbCBlbGVtZW50cyBzZXQgdG8gMS5cbiAqXG4gKiBgYGBqc1xuICogdGYub25lcyhbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIHR5cGUgb2YgYW4gZWxlbWVudCBpbiB0aGUgcmVzdWx0aW5nIHRlbnNvci4gRGVmYXVsdHMgdG9cbiAqICAgICAnZmxvYXQnLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9uZXM8UiBleHRlbmRzIFJhbms+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgZHR5cGU6IERhdGFUeXBlID0gJ2Zsb2F0MzInKTogVGVuc29yPFI+IHtcbiAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWwgPSBvbmVzKHNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltYWcgPSB6ZXJvcyhzaGFwZSwgJ2Zsb2F0MzInKTtcbiAgICByZXR1cm4gY29tcGxleChyZWFsLCBpbWFnKTtcbiAgfVxuICBjb25zdCB2YWx1ZXMgPSBtYWtlT25lc1R5cGVkQXJyYXkoc2l6ZUZyb21TaGFwZShzaGFwZSksIGR0eXBlKTtcbiAgcmV0dXJuIEVOR0lORS5tYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGR0eXBlKSBhcyBUZW5zb3I8Uj47XG59XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { matMul } from './mat_mul';\nimport { ones } from './ones';\nimport { reshape } from './reshape';\nimport { Tensor } from '../tensor';\nimport { convertToTensor } from '../tensor_util_env';\nimport { sizeFromShape } from '../util_base';\n/**\n * Broadcasts parameters for evaluation on an N-D grid.\n *\n * Given N one-dimensional coordinate arrays `*args`, returns a list `outputs`\n * of N-D coordinate arrays for evaluating expressions on an N-D grid.\n *\n * Notes:\n * `meshgrid` supports cartesian ('xy') and matrix ('ij') indexing conventions.\n * When the `indexing` argument is set to 'xy' (the default), the broadcasting\n * instructions for the first two dimensions are swapped.\n * Examples:\n * Calling `const [X, Y] = meshgrid(x, y)` with the tensors\n *\n * ```javascript\n * const x = [1, 2, 3];\n * const y = [4, 5, 6];\n * const [X, Y] = tf.meshgrid(x, y);\n * // X = [[1, 2, 3],\n * //      [1, 2, 3],\n * //      [1, 2, 3]]\n * // Y = [[4, 4, 4],\n * //      [5, 5, 5],\n * //      [6, 6, 6]]\n * ```\n *\n * @param x Tensor with rank geq 1.\n * @param y Tensor with rank geq 1.\n * @param indexing\n *\n * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n */\nexport function meshgrid(x, y, { indexing = 'xy' } = {}) {\n    if (indexing !== 'xy' && indexing !== 'ij') {\n        throw new TypeError(`${indexing} is not a valid third argument to meshgrid`);\n    }\n    if (x === undefined) {\n        return [];\n    }\n    let $x = convertToTensor(x, 'x', 'meshgrid', x instanceof Tensor ? x.dtype : 'float32');\n    if (y === undefined) {\n        return [$x];\n    }\n    let $y = convertToTensor(y, 'y', 'meshgrid', y instanceof Tensor ? y.dtype : 'float32');\n    const w = sizeFromShape($x.shape);\n    const h = sizeFromShape($y.shape);\n    if (indexing === 'xy') {\n        $x = reshape($x, [1, -1]);\n        $y = reshape($y, [-1, 1]);\n        return [\n            matMul(ones([h, 1], $x.dtype), $x),\n            matMul($y, ones([1, w], $y.dtype)),\n        ];\n    }\n    $x = reshape($x, [-1, 1]);\n    $y = reshape($y, [1, -1]);\n    return [\n        matMul($x, ones([1, h], $x.dtype)),\n        matMul(ones([w, 1], $y.dtype), $y),\n    ];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzaGdyaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tZXNoZ3JpZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTNDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixDQUFnQixFQUFFLENBQWdCLEVBQUUsRUFBQyxRQUFRLEdBQUcsSUFBSSxFQUFDLEdBQUcsRUFBRTtJQUM1RCxJQUFJLFFBQVEsS0FBSyxJQUFJLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtRQUMxQyxNQUFNLElBQUksU0FBUyxDQUNmLEdBQUcsUUFBUSw0Q0FBNEMsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxDQUFDLEtBQUssU0FBUyxFQUFFO1FBQ25CLE9BQU8sRUFBRSxDQUFDO0tBQ1g7SUFDRCxJQUFJLEVBQUUsR0FBRyxlQUFlLENBQ3BCLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBRW5FLElBQUksQ0FBQyxLQUFLLFNBQVMsRUFBRTtRQUNuQixPQUFPLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDYjtJQUNELElBQUksRUFBRSxHQUFHLGVBQWUsQ0FDcEIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUM7SUFFbkUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsQyxNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxDLElBQUksUUFBUSxLQUFLLElBQUksRUFBRTtRQUNyQixFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7UUFDL0IsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBTSxDQUFDO1FBQy9CLE9BQU87WUFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7WUFDbEMsTUFBTSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DLENBQUM7S0FDSDtJQUVELEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQU0sQ0FBQztJQUMvQixFQUFFLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7SUFDL0IsT0FBTztRQUNMLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUM7S0FDbkMsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7bWF0TXVsfSBmcm9tICcuL21hdF9tdWwnO1xuaW1wb3J0IHtvbmVzfSBmcm9tICcuL29uZXMnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtzaXplRnJvbVNoYXBlfSBmcm9tICcuLi91dGlsX2Jhc2UnO1xuXG4vKipcbiAqIEJyb2FkY2FzdHMgcGFyYW1ldGVycyBmb3IgZXZhbHVhdGlvbiBvbiBhbiBOLUQgZ3JpZC5cbiAqXG4gKiBHaXZlbiBOIG9uZS1kaW1lbnNpb25hbCBjb29yZGluYXRlIGFycmF5cyBgKmFyZ3NgLCByZXR1cm5zIGEgbGlzdCBgb3V0cHV0c2BcbiAqIG9mIE4tRCBjb29yZGluYXRlIGFycmF5cyBmb3IgZXZhbHVhdGluZyBleHByZXNzaW9ucyBvbiBhbiBOLUQgZ3JpZC5cbiAqXG4gKiBOb3RlczpcbiAqIGBtZXNoZ3JpZGAgc3VwcG9ydHMgY2FydGVzaWFuICgneHknKSBhbmQgbWF0cml4ICgnaWonKSBpbmRleGluZyBjb252ZW50aW9ucy5cbiAqIFdoZW4gdGhlIGBpbmRleGluZ2AgYXJndW1lbnQgaXMgc2V0IHRvICd4eScgKHRoZSBkZWZhdWx0KSwgdGhlIGJyb2FkY2FzdGluZ1xuICogaW5zdHJ1Y3Rpb25zIGZvciB0aGUgZmlyc3QgdHdvIGRpbWVuc2lvbnMgYXJlIHN3YXBwZWQuXG4gKiBFeGFtcGxlczpcbiAqIENhbGxpbmcgYGNvbnN0IFtYLCBZXSA9IG1lc2hncmlkKHgsIHkpYCB3aXRoIHRoZSB0ZW5zb3JzXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogY29uc3QgeCA9IFsxLCAyLCAzXTtcbiAqIGNvbnN0IHkgPSBbNCwgNSwgNl07XG4gKiBjb25zdCBbWCwgWV0gPSB0Zi5tZXNoZ3JpZCh4LCB5KTtcbiAqIC8vIFggPSBbWzEsIDIsIDNdLFxuICogLy8gICAgICBbMSwgMiwgM10sXG4gKiAvLyAgICAgIFsxLCAyLCAzXV1cbiAqIC8vIFkgPSBbWzQsIDQsIDRdLFxuICogLy8gICAgICBbNSwgNSwgNV0sXG4gKiAvLyAgICAgIFs2LCA2LCA2XV1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRlbnNvciB3aXRoIHJhbmsgZ2VxIDEuXG4gKiBAcGFyYW0geSBUZW5zb3Igd2l0aCByYW5rIGdlcSAxLlxuICogQHBhcmFtIGluZGV4aW5nXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZXNoZ3JpZDxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4PzogVHxUZW5zb3JMaWtlLCB5PzogVHxUZW5zb3JMaWtlLCB7aW5kZXhpbmcgPSAneHknfSA9IHt9KTogVFtdIHtcbiAgaWYgKGluZGV4aW5nICE9PSAneHknICYmIGluZGV4aW5nICE9PSAnaWonKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgYCR7aW5kZXhpbmd9IGlzIG5vdCBhIHZhbGlkIHRoaXJkIGFyZ3VtZW50IHRvIG1lc2hncmlkYCk7XG4gIH1cbiAgaWYgKHggPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBbXTtcbiAgfVxuICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICB4LCAneCcsICdtZXNoZ3JpZCcsIHggaW5zdGFuY2VvZiBUZW5zb3IgPyB4LmR0eXBlIDogJ2Zsb2F0MzInKTtcblxuICBpZiAoeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIFskeF07XG4gIH1cbiAgbGV0ICR5ID0gY29udmVydFRvVGVuc29yKFxuICAgICAgeSwgJ3knLCAnbWVzaGdyaWQnLCB5IGluc3RhbmNlb2YgVGVuc29yID8geS5kdHlwZSA6ICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgdyA9IHNpemVGcm9tU2hhcGUoJHguc2hhcGUpO1xuICBjb25zdCBoID0gc2l6ZUZyb21TaGFwZSgkeS5zaGFwZSk7XG5cbiAgaWYgKGluZGV4aW5nID09PSAneHknKSB7XG4gICAgJHggPSByZXNoYXBlKCR4LCBbMSwgLTFdKSBhcyBUO1xuICAgICR5ID0gcmVzaGFwZSgkeSwgWy0xLCAxXSkgYXMgVDtcbiAgICByZXR1cm4gW1xuICAgICAgbWF0TXVsKG9uZXMoW2gsIDFdLCAkeC5kdHlwZSksICR4KSxcbiAgICAgIG1hdE11bCgkeSwgb25lcyhbMSwgd10sICR5LmR0eXBlKSksXG4gICAgXTtcbiAgfVxuXG4gICR4ID0gcmVzaGFwZSgkeCwgWy0xLCAxXSkgYXMgVDtcbiAgJHkgPSByZXNoYXBlKCR5LCBbMSwgLTFdKSBhcyBUO1xuICByZXR1cm4gW1xuICAgIG1hdE11bCgkeCwgb25lcyhbMSwgaF0sICR4LmR0eXBlKSksXG4gICAgbWF0TXVsKG9uZXMoW3csIDFdLCAkeS5kdHlwZSksICR5KSxcbiAgXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Minimum } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Returns the min of a and b (`a < b ? a : b`) element-wise.\n * Supports broadcasting.\n *\n * We also expose `minimumStrict` which has the same signature as this op and\n * asserts that `a` and `b` are the same shape (does not broadcast).\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 3, 16]);\n * const b = tf.tensor1d([1, 2, 9, 4]);\n *\n * a.minimum(b).print();  // or tf.minimum(a, b)\n * ```\n *\n * ```js\n * // Broadcast minimum a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(5);\n *\n * a.minimum(b).print();  // or tf.minimum(a, b)\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction minimum_(a, b) {\n    let $a = convertToTensor(a, 'a', 'minimum');\n    let $b = convertToTensor(b, 'b', 'minimum');\n    [$a, $b] = makeTypesMatch($a, $b);\n    if ($a.dtype === 'bool') {\n        $a = cast($a, 'int32');\n        $b = cast($b, 'int32');\n    }\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Minimum, inputs);\n}\nexport const minimum = op({ minimum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21pbmltdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBR3ZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBCRztBQUNILFNBQVMsUUFBUSxDQUNiLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQ3hCO0lBRUQsMEJBQTBCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFL0MsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFN0MsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7TWluaW11bSwgTWluaW11bUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuL2Nhc3QnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1pbiBvZiBhIGFuZCBiIChgYSA8IGIgPyBhIDogYmApIGVsZW1lbnQtd2lzZS5cbiAqIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgbWluaW11bVN0cmljdGAgd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZSBhcyB0aGlzIG9wIGFuZFxuICogYXNzZXJ0cyB0aGF0IGBhYCBhbmQgYGJgIGFyZSB0aGUgc2FtZSBzaGFwZSAoZG9lcyBub3QgYnJvYWRjYXN0KS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsxLCA0LCAzLCAxNl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFsxLCAyLCA5LCA0XSk7XG4gKlxuICogYS5taW5pbXVtKGIpLnByaW50KCk7ICAvLyBvciB0Zi5taW5pbXVtKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IG1pbmltdW0gYSB3aXRoIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoNSk7XG4gKlxuICogYS5taW5pbXVtKGIpLnByaW50KCk7ICAvLyBvciB0Zi5taW5pbXVtKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gbWluaW11bV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtaW5pbXVtJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdtaW5pbXVtJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBpZiAoJGEuZHR5cGUgPT09ICdib29sJykge1xuICAgICRhID0gY2FzdCgkYSwgJ2ludDMyJyk7XG4gICAgJGIgPSBjYXN0KCRiLCAnaW50MzInKTtcbiAgfVxuXG4gIGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKCRhLnNoYXBlLCAkYi5zaGFwZSk7XG5cbiAgY29uc3QgaW5wdXRzOiBNaW5pbXVtSW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTWluaW11bSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IG1pbmltdW0gPSBvcCh7bWluaW11bV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MirrorPad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Pads a `tf.Tensor` using mirror padding.\n *\n * This operation implements the `REFLECT` and `SYMMETRIC` modes of pad.\n *\n * ```js\n * const x = tf.range(0, 9).reshape([1, 1, 3, 3]);\n * x.mirrorPad([[0, 0], [0, 0], [2, 2], [2, 2]], 'reflect').print();\n * ```\n * @param x The tensor to pad.\n * @param paddings An array of length `R` (the rank of the tensor), where\n * each element is a length-2 tuple of ints `[padBefore, padAfter]`,\n * specifying how much to pad along each dimension of the tensor.\n * In \"reflect\" mode, the padded regions do not include the borders,\n * while in \"symmetric\" mode the padded regions do include the borders.\n * For example, if the input is `[1, 2, 3]` and paddings is `[0, 2]`,\n * then the output is `[1, 2, 3, 2, 1]` in \"reflect\" mode, and\n * `[1, 2, 3, 3, 2]` in \"symmetric\" mode.\n * If `mode` is \"reflect\" then both `paddings[D, 0]` and `paddings[D, 1]`\n * must be no greater than `x.shape[D] - 1`. If mode is \"symmetric\"\n * then both `paddings[D, 0]` and `paddings[D, 1]` must be no greater than\n * `x.shape[D]`\n * @param mode String to specify padding mode. Can be `'reflect' | 'symmetric'`\n */\n/** @doc {heading: 'Tensors', subheading: 'Transformations'} */\nfunction mirrorPad_(x, paddings, mode) {\n    util.assert(mode === 'reflect' || mode === 'symmetric', () => `Invalid mode. Mode must be either reflect or symmetric. ` +\n        `Got ${mode}.`);\n    const $x = convertToTensor(x, 'x', 'mirrorPad');\n    if ($x.rank === 0) {\n        throw new Error('mirrorPad(scalar) is not defined. ' +\n            'Pass non-scalar to mirrorPad');\n    }\n    util.assert(paddings.length === $x.rank, () => `Padding doesn't match input. Must be ${$x.rank}. ` +\n        `Got ${paddings.length}.`);\n    const shapeOffset = mode === 'reflect' ? 1 : 0;\n    for (let i = 0; i < $x.rank; i++) {\n        util.assert(paddings[i].length === 2, () => `Invalid number of paddings. Must be length of 2 each.`);\n        util.assert(paddings[i][0] >= 0 && paddings[i][0] <= $x.shape[i] - shapeOffset &&\n            paddings[i][1] >= 0 && paddings[i][1] <= $x.shape[i] - shapeOffset, () => `Padding in dimension ${i} cannot be greater than or equal ` +\n            `to ${$x.shape[i] - shapeOffset} or less than 0 for input of ` +\n            `shape ${$x.shape}`);\n    }\n    const attrs = { paddings, mode };\n    const inputs = { x: $x };\n    return ENGINE.runKernel(MirrorPad, inputs, attrs);\n}\nexport const mirrorPad = op({ mirrorPad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yX3BhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21pcnJvcl9wYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQyxNQUFNLGlCQUFpQixDQUFDO0FBSTNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILCtEQUErRDtBQUMvRCxTQUFTLFVBQVUsQ0FDZixDQUFlLEVBQUUsUUFBaUMsRUFDbEQsSUFBMkI7SUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLEtBQUssU0FBUyxJQUFJLElBQUksS0FBSyxXQUFXLEVBQzFDLEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxPQUFPLElBQUksR0FBRyxDQUFDLENBQUM7SUFFeEIsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDaEQsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixNQUFNLElBQUksS0FBSyxDQUNYLG9DQUFvQztZQUNwQyw4QkFBOEIsQ0FBQyxDQUFDO0tBQ3JDO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxJQUFJLEVBQzNCLEdBQUcsRUFBRSxDQUFDLHdDQUF3QyxFQUFFLENBQUMsSUFBSSxJQUFJO1FBQ3JELE9BQU8sUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDbkMsTUFBTSxXQUFXLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDaEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDeEIsR0FBRyxFQUFFLENBQUMsdURBQXVELENBQUMsQ0FBQztRQUNuRSxJQUFJLENBQUMsTUFBTSxDQUNQLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVztZQUM5RCxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsRUFDdEUsR0FBRyxFQUFFLENBQUMsd0JBQXdCLENBQUMsbUNBQW1DO1lBQzlELE1BQU0sRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxXQUFXLCtCQUErQjtZQUM5RCxTQUFTLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBRUQsTUFBTSxLQUFLLEdBQW1CLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFvQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUN4QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFNBQVMsRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM5RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtNaXJyb3JQYWQsIE1pcnJvclBhZEF0dHJzLCBNaXJyb3JQYWRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUGFkcyBhIGB0Zi5UZW5zb3JgIHVzaW5nIG1pcnJvciBwYWRkaW5nLlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGltcGxlbWVudHMgdGhlIGBSRUZMRUNUYCBhbmQgYFNZTU1FVFJJQ2AgbW9kZXMgb2YgcGFkLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYucmFuZ2UoMCwgOSkucmVzaGFwZShbMSwgMSwgMywgM10pO1xuICogeC5taXJyb3JQYWQoW1swLCAwXSwgWzAsIDBdLCBbMiwgMl0sIFsyLCAyXV0sICdyZWZsZWN0JykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBwYWQuXG4gKiBAcGFyYW0gcGFkZGluZ3MgQW4gYXJyYXkgb2YgbGVuZ3RoIGBSYCAodGhlIHJhbmsgb2YgdGhlIHRlbnNvciksIHdoZXJlXG4gKiBlYWNoIGVsZW1lbnQgaXMgYSBsZW5ndGgtMiB0dXBsZSBvZiBpbnRzIGBbcGFkQmVmb3JlLCBwYWRBZnRlcl1gLFxuICogc3BlY2lmeWluZyBob3cgbXVjaCB0byBwYWQgYWxvbmcgZWFjaCBkaW1lbnNpb24gb2YgdGhlIHRlbnNvci5cbiAqIEluIFwicmVmbGVjdFwiIG1vZGUsIHRoZSBwYWRkZWQgcmVnaW9ucyBkbyBub3QgaW5jbHVkZSB0aGUgYm9yZGVycyxcbiAqIHdoaWxlIGluIFwic3ltbWV0cmljXCIgbW9kZSB0aGUgcGFkZGVkIHJlZ2lvbnMgZG8gaW5jbHVkZSB0aGUgYm9yZGVycy5cbiAqIEZvciBleGFtcGxlLCBpZiB0aGUgaW5wdXQgaXMgYFsxLCAyLCAzXWAgYW5kIHBhZGRpbmdzIGlzIGBbMCwgMl1gLFxuICogdGhlbiB0aGUgb3V0cHV0IGlzIGBbMSwgMiwgMywgMiwgMV1gIGluIFwicmVmbGVjdFwiIG1vZGUsIGFuZFxuICogYFsxLCAyLCAzLCAzLCAyXWAgaW4gXCJzeW1tZXRyaWNcIiBtb2RlLlxuICogSWYgYG1vZGVgIGlzIFwicmVmbGVjdFwiIHRoZW4gYm90aCBgcGFkZGluZ3NbRCwgMF1gIGFuZCBgcGFkZGluZ3NbRCwgMV1gXG4gKiBtdXN0IGJlIG5vIGdyZWF0ZXIgdGhhbiBgeC5zaGFwZVtEXSAtIDFgLiBJZiBtb2RlIGlzIFwic3ltbWV0cmljXCJcbiAqIHRoZW4gYm90aCBgcGFkZGluZ3NbRCwgMF1gIGFuZCBgcGFkZGluZ3NbRCwgMV1gIG11c3QgYmUgbm8gZ3JlYXRlciB0aGFuXG4gKiBgeC5zaGFwZVtEXWBcbiAqIEBwYXJhbSBtb2RlIFN0cmluZyB0byBzcGVjaWZ5IHBhZGRpbmcgbW9kZS4gQ2FuIGJlIGAncmVmbGVjdCcgfCAnc3ltbWV0cmljJ2BcbiAqL1xuLyoqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9ICovXG5mdW5jdGlvbiBtaXJyb3JQYWRfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgIG1vZGU6ICdyZWZsZWN0J3wnc3ltbWV0cmljJyk6IFQge1xuICB1dGlsLmFzc2VydChcbiAgICAgIG1vZGUgPT09ICdyZWZsZWN0JyB8fCBtb2RlID09PSAnc3ltbWV0cmljJyxcbiAgICAgICgpID0+IGBJbnZhbGlkIG1vZGUuIE1vZGUgbXVzdCBiZSBlaXRoZXIgcmVmbGVjdCBvciBzeW1tZXRyaWMuIGAgK1xuICAgICAgICAgIGBHb3QgJHttb2RlfS5gKTtcblxuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdtaXJyb3JQYWQnKTtcbiAgaWYgKCR4LnJhbmsgPT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdtaXJyb3JQYWQoc2NhbGFyKSBpcyBub3QgZGVmaW5lZC4gJyArXG4gICAgICAgICdQYXNzIG5vbi1zY2FsYXIgdG8gbWlycm9yUGFkJyk7XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBwYWRkaW5ncy5sZW5ndGggPT09ICR4LnJhbmssXG4gICAgICAoKSA9PiBgUGFkZGluZyBkb2Vzbid0IG1hdGNoIGlucHV0LiBNdXN0IGJlICR7JHgucmFua30uIGAgK1xuICAgICAgICAgIGBHb3QgJHtwYWRkaW5ncy5sZW5ndGh9LmApO1xuICBjb25zdCBzaGFwZU9mZnNldCA9IG1vZGUgPT09ICdyZWZsZWN0JyA/IDEgOiAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8ICR4LnJhbms7IGkrKykge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBwYWRkaW5nc1tpXS5sZW5ndGggPT09IDIsXG4gICAgICAgICgpID0+IGBJbnZhbGlkIG51bWJlciBvZiBwYWRkaW5ncy4gTXVzdCBiZSBsZW5ndGggb2YgMiBlYWNoLmApO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBwYWRkaW5nc1tpXVswXSA+PSAwICYmIHBhZGRpbmdzW2ldWzBdIDw9ICR4LnNoYXBlW2ldIC0gc2hhcGVPZmZzZXQgJiZcbiAgICAgICAgICAgIHBhZGRpbmdzW2ldWzFdID49IDAgJiYgcGFkZGluZ3NbaV1bMV0gPD0gJHguc2hhcGVbaV0gLSBzaGFwZU9mZnNldCxcbiAgICAgICAgKCkgPT4gYFBhZGRpbmcgaW4gZGltZW5zaW9uICR7aX0gY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBgICtcbiAgICAgICAgICAgIGB0byAkeyR4LnNoYXBlW2ldIC0gc2hhcGVPZmZzZXR9IG9yIGxlc3MgdGhhbiAwIGZvciBpbnB1dCBvZiBgICtcbiAgICAgICAgICAgIGBzaGFwZSAkeyR4LnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgYXR0cnM6IE1pcnJvclBhZEF0dHJzID0ge3BhZGRpbmdzLCBtb2RlfTtcbiAgY29uc3QgaW5wdXRzOiBNaXJyb3JQYWRJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIE1pcnJvclBhZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgbWlycm9yUGFkID0gb3Aoe21pcnJvclBhZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Mod } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns the mod of a and b element-wise.\n * `floor(x / y) * y + mod(x, y) = x`\n * Supports broadcasting.\n *\n * We also expose `tf.modStrict` which has the same signature as this op and\n * asserts that `a` and `b` are the same shape (does not broadcast).\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 3, 16]);\n * const b = tf.tensor1d([1, 2, 9, 4]);\n *\n * a.mod(b).print();  // or tf.mod(a, b)\n * ```\n *\n * ```js\n * // Broadcast a mod b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(5);\n *\n * a.mod(b).print();  // or tf.mod(a, b)\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction mod_(a, b) {\n    let $a = convertToTensor(a, 'a', 'mod');\n    let $b = convertToTensor(b, 'b', 'mod');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(Mod, inputs);\n}\nexport const mod = op({ mod_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbW9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQW9CLEVBQUUsQ0FBb0I7SUFDeEUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxNQUFNLE1BQU0sR0FBYyxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXpDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge01vZCwgTW9kSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG1vZCBvZiBhIGFuZCBiIGVsZW1lbnQtd2lzZS5cbiAqIGBmbG9vcih4IC8geSkgKiB5ICsgbW9kKHgsIHkpID0geGBcbiAqIFN1cHBvcnRzIGJyb2FkY2FzdGluZy5cbiAqXG4gKiBXZSBhbHNvIGV4cG9zZSBgdGYubW9kU3RyaWN0YCB3aGljaCBoYXMgdGhlIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgb3AgYW5kXG4gKiBhc3NlcnRzIHRoYXQgYGFgIGFuZCBgYmAgYXJlIHRoZSBzYW1lIHNoYXBlIChkb2VzIG5vdCBicm9hZGNhc3QpLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLm1vZChiKS5wcmludCgpOyAgLy8gb3IgdGYubW9kKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQnJvYWRjYXN0IGEgbW9kIGIuXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzIsIDQsIDYsIDhdKTtcbiAqIGNvbnN0IGIgPSB0Zi5zY2FsYXIoNSk7XG4gKlxuICogYS5tb2QoYikucHJpbnQoKTsgIC8vIG9yIHRmLm1vZChhLCBiKVxuICogYGBgXG4gKlxuICogQHBhcmFtIGEgVGhlIGZpcnN0IHRlbnNvci5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgdGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQXJpdGhtZXRpYyd9XG4gKi9cbmZ1bmN0aW9uIG1vZF88VCBleHRlbmRzIFRlbnNvcj4oYTogVGVuc29yfFRlbnNvckxpa2UsIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdtb2QnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ21vZCcpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgY29uc3QgaW5wdXRzOiBNb2RJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChNb2QsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBtb2QgPSBvcCh7bW9kX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { parseAxisParam } from '../util';\nimport { expandShapeToKeepDim } from './axis_util';\nimport { cast } from './cast';\nimport { mean } from './mean';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nimport { square } from './square';\nimport { sub } from './sub';\n/**\n * Calculates the mean and variance of `x`. The mean and variance are\n * calculated by aggregating the contents of `x` across `axes`. If `x` is\n * 1-D and `axes = [0]` this is just the mean and variance of a vector.\n *\n * @param x The input tensor.\n * @param axis The dimension(s) along with to compute mean and\n *     variance. By default it reduces all dimensions.\n * @param keepDims If true, the moments have the same dimensionality as the\n *     input.\n * @return An object with two keys: `mean` and `variance`.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction moments_(x, axis = null, keepDims = false) {\n    x = convertToTensor(x, 'x', 'moments');\n    const axes = parseAxisParam(axis, x.shape);\n    const xMean = mean(x, axes, keepDims);\n    let keepDimsShape = xMean.shape;\n    if (!keepDims) {\n        keepDimsShape = expandShapeToKeepDim(xMean.shape, axes);\n    }\n    const devSquared = square(sub(cast(x, 'float32'), reshape(xMean, keepDimsShape)));\n    const variance = mean(devSquared, axes, keepDims);\n    return { mean: xMean, variance };\n}\nexport const moments = op({ moments_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9tZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21vbWVudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdkMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFvQixFQUFFLE9BQXdCLElBQUksRUFDbEQsUUFBUSxHQUFHLEtBQUs7SUFDbEIsQ0FBQyxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3RDLElBQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDaEMsSUFBSSxDQUFDLFFBQVEsRUFBRTtRQUNiLGFBQWEsR0FBRyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsTUFBTSxVQUFVLEdBQ1osTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBQyxDQUFDO0FBQ2pDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEVBQUMsUUFBUSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtwYXJzZUF4aXNQYXJhbX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7ZXhwYW5kU2hhcGVUb0tlZXBEaW19IGZyb20gJy4vYXhpc191dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7bWVhbn0gZnJvbSAnLi9tZWFuJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi9zdWInO1xuXG4vKipcbiAqIENhbGN1bGF0ZXMgdGhlIG1lYW4gYW5kIHZhcmlhbmNlIG9mIGB4YC4gVGhlIG1lYW4gYW5kIHZhcmlhbmNlIGFyZVxuICogY2FsY3VsYXRlZCBieSBhZ2dyZWdhdGluZyB0aGUgY29udGVudHMgb2YgYHhgIGFjcm9zcyBgYXhlc2AuIElmIGB4YCBpc1xuICogMS1EIGFuZCBgYXhlcyA9IFswXWAgdGhpcyBpcyBqdXN0IHRoZSBtZWFuIGFuZCB2YXJpYW5jZSBvZiBhIHZlY3Rvci5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbihzKSBhbG9uZyB3aXRoIHRvIGNvbXB1dGUgbWVhbiBhbmRcbiAqICAgICB2YXJpYW5jZS4gQnkgZGVmYXVsdCBpdCByZWR1Y2VzIGFsbCBkaW1lbnNpb25zLlxuICogQHBhcmFtIGtlZXBEaW1zIElmIHRydWUsIHRoZSBtb21lbnRzIGhhdmUgdGhlIHNhbWUgZGltZW5zaW9uYWxpdHkgYXMgdGhlXG4gKiAgICAgaW5wdXQuXG4gKiBAcmV0dXJuIEFuIG9iamVjdCB3aXRoIHR3byBrZXlzOiBgbWVhbmAgYW5kIGB2YXJpYW5jZWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIG1vbWVudHNfKFxuICAgIHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBheGlzOiBudW1iZXJ8bnVtYmVyW10gPSBudWxsLFxuICAgIGtlZXBEaW1zID0gZmFsc2UpOiB7bWVhbjogVGVuc29yLCB2YXJpYW5jZTogVGVuc29yfSB7XG4gIHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbW9tZW50cycpO1xuICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGNvbnN0IHhNZWFuID0gbWVhbih4LCBheGVzLCBrZWVwRGltcyk7XG4gIGxldCBrZWVwRGltc1NoYXBlID0geE1lYW4uc2hhcGU7XG4gIGlmICgha2VlcERpbXMpIHtcbiAgICBrZWVwRGltc1NoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oeE1lYW4uc2hhcGUsIGF4ZXMpO1xuICB9XG4gIGNvbnN0IGRldlNxdWFyZWQgPVxuICAgICAgc3F1YXJlKHN1YihjYXN0KHgsICdmbG9hdDMyJyksIHJlc2hhcGUoeE1lYW4sIGtlZXBEaW1zU2hhcGUpKSk7XG4gIGNvbnN0IHZhcmlhbmNlID0gbWVhbihkZXZTcXVhcmVkLCBheGVzLCBrZWVwRGltcyk7XG4gIHJldHVybiB7bWVhbjogeE1lYW4sIHZhcmlhbmNlfTtcbn1cblxuZXhwb3J0IGNvbnN0IG1vbWVudHMgPSBvcCh7bW9tZW50c199KTtcbiJdfQ==","import { convertToTensor, convertToTensorArray } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the next states and outputs of a stack of LSTMCells.\n *\n * Each cell output is used as input to the next cell.\n *\n * Returns `[cellState, cellOutput]`.\n *\n * Derived from tf.contrib.rn.MultiRNNCell.\n *\n * @param lstmCells Array of LSTMCell functions.\n * @param data The input to the cell.\n * @param c Array of previous cell states.\n * @param h Array of previous cell outputs.\n *\n * @doc {heading: 'Operations', subheading: 'RNN'}\n */\nfunction multiRNNCell_(lstmCells, data, c, h) {\n    const $data = convertToTensor(data, 'data', 'multiRNNCell');\n    const $c = convertToTensorArray(c, 'c', 'multiRNNCell');\n    const $h = convertToTensorArray(h, 'h', 'multiRNNCell');\n    let input = $data;\n    const newStates = [];\n    for (let i = 0; i < lstmCells.length; i++) {\n        const output = lstmCells[i](input, $c[i], $h[i]);\n        newStates.push(output[0]);\n        newStates.push(output[1]);\n        input = output[1];\n    }\n    const newC = [];\n    const newH = [];\n    for (let i = 0; i < newStates.length; i += 2) {\n        newC.push(newStates[i]);\n        newH.push(newStates[i + 1]);\n    }\n    return [newC, newH];\n}\nexport const multiRNNCell = op({ multiRNNCell_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlfcm5uX2NlbGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tdWx0aV9ybm5fY2VsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXpFLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFTL0I7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxhQUFhLENBQ2xCLFNBQXlCLEVBQUUsSUFBeUIsRUFDcEQsQ0FBNkIsRUFDN0IsQ0FBNkI7SUFDL0IsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUQsTUFBTSxFQUFFLEdBQUcsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN4RCxNQUFNLEVBQUUsR0FBRyxvQkFBb0IsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXhELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNsQixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDekMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDakQsU0FBUyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFCLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDbkI7SUFDRCxNQUFNLElBQUksR0FBZSxFQUFFLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQWUsRUFBRSxDQUFDO0lBQzVCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDNUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM3QjtJQUNELE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDdEIsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IyRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yLCBjb252ZXJ0VG9UZW5zb3JBcnJheX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEBkb2NhbGlhcyAoZGF0YTogVGVuc29yMkQsIGM6IFRlbnNvcjJELCBoOiBUZW5zb3IyRCk6IFtUZW5zb3IyRCwgVGVuc29yMkRdXG4gKi9cbmV4cG9ydCB0eXBlIExTVE1DZWxsRnVuYyA9IHtcbiAgKGRhdGE6IFRlbnNvcjJELCBjOiBUZW5zb3IyRCwgaDogVGVuc29yMkQpOiBbVGVuc29yMkQsIFRlbnNvcjJEXTtcbn07XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG5leHQgc3RhdGVzIGFuZCBvdXRwdXRzIG9mIGEgc3RhY2sgb2YgTFNUTUNlbGxzLlxuICpcbiAqIEVhY2ggY2VsbCBvdXRwdXQgaXMgdXNlZCBhcyBpbnB1dCB0byB0aGUgbmV4dCBjZWxsLlxuICpcbiAqIFJldHVybnMgYFtjZWxsU3RhdGUsIGNlbGxPdXRwdXRdYC5cbiAqXG4gKiBEZXJpdmVkIGZyb20gdGYuY29udHJpYi5ybi5NdWx0aVJOTkNlbGwuXG4gKlxuICogQHBhcmFtIGxzdG1DZWxscyBBcnJheSBvZiBMU1RNQ2VsbCBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gZGF0YSBUaGUgaW5wdXQgdG8gdGhlIGNlbGwuXG4gKiBAcGFyYW0gYyBBcnJheSBvZiBwcmV2aW91cyBjZWxsIHN0YXRlcy5cbiAqIEBwYXJhbSBoIEFycmF5IG9mIHByZXZpb3VzIGNlbGwgb3V0cHV0cy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSTk4nfVxuICovXG5mdW5jdGlvbiBtdWx0aVJOTkNlbGxfKFxuICAgIGxzdG1DZWxsczogTFNUTUNlbGxGdW5jW10sIGRhdGE6IFRlbnNvcjJEfFRlbnNvckxpa2UsXG4gICAgYzogQXJyYXk8VGVuc29yMkR8VGVuc29yTGlrZT4sXG4gICAgaDogQXJyYXk8VGVuc29yMkR8VGVuc29yTGlrZT4pOiBbVGVuc29yMkRbXSwgVGVuc29yMkRbXV0ge1xuICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdtdWx0aVJOTkNlbGwnKTtcbiAgY29uc3QgJGMgPSBjb252ZXJ0VG9UZW5zb3JBcnJheShjLCAnYycsICdtdWx0aVJOTkNlbGwnKTtcbiAgY29uc3QgJGggPSBjb252ZXJ0VG9UZW5zb3JBcnJheShoLCAnaCcsICdtdWx0aVJOTkNlbGwnKTtcblxuICBsZXQgaW5wdXQgPSAkZGF0YTtcbiAgY29uc3QgbmV3U3RhdGVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbHN0bUNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gbHN0bUNlbGxzW2ldKGlucHV0LCAkY1tpXSwgJGhbaV0pO1xuICAgIG5ld1N0YXRlcy5wdXNoKG91dHB1dFswXSk7XG4gICAgbmV3U3RhdGVzLnB1c2gob3V0cHV0WzFdKTtcbiAgICBpbnB1dCA9IG91dHB1dFsxXTtcbiAgfVxuICBjb25zdCBuZXdDOiBUZW5zb3IyRFtdID0gW107XG4gIGNvbnN0IG5ld0g6IFRlbnNvcjJEW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTdGF0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICBuZXdDLnB1c2gobmV3U3RhdGVzW2ldKTtcbiAgICBuZXdILnB1c2gobmV3U3RhdGVzW2kgKyAxXSk7XG4gIH1cbiAgcmV0dXJuIFtuZXdDLCBuZXdIXTtcbn1cbmV4cG9ydCBjb25zdCBtdWx0aVJOTkNlbGwgPSBvcCh7bXVsdGlSTk5DZWxsX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Multinomial } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Creates a `tf.Tensor` with values drawn from a multinomial distribution.\n *\n * ```js\n * const probs = tf.tensor([.75, .25]);\n * tf.multinomial(probs, 3).print();\n * ```\n *\n * @param logits 1D array with unnormalized log-probabilities, or\n *     2D array of shape `[batchSize, numOutcomes]`. See the `normalized`\n *     parameter.\n * @param numSamples Number of samples to draw for each row slice.\n * @param seed The seed number.\n * @param normalized Whether the provided `logits` are normalized true\n *     probabilities (sum to 1). Defaults to false.\n * @return 1D array of shape `[numSamples]`, or 2D array of shape\n *     `[batchSize, numSamples]`, depending on the rank of the input.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction multinomial_(logits, numSamples, seed, normalized = false) {\n    const $logits = convertToTensor(logits, 'logits', 'multinomial');\n    const numOutcomes = $logits.size;\n    const origRank = $logits.rank;\n    if (numOutcomes < 2) {\n        throw new Error(`Error in multinomial: you need at least 2 outcomes, but got ` +\n            `${numOutcomes}.`);\n    }\n    if (origRank > 2) {\n        throw new Error(`Rank of probabilities must be 1 or 2, but is ${origRank}`);\n    }\n    // TODO(lina128): Investigate correct seed behavior. The code seems not allow\n    // setting see to 0.\n    seed = seed || Math.random();\n    // The kernel only accepts (and returns) rank 2 tensors.\n    const logits2D = origRank === 1 ? reshape($logits, [1, -1]) : $logits;\n    const inputs = { logits: logits2D };\n    const attrs = { numSamples, seed, normalized };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(Multinomial, inputs, attrs);\n    // tslint:disable-next-line:no-unnecessary-type-assertion\n    return origRank === 1 ? reshape(res, [res.size]) : res;\n}\nexport const multinomial = op({ multinomial_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlub21pYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tdWx0aW5vbWlhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxXQUFXLEVBQXNDLE1BQU0saUJBQWlCLENBQUM7QUFJakYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsWUFBWSxDQUNqQixNQUFvQyxFQUFFLFVBQWtCLEVBQUUsSUFBYSxFQUN2RSxVQUFVLEdBQUcsS0FBSztJQUNwQixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNqRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ2pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDOUIsSUFBSSxXQUFXLEdBQUcsQ0FBQyxFQUFFO1FBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ1gsOERBQThEO1lBQzlELEdBQUcsV0FBVyxHQUFHLENBQUMsQ0FBQztLQUN4QjtJQUNELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtRQUNoQixNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxRQUFRLEVBQUUsQ0FBQyxDQUFDO0tBQzdFO0lBQ0QsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQixJQUFJLEdBQUcsSUFBSSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUU3Qix3REFBd0Q7SUFDeEQsTUFBTSxRQUFRLEdBQ1YsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQW1CLENBQUM7SUFFckUsTUFBTSxNQUFNLEdBQXNCLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ3JELE1BQU0sS0FBSyxHQUFxQixFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFFL0QsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osV0FBVyxFQUFFLE1BQThCLEVBQzNDLEtBQTJCLENBQWEsQ0FBQztJQUV6RCx5REFBeUQ7SUFDekQsT0FBTyxRQUFRLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztBQUNyRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtNdWx0aW5vbWlhbCwgTXVsdGlub21pYWxBdHRycywgTXVsdGlub21pYWxJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB2YWx1ZXMgZHJhd24gZnJvbSBhIG11bHRpbm9taWFsIGRpc3RyaWJ1dGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcHJvYnMgPSB0Zi50ZW5zb3IoWy43NSwgLjI1XSk7XG4gKiB0Zi5tdWx0aW5vbWlhbChwcm9icywgMykucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBsb2dpdHMgMUQgYXJyYXkgd2l0aCB1bm5vcm1hbGl6ZWQgbG9nLXByb2JhYmlsaXRpZXMsIG9yXG4gKiAgICAgMkQgYXJyYXkgb2Ygc2hhcGUgYFtiYXRjaFNpemUsIG51bU91dGNvbWVzXWAuIFNlZSB0aGUgYG5vcm1hbGl6ZWRgXG4gKiAgICAgcGFyYW1ldGVyLlxuICogQHBhcmFtIG51bVNhbXBsZXMgTnVtYmVyIG9mIHNhbXBsZXMgdG8gZHJhdyBmb3IgZWFjaCByb3cgc2xpY2UuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBudW1iZXIuXG4gKiBAcGFyYW0gbm9ybWFsaXplZCBXaGV0aGVyIHRoZSBwcm92aWRlZCBgbG9naXRzYCBhcmUgbm9ybWFsaXplZCB0cnVlXG4gKiAgICAgcHJvYmFiaWxpdGllcyAoc3VtIHRvIDEpLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEByZXR1cm4gMUQgYXJyYXkgb2Ygc2hhcGUgYFtudW1TYW1wbGVzXWAsIG9yIDJEIGFycmF5IG9mIHNoYXBlXG4gKiAgICAgYFtiYXRjaFNpemUsIG51bVNhbXBsZXNdYCwgZGVwZW5kaW5nIG9uIHRoZSByYW5rIG9mIHRoZSBpbnB1dC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiBtdWx0aW5vbWlhbF8oXG4gICAgbG9naXRzOiBUZW5zb3IxRHxUZW5zb3IyRHxUZW5zb3JMaWtlLCBudW1TYW1wbGVzOiBudW1iZXIsIHNlZWQ/OiBudW1iZXIsXG4gICAgbm9ybWFsaXplZCA9IGZhbHNlKTogVGVuc29yMUR8VGVuc29yMkQge1xuICBjb25zdCAkbG9naXRzID0gY29udmVydFRvVGVuc29yKGxvZ2l0cywgJ2xvZ2l0cycsICdtdWx0aW5vbWlhbCcpO1xuICBjb25zdCBudW1PdXRjb21lcyA9ICRsb2dpdHMuc2l6ZTtcbiAgY29uc3Qgb3JpZ1JhbmsgPSAkbG9naXRzLnJhbms7XG4gIGlmIChudW1PdXRjb21lcyA8IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBFcnJvciBpbiBtdWx0aW5vbWlhbDogeW91IG5lZWQgYXQgbGVhc3QgMiBvdXRjb21lcywgYnV0IGdvdCBgICtcbiAgICAgICAgYCR7bnVtT3V0Y29tZXN9LmApO1xuICB9XG4gIGlmIChvcmlnUmFuayA+IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmsgb2YgcHJvYmFiaWxpdGllcyBtdXN0IGJlIDEgb3IgMiwgYnV0IGlzICR7b3JpZ1Jhbmt9YCk7XG4gIH1cbiAgLy8gVE9ETyhsaW5hMTI4KTogSW52ZXN0aWdhdGUgY29ycmVjdCBzZWVkIGJlaGF2aW9yLiBUaGUgY29kZSBzZWVtcyBub3QgYWxsb3dcbiAgLy8gc2V0dGluZyBzZWUgdG8gMC5cbiAgc2VlZCA9IHNlZWQgfHwgTWF0aC5yYW5kb20oKTtcblxuICAvLyBUaGUga2VybmVsIG9ubHkgYWNjZXB0cyAoYW5kIHJldHVybnMpIHJhbmsgMiB0ZW5zb3JzLlxuICBjb25zdCBsb2dpdHMyRDogVGVuc29yMkQgPVxuICAgICAgb3JpZ1JhbmsgPT09IDEgPyByZXNoYXBlKCRsb2dpdHMsIFsxLCAtMV0pIDogJGxvZ2l0cyBhcyBUZW5zb3IyRDtcblxuICBjb25zdCBpbnB1dHM6IE11bHRpbm9taWFsSW5wdXRzID0ge2xvZ2l0czogbG9naXRzMkR9O1xuICBjb25zdCBhdHRyczogTXVsdGlub21pYWxBdHRycyA9IHtudW1TYW1wbGVzLCBzZWVkLCBub3JtYWxpemVkfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBNdWx0aW5vbWlhbCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUZW5zb3IyRDtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgcmV0dXJuIG9yaWdSYW5rID09PSAxID8gcmVzaGFwZShyZXMsIFtyZXMuc2l6ZV0pIGFzIFRlbnNvcjFEIDogcmVzO1xufVxuXG5leHBvcnQgY29uc3QgbXVsdGlub21pYWwgPSBvcCh7bXVsdGlub21pYWxffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { NotEqual } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns the truth value of (a != b) element-wise. Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([0, 2, 3]);\n *\n * a.notEqual(b).print();\n * ```\n * @param a The first input tensor.\n * @param b The second input tensor. Must have the same dtype as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nfunction notEqual_(a, b) {\n    let $a = convertToTensor(a, 'a', 'notEqual', 'string_or_numeric');\n    let $b = convertToTensor(b, 'b', 'notEqual', 'string_or_numeric');\n    [$a, $b] = makeTypesMatch($a, $b);\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    return ENGINE.runKernel(NotEqual, inputs);\n}\nexport const notEqual = op({ notEqual_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90X2VxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbm90X2VxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzVELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsU0FBUyxDQUNkLENBQW9CLEVBQUUsQ0FBb0I7SUFDNUMsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQywwQkFBMEIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUvQyxNQUFNLE1BQU0sR0FBbUIsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUU5QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Tm90RXF1YWwsIE5vdEVxdWFsSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHttYWtlVHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbSAnLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdHJ1dGggdmFsdWUgb2YgKGEgIT0gYikgZWxlbWVudC13aXNlLiBTdXBwb3J0cyBicm9hZGNhc3RpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFswLCAyLCAzXSk7XG4gKlxuICogYS5ub3RFcXVhbChiKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCBpbnB1dCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSBkdHlwZSBhcyBgYWAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTG9naWNhbCd9XG4gKi9cbmZ1bmN0aW9uIG5vdEVxdWFsXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBhOiBUZW5zb3J8VGVuc29yTGlrZSwgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgbGV0ICRhID0gY29udmVydFRvVGVuc29yKGEsICdhJywgJ25vdEVxdWFsJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG4gIGxldCAkYiA9IGNvbnZlcnRUb1RlbnNvcihiLCAnYicsICdub3RFcXVhbCcsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBbJGEsICRiXSA9IG1ha2VUeXBlc01hdGNoKCRhLCAkYik7XG5cbiAgYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoJGEuc2hhcGUsICRiLnNoYXBlKTtcblxuICBjb25zdCBpbnB1dHM6IE5vdEVxdWFsSW5wdXRzID0ge2E6ICRhLCBiOiAkYn07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoTm90RXF1YWwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBub3RFcXVhbCA9IG9wKHtub3RFcXVhbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { OnesLike } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Creates a `tf.Tensor` with all elements set to 1 with the same shape as the\n * given tensor.\n *\n * ```js\n * const x = tf.tensor([1, 2]);\n * tf.onesLike(x).print();\n * ```\n * @param x A tensor.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction onesLike_(x) {\n    const $x = convertToTensor(x, 'x', 'onesLike');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(OnesLike, inputs);\n}\nexport const onesLike = op({ onesLike_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lc19saWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvb25lc19saWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7R0FXRztBQUNILFNBQVMsU0FBUyxDQUFtQixDQUFlO0lBQ2xELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUFtQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUN2QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNwRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxFQUFDLFNBQVMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtPbmVzTGlrZSwgT25lc0xpa2VJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIGB0Zi5UZW5zb3JgIHdpdGggYWxsIGVsZW1lbnRzIHNldCB0byAxIHdpdGggdGhlIHNhbWUgc2hhcGUgYXMgdGhlXG4gKiBnaXZlbiB0ZW5zb3IuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IoWzEsIDJdKTtcbiAqIHRmLm9uZXNMaWtlKHgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB4IEEgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gb25lc0xpa2VfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdvbmVzTGlrZScpO1xuXG4gIGNvbnN0IGlucHV0czogT25lc0xpa2VJbnB1dHMgPSB7eDogJHh9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChPbmVzTGlrZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IG9uZXNMaWtlID0gb3Aoe29uZXNMaWtlX30pO1xuIl19","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { matMul } from './mat_mul';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the outer product of two vectors, `v1` and `v2`.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n * const b = tf.tensor1d([3, 4, 5]);\n *\n * tf.outerProduct(a, b).print();\n * ```\n * @param v1 The first vector in the outer product operation.\n * @param v2 The second vector in the outer product operation.\n *\n * @doc {heading: 'Operations', subheading: 'Matrices'}\n */\nfunction outerProduct_(v1, v2) {\n    const $v1 = convertToTensor(v1, 'v1', 'outerProduct');\n    const $v2 = convertToTensor(v2, 'v2', 'outerProduct');\n    util.assert($v1.rank === 1 && $v2.rank === 1, () => `Error in outerProduct: inputs must be rank 1, but got ranks ` +\n        `${$v1.rank} and ${$v2.rank}.`);\n    const v12D = reshape($v1, [-1, 1]);\n    const v22D = reshape($v2, [1, -1]);\n    return matMul(v12D, v22D);\n}\nexport const outerProduct = op({ outerProduct_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3V0ZXJfcHJvZHVjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL291dGVyX3Byb2R1Y3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7Ozs7Ozs7OztHQWFHO0FBQ0gsU0FBUyxhQUFhLENBQ2xCLEVBQXVCLEVBQUUsRUFBdUI7SUFDbEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDdEQsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFdEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDaEMsR0FBRyxFQUFFLENBQUMsOERBQThEO1FBQ2hFLEdBQUcsR0FBRyxDQUFDLElBQUksUUFBUSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV4QyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuQyxPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHttYXRNdWx9IGZyb20gJy4vbWF0X211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG91dGVyIHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnMsIGB2MWAgYW5kIGB2MmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0LCA1XSk7XG4gKlxuICogdGYub3V0ZXJQcm9kdWN0KGEsIGIpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSB2MSBUaGUgZmlyc3QgdmVjdG9yIGluIHRoZSBvdXRlciBwcm9kdWN0IG9wZXJhdGlvbi5cbiAqIEBwYXJhbSB2MiBUaGUgc2Vjb25kIHZlY3RvciBpbiB0aGUgb3V0ZXIgcHJvZHVjdCBvcGVyYXRpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTWF0cmljZXMnfVxuICovXG5mdW5jdGlvbiBvdXRlclByb2R1Y3RfKFxuICAgIHYxOiBUZW5zb3IxRHxUZW5zb3JMaWtlLCB2MjogVGVuc29yMUR8VGVuc29yTGlrZSk6IFRlbnNvcjJEIHtcbiAgY29uc3QgJHYxID0gY29udmVydFRvVGVuc29yKHYxLCAndjEnLCAnb3V0ZXJQcm9kdWN0Jyk7XG4gIGNvbnN0ICR2MiA9IGNvbnZlcnRUb1RlbnNvcih2MiwgJ3YyJywgJ291dGVyUHJvZHVjdCcpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHYxLnJhbmsgPT09IDEgJiYgJHYyLnJhbmsgPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gb3V0ZXJQcm9kdWN0OiBpbnB1dHMgbXVzdCBiZSByYW5rIDEsIGJ1dCBnb3QgcmFua3MgYCArXG4gICAgICAgICAgYCR7JHYxLnJhbmt9IGFuZCAkeyR2Mi5yYW5rfS5gKTtcblxuICBjb25zdCB2MTJEID0gcmVzaGFwZSgkdjEsIFstMSwgMV0pO1xuICBjb25zdCB2MjJEID0gcmVzaGFwZSgkdjIsIFsxLCAtMV0pO1xuICByZXR1cm4gbWF0TXVsKHYxMkQsIHYyMkQpO1xufVxuXG5leHBvcnQgY29uc3Qgb3V0ZXJQcm9kdWN0ID0gb3Aoe291dGVyUHJvZHVjdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { PadV2 } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Pads a `tf.Tensor` with a given value and paddings.\n *\n * This operation implements `CONSTANT` mode. For `REFLECT` and `SYMMETRIC`,\n * refer to `tf.mirrorPad`.\n *\n * Also available are stricter rank-specific methods with the same signature\n * as this method that assert that `paddings` is of given length.\n *   - `tf.pad1d`\n *   - `tf.pad2d`\n *   - `tf.pad3d`\n *   - `tf.pad4d`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * x.pad([[1, 2]]).print();\n * ```\n * @param x The tensor to pad.\n * @param paddings An array of length `R` (the rank of the tensor), where\n * each element is a length-2 tuple of ints `[padBefore, padAfter]`,\n * specifying how much to pad along each dimension of the tensor.\n * @param constantValue The pad value to use. Defaults to 0.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction pad_(x, paddings, constantValue = 0) {\n    const $x = convertToTensor(x, 'x', 'pad');\n    if ($x.rank === 0) {\n        throw new Error('pad(scalar) is not defined. Pass non-scalar to pad');\n    }\n    const attrs = { paddings, constantValue };\n    const inputs = { x: $x };\n    return ENGINE.runKernel(PadV2, inputs, attrs);\n}\nexport const pad = op({ pad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcGFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEtBQUssRUFBMEIsTUFBTSxpQkFBaUIsQ0FBQztBQUkvRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsU0FBUyxJQUFJLENBQ1QsQ0FBZSxFQUFFLFFBQWlDLEVBQUUsYUFBYSxHQUFHLENBQUM7SUFDdkUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDMUMsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixNQUFNLElBQUksS0FBSyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7S0FDdkU7SUFFRCxNQUFNLEtBQUssR0FBZSxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUMsQ0FBQztJQUNwRCxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixLQUFLLEVBQUUsTUFBbUMsRUFDMUMsS0FBZ0MsQ0FBQyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1BhZFYyLCBQYWRWMkF0dHJzLCBQYWRWMklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLlxuICpcbiAqIFRoaXMgb3BlcmF0aW9uIGltcGxlbWVudHMgYENPTlNUQU5UYCBtb2RlLiBGb3IgYFJFRkxFQ1RgIGFuZCBgU1lNTUVUUklDYCxcbiAqIHJlZmVyIHRvIGB0Zi5taXJyb3JQYWRgLlxuICpcbiAqIEFsc28gYXZhaWxhYmxlIGFyZSBzdHJpY3RlciByYW5rLXNwZWNpZmljIG1ldGhvZHMgd2l0aCB0aGUgc2FtZSBzaWduYXR1cmVcbiAqIGFzIHRoaXMgbWV0aG9kIHRoYXQgYXNzZXJ0IHRoYXQgYHBhZGRpbmdzYCBpcyBvZiBnaXZlbiBsZW5ndGguXG4gKiAgIC0gYHRmLnBhZDFkYFxuICogICAtIGB0Zi5wYWQyZGBcbiAqICAgLSBgdGYucGFkM2RgXG4gKiAgIC0gYHRmLnBhZDRkYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqIHgucGFkKFtbMSwgMl1dKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIHBhZC5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBbiBhcnJheSBvZiBsZW5ndGggYFJgICh0aGUgcmFuayBvZiB0aGUgdGVuc29yKSwgd2hlcmVcbiAqIGVhY2ggZWxlbWVudCBpcyBhIGxlbmd0aC0yIHR1cGxlIG9mIGludHMgYFtwYWRCZWZvcmUsIHBhZEFmdGVyXWAsXG4gKiBzcGVjaWZ5aW5nIGhvdyBtdWNoIHRvIHBhZCBhbG9uZyBlYWNoIGRpbWVuc2lvbiBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIGNvbnN0YW50VmFsdWUgVGhlIHBhZCB2YWx1ZSB0byB1c2UuIERlZmF1bHRzIHRvIDAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnVHJhbnNmb3JtYXRpb25zJ31cbiAqL1xuZnVuY3Rpb24gcGFkXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgY29uc3RhbnRWYWx1ZSA9IDApOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncGFkJyk7XG4gIGlmICgkeC5yYW5rID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYWQoc2NhbGFyKSBpcyBub3QgZGVmaW5lZC4gUGFzcyBub24tc2NhbGFyIHRvIHBhZCcpO1xuICB9XG5cbiAgY29uc3QgYXR0cnM6IFBhZFYyQXR0cnMgPSB7cGFkZGluZ3MsIGNvbnN0YW50VmFsdWV9O1xuICBjb25zdCBpbnB1dHM6IFBhZFYySW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBQYWRWMiwgaW5wdXRzIGFzIHVua25vd24gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB1bmtub3duIGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBwYWQgPSBvcCh7cGFkX30pO1xuIl19","import { assert } from '../util';\nimport { op } from './operation';\nimport { pad } from './pad';\n/**\n * Pads a `tf.Tensor1D` with a given value and paddings. See `pad` for details.\n */\nfunction pad1d_(x, paddings, constantValue = 0) {\n    assert(paddings.length === 2, () => 'Invalid number of paddings. Must be length of 2.');\n    return pad(x, [paddings], constantValue);\n}\nexport const pad1d = op({ pad1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkMWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wYWQxZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFzQixFQUFFLFFBQTBCLEVBQ2xELGFBQWEsR0FBRyxDQUFDO0lBQ25CLE1BQU0sQ0FDRixRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQUMsa0RBQWtELENBQUMsQ0FBQztJQUM5RCxPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjFEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3BhZH0gZnJvbSAnLi9wYWQnO1xuXG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yMURgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkMWRfKFxuICAgIHg6IFRlbnNvcjFEfFRlbnNvckxpa2UsIHBhZGRpbmdzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGNvbnN0YW50VmFsdWUgPSAwKTogVGVuc29yMUQge1xuICBhc3NlcnQoXG4gICAgICBwYWRkaW5ncy5sZW5ndGggPT09IDIsXG4gICAgICAoKSA9PiAnSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIuJyk7XG4gIHJldHVybiBwYWQoeCwgW3BhZGRpbmdzXSwgY29uc3RhbnRWYWx1ZSk7XG59XG5cbmV4cG9ydCBjb25zdCBwYWQxZCA9IG9wKHtwYWQxZF99KTtcbiJdfQ==","import { assert } from '../util';\nimport { op } from './operation';\nimport { pad } from './pad';\n/**\n * Pads a `tf.Tensor2D` with a given value and paddings. See `pad` for details.\n */\nfunction pad2d_(x, paddings, constantValue = 0) {\n    assert(paddings.length === 2 && paddings[0].length === 2 &&\n        paddings[1].length === 2, () => 'Invalid number of paddings. Must be length of 2 each.');\n    return pad(x, paddings, constantValue);\n}\nexport const pad2d = op({ pad2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkMmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wYWQyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFzQixFQUFFLFFBQThDLEVBQ3RFLGFBQWEsR0FBRyxDQUFDO0lBQ25CLE1BQU0sQ0FDRixRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDN0MsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzVCLEdBQUcsRUFBRSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDbkUsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3BhZH0gZnJvbSAnLi9wYWQnO1xuXG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yMkRgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkMmRfKFxuICAgIHg6IFRlbnNvcjJEfFRlbnNvckxpa2UsIHBhZGRpbmdzOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0sXG4gICAgY29uc3RhbnRWYWx1ZSA9IDApOiBUZW5zb3IyRCB7XG4gIGFzc2VydChcbiAgICAgIHBhZGRpbmdzLmxlbmd0aCA9PT0gMiAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIsXG4gICAgICAoKSA9PiAnSW52YWxpZCBudW1iZXIgb2YgcGFkZGluZ3MuIE11c3QgYmUgbGVuZ3RoIG9mIDIgZWFjaC4nKTtcbiAgcmV0dXJuIHBhZCh4LCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSk7XG59XG5cbmV4cG9ydCBjb25zdCBwYWQyZCA9IG9wKHtwYWQyZF99KTtcbiJdfQ==","import { assert } from '../util';\nimport { op } from './operation';\nimport { pad } from './pad';\n/**\n * Pads a `tf.Tensor3D` with a given value and paddings. See `pad` for details.\n */\nfunction pad3d_(x, paddings, constantValue = 0) {\n    assert(paddings.length === 3 && paddings[0].length === 2 &&\n        paddings[1].length === 2 && paddings[2].length === 2, () => 'Invalid number of paddings. Must be length of 2 each.');\n    return pad(x, paddings, constantValue);\n}\nexport const pad3d = op({ pad3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkM2QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wYWQzZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFzQixFQUN0QixRQUFnRSxFQUNoRSxhQUFhLEdBQUcsQ0FBQztJQUNuQixNQUFNLENBQ0YsUUFBUSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO1FBQzdDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUN4RCxHQUFHLEVBQUUsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQ25FLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDekMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IzRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtwYWR9IGZyb20gJy4vcGFkJztcblxuLyoqXG4gKiBQYWRzIGEgYHRmLlRlbnNvcjNEYCB3aXRoIGEgZ2l2ZW4gdmFsdWUgYW5kIHBhZGRpbmdzLiBTZWUgYHBhZGAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHBhZDNkXyhcbiAgICB4OiBUZW5zb3IzRHxUZW5zb3JMaWtlLFxuICAgIHBhZGRpbmdzOiBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV0sXG4gICAgY29uc3RhbnRWYWx1ZSA9IDApOiBUZW5zb3IzRCB7XG4gIGFzc2VydChcbiAgICAgIHBhZGRpbmdzLmxlbmd0aCA9PT0gMyAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIgJiYgcGFkZGluZ3NbMl0ubGVuZ3RoID09PSAyLFxuICAgICAgKCkgPT4gJ0ludmFsaWQgbnVtYmVyIG9mIHBhZGRpbmdzLiBNdXN0IGJlIGxlbmd0aCBvZiAyIGVhY2guJyk7XG4gIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuXG5leHBvcnQgY29uc3QgcGFkM2QgPSBvcCh7cGFkM2RffSk7XG4iXX0=","import { assert } from '../util';\nimport { op } from './operation';\nimport { pad } from './pad';\n/**\n * Pads a `tf.Tensor4D` with a given value and paddings. See `pad` for details.\n */\nfunction pad4d_(x, paddings, constantValue = 0) {\n    assert(paddings.length === 4 && paddings[0].length === 2 &&\n        paddings[1].length === 2 && paddings[2].length === 2 &&\n        paddings[3].length === 2, () => 'Invalid number of paddings. Must be length of 2 each.');\n    return pad(x, paddings, constantValue);\n}\nexport const pad4d = op({ pad4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkNGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wYWQ0ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkEsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7O0dBRUc7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFzQixFQUN0QixRQUdLLEVBQ0wsYUFBYSxHQUFHLENBQUM7SUFDbkIsTUFBTSxDQUNGLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUM3QyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFDcEQsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQzVCLEdBQUcsRUFBRSxDQUFDLHVEQUF1RCxDQUFDLENBQUM7SUFDbkUsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3BhZH0gZnJvbSAnLi9wYWQnO1xuXG4vKipcbiAqIFBhZHMgYSBgdGYuVGVuc29yNERgIHdpdGggYSBnaXZlbiB2YWx1ZSBhbmQgcGFkZGluZ3MuIFNlZSBgcGFkYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gcGFkNGRfKFxuICAgIHg6IFRlbnNvcjREfFRlbnNvckxpa2UsXG4gICAgcGFkZGluZ3M6XG4gICAgICAgIFtcbiAgICAgICAgICBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXG4gICAgICAgIF0sXG4gICAgY29uc3RhbnRWYWx1ZSA9IDApOiBUZW5zb3I0RCB7XG4gIGFzc2VydChcbiAgICAgIHBhZGRpbmdzLmxlbmd0aCA9PT0gNCAmJiBwYWRkaW5nc1swXS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICBwYWRkaW5nc1sxXS5sZW5ndGggPT09IDIgJiYgcGFkZGluZ3NbMl0ubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgcGFkZGluZ3NbM10ubGVuZ3RoID09PSAyLFxuICAgICAgKCkgPT4gJ0ludmFsaWQgbnVtYmVyIG9mIHBhZGRpbmdzLiBNdXN0IGJlIGxlbmd0aCBvZiAyIGVhY2guJyk7XG4gIHJldHVybiBwYWQoeCwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xufVxuXG5leHBvcnQgY29uc3QgcGFkNGQgPSBvcCh7cGFkNGRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SpaceToBatchND } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * This operation divides \"spatial\" dimensions `[1, ..., M]` of the input into\n * a grid of blocks of shape `blockShape`, and interleaves these blocks with\n * the \"batch\" dimension (0) such that in the output, the spatial\n * dimensions `[1, ..., M]` correspond to the position within the grid,\n * and the batch dimension combines both the position within a spatial block\n * and the original batch position. Prior to division into blocks,\n * the spatial dimensions of the input are optionally zero padded\n * according to `paddings`. See below for a precise description.\n *\n * ```js\n * const x = tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]);\n * const blockShape = [2, 2];\n * const paddings = [[0, 0], [0, 0]];\n *\n * x.spaceToBatchND(blockShape, paddings).print();\n * ```\n *\n * @param x A `tf.Tensor`. N-D with `x.shape` = `[batch] + spatialShape +\n * remainingShape`, where spatialShape has `M` dimensions.\n * @param blockShape A 1-D array. Must have shape `[M]`, all values must\n * be >= 1.\n * @param paddings A 2-D array. Must have shape `[M, 2]`, all values must be >=\n *     0. `paddings[i] = [padStart, padEnd]` specifies the amount to zero-pad\n * from input dimension `i + 1`, which corresponds to spatial dimension `i`. It\n * is required that\n * `(inputShape[i + 1] + padStart + padEnd) % blockShape[i] === 0`\n *\n * This operation is equivalent to the following steps:\n *\n * 1. Zero-pad the start and end of dimensions `[1, ..., M]` of the input\n * according to `paddings` to produce `padded` of shape paddedShape.\n *\n * 2. Reshape `padded` to `reshapedPadded` of shape:\n * `[batch] + [paddedShape[1] / blockShape[0], blockShape[0], ...,\n * paddedShape[M] / blockShape[M-1], blockShape[M-1]] + remainingShape`\n *\n * 3. Permute dimensions of `reshapedPadded` to produce `permutedReshapedPadded`\n * of shape: `blockShape + [batch] + [paddedShape[1] / blockShape[0], ...,\n * paddedShape[M] / blockShape[M-1]] + remainingShape`\n *\n * 4. Reshape `permutedReshapedPadded` to flatten `blockShape` into the\n * batch dimension, producing an output tensor of shape:\n * `[batch * prod(blockShape)] + [paddedShape[1] / blockShape[0], ...,\n * paddedShape[M] / blockShape[M-1]] + remainingShape`\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction spaceToBatchND_(x, blockShape, paddings) {\n    const $x = convertToTensor(x, 'x', 'spaceToBatchND');\n    util.assert($x.rank >= 1 + blockShape.length, () => `input rank ${$x.rank} should be > than [blockShape] ${blockShape.length}`);\n    util.assert(paddings.length === blockShape.length, () => `paddings.shape[0] ${paddings.length} must be equal to [blockShape] ${blockShape.length}`);\n    util.assert($x.shape.reduce((a, b, i) => {\n        if (i > 0 && i <= blockShape.length) {\n            return a &&\n                ((b + paddings[i - 1][0] + paddings[i - 1][1]) %\n                    blockShape[i - 1] ===\n                    0);\n        }\n        return a;\n    }, true), () => `input spatial dimensions ${$x.shape.slice(1)} with paddings ${paddings.toString()} must be divisible by blockShapes ${blockShape.toString()}`);\n    const inputs = { x: $x };\n    const attrs = { blockShape, paddings };\n    return ENGINE.runKernel(SpaceToBatchND, inputs, attrs);\n}\nexport const spaceToBatchND = op({ spaceToBatchND_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhY2VfdG9fYmF0Y2hfbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGFjZV90b19iYXRjaF9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxjQUFjLEVBQTRDLE1BQU0saUJBQWlCLENBQUM7QUFJMUYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0NHO0FBQ0gsU0FBUyxlQUFlLENBQ3BCLENBQWUsRUFBRSxVQUFvQixFQUFFLFFBQW9CO0lBQzdELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFckQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUNoQyxHQUFHLEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxJQUFJLGtDQUN2QixVQUFVLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUU3QixJQUFJLENBQUMsTUFBTSxDQUNQLFFBQVEsQ0FBQyxNQUFNLEtBQUssVUFBVSxDQUFDLE1BQU0sRUFDckMsR0FBRyxFQUFFLENBQUMscUJBQ0YsUUFBUSxDQUFDLE1BQU0sa0NBQWtDLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTlFLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQ1gsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ1YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFO1lBQ25DLE9BQU8sQ0FBQztnQkFDSixDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDekMsVUFBVSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxDQUFDO1NBQ1Q7UUFDRCxPQUFPLENBQUMsQ0FBQztJQUNYLENBQUMsRUFDRCxJQUFJLENBQUMsRUFDVCxHQUFHLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLGtCQUMvQyxRQUFRLENBQUMsUUFBUSxFQUFFLHFDQUNuQixVQUFVLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sTUFBTSxHQUF5QixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUM3QyxNQUFNLEtBQUssR0FBd0IsRUFBQyxVQUFVLEVBQUUsUUFBUSxFQUFDLENBQUM7SUFFMUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixjQUFjLEVBQUUsTUFBOEIsRUFDOUMsS0FBMkIsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLEVBQUMsZUFBZSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NwYWNlVG9CYXRjaE5ELCBTcGFjZVRvQmF0Y2hOREF0dHJzLCBTcGFjZVRvQmF0Y2hORElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBUaGlzIG9wZXJhdGlvbiBkaXZpZGVzIFwic3BhdGlhbFwiIGRpbWVuc2lvbnMgYFsxLCAuLi4sIE1dYCBvZiB0aGUgaW5wdXQgaW50b1xuICogYSBncmlkIG9mIGJsb2NrcyBvZiBzaGFwZSBgYmxvY2tTaGFwZWAsIGFuZCBpbnRlcmxlYXZlcyB0aGVzZSBibG9ja3Mgd2l0aFxuICogdGhlIFwiYmF0Y2hcIiBkaW1lbnNpb24gKDApIHN1Y2ggdGhhdCBpbiB0aGUgb3V0cHV0LCB0aGUgc3BhdGlhbFxuICogZGltZW5zaW9ucyBgWzEsIC4uLiwgTV1gIGNvcnJlc3BvbmQgdG8gdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgZ3JpZCxcbiAqIGFuZCB0aGUgYmF0Y2ggZGltZW5zaW9uIGNvbWJpbmVzIGJvdGggdGhlIHBvc2l0aW9uIHdpdGhpbiBhIHNwYXRpYWwgYmxvY2tcbiAqIGFuZCB0aGUgb3JpZ2luYWwgYmF0Y2ggcG9zaXRpb24uIFByaW9yIHRvIGRpdmlzaW9uIGludG8gYmxvY2tzLFxuICogdGhlIHNwYXRpYWwgZGltZW5zaW9ucyBvZiB0aGUgaW5wdXQgYXJlIG9wdGlvbmFsbHkgemVybyBwYWRkZWRcbiAqIGFjY29yZGluZyB0byBgcGFkZGluZ3NgLiBTZWUgYmVsb3cgZm9yIGEgcHJlY2lzZSBkZXNjcmlwdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjRkKFsxLCAyLCAzLCA0XSwgWzEsIDIsIDIsIDFdKTtcbiAqIGNvbnN0IGJsb2NrU2hhcGUgPSBbMiwgMl07XG4gKiBjb25zdCBwYWRkaW5ncyA9IFtbMCwgMF0sIFswLCAwXV07XG4gKlxuICogeC5zcGFjZVRvQmF0Y2hORChibG9ja1NoYXBlLCBwYWRkaW5ncykucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgYHRmLlRlbnNvcmAuIE4tRCB3aXRoIGB4LnNoYXBlYCA9IGBbYmF0Y2hdICsgc3BhdGlhbFNoYXBlICtcbiAqIHJlbWFpbmluZ1NoYXBlYCwgd2hlcmUgc3BhdGlhbFNoYXBlIGhhcyBgTWAgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBibG9ja1NoYXBlIEEgMS1EIGFycmF5LiBNdXN0IGhhdmUgc2hhcGUgYFtNXWAsIGFsbCB2YWx1ZXMgbXVzdFxuICogYmUgPj0gMS5cbiAqIEBwYXJhbSBwYWRkaW5ncyBBIDItRCBhcnJheS4gTXVzdCBoYXZlIHNoYXBlIGBbTSwgMl1gLCBhbGwgdmFsdWVzIG11c3QgYmUgPj1cbiAqICAgICAwLiBgcGFkZGluZ3NbaV0gPSBbcGFkU3RhcnQsIHBhZEVuZF1gIHNwZWNpZmllcyB0aGUgYW1vdW50IHRvIHplcm8tcGFkXG4gKiBmcm9tIGlucHV0IGRpbWVuc2lvbiBgaSArIDFgLCB3aGljaCBjb3JyZXNwb25kcyB0byBzcGF0aWFsIGRpbWVuc2lvbiBgaWAuIEl0XG4gKiBpcyByZXF1aXJlZCB0aGF0XG4gKiBgKGlucHV0U2hhcGVbaSArIDFdICsgcGFkU3RhcnQgKyBwYWRFbmQpICUgYmxvY2tTaGFwZVtpXSA9PT0gMGBcbiAqXG4gKiBUaGlzIG9wZXJhdGlvbiBpcyBlcXVpdmFsZW50IHRvIHRoZSBmb2xsb3dpbmcgc3RlcHM6XG4gKlxuICogMS4gWmVyby1wYWQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgZGltZW5zaW9ucyBgWzEsIC4uLiwgTV1gIG9mIHRoZSBpbnB1dFxuICogYWNjb3JkaW5nIHRvIGBwYWRkaW5nc2AgdG8gcHJvZHVjZSBgcGFkZGVkYCBvZiBzaGFwZSBwYWRkZWRTaGFwZS5cbiAqXG4gKiAyLiBSZXNoYXBlIGBwYWRkZWRgIHRvIGByZXNoYXBlZFBhZGRlZGAgb2Ygc2hhcGU6XG4gKiBgW2JhdGNoXSArIFtwYWRkZWRTaGFwZVsxXSAvIGJsb2NrU2hhcGVbMF0sIGJsb2NrU2hhcGVbMF0sIC4uLixcbiAqIHBhZGRlZFNoYXBlW01dIC8gYmxvY2tTaGFwZVtNLTFdLCBibG9ja1NoYXBlW00tMV1dICsgcmVtYWluaW5nU2hhcGVgXG4gKlxuICogMy4gUGVybXV0ZSBkaW1lbnNpb25zIG9mIGByZXNoYXBlZFBhZGRlZGAgdG8gcHJvZHVjZSBgcGVybXV0ZWRSZXNoYXBlZFBhZGRlZGBcbiAqIG9mIHNoYXBlOiBgYmxvY2tTaGFwZSArIFtiYXRjaF0gKyBbcGFkZGVkU2hhcGVbMV0gLyBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBwYWRkZWRTaGFwZVtNXSAvIGJsb2NrU2hhcGVbTS0xXV0gKyByZW1haW5pbmdTaGFwZWBcbiAqXG4gKiA0LiBSZXNoYXBlIGBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkYCB0byBmbGF0dGVuIGBibG9ja1NoYXBlYCBpbnRvIHRoZVxuICogYmF0Y2ggZGltZW5zaW9uLCBwcm9kdWNpbmcgYW4gb3V0cHV0IHRlbnNvciBvZiBzaGFwZTpcbiAqIGBbYmF0Y2ggKiBwcm9kKGJsb2NrU2hhcGUpXSArIFtwYWRkZWRTaGFwZVsxXSAvIGJsb2NrU2hhcGVbMF0sIC4uLixcbiAqIHBhZGRlZFNoYXBlW01dIC8gYmxvY2tTaGFwZVtNLTFdXSArIHJlbWFpbmluZ1NoYXBlYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1RyYW5zZm9ybWF0aW9ucyd9XG4gKi9cbmZ1bmN0aW9uIHNwYWNlVG9CYXRjaE5EXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGJsb2NrU2hhcGU6IG51bWJlcltdLCBwYWRkaW5nczogbnVtYmVyW11bXSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzcGFjZVRvQmF0Y2hORCcpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA+PSAxICsgYmxvY2tTaGFwZS5sZW5ndGgsXG4gICAgICAoKSA9PiBgaW5wdXQgcmFuayAkeyR4LnJhbmt9IHNob3VsZCBiZSA+IHRoYW4gW2Jsb2NrU2hhcGVdICR7XG4gICAgICAgICAgYmxvY2tTaGFwZS5sZW5ndGh9YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBwYWRkaW5ncy5sZW5ndGggPT09IGJsb2NrU2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gYHBhZGRpbmdzLnNoYXBlWzBdICR7XG4gICAgICAgICAgcGFkZGluZ3MubGVuZ3RofSBtdXN0IGJlIGVxdWFsIHRvIFtibG9ja1NoYXBlXSAke2Jsb2NrU2hhcGUubGVuZ3RofWApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHguc2hhcGUucmVkdWNlKFxuICAgICAgICAgIChhLCBiLCBpKSA9PiB7XG4gICAgICAgICAgICBpZiAoaSA+IDAgJiYgaSA8PSBibG9ja1NoYXBlLmxlbmd0aCkge1xuICAgICAgICAgICAgICByZXR1cm4gYSAmJlxuICAgICAgICAgICAgICAgICAgKChiICsgcGFkZGluZ3NbaSAtIDFdWzBdICsgcGFkZGluZ3NbaSAtIDFdWzFdKSAlXG4gICAgICAgICAgICAgICAgICAgICAgIGJsb2NrU2hhcGVbaSAtIDFdID09PVxuICAgICAgICAgICAgICAgICAgIDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB0cnVlKSxcbiAgICAgICgpID0+IGBpbnB1dCBzcGF0aWFsIGRpbWVuc2lvbnMgJHskeC5zaGFwZS5zbGljZSgxKX0gd2l0aCBwYWRkaW5ncyAke1xuICAgICAgICAgIHBhZGRpbmdzLnRvU3RyaW5nKCl9IG11c3QgYmUgZGl2aXNpYmxlIGJ5IGJsb2NrU2hhcGVzICR7XG4gICAgICAgICAgYmxvY2tTaGFwZS50b1N0cmluZygpfWApO1xuXG4gIGNvbnN0IGlucHV0czogU3BhY2VUb0JhdGNoTkRJbnB1dHMgPSB7eDogJHh9O1xuICBjb25zdCBhdHRyczogU3BhY2VUb0JhdGNoTkRBdHRycyA9IHtibG9ja1NoYXBlLCBwYWRkaW5nc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBTcGFjZVRvQmF0Y2hORCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYWNlVG9CYXRjaE5EID0gb3Aoe3NwYWNlVG9CYXRjaE5EX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { avgPool } from './avg_pool';\nimport { batchToSpaceND } from './batch_to_space_nd';\nimport * as conv_util from './conv_util';\nimport { maxPool } from './max_pool';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nimport { spaceToBatchND } from './space_to_batch_nd';\n/**\n * Performs an N-D pooling operation\n *\n * @param input The input tensor, of rank 4 or rank 3 of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param windowShape The filter size: `[filterHeight, filterWidth]`. If\n *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param poolingType The type of pooling, either 'max' or 'avg'.\n * @param pad The type of padding algorithm:\n *    - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *    - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *    - For more info, see this guide:\n *     [https://www.tensorflow.org/api_guides/python/nn#Convolution](\n *         https://www.tensorflow.org/api_guides/python/nn#Convolution)\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n *     in which we sample input values across the height and width dimensions\n *     in dilated pooling. Defaults to `[1, 1]`. If `dilationRate` is a single\n *     number, then `dilationHeight == dilationWidth`. If it is greater than\n *     1, then all values of `strides` must be 1.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n *     `strides` is a single number, then `strideHeight == strideWidth`.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction pool_(input, windowShape, poolingType, pad, dilations, strides, dimRoundingMode) {\n    if (dilations == null) {\n        dilations = [1, 1];\n    }\n    if (strides == null) {\n        strides = 1;\n    }\n    if (pad === 0) {\n        pad = 'valid';\n    }\n    const $x = convertToTensor(input, 'x', 'maxPool');\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in pool: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    const convInfo = conv_util.computePool2DInfo(x4D.shape, windowShape, strides, dilations, pad);\n    const dilation = [convInfo.dilationHeight, convInfo.dilationWidth];\n    // The following implementation does batchToSpace(pool(spaceToBatch(x)))\n    // whenever dilation > 1 since the TF kernels do not support dilation > 1.\n    // tslint:disable-next-line:max-line-length\n    // https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/nn_ops.py#L1037\n    let basePadding;\n    if (pad === 'same') {\n        basePadding = withSpaceToBatchBasePaddings([convInfo.filterHeight, convInfo.filterWidth], dilation);\n    }\n    else {\n        basePadding = [[0, 0], [0, 0]];\n    }\n    const isDilationOne = dilation[0] === 1 && dilation[1] === 1;\n    const [adjustedPadding, adjustedCrops] = requiredSpaceToBatchPaddings([convInfo.inHeight, convInfo.inWidth], dilation, basePadding);\n    const convertedPad = isDilationOne ? pad : 'valid';\n    const convertedX = isDilationOne ? x4D : spaceToBatchND(x4D, dilation, adjustedPadding);\n    const forwardOp = poolingType === 'avg' ?\n        () => avgPool(convertedX, windowShape, strides, convertedPad, dimRoundingMode) :\n        () => maxPool(convertedX, windowShape, strides, convertedPad, dimRoundingMode);\n    const y = forwardOp();\n    const res = isDilationOne ? y : batchToSpaceND(y, dilation, adjustedCrops);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\n// Helper function to compute crops and paddings for pool with dilation > 1.\n// tslint:disable-next-line:max-line-length\n// https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/array_ops.py#L2184\nfunction requiredSpaceToBatchPaddings(inputShape, blockShape, basePadding) {\n    const padStart = basePadding.map(b => b[0]);\n    const origPadEnd = basePadding.map(b => b[1]);\n    const fullInputShape = inputShape.concat(padStart, origPadEnd);\n    const padEndExtra = blockShape.map((b, i) => (b - fullInputShape[i] % b) % b);\n    const padEnd = origPadEnd.map((s, i) => s + padEndExtra[i]);\n    const paddings = blockShape.map((_, i) => [padStart[i], padEnd[i]]);\n    const crops = blockShape.map((_, i) => [0, padEndExtra[i]]);\n    return [paddings, crops];\n}\n// Helper function to compute base paddings for pool with dilation > 1.\n// tslint:disable-next-line:max-line-length\n// https://github.com/tensorflow/tensorflow/blob/50f6bb67dc98c9b74630b6047aae7a4f8a40fd02/tensorflow/python/ops/nn_ops.py#L524\nfunction withSpaceToBatchBasePaddings(filterShape, dilation) {\n    // Spatial dimensions of the filters and the upsampled filters in which we\n    // introduce (rate - 1) zeros between consecutive filter values.\n    const dilatedFilterShape = filterShape.map((s, i) => {\n        return s + (s - 1) * (dilation[i] - 1);\n    });\n    const padExtraShape = dilatedFilterShape.map(s => s - 1);\n    // When padding is odd, we pad more at end, following the same\n    // convention as conv2d.\n    const padExtraStart = padExtraShape.map(s => Math.floor(s / 2));\n    const padExtraEnd = padExtraShape.map((s, i) => s - padExtraStart[i]);\n    return padExtraShape.map((_, i) => {\n        return [padExtraStart[i], padExtraEnd[i]];\n    });\n}\nexport const pool = op({ pool_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ25ELE9BQU8sS0FBSyxTQUFTLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUVuRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBUyxLQUFLLENBQ1YsS0FBbUIsRUFBRSxXQUFvQyxFQUN6RCxXQUF3QixFQUN4QixHQUFvRCxFQUNwRCxTQUFtQyxFQUFFLE9BQWlDLEVBQ3RFLGVBQXdDO0lBQzFDLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixTQUFTLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDcEI7SUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsT0FBTyxHQUFHLENBQUMsQ0FBQztLQUNiO0lBQ0QsSUFBSSxHQUFHLEtBQUssQ0FBQyxFQUFFO1FBQ2IsR0FBRyxHQUFHLE9BQU8sQ0FBQztLQUNmO0lBRUQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxHQUFHLEVB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NUMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YXZnUG9vbH0gZnJvbSAnLi9hdmdfcG9vbCc7XG5pbXBvcnQge2JhdGNoVG9TcGFjZU5EfSBmcm9tICcuL2JhdGNoX3RvX3NwYWNlX25kJztcbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge21heFBvb2x9IGZyb20gJy4vbWF4X3Bvb2wnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcGFjZVRvQmF0Y2hORH0gZnJvbSAnLi9zcGFjZV90b19iYXRjaF9uZCc7XG5cbi8qKlxuICogUGVyZm9ybXMgYW4gTi1EIHBvb2xpbmcgb3BlcmF0aW9uXG4gKlxuICogQHBhcmFtIGlucHV0IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIHdpbmRvd1NoYXBlIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBwb29saW5nVHlwZSBUaGUgdHlwZSBvZiBwb29saW5nLCBlaXRoZXIgJ21heCcgb3IgJ2F2ZycuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtOlxuICogICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAgLSBgdmFsaWRgOiBvdXRwdXQgd2lsbCBiZSBzbWFsbGVyIHRoYW4gaW5wdXQgaWYgZmlsdGVyIGlzIGxhcmdlclxuICogICAgICAgdGhhbiAxeDEuXG4gKiAgICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZ3VpZGVzL3B5dGhvbi9ubiNDb252b2x1dGlvbl0oXG4gKiAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9ndWlkZXMvcHl0aG9uL25uI0NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBkaWxhdGVkIHBvb2xpbmcuIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25SYXRlYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLiBJZlxuICogICAgIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBwb29sXzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIGlucHV0OiBUfFRlbnNvckxpa2UsIHdpbmRvd1NoYXBlOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwb29saW5nVHlwZTogJ2F2Zyd8J21heCcsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8Y29udl91dGlsLkV4cGxpY2l0UGFkZGluZyxcbiAgICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciwgc3RyaWRlcz86IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpIHtcbiAgaWYgKGRpbGF0aW9ucyA9PSBudWxsKSB7XG4gICAgZGlsYXRpb25zID0gWzEsIDFdO1xuICB9XG4gIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICBzdHJpZGVzID0gMTtcbiAgfVxuICBpZiAocGFkID09PSAwKSB7XG4gICAgcGFkID0gJ3ZhbGlkJztcbiAgfVxuXG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAneCcsICdtYXhQb29sJyk7XG4gIGxldCB4NEQgPSAkeCBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuXG4gIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gcG9vbDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgMS4gJyArXG4gICAgICAgICAgYEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gY29udl91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgeDRELnNoYXBlLCB3aW5kb3dTaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQpO1xuICBjb25zdCBkaWxhdGlvbjogW251bWJlciwgbnVtYmVyXSA9XG4gICAgICBbY29udkluZm8uZGlsYXRpb25IZWlnaHQsIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGhdO1xuXG4gIC8vIFRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24gZG9lcyBiYXRjaFRvU3BhY2UocG9vbChzcGFjZVRvQmF0Y2goeCkpKVxuICAvLyB3aGVuZXZlciBkaWxhdGlvbiA+IDEgc2luY2UgdGhlIFRGIGtlcm5lbHMgZG8gbm90IHN1cHBvcnQgZGlsYXRpb24gPiAxLlxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi81MGY2YmI2N2RjOThjOWI3NDYzMGI2MDQ3YWFlN2E0ZjhhNDBmZDAyL3RlbnNvcmZsb3cvcHl0aG9uL29wcy9ubl9vcHMucHkjTDEwMzdcblxuICBsZXQgYmFzZVBhZGRpbmc6IG51bWJlcltdW107XG4gIGlmIChwYWQgPT09ICdzYW1lJykge1xuICAgIGJhc2VQYWRkaW5nID0gd2l0aFNwYWNlVG9CYXRjaEJhc2VQYWRkaW5ncyhcbiAgICAgICAgW2NvbnZJbmZvLmZpbHRlckhlaWdodCwgY29udkluZm8uZmlsdGVyV2lkdGhdLCBkaWxhdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgYmFzZVBhZGRpbmcgPSBbWzAsIDBdLCBbMCwgMF1dO1xuICB9XG5cbiAgY29uc3QgaXNEaWxhdGlvbk9uZSA9IGRpbGF0aW9uWzBdID09PSAxICYmIGRpbGF0aW9uWzFdID09PSAxO1xuICBjb25zdCBbYWRqdXN0ZWRQYWRkaW5nLCBhZGp1c3RlZENyb3BzXSA9IHJlcXVpcmVkU3BhY2VUb0JhdGNoUGFkZGluZ3MoXG4gICAgICBbY29udkluZm8uaW5IZWlnaHQsIGNvbnZJbmZvLmluV2lkdGhdLCBkaWxhdGlvbiwgYmFzZVBhZGRpbmcpO1xuICBjb25zdCBjb252ZXJ0ZWRQYWQgPSBpc0RpbGF0aW9uT25lID8gcGFkIDogJ3ZhbGlkJztcbiAgY29uc3QgY29udmVydGVkWCA9XG4gICAgICBpc0RpbGF0aW9uT25lID8geDREIDogc3BhY2VUb0JhdGNoTkQoeDRELCBkaWxhdGlvbiwgYWRqdXN0ZWRQYWRkaW5nKTtcblxuICBjb25zdCBmb3J3YXJkT3AgPSBwb29saW5nVHlwZSA9PT0gJ2F2ZycgP1xuICAgICAgKCkgPT4gYXZnUG9vbChjb252ZXJ0ZWRYLCB3aW5kb3dTaGFwZSwgc3RyaWRlcywgY29udmVydGVkUGFkLFxuICAgICAgICAgICAgICAgICAgICBkaW1Sb3VuZGluZ01vZGUpIDpcbiAgICAgICgpID0+IG1heFBvb2woY29udmVydGVkWCwgd2luZG93U2hhcGUsIHN0cmlkZXMsIGNvbnZlcnRlZFBhZCxcbiAgICAgICAgICAgICAgICAgICAgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgeSA9IGZvcndhcmRPcCgpO1xuXG4gIGNvbnN0IHJlcyA9IGlzRGlsYXRpb25PbmUgPyB5IDogYmF0Y2hUb1NwYWNlTkQoeSwgZGlsYXRpb24sIGFkanVzdGVkQ3JvcHMpO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuXG4gIHJldHVybiByZXMgYXMgVDtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgY3JvcHMgYW5kIHBhZGRpbmdzIGZvciBwb29sIHdpdGggZGlsYXRpb24gPiAxLlxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzUwZjZiYjY3ZGM5OGM5Yjc0NjMwYjYwNDdhYWU3YTRmOGE0MGZkMDIvdGVuc29yZmxvdy9weXRob24vb3BzL2FycmF5X29wcy5weSNMMjE4NFxuZnVuY3Rpb24gcmVxdWlyZWRTcGFjZVRvQmF0Y2hQYWRkaW5ncyhcbiAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLCBibG9ja1NoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGJhc2VQYWRkaW5nOiBudW1iZXJbXVtdKSB7XG4gIGNvbnN0IHBhZFN0YXJ0ID0gYmFzZVBhZGRpbmcubWFwKGIgPT4gYlswXSk7XG4gIGNvbnN0IG9yaWdQYWRFbmQgPSBiYXNlUGFkZGluZy5tYXAoYiA9PiBiWzFdKTtcbiAgY29uc3QgZnVsbElucHV0U2hhcGUgPSBpbnB1dFNoYXBlLmNvbmNhdChwYWRTdGFydCwgb3JpZ1BhZEVuZCk7XG4gIGNvbnN0IHBhZEVuZEV4dHJhID0gYmxvY2tTaGFwZS5tYXAoKGIsIGkpID0+IChiIC0gZnVsbElucHV0U2hhcGVbaV0gJSBiKSAlIGIpO1xuICBjb25zdCBwYWRFbmQgPSBvcmlnUGFkRW5kLm1hcCgocywgaSkgPT4gcyArIHBhZEVuZEV4dHJhW2ldKTtcbiAgY29uc3QgcGFkZGluZ3MgPSBibG9ja1NoYXBlLm1hcCgoXywgaSkgPT4gW3BhZFN0YXJ0W2ldLCBwYWRFbmRbaV1dKTtcbiAgY29uc3QgY3JvcHMgPSBibG9ja1NoYXBlLm1hcCgoXywgaSkgPT4gWzAsIHBhZEVuZEV4dHJhW2ldXSk7XG4gIHJldHVybiBbcGFkZGluZ3MsIGNyb3BzXTtcbn1cblxuLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgYmFzZSBwYWRkaW5ncyBmb3IgcG9vbCB3aXRoIGRpbGF0aW9uID4gMS5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi81MGY2YmI2N2RjOThjOWI3NDYzMGI2MDQ3YWFlN2E0ZjhhNDBmZDAyL3RlbnNvcmZsb3cvcHl0aG9uL29wcy9ubl9vcHMucHkjTDUyNFxuZnVuY3Rpb24gd2l0aFNwYWNlVG9CYXRjaEJhc2VQYWRkaW5ncyhcbiAgICBmaWx0ZXJTaGFwZTogW251bWJlciwgbnVtYmVyXSwgZGlsYXRpb246IFtudW1iZXIsIG51bWJlcl0pIHtcbiAgLy8gU3BhdGlhbCBkaW1lbnNpb25zIG9mIHRoZSBmaWx0ZXJzIGFuZCB0aGUgdXBzYW1wbGVkIGZpbHRlcnMgaW4gd2hpY2ggd2VcbiAgLy8gaW50cm9kdWNlIChyYXRlIC0gMSkgemVyb3MgYmV0d2VlbiBjb25zZWN1dGl2ZSBmaWx0ZXIgdmFsdWVzLlxuICBjb25zdCBkaWxhdGVkRmlsdGVyU2hhcGUgPSBmaWx0ZXJTaGFwZS5tYXAoKHMsIGkpID0+IHtcbiAgICByZXR1cm4gcyArIChzIC0gMSkgKiAoZGlsYXRpb25baV0gLSAxKTtcbiAgfSk7XG4gIGNvbnN0IHBhZEV4dHJhU2hhcGUgPSBkaWxhdGVkRmlsdGVyU2hhcGUubWFwKHMgPT4gcyAtIDEpO1xuXG4gIC8vIFdoZW4gcGFkZGluZyBpcyBvZGQsIHdlIHBhZCBtb3JlIGF0IGVuZCwgZm9sbG93aW5nIHRoZSBzYW1lXG4gIC8vIGNvbnZlbnRpb24gYXMgY29udjJkLlxuICBjb25zdCBwYWRFeHRyYVN0YXJ0ID0gcGFkRXh0cmFTaGFwZS5tYXAocyA9PiBNYXRoLmZsb29yKHMgLyAyKSk7XG4gIGNvbnN0IHBhZEV4dHJhRW5kID0gcGFkRXh0cmFTaGFwZS5tYXAoKHMsIGkpID0+IHMgLSBwYWRFeHRyYVN0YXJ0W2ldKTtcbiAgcmV0dXJuIHBhZEV4dHJhU2hhcGUubWFwKChfLCBpKSA9PiB7XG4gICAgcmV0dXJuIFtwYWRFeHRyYVN0YXJ0W2ldLCBwYWRFeHRyYUVuZFtpXV07XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgcG9vbCA9IG9wKHtwb29sX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Prelu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes leaky rectified linear element-wise with parametric alphas.\n *\n * `x < 0 ? alpha * x : f(x) = x`\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n * const alpha = tf.scalar(0.1);\n *\n * x.prelu(alpha).print();  // or tf.prelu(x, alpha)\n * ```\n * @param x The input tensor.\n * @param alpha Scaling factor for negative values.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction prelu_(x, alpha) {\n    const $x = convertToTensor(x, 'x', 'prelu');\n    const $alpha = convertToTensor(alpha, 'alpha', 'prelu');\n    const inputs = { x: $x, alpha: $alpha };\n    return ENGINE.runKernel(Prelu, inputs);\n}\nexport const prelu = op({ prelu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9wcmVsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZSxFQUFFLEtBQW1CO0lBQ3BFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzVDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXhELE1BQU0sTUFBTSxHQUFnQixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBQ25ELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1ByZWx1LCBQcmVsdUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBsZWFreSByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZSB3aXRoIHBhcmFtZXRyaWMgYWxwaGFzLlxuICpcbiAqIGB4IDwgMCA/IGFscGhhICogeCA6IGYoeCkgPSB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWy0xLCAyLCAtMywgNF0pO1xuICogY29uc3QgYWxwaGEgPSB0Zi5zY2FsYXIoMC4xKTtcbiAqXG4gKiB4LnByZWx1KGFscGhhKS5wcmludCgpOyAgLy8gb3IgdGYucHJlbHUoeCwgYWxwaGEpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYWxwaGEgU2NhbGluZyBmYWN0b3IgZm9yIG5lZ2F0aXZlIHZhbHVlcy5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcHJlbHVfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSwgYWxwaGE6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdwcmVsdScpO1xuICBjb25zdCAkYWxwaGEgPSBjb252ZXJ0VG9UZW5zb3IoYWxwaGEsICdhbHBoYScsICdwcmVsdScpO1xuXG4gIGNvbnN0IGlucHV0czogUHJlbHVJbnB1dHMgPSB7eDogJHgsIGFscGhhOiAkYWxwaGF9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChQcmVsdSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByZWx1ID0gb3Aoe3ByZWx1X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Prod } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { cast } from './cast';\nimport { op } from './operation';\n/**\n * Computes the product of elements across dimensions of a `tf.Tensor`.\n *\n * Reduces the input along the dimensions given in `axes`. Unless `keepDims`\n * is true, the rank of the `tf.Tensor` is reduced by 1 for each entry in\n * `axes`. If `keepDims` is true, the reduced dimensions are retained with\n * length 1. If `axes` has no entries, all dimensions are reduced, and a\n * `tf.Tensor` with a single element is returned.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3]);\n *\n * x.prod().print();  // or tf.prod(x)\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.prod(axis).print();  // or tf.prod(x, axis)\n * ```\n *\n * @param x The input tensor to compute the product over. If the dtype is `bool`\n *   it will be converted to `int32` and the output dtype will be `int32`.\n * @param axis The dimension(s) to reduce. By default it reduces\n *     all dimensions.\n * @param keepDims If true, retains reduced dimensions with size 1.\n *\n * @doc {heading: 'Operations', subheading: 'Reduction'}\n */\nfunction prod_(x, axis = null, keepDims = false) {\n    let $x = convertToTensor(x, 'x', 'prod');\n    if ($x.dtype === 'bool') {\n        // bool is not an allowed type for the underlying kernel.\n        $x = cast($x, 'int32');\n    }\n    const inputs = { x: $x };\n    const attrs = { axis, keepDims };\n    return ENGINE.runKernel(Prod, inputs, attrs);\n}\nexport const prod = op({ prod_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3Byb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNkJHO0FBQ0gsU0FBUyxLQUFLLENBQ1YsQ0FBb0IsRUFBRSxPQUF3QixJQUFJLEVBQUUsUUFBUSxHQUFHLEtBQUs7SUFDdEUsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFekMsSUFBSSxFQUFFLENBQUMsS0FBSyxLQUFLLE1BQU0sRUFBRTtRQUN2Qix5REFBeUQ7UUFDekQsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDeEI7SUFFRCxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNuQyxNQUFNLEtBQUssR0FBYyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUUxQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLElBQUksRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtQcm9kLCBQcm9kQXR0cnMsIFByb2RJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9jYXN0JztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgcHJvZHVjdCBvZiBlbGVtZW50cyBhY3Jvc3MgZGltZW5zaW9ucyBvZiBhIGB0Zi5UZW5zb3JgLlxuICpcbiAqIFJlZHVjZXMgdGhlIGlucHV0IGFsb25nIHRoZSBkaW1lbnNpb25zIGdpdmVuIGluIGBheGVzYC4gVW5sZXNzIGBrZWVwRGltc2BcbiAqIGlzIHRydWUsIHRoZSByYW5rIG9mIHRoZSBgdGYuVGVuc29yYCBpcyByZWR1Y2VkIGJ5IDEgZm9yIGVhY2ggZW50cnkgaW5cbiAqIGBheGVzYC4gSWYgYGtlZXBEaW1zYCBpcyB0cnVlLCB0aGUgcmVkdWNlZCBkaW1lbnNpb25zIGFyZSByZXRhaW5lZCB3aXRoXG4gKiBsZW5ndGggMS4gSWYgYGF4ZXNgIGhhcyBubyBlbnRyaWVzLCBhbGwgZGltZW5zaW9ucyBhcmUgcmVkdWNlZCwgYW5kIGFcbiAqIGB0Zi5UZW5zb3JgIHdpdGggYSBzaW5nbGUgZWxlbWVudCBpcyByZXR1cm5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKlxuICogeC5wcm9kKCkucHJpbnQoKTsgIC8vIG9yIHRmLnByb2QoeClcbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICpcbiAqIGNvbnN0IGF4aXMgPSAxO1xuICogeC5wcm9kKGF4aXMpLnByaW50KCk7ICAvLyBvciB0Zi5wcm9kKHgsIGF4aXMpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yIHRvIGNvbXB1dGUgdGhlIHByb2R1Y3Qgb3Zlci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYFxuICogICBpdCB3aWxsIGJlIGNvbnZlcnRlZCB0byBgaW50MzJgIGFuZCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmUgYGludDMyYC5cbiAqIEBwYXJhbSBheGlzIFRoZSBkaW1lbnNpb24ocykgdG8gcmVkdWNlLiBCeSBkZWZhdWx0IGl0IHJlZHVjZXNcbiAqICAgICBhbGwgZGltZW5zaW9ucy5cbiAqIEBwYXJhbSBrZWVwRGltcyBJZiB0cnVlLCByZXRhaW5zIHJlZHVjZWQgZGltZW5zaW9ucyB3aXRoIHNpemUgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdSZWR1Y3Rpb24nfVxuICovXG5mdW5jdGlvbiBwcm9kXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpczogbnVtYmVyfG51bWJlcltdID0gbnVsbCwga2VlcERpbXMgPSBmYWxzZSk6IFQge1xuICBsZXQgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncHJvZCcpO1xuXG4gIGlmICgkeC5kdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgLy8gYm9vbCBpcyBub3QgYW4gYWxsb3dlZCB0eXBlIGZvciB0aGUgdW5kZXJseWluZyBrZXJuZWwuXG4gICAgJHggPSBjYXN0KCR4LCAnaW50MzInKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogUHJvZElucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBQcm9kQXR0cnMgPSB7YXhpcywga2VlcERpbXN9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgUHJvZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgcHJvZCA9IG9wKHtwcm9kX30pO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { RaggedGather } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\nfunction raggedGather_(paramsNestedSplits, paramsDenseValues, indices, outputRaggedRank) {\n    const $paramsNestedSplits = paramsNestedSplits.map((t, i) => convertToTensor(t, `tensors${i}`, 'raggedGather', 'int32'));\n    const $paramsDenseValues = convertToTensor(paramsDenseValues, 'paramsDenseValues', 'raggedGather');\n    const $indices = convertToTensor(indices, 'indices', 'raggedGather', 'int32');\n    const inputs = {\n        paramsNestedSplits: $paramsNestedSplits,\n        paramsDenseValues: $paramsDenseValues,\n        indices: $indices,\n    };\n    const attrs = { outputRaggedRank };\n    const result = ENGINE.runKernel(RaggedGather, inputs, attrs);\n    return {\n        outputNestedSplits: result.slice(0, result.length - 1),\n        outputDenseValues: result[result.length - 1],\n    };\n}\nexport const raggedGather = op({ raggedGather_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFnZ2VkX2dhdGhlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JhZ2dlZF9nYXRoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBRXBGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBNEIvQixTQUFTLGFBQWEsQ0FDbEIsa0JBQTRCLEVBQUUsaUJBQW9DLEVBQ2xFLE9BQTBCLEVBQUUsZ0JBQXdCO0lBQ3RELE1BQU0sbUJBQW1CLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUM5QyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLGVBQWUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLEVBQUUsRUFBRSxjQUFjLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLGtCQUFrQixHQUNwQixlQUFlLENBQUMsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDNUUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsY0FBYyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTlFLE1BQU0sTUFBTSxHQUF1QjtRQUNqQyxrQkFBa0IsRUFBRSxtQkFBbUI7UUFDdkMsaUJBQWlCLEVBQUUsa0JBQWtCO1FBQ3JDLE9BQU8sRUFBRSxRQUFRO0tBQ2xCLENBQUM7SUFDRixNQUFNLEtBQUssR0FBc0IsRUFBQyxnQkFBZ0IsRUFBQyxDQUFDO0lBRXBELE1BQU0sTUFBTSxHQUNSLE1BQU0sQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLE1BQVksRUFBRSxLQUFXLENBQUMsQ0FBQztJQUM5RCxPQUFPO1FBQ0wsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDdEQsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0tBQzdDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGFBQWEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtSYWdnZWRHYXRoZXIsIFJhZ2dlZEdhdGhlckF0dHJzLCBSYWdnZWRHYXRoZXJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogR2F0aGVyIHJhZ2dlZCBzbGljZXMgZnJvbSBwYXJhbXMgYXhpcyAwIGFjY29yZGluZyB0byBpbmRpY2VzLlxuICpcbiAqIEBwYXJhbSBwYXJhbXNOZXN0ZWRTcGxpdHM6IEEgbGlzdCBvZiBhdCBsZWFzdCAxIFRlbnNvciB3aXRoIHR5cGUgJ2ludDMyJyBUaGVcbiAqICAgICBuZXN0ZWRSb3dTcGxpdHMgdGVuc29ycyB0aGF0IGRlZmluZSB0aGUgcm93LXBhcnRpdGlvbmluZyBmb3IgdGhlIHBhcmFtc1xuICogICAgIFJhZ2dlZFRlbnNvciBpbnB1dC5cbiAqIEBwYXJhbSBwYXJhbXNEZW5zZVZhbHVlczogQSBUZW5zb3IuIFRoZSBmbGF0VmFsdWVzIGZvciB0aGUgcGFyYW1zXG4gKiAgICAgUmFnZ2VkVGVuc29yLlxuICogQHBhcmFtIGluZGljZXM6IEEgVGVuc29yLiBNdXN0IGJlIG9uZSBvZiB0eXBlOiBpbnQzMi4gSW5kaWNlcyBpbiB0aGVcbiAqICAgICBvdXRlcm1vc3QgZGltZW5zaW9uIG9mIHBhcmFtcyBvZiB0aGUgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIGdhdGhlcmVkLlxuICogQHBhcmFtIG91dHB1dFJhZ2dlZFJhbms6IEFuIGludCB0aGF0IGlzID49IDAuIFRoZSByYWdnZWQgcmFuayBvZiB0aGUgb3V0cHV0XG4gKiAgICAgUmFnZ2VkVGVuc29yLiBvdXRwdXROZXN0ZWRTcGxpdHMgd2lsbCBjb250YWluIHRoaXMgbnVtYmVyIG9mIHJvd1NwbGl0c1xuICogICAgIHRlbnNvcnMuIFRoaXMgdmFsdWUgc2hvdWxkIGVxdWFsIGluZGljZXMuc2hhcGUubmRpbXMgKyBwYXJhbXMucmFnZ2VkUmFua1xuICogICAgIC0gMS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBvdXRwdXROZXN0ZWRTcGxpdHM6IEEgbGlzdCBvZiBvdXRwdXRSYWdnZWRSYW5rIFRlbnNvciBvYmplY3RzIHdpdGggdGhlXG4gKiBzYW1lIHR5cGUgYXMgcGFyYW1zTmVzdGVkU3BsaXRzLlxuICogICAgIC0gb3V0cHV0RGVuc2VWYWx1ZXM6IEEgVGVuc29yLiBIYXMgdGhlIHNhbWUgdHlwZSBhcyBwYXJhbXNEZW5zZVZhbHVlcy5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JhZ2dlZCd9XG4gKi9cblxuaW50ZXJmYWNlIFJhZ2dlZEdhdGhlck1hcCB7XG4gIG91dHB1dE5lc3RlZFNwbGl0czogVGVuc29yW107XG4gIG91dHB1dERlbnNlVmFsdWVzOiBUZW5zb3I7XG59XG5cbmZ1bmN0aW9uIHJhZ2dlZEdhdGhlcl8oXG4gICAgcGFyYW1zTmVzdGVkU3BsaXRzOiBUZW5zb3JbXSwgcGFyYW1zRGVuc2VWYWx1ZXM6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIGluZGljZXM6IFRlbnNvcnxUZW5zb3JMaWtlLCBvdXRwdXRSYWdnZWRSYW5rOiBudW1iZXIpOiBSYWdnZWRHYXRoZXJNYXAge1xuICBjb25zdCAkcGFyYW1zTmVzdGVkU3BsaXRzID0gcGFyYW1zTmVzdGVkU3BsaXRzLm1hcChcbiAgICAgICh0LCBpKSA9PiBjb252ZXJ0VG9UZW5zb3IodCwgYHRlbnNvcnMke2l9YCwgJ3JhZ2dlZEdhdGhlcicsICdpbnQzMicpKTtcbiAgY29uc3QgJHBhcmFtc0RlbnNlVmFsdWVzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihwYXJhbXNEZW5zZVZhbHVlcywgJ3BhcmFtc0RlbnNlVmFsdWVzJywgJ3JhZ2dlZEdhdGhlcicpO1xuICBjb25zdCAkaW5kaWNlcyA9IGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdyYWdnZWRHYXRoZXInLCAnaW50MzInKTtcblxuICBjb25zdCBpbnB1dHM6IFJhZ2dlZEdhdGhlcklucHV0cyA9IHtcbiAgICBwYXJhbXNOZXN0ZWRTcGxpdHM6ICRwYXJhbXNOZXN0ZWRTcGxpdHMsXG4gICAgcGFyYW1zRGVuc2VWYWx1ZXM6ICRwYXJhbXNEZW5zZVZhbHVlcyxcbiAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgfTtcbiAgY29uc3QgYXR0cnM6IFJhZ2dlZEdhdGhlckF0dHJzID0ge291dHB1dFJhZ2dlZFJhbmt9O1xuXG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPVxuICAgICAgRU5HSU5FLnJ1bktlcm5lbChSYWdnZWRHYXRoZXIsIGlucHV0cyBhcyB7fSwgYXR0cnMgYXMge30pO1xuICByZXR1cm4ge1xuICAgIG91dHB1dE5lc3RlZFNwbGl0czogcmVzdWx0LnNsaWNlKDAsIHJlc3VsdC5sZW5ndGggLSAxKSxcbiAgICBvdXRwdXREZW5zZVZhbHVlczogcmVzdWx0W3Jlc3VsdC5sZW5ndGggLSAxXSxcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHJhZ2dlZEdhdGhlciA9IG9wKHtyYWdnZWRHYXRoZXJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { RaggedTensorToTensor } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Create a dense tensor from a ragged tensor, possibly altering its shape.\n *\n * The raggedTensorToTensor op creates a dense tensor from am array of row\n * partition tensors, a value vector, and default values. If the shape is\n * unspecified, the minimal shape required to contain all the elements in the\n * ragged tensor (the natural shape) will be used. If some dimensions are left\n * unspecified, then the size of the natural shape is used in that dimension.\n *\n * The defaultValue will be broadcast to the output shape. After that, the\n * values from the ragged tensor overwrite the default values. Note that the\n * defaultValue must have less dimensions than the value.\n *\n * The row partition tensors are in the order of the dimensions. At present, the\n * types can be: \"ROW_SPLITS\": the row_splits tensor from the ragged tensor.\n *   \"VALUE_ROWIDS\": the value_rowids tensor from the ragged tensor.\n *   \"FIRST_DIM_SIZE\": if value_rowids is used for the first dimension, then it\n * is preceded by \"FIRST_DIM_SIZE\".\n * ```\n * @param shape: A Tensor. Must be one of the following types: 'int32'. The\n *     desired shape of the output tensor. If left unspecified (empty), the\n *     minimal shape required to contain all the elements in the ragged tensor\n *     (the natural shape) will be used. If some dimensions are left\n *     unspecified, then the size of the natural shape is used in that\n *     dimension.\n *\n *     Note that dense dimensions cannot be modified by the shape argument.\n *     Trying to change the size of a dense dimension will cause the op to fail.\n *     Examples: natural shape: [4, 5, 6] shape: -1 output shape: [4, 5, 6]\n *\n *     natural shape: [4, 5, 6] shape: [3, -1, 2] output shape: [3, 5, 2]\n *\n *     natural shape: [4, 5, 6] shape: [3, 7, 2] output shape: [3, 7, 2]\n * @param values: A Tensor. A 1D tensor representing the values of the ragged\n *     tensor.\n * @param defaultValue: A Tensor. Must have the same type as values. The\n *     defaultValue when the shape is larger than the ragged tensor. The\n *     defaultValue is broadcast until it is the shape of the output tensor,\n *     and then overwritten by values in the ragged tensor. The default value\n *     must be compatible with this broadcast operation, and must have fewer\n *     dimensions than the value tensor.\n * @param rowPartitionTensors: A list of at least 1 Tensor objects with the same\n *     type in: 'int32'.\n * @param rowPartitionTypes: A list of strings. The types of the row partition\n *     tensors. At present, these can be:\n *     \"ROW_SPLITS\": the row_splits tensor from the ragged tensor.\n *     \"VALUE_ROWIDS\": the value_rowids tensor from the ragged tensor.\n *     \"FIRST_DIM_SIZE\": if value_rowids is used for the first dimension, then\n *         it is preceeded by \"FIRST_DIM_SIZE\". The tensors are in the order of\n *         the dimensions.\n * @return A Tensor. Has the same type as values.\n * @doc {heading: 'Operations', subheading: 'Ragged'}\n */\nfunction raggedTensorToTensor_(shape, values, defaultValue, rowPartitionTensors, rowPartitionTypes) {\n    const $shape = convertToTensor(shape, 'shape', 'raggedTensorToTensor', 'int32');\n    const $values = convertToTensor(values, 'values', 'raggedTensorToTensor');\n    const $defaultValue = convertToTensor(defaultValue, 'defaultValue', 'raggedTensorToTensor', $values.dtype);\n    const $rowPartitionTensors = rowPartitionTensors.map((t, i) => convertToTensor(t, `tensors${i}`, 'raggedTensorToTensor', 'int32'));\n    const inputs = {\n        shape: $shape,\n        values: $values,\n        defaultValue: $defaultValue,\n        rowPartitionTensors: $rowPartitionTensors\n    };\n    const attrs = { rowPartitionTypes };\n    return ENGINE.runKernel(RaggedTensorToTensor, inputs, attrs);\n}\nexport const raggedTensorToTensor = op({ raggedTensorToTensor_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFnZ2VkX3RlbnNvcl90b190ZW5zb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yYWdnZWRfdGVuc29yX3RvX3RlbnNvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBd0QsTUFBTSxpQkFBaUIsQ0FBQztBQUU1RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9ERztBQUNILFNBQVMscUJBQXFCLENBQzFCLEtBQXdCLEVBQUUsTUFBeUIsRUFDbkQsWUFBK0IsRUFBRSxtQkFBNkIsRUFDOUQsaUJBQTJCO0lBQzdCLE1BQU0sTUFBTSxHQUNSLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDMUUsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUNqQyxZQUFZLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6RSxNQUFNLG9CQUFvQixHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FDaEQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDTCxlQUFlLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxFQUFFLEVBQUUsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUU1RSxNQUFNLE1BQU0sR0FBK0I7UUFDekMsS0FBSyxFQUFFLE1BQU07UUFDYixNQUFNLEVBQUUsT0FBTztRQUNmLFlBQVksRUFBRSxhQUFhO1FBQzNCLG1CQUFtQixFQUFFLG9CQUFvQjtLQUMxQyxDQUFDO0lBQ0YsTUFBTSxLQUFLLEdBQThCLEVBQUMsaUJBQWlCLEVBQUMsQ0FBQztJQUU3RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsb0JBQW9CLEVBQUUsTUFBWSxFQUFFLEtBQVcsQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBRyxFQUFFLENBQUMsRUFBQyxxQkFBcUIsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtSYWdnZWRUZW5zb3JUb1RlbnNvciwgUmFnZ2VkVGVuc29yVG9UZW5zb3JBdHRycywgUmFnZ2VkVGVuc29yVG9UZW5zb3JJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ3JlYXRlIGEgZGVuc2UgdGVuc29yIGZyb20gYSByYWdnZWQgdGVuc29yLCBwb3NzaWJseSBhbHRlcmluZyBpdHMgc2hhcGUuXG4gKlxuICogVGhlIHJhZ2dlZFRlbnNvclRvVGVuc29yIG9wIGNyZWF0ZXMgYSBkZW5zZSB0ZW5zb3IgZnJvbSBhbSBhcnJheSBvZiByb3dcbiAqIHBhcnRpdGlvbiB0ZW5zb3JzLCBhIHZhbHVlIHZlY3RvciwgYW5kIGRlZmF1bHQgdmFsdWVzLiBJZiB0aGUgc2hhcGUgaXNcbiAqIHVuc3BlY2lmaWVkLCB0aGUgbWluaW1hbCBzaGFwZSByZXF1aXJlZCB0byBjb250YWluIGFsbCB0aGUgZWxlbWVudHMgaW4gdGhlXG4gKiByYWdnZWQgdGVuc29yICh0aGUgbmF0dXJhbCBzaGFwZSkgd2lsbCBiZSB1c2VkLiBJZiBzb21lIGRpbWVuc2lvbnMgYXJlIGxlZnRcbiAqIHVuc3BlY2lmaWVkLCB0aGVuIHRoZSBzaXplIG9mIHRoZSBuYXR1cmFsIHNoYXBlIGlzIHVzZWQgaW4gdGhhdCBkaW1lbnNpb24uXG4gKlxuICogVGhlIGRlZmF1bHRWYWx1ZSB3aWxsIGJlIGJyb2FkY2FzdCB0byB0aGUgb3V0cHV0IHNoYXBlLiBBZnRlciB0aGF0LCB0aGVcbiAqIHZhbHVlcyBmcm9tIHRoZSByYWdnZWQgdGVuc29yIG92ZXJ3cml0ZSB0aGUgZGVmYXVsdCB2YWx1ZXMuIE5vdGUgdGhhdCB0aGVcbiAqIGRlZmF1bHRWYWx1ZSBtdXN0IGhhdmUgbGVzcyBkaW1lbnNpb25zIHRoYW4gdGhlIHZhbHVlLlxuICpcbiAqIFRoZSByb3cgcGFydGl0aW9uIHRlbnNvcnMgYXJlIGluIHRoZSBvcmRlciBvZiB0aGUgZGltZW5zaW9ucy4gQXQgcHJlc2VudCwgdGhlXG4gKiB0eXBlcyBjYW4gYmU6IFwiUk9XX1NQTElUU1wiOiB0aGUgcm93X3NwbGl0cyB0ZW5zb3IgZnJvbSB0aGUgcmFnZ2VkIHRlbnNvci5cbiAqICAgXCJWQUxVRV9ST1dJRFNcIjogdGhlIHZhbHVlX3Jvd2lkcyB0ZW5zb3IgZnJvbSB0aGUgcmFnZ2VkIHRlbnNvci5cbiAqICAgXCJGSVJTVF9ESU1fU0laRVwiOiBpZiB2YWx1ZV9yb3dpZHMgaXMgdXNlZCBmb3IgdGhlIGZpcnN0IGRpbWVuc2lvbiwgdGhlbiBpdFxuICogaXMgcHJlY2VkZWQgYnkgXCJGSVJTVF9ESU1fU0laRVwiLlxuICogYGBgXG4gKiBAcGFyYW0gc2hhcGU6IEEgVGVuc29yLiBNdXN0IGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR5cGVzOiAnaW50MzInLiBUaGVcbiAqICAgICBkZXNpcmVkIHNoYXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBJZiBsZWZ0IHVuc3BlY2lmaWVkIChlbXB0eSksIHRoZVxuICogICAgIG1pbmltYWwgc2hhcGUgcmVxdWlyZWQgdG8gY29udGFpbiBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSByYWdnZWQgdGVuc29yXG4gKiAgICAgKHRoZSBuYXR1cmFsIHNoYXBlKSB3aWxsIGJlIHVzZWQuIElmIHNvbWUgZGltZW5zaW9ucyBhcmUgbGVmdFxuICogICAgIHVuc3BlY2lmaWVkLCB0aGVuIHRoZSBzaXplIG9mIHRoZSBuYXR1cmFsIHNoYXBlIGlzIHVzZWQgaW4gdGhhdFxuICogICAgIGRpbWVuc2lvbi5cbiAqXG4gKiAgICAgTm90ZSB0aGF0IGRlbnNlIGRpbWVuc2lvbnMgY2Fubm90IGJlIG1vZGlmaWVkIGJ5IHRoZSBzaGFwZSBhcmd1bWVudC5cbiAqICAgICBUcnlpbmcgdG8gY2hhbmdlIHRoZSBzaXplIG9mIGEgZGVuc2UgZGltZW5zaW9uIHdpbGwgY2F1c2UgdGhlIG9wIHRvIGZhaWwuXG4gKiAgICAgRXhhbXBsZXM6IG5hdHVyYWwgc2hhcGU6IFs0LCA1LCA2XSBzaGFwZTogLTEgb3V0cHV0IHNoYXBlOiBbNCwgNSwgNl1cbiAqXG4gKiAgICAgbmF0dXJhbCBzaGFwZTogWzQsIDUsIDZdIHNoYXBlOiBbMywgLTEsIDJdIG91dHB1dCBzaGFwZTogWzMsIDUsIDJdXG4gKlxuICogICAgIG5hdHVyYWwgc2hhcGU6IFs0LCA1LCA2XSBzaGFwZTogWzMsIDcsIDJdIG91dHB1dCBzaGFwZTogWzMsIDcsIDJdXG4gKiBAcGFyYW0gdmFsdWVzOiBBIFRlbnNvci4gQSAxRCB0ZW5zb3IgcmVwcmVzZW50aW5nIHRoZSB2YWx1ZXMgb2YgdGhlIHJhZ2dlZFxuICogICAgIHRlbnNvci5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWU6IEEgVGVuc29yLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB2YWx1ZXMuIFRoZVxuICogICAgIGRlZmF1bHRWYWx1ZSB3aGVuIHRoZSBzaGFwZSBpcyBsYXJnZXIgdGhhbiB0aGUgcmFnZ2VkIHRlbnNvci4gVGhlXG4gKiAgICAgZGVmYXVsdFZhbHVlIGlzIGJyb2FkY2FzdCB1bnRpbCBpdCBpcyB0aGUgc2hhcGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IsXG4gKiAgICAgYW5kIHRoZW4gb3ZlcndyaXR0ZW4gYnkgdmFsdWVzIGluIHRoZSByYWdnZWQgdGVuc29yLiBUaGUgZGVmYXVsdCB2YWx1ZVxuICogICAgIG11c3QgYmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgYnJvYWRjYXN0IG9wZXJhdGlvbiwgYW5kIG11c3QgaGF2ZSBmZXdlclxuICogICAgIGRpbWVuc2lvbnMgdGhhbiB0aGUgdmFsdWUgdGVuc29yLlxuICogQHBhcmFtIHJvd1BhcnRpdGlvblRlbnNvcnM6IEEgbGlzdCBvZiBhdCBsZWFzdCAxIFRlbnNvciBvYmplY3RzIHdpdGggdGhlIHNhbWVcbiAqICAgICB0eXBlIGluOiAnaW50MzInLlxuICogQHBhcmFtIHJvd1BhcnRpdGlvblR5cGVzOiBBIGxpc3Qgb2Ygc3RyaW5ncy4gVGhlIHR5cGVzIG9mIHRoZSByb3cgcGFydGl0aW9uXG4gKiAgICAgdGVuc29ycy4gQXQgcHJlc2VudCwgdGhlc2UgY2FuIGJlOlxuICogICAgIFwiUk9XX1NQTElUU1wiOiB0aGUgcm93X3NwbGl0cyB0ZW5zb3IgZnJvbSB0aGUgcmFnZ2VkIHRlbnNvci5cbiAqICAgICBcIlZBTFVFX1JPV0lEU1wiOiB0aGUgdmFsdWVfcm93aWRzIHRlbnNvciBmcm9tIHRoZSByYWdnZWQgdGVuc29yLlxuICogICAgIFwiRklSU1RfRElNX1NJWkVcIjogaWYgdmFsdWVfcm93aWRzIGlzIHVzZWQgZm9yIHRoZSBmaXJzdCBkaW1lbnNpb24sIHRoZW5cbiAqICAgICAgICAgaXQgaXMgcHJlY2VlZGVkIGJ5IFwiRklSU1RfRElNX1NJWkVcIi4gVGhlIHRlbnNvcnMgYXJlIGluIHRoZSBvcmRlciBvZlxuICogICAgICAgICB0aGUgZGltZW5zaW9ucy5cbiAqIEByZXR1cm4gQSBUZW5zb3IuIEhhcyB0aGUgc2FtZSB0eXBlIGFzIHZhbHVlcy5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1JhZ2dlZCd9XG4gKi9cbmZ1bmN0aW9uIHJhZ2dlZFRlbnNvclRvVGVuc29yXyhcbiAgICBzaGFwZTogVGVuc29yfFRlbnNvckxpa2UsIHZhbHVlczogVGVuc29yfFRlbnNvckxpa2UsXG4gICAgZGVmYXVsdFZhbHVlOiBUZW5zb3J8VGVuc29yTGlrZSwgcm93UGFydGl0aW9uVGVuc29yczogVGVuc29yW10sXG4gICAgcm93UGFydGl0aW9uVHlwZXM6IHN0cmluZ1tdKTogVGVuc29yIHtcbiAgY29uc3QgJHNoYXBlID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihzaGFwZSwgJ3NoYXBlJywgJ3JhZ2dlZFRlbnNvclRvVGVuc29yJywgJ2ludDMyJyk7XG4gIGNvbnN0ICR2YWx1ZXMgPSBjb252ZXJ0VG9UZW5zb3IodmFsdWVzLCAndmFsdWVzJywgJ3JhZ2dlZFRlbnNvclRvVGVuc29yJyk7XG4gIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICBkZWZhdWx0VmFsdWUsICdkZWZhdWx0VmFsdWUnLCAncmFnZ2VkVGVuc29yVG9UZW5zb3InLCAkdmFsdWVzLmR0eXBlKTtcbiAgY29uc3QgJHJvd1BhcnRpdGlvblRlbnNvcnMgPSByb3dQYXJ0aXRpb25UZW5zb3JzLm1hcChcbiAgICAgICh0LCBpKSA9PlxuICAgICAgICAgIGNvbnZlcnRUb1RlbnNvcih0LCBgdGVuc29ycyR7aX1gLCAncmFnZ2VkVGVuc29yVG9UZW5zb3InLCAnaW50MzInKSk7XG5cbiAgY29uc3QgaW5wdXRzOiBSYWdnZWRUZW5zb3JUb1RlbnNvcklucHV0cyA9IHtcbiAgICBzaGFwZTogJHNoYXBlLFxuICAgIHZhbHVlczogJHZhbHVlcyxcbiAgICBkZWZhdWx0VmFsdWU6ICRkZWZhdWx0VmFsdWUsXG4gICAgcm93UGFydGl0aW9uVGVuc29yczogJHJvd1BhcnRpdGlvblRlbnNvcnNcbiAgfTtcbiAgY29uc3QgYXR0cnM6IFJhZ2dlZFRlbnNvclRvVGVuc29yQXR0cnMgPSB7cm93UGFydGl0aW9uVHlwZXN9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJhZ2dlZFRlbnNvclRvVGVuc29yLCBpbnB1dHMgYXMge30sIGF0dHJzIGFzIHt9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJhZ2dlZFRlbnNvclRvVGVuc29yID0gb3Aoe3JhZ2dlZFRlbnNvclRvVGVuc29yX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { sizeFromShape } from '../util';\nimport { op } from './operation';\n/**\n * Creates a `tf.Tensor` with values sampled from a random number generator\n * function defined by the user.\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param randFunction A random number generator function which is called\n * for each element in the output tensor.\n * @param dtype The data type of the output tensor. Defaults to 'float32'.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction rand_(shape, randFunction, dtype) {\n    const size = sizeFromShape(shape);\n    let values = null;\n    if (dtype == null || dtype === 'float32') {\n        values = new Float32Array(size);\n    }\n    else if (dtype === 'int32') {\n        values = new Int32Array(size);\n    }\n    else if (dtype === 'bool') {\n        values = new Uint8Array(size);\n    }\n    else {\n        throw new Error(`Unknown data type ${dtype}`);\n    }\n    for (let i = 0; i < size; i++) {\n        values[i] = randFunction();\n    }\n    return ENGINE.makeTensor(values, shape, dtype);\n}\nexport const rand = op({ rand_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JhbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdqQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsS0FBSyxDQUNWLEtBQWtCLEVBQUUsWUFBMEIsRUFDOUMsS0FBZ0I7SUFDbEIsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2xDLElBQUksTUFBTSxHQUFHLElBQUksQ0FBQztJQUNsQixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRTtRQUN4QyxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDakM7U0FBTSxJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDNUIsTUFBTSxHQUFHLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQy9CO1NBQU0sSUFBSSxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQzNCLE1BQU0sR0FBRyxJQUFJLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUMvQjtTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyxxQkFBcUIsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvQztJQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDN0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFlBQVksRUFBRSxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFjLENBQUM7QUFDOUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtEYXRhVHlwZSwgUmFuaywgU2hhcGVNYXB9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7c2l6ZUZyb21TaGFwZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB2YWx1ZXMgc2FtcGxlZCBmcm9tIGEgcmFuZG9tIG51bWJlciBnZW5lcmF0b3JcbiAqIGZ1bmN0aW9uIGRlZmluZWQgYnkgdGhlIHVzZXIuXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIHJhbmRGdW5jdGlvbiBBIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZFxuICogZm9yIGVhY2ggZWxlbWVudCBpbiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnUmFuZG9tJ31cbiAqL1xuZnVuY3Rpb24gcmFuZF88UiBleHRlbmRzIFJhbms+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgcmFuZEZ1bmN0aW9uOiAoKSA9PiBudW1iZXIsXG4gICAgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvcjxSPiB7XG4gIGNvbnN0IHNpemUgPSBzaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgbGV0IHZhbHVlcyA9IG51bGw7XG4gIGlmIChkdHlwZSA9PSBudWxsIHx8IGR0eXBlID09PSAnZmxvYXQzMicpIHtcbiAgICB2YWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHNpemUpO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgdmFsdWVzID0gbmV3IEludDMyQXJyYXkoc2l6ZSk7XG4gIH0gZWxzZSBpZiAoZHR5cGUgPT09ICdib29sJykge1xuICAgIHZhbHVlcyA9IG5ldyBVaW50OEFycmF5KHNpemUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkYXRhIHR5cGUgJHtkdHlwZX1gKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IHNpemU7IGkrKykge1xuICAgIHZhbHVlc1tpXSA9IHJhbmRGdW5jdGlvbigpO1xuICB9XG4gIHJldHVybiBFTkdJTkUubWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBkdHlwZSkgYXMgVGVuc29yPFI+O1xufVxuXG5leHBvcnQgY29uc3QgcmFuZCA9IG9wKHtyYW5kX30pO1xuIl19","// A port of an algorithm by Johannes Baagøe <baagoe@baagoe.com>, 2010\n// http://baagoe.com/en/RandomMusings/javascript/\n// https://github.com/nquinlan/better-random-numbers-for-javascript-mirror\n// Original work is under MIT license -\n\n// Copyright (C) 2010 by Johannes Baagøe <baagoe@baagoe.org>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the \"Software\"), to deal\n// in the Software without restriction, including without limitation the rights\n// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n// copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n// THE SOFTWARE.\n\n\n\n(function(global, module, define) {\n\nfunction Alea(seed) {\n  var me = this, mash = Mash();\n\n  me.next = function() {\n    var t = 2091639 * me.s0 + me.c * 2.3283064365386963e-10; // 2^-32\n    me.s0 = me.s1;\n    me.s1 = me.s2;\n    return me.s2 = t - (me.c = t | 0);\n  };\n\n  // Apply the seeding algorithm from Baagoe.\n  me.c = 1;\n  me.s0 = mash(' ');\n  me.s1 = mash(' ');\n  me.s2 = mash(' ');\n  me.s0 -= mash(seed);\n  if (me.s0 < 0) { me.s0 += 1; }\n  me.s1 -= mash(seed);\n  if (me.s1 < 0) { me.s1 += 1; }\n  me.s2 -= mash(seed);\n  if (me.s2 < 0) { me.s2 += 1; }\n  mash = null;\n}\n\nfunction copy(f, t) {\n  t.c = f.c;\n  t.s0 = f.s0;\n  t.s1 = f.s1;\n  t.s2 = f.s2;\n  return t;\n}\n\nfunction impl(seed, opts) {\n  var xg = new Alea(seed),\n      state = opts && opts.state,\n      prng = xg.next;\n  prng.int32 = function() { return (xg.next() * 0x100000000) | 0; }\n  prng.double = function() {\n    return prng() + (prng() * 0x200000 | 0) * 1.1102230246251565e-16; // 2^-53\n  };\n  prng.quick = prng;\n  if (state) {\n    if (typeof(state) == 'object') copy(state, xg);\n    prng.state = function() { return copy(xg, {}); }\n  }\n  return prng;\n}\n\nfunction Mash() {\n  var n = 0xefc8249d;\n\n  var mash = function(data) {\n    data = String(data);\n    for (var i = 0; i < data.length; i++) {\n      n += data.charCodeAt(i);\n      var h = 0.02519603282416938 * n;\n      n = h >>> 0;\n      h -= n;\n      h *= n;\n      n = h >>> 0;\n      h -= n;\n      n += h * 0x100000000; // 2^32\n    }\n    return (n >>> 0) * 2.3283064365386963e-10; // 2^-32\n  };\n\n  return mash;\n}\n\n\nif (module && module.exports) {\n  module.exports = impl;\n} else if (define && define.amd) {\n  define(function() { return impl; });\n} else {\n  this.alea = impl;\n}\n\n})(\n  this,\n  (typeof module) == 'object' && module,    // present in node.js\n  (typeof define) == 'function' && define   // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of the \"xor128\" prng algorithm by\n// George Marsaglia.  See http://www.jstatsoft.org/v08/i14/paper\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n  var me = this, strseed = '';\n\n  me.x = 0;\n  me.y = 0;\n  me.z = 0;\n  me.w = 0;\n\n  // Set up generator function.\n  me.next = function() {\n    var t = me.x ^ (me.x << 11);\n    me.x = me.y;\n    me.y = me.z;\n    me.z = me.w;\n    return me.w ^= (me.w >>> 19) ^ t ^ (t >>> 8);\n  };\n\n  if (seed === (seed | 0)) {\n    // Integer seed.\n    me.x = seed;\n  } else {\n    // String seed.\n    strseed += seed;\n  }\n\n  // Mix in string seed, then discard an initial batch of 64 values.\n  for (var k = 0; k < strseed.length + 64; k++) {\n    me.x ^= strseed.charCodeAt(k) | 0;\n    me.next();\n  }\n}\n\nfunction copy(f, t) {\n  t.x = f.x;\n  t.y = f.y;\n  t.z = f.z;\n  t.w = f.w;\n  return t;\n}\n\nfunction impl(seed, opts) {\n  var xg = new XorGen(seed),\n      state = opts && opts.state,\n      prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n  prng.double = function() {\n    do {\n      var top = xg.next() >>> 11,\n          bot = (xg.next() >>> 0) / 0x100000000,\n          result = (top + bot) / (1 << 21);\n    } while (result === 0);\n    return result;\n  };\n  prng.int32 = xg.next;\n  prng.quick = prng;\n  if (state) {\n    if (typeof(state) == 'object') copy(state, xg);\n    prng.state = function() { return copy(xg, {}); }\n  }\n  return prng;\n}\n\nif (module && module.exports) {\n  module.exports = impl;\n} else if (define && define.amd) {\n  define(function() { return impl; });\n} else {\n  this.xor128 = impl;\n}\n\n})(\n  this,\n  (typeof module) == 'object' && module,    // present in node.js\n  (typeof define) == 'function' && define   // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of the \"xorwow\" prng algorithm by\n// George Marsaglia.  See http://www.jstatsoft.org/v08/i14/paper\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n  var me = this, strseed = '';\n\n  // Set up generator function.\n  me.next = function() {\n    var t = (me.x ^ (me.x >>> 2));\n    me.x = me.y; me.y = me.z; me.z = me.w; me.w = me.v;\n    return (me.d = (me.d + 362437 | 0)) +\n       (me.v = (me.v ^ (me.v << 4)) ^ (t ^ (t << 1))) | 0;\n  };\n\n  me.x = 0;\n  me.y = 0;\n  me.z = 0;\n  me.w = 0;\n  me.v = 0;\n\n  if (seed === (seed | 0)) {\n    // Integer seed.\n    me.x = seed;\n  } else {\n    // String seed.\n    strseed += seed;\n  }\n\n  // Mix in string seed, then discard an initial batch of 64 values.\n  for (var k = 0; k < strseed.length + 64; k++) {\n    me.x ^= strseed.charCodeAt(k) | 0;\n    if (k == strseed.length) {\n      me.d = me.x << 10 ^ me.x >>> 4;\n    }\n    me.next();\n  }\n}\n\nfunction copy(f, t) {\n  t.x = f.x;\n  t.y = f.y;\n  t.z = f.z;\n  t.w = f.w;\n  t.v = f.v;\n  t.d = f.d;\n  return t;\n}\n\nfunction impl(seed, opts) {\n  var xg = new XorGen(seed),\n      state = opts && opts.state,\n      prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n  prng.double = function() {\n    do {\n      var top = xg.next() >>> 11,\n          bot = (xg.next() >>> 0) / 0x100000000,\n          result = (top + bot) / (1 << 21);\n    } while (result === 0);\n    return result;\n  };\n  prng.int32 = xg.next;\n  prng.quick = prng;\n  if (state) {\n    if (typeof(state) == 'object') copy(state, xg);\n    prng.state = function() { return copy(xg, {}); }\n  }\n  return prng;\n}\n\nif (module && module.exports) {\n  module.exports = impl;\n} else if (define && define.amd) {\n  define(function() { return impl; });\n} else {\n  this.xorwow = impl;\n}\n\n})(\n  this,\n  (typeof module) == 'object' && module,    // present in node.js\n  (typeof define) == 'function' && define   // present with an AMD loader\n);\n\n\n","// A Javascript implementaion of the \"xorshift7\" algorithm by\n// François Panneton and Pierre L'ecuyer:\n// \"On the Xorgshift Random Number Generators\"\n// http://saluc.engr.uconn.edu/refs/crypto/rng/panneton05onthexorshift.pdf\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n  var me = this;\n\n  // Set up generator function.\n  me.next = function() {\n    // Update xor generator.\n    var X = me.x, i = me.i, t, v, w;\n    t = X[i]; t ^= (t >>> 7); v = t ^ (t << 24);\n    t = X[(i + 1) & 7]; v ^= t ^ (t >>> 10);\n    t = X[(i + 3) & 7]; v ^= t ^ (t >>> 3);\n    t = X[(i + 4) & 7]; v ^= t ^ (t << 7);\n    t = X[(i + 7) & 7]; t = t ^ (t << 13); v ^= t ^ (t << 9);\n    X[i] = v;\n    me.i = (i + 1) & 7;\n    return v;\n  };\n\n  function init(me, seed) {\n    var j, w, X = [];\n\n    if (seed === (seed | 0)) {\n      // Seed state array using a 32-bit integer.\n      w = X[0] = seed;\n    } else {\n      // Seed state using a string.\n      seed = '' + seed;\n      for (j = 0; j < seed.length; ++j) {\n        X[j & 7] = (X[j & 7] << 15) ^\n            (seed.charCodeAt(j) + X[(j + 1) & 7] << 13);\n      }\n    }\n    // Enforce an array length of 8, not all zeroes.\n    while (X.length < 8) X.push(0);\n    for (j = 0; j < 8 && X[j] === 0; ++j);\n    if (j == 8) w = X[7] = -1; else w = X[j];\n\n    me.x = X;\n    me.i = 0;\n\n    // Discard an initial 256 values.\n    for (j = 256; j > 0; --j) {\n      me.next();\n    }\n  }\n\n  init(me, seed);\n}\n\nfunction copy(f, t) {\n  t.x = f.x.slice();\n  t.i = f.i;\n  return t;\n}\n\nfunction impl(seed, opts) {\n  if (seed == null) seed = +(new Date);\n  var xg = new XorGen(seed),\n      state = opts && opts.state,\n      prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n  prng.double = function() {\n    do {\n      var top = xg.next() >>> 11,\n          bot = (xg.next() >>> 0) / 0x100000000,\n          result = (top + bot) / (1 << 21);\n    } while (result === 0);\n    return result;\n  };\n  prng.int32 = xg.next;\n  prng.quick = prng;\n  if (state) {\n    if (state.x) copy(state, xg);\n    prng.state = function() { return copy(xg, {}); }\n  }\n  return prng;\n}\n\nif (module && module.exports) {\n  module.exports = impl;\n} else if (define && define.amd) {\n  define(function() { return impl; });\n} else {\n  this.xorshift7 = impl;\n}\n\n})(\n  this,\n  (typeof module) == 'object' && module,    // present in node.js\n  (typeof define) == 'function' && define   // present with an AMD loader\n);\n\n","// A Javascript implementaion of Richard Brent's Xorgens xor4096 algorithm.\n//\n// This fast non-cryptographic random number generator is designed for\n// use in Monte-Carlo algorithms. It combines a long-period xorshift\n// generator with a Weyl generator, and it passes all common batteries\n// of stasticial tests for randomness while consuming only a few nanoseconds\n// for each prng generated.  For background on the generator, see Brent's\n// paper: \"Some long-period random number generators using shifts and xors.\"\n// http://arxiv.org/pdf/1004.3115v1.pdf\n//\n// Usage:\n//\n// var xor4096 = require('xor4096');\n// random = xor4096(1);                        // Seed with int32 or string.\n// assert.equal(random(), 0.1520436450538547); // (0, 1) range, 53 bits.\n// assert.equal(random.int32(), 1806534897);   // signed int32, 32 bits.\n//\n// For nonzero numeric keys, this impelementation provides a sequence\n// identical to that by Brent's xorgens 3 implementaion in C.  This\n// implementation also provides for initalizing the generator with\n// string seeds, or for saving and restoring the state of the generator.\n//\n// On Chrome, this prng benchmarks about 2.1 times slower than\n// Javascript's built-in Math.random().\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n  var me = this;\n\n  // Set up generator function.\n  me.next = function() {\n    var w = me.w,\n        X = me.X, i = me.i, t, v;\n    // Update Weyl generator.\n    me.w = w = (w + 0x61c88647) | 0;\n    // Update xor generator.\n    v = X[(i + 34) & 127];\n    t = X[i = ((i + 1) & 127)];\n    v ^= v << 13;\n    t ^= t << 17;\n    v ^= v >>> 15;\n    t ^= t >>> 12;\n    // Update Xor generator array state.\n    v = X[i] = v ^ t;\n    me.i = i;\n    // Result is the combination.\n    return (v + (w ^ (w >>> 16))) | 0;\n  };\n\n  function init(me, seed) {\n    var t, v, i, j, w, X = [], limit = 128;\n    if (seed === (seed | 0)) {\n      // Numeric seeds initialize v, which is used to generates X.\n      v = seed;\n      seed = null;\n    } else {\n      // String seeds are mixed into v and X one character at a time.\n      seed = seed + '\\0';\n      v = 0;\n      limit = Math.max(limit, seed.length);\n    }\n    // Initialize circular array and weyl value.\n    for (i = 0, j = -32; j < limit; ++j) {\n      // Put the unicode characters into the array, and shuffle them.\n      if (seed) v ^= seed.charCodeAt((j + 32) % seed.length);\n      // After 32 shuffles, take v as the starting w value.\n      if (j === 0) w = v;\n      v ^= v << 10;\n      v ^= v >>> 15;\n      v ^= v << 4;\n      v ^= v >>> 13;\n      if (j >= 0) {\n        w = (w + 0x61c88647) | 0;     // Weyl.\n        t = (X[j & 127] ^= (v + w));  // Combine xor and weyl to init array.\n        i = (0 == t) ? i + 1 : 0;     // Count zeroes.\n      }\n    }\n    // We have detected all zeroes; make the key nonzero.\n    if (i >= 128) {\n      X[(seed && seed.length || 0) & 127] = -1;\n    }\n    // Run the generator 512 times to further mix the state before using it.\n    // Factoring this as a function slows the main generator, so it is just\n    // unrolled here.  The weyl generator is not advanced while warming up.\n    i = 127;\n    for (j = 4 * 128; j > 0; --j) {\n      v = X[(i + 34) & 127];\n      t = X[i = ((i + 1) & 127)];\n      v ^= v << 13;\n      t ^= t << 17;\n      v ^= v >>> 15;\n      t ^= t >>> 12;\n      X[i] = v ^ t;\n    }\n    // Storing state as object members is faster than using closure variables.\n    me.w = w;\n    me.X = X;\n    me.i = i;\n  }\n\n  init(me, seed);\n}\n\nfunction copy(f, t) {\n  t.i = f.i;\n  t.w = f.w;\n  t.X = f.X.slice();\n  return t;\n};\n\nfunction impl(seed, opts) {\n  if (seed == null) seed = +(new Date);\n  var xg = new XorGen(seed),\n      state = opts && opts.state,\n      prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n  prng.double = function() {\n    do {\n      var top = xg.next() >>> 11,\n          bot = (xg.next() >>> 0) / 0x100000000,\n          result = (top + bot) / (1 << 21);\n    } while (result === 0);\n    return result;\n  };\n  prng.int32 = xg.next;\n  prng.quick = prng;\n  if (state) {\n    if (state.X) copy(state, xg);\n    prng.state = function() { return copy(xg, {}); }\n  }\n  return prng;\n}\n\nif (module && module.exports) {\n  module.exports = impl;\n} else if (define && define.amd) {\n  define(function() { return impl; });\n} else {\n  this.xor4096 = impl;\n}\n\n})(\n  this,                                     // window object or global\n  (typeof module) == 'object' && module,    // present in node.js\n  (typeof define) == 'function' && define   // present with an AMD loader\n);\n","// A Javascript implementaion of the \"Tyche-i\" prng algorithm by\n// Samuel Neves and Filipe Araujo.\n// See https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n\n(function(global, module, define) {\n\nfunction XorGen(seed) {\n  var me = this, strseed = '';\n\n  // Set up generator function.\n  me.next = function() {\n    var b = me.b, c = me.c, d = me.d, a = me.a;\n    b = (b << 25) ^ (b >>> 7) ^ c;\n    c = (c - d) | 0;\n    d = (d << 24) ^ (d >>> 8) ^ a;\n    a = (a - b) | 0;\n    me.b = b = (b << 20) ^ (b >>> 12) ^ c;\n    me.c = c = (c - d) | 0;\n    me.d = (d << 16) ^ (c >>> 16) ^ a;\n    return me.a = (a - b) | 0;\n  };\n\n  /* The following is non-inverted tyche, which has better internal\n   * bit diffusion, but which is about 25% slower than tyche-i in JS.\n  me.next = function() {\n    var a = me.a, b = me.b, c = me.c, d = me.d;\n    a = (me.a + me.b | 0) >>> 0;\n    d = me.d ^ a; d = d << 16 ^ d >>> 16;\n    c = me.c + d | 0;\n    b = me.b ^ c; b = b << 12 ^ d >>> 20;\n    me.a = a = a + b | 0;\n    d = d ^ a; me.d = d = d << 8 ^ d >>> 24;\n    me.c = c = c + d | 0;\n    b = b ^ c;\n    return me.b = (b << 7 ^ b >>> 25);\n  }\n  */\n\n  me.a = 0;\n  me.b = 0;\n  me.c = 2654435769 | 0;\n  me.d = 1367130551;\n\n  if (seed === Math.floor(seed)) {\n    // Integer seed.\n    me.a = (seed / 0x100000000) | 0;\n    me.b = seed | 0;\n  } else {\n    // String seed.\n    strseed += seed;\n  }\n\n  // Mix in string seed, then discard an initial batch of 64 values.\n  for (var k = 0; k < strseed.length + 20; k++) {\n    me.b ^= strseed.charCodeAt(k) | 0;\n    me.next();\n  }\n}\n\nfunction copy(f, t) {\n  t.a = f.a;\n  t.b = f.b;\n  t.c = f.c;\n  t.d = f.d;\n  return t;\n};\n\nfunction impl(seed, opts) {\n  var xg = new XorGen(seed),\n      state = opts && opts.state,\n      prng = function() { return (xg.next() >>> 0) / 0x100000000; };\n  prng.double = function() {\n    do {\n      var top = xg.next() >>> 11,\n          bot = (xg.next() >>> 0) / 0x100000000,\n          result = (top + bot) / (1 << 21);\n    } while (result === 0);\n    return result;\n  };\n  prng.int32 = xg.next;\n  prng.quick = prng;\n  if (state) {\n    if (typeof(state) == 'object') copy(state, xg);\n    prng.state = function() { return copy(xg, {}); }\n  }\n  return prng;\n}\n\nif (module && module.exports) {\n  module.exports = impl;\n} else if (define && define.amd) {\n  define(function() { return impl; });\n} else {\n  this.tychei = impl;\n}\n\n})(\n  this,\n  (typeof module) == 'object' && module,    // present in node.js\n  (typeof define) == 'function' && define   // present with an AMD loader\n);\n\n\n","export default {}","/*\nCopyright 2019 David Bau.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be\nincluded in all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND,\nEXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n*/\n\n(function (global, pool, math) {\n//\n// The following constants are related to IEEE 754 limits.\n//\n\nvar width = 256,        // each RC4 output is 0 <= x < 256\n    chunks = 6,         // at least six RC4 outputs for each double\n    digits = 52,        // there are 52 significant digits in a double\n    rngname = 'random', // rngname: name for Math.random and Math.seedrandom\n    startdenom = math.pow(width, chunks),\n    significance = math.pow(2, digits),\n    overflow = significance * 2,\n    mask = width - 1,\n    nodecrypto;         // node.js crypto module, initialized at the bottom.\n\n//\n// seedrandom()\n// This is the seedrandom function described above.\n//\nfunction seedrandom(seed, options, callback) {\n  var key = [];\n  options = (options == true) ? { entropy: true } : (options || {});\n\n  // Flatten the seed string or build one from local entropy if needed.\n  var shortseed = mixkey(flatten(\n    options.entropy ? [seed, tostring(pool)] :\n    (seed == null) ? autoseed() : seed, 3), key);\n\n  // Use the seed to initialize an ARC4 generator.\n  var arc4 = new ARC4(key);\n\n  // This function returns a random double in [0, 1) that contains\n  // randomness in every bit of the mantissa of the IEEE 754 value.\n  var prng = function() {\n    var n = arc4.g(chunks),             // Start with a numerator n < 2 ^ 48\n        d = startdenom,                 //   and denominator d = 2 ^ 48.\n        x = 0;                          //   and no 'extra last byte'.\n    while (n < significance) {          // Fill up all significant digits by\n      n = (n + x) * width;              //   shifting numerator and\n      d *= width;                       //   denominator and generating a\n      x = arc4.g(1);                    //   new least-significant-byte.\n    }\n    while (n >= overflow) {             // To avoid rounding up, before adding\n      n /= 2;                           //   last byte, shift everything\n      d /= 2;                           //   right using integer math until\n      x >>>= 1;                         //   we have exactly the desired bits.\n    }\n    return (n + x) / d;                 // Form the number within [0, 1).\n  };\n\n  prng.int32 = function() { return arc4.g(4) | 0; }\n  prng.quick = function() { return arc4.g(4) / 0x100000000; }\n  prng.double = prng;\n\n  // Mix the randomness into accumulated entropy.\n  mixkey(tostring(arc4.S), pool);\n\n  // Calling convention: what to return as a function of prng, seed, is_math.\n  return (options.pass || callback ||\n      function(prng, seed, is_math_call, state) {\n        if (state) {\n          // Load the arc4 state from the given state if it has an S array.\n          if (state.S) { copy(state, arc4); }\n          // Only provide the .state method if requested via options.state.\n          prng.state = function() { return copy(arc4, {}); }\n        }\n\n        // If called as a method of Math (Math.seedrandom()), mutate\n        // Math.random because that is how seedrandom.js has worked since v1.0.\n        if (is_math_call) { math[rngname] = prng; return seed; }\n\n        // Otherwise, it is a newer calling convention, so return the\n        // prng directly.\n        else return prng;\n      })(\n  prng,\n  shortseed,\n  'global' in options ? options.global : (this == math),\n  options.state);\n}\n\n//\n// ARC4\n//\n// An ARC4 implementation.  The constructor takes a key in the form of\n// an array of at most (width) integers that should be 0 <= x < (width).\n//\n// The g(count) method returns a pseudorandom integer that concatenates\n// the next (count) outputs from ARC4.  Its return value is a number x\n// that is in the range 0 <= x < (width ^ count).\n//\nfunction ARC4(key) {\n  var t, keylen = key.length,\n      me = this, i = 0, j = me.i = me.j = 0, s = me.S = [];\n\n  // The empty key [] is treated as [0].\n  if (!keylen) { key = [keylen++]; }\n\n  // Set up S using the standard key scheduling algorithm.\n  while (i < width) {\n    s[i] = i++;\n  }\n  for (i = 0; i < width; i++) {\n    s[i] = s[j = mask & (j + key[i % keylen] + (t = s[i]))];\n    s[j] = t;\n  }\n\n  // The \"g\" method returns the next (count) outputs as one number.\n  (me.g = function(count) {\n    // Using instance members instead of closure state nearly doubles speed.\n    var t, r = 0,\n        i = me.i, j = me.j, s = me.S;\n    while (count--) {\n      t = s[i = mask & (i + 1)];\n      r = r * width + s[mask & ((s[i] = s[j = mask & (j + t)]) + (s[j] = t))];\n    }\n    me.i = i; me.j = j;\n    return r;\n    // For robust unpredictability, the function call below automatically\n    // discards an initial batch of values.  This is called RC4-drop[256].\n    // See http://google.com/search?q=rsa+fluhrer+response&btnI\n  })(width);\n}\n\n//\n// copy()\n// Copies internal state of ARC4 to or from a plain object.\n//\nfunction copy(f, t) {\n  t.i = f.i;\n  t.j = f.j;\n  t.S = f.S.slice();\n  return t;\n};\n\n//\n// flatten()\n// Converts an object tree to nested arrays of strings.\n//\nfunction flatten(obj, depth) {\n  var result = [], typ = (typeof obj), prop;\n  if (depth && typ == 'object') {\n    for (prop in obj) {\n      try { result.push(flatten(obj[prop], depth - 1)); } catch (e) {}\n    }\n  }\n  return (result.length ? result : typ == 'string' ? obj : obj + '\\0');\n}\n\n//\n// mixkey()\n// Mixes a string seed into a key that is an array of integers, and\n// returns a shortened string seed that is equivalent to the result key.\n//\nfunction mixkey(seed, key) {\n  var stringseed = seed + '', smear, j = 0;\n  while (j < stringseed.length) {\n    key[mask & j] =\n      mask & ((smear ^= key[mask & j] * 19) + stringseed.charCodeAt(j++));\n  }\n  return tostring(key);\n}\n\n//\n// autoseed()\n// Returns an object for autoseeding, using window.crypto and Node crypto\n// module if available.\n//\nfunction autoseed() {\n  try {\n    var out;\n    if (nodecrypto && (out = nodecrypto.randomBytes)) {\n      // The use of 'out' to remember randomBytes makes tight minified code.\n      out = out(width);\n    } else {\n      out = new Uint8Array(width);\n      (global.crypto || global.msCrypto).getRandomValues(out);\n    }\n    return tostring(out);\n  } catch (e) {\n    var browser = global.navigator,\n        plugins = browser && browser.plugins;\n    return [+new Date, global, plugins, global.screen, tostring(pool)];\n  }\n}\n\n//\n// tostring()\n// Converts an array of charcodes to a string\n//\nfunction tostring(a) {\n  return String.fromCharCode.apply(0, a);\n}\n\n//\n// When seedrandom.js is loaded, we immediately mix a few bits\n// from the built-in RNG into the entropy pool.  Because we do\n// not want to interfere with deterministic PRNG state later,\n// seedrandom will not call math.random on its own again after\n// initialization.\n//\nmixkey(math.random(), pool);\n\n//\n// Nodejs and AMD support: export the implementation as a module using\n// either convention.\n//\nif ((typeof module) == 'object' && module.exports) {\n  module.exports = seedrandom;\n  // When in node.js, try using crypto package for autoseeding.\n  try {\n    nodecrypto = require('crypto');\n  } catch (ex) {}\n} else if ((typeof define) == 'function' && define.amd) {\n  define(function() { return seedrandom; });\n} else {\n  // When included as a plain script, set up Math.seedrandom global.\n  math['seed' + rngname] = seedrandom;\n}\n\n\n// End anonymous scope, and pass initial values.\n})(\n  // global: `self` in browsers (including strict mode and web workers),\n  // otherwise `this` in Node and other environments\n  (typeof self !== 'undefined') ? self : this,\n  [],     // pool: entropy pool starts empty\n  Math    // math: package containing random, pow, and seedrandom\n);\n","// A library of seedable RNGs implemented in Javascript.\n//\n// Usage:\n//\n// var seedrandom = require('seedrandom');\n// var random = seedrandom(1); // or any seed.\n// var x = random();       // 0 <= x < 1.  Every bit is random.\n// var x = random.quick(); // 0 <= x < 1.  32 bits of randomness.\n\n// alea, a 53-bit multiply-with-carry generator by Johannes Baagøe.\n// Period: ~2^116\n// Reported to pass all BigCrush tests.\nvar alea = require('./lib/alea');\n\n// xor128, a pure xor-shift generator by George Marsaglia.\n// Period: 2^128-1.\n// Reported to fail: MatrixRank and LinearComp.\nvar xor128 = require('./lib/xor128');\n\n// xorwow, George Marsaglia's 160-bit xor-shift combined plus weyl.\n// Period: 2^192-2^32\n// Reported to fail: CollisionOver, SimpPoker, and LinearComp.\nvar xorwow = require('./lib/xorwow');\n\n// xorshift7, by François Panneton and Pierre L'ecuyer, takes\n// a different approach: it adds robustness by allowing more shifts\n// than Marsaglia's original three.  It is a 7-shift generator\n// with 256 bits, that passes BigCrush with no systmatic failures.\n// Period 2^256-1.\n// No systematic BigCrush failures reported.\nvar xorshift7 = require('./lib/xorshift7');\n\n// xor4096, by Richard Brent, is a 4096-bit xor-shift with a\n// very long period that also adds a Weyl generator. It also passes\n// BigCrush with no systematic failures.  Its long period may\n// be useful if you have many generators and need to avoid\n// collisions.\n// Period: 2^4128-2^32.\n// No systematic BigCrush failures reported.\nvar xor4096 = require('./lib/xor4096');\n\n// Tyche-i, by Samuel Neves and Filipe Araujo, is a bit-shifting random\n// number generator derived from ChaCha, a modern stream cipher.\n// https://eden.dei.uc.pt/~sneves/pubs/2011-snfa2.pdf\n// Period: ~2^127\n// No systematic BigCrush failures reported.\nvar tychei = require('./lib/tychei');\n\n// The original ARC4-based prng included in this library.\n// Period: ~2^1600\nvar sr = require('./seedrandom');\n\nsr.alea = alea;\nsr.xor128 = xor128;\nsr.xorwow = xorwow;\nsr.xorshift7 = xorshift7;\nsr.xor4096 = xor4096;\nsr.tychei = tychei;\n\nmodule.exports = sr;\n","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as seedrandom from 'seedrandom';\nimport { expectNumbersClose, testEpsilon } from '../test_util';\n// https://en.wikipedia.org/wiki/Marsaglia_polar_method\nexport class MPRandGauss {\n    constructor(mean, stdDeviation, dtype, truncated, seed) {\n        this.mean = mean;\n        this.stdDev = stdDeviation;\n        this.dtype = dtype;\n        this.nextVal = NaN;\n        this.truncated = truncated;\n        if (this.truncated) {\n            this.upper = this.mean + this.stdDev * 2;\n            this.lower = this.mean - this.stdDev * 2;\n        }\n        const seedValue = seed ? seed : Math.random();\n        this.random = seedrandom.alea(seedValue.toString());\n    }\n    /** Returns next sample from a Gaussian distribution. */\n    nextValue() {\n        if (!isNaN(this.nextVal)) {\n            const value = this.nextVal;\n            this.nextVal = NaN;\n            return value;\n        }\n        let resultX, resultY;\n        let isValid = false;\n        while (!isValid) {\n            let v1, v2, s;\n            do {\n                v1 = 2 * this.random() - 1;\n                v2 = 2 * this.random() - 1;\n                s = v1 * v1 + v2 * v2;\n            } while (s >= 1 || s === 0);\n            const mul = Math.sqrt(-2.0 * Math.log(s) / s);\n            resultX = this.mean + this.stdDev * v1 * mul;\n            resultY = this.mean + this.stdDev * v2 * mul;\n            if (!this.truncated || this.isValidTruncated(resultX)) {\n                isValid = true;\n            }\n        }\n        if (!this.truncated || this.isValidTruncated(resultY)) {\n            this.nextVal = this.convertValue(resultY);\n        }\n        return this.convertValue(resultX);\n    }\n    /** Handles proper rounding for non-floating-point numbers. */\n    convertValue(value) {\n        if (this.dtype == null || this.dtype === 'float32') {\n            return value;\n        }\n        return Math.round(value);\n    }\n    /** Returns true if less than 2-standard-deviations from the mean. */\n    isValidTruncated(value) {\n        return value <= this.upper && value >= this.lower;\n    }\n}\n// Marsaglia, George, and Wai Wan Tsang. 2000. \"A Simple Method for Generating\n// Gamma Variables.\"\nexport class RandGamma {\n    constructor(alpha, beta, dtype, seed) {\n        this.alpha = alpha;\n        this.beta = 1 / beta; // convert rate to scale parameter\n        this.dtype = dtype;\n        const seedValue = seed ? seed : Math.random();\n        this.randu = seedrandom.alea(seedValue.toString());\n        this.randn = new MPRandGauss(0, 1, dtype, false, this.randu());\n        if (alpha < 1) {\n            this.d = alpha + (2 / 3);\n        }\n        else {\n            this.d = alpha - (1 / 3);\n        }\n        this.c = 1 / Math.sqrt(9 * this.d);\n    }\n    /** Returns next sample from a gamma distribution. */\n    nextValue() {\n        let x2, v0, v1, x, u, v;\n        while (true) {\n            do {\n                x = this.randn.nextValue();\n                v = 1 + (this.c * x);\n            } while (v <= 0);\n            v *= v * v;\n            x2 = x * x;\n            v0 = 1 - (0.331 * x2 * x2);\n            v1 = (0.5 * x2) + (this.d * (1 - v + Math.log(v)));\n            u = this.randu();\n            if (u < v0 || Math.log(u) < v1) {\n                break;\n            }\n        }\n        v = (1 / this.beta) * this.d * v;\n        if (this.alpha < 1) {\n            v *= Math.pow(this.randu(), 1 / this.alpha);\n        }\n        return this.convertValue(v);\n    }\n    /** Handles proper rounding for non-floating-point numbers. */\n    convertValue(value) {\n        if (this.dtype === 'float32') {\n            return value;\n        }\n        return Math.round(value);\n    }\n}\nexport class UniformRandom {\n    constructor(min = 0, max = 1, dtype, seed) {\n        /** Handles proper rounding for non floating point numbers. */\n        this.canReturnFloat = () => (this.dtype == null || this.dtype === 'float32');\n        this.min = min;\n        this.range = max - min;\n        this.dtype = dtype;\n        if (seed == null) {\n            seed = Math.random();\n        }\n        if (typeof seed === 'number') {\n            seed = seed.toString();\n        }\n        if (!this.canReturnFloat() && this.range <= 1) {\n            throw new Error(`The difference between ${min} - ${max} <= 1 and dtype is not float`);\n        }\n        this.random = seedrandom.alea(seed);\n    }\n    convertValue(value) {\n        if (this.canReturnFloat()) {\n            return value;\n        }\n        return Math.round(value);\n    }\n    nextValue() {\n        return this.convertValue(this.min + this.range * this.random());\n    }\n}\nexport function jarqueBeraNormalityTest(values) {\n    // https://en.wikipedia.org/wiki/Jarque%E2%80%93Bera_test\n    const n = values.length;\n    const s = skewness(values);\n    const k = kurtosis(values);\n    const jb = n / 6 * (Math.pow(s, 2) + 0.25 * Math.pow(k - 3, 2));\n    // JB test requires 2-degress of freedom from Chi-Square @ 0.95:\n    // http://www.itl.nist.gov/div898/handbook/eda/section3/eda3674.htm\n    const CHI_SQUARE_2DEG = 5.991;\n    if (jb > CHI_SQUARE_2DEG) {\n        throw new Error(`Invalid p-value for JB: ${jb}`);\n    }\n}\nexport function expectArrayInMeanStdRange(actual, expectedMean, expectedStdDev, epsilon) {\n    if (epsilon == null) {\n        epsilon = testEpsilon();\n    }\n    const actualMean = mean(actual);\n    expectNumbersClose(actualMean, expectedMean, epsilon);\n    expectNumbersClose(standardDeviation(actual, actualMean), expectedStdDev, epsilon);\n}\nfunction mean(values) {\n    let sum = 0;\n    for (let i = 0; i < values.length; i++) {\n        sum += values[i];\n    }\n    return sum / values.length;\n}\nfunction standardDeviation(values, mean) {\n    let squareDiffSum = 0;\n    for (let i = 0; i < values.length; i++) {\n        const diff = values[i] - mean;\n        squareDiffSum += diff * diff;\n    }\n    return Math.sqrt(squareDiffSum / values.length);\n}\nfunction kurtosis(values) {\n    // https://en.wikipedia.org/wiki/Kurtosis\n    const valuesMean = mean(values);\n    const n = values.length;\n    let sum2 = 0;\n    let sum4 = 0;\n    for (let i = 0; i < n; i++) {\n        const v = values[i] - valuesMean;\n        sum2 += Math.pow(v, 2);\n        sum4 += Math.pow(v, 4);\n    }\n    return (1 / n) * sum4 / Math.pow((1 / n) * sum2, 2);\n}\nfunction skewness(values) {\n    // https://en.wikipedia.org/wiki/Skewness\n    const valuesMean = mean(values);\n    const n = values.length;\n    let sum2 = 0;\n    let sum3 = 0;\n    for (let i = 0; i < n; i++) {\n        const v = values[i] - valuesMean;\n        sum2 += Math.pow(v, 2);\n        sum3 += Math.pow(v, 3);\n    }\n    return (1 / n) * sum3 / Math.pow((1 / (n - 1)) * sum2, 3 / 2);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcmFuZF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxXQUFXLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFxQjdELHVEQUF1RDtBQUN2RCxNQUFNLE9BQU8sV0FBVztJQVV0QixZQUNJLElBQVksRUFBRSxZQUFvQixFQUFFLEtBQWlDLEVBQ3JFLFNBQW1CLEVBQUUsSUFBYTtRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsTUFBTSxHQUFHLFlBQVksQ0FBQztRQUMzQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztRQUNuQixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1lBQ3pDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUMxQztRQUNELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRCx3REFBd0Q7SUFD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QUFNLENBQUMsQ0FBQztJQUNoQyxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ3hCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUIsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUNqQyxJQUFJLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7QUFDaEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgc2VlZHJhbmRvbSBmcm9tICdzZWVkcmFuZG9tJztcblxuaW1wb3J0IHtleHBlY3ROdW1iZXJzQ2xvc2UsIHRlc3RFcHNpbG9ufSBmcm9tICcuLi90ZXN0X3V0aWwnO1xuaW1wb3J0IHtUeXBlZEFycmF5fSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZG9tQmFzZSB7XG4gIG5leHRWYWx1ZSgpOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZG9tR2FtbWEge1xuICBuZXh0VmFsdWUoKTogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmROb3JtYWxEYXRhVHlwZXMge1xuICBmbG9hdDMyOiBGbG9hdDMyQXJyYXk7XG4gIGludDMyOiBJbnQzMkFycmF5O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFJhbmRHYW1tYURhdGFUeXBlcyB7XG4gIGZsb2F0MzI6IEZsb2F0MzJBcnJheTtcbiAgaW50MzI6IEludDMyQXJyYXk7XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01hcnNhZ2xpYV9wb2xhcl9tZXRob2RcbmV4cG9ydCBjbGFzcyBNUFJhbmRHYXVzcyBpbXBsZW1lbnRzIFJhbmRvbUJhc2Uge1xuICBwcml2YXRlIG1lYW46IG51bWJlcjtcbiAgcHJpdmF0ZSBzdGREZXY6IG51bWJlcjtcbiAgcHJpdmF0ZSBuZXh0VmFsOiBudW1iZXI7XG4gIHByaXZhdGUgZHR5cGU/OiBrZXlvZiBSYW5kTm9ybWFsRGF0YVR5cGVzO1xuICBwcml2YXRlIHRydW5jYXRlZD86IGJvb2xlYW47XG4gIHByaXZhdGUgdXBwZXI/OiBudW1iZXI7XG4gIHByaXZhdGUgbG93ZXI/OiBudW1iZXI7XG4gIHByaXZhdGUgcmFuZG9tOiBzZWVkcmFuZG9tLnBybmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBtZWFuOiBudW1iZXIsIHN0ZERldmlhdGlvbjogbnVtYmVyLCBkdHlwZT86IGtleW9mIFJhbmROb3JtYWxEYXRhVHlwZXMsXG4gICAgICB0cnVuY2F0ZWQ/OiBib29sZWFuLCBzZWVkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5tZWFuID0gbWVhbjtcbiAgICB0aGlzLnN0ZERldiA9IHN0ZERldmlhdGlvbjtcbiAgICB0aGlzLmR0eXBlID0gZHR5cGU7XG4gICAgdGhpcy5uZXh0VmFsID0gTmFOO1xuICAgIHRoaXMudHJ1bmNhdGVkID0gdHJ1bmNhdGVkO1xuICAgIGlmICh0aGlzLnRydW5jYXRlZCkge1xuICAgICAgdGhpcy51cHBlciA9IHRoaXMubWVhbiArIHRoaXMuc3RkRGV2ICogMjtcbiAgICAgIHRoaXMubG93ZXIgPSB0aGlzLm1lYW4gLSB0aGlzLnN0ZERldiAqIDI7XG4gICAgfVxuICAgIGNvbnN0IHNlZWRWYWx1ZSA9IHNlZWQgPyBzZWVkIDogTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnJhbmRvbSA9IHNlZWRyYW5kb20uYWxlYShzZWVkVmFsdWUudG9TdHJpbmcoKSk7XG4gIH1cblxuICAvKiogUmV0dXJucyBuZXh0IHNhbXBsZSBmcm9tIGEgR2F1c3NpYW4gZGlzdHJpYnV0aW9uLiAqL1xuICBwdWJsaWMgbmV4dFZhbHVlKCk6IG51bWJlciB7XG4gICAgaWYgKCFpc05hTih0aGlzLm5leHRWYWwpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IHRoaXMubmV4dFZhbDtcbiAgICAgIHRoaXMubmV4dFZhbCA9IE5hTjtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG5cbiAgICBsZXQgcmVzdWx0WDogbnVtYmVyLCByZXN1bHRZOiBudW1iZXI7XG4gICAgbGV0IGlzVmFsaWQgPSBmYWxzZTtcbiAgICB3aGlsZSAoIWlzVmFsaWQpIHtcbiAgICAgIGxldCB2MTogbnVtYmVyLCB2MjogbnVtYmVyLCBzOiBudW1iZXI7XG4gICAgICBkbyB7XG4gICAgICAgIHYxID0gMiAqIHRoaXMucmFuZG9tKCkgLSAxO1xuICAgICAgICB2MiA9IDIgKiB0aGlzLnJhbmRvbSgpIC0gMTtcbiAgICAgICAgcyA9IHYxICogdjEgKyB2MiAqIHYyO1xuICAgICAgfSB3aGlsZSAocyA+PSAxIHx8IHMgPT09IDApO1xuXG4gICAgICBjb25zdCBtdWwgPSBNYXRoLnNxcnQoLTIuMCAqIE1hdGgubG9nKHMpIC8gcyk7XG4gICAgICByZXN1bHRYID0gdGhpcy5tZWFuICsgdGhpcy5zdGREZXYgKiB2MSAqIG11bDtcbiAgICAgIHJlc3VsdFkgPSB0aGlzLm1lYW4gKyB0aGlzLnN0ZERldiAqIHYyICogbXVsO1xuXG4gICAgICBpZiAoIXRoaXMudHJ1bmNhdGVkIHx8IHRoaXMuaXNWYWxpZFRydW5jYXRlZChyZXN1bHRYKSkge1xuICAgICAgICBpc1ZhbGlkID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXRoaXMudHJ1bmNhdGVkIHx8IHRoaXMuaXNWYWxpZFRydW5jYXRlZChyZXN1bHRZKSkge1xuICAgICAgdGhpcy5uZXh0VmFsID0gdGhpcy5jb252ZXJ0VmFsdWUocmVzdWx0WSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWx1ZShyZXN1bHRYKTtcbiAgfVxuXG4gIC8qKiBIYW5kbGVzIHByb3BlciByb3VuZGluZyBmb3Igbm9uLWZsb2F0aW5nLXBvaW50IG51bWJlcnMuICovXG4gIHByaXZhdGUgY29udmVydFZhbHVlKHZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmR0eXBlID09IG51bGwgfHwgdGhpcy5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRydWUgaWYgbGVzcyB0aGFuIDItc3RhbmRhcmQtZGV2aWF0aW9ucyBmcm9tIHRoZSBtZWFuLiAqL1xuICBwcml2YXRlIGlzVmFsaWRUcnVuY2F0ZWQodmFsdWU6IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiB2YWx1ZSA8PSB0aGlzLnVwcGVyICYmIHZhbHVlID49IHRoaXMubG93ZXI7XG4gIH1cbn1cblxuLy8gTWFyc2FnbGlhLCBHZW9yZ2UsIGFuZCBXYWkgV2FuIFRzYW5nLiAyMDAwLiBcIkEgU2ltcGxlIE1ldGhvZCBmb3IgR2VuZXJhdGluZ1xuLy8gR2FtbWEgVmFyaWFibGVzLlwiXG5leHBvcnQgY2xhc3MgUmFuZEdhbW1hIGltcGxlbWVudHMgUmFuZG9tR2FtbWEge1xuICBwcml2YXRlIGFscGhhOiBudW1iZXI7XG4gIHByaXZhdGUgYmV0YTogbnVtYmVyO1xuICBwcml2YXRlIGQ6IG51bWJlcjtcbiAgcHJpdmF0ZSBjOiBudW1iZXI7XG4gIHByaXZhdGUgZHR5cGU/OiBrZXlvZiBSYW5kR2FtbWFEYXRhVHlwZXM7XG4gIHByaXZhdGUgcmFuZHU6IHNlZWRyYW5kb20ucHJuZztcbiAgcHJpdmF0ZSByYW5kbjogTVBSYW5kR2F1c3M7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBhbHBoYTogbnVtYmVyLCBiZXRhOiBudW1iZXIsIGR0eXBlOiBrZXlvZiBSYW5kR2FtbWFEYXRhVHlwZXMsXG4gICAgICBzZWVkPzogbnVtYmVyKSB7XG4gICAgdGhpcy5hbHBoYSA9IGFscGhhO1xuICAgIHRoaXMuYmV0YSA9IDEgLyBiZXRhOyAgLy8gY29udmVydCByYXRlIHRvIHNjYWxlIHBhcmFtZXRlclxuICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcblxuICAgIGNvbnN0IHNlZWRWYWx1ZSA9IHNlZWQgPyBzZWVkIDogTWF0aC5yYW5kb20oKTtcbiAgICB0aGlzLnJhbmR1ID0gc2VlZHJhbmRvbS5hbGVhKHNlZWRWYWx1ZS50b1N0cmluZygpKTtcbiAgICB0aGlzLnJhbmRuID0gbmV3IE1QUmFuZEdhdXNzKDAsIDEsIGR0eXBlLCBmYWxzZSwgdGhpcy5yYW5kdSgpKTtcblxuICAgIGlmIChhbHBoYSA8IDEpIHtcbiAgICAgIHRoaXMuZCA9IGFscGhhICsgKDIgLyAzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kID0gYWxwaGEgLSAoMSAvIDMpO1xuICAgIH1cbiAgICB0aGlzLmMgPSAxIC8gTWF0aC5zcXJ0KDkgKiB0aGlzLmQpO1xuICB9XG5cbiAgLyoqIFJldHVybnMgbmV4dCBzYW1wbGUgZnJvbSBhIGdhbW1hIGRpc3RyaWJ1dGlvbi4gKi9cbiAgcHVibGljIG5leHRWYWx1ZSgpOiBudW1iZXIge1xuICAgIGxldCB4MjogbnVtYmVyLCB2MDogbnVtYmVyLCB2MTogbnVtYmVyLCB4OiBudW1iZXIsIHU6IG51bWJlciwgdjogbnVtYmVyO1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBkbyB7XG4gICAgICAgIHggPSB0aGlzLnJhbmRuLm5leHRWYWx1ZSgpO1xuICAgICAgICB2ID0gMSArICh0aGlzLmMgKiB4KTtcbiAgICAgIH0gd2hpbGUgKHYgPD0gMCk7XG4gICAgICB2ICo9IHYgKiB2O1xuICAgICAgeDIgPSB4ICogeDtcbiAgICAgIHYwID0gMSAtICgwLjMzMSAqIHgyICogeDIpO1xuICAgICAgdjEgPSAoMC41ICogeDIpICsgKHRoaXMuZCAqICgxIC0gdiArIE1hdGgubG9nKHYpKSk7XG4gICAgICB1ID0gdGhpcy5yYW5kdSgpO1xuICAgICAgaWYgKHUgPCB2MCB8fCBNYXRoLmxvZyh1KSA8IHYxKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICB2ID0gKDEgLyB0aGlzLmJldGEpICogdGhpcy5kICogdjtcbiAgICBpZiAodGhpcy5hbHBoYSA8IDEpIHtcbiAgICAgIHYgKj0gTWF0aC5wb3codGhpcy5yYW5kdSgpLCAxIC8gdGhpcy5hbHBoYSk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNvbnZlcnRWYWx1ZSh2KTtcbiAgfVxuICAvKiogSGFuZGxlcyBwcm9wZXIgcm91bmRpbmcgZm9yIG5vbi1mbG9hdGluZy1wb2ludCBudW1iZXJzLiAqL1xuICBwcml2YXRlIGNvbnZlcnRWYWx1ZSh2YWx1ZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5kdHlwZSA9PT0gJ2Zsb2F0MzInKSB7XG4gICAgICByZXR1cm4gdmFsdWU7XG4gICAgfVxuICAgIHJldHVybiBNYXRoLnJvdW5kKHZhbHVlKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVW5pZm9ybVJhbmRvbSBpbXBsZW1lbnRzIFJhbmRvbUJhc2Uge1xuICBwcml2YXRlIG1pbjogbnVtYmVyO1xuICBwcml2YXRlIHJhbmdlOiBudW1iZXI7XG4gIHByaXZhdGUgcmFuZG9tOiBzZWVkcmFuZG9tLnBybmc7XG4gIHByaXZhdGUgZHR5cGU/OiBrZXlvZiBSYW5kTm9ybWFsRGF0YVR5cGVzO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgbWluID0gMCwgbWF4ID0gMSwgZHR5cGU/OiBrZXlvZiBSYW5kTm9ybWFsRGF0YVR5cGVzLFxuICAgICAgc2VlZD86IHN0cmluZ3xudW1iZXIpIHtcbiAgICB0aGlzLm1pbiA9IG1pbjtcbiAgICB0aGlzLnJhbmdlID0gbWF4IC0gbWluO1xuICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICBpZiAoc2VlZCA9PSBudWxsKSB7XG4gICAgICBzZWVkID0gTWF0aC5yYW5kb20oKTtcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBzZWVkID09PSAnbnVtYmVyJykge1xuICAgICAgc2VlZCA9IHNlZWQudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuY2FuUmV0dXJuRmxvYXQoKSAmJiB0aGlzLnJhbmdlIDw9IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAke21pbn0gLSAke21heH0gPD0gMSBhbmQgZHR5cGUgaXMgbm90IGZsb2F0YCk7XG4gICAgfVxuICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWQpO1xuICB9XG5cbiAgLyoqIEhhbmRsZXMgcHJvcGVyIHJvdW5kaW5nIGZvciBub24gZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4gKi9cbiAgcHJpdmF0ZSBjYW5SZXR1cm5GbG9hdCA9ICgpID0+XG4gICAgICAodGhpcy5kdHlwZSA9PSBudWxsIHx8IHRoaXMuZHR5cGUgPT09ICdmbG9hdDMyJyk7XG5cbiAgcHJpdmF0ZSBjb252ZXJ0VmFsdWUodmFsdWU6IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuY2FuUmV0dXJuRmxvYXQoKSkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5yb3VuZCh2YWx1ZSk7XG4gIH1cblxuICBuZXh0VmFsdWUoKSB7XG4gICAgcmV0dXJuIHRoaXMuY29udmVydFZhbHVlKHRoaXMubWluICsgdGhpcy5yYW5nZSAqIHRoaXMucmFuZG9tKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBqYXJxdWVCZXJhTm9ybWFsaXR5VGVzdCh2YWx1ZXM6IFR5cGVkQXJyYXl8bnVtYmVyW10pIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSmFycXVlJUUyJTgwJTkzQmVyYV90ZXN0XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBjb25zdCBzID0gc2tld25lc3ModmFsdWVzKTtcbiAgY29uc3QgayA9IGt1cnRvc2lzKHZhbHVlcyk7XG4gIGNvbnN0IGpiID0gbiAvIDYgKiAoTWF0aC5wb3cocywgMikgKyAwLjI1ICogTWF0aC5wb3coayAtIDMsIDIpKTtcbiAgLy8gSkIgdGVzdCByZXF1aXJlcyAyLWRlZ3Jlc3Mgb2YgZnJlZWRvbSBmcm9tIENoaS1TcXVhcmUgQCAwLjk1OlxuICAvLyBodHRwOi8vd3d3Lml0bC5uaXN0Lmdvdi9kaXY4OTgvaGFuZGJvb2svZWRhL3NlY3Rpb24zL2VkYTM2NzQuaHRtXG4gIGNvbnN0IENISV9TUVVBUkVfMkRFRyA9IDUuOTkxO1xuICBpZiAoamIgPiBDSElfU1FVQVJFXzJERUcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgcC12YWx1ZSBmb3IgSkI6ICR7amJ9YCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4cGVjdEFycmF5SW5NZWFuU3RkUmFuZ2UoXG4gICAgYWN0dWFsOiBUeXBlZEFycmF5fG51bWJlcltdLCBleHBlY3RlZE1lYW46IG51bWJlciwgZXhwZWN0ZWRTdGREZXY6IG51bWJlcixcbiAgICBlcHNpbG9uPzogbnVtYmVyKSB7XG4gIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICBlcHNpbG9uID0gdGVzdEVwc2lsb24oKTtcbiAgfVxuICBjb25zdCBhY3R1YWxNZWFuID0gbWVhbihhY3R1YWwpO1xuICBleHBlY3ROdW1iZXJzQ2xvc2UoYWN0dWFsTWVhbiwgZXhwZWN0ZWRNZWFuLCBlcHNpbG9uKTtcbiAgZXhwZWN0TnVtYmVyc0Nsb3NlKFxuICAgICAgc3RhbmRhcmREZXZpYXRpb24oYWN0dWFsLCBhY3R1YWxNZWFuKSwgZXhwZWN0ZWRTdGREZXYsIGVwc2lsb24pO1xufVxuXG5mdW5jdGlvbiBtZWFuKHZhbHVlczogVHlwZWRBcnJheXxudW1iZXJbXSkge1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICBzdW0gKz0gdmFsdWVzW2ldO1xuICB9XG4gIHJldHVybiBzdW0gLyB2YWx1ZXMubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiBzdGFuZGFyZERldmlhdGlvbih2YWx1ZXM6IFR5cGVkQXJyYXl8bnVtYmVyW10sIG1lYW46IG51bWJlcikge1xuICBsZXQgc3F1YXJlRGlmZlN1bSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZGlmZiA9IHZhbHVlc1tpXSAtIG1lYW47XG4gICAgc3F1YXJlRGlmZlN1bSArPSBkaWZmICogZGlmZjtcbiAgfVxuICByZXR1cm4gTWF0aC5zcXJ0KHNxdWFyZURpZmZTdW0gLyB2YWx1ZXMubGVuZ3RoKTtcbn1cblxuZnVuY3Rpb24ga3VydG9zaXModmFsdWVzOiBUeXBlZEFycmF5fG51bWJlcltdKSB7XG4gIC8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0t1cnRvc2lzXG4gIGNvbnN0IHZhbHVlc01lYW4gPSBtZWFuKHZhbHVlcyk7XG4gIGNvbnN0IG4gPSB2YWx1ZXMubGVuZ3RoO1xuICBsZXQgc3VtMiA9IDA7XG4gIGxldCBzdW00ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuOyBpKyspIHtcbiAgICBjb25zdCB2ID0gdmFsdWVzW2ldIC0gdmFsdWVzTWVhbjtcbiAgICBzdW0yICs9IE1hdGgucG93KHYsIDIpO1xuICAgIHN1bTQgKz0gTWF0aC5wb3codiwgNCk7XG4gIH1cbiAgcmV0dXJuICgxIC8gbikgKiBzdW00IC8gTWF0aC5wb3coKDEgLyBuKSAqIHN1bTIsIDIpO1xufVxuXG5mdW5jdGlvbiBza2V3bmVzcyh2YWx1ZXM6IFR5cGVkQXJyYXl8bnVtYmVyW10pIHtcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2tld25lc3NcbiAgY29uc3QgdmFsdWVzTWVhbiA9IG1lYW4odmFsdWVzKTtcbiAgY29uc3QgbiA9IHZhbHVlcy5sZW5ndGg7XG4gIGxldCBzdW0yID0gMDtcbiAgbGV0IHN1bTMgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG47IGkrKykge1xuICAgIGNvbnN0IHYgPSB2YWx1ZXNbaV0gLSB2YWx1ZXNNZWFuO1xuICAgIHN1bTIgKz0gTWF0aC5wb3codiwgMik7XG4gICAgc3VtMyArPSBNYXRoLnBvdyh2LCAzKTtcbiAgfVxuICByZXR1cm4gKDEgLyBuKSAqIHN1bTMgLyBNYXRoLnBvdygoMSAvIChuIC0gMSkpICogc3VtMiwgMyAvIDIpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { op } from './operation';\nimport { RandGamma } from './rand_util';\n/**\n * Creates a `tf.Tensor` with values sampled from a gamma distribution.\n *\n * ```js\n * tf.randomGamma([2, 2], 1).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param alpha The shape parameter of the gamma distribution.\n * @param beta The inverse scale parameter of the gamma distribution. Defaults\n *     to 1.\n * @param dtype The data type of the output. Defaults to float32.\n * @param seed The seed for the random number generator.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction randomGamma_(shape, alpha, beta = 1, dtype = 'float32', seed) {\n    if (beta == null) {\n        beta = 1;\n    }\n    if (dtype == null) {\n        dtype = 'float32';\n    }\n    if (dtype !== 'float32' && dtype !== 'int32') {\n        throw new Error(`Unsupported data type ${dtype}`);\n    }\n    const rgamma = new RandGamma(alpha, beta, dtype, seed);\n    const res = buffer(shape, dtype);\n    for (let i = 0; i < res.values.length; i++) {\n        res.values[i] = rgamma.nextValue();\n    }\n    return res.toTensor();\n}\nexport const randomGamma = op({ randomGamma_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX2dhbW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvcmFuZG9tX2dhbW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsWUFBWSxDQUNqQixLQUFrQixFQUFFLEtBQWEsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUMzQyxRQUEyQixTQUFTLEVBQUUsSUFBYTtJQUNyRCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDaEIsSUFBSSxHQUFHLENBQUMsQ0FBQztLQUNWO0lBQ0QsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLEtBQUssR0FBRyxTQUFTLENBQUM7S0FDbkI7SUFDRCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxLQUFLLE9BQU8sRUFBRTtRQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ25EO0lBQ0QsTUFBTSxNQUFNLEdBQUcsSUFBSSxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDdkQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDcEM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBTaGFwZU1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2J1ZmZlcn0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtSYW5kR2FtbWF9IGZyb20gJy4vcmFuZF91dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB2YWx1ZXMgc2FtcGxlZCBmcm9tIGEgZ2FtbWEgZGlzdHJpYnV0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21HYW1tYShbMiwgMl0sIDEpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gYWxwaGEgVGhlIHNoYXBlIHBhcmFtZXRlciBvZiB0aGUgZ2FtbWEgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIGJldGEgVGhlIGludmVyc2Ugc2NhbGUgcGFyYW1ldGVyIG9mIHRoZSBnYW1tYSBkaXN0cmlidXRpb24uIERlZmF1bHRzXG4gKiAgICAgdG8gMS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQuIERlZmF1bHRzIHRvIGZsb2F0MzIuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1JhbmRvbSd9XG4gKi9cbmZ1bmN0aW9uIHJhbmRvbUdhbW1hXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgc2hhcGU6IFNoYXBlTWFwW1JdLCBhbHBoYTogbnVtYmVyLCBiZXRhID0gMSxcbiAgICBkdHlwZTogJ2Zsb2F0MzInfCdpbnQzMicgPSAnZmxvYXQzMicsIHNlZWQ/OiBudW1iZXIpOiBUZW5zb3I8Uj4ge1xuICBpZiAoYmV0YSA9PSBudWxsKSB7XG4gICAgYmV0YSA9IDE7XG4gIH1cbiAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICBkdHlwZSA9ICdmbG9hdDMyJztcbiAgfVxuICBpZiAoZHR5cGUgIT09ICdmbG9hdDMyJyAmJiBkdHlwZSAhPT0gJ2ludDMyJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gIH1cbiAgY29uc3QgcmdhbW1hID0gbmV3IFJhbmRHYW1tYShhbHBoYSwgYmV0YSwgZHR5cGUsIHNlZWQpO1xuICBjb25zdCByZXMgPSBidWZmZXIoc2hhcGUsIGR0eXBlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzLnZhbHVlc1tpXSA9IHJnYW1tYS5uZXh0VmFsdWUoKTtcbiAgfVxuICByZXR1cm4gcmVzLnRvVGVuc29yKCk7XG59XG5cbmV4cG9ydCBjb25zdCByYW5kb21HYW1tYSA9IG9wKHtyYW5kb21HYW1tYV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { op } from './operation';\nimport { MPRandGauss } from './rand_util';\n/**\n * Creates a `tf.Tensor` with values sampled from a normal distribution.\n *\n * ```js\n * tf.randomNormal([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param mean The mean of the normal distribution.\n * @param stdDev The standard deviation of the normal distribution.\n * @param dtype The data type of the output.\n * @param seed The seed for the random number generator.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction randomNormal_(shape, mean = 0, stdDev = 1, dtype, seed) {\n    if (dtype != null && dtype === 'bool') {\n        throw new Error(`Unsupported data type ${dtype}`);\n    }\n    const randGauss = new MPRandGauss(mean, stdDev, dtype, false /* truncated */, seed);\n    const res = buffer(shape, dtype);\n    for (let i = 0; i < res.values.length; i++) {\n        res.values[i] = randGauss.nextValue();\n    }\n    return res.toTensor();\n}\nexport const randomNormal = op({ randomNormal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX25vcm1hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JhbmRvbV9ub3JtYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFeEM7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLGFBQWEsQ0FDbEIsS0FBa0IsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBeUIsRUFDbkUsSUFBYTtJQUNmLElBQUksS0FBSyxJQUFJLElBQUksSUFBSyxLQUFrQixLQUFLLE1BQU0sRUFBRTtRQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ25EO0lBQ0QsTUFBTSxTQUFTLEdBQ1gsSUFBSSxXQUFXLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN0RSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxTQUFTLEVBQUUsQ0FBQztLQUN2QztJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge0RhdGFUeXBlLCBSYW5rLCBTaGFwZU1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2J1ZmZlcn0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtNUFJhbmRHYXVzc30gZnJvbSAnLi9yYW5kX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21Ob3JtYWwoWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIG1lYW4gVGhlIG1lYW4gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gc3RkRGV2IFRoZSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0LlxuICogQHBhcmFtIHNlZWQgVGhlIHNlZWQgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiByYW5kb21Ob3JtYWxfPFIgZXh0ZW5kcyBSYW5rPihcbiAgICBzaGFwZTogU2hhcGVNYXBbUl0sIG1lYW4gPSAwLCBzdGREZXYgPSAxLCBkdHlwZT86ICdmbG9hdDMyJ3wnaW50MzInLFxuICAgIHNlZWQ/OiBudW1iZXIpOiBUZW5zb3I8Uj4ge1xuICBpZiAoZHR5cGUgIT0gbnVsbCAmJiAoZHR5cGUgYXMgRGF0YVR5cGUpID09PSAnYm9vbCcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGRhdGEgdHlwZSAke2R0eXBlfWApO1xuICB9XG4gIGNvbnN0IHJhbmRHYXVzcyA9XG4gICAgICBuZXcgTVBSYW5kR2F1c3MobWVhbiwgc3RkRGV2LCBkdHlwZSwgZmFsc2UgLyogdHJ1bmNhdGVkICovLCBzZWVkKTtcbiAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gIH1cbiAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuXG5leHBvcnQgY29uc3QgcmFuZG9tTm9ybWFsID0gb3Aoe3JhbmRvbU5vcm1hbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { op } from './operation';\nimport { randomNormal } from './random_normal';\n/**\n * Creates a `tf.Tensor` with values sampled from a normal distribution.\n *\n * The generated values will have mean 0 and standard deviation 1.\n *\n * ```js\n * tf.randomStandardNormal([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param dtype The data type of the output.\n * @param seed The seed for the random number generator.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction randomStandardNormal_(shape, dtype, seed) {\n    if (dtype != null && dtype === 'bool') {\n        throw new Error(`Unsupported data type ${dtype}`);\n    }\n    return randomNormal(shape, 0, 1, dtype, seed);\n}\nexport const randomStandardNormal = op({ randomStandardNormal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX3N0YW5kYXJkX25vcm1hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JhbmRvbV9zdGFuZGFyZF9ub3JtYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLHFCQUFxQixDQUMxQixLQUFrQixFQUFFLEtBQXlCLEVBQUUsSUFBYTtJQUM5RCxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUssS0FBa0IsS0FBSyxNQUFNLEVBQUU7UUFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyx5QkFBeUIsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNuRDtJQUNELE9BQU8sWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLEVBQUMscUJBQXFCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmFuZG9tTm9ybWFsfSBmcm9tICcuL3JhbmRvbV9ub3JtYWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICpcbiAqIFRoZSBnZW5lcmF0ZWQgdmFsdWVzIHdpbGwgaGF2ZSBtZWFuIDAgYW5kIHN0YW5kYXJkIGRldmlhdGlvbiAxLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5yYW5kb21TdGFuZGFyZE5vcm1hbChbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc2hhcGUgQW4gYXJyYXkgb2YgaW50ZWdlcnMgZGVmaW5pbmcgdGhlIG91dHB1dCB0ZW5zb3Igc2hhcGUuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0LlxuICogQHBhcmFtIHNlZWQgVGhlIHNlZWQgZm9yIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdSYW5kb20nfVxuICovXG5mdW5jdGlvbiByYW5kb21TdGFuZGFyZE5vcm1hbF88UiBleHRlbmRzIFJhbms+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgZHR5cGU/OiAnZmxvYXQzMid8J2ludDMyJywgc2VlZD86IG51bWJlcik6IFRlbnNvcjxSPiB7XG4gIGlmIChkdHlwZSAhPSBudWxsICYmIChkdHlwZSBhcyBEYXRhVHlwZSkgPT09ICdib29sJykge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGF0YSB0eXBlICR7ZHR5cGV9YCk7XG4gIH1cbiAgcmV0dXJuIHJhbmRvbU5vcm1hbChzaGFwZSwgMCwgMSwgZHR5cGUsIHNlZWQpO1xufVxuXG5leHBvcnQgY29uc3QgcmFuZG9tU3RhbmRhcmROb3JtYWwgPSBvcCh7cmFuZG9tU3RhbmRhcmROb3JtYWxffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { op } from './operation';\nimport { UniformRandom } from './rand_util';\n/**\n * Creates a `tf.Tensor` with values sampled from a uniform distribution.\n *\n * The generated values follow a uniform distribution in the range [minval,\n * maxval). The lower bound minval is included in the range, while the upper\n * bound maxval is excluded.\n *\n * ```js\n * tf.randomUniform([2, 2]).print();\n * ```\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param minval The lower bound on the range of random values to generate.\n *   Defaults to 0.\n * @param maxval The upper bound on the range of random values to generate.\n *   Defaults to 1.\n * @param dtype The data type of the output tensor. Defaults to 'float32'.\n *\n * @doc {heading: 'Tensors', subheading: 'Random'}\n */\nfunction randomUniform_(shape, minval = 0, maxval = 1, dtype = 'float32', seed) {\n    const res = buffer(shape, dtype);\n    const random = new UniformRandom(minval, maxval, null, seed);\n    for (let i = 0; i < res.values.length; i++) {\n        res.values[i] = random.nextValue();\n    }\n    return res.toTensor();\n}\nexport const randomUniform = op({ randomUniform_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZG9tX3VuaWZvcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yYW5kb21fdW5pZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUxQzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsY0FBYyxDQUNuQixLQUFrQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxRQUFrQixTQUFTLEVBQ3ZFLElBQW9CO0lBQ3RCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO0tBQ3BDO0lBQ0QsT0FBTyxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmssIFNoYXBlTWFwfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YnVmZmVyfSBmcm9tICcuL2J1ZmZlcic7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge1VuaWZvcm1SYW5kb219IGZyb20gJy4vcmFuZF91dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgYHRmLlRlbnNvcmAgd2l0aCB2YWx1ZXMgc2FtcGxlZCBmcm9tIGEgdW5pZm9ybSBkaXN0cmlidXRpb24uXG4gKlxuICogVGhlIGdlbmVyYXRlZCB2YWx1ZXMgZm9sbG93IGEgdW5pZm9ybSBkaXN0cmlidXRpb24gaW4gdGhlIHJhbmdlIFttaW52YWwsXG4gKiBtYXh2YWwpLiBUaGUgbG93ZXIgYm91bmQgbWludmFsIGlzIGluY2x1ZGVkIGluIHRoZSByYW5nZSwgd2hpbGUgdGhlIHVwcGVyXG4gKiBib3VuZCBtYXh2YWwgaXMgZXhjbHVkZWQuXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmRvbVVuaWZvcm0oWzIsIDJdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHNoYXBlIEFuIGFycmF5IG9mIGludGVnZXJzIGRlZmluaW5nIHRoZSBvdXRwdXQgdGVuc29yIHNoYXBlLlxuICogQHBhcmFtIG1pbnZhbCBUaGUgbG93ZXIgYm91bmQgb24gdGhlIHJhbmdlIG9mIHJhbmRvbSB2YWx1ZXMgdG8gZ2VuZXJhdGUuXG4gKiAgIERlZmF1bHRzIHRvIDAuXG4gKiBAcGFyYW0gbWF4dmFsIFRoZSB1cHBlciBib3VuZCBvbiB0aGUgcmFuZ2Ugb2YgcmFuZG9tIHZhbHVlcyB0byBnZW5lcmF0ZS5cbiAqICAgRGVmYXVsdHMgdG8gMS5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlIG9mIHRoZSBvdXRwdXQgdGVuc29yLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnUmFuZG9tJ31cbiAqL1xuZnVuY3Rpb24gcmFuZG9tVW5pZm9ybV88UiBleHRlbmRzIFJhbms+KFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSwgbWludmFsID0gMCwgbWF4dmFsID0gMSwgZHR5cGU6IERhdGFUeXBlID0gJ2Zsb2F0MzInLFxuICAgIHNlZWQ/OiBudW1iZXJ8c3RyaW5nKTogVGVuc29yPFI+IHtcbiAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gIGNvbnN0IHJhbmRvbSA9IG5ldyBVbmlmb3JtUmFuZG9tKG1pbnZhbCwgbWF4dmFsLCBudWxsLCBzZWVkKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXMudmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgcmVzLnZhbHVlc1tpXSA9IHJhbmRvbS5uZXh0VmFsdWUoKTtcbiAgfVxuICByZXR1cm4gcmVzLnRvVGVuc29yKCk7XG59XG5cbmV4cG9ydCBjb25zdCByYW5kb21Vbmlmb3JtID0gb3Aoe3JhbmRvbVVuaWZvcm1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Range } from '../kernel_names';\n/**\n * Creates a new `tf.Tensor1D` filled with the numbers in the range provided.\n *\n * The tensor is a half-open interval meaning it includes start, but\n * excludes stop. Decrementing ranges and negative step values are also\n * supported.\n *\n *\n * ```js\n * tf.range(0, 9, 2).print();\n * ```\n *\n * @param start An integer start value\n * @param stop An integer stop value\n * @param step An integer increment (will default to 1 or -1)\n * @param dtype The data type of the output tensor. Defaults to 'float32'.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function range(start, stop, step = 1, dtype = 'float32') {\n    if (step === 0) {\n        throw new Error('Cannot have a step of zero');\n    }\n    const attrs = { start, stop, step, dtype };\n    return ENGINE.runKernel(Range, {} /* inputs */, attrs);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yYW5nZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWEsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxVQUFVLEtBQUssQ0FDakIsS0FBYSxFQUFFLElBQVksRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUNyQyxRQUEyQixTQUFTO0lBQ3RDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNkLE1BQU0sSUFBSSxLQUFLLENBQUMsNEJBQTRCLENBQUMsQ0FBQztLQUMvQztJQUVELE1BQU0sS0FBSyxHQUFlLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUM7SUFFckQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsWUFBWSxFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUMvRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmFuZ2UsIFJhbmdlQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBgdGYuVGVuc29yMURgIGZpbGxlZCB3aXRoIHRoZSBudW1iZXJzIGluIHRoZSByYW5nZSBwcm92aWRlZC5cbiAqXG4gKiBUaGUgdGVuc29yIGlzIGEgaGFsZi1vcGVuIGludGVydmFsIG1lYW5pbmcgaXQgaW5jbHVkZXMgc3RhcnQsIGJ1dFxuICogZXhjbHVkZXMgc3RvcC4gRGVjcmVtZW50aW5nIHJhbmdlcyBhbmQgbmVnYXRpdmUgc3RlcCB2YWx1ZXMgYXJlIGFsc29cbiAqIHN1cHBvcnRlZC5cbiAqXG4gKlxuICogYGBganNcbiAqIHRmLnJhbmdlKDAsIDksIDIpLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gc3RhcnQgQW4gaW50ZWdlciBzdGFydCB2YWx1ZVxuICogQHBhcmFtIHN0b3AgQW4gaW50ZWdlciBzdG9wIHZhbHVlXG4gKiBAcGFyYW0gc3RlcCBBbiBpbnRlZ2VyIGluY3JlbWVudCAod2lsbCBkZWZhdWx0IHRvIDEgb3IgLTEpXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci4gRGVmYXVsdHMgdG8gJ2Zsb2F0MzInLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlKFxuICAgIHN0YXJ0OiBudW1iZXIsIHN0b3A6IG51bWJlciwgc3RlcCA9IDEsXG4gICAgZHR5cGU6ICdmbG9hdDMyJ3wnaW50MzInID0gJ2Zsb2F0MzInKTogVGVuc29yMUQge1xuICBpZiAoc3RlcCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGhhdmUgYSBzdGVwIG9mIHplcm8nKTtcbiAgfVxuXG4gIGNvbnN0IGF0dHJzOiBSYW5nZUF0dHJzID0ge3N0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmFuZ2UsIHt9IC8qIGlucHV0cyAqLywgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Reciprocal } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes reciprocal of x element-wise: `1 / x`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, 2]);\n *\n * x.reciprocal().print();  // or tf.reciprocal(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction reciprocal_(x) {\n    const $x = convertToTensor(x, 'x', 'reciprocal');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Reciprocal, inputs);\n}\nexport const reciprocal = op({ reciprocal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXByb2NhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JlY2lwcm9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsVUFBVSxFQUFtQixNQUFNLGlCQUFpQixDQUFDO0FBRzdELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxXQUFXLENBQW1CLENBQWU7SUFDcEQsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFFakQsTUFBTSxNQUFNLEdBQXFCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3pDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1JlY2lwcm9jYWwsIFJlY2lwcm9jYWxJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgcmVjaXByb2NhbCBvZiB4IGVsZW1lbnQtd2lzZTogYDEgLyB4YFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIDJdKTtcbiAqXG4gKiB4LnJlY2lwcm9jYWwoKS5wcmludCgpOyAgLy8gb3IgdGYucmVjaXByb2NhbCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByZWNpcHJvY2FsXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmVjaXByb2NhbCcpO1xuXG4gIGNvbnN0IGlucHV0czogUmVjaXByb2NhbElucHV0cyA9IHt4OiAkeH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlY2lwcm9jYWwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IG9wKHtyZWNpcHJvY2FsX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Relu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes rectified linear element-wise: `max(x, 0)`.\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.relu().print();  // or tf.relu(x)\n * ```\n * @param x The input tensor. If the dtype is `bool`, the output dtype will be\n *     `int32`.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction relu_(x) {\n    const $x = convertToTensor(x, 'x', 'relu');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Relu, inputs);\n}\nexport const relu = op({ relu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsU0FBUyxLQUFLLENBQW1CLENBQWU7SUFDOUMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0MsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVsdSwgUmVsdUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyByZWN0aWZpZWQgbGluZWFyIGVsZW1lbnQtd2lzZTogYG1heCh4LCAwKWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA0XSk7XG4gKlxuICogeC5yZWx1KCkucHJpbnQoKTsgIC8vIG9yIHRmLnJlbHUoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci4gSWYgdGhlIGR0eXBlIGlzIGBib29sYCwgdGhlIG91dHB1dCBkdHlwZSB3aWxsIGJlXG4gKiAgICAgYGludDMyYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcmVsdV88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JlbHUnKTtcblxuICBjb25zdCBpbnB1dHM6IFJlbHVJbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFJlbHUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCByZWx1ID0gb3Aoe3JlbHVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Relu6 } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes rectified linear 6 element-wise: `min(max(x, 0), 6)`.\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 8]);\n *\n * x.relu6().print();  // or tf.relu6(x)\n * ```\n * @param x The input tensor. If the dtype is `bool`, the output dtype will be\n *     `int32`.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction relu6_(x) {\n    const $x = convertToTensor(x, 'x', 'relu6');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Relu6, inputs);\n}\nexport const relu6 = op({ relu6_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsdTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yZWx1Ni50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7UmVsdTYsIFJlbHU2SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHJlY3RpZmllZCBsaW5lYXIgNiBlbGVtZW50LXdpc2U6IGBtaW4obWF4KHgsIDApLCA2KWAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLTEsIDIsIC0zLCA4XSk7XG4gKlxuICogeC5yZWx1NigpLnByaW50KCk7ICAvLyBvciB0Zi5yZWx1Nih4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLiBJZiB0aGUgZHR5cGUgaXMgYGJvb2xgLCB0aGUgb3V0cHV0IGR0eXBlIHdpbGwgYmVcbiAqICAgICBgaW50MzJgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByZWx1Nl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JlbHU2Jyk7XG5cbiAgY29uc3QgaW5wdXRzOiBSZWx1NklucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoUmVsdTYsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCByZWx1NiA9IG9wKHtyZWx1Nl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Reverse } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Reverses a `tf.Tensor` along a specified axis.\n *\n * Also available are stricter rank-specific methods that assert that `x` is\n * of the given rank:\n *   - `tf.reverse1d`\n *   - `tf.reverse2d`\n *   - `tf.reverse3d`\n *   - `tf.reverse4d`\n *\n * Except `tf.reverse1d` (which does not have axis param), all methods have\n * same signature as this method.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n *\n * x.reverse().print();\n * ```\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * const axis = 1;\n * x.reverse(axis).print();\n * ```\n * @param x The input tensor to be reversed.\n * @param axis The set of dimensions to reverse. Must be in the\n *     range [-rank(x), rank(x)). Defaults to all axes.\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction reverse_(x, axis) {\n    const $x = convertToTensor(x, 'x', 'reverse');\n    const inputs = { x: $x };\n    const attrs = { dims: axis };\n    return ENGINE.runKernel(Reverse, inputs, attrs);\n}\nexport const reverse = op({ reverse_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUE4QixNQUFNLGlCQUFpQixDQUFDO0FBSXJFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E4Qkc7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFlLEVBQUUsSUFBc0I7SUFDekMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUMsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3RDLE1BQU0sS0FBSyxHQUFpQixFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUV6QyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE9BQU8sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtSZXZlcnNlLCBSZXZlcnNlQXR0cnMsIFJldmVyc2VJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3JgIGFsb25nIGEgc3BlY2lmaWVkIGF4aXMuXG4gKlxuICogQWxzbyBhdmFpbGFibGUgYXJlIHN0cmljdGVyIHJhbmstc3BlY2lmaWMgbWV0aG9kcyB0aGF0IGFzc2VydCB0aGF0IGB4YCBpc1xuICogb2YgdGhlIGdpdmVuIHJhbms6XG4gKiAgIC0gYHRmLnJldmVyc2UxZGBcbiAqICAgLSBgdGYucmV2ZXJzZTJkYFxuICogICAtIGB0Zi5yZXZlcnNlM2RgXG4gKiAgIC0gYHRmLnJldmVyc2U0ZGBcbiAqXG4gKiBFeGNlcHQgYHRmLnJldmVyc2UxZGAgKHdoaWNoIGRvZXMgbm90IGhhdmUgYXhpcyBwYXJhbSksIGFsbCBtZXRob2RzIGhhdmVcbiAqIHNhbWUgc2lnbmF0dXJlIGFzIHRoaXMgbWV0aG9kLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDMsIDRdKTtcbiAqXG4gKiB4LnJldmVyc2UoKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSk7XG4gKlxuICogY29uc3QgYXhpcyA9IDE7XG4gKiB4LnJldmVyc2UoYXhpcykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciB0byBiZSByZXZlcnNlZC5cbiAqIEBwYXJhbSBheGlzIFRoZSBzZXQgb2YgZGltZW5zaW9ucyB0byByZXZlcnNlLiBNdXN0IGJlIGluIHRoZVxuICogICAgIHJhbmdlIFstcmFuayh4KSwgcmFuayh4KSkuIERlZmF1bHRzIHRvIGFsbCBheGVzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiByZXZlcnNlXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUfFRlbnNvckxpa2UsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10pOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuXG4gIGNvbnN0IGlucHV0czogUmV2ZXJzZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBSZXZlcnNlQXR0cnMgPSB7ZGltczogYXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBSZXZlcnNlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlID0gb3Aoe3JldmVyc2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reverse } from './reverse';\n/**\n * Reverses a `tf.Tensor1D`.\n *\n * @param x The input tensor.\n */\nfunction reverse1d_(x) {\n    const $x = convertToTensor(x, 'x', 'reverse');\n    util.assert($x.rank === 1, () => `Error in reverse1D: x must be rank 1 but got rank ${$x.rank}.`);\n    return reverse($x, 0);\n}\nexport const reverse1d = op({ reverse1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV8xZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2VfMWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7OztHQUlHO0FBQ0gsU0FBUyxVQUFVLENBQUMsQ0FBc0I7SUFDeEMsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDOUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDYixHQUFHLEVBQUUsQ0FBQyxxREFBcUQsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDM0UsT0FBTyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXZlcnNlfSBmcm9tICcuL3JldmVyc2UnO1xuXG4vKipcbiAqIFJldmVyc2VzIGEgYHRmLlRlbnNvcjFEYC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICovXG5mdW5jdGlvbiByZXZlcnNlMWRfKHg6IFRlbnNvcjFEfFRlbnNvckxpa2UpOiBUZW5zb3IxRCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JldmVyc2UnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5yYW5rID09PSAxLFxuICAgICAgKCkgPT4gYEVycm9yIGluIHJldmVyc2UxRDogeCBtdXN0IGJlIHJhbmsgMSBidXQgZ290IHJhbmsgJHskeC5yYW5rfS5gKTtcbiAgcmV0dXJuIHJldmVyc2UoJHgsIDApO1xufVxuXG5leHBvcnQgY29uc3QgcmV2ZXJzZTFkID0gb3Aoe3JldmVyc2UxZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reverse } from './reverse';\n/**\n * Reverses a `tf.Tensor2D` along a specified axis.\n *\n * @param x The input tensor.\n * @param axis The set of dimensions to reverse. Must be in the\n *     range [-rank(x), rank(x)). Defaults to all axes.\n */\nfunction reverse2d_(x, axis) {\n    const $x = convertToTensor(x, 'x', 'reverse');\n    util.assert($x.rank === 2, () => `Error in reverse2D: x must be rank 2 but got rank ${$x.rank}.`);\n    return reverse($x, axis);\n}\nexport const reverse2d = op({ reverse2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV8yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2VfMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxDQUFzQixFQUFFLElBQXNCO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQUMscURBQXFELEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yMkR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmV2ZXJzZX0gZnJvbSAnLi9yZXZlcnNlJztcblxuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IyRGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2UyZF8oeDogVGVuc29yMkR8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcnxudW1iZXJbXSk6IFRlbnNvcjJEIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTJEOiB4IG11c3QgYmUgcmFuayAyIGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlMmQgPSBvcCh7cmV2ZXJzZTJkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reverse } from './reverse';\n/**\n * Reverses a `tf.Tensor3D` along a specified axis.\n *\n * @param x The input tensor.\n * @param axis The set of dimensions to reverse. Must be in the\n *     range [-rank(x), rank(x)). Defaults to all axes.\n */\nfunction reverse3d_(x, axis) {\n    const $x = convertToTensor(x, 'x', 'reverse');\n    util.assert($x.rank === 3, () => `Error in reverse3D: x must be rank 3 but got rank ${$x.rank}.`);\n    return reverse($x, axis);\n}\nexport const reverse3d = op({ reverse3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV8zZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2VfM2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxDQUFzQixFQUFFLElBQXNCO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQUMscURBQXFELEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yM0R9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmV2ZXJzZX0gZnJvbSAnLi9yZXZlcnNlJztcblxuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3IzRGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2UzZF8oeDogVGVuc29yM0R8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcnxudW1iZXJbXSk6IFRlbnNvcjNEIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDMsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTNEOiB4IG11c3QgYmUgcmFuayAzIGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlM2QgPSBvcCh7cmV2ZXJzZTNkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reverse } from './reverse';\n/**\n * Reverses a `tf.Tensor4D` along a specified axis.\n *\n * @param x The input tensor.\n * @param axis The set of dimensions to reverse. Must be in the\n *     range [-rank(x), rank(x)). Defaults to all axes.\n */\nfunction reverse4d_(x, axis) {\n    const $x = convertToTensor(x, 'x', 'reverse');\n    util.assert($x.rank === 4, () => `Error in reverse4D: x must be rank 4 but got rank ${$x.rank}.`);\n    return reverse($x, axis);\n}\nexport const reverse4d = op({ reverse4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV80ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3JldmVyc2VfNGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQzs7Ozs7O0dBTUc7QUFDSCxTQUFTLFVBQVUsQ0FBQyxDQUFzQixFQUFFLElBQXNCO0lBQ2hFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQUMscURBQXFELEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmV2ZXJzZX0gZnJvbSAnLi9yZXZlcnNlJztcblxuLyoqXG4gKiBSZXZlcnNlcyBhIGB0Zi5UZW5zb3I0RGAgYWxvbmcgYSBzcGVjaWZpZWQgYXhpcy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGF4aXMgVGhlIHNldCBvZiBkaW1lbnNpb25zIHRvIHJldmVyc2UuIE11c3QgYmUgaW4gdGhlXG4gKiAgICAgcmFuZ2UgWy1yYW5rKHgpLCByYW5rKHgpKS4gRGVmYXVsdHMgdG8gYWxsIGF4ZXMuXG4gKi9cbmZ1bmN0aW9uIHJldmVyc2U0ZF8oeDogVGVuc29yNER8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcnxudW1iZXJbXSk6IFRlbnNvcjREIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAncmV2ZXJzZScpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmV2ZXJzZTREOiB4IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayAkeyR4LnJhbmt9LmApO1xuICByZXR1cm4gcmV2ZXJzZSgkeCwgYXhpcyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlNGQgPSBvcCh7cmV2ZXJzZTRkX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Round } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes round of input `tf.Tensor` element-wise: `round(x)`.\n * It implements banker's rounding.\n *\n * ```js\n * const x = tf.tensor1d([.6, 1.1, -3.3]);\n *\n * x.round().print();  // or tf.round(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction round_(x) {\n    const $x = convertToTensor(x, 'x', 'round');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Round, inputs);\n}\nexport const round = op({ round_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yb3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUM1QyxNQUFNLE1BQU0sR0FBZ0IsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFFcEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7Um91bmQsIFJvdW5kSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHJvdW5kIG9mIGlucHV0IGB0Zi5UZW5zb3JgIGVsZW1lbnQtd2lzZTogYHJvdW5kKHgpYC5cbiAqIEl0IGltcGxlbWVudHMgYmFua2VyJ3Mgcm91bmRpbmcuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuM10pO1xuICpcbiAqIHgucm91bmQoKS5wcmludCgpOyAgLy8gb3IgdGYucm91bmQoeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gcm91bmRfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdyb3VuZCcpO1xuICBjb25zdCBpbnB1dHM6IFJvdW5kSW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSb3VuZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJvdW5kID0gb3Aoe3JvdW5kX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Rsqrt } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes reciprocal of square root of the input `tf.Tensor` element-wise:\n * `y = 1 / sqrt(x)`\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 4, -1]);\n *\n * x.rsqrt().print();  // or tf.rsqrt(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction rsqrt_(x) {\n    const $x = convertToTensor(x, 'x', 'rsqrt', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Rsqrt, inputs);\n}\nexport const rsqrt = op({ rsqrt_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNxcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yc3FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxLQUFLLEVBQWMsTUFBTSxpQkFBaUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLE1BQU0sQ0FBbUIsQ0FBZTtJQUMvQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdkQsTUFBTSxNQUFNLEdBQWdCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRXBDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1JzcXJ0LCBSc3FydElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyByZWNpcHJvY2FsIG9mIHNxdWFyZSByb290IG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6XG4gKiBgeSA9IDEgLyBzcXJ0KHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzEsIDIsIDQsIC0xXSk7XG4gKlxuICogeC5yc3FydCgpLnByaW50KCk7ICAvLyBvciB0Zi5yc3FydCh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiByc3FydF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3JzcXJ0JywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHM6IFJzcXJ0SW5wdXRzID0ge3g6ICR4fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChSc3FydCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCByc3FydCA9IG9wKHtyc3FydF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Selu } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes scaled exponential linear element-wise.\n *\n * `x < 0 ? scale * alpha * (exp(x) - 1) : scale * x`\n *\n * ```js\n * const x = tf.tensor1d([-1, 2, -3, 4]);\n *\n * x.selu().print();  // or tf.selu(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction selu_(x) {\n    const $x = convertToTensor(x, 'x', 'selu');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Selu, inputs);\n}\nexport const selu = op({ selu_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILFNBQVMsS0FBSyxDQUFtQixDQUFlO0lBQzlDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTNDLE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRW5DLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NlbHUsIFNlbHVJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgc2NhbGVkIGV4cG9uZW50aWFsIGxpbmVhciBlbGVtZW50LXdpc2UuXG4gKlxuICogYHggPCAwID8gc2NhbGUgKiBhbHBoYSAqIChleHAoeCkgLSAxKSA6IHNjYWxlICogeGBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFstMSwgMiwgLTMsIDRdKTtcbiAqXG4gKiB4LnNlbHUoKS5wcmludCgpOyAgLy8gb3IgdGYuc2VsdSh4KVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Jhc2ljIG1hdGgnfVxuICovXG5mdW5jdGlvbiBzZWx1XzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2VsdScpO1xuXG4gIGNvbnN0IGlucHV0czogU2VsdUlucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2VsdSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNlbHUgPSBvcCh7c2VsdV99KTtcbiJdfQ==","import { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { conv2d } from './conv2d';\nimport { depthwiseConv2d } from './depthwise_conv2d';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * 2-D convolution with separable filters.\n *\n * Performs a depthwise convolution that acts separately on channels followed\n * by a pointwise convolution that mixes channels. Note that this is\n * separability between dimensions [1, 2] and 3, not spatial separability\n * between dimensions 1 and 2.\n *\n * See\n * [https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d](\n *     https://www.tensorflow.org/api_docs/python/tf/nn/separable_conv2d)\n * for more details.\n *\n * @param x The input tensor, of rank 4 or rank 3, of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param depthwiseFilter The depthwise filter tensor, rank 4, of shape\n *     `[filterHeight, filterWidth, inChannels, channelMultiplier]`. This is\n *     the filter used in the first step.\n * @param pointwiseFilter The pointwise filter tensor, rank 4, of shape\n *     `[1, 1, inChannels * channelMultiplier, outChannels]`. This is\n *     the filter used in the second step.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`. If strides is a single number, then `strideHeight ==\n * strideWidth`.\n * @param pad The type of padding algorithm.\n *   - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *   - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *   - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n *     in which we sample input values across the height and width dimensions\n *     in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n *     number, then `dilationHeight == dilationWidth`. If it is greater than\n *     1, then all values of `strides` must be 1.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n *     \"NHWC\". Specify the data format of the input and output data. With the\n *     default format \"NHWC\", the data is stored in the order of: [batch,\n *     height, width, channels]. Only \"NHWC\" is currently supported.\n *\n * @doc {heading: 'Operations', subheading: 'Convolution'}\n */\nfunction separableConv2d_(x, depthwiseFilter, pointwiseFilter, strides, pad, dilation = [1, 1], dataFormat = 'NHWC') {\n    const $x = convertToTensor(x, 'x', 'separableConv2d');\n    const $depthwiseFilter = convertToTensor(depthwiseFilter, 'depthwiseFilter', 'separableConv2d');\n    const $pointwiseFilter = convertToTensor(pointwiseFilter, 'pointwiseFilter', 'separableConv2d');\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    if (dataFormat === 'NCHW') {\n        throw new Error('separableConv2d currently does not support dataFormat NCHW; only ' +\n            'NHWC is supported');\n    }\n    util.assert(x4D.rank === 4, () => `Error in separableConv2d: input must be rank 4, but got ` +\n        `rank ${x4D.rank}.`);\n    util.assert($depthwiseFilter.rank === 4, () => `Error in separableConv2d: depthwise filter must be rank 4, but ` +\n        `got rank ${$depthwiseFilter.rank}.`);\n    util.assert($pointwiseFilter.rank === 4, () => `Error in separableConv2d: pointwise filter must be rank 4, but ` +\n        `got rank ${$depthwiseFilter.rank}.`);\n    util.assert($pointwiseFilter.shape[0] === 1, () => `Error in separableConv2d: the first dimension of pointwise filter ` +\n        ` must be 1, but got ${$pointwiseFilter.shape[0]}.`);\n    util.assert($pointwiseFilter.shape[1] === 1, () => `Error in separableConv2d: the second dimension of pointwise ` +\n        `filter must be 1, but got ${$pointwiseFilter.shape[1]}.`);\n    const inChannels = $depthwiseFilter.shape[2];\n    const channelMultiplier = $depthwiseFilter.shape[3];\n    util.assert($pointwiseFilter.shape[2] === inChannels * channelMultiplier, () => `Error in separableConv2d: the third dimension of pointwise filter ` +\n        `must be ${inChannels * channelMultiplier}, ` +\n        `but got ${$pointwiseFilter.shape[2]}.`);\n    const depthwise = depthwiseConv2d(x4D, $depthwiseFilter, strides, pad, dataFormat, dilation);\n    const pointwiseStride = 1;\n    const res = conv2d(depthwise, $pointwiseFilter, pointwiseStride, 'valid', dataFormat);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const separableConv2d = op({ separableConv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VwYXJhYmxlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NlcGFyYWJsZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNENHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FDckIsQ0FBZSxFQUFFLGVBQW9DLEVBQ3JELGVBQW9DLEVBQUUsT0FBZ0MsRUFDdEUsR0FBbUIsRUFBRSxXQUFvQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDL0QsYUFBNEIsTUFBTTtJQUNwQyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3RELE1BQU0sZ0JBQWdCLEdBQ2xCLGVBQWUsQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztJQUMzRSxNQUFNLGdCQUFnQixHQUNsQixlQUFlLENBQUMsZUFBZSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFFM0UsSUFBSSxHQUFHLEdBQUcsRUFBYyxDQUFDO0lBQ3pCLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2pC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KiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtjb252MmR9IGZyb20gJy4vY29udjJkJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkfSBmcm9tICcuL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIDItRCBjb252b2x1dGlvbiB3aXRoIHNlcGFyYWJsZSBmaWx0ZXJzLlxuICpcbiAqIFBlcmZvcm1zIGEgZGVwdGh3aXNlIGNvbnZvbHV0aW9uIHRoYXQgYWN0cyBzZXBhcmF0ZWx5IG9uIGNoYW5uZWxzIGZvbGxvd2VkXG4gKiBieSBhIHBvaW50d2lzZSBjb252b2x1dGlvbiB0aGF0IG1peGVzIGNoYW5uZWxzLiBOb3RlIHRoYXQgdGhpcyBpc1xuICogc2VwYXJhYmlsaXR5IGJldHdlZW4gZGltZW5zaW9ucyBbMSwgMl0gYW5kIDMsIG5vdCBzcGF0aWFsIHNlcGFyYWJpbGl0eVxuICogYmV0d2VlbiBkaW1lbnNpb25zIDEgYW5kIDIuXG4gKlxuICogU2VlXG4gKiBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL3NlcGFyYWJsZV9jb252MmRdKFxuICogICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9zZXBhcmFibGVfY29udjJkKVxuICogZm9yIG1vcmUgZGV0YWlscy5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGRlcHRod2lzZUZpbHRlciBUaGUgZGVwdGh3aXNlIGZpbHRlciB0ZW5zb3IsIHJhbmsgNCwgb2Ygc2hhcGVcbiAqICAgICBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGgsIGluQ2hhbm5lbHMsIGNoYW5uZWxNdWx0aXBsaWVyXWAuIFRoaXMgaXNcbiAqICAgICB0aGUgZmlsdGVyIHVzZWQgaW4gdGhlIGZpcnN0IHN0ZXAuXG4gKiBAcGFyYW0gcG9pbnR3aXNlRmlsdGVyIFRoZSBwb2ludHdpc2UgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbMSwgMSwgaW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyLCBvdXRDaGFubmVsc11gLiBUaGlzIGlzXG4gKiAgICAgdGhlIGZpbHRlciB1c2VkIGluIHRoZSBzZWNvbmQgc3RlcC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLiBJZiBzdHJpZGVzIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09XG4gKiBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgcmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkhXQ1wiIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQ29udm9sdXRpb24nfVxuICovXG5mdW5jdGlvbiBzZXBhcmFibGVDb252MmRfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBkZXB0aHdpc2VGaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2UsXG4gICAgcG9pbnR3aXNlRmlsdGVyOiBUZW5zb3I0RHxUZW5zb3JMaWtlLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnLCBkaWxhdGlvbjogW251bWJlciwgbnVtYmVyXXxudW1iZXIgPSBbMSwgMV0sXG4gICAgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyA9ICdOSFdDJyk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzZXBhcmFibGVDb252MmQnKTtcbiAgY29uc3QgJGRlcHRod2lzZUZpbHRlciA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IoZGVwdGh3aXNlRmlsdGVyLCAnZGVwdGh3aXNlRmlsdGVyJywgJ3NlcGFyYWJsZUNvbnYyZCcpO1xuICBjb25zdCAkcG9pbnR3aXNlRmlsdGVyID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihwb2ludHdpc2VGaWx0ZXIsICdwb2ludHdpc2VGaWx0ZXInLCAnc2VwYXJhYmxlQ29udjJkJyk7XG5cbiAgbGV0IHg0RCA9ICR4IGFzIFRlbnNvcjREO1xuICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICB9XG5cbiAgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0hXJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3NlcGFyYWJsZUNvbnYyZCBjdXJyZW50bHkgZG9lcyBub3Qgc3VwcG9ydCBkYXRhRm9ybWF0IE5DSFc7IG9ubHkgJyArXG4gICAgICAgICdOSFdDIGlzIHN1cHBvcnRlZCcpO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NEQucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IGAgK1xuICAgICAgICAgIGByYW5rICR7eDRELnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRkZXB0aHdpc2VGaWx0ZXIucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IGRlcHRod2lzZSBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBgICtcbiAgICAgICAgICBgZ290IHJhbmsgJHskZGVwdGh3aXNlRmlsdGVyLnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRwb2ludHdpc2VGaWx0ZXIucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHBvaW50d2lzZSBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGJ1dCBgICtcbiAgICAgICAgICBgZ290IHJhbmsgJHskZGVwdGh3aXNlRmlsdGVyLnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMF0gPT09IDEsXG4gICAgICAoKSA9PlxuICAgICAgICAgIGBFcnJvciBpbiBzZXBhcmFibGVDb252MmQ6IHRoZSBmaXJzdCBkaW1lbnNpb24gb2YgcG9pbnR3aXNlIGZpbHRlciBgICtcbiAgICAgICAgICBgIG11c3QgYmUgMSwgYnV0IGdvdCAkeyRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMF19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMV0gPT09IDEsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gc2VwYXJhYmxlQ29udjJkOiB0aGUgc2Vjb25kIGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgYCArXG4gICAgICAgICAgYGZpbHRlciBtdXN0IGJlIDEsIGJ1dCBnb3QgJHskcG9pbnR3aXNlRmlsdGVyLnNoYXBlWzFdfS5gKTtcblxuICBjb25zdCBpbkNoYW5uZWxzID0gJGRlcHRod2lzZUZpbHRlci5zaGFwZVsyXTtcbiAgY29uc3QgY2hhbm5lbE11bHRpcGxpZXIgPSAkZGVwdGh3aXNlRmlsdGVyLnNoYXBlWzNdO1xuICB1dGlsLmFzc2VydChcbiAgICAgICRwb2ludHdpc2VGaWx0ZXIuc2hhcGVbMl0gPT09IGluQ2hhbm5lbHMgKiBjaGFubmVsTXVsdGlwbGllcixcbiAgICAgICgpID0+XG4gICAgICAgICAgYEVycm9yIGluIHNlcGFyYWJsZUNvbnYyZDogdGhlIHRoaXJkIGRpbWVuc2lvbiBvZiBwb2ludHdpc2UgZmlsdGVyIGAgK1xuICAgICAgICAgIGBtdXN0IGJlICR7aW5DaGFubmVscyAqIGNoYW5uZWxNdWx0aXBsaWVyfSwgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHskcG9pbnR3aXNlRmlsdGVyLnNoYXBlWzJdfS5gKTtcblxuICBjb25zdCBkZXB0aHdpc2UgPSBkZXB0aHdpc2VDb252MmQoXG4gICAgICB4NEQsICRkZXB0aHdpc2VGaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb24pO1xuICBjb25zdCBwb2ludHdpc2VTdHJpZGUgPSAxO1xuICBjb25zdCByZXMgPVxuICAgICAgY29udjJkKGRlcHRod2lzZSwgJHBvaW50d2lzZUZpbHRlciwgcG9pbnR3aXNlU3RyaWRlLCAndmFsaWQnLCBkYXRhRm9ybWF0KTtcblxuICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pIGFzIFQ7XG4gIH1cbiAgcmV0dXJuIHJlcyBhcyBUO1xufVxuXG5leHBvcnQgY29uc3Qgc2VwYXJhYmxlQ29udjJkID0gb3Aoe3NlcGFyYWJsZUNvbnYyZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { TensorBuffer } from '../tensor';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\n/**\n * Computes the difference between two lists of numbers.\n *\n * Given a Tensor `x` and a Tensor `y`, this operation returns a Tensor `out`\n * that represents all values that are in `x` but not in `y`. The returned\n * Tensor `out` is sorted in the same order that the numbers appear in `x`\n * (duplicates are preserved). This operation also returns a Tensor indices that\n * represents the position of each out element in `x`. In other words:\n *\n * `out[i] = x[idx[i]] for i in [0, 1, ..., out.length - 1]`\n *\n * ```js\n * const x = [1, 2, 3, 4, 5, 6];\n * const y = [1, 3, 5];\n *\n * const [out, indices] = await tf.setdiff1dAsync(x, y);\n * out.print(); // [2, 4, 6]\n * indices.print(); // [1, 3, 5]\n * ```\n *\n * @param x 1-D Tensor. Values to keep.\n * @param y 1-D Tensor. Must have the same type as x. Values to exclude in the\n *     output.\n * @returns Promise of Tensor tuple [out, indices].\n *  out: Tensor with the same type as x.\n *  indices: A Tensor of type int32.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nasync function setdiff1dAsync_(x, y) {\n    const $x = convertToTensor(x, 'x', 'setdiff1d');\n    const $y = convertToTensor(y, 'y', 'setdiff1d');\n    util.assert($x.dtype === $y.dtype, () => `x and y should have the same dtype, but got x (${$x.dtype}) and y (${$y.dtype}).`);\n    util.assert($x.rank === 1, () => `x should be 1D tensor, but got x (${$x.shape}).`);\n    util.assert($y.rank === 1, () => `y should be 1D tensor, but got y (${$y.shape}).`);\n    const xVals = await $x.data();\n    const yVals = await $y.data();\n    const ySet = new Set(yVals);\n    let outputSize = 0;\n    for (let i = 0; i < xVals.length; i++) {\n        if (!ySet.has(xVals[i])) {\n            outputSize++;\n        }\n    }\n    const buffer = new TensorBuffer([outputSize], $x.dtype);\n    const indices = new TensorBuffer([outputSize], 'int32');\n    for (let i = 0, p = 0; i < xVals.length; i++) {\n        if (!ySet.has(xVals[i])) {\n            buffer.values[p] = xVals[i];\n            indices.values[p] = i;\n            p++;\n        }\n    }\n    return [buffer.toTensor(), indices.toTensor()];\n}\nexport const setdiff1dAsync = setdiff1dAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2V0ZGlmZjFkX2FzeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2V0ZGlmZjFkX2FzeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBUyxZQUFZLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDL0MsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsS0FBSyxVQUFVLGVBQWUsQ0FDMUIsQ0FBb0IsRUFBRSxDQUFvQjtJQUM1QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNoRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVoRCxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxLQUFLLEtBQUssRUFBRSxDQUFDLEtBQUssRUFDckIsR0FBRyxFQUFFLENBQUMsa0RBQ0YsRUFBRSxDQUFDLEtBQUssWUFBWSxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUUxQyxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUU1RSxJQUFJLENBQUMsTUFBTSxDQUNQLEVBQUUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHFDQUFxQyxFQUFFLENBQUMsS0FBSyxJQUFJLENBQUMsQ0FBQztJQUU1RSxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUM5QixNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QixJQUFJLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFDbkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDdkIsVUFBVSxFQUFFLENBQUM7U0FDZDtLQUNGO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDeEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzVDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3ZCLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3RCLENBQUMsRUFBRSxDQUFDO1NBQ0w7S0FDRjtJQUNELE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvciwgVGVuc29yQnVmZmVyfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gbGlzdHMgb2YgbnVtYmVycy5cbiAqXG4gKiBHaXZlbiBhIFRlbnNvciBgeGAgYW5kIGEgVGVuc29yIGB5YCwgdGhpcyBvcGVyYXRpb24gcmV0dXJucyBhIFRlbnNvciBgb3V0YFxuICogdGhhdCByZXByZXNlbnRzIGFsbCB2YWx1ZXMgdGhhdCBhcmUgaW4gYHhgIGJ1dCBub3QgaW4gYHlgLiBUaGUgcmV0dXJuZWRcbiAqIFRlbnNvciBgb3V0YCBpcyBzb3J0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGUgbnVtYmVycyBhcHBlYXIgaW4gYHhgXG4gKiAoZHVwbGljYXRlcyBhcmUgcHJlc2VydmVkKS4gVGhpcyBvcGVyYXRpb24gYWxzbyByZXR1cm5zIGEgVGVuc29yIGluZGljZXMgdGhhdFxuICogcmVwcmVzZW50cyB0aGUgcG9zaXRpb24gb2YgZWFjaCBvdXQgZWxlbWVudCBpbiBgeGAuIEluIG90aGVyIHdvcmRzOlxuICpcbiAqIGBvdXRbaV0gPSB4W2lkeFtpXV0gZm9yIGkgaW4gWzAsIDEsIC4uLiwgb3V0Lmxlbmd0aCAtIDFdYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gWzEsIDIsIDMsIDQsIDUsIDZdO1xuICogY29uc3QgeSA9IFsxLCAzLCA1XTtcbiAqXG4gKiBjb25zdCBbb3V0LCBpbmRpY2VzXSA9IGF3YWl0IHRmLnNldGRpZmYxZEFzeW5jKHgsIHkpO1xuICogb3V0LnByaW50KCk7IC8vIFsyLCA0LCA2XVxuICogaW5kaWNlcy5wcmludCgpOyAvLyBbMSwgMywgNV1cbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IDEtRCBUZW5zb3IuIFZhbHVlcyB0byBrZWVwLlxuICogQHBhcmFtIHkgMS1EIFRlbnNvci4gTXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUgYXMgeC4gVmFsdWVzIHRvIGV4Y2x1ZGUgaW4gdGhlXG4gKiAgICAgb3V0cHV0LlxuICogQHJldHVybnMgUHJvbWlzZSBvZiBUZW5zb3IgdHVwbGUgW291dCwgaW5kaWNlc10uXG4gKiAgb3V0OiBUZW5zb3Igd2l0aCB0aGUgc2FtZSB0eXBlIGFzIHguXG4gKiAgaW5kaWNlczogQSBUZW5zb3Igb2YgdHlwZSBpbnQzMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5hc3luYyBmdW5jdGlvbiBzZXRkaWZmMWRBc3luY18oXG4gICAgeDogVGVuc29yfFRlbnNvckxpa2UsIHk6IFRlbnNvcnxUZW5zb3JMaWtlKTogUHJvbWlzZTxbVGVuc29yLCBUZW5zb3JdPiB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NldGRpZmYxZCcpO1xuICBjb25zdCAkeSA9IGNvbnZlcnRUb1RlbnNvcih5LCAneScsICdzZXRkaWZmMWQnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR4LmR0eXBlID09PSAkeS5kdHlwZSxcbiAgICAgICgpID0+IGB4IGFuZCB5IHNob3VsZCBoYXZlIHRoZSBzYW1lIGR0eXBlLCBidXQgZ290IHggKCR7XG4gICAgICAgICAgJHguZHR5cGV9KSBhbmQgeSAoJHskeS5kdHlwZX0pLmApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMSwgKCkgPT4gYHggc2hvdWxkIGJlIDFEIHRlbnNvciwgYnV0IGdvdCB4ICgkeyR4LnNoYXBlfSkuYCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeS5yYW5rID09PSAxLCAoKSA9PiBgeSBzaG91bGQgYmUgMUQgdGVuc29yLCBidXQgZ290IHkgKCR7JHkuc2hhcGV9KS5gKTtcblxuICBjb25zdCB4VmFscyA9IGF3YWl0ICR4LmRhdGEoKTtcbiAgY29uc3QgeVZhbHMgPSBhd2FpdCAkeS5kYXRhKCk7XG4gIGNvbnN0IHlTZXQgPSBuZXcgU2V0KHlWYWxzKTtcblxuICBsZXQgb3V0cHV0U2l6ZSA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoIXlTZXQuaGFzKHhWYWxzW2ldKSkge1xuICAgICAgb3V0cHV0U2l6ZSsrO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBUZW5zb3JCdWZmZXIoW291dHB1dFNpemVdLCAkeC5kdHlwZSk7XG4gIGNvbnN0IGluZGljZXMgPSBuZXcgVGVuc29yQnVmZmVyKFtvdXRwdXRTaXplXSwgJ2ludDMyJyk7XG4gIGZvciAobGV0IGkgPSAwLCBwID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgaWYgKCF5U2V0Lmhhcyh4VmFsc1tpXSkpIHtcbiAgICAgIGJ1ZmZlci52YWx1ZXNbcF0gPSB4VmFsc1tpXTtcbiAgICAgIGluZGljZXMudmFsdWVzW3BdID0gaTtcbiAgICAgIHArKztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFtidWZmZXIudG9UZW5zb3IoKSwgaW5kaWNlcy50b1RlbnNvcigpXTtcbn1cbmV4cG9ydCBjb25zdCBzZXRkaWZmMWRBc3luYyA9IHNldGRpZmYxZEFzeW5jXztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sign } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Returns an element-wise indication of the sign of a number.\n *\n * ```js\n * const x = tf.tensor1d([.6, 1.1, -3.3, NaN, 0]);\n *\n * x.sign().print();  // or tf.sign(x)\n * ```\n * @param x The input Tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sign_(x) {\n    const $x = convertToTensor(x, 'x', 'sign');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Sign, inputs);\n}\nexport const sign = op({ sign_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUNuQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTaWduLCBTaWduSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgYW4gZWxlbWVudC13aXNlIGluZGljYXRpb24gb2YgdGhlIHNpZ24gb2YgYSBudW1iZXIuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbLjYsIDEuMSwgLTMuMywgTmFOLCAwXSk7XG4gKlxuICogeC5zaWduKCkucHJpbnQoKTsgIC8vIG9yIHRmLnNpZ24oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IFRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc2lnbl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpZ24nKTtcbiAgY29uc3QgaW5wdXRzOiBTaWduSW5wdXRzID0ge3g6ICR4fTtcbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2lnbiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBzaWduID0gb3Aoe3NpZ25ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sin } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes sin of the input Tensor element-wise: `sin(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n *\n * x.sin().print();  // or tf.sin(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sin_(x) {\n    const $x = convertToTensor(x, 'x', 'sin', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Sin, inputs);\n}\nexport const sin = op({ sin_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NpbiwgU2luSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHNpbiBvZiB0aGUgaW5wdXQgVGVuc29yIGVsZW1lbnQtd2lzZTogYHNpbih4KWBcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjFkKFswLCBNYXRoLlBJIC8gMiwgTWF0aC5QSSAqIDMgLyA0XSk7XG4gKlxuICogeC5zaW4oKS5wcmludCgpOyAgLy8gb3IgdGYuc2luKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHNpbl88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NpbicsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBTaW5JbnB1dHMgPSB7eDogJHh9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNpbiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBzaW4gPSBvcCh7c2luX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Sinh } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes hyperbolic sin of the input `tf.Tensor` element-wise: `sinh(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, 1, -1, .7]);\n *\n * x.sinh().print();  // or tf.sinh(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction sinh_(x) {\n    const $x = convertToTensor(x, 'x', 'sinh');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Sinh, inputs);\n}\nexport const sinh = op({ sinh_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NpbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0saUJBQWlCLENBQUM7QUFHakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLEtBQUssQ0FBbUIsQ0FBZTtJQUM5QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUMzQyxNQUFNLE1BQU0sR0FBZSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUVuQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLE1BQThCLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTaW5oLCBTaW5oSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIGh5cGVyYm9saWMgc2luIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGBzaW5oKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIDEsIC0xLCAuN10pO1xuICpcbiAqIHguc2luaCgpLnByaW50KCk7ICAvLyBvciB0Zi5zaW5oKHgpXG4gKiBgYGBcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnQmFzaWMgbWF0aCd9XG4gKi9cbmZ1bmN0aW9uIHNpbmhfPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFR8VGVuc29yTGlrZSk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzaW5oJyk7XG4gIGNvbnN0IGlucHV0czogU2luaElucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoU2luaCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cbmV4cG9ydCBjb25zdCBzaW5oID0gb3Aoe3NpbmhffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { slice } from './slice';\n/**\n * Extracts a 1D slice from 1D array starting at coordinates `begin` and is\n * of length `size`. See `slice` for details.\n */\nfunction slice1d_(x, begin, size) {\n    const $x = convertToTensor(x, 'x', 'slice1d');\n    util.assert($x.rank === 1, () => `slice1d expects a rank-1 tensor, but got a rank-${$x.rank} tensor`);\n    return slice($x, [begin], [size]);\n}\nexport const slice1d = op({ slice1d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UxZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlMWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFzQixFQUFFLEtBQWEsRUFBRSxJQUFZO0lBQ3JELE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQ0QsbURBQW1ELEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9zbGljZSc7XG5cbi8qKlxuICogRXh0cmFjdHMgYSAxRCBzbGljZSBmcm9tIDFEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kIGlzXG4gKiBvZiBsZW5ndGggYHNpemVgLiBTZWUgYHNsaWNlYCBmb3IgZGV0YWlscy5cbiAqL1xuZnVuY3Rpb24gc2xpY2UxZF8oXG4gICAgeDogVGVuc29yMUR8VGVuc29yTGlrZSwgYmVnaW46IG51bWJlciwgc2l6ZTogbnVtYmVyKTogVGVuc29yMUQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzbGljZTFkJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMSxcbiAgICAgICgpID0+XG4gICAgICAgICAgYHNsaWNlMWQgZXhwZWN0cyBhIHJhbmstMSB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLSR7JHgucmFua30gdGVuc29yYCk7XG4gIHJldHVybiBzbGljZSgkeCwgW2JlZ2luXSwgW3NpemVdKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTFkID0gb3Aoe3NsaWNlMWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { slice } from './slice';\n/**\n * Extracts a 2D slice from a 2D array starting at coordinates `begin` and\n * is of size `size`. See `slice` for details.\n */\nfunction slice2d_(x, begin, size) {\n    const $x = convertToTensor(x, 'x', 'slice2d');\n    util.assert($x.rank === 2, () => `slice2d expects a rank-2 tensor, but got a rank-${$x.rank} tensor`);\n    return slice($x, begin, size);\n}\nexport const slice2d = op({ slice2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFzQixFQUFFLEtBQXVCLEVBQy9DLElBQXNCO0lBQ3hCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQ0QsbURBQW1ELEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcjJEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vc2xpY2UnO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgMkQgc2xpY2UgZnJvbSBhIDJEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlMmRfKFxuICAgIHg6IFRlbnNvcjJEfFRlbnNvckxpa2UsIGJlZ2luOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIHNpemU6IFtudW1iZXIsIG51bWJlcl0pOiBUZW5zb3IyRCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NsaWNlMmQnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5yYW5rID09PSAyLFxuICAgICAgKCkgPT5cbiAgICAgICAgICBgc2xpY2UyZCBleHBlY3RzIGEgcmFuay0yIHRlbnNvciwgYnV0IGdvdCBhIHJhbmstJHskeC5yYW5rfSB0ZW5zb3JgKTtcbiAgcmV0dXJuIHNsaWNlKCR4LCBiZWdpbiwgc2l6ZSk7XG59XG5leHBvcnQgY29uc3Qgc2xpY2UyZCA9IG9wKHtzbGljZTJkX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { slice } from './slice';\n/**\n * Extracts a 3D slice from a 3D array starting at coordinates `begin` and\n * is of size `size`. See `slice` for details.\n */\nfunction slice3d_(x, begin, size) {\n    const $x = convertToTensor(x, 'x', 'slice3d');\n    util.assert($x.rank === 3, () => `slice3d expects a rank-3 tensor, but got a rank-${$x.rank} tensor`);\n    return slice($x, begin, size);\n}\nexport const slice3d = op({ slice3d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UzZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlM2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFzQixFQUFFLEtBQStCLEVBQ3ZELElBQThCO0lBQ2hDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQ0QsbURBQW1ELEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcjNEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vc2xpY2UnO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgM0Qgc2xpY2UgZnJvbSBhIDNEIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlM2RfKFxuICAgIHg6IFRlbnNvcjNEfFRlbnNvckxpa2UsIGJlZ2luOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTogVGVuc29yM0Qge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzbGljZTNkJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJHgucmFuayA9PT0gMyxcbiAgICAgICgpID0+XG4gICAgICAgICAgYHNsaWNlM2QgZXhwZWN0cyBhIHJhbmstMyB0ZW5zb3IsIGJ1dCBnb3QgYSByYW5rLSR7JHgucmFua30gdGVuc29yYCk7XG4gIHJldHVybiBzbGljZSgkeCwgYmVnaW4sIHNpemUpO1xufVxuZXhwb3J0IGNvbnN0IHNsaWNlM2QgPSBvcCh7c2xpY2UzZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { slice } from './slice';\n/**\n * Extracts a 4D slice from a 4D array starting at coordinates `begin` and\n * is of size `size`. See `slice` for details.\n */\nfunction slice4d_(x, begin, size) {\n    const $x = convertToTensor(x, 'x', 'slice4d');\n    util.assert($x.rank === 4, () => `slice4d expects a rank-4 tensor, but got a rank-${$x.rank} tensor`);\n    return slice($x, begin, size);\n}\nexport const slice4d = op({ slice4d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2U0ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NsaWNlNGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5Qjs7O0dBR0c7QUFDSCxTQUFTLFFBQVEsQ0FDYixDQUFzQixFQUFFLEtBQXVDLEVBQy9ELElBQXNDO0lBQ3hDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2IsR0FBRyxFQUFFLENBQ0QsbURBQW1ELEVBQUUsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxDQUFDO0lBQzdFLE9BQU8sS0FBSyxDQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vc2xpY2UnO1xuXG4vKipcbiAqIEV4dHJhY3RzIGEgNEQgc2xpY2UgZnJvbSBhIDREIGFycmF5IHN0YXJ0aW5nIGF0IGNvb3JkaW5hdGVzIGBiZWdpbmAgYW5kXG4gKiBpcyBvZiBzaXplIGBzaXplYC4gU2VlIGBzbGljZWAgZm9yIGRldGFpbHMuXG4gKi9cbmZ1bmN0aW9uIHNsaWNlNGRfKFxuICAgIHg6IFRlbnNvcjREfFRlbnNvckxpa2UsIGJlZ2luOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBzaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IFRlbnNvcjREIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc2xpY2U0ZCcpO1xuICB1dGlsLmFzc2VydChcbiAgICAgICR4LnJhbmsgPT09IDQsXG4gICAgICAoKSA9PlxuICAgICAgICAgIGBzbGljZTRkIGV4cGVjdHMgYSByYW5rLTQgdGVuc29yLCBidXQgZ290IGEgcmFuay0keyR4LnJhbmt9IHRlbnNvcmApO1xuICByZXR1cm4gc2xpY2UoJHgsIGJlZ2luLCBzaXplKTtcbn1cbmV4cG9ydCBjb25zdCBzbGljZTRkID0gb3Aoe3NsaWNlNGRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Softmax } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes the softmax normalized vector given the logits.\n *\n * ```js\n * const a = tf.tensor1d([1, 2, 3]);\n *\n * a.softmax().print();  // or tf.softmax(a)\n * ```\n *\n * ```js\n * const a = tf.tensor2d([2, 4, 6, 1, 2, 3], [2, 3]);\n *\n * a.softmax().print();  // or tf.softmax(a)\n * ```\n *\n * @param logits The logits array.\n * @param dim The dimension softmax would be performed on. Defaults to `-1`\n *     which indicates the last dimension.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction softmax_(logits, dim = -1) {\n    const $logits = convertToTensor(logits, 'logits', 'softmax', 'float32');\n    if (dim === -1) {\n        dim = $logits.rank - 1;\n    }\n    if (dim !== $logits.rank - 1) {\n        throw Error('Softmax along a non-last dimension is not yet supported. ' +\n            `Logits was rank ${$logits.rank} and dim was ${dim}`);\n    }\n    const inputs = { logits: $logits };\n    const attrs = { dim };\n    return ENGINE.runKernel(Softmax, inputs, attrs);\n}\nexport const softmax = op({ softmax_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdG1heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NvZnRtYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUE4QixNQUFNLGlCQUFpQixDQUFDO0FBSXJFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsUUFBUSxDQUFtQixNQUFvQixFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDaEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXhFLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ2QsR0FBRyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxHQUFHLEtBQUssT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDNUIsTUFBTSxLQUFLLENBQ1AsMkRBQTJEO1lBQzNELG1CQUFtQixPQUFPLENBQUMsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUMzRDtJQUVELE1BQU0sTUFBTSxHQUFrQixFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUNoRCxNQUFNLEtBQUssR0FBaUIsRUFBQyxHQUFHLEVBQUMsQ0FBQztJQUVsQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE9BQU8sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTb2Z0bWF4LCBTb2Z0bWF4QXR0cnMsIFNvZnRtYXhJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc29mdG1heCBub3JtYWxpemVkIHZlY3RvciBnaXZlbiB0aGUgbG9naXRzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqXG4gKiBhLnNvZnRtYXgoKS5wcmludCgpOyAgLy8gb3IgdGYuc29mdG1heChhKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbMiwgNCwgNiwgMSwgMiwgM10sIFsyLCAzXSk7XG4gKlxuICogYS5zb2Z0bWF4KCkucHJpbnQoKTsgIC8vIG9yIHRmLnNvZnRtYXgoYSlcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cyBhcnJheS5cbiAqIEBwYXJhbSBkaW0gVGhlIGRpbWVuc2lvbiBzb2Z0bWF4IHdvdWxkIGJlIHBlcmZvcm1lZCBvbi4gRGVmYXVsdHMgdG8gYC0xYFxuICogICAgIHdoaWNoIGluZGljYXRlcyB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTm9ybWFsaXphdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHNvZnRtYXhfPFQgZXh0ZW5kcyBUZW5zb3I+KGxvZ2l0czogVHxUZW5zb3JMaWtlLCBkaW0gPSAtMSk6IFQge1xuICBjb25zdCAkbG9naXRzID0gY29udmVydFRvVGVuc29yKGxvZ2l0cywgJ2xvZ2l0cycsICdzb2Z0bWF4JywgJ2Zsb2F0MzInKTtcblxuICBpZiAoZGltID09PSAtMSkge1xuICAgIGRpbSA9ICRsb2dpdHMucmFuayAtIDE7XG4gIH1cbiAgaWYgKGRpbSAhPT0gJGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgICAnU29mdG1heCBhbG9uZyBhIG5vbi1sYXN0IGRpbWVuc2lvbiBpcyBub3QgeWV0IHN1cHBvcnRlZC4gJyArXG4gICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHskbG9naXRzLnJhbmt9IGFuZCBkaW0gd2FzICR7ZGltfWApO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBTb2Z0bWF4SW5wdXRzID0ge2xvZ2l0czogJGxvZ2l0c307XG4gIGNvbnN0IGF0dHJzOiBTb2Z0bWF4QXR0cnMgPSB7ZGltfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFNvZnRtYXgsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNvZnRtYXggPSBvcCh7c29mdG1heF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { FFT } from '../../kernel_names';\nimport { assert } from '../../util';\nimport { op } from '../operation';\n/**\n * Fast Fourier transform.\n *\n * Computes the 1-dimensional discrete Fourier transform over the inner-most\n * dimension of input.\n *\n * ```js\n * const real = tf.tensor1d([1, 2, 3]);\n * const imag = tf.tensor1d([1, 2, 3]);\n * const x = tf.complex(real, imag);\n *\n * x.fft().print();  // tf.spectral.fft(x).print();\n * ```\n * @param input The complex input to compute an fft over.\n *\n * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n */\nfunction fft_(input) {\n    assert(input.dtype === 'complex64', () => `The dtype for tf.spectral.fft() must be complex64 ` +\n        `but got ${input.dtype}.`);\n    const inputs = { input };\n    return ENGINE.runKernel(FFT, inputs);\n}\nexport const fft = op({ fft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3BlY3RyYWwvZmZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBR2xELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7OztHQWdCRztBQUNILFNBQVMsSUFBSSxDQUFDLEtBQWE7SUFDekIsTUFBTSxDQUNGLEtBQUssQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUMzQixHQUFHLEVBQUUsQ0FBQyxvREFBb0Q7UUFDdEQsV0FBVyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUVuQyxNQUFNLE1BQU0sR0FBYyxFQUFDLEtBQUssRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge0ZGVCwgRkZUSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi8uLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBGYXN0IEZvdXJpZXIgdHJhbnNmb3JtLlxuICpcbiAqIENvbXB1dGVzIHRoZSAxLWRpbWVuc2lvbmFsIGRpc2NyZXRlIEZvdXJpZXIgdHJhbnNmb3JtIG92ZXIgdGhlIGlubmVyLW1vc3RcbiAqIGRpbWVuc2lvbiBvZiBpbnB1dC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVhbCA9IHRmLnRlbnNvcjFkKFsxLCAyLCAzXSk7XG4gKiBjb25zdCBpbWFnID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IHggPSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpO1xuICpcbiAqIHguZmZ0KCkucHJpbnQoKTsgIC8vIHRmLnNwZWN0cmFsLmZmdCh4KS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gaW5wdXQgVGhlIGNvbXBsZXggaW5wdXQgdG8gY29tcHV0ZSBhbiBmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gZmZ0XyhpbnB1dDogVGVuc29yKTogVGVuc29yIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLFxuICAgICAgKCkgPT4gYFRoZSBkdHlwZSBmb3IgdGYuc3BlY3RyYWwuZmZ0KCkgbXVzdCBiZSBjb21wbGV4NjQgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHtpbnB1dC5kdHlwZX0uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBGRlRJbnB1dHMgPSB7aW5wdXR9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKEZGVCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGZmdCA9IG9wKHtmZnRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { IFFT } from '../../kernel_names';\nimport { assert } from '../../util';\nimport { op } from '../operation';\n/**\n * Inverse fast Fourier transform.\n *\n * Computes the inverse 1-dimensional discrete Fourier transform over the\n * inner-most dimension of input.\n *\n * ```js\n * const real = tf.tensor1d([1, 2, 3]);\n * const imag = tf.tensor1d([1, 2, 3]);\n * const x = tf.complex(real, imag);\n *\n * x.ifft().print();  // tf.spectral.ifft(x).print();\n * ```\n * @param input The complex input to compute an ifft over.\n *\n * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n */\nfunction ifft_(input) {\n    assert(input.dtype === 'complex64', () => `The dtype for tf.spectral.ifft() must be complex64 ` +\n        `but got ${input.dtype}.`);\n    const inputs = { input };\n    return ENGINE.runKernel(IFFT, inputs);\n}\nexport const ifft = op({ ifft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwZWN0cmFsL2lmZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsSUFBSSxFQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFHcEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxLQUFLLENBQUMsS0FBYTtJQUMxQixNQUFNLENBQ0YsS0FBSyxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQzNCLEdBQUcsRUFBRSxDQUFDLHFEQUFxRDtRQUN2RCxXQUFXLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBRW5DLE1BQU0sTUFBTSxHQUFlLEVBQUMsS0FBSyxFQUFDLENBQUM7SUFFbkMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxNQUE4QixDQUFDLENBQUM7QUFDaEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxFQUFFLENBQUMsRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7SUZGVCwgSUZGVElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogSW52ZXJzZSBmYXN0IEZvdXJpZXIgdHJhbnNmb3JtLlxuICpcbiAqIENvbXB1dGVzIHRoZSBpbnZlcnNlIDEtZGltZW5zaW9uYWwgZGlzY3JldGUgRm91cmllciB0cmFuc2Zvcm0gb3ZlciB0aGVcbiAqIGlubmVyLW1vc3QgZGltZW5zaW9uIG9mIGlucHV0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZWFsID0gdGYudGVuc29yMWQoWzEsIDIsIDNdKTtcbiAqIGNvbnN0IGltYWcgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgeCA9IHRmLmNvbXBsZXgocmVhbCwgaW1hZyk7XG4gKlxuICogeC5pZmZ0KCkucHJpbnQoKTsgIC8vIHRmLnNwZWN0cmFsLmlmZnQoeCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIGlucHV0IFRoZSBjb21wbGV4IGlucHV0IHRvIGNvbXB1dGUgYW4gaWZmdCBvdmVyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwZWN0cmFsJywgbmFtZXNwYWNlOiAnc3BlY3RyYWwnfVxuICovXG5mdW5jdGlvbiBpZmZ0XyhpbnB1dDogVGVuc29yKTogVGVuc29yIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQuZHR5cGUgPT09ICdjb21wbGV4NjQnLFxuICAgICAgKCkgPT4gYFRoZSBkdHlwZSBmb3IgdGYuc3BlY3RyYWwuaWZmdCgpIG11c3QgYmUgY29tcGxleDY0IGAgK1xuICAgICAgICAgIGBidXQgZ290ICR7aW5wdXQuZHR5cGV9LmApO1xuXG4gIGNvbnN0IGlucHV0czogSUZGVElucHV0cyA9IHtpbnB1dH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoSUZGVCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IGlmZnQgPSBvcCh7aWZmdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { complex } from '../complex';\nimport { concat } from '../concat';\nimport { imag } from '../imag';\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { real } from '../real';\nimport { reshape } from '../reshape';\nimport { reverse } from '../reverse';\nimport { scalar } from '../scalar';\nimport { slice } from '../slice';\nimport { ifft } from './ifft';\n/**\n * Inversed real value input fast Fourier transform.\n *\n * Computes the 1-dimensional inversed discrete Fourier transform over the\n * inner-most dimension of the real input.\n *\n * ```js\n * const real = tf.tensor1d([1, 2, 3]);\n * const imag = tf.tensor1d([0, 0, 0]);\n * const x = tf.complex(real, imag);\n *\n * x.irfft().print();\n * ```\n * @param input The real value input to compute an irfft over.\n *\n * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n */\nfunction irfft_(input) {\n    const innerDimensionSize = input.shape[input.shape.length - 1];\n    const batch = input.size / innerDimensionSize;\n    let ret;\n    if (innerDimensionSize <= 2) {\n        const complexInput = reshape(input, [batch, innerDimensionSize]);\n        ret = ifft(complexInput);\n    }\n    else {\n        // The length of unique components of the DFT of a real-valued signal\n        // is 2 * (input_len - 1)\n        const outputShape = [batch, 2 * (innerDimensionSize - 1)];\n        const realInput = reshape(real(input), [batch, innerDimensionSize]);\n        const imagInput = reshape(imag(input), [batch, innerDimensionSize]);\n        const realConjugate = reverse(slice(realInput, [0, 1], [batch, innerDimensionSize - 2]), 1);\n        const imagConjugate = mul(reverse(slice(imagInput, [0, 1], [batch, innerDimensionSize - 2]), 1), scalar(-1));\n        const r = concat([realInput, realConjugate], 1);\n        const i = concat([imagInput, imagConjugate], 1);\n        const complexInput = reshape(complex(r, i), [outputShape[0], outputShape[1]]);\n        ret = ifft(complexInput);\n    }\n    ret = real(ret);\n    // reshape the result if the input is 3D tensor.\n    if (input.rank === 3 && input.shape[0] !== 0) {\n        const temp = ret;\n        const batch = input.shape[0];\n        ret = reshape(ret, [batch, ret.shape[0] / batch, ret.shape[1]]);\n        temp.dispose();\n    }\n    return ret;\n}\nexport const irfft = op({ irfft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXJmZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGVjdHJhbC9pcmZmdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRS9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUI7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxTQUFTLE1BQU0sQ0FBQyxLQUFhO0lBQzNCLE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQzlDLElBQUksR0FBVyxDQUFDO0lBQ2hCLElBQUksa0JBQWtCLElBQUksQ0FBQyxFQUFFO1FBQzNCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEdBQUcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDMUI7U0FBTTtRQUNMLHFFQUFxRTtRQUNyRSx5QkFBeUI7UUFDekIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxHQUFHLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLGtCQUFrQixDQUFDLENBQUMsQ0FBQztRQUVwRSxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sYUFBYSxHQUFhLEdBQUcsQ0FDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDckUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoQixNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sWUFBWSxHQUNkLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsR0FBRyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUMxQjtJQUNELEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEIsZ0RBQWdEO0lBQ2hELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDNUMsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0IsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ2hCO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLCBUZW5zb3IyRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi4vY29tcGxleCc7XG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi4vY29uY2F0JztcbmltcG9ydCB7aW1hZ30gZnJvbSAnLi4vaW1hZyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4uL3JlYWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9yZXNoYXBlJztcbmltcG9ydCB7cmV2ZXJzZX0gZnJvbSAnLi4vcmV2ZXJzZSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4uL3NsaWNlJztcblxuaW1wb3J0IHtpZmZ0fSBmcm9tICcuL2lmZnQnO1xuXG4vKipcbiAqIEludmVyc2VkIHJlYWwgdmFsdWUgaW5wdXQgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBpbnZlcnNlZCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZVxuICogaW5uZXItbW9zdCBkaW1lbnNpb24gb2YgdGhlIHJlYWwgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICogY29uc3QgaW1hZyA9IHRmLnRlbnNvcjFkKFswLCAwLCAwXSk7XG4gKiBjb25zdCB4ID0gdGYuY29tcGxleChyZWFsLCBpbWFnKTtcbiAqXG4gKiB4LmlyZmZ0KCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIGlucHV0IFRoZSByZWFsIHZhbHVlIGlucHV0IHRvIGNvbXB1dGUgYW4gaXJmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gaXJmZnRfKGlucHV0OiBUZW5zb3IpOiBUZW5zb3Ige1xuICBjb25zdCBpbm5lckRpbWVuc2lvblNpemUgPSBpbnB1dC5zaGFwZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuICBsZXQgcmV0OiBUZW5zb3I7XG4gIGlmIChpbm5lckRpbWVuc2lvblNpemUgPD0gMikge1xuICAgIGNvbnN0IGNvbXBsZXhJbnB1dCA9IHJlc2hhcGUoaW5wdXQsIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplXSk7XG4gICAgcmV0ID0gaWZmdChjb21wbGV4SW5wdXQpO1xuICB9IGVsc2Uge1xuICAgIC8vIFRoZSBsZW5ndGggb2YgdW5pcXVlIGNvbXBvbmVudHMgb2YgdGhlIERGVCBvZiBhIHJlYWwtdmFsdWVkIHNpZ25hbFxuICAgIC8vIGlzIDIgKiAoaW5wdXRfbGVuIC0gMSlcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFtiYXRjaCwgMiAqIChpbm5lckRpbWVuc2lvblNpemUgLSAxKV07XG4gICAgY29uc3QgcmVhbElucHV0ID0gcmVzaGFwZShyZWFsKGlucHV0KSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdKTtcbiAgICBjb25zdCBpbWFnSW5wdXQgPSByZXNoYXBlKGltYWcoaW5wdXQpLCBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV0pO1xuXG4gICAgY29uc3QgcmVhbENvbmp1Z2F0ZSA9XG4gICAgICAgIHJldmVyc2Uoc2xpY2UocmVhbElucHV0LCBbMCwgMV0sIFtiYXRjaCwgaW5uZXJEaW1lbnNpb25TaXplIC0gMl0pLCAxKTtcbiAgICBjb25zdCBpbWFnQ29uanVnYXRlOiBUZW5zb3IyRCA9IG11bChcbiAgICAgICAgcmV2ZXJzZShzbGljZShpbWFnSW5wdXQsIFswLCAxXSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemUgLSAyXSksIDEpLFxuICAgICAgICBzY2FsYXIoLTEpKTtcblxuICAgIGNvbnN0IHIgPSBjb25jYXQoW3JlYWxJbnB1dCwgcmVhbENvbmp1Z2F0ZV0sIDEpO1xuICAgIGNvbnN0IGkgPSBjb25jYXQoW2ltYWdJbnB1dCwgaW1hZ0Nvbmp1Z2F0ZV0sIDEpO1xuICAgIGNvbnN0IGNvbXBsZXhJbnB1dCA9XG4gICAgICAgIHJlc2hhcGUoY29tcGxleChyLCBpKSwgW291dHB1dFNoYXBlWzBdLCBvdXRwdXRTaGFwZVsxXV0pO1xuICAgIHJldCA9IGlmZnQoY29tcGxleElucHV0KTtcbiAgfVxuICByZXQgPSByZWFsKHJldCk7XG4gIC8vIHJlc2hhcGUgdGhlIHJlc3VsdCBpZiB0aGUgaW5wdXQgaXMgM0QgdGVuc29yLlxuICBpZiAoaW5wdXQucmFuayA9PT0gMyAmJiBpbnB1dC5zaGFwZVswXSAhPT0gMCkge1xuICAgIGNvbnN0IHRlbXAgPSByZXQ7XG4gICAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaGFwZVswXTtcbiAgICByZXQgPSByZXNoYXBlKHJldCwgW2JhdGNoLCByZXQuc2hhcGVbMF0gLyBiYXRjaCwgcmV0LnNoYXBlWzFdXSk7XG4gICAgdGVtcC5kaXNwb3NlKCk7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuZXhwb3J0IGNvbnN0IGlyZmZ0ID0gb3Aoe2lyZmZ0X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SplitV } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Splits a `tf.Tensor` into sub tensors.\n *\n * If `numOrSizeSplits` is a number, splits `x` along dimension `axis`\n * into `numOrSizeSplits` smaller tensors.\n * Requires that `numOrSizeSplits` evenly divides `x.shape[axis]`.\n *\n * If `numOrSizeSplits` is a number array, splits `x` into\n * `numOrSizeSplits.length` pieces. The shape of the `i`-th piece has the\n * same size as `x` except along dimension `axis` where the size is\n * `numOrSizeSplits[i]`.\n *\n * ```js\n * const x = tf.tensor2d([1, 2, 3, 4, 5, 6, 7, 8], [2, 4]);\n * const [a, b] = tf.split(x, 2, 1);\n * a.print();\n * b.print();\n *\n * const [c, d, e] = tf.split(x, [1, 2, 1], 1);\n * c.print();\n * d.print();\n * e.print();\n * ```\n *\n * @param x The input tensor to split.\n * @param numOrSizeSplits Either an integer indicating the number of\n * splits along the axis or an array of integers containing the sizes of\n * each output tensor along the axis. If a number then it must evenly divide\n * `x.shape[axis]`; otherwise the sum of sizes must match `x.shape[axis]`.\n * Can contain one -1 indicating that dimension is to be inferred.\n * @param axis The dimension along which to split. Defaults to 0 (the first\n * dim).\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction split_(x, numOrSizeSplits, axis = 0) {\n    const $x = convertToTensor(x, 'x', 'split');\n    const inputs = { x: $x };\n    const attr = { numOrSizeSplits, axis };\n    return ENGINE.runKernel(SplitV, inputs, attr);\n}\nexport const split = op({ split_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQTRCLE1BQU0saUJBQWlCLENBQUM7QUFJbEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25ELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQ0c7QUFDSCxTQUFTLE1BQU0sQ0FDWCxDQUFvQixFQUFFLGVBQWdDLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDbEUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUMsTUFBTSxNQUFNLEdBQWlCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3JDLE1BQU0sSUFBSSxHQUFnQixFQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUVsRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ1osTUFBTSxFQUFFLE1BQThCLEVBQ3RDLElBQTBCLENBQWMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3BsaXRWLCBTcGxpdFZBdHRycywgU3BsaXRWSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogU3BsaXRzIGEgYHRmLlRlbnNvcmAgaW50byBzdWIgdGVuc29ycy5cbiAqXG4gKiBJZiBgbnVtT3JTaXplU3BsaXRzYCBpcyBhIG51bWJlciwgc3BsaXRzIGB4YCBhbG9uZyBkaW1lbnNpb24gYGF4aXNgXG4gKiBpbnRvIGBudW1PclNpemVTcGxpdHNgIHNtYWxsZXIgdGVuc29ycy5cbiAqIFJlcXVpcmVzIHRoYXQgYG51bU9yU2l6ZVNwbGl0c2AgZXZlbmx5IGRpdmlkZXMgYHguc2hhcGVbYXhpc11gLlxuICpcbiAqIElmIGBudW1PclNpemVTcGxpdHNgIGlzIGEgbnVtYmVyIGFycmF5LCBzcGxpdHMgYHhgIGludG9cbiAqIGBudW1PclNpemVTcGxpdHMubGVuZ3RoYCBwaWVjZXMuIFRoZSBzaGFwZSBvZiB0aGUgYGlgLXRoIHBpZWNlIGhhcyB0aGVcbiAqIHNhbWUgc2l6ZSBhcyBgeGAgZXhjZXB0IGFsb25nIGRpbWVuc2lvbiBgYXhpc2Agd2hlcmUgdGhlIHNpemUgaXNcbiAqIGBudW1PclNpemVTcGxpdHNbaV1gLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDhdLCBbMiwgNF0pO1xuICogY29uc3QgW2EsIGJdID0gdGYuc3BsaXQoeCwgMiwgMSk7XG4gKiBhLnByaW50KCk7XG4gKiBiLnByaW50KCk7XG4gKlxuICogY29uc3QgW2MsIGQsIGVdID0gdGYuc3BsaXQoeCwgWzEsIDIsIDFdLCAxKTtcbiAqIGMucHJpbnQoKTtcbiAqIGQucHJpbnQoKTtcbiAqIGUucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gc3BsaXQuXG4gKiBAcGFyYW0gbnVtT3JTaXplU3BsaXRzIEVpdGhlciBhbiBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIG51bWJlciBvZlxuICogc3BsaXRzIGFsb25nIHRoZSBheGlzIG9yIGFuIGFycmF5IG9mIGludGVnZXJzIGNvbnRhaW5pbmcgdGhlIHNpemVzIG9mXG4gKiBlYWNoIG91dHB1dCB0ZW5zb3IgYWxvbmcgdGhlIGF4aXMuIElmIGEgbnVtYmVyIHRoZW4gaXQgbXVzdCBldmVubHkgZGl2aWRlXG4gKiBgeC5zaGFwZVtheGlzXWA7IG90aGVyd2lzZSB0aGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggYHguc2hhcGVbYXhpc11gLlxuICogQ2FuIGNvbnRhaW4gb25lIC0xIGluZGljYXRpbmcgdGhhdCBkaW1lbnNpb24gaXMgdG8gYmUgaW5mZXJyZWQuXG4gKiBAcGFyYW0gYXhpcyBUaGUgZGltZW5zaW9uIGFsb25nIHdoaWNoIHRvIHNwbGl0LiBEZWZhdWx0cyB0byAwICh0aGUgZmlyc3RcbiAqIGRpbSkuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnU2xpY2luZyBhbmQgSm9pbmluZyd9XG4gKi9cbmZ1bmN0aW9uIHNwbGl0XzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgbnVtT3JTaXplU3BsaXRzOiBudW1iZXJbXXxudW1iZXIsIGF4aXMgPSAwKTogVFtdIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnc3BsaXQnKTtcblxuICBjb25zdCBpbnB1dHM6IFNwbGl0VklucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHI6IFNwbGl0VkF0dHJzID0ge251bU9yU2l6ZVNwbGl0cywgYXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgU3BsaXRWLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgYXR0ciBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIHt9IGFzIFRbXTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwbGl0ID0gb3Aoe3NwbGl0X30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assert } from '../../util';\nimport { complex } from '../complex';\nimport { concat } from '../concat';\nimport { imag } from '../imag';\nimport { op } from '../operation';\nimport { real } from '../real';\nimport { reshape } from '../reshape';\nimport { slice } from '../slice';\nimport { split } from '../split';\nimport { zeros } from '../zeros';\nimport { zerosLike } from '../zeros_like';\nimport { fft } from './fft';\n/**\n * Real value input fast Fourier transform.\n *\n * Computes the 1-dimensional discrete Fourier transform over the\n * inner-most dimension of the real input.\n *\n * ```js\n * const real = tf.tensor1d([1, 2, 3]);\n *\n * real.rfft().print();\n * ```\n * @param input The real value input to compute an rfft over.\n *\n * @doc {heading: 'Operations', subheading: 'Spectral', namespace: 'spectral'}\n */\nfunction rfft_(input, fftLength) {\n    assert(input.dtype === 'float32', () => `The dtype for rfft() must be real value but got ${input.dtype}`);\n    let innerDimensionSize = input.shape[input.shape.length - 1];\n    const batch = input.size / innerDimensionSize;\n    let adjustedInput;\n    if (fftLength != null && fftLength < innerDimensionSize) {\n        // Need to crop\n        const begin = input.shape.map(v => 0);\n        const size = input.shape.map(v => v);\n        size[input.shape.length - 1] = fftLength;\n        adjustedInput = slice(input, begin, size);\n        innerDimensionSize = fftLength;\n    }\n    else if (fftLength != null && fftLength > innerDimensionSize) {\n        // Need to pad with zeros\n        const zerosShape = input.shape.map(v => v);\n        zerosShape[input.shape.length - 1] = fftLength - innerDimensionSize;\n        adjustedInput = concat([input, zeros(zerosShape)], input.shape.length - 1);\n        innerDimensionSize = fftLength;\n    }\n    else {\n        adjustedInput = input;\n    }\n    // Complement the input with zero imaginary numbers.\n    const zerosInput = zerosLike(adjustedInput);\n    const complexInput = reshape(complex(adjustedInput, zerosInput), [batch, innerDimensionSize]);\n    const ret = fft(complexInput);\n    // Exclude complex conjugations. These conjugations are put symmetrically.\n    const half = Math.floor(innerDimensionSize / 2) + 1;\n    const realValues = real(ret);\n    const imagValues = imag(ret);\n    const realComplexConjugate = split(realValues, [half, innerDimensionSize - half], realValues.shape.length - 1);\n    const imagComplexConjugate = split(imagValues, [half, innerDimensionSize - half], imagValues.shape.length - 1);\n    const outputShape = adjustedInput.shape.slice();\n    outputShape[adjustedInput.shape.length - 1] = half;\n    return reshape(complex(realComplexConjugate[0], imagComplexConjugate[0]), outputShape);\n}\nexport const rfft = op({ rfft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwZWN0cmFsL3JmZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXhDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUI7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLEtBQUssQ0FBQyxLQUFhLEVBQUUsU0FBa0I7SUFDOUMsTUFBTSxDQUNGLEtBQUssQ0FBQyxLQUFLLEtBQUssU0FBUyxFQUN6QixHQUFHLEVBQUUsQ0FBQyxtREFBbUQsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFFNUUsSUFBSSxrQkFBa0IsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFD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QUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4uL2NvbXBsZXgnO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4uL2NvbmNhdCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4uL2ltYWcnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVhbH0gZnJvbSAnLi4vcmVhbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHtzcGxpdH0gZnJvbSAnLi4vc3BsaXQnO1xuaW1wb3J0IHt6ZXJvc30gZnJvbSAnLi4vemVyb3MnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL3plcm9zX2xpa2UnO1xuXG5pbXBvcnQge2ZmdH0gZnJvbSAnLi9mZnQnO1xuXG4vKipcbiAqIFJlYWwgdmFsdWUgaW5wdXQgZmFzdCBGb3VyaWVyIHRyYW5zZm9ybS5cbiAqXG4gKiBDb21wdXRlcyB0aGUgMS1kaW1lbnNpb25hbCBkaXNjcmV0ZSBGb3VyaWVyIHRyYW5zZm9ybSBvdmVyIHRoZVxuICogaW5uZXItbW9zdCBkaW1lbnNpb24gb2YgdGhlIHJlYWwgaW5wdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlYWwgPSB0Zi50ZW5zb3IxZChbMSwgMiwgM10pO1xuICpcbiAqIHJlYWwucmZmdCgpLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dCBUaGUgcmVhbCB2YWx1ZSBpbnB1dCB0byBjb21wdXRlIGFuIHJmZnQgb3Zlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTcGVjdHJhbCcsIG5hbWVzcGFjZTogJ3NwZWN0cmFsJ31cbiAqL1xuZnVuY3Rpb24gcmZmdF8oaW5wdXQ6IFRlbnNvciwgZmZ0TGVuZ3RoPzogbnVtYmVyKTogVGVuc29yIHtcbiAgYXNzZXJ0KFxuICAgICAgaW5wdXQuZHR5cGUgPT09ICdmbG9hdDMyJyxcbiAgICAgICgpID0+IGBUaGUgZHR5cGUgZm9yIHJmZnQoKSBtdXN0IGJlIHJlYWwgdmFsdWUgYnV0IGdvdCAke2lucHV0LmR0eXBlfWApO1xuXG4gIGxldCBpbm5lckRpbWVuc2lvblNpemUgPSBpbnB1dC5zaGFwZVtpbnB1dC5zaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3QgYmF0Y2ggPSBpbnB1dC5zaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuXG4gIGxldCBhZGp1c3RlZElucHV0OiBUZW5zb3I7XG4gIGlmIChmZnRMZW5ndGggIT0gbnVsbCAmJiBmZnRMZW5ndGggPCBpbm5lckRpbWVuc2lvblNpemUpIHtcbiAgICAvLyBOZWVkIHRvIGNyb3BcbiAgICBjb25zdCBiZWdpbiA9IGlucHV0LnNoYXBlLm1hcCh2ID0+IDApO1xuICAgIGNvbnN0IHNpemUgPSBpbnB1dC5zaGFwZS5tYXAodiA9PiB2KTtcbiAgICBzaXplW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdID0gZmZ0TGVuZ3RoO1xuICAgIGFkanVzdGVkSW5wdXQgPSBzbGljZShpbnB1dCwgYmVnaW4sIHNpemUpO1xuICAgIGlubmVyRGltZW5zaW9uU2l6ZSA9IGZmdExlbmd0aDtcbiAgfSBlbHNlIGlmIChmZnRMZW5ndGggIT0gbnVsbCAmJiBmZnRMZW5ndGggPiBpbm5lckRpbWVuc2lvblNpemUpIHtcbiAgICAvLyBOZWVkIHRvIHBhZCB3aXRoIHplcm9zXG4gICAgY29uc3QgemVyb3NTaGFwZSA9IGlucHV0LnNoYXBlLm1hcCh2ID0+IHYpO1xuICAgIHplcm9zU2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV0gPSBmZnRMZW5ndGggLSBpbm5lckRpbWVuc2lvblNpemU7XG4gICAgYWRqdXN0ZWRJbnB1dCA9IGNvbmNhdChbaW5wdXQsIHplcm9zKHplcm9zU2hhcGUpXSwgaW5wdXQuc2hhcGUubGVuZ3RoIC0gMSk7XG4gICAgaW5uZXJEaW1lbnNpb25TaXplID0gZmZ0TGVuZ3RoO1xuICB9IGVsc2Uge1xuICAgIGFkanVzdGVkSW5wdXQgPSBpbnB1dDtcbiAgfVxuXG4gIC8vIENvbXBsZW1lbnQgdGhlIGlucHV0IHdpdGggemVybyBpbWFnaW5hcnkgbnVtYmVycy5cbiAgY29uc3QgemVyb3NJbnB1dCA9IHplcm9zTGlrZShhZGp1c3RlZElucHV0KTtcbiAgY29uc3QgY29tcGxleElucHV0ID1cbiAgICAgIHJlc2hhcGUoY29tcGxleChhZGp1c3RlZElucHV0LCB6ZXJvc0lucHV0KSwgW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdKTtcblxuICBjb25zdCByZXQgPSBmZnQoY29tcGxleElucHV0KTtcblxuICAvLyBFeGNsdWRlIGNvbXBsZXggY29uanVnYXRpb25zLiBUaGVzZSBjb25qdWdhdGlvbnMgYXJlIHB1dCBzeW1tZXRyaWNhbGx5LlxuICBjb25zdCBoYWxmID0gTWF0aC5mbG9vcihpbm5lckRpbWVuc2lvblNpemUgLyAyKSArIDE7XG4gIGNvbnN0IHJlYWxWYWx1ZXMgPSByZWFsKHJldCk7XG4gIGNvbnN0IGltYWdWYWx1ZXMgPSBpbWFnKHJldCk7XG4gIGNvbnN0IHJlYWxDb21wbGV4Q29uanVnYXRlID0gc3BsaXQoXG4gICAgICByZWFsVmFsdWVzLCBbaGFsZiwgaW5uZXJEaW1lbnNpb25TaXplIC0gaGFsZl0sXG4gICAgICByZWFsVmFsdWVzLnNoYXBlLmxlbmd0aCAtIDEpO1xuICBjb25zdCBpbWFnQ29tcGxleENvbmp1Z2F0ZSA9IHNwbGl0KFxuICAgICAgaW1hZ1ZhbHVlcywgW2hhbGYsIGlubmVyRGltZW5zaW9uU2l6ZSAtIGhhbGZdLFxuICAgICAgaW1hZ1ZhbHVlcy5zaGFwZS5sZW5ndGggLSAxKTtcblxuICBjb25zdCBvdXRwdXRTaGFwZSA9IGFkanVzdGVkSW5wdXQuc2hhcGUuc2xpY2UoKTtcbiAgb3V0cHV0U2hhcGVbYWRqdXN0ZWRJbnB1dC5zaGFwZS5sZW5ndGggLSAxXSA9IGhhbGY7XG5cbiAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICBjb21wbGV4KHJlYWxDb21wbGV4Q29uanVnYXRlWzBdLCBpbWFnQ29tcGxleENvbmp1Z2F0ZVswXSksIG91dHB1dFNoYXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJmZnQgPSBvcCh7cmZmdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SquaredDifference } from '../kernel_names';\nimport { makeTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assertAndGetBroadcastShape } from './broadcast_util';\nimport { op } from './operation';\n/**\n * Returns (a - b) * (a - b) element-wise.\n * Supports broadcasting.\n *\n * ```js\n * const a = tf.tensor1d([1, 4, 3, 16]);\n * const b = tf.tensor1d([1, 2, 9, 4]);\n *\n * a.squaredDifference(b).print();  // or tf.squaredDifference(a, b)\n * ```\n *\n * ```js\n * // Broadcast squared difference  a with b.\n * const a = tf.tensor1d([2, 4, 6, 8]);\n * const b = tf.scalar(5);\n *\n * a.squaredDifference(b).print();  // or tf.squaredDifference(a, b)\n * ```\n *\n * @param a The first tensor.\n * @param b The second tensor. Must have the same type as `a`.\n *\n * @doc {heading: 'Operations', subheading: 'Arithmetic'}\n */\nfunction squaredDifference_(a, b) {\n    let $a = convertToTensor(a, 'a', 'squaredDifference');\n    let $b = convertToTensor(b, 'b', 'squaredDifference');\n    [$a, $b] = makeTypesMatch($a, $b);\n    assertAndGetBroadcastShape($a.shape, $b.shape);\n    const inputs = { a: $a, b: $b };\n    const attrs = {};\n    return ENGINE.runKernel(SquaredDifference, inputs, attrs);\n}\nexport const squaredDifference = op({ squaredDifference_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1YXJlZF9kaWZmZXJlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3F1YXJlZF9kaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLGlCQUFpQixFQUEwQixNQUFNLGlCQUFpQixDQUFDO0FBRzNFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHbkQsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDNUQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0F1Qkc7QUFDSCxTQUFTLGtCQUFrQixDQUN2QixDQUFvQixFQUFFLENBQW9CO0lBQzVDLElBQUksRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDdEQsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN0RCxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsR0FBRyxjQUFjLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRWxDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRS9DLE1BQU0sTUFBTSxHQUE0QixFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUVqQixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLGlCQUFpQixFQUFFLE1BQW1DLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGtCQUFrQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NxdWFyZWREaWZmZXJlbmNlLCBTcXVhcmVkRGlmZmVyZW5jZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGV9IGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFJldHVybnMgKGEgLSBiKSAqIChhIC0gYikgZWxlbWVudC13aXNlLlxuICogU3VwcG9ydHMgYnJvYWRjYXN0aW5nLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDQsIDMsIDE2XSk7XG4gKiBjb25zdCBiID0gdGYudGVuc29yMWQoWzEsIDIsIDksIDRdKTtcbiAqXG4gKiBhLnNxdWFyZWREaWZmZXJlbmNlKGIpLnByaW50KCk7ICAvLyBvciB0Zi5zcXVhcmVkRGlmZmVyZW5jZShhLCBiKVxuICogYGBgXG4gKlxuICogYGBganNcbiAqIC8vIEJyb2FkY2FzdCBzcXVhcmVkIGRpZmZlcmVuY2UgIGEgd2l0aCBiLlxuICogY29uc3QgYSA9IHRmLnRlbnNvcjFkKFsyLCA0LCA2LCA4XSk7XG4gKiBjb25zdCBiID0gdGYuc2NhbGFyKDUpO1xuICpcbiAqIGEuc3F1YXJlZERpZmZlcmVuY2UoYikucHJpbnQoKTsgIC8vIG9yIHRmLnNxdWFyZWREaWZmZXJlbmNlKGEsIGIpXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgdGVuc29yLlxuICogQHBhcmFtIGIgVGhlIHNlY29uZCB0ZW5zb3IuIE11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIGBhYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdBcml0aG1ldGljJ31cbiAqL1xuZnVuY3Rpb24gc3F1YXJlZERpZmZlcmVuY2VfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICBsZXQgJGEgPSBjb252ZXJ0VG9UZW5zb3IoYSwgJ2EnLCAnc3F1YXJlZERpZmZlcmVuY2UnKTtcbiAgbGV0ICRiID0gY29udmVydFRvVGVuc29yKGIsICdiJywgJ3NxdWFyZWREaWZmZXJlbmNlJyk7XG4gIFskYSwgJGJdID0gbWFrZVR5cGVzTWF0Y2goJGEsICRiKTtcblxuICBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSgkYS5zaGFwZSwgJGIuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0czogU3F1YXJlZERpZmZlcmVuY2VJbnB1dHMgPSB7YTogJGEsIGI6ICRifTtcbiAgY29uc3QgYXR0cnMgPSB7fTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFNxdWFyZWREaWZmZXJlbmNlLCBpbnB1dHMgYXMgdW5rbm93biBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMpO1xufVxuXG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2UgPSBvcCh7c3F1YXJlZERpZmZlcmVuY2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { squeezeShape } from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Removes dimensions of size 1 from the shape of a `tf.Tensor`.\n *\n * ```js\n * const x = tf.tensor([1, 2, 3, 4], [1, 1, 4]);\n * x.squeeze().print();\n * ```\n *\n * @param x The input tensor to be squeezed.\n * @param axis An optional list of numbers. If specified, only\n *     squeezes the dimensions listed. The dimension index starts at 0. It\n * is an error to squeeze a dimension that is not 1.\n *\n * @doc {heading: 'Tensors', subheading: 'Transformations'}\n */\nfunction squeeze_(x, axis) {\n    const $x = convertToTensor(x, 'x', 'squeeze', 'string_or_numeric');\n    return reshape($x, squeezeShape($x.shape, axis).newShape);\n}\nexport const squeeze = op({ squeeze_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1ZWV6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NxdWVlemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRW5ELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFckMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxRQUFRLENBQW1CLENBQW9CLEVBQUUsSUFBZTtJQUN2RSxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUNuRSxPQUFPLE9BQU8sQ0FBQyxFQUFFLEVBQUUsWUFBWSxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFNLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge3NxdWVlemVTaGFwZX0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuLyoqXG4gKiBSZW1vdmVzIGRpbWVuc2lvbnMgb2Ygc2l6ZSAxIGZyb20gdGhlIHNoYXBlIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IoWzEsIDIsIDMsIDRdLCBbMSwgMSwgNF0pO1xuICogeC5zcXVlZXplKCkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgc3F1ZWV6ZWQuXG4gKiBAcGFyYW0gYXhpcyBBbiBvcHRpb25hbCBsaXN0IG9mIG51bWJlcnMuIElmIHNwZWNpZmllZCwgb25seVxuICogICAgIHNxdWVlemVzIHRoZSBkaW1lbnNpb25zIGxpc3RlZC4gVGhlIGRpbWVuc2lvbiBpbmRleCBzdGFydHMgYXQgMC4gSXRcbiAqIGlzIGFuIGVycm9yIHRvIHNxdWVlemUgYSBkaW1lbnNpb24gdGhhdCBpcyBub3QgMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdUcmFuc2Zvcm1hdGlvbnMnfVxuICovXG5mdW5jdGlvbiBzcXVlZXplXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcltdKTogVCB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3NxdWVlemUnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgcmV0dXJuIHJlc2hhcGUoJHgsIHNxdWVlemVTaGFwZSgkeC5zaGFwZSwgYXhpcykubmV3U2hhcGUpIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBzcXVlZXplID0gb3Aoe3NxdWVlemVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Pack } from '../kernel_names';\nimport { convertToTensorArray } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Stacks a list of rank-`R` `tf.Tensor`s into one rank-`(R+1)` `tf.Tensor`.\n *\n * ```js\n * const a = tf.tensor1d([1, 2]);\n * const b = tf.tensor1d([3, 4]);\n * const c = tf.tensor1d([5, 6]);\n * tf.stack([a, b, c]).print();\n * ```\n *\n * @param tensors A list of tensor objects with the same shape and dtype.\n * @param axis The axis to stack along. Defaults to 0 (the first dim).\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction stack_(tensors, axis = 0) {\n    const $tensors = convertToTensorArray(tensors, 'tensors', 'stack', 'string_or_numeric');\n    util.assert($tensors.length >= 1, () => 'Pass at least one tensor to tf.stack');\n    if ($tensors.length > 0) {\n        util.assert(axis <= $tensors[0].rank, () => 'Axis must be <= rank of the tensor');\n    }\n    const inputs = $tensors;\n    const attrs = { axis };\n    return ENGINE.runKernel(Pack, inputs, attrs);\n}\nexport const stack = op({ stack_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQXdCLE1BQU0saUJBQWlCLENBQUM7QUFJNUQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFeEQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILFNBQVMsTUFBTSxDQUNYLE9BQTRCLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDeEMsTUFBTSxRQUFRLEdBQ1Ysb0JBQW9CLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUUzRSxJQUFJLENBQUMsTUFBTSxDQUNQLFFBQVEsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFeEUsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLG9DQUFvQyxDQUFDLENBQUM7S0FDM0U7SUFFRCxNQUFNLE1BQU0sR0FBZSxRQUFRLENBQUM7SUFDcEMsTUFBTSxLQUFLLEdBQWMsRUFBQyxJQUFJLEVBQUMsQ0FBQztJQUVoQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLElBQUksRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtQYWNrLCBQYWNrQXR0cnMsIFBhY2tJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yQXJyYXl9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBTdGFja3MgYSBsaXN0IG9mIHJhbmstYFJgIGB0Zi5UZW5zb3JgcyBpbnRvIG9uZSByYW5rLWAoUisxKWAgYHRmLlRlbnNvcmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IxZChbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjFkKFszLCA0XSk7XG4gKiBjb25zdCBjID0gdGYudGVuc29yMWQoWzUsIDZdKTtcbiAqIHRmLnN0YWNrKFthLCBiLCBjXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEEgbGlzdCBvZiB0ZW5zb3Igb2JqZWN0cyB3aXRoIHRoZSBzYW1lIHNoYXBlIGFuZCBkdHlwZS5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHN0YWNrIGFsb25nLiBEZWZhdWx0cyB0byAwICh0aGUgZmlyc3QgZGltKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RhY2tfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRlbnNvcnM6IEFycmF5PFR8VGVuc29yTGlrZT4sIGF4aXMgPSAwKTogVGVuc29yIHtcbiAgY29uc3QgJHRlbnNvcnMgPVxuICAgICAgY29udmVydFRvVGVuc29yQXJyYXkodGVuc29ycywgJ3RlbnNvcnMnLCAnc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR0ZW5zb3JzLmxlbmd0aCA+PSAxLCAoKSA9PiAnUGFzcyBhdCBsZWFzdCBvbmUgdGVuc29yIHRvIHRmLnN0YWNrJyk7XG5cbiAgaWYgKCR0ZW5zb3JzLmxlbmd0aCA+IDApIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgYXhpcyA8PSAkdGVuc29yc1swXS5yYW5rLCAoKSA9PiAnQXhpcyBtdXN0IGJlIDw9IHJhbmsgb2YgdGhlIHRlbnNvcicpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBQYWNrSW5wdXRzID0gJHRlbnNvcnM7XG4gIGNvbnN0IGF0dHJzOiBQYWNrQXR0cnMgPSB7YXhpc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBQYWNrLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBzdGFjayA9IG9wKHtzdGFja199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Step } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes step of the input `tf.Tensor` element-wise: `x > 0 ? 1 : alpha * x`\n *\n * ```js\n * const x = tf.tensor1d([0, 2, -1, -3]);\n *\n * x.step(.5).print();  // or tf.step(x, .5)\n * ```\n * @param x The input tensor.\n * @param alpha The gradient when input is negative.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction step_(x, alpha = 0.0) {\n    const $x = convertToTensor(x, 'x', 'step');\n    const inputs = { x: $x };\n    const attrs = { alpha };\n    return ENGINE.runKernel(Step, inputs, attrs);\n}\nexport const step = op({ step_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7R0FZRztBQUNILFNBQVMsS0FBSyxDQUFtQixDQUFlLEVBQUUsS0FBSyxHQUFHLEdBQUc7SUFDM0QsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFM0MsTUFBTSxNQUFNLEdBQWUsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDbkMsTUFBTSxLQUFLLEdBQWMsRUFBQyxLQUFLLEVBQUMsQ0FBQztJQUVqQyxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLElBQUksRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtTdGVwLCBTdGVwQXR0cnMsIFN0ZXBJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyBzdGVwIG9mIHRoZSBpbnB1dCBgdGYuVGVuc29yYCBlbGVtZW50LXdpc2U6IGB4ID4gMCA/IDEgOiBhbHBoYSAqIHhgXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMCwgMiwgLTEsIC0zXSk7XG4gKlxuICogeC5zdGVwKC41KS5wcmludCgpOyAgLy8gb3IgdGYuc3RlcCh4LCAuNSlcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBhbHBoYSBUaGUgZ3JhZGllbnQgd2hlbiBpbnB1dCBpcyBuZWdhdGl2ZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gc3RlcF88VCBleHRlbmRzIFRlbnNvcj4oeDogVHxUZW5zb3JMaWtlLCBhbHBoYSA9IDAuMCk6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdGVwJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBTdGVwSW5wdXRzID0ge3g6ICR4fTtcbiAgY29uc3QgYXR0cnM6IFN0ZXBBdHRycyA9IHthbHBoYX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBTdGVwLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG59XG5leHBvcnQgY29uc3Qgc3RlcCA9IG9wKHtzdGVwX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { StridedSlice } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Extracts a strided slice of a tensor.\n *\n * Roughly speaking, this op extracts a slice of size (end-begin)/stride from\n * the given input tensor (x). Starting at the location specified by begin the\n * slice continues by adding stride to the index until all dimensions are not\n * less than end. Note that a stride can be negative, which causes a reverse\n * slice.\n *\n * ```js\n * const t = tf.tensor3d([1, 1, 1 ,2, 2, 2, 3, 3, 3, 4, 4, 4, 5, 5, 5, 6, 6, 6],\n *    [3, 2, 3]);\n * t.stridedSlice([1, 0, 0], [2, 1, 3], [1, 1, 1]).print()  // [[[3, 3, 3]]]\n * t.stridedSlice([1, 0, 0], [2, 2, 3], [1, 1, 1]).print()  // [[[3, 3, 3],\n *                                                     // [4, 4, 4]]]\n * t.stridedSlice([1, -1, 0], [2, -3, 3], [1, -1, 1]).print() // [[[4, 4, 4],\n *                                                     // [3, 3, 3]]]\n * ```\n *\n * @param x The tensor to stride slice.\n * @param begin The coordinates to start the slice from.\n * @param end: The coordinates to end the slice at.\n * @param strides: The size of the slice.\n * @param beginMask: If the ith bit of beginMask is set, begin[i] is ignored\n *      and the fullest possible range in that dimension is used instead.\n * @param endMask: If the ith bit of endMask is set, end[i] is ignored\n *      and the fullest possible range in that dimension is used instead.\n * @param shrinkAxisMask: a bitmask where bit i implies that\n * the ith specification should shrink the dimensionality. begin and end must\n * imply a slice of size 1 in the dimension.\n *\n * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n */\nfunction stridedSlice_(x, begin, end, strides, beginMask = 0, endMask = 0, ellipsisMask = 0, newAxisMask = 0, shrinkAxisMask = 0) {\n    const $x = convertToTensor(x, 'x', 'stridedSlice', 'string_or_numeric');\n    const inputs = { x: $x };\n    const attrs = {\n        begin,\n        end,\n        strides,\n        beginMask,\n        endMask,\n        ellipsisMask,\n        newAxisMask,\n        shrinkAxisMask\n    };\n    return ENGINE.runKernel(StridedSlice, inputs, attrs);\n}\nexport const stridedSlice = op({ stridedSlice_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWRlZF9zbGljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3N0cmlkZWRfc2xpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsWUFBWSxFQUF3QyxNQUFNLGlCQUFpQixDQUFDO0FBSXBGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWdDRztBQUNILFNBQVMsYUFBYSxDQUNsQixDQUFvQixFQUFFLEtBQWUsRUFBRSxHQUFhLEVBQUUsT0FBa0IsRUFDeEUsU0FBUyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxFQUFFLFlBQVksR0FBRyxDQUFDLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFDN0QsY0FBYyxHQUFHLENBQUM7SUFDcEIsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFFeEUsTUFBTSxNQUFNLEdBQXVCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQzNDLE1BQU0sS0FBSyxHQUFzQjtRQUMvQixLQUFLO1FBQ0wsR0FBRztRQUNILE9BQU87UUFDUCxTQUFTO1FBQ1QsT0FBTztRQUNQLFlBQVk7UUFDWixXQUFXO1FBQ1gsY0FBYztLQUNmLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLFlBQVksRUFBRSxNQUE4QixFQUM1QyxLQUEyQixDQUFDLENBQUM7QUFDbkMsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUMsRUFBQyxhQUFhLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U3RyaWRlZFNsaWNlLCBTdHJpZGVkU2xpY2VBdHRycywgU3RyaWRlZFNsaWNlSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogRXh0cmFjdHMgYSBzdHJpZGVkIHNsaWNlIG9mIGEgdGVuc29yLlxuICpcbiAqIFJvdWdobHkgc3BlYWtpbmcsIHRoaXMgb3AgZXh0cmFjdHMgYSBzbGljZSBvZiBzaXplIChlbmQtYmVnaW4pL3N0cmlkZSBmcm9tXG4gKiB0aGUgZ2l2ZW4gaW5wdXQgdGVuc29yICh4KS4gU3RhcnRpbmcgYXQgdGhlIGxvY2F0aW9uIHNwZWNpZmllZCBieSBiZWdpbiB0aGVcbiAqIHNsaWNlIGNvbnRpbnVlcyBieSBhZGRpbmcgc3RyaWRlIHRvIHRoZSBpbmRleCB1bnRpbCBhbGwgZGltZW5zaW9ucyBhcmUgbm90XG4gKiBsZXNzIHRoYW4gZW5kLiBOb3RlIHRoYXQgYSBzdHJpZGUgY2FuIGJlIG5lZ2F0aXZlLCB3aGljaCBjYXVzZXMgYSByZXZlcnNlXG4gKiBzbGljZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgdCA9IHRmLnRlbnNvcjNkKFsxLCAxLCAxICwyLCAyLCAyLCAzLCAzLCAzLCA0LCA0LCA0LCA1LCA1LCA1LCA2LCA2LCA2XSxcbiAqICAgIFszLCAyLCAzXSk7XG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAxLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXV1dXG4gKiB0LnN0cmlkZWRTbGljZShbMSwgMCwgMF0sIFsyLCAyLCAzXSwgWzEsIDEsIDFdKS5wcmludCgpICAvLyBbW1szLCAzLCAzXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbNCwgNCwgNF1dXVxuICogdC5zdHJpZGVkU2xpY2UoWzEsIC0xLCAwXSwgWzIsIC0zLCAzXSwgWzEsIC0xLCAxXSkucHJpbnQoKSAvLyBbW1s0LCA0LCA0XSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBbMywgMywgM11dXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBzdHJpZGUgc2xpY2UuXG4gKiBAcGFyYW0gYmVnaW4gVGhlIGNvb3JkaW5hdGVzIHRvIHN0YXJ0IHRoZSBzbGljZSBmcm9tLlxuICogQHBhcmFtIGVuZDogVGhlIGNvb3JkaW5hdGVzIHRvIGVuZCB0aGUgc2xpY2UgYXQuXG4gKiBAcGFyYW0gc3RyaWRlczogVGhlIHNpemUgb2YgdGhlIHNsaWNlLlxuICogQHBhcmFtIGJlZ2luTWFzazogSWYgdGhlIGl0aCBiaXQgb2YgYmVnaW5NYXNrIGlzIHNldCwgYmVnaW5baV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIGVuZE1hc2s6IElmIHRoZSBpdGggYml0IG9mIGVuZE1hc2sgaXMgc2V0LCBlbmRbaV0gaXMgaWdub3JlZFxuICogICAgICBhbmQgdGhlIGZ1bGxlc3QgcG9zc2libGUgcmFuZ2UgaW4gdGhhdCBkaW1lbnNpb24gaXMgdXNlZCBpbnN0ZWFkLlxuICogQHBhcmFtIHNocmlua0F4aXNNYXNrOiBhIGJpdG1hc2sgd2hlcmUgYml0IGkgaW1wbGllcyB0aGF0XG4gKiB0aGUgaXRoIHNwZWNpZmljYXRpb24gc2hvdWxkIHNocmluayB0aGUgZGltZW5zaW9uYWxpdHkuIGJlZ2luIGFuZCBlbmQgbXVzdFxuICogaW1wbHkgYSBzbGljZSBvZiBzaXplIDEgaW4gdGhlIGRpbWVuc2lvbi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RyaWRlZFNsaWNlXyhcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgYmVnaW46IG51bWJlcltdLCBlbmQ6IG51bWJlcltdLCBzdHJpZGVzPzogbnVtYmVyW10sXG4gICAgYmVnaW5NYXNrID0gMCwgZW5kTWFzayA9IDAsIGVsbGlwc2lzTWFzayA9IDAsIG5ld0F4aXNNYXNrID0gMCxcbiAgICBzaHJpbmtBeGlzTWFzayA9IDApOiBUZW5zb3Ige1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdzdHJpZGVkU2xpY2UnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcblxuICBjb25zdCBpbnB1dHM6IFN0cmlkZWRTbGljZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBTdHJpZGVkU2xpY2VBdHRycyA9IHtcbiAgICBiZWdpbixcbiAgICBlbmQsXG4gICAgc3RyaWRlcyxcbiAgICBiZWdpbk1hc2ssXG4gICAgZW5kTWFzayxcbiAgICBlbGxpcHNpc01hc2ssXG4gICAgbmV3QXhpc01hc2ssXG4gICAgc2hyaW5rQXhpc01hc2tcbiAgfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFN0cmlkZWRTbGljZSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmlkZWRTbGljZSA9IG9wKHtzdHJpZGVkU2xpY2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Tan } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Computes tan of the input `tf.Tensor` element-wise, `tan(x)`\n *\n * ```js\n * const x = tf.tensor1d([0, Math.PI / 2, Math.PI * 3 / 4]);\n *\n * x.tan().print();  // or tf.tan(x)\n * ```\n * @param x The input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Basic math'}\n */\nfunction tan_(x) {\n    const $x = convertToTensor(x, 'x', 'tan', 'float32');\n    const inputs = { x: $x };\n    return ENGINE.runKernel(Tan, inputs);\n}\nexport const tan = op({ tan_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7OztHQVdHO0FBQ0gsU0FBUyxJQUFJLENBQW1CLENBQWU7SUFDN0MsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXJELE1BQU0sTUFBTSxHQUFjLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBRWxDLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLEVBQUMsSUFBSSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RhbiwgVGFuSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRhbiBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgZWxlbWVudC13aXNlLCBgdGFuKHgpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMWQoWzAsIE1hdGguUEkgLyAyLCBNYXRoLlBJICogMyAvIDRdKTtcbiAqXG4gKiB4LnRhbigpLnByaW50KCk7ICAvLyBvciB0Zi50YW4oeClcbiAqIGBgYFxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdCYXNpYyBtYXRoJ31cbiAqL1xuZnVuY3Rpb24gdGFuXzxUIGV4dGVuZHMgVGVuc29yPih4OiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndGFuJywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHM6IFRhbklucHV0cyA9IHt4OiAkeH07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoVGFuLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXApO1xufVxuZXhwb3J0IGNvbnN0IHRhbiA9IG9wKHt0YW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-1 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor1d` as it makes the code more readable.\n *\n * ```js\n * tf.tensor1d([1, 2, 3]).print();\n * ```\n *\n * @param values The values of the tensor. Can be array of numbers,\n *     or a `TypedArray`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor1d(values, dtype) {\n    assertNonNull(values);\n    const inferredShape = inferShape(values, dtype);\n    if (inferredShape.length !== 1) {\n        throw new Error('tensor1d() requires values to be a flat/TypedArray');\n    }\n    const shape = null;\n    return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yMWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3IxZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FBQyxNQUFvQixFQUFFLEtBQWdCO0lBQzdELGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsTUFBTSxLQUFLLEdBQWEsSUFBSSxDQUFDO0lBQzdCLE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBYSxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2luZmVyU2hhcGV9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2UxRH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnROb25OdWxsfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7bWFrZVRlbnNvcn0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgcmFuay0xIGB0Zi5UZW5zb3JgIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcywgc2hhcGUgYW5kIGR0eXBlLlxuICpcbiAqIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGFjaGlldmVkIHdpdGggYHRmLnRlbnNvcmAsIGJ1dCBpbiBnZW5lcmFsXG4gKiB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLnRlbnNvcjFkYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi50ZW5zb3IxZChbMSwgMiwgM10pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvci4gQ2FuIGJlIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBgVHlwZWRBcnJheWAuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IxZCh2YWx1ZXM6IFRlbnNvckxpa2UxRCwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvcjFEIHtcbiAgYXNzZXJ0Tm9uTnVsbCh2YWx1ZXMpO1xuICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IxZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBhIGZsYXQvVHlwZWRBcnJheScpO1xuICB9XG4gIGNvbnN0IHNoYXBlOiBudW1iZXJbXSA9IG51bGw7XG4gIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSBhcyBUZW5zb3IxRDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-2 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor2d` as it makes the code more readable.\n *\n *  ```js\n * // Pass a nested array.\n * tf.tensor2d([[1, 2], [3, 4]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor2d([1, 2, 3, 4], [2, 2]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n *     or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. If not provided, it is inferred from\n *     `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor2d(values, shape, dtype) {\n    assertNonNull(values);\n    if (shape != null && shape.length !== 2) {\n        throw new Error('tensor2d() requires shape to have two numbers');\n    }\n    const inferredShape = inferShape(values, dtype);\n    if (inferredShape.length !== 2 && inferredShape.length !== 1) {\n        throw new Error('tensor2d() requires values to be number[][] or flat/TypedArray');\n    }\n    if (inferredShape.length === 1 && shape == null) {\n        throw new Error('tensor2d() requires shape to be provided when `values` ' +\n            'are a flat/TypedArray');\n    }\n    return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yMmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3IyZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUFFLEtBQXdCLEVBQzlDLEtBQWdCO0lBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsZ0VBQWdFLENBQUMsQ0FBQztLQUN2RTtJQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCx1QkFBdUIsQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFhLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IyRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZTJEfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydE5vbk51bGx9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHttYWtlVGVuc29yfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlcyByYW5rLTIgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yMmRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yMmQoW1sxLCAyXSwgWzMsIDRdXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNF0sIFsyLCAyXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gSWYgbm90IHByb3ZpZGVkLCBpdCBpcyBpbmZlcnJlZCBmcm9tXG4gKiAgICAgYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3IyZChcbiAgICB2YWx1ZXM6IFRlbnNvckxpa2UyRCwgc2hhcGU/OiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3IyRCB7XG4gIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgaWYgKHNoYXBlICE9IG51bGwgJiYgc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3IyZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgdHdvIG51bWJlcnMnKTtcbiAgfVxuICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAyICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGVuc29yMmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgfVxuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RlbnNvcjJkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgJ2FyZSBhIGZsYXQvVHlwZWRBcnJheScpO1xuICB9XG4gIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSBhcyBUZW5zb3IyRDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-4 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor4d` as it makes the code more readable.\n *\n *  ```js\n * // Pass a nested array.\n * tf.tensor4d([[[[1], [2]], [[3], [4]]]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor4d([1, 2, 3, 4], [1, 2, 2, 1]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n *     or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. Optional. If not provided,\n *   it is inferred from `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor4d(values, shape, dtype) {\n    assertNonNull(values);\n    if (shape != null && shape.length !== 4) {\n        throw new Error('tensor4d() requires shape to have four numbers');\n    }\n    const inferredShape = inferShape(values, dtype);\n    if (inferredShape.length !== 4 && inferredShape.length !== 1) {\n        throw new Error('tensor4d() requires values to be number[][][][] or flat/TypedArray');\n    }\n    if (inferredShape.length === 1 && shape == null) {\n        throw new Error('tensor4d() requires shape to be provided when `values` ' +\n            'are a flat array');\n    }\n    return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yNGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3I0ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUFFLEtBQXdDLEVBQzlELEtBQWdCO0lBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsb0VBQW9FLENBQUMsQ0FBQztLQUMzRTtJQUNELElBQUksYUFBYSxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUMvQyxNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCxrQkFBa0IsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFhLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZTREfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydE5vbk51bGx9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHttYWtlVGVuc29yfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlcyByYW5rLTQgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yNGRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yNGQoW1tbWzFdLCBbMl1dLCBbWzNdLCBbNF1dXV0pLnByaW50KCk7XG4gKiBgYGBcbiAqIGBgYGpzXG4gKiAvLyBQYXNzIGEgZmxhdCBhcnJheSBhbmQgc3BlY2lmeSBhIHNoYXBlLlxuICogdGYudGVuc29yNGQoWzEsIDIsIDMsIDRdLCBbMSwgMiwgMiwgMV0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSB2YWx1ZXMgb2YgdGhlIHRlbnNvci4gQ2FuIGJlIG5lc3RlZCBhcnJheSBvZiBudW1iZXJzLFxuICogICAgIG9yIGEgZmxhdCBhcnJheSwgb3IgYSBgVHlwZWRBcnJheWAuXG4gKiBAcGFyYW0gc2hhcGUgVGhlIHNoYXBlIG9mIHRoZSB0ZW5zb3IuIE9wdGlvbmFsLiBJZiBub3QgcHJvdmlkZWQsXG4gKiAgIGl0IGlzIGluZmVycmVkIGZyb20gYHZhbHVlc2AuXG4gKiBAcGFyYW0gZHR5cGUgVGhlIGRhdGEgdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0ZW5zb3I0ZChcbiAgICB2YWx1ZXM6IFRlbnNvckxpa2U0RCwgc2hhcGU/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yNEQge1xuICBhc3NlcnROb25OdWxsKHZhbHVlcyk7XG4gIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNGQoKSByZXF1aXJlcyBzaGFwZSB0byBoYXZlIGZvdXIgbnVtYmVycycpO1xuICB9XG4gIGNvbnN0IGluZmVycmVkU2hhcGUgPSBpbmZlclNoYXBlKHZhbHVlcywgZHR5cGUpO1xuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDQgJiYgaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0ZW5zb3I0ZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSBudW1iZXJbXVtdW11bXSBvciBmbGF0L1R5cGVkQXJyYXknKTtcbiAgfVxuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ3RlbnNvcjRkKCkgcmVxdWlyZXMgc2hhcGUgdG8gYmUgcHJvdmlkZWQgd2hlbiBgdmFsdWVzYCAnICtcbiAgICAgICAgJ2FyZSBhIGZsYXQgYXJyYXknKTtcbiAgfVxuICByZXR1cm4gbWFrZVRlbnNvcih2YWx1ZXMsIHNoYXBlLCBpbmZlcnJlZFNoYXBlLCBkdHlwZSkgYXMgVGVuc29yNEQ7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-5 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor5d` as it makes the code more readable.\n *\n *  ```js\n * // Pass a nested array.\n * tf.tensor5d([[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor5d([1, 2, 3, 4, 5, 6, 7, 8], [1, 2, 2, 2, 1]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n *     or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. Optional. If not provided,\n *   it is inferred from `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor5d(values, shape, dtype) {\n    assertNonNull(values);\n    if (shape != null && shape.length !== 5) {\n        throw new Error('tensor5d() requires shape to have five numbers');\n    }\n    const inferredShape = inferShape(values, dtype);\n    if (inferredShape.length !== 5 && inferredShape.length !== 1) {\n        throw new Error('tensor5d() requires values to be ' +\n            'number[][][][][] or flat/TypedArray');\n    }\n    if (inferredShape.length === 1 && shape == null) {\n        throw new Error('tensor5d() requires shape to be provided when `values` ' +\n            'are a flat array');\n    }\n    return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yNWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3I1ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUFFLEtBQWdELEVBQ3RFLEtBQWdCO0lBQ2xCLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN0QixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxnREFBZ0QsQ0FBQyxDQUFDO0tBQ25FO0lBQ0QsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQzVELE1BQU0sSUFBSSxLQUFLLENBQ1gsbUNBQW1DO1lBQ25DLHFDQUFxQyxDQUFDLENBQUM7S0FDNUM7SUFDRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7UUFDL0MsTUFBTSxJQUFJLEtBQUssQ0FDWCx5REFBeUQ7WUFDekQsa0JBQWtCLENBQUMsQ0FBQztLQUN6QjtJQUNELE9BQU8sVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBYSxDQUFDO0FBQ3JFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2luZmVyU2hhcGV9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2U1RH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtEYXRhVHlwZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnROb25OdWxsfSBmcm9tICcuLi91dGlsJztcbmltcG9ydCB7bWFrZVRlbnNvcn0gZnJvbSAnLi90ZW5zb3Jfb3BzX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgcmFuay01IGB0Zi5UZW5zb3JgIHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlcywgc2hhcGUgYW5kIGR0eXBlLlxuICpcbiAqIFRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIGFjaGlldmVkIHdpdGggYHRmLnRlbnNvcmAsIGJ1dCBpbiBnZW5lcmFsXG4gKiB3ZSByZWNvbW1lbmQgdXNpbmcgYHRmLnRlbnNvcjVkYCBhcyBpdCBtYWtlcyB0aGUgY29kZSBtb3JlIHJlYWRhYmxlLlxuICpcbiAqICBgYGBqc1xuICogLy8gUGFzcyBhIG5lc3RlZCBhcnJheS5cbiAqIHRmLnRlbnNvcjVkKFtbW1tbMV0sWzJdXSxbWzNdLFs0XV1dLFtbWzVdLFs2XV0sW1s3XSxbOF1dXV1dKS5wcmludCgpO1xuICogYGBgXG4gKiBgYGBqc1xuICogLy8gUGFzcyBhIGZsYXQgYXJyYXkgYW5kIHNwZWNpZnkgYSBzaGFwZS5cbiAqIHRmLnRlbnNvcjVkKFsxLCAyLCAzLCA0LCA1LCA2LCA3LCA4XSwgWzEsIDIsIDIsIDIsIDFdKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IuIENhbiBiZSBuZXN0ZWQgYXJyYXkgb2YgbnVtYmVycyxcbiAqICAgICBvciBhIGZsYXQgYXJyYXksIG9yIGEgYFR5cGVkQXJyYXlgLlxuICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgdGVuc29yLiBPcHRpb25hbC4gSWYgbm90IHByb3ZpZGVkLFxuICogICBpdCBpcyBpbmZlcnJlZCBmcm9tIGB2YWx1ZXNgLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ3JlYXRpb24nfVxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVuc29yNWQoXG4gICAgdmFsdWVzOiBUZW5zb3JMaWtlNUQsIHNoYXBlPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yNUQge1xuICBhc3NlcnROb25OdWxsKHZhbHVlcyk7XG4gIGlmIChzaGFwZSAhPSBudWxsICYmIHNoYXBlLmxlbmd0aCAhPT0gNSkge1xuICAgIHRocm93IG5ldyBFcnJvcigndGVuc29yNWQoKSByZXF1aXJlcyBzaGFwZSB0byBoYXZlIGZpdmUgbnVtYmVycycpO1xuICB9XG4gIGNvbnN0IGluZmVycmVkU2hhcGUgPSBpbmZlclNoYXBlKHZhbHVlcywgZHR5cGUpO1xuICBpZiAoaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDUgJiYgaW5mZXJyZWRTaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0ZW5zb3I1ZCgpIHJlcXVpcmVzIHZhbHVlcyB0byBiZSAnICtcbiAgICAgICAgJ251bWJlcltdW11bXVtdW10gb3IgZmxhdC9UeXBlZEFycmF5Jyk7XG4gIH1cbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0ZW5zb3I1ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICdhcmUgYSBmbGF0IGFycmF5Jyk7XG4gIH1cbiAgcmV0dXJuIG1ha2VUZW5zb3IodmFsdWVzLCBzaGFwZSwgaW5mZXJyZWRTaGFwZSwgZHR5cGUpIGFzIFRlbnNvcjVEO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { inferShape } from '../tensor_util_env';\nimport { assertNonNull } from '../util';\nimport { makeTensor } from './tensor_ops_util';\n/**\n * Creates rank-6 `tf.Tensor` with the provided values, shape and dtype.\n *\n * The same functionality can be achieved with `tf.tensor`, but in general\n * we recommend using `tf.tensor6d` as it makes the code more readable.\n *\n *  ```js\n * // Pass a nested array.\n * tf.tensor6d([[[[[[1],[2]],[[3],[4]]],[[[5],[6]],[[7],[8]]]]]]).print();\n * ```\n * ```js\n * // Pass a flat array and specify a shape.\n * tf.tensor6d([1, 2, 3, 4, 5, 6, 7, 8], [1, 1, 2, 2, 2, 1]).print();\n * ```\n *\n * @param values The values of the tensor. Can be nested array of numbers,\n *     or a flat array, or a `TypedArray`.\n * @param shape The shape of the tensor. Optional. If not provided,\n *   it is inferred from `values`.\n * @param dtype The data type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function tensor6d(values, shape, dtype) {\n    assertNonNull(values);\n    if (shape != null && shape.length !== 6) {\n        throw new Error('tensor6d() requires shape to have six numbers');\n    }\n    const inferredShape = inferShape(values, dtype);\n    if (inferredShape.length !== 6 && inferredShape.length !== 1) {\n        throw new Error('tensor6d() requires values to be number[][][][][][] or ' +\n            'flat/TypedArray');\n    }\n    if (inferredShape.length === 1 && shape == null) {\n        throw new Error('tensor6d() requires shape to be provided when `values` ' +\n            'are a flat array');\n    }\n    shape = shape ||\n        inferredShape;\n    return makeTensor(values, shape, inferredShape, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yNmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy90ZW5zb3I2ZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHOUMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUN0QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FzQkc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFvQixFQUNwQixLQUF3RCxFQUN4RCxLQUFnQjtJQUNsQixhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEIsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztLQUNsRTtJQUNELE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM1RCxNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtZQUN6RCxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxhQUFhLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ1gseURBQXlEO1lBQ3pELGtCQUFrQixDQUFDLENBQUM7S0FDekI7SUFDRCxLQUFLLEdBQUcsS0FBSztRQUNULGFBQWlFLENBQUM7SUFDdEUsT0FBTyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsS0FBSyxDQUFhLENBQUM7QUFDckUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3I2RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7aW5mZXJTaGFwZX0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZTZEfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge0RhdGFUeXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydE5vbk51bGx9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHttYWtlVGVuc29yfSBmcm9tICcuL3RlbnNvcl9vcHNfdXRpbCc7XG5cbi8qKlxuICogQ3JlYXRlcyByYW5rLTYgYHRmLlRlbnNvcmAgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWVzLCBzaGFwZSBhbmQgZHR5cGUuXG4gKlxuICogVGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBjYW4gYmUgYWNoaWV2ZWQgd2l0aCBgdGYudGVuc29yYCwgYnV0IGluIGdlbmVyYWxcbiAqIHdlIHJlY29tbWVuZCB1c2luZyBgdGYudGVuc29yNmRgIGFzIGl0IG1ha2VzIHRoZSBjb2RlIG1vcmUgcmVhZGFibGUuXG4gKlxuICogIGBgYGpzXG4gKiAvLyBQYXNzIGEgbmVzdGVkIGFycmF5LlxuICogdGYudGVuc29yNmQoW1tbW1tbMV0sWzJdXSxbWzNdLFs0XV1dLFtbWzVdLFs2XV0sW1s3XSxbOF1dXV1dXSkucHJpbnQoKTtcbiAqIGBgYFxuICogYGBganNcbiAqIC8vIFBhc3MgYSBmbGF0IGFycmF5IGFuZCBzcGVjaWZ5IGEgc2hhcGUuXG4gKiB0Zi50ZW5zb3I2ZChbMSwgMiwgMywgNCwgNSwgNiwgNywgOF0sIFsxLCAxLCAyLCAyLCAyLCAxXSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB2YWx1ZXMgVGhlIHZhbHVlcyBvZiB0aGUgdGVuc29yLiBDYW4gYmUgbmVzdGVkIGFycmF5IG9mIG51bWJlcnMsXG4gKiAgICAgb3IgYSBmbGF0IGFycmF5LCBvciBhIGBUeXBlZEFycmF5YC5cbiAqIEBwYXJhbSBzaGFwZSBUaGUgc2hhcGUgb2YgdGhlIHRlbnNvci4gT3B0aW9uYWwuIElmIG5vdCBwcm92aWRlZCxcbiAqICAgaXQgaXMgaW5mZXJyZWQgZnJvbSBgdmFsdWVzYC5cbiAqIEBwYXJhbSBkdHlwZSBUaGUgZGF0YSB0eXBlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRlbnNvcjZkKFxuICAgIHZhbHVlczogVGVuc29yTGlrZTZELFxuICAgIHNoYXBlPzogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3I2RCB7XG4gIGFzc2VydE5vbk51bGwodmFsdWVzKTtcbiAgaWYgKHNoYXBlICE9IG51bGwgJiYgc2hhcGUubGVuZ3RoICE9PSA2KSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd0ZW5zb3I2ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGhhdmUgc2l4IG51bWJlcnMnKTtcbiAgfVxuICBjb25zdCBpbmZlcnJlZFNoYXBlID0gaW5mZXJTaGFwZSh2YWx1ZXMsIGR0eXBlKTtcbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSA2ICYmIGluZmVycmVkU2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGVuc29yNmQoKSByZXF1aXJlcyB2YWx1ZXMgdG8gYmUgbnVtYmVyW11bXVtdW11bXVtdIG9yICcgK1xuICAgICAgICAnZmxhdC9UeXBlZEFycmF5Jyk7XG4gIH1cbiAgaWYgKGluZmVycmVkU2hhcGUubGVuZ3RoID09PSAxICYmIHNoYXBlID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICd0ZW5zb3I2ZCgpIHJlcXVpcmVzIHNoYXBlIHRvIGJlIHByb3ZpZGVkIHdoZW4gYHZhbHVlc2AgJyArXG4gICAgICAgICdhcmUgYSBmbGF0IGFycmF5Jyk7XG4gIH1cbiAgc2hhcGUgPSBzaGFwZSB8fFxuICAgICAgaW5mZXJyZWRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHJldHVybiBtYWtlVGVuc29yKHZhbHVlcywgc2hhcGUsIGluZmVycmVkU2hhcGUsIGR0eXBlKSBhcyBUZW5zb3I2RDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { TopK } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Finds the values and indices of the `k` largest entries along the last\n * dimension.\n *\n * If the input is a vector (rank=1), finds the k largest entries in the vector\n * and outputs their values and indices as vectors. Thus values[j] is the j-th\n * largest entry in input, and its index is indices[j].\n * For higher rank inputs, computes the top k entries along the last dimension.\n *\n * If two elements are equal, the lower-index element appears first.\n *\n * ```js\n * const a = tf.tensor2d([[1, 5], [4, 3]]);\n * const {values, indices} = tf.topk(a);\n * values.print();\n * indices.print();\n * ```\n * @param x 1-D or higher `tf.Tensor` with last dimension being at least `k`.\n * @param k Number of top elements to look for along the last dimension.\n * @param sorted If true, the resulting `k` elements will be sorted by the\n *     values in descending order.\n *\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nfunction topk_(x, k = 1, sorted = true) {\n    const $x = convertToTensor(x, 'x', 'topk');\n    if ($x.rank === 0) {\n        throw new Error('topk() expects the input to be of rank 1 or higher');\n    }\n    const lastDim = $x.shape[$x.shape.length - 1];\n    if (k < 0) {\n        throw new Error(`'k' passed to topk() must be >= 0 but got ${k}`);\n    }\n    if (k > lastDim) {\n        throw new Error(`'k' passed to topk() must be <= the last dimension (${lastDim}) ` +\n            `but got ${k}`);\n    }\n    const inputs = { x: $x };\n    const attrs = { k, sorted };\n    const [values, indices] = ENGINE.runKernel(TopK, inputs, attrs);\n    return { values, indices };\n}\nexport const topk = op({ topk_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9way5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3RvcGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUF3QixNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXVCRztBQUNILFNBQVMsS0FBSyxDQUNWLENBQWUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sR0FBRyxJQUFJO0lBQ3ZDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQzNDLElBQUksRUFBRSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDakIsTUFBTSxJQUFJLEtBQUssQ0FBQyxvREFBb0QsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUU5QyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ25FO0lBRUQsSUFBSSxDQUFDLEdBQUcsT0FBTyxFQUFFO1FBQ2YsTUFBTSxJQUFJLEtBQUssQ0FDWCx1REFBdUQsT0FBTyxJQUFJO1lBQ2xFLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNyQjtJQUVELE1BQU0sTUFBTSxHQUFlLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ25DLE1BQU0sS0FBSyxHQUFjLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBRXJDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDdEMsSUFBSSxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0lBRXZFLE9BQU8sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUE0QixDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsRUFBRSxDQUFDLEVBQUMsS0FBSyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RvcEssIFRvcEtBdHRycywgVG9wS0lucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEZpbmRzIHRoZSB2YWx1ZXMgYW5kIGluZGljZXMgb2YgdGhlIGBrYCBsYXJnZXN0IGVudHJpZXMgYWxvbmcgdGhlIGxhc3RcbiAqIGRpbWVuc2lvbi5cbiAqXG4gKiBJZiB0aGUgaW5wdXQgaXMgYSB2ZWN0b3IgKHJhbms9MSksIGZpbmRzIHRoZSBrIGxhcmdlc3QgZW50cmllcyBpbiB0aGUgdmVjdG9yXG4gKiBhbmQgb3V0cHV0cyB0aGVpciB2YWx1ZXMgYW5kIGluZGljZXMgYXMgdmVjdG9ycy4gVGh1cyB2YWx1ZXNbal0gaXMgdGhlIGotdGhcbiAqIGxhcmdlc3QgZW50cnkgaW4gaW5wdXQsIGFuZCBpdHMgaW5kZXggaXMgaW5kaWNlc1tqXS5cbiAqIEZvciBoaWdoZXIgcmFuayBpbnB1dHMsIGNvbXB1dGVzIHRoZSB0b3AgayBlbnRyaWVzIGFsb25nIHRoZSBsYXN0IGRpbWVuc2lvbi5cbiAqXG4gKiBJZiB0d28gZWxlbWVudHMgYXJlIGVxdWFsLCB0aGUgbG93ZXItaW5kZXggZWxlbWVudCBhcHBlYXJzIGZpcnN0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCA1XSwgWzQsIDNdXSk7XG4gKiBjb25zdCB7dmFsdWVzLCBpbmRpY2VzfSA9IHRmLnRvcGsoYSk7XG4gKiB2YWx1ZXMucHJpbnQoKTtcbiAqIGluZGljZXMucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHggMS1EIG9yIGhpZ2hlciBgdGYuVGVuc29yYCB3aXRoIGxhc3QgZGltZW5zaW9uIGJlaW5nIGF0IGxlYXN0IGBrYC5cbiAqIEBwYXJhbSBrIE51bWJlciBvZiB0b3AgZWxlbWVudHMgdG8gbG9vayBmb3IgYWxvbmcgdGhlIGxhc3QgZGltZW5zaW9uLlxuICogQHBhcmFtIHNvcnRlZCBJZiB0cnVlLCB0aGUgcmVzdWx0aW5nIGBrYCBlbGVtZW50cyB3aWxsIGJlIHNvcnRlZCBieSB0aGVcbiAqICAgICB2YWx1ZXMgaW4gZGVzY2VuZGluZyBvcmRlci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gdG9wa188VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBrID0gMSwgc29ydGVkID0gdHJ1ZSk6IHt2YWx1ZXM6IFQsIGluZGljZXM6IFR9IHtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAndG9waycpO1xuICBpZiAoJHgucmFuayA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigndG9waygpIGV4cGVjdHMgdGhlIGlucHV0IHRvIGJlIG9mIHJhbmsgMSBvciBoaWdoZXInKTtcbiAgfVxuICBjb25zdCBsYXN0RGltID0gJHguc2hhcGVbJHguc2hhcGUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKGsgPCAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGAnaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlID49IDAgYnV0IGdvdCAke2t9YCk7XG4gIH1cblxuICBpZiAoayA+IGxhc3REaW0pIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGAnaycgcGFzc2VkIHRvIHRvcGsoKSBtdXN0IGJlIDw9IHRoZSBsYXN0IGRpbWVuc2lvbiAoJHtsYXN0RGltfSkgYCArXG4gICAgICAgIGBidXQgZ290ICR7a31gKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogVG9wS0lucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBUb3BLQXR0cnMgPSB7aywgc29ydGVkfTtcblxuICBjb25zdCBbdmFsdWVzLCBpbmRpY2VzXSA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBUb3BLLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG5cbiAgcmV0dXJuIHt2YWx1ZXMsIGluZGljZXN9IGFzIHt2YWx1ZXM6IFQsIGluZGljZXM6IFR9O1xufVxuXG5leHBvcnQgY29uc3QgdG9wayA9IG9wKHt0b3BrX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from './buffer';\nimport { op } from './operation';\nimport { MPRandGauss } from './rand_util';\n/**\n * Creates a `tf.Tensor` with values sampled from a truncated normal\n * distribution.\n *\n * ```js\n * tf.truncatedNormal([2, 2]).print();\n * ```\n *\n * The generated values follow a normal distribution with specified mean and\n * standard deviation, except that values whose magnitude is more than 2\n * standard deviations from the mean are dropped and re-picked.\n *\n * @param shape An array of integers defining the output tensor shape.\n * @param mean The mean of the normal distribution.\n * @param stdDev The standard deviation of the normal distribution.\n * @param dtype The data type of the output tensor.\n * @param seed The seed for the random number generator.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nfunction truncatedNormal_(shape, mean = 0, stdDev = 1, dtype, seed) {\n    if (dtype != null && dtype === 'bool') {\n        throw new Error(`Unsupported data type $ { dtype }`);\n    }\n    const randGauss = new MPRandGauss(mean, stdDev, dtype, true /* truncated */, seed);\n    const res = buffer(shape, dtype);\n    for (let i = 0; i < res.values.length; i++) {\n        res.values[i] = randGauss.nextValue();\n    }\n    return res.toTensor();\n}\nexport const truncatedNormal = op({ truncatedNormal_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1bmNhdGVkX25vcm1hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3RydW5jYXRlZF9ub3JtYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFeEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxTQUFTLGdCQUFnQixDQUNyQixLQUFrQixFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLENBQUMsRUFBRSxLQUF5QixFQUNuRSxJQUFhO0lBQ2YsSUFBSSxLQUFLLElBQUksSUFBSSxJQUFLLEtBQWtCLEtBQUssTUFBTSxFQUFFO1FBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztLQUN0RDtJQUNELE1BQU0sU0FBUyxHQUNYLElBQUksV0FBVyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckUsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNqQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDMUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7S0FDdkM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGdCQUFnQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge0RhdGFUeXBlLCBSYW5rLCBTaGFwZU1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2J1ZmZlcn0gZnJvbSAnLi9idWZmZXInO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtNUFJhbmRHYXVzc30gZnJvbSAnLi9yYW5kX3V0aWwnO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBgdGYuVGVuc29yYCB3aXRoIHZhbHVlcyBzYW1wbGVkIGZyb20gYSB0cnVuY2F0ZWQgbm9ybWFsXG4gKiBkaXN0cmlidXRpb24uXG4gKlxuICogYGBganNcbiAqIHRmLnRydW5jYXRlZE5vcm1hbChbMiwgMl0pLnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBUaGUgZ2VuZXJhdGVkIHZhbHVlcyBmb2xsb3cgYSBub3JtYWwgZGlzdHJpYnV0aW9uIHdpdGggc3BlY2lmaWVkIG1lYW4gYW5kXG4gKiBzdGFuZGFyZCBkZXZpYXRpb24sIGV4Y2VwdCB0aGF0IHZhbHVlcyB3aG9zZSBtYWduaXR1ZGUgaXMgbW9yZSB0aGFuIDJcbiAqIHN0YW5kYXJkIGRldmlhdGlvbnMgZnJvbSB0aGUgbWVhbiBhcmUgZHJvcHBlZCBhbmQgcmUtcGlja2VkLlxuICpcbiAqIEBwYXJhbSBzaGFwZSBBbiBhcnJheSBvZiBpbnRlZ2VycyBkZWZpbmluZyB0aGUgb3V0cHV0IHRlbnNvciBzaGFwZS5cbiAqIEBwYXJhbSBtZWFuIFRoZSBtZWFuIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIHN0ZERldiBUaGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIGR0eXBlIFRoZSBkYXRhIHR5cGUgb2YgdGhlIG91dHB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gc2VlZCBUaGUgc2VlZCBmb3IgdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NyZWF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gdHJ1bmNhdGVkTm9ybWFsXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgc2hhcGU6IFNoYXBlTWFwW1JdLCBtZWFuID0gMCwgc3RkRGV2ID0gMSwgZHR5cGU/OiAnZmxvYXQzMid8J2ludDMyJyxcbiAgICBzZWVkPzogbnVtYmVyKTogVGVuc29yPFI+IHtcbiAgaWYgKGR0eXBlICE9IG51bGwgJiYgKGR0eXBlIGFzIERhdGFUeXBlKSA9PT0gJ2Jvb2wnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCBkYXRhIHR5cGUgJCB7IGR0eXBlIH1gKTtcbiAgfVxuICBjb25zdCByYW5kR2F1c3MgPVxuICAgICAgbmV3IE1QUmFuZEdhdXNzKG1lYW4sIHN0ZERldiwgZHR5cGUsIHRydWUgLyogdHJ1bmNhdGVkICovLCBzZWVkKTtcbiAgY29uc3QgcmVzID0gYnVmZmVyKHNoYXBlLCBkdHlwZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLnZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgIHJlcy52YWx1ZXNbaV0gPSByYW5kR2F1c3MubmV4dFZhbHVlKCk7XG4gIH1cbiAgcmV0dXJuIHJlcy50b1RlbnNvcigpO1xufVxuXG5leHBvcnQgY29uc3QgdHJ1bmNhdGVkTm9ybWFsID0gb3Aoe3RydW5jYXRlZE5vcm1hbF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Unique } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assert } from '../util';\nimport { op } from './operation';\n/**\n * Finds unique elements along an axis of a tensor.\n *\n * It returns a tensor `values` containing all of the unique elements along the\n * `axis` of the given tensor `x` in the same order that they occur along the\n * `axis` in `x`; `x` does not need to be sorted. It also returns a tensor\n * `indices` the same size as the number of the elements in `x` along the `axis`\n * dimension. It contains the index in the unique output `values`.\n *\n * ```js\n * // A 1-D tensor\n * const a = tf.tensor1d([1, 1, 2, 4, 4, 4, 7, 8, 8]);\n * const {values, indices} = tf.unique(a);\n * values.print();   // [1, 2, 4, 7, 8,]\n * indices.print();  // [0, 0, 1, 2, 2, 2, 3, 4, 4]\n * ```\n *\n * ```js\n * // A 2-D tensor with axis=0\n * //\n * // 'a' is: [[1, 0, 0],\n * //          [1, 0, 0],\n * //          [2, 0, 0]]\n * const a = tf.tensor2d([[1, 0, 0], [1, 0, 0], [2, 0, 0]]);\n * const {values, indices} = tf.unique(a, 0)\n * values.print();   // [[1, 0, 0],\n *                   //  [2, 0, 0]]\n * indices.print();  // [0, 0, 1]\n * ```\n *\n * ```js\n * // A 2-D tensor with axis=1\n * //\n * // 'a' is: [[1, 0, 0],\n * //          [1, 0, 0],\n * //          [2, 0, 0]]\n * const a = tf.tensor2d([[1, 0, 0], [1, 0, 0], [2, 0, 0]]);\n * const {values, indices} = tf.unique(a, 1)\n * values.print();   // [[1, 0],\n *                   //  [1, 0],\n *                   //  [2, 0]]\n * indices.print();  // [0, 1, 1]\n * ```\n * @param x A tensor (int32, string, bool).\n * @param axis The axis of the tensor to find the unique elements.\n * @returns [uniqueElements, indices] (see above for details)\n *\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nfunction unique_(x, axis = 0) {\n    const $x = convertToTensor(x, 'x', 'unique', 'string_or_numeric');\n    assert($x.rank > 0, () => 'The input tensor must be at least 1D');\n    const inputs = { x: $x };\n    const attrs = { axis };\n    const [values, indices] = ENGINE.runKernel(Unique, inputs, attrs);\n    return { values, indices };\n}\nexport const unique = op({ unique_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvdW5pcXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBNEIsTUFBTSxpQkFBaUIsQ0FBQztBQUlsRSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUUvQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnREc7QUFDSCxTQUFTLE9BQU8sQ0FDWixDQUFlLEVBQUUsSUFBSSxHQUFHLENBQUM7SUFDM0IsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDbEUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFFbEUsTUFBTSxNQUFNLEdBQWlCLEVBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBQyxDQUFDO0lBQ3JDLE1BQU0sS0FBSyxHQUFnQixFQUFDLElBQUksRUFBQyxDQUFDO0lBQ2xDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixNQUFNLEVBQUUsTUFBOEIsRUFDdEMsS0FBMkIsQ0FBa0IsQ0FBQztJQUM1RSxPQUFPLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxDQUFDO0FBQzNCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsT0FBTyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1VuaXF1ZSwgVW5pcXVlQXR0cnMsIFVuaXF1ZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBGaW5kcyB1bmlxdWUgZWxlbWVudHMgYWxvbmcgYW4gYXhpcyBvZiBhIHRlbnNvci5cbiAqXG4gKiBJdCByZXR1cm5zIGEgdGVuc29yIGB2YWx1ZXNgIGNvbnRhaW5pbmcgYWxsIG9mIHRoZSB1bmlxdWUgZWxlbWVudHMgYWxvbmcgdGhlXG4gKiBgYXhpc2Agb2YgdGhlIGdpdmVuIHRlbnNvciBgeGAgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCB0aGV5IG9jY3VyIGFsb25nIHRoZVxuICogYGF4aXNgIGluIGB4YDsgYHhgIGRvZXMgbm90IG5lZWQgdG8gYmUgc29ydGVkLiBJdCBhbHNvIHJldHVybnMgYSB0ZW5zb3JcbiAqIGBpbmRpY2VzYCB0aGUgc2FtZSBzaXplIGFzIHRoZSBudW1iZXIgb2YgdGhlIGVsZW1lbnRzIGluIGB4YCBhbG9uZyB0aGUgYGF4aXNgXG4gKiBkaW1lbnNpb24uIEl0IGNvbnRhaW5zIHRoZSBpbmRleCBpbiB0aGUgdW5pcXVlIG91dHB1dCBgdmFsdWVzYC5cbiAqXG4gKiBgYGBqc1xuICogLy8gQSAxLUQgdGVuc29yXG4gKiBjb25zdCBhID0gdGYudGVuc29yMWQoWzEsIDEsIDIsIDQsIDQsIDQsIDcsIDgsIDhdKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudW5pcXVlKGEpO1xuICogdmFsdWVzLnByaW50KCk7ICAgLy8gWzEsIDIsIDQsIDcsIDgsXVxuICogaW5kaWNlcy5wcmludCgpOyAgLy8gWzAsIDAsIDEsIDIsIDIsIDIsIDMsIDQsIDRdXG4gKiBgYGBcbiAqXG4gKiBgYGBqc1xuICogLy8gQSAyLUQgdGVuc29yIHdpdGggYXhpcz0wXG4gKiAvL1xuICogLy8gJ2EnIGlzOiBbWzEsIDAsIDBdLFxuICogLy8gICAgICAgICAgWzEsIDAsIDBdLFxuICogLy8gICAgICAgICAgWzIsIDAsIDBdXVxuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFtbMSwgMCwgMF0sIFsxLCAwLCAwXSwgWzIsIDAsIDBdXSk7XG4gKiBjb25zdCB7dmFsdWVzLCBpbmRpY2VzfSA9IHRmLnVuaXF1ZShhLCAwKVxuICogdmFsdWVzLnByaW50KCk7ICAgLy8gW1sxLCAwLCAwXSxcbiAqICAgICAgICAgICAgICAgICAgIC8vICBbMiwgMCwgMF1dXG4gKiBpbmRpY2VzLnByaW50KCk7ICAvLyBbMCwgMCwgMV1cbiAqIGBgYFxuICpcbiAqIGBgYGpzXG4gKiAvLyBBIDItRCB0ZW5zb3Igd2l0aCBheGlzPTFcbiAqIC8vXG4gKiAvLyAnYScgaXM6IFtbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMSwgMCwgMF0sXG4gKiAvLyAgICAgICAgICBbMiwgMCwgMF1dXG4gKiBjb25zdCBhID0gdGYudGVuc29yMmQoW1sxLCAwLCAwXSwgWzEsIDAsIDBdLCBbMiwgMCwgMF1dKTtcbiAqIGNvbnN0IHt2YWx1ZXMsIGluZGljZXN9ID0gdGYudW5pcXVlKGEsIDEpXG4gKiB2YWx1ZXMucHJpbnQoKTsgICAvLyBbWzEsIDBdLFxuICogICAgICAgICAgICAgICAgICAgLy8gIFsxLCAwXSxcbiAqICAgICAgICAgICAgICAgICAgIC8vICBbMiwgMF1dXG4gKiBpbmRpY2VzLnByaW50KCk7ICAvLyBbMCwgMSwgMV1cbiAqIGBgYFxuICogQHBhcmFtIHggQSB0ZW5zb3IgKGludDMyLCBzdHJpbmcsIGJvb2wpLlxuICogQHBhcmFtIGF4aXMgVGhlIGF4aXMgb2YgdGhlIHRlbnNvciB0byBmaW5kIHRoZSB1bmlxdWUgZWxlbWVudHMuXG4gKiBAcmV0dXJucyBbdW5pcXVlRWxlbWVudHMsIGluZGljZXNdIChzZWUgYWJvdmUgZm9yIGRldGFpbHMpXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnRXZhbHVhdGlvbid9XG4gKi9cbmZ1bmN0aW9uIHVuaXF1ZV88VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgeDogVHxUZW5zb3JMaWtlLCBheGlzID0gMCk6IHt2YWx1ZXM6IFQsIGluZGljZXM6IFRlbnNvcjFEfSB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3VuaXF1ZScsICdzdHJpbmdfb3JfbnVtZXJpYycpO1xuICBhc3NlcnQoJHgucmFuayA+IDAsICgpID0+ICdUaGUgaW5wdXQgdGVuc29yIG11c3QgYmUgYXQgbGVhc3QgMUQnKTtcblxuICBjb25zdCBpbnB1dHM6IFVuaXF1ZUlucHV0cyA9IHt4OiAkeH07XG4gIGNvbnN0IGF0dHJzOiBVbmlxdWVBdHRycyA9IHtheGlzfTtcbiAgY29uc3QgW3ZhbHVlcywgaW5kaWNlc10gPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmlxdWUsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBbVCwgVGVuc29yMURdO1xuICByZXR1cm4ge3ZhbHVlcywgaW5kaWNlc307XG59XG5cbmV4cG9ydCBjb25zdCB1bmlxdWUgPSBvcCh7dW5pcXVlX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { UnsortedSegmentSum } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { assert, isInt } from '../util';\nimport { op } from './operation';\n/**\n * Computes the sum along segments of a `tf.Tensor`.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 3, 4]);\n * const segmentIds = tf.tensor1d([1, 2, 0, 1], 'int32');\n * const numSegments = 3;\n *\n * x.unsortedSegmentSum(segmentIds, numSegments).print()\n * //or tf.unsortedSegmentSum(x, segmentIds, numSegments)\n * ```\n * @param x The `tf.Tensor` that will be summed along its segments.\n * @param segmentIds A `tf.Tensor1D` whose rank is equal to the rank of `x`'s\n * dimension along the `axis`.  Maps each element of `x` to a segment.\n * @param numSegments The number of distinct `segmentIds`.\n *\n * @doc {heading: 'Operations', subheading: 'Segment'}\n */\nfunction unsortedSegmentSum_(x, segmentIds, numSegments) {\n    const $x = convertToTensor(x, 'x', 'unsortedSegmentSum');\n    const $segmentIds = convertToTensor(segmentIds, 'segmentIds', 'unsortedSegmentSum', 'int32');\n    assert(isInt(numSegments), () => 'numSegments must be of dtype int');\n    const inputs = { x: $x, segmentIds: $segmentIds };\n    const attrs = { numSegments };\n    return ENGINE.runKernel(UnsortedSegmentSum, inputs, attrs);\n}\nexport const unsortedSegmentSum = op({ unsortedSegmentSum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zb3J0ZWRfc2VnbWVudF9zdW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy91bnNvcnRlZF9zZWdtZW50X3N1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxrQkFBa0IsRUFBb0QsTUFBTSxpQkFBaUIsQ0FBQztBQUl0RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLG1CQUFtQixDQUN4QixDQUFlLEVBQUUsVUFBK0IsRUFBRSxXQUFtQjtJQUN2RSxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLG9CQUFvQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsa0NBQWtDLENBQUMsQ0FBQztJQUVyRSxNQUFNLE1BQU0sR0FBNkIsRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUMxRSxNQUFNLEtBQUssR0FBNEIsRUFBQyxXQUFXLEVBQUMsQ0FBQztJQUVyRCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLGtCQUFrQixFQUFFLE1BQThCLEVBQ2xELEtBQTJCLENBQUMsQ0FBQztBQUNuQyxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQUcsRUFBRSxDQUFDLEVBQUMsbUJBQW1CLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7VW5zb3J0ZWRTZWdtZW50U3VtLCBVbnNvcnRlZFNlZ21lbnRTdW1BdHRycywgVW5zb3J0ZWRTZWdtZW50U3VtSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0LCBpc0ludH0gZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc3VtIGFsb25nIHNlZ21lbnRzIG9mIGEgYHRmLlRlbnNvcmAuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMywgNF0pO1xuICogY29uc3Qgc2VnbWVudElkcyA9IHRmLnRlbnNvcjFkKFsxLCAyLCAwLCAxXSwgJ2ludDMyJyk7XG4gKiBjb25zdCBudW1TZWdtZW50cyA9IDM7XG4gKlxuICogeC51bnNvcnRlZFNlZ21lbnRTdW0oc2VnbWVudElkcywgbnVtU2VnbWVudHMpLnByaW50KClcbiAqIC8vb3IgdGYudW5zb3J0ZWRTZWdtZW50U3VtKHgsIHNlZ21lbnRJZHMsIG51bVNlZ21lbnRzKVxuICogYGBgXG4gKiBAcGFyYW0geCBUaGUgYHRmLlRlbnNvcmAgdGhhdCB3aWxsIGJlIHN1bW1lZCBhbG9uZyBpdHMgc2VnbWVudHMuXG4gKiBAcGFyYW0gc2VnbWVudElkcyBBIGB0Zi5UZW5zb3IxRGAgd2hvc2UgcmFuayBpcyBlcXVhbCB0byB0aGUgcmFuayBvZiBgeGAnc1xuICogZGltZW5zaW9uIGFsb25nIHRoZSBgYXhpc2AuICBNYXBzIGVhY2ggZWxlbWVudCBvZiBgeGAgdG8gYSBzZWdtZW50LlxuICogQHBhcmFtIG51bVNlZ21lbnRzIFRoZSBudW1iZXIgb2YgZGlzdGluY3QgYHNlZ21lbnRJZHNgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NlZ21lbnQnfVxuICovXG5mdW5jdGlvbiB1bnNvcnRlZFNlZ21lbnRTdW1fPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFR8VGVuc29yTGlrZSwgc2VnbWVudElkczogVGVuc29yMUR8VGVuc29yTGlrZSwgbnVtU2VnbWVudHM6IG51bWJlcik6IFQge1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICd1bnNvcnRlZFNlZ21lbnRTdW0nKTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3Vuc29ydGVkU2VnbWVudFN1bScsICdpbnQzMicpO1xuICBhc3NlcnQoaXNJbnQobnVtU2VnbWVudHMpLCAoKSA9PiAnbnVtU2VnbWVudHMgbXVzdCBiZSBvZiBkdHlwZSBpbnQnKTtcblxuICBjb25zdCBpbnB1dHM6IFVuc29ydGVkU2VnbWVudFN1bUlucHV0cyA9IHt4OiAkeCwgc2VnbWVudElkczogJHNlZ21lbnRJZHN9O1xuICBjb25zdCBhdHRyczogVW5zb3J0ZWRTZWdtZW50U3VtQXR0cnMgPSB7bnVtU2VnbWVudHN9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgVW5zb3J0ZWRTZWdtZW50U3VtLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdW5zb3J0ZWRTZWdtZW50U3VtID0gb3Aoe3Vuc29ydGVkU2VnbWVudFN1bV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Unpack } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\n/**\n * Unstacks a `tf.Tensor` of rank-`R` into a list of rank-`(R-1)` `tf.Tensor`s.\n *\n * ```js\n * const a = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n *\n * tf.unstack(a).forEach(tensor => tensor.print());\n * ```\n *\n * @param x A tensor object.\n * @param axis The axis to unstack along. Defaults to 0 (the first dim).\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nfunction unstack_(x, axis = 0) {\n    const $x = convertToTensor(x, 'x', 'unstack', 'string_or_numeric');\n    util.assert(axis >= -$x.shape.length && axis < $x.shape.length, () => `Axis = ${axis} is not in [-${$x.shape.length}, ${$x.shape.length})`);\n    const inputs = { value: $x };\n    const attrs = { axis };\n    return ENGINE.runKernel(Unpack, inputs, attrs);\n}\nexport const unstack = op({ unstack_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3Vuc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUE0QixNQUFNLGlCQUFpQixDQUFDO0FBSWxFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLFFBQVEsQ0FBQyxDQUFvQixFQUFFLElBQUksR0FBRyxDQUFDO0lBQzlDLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxNQUFNLENBQ1AsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNsRCxHQUFHLEVBQUUsQ0FDRCxVQUFVLElBQUksZ0JBQWdCLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUU5RSxNQUFNLE1BQU0sR0FBaUIsRUFBQyxLQUFLLEVBQUUsRUFBRSxFQUFDLENBQUM7SUFDekMsTUFBTSxLQUFLLEdBQWdCLEVBQUMsSUFBSSxFQUFDLENBQUM7SUFFbEMsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixNQUFNLEVBQUUsTUFBOEIsRUFBRSxLQUEyQixDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7VW5wYWNrLCBVbnBhY2tBdHRycywgVW5wYWNrSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFVuc3RhY2tzIGEgYHRmLlRlbnNvcmAgb2YgcmFuay1gUmAgaW50byBhIGxpc3Qgb2YgcmFuay1gKFItMSlgIGB0Zi5UZW5zb3Jgcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqXG4gKiB0Zi51bnN0YWNrKGEpLmZvckVhY2godGVuc29yID0+IHRlbnNvci5wcmludCgpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IEEgdGVuc29yIG9iamVjdC5cbiAqIEBwYXJhbSBheGlzIFRoZSBheGlzIHRvIHVuc3RhY2sgYWxvbmcuIERlZmF1bHRzIHRvIDAgKHRoZSBmaXJzdCBkaW0pLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5mdW5jdGlvbiB1bnN0YWNrXyh4OiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcyA9IDApOiBUZW5zb3JbXSB7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ3Vuc3RhY2snLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBheGlzID49IC0keC5zaGFwZS5sZW5ndGggJiYgYXhpcyA8ICR4LnNoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+XG4gICAgICAgICAgYEF4aXMgPSAke2F4aXN9IGlzIG5vdCBpbiBbLSR7JHguc2hhcGUubGVuZ3RofSwgJHskeC5zaGFwZS5sZW5ndGh9KWApO1xuXG4gIGNvbnN0IGlucHV0czogVW5wYWNrSW5wdXRzID0ge3ZhbHVlOiAkeH07XG4gIGNvbnN0IGF0dHJzOiBVbnBhY2tBdHRycyA9IHtheGlzfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFVucGFjaywgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdW5zdGFjayA9IG9wKHt1bnN0YWNrX30pO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { searchSorted } from './search_sorted';\n/**\n * Searches for where a value would go in a sorted sequence.\n *\n * This is not a method for checking containment (like javascript in).\n *\n * The typical use case for this operation is \"binning\", \"bucketing\", or\n * \"discretizing\". The values are assigned to bucket-indices based on the edges\n * listed in 'sortedSequence'. This operation returns the bucket-index for each\n * value.\n *\n * The index returned corresponds to the first edge greater than the value.\n *\n * The axis is not settable for this operation. It always operates on the\n * innermost dimension (axis=-1). The operation will accept any number of outer\n * dimensions.\n *\n * Note: This operation assumes that 'upperBound' is sorted along the\n * innermost axis, maybe using 'sort(..., axis=-1)'. If the sequence is not\n * sorted no error is raised and the content of the returned tensor is not well\n * defined.\n *\n * ```js\n * const seq = tf.tensor1d([0, 3, 9, 10, 10]);\n * const values = tf.tensor1d([0, 4, 10]);\n * const result = tf.upperBound(seq, values);\n * result.print(); // [1, 2, 5]\n * ```\n * @param sortedSequence: N-D. Sorted sequence.\n * @param values: N-D. Search values.\n * @return An N-D int32 tensor the size of values containing the result of\n *     applying upper bound to each value. The result is not a global index to\n *     the entire Tensor, but the index in the last dimension.\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nexport function upperBound(sortedSequence, values) {\n    return searchSorted(sortedSequence, values, 'right');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXBwZXJfYm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy91cHBlcl9ib3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWlDRztBQUNILE1BQU0sVUFBVSxVQUFVLENBQ3RCLGNBQWlDLEVBQUUsTUFBeUI7SUFDOUQsT0FBTyxZQUFZLENBQUMsY0FBYyxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtzZWFyY2hTb3J0ZWR9IGZyb20gJy4vc2VhcmNoX3NvcnRlZCc7XG5cbi8qKlxuICogU2VhcmNoZXMgZm9yIHdoZXJlIGEgdmFsdWUgd291bGQgZ28gaW4gYSBzb3J0ZWQgc2VxdWVuY2UuXG4gKlxuICogVGhpcyBpcyBub3QgYSBtZXRob2QgZm9yIGNoZWNraW5nIGNvbnRhaW5tZW50IChsaWtlIGphdmFzY3JpcHQgaW4pLlxuICpcbiAqIFRoZSB0eXBpY2FsIHVzZSBjYXNlIGZvciB0aGlzIG9wZXJhdGlvbiBpcyBcImJpbm5pbmdcIiwgXCJidWNrZXRpbmdcIiwgb3JcbiAqIFwiZGlzY3JldGl6aW5nXCIuIFRoZSB2YWx1ZXMgYXJlIGFzc2lnbmVkIHRvIGJ1Y2tldC1pbmRpY2VzIGJhc2VkIG9uIHRoZSBlZGdlc1xuICogbGlzdGVkIGluICdzb3J0ZWRTZXF1ZW5jZScuIFRoaXMgb3BlcmF0aW9uIHJldHVybnMgdGhlIGJ1Y2tldC1pbmRleCBmb3IgZWFjaFxuICogdmFsdWUuXG4gKlxuICogVGhlIGluZGV4IHJldHVybmVkIGNvcnJlc3BvbmRzIHRvIHRoZSBmaXJzdCBlZGdlIGdyZWF0ZXIgdGhhbiB0aGUgdmFsdWUuXG4gKlxuICogVGhlIGF4aXMgaXMgbm90IHNldHRhYmxlIGZvciB0aGlzIG9wZXJhdGlvbi4gSXQgYWx3YXlzIG9wZXJhdGVzIG9uIHRoZVxuICogaW5uZXJtb3N0IGRpbWVuc2lvbiAoYXhpcz0tMSkuIFRoZSBvcGVyYXRpb24gd2lsbCBhY2NlcHQgYW55IG51bWJlciBvZiBvdXRlclxuICogZGltZW5zaW9ucy5cbiAqXG4gKiBOb3RlOiBUaGlzIG9wZXJhdGlvbiBhc3N1bWVzIHRoYXQgJ3VwcGVyQm91bmQnIGlzIHNvcnRlZCBhbG9uZyB0aGVcbiAqIGlubmVybW9zdCBheGlzLCBtYXliZSB1c2luZyAnc29ydCguLi4sIGF4aXM9LTEpJy4gSWYgdGhlIHNlcXVlbmNlIGlzIG5vdFxuICogc29ydGVkIG5vIGVycm9yIGlzIHJhaXNlZCBhbmQgdGhlIGNvbnRlbnQgb2YgdGhlIHJldHVybmVkIHRlbnNvciBpcyBub3Qgd2VsbFxuICogZGVmaW5lZC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3Qgc2VxID0gdGYudGVuc29yMWQoWzAsIDMsIDksIDEwLCAxMF0pO1xuICogY29uc3QgdmFsdWVzID0gdGYudGVuc29yMWQoWzAsIDQsIDEwXSk7XG4gKiBjb25zdCByZXN1bHQgPSB0Zi51cHBlckJvdW5kKHNlcSwgdmFsdWVzKTtcbiAqIHJlc3VsdC5wcmludCgpOyAvLyBbMSwgMiwgNV1cbiAqIGBgYFxuICogQHBhcmFtIHNvcnRlZFNlcXVlbmNlOiBOLUQuIFNvcnRlZCBzZXF1ZW5jZS5cbiAqIEBwYXJhbSB2YWx1ZXM6IE4tRC4gU2VhcmNoIHZhbHVlcy5cbiAqIEByZXR1cm4gQW4gTi1EIGludDMyIHRlbnNvciB0aGUgc2l6ZSBvZiB2YWx1ZXMgY29udGFpbmluZyB0aGUgcmVzdWx0IG9mXG4gKiAgICAgYXBwbHlpbmcgdXBwZXIgYm91bmQgdG8gZWFjaCB2YWx1ZS4gVGhlIHJlc3VsdCBpcyBub3QgYSBnbG9iYWwgaW5kZXggdG9cbiAqICAgICB0aGUgZW50aXJlIFRlbnNvciwgYnV0IHRoZSBpbmRleCBpbiB0aGUgbGFzdCBkaW1lbnNpb24uXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwcGVyQm91bmQoXG4gICAgc29ydGVkU2VxdWVuY2U6IFRlbnNvcnxUZW5zb3JMaWtlLCB2YWx1ZXM6IFRlbnNvcnxUZW5zb3JMaWtlKTogVGVuc29yIHtcbiAgcmV0dXJuIHNlYXJjaFNvcnRlZChzb3J0ZWRTZXF1ZW5jZSwgdmFsdWVzLCAncmlnaHQnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\n/**\n * Creates a new variable with the provided initial value.\n * ```js\n * const x = tf.variable(tf.tensor([1, 2, 3]));\n * x.assign(tf.tensor([4, 5, 6]));\n *\n * x.print();\n * ```\n *\n * @param initialValue Initial value for the tensor.\n * @param trainable If true, optimizers are allowed to update it.\n * @param name Name of the variable. Defaults to a unique id.\n * @param dtype If set, initialValue will be converted to the given type.\n *\n * @doc {heading: 'Tensors', subheading: 'Creation'}\n */\nexport function variable(initialValue, trainable = true, name, dtype) {\n    return ENGINE.makeVariable(initialValue, trainable, name, dtype);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy92YXJpYWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBSWpDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3BCLFlBQXVCLEVBQUUsU0FBUyxHQUFHLElBQUksRUFBRSxJQUFhLEVBQ3hELEtBQWdCO0lBQ2xCLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxLQUFLLENBQ2hELENBQUM7QUFDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1RlbnNvciwgVmFyaWFibGV9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge0RhdGFUeXBlLCBSYW5rfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyB2YXJpYWJsZSB3aXRoIHRoZSBwcm92aWRlZCBpbml0aWFsIHZhbHVlLlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi52YXJpYWJsZSh0Zi50ZW5zb3IoWzEsIDIsIDNdKSk7XG4gKiB4LmFzc2lnbih0Zi50ZW5zb3IoWzQsIDUsIDZdKSk7XG4gKlxuICogeC5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIGluaXRpYWxWYWx1ZSBJbml0aWFsIHZhbHVlIGZvciB0aGUgdGVuc29yLlxuICogQHBhcmFtIHRyYWluYWJsZSBJZiB0cnVlLCBvcHRpbWl6ZXJzIGFyZSBhbGxvd2VkIHRvIHVwZGF0ZSBpdC5cbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHZhcmlhYmxlLiBEZWZhdWx0cyB0byBhIHVuaXF1ZSBpZC5cbiAqIEBwYXJhbSBkdHlwZSBJZiBzZXQsIGluaXRpYWxWYWx1ZSB3aWxsIGJlIGNvbnZlcnRlZCB0byB0aGUgZ2l2ZW4gdHlwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDcmVhdGlvbid9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYWJsZTxSIGV4dGVuZHMgUmFuaz4oXG4gICAgaW5pdGlhbFZhbHVlOiBUZW5zb3I8Uj4sIHRyYWluYWJsZSA9IHRydWUsIG5hbWU/OiBzdHJpbmcsXG4gICAgZHR5cGU/OiBEYXRhVHlwZSk6IFZhcmlhYmxlPFI+IHtcbiAgcmV0dXJuIEVOR0lORS5tYWtlVmFyaWFibGUoaW5pdGlhbFZhbHVlLCB0cmFpbmFibGUsIG5hbWUsIGR0eXBlKSBhc1xuICAgICAgVmFyaWFibGU8Uj47XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/** An implementation of the Where kernel shared between cpu and webgl */\nimport { buffer } from '../ops/buffer';\nexport function whereImpl(condShape, condVals) {\n    const indices = [];\n    for (let i = 0; i < condVals.length; i++) {\n        if (condVals[i]) {\n            indices.push(i);\n        }\n    }\n    const inBuffer = buffer(condShape, 'int32');\n    const out = buffer([indices.length, condShape.length], 'int32');\n    for (let i = 0; i < indices.length; i++) {\n        const loc = inBuffer.indexToLoc(indices[i]);\n        const offset = i * condShape.length;\n        out.values.set(loc, offset);\n    }\n    return out.toTensor();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmVfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvYmFja2VuZHMvd2hlcmVfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCx5RUFBeUU7QUFFekUsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUlyQyxNQUFNLFVBQVUsU0FBUyxDQUFDLFNBQW1CLEVBQUUsUUFBb0I7SUFDakUsTUFBTSxPQUFPLEdBQUcsRUFBRSxDQUFDO0lBQ25CLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLElBQUksUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNqQjtLQUNGO0lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1QyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3BDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztLQUM3QjtJQUNELE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBYyxDQUFDO0FBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgV2hlcmUga2VybmVsIHNoYXJlZCBiZXR3ZWVuIGNwdSBhbmQgd2ViZ2wgKi9cblxuaW1wb3J0IHtidWZmZXJ9IGZyb20gJy4uL29wcy9idWZmZXInO1xuaW1wb3J0IHtUZW5zb3IyRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7VHlwZWRBcnJheX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd2hlcmVJbXBsKGNvbmRTaGFwZTogbnVtYmVyW10sIGNvbmRWYWxzOiBUeXBlZEFycmF5KTogVGVuc29yMkQge1xuICBjb25zdCBpbmRpY2VzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29uZFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoY29uZFZhbHNbaV0pIHtcbiAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpbkJ1ZmZlciA9IGJ1ZmZlcihjb25kU2hhcGUsICdpbnQzMicpO1xuXG4gIGNvbnN0IG91dCA9IGJ1ZmZlcihbaW5kaWNlcy5sZW5ndGgsIGNvbmRTaGFwZS5sZW5ndGhdLCAnaW50MzInKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgbG9jID0gaW5CdWZmZXIuaW5kZXhUb0xvYyhpbmRpY2VzW2ldKTtcbiAgICBjb25zdCBvZmZzZXQgPSBpICogY29uZFNoYXBlLmxlbmd0aDtcbiAgICBvdXQudmFsdWVzLnNldChsb2MsIG9mZnNldCk7XG4gIH1cbiAgcmV0dXJuIG91dC50b1RlbnNvcigpIGFzIFRlbnNvcjJEO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { whereImpl } from '../backends/where_impl';\nimport { convertToTensor } from '../tensor_util_env';\n/**\n * Returns the coordinates of true elements of condition.\n *\n * The coordinates are returned in a 2-D tensor where the first dimension (rows)\n * represents the number of true elements, and the second dimension (columns)\n * represents the coordinates of the true elements. Keep in mind, the shape of\n * the output tensor can vary depending on how many true values there are in\n * input. Indices are output in row-major order. The resulting tensor has the\n * shape `[numTrueElems, condition.rank]`.\n *\n * This is analogous to calling the python `tf.where(cond)` without an x or y.\n *\n * ```js\n * const cond = tf.tensor1d([false, false, true], 'bool');\n * const result = await tf.whereAsync(cond);\n * result.print();\n * ```\n *\n * @doc {heading: 'Operations', subheading: 'Logical'}\n */\nasync function whereAsync_(condition) {\n    const $condition = convertToTensor(condition, 'condition', 'whereAsync', 'bool');\n    const vals = await $condition.data();\n    const res = whereImpl($condition.shape, vals);\n    if (condition !== $condition) {\n        $condition.dispose();\n    }\n    return res;\n}\nexport const whereAsync = whereAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmVfYXN5bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy93aGVyZV9hc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR25EOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsS0FBSyxVQUFVLFdBQVcsQ0FBQyxTQUE0QjtJQUNyRCxNQUFNLFVBQVUsR0FDWixlQUFlLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDbEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDOUMsSUFBSSxTQUFTLEtBQUssVUFBVSxFQUFFO1FBQzVCLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUN0QjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge3doZXJlSW1wbH0gZnJvbSAnLi4vYmFja2VuZHMvd2hlcmVfaW1wbCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMkR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNvb3JkaW5hdGVzIG9mIHRydWUgZWxlbWVudHMgb2YgY29uZGl0aW9uLlxuICpcbiAqIFRoZSBjb29yZGluYXRlcyBhcmUgcmV0dXJuZWQgaW4gYSAyLUQgdGVuc29yIHdoZXJlIHRoZSBmaXJzdCBkaW1lbnNpb24gKHJvd3MpXG4gKiByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgdHJ1ZSBlbGVtZW50cywgYW5kIHRoZSBzZWNvbmQgZGltZW5zaW9uIChjb2x1bW5zKVxuICogcmVwcmVzZW50cyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHRydWUgZWxlbWVudHMuIEtlZXAgaW4gbWluZCwgdGhlIHNoYXBlIG9mXG4gKiB0aGUgb3V0cHV0IHRlbnNvciBjYW4gdmFyeSBkZXBlbmRpbmcgb24gaG93IG1hbnkgdHJ1ZSB2YWx1ZXMgdGhlcmUgYXJlIGluXG4gKiBpbnB1dC4gSW5kaWNlcyBhcmUgb3V0cHV0IGluIHJvdy1tYWpvciBvcmRlci4gVGhlIHJlc3VsdGluZyB0ZW5zb3IgaGFzIHRoZVxuICogc2hhcGUgYFtudW1UcnVlRWxlbXMsIGNvbmRpdGlvbi5yYW5rXWAuXG4gKlxuICogVGhpcyBpcyBhbmFsb2dvdXMgdG8gY2FsbGluZyB0aGUgcHl0aG9uIGB0Zi53aGVyZShjb25kKWAgd2l0aG91dCBhbiB4IG9yIHkuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGNvbmQgPSB0Zi50ZW5zb3IxZChbZmFsc2UsIGZhbHNlLCB0cnVlXSwgJ2Jvb2wnKTtcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRmLndoZXJlQXN5bmMoY29uZCk7XG4gKiByZXN1bHQucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0xvZ2ljYWwnfVxuICovXG5hc3luYyBmdW5jdGlvbiB3aGVyZUFzeW5jXyhjb25kaXRpb246IFRlbnNvcnxUZW5zb3JMaWtlKTogUHJvbWlzZTxUZW5zb3IyRD4ge1xuICBjb25zdCAkY29uZGl0aW9uID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihjb25kaXRpb24sICdjb25kaXRpb24nLCAnd2hlcmVBc3luYycsICdib29sJyk7XG4gIGNvbnN0IHZhbHMgPSBhd2FpdCAkY29uZGl0aW9uLmRhdGEoKTtcbiAgY29uc3QgcmVzID0gd2hlcmVJbXBsKCRjb25kaXRpb24uc2hhcGUsIHZhbHMpO1xuICBpZiAoY29uZGl0aW9uICE9PSAkY29uZGl0aW9uKSB7XG4gICAgJGNvbmRpdGlvbi5kaXNwb3NlKCk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHdoZXJlQXN5bmMgPSB3aGVyZUFzeW5jXztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { gather } from './gather';\nimport { reshape } from './reshape';\nimport { squeeze } from './squeeze';\nimport { whereAsync } from './where_async';\n/**\n * Apply boolean mask to tensor.\n *\n * ```js\n * const tensor = tf.tensor2d([1, 2, 3, 4, 5, 6], [3, 2]);\n * const mask = tf.tensor1d([1, 0, 1], 'bool');\n * const result = await tf.booleanMaskAsync(tensor, mask);\n * result.print();\n * ```\n *\n * @param tensor N-D tensor.\n * @param mask K-D boolean tensor, K <= N and K must be known statically.\n * @param axis A 0-D int Tensor representing the axis in tensor to mask from.\n *     By default, axis is 0 which will mask from the first dimension.\n *     Otherwise K + axis <= N.\n *\n * @doc {heading: 'Tensors', subheading: 'Slicing and Joining'}\n */\nasync function booleanMaskAsync_(tensor, mask, axis) {\n    const $tensor = convertToTensor(tensor, 'tensor', 'boolMask');\n    const $mask = convertToTensor(mask, 'mask', 'boolMask', 'bool');\n    const axisFrom = axis == null ? 0 : axis;\n    const maskDim = $mask.rank;\n    const tensorShape = $tensor.shape;\n    util.assert(maskDim > 0, () => 'mask cannot be scalar');\n    util.assertShapesMatch(tensorShape.slice(axisFrom, axisFrom + maskDim), $mask.shape, `mask's shape must match the first K dimensions of tensor's shape,`);\n    let leadingSize = 1;\n    for (let i = axisFrom; i < axisFrom + maskDim; i++) {\n        leadingSize *= tensorShape[i];\n    }\n    const targetTensorShape = tensorShape.slice(0, axisFrom)\n        .concat([leadingSize], tensorShape.slice(axisFrom + maskDim));\n    const reshapedTensor = reshape($tensor, targetTensorShape);\n    const reshapedMask = reshape($mask, [-1]);\n    const positivePositions = await whereAsync(reshapedMask);\n    const indices = squeeze(positivePositions, [1]);\n    const res = gather(reshapedTensor, indices, axisFrom);\n    // Ensure no memory leak.\n    if (tensor !== $tensor) {\n        $tensor.dispose();\n    }\n    if (mask !== $mask) {\n        $mask.dispose();\n    }\n    indices.dispose();\n    reshapedTensor.dispose();\n    reshapedMask.dispose();\n    positivePositions.dispose();\n    return res;\n}\nexport const booleanMaskAsync = booleanMaskAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vbGVhbl9tYXNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvYm9vbGVhbl9tYXNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILEtBQUssVUFBVSxpQkFBaUIsQ0FDNUIsTUFBeUIsRUFBRSxJQUF1QixFQUNsRCxJQUFhO0lBQ2YsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRWhFLE1BQU0sUUFBUSxHQUFHLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7SUFDM0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUVsQyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUN4RCxJQUFJLENBQUMsaUJBQWlCLENBQ2xCLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLFFBQVEsR0FBRyxPQUFPLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxFQUM1RCxtRUFBbUUsQ0FBQyxDQUFDO0lBRXpFLElBQUksV0FBVyxHQUFHLENBQUMsQ0FBQztJQUNwQixLQUFLLElBQUksQ0FBQyxHQUFHLFFBQVEsRUFBRSxDQUFDLEdBQUcsUUFBUSxHQUFHLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNsRCxXQUFXLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsTUFBTSxpQkFBaUIsR0FDbkIsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDO1NBQ3pCLE1BQU0sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxLQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDdEUsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQzNELE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUMsTUFBTSxpQkFBaUIsR0FBRyxNQUFNLFVBQVUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN6RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxjQUFjLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXRELHlCQUF5QjtJQUN6QixJQUFJLE1BQU0sS0FBSyxPQUFPLEVBQUU7UUFDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ25CO0lBQ0QsSUFBSSxJQUFJLEtBQUssS0FBSyxFQUFFO1FBQ2xCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUNqQjtJQUNELE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNsQixjQUFjLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekIsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3ZCLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxDQUFDO0lBRTVCLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLGlCQUFpQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5pbXBvcnQge2dhdGhlcn0gZnJvbSAnLi9nYXRoZXInO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcXVlZXplfSBmcm9tICcuL3NxdWVlemUnO1xuaW1wb3J0IHt3aGVyZUFzeW5jfSBmcm9tICcuL3doZXJlX2FzeW5jJztcblxuLyoqXG4gKiBBcHBseSBib29sZWFuIG1hc2sgdG8gdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB0ZW5zb3IgPSB0Zi50ZW5zb3IyZChbMSwgMiwgMywgNCwgNSwgNl0sIFszLCAyXSk7XG4gKiBjb25zdCBtYXNrID0gdGYudGVuc29yMWQoWzEsIDAsIDFdLCAnYm9vbCcpO1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgdGYuYm9vbGVhbk1hc2tBc3luYyh0ZW5zb3IsIG1hc2spO1xuICogcmVzdWx0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gdGVuc29yIE4tRCB0ZW5zb3IuXG4gKiBAcGFyYW0gbWFzayBLLUQgYm9vbGVhbiB0ZW5zb3IsIEsgPD0gTiBhbmQgSyBtdXN0IGJlIGtub3duIHN0YXRpY2FsbHkuXG4gKiBAcGFyYW0gYXhpcyBBIDAtRCBpbnQgVGVuc29yIHJlcHJlc2VudGluZyB0aGUgYXhpcyBpbiB0ZW5zb3IgdG8gbWFzayBmcm9tLlxuICogICAgIEJ5IGRlZmF1bHQsIGF4aXMgaXMgMCB3aGljaCB3aWxsIG1hc2sgZnJvbSB0aGUgZmlyc3QgZGltZW5zaW9uLlxuICogICAgIE90aGVyd2lzZSBLICsgYXhpcyA8PSBOLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ1NsaWNpbmcgYW5kIEpvaW5pbmcnfVxuICovXG5hc3luYyBmdW5jdGlvbiBib29sZWFuTWFza0FzeW5jXyhcbiAgICB0ZW5zb3I6IFRlbnNvcnxUZW5zb3JMaWtlLCBtYXNrOiBUZW5zb3J8VGVuc29yTGlrZSxcbiAgICBheGlzPzogbnVtYmVyKTogUHJvbWlzZTxUZW5zb3I+IHtcbiAgY29uc3QgJHRlbnNvciA9IGNvbnZlcnRUb1RlbnNvcih0ZW5zb3IsICd0ZW5zb3InLCAnYm9vbE1hc2snKTtcbiAgY29uc3QgJG1hc2sgPSBjb252ZXJ0VG9UZW5zb3IobWFzaywgJ21hc2snLCAnYm9vbE1hc2snLCAnYm9vbCcpO1xuXG4gIGNvbnN0IGF4aXNGcm9tID0gYXhpcyA9PSBudWxsID8gMCA6IGF4aXM7XG4gIGNvbnN0IG1hc2tEaW0gPSAkbWFzay5yYW5rO1xuICBjb25zdCB0ZW5zb3JTaGFwZSA9ICR0ZW5zb3Iuc2hhcGU7XG5cbiAgdXRpbC5hc3NlcnQobWFza0RpbSA+IDAsICgpID0+ICdtYXNrIGNhbm5vdCBiZSBzY2FsYXInKTtcbiAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgIHRlbnNvclNoYXBlLnNsaWNlKGF4aXNGcm9tLCBheGlzRnJvbSArIG1hc2tEaW0pLCAkbWFzay5zaGFwZSxcbiAgICAgIGBtYXNrJ3Mgc2hhcGUgbXVzdCBtYXRjaCB0aGUgZmlyc3QgSyBkaW1lbnNpb25zIG9mIHRlbnNvcidzIHNoYXBlLGApO1xuXG4gIGxldCBsZWFkaW5nU2l6ZSA9IDE7XG4gIGZvciAobGV0IGkgPSBheGlzRnJvbTsgaSA8IGF4aXNGcm9tICsgbWFza0RpbTsgaSsrKSB7XG4gICAgbGVhZGluZ1NpemUgKj0gdGVuc29yU2hhcGVbaV07XG4gIH1cbiAgY29uc3QgdGFyZ2V0VGVuc29yU2hhcGUgPVxuICAgICAgdGVuc29yU2hhcGUuc2xpY2UoMCwgYXhpc0Zyb20pXG4gICAgICAgICAgLmNvbmNhdChbbGVhZGluZ1NpemVdLCB0ZW5zb3JTaGFwZS5zbGljZShheGlzRnJvbSArIG1hc2tEaW0pKTtcbiAgY29uc3QgcmVzaGFwZWRUZW5zb3IgPSByZXNoYXBlKCR0ZW5zb3IsIHRhcmdldFRlbnNvclNoYXBlKTtcbiAgY29uc3QgcmVzaGFwZWRNYXNrID0gcmVzaGFwZSgkbWFzaywgWy0xXSk7XG4gIGNvbnN0IHBvc2l0aXZlUG9zaXRpb25zID0gYXdhaXQgd2hlcmVBc3luYyhyZXNoYXBlZE1hc2spO1xuICBjb25zdCBpbmRpY2VzID0gc3F1ZWV6ZShwb3NpdGl2ZVBvc2l0aW9ucywgWzFdKTtcblxuICBjb25zdCByZXMgPSBnYXRoZXIocmVzaGFwZWRUZW5zb3IsIGluZGljZXMsIGF4aXNGcm9tKTtcblxuICAvLyBFbnN1cmUgbm8gbWVtb3J5IGxlYWsuXG4gIGlmICh0ZW5zb3IgIT09ICR0ZW5zb3IpIHtcbiAgICAkdGVuc29yLmRpc3Bvc2UoKTtcbiAgfVxuICBpZiAobWFzayAhPT0gJG1hc2spIHtcbiAgICAkbWFzay5kaXNwb3NlKCk7XG4gIH1cbiAgaW5kaWNlcy5kaXNwb3NlKCk7XG4gIHJlc2hhcGVkVGVuc29yLmRpc3Bvc2UoKTtcbiAgcmVzaGFwZWRNYXNrLmRpc3Bvc2UoKTtcbiAgcG9zaXRpdmVQb3NpdGlvbnMuZGlzcG9zZSgpO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBib29sZWFuTWFza0FzeW5jID0gYm9vbGVhbk1hc2tBc3luY187XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assertTypesMatch } from '../tensor_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { add } from './add';\nimport { div } from './div';\nimport { mul } from './mul';\nimport { op } from './operation';\nimport { pow } from './pow';\nimport { scalar } from './scalar';\nimport { sub } from './sub';\n/**\n * Compute the moving average of a variable.\n *\n * Without zeroDebias, the moving average operation is defined by:\n *   `v += delta`\n * where\n *   `delta = (1 - decay) * (x - v)`\n *\n * With zeroDebias (default), the `delta` term is scaled to debias the\n * effect of the (assumed) zero-initialization of `v`.\n *   `delta /= (1 - decay ^ step)`\n *\n * For more details on the zero-debiasing algorithm, see:\n *   https://arxiv.org/abs/1412.6980\n *\n * Note that this function is completely stateless and does not keep track of\n * step count. The step count needs to be maintained by the caller and passed\n * in as `step`.\n *\n * @param v The current moving average value.\n * @param x New input value, must have the same shape and dtype as `v`.\n * @param decay The decay factor. Typical values are 0.95 and 0.99.\n * @param step Step count.\n * @param zeroDebias: Whether zeroDebias is to be performed (default: `true`).\n * @returns The new moving average value.\n *\n * @doc {heading: 'Operations', subheading: 'Moving Average'}\n */\nfunction movingAverage_(v, x, decay, step, zeroDebias = true) {\n    const $v = convertToTensor(v, 'v', 'movingAverage');\n    const $x = convertToTensor(x, 'x', 'movingAverage');\n    const $decay = convertToTensor(decay, 'decay', 'movingAverage');\n    assertTypesMatch($v, $x);\n    util.assert(util.arraysEqual($v.shape, $x.shape), () => 'Shape mismatch in v and x');\n    const one = scalar(1);\n    const oneMinusDecay = sub(one, $decay);\n    let update = mul(sub($x, $v), oneMinusDecay);\n    if (zeroDebias) {\n        util.assert(step != null, () => 'When using zeroDebias: true, step is required.');\n        const $step = convertToTensor(step, 'step', 'movingAverage');\n        update = div(update, sub(one, pow($decay, $step)));\n    }\n    return add($v, update);\n}\nexport const movingAverage = op({ movingAverage_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW92aW5nX2F2ZXJhZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9tb3ZpbmdfYXZlcmFnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDaEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUUxQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBMkJHO0FBQ0gsU0FBUyxjQUFjLENBQ25CLENBQWUsRUFBRSxDQUFlLEVBQUUsS0FBb0IsRUFDdEQsSUFBb0IsRUFBRSxVQUFVLEdBQUcsSUFBSTtJQUN6QyxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNwRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNwRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVoRSxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLDJCQUEyQixDQUFDLENBQUM7SUFFN0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFdkMsSUFBSSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDN0MsSUFBSSxVQUFVLEVBQUU7UUFDZCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksSUFBSSxJQUFJLEVBQUUsR0FBRyxFQUFFLENBQUMsZ0RBQWdELENBQUMsQ0FBQztRQUMxRSxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUM3RCxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BEO0lBQ0QsT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTY2FsYXIsIFRlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7YXNzZXJ0VHlwZXNNYXRjaH0gZnJvbSAnLi4vdGVuc29yX3V0aWwnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YWRkfSBmcm9tICcuL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4vbXVsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cG93fSBmcm9tICcuL3Bvdyc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi9zY2FsYXInO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4vc3ViJztcblxuLyoqXG4gKiBDb21wdXRlIHRoZSBtb3ZpbmcgYXZlcmFnZSBvZiBhIHZhcmlhYmxlLlxuICpcbiAqIFdpdGhvdXQgemVyb0RlYmlhcywgdGhlIG1vdmluZyBhdmVyYWdlIG9wZXJhdGlvbiBpcyBkZWZpbmVkIGJ5OlxuICogICBgdiArPSBkZWx0YWBcbiAqIHdoZXJlXG4gKiAgIGBkZWx0YSA9ICgxIC0gZGVjYXkpICogKHggLSB2KWBcbiAqXG4gKiBXaXRoIHplcm9EZWJpYXMgKGRlZmF1bHQpLCB0aGUgYGRlbHRhYCB0ZXJtIGlzIHNjYWxlZCB0byBkZWJpYXMgdGhlXG4gKiBlZmZlY3Qgb2YgdGhlIChhc3N1bWVkKSB6ZXJvLWluaXRpYWxpemF0aW9uIG9mIGB2YC5cbiAqICAgYGRlbHRhIC89ICgxIC0gZGVjYXkgXiBzdGVwKWBcbiAqXG4gKiBGb3IgbW9yZSBkZXRhaWxzIG9uIHRoZSB6ZXJvLWRlYmlhc2luZyBhbGdvcml0aG0sIHNlZTpcbiAqICAgaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MFxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGNvbXBsZXRlbHkgc3RhdGVsZXNzIGFuZCBkb2VzIG5vdCBrZWVwIHRyYWNrIG9mXG4gKiBzdGVwIGNvdW50LiBUaGUgc3RlcCBjb3VudCBuZWVkcyB0byBiZSBtYWludGFpbmVkIGJ5IHRoZSBjYWxsZXIgYW5kIHBhc3NlZFxuICogaW4gYXMgYHN0ZXBgLlxuICpcbiAqIEBwYXJhbSB2IFRoZSBjdXJyZW50IG1vdmluZyBhdmVyYWdlIHZhbHVlLlxuICogQHBhcmFtIHggTmV3IGlucHV0IHZhbHVlLCBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUgYW5kIGR0eXBlIGFzIGB2YC5cbiAqIEBwYXJhbSBkZWNheSBUaGUgZGVjYXkgZmFjdG9yLiBUeXBpY2FsIHZhbHVlcyBhcmUgMC45NSBhbmQgMC45OS5cbiAqIEBwYXJhbSBzdGVwIFN0ZXAgY291bnQuXG4gKiBAcGFyYW0gemVyb0RlYmlhczogV2hldGhlciB6ZXJvRGViaWFzIGlzIHRvIGJlIHBlcmZvcm1lZCAoZGVmYXVsdDogYHRydWVgKS5cbiAqIEByZXR1cm5zIFRoZSBuZXcgbW92aW5nIGF2ZXJhZ2UgdmFsdWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnTW92aW5nIEF2ZXJhZ2UnfVxuICovXG5mdW5jdGlvbiBtb3ZpbmdBdmVyYWdlXzxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB2OiBUfFRlbnNvckxpa2UsIHg6IFR8VGVuc29yTGlrZSwgZGVjYXk6IG51bWJlcnxTY2FsYXIsXG4gICAgc3RlcD86IG51bWJlcnxTY2FsYXIsIHplcm9EZWJpYXMgPSB0cnVlKTogVCB7XG4gIGNvbnN0ICR2ID0gY29udmVydFRvVGVuc29yKHYsICd2JywgJ21vdmluZ0F2ZXJhZ2UnKTtcbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnbW92aW5nQXZlcmFnZScpO1xuICBjb25zdCAkZGVjYXkgPSBjb252ZXJ0VG9UZW5zb3IoZGVjYXksICdkZWNheScsICdtb3ZpbmdBdmVyYWdlJyk7XG5cbiAgYXNzZXJ0VHlwZXNNYXRjaCgkdiwgJHgpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHV0aWwuYXJyYXlzRXF1YWwoJHYuc2hhcGUsICR4LnNoYXBlKSwgKCkgPT4gJ1NoYXBlIG1pc21hdGNoIGluIHYgYW5kIHgnKTtcblxuICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gIGNvbnN0IG9uZU1pbnVzRGVjYXkgPSBzdWIob25lLCAkZGVjYXkpO1xuXG4gIGxldCB1cGRhdGUgPSBtdWwoc3ViKCR4LCAkdiksIG9uZU1pbnVzRGVjYXkpO1xuICBpZiAoemVyb0RlYmlhcykge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBzdGVwICE9IG51bGwsICgpID0+ICdXaGVuIHVzaW5nIHplcm9EZWJpYXM6IHRydWUsIHN0ZXAgaXMgcmVxdWlyZWQuJyk7XG4gICAgY29uc3QgJHN0ZXAgPSBjb252ZXJ0VG9UZW5zb3Ioc3RlcCwgJ3N0ZXAnLCAnbW92aW5nQXZlcmFnZScpO1xuICAgIHVwZGF0ZSA9IGRpdih1cGRhdGUsIHN1YihvbmUsIHBvdygkZGVjYXksICRzdGVwKSkpO1xuICB9XG4gIHJldHVybiBhZGQoJHYsIHVwZGF0ZSk7XG59XG5cbmV4cG9ydCBjb25zdCBtb3ZpbmdBdmVyYWdlID0gb3Aoe21vdmluZ0F2ZXJhZ2VffSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ScatterNd } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\nimport * as scatter_nd_util from './scatter_nd_util';\n/**\n * Creates a new tensor by applying sparse updates to individual\n * values or slices within a zero tensor of the given shape tensor according to\n * indices. This operator is the inverse of the `tf.gatherND` operator which\n * extracts values or slices from a given tensor.\n *\n * ```js\n * const indices = tf.tensor2d([4, 3, 1, 7], [4, 1], 'int32');\n * const updates = tf.tensor1d([9, 10, 11, 12]);\n * const shape = [8];\n * tf.scatterND(indices, updates, shape).print() //[0, 11, 0, 10, 9, 0, 0, 12]\n * ```\n *\n * @param indices The tensor contains the indices into the output tensor.\n * @param updates The tensor contains the value for the indices.\n * @param shape: The shape of the output tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n */\nfunction scatterND_(indices, updates, shape) {\n    const $indices = convertToTensor(indices, 'indices', 'scatterND', 'int32');\n    const $updates = convertToTensor(updates, 'updates', 'scatterND');\n    scatter_nd_util.validateInput($updates, $indices, shape);\n    const inputs = { indices: $indices, updates: $updates };\n    const attrs = { shape };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    return ENGINE.runKernel(ScatterNd, inputs, attrs);\n}\nexport const scatterND = op({ scatterND_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhdHRlcl9uZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NjYXR0ZXJfbmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsU0FBUyxFQUFrQyxNQUFNLGlCQUFpQixDQUFDO0FBSTNFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sS0FBSyxlQUFlLE1BQU0sbUJBQW1CLENBQUM7QUFFckQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILFNBQVMsVUFBVSxDQUNmLE9BQTBCLEVBQUUsT0FBMEIsRUFDdEQsS0FBa0I7SUFDcEIsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzNFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2xFLGVBQWUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV6RCxNQUFNLE1BQU0sR0FBb0IsRUFBQyxPQUFPLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsQ0FBQztJQUN2RSxNQUFNLEtBQUssR0FBbUIsRUFBQyxLQUFLLEVBQUMsQ0FBQztJQUV0QywwREFBMEQ7SUFDMUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNaLFNBQVMsRUFBRSxNQUE4QixFQUN6QyxLQUEyQixDQUFjLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUMsRUFBQyxVQUFVLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7U2NhdHRlck5kLCBTY2F0dGVyTmRBdHRycywgU2NhdHRlck5kSW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7UmFuaywgU2hhcGVNYXAsIFRlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0ICogYXMgc2NhdHRlcl9uZF91dGlsIGZyb20gJy4vc2NhdHRlcl9uZF91dGlsJztcblxuLyoqXG4gKiBDcmVhdGVzIGEgbmV3IHRlbnNvciBieSBhcHBseWluZyBzcGFyc2UgdXBkYXRlcyB0byBpbmRpdmlkdWFsXG4gKiB2YWx1ZXMgb3Igc2xpY2VzIHdpdGhpbiBhIHplcm8gdGVuc29yIG9mIHRoZSBnaXZlbiBzaGFwZSB0ZW5zb3IgYWNjb3JkaW5nIHRvXG4gKiBpbmRpY2VzLiBUaGlzIG9wZXJhdG9yIGlzIHRoZSBpbnZlcnNlIG9mIHRoZSBgdGYuZ2F0aGVyTkRgIG9wZXJhdG9yIHdoaWNoXG4gKiBleHRyYWN0cyB2YWx1ZXMgb3Igc2xpY2VzIGZyb20gYSBnaXZlbiB0ZW5zb3IuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGluZGljZXMgPSB0Zi50ZW5zb3IyZChbNCwgMywgMSwgN10sIFs0LCAxXSwgJ2ludDMyJyk7XG4gKiBjb25zdCB1cGRhdGVzID0gdGYudGVuc29yMWQoWzksIDEwLCAxMSwgMTJdKTtcbiAqIGNvbnN0IHNoYXBlID0gWzhdO1xuICogdGYuc2NhdHRlck5EKGluZGljZXMsIHVwZGF0ZXMsIHNoYXBlKS5wcmludCgpIC8vWzAsIDExLCAwLCAxMCwgOSwgMCwgMCwgMTJdXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0gaW5kaWNlcyBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSBpbmRpY2VzIGludG8gdGhlIG91dHB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gdXBkYXRlcyBUaGUgdGVuc29yIGNvbnRhaW5zIHRoZSB2YWx1ZSBmb3IgdGhlIGluZGljZXMuXG4gKiBAcGFyYW0gc2hhcGU6IFRoZSBzaGFwZSBvZiB0aGUgb3V0cHV0IHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gc2NhdHRlck5EXzxSIGV4dGVuZHMgUmFuaz4oXG4gICAgaW5kaWNlczogVGVuc29yfFRlbnNvckxpa2UsIHVwZGF0ZXM6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIHNoYXBlOiBTaGFwZU1hcFtSXSk6IFRlbnNvcjxSPiB7XG4gIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ3NjYXR0ZXJORCcsICdpbnQzMicpO1xuICBjb25zdCAkdXBkYXRlcyA9IGNvbnZlcnRUb1RlbnNvcih1cGRhdGVzLCAndXBkYXRlcycsICdzY2F0dGVyTkQnKTtcbiAgc2NhdHRlcl9uZF91dGlsLnZhbGlkYXRlSW5wdXQoJHVwZGF0ZXMsICRpbmRpY2VzLCBzaGFwZSk7XG5cbiAgY29uc3QgaW5wdXRzOiBTY2F0dGVyTmRJbnB1dHMgPSB7aW5kaWNlczogJGluZGljZXMsIHVwZGF0ZXM6ICR1cGRhdGVzfTtcbiAgY29uc3QgYXR0cnM6IFNjYXR0ZXJOZEF0dHJzID0ge3NoYXBlfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgIFNjYXR0ZXJOZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yPFI+O1xufVxuXG5leHBvcnQgY29uc3Qgc2NhdHRlck5EID0gb3Aoe3NjYXR0ZXJORF99KTtcbiJdfQ==","/**\n * Validate sparseToDense inputs.\n *\n * @param sparseIndices A 0-D, 1-D, or 2-D Tensor of type int32.\n * sparseIndices[i] contains the complete index where sparseValues[i] will be\n * placed.\n * @param sparseValues A 0-D or 1-D Tensor. Values\n * corresponding to each row of sparseIndices, or a scalar value to be used for\n * all sparse indices.\n * @param outputShape number[]. Shape of the dense output tensor.\n * @param validateIndices boolean. indice validation is not supported, error\n * will be thrown if it is set.\n */\nexport function validateInput(sparseIndices, sparseValues, outputShape, defaultValues) {\n    if (sparseIndices.dtype !== 'int32') {\n        throw new Error('tf.sparseToDense() expects the indices to be int32 type,' +\n            ` but the dtype was ${sparseIndices.dtype}.`);\n    }\n    if (sparseIndices.rank > 2) {\n        throw new Error('sparseIndices should be a scalar, vector, or matrix,' +\n            ` but got shape ${sparseIndices.shape}.`);\n    }\n    const numElems = sparseIndices.rank > 0 ? sparseIndices.shape[0] : 1;\n    const numDims = sparseIndices.rank > 1 ? sparseIndices.shape[1] : 1;\n    if (outputShape.length !== numDims) {\n        throw new Error('outputShape has incorrect number of elements:,' +\n            ` ${outputShape.length}, should be: ${numDims}.`);\n    }\n    const numValues = sparseValues.size;\n    if (!(sparseValues.rank === 0 ||\n        sparseValues.rank === 1 && numValues === numElems)) {\n        throw new Error('sparseValues has incorrect shape ' +\n            `${sparseValues.shape}, should be [] or [${numElems}]`);\n    }\n    if (sparseValues.dtype !== defaultValues.dtype) {\n        throw new Error('sparseValues.dtype must match defaultValues.dtype');\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3RvX2RlbnNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFrQkE7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDekIsYUFBcUIsRUFBRSxZQUFvQixFQUFFLFdBQXFCLEVBQ2xFLGFBQXFCO0lBQ3ZCLElBQUksYUFBYSxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDWCwwREFBMEQ7WUFDMUQsc0JBQXNCLGFBQWEsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ25EO0lBQ0QsSUFBSSxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUNYLHNEQUFzRDtZQUN0RCxrQkFBa0IsYUFBYSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7S0FDL0M7SUFFRCxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sT0FBTyxHQUFHLGFBQWEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFcEUsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLE9BQU8sRUFBRTtRQUNsQyxNQUFNLElBQUksS0FBSyxDQUNYLGdEQUFnRDtZQUNoRCxJQUFJLFdBQVcsQ0FBQyxNQUFNLGdCQUFnQixPQUFPLEdBQUcsQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLElBQUksQ0FBQztJQUNwQyxJQUFJLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDdkIsWUFBWSxDQUFDLElBQUksS0FBSyxDQUFDLElBQUksU0FBUyxLQUFLLFFBQVEsQ0FBQyxFQUFFO1FBQ3hELE1BQU0sSUFBSSxLQUFLLENBQ1gsbUNBQW1DO1lBQ25DLEdBQUcsWUFBWSxDQUFDLEtBQUssc0JBQXNCLFFBQVEsR0FBRyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFJLFlBQVksQ0FBQyxLQUFLLEtBQUssYUFBYSxDQUFDLEtBQUssRUFBRTtRQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLG1EQUFtRCxDQUFDLENBQUM7S0FDdEU7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogVmFsaWRhdGUgc3BhcnNlVG9EZW5zZSBpbnB1dHMuXG4gKlxuICogQHBhcmFtIHNwYXJzZUluZGljZXMgQSAwLUQsIDEtRCwgb3IgMi1EIFRlbnNvciBvZiB0eXBlIGludDMyLlxuICogc3BhcnNlSW5kaWNlc1tpXSBjb250YWlucyB0aGUgY29tcGxldGUgaW5kZXggd2hlcmUgc3BhcnNlVmFsdWVzW2ldIHdpbGwgYmVcbiAqIHBsYWNlZC5cbiAqIEBwYXJhbSBzcGFyc2VWYWx1ZXMgQSAwLUQgb3IgMS1EIFRlbnNvci4gVmFsdWVzXG4gKiBjb3JyZXNwb25kaW5nIHRvIGVhY2ggcm93IG9mIHNwYXJzZUluZGljZXMsIG9yIGEgc2NhbGFyIHZhbHVlIHRvIGJlIHVzZWQgZm9yXG4gKiBhbGwgc3BhcnNlIGluZGljZXMuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGUgbnVtYmVyW10uIFNoYXBlIG9mIHRoZSBkZW5zZSBvdXRwdXQgdGVuc29yLlxuICogQHBhcmFtIHZhbGlkYXRlSW5kaWNlcyBib29sZWFuLiBpbmRpY2UgdmFsaWRhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLCBlcnJvclxuICogd2lsbCBiZSB0aHJvd24gaWYgaXQgaXMgc2V0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGVJbnB1dChcbiAgICBzcGFyc2VJbmRpY2VzOiBUZW5zb3IsIHNwYXJzZVZhbHVlczogVGVuc29yLCBvdXRwdXRTaGFwZTogbnVtYmVyW10sXG4gICAgZGVmYXVsdFZhbHVlczogVGVuc29yKSB7XG4gIGlmIChzcGFyc2VJbmRpY2VzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndGYuc3BhcnNlVG9EZW5zZSgpIGV4cGVjdHMgdGhlIGluZGljZXMgdG8gYmUgaW50MzIgdHlwZSwnICtcbiAgICAgICAgYCBidXQgdGhlIGR0eXBlIHdhcyAke3NwYXJzZUluZGljZXMuZHR5cGV9LmApO1xuICB9XG4gIGlmIChzcGFyc2VJbmRpY2VzLnJhbmsgPiAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnc3BhcnNlSW5kaWNlcyBzaG91bGQgYmUgYSBzY2FsYXIsIHZlY3Rvciwgb3IgbWF0cml4LCcgK1xuICAgICAgICBgIGJ1dCBnb3Qgc2hhcGUgJHtzcGFyc2VJbmRpY2VzLnNoYXBlfS5gKTtcbiAgfVxuXG4gIGNvbnN0IG51bUVsZW1zID0gc3BhcnNlSW5kaWNlcy5yYW5rID4gMCA/IHNwYXJzZUluZGljZXMuc2hhcGVbMF0gOiAxO1xuICBjb25zdCBudW1EaW1zID0gc3BhcnNlSW5kaWNlcy5yYW5rID4gMSA/IHNwYXJzZUluZGljZXMuc2hhcGVbMV0gOiAxO1xuXG4gIGlmIChvdXRwdXRTaGFwZS5sZW5ndGggIT09IG51bURpbXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdvdXRwdXRTaGFwZSBoYXMgaW5jb3JyZWN0IG51bWJlciBvZiBlbGVtZW50czosJyArXG4gICAgICAgIGAgJHtvdXRwdXRTaGFwZS5sZW5ndGh9LCBzaG91bGQgYmU6ICR7bnVtRGltc30uYCk7XG4gIH1cblxuICBjb25zdCBudW1WYWx1ZXMgPSBzcGFyc2VWYWx1ZXMuc2l6ZTtcbiAgaWYgKCEoc3BhcnNlVmFsdWVzLnJhbmsgPT09IDAgfHxcbiAgICAgICAgc3BhcnNlVmFsdWVzLnJhbmsgPT09IDEgJiYgbnVtVmFsdWVzID09PSBudW1FbGVtcykpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdzcGFyc2VWYWx1ZXMgaGFzIGluY29ycmVjdCBzaGFwZSAnICtcbiAgICAgICAgYCR7c3BhcnNlVmFsdWVzLnNoYXBlfSwgc2hvdWxkIGJlIFtdIG9yIFske251bUVsZW1zfV1gKTtcbiAgfVxuXG4gIGlmIChzcGFyc2VWYWx1ZXMuZHR5cGUgIT09IGRlZmF1bHRWYWx1ZXMuZHR5cGUpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NwYXJzZVZhbHVlcy5kdHlwZSBtdXN0IG1hdGNoIGRlZmF1bHRWYWx1ZXMuZHR5cGUnKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { SparseToDense } from '../kernel_names';\nimport * as sparse_to_dense from '../ops/sparse_to_dense_util';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Converts a sparse representation into a dense tensor.\n *\n * Builds an array dense with shape outputShape such that:\n *\n * // If sparseIndices is scalar\n * dense[i] = (i == sparseIndices ? sparseValues : defaultValue)\n *\n * // If sparseIndices is a vector, then for each i\n * dense[sparseIndices[i]] = sparseValues[i]\n *\n * // If sparseIndices is an n by d matrix, then for each i in [0, n)\n * dense[sparseIndices[i][0], ..., sparseIndices[i][d-1]] = sparseValues[i]\n * All other values in dense are set to defaultValue. If sparseValues is a\n * scalar, all sparse indices are set to this single value.\n *\n * If indices are repeated the final value is summed over all values for those\n * indices.\n *\n * ```js\n * const indices = tf.tensor1d([4, 5, 6, 1, 2, 3], 'int32');\n * const values = tf.tensor1d([10, 11, 12, 13, 14, 15], 'float32');\n * const shape = [8];\n * tf.sparseToDense(indices, values, shape).print();\n * ```\n *\n * @param sparseIndices A 0-D, 1-D, or 2-D Tensor of type int32.\n * sparseIndices[i] contains the complete index where sparseValues[i] will be\n * placed.\n * @param sparseValues A 0-D or 1-D Tensor. Values\n * corresponding to each row of sparseIndices, or a scalar value to be used for\n * all sparse indices.\n * @param outputShape Shape of the dense output tensor. The type is inferred.\n * @param defaultValue Scalar. Value to set for indices not specified in\n * sparseIndices. Defaults to zero.\n *\n * @doc {heading: 'Operations', subheading: 'Normalization'}\n */\nfunction sparseToDense_(sparseIndices, sparseValues, outputShape, defaultValue = 0) {\n    const $sparseIndices = convertToTensor(sparseIndices, 'sparseIndices', 'sparseToDense', 'int32');\n    const $sparseValues = convertToTensor(sparseValues, 'sparseValues', 'sparseToDense', 'string_or_numeric');\n    const $defaultValue = convertToTensor(defaultValue, 'defaultValue', 'sparseToDense', $sparseValues.dtype);\n    sparse_to_dense.validateInput($sparseIndices, $sparseValues, outputShape, $defaultValue);\n    const inputs = {\n        sparseIndices: $sparseIndices,\n        sparseValues: $sparseValues,\n        defaultValue: $defaultValue\n    };\n    const attrs = { outputShape };\n    return ENGINE.runKernel(SparseToDense, inputs, attrs);\n}\nexport const sparseToDense = op({ sparseToDense_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3RvX2RlbnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3BhcnNlX3RvX2RlbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLGFBQWEsRUFBMEMsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RixPQUFPLEtBQUssZUFBZSxNQUFNLDZCQUE2QixDQUFDO0FBRy9ELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUduRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUNHO0FBQ0gsU0FBUyxjQUFjLENBQ25CLGFBQWdDLEVBQUUsWUFBK0IsRUFDakUsV0FBd0IsRUFBRSxlQUFrQyxDQUFDO0lBQy9ELE1BQU0sY0FBYyxHQUNoQixlQUFlLENBQUMsYUFBYSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDOUUsTUFBTSxhQUFhLEdBQUcsZUFBZSxDQUNqQyxZQUFZLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FDakMsWUFBWSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXhFLGVBQWUsQ0FBQyxhQUFhLENBQ3pCLGNBQWMsRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sTUFBTSxHQUF3QjtRQUNsQyxhQUFhLEVBQUUsY0FBYztRQUM3QixZQUFZLEVBQUUsYUFBYTtRQUMzQixZQUFZLEVBQUUsYUFBYTtLQUM1QixDQUFDO0lBRUYsTUFBTSxLQUFLLEdBQXVCLEVBQUMsV0FBVyxFQUFDLENBQUM7SUFFaEQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixhQUFhLEVBQUUsTUFBOEIsRUFDN0MsS0FBMkIsQ0FBQyxDQUFDO0FBQ25DLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1NwYXJzZVRvRGVuc2UsIFNwYXJzZVRvRGVuc2VBdHRycywgU3BhcnNlVG9EZW5zZUlucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0ICogYXMgc3BhcnNlX3RvX2RlbnNlIGZyb20gJy4uL29wcy9zcGFyc2VfdG9fZGVuc2VfdXRpbCc7XG5pbXBvcnQge1NjYWxhciwgVGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtSYW5rLCBTY2FsYXJMaWtlLCBTaGFwZU1hcCwgVGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29udmVydHMgYSBzcGFyc2UgcmVwcmVzZW50YXRpb24gaW50byBhIGRlbnNlIHRlbnNvci5cbiAqXG4gKiBCdWlsZHMgYW4gYXJyYXkgZGVuc2Ugd2l0aCBzaGFwZSBvdXRwdXRTaGFwZSBzdWNoIHRoYXQ6XG4gKlxuICogLy8gSWYgc3BhcnNlSW5kaWNlcyBpcyBzY2FsYXJcbiAqIGRlbnNlW2ldID0gKGkgPT0gc3BhcnNlSW5kaWNlcyA/IHNwYXJzZVZhbHVlcyA6IGRlZmF1bHRWYWx1ZSlcbiAqXG4gKiAvLyBJZiBzcGFyc2VJbmRpY2VzIGlzIGEgdmVjdG9yLCB0aGVuIGZvciBlYWNoIGlcbiAqIGRlbnNlW3NwYXJzZUluZGljZXNbaV1dID0gc3BhcnNlVmFsdWVzW2ldXG4gKlxuICogLy8gSWYgc3BhcnNlSW5kaWNlcyBpcyBhbiBuIGJ5IGQgbWF0cml4LCB0aGVuIGZvciBlYWNoIGkgaW4gWzAsIG4pXG4gKiBkZW5zZVtzcGFyc2VJbmRpY2VzW2ldWzBdLCAuLi4sIHNwYXJzZUluZGljZXNbaV1bZC0xXV0gPSBzcGFyc2VWYWx1ZXNbaV1cbiAqIEFsbCBvdGhlciB2YWx1ZXMgaW4gZGVuc2UgYXJlIHNldCB0byBkZWZhdWx0VmFsdWUuIElmIHNwYXJzZVZhbHVlcyBpcyBhXG4gKiBzY2FsYXIsIGFsbCBzcGFyc2UgaW5kaWNlcyBhcmUgc2V0IHRvIHRoaXMgc2luZ2xlIHZhbHVlLlxuICpcbiAqIElmIGluZGljZXMgYXJlIHJlcGVhdGVkIHRoZSBmaW5hbCB2YWx1ZSBpcyBzdW1tZWQgb3ZlciBhbGwgdmFsdWVzIGZvciB0aG9zZVxuICogaW5kaWNlcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjFkKFs0LCA1LCA2LCAxLCAyLCAzXSwgJ2ludDMyJyk7XG4gKiBjb25zdCB2YWx1ZXMgPSB0Zi50ZW5zb3IxZChbMTAsIDExLCAxMiwgMTMsIDE0LCAxNV0sICdmbG9hdDMyJyk7XG4gKiBjb25zdCBzaGFwZSA9IFs4XTtcbiAqIHRmLnNwYXJzZVRvRGVuc2UoaW5kaWNlcywgdmFsdWVzLCBzaGFwZSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBzcGFyc2VJbmRpY2VzIEEgMC1ELCAxLUQsIG9yIDItRCBUZW5zb3Igb2YgdHlwZSBpbnQzMi5cbiAqIHNwYXJzZUluZGljZXNbaV0gY29udGFpbnMgdGhlIGNvbXBsZXRlIGluZGV4IHdoZXJlIHNwYXJzZVZhbHVlc1tpXSB3aWxsIGJlXG4gKiBwbGFjZWQuXG4gKiBAcGFyYW0gc3BhcnNlVmFsdWVzIEEgMC1EIG9yIDEtRCBUZW5zb3IuIFZhbHVlc1xuICogY29ycmVzcG9uZGluZyB0byBlYWNoIHJvdyBvZiBzcGFyc2VJbmRpY2VzLCBvciBhIHNjYWxhciB2YWx1ZSB0byBiZSB1c2VkIGZvclxuICogYWxsIHNwYXJzZSBpbmRpY2VzLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIFNoYXBlIG9mIHRoZSBkZW5zZSBvdXRwdXQgdGVuc29yLiBUaGUgdHlwZSBpcyBpbmZlcnJlZC5cbiAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgU2NhbGFyLiBWYWx1ZSB0byBzZXQgZm9yIGluZGljZXMgbm90IHNwZWNpZmllZCBpblxuICogc3BhcnNlSW5kaWNlcy4gRGVmYXVsdHMgdG8gemVyby5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdOb3JtYWxpemF0aW9uJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlVG9EZW5zZV88UiBleHRlbmRzIFJhbms+KFxuICAgIHNwYXJzZUluZGljZXM6IFRlbnNvcnxUZW5zb3JMaWtlLCBzcGFyc2VWYWx1ZXM6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIG91dHB1dFNoYXBlOiBTaGFwZU1hcFtSXSwgZGVmYXVsdFZhbHVlOiBTY2FsYXJ8U2NhbGFyTGlrZSA9IDApOiBUZW5zb3I8Uj4ge1xuICBjb25zdCAkc3BhcnNlSW5kaWNlcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3Ioc3BhcnNlSW5kaWNlcywgJ3NwYXJzZUluZGljZXMnLCAnc3BhcnNlVG9EZW5zZScsICdpbnQzMicpO1xuICBjb25zdCAkc3BhcnNlVmFsdWVzID0gY29udmVydFRvVGVuc29yKFxuICAgICAgc3BhcnNlVmFsdWVzLCAnc3BhcnNlVmFsdWVzJywgJ3NwYXJzZVRvRGVuc2UnLCAnc3RyaW5nX29yX251bWVyaWMnKTtcbiAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IGNvbnZlcnRUb1RlbnNvcihcbiAgICAgIGRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHRWYWx1ZScsICdzcGFyc2VUb0RlbnNlJywgJHNwYXJzZVZhbHVlcy5kdHlwZSk7XG5cbiAgc3BhcnNlX3RvX2RlbnNlLnZhbGlkYXRlSW5wdXQoXG4gICAgICAkc3BhcnNlSW5kaWNlcywgJHNwYXJzZVZhbHVlcywgb3V0cHV0U2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuXG4gIGNvbnN0IGlucHV0czogU3BhcnNlVG9EZW5zZUlucHV0cyA9IHtcbiAgICBzcGFyc2VJbmRpY2VzOiAkc3BhcnNlSW5kaWNlcyxcbiAgICBzcGFyc2VWYWx1ZXM6ICRzcGFyc2VWYWx1ZXMsXG4gICAgZGVmYXVsdFZhbHVlOiAkZGVmYXVsdFZhbHVlXG4gIH07XG5cbiAgY29uc3QgYXR0cnM6IFNwYXJzZVRvRGVuc2VBdHRycyA9IHtvdXRwdXRTaGFwZX07XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBTcGFyc2VUb0RlbnNlLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlVG9EZW5zZSA9IG9wKHtzcGFyc2VUb0RlbnNlX30pO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { GatherNd } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport { op } from './operation';\n/**\n * Gather slices from input tensor into a Tensor with shape specified by\n * `indices`.\n *\n * `indices` is a K-dimensional integer tensor, best thought of as a\n * (K-1)-dimensional tensor of indices into input, where each element defines a\n * slice of input:\n * output[\\\\(i_0, ..., i_{K-2}\\\\)] = input[indices[\\\\(i_0, ..., i_{K-2}\\\\)]]\n *\n * Whereas in `tf.gather`, `indices` defines slices into the first dimension of\n * input, in `tf.gatherND`, `indices` defines slices into the first N dimensions\n * of input, where N = indices.shape[-1].\n *\n * The last dimension of indices can be at most the rank of input:\n * indices.shape[-1] <= input.rank\n *\n * The last dimension of `indices` corresponds to elements\n * (if indices.shape[-1] == input.rank) or slices\n * (if indices.shape[-1] < input.rank) along dimension indices.shape[-1] of\n * input.\n * The output tensor has shape\n * indices.shape[:-1] + input.shape[indices.shape[-1]:]\n *\n * Note that on CPU, if an out of bound index is found, an error is returned. On\n * GPU, if an out of bound index is found, a 0 is stored in the corresponding\n * output value.\n *\n * ```js\n * const indices = tf.tensor2d([0, 1, 1, 0], [2,2], 'int32');\n * const input = tf.tensor2d([9, 10, 11, 12], [2, 2]);\n * tf.gatherND(input, indices).print() // [10, 11]\n * ```\n *\n * @param x The tensor from which to gather values.\n * @param indices Index tensor, must be of type int32.\n *\n * @doc {heading: 'Operations', subheading: 'Slicing and Joining'}\n */\nfunction gatherND_(x, indices) {\n    const $indices = convertToTensor(indices, 'indices', 'gatherND', 'int32');\n    const $x = convertToTensor(x, 'x', 'gatherND', 'string_or_numeric');\n    const inputs = { params: $x, indices: $indices };\n    return ENGINE.runKernel(GatherNd, inputs);\n}\nexport const gatherND = op({ gatherND_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyX25kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZ2F0aGVyX25kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFFBQVEsRUFBaUIsTUFBTSxpQkFBaUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUvQjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQUNILFNBQVMsU0FBUyxDQUFDLENBQW9CLEVBQUUsT0FBMEI7SUFDakUsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzFFLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sTUFBTSxHQUFtQixFQUFDLE1BQU0sRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBRS9ELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsTUFBOEIsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtHYXRoZXJOZCwgR2F0aGVyTmRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEdhdGhlciBzbGljZXMgZnJvbSBpbnB1dCB0ZW5zb3IgaW50byBhIFRlbnNvciB3aXRoIHNoYXBlIHNwZWNpZmllZCBieVxuICogYGluZGljZXNgLlxuICpcbiAqIGBpbmRpY2VzYCBpcyBhIEstZGltZW5zaW9uYWwgaW50ZWdlciB0ZW5zb3IsIGJlc3QgdGhvdWdodCBvZiBhcyBhXG4gKiAoSy0xKS1kaW1lbnNpb25hbCB0ZW5zb3Igb2YgaW5kaWNlcyBpbnRvIGlucHV0LCB3aGVyZSBlYWNoIGVsZW1lbnQgZGVmaW5lcyBhXG4gKiBzbGljZSBvZiBpbnB1dDpcbiAqIG91dHB1dFtcXFxcKGlfMCwgLi4uLCBpX3tLLTJ9XFxcXCldID0gaW5wdXRbaW5kaWNlc1tcXFxcKGlfMCwgLi4uLCBpX3tLLTJ9XFxcXCldXVxuICpcbiAqIFdoZXJlYXMgaW4gYHRmLmdhdGhlcmAsIGBpbmRpY2VzYCBkZWZpbmVzIHNsaWNlcyBpbnRvIHRoZSBmaXJzdCBkaW1lbnNpb24gb2ZcbiAqIGlucHV0LCBpbiBgdGYuZ2F0aGVyTkRgLCBgaW5kaWNlc2AgZGVmaW5lcyBzbGljZXMgaW50byB0aGUgZmlyc3QgTiBkaW1lbnNpb25zXG4gKiBvZiBpbnB1dCwgd2hlcmUgTiA9IGluZGljZXMuc2hhcGVbLTFdLlxuICpcbiAqIFRoZSBsYXN0IGRpbWVuc2lvbiBvZiBpbmRpY2VzIGNhbiBiZSBhdCBtb3N0IHRoZSByYW5rIG9mIGlucHV0OlxuICogaW5kaWNlcy5zaGFwZVstMV0gPD0gaW5wdXQucmFua1xuICpcbiAqIFRoZSBsYXN0IGRpbWVuc2lvbiBvZiBgaW5kaWNlc2AgY29ycmVzcG9uZHMgdG8gZWxlbWVudHNcbiAqIChpZiBpbmRpY2VzLnNoYXBlWy0xXSA9PSBpbnB1dC5yYW5rKSBvciBzbGljZXNcbiAqIChpZiBpbmRpY2VzLnNoYXBlWy0xXSA8IGlucHV0LnJhbmspIGFsb25nIGRpbWVuc2lvbiBpbmRpY2VzLnNoYXBlWy0xXSBvZlxuICogaW5wdXQuXG4gKiBUaGUgb3V0cHV0IHRlbnNvciBoYXMgc2hhcGVcbiAqIGluZGljZXMuc2hhcGVbOi0xXSArIGlucHV0LnNoYXBlW2luZGljZXMuc2hhcGVbLTFdOl1cbiAqXG4gKiBOb3RlIHRoYXQgb24gQ1BVLCBpZiBhbiBvdXQgb2YgYm91bmQgaW5kZXggaXMgZm91bmQsIGFuIGVycm9yIGlzIHJldHVybmVkLiBPblxuICogR1BVLCBpZiBhbiBvdXQgb2YgYm91bmQgaW5kZXggaXMgZm91bmQsIGEgMCBpcyBzdG9yZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG91dHB1dCB2YWx1ZS5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5kaWNlcyA9IHRmLnRlbnNvcjJkKFswLCAxLCAxLCAwXSwgWzIsMl0sICdpbnQzMicpO1xuICogY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IyZChbOSwgMTAsIDExLCAxMl0sIFsyLCAyXSk7XG4gKiB0Zi5nYXRoZXJORChpbnB1dCwgaW5kaWNlcykucHJpbnQoKSAvLyBbMTAsIDExXVxuICogYGBgXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciBmcm9tIHdoaWNoIHRvIGdhdGhlciB2YWx1ZXMuXG4gKiBAcGFyYW0gaW5kaWNlcyBJbmRleCB0ZW5zb3IsIG11c3QgYmUgb2YgdHlwZSBpbnQzMi5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTbGljaW5nIGFuZCBKb2luaW5nJ31cbiAqL1xuZnVuY3Rpb24gZ2F0aGVyTkRfKHg6IFRlbnNvcnxUZW5zb3JMaWtlLCBpbmRpY2VzOiBUZW5zb3J8VGVuc29yTGlrZSk6IFRlbnNvciB7XG4gIGNvbnN0ICRpbmRpY2VzID0gY29udmVydFRvVGVuc29yKGluZGljZXMsICdpbmRpY2VzJywgJ2dhdGhlck5EJywgJ2ludDMyJyk7XG4gIGNvbnN0ICR4ID0gY29udmVydFRvVGVuc29yKHgsICd4JywgJ2dhdGhlck5EJywgJ3N0cmluZ19vcl9udW1lcmljJyk7XG5cbiAgY29uc3QgaW5wdXRzOiBHYXRoZXJOZElucHV0cyA9IHtwYXJhbXM6ICR4LCBpbmRpY2VzOiAkaW5kaWNlc307XG5cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoR2F0aGVyTmQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG59XG5cbmV4cG9ydCBjb25zdCBnYXRoZXJORCA9IG9wKHtnYXRoZXJORF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\n/**\n * Normalize noise shape based on provided tensor and noise shape.\n *\n * @param x Tensor.\n * @param noiseShape The shape for the randomly generated keep/drop flags, as\n *   an array of numbers. Optional.\n * @returns Normalized noise shape.\n */\nexport function getNoiseShape(x, noiseShape) {\n    if (noiseShape == null) {\n        return x.shape.slice();\n    }\n    if (util.arraysEqual(x.shape, noiseShape)) {\n        return noiseShape;\n    }\n    if (x.shape.length === noiseShape.length) {\n        const newDimension = [];\n        for (let i = 0; i < x.shape.length; i++) {\n            if (noiseShape[i] == null && x.shape[i] != null) {\n                newDimension.push(x.shape[i]);\n            }\n            else {\n                newDimension.push(noiseShape[i]);\n            }\n        }\n        return newDimension;\n    }\n    return noiseShape;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcG91dF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZHJvcG91dF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sS0FBSyxJQUFJLE1BQU0sU0FBUyxDQUFDO0FBRWhDOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLENBQVMsRUFBRSxVQUFxQjtJQUM1RCxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsT0FBTyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLEVBQUU7UUFDekMsT0FBTyxVQUFVLENBQUM7S0FDbkI7SUFDRCxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLFVBQVUsQ0FBQyxNQUFNLEVBQUU7UUFDeEMsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLEVBQUU7Z0JBQy9DLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLFlBQVksQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDbEM7U0FDRjtRQUNELE9BQU8sWUFBWSxDQUFDO0tBQ3JCO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIE5vcm1hbGl6ZSBub2lzZSBzaGFwZSBiYXNlZCBvbiBwcm92aWRlZCB0ZW5zb3IgYW5kIG5vaXNlIHNoYXBlLlxuICpcbiAqIEBwYXJhbSB4IFRlbnNvci5cbiAqIEBwYXJhbSBub2lzZVNoYXBlIFRoZSBzaGFwZSBmb3IgdGhlIHJhbmRvbWx5IGdlbmVyYXRlZCBrZWVwL2Ryb3AgZmxhZ3MsIGFzXG4gKiAgIGFuIGFycmF5IG9mIG51bWJlcnMuIE9wdGlvbmFsLlxuICogQHJldHVybnMgTm9ybWFsaXplZCBub2lzZSBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vaXNlU2hhcGUoeDogVGVuc29yLCBub2lzZVNoYXBlPzogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGlmIChub2lzZVNoYXBlID09IG51bGwpIHtcbiAgICByZXR1cm4geC5zaGFwZS5zbGljZSgpO1xuICB9XG4gIGlmICh1dGlsLmFycmF5c0VxdWFsKHguc2hhcGUsIG5vaXNlU2hhcGUpKSB7XG4gICAgcmV0dXJuIG5vaXNlU2hhcGU7XG4gIH1cbiAgaWYgKHguc2hhcGUubGVuZ3RoID09PSBub2lzZVNoYXBlLmxlbmd0aCkge1xuICAgIGNvbnN0IG5ld0RpbWVuc2lvbjogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHguc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChub2lzZVNoYXBlW2ldID09IG51bGwgJiYgeC5zaGFwZVtpXSAhPSBudWxsKSB7XG4gICAgICAgIG5ld0RpbWVuc2lvbi5wdXNoKHguc2hhcGVbaV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3RGltZW5zaW9uLnB1c2gobm9pc2VTaGFwZVtpXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBuZXdEaW1lbnNpb247XG4gIH1cblxuICByZXR1cm4gbm9pc2VTaGFwZTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tensor } from '../tensor';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { add } from './add';\nimport { div } from './div';\nimport { getNoiseShape } from './dropout_util';\nimport { floor } from './floor';\nimport { mul } from './mul';\nimport { op } from './operation';\nimport { randomUniform } from './random_uniform';\n/**\n * Computes dropout.\n *\n * ```js\n * const x = tf.tensor1d([1, 2, 2, 1]);\n * const rate = 0.75;\n * const output = tf.dropout(x, rate);\n * output.print();\n * ```\n *\n * @param x A floating point Tensor or TensorLike.\n * @param rate A float in the range [0, 1). The probability that each element\n *   of x is discarded.\n * @param noiseShape An array of numbers of type int32, representing the\n * shape for randomly generated keep/drop flags. If the noiseShape has null\n * value, it will be automatically replaced with the x's relative dimension\n * size. Optional.\n * @param seed Used to create random seeds. Optional.\n * @returns A Tensor of the same shape of x.\n *\n * @doc {heading: 'Operations', subheading: 'Dropout'}\n */\nfunction dropout_(x, rate, noiseShape, seed) {\n    const $x = convertToTensor(x, 'x', 'dropout');\n    util.assert($x.dtype === 'float32', () => `x has to be a floating point tensor since it's going to be ` +\n        `scaled, but got a ${$x.dtype} tensor instead.`);\n    util.assert(rate >= 0 && rate < 1, () => `rate must be a float in the range [0, 1), but got ${rate}.`);\n    if (rate === 0) {\n        return x instanceof Tensor ? $x.clone() : $x;\n    }\n    const $noiseShape = getNoiseShape($x, noiseShape);\n    const keepProb = 1 - rate;\n    const multiplier = div(floor(add(randomUniform($noiseShape, 0, 1, 'float32', seed), keepProb)), keepProb);\n    return mul($x, multiplier);\n}\nexport const dropout = op({ dropout_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJvcG91dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Ryb3BvdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFL0M7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILFNBQVMsUUFBUSxDQUNiLENBQW9CLEVBQUUsSUFBWSxFQUFFLFVBQXFCLEVBQ3pELElBQW9CO0lBQ3RCLE1BQU0sRUFBRSxHQUFHLGVBQWUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTlDLElBQUksQ0FBQyxNQUFNLENBQ1AsRUFBRSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQ3RCLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtRQUMvRCxxQkFBcUIsRUFBRSxDQUFDLEtBQUssa0JBQWtCLENBQUMsQ0FBQztJQUN6RCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQUMscURBQXFELElBQUksR0FBRyxDQUFDLENBQUM7SUFFeEUsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxDQUFDLFlBQVksTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztLQUM5QztJQUVELE1BQU0sV0FBVyxHQUFHLGFBQWEsQ0FBQyxFQUFFLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUMxQixNQUFNLFVBQVUsR0FBRyxHQUFHLENBQ2xCLEtBQUssQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxFQUN2RSxRQUFRLENBQUMsQ0FBQztJQUVkLE9BQU8sR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7YWRkfSBmcm9tICcuL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi9kaXYnO1xuaW1wb3J0IHtnZXROb2lzZVNoYXBlfSBmcm9tICcuL2Ryb3BvdXRfdXRpbCc7XG5pbXBvcnQge2Zsb29yfSBmcm9tICcuL2Zsb29yJztcbmltcG9ydCB7bXVsfSBmcm9tICcuL211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3JhbmRvbVVuaWZvcm19IGZyb20gJy4vcmFuZG9tX3VuaWZvcm0nO1xuXG4vKipcbiAqIENvbXB1dGVzIGRyb3BvdXQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3IxZChbMSwgMiwgMiwgMV0pO1xuICogY29uc3QgcmF0ZSA9IDAuNzU7XG4gKiBjb25zdCBvdXRwdXQgPSB0Zi5kcm9wb3V0KHgsIHJhdGUpO1xuICogb3V0cHV0LnByaW50KCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBBIGZsb2F0aW5nIHBvaW50IFRlbnNvciBvciBUZW5zb3JMaWtlLlxuICogQHBhcmFtIHJhdGUgQSBmbG9hdCBpbiB0aGUgcmFuZ2UgWzAsIDEpLiBUaGUgcHJvYmFiaWxpdHkgdGhhdCBlYWNoIGVsZW1lbnRcbiAqICAgb2YgeCBpcyBkaXNjYXJkZWQuXG4gKiBAcGFyYW0gbm9pc2VTaGFwZSBBbiBhcnJheSBvZiBudW1iZXJzIG9mIHR5cGUgaW50MzIsIHJlcHJlc2VudGluZyB0aGVcbiAqIHNoYXBlIGZvciByYW5kb21seSBnZW5lcmF0ZWQga2VlcC9kcm9wIGZsYWdzLiBJZiB0aGUgbm9pc2VTaGFwZSBoYXMgbnVsbFxuICogdmFsdWUsIGl0IHdpbGwgYmUgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSB4J3MgcmVsYXRpdmUgZGltZW5zaW9uXG4gKiBzaXplLiBPcHRpb25hbC5cbiAqIEBwYXJhbSBzZWVkIFVzZWQgdG8gY3JlYXRlIHJhbmRvbSBzZWVkcy4gT3B0aW9uYWwuXG4gKiBAcmV0dXJucyBBIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBvZiB4LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0Ryb3BvdXQnfVxuICovXG5mdW5jdGlvbiBkcm9wb3V0XyhcbiAgICB4OiBUZW5zb3J8VGVuc29yTGlrZSwgcmF0ZTogbnVtYmVyLCBub2lzZVNoYXBlPzogbnVtYmVyW10sXG4gICAgc2VlZD86IG51bWJlcnxzdHJpbmcpOiBUZW5zb3Ige1xuICBjb25zdCAkeCA9IGNvbnZlcnRUb1RlbnNvcih4LCAneCcsICdkcm9wb3V0Jyk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkeC5kdHlwZSA9PT0gJ2Zsb2F0MzInLFxuICAgICAgKCkgPT4gYHggaGFzIHRvIGJlIGEgZmxvYXRpbmcgcG9pbnQgdGVuc29yIHNpbmNlIGl0J3MgZ29pbmcgdG8gYmUgYCArXG4gICAgICAgICAgYHNjYWxlZCwgYnV0IGdvdCBhICR7JHguZHR5cGV9IHRlbnNvciBpbnN0ZWFkLmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHJhdGUgPj0gMCAmJiByYXRlIDwgMSxcbiAgICAgICgpID0+IGByYXRlIG11c3QgYmUgYSBmbG9hdCBpbiB0aGUgcmFuZ2UgWzAsIDEpLCBidXQgZ290ICR7cmF0ZX0uYCk7XG5cbiAgaWYgKHJhdGUgPT09IDApIHtcbiAgICByZXR1cm4geCBpbnN0YW5jZW9mIFRlbnNvciA/ICR4LmNsb25lKCkgOiAkeDtcbiAgfVxuXG4gIGNvbnN0ICRub2lzZVNoYXBlID0gZ2V0Tm9pc2VTaGFwZSgkeCwgbm9pc2VTaGFwZSk7XG4gIGNvbnN0IGtlZXBQcm9iID0gMSAtIHJhdGU7XG4gIGNvbnN0IG11bHRpcGxpZXIgPSBkaXYoXG4gICAgICBmbG9vcihhZGQocmFuZG9tVW5pZm9ybSgkbm9pc2VTaGFwZSwgMCwgMSwgJ2Zsb2F0MzInLCBzZWVkKSwga2VlcFByb2IpKSxcbiAgICAgIGtlZXBQcm9iKTtcblxuICByZXR1cm4gbXVsKCR4LCBtdWx0aXBsaWVyKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRyb3BvdXQgPSBvcCh7ZHJvcG91dF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { tensor1d } from './tensor1d';\nexport function enclosingPowerOfTwo(value) {\n    // Return 2**N for integer N such that 2**N >= value.\n    return Math.floor(Math.pow(2, Math.ceil(Math.log(value) / Math.log(2.0))));\n}\nexport function cosineWindow(windowLength, a, b) {\n    const even = 1 - windowLength % 2;\n    const newValues = new Float32Array(windowLength);\n    for (let i = 0; i < windowLength; ++i) {\n        const cosArg = (2.0 * Math.PI * i) / (windowLength + even - 1);\n        newValues[i] = a - b * Math.cos(cosArg);\n    }\n    return tensor1d(newValues, 'float32');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbmFsX29wc191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2lnbmFsX29wc191dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxVQUFVLG1CQUFtQixDQUFDLEtBQWE7SUFDL0MscURBQXFEO0lBQ3JELE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FDeEIsWUFBb0IsRUFBRSxDQUFTLEVBQUUsQ0FBUztJQUM1QyxNQUFNLElBQUksR0FBRyxDQUFDLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQztJQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNqRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsWUFBWSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9ELFNBQVMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDekM7SUFDRCxPQUFPLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7dGVuc29yMWR9IGZyb20gJy4vdGVuc29yMWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gZW5jbG9zaW5nUG93ZXJPZlR3byh2YWx1ZTogbnVtYmVyKSB7XG4gIC8vIFJldHVybiAyKipOIGZvciBpbnRlZ2VyIE4gc3VjaCB0aGF0IDIqKk4gPj0gdmFsdWUuXG4gIHJldHVybiBNYXRoLmZsb29yKE1hdGgucG93KDIsIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLmxvZygyLjApKSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lV2luZG93KFxuICAgIHdpbmRvd0xlbmd0aDogbnVtYmVyLCBhOiBudW1iZXIsIGI6IG51bWJlcik6IFRlbnNvcjFEIHtcbiAgY29uc3QgZXZlbiA9IDEgLSB3aW5kb3dMZW5ndGggJSAyO1xuICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHdpbmRvd0xlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2luZG93TGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBjb3NBcmcgPSAoMi4wICogTWF0aC5QSSAqIGkpIC8gKHdpbmRvd0xlbmd0aCArIGV2ZW4gLSAxKTtcbiAgICBuZXdWYWx1ZXNbaV0gPSBhIC0gYiAqIE1hdGguY29zKGNvc0FyZyk7XG4gIH1cbiAgcmV0dXJuIHRlbnNvcjFkKG5ld1ZhbHVlcywgJ2Zsb2F0MzInKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../tensor_util_env';\nimport { assert, assertShapesMatch, getTypedArrayFromDType } from '../util';\nimport { tensor } from './tensor';\n/**\n * Returns whether the targets are in the top K predictions.\n *\n * ```js\n * const predictions = tf.tensor2d([[20, 10, 40, 30], [30, 50, -20, 10]]);\n * const targets = tf.tensor1d([2, 0]);\n * const precision = await tf.inTopKAsync(predictions, targets);\n * precision.print();\n * ```\n * @param predictions 2-D or higher `tf.Tensor` with last dimension being\n *     at least `k`.\n * @param targets 1-D or higher `tf.Tensor`.\n * @param k Optional Number of top elements to look at for computing precision,\n *     default to 1.\n *\n * @doc {heading: 'Operations', subheading: 'Evaluation'}\n */\nasync function inTopKAsync_(predictions, targets, k = 1) {\n    const $predictions = convertToTensor(predictions, 'predictions', 'inTopK');\n    const $targets = convertToTensor(targets, 'targets', 'inTopK');\n    assert($predictions.rank > 1, () => 'inTopK() expects the predictions to be of rank 2 or higher, ' +\n        `but got ${$predictions.rank}`);\n    assert($predictions.rank - 1 === $targets.rank, () => `predictions rank should be 1 larger than ` +\n        `targets rank, but got predictions rank ` +\n        `${$predictions.rank} and targets rank ${$targets.rank}`);\n    assertShapesMatch($predictions.shape.slice(0, $predictions.shape.length - 1), $targets.shape, `predictions's shape should be align with the targets' shape, ` +\n        'except the last dimension.');\n    const lastDim = $predictions.shape[$predictions.shape.length - 1];\n    assert(k > 0 && k <= lastDim, () => `'k' passed to inTopK() must be > 0 && <= the predictions last ` +\n        `dimension (${lastDim}), but got ${k}`);\n    const predictionsVals = await $predictions.data();\n    const targetsVals = await $targets.data();\n    // Reshape predictionsVals into a 2d tensor [batch, lastDim]\n    // and look up topK along lastDim.\n    const [batch, size] = [predictionsVals.length / lastDim, lastDim];\n    const precision = getTypedArrayFromDType('bool', batch);\n    for (let b = 0; b < batch; b++) {\n        const offset = b * size;\n        const vals = predictionsVals.subarray(offset, offset + size);\n        const valAndInd = [];\n        for (let i = 0; i < vals.length; i++) {\n            valAndInd.push({ value: vals[i], index: i });\n        }\n        valAndInd.sort((a, b) => b.value - a.value);\n        precision[b] = 0;\n        for (let i = 0; i < k; i++) {\n            if (valAndInd[i].index === targetsVals[b]) {\n                precision[b] = 1;\n                break;\n            }\n        }\n    }\n    if (predictions !== $predictions) {\n        $predictions.dispose();\n    }\n    if (targets !== $targets) {\n        $targets.dispose();\n    }\n    // Output precision has the same shape as targets.\n    return tensor(precision, $targets.shape, 'bool');\n}\nexport const inTopKAsync = inTopKAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5fdG9wX2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbl90b3Bfay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsT0FBTyxFQUFDLE1BQU0sRUFBRSxpQkFBaUIsRUFBRSxzQkFBc0IsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUMxRSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsS0FBSyxVQUFVLFlBQVksQ0FDdkIsV0FBeUIsRUFBRSxPQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ3pELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sQ0FDRixZQUFZLENBQUMsSUFBSSxHQUFHLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQUMsOERBQThEO1FBQ2hFLFdBQVcsWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDeEMsTUFBTSxDQUNGLFlBQVksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQyxJQUFJLEVBQ3ZDLEdBQUcsRUFBRSxDQUFDLDJDQUEyQztRQUM3Qyx5Q0FBeUM7UUFDekMsR0FBRyxZQUFZLENBQUMsSUFBSSxxQkFBcUIsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDbEUsaUJBQWlCLENBQ2IsWUFBWSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxFQUMxRCxRQUFRLENBQUMsS0FBSyxFQUNkLCtEQUErRDtRQUMzRCw0QkFBNEIsQ0FBQyxDQUFDO0lBQ3RDLE1BQU0sT0FBTyxHQUFHLFlBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEUsTUFBTSxDQUNGLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLE9BQU8sRUFDckIsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLGNBQWMsT0FBTyxjQUFjLENBQUMsRUFBRSxDQUFDLENBQUM7SUFFaEQsTUFBTSxlQUFlLEdBQUcsTUFBTSxZQUFZLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDbEQsTUFBTSxXQUFXLEdBQUcsTUFBTSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFFMUMsNERBQTREO0lBQzVELGtDQUFrQztJQUNsQyxNQUFNLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLE1BQU0sR0FBRyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxTQUFTLEdBQUcsc0JBQXNCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXhELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxNQUFNLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQTBDLEVBQUUsQ0FBQztRQUM1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztTQUM1QztRQUNELFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU1QyxTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDekMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDakIsTUFBTTthQUNQO1NBQ0Y7S0FDRjtJQUVELElBQUksV0FBVyxLQUFLLFlBQVksRUFBRTtRQUNoQyxZQUFZLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDeEI7SUFDRCxJQUFJLE9BQU8sS0FBSyxRQUFRLEVBQUU7UUFDeEIsUUFBUSxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ3BCO0lBRUQsa0RBQWtEO0lBQ2xELE9BQU8sTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBTSxDQUFDO0FBQ3hELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydCwgYXNzZXJ0U2hhcGVzTWF0Y2gsIGdldFR5cGVkQXJyYXlGcm9tRFR5cGV9IGZyb20gJy4uL3V0aWwnO1xuaW1wb3J0IHt0ZW5zb3J9IGZyb20gJy4vdGVuc29yJztcblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgdGhlIHRhcmdldHMgYXJlIGluIHRoZSB0b3AgSyBwcmVkaWN0aW9ucy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcHJlZGljdGlvbnMgPSB0Zi50ZW5zb3IyZChbWzIwLCAxMCwgNDAsIDMwXSwgWzMwLCA1MCwgLTIwLCAxMF1dKTtcbiAqIGNvbnN0IHRhcmdldHMgPSB0Zi50ZW5zb3IxZChbMiwgMF0pO1xuICogY29uc3QgcHJlY2lzaW9uID0gYXdhaXQgdGYuaW5Ub3BLQXN5bmMocHJlZGljdGlvbnMsIHRhcmdldHMpO1xuICogcHJlY2lzaW9uLnByaW50KCk7XG4gKiBgYGBcbiAqIEBwYXJhbSBwcmVkaWN0aW9ucyAyLUQgb3IgaGlnaGVyIGB0Zi5UZW5zb3JgIHdpdGggbGFzdCBkaW1lbnNpb24gYmVpbmdcbiAqICAgICBhdCBsZWFzdCBga2AuXG4gKiBAcGFyYW0gdGFyZ2V0cyAxLUQgb3IgaGlnaGVyIGB0Zi5UZW5zb3JgLlxuICogQHBhcmFtIGsgT3B0aW9uYWwgTnVtYmVyIG9mIHRvcCBlbGVtZW50cyB0byBsb29rIGF0IGZvciBjb21wdXRpbmcgcHJlY2lzaW9uLFxuICogICAgIGRlZmF1bHQgdG8gMS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdFdmFsdWF0aW9uJ31cbiAqL1xuYXN5bmMgZnVuY3Rpb24gaW5Ub3BLQXN5bmNfPFQgZXh0ZW5kcyBUZW5zb3IsIFUgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHByZWRpY3Rpb25zOiBUfFRlbnNvckxpa2UsIHRhcmdldHM6IFV8VGVuc29yTGlrZSwgayA9IDEpOiBQcm9taXNlPFU+IHtcbiAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaW5Ub3BLJyk7XG4gIGNvbnN0ICR0YXJnZXRzID0gY29udmVydFRvVGVuc29yKHRhcmdldHMsICd0YXJnZXRzJywgJ2luVG9wSycpO1xuXG4gIGFzc2VydChcbiAgICAgICRwcmVkaWN0aW9ucy5yYW5rID4gMSxcbiAgICAgICgpID0+ICdpblRvcEsoKSBleHBlY3RzIHRoZSBwcmVkaWN0aW9ucyB0byBiZSBvZiByYW5rIDIgb3IgaGlnaGVyLCAnICtcbiAgICAgICAgICBgYnV0IGdvdCAkeyRwcmVkaWN0aW9ucy5yYW5rfWApO1xuICBhc3NlcnQoXG4gICAgICAkcHJlZGljdGlvbnMucmFuayAtIDEgPT09ICR0YXJnZXRzLnJhbmssXG4gICAgICAoKSA9PiBgcHJlZGljdGlvbnMgcmFuayBzaG91bGQgYmUgMSBsYXJnZXIgdGhhbiBgICtcbiAgICAgICAgICBgdGFyZ2V0cyByYW5rLCBidXQgZ290IHByZWRpY3Rpb25zIHJhbmsgYCArXG4gICAgICAgICAgYCR7JHByZWRpY3Rpb25zLnJhbmt9IGFuZCB0YXJnZXRzIHJhbmsgJHskdGFyZ2V0cy5yYW5rfWApO1xuICBhc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICRwcmVkaWN0aW9ucy5zaGFwZS5zbGljZSgwLCAkcHJlZGljdGlvbnMuc2hhcGUubGVuZ3RoIC0gMSksXG4gICAgICAkdGFyZ2V0cy5zaGFwZSxcbiAgICAgIGBwcmVkaWN0aW9ucydzIHNoYXBlIHNob3VsZCBiZSBhbGlnbiB3aXRoIHRoZSB0YXJnZXRzJyBzaGFwZSwgYCArXG4gICAgICAgICAgJ2V4Y2VwdCB0aGUgbGFzdCBkaW1lbnNpb24uJyk7XG4gIGNvbnN0IGxhc3REaW0gPSAkcHJlZGljdGlvbnMuc2hhcGVbJHByZWRpY3Rpb25zLnNoYXBlLmxlbmd0aCAtIDFdO1xuICBhc3NlcnQoXG4gICAgICBrID4gMCAmJiBrIDw9IGxhc3REaW0sXG4gICAgICAoKSA9PiBgJ2snIHBhc3NlZCB0byBpblRvcEsoKSBtdXN0IGJlID4gMCAmJiA8PSB0aGUgcHJlZGljdGlvbnMgbGFzdCBgICtcbiAgICAgICAgICBgZGltZW5zaW9uICgke2xhc3REaW19KSwgYnV0IGdvdCAke2t9YCk7XG5cbiAgY29uc3QgcHJlZGljdGlvbnNWYWxzID0gYXdhaXQgJHByZWRpY3Rpb25zLmRhdGEoKTtcbiAgY29uc3QgdGFyZ2V0c1ZhbHMgPSBhd2FpdCAkdGFyZ2V0cy5kYXRhKCk7XG5cbiAgLy8gUmVzaGFwZSBwcmVkaWN0aW9uc1ZhbHMgaW50byBhIDJkIHRlbnNvciBbYmF0Y2gsIGxhc3REaW1dXG4gIC8vIGFuZCBsb29rIHVwIHRvcEsgYWxvbmcgbGFzdERpbS5cbiAgY29uc3QgW2JhdGNoLCBzaXplXSA9IFtwcmVkaWN0aW9uc1ZhbHMubGVuZ3RoIC8gbGFzdERpbSwgbGFzdERpbV07XG4gIGNvbnN0IHByZWNpc2lvbiA9IGdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Jvb2wnLCBiYXRjaCk7XG5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gYiAqIHNpemU7XG4gICAgY29uc3QgdmFscyA9IHByZWRpY3Rpb25zVmFscy5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuICAgIGNvbnN0IHZhbEFuZEluZDogQXJyYXk8e3ZhbHVlOiBudW1iZXIsIGluZGV4OiBudW1iZXJ9PiA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFsQW5kSW5kLnB1c2goe3ZhbHVlOiB2YWxzW2ldLCBpbmRleDogaX0pO1xuICAgIH1cbiAgICB2YWxBbmRJbmQuc29ydCgoYSwgYikgPT4gYi52YWx1ZSAtIGEudmFsdWUpO1xuXG4gICAgcHJlY2lzaW9uW2JdID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGs7IGkrKykge1xuICAgICAgaWYgKHZhbEFuZEluZFtpXS5pbmRleCA9PT0gdGFyZ2V0c1ZhbHNbYl0pIHtcbiAgICAgICAgcHJlY2lzaW9uW2JdID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKHByZWRpY3Rpb25zICE9PSAkcHJlZGljdGlvbnMpIHtcbiAgICAkcHJlZGljdGlvbnMuZGlzcG9zZSgpO1xuICB9XG4gIGlmICh0YXJnZXRzICE9PSAkdGFyZ2V0cykge1xuICAgICR0YXJnZXRzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8vIE91dHB1dCBwcmVjaXNpb24gaGFzIHRoZSBzYW1lIHNoYXBlIGFzIHRhcmdldHMuXG4gIHJldHVybiB0ZW5zb3IocHJlY2lzaW9uLCAkdGFyZ2V0cy5zaGFwZSwgJ2Jvb2wnKSBhcyBVO1xufVxuXG5leHBvcnQgY29uc3QgaW5Ub3BLQXN5bmMgPSBpblRvcEtBc3luY187XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv2DBackpropFilter } from '../kernel_names';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the derivative of the filter of a 2D convolution.\n *\n * @param x The input tensor, of rank 4 or rank 3 of shape\n *     [batch, height, width, inChannels]. If rank 3, batch of 1 is assumed.\n * @param dy The dy image, of rank 4 or rank 3, of shape\n *     [batch, height, width, outDepth]. If rank 3, batch of 1 is assumed.\n * @param filterShape The shape of the filter, length 4,\n *     [filterHeight, filterWidth, inDepth, outDepth].\n * @param strides The strides of the convolution: [strideHeight,\n * strideWidth].\n * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n *     used in the forward prop of the op.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n *     \"NHWC\". Specify the data format of the input and output data. With the\n *     default format \"NHWC\", the data is stored in the order of: [batch,\n *     height, width, channels].\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n */\nfunction conv2DBackpropFilter_(x, dy, filterShape, strides, pad, dataFormat = 'NHWC', dimRoundingMode) {\n    let x4D = x;\n    if (x.rank === 3) {\n        x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n    }\n    let dy4D = dy;\n    if (dy4D.rank === 3) {\n        dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n    }\n    util.assert(x4D.rank === 4, () => `Error in conv2dDerFilter: input must be rank 4, but got shape ` +\n        `${x4D.shape}.`);\n    util.assert(dy4D.rank === 4, () => `Error in conv2dDerFilter: dy must be rank 4, but got shape ` +\n        `${dy4D.shape}.`);\n    util.assert(filterShape.length === 4, () => `Error in conv2dDerFilter: filterShape must be length 4, but got ` +\n        `${filterShape}.`);\n    const inDepth = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n    const outDepth = dataFormat === 'NHWC' ? dy4D.shape[3] : dy4D.shape[1];\n    util.assert(inDepth === filterShape[2], () => `Error in conv2dDerFilter: depth of input ${inDepth}) must ` +\n        `match input depth in filter (${filterShape[2]}.`);\n    util.assert(outDepth === filterShape[3], () => `Error in conv2dDerFilter: depth of dy (${outDepth}) must ` +\n        `match output depth for filter (${filterShape[3]}).`);\n    conv_util.checkPadOnDimRoundingMode('conv2dDerFilter', pad, dimRoundingMode);\n    const inputs = { x: x4D, dy: dy4D };\n    const attrs = { strides, pad, dataFormat, dimRoundingMode, filterShape };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    return ENGINE.runKernel(Conv2DBackpropFilter, inputs, attrs);\n}\nexport const conv2DBackpropFilter = op({ conv2DBackpropFilter_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkX2JhY2twcm9wX2ZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbnYyZF9iYWNrcHJvcF9maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsb0JBQW9CLEVBQXdELE1BQU0saUJBQWlCLENBQUM7QUFJNUcsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxLQUFLLFNBQVMsTUFBTSxhQUFhLENBQUM7QUFDekMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxxQkFBcUIsQ0FDMUIsQ0FBSSxFQUFFLEVBQUssRUFBRSxXQUE2QyxFQUMxRCxPQUFnQyxFQUNoQyxHQUFvRCxFQUNwRCxhQUE0QixNQUFNLEVBQ2xDLGVBQXdDO0lBQzFDLElBQUksR0FBRyxHQUFHLENBQWEsQ0FBQztJQUN4QixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLEdBQUcsR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMzRDtJQUNELElBQUksSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ25CLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoRTtJQUNELElBQUksQ0FBQyxNQUFNLENBQ1AsR0FBRyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLEdBQUcsR0FBRyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZixHQUFHLEVBQUUsQ0FBQyw2REFBNkQ7UUFDL0QsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUMxQixJQUFJLENBQUMsTUFBTSxDQUNQLFdBQVcsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUN4QixHQUFHLEVBQUUsQ0FBQyxrRUFBa0U7UUFDcEUsR0FBRyxXQUFXLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sT0FBTyxHQUFHLFVBQVUsS0FBSyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2RSxJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQzFCLEdBQUcsRUFBRSxDQUFDLDRDQUE0QyxPQUFPLFNBQVM7UUFDOUQsZ0NBQWdDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLEtBQUssV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUMzQixHQUFHLEVBQUUsQ0FBQywwQ0FBMEMsUUFBUSxTQUFTO1FBQzdELGtDQUFrQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzlELFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxpQkFBaUIsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0UsTUFBTSxNQUFNLEdBQStCLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQ1AsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFDLENBQUM7SUFFN0QsMERBQTBEO0lBQzFELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDWixvQkFBb0IsRUFBRSxNQUE4QixFQUNwRCxLQUEyQixDQUFhLENBQUM7QUFDdEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHLEVBQUUsQ0FBQyxFQUFDLHFCQUFxQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtDb252MkRCYWNrcHJvcEZpbHRlciwgQ29udjJEQmFja3Byb3BGaWx0ZXJBdHRycywgQ29udjJEQmFja3Byb3BGaWx0ZXJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCAqIGFzIGNvbnZfdXRpbCBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGRlcml2YXRpdmUgb2YgdGhlIGZpbHRlciBvZiBhIDJEIGNvbnZvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBpbnB1dCB0ZW5zb3IsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgICBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXMgYXNzdW1lZC5cbiAqIEBwYXJhbSBkeSBUaGUgZHkgaW1hZ2UsIG9mIHJhbmsgNCBvciByYW5rIDMsIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBvdXREZXB0aF0uIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpcyBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlclNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgZmlsdGVyLCBsZW5ndGggNCxcbiAqICAgICBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uOiBbc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdLlxuICogQHBhcmFtIHBhZCBBIHN0cmluZyBmcm9tOiAnc2FtZScsICd2YWxpZCcuIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtXG4gKiAgICAgdXNlZCBpbiB0aGUgZm9yd2FyZCBwcm9wIG9mIHRoZSBvcC5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBjb252MkRCYWNrcHJvcEZpbHRlcl88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICB4OiBULCBkeTogVCwgZmlsdGVyU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfGNvbnZfdXRpbC5FeHBsaWNpdFBhZGRpbmcsXG4gICAgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyA9ICdOSFdDJyxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVGVuc29yNEQge1xuICBsZXQgeDREID0geCBhcyBUZW5zb3I0RDtcbiAgaWYgKHgucmFuayA9PT0gMykge1xuICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgfVxuICBsZXQgZHk0RCA9IGR5IGFzIFRlbnNvcjREO1xuICBpZiAoZHk0RC5yYW5rID09PSAzKSB7XG4gICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NEQucmFuayA9PT0gNCxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGlucHV0IG11c3QgYmUgcmFuayA0LCBidXQgZ290IHNoYXBlIGAgK1xuICAgICAgICAgIGAke3g0RC5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogZHkgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgICAgYCR7ZHk0RC5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZmlsdGVyU2hhcGUubGVuZ3RoID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZERlckZpbHRlcjogZmlsdGVyU2hhcGUgbXVzdCBiZSBsZW5ndGggNCwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgJHtmaWx0ZXJTaGFwZX0uYCk7XG4gIGNvbnN0IGluRGVwdGggPSBkYXRhRm9ybWF0ID09PSAnTkhXQycgPyB4NEQuc2hhcGVbM10gOiB4NEQuc2hhcGVbMV07XG4gIGNvbnN0IG91dERlcHRoID0gZGF0YUZvcm1hdCA9PT0gJ05IV0MnID8gZHk0RC5zaGFwZVszXSA6IGR5NEQuc2hhcGVbMV07XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5EZXB0aCA9PT0gZmlsdGVyU2hhcGVbMl0sXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY29udjJkRGVyRmlsdGVyOiBkZXB0aCBvZiBpbnB1dCAke2luRGVwdGh9KSBtdXN0IGAgK1xuICAgICAgICAgIGBtYXRjaCBpbnB1dCBkZXB0aCBpbiBmaWx0ZXIgKCR7ZmlsdGVyU2hhcGVbMl19LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIG91dERlcHRoID09PSBmaWx0ZXJTaGFwZVszXSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252MmREZXJGaWx0ZXI6IGRlcHRoIG9mIGR5ICgke291dERlcHRofSkgbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggb3V0cHV0IGRlcHRoIGZvciBmaWx0ZXIgKCR7ZmlsdGVyU2hhcGVbM119KS5gKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ2NvbnYyZERlckZpbHRlcicsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgaW5wdXRzOiBDb252MkRCYWNrcHJvcEZpbHRlcklucHV0cyA9IHt4OiB4NEQsIGR5OiBkeTREfTtcbiAgY29uc3QgYXR0cnM6IENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMgPVxuICAgICAge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICBDb252MkRCYWNrcHJvcEZpbHRlciwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yNEQ7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcEZpbHRlciA9IG9wKHtjb252MkRCYWNrcHJvcEZpbHRlcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as broadcast_util from './broadcast_util';\nimport { elu } from './elu';\nimport { leakyRelu } from './leaky_relu';\nimport { mul } from './mul';\nimport { prelu } from './prelu';\nimport { relu } from './relu';\nimport { relu6 } from './relu6';\nimport { reshape } from './reshape';\nimport { sigmoid } from './sigmoid';\nimport { step } from './step';\nimport { sum } from './sum';\n// Returns gradient for fused activation.\nexport function getFusedDyActivation(dy, y, activation) {\n    if (activation == null || activation === 'linear') {\n        return dy;\n    }\n    if (activation === 'relu') {\n        return mul(dy, step(y));\n    }\n    throw new Error(`Cannot compute gradient for fused activation ${activation}.`);\n}\n// Returns gradient for fused bias.\nexport function getFusedBiasGradient(bias, dyActivation) {\n    let res = dyActivation;\n    const reduceAxes = broadcast_util.getReductionAxes(bias.shape, dyActivation.shape);\n    if (reduceAxes.length > 0) {\n        res = sum(res, reduceAxes);\n    }\n    return reshape(res, bias.shape);\n}\nexport function applyActivation(x, activation, preluActivationWeights, leakyreluAlpha) {\n    if (activation === 'linear') {\n        return x;\n    }\n    else if (activation === 'relu') {\n        return relu(x);\n    }\n    else if (activation === 'elu') {\n        return elu(x);\n    }\n    else if (activation === 'relu6') {\n        return relu6(x);\n    }\n    else if (activation === 'prelu') {\n        return prelu(x, preluActivationWeights);\n    }\n    else if (activation === 'leakyrelu') {\n        return leakyRelu(x, leakyreluAlpha);\n    }\n    else if (activation === 'sigmoid') {\n        return sigmoid(x);\n    }\n    throw new Error(`Unknown fused activation ${activation}.`);\n}\n// Whether we should call fused ops.\nexport const shouldFuse = (gradientDepth, activation) => {\n    const gradientMode = gradientDepth > 0;\n    return !gradientMode || activation === 'linear';\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzZWRfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsT0FBTyxLQUFLLGNBQWMsTUFBTSxrQkFBa0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLHlDQUF5QztBQUN6QyxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLEVBQVUsRUFBRSxDQUFTLEVBQUUsVUFBc0I7SUFDL0MsSUFBSSxVQUFVLElBQUksSUFBSSxJQUFJLFVBQVUsS0FBSyxRQUFRLEVBQUU7UUFDakQsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUNELElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtRQUN6QixPQUFPLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekI7SUFDRCxNQUFNLElBQUksS0FBSyxDQUNYLGdEQUFnRCxVQUFVLEdBQUcsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxtQ0FBbUM7QUFDbkMsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxJQUFZLEVBQUUsWUFBb0I7SUFDcEMsSUFBSSxHQUFHLEdBQUcsWUFBWSxDQUFDO0lBQ3ZCLE1BQU0sVUFBVSxHQUNaLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQ3pCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsQ0FBUyxFQUFFLFVBQXNCLEVBQUUsc0JBQStCLEVBQ2xFLGNBQXVCO0lBQ3pCLElBQUksVUFBVSxLQUFLLFFBQVEsRUFBRTtRQUMzQixPQUFPLENBQUMsQ0FBQztLQUNWO1NBQU0sSUFBSSxVQUFVLEtBQUssTUFBTSxFQUFFO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hCO1NBQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1FBQy9CLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2Y7U0FBTSxJQUFJLFVBQVUsS0FBSyxPQUFPLEVBQUU7UUFDakMsT0FBTyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakI7U0FBTSxJQUFJLFVBQVUsS0FBSyxPQUFPLEVBQUU7UUFDakMsT0FBTyxLQUFLLENBQUMsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7S0FDekM7U0FBTSxJQUFJLFVBQVUsS0FBSyxXQUFXLEVBQUU7UUFDckMsT0FBTyxTQUFTLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0tBQ3JDO1NBQU0sSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1FBQ25DLE9BQU8sT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25CO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyw0QkFBNEIsVUFBVSxHQUFHLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsb0NBQW9DO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxDQUFDLGFBQXFCLEVBQUUsVUFBc0IsRUFBRSxFQUFFO0lBQzFFLE1BQU0sWUFBWSxHQUFHLGFBQWEsR0FBRyxDQUFDLENBQUM7SUFDdkMsT0FBTyxDQUFDLFlBQVksSUFBSSxVQUFVLEtBQUssUUFBUSxDQUFDO0FBQ2xELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmltcG9ydCAqIGFzIGJyb2FkY2FzdF91dGlsIGZyb20gJy4vYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtlbHV9IGZyb20gJy4vZWx1JztcbmltcG9ydCB7QWN0aXZhdGlvbn0gZnJvbSAnLi9mdXNlZF90eXBlcyc7XG5pbXBvcnQge2xlYWt5UmVsdX0gZnJvbSAnLi9sZWFreV9yZWx1JztcbmltcG9ydCB7bXVsfSBmcm9tICcuL211bCc7XG5pbXBvcnQge3ByZWx1fSBmcm9tICcuL3ByZWx1JztcbmltcG9ydCB7cmVsdX0gZnJvbSAnLi9yZWx1JztcbmltcG9ydCB7cmVsdTZ9IGZyb20gJy4vcmVsdTYnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuaW1wb3J0IHtzaWdtb2lkfSBmcm9tICcuL3NpZ21vaWQnO1xuaW1wb3J0IHtzdGVwfSBmcm9tICcuL3N0ZXAnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vc3VtJztcblxuLy8gUmV0dXJucyBncmFkaWVudCBmb3IgZnVzZWQgYWN0aXZhdGlvbi5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdXNlZER5QWN0aXZhdGlvbihcbiAgICBkeTogVGVuc29yLCB5OiBUZW5zb3IsIGFjdGl2YXRpb246IEFjdGl2YXRpb24pOiBUZW5zb3Ige1xuICBpZiAoYWN0aXZhdGlvbiA9PSBudWxsIHx8IGFjdGl2YXRpb24gPT09ICdsaW5lYXInKSB7XG4gICAgcmV0dXJuIGR5O1xuICB9XG4gIGlmIChhY3RpdmF0aW9uID09PSAncmVsdScpIHtcbiAgICByZXR1cm4gbXVsKGR5LCBzdGVwKHkpKTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgQ2Fubm90IGNvbXB1dGUgZ3JhZGllbnQgZm9yIGZ1c2VkIGFjdGl2YXRpb24gJHthY3RpdmF0aW9ufS5gKTtcbn1cblxuLy8gUmV0dXJucyBncmFkaWVudCBmb3IgZnVzZWQgYmlhcy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdXNlZEJpYXNHcmFkaWVudChcbiAgICBiaWFzOiBUZW5zb3IsIGR5QWN0aXZhdGlvbjogVGVuc29yKTogVGVuc29yIHtcbiAgbGV0IHJlcyA9IGR5QWN0aXZhdGlvbjtcbiAgY29uc3QgcmVkdWNlQXhlcyA9XG4gICAgICBicm9hZGNhc3RfdXRpbC5nZXRSZWR1Y3Rpb25BeGVzKGJpYXMuc2hhcGUsIGR5QWN0aXZhdGlvbi5zaGFwZSk7XG4gIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICByZXMgPSBzdW0ocmVzLCByZWR1Y2VBeGVzKTtcbiAgfVxuICByZXR1cm4gcmVzaGFwZShyZXMsIGJpYXMuc2hhcGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXBwbHlBY3RpdmF0aW9uKFxuICAgIHg6IFRlbnNvciwgYWN0aXZhdGlvbjogQWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvcixcbiAgICBsZWFreXJlbHVBbHBoYT86IG51bWJlcik6IFRlbnNvciB7XG4gIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgIHJldHVybiB4O1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1Jykge1xuICAgIHJldHVybiByZWx1KHgpO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdlbHUnKSB7XG4gICAgcmV0dXJuIGVsdSh4KTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdTYnKSB7XG4gICAgcmV0dXJuIHJlbHU2KHgpO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdwcmVsdScpIHtcbiAgICByZXR1cm4gcHJlbHUoeCwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdScpIHtcbiAgICByZXR1cm4gbGVha3lSZWx1KHgsIGxlYWt5cmVsdUFscGhhKTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICByZXR1cm4gc2lnbW9pZCh4KTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gZnVzZWQgYWN0aXZhdGlvbiAke2FjdGl2YXRpb259LmApO1xufVxuXG4vLyBXaGV0aGVyIHdlIHNob3VsZCBjYWxsIGZ1c2VkIG9wcy5cbmV4cG9ydCBjb25zdCBzaG91bGRGdXNlID0gKGdyYWRpZW50RGVwdGg6IG51bWJlciwgYWN0aXZhdGlvbjogQWN0aXZhdGlvbikgPT4ge1xuICBjb25zdCBncmFkaWVudE1vZGUgPSBncmFkaWVudERlcHRoID4gMDtcbiAgcmV0dXJuICFncmFkaWVudE1vZGUgfHwgYWN0aXZhdGlvbiA9PT0gJ2xpbmVhcic7XG59O1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { customGrad } from '../../gradients';\nimport { FusedConv2D } from '../../kernel_names';\nimport { makeTypesMatch } from '../../tensor_util';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { add } from '../add';\nimport * as broadcast_util from '../broadcast_util';\nimport { conv2d as unfusedConv2d } from '../conv2d';\nimport { conv2DBackpropFilter } from '../conv2d_backprop_filter';\nimport { conv2DBackpropInput } from '../conv2d_backprop_input';\nimport * as conv_util from '../conv_util';\nimport { applyActivation, getFusedBiasGradient, getFusedDyActivation, shouldFuse } from '../fused_util';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * Computes a 2D convolution over the input x, optionally fused with adding a\n * bias and applying an activation.\n *\n * ```js\n * const inputDepth = 2;\n * const inShape = [2, 2, 2, inputDepth];\n * const outputDepth = 2;\n * const fSize = 1;\n * const pad = 0;\n * const strides = 1;\n *\n * const x = tf.tensor4d( [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,\n * 16], inShape);\n * const w = tf.tensor4d([-1, 1, -2, 0.5], [fSize, fSize, inputDepth,\n * outputDepth]);\n *\n * tf.fused.conv2d({ x, filter: w, strides, pad, dataFormat: 'NHWC',\n * dilations: [1, 1], bias: tf.scalar(5), activation: 'relu' }).print();\n * ```\n *\n * @param obj An object with the following properties:\n * @param x The input tensor, of rank 4 or rank 3, of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter, rank 4, of shape\n *     `[filterHeight, filterWidth, inDepth, outDepth]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`.\n * @param pad The type of padding algorithm.\n *   - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *   - `valid` output will be smaller than input if filter is larger\n *       than 1x1.\n *   - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dataFormat An optional string from: \"NHWC\", \"NCHW\". Defaults to\n *     \"NHWC\". Specify the data format of the input and output data. With the\n *     default format \"NHWC\", the data is stored in the order of: [batch,\n *     height, width, channels]. Only \"NHWC\" is currently supported.\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n *     in which we sample input values across the height and width dimensions\n *     in atrous convolution. Defaults to `[1, 1]`. If `dilations` is a single\n *     number, then `dilationHeight == dilationWidth`. If it is greater than\n *     1, then all values of `strides` must be 1.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n * @param bias Tensor to be added to the result.\n * @param activation Name of activation kernel (defaults to `linear`) to be\n *     applied\n *      after biasAdd.\n * @param preluActivationWeights Tensor of prelu weights to be applied as part\n *     of a `prelu` activation, typically the same shape as `x`.\n * @param leakyreluAlpha Optional. Alpha to be applied as part of a `leakyrelu`\n *     activation.\n */\nfunction fusedConv2d_({ x, filter, strides, pad, dataFormat = 'NHWC', dilations = [1, 1], dimRoundingMode, bias, activation = 'linear', preluActivationWeights, leakyreluAlpha }) {\n    activation = activation || 'linear';\n    if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n        // TODO: Transpose bias and preluActivationWeights properly for NCHW\n        // format before computation.\n        util.assert(dataFormat === 'NHWC', () => `Error in fused conv2d: got dataFormat of ${dataFormat} but ` +\n            `only NHWC is currently supported for the case of gradient depth ` +\n            `is 0 and the activation is not linear.`);\n        let result = unfusedConv2d(x, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n        if (bias != null) {\n            result = add(result, bias);\n        }\n        return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n    }\n    const $x = convertToTensor(x, 'x', 'conv2d', 'float32');\n    const $filter = convertToTensor(filter, 'filter', 'conv2d', 'float32');\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    util.assert(x4D.rank === 4, () => `Error in fused conv2d: input must be rank 4, but got rank ` +\n        `${x4D.rank}.`);\n    util.assert($filter.rank === 4, () => `Error in fused conv2d: filter must be rank 4, but got rank ` +\n        `${$filter.rank}.`);\n    conv_util.checkPadOnDimRoundingMode('fused conv2d', pad, dimRoundingMode);\n    const inputChannels = dataFormat === 'NHWC' ? x4D.shape[3] : x4D.shape[1];\n    util.assert($filter.shape[2] === inputChannels, () => `Error in conv2d: depth of input (${inputChannels}) must match ` +\n        `input depth for filter ${$filter.shape[2]}.`);\n    util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in conv2D: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    const convInfo = conv_util.computeConv2DInfo(x4D.shape, $filter.shape, strides, dilations, pad, dimRoundingMode);\n    let $bias;\n    if (bias != null) {\n        $bias = convertToTensor(bias, 'bias', 'fused conv2d');\n        [$bias] = makeTypesMatch($bias, $x);\n        // According to TensorFlow, the bias is supposed be a 1-D tensor or a\n        // scalar.\n        //\n        // 3-D or 4-D bias is not disabled for NHWC format, because they are\n        // currently being used in some cases. For examplem in our code base,\n        // https://github.com/tensorflow/tfjs/blob/b53bd47e880367ae57493f0ea628abaf08db2d5d/tfjs-core/src/ops/fused/fused_conv2d_test.ts#L1972.\n        if (dataFormat === 'NHWC') {\n            broadcast_util.assertAndGetBroadcastShape(convInfo.outShape, $bias.shape);\n        }\n        else {\n            util.assert($bias.shape.length <= 1, () => `Error in fused conv2d: only supports scalar or 1-D Tensor ` +\n                `bias for NCHW format but got the bias of ` +\n                `rank-${$bias.shape.length}.`);\n            util.assert($bias.shape.length === 0 || $bias.shape[0] === convInfo.outChannels ||\n                $bias.shape[0] === 1, () => `Error in fused conv2d: bias shape (${$bias.shape}) is not ` +\n                `compatible with the number of output channels ` +\n                `(${convInfo.outChannels})`);\n        }\n    }\n    let $preluActivationWeights;\n    if (preluActivationWeights != null) {\n        // PReLU's activation weights could be a scalar, a 1-D tensor or a 3-D\n        // tensor.\n        const alphaShape = preluActivationWeights.shape;\n        util.assert(alphaShape.length <= 1 || alphaShape.length === 3, () => `Error in fused conv2d: only supports scalar, 1-D Tensor or ` +\n            `3-D Tensor PReLU activation weights but got a tensor of ` +\n            `rank-${alphaShape.length}.`);\n        if (alphaShape.length === 1) {\n            // Whether the data format is NCHW or NHWC, the 1-D PReLU activation\n            // weights tensor should be aligned with the output channels of conv2d\n            // result.\n            util.assert(alphaShape[0] === 1 || alphaShape[0] === convInfo.outChannels, () => `Error in fused conv2d: PReLU activation weights ` +\n                `(${alphaShape}) is not compatible with the number of output ` +\n                `channels (${convInfo.outChannels}).`);\n        }\n        else if (alphaShape.length === 3) {\n            // Whether the data format is NCHW or NHWC, the PReLU activation weights\n            // tensor should has the compatible shape with the result of conv2d.\n            try {\n                broadcast_util.assertAndGetBroadcastShape(alphaShape, convInfo.outShape);\n            }\n            catch (e) {\n                const errMsg = `Error in fused conv2d: PReLU activation weights (${alphaShape}) ` +\n                    `is not compatible with the output shape of the conv2d ` +\n                    `(${convInfo.outShape}).`;\n                throw Error(errMsg);\n            }\n        }\n        $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused conv2d');\n    }\n    const grad = (dy, saved) => {\n        util.assert(dataFormat === 'NHWC', () => `Error in gradient of fused conv2D: got dataFormat of ${dataFormat} but only NHWC is currently supported.`);\n        const [$filter, x4D, y, $bias] = saved;\n        const dyActivation = getFusedDyActivation(dy, y, activation);\n        util.assert(conv_util.tupleValuesAreOne(dilations), () => 'Error in gradient of fused conv2D: ' +\n            `dilation rates greater than 1 ` +\n            `are not yet supported in gradients. Got dilations '${dilations}'`);\n        const xDer = conv2DBackpropInput(x4D.shape, dyActivation, $filter, strides, pad);\n        const filterDer = conv2DBackpropFilter(x4D, dyActivation, $filter.shape, strides, pad);\n        const der = [xDer, filterDer];\n        if ($bias != null) {\n            const biasDer = getFusedBiasGradient($bias, dyActivation);\n            der.push(biasDer);\n        }\n        return der;\n    };\n    const inputs = {\n        x: x4D,\n        filter: $filter,\n        bias: $bias,\n        preluActivationWeights: $preluActivationWeights\n    };\n    const attrs = {\n        strides,\n        pad,\n        dataFormat,\n        dilations,\n        dimRoundingMode,\n        activation,\n        leakyreluAlpha\n    };\n    // Depending on the the params passed in we will have different number of\n    // inputs and thus a a different number of elements in the gradient.\n    if (bias == null) {\n        const customOp = customGrad((x4D, filter, save) => {\n            let res = \n            // tslint:disable-next-line: no-unnecessary-type-assertion\n            ENGINE.runKernel(FusedConv2D, inputs, attrs);\n            save([filter, x4D, res]);\n            if (reshapedTo4D) {\n                // tslint:disable-next-line: no-unnecessary-type-assertion\n                res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n            }\n            return { value: res, gradFunc: grad };\n        });\n        return customOp(x4D, $filter);\n    }\n    else {\n        const customOpWithBias = customGrad((x4D, filter, bias, save) => {\n            let res = ENGINE.runKernel(FusedConv2D, inputs, attrs);\n            save([filter, x4D, res, bias]);\n            if (reshapedTo4D) {\n                // tslint:disable-next-line: no-unnecessary-type-assertion\n                res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n            }\n            return { value: res, gradFunc: grad };\n        });\n        return customOpWithBias(x4D, $filter, $bias);\n    }\n}\nexport const conv2d = op({ fusedConv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZnVzZWQvY29udjJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxXQUFXLEVBQXNDLE1BQU0sb0JBQW9CLENBQUM7QUFJcEYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sS0FBSyxjQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFDcEQsT0FBTyxFQUFDLE1BQU0sSUFBSSxhQUFhLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDN0QsT0FBTyxLQUFLLFNBQVMsTUFBTSxjQUFjLENBQUM7QUFFMUMsT0FBTyxFQUFDLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEcsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXdERztBQUNILFNB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LENBQUM7S0FDcEM7U0FBTTtRQUNMLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUMvQixDQUFDLEdBQWEsRUFBRSxNQUFnQixFQUFFLElBQVksRUFBRSxJQUFrQixFQUFFLEVBQUU7WUFDcEUsSUFBSSxHQUFHLEdBQXNCLE1BQU0sQ0FBQyxTQUFTLENBQ3pDLFdBQVcsRUFBRSxNQUE4QixFQUMzQyxLQUEyQixDQUFDLENBQUM7WUFFakMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUUvQixJQUFJLFlBQVksRUFBRTtnQkFDaEIsMERBQTBEO2dCQUMxRCxHQUFHLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ2pELENBQUM7YUFDZDtZQUVELE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUVQLE9BQU8sZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQU0sQ0FBQztLQUNuRDtBQUNILENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge2N1c3RvbUdyYWR9IGZyb20gJy4uLy4uL2dyYWRpZW50cyc7XG5pbXBvcnQge0Z1c2VkQ29udjJELCBGdXNlZENvbnYyREF0dHJzLCBGdXNlZENvbnYyRElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7R3JhZFNhdmVGdW5jLCBOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge2NvbnYyZCBhcyB1bmZ1c2VkQ29udjJkfSBmcm9tICcuLi9jb252MmQnO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcEZpbHRlcn0gZnJvbSAnLi4vY29udjJkX2JhY2twcm9wX2ZpbHRlcic7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wSW5wdXR9IGZyb20gJy4uL2NvbnYyZF9iYWNrcHJvcF9pbnB1dCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi4vY29udl91dGlsJztcbmltcG9ydCB7QWN0aXZhdGlvbn0gZnJvbSAnLi4vZnVzZWRfdHlwZXMnO1xuaW1wb3J0IHthcHBseUFjdGl2YXRpb24sIGdldEZ1c2VkQmlhc0dyYWRpZW50LCBnZXRGdXNlZER5QWN0aXZhdGlvbiwgc2hvdWxkRnVzZX0gZnJvbSAnLi4vZnVzZWRfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyBhIDJEIGNvbnZvbHV0aW9uIG92ZXIgdGhlIGlucHV0IHgsIG9wdGlvbmFsbHkgZnVzZWQgd2l0aCBhZGRpbmcgYVxuICogYmlhcyBhbmQgYXBwbHlpbmcgYW4gYWN0aXZhdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXREZXB0aCA9IDI7XG4gKiBjb25zdCBpblNoYXBlID0gWzIsIDIsIDIsIGlucHV0RGVwdGhdO1xuICogY29uc3Qgb3V0cHV0RGVwdGggPSAyO1xuICogY29uc3QgZlNpemUgPSAxO1xuICogY29uc3QgcGFkID0gMDtcbiAqIGNvbnN0IHN0cmlkZXMgPSAxO1xuICpcbiAqIGNvbnN0IHggPSB0Zi50ZW5zb3I0ZCggWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsXG4gKiAxNl0sIGluU2hhcGUpO1xuICogY29uc3QgdyA9IHRmLnRlbnNvcjRkKFstMSwgMSwgLTIsIDAuNV0sIFtmU2l6ZSwgZlNpemUsIGlucHV0RGVwdGgsXG4gKiBvdXRwdXREZXB0aF0pO1xuICpcbiAqIHRmLmZ1c2VkLmNvbnYyZCh7IHgsIGZpbHRlcjogdywgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0OiAnTkhXQycsXG4gKiBkaWxhdGlvbnM6IFsxLCAxXSwgYmlhczogdGYuc2NhbGFyKDUpLCBhY3RpdmF0aW9uOiAncmVsdScgfSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBvYmogQW4gb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRlbnNvciwgb2YgcmFuayA0IG9yIHJhbmsgMywgb2Ygc2hhcGVcbiAqICAgICBgW2JhdGNoLCBoZWlnaHQsIHdpZHRoLCBpbkNoYW5uZWxzXWAuIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXIgVGhlIGZpbHRlciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5EZXB0aCwgb3V0RGVwdGhdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobS5cbiAqICAgLSBgc2FtZWAgYW5kIHN0cmlkZSAxOiBvdXRwdXQgd2lsbCBiZSBvZiBzYW1lIHNpemUgYXMgaW5wdXQsXG4gKiAgICAgICByZWdhcmRsZXNzIG9mIGZpbHRlciBzaXplLlxuICogICAtIGB2YWxpZGAgb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRhdGFGb3JtYXQgQW4gb3B0aW9uYWwgc3RyaW5nIGZyb206IFwiTkhXQ1wiLCBcIk5DSFdcIi4gRGVmYXVsdHMgdG9cbiAqICAgICBcIk5IV0NcIi4gU3BlY2lmeSB0aGUgZGF0YSBmb3JtYXQgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YS4gV2l0aCB0aGVcbiAqICAgICBkZWZhdWx0IGZvcm1hdCBcIk5IV0NcIiwgdGhlIGRhdGEgaXMgc3RvcmVkIGluIHRoZSBvcmRlciBvZjogW2JhdGNoLFxuICogICAgIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS4gT25seSBcIk5IV0NcIiBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLlxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgZGlsYXRpb25zYCBpcyBhIHNpbmdsZVxuICogICAgIG51bWJlciwgdGhlbiBgZGlsYXRpb25IZWlnaHQgPT0gZGlsYXRpb25XaWR0aGAuIElmIGl0IGlzIGdyZWF0ZXIgdGhhblxuICogICAgIDEsIHRoZW4gYWxsIHZhbHVlcyBvZiBgc3RyaWRlc2AgbXVzdCBiZSAxLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICogQHBhcmFtIGJpYXMgVGVuc29yIHRvIGJlIGFkZGVkIHRvIHRoZSByZXN1bHQuXG4gKiBAcGFyYW0gYWN0aXZhdGlvbiBOYW1lIG9mIGFjdGl2YXRpb24ga2VybmVsIChkZWZhdWx0cyB0byBgbGluZWFyYCkgdG8gYmVcbiAqICAgICBhcHBsaWVkXG4gKiAgICAgIGFmdGVyIGJpYXNBZGQuXG4gKiBAcGFyYW0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyBUZW5zb3Igb2YgcHJlbHUgd2VpZ2h0cyB0byBiZSBhcHBsaWVkIGFzIHBhcnRcbiAqICAgICBvZiBhIGBwcmVsdWAgYWN0aXZhdGlvbiwgdHlwaWNhbGx5IHRoZSBzYW1lIHNoYXBlIGFzIGB4YC5cbiAqIEBwYXJhbSBsZWFreXJlbHVBbHBoYSBPcHRpb25hbC4gQWxwaGEgdG8gYmUgYXBwbGllZCBhcyBwYXJ0IG9mIGEgYGxlYWt5cmVsdWBcbiAqICAgICBhY3RpdmF0aW9uLlxuICovXG5mdW5jdGlvbiBmdXNlZENvbnYyZF88VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPih7XG4gIHgsXG4gIGZpbHRlcixcbiAgc3RyaWRlcyxcbiAgcGFkLFxuICBkYXRhRm9ybWF0ID0gJ05IV0MnLFxuICBkaWxhdGlvbnMgPSBbMSwgMV0sXG4gIGRpbVJvdW5kaW5nTW9kZSxcbiAgYmlhcyxcbiAgYWN0aXZhdGlvbiA9ICdsaW5lYXInLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICBsZWFreXJlbHVBbHBoYVxufToge1xuICB4OiBUfFRlbnNvckxpa2UsXG4gIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfGNvbnZfdXRpbC5FeHBsaWNpdFBhZGRpbmcsXG4gIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyxcbiAgYmlhcz86IFRlbnNvcnxUZW5zb3JMaWtlLFxuICBhY3RpdmF0aW9uPzogQWN0aXZhdGlvbixcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvcixcbiAgbGVha3lyZWx1QWxwaGE/OiBudW1iZXJcbn0pOiBUIHtcbiAgYWN0aXZhdGlvbiA9IGFjdGl2YXRpb24gfHwgJ2xpbmVhcic7XG5cbiAgaWYgKHNob3VsZEZ1c2UoRU5HSU5FLnN0YXRlLmdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID09PSBmYWxzZSkge1xuICAgIC8vIFRPRE86IFRyYW5zcG9zZSBiaWFzIGFuZCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIHByb3Blcmx5IGZvciBOQ0hXXG4gICAgLy8gZm9ybWF0IGJlZm9yZSBjb21wdXRhdGlvbi5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgZGF0YUZvcm1hdCA9PT0gJ05IV0MnLFxuICAgICAgICAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgY29udjJkOiBnb3QgZGF0YUZvcm1hdCBvZiAke2RhdGFGb3JtYXR9IGJ1dCBgICtcbiAgICAgICAgICAgIGBvbmx5IE5IV0MgaXMgY3VycmVudGx5IHN1cHBvcnRlZCBmb3IgdGhlIGNhc2Ugb2YgZ3JhZGllbnQgZGVwdGggYCArXG4gICAgICAgICAgICBgaXMgMCBhbmQgdGhlIGFjdGl2YXRpb24gaXMgbm90IGxpbmVhci5gKTtcblxuICAgIGxldCByZXN1bHQgPSB1bmZ1c2VkQ29udjJkKFxuICAgICAgICB4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IGFkZChyZXN1bHQsIGJpYXMpO1xuICAgIH1cblxuICAgIHJldHVybiBhcHBseUFjdGl2YXRpb24oXG4gICAgICAgICAgICAgICByZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKSBhcyBUO1xuICB9XG5cbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnY29udjJkJywgJ2Zsb2F0MzInKTtcbiAgY29uc3QgJGZpbHRlciA9IGNvbnZlcnRUb1RlbnNvcihmaWx0ZXIsICdmaWx0ZXInLCAnY29udjJkJywgJ2Zsb2F0MzInKTtcblxuICBsZXQgeDREID0gJHggYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcblxuICBpZiAoJHgucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgeDREID0gcmVzaGFwZSgkeCwgWzEsICR4LnNoYXBlWzBdLCAkeC5zaGFwZVsxXSwgJHguc2hhcGVbMl1dKTtcbiAgfVxuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogaW5wdXQgbXVzdCBiZSByYW5rIDQsIGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHt4NEQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGZpbHRlci5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogZmlsdGVyIG11c3QgYmUgcmFuayA0LCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7JGZpbHRlci5yYW5rfS5gKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ2Z1c2VkIGNvbnYyZCcsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgaW5wdXRDaGFubmVscyA9IGRhdGFGb3JtYXQgPT09ICdOSFdDJyA/IHg0RC5zaGFwZVszXSA6IHg0RC5zaGFwZVsxXTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkZmlsdGVyLnNoYXBlWzJdID09PSBpbnB1dENoYW5uZWxzLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYyZDogZGVwdGggb2YgaW5wdXQgKCR7aW5wdXRDaGFubmVsc30pIG11c3QgbWF0Y2ggYCArXG4gICAgICAgICAgYGlucHV0IGRlcHRoIGZvciBmaWx0ZXIgJHskZmlsdGVyLnNoYXBlWzJdfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gY29udjJEOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG5cbiAgY29uc3QgY29udkluZm8gPSBjb252X3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4NEQuc2hhcGUsICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuXG4gIGxldCAkYmlhczogVGVuc29yO1xuICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgJGJpYXMgPSBjb252ZXJ0VG9UZW5zb3IoYmlhcywgJ2JpYXMnLCAnZnVzZWQgY29udjJkJyk7XG4gICAgWyRiaWFzXSA9IG1ha2VUeXBlc01hdGNoKCRiaWFzLCAkeCk7XG5cbiAgICAvLyBBY2NvcmRpbmcgdG8gVGVuc29yRmxvdywgdGhlIGJpYXMgaXMgc3VwcG9zZWQgYmUgYSAxLUQgdGVuc29yIG9yIGFcbiAgICAvLyBzY2FsYXIuXG4gICAgLy9cbiAgICAvLyAzLUQgb3IgNC1EIGJpYXMgaXMgbm90IGRpc2FibGVkIGZvciBOSFdDIGZvcm1hdCwgYmVjYXVzZSB0aGV5IGFyZVxuICAgIC8vIGN1cnJlbnRseSBiZWluZyB1c2VkIGluIHNvbWUgY2FzZXMuIEZvciBleGFtcGxlbSBpbiBvdXIgY29kZSBiYXNlLFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvYmxvYi9iNTNiZDQ3ZTg4MDM2N2FlNTc0OTNmMGVhNjI4YWJhZjA4ZGIyZDVkL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkL2Z1c2VkX2NvbnYyZF90ZXN0LnRzI0wxOTcyLlxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGNvbnZJbmZvLm91dFNoYXBlLCAkYmlhcy5zaGFwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICRiaWFzLnNoYXBlLmxlbmd0aCA8PSAxLFxuICAgICAgICAgICgpID0+IGBFcnJvciBpbiBmdXNlZCBjb252MmQ6IG9ubHkgc3VwcG9ydHMgc2NhbGFyIG9yIDEtRCBUZW5zb3IgYCArXG4gICAgICAgICAgICAgIGBiaWFzIGZvciBOQ0hXIGZvcm1hdCBidXQgZ290IHRoZSBiaWFzIG9mIGAgK1xuICAgICAgICAgICAgICBgcmFuay0keyRiaWFzLnNoYXBlLmxlbmd0aH0uYCk7XG5cbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICRiaWFzLnNoYXBlLmxlbmd0aCA9PT0gMCB8fCAkYmlhcy5zaGFwZVswXSA9PT0gY29udkluZm8ub3V0Q2hhbm5lbHMgfHxcbiAgICAgICAgICAgICAgJGJpYXMuc2hhcGVbMF0gPT09IDEsXG4gICAgICAgICAgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogYmlhcyBzaGFwZSAoJHskYmlhcy5zaGFwZX0pIGlzIG5vdCBgICtcbiAgICAgICAgICAgICAgYGNvbXBhdGlibGUgd2l0aCB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyBgICtcbiAgICAgICAgICAgICAgYCgke2NvbnZJbmZvLm91dENoYW5uZWxzfSlgKTtcbiAgICB9XG4gIH1cblxuICBsZXQgJHByZWx1QWN0aXZhdGlvbldlaWdodHM6IFRlbnNvcjtcbiAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgIC8vIFBSZUxVJ3MgYWN0aXZhdGlvbiB3ZWlnaHRzIGNvdWxkIGJlIGEgc2NhbGFyLCBhIDEtRCB0ZW5zb3Igb3IgYSAzLURcbiAgICAvLyB0ZW5zb3IuXG4gICAgY29uc3QgYWxwaGFTaGFwZSA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMuc2hhcGU7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGFscGhhU2hhcGUubGVuZ3RoIDw9IDEgfHwgYWxwaGFTaGFwZS5sZW5ndGggPT09IDMsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBmdXNlZCBjb252MmQ6IG9ubHkgc3VwcG9ydHMgc2NhbGFyLCAxLUQgVGVuc29yIG9yIGAgK1xuICAgICAgICAgICAgYDMtRCBUZW5zb3IgUFJlTFUgYWN0aXZhdGlvbiB3ZWlnaHRzIGJ1dCBnb3QgYSB0ZW5zb3Igb2YgYCArXG4gICAgICAgICAgICBgcmFuay0ke2FscGhhU2hhcGUubGVuZ3RofS5gKTtcblxuICAgIGlmIChhbHBoYVNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgLy8gV2hldGhlciB0aGUgZGF0YSBmb3JtYXQgaXMgTkNIVyBvciBOSFdDLCB0aGUgMS1EIFBSZUxVIGFjdGl2YXRpb25cbiAgICAgIC8vIHdlaWdodHMgdGVuc29yIHNob3VsZCBiZSBhbGlnbmVkIHdpdGggdGhlIG91dHB1dCBjaGFubmVscyBvZiBjb252MmRcbiAgICAgIC8vIHJlc3VsdC5cbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgIGFscGhhU2hhcGVbMF0gPT09IDEgfHwgYWxwaGFTaGFwZVswXSA9PT0gY29udkluZm8ub3V0Q2hhbm5lbHMsXG4gICAgICAgICAgKCkgPT4gYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogUFJlTFUgYWN0aXZhdGlvbiB3ZWlnaHRzIGAgK1xuICAgICAgICAgICAgICBgKCR7YWxwaGFTaGFwZX0pIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG51bWJlciBvZiBvdXRwdXQgYCArXG4gICAgICAgICAgICAgIGBjaGFubmVscyAoJHtjb252SW5mby5vdXRDaGFubmVsc30pLmApO1xuICAgIH0gZWxzZSBpZiAoYWxwaGFTaGFwZS5sZW5ndGggPT09IDMpIHtcbiAgICAgIC8vIFdoZXRoZXIgdGhlIGRhdGEgZm9ybWF0IGlzIE5DSFcgb3IgTkhXQywgdGhlIFBSZUxVIGFjdGl2YXRpb24gd2VpZ2h0c1xuICAgICAgLy8gdGVuc29yIHNob3VsZCBoYXMgdGhlIGNvbXBhdGlibGUgc2hhcGUgd2l0aCB0aGUgcmVzdWx0IG9mIGNvbnYyZC5cbiAgICAgIHRyeSB7XG4gICAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKFxuICAgICAgICAgICAgYWxwaGFTaGFwZSwgY29udkluZm8ub3V0U2hhcGUpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zdCBlcnJNc2cgPVxuICAgICAgICAgICAgYEVycm9yIGluIGZ1c2VkIGNvbnYyZDogUFJlTFUgYWN0aXZhdGlvbiB3ZWlnaHRzICgke2FscGhhU2hhcGV9KSBgICtcbiAgICAgICAgICAgIGBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoZSBvdXRwdXQgc2hhcGUgb2YgdGhlIGNvbnYyZCBgICtcbiAgICAgICAgICAgIGAoJHtjb252SW5mby5vdXRTaGFwZX0pLmA7XG4gICAgICAgIHRocm93IEVycm9yKGVyck1zZyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgJHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIGNvbnYyZCcpO1xuICB9XG5cbiAgY29uc3QgZ3JhZCA9IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBkYXRhRm9ybWF0ID09PSAnTkhXQycsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBncmFkaWVudCBvZiBmdXNlZCBjb252MkQ6IGdvdCBkYXRhRm9ybWF0IG9mICR7XG4gICAgICAgICAgICBkYXRhRm9ybWF0fSBidXQgb25seSBOSFdDIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG5cbiAgICBjb25zdCBbJGZpbHRlciwgeDRELCB5LCAkYmlhc10gPVxuICAgICAgICBzYXZlZCBhcyBbVGVuc29yNEQsIFRlbnNvcjRELCBUZW5zb3I0RCwgVGVuc29yXTtcblxuICAgIGNvbnN0IGR5QWN0aXZhdGlvbiA9IGdldEZ1c2VkRHlBY3RpdmF0aW9uKGR5LCB5LCBhY3RpdmF0aW9uKSBhcyBUZW5zb3I0RDtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBjb252X3V0aWwudHVwbGVWYWx1ZXNBcmVPbmUoZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIGdyYWRpZW50IG9mIGZ1c2VkIGNvbnYyRDogJyArXG4gICAgICAgICAgICBgZGlsYXRpb24gcmF0ZXMgZ3JlYXRlciB0aGFuIDEgYCArXG4gICAgICAgICAgICBgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGdyYWRpZW50cy4gR290IGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gICAgY29uc3QgeERlciA9XG4gICAgICAgIGNvbnYyREJhY2twcm9wSW5wdXQoeDRELnNoYXBlLCBkeUFjdGl2YXRpb24sICRmaWx0ZXIsIHN0cmlkZXMsIHBhZCk7XG4gICAgY29uc3QgZmlsdGVyRGVyID1cbiAgICAgICAgY29udjJEQmFja3Byb3BGaWx0ZXIoeDRELCBkeUFjdGl2YXRpb24sICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCk7XG4gICAgY29uc3QgZGVyOiBUZW5zb3JbXSA9IFt4RGVyLCBmaWx0ZXJEZXJdO1xuXG4gICAgaWYgKCRiaWFzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgIGRlci5wdXNoKGJpYXNEZXIpO1xuICAgIH1cbiAgICByZXR1cm4gZGVyO1xuICB9O1xuXG4gIGNvbnN0IGlucHV0czogRnVzZWRDb252MkRJbnB1dHMgPSB7XG4gICAgeDogeDRELFxuICAgIGZpbHRlcjogJGZpbHRlcixcbiAgICBiaWFzOiAkYmlhcyxcbiAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzOiAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c1xuICB9O1xuXG4gIGNvbnN0IGF0dHJzOiBGdXNlZENvbnYyREF0dHJzID0ge1xuICAgIHN0cmlkZXMsXG4gICAgcGFkLFxuICAgIGRhdGFGb3JtYXQsXG4gICAgZGlsYXRpb25zLFxuICAgIGRpbVJvdW5kaW5nTW9kZSxcbiAgICBhY3RpdmF0aW9uLFxuICAgIGxlYWt5cmVsdUFscGhhXG4gIH07XG5cbiAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0aGUgcGFyYW1zIHBhc3NlZCBpbiB3ZSB3aWxsIGhhdmUgZGlmZmVyZW50IG51bWJlciBvZlxuICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICBpZiAoYmlhcyA9PSBudWxsKSB7XG4gICAgY29uc3QgY3VzdG9tT3AgPVxuICAgICAgICBjdXN0b21HcmFkKCh4NEQ6IFRlbnNvcjRELCBmaWx0ZXI6IFRlbnNvcjRELCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICAgICAgICBsZXQgcmVzOiBUZW5zb3I0RHxUZW5zb3IzRCA9XG4gICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIEZ1c2VkQ29udjJELCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xuXG4gICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlc10pO1xuXG4gICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXNcbiAgICAgICAgICAgICAgICBUZW5zb3IzRDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkfTtcbiAgICAgICAgfSk7XG4gICAgcmV0dXJuIGN1c3RvbU9wKHg0RCwgJGZpbHRlcikgYXMgVDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZChcbiAgICAgICAgKHg0RDogVGVuc29yNEQsIGZpbHRlcjogVGVuc29yNEQsIGJpYXM6IFRlbnNvciwgc2F2ZTogR3JhZFNhdmVGdW5jKSA9PiB7XG4gICAgICAgICAgbGV0IHJlczogVGVuc29yNER8VGVuc29yM0QgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICBGdXNlZENvbnYyRCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xuXG4gICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlcywgYmlhc10pO1xuXG4gICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXNcbiAgICAgICAgICAgICAgICBUZW5zb3IzRDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkfTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY3VzdG9tT3BXaXRoQmlhcyh4NEQsICRmaWx0ZXIsICRiaWFzKSBhcyBUO1xuICB9XG59XG5leHBvcnQgY29uc3QgY29udjJkID0gb3Aoe2Z1c2VkQ29udjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DepthwiseConv2dNativeBackpropFilter } from '../kernel_names';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nfunction depthwiseConv2dNativeBackpropFilter_(x, dy, filterShape, strides, pad, dilations = [1, 1], dimRoundingMode) {\n    let x4D = x;\n    if (x.rank === 3) {\n        x4D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2]]);\n    }\n    let dy4D = dy;\n    if (dy4D.rank === 3) {\n        dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n    }\n    const inputs = { x: x4D, dy: dy4D };\n    const attrs = { strides, pad, dimRoundingMode, dilations, filterShape };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    return ENGINE.runKernel(DepthwiseConv2dNativeBackpropFilter, inputs, attrs);\n}\nexport const depthwiseConv2dNativeBackpropFilter = op({ depthwiseConv2dNativeBackpropFilter_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLG1DQUFtQyxFQUFzRixNQUFNLGlCQUFpQixDQUFDO0FBTXpKLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxTQUFTLG9DQUFvQyxDQUN6QyxDQUFJLEVBQUUsRUFBSyxFQUFFLFdBQTZDLEVBQzFELE9BQWdDLEVBQ2hDLEdBQTBDLEVBQzFDLFlBQXFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUMzQyxlQUF3QztJQUMxQyxJQUFJLEdBQUcsR0FBRyxDQUFhLENBQUM7SUFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNoQixHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDM0Q7SUFDRCxJQUFJLElBQUksR0FBRyxFQUFjLENBQUM7SUFDMUIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNuQixJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEU7SUFFRCxNQUFNLE1BQU0sR0FBOEMsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM3RSxNQUFNLEtBQUssR0FDUCxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUU1RCwwREFBMEQ7SUFDMUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNaLG1DQUFtQyxFQUNuQyxNQUE4QixFQUFFLEtBQTJCLENBQzFELENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUNBQW1DLEdBQzVDLEVBQUUsQ0FBQyxFQUFDLG9DQUFvQyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9yZXNoYXBlJztcblxuZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgeDogVCwgZHk6IFQsIGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsXG4gICAgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlciA9IFsxLCAxXSxcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVGVuc29yNEQge1xuICBsZXQgeDREID0geCBhcyBUZW5zb3I0RDtcbiAgaWYgKHgucmFuayA9PT0gMykge1xuICAgIHg0RCA9IHJlc2hhcGUoeCwgWzEsIHguc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl1dKTtcbiAgfVxuICBsZXQgZHk0RCA9IGR5IGFzIFRlbnNvcjREO1xuICBpZiAoZHk0RC5yYW5rID09PSAzKSB7XG4gICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVySW5wdXRzID0ge3g6IHg0RCwgZHk6IGR5NER9O1xuICBjb25zdCBhdHRyczogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRycyA9XG4gICAgICB7c3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRpbGF0aW9ucywgZmlsdGVyU2hhcGV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsXG4gICAgICAgICAgICAgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzXG4gICAgICBUZW5zb3I0RDtcbn1cblxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyID1cbiAgICBvcCh7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { DepthwiseConv2dNativeBackpropInput } from '../kernel_names';\nimport { op } from './operation';\nimport { reshape } from './reshape';\nfunction depthwiseConv2dNativeBackpropInput_(xShape, dy, filter, strides, pad, dilations = [1, 1], dimRoundingMode) {\n    let dy4D = dy;\n    let reshapedTo4D = false;\n    if (dy.rank === 3) {\n        reshapedTo4D = true;\n        dy4D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2]]);\n    }\n    const inputs = { dy: dy4D, filter };\n    const attrs = { strides, pad, dimRoundingMode, dilations, inputShape: xShape };\n    const res = \n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    ENGINE.runKernel(DepthwiseConv2dNativeBackpropInput, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const depthwiseConv2dNativeBackpropInput = op({ depthwiseConv2dNativeBackpropInput_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfaW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9kZXB0aHdpc2VfY29udjJkX25hdGl2ZV9iYWNrcHJvcF9pbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxrQ0FBa0MsRUFBb0YsTUFBTSxpQkFBaUIsQ0FBQztBQU10SixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsU0FBUyxtQ0FBbUMsQ0FDeEMsTUFBd0MsRUFBRSxFQUFLLEVBQUUsTUFBZ0IsRUFDakUsT0FBZ0MsRUFDaEMsR0FBMEMsRUFDMUMsWUFBcUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQzNDLGVBQXdDO0lBQzFDLElBQUksSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUMxQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDekIsSUFBSSxFQUFFLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNqQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoRTtJQUVELE1BQU0sTUFBTSxHQUE2QyxFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDNUUsTUFBTSxLQUFLLEdBQ1AsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBRW5FLE1BQU0sR0FBRztJQUNMLDBEQUEwRDtJQUMxRCxNQUFNLENBQUMsU0FBUyxDQUNaLGtDQUFrQyxFQUFFLE1BQThCLEVBQ2xFLEtBQTJCLENBQU0sQ0FBQztJQUUxQyxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7S0FDdEU7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQ0FBa0MsR0FDM0MsRUFBRSxDQUFDLEVBQUMsbUNBQW1DLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuXG5pbXBvcnQge0V4cGxpY2l0UGFkZGluZ30gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG5mdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0XzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIHhTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGR5OiBULCBmaWx0ZXI6IFRlbnNvcjRELFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZyxcbiAgICBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyID0gWzEsIDFdLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgbGV0IGR5NEQgPSBkeSBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuICBpZiAoZHkucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgZHk0RCA9IHJlc2hhcGUoZHksIFsxLCBkeS5zaGFwZVswXSwgZHkuc2hhcGVbMV0sIGR5LnNoYXBlWzJdXSk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRJbnB1dHMgPSB7ZHk6IGR5NEQsIGZpbHRlcn07XG4gIGNvbnN0IGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnMgPVxuICAgICAge3N0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkaWxhdGlvbnMsIGlucHV0U2hhcGU6IHhTaGFwZX07XG5cbiAgY29uc3QgcmVzID1cbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pIGFzIFQ7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQgPVxuICAgIG9wKHtkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0X30pO1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { customGrad } from '../../gradients';\nimport { FusedDepthwiseConv2D } from '../../kernel_names';\nimport { makeTypesMatch } from '../../tensor_util';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { add } from '../add';\nimport * as broadcast_util from '../broadcast_util';\nimport * as conv_util from '../conv_util';\nimport { depthwiseConv2d as unfusedDepthwiseConv2d } from '../depthwise_conv2d';\nimport { depthwiseConv2dNativeBackpropFilter } from '../depthwise_conv2d_native_backprop_filter';\nimport { depthwiseConv2dNativeBackpropInput } from '../depthwise_conv2d_native_backprop_input';\nimport { applyActivation, getFusedBiasGradient, getFusedDyActivation, shouldFuse } from '../fused_util';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * Computes depthwise 2D convolution, optionally fused with adding a\n * bias and applying an activation.\n *\n * Given a 4D `input` array and a `filter` array of shape\n * `[filterHeight, filterWidth, inChannels, channelMultiplier]` containing\n * `inChannels` convolutional filters of depth 1, this op applies a\n * different filter to each input channel (expanding from 1 channel to\n * `channelMultiplier` channels for each), then concatenates the results\n * together. The output has `inChannels * channelMultiplier` channels.\n *\n * See\n * [https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d](\n *     https://www.tensorflow.org/api_docs/python/tf/nn/depthwise_conv2d)\n * for more details.\n *\n * @param obj An object with the following properties:\n * @param x The input tensor, of rank 4 or rank 3, of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is\n * assumed.\n * @param filter The filter tensor, rank 4, of shape\n *     `[filterHeight, filterWidth, inChannels, channelMultiplier]`.\n * @param strides The strides of the convolution: `[strideHeight,\n * strideWidth]`. If strides is a single number, then `strideHeight ==\n * strideWidth`.\n * @param pad The type of padding algorithm.\n *   - `same` and stride 1: output will be of same size as input,\n *       regardless of filter size.\n *   - `valid`: output will be smaller than input if filter is larger\n *       than 1x1.\n *   - For more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dilations The dilation rates: `[dilationHeight, dilationWidth]`\n *     in which we sample input values across the height and width dimensions\n *     in atrous convolution. Defaults to `[1, 1]`. If `rate` is a single\n *     number, then `dilationHeight == dilationWidth`. If it is greater than\n *     1, then all values of `strides` must be 1.\n * @param dataFormat: An optional string from: \"NHWC\", \"NCHW\". Defaults to\n *     \"NHWC\". Specify the data format of the input and output data. With the\n *     default format \"NHWC\", the data is stored in the order of: [batch,\n *     height, width, channels]. Only \"NHWC\" is currently supported.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n * @param bias Tensor to be added to the result.\n * @param activation Name of activation kernel (defaults to `linear`).\n * @param preluActivationWeights Tensor of prelu weights to be applied as part\n *     of a `prelu` activation, typically the same shape as `x`.\n * @param leakyreluAlpha Optional. Alpha to be applied as part of a `leakyrelu`\n *     activation.\n */\nfunction fusedDepthwiseConv2d_({ x, filter, strides, pad, dataFormat = 'NHWC', dilations = [1, 1], dimRoundingMode, bias, activation = 'linear', preluActivationWeights, leakyreluAlpha }) {\n    if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n        let result = unfusedDepthwiseConv2d(x, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n        if (bias != null) {\n            result = add(result, bias);\n        }\n        return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n    }\n    const $x = convertToTensor(x, 'x', 'depthwiseConv2d', 'float32');\n    const $filter = convertToTensor(filter, 'filter', 'depthwiseConv2d', 'float32');\n    let x4D = $x;\n    let reshapedTo4D = false;\n    if ($x.rank === 3) {\n        reshapedTo4D = true;\n        x4D = reshape($x, [1, $x.shape[0], $x.shape[1], $x.shape[2]]);\n    }\n    util.assert(x4D.rank === 4, () => `Error in fused depthwiseConv2d: input must be rank 4, but got ` +\n        `rank ${x4D.rank}.`);\n    util.assert($filter.rank === 4, () => `Error in fused depthwiseConv2d: filter must be rank 4, ` +\n        `but got rank ${$filter.rank}.`);\n    util.assert(x4D.shape[3] === $filter.shape[2], () => `Error in fused depthwiseConv2d: number of input channels ` +\n        `(${x4D.shape[3]}) must match the inChannels dimension in ` +\n        `filter ${$filter.shape[2]}.`);\n    if (dilations == null) {\n        dilations = [1, 1];\n    }\n    util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in fused depthwiseConv2d: Either strides or dilations must ' +\n        `be 1. Got strides ${strides} and dilations '${dilations}'`);\n    conv_util.checkPadOnDimRoundingMode('fused depthwiseConv2d', pad, dimRoundingMode);\n    const convInfo = conv_util.computeConv2DInfo(x4D.shape, $filter.shape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n    let $bias;\n    if (bias != null) {\n        $bias = convertToTensor(bias, 'bias', 'fused conv2d');\n        [$bias] = makeTypesMatch($bias, $x);\n        broadcast_util.assertAndGetBroadcastShape(convInfo.outShape, $bias.shape);\n    }\n    let $preluActivationWeights;\n    if (preluActivationWeights != null) {\n        $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused depthwiseConv2d');\n    }\n    const grad = (dy, saved) => {\n        util.assert(conv_util.tupleValuesAreOne(dilations), () => 'Error in gradient of fused depthwiseConv2d: dilation rates ' +\n            `greater than 1 are not yet supported. Got dilations ` +\n            `'${dilations}'`);\n        const [$filter, x4D, y, bias] = saved;\n        const dyActivation = getFusedDyActivation(dy, y, activation);\n        const xDer = depthwiseConv2dNativeBackpropInput(x4D.shape, dyActivation, $filter, strides, pad, dilations, dimRoundingMode);\n        const filterDer = depthwiseConv2dNativeBackpropFilter(x4D, dyActivation, $filter.shape, strides, pad, dilations, dimRoundingMode);\n        if (bias != null) {\n            const biasDer = getFusedBiasGradient($bias, dyActivation);\n            return [xDer, filterDer, biasDer];\n        }\n        return [xDer, filterDer];\n    };\n    const inputs = {\n        x: x4D,\n        filter: $filter,\n        bias: $bias,\n        preluActivationWeights: $preluActivationWeights\n    };\n    const attrs = {\n        strides,\n        pad,\n        dataFormat,\n        dilations,\n        dimRoundingMode,\n        activation,\n        leakyreluAlpha\n    };\n    // Depending on the the params passed in we will have different number of\n    // inputs and thus a a different number of elements in the gradient.\n    if (bias == null) {\n        const customOp = customGrad((x4D, filter, save) => {\n            // tslint:disable-next-line: no-unnecessary-type-assertion\n            let res = ENGINE.runKernel(FusedDepthwiseConv2D, inputs, attrs);\n            save([filter, x4D, res]);\n            if (reshapedTo4D) {\n                // tslint:disable-next-line: no-unnecessary-type-assertion\n                res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n            }\n            return { value: res, gradFunc: grad };\n        });\n        return customOp(x4D, $filter);\n    }\n    else {\n        const customOpWithBias = customGrad((x4D, filter, bias, save) => {\n            // tslint:disable-next-line: no-unnecessary-type-assertion\n            let res = ENGINE.runKernel(FusedDepthwiseConv2D, inputs, attrs);\n            save([filter, x4D, res, bias]);\n            if (reshapedTo4D) {\n                // tslint:disable-next-line: no-unnecessary-type-assertion\n                res = reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n            }\n            return { value: res, gradFunc: grad };\n        });\n        return customOpWithBias(x4D, $filter, $bias);\n    }\n}\nexport const depthwiseConv2d = op({ fusedDepthwiseConv2d_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkL2RlcHRod2lzZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFDLG9CQUFvQixFQUF3RCxNQUFNLG9CQUFvQixDQUFDO0FBSS9HLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEtBQUssY0FBYyxNQUFNLG1CQUFtQixDQUFDO0FBQ3BELE9BQU8sS0FBSyxTQUFTLE1BQU0sY0FBYyxDQUFDO0FBQzFDLE9BQU8sRUFBQyxlQUFlLElBQUksc0JBQXNCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5RSxPQUFPLEVBQUMsbUNBQW1DLEVBQUMsTUFBTSw0Q0FBNEMsQ0FBQztBQUMvRixPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwyQ0FBMkMsQ0FBQztBQUU3RixPQUFPLEVBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7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O0FBQ0QsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFHLEVBQUUsQ0FBQyxFQUFDLHFCQUFxQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge2N1c3RvbUdyYWR9IGZyb20gJy4uLy4uL2dyYWRpZW50cyc7XG5pbXBvcnQge0Z1c2VkRGVwdGh3aXNlQ29udjJELCBGdXNlZERlcHRod2lzZUNvbnYyREF0dHJzLCBGdXNlZERlcHRod2lzZUNvbnYyRElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7R3JhZFNhdmVGdW5jLCBOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7bWFrZVR5cGVzTWF0Y2h9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi4vY29udl91dGlsJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkIGFzIHVuZnVzZWREZXB0aHdpc2VDb252MmR9IGZyb20gJy4uL2RlcHRod2lzZV9jb252MmQnO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcn0gZnJvbSAnLi4vZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dH0gZnJvbSAnLi4vZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0IHtBY3RpdmF0aW9ufSBmcm9tICcuLi9mdXNlZF90eXBlcyc7XG5pbXBvcnQge2FwcGx5QWN0aXZhdGlvbiwgZ2V0RnVzZWRCaWFzR3JhZGllbnQsIGdldEZ1c2VkRHlBY3RpdmF0aW9uLCBzaG91bGRGdXNlfSBmcm9tICcuLi9mdXNlZF91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIGRlcHRod2lzZSAyRCBjb252b2x1dGlvbiwgb3B0aW9uYWxseSBmdXNlZCB3aXRoIGFkZGluZyBhXG4gKiBiaWFzIGFuZCBhcHBseWluZyBhbiBhY3RpdmF0aW9uLlxuICpcbiAqIEdpdmVuIGEgNEQgYGlucHV0YCBhcnJheSBhbmQgYSBgZmlsdGVyYCBhcnJheSBvZiBzaGFwZVxuICogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkNoYW5uZWxzLCBjaGFubmVsTXVsdGlwbGllcl1gIGNvbnRhaW5pbmdcbiAqIGBpbkNoYW5uZWxzYCBjb252b2x1dGlvbmFsIGZpbHRlcnMgb2YgZGVwdGggMSwgdGhpcyBvcCBhcHBsaWVzIGFcbiAqIGRpZmZlcmVudCBmaWx0ZXIgdG8gZWFjaCBpbnB1dCBjaGFubmVsIChleHBhbmRpbmcgZnJvbSAxIGNoYW5uZWwgdG9cbiAqIGBjaGFubmVsTXVsdGlwbGllcmAgY2hhbm5lbHMgZm9yIGVhY2gpLCB0aGVuIGNvbmNhdGVuYXRlcyB0aGUgcmVzdWx0c1xuICogdG9nZXRoZXIuIFRoZSBvdXRwdXQgaGFzIGBpbkNoYW5uZWxzICogY2hhbm5lbE11bHRpcGxpZXJgIGNoYW5uZWxzLlxuICpcbiAqIFNlZVxuICogW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9kZXB0aHdpc2VfY29udjJkXShcbiAqICAgICBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vZGVwdGh3aXNlX2NvbnYyZClcbiAqIGZvciBtb3JlIGRldGFpbHMuXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGZpbHRlciBUaGUgZmlsdGVyIHRlbnNvciwgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIGBbZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aCwgaW5DaGFubmVscywgY2hhbm5lbE11bHRpcGxpZXJdYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbjogYFtzdHJpZGVIZWlnaHQsXG4gKiBzdHJpZGVXaWR0aF1gLiBJZiBzdHJpZGVzIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgc3RyaWRlSGVpZ2h0ID09XG4gKiBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtLlxuICogICAtIGBzYW1lYCBhbmQgc3RyaWRlIDE6IG91dHB1dCB3aWxsIGJlIG9mIHNhbWUgc2l6ZSBhcyBpbnB1dCxcbiAqICAgICAgIHJlZ2FyZGxlc3Mgb2YgZmlsdGVyIHNpemUuXG4gKiAgIC0gYHZhbGlkYDogb3V0cHV0IHdpbGwgYmUgc21hbGxlciB0aGFuIGlucHV0IGlmIGZpbHRlciBpcyBsYXJnZXJcbiAqICAgICAgIHRoYW4gMXgxLlxuICogICAtIEZvciBtb3JlIGluZm8sIHNlZSB0aGlzIGd1aWRlOlxuICogICAgIFtodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvbm4vY29udm9sdXRpb25dKFxuICogICAgICAgICAgaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uKVxuICogQHBhcmFtIGRpbGF0aW9ucyBUaGUgZGlsYXRpb24gcmF0ZXM6IGBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdYFxuICogICAgIGluIHdoaWNoIHdlIHNhbXBsZSBpbnB1dCB2YWx1ZXMgYWNyb3NzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIGRpbWVuc2lvbnNcbiAqICAgICBpbiBhdHJvdXMgY29udm9sdXRpb24uIERlZmF1bHRzIHRvIGBbMSwgMV1gLiBJZiBgcmF0ZWAgaXMgYSBzaW5nbGVcbiAqICAgICBudW1iZXIsIHRoZW4gYGRpbGF0aW9uSGVpZ2h0ID09IGRpbGF0aW9uV2lkdGhgLiBJZiBpdCBpcyBncmVhdGVyIHRoYW5cbiAqICAgICAxLCB0aGVuIGFsbCB2YWx1ZXMgb2YgYHN0cmlkZXNgIG11c3QgYmUgMS5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0OiBBbiBvcHRpb25hbCBzdHJpbmcgZnJvbTogXCJOSFdDXCIsIFwiTkNIV1wiLiBEZWZhdWx0cyB0b1xuICogICAgIFwiTkhXQ1wiLiBTcGVjaWZ5IHRoZSBkYXRhIGZvcm1hdCBvZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhLiBXaXRoIHRoZVxuICogICAgIGRlZmF1bHQgZm9ybWF0IFwiTkhXQ1wiLCB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gdGhlIG9yZGVyIG9mOiBbYmF0Y2gsXG4gKiAgICAgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBPbmx5IFwiTkhXQ1wiIGlzIGN1cnJlbnRseSBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0gZGltUm91bmRpbmdNb2RlIEEgc3RyaW5nIGZyb206ICdjZWlsJywgJ3JvdW5kJywgJ2Zsb29yJy4gSWYgbm9uZSBpc1xuICogICAgIHByb3ZpZGVkLCBpdCB3aWxsIGRlZmF1bHQgdG8gdHJ1bmNhdGUuXG4gKiBAcGFyYW0gYmlhcyBUZW5zb3IgdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIEBwYXJhbSBhY3RpdmF0aW9uIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIEBwYXJhbSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzIHRvIGJlIGFwcGxpZWQgYXMgcGFydFxuICogICAgIG9mIGEgYHByZWx1YCBhY3RpdmF0aW9uLCB0eXBpY2FsbHkgdGhlIHNhbWUgc2hhcGUgYXMgYHhgLlxuICogQHBhcmFtIGxlYWt5cmVsdUFscGhhIE9wdGlvbmFsLiBBbHBoYSB0byBiZSBhcHBsaWVkIGFzIHBhcnQgb2YgYSBgbGVha3lyZWx1YFxuICogICAgIGFjdGl2YXRpb24uXG4gKi9cbmZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJkXzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KHtcbiAgeCxcbiAgZmlsdGVyLFxuICBzdHJpZGVzLFxuICBwYWQsXG4gIGRhdGFGb3JtYXQgPSAnTkhXQycsXG4gIGRpbGF0aW9ucyA9IFsxLCAxXSxcbiAgZGltUm91bmRpbmdNb2RlLFxuICBiaWFzLFxuICBhY3RpdmF0aW9uID0gJ2xpbmVhcicsXG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gIGxlYWt5cmVsdUFscGhhXG59OiB7XG4gIHg6IFR8VGVuc29yTGlrZSxcbiAgZmlsdGVyOiBUZW5zb3I0RHxUZW5zb3JMaWtlLFxuICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsXG4gIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyxcbiAgYmlhcz86IFRlbnNvcnxUZW5zb3JMaWtlLFxuICBhY3RpdmF0aW9uPzogQWN0aXZhdGlvbixcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvcixcbiAgbGVha3lyZWx1QWxwaGE/OiBudW1iZXJcbn0pOiBUIHtcbiAgaWYgKHNob3VsZEZ1c2UoRU5HSU5FLnN0YXRlLmdyYWRpZW50RGVwdGgsIGFjdGl2YXRpb24pID09PSBmYWxzZSkge1xuICAgIGxldCByZXN1bHQgPSB1bmZ1c2VkRGVwdGh3aXNlQ29udjJkKFxuICAgICAgICB4LCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGUpO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgIHJlc3VsdCA9IGFkZChyZXN1bHQsIGJpYXMpO1xuICAgIH1cblxuICAgIHJldHVybiBhcHBseUFjdGl2YXRpb24oXG4gICAgICAgICAgICAgICByZXN1bHQsIGFjdGl2YXRpb24sIHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGxlYWt5cmVsdUFscGhhKSBhcyBUO1xuICB9XG5cbiAgY29uc3QgJHggPSBjb252ZXJ0VG9UZW5zb3IoeCwgJ3gnLCAnZGVwdGh3aXNlQ29udjJkJywgJ2Zsb2F0MzInKTtcbiAgY29uc3QgJGZpbHRlciA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IoZmlsdGVyLCAnZmlsdGVyJywgJ2RlcHRod2lzZUNvbnYyZCcsICdmbG9hdDMyJyk7XG5cbiAgbGV0IHg0RCA9ICR4IGFzIFRlbnNvcjREO1xuICBsZXQgcmVzaGFwZWRUbzREID0gZmFsc2U7XG4gIGlmICgkeC5yYW5rID09PSAzKSB7XG4gICAgcmVzaGFwZWRUbzREID0gdHJ1ZTtcbiAgICB4NEQgPSByZXNoYXBlKCR4LCBbMSwgJHguc2hhcGVbMF0sICR4LnNoYXBlWzFdLCAkeC5zaGFwZVsyXV0pO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDRELnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBpbnB1dCBtdXN0IGJlIHJhbmsgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAke3g0RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkZmlsdGVyLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gZnVzZWQgZGVwdGh3aXNlQ29udjJkOiBmaWx0ZXIgbXVzdCBiZSByYW5rIDQsIGAgK1xuICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskZmlsdGVyLnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHg0RC5zaGFwZVszXSA9PT0gJGZpbHRlci5zaGFwZVsyXSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IG51bWJlciBvZiBpbnB1dCBjaGFubmVscyBgICtcbiAgICAgICAgICBgKCR7eDRELnNoYXBlWzNdfSkgbXVzdCBtYXRjaCB0aGUgaW5DaGFubmVscyBkaW1lbnNpb24gaW4gYCArXG4gICAgICAgICAgYGZpbHRlciAkeyRmaWx0ZXIuc2hhcGVbMl19LmApO1xuICBpZiAoZGlsYXRpb25zID09IG51bGwpIHtcbiAgICBkaWxhdGlvbnMgPSBbMSwgMV07XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjb252X3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAoKSA9PlxuICAgICAgICAgICdFcnJvciBpbiBmdXNlZCBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0ICcgK1xuICAgICAgICAgIGBiZSAxLiBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcbiAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoXG4gICAgICAnZnVzZWQgZGVwdGh3aXNlQ29udjJkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBjb252SW5mbyA9IGNvbnZfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHg0RC5zaGFwZSwgJGZpbHRlci5zaGFwZSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSxcbiAgICAgIHRydWUgLyogZGVwdGh3aXNlICovKTtcblxuICBsZXQgJGJpYXM6IFRlbnNvcjtcbiAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICRiaWFzID0gY29udmVydFRvVGVuc29yKGJpYXMsICdiaWFzJywgJ2Z1c2VkIGNvbnYyZCcpO1xuICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJHgpO1xuXG4gICAgYnJvYWRjYXN0X3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoY29udkluZm8ub3V0U2hhcGUsICRiaWFzLnNoYXBlKTtcbiAgfVxuXG4gIGxldCAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogVGVuc29yO1xuICBpZiAocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgJHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIGRlcHRod2lzZUNvbnYyZCcpO1xuICB9XG5cbiAgY29uc3QgZ3JhZCA9IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBjb252X3V0aWwudHVwbGVWYWx1ZXNBcmVPbmUoZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIGdyYWRpZW50IG9mIGZ1c2VkIGRlcHRod2lzZUNvbnYyZDogZGlsYXRpb24gcmF0ZXMgJyArXG4gICAgICAgICAgICBgZ3JlYXRlciB0aGFuIDEgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiBHb3QgZGlsYXRpb25zIGAgK1xuICAgICAgICAgICAgYCcke2RpbGF0aW9uc30nYCk7XG4gICAgY29uc3QgWyRmaWx0ZXIsIHg0RCwgeSwgYmlhc10gPSBzYXZlZDtcblxuICAgIGNvbnN0IGR5QWN0aXZhdGlvbiA9IGdldEZ1c2VkRHlBY3RpdmF0aW9uKGR5LCB5LCBhY3RpdmF0aW9uKSBhcyBUZW5zb3I0RDtcblxuICAgIGNvbnN0IHhEZXIgPSBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0KFxuICAgICAgICAoeDREIGFzIFRlbnNvcjREKS5zaGFwZSwgZHlBY3RpdmF0aW9uLCAkZmlsdGVyIGFzIFRlbnNvcjRELCBzdHJpZGVzLFxuICAgICAgICBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKTtcbiAgICBjb25zdCBmaWx0ZXJEZXIgPSBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcihcbiAgICAgICAgeDREIGFzIFRlbnNvcjRELCBkeUFjdGl2YXRpb24sICgkZmlsdGVyIGFzIFRlbnNvcjREKS5zaGFwZSwgc3RyaWRlcyxcbiAgICAgICAgcGFkLCBkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSk7XG5cbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICBjb25zdCBiaWFzRGVyID0gZ2V0RnVzZWRCaWFzR3JhZGllbnQoJGJpYXMsIGR5QWN0aXZhdGlvbik7XG4gICAgICByZXR1cm4gW3hEZXIsIGZpbHRlckRlciwgYmlhc0Rlcl07XG4gICAgfVxuICAgIHJldHVybiBbeERlciwgZmlsdGVyRGVyXTtcbiAgfTtcblxuICBjb25zdCBpbnB1dHM6IEZ1c2VkRGVwdGh3aXNlQ29udjJESW5wdXRzID0ge1xuICAgIHg6IHg0RCxcbiAgICBmaWx0ZXI6ICRmaWx0ZXIsXG4gICAgYmlhczogJGJpYXMsXG4gICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogJHByZWx1QWN0aXZhdGlvbldlaWdodHNcbiAgfTtcbiAgY29uc3QgYXR0cnM6IEZ1c2VkRGVwdGh3aXNlQ29udjJEQXR0cnMgPSB7XG4gICAgc3RyaWRlcyxcbiAgICBwYWQsXG4gICAgZGF0YUZvcm1hdCxcbiAgICBkaWxhdGlvbnMsXG4gICAgZGltUm91bmRpbmdNb2RlLFxuICAgIGFjdGl2YXRpb24sXG4gICAgbGVha3lyZWx1QWxwaGFcbiAgfTtcblxuICAvLyBEZXBlbmRpbmcgb24gdGhlIHRoZSBwYXJhbXMgcGFzc2VkIGluIHdlIHdpbGwgaGF2ZSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gIC8vIGlucHV0cyBhbmQgdGh1cyBhIGEgZGlmZmVyZW50IG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgZ3JhZGllbnQuXG4gIGlmIChiaWFzID09IG51bGwpIHtcbiAgICBjb25zdCBjdXN0b21PcCA9XG4gICAgICAgIGN1c3RvbUdyYWQoKHg0RDogVGVuc29yNEQsIGZpbHRlcjogVGVuc29yNEQsIHNhdmU6IEdyYWRTYXZlRnVuYykgPT4ge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICBsZXQgcmVzOiBUZW5zb3I0RHxUZW5zb3IzRCA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgIEZ1c2VkRGVwdGh3aXNlQ29udjJELCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG5cbiAgICAgICAgICBzYXZlKFtmaWx0ZXIsIHg0RCwgcmVzXSk7XG5cbiAgICAgICAgICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgICByZXMgPSByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhc1xuICAgICAgICAgICAgICAgIFRlbnNvcjNEO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7dmFsdWU6IHJlcywgZ3JhZEZ1bmM6IGdyYWR9O1xuICAgICAgICB9KTtcbiAgICByZXR1cm4gY3VzdG9tT3AoeDRELCAkZmlsdGVyKSBhcyBUO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGN1c3RvbU9wV2l0aEJpYXMgPSBjdXN0b21HcmFkKFxuICAgICAgICAoeDREOiBUZW5zb3I0RCwgZmlsdGVyOiBUZW5zb3I0RCwgYmlhczogVGVuc29yLCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgICAgbGV0IHJlczogVGVuc29yNER8VGVuc29yM0QgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICBGdXNlZERlcHRod2lzZUNvbnYyRCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xuXG4gICAgICAgICAgc2F2ZShbZmlsdGVyLCB4NEQsIHJlcywgYmlhc10pO1xuXG4gICAgICAgICAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgcmVzID0gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXNcbiAgICAgICAgICAgICAgICBUZW5zb3IzRDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXMsIGdyYWRGdW5jOiBncmFkfTtcbiAgICAgICAgfSk7XG5cbiAgICByZXR1cm4gY3VzdG9tT3BXaXRoQmlhcyh4NEQsICRmaWx0ZXIsICRiaWFzKSBhcyBUO1xuICB9XG59XG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkID0gb3Aoe2Z1c2VkRGVwdGh3aXNlQ29udjJkX30pO1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { customGrad } from '../../gradients';\nimport { _FusedMatMul } from '../../kernel_names';\nimport { makeTypesMatch } from '../../tensor_util';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { add } from '../add';\nimport * as broadcast_util from '../broadcast_util';\nimport { applyActivation, getFusedBiasGradient, getFusedDyActivation, shouldFuse } from '../fused_util';\nimport { matMul as unfusedMatMul } from '../mat_mul';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * Computes the dot product of two matrices with optional activation and bias.\n *\n * ```js\n * const a = tf.tensor2d([-1, -2], [1, 2]);\n * const b = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const bias = tf.tensor2d([1, 2], [1, 2]);\n *\n * tf.fused.matMul({a, b, bias, activation: 'relu'}).print();\n * ```\n *\n * @param obj An object with the following properties:\n * - `a` First matrix in dot product operation.\n * - `b` Second matrix in dot product operation.\n * - `transposeA` If true, `a` is transposed before multiplication.\n * - `transposeB` If true, `b` is transposed before multiplication.\n * - `bias` Matrix to be added to the result.\n * - `activation` Name of activation kernel (defaults to `linear`).\n * - `preluActivationWeights` Tensor of prelu weights.\n * - `leakyreluAlpha` Alpha of leakyrelu.\n */\nfunction fusedMatMul_({ a, b, transposeA = false, transposeB = false, bias, activation = 'linear', preluActivationWeights, leakyreluAlpha = 0.2, }) {\n    if (shouldFuse(ENGINE.state.gradientDepth, activation) === false) {\n        let result = unfusedMatMul(a, b, transposeA, transposeB);\n        if (bias != null) {\n            result = add(result, bias);\n        }\n        return applyActivation(result, activation, preluActivationWeights, leakyreluAlpha);\n    }\n    let $a = convertToTensor(a, 'a', 'fused matMul');\n    let $b = convertToTensor(b, 'b', 'fused matMul');\n    [$a, $b] = makeTypesMatch($a, $b);\n    const innerShapeA = transposeA ? $a.shape[$a.rank - 2] : $a.shape[$a.rank - 1];\n    const innerShapeB = transposeB ? $b.shape[$b.rank - 1] : $b.shape[$b.rank - 2];\n    const outerShapeA = transposeA ? $a.shape[$a.rank - 1] : $a.shape[$a.rank - 2];\n    const outerShapeB = transposeB ? $b.shape[$b.rank - 2] : $b.shape[$b.rank - 1];\n    const outerDimsA = $a.shape.slice(0, -2);\n    const outerDimsB = $b.shape.slice(0, -2);\n    const batchDimA = util.sizeFromShape(outerDimsA);\n    const batchDimB = util.sizeFromShape(outerDimsB);\n    util.assert(innerShapeA === innerShapeB, () => `Error in fused matMul: inner shapes (${innerShapeA}) and (` +\n        `${innerShapeB}) of Tensors with shapes ${$a.shape} and ` +\n        `${$b.shape} and transposeA=${transposeA}` +\n        ` and transposeB=${transposeB} must match.`);\n    const outShapeOuterDims = broadcast_util.assertAndGetBroadcastShape($a.shape.slice(0, -2), $b.shape.slice(0, -2));\n    const outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]);\n    const a3D = transposeA ?\n        reshape($a, [batchDimA, innerShapeA, outerShapeA]) :\n        reshape($a, [batchDimA, outerShapeA, innerShapeA]);\n    const b3D = transposeB ?\n        reshape($b, [batchDimB, outerShapeB, innerShapeB]) :\n        reshape($b, [batchDimB, innerShapeB, outerShapeB]);\n    let $bias;\n    if (bias != null) {\n        $bias = convertToTensor(bias, 'bias', 'fused matMul');\n        [$bias] = makeTypesMatch($bias, $a);\n        broadcast_util.assertAndGetBroadcastShape(outShape, $bias.shape);\n    }\n    let $preluActivationWeights;\n    if (preluActivationWeights != null) {\n        $preluActivationWeights = convertToTensor(preluActivationWeights, 'prelu weights', 'fused matMul');\n    }\n    const grad = (dy, saved) => {\n        const [a3D, b3D, y, $bias] = saved;\n        // we reshape dy because the result of the forward is not\n        // necessarily going to be a 3d tensor due to a reshape done at the end of\n        // the customOp.\n        const dyActivation = getFusedDyActivation(reshape(dy, y.shape), y, activation);\n        let aDer;\n        let bDer;\n        if (!transposeA && !transposeB) {\n            aDer = unfusedMatMul(dyActivation, b3D, false, true);\n            bDer = unfusedMatMul(a3D, dyActivation, true, false);\n        }\n        else if (!transposeA && transposeB) {\n            aDer = unfusedMatMul(dyActivation, b3D, false, false);\n            bDer = unfusedMatMul(dyActivation, a3D, true, false);\n        }\n        else if (transposeA && !transposeB) {\n            aDer = unfusedMatMul(b3D, dyActivation, false, true);\n            bDer = unfusedMatMul(a3D, dyActivation, false, false);\n        }\n        else {\n            aDer = unfusedMatMul(b3D, dyActivation, true, true);\n            bDer = unfusedMatMul(dyActivation, a3D, true, true);\n        }\n        if (bias != null) {\n            const biasDer = getFusedBiasGradient($bias, dyActivation);\n            return [aDer, bDer, biasDer];\n        }\n        else {\n            return [aDer, bDer];\n        }\n    };\n    const inputs = {\n        a: a3D,\n        b: b3D,\n        bias: $bias,\n        preluActivationWeights: $preluActivationWeights\n    };\n    const attrs = { transposeA, transposeB, activation, leakyreluAlpha };\n    // Depending on the the params passed in we will have different number of\n    // inputs and thus a a different number of elements in the gradient.\n    if (bias == null) {\n        const customOp = customGrad((a3D, b3D, save) => {\n            const res = \n            // tslint:disable-next-line: no-unnecessary-type-assertion\n            ENGINE.runKernel(_FusedMatMul, inputs, attrs);\n            save([a3D, b3D, res]);\n            return { value: reshape(res, outShape), gradFunc: grad };\n        });\n        return customOp(a3D, b3D);\n    }\n    else {\n        const customOpWithBias = customGrad((a3D, b3D, $bias, save) => {\n            const res = \n            // tslint:disable-next-line: no-unnecessary-type-assertion\n            ENGINE.runKernel(_FusedMatMul, inputs, attrs);\n            save([a3D, b3D, res, $bias]);\n            return { value: reshape(res, outShape), gradFunc: grad };\n        });\n        return customOpWithBias(a3D, b3D, $bias);\n    }\n}\nexport const matMul = op({ fusedMatMul_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0X211bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkL21hdF9tdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsT0FBTyxFQUFDLFlBQVksRUFBd0MsTUFBTSxvQkFBb0IsQ0FBQztBQUl2RixPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDakQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sS0FBSyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxLQUFLLGNBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxPQUFPLEVBQUMsZUFBZSxFQUFFLG9CQUFvQixFQUFFLG9CQUFvQixFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0RyxPQUFPLEVBQUMsTUFBTSxJQUFJLGFBQWEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyxZQUFZLENBQUMsRUFDcEIsQ0FBQyxFQUNELENBQUMsRUFDRCxVQUFVLEdBQUcsS0FBSyxFQUNsQixVQUFVLEdBQUcsS0FBSyxFQUNsQixJQUFJLEVBQ0osVUFBVSxHQUFHLFFBQVEsRUFDckIsc0JBQXNCLEVBQ3RCLGNBQWMsR0FBRyxHQUFHLEdBVXJCO0lBQ0csSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxhQUFhLEVBQUUsVUFBVSxDQUFDLEtBQUssS0FBSyxFQUFFO1FBQ2hFLElBQUksTUFBTSxHQUFHLGFBQWEsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUN6RCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDaEIsTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDNUI7UUFFRCxPQUFPLGVBQWUsQ0FDWCxNQUFNLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxDQUFDO0tBQ3hFO0lBRUQsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakQsSUFBSSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDakQsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUVsQyxNQUFNLFdBQVcsR0FDYixVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sV0FBVyxHQUNiLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFL0QsTUFBTSxXQUFXLEdBQ2IsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLFdBQVcsR0FDYixVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUVqRCxJQUFJLENBQUMsTUFBTSxDQUNQLFdBQVcsS0FBSyxXQUFXLEVBQzNCLEdBQUcsRUFBRSxDQUFDLHdDQUF3QyxXQUFXLFNBQVM7UUFDOUQsR0FBRyxXQUFXLDRCQUE0QixFQUFFLENBQUMsS0FBSyxPQUFPO1FBQ3pELEdBQUcsRUFBRSxDQUFDLEtBQUssbUJBQW1CLFVBQVUsRUFBRTtRQUMxQyxtQkFBbUIsVUFBVSxjQUFjLENBQUMsQ0FBQztJQUVyRCxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQywwQkFBMEIsQ0FDL0QsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxNQUFNLFFBQVEsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUV0RSxNQUFNLEdBQUcsR0FBYSxVQUFVLENBQUMsQ0FBQztRQUM5QixPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN2RCxNQUFNLEdBQUcsR0FBYSxVQUFVLENBQUMsQ0FBQztRQUM5QixPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUV2RCxJQUFJLEtBQWEsQ0FBQztJQUNsQixJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDaEIsS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3RELENBQUMsS0FBSyxDQUFDLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwQyxjQUFjLENBQUMsMEJBQTBCLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNsRTtJQUVELElBQUksdUJBQStCLENBQUM7SUFDcEMsSUFBSSxzQkFBc0IsSUFBSSxJQUFJLEVBQUU7UUFDbEMsdUJBQXVCLEdBQUcsZUFBZSxDQUNyQyxzQkFBc0IsRUFBRSxlQUFlLEVBQUUsY0FBYyxDQUFDLENBQUM7S0FDOUQ7SUFFRCxNQUFNLElBQUksR0FBRyxDQUFDLEVBQVksRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUM3QyxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ25DLHlEQUF5RDtRQUN6RCwwRUFBMEU7UUFDMUUsZ0JBQWdCO1FBQ2hCLE1BQU0sWUFBWSxHQUNkLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM5RCxJQUFJLElBQVksQ0FBQztRQUNqQixJQUFJLElBQVksQ0FBQztRQUVqQixJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQzlCLElBQUksR0FBRyxhQUFhLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckQsSUFBSSxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN0RDthQUFNLElBQUksQ0FBQyxVQUFVLElBQUksVUFBVSxFQUFFO1lBQ3BDLElBQUksR0FBRyxhQUFhLENBQUMsWUFBWSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDdEQsSUFBSSxHQUFHLGFBQWEsQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN0RDthQUFNLElBQUksVUFBVSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3BDLElBQUksR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDckQsSUFBSSxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN2RDthQUFNO1lBQ0wsSUFBSSxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNwRCxJQUFJLEdBQUcsYUFBYSxDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2hCLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztZQUMxRCxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0wsT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNyQjtJQUNILENBQUMsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUF1QjtRQUNqQyxDQUFDLEVBQUUsR0FBRztRQUNOLENBQUMsRUFBRSxHQUFHO1FBQ04sSUFBSSxFQUFFLEtBQUs7UUFDWCxzQkFBc0IsRUFBRSx1QkFBdUI7S0FDaEQsQ0FBQztJQUNGLE1BQU0sS0FBSyxHQUNQLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFDLENBQUM7SUFFekQseUVBQXlFO0lBQ3pFLG9FQUFvRTtJQUNwRSxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDaEIsTUFBTSxRQUFRLEdBQ1YsVUFBVSxDQUFDLENBQUMsR0FBYSxFQUFFLEdBQWEsRUFBRSxJQUFrQixFQUFFLEVBQUU7WUFDOUQsTUFBTSxHQUFHO1lBQ0wsMERBQTBEO1lBQzFELE1BQU0sQ0FBQyxTQUFTLENBQ1osWUFBWSxFQUFFLE1BQThCLEVBQzVDLEtBQTJCLENBQVcsQ0FBQztZQUUvQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFFdEIsT0FBTyxFQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNQLE9BQU8sUUFBUSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUMzQjtTQUFNO1FBQ0wsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQy9CLENBQUMsR0FBYSxFQUFFLEdBQWEsRUFBRSxLQUFhLEVBQUUsSUFBa0IsRUFBRSxFQUFFO1lBQ2xFLE1BQU0sR0FBRztZQUNMLDBEQUEwRDtZQUMxRCxNQUFNLENBQUMsU0FBUyxDQUNaLFlBQVksRUFBRSxNQUE4QixFQUM1QyxLQUEyQixDQUFXLENBQUM7WUFFL0MsSUFBSSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUU3QixPQUFPLEVBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBQyxDQUFDO1FBQ3pELENBQUMsQ0FBQyxDQUFDO1FBRVAsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzFDO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsRUFBQyxZQUFZLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7Y3VzdG9tR3JhZH0gZnJvbSAnLi4vLi4vZ3JhZGllbnRzJztcbmltcG9ydCB7X0Z1c2VkTWF0TXVsLCBfRnVzZWRNYXRNdWxBdHRycywgX0Z1c2VkTWF0TXVsSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uLy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yM0R9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge0dyYWRTYXZlRnVuYywgTmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge21ha2VUeXBlc01hdGNofSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbCc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcblxuaW1wb3J0IHthZGR9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuLi9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge0FjdGl2YXRpb259IGZyb20gJy4uL2Z1c2VkX3R5cGVzJztcbmltcG9ydCB7YXBwbHlBY3RpdmF0aW9uLCBnZXRGdXNlZEJpYXNHcmFkaWVudCwgZ2V0RnVzZWREeUFjdGl2YXRpb24sIHNob3VsZEZ1c2V9IGZyb20gJy4uL2Z1c2VkX3V0aWwnO1xuaW1wb3J0IHttYXRNdWwgYXMgdW5mdXNlZE1hdE11bH0gZnJvbSAnLi4vbWF0X211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9yZXNoYXBlJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdHdvIG1hdHJpY2VzIHdpdGggb3B0aW9uYWwgYWN0aXZhdGlvbiBhbmQgYmlhcy5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYSA9IHRmLnRlbnNvcjJkKFstMSwgLTJdLCBbMSwgMl0pO1xuICogY29uc3QgYiA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqIGNvbnN0IGJpYXMgPSB0Zi50ZW5zb3IyZChbMSwgMl0sIFsxLCAyXSk7XG4gKlxuICogdGYuZnVzZWQubWF0TXVsKHthLCBiLCBiaWFzLCBhY3RpdmF0aW9uOiAncmVsdSd9KS5wcmludCgpO1xuICogYGBgXG4gKlxuICogQHBhcmFtIG9iaiBBbiBvYmplY3Qgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAtIGBhYCBGaXJzdCBtYXRyaXggaW4gZG90IHByb2R1Y3Qgb3BlcmF0aW9uLlxuICogLSBgYmAgU2Vjb25kIG1hdHJpeCBpbiBkb3QgcHJvZHVjdCBvcGVyYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VBYCBJZiB0cnVlLCBgYWAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGB0cmFuc3Bvc2VCYCBJZiB0cnVlLCBgYmAgaXMgdHJhbnNwb3NlZCBiZWZvcmUgbXVsdGlwbGljYXRpb24uXG4gKiAtIGBiaWFzYCBNYXRyaXggdG8gYmUgYWRkZWQgdG8gdGhlIHJlc3VsdC5cbiAqIC0gYGFjdGl2YXRpb25gIE5hbWUgb2YgYWN0aXZhdGlvbiBrZXJuZWwgKGRlZmF1bHRzIHRvIGBsaW5lYXJgKS5cbiAqIC0gYHByZWx1QWN0aXZhdGlvbldlaWdodHNgIFRlbnNvciBvZiBwcmVsdSB3ZWlnaHRzLlxuICogLSBgbGVha3lyZWx1QWxwaGFgIEFscGhhIG9mIGxlYWt5cmVsdS5cbiAqL1xuZnVuY3Rpb24gZnVzZWRNYXRNdWxfKHtcbiAgYSxcbiAgYixcbiAgdHJhbnNwb3NlQSA9IGZhbHNlLFxuICB0cmFuc3Bvc2VCID0gZmFsc2UsXG4gIGJpYXMsXG4gIGFjdGl2YXRpb24gPSAnbGluZWFyJyxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgbGVha3lyZWx1QWxwaGEgPSAwLjIsXG59OiB7XG4gIGE6IFRlbnNvcnxUZW5zb3JMaWtlLFxuICBiOiBUZW5zb3J8VGVuc29yTGlrZSxcbiAgdHJhbnNwb3NlQT86IGJvb2xlYW4sXG4gIHRyYW5zcG9zZUI/OiBib29sZWFuLFxuICBiaWFzPzogVGVuc29yfFRlbnNvckxpa2UsXG4gIGFjdGl2YXRpb24/OiBBY3RpdmF0aW9uLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzPzogVGVuc29yXG4gIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyXG59KTogVGVuc29yIHtcbiAgICBpZiAoc2hvdWxkRnVzZShFTkdJTkUuc3RhdGUuZ3JhZGllbnREZXB0aCwgYWN0aXZhdGlvbikgPT09IGZhbHNlKSB7XG4gICAgICBsZXQgcmVzdWx0ID0gdW5mdXNlZE1hdE11bChhLCBiLCB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCKTtcbiAgICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgICAgcmVzdWx0ID0gYWRkKHJlc3VsdCwgYmlhcyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhcHBseUFjdGl2YXRpb24oXG4gICAgICAgICAgICAgICAgIHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cblxuICAgIGxldCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdmdXNlZCBtYXRNdWwnKTtcbiAgICBsZXQgJGIgPSBjb252ZXJ0VG9UZW5zb3IoYiwgJ2InLCAnZnVzZWQgbWF0TXVsJyk7XG4gICAgWyRhLCAkYl0gPSBtYWtlVHlwZXNNYXRjaCgkYSwgJGIpO1xuXG4gICAgY29uc3QgaW5uZXJTaGFwZUEgPVxuICAgICAgICB0cmFuc3Bvc2VBID8gJGEuc2hhcGVbJGEucmFuayAtIDJdIDogJGEuc2hhcGVbJGEucmFuayAtIDFdO1xuICAgIGNvbnN0IGlubmVyU2hhcGVCID1cbiAgICAgICAgdHJhbnNwb3NlQiA/ICRiLnNoYXBlWyRiLnJhbmsgLSAxXSA6ICRiLnNoYXBlWyRiLnJhbmsgLSAyXTtcblxuICAgIGNvbnN0IG91dGVyU2hhcGVBID1cbiAgICAgICAgdHJhbnNwb3NlQSA/ICRhLnNoYXBlWyRhLnJhbmsgLSAxXSA6ICRhLnNoYXBlWyRhLnJhbmsgLSAyXTtcbiAgICBjb25zdCBvdXRlclNoYXBlQiA9XG4gICAgICAgIHRyYW5zcG9zZUIgPyAkYi5zaGFwZVskYi5yYW5rIC0gMl0gOiAkYi5zaGFwZVskYi5yYW5rIC0gMV07XG5cbiAgICBjb25zdCBvdXRlckRpbXNBID0gJGEuc2hhcGUuc2xpY2UoMCwgLTIpO1xuICAgIGNvbnN0IG91dGVyRGltc0IgPSAkYi5zaGFwZS5zbGljZSgwLCAtMik7XG4gICAgY29uc3QgYmF0Y2hEaW1BID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0EpO1xuICAgIGNvbnN0IGJhdGNoRGltQiA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNCKTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBmdXNlZCBtYXRNdWw6IGlubmVyIHNoYXBlcyAoJHtpbm5lclNoYXBlQX0pIGFuZCAoYCArXG4gICAgICAgICAgICBgJHtpbm5lclNoYXBlQn0pIG9mIFRlbnNvcnMgd2l0aCBzaGFwZXMgJHskYS5zaGFwZX0gYW5kIGAgK1xuICAgICAgICAgICAgYCR7JGIuc2hhcGV9IGFuZCB0cmFuc3Bvc2VBPSR7dHJhbnNwb3NlQX1gICtcbiAgICAgICAgICAgIGAgYW5kIHRyYW5zcG9zZUI9JHt0cmFuc3Bvc2VCfSBtdXN0IG1hdGNoLmApO1xuXG4gICAgY29uc3Qgb3V0U2hhcGVPdXRlckRpbXMgPSBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShcbiAgICAgICAgJGEuc2hhcGUuc2xpY2UoMCwgLTIpLCAkYi5zaGFwZS5zbGljZSgwLCAtMikpO1xuICAgIGNvbnN0IG91dFNoYXBlID0gb3V0U2hhcGVPdXRlckRpbXMuY29uY2F0KFtvdXRlclNoYXBlQSwgb3V0ZXJTaGFwZUJdKTtcblxuICAgIGNvbnN0IGEzRDogVGVuc29yM0QgPSB0cmFuc3Bvc2VBID9cbiAgICAgICAgcmVzaGFwZSgkYSwgW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSkgOlxuICAgICAgICByZXNoYXBlKCRhLCBbYmF0Y2hEaW1BLCBvdXRlclNoYXBlQSwgaW5uZXJTaGFwZUFdKTtcbiAgICBjb25zdCBiM0Q6IFRlbnNvcjNEID0gdHJhbnNwb3NlQiA/XG4gICAgICAgIHJlc2hhcGUoJGIsIFtiYXRjaERpbUIsIG91dGVyU2hhcGVCLCBpbm5lclNoYXBlQl0pIDpcbiAgICAgICAgcmVzaGFwZSgkYiwgW2JhdGNoRGltQiwgaW5uZXJTaGFwZUIsIG91dGVyU2hhcGVCXSk7XG5cbiAgICBsZXQgJGJpYXM6IFRlbnNvcjtcbiAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAkYmlhcyA9IGNvbnZlcnRUb1RlbnNvcihiaWFzLCAnYmlhcycsICdmdXNlZCBtYXRNdWwnKTtcbiAgICAgIFskYmlhc10gPSBtYWtlVHlwZXNNYXRjaCgkYmlhcywgJGEpO1xuXG4gICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShvdXRTaGFwZSwgJGJpYXMuc2hhcGUpO1xuICAgIH1cblxuICAgIGxldCAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogVGVuc29yO1xuICAgIGlmIChwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGwpIHtcbiAgICAgICRwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gY29udmVydFRvVGVuc29yKFxuICAgICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsICdwcmVsdSB3ZWlnaHRzJywgJ2Z1c2VkIG1hdE11bCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGdyYWQgPSAoZHk6IFRlbnNvcjNELCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICAgIGNvbnN0IFthM0QsIGIzRCwgeSwgJGJpYXNdID0gc2F2ZWQ7XG4gICAgICAvLyB3ZSByZXNoYXBlIGR5IGJlY2F1c2UgdGhlIHJlc3VsdCBvZiB0aGUgZm9yd2FyZCBpcyBub3RcbiAgICAgIC8vIG5lY2Vzc2FyaWx5IGdvaW5nIHRvIGJlIGEgM2QgdGVuc29yIGR1ZSB0byBhIHJlc2hhcGUgZG9uZSBhdCB0aGUgZW5kIG9mXG4gICAgICAvLyB0aGUgY3VzdG9tT3AuXG4gICAgICBjb25zdCBkeUFjdGl2YXRpb24gPVxuICAgICAgICAgIGdldEZ1c2VkRHlBY3RpdmF0aW9uKHJlc2hhcGUoZHksIHkuc2hhcGUpLCB5LCBhY3RpdmF0aW9uKTtcbiAgICAgIGxldCBhRGVyOiBUZW5zb3I7XG4gICAgICBsZXQgYkRlcjogVGVuc29yO1xuXG4gICAgICBpZiAoIXRyYW5zcG9zZUEgJiYgIXRyYW5zcG9zZUIpIHtcbiAgICAgICAgYURlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBiM0QsIGZhbHNlLCB0cnVlKTtcbiAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoYTNELCBkeUFjdGl2YXRpb24sIHRydWUsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAoIXRyYW5zcG9zZUEgJiYgdHJhbnNwb3NlQikge1xuICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChkeUFjdGl2YXRpb24sIGIzRCwgZmFsc2UsIGZhbHNlKTtcbiAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBhM0QsIHRydWUsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSBpZiAodHJhbnNwb3NlQSAmJiAhdHJhbnNwb3NlQikge1xuICAgICAgICBhRGVyID0gdW5mdXNlZE1hdE11bChiM0QsIGR5QWN0aXZhdGlvbiwgZmFsc2UsIHRydWUpO1xuICAgICAgICBiRGVyID0gdW5mdXNlZE1hdE11bChhM0QsIGR5QWN0aXZhdGlvbiwgZmFsc2UsIGZhbHNlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFEZXIgPSB1bmZ1c2VkTWF0TXVsKGIzRCwgZHlBY3RpdmF0aW9uLCB0cnVlLCB0cnVlKTtcbiAgICAgICAgYkRlciA9IHVuZnVzZWRNYXRNdWwoZHlBY3RpdmF0aW9uLCBhM0QsIHRydWUsIHRydWUpO1xuICAgICAgfVxuXG4gICAgICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IGJpYXNEZXIgPSBnZXRGdXNlZEJpYXNHcmFkaWVudCgkYmlhcywgZHlBY3RpdmF0aW9uKTtcbiAgICAgICAgcmV0dXJuIFthRGVyLCBiRGVyLCBiaWFzRGVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbYURlciwgYkRlcl07XG4gICAgICB9XG4gICAgfTtcblxuICAgIGNvbnN0IGlucHV0czogX0Z1c2VkTWF0TXVsSW5wdXRzID0ge1xuICAgICAgYTogYTNELFxuICAgICAgYjogYjNELFxuICAgICAgYmlhczogJGJpYXMsXG4gICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzOiAkcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c1xuICAgIH07XG4gICAgY29uc3QgYXR0cnM6IF9GdXNlZE1hdE11bEF0dHJzID1cbiAgICAgICAge3RyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhfTtcblxuICAgIC8vIERlcGVuZGluZyBvbiB0aGUgdGhlIHBhcmFtcyBwYXNzZWQgaW4gd2Ugd2lsbCBoYXZlIGRpZmZlcmVudCBudW1iZXIgb2ZcbiAgICAvLyBpbnB1dHMgYW5kIHRodXMgYSBhIGRpZmZlcmVudCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGdyYWRpZW50LlxuICAgIGlmIChiaWFzID09IG51bGwpIHtcbiAgICAgIGNvbnN0IGN1c3RvbU9wID1cbiAgICAgICAgICBjdXN0b21HcmFkKChhM0Q6IFRlbnNvcjNELCBiM0Q6IFRlbnNvcjNELCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlcyA9XG4gICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICAgICAgICAgIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICAgIF9GdXNlZE1hdE11bCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFRlbnNvcjtcblxuICAgICAgICAgICAgc2F2ZShbYTNELCBiM0QsIHJlc10pO1xuXG4gICAgICAgICAgICByZXR1cm4ge3ZhbHVlOiByZXNoYXBlKHJlcywgb3V0U2hhcGUpLCBncmFkRnVuYzogZ3JhZH07XG4gICAgICAgICAgfSk7XG4gICAgICByZXR1cm4gY3VzdG9tT3AoYTNELCBiM0QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBjdXN0b21PcFdpdGhCaWFzID0gY3VzdG9tR3JhZChcbiAgICAgICAgICAoYTNEOiBUZW5zb3IzRCwgYjNEOiBUZW5zb3IzRCwgJGJpYXM6IFRlbnNvciwgc2F2ZTogR3JhZFNhdmVGdW5jKSA9PiB7XG4gICAgICAgICAgICBjb25zdCByZXMgPVxuICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgICAgICAgICBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgICBfRnVzZWRNYXRNdWwsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUZW5zb3I7XG5cbiAgICAgICAgICAgIHNhdmUoW2EzRCwgYjNELCByZXMsICRiaWFzXSk7XG5cbiAgICAgICAgICAgIHJldHVybiB7dmFsdWU6IHJlc2hhcGUocmVzLCBvdXRTaGFwZSksIGdyYWRGdW5jOiBncmFkfTtcbiAgICAgICAgICB9KTtcblxuICAgICAgcmV0dXJuIGN1c3RvbU9wV2l0aEJpYXMoYTNELCBiM0QsICRiaWFzKTtcbiAgICB9XG4gIH1cblxuICBleHBvcnQgY29uc3QgbWF0TXVsID0gb3Aoe2Z1c2VkTWF0TXVsX30pO1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { conv2d } from './fused/conv2d';\nimport { depthwiseConv2d } from './fused/depthwise_conv2d';\nimport { matMul } from './fused/mat_mul';\nexport { conv2d, depthwiseConv2d, matMul };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzZWRfb3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvZnVzZWRfb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0QyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBR3ZDLE9BQU8sRUFBYSxNQUFNLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2NvbnYyZH0gZnJvbSAnLi9mdXNlZC9jb252MmQnO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmR9IGZyb20gJy4vZnVzZWQvZGVwdGh3aXNlX2NvbnYyZCc7XG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi9mdXNlZC9tYXRfbXVsJztcbmltcG9ydCB7QWN0aXZhdGlvbn0gZnJvbSAnLi9mdXNlZF90eXBlcyc7XG5cbmV4cG9ydCB7QWN0aXZhdGlvbiwgY29udjJkLCBkZXB0aHdpc2VDb252MmQsIG1hdE11bH07XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { op } from '../operation';\nimport { cosineWindow } from '../signal_ops_util';\n/**\n * Generate a hamming window.\n *\n * See: https://en.wikipedia.org/wiki/Window_function#Hann_and_Hamming_windows\n *\n * ```js\n * tf.signal.hammingWindow(10).print();\n * ```\n * @param The length of window\n *\n * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n */\nfunction hammingWindow_(windowLength) {\n    return cosineWindow(windowLength, 0.54, 0.46);\n}\nexport const hammingWindow = op({ hammingWindow_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFtbWluZ193aW5kb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zaWduYWwvaGFtbWluZ193aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxZQUFvQjtJQUMxQyxPQUFPLFlBQVksQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge2Nvc2luZVdpbmRvd30gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIGhhbW1pbmcgd2luZG93LlxuICpcbiAqIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2luZG93X2Z1bmN0aW9uI0hhbm5fYW5kX0hhbW1pbmdfd2luZG93c1xuICpcbiAqIGBgYGpzXG4gKiB0Zi5zaWduYWwuaGFtbWluZ1dpbmRvdygxMCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIFRoZSBsZW5ndGggb2Ygd2luZG93XG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gaGFtbWluZ1dpbmRvd18od2luZG93TGVuZ3RoOiBudW1iZXIpOiBUZW5zb3IxRCB7XG4gIHJldHVybiBjb3NpbmVXaW5kb3cod2luZG93TGVuZ3RoLCAwLjU0LCAwLjQ2KTtcbn1cbmV4cG9ydCBjb25zdCBoYW1taW5nV2luZG93ID0gb3Aoe2hhbW1pbmdXaW5kb3dffSk7XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { op } from '../operation';\nimport { cosineWindow } from '../signal_ops_util';\n/**\n * Generate a Hann window.\n *\n * See: https://en.wikipedia.org/wiki/Window_function#Hann_and_Hamming_windows\n *\n * ```js\n * tf.signal.hannWindow(10).print();\n * ```\n * @param The length of window\n *\n * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n */\nfunction hannWindow_(windowLength) {\n    return cosineWindow(windowLength, 0.5, 0.5);\n}\nexport const hannWindow = op({ hannWindow_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFubl93aW5kb3cuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zaWduYWwvaGFubl93aW5kb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFaEQ7Ozs7Ozs7Ozs7O0dBV0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxZQUFvQjtJQUN2QyxPQUFPLFlBQVksQ0FBQyxZQUFZLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsRUFBRSxDQUFDLEVBQUMsV0FBVyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge2Nvc2luZVdpbmRvd30gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcblxuLyoqXG4gKiBHZW5lcmF0ZSBhIEhhbm4gd2luZG93LlxuICpcbiAqIFNlZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvV2luZG93X2Z1bmN0aW9uI0hhbm5fYW5kX0hhbW1pbmdfd2luZG93c1xuICpcbiAqIGBgYGpzXG4gKiB0Zi5zaWduYWwuaGFubldpbmRvdygxMCkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIFRoZSBsZW5ndGggb2Ygd2luZG93XG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gaGFubldpbmRvd18od2luZG93TGVuZ3RoOiBudW1iZXIpOiBUZW5zb3IxRCB7XG4gIHJldHVybiBjb3NpbmVXaW5kb3cod2luZG93TGVuZ3RoLCAwLjUsIDAuNSk7XG59XG5cbmV4cG9ydCBjb25zdCBoYW5uV2luZG93ID0gb3Aoe2hhbm5XaW5kb3dffSk7XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { concat } from '../concat';\nimport { fill } from '../fill';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\nimport { slice } from '../slice';\nimport { tensor2d } from '../tensor2d';\n/**\n * Expands input into frames of frameLength.\n * Slides a window size with frameStep.\n *\n * ```js\n * tf.signal.frame([1, 2, 3], 2, 1).print();\n * ```\n * @param signal The input tensor to be expanded\n * @param frameLength Length of each frame\n * @param frameStep The frame hop size in samples.\n * @param padEnd Whether to pad the end of signal with padValue.\n * @param padValue A number to use where the input signal does\n *     not exist when padEnd is True.\n *\n * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n */\nfunction frame_(signal, frameLength, frameStep, padEnd = false, padValue = 0) {\n    let start = 0;\n    const output = [];\n    while (start + frameLength <= signal.size) {\n        output.push(slice(signal, start, frameLength));\n        start += frameStep;\n    }\n    if (padEnd) {\n        while (start < signal.size) {\n            const padLen = (start + frameLength) - signal.size;\n            const pad = concat([\n                slice(signal, start, frameLength - padLen), fill([padLen], padValue)\n            ]);\n            output.push(pad);\n            start += frameStep;\n        }\n    }\n    if (output.length === 0) {\n        return tensor2d([], [0, frameLength]);\n    }\n    return reshape(concat(output), [output.length, frameLength]);\n}\nexport const frame = op({ frame_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zaWduYWwvZnJhbWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsU0FBUyxNQUFNLENBQ1gsTUFBZ0IsRUFBRSxXQUFtQixFQUFFLFNBQWlCLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFDeEUsUUFBUSxHQUFHLENBQUM7SUFDZCxJQUFJLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDZCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsT0FBTyxLQUFLLEdBQUcsV0FBVyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUU7UUFDekMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9DLEtBQUssSUFBSSxTQUFTLENBQUM7S0FDcEI7SUFFRCxJQUFJLE1BQU0sRUFBRTtRQUNWLE9BQU8sS0FBSyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUU7WUFDMUIsTUFBTSxNQUFNLEdBQUcsQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQztZQUNuRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7Z0JBQ2pCLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsR0FBRyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUM7YUFDckUsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNqQixLQUFLLElBQUksU0FBUyxDQUFDO1NBQ3BCO0tBQ0Y7SUFFRCxJQUFJLE1BQU0sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0tBQ3ZDO0lBRUQsT0FBTyxPQUFPLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4uL2NvbmNhdCc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4uL2ZpbGwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuLi9zbGljZSc7XG5pbXBvcnQge3RlbnNvcjJkfSBmcm9tICcuLi90ZW5zb3IyZCc7XG5cbi8qKlxuICogRXhwYW5kcyBpbnB1dCBpbnRvIGZyYW1lcyBvZiBmcmFtZUxlbmd0aC5cbiAqIFNsaWRlcyBhIHdpbmRvdyBzaXplIHdpdGggZnJhbWVTdGVwLlxuICpcbiAqIGBgYGpzXG4gKiB0Zi5zaWduYWwuZnJhbWUoWzEsIDIsIDNdLCAyLCAxKS5wcmludCgpO1xuICogYGBgXG4gKiBAcGFyYW0gc2lnbmFsIFRoZSBpbnB1dCB0ZW5zb3IgdG8gYmUgZXhwYW5kZWRcbiAqIEBwYXJhbSBmcmFtZUxlbmd0aCBMZW5ndGggb2YgZWFjaCBmcmFtZVxuICogQHBhcmFtIGZyYW1lU3RlcCBUaGUgZnJhbWUgaG9wIHNpemUgaW4gc2FtcGxlcy5cbiAqIEBwYXJhbSBwYWRFbmQgV2hldGhlciB0byBwYWQgdGhlIGVuZCBvZiBzaWduYWwgd2l0aCBwYWRWYWx1ZS5cbiAqIEBwYXJhbSBwYWRWYWx1ZSBBIG51bWJlciB0byB1c2Ugd2hlcmUgdGhlIGlucHV0IHNpZ25hbCBkb2VzXG4gKiAgICAgbm90IGV4aXN0IHdoZW4gcGFkRW5kIGlzIFRydWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU2lnbmFsJywgbmFtZXNwYWNlOiAnc2lnbmFsJ31cbiAqL1xuZnVuY3Rpb24gZnJhbWVfKFxuICAgIHNpZ25hbDogVGVuc29yMUQsIGZyYW1lTGVuZ3RoOiBudW1iZXIsIGZyYW1lU3RlcDogbnVtYmVyLCBwYWRFbmQgPSBmYWxzZSxcbiAgICBwYWRWYWx1ZSA9IDApOiBUZW5zb3Ige1xuICBsZXQgc3RhcnQgPSAwO1xuICBjb25zdCBvdXRwdXQ6IFRlbnNvcltdID0gW107XG4gIHdoaWxlIChzdGFydCArIGZyYW1lTGVuZ3RoIDw9IHNpZ25hbC5zaXplKSB7XG4gICAgb3V0cHV0LnB1c2goc2xpY2Uoc2lnbmFsLCBzdGFydCwgZnJhbWVMZW5ndGgpKTtcbiAgICBzdGFydCArPSBmcmFtZVN0ZXA7XG4gIH1cblxuICBpZiAocGFkRW5kKSB7XG4gICAgd2hpbGUgKHN0YXJ0IDwgc2lnbmFsLnNpemUpIHtcbiAgICAgIGNvbnN0IHBhZExlbiA9IChzdGFydCArIGZyYW1lTGVuZ3RoKSAtIHNpZ25hbC5zaXplO1xuICAgICAgY29uc3QgcGFkID0gY29uY2F0KFtcbiAgICAgICAgc2xpY2Uoc2lnbmFsLCBzdGFydCwgZnJhbWVMZW5ndGggLSBwYWRMZW4pLCBmaWxsKFtwYWRMZW5dLCBwYWRWYWx1ZSlcbiAgICAgIF0pO1xuICAgICAgb3V0cHV0LnB1c2gocGFkKTtcbiAgICAgIHN0YXJ0ICs9IGZyYW1lU3RlcDtcbiAgICB9XG4gIH1cblxuICBpZiAob3V0cHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0ZW5zb3IyZChbXSwgWzAsIGZyYW1lTGVuZ3RoXSk7XG4gIH1cblxuICByZXR1cm4gcmVzaGFwZShjb25jYXQob3V0cHV0KSwgW291dHB1dC5sZW5ndGgsIGZyYW1lTGVuZ3RoXSk7XG59XG5leHBvcnQgY29uc3QgZnJhbWUgPSBvcCh7ZnJhbWVffSk7XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { enclosingPowerOfTwo } from '../signal_ops_util';\nimport { rfft } from '../spectral/rfft';\nimport { frame } from './frame';\nimport { hannWindow } from './hann_window';\n/**\n * Computes the Short-time Fourier Transform of signals\n * See: https://en.wikipedia.org/wiki/Short-time_Fourier_transform\n *\n * ```js\n * const input = tf.tensor1d([1, 1, 1, 1, 1])\n * tf.signal.stft(input, 3, 1).print();\n * ```\n * @param signal 1-dimensional real value tensor.\n * @param frameLength The window length of samples.\n * @param frameStep The number of samples to step.\n * @param fftLength The size of the FFT to apply.\n * @param windowFn A callable that takes a window length and returns 1-d tensor.\n *\n * @doc {heading: 'Operations', subheading: 'Signal', namespace: 'signal'}\n */\nfunction stft_(signal, frameLength, frameStep, fftLength, windowFn = hannWindow) {\n    if (fftLength == null) {\n        fftLength = enclosingPowerOfTwo(frameLength);\n    }\n    const framedSignal = frame(signal, frameLength, frameStep);\n    const windowedSignal = mul(framedSignal, windowFn(frameLength));\n    return rfft(windowedSignal, fftLength);\n}\nexport const stft = op({ stft_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NpZ25hbC9zdGZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFdEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsS0FBSyxDQUNWLE1BQWdCLEVBQUUsV0FBbUIsRUFBRSxTQUFpQixFQUN4RCxTQUFrQixFQUNsQixXQUF5QyxVQUFVO0lBQ3JELElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixTQUFTLEdBQUcsbUJBQW1CLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDOUM7SUFDRCxNQUFNLFlBQVksR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMzRCxNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2hFLE9BQU8sSUFBSSxDQUFDLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUN6QyxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEtBQUssRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7ZW5jbG9zaW5nUG93ZXJPZlR3b30gZnJvbSAnLi4vc2lnbmFsX29wc191dGlsJztcbmltcG9ydCB7cmZmdH0gZnJvbSAnLi4vc3BlY3RyYWwvcmZmdCc7XG5cbmltcG9ydCB7ZnJhbWV9IGZyb20gJy4vZnJhbWUnO1xuaW1wb3J0IHtoYW5uV2luZG93fSBmcm9tICcuL2hhbm5fd2luZG93JztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgU2hvcnQtdGltZSBGb3VyaWVyIFRyYW5zZm9ybSBvZiBzaWduYWxzXG4gKiBTZWU6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1Nob3J0LXRpbWVfRm91cmllcl90cmFuc2Zvcm1cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQgPSB0Zi50ZW5zb3IxZChbMSwgMSwgMSwgMSwgMV0pXG4gKiB0Zi5zaWduYWwuc3RmdChpbnB1dCwgMywgMSkucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIHNpZ25hbCAxLWRpbWVuc2lvbmFsIHJlYWwgdmFsdWUgdGVuc29yLlxuICogQHBhcmFtIGZyYW1lTGVuZ3RoIFRoZSB3aW5kb3cgbGVuZ3RoIG9mIHNhbXBsZXMuXG4gKiBAcGFyYW0gZnJhbWVTdGVwIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBzdGVwLlxuICogQHBhcmFtIGZmdExlbmd0aCBUaGUgc2l6ZSBvZiB0aGUgRkZUIHRvIGFwcGx5LlxuICogQHBhcmFtIHdpbmRvd0ZuIEEgY2FsbGFibGUgdGhhdCB0YWtlcyBhIHdpbmRvdyBsZW5ndGggYW5kIHJldHVybnMgMS1kIHRlbnNvci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTaWduYWwnLCBuYW1lc3BhY2U6ICdzaWduYWwnfVxuICovXG5mdW5jdGlvbiBzdGZ0XyhcbiAgICBzaWduYWw6IFRlbnNvcjFELCBmcmFtZUxlbmd0aDogbnVtYmVyLCBmcmFtZVN0ZXA6IG51bWJlcixcbiAgICBmZnRMZW5ndGg/OiBudW1iZXIsXG4gICAgd2luZG93Rm46IChsZW5ndGg6IG51bWJlcikgPT4gVGVuc29yMUQgPSBoYW5uV2luZG93KTogVGVuc29yIHtcbiAgaWYgKGZmdExlbmd0aCA9PSBudWxsKSB7XG4gICAgZmZ0TGVuZ3RoID0gZW5jbG9zaW5nUG93ZXJPZlR3byhmcmFtZUxlbmd0aCk7XG4gIH1cbiAgY29uc3QgZnJhbWVkU2lnbmFsID0gZnJhbWUoc2lnbmFsLCBmcmFtZUxlbmd0aCwgZnJhbWVTdGVwKTtcbiAgY29uc3Qgd2luZG93ZWRTaWduYWwgPSBtdWwoZnJhbWVkU2lnbmFsLCB3aW5kb3dGbihmcmFtZUxlbmd0aCkpO1xuICByZXR1cm4gcmZmdCh3aW5kb3dlZFNpZ25hbCwgZmZ0TGVuZ3RoKTtcbn1cbmV4cG9ydCBjb25zdCBzdGZ0ID0gb3Aoe3N0ZnRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { CropAndResize } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\n/**\n * Extracts crops from the input image tensor and resizes them using bilinear\n * sampling or nearest neighbor sampling (possibly with aspect ratio change)\n * to a common output size specified by cropSize.\n *\n * @param image 4d tensor of shape `[batch,imageHeight,imageWidth, depth]`,\n *     where imageHeight and imageWidth must be positive, specifying the\n *     batch of images from which to take crops\n * @param boxes 2d float32 tensor of shape `[numBoxes, 4]`. Each entry is\n *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the normalized\n *     coordinates of the box in the `boxInd[i]`th image in the batch\n * @param boxInd 1d int32 tensor of shape `[numBoxes]` with values in range\n *     `[0, batch)` that specifies the image that the `i`-th box refers to.\n * @param cropSize 1d int32 tensor of 2 elements `[cropHeigh, cropWidth]`\n *     specifying the size to which all crops are resized to.\n * @param method Optional string from `'bilinear' | 'nearest'`,\n *     defaults to bilinear, which specifies the sampling method for resizing\n * @param extrapolationValue A threshold for deciding when to remove boxes based\n *     on score. Defaults to 0.\n * @return A 4D tensor of the shape `[numBoxes,cropHeight,cropWidth,depth]`\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction cropAndResize_(image, boxes, boxInd, cropSize, method = 'bilinear', extrapolationValue = 0) {\n    const $image = convertToTensor(image, 'image', 'cropAndResize');\n    const $boxes = convertToTensor(boxes, 'boxes', 'cropAndResize', 'float32');\n    const $boxInd = convertToTensor(boxInd, 'boxInd', 'cropAndResize', 'int32');\n    const numBoxes = $boxes.shape[0];\n    util.assert($image.rank === 4, () => 'Error in cropAndResize: image must be rank 4,' +\n        `but got rank ${$image.rank}.`);\n    util.assert($boxes.rank === 2 && $boxes.shape[1] === 4, () => `Error in cropAndResize: boxes must be have size [${numBoxes},4] ` +\n        `but had shape ${$boxes.shape}.`);\n    util.assert($boxInd.rank === 1 && $boxInd.shape[0] === numBoxes, () => `Error in cropAndResize: boxInd must be have size [${numBoxes}] ` +\n        `but had shape ${$boxes.shape}.`);\n    util.assert(cropSize.length === 2, () => `Error in cropAndResize: cropSize must be of length 2, but got ` +\n        `length ${cropSize.length}.`);\n    util.assert(cropSize[0] >= 1 && cropSize[1] >= 1, () => `cropSize must be atleast [1,1], but was ${cropSize}`);\n    util.assert(method === 'bilinear' || method === 'nearest', () => `method must be bilinear or nearest, but was ${method}`);\n    const inputs = { image: $image, boxes: $boxes, boxInd: $boxInd };\n    const attrs = { method, extrapolationValue, cropSize };\n    const res = ENGINE.runKernel(CropAndResize, inputs, attrs);\n    return res;\n}\nexport const cropAndResize = op({ cropAndResize_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcF9hbmRfcmVzaXplLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvY3JvcF9hbmRfcmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGFBQWEsRUFBMEMsTUFBTSxvQkFBb0IsQ0FBQztBQUkxRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsY0FBYyxDQUNuQixLQUEwQixFQUMxQixLQUEwQixFQUMxQixNQUEyQixFQUMzQixRQUEwQixFQUMxQixTQUErQixVQUFVLEVBQ3pDLGtCQUFrQixHQUFHLENBQUM7SUFFeEIsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1RSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWpDLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLCtDQUErQztRQUNqRCxnQkFBZ0IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFDMUMsR0FBRyxFQUFFLENBQUMsb0RBQW9ELFFBQVEsTUFBTTtRQUNwRSxpQkFBaUIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFDbkQsR0FBRyxFQUFFLENBQUMscURBQXFELFFBQVEsSUFBSTtRQUNuRSxpQkFBaUIsTUFBTSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUM7SUFDMUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDckIsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLFVBQVUsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDdEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQ3BDLEdBQUcsRUFBRSxDQUFDLDJDQUEyQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ2pFLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxLQUFLLFVBQVUsSUFBSSxNQUFNLEtBQUssU0FBUyxFQUM3QyxHQUFHLEVBQUUsQ0FBQywrQ0FBK0MsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUVuRSxNQUFNLE1BQU0sR0FDYyxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDMUUsTUFBTSxLQUFLLEdBQXVCLEVBQUMsTUFBTSxFQUFFLGtCQUFrQixFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ3pFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ3hCLGFBQWEsRUFBRSxNQUE4QixFQUM3QyxLQUEyQixDQUFDLENBQUM7SUFDakMsT0FBTyxHQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxFQUFFLENBQUMsRUFBQyxjQUFjLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7Q3JvcEFuZFJlc2l6ZSwgQ3JvcEFuZFJlc2l6ZUF0dHJzLCBDcm9wQW5kUmVzaXplSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uLy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcjFELCBUZW5zb3IyRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi8uLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogRXh0cmFjdHMgY3JvcHMgZnJvbSB0aGUgaW5wdXQgaW1hZ2UgdGVuc29yIGFuZCByZXNpemVzIHRoZW0gdXNpbmcgYmlsaW5lYXJcbiAqIHNhbXBsaW5nIG9yIG5lYXJlc3QgbmVpZ2hib3Igc2FtcGxpbmcgKHBvc3NpYmx5IHdpdGggYXNwZWN0IHJhdGlvIGNoYW5nZSlcbiAqIHRvIGEgY29tbW9uIG91dHB1dCBzaXplIHNwZWNpZmllZCBieSBjcm9wU2l6ZS5cbiAqXG4gKiBAcGFyYW0gaW1hZ2UgNGQgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2gsaW1hZ2VIZWlnaHQsaW1hZ2VXaWR0aCwgZGVwdGhdYCxcbiAqICAgICB3aGVyZSBpbWFnZUhlaWdodCBhbmQgaW1hZ2VXaWR0aCBtdXN0IGJlIHBvc2l0aXZlLCBzcGVjaWZ5aW5nIHRoZVxuICogICAgIGJhdGNoIG9mIGltYWdlcyBmcm9tIHdoaWNoIHRvIHRha2UgY3JvcHNcbiAqIEBwYXJhbSBib3hlcyAyZCBmbG9hdDMyIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBub3JtYWxpemVkXG4gKiAgICAgY29vcmRpbmF0ZXMgb2YgdGhlIGJveCBpbiB0aGUgYGJveEluZFtpXWB0aCBpbWFnZSBpbiB0aGUgYmF0Y2hcbiAqIEBwYXJhbSBib3hJbmQgMWQgaW50MzIgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXNdYCB3aXRoIHZhbHVlcyBpbiByYW5nZVxuICogICAgIGBbMCwgYmF0Y2gpYCB0aGF0IHNwZWNpZmllcyB0aGUgaW1hZ2UgdGhhdCB0aGUgYGlgLXRoIGJveCByZWZlcnMgdG8uXG4gKiBAcGFyYW0gY3JvcFNpemUgMWQgaW50MzIgdGVuc29yIG9mIDIgZWxlbWVudHMgYFtjcm9wSGVpZ2gsIGNyb3BXaWR0aF1gXG4gKiAgICAgc3BlY2lmeWluZyB0aGUgc2l6ZSB0byB3aGljaCBhbGwgY3JvcHMgYXJlIHJlc2l6ZWQgdG8uXG4gKiBAcGFyYW0gbWV0aG9kIE9wdGlvbmFsIHN0cmluZyBmcm9tIGAnYmlsaW5lYXInIHwgJ25lYXJlc3QnYCxcbiAqICAgICBkZWZhdWx0cyB0byBiaWxpbmVhciwgd2hpY2ggc3BlY2lmaWVzIHRoZSBzYW1wbGluZyBtZXRob2QgZm9yIHJlc2l6aW5nXG4gKiBAcGFyYW0gZXh0cmFwb2xhdGlvblZhbHVlIEEgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGVuIHRvIHJlbW92ZSBib3hlcyBiYXNlZFxuICogICAgIG9uIHNjb3JlLiBEZWZhdWx0cyB0byAwLlxuICogQHJldHVybiBBIDREIHRlbnNvciBvZiB0aGUgc2hhcGUgYFtudW1Cb3hlcyxjcm9wSGVpZ2h0LGNyb3BXaWR0aCxkZXB0aF1gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiBjcm9wQW5kUmVzaXplXyhcbiAgICBpbWFnZTogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgICBib3hlczogVGVuc29yMkR8VGVuc29yTGlrZSxcbiAgICBib3hJbmQ6IFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgY3JvcFNpemU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgbWV0aG9kOiAnYmlsaW5lYXInfCduZWFyZXN0JyA9ICdiaWxpbmVhcicsXG4gICAgZXh0cmFwb2xhdGlvblZhbHVlID0gMCxcbiAgICApOiBUZW5zb3I0RCB7XG4gIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2Nyb3BBbmRSZXNpemUnKTtcbiAgY29uc3QgJGJveGVzID0gY29udmVydFRvVGVuc29yKGJveGVzLCAnYm94ZXMnLCAnY3JvcEFuZFJlc2l6ZScsICdmbG9hdDMyJyk7XG4gIGNvbnN0ICRib3hJbmQgPSBjb252ZXJ0VG9UZW5zb3IoYm94SW5kLCAnYm94SW5kJywgJ2Nyb3BBbmRSZXNpemUnLCAnaW50MzInKTtcblxuICBjb25zdCBudW1Cb3hlcyA9ICRib3hlcy5zaGFwZVswXTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZS5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGNyb3BBbmRSZXNpemU6IGltYWdlIG11c3QgYmUgcmFuayA0LCcgK1xuICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGJveGVzLnJhbmsgPT09IDIgJiYgJGJveGVzLnNoYXBlWzFdID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNyb3BBbmRSZXNpemU6IGJveGVzIG11c3QgYmUgaGF2ZSBzaXplIFske251bUJveGVzfSw0XSBgICtcbiAgICAgICAgICBgYnV0IGhhZCBzaGFwZSAkeyRib3hlcy5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGJveEluZC5yYW5rID09PSAxICYmICRib3hJbmQuc2hhcGVbMF0gPT09IG51bUJveGVzLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNyb3BBbmRSZXNpemU6IGJveEluZCBtdXN0IGJlIGhhdmUgc2l6ZSBbJHtudW1Cb3hlc31dIGAgK1xuICAgICAgICAgIGBidXQgaGFkIHNoYXBlICR7JGJveGVzLnNoYXBlfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjcm9wU2l6ZS5sZW5ndGggPT09IDIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gY3JvcEFuZFJlc2l6ZTogY3JvcFNpemUgbXVzdCBiZSBvZiBsZW5ndGggMiwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgbGVuZ3RoICR7Y3JvcFNpemUubGVuZ3RofS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBjcm9wU2l6ZVswXSA+PSAxICYmIGNyb3BTaXplWzFdID49IDEsXG4gICAgICAoKSA9PiBgY3JvcFNpemUgbXVzdCBiZSBhdGxlYXN0IFsxLDFdLCBidXQgd2FzICR7Y3JvcFNpemV9YCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgbWV0aG9kID09PSAnYmlsaW5lYXInIHx8IG1ldGhvZCA9PT0gJ25lYXJlc3QnLFxuICAgICAgKCkgPT4gYG1ldGhvZCBtdXN0IGJlIGJpbGluZWFyIG9yIG5lYXJlc3QsIGJ1dCB3YXMgJHttZXRob2R9YCk7XG5cbiAgY29uc3QgaW5wdXRzOlxuICAgICAgQ3JvcEFuZFJlc2l6ZUlucHV0cyA9IHtpbWFnZTogJGltYWdlLCBib3hlczogJGJveGVzLCBib3hJbmQ6ICRib3hJbmR9O1xuICBjb25zdCBhdHRyczogQ3JvcEFuZFJlc2l6ZUF0dHJzID0ge21ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlLCBjcm9wU2l6ZX07XG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICBDcm9wQW5kUmVzaXplLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xuICByZXR1cm4gcmVzIGFzIFRlbnNvcjREO1xufVxuXG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZSA9IG9wKHtjcm9wQW5kUmVzaXplX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { FlipLeftRight } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\n/**\n * Flips the image left to right. Currently available in the CPU, WebGL, and\n * WASM backends.\n *\n * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.\n */\n/** @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'} */\nfunction flipLeftRight_(image) {\n    const $image = convertToTensor(image, 'image', 'flipLeftRight', 'float32');\n    util.assert($image.rank === 4, () => 'Error in flipLeftRight: image must be rank 4,' +\n        `but got rank ${$image.rank}.`);\n    const inputs = { image: $image };\n    const res = ENGINE.runKernel(FlipLeftRight, inputs, {});\n    return res;\n}\nexport const flipLeftRight = op({ flipLeftRight_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpcF9sZWZ0X3JpZ2h0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvZmxpcF9sZWZ0X3JpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGFBQWEsRUFBc0IsTUFBTSxvQkFBb0IsQ0FBQztBQUd0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7R0FLRztBQUNILDZFQUE2RTtBQUM3RSxTQUFTLGNBQWMsQ0FBQyxLQUEwQjtJQUNoRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFM0UsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQUMsK0NBQStDO1FBQ2pELGdCQUFnQixNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV4QyxNQUFNLE1BQU0sR0FBd0IsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDcEQsTUFBTSxHQUFHLEdBQ0wsTUFBTSxDQUFDLFNBQVMsQ0FBQyxhQUFhLEVBQUUsTUFBOEIsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN4RSxPQUFPLEdBQWUsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtGbGlwTGVmdFJpZ2h0LCBGbGlwTGVmdFJpZ2h0SW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogRmxpcHMgdGhlIGltYWdlIGxlZnQgdG8gcmlnaHQuIEN1cnJlbnRseSBhdmFpbGFibGUgaW4gdGhlIENQVSwgV2ViR0wsIGFuZFxuICogV0FTTSBiYWNrZW5kcy5cbiAqXG4gKiBAcGFyYW0gaW1hZ2UgNGQgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBkZXB0aF1gLlxuICovXG4vKiogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfSAqL1xuZnVuY3Rpb24gZmxpcExlZnRSaWdodF8oaW1hZ2U6IFRlbnNvcjREfFRlbnNvckxpa2UpOiBUZW5zb3I0RCB7XG4gIGNvbnN0ICRpbWFnZSA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZSwgJ2ltYWdlJywgJ2ZsaXBMZWZ0UmlnaHQnLCAnZmxvYXQzMicpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGltYWdlLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gZmxpcExlZnRSaWdodDogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcblxuICBjb25zdCBpbnB1dHM6IEZsaXBMZWZ0UmlnaHRJbnB1dHMgPSB7aW1hZ2U6ICRpbWFnZX07XG4gIGNvbnN0IHJlcyA9XG4gICAgICBFTkdJTkUucnVuS2VybmVsKEZsaXBMZWZ0UmlnaHQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwge30pO1xuICByZXR1cm4gcmVzIGFzIFRlbnNvcjREO1xufVxuXG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodCA9IG9wKHtmbGlwTGVmdFJpZ2h0X30pO1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\nimport { tile } from '../tile';\n/**\n * Converts images from grayscale to RGB format.\n *\n * @param image A grayscale tensor to convert. The `image`'s last dimension must\n *     be size 1 with at least a two-dimensional shape.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction grayscaleToRGB_(image) {\n    const $image = convertToTensor(image, 'image', 'grayscaleToRGB');\n    const lastDimsIdx = $image.rank - 1;\n    const lastDims = $image.shape[lastDimsIdx];\n    util.assert($image.rank >= 2, () => 'Error in grayscaleToRGB: images must be at least rank 2, ' +\n        `but got rank ${$image.rank}.`);\n    util.assert(lastDims === 1, () => 'Error in grayscaleToRGB: last dimension of a grayscale image ' +\n        `should be size 1, but got size ${lastDims}.`);\n    const reps = new Array($image.rank);\n    reps.fill(1, 0, lastDimsIdx);\n    reps[lastDimsIdx] = 3;\n    return tile($image, reps);\n}\nexport const grayscaleToRGB = op({ grayscaleToRGB_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JheXNjYWxlX3RvX3JnYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ltYWdlL2dyYXlzY2FsZV90b19yZ2IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sS0FBSyxJQUFJLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU3Qjs7Ozs7OztHQU9HO0FBQ0gsU0FBUyxlQUFlLENBQ1csS0FBbUI7SUFDcEQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUVqRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwQyxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRTNDLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLEVBQ2hCLEdBQUcsRUFBRSxDQUFDLDJEQUEyRDtRQUM3RCxnQkFBZ0IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFFeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxRQUFRLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLCtEQUErRDtRQUNqRSxrQ0FBa0MsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUV2RCxNQUFNLElBQUksR0FBRyxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFcEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdCLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFdEIsT0FBTyxJQUFJLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsRUFBRSxDQUFDLEVBQUMsZUFBZSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IyRCwgVGVuc29yM0QsIFRlbnNvcjRELCBUZW5zb3I1RCwgVGVuc29yNkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7dGlsZX0gZnJvbSAnLi4vdGlsZSc7XG5cbi8qKlxuICogQ29udmVydHMgaW1hZ2VzIGZyb20gZ3JheXNjYWxlIHRvIFJHQiBmb3JtYXQuXG4gKlxuICogQHBhcmFtIGltYWdlIEEgZ3JheXNjYWxlIHRlbnNvciB0byBjb252ZXJ0LiBUaGUgYGltYWdlYCdzIGxhc3QgZGltZW5zaW9uIG11c3RcbiAqICAgICBiZSBzaXplIDEgd2l0aCBhdCBsZWFzdCBhIHR3by1kaW1lbnNpb25hbCBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIGdyYXlzY2FsZVRvUkdCXzxUIGV4dGVuZHMgVGVuc29yMkR8VGVuc29yM0R8VGVuc29yNER8VGVuc29yNUR8XG4gICAgICAgICAgICAgICAgICAgICAgICAgVGVuc29yNkQ+KGltYWdlOiBUfFRlbnNvckxpa2UpOiBUIHtcbiAgY29uc3QgJGltYWdlID0gY29udmVydFRvVGVuc29yKGltYWdlLCAnaW1hZ2UnLCAnZ3JheXNjYWxlVG9SR0InKTtcblxuICBjb25zdCBsYXN0RGltc0lkeCA9ICRpbWFnZS5yYW5rIC0gMTtcbiAgY29uc3QgbGFzdERpbXMgPSAkaW1hZ2Uuc2hhcGVbbGFzdERpbXNJZHhdO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGltYWdlLnJhbmsgPj0gMixcbiAgICAgICgpID0+ICdFcnJvciBpbiBncmF5c2NhbGVUb1JHQjogaW1hZ2VzIG11c3QgYmUgYXQgbGVhc3QgcmFuayAyLCAnICtcbiAgICAgICAgICBgYnV0IGdvdCByYW5rICR7JGltYWdlLnJhbmt9LmApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgbGFzdERpbXMgPT09IDEsXG4gICAgICAoKSA9PiAnRXJyb3IgaW4gZ3JheXNjYWxlVG9SR0I6IGxhc3QgZGltZW5zaW9uIG9mIGEgZ3JheXNjYWxlIGltYWdlICcgK1xuICAgICAgICAgIGBzaG91bGQgYmUgc2l6ZSAxLCBidXQgZ290IHNpemUgJHtsYXN0RGltc30uYCk7XG5cbiAgY29uc3QgcmVwcyA9IG5ldyBBcnJheSgkaW1hZ2UucmFuayk7XG5cbiAgcmVwcy5maWxsKDEsIDAsIGxhc3REaW1zSWR4KTtcbiAgcmVwc1tsYXN0RGltc0lkeF0gPSAzO1xuXG4gIHJldHVybiB0aWxlKCRpbWFnZSwgcmVwcyk7XG59XG5cbmV4cG9ydCBjb25zdCBncmF5c2NhbGVUb1JHQiA9IG9wKHtncmF5c2NhbGVUb1JHQl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { RotateWithOffset } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\n/**\n * Rotates the input image tensor counter-clockwise with an optional offset\n * center of rotation. Currently available in the CPU, WebGL, and WASM backends.\n *\n * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.\n * @param radians The amount of rotation.\n * @param fillValue The value to fill in the empty space leftover\n *     after rotation. Can be either a single grayscale value (0-255), or an\n *     array of three numbers `[red, green, blue]` specifying the red, green,\n *     and blue channels. Defaults to `0` (black).\n * @param center The center of rotation. Can be either a single value (0-1), or\n *     an array of two numbers `[centerX, centerY]`. Defaults to `0.5` (rotates\n *     the image around its center).\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction rotateWithOffset_(image, radians, fillValue = 0, center = 0.5) {\n    const $image = convertToTensor(image, 'image', 'rotateWithOffset', 'float32');\n    util.assert($image.rank === 4, () => 'Error in rotateWithOffset: image must be rank 4,' +\n        `but got rank ${$image.rank}.`);\n    const inputs = { image: $image };\n    const attrs = { radians, fillValue, center };\n    const res = ENGINE.runKernel(RotateWithOffset, inputs, attrs);\n    return res;\n}\nexport const rotateWithOffset = op({ rotateWithOffset_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX3dpdGhfb2Zmc2V0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2Uvcm90YXRlX3dpdGhfb2Zmc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGdCQUFnQixFQUFnRCxNQUFNLG9CQUFvQixDQUFDO0FBSW5HLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEtBQUssSUFBSSxNQUFNLFlBQVksQ0FBQztBQUVuQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsaUJBQWlCLENBQ3RCLEtBQTBCLEVBQUUsT0FBZSxFQUMzQyxZQUE2QyxDQUFDLEVBQzlDLFNBQWtDLEdBQUc7SUFDdkMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFOUUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQUMsa0RBQWtEO1FBQ3BELGdCQUFnQixNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV4QyxNQUFNLE1BQU0sR0FBMkIsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDdkQsTUFBTSxLQUFLLEdBQTBCLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsQ0FBQztJQUNsRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUN4QixnQkFBZ0IsRUFBRSxNQUE4QixFQUNoRCxLQUEyQixDQUFDLENBQUM7SUFDakMsT0FBTyxHQUFlLENBQUM7QUFDekIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1JvdGF0ZVdpdGhPZmZzZXQsIFJvdGF0ZVdpdGhPZmZzZXRBdHRycywgUm90YXRlV2l0aE9mZnNldElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBSb3RhdGVzIHRoZSBpbnB1dCBpbWFnZSB0ZW5zb3IgY291bnRlci1jbG9ja3dpc2Ugd2l0aCBhbiBvcHRpb25hbCBvZmZzZXRcbiAqIGNlbnRlciBvZiByb3RhdGlvbi4gQ3VycmVudGx5IGF2YWlsYWJsZSBpbiB0aGUgQ1BVLCBXZWJHTCwgYW5kIFdBU00gYmFja2VuZHMuXG4gKlxuICogQHBhcmFtIGltYWdlIDRkIHRlbnNvciBvZiBzaGFwZSBgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSByYWRpYW5zIFRoZSBhbW91bnQgb2Ygcm90YXRpb24uXG4gKiBAcGFyYW0gZmlsbFZhbHVlIFRoZSB2YWx1ZSB0byBmaWxsIGluIHRoZSBlbXB0eSBzcGFjZSBsZWZ0b3ZlclxuICogICAgIGFmdGVyIHJvdGF0aW9uLiBDYW4gYmUgZWl0aGVyIGEgc2luZ2xlIGdyYXlzY2FsZSB2YWx1ZSAoMC0yNTUpLCBvciBhblxuICogICAgIGFycmF5IG9mIHRocmVlIG51bWJlcnMgYFtyZWQsIGdyZWVuLCBibHVlXWAgc3BlY2lmeWluZyB0aGUgcmVkLCBncmVlbixcbiAqICAgICBhbmQgYmx1ZSBjaGFubmVscy4gRGVmYXVsdHMgdG8gYDBgIChibGFjaykuXG4gKiBAcGFyYW0gY2VudGVyIFRoZSBjZW50ZXIgb2Ygcm90YXRpb24uIENhbiBiZSBlaXRoZXIgYSBzaW5nbGUgdmFsdWUgKDAtMSksIG9yXG4gKiAgICAgYW4gYXJyYXkgb2YgdHdvIG51bWJlcnMgYFtjZW50ZXJYLCBjZW50ZXJZXWAuIERlZmF1bHRzIHRvIGAwLjVgIChyb3RhdGVzXG4gKiAgICAgdGhlIGltYWdlIGFyb3VuZCBpdHMgY2VudGVyKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJvdGF0ZVdpdGhPZmZzZXRfKFxuICAgIGltYWdlOiBUZW5zb3I0RHxUZW5zb3JMaWtlLCByYWRpYW5zOiBudW1iZXIsXG4gICAgZmlsbFZhbHVlOiBudW1iZXJ8W251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gMCxcbiAgICBjZW50ZXI6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdID0gMC41KTogVGVuc29yNEQge1xuICBjb25zdCAkaW1hZ2UgPSBjb252ZXJ0VG9UZW5zb3IoaW1hZ2UsICdpbWFnZScsICdyb3RhdGVXaXRoT2Zmc2V0JywgJ2Zsb2F0MzInKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZS5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIHJvdGF0ZVdpdGhPZmZzZXQ6IGltYWdlIG11c3QgYmUgcmFuayA0LCcgK1xuICAgICAgICAgIGBidXQgZ290IHJhbmsgJHskaW1hZ2UucmFua30uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzID0ge2ltYWdlOiAkaW1hZ2V9O1xuICBjb25zdCBhdHRyczogUm90YXRlV2l0aE9mZnNldEF0dHJzID0ge3JhZGlhbnMsIGZpbGxWYWx1ZSwgY2VudGVyfTtcbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFJvdGF0ZVdpdGhPZmZzZXQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCk7XG4gIHJldHVybiByZXMgYXMgVGVuc29yNEQ7XG59XG5cbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0ID0gb3Aoe3JvdGF0ZVdpdGhPZmZzZXRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\nfunction nonMaxSuppSanityCheck(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) {\n    if (iouThreshold == null) {\n        iouThreshold = 0.5;\n    }\n    if (scoreThreshold == null) {\n        scoreThreshold = Number.NEGATIVE_INFINITY;\n    }\n    if (softNmsSigma == null) {\n        softNmsSigma = 0.0;\n    }\n    const numBoxes = boxes.shape[0];\n    maxOutputSize = Math.min(maxOutputSize, numBoxes);\n    util.assert(0 <= iouThreshold && iouThreshold <= 1, () => `iouThreshold must be in [0, 1], but was '${iouThreshold}'`);\n    util.assert(boxes.rank === 2, () => `boxes must be a 2D tensor, but was of rank '${boxes.rank}'`);\n    util.assert(boxes.shape[1] === 4, () => `boxes must have 4 columns, but 2nd dimension was ${boxes.shape[1]}`);\n    util.assert(scores.rank === 1, () => 'scores must be a 1D tensor');\n    util.assert(scores.shape[0] === numBoxes, () => `scores has incompatible shape with boxes. Expected ${numBoxes}, ` +\n        `but was ${scores.shape[0]}`);\n    util.assert(0 <= softNmsSigma && softNmsSigma <= 1, () => `softNmsSigma must be in [0, 1], but was '${softNmsSigma}'`);\n    return { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma };\n}\nexport { nonMaxSuppSanityCheck };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ubWF4X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9ub25tYXhfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxTQUFTLHFCQUFxQixDQUMxQixLQUFlLEVBQUUsTUFBZ0IsRUFBRSxhQUFxQixFQUN4RCxZQUFvQixFQUFFLGNBQXNCLEVBQUUsWUFBcUI7SUFNckUsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLFlBQVksR0FBRyxHQUFHLENBQUM7S0FDcEI7SUFDRCxJQUFJLGNBQWMsSUFBSSxJQUFJLEVBQUU7UUFDMUIsY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztLQUMzQztJQUNELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixZQUFZLEdBQUcsR0FBRyxDQUFDO0tBQ3BCO0lBRUQsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLElBQUksWUFBWSxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQ3RDLEdBQUcsRUFBRSxDQUFDLDRDQUE0QyxZQUFZLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2hCLEdBQUcsRUFBRSxDQUFDLCtDQUErQyxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUN4RSxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUNwQixHQUFHLEVBQUUsQ0FDRCxvREFBb0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDOUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDO0lBQ25FLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQzVCLEdBQUcsRUFBRSxDQUFDLHNEQUFzRCxRQUFRLElBQUk7UUFDcEUsV0FBVyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUN0QyxJQUFJLENBQUMsTUFBTSxDQUNQLENBQUMsSUFBSSxZQUFZLElBQUksWUFBWSxJQUFJLENBQUMsRUFDdEMsR0FBRyxFQUFFLENBQUMsNENBQTRDLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDdkUsT0FBTyxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5mdW5jdGlvbiBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgYm94ZXM6IFRlbnNvcjJELCBzY29yZXM6IFRlbnNvcjFELCBtYXhPdXRwdXRTaXplOiBudW1iZXIsXG4gICAgaW91VGhyZXNob2xkOiBudW1iZXIsIHNjb3JlVGhyZXNob2xkOiBudW1iZXIsIHNvZnRObXNTaWdtYT86IG51bWJlcik6IHtcbiAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLFxuICBpb3VUaHJlc2hvbGQ6IG51bWJlcixcbiAgc2NvcmVUaHJlc2hvbGQ6IG51bWJlcixcbiAgc29mdE5tc1NpZ21hOiBudW1iZXJcbn0ge1xuICBpZiAoaW91VGhyZXNob2xkID09IG51bGwpIHtcbiAgICBpb3VUaHJlc2hvbGQgPSAwLjU7XG4gIH1cbiAgaWYgKHNjb3JlVGhyZXNob2xkID09IG51bGwpIHtcbiAgICBzY29yZVRocmVzaG9sZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgfVxuICBpZiAoc29mdE5tc1NpZ21hID09IG51bGwpIHtcbiAgICBzb2Z0Tm1zU2lnbWEgPSAwLjA7XG4gIH1cblxuICBjb25zdCBudW1Cb3hlcyA9IGJveGVzLnNoYXBlWzBdO1xuICBtYXhPdXRwdXRTaXplID0gTWF0aC5taW4obWF4T3V0cHV0U2l6ZSwgbnVtQm94ZXMpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgMCA8PSBpb3VUaHJlc2hvbGQgJiYgaW91VGhyZXNob2xkIDw9IDEsXG4gICAgICAoKSA9PiBgaW91VGhyZXNob2xkIG11c3QgYmUgaW4gWzAsIDFdLCBidXQgd2FzICcke2lvdVRocmVzaG9sZH0nYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYm94ZXMucmFuayA9PT0gMixcbiAgICAgICgpID0+IGBib3hlcyBtdXN0IGJlIGEgMkQgdGVuc29yLCBidXQgd2FzIG9mIHJhbmsgJyR7Ym94ZXMucmFua30nYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYm94ZXMuc2hhcGVbMV0gPT09IDQsXG4gICAgICAoKSA9PlxuICAgICAgICAgIGBib3hlcyBtdXN0IGhhdmUgNCBjb2x1bW5zLCBidXQgMm5kIGRpbWVuc2lvbiB3YXMgJHtib3hlcy5zaGFwZVsxXX1gKTtcbiAgdXRpbC5hc3NlcnQoc2NvcmVzLnJhbmsgPT09IDEsICgpID0+ICdzY29yZXMgbXVzdCBiZSBhIDFEIHRlbnNvcicpO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHNjb3Jlcy5zaGFwZVswXSA9PT0gbnVtQm94ZXMsXG4gICAgICAoKSA9PiBgc2NvcmVzIGhhcyBpbmNvbXBhdGlibGUgc2hhcGUgd2l0aCBib3hlcy4gRXhwZWN0ZWQgJHtudW1Cb3hlc30sIGAgK1xuICAgICAgICAgIGBidXQgd2FzICR7c2NvcmVzLnNoYXBlWzBdfWApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIDAgPD0gc29mdE5tc1NpZ21hICYmIHNvZnRObXNTaWdtYSA8PSAxLFxuICAgICAgKCkgPT4gYHNvZnRObXNTaWdtYSBtdXN0IGJlIGluIFswLCAxXSwgYnV0IHdhcyAnJHtzb2Z0Tm1zU2lnbWF9J2ApO1xuICByZXR1cm4ge21heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYX07XG59XG5cbmV4cG9ydCB7bm9uTWF4U3VwcFNhbml0eUNoZWNrfTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { NonMaxSuppressionV3 } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { op } from '../operation';\n/**\n * Performs non maximum suppression of bounding boxes based on\n * iou (intersection over union).\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n *     the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n *     Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n *     on score. Defaults to -inf, which means any score is accepted.\n * @return A 1D tensor with the selected box indices.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction nonMaxSuppression_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY) {\n    const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression', 'float32');\n    const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression', 'float32');\n    const inputs = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold);\n    maxOutputSize = inputs.maxOutputSize;\n    iouThreshold = inputs.iouThreshold;\n    scoreThreshold = inputs.scoreThreshold;\n    const attrs = { maxOutputSize, iouThreshold, scoreThreshold };\n    return ENGINE.runKernel(NonMaxSuppressionV3, { boxes: $boxes, scores: $scores }, attrs);\n}\nexport const nonMaxSuppression = op({ nonMaxSuppression_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxTQUFTLGtCQUFrQixDQUN2QixLQUEwQixFQUFFLE1BQTJCLEVBQ3ZELGFBQXFCLEVBQUUsWUFBWSxHQUFHLEdBQUcsRUFDekMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUI7SUFDM0MsTUFBTSxNQUFNLEdBQ1IsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsbUJBQW1CLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFdEUsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQ2hDLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUNyQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNuQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUV2QyxNQUFNLEtBQUssR0FBRyxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUFDLENBQUM7SUFDNUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNuQixtQkFBbUIsRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxFQUFFLENBQUMsRUFBQyxrQkFBa0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtOb25NYXhTdXBwcmVzc2lvblYzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtub25NYXhTdXBwU2FuaXR5Q2hlY2t9IGZyb20gJy4uL25vbm1heF91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogUGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEByZXR1cm4gQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvbl8oXG4gICAgYm94ZXM6IFRlbnNvcjJEfFRlbnNvckxpa2UsIHNjb3JlczogVGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBtYXhPdXRwdXRTaXplOiBudW1iZXIsIGlvdVRocmVzaG9sZCA9IDAuNSxcbiAgICBzY29yZVRocmVzaG9sZCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWSk6IFRlbnNvcjFEIHtcbiAgY29uc3QgJGJveGVzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uJywgJ2Zsb2F0MzInKTtcbiAgY29uc3QgJHNjb3JlcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uJywgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBpbnB1dHMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgICAkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICBtYXhPdXRwdXRTaXplID0gaW5wdXRzLm1heE91dHB1dFNpemU7XG4gIGlvdVRocmVzaG9sZCA9IGlucHV0cy5pb3VUaHJlc2hvbGQ7XG4gIHNjb3JlVGhyZXNob2xkID0gaW5wdXRzLnNjb3JlVGhyZXNob2xkO1xuXG4gIGNvbnN0IGF0dHJzID0ge21heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGR9O1xuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIE5vbk1heFN1cHByZXNzaW9uVjMsIHtib3hlczogJGJveGVzLCBzY29yZXM6ICRzY29yZXN9LCBhdHRycyk7XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvbiA9IG9wKHtub25NYXhTdXBwcmVzc2lvbl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Inserts a value into a sorted array. This method allows duplicate, meaning it\n * allows inserting duplicate value, in which case, the element will be inserted\n * at the lowest index of the value.\n * @param arr The array to modify.\n * @param element The element to insert.\n * @param comparator Optional. If no comparator is specified, elements are\n * compared using array_util.defaultComparator, which is suitable for Strings\n * and Numbers in ascending arrays. If the array contains multiple instances of\n * the target value, the left-most instance will be returned. To provide a\n * comparator, it should take 2 arguments to compare and return a negative,\n * zero, or a positive number.\n */\nexport function binaryInsert(arr, element, comparator) {\n    const index = binarySearch(arr, element, comparator);\n    const insertionPoint = index < 0 ? -(index + 1) : index;\n    arr.splice(insertionPoint, 0, element);\n}\n/**\n * Searches the array for the target using binary search, returns the index\n * of the found element, or position to insert if element not found. If no\n * comparator is specified, elements are compared using array_\n * util.defaultComparator, which is suitable for Strings and Numbers in\n * ascending arrays. If the array contains multiple instances of the target\n * value, the left-most instance will be returned.\n * @param arr The array to be searched in.\n * @param target The target to be searched for.\n * @param comparator Should take 2 arguments to compare and return a negative,\n *    zero, or a positive number.\n * @return Lowest index of the target value if found, otherwise the insertion\n *    point where the target should be inserted, in the form of\n *    (-insertionPoint - 1).\n */\nexport function binarySearch(arr, target, comparator) {\n    return binarySearch_(arr, target, comparator || defaultComparator);\n}\n/**\n * Compares its two arguments for order.\n * @param a The first element to be compared.\n * @param b The second element to be compared.\n * @return A negative number, zero, or a positive number as the first\n *     argument is less than, equal to, or greater than the second.\n */\nfunction defaultComparator(a, b) {\n    return a > b ? 1 : a < b ? -1 : 0;\n}\nfunction binarySearch_(arr, target, comparator) {\n    let left = 0;\n    let right = arr.length;\n    let middle = 0;\n    let found = false;\n    while (left < right) {\n        middle = left + ((right - left) >>> 1);\n        const compareResult = comparator(target, arr[middle]);\n        if (compareResult > 0) {\n            left = middle + 1;\n        }\n        else {\n            right = middle;\n            // If compareResult is 0, the value is found. We record it is found,\n            // and then keep looking because there may be duplicate.\n            found = !compareResult;\n        }\n    }\n    return found ? left : -left - 1;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FDeEIsR0FBUSxFQUFFLE9BQVUsRUFBRSxVQUFtQztJQUMzRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNyRCxNQUFNLGNBQWMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDeEQsR0FBRyxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3pDLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQ3hCLEdBQVEsRUFBRSxNQUFTLEVBQUUsVUFBbUM7SUFDMUQsT0FBTyxhQUFhLENBQUMsR0FBRyxFQUFFLE1BQU0sRUFBRSxVQUFVLElBQUksaUJBQWlCLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBSSxDQUFJLEVBQUUsQ0FBSTtJQUN0QyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUNwQyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQ2xCLEdBQVEsRUFBRSxNQUFTLEVBQUUsVUFBa0M7SUFDekQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxLQUFLLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUN2QixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDbEIsT0FBTyxJQUFJLEdBQUcsS0FBSyxFQUFFO1FBQ25CLE1BQU0sR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3RELElBQUksYUFBYSxHQUFHLENBQUMsRUFBRTtZQUNyQixJQUFJLEdBQUcsTUFBTSxHQUFHLENBQUMsQ0FBQztTQUNuQjthQUFNO1lBQ0wsS0FBSyxHQUFHLE1BQU0sQ0FBQztZQUNmLG9FQUFvRTtZQUNwRSx3REFBd0Q7WUFDeEQsS0FBSyxHQUFHLENBQUMsYUFBYSxDQUFDO1NBQ3hCO0tBQ0Y7SUFFRCxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJbnNlcnRzIGEgdmFsdWUgaW50byBhIHNvcnRlZCBhcnJheS4gVGhpcyBtZXRob2QgYWxsb3dzIGR1cGxpY2F0ZSwgbWVhbmluZyBpdFxuICogYWxsb3dzIGluc2VydGluZyBkdXBsaWNhdGUgdmFsdWUsIGluIHdoaWNoIGNhc2UsIHRoZSBlbGVtZW50IHdpbGwgYmUgaW5zZXJ0ZWRcbiAqIGF0IHRoZSBsb3dlc3QgaW5kZXggb2YgdGhlIHZhbHVlLlxuICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gbW9kaWZ5LlxuICogQHBhcmFtIGVsZW1lbnQgVGhlIGVsZW1lbnQgdG8gaW5zZXJ0LlxuICogQHBhcmFtIGNvbXBhcmF0b3IgT3B0aW9uYWwuIElmIG5vIGNvbXBhcmF0b3IgaXMgc3BlY2lmaWVkLCBlbGVtZW50cyBhcmVcbiAqIGNvbXBhcmVkIHVzaW5nIGFycmF5X3V0aWwuZGVmYXVsdENvbXBhcmF0b3IsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBTdHJpbmdzXG4gKiBhbmQgTnVtYmVycyBpbiBhc2NlbmRpbmcgYXJyYXlzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mXG4gKiB0aGUgdGFyZ2V0IHZhbHVlLCB0aGUgbGVmdC1tb3N0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuIFRvIHByb3ZpZGUgYVxuICogY29tcGFyYXRvciwgaXQgc2hvdWxkIHRha2UgMiBhcmd1bWVudHMgdG8gY29tcGFyZSBhbmQgcmV0dXJuIGEgbmVnYXRpdmUsXG4gKiB6ZXJvLCBvciBhIHBvc2l0aXZlIG51bWJlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUluc2VydDxUPihcbiAgICBhcnI6IFRbXSwgZWxlbWVudDogVCwgY29tcGFyYXRvcj86IChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHtcbiAgY29uc3QgaW5kZXggPSBiaW5hcnlTZWFyY2goYXJyLCBlbGVtZW50LCBjb21wYXJhdG9yKTtcbiAgY29uc3QgaW5zZXJ0aW9uUG9pbnQgPSBpbmRleCA8IDAgPyAtKGluZGV4ICsgMSkgOiBpbmRleDtcbiAgYXJyLnNwbGljZShpbnNlcnRpb25Qb2ludCwgMCwgZWxlbWVudCk7XG59XG5cbi8qKlxuICogU2VhcmNoZXMgdGhlIGFycmF5IGZvciB0aGUgdGFyZ2V0IHVzaW5nIGJpbmFyeSBzZWFyY2gsIHJldHVybnMgdGhlIGluZGV4XG4gKiBvZiB0aGUgZm91bmQgZWxlbWVudCwgb3IgcG9zaXRpb24gdG8gaW5zZXJ0IGlmIGVsZW1lbnQgbm90IGZvdW5kLiBJZiBub1xuICogY29tcGFyYXRvciBpcyBzcGVjaWZpZWQsIGVsZW1lbnRzIGFyZSBjb21wYXJlZCB1c2luZyBhcnJheV9cbiAqIHV0aWwuZGVmYXVsdENvbXBhcmF0b3IsIHdoaWNoIGlzIHN1aXRhYmxlIGZvciBTdHJpbmdzIGFuZCBOdW1iZXJzIGluXG4gKiBhc2NlbmRpbmcgYXJyYXlzLiBJZiB0aGUgYXJyYXkgY29udGFpbnMgbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSB0YXJnZXRcbiAqIHZhbHVlLCB0aGUgbGVmdC1tb3N0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gYXJyIFRoZSBhcnJheSB0byBiZSBzZWFyY2hlZCBpbi5cbiAqIEBwYXJhbSB0YXJnZXQgVGhlIHRhcmdldCB0byBiZSBzZWFyY2hlZCBmb3IuXG4gKiBAcGFyYW0gY29tcGFyYXRvciBTaG91bGQgdGFrZSAyIGFyZ3VtZW50cyB0byBjb21wYXJlIGFuZCByZXR1cm4gYSBuZWdhdGl2ZSxcbiAqICAgIHplcm8sIG9yIGEgcG9zaXRpdmUgbnVtYmVyLlxuICogQHJldHVybiBMb3dlc3QgaW5kZXggb2YgdGhlIHRhcmdldCB2YWx1ZSBpZiBmb3VuZCwgb3RoZXJ3aXNlIHRoZSBpbnNlcnRpb25cbiAqICAgIHBvaW50IHdoZXJlIHRoZSB0YXJnZXQgc2hvdWxkIGJlIGluc2VydGVkLCBpbiB0aGUgZm9ybSBvZlxuICogICAgKC1pbnNlcnRpb25Qb2ludCAtIDEpLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5U2VhcmNoPFQ+KFxuICAgIGFycjogVFtdLCB0YXJnZXQ6IFQsIGNvbXBhcmF0b3I/OiAoYTogVCwgYjogVCkgPT4gbnVtYmVyKSB7XG4gIHJldHVybiBiaW5hcnlTZWFyY2hfKGFyciwgdGFyZ2V0LCBjb21wYXJhdG9yIHx8IGRlZmF1bHRDb21wYXJhdG9yKTtcbn1cblxuLyoqXG4gKiBDb21wYXJlcyBpdHMgdHdvIGFyZ3VtZW50cyBmb3Igb3JkZXIuXG4gKiBAcGFyYW0gYSBUaGUgZmlyc3QgZWxlbWVudCB0byBiZSBjb21wYXJlZC5cbiAqIEBwYXJhbSBiIFRoZSBzZWNvbmQgZWxlbWVudCB0byBiZSBjb21wYXJlZC5cbiAqIEByZXR1cm4gQSBuZWdhdGl2ZSBudW1iZXIsIHplcm8sIG9yIGEgcG9zaXRpdmUgbnVtYmVyIGFzIHRoZSBmaXJzdFxuICogICAgIGFyZ3VtZW50IGlzIGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLlxuICovXG5mdW5jdGlvbiBkZWZhdWx0Q29tcGFyYXRvcjxUPihhOiBULCBiOiBUKTogbnVtYmVyIHtcbiAgcmV0dXJuIGEgPiBiID8gMSA6IGEgPCBiID8gLTEgOiAwO1xufVxuXG5mdW5jdGlvbiBiaW5hcnlTZWFyY2hfPFQ+KFxuICAgIGFycjogVFtdLCB0YXJnZXQ6IFQsIGNvbXBhcmF0b3I6IChhOiBULCBiOiBUKSA9PiBudW1iZXIpIHtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBhcnIubGVuZ3RoO1xuICBsZXQgbWlkZGxlID0gMDtcbiAgbGV0IGZvdW5kID0gZmFsc2U7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBtaWRkbGUgPSBsZWZ0ICsgKChyaWdodCAtIGxlZnQpID4+PiAxKTtcbiAgICBjb25zdCBjb21wYXJlUmVzdWx0ID0gY29tcGFyYXRvcih0YXJnZXQsIGFyclttaWRkbGVdKTtcbiAgICBpZiAoY29tcGFyZVJlc3VsdCA+IDApIHtcbiAgICAgIGxlZnQgPSBtaWRkbGUgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByaWdodCA9IG1pZGRsZTtcbiAgICAgIC8vIElmIGNvbXBhcmVSZXN1bHQgaXMgMCwgdGhlIHZhbHVlIGlzIGZvdW5kLiBXZSByZWNvcmQgaXQgaXMgZm91bmQsXG4gICAgICAvLyBhbmQgdGhlbiBrZWVwIGxvb2tpbmcgYmVjYXVzZSB0aGVyZSBtYXkgYmUgZHVwbGljYXRlLlxuICAgICAgZm91bmQgPSAhY29tcGFyZVJlc3VsdDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gZm91bmQgPyBsZWZ0IDogLWxlZnQgLSAxO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { binaryInsert } from './non_max_suppression_util';\nexport function nonMaxSuppressionV3Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold) {\n    return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, 0 /* softNmsSigma */);\n}\nexport function nonMaxSuppressionV4Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize) {\n    return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, 0 /* softNmsSigma */, false /* returnScoresTensor */, padToMaxOutputSize /* padToMaxOutputSize */, true\n    /* returnValidOutputs */ );\n}\nexport function nonMaxSuppressionV5Impl(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma) {\n    return nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, true /* returnScoresTensor */);\n}\nfunction nonMaxSuppressionImpl_(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma, returnScoresTensor = false, padToMaxOutputSize = false, returnValidOutputs = false) {\n    // The list is sorted in ascending order, so that we can always pop the\n    // candidate with the largest score in O(1) time.\n    const candidates = [];\n    for (let i = 0; i < scores.length; i++) {\n        if (scores[i] > scoreThreshold) {\n            candidates.push({ score: scores[i], boxIndex: i, suppressBeginIndex: 0 });\n        }\n    }\n    candidates.sort(ascendingComparator);\n    // If softNmsSigma is 0, the outcome of this algorithm is exactly same as\n    // before.\n    const scale = softNmsSigma > 0 ? (-0.5 / softNmsSigma) : 0.0;\n    const selectedIndices = [];\n    const selectedScores = [];\n    while (selectedIndices.length < maxOutputSize && candidates.length > 0) {\n        const candidate = candidates.pop();\n        const { score: originalScore, boxIndex, suppressBeginIndex } = candidate;\n        if (originalScore < scoreThreshold) {\n            break;\n        }\n        // Overlapping boxes are likely to have similar scores, therefore we\n        // iterate through the previously selected boxes backwards in order to\n        // see if candidate's score should be suppressed. We use\n        // suppressBeginIndex to track and ensure a candidate can be suppressed\n        // by a selected box no more than once. Also, if the overlap exceeds\n        // iouThreshold, we simply ignore the candidate.\n        let ignoreCandidate = false;\n        for (let j = selectedIndices.length - 1; j >= suppressBeginIndex; --j) {\n            const iou = intersectionOverUnion(boxes, boxIndex, selectedIndices[j]);\n            if (iou >= iouThreshold) {\n                ignoreCandidate = true;\n                break;\n            }\n            candidate.score =\n                candidate.score * suppressWeight(iouThreshold, scale, iou);\n            if (candidate.score <= scoreThreshold) {\n                break;\n            }\n        }\n        // At this point, if `candidate.score` has not dropped below\n        // `scoreThreshold`, then we know that we went through all of the\n        // previous selections and can safely update `suppressBeginIndex` to the\n        // end of the selected array. Then we can re-insert the candidate with\n        // the updated score and suppressBeginIndex back in the candidate list.\n        // If on the other hand, `candidate.score` has dropped below the score\n        // threshold, we will not add it back to the candidates list.\n        candidate.suppressBeginIndex = selectedIndices.length;\n        if (!ignoreCandidate) {\n            // Candidate has passed all the tests, and is not suppressed, so\n            // select the candidate.\n            if (candidate.score === originalScore) {\n                selectedIndices.push(boxIndex);\n                selectedScores.push(candidate.score);\n            }\n            else if (candidate.score > scoreThreshold) {\n                // Candidate's score is suppressed but is still high enough to be\n                // considered, so add back to the candidates list.\n                binaryInsert(candidates, candidate, ascendingComparator);\n            }\n        }\n    }\n    // NonMaxSuppressionV4 feature: padding output to maxOutputSize.\n    const validOutputs = selectedIndices.length;\n    const elemsToPad = maxOutputSize - validOutputs;\n    if (padToMaxOutputSize && elemsToPad > 0) {\n        selectedIndices.push(...new Array(elemsToPad).fill(0));\n        selectedScores.push(...new Array(elemsToPad).fill(0.0));\n    }\n    const result = { selectedIndices };\n    if (returnScoresTensor) {\n        result['selectedScores'] = selectedScores;\n    }\n    if (returnValidOutputs) {\n        result['validOutputs'] = validOutputs;\n    }\n    return result;\n}\nfunction intersectionOverUnion(boxes, i, j) {\n    const iCoord = boxes.subarray(i * 4, i * 4 + 4);\n    const jCoord = boxes.subarray(j * 4, j * 4 + 4);\n    const yminI = Math.min(iCoord[0], iCoord[2]);\n    const xminI = Math.min(iCoord[1], iCoord[3]);\n    const ymaxI = Math.max(iCoord[0], iCoord[2]);\n    const xmaxI = Math.max(iCoord[1], iCoord[3]);\n    const yminJ = Math.min(jCoord[0], jCoord[2]);\n    const xminJ = Math.min(jCoord[1], jCoord[3]);\n    const ymaxJ = Math.max(jCoord[0], jCoord[2]);\n    const xmaxJ = Math.max(jCoord[1], jCoord[3]);\n    const areaI = (ymaxI - yminI) * (xmaxI - xminI);\n    const areaJ = (ymaxJ - yminJ) * (xmaxJ - xminJ);\n    if (areaI <= 0 || areaJ <= 0) {\n        return 0.0;\n    }\n    const intersectionYmin = Math.max(yminI, yminJ);\n    const intersectionXmin = Math.max(xminI, xminJ);\n    const intersectionYmax = Math.min(ymaxI, ymaxJ);\n    const intersectionXmax = Math.min(xmaxI, xmaxJ);\n    const intersectionArea = Math.max(intersectionYmax - intersectionYmin, 0.0) *\n        Math.max(intersectionXmax - intersectionXmin, 0.0);\n    return intersectionArea / (areaI + areaJ - intersectionArea);\n}\n// A Gaussian penalty function, this method always returns values in [0, 1].\n// The weight is a function of similarity, the more overlap two boxes are, the\n// smaller the weight is, meaning highly overlapping boxe will be significantly\n// penalized. On the other hand, a non-overlapping box will not be penalized.\nfunction suppressWeight(iouThreshold, scale, iou) {\n    const weight = Math.exp(scale * iou * iou);\n    return iou <= iouThreshold ? weight : 0.0;\n}\nfunction ascendingComparator(c1, c2) {\n    // For objects with same scores, we make the object with the larger index go\n    // first. In an array that pops from the end, this means that the object with\n    // the smaller index will be popped first. This ensures the same output as\n    // the TensorFlow python version.\n    return (c1.score - c2.score) ||\n        ((c1.score === c2.score) && (c2.boxIndex - c1.boxIndex));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9iYWNrZW5kcy9ub25fbWF4X3N1cHByZXNzaW9uX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBaUJ4RCxNQUFNLFVBQVUsdUJBQXVCLENBQ25DLEtBQWlCLEVBQUUsTUFBa0IsRUFBRSxhQUFxQixFQUM1RCxZQUFvQixFQUFFLGNBQXNCO0lBQzlDLE9BQU8sc0JBQXNCLENBQ3pCLEtBQUssRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQzFELENBQUMsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQ25DLEtBQWlCLEVBQUUsTUFBa0IsRUFBRSxhQUFxQixFQUM1RCxZQUFvQixFQUFFLGNBQXNCLEVBQzVDLGtCQUEyQjtJQUM3QixPQUFPLHNCQUFzQixDQUN6QixLQUFLLEVBQUUsTUFBTSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUMxRCxDQUFDLENBQUMsa0JBQWtCLEVBQUUsS0FBSyxDQUFDLHdCQUF3QixFQUNwRCxrQkFBa0IsQ0FBQyx3QkFBd0IsRUFBRSxJQUFJO0lBQ2pELHdCQUF3QixFQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FDbkMsS0FBaUIsRUFBRSxNQUFrQixFQUFFLGFBQXFCLEVBQzVELFlBQW9CLEVBQUUsY0FBc0IsRUFDNUMsWUFBb0I7SUFDdEIsT0FBTyxzQkFBc0IsQ0FDekIsS0FBSyxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQ3hFLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0FBQ3JDLENBQUM7QUFFRCxTQUFTLHNCQUFzQixDQUMzQixLQUFpQixFQUFFLE1BQWtCLEVBQUUsYUFBcUIsRUFDNUQsWUFBb0IsRUFBRSxjQUFzQixFQUFFLFlBQW9CLEVBQ2xFLGtCQUFrQixHQUFHLEtBQUssRUFBRSxrQkFBa0IsR0FBRyxLQUFLLEVBQ3RELGtCQUFrQixHQUFHLEtBQUs7SUFDNUIsdUVBQXVFO0lBQ3ZFLGlEQUFpRDtJQUNqRCxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFFdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxFQUFFO1lBQzlCLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBRSxDQUFDLEVBQUUsa0JBQWtCLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQztTQUN6RTtLQUNGO0lBRUQsVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBRXJDLHlFQUF5RTtJQUN6RSxVQUFVO0lBQ1YsTUFBTSxLQUFLLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRTdELE1BQU0sZUFBZSxHQUFhLEVBQUUsQ0FBQztJQUNyQyxNQUFNLGNBQWMsR0FBYSxFQUFFLENBQUM7SUFFcEMsT0FBTyxlQUFlLENBQUMsTUFBTSxHQUFHLGFBQWEsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN0RSxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDbkMsTUFBTSxFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLGtCQUFrQixFQUFDLEdBQUcsU0FBUyxDQUFDO1FBRXZFLElBQUksYUFBYSxHQUFHLGNBQWMsRUFBRTtZQUNsQyxNQUFNO1NBQ1A7UUFFRCxvRUFBb0U7UUFDcEUsc0VBQXNFO1FBQ3RFLHdEQUF3RDtRQUN4RCx1RUFBdUU7UUFDdkUsb0VBQW9FO1FBQ3BFLGdEQUFnRDtRQUNoRCxJQUFJLGVBQWUsR0FBRyxLQUFLLENBQUM7UUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksa0JBQWtCLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDckUsTUFBTSxHQUFHLEdBQUcscUJBQXFCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUV2RSxJQUFJLEdBQUcsSUFBSSxZQUFZLEVBQUU7Z0JBQ3ZCLGVBQWUsR0FBRyxJQUFJLENBQUM7Z0JBQ3ZCLE1BQU07YUFDUDtZQUVELFNBQVMsQ0FBQyxLQUFLO2dCQUNYLFNBQVMsQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFL0QsSUFBSSxTQUFTLENBQUMsS0FBSyxJQUFJLGNBQWMsRUFBRTtnQkFDckMsTUFBTTthQUNQO1NBQ0Y7UUFFRCw0REFBNEQ7UUFDNUQsaUVBQWlFO1FBQ2pFLHdFQUF3RTtRQUN4RSxzRUFBc0U7UUFDdEUsdUVBQXVFO1FBQ3ZFLHNFQUFzRTtRQUN0RSw2REFBNkQ7UUFDN0QsU0FBUyxDQUFDLGtCQUFrQixHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUM7UUFFdEQsSUFBSSxDQUFDLGVBQWUsRUFBRTtZQUNwQixnRUFBZ0U7WUFDaEUsd0JBQXdCO1lBQ3hCLElBQUksU0FBUyxDQUFDLEtBQUssS0FBSyxhQUFhLEVBQUU7Z0JBQ3JDLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQy9CLGNBQWMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3RDO2lCQUFNLElBQUksU0FBUyxDQUFDLEtBQUssR0FBRyxjQUFjLEVBQUU7Z0JBQzNDLGlFQUFpRTtnQkFDakUsa0RBQWtEO2dCQUNsRCxZQUFZLENBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO2FBQzFEO1NBQ0Y7S0FDRjtJQUVELGdFQUFnRTtJQUNoRSxNQUFNLFlBQVksR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGFBQWEsR0FBRyxZQUFZLENBQUM7SUFFaEQsSUFBSSxrQkFBa0IsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO1FBQ3hDLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2RCxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDekQ7SUFFRCxNQUFNLE1BQU0sR0FBNEIsRUFBQyxlQUFlLEVBQUMsQ0FBQztJQUUxRCxJQUFJLGtCQUFrQixFQUFFO1FBQ3RCLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLGNBQWMsQ0FBQztLQUMzQztJQUVELElBQUksa0JBQWtCLEVBQUU7UUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQztLQUN2QztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLEtBQWlCLEVBQUUsQ0FBUyxFQUFFLENBQVM7SUFDcEUsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDaEQsSUFBSSxLQUFLLElBQUksQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7UUFDNUIsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUNELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2hELE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixFQUFFLEdBQUcsQ0FBQztRQUN2RSxJQUFJLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZELE9BQU8sZ0JBQWdCLEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLGdCQUFnQixDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDZFQUE2RTtBQUM3RSxTQUFTLGNBQWMsQ0FBQyxZQUFvQixFQUFFLEtBQWEsRUFBRSxHQUFXO0lBQ3RFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxHQUFHLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztJQUMzQyxPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQzVDLENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEVBQWEsRUFBRSxFQUFhO0lBQ3ZELDRFQUE0RTtJQUM1RSw2RUFBNkU7SUFDN0UsMEVBQTBFO0lBQzFFLGlDQUFpQztJQUNqQyxPQUFPLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO1FBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUeXBlZEFycmF5fSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQge2JpbmFyeUluc2VydH0gZnJvbSAnLi9ub25fbWF4X3N1cHByZXNzaW9uX3V0aWwnO1xuXG4vKipcbiAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBOb25NYXhTdXBwcmVzc2lvbiBrZXJuZWwgc2hhcmVkIGJldHdlZW4gd2ViZ2wgYW5kIGNwdS5cbiAqL1xuaW50ZXJmYWNlIENhbmRpZGF0ZSB7XG4gIHNjb3JlOiBudW1iZXI7XG4gIGJveEluZGV4OiBudW1iZXI7XG4gIHN1cHByZXNzQmVnaW5JbmRleDogbnVtYmVyO1xufVxuXG5pbnRlcmZhY2UgTm9uTWF4U3VwcHJlc3Npb25SZXN1bHQge1xuICBzZWxlY3RlZEluZGljZXM6IG51bWJlcltdO1xuICBzZWxlY3RlZFNjb3Jlcz86IG51bWJlcltdO1xuICB2YWxpZE91dHB1dHM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblYzSW1wbChcbiAgICBib3hlczogVHlwZWRBcnJheSwgc2NvcmVzOiBUeXBlZEFycmF5LCBtYXhPdXRwdXRTaXplOiBudW1iZXIsXG4gICAgaW91VGhyZXNob2xkOiBudW1iZXIsIHNjb3JlVGhyZXNob2xkOiBudW1iZXIpOiBOb25NYXhTdXBwcmVzc2lvblJlc3VsdCB7XG4gIHJldHVybiBub25NYXhTdXBwcmVzc2lvbkltcGxfKFxuICAgICAgYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCxcbiAgICAgIDAgLyogc29mdE5tc1NpZ21hICovKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjRJbXBsKFxuICAgIGJveGVzOiBUeXBlZEFycmF5LCBzY29yZXM6IFR5cGVkQXJyYXksIG1heE91dHB1dFNpemU6IG51bWJlcixcbiAgICBpb3VUaHJlc2hvbGQ6IG51bWJlciwgc2NvcmVUaHJlc2hvbGQ6IG51bWJlcixcbiAgICBwYWRUb01heE91dHB1dFNpemU6IGJvb2xlYW4pOiBOb25NYXhTdXBwcmVzc2lvblJlc3VsdCB7XG4gIHJldHVybiBub25NYXhTdXBwcmVzc2lvbkltcGxfKFxuICAgICAgYm94ZXMsIHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCxcbiAgICAgIDAgLyogc29mdE5tc1NpZ21hICovLCBmYWxzZSAvKiByZXR1cm5TY29yZXNUZW5zb3IgKi8sXG4gICAgICBwYWRUb01heE91dHB1dFNpemUgLyogcGFkVG9NYXhPdXRwdXRTaXplICovLCB0cnVlXG4gICAgICAvKiByZXR1cm5WYWxpZE91dHB1dHMgKi8pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNUltcGwoXG4gICAgYm94ZXM6IFR5cGVkQXJyYXksIHNjb3JlczogVHlwZWRBcnJheSwgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLFxuICAgIGlvdVRocmVzaG9sZDogbnVtYmVyLCBzY29yZVRocmVzaG9sZDogbnVtYmVyLFxuICAgIHNvZnRObXNTaWdtYTogbnVtYmVyKTogTm9uTWF4U3VwcHJlc3Npb25SZXN1bHQge1xuICByZXR1cm4gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhcbiAgICAgIGJveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYSxcbiAgICAgIHRydWUgLyogcmV0dXJuU2NvcmVzVGVuc29yICovKTtcbn1cblxuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25JbXBsXyhcbiAgICBib3hlczogVHlwZWRBcnJheSwgc2NvcmVzOiBUeXBlZEFycmF5LCBtYXhPdXRwdXRTaXplOiBudW1iZXIsXG4gICAgaW91VGhyZXNob2xkOiBudW1iZXIsIHNjb3JlVGhyZXNob2xkOiBudW1iZXIsIHNvZnRObXNTaWdtYTogbnVtYmVyLFxuICAgIHJldHVyblNjb3Jlc1RlbnNvciA9IGZhbHNlLCBwYWRUb01heE91dHB1dFNpemUgPSBmYWxzZSxcbiAgICByZXR1cm5WYWxpZE91dHB1dHMgPSBmYWxzZSk6IE5vbk1heFN1cHByZXNzaW9uUmVzdWx0IHtcbiAgLy8gVGhlIGxpc3QgaXMgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlciwgc28gdGhhdCB3ZSBjYW4gYWx3YXlzIHBvcCB0aGVcbiAgLy8gY2FuZGlkYXRlIHdpdGggdGhlIGxhcmdlc3Qgc2NvcmUgaW4gTygxKSB0aW1lLlxuICBjb25zdCBjYW5kaWRhdGVzID0gW107XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzY29yZXMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoc2NvcmVzW2ldID4gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgIGNhbmRpZGF0ZXMucHVzaCh7c2NvcmU6IHNjb3Jlc1tpXSwgYm94SW5kZXg6IGksIHN1cHByZXNzQmVnaW5JbmRleDogMH0pO1xuICAgIH1cbiAgfVxuXG4gIGNhbmRpZGF0ZXMuc29ydChhc2NlbmRpbmdDb21wYXJhdG9yKTtcblxuICAvLyBJZiBzb2Z0Tm1zU2lnbWEgaXMgMCwgdGhlIG91dGNvbWUgb2YgdGhpcyBhbGdvcml0aG0gaXMgZXhhY3RseSBzYW1lIGFzXG4gIC8vIGJlZm9yZS5cbiAgY29uc3Qgc2NhbGUgPSBzb2Z0Tm1zU2lnbWEgPiAwID8gKC0wLjUgLyBzb2Z0Tm1zU2lnbWEpIDogMC4wO1xuXG4gIGNvbnN0IHNlbGVjdGVkSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgY29uc3Qgc2VsZWN0ZWRTY29yZXM6IG51bWJlcltdID0gW107XG5cbiAgd2hpbGUgKHNlbGVjdGVkSW5kaWNlcy5sZW5ndGggPCBtYXhPdXRwdXRTaXplICYmIGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXMucG9wKCk7XG4gICAgY29uc3Qge3Njb3JlOiBvcmlnaW5hbFNjb3JlLCBib3hJbmRleCwgc3VwcHJlc3NCZWdpbkluZGV4fSA9IGNhbmRpZGF0ZTtcblxuICAgIGlmIChvcmlnaW5hbFNjb3JlIDwgc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8vIE92ZXJsYXBwaW5nIGJveGVzIGFyZSBsaWtlbHkgdG8gaGF2ZSBzaW1pbGFyIHNjb3JlcywgdGhlcmVmb3JlIHdlXG4gICAgLy8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIGJveGVzIGJhY2t3YXJkcyBpbiBvcmRlciB0b1xuICAgIC8vIHNlZSBpZiBjYW5kaWRhdGUncyBzY29yZSBzaG91bGQgYmUgc3VwcHJlc3NlZC4gV2UgdXNlXG4gICAgLy8gc3VwcHJlc3NCZWdpbkluZGV4IHRvIHRyYWNrIGFuZCBlbnN1cmUgYSBjYW5kaWRhdGUgY2FuIGJlIHN1cHByZXNzZWRcbiAgICAvLyBieSBhIHNlbGVjdGVkIGJveCBubyBtb3JlIHRoYW4gb25jZS4gQWxzbywgaWYgdGhlIG92ZXJsYXAgZXhjZWVkc1xuICAgIC8vIGlvdVRocmVzaG9sZCwgd2Ugc2ltcGx5IGlnbm9yZSB0aGUgY2FuZGlkYXRlLlxuICAgIGxldCBpZ25vcmVDYW5kaWRhdGUgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBqID0gc2VsZWN0ZWRJbmRpY2VzLmxlbmd0aCAtIDE7IGogPj0gc3VwcHJlc3NCZWdpbkluZGV4OyAtLWopIHtcbiAgICAgIGNvbnN0IGlvdSA9IGludGVyc2VjdGlvbk92ZXJVbmlvbihib3hlcywgYm94SW5kZXgsIHNlbGVjdGVkSW5kaWNlc1tqXSk7XG5cbiAgICAgIGlmIChpb3UgPj0gaW91VGhyZXNob2xkKSB7XG4gICAgICAgIGlnbm9yZUNhbmRpZGF0ZSA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuXG4gICAgICBjYW5kaWRhdGUuc2NvcmUgPVxuICAgICAgICAgIGNhbmRpZGF0ZS5zY29yZSAqIHN1cHByZXNzV2VpZ2h0KGlvdVRocmVzaG9sZCwgc2NhbGUsIGlvdSk7XG5cbiAgICAgIGlmIChjYW5kaWRhdGUuc2NvcmUgPD0gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCwgaWYgYGNhbmRpZGF0ZS5zY29yZWAgaGFzIG5vdCBkcm9wcGVkIGJlbG93XG4gICAgLy8gYHNjb3JlVGhyZXNob2xkYCwgdGhlbiB3ZSBrbm93IHRoYXQgd2Ugd2VudCB0aHJvdWdoIGFsbCBvZiB0aGVcbiAgICAvLyBwcmV2aW91cyBzZWxlY3Rpb25zIGFuZCBjYW4gc2FmZWx5IHVwZGF0ZSBgc3VwcHJlc3NCZWdpbkluZGV4YCB0byB0aGVcbiAgICAvLyBlbmQgb2YgdGhlIHNlbGVjdGVkIGFycmF5LiBUaGVuIHdlIGNhbiByZS1pbnNlcnQgdGhlIGNhbmRpZGF0ZSB3aXRoXG4gICAgLy8gdGhlIHVwZGF0ZWQgc2NvcmUgYW5kIHN1cHByZXNzQmVnaW5JbmRleCBiYWNrIGluIHRoZSBjYW5kaWRhdGUgbGlzdC5cbiAgICAvLyBJZiBvbiB0aGUgb3RoZXIgaGFuZCwgYGNhbmRpZGF0ZS5zY29yZWAgaGFzIGRyb3BwZWQgYmVsb3cgdGhlIHNjb3JlXG4gICAgLy8gdGhyZXNob2xkLCB3ZSB3aWxsIG5vdCBhZGQgaXQgYmFjayB0byB0aGUgY2FuZGlkYXRlcyBsaXN0LlxuICAgIGNhbmRpZGF0ZS5zdXBwcmVzc0JlZ2luSW5kZXggPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuXG4gICAgaWYgKCFpZ25vcmVDYW5kaWRhdGUpIHtcbiAgICAgIC8vIENhbmRpZGF0ZSBoYXMgcGFzc2VkIGFsbCB0aGUgdGVzdHMsIGFuZCBpcyBub3Qgc3VwcHJlc3NlZCwgc29cbiAgICAgIC8vIHNlbGVjdCB0aGUgY2FuZGlkYXRlLlxuICAgICAgaWYgKGNhbmRpZGF0ZS5zY29yZSA9PT0gb3JpZ2luYWxTY29yZSkge1xuICAgICAgICBzZWxlY3RlZEluZGljZXMucHVzaChib3hJbmRleCk7XG4gICAgICAgIHNlbGVjdGVkU2NvcmVzLnB1c2goY2FuZGlkYXRlLnNjb3JlKTtcbiAgICAgIH0gZWxzZSBpZiAoY2FuZGlkYXRlLnNjb3JlID4gc2NvcmVUaHJlc2hvbGQpIHtcbiAgICAgICAgLy8gQ2FuZGlkYXRlJ3Mgc2NvcmUgaXMgc3VwcHJlc3NlZCBidXQgaXMgc3RpbGwgaGlnaCBlbm91Z2ggdG8gYmVcbiAgICAgICAgLy8gY29uc2lkZXJlZCwgc28gYWRkIGJhY2sgdG8gdGhlIGNhbmRpZGF0ZXMgbGlzdC5cbiAgICAgICAgYmluYXJ5SW5zZXJ0KGNhbmRpZGF0ZXMsIGNhbmRpZGF0ZSwgYXNjZW5kaW5nQ29tcGFyYXRvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gTm9uTWF4U3VwcHJlc3Npb25WNCBmZWF0dXJlOiBwYWRkaW5nIG91dHB1dCB0byBtYXhPdXRwdXRTaXplLlxuICBjb25zdCB2YWxpZE91dHB1dHMgPSBzZWxlY3RlZEluZGljZXMubGVuZ3RoO1xuICBjb25zdCBlbGVtc1RvUGFkID0gbWF4T3V0cHV0U2l6ZSAtIHZhbGlkT3V0cHV0cztcblxuICBpZiAocGFkVG9NYXhPdXRwdXRTaXplICYmIGVsZW1zVG9QYWQgPiAwKSB7XG4gICAgc2VsZWN0ZWRJbmRpY2VzLnB1c2goLi4ubmV3IEFycmF5KGVsZW1zVG9QYWQpLmZpbGwoMCkpO1xuICAgIHNlbGVjdGVkU2NvcmVzLnB1c2goLi4ubmV3IEFycmF5KGVsZW1zVG9QYWQpLmZpbGwoMC4wKSk7XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IE5vbk1heFN1cHByZXNzaW9uUmVzdWx0ID0ge3NlbGVjdGVkSW5kaWNlc307XG5cbiAgaWYgKHJldHVyblNjb3Jlc1RlbnNvcikge1xuICAgIHJlc3VsdFsnc2VsZWN0ZWRTY29yZXMnXSA9IHNlbGVjdGVkU2NvcmVzO1xuICB9XG5cbiAgaWYgKHJldHVyblZhbGlkT3V0cHV0cykge1xuICAgIHJlc3VsdFsndmFsaWRPdXRwdXRzJ10gPSB2YWxpZE91dHB1dHM7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpbnRlcnNlY3Rpb25PdmVyVW5pb24oYm94ZXM6IFR5cGVkQXJyYXksIGk6IG51bWJlciwgajogbnVtYmVyKSB7XG4gIGNvbnN0IGlDb29yZCA9IGJveGVzLnN1YmFycmF5KGkgKiA0LCBpICogNCArIDQpO1xuICBjb25zdCBqQ29vcmQgPSBib3hlcy5zdWJhcnJheShqICogNCwgaiAqIDQgKyA0KTtcbiAgY29uc3QgeW1pbkkgPSBNYXRoLm1pbihpQ29vcmRbMF0sIGlDb29yZFsyXSk7XG4gIGNvbnN0IHhtaW5JID0gTWF0aC5taW4oaUNvb3JkWzFdLCBpQ29vcmRbM10pO1xuICBjb25zdCB5bWF4SSA9IE1hdGgubWF4KGlDb29yZFswXSwgaUNvb3JkWzJdKTtcbiAgY29uc3QgeG1heEkgPSBNYXRoLm1heChpQ29vcmRbMV0sIGlDb29yZFszXSk7XG4gIGNvbnN0IHltaW5KID0gTWF0aC5taW4oakNvb3JkWzBdLCBqQ29vcmRbMl0pO1xuICBjb25zdCB4bWluSiA9IE1hdGgubWluKGpDb29yZFsxXSwgakNvb3JkWzNdKTtcbiAgY29uc3QgeW1heEogPSBNYXRoLm1heChqQ29vcmRbMF0sIGpDb29yZFsyXSk7XG4gIGNvbnN0IHhtYXhKID0gTWF0aC5tYXgoakNvb3JkWzFdLCBqQ29vcmRbM10pO1xuICBjb25zdCBhcmVhSSA9ICh5bWF4SSAtIHltaW5JKSAqICh4bWF4SSAtIHhtaW5JKTtcbiAgY29uc3QgYXJlYUogPSAoeW1heEogLSB5bWluSikgKiAoeG1heEogLSB4bWluSik7XG4gIGlmIChhcmVhSSA8PSAwIHx8IGFyZWFKIDw9IDApIHtcbiAgICByZXR1cm4gMC4wO1xuICB9XG4gIGNvbnN0IGludGVyc2VjdGlvblltaW4gPSBNYXRoLm1heCh5bWluSSwgeW1pbkopO1xuICBjb25zdCBpbnRlcnNlY3Rpb25YbWluID0gTWF0aC5tYXgoeG1pbkksIHhtaW5KKTtcbiAgY29uc3QgaW50ZXJzZWN0aW9uWW1heCA9IE1hdGgubWluKHltYXhJLCB5bWF4Sik7XG4gIGNvbnN0IGludGVyc2VjdGlvblhtYXggPSBNYXRoLm1pbih4bWF4SSwgeG1heEopO1xuICBjb25zdCBpbnRlcnNlY3Rpb25BcmVhID0gTWF0aC5tYXgoaW50ZXJzZWN0aW9uWW1heCAtIGludGVyc2VjdGlvblltaW4sIDAuMCkgKlxuICAgICAgTWF0aC5tYXgoaW50ZXJzZWN0aW9uWG1heCAtIGludGVyc2VjdGlvblhtaW4sIDAuMCk7XG4gIHJldHVybiBpbnRlcnNlY3Rpb25BcmVhIC8gKGFyZWFJICsgYXJlYUogLSBpbnRlcnNlY3Rpb25BcmVhKTtcbn1cblxuLy8gQSBHYXVzc2lhbiBwZW5hbHR5IGZ1bmN0aW9uLCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucyB2YWx1ZXMgaW4gWzAsIDFdLlxuLy8gVGhlIHdlaWdodCBpcyBhIGZ1bmN0aW9uIG9mIHNpbWlsYXJpdHksIHRoZSBtb3JlIG92ZXJsYXAgdHdvIGJveGVzIGFyZSwgdGhlXG4vLyBzbWFsbGVyIHRoZSB3ZWlnaHQgaXMsIG1lYW5pbmcgaGlnaGx5IG92ZXJsYXBwaW5nIGJveGUgd2lsbCBiZSBzaWduaWZpY2FudGx5XG4vLyBwZW5hbGl6ZWQuIE9uIHRoZSBvdGhlciBoYW5kLCBhIG5vbi1vdmVybGFwcGluZyBib3ggd2lsbCBub3QgYmUgcGVuYWxpemVkLlxuZnVuY3Rpb24gc3VwcHJlc3NXZWlnaHQoaW91VGhyZXNob2xkOiBudW1iZXIsIHNjYWxlOiBudW1iZXIsIGlvdTogbnVtYmVyKSB7XG4gIGNvbnN0IHdlaWdodCA9IE1hdGguZXhwKHNjYWxlICogaW91ICogaW91KTtcbiAgcmV0dXJuIGlvdSA8PSBpb3VUaHJlc2hvbGQgPyB3ZWlnaHQgOiAwLjA7XG59XG5cbmZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IoYzE6IENhbmRpZGF0ZSwgYzI6IENhbmRpZGF0ZSkge1xuICAvLyBGb3Igb2JqZWN0cyB3aXRoIHNhbWUgc2NvcmVzLCB3ZSBtYWtlIHRoZSBvYmplY3Qgd2l0aCB0aGUgbGFyZ2VyIGluZGV4IGdvXG4gIC8vIGZpcnN0LiBJbiBhbiBhcnJheSB0aGF0IHBvcHMgZnJvbSB0aGUgZW5kLCB0aGlzIG1lYW5zIHRoYXQgdGhlIG9iamVjdCB3aXRoXG4gIC8vIHRoZSBzbWFsbGVyIGluZGV4IHdpbGwgYmUgcG9wcGVkIGZpcnN0LiBUaGlzIGVuc3VyZXMgdGhlIHNhbWUgb3V0cHV0IGFzXG4gIC8vIHRoZSBUZW5zb3JGbG93IHB5dGhvbiB2ZXJzaW9uLlxuICByZXR1cm4gKGMxLnNjb3JlIC0gYzIuc2NvcmUpIHx8XG4gICAgICAoKGMxLnNjb3JlID09PSBjMi5zY29yZSkgJiYgKGMyLmJveEluZGV4IC0gYzEuYm94SW5kZXgpKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { nonMaxSuppressionV3Impl } from '../../backends/non_max_suppression_impl';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { tensor1d } from '../tensor1d';\n/**\n * Performs non maximum suppression of bounding boxes based on\n * iou (intersection over union).\n *\n * This is the async version of `nonMaxSuppression`\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n *     the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n *     Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n *     on score. Defaults to -inf, which means any score is accepted.\n * @return A 1D tensor with the selected box indices.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nasync function nonMaxSuppressionAsync_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY) {\n    const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n    const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n    const inputs = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold);\n    maxOutputSize = inputs.maxOutputSize;\n    iouThreshold = inputs.iouThreshold;\n    scoreThreshold = inputs.scoreThreshold;\n    const boxesAndScores = await Promise.all([$boxes.data(), $scores.data()]);\n    const boxesVals = boxesAndScores[0];\n    const scoresVals = boxesAndScores[1];\n    // We call a cpu based impl directly with the typedarray data  here rather\n    // than a kernel because all kernels are synchronous (and thus cannot await\n    // .data()).\n    const { selectedIndices } = nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold);\n    if ($boxes !== boxes) {\n        $boxes.dispose();\n    }\n    if ($scores !== scores) {\n        $scores.dispose();\n    }\n    return tensor1d(selectedIndices, 'int32');\n}\nexport const nonMaxSuppressionAsync = nonMaxSuppressionAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl9hc3luYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2ltYWdlL25vbl9tYXhfc3VwcHJlc3Npb25fYXN5bmMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFFaEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFckM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FtQkc7QUFDSCxLQUFLLFVBQVUsdUJBQXVCLENBQ2xDLEtBQTBCLEVBQUUsTUFBMkIsRUFDdkQsYUFBcUIsRUFBRSxZQUFZLEdBQUcsR0FBRyxFQUN6QyxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQjtJQUMzQyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFFNUUsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQ2hDLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUNsRSxhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUNyQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNuQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUV2QyxNQUFNLGNBQWMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJDLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsWUFBWTtJQUNaLE1BQU0sRUFBQyxlQUFlLEVBQUMsR0FBRyx1QkFBdUIsQ0FDN0MsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hFLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtRQUNwQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbEI7SUFDRCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7UUFDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ25CO0lBRUQsT0FBTyxRQUFRLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblYzSW1wbH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7bm9uTWF4U3VwcFNhbml0eUNoZWNrfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQge3RlbnNvcjFkfSBmcm9tICcuLi90ZW5zb3IxZCc7XG5cbi8qKlxuICogUGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIFRoaXMgaXMgdGhlIGFzeW5jIHZlcnNpb24gb2YgYG5vbk1heFN1cHByZXNzaW9uYFxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEByZXR1cm4gQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5hc3luYyBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvbkFzeW5jXyhcbiAgICBib3hlczogVGVuc29yMkR8VGVuc29yTGlrZSwgc2NvcmVzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIG1heE91dHB1dFNpemU6IG51bWJlciwgaW91VGhyZXNob2xkID0gMC41LFxuICAgIHNjb3JlVGhyZXNob2xkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKTogUHJvbWlzZTxUZW5zb3IxRD4ge1xuICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcblxuICBjb25zdCBpbnB1dHMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgICAkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuICBtYXhPdXRwdXRTaXplID0gaW5wdXRzLm1heE91dHB1dFNpemU7XG4gIGlvdVRocmVzaG9sZCA9IGlucHV0cy5pb3VUaHJlc2hvbGQ7XG4gIHNjb3JlVGhyZXNob2xkID0gaW5wdXRzLnNjb3JlVGhyZXNob2xkO1xuXG4gIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gIGNvbnN0IGJveGVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzBdO1xuICBjb25zdCBzY29yZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMV07XG5cbiAgLy8gV2UgY2FsbCBhIGNwdSBiYXNlZCBpbXBsIGRpcmVjdGx5IHdpdGggdGhlIHR5cGVkYXJyYXkgZGF0YSAgaGVyZSByYXRoZXJcbiAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gIC8vIC5kYXRhKCkpLlxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzfSA9IG5vbk1heFN1cHByZXNzaW9uVjNJbXBsKFxuICAgICAgYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkKTtcbiAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAkYm94ZXMuZGlzcG9zZSgpO1xuICB9XG4gIGlmICgkc2NvcmVzICE9PSBzY29yZXMpIHtcbiAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHJldHVybiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpO1xufVxuXG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25Bc3luYyA9IG5vbk1heFN1cHByZXNzaW9uQXN5bmNfO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { NonMaxSuppressionV5 } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { op } from '../operation';\n/**\n * Performs non maximum suppression of bounding boxes based on\n * iou (intersection over union).\n *\n * This op also supports a Soft-NMS mode (cf.\n * Bodla et al, https://arxiv.org/abs/1704.04503) where boxes reduce the score\n * of other overlapping boxes, therefore favoring different regions of the image\n * with high scores. To enable this Soft-NMS mode, set the `softNmsSigma`\n * parameter to be larger than 0.\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n *     the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n *     Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n *     on score. Defaults to -inf, which means any score is accepted.\n * @param softNmsSigma A float representing the sigma parameter for Soft NMS.\n *     When sigma is 0, it falls back to nonMaxSuppression.\n * @return A map with the following properties:\n *     - selectedIndices: A 1D tensor with the selected box indices.\n *     - selectedScores: A 1D tensor with the corresponding scores for each\n *       selected box.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction nonMaxSuppressionWithScore_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY, softNmsSigma = 0.0) {\n    const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression');\n    const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression');\n    const params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n    maxOutputSize = params.maxOutputSize;\n    iouThreshold = params.iouThreshold;\n    scoreThreshold = params.scoreThreshold;\n    softNmsSigma = params.softNmsSigma;\n    const inputs = { boxes: $boxes, scores: $scores };\n    const attrs = { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const result = ENGINE.runKernel(NonMaxSuppressionV5, inputs, attrs);\n    return { selectedIndices: result[0], selectedScores: result[1] };\n}\nexport const nonMaxSuppressionWithScore = op({ nonMaxSuppressionWithScore_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLG1CQUFtQixFQUFzRCxNQUFNLG9CQUFvQixDQUFDO0FBSTVHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd0RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsU0FBUywyQkFBMkIsQ0FDaEMsS0FBMEIsRUFBRSxNQUEyQixFQUN2RCxhQUFxQixFQUFFLFlBQVksR0FBRyxHQUFHLEVBQ3pDLGNBQWMsR0FBRyxNQUFNLENBQUMsaUJBQWlCLEVBQ3pDLFlBQVksR0FBRyxHQUFHO0lBQ3BCLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUV2RSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FDaEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFDNUQsWUFBWSxDQUFDLENBQUM7SUFDbEIsYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDckMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFDbkMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdkMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxZQUFZLENBQUM7SUFFbkMsTUFBTSxNQUFNLEdBQThCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQ1AsRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUMsQ0FBQztJQUVoRSwwREFBMEQ7SUFDMUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixtQkFBbUIsRUFBRSxNQUE4QixFQUNuRCxLQUEyQixDQUFhLENBQUM7SUFFNUQsT0FBTyxFQUFDLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBRyxFQUFFLENBQUMsRUFBQywyQkFBMkIsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtOb25NYXhTdXBwcmVzc2lvblY1LCBOb25NYXhTdXBwcmVzc2lvblY1QXR0cnMsIE5vbk1heFN1cHByZXNzaW9uVjVJbnB1dHN9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4vLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi8uLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuaW1wb3J0IHtub25NYXhTdXBwU2FuaXR5Q2hlY2t9IGZyb20gJy4uL25vbm1heF91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogUGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLlxuICpcbiAqIFRoaXMgb3AgYWxzbyBzdXBwb3J0cyBhIFNvZnQtTk1TIG1vZGUgKGNmLlxuICogQm9kbGEgZXQgYWwsIGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA0LjA0NTAzKSB3aGVyZSBib3hlcyByZWR1Y2UgdGhlIHNjb3JlXG4gKiBvZiBvdGhlciBvdmVybGFwcGluZyBib3hlcywgdGhlcmVmb3JlIGZhdm9yaW5nIGRpZmZlcmVudCByZWdpb25zIG9mIHRoZSBpbWFnZVxuICogd2l0aCBoaWdoIHNjb3Jlcy4gVG8gZW5hYmxlIHRoaXMgU29mdC1OTVMgbW9kZSwgc2V0IHRoZSBgc29mdE5tc1NpZ21hYFxuICogcGFyYW1ldGVyIHRvIGJlIGxhcmdlciB0aGFuIDAuXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHNvZnRObXNTaWdtYSBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgc2lnbWEgcGFyYW1ldGVyIGZvciBTb2Z0IE5NUy5cbiAqICAgICBXaGVuIHNpZ21hIGlzIDAsIGl0IGZhbGxzIGJhY2sgdG8gbm9uTWF4U3VwcHJlc3Npb24uXG4gKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgIC0gc2VsZWN0ZWRJbmRpY2VzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBzZWxlY3RlZCBib3ggaW5kaWNlcy5cbiAqICAgICAtIHNlbGVjdGVkU2NvcmVzOiBBIDFEIHRlbnNvciB3aXRoIHRoZSBjb3JyZXNwb25kaW5nIHNjb3JlcyBmb3IgZWFjaFxuICogICAgICAgc2VsZWN0ZWQgYm94LlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVfKFxuICAgIGJveGVzOiBUZW5zb3IyRHxUZW5zb3JMaWtlLCBzY29yZXM6IFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLCBpb3VUaHJlc2hvbGQgPSAwLjUsXG4gICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgc29mdE5tc1NpZ21hID0gMC4wKTogTmFtZWRUZW5zb3JNYXAge1xuICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuICBjb25zdCAkc2NvcmVzID0gY29udmVydFRvVGVuc29yKHNjb3JlcywgJ3Njb3JlcycsICdub25NYXhTdXBwcmVzc2lvbicpO1xuXG4gIGNvbnN0IHBhcmFtcyA9IG5vbk1heFN1cHBTYW5pdHlDaGVjayhcbiAgICAgICRib3hlcywgJHNjb3JlcywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCxcbiAgICAgIHNvZnRObXNTaWdtYSk7XG4gIG1heE91dHB1dFNpemUgPSBwYXJhbXMubWF4T3V0cHV0U2l6ZTtcbiAgaW91VGhyZXNob2xkID0gcGFyYW1zLmlvdVRocmVzaG9sZDtcbiAgc2NvcmVUaHJlc2hvbGQgPSBwYXJhbXMuc2NvcmVUaHJlc2hvbGQ7XG4gIHNvZnRObXNTaWdtYSA9IHBhcmFtcy5zb2Z0Tm1zU2lnbWE7XG5cbiAgY29uc3QgaW5wdXRzOiBOb25NYXhTdXBwcmVzc2lvblY1SW5wdXRzID0ge2JveGVzOiAkYm94ZXMsIHNjb3JlczogJHNjb3Jlc307XG4gIGNvbnN0IGF0dHJzOiBOb25NYXhTdXBwcmVzc2lvblY1QXR0cnMgPVxuICAgICAge21heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXN1bHQgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgICAgTm9uTWF4U3VwcHJlc3Npb25WNSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUZW5zb3JbXTtcblxuICByZXR1cm4ge3NlbGVjdGVkSW5kaWNlczogcmVzdWx0WzBdLCBzZWxlY3RlZFNjb3JlczogcmVzdWx0WzFdfTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlID0gb3Aoe25vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { nonMaxSuppressionV5Impl } from '../../backends/non_max_suppression_impl';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { tensor1d } from '../tensor1d';\n/**\n * Asynchronously performs non maximum suppression of bounding boxes based on\n * iou (intersection over union).\n *\n * This op also supports a Soft-NMS mode (cf.\n * Bodla et al, https://arxiv.org/abs/1704.04503) where boxes reduce the score\n * of other overlapping boxes, therefore favoring different regions of the image\n * with high scores. To enable this Soft-NMS mode, set the `softNmsSigma`\n * parameter to be larger than 0.\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n *     the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n *     Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n *     on score. Defaults to -inf, which means any score is accepted.\n * @param softNmsSigma A float representing the sigma parameter for Soft NMS.\n *     When sigma is 0, it falls back to nonMaxSuppression.\n * @return A map with the following properties:\n *     - selectedIndices: A 1D tensor with the selected box indices.\n *     - selectedScores: A 1D tensor with the corresponding scores for each\n *       selected box.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nasync function nonMaxSuppressionWithScoreAsync_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY, softNmsSigma = 0.0) {\n    const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n    const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n    const params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n    maxOutputSize = params.maxOutputSize;\n    iouThreshold = params.iouThreshold;\n    scoreThreshold = params.scoreThreshold;\n    softNmsSigma = params.softNmsSigma;\n    const boxesAndScores = await Promise.all([$boxes.data(), $scores.data()]);\n    const boxesVals = boxesAndScores[0];\n    const scoresVals = boxesAndScores[1];\n    // We call a cpu based impl directly with the typedarray data  here rather\n    // than a kernel because all kernels are synchronous (and thus cannot await\n    // .data()).\n    const { selectedIndices, selectedScores } = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n    if ($boxes !== boxes) {\n        $boxes.dispose();\n    }\n    if ($scores !== scores) {\n        $scores.dispose();\n    }\n    return {\n        selectedIndices: tensor1d(selectedIndices, 'int32'),\n        selectedScores: tensor1d(selectedScores)\n    };\n}\nexport const nonMaxSuppressionWithScoreAsync = nonMaxSuppressionWithScoreAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlX2FzeW5jLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlX2FzeW5jLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHlDQUF5QyxDQUFDO0FBR2hGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBNEJHO0FBQ0gsS0FBSyxVQUFVLGdDQUFnQyxDQUMzQyxLQUEwQixFQUFFLE1BQTJCLEVBQ3ZELGFBQXFCLEVBQUUsWUFBWSxHQUFHLEdBQUcsRUFDekMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFDekMsWUFBWSxHQUFHLEdBQUc7SUFDcEIsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsd0JBQXdCLENBQUMsQ0FBQztJQUN6RSxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBRTVFLE1BQU0sTUFBTSxHQUFHLHFCQUFxQixDQUNoQyxNQUFNLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUM1RCxZQUFZLENBQUMsQ0FBQztJQUNsQixhQUFhLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUNyQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUNuQyxjQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUN2QyxZQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUVuQyxNQUFNLGNBQWMsR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUMxRSxNQUFNLFNBQVMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEMsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJDLDBFQUEwRTtJQUMxRSwyRUFBMkU7SUFDM0UsWUFBWTtJQUNaLE1BQU0sRUFBQyxlQUFlLEVBQUUsY0FBYyxFQUFDLEdBQUcsdUJBQXVCLENBQzdELFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQ2xFLFlBQVksQ0FBQyxDQUFDO0lBRWxCLElBQUksTUFBTSxLQUFLLEtBQUssRUFBRTtRQUNwQixNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbEI7SUFDRCxJQUFJLE9BQU8sS0FBSyxNQUFNLEVBQUU7UUFDdEIsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO0tBQ25CO0lBRUQsT0FBTztRQUNMLGVBQWUsRUFBRSxRQUFRLENBQUMsZUFBZSxFQUFFLE9BQU8sQ0FBQztRQUNuRCxjQUFjLEVBQUUsUUFBUSxDQUFDLGNBQWMsQ0FBQztLQUN6QyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLGdDQUFnQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY1SW1wbH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge25vbk1heFN1cHBTYW5pdHlDaGVja30gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHt0ZW5zb3IxZH0gZnJvbSAnLi4vdGVuc29yMWQnO1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHBlcmZvcm1zIG5vbiBtYXhpbXVtIHN1cHByZXNzaW9uIG9mIGJvdW5kaW5nIGJveGVzIGJhc2VkIG9uXG4gKiBpb3UgKGludGVyc2VjdGlvbiBvdmVyIHVuaW9uKS5cbiAqXG4gKiBUaGlzIG9wIGFsc28gc3VwcG9ydHMgYSBTb2Z0LU5NUyBtb2RlIChjZi5cbiAqIEJvZGxhIGV0IGFsLCBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNC4wNDUwMykgd2hlcmUgYm94ZXMgcmVkdWNlIHRoZSBzY29yZVxuICogb2Ygb3RoZXIgb3ZlcmxhcHBpbmcgYm94ZXMsIHRoZXJlZm9yZSBmYXZvcmluZyBkaWZmZXJlbnQgcmVnaW9ucyBvZiB0aGUgaW1hZ2VcbiAqIHdpdGggaGlnaCBzY29yZXMuIFRvIGVuYWJsZSB0aGlzIFNvZnQtTk1TIG1vZGUsIHNldCB0aGUgYHNvZnRObXNTaWdtYWBcbiAqIHBhcmFtZXRlciB0byBiZSBsYXJnZXIgdGhhbiAwLlxuICpcbiAqIEBwYXJhbSBib3hlcyBhIDJkIHRlbnNvciBvZiBzaGFwZSBgW251bUJveGVzLCA0XWAuIEVhY2ggZW50cnkgaXNcbiAqICAgICBgW3kxLCB4MSwgeTIsIHgyXWAsIHdoZXJlIGAoeTEsIHgxKWAgYW5kIGAoeTIsIHgyKWAgYXJlIHRoZSBjb3JuZXJzIG9mXG4gKiAgICAgdGhlIGJvdW5kaW5nIGJveC5cbiAqIEBwYXJhbSBzY29yZXMgYSAxZCB0ZW5zb3IgcHJvdmlkaW5nIHRoZSBib3ggc2NvcmVzIG9mIHNoYXBlIGBbbnVtQm94ZXNdYC5cbiAqIEBwYXJhbSBtYXhPdXRwdXRTaXplIFRoZSBtYXhpbXVtIG51bWJlciBvZiBib3hlcyB0byBiZSBzZWxlY3RlZC5cbiAqIEBwYXJhbSBpb3VUaHJlc2hvbGQgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hldGhlclxuICogICAgIGJveGVzIG92ZXJsYXAgdG9vIG11Y2ggd2l0aCByZXNwZWN0IHRvIElPVS4gTXVzdCBiZSBiZXR3ZWVuIFswLCAxXS5cbiAqICAgICBEZWZhdWx0cyB0byAwLjUgKDUwJSBib3ggb3ZlcmxhcCkuXG4gKiBAcGFyYW0gc2NvcmVUaHJlc2hvbGQgQSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZW4gdG8gcmVtb3ZlIGJveGVzIGJhc2VkXG4gKiAgICAgb24gc2NvcmUuIERlZmF1bHRzIHRvIC1pbmYsIHdoaWNoIG1lYW5zIGFueSBzY29yZSBpcyBhY2NlcHRlZC5cbiAqIEBwYXJhbSBzb2Z0Tm1zU2lnbWEgQSBmbG9hdCByZXByZXNlbnRpbmcgdGhlIHNpZ21hIHBhcmFtZXRlciBmb3IgU29mdCBOTVMuXG4gKiAgICAgV2hlbiBzaWdtYSBpcyAwLCBpdCBmYWxscyBiYWNrIHRvIG5vbk1heFN1cHByZXNzaW9uLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIHNlbGVjdGVkSW5kaWNlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKiAgICAgLSBzZWxlY3RlZFNjb3JlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgY29ycmVzcG9uZGluZyBzY29yZXMgZm9yIGVhY2hcbiAqICAgICAgIHNlbGVjdGVkIGJveC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmFzeW5jIGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmNfKFxuICAgIGJveGVzOiBUZW5zb3IyRHxUZW5zb3JMaWtlLCBzY29yZXM6IFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLCBpb3VUaHJlc2hvbGQgPSAwLjUsXG4gICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgc29mdE5tc1NpZ21hID0gMC4wKTogUHJvbWlzZTxOYW1lZFRlbnNvck1hcD4ge1xuICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcblxuICBjb25zdCBwYXJhbXMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgICAkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsXG4gICAgICBzb2Z0Tm1zU2lnbWEpO1xuICBtYXhPdXRwdXRTaXplID0gcGFyYW1zLm1heE91dHB1dFNpemU7XG4gIGlvdVRocmVzaG9sZCA9IHBhcmFtcy5pb3VUaHJlc2hvbGQ7XG4gIHNjb3JlVGhyZXNob2xkID0gcGFyYW1zLnNjb3JlVGhyZXNob2xkO1xuICBzb2Z0Tm1zU2lnbWEgPSBwYXJhbXMuc29mdE5tc1NpZ21hO1xuXG4gIGNvbnN0IGJveGVzQW5kU2NvcmVzID0gYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG4gIGNvbnN0IGJveGVzVmFscyA9IGJveGVzQW5kU2NvcmVzWzBdO1xuICBjb25zdCBzY29yZXNWYWxzID0gYm94ZXNBbmRTY29yZXNbMV07XG5cbiAgLy8gV2UgY2FsbCBhIGNwdSBiYXNlZCBpbXBsIGRpcmVjdGx5IHdpdGggdGhlIHR5cGVkYXJyYXkgZGF0YSAgaGVyZSByYXRoZXJcbiAgLy8gdGhhbiBhIGtlcm5lbCBiZWNhdXNlIGFsbCBrZXJuZWxzIGFyZSBzeW5jaHJvbm91cyAoYW5kIHRodXMgY2Fubm90IGF3YWl0XG4gIC8vIC5kYXRhKCkpLlxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzLCBzZWxlY3RlZFNjb3Jlc30gPSBub25NYXhTdXBwcmVzc2lvblY1SW1wbChcbiAgICAgIGJveGVzVmFscywgc2NvcmVzVmFscywgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCxcbiAgICAgIHNvZnRObXNTaWdtYSk7XG5cbiAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAkYm94ZXMuZGlzcG9zZSgpO1xuICB9XG4gIGlmICgkc2NvcmVzICE9PSBzY29yZXMpIHtcbiAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgIHNlbGVjdGVkU2NvcmVzOiB0ZW5zb3IxZChzZWxlY3RlZFNjb3JlcylcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uV2l0aFNjb3JlQXN5bmMgPSBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jXztcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { NonMaxSuppressionV4 } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { op } from '../operation';\n/**\n * Asynchronously performs non maximum suppression of bounding boxes based on\n * iou (intersection over union), with an option to pad results.\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n *     the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n *     Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n *     on score. Defaults to -inf, which means any score is accepted.\n * @param padToMaxOutputSize Defaults to false. If true, size of output\n *     `selectedIndices` is padded to maxOutputSize.\n * @return A map with the following properties:\n *     - selectedIndices: A 1D tensor with the selected box indices.\n *     - validOutputs: A scalar denoting how many elements in `selectedIndices`\n *       are valid. Valid elements occur first, then padding.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction nonMaxSuppressionPadded_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY, padToMaxOutputSize = false) {\n    const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppression');\n    const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppression');\n    const params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, null /* softNmsSigma */);\n    const $maxOutputSize = params.maxOutputSize;\n    const $iouThreshold = params.iouThreshold;\n    const $scoreThreshold = params.scoreThreshold;\n    const inputs = { boxes: $boxes, scores: $scores };\n    const attrs = {\n        maxOutputSize: $maxOutputSize,\n        iouThreshold: $iouThreshold,\n        scoreThreshold: $scoreThreshold,\n        padToMaxOutputSize\n    };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const result = ENGINE.runKernel(NonMaxSuppressionV4, inputs, attrs);\n    return { selectedIndices: result[0], validOutputs: result[1] };\n}\nexport const nonMaxSuppressionPadded = op({ nonMaxSuppressionPadded_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl9wYWRkZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxtQkFBbUIsRUFBc0QsTUFBTSxvQkFBb0IsQ0FBQztBQUk1RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHdEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNCRztBQUNILFNBQVMsd0JBQXdCLENBQzdCLEtBQTBCLEVBQUUsTUFBMkIsRUFDdkQsYUFBcUIsRUFBRSxZQUFZLEdBQUcsR0FBRyxFQUN6QyxjQUFjLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixFQUN6QyxrQkFBa0IsR0FBRyxLQUFLO0lBQzVCLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDcEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUV2RSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FDaEMsTUFBTSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFDNUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7SUFDN0IsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQztJQUM1QyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO0lBQzFDLE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFFOUMsTUFBTSxNQUFNLEdBQThCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDM0UsTUFBTSxLQUFLLEdBQTZCO1FBQ3RDLGFBQWEsRUFBRSxjQUFjO1FBQzdCLFlBQVksRUFBRSxhQUFhO1FBQzNCLGNBQWMsRUFBRSxlQUFlO1FBQy9CLGtCQUFrQjtLQUNuQixDQUFDO0lBRUYsMERBQTBEO0lBQzFELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osbUJBQW1CLEVBQUUsTUFBOEIsRUFDbkQsS0FBMkIsQ0FBYSxDQUFDO0lBRTVELE9BQU8sRUFBQyxlQUFlLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDLEVBQUMsd0JBQXdCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7Tm9uTWF4U3VwcHJlc3Npb25WNCwgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uLy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7bm9uTWF4U3VwcFNhbml0eUNoZWNrfSBmcm9tICcuLi9ub25tYXhfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEFzeW5jaHJvbm91c2x5IHBlcmZvcm1zIG5vbiBtYXhpbXVtIHN1cHByZXNzaW9uIG9mIGJvdW5kaW5nIGJveGVzIGJhc2VkIG9uXG4gKiBpb3UgKGludGVyc2VjdGlvbiBvdmVyIHVuaW9uKSwgd2l0aCBhbiBvcHRpb24gdG8gcGFkIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIGJveGVzIGEgMmQgdGVuc29yIG9mIHNoYXBlIGBbbnVtQm94ZXMsIDRdYC4gRWFjaCBlbnRyeSBpc1xuICogICAgIGBbeTEsIHgxLCB5MiwgeDJdYCwgd2hlcmUgYCh5MSwgeDEpYCBhbmQgYCh5MiwgeDIpYCBhcmUgdGhlIGNvcm5lcnMgb2ZcbiAqICAgICB0aGUgYm91bmRpbmcgYm94LlxuICogQHBhcmFtIHNjb3JlcyBhIDFkIHRlbnNvciBwcm92aWRpbmcgdGhlIGJveCBzY29yZXMgb2Ygc2hhcGUgYFtudW1Cb3hlc11gLlxuICogQHBhcmFtIG1heE91dHB1dFNpemUgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJveGVzIHRvIGJlIHNlbGVjdGVkLlxuICogQHBhcmFtIGlvdVRocmVzaG9sZCBBIGZsb2F0IHJlcHJlc2VudGluZyB0aGUgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGV0aGVyXG4gKiAgICAgYm94ZXMgb3ZlcmxhcCB0b28gbXVjaCB3aXRoIHJlc3BlY3QgdG8gSU9VLiBNdXN0IGJlIGJldHdlZW4gWzAsIDFdLlxuICogICAgIERlZmF1bHRzIHRvIDAuNSAoNTAlIGJveCBvdmVybGFwKS5cbiAqIEBwYXJhbSBzY29yZVRocmVzaG9sZCBBIHRocmVzaG9sZCBmb3IgZGVjaWRpbmcgd2hlbiB0byByZW1vdmUgYm94ZXMgYmFzZWRcbiAqICAgICBvbiBzY29yZS4gRGVmYXVsdHMgdG8gLWluZiwgd2hpY2ggbWVhbnMgYW55IHNjb3JlIGlzIGFjY2VwdGVkLlxuICogQHBhcmFtIHBhZFRvTWF4T3V0cHV0U2l6ZSBEZWZhdWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgc2l6ZSBvZiBvdXRwdXRcbiAqICAgICBgc2VsZWN0ZWRJbmRpY2VzYCBpcyBwYWRkZWQgdG8gbWF4T3V0cHV0U2l6ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBzZWxlY3RlZEluZGljZXM6IEEgMUQgdGVuc29yIHdpdGggdGhlIHNlbGVjdGVkIGJveCBpbmRpY2VzLlxuICogICAgIC0gdmFsaWRPdXRwdXRzOiBBIHNjYWxhciBkZW5vdGluZyBob3cgbWFueSBlbGVtZW50cyBpbiBgc2VsZWN0ZWRJbmRpY2VzYFxuICogICAgICAgYXJlIHZhbGlkLiBWYWxpZCBlbGVtZW50cyBvY2N1ciBmaXJzdCwgdGhlbiBwYWRkaW5nLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25QYWRkZWRfKFxuICAgIGJveGVzOiBUZW5zb3IyRHxUZW5zb3JMaWtlLCBzY29yZXM6IFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgbWF4T3V0cHV0U2l6ZTogbnVtYmVyLCBpb3VUaHJlc2hvbGQgPSAwLjUsXG4gICAgc2NvcmVUaHJlc2hvbGQgPSBOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFksXG4gICAgcGFkVG9NYXhPdXRwdXRTaXplID0gZmFsc2UpOiBOYW1lZFRlbnNvck1hcCB7XG4gIGNvbnN0ICRib3hlcyA9IGNvbnZlcnRUb1RlbnNvcihib3hlcywgJ2JveGVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG4gIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uJyk7XG5cbiAgY29uc3QgcGFyYW1zID0gbm9uTWF4U3VwcFNhbml0eUNoZWNrKFxuICAgICAgJGJveGVzLCAkc2NvcmVzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLFxuICAgICAgbnVsbCAvKiBzb2Z0Tm1zU2lnbWEgKi8pO1xuICBjb25zdCAkbWF4T3V0cHV0U2l6ZSA9IHBhcmFtcy5tYXhPdXRwdXRTaXplO1xuICBjb25zdCAkaW91VGhyZXNob2xkID0gcGFyYW1zLmlvdVRocmVzaG9sZDtcbiAgY29uc3QgJHNjb3JlVGhyZXNob2xkID0gcGFyYW1zLnNjb3JlVGhyZXNob2xkO1xuXG4gIGNvbnN0IGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WNElucHV0cyA9IHtib3hlczogJGJveGVzLCBzY29yZXM6ICRzY29yZXN9O1xuICBjb25zdCBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzID0ge1xuICAgIG1heE91dHB1dFNpemU6ICRtYXhPdXRwdXRTaXplLFxuICAgIGlvdVRocmVzaG9sZDogJGlvdVRocmVzaG9sZCxcbiAgICBzY29yZVRocmVzaG9sZDogJHNjb3JlVGhyZXNob2xkLFxuICAgIHBhZFRvTWF4T3V0cHV0U2l6ZVxuICB9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzdWx0ID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgICAgIE5vbk1heFN1cHByZXNzaW9uVjQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yW107XG5cbiAgcmV0dXJuIHtzZWxlY3RlZEluZGljZXM6IHJlc3VsdFswXSwgdmFsaWRPdXRwdXRzOiByZXN1bHRbMV19O1xufVxuXG5leHBvcnQgY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25QYWRkZWQgPSBvcCh7bm9uTWF4U3VwcHJlc3Npb25QYWRkZWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { nonMaxSuppressionV4Impl } from '../../backends/non_max_suppression_impl';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { nonMaxSuppSanityCheck } from '../nonmax_util';\nimport { scalar } from '../scalar';\nimport { tensor1d } from '../tensor1d';\n/**\n * Asynchronously performs non maximum suppression of bounding boxes based on\n * iou (intersection over union), with an option to pad results.\n *\n * @param boxes a 2d tensor of shape `[numBoxes, 4]`. Each entry is\n *     `[y1, x1, y2, x2]`, where `(y1, x1)` and `(y2, x2)` are the corners of\n *     the bounding box.\n * @param scores a 1d tensor providing the box scores of shape `[numBoxes]`.\n * @param maxOutputSize The maximum number of boxes to be selected.\n * @param iouThreshold A float representing the threshold for deciding whether\n *     boxes overlap too much with respect to IOU. Must be between [0, 1].\n *     Defaults to 0.5 (50% box overlap).\n * @param scoreThreshold A threshold for deciding when to remove boxes based\n *     on score. Defaults to -inf, which means any score is accepted.\n * @param padToMaxOutputSize Defaults to false. If true, size of output\n *     `selectedIndices` is padded to maxOutputSize.\n * @return A map with the following properties:\n *     - selectedIndices: A 1D tensor with the selected box indices.\n *     - validOutputs: A scalar denoting how many elements in `selectedIndices`\n *       are valid. Valid elements occur first, then padding.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nasync function nonMaxSuppressionPaddedAsync_(boxes, scores, maxOutputSize, iouThreshold = 0.5, scoreThreshold = Number.NEGATIVE_INFINITY, padToMaxOutputSize = false) {\n    const $boxes = convertToTensor(boxes, 'boxes', 'nonMaxSuppressionAsync');\n    const $scores = convertToTensor(scores, 'scores', 'nonMaxSuppressionAsync');\n    const params = nonMaxSuppSanityCheck($boxes, $scores, maxOutputSize, iouThreshold, scoreThreshold, null /* softNmsSigma */);\n    const $maxOutputSize = params.maxOutputSize;\n    const $iouThreshold = params.iouThreshold;\n    const $scoreThreshold = params.scoreThreshold;\n    const [boxesVals, scoresVals] = await Promise.all([$boxes.data(), $scores.data()]);\n    // We call a cpu based impl directly with the typedarray data here rather\n    // than a kernel because all kernels are synchronous (and thus cannot await\n    // .data()).\n    const { selectedIndices, validOutputs } = nonMaxSuppressionV4Impl(boxesVals, scoresVals, $maxOutputSize, $iouThreshold, $scoreThreshold, padToMaxOutputSize);\n    if ($boxes !== boxes) {\n        $boxes.dispose();\n    }\n    if ($scores !== scores) {\n        $scores.dispose();\n    }\n    return {\n        selectedIndices: tensor1d(selectedIndices, 'int32'),\n        validOutputs: scalar(validOutputs, 'int32')\n    };\n}\nexport const nonMaxSuppressionPaddedAsync = nonMaxSuppressionPaddedAsync_;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9uX21heF9zdXBwcmVzc2lvbl9wYWRkZWRfYXN5bmMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZF9hc3luYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUdoRixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDckQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXJDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBc0JHO0FBQ0gsS0FBSyxVQUFVLDZCQUE2QixDQUN4QyxLQUEwQixFQUFFLE1BQTJCLEVBQ3ZELGFBQXFCLEVBQUUsWUFBWSxHQUFHLEdBQUcsRUFDekMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsRUFDekMsa0JBQWtCLEdBQUcsS0FBSztJQUM1QixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFFNUUsTUFBTSxNQUFNLEdBQUcscUJBQXFCLENBQ2hDLE1BQU0sRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQzVELElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7SUFDNUMsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQztJQUMxQyxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDO0lBRTlDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsVUFBVSxDQUFDLEdBQ3pCLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXZELHlFQUF5RTtJQUN6RSwyRUFBMkU7SUFDM0UsWUFBWTtJQUNaLE1BQU0sRUFBQyxlQUFlLEVBQUUsWUFBWSxFQUFDLEdBQUcsdUJBQXVCLENBQzNELFNBQVMsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxlQUFlLEVBQ3JFLGtCQUFrQixDQUFDLENBQUM7SUFFeEIsSUFBSSxNQUFNLEtBQUssS0FBSyxFQUFFO1FBQ3BCLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztLQUNsQjtJQUNELElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtRQUN0QixPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDbkI7SUFFRCxPQUFPO1FBQ0wsZUFBZSxFQUFFLFFBQVEsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDO1FBQ25ELFlBQVksRUFBRSxNQUFNLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQztLQUM1QyxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFHLDZCQUE2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY0SW1wbH0gZnJvbSAnLi4vLi4vYmFja2VuZHMvbm9uX21heF9zdXBwcmVzc2lvbl9pbXBsJztcbmltcG9ydCB7VGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge25vbk1heFN1cHBTYW5pdHlDaGVja30gZnJvbSAnLi4vbm9ubWF4X3V0aWwnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQge3RlbnNvcjFkfSBmcm9tICcuLi90ZW5zb3IxZCc7XG5cbi8qKlxuICogQXN5bmNocm9ub3VzbHkgcGVyZm9ybXMgbm9uIG1heGltdW0gc3VwcHJlc3Npb24gb2YgYm91bmRpbmcgYm94ZXMgYmFzZWQgb25cbiAqIGlvdSAoaW50ZXJzZWN0aW9uIG92ZXIgdW5pb24pLCB3aXRoIGFuIG9wdGlvbiB0byBwYWQgcmVzdWx0cy5cbiAqXG4gKiBAcGFyYW0gYm94ZXMgYSAyZCB0ZW5zb3Igb2Ygc2hhcGUgYFtudW1Cb3hlcywgNF1gLiBFYWNoIGVudHJ5IGlzXG4gKiAgICAgYFt5MSwgeDEsIHkyLCB4Ml1gLCB3aGVyZSBgKHkxLCB4MSlgIGFuZCBgKHkyLCB4MilgIGFyZSB0aGUgY29ybmVycyBvZlxuICogICAgIHRoZSBib3VuZGluZyBib3guXG4gKiBAcGFyYW0gc2NvcmVzIGEgMWQgdGVuc29yIHByb3ZpZGluZyB0aGUgYm94IHNjb3JlcyBvZiBzaGFwZSBgW251bUJveGVzXWAuXG4gKiBAcGFyYW0gbWF4T3V0cHV0U2l6ZSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYm94ZXMgdG8gYmUgc2VsZWN0ZWQuXG4gKiBAcGFyYW0gaW91VGhyZXNob2xkIEEgZmxvYXQgcmVwcmVzZW50aW5nIHRoZSB0aHJlc2hvbGQgZm9yIGRlY2lkaW5nIHdoZXRoZXJcbiAqICAgICBib3hlcyBvdmVybGFwIHRvbyBtdWNoIHdpdGggcmVzcGVjdCB0byBJT1UuIE11c3QgYmUgYmV0d2VlbiBbMCwgMV0uXG4gKiAgICAgRGVmYXVsdHMgdG8gMC41ICg1MCUgYm94IG92ZXJsYXApLlxuICogQHBhcmFtIHNjb3JlVGhyZXNob2xkIEEgdGhyZXNob2xkIGZvciBkZWNpZGluZyB3aGVuIHRvIHJlbW92ZSBib3hlcyBiYXNlZFxuICogICAgIG9uIHNjb3JlLiBEZWZhdWx0cyB0byAtaW5mLCB3aGljaCBtZWFucyBhbnkgc2NvcmUgaXMgYWNjZXB0ZWQuXG4gKiBAcGFyYW0gcGFkVG9NYXhPdXRwdXRTaXplIERlZmF1bHRzIHRvIGZhbHNlLiBJZiB0cnVlLCBzaXplIG9mIG91dHB1dFxuICogICAgIGBzZWxlY3RlZEluZGljZXNgIGlzIHBhZGRlZCB0byBtYXhPdXRwdXRTaXplLlxuICogQHJldHVybiBBIG1hcCB3aXRoIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczpcbiAqICAgICAtIHNlbGVjdGVkSW5kaWNlczogQSAxRCB0ZW5zb3Igd2l0aCB0aGUgc2VsZWN0ZWQgYm94IGluZGljZXMuXG4gKiAgICAgLSB2YWxpZE91dHB1dHM6IEEgc2NhbGFyIGRlbm90aW5nIGhvdyBtYW55IGVsZW1lbnRzIGluIGBzZWxlY3RlZEluZGljZXNgXG4gKiAgICAgICBhcmUgdmFsaWQuIFZhbGlkIGVsZW1lbnRzIG9jY3VyIGZpcnN0LCB0aGVuIHBhZGRpbmcuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5hc3luYyBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblBhZGRlZEFzeW5jXyhcbiAgICBib3hlczogVGVuc29yMkR8VGVuc29yTGlrZSwgc2NvcmVzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIG1heE91dHB1dFNpemU6IG51bWJlciwgaW91VGhyZXNob2xkID0gMC41LFxuICAgIHNjb3JlVGhyZXNob2xkID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLFxuICAgIHBhZFRvTWF4T3V0cHV0U2l6ZSA9IGZhbHNlKTogUHJvbWlzZTxOYW1lZFRlbnNvck1hcD4ge1xuICBjb25zdCAkYm94ZXMgPSBjb252ZXJ0VG9UZW5zb3IoYm94ZXMsICdib3hlcycsICdub25NYXhTdXBwcmVzc2lvbkFzeW5jJyk7XG4gIGNvbnN0ICRzY29yZXMgPSBjb252ZXJ0VG9UZW5zb3Ioc2NvcmVzLCAnc2NvcmVzJywgJ25vbk1heFN1cHByZXNzaW9uQXN5bmMnKTtcblxuICBjb25zdCBwYXJhbXMgPSBub25NYXhTdXBwU2FuaXR5Q2hlY2soXG4gICAgICAkYm94ZXMsICRzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsXG4gICAgICBudWxsIC8qIHNvZnRObXNTaWdtYSAqLyk7XG4gIGNvbnN0ICRtYXhPdXRwdXRTaXplID0gcGFyYW1zLm1heE91dHB1dFNpemU7XG4gIGNvbnN0ICRpb3VUaHJlc2hvbGQgPSBwYXJhbXMuaW91VGhyZXNob2xkO1xuICBjb25zdCAkc2NvcmVUaHJlc2hvbGQgPSBwYXJhbXMuc2NvcmVUaHJlc2hvbGQ7XG5cbiAgY29uc3QgW2JveGVzVmFscywgc2NvcmVzVmFsc10gPVxuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwoWyRib3hlcy5kYXRhKCksICRzY29yZXMuZGF0YSgpXSk7XG5cbiAgLy8gV2UgY2FsbCBhIGNwdSBiYXNlZCBpbXBsIGRpcmVjdGx5IHdpdGggdGhlIHR5cGVkYXJyYXkgZGF0YSBoZXJlIHJhdGhlclxuICAvLyB0aGFuIGEga2VybmVsIGJlY2F1c2UgYWxsIGtlcm5lbHMgYXJlIHN5bmNocm9ub3VzIChhbmQgdGh1cyBjYW5ub3QgYXdhaXRcbiAgLy8gLmRhdGEoKSkuXG4gIGNvbnN0IHtzZWxlY3RlZEluZGljZXMsIHZhbGlkT3V0cHV0c30gPSBub25NYXhTdXBwcmVzc2lvblY0SW1wbChcbiAgICAgIGJveGVzVmFscywgc2NvcmVzVmFscywgJG1heE91dHB1dFNpemUsICRpb3VUaHJlc2hvbGQsICRzY29yZVRocmVzaG9sZCxcbiAgICAgIHBhZFRvTWF4T3V0cHV0U2l6ZSk7XG5cbiAgaWYgKCRib3hlcyAhPT0gYm94ZXMpIHtcbiAgICAkYm94ZXMuZGlzcG9zZSgpO1xuICB9XG4gIGlmICgkc2NvcmVzICE9PSBzY29yZXMpIHtcbiAgICAkc2NvcmVzLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgc2VsZWN0ZWRJbmRpY2VzOiB0ZW5zb3IxZChzZWxlY3RlZEluZGljZXMsICdpbnQzMicpLFxuICAgIHZhbGlkT3V0cHV0czogc2NhbGFyKHZhbGlkT3V0cHV0cywgJ2ludDMyJylcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMgPSBub25NYXhTdXBwcmVzc2lvblBhZGRlZEFzeW5jXztcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { ResizeBilinear } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * Bilinear resize a single 3D image or a batch of 3D images to a new shape.\n *\n * @param images The images, of rank 4 or rank 3, of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param size The new shape `[newHeight, newWidth]` to resize the\n *     images to. Each channel is resized individually.\n * @param alignCorners Defaults to `false`. If true, rescale\n *     input by `(new_height - 1) / (height - 1)`, which exactly aligns the 4\n *     corners of images and resized images. If false, rescale by\n *     `new_height / height`. Treat similarly the width dimension.\n * @param halfPixelCenters Defaults to `false`. Whether to assume pixel centers\n *     are at 0.5, which would make the floating point coordinates of the top\n *     left pixel 0.5, 0.5.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction resizeBilinear_(images, size, alignCorners = false, halfPixelCenters = false) {\n    const $images = convertToTensor(images, 'images', 'resizeBilinear');\n    util.assert($images.rank === 3 || $images.rank === 4, () => `Error in resizeBilinear: x must be rank 3 or 4, but got ` +\n        `rank ${$images.rank}.`);\n    util.assert(size.length === 2, () => `Error in resizeBilinear: new shape must 2D, but got shape ` +\n        `${size}.`);\n    util.assert(halfPixelCenters === false || alignCorners === false, () => `Error in resizeBilinear: If halfPixelCenters is true, ` +\n        `alignCorners must be false.`);\n    let batchImages = $images;\n    let reshapedTo4D = false;\n    if ($images.rank === 3) {\n        reshapedTo4D = true;\n        batchImages = reshape($images, [1, $images.shape[0], $images.shape[1], $images.shape[2]]);\n    }\n    const [] = size;\n    const inputs = { images: batchImages };\n    const attrs = { alignCorners, halfPixelCenters, size };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(ResizeBilinear, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const resizeBilinear = op({ resizeBilinear_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvcmVzaXplX2JpbGluZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGNBQWMsRUFBNEMsTUFBTSxvQkFBb0IsQ0FBQztBQUk3RixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBQ0gsU0FBUyxlQUFlLENBQ3BCLE1BQW9CLEVBQUUsSUFBc0IsRUFBRSxZQUFZLEdBQUcsS0FBSyxFQUNsRSxnQkFBZ0IsR0FBRyxLQUFLO0lBQzFCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFcEUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDeEMsR0FBRyxFQUFFLENBQUMsMERBQTBEO1FBQzVELFFBQVEsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQUMsNERBQTREO1FBQzlELEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLENBQUMsTUFBTSxDQUNQLGdCQUFnQixLQUFLLEtBQUssSUFBSSxZQUFZLEtBQUssS0FBSyxFQUNwRCxHQUFHLEVBQUUsQ0FBQyx3REFBd0Q7UUFDMUQsNkJBQTZCLENBQUMsQ0FBQztJQUV2QyxJQUFJLFdBQVcsR0FBRyxPQUFtQixDQUFDO0lBQ3RDLElBQUksWUFBWSxHQUFHLEtBQUssQ0FBQztJQUN6QixJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsV0FBVyxHQUFHLE9BQU8sQ0FDakIsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6RTtJQUVELE1BQU0sRUFBRSxHQUFHLElBQUksQ0FBQztJQUVoQixNQUFNLE1BQU0sR0FBeUIsRUFBQyxNQUFNLEVBQUUsV0FBVyxFQUFDLENBQUM7SUFDM0QsTUFBTSxLQUFLLEdBQXdCLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBQyxDQUFDO0lBRTFFLDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLGNBQWMsRUFBRSxNQUE4QixFQUM5QyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBTSxDQUFDO0tBQ3RFO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtSZXNpemVCaWxpbmVhciwgUmVzaXplQmlsaW5lYXJBdHRycywgUmVzaXplQmlsaW5lYXJJbnB1dHN9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4vLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9yZXNoYXBlJztcblxuLyoqXG4gKiBCaWxpbmVhciByZXNpemUgYSBzaW5nbGUgM0QgaW1hZ2Ugb3IgYSBiYXRjaCBvZiAzRCBpbWFnZXMgdG8gYSBuZXcgc2hhcGUuXG4gKlxuICogQHBhcmFtIGltYWdlcyBUaGUgaW1hZ2VzLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNoYXBlIGBbbmV3SGVpZ2h0LCBuZXdXaWR0aF1gIHRvIHJlc2l6ZSB0aGVcbiAqICAgICBpbWFnZXMgdG8uIEVhY2ggY2hhbm5lbCBpcyByZXNpemVkIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSBhbGlnbkNvcm5lcnMgRGVmYXVsdHMgdG8gYGZhbHNlYC4gSWYgdHJ1ZSwgcmVzY2FsZVxuICogICAgIGlucHV0IGJ5IGAobmV3X2hlaWdodCAtIDEpIC8gKGhlaWdodCAtIDEpYCwgd2hpY2ggZXhhY3RseSBhbGlnbnMgdGhlIDRcbiAqICAgICBjb3JuZXJzIG9mIGltYWdlcyBhbmQgcmVzaXplZCBpbWFnZXMuIElmIGZhbHNlLCByZXNjYWxlIGJ5XG4gKiAgICAgYG5ld19oZWlnaHQgLyBoZWlnaHRgLiBUcmVhdCBzaW1pbGFybHkgdGhlIHdpZHRoIGRpbWVuc2lvbi5cbiAqIEBwYXJhbSBoYWxmUGl4ZWxDZW50ZXJzIERlZmF1bHRzIHRvIGBmYWxzZWAuIFdoZXRoZXIgdG8gYXNzdW1lIHBpeGVsIGNlbnRlcnNcbiAqICAgICBhcmUgYXQgMC41LCB3aGljaCB3b3VsZCBtYWtlIHRoZSBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyBvZiB0aGUgdG9wXG4gKiAgICAgbGVmdCBwaXhlbCAwLjUsIDAuNS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdJbWFnZXMnLCBuYW1lc3BhY2U6ICdpbWFnZSd9XG4gKi9cbmZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyXzxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgIGltYWdlczogVHxUZW5zb3JMaWtlLCBzaXplOiBbbnVtYmVyLCBudW1iZXJdLCBhbGlnbkNvcm5lcnMgPSBmYWxzZSxcbiAgICBoYWxmUGl4ZWxDZW50ZXJzID0gZmFsc2UpOiBUIHtcbiAgY29uc3QgJGltYWdlcyA9IGNvbnZlcnRUb1RlbnNvcihpbWFnZXMsICdpbWFnZXMnLCAncmVzaXplQmlsaW5lYXInKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZXMucmFuayA9PT0gMyB8fCAkaW1hZ2VzLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmVzaXplQmlsaW5lYXI6IHggbXVzdCBiZSByYW5rIDMgb3IgNCwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgcmFuayAkeyRpbWFnZXMucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgc2l6ZS5sZW5ndGggPT09IDIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmVzaXplQmlsaW5lYXI6IG5ldyBzaGFwZSBtdXN0IDJELCBidXQgZ290IHNoYXBlIGAgK1xuICAgICAgICAgIGAke3NpemV9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIGhhbGZQaXhlbENlbnRlcnMgPT09IGZhbHNlIHx8IGFsaWduQ29ybmVycyA9PT0gZmFsc2UsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmVzaXplQmlsaW5lYXI6IElmIGhhbGZQaXhlbENlbnRlcnMgaXMgdHJ1ZSwgYCArXG4gICAgICAgICAgYGFsaWduQ29ybmVycyBtdXN0IGJlIGZhbHNlLmApO1xuXG4gIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXMgYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgaWYgKCRpbWFnZXMucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKFxuICAgICAgICAkaW1hZ2VzLCBbMSwgJGltYWdlcy5zaGFwZVswXSwgJGltYWdlcy5zaGFwZVsxXSwgJGltYWdlcy5zaGFwZVsyXV0pO1xuICB9XG5cbiAgY29uc3QgW10gPSBzaXplO1xuXG4gIGNvbnN0IGlucHV0czogUmVzaXplQmlsaW5lYXJJbnB1dHMgPSB7aW1hZ2VzOiBiYXRjaEltYWdlc307XG4gIGNvbnN0IGF0dHJzOiBSZXNpemVCaWxpbmVhckF0dHJzID0ge2FsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICBjb25zdCByZXMgPSBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgICAgICAgICAgICAgUmVzaXplQmlsaW5lYXIsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzREKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUocmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXV0pIGFzIFQ7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyID0gb3Aoe3Jlc2l6ZUJpbGluZWFyX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { ResizeNearestNeighbor } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\n/**\n * NearestNeighbor resize a batch of 3D images to a new shape.\n *\n * @param images The images, of rank 4 or rank 3, of shape\n *     `[batch, height, width, inChannels]`. If rank 3, batch of 1 is assumed.\n * @param size The new shape `[newHeight, newWidth]` to resize the\n *     images to. Each channel is resized individually.\n * @param alignCorners Defaults to False. If true, rescale\n *     input by `(new_height - 1) / (height - 1)`, which exactly aligns the 4\n *     corners of images and resized images. If false, rescale by\n *     `new_height / height`. Treat similarly the width dimension.\n * @param halfPixelCenters Defaults to `false`. Whether to assume pixels are of\n *      half the actual dimensions, and yield more accurate resizes. This flag\n *      would also make the floating point coordinates of the top left pixel\n *      0.5, 0.5.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction resizeNearestNeighbor_(images, size, alignCorners = false, halfPixelCenters = false) {\n    const $images = convertToTensor(images, 'images', 'resizeNearestNeighbor');\n    util.assert($images.rank === 3 || $images.rank === 4, () => `Error in resizeNearestNeighbor: x must be rank 3 or 4, but got ` +\n        `rank ${$images.rank}.`);\n    util.assert(size.length === 2, () => `Error in resizeNearestNeighbor: new shape must 2D, but got shape ` +\n        `${size}.`);\n    util.assert($images.dtype === 'float32' || $images.dtype === 'int32', () => '`images` must have `int32` or `float32` as dtype');\n    util.assert(halfPixelCenters === false || alignCorners === false, () => `Error in resizeNearestNeighbor: If halfPixelCenters is true, ` +\n        `alignCorners must be false.`);\n    let batchImages = $images;\n    let reshapedTo4D = false;\n    if ($images.rank === 3) {\n        reshapedTo4D = true;\n        batchImages = reshape($images, [1, $images.shape[0], $images.shape[1], $images.shape[2]]);\n    }\n    const [] = size;\n    const inputs = { images: batchImages };\n    const attrs = { alignCorners, halfPixelCenters, size };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(ResizeNearestNeighbor, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const resizeNearestNeighbor = op({ resizeNearestNeighbor_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9pbWFnZS9yZXNpemVfbmVhcmVzdF9uZWlnaGJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxxQkFBcUIsRUFBMEQsTUFBTSxvQkFBb0IsQ0FBQztBQUlsSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DOzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILFNBQVMsc0JBQXNCLENBQzNCLE1BQW9CLEVBQUUsSUFBc0IsRUFBRSxZQUFZLEdBQUcsS0FBSyxFQUNsRSxnQkFBZ0IsR0FBRyxLQUFLO0lBQzFCLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFFM0UsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsSUFBSSxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDeEMsR0FBRyxFQUFFLENBQUMsaUVBQWlFO1FBQ25FLFFBQVEsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDakMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDakIsR0FBRyxFQUFFLENBQ0QsbUVBQW1FO1FBQ25FLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNwQixJQUFJLENBQUMsTUFBTSxDQUNQLE9BQU8sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxLQUFLLEtBQUssT0FBTyxFQUN4RCxHQUFHLEVBQUUsQ0FBQyxrREFBa0QsQ0FBQyxDQUFDO0lBQzlELElBQUksQ0FBQyxNQUFNLENBQ1AsZ0JBQWdCLEtBQUssS0FBSyxJQUFJLFlBQVksS0FBSyxLQUFLLEVBQ3BELEdBQUcsRUFBRSxDQUFDLCtEQUErRDtRQUNqRSw2QkFBNkIsQ0FBQyxDQUFDO0lBQ3ZDLElBQUksV0FBVyxHQUFHLE9BQW1CLENBQUM7SUFDdEMsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDdEIsWUFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixXQUFXLEdBQUcsT0FBTyxDQUNqQixPQUFPLEVBQUUsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3pFO0lBQ0QsTUFBTSxFQUFFLEdBQUcsSUFBSSxDQUFDO0lBRWhCLE1BQU0sTUFBTSxHQUFnQyxFQUFDLE1BQU0sRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUNsRSxNQUFNLEtBQUssR0FDc0IsRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFFeEUsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1oscUJBQXFCLEVBQUUsTUFBOEIsRUFDckQsS0FBMkIsQ0FBTSxDQUFDO0lBRWxELElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQU0sQ0FBQztLQUN0RTtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQyxFQUFDLHNCQUFzQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1Jlc2l6ZU5lYXJlc3ROZWlnaGJvciwgUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnMsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvcklucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi8uLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi8uLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuXG4vKipcbiAqIE5lYXJlc3ROZWlnaGJvciByZXNpemUgYSBiYXRjaCBvZiAzRCBpbWFnZXMgdG8gYSBuZXcgc2hhcGUuXG4gKlxuICogQHBhcmFtIGltYWdlcyBUaGUgaW1hZ2VzLCBvZiByYW5rIDQgb3IgcmFuayAzLCBvZiBzaGFwZVxuICogICAgIGBbYmF0Y2gsIGhlaWdodCwgd2lkdGgsIGluQ2hhbm5lbHNdYC4gSWYgcmFuayAzLCBiYXRjaCBvZiAxIGlzIGFzc3VtZWQuXG4gKiBAcGFyYW0gc2l6ZSBUaGUgbmV3IHNoYXBlIGBbbmV3SGVpZ2h0LCBuZXdXaWR0aF1gIHRvIHJlc2l6ZSB0aGVcbiAqICAgICBpbWFnZXMgdG8uIEVhY2ggY2hhbm5lbCBpcyByZXNpemVkIGluZGl2aWR1YWxseS5cbiAqIEBwYXJhbSBhbGlnbkNvcm5lcnMgRGVmYXVsdHMgdG8gRmFsc2UuIElmIHRydWUsIHJlc2NhbGVcbiAqICAgICBpbnB1dCBieSBgKG5ld19oZWlnaHQgLSAxKSAvIChoZWlnaHQgLSAxKWAsIHdoaWNoIGV4YWN0bHkgYWxpZ25zIHRoZSA0XG4gKiAgICAgY29ybmVycyBvZiBpbWFnZXMgYW5kIHJlc2l6ZWQgaW1hZ2VzLiBJZiBmYWxzZSwgcmVzY2FsZSBieVxuICogICAgIGBuZXdfaGVpZ2h0IC8gaGVpZ2h0YC4gVHJlYXQgc2ltaWxhcmx5IHRoZSB3aWR0aCBkaW1lbnNpb24uXG4gKiBAcGFyYW0gaGFsZlBpeGVsQ2VudGVycyBEZWZhdWx0cyB0byBgZmFsc2VgLiBXaGV0aGVyIHRvIGFzc3VtZSBwaXhlbHMgYXJlIG9mXG4gKiAgICAgIGhhbGYgdGhlIGFjdHVhbCBkaW1lbnNpb25zLCBhbmQgeWllbGQgbW9yZSBhY2N1cmF0ZSByZXNpemVzLiBUaGlzIGZsYWdcbiAqICAgICAgd291bGQgYWxzbyBtYWtlIHRoZSBmbG9hdGluZyBwb2ludCBjb29yZGluYXRlcyBvZiB0aGUgdG9wIGxlZnQgcGl4ZWxcbiAqICAgICAgMC41LCAwLjUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnSW1hZ2VzJywgbmFtZXNwYWNlOiAnaW1hZ2UnfVxuICovXG5mdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3JfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgaW1hZ2VzOiBUfFRlbnNvckxpa2UsIHNpemU6IFtudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVycyA9IGZhbHNlLFxuICAgIGhhbGZQaXhlbENlbnRlcnMgPSBmYWxzZSk6IFQge1xuICBjb25zdCAkaW1hZ2VzID0gY29udmVydFRvVGVuc29yKGltYWdlcywgJ2ltYWdlcycsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZXMucmFuayA9PT0gMyB8fCAkaW1hZ2VzLnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiB4IG11c3QgYmUgcmFuayAzIG9yIDQsIGJ1dCBnb3QgYCArXG4gICAgICAgICAgYHJhbmsgJHskaW1hZ2VzLnJhbmt9LmApO1xuICB1dGlsLmFzc2VydChcbiAgICAgIHNpemUubGVuZ3RoID09PSAyLFxuICAgICAgKCkgPT5cbiAgICAgICAgICBgRXJyb3IgaW4gcmVzaXplTmVhcmVzdE5laWdoYm9yOiBuZXcgc2hhcGUgbXVzdCAyRCwgYnV0IGdvdCBzaGFwZSBgICtcbiAgICAgICAgICBgJHtzaXplfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkaW1hZ2VzLmR0eXBlID09PSAnZmxvYXQzMicgfHwgJGltYWdlcy5kdHlwZSA9PT0gJ2ludDMyJyxcbiAgICAgICgpID0+ICdgaW1hZ2VzYCBtdXN0IGhhdmUgYGludDMyYCBvciBgZmxvYXQzMmAgYXMgZHR5cGUnKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBoYWxmUGl4ZWxDZW50ZXJzID09PSBmYWxzZSB8fCBhbGlnbkNvcm5lcnMgPT09IGZhbHNlLFxuICAgICAgKCkgPT4gYEVycm9yIGluIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcjogSWYgaGFsZlBpeGVsQ2VudGVycyBpcyB0cnVlLCBgICtcbiAgICAgICAgICBgYWxpZ25Db3JuZXJzIG11c3QgYmUgZmFsc2UuYCk7XG4gIGxldCBiYXRjaEltYWdlcyA9ICRpbWFnZXMgYXMgVGVuc29yNEQ7XG4gIGxldCByZXNoYXBlZFRvNEQgPSBmYWxzZTtcbiAgaWYgKCRpbWFnZXMucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgYmF0Y2hJbWFnZXMgPSByZXNoYXBlKFxuICAgICAgICAkaW1hZ2VzLCBbMSwgJGltYWdlcy5zaGFwZVswXSwgJGltYWdlcy5zaGFwZVsxXSwgJGltYWdlcy5zaGFwZVsyXV0pO1xuICB9XG4gIGNvbnN0IFtdID0gc2l6ZTtcblxuICBjb25zdCBpbnB1dHM6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcklucHV0cyA9IHtpbWFnZXM6IGJhdGNoSW1hZ2VzfTtcbiAgY29uc3QgYXR0cnM6XG4gICAgICBSZXNpemVOZWFyZXN0TmVpZ2hib3JBdHRycyA9IHthbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIFJlc2l6ZU5lYXJlc3ROZWlnaGJvciwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgYXR0cnMgYXMge30gYXMgTmFtZWRBdHRyTWFwKSBhcyBUO1xuXG4gIGlmIChyZXNoYXBlZFRvNEQpIHtcbiAgICByZXR1cm4gcmVzaGFwZShyZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdXSkgYXMgVDtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yID0gb3Aoe3Jlc2l6ZU5lYXJlc3ROZWlnaGJvcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { tensor1d } from '../tensor1d';\nimport { op } from '../operation';\nimport { cast } from '../cast';\nimport { split } from '../split';\nimport { bincount } from '../bincount';\nimport { lessEqual } from '../less_equal';\nimport { greater } from '../greater';\nimport { sum } from '../sum';\nimport { add } from '../add';\nimport { mul } from '../mul';\nimport { div } from '../div';\nimport { sub } from '../sub';\nimport { round } from '../round';\nimport { where } from '../where';\nimport { fill } from '../fill';\nimport { slice } from '../slice';\nimport { range } from '../range';\nimport { tensor } from '../tensor';\nimport * as util from '../../util';\nimport { convertToTensor } from '../../tensor_util_env';\n/**\n * Performs image binarization with corresponding threshold\n * (depends on the method)value, which creates a binary image from a grayscale.\n * @param image 3d tensor of shape [imageHeight,imageWidth, depth],\n * where imageHeight and imageWidth must be positive.The image color\n * range should be [0, 255].\n * @param method Optional string from `'binary' | 'otsu'`\n * which specifies the method for thresholding. Defaults to 'binary'.\n * @param inverted Optional boolean whichspecifies\n * if colours should be inverted. Defaults to false.\n * @param threshValue Optional number which defines threshold value from 0 to 1.\n * Defaults to 0.5.\n * @return A 3d tensor of shape [imageHeight,imageWidth, depth], which\n * contains binarized image.\n */\nfunction threshold_(image, method = 'binary', inverted = false, threshValue = 0.5) {\n    const $image = convertToTensor(image, 'image', 'threshold');\n    /* 0.2989, 0.5870, 0.1140 are represent luma coefficients in CCIR601.\n    Reference for converting between RGB and grayscale: https://en.wikipedia.org/wiki/Luma_%28video%29  */\n    const RED_INTENCITY_COEF = 0.2989;\n    const GREEN_INTENCITY_COEF = 0.5870;\n    const BLUE_INTENCITY_COEF = 0.1140;\n    const totalPixelsInImage = $image.shape[0] * $image.shape[1];\n    let $threshold = mul(tensor1d([threshValue]), 255);\n    let r, g, b, grayscale;\n    util.assert($image.rank === 3, () => 'Error in threshold: image must be rank 3,' +\n        `but got rank ${$image.rank}.`);\n    util.assert($image.shape[2] === 3 || $image.shape[2] === 1, () => 'Error in threshold: ' +\n        'image color channel must be equal to 3 or 1' +\n        `but got ${$image.shape[2]}.`);\n    util.assert($image.dtype === 'int32' || $image.dtype === 'float32', () => 'Error in dtype: image dtype must be int32 or float32,' +\n        `but got dtype ${$image.dtype}.`);\n    util.assert(method === 'otsu' || method === 'binary', () => `Method must be binary or otsu, but was ${method}`);\n    if ($image.shape[2] === 3) {\n        [r, g, b] = split($image, [1, 1, 1], -1);\n        const $r = mul(r, RED_INTENCITY_COEF);\n        const $g = mul(g, GREEN_INTENCITY_COEF);\n        const $b = mul(b, BLUE_INTENCITY_COEF);\n        grayscale = add(add($r, $g), $b);\n    }\n    else {\n        grayscale = image;\n    }\n    if (method === 'otsu') {\n        const $histogram = bincount(cast(round(grayscale), 'int32'), tensor([]), 256);\n        $threshold = otsu($histogram, totalPixelsInImage);\n    }\n    const invCondition = inverted ?\n        lessEqual(grayscale, $threshold) : greater(grayscale, $threshold);\n    const result = cast(mul(invCondition, 255), 'int32');\n    return result;\n}\nfunction otsu(histogram, total) {\n    let bestThresh = tensor1d([-1]);\n    let bestInBetVar = tensor1d([0]);\n    let cInBetVar = tensor1d([0]);\n    let classFirst, classSecond, meanFirst, meanSec, weightForeground, weightBack;\n    for (let index = 0; index < histogram.size - 1; index++) {\n        classFirst = slice(histogram, 0, index + 1);\n        classSecond = slice(histogram, index + 1);\n        weightForeground = div(sum(classFirst), total);\n        weightBack = div(sum(classSecond), total);\n        const meanFirstDivA = sum(mul(classFirst, range(0, classFirst.size)));\n        meanFirst = div(meanFirstDivA, sum(classFirst));\n        const meanSecFill = fill(classSecond.shape, classFirst.size);\n        const meanSecAdd = add(range(0, classSecond.size), meanSecFill);\n        const meanSecMul = mul(classSecond, (meanSecAdd));\n        meanSec = div(sum(meanSecMul), sum(classSecond));\n        const cInBetVarSubA = sub(meanFirst, meanSec);\n        const cInBetVarSubB = sub(meanFirst, meanSec);\n        const cInBetVarMul = mul(weightForeground, weightBack);\n        cInBetVar = mul(mul(cInBetVarMul, cInBetVarSubA), cInBetVarSubB);\n        const condition = greater(cInBetVar, bestInBetVar);\n        bestInBetVar = where(condition, cInBetVar, bestInBetVar);\n        bestThresh = where(condition, tensor1d([index]), bestThresh);\n    }\n    return bestThresh;\n}\nexport const threshold = op({ threshold_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGhyZXNob2xkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvdGhyZXNob2xkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFdkMsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNsQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFDN0IsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUM3QixPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQzdCLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDakMsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUNqQyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sV0FB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O1FBRXpELFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7S0FFaEU7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUN0QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgeyBUZW5zb3IxRCwgVGVuc29yM0QgfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHsgdGVuc29yMWQgfSBmcm9tICcuLi90ZW5zb3IxZCc7XG5pbXBvcnQgeyBUZW5zb3JMaWtlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHsgb3AgfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHsgY2FzdCB9IGZyb20gJy4uL2Nhc3QnO1xuaW1wb3J0IHsgc3BsaXQgfSBmcm9tICcuLi9zcGxpdCc7XG5pbXBvcnQgeyBiaW5jb3VudCB9IGZyb20gJy4uL2JpbmNvdW50JztcbmltcG9ydCB7IGxlc3NFcXVhbCB9IGZyb20gJy4uL2xlc3NfZXF1YWwnO1xuaW1wb3J0IHsgZ3JlYXRlciB9IGZyb20gJy4uL2dyZWF0ZXInO1xuaW1wb3J0IHsgc3VtIH0gZnJvbSAnLi4vc3VtJztcbmltcG9ydCB7IGFkZCB9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQgeyBtdWwgfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHsgZGl2IH0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7IHN1YiB9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQgeyByb3VuZCB9IGZyb20gJy4uL3JvdW5kJztcbmltcG9ydCB7IHdoZXJlIH0gZnJvbSAnLi4vd2hlcmUnO1xuaW1wb3J0IHsgZmlsbCB9IGZyb20gJy4uL2ZpbGwnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHsgcmFuZ2UgfSBmcm9tICcuLi9yYW5nZSc7XG5pbXBvcnQgeyB0ZW5zb3IgfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7IGNvbnZlcnRUb1RlbnNvciB9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5cbi8qKlxuICogUGVyZm9ybXMgaW1hZ2UgYmluYXJpemF0aW9uIHdpdGggY29ycmVzcG9uZGluZyB0aHJlc2hvbGRcbiAqIChkZXBlbmRzIG9uIHRoZSBtZXRob2QpdmFsdWUsIHdoaWNoIGNyZWF0ZXMgYSBiaW5hcnkgaW1hZ2UgZnJvbSBhIGdyYXlzY2FsZS5cbiAqIEBwYXJhbSBpbWFnZSAzZCB0ZW5zb3Igb2Ygc2hhcGUgW2ltYWdlSGVpZ2h0LGltYWdlV2lkdGgsIGRlcHRoXSxcbiAqIHdoZXJlIGltYWdlSGVpZ2h0IGFuZCBpbWFnZVdpZHRoIG11c3QgYmUgcG9zaXRpdmUuVGhlIGltYWdlIGNvbG9yXG4gKiByYW5nZSBzaG91bGQgYmUgWzAsIDI1NV0uXG4gKiBAcGFyYW0gbWV0aG9kIE9wdGlvbmFsIHN0cmluZyBmcm9tIGAnYmluYXJ5JyB8ICdvdHN1J2BcbiAqIHdoaWNoIHNwZWNpZmllcyB0aGUgbWV0aG9kIGZvciB0aHJlc2hvbGRpbmcuIERlZmF1bHRzIHRvICdiaW5hcnknLlxuICogQHBhcmFtIGludmVydGVkIE9wdGlvbmFsIGJvb2xlYW4gd2hpY2hzcGVjaWZpZXNcbiAqIGlmIGNvbG91cnMgc2hvdWxkIGJlIGludmVydGVkLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEBwYXJhbSB0aHJlc2hWYWx1ZSBPcHRpb25hbCBudW1iZXIgd2hpY2ggZGVmaW5lcyB0aHJlc2hvbGQgdmFsdWUgZnJvbSAwIHRvIDEuXG4gKiBEZWZhdWx0cyB0byAwLjUuXG4gKiBAcmV0dXJuIEEgM2QgdGVuc29yIG9mIHNoYXBlIFtpbWFnZUhlaWdodCxpbWFnZVdpZHRoLCBkZXB0aF0sIHdoaWNoXG4gKiBjb250YWlucyBiaW5hcml6ZWQgaW1hZ2UuXG4gKi9cblxuZnVuY3Rpb24gdGhyZXNob2xkXyhcbiAgICBpbWFnZTogVGVuc29yM0QgfCBUZW5zb3JMaWtlLFxuICAgIG1ldGhvZCA9ICdiaW5hcnknLFxuICAgIGludmVydGVkID0gZmFsc2UsXG4gICAgdGhyZXNoVmFsdWUgPSAwLjVcbik6IFRlbnNvcjNEIHtcbiAgICBjb25zdCAkaW1hZ2UgPSBjb252ZXJ0VG9UZW5zb3IoaW1hZ2UsICdpbWFnZScsICd0aHJlc2hvbGQnKTtcblxuICAgIC8qIDAuMjk4OSwgMC41ODcwLCAwLjExNDAgYXJlIHJlcHJlc2VudCBsdW1hIGNvZWZmaWNpZW50cyBpbiBDQ0lSNjAxLlxuXHRSZWZlcmVuY2UgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiBSR0IgYW5kIGdyYXlzY2FsZTogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTHVtYV8lMjh2aWRlbyUyOSAgKi9cblxuICAgIGNvbnN0IFJFRF9JTlRFTkNJVFlfQ09FRiA9IDAuMjk4OTtcbiAgICBjb25zdCBHUkVFTl9JTlRFTkNJVFlfQ09FRiA9IDAuNTg3MDtcbiAgICBjb25zdCBCTFVFX0lOVEVOQ0lUWV9DT0VGID0gMC4xMTQwO1xuICAgIGNvbnN0IHRvdGFsUGl4ZWxzSW5JbWFnZSA9ICRpbWFnZS5zaGFwZVswXSAqICRpbWFnZS5zaGFwZVsxXTtcblxuICAgIGxldCAkdGhyZXNob2xkID0gbXVsKHRlbnNvcjFkKFt0aHJlc2hWYWx1ZV0pLCAyNTUpO1xuICAgIGxldCByLCBnLCBiLCBncmF5c2NhbGU7XG5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgJGltYWdlLnJhbmsgPT09IDMsXG4gICAgICAgICgpID0+ICdFcnJvciBpbiB0aHJlc2hvbGQ6IGltYWdlIG11c3QgYmUgcmFuayAzLCcgK1xuICAgICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAkaW1hZ2Uuc2hhcGVbMl0gPT09IDMgfHwgJGltYWdlLnNoYXBlWzJdPT09IDEsXG4gICAgICAgICgpID0+ICdFcnJvciBpbiB0aHJlc2hvbGQ6ICcgK1xuICAgICAgICAgICAgJ2ltYWdlIGNvbG9yIGNoYW5uZWwgbXVzdCBiZSBlcXVhbCB0byAzIG9yIDEnICtcbiAgICAgICAgICAgIGBidXQgZ290ICR7JGltYWdlLnNoYXBlWzJdfS5gKTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgJGltYWdlLmR0eXBlID09PSAnaW50MzInIHx8ICRpbWFnZS5kdHlwZSA9PT0gJ2Zsb2F0MzInLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGR0eXBlOiBpbWFnZSBkdHlwZSBtdXN0IGJlIGludDMyIG9yIGZsb2F0MzIsJyArXG4gICAgICAgICAgYGJ1dCBnb3QgZHR5cGUgJHskaW1hZ2UuZHR5cGV9LmApO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICBtZXRob2QgPT09ICdvdHN1JyB8fCBtZXRob2QgPT09ICdiaW5hcnknLFxuICAgICAgKCkgPT4gYE1ldGhvZCBtdXN0IGJlIGJpbmFyeSBvciBvdHN1LCBidXQgd2FzICR7bWV0aG9kfWApO1xuXG4gICAgaWYgKCRpbWFnZS5zaGFwZVsyXSA9PT0gMykge1xuICAgICAgICBbciwgZywgYl0gPSBzcGxpdCgkaW1hZ2UsIFsxLCAxLCAxXSwgLTEpO1xuICAgICAgICBjb25zdCAkciA9IG11bChyLFJFRF9JTlRFTkNJVFlfQ09FRik7XG4gICAgICAgIGNvbnN0ICRnID0gbXVsKGcsR1JFRU5fSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBjb25zdCAkYiA9IG11bChiLEJMVUVfSU5URU5DSVRZX0NPRUYpO1xuICAgICAgICBncmF5c2NhbGUgPSBhZGQoYWRkKCRyLCAkZyksICRiKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBncmF5c2NhbGUgPSBpbWFnZTtcbiAgICB9XG5cbiAgICBpZiAobWV0aG9kID09PSAnb3RzdScpIHtcbiAgICAgICAgY29uc3QgJGhpc3RvZ3JhbSA9IGJpbmNvdW50KGNhc3Qocm91bmQoZ3JheXNjYWxlKSwgJ2ludDMyJykgYXMgVGVuc29yMUQsXG4gICAgICAgICAgICB0ZW5zb3IoW10pLFxuICAgICAgICAgICAgMjU2KTtcbiAgICAgICAgJHRocmVzaG9sZCA9IG90c3UoJGhpc3RvZ3JhbSwgdG90YWxQaXhlbHNJbkltYWdlKTtcbiAgICB9XG5cbiAgICBjb25zdCBpbnZDb25kaXRpb24gPSBpbnZlcnRlZCA/XG4gICAgICAgIGxlc3NFcXVhbChncmF5c2NhbGUsICR0aHJlc2hvbGQpIDogZ3JlYXRlcihncmF5c2NhbGUsICR0aHJlc2hvbGQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY2FzdChtdWwoaW52Q29uZGl0aW9uLDI1NSksICdpbnQzMicpO1xuXG4gICAgcmV0dXJuIHJlc3VsdCBhcyBUZW5zb3IzRDtcbn1cblxuZnVuY3Rpb24gb3RzdShoaXN0b2dyYW06IFRlbnNvcjFELCB0b3RhbDogbnVtYmVyKTpUZW5zb3IxRCB7XG5cbiAgICBsZXQgYmVzdFRocmVzaCA9IHRlbnNvcjFkKFstMV0pO1xuICAgIGxldCBiZXN0SW5CZXRWYXIgPSB0ZW5zb3IxZChbMF0pO1xuICAgIGxldCBjSW5CZXRWYXIgPSB0ZW5zb3IxZChbMF0pO1xuICAgIGxldCBjbGFzc0ZpcnN0LCBjbGFzc1NlY29uZCwgbWVhbkZpcnN0LFxuICAgICAgICBtZWFuU2VjLCB3ZWlnaHRGb3JlZ3JvdW5kLCB3ZWlnaHRCYWNrO1xuXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGhpc3RvZ3JhbS5zaXplLTE7IGluZGV4KyspIHtcblxuICAgICAgICBjbGFzc0ZpcnN0ID0gc2xpY2UoaGlzdG9ncmFtLCAwLCBpbmRleCArIDEpO1xuXG4gICAgICAgIGNsYXNzU2Vjb25kID0gc2xpY2UoaGlzdG9ncmFtLGluZGV4ICsgMSk7XG5cbiAgICAgICAgd2VpZ2h0Rm9yZWdyb3VuZCA9IGRpdihzdW0oY2xhc3NGaXJzdCksdG90YWwpO1xuXG4gICAgICAgIHdlaWdodEJhY2sgPSBkaXYoc3VtKGNsYXNzU2Vjb25kKSx0b3RhbCk7XG5cbiAgICAgICAgY29uc3QgbWVhbkZpcnN0RGl2QSA9IHN1bShtdWwoY2xhc3NGaXJzdCwgcmFuZ2UoMCwgY2xhc3NGaXJzdC5zaXplKSkpO1xuXG4gICAgICAgIG1lYW5GaXJzdCA9IGRpdihtZWFuRmlyc3REaXZBLCBzdW0oY2xhc3NGaXJzdCkgKTtcblxuICAgICAgICBjb25zdCBtZWFuU2VjRmlsbCA9IGZpbGwoY2xhc3NTZWNvbmQuc2hhcGUsIGNsYXNzRmlyc3Quc2l6ZSk7XG4gICAgICAgIGNvbnN0IG1lYW5TZWNBZGQgPSBhZGQocmFuZ2UoMCxjbGFzc1NlY29uZC5zaXplKSxtZWFuU2VjRmlsbCk7XG4gICAgICAgIGNvbnN0IG1lYW5TZWNNdWwgPSBtdWwoY2xhc3NTZWNvbmQsIChtZWFuU2VjQWRkKSk7XG4gICAgICAgIG1lYW5TZWMgPSBkaXYoc3VtKG1lYW5TZWNNdWwpLCBzdW0oY2xhc3NTZWNvbmQpKTtcblxuICAgICAgICBjb25zdCBjSW5CZXRWYXJTdWJBID0gc3ViKG1lYW5GaXJzdCwgbWVhblNlYyk7XG4gICAgICAgIGNvbnN0IGNJbkJldFZhclN1YkIgPSBzdWIobWVhbkZpcnN0LCBtZWFuU2VjKTtcbiAgICAgICAgY29uc3QgY0luQmV0VmFyTXVsID0gbXVsKHdlaWdodEZvcmVncm91bmQsIHdlaWdodEJhY2spO1xuICAgICAgICBjSW5CZXRWYXIgPSBtdWwobXVsKGNJbkJldFZhck11bCxjSW5CZXRWYXJTdWJBKSwgY0luQmV0VmFyU3ViQik7XG5cbiAgICAgICAgY29uc3QgY29uZGl0aW9uID0gZ3JlYXRlcihjSW5CZXRWYXIsIGJlc3RJbkJldFZhcik7XG5cbiAgICAgICAgYmVzdEluQmV0VmFyID0gd2hlcmUoY29uZGl0aW9uLCBjSW5CZXRWYXIsIGJlc3RJbkJldFZhcik7XG5cbiAgICAgICAgYmVzdFRocmVzaCA9IHdoZXJlKGNvbmRpdGlvbiwgdGVuc29yMWQoW2luZGV4XSksIGJlc3RUaHJlc2gpO1xuXG4gICAgfVxuICAgIHJldHVybiBiZXN0VGhyZXNoO1xufVxuXG5leHBvcnQgY29uc3QgdGhyZXNob2xkID0gb3AoeyB0aHJlc2hvbGRfIH0pO1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { Transform } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport * as util from '../../util';\nimport { op } from '../operation';\n/**\n * Applies the given transform(s) to the image(s).\n *\n * @param image 4d tensor of shape `[batch, imageHeight, imageWidth, depth]`.\n * @param transforms Projective transform matrix/matrices. A tensor1d of length\n *     8 or tensor of size N x 8. If one row of transforms is [a0, a1, a2, b0,\n *     b1, b2, c0, c1], then it maps the output point (x, y) to a transformed\n *     input point (x', y') = ((a0 x + a1 y + a2) / k, (b0 x + b1 y + b2) / k),\n *     where k = c0 x + c1 y + 1. The transforms are inverted compared to the\n *     transform mapping input points to output points.\n * @param interpolation Interpolation mode.\n *     Supported values: 'nearest', 'bilinear'. Default to 'nearest'.\n * @param fillMode Points outside the boundaries of the input are filled\n *     according to the given mode, one of 'constant', 'reflect', 'wrap',\n *     'nearest'. Default to 'constant'.\n *     'reflect': (d c b a | a b c d | d c b a ) The input is extended by\n *     reflecting about the edge of the last pixel.\n *     'constant': (k k k k | a b c d | k k k k) The input is extended by\n *     filling all values beyond the edge with the same constant value k.\n *     'wrap': (a b c d | a b c d | a b c d) The input is extended by\n *     wrapping around to the opposite edge.\n *     'nearest': (a a a a | a b c d | d d d d) The input is extended by\n *     the nearest pixel.\n * @param fillValue A float represents the value to be filled outside the\n *     boundaries when fillMode is 'constant'.\n * @param Output dimension after the transform, [height, width]. If undefined,\n *     output is the same size as input image.\n *\n * @doc {heading: 'Operations', subheading: 'Images', namespace: 'image'}\n */\nfunction transform_(image, transforms, interpolation = 'nearest', fillMode = 'constant', fillValue = 0, outputShape) {\n    const $image = convertToTensor(image, 'image', 'transform', 'float32');\n    const $transforms = convertToTensor(transforms, 'transforms', 'transform', 'float32');\n    util.assert($image.rank === 4, () => 'Error in transform: image must be rank 4,' +\n        `but got rank ${$image.rank}.`);\n    util.assert($transforms.rank === 2 &&\n        ($transforms.shape[0] === $image.shape[0] ||\n            $transforms.shape[0] === 1) &&\n        $transforms.shape[1] === 8, () => `Error in transform: Input transform should be batch x 8 or 1 x 8`);\n    util.assert(outputShape == null || outputShape.length === 2, () => 'Error in transform: outputShape must be [height, width] or null, ' +\n        `but got ${outputShape}.`);\n    const inputs = { image: $image, transforms: $transforms };\n    const attrs = { interpolation, fillMode, fillValue, outputShape };\n    return ENGINE.runKernel(Transform, inputs, attrs);\n}\nexport const transform = op({ transform_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvaW1hZ2UvdHJhbnNmb3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLFNBQVMsRUFBa0MsTUFBTSxvQkFBb0IsQ0FBQztBQUk5RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxLQUFLLElBQUksTUFBTSxZQUFZLENBQUM7QUFFbkMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0E2Qkc7QUFDSCxTQUFTLFVBQVUsQ0FDZixLQUEwQixFQUFFLFVBQStCLEVBQzNELGdCQUFzQyxTQUFTLEVBQy9DLFdBQWtELFVBQVUsRUFBRSxTQUFTLEdBQUcsQ0FBQyxFQUMzRSxXQUE4QjtJQUNoQyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkUsTUFBTSxXQUFXLEdBQ2IsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXRFLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLDJDQUEyQztRQUM3QyxnQkFBZ0IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFFeEMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUM7UUFDbEIsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUM5QixHQUFHLEVBQUUsQ0FBQyxrRUFBa0UsQ0FBQyxDQUFDO0lBRTlFLElBQUksQ0FBQyxNQUFNLENBQ1AsV0FBVyxJQUFJLElBQUksSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUMsRUFDL0MsR0FBRyxFQUFFLENBQ0QsbUVBQW1FO1FBQ25FLFdBQVcsV0FBVyxHQUFHLENBQUMsQ0FBQztJQUVuQyxNQUFNLE1BQU0sR0FBb0IsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUN6RSxNQUFNLEtBQUssR0FDVSxFQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBQyxDQUFDO0lBRXZFLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDbkIsU0FBUyxFQUFFLE1BQThCLEVBQUUsS0FBMkIsQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtUcmFuc2Zvcm0sIFRyYW5zZm9ybUF0dHJzLCBUcmFuc2Zvcm1JbnB1dHN9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge05hbWVkQXR0ck1hcH0gZnJvbSAnLi4vLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yMkQsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uLy4uL3V0aWwnO1xuXG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIEFwcGxpZXMgdGhlIGdpdmVuIHRyYW5zZm9ybShzKSB0byB0aGUgaW1hZ2UocykuXG4gKlxuICogQHBhcmFtIGltYWdlIDRkIHRlbnNvciBvZiBzaGFwZSBgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgZGVwdGhdYC5cbiAqIEBwYXJhbSB0cmFuc2Zvcm1zIFByb2plY3RpdmUgdHJhbnNmb3JtIG1hdHJpeC9tYXRyaWNlcy4gQSB0ZW5zb3IxZCBvZiBsZW5ndGhcbiAqICAgICA4IG9yIHRlbnNvciBvZiBzaXplIE4geCA4LiBJZiBvbmUgcm93IG9mIHRyYW5zZm9ybXMgaXMgW2EwLCBhMSwgYTIsIGIwLFxuICogICAgIGIxLCBiMiwgYzAsIGMxXSwgdGhlbiBpdCBtYXBzIHRoZSBvdXRwdXQgcG9pbnQgKHgsIHkpIHRvIGEgdHJhbnNmb3JtZWRcbiAqICAgICBpbnB1dCBwb2ludCAoeCcsIHknKSA9ICgoYTAgeCArIGExIHkgKyBhMikgLyBrLCAoYjAgeCArIGIxIHkgKyBiMikgLyBrKSxcbiAqICAgICB3aGVyZSBrID0gYzAgeCArIGMxIHkgKyAxLiBUaGUgdHJhbnNmb3JtcyBhcmUgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gdGhlXG4gKiAgICAgdHJhbnNmb3JtIG1hcHBpbmcgaW5wdXQgcG9pbnRzIHRvIG91dHB1dCBwb2ludHMuXG4gKiBAcGFyYW0gaW50ZXJwb2xhdGlvbiBJbnRlcnBvbGF0aW9uIG1vZGUuXG4gKiAgICAgU3VwcG9ydGVkIHZhbHVlczogJ25lYXJlc3QnLCAnYmlsaW5lYXInLiBEZWZhdWx0IHRvICduZWFyZXN0Jy5cbiAqIEBwYXJhbSBmaWxsTW9kZSBQb2ludHMgb3V0c2lkZSB0aGUgYm91bmRhcmllcyBvZiB0aGUgaW5wdXQgYXJlIGZpbGxlZFxuICogICAgIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gbW9kZSwgb25lIG9mICdjb25zdGFudCcsICdyZWZsZWN0JywgJ3dyYXAnLFxuICogICAgICduZWFyZXN0Jy4gRGVmYXVsdCB0byAnY29uc3RhbnQnLlxuICogICAgICdyZWZsZWN0JzogKGQgYyBiIGEgfCBhIGIgYyBkIHwgZCBjIGIgYSApIFRoZSBpbnB1dCBpcyBleHRlbmRlZCBieVxuICogICAgIHJlZmxlY3RpbmcgYWJvdXQgdGhlIGVkZ2Ugb2YgdGhlIGxhc3QgcGl4ZWwuXG4gKiAgICAgJ2NvbnN0YW50JzogKGsgayBrIGsgfCBhIGIgYyBkIHwgayBrIGsgaykgVGhlIGlucHV0IGlzIGV4dGVuZGVkIGJ5XG4gKiAgICAgZmlsbGluZyBhbGwgdmFsdWVzIGJleW9uZCB0aGUgZWRnZSB3aXRoIHRoZSBzYW1lIGNvbnN0YW50IHZhbHVlIGsuXG4gKiAgICAgJ3dyYXAnOiAoYSBiIGMgZCB8IGEgYiBjIGQgfCBhIGIgYyBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB3cmFwcGluZyBhcm91bmQgdG8gdGhlIG9wcG9zaXRlIGVkZ2UuXG4gKiAgICAgJ25lYXJlc3QnOiAoYSBhIGEgYSB8IGEgYiBjIGQgfCBkIGQgZCBkKSBUaGUgaW5wdXQgaXMgZXh0ZW5kZWQgYnlcbiAqICAgICB0aGUgbmVhcmVzdCBwaXhlbC5cbiAqIEBwYXJhbSBmaWxsVmFsdWUgQSBmbG9hdCByZXByZXNlbnRzIHRoZSB2YWx1ZSB0byBiZSBmaWxsZWQgb3V0c2lkZSB0aGVcbiAqICAgICBib3VuZGFyaWVzIHdoZW4gZmlsbE1vZGUgaXMgJ2NvbnN0YW50Jy5cbiAqIEBwYXJhbSBPdXRwdXQgZGltZW5zaW9uIGFmdGVyIHRoZSB0cmFuc2Zvcm0sIFtoZWlnaHQsIHdpZHRoXS4gSWYgdW5kZWZpbmVkLFxuICogICAgIG91dHB1dCBpcyB0aGUgc2FtZSBzaXplIGFzIGlucHV0IGltYWdlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ0ltYWdlcycsIG5hbWVzcGFjZTogJ2ltYWdlJ31cbiAqL1xuZnVuY3Rpb24gdHJhbnNmb3JtXyhcbiAgICBpbWFnZTogVGVuc29yNER8VGVuc29yTGlrZSwgdHJhbnNmb3JtczogVGVuc29yMkR8VGVuc29yTGlrZSxcbiAgICBpbnRlcnBvbGF0aW9uOiAnbmVhcmVzdCd8J2JpbGluZWFyJyA9ICduZWFyZXN0JyxcbiAgICBmaWxsTW9kZTogJ2NvbnN0YW50J3wncmVmbGVjdCd8J3dyYXAnfCduZWFyZXN0JyA9ICdjb25zdGFudCcsIGZpbGxWYWx1ZSA9IDAsXG4gICAgb3V0cHV0U2hhcGU/OiBbbnVtYmVyLCBudW1iZXJdKTogVGVuc29yNEQge1xuICBjb25zdCAkaW1hZ2UgPSBjb252ZXJ0VG9UZW5zb3IoaW1hZ2UsICdpbWFnZScsICd0cmFuc2Zvcm0nLCAnZmxvYXQzMicpO1xuICBjb25zdCAkdHJhbnNmb3JtcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IodHJhbnNmb3JtcywgJ3RyYW5zZm9ybXMnLCAndHJhbnNmb3JtJywgJ2Zsb2F0MzInKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbWFnZS5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIHRyYW5zZm9ybTogaW1hZ2UgbXVzdCBiZSByYW5rIDQsJyArXG4gICAgICAgICAgYGJ1dCBnb3QgcmFuayAkeyRpbWFnZS5yYW5rfS5gKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICR0cmFuc2Zvcm1zLnJhbmsgPT09IDIgJiZcbiAgICAgICAgICAoJHRyYW5zZm9ybXMuc2hhcGVbMF0gPT09ICRpbWFnZS5zaGFwZVswXSB8fFxuICAgICAgICAgICAkdHJhbnNmb3Jtcy5zaGFwZVswXSA9PT0gMSkgJiZcbiAgICAgICAgICAkdHJhbnNmb3Jtcy5zaGFwZVsxXSA9PT0gOCxcbiAgICAgICgpID0+IGBFcnJvciBpbiB0cmFuc2Zvcm06IElucHV0IHRyYW5zZm9ybSBzaG91bGQgYmUgYmF0Y2ggeCA4IG9yIDEgeCA4YCk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBvdXRwdXRTaGFwZSA9PSBudWxsIHx8IG91dHB1dFNoYXBlLmxlbmd0aCA9PT0gMixcbiAgICAgICgpID0+XG4gICAgICAgICAgJ0Vycm9yIGluIHRyYW5zZm9ybTogb3V0cHV0U2hhcGUgbXVzdCBiZSBbaGVpZ2h0LCB3aWR0aF0gb3IgbnVsbCwgJyArXG4gICAgICAgICAgYGJ1dCBnb3QgJHtvdXRwdXRTaGFwZX0uYCk7XG5cbiAgY29uc3QgaW5wdXRzOiBUcmFuc2Zvcm1JbnB1dHMgPSB7aW1hZ2U6ICRpbWFnZSwgdHJhbnNmb3JtczogJHRyYW5zZm9ybXN9O1xuICBjb25zdCBhdHRyczpcbiAgICAgIFRyYW5zZm9ybUF0dHJzID0ge2ludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlfTtcblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgIFRyYW5zZm9ybSwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtID0gb3Aoe3RyYW5zZm9ybV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assert } from '../../util';\nimport { greaterEqual } from '../greater_equal';\nimport { lessEqual } from '../less_equal';\nimport { logicalAnd } from '../logical_and';\nimport { op } from '../operation';\nimport { range } from '../range';\nimport { reshape } from '../reshape';\nimport { scalar } from '../scalar';\nimport { stack } from '../stack';\nimport { sub } from '../sub';\nimport { unstack } from '../unstack';\nimport { where } from '../where';\nimport { zeros } from '../zeros';\n/**\n * Copy a tensor setting everything outside a central band in each innermost\n * matrix to zero.\n *\n * The band part is computed as follows: Assume input has `k` dimensions\n * `[I, J, K, ..., M, N]`, then the output is a tensor with the same shape where\n * `band[i, j, k, ..., m, n] = in_band(m, n) * input[i, j, k, ..., m, n]`.\n * The indicator function\n * `in_band(m, n) = (num_lower < 0 || (m-n) <= num_lower)`\n * `&& (num_upper < 0 || (n-m) <= num_upper)`\n *\n * ```js\n * const x = tf.tensor2d([[ 0,  1,  2, 3],\n *                        [-1,  0,  1, 2],\n *                        [-2, -1,  0, 1],\n *                        [-3, -2, -1, 0]]);\n * let y = tf.linalg.bandPart(x, 1, -1);\n * y.print(); // [[ 0,  1,  2, 3],\n *            //  [-1,  0,  1, 2],\n *            //  [ 0, -1,  0, 1],\n *            //  [ 0, 0 , -1, 0]]\n * let z = tf.linalg.bandPart(x, 2, 1);\n * z.print(); // [[ 0,  1,  0, 0],\n *            //  [-1,  0,  1, 0],\n *            //  [-2, -1,  0, 1],\n *            //  [ 0, -2, -1, 0]]\n * ```\n *\n * @param x Rank `k` tensor\n * @param numLower Number of subdiagonals to keep.\n *   If negative, keep entire lower triangle.\n * @param numUpper Number of subdiagonals to keep.\n *   If negative, keep entire upper triangle.\n * @returns Rank `k` tensor of the same shape as input.\n *   The extracted banded tensor.\n *\n * @doc {heading:'Operations', subheading:'Linear Algebra', namespace:'linalg'}\n */\nfunction bandPart_(a, numLower, numUpper) {\n    assert(numLower % 1 === 0, () => `bandPart(): numLower must be an integer, got ${numLower}.`);\n    assert(numUpper % 1 === 0, () => `bandPart(): numUpper must be an integer, got ${numUpper}.`);\n    const $a = convertToTensor(a, 'a', 'bandPart');\n    assert($a.rank >= 2, () => `bandPart(): Rank must be at least 2, got ${$a.rank}.`);\n    const shape = $a.shape;\n    const [M, N] = $a.shape.slice(-2);\n    if (!(numLower <= M)) {\n        throw new Error(`bandPart(): numLower (${numLower})` +\n            ` must not be greater than the number of rows (${M}).`);\n    }\n    if (!(numUpper <= N)) {\n        throw new Error(`bandPart(): numUpper (${numUpper})` +\n            ` must not be greater than the number of columns (${N}).`);\n    }\n    if (numLower < 0) {\n        numLower = M;\n    }\n    if (numUpper < 0) {\n        numUpper = N;\n    }\n    const i = reshape(range(0, M, 1, 'int32'), [-1, 1]);\n    const j = range(0, N, 1, 'int32');\n    const ij = sub(i, j);\n    const inBand = logicalAnd(lessEqual(ij, scalar(+numLower, 'int32')), greaterEqual(ij, scalar(-numUpper, 'int32')));\n    const zero = zeros([M, N], $a.dtype);\n    return reshape(stack(unstack(reshape($a, [-1, M, N]))\n        .map(mat => where(inBand, mat, zero))), shape);\n}\nexport const bandPart = op({ bandPart_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFuZF9wYXJ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbGluYWxnL2JhbmRfcGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVsQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQ0c7QUFDSCxTQUFTLFNBQVMsQ0FDZCxDQUFlLEVBQUUsUUFBZ0IsRUFBRSxRQUFnQjtJQUNyRCxNQUFNLENBQ0YsUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLGdEQUFnRCxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sQ0FDRixRQUFRLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFDbEIsR0FBRyxFQUFFLENBQUMsZ0RBQWdELFFBQVEsR0FBRyxDQUFDLENBQUM7SUFFdkUsTUFBTSxFQUFFLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFL0MsTUFBTSxDQUNGLEVBQUUsQ0FBQyxJQUFJLElBQUksQ0FBQyxFQUNaLEdBQUcsRUFBRSxDQUFDLDRDQUE0QyxFQUFFLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUVsRSxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDO0lBQ3ZCLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsQyxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksQ0FBQyxDQUFDLEVBQUU7UUFDcEIsTUFBTSxJQUFJLEtBQUssQ0FDWCx5QkFBeUIsUUFBUSxHQUFHO1lBQ3BDLGlEQUFpRCxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsSUFBSSxDQUFDLENBQUMsUUFBUSxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQ1gseUJBQXlCLFFBQVEsR0FBRztZQUNwQyxvREFBb0QsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNoRTtJQUVELElBQUksUUFBUSxHQUFHLENBQUMsRUFBRTtRQUNoQixRQUFRLEdBQUcsQ0FBQyxDQUFDO0tBQ2Q7SUFDRCxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUU7UUFDaEIsUUFBUSxHQUFHLENBQUMsQ0FBQztLQUNkO0lBRUQsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFckIsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUNyQixTQUFTLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxFQUN6QyxZQUFZLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbEQsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVyQyxPQUFPLE9BQU8sQ0FDSCxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQ2hELEtBQUssQ0FBTSxDQUFDO0FBQ3pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEVBQUMsU0FBUyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4uLy4uL3V0aWwnO1xuXG5pbXBvcnQge2dyZWF0ZXJFcXVhbH0gZnJvbSAnLi4vZ3JlYXRlcl9lcXVhbCc7XG5pbXBvcnQge2xlc3NFcXVhbH0gZnJvbSAnLi4vbGVzc19lcXVhbCc7XG5pbXBvcnQge2xvZ2ljYWxBbmR9IGZyb20gJy4uL2xvZ2ljYWxfYW5kJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3JhbmdlfSBmcm9tICcuLi9yYW5nZSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQge3N0YWNrfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7dW5zdGFja30gZnJvbSAnLi4vdW5zdGFjayc7XG5pbXBvcnQge3doZXJlfSBmcm9tICcuLi93aGVyZSc7XG5pbXBvcnQge3plcm9zfSBmcm9tICcuLi96ZXJvcyc7XG5cbi8qKlxuICogQ29weSBhIHRlbnNvciBzZXR0aW5nIGV2ZXJ5dGhpbmcgb3V0c2lkZSBhIGNlbnRyYWwgYmFuZCBpbiBlYWNoIGlubmVybW9zdFxuICogbWF0cml4IHRvIHplcm8uXG4gKlxuICogVGhlIGJhbmQgcGFydCBpcyBjb21wdXRlZCBhcyBmb2xsb3dzOiBBc3N1bWUgaW5wdXQgaGFzIGBrYCBkaW1lbnNpb25zXG4gKiBgW0ksIEosIEssIC4uLiwgTSwgTl1gLCB0aGVuIHRoZSBvdXRwdXQgaXMgYSB0ZW5zb3Igd2l0aCB0aGUgc2FtZSBzaGFwZSB3aGVyZVxuICogYGJhbmRbaSwgaiwgaywgLi4uLCBtLCBuXSA9IGluX2JhbmQobSwgbikgKiBpbnB1dFtpLCBqLCBrLCAuLi4sIG0sIG5dYC5cbiAqIFRoZSBpbmRpY2F0b3IgZnVuY3Rpb25cbiAqIGBpbl9iYW5kKG0sIG4pID0gKG51bV9sb3dlciA8IDAgfHwgKG0tbikgPD0gbnVtX2xvd2VyKWBcbiAqIGAmJiAobnVtX3VwcGVyIDwgMCB8fCAobi1tKSA8PSBudW1fdXBwZXIpYFxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCB4ID0gdGYudGVuc29yMmQoW1sgMCwgIDEsICAyLCAzXSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgWy0xLCAgMCwgIDEsIDJdLFxuICogICAgICAgICAgICAgICAgICAgICAgICBbLTIsIC0xLCAgMCwgMV0sXG4gKiAgICAgICAgICAgICAgICAgICAgICAgIFstMywgLTIsIC0xLCAwXV0pO1xuICogbGV0IHkgPSB0Zi5saW5hbGcuYmFuZFBhcnQoeCwgMSwgLTEpO1xuICogeS5wcmludCgpOyAvLyBbWyAwLCAgMSwgIDIsIDNdLFxuICogICAgICAgICAgICAvLyAgWy0xLCAgMCwgIDEsIDJdLFxuICogICAgICAgICAgICAvLyAgWyAwLCAtMSwgIDAsIDFdLFxuICogICAgICAgICAgICAvLyAgWyAwLCAwICwgLTEsIDBdXVxuICogbGV0IHogPSB0Zi5saW5hbGcuYmFuZFBhcnQoeCwgMiwgMSk7XG4gKiB6LnByaW50KCk7IC8vIFtbIDAsICAxLCAgMCwgMF0sXG4gKiAgICAgICAgICAgIC8vICBbLTEsICAwLCAgMSwgMF0sXG4gKiAgICAgICAgICAgIC8vICBbLTIsIC0xLCAgMCwgMV0sXG4gKiAgICAgICAgICAgIC8vICBbIDAsIC0yLCAtMSwgMF1dXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geCBSYW5rIGBrYCB0ZW5zb3JcbiAqIEBwYXJhbSBudW1Mb3dlciBOdW1iZXIgb2Ygc3ViZGlhZ29uYWxzIHRvIGtlZXAuXG4gKiAgIElmIG5lZ2F0aXZlLCBrZWVwIGVudGlyZSBsb3dlciB0cmlhbmdsZS5cbiAqIEBwYXJhbSBudW1VcHBlciBOdW1iZXIgb2Ygc3ViZGlhZ29uYWxzIHRvIGtlZXAuXG4gKiAgIElmIG5lZ2F0aXZlLCBrZWVwIGVudGlyZSB1cHBlciB0cmlhbmdsZS5cbiAqIEByZXR1cm5zIFJhbmsgYGtgIHRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBhcyBpbnB1dC5cbiAqICAgVGhlIGV4dHJhY3RlZCBiYW5kZWQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOidMaW5lYXIgQWxnZWJyYScsIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gYmFuZFBhcnRfPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGE6IFR8VGVuc29yTGlrZSwgbnVtTG93ZXI6IG51bWJlciwgbnVtVXBwZXI6IG51bWJlcik6IFQge1xuICBhc3NlcnQoXG4gICAgICBudW1Mb3dlciAlIDEgPT09IDAsXG4gICAgICAoKSA9PiBgYmFuZFBhcnQoKTogbnVtTG93ZXIgbXVzdCBiZSBhbiBpbnRlZ2VyLCBnb3QgJHtudW1Mb3dlcn0uYCk7XG4gIGFzc2VydChcbiAgICAgIG51bVVwcGVyICUgMSA9PT0gMCxcbiAgICAgICgpID0+IGBiYW5kUGFydCgpOiBudW1VcHBlciBtdXN0IGJlIGFuIGludGVnZXIsIGdvdCAke251bVVwcGVyfS5gKTtcblxuICBjb25zdCAkYSA9IGNvbnZlcnRUb1RlbnNvcihhLCAnYScsICdiYW5kUGFydCcpO1xuXG4gIGFzc2VydChcbiAgICAgICRhLnJhbmsgPj0gMixcbiAgICAgICgpID0+IGBiYW5kUGFydCgpOiBSYW5rIG11c3QgYmUgYXQgbGVhc3QgMiwgZ290ICR7JGEucmFua30uYCk7XG5cbiAgY29uc3Qgc2hhcGUgPSAkYS5zaGFwZTtcbiAgY29uc3QgW00sIE5dID0gJGEuc2hhcGUuc2xpY2UoLTIpO1xuXG4gIGlmICghKG51bUxvd2VyIDw9IE0pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYmFuZFBhcnQoKTogbnVtTG93ZXIgKCR7bnVtTG93ZXJ9KWAgK1xuICAgICAgICBgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIHJvd3MgKCR7TX0pLmApO1xuICB9XG4gIGlmICghKG51bVVwcGVyIDw9IE4pKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYmFuZFBhcnQoKTogbnVtVXBwZXIgKCR7bnVtVXBwZXJ9KWAgK1xuICAgICAgICBgIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgKCR7Tn0pLmApO1xuICB9XG5cbiAgaWYgKG51bUxvd2VyIDwgMCkge1xuICAgIG51bUxvd2VyID0gTTtcbiAgfVxuICBpZiAobnVtVXBwZXIgPCAwKSB7XG4gICAgbnVtVXBwZXIgPSBOO1xuICB9XG5cbiAgY29uc3QgaSA9IHJlc2hhcGUocmFuZ2UoMCwgTSwgMSwgJ2ludDMyJyksIFstMSwgMV0pO1xuICBjb25zdCBqID0gcmFuZ2UoMCwgTiwgMSwgJ2ludDMyJyk7XG4gIGNvbnN0IGlqID0gc3ViKGksIGopO1xuXG4gIGNvbnN0IGluQmFuZCA9IGxvZ2ljYWxBbmQoXG4gICAgICBsZXNzRXF1YWwoaWosIHNjYWxhcigrbnVtTG93ZXIsICdpbnQzMicpKSxcbiAgICAgIGdyZWF0ZXJFcXVhbChpaiwgc2NhbGFyKC1udW1VcHBlciwgJ2ludDMyJykpKTtcblxuICBjb25zdCB6ZXJvID0gemVyb3MoW00sIE5dLCAkYS5kdHlwZSk7XG5cbiAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICAgICAgICAgc3RhY2sodW5zdGFjayhyZXNoYXBlKCRhLCBbLTEsIE0sIE5dKSlcbiAgICAgICAgICAgICAgICAgICAgICAgLm1hcChtYXQgPT4gd2hlcmUoaW5CYW5kLCBtYXQsIHplcm8pKSksXG4gICAgICAgICAgICAgc2hhcGUpIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBiYW5kUGFydCA9IG9wKHtiYW5kUGFydF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { assert } from '../../util';\nimport { div } from '../div';\nimport { mul } from '../mul';\nimport { norm } from '../norm';\nimport { op } from '../operation';\nimport { split } from '../split';\nimport { squeeze } from '../squeeze';\nimport { stack } from '../stack';\nimport { sub } from '../sub';\nimport { sum } from '../sum';\n/**\n * Gram-Schmidt orthogonalization.\n *\n * ```js\n * const x = tf.tensor2d([[1, 2], [3, 4]]);\n * let y = tf.linalg.gramSchmidt(x);\n * y.print();\n * console.log('Orthogonalized:');\n * y.dot(y.transpose()).print();  // should be nearly the identity matrix.\n * console.log('First row direction maintained:');\n * const data = await y.array();\n * console.log(data[0][1] / data[0][0]);  // should be nearly 2.\n * ```\n *\n * @param xs The vectors to be orthogonalized, in one of the two following\n *   formats:\n *   - An Array of `tf.Tensor1D`.\n *   - A `tf.Tensor2D`, i.e., a matrix, in which case the vectors are the rows\n *     of `xs`.\n *   In each case, all the vectors must have the same length and the length\n *   must be greater than or equal to the number of vectors.\n * @returns The orthogonalized and normalized vectors or matrix.\n *   Orthogonalization means that the vectors or the rows of the matrix\n *   are orthogonal (zero inner products). Normalization means that each\n *   vector or each row of the matrix has an L2 norm that equals `1`.\n *\n * @doc {heading:'Operations', subheading:'Linear Algebra', namespace:'linalg'}\n */\nfunction gramSchmidt_(xs) {\n    let inputIsTensor2D;\n    if (Array.isArray(xs)) {\n        inputIsTensor2D = false;\n        assert(xs != null && xs.length > 0, () => 'Gram-Schmidt process: input must not be null, undefined, or ' +\n            'empty');\n        const dim = xs[0].shape[0];\n        for (let i = 1; i < xs.length; ++i) {\n            assert(xs[i].shape[0] === dim, () => 'Gram-Schmidt: Non-unique lengths found in the input vectors: ' +\n                `(${xs[i].shape[0]} vs. ${dim})`);\n        }\n    }\n    else {\n        inputIsTensor2D = true;\n        xs = split(xs, xs.shape[0], 0).map(x => squeeze(x, [0]));\n    }\n    assert(xs.length <= xs[0].shape[0], () => `Gram-Schmidt: Number of vectors (${xs.length}) exceeds ` +\n        `number of dimensions (${xs[0].shape[0]}).`);\n    const ys = [];\n    const xs1d = xs;\n    for (let i = 0; i < xs.length; ++i) {\n        ys.push(ENGINE.tidy(() => {\n            let x = xs1d[i];\n            if (i > 0) {\n                for (let j = 0; j < i; ++j) {\n                    const proj = mul(sum(mul(ys[j], x)), ys[j]);\n                    x = sub(x, proj);\n                }\n            }\n            return div(x, norm(x, 'euclidean'));\n        }));\n    }\n    if (inputIsTensor2D) {\n        return stack(ys, 0);\n    }\n    else {\n        return ys;\n    }\n}\nexport const gramSchmidt = op({ gramSchmidt_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhbV9zY2htaWR0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbGluYWxnL2dyYW1fc2NobWlkdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXBDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFM0I7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTJCRztBQUNILFNBQVMsWUFBWSxDQUFDLEVBQXVCO0lBQzNDLElBQUksZUFBd0IsQ0FBQztJQUM3QixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDckIsZUFBZSxHQUFHLEtBQUssQ0FBQztRQUN4QixNQUFNLENBQ0YsRUFBRSxJQUFJLElBQUksSUFBSSxFQUFFLENBQUMsTUFBTSxHQUFHLENBQUMsRUFDM0IsR0FBRyxFQUFFLENBQUMsOERBQThEO1lBQ2hFLE9BQU8sQ0FBQyxDQUFDO1FBQ2pCLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbEMsTUFBTSxDQUNGLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUN0QixHQUFHLEVBQUUsQ0FDRCwrREFBK0Q7Z0JBQy9ELElBQUssRUFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxHQUFHLENBQUMsQ0FBQztTQUMzRDtLQUNGO1NBQU07UUFDTCxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLEVBQUUsR0FBRyxLQUFLLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMxRDtJQUVELE1BQU0sQ0FDRixFQUFFLENBQUMsTUFBTSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzNCLEdBQUcsRUFBRSxDQUFDLG9DQUNLLEVBQWlCLENBQUMsTUFBTSxZQUFZO1FBQzNDLHlCQUEwQixFQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFckUsTUFBTSxFQUFFLEdBQWUsRUFBRSxDQUFDO0lBQzFCLE1BQU0sSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNsQyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoQixJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ1QsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDMUIsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQzVDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNsQjthQUNGO1lBQ0QsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ0w7SUFFRCxJQUFJLGVBQWUsRUFBRTtRQUNuQixPQUFPLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFhLENBQUM7S0FDakM7U0FBTTtRQUNMLE9BQU8sRUFBRSxDQUFDO0tBQ1g7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFlBQVksRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9kaXYnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL211bCc7XG5pbXBvcnQge25vcm19IGZyb20gJy4uL25vcm0nO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7c3BsaXR9IGZyb20gJy4uL3NwbGl0JztcbmltcG9ydCB7c3F1ZWV6ZX0gZnJvbSAnLi4vc3F1ZWV6ZSc7XG5pbXBvcnQge3N0YWNrfSBmcm9tICcuLi9zdGFjayc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vc3ViJztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9zdW0nO1xuXG4vKipcbiAqIEdyYW0tU2NobWlkdCBvcnRob2dvbmFsaXphdGlvbi5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgeCA9IHRmLnRlbnNvcjJkKFtbMSwgMl0sIFszLCA0XV0pO1xuICogbGV0IHkgPSB0Zi5saW5hbGcuZ3JhbVNjaG1pZHQoeCk7XG4gKiB5LnByaW50KCk7XG4gKiBjb25zb2xlLmxvZygnT3J0aG9nb25hbGl6ZWQ6Jyk7XG4gKiB5LmRvdCh5LnRyYW5zcG9zZSgpKS5wcmludCgpOyAgLy8gc2hvdWxkIGJlIG5lYXJseSB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICogY29uc29sZS5sb2coJ0ZpcnN0IHJvdyBkaXJlY3Rpb24gbWFpbnRhaW5lZDonKTtcbiAqIGNvbnN0IGRhdGEgPSBhd2FpdCB5LmFycmF5KCk7XG4gKiBjb25zb2xlLmxvZyhkYXRhWzBdWzFdIC8gZGF0YVswXVswXSk7ICAvLyBzaG91bGQgYmUgbmVhcmx5IDIuXG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0geHMgVGhlIHZlY3RvcnMgdG8gYmUgb3J0aG9nb25hbGl6ZWQsIGluIG9uZSBvZiB0aGUgdHdvIGZvbGxvd2luZ1xuICogICBmb3JtYXRzOlxuICogICAtIEFuIEFycmF5IG9mIGB0Zi5UZW5zb3IxRGAuXG4gKiAgIC0gQSBgdGYuVGVuc29yMkRgLCBpLmUuLCBhIG1hdHJpeCwgaW4gd2hpY2ggY2FzZSB0aGUgdmVjdG9ycyBhcmUgdGhlIHJvd3NcbiAqICAgICBvZiBgeHNgLlxuICogICBJbiBlYWNoIGNhc2UsIGFsbCB0aGUgdmVjdG9ycyBtdXN0IGhhdmUgdGhlIHNhbWUgbGVuZ3RoIGFuZCB0aGUgbGVuZ3RoXG4gKiAgIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgdmVjdG9ycy5cbiAqIEByZXR1cm5zIFRoZSBvcnRob2dvbmFsaXplZCBhbmQgbm9ybWFsaXplZCB2ZWN0b3JzIG9yIG1hdHJpeC5cbiAqICAgT3J0aG9nb25hbGl6YXRpb24gbWVhbnMgdGhhdCB0aGUgdmVjdG9ycyBvciB0aGUgcm93cyBvZiB0aGUgbWF0cml4XG4gKiAgIGFyZSBvcnRob2dvbmFsICh6ZXJvIGlubmVyIHByb2R1Y3RzKS4gTm9ybWFsaXphdGlvbiBtZWFucyB0aGF0IGVhY2hcbiAqICAgdmVjdG9yIG9yIGVhY2ggcm93IG9mIHRoZSBtYXRyaXggaGFzIGFuIEwyIG5vcm0gdGhhdCBlcXVhbHMgYDFgLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOidMaW5lYXIgQWxnZWJyYScsIG5hbWVzcGFjZTonbGluYWxnJ31cbiAqL1xuZnVuY3Rpb24gZ3JhbVNjaG1pZHRfKHhzOiBUZW5zb3IxRFtdfFRlbnNvcjJEKTogVGVuc29yMURbXXxUZW5zb3IyRCB7XG4gIGxldCBpbnB1dElzVGVuc29yMkQ6IGJvb2xlYW47XG4gIGlmIChBcnJheS5pc0FycmF5KHhzKSkge1xuICAgIGlucHV0SXNUZW5zb3IyRCA9IGZhbHNlO1xuICAgIGFzc2VydChcbiAgICAgICAgeHMgIT0gbnVsbCAmJiB4cy5sZW5ndGggPiAwLFxuICAgICAgICAoKSA9PiAnR3JhbS1TY2htaWR0IHByb2Nlc3M6IGlucHV0IG11c3Qgbm90IGJlIG51bGwsIHVuZGVmaW5lZCwgb3IgJyArXG4gICAgICAgICAgICAnZW1wdHknKTtcbiAgICBjb25zdCBkaW0gPSB4c1swXS5zaGFwZVswXTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IHhzLmxlbmd0aDsgKytpKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgICAgeHNbaV0uc2hhcGVbMF0gPT09IGRpbSxcbiAgICAgICAgICAoKSA9PlxuICAgICAgICAgICAgICAnR3JhbS1TY2htaWR0OiBOb24tdW5pcXVlIGxlbmd0aHMgZm91bmQgaW4gdGhlIGlucHV0IHZlY3RvcnM6ICcgK1xuICAgICAgICAgICAgICBgKCR7KHhzIGFzIFRlbnNvcjFEW10pW2ldLnNoYXBlWzBdfSB2cy4gJHtkaW19KWApO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpbnB1dElzVGVuc29yMkQgPSB0cnVlO1xuICAgIHhzID0gc3BsaXQoeHMsIHhzLnNoYXBlWzBdLCAwKS5tYXAoeCA9PiBzcXVlZXplKHgsIFswXSkpO1xuICB9XG5cbiAgYXNzZXJ0KFxuICAgICAgeHMubGVuZ3RoIDw9IHhzWzBdLnNoYXBlWzBdLFxuICAgICAgKCkgPT4gYEdyYW0tU2NobWlkdDogTnVtYmVyIG9mIHZlY3RvcnMgKCR7XG4gICAgICAgICAgICAgICAgKHhzIGFzIFRlbnNvcjFEW10pLmxlbmd0aH0pIGV4Y2VlZHMgYCArXG4gICAgICAgICAgYG51bWJlciBvZiBkaW1lbnNpb25zICgkeyh4cyBhcyBUZW5zb3IxRFtdKVswXS5zaGFwZVswXX0pLmApO1xuXG4gIGNvbnN0IHlzOiBUZW5zb3IxRFtdID0gW107XG4gIGNvbnN0IHhzMWQgPSB4cztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4cy5sZW5ndGg7ICsraSkge1xuICAgIHlzLnB1c2goRU5HSU5FLnRpZHkoKCkgPT4ge1xuICAgICAgbGV0IHggPSB4czFkW2ldO1xuICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgaTsgKytqKSB7XG4gICAgICAgICAgY29uc3QgcHJvaiA9IG11bChzdW0obXVsKHlzW2pdLCB4KSksIHlzW2pdKTtcbiAgICAgICAgICB4ID0gc3ViKHgsIHByb2opO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZGl2KHgsIG5vcm0oeCwgJ2V1Y2xpZGVhbicpKTtcbiAgICB9KSk7XG4gIH1cblxuICBpZiAoaW5wdXRJc1RlbnNvcjJEKSB7XG4gICAgcmV0dXJuIHN0YWNrKHlzLCAwKSBhcyBUZW5zb3IyRDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4geXM7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IGdyYW1TY2htaWR0ID0gb3Aoe2dyYW1TY2htaWR0X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { dispose } from '../../globals';\nimport { assert } from '../../util';\nimport { clone } from '../clone';\nimport { concat } from '../concat';\nimport { div } from '../div';\nimport { eye } from '../eye';\nimport { greater } from '../greater';\nimport { matMul } from '../mat_mul';\nimport { mul } from '../mul';\nimport { neg } from '../neg';\nimport { norm } from '../norm';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\nimport { slice } from '../slice';\nimport { stack } from '../stack';\nimport { sub } from '../sub';\nimport { tensor2d } from '../tensor2d';\nimport { transpose } from '../transpose';\nimport { unstack } from '../unstack';\nimport { where } from '../where';\n/**\n * Compute QR decomposition of m-by-n matrix using Householder transformation.\n *\n * Implementation based on\n *   [http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf]\n * (http://www.cs.cornell.edu/~bindel/class/cs6210-f09/lec18.pdf)\n *\n * ```js\n * const a = tf.tensor2d([[1, 2], [3, 4]]);\n * let [q, r] = tf.linalg.qr(a);\n * console.log('Q');\n * q.print();\n * console.log('R');\n * r.print();\n * console.log('Orthogonalized');\n * q.dot(q.transpose()).print()  // should be nearly the identity matrix.\n * console.log('Reconstructed');\n * q.dot(r).print(); // should be nearly [[1, 2], [3, 4]];\n * ```\n *\n * @param x The `tf.Tensor` to be QR-decomposed. Must have rank >= 2. Suppose\n *   it has the shape `[..., M, N]`.\n * @param fullMatrices An optional boolean parameter. Defaults to `false`.\n *   If `true`, compute full-sized `Q`. If `false` (the default),\n *   compute only the leading N columns of `Q` and `R`.\n * @returns An `Array` of two `tf.Tensor`s: `[Q, R]`. `Q` is a unitary matrix,\n *   i.e., its columns all have unit norm and are mutually orthogonal.\n *   If `M >= N`,\n *     If `fullMatrices` is `false` (default),\n *       - `Q` has a shape of `[..., M, N]`,\n *       - `R` has a shape of `[..., N, N]`.\n *     If `fullMatrices` is `true` (default),\n *       - `Q` has a shape of `[..., M, M]`,\n *       - `R` has a shape of `[..., M, N]`.\n *   If `M < N`,\n *     - `Q` has a shape of `[..., M, M]`,\n *     - `R` has a shape of `[..., M, N]`.\n * @throws If the rank of `x` is less than 2.\n *\n * @doc {heading:'Operations',\n *       subheading:'Linear Algebra',\n *       namespace:'linalg'}\n */\nfunction qr_(x, fullMatrices = false) {\n    assert(x.rank >= 2, () => `qr() requires input tensor to have a rank >= 2, but got rank ${x.rank}`);\n    if (x.rank === 2) {\n        return qr2d(x, fullMatrices);\n    }\n    else {\n        // Rank > 2.\n        // TODO(cais): Below we split the input into individual 2D tensors,\n        //   perform QR decomposition on them and then stack the results back\n        //   together. We should explore whether this can be parallelized.\n        const outerDimsProd = x.shape.slice(0, x.shape.length - 2)\n            .reduce((value, prev) => value * prev);\n        const x2ds = unstack(reshape(x, [\n            outerDimsProd, x.shape[x.shape.length - 2],\n            x.shape[x.shape.length - 1]\n        ]), 0);\n        const q2ds = [];\n        const r2ds = [];\n        x2ds.forEach(x2d => {\n            const [q2d, r2d] = qr2d(x2d, fullMatrices);\n            q2ds.push(q2d);\n            r2ds.push(r2d);\n        });\n        const q = reshape(stack(q2ds, 0), x.shape);\n        const r = reshape(stack(r2ds, 0), x.shape);\n        return [q, r];\n    }\n}\nfunction qr2d(x, fullMatrices = false) {\n    return ENGINE.tidy(() => {\n        assert(x.shape.length === 2, () => `qr2d() requires a 2D Tensor, but got a ${x.shape.length}D Tensor.`);\n        const m = x.shape[0];\n        const n = x.shape[1];\n        let q = eye(m); // Orthogonal transform so far.\n        let r = clone(x); // Transformed matrix so far.\n        const one2D = tensor2d([[1]], [1, 1]);\n        let w = clone(one2D);\n        const iters = m >= n ? n : m;\n        for (let j = 0; j < iters; ++j) {\n            // This tidy within the for-loop ensures we clean up temporary\n            // tensors as soon as they are no longer needed.\n            const rTemp = r;\n            const wTemp = w;\n            const qTemp = q;\n            [w, r, q] = ENGINE.tidy(() => {\n                // Find H = I - tau * w * w', to put zeros below R(j, j).\n                const rjEnd1 = slice(r, [j, j], [m - j, 1]);\n                const normX = norm(rjEnd1);\n                const rjj = slice(r, [j, j], [1, 1]);\n                // The sign() function returns 0 on 0, which causes division by zero.\n                const s = where(greater(rjj, 0), tensor2d([[-1]]), tensor2d([[1]]));\n                const u1 = sub(rjj, mul(s, normX));\n                const wPre = div(rjEnd1, u1);\n                if (wPre.shape[0] === 1) {\n                    w = clone(one2D);\n                }\n                else {\n                    w = concat([\n                        one2D,\n                        slice(wPre, [1, 0], [wPre.shape[0] - 1, wPre.shape[1]])\n                    ], 0);\n                }\n                const tau = neg(div(matMul(s, u1), normX));\n                // -- R := HR, Q := QH.\n                const rjEndAll = slice(r, [j, 0], [m - j, n]);\n                const tauTimesW = mul(tau, w);\n                const wT = transpose(w);\n                if (j === 0) {\n                    r = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll)));\n                }\n                else {\n                    const rTimesTau = sub(rjEndAll, matMul(tauTimesW, matMul(wT, rjEndAll)));\n                    r = concat([slice(r, [0, 0], [j, n]), rTimesTau], 0);\n                }\n                const tawTimesWT = transpose(tauTimesW);\n                const qAllJEnd = slice(q, [0, j], [m, q.shape[1] - j]);\n                if (j === 0) {\n                    q = sub(qAllJEnd, matMul(matMul(qAllJEnd, w), tawTimesWT));\n                }\n                else {\n                    const qTimesTau = sub(qAllJEnd, matMul(matMul(qAllJEnd, w), tawTimesWT));\n                    q = concat([slice(q, [0, 0], [m, j]), qTimesTau], 1);\n                }\n                return [w, r, q];\n            });\n            dispose([rTemp, wTemp, qTemp]);\n        }\n        if (!fullMatrices && m > n) {\n            q = slice(q, [0, 0], [m, n]);\n            r = slice(r, [0, 0], [n, n]);\n        }\n        return [q, r];\n    });\n}\nexport const qr = op({ qr_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9saW5hbGcvcXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRXRDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDckMs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Q0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDNUQ7cUJBQU07b0JBQ0wsTUFBTSxTQUFTLEdBQ1gsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN0RDtnQkFDRCxNQUFNLFVBQVUsR0FBYSxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQ2xELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN2RCxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ1gsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQztpQkFDNUQ7cUJBQU07b0JBQ0wsTUFBTSxTQUFTLEdBQ1gsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO29CQUMzRCxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUN0RDtnQkFDRCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNuQixDQUFDLENBQUMsQ0FBQztZQUNILE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUNoQztRQUVELElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUMxQixDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFFRCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2hCLENBQUMsQ0FBeUIsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFDLEdBQUcsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7ZGlzcG9zZX0gZnJvbSAnLi4vLi4vZ2xvYmFscyc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMkR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2xvbmV9IGZyb20gJy4uL2Nsb25lJztcbmltcG9ydCB7Y29uY2F0fSBmcm9tICcuLi9jb25jYXQnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL2Rpdic7XG5pbXBvcnQge2V5ZX0gZnJvbSAnLi4vZXllJztcbmltcG9ydCB7Z3JlYXRlcn0gZnJvbSAnLi4vZ3JlYXRlcic7XG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi4vbWF0X211bCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHtub3JtfSBmcm9tICcuLi9ub3JtJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL3Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vc2xpY2UnO1xuaW1wb3J0IHtzdGFja30gZnJvbSAnLi4vc3RhY2snO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4uL3N1Yic7XG5pbXBvcnQge3RlbnNvcjJkfSBmcm9tICcuLi90ZW5zb3IyZCc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi4vdHJhbnNwb3NlJztcbmltcG9ydCB7dW5zdGFja30gZnJvbSAnLi4vdW5zdGFjayc7XG5pbXBvcnQge3doZXJlfSBmcm9tICcuLi93aGVyZSc7XG5cbi8qKlxuICogQ29tcHV0ZSBRUiBkZWNvbXBvc2l0aW9uIG9mIG0tYnktbiBtYXRyaXggdXNpbmcgSG91c2Vob2xkZXIgdHJhbnNmb3JtYXRpb24uXG4gKlxuICogSW1wbGVtZW50YXRpb24gYmFzZWQgb25cbiAqICAgW2h0dHA6Ly93d3cuY3MuY29ybmVsbC5lZHUvfmJpbmRlbC9jbGFzcy9jczYyMTAtZjA5L2xlYzE4LnBkZl1cbiAqIChodHRwOi8vd3d3LmNzLmNvcm5lbGwuZWR1L35iaW5kZWwvY2xhc3MvY3M2MjEwLWYwOS9sZWMxOC5wZGYpXG4gKlxuICogYGBganNcbiAqIGNvbnN0IGEgPSB0Zi50ZW5zb3IyZChbWzEsIDJdLCBbMywgNF1dKTtcbiAqIGxldCBbcSwgcl0gPSB0Zi5saW5hbGcucXIoYSk7XG4gKiBjb25zb2xlLmxvZygnUScpO1xuICogcS5wcmludCgpO1xuICogY29uc29sZS5sb2coJ1InKTtcbiAqIHIucHJpbnQoKTtcbiAqIGNvbnNvbGUubG9nKCdPcnRob2dvbmFsaXplZCcpO1xuICogcS5kb3QocS50cmFuc3Bvc2UoKSkucHJpbnQoKSAgLy8gc2hvdWxkIGJlIG5lYXJseSB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICogY29uc29sZS5sb2coJ1JlY29uc3RydWN0ZWQnKTtcbiAqIHEuZG90KHIpLnByaW50KCk7IC8vIHNob3VsZCBiZSBuZWFybHkgW1sxLCAyXSwgWzMsIDRdXTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB4IFRoZSBgdGYuVGVuc29yYCB0byBiZSBRUi1kZWNvbXBvc2VkLiBNdXN0IGhhdmUgcmFuayA+PSAyLiBTdXBwb3NlXG4gKiAgIGl0IGhhcyB0aGUgc2hhcGUgYFsuLi4sIE0sIE5dYC5cbiAqIEBwYXJhbSBmdWxsTWF0cmljZXMgQW4gb3B0aW9uYWwgYm9vbGVhbiBwYXJhbWV0ZXIuIERlZmF1bHRzIHRvIGBmYWxzZWAuXG4gKiAgIElmIGB0cnVlYCwgY29tcHV0ZSBmdWxsLXNpemVkIGBRYC4gSWYgYGZhbHNlYCAodGhlIGRlZmF1bHQpLFxuICogICBjb21wdXRlIG9ubHkgdGhlIGxlYWRpbmcgTiBjb2x1bW5zIG9mIGBRYCBhbmQgYFJgLlxuICogQHJldHVybnMgQW4gYEFycmF5YCBvZiB0d28gYHRmLlRlbnNvcmBzOiBgW1EsIFJdYC4gYFFgIGlzIGEgdW5pdGFyeSBtYXRyaXgsXG4gKiAgIGkuZS4sIGl0cyBjb2x1bW5zIGFsbCBoYXZlIHVuaXQgbm9ybSBhbmQgYXJlIG11dHVhbGx5IG9ydGhvZ29uYWwuXG4gKiAgIElmIGBNID49IE5gLFxuICogICAgIElmIGBmdWxsTWF0cmljZXNgIGlzIGBmYWxzZWAgKGRlZmF1bHQpLFxuICogICAgICAgLSBgUWAgaGFzIGEgc2hhcGUgb2YgYFsuLi4sIE0sIE5dYCxcbiAqICAgICAgIC0gYFJgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBOLCBOXWAuXG4gKiAgICAgSWYgYGZ1bGxNYXRyaWNlc2AgaXMgYHRydWVgIChkZWZhdWx0KSxcbiAqICAgICAgIC0gYFFgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBNXWAsXG4gKiAgICAgICAtIGBSYCBoYXMgYSBzaGFwZSBvZiBgWy4uLiwgTSwgTl1gLlxuICogICBJZiBgTSA8IE5gLFxuICogICAgIC0gYFFgIGhhcyBhIHNoYXBlIG9mIGBbLi4uLCBNLCBNXWAsXG4gKiAgICAgLSBgUmAgaGFzIGEgc2hhcGUgb2YgYFsuLi4sIE0sIE5dYC5cbiAqIEB0aHJvd3MgSWYgdGhlIHJhbmsgb2YgYHhgIGlzIGxlc3MgdGhhbiAyLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6J09wZXJhdGlvbnMnLFxuICogICAgICAgc3ViaGVhZGluZzonTGluZWFyIEFsZ2VicmEnLFxuICogICAgICAgbmFtZXNwYWNlOidsaW5hbGcnfVxuICovXG5mdW5jdGlvbiBxcl8oeDogVGVuc29yLCBmdWxsTWF0cmljZXMgPSBmYWxzZSk6IFtUZW5zb3IsIFRlbnNvcl0ge1xuICBhc3NlcnQoXG4gICAgICB4LnJhbmsgPj0gMixcbiAgICAgICgpID0+IGBxcigpIHJlcXVpcmVzIGlucHV0IHRlbnNvciB0byBoYXZlIGEgcmFuayA+PSAyLCBidXQgZ290IHJhbmsgJHtcbiAgICAgICAgICB4LnJhbmt9YCk7XG5cbiAgaWYgKHgucmFuayA9PT0gMikge1xuICAgIHJldHVybiBxcjJkKHggYXMgVGVuc29yMkQsIGZ1bGxNYXRyaWNlcyk7XG4gIH0gZWxzZSB7XG4gICAgLy8gUmFuayA+IDIuXG4gICAgLy8gVE9ETyhjYWlzKTogQmVsb3cgd2Ugc3BsaXQgdGhlIGlucHV0IGludG8gaW5kaXZpZHVhbCAyRCB0ZW5zb3JzLFxuICAgIC8vICAgcGVyZm9ybSBRUiBkZWNvbXBvc2l0aW9uIG9uIHRoZW0gYW5kIHRoZW4gc3RhY2sgdGhlIHJlc3VsdHMgYmFja1xuICAgIC8vICAgdG9nZXRoZXIuIFdlIHNob3VsZCBleHBsb3JlIHdoZXRoZXIgdGhpcyBjYW4gYmUgcGFyYWxsZWxpemVkLlxuICAgIGNvbnN0IG91dGVyRGltc1Byb2QgPSB4LnNoYXBlLnNsaWNlKDAsIHguc2hhcGUubGVuZ3RoIC0gMilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKHZhbHVlLCBwcmV2KSA9PiB2YWx1ZSAqIHByZXYpO1xuICAgIGNvbnN0IHgyZHMgPSB1bnN0YWNrKFxuICAgICAgICByZXNoYXBlKFxuICAgICAgICAgICAgeCxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgb3V0ZXJEaW1zUHJvZCwgeC5zaGFwZVt4LnNoYXBlLmxlbmd0aCAtIDJdLFxuICAgICAgICAgICAgICB4LnNoYXBlW3guc2hhcGUubGVuZ3RoIC0gMV1cbiAgICAgICAgICAgIF0pLFxuICAgICAgICAwKTtcbiAgICBjb25zdCBxMmRzOiBUZW5zb3IyRFtdID0gW107XG4gICAgY29uc3QgcjJkczogVGVuc29yMkRbXSA9IFtdO1xuICAgIHgyZHMuZm9yRWFjaCh4MmQgPT4ge1xuICAgICAgY29uc3QgW3EyZCwgcjJkXSA9IHFyMmQoeDJkIGFzIFRlbnNvcjJELCBmdWxsTWF0cmljZXMpO1xuICAgICAgcTJkcy5wdXNoKHEyZCk7XG4gICAgICByMmRzLnB1c2gocjJkKTtcbiAgICB9KTtcbiAgICBjb25zdCBxID0gcmVzaGFwZShzdGFjayhxMmRzLCAwKSwgeC5zaGFwZSk7XG4gICAgY29uc3QgciA9IHJlc2hhcGUoc3RhY2socjJkcywgMCksIHguc2hhcGUpO1xuICAgIHJldHVybiBbcSwgcl07XG4gIH1cbn1cblxuZnVuY3Rpb24gcXIyZCh4OiBUZW5zb3IyRCwgZnVsbE1hdHJpY2VzID0gZmFsc2UpOiBbVGVuc29yMkQsIFRlbnNvcjJEXSB7XG4gIHJldHVybiBFTkdJTkUudGlkeSgoKSA9PiB7XG4gICAgYXNzZXJ0KFxuICAgICAgICB4LnNoYXBlLmxlbmd0aCA9PT0gMixcbiAgICAgICAgKCkgPT4gYHFyMmQoKSByZXF1aXJlcyBhIDJEIFRlbnNvciwgYnV0IGdvdCBhICR7XG4gICAgICAgICAgICB4LnNoYXBlLmxlbmd0aH1EIFRlbnNvci5gKTtcblxuICAgIGNvbnN0IG0gPSB4LnNoYXBlWzBdO1xuICAgIGNvbnN0IG4gPSB4LnNoYXBlWzFdO1xuXG4gICAgbGV0IHEgPSBleWUobSk7ICAgIC8vIE9ydGhvZ29uYWwgdHJhbnNmb3JtIHNvIGZhci5cbiAgICBsZXQgciA9IGNsb25lKHgpOyAgLy8gVHJhbnNmb3JtZWQgbWF0cml4IHNvIGZhci5cblxuICAgIGNvbnN0IG9uZTJEID0gdGVuc29yMmQoW1sxXV0sIFsxLCAxXSk7XG4gICAgbGV0IHc6IFRlbnNvcjJEID0gY2xvbmUob25lMkQpO1xuXG4gICAgY29uc3QgaXRlcnMgPSBtID49IG4gPyBuIDogbTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGl0ZXJzOyArK2opIHtcbiAgICAgIC8vIFRoaXMgdGlkeSB3aXRoaW4gdGhlIGZvci1sb29wIGVuc3VyZXMgd2UgY2xlYW4gdXAgdGVtcG9yYXJ5XG4gICAgICAvLyB0ZW5zb3JzIGFzIHNvb24gYXMgdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgIGNvbnN0IHJUZW1wID0gcjtcbiAgICAgIGNvbnN0IHdUZW1wID0gdztcbiAgICAgIGNvbnN0IHFUZW1wID0gcTtcbiAgICAgIFt3LCByLCBxXSA9IEVOR0lORS50aWR5KCgpOiBbVGVuc29yMkQsIFRlbnNvcjJELCBUZW5zb3IyRF0gPT4ge1xuICAgICAgICAvLyBGaW5kIEggPSBJIC0gdGF1ICogdyAqIHcnLCB0byBwdXQgemVyb3MgYmVsb3cgUihqLCBqKS5cbiAgICAgICAgY29uc3QgcmpFbmQxID0gc2xpY2UociwgW2osIGpdLCBbbSAtIGosIDFdKTtcbiAgICAgICAgY29uc3Qgbm9ybVggPSBub3JtKHJqRW5kMSk7XG4gICAgICAgIGNvbnN0IHJqaiA9IHNsaWNlKHIsIFtqLCBqXSwgWzEsIDFdKTtcblxuICAgICAgICAvLyBUaGUgc2lnbigpIGZ1bmN0aW9uIHJldHVybnMgMCBvbiAwLCB3aGljaCBjYXVzZXMgZGl2aXNpb24gYnkgemVyby5cbiAgICAgICAgY29uc3QgcyA9IHdoZXJlKGdyZWF0ZXIocmpqLCAwKSwgdGVuc29yMmQoW1stMV1dKSwgdGVuc29yMmQoW1sxXV0pKTtcblxuICAgICAgICBjb25zdCB1MSA9IHN1YihyamosIG11bChzLCBub3JtWCkpO1xuICAgICAgICBjb25zdCB3UHJlID0gZGl2KHJqRW5kMSwgdTEpO1xuICAgICAgICBpZiAod1ByZS5zaGFwZVswXSA9PT0gMSkge1xuICAgICAgICAgIHcgPSBjbG9uZShvbmUyRCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdyA9IGNvbmNhdChcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIG9uZTJELFxuICAgICAgICAgICAgICAgIHNsaWNlKHdQcmUsIFsxLCAwXSwgW3dQcmUuc2hhcGVbMF0gLSAxLCB3UHJlLnNoYXBlWzFdXSkgYXNcbiAgICAgICAgICAgICAgICAgICAgVGVuc29yMkRcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGF1ID0gbmVnKGRpdihtYXRNdWwocywgdTEpLCBub3JtWCkpIGFzIFRlbnNvcjJEO1xuXG4gICAgICAgIC8vIC0tIFIgOj0gSFIsIFEgOj0gUUguXG4gICAgICAgIGNvbnN0IHJqRW5kQWxsID0gc2xpY2UociwgW2osIDBdLCBbbSAtIGosIG5dKTtcbiAgICAgICAgY29uc3QgdGF1VGltZXNXOiBUZW5zb3IyRCA9IG11bCh0YXUsIHcpO1xuICAgICAgICBjb25zdCB3VDogVGVuc29yMkQgPSB0cmFuc3Bvc2Uodyk7XG4gICAgICAgIGlmIChqID09PSAwKSB7XG4gICAgICAgICAgciA9IHN1YihyakVuZEFsbCwgbWF0TXVsKHRhdVRpbWVzVywgbWF0TXVsKHdULCByakVuZEFsbCkpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25zdCByVGltZXNUYXU6IFRlbnNvcjJEID1cbiAgICAgICAgICAgICAgc3ViKHJqRW5kQWxsLCBtYXRNdWwodGF1VGltZXNXLCBtYXRNdWwod1QsIHJqRW5kQWxsKSkpO1xuICAgICAgICAgIHIgPSBjb25jYXQoW3NsaWNlKHIsIFswLCAwXSwgW2osIG5dKSwgclRpbWVzVGF1XSwgMCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdGF3VGltZXNXVDogVGVuc29yMkQgPSB0cmFuc3Bvc2UodGF1VGltZXNXKTtcbiAgICAgICAgY29uc3QgcUFsbEpFbmQgPSBzbGljZShxLCBbMCwgal0sIFttLCBxLnNoYXBlWzFdIC0gal0pO1xuICAgICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICAgIHEgPSBzdWIocUFsbEpFbmQsIG1hdE11bChtYXRNdWwocUFsbEpFbmQsIHcpLCB0YXdUaW1lc1dUKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgcVRpbWVzVGF1OiBUZW5zb3IyRCA9XG4gICAgICAgICAgICAgIHN1YihxQWxsSkVuZCwgbWF0TXVsKG1hdE11bChxQWxsSkVuZCwgdyksIHRhd1RpbWVzV1QpKTtcbiAgICAgICAgICBxID0gY29uY2F0KFtzbGljZShxLCBbMCwgMF0sIFttLCBqXSksIHFUaW1lc1RhdV0sIDEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbdywgciwgcV07XG4gICAgICB9KTtcbiAgICAgIGRpc3Bvc2UoW3JUZW1wLCB3VGVtcCwgcVRlbXBdKTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bGxNYXRyaWNlcyAmJiBtID4gbikge1xuICAgICAgcSA9IHNsaWNlKHEsIFswLCAwXSwgW20sIG5dKTtcbiAgICAgIHIgPSBzbGljZShyLCBbMCwgMF0sIFtuLCBuXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIFtxLCByXTtcbiAgfSkgYXMgW1RlbnNvcjJELCBUZW5zb3IyRF07XG59XG5cbmV4cG9ydCBjb25zdCBxciA9IG9wKHtxcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport var Reduction;\n(function (Reduction) {\n    Reduction[Reduction[\"NONE\"] = 0] = \"NONE\";\n    Reduction[Reduction[\"MEAN\"] = 1] = \"MEAN\";\n    Reduction[Reduction[\"SUM\"] = 2] = \"SUM\";\n    Reduction[Reduction[\"SUM_BY_NONZERO_WEIGHTS\"] = 3] = \"SUM_BY_NONZERO_WEIGHTS\";\n})(Reduction || (Reduction = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9zc19vcHNfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb3NzX29wc191dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxNQUFNLENBQU4sSUFBWSxTQUtYO0FBTEQsV0FBWSxTQUFTO0lBQ25CLHlDQUFJLENBQUE7SUFDSix5Q0FBSSxDQUFBO0lBQ0osdUNBQUcsQ0FBQTtJQUNILDZFQUFzQixDQUFBO0FBQ3hCLENBQUMsRUFMVyxTQUFTLEtBQVQsU0FBUyxRQUtwQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuZXhwb3J0IGVudW0gUmVkdWN0aW9uIHtcbiAgTk9ORSxcbiAgTUVBTixcbiAgU1VNLFxuICBTVU1fQllfTk9OWkVST19XRUlHSFRTXG59XG4iXX0=","import { convertToTensor } from '../../tensor_util_env';\nimport { cast } from '../cast';\nimport { div } from '../div';\nimport { Reduction } from '../loss_ops_utils';\nimport { mean } from '../mean';\nimport { mul } from '../mul';\nimport { notEqual } from '../not_equal';\nimport { ones } from '../ones';\nimport { op } from '../operation';\nimport { scalar } from '../scalar';\nimport { sum } from '../sum';\n/**\n * Computes the weighted loss between two tensors.\n *\n * @param losses Tensor of shape `[batch_size, d1, ..., dN]`.\n * @param weights Tensor whose rank is either 0, or the same rank as\n *    `losses`, and must be broadcastable to `losses` (i.e., all\n *    dimensions must be either `1`, or the same as the corresponding\n *    `losses` dimension).\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction computeWeightedLoss_(losses, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    const $losses = convertToTensor(losses, 'losses', 'computeWeightedLoss');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'computeWeightedLoss');\n    }\n    const weightedLoss = ($weights == null) ? $losses : mul($losses, $weights);\n    if (reduction === Reduction.NONE) {\n        return weightedLoss;\n    }\n    if (reduction === Reduction.SUM) {\n        return sum(weightedLoss);\n    }\n    if (reduction === Reduction.MEAN) {\n        if ($weights == null) {\n            return mean(weightedLoss);\n        }\n        else {\n            const broadcastFactor = $losses.size / $weights.size;\n            const result = div(sum(weightedLoss), sum($weights));\n            return broadcastFactor > 1 ? div(result, scalar(broadcastFactor)) :\n                result;\n        }\n    }\n    if (reduction === Reduction.SUM_BY_NONZERO_WEIGHTS) {\n        if ($weights == null) {\n            return div(sum(weightedLoss), scalar($losses.size));\n        }\n        else {\n            const broadcastedWeights = mul($weights, ones($losses.shape));\n            const numNonZeros = cast(sum(notEqual(broadcastedWeights, scalar(0))), 'float32');\n            return div(sum(weightedLoss), numNonZeros);\n        }\n    }\n    throw Error(`Unknown reduction: ${reduction}`);\n}\nexport const computeWeightedLoss = op({ computeWeightedLoss_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcHV0ZV93ZWlnaHRlZF9sb3NzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL2NvbXB1dGVfd2VpZ2h0ZWRfbG9zcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3RELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDdEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUUzQjs7Ozs7Ozs7OztHQVVHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDekIsTUFBb0IsRUFBRSxPQUEyQixFQUNqRCxTQUFTLEdBQUcsU0FBUyxDQUFDLHNCQUFzQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3pFLElBQUksUUFBUSxHQUFXLElBQUksQ0FBQztJQUM1QixJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDdkU7SUFFRCxNQUFNLFlBQVksR0FBRyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTNFLElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsT0FBTyxZQUFpQixDQUFDO0tBQzFCO0lBQ0QsSUFBSSxTQUFTLEtBQUssU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUMvQixPQUFPLEdBQUcsQ0FBQyxZQUFZLENBQUMsQ0FBQztLQUMxQjtJQUNELElBQUksU0FBUyxLQUFLLFNBQVMsQ0FBQyxJQUFJLEVBQUU7UUFDaEMsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQzNCO2FBQU07WUFDTCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7WUFDckQsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUNyRCxPQUFPLGVBQWUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBVyxDQUFDO1NBQzFDO0tBQ0Y7SUFDRCxJQUFJLFNBQVMsS0FBSyxTQUFTLENBQUMsc0JBQXNCLEVBQUU7UUFDbEQsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3BCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDckQ7YUFBTTtZQUNMLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFFOUQsTUFBTSxXQUFXLEdBQ2IsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDNUM7S0FDRjtJQUVELE1BQU0sS0FBSyxDQUFDLHNCQUFzQixTQUFTLEVBQUUsQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsRUFBQyxvQkFBb0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge21lYW59IGZyb20gJy4uL21lYW4nO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL211bCc7XG5pbXBvcnQge25vdEVxdWFsfSBmcm9tICcuLi9ub3RfZXF1YWwnO1xuaW1wb3J0IHtvbmVzfSBmcm9tICcuLi9vbmVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9zdW0nO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSB3ZWlnaHRlZCBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxvc3NlcyBUZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaF9zaXplLCBkMSwgLi4uLCBkTl1gLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsb3NzZXNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsb3NzZXNgIChpLmUuLCBhbGxcbiAqICAgIGRpbWVuc2lvbnMgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgYGxvc3Nlc2AgZGltZW5zaW9uKS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnTG9zc2VzJywgbmFtZXNwYWNlOiAnbG9zc2VzJ31cbiAqL1xuZnVuY3Rpb24gY29tcHV0ZVdlaWdodGVkTG9zc188VCBleHRlbmRzIFRlbnNvciwgTyBleHRlbmRzIFRlbnNvcj4oXG4gICAgbG9zc2VzOiBUfFRlbnNvckxpa2UsIHdlaWdodHM/OiBUZW5zb3J8VGVuc29yTGlrZSxcbiAgICByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk6IE8ge1xuICBjb25zdCAkbG9zc2VzID0gY29udmVydFRvVGVuc29yKGxvc3NlcywgJ2xvc3NlcycsICdjb21wdXRlV2VpZ2h0ZWRMb3NzJyk7XG4gIGxldCAkd2VpZ2h0czogVGVuc29yID0gbnVsbDtcbiAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2NvbXB1dGVXZWlnaHRlZExvc3MnKTtcbiAgfVxuXG4gIGNvbnN0IHdlaWdodGVkTG9zcyA9ICgkd2VpZ2h0cyA9PSBudWxsKSA/ICRsb3NzZXMgOiBtdWwoJGxvc3NlcywgJHdlaWdodHMpO1xuXG4gIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5OT05FKSB7XG4gICAgcmV0dXJuIHdlaWdodGVkTG9zcyBhcyBPO1xuICB9XG4gIGlmIChyZWR1Y3Rpb24gPT09IFJlZHVjdGlvbi5TVU0pIHtcbiAgICByZXR1cm4gc3VtKHdlaWdodGVkTG9zcyk7XG4gIH1cbiAgaWYgKHJlZHVjdGlvbiA9PT0gUmVkdWN0aW9uLk1FQU4pIHtcbiAgICBpZiAoJHdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIG1lYW4od2VpZ2h0ZWRMb3NzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgYnJvYWRjYXN0RmFjdG9yID0gJGxvc3Nlcy5zaXplIC8gJHdlaWdodHMuc2l6ZTtcbiAgICAgIGNvbnN0IHJlc3VsdCA9IGRpdihzdW0od2VpZ2h0ZWRMb3NzKSwgc3VtKCR3ZWlnaHRzKSk7XG4gICAgICByZXR1cm4gYnJvYWRjYXN0RmFjdG9yID4gMSA/IGRpdihyZXN1bHQsIHNjYWxhcihicm9hZGNhc3RGYWN0b3IpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCBhcyBPO1xuICAgIH1cbiAgfVxuICBpZiAocmVkdWN0aW9uID09PSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUykge1xuICAgIGlmICgkd2VpZ2h0cyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gZGl2KHN1bSh3ZWlnaHRlZExvc3MpLCBzY2FsYXIoJGxvc3Nlcy5zaXplKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdGVkV2VpZ2h0cyA9IG11bCgkd2VpZ2h0cywgb25lcygkbG9zc2VzLnNoYXBlKSk7XG5cbiAgICAgIGNvbnN0IG51bU5vblplcm9zID1cbiAgICAgICAgICBjYXN0KHN1bShub3RFcXVhbChicm9hZGNhc3RlZFdlaWdodHMsIHNjYWxhcigwKSkpLCAnZmxvYXQzMicpO1xuICAgICAgcmV0dXJuIGRpdihzdW0od2VpZ2h0ZWRMb3NzKSwgbnVtTm9uWmVyb3MpO1xuICAgIH1cbiAgfVxuXG4gIHRocm93IEVycm9yKGBVbmtub3duIHJlZHVjdGlvbjogJHtyZWR1Y3Rpb259YCk7XG59XG5leHBvcnQgY29uc3QgY29tcHV0ZVdlaWdodGVkTG9zcyA9IG9wKHtjb21wdXRlV2VpZ2h0ZWRMb3NzX30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { abs } from '../abs';\nimport { Reduction } from '../loss_ops_utils';\nimport { op } from '../operation';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the absolute difference loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n *    'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n *    must be either `1`, or the same as the corresponding `losses`\n *    dimension).\n * @param reduction Type of reduction to apply to loss. Should be of type\n *    `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction absoluteDifference_(labels, predictions, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    const $labels = convertToTensor(labels, 'labels', 'absoluteDifference');\n    const $predictions = convertToTensor(predictions, 'predictions', 'absoluteDifference');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'absoluteDifference');\n    }\n    assertShapesMatch($labels.shape, $predictions.shape, 'Error in absoluteDifference: ');\n    const losses = abs(sub($labels, $predictions));\n    return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const absoluteDifference = op({ absoluteDifference_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzb2x1dGVfZGlmZmVyZW5jZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvc3Nlcy9hYnNvbHV0ZV9kaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTNCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxtQkFBbUIsQ0FDeEIsTUFBb0IsRUFBRSxXQUF5QixFQUMvQyxPQUEyQixFQUMzQixTQUFTLEdBQUcsU0FBUyxDQUFDLHNCQUFzQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sWUFBWSxHQUNkLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDdEUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztLQUN0RTtJQUNELGlCQUFpQixDQUNiLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBRXhFLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDL0MsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxFQUFFLENBQUMsRUFBQyxtQkFBbUIsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0U2hhcGVzTWF0Y2h9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHthYnN9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQge1JlZHVjdGlvbn0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogQHBhcmFtIGxhYmVscyBUaGUgZ3JvdW5kIHRydXRoIG91dHB1dCB0ZW5zb3IsIHNhbWUgZGltZW5zaW9ucyBhc1xuICogICAgJ3ByZWRpY3Rpb25zJy5cbiAqIEBwYXJhbSBwcmVkaWN0aW9ucyBUaGUgcHJlZGljdGVkIG91dHB1dHMuXG4gKiBAcGFyYW0gd2VpZ2h0cyBUZW5zb3Igd2hvc2UgcmFuayBpcyBlaXRoZXIgMCwgb3IgdGhlIHNhbWUgcmFuayBhc1xuICogICAgYGxhYmVsc2AsIGFuZCBtdXN0IGJlIGJyb2FkY2FzdGFibGUgdG8gYGxhYmVsc2AgKGkuZS4sIGFsbCBkaW1lbnNpb25zXG4gKiAgICBtdXN0IGJlIGVpdGhlciBgMWAsIG9yIHRoZSBzYW1lIGFzIHRoZSBjb3JyZXNwb25kaW5nIGBsb3NzZXNgXG4gKiAgICBkaW1lbnNpb24pLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnTG9zc2VzJywgbmFtZXNwYWNlOiAnbG9zc2VzJ31cbiAqL1xuZnVuY3Rpb24gYWJzb2x1dGVEaWZmZXJlbmNlXzxUIGV4dGVuZHMgVGVuc29yLCBPIGV4dGVuZHMgVGVuc29yPihcbiAgICBsYWJlbHM6IFR8VGVuc29yTGlrZSwgcHJlZGljdGlvbnM6IFR8VGVuc29yTGlrZSxcbiAgICB3ZWlnaHRzPzogVGVuc29yfFRlbnNvckxpa2UsXG4gICAgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpOiBPIHtcbiAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnYWJzb2x1dGVEaWZmZXJlbmNlJyk7XG4gIGNvbnN0ICRwcmVkaWN0aW9ucyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdhYnNvbHV0ZURpZmZlcmVuY2UnKTtcbiAgbGV0ICR3ZWlnaHRzOiBUZW5zb3IgPSBudWxsO1xuICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnYWJzb2x1dGVEaWZmZXJlbmNlJyk7XG4gIH1cbiAgYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBhYnNvbHV0ZURpZmZlcmVuY2U6ICcpO1xuXG4gIGNvbnN0IGxvc3NlcyA9IGFicyhzdWIoJGxhYmVscywgJHByZWRpY3Rpb25zKSk7XG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5cbmV4cG9ydCBjb25zdCBhYnNvbHV0ZURpZmZlcmVuY2UgPSBvcCh7YWJzb2x1dGVEaWZmZXJlbmNlX30pO1xuIl19","import { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { sum } from '../sum';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the cosine distance loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n *    'predictions'.\n * @param predictions The predicted outputs.\n * @param axis The dimension along which the cosine distance is computed.\n * @param weights Tensor whose rank is either 0, or the same rank as\n *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n *    must be either `1`, or the same as the corresponding `losses`\n *    dimension).\n * @param reduction Type of reduction to apply to loss. Should be of type\n *    `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction cosineDistance_(labels, predictions, axis, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    const $labels = convertToTensor(labels, 'labels', 'cosineDistance');\n    const $predictions = convertToTensor(predictions, 'predictions', 'cosineDistance');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'cosineDistance');\n    }\n    assertShapesMatch($labels.shape, $predictions.shape, 'Error in cosineDistance: ');\n    const one = scalar(1);\n    const losses = sub(one, sum(mul($labels, $predictions), axis, true));\n    return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const cosineDistance = op({ cosineDistance_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zaW5lX2Rpc3RhbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL2Nvc2luZV9kaXN0YW5jZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTNCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVEOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMsZUFBZSxDQUNwQixNQUFvQixFQUFFLFdBQXlCLEVBQUUsSUFBWSxFQUM3RCxPQUEyQixFQUMzQixTQUFTLEdBQUcsU0FBUyxDQUFDLHNCQUFzQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sWUFBWSxHQUNkLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDbEUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztLQUNsRTtJQUNELGlCQUFpQixDQUNiLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSwyQkFBMkIsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0QixNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFlBQVksQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLEVBQUUsQ0FBQyxFQUFDLGVBQWUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL3N1bSc7XG5cbmltcG9ydCB7Y29tcHV0ZVdlaWdodGVkTG9zc30gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBjb3NpbmUgZGlzdGFuY2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIGF4aXMgVGhlIGRpbWVuc2lvbiBhbG9uZyB3aGljaCB0aGUgY29zaW5lIGRpc3RhbmNlIGlzIGNvbXB1dGVkLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGNvc2luZURpc3RhbmNlXzxUIGV4dGVuZHMgVGVuc29yLCBPIGV4dGVuZHMgVGVuc29yPihcbiAgICBsYWJlbHM6IFR8VGVuc29yTGlrZSwgcHJlZGljdGlvbnM6IFR8VGVuc29yTGlrZSwgYXhpczogbnVtYmVyLFxuICAgIHdlaWdodHM/OiBUZW5zb3J8VGVuc29yTGlrZSxcbiAgICByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk6IE8ge1xuICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdjb3NpbmVEaXN0YW5jZScpO1xuICBjb25zdCAkcHJlZGljdGlvbnMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgbGV0ICR3ZWlnaHRzOiBUZW5zb3IgPSBudWxsO1xuICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnY29zaW5lRGlzdGFuY2UnKTtcbiAgfVxuICBhc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGNvc2luZURpc3RhbmNlOiAnKTtcblxuICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gIGNvbnN0IGxvc3NlcyA9IHN1YihvbmUsIHN1bShtdWwoJGxhYmVscywgJHByZWRpY3Rpb25zKSwgYXhpcywgdHJ1ZSkpO1xuICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGNvc2luZURpc3RhbmNlID0gb3Aoe2Nvc2luZURpc3RhbmNlX30pO1xuIl19","import { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { relu } from '../relu';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the Hinge loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n *    'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n *    must be either `1`, or the same as the corresponding `losses`\n *    dimension).\n * @param reduction Type of reduction to apply to loss. Should be of type\n *    `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction hingeLoss_(labels, predictions, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    let $labels = convertToTensor(labels, 'labels', 'hingeLoss');\n    const $predictions = convertToTensor(predictions, 'predictions', 'hingeLoss');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'hingeLoss');\n    }\n    assertShapesMatch($labels.shape, $predictions.shape, 'Error in hingeLoss: ');\n    const one = scalar(1);\n    // Convert binary labels to (-1, 1)\n    $labels = sub(mul(scalar(2), $labels), one);\n    const losses = relu(sub(one, mul($labels, $predictions)));\n    return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const hingeLoss = op({ hingeLoss_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGluZ2VfbG9zcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvc3Nlcy9oaW5nZV9sb3NzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWlCQSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDaEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM3QixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFM0IsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFNUQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFDSCxTQUFTLFVBQVUsQ0FDZixNQUFvQixFQUFFLFdBQXlCLEVBQy9DLE9BQTJCLEVBQzNCLFNBQVMsR0FBRyxTQUFTLENBQUMsc0JBQXNCO0lBQzlDLElBQUksT0FBTyxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzdELE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzlFLElBQUksUUFBUSxHQUFXLElBQUksQ0FBQztJQUM1QixJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7UUFDbkIsUUFBUSxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsaUJBQWlCLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFFN0UsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RCLG1DQUFtQztJQUNuQyxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUQsT0FBTyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFDRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDLEVBQUMsVUFBVSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0U2hhcGVzTWF0Y2h9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHtSZWR1Y3Rpb259IGZyb20gJy4uL2xvc3Nfb3BzX3V0aWxzJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9tdWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVsdX0gZnJvbSAnLi4vcmVsdSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgSGluZ2UgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGhpbmdlTG9zc188VCBleHRlbmRzIFRlbnNvciwgTyBleHRlbmRzIFRlbnNvcj4oXG4gICAgbGFiZWxzOiBUfFRlbnNvckxpa2UsIHByZWRpY3Rpb25zOiBUfFRlbnNvckxpa2UsXG4gICAgd2VpZ2h0cz86IFRlbnNvcnxUZW5zb3JMaWtlLFxuICAgIHJlZHVjdGlvbiA9IFJlZHVjdGlvbi5TVU1fQllfTk9OWkVST19XRUlHSFRTKTogTyB7XG4gIGxldCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdoaW5nZUxvc3MnKTtcbiAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaGluZ2VMb3NzJyk7XG4gIGxldCAkd2VpZ2h0czogVGVuc29yID0gbnVsbDtcbiAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2hpbmdlTG9zcycpO1xuICB9XG4gIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGhpbmdlTG9zczogJyk7XG5cbiAgY29uc3Qgb25lID0gc2NhbGFyKDEpO1xuICAvLyBDb252ZXJ0IGJpbmFyeSBsYWJlbHMgdG8gKC0xLCAxKVxuICAkbGFiZWxzID0gc3ViKG11bChzY2FsYXIoMiksICRsYWJlbHMpLCBvbmUpO1xuICBjb25zdCBsb3NzZXMgPSByZWx1KHN1YihvbmUsIG11bCgkbGFiZWxzLCAkcHJlZGljdGlvbnMpKSk7XG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgaGluZ2VMb3NzID0gb3Aoe2hpbmdlTG9zc199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { abs } from '../abs';\nimport { add } from '../add';\nimport { Reduction } from '../loss_ops_utils';\nimport { minimum } from '../minimum';\nimport { mul } from '../mul';\nimport { op } from '../operation';\nimport { scalar } from '../scalar';\nimport { square } from '../square';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the Huber loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n *    'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n *    must be either `1`, or the same as the corresponding `losses`\n *    dimension).\n * @param delta Point where Huber loss changes from quadratic to linear.\n * @param reduction Type of reduction to apply to loss. Should be of type\n *    `Reduction`.\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction huberLoss_(labels, predictions, weights, delta = 1.0, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    const $labels = convertToTensor(labels, 'labels', 'huberLoss');\n    const $predictions = convertToTensor(predictions, 'predictions', 'huberLoss');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'huberLoss');\n    }\n    assertShapesMatch($labels.shape, $predictions.shape, 'Error in huberLoss: ');\n    const deltaScalar = scalar(delta);\n    const error = abs(sub($predictions, $labels));\n    const quadratic = minimum(error, deltaScalar);\n    const linear = sub(error, quadratic);\n    const losses = add(mul(scalar(0.5), square(quadratic)), mul(deltaScalar, linear));\n    return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const huberLoss = op({ huberLoss_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHViZXJfbG9zcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvc3Nlcy9odWJlcl9sb3NzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDN0MsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNoQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUUzQixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLFVBQVUsQ0FDZixNQUFvQixFQUFFLFdBQXlCLEVBQy9DLE9BQTJCLEVBQUUsS0FBSyxHQUFHLEdBQUcsRUFDeEMsU0FBUyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0I7SUFDOUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDL0QsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDOUUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsV0FBVyxDQUFDLENBQUM7S0FDN0Q7SUFDRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsc0JBQXNCLENBQUMsQ0FBQztJQUU3RSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsTUFBTSxLQUFLLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM5QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFckMsTUFBTSxNQUFNLEdBQ1IsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBQ0QsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQyxFQUFDLFVBQVUsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0U2hhcGVzTWF0Y2h9IGZyb20gJy4uLy4uL3V0aWwnO1xuaW1wb3J0IHthYnN9IGZyb20gJy4uL2Ficyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vYWRkJztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge21pbmltdW19IGZyb20gJy4uL21pbmltdW0nO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL211bCc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL3NjYWxhcic7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vc3F1YXJlJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgSHViZXIgbG9zcyBiZXR3ZWVuIHR3byB0ZW5zb3JzLlxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yLCBzYW1lIGRpbWVuc2lvbnMgYXNcbiAqICAgICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gcHJlZGljdGlvbnMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSBkZWx0YSBQb2ludCB3aGVyZSBIdWJlciBsb3NzIGNoYW5nZXMgZnJvbSBxdWFkcmF0aWMgdG8gbGluZWFyLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGh1YmVyTG9zc188VCBleHRlbmRzIFRlbnNvciwgTyBleHRlbmRzIFRlbnNvcj4oXG4gICAgbGFiZWxzOiBUfFRlbnNvckxpa2UsIHByZWRpY3Rpb25zOiBUfFRlbnNvckxpa2UsXG4gICAgd2VpZ2h0cz86IFRlbnNvcnxUZW5zb3JMaWtlLCBkZWx0YSA9IDEuMCxcbiAgICByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk6IE8ge1xuICBjb25zdCAkbGFiZWxzID0gY29udmVydFRvVGVuc29yKGxhYmVscywgJ2xhYmVscycsICdodWJlckxvc3MnKTtcbiAgY29uc3QgJHByZWRpY3Rpb25zID0gY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnaHViZXJMb3NzJyk7XG4gIGxldCAkd2VpZ2h0czogVGVuc29yID0gbnVsbDtcbiAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2h1YmVyTG9zcycpO1xuICB9XG4gIGFzc2VydFNoYXBlc01hdGNoKCRsYWJlbHMuc2hhcGUsICRwcmVkaWN0aW9ucy5zaGFwZSwgJ0Vycm9yIGluIGh1YmVyTG9zczogJyk7XG5cbiAgY29uc3QgZGVsdGFTY2FsYXIgPSBzY2FsYXIoZGVsdGEpO1xuICBjb25zdCBlcnJvciA9IGFicyhzdWIoJHByZWRpY3Rpb25zLCAkbGFiZWxzKSk7XG4gIGNvbnN0IHF1YWRyYXRpYyA9IG1pbmltdW0oZXJyb3IsIGRlbHRhU2NhbGFyKTtcbiAgY29uc3QgbGluZWFyID0gc3ViKGVycm9yLCBxdWFkcmF0aWMpO1xuXG4gIGNvbnN0IGxvc3NlcyA9XG4gICAgICBhZGQobXVsKHNjYWxhcigwLjUpLCBzcXVhcmUocXVhZHJhdGljKSksIG11bChkZWx0YVNjYWxhciwgbGluZWFyKSk7XG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5leHBvcnQgY29uc3QgaHViZXJMb3NzID0gb3Aoe2h1YmVyTG9zc199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { add } from '../add';\nimport { log } from '../log';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { neg } from '../neg';\nimport { op } from '../operation';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the log loss between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n *    'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n *    must be either `1`, or the same as the corresponding `losses`\n *    dimension).\n * @param epsilon A small increment to avoid taking log of zero\n * @param reduction Type of reduction to apply to loss. Should be of type\n *    `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction logLoss_(labels, predictions, weights, epsilon = 1e-7, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    const $labels = convertToTensor(labels, 'labels', 'logLoss');\n    const $predictions = convertToTensor(predictions, 'predictions', 'logLoss');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'logLoss');\n    }\n    assertShapesMatch($labels.shape, $predictions.shape, 'Error in logLoss: ');\n    const one = scalar(1);\n    const epsilonScalar = scalar(epsilon);\n    const l1 = neg(mul($labels, log(add($predictions, epsilonScalar))));\n    const l2 = mul(sub(one, $labels), log(add(sub(one, $predictions), epsilonScalar)));\n    const losses = sub(l1, l2);\n    return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const logLoss = op({ logLoss_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX2xvc3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9sb3NzZXMvbG9nX2xvc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUUzQixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUU1RDs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxTQUFTLFFBQVEsQ0FDYixNQUFvQixFQUFFLFdBQXlCLEVBQy9DLE9BQTJCLEVBQUUsT0FBTyxHQUFHLElBQUksRUFDM0MsU0FBUyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0I7SUFDOUMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0QsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDNUUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDM0Q7SUFDRCxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztJQUUzRSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEIsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRXRDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE1BQU0sRUFBRSxHQUNKLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxZQUFZLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMzQixPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUMsRUFBQyxRQUFRLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7YWRkfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHtsb2d9IGZyb20gJy4uL2xvZyc7XG5pbXBvcnQge1JlZHVjdGlvbn0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL211bCc7XG5pbXBvcnQge25lZ30gZnJvbSAnLi4vbmVnJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgbG9nIGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gZXBzaWxvbiBBIHNtYWxsIGluY3JlbWVudCB0byBhdm9pZCB0YWtpbmcgbG9nIG9mIHplcm9cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3Nlcyd9XG4gKi9cbmZ1bmN0aW9uIGxvZ0xvc3NfPFQgZXh0ZW5kcyBUZW5zb3IsIE8gZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGxhYmVsczogVHxUZW5zb3JMaWtlLCBwcmVkaWN0aW9uczogVHxUZW5zb3JMaWtlLFxuICAgIHdlaWdodHM/OiBUZW5zb3J8VGVuc29yTGlrZSwgZXBzaWxvbiA9IDFlLTcsXG4gICAgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpOiBPIHtcbiAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnbG9nTG9zcycpO1xuICBjb25zdCAkcHJlZGljdGlvbnMgPSBjb252ZXJ0VG9UZW5zb3IocHJlZGljdGlvbnMsICdwcmVkaWN0aW9ucycsICdsb2dMb3NzJyk7XG4gIGxldCAkd2VpZ2h0czogVGVuc29yID0gbnVsbDtcbiAgaWYgKHdlaWdodHMgIT0gbnVsbCkge1xuICAgICR3ZWlnaHRzID0gY29udmVydFRvVGVuc29yKHdlaWdodHMsICd3ZWlnaHRzJywgJ2xvZ0xvc3MnKTtcbiAgfVxuICBhc3NlcnRTaGFwZXNNYXRjaCgkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBsb2dMb3NzOiAnKTtcblxuICBjb25zdCBvbmUgPSBzY2FsYXIoMSk7XG4gIGNvbnN0IGVwc2lsb25TY2FsYXIgPSBzY2FsYXIoZXBzaWxvbik7XG5cbiAgY29uc3QgbDEgPSBuZWcobXVsKCRsYWJlbHMsIGxvZyhhZGQoJHByZWRpY3Rpb25zLCBlcHNpbG9uU2NhbGFyKSkpKTtcbiAgY29uc3QgbDIgPVxuICAgICAgbXVsKHN1YihvbmUsICRsYWJlbHMpLCBsb2coYWRkKHN1YihvbmUsICRwcmVkaWN0aW9ucyksIGVwc2lsb25TY2FsYXIpKSk7XG4gIGNvbnN0IGxvc3NlcyA9IHN1YihsMSwgbDIpO1xuICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IGxvZ0xvc3MgPSBvcCh7bG9nTG9zc199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { Reduction } from '../loss_ops_utils';\nimport { op } from '../operation';\nimport { squaredDifference } from '../squared_difference';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes the mean squared error between two tensors.\n *\n * @param labels The ground truth output tensor, same dimensions as\n *    'predictions'.\n * @param predictions The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n *    must be either `1`, or the same as the corresponding `losses`\n *    dimension).\n * @param reduction Type of reduction to apply to loss. Should be of type\n *    `Reduction`\n *\n * @doc {heading: 'Training', subheading: 'Losses', namespace: 'losses'}\n */\nfunction meanSquaredError_(labels, predictions, weights, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    const $labels = convertToTensor(labels, 'labels', 'meanSquaredError');\n    const $predictions = convertToTensor(predictions, 'predictions', 'meanSquaredError');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'meanSquaredError');\n    }\n    assertShapesMatch($labels.shape, $predictions.shape, 'Error in meanSquaredError: ');\n    const losses = squaredDifference($labels, $predictions);\n    return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const meanSquaredError = op({ meanSquaredError_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhbl9zcXVhcmVkX2Vycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL21lYW5fc3F1YXJlZF9lcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDdEIsTUFBb0IsRUFBRSxXQUF5QixFQUMvQyxPQUEyQixFQUMzQixTQUFTLEdBQUcsU0FBUyxDQUFDLHNCQUFzQjtJQUM5QyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sWUFBWSxHQUNkLGVBQWUsQ0FBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLGtCQUFrQixDQUFDLENBQUM7SUFDcEUsSUFBSSxRQUFRLEdBQVcsSUFBSSxDQUFDO0lBQzVCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtRQUNuQixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztLQUNwRTtJQUNELGlCQUFpQixDQUNiLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSw2QkFBNkIsQ0FBQyxDQUFDO0lBRXRFLE1BQU0sTUFBTSxHQUFHLGlCQUFpQixDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN4RCxPQUFPLG1CQUFtQixDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnRTaGFwZXNNYXRjaH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5pbXBvcnQge1JlZHVjdGlvbn0gZnJvbSAnLi4vbG9zc19vcHNfdXRpbHMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7c3F1YXJlZERpZmZlcmVuY2V9IGZyb20gJy4uL3NxdWFyZWRfZGlmZmVyZW5jZSc7XG5cbmltcG9ydCB7Y29tcHV0ZVdlaWdodGVkTG9zc30gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBtZWFuIHNxdWFyZWQgZXJyb3IgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBAcGFyYW0gbGFiZWxzIFRoZSBncm91bmQgdHJ1dGggb3V0cHV0IHRlbnNvciwgc2FtZSBkaW1lbnNpb25zIGFzXG4gKiAgICAncHJlZGljdGlvbnMnLlxuICogQHBhcmFtIHByZWRpY3Rpb25zIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciB0aGUgc2FtZSByYW5rIGFzXG4gKiAgICBgbGFiZWxzYCwgYW5kIG11c3QgYmUgYnJvYWRjYXN0YWJsZSB0byBgbGFiZWxzYCAoaS5lLiwgYWxsIGRpbWVuc2lvbnNcbiAqICAgIG11c3QgYmUgZWl0aGVyIGAxYCwgb3IgdGhlIHNhbWUgYXMgdGhlIGNvcnJlc3BvbmRpbmcgYGxvc3Nlc2BcbiAqICAgIGRpbWVuc2lvbikuXG4gKiBAcGFyYW0gcmVkdWN0aW9uIFR5cGUgb2YgcmVkdWN0aW9uIHRvIGFwcGx5IHRvIGxvc3MuIFNob3VsZCBiZSBvZiB0eXBlXG4gKiAgICBgUmVkdWN0aW9uYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnfVxuICovXG5mdW5jdGlvbiBtZWFuU3F1YXJlZEVycm9yXzxUIGV4dGVuZHMgVGVuc29yLCBPIGV4dGVuZHMgVGVuc29yPihcbiAgICBsYWJlbHM6IFR8VGVuc29yTGlrZSwgcHJlZGljdGlvbnM6IFR8VGVuc29yTGlrZSxcbiAgICB3ZWlnaHRzPzogVGVuc29yfFRlbnNvckxpa2UsXG4gICAgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpOiBPIHtcbiAgY29uc3QgJGxhYmVscyA9IGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnbWVhblNxdWFyZWRFcnJvcicpO1xuICBjb25zdCAkcHJlZGljdGlvbnMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHByZWRpY3Rpb25zLCAncHJlZGljdGlvbnMnLCAnbWVhblNxdWFyZWRFcnJvcicpO1xuICBsZXQgJHdlaWdodHM6IFRlbnNvciA9IG51bGw7XG4gIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdtZWFuU3F1YXJlZEVycm9yJyk7XG4gIH1cbiAgYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAkbGFiZWxzLnNoYXBlLCAkcHJlZGljdGlvbnMuc2hhcGUsICdFcnJvciBpbiBtZWFuU3F1YXJlZEVycm9yOiAnKTtcblxuICBjb25zdCBsb3NzZXMgPSBzcXVhcmVkRGlmZmVyZW5jZSgkbGFiZWxzLCAkcHJlZGljdGlvbnMpO1xuICByZXR1cm4gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXMsICR3ZWlnaHRzLCByZWR1Y3Rpb24pO1xufVxuZXhwb3J0IGNvbnN0IG1lYW5TcXVhcmVkRXJyb3IgPSBvcCh7bWVhblNxdWFyZWRFcnJvcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { abs } from '../abs';\nimport { add } from '../add';\nimport { exp } from '../exp';\nimport { log1p } from '../log1p';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { neg } from '../neg';\nimport { op } from '../operation';\nimport { relu } from '../relu';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { computeWeightedLoss } from './compute_weighted_loss';\nfunction sigmoidCrossEntropyWithLogits_(labels, logits) {\n    const $labels = convertToTensor(labels, 'labels', 'sigmoidCrossEntropyWithLogits');\n    const $logits = convertToTensor(logits, 'logits', 'sigmoidCrossEntropyWithLogits');\n    assertShapesMatch($labels.shape, $logits.shape, 'Error in sigmoidCrossEntropyWithLogits: ');\n    /**\n     * Implementation Details:\n     *\n     * For brevity, let `x = logits`, `z = labels`.  The logistic loss is\n     *     z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))\n     *   = z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))\n     *   = z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))\n     *   = z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))\n     *   = (1 - z) * x + log(1 + exp(-x))\n     *   = x - x * z + log(1 + exp(-x))\n     *\n     *   For x < 0, to avoid overflow in exp(-x), we reformulate the above\n     *     x - x * z + log(1 + exp(-x))\n     *   = log(exp(x)) - x * z + log(1 + exp(-x))\n     *   = - x * z + log(1 + exp(x))\n     *\n     * Hence, to ensure stability and avoid overflow, the implementation uses\n     * this equivalent formulation:\n     *     max(x, 0) - x * z + log(1 + exp(-abs(x)))\n     */\n    const maxOutput = relu($logits);\n    const outputXTarget = mul($logits, $labels);\n    const sigmoidOutput = log1p(exp(neg(abs($logits))));\n    return add(sub(maxOutput, outputXTarget), sigmoidOutput);\n}\n/**\n * Computes the sigmoid cross entropy loss between two tensors.\n *\n * If labelSmoothing is nonzero, smooth the labels towards 1/2:\n *\n *   newMulticlassLabels = multiclassLabels * (1 - labelSmoothing)\n *                         + 0.5 * labelSmoothing\n *\n * @param multiClassLabels The ground truth output tensor of shape\n * [batch_size, num_classes], same dimensions as 'predictions'.\n * @param logits The predicted outputs.\n * @param weights Tensor whose rank is either 0, or the same rank as\n *    `labels`, and must be broadcastable to `labels` (i.e., all dimensions\n *    must be either `1`, or the same as the corresponding `losses`\n *    dimension).\n * @param labelSmoothing If greater than 0, then smooth the labels.\n * @param reduction Type of reduction to apply to loss. Should be of type\n *    `Reduction`\n *\n * @doc { heading: 'Training', subheading: 'Losses', namespace: 'losses' }\n */\nfunction sigmoidCrossEntropy_(multiClassLabels, logits, weights, labelSmoothing = 0, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    let $multiClassLabels = convertToTensor(multiClassLabels, 'multiClassLabels', 'sigmoidCrossEntropy');\n    const $logits = convertToTensor(logits, 'logits', 'sigmoidCrossEntropy');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'sigmoidCrossEntropy');\n    }\n    assertShapesMatch($multiClassLabels.shape, $logits.shape, 'Error in sigmoidCrossEntropy: ');\n    if (labelSmoothing > 0) {\n        const labelSmoothingScalar = scalar(labelSmoothing);\n        const one = scalar(1);\n        const half = scalar(0.5);\n        $multiClassLabels =\n            add(mul($multiClassLabels, sub(one, labelSmoothingScalar)), mul(half, labelSmoothingScalar));\n    }\n    const losses = sigmoidCrossEntropyWithLogits_($multiClassLabels, $logits);\n    return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const sigmoidCrossEntropy = op({ sigmoidCrossEntropy_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbW9pZF9jcm9zc19lbnRyb3B5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL3NpZ21vaWRfY3Jvc3NfZW50cm9weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTNCLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTVELFNBQVMsOEJBQThCLENBQ25DLE1BQW9CLEVBQUUsTUFBb0I7SUFDNUMsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsK0JBQStCLENBQUMsQ0FBQztJQUN2RSxNQUFNLE9BQU8sR0FDVCxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSwrQkFBK0IsQ0FBQyxDQUFDO0lBQ3ZFLGlCQUFpQixDQUNiLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSwwQ0FBMEMsQ0FBQyxDQUFDO0lBRTlFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BbUJHO0lBQ0gsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2hDLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUMsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXBELE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDM0QsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsb0JBQW9CLENBQ3pCLGdCQUE4QixFQUFFLE1BQW9CLEVBQ3BELE9BQTJCLEVBQUUsY0FBYyxHQUFHLENBQUMsRUFDL0MsU0FBUyxHQUFHLFNBQVMsQ0FBQyxzQkFBc0I7SUFDOUMsSUFBSSxpQkFBaUIsR0FBRyxlQUFlLENBQ25DLGdCQUFnQixFQUFFLGtCQUFrQixFQUFFLHFCQUFxQixDQUFDLENBQUM7SUFDakUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUN6RSxJQUFJLFFBQVEsR0FBVyxJQUFJLENBQUM7SUFDNUIsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLFFBQVEsR0FBRyxlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQ3ZFO0lBQ0QsaUJBQWlCLENBQ2IsaUJBQWlCLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsZ0NBQWdDLENBQUMsQ0FBQztJQUU5RSxJQUFJLGNBQWMsR0FBRyxDQUFDLEVBQUU7UUFDdEIsTUFBTSxvQkFBb0IsR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUV6QixpQkFBaUI7WUFDYixHQUFHLENBQUMsR0FBRyxDQUFDLGlCQUFpQixFQUFFLEdBQUcsQ0FBQyxHQUFHLEVBQUUsb0JBQW9CLENBQUMsQ0FBQyxFQUN0RCxHQUFHLENBQUMsSUFBSSxFQUFFLG9CQUFvQixDQUFDLENBQUMsQ0FBQztLQUMxQztJQUNELE1BQU0sTUFBTSxHQUFHLDhCQUE4QixDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTFFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7YWJzfSBmcm9tICcuLi9hYnMnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL2FkZCc7XG5pbXBvcnQge2V4cH0gZnJvbSAnLi4vZXhwJztcbmltcG9ydCB7bG9nMXB9IGZyb20gJy4uL2xvZzFwJztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVsdX0gZnJvbSAnLi4vcmVsdSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuXG5pbXBvcnQge2NvbXB1dGVXZWlnaHRlZExvc3N9IGZyb20gJy4vY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcblxuZnVuY3Rpb24gc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHNfPFQgZXh0ZW5kcyBUZW5zb3IsIE8gZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGxhYmVsczogVHxUZW5zb3JMaWtlLCBsb2dpdHM6IFR8VGVuc29yTGlrZSk6IE8ge1xuICBjb25zdCAkbGFiZWxzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihsYWJlbHMsICdsYWJlbHMnLCAnc2lnbW9pZENyb3NzRW50cm9weVdpdGhMb2dpdHMnKTtcbiAgY29uc3QgJGxvZ2l0cyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzJyk7XG4gIGFzc2VydFNoYXBlc01hdGNoKFxuICAgICAgJGxhYmVscy5zaGFwZSwgJGxvZ2l0cy5zaGFwZSwgJ0Vycm9yIGluIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzOiAnKTtcblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gRGV0YWlsczpcbiAgICpcbiAgICogRm9yIGJyZXZpdHksIGxldCBgeCA9IGxvZ2l0c2AsIGB6ID0gbGFiZWxzYC4gIFRoZSBsb2dpc3RpYyBsb3NzIGlzXG4gICAqICAgICB6ICogLWxvZyhzaWdtb2lkKHgpKSArICgxIC0geikgKiAtbG9nKDEgLSBzaWdtb2lkKHgpKVxuICAgKiAgID0geiAqIC1sb2coMSAvICgxICsgZXhwKC14KSkpICsgKDEgLSB6KSAqIC1sb2coZXhwKC14KSAvICgxICsgZXhwKC14KSkpXG4gICAqICAgPSB6ICogbG9nKDEgKyBleHAoLXgpKSArICgxIC0geikgKiAoLWxvZyhleHAoLXgpKSArIGxvZygxICsgZXhwKC14KSkpXG4gICAqICAgPSB6ICogbG9nKDEgKyBleHAoLXgpKSArICgxIC0geikgKiAoeCArIGxvZygxICsgZXhwKC14KSlcbiAgICogICA9ICgxIC0geikgKiB4ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgKiAgID0geCAtIHggKiB6ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgKlxuICAgKiAgIEZvciB4IDwgMCwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZXhwKC14KSwgd2UgcmVmb3JtdWxhdGUgdGhlIGFib3ZlXG4gICAqICAgICB4IC0geCAqIHogKyBsb2coMSArIGV4cCgteCkpXG4gICAqICAgPSBsb2coZXhwKHgpKSAtIHggKiB6ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgKiAgID0gLSB4ICogeiArIGxvZygxICsgZXhwKHgpKVxuICAgKlxuICAgKiBIZW5jZSwgdG8gZW5zdXJlIHN0YWJpbGl0eSBhbmQgYXZvaWQgb3ZlcmZsb3csIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VzXG4gICAqIHRoaXMgZXF1aXZhbGVudCBmb3JtdWxhdGlvbjpcbiAgICogICAgIG1heCh4LCAwKSAtIHggKiB6ICsgbG9nKDEgKyBleHAoLWFicyh4KSkpXG4gICAqL1xuICBjb25zdCBtYXhPdXRwdXQgPSByZWx1KCRsb2dpdHMpO1xuICBjb25zdCBvdXRwdXRYVGFyZ2V0ID0gbXVsKCRsb2dpdHMsICRsYWJlbHMpO1xuICBjb25zdCBzaWdtb2lkT3V0cHV0ID0gbG9nMXAoZXhwKG5lZyhhYnMoJGxvZ2l0cykpKSk7XG5cbiAgcmV0dXJuIGFkZChzdWIobWF4T3V0cHV0LCBvdXRwdXRYVGFyZ2V0KSwgc2lnbW9pZE91dHB1dCk7XG59XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIHNpZ21vaWQgY3Jvc3MgZW50cm9weSBsb3NzIGJldHdlZW4gdHdvIHRlbnNvcnMuXG4gKlxuICogSWYgbGFiZWxTbW9vdGhpbmcgaXMgbm9uemVybywgc21vb3RoIHRoZSBsYWJlbHMgdG93YXJkcyAxLzI6XG4gKlxuICogICBuZXdNdWx0aWNsYXNzTGFiZWxzID0gbXVsdGljbGFzc0xhYmVscyAqICgxIC0gbGFiZWxTbW9vdGhpbmcpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICArIDAuNSAqIGxhYmVsU21vb3RoaW5nXG4gKlxuICogQHBhcmFtIG11bHRpQ2xhc3NMYWJlbHMgVGhlIGdyb3VuZCB0cnV0aCBvdXRwdXQgdGVuc29yIG9mIHNoYXBlXG4gKiBbYmF0Y2hfc2l6ZSwgbnVtX2NsYXNzZXNdLCBzYW1lIGRpbWVuc2lvbnMgYXMgJ3ByZWRpY3Rpb25zJy5cbiAqIEBwYXJhbSBsb2dpdHMgVGhlIHByZWRpY3RlZCBvdXRwdXRzLlxuICogQHBhcmFtIHdlaWdodHMgVGVuc29yIHdob3NlIHJhbmsgaXMgZWl0aGVyIDAsIG9yIHRoZSBzYW1lIHJhbmsgYXNcbiAqICAgIGBsYWJlbHNgLCBhbmQgbXVzdCBiZSBicm9hZGNhc3RhYmxlIHRvIGBsYWJlbHNgIChpLmUuLCBhbGwgZGltZW5zaW9uc1xuICogICAgbXVzdCBiZSBlaXRoZXIgYDFgLCBvciB0aGUgc2FtZSBhcyB0aGUgY29ycmVzcG9uZGluZyBgbG9zc2VzYFxuICogICAgZGltZW5zaW9uKS5cbiAqIEBwYXJhbSBsYWJlbFNtb290aGluZyBJZiBncmVhdGVyIHRoYW4gMCwgdGhlbiBzbW9vdGggdGhlIGxhYmVscy5cbiAqIEBwYXJhbSByZWR1Y3Rpb24gVHlwZSBvZiByZWR1Y3Rpb24gdG8gYXBwbHkgdG8gbG9zcy4gU2hvdWxkIGJlIG9mIHR5cGVcbiAqICAgIGBSZWR1Y3Rpb25gXG4gKlxuICogQGRvYyB7IGhlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdMb3NzZXMnLCBuYW1lc3BhY2U6ICdsb3NzZXMnIH1cbiAqL1xuZnVuY3Rpb24gc2lnbW9pZENyb3NzRW50cm9weV88VCBleHRlbmRzIFRlbnNvciwgTyBleHRlbmRzIFRlbnNvcj4oXG4gICAgbXVsdGlDbGFzc0xhYmVsczogVHxUZW5zb3JMaWtlLCBsb2dpdHM6IFR8VGVuc29yTGlrZSxcbiAgICB3ZWlnaHRzPzogVGVuc29yfFRlbnNvckxpa2UsIGxhYmVsU21vb3RoaW5nID0gMCxcbiAgICByZWR1Y3Rpb24gPSBSZWR1Y3Rpb24uU1VNX0JZX05PTlpFUk9fV0VJR0hUUyk6IE8ge1xuICBsZXQgJG11bHRpQ2xhc3NMYWJlbHMgPSBjb252ZXJ0VG9UZW5zb3IoXG4gICAgICBtdWx0aUNsYXNzTGFiZWxzLCAnbXVsdGlDbGFzc0xhYmVscycsICdzaWdtb2lkQ3Jvc3NFbnRyb3B5Jyk7XG4gIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NpZ21vaWRDcm9zc0VudHJvcHknKTtcbiAgbGV0ICR3ZWlnaHRzOiBUZW5zb3IgPSBudWxsO1xuICBpZiAod2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgJHdlaWdodHMgPSBjb252ZXJ0VG9UZW5zb3Iod2VpZ2h0cywgJ3dlaWdodHMnLCAnc2lnbW9pZENyb3NzRW50cm9weScpO1xuICB9XG4gIGFzc2VydFNoYXBlc01hdGNoKFxuICAgICAgJG11bHRpQ2xhc3NMYWJlbHMuc2hhcGUsICRsb2dpdHMuc2hhcGUsICdFcnJvciBpbiBzaWdtb2lkQ3Jvc3NFbnRyb3B5OiAnKTtcblxuICBpZiAobGFiZWxTbW9vdGhpbmcgPiAwKSB7XG4gICAgY29uc3QgbGFiZWxTbW9vdGhpbmdTY2FsYXIgPSBzY2FsYXIobGFiZWxTbW9vdGhpbmcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICBjb25zdCBoYWxmID0gc2NhbGFyKDAuNSk7XG5cbiAgICAkbXVsdGlDbGFzc0xhYmVscyA9XG4gICAgICAgIGFkZChtdWwoJG11bHRpQ2xhc3NMYWJlbHMsIHN1YihvbmUsIGxhYmVsU21vb3RoaW5nU2NhbGFyKSksXG4gICAgICAgICAgICBtdWwoaGFsZiwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKTtcbiAgfVxuICBjb25zdCBsb3NzZXMgPSBzaWdtb2lkQ3Jvc3NFbnRyb3B5V2l0aExvZ2l0c18oJG11bHRpQ2xhc3NMYWJlbHMsICRsb2dpdHMpO1xuXG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5cbmV4cG9ydCBjb25zdCBzaWdtb2lkQ3Jvc3NFbnRyb3B5ID0gb3Aoe3NpZ21vaWRDcm9zc0VudHJvcHlffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { customGrad } from '../../gradients';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { assertShapesMatch } from '../../util';\nimport { add } from '../add';\nimport { expandShapeToKeepDim } from '../axis_util';\nimport { cast } from '../cast';\nimport { div } from '../div';\nimport { exp } from '../exp';\nimport { logSumExp } from '../log_sum_exp';\nimport { Reduction } from '../loss_ops_utils';\nimport { mul } from '../mul';\nimport { neg } from '../neg';\nimport { op } from '../operation';\nimport { reshape } from '../reshape';\nimport { scalar } from '../scalar';\nimport { sub } from '../sub';\nimport { sum } from '../sum';\nimport { computeWeightedLoss } from './compute_weighted_loss';\n/**\n * Computes softmax cross entropy between logits and labels.\n *\n * Measures the probability error in discrete classification tasks in which\n * the classes are mutually exclusive (each entry is in exactly one class).\n * For example, each CIFAR-10 image is labeled with one and only one label: an\n * image can be a dog or a truck, but not both.\n *\n * `NOTE`: While the classes are mutually exclusive, their probabilities need\n * not be. All that is required is that each row of labels is a valid\n * probability distribution. If they are not, the computation of the gradient\n * will be incorrect.\n *\n * `WARNING`: This op expects unscaled logits, since it performs a softmax on\n * logits internally for efficiency. Do not call this op with the output of\n * softmax, as it will produce incorrect results.\n *\n * logits and labels must have the same shape, e.g. [batch_size, num_classes]\n * and the same dtype.\n * @param labels The labels array.\n * @param logits The logits array.\n * @param dim The dimension softmax would be performed on. Defaults to `-1`\n *     which indicates the last dimension.\n */\nfunction softmaxCrossEntropyWithLogits_(labels, logits, dim = -1) {\n    if (dim === -1) {\n        dim = logits.rank - 1;\n    }\n    if (dim !== logits.rank - 1) {\n        throw Error(`Softmax cross entropy along a non-last dimension is not yet ` +\n            `supported. Labels / logits was rank ${logits.rank} ` +\n            `and dim was ${dim}`);\n    }\n    // Use a custom gradient for numerical stability.\n    const customOp = customGrad((labels, logits, save) => {\n        // Reference:\n        //   1. http://cs231n.github.io/linear-classify/#softmax\n        //   2. https://blog.feedly.com/tricks-of-the-trade-logsumexp/\n        const keepDims = true;\n        const lse = logSumExp(logits, [dim], keepDims);\n        const logResult = sub(cast(logits, 'float32'), lse);\n        save([labels, logResult]);\n        const costVector = neg(mul(logResult, labels));\n        const value = sum(costVector, [dim]);\n        const gradFunc = (dy, saved) => {\n            const [labels, logResult] = saved;\n            const dyShape = expandShapeToKeepDim(dy.shape, [dim]);\n            return [\n                mul(reshape(dy, dyShape), sub(cast(labels, 'float32'), exp(logResult))),\n                mul(reshape(dy, dyShape), sub(exp(logResult), cast(labels, 'float32'))),\n            ];\n        };\n        return { value, gradFunc };\n    });\n    return customOp(labels, logits);\n}\n/**\n * Computes the softmax cross entropy loss between two tensors.\n *\n * If labelSmoothing is nonzero, smooth the labels towards 1/2:\n *\n *   newOnehotLabels = onehotLabels * (1 - labelSmoothing)\n *                         + labelSmoothing / numClasses\n *\n * @param onehotLabels One hot encoded labels\n *    [batch_size, num_classes], same dimensions as 'predictions'.\n * @param logits The predicted outputs.\n * @param weights Tensor whose rank is either 0, or 1, and must be\n *    broadcastable to `loss`  of shape [batch_size]\n * @param labelSmoothing If greater than 0, then smooth the labels.\n * @param reduction Type of reduction to apply to loss. Should be of type\n *    `Reduction`\n *\n * @doc { heading: 'Training', subheading: 'Losses', namespace: 'losses' }\n */\nfunction softmaxCrossEntropy_(onehotLabels, logits, weights, labelSmoothing = 0, reduction = Reduction.SUM_BY_NONZERO_WEIGHTS) {\n    let $onehotLabels = convertToTensor(onehotLabels, 'onehotLabels', 'softmaxCrossEntropy');\n    const $logits = convertToTensor(logits, 'logits', 'softmaxCrossEntropy');\n    let $weights = null;\n    if (weights != null) {\n        $weights = convertToTensor(weights, 'weights', 'softmaxCrossEntropy');\n    }\n    assertShapesMatch($onehotLabels.shape, $logits.shape, 'Error in softmaxCrossEntropy: ');\n    if (labelSmoothing > 0) {\n        const labelSmoothingScalar = scalar(labelSmoothing);\n        const one = scalar(1);\n        const numClasses = scalar($onehotLabels.shape[1]);\n        $onehotLabels =\n            add(mul($onehotLabels, sub(one, labelSmoothingScalar)), div(labelSmoothingScalar, numClasses));\n    }\n    const losses = softmaxCrossEntropyWithLogits_($onehotLabels, $logits);\n    return computeWeightedLoss(losses, $weights, reduction);\n}\nexport const softmaxCrossEntropy = op({ softmaxCrossEntropy_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdG1heF9jcm9zc19lbnRyb3B5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvbG9zc2VzL3NvZnRtYXhfY3Jvc3NfZW50cm9weS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFHM0MsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNsRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzdCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDekMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDM0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUMzQixPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzNCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxRQUFRLENB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QixRQUFRLEdBQUcsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUN2RTtJQUVELGlCQUFpQixDQUNiLGFBQWEsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxnQ0FBZ0MsQ0FBQyxDQUFDO0lBRTFFLElBQUksY0FBYyxHQUFHLENBQUMsRUFBRTtRQUN0QixNQUFNLG9CQUFvQixHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUNwRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVsRCxhQUFhO1lBQ1QsR0FBRyxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDLEVBQ2xELEdBQUcsQ0FBQyxvQkFBb0IsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsTUFBTSxNQUFNLEdBQUcsOEJBQThCLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXRFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxDQUFDLEVBQUMsb0JBQW9CLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtjdXN0b21HcmFkfSBmcm9tICcuLi8uLi9ncmFkaWVudHMnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge0dyYWRTYXZlRnVuY30gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNofSBmcm9tICcuLi8uLi91dGlsJztcbmltcG9ydCB7YWRkfSBmcm9tICcuLi9hZGQnO1xuaW1wb3J0IHtleHBhbmRTaGFwZVRvS2VlcERpbX0gZnJvbSAnLi4vYXhpc191dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vZGl2JztcbmltcG9ydCB7ZXhwfSBmcm9tICcuLi9leHAnO1xuaW1wb3J0IHtsb2dTdW1FeHB9IGZyb20gJy4uL2xvZ19zdW1fZXhwJztcbmltcG9ydCB7UmVkdWN0aW9ufSBmcm9tICcuLi9sb3NzX29wc191dGlscyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9uZWcnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vcmVzaGFwZSc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9zdWInO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL3N1bSc7XG5cbmltcG9ydCB7Y29tcHV0ZVdlaWdodGVkTG9zc30gZnJvbSAnLi9jb21wdXRlX3dlaWdodGVkX2xvc3MnO1xuXG4vKipcbiAqIENvbXB1dGVzIHNvZnRtYXggY3Jvc3MgZW50cm9weSBiZXR3ZWVuIGxvZ2l0cyBhbmQgbGFiZWxzLlxuICpcbiAqIE1lYXN1cmVzIHRoZSBwcm9iYWJpbGl0eSBlcnJvciBpbiBkaXNjcmV0ZSBjbGFzc2lmaWNhdGlvbiB0YXNrcyBpbiB3aGljaFxuICogdGhlIGNsYXNzZXMgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSAoZWFjaCBlbnRyeSBpcyBpbiBleGFjdGx5IG9uZSBjbGFzcykuXG4gKiBGb3IgZXhhbXBsZSwgZWFjaCBDSUZBUi0xMCBpbWFnZSBpcyBsYWJlbGVkIHdpdGggb25lIGFuZCBvbmx5IG9uZSBsYWJlbDogYW5cbiAqIGltYWdlIGNhbiBiZSBhIGRvZyBvciBhIHRydWNrLCBidXQgbm90IGJvdGguXG4gKlxuICogYE5PVEVgOiBXaGlsZSB0aGUgY2xhc3NlcyBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlLCB0aGVpciBwcm9iYWJpbGl0aWVzIG5lZWRcbiAqIG5vdCBiZS4gQWxsIHRoYXQgaXMgcmVxdWlyZWQgaXMgdGhhdCBlYWNoIHJvdyBvZiBsYWJlbHMgaXMgYSB2YWxpZFxuICogcHJvYmFiaWxpdHkgZGlzdHJpYnV0aW9uLiBJZiB0aGV5IGFyZSBub3QsIHRoZSBjb21wdXRhdGlvbiBvZiB0aGUgZ3JhZGllbnRcbiAqIHdpbGwgYmUgaW5jb3JyZWN0LlxuICpcbiAqIGBXQVJOSU5HYDogVGhpcyBvcCBleHBlY3RzIHVuc2NhbGVkIGxvZ2l0cywgc2luY2UgaXQgcGVyZm9ybXMgYSBzb2Z0bWF4IG9uXG4gKiBsb2dpdHMgaW50ZXJuYWxseSBmb3IgZWZmaWNpZW5jeS4gRG8gbm90IGNhbGwgdGhpcyBvcCB3aXRoIHRoZSBvdXRwdXQgb2ZcbiAqIHNvZnRtYXgsIGFzIGl0IHdpbGwgcHJvZHVjZSBpbmNvcnJlY3QgcmVzdWx0cy5cbiAqXG4gKiBsb2dpdHMgYW5kIGxhYmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgc2hhcGUsIGUuZy4gW2JhdGNoX3NpemUsIG51bV9jbGFzc2VzXVxuICogYW5kIHRoZSBzYW1lIGR0eXBlLlxuICogQHBhcmFtIGxhYmVscyBUaGUgbGFiZWxzIGFycmF5LlxuICogQHBhcmFtIGxvZ2l0cyBUaGUgbG9naXRzIGFycmF5LlxuICogQHBhcmFtIGRpbSBUaGUgZGltZW5zaW9uIHNvZnRtYXggd291bGQgYmUgcGVyZm9ybWVkIG9uLiBEZWZhdWx0cyB0byBgLTFgXG4gKiAgICAgd2hpY2ggaW5kaWNhdGVzIHRoZSBsYXN0IGRpbWVuc2lvbi5cbiAqL1xuZnVuY3Rpb24gc29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHNfPFQgZXh0ZW5kcyBUZW5zb3IsIE8gZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGxhYmVsczogVCwgbG9naXRzOiBULCBkaW0gPSAtMSk6IE8ge1xuICBpZiAoZGltID09PSAtMSkge1xuICAgIGRpbSA9IGxvZ2l0cy5yYW5rIC0gMTtcbiAgfVxuXG4gIGlmIChkaW0gIT09IGxvZ2l0cy5yYW5rIC0gMSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgICBgU29mdG1heCBjcm9zcyBlbnRyb3B5IGFsb25nIGEgbm9uLWxhc3QgZGltZW5zaW9uIGlzIG5vdCB5ZXQgYCArXG4gICAgICAgIGBzdXBwb3J0ZWQuIExhYmVscyAvIGxvZ2l0cyB3YXMgcmFuayAke2xvZ2l0cy5yYW5rfSBgICtcbiAgICAgICAgYGFuZCBkaW0gd2FzICR7ZGltfWApO1xuICB9XG4gIC8vIFVzZSBhIGN1c3RvbSBncmFkaWVudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgY29uc3QgY3VzdG9tT3AgPVxuICAgICAgY3VzdG9tR3JhZCgobGFiZWxzOiBUZW5zb3IsIGxvZ2l0czogVGVuc29yLCBzYXZlOiBHcmFkU2F2ZUZ1bmMpID0+IHtcbiAgICAgICAgLy8gUmVmZXJlbmNlOlxuICAgICAgICAvLyAgIDEuIGh0dHA6Ly9jczIzMW4uZ2l0aHViLmlvL2xpbmVhci1jbGFzc2lmeS8jc29mdG1heFxuICAgICAgICAvLyAgIDIuIGh0dHBzOi8vYmxvZy5mZWVkbHkuY29tL3RyaWNrcy1vZi10aGUtdHJhZGUtbG9nc3VtZXhwL1xuICAgICAgICBjb25zdCBrZWVwRGltcyA9IHRydWU7XG4gICAgICAgIGNvbnN0IGxzZSA9IGxvZ1N1bUV4cChsb2dpdHMsIFtkaW1dLCBrZWVwRGltcyk7XG4gICAgICAgIGNvbnN0IGxvZ1Jlc3VsdCA9IHN1YihjYXN0KGxvZ2l0cywgJ2Zsb2F0MzInKSwgbHNlKTtcbiAgICAgICAgc2F2ZShbbGFiZWxzLCBsb2dSZXN1bHRdKTtcblxuICAgICAgICBjb25zdCBjb3N0VmVjdG9yID0gbmVnKG11bChsb2dSZXN1bHQsIGxhYmVscykpO1xuICAgICAgICBjb25zdCB2YWx1ZTogTyA9IHN1bShjb3N0VmVjdG9yLCBbZGltXSk7XG5cbiAgICAgICAgY29uc3QgZ3JhZEZ1bmMgPSAoZHk6IE8sIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgICAgICAgIGNvbnN0IFtsYWJlbHMsIGxvZ1Jlc3VsdF0gPSBzYXZlZDtcbiAgICAgICAgICBjb25zdCBkeVNoYXBlID0gZXhwYW5kU2hhcGVUb0tlZXBEaW0oZHkuc2hhcGUsIFtkaW1dKTtcbiAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgbXVsKHJlc2hhcGUoZHksIGR5U2hhcGUpLFxuICAgICAgICAgICAgICAgIHN1YihjYXN0KGxhYmVscywgJ2Zsb2F0MzInKSwgZXhwKGxvZ1Jlc3VsdCkpKSxcbiAgICAgICAgICAgIG11bChyZXNoYXBlKGR5LCBkeVNoYXBlKSxcbiAgICAgICAgICAgICAgICBzdWIoZXhwKGxvZ1Jlc3VsdCksIGNhc3QobGFiZWxzLCAnZmxvYXQzMicpKSksXG4gICAgICAgICAgXTtcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHt2YWx1ZSwgZ3JhZEZ1bmN9O1xuICAgICAgfSk7XG5cbiAgcmV0dXJuIGN1c3RvbU9wKGxhYmVscywgbG9naXRzKTtcbn1cblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc29mdG1heCBjcm9zcyBlbnRyb3B5IGxvc3MgYmV0d2VlbiB0d28gdGVuc29ycy5cbiAqXG4gKiBJZiBsYWJlbFNtb290aGluZyBpcyBub256ZXJvLCBzbW9vdGggdGhlIGxhYmVscyB0b3dhcmRzIDEvMjpcbiAqXG4gKiAgIG5ld09uZWhvdExhYmVscyA9IG9uZWhvdExhYmVscyAqICgxIC0gbGFiZWxTbW9vdGhpbmcpXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICArIGxhYmVsU21vb3RoaW5nIC8gbnVtQ2xhc3Nlc1xuICpcbiAqIEBwYXJhbSBvbmVob3RMYWJlbHMgT25lIGhvdCBlbmNvZGVkIGxhYmVsc1xuICogICAgW2JhdGNoX3NpemUsIG51bV9jbGFzc2VzXSwgc2FtZSBkaW1lbnNpb25zIGFzICdwcmVkaWN0aW9ucycuXG4gKiBAcGFyYW0gbG9naXRzIFRoZSBwcmVkaWN0ZWQgb3V0cHV0cy5cbiAqIEBwYXJhbSB3ZWlnaHRzIFRlbnNvciB3aG9zZSByYW5rIGlzIGVpdGhlciAwLCBvciAxLCBhbmQgbXVzdCBiZVxuICogICAgYnJvYWRjYXN0YWJsZSB0byBgbG9zc2AgIG9mIHNoYXBlIFtiYXRjaF9zaXplXVxuICogQHBhcmFtIGxhYmVsU21vb3RoaW5nIElmIGdyZWF0ZXIgdGhhbiAwLCB0aGVuIHNtb290aCB0aGUgbGFiZWxzLlxuICogQHBhcmFtIHJlZHVjdGlvbiBUeXBlIG9mIHJlZHVjdGlvbiB0byBhcHBseSB0byBsb3NzLiBTaG91bGQgYmUgb2YgdHlwZVxuICogICAgYFJlZHVjdGlvbmBcbiAqXG4gKiBAZG9jIHsgaGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ0xvc3NlcycsIG5hbWVzcGFjZTogJ2xvc3NlcycgfVxuICovXG5mdW5jdGlvbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5XzxUIGV4dGVuZHMgVGVuc29yLCBPIGV4dGVuZHMgVGVuc29yPihcbiAgICBvbmVob3RMYWJlbHM6IFR8VGVuc29yTGlrZSwgbG9naXRzOiBUfFRlbnNvckxpa2UsXG4gICAgd2VpZ2h0cz86IFRlbnNvcnxUZW5zb3JMaWtlLCBsYWJlbFNtb290aGluZyA9IDAsXG4gICAgcmVkdWN0aW9uID0gUmVkdWN0aW9uLlNVTV9CWV9OT05aRVJPX1dFSUdIVFMpOiBPIHtcbiAgbGV0ICRvbmVob3RMYWJlbHMgPVxuICAgICAgY29udmVydFRvVGVuc29yKG9uZWhvdExhYmVscywgJ29uZWhvdExhYmVscycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gIGNvbnN0ICRsb2dpdHMgPSBjb252ZXJ0VG9UZW5zb3IobG9naXRzLCAnbG9naXRzJywgJ3NvZnRtYXhDcm9zc0VudHJvcHknKTtcbiAgbGV0ICR3ZWlnaHRzOiBUZW5zb3IgPSBudWxsO1xuXG4gIGlmICh3ZWlnaHRzICE9IG51bGwpIHtcbiAgICAkd2VpZ2h0cyA9IGNvbnZlcnRUb1RlbnNvcih3ZWlnaHRzLCAnd2VpZ2h0cycsICdzb2Z0bWF4Q3Jvc3NFbnRyb3B5Jyk7XG4gIH1cblxuICBhc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICRvbmVob3RMYWJlbHMuc2hhcGUsICRsb2dpdHMuc2hhcGUsICdFcnJvciBpbiBzb2Z0bWF4Q3Jvc3NFbnRyb3B5OiAnKTtcblxuICBpZiAobGFiZWxTbW9vdGhpbmcgPiAwKSB7XG4gICAgY29uc3QgbGFiZWxTbW9vdGhpbmdTY2FsYXIgPSBzY2FsYXIobGFiZWxTbW9vdGhpbmcpO1xuICAgIGNvbnN0IG9uZSA9IHNjYWxhcigxKTtcbiAgICBjb25zdCBudW1DbGFzc2VzID0gc2NhbGFyKCRvbmVob3RMYWJlbHMuc2hhcGVbMV0pO1xuXG4gICAgJG9uZWhvdExhYmVscyA9XG4gICAgICAgIGFkZChtdWwoJG9uZWhvdExhYmVscywgc3ViKG9uZSwgbGFiZWxTbW9vdGhpbmdTY2FsYXIpKSxcbiAgICAgICAgICAgIGRpdihsYWJlbFNtb290aGluZ1NjYWxhciwgbnVtQ2xhc3NlcykpO1xuICB9XG5cbiAgY29uc3QgbG9zc2VzID0gc29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHNfKCRvbmVob3RMYWJlbHMsICRsb2dpdHMpO1xuXG4gIHJldHVybiBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3NlcywgJHdlaWdodHMsIHJlZHVjdGlvbik7XG59XG5cbmV4cG9ydCBjb25zdCBzb2Z0bWF4Q3Jvc3NFbnRyb3B5ID0gb3Aoe3NvZnRtYXhDcm9zc0VudHJvcHlffSk7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { SparseFillEmptyRows } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * The input SparseTensor is represented via the map of inputs {`indices`,\n * `values`, `denseShape`}. The output SparseTensor has the same `denseShape`\n * but with indices `outputIndices` and values `outputValues`. This op inserts a\n * single entry for every row that doesn't have any values. The index is created\n * as `[row, 0, ..., 0]` and the inserted value is `defaultValue`.\n *\n * For example, suppose `spInput` has shape [5, 6] and non-empty values:\n * [0, 1]: a\n * [0, 3]: b\n * [2, 0]: c\n * [3, 1]: d\n *\n * Rows 1 and 4 are empty, so the output will be of shape [5, 6] with values:\n * [0, 1]: a\n * [0, 3]: b\n * [1, 0]: `defaultValue`\n * [2, 0]: c\n * [3, 1]: d\n * [4, 0]: `defaultValue`\n *\n * The output SparseTensor will be in row-major order and will have the same\n * shape as the input.\n *\n * This op also returns an indicator vector shaped [dense_shape[0]] such that\n * emptyRowIndicator[i] = True iff row i was an empty row.\n *\n * And a reverse index map vector shaped [indices.shape[0]] that is used during\n * backpropagation, reverseIndexMap[i] = outi s.t. indices[i, j] ==\n * outputIndices[outi, j] for all j\n *\n * ```js\n * const result = tf.sparse.sparseFillEmptyRows(\n *   [[0, 0], [1, 0], [1, 3], [1, 4], [3, 2], [3, 3]],\n *   [0, 10, 13, 14, 32, 33], [5, 6], -1);\n * console.log(result);\n * result['outputIndices'].print(); // [[0, 0], [1, 0], [1, 3], [1, 4],\n *                                  //  [2, 0], [3, 2], [3, 3], [4, 0]]\n * result['outputValues'].print(); // [0, 10, 13, 14,-1, 32, 33, -1]\n * result['emptyRowIndicator'].print(); // [false, false, true, false, true]\n * result['reverseIndexMap'].print(); // [0, 1, 2, 3, 5, 6]\n * ```\n * @param indices: 2-D. The indices of the sparse tensor.\n * @param values: 1-D. The values of the sparse tensor.\n * @param denseShape: 1-D. The shape of the sparse tensor.\n * @param defaultValue: 0-D. Default value to insert into location [row, 0, ...,\n *     0] for rows missing from the input sparse tensor.\n * @return A map with the following properties:\n *     - outputIndices\n *     - outputValues: 1-D. The values of the filled sparse tensor.\n *     - emptyRowIndicator: 1-D. Whether the dense row was missing in the input\n * sparse tensor.\n *     - reverseIndexMap: 1-D. A map from the input indices to the output\n * indices.\n * @doc {heading: 'Operations', subheading: 'Sparse'}\n */\nfunction sparseFillEmptyRows_(indices, values, denseShape, defaultValue) {\n    const $indices = convertToTensor(indices, 'indices', 'sparseFillEmptyRows', 'int32');\n    const $values = convertToTensor(values, 'values', 'sparseFillEmptyRows');\n    const $denseShape = convertToTensor(denseShape, 'denseShape', 'sparseFillEmptyRows', 'int32');\n    const $defaultValue = convertToTensor(defaultValue, 'defaultValue', 'sparseFillEmptyRows', $values.dtype);\n    if ($indices.rank !== 2) {\n        throw new Error(`Indices should be Tensor2D but received shape\n        ${$indices.shape}`);\n    }\n    if ($values.rank !== 1) {\n        throw new Error(`Values should be Tensor1D but received shape ${$values.shape}`);\n    }\n    if ($denseShape.rank !== 1) {\n        throw new Error(`Dense shape should be Tensor1D but received shape ${$denseShape.shape}`);\n    }\n    if ($defaultValue.rank !== 0) {\n        throw new Error(`Default value should be a scalar but received shape ${$defaultValue.shape}`);\n    }\n    const inputs = {\n        indices: $indices,\n        values: $values,\n        denseShape: $denseShape,\n        defaultValue: $defaultValue\n    };\n    const result = ENGINE.runKernel(SparseFillEmptyRows, inputs);\n    return {\n        outputIndices: result[0],\n        outputValues: result[1],\n        emptyRowIndicator: result[2],\n        reverseIndexMap: result[3]\n    };\n}\nexport const sparseFillEmptyRows = op({ sparseFillEmptyRows_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX2ZpbGxfZW1wdHlfcm93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwYXJzZS9zcGFyc2VfZmlsbF9lbXB0eV9yb3dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLG1CQUFtQixFQUE0QixNQUFNLG9CQUFvQixDQUFDO0FBR2xGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBdURHO0FBQ0gsU0FBUyxvQkFBb0IsQ0FDekIsT0FBNEIsRUFBRSxNQUEyQixFQUN6RCxVQUErQixFQUMvQixZQUErQjtJQUNqQyxNQUFNLFFBQVEsR0FDVixlQUFlLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN4RSxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzlFLE1BQU0sYUFBYSxHQUFHLGVBQWUsQ0FDakMsWUFBWSxFQUFFLGNBQWMsRUFBRSxxQkFBcUIsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEUsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDO1VBQ1YsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDekI7SUFDRCxJQUFJLE9BQU8sQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQ1gsZ0RBQWdELE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3RFO0lBQ0QsSUFBSSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUMxQixNQUFNLElBQUksS0FBSyxDQUFDLHFEQUNaLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzFCO0lBQ0QsSUFBSSxhQUFhLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHVEQUNaLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzVCO0lBRUQsTUFBTSxNQUFNLEdBQThCO1FBQ3hDLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLE1BQU0sRUFBRSxPQUFPO1FBQ2YsVUFBVSxFQUFFLFdBQVc7UUFDdkIsWUFBWSxFQUFFLGFBQWE7S0FDNUIsQ0FBQztJQUVGLE1BQU0sTUFBTSxHQUFhLE1BQU0sQ0FBQyxTQUFTLENBQUMsbUJBQW1CLEVBQUUsTUFBWSxDQUFDLENBQUM7SUFDN0UsT0FBTztRQUNMLGFBQWEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDNUIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLENBQUMsRUFBQyxvQkFBb0IsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtTcGFyc2VGaWxsRW1wdHlSb3dzLCBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtTY2FsYXIsIFRlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtTY2FsYXJMaWtlLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFRoZSBpbnB1dCBTcGFyc2VUZW5zb3IgaXMgcmVwcmVzZW50ZWQgdmlhIHRoZSBtYXAgb2YgaW5wdXRzIHtgaW5kaWNlc2AsXG4gKiBgdmFsdWVzYCwgYGRlbnNlU2hhcGVgfS4gVGhlIG91dHB1dCBTcGFyc2VUZW5zb3IgaGFzIHRoZSBzYW1lIGBkZW5zZVNoYXBlYFxuICogYnV0IHdpdGggaW5kaWNlcyBgb3V0cHV0SW5kaWNlc2AgYW5kIHZhbHVlcyBgb3V0cHV0VmFsdWVzYC4gVGhpcyBvcCBpbnNlcnRzIGFcbiAqIHNpbmdsZSBlbnRyeSBmb3IgZXZlcnkgcm93IHRoYXQgZG9lc24ndCBoYXZlIGFueSB2YWx1ZXMuIFRoZSBpbmRleCBpcyBjcmVhdGVkXG4gKiBhcyBgW3JvdywgMCwgLi4uLCAwXWAgYW5kIHRoZSBpbnNlcnRlZCB2YWx1ZSBpcyBgZGVmYXVsdFZhbHVlYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgc3VwcG9zZSBgc3BJbnB1dGAgaGFzIHNoYXBlIFs1LCA2XSBhbmQgbm9uLWVtcHR5IHZhbHVlczpcbiAqIFswLCAxXTogYVxuICogWzAsIDNdOiBiXG4gKiBbMiwgMF06IGNcbiAqIFszLCAxXTogZFxuICpcbiAqIFJvd3MgMSBhbmQgNCBhcmUgZW1wdHksIHNvIHRoZSBvdXRwdXQgd2lsbCBiZSBvZiBzaGFwZSBbNSwgNl0gd2l0aCB2YWx1ZXM6XG4gKiBbMCwgMV06IGFcbiAqIFswLCAzXTogYlxuICogWzEsIDBdOiBgZGVmYXVsdFZhbHVlYFxuICogWzIsIDBdOiBjXG4gKiBbMywgMV06IGRcbiAqIFs0LCAwXTogYGRlZmF1bHRWYWx1ZWBcbiAqXG4gKiBUaGUgb3V0cHV0IFNwYXJzZVRlbnNvciB3aWxsIGJlIGluIHJvdy1tYWpvciBvcmRlciBhbmQgd2lsbCBoYXZlIHRoZSBzYW1lXG4gKiBzaGFwZSBhcyB0aGUgaW5wdXQuXG4gKlxuICogVGhpcyBvcCBhbHNvIHJldHVybnMgYW4gaW5kaWNhdG9yIHZlY3RvciBzaGFwZWQgW2RlbnNlX3NoYXBlWzBdXSBzdWNoIHRoYXRcbiAqIGVtcHR5Um93SW5kaWNhdG9yW2ldID0gVHJ1ZSBpZmYgcm93IGkgd2FzIGFuIGVtcHR5IHJvdy5cbiAqXG4gKiBBbmQgYSByZXZlcnNlIGluZGV4IG1hcCB2ZWN0b3Igc2hhcGVkIFtpbmRpY2VzLnNoYXBlWzBdXSB0aGF0IGlzIHVzZWQgZHVyaW5nXG4gKiBiYWNrcHJvcGFnYXRpb24sIHJldmVyc2VJbmRleE1hcFtpXSA9IG91dGkgcy50LiBpbmRpY2VzW2ksIGpdID09XG4gKiBvdXRwdXRJbmRpY2VzW291dGksIGpdIGZvciBhbGwgalxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZXN1bHQgPSB0Zi5zcGFyc2Uuc3BhcnNlRmlsbEVtcHR5Um93cyhcbiAqICAgW1swLCAwXSwgWzEsIDBdLCBbMSwgM10sIFsxLCA0XSwgWzMsIDJdLCBbMywgM11dLFxuICogICBbMCwgMTAsIDEzLCAxNCwgMzIsIDMzXSwgWzUsIDZdLCAtMSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQpO1xuICogcmVzdWx0WydvdXRwdXRJbmRpY2VzJ10ucHJpbnQoKTsgLy8gW1swLCAwXSwgWzEsIDBdLCBbMSwgM10sIFsxLCA0XSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICBbMiwgMF0sIFszLCAyXSwgWzMsIDNdLCBbNCwgMF1dXG4gKiByZXN1bHRbJ291dHB1dFZhbHVlcyddLnByaW50KCk7IC8vIFswLCAxMCwgMTMsIDE0LC0xLCAzMiwgMzMsIC0xXVxuICogcmVzdWx0WydlbXB0eVJvd0luZGljYXRvciddLnByaW50KCk7IC8vIFtmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCB0cnVlXVxuICogcmVzdWx0WydyZXZlcnNlSW5kZXhNYXAnXS5wcmludCgpOyAvLyBbMCwgMSwgMiwgMywgNSwgNl1cbiAqIGBgYFxuICogQHBhcmFtIGluZGljZXM6IDItRC4gVGhlIGluZGljZXMgb2YgdGhlIHNwYXJzZSB0ZW5zb3IuXG4gKiBAcGFyYW0gdmFsdWVzOiAxLUQuIFRoZSB2YWx1ZXMgb2YgdGhlIHNwYXJzZSB0ZW5zb3IuXG4gKiBAcGFyYW0gZGVuc2VTaGFwZTogMS1ELiBUaGUgc2hhcGUgb2YgdGhlIHNwYXJzZSB0ZW5zb3IuXG4gKiBAcGFyYW0gZGVmYXVsdFZhbHVlOiAwLUQuIERlZmF1bHQgdmFsdWUgdG8gaW5zZXJ0IGludG8gbG9jYXRpb24gW3JvdywgMCwgLi4uLFxuICogICAgIDBdIGZvciByb3dzIG1pc3NpbmcgZnJvbSB0aGUgaW5wdXQgc3BhcnNlIHRlbnNvci5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBvdXRwdXRJbmRpY2VzXG4gKiAgICAgLSBvdXRwdXRWYWx1ZXM6IDEtRC4gVGhlIHZhbHVlcyBvZiB0aGUgZmlsbGVkIHNwYXJzZSB0ZW5zb3IuXG4gKiAgICAgLSBlbXB0eVJvd0luZGljYXRvcjogMS1ELiBXaGV0aGVyIHRoZSBkZW5zZSByb3cgd2FzIG1pc3NpbmcgaW4gdGhlIGlucHV0XG4gKiBzcGFyc2UgdGVuc29yLlxuICogICAgIC0gcmV2ZXJzZUluZGV4TWFwOiAxLUQuIEEgbWFwIGZyb20gdGhlIGlucHV0IGluZGljZXMgdG8gdGhlIG91dHB1dFxuICogaW5kaWNlcy5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3NfKFxuICAgIGluZGljZXM6IFRlbnNvcjJEfFRlbnNvckxpa2UsIHZhbHVlczogVGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBkZW5zZVNoYXBlOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIGRlZmF1bHRWYWx1ZTogU2NhbGFyfFNjYWxhckxpa2UpOiBOYW1lZFRlbnNvck1hcCB7XG4gIGNvbnN0ICRpbmRpY2VzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VGaWxsRW1wdHlSb3dzJywgJ2ludDMyJyk7XG4gIGNvbnN0ICR2YWx1ZXMgPSBjb252ZXJ0VG9UZW5zb3IodmFsdWVzLCAndmFsdWVzJywgJ3NwYXJzZUZpbGxFbXB0eVJvd3MnKTtcbiAgY29uc3QgJGRlbnNlU2hhcGUgPVxuICAgICAgY29udmVydFRvVGVuc29yKGRlbnNlU2hhcGUsICdkZW5zZVNoYXBlJywgJ3NwYXJzZUZpbGxFbXB0eVJvd3MnLCAnaW50MzInKTtcbiAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IGNvbnZlcnRUb1RlbnNvcihcbiAgICAgIGRlZmF1bHRWYWx1ZSwgJ2RlZmF1bHRWYWx1ZScsICdzcGFyc2VGaWxsRW1wdHlSb3dzJywgJHZhbHVlcy5kdHlwZSk7XG5cbiAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjJEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAkeyRpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmICgkdmFsdWVzLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBWYWx1ZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZSAkeyR2YWx1ZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKCRkZW5zZVNoYXBlLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlbnNlIHNoYXBlIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGUgJHtcbiAgICAgICAgJGRlbnNlU2hhcGUuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKCRkZWZhdWx0VmFsdWUucmFuayAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGVmYXVsdCB2YWx1ZSBzaG91bGQgYmUgYSBzY2FsYXIgYnV0IHJlY2VpdmVkIHNoYXBlICR7XG4gICAgICAgICRkZWZhdWx0VmFsdWUuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IFNwYXJzZUZpbGxFbXB0eVJvd3NJbnB1dHMgPSB7XG4gICAgaW5kaWNlczogJGluZGljZXMsXG4gICAgdmFsdWVzOiAkdmFsdWVzLFxuICAgIGRlbnNlU2hhcGU6ICRkZW5zZVNoYXBlLFxuICAgIGRlZmF1bHRWYWx1ZTogJGRlZmF1bHRWYWx1ZVxuICB9O1xuXG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPSBFTkdJTkUucnVuS2VybmVsKFNwYXJzZUZpbGxFbXB0eVJvd3MsIGlucHV0cyBhcyB7fSk7XG4gIHJldHVybiB7XG4gICAgb3V0cHV0SW5kaWNlczogcmVzdWx0WzBdLFxuICAgIG91dHB1dFZhbHVlczogcmVzdWx0WzFdLFxuICAgIGVtcHR5Um93SW5kaWNhdG9yOiByZXN1bHRbMl0sXG4gICAgcmV2ZXJzZUluZGV4TWFwOiByZXN1bHRbM11cbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZUZpbGxFbXB0eVJvd3MgPSBvcCh7c3BhcnNlRmlsbEVtcHR5Um93c199KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { SparseReshape } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * This operation has the same semantics as reshape on the represented dense\n * tensor. The `inputIndices` are recomputed based on the requested `newShape`.\n * If one component of `newShape` is the special value -1, the size of that\n * dimension is computed so that the total dense size remains constant. At most\n * one component of `newShape` can be -1. The number of dense elements implied\n * by `newShape` must be the same as the number of dense elements originally\n * implied by `inputShape`. Reshaping does not affect the order of values in the\n * SparseTensor. If the input tensor has rank R_in and N non-empty values, and\n * `newShape` has length R_out, then `inputIndices` has shape [N, R_in],\n * `inputShape` has length R_in, `outputIndices` has shape [N, R_out], and\n * `outputShape` has length R_out.\n *\n * ```js\n * const result = tf.sparse.sparseReshape(\n *   [[0, 0, 0], [0, 0, 1], [0, 1, 0], [1, 0, 0], [1, 2, 3]],\n *   [2, 3, 6], [9, -1]);\n * console.log(result);\n * result['outputIndices'].print(); //[[0, 0], [0, 1], [1, 2], [4, 2], [8, 1]]\n * result['outputShape'].print(); // [9, 4]\n * ```\n * @param inputIndices: 2-D. N x R_in matrix with the indices of non-empty\n * values in a SparseTensor.\n * @param inputShape: 1-D. R_in Tensor1D with the input SparseTensor's dense\n * shape.\n * @param newShape: 1-D. R_out Tensor1D with the requested new dense shape.\n * @return A map with the following properties:\n *     - outputIndices: 2-D. N x R_out matrix with the updated indices of\n *       non-empty values in the output SparseTensor.\n *     - outputShape: 1-D. R_out vector with the full dense shape of the output\n *       SparseTensor. This is the same as newShape but with any -1 dimensions\n *        filled in.\n * @doc {heading: 'Operations', subheading: 'Sparse'}\n */\nfunction sparseReshape_(inputIndices, inputShape, newShape) {\n    const $inputIndices = convertToTensor(inputIndices, 'inputIndices', 'sparseReshape', 'int32');\n    const $inputShape = convertToTensor(inputShape, 'inputShape', 'sparseReshape', 'int32');\n    const $newShape = convertToTensor(newShape, 'newShape', 'sparseReshape', 'int32');\n    if ($inputIndices.rank !== 2) {\n        throw new Error(`Input indices should be Tensor2D but received shape\n        ${$inputIndices.shape}`);\n    }\n    if ($inputShape.rank !== 1) {\n        throw new Error(`Input shape should be Tensor1D but received shape ${$inputShape.shape}`);\n    }\n    if ($newShape.rank !== 1) {\n        throw new Error(`New shape should be Tensor1D but received shape ${$newShape.shape}`);\n    }\n    const inputs = {\n        inputIndices: $inputIndices,\n        inputShape: $inputShape,\n        newShape: $newShape\n    };\n    const result = ENGINE.runKernel(SparseReshape, inputs);\n    return { outputIndices: result[0], outputShape: result[1] };\n}\nexport const sparseReshape = op({ sparseReshape_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3Jlc2hhcGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsYUFBYSxFQUFzQixNQUFNLG9CQUFvQixDQUFDO0FBR3RFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFDSCxTQUFTLGNBQWMsQ0FDbkIsWUFBaUMsRUFBRSxVQUErQixFQUNsRSxRQUE2QjtJQUMvQixNQUFNLGFBQWEsR0FDZixlQUFlLENBQUMsWUFBWSxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUUsTUFBTSxXQUFXLEdBQ2IsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsZUFBZSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3hFLE1BQU0sU0FBUyxHQUNYLGVBQWUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVwRSxJQUFJLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUM7VUFDVixhQUFhLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM5QjtJQUNELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFDWixXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMxQjtJQUNELElBQUksU0FBUyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDWCxtREFBbUQsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDM0U7SUFFRCxNQUFNLE1BQU0sR0FBd0I7UUFDbEMsWUFBWSxFQUFFLGFBQWE7UUFDM0IsVUFBVSxFQUFFLFdBQVc7UUFDdkIsUUFBUSxFQUFFLFNBQVM7S0FDcEIsQ0FBQztJQUNGLE1BQU0sTUFBTSxHQUFhLE1BQU0sQ0FBQyxTQUFTLENBQUMsYUFBYSxFQUFFLE1BQVksQ0FBQyxDQUFDO0lBQ3ZFLE9BQU8sRUFBQyxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi8uLi9lbmdpbmUnO1xuaW1wb3J0IHtTcGFyc2VSZXNoYXBlLCBTcGFyc2VSZXNoYXBlSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFELCBUZW5zb3IyRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBUaGlzIG9wZXJhdGlvbiBoYXMgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHJlc2hhcGUgb24gdGhlIHJlcHJlc2VudGVkIGRlbnNlXG4gKiB0ZW5zb3IuIFRoZSBgaW5wdXRJbmRpY2VzYCBhcmUgcmVjb21wdXRlZCBiYXNlZCBvbiB0aGUgcmVxdWVzdGVkIGBuZXdTaGFwZWAuXG4gKiBJZiBvbmUgY29tcG9uZW50IG9mIGBuZXdTaGFwZWAgaXMgdGhlIHNwZWNpYWwgdmFsdWUgLTEsIHRoZSBzaXplIG9mIHRoYXRcbiAqIGRpbWVuc2lvbiBpcyBjb21wdXRlZCBzbyB0aGF0IHRoZSB0b3RhbCBkZW5zZSBzaXplIHJlbWFpbnMgY29uc3RhbnQuIEF0IG1vc3RcbiAqIG9uZSBjb21wb25lbnQgb2YgYG5ld1NoYXBlYCBjYW4gYmUgLTEuIFRoZSBudW1iZXIgb2YgZGVuc2UgZWxlbWVudHMgaW1wbGllZFxuICogYnkgYG5ld1NoYXBlYCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBudW1iZXIgb2YgZGVuc2UgZWxlbWVudHMgb3JpZ2luYWxseVxuICogaW1wbGllZCBieSBgaW5wdXRTaGFwZWAuIFJlc2hhcGluZyBkb2VzIG5vdCBhZmZlY3QgdGhlIG9yZGVyIG9mIHZhbHVlcyBpbiB0aGVcbiAqIFNwYXJzZVRlbnNvci4gSWYgdGhlIGlucHV0IHRlbnNvciBoYXMgcmFuayBSX2luIGFuZCBOIG5vbi1lbXB0eSB2YWx1ZXMsIGFuZFxuICogYG5ld1NoYXBlYCBoYXMgbGVuZ3RoIFJfb3V0LCB0aGVuIGBpbnB1dEluZGljZXNgIGhhcyBzaGFwZSBbTiwgUl9pbl0sXG4gKiBgaW5wdXRTaGFwZWAgaGFzIGxlbmd0aCBSX2luLCBgb3V0cHV0SW5kaWNlc2AgaGFzIHNoYXBlIFtOLCBSX291dF0sIGFuZFxuICogYG91dHB1dFNoYXBlYCBoYXMgbGVuZ3RoIFJfb3V0LlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZXN1bHQgPSB0Zi5zcGFyc2Uuc3BhcnNlUmVzaGFwZShcbiAqICAgW1swLCAwLCAwXSwgWzAsIDAsIDFdLCBbMCwgMSwgMF0sIFsxLCAwLCAwXSwgWzEsIDIsIDNdXSxcbiAqICAgWzIsIDMsIDZdLCBbOSwgLTFdKTtcbiAqIGNvbnNvbGUubG9nKHJlc3VsdCk7XG4gKiByZXN1bHRbJ291dHB1dEluZGljZXMnXS5wcmludCgpOyAvL1tbMCwgMF0sIFswLCAxXSwgWzEsIDJdLCBbNCwgMl0sIFs4LCAxXV1cbiAqIHJlc3VsdFsnb3V0cHV0U2hhcGUnXS5wcmludCgpOyAvLyBbOSwgNF1cbiAqIGBgYFxuICogQHBhcmFtIGlucHV0SW5kaWNlczogMi1ELiBOIHggUl9pbiBtYXRyaXggd2l0aCB0aGUgaW5kaWNlcyBvZiBub24tZW1wdHlcbiAqIHZhbHVlcyBpbiBhIFNwYXJzZVRlbnNvci5cbiAqIEBwYXJhbSBpbnB1dFNoYXBlOiAxLUQuIFJfaW4gVGVuc29yMUQgd2l0aCB0aGUgaW5wdXQgU3BhcnNlVGVuc29yJ3MgZGVuc2VcbiAqIHNoYXBlLlxuICogQHBhcmFtIG5ld1NoYXBlOiAxLUQuIFJfb3V0IFRlbnNvcjFEIHdpdGggdGhlIHJlcXVlc3RlZCBuZXcgZGVuc2Ugc2hhcGUuXG4gKiBAcmV0dXJuIEEgbWFwIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOlxuICogICAgIC0gb3V0cHV0SW5kaWNlczogMi1ELiBOIHggUl9vdXQgbWF0cml4IHdpdGggdGhlIHVwZGF0ZWQgaW5kaWNlcyBvZlxuICogICAgICAgbm9uLWVtcHR5IHZhbHVlcyBpbiB0aGUgb3V0cHV0IFNwYXJzZVRlbnNvci5cbiAqICAgICAtIG91dHB1dFNoYXBlOiAxLUQuIFJfb3V0IHZlY3RvciB3aXRoIHRoZSBmdWxsIGRlbnNlIHNoYXBlIG9mIHRoZSBvdXRwdXRcbiAqICAgICAgIFNwYXJzZVRlbnNvci4gVGhpcyBpcyB0aGUgc2FtZSBhcyBuZXdTaGFwZSBidXQgd2l0aCBhbnkgLTEgZGltZW5zaW9uc1xuICogICAgICAgIGZpbGxlZCBpbi5cbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVJlc2hhcGVfKFxuICAgIGlucHV0SW5kaWNlczogVGVuc29yMkR8VGVuc29yTGlrZSwgaW5wdXRTaGFwZTogVGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBuZXdTaGFwZTogVGVuc29yMUR8VGVuc29yTGlrZSk6IE5hbWVkVGVuc29yTWFwIHtcbiAgY29uc3QgJGlucHV0SW5kaWNlcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IoaW5wdXRJbmRpY2VzLCAnaW5wdXRJbmRpY2VzJywgJ3NwYXJzZVJlc2hhcGUnLCAnaW50MzInKTtcbiAgY29uc3QgJGlucHV0U2hhcGUgPVxuICAgICAgY29udmVydFRvVGVuc29yKGlucHV0U2hhcGUsICdpbnB1dFNoYXBlJywgJ3NwYXJzZVJlc2hhcGUnLCAnaW50MzInKTtcbiAgY29uc3QgJG5ld1NoYXBlID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihuZXdTaGFwZSwgJ25ld1NoYXBlJywgJ3NwYXJzZVJlc2hhcGUnLCAnaW50MzInKTtcblxuICBpZiAoJGlucHV0SW5kaWNlcy5yYW5rICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRpY2VzIHNob3VsZCBiZSBUZW5zb3IyRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHskaW5wdXRJbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmICgkaW5wdXRTaGFwZS5yYW5rICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaGFwZSBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7XG4gICAgICAgICRpbnB1dFNoYXBlLnNoYXBlfWApO1xuICB9XG4gIGlmICgkbmV3U2hhcGUucmFuayAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYE5ldyBzaGFwZSBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JG5ld1NoYXBlLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBTcGFyc2VSZXNoYXBlSW5wdXRzID0ge1xuICAgIGlucHV0SW5kaWNlczogJGlucHV0SW5kaWNlcyxcbiAgICBpbnB1dFNoYXBlOiAkaW5wdXRTaGFwZSxcbiAgICBuZXdTaGFwZTogJG5ld1NoYXBlXG4gIH07XG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPSBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVJlc2hhcGUsIGlucHV0cyBhcyB7fSk7XG4gIHJldHVybiB7b3V0cHV0SW5kaWNlczogcmVzdWx0WzBdLCBvdXRwdXRTaGFwZTogcmVzdWx0WzFdfTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGUgPSBvcCh7c3BhcnNlUmVzaGFwZV99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { SparseSegmentMean } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Computes the mean along sparse segments of a tensor.\n *\n * ```js\n * const c = tf.tensor2d([[1,2,3,4], [-1,-2,-3,-4], [6,7,8,9]]);\n * // Select two rows, one segment.\n * const result1 = tf.sparse.sparseSegmentMean(c,\n *                                           tf.tensor1d([0, 1], 'int32'),\n *                                           tf.tensor1d([0, 0], 'int32'));\n * result1.print(); // [[0, 0, 0, 0]]\n *\n * // Select two rows, two segments.\n * const result2 = tf.sparse.sparseSegmentMean(c,\n *                                             tf.tensor1d([0, 1], 'int32'),\n *                                             tf.tensor1d([0, 1], 'int32'));\n * result2.print(); // [[1, 2, 3, 4], [-1, -2, -3, -4]]\n *\n * // Select all rows, two segments.\n * const result3 = tf.sparse.sparseSegmentMean(c,\n *                                             tf.tensor1d([0, 1, 2], 'int32'),\n *                                             tf.tensor1d([0, 1, 1], 'int32'));\n * result3.print(); // [[1.0, 2.0, 3.0, 4.0], [2.5, 2.5, 2.5, 2.5]]\n * ```\n * @param data: A Tensor of at least one dimension with data that will be\n *     assembled in the output.\n * @param indices: A 1-D Tensor with indices into data. Has same rank as\n *     segmentIds.\n * @param segmentIds: A 1-D Tensor with indices into the output Tensor. Values\n *     should be sorted and can be repeated.\n * @return Has same shape as data, except for dimension 0 which has equal to\n *         the number of segments.\n *\n * @doc {heading: 'Operations', subheading: 'Sparse'}\n */\nfunction sparseSegmentMean_(data, indices, segmentIds) {\n    const $data = convertToTensor(data, 'data', 'sparseSegmentMean');\n    const $indices = convertToTensor(indices, 'indices', 'sparseSegmentMean', 'int32');\n    const $segmentIds = convertToTensor(segmentIds, 'segmentIds', 'sparseSegmentMean', 'int32');\n    if ($data.rank < 1) {\n        throw new Error(`Data should be at least 1 dimensional but received scalar`);\n    }\n    if ($indices.rank !== 1) {\n        throw new Error(`Indices should be Tensor1D but received shape\n          ${$indices.shape}`);\n    }\n    if ($segmentIds.rank !== 1) {\n        throw new Error(`Segment ids should be Tensor1D but received shape\n          ${$segmentIds.shape}`);\n    }\n    const inputs = {\n        data: $data,\n        indices: $indices,\n        segmentIds: $segmentIds\n    };\n    return ENGINE.runKernel(SparseSegmentMean, inputs);\n}\nexport const sparseSegmentMean = op({ sparseSegmentMean_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3NlZ21lbnRfbWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9tZWFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDcEMsT0FBTyxFQUFDLGlCQUFpQixFQUEwQixNQUFNLG9CQUFvQixDQUFDO0FBRTlFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQ0c7QUFDSCxTQUFTLGtCQUFrQixDQUN2QixJQUF1QixFQUFFLE9BQTRCLEVBQ3JELFVBQStCO0lBQ2pDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDakUsTUFBTSxRQUFRLEdBQ1YsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsTUFBTSxXQUFXLEdBQ2IsZUFBZSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFNUUsSUFBSSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtRQUNsQixNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRCxDQUFDLENBQUM7S0FDbEU7SUFDRCxJQUFJLFFBQVEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUM7WUFDUixRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMzQjtJQUNELElBQUksV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxJQUFJLEtBQUssQ0FBQztZQUNSLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBRUQsTUFBTSxNQUFNLEdBQTRCO1FBQ3RDLElBQUksRUFBRSxLQUFLO1FBQ1gsT0FBTyxFQUFFLFFBQVE7UUFDakIsVUFBVSxFQUFFLFdBQVc7S0FDeEIsQ0FBQztJQUVGLE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsRUFBRSxNQUFZLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsRUFBRSxDQUFDLEVBQUMsa0JBQWtCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vLi4vZW5naW5lJztcbmltcG9ydCB7U3BhcnNlU2VnbWVudE1lYW4sIFNwYXJzZVNlZ21lbnRNZWFuSW5wdXRzfSBmcm9tICcuLi8uLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIG1lYW4gYWxvbmcgc3BhcnNlIHNlZ21lbnRzIG9mIGEgdGVuc29yLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBjID0gdGYudGVuc29yMmQoW1sxLDIsMyw0XSwgWy0xLC0yLC0zLC00XSwgWzYsNyw4LDldXSk7XG4gKiAvLyBTZWxlY3QgdHdvIHJvd3MsIG9uZSBzZWdtZW50LlxuICogY29uc3QgcmVzdWx0MSA9IHRmLnNwYXJzZS5zcGFyc2VTZWdtZW50TWVhbihjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwXSwgJ2ludDMyJykpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdXVxuICpcbiAqIC8vIFNlbGVjdCB0d28gcm93cywgdHdvIHNlZ21lbnRzLlxuICogY29uc3QgcmVzdWx0MiA9IHRmLnNwYXJzZS5zcGFyc2VTZWdtZW50TWVhbihjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDIucHJpbnQoKTsgLy8gW1sxLCAyLCAzLCA0XSwgWy0xLCAtMiwgLTMsIC00XV1cbiAqXG4gKiAvLyBTZWxlY3QgYWxsIHJvd3MsIHR3byBzZWdtZW50cy5cbiAqIGNvbnN0IHJlc3VsdDMgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudE1lYW4oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDEsIDJdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDEsIDFdLCAnaW50MzInKSk7XG4gKiByZXN1bHQzLnByaW50KCk7IC8vIFtbMS4wLCAyLjAsIDMuMCwgNC4wXSwgWzIuNSwgMi41LCAyLjUsIDIuNV1dXG4gKiBgYGBcbiAqIEBwYXJhbSBkYXRhOiBBIFRlbnNvciBvZiBhdCBsZWFzdCBvbmUgZGltZW5zaW9uIHdpdGggZGF0YSB0aGF0IHdpbGwgYmVcbiAqICAgICBhc3NlbWJsZWQgaW4gdGhlIG91dHB1dC5cbiAqIEBwYXJhbSBpbmRpY2VzOiBBIDEtRCBUZW5zb3Igd2l0aCBpbmRpY2VzIGludG8gZGF0YS4gSGFzIHNhbWUgcmFuayBhc1xuICogICAgIHNlZ21lbnRJZHMuXG4gKiBAcGFyYW0gc2VnbWVudElkczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIHRoZSBvdXRwdXQgVGVuc29yLiBWYWx1ZXNcbiAqICAgICBzaG91bGQgYmUgc29ydGVkIGFuZCBjYW4gYmUgcmVwZWF0ZWQuXG4gKiBAcmV0dXJuIEhhcyBzYW1lIHNoYXBlIGFzIGRhdGEsIGV4Y2VwdCBmb3IgZGltZW5zaW9uIDAgd2hpY2ggaGFzIGVxdWFsIHRvXG4gKiAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2VnbWVudHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3BhcnNlJ31cbiAqL1xuZnVuY3Rpb24gc3BhcnNlU2VnbWVudE1lYW5fKFxuICAgIGRhdGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBpbmRpY2VzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHNlZ21lbnRJZHM6IFRlbnNvcjFEfFRlbnNvckxpa2UpOiBUZW5zb3Ige1xuICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdzcGFyc2VTZWdtZW50TWVhbicpO1xuICBjb25zdCAkaW5kaWNlcyA9XG4gICAgICBjb252ZXJ0VG9UZW5zb3IoaW5kaWNlcywgJ2luZGljZXMnLCAnc3BhcnNlU2VnbWVudE1lYW4nLCAnaW50MzInKTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPVxuICAgICAgY29udmVydFRvVGVuc29yKHNlZ21lbnRJZHMsICdzZWdtZW50SWRzJywgJ3NwYXJzZVNlZ21lbnRNZWFuJywgJ2ludDMyJyk7XG5cbiAgaWYgKCRkYXRhLnJhbmsgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gIH1cbiAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICR7JGluZGljZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKCRzZWdtZW50SWRzLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWRzIHNob3VsZCBiZSBUZW5zb3IxRCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAkeyRzZWdtZW50SWRzLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgaW5wdXRzOiBTcGFyc2VTZWdtZW50TWVhbklucHV0cyA9IHtcbiAgICBkYXRhOiAkZGF0YSxcbiAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgICBzZWdtZW50SWRzOiAkc2VnbWVudElkc1xuICB9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVNlZ21lbnRNZWFuLCBpbnB1dHMgYXMge30pO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW4gPSBvcCh7c3BhcnNlU2VnbWVudE1lYW5ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { SparseSegmentSum } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Computes the sum along sparse segments of a tensor.\n *\n * ```js\n * const c = tf.tensor2d([[1,2,3,4], [-1,-2,-3,-4], [5,6,7,8]]);\n * // Select two rows, one segment.\n * const result1 = tf.sparse.sparseSegmentSum(c,\n *                                           tf.tensor1d([0, 1], 'int32'),\n *                                           tf.tensor1d([0, 0], 'int32'));\n * result1.print(); // [[0, 0, 0, 0]]\n *\n * // Select two rows, two segments.\n * const result2 = tf.sparse.sparseSegmentSum(c,\n *                                           tf.tensor1d([0, 1], 'int32'),\n *                                           tf.tensor1d([0, 1], 'int32'));\n * result2.print(); // [[1, 2, 3, 4], [-1, -2, -3, -4]]\n *\n * // Select all rows, two segments.\n * const result3 = tf.sparse.sparseSegmentSum(c,\n *                                           tf.tensor1d([0, 1, 2], 'int32'),\n *                                           tf.tensor1d([0, 0, 1], 'int32'));\n * result3.print(); // [[0, 0, 0, 0], [5, 6, 7, 8]]\n * ```\n * @param data: A Tensor of at least one dimension with data that will be\n *     assembled in the output.\n * @param indices: A 1-D Tensor with indices into data. Has same rank as\n *     segmentIds.\n * @param segmentIds: A 1-D Tensor with indices into the output Tensor. Values\n *     should be sorted and can be repeated.\n * @return Has same shape as data, except for dimension 0 which has equal to\n *         the number of segments.\n *\n * @doc {heading: 'Operations', subheading: 'Sparse'}\n */\nfunction sparseSegmentSum_(data, indices, segmentIds) {\n    const $data = convertToTensor(data, 'data', 'sparseSegmentSum');\n    const $indices = convertToTensor(indices, 'indices', 'sparseSegmentSum', 'int32');\n    const $segmentIds = convertToTensor(segmentIds, 'segmentIds', 'sparseSegmentSum', 'int32');\n    if ($data.rank < 1) {\n        throw new Error(`Data should be at least 1 dimensional but received scalar`);\n    }\n    if ($indices.rank !== 1) {\n        throw new Error(`Indices should be Tensor1D but received shape\n         ${$indices.shape}`);\n    }\n    if ($segmentIds.rank !== 1) {\n        throw new Error(`Segment ids should be Tensor1D but received shape\n         ${$segmentIds.shape}`);\n    }\n    const inputs = {\n        data: $data,\n        indices: $indices,\n        segmentIds: $segmentIds\n    };\n    return ENGINE.runKernel(SparseSegmentSum, inputs);\n}\nexport const sparseSegmentSum = op({ sparseSegmentSum_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3NlZ21lbnRfc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3BhcnNlL3NwYXJzZV9zZWdtZW50X3N1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBeUIsTUFBTSxvQkFBb0IsQ0FBQztBQUU1RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVoQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUNHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FDdEIsSUFBdUIsRUFBRSxPQUE0QixFQUNyRCxVQUErQjtJQUNqQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sUUFBUSxHQUNWLGVBQWUsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sV0FBVyxHQUNiLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGtCQUFrQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRTNFLElBQUksS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsSUFBSSxRQUFRLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUN2QixNQUFNLElBQUksS0FBSyxDQUFDO1dBQ1QsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDMUI7SUFDRCxJQUFJLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQzFCLE1BQU0sSUFBSSxLQUFLLENBQUM7V0FDVCxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3QjtJQUVELE1BQU0sTUFBTSxHQUEyQjtRQUNyQyxJQUFJLEVBQUUsS0FBSztRQUNYLE9BQU8sRUFBRSxRQUFRO1FBQ2pCLFVBQVUsRUFBRSxXQUFXO0tBQ3hCLENBQUM7SUFFRixPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLEVBQUUsTUFBWSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFHLEVBQUUsQ0FBQyxFQUFDLGlCQUFpQixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1NwYXJzZVNlZ21lbnRTdW0sIFNwYXJzZVNlZ21lbnRTdW1JbnB1dHN9IGZyb20gJy4uLy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUR9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgc3VtIGFsb25nIHNwYXJzZSBzZWdtZW50cyBvZiBhIHRlbnNvci5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYyA9IHRmLnRlbnNvcjJkKFtbMSwyLDMsNF0sIFstMSwtMiwtMywtNF0sIFs1LDYsNyw4XV0pO1xuICogLy8gU2VsZWN0IHR3byByb3dzLCBvbmUgc2VnbWVudC5cbiAqIGNvbnN0IHJlc3VsdDEgPSB0Zi5zcGFyc2Uuc3BhcnNlU2VnbWVudFN1bShjLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAwXSwgJ2ludDMyJykpO1xuICogcmVzdWx0MS5wcmludCgpOyAvLyBbWzAsIDAsIDAsIDBdXVxuICpcbiAqIC8vIFNlbGVjdCB0d28gcm93cywgdHdvIHNlZ21lbnRzLlxuICogY29uc3QgcmVzdWx0MiA9IHRmLnNwYXJzZS5zcGFyc2VTZWdtZW50U3VtKGMsXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMV0sICdpbnQzMicpLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGYudGVuc29yMWQoWzAsIDFdLCAnaW50MzInKSk7XG4gKiByZXN1bHQyLnByaW50KCk7IC8vIFtbMSwgMiwgMywgNF0sIFstMSwgLTIsIC0zLCAtNF1dXG4gKlxuICogLy8gU2VsZWN0IGFsbCByb3dzLCB0d28gc2VnbWVudHMuXG4gKiBjb25zdCByZXN1bHQzID0gdGYuc3BhcnNlLnNwYXJzZVNlZ21lbnRTdW0oYyxcbiAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRmLnRlbnNvcjFkKFswLCAxLCAyXSwgJ2ludDMyJyksXG4gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0Zi50ZW5zb3IxZChbMCwgMCwgMV0sICdpbnQzMicpKTtcbiAqIHJlc3VsdDMucHJpbnQoKTsgLy8gW1swLCAwLCAwLCAwXSwgWzUsIDYsIDcsIDhdXVxuICogYGBgXG4gKiBAcGFyYW0gZGF0YTogQSBUZW5zb3Igb2YgYXQgbGVhc3Qgb25lIGRpbWVuc2lvbiB3aXRoIGRhdGEgdGhhdCB3aWxsIGJlXG4gKiAgICAgYXNzZW1ibGVkIGluIHRoZSBvdXRwdXQuXG4gKiBAcGFyYW0gaW5kaWNlczogQSAxLUQgVGVuc29yIHdpdGggaW5kaWNlcyBpbnRvIGRhdGEuIEhhcyBzYW1lIHJhbmsgYXNcbiAqICAgICBzZWdtZW50SWRzLlxuICogQHBhcmFtIHNlZ21lbnRJZHM6IEEgMS1EIFRlbnNvciB3aXRoIGluZGljZXMgaW50byB0aGUgb3V0cHV0IFRlbnNvci4gVmFsdWVzXG4gKiAgICAgc2hvdWxkIGJlIHNvcnRlZCBhbmQgY2FuIGJlIHJlcGVhdGVkLlxuICogQHJldHVybiBIYXMgc2FtZSBzaGFwZSBhcyBkYXRhLCBleGNlcHQgZm9yIGRpbWVuc2lvbiAwIHdoaWNoIGhhcyBlcXVhbCB0b1xuICogICAgICAgICB0aGUgbnVtYmVyIG9mIHNlZ21lbnRzLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1NwYXJzZSd9XG4gKi9cbmZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRTdW1fKFxuICAgIGRhdGE6IFRlbnNvcnxUZW5zb3JMaWtlLCBpbmRpY2VzOiBUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHNlZ21lbnRJZHM6IFRlbnNvcjFEfFRlbnNvckxpa2UpOiBUZW5zb3Ige1xuICBjb25zdCAkZGF0YSA9IGNvbnZlcnRUb1RlbnNvcihkYXRhLCAnZGF0YScsICdzcGFyc2VTZWdtZW50U3VtJyk7XG4gIGNvbnN0ICRpbmRpY2VzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihpbmRpY2VzLCAnaW5kaWNlcycsICdzcGFyc2VTZWdtZW50U3VtJywgJ2ludDMyJyk7XG4gIGNvbnN0ICRzZWdtZW50SWRzID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihzZWdtZW50SWRzLCAnc2VnbWVudElkcycsICdzcGFyc2VTZWdtZW50U3VtJywgJ2ludDMyJyk7XG5cbiAgaWYgKCRkYXRhLnJhbmsgPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gIH1cbiAgaWYgKCRpbmRpY2VzLnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHskaW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoJHNlZ21lbnRJZHMucmFuayAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIFRlbnNvcjFEIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHskc2VnbWVudElkcy5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0IGlucHV0czogU3BhcnNlU2VnbWVudFN1bUlucHV0cyA9IHtcbiAgICBkYXRhOiAkZGF0YSxcbiAgICBpbmRpY2VzOiAkaW5kaWNlcyxcbiAgICBzZWdtZW50SWRzOiAkc2VnbWVudElkc1xuICB9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFNwYXJzZVNlZ21lbnRTdW0sIGlucHV0cyBhcyB7fSk7XG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VTZWdtZW50U3VtID0gb3Aoe3NwYXJzZVNlZ21lbnRTdW1ffSk7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { StringNGrams } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Creates ngrams from ragged string data.\n *\n * This op accepts a ragged tensor with 1 ragged dimension containing only\n * strings and outputs a ragged tensor with 1 ragged dimension containing ngrams\n * of that string, joined along the innermost axis.\n *\n * ```js\n * const result = tf.string.stringNGrams(\n *   ['a', 'b', 'c', 'd'], tf.tensor1d([0, 2, 4], 'int32'),\n *   '|', [1, 2], 'LP', 'RP', -1, false);\n * result['nGrams'].print(); // ['a', 'b', 'LP|a', 'a|b', 'b|RP',\n *                           //  'c', 'd', 'LP|c', 'c|d', 'd|RP']\n * result['nGramsSplits'].print(); // [0, 5, 10]\n * ```\n * @param data: The values tensor of the ragged string tensor to make ngrams out\n *     of. Must be a 1D string tensor.\n * @param dataSplits: The splits tensor of the ragged string tensor to make\n *     ngrams out of.\n * @param separator: The string to append between elements of the token. Use \"\"\n *     for no separator.\n * @param nGramWidths: The sizes of the ngrams to create.\n * @param leftPad: The string to use to pad the left side of the ngram sequence.\n *     Only used if pad_width !== 0.\n * @param rightPad: The string to use to pad the right side of the ngram\n *     sequence. Only used if pad_width !== 0.\n * @param padWidth: The number of padding elements to add to each side of each\n *     sequence. Note that padding will never be greater than `nGramWidths`-1\n *     regardless of this value. If `padWidth`=-1, then add max(`nGramWidths`)-1\n *     elements.\n * @param preserveShortSequences: If true, then ensure that at least one ngram\n *     is generated for each input sequence. In particular, if an input sequence\n *     is shorter than min(ngramWidth) + 2*padWidth, then generate a single\n *     ngram containing the entire sequence. If false, then no ngrams are\n *     generated for these short input sequences.\n * @return A map with the following properties:\n *     - nGrams: The values tensor of the output ngrams ragged tensor.\n *     - nGramsSplits: The splits tensor of the output ngrams ragged tensor.\n *\n * @doc {heading: 'Operations', subheading: 'String'}\n */\nfunction stringNGrams_(data, dataSplits, separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences) {\n    const $data = convertToTensor(data, 'data', 'stringNGrams', 'string');\n    if ($data.dtype !== 'string') {\n        throw new Error('Data must be of datatype string');\n    }\n    if ($data.shape.length !== 1) {\n        throw new Error(`Data must be a vector, saw: ${$data.shape}`);\n    }\n    const $dataSplits = convertToTensor(dataSplits, 'dataSplits', 'stringNGrams');\n    if ($dataSplits.dtype !== 'int32') {\n        throw new Error('Data splits must be of datatype int32');\n    }\n    const attrs = {\n        separator,\n        nGramWidths,\n        leftPad,\n        rightPad,\n        padWidth,\n        preserveShortSequences\n    };\n    const inputs = { data: $data, dataSplits: $dataSplits };\n    const result = ENGINE.runKernel(StringNGrams, inputs, attrs);\n    return { nGrams: result[0], nGramsSplits: result[1] };\n}\nexport const stringNGrams = op({ stringNGrams_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX25fZ3JhbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zdHJpbmcvc3RyaW5nX25fZ3JhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsWUFBWSxFQUF3QyxNQUFNLG9CQUFvQixDQUFDO0FBR3ZGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRWhDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0NHO0FBQ0gsU0FBUyxhQUFhLENBQ2xCLElBQXlCLEVBQUUsVUFBNkIsRUFBRSxTQUFpQixFQUMzRSxXQUFxQixFQUFFLE9BQWUsRUFBRSxRQUFnQixFQUFFLFFBQWdCLEVBQzFFLHNCQUErQjtJQUNqQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxjQUFjLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdEUsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGlDQUFpQyxDQUFDLENBQUM7S0FDcEQ7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUMvRDtJQUVELE1BQU0sV0FBVyxHQUFHLGVBQWUsQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBQzlFLElBQUksV0FBVyxDQUFDLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsTUFBTSxLQUFLLEdBQXNCO1FBQy9CLFNBQVM7UUFDVCxXQUFXO1FBQ1gsT0FBTztRQUNQLFFBQVE7UUFDUixRQUFRO1FBQ1Isc0JBQXNCO0tBQ3ZCLENBQUM7SUFFRixNQUFNLE1BQU0sR0FBdUIsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUMxRSxNQUFNLE1BQU0sR0FDUixNQUFNLENBQUMsU0FBUyxDQUFDLFlBQVksRUFBRSxNQUFZLEVBQUUsS0FBVyxDQUFDLENBQUM7SUFDOUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsRUFBRSxDQUFDLEVBQUMsYUFBYSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1N0cmluZ05HcmFtcywgU3RyaW5nTkdyYW1zQXR0cnMsIFN0cmluZ05HcmFtc0lucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uLy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDcmVhdGVzIG5ncmFtcyBmcm9tIHJhZ2dlZCBzdHJpbmcgZGF0YS5cbiAqXG4gKiBUaGlzIG9wIGFjY2VwdHMgYSByYWdnZWQgdGVuc29yIHdpdGggMSByYWdnZWQgZGltZW5zaW9uIGNvbnRhaW5pbmcgb25seVxuICogc3RyaW5ncyBhbmQgb3V0cHV0cyBhIHJhZ2dlZCB0ZW5zb3Igd2l0aCAxIHJhZ2dlZCBkaW1lbnNpb24gY29udGFpbmluZyBuZ3JhbXNcbiAqIG9mIHRoYXQgc3RyaW5nLCBqb2luZWQgYWxvbmcgdGhlIGlubmVybW9zdCBheGlzLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCByZXN1bHQgPSB0Zi5zdHJpbmcuc3RyaW5nTkdyYW1zKFxuICogICBbJ2EnLCAnYicsICdjJywgJ2QnXSwgdGYudGVuc29yMWQoWzAsIDIsIDRdLCAnaW50MzInKSxcbiAqICAgJ3wnLCBbMSwgMl0sICdMUCcsICdSUCcsIC0xLCBmYWxzZSk7XG4gKiByZXN1bHRbJ25HcmFtcyddLnByaW50KCk7IC8vIFsnYScsICdiJywgJ0xQfGEnLCAnYXxiJywgJ2J8UlAnLFxuICogICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgJ2MnLCAnZCcsICdMUHxjJywgJ2N8ZCcsICdkfFJQJ11cbiAqIHJlc3VsdFsnbkdyYW1zU3BsaXRzJ10ucHJpbnQoKTsgLy8gWzAsIDUsIDEwXVxuICogYGBgXG4gKiBAcGFyYW0gZGF0YTogVGhlIHZhbHVlcyB0ZW5zb3Igb2YgdGhlIHJhZ2dlZCBzdHJpbmcgdGVuc29yIHRvIG1ha2UgbmdyYW1zIG91dFxuICogICAgIG9mLiBNdXN0IGJlIGEgMUQgc3RyaW5nIHRlbnNvci5cbiAqIEBwYXJhbSBkYXRhU3BsaXRzOiBUaGUgc3BsaXRzIHRlbnNvciBvZiB0aGUgcmFnZ2VkIHN0cmluZyB0ZW5zb3IgdG8gbWFrZVxuICogICAgIG5ncmFtcyBvdXQgb2YuXG4gKiBAcGFyYW0gc2VwYXJhdG9yOiBUaGUgc3RyaW5nIHRvIGFwcGVuZCBiZXR3ZWVuIGVsZW1lbnRzIG9mIHRoZSB0b2tlbi4gVXNlIFwiXCJcbiAqICAgICBmb3Igbm8gc2VwYXJhdG9yLlxuICogQHBhcmFtIG5HcmFtV2lkdGhzOiBUaGUgc2l6ZXMgb2YgdGhlIG5ncmFtcyB0byBjcmVhdGUuXG4gKiBAcGFyYW0gbGVmdFBhZDogVGhlIHN0cmluZyB0byB1c2UgdG8gcGFkIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIG5ncmFtIHNlcXVlbmNlLlxuICogICAgIE9ubHkgdXNlZCBpZiBwYWRfd2lkdGggIT09IDAuXG4gKiBAcGFyYW0gcmlnaHRQYWQ6IFRoZSBzdHJpbmcgdG8gdXNlIHRvIHBhZCB0aGUgcmlnaHQgc2lkZSBvZiB0aGUgbmdyYW1cbiAqICAgICBzZXF1ZW5jZS4gT25seSB1c2VkIGlmIHBhZF93aWR0aCAhPT0gMC5cbiAqIEBwYXJhbSBwYWRXaWR0aDogVGhlIG51bWJlciBvZiBwYWRkaW5nIGVsZW1lbnRzIHRvIGFkZCB0byBlYWNoIHNpZGUgb2YgZWFjaFxuICogICAgIHNlcXVlbmNlLiBOb3RlIHRoYXQgcGFkZGluZyB3aWxsIG5ldmVyIGJlIGdyZWF0ZXIgdGhhbiBgbkdyYW1XaWR0aHNgLTFcbiAqICAgICByZWdhcmRsZXNzIG9mIHRoaXMgdmFsdWUuIElmIGBwYWRXaWR0aGA9LTEsIHRoZW4gYWRkIG1heChgbkdyYW1XaWR0aHNgKS0xXG4gKiAgICAgZWxlbWVudHMuXG4gKiBAcGFyYW0gcHJlc2VydmVTaG9ydFNlcXVlbmNlczogSWYgdHJ1ZSwgdGhlbiBlbnN1cmUgdGhhdCBhdCBsZWFzdCBvbmUgbmdyYW1cbiAqICAgICBpcyBnZW5lcmF0ZWQgZm9yIGVhY2ggaW5wdXQgc2VxdWVuY2UuIEluIHBhcnRpY3VsYXIsIGlmIGFuIGlucHV0IHNlcXVlbmNlXG4gKiAgICAgaXMgc2hvcnRlciB0aGFuIG1pbihuZ3JhbVdpZHRoKSArIDIqcGFkV2lkdGgsIHRoZW4gZ2VuZXJhdGUgYSBzaW5nbGVcbiAqICAgICBuZ3JhbSBjb250YWluaW5nIHRoZSBlbnRpcmUgc2VxdWVuY2UuIElmIGZhbHNlLCB0aGVuIG5vIG5ncmFtcyBhcmVcbiAqICAgICBnZW5lcmF0ZWQgZm9yIHRoZXNlIHNob3J0IGlucHV0IHNlcXVlbmNlcy5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBuR3JhbXM6IFRoZSB2YWx1ZXMgdGVuc29yIG9mIHRoZSBvdXRwdXQgbmdyYW1zIHJhZ2dlZCB0ZW5zb3IuXG4gKiAgICAgLSBuR3JhbXNTcGxpdHM6IFRoZSBzcGxpdHMgdGVuc29yIG9mIHRoZSBvdXRwdXQgbmdyYW1zIHJhZ2dlZCB0ZW5zb3IuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ09wZXJhdGlvbnMnLCBzdWJoZWFkaW5nOiAnU3RyaW5nJ31cbiAqL1xuZnVuY3Rpb24gc3RyaW5nTkdyYW1zXyhcbiAgICBkYXRhOiBUZW5zb3IxRHxUZW5zb3JMaWtlLCBkYXRhU3BsaXRzOiBUZW5zb3J8VGVuc29yTGlrZSwgc2VwYXJhdG9yOiBzdHJpbmcsXG4gICAgbkdyYW1XaWR0aHM6IG51bWJlcltdLCBsZWZ0UGFkOiBzdHJpbmcsIHJpZ2h0UGFkOiBzdHJpbmcsIHBhZFdpZHRoOiBudW1iZXIsXG4gICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlczogYm9vbGVhbik6IE5hbWVkVGVuc29yTWFwIHtcbiAgY29uc3QgJGRhdGEgPSBjb252ZXJ0VG9UZW5zb3IoZGF0YSwgJ2RhdGEnLCAnc3RyaW5nTkdyYW1zJywgJ3N0cmluZycpO1xuICBpZiAoJGRhdGEuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIG11c3QgYmUgb2YgZGF0YXR5cGUgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKCRkYXRhLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRGF0YSBtdXN0IGJlIGEgdmVjdG9yLCBzYXc6ICR7JGRhdGEuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCAkZGF0YVNwbGl0cyA9IGNvbnZlcnRUb1RlbnNvcihkYXRhU3BsaXRzLCAnZGF0YVNwbGl0cycsICdzdHJpbmdOR3JhbXMnKTtcbiAgaWYgKCRkYXRhU3BsaXRzLmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdEYXRhIHNwbGl0cyBtdXN0IGJlIG9mIGRhdGF0eXBlIGludDMyJyk7XG4gIH1cblxuICBjb25zdCBhdHRyczogU3RyaW5nTkdyYW1zQXR0cnMgPSB7XG4gICAgc2VwYXJhdG9yLFxuICAgIG5HcmFtV2lkdGhzLFxuICAgIGxlZnRQYWQsXG4gICAgcmlnaHRQYWQsXG4gICAgcGFkV2lkdGgsXG4gICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlc1xuICB9O1xuXG4gIGNvbnN0IGlucHV0czogU3RyaW5nTkdyYW1zSW5wdXRzID0ge2RhdGE6ICRkYXRhLCBkYXRhU3BsaXRzOiAkZGF0YVNwbGl0c307XG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPVxuICAgICAgRU5HSU5FLnJ1bktlcm5lbChTdHJpbmdOR3JhbXMsIGlucHV0cyBhcyB7fSwgYXR0cnMgYXMge30pO1xuICByZXR1cm4ge25HcmFtczogcmVzdWx0WzBdLCBuR3JhbXNTcGxpdHM6IHJlc3VsdFsxXX07XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdOR3JhbXMgPSBvcCh7c3RyaW5nTkdyYW1zX30pO1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { StringSplit } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Split elements of `input` based on `delimiter` into a SparseTensor .\n *\n * Let N be the size of source (typically N will be the batch size). Split each\n * element of `input` based on `delimiter` and return a SparseTensor containing\n * the splitted tokens. Empty tokens are ignored if `skipEmpty` is set to True.\n *\n * `delimiter` can be empty, or a string of split characters. If `delimiter` is\n * an empty string, each element of `input` is split into individual\n * character strings. Otherwise every character of `delimiter` is a potential\n * split point.\n *\n * ```js\n * const result = tf.string.stringSplit(['hello world',  'a b c'], ' ');\n * result['indices'].print(); // [[0, 0], [0, 1], [1, 0], [1, 1], [1, 2]]\n * result['values'].print(); // ['hello', 'world', 'a', 'b', 'c']\n * result['shape'].print(); // [2, 3]\n * ```\n * @param input: 1-D. Strings to split.\n * @param delimiter: 0-D. Delimiter characters, or empty string.\n * @param skipEmpty: Optional. If true, skip the empty strings from the result.\n *     Defaults to true.\n * @return A map with the following properties:\n *     - indices: A dense matrix of int32 representing the indices of the sparse\n *       tensor.\n *     - values: A vector of strings corresponding to the splited values.\n *     - shape: a length-2 vector of int32 representing the shape of the sparse\n * tensor, where the first value is N and the second value is the maximum number\n * of tokens in a single input entry.\n *\n * @doc {heading: 'Operations', subheading: 'String'}\n */\nfunction stringSplit_(input, delimiter, skipEmpty = true) {\n    const $input = convertToTensor(input, 'input', 'stringSplit', 'string');\n    const $delimiter = convertToTensor(delimiter, 'delimiter', 'stringSplit', 'string');\n    if ($input.rank !== 1) {\n        throw new Error(`Input should be Tensor1D but received shape ${$input.shape}`);\n    }\n    if ($delimiter.rank !== 0) {\n        throw new Error(`Delimiter should be a scalar but received shape ${$delimiter.shape}`);\n    }\n    const attrs = { skipEmpty };\n    const inputs = { input: $input, delimiter: $delimiter };\n    const result = ENGINE.runKernel(StringSplit, inputs, attrs);\n    return { indices: result[0], values: result[1], shape: result[2] };\n}\nexport const stringSplit = op({ stringSplit_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX3NwbGl0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3RyaW5nL3N0cmluZ19zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxXQUFXLEVBQXNDLE1BQU0sb0JBQW9CLENBQUM7QUFHcEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErQkc7QUFDSCxTQUFTLFlBQVksQ0FDakIsS0FBMEIsRUFBRSxTQUE0QixFQUN4RCxTQUFTLEdBQUcsSUFBSTtJQUNsQixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEUsTUFBTSxVQUFVLEdBQ1osZUFBZSxDQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUUsYUFBYSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRXJFLElBQUksTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDckIsTUFBTSxJQUFJLEtBQUssQ0FDWCwrQ0FBK0MsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDcEU7SUFDRCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQ1gsbURBQW1ELFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzVFO0lBRUQsTUFBTSxLQUFLLEdBQXFCLEVBQUMsU0FBUyxFQUFDLENBQUM7SUFDNUMsTUFBTSxNQUFNLEdBQXNCLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFDLENBQUM7SUFDekUsTUFBTSxNQUFNLEdBQ1IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxXQUFXLEVBQUUsTUFBWSxFQUFFLEtBQVcsQ0FBQyxDQUFDO0lBQzdELE9BQU8sRUFBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1N0cmluZ1NwbGl0LCBTdHJpbmdTcGxpdEF0dHJzLCBTdHJpbmdTcGxpdElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vLi4vdGVuc29yX3R5cGVzJztcbmltcG9ydCB7Y29udmVydFRvVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3JfdXRpbF9lbnYnO1xuaW1wb3J0IHtTY2FsYXJMaWtlLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge29wfSBmcm9tICcuLi9vcGVyYXRpb24nO1xuXG4vKipcbiAqIFNwbGl0IGVsZW1lbnRzIG9mIGBpbnB1dGAgYmFzZWQgb24gYGRlbGltaXRlcmAgaW50byBhIFNwYXJzZVRlbnNvciAuXG4gKlxuICogTGV0IE4gYmUgdGhlIHNpemUgb2Ygc291cmNlICh0eXBpY2FsbHkgTiB3aWxsIGJlIHRoZSBiYXRjaCBzaXplKS4gU3BsaXQgZWFjaFxuICogZWxlbWVudCBvZiBgaW5wdXRgIGJhc2VkIG9uIGBkZWxpbWl0ZXJgIGFuZCByZXR1cm4gYSBTcGFyc2VUZW5zb3IgY29udGFpbmluZ1xuICogdGhlIHNwbGl0dGVkIHRva2Vucy4gRW1wdHkgdG9rZW5zIGFyZSBpZ25vcmVkIGlmIGBza2lwRW1wdHlgIGlzIHNldCB0byBUcnVlLlxuICpcbiAqIGBkZWxpbWl0ZXJgIGNhbiBiZSBlbXB0eSwgb3IgYSBzdHJpbmcgb2Ygc3BsaXQgY2hhcmFjdGVycy4gSWYgYGRlbGltaXRlcmAgaXNcbiAqIGFuIGVtcHR5IHN0cmluZywgZWFjaCBlbGVtZW50IG9mIGBpbnB1dGAgaXMgc3BsaXQgaW50byBpbmRpdmlkdWFsXG4gKiBjaGFyYWN0ZXIgc3RyaW5ncy4gT3RoZXJ3aXNlIGV2ZXJ5IGNoYXJhY3RlciBvZiBgZGVsaW1pdGVyYCBpcyBhIHBvdGVudGlhbFxuICogc3BsaXQgcG9pbnQuXG4gKlxuICogYGBganNcbiAqIGNvbnN0IHJlc3VsdCA9IHRmLnN0cmluZy5zdHJpbmdTcGxpdChbJ2hlbGxvIHdvcmxkJywgICdhIGIgYyddLCAnICcpO1xuICogcmVzdWx0WydpbmRpY2VzJ10ucHJpbnQoKTsgLy8gW1swLCAwXSwgWzAsIDFdLCBbMSwgMF0sIFsxLCAxXSwgWzEsIDJdXVxuICogcmVzdWx0Wyd2YWx1ZXMnXS5wcmludCgpOyAvLyBbJ2hlbGxvJywgJ3dvcmxkJywgJ2EnLCAnYicsICdjJ11cbiAqIHJlc3VsdFsnc2hhcGUnXS5wcmludCgpOyAvLyBbMiwgM11cbiAqIGBgYFxuICogQHBhcmFtIGlucHV0OiAxLUQuIFN0cmluZ3MgdG8gc3BsaXQuXG4gKiBAcGFyYW0gZGVsaW1pdGVyOiAwLUQuIERlbGltaXRlciBjaGFyYWN0ZXJzLCBvciBlbXB0eSBzdHJpbmcuXG4gKiBAcGFyYW0gc2tpcEVtcHR5OiBPcHRpb25hbC4gSWYgdHJ1ZSwgc2tpcCB0aGUgZW1wdHkgc3RyaW5ncyBmcm9tIHRoZSByZXN1bHQuXG4gKiAgICAgRGVmYXVsdHMgdG8gdHJ1ZS5cbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6XG4gKiAgICAgLSBpbmRpY2VzOiBBIGRlbnNlIG1hdHJpeCBvZiBpbnQzMiByZXByZXNlbnRpbmcgdGhlIGluZGljZXMgb2YgdGhlIHNwYXJzZVxuICogICAgICAgdGVuc29yLlxuICogICAgIC0gdmFsdWVzOiBBIHZlY3RvciBvZiBzdHJpbmdzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwbGl0ZWQgdmFsdWVzLlxuICogICAgIC0gc2hhcGU6IGEgbGVuZ3RoLTIgdmVjdG9yIG9mIGludDMyIHJlcHJlc2VudGluZyB0aGUgc2hhcGUgb2YgdGhlIHNwYXJzZVxuICogdGVuc29yLCB3aGVyZSB0aGUgZmlyc3QgdmFsdWUgaXMgTiBhbmQgdGhlIHNlY29uZCB2YWx1ZSBpcyB0aGUgbWF4aW11bSBudW1iZXJcbiAqIG9mIHRva2VucyBpbiBhIHNpbmdsZSBpbnB1dCBlbnRyeS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnT3BlcmF0aW9ucycsIHN1YmhlYWRpbmc6ICdTdHJpbmcnfVxuICovXG5mdW5jdGlvbiBzdHJpbmdTcGxpdF8oXG4gICAgaW5wdXQ6IFRlbnNvcjFEfFRlbnNvckxpa2UsIGRlbGltaXRlcjogU2NhbGFyfFNjYWxhckxpa2UsXG4gICAgc2tpcEVtcHR5ID0gdHJ1ZSk6IE5hbWVkVGVuc29yTWFwIHtcbiAgY29uc3QgJGlucHV0ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAnaW5wdXQnLCAnc3RyaW5nU3BsaXQnLCAnc3RyaW5nJyk7XG4gIGNvbnN0ICRkZWxpbWl0ZXIgPVxuICAgICAgY29udmVydFRvVGVuc29yKGRlbGltaXRlciwgJ2RlbGltaXRlcicsICdzdHJpbmdTcGxpdCcsICdzdHJpbmcnKTtcblxuICBpZiAoJGlucHV0LnJhbmsgIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnB1dCBzaG91bGQgYmUgVGVuc29yMUQgYnV0IHJlY2VpdmVkIHNoYXBlICR7JGlucHV0LnNoYXBlfWApO1xuICB9XG4gIGlmICgkZGVsaW1pdGVyLnJhbmsgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWxpbWl0ZXIgc2hvdWxkIGJlIGEgc2NhbGFyIGJ1dCByZWNlaXZlZCBzaGFwZSAkeyRkZWxpbWl0ZXIuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCBhdHRyczogU3RyaW5nU3BsaXRBdHRycyA9IHtza2lwRW1wdHl9O1xuICBjb25zdCBpbnB1dHM6IFN0cmluZ1NwbGl0SW5wdXRzID0ge2lucHV0OiAkaW5wdXQsIGRlbGltaXRlcjogJGRlbGltaXRlcn07XG4gIGNvbnN0IHJlc3VsdDogVGVuc29yW10gPVxuICAgICAgRU5HSU5FLnJ1bktlcm5lbChTdHJpbmdTcGxpdCwgaW5wdXRzIGFzIHt9LCBhdHRycyBhcyB7fSk7XG4gIHJldHVybiB7aW5kaWNlczogcmVzdWx0WzBdLCB2YWx1ZXM6IHJlc3VsdFsxXSwgc2hhcGU6IHJlc3VsdFsyXX07XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdCA9IG9wKHtzdHJpbmdTcGxpdF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../../engine';\nimport { StringToHashBucketFast } from '../../kernel_names';\nimport { convertToTensor } from '../../tensor_util_env';\nimport { op } from '../operation';\n/**\n * Converts each string in the input Tensor to its hash mod by a number of\n * buckets.\n *\n * The hash function is deterministic on the content of the string within the\n * process and will never change. However, it is not suitable for cryptography.\n * This function may be used when CPU time is scarce and inputs are trusted or\n * unimportant. There is a risk of adversaries constructing inputs that all hash\n * to the same bucket.\n *\n * ```js\n * const result = tf.string.stringToHashBucketFast(\n *   ['Hello', 'TensorFlow', '2.x'], 3);\n * result.print(); // [0, 2, 2]\n * ```\n * @param input: The strings to assign a hash bucket.\n * @param numBuckets: The number of buckets.\n * @return A Tensor of the same shape as the input tensor.\n *\n * @doc {heading: 'Operations', subheading: 'String'}\n */\nfunction stringToHashBucketFast_(input, numBuckets) {\n    const $input = convertToTensor(input, 'input', 'stringToHashBucketFast', 'string');\n    const attrs = { numBuckets };\n    if (numBuckets <= 0) {\n        throw new Error(`Number of buckets must be at least 1`);\n    }\n    const inputs = { input: $input };\n    return ENGINE.runKernel(StringToHashBucketFast, inputs, attrs);\n}\nexport const stringToHashBucketFast = op({ stringToHashBucketFast_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zdHJpbmcvc3RyaW5nX3RvX2hhc2hfYnVja2V0X2Zhc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNwQyxPQUFPLEVBQUMsc0JBQXNCLEVBQTRELE1BQU0sb0JBQW9CLENBQUM7QUFFckgsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRELE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FDNUIsS0FBd0IsRUFBRSxVQUFrQjtJQUM5QyxNQUFNLE1BQU0sR0FDUixlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSx3QkFBd0IsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN4RSxNQUFNLEtBQUssR0FBZ0MsRUFBQyxVQUFVLEVBQUMsQ0FBQztJQUV4RCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsTUFBTSxNQUFNLEdBQWlDLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDO0lBQzdELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FBQyxzQkFBc0IsRUFBRSxNQUFZLEVBQUUsS0FBVyxDQUFDLENBQUM7QUFDN0UsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEVBQUUsQ0FBQyxFQUFDLHVCQUF1QixFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uLy4uL2VuZ2luZSc7XG5pbXBvcnQge1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsIFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RBdHRycywgU3RyaW5nVG9IYXNoQnVja2V0RmFzdElucHV0c30gZnJvbSAnLi4vLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcbmltcG9ydCB7b3B9IGZyb20gJy4uL29wZXJhdGlvbic7XG5cbi8qKlxuICogQ29udmVydHMgZWFjaCBzdHJpbmcgaW4gdGhlIGlucHV0IFRlbnNvciB0byBpdHMgaGFzaCBtb2QgYnkgYSBudW1iZXIgb2ZcbiAqIGJ1Y2tldHMuXG4gKlxuICogVGhlIGhhc2ggZnVuY3Rpb24gaXMgZGV0ZXJtaW5pc3RpYyBvbiB0aGUgY29udGVudCBvZiB0aGUgc3RyaW5nIHdpdGhpbiB0aGVcbiAqIHByb2Nlc3MgYW5kIHdpbGwgbmV2ZXIgY2hhbmdlLiBIb3dldmVyLCBpdCBpcyBub3Qgc3VpdGFibGUgZm9yIGNyeXB0b2dyYXBoeS5cbiAqIFRoaXMgZnVuY3Rpb24gbWF5IGJlIHVzZWQgd2hlbiBDUFUgdGltZSBpcyBzY2FyY2UgYW5kIGlucHV0cyBhcmUgdHJ1c3RlZCBvclxuICogdW5pbXBvcnRhbnQuIFRoZXJlIGlzIGEgcmlzayBvZiBhZHZlcnNhcmllcyBjb25zdHJ1Y3RpbmcgaW5wdXRzIHRoYXQgYWxsIGhhc2hcbiAqIHRvIHRoZSBzYW1lIGJ1Y2tldC5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgcmVzdWx0ID0gdGYuc3RyaW5nLnN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QoXG4gKiAgIFsnSGVsbG8nLCAnVGVuc29yRmxvdycsICcyLngnXSwgMyk7XG4gKiByZXN1bHQucHJpbnQoKTsgLy8gWzAsIDIsIDJdXG4gKiBgYGBcbiAqIEBwYXJhbSBpbnB1dDogVGhlIHN0cmluZ3MgdG8gYXNzaWduIGEgaGFzaCBidWNrZXQuXG4gKiBAcGFyYW0gbnVtQnVja2V0czogVGhlIG51bWJlciBvZiBidWNrZXRzLlxuICogQHJldHVybiBBIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgaW5wdXQgdGVuc29yLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdPcGVyYXRpb25zJywgc3ViaGVhZGluZzogJ1N0cmluZyd9XG4gKi9cbmZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfKFxuICAgIGlucHV0OiBUZW5zb3J8VGVuc29yTGlrZSwgbnVtQnVja2V0czogbnVtYmVyKTogVGVuc29yIHtcbiAgY29uc3QgJGlucHV0ID1cbiAgICAgIGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnLCAnc3RyaW5nJyk7XG4gIGNvbnN0IGF0dHJzOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0QXR0cnMgPSB7bnVtQnVja2V0c307XG5cbiAgaWYgKG51bUJ1Y2tldHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gIH1cblxuICBjb25zdCBpbnB1dHM6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMgPSB7aW5wdXQ6ICRpbnB1dH07XG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QsIGlucHV0cyBhcyB7fSwgYXR0cnMgYXMge30pO1xufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9IYXNoQnVja2V0RmFzdCA9IG9wKHtzdHJpbmdUb0hhc2hCdWNrZXRGYXN0X30pO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Modularized ops.\nexport { abs } from './abs';\nexport { acos } from './acos';\nexport { acosh } from './acosh';\nexport { add } from './add';\nexport { addN } from './add_n';\nexport { all } from './all';\nexport { any } from './any';\nexport { argMax } from './arg_max';\nexport { argMin } from './arg_min';\nexport { asin } from './asin';\nexport { asinh } from './asinh';\nexport { atan } from './atan';\nexport { atan2 } from './atan2';\nexport { atanh } from './atanh';\nexport { avgPool } from './avg_pool';\nexport { avgPool3d } from './avg_pool_3d';\nexport { basicLSTMCell } from './basic_lstm_cell';\nexport { batchToSpaceND } from './batch_to_space_nd';\nexport { batchNorm } from './batchnorm';\nexport { batchNorm2d } from './batchnorm2d';\nexport { batchNorm3d } from './batchnorm3d';\nexport { batchNorm4d } from './batchnorm4d';\nexport { bincount } from './bincount';\nexport { broadcastArgs } from './broadcast_args';\nexport { broadcastTo } from './broadcast_to';\nexport { buffer } from './buffer';\nexport { cast } from './cast';\nexport { ceil } from './ceil';\nexport { clipByValue } from './clip_by_value';\nexport { clone } from './clone';\nexport { complex } from './complex';\nexport { concat } from './concat';\nexport { concat1d } from './concat_1d';\nexport { concat2d } from './concat_2d';\nexport { concat3d } from './concat_3d';\nexport { concat4d } from './concat_4d';\nexport { conv1d } from './conv1d';\nexport { conv2d } from './conv2d';\nexport { conv2dTranspose } from './conv2d_transpose';\nexport { conv3d } from './conv3d';\nexport { conv3dTranspose } from './conv3d_transpose';\nexport { cos } from './cos';\nexport { cosh } from './cosh';\nexport { cumprod } from './cumprod';\nexport { cumsum } from './cumsum';\nexport { denseBincount } from './dense_bincount';\nexport { depthToSpace } from './depth_to_space';\nexport { depthwiseConv2d } from './depthwise_conv2d';\nexport { diag } from './diag';\nexport { dilation2d } from './dilation2d';\nexport { div } from './div';\nexport { divNoNan } from './div_no_nan';\nexport { dot } from './dot';\nexport { einsum } from './einsum';\nexport { elu } from './elu';\nexport { equal } from './equal';\nexport { erf } from './erf';\nexport { euclideanNorm } from './euclidean_norm';\nexport { exp } from './exp';\nexport { expandDims } from './expand_dims';\nexport { expm1 } from './expm1';\nexport { eye } from './eye';\nexport { fill } from './fill';\nexport { floor } from './floor';\nexport { floorDiv } from './floorDiv';\nexport { gather } from './gather';\nexport { greater } from './greater';\nexport { greaterEqual } from './greater_equal';\nexport { imag } from './imag';\nexport { isFinite } from './is_finite';\nexport { isInf } from './is_inf';\nexport { isNaN } from './is_nan';\nexport { leakyRelu } from './leaky_relu';\nexport { less } from './less';\nexport { lessEqual } from './less_equal';\nexport { linspace } from './linspace';\nexport { localResponseNormalization } from './local_response_normalization';\nexport { log } from './log';\nexport { log1p } from './log1p';\nexport { logSigmoid } from './log_sigmoid';\nexport { logSoftmax } from './log_softmax';\nexport { logSumExp } from './log_sum_exp';\nexport { logicalAnd } from './logical_and';\nexport { logicalNot } from './logical_not';\nexport { logicalOr } from './logical_or';\nexport { logicalXor } from './logical_xor';\nexport { lowerBound } from './lower_bound';\nexport { matMul } from './mat_mul';\nexport { max } from './max';\nexport { maxPool } from './max_pool';\nexport { maxPool3d } from './max_pool_3d';\nexport { maxPoolWithArgmax } from './max_pool_with_argmax';\nexport { maximum } from './maximum';\nexport { mean } from './mean';\nexport { meshgrid } from './meshgrid';\nexport { min } from './min';\nexport { minimum } from './minimum';\nexport { mirrorPad } from './mirror_pad';\nexport { mod } from './mod';\nexport { moments } from './moments';\nexport { mul } from './mul';\nexport { multiRNNCell } from './multi_rnn_cell';\nexport { multinomial } from './multinomial';\nexport { neg } from './neg';\nexport { notEqual } from './not_equal';\nexport { oneHot } from './one_hot';\nexport { ones } from './ones';\nexport { onesLike } from './ones_like';\nexport { outerProduct } from './outer_product';\nexport { pad } from './pad';\nexport { pad1d } from './pad1d';\nexport { pad2d } from './pad2d';\nexport { pad3d } from './pad3d';\nexport { pad4d } from './pad4d';\nexport { pool } from './pool';\nexport { pow } from './pow';\nexport { prelu } from './prelu';\nexport { print } from './print';\nexport { prod } from './prod';\nexport { raggedGather } from './ragged_gather';\nexport { raggedTensorToTensor } from './ragged_tensor_to_tensor';\nexport { rand } from './rand';\nexport { randomGamma } from './random_gamma';\nexport { randomNormal } from './random_normal';\nexport { randomStandardNormal } from './random_standard_normal';\nexport { randomUniform } from './random_uniform';\nexport { range } from './range';\nexport { real } from './real';\nexport { reciprocal } from './reciprocal';\nexport { relu } from './relu';\nexport { relu6 } from './relu6';\nexport { reshape } from './reshape';\nexport { reverse } from './reverse';\nexport { reverse1d } from './reverse_1d';\nexport { reverse2d } from './reverse_2d';\nexport { reverse3d } from './reverse_3d';\nexport { reverse4d } from './reverse_4d';\nexport { round } from './round';\nexport { rsqrt } from './rsqrt';\nexport { scalar } from './scalar';\nexport { selu } from './selu';\nexport { separableConv2d } from './separable_conv2d';\nexport { setdiff1dAsync } from './setdiff1d_async';\nexport { sigmoid } from './sigmoid';\nexport { sign } from './sign';\nexport { sin } from './sin';\nexport { sinh } from './sinh';\nexport { slice } from './slice';\nexport { slice1d } from './slice1d';\nexport { slice2d } from './slice2d';\nexport { slice3d } from './slice3d';\nexport { slice4d } from './slice4d';\nexport { softmax } from './softmax';\nexport { softplus } from './softplus';\nexport { spaceToBatchND } from './space_to_batch_nd';\nexport { fft } from './spectral/fft';\nexport { ifft } from './spectral/ifft';\nexport { irfft } from './spectral/irfft';\nexport { rfft } from './spectral/rfft';\nexport { split } from './split';\nexport { sqrt } from './sqrt';\nexport { square } from './square';\nexport { squaredDifference } from './squared_difference';\nexport { squeeze } from './squeeze';\nexport { stack } from './stack';\nexport { step } from './step';\nexport { stridedSlice } from './strided_slice';\nexport { sub } from './sub';\nexport { sum } from './sum';\nexport { tan } from './tan';\nexport { tanh } from './tanh';\nexport { tensor } from './tensor';\nexport { tensor1d } from './tensor1d';\nexport { tensor2d } from './tensor2d';\nexport { tensor3d } from './tensor3d';\nexport { tensor4d } from './tensor4d';\nexport { tensor5d } from './tensor5d';\nexport { tensor6d } from './tensor6d';\nexport { tile } from './tile';\nexport { topk } from './topk';\nexport { truncatedNormal } from './truncated_normal';\nexport { unique } from './unique';\nexport { unsortedSegmentSum } from './unsorted_segment_sum';\nexport { unstack } from './unstack';\nexport { upperBound } from './upper_bound';\nexport { variable } from './variable';\nexport { where } from './where';\nexport { whereAsync } from './where_async';\nexport { zeros } from './zeros';\nexport { zerosLike } from './zeros_like';\nexport * from './boolean_mask';\nexport * from './transpose';\nexport * from './norm';\nexport * from './moving_average';\nexport * from './scatter_nd';\nexport * from './search_sorted';\nexport * from './sparse_to_dense';\nexport * from './gather_nd';\nexport * from './dropout';\nexport * from './signal_ops_util';\nexport * from './in_top_k';\nexport { op, OP_SCOPE_SUFFIX } from './operation';\nimport { rfft } from './spectral/rfft';\nimport { fft } from './spectral/fft';\nimport { ifft } from './spectral/ifft';\nimport { irfft } from './spectral/irfft';\nconst spectral = {\n    fft,\n    ifft,\n    rfft,\n    irfft\n};\nimport * as fused from './fused_ops';\nimport { hammingWindow } from './signal/hamming_window';\nimport { hannWindow } from './signal/hann_window';\nimport { frame } from './signal/frame';\nimport { stft } from './signal/stft';\nconst signal = {\n    hammingWindow,\n    hannWindow,\n    frame,\n    stft,\n};\n// Image Ops namespace\nimport { cropAndResize } from './image/crop_and_resize';\nimport { flipLeftRight } from './image/flip_left_right';\nimport { grayscaleToRGB } from './image/grayscale_to_rgb';\nimport { rotateWithOffset } from './image/rotate_with_offset';\nimport { nonMaxSuppression } from './image/non_max_suppression';\nimport { nonMaxSuppressionAsync } from './image/non_max_suppression_async';\nimport { nonMaxSuppressionWithScore } from './image/non_max_suppression_with_score';\nimport { nonMaxSuppressionWithScoreAsync } from './image/non_max_suppression_with_score_async';\nimport { nonMaxSuppressionPadded } from './image/non_max_suppression_padded';\nimport { nonMaxSuppressionPaddedAsync } from './image/non_max_suppression_padded_async';\nimport { resizeBilinear } from './image/resize_bilinear';\nimport { resizeNearestNeighbor } from './image/resize_nearest_neighbor';\nimport { threshold } from './image/threshold';\nimport { transform } from './image/transform';\nconst image = {\n    flipLeftRight,\n    grayscaleToRGB,\n    resizeNearestNeighbor,\n    resizeBilinear,\n    rotateWithOffset,\n    cropAndResize,\n    nonMaxSuppression,\n    nonMaxSuppressionAsync,\n    nonMaxSuppressionWithScore,\n    nonMaxSuppressionWithScoreAsync,\n    nonMaxSuppressionPadded,\n    nonMaxSuppressionPaddedAsync,\n    threshold,\n    transform\n};\n// linalg namespace\nimport { bandPart } from './linalg/band_part';\nimport { gramSchmidt } from './linalg/gram_schmidt';\nimport { qr } from './linalg/qr';\nconst linalg = {\n    bandPart,\n    gramSchmidt,\n    qr\n};\n// losses namespace;\nimport { absoluteDifference } from './losses/absolute_difference';\nimport { computeWeightedLoss } from './losses/compute_weighted_loss';\nimport { cosineDistance } from './losses/cosine_distance';\nimport { hingeLoss } from './losses/hinge_loss';\nimport { huberLoss } from './losses/huber_loss';\nimport { logLoss } from './losses/log_loss';\nimport { meanSquaredError } from './losses/mean_squared_error';\nimport { sigmoidCrossEntropy } from './losses/sigmoid_cross_entropy';\nimport { softmaxCrossEntropy } from './losses/softmax_cross_entropy';\nconst losses = {\n    absoluteDifference,\n    computeWeightedLoss,\n    cosineDistance,\n    hingeLoss,\n    huberLoss,\n    logLoss,\n    meanSquaredError,\n    sigmoidCrossEntropy,\n    softmaxCrossEntropy\n};\nimport { sparseFillEmptyRows } from './sparse/sparse_fill_empty_rows';\nimport { sparseReshape } from './sparse/sparse_reshape';\nimport { sparseSegmentMean } from './sparse/sparse_segment_mean';\nimport { sparseSegmentSum } from './sparse/sparse_segment_sum';\nconst sparse = {\n    sparseFillEmptyRows,\n    sparseReshape,\n    sparseSegmentMean,\n    sparseSegmentSum\n};\nimport { stringNGrams } from './string/string_n_grams';\nimport { stringSplit } from './string/string_split';\nimport { stringToHashBucketFast } from './string/string_to_hash_bucket_fast';\n// tslint:disable-next-line:variable-name\nconst string = {\n    stringNGrams,\n    stringSplit,\n    stringToHashBucketFast\n};\n// Second level exports.\nexport { image, linalg, losses, spectral, fused, signal, sparse, string };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvb3BzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILG1CQUFtQjtBQUNuQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDN0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNuQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0scUJBQXFCLENB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M0UseUNBQXlDO0FBQ3pDLE1BQU0sTUFBTSxHQUFHO0lBQ2IsWUFBWTtJQUNaLFdBQVc7SUFDWCxzQkFBc0I7Q0FDdkIsQ0FBQztBQUVGLHdCQUF3QjtBQUN4QixPQUFPLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBNb2R1bGFyaXplZCBvcHMuXG5leHBvcnQge2Fic30gZnJvbSAnLi9hYnMnO1xuZXhwb3J0IHthY29zfSBmcm9tICcuL2Fjb3MnO1xuZXhwb3J0IHthY29zaH0gZnJvbSAnLi9hY29zaCc7XG5leHBvcnQge2FkZH0gZnJvbSAnLi9hZGQnO1xuZXhwb3J0IHthZGROfSBmcm9tICcuL2FkZF9uJztcbmV4cG9ydCB7YWxsfSBmcm9tICcuL2FsbCc7XG5leHBvcnQge2FueX0gZnJvbSAnLi9hbnknO1xuZXhwb3J0IHthcmdNYXh9IGZyb20gJy4vYXJnX21heCc7XG5leHBvcnQge2FyZ01pbn0gZnJvbSAnLi9hcmdfbWluJztcbmV4cG9ydCB7YXNpbn0gZnJvbSAnLi9hc2luJztcbmV4cG9ydCB7YXNpbmh9IGZyb20gJy4vYXNpbmgnO1xuZXhwb3J0IHthdGFufSBmcm9tICcuL2F0YW4nO1xuZXhwb3J0IHthdGFuMn0gZnJvbSAnLi9hdGFuMic7XG5leHBvcnQge2F0YW5ofSBmcm9tICcuL2F0YW5oJztcbmV4cG9ydCB7YXZnUG9vbH0gZnJvbSAnLi9hdmdfcG9vbCc7XG5leHBvcnQge2F2Z1Bvb2wzZH0gZnJvbSAnLi9hdmdfcG9vbF8zZCc7XG5leHBvcnQge2Jhc2ljTFNUTUNlbGx9IGZyb20gJy4vYmFzaWNfbHN0bV9jZWxsJztcbmV4cG9ydCB7YmF0Y2hUb1NwYWNlTkR9IGZyb20gJy4vYmF0Y2hfdG9fc3BhY2VfbmQnO1xuZXhwb3J0IHtiYXRjaE5vcm19IGZyb20gJy4vYmF0Y2hub3JtJztcbmV4cG9ydCB7YmF0Y2hOb3JtMmR9IGZyb20gJy4vYmF0Y2hub3JtMmQnO1xuZXhwb3J0IHtiYXRjaE5vcm0zZH0gZnJvbSAnLi9iYXRjaG5vcm0zZCc7XG5leHBvcnQge2JhdGNoTm9ybTRkfSBmcm9tICcuL2JhdGNobm9ybTRkJztcbmV4cG9ydCB7YmluY291bnR9IGZyb20gJy4vYmluY291bnQnO1xuZXhwb3J0IHticm9hZGNhc3RBcmdzfSBmcm9tICcuL2Jyb2FkY2FzdF9hcmdzJztcbmV4cG9ydCB7YnJvYWRjYXN0VG99IGZyb20gJy4vYnJvYWRjYXN0X3RvJztcbmV4cG9ydCB7YnVmZmVyfSBmcm9tICcuL2J1ZmZlcic7XG5leHBvcnQge2Nhc3R9IGZyb20gJy4vY2FzdCc7XG5leHBvcnQge2NlaWx9IGZyb20gJy4vY2VpbCc7XG5leHBvcnQge2NsaXBCeVZhbHVlfSBmcm9tICcuL2NsaXBfYnlfdmFsdWUnO1xuZXhwb3J0IHtjbG9uZX0gZnJvbSAnLi9jbG9uZSc7XG5leHBvcnQge2NvbXBsZXh9IGZyb20gJy4vY29tcGxleCc7XG5leHBvcnQge2NvbmNhdH0gZnJvbSAnLi9jb25jYXQnO1xuZXhwb3J0IHtjb25jYXQxZH0gZnJvbSAnLi9jb25jYXRfMWQnO1xuZXhwb3J0IHtjb25jYXQyZH0gZnJvbSAnLi9jb25jYXRfMmQnO1xuZXhwb3J0IHtjb25jYXQzZH0gZnJvbSAnLi9jb25jYXRfM2QnO1xuZXhwb3J0IHtjb25jYXQ0ZH0gZnJvbSAnLi9jb25jYXRfNGQnO1xuZXhwb3J0IHtjb252MWR9IGZyb20gJy4vY29udjFkJztcbmV4cG9ydCB7Y29udjJkfSBmcm9tICcuL2NvbnYyZCc7XG5leHBvcnQge2NvbnYyZFRyYW5zcG9zZX0gZnJvbSAnLi9jb252MmRfdHJhbnNwb3NlJztcbmV4cG9ydCB7Y29udjNkfSBmcm9tICcuL2NvbnYzZCc7XG5leHBvcnQge2NvbnYzZFRyYW5zcG9zZX0gZnJvbSAnLi9jb252M2RfdHJhbnNwb3NlJztcbmV4cG9ydCB7Y29zfSBmcm9tICcuL2Nvcyc7XG5leHBvcnQge2Nvc2h9IGZyb20gJy4vY29zaCc7XG5leHBvcnQge2N1bXByb2R9IGZyb20gJy4vY3VtcHJvZCc7XG5leHBvcnQge2N1bXN1bX0gZnJvbSAnLi9jdW1zdW0nO1xuZXhwb3J0IHtkZW5zZUJpbmNvdW50fSBmcm9tICcuL2RlbnNlX2JpbmNvdW50JztcbmV4cG9ydCB7ZGVwdGhUb1NwYWNlfSBmcm9tICcuL2RlcHRoX3RvX3NwYWNlJztcbmV4cG9ydCB7ZGVwdGh3aXNlQ29udjJkfSBmcm9tICcuL2RlcHRod2lzZV9jb252MmQnO1xuZXhwb3J0IHtkaWFnfSBmcm9tICcuL2RpYWcnO1xuZXhwb3J0IHtkaWxhdGlvbjJkfSBmcm9tICcuL2RpbGF0aW9uMmQnO1xuZXhwb3J0IHtkaXZ9IGZyb20gJy4vZGl2JztcbmV4cG9ydCB7ZGl2Tm9OYW59IGZyb20gJy4vZGl2X25vX25hbic7XG5leHBvcnQge2RvdH0gZnJvbSAnLi9kb3QnO1xuZXhwb3J0IHtlaW5zdW19IGZyb20gJy4vZWluc3VtJztcbmV4cG9ydCB7ZWx1fSBmcm9tICcuL2VsdSc7XG5leHBvcnQge2VxdWFsfSBmcm9tICcuL2VxdWFsJztcbmV4cG9ydCB7ZXJmfSBmcm9tICcuL2VyZic7XG5leHBvcnQge2V1Y2xpZGVhbk5vcm19IGZyb20gJy4vZXVjbGlkZWFuX25vcm0nO1xuZXhwb3J0IHtleHB9IGZyb20gJy4vZXhwJztcbmV4cG9ydCB7ZXhwYW5kRGltc30gZnJvbSAnLi9leHBhbmRfZGltcyc7XG5leHBvcnQge2V4cG0xfSBmcm9tICcuL2V4cG0xJztcbmV4cG9ydCB7ZXllfSBmcm9tICcuL2V5ZSc7XG5leHBvcnQge2ZpbGx9IGZyb20gJy4vZmlsbCc7XG5leHBvcnQge2Zsb29yfSBmcm9tICcuL2Zsb29yJztcbmV4cG9ydCB7Zmxvb3JEaXZ9IGZyb20gJy4vZmxvb3JEaXYnO1xuZXhwb3J0IHtnYXRoZXJ9IGZyb20gJy4vZ2F0aGVyJztcbmV4cG9ydCB7Z3JlYXRlcn0gZnJvbSAnLi9ncmVhdGVyJztcbmV4cG9ydCB7Z3JlYXRlckVxdWFsfSBmcm9tICcuL2dyZWF0ZXJfZXF1YWwnO1xuZXhwb3J0IHtpbWFnfSBmcm9tICcuL2ltYWcnO1xuZXhwb3J0IHtpc0Zpbml0ZX0gZnJvbSAnLi9pc19maW5pdGUnO1xuZXhwb3J0IHtpc0luZn0gZnJvbSAnLi9pc19pbmYnO1xuZXhwb3J0IHtpc05hTn0gZnJvbSAnLi9pc19uYW4nO1xuZXhwb3J0IHtsZWFreVJlbHV9IGZyb20gJy4vbGVha3lfcmVsdSc7XG5leHBvcnQge2xlc3N9IGZyb20gJy4vbGVzcyc7XG5leHBvcnQge2xlc3NFcXVhbH0gZnJvbSAnLi9sZXNzX2VxdWFsJztcbmV4cG9ydCB7bGluc3BhY2V9IGZyb20gJy4vbGluc3BhY2UnO1xuZXhwb3J0IHtsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbn0gZnJvbSAnLi9sb2NhbF9yZXNwb25zZV9ub3JtYWxpemF0aW9uJztcbmV4cG9ydCB7bG9nfSBmcm9tICcuL2xvZyc7XG5leHBvcnQge2xvZzFwfSBmcm9tICcuL2xvZzFwJztcbmV4cG9ydCB7bG9nU2lnbW9pZH0gZnJvbSAnLi9sb2dfc2lnbW9pZCc7XG5leHBvcnQge2xvZ1NvZnRtYXh9IGZyb20gJy4vbG9nX3NvZnRtYXgnO1xuZXhwb3J0IHtsb2dTdW1FeHB9IGZyb20gJy4vbG9nX3N1bV9leHAnO1xuZXhwb3J0IHtsb2dpY2FsQW5kfSBmcm9tICcuL2xvZ2ljYWxfYW5kJztcbmV4cG9ydCB7bG9naWNhbE5vdH0gZnJvbSAnLi9sb2dpY2FsX25vdCc7XG5leHBvcnQge2xvZ2ljYWxPcn0gZnJvbSAnLi9sb2dpY2FsX29yJztcbmV4cG9ydCB7bG9naWNhbFhvcn0gZnJvbSAnLi9sb2dpY2FsX3hvcic7XG5leHBvcnQge2xvd2VyQm91bmR9IGZyb20gJy4vbG93ZXJfYm91bmQnO1xuZXhwb3J0IHttYXRNdWx9IGZyb20gJy4vbWF0X211bCc7XG5leHBvcnQge21heH0gZnJvbSAnLi9tYXgnO1xuZXhwb3J0IHttYXhQb29sfSBmcm9tICcuL21heF9wb29sJztcbmV4cG9ydCB7bWF4UG9vbDNkfSBmcm9tICcuL21heF9wb29sXzNkJztcbmV4cG9ydCB7bWF4UG9vbFdpdGhBcmdtYXh9IGZyb20gJy4vbWF4X3Bvb2xfd2l0aF9hcmdtYXgnO1xuZXhwb3J0IHttYXhpbXVtfSBmcm9tICcuL21heGltdW0nO1xuZXhwb3J0IHttZWFufSBmcm9tICcuL21lYW4nO1xuZXhwb3J0IHttZXNoZ3JpZH0gZnJvbSAnLi9tZXNoZ3JpZCc7XG5leHBvcnQge21pbn0gZnJvbSAnLi9taW4nO1xuZXhwb3J0IHttaW5pbXVtfSBmcm9tICcuL21pbmltdW0nO1xuZXhwb3J0IHttaXJyb3JQYWR9IGZyb20gJy4vbWlycm9yX3BhZCc7XG5leHBvcnQge21vZH0gZnJvbSAnLi9tb2QnO1xuZXhwb3J0IHttb21lbnRzfSBmcm9tICcuL21vbWVudHMnO1xuZXhwb3J0IHttdWx9IGZyb20gJy4vbXVsJztcbmV4cG9ydCB7TFNUTUNlbGxGdW5jLCBtdWx0aVJOTkNlbGx9IGZyb20gJy4vbXVsdGlfcm5uX2NlbGwnO1xuZXhwb3J0IHttdWx0aW5vbWlhbH0gZnJvbSAnLi9tdWx0aW5vbWlhbCc7XG5leHBvcnQge25lZ30gZnJvbSAnLi9uZWcnO1xuZXhwb3J0IHtub3RFcXVhbH0gZnJvbSAnLi9ub3RfZXF1YWwnO1xuZXhwb3J0IHtvbmVIb3R9IGZyb20gJy4vb25lX2hvdCc7XG5leHBvcnQge29uZXN9IGZyb20gJy4vb25lcyc7XG5leHBvcnQge29uZXNMaWtlfSBmcm9tICcuL29uZXNfbGlrZSc7XG5leHBvcnQge291dGVyUHJvZHVjdH0gZnJvbSAnLi9vdXRlcl9wcm9kdWN0JztcbmV4cG9ydCB7cGFkfSBmcm9tICcuL3BhZCc7XG5leHBvcnQge3BhZDFkfSBmcm9tICcuL3BhZDFkJztcbmV4cG9ydCB7cGFkMmR9IGZyb20gJy4vcGFkMmQnO1xuZXhwb3J0IHtwYWQzZH0gZnJvbSAnLi9wYWQzZCc7XG5leHBvcnQge3BhZDRkfSBmcm9tICcuL3BhZDRkJztcbmV4cG9ydCB7cG9vbH0gZnJvbSAnLi9wb29sJztcbmV4cG9ydCB7cG93fSBmcm9tICcuL3Bvdyc7XG5leHBvcnQge3ByZWx1fSBmcm9tICcuL3ByZWx1JztcbmV4cG9ydCB7cHJpbnR9IGZyb20gJy4vcHJpbnQnO1xuZXhwb3J0IHtwcm9kfSBmcm9tICcuL3Byb2QnO1xuZXhwb3J0IHtyYWdnZWRHYXRoZXJ9IGZyb20gJy4vcmFnZ2VkX2dhdGhlcic7XG5leHBvcnQge3JhZ2dlZFRlbnNvclRvVGVuc29yfSBmcm9tICcuL3JhZ2dlZF90ZW5zb3JfdG9fdGVuc29yJztcbmV4cG9ydCB7cmFuZH0gZnJvbSAnLi9yYW5kJztcbmV4cG9ydCB7cmFuZG9tR2FtbWF9IGZyb20gJy4vcmFuZG9tX2dhbW1hJztcbmV4cG9ydCB7cmFuZG9tTm9ybWFsfSBmcm9tICcuL3JhbmRvbV9ub3JtYWwnO1xuZXhwb3J0IHtyYW5kb21TdGFuZGFyZE5vcm1hbH0gZnJvbSAnLi9yYW5kb21fc3RhbmRhcmRfbm9ybWFsJztcbmV4cG9ydCB7cmFuZG9tVW5pZm9ybX0gZnJvbSAnLi9yYW5kb21fdW5pZm9ybSc7XG5leHBvcnQge3JhbmdlfSBmcm9tICcuL3JhbmdlJztcbmV4cG9ydCB7cmVhbH0gZnJvbSAnLi9yZWFsJztcbmV4cG9ydCB7cmVjaXByb2NhbH0gZnJvbSAnLi9yZWNpcHJvY2FsJztcbmV4cG9ydCB7cmVsdX0gZnJvbSAnLi9yZWx1JztcbmV4cG9ydCB7cmVsdTZ9IGZyb20gJy4vcmVsdTYnO1xuZXhwb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuZXhwb3J0IHtyZXZlcnNlfSBmcm9tICcuL3JldmVyc2UnO1xuZXhwb3J0IHtyZXZlcnNlMWR9IGZyb20gJy4vcmV2ZXJzZV8xZCc7XG5leHBvcnQge3JldmVyc2UyZH0gZnJvbSAnLi9yZXZlcnNlXzJkJztcbmV4cG9ydCB7cmV2ZXJzZTNkfSBmcm9tICcuL3JldmVyc2VfM2QnO1xuZXhwb3J0IHtyZXZlcnNlNGR9IGZyb20gJy4vcmV2ZXJzZV80ZCc7XG5leHBvcnQge3JvdW5kfSBmcm9tICcuL3JvdW5kJztcbmV4cG9ydCB7cnNxcnR9IGZyb20gJy4vcnNxcnQnO1xuZXhwb3J0IHtzY2FsYXJ9IGZyb20gJy4vc2NhbGFyJztcbmV4cG9ydCB7c2VsdX0gZnJvbSAnLi9zZWx1JztcbmV4cG9ydCB7c2VwYXJhYmxlQ29udjJkfSBmcm9tICcuL3NlcGFyYWJsZV9jb252MmQnO1xuZXhwb3J0IHtzZXRkaWZmMWRBc3luY30gZnJvbSAnLi9zZXRkaWZmMWRfYXN5bmMnO1xuZXhwb3J0IHtzaWdtb2lkfSBmcm9tICcuL3NpZ21vaWQnO1xuZXhwb3J0IHtzaWdufSBmcm9tICcuL3NpZ24nO1xuZXhwb3J0IHtzaW59IGZyb20gJy4vc2luJztcbmV4cG9ydCB7c2luaH0gZnJvbSAnLi9zaW5oJztcbmV4cG9ydCB7c2xpY2V9IGZyb20gJy4vc2xpY2UnO1xuZXhwb3J0IHtzbGljZTFkfSBmcm9tICcuL3NsaWNlMWQnO1xuZXhwb3J0IHtzbGljZTJkfSBmcm9tICcuL3NsaWNlMmQnO1xuZXhwb3J0IHtzbGljZTNkfSBmcm9tICcuL3NsaWNlM2QnO1xuZXhwb3J0IHtzbGljZTRkfSBmcm9tICcuL3NsaWNlNGQnO1xuZXhwb3J0IHtzb2Z0bWF4fSBmcm9tICcuL3NvZnRtYXgnO1xuZXhwb3J0IHtzb2Z0cGx1c30gZnJvbSAnLi9zb2Z0cGx1cyc7XG5leHBvcnQge3NwYWNlVG9CYXRjaE5EfSBmcm9tICcuL3NwYWNlX3RvX2JhdGNoX25kJztcbmV4cG9ydCB7ZmZ0fSBmcm9tICcuL3NwZWN0cmFsL2ZmdCc7XG5leHBvcnQge2lmZnR9IGZyb20gJy4vc3BlY3RyYWwvaWZmdCc7XG5leHBvcnQge2lyZmZ0fSBmcm9tICcuL3NwZWN0cmFsL2lyZmZ0JztcbmV4cG9ydCB7cmZmdH0gZnJvbSAnLi9zcGVjdHJhbC9yZmZ0JztcbmV4cG9ydCB7c3BsaXR9IGZyb20gJy4vc3BsaXQnO1xuZXhwb3J0IHtzcXJ0fSBmcm9tICcuL3NxcnQnO1xuZXhwb3J0IHtzcXVhcmV9IGZyb20gJy4vc3F1YXJlJztcbmV4cG9ydCB7c3F1YXJlZERpZmZlcmVuY2V9IGZyb20gJy4vc3F1YXJlZF9kaWZmZXJlbmNlJztcbmV4cG9ydCB7c3F1ZWV6ZX0gZnJvbSAnLi9zcXVlZXplJztcbmV4cG9ydCB7c3RhY2t9IGZyb20gJy4vc3RhY2snO1xuZXhwb3J0IHtzdGVwfSBmcm9tICcuL3N0ZXAnO1xuZXhwb3J0IHtzdHJpZGVkU2xpY2V9IGZyb20gJy4vc3RyaWRlZF9zbGljZSc7XG5leHBvcnQge3N1Yn0gZnJvbSAnLi9zdWInO1xuZXhwb3J0IHtzdW19IGZyb20gJy4vc3VtJztcbmV4cG9ydCB7dGFufSBmcm9tICcuL3Rhbic7XG5leHBvcnQge3Rhbmh9IGZyb20gJy4vdGFuaCc7XG5leHBvcnQge3RlbnNvcn0gZnJvbSAnLi90ZW5zb3InO1xuZXhwb3J0IHt0ZW5zb3IxZH0gZnJvbSAnLi90ZW5zb3IxZCc7XG5leHBvcnQge3RlbnNvcjJkfSBmcm9tICcuL3RlbnNvcjJkJztcbmV4cG9ydCB7dGVuc29yM2R9IGZyb20gJy4vdGVuc29yM2QnO1xuZXhwb3J0IHt0ZW5zb3I0ZH0gZnJvbSAnLi90ZW5zb3I0ZCc7XG5leHBvcnQge3RlbnNvcjVkfSBmcm9tICcuL3RlbnNvcjVkJztcbmV4cG9ydCB7dGVuc29yNmR9IGZyb20gJy4vdGVuc29yNmQnO1xuZXhwb3J0IHt0aWxlfSBmcm9tICcuL3RpbGUnO1xuZXhwb3J0IHt0b3BrfSBmcm9tICcuL3RvcGsnO1xuZXhwb3J0IHt0cnVuY2F0ZWROb3JtYWx9IGZyb20gJy4vdHJ1bmNhdGVkX25vcm1hbCc7XG5leHBvcnQge3VuaXF1ZX0gZnJvbSAnLi91bmlxdWUnO1xuZXhwb3J0IHt1bnNvcnRlZFNlZ21lbnRTdW19IGZyb20gJy4vdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuZXhwb3J0IHt1bnN0YWNrfSBmcm9tICcuL3Vuc3RhY2snO1xuZXhwb3J0IHt1cHBlckJvdW5kfSBmcm9tICcuL3VwcGVyX2JvdW5kJztcbmV4cG9ydCB7dmFyaWFibGV9IGZyb20gJy4vdmFyaWFibGUnO1xuZXhwb3J0IHt3aGVyZX0gZnJvbSAnLi93aGVyZSc7XG5leHBvcnQge3doZXJlQXN5bmN9IGZyb20gJy4vd2hlcmVfYXN5bmMnO1xuZXhwb3J0IHt6ZXJvc30gZnJvbSAnLi96ZXJvcyc7XG5leHBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi96ZXJvc19saWtlJztcblxuZXhwb3J0ICogZnJvbSAnLi9ib29sZWFuX21hc2snO1xuZXhwb3J0ICogZnJvbSAnLi90cmFuc3Bvc2UnO1xuZXhwb3J0ICogZnJvbSAnLi9ub3JtJztcbmV4cG9ydCAqIGZyb20gJy4vbW92aW5nX2F2ZXJhZ2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zY2F0dGVyX25kJztcbmV4cG9ydCAqIGZyb20gJy4vc2VhcmNoX3NvcnRlZCc7XG5leHBvcnQgKiBmcm9tICcuL3NwYXJzZV90b19kZW5zZSc7XG5leHBvcnQgKiBmcm9tICcuL2dhdGhlcl9uZCc7XG5leHBvcnQgKiBmcm9tICcuL2Ryb3BvdXQnO1xuZXhwb3J0ICogZnJvbSAnLi9zaWduYWxfb3BzX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi9pbl90b3Bfayc7XG5cbmV4cG9ydCB7b3AsIE9QX1NDT1BFX1NVRkZJWH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuXG5pbXBvcnQge3JmZnR9IGZyb20gJy4vc3BlY3RyYWwvcmZmdCc7XG5pbXBvcnQge2ZmdH0gZnJvbSAnLi9zcGVjdHJhbC9mZnQnO1xuaW1wb3J0IHtpZmZ0fSBmcm9tICcuL3NwZWN0cmFsL2lmZnQnO1xuaW1wb3J0IHtpcmZmdH0gZnJvbSAnLi9zcGVjdHJhbC9pcmZmdCc7XG5jb25zdCBzcGVjdHJhbCA9IHtcbiAgZmZ0LFxuICBpZmZ0LFxuICByZmZ0LFxuICBpcmZmdFxufTtcblxuaW1wb3J0ICogYXMgZnVzZWQgZnJvbSAnLi9mdXNlZF9vcHMnO1xuXG5pbXBvcnQge2hhbW1pbmdXaW5kb3d9IGZyb20gJy4vc2lnbmFsL2hhbW1pbmdfd2luZG93JztcbmltcG9ydCB7aGFubldpbmRvd30gZnJvbSAnLi9zaWduYWwvaGFubl93aW5kb3cnO1xuaW1wb3J0IHtmcmFtZX0gZnJvbSAnLi9zaWduYWwvZnJhbWUnO1xuaW1wb3J0IHtzdGZ0fSBmcm9tICcuL3NpZ25hbC9zdGZ0JztcbmNvbnN0IHNpZ25hbCA9IHtcbiAgaGFtbWluZ1dpbmRvdyxcbiAgaGFubldpbmRvdyxcbiAgZnJhbWUsXG4gIHN0ZnQsXG59O1xuXG4vLyBJbWFnZSBPcHMgbmFtZXNwYWNlXG5pbXBvcnQge2Nyb3BBbmRSZXNpemV9IGZyb20gJy4vaW1hZ2UvY3JvcF9hbmRfcmVzaXplJztcbmltcG9ydCB7ZmxpcExlZnRSaWdodH0gZnJvbSAnLi9pbWFnZS9mbGlwX2xlZnRfcmlnaHQnO1xuaW1wb3J0IHtncmF5c2NhbGVUb1JHQn0gZnJvbSAnLi9pbWFnZS9ncmF5c2NhbGVfdG9fcmdiJztcbmltcG9ydCB7cm90YXRlV2l0aE9mZnNldH0gZnJvbSAnLi9pbWFnZS9yb3RhdGVfd2l0aF9vZmZzZXQnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvbn0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25Bc3luY30gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX2FzeW5jJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmV9IGZyb20gJy4vaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl93aXRoX3Njb3JlJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVBc3luY30gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3dpdGhfc2NvcmVfYXN5bmMnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblBhZGRlZH0gZnJvbSAnLi9pbWFnZS9ub25fbWF4X3N1cHByZXNzaW9uX3BhZGRlZCc7XG5pbXBvcnQge25vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmN9IGZyb20gJy4vaW1hZ2Uvbm9uX21heF9zdXBwcmVzc2lvbl9wYWRkZWRfYXN5bmMnO1xuaW1wb3J0IHtyZXNpemVCaWxpbmVhcn0gZnJvbSAnLi9pbWFnZS9yZXNpemVfYmlsaW5lYXInO1xuaW1wb3J0IHtyZXNpemVOZWFyZXN0TmVpZ2hib3J9IGZyb20gJy4vaW1hZ2UvcmVzaXplX25lYXJlc3RfbmVpZ2hib3InO1xuaW1wb3J0IHt0aHJlc2hvbGR9IGZyb20gJy4vaW1hZ2UvdGhyZXNob2xkJztcbmltcG9ydCB7dHJhbnNmb3JtfSBmcm9tICcuL2ltYWdlL3RyYW5zZm9ybSc7XG5jb25zdCBpbWFnZSA9IHtcbiAgZmxpcExlZnRSaWdodCxcbiAgZ3JheXNjYWxlVG9SR0IsXG4gIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgcmVzaXplQmlsaW5lYXIsXG4gIHJvdGF0ZVdpdGhPZmZzZXQsXG4gIGNyb3BBbmRSZXNpemUsXG4gIG5vbk1heFN1cHByZXNzaW9uLFxuICBub25NYXhTdXBwcmVzc2lvbkFzeW5jLFxuICBub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZSxcbiAgbm9uTWF4U3VwcHJlc3Npb25XaXRoU2NvcmVBc3luYyxcbiAgbm9uTWF4U3VwcHJlc3Npb25QYWRkZWQsXG4gIG5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMsXG4gIHRocmVzaG9sZCxcbiAgdHJhbnNmb3JtXG59O1xuXG4vLyBsaW5hbGcgbmFtZXNwYWNlXG5pbXBvcnQge2JhbmRQYXJ0fSBmcm9tICcuL2xpbmFsZy9iYW5kX3BhcnQnO1xuaW1wb3J0IHtncmFtU2NobWlkdH0gZnJvbSAnLi9saW5hbGcvZ3JhbV9zY2htaWR0JztcbmltcG9ydCB7cXJ9IGZyb20gJy4vbGluYWxnL3FyJztcbmNvbnN0IGxpbmFsZyA9IHtcbiAgYmFuZFBhcnQsXG4gIGdyYW1TY2htaWR0LFxuICBxclxufTtcblxuLy8gbG9zc2VzIG5hbWVzcGFjZTtcbmltcG9ydCB7YWJzb2x1dGVEaWZmZXJlbmNlfSBmcm9tICcuL2xvc3Nlcy9hYnNvbHV0ZV9kaWZmZXJlbmNlJztcbmltcG9ydCB7Y29tcHV0ZVdlaWdodGVkTG9zc30gZnJvbSAnLi9sb3NzZXMvY29tcHV0ZV93ZWlnaHRlZF9sb3NzJztcbmltcG9ydCB7Y29zaW5lRGlzdGFuY2V9IGZyb20gJy4vbG9zc2VzL2Nvc2luZV9kaXN0YW5jZSc7XG5pbXBvcnQge2hpbmdlTG9zc30gZnJvbSAnLi9sb3NzZXMvaGluZ2VfbG9zcyc7XG5pbXBvcnQge2h1YmVyTG9zc30gZnJvbSAnLi9sb3NzZXMvaHViZXJfbG9zcyc7XG5pbXBvcnQge2xvZ0xvc3N9IGZyb20gJy4vbG9zc2VzL2xvZ19sb3NzJztcbmltcG9ydCB7bWVhblNxdWFyZWRFcnJvcn0gZnJvbSAnLi9sb3NzZXMvbWVhbl9zcXVhcmVkX2Vycm9yJztcbmltcG9ydCB7c2lnbW9pZENyb3NzRW50cm9weX0gZnJvbSAnLi9sb3NzZXMvc2lnbW9pZF9jcm9zc19lbnRyb3B5JztcbmltcG9ydCB7c29mdG1heENyb3NzRW50cm9weX0gZnJvbSAnLi9sb3NzZXMvc29mdG1heF9jcm9zc19lbnRyb3B5JztcbmNvbnN0IGxvc3NlcyA9IHtcbiAgYWJzb2x1dGVEaWZmZXJlbmNlLFxuICBjb21wdXRlV2VpZ2h0ZWRMb3NzLFxuICBjb3NpbmVEaXN0YW5jZSxcbiAgaGluZ2VMb3NzLFxuICBodWJlckxvc3MsXG4gIGxvZ0xvc3MsXG4gIG1lYW5TcXVhcmVkRXJyb3IsXG4gIHNpZ21vaWRDcm9zc0VudHJvcHksXG4gIHNvZnRtYXhDcm9zc0VudHJvcHlcbn07XG5cbmltcG9ydCB7c3BhcnNlRmlsbEVtcHR5Um93c30gZnJvbSAnLi9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93cyc7XG5pbXBvcnQge3NwYXJzZVJlc2hhcGV9IGZyb20gJy4vc3BhcnNlL3NwYXJzZV9yZXNoYXBlJztcbmltcG9ydCB7c3BhcnNlU2VnbWVudE1lYW59IGZyb20gJy4vc3BhcnNlL3NwYXJzZV9zZWdtZW50X21lYW4nO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50U3VtfSBmcm9tICcuL3NwYXJzZS9zcGFyc2Vfc2VnbWVudF9zdW0nO1xuY29uc3Qgc3BhcnNlID0ge1xuICBzcGFyc2VGaWxsRW1wdHlSb3dzLFxuICBzcGFyc2VSZXNoYXBlLFxuICBzcGFyc2VTZWdtZW50TWVhbixcbiAgc3BhcnNlU2VnbWVudFN1bVxufTtcblxuaW1wb3J0IHtzdHJpbmdOR3JhbXN9IGZyb20gJy4vc3RyaW5nL3N0cmluZ19uX2dyYW1zJztcbmltcG9ydCB7c3RyaW5nU3BsaXR9IGZyb20gJy4vc3RyaW5nL3N0cmluZ19zcGxpdCc7XG5pbXBvcnQge3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3R9IGZyb20gJy4vc3RyaW5nL3N0cmluZ190b19oYXNoX2J1Y2tldF9mYXN0Jztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp2YXJpYWJsZS1uYW1lXG5jb25zdCBzdHJpbmcgPSB7XG4gIHN0cmluZ05HcmFtcyxcbiAgc3RyaW5nU3BsaXQsXG4gIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3Rcbn07XG5cbi8vIFNlY29uZCBsZXZlbCBleHBvcnRzLlxuZXhwb3J0IHtpbWFnZSwgbGluYWxnLCBsb3NzZXMsIHNwZWN0cmFsLCBmdXNlZCwgc2lnbmFsLCBzcGFyc2UsIHN0cmluZ307XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { dispose } from '../globals';\nimport { variableGrads } from '../gradients';\nimport { scalar } from '../ops/ops';\nimport { Serializable } from '../serialization';\n/** @doc {heading: 'Training', subheading: 'Classes', namespace: 'train'} */\nexport class Optimizer extends Serializable {\n    /**\n     * Executes `f()` and minimizes the scalar output of `f()` by computing\n     * gradients of y with respect to the list of trainable variables provided by\n     * `varList`. If no list is provided, it defaults to all trainable variables.\n     *\n     * @param f The function to execute and whose output to minimize.\n     * @param returnCost Whether to return the scalar cost value produced by\n     * executing `f()`.\n     * @param varList An optional list of variables to update. If specified, only\n     * the trainable variables in varList will be updated by minimize. Defaults to\n     * all trainable variables.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers'}\n     */\n    minimize(f, returnCost = false, varList) {\n        const { value, grads } = this.computeGradients(f, varList);\n        if (varList != null) {\n            const gradArray = varList.map(v => ({ name: v.name, tensor: grads[v.name] }));\n            this.applyGradients(gradArray);\n        }\n        else {\n            this.applyGradients(grads);\n        }\n        // Dispose gradients.\n        dispose(grads);\n        if (returnCost) {\n            return value;\n        }\n        else {\n            value.dispose();\n            return null;\n        }\n    }\n    /**\n     * The number of iterations that this optimizer instance has been invoked for.\n     */\n    get iterations() {\n        if (this.iterations_ == null) {\n            this.iterations_ = 0;\n        }\n        return this.iterations_;\n    }\n    incrementIterations() {\n        this.iterations_ = this.iterations + 1;\n    }\n    /**\n     * Executes f() and computes the gradient of the scalar output of f() with\n     * respect to the list of trainable variables provided by `varList`. If no\n     * list is provided, it defaults to all trainable variables.\n     *\n     * @param f The function to execute and whose output to use for computing\n     * gradients with respect to variables.\n     * @param varList An optional list of variables to compute gradients with\n     * respect to. If specified, only the trainable variables in varList will have\n     * gradients computed with respect to. Defaults to all trainable variables.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers'}\n     */\n    computeGradients(f, varList) {\n        return variableGrads(f, varList);\n    }\n    /**\n     * Dispose the variables (if any) owned by this optimizer instance.\n     */\n    dispose() {\n        if (this.iterations_ != null) {\n            dispose(this.iterations_);\n        }\n    }\n    async saveIterations() {\n        if (this.iterations_ == null) {\n            this.iterations_ = 0;\n        }\n        return {\n            name: 'iter',\n            // TODO(cais): Use 'int64' type when available.\n            tensor: scalar(this.iterations_, 'int32')\n        };\n    }\n    async getWeights() {\n        throw new Error('getWeights() is not implemented for this optimizer yet.');\n    }\n    async setWeights(weightValues) {\n        throw new Error(`setWeights() is not implemented for this optimizer class ` +\n            `${this.getClassName()}`);\n    }\n    /**\n     * Extract the first element of the weight values and set it\n     * as the iterations counter variable of this instance of optimizer.\n     *\n     * @param weightValues\n     * @returns Weight values with the first element consumed and excluded.\n     */\n    async extractIterations(weightValues) {\n        this.iterations_ = (await weightValues[0].tensor.data())[0];\n        return weightValues.slice(1);\n    }\n}\nObject.defineProperty(Optimizer, Symbol.hasInstance, {\n    value: (instance) => {\n        return instance.minimize != null && instance.computeGradients != null &&\n            instance.applyGradients != null;\n    }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHRpbWl6ZXJzL29wdGltaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDM0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNsQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFvQjlDLDRFQUE0RTtBQUM1RSxNQUFNLE9BQWdCLFNBQVUsU0FBUSxZQUFZO0lBR2xEOzs7Ozs7Ozs7Ozs7O09BYUc7SUFDSCxRQUFRLENBQUMsQ0FBZSxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQUUsT0FBb0I7UUFFaEUsTUFBTSxFQUFDLEtBQUssRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXpELElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixNQUFNLFNBQVMsR0FDWCxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzlELElBQUksQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDaEM7YUFBTTtZQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDNUI7UUFFRCxxQkFBcUI7UUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWYsSUFBSSxVQUFVLEVBQUU7WUFDZCxPQUFPLEtBQUssQ0FBQztTQUNkO2FBQU07WUFDTCxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDaEIsT0FBTyxJQUFJLENBQUM7U0FDYjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNILElBQUksVUFBVTtRQUNaLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7SUFDMUIsQ0FBQztJQUVTLG1CQUFtQjtRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSCxnQkFBZ0IsQ0FBQyxDQUFlLEVBQUUsT0FBb0I7UUFFcEQsT0FBTyxhQUFhLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFZRDs7T0FFRztJQUNILE9BQU87UUFDTCxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxFQUFFO1lBQzVCLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDM0I7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWM7UUFDbEIsSUFBSSxJQUFJLENBQUMsV0FBVyxJQUFJLElBQUksRUFBRTtZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQztTQUN0QjtRQUNELE9BQU87WUFDTCxJQUFJLEVBQUUsTUFBTTtZQUNaLCtDQUErQztZQUMvQyxNQUFNLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsT0FBTyxDQUFDO1NBQzFDLENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxNQUFNLElBQUksS0FBSyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVLENBQUMsWUFBMkI7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQ7WUFDM0QsR0FBRyxJQUFJLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDTyxLQUFLLENBQUMsaUJBQWlCLENBQUMsWUFBMkI7UUFFM0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLE1BQU0sWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVELE9BQU8sWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0Y7QUFFRCxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsV0FBVyxFQUFFO0lBQ25ELEtBQUssRUFBRSxDQUFDLFFBQW1CLEVBQUUsRUFBRTtRQUM3QixPQUFPLFFBQVEsQ0FBQyxRQUFRLElBQUksSUFBSSxJQUFJLFFBQVEsQ0FBQyxnQkFBZ0IsSUFBSSxJQUFJO1lBQ2pFLFFBQVEsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDO0lBQ3RDLENBQUM7Q0FDRixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZGlzcG9zZX0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQge3ZhcmlhYmxlR3JhZHN9IGZyb20gJy4uL2dyYWRpZW50cyc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL29wcyc7XG5pbXBvcnQge1NlcmlhbGl6YWJsZX0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQge1NjYWxhciwgVmFyaWFibGV9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yLCBOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuLyoqXG4gKiBBIHZhcmlhYmxlIHRoYXQgYmVsb25ncyB0byBhbiBvcHRpbWl6ZXIuXG4gKlxuICogVGhlIGBvcmlnaW5hbE5hbWVgIGZpZWxkIGlzIHJlcXVpcmVkIGZvciBrZWVwaW5nIHRyYWNrIG9mIHRoZSBjYW5vbmljYWxcbiAqIG5hbWUgb2YgdGhlIHZhcmlhYmxlLCB3aGljaCBpcyB1c3VhbGx5IHRoZSBuYW1lIG9mIHRoZSBtb2RlbCB3ZWlnaHQgdGhhdFxuICogdGhlIHZhcmlhYmxlIGlzIHJlbGF0ZWQgdG8gcGx1cyBhIHN1ZmZpeCwgZS5nLiwgJ2RlbnNlMS9rZXJuZWwvbW9tZW50dW0nLlxuICogVGhlIG5hbWUgb2YgdGhlIGBWYXJpYWJsZWAgb2JqZWN0IGl0c2VsZiBjYW5ub3QgYmUgdXNlZCBkaXJlY3RseSBkdWUgdG9cbiAqIHBvc3NpYmxlIGRlZHVwbGljYXRpb246IEV2ZXJ5IGBWYXJpYWJsZWAgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUgYnV0IG1vcmVcbiAqIHRoYW4gb25lIG9wdGltaXplciBvYmplY3RzIG9mIHRoZSBzYW1lIHR5cGUgbWF5IGJlIGNyZWF0ZWQgZm9yIHRoZSBzYW1lIG1vZGVsXG4gKiBvciB0aGUgc2FtZSBgVmFyaWFibGVgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE9wdGltaXplclZhcmlhYmxlIHtcbiAgb3JpZ2luYWxOYW1lOiBzdHJpbmc7XG4gIHZhcmlhYmxlOiBWYXJpYWJsZTtcbn1cblxuLyoqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgbmFtZXNwYWNlOiAndHJhaW4nfSAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIE9wdGltaXplciBleHRlbmRzIFNlcmlhbGl6YWJsZSB7XG4gIHByb3RlY3RlZCBpdGVyYXRpb25zXzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBgZigpYCBhbmQgbWluaW1pemVzIHRoZSBzY2FsYXIgb3V0cHV0IG9mIGBmKClgIGJ5IGNvbXB1dGluZ1xuICAgKiBncmFkaWVudHMgb2YgeSB3aXRoIHJlc3BlY3QgdG8gdGhlIGxpc3Qgb2YgdHJhaW5hYmxlIHZhcmlhYmxlcyBwcm92aWRlZCBieVxuICAgKiBgdmFyTGlzdGAuIElmIG5vIGxpc3QgaXMgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvIGFsbCB0cmFpbmFibGUgdmFyaWFibGVzLlxuICAgKlxuICAgKiBAcGFyYW0gZiBUaGUgZnVuY3Rpb24gdG8gZXhlY3V0ZSBhbmQgd2hvc2Ugb3V0cHV0IHRvIG1pbmltaXplLlxuICAgKiBAcGFyYW0gcmV0dXJuQ29zdCBXaGV0aGVyIHRvIHJldHVybiB0aGUgc2NhbGFyIGNvc3QgdmFsdWUgcHJvZHVjZWQgYnlcbiAgICogZXhlY3V0aW5nIGBmKClgLlxuICAgKiBAcGFyYW0gdmFyTGlzdCBBbiBvcHRpb25hbCBsaXN0IG9mIHZhcmlhYmxlcyB0byB1cGRhdGUuIElmIHNwZWNpZmllZCwgb25seVxuICAgKiB0aGUgdHJhaW5hYmxlIHZhcmlhYmxlcyBpbiB2YXJMaXN0IHdpbGwgYmUgdXBkYXRlZCBieSBtaW5pbWl6ZS4gRGVmYXVsdHMgdG9cbiAgICogYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJ31cbiAgICovXG4gIG1pbmltaXplKGY6ICgpID0+IFNjYWxhciwgcmV0dXJuQ29zdCA9IGZhbHNlLCB2YXJMaXN0PzogVmFyaWFibGVbXSk6IFNjYWxhclxuICAgICAgfG51bGwge1xuICAgIGNvbnN0IHt2YWx1ZSwgZ3JhZHN9ID0gdGhpcy5jb21wdXRlR3JhZGllbnRzKGYsIHZhckxpc3QpO1xuXG4gICAgaWYgKHZhckxpc3QgIT0gbnVsbCkge1xuICAgICAgY29uc3QgZ3JhZEFycmF5OiBOYW1lZFRlbnNvcltdID1cbiAgICAgICAgICB2YXJMaXN0Lm1hcCh2ID0+ICh7bmFtZTogdi5uYW1lLCB0ZW5zb3I6IGdyYWRzW3YubmFtZV19KSk7XG4gICAgICB0aGlzLmFwcGx5R3JhZGllbnRzKGdyYWRBcnJheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYXBwbHlHcmFkaWVudHMoZ3JhZHMpO1xuICAgIH1cblxuICAgIC8vIERpc3Bvc2UgZ3JhZGllbnRzLlxuICAgIGRpc3Bvc2UoZ3JhZHMpO1xuXG4gICAgaWYgKHJldHVybkNvc3QpIHtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUuZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaXRlcmF0aW9ucyB0aGF0IHRoaXMgb3B0aW1pemVyIGluc3RhbmNlIGhhcyBiZWVuIGludm9rZWQgZm9yLlxuICAgKi9cbiAgZ2V0IGl0ZXJhdGlvbnMoKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy5pdGVyYXRpb25zXyA9PSBudWxsKSB7XG4gICAgICB0aGlzLml0ZXJhdGlvbnNfID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0aW9uc187XG4gIH1cblxuICBwcm90ZWN0ZWQgaW5jcmVtZW50SXRlcmF0aW9ucygpIHtcbiAgICB0aGlzLml0ZXJhdGlvbnNfID0gdGhpcy5pdGVyYXRpb25zICsgMTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBmKCkgYW5kIGNvbXB1dGVzIHRoZSBncmFkaWVudCBvZiB0aGUgc2NhbGFyIG91dHB1dCBvZiBmKCkgd2l0aFxuICAgKiByZXNwZWN0IHRvIHRoZSBsaXN0IG9mIHRyYWluYWJsZSB2YXJpYWJsZXMgcHJvdmlkZWQgYnkgYHZhckxpc3RgLiBJZiBub1xuICAgKiBsaXN0IGlzIHByb3ZpZGVkLCBpdCBkZWZhdWx0cyB0byBhbGwgdHJhaW5hYmxlIHZhcmlhYmxlcy5cbiAgICpcbiAgICogQHBhcmFtIGYgVGhlIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYW5kIHdob3NlIG91dHB1dCB0byB1c2UgZm9yIGNvbXB1dGluZ1xuICAgKiBncmFkaWVudHMgd2l0aCByZXNwZWN0IHRvIHZhcmlhYmxlcy5cbiAgICogQHBhcmFtIHZhckxpc3QgQW4gb3B0aW9uYWwgbGlzdCBvZiB2YXJpYWJsZXMgdG8gY29tcHV0ZSBncmFkaWVudHMgd2l0aFxuICAgKiByZXNwZWN0IHRvLiBJZiBzcGVjaWZpZWQsIG9ubHkgdGhlIHRyYWluYWJsZSB2YXJpYWJsZXMgaW4gdmFyTGlzdCB3aWxsIGhhdmVcbiAgICogZ3JhZGllbnRzIGNvbXB1dGVkIHdpdGggcmVzcGVjdCB0by4gRGVmYXVsdHMgdG8gYWxsIHRyYWluYWJsZSB2YXJpYWJsZXMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJ31cbiAgICovXG4gIGNvbXB1dGVHcmFkaWVudHMoZjogKCkgPT4gU2NhbGFyLCB2YXJMaXN0PzogVmFyaWFibGVbXSk6XG4gICAgICB7dmFsdWU6IFNjYWxhciwgZ3JhZHM6IE5hbWVkVGVuc29yTWFwfSB7XG4gICAgcmV0dXJuIHZhcmlhYmxlR3JhZHMoZiwgdmFyTGlzdCk7XG4gIH1cblxuICAvKipcbiAgICogVXBkYXRlcyB2YXJpYWJsZXMgYnkgdXNpbmcgdGhlIGNvbXB1dGVkIGdyYWRpZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHZhcmlhYmxlR3JhZGllbnRzIEEgbWFwcGluZyBvZiB2YXJpYWJsZSBuYW1lIHRvIGl0cyBncmFkaWVudCB2YWx1ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnfVxuICAgKi9cbiAgYWJzdHJhY3QgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHM6IE5hbWVkVGVuc29yTWFwfFxuICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lZFRlbnNvcltdKTogdm9pZDtcblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgdmFyaWFibGVzIChpZiBhbnkpIG93bmVkIGJ5IHRoaXMgb3B0aW1pemVyIGluc3RhbmNlLlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pdGVyYXRpb25zXyAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuaXRlcmF0aW9uc18pO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNhdmVJdGVyYXRpb25zKCk6IFByb21pc2U8TmFtZWRUZW5zb3I+IHtcbiAgICBpZiAodGhpcy5pdGVyYXRpb25zXyA9PSBudWxsKSB7XG4gICAgICB0aGlzLml0ZXJhdGlvbnNfID0gMDtcbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6ICdpdGVyJywgIC8vIE5hbWVkIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFVzZSAnaW50NjQnIHR5cGUgd2hlbiBhdmFpbGFibGUuXG4gICAgICB0ZW5zb3I6IHNjYWxhcih0aGlzLml0ZXJhdGlvbnNfLCAnaW50MzInKVxuICAgIH07XG4gIH1cblxuICBhc3luYyBnZXRXZWlnaHRzKCk6IFByb21pc2U8TmFtZWRUZW5zb3JbXT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignZ2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBvcHRpbWl6ZXIgeWV0LicpO1xuICB9XG5cbiAgYXN5bmMgc2V0V2VpZ2h0cyh3ZWlnaHRWYWx1ZXM6IE5hbWVkVGVuc29yW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBzZXRXZWlnaHRzKCkgaXMgbm90IGltcGxlbWVudGVkIGZvciB0aGlzIG9wdGltaXplciBjbGFzcyBgICtcbiAgICAgICAgYCR7dGhpcy5nZXRDbGFzc05hbWUoKX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeHRyYWN0IHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB3ZWlnaHQgdmFsdWVzIGFuZCBzZXQgaXRcbiAgICogYXMgdGhlIGl0ZXJhdGlvbnMgY291bnRlciB2YXJpYWJsZSBvZiB0aGlzIGluc3RhbmNlIG9mIG9wdGltaXplci5cbiAgICpcbiAgICogQHBhcmFtIHdlaWdodFZhbHVlc1xuICAgKiBAcmV0dXJucyBXZWlnaHQgdmFsdWVzIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgY29uc3VtZWQgYW5kIGV4Y2x1ZGVkLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFzeW5jIGV4dHJhY3RJdGVyYXRpb25zKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6XG4gICAgICBQcm9taXNlPE5hbWVkVGVuc29yW10+IHtcbiAgICB0aGlzLml0ZXJhdGlvbnNfID0gKGF3YWl0IHdlaWdodFZhbHVlc1swXS50ZW5zb3IuZGF0YSgpKVswXTtcbiAgICByZXR1cm4gd2VpZ2h0VmFsdWVzLnNsaWNlKDEpO1xuICB9XG59XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShPcHRpbWl6ZXIsIFN5bWJvbC5oYXNJbnN0YW5jZSwge1xuICB2YWx1ZTogKGluc3RhbmNlOiBPcHRpbWl6ZXIpID0+IHtcbiAgICByZXR1cm4gaW5zdGFuY2UubWluaW1pemUgIT0gbnVsbCAmJiBpbnN0YW5jZS5jb21wdXRlR3JhZGllbnRzICE9IG51bGwgJiZcbiAgICAgICAgaW5zdGFuY2UuYXBwbHlHcmFkaWVudHMgIT0gbnVsbDtcbiAgfVxufSk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { sqrt } from '../ops/ops';\nimport { square } from '../ops/square';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\n/** @doclink Optimizer */\nexport class AdadeltaOptimizer extends Optimizer {\n    constructor(learningRate, rho, epsilon = null) {\n        super();\n        this.learningRate = learningRate;\n        this.rho = rho;\n        this.epsilon = epsilon;\n        this.accumulatedGrads = [];\n        this.accumulatedUpdates = [];\n        if (epsilon == null) {\n            this.epsilon = ENGINE.backend.epsilon();\n        }\n    }\n    applyGradients(variableGradients) {\n        const variableNames = Array.isArray(variableGradients) ?\n            variableGradients.map(item => item.name) :\n            Object.keys(variableGradients);\n        variableNames.forEach((name, i) => {\n            const value = ENGINE.registeredVariables[name];\n            const trainable = false;\n            if (this.accumulatedGrads[i] == null) {\n                this.accumulatedGrads[i] = {\n                    originalName: `${name}/accum_grad`,\n                    variable: tidy(() => zerosLike(value).variable(trainable))\n                };\n            }\n            if (this.accumulatedUpdates[i] == null) {\n                this.accumulatedUpdates[i] = {\n                    originalName: `${name}/accum_var`,\n                    variable: tidy(() => zerosLike(value).variable(trainable))\n                };\n            }\n            const gradient = Array.isArray(variableGradients) ?\n                variableGradients[i].tensor :\n                variableGradients[name];\n            if (gradient == null) {\n                return;\n            }\n            const accumulatedGrad = this.accumulatedGrads[i].variable;\n            const accumulatedUpdate = this.accumulatedUpdates[i].variable;\n            tidy(() => {\n                const newAccumulatedGrad = add(mul(accumulatedGrad, this.rho), mul(square(gradient), 1 - this.rho));\n                const updates = mul(div(sqrt(add(accumulatedUpdate, this.epsilon)), sqrt(add(accumulatedGrad, this.epsilon))), gradient);\n                const newAccumulatedUpdate = add(mul(accumulatedUpdate, this.rho), mul(square(updates), 1 - this.rho));\n                accumulatedGrad.assign(newAccumulatedGrad);\n                accumulatedUpdate.assign(newAccumulatedUpdate);\n                const newValue = add(mul(updates, -this.learningRate), value);\n                value.assign(newValue);\n            });\n        });\n        this.incrementIterations();\n    }\n    dispose() {\n        if (this.accumulatedUpdates != null) {\n            dispose(this.accumulatedGrads.map(v => v.variable));\n            dispose(this.accumulatedUpdates.map(v => v.variable));\n        }\n    }\n    async getWeights() {\n        // Order matters for Python compatibility.\n        const variables = [...this.accumulatedGrads, ...this.accumulatedUpdates];\n        return [await this.saveIterations()].concat(variables.map(v => ({ name: v.originalName, tensor: v.variable })));\n    }\n    async setWeights(weightValues) {\n        weightValues = await this.extractIterations(weightValues);\n        const variableCount = weightValues.length / 2;\n        const trainable = false;\n        this.accumulatedGrads =\n            weightValues.slice(0, variableCount).map(v => ({\n                originalName: v.name,\n                variable: v.tensor.variable(trainable)\n            }));\n        this.accumulatedUpdates =\n            weightValues.slice(variableCount, variableCount * 2)\n                .map(v => ({\n                originalName: v.name,\n                variable: v.tensor.variable(trainable)\n            }));\n    }\n    getConfig() {\n        return {\n            'learningRate': this.learningRate,\n            'rho': this.rho,\n            'epsilon': this.epsilon\n        };\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config['learningRate'], config['rho'], config['epsilon']);\n    }\n}\n/** @nocollapse */\nAdadeltaOptimizer.className = 'Adadelta'; // Name matters for Python compatibility.\nregisterClass(AdadeltaOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhZGVsdGFfb3B0aW1pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHRpbWl6ZXJzL2FkYWRlbHRhX29wdGltaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDaEMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFhLGFBQWEsRUFBd0MsTUFBTSxrQkFBa0IsQ0FBQztBQUdsRyxPQUFPLEVBQUMsU0FBUyxFQUFvQixNQUFNLGFBQWEsQ0FBQztBQUV6RCx5QkFBeUI7QUFDekIsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFNBQVM7SUFNOUMsWUFDYyxZQUFvQixFQUFZLEdBQVcsRUFDM0MsVUFBa0IsSUFBSTtRQUNsQyxLQUFLLEVBQUUsQ0FBQztRQUZJLGlCQUFZLEdBQVosWUFBWSxDQUFRO1FBQVksUUFBRyxHQUFILEdBQUcsQ0FBUTtRQUMzQyxZQUFPLEdBQVAsT0FBTyxDQUFlO1FBTDVCLHFCQUFnQixHQUF3QixFQUFFLENBQUM7UUFDM0MsdUJBQWtCLEdBQXdCLEVBQUUsQ0FBQztRQU9uRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsSUFBSSxD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O0FBQ1gsMkJBQVMsR0FBRyxVQUFVLENBQUMsQ0FBRSx5Q0FBeUM7QUFvSDNFLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7ZGlzcG9zZSwgdGlkeX0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NxcnR9IGZyb20gJy4uL29wcy9vcHMnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7Q29uZmlnRGljdCwgcmVnaXN0ZXJDbGFzcywgU2VyaWFsaXphYmxlLCBTZXJpYWxpemFibGVDb25zdHJ1Y3Rvcn0gZnJvbSAnLi4vc2VyaWFsaXphdGlvbic7XG5pbXBvcnQge05hbWVkVGVuc29yLCBOYW1lZFZhcmlhYmxlTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuXG5pbXBvcnQge09wdGltaXplciwgT3B0aW1pemVyVmFyaWFibGV9IGZyb20gJy4vb3B0aW1pemVyJztcblxuLyoqIEBkb2NsaW5rIE9wdGltaXplciAqL1xuZXhwb3J0IGNsYXNzIEFkYWRlbHRhT3B0aW1pemVyIGV4dGVuZHMgT3B0aW1pemVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQWRhZGVsdGEnOyAgLy8gTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgcHJpdmF0ZSBhY2N1bXVsYXRlZEdyYWRzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRVcGRhdGVzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgbGVhcm5pbmdSYXRlOiBudW1iZXIsIHByb3RlY3RlZCByaG86IG51bWJlcixcbiAgICAgIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRWYXJpYWJsZU1hcHxOYW1lZFRlbnNvcltdKSB7XG4gICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgIE9iamVjdC5rZXlzKHZhcmlhYmxlR3JhZGllbnRzKTtcblxuICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXSA9IHtcbiAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L2FjY3VtX2dyYWRgLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzW2ldID0ge1xuICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vYWNjdW1fdmFyYCxcbiAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZCA9IHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXS52YXJpYWJsZTtcbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkVXBkYXRlID0gdGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXNbaV0udmFyaWFibGU7XG5cbiAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICBjb25zdCBuZXdBY2N1bXVsYXRlZEdyYWQgPVxuICAgICAgICAgICAgYWRkKG11bChhY2N1bXVsYXRlZEdyYWQsIHRoaXMucmhvKSxcbiAgICAgICAgICAgICAgICBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMucmhvKSk7XG5cbiAgICAgICAgY29uc3QgdXBkYXRlcyA9XG4gICAgICAgICAgICBtdWwoZGl2KHNxcnQoYWRkKGFjY3VtdWxhdGVkVXBkYXRlLCB0aGlzLmVwc2lsb24pKSxcbiAgICAgICAgICAgICAgICAgICAgc3FydChhZGQoYWNjdW11bGF0ZWRHcmFkLCB0aGlzLmVwc2lsb24pKSksXG4gICAgICAgICAgICAgICAgZ3JhZGllbnQpO1xuXG4gICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkVXBkYXRlID1cbiAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRVcGRhdGUsIHRoaXMucmhvKSxcbiAgICAgICAgICAgICAgICBtdWwoc3F1YXJlKHVwZGF0ZXMpLCAxIC0gdGhpcy5yaG8pKTtcblxuICAgICAgICBhY2N1bXVsYXRlZEdyYWQuYXNzaWduKG5ld0FjY3VtdWxhdGVkR3JhZCk7XG4gICAgICAgIGFjY3VtdWxhdGVkVXBkYXRlLmFzc2lnbihuZXdBY2N1bXVsYXRlZFVwZGF0ZSk7XG5cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQobXVsKHVwZGF0ZXMsIC10aGlzLmxlYXJuaW5nUmF0ZSksIHZhbHVlKTtcbiAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMuaW5jcmVtZW50SXRlcmF0aW9ucygpO1xuICB9XG5cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFVwZGF0ZXMgIT0gbnVsbCkge1xuICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkVXBkYXRlcy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0V2VpZ2h0cygpOiBQcm9taXNlPE5hbWVkVGVuc29yW10+IHtcbiAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICBjb25zdCB2YXJpYWJsZXM6IE9wdGltaXplclZhcmlhYmxlW10gPVxuICAgICAgICBbLi4udGhpcy5hY2N1bXVsYXRlZEdyYWRzLCAuLi50aGlzLmFjY3VtdWxhdGVkVXBkYXRlc107XG4gICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdChcbiAgICAgICAgdmFyaWFibGVzLm1hcCh2ID0+ICh7bmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZX0pKSk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICBjb25zdCB2YXJpYWJsZUNvdW50ID0gd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgdGhpcy5hY2N1bXVsYXRlZEdyYWRzID1cbiAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgIHRoaXMuYWNjdW11bGF0ZWRVcGRhdGVzID1cbiAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKHZhcmlhYmxlQ291bnQsIHZhcmlhYmxlQ291bnQgKiAyKVxuICAgICAgICAgICAgLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgICAgICAgfSkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAncmhvJzogdGhpcy5yaG8sXG4gICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvblxuICAgIH07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ3JobyddLCBjb25maWdbJ2Vwc2lsb24nXSk7XG4gIH1cbn1cbnJlZ2lzdGVyQ2xhc3MoQWRhZGVsdGFPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { fill } from '../ops/fill';\nimport { mul } from '../ops/mul';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\n/** @doclink Optimizer */\nexport class AdagradOptimizer extends Optimizer {\n    constructor(learningRate, initialAccumulatorValue = 0.1) {\n        super();\n        this.learningRate = learningRate;\n        this.initialAccumulatorValue = initialAccumulatorValue;\n        this.accumulatedGrads = [];\n    }\n    applyGradients(variableGradients) {\n        const variableNames = Array.isArray(variableGradients) ?\n            variableGradients.map(item => item.name) :\n            Object.keys(variableGradients);\n        variableNames.forEach((name, i) => {\n            const value = ENGINE.registeredVariables[name];\n            if (this.accumulatedGrads[i] == null) {\n                const trainable = false;\n                this.accumulatedGrads[i] = {\n                    originalName: `${name}/accumulator`,\n                    variable: tidy(() => fill(value.shape, this.initialAccumulatorValue)\n                        .variable(trainable))\n                };\n            }\n            const gradient = Array.isArray(variableGradients) ?\n                variableGradients[i].tensor :\n                variableGradients[name];\n            if (gradient == null) {\n                return;\n            }\n            const accumulatedGrad = this.accumulatedGrads[i].variable;\n            tidy(() => {\n                const newAccumulatedGrad = add(accumulatedGrad, square(gradient));\n                accumulatedGrad.assign(newAccumulatedGrad);\n                const newValue = add(mul(div(gradient, sqrt(add(newAccumulatedGrad, ENGINE.backend.epsilon()))), -this.learningRate), value);\n                value.assign(newValue);\n            });\n        });\n        this.incrementIterations();\n    }\n    dispose() {\n        if (this.accumulatedGrads != null) {\n            dispose(this.accumulatedGrads.map(v => v.variable));\n        }\n    }\n    async getWeights() {\n        // Order matters for Python compatibility.\n        return [await this.saveIterations()].concat(this.accumulatedGrads.map(v => ({ name: v.originalName, tensor: v.variable })));\n    }\n    async setWeights(weightValues) {\n        weightValues = await this.extractIterations(weightValues);\n        const trainable = false;\n        this.accumulatedGrads = weightValues.map(v => ({ originalName: v.name, variable: v.tensor.variable(trainable) }));\n    }\n    getConfig() {\n        return {\n            'learningRate': this.learningRate,\n            'initialAccumulatorValue': this.initialAccumulatorValue,\n        };\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config['learningRate'], config['initialAccumulatorValue']);\n    }\n}\n/** @nocollapse */\nAdagradOptimizer.className = 'Adagrad'; // Note: Name matters for Python compatibility.\nregisterClass(AdagradOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhZ3JhZF9vcHRpbWl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wdGltaXplcnMvYWRhZ3JhZF9vcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQWEsYUFBYSxFQUF3QyxNQUFNLGtCQUFrQixDQUFDO0FBR2xHLE9BQU8sRUFBQyxTQUFTLEVBQW9CLE1BQU0sYUFBYSxDQUFDO0FBRXpELHlCQUF5QjtBQUN6QixNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsU0FBUztJQU03QyxZQUNjLFlBQW9CLEVBQVUsMEJBQTBCLEdBQUc7UUFDdkUsS0FBSyxFQUFFLENBQUM7UUFESSxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUFVLDRCQUF1QixHQUF2Qix1QkFBdUIsQ0FBTTtRQUhqRSxxQkFBZ0IsR0FBd0IsRUFBRSxDQUFDO0lBS25ELENBQUM7SUFFRCxjQUFjLENBQUMsaUJBQWlEO1FBQzlELE1BQU0sYUFBYSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQ3BELGlCQUFp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QyxnQkFBZ0IsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUNwQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPO1lBQ0wsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ2pDLHlCQUF5QixFQUFFLElBQUksQ0FBQyx1QkFBdUI7U0FDeEQsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FDYixHQUErQixFQUFFLE1BQWtCO1FBQ3JELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUM7SUFDNUUsQ0FBQzs7QUFqRkQsa0JBQWtCO0FBQ1gsMEJBQVMsR0FBRyxTQUFTLENBQUMsQ0FBRSwrQ0FBK0M7QUFrRmhGLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7ZGlzcG9zZSwgdGlkeX0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4uL29wcy9maWxsJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7c3FydH0gZnJvbSAnLi4vb3BzL3NxcnQnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHtDb25maWdEaWN0LCByZWdpc3RlckNsYXNzLCBTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7TmFtZWRUZW5zb3IsIE5hbWVkVmFyaWFibGVNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7T3B0aW1pemVyLCBPcHRpbWl6ZXJWYXJpYWJsZX0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuXG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgQWRhZ3JhZE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0FkYWdyYWQnOyAgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cblxuICBwcml2YXRlIGFjY3VtdWxhdGVkR3JhZHM6IE9wdGltaXplclZhcmlhYmxlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBsZWFybmluZ1JhdGU6IG51bWJlciwgcHJpdmF0ZSBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSA9IDAuMSkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRWYXJpYWJsZU1hcHxOYW1lZFRlbnNvcltdKSB7XG4gICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgIE9iamVjdC5rZXlzKHZhcmlhYmxlR3JhZGllbnRzKTtcblxuICAgIHZhcmlhYmxlTmFtZXMuZm9yRWFjaCgobmFtZSwgaSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkR3JhZHNbaV0gPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5hY2N1bXVsYXRlZEdyYWRzW2ldID0ge1xuICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vYWNjdW11bGF0b3JgLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KFxuICAgICAgICAgICAgICAoKSA9PiBmaWxsKHZhbHVlLnNoYXBlLCB0aGlzLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjY3VtdWxhdGVkR3JhZCA9IHRoaXMuYWNjdW11bGF0ZWRHcmFkc1tpXS52YXJpYWJsZTtcblxuICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkR3JhZCA9IGFkZChhY2N1bXVsYXRlZEdyYWQsIHNxdWFyZShncmFkaWVudCkpO1xuICAgICAgICBhY2N1bXVsYXRlZEdyYWQuYXNzaWduKG5ld0FjY3VtdWxhdGVkR3JhZCk7XG5cbiAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBhZGQoXG4gICAgICAgICAgICBtdWwoZGl2KGdyYWRpZW50LFxuICAgICAgICAgICAgICAgICAgICBzcXJ0KGFkZChuZXdBY2N1bXVsYXRlZEdyYWQsIEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKSkpKSxcbiAgICAgICAgICAgICAgICAtdGhpcy5sZWFybmluZ1JhdGUpLFxuICAgICAgICAgICAgdmFsdWUpO1xuICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkR3JhZHMgIT0gbnVsbCkge1xuICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFdlaWdodHMoKTogUHJvbWlzZTxOYW1lZFRlbnNvcltdPiB7XG4gICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGVkR3JhZHMubWFwKFxuICAgICAgICB2ID0+ICh7bmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZX0pKSk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmFjY3VtdWxhdGVkR3JhZHMgPSB3ZWlnaHRWYWx1ZXMubWFwKFxuICAgICAgICB2ID0+ICh7b3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpfSkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAnaW5pdGlhbEFjY3VtdWxhdG9yVmFsdWUnOiB0aGlzLmluaXRpYWxBY2N1bXVsYXRvclZhbHVlLFxuICAgIH07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddLCBjb25maWdbJ2luaXRpYWxBY2N1bXVsYXRvclZhbHVlJ10pO1xuICB9XG59XG5yZWdpc3RlckNsYXNzKEFkYWdyYWRPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { pow } from '../ops/pow';\nimport { scalar } from '../ops/scalar';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\nexport class AdamOptimizer extends Optimizer {\n    constructor(learningRate, beta1, beta2, epsilon = null) {\n        super();\n        this.learningRate = learningRate;\n        this.beta1 = beta1;\n        this.beta2 = beta2;\n        this.epsilon = epsilon;\n        this.accumulatedFirstMoment = [];\n        this.accumulatedSecondMoment = [];\n        tidy(() => {\n            // accB* will be updated by batch.\n            this.accBeta1 = scalar(beta1).variable();\n            this.accBeta2 = scalar(beta2).variable();\n        });\n        if (epsilon == null) {\n            this.epsilon = ENGINE.backend.epsilon();\n        }\n    }\n    applyGradients(variableGradients) {\n        const varNames = Array.isArray(variableGradients) ?\n            variableGradients.map(v => v.name) :\n            Object.keys(variableGradients);\n        tidy(() => {\n            const oneMinusAccBeta1 = sub(1, this.accBeta1);\n            const oneMinusAccBeta2 = sub(1, this.accBeta2);\n            varNames.forEach((name, i) => {\n                const value = ENGINE.registeredVariables[name];\n                const trainable = false;\n                if (this.accumulatedFirstMoment[i] == null) {\n                    this.accumulatedFirstMoment[i] = {\n                        originalName: `${name}/m`,\n                        variable: tidy(() => zerosLike(value).variable(trainable))\n                    };\n                }\n                if (this.accumulatedSecondMoment[i] == null) {\n                    this.accumulatedSecondMoment[i] = {\n                        originalName: `${name}/v`,\n                        variable: tidy(() => zerosLike(value).variable(trainable))\n                    };\n                }\n                const gradient = Array.isArray(variableGradients) ?\n                    variableGradients[i].tensor :\n                    variableGradients[name];\n                if (gradient == null) {\n                    return;\n                }\n                const firstMoment = this.accumulatedFirstMoment[i].variable;\n                const secondMoment = this.accumulatedSecondMoment[i].variable;\n                const newFirstMoment = add(mul(firstMoment, this.beta1), mul(gradient, 1 - this.beta1));\n                const newSecondMoment = add(mul(secondMoment, this.beta2), mul(square(gradient), 1 - this.beta2));\n                const biasCorrectedFirstMoment = div(newFirstMoment, oneMinusAccBeta1);\n                const biasCorrectedSecondMoment = div(newSecondMoment, oneMinusAccBeta2);\n                firstMoment.assign(newFirstMoment);\n                secondMoment.assign(newSecondMoment);\n                const newValue = add(mul(div(biasCorrectedFirstMoment, add(sqrt(biasCorrectedSecondMoment), this.epsilon)), -this.learningRate), value);\n                value.assign(newValue);\n            });\n            this.accBeta1.assign(mul(this.accBeta1, this.beta1));\n            this.accBeta2.assign(mul(this.accBeta2, this.beta2));\n        });\n        this.incrementIterations();\n    }\n    dispose() {\n        this.accBeta1.dispose();\n        this.accBeta2.dispose();\n        if (this.accumulatedFirstMoment != null) {\n            dispose(this.accumulatedFirstMoment.map(v => v.variable));\n        }\n        if (this.accumulatedSecondMoment != null) {\n            dispose(this.accumulatedSecondMoment.map(v => v.variable));\n        }\n    }\n    async getWeights() {\n        // Order matters for Python compatibility.\n        const variables = [...this.accumulatedFirstMoment, ...this.accumulatedSecondMoment];\n        return [await this.saveIterations()].concat(variables.map(v => ({ name: v.originalName, tensor: v.variable })));\n    }\n    async setWeights(weightValues) {\n        weightValues = await this.extractIterations(weightValues);\n        tidy(() => {\n            this.accBeta1.assign(pow(this.beta1, this.iterations_ + 1));\n            this.accBeta2.assign(pow(this.beta2, this.iterations_ + 1));\n        });\n        const variableCount = weightValues.length / 2;\n        const trainable = false;\n        this.accumulatedFirstMoment =\n            weightValues.slice(0, variableCount).map(v => ({\n                originalName: v.name,\n                variable: v.tensor.variable(trainable)\n            }));\n        this.accumulatedSecondMoment =\n            weightValues.slice(variableCount, variableCount * 2)\n                .map(v => ({\n                originalName: v.name,\n                variable: v.tensor.variable(trainable)\n            }));\n    }\n    getConfig() {\n        return {\n            'learningRate': this.learningRate,\n            'beta1': this.beta1,\n            'beta2': this.beta2,\n            'epsilon': this.epsilon,\n        };\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config['learningRate'], config['beta1'], config['beta2'], config['epsilon']);\n    }\n}\n/** @nocollapse */\nAdamOptimizer.className = 'Adam'; // Note: Name matters for Python compatibility.\nregisterClass(AdamOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhbV9vcHRpbWl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wdGltaXplcnMvYWRhbV9vcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBYSxhQUFhLEVBQXdDLE1BQU0sa0JBQWtCLENBQUM7QUFJbEcsT0FBTyxFQUFDLFNBQVMsRUFBb0IsTUFBTSxhQUFhLENBQUM7QUFFekQsTUFBTSxPQUFPLGFBQWMsU0FBUSxTQUFTO0lBUzFDLFlBQ2MsWUFBb0IsRUFBWSxLQUFhLEVBQzdDLEtBQWEsRUFBWSxVQUFrQixJQUFJO1FBQzNELEtBQUssRUFBRSxDQUFDO1FBRkksaUJBQVksR0FBWixZQUFZLENBQVE7UUFBWSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQzdDLFVBQUssR0FBTCxL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Q2xCLE1BQU0sQ0FBQyxVQUFVLENBQ2IsR0FBK0IsRUFBRSxNQUFrQjtRQUNyRCxPQUFPLElBQUksR0FBRyxDQUNWLE1BQU0sQ0FBQyxjQUFjLENBQUMsRUFBRSxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUN4RCxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQztJQUN6QixDQUFDOztBQTlJRCxrQkFBa0I7QUFDWCx1QkFBUyxHQUFHLE1BQU0sQ0FBQyxDQUFFLCtDQUErQztBQStJN0UsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VOR0lORX0gZnJvbSAnLi4vZW5naW5lJztcbmltcG9ydCB7ZGlzcG9zZSwgdGlkeX0gZnJvbSAnLi4vZ2xvYmFscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3Bvd30gZnJvbSAnLi4vb3BzL3Bvdyc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3NxcnR9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9vcHMvc3ViJztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge0NvbmZpZ0RpY3QsIHJlZ2lzdGVyQ2xhc3MsIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlQ29uc3RydWN0b3J9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHtWYXJpYWJsZX0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3IsIE5hbWVkVmFyaWFibGVNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7T3B0aW1pemVyLCBPcHRpbWl6ZXJWYXJpYWJsZX0gZnJvbSAnLi9vcHRpbWl6ZXInO1xuXG5leHBvcnQgY2xhc3MgQWRhbU9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0FkYW0nOyAgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgcHJpdmF0ZSBhY2NCZXRhMTogVmFyaWFibGU7XG4gIHByaXZhdGUgYWNjQmV0YTI6IFZhcmlhYmxlO1xuXG4gIHByaXZhdGUgYWNjdW11bGF0ZWRGaXJzdE1vbWVudDogT3B0aW1pemVyVmFyaWFibGVbXSA9IFtdO1xuICBwcml2YXRlIGFjY3VtdWxhdGVkU2Vjb25kTW9tZW50OiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgbGVhcm5pbmdSYXRlOiBudW1iZXIsIHByb3RlY3RlZCBiZXRhMTogbnVtYmVyLFxuICAgICAgcHJvdGVjdGVkIGJldGEyOiBudW1iZXIsIHByb3RlY3RlZCBlcHNpbG9uOiBudW1iZXIgPSBudWxsKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aWR5KCgpID0+IHtcbiAgICAgIC8vIGFjY0IqIHdpbGwgYmUgdXBkYXRlZCBieSBiYXRjaC5cbiAgICAgIHRoaXMuYWNjQmV0YTEgPSBzY2FsYXIoYmV0YTEpLnZhcmlhYmxlKCk7XG4gICAgICB0aGlzLmFjY0JldGEyID0gc2NhbGFyKGJldGEyKS52YXJpYWJsZSgpO1xuICAgIH0pO1xuXG4gICAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgICAgdGhpcy5lcHNpbG9uID0gRU5HSU5FLmJhY2tlbmQuZXBzaWxvbigpO1xuICAgIH1cbiAgfVxuXG4gIGFwcGx5R3JhZGllbnRzKHZhcmlhYmxlR3JhZGllbnRzOiBOYW1lZFZhcmlhYmxlTWFwfE5hbWVkVGVuc29yW10pIHtcbiAgICBjb25zdCB2YXJOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKHYgPT4gdi5uYW1lKSA6XG4gICAgICAgIE9iamVjdC5rZXlzKHZhcmlhYmxlR3JhZGllbnRzKTtcbiAgICB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IG9uZU1pbnVzQWNjQmV0YTEgPSBzdWIoMSwgdGhpcy5hY2NCZXRhMSk7XG4gICAgICBjb25zdCBvbmVNaW51c0FjY0JldGEyID0gc3ViKDEsIHRoaXMuYWNjQmV0YTIpO1xuXG4gICAgICB2YXJOYW1lcy5mb3JFYWNoKChuYW1lLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICAgIGNvbnN0IHRyYWluYWJsZSA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldID09IG51bGwpIHtcbiAgICAgICAgICB0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnRbaV0gPSB7XG4gICAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L21gLFxuICAgICAgICAgICAgdmFyaWFibGU6IHRpZHkoKCkgPT4gemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnRbaV0gPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRTZWNvbmRNb21lbnRbaV0gPSB7XG4gICAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L3ZgLFxuICAgICAgICAgICAgdmFyaWFibGU6IHRpZHkoKCkgPT4gemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpKVxuICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBncmFkaWVudCA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgICAgaWYgKGdyYWRpZW50ID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmaXJzdE1vbWVudCA9IHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXS52YXJpYWJsZTtcbiAgICAgICAgY29uc3Qgc2Vjb25kTW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudFtpXS52YXJpYWJsZTtcblxuICAgICAgICBjb25zdCBuZXdGaXJzdE1vbWVudCA9XG4gICAgICAgICAgICBhZGQobXVsKGZpcnN0TW9tZW50LCB0aGlzLmJldGExKSwgbXVsKGdyYWRpZW50LCAxIC0gdGhpcy5iZXRhMSkpO1xuICAgICAgICBjb25zdCBuZXdTZWNvbmRNb21lbnQgPVxuICAgICAgICAgICAgYWRkKG11bChzZWNvbmRNb21lbnQsIHRoaXMuYmV0YTIpLFxuICAgICAgICAgICAgICAgIG11bChzcXVhcmUoZ3JhZGllbnQpLCAxIC0gdGhpcy5iZXRhMikpO1xuXG4gICAgICAgIGNvbnN0IGJpYXNDb3JyZWN0ZWRGaXJzdE1vbWVudCA9IGRpdihuZXdGaXJzdE1vbWVudCwgb25lTWludXNBY2NCZXRhMSk7XG4gICAgICAgIGNvbnN0IGJpYXNDb3JyZWN0ZWRTZWNvbmRNb21lbnQgPVxuICAgICAgICAgICAgZGl2KG5ld1NlY29uZE1vbWVudCwgb25lTWludXNBY2NCZXRhMik7XG5cbiAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgc2Vjb25kTW9tZW50LmFzc2lnbihuZXdTZWNvbmRNb21lbnQpO1xuXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgICAgIGFkZChtdWwoZGl2KGJpYXNDb3JyZWN0ZWRGaXJzdE1vbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFkZChzcXJ0KGJpYXNDb3JyZWN0ZWRTZWNvbmRNb21lbnQpLCB0aGlzLmVwc2lsb24pKSxcbiAgICAgICAgICAgICAgICAgICAgLXRoaXMubGVhcm5pbmdSYXRlKSxcbiAgICAgICAgICAgICAgICB2YWx1ZSk7XG4gICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24obXVsKHRoaXMuYWNjQmV0YTEsIHRoaXMuYmV0YTEpKTtcbiAgICAgIHRoaXMuYWNjQmV0YTIuYXNzaWduKG11bCh0aGlzLmFjY0JldGEyLCB0aGlzLmJldGEyKSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMuYWNjQmV0YTEuZGlzcG9zZSgpO1xuICAgIHRoaXMuYWNjQmV0YTIuZGlzcG9zZSgpO1xuXG4gICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50ICE9IG51bGwpIHtcbiAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0V2VpZ2h0cygpOiBQcm9taXNlPE5hbWVkVGVuc29yW10+IHtcbiAgICAvLyBPcmRlciBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgICBjb25zdCB2YXJpYWJsZXM6IE9wdGltaXplclZhcmlhYmxlW10gPVxuICAgICAgICBbLi4udGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50LCAuLi50aGlzLmFjY3VtdWxhdGVkU2Vjb25kTW9tZW50XTtcbiAgICByZXR1cm4gW2F3YWl0IHRoaXMuc2F2ZUl0ZXJhdGlvbnMoKV0uY29uY2F0KFxuICAgICAgICB2YXJpYWJsZXMubWFwKHYgPT4gKHtuYW1lOiB2Lm9yaWdpbmFsTmFtZSwgdGVuc29yOiB2LnZhcmlhYmxlfSkpKTtcbiAgfVxuXG4gIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzOiBOYW1lZFRlbnNvcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24ocG93KHRoaXMuYmV0YTEsIHRoaXMuaXRlcmF0aW9uc18gKyAxKSk7XG4gICAgICB0aGlzLmFjY0JldGEyLmFzc2lnbihwb3codGhpcy5iZXRhMiwgdGhpcy5pdGVyYXRpb25zXyArIDEpKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHZhcmlhYmxlQ291bnQgPSB3ZWlnaHRWYWx1ZXMubGVuZ3RoIC8gMjtcbiAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnQgPVxuICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UoMCwgdmFyaWFibGVDb3VudCkubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluYWJsZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgdGhpcy5hY2N1bXVsYXRlZFNlY29uZE1vbWVudCA9XG4gICAgICAgIHdlaWdodFZhbHVlcy5zbGljZSh2YXJpYWJsZUNvdW50LCB2YXJpYWJsZUNvdW50ICogMilcbiAgICAgICAgICAgIC5tYXAodiA9PiAoe1xuICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgIH0pKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBDb25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgJ2JldGExJzogdGhpcy5iZXRhMSxcbiAgICAgICdiZXRhMic6IHRoaXMuYmV0YTIsXG4gICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvbixcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBTZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPiwgY29uZmlnOiBDb25maWdEaWN0KTogVCB7XG4gICAgcmV0dXJuIG5ldyBjbHMoXG4gICAgICAgIGNvbmZpZ1snbGVhcm5pbmdSYXRlJ10sIGNvbmZpZ1snYmV0YTEnXSwgY29uZmlnWydiZXRhMiddLFxuICAgICAgICBjb25maWdbJ2Vwc2lsb24nXSk7XG4gIH1cbn1cbnJlZ2lzdGVyQ2xhc3MoQWRhbU9wdGltaXplcik7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { abs } from '../ops/abs';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { maximum } from '../ops/maximum';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\nexport class AdamaxOptimizer extends Optimizer {\n    constructor(learningRate, beta1, beta2, epsilon = null, decay = 0.0) {\n        super();\n        this.learningRate = learningRate;\n        this.beta1 = beta1;\n        this.beta2 = beta2;\n        this.epsilon = epsilon;\n        this.decay = decay;\n        this.accumulatedFirstMoment = [];\n        this.accumulatedWeightedInfNorm = [];\n        tidy(() => {\n            this.iteration = scalar(0).variable();\n            this.accBeta1 = scalar(beta1).variable();\n        });\n        if (epsilon == null) {\n            this.epsilon = ENGINE.backend.epsilon();\n        }\n    }\n    applyGradients(variableGradients) {\n        const variableNames = Array.isArray(variableGradients) ?\n            variableGradients.map(item => item.name) :\n            Object.keys(variableGradients);\n        tidy(() => {\n            const oneMinusAccBeta1 = sub(1, this.accBeta1);\n            const lr = div(-this.learningRate, add(mul(this.iteration, this.decay), 1));\n            variableNames.forEach((name, i) => {\n                const value = ENGINE.registeredVariables[name];\n                const trainable = false;\n                if (this.accumulatedFirstMoment[i] == null) {\n                    this.accumulatedFirstMoment[i] = {\n                        originalName: `${name}/m`,\n                        variable: zerosLike(value).variable(trainable)\n                    };\n                }\n                if (this.accumulatedWeightedInfNorm[i] == null) {\n                    this.accumulatedWeightedInfNorm[i] = {\n                        originalName: `${name}/v`,\n                        variable: zerosLike(value).variable(trainable)\n                    };\n                }\n                const gradient = Array.isArray(variableGradients) ?\n                    variableGradients[i].tensor :\n                    variableGradients[name];\n                if (gradient == null) {\n                    return;\n                }\n                const firstMoment = this.accumulatedFirstMoment[i].variable;\n                const weightedInfNorm = this.accumulatedWeightedInfNorm[i].variable;\n                const newFirstMoment = add(mul(firstMoment, this.beta1), mul(gradient, 1 - this.beta1));\n                const ut0 = mul(weightedInfNorm, this.beta2);\n                const ut1 = abs(gradient);\n                const newWeightedInfNorm = maximum(ut0, ut1);\n                firstMoment.assign(newFirstMoment);\n                weightedInfNorm.assign(newWeightedInfNorm);\n                const newValue = add(mul(div(lr, oneMinusAccBeta1), div(newFirstMoment, add(newWeightedInfNorm, this.epsilon))), value);\n                value.assign(newValue);\n            });\n            this.iteration.assign(add(this.iteration, 1));\n            this.accBeta1.assign(mul(this.accBeta1, this.beta1));\n        });\n        this.incrementIterations();\n    }\n    dispose() {\n        this.accBeta1.dispose();\n        this.iteration.dispose();\n        if (this.accumulatedFirstMoment != null) {\n            dispose(this.accumulatedFirstMoment.map(v => v.variable));\n        }\n        if (this.accumulatedWeightedInfNorm != null) {\n            dispose(this.accumulatedWeightedInfNorm.map(v => v.variable));\n        }\n    }\n    async getWeights() {\n        throw new Error('getWeights() is not implemented for Adamax yet.');\n    }\n    async setWeights(weightValues) {\n        throw new Error('setWeights() is not implemented for Adamax yet.');\n    }\n    getConfig() {\n        return {\n            'learningRate': this.learningRate,\n            'beta1': this.beta1,\n            'beta2': this.beta2,\n            'epsilon': this.epsilon,\n            'decay': this.decay\n        };\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config['learningRate'], config['beta1'], config['beta2'], config['epsilon'], config['decay']);\n    }\n}\n/** @nocollapse */\nAdamaxOptimizer.className = 'Adamax'; // Note: Name matters for Python compatbility.\nregisterClass(AdamaxOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRhbWF4X29wdGltaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3B0aW1pemVycy9hZGFtYXhfb3B0aW1pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQWEsYUFBYSxFQUF3QyxNQUFNLGtCQUFrQixDQUFDO0FBSWxHLE9BQU8sRUFBQyxTQUFTLEVBQW9CLE1BQU0sYUFBYSxDQUFDO0FBRXpELE1BQU0sT0FBTyxlQUFnQixTQUFRLFNBQVM7SUFTNUMsWUFDYyxZQUFvQixFQUFZLEtBQWEsRUFDN0MsS0FBYSxFQUFZLFVBQWtCLElBQUksRUFDL0MsUUFBUSxHQUFHO1FBQ3ZCLEtBQUssRUFBRSxDQUFDO1FBSEksaUJBQVksR0FBWixZQUFZLENBQVE7UUFBWSxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQzdDLFVBQUssR0FBTCxLQUFLLENBQVE7UUFBWSxZQUFP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eUJBQVMsR0FBRyxRQUFRLENBQUMsQ0FBRSw4Q0FBOEM7QUEwSDlFLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2Rpc3Bvc2UsIHRpZHl9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHthYnN9IGZyb20gJy4uL29wcy9hYnMnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHttYXhpbXVtfSBmcm9tICcuLi9vcHMvbWF4aW11bSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtDb25maWdEaWN0LCByZWdpc3RlckNsYXNzLCBTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7VmFyaWFibGV9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yLCBOYW1lZFZhcmlhYmxlTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuXG5pbXBvcnQge09wdGltaXplciwgT3B0aW1pemVyVmFyaWFibGV9IGZyb20gJy4vb3B0aW1pemVyJztcblxuZXhwb3J0IGNsYXNzIEFkYW1heE9wdGltaXplciBleHRlbmRzIE9wdGltaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0FkYW1heCc7ICAvLyBOb3RlOiBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRiaWxpdHkuXG4gIHByaXZhdGUgYWNjQmV0YTE6IFZhcmlhYmxlO1xuICBwcml2YXRlIGl0ZXJhdGlvbjogVmFyaWFibGU7XG5cbiAgcHJpdmF0ZSBhY2N1bXVsYXRlZEZpcnN0TW9tZW50OiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRXZWlnaHRlZEluZk5vcm06IE9wdGltaXplclZhcmlhYmxlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBsZWFybmluZ1JhdGU6IG51bWJlciwgcHJvdGVjdGVkIGJldGExOiBudW1iZXIsXG4gICAgICBwcm90ZWN0ZWQgYmV0YTI6IG51bWJlciwgcHJvdGVjdGVkIGVwc2lsb246IG51bWJlciA9IG51bGwsXG4gICAgICBwcm90ZWN0ZWQgZGVjYXkgPSAwLjApIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLml0ZXJhdGlvbiA9IHNjYWxhcigwKS52YXJpYWJsZSgpO1xuICAgICAgdGhpcy5hY2NCZXRhMSA9IHNjYWxhcihiZXRhMSkudmFyaWFibGUoKTtcbiAgICB9KTtcblxuICAgIGlmIChlcHNpbG9uID09IG51bGwpIHtcbiAgICAgIHRoaXMuZXBzaWxvbiA9IEVOR0lORS5iYWNrZW5kLmVwc2lsb24oKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRWYXJpYWJsZU1hcHxOYW1lZFRlbnNvcltdKSB7XG4gICAgY29uc3QgdmFyaWFibGVOYW1lcyA9IEFycmF5LmlzQXJyYXkodmFyaWFibGVHcmFkaWVudHMpID9cbiAgICAgICAgdmFyaWFibGVHcmFkaWVudHMubWFwKGl0ZW0gPT4gaXRlbS5uYW1lKSA6XG4gICAgICAgIE9iamVjdC5rZXlzKHZhcmlhYmxlR3JhZGllbnRzKTtcblxuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3Qgb25lTWludXNBY2NCZXRhMSA9IHN1YigxLCB0aGlzLmFjY0JldGExKTtcbiAgICAgIGNvbnN0IGxyID1cbiAgICAgICAgICBkaXYoLXRoaXMubGVhcm5pbmdSYXRlLCBhZGQobXVsKHRoaXMuaXRlcmF0aW9uLCB0aGlzLmRlY2F5KSwgMSkpO1xuXG4gICAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBFTkdJTkUucmVnaXN0ZXJlZFZhcmlhYmxlc1tuYW1lXTtcbiAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkRmlyc3RNb21lbnRbaV0gPT0gbnVsbCkge1xuICAgICAgICAgIHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudFtpXSA9IHtcbiAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWAsXG4gICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtpXSA9PSBudWxsKSB7XG4gICAgICAgICAgdGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybVtpXSA9IHtcbiAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vdmAsXG4gICAgICAgICAgICB2YXJpYWJsZTogemVyb3NMaWtlKHZhbHVlKS52YXJpYWJsZSh0cmFpbmFibGUpXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW25hbWVdO1xuICAgICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGZpcnN0TW9tZW50ID0gdGhpcy5hY2N1bXVsYXRlZEZpcnN0TW9tZW50W2ldLnZhcmlhYmxlO1xuICAgICAgICBjb25zdCB3ZWlnaHRlZEluZk5vcm0gPSB0aGlzLmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtW2ldLnZhcmlhYmxlO1xuXG4gICAgICAgIGNvbnN0IG5ld0ZpcnN0TW9tZW50ID1cbiAgICAgICAgICAgIGFkZChtdWwoZmlyc3RNb21lbnQsIHRoaXMuYmV0YTEpLCBtdWwoZ3JhZGllbnQsIDEgLSB0aGlzLmJldGExKSk7XG5cbiAgICAgICAgY29uc3QgdXQwID0gbXVsKHdlaWdodGVkSW5mTm9ybSwgdGhpcy5iZXRhMik7XG4gICAgICAgIGNvbnN0IHV0MSA9IGFicyhncmFkaWVudCk7XG5cbiAgICAgICAgY29uc3QgbmV3V2VpZ2h0ZWRJbmZOb3JtID0gbWF4aW11bSh1dDAsIHV0MSk7XG5cbiAgICAgICAgZmlyc3RNb21lbnQuYXNzaWduKG5ld0ZpcnN0TW9tZW50KTtcbiAgICAgICAgd2VpZ2h0ZWRJbmZOb3JtLmFzc2lnbihuZXdXZWlnaHRlZEluZk5vcm0pO1xuXG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID1cbiAgICAgICAgICAgIGFkZChtdWwoZGl2KGxyLCBvbmVNaW51c0FjY0JldGExKSxcbiAgICAgICAgICAgICAgICAgICAgZGl2KG5ld0ZpcnN0TW9tZW50LCBhZGQobmV3V2VpZ2h0ZWRJbmZOb3JtLCB0aGlzLmVwc2lsb24pKSksXG4gICAgICAgICAgICAgICAgdmFsdWUpO1xuXG4gICAgICAgIHZhbHVlLmFzc2lnbihuZXdWYWx1ZSk7XG4gICAgICB9KTtcblxuICAgICAgdGhpcy5pdGVyYXRpb24uYXNzaWduKGFkZCh0aGlzLml0ZXJhdGlvbiwgMSkpO1xuICAgICAgdGhpcy5hY2NCZXRhMS5hc3NpZ24obXVsKHRoaXMuYWNjQmV0YTEsIHRoaXMuYmV0YTEpKTtcbiAgICB9KTtcbiAgICB0aGlzLmluY3JlbWVudEl0ZXJhdGlvbnMoKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5hY2NCZXRhMS5kaXNwb3NlKCk7XG4gICAgdGhpcy5pdGVyYXRpb24uZGlzcG9zZSgpO1xuXG4gICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudCAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRGaXJzdE1vbWVudC5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkV2VpZ2h0ZWRJbmZOb3JtICE9IG51bGwpIHtcbiAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZFdlaWdodGVkSW5mTm9ybS5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZ2V0V2VpZ2h0cygpOiBQcm9taXNlPE5hbWVkVGVuc29yW10+IHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2dldFdlaWdodHMoKSBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEFkYW1heCB5ZXQuJyk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRocm93IG5ldyBFcnJvcignc2V0V2VpZ2h0cygpIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgQWRhbWF4IHlldC4nKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBDb25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgJ2xlYXJuaW5nUmF0ZSc6IHRoaXMubGVhcm5pbmdSYXRlLFxuICAgICAgJ2JldGExJzogdGhpcy5iZXRhMSxcbiAgICAgICdiZXRhMic6IHRoaXMuYmV0YTIsXG4gICAgICAnZXBzaWxvbic6IHRoaXMuZXBzaWxvbixcbiAgICAgICdkZWNheSc6IHRoaXMuZGVjYXlcbiAgICB9O1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBTZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBTZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPiwgY29uZmlnOiBDb25maWdEaWN0KTogVCB7XG4gICAgcmV0dXJuIG5ldyBjbHMoXG4gICAgICAgIGNvbmZpZ1snbGVhcm5pbmdSYXRlJ10sIGNvbmZpZ1snYmV0YTEnXSwgY29uZmlnWydiZXRhMiddLFxuICAgICAgICBjb25maWdbJ2Vwc2lsb24nXSwgY29uZmlnWydkZWNheSddKTtcbiAgfVxufVxucmVnaXN0ZXJDbGFzcyhBZGFtYXhPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { keep, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\n/** @doclink Optimizer */\nexport class SGDOptimizer extends Optimizer {\n    constructor(learningRate) {\n        super();\n        this.learningRate = learningRate;\n        this.setLearningRate(learningRate);\n    }\n    applyGradients(variableGradients) {\n        const varNames = Array.isArray(variableGradients) ?\n            variableGradients.map(v => v.name) :\n            Object.keys(variableGradients);\n        varNames.forEach((name, i) => {\n            const gradient = Array.isArray(variableGradients) ?\n                variableGradients[i].tensor :\n                variableGradients[name];\n            if (gradient == null) {\n                return;\n            }\n            const value = ENGINE.registeredVariables[name];\n            tidy(() => {\n                const newValue = add(mul(this.c, gradient), value);\n                value.assign(newValue);\n            });\n        });\n        this.incrementIterations();\n    }\n    /**\n     * Sets the learning rate of the optimizer.\n     */\n    setLearningRate(learningRate) {\n        this.learningRate = learningRate;\n        if (this.c != null) {\n            this.c.dispose();\n        }\n        this.c = keep(scalar(-learningRate));\n    }\n    dispose() {\n        this.c.dispose();\n    }\n    async getWeights() {\n        return [await this.saveIterations()];\n    }\n    async setWeights(weightValues) {\n        weightValues = await this.extractIterations(weightValues);\n        if (weightValues.length !== 0) {\n            throw new Error('SGD optimizer does not have settable weights.');\n        }\n    }\n    getConfig() {\n        return { 'learningRate': this.learningRate };\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config['learningRate']);\n    }\n}\n/** @nocollapse */\nSGDOptimizer.className = 'SGD'; // Note: Name matters for Python compatibility.\nregisterClass(SGDOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2dkX29wdGltaXplci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDdEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFhLGFBQWEsRUFBd0MsTUFBTSxrQkFBa0IsQ0FBQztBQUlsRyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLHlCQUF5QjtBQUN6QixNQUFNLE9BQU8sWUFBYSxTQUFRLFNBQVM7SUFLekMsWUFBc0IsWUFBb0I7UUFDeEMsS0FBSyxFQUFFLENBQUM7UUFEWSxpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUV4QyxJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ3JDLENBQUM7SUFFRCxjQUFjLENBQUMsaUJBQStDO1FBQzVELE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO1lBQy9DLGlCQUFpQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUNuQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNCLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO2dCQUMvQyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDN0IsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDNUIsSUFBSSxRQUFRLElBQUksSUFBSSxFQUFFO2dCQUNwQixPQUFPO2FBQ1I7WUFDRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDUixNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7Z0JBQ25ELEtBQUssQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDekIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFRDs7T0FFRztJQUNILGVBQWUsQ0FBQyxZQUFvQjtRQUNsQyxJQUFJLENBQUMsWUFBWSxHQUFHLFlBQVksQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2xCLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDbEI7UUFDRCxJQUFJLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUNuQixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVU7UUFDZCxPQUFPLENBQUMsTUFBTSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUMsQ0FBQztJQUN2QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQVUsQ0FBQyxZQUEyQjtRQUMxQyxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDMUQsSUFBSSxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7U0FDbEU7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLE9BQU8sRUFBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBQyxDQUFDO0lBQzdDLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FDYixHQUErQixFQUFFLE1BQWtCO1FBQ3JELE9BQU8sSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDekMsQ0FBQzs7QUEvREQsa0JBQWtCO0FBQ1gsc0JBQVMsR0FBRyxLQUFLLENBQUMsQ0FBRSwrQ0FBK0M7QUFnRTVFLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2tlZXAsIHRpZHl9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtDb25maWdEaWN0LCByZWdpc3RlckNsYXNzLCBTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7U2NhbGFyfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvciwgTmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7T3B0aW1pemVyfSBmcm9tICcuL29wdGltaXplcic7XG5cbi8qKiBAZG9jbGluayBPcHRpbWl6ZXIgKi9cbmV4cG9ydCBjbGFzcyBTR0RPcHRpbWl6ZXIgZXh0ZW5kcyBPcHRpbWl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdTR0QnOyAgLy8gTm90ZTogTmFtZSBtYXR0ZXJzIGZvciBQeXRob24gY29tcGF0aWJpbGl0eS5cbiAgcHJvdGVjdGVkIGM6IFNjYWxhcjtcblxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgbGVhcm5pbmdSYXRlOiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2V0TGVhcm5pbmdSYXRlKGxlYXJuaW5nUmF0ZSk7XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRUZW5zb3JNYXB8TmFtZWRUZW5zb3JbXSkge1xuICAgIGNvbnN0IHZhck5hbWVzID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICB2YXJpYWJsZUdyYWRpZW50cy5tYXAodiA9PiB2Lm5hbWUpIDpcbiAgICAgICAgT2JqZWN0LmtleXModmFyaWFibGVHcmFkaWVudHMpO1xuICAgIHZhck5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB2YWx1ZSA9IEVOR0lORS5yZWdpc3RlcmVkVmFyaWFibGVzW25hbWVdO1xuICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gYWRkKG11bCh0aGlzLmMsIGdyYWRpZW50KSwgdmFsdWUpO1xuICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyB0aGUgbGVhcm5pbmcgcmF0ZSBvZiB0aGUgb3B0aW1pemVyLlxuICAgKi9cbiAgc2V0TGVhcm5pbmdSYXRlKGxlYXJuaW5nUmF0ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5sZWFybmluZ1JhdGUgPSBsZWFybmluZ1JhdGU7XG4gICAgaWYgKHRoaXMuYyAhPSBudWxsKSB7XG4gICAgICB0aGlzLmMuZGlzcG9zZSgpO1xuICAgIH1cbiAgICB0aGlzLmMgPSBrZWVwKHNjYWxhcigtbGVhcm5pbmdSYXRlKSk7XG4gIH1cblxuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuYy5kaXNwb3NlKCk7XG4gIH1cblxuICBhc3luYyBnZXRXZWlnaHRzKCk6IFByb21pc2U8TmFtZWRUZW5zb3JbXT4ge1xuICAgIHJldHVybiBbYXdhaXQgdGhpcy5zYXZlSXRlcmF0aW9ucygpXTtcbiAgfVxuXG4gIGFzeW5jIHNldFdlaWdodHMod2VpZ2h0VmFsdWVzOiBOYW1lZFRlbnNvcltdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgd2VpZ2h0VmFsdWVzID0gYXdhaXQgdGhpcy5leHRyYWN0SXRlcmF0aW9ucyh3ZWlnaHRWYWx1ZXMpO1xuICAgIGlmICh3ZWlnaHRWYWx1ZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NHRCBvcHRpbWl6ZXIgZG9lcyBub3QgaGF2ZSBzZXR0YWJsZSB3ZWlnaHRzLicpO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmZpZygpOiBDb25maWdEaWN0IHtcbiAgICByZXR1cm4geydsZWFybmluZ1JhdGUnOiB0aGlzLmxlYXJuaW5nUmF0ZX07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhjb25maWdbJ2xlYXJuaW5nUmF0ZSddKTtcbiAgfVxufVxucmVnaXN0ZXJDbGFzcyhTR0RPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { SGDOptimizer } from './sgd_optimizer';\n/** @doclink Optimizer */\nexport class MomentumOptimizer extends SGDOptimizer {\n    constructor(learningRate, momentum, useNesterov = false) {\n        super(learningRate);\n        this.learningRate = learningRate;\n        this.momentum = momentum;\n        this.useNesterov = useNesterov;\n        this.accumulations = [];\n        this.m = scalar(this.momentum);\n    }\n    applyGradients(variableGradients) {\n        const variableNames = Array.isArray(variableGradients) ?\n            variableGradients.map(item => item.name) :\n            Object.keys(variableGradients);\n        variableNames.forEach((name, i) => {\n            const value = ENGINE.registeredVariables[name];\n            if (this.accumulations[i] == null) {\n                const trainable = false;\n                this.accumulations[i] = {\n                    originalName: `${name}/momentum`,\n                    variable: tidy(() => zerosLike(value).variable(trainable))\n                };\n            }\n            const accumulation = this.accumulations[i].variable;\n            const gradient = Array.isArray(variableGradients) ?\n                variableGradients[i].tensor :\n                variableGradients[name];\n            if (gradient == null) {\n                return;\n            }\n            tidy(() => {\n                let newValue;\n                const newAccumulation = add(mul(this.m, accumulation), gradient);\n                if (this.useNesterov) {\n                    newValue = add(mul(this.c, add(gradient, mul(newAccumulation, this.m))), value);\n                }\n                else {\n                    newValue = add(mul(this.c, newAccumulation), value);\n                }\n                accumulation.assign(newAccumulation);\n                value.assign(newValue);\n            });\n        });\n        this.incrementIterations();\n    }\n    dispose() {\n        this.m.dispose();\n        if (this.accumulations != null) {\n            dispose(this.accumulations.map(v => v.variable));\n        }\n    }\n    /**\n     * Sets the momentum of the optimizer.\n     *\n     * @param momentum\n     */\n    setMomentum(momentum) {\n        this.momentum = momentum;\n    }\n    async getWeights() {\n        // Order matters for Python compatibility.\n        return [await this.saveIterations()].concat(this.accumulations.map(v => ({ name: v.originalName, tensor: v.variable })));\n    }\n    async setWeights(weightValues) {\n        weightValues = await this.extractIterations(weightValues);\n        const trainable = false;\n        this.accumulations = weightValues.map(v => ({ originalName: v.name, variable: v.tensor.variable(trainable) }));\n    }\n    getConfig() {\n        return {\n            'learningRate': this.learningRate,\n            'momentum': this.momentum,\n            'useNesterov': this.useNesterov\n        };\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config['learningRate'], config['momentum'], config['useNesterov']);\n    }\n}\n/** @nocollapse */\nMomentumOptimizer.className = 'Momentum'; // Name matters for Python compatibility.\nregisterClass(MomentumOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9tZW50dW1fb3B0aW1pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUUsSUFBSSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEVBQWEsYUFBYSxFQUF3QyxNQUFNLGtCQUFrQixDQUFDO0FBS2xHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUU3Qyx5QkFBeUI7QUFDekIsTUFBTSxPQUFPLGlCQUFrQixTQUFRLFlBQVk7SUFNakQsWUFDYyxZQUFvQixFQUFVLFFBQWdCLEVBQ2hELGNBQWMsS0FBSztRQUM3QixLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFGUixpQkFBWSxHQUFaLFlBQVksQ0FBUTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVE7UUFDaEQsZ0JBQVcsR0FBWCxXQUFXLENBQVE7UUFKdkIsa0JBQWEsR0FBd0IsRUFBRSxDQUFDO1FBTTlDLElBQUksQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNqQyxDQUFDO0lBRUQsY0FBYyxDQUFDLGlCQUFpRDtRQUM5RCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGlCQUFpQixD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QUMsRUFBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRCxLQUFLLENBQUMsVUFBVSxDQUFDLFlBQTJCO1FBQzFDLFlBQVksR0FBRyxNQUFNLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxRCxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxZQUFZLENBQUMsR0FBRyxDQUNqQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsQ0FBQztJQUVELFNBQVM7UUFDUCxPQUFPO1lBQ0wsY0FBYyxFQUFFLElBQUksQ0FBQyxZQUFZO1lBQ2pDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN6QixhQUFhLEVBQUUsSUFBSSxDQUFDLFdBQVc7U0FDaEMsQ0FBQztJQUNKLENBQUM7SUFFRCxrQkFBa0I7SUFDbEIsTUFBTSxDQUFDLFVBQVUsQ0FDYixHQUErQixFQUFFLE1BQWtCO1FBQ3JELE9BQU8sSUFBSSxHQUFHLENBQ1YsTUFBTSxDQUFDLGNBQWMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFBRSxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDOztBQTdGRCxrQkFBa0I7QUFDWCwyQkFBUyxHQUFHLFVBQVUsQ0FBQyxDQUFFLHlDQUF5QztBQThGM0UsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtkaXNwb3NlLCB0aWR5fSBmcm9tICcuLi9nbG9iYWxzJztcbmltcG9ydCB7YWRkfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7c2NhbGFyfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge0NvbmZpZ0RpY3QsIHJlZ2lzdGVyQ2xhc3MsIFNlcmlhbGl6YWJsZSwgU2VyaWFsaXphYmxlQ29uc3RydWN0b3J9IGZyb20gJy4uL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHtTY2FsYXIsIFRlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3IsIE5hbWVkVmFyaWFibGVNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7T3B0aW1pemVyVmFyaWFibGV9IGZyb20gJy4vb3B0aW1pemVyJztcbmltcG9ydCB7U0dET3B0aW1pemVyfSBmcm9tICcuL3NnZF9vcHRpbWl6ZXInO1xuXG4vKiogQGRvY2xpbmsgT3B0aW1pemVyICovXG5leHBvcnQgY2xhc3MgTW9tZW50dW1PcHRpbWl6ZXIgZXh0ZW5kcyBTR0RPcHRpbWl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdNb21lbnR1bSc7ICAvLyBOYW1lIG1hdHRlcnMgZm9yIFB5dGhvbiBjb21wYXRpYmlsaXR5LlxuICBwcml2YXRlIG06IFNjYWxhcjtcbiAgcHJpdmF0ZSBhY2N1bXVsYXRpb25zOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgbGVhcm5pbmdSYXRlOiBudW1iZXIsIHByaXZhdGUgbW9tZW50dW06IG51bWJlcixcbiAgICAgIHByaXZhdGUgdXNlTmVzdGVyb3YgPSBmYWxzZSkge1xuICAgIHN1cGVyKGxlYXJuaW5nUmF0ZSk7XG4gICAgdGhpcy5tID0gc2NhbGFyKHRoaXMubW9tZW50dW0pO1xuICB9XG5cbiAgYXBwbHlHcmFkaWVudHModmFyaWFibGVHcmFkaWVudHM6IE5hbWVkVmFyaWFibGVNYXB8TmFtZWRUZW5zb3JbXSkge1xuICAgIGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG5cbiAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICBpZiAodGhpcy5hY2N1bXVsYXRpb25zW2ldID09IG51bGwpIHtcbiAgICAgICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0aW9uc1tpXSA9IHtcbiAgICAgICAgICBvcmlnaW5hbE5hbWU6IGAke25hbWV9L21vbWVudHVtYCxcbiAgICAgICAgICB2YXJpYWJsZTogdGlkeSgoKSA9PiB6ZXJvc0xpa2UodmFsdWUpLnZhcmlhYmxlKHRyYWluYWJsZSkpXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGFjY3VtdWxhdGlvbiA9IHRoaXMuYWNjdW11bGF0aW9uc1tpXS52YXJpYWJsZTtcbiAgICAgIGNvbnN0IGdyYWRpZW50ID0gQXJyYXkuaXNBcnJheSh2YXJpYWJsZUdyYWRpZW50cykgP1xuICAgICAgICAgIHZhcmlhYmxlR3JhZGllbnRzW2ldLnRlbnNvciA6XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbbmFtZV07XG4gICAgICBpZiAoZ3JhZGllbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIHRpZHkoKCkgPT4ge1xuICAgICAgICBsZXQgbmV3VmFsdWU6IFRlbnNvcjtcbiAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0aW9uID0gYWRkKG11bCh0aGlzLm0sIGFjY3VtdWxhdGlvbiksIGdyYWRpZW50KTtcbiAgICAgICAgaWYgKHRoaXMudXNlTmVzdGVyb3YpIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGFkZChcbiAgICAgICAgICAgICAgbXVsKHRoaXMuYywgYWRkKGdyYWRpZW50LCBtdWwobmV3QWNjdW11bGF0aW9uLCB0aGlzLm0pKSksIHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBuZXdWYWx1ZSA9IGFkZChtdWwodGhpcy5jLCBuZXdBY2N1bXVsYXRpb24pLCB2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgYWNjdW11bGF0aW9uLmFzc2lnbihuZXdBY2N1bXVsYXRpb24pO1xuICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5pbmNyZW1lbnRJdGVyYXRpb25zKCk7XG4gIH1cblxuICBkaXNwb3NlKCk6IHZvaWQge1xuICAgIHRoaXMubS5kaXNwb3NlKCk7XG4gICAgaWYgKHRoaXMuYWNjdW11bGF0aW9ucyAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0aW9ucy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIG1vbWVudHVtIG9mIHRoZSBvcHRpbWl6ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBtb21lbnR1bVxuICAgKi9cbiAgc2V0TW9tZW50dW0obW9tZW50dW06IG51bWJlcikge1xuICAgIHRoaXMubW9tZW50dW0gPSBtb21lbnR1bTtcbiAgfVxuXG4gIGFzeW5jIGdldFdlaWdodHMoKTogUHJvbWlzZTxOYW1lZFRlbnNvcltdPiB7XG4gICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdCh0aGlzLmFjY3VtdWxhdGlvbnMubWFwKFxuICAgICAgICB2ID0+ICh7bmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZX0pKSk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICB0aGlzLmFjY3VtdWxhdGlvbnMgPSB3ZWlnaHRWYWx1ZXMubWFwKFxuICAgICAgICB2ID0+ICh7b3JpZ2luYWxOYW1lOiB2Lm5hbWUsIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZSh0cmFpbmFibGUpfSkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAnbW9tZW50dW0nOiB0aGlzLm1vbWVudHVtLFxuICAgICAgJ3VzZU5lc3Rlcm92JzogdGhpcy51c2VOZXN0ZXJvdlxuICAgIH07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhcbiAgICAgICAgY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydtb21lbnR1bSddLCBjb25maWdbJ3VzZU5lc3Rlcm92J10pO1xuICB9XG59XG5yZWdpc3RlckNsYXNzKE1vbWVudHVtT3B0aW1pemVyKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { dispose, tidy } from '../globals';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nimport { zerosLike } from '../ops/zeros_like';\nimport { registerClass } from '../serialization';\nimport { Optimizer } from './optimizer';\n/** @doclink Optimizer */\nexport class RMSPropOptimizer extends Optimizer {\n    constructor(learningRate, decay = 0.9, momentum = 0.0, epsilon = null, centered = false) {\n        super();\n        this.learningRate = learningRate;\n        this.decay = decay;\n        this.momentum = momentum;\n        this.epsilon = epsilon;\n        this.accumulatedMeanSquares = [];\n        this.accumulatedMoments = [];\n        this.accumulatedMeanGrads = [];\n        this.centered = centered;\n        if (epsilon == null) {\n            this.epsilon = ENGINE.backend.epsilon();\n        }\n        if (learningRate == null) {\n            throw new Error(`learningRate for RMSPropOptimizer must be defined.`);\n        }\n    }\n    applyGradients(variableGradients) {\n        const variableNames = Array.isArray(variableGradients) ?\n            variableGradients.map(item => item.name) :\n            Object.keys(variableGradients);\n        variableNames.forEach((name, i) => {\n            const value = ENGINE.registeredVariables[name];\n            const trainable = false;\n            if (this.accumulatedMeanSquares[i] == null) {\n                this.accumulatedMeanSquares[i] = {\n                    originalName: `${name}/rms`,\n                    variable: tidy(() => zerosLike(value).variable(trainable))\n                };\n            }\n            if (this.accumulatedMoments[i] == null) {\n                this.accumulatedMoments[i] = {\n                    originalName: `${name}/momentum`,\n                    variable: tidy(() => zerosLike(value).variable(trainable))\n                };\n            }\n            if (this.accumulatedMeanGrads[i] == null && this.centered) {\n                this.accumulatedMeanGrads[i] = {\n                    originalName: `${name}/mg`,\n                    variable: tidy(() => zerosLike(value).variable(trainable))\n                };\n            }\n            const gradient = Array.isArray(variableGradients) ?\n                variableGradients[i].tensor :\n                variableGradients[name];\n            if (gradient == null) {\n                return;\n            }\n            const accumulatedMeanSquare = this.accumulatedMeanSquares[i].variable;\n            const accumulatedMoments = this.accumulatedMoments[i].variable;\n            tidy(() => {\n                const newAccumulatedMeanSquare = add(mul(accumulatedMeanSquare, this.decay), mul(square(gradient), 1 - this.decay));\n                if (this.centered) {\n                    const accumulatedMeanGrad = this.accumulatedMeanGrads[i].variable;\n                    // Centered gradient\n                    const newAccumulatedMeanGrad = add(mul(accumulatedMeanGrad, this.decay), mul(gradient, 1 - this.decay));\n                    const gradContribution = div(mul(gradient, this.learningRate), sqrt(sub(newAccumulatedMeanSquare, add(square(newAccumulatedMeanGrad), this.epsilon))));\n                    const newAccumulatedMoments = add(mul(accumulatedMoments, this.momentum), gradContribution);\n                    accumulatedMeanSquare.assign(newAccumulatedMeanSquare);\n                    accumulatedMeanGrad.assign(newAccumulatedMeanGrad);\n                    accumulatedMoments.assign(newAccumulatedMoments);\n                    const newValue = sub(value, newAccumulatedMoments);\n                    value.assign(newValue);\n                }\n                else {\n                    // Plain gradient\n                    const newAccumulatedMeanSquare = add(mul(accumulatedMeanSquare, this.decay), mul(square(gradient), 1 - this.decay));\n                    const newAccumulatedMoments = add(mul(accumulatedMoments, this.momentum), div(mul(gradient, this.learningRate), sqrt(add(newAccumulatedMeanSquare, this.epsilon))));\n                    accumulatedMeanSquare.assign(newAccumulatedMeanSquare);\n                    accumulatedMoments.assign(newAccumulatedMoments);\n                    const newValue = sub(value, newAccumulatedMoments);\n                    value.assign(newValue);\n                }\n            });\n        });\n        this.incrementIterations();\n    }\n    dispose() {\n        if (this.accumulatedMeanSquares != null) {\n            dispose(this.accumulatedMeanSquares.map(v => v.variable));\n        }\n        if (this.accumulatedMeanGrads != null && this.centered) {\n            dispose(this.accumulatedMeanGrads.map(v => v.variable));\n        }\n        if (this.accumulatedMoments != null) {\n            dispose(this.accumulatedMoments.map(v => v.variable));\n        }\n    }\n    async getWeights() {\n        // Order matters for Python compatibility.\n        const variables = [...this.accumulatedMeanSquares, ...this.accumulatedMoments];\n        if (this.centered) {\n            variables.push(...this.accumulatedMeanGrads);\n        }\n        return [await this.saveIterations()].concat(variables.map(v => ({ name: v.originalName, tensor: v.variable })));\n    }\n    async setWeights(weightValues) {\n        weightValues = await this.extractIterations(weightValues);\n        const variableCount = this.centered ? weightValues.length / 3 : weightValues.length / 2;\n        const trainable = false;\n        this.accumulatedMeanSquares =\n            weightValues.slice(0, variableCount).map(v => ({\n                originalName: v.name,\n                variable: v.tensor.variable(trainable)\n            }));\n        this.accumulatedMoments =\n            weightValues.slice(variableCount, variableCount * 2)\n                .map(v => ({\n                originalName: v.name,\n                variable: v.tensor.variable(trainable)\n            }));\n        if (this.centered) {\n            this.accumulatedMeanGrads =\n                weightValues.slice(variableCount * 2, variableCount * 3)\n                    .map(v => ({\n                    originalName: v.name,\n                    variable: v.tensor.variable(trainable)\n                }));\n        }\n    }\n    getConfig() {\n        return {\n            'learningRate': this.learningRate,\n            'decay': this.decay,\n            'momentum': this.momentum,\n            'epsilon': this.epsilon,\n            'centered': this.centered\n        };\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config['learningRate'], config['decay'], config['momentum'], config['epsilon'], config['centered']);\n    }\n}\n/** @nocollapse */\nRMSPropOptimizer.className = 'RMSProp'; // Note: Name matters for Python compatibility.\nregisterClass(RMSPropOptimizer);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm1zcHJvcF9vcHRpbWl6ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFhLGFBQWEsRUFBd0MsTUFBTSxrQkFBa0IsQ0FBQztBQUdsRyxPQUFPLEVBQUMsU0FBUyxFQUFvQixNQUFNLGFBQWEsQ0FBQztBQUV6RCx5QkFBeUI7QUFDekIsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVM7SUFTN0MsWUFDYyxZQUFvQixFQUFZLFFBQVEsR0FBRyxFQUMzQyxXQUFXLEdBQUcsRUFBWSxVQUFrQixJQUFJLEVBQzFELFFBQVEsR0FBRyxLQUFLO1FBQ2xCLEtBQUssRUFBRSxDQUFDO1FBSEksaUJBQVksR0FBWixZQUFZLENBQVE7UUFBWSxVQUFLLEdBQUwsS0FBSyxDQUFNO1FBQzNDLGFBQVEsR0FBUixRQUFRLENBQU07UUFBWSxZQUFPLEdBQVAsT0FBTyxD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QyxPQUFPO1lBQ3ZCLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUTtTQUMxQixDQUFDO0lBQ0osQ0FBQztJQUVELGtCQUFrQjtJQUNsQixNQUFNLENBQUMsVUFBVSxDQUNiLEdBQStCLEVBQUUsTUFBa0I7UUFDckQsT0FBTyxJQUFJLEdBQUcsQ0FDVixNQUFNLENBQUMsY0FBYyxDQUFDLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsRUFDM0QsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzdDLENBQUM7O0FBOUtELGtCQUFrQjtBQUNYLDBCQUFTLEdBQUcsU0FBUyxDQUFDLENBQUUsK0NBQStDO0FBK0toRixhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge2Rpc3Bvc2UsIHRpZHl9IGZyb20gJy4uL2dsb2JhbHMnO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi9vcHMvc3FydCc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtDb25maWdEaWN0LCByZWdpc3RlckNsYXNzLCBTZXJpYWxpemFibGUsIFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yfSBmcm9tICcuLi9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7TmFtZWRUZW5zb3IsIE5hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuXG5pbXBvcnQge09wdGltaXplciwgT3B0aW1pemVyVmFyaWFibGV9IGZyb20gJy4vb3B0aW1pemVyJztcblxuLyoqIEBkb2NsaW5rIE9wdGltaXplciAqL1xuZXhwb3J0IGNsYXNzIFJNU1Byb3BPcHRpbWl6ZXIgZXh0ZW5kcyBPcHRpbWl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdSTVNQcm9wJzsgIC8vIE5vdGU6IE5hbWUgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gIHByaXZhdGUgY2VudGVyZWQ6IGJvb2xlYW47XG5cbiAgcHJpdmF0ZSBhY2N1bXVsYXRlZE1lYW5TcXVhcmVzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRNb21lbnRzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID0gW107XG4gIHByaXZhdGUgYWNjdW11bGF0ZWRNZWFuR3JhZHM6IE9wdGltaXplclZhcmlhYmxlW10gPSBbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCBsZWFybmluZ1JhdGU6IG51bWJlciwgcHJvdGVjdGVkIGRlY2F5ID0gMC45LFxuICAgICAgcHJvdGVjdGVkIG1vbWVudHVtID0gMC4wLCBwcm90ZWN0ZWQgZXBzaWxvbjogbnVtYmVyID0gbnVsbCxcbiAgICAgIGNlbnRlcmVkID0gZmFsc2UpIHtcbiAgICBzdXBlcigpO1xuXG4gICAgdGhpcy5jZW50ZXJlZCA9IGNlbnRlcmVkO1xuXG4gICAgaWYgKGVwc2lsb24gPT0gbnVsbCkge1xuICAgICAgdGhpcy5lcHNpbG9uID0gRU5HSU5FLmJhY2tlbmQuZXBzaWxvbigpO1xuICAgIH1cbiAgICBpZiAobGVhcm5pbmdSYXRlID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgbGVhcm5pbmdSYXRlIGZvciBSTVNQcm9wT3B0aW1pemVyIG11c3QgYmUgZGVmaW5lZC5gKTtcbiAgICB9XG4gIH1cblxuICBhcHBseUdyYWRpZW50cyh2YXJpYWJsZUdyYWRpZW50czogTmFtZWRUZW5zb3JNYXB8TmFtZWRUZW5zb3JbXSkge1xuICAgIGNvbnN0IHZhcmlhYmxlTmFtZXMgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgIHZhcmlhYmxlR3JhZGllbnRzLm1hcChpdGVtID0+IGl0ZW0ubmFtZSkgOlxuICAgICAgICBPYmplY3Qua2V5cyh2YXJpYWJsZUdyYWRpZW50cyk7XG5cbiAgICB2YXJpYWJsZU5hbWVzLmZvckVhY2goKG5hbWUsIGkpID0+IHtcbiAgICAgIGNvbnN0IHZhbHVlID0gRU5HSU5FLnJlZ2lzdGVyZWRWYXJpYWJsZXNbbmFtZV07XG4gICAgICBjb25zdCB0cmFpbmFibGUgPSBmYWxzZTtcbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhblNxdWFyZXNbaV0gPSB7XG4gICAgICAgICAgb3JpZ2luYWxOYW1lOiBgJHtuYW1lfS9ybXNgLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTW9tZW50c1tpXSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzW2ldID0ge1xuICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbW9tZW50dW1gLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldID09IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldID0ge1xuICAgICAgICAgIG9yaWdpbmFsTmFtZTogYCR7bmFtZX0vbWdgLFxuICAgICAgICAgIHZhcmlhYmxlOiB0aWR5KCgpID0+IHplcm9zTGlrZSh2YWx1ZSkudmFyaWFibGUodHJhaW5hYmxlKSlcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZ3JhZGllbnQgPSBBcnJheS5pc0FycmF5KHZhcmlhYmxlR3JhZGllbnRzKSA/XG4gICAgICAgICAgdmFyaWFibGVHcmFkaWVudHNbaV0udGVuc29yIDpcbiAgICAgICAgICB2YXJpYWJsZUdyYWRpZW50c1tuYW1lXTtcbiAgICAgIGlmIChncmFkaWVudCA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgY29uc3QgYWNjdW11bGF0ZWRNZWFuU3F1YXJlID0gdGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzW2ldLnZhcmlhYmxlO1xuICAgICAgY29uc3QgYWNjdW11bGF0ZWRNb21lbnRzID0gdGhpcy5hY2N1bXVsYXRlZE1vbWVudHNbaV0udmFyaWFibGU7XG4gICAgICB0aWR5KCgpID0+IHtcbiAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlID1cbiAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuU3F1YXJlLCB0aGlzLmRlY2F5KSxcbiAgICAgICAgICAgICAgICBtdWwoc3F1YXJlKGdyYWRpZW50KSwgMSAtIHRoaXMuZGVjYXkpKTtcblxuICAgICAgICBpZiAodGhpcy5jZW50ZXJlZCkge1xuICAgICAgICAgIGNvbnN0IGFjY3VtdWxhdGVkTWVhbkdyYWQgPSB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzW2ldLnZhcmlhYmxlO1xuICAgICAgICAgIC8vIENlbnRlcmVkIGdyYWRpZW50XG4gICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNZWFuR3JhZCA9XG4gICAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuR3JhZCwgdGhpcy5kZWNheSksXG4gICAgICAgICAgICAgICAgICBtdWwoZ3JhZGllbnQsIDEgLSB0aGlzLmRlY2F5KSk7XG5cbiAgICAgICAgICBjb25zdCBncmFkQ29udHJpYnV0aW9uID1cbiAgICAgICAgICAgICAgZGl2KG11bChncmFkaWVudCwgdGhpcy5sZWFybmluZ1JhdGUpLFxuICAgICAgICAgICAgICAgICAgc3FydChcbiAgICAgICAgICAgICAgICAgICAgICBzdWIobmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBhZGQoc3F1YXJlKG5ld0FjY3VtdWxhdGVkTWVhbkdyYWQpLCB0aGlzLmVwc2lsb24pKSkpO1xuICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkTW9tZW50cyA9XG4gICAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRNb21lbnRzLCB0aGlzLm1vbWVudHVtKSwgZ3JhZENvbnRyaWJ1dGlvbik7XG5cbiAgICAgICAgICBhY2N1bXVsYXRlZE1lYW5TcXVhcmUuYXNzaWduKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSk7XG4gICAgICAgICAgYWNjdW11bGF0ZWRNZWFuR3JhZC5hc3NpZ24obmV3QWNjdW11bGF0ZWRNZWFuR3JhZCk7XG4gICAgICAgICAgYWNjdW11bGF0ZWRNb21lbnRzLmFzc2lnbihuZXdBY2N1bXVsYXRlZE1vbWVudHMpO1xuXG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBzdWIodmFsdWUsIG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG4gICAgICAgICAgdmFsdWUuYXNzaWduKG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBQbGFpbiBncmFkaWVudFxuICAgICAgICAgIGNvbnN0IG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSA9XG4gICAgICAgICAgICAgIGFkZChtdWwoYWNjdW11bGF0ZWRNZWFuU3F1YXJlLCB0aGlzLmRlY2F5KSxcbiAgICAgICAgICAgICAgICAgIG11bChzcXVhcmUoZ3JhZGllbnQpLCAxIC0gdGhpcy5kZWNheSkpO1xuXG4gICAgICAgICAgY29uc3QgbmV3QWNjdW11bGF0ZWRNb21lbnRzID1cbiAgICAgICAgICAgICAgYWRkKG11bChhY2N1bXVsYXRlZE1vbWVudHMsIHRoaXMubW9tZW50dW0pLFxuICAgICAgICAgICAgICAgICAgZGl2KG11bChncmFkaWVudCwgdGhpcy5sZWFybmluZ1JhdGUpLFxuICAgICAgICAgICAgICAgICAgICAgIHNxcnQoYWRkKG5ld0FjY3VtdWxhdGVkTWVhblNxdWFyZSwgdGhpcy5lcHNpbG9uKSkpKTtcblxuICAgICAgICAgIGFjY3VtdWxhdGVkTWVhblNxdWFyZS5hc3NpZ24obmV3QWNjdW11bGF0ZWRNZWFuU3F1YXJlKTtcbiAgICAgICAgICBhY2N1bXVsYXRlZE1vbWVudHMuYXNzaWduKG5ld0FjY3VtdWxhdGVkTW9tZW50cyk7XG5cbiAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHN1Yih2YWx1ZSwgbmV3QWNjdW11bGF0ZWRNb21lbnRzKTtcbiAgICAgICAgICB2YWx1ZS5hc3NpZ24obmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmluY3JlbWVudEl0ZXJhdGlvbnMoKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlcyAhPSBudWxsKSB7XG4gICAgICBkaXNwb3NlKHRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlcy5tYXAodiA9PiB2LnZhcmlhYmxlKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzICE9IG51bGwgJiYgdGhpcy5jZW50ZXJlZCkge1xuICAgICAgZGlzcG9zZSh0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzLm1hcCh2ID0+IHYudmFyaWFibGUpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzICE9IG51bGwpIHtcbiAgICAgIGRpc3Bvc2UodGhpcy5hY2N1bXVsYXRlZE1vbWVudHMubWFwKHYgPT4gdi52YXJpYWJsZSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGdldFdlaWdodHMoKTogUHJvbWlzZTxOYW1lZFRlbnNvcltdPiB7XG4gICAgLy8gT3JkZXIgbWF0dGVycyBmb3IgUHl0aG9uIGNvbXBhdGliaWxpdHkuXG4gICAgY29uc3QgdmFyaWFibGVzOiBPcHRpbWl6ZXJWYXJpYWJsZVtdID1cbiAgICAgICAgWy4uLnRoaXMuYWNjdW11bGF0ZWRNZWFuU3F1YXJlcywgLi4udGhpcy5hY2N1bXVsYXRlZE1vbWVudHNdO1xuICAgIGlmICh0aGlzLmNlbnRlcmVkKSB7XG4gICAgICB2YXJpYWJsZXMucHVzaCguLi50aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzKTtcbiAgICB9XG4gICAgcmV0dXJuIFthd2FpdCB0aGlzLnNhdmVJdGVyYXRpb25zKCldLmNvbmNhdChcbiAgICAgICAgdmFyaWFibGVzLm1hcCh2ID0+ICh7bmFtZTogdi5vcmlnaW5hbE5hbWUsIHRlbnNvcjogdi52YXJpYWJsZX0pKSk7XG4gIH1cblxuICBhc3luYyBzZXRXZWlnaHRzKHdlaWdodFZhbHVlczogTmFtZWRUZW5zb3JbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIHdlaWdodFZhbHVlcyA9IGF3YWl0IHRoaXMuZXh0cmFjdEl0ZXJhdGlvbnMod2VpZ2h0VmFsdWVzKTtcbiAgICBjb25zdCB2YXJpYWJsZUNvdW50ID1cbiAgICAgICAgdGhpcy5jZW50ZXJlZCA/IHdlaWdodFZhbHVlcy5sZW5ndGggLyAzIDogd2VpZ2h0VmFsdWVzLmxlbmd0aCAvIDI7XG4gICAgY29uc3QgdHJhaW5hYmxlID0gZmFsc2U7XG4gICAgdGhpcy5hY2N1bXVsYXRlZE1lYW5TcXVhcmVzID1cbiAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKDAsIHZhcmlhYmxlQ291bnQpLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWU6IHYubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhYmxlOiB2LnRlbnNvci52YXJpYWJsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmFibGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpO1xuICAgIHRoaXMuYWNjdW11bGF0ZWRNb21lbnRzID1cbiAgICAgICAgd2VpZ2h0VmFsdWVzLnNsaWNlKHZhcmlhYmxlQ291bnQsIHZhcmlhYmxlQ291bnQgKiAyKVxuICAgICAgICAgICAgLm1hcCh2ID0+ICh7XG4gICAgICAgICAgICAgICAgICAgb3JpZ2luYWxOYW1lOiB2Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgICAgICAgfSkpO1xuICAgIGlmICh0aGlzLmNlbnRlcmVkKSB7XG4gICAgICB0aGlzLmFjY3VtdWxhdGVkTWVhbkdyYWRzID1cbiAgICAgICAgICB3ZWlnaHRWYWx1ZXMuc2xpY2UodmFyaWFibGVDb3VudCAqIDIsIHZhcmlhYmxlQ291bnQgKiAzKVxuICAgICAgICAgICAgICAubWFwKHYgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogdi5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGU6IHYudGVuc29yLnZhcmlhYmxlKHRyYWluYWJsZSlcbiAgICAgICAgICAgICAgICAgICB9KSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IENvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICAnbGVhcm5pbmdSYXRlJzogdGhpcy5sZWFybmluZ1JhdGUsXG4gICAgICAnZGVjYXknOiB0aGlzLmRlY2F5LFxuICAgICAgJ21vbWVudHVtJzogdGhpcy5tb21lbnR1bSxcbiAgICAgICdlcHNpbG9uJzogdGhpcy5lcHNpbG9uLFxuICAgICAgJ2NlbnRlcmVkJzogdGhpcy5jZW50ZXJlZFxuICAgIH07XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIFNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IFNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LCBjb25maWc6IENvbmZpZ0RpY3QpOiBUIHtcbiAgICByZXR1cm4gbmV3IGNscyhcbiAgICAgICAgY29uZmlnWydsZWFybmluZ1JhdGUnXSwgY29uZmlnWydkZWNheSddLCBjb25maWdbJ21vbWVudHVtJ10sXG4gICAgICAgIGNvbmZpZ1snZXBzaWxvbiddLCBjb25maWdbJ2NlbnRlcmVkJ10pO1xuICB9XG59XG5yZWdpc3RlckNsYXNzKFJNU1Byb3BPcHRpbWl6ZXIpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AdadeltaOptimizer } from './adadelta_optimizer';\nimport { AdagradOptimizer } from './adagrad_optimizer';\nimport { AdamOptimizer } from './adam_optimizer';\nimport { AdamaxOptimizer } from './adamax_optimizer';\nimport { MomentumOptimizer } from './momentum_optimizer';\nimport { RMSPropOptimizer } from './rmsprop_optimizer';\nimport { SGDOptimizer } from './sgd_optimizer';\nexport class OptimizerConstructors {\n    /**\n     * Constructs a `tf.SGDOptimizer` that uses stochastic gradient descent.\n     *\n     * ```js\n     * // Fit a quadratic function by learning the coefficients a, b, c.\n     * const xs = tf.tensor1d([0, 1, 2, 3]);\n     * const ys = tf.tensor1d([1.1, 5.9, 16.8, 33.9]);\n     *\n     * const a = tf.scalar(Math.random()).variable();\n     * const b = tf.scalar(Math.random()).variable();\n     * const c = tf.scalar(Math.random()).variable();\n     *\n     * // y = a * x^2 + b * x + c.\n     * const f = x => a.mul(x.square()).add(b.mul(x)).add(c);\n     * const loss = (pred, label) => pred.sub(label).square().mean();\n     *\n     * const learningRate = 0.01;\n     * const optimizer = tf.train.sgd(learningRate);\n     *\n     * // Train the model.\n     * for (let i = 0; i < 10; i++) {\n     *   optimizer.minimize(() => loss(f(xs), ys));\n     * }\n     *\n     * // Make predictions.\n     * console.log(\n     *     `a: ${a.dataSync()}, b: ${b.dataSync()}, c: ${c.dataSync()}`);\n     * const preds = f(xs).dataSync();\n     * preds.forEach((pred, i) => {\n     *   console.log(`x: ${i}, pred: ${pred}`);\n     * });\n     * ```\n     *\n     * @param learningRate The learning rate to use for the SGD algorithm.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n     */\n    static sgd(learningRate) {\n        return new SGDOptimizer(learningRate);\n    }\n    /**\n     * Constructs a `tf.MomentumOptimizer` that uses momentum gradient\n     * descent.\n     *\n     * See\n     * [http://proceedings.mlr.press/v28/sutskever13.pdf](\n     * http://proceedings.mlr.press/v28/sutskever13.pdf)\n     *\n     * @param learningRate The learning rate to use for the Momentum gradient\n     * descent algorithm.\n     * @param momentum The momentum to use for the momentum gradient descent\n     * algorithm.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n     */\n    static momentum(learningRate, momentum, useNesterov = false) {\n        return new MomentumOptimizer(learningRate, momentum, useNesterov);\n    }\n    /**\n     * Constructs a `tf.RMSPropOptimizer` that uses RMSProp gradient\n     * descent. This implementation uses plain momentum and is not centered\n     * version of RMSProp.\n     *\n     * See\n     * [http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf](\n     * http://www.cs.toronto.edu/~tijmen/csc321/slides/lecture_slides_lec6.pdf)\n     *\n     * @param learningRate The learning rate to use for the RMSProp gradient\n     * descent algorithm.\n     * @param decay The discounting factor for the history/coming gradient.\n     * @param momentum The momentum to use for the RMSProp gradient descent\n     * algorithm.\n     * @param epsilon Small value to avoid zero denominator.\n     * @param centered If true, gradients are normalized by the estimated\n     * variance of the gradient.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n     */\n    static rmsprop(learningRate, decay = .9, momentum = 0.0, epsilon = null, centered = false) {\n        return new RMSPropOptimizer(learningRate, decay, momentum, epsilon, centered);\n    }\n    /**\n     * Constructs a `tf.AdamOptimizer` that uses the Adam algorithm.\n     * See [https://arxiv.org/abs/1412.6980](https://arxiv.org/abs/1412.6980)\n     *\n     * @param learningRate The learning rate to use for the Adam gradient\n     * descent algorithm.\n     * @param beta1 The exponential decay rate for the 1st moment estimates.\n     * @param beta2 The exponential decay rate for the 2nd moment estimates.\n     * @param epsilon A small constant for numerical stability.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n     */\n    static adam(learningRate = 0.001, beta1 = 0.9, beta2 = 0.999, epsilon = null) {\n        return new AdamOptimizer(learningRate, beta1, beta2, epsilon);\n    }\n    /**\n     * Constructs a `tf.AdadeltaOptimizer` that uses the Adadelta algorithm.\n     * See [https://arxiv.org/abs/1212.5701](https://arxiv.org/abs/1212.5701)\n     *\n     * @param learningRate The learning rate to use for the Adadelta gradient\n     * descent algorithm.\n     * @param rho The learning rate decay over each update.\n     * @param epsilon A constant epsilon used to better condition the grad\n     * update.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n     */\n    static adadelta(learningRate = .001, rho = .95, epsilon = null) {\n        return new AdadeltaOptimizer(learningRate, rho, epsilon);\n    }\n    /**\n     * Constructs a `tf.AdamaxOptimizer` that uses the Adamax algorithm.\n     * See [https://arxiv.org/abs/1412.6980](https://arxiv.org/abs/1412.6980)\n     *\n     * @param learningRate The learning rate to use for the Adamax gradient\n     * descent algorithm.\n     * @param beta1 The exponential decay rate for the 1st moment estimates.\n     * @param beta2 The exponential decay rate for the 2nd moment estimates.\n     * @param epsilon A small constant for numerical stability.\n     * @param decay The learning rate decay over each update.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n     */\n    static adamax(learningRate = 0.002, beta1 = 0.9, beta2 = 0.999, epsilon = null, decay = 0.0) {\n        return new AdamaxOptimizer(learningRate, beta1, beta2, epsilon, decay);\n    }\n    /**\n     * Constructs a `tf.AdagradOptimizer` that uses the Adagrad algorithm.\n     * See\n     * [http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf](\n     * http://www.jmlr.org/papers/volume12/duchi11a/duchi11a.pdf)\n     * or\n     * [http://ruder.io/optimizing-gradient-descent/index.html#adagrad](\n     * http://ruder.io/optimizing-gradient-descent/index.html#adagrad)\n     *\n     * @param learningRate The learning rate to use for the Adagrad gradient\n     * descent algorithm.\n     * @param initialAccumulatorValue Starting value for the accumulators, must be\n     * positive.\n     *\n     * @doc {heading: 'Training', subheading: 'Optimizers', namespace: 'train'}\n     */\n    static adagrad(learningRate, initialAccumulatorValue = 0.1) {\n        return new AdagradOptimizer(learningRate, initialAccumulatorValue);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVyX2NvbnN0cnVjdG9ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3B0aW1pemVycy9vcHRpbWl6ZXJfY29uc3RydWN0b3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDbkQsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sT0FBTyxxQkFBcUI7SUFDaEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW9DRztJQUNILE1BQU0sQ0FBQyxHQUFHLENBQUMsWUFBb0I7UUFDN0IsT0FBTyxJQUFJLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSCxNQUFNLENBQUMsUUFBUSxDQUFDLFlBQW9CLEVBQUUsUUFBZ0IsRUFBRSxXQUFXLEdBQUcsS0FBSztRQUV6RSxPQUFPLElBQUksaUJBQWlCLENBQUMsWUFBWSxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUNWLFlBQW9CLEVBQUUsS0FBSyxHQUFHLEVBQUUsRUFBRSxRQUFRLEdBQUcsR0FBRyxFQUFFLFVBQWtCLElBQUksRUFDeEUsUUFBUSxHQUFHLEtBQUs7UUFDbEIsT0FBTyxJQUFJLGdCQUFnQixDQUN2QixZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVEOzs7Ozs7Ozs7OztPQVdHO0lBQ0gsTUFBTSxDQUFDLElBQUksQ0FDUCxZQUFZLEdBQUcsS0FBSyxFQUFFLEtBQUssR0FBRyxHQUFHLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFDaEQsVUFBa0IsSUFBSTtRQUN4QixPQUFPLElBQUksYUFBYSxDQUFDLFlBQVksRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNILE1BQU0sQ0FBQyxRQUFRLENBQUMsWUFBWSxHQUFHLElBQUksRUFBRSxHQUFHLEdBQUcsR0FBRyxFQUFFLFVBQWtCLElBQUk7UUFFcEUsT0FBTyxJQUFJLGlCQUFpQixDQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7T0FZRztJQUNILE1BQU0sQ0FBQyxNQUFNLENBQ1QsWUFBWSxHQUFHLEtBQUssRUFBRSxLQUFLLEdBQUcsR0FBRyxFQUFFLEtBQUssR0FBRyxLQUFLLEVBQUUsVUFBa0IsSUFBSSxFQUN4RSxLQUFLLEdBQUcsR0FBRztRQUNiLE9BQU8sSUFBSSxlQUFlLENBQUMsWUFBWSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLFlBQW9CLEVBQUUsdUJBQXVCLEdBQUcsR0FBRztRQUVoRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsWUFBWSxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFDckUsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FkYWRlbHRhT3B0aW1pemVyfSBmcm9tICcuL2FkYWRlbHRhX29wdGltaXplcic7XG5pbXBvcnQge0FkYWdyYWRPcHRpbWl6ZXJ9IGZyb20gJy4vYWRhZ3JhZF9vcHRpbWl6ZXInO1xuaW1wb3J0IHtBZGFtT3B0aW1pemVyfSBmcm9tICcuL2FkYW1fb3B0aW1pemVyJztcbmltcG9ydCB7QWRhbWF4T3B0aW1pemVyfSBmcm9tICcuL2FkYW1heF9vcHRpbWl6ZXInO1xuaW1wb3J0IHtNb21lbnR1bU9wdGltaXplcn0gZnJvbSAnLi9tb21lbnR1bV9vcHRpbWl6ZXInO1xuaW1wb3J0IHtSTVNQcm9wT3B0aW1pemVyfSBmcm9tICcuL3Jtc3Byb3Bfb3B0aW1pemVyJztcbmltcG9ydCB7U0dET3B0aW1pemVyfSBmcm9tICcuL3NnZF9vcHRpbWl6ZXInO1xuXG5leHBvcnQgY2xhc3MgT3B0aW1pemVyQ29uc3RydWN0b3JzIHtcbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuU0dET3B0aW1pemVyYCB0aGF0IHVzZXMgc3RvY2hhc3RpYyBncmFkaWVudCBkZXNjZW50LlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAvLyBGaXQgYSBxdWFkcmF0aWMgZnVuY3Rpb24gYnkgbGVhcm5pbmcgdGhlIGNvZWZmaWNpZW50cyBhLCBiLCBjLlxuICAgKiBjb25zdCB4cyA9IHRmLnRlbnNvcjFkKFswLCAxLCAyLCAzXSk7XG4gICAqIGNvbnN0IHlzID0gdGYudGVuc29yMWQoWzEuMSwgNS45LCAxNi44LCAzMy45XSk7XG4gICAqXG4gICAqIGNvbnN0IGEgPSB0Zi5zY2FsYXIoTWF0aC5yYW5kb20oKSkudmFyaWFibGUoKTtcbiAgICogY29uc3QgYiA9IHRmLnNjYWxhcihNYXRoLnJhbmRvbSgpKS52YXJpYWJsZSgpO1xuICAgKiBjb25zdCBjID0gdGYuc2NhbGFyKE1hdGgucmFuZG9tKCkpLnZhcmlhYmxlKCk7XG4gICAqXG4gICAqIC8vIHkgPSBhICogeF4yICsgYiAqIHggKyBjLlxuICAgKiBjb25zdCBmID0geCA9PiBhLm11bCh4LnNxdWFyZSgpKS5hZGQoYi5tdWwoeCkpLmFkZChjKTtcbiAgICogY29uc3QgbG9zcyA9IChwcmVkLCBsYWJlbCkgPT4gcHJlZC5zdWIobGFiZWwpLnNxdWFyZSgpLm1lYW4oKTtcbiAgICpcbiAgICogY29uc3QgbGVhcm5pbmdSYXRlID0gMC4wMTtcbiAgICogY29uc3Qgb3B0aW1pemVyID0gdGYudHJhaW4uc2dkKGxlYXJuaW5nUmF0ZSk7XG4gICAqXG4gICAqIC8vIFRyYWluIHRoZSBtb2RlbC5cbiAgICogZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7XG4gICAqICAgb3B0aW1pemVyLm1pbmltaXplKCgpID0+IGxvc3MoZih4cyksIHlzKSk7XG4gICAqIH1cbiAgICpcbiAgICogLy8gTWFrZSBwcmVkaWN0aW9ucy5cbiAgICogY29uc29sZS5sb2coXG4gICAqICAgICBgYTogJHthLmRhdGFTeW5jKCl9LCBiOiAke2IuZGF0YVN5bmMoKX0sIGM6ICR7Yy5kYXRhU3luYygpfWApO1xuICAgKiBjb25zdCBwcmVkcyA9IGYoeHMpLmRhdGFTeW5jKCk7XG4gICAqIHByZWRzLmZvckVhY2goKHByZWQsIGkpID0+IHtcbiAgICogICBjb25zb2xlLmxvZyhgeDogJHtpfSwgcHJlZDogJHtwcmVkfWApO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBsZWFybmluZ1JhdGUgVGhlIGxlYXJuaW5nIHJhdGUgdG8gdXNlIGZvciB0aGUgU0dEIGFsZ29yaXRobS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAqL1xuICBzdGF0aWMgc2dkKGxlYXJuaW5nUmF0ZTogbnVtYmVyKTogU0dET3B0aW1pemVyIHtcbiAgICByZXR1cm4gbmV3IFNHRE9wdGltaXplcihsZWFybmluZ1JhdGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuTW9tZW50dW1PcHRpbWl6ZXJgIHRoYXQgdXNlcyBtb21lbnR1bSBncmFkaWVudFxuICAgKiBkZXNjZW50LlxuICAgKlxuICAgKiBTZWVcbiAgICogW2h0dHA6Ly9wcm9jZWVkaW5ncy5tbHIucHJlc3MvdjI4L3N1dHNrZXZlcjEzLnBkZl0oXG4gICAqIGh0dHA6Ly9wcm9jZWVkaW5ncy5tbHIucHJlc3MvdjI4L3N1dHNrZXZlcjEzLnBkZilcbiAgICpcbiAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBNb21lbnR1bSBncmFkaWVudFxuICAgKiBkZXNjZW50IGFsZ29yaXRobS5cbiAgICogQHBhcmFtIG1vbWVudHVtIFRoZSBtb21lbnR1bSB0byB1c2UgZm9yIHRoZSBtb21lbnR1bSBncmFkaWVudCBkZXNjZW50XG4gICAqIGFsZ29yaXRobS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAqL1xuICBzdGF0aWMgbW9tZW50dW0obGVhcm5pbmdSYXRlOiBudW1iZXIsIG1vbWVudHVtOiBudW1iZXIsIHVzZU5lc3Rlcm92ID0gZmFsc2UpOlxuICAgICAgTW9tZW50dW1PcHRpbWl6ZXIge1xuICAgIHJldHVybiBuZXcgTW9tZW50dW1PcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCBtb21lbnR1bSwgdXNlTmVzdGVyb3YpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuUk1TUHJvcE9wdGltaXplcmAgdGhhdCB1c2VzIFJNU1Byb3AgZ3JhZGllbnRcbiAgICogZGVzY2VudC4gVGhpcyBpbXBsZW1lbnRhdGlvbiB1c2VzIHBsYWluIG1vbWVudHVtIGFuZCBpcyBub3QgY2VudGVyZWRcbiAgICogdmVyc2lvbiBvZiBSTVNQcm9wLlxuICAgKlxuICAgKiBTZWVcbiAgICogW2h0dHA6Ly93d3cuY3MudG9yb250by5lZHUvfnRpam1lbi9jc2MzMjEvc2xpZGVzL2xlY3R1cmVfc2xpZGVzX2xlYzYucGRmXShcbiAgICogaHR0cDovL3d3dy5jcy50b3JvbnRvLmVkdS9+dGlqbWVuL2NzYzMyMS9zbGlkZXMvbGVjdHVyZV9zbGlkZXNfbGVjNi5wZGYpXG4gICAqXG4gICAqIEBwYXJhbSBsZWFybmluZ1JhdGUgVGhlIGxlYXJuaW5nIHJhdGUgdG8gdXNlIGZvciB0aGUgUk1TUHJvcCBncmFkaWVudFxuICAgKiBkZXNjZW50IGFsZ29yaXRobS5cbiAgICogQHBhcmFtIGRlY2F5IFRoZSBkaXNjb3VudGluZyBmYWN0b3IgZm9yIHRoZSBoaXN0b3J5L2NvbWluZyBncmFkaWVudC5cbiAgICogQHBhcmFtIG1vbWVudHVtIFRoZSBtb21lbnR1bSB0byB1c2UgZm9yIHRoZSBSTVNQcm9wIGdyYWRpZW50IGRlc2NlbnRcbiAgICogYWxnb3JpdGhtLlxuICAgKiBAcGFyYW0gZXBzaWxvbiBTbWFsbCB2YWx1ZSB0byBhdm9pZCB6ZXJvIGRlbm9taW5hdG9yLlxuICAgKiBAcGFyYW0gY2VudGVyZWQgSWYgdHJ1ZSwgZ3JhZGllbnRzIGFyZSBub3JtYWxpemVkIGJ5IHRoZSBlc3RpbWF0ZWRcbiAgICogdmFyaWFuY2Ugb2YgdGhlIGdyYWRpZW50LlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnT3B0aW1pemVycycsIG5hbWVzcGFjZTogJ3RyYWluJ31cbiAgICovXG4gIHN0YXRpYyBybXNwcm9wKFxuICAgICAgbGVhcm5pbmdSYXRlOiBudW1iZXIsIGRlY2F5ID0gLjksIG1vbWVudHVtID0gMC4wLCBlcHNpbG9uOiBudW1iZXIgPSBudWxsLFxuICAgICAgY2VudGVyZWQgPSBmYWxzZSk6IFJNU1Byb3BPcHRpbWl6ZXIge1xuICAgIHJldHVybiBuZXcgUk1TUHJvcE9wdGltaXplcihcbiAgICAgICAgbGVhcm5pbmdSYXRlLCBkZWNheSwgbW9tZW50dW0sIGVwc2lsb24sIGNlbnRlcmVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYW1PcHRpbWl6ZXJgIHRoYXQgdXNlcyB0aGUgQWRhbSBhbGdvcml0aG0uXG4gICAqIFNlZSBbaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MF0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MClcbiAgICpcbiAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtIGdyYWRpZW50XG4gICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgKiBAcGFyYW0gYmV0YTEgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAxc3QgbW9tZW50IGVzdGltYXRlcy5cbiAgICogQHBhcmFtIGJldGEyIFRoZSBleHBvbmVudGlhbCBkZWNheSByYXRlIGZvciB0aGUgMm5kIG1vbWVudCBlc3RpbWF0ZXMuXG4gICAqIEBwYXJhbSBlcHNpbG9uIEEgc21hbGwgY29uc3RhbnQgZm9yIG51bWVyaWNhbCBzdGFiaWxpdHkuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgKi9cbiAgc3RhdGljIGFkYW0oXG4gICAgICBsZWFybmluZ1JhdGUgPSAwLjAwMSwgYmV0YTEgPSAwLjksIGJldGEyID0gMC45OTksXG4gICAgICBlcHNpbG9uOiBudW1iZXIgPSBudWxsKTogQWRhbU9wdGltaXplciB7XG4gICAgcmV0dXJuIG5ldyBBZGFtT3B0aW1pemVyKGxlYXJuaW5nUmF0ZSwgYmV0YTEsIGJldGEyLCBlcHNpbG9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RzIGEgYHRmLkFkYWRlbHRhT3B0aW1pemVyYCB0aGF0IHVzZXMgdGhlIEFkYWRlbHRhIGFsZ29yaXRobS5cbiAgICogU2VlIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTIxMi41NzAxKVxuICAgKlxuICAgKiBAcGFyYW0gbGVhcm5pbmdSYXRlIFRoZSBsZWFybmluZyByYXRlIHRvIHVzZSBmb3IgdGhlIEFkYWRlbHRhIGdyYWRpZW50XG4gICAqIGRlc2NlbnQgYWxnb3JpdGhtLlxuICAgKiBAcGFyYW0gcmhvIFRoZSBsZWFybmluZyByYXRlIGRlY2F5IG92ZXIgZWFjaCB1cGRhdGUuXG4gICAqIEBwYXJhbSBlcHNpbG9uIEEgY29uc3RhbnQgZXBzaWxvbiB1c2VkIHRvIGJldHRlciBjb25kaXRpb24gdGhlIGdyYWRcbiAgICogdXBkYXRlLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnVHJhaW5pbmcnLCBzdWJoZWFkaW5nOiAnT3B0aW1pemVycycsIG5hbWVzcGFjZTogJ3RyYWluJ31cbiAgICovXG4gIHN0YXRpYyBhZGFkZWx0YShsZWFybmluZ1JhdGUgPSAuMDAxLCByaG8gPSAuOTUsIGVwc2lsb246IG51bWJlciA9IG51bGwpOlxuICAgICAgQWRhZGVsdGFPcHRpbWl6ZXIge1xuICAgIHJldHVybiBuZXcgQWRhZGVsdGFPcHRpbWl6ZXIobGVhcm5pbmdSYXRlLCByaG8sIGVwc2lsb24pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuQWRhbWF4T3B0aW1pemVyYCB0aGF0IHVzZXMgdGhlIEFkYW1heCBhbGdvcml0aG0uXG4gICAqIFNlZSBbaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MF0oaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE0MTIuNjk4MClcbiAgICpcbiAgICogQHBhcmFtIGxlYXJuaW5nUmF0ZSBUaGUgbGVhcm5pbmcgcmF0ZSB0byB1c2UgZm9yIHRoZSBBZGFtYXggZ3JhZGllbnRcbiAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAqIEBwYXJhbSBiZXRhMSBUaGUgZXhwb25lbnRpYWwgZGVjYXkgcmF0ZSBmb3IgdGhlIDFzdCBtb21lbnQgZXN0aW1hdGVzLlxuICAgKiBAcGFyYW0gYmV0YTIgVGhlIGV4cG9uZW50aWFsIGRlY2F5IHJhdGUgZm9yIHRoZSAybmQgbW9tZW50IGVzdGltYXRlcy5cbiAgICogQHBhcmFtIGVwc2lsb24gQSBzbWFsbCBjb25zdGFudCBmb3IgbnVtZXJpY2FsIHN0YWJpbGl0eS5cbiAgICogQHBhcmFtIGRlY2F5IFRoZSBsZWFybmluZyByYXRlIGRlY2F5IG92ZXIgZWFjaCB1cGRhdGUuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdUcmFpbmluZycsIHN1YmhlYWRpbmc6ICdPcHRpbWl6ZXJzJywgbmFtZXNwYWNlOiAndHJhaW4nfVxuICAgKi9cbiAgc3RhdGljIGFkYW1heChcbiAgICAgIGxlYXJuaW5nUmF0ZSA9IDAuMDAyLCBiZXRhMSA9IDAuOSwgYmV0YTIgPSAwLjk5OSwgZXBzaWxvbjogbnVtYmVyID0gbnVsbCxcbiAgICAgIGRlY2F5ID0gMC4wKTogQWRhbWF4T3B0aW1pemVyIHtcbiAgICByZXR1cm4gbmV3IEFkYW1heE9wdGltaXplcihsZWFybmluZ1JhdGUsIGJldGExLCBiZXRhMiwgZXBzaWxvbiwgZGVjYXkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdHMgYSBgdGYuQWRhZ3JhZE9wdGltaXplcmAgdGhhdCB1c2VzIHRoZSBBZGFncmFkIGFsZ29yaXRobS5cbiAgICogU2VlXG4gICAqIFtodHRwOi8vd3d3LmptbHIub3JnL3BhcGVycy92b2x1bWUxMi9kdWNoaTExYS9kdWNoaTExYS5wZGZdKFxuICAgKiBodHRwOi8vd3d3LmptbHIub3JnL3BhcGVycy92b2x1bWUxMi9kdWNoaTExYS9kdWNoaTExYS5wZGYpXG4gICAqIG9yXG4gICAqIFtodHRwOi8vcnVkZXIuaW8vb3B0aW1pemluZy1ncmFkaWVudC1kZXNjZW50L2luZGV4Lmh0bWwjYWRhZ3JhZF0oXG4gICAqIGh0dHA6Ly9ydWRlci5pby9vcHRpbWl6aW5nLWdyYWRpZW50LWRlc2NlbnQvaW5kZXguaHRtbCNhZGFncmFkKVxuICAgKlxuICAgKiBAcGFyYW0gbGVhcm5pbmdSYXRlIFRoZSBsZWFybmluZyByYXRlIHRvIHVzZSBmb3IgdGhlIEFkYWdyYWQgZ3JhZGllbnRcbiAgICogZGVzY2VudCBhbGdvcml0aG0uXG4gICAqIEBwYXJhbSBpbml0aWFsQWNjdW11bGF0b3JWYWx1ZSBTdGFydGluZyB2YWx1ZSBmb3IgdGhlIGFjY3VtdWxhdG9ycywgbXVzdCBiZVxuICAgKiBwb3NpdGl2ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ1RyYWluaW5nJywgc3ViaGVhZGluZzogJ09wdGltaXplcnMnLCBuYW1lc3BhY2U6ICd0cmFpbid9XG4gICAqL1xuICBzdGF0aWMgYWRhZ3JhZChsZWFybmluZ1JhdGU6IG51bWJlciwgaW5pdGlhbEFjY3VtdWxhdG9yVmFsdWUgPSAwLjEpOlxuICAgICAgQWRhZ3JhZE9wdGltaXplciB7XG4gICAgcmV0dXJuIG5ldyBBZGFncmFkT3B0aW1pemVyKGxlYXJuaW5nUmF0ZSwgaW5pdGlhbEFjY3VtdWxhdG9yVmFsdWUpO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// So typings can propagate.\nimport { AdadeltaOptimizer } from './optimizers/adadelta_optimizer';\nimport { AdagradOptimizer } from './optimizers/adagrad_optimizer';\nimport { AdamOptimizer } from './optimizers/adam_optimizer';\nimport { AdamaxOptimizer } from './optimizers/adamax_optimizer';\nimport { MomentumOptimizer } from './optimizers/momentum_optimizer';\nimport { OptimizerConstructors } from './optimizers/optimizer_constructors';\nimport { RMSPropOptimizer } from './optimizers/rmsprop_optimizer';\nimport { SGDOptimizer } from './optimizers/sgd_optimizer';\n// tslint:disable-next-line:no-unused-expression\n[MomentumOptimizer, SGDOptimizer, AdadeltaOptimizer, AdagradOptimizer,\n    RMSPropOptimizer, AdamaxOptimizer, AdamOptimizer];\nexport const train = {\n    sgd: OptimizerConstructors.sgd,\n    momentum: OptimizerConstructors.momentum,\n    adadelta: OptimizerConstructors.adadelta,\n    adagrad: OptimizerConstructors.adagrad,\n    rmsprop: OptimizerConstructors.rmsprop,\n    adamax: OptimizerConstructors.adamax,\n    adam: OptimizerConstructors.adam\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3RyYWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILDRCQUE0QjtBQUM1QixPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNoRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQzlELE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdDQUFnQyxDQUFDO0FBQ2hFLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUV4RCxnREFBZ0Q7QUFDaEQsQ0FBQyxpQkFBaUIsRUFBRSxZQUFZLEVBQUUsaUJBQWlCLEVBQUUsZ0JBQWdCO0lBQ3BFLGdCQUFnQixFQUFFLGVBQWUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUVuRCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUc7SUFDbkIsR0FBRyxFQUFFLHFCQUFxQixDQUFDLEdBQUc7SUFDOUIsUUFBUSxFQUFFLHFCQUFxQixDQUFDLFFBQVE7SUFDeEMsUUFBUSxFQUFFLHFCQUFxQixDQUFDLFFBQVE7SUFDeEMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLE9BQU87SUFDdEMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLE9BQU87SUFDdEMsTUFBTSxFQUFFLHFCQUFxQixDQUFDLE1BQU07SUFDcEMsSUFBSSxFQUFFLHFCQUFxQixDQUFDLElBQUk7Q0FDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gU28gdHlwaW5ncyBjYW4gcHJvcGFnYXRlLlxuaW1wb3J0IHtBZGFkZWx0YU9wdGltaXplcn0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYWRlbHRhX29wdGltaXplcic7XG5pbXBvcnQge0FkYWdyYWRPcHRpbWl6ZXJ9IGZyb20gJy4vb3B0aW1pemVycy9hZGFncmFkX29wdGltaXplcic7XG5pbXBvcnQge0FkYW1PcHRpbWl6ZXJ9IGZyb20gJy4vb3B0aW1pemVycy9hZGFtX29wdGltaXplcic7XG5pbXBvcnQge0FkYW1heE9wdGltaXplcn0gZnJvbSAnLi9vcHRpbWl6ZXJzL2FkYW1heF9vcHRpbWl6ZXInO1xuaW1wb3J0IHtNb21lbnR1bU9wdGltaXplcn0gZnJvbSAnLi9vcHRpbWl6ZXJzL21vbWVudHVtX29wdGltaXplcic7XG5pbXBvcnQge09wdGltaXplckNvbnN0cnVjdG9yc30gZnJvbSAnLi9vcHRpbWl6ZXJzL29wdGltaXplcl9jb25zdHJ1Y3RvcnMnO1xuaW1wb3J0IHtSTVNQcm9wT3B0aW1pemVyfSBmcm9tICcuL29wdGltaXplcnMvcm1zcHJvcF9vcHRpbWl6ZXInO1xuaW1wb3J0IHtTR0RPcHRpbWl6ZXJ9IGZyb20gJy4vb3B0aW1pemVycy9zZ2Rfb3B0aW1pemVyJztcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG5bTW9tZW50dW1PcHRpbWl6ZXIsIFNHRE9wdGltaXplciwgQWRhZGVsdGFPcHRpbWl6ZXIsIEFkYWdyYWRPcHRpbWl6ZXIsXG4gUk1TUHJvcE9wdGltaXplciwgQWRhbWF4T3B0aW1pemVyLCBBZGFtT3B0aW1pemVyXTtcblxuZXhwb3J0IGNvbnN0IHRyYWluID0ge1xuICBzZ2Q6IE9wdGltaXplckNvbnN0cnVjdG9ycy5zZ2QsXG4gIG1vbWVudHVtOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMubW9tZW50dW0sXG4gIGFkYWRlbHRhOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhZGVsdGEsXG4gIGFkYWdyYWQ6IE9wdGltaXplckNvbnN0cnVjdG9ycy5hZGFncmFkLFxuICBybXNwcm9wOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMucm1zcHJvcCxcbiAgYWRhbWF4OiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhbWF4LFxuICBhZGFtOiBPcHRpbWl6ZXJDb25zdHJ1Y3RvcnMuYWRhbVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nconst delayCallback = (() => {\n    if (typeof requestAnimationFrame !== 'undefined') {\n        return requestAnimationFrame;\n    }\n    else if (typeof setImmediate !== 'undefined') {\n        return setImmediate;\n    }\n    return (f) => f(); // no delays\n})();\n/**\n * Returns a promise that resolves when a requestAnimationFrame has completed.\n *\n * On Node.js this uses setImmediate instead of requestAnimationFrame.\n *\n * This is simply a sugar method so that users can do the following:\n * `await tf.nextFrame();`\n *\n * @doc {heading: 'Performance', subheading: 'Timing'}\n */\nfunction nextFrame() {\n    return new Promise(resolve => delayCallback(() => resolve()));\n}\nexport { nextFrame };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlcl91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9icm93c2VyX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxhQUFhLEdBQWEsQ0FBQyxHQUFHLEVBQUU7SUFDcEMsSUFBSSxPQUFPLHFCQUFxQixLQUFLLFdBQVcsRUFBRTtRQUNoRCxPQUFPLHFCQUFxQixDQUFDO0tBQzlCO1NBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxXQUFXLEVBQUU7UUFDOUMsT0FBTyxZQUFZLENBQUM7S0FDckI7SUFDRCxPQUFPLENBQUMsQ0FBVyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFFLFlBQVk7QUFDNUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsU0FBUztJQUNoQixPQUFPLElBQUksT0FBTyxDQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5jb25zdCBkZWxheUNhbGxiYWNrOiBGdW5jdGlvbiA9ICgoKSA9PiB7XG4gIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykge1xuICAgIHJldHVybiByZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHNldEltbWVkaWF0ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICByZXR1cm4gc2V0SW1tZWRpYXRlO1xuICB9XG4gIHJldHVybiAoZjogRnVuY3Rpb24pID0+IGYoKTsgIC8vIG5vIGRlbGF5c1xufSkoKTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gYSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgaGFzIGNvbXBsZXRlZC5cbiAqXG4gKiBPbiBOb2RlLmpzIHRoaXMgdXNlcyBzZXRJbW1lZGlhdGUgaW5zdGVhZCBvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuXG4gKlxuICogVGhpcyBpcyBzaW1wbHkgYSBzdWdhciBtZXRob2Qgc28gdGhhdCB1c2VycyBjYW4gZG8gdGhlIGZvbGxvd2luZzpcbiAqIGBhd2FpdCB0Zi5uZXh0RnJhbWUoKTtgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1BlcmZvcm1hbmNlJywgc3ViaGVhZGluZzogJ1RpbWluZyd9XG4gKi9cbmZ1bmN0aW9uIG5leHRGcmFtZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlPHZvaWQ+KHJlc29sdmUgPT4gZGVsYXlDYWxsYmFjaygoKSA9PiByZXNvbHZlKCkpKTtcbn1cblxuZXhwb3J0IHtuZXh0RnJhbWV9O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as util from '../util';\nexport function assertParamsConsistent(shapes, axis) {\n    const rank = shapes[0].length;\n    shapes.forEach((shape, i) => {\n        util.assert(shape.length === rank, () => `Error in concat${rank}D: rank of tensors[${i}] must be the same ` +\n            `as the rank of the rest (${rank})`);\n    });\n    util.assert(axis >= 0 && axis < rank, () => `Error in concat${rank}D: axis must be between 0 and ${rank - 1}.`);\n    const firstShape = shapes[0];\n    shapes.forEach((shape, i) => {\n        for (let r = 0; r < rank; r++) {\n            util.assert((r === axis) || (shape[r] === firstShape[r]), () => `Error in concat${rank}D: Shape of tensors[${i}] (${shape}) ` +\n                `does not match the shape of the rest (${firstShape}) ` +\n                `along the non-concatenated axis ${i}.`);\n        }\n    });\n}\nexport function computeOutShape(shapes, axis) {\n    const outputShape = shapes[0].slice();\n    for (let i = 1; i < shapes.length; i++) {\n        outputShape[axis] += shapes[i][axis];\n    }\n    return outputShape;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9jb25jYXRfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLFVBQVUsc0JBQXNCLENBQUMsTUFBa0IsRUFBRSxJQUFZO0lBQ3JFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMxQixJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUNyQixHQUFHLEVBQUUsQ0FDRCxrQkFBa0IsSUFBSSxzQkFBc0IsQ0FBQyxxQkFBcUI7WUFDbEUsNEJBQTRCLElBQUksR0FBRyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFFSCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxHQUFHLElBQUksRUFDeEIsR0FBRyxFQUFFLENBQUMsa0JBQWtCLElBQUksaUNBQWlDLElBQUksR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTlFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDN0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDNUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLElBQUksdUJBQXVCLENBQUMsTUFBTSxLQUFLLElBQUk7Z0JBQy9ELHlDQUF5QyxVQUFVLElBQUk7Z0JBQ3ZELG1DQUFtQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2xEO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FBQyxNQUFrQixFQUFFLElBQVk7SUFDOUQsTUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RDLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDdEM7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgKiBhcyB1dGlsIGZyb20gJy4uL3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChzaGFwZXM6IG51bWJlcltdW10sIGF4aXM6IG51bWJlcikge1xuICBjb25zdCByYW5rID0gc2hhcGVzWzBdLmxlbmd0aDtcbiAgc2hhcGVzLmZvckVhY2goKHNoYXBlLCBpKSA9PiB7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHNoYXBlLmxlbmd0aCA9PT0gcmFuayxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGBFcnJvciBpbiBjb25jYXQke3Jhbmt9RDogcmFuayBvZiB0ZW5zb3JzWyR7aX1dIG11c3QgYmUgdGhlIHNhbWUgYCArXG4gICAgICAgICAgICBgYXMgdGhlIHJhbmsgb2YgdGhlIHJlc3QgKCR7cmFua30pYCk7XG4gIH0pO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYXhpcyA+PSAwICYmIGF4aXMgPCByYW5rLFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbmNhdCR7cmFua31EOiBheGlzIG11c3QgYmUgYmV0d2VlbiAwIGFuZCAke3JhbmsgLSAxfS5gKTtcblxuICBjb25zdCBmaXJzdFNoYXBlID0gc2hhcGVzWzBdO1xuICBzaGFwZXMuZm9yRWFjaCgoc2hhcGUsIGkpID0+IHtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHJhbms7IHIrKykge1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgKHIgPT09IGF4aXMpIHx8IChzaGFwZVtyXSA9PT0gZmlyc3RTaGFwZVtyXSksXG4gICAgICAgICAgKCkgPT4gYEVycm9yIGluIGNvbmNhdCR7cmFua31EOiBTaGFwZSBvZiB0ZW5zb3JzWyR7aX1dICgke3NoYXBlfSkgYCArXG4gICAgICAgICAgICAgIGBkb2VzIG5vdCBtYXRjaCB0aGUgc2hhcGUgb2YgdGhlIHJlc3QgKCR7Zmlyc3RTaGFwZX0pIGAgK1xuICAgICAgICAgICAgICBgYWxvbmcgdGhlIG5vbi1jb25jYXRlbmF0ZWQgYXhpcyAke2l9LmApO1xuICAgIH1cbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3V0U2hhcGUoc2hhcGVzOiBudW1iZXJbXVtdLCBheGlzOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGVzWzBdLnNsaWNlKCk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgc2hhcGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgb3V0cHV0U2hhcGVbYXhpc10gKz0gc2hhcGVzW2ldW2F4aXNdO1xuICB9XG4gIHJldHVybiBvdXRwdXRTaGFwZTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport var RowPartitionType;\n(function (RowPartitionType) {\n    RowPartitionType[RowPartitionType[\"FIRST_DIM_SIZE\"] = 0] = \"FIRST_DIM_SIZE\";\n    RowPartitionType[RowPartitionType[\"VALUE_ROWIDS\"] = 1] = \"VALUE_ROWIDS\";\n    RowPartitionType[RowPartitionType[\"ROW_LENGTHS\"] = 2] = \"ROW_LENGTHS\";\n    RowPartitionType[RowPartitionType[\"ROW_SPLITS\"] = 3] = \"ROW_SPLITS\";\n    RowPartitionType[RowPartitionType[\"ROW_LIMITS\"] = 4] = \"ROW_LIMITS\";\n    RowPartitionType[RowPartitionType[\"ROW_STARTS\"] = 5] = \"ROW_STARTS\";\n})(RowPartitionType || (RowPartitionType = {}));\nexport function combineRaggedTensorToTensorShapes(raggedRank, shape, valueShape) {\n    // Test for consistency of valueShape and shape specified.\n    // If shape is unspecified and valueShape is specified, then copy\n    // over the size from the valueShape dimension.\n    let outputShape = new Array();\n    if (valueShape == null && shape == null) {\n        return outputShape;\n    }\n    if (shape == null) {\n        // Here, value_shape must be of known size.\n        while (outputShape.length < raggedRank + valueShape.length) {\n            outputShape.push(-1);\n        }\n    }\n    else {\n        outputShape = shape.slice();\n    }\n    if (valueShape == null) {\n        return outputShape;\n    }\n    // At this point, valueShape and output_shape have known ranks.\n    if (raggedRank + valueShape.length !== outputShape.length) {\n        throw new Error(`rt input.shape and shape=${shape} are incompatible: rt input.rank = ${raggedRank +\n            valueShape.length}, but shape.rank = ${outputShape.length}`);\n    }\n    for (let i = 1; i < valueShape.length; ++i) {\n        const valueDim = valueShape[i];\n        const outputShapeDimIndex = outputShape[outputShape.length - valueShape.length + i];\n        const outputShapeDim = outputShape[outputShapeDimIndex];\n        if (valueDim >= 0) {\n            if (outputShapeDim >= 0) {\n                if (outputShapeDim !== valueDim) {\n                    throw new Error(`rt input.shape and shape=${shape} are incompatible: rt input.shape[${i + raggedRank}] = ${valueDim} but shape[${i + raggedRank}] = ${outputShapeDim}`);\n                }\n            }\n            else {\n                outputShape[outputShapeDimIndex] = valueDim;\n            }\n        }\n    }\n    return outputShape;\n}\nexport function getRowPartitionTypesHelper(rowPartitionTypeStrings) {\n    const stringToType = {\n        'FIRST_DIM_SIZE': RowPartitionType.FIRST_DIM_SIZE,\n        'VALUE_ROWIDS': RowPartitionType.VALUE_ROWIDS,\n        'ROW_LENGTHS': RowPartitionType.ROW_LENGTHS,\n        'ROW_SPLITS': RowPartitionType.ROW_SPLITS,\n        'ROW_LIMITS': RowPartitionType.ROW_LIMITS,\n        'ROW_STARTS': RowPartitionType.ROW_STARTS\n    };\n    const result = [];\n    for (const typeStr of rowPartitionTypeStrings) {\n        if (typeStr in stringToType) {\n            result.push(stringToType[typeStr]);\n        }\n        else {\n            break;\n        }\n    }\n    return result;\n}\nexport function getRaggedRank(rowPartitionTypes) {\n    if (rowPartitionTypes.length === 0) {\n        return 0;\n    }\n    if (rowPartitionTypes[0] === RowPartitionType.FIRST_DIM_SIZE) {\n        return rowPartitionTypes.length - 1;\n    }\n    return rowPartitionTypes.length;\n}\nexport function validateDefaultValueShape(defaultValueShape, valueShape) {\n    if (defaultValueShape == null || valueShape == null) {\n        return;\n    }\n    const defaultNDims = defaultValueShape.length;\n    const valuesNDims = valueShape.length;\n    if (defaultNDims >= valuesNDims) {\n        throw new Error(`defaultValue.shape=${defaultValueShape} and ragged tensor flatValues.shape=${valueShape}, are incompatible: defaultValue.rank = ${defaultNDims} must be less than ragged tensor input flatValues.rank = ${valuesNDims})`);\n    }\n    for (let i = 0; i < Math.min(defaultNDims, valuesNDims - 1); ++i) {\n        const defaultDim = defaultValueShape[i];\n        const valueDim = valueShape[i + 1];\n        if (defaultDim >= 0 && valueDim >= 0 && defaultDim !== 1 &&\n            defaultDim !== valueDim) {\n            throw new Error(`defaultValue.shape=${defaultValueShape}, and ragged tensor input flatValues.shape=${valueShape} are incompatible: defaultValue.shape[${i - defaultValueShape.length}] = ${defaultDim} but ragged tensor input.flatValues.shape[${i - defaultValueShape.length}] = ${valueDim}`);\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmFnZ2VkX3RvX2RlbnNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yYWdnZWRfdG9fZGVuc2VfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxNQUFNLENBQU4sSUFBWSxnQkFPWDtBQVBELFdBQVksZ0JBQWdCO0lBQzFCLDJFQUFjLENBQUE7SUFDZCx1RUFBWSxDQUFBO0lBQ1oscUVBQVcsQ0FBQTtJQUNYLG1FQUFVLENBQUE7SUFDVixtRUFBVSxDQUFBO0lBQ1YsbUVBQVUsQ0FBQTtBQUNaLENBQUMsRUFQVyxnQkFBZ0IsS0FBaEIsZ0JBQWdCLFFBTzNCO0FBRUQsTUFBTSxVQUFVLGlDQUFpQyxDQUM3QyxVQUFrQixFQUFFLEtBQWUsRUFBRSxVQUFvQjtJQUMzRCwwREFBMEQ7SUFDMUQsaUVBQWlFO0lBQ2pFLCtDQUErQztJQUUvQyxJQUFJLFdBQVcsR0FBYSxJQUFJLEtBQUssRUFBRSxDQUFDO0lBQ3hDLElBQUksVUFBVSxJQUFJLElBQUksSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ3ZDLE9BQU8sV0FBVyxDQUFDO0tBQ3BCO0lBRUQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ2pCLDJDQUEyQztRQUMzQyxPQUFPLFdBQVcsQ0FBQyxNQUFNLEdBQUcsVUFBVSxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUU7WUFDMUQsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3RCO0tBQ0Y7U0FBTTtRQUNMLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7S0FDN0I7SUFDRCxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsT0FBTyxXQUFXLENBQUM7S0FDcEI7SUFDRCwrREFBK0Q7SUFDL0QsSUFBSSxVQUFVLEdBQUcsVUFBVSxDQUFDLE1BQU0sS0FBSyxX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QUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLEVBQUUsV0FBVyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ2hFLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDbkMsSUFBSSxVQUFVLElBQUksQ0FBQyxJQUFJLFFBQVEsSUFBSSxDQUFDLElBQUksVUFBVSxLQUFLLENBQUM7WUFDcEQsVUFBVSxLQUFLLFFBQVEsRUFBRTtZQUMzQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUNaLGlCQUFpQiw4Q0FDakIsVUFBVSx5Q0FDVixDQUFDLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxPQUM1QixVQUFVLDZDQUNWLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLE9BQU8sUUFBUSxFQUFFLENBQUMsQ0FBQztTQUNwRDtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuZXhwb3J0IGVudW0gUm93UGFydGl0aW9uVHlwZSB7XG4gIEZJUlNUX0RJTV9TSVpFLFxuICBWQUxVRV9ST1dJRFMsXG4gIFJPV19MRU5HVEhTLFxuICBST1dfU1BMSVRTLFxuICBST1dfTElNSVRTLFxuICBST1dfU1RBUlRTXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21iaW5lUmFnZ2VkVGVuc29yVG9UZW5zb3JTaGFwZXMoXG4gICAgcmFnZ2VkUmFuazogbnVtYmVyLCBzaGFwZTogbnVtYmVyW10sIHZhbHVlU2hhcGU6IG51bWJlcltdKSB7XG4gIC8vIFRlc3QgZm9yIGNvbnNpc3RlbmN5IG9mIHZhbHVlU2hhcGUgYW5kIHNoYXBlIHNwZWNpZmllZC5cbiAgLy8gSWYgc2hhcGUgaXMgdW5zcGVjaWZpZWQgYW5kIHZhbHVlU2hhcGUgaXMgc3BlY2lmaWVkLCB0aGVuIGNvcHlcbiAgLy8gb3ZlciB0aGUgc2l6ZSBmcm9tIHRoZSB2YWx1ZVNoYXBlIGRpbWVuc2lvbi5cblxuICBsZXQgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KCk7XG4gIGlmICh2YWx1ZVNoYXBlID09IG51bGwgJiYgc2hhcGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBvdXRwdXRTaGFwZTtcbiAgfVxuXG4gIGlmIChzaGFwZSA9PSBudWxsKSB7XG4gICAgLy8gSGVyZSwgdmFsdWVfc2hhcGUgbXVzdCBiZSBvZiBrbm93biBzaXplLlxuICAgIHdoaWxlIChvdXRwdXRTaGFwZS5sZW5ndGggPCByYWdnZWRSYW5rICsgdmFsdWVTaGFwZS5sZW5ndGgpIHtcbiAgICAgIG91dHB1dFNoYXBlLnB1c2goLTEpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBvdXRwdXRTaGFwZSA9IHNoYXBlLnNsaWNlKCk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgPT0gbnVsbCkge1xuICAgIHJldHVybiBvdXRwdXRTaGFwZTtcbiAgfVxuICAvLyBBdCB0aGlzIHBvaW50LCB2YWx1ZVNoYXBlIGFuZCBvdXRwdXRfc2hhcGUgaGF2ZSBrbm93biByYW5rcy5cbiAgaWYgKHJhZ2dlZFJhbmsgKyB2YWx1ZVNoYXBlLmxlbmd0aCAhPT0gb3V0cHV0U2hhcGUubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgcnQgaW5wdXQuc2hhcGUgYW5kIHNoYXBlPSR7c2hhcGV9IGFyZSBpbmNvbXBhdGlibGU6IHJ0IGlucHV0LnJhbmsgPSAke1xuICAgICAgICAgICAgcmFnZ2VkUmFuayArXG4gICAgICAgICAgICB2YWx1ZVNoYXBlLmxlbmd0aH0sIGJ1dCBzaGFwZS5yYW5rID0gJHtvdXRwdXRTaGFwZS5sZW5ndGh9YCk7XG4gIH1cblxuICBmb3IgKGxldCBpID0gMTsgaSA8IHZhbHVlU2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCB2YWx1ZURpbSA9IHZhbHVlU2hhcGVbaV07XG4gICAgY29uc3Qgb3V0cHV0U2hhcGVEaW1JbmRleCA9XG4gICAgICAgIG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIHZhbHVlU2hhcGUubGVuZ3RoICsgaV07XG4gICAgY29uc3Qgb3V0cHV0U2hhcGVEaW0gPSBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZURpbUluZGV4XTtcblxuICAgIGlmICh2YWx1ZURpbSA+PSAwKSB7XG4gICAgICBpZiAob3V0cHV0U2hhcGVEaW0gPj0gMCkge1xuICAgICAgICBpZiAob3V0cHV0U2hhcGVEaW0gIT09IHZhbHVlRGltKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBydCBpbnB1dC5zaGFwZSBhbmQgc2hhcGU9JHtcbiAgICAgICAgICAgICAgc2hhcGV9IGFyZSBpbmNvbXBhdGlibGU6IHJ0IGlucHV0LnNoYXBlWyR7aSArIHJhZ2dlZFJhbmt9XSA9ICR7XG4gICAgICAgICAgICAgIHZhbHVlRGltfSBidXQgc2hhcGVbJHtpICsgcmFnZ2VkUmFua31dID0gJHtvdXRwdXRTaGFwZURpbX1gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0U2hhcGVbb3V0cHV0U2hhcGVEaW1JbmRleF0gPSB2YWx1ZURpbTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHB1dFNoYXBlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Um93UGFydGl0aW9uVHlwZXNIZWxwZXIocm93UGFydGl0aW9uVHlwZVN0cmluZ3M6IHN0cmluZ1tdKSB7XG4gIGNvbnN0IHN0cmluZ1RvVHlwZSA9IHtcbiAgICAnRklSU1RfRElNX1NJWkUnOiBSb3dQYXJ0aXRpb25UeXBlLkZJUlNUX0RJTV9TSVpFLFxuICAgICdWQUxVRV9ST1dJRFMnOiBSb3dQYXJ0aXRpb25UeXBlLlZBTFVFX1JPV0lEUyxcbiAgICAnUk9XX0xFTkdUSFMnOiBSb3dQYXJ0aXRpb25UeXBlLlJPV19MRU5HVEhTLFxuICAgICdST1dfU1BMSVRTJzogUm93UGFydGl0aW9uVHlwZS5ST1dfU1BMSVRTLFxuICAgICdST1dfTElNSVRTJzogUm93UGFydGl0aW9uVHlwZS5ST1dfTElNSVRTLFxuICAgICdST1dfU1RBUlRTJzogUm93UGFydGl0aW9uVHlwZS5ST1dfU1RBUlRTXG4gIH07XG5cbiAgY29uc3QgcmVzdWx0OiBSb3dQYXJ0aXRpb25UeXBlW10gPSBbXTtcbiAgZm9yIChjb25zdCB0eXBlU3RyIG9mIHJvd1BhcnRpdGlvblR5cGVTdHJpbmdzKSB7XG4gICAgaWYgKHR5cGVTdHIgaW4gc3RyaW5nVG9UeXBlKSB7XG4gICAgICByZXN1bHQucHVzaChzdHJpbmdUb1R5cGVbdHlwZVN0ciBhcyBrZXlvZiB0eXBlb2Ygc3RyaW5nVG9UeXBlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRSYWdnZWRSYW5rKHJvd1BhcnRpdGlvblR5cGVzOiBSb3dQYXJ0aXRpb25UeXBlW10pIHtcbiAgaWYgKHJvd1BhcnRpdGlvblR5cGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChyb3dQYXJ0aXRpb25UeXBlc1swXSA9PT0gUm93UGFydGl0aW9uVHlwZS5GSVJTVF9ESU1fU0laRSkge1xuICAgIHJldHVybiByb3dQYXJ0aXRpb25UeXBlcy5sZW5ndGggLSAxO1xuICB9XG4gIHJldHVybiByb3dQYXJ0aXRpb25UeXBlcy5sZW5ndGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZURlZmF1bHRWYWx1ZVNoYXBlKFxuICAgIGRlZmF1bHRWYWx1ZVNoYXBlOiBudW1iZXJbXSwgdmFsdWVTaGFwZTogbnVtYmVyW10pIHtcbiAgaWYgKGRlZmF1bHRWYWx1ZVNoYXBlID09IG51bGwgfHwgdmFsdWVTaGFwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgY29uc3QgZGVmYXVsdE5EaW1zID0gZGVmYXVsdFZhbHVlU2hhcGUubGVuZ3RoO1xuICBjb25zdCB2YWx1ZXNORGltcyA9IHZhbHVlU2hhcGUubGVuZ3RoO1xuICBpZiAoZGVmYXVsdE5EaW1zID49IHZhbHVlc05EaW1zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBkZWZhdWx0VmFsdWUuc2hhcGU9JHtcbiAgICAgICAgZGVmYXVsdFZhbHVlU2hhcGV9IGFuZCByYWdnZWQgdGVuc29yIGZsYXRWYWx1ZXMuc2hhcGU9JHtcbiAgICAgICAgdmFsdWVTaGFwZX0sIGFyZSBpbmNvbXBhdGlibGU6IGRlZmF1bHRWYWx1ZS5yYW5rID0gJHtcbiAgICAgICAgZGVmYXVsdE5EaW1zfSBtdXN0IGJlIGxlc3MgdGhhbiByYWdnZWQgdGVuc29yIGlucHV0IGZsYXRWYWx1ZXMucmFuayA9ICR7XG4gICAgICAgIHZhbHVlc05EaW1zfSlgKTtcbiAgfVxuICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGgubWluKGRlZmF1bHRORGltcywgdmFsdWVzTkRpbXMgLSAxKTsgKytpKSB7XG4gICAgY29uc3QgZGVmYXVsdERpbSA9IGRlZmF1bHRWYWx1ZVNoYXBlW2ldO1xuICAgIGNvbnN0IHZhbHVlRGltID0gdmFsdWVTaGFwZVtpICsgMV07XG4gICAgaWYgKGRlZmF1bHREaW0gPj0gMCAmJiB2YWx1ZURpbSA+PSAwICYmIGRlZmF1bHREaW0gIT09IDEgJiZcbiAgICAgICAgZGVmYXVsdERpbSAhPT0gdmFsdWVEaW0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgZGVmYXVsdFZhbHVlLnNoYXBlPSR7XG4gICAgICAgICAgZGVmYXVsdFZhbHVlU2hhcGV9LCBhbmQgcmFnZ2VkIHRlbnNvciBpbnB1dCBmbGF0VmFsdWVzLnNoYXBlPSR7XG4gICAgICAgICAgdmFsdWVTaGFwZX0gYXJlIGluY29tcGF0aWJsZTogZGVmYXVsdFZhbHVlLnNoYXBlWyR7XG4gICAgICAgICAgaSAtIGRlZmF1bHRWYWx1ZVNoYXBlLmxlbmd0aH1dID0gJHtcbiAgICAgICAgICBkZWZhdWx0RGltfSBidXQgcmFnZ2VkIHRlbnNvciBpbnB1dC5mbGF0VmFsdWVzLnNoYXBlWyR7XG4gICAgICAgICAgaSAtIGRlZmF1bHRWYWx1ZVNoYXBlLmxlbmd0aH1dID0gJHt2YWx1ZURpbX1gKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Inputs of size above this threshold will be parallelized by calling multiple\n * shader programs.\n */\nimport { nearestDivisor } from '../util';\nexport const PARALLELIZE_THRESHOLD = 30;\nexport function computeOptimalWindowSize(inSize) {\n    if (inSize <= PARALLELIZE_THRESHOLD) {\n        return inSize;\n    }\n    return nearestDivisor(inSize, Math.floor(Math.sqrt(inSize)));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yZWR1Y2VfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7O0dBR0c7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEVBQUUsQ0FBQztBQVN4QyxNQUFNLFVBQVUsd0JBQXdCLENBQUMsTUFBYztJQUNyRCxJQUFJLE1BQU0sSUFBSSxxQkFBcUIsRUFBRTtRQUNuQyxPQUFPLE1BQU0sQ0FBQztLQUNmO0lBQ0QsT0FBTyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJbnB1dHMgb2Ygc2l6ZSBhYm92ZSB0aGlzIHRocmVzaG9sZCB3aWxsIGJlIHBhcmFsbGVsaXplZCBieSBjYWxsaW5nIG11bHRpcGxlXG4gKiBzaGFkZXIgcHJvZ3JhbXMuXG4gKi9cbmltcG9ydCB7bmVhcmVzdERpdmlzb3J9IGZyb20gJy4uL3V0aWwnO1xuXG5leHBvcnQgY29uc3QgUEFSQUxMRUxJWkVfVEhSRVNIT0xEID0gMzA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVkdWNlSW5mbyB7XG4gIHdpbmRvd1NpemU6IG51bWJlcjtcbiAgYmF0Y2hTaXplOiBudW1iZXI7XG4gIGluU2l6ZTogbnVtYmVyO1xuICBvdXRTaXplOiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoaW5TaXplOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoaW5TaXplIDw9IFBBUkFMTEVMSVpFX1RIUkVTSE9MRCkge1xuICAgIHJldHVybiBpblNpemU7XG4gIH1cbiAgcmV0dXJuIG5lYXJlc3REaXZpc29yKGluU2l6ZSwgTWF0aC5mbG9vcihNYXRoLnNxcnQoaW5TaXplKSkpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Returns the image center in pixels.\nexport function getImageCenter(center, imageHeight, imageWidth) {\n    const centerX = imageWidth * (typeof center === 'number' ? center : center[0]);\n    const centerY = imageHeight * (typeof center === 'number' ? center : center[1]);\n    return [centerX, centerY];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9yb3RhdGVfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxzQ0FBc0M7QUFDdEMsTUFBTSxVQUFVLGNBQWMsQ0FDMUIsTUFBK0IsRUFBRSxXQUFtQixFQUNwRCxVQUFrQjtJQUNwQixNQUFNLE9BQU8sR0FDVCxVQUFVLEdBQUcsQ0FBQyxPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkUsTUFBTSxPQUFPLEdBQ1QsV0FBVyxHQUFHLENBQUMsT0FBTyxNQUFNLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDNUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gUmV0dXJucyB0aGUgaW1hZ2UgY2VudGVyIGluIHBpeGVscy5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbWFnZUNlbnRlcihcbiAgICBjZW50ZXI6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdLCBpbWFnZUhlaWdodDogbnVtYmVyLFxuICAgIGltYWdlV2lkdGg6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBjZW50ZXJYID1cbiAgICAgIGltYWdlV2lkdGggKiAodHlwZW9mIGNlbnRlciA9PT0gJ251bWJlcicgPyBjZW50ZXIgOiBjZW50ZXJbMF0pO1xuICBjb25zdCBjZW50ZXJZID1cbiAgICAgIGltYWdlSGVpZ2h0ICogKHR5cGVvZiBjZW50ZXIgPT09ICdudW1iZXInID8gY2VudGVyIDogY2VudGVyWzFdKTtcbiAgcmV0dXJuIFtjZW50ZXJYLCBjZW50ZXJZXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Gets the new shape of the input Tensor after it's been reshaped\n * to:\n * [blockShape[0], ..., blockShape[M-1], batch / prod(blockShape),\n * inputShape[1], ..., inputShape[N-1]]\n *\n * See step 1: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n */\nexport function getReshaped(inputShape, blockShape, prod, batchToSpace = true) {\n    let reshaped = [];\n    if (batchToSpace) {\n        reshaped = reshaped.concat(blockShape.slice(0));\n        reshaped.push(inputShape[0] / prod);\n        reshaped = reshaped.concat(inputShape.slice(1));\n    }\n    else {\n        reshaped = reshaped.concat(inputShape[0]);\n        const spatialLength = blockShape.length;\n        for (let i = 0; i < spatialLength; ++i) {\n            reshaped =\n                reshaped.concat([inputShape[i + 1] / blockShape[i], blockShape[i]]);\n        }\n        reshaped = reshaped.concat(inputShape.slice(spatialLength + 1));\n    }\n    return reshaped;\n}\n/**\n * Gets the permutation that will transpose the dimensions of the\n * reshaped tensor to shape:\n *\n * [batch / prod(block_shape),inputShape[1], blockShape[0], ...,\n * inputShape[M], blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]]\n *\n * see step 2: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n */\nexport function getPermuted(reshapedRank, blockShapeRank, batchToSpace = true) {\n    const permuted = [];\n    if (batchToSpace) {\n        permuted.push(blockShapeRank);\n        for (let i = blockShapeRank + 1; i < reshapedRank; ++i) {\n            if (i <= 2 * blockShapeRank) {\n                permuted.push(i);\n                permuted.push(i - (blockShapeRank + 1));\n            }\n            else {\n                permuted.push(i);\n            }\n        }\n    }\n    else {\n        const permutedBeforeBatch = [];\n        const permutedAfterBatch = [];\n        for (let i = 1; i < reshapedRank; ++i) {\n            if (i >= blockShapeRank * 2 + 1 || i % 2 === 1) {\n                permutedAfterBatch.push(i);\n            }\n            else {\n                permutedBeforeBatch.push(i);\n            }\n        }\n        permuted.push(...permutedBeforeBatch);\n        permuted.push(0);\n        permuted.push(...permutedAfterBatch);\n    }\n    return permuted;\n}\n/**\n * Gets the shape of the reshaped and permuted input Tensor before any cropping\n * is applied.  The new shape will be:\n *\n * [batch / prod(blockShape),inputShape[1] * blockShape[0], ...,\n * inputShape[M] * blockShape[M-1],inputShape[M+1], ..., inputShape[N-1]]\n *\n * See step 3: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n */\nexport function getReshapedPermuted(inputShape, blockShape, prod, batchToSpace = true) {\n    const reshapedPermuted = [];\n    if (batchToSpace) {\n        reshapedPermuted.push(inputShape[0] / prod);\n    }\n    else {\n        reshapedPermuted.push(inputShape[0] * prod);\n    }\n    for (let i = 1; i < inputShape.length; ++i) {\n        if (i <= blockShape.length) {\n            if (batchToSpace) {\n                reshapedPermuted.push(blockShape[i - 1] * inputShape[i]);\n            }\n            else {\n                reshapedPermuted.push(inputShape[i] / blockShape[i - 1]);\n            }\n        }\n        else {\n            reshapedPermuted.push(inputShape[i]);\n        }\n    }\n    return reshapedPermuted;\n}\n/**\n * Converts the crops argument into the beginning coordinates of a slice\n * operation.\n */\nexport function getSliceBeginCoords(crops, blockShape) {\n    const sliceBeginCoords = [0];\n    for (let i = 0; i < blockShape; ++i) {\n        sliceBeginCoords.push(crops[i][0]);\n    }\n    return sliceBeginCoords;\n}\n/**\n * Converts the crops argument into the size of a slice operation.  When\n * combined with getSliceBeginCoords this function allows the reshaped and\n * permuted Tensor to be cropped to its final output shape of:\n *\n * inputShape[1] * blockShape[0] - crops[0,0] - crops[0,1], ...,\n * inputShape[M] * blockShape[M-1] -crops[M-1,0] -\n * crops[M-1,1],inputShape[M+1], ..., inputShape[N-1]]\n *\n * See step 4: https://www.tensorflow.org/api_docs/python/tf/batch_to_space_nd\n */\nexport function getSliceSize(uncroppedShape, crops, blockShape) {\n    const sliceSize = uncroppedShape.slice(0, 1);\n    for (let i = 0; i < blockShape; ++i) {\n        sliceSize.push(uncroppedShape[i + 1] - crops[i][0] - crops[i][1]);\n    }\n    return sliceSize;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJyYXlfb3BzX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9hcnJheV9vcHNfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFdBQVcsQ0FDdkIsVUFBb0IsRUFBRSxVQUFvQixFQUFFLElBQVksRUFDeEQsWUFBWSxHQUFHLElBQUk7SUFDckIsSUFBSSxRQUFRLEdBQWEsRUFBRSxDQUFDO0lBQzVCLElBQUksWUFBWSxFQUFFO1FBQ2hCLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUNwQyxRQUFRLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDakQ7U0FBTTtRQUNMLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sYUFBYSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7UUFDeEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN0QyxRQUFRO2dCQUNKLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3pFO1FBQ0QsUUFBUSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsVUFB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TyxnQkFBZ0IsQ0FBQztBQUMxQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUMvQixLQUFpQixFQUFFLFVBQWtCO0lBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ25DLGdCQUFnQixDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwQztJQUNELE9BQU8sZ0JBQWdCLENBQUM7QUFDMUIsQ0FBQztBQUVEOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsWUFBWSxDQUN4QixjQUF3QixFQUFFLEtBQWlCLEVBQUUsVUFBa0I7SUFDakUsTUFBTSxTQUFTLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNuQyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ25FO0lBRUQsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBHZXRzIHRoZSBuZXcgc2hhcGUgb2YgdGhlIGlucHV0IFRlbnNvciBhZnRlciBpdCdzIGJlZW4gcmVzaGFwZWRcbiAqIHRvOlxuICogW2Jsb2NrU2hhcGVbMF0sIC4uLiwgYmxvY2tTaGFwZVtNLTFdLCBiYXRjaCAvIHByb2QoYmxvY2tTaGFwZSksXG4gKiBpbnB1dFNoYXBlWzFdLCAuLi4sIGlucHV0U2hhcGVbTi0xXV1cbiAqXG4gKiBTZWUgc3RlcCAxOiBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvYmF0Y2hfdG9fc3BhY2VfbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFJlc2hhcGVkKFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLCBibG9ja1NoYXBlOiBudW1iZXJbXSwgcHJvZDogbnVtYmVyLFxuICAgIGJhdGNoVG9TcGFjZSA9IHRydWUpOiBudW1iZXJbXSB7XG4gIGxldCByZXNoYXBlZDogbnVtYmVyW10gPSBbXTtcbiAgaWYgKGJhdGNoVG9TcGFjZSkge1xuICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGJsb2NrU2hhcGUuc2xpY2UoMCkpO1xuICAgIHJlc2hhcGVkLnB1c2goaW5wdXRTaGFwZVswXSAvIHByb2QpO1xuICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGUuc2xpY2UoMSkpO1xuICB9IGVsc2Uge1xuICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGVbMF0pO1xuICAgIGNvbnN0IHNwYXRpYWxMZW5ndGggPSBibG9ja1NoYXBlLmxlbmd0aDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYXRpYWxMZW5ndGg7ICsraSkge1xuICAgICAgcmVzaGFwZWQgPVxuICAgICAgICAgIHJlc2hhcGVkLmNvbmNhdChbaW5wdXRTaGFwZVtpICsgMV0gLyBibG9ja1NoYXBlW2ldLCBibG9ja1NoYXBlW2ldXSk7XG4gICAgfVxuICAgIHJlc2hhcGVkID0gcmVzaGFwZWQuY29uY2F0KGlucHV0U2hhcGUuc2xpY2Uoc3BhdGlhbExlbmd0aCArIDEpKTtcbiAgfVxuICByZXR1cm4gcmVzaGFwZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgcGVybXV0YXRpb24gdGhhdCB3aWxsIHRyYW5zcG9zZSB0aGUgZGltZW5zaW9ucyBvZiB0aGVcbiAqIHJlc2hhcGVkIHRlbnNvciB0byBzaGFwZTpcbiAqXG4gKiBbYmF0Y2ggLyBwcm9kKGJsb2NrX3NoYXBlKSxpbnB1dFNoYXBlWzFdLCBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dLCBibG9ja1NoYXBlW00tMV0saW5wdXRTaGFwZVtNKzFdLCAuLi4sIGlucHV0U2hhcGVbTi0xXV1cbiAqXG4gKiBzZWUgc3RlcCAyOiBodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvYmF0Y2hfdG9fc3BhY2VfbmRcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFBlcm11dGVkKFxuICAgIHJlc2hhcGVkUmFuazogbnVtYmVyLCBibG9ja1NoYXBlUmFuazogbnVtYmVyLFxuICAgIGJhdGNoVG9TcGFjZSA9IHRydWUpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHBlcm11dGVkID0gW107XG4gIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICBwZXJtdXRlZC5wdXNoKGJsb2NrU2hhcGVSYW5rKTtcbiAgICBmb3IgKGxldCBpID0gYmxvY2tTaGFwZVJhbmsgKyAxOyBpIDwgcmVzaGFwZWRSYW5rOyArK2kpIHtcbiAgICAgIGlmIChpIDw9IDIgKiBibG9ja1NoYXBlUmFuaykge1xuICAgICAgICBwZXJtdXRlZC5wdXNoKGkpO1xuICAgICAgICBwZXJtdXRlZC5wdXNoKGkgLSAoYmxvY2tTaGFwZVJhbmsgKyAxKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZXJtdXRlZC5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBjb25zdCBwZXJtdXRlZEJlZm9yZUJhdGNoID0gW107XG4gICAgY29uc3QgcGVybXV0ZWRBZnRlckJhdGNoID0gW107XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCByZXNoYXBlZFJhbms7ICsraSkge1xuICAgICAgaWYgKGkgPj0gYmxvY2tTaGFwZVJhbmsgKiAyICsgMSB8fCBpICUgMiA9PT0gMSkge1xuICAgICAgICBwZXJtdXRlZEFmdGVyQmF0Y2gucHVzaChpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlcm11dGVkQmVmb3JlQmF0Y2gucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcGVybXV0ZWQucHVzaCguLi5wZXJtdXRlZEJlZm9yZUJhdGNoKTtcbiAgICBwZXJtdXRlZC5wdXNoKDApO1xuICAgIHBlcm11dGVkLnB1c2goLi4ucGVybXV0ZWRBZnRlckJhdGNoKTtcbiAgfVxuICByZXR1cm4gcGVybXV0ZWQ7XG59XG5cbi8qKlxuICogR2V0cyB0aGUgc2hhcGUgb2YgdGhlIHJlc2hhcGVkIGFuZCBwZXJtdXRlZCBpbnB1dCBUZW5zb3IgYmVmb3JlIGFueSBjcm9wcGluZ1xuICogaXMgYXBwbGllZC4gIFRoZSBuZXcgc2hhcGUgd2lsbCBiZTpcbiAqXG4gKiBbYmF0Y2ggLyBwcm9kKGJsb2NrU2hhcGUpLGlucHV0U2hhcGVbMV0gKiBibG9ja1NoYXBlWzBdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dICogYmxvY2tTaGFwZVtNLTFdLGlucHV0U2hhcGVbTSsxXSwgLi4uLCBpbnB1dFNoYXBlW04tMV1dXG4gKlxuICogU2VlIHN0ZXAgMzogaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL2JhdGNoX3RvX3NwYWNlX25kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZXNoYXBlZFBlcm11dGVkKFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLCBibG9ja1NoYXBlOiBudW1iZXJbXSwgcHJvZDogbnVtYmVyLFxuICAgIGJhdGNoVG9TcGFjZSA9IHRydWUpOiBudW1iZXJbXSB7XG4gIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPSBbXTtcblxuICBpZiAoYmF0Y2hUb1NwYWNlKSB7XG4gICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbMF0gLyBwcm9kKTtcbiAgfSBlbHNlIHtcbiAgICByZXNoYXBlZFBlcm11dGVkLnB1c2goaW5wdXRTaGFwZVswXSAqIHByb2QpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGkgPD0gYmxvY2tTaGFwZS5sZW5ndGgpIHtcbiAgICAgIGlmIChiYXRjaFRvU3BhY2UpIHtcbiAgICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGJsb2NrU2hhcGVbaSAtIDFdICogaW5wdXRTaGFwZVtpXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXNoYXBlZFBlcm11dGVkLnB1c2goaW5wdXRTaGFwZVtpXSAvIGJsb2NrU2hhcGVbaSAtIDFdKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmVzaGFwZWRQZXJtdXRlZC5wdXNoKGlucHV0U2hhcGVbaV0pO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXNoYXBlZFBlcm11dGVkO1xufVxuXG4vKipcbiAqIENvbnZlcnRzIHRoZSBjcm9wcyBhcmd1bWVudCBpbnRvIHRoZSBiZWdpbm5pbmcgY29vcmRpbmF0ZXMgb2YgYSBzbGljZVxuICogb3BlcmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U2xpY2VCZWdpbkNvb3JkcyhcbiAgICBjcm9wczogbnVtYmVyW11bXSwgYmxvY2tTaGFwZTogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCBzbGljZUJlZ2luQ29vcmRzID0gWzBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJsb2NrU2hhcGU7ICsraSkge1xuICAgIHNsaWNlQmVnaW5Db29yZHMucHVzaChjcm9wc1tpXVswXSk7XG4gIH1cbiAgcmV0dXJuIHNsaWNlQmVnaW5Db29yZHM7XG59XG5cbi8qKlxuICogQ29udmVydHMgdGhlIGNyb3BzIGFyZ3VtZW50IGludG8gdGhlIHNpemUgb2YgYSBzbGljZSBvcGVyYXRpb24uICBXaGVuXG4gKiBjb21iaW5lZCB3aXRoIGdldFNsaWNlQmVnaW5Db29yZHMgdGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIHJlc2hhcGVkIGFuZFxuICogcGVybXV0ZWQgVGVuc29yIHRvIGJlIGNyb3BwZWQgdG8gaXRzIGZpbmFsIG91dHB1dCBzaGFwZSBvZjpcbiAqXG4gKiBpbnB1dFNoYXBlWzFdICogYmxvY2tTaGFwZVswXSAtIGNyb3BzWzAsMF0gLSBjcm9wc1swLDFdLCAuLi4sXG4gKiBpbnB1dFNoYXBlW01dICogYmxvY2tTaGFwZVtNLTFdIC1jcm9wc1tNLTEsMF0gLVxuICogY3JvcHNbTS0xLDFdLGlucHV0U2hhcGVbTSsxXSwgLi4uLCBpbnB1dFNoYXBlW04tMV1dXG4gKlxuICogU2VlIHN0ZXAgNDogaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL2JhdGNoX3RvX3NwYWNlX25kXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTbGljZVNpemUoXG4gICAgdW5jcm9wcGVkU2hhcGU6IG51bWJlcltdLCBjcm9wczogbnVtYmVyW11bXSwgYmxvY2tTaGFwZTogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCBzbGljZVNpemUgPSB1bmNyb3BwZWRTaGFwZS5zbGljZSgwLCAxKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBibG9ja1NoYXBlOyArK2kpIHtcbiAgICBzbGljZVNpemUucHVzaCh1bmNyb3BwZWRTaGFwZVtpICsgMV0gLSBjcm9wc1tpXVswXSAtIGNyb3BzW2ldWzFdKTtcbiAgfVxuXG4gIHJldHVybiBzbGljZVNpemU7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const SELU_SCALEALPHA = 1.7580993408473768599402175208123;\nexport const SELU_SCALE = 1.0507009873554804934193349852946;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsdV91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2VsdV91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBRyxpQ0FBaUMsQ0FBQztBQUNqRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsaUNBQWlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmV4cG9ydCBjb25zdCBTRUxVX1NDQUxFQUxQSEEgPSAxLjc1ODA5OTM0MDg0NzM3Njg1OTk0MDIxNzUyMDgxMjM7XG5leHBvcnQgY29uc3QgU0VMVV9TQ0FMRSA9IDEuMDUwNzAwOTg3MzU1NDgwNDkzNDE5MzM0OTg1Mjk0NjtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const ERF_P = 0.3275911;\nexport const ERF_A1 = 0.254829592;\nexport const ERF_A2 = -0.284496736;\nexport const ERF_A3 = 1.421413741;\nexport const ERF_A4 = -1.453152027;\nexport const ERF_A5 = 1.061405429;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJmX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9lcmZfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsU0FBUyxDQUFDO0FBQy9CLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUM7QUFDbEMsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLENBQUMsV0FBVyxDQUFDO0FBQ25DLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmV4cG9ydCBjb25zdCBFUkZfUCA9IDAuMzI3NTkxMTtcbmV4cG9ydCBjb25zdCBFUkZfQTEgPSAwLjI1NDgyOTU5MjtcbmV4cG9ydCBjb25zdCBFUkZfQTIgPSAtMC4yODQ0OTY3MzY7XG5leHBvcnQgY29uc3QgRVJGX0EzID0gMS40MjE0MTM3NDE7XG5leHBvcnQgY29uc3QgRVJGX0E0ID0gLTEuNDUzMTUyMDI3O1xuZXhwb3J0IGNvbnN0IEVSRl9BNSA9IDEuMDYxNDA1NDI5O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Merges real and imaginary Float32Arrays into a single complex Float32Array.\n *\n * The memory layout is interleaved as follows:\n * real: [r0, r1, r2]\n * imag: [i0, i1, i2]\n * complex: [r0, i0, r1, i1, r2, i2]\n *\n * This is the inverse of splitRealAndImagArrays.\n *\n * @param real The real values of the complex tensor values.\n * @param imag The imag values of the complex tensor values.\n * @returns A complex tensor as a Float32Array with merged values.\n */\nexport function mergeRealAndImagArrays(real, imag) {\n    if (real.length !== imag.length) {\n        throw new Error(`Cannot merge real and imag arrays of different lengths. real:` +\n            `${real.length}, imag: ${imag.length}.`);\n    }\n    const result = new Float32Array(real.length * 2);\n    for (let i = 0; i < result.length; i += 2) {\n        result[i] = real[i / 2];\n        result[i + 1] = imag[i / 2];\n    }\n    return result;\n}\n/**\n * Splits a complex Float32Array into real and imag parts.\n *\n * The memory layout is interleaved as follows:\n * complex: [r0, i0, r1, i1, r2, i2]\n * real: [r0, r1, r2]\n * imag: [i0, i1, i2]\n *\n * This is the inverse of mergeRealAndImagArrays.\n *\n * @param complex The complex tensor values.\n * @returns An object with real and imag Float32Array components of the complex\n *     tensor.\n */\nexport function splitRealAndImagArrays(complex) {\n    const real = new Float32Array(complex.length / 2);\n    const imag = new Float32Array(complex.length / 2);\n    for (let i = 0; i < complex.length; i += 2) {\n        real[i / 2] = complex[i];\n        imag[i / 2] = complex[i + 1];\n    }\n    return { real, imag };\n}\n/**\n * Extracts even indexed complex values in the given array.\n * @param complex The complex tensor values\n */\nexport function complexWithEvenIndex(complex) {\n    const len = Math.ceil(complex.length / 4);\n    const real = new Float32Array(len);\n    const imag = new Float32Array(len);\n    for (let i = 0; i < complex.length; i += 4) {\n        real[Math.floor(i / 4)] = complex[i];\n        imag[Math.floor(i / 4)] = complex[i + 1];\n    }\n    return { real, imag };\n}\n/**\n * Extracts odd indexed comple values in the given array.\n * @param complex The complex tensor values\n */\nexport function complexWithOddIndex(complex) {\n    const len = Math.floor(complex.length / 4);\n    const real = new Float32Array(len);\n    const imag = new Float32Array(len);\n    for (let i = 2; i < complex.length; i += 4) {\n        real[Math.floor(i / 4)] = complex[i];\n        imag[Math.floor(i / 4)] = complex[i + 1];\n    }\n    return { real, imag };\n}\n/**\n * Get the map representing a complex value in the given array.\n * @param complex The complex tensor values.\n * @param index An index of the target complex value.\n */\nexport function getComplexWithIndex(complex, index) {\n    const real = complex[index * 2];\n    const imag = complex[index * 2 + 1];\n    return { real, imag };\n}\n/**\n * Insert a given complex value into the TypedArray.\n * @param data The array in which the complex value is inserted.\n * @param c The complex value to be inserted.\n * @param index An index of the target complex value.\n */\nexport function assignToTypedArray(data, real, imag, index) {\n    data[index * 2] = real;\n    data[index * 2 + 1] = imag;\n}\n/**\n * Make the list of exponent terms used by FFT.\n */\nexport function exponents(n, inverse) {\n    const real = new Float32Array(n / 2);\n    const imag = new Float32Array(n / 2);\n    for (let i = 0; i < Math.ceil(n / 2); i++) {\n        const x = (inverse ? 2 : -2) * Math.PI * (i / n);\n        real[i] = Math.cos(x);\n        imag[i] = Math.sin(x);\n    }\n    return { real, imag };\n}\n/**\n * Make the exponent term used by FFT.\n */\nexport function exponent(k, n, inverse) {\n    const x = (inverse ? 2 : -2) * Math.PI * (k / n);\n    const real = Math.cos(x);\n    const imag = Math.sin(x);\n    return { real, imag };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9iYWNrZW5kcy9jb21wbGV4X3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0g7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILE1BQU0sVUFBVSxzQkFBc0IsQ0FDbEMsSUFBa0IsRUFBRSxJQUFrQjtJQUN4QyxJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU0sRUFBRTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUNYLCtEQUErRDtZQUMvRCxHQUFHLElBQUksQ0FBQyxNQUFNLFdBQVcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDOUM7SUFDRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDekMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEIsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBcUI7SUFFMUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxZQUFZLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNsRCxNQUFNLElBQUksR0FBRyxJQUFJLFlBQVksQ0FBQyxPQUFPLENBQUMsTUFB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LENBQUMsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekIsT0FBTyxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsQ0FBQztBQUN0QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1R5cGVkQXJyYXl9IGZyb20gJy4uL3R5cGVzJztcbi8qKlxuICogTWVyZ2VzIHJlYWwgYW5kIGltYWdpbmFyeSBGbG9hdDMyQXJyYXlzIGludG8gYSBzaW5nbGUgY29tcGxleCBGbG9hdDMyQXJyYXkuXG4gKlxuICogVGhlIG1lbW9yeSBsYXlvdXQgaXMgaW50ZXJsZWF2ZWQgYXMgZm9sbG93czpcbiAqIHJlYWw6IFtyMCwgcjEsIHIyXVxuICogaW1hZzogW2kwLCBpMSwgaTJdXG4gKiBjb21wbGV4OiBbcjAsIGkwLCByMSwgaTEsIHIyLCBpMl1cbiAqXG4gKiBUaGlzIGlzIHRoZSBpbnZlcnNlIG9mIHNwbGl0UmVhbEFuZEltYWdBcnJheXMuXG4gKlxuICogQHBhcmFtIHJlYWwgVGhlIHJlYWwgdmFsdWVzIG9mIHRoZSBjb21wbGV4IHRlbnNvciB2YWx1ZXMuXG4gKiBAcGFyYW0gaW1hZyBUaGUgaW1hZyB2YWx1ZXMgb2YgdGhlIGNvbXBsZXggdGVuc29yIHZhbHVlcy5cbiAqIEByZXR1cm5zIEEgY29tcGxleCB0ZW5zb3IgYXMgYSBGbG9hdDMyQXJyYXkgd2l0aCBtZXJnZWQgdmFsdWVzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhcbiAgICByZWFsOiBGbG9hdDMyQXJyYXksIGltYWc6IEZsb2F0MzJBcnJheSk6IEZsb2F0MzJBcnJheSB7XG4gIGlmIChyZWFsLmxlbmd0aCAhPT0gaW1hZy5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgbWVyZ2UgcmVhbCBhbmQgaW1hZyBhcnJheXMgb2YgZGlmZmVyZW50IGxlbmd0aHMuIHJlYWw6YCArXG4gICAgICAgIGAke3JlYWwubGVuZ3RofSwgaW1hZzogJHtpbWFnLmxlbmd0aH0uYCk7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gbmV3IEZsb2F0MzJBcnJheShyZWFsLmxlbmd0aCAqIDIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlc3VsdFtpXSA9IHJlYWxbaSAvIDJdO1xuICAgIHJlc3VsdFtpICsgMV0gPSBpbWFnW2kgLyAyXTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFNwbGl0cyBhIGNvbXBsZXggRmxvYXQzMkFycmF5IGludG8gcmVhbCBhbmQgaW1hZyBwYXJ0cy5cbiAqXG4gKiBUaGUgbWVtb3J5IGxheW91dCBpcyBpbnRlcmxlYXZlZCBhcyBmb2xsb3dzOlxuICogY29tcGxleDogW3IwLCBpMCwgcjEsIGkxLCByMiwgaTJdXG4gKiByZWFsOiBbcjAsIHIxLCByMl1cbiAqIGltYWc6IFtpMCwgaTEsIGkyXVxuICpcbiAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgbWVyZ2VSZWFsQW5kSW1hZ0FycmF5cy5cbiAqXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IHdpdGggcmVhbCBhbmQgaW1hZyBGbG9hdDMyQXJyYXkgY29tcG9uZW50cyBvZiB0aGUgY29tcGxleFxuICogICAgIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0UmVhbEFuZEltYWdBcnJheXMoY29tcGxleDogRmxvYXQzMkFycmF5KTpcbiAgICB7cmVhbDogRmxvYXQzMkFycmF5LCBpbWFnOiBGbG9hdDMyQXJyYXl9IHtcbiAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcGxleC5sZW5ndGggLyAyKTtcbiAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkoY29tcGxleC5sZW5ndGggLyAyKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wbGV4Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgcmVhbFtpIC8gMl0gPSBjb21wbGV4W2ldO1xuICAgIGltYWdbaSAvIDJdID0gY29tcGxleFtpICsgMV07XG4gIH1cbiAgcmV0dXJuIHtyZWFsLCBpbWFnfTtcbn1cblxuLyoqXG4gKiBFeHRyYWN0cyBldmVuIGluZGV4ZWQgY29tcGxleCB2YWx1ZXMgaW4gdGhlIGdpdmVuIGFycmF5LlxuICogQHBhcmFtIGNvbXBsZXggVGhlIGNvbXBsZXggdGVuc29yIHZhbHVlc1xuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGxleFdpdGhFdmVuSW5kZXgoY29tcGxleDogRmxvYXQzMkFycmF5KTpcbiAgICB7cmVhbDogRmxvYXQzMkFycmF5LCBpbWFnOiBGbG9hdDMyQXJyYXl9IHtcbiAgY29uc3QgbGVuID0gTWF0aC5jZWlsKGNvbXBsZXgubGVuZ3RoIC8gNCk7XG4gIGNvbnN0IHJlYWwgPSBuZXcgRmxvYXQzMkFycmF5KGxlbik7XG4gIGNvbnN0IGltYWcgPSBuZXcgRmxvYXQzMkFycmF5KGxlbik7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcGxleC5sZW5ndGg7IGkgKz0gNCkge1xuICAgIHJlYWxbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpXTtcbiAgICBpbWFnW01hdGguZmxvb3IoaSAvIDQpXSA9IGNvbXBsZXhbaSArIDFdO1xuICB9XG4gIHJldHVybiB7cmVhbCwgaW1hZ307XG59XG5cbi8qKlxuICogRXh0cmFjdHMgb2RkIGluZGV4ZWQgY29tcGxlIHZhbHVlcyBpbiB0aGUgZ2l2ZW4gYXJyYXkuXG4gKiBAcGFyYW0gY29tcGxleCBUaGUgY29tcGxleCB0ZW5zb3IgdmFsdWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4V2l0aE9kZEluZGV4KGNvbXBsZXg6IEZsb2F0MzJBcnJheSk6XG4gICAge3JlYWw6IEZsb2F0MzJBcnJheSwgaW1hZzogRmxvYXQzMkFycmF5fSB7XG4gIGNvbnN0IGxlbiA9IE1hdGguZmxvb3IoY29tcGxleC5sZW5ndGggLyA0KTtcbiAgY29uc3QgcmVhbCA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkobGVuKTtcbiAgZm9yIChsZXQgaSA9IDI7IGkgPCBjb21wbGV4Lmxlbmd0aDsgaSArPSA0KSB7XG4gICAgcmVhbFtNYXRoLmZsb29yKGkgLyA0KV0gPSBjb21wbGV4W2ldO1xuICAgIGltYWdbTWF0aC5mbG9vcihpIC8gNCldID0gY29tcGxleFtpICsgMV07XG4gIH1cbiAgcmV0dXJuIHtyZWFsLCBpbWFnfTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG1hcCByZXByZXNlbnRpbmcgYSBjb21wbGV4IHZhbHVlIGluIHRoZSBnaXZlbiBhcnJheS5cbiAqIEBwYXJhbSBjb21wbGV4IFRoZSBjb21wbGV4IHRlbnNvciB2YWx1ZXMuXG4gKiBAcGFyYW0gaW5kZXggQW4gaW5kZXggb2YgdGhlIHRhcmdldCBjb21wbGV4IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0Q29tcGxleFdpdGhJbmRleChcbiAgICBjb21wbGV4OiBGbG9hdDMyQXJyYXksIGluZGV4OiBudW1iZXIpOiB7cmVhbDogbnVtYmVyLCBpbWFnOiBudW1iZXJ9IHtcbiAgY29uc3QgcmVhbCA9IGNvbXBsZXhbaW5kZXggKiAyXTtcbiAgY29uc3QgaW1hZyA9IGNvbXBsZXhbaW5kZXggKiAyICsgMV07XG4gIHJldHVybiB7cmVhbCwgaW1hZ307XG59XG5cbi8qKlxuICogSW5zZXJ0IGEgZ2l2ZW4gY29tcGxleCB2YWx1ZSBpbnRvIHRoZSBUeXBlZEFycmF5LlxuICogQHBhcmFtIGRhdGEgVGhlIGFycmF5IGluIHdoaWNoIHRoZSBjb21wbGV4IHZhbHVlIGlzIGluc2VydGVkLlxuICogQHBhcmFtIGMgVGhlIGNvbXBsZXggdmFsdWUgdG8gYmUgaW5zZXJ0ZWQuXG4gKiBAcGFyYW0gaW5kZXggQW4gaW5kZXggb2YgdGhlIHRhcmdldCBjb21wbGV4IHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzaWduVG9UeXBlZEFycmF5KFxuICAgIGRhdGE6IFR5cGVkQXJyYXksIHJlYWw6IG51bWJlciwgaW1hZzogbnVtYmVyLCBpbmRleDogbnVtYmVyKSB7XG4gIGRhdGFbaW5kZXggKiAyXSA9IHJlYWw7XG4gIGRhdGFbaW5kZXggKiAyICsgMV0gPSBpbWFnO1xufVxuXG4vKipcbiAqIE1ha2UgdGhlIGxpc3Qgb2YgZXhwb25lbnQgdGVybXMgdXNlZCBieSBGRlQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleHBvbmVudHMoXG4gICAgbjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuKToge3JlYWw6IEZsb2F0MzJBcnJheSwgaW1hZzogRmxvYXQzMkFycmF5fSB7XG4gIGNvbnN0IHJlYWwgPSBuZXcgRmxvYXQzMkFycmF5KG4gLyAyKTtcbiAgY29uc3QgaW1hZyA9IG5ldyBGbG9hdDMyQXJyYXkobiAvIDIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IE1hdGguY2VpbChuIC8gMik7IGkrKykge1xuICAgIGNvbnN0IHggPSAoaW52ZXJzZSA/IDIgOiAtMikgKiBNYXRoLlBJICogKGkgLyBuKTtcbiAgICByZWFsW2ldID0gTWF0aC5jb3MoeCk7XG4gICAgaW1hZ1tpXSA9IE1hdGguc2luKHgpO1xuICB9XG4gIHJldHVybiB7cmVhbCwgaW1hZ307XG59XG5cbi8qKlxuICogTWFrZSB0aGUgZXhwb25lbnQgdGVybSB1c2VkIGJ5IEZGVC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4cG9uZW50KFxuICAgIGs6IG51bWJlciwgbjogbnVtYmVyLCBpbnZlcnNlOiBib29sZWFuKToge3JlYWw6IG51bWJlciwgaW1hZzogbnVtYmVyfSB7XG4gIGNvbnN0IHggPSAoaW52ZXJzZSA/IDIgOiAtMikgKiBNYXRoLlBJICogKGsgLyBuKTtcbiAgY29uc3QgcmVhbCA9IE1hdGguY29zKHgpO1xuICBjb25zdCBpbWFnID0gTWF0aC5zaW4oeCk7XG4gIHJldHVybiB7cmVhbCwgaW1hZ307XG59XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { assert } from '../util_base';\nconst ARROW = '->';\nconst ARROW_REGEX = /->/g;\nconst COMMA = ',';\nconst ELLIPSIS = '...';\n/**\n * Parse an equation for einsum.\n *\n * @param equation The einsum equation (e.g., \"ij,jk->ik\").\n * @param numTensors Number of tensors provided along with `equation`. Used to\n *   check matching number of input tensors.\n * @returns An object consisting of the following fields:\n *   - allDims: all dimension names as strings.\n *   - summedDims: a list of all dimensions being summed over, as indices to\n *     the elements of `allDims`.\n *   - idDims: indices of the dimensions in each input tensor, as indices to\n *     the elements of `allDims.\n */\nexport function decodeEinsumEquation(equation, numTensors) {\n    equation = equation.replace(/\\s/g, ''); // Remove witespace in equation.\n    const numArrows = (equation.length - equation.replace(ARROW_REGEX, '').length) /\n        ARROW.length;\n    if (numArrows < 1) {\n        throw new Error('Equations without an arrow are not supported.');\n    }\n    else if (numArrows > 1) {\n        throw new Error(`Equation must contain exactly one arrow (\"${ARROW}\").`);\n    }\n    const [inputString, outputString] = equation.split(ARROW);\n    assert(inputString.indexOf(ELLIPSIS) === -1, () => `The ellipsis notation (\"${ELLIPSIS}\") is not supported yet.`);\n    const inputTerms = inputString.split(COMMA);\n    const numInputs = inputTerms.length;\n    if (numTensors !== numInputs) {\n        throw new Error(`Expected ${numInputs} input tensors, received ${numTensors}`);\n    }\n    if (numInputs > 2) {\n        throw new Error('Support for more than 2 input tensors is not implemented yet.');\n    }\n    const allDims = [];\n    for (let i = 0; i < outputString.length; ++i) {\n        const dimName = outputString[i];\n        if (!inputTerms.some(inputTerm => inputTerm.indexOf(dimName) !== -1)) {\n            throw new Error(`Output subscripts contain the label ${dimName} ` +\n                `not present in the input subscripts.`);\n        }\n        if (allDims.indexOf(dimName) === -1) {\n            allDims.push(dimName);\n        }\n    }\n    for (let i = 0; i < inputString.length; ++i) {\n        const dimName = inputString[i];\n        if (allDims.indexOf(dimName) === -1 && dimName !== COMMA) {\n            allDims.push(dimName);\n        }\n    }\n    const idDims = new Array(inputTerms.length);\n    for (let i = 0; i < numInputs; ++i) {\n        if (new Set(inputTerms[i].split('')).size !== inputTerms[i].length) {\n            throw new Error(`Found duplicate axes in input component ${inputTerms[i]}. ` +\n                `Support for duplicate axes in input is not implemented yet.`);\n        }\n        idDims[i] = [];\n        for (let j = 0; j < inputTerms[i].length; ++j) {\n            idDims[i].push(allDims.indexOf(inputTerms[i][j]));\n        }\n    }\n    const numDims = allDims.length; // Number of unique dimensions.\n    const numOutDims = outputString.length; // Number of output dimensions.\n    const summedDims = []; // Dimensions being summed over.\n    for (let i = numOutDims; i < numDims; ++i) {\n        summedDims.push(i);\n    }\n    return { allDims, summedDims, idDims };\n}\n/**\n * Get the permutation for a given input tensor.\n *\n * @param nDims Total number of dimension of all tensors involved in the einsum\n *   operation.\n * @param idDims Dimension indices involve in the tensor in question.\n * @returns An object consisting of the following fields:\n *   - permutationIndices: Indices to permute the axes of the tensor with.\n *   - expandDims: Indices to the dimension that need to be expanded from the\n *     tensor after permutation.\n */\nexport function getEinsumPermutation(nDims, idDims) {\n    let permutationIndices = new Array(nDims);\n    permutationIndices.fill(-1);\n    for (let i = 0; i < idDims.length; ++i) {\n        permutationIndices[idDims[i]] = i;\n    }\n    const expandDims = [];\n    for (let i = 0; i < nDims; ++i) {\n        if (permutationIndices[i] === -1) {\n            expandDims.push(i);\n        }\n    }\n    permutationIndices = permutationIndices.filter(d => d !== -1);\n    return { permutationIndices, expandDims };\n}\n/**\n * Checks that the dimension sizes from different input tensors match the\n * equation.\n */\nexport function checkEinsumDimSizes(nDims, idDims, tensors) {\n    const dimSizes = new Array(nDims);\n    for (let i = 0; i < tensors.length; ++i) {\n        const shape = tensors[i].shape;\n        for (let j = 0; j < idDims[i].length; ++j) {\n            if (dimSizes[idDims[i][j]] === undefined) {\n                dimSizes[idDims[i][j]] = shape[j];\n            }\n            else {\n                assert(dimSizes[idDims[i][j]] === shape[j], () => `Expected dimension ${dimSizes[idDims[i][j]]} at axis ${j} ` +\n                    `of input shaped ${JSON.stringify(shape)}, ` +\n                    `but got dimension ${shape[j]}`);\n            }\n        }\n    }\n}\n/**\n * Gets path of computation for einsum.\n *\n * @param summedDims indices to the dimensions being summed over.\n * @param idDims A look up table for the dimensions present in each input\n *     tensor. Each consituent array contains indices for the dimensions in the\n *     corresponding input tensor.\n *\n * @return A map with two fields:\n *   - path: The path of computation, with each element indicating the dimension\n *     being summed over after the element-wise multiplication in that step.\n *   - steps: With the same length as `path`. Each element contains the indices\n *     to the input tensors being used for element-wise multiplication in the\n *     corresponding step.\n */\nexport function getEinsumComputePath(summedDims, idDims) {\n    const path = summedDims;\n    const steps = [];\n    let nSteps = 0;\n    if (summedDims.length === 0) {\n        // Einsum that involes no summing: e.g., transpose and outer product.\n        path.push(-1);\n    }\n    nSteps = summedDims.length + 1;\n    for (let i = 0; i < nSteps; ++i) {\n        steps.push([]);\n    }\n    const computedTermIndices = [];\n    for (let i = 0; i < path.length; ++i) {\n        const summedDim = path[i];\n        const termIndices = findTermsWithDim(idDims, summedDim);\n        for (const termIndex of termIndices) {\n            if (computedTermIndices.indexOf(termIndex) === -1) {\n                steps[i].push(termIndex);\n                computedTermIndices.push(termIndex);\n            }\n        }\n    }\n    return { path, steps };\n}\n/** Determines if an axes permutation is the identity permutation. */\nexport function isIdentityPermutation(perm) {\n    return perm.every((dim, index) => dim === index);\n}\nfunction findTermsWithDim(idDims, dim) {\n    const termIndices = [];\n    for (let i = 0; i < idDims.length; ++i) {\n        if (idDims[i].length === 0 || idDims[i].indexOf(dim) !== -1 || dim === -1) {\n            termIndices.push(i);\n        }\n    }\n    return termIndices;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWluc3VtX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2JhY2tlbmRzL2VpbnN1bV91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQVFILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFcEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ25CLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUMxQixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUM7QUFDbEIsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBRXZCOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO0lBS3ZFLFFBQVEsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFFLGdDQUFnQztJQUN6RSxNQUFNLFNBQVMsR0FDWCxDQUFDLFFBQVEsQ0FBQyxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDO1FBQzVELEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDakIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztLQUNsRTtTQUFNLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxLQUFLLEtBQUssQ0FBQyxDQUFDO0tBQzFFO0lBQ0QsTUFBTSxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELE1BQU0sQ0FDRixXQUFXLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMs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Q0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUFDLE1BQWtCLEVBQUUsR0FBVztJQUN2RCxNQUFNLFdBQVcsR0FBYSxFQUFFLENBQUM7SUFDakMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDdEMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUN6RSxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JCO0tBQ0Y7SUFDRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBjb21wdXRpbmcgZWluc3VtICh0ZW5zb3IgY29udHJhY3Rpb24gYW5kIHN1bW1hdGlvblxuICogYmFzZWQgb24gRWluc3RlaW4gc3VtbWF0aW9uLilcbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7YXNzZXJ0fSBmcm9tICcuLi91dGlsX2Jhc2UnO1xuXG5jb25zdCBBUlJPVyA9ICctPic7XG5jb25zdCBBUlJPV19SRUdFWCA9IC8tPi9nO1xuY29uc3QgQ09NTUEgPSAnLCc7XG5jb25zdCBFTExJUFNJUyA9ICcuLi4nO1xuXG4vKipcbiAqIFBhcnNlIGFuIGVxdWF0aW9uIGZvciBlaW5zdW0uXG4gKlxuICogQHBhcmFtIGVxdWF0aW9uIFRoZSBlaW5zdW0gZXF1YXRpb24gKGUuZy4sIFwiaWosamstPmlrXCIpLlxuICogQHBhcmFtIG51bVRlbnNvcnMgTnVtYmVyIG9mIHRlbnNvcnMgcHJvdmlkZWQgYWxvbmcgd2l0aCBgZXF1YXRpb25gLiBVc2VkIHRvXG4gKiAgIGNoZWNrIG1hdGNoaW5nIG51bWJlciBvZiBpbnB1dCB0ZW5zb3JzLlxuICogQHJldHVybnMgQW4gb2JqZWN0IGNvbnNpc3Rpbmcgb2YgdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gKiAgIC0gYWxsRGltczogYWxsIGRpbWVuc2lvbiBuYW1lcyBhcyBzdHJpbmdzLlxuICogICAtIHN1bW1lZERpbXM6IGEgbGlzdCBvZiBhbGwgZGltZW5zaW9ucyBiZWluZyBzdW1tZWQgb3ZlciwgYXMgaW5kaWNlcyB0b1xuICogICAgIHRoZSBlbGVtZW50cyBvZiBgYWxsRGltc2AuXG4gKiAgIC0gaWREaW1zOiBpbmRpY2VzIG9mIHRoZSBkaW1lbnNpb25zIGluIGVhY2ggaW5wdXQgdGVuc29yLCBhcyBpbmRpY2VzIHRvXG4gKiAgICAgdGhlIGVsZW1lbnRzIG9mIGBhbGxEaW1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlRWluc3VtRXF1YXRpb24oZXF1YXRpb246IHN0cmluZywgbnVtVGVuc29yczogbnVtYmVyKToge1xuICBhbGxEaW1zOiBzdHJpbmdbXSxcbiAgc3VtbWVkRGltczogbnVtYmVyW10sXG4gIGlkRGltczogbnVtYmVyW11bXSxcbn0ge1xuICBlcXVhdGlvbiA9IGVxdWF0aW9uLnJlcGxhY2UoL1xccy9nLCAnJyk7ICAvLyBSZW1vdmUgd2l0ZXNwYWNlIGluIGVxdWF0aW9uLlxuICBjb25zdCBudW1BcnJvd3MgPVxuICAgICAgKGVxdWF0aW9uLmxlbmd0aCAtIGVxdWF0aW9uLnJlcGxhY2UoQVJST1dfUkVHRVgsICcnKS5sZW5ndGgpIC9cbiAgICAgIEFSUk9XLmxlbmd0aDtcbiAgaWYgKG51bUFycm93cyA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0VxdWF0aW9ucyB3aXRob3V0IGFuIGFycm93IGFyZSBub3Qgc3VwcG9ydGVkLicpO1xuICB9IGVsc2UgaWYgKG51bUFycm93cyA+IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEVxdWF0aW9uIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBhcnJvdyAoXCIke0FSUk9XfVwiKS5gKTtcbiAgfVxuICBjb25zdCBbaW5wdXRTdHJpbmcsIG91dHB1dFN0cmluZ10gPSBlcXVhdGlvbi5zcGxpdChBUlJPVyk7XG4gIGFzc2VydChcbiAgICAgIGlucHV0U3RyaW5nLmluZGV4T2YoRUxMSVBTSVMpID09PSAtMSxcbiAgICAgICgpID0+IGBUaGUgZWxsaXBzaXMgbm90YXRpb24gKFwiJHtFTExJUFNJU31cIikgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYCk7XG4gIGNvbnN0IGlucHV0VGVybXMgPSBpbnB1dFN0cmluZy5zcGxpdChDT01NQSk7XG4gIGNvbnN0IG51bUlucHV0cyA9IGlucHV0VGVybXMubGVuZ3RoO1xuICBpZiAobnVtVGVuc29ycyAhPT0gbnVtSW5wdXRzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRXhwZWN0ZWQgJHtudW1JbnB1dHN9IGlucHV0IHRlbnNvcnMsIHJlY2VpdmVkICR7bnVtVGVuc29yc31gKTtcbiAgfVxuICBpZiAobnVtSW5wdXRzID4gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1N1cHBvcnQgZm9yIG1vcmUgdGhhbiAyIGlucHV0IHRlbnNvcnMgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgfVxuXG4gIGNvbnN0IGFsbERpbXM6IHN0cmluZ1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cHV0U3RyaW5nLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgZGltTmFtZSA9IG91dHB1dFN0cmluZ1tpXTtcbiAgICBpZiAoIWlucHV0VGVybXMuc29tZShpbnB1dFRlcm0gPT4gaW5wdXRUZXJtLmluZGV4T2YoZGltTmFtZSkgIT09IC0xKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBPdXRwdXQgc3Vic2NyaXB0cyBjb250YWluIHRoZSBsYWJlbCAke2RpbU5hbWV9IGAgK1xuICAgICAgICAgIGBub3QgcHJlc2VudCBpbiB0aGUgaW5wdXQgc3Vic2NyaXB0cy5gKTtcbiAgICB9XG4gICAgaWYgKGFsbERpbXMuaW5kZXhPZihkaW1OYW1lKSA9PT0gLTEpIHtcbiAgICAgIGFsbERpbXMucHVzaChkaW1OYW1lKTtcbiAgICB9XG4gIH1cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGRpbU5hbWUgPSBpbnB1dFN0cmluZ1tpXTtcbiAgICBpZiAoYWxsRGltcy5pbmRleE9mKGRpbU5hbWUpID09PSAtMSAmJiBkaW1OYW1lICE9PSBDT01NQSkge1xuICAgICAgYWxsRGltcy5wdXNoKGRpbU5hbWUpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGlkRGltczogbnVtYmVyW11bXSA9IG5ldyBBcnJheTxudW1iZXJbXT4oaW5wdXRUZXJtcy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUlucHV0czsgKytpKSB7XG4gICAgaWYgKG5ldyBTZXQoaW5wdXRUZXJtc1tpXS5zcGxpdCgnJykpLnNpemUgIT09IGlucHV0VGVybXNbaV0ubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYEZvdW5kIGR1cGxpY2F0ZSBheGVzIGluIGlucHV0IGNvbXBvbmVudCAke2lucHV0VGVybXNbaV19LiBgICtcbiAgICAgICAgICBgU3VwcG9ydCBmb3IgZHVwbGljYXRlIGF4ZXMgaW4gaW5wdXQgaXMgbm90IGltcGxlbWVudGVkIHlldC5gKTtcbiAgICB9XG4gICAgaWREaW1zW2ldID0gW107XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpbnB1dFRlcm1zW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICBpZERpbXNbaV0ucHVzaChhbGxEaW1zLmluZGV4T2YoaW5wdXRUZXJtc1tpXVtqXSkpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG51bURpbXMgPSBhbGxEaW1zLmxlbmd0aDsgICAgICAgICAgLy8gTnVtYmVyIG9mIHVuaXF1ZSBkaW1lbnNpb25zLlxuICBjb25zdCBudW1PdXREaW1zID0gb3V0cHV0U3RyaW5nLmxlbmd0aDsgIC8vIE51bWJlciBvZiBvdXRwdXQgZGltZW5zaW9ucy5cbiAgY29uc3Qgc3VtbWVkRGltczogbnVtYmVyW10gPSBbXTsgICAgICAgICAvLyBEaW1lbnNpb25zIGJlaW5nIHN1bW1lZCBvdmVyLlxuICBmb3IgKGxldCBpID0gbnVtT3V0RGltczsgaSA8IG51bURpbXM7ICsraSkge1xuICAgIHN1bW1lZERpbXMucHVzaChpKTtcbiAgfVxuICByZXR1cm4ge2FsbERpbXMsIHN1bW1lZERpbXMsIGlkRGltc307XG59XG5cbi8qKlxuICogR2V0IHRoZSBwZXJtdXRhdGlvbiBmb3IgYSBnaXZlbiBpbnB1dCB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIG5EaW1zIFRvdGFsIG51bWJlciBvZiBkaW1lbnNpb24gb2YgYWxsIHRlbnNvcnMgaW52b2x2ZWQgaW4gdGhlIGVpbnN1bVxuICogICBvcGVyYXRpb24uXG4gKiBAcGFyYW0gaWREaW1zIERpbWVuc2lvbiBpbmRpY2VzIGludm9sdmUgaW4gdGhlIHRlbnNvciBpbiBxdWVzdGlvbi5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICogICAtIHBlcm11dGF0aW9uSW5kaWNlczogSW5kaWNlcyB0byBwZXJtdXRlIHRoZSBheGVzIG9mIHRoZSB0ZW5zb3Igd2l0aC5cbiAqICAgLSBleHBhbmREaW1zOiBJbmRpY2VzIHRvIHRoZSBkaW1lbnNpb24gdGhhdCBuZWVkIHRvIGJlIGV4cGFuZGVkIGZyb20gdGhlXG4gKiAgICAgdGVuc29yIGFmdGVyIHBlcm11dGF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWluc3VtUGVybXV0YXRpb24obkRpbXM6IG51bWJlciwgaWREaW1zOiBudW1iZXJbXSk6XG4gICAge3Blcm11dGF0aW9uSW5kaWNlczogbnVtYmVyW10sIGV4cGFuZERpbXM6IG51bWJlcltdfSB7XG4gIGxldCBwZXJtdXRhdGlvbkluZGljZXM6IG51bWJlcltdID0gbmV3IEFycmF5PG51bWJlcj4obkRpbXMpO1xuICBwZXJtdXRhdGlvbkluZGljZXMuZmlsbCgtMSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgcGVybXV0YXRpb25JbmRpY2VzW2lkRGltc1tpXV0gPSBpO1xuICB9XG4gIGNvbnN0IGV4cGFuZERpbXM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpbXM7ICsraSkge1xuICAgIGlmIChwZXJtdXRhdGlvbkluZGljZXNbaV0gPT09IC0xKSB7XG4gICAgICBleHBhbmREaW1zLnB1c2goaSk7XG4gICAgfVxuICB9XG4gIHBlcm11dGF0aW9uSW5kaWNlcyA9IHBlcm11dGF0aW9uSW5kaWNlcy5maWx0ZXIoZCA9PiBkICE9PSAtMSk7XG4gIHJldHVybiB7cGVybXV0YXRpb25JbmRpY2VzLCBleHBhbmREaW1zfTtcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhhdCB0aGUgZGltZW5zaW9uIHNpemVzIGZyb20gZGlmZmVyZW50IGlucHV0IHRlbnNvcnMgbWF0Y2ggdGhlXG4gKiBlcXVhdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRWluc3VtRGltU2l6ZXMoXG4gICAgbkRpbXM6IG51bWJlciwgaWREaW1zOiBudW1iZXJbXVtdLCB0ZW5zb3JzOiBUZW5zb3JbXSkge1xuICBjb25zdCBkaW1TaXplczogbnVtYmVyW10gPSBuZXcgQXJyYXk8bnVtYmVyPihuRGltcyk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IHNoYXBlOiBudW1iZXJbXSA9IHRlbnNvcnNbaV0uc2hhcGU7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBpZERpbXNbaV0ubGVuZ3RoOyArK2opIHtcbiAgICAgIGlmIChkaW1TaXplc1tpZERpbXNbaV1bal1dID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9IHNoYXBlW2pdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgZGltU2l6ZXNbaWREaW1zW2ldW2pdXSA9PT0gc2hhcGVbal0sXG4gICAgICAgICAgICAoKSA9PiBgRXhwZWN0ZWQgZGltZW5zaW9uICR7ZGltU2l6ZXNbaWREaW1zW2ldW2pdXX0gYXQgYXhpcyAke2p9IGAgK1xuICAgICAgICAgICAgICAgIGBvZiBpbnB1dCBzaGFwZWQgJHtKU09OLnN0cmluZ2lmeShzaGFwZSl9LCBgICtcbiAgICAgICAgICAgICAgICBgYnV0IGdvdCBkaW1lbnNpb24gJHtzaGFwZVtqXX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBHZXRzIHBhdGggb2YgY29tcHV0YXRpb24gZm9yIGVpbnN1bS5cbiAqXG4gKiBAcGFyYW0gc3VtbWVkRGltcyBpbmRpY2VzIHRvIHRoZSBkaW1lbnNpb25zIGJlaW5nIHN1bW1lZCBvdmVyLlxuICogQHBhcmFtIGlkRGltcyBBIGxvb2sgdXAgdGFibGUgZm9yIHRoZSBkaW1lbnNpb25zIHByZXNlbnQgaW4gZWFjaCBpbnB1dFxuICogICAgIHRlbnNvci4gRWFjaCBjb25zaXR1ZW50IGFycmF5IGNvbnRhaW5zIGluZGljZXMgZm9yIHRoZSBkaW1lbnNpb25zIGluIHRoZVxuICogICAgIGNvcnJlc3BvbmRpbmcgaW5wdXQgdGVuc29yLlxuICpcbiAqIEByZXR1cm4gQSBtYXAgd2l0aCB0d28gZmllbGRzOlxuICogICAtIHBhdGg6IFRoZSBwYXRoIG9mIGNvbXB1dGF0aW9uLCB3aXRoIGVhY2ggZWxlbWVudCBpbmRpY2F0aW5nIHRoZSBkaW1lbnNpb25cbiAqICAgICBiZWluZyBzdW1tZWQgb3ZlciBhZnRlciB0aGUgZWxlbWVudC13aXNlIG11bHRpcGxpY2F0aW9uIGluIHRoYXQgc3RlcC5cbiAqICAgLSBzdGVwczogV2l0aCB0aGUgc2FtZSBsZW5ndGggYXMgYHBhdGhgLiBFYWNoIGVsZW1lbnQgY29udGFpbnMgdGhlIGluZGljZXNcbiAqICAgICB0byB0aGUgaW5wdXQgdGVuc29ycyBiZWluZyB1c2VkIGZvciBlbGVtZW50LXdpc2UgbXVsdGlwbGljYXRpb24gaW4gdGhlXG4gKiAgICAgY29ycmVzcG9uZGluZyBzdGVwLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltczogbnVtYmVyW10sIGlkRGltczogbnVtYmVyW11bXSk6XG4gICAge3BhdGg6IG51bWJlcltdLCBzdGVwczogbnVtYmVyW11bXX0ge1xuICBjb25zdCBwYXRoOiBudW1iZXJbXSA9IHN1bW1lZERpbXM7XG4gIGNvbnN0IHN0ZXBzOiBudW1iZXJbXVtdID0gW107XG4gIGxldCBuU3RlcHMgPSAwO1xuICBpZiAoc3VtbWVkRGltcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBFaW5zdW0gdGhhdCBpbnZvbGVzIG5vIHN1bW1pbmc6IGUuZy4sIHRyYW5zcG9zZSBhbmQgb3V0ZXIgcHJvZHVjdC5cbiAgICBwYXRoLnB1c2goLTEpO1xuICB9XG4gIG5TdGVwcyA9IHN1bW1lZERpbXMubGVuZ3RoICsgMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuU3RlcHM7ICsraSkge1xuICAgIHN0ZXBzLnB1c2goW10pO1xuICB9XG4gIGNvbnN0IGNvbXB1dGVkVGVybUluZGljZXM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IHN1bW1lZERpbSA9IHBhdGhbaV07XG4gICAgY29uc3QgdGVybUluZGljZXMgPSBmaW5kVGVybXNXaXRoRGltKGlkRGltcywgc3VtbWVkRGltKTtcbiAgICBmb3IgKGNvbnN0IHRlcm1JbmRleCBvZiB0ZXJtSW5kaWNlcykge1xuICAgICAgaWYgKGNvbXB1dGVkVGVybUluZGljZXMuaW5kZXhPZih0ZXJtSW5kZXgpID09PSAtMSkge1xuICAgICAgICBzdGVwc1tpXS5wdXNoKHRlcm1JbmRleCk7XG4gICAgICAgIGNvbXB1dGVkVGVybUluZGljZXMucHVzaCh0ZXJtSW5kZXgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4ge3BhdGgsIHN0ZXBzfTtcbn1cblxuLyoqIERldGVybWluZXMgaWYgYW4gYXhlcyBwZXJtdXRhdGlvbiBpcyB0aGUgaWRlbnRpdHkgcGVybXV0YXRpb24uICovXG5leHBvcnQgZnVuY3Rpb24gaXNJZGVudGl0eVBlcm11dGF0aW9uKHBlcm06IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHJldHVybiBwZXJtLmV2ZXJ5KChkaW06IG51bWJlciwgaW5kZXg6IG51bWJlcikgPT4gZGltID09PSBpbmRleCk7XG59XG5cbmZ1bmN0aW9uIGZpbmRUZXJtc1dpdGhEaW0oaWREaW1zOiBudW1iZXJbXVtdLCBkaW06IG51bWJlcik6IG51bWJlcltdIHtcbiAgY29uc3QgdGVybUluZGljZXM6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgaWREaW1zLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKGlkRGltc1tpXS5sZW5ndGggPT09IDAgfHwgaWREaW1zW2ldLmluZGV4T2YoZGltKSAhPT0gLTEgfHwgZGltID09PSAtMSkge1xuICAgICAgdGVybUluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRlcm1JbmRpY2VzO1xufVxuIl19","import { assert } from '../util';\n/**\n * Prepare the split size array. When the input is a number, the axis is evenly\n * divided among the split size. When the input contains the negative value, the\n * rest of the axis is allocated toward that.\n */\nexport function prepareSplitSize(x, numOrSizeSplits, axis = 0) {\n    let splitSizes = [];\n    if (typeof (numOrSizeSplits) === 'number') {\n        assert(x.shape[axis] % numOrSizeSplits === 0, () => 'Number of splits must evenly divide the axis.');\n        splitSizes =\n            new Array(numOrSizeSplits).fill(x.shape[axis] / numOrSizeSplits);\n    }\n    else {\n        const numOfNegs = numOrSizeSplits.reduce((count, value) => {\n            if (value === -1) {\n                count += 1;\n            }\n            return count;\n        }, 0);\n        assert(numOfNegs <= 1, () => 'There should be only one negative value in split array.');\n        const negIndex = numOrSizeSplits.indexOf(-1);\n        // Allow the number of split array to be -1, which indicates the rest\n        // of dimension is allocated to that split.\n        if (negIndex !== -1) {\n            const total = numOrSizeSplits.reduce((a, b) => b > 0 ? a + b : a);\n            numOrSizeSplits[negIndex] = x.shape[axis] - total;\n        }\n        assert(x.shape[axis] === numOrSizeSplits.reduce((a, b) => a + b), () => 'The sum of sizes must match the size of the axis dimension.');\n        splitSizes = numOrSizeSplits;\n    }\n    return splitSizes;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXRfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwbGl0X3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBa0JBLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFL0I7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsQ0FBb0IsRUFBRSxlQUFnQyxFQUN0RCxJQUFJLEdBQUcsQ0FBQztJQUNWLElBQUksVUFBVSxHQUFHLEVBQUUsQ0FBQztJQUNwQixJQUFJLE9BQU8sQ0FBQyxlQUFlLENBQUMsS0FBSyxRQUFRLEVBQUU7UUFDekMsTUFBTSxDQUNGLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxLQUFLLENBQUMsRUFDckMsR0FBRyxFQUFFLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUMzRCxVQUFVO1lBQ04sSUFBSSxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsZUFBZSxDQUFDLENBQUM7S0FDdEU7U0FBTTtRQUNMLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDeEQsSUFBSSxLQUFLLEtBQUssQ0FBQyxDQUFDLEVBQUU7Z0JBQ2hCLEtBQUssSUFBSSxDQUFDLENBQUM7YUFDWjtZQUNELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ04sTUFBTSxDQUNGLFNBQVMsSUFBSSxDQUFDLEVBQ2QsR0FBRyxFQUFFLENBQUMseURBQXlELENBQUMsQ0FBQztRQUNyRSxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0MscUVBQXFFO1FBQ3JFLDJDQUEyQztRQUMzQyxJQUFJLFFBQVEsS0FBSyxDQUFDLENBQUMsRUFBRTtZQUNuQixNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEUsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsS0FBSyxDQUFDO1NBQ25EO1FBQ0QsTUFBTSxDQUNGLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFDekQsR0FBRyxFQUFFLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUN6RSxVQUFVLEdBQUcsZUFBZSxDQUFDO0tBQzlCO0lBRUQsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHthc3NlcnR9IGZyb20gJy4uL3V0aWwnO1xuXG4vKipcbiAqIFByZXBhcmUgdGhlIHNwbGl0IHNpemUgYXJyYXkuIFdoZW4gdGhlIGlucHV0IGlzIGEgbnVtYmVyLCB0aGUgYXhpcyBpcyBldmVubHlcbiAqIGRpdmlkZWQgYW1vbmcgdGhlIHNwbGl0IHNpemUuIFdoZW4gdGhlIGlucHV0IGNvbnRhaW5zIHRoZSBuZWdhdGl2ZSB2YWx1ZSwgdGhlXG4gKiByZXN0IG9mIHRoZSBheGlzIGlzIGFsbG9jYXRlZCB0b3dhcmQgdGhhdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVTcGxpdFNpemUoXG4gICAgeDogVGVuc29yfFRlbnNvckluZm8sIG51bU9yU2l6ZVNwbGl0czogbnVtYmVyW118bnVtYmVyLFxuICAgIGF4aXMgPSAwKTogbnVtYmVyW10ge1xuICBsZXQgc3BsaXRTaXplcyA9IFtdO1xuICBpZiAodHlwZW9mIChudW1PclNpemVTcGxpdHMpID09PSAnbnVtYmVyJykge1xuICAgIGFzc2VydChcbiAgICAgICAgeC5zaGFwZVtheGlzXSAlIG51bU9yU2l6ZVNwbGl0cyA9PT0gMCxcbiAgICAgICAgKCkgPT4gJ051bWJlciBvZiBzcGxpdHMgbXVzdCBldmVubHkgZGl2aWRlIHRoZSBheGlzLicpO1xuICAgIHNwbGl0U2l6ZXMgPVxuICAgICAgICBuZXcgQXJyYXkobnVtT3JTaXplU3BsaXRzKS5maWxsKHguc2hhcGVbYXhpc10gLyBudW1PclNpemVTcGxpdHMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG51bU9mTmVncyA9IG51bU9yU2l6ZVNwbGl0cy5yZWR1Y2UoKGNvdW50LCB2YWx1ZSkgPT4ge1xuICAgICAgaWYgKHZhbHVlID09PSAtMSkge1xuICAgICAgICBjb3VudCArPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH0sIDApO1xuICAgIGFzc2VydChcbiAgICAgICAgbnVtT2ZOZWdzIDw9IDEsXG4gICAgICAgICgpID0+ICdUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgbmVnYXRpdmUgdmFsdWUgaW4gc3BsaXQgYXJyYXkuJyk7XG4gICAgY29uc3QgbmVnSW5kZXggPSBudW1PclNpemVTcGxpdHMuaW5kZXhPZigtMSk7XG4gICAgLy8gQWxsb3cgdGhlIG51bWJlciBvZiBzcGxpdCBhcnJheSB0byBiZSAtMSwgd2hpY2ggaW5kaWNhdGVzIHRoZSByZXN0XG4gICAgLy8gb2YgZGltZW5zaW9uIGlzIGFsbG9jYXRlZCB0byB0aGF0IHNwbGl0LlxuICAgIGlmIChuZWdJbmRleCAhPT0gLTEpIHtcbiAgICAgIGNvbnN0IHRvdGFsID0gbnVtT3JTaXplU3BsaXRzLnJlZHVjZSgoYSwgYikgPT4gYiA+IDAgPyBhICsgYiA6IGEpO1xuICAgICAgbnVtT3JTaXplU3BsaXRzW25lZ0luZGV4XSA9IHguc2hhcGVbYXhpc10gLSB0b3RhbDtcbiAgICB9XG4gICAgYXNzZXJ0KFxuICAgICAgICB4LnNoYXBlW2F4aXNdID09PSBudW1PclNpemVTcGxpdHMucmVkdWNlKChhLCBiKSA9PiBhICsgYiksXG4gICAgICAgICgpID0+ICdUaGUgc3VtIG9mIHNpemVzIG11c3QgbWF0Y2ggdGhlIHNpemUgb2YgdGhlIGF4aXMgZGltZW5zaW9uLicpO1xuICAgIHNwbGl0U2l6ZXMgPSBudW1PclNpemVTcGxpdHM7XG4gIH1cblxuICByZXR1cm4gc3BsaXRTaXplcztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Generates sparse fill empty rows indices, dense shape mismatch error message.\n *\n * @param indicesLength The first dimension of indices.\n */\nexport function getSparseFillEmptyRowsIndicesDenseShapeMismatch(indicesLength) {\n    return `Received SparseTensor with denseShape[0] = 0 but\n  indices.shape[0] = ${indicesLength}`;\n}\n/**\n * Generates sparse fill empty rows negative index error message.\n *\n * @param index The index with a negative value.\n * @param value The negative value.\n */\nexport function getSparseFillEmptyRowsNegativeIndexErrorMessage(index, value) {\n    return `indices(${index}, 0) is invalid: ${value} < 0`;\n}\n/**\n * Generates sparse fill empty rows out of range index error message.\n *\n * @param index The index with an out of range value.\n * @param value The out of range value.\n * @param limit The upper limit for indices.\n */\nexport function getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(index, value, limit) {\n    return `indices(${index}, 0) is invalid: ${value} >= ${limit}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX2ZpbGxfZW1wdHlfcm93c191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc3BhcnNlL3NwYXJzZV9maWxsX2VtcHR5X3Jvd3NfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLCtDQUErQyxDQUMzRCxhQUFxQjtJQUN2QixPQUFPO3VCQUNjLGFBQWEsRUFBRSxDQUFDO0FBQ3ZDLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwrQ0FBK0MsQ0FDM0QsS0FBYSxFQUFFLEtBQWE7SUFDOUIsT0FBTyxXQUFXLEtBQUssb0JBQW9CLEtBQUssTUFBTSxDQUFDO0FBQ3pELENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsaURBQWlELENBQzdELEtBQWEsRUFBRSxLQUFhLEVBQUUsS0FBYTtJQUM3QyxPQUFPLFdBQVcsS0FBSyxvQkFBb0IsS0FBSyxPQUFPLEtBQUssRUFBRSxDQUFDO0FBQ2pFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSBmaWxsIGVtcHR5IHJvd3MgaW5kaWNlcywgZGVuc2Ugc2hhcGUgbWlzbWF0Y2ggZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gaW5kaWNlc0xlbmd0aCBUaGUgZmlyc3QgZGltZW5zaW9uIG9mIGluZGljZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VGaWxsRW1wdHlSb3dzSW5kaWNlc0RlbnNlU2hhcGVNaXNtYXRjaChcbiAgICBpbmRpY2VzTGVuZ3RoOiBudW1iZXIpIHtcbiAgcmV0dXJuIGBSZWNlaXZlZCBTcGFyc2VUZW5zb3Igd2l0aCBkZW5zZVNoYXBlWzBdID0gMCBidXRcbiAgaW5kaWNlcy5zaGFwZVswXSA9ICR7aW5kaWNlc0xlbmd0aH1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2UgZmlsbCBlbXB0eSByb3dzIG5lZ2F0aXZlIGluZGV4IGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB3aXRoIGEgbmVnYXRpdmUgdmFsdWUuXG4gKiBAcGFyYW0gdmFsdWUgVGhlIG5lZ2F0aXZlIHZhbHVlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhcnNlRmlsbEVtcHR5Um93c05lZ2F0aXZlSW5kZXhFcnJvck1lc3NhZ2UoXG4gICAgaW5kZXg6IG51bWJlciwgdmFsdWU6IG51bWJlcikge1xuICByZXR1cm4gYGluZGljZXMoJHtpbmRleH0sIDApIGlzIGludmFsaWQ6ICR7dmFsdWV9IDwgMGA7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSBmaWxsIGVtcHR5IHJvd3Mgb3V0IG9mIHJhbmdlIGluZGV4IGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGluZGV4IFRoZSBpbmRleCB3aXRoIGFuIG91dCBvZiByYW5nZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgb3V0IG9mIHJhbmdlIHZhbHVlLlxuICogQHBhcmFtIGxpbWl0IFRoZSB1cHBlciBsaW1pdCBmb3IgaW5kaWNlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZUZpbGxFbXB0eVJvd3NPdXRPZlJhbmdlSW5kZXhFcnJvck1lc3NhZ2UoXG4gICAgaW5kZXg6IG51bWJlciwgdmFsdWU6IG51bWJlciwgbGltaXQ6IG51bWJlcikge1xuICByZXR1cm4gYGluZGljZXMoJHtpbmRleH0sIDApIGlzIGludmFsaWQ6ICR7dmFsdWV9ID49ICR7bGltaXR9YDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { sizeFromShape } from '../../util';\n/**\n * Generates sparse reshape multiple negative 1 output dimension error message.\n *\n * @param dim1 The first dimension with a negative 1 value.\n * @param dim2 The second dimension with a negative 1 value.\n */\nexport function getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(dim1, dim2) {\n    return `only one output dimension may be -1, not both ${dim1} and ${dim2}`;\n}\n/**\n * Generates sparse reshape negative output dimension error message.\n *\n * @param dim The dimension with a negative value.\n * @param value The negative value.\n */\nexport function getSparseReshapeNegativeOutputDimErrorMessage(dim, value) {\n    return `size ${dim} must be non-negative, not ${value}`;\n}\n/**\n * Generates sparse reshape empty tensor zero output dimension error message.\n *\n */\nexport function getSparseReshapeEmptyTensorZeroOutputDimErrorMessage() {\n    return 'reshape cannot infer the missing input size for an empty tensor ' +\n        'unless all specified input sizes are non-zero';\n}\n/**\n * Generates sparse reshape input output multiple mismatch error message.\n *\n * @param inputShape the input shape.\n * @param outputShape the requested output shape.\n */\nexport function getSparseReshapeInputOutputMultipleErrorMessage(inputShape, outputShape) {\n    const inputSize = sizeFromShape(inputShape);\n    const outputSize = sizeFromShape(outputShape);\n    return `Input to reshape is a SparseTensor with ${inputSize}\n  dense values, but the requested shape requires a multiple of ${outputSize}. inputShape=${inputShape} outputShape= ${outputShape}`;\n}\n/**\n * Generates sparse reshape input output inequality error message.\n *\n * @param inputShape the input shape.\n * @param outputShape the requested output shape.\n */\nexport function getSparseReshapeInputOutputMismatchErrorMessage(inputShape, outputShape) {\n    const inputSize = sizeFromShape(inputShape);\n    const outputSize = sizeFromShape(outputShape);\n    return `Input to reshape is a tensor with ${inputSize} dense values, but the requested shape has ${outputSize}. inputShape=${inputShape} outputShape=${outputShape}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3Jlc2hhcGVfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL3NwYXJzZS9zcGFyc2VfcmVzaGFwZV91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFekM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsd0RBQXdELENBQ3BFLElBQVksRUFBRSxJQUFZO0lBQzVCLE9BQU8saURBQWlELElBQUksUUFBUSxJQUFJLEVBQUUsQ0FBQztBQUM3RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsNkNBQTZDLENBQ3pELEdBQVcsRUFBRSxLQUFhO0lBQzVCLE9BQU8sUUFBUSxHQUFHLDhCQUE4QixLQUFLLEVBQUUsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9EQUFvRDtJQUNsRSxPQUFPLGtFQUFrRTtRQUNyRSwrQ0FBK0MsQ0FBQztBQUN0RCxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsK0NBQStDLENBQzNELFVBQW9CLEVBQUUsV0FBcUI7SUFDN0MsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxPQUFPLDJDQUEyQyxTQUFTO2lFQUV2RCxVQUFVLGdCQUFnQixVQUFVLGlCQUFpQixXQUFXLEVBQUUsQ0FBQztBQUN6RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsK0NBQStDLENBQzNELFVBQW9CLEVBQUUsV0FBcUI7SUFDN0MsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQzVDLE1BQU0sVUFBVSxHQUFHLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUM5QyxPQUFPLHFDQUNILFNBQVMsOENBQ1QsVUFBVSxnQkFBZ0IsVUFBVSxnQkFBZ0IsV0FBVyxFQUFFLENBQUM7QUFDeEUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c2l6ZUZyb21TaGFwZX0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSByZXNoYXBlIG11bHRpcGxlIG5lZ2F0aXZlIDEgb3V0cHV0IGRpbWVuc2lvbiBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBkaW0xIFRoZSBmaXJzdCBkaW1lbnNpb24gd2l0aCBhIG5lZ2F0aXZlIDEgdmFsdWUuXG4gKiBAcGFyYW0gZGltMiBUaGUgc2Vjb25kIGRpbWVuc2lvbiB3aXRoIGEgbmVnYXRpdmUgMSB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZVJlc2hhcGVNdWx0aXBsZU5lZ2F0aXZlT25lT3V0cHV0RGltRXJyb3JNZXNzYWdlKFxuICAgIGRpbTE6IG51bWJlciwgZGltMjogbnVtYmVyKSB7XG4gIHJldHVybiBgb25seSBvbmUgb3V0cHV0IGRpbWVuc2lvbiBtYXkgYmUgLTEsIG5vdCBib3RoICR7ZGltMX0gYW5kICR7ZGltMn1gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2UgcmVzaGFwZSBuZWdhdGl2ZSBvdXRwdXQgZGltZW5zaW9uIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGRpbSBUaGUgZGltZW5zaW9uIHdpdGggYSBuZWdhdGl2ZSB2YWx1ZS5cbiAqIEBwYXJhbSB2YWx1ZSBUaGUgbmVnYXRpdmUgdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VSZXNoYXBlTmVnYXRpdmVPdXRwdXREaW1FcnJvck1lc3NhZ2UoXG4gICAgZGltOiBudW1iZXIsIHZhbHVlOiBudW1iZXIpIHtcbiAgcmV0dXJuIGBzaXplICR7ZGltfSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSwgbm90ICR7dmFsdWV9YDtcbn1cblxuLyoqXG4gKiBHZW5lcmF0ZXMgc3BhcnNlIHJlc2hhcGUgZW1wdHkgdGVuc29yIHplcm8gb3V0cHV0IGRpbWVuc2lvbiBlcnJvciBtZXNzYWdlLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZVJlc2hhcGVFbXB0eVRlbnNvclplcm9PdXRwdXREaW1FcnJvck1lc3NhZ2UoKSB7XG4gIHJldHVybiAncmVzaGFwZSBjYW5ub3QgaW5mZXIgdGhlIG1pc3NpbmcgaW5wdXQgc2l6ZSBmb3IgYW4gZW1wdHkgdGVuc29yICcgK1xuICAgICAgJ3VubGVzcyBhbGwgc3BlY2lmaWVkIGlucHV0IHNpemVzIGFyZSBub24temVybyc7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSByZXNoYXBlIGlucHV0IG91dHB1dCBtdWx0aXBsZSBtaXNtYXRjaCBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBpbnB1dFNoYXBlIHRoZSBpbnB1dCBzaGFwZS5cbiAqIEBwYXJhbSBvdXRwdXRTaGFwZSB0aGUgcmVxdWVzdGVkIG91dHB1dCBzaGFwZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZVJlc2hhcGVJbnB1dE91dHB1dE11bHRpcGxlRXJyb3JNZXNzYWdlKFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLCBvdXRwdXRTaGFwZTogbnVtYmVyW10pIHtcbiAgY29uc3QgaW5wdXRTaXplID0gc2l6ZUZyb21TaGFwZShpbnB1dFNoYXBlKTtcbiAgY29uc3Qgb3V0cHV0U2l6ZSA9IHNpemVGcm9tU2hhcGUob3V0cHV0U2hhcGUpO1xuICByZXR1cm4gYElucHV0IHRvIHJlc2hhcGUgaXMgYSBTcGFyc2VUZW5zb3Igd2l0aCAke2lucHV0U2l6ZX1cbiAgZGVuc2UgdmFsdWVzLCBidXQgdGhlIHJlcXVlc3RlZCBzaGFwZSByZXF1aXJlcyBhIG11bHRpcGxlIG9mICR7XG4gICAgICBvdXRwdXRTaXplfS4gaW5wdXRTaGFwZT0ke2lucHV0U2hhcGV9IG91dHB1dFNoYXBlPSAke291dHB1dFNoYXBlfWA7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSByZXNoYXBlIGlucHV0IG91dHB1dCBpbmVxdWFsaXR5IGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIGlucHV0U2hhcGUgdGhlIGlucHV0IHNoYXBlLlxuICogQHBhcmFtIG91dHB1dFNoYXBlIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHNoYXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3BhcnNlUmVzaGFwZUlucHV0T3V0cHV0TWlzbWF0Y2hFcnJvck1lc3NhZ2UoXG4gICAgaW5wdXRTaGFwZTogbnVtYmVyW10sIG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICBjb25zdCBpbnB1dFNpemUgPSBzaXplRnJvbVNoYXBlKGlucHV0U2hhcGUpO1xuICBjb25zdCBvdXRwdXRTaXplID0gc2l6ZUZyb21TaGFwZShvdXRwdXRTaGFwZSk7XG4gIHJldHVybiBgSW5wdXQgdG8gcmVzaGFwZSBpcyBhIHRlbnNvciB3aXRoICR7XG4gICAgICBpbnB1dFNpemV9IGRlbnNlIHZhbHVlcywgYnV0IHRoZSByZXF1ZXN0ZWQgc2hhcGUgaGFzICR7XG4gICAgICBvdXRwdXRTaXplfS4gaW5wdXRTaGFwZT0ke2lucHV0U2hhcGV9IG91dHB1dFNoYXBlPSR7b3V0cHV0U2hhcGV9YDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * Generates sparse segment reduction negative segment ids error message.\n *\n */\nexport function getSparseSegmentReductionNegativeSegmentIdsErrorMessage() {\n    return `segment ids must be >= 0`;\n}\n/**\n * Generates sparse segment reduction non increasing segment ids error message.\n *\n */\nexport function getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage() {\n    return `segment ids are not increasing`;\n}\n/**\n * Generates sparse segment reduction segment id out of range error message.\n *\n * @param segmentId The segment id index that is out of range.\n * @param outputRows Upper bound of valid segment id values.\n */\nexport function getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(segmentId, outputRows) {\n    return `Segment id ${segmentId} out of range [0, ${outputRows}), possibly because segmentIds input is not sorted.`;\n}\n/**\n * Generates sparse segment reduction input indice out of range error message.\n *\n * @param index The index that holds the out of range value.\n * @param indexValue The value that is out of range.\n * @param inputRows Upper bound of valid index values.\n */\nexport function getSparseSegmentReductionIndicesOutOfRangeErrorMessage(index, indexValue, inputRows) {\n    return `Bad: indices[${index}] == ${indexValue} out of range [0, ${inputRows})`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX3NlZ21lbnRfcmVkdWN0aW9uX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9zcGFyc2Uvc3BhcnNlX3NlZ21lbnRfcmVkdWN0aW9uX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVEQUF1RDtJQUNyRSxPQUFPLDBCQUEwQixDQUFDO0FBQ3BDLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsNERBQTREO0lBQzFFLE9BQU8sZ0NBQWdDLENBQUM7QUFDMUMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHdEQUF3RCxDQUNwRSxTQUFpQixFQUFFLFVBQWtCO0lBQ3ZDLE9BQU8sY0FBYyxTQUFTLHFCQUMxQixVQUFVLHFEQUFxRCxDQUFDO0FBQ3RFLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsc0RBQXNELENBQ2xFLEtBQWEsRUFBRSxVQUFrQixFQUFFLFNBQWlCO0lBQ3RELE9BQU8sZ0JBQWdCLEtBQUssUUFBUSxVQUFVLHFCQUMxQyxTQUFTLEdBQUcsQ0FBQztBQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2Ugc2VnbWVudCByZWR1Y3Rpb24gbmVnYXRpdmUgc2VnbWVudCBpZHMgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uTmVnYXRpdmVTZWdtZW50SWRzRXJyb3JNZXNzYWdlKCkge1xuICByZXR1cm4gYHNlZ21lbnQgaWRzIG11c3QgYmUgPj0gMGA7XG59XG5cbi8qKlxuICogR2VuZXJhdGVzIHNwYXJzZSBzZWdtZW50IHJlZHVjdGlvbiBub24gaW5jcmVhc2luZyBzZWdtZW50IGlkcyBlcnJvciBtZXNzYWdlLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25Ob25JbmNyZWFzaW5nU2VnbWVudElkc0Vycm9yTWVzc2FnZSgpIHtcbiAgcmV0dXJuIGBzZWdtZW50IGlkcyBhcmUgbm90IGluY3JlYXNpbmdgO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2Ugc2VnbWVudCByZWR1Y3Rpb24gc2VnbWVudCBpZCBvdXQgb2YgcmFuZ2UgZXJyb3IgbWVzc2FnZS5cbiAqXG4gKiBAcGFyYW0gc2VnbWVudElkIFRoZSBzZWdtZW50IGlkIGluZGV4IHRoYXQgaXMgb3V0IG9mIHJhbmdlLlxuICogQHBhcmFtIG91dHB1dFJvd3MgVXBwZXIgYm91bmQgb2YgdmFsaWQgc2VnbWVudCBpZCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uU2VnbWVudElkT3V0T2ZSYW5nZUVycm9yTWVzc2FnZShcbiAgICBzZWdtZW50SWQ6IG51bWJlciwgb3V0cHV0Um93czogbnVtYmVyKSB7XG4gIHJldHVybiBgU2VnbWVudCBpZCAke3NlZ21lbnRJZH0gb3V0IG9mIHJhbmdlIFswLCAke1xuICAgICAgb3V0cHV0Um93c30pLCBwb3NzaWJseSBiZWNhdXNlIHNlZ21lbnRJZHMgaW5wdXQgaXMgbm90IHNvcnRlZC5gO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlcyBzcGFyc2Ugc2VnbWVudCByZWR1Y3Rpb24gaW5wdXQgaW5kaWNlIG91dCBvZiByYW5nZSBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggdGhhdCBob2xkcyB0aGUgb3V0IG9mIHJhbmdlIHZhbHVlLlxuICogQHBhcmFtIGluZGV4VmFsdWUgVGhlIHZhbHVlIHRoYXQgaXMgb3V0IG9mIHJhbmdlLlxuICogQHBhcmFtIGlucHV0Um93cyBVcHBlciBib3VuZCBvZiB2YWxpZCBpbmRleCB2YWx1ZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uSW5kaWNlc091dE9mUmFuZ2VFcnJvck1lc3NhZ2UoXG4gICAgaW5kZXg6IG51bWJlciwgaW5kZXhWYWx1ZTogbnVtYmVyLCBpbnB1dFJvd3M6IG51bWJlcikge1xuICByZXR1cm4gYEJhZDogaW5kaWNlc1ske2luZGV4fV0gPT0gJHtpbmRleFZhbHVlfSBvdXQgb2YgcmFuZ2UgWzAsICR7XG4gICAgICBpbnB1dFJvd3N9KWA7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { nearestDivisor } from '../util';\nimport { PARALLELIZE_THRESHOLD } from './reduce_util';\nexport function segOpComputeOptimalWindowSize(inSize, numSegments) {\n    let done = false;\n    let res;\n    if (inSize <= PARALLELIZE_THRESHOLD) {\n        res = inSize;\n        done = true;\n    }\n    else {\n        res = nearestDivisor(inSize, Math.floor(Math.sqrt(inSize)));\n    }\n    while (!done) {\n        if (res > numSegments || res === inSize) {\n            done = true;\n        }\n        else {\n            res = nearestDivisor(inSize, res + 1);\n        }\n    }\n    return res;\n}\nexport function computeOutShape(aShape, axis, numSegments) {\n    const outShape = [];\n    const rank = aShape.length;\n    for (let dim = 0; dim < rank; dim++) {\n        if (dim !== axis) {\n            outShape.push(aShape[dim]);\n        }\n        else {\n            outShape.push(numSegments);\n        }\n    }\n    return outShape;\n}\nexport function collectGatherOpShapeInfo(x, indices, axis, batchDims) {\n    const indicesRank = indices.shape.length;\n    const xRank = x.shape.length;\n    if (batchDims !== 0) {\n        if (batchDims < -indicesRank || batchDims > indicesRank) {\n            throw new Error(`Expect batchDims in the range of [-${indicesRank}, ${indicesRank}], but got ${batchDims}`);\n        }\n    }\n    if (batchDims < 0) {\n        batchDims += indicesRank;\n    }\n    if (batchDims > xRank) {\n        throw new Error(`batchDims (${batchDims}) must be less than rank(x) (\n    ${xRank}).`);\n    }\n    if (axis < batchDims) {\n        throw new Error(`batchDims (${batchDims}) must be less than or equal to axis (${axis}).`);\n    }\n    for (let i = 0; i < batchDims; ++i) {\n        if (x.shape[i] !== indices.shape[i]) {\n            throw new Error(`x.shape[${i}]: ${x.shape[i]} should be equal to indices.shape[${i}]: ${indices.shape[i]}.`);\n        }\n    }\n    const dimSize = x.shape[axis];\n    const outputShape = [];\n    let batchSize = 1;\n    let outerSize = 1;\n    let sliceSize = 1;\n    for (let i = 0; i < batchDims; ++i) {\n        outputShape.push(x.shape[i]);\n        batchSize *= x.shape[i];\n    }\n    for (let i = batchDims; i < axis; i++) {\n        outputShape.push(x.shape[i]);\n        outerSize *= x.shape[i];\n    }\n    for (let i = batchDims; i < indicesRank; i++) {\n        outputShape.push(indices.shape[i]);\n    }\n    for (let i = axis + 1; i < xRank; i++) {\n        outputShape.push(x.shape[i]);\n        sliceSize *= x.shape[i];\n    }\n    return { batchSize, sliceSize, outerSize, dimSize, outputShape };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9vcHMvc2VnbWVudF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdkMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBU3BELE1BQU0sVUFBVSw2QkFBNkIsQ0FDekMsTUFBYyxFQUFFLFdBQW1CO0lBQ3JDLElBQUksSUFBSSxHQUFHLEtBQUssQ0FBQztJQUNqQixJQUFJLEdBQUcsQ0FBQztJQUVSLElBQUksTUFBTSxJQUFJLHFCQUFxQixFQUFFO1FBQ25DLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDYixJQUFJLEdBQUcsSUFBSSxDQUFDO0tBQ2I7U0FBTTtRQUNMLEdBQUcsR0FBRyxjQUFjLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxPQUFPLENBQUMsSUFBSSxFQUFFO1FBQ1osSUFBSSxHQUFHLEdBQUcsV0FBVyxJQUFJLEdBQUcsS0FBSyxNQUFNLEVBQUU7WUFDdkMsSUFBSSxHQUFHLElBQUksQ0FBQztTQUNiO2FBQU07WUFDTCxHQUFHLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkM7S0FDRjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQzNCLE1BQWdCLEVBQUUsSUFBWSxFQUFFLFdBQW1CO0lBQ3JELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQztJQUNwQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNCLEtBQUssSUFBSSxH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QUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNwQztJQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3JDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsT0FBTyxFQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxXQUFXLEVBQUMsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm99IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge25lYXJlc3REaXZpc29yfSBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtQQVJBTExFTElaRV9USFJFU0hPTER9IGZyb20gJy4vcmVkdWNlX3V0aWwnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFNlZ09wSW5mbyB7XG4gIHdpbmRvd1NpemU6IG51bWJlcjtcbiAgYmF0Y2hTaXplOiBudW1iZXI7XG4gIGluU2l6ZTogbnVtYmVyO1xuICBudW1TZWdtZW50czogbnVtYmVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VnT3BDb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoXG4gICAgaW5TaXplOiBudW1iZXIsIG51bVNlZ21lbnRzOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgZG9uZSA9IGZhbHNlO1xuICBsZXQgcmVzO1xuXG4gIGlmIChpblNpemUgPD0gUEFSQUxMRUxJWkVfVEhSRVNIT0xEKSB7XG4gICAgcmVzID0gaW5TaXplO1xuICAgIGRvbmUgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IG5lYXJlc3REaXZpc29yKGluU2l6ZSwgTWF0aC5mbG9vcihNYXRoLnNxcnQoaW5TaXplKSkpO1xuICB9XG5cbiAgd2hpbGUgKCFkb25lKSB7XG4gICAgaWYgKHJlcyA+IG51bVNlZ21lbnRzIHx8IHJlcyA9PT0gaW5TaXplKSB7XG4gICAgICBkb25lID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzID0gbmVhcmVzdERpdmlzb3IoaW5TaXplLCByZXMgKyAxKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVPdXRTaGFwZShcbiAgICBhU2hhcGU6IG51bWJlcltdLCBheGlzOiBudW1iZXIsIG51bVNlZ21lbnRzOiBudW1iZXIpOiBudW1iZXJbXSB7XG4gIGNvbnN0IG91dFNoYXBlID0gW107XG4gIGNvbnN0IHJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCByYW5rOyBkaW0rKykge1xuICAgIGlmIChkaW0gIT09IGF4aXMpIHtcbiAgICAgIG91dFNoYXBlLnB1c2goYVNoYXBlW2RpbV0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRTaGFwZS5wdXNoKG51bVNlZ21lbnRzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dFNoYXBlO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdhdGhlck9wU2hhcGVJbmZvIHtcbiAgYmF0Y2hTaXplOiBudW1iZXI7XG4gIHNsaWNlU2l6ZTogbnVtYmVyO1xuICBvdXRlclNpemU6IG51bWJlcjtcbiAgZGltU2l6ZTogbnVtYmVyO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb2xsZWN0R2F0aGVyT3BTaGFwZUluZm8oXG4gICAgeDogVGVuc29ySW5mbywgaW5kaWNlczogVGVuc29ySW5mbywgYXhpczogbnVtYmVyLFxuICAgIGJhdGNoRGltczogbnVtYmVyKTogR2F0aGVyT3BTaGFwZUluZm8ge1xuICBjb25zdCBpbmRpY2VzUmFuayA9IGluZGljZXMuc2hhcGUubGVuZ3RoO1xuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGlmIChiYXRjaERpbXMgIT09IDApIHtcbiAgICBpZiAoYmF0Y2hEaW1zIDwgLWluZGljZXNSYW5rIHx8IGJhdGNoRGltcyA+IGluZGljZXNSYW5rKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdCBiYXRjaERpbXMgaW4gdGhlIHJhbmdlIG9mIFstJHtpbmRpY2VzUmFua30sICR7XG4gICAgICAgICAgaW5kaWNlc1Jhbmt9XSwgYnV0IGdvdCAke2JhdGNoRGltc31gKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYmF0Y2hEaW1zIDwgMCkge1xuICAgIGJhdGNoRGltcyArPSBpbmRpY2VzUmFuaztcbiAgfVxuXG4gIGlmIChiYXRjaERpbXMgPiB4UmFuaykge1xuICAgIHRocm93IG5ldyBFcnJvcihgYmF0Y2hEaW1zICgke2JhdGNoRGltc30pIG11c3QgYmUgbGVzcyB0aGFuIHJhbmsoeCkgKFxuICAgICR7eFJhbmt9KS5gKTtcbiAgfVxuXG4gIGlmIChheGlzIDwgYmF0Y2hEaW1zKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBiYXRjaERpbXMgKCR7XG4gICAgICAgIGJhdGNoRGltc30pIG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGF4aXMgKCR7YXhpc30pLmApO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaERpbXM7ICsraSkge1xuICAgIGlmICh4LnNoYXBlW2ldICE9PSBpbmRpY2VzLnNoYXBlW2ldKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYHguc2hhcGVbJHtpfV06ICR7eC5zaGFwZVtpXX0gc2hvdWxkIGJlIGVxdWFsIHRvIGluZGljZXMuc2hhcGVbJHtcbiAgICAgICAgICAgICAgaX1dOiAke2luZGljZXMuc2hhcGVbaV19LmApO1xuICAgIH1cbiAgfVxuICBjb25zdCBkaW1TaXplID0geC5zaGFwZVtheGlzXTtcblxuICBjb25zdCBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgbGV0IGJhdGNoU2l6ZSA9IDE7XG4gIGxldCBvdXRlclNpemUgPSAxO1xuICBsZXQgc2xpY2VTaXplID0gMTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoRGltczsgKytpKSB7XG4gICAgb3V0cHV0U2hhcGUucHVzaCh4LnNoYXBlW2ldKTtcbiAgICBiYXRjaFNpemUgKj0geC5zaGFwZVtpXTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSBiYXRjaERpbXM7IGkgPCBheGlzOyBpKyspIHtcbiAgICBvdXRwdXRTaGFwZS5wdXNoKHguc2hhcGVbaV0pO1xuICAgIG91dGVyU2l6ZSAqPSB4LnNoYXBlW2ldO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IGJhdGNoRGltczsgaSA8IGluZGljZXNSYW5rOyBpKyspIHtcbiAgICBvdXRwdXRTaGFwZS5wdXNoKGluZGljZXMuc2hhcGVbaV0pO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IGF4aXMgKyAxOyBpIDwgeFJhbms7IGkrKykge1xuICAgIG91dHB1dFNoYXBlLnB1c2goeC5zaGFwZVtpXSk7XG4gICAgc2xpY2VTaXplICo9IHguc2hhcGVbaV07XG4gIH1cblxuICByZXR1cm4ge2JhdGNoU2l6ZSwgc2xpY2VTaXplLCBvdXRlclNpemUsIGRpbVNpemUsIG91dHB1dFNoYXBlfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { decodeString, encodeString } from '../util';\n// Utilities needed by backend consumers of tf-core.\nexport * from '../ops/axis_util';\nexport * from '../ops/broadcast_util';\nexport * from '../ops/concat_util';\nexport * from '../ops/conv_util';\nexport * from '../ops/fused_util';\nexport * from '../ops/ragged_to_dense_util';\nexport * from '../ops/reduce_util';\nimport * as slice_util from '../ops/slice_util';\nexport { slice_util };\nexport { upcastType } from '../types';\nexport * from '../ops/rotate_util';\nexport * from '../ops/array_ops_util';\nexport * from '../ops/gather_nd_util';\nexport * from '../ops/scatter_nd_util';\nexport * from '../ops/selu_util';\nexport * from '../ops/fused_util';\nexport * from '../ops/erf_util';\nexport * from '../log';\nexport * from '../backends/complex_util';\nexport * from '../backends/einsum_util';\nexport * from '../ops/split_util';\nexport * from '../ops/sparse/sparse_fill_empty_rows_util';\nexport * from '../ops/sparse/sparse_reshape_util';\nexport * from '../ops/sparse/sparse_segment_reduction_util';\nimport * as segment_util from '../ops/segment_util';\nexport { segment_util };\nexport function fromUint8ToStringArray(vals) {\n    try {\n        // Decode the bytes into string.\n        return vals.map(val => decodeString(val));\n    }\n    catch (err) {\n        throw new Error(`Failed to decode encoded string bytes into utf-8, error: ${err}`);\n    }\n}\nexport function fromStringArrayToUint8(strings) {\n    return strings.map(s => encodeString(s));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZF91dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9iYWNrZW5kcy9iYWNrZW5kX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxZQUFZLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFbkQsb0RBQW9EO0FBQ3BELGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLG9CQUFvQixDQUFDO0FBQ25DLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxtQkFBbUIsQ0FBQztBQUVsQyxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsb0JBQW9CLENBQUM7QUFFbkMsT0FBTyxLQUFLLFVBQVUsTUFBTSxtQkFBbUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMsVUFBVSxFQUFDLENBQUM7QUFFcEIsT0FBTyxFQUE0QixVQUFVLEVBQVksTUFBTSxVQUFVLENBQUM7QUFFMUUsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxpQkFBaUIsQ0FBQztBQUNoQyxjQUFjLFFBQVEsQ0FBQztBQUN2QixjQUFjLDBCQUEwQixDQUFDO0FBQ3pDLGNBQWMseUJBQXlCLENBQUM7QUFDeEMsY0FBYyxtQkFBbUIsQ0FBQztBQUNsQyxjQUFjLDJDQUEyQyxDQUFDO0FBQzFELGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyw2Q0FBNkMsQ0FBQztBQUU1RCxPQUFPLEtBQUssWUFBWSxNQUFNLHFCQUFxQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsQ0FBQztBQUV0QixNQUFNLFVBQVUsc0JBQXNCLENBQUMsSUFBa0I7SUFDdkQsSUFBSTtRQUNGLGdDQUFnQztRQUNoQyxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztLQUMzQztJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osTUFBTSxJQUFJLEtBQUssQ0FDWCw0REFBNEQsR0FBRyxFQUFFLENBQUMsQ0FBQztLQUN4RTtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBaUI7SUFDdEQsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtkZWNvZGVTdHJpbmcsIGVuY29kZVN0cmluZ30gZnJvbSAnLi4vdXRpbCc7XG5cbi8vIFV0aWxpdGllcyBuZWVkZWQgYnkgYmFja2VuZCBjb25zdW1lcnMgb2YgdGYtY29yZS5cbmV4cG9ydCAqIGZyb20gJy4uL29wcy9heGlzX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL2Jyb2FkY2FzdF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9jb25jYXRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvY29udl91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF90eXBlcyc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvcmFnZ2VkX3RvX2RlbnNlX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3JlZHVjZV91dGlsJztcblxuaW1wb3J0ICogYXMgc2xpY2VfdXRpbCBmcm9tICcuLi9vcHMvc2xpY2VfdXRpbCc7XG5leHBvcnQge3NsaWNlX3V0aWx9O1xuXG5leHBvcnQge0JhY2tlbmRWYWx1ZXMsIFR5cGVkQXJyYXksIHVwY2FzdFR5cGUsIFBpeGVsRGF0YX0gZnJvbSAnLi4vdHlwZXMnO1xuZXhwb3J0IHtNZW1vcnlJbmZvLCBUaW1pbmdJbmZvfSBmcm9tICcuLi9lbmdpbmUnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3JvdGF0ZV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9hcnJheV9vcHNfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvZ2F0aGVyX25kX3V0aWwnO1xuZXhwb3J0ICogZnJvbSAnLi4vb3BzL3NjYXR0ZXJfbmRfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvc2VsdV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9mdXNlZF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9lcmZfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9sb2cnO1xuZXhwb3J0ICogZnJvbSAnLi4vYmFja2VuZHMvY29tcGxleF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL2JhY2tlbmRzL2VpbnN1bV91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGxpdF91dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGFyc2Uvc3BhcnNlX2ZpbGxfZW1wdHlfcm93c191dGlsJztcbmV4cG9ydCAqIGZyb20gJy4uL29wcy9zcGFyc2Uvc3BhcnNlX3Jlc2hhcGVfdXRpbCc7XG5leHBvcnQgKiBmcm9tICcuLi9vcHMvc3BhcnNlL3NwYXJzZV9zZWdtZW50X3JlZHVjdGlvbl91dGlsJztcblxuaW1wb3J0ICogYXMgc2VnbWVudF91dGlsIGZyb20gJy4uL29wcy9zZWdtZW50X3V0aWwnO1xuZXhwb3J0IHtzZWdtZW50X3V0aWx9O1xuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVVpbnQ4VG9TdHJpbmdBcnJheSh2YWxzOiBVaW50OEFycmF5W10pIHtcbiAgdHJ5IHtcbiAgICAvLyBEZWNvZGUgdGhlIGJ5dGVzIGludG8gc3RyaW5nLlxuICAgIHJldHVybiB2YWxzLm1hcCh2YWwgPT4gZGVjb2RlU3RyaW5nKHZhbCkpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBGYWlsZWQgdG8gZGVjb2RlIGVuY29kZWQgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTgsIGVycm9yOiAke2Vycn1gKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZnJvbVN0cmluZ0FycmF5VG9VaW50OChzdHJpbmdzOiBzdHJpbmdbXSkge1xuICByZXR1cm4gc3RyaW5ncy5tYXAocyA9PiBlbmNvZGVTdHJpbmcocykpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Abs } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { step } from '../ops/step';\nexport const absGradConfig = {\n    kernelName: Abs,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(dy, step(cast(x, 'float32'), -1)) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BYnNfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFHakMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBYnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7c3RlcH0gZnJvbSAnLi4vb3BzL3N0ZXAnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhYnNHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBYnMsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBtdWwoZHksIHN0ZXAoY2FzdCh4LCAnZmxvYXQzMicpLCAtMSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acos } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { neg } from '../ops/neg';\nimport { scalar } from '../ops/scalar';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nexport const acosGradConfig = {\n    kernelName: Acos,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return {\n            x: () => {\n                const a = square(cast(x, 'float32'));\n                const b = sqrt(sub(scalar(1), a));\n                return neg(div(dy, b));\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvc19ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQWNvc19ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztnQkFDckMsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDbEMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLENBQUM7U0FFRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWNvc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHtuZWd9IGZyb20gJy4uL29wcy9uZWcnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi9vcHMvc3FydCc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFjb3NHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBY29zLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+IHtcbiAgICAgICAgY29uc3QgYSA9IHNxdWFyZShjYXN0KHgsICdmbG9hdDMyJykpO1xuICAgICAgICBjb25zdCBiID0gc3FydChzdWIoc2NhbGFyKDEpLCBhKSk7XG4gICAgICAgIHJldHVybiBuZWcoZGl2KGR5LCBiKSk7XG4gICAgICB9XG5cbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acosh } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nexport const acoshGradConfig = {\n    kernelName: Acosh,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return {\n            x: () => {\n                const a = sqrt(sub(square(cast(x, 'float32')), 1));\n                return div(dy, a);\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvc2hfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Fjb3NoX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUNOLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNuRCxPQUFPLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDcEIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBY29zaH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi9vcHMvc3FydCc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFjb3NoR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWNvc2gsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4ge1xuICAgICAgICBjb25zdCBhID0gc3FydChzdWIoc3F1YXJlKGNhc3QoeCwgJ2Zsb2F0MzInKSksIDEpKTtcbiAgICAgICAgcmV0dXJuIGRpdihkeSwgYSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Add } from '../kernel_names';\nimport * as broadcast_util from '../ops/broadcast_util';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nexport const addGradConfig = {\n    kernelName: Add,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const outShape = broadcast_util.assertAndGetBroadcastShape(a.shape, b.shape);\n        const derA = () => {\n            let res = dy;\n            const reduceAxes = broadcast_util.getReductionAxes(a.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = sum(res, reduceAxes);\n            }\n            return reshape(res, a.shape);\n        };\n        const derB = () => {\n            let res = dy;\n            const reduceAxes = broadcast_util.getReductionAxes(b.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = sum(res, reduceAxes);\n            }\n            return reshape(res, b.shape);\n        };\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BZGRfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxLQUFLLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FDVixjQUFjLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFaEUsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztZQUNiLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RFLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQzVCO1lBQ0QsT0FBTyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQixDQUFDLENBQUM7UUFDRixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUI7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUVGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QWRkfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vb3BzL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhZGRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGQsXG4gIGlucHV0c1RvU2F2ZTogWydhJywgJ2InXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbYSwgYl0gPSBzYXZlZDtcbiAgICBjb25zdCBvdXRTaGFwZSA9XG4gICAgICAgIGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGEuc2hhcGUsIGIuc2hhcGUpO1xuXG4gICAgY29uc3QgZGVyQSA9ICgpID0+IHtcbiAgICAgIGxldCByZXMgPSBkeTtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBicm9hZGNhc3RfdXRpbC5nZXRSZWR1Y3Rpb25BeGVzKGEuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzID0gc3VtKHJlcywgcmVkdWNlQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShyZXMsIGEuc2hhcGUpO1xuICAgIH07XG4gICAgY29uc3QgZGVyQiA9ICgpID0+IHtcbiAgICAgIGxldCByZXMgPSBkeTtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBicm9hZGNhc3RfdXRpbC5nZXRSZWR1Y3Rpb25BeGVzKGIuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzID0gc3VtKHJlcywgcmVkdWNlQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShyZXMsIGIuc2hhcGUpO1xuICAgIH07XG5cbiAgICByZXR1cm4ge2E6IGRlckEsIGI6IGRlckJ9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AddN } from '../kernel_names';\nexport const addNGradConfig = {\n    kernelName: AddN,\n    saveAllInputs: true,\n    gradFunc: (dy, saved) => {\n        const ders = {};\n        saved.forEach((_, i) => {\n            ders[i] = () => dy.clone();\n        });\n        return ders;\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkTl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQWRkTl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUlyQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsYUFBYSxFQUFFLElBQUk7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxHQUFrQyxFQUFFLENBQUM7UUFDL0MsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQixJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBZGROfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhZGROR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWRkTixcbiAgc2F2ZUFsbElucHV0czogdHJ1ZSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBkZXJzOiB7W2tleTogc3RyaW5nXTogKCkgPT4gVGVuc29yfSA9IHt9O1xuICAgIHNhdmVkLmZvckVhY2goKF8sIGkpID0+IHtcbiAgICAgIGRlcnNbaV0gPSAoKSA9PiBkeS5jbG9uZSgpO1xuICAgIH0pO1xuICAgIHJldHVybiBkZXJzO1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMax } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const argMaxGradConfig = {\n    kernelName: ArgMax,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => zerosLike(x) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWF4X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BcmdNYXhfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFlO0lBQzFDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FyZ01heH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFyZ01heEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFyZ01heCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZSh4KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMin } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const argMinGradConfig = {\n    kernelName: ArgMin,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => zerosLike(x) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWluX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BcmdNaW5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFlO0lBQzFDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ2pDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FyZ01pbn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFyZ01pbkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFyZ01pbixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZSh4KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asin } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { scalar } from '../ops/scalar';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nexport const asinGradConfig = {\n    kernelName: Asin,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => div(dy, sqrt(sub(scalar(1), square(cast(x, 'float32'))))) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQXNpbl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDOUUsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXNpbn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi9vcHMvc3FydCc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGFzaW5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gZGl2KGR5LCBzcXJ0KHN1YihzY2FsYXIoMSksIHNxdWFyZShjYXN0KHgsICdmbG9hdDMyJykpKSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asinh } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { scalar } from '../ops/scalar';\nimport { sqrt } from '../ops/sqrt';\nimport { square } from '../ops/square';\nexport const asinhGradConfig = {\n    kernelName: Asinh,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return {\n            x: () => {\n                const a = sqrt(add(scalar(1), square(cast(x, 'float32'))));\n                return div(dy, a);\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbmhfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0FzaW5oX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3JDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBZTtJQUN6QyxVQUFVLEVBQUUsS0FBSztJQUNqQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELE9BQU8sR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNwQixDQUFDO1NBQ0YsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW5ofSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3NxcnR9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgYXNpbmhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGEgPSBzcXJ0KGFkZChzY2FsYXIoMSksIHNxdWFyZShjYXN0KHgsICdmbG9hdDMyJykpKSk7XG4gICAgICAgIHJldHVybiBkaXYoZHksIGEpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan2 } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { assertAndGetBroadcastShape, getReductionAxes } from '../ops/broadcast_util';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { square } from '../ops/square';\nimport { sum } from '../ops/sum';\nexport const atan2GradConfig = {\n    kernelName: Atan2,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n        const derA = () => {\n            const d = add(square(a), square(b));\n            let res = mul(dy, div(b, d));\n            const reduceAxes = getReductionAxes(a.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = sum(res, reduceAxes);\n            }\n            return reshape(res, a.shape);\n        };\n        const derB = () => {\n            const d = add(square(a), square(b));\n            let res = neg(mul(dy, div(a, d)));\n            const reduceAxes = getReductionAxes(b.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = sum(res, reduceAxes);\n            }\n            return reshape(res, b.shape);\n        };\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbjJfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0F0YW4yX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLDBCQUEwQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbkYsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsMEJBQTBCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFOUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDN0IsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDcEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0IsQ0FBQyxDQUFDO1FBQ0YsT0FBTyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW4yfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSwgZ2V0UmVkdWN0aW9uQXhlc30gZnJvbSAnLi4vb3BzL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhdGFuMkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF0YW4yLFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhLnNoYXBlLCBiLnNoYXBlKTtcblxuICAgIGNvbnN0IGRlckEgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkID0gYWRkKHNxdWFyZShhKSwgc3F1YXJlKGIpKTtcbiAgICAgIGxldCByZXMgPSBtdWwoZHksIGRpdihiLCBkKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gZ2V0UmVkdWN0aW9uQXhlcyhhLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBhLnNoYXBlKTtcbiAgICB9O1xuICAgIGNvbnN0IGRlckIgPSAoKSA9PiB7XG4gICAgICBjb25zdCBkID0gYWRkKHNxdWFyZShhKSwgc3F1YXJlKGIpKTtcbiAgICAgIGxldCByZXMgPSBuZWcobXVsKGR5LCBkaXYoYSwgZCkpKTtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBnZXRSZWR1Y3Rpb25BeGVzKGIuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzID0gc3VtKHJlcywgcmVkdWNlQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShyZXMsIGIuc2hhcGUpO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { square } from '../ops/square';\nexport const atanGradConfig = {\n    kernelName: Atan,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => div(dy, add(square(cast(x, 'float32')), 1)) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQXRhbl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBR3JDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUNoRSxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFufSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGF0YW5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiBkaXYoZHksIGFkZChzcXVhcmUoY2FzdCh4LCAnZmxvYXQzMicpKSwgMSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atanh } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nimport { scalar } from '../ops/scalar';\nexport const atanhGradConfig = {\n    kernelName: Atanh,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => div(dy, sub(scalar(1), square(cast(x, 'float32')))) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbmhfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0F0YW5oX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDeEUsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXRhbmh9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9vcHMvc3ViJztcbmltcG9ydCB7c2NhbGFyfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgYXRhbmhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuaCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcblxuICAgIHJldHVybiB7eDogKCkgPT4gZGl2KGR5LCBzdWIoc2NhbGFyKDEpLCBzcXVhcmUoY2FzdCh4LCAnZmxvYXQzMicpKSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AvgPool3DGrad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { checkPadOnDimRoundingMode } from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the backprop of a 3d avg pool.\n *\n * @param dy The dy error, of rank 5 of shape\n *     [batchSize, depth, height, width, channels].\n * assumed.\n * @param input The original input image, of rank 5 or rank4 of shape\n *     [batchSize, depth, height, width, channels].\n * @param filterSize The filter size:\n *     `[filterDepth, filterHeight, filterWidth]`.\n *     `filterSize` is a single number,\n *     then `filterDepth == filterHeight == filterWidth`.\n * @param strides The strides of the pooling:\n *     `[strideDepth, strideHeight, strideWidth]`. If\n *     `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n *     used in the forward prop of the op.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n */\nfunction avgPool3dGrad_(dy, input, filterSize, strides, pad, dimRoundingMode) {\n    const $dy = convertToTensor(dy, 'dy', 'avgPool3dGrad');\n    const $input = convertToTensor(input, 'input', 'avgPool3dGrad');\n    let dy5D = $dy;\n    let input5D = $input;\n    let reshapedTo5D = false;\n    if ($input.rank === 4) {\n        reshapedTo5D = true;\n        dy5D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2], $dy.shape[3]]);\n        input5D = reshape($input, [\n            1, $input.shape[0], $input.shape[1], $input.shape[2], $input.shape[3]\n        ]);\n    }\n    util.assert(dy5D.rank === 5, () => `Error in avgPool3dGrad: dy must be rank 5 but got rank ` +\n        `${dy5D.rank}.`);\n    util.assert(input5D.rank === 5, () => `Error in avgPool3dGrad: input must be rank 5 but got rank ` +\n        `${input5D.rank}.`);\n    checkPadOnDimRoundingMode('avgPool3dGrad', pad, dimRoundingMode);\n    const inputs = { dy: dy5D, input: input5D };\n    const attrs = { filterSize, strides, pad, dimRoundingMode };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(AvgPool3DGrad, inputs, attrs);\n    if (reshapedTo5D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n    }\n    return res;\n}\nexport const avgPool3dGrad = op({ avgPool3dGrad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2xfM2RfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2F2Z19wb29sXzNkX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsYUFBYSxFQUEwQyxNQUFNLGlCQUFpQixDQUFDO0FBSXZGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBQ0gsU0FBUyxjQUFjLENBQ25CLEVBQWdCLEVBQUUsS0FBbUIsRUFDckMsVUFBMkMsRUFDM0MsT0FBd0MsRUFBRSxHQUEwQixFQUNwRSxlQUF3QztJQUMxQyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxlQUFlLENBQUMsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztJQUVoRSxJQUFJLElBQUksR0FBRyxHQUFlLENBQUM7SUFDM0IsSUFBSSxPQUFPLEdBQUcsTUFBa0IsQ0FBQztJQUNqQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFekIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNyQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksR0FBRyxPQUFPLENBQ1YsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3hCLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN0RSxDQUFDLENBQUM7S0FDSjtJQUVELElBQUksQ0FBQyxNQUFNLENBQ1AsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2YsR0FBRyxFQUFFLENBQUMseURBQXlEO1FBQzNELEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDekIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDbEIsR0FBRyxFQUFFLENBQUMsNERBQTREO1FBQzlELEdBQUcsT0FBTyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7SUFDNUIseUJBQXlCLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNqRSxNQUFNLE1BQU0sR0FBd0IsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBdUIsRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsQ0FBQztJQUU5RSwwREFBMEQ7SUFDMUQsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FDWixhQUFhLEVBQUUsTUFBOEIsRUFDN0MsS0FBMkIsQ0FBTSxDQUFDO0lBRWxELElBQUksWUFBWSxFQUFFO1FBQ2hCLE9BQU8sT0FBTyxDQUNILEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDbkUsQ0FBQztLQUNQO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQyxFQUFDLGNBQWMsRUFBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0F2Z1Bvb2wzREdyYWQsIEF2Z1Bvb2wzREdyYWRBdHRycywgQXZnUG9vbDNER3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RCwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZX0gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBiYWNrcHJvcCBvZiBhIDNkIGF2ZyBwb29sLlxuICpcbiAqIEBwYXJhbSBkeSBUaGUgZHkgZXJyb3IsIG9mIHJhbmsgNSBvZiBzaGFwZVxuICogICAgIFtiYXRjaFNpemUsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGlucHV0IFRoZSBvcmlnaW5hbCBpbnB1dCBpbWFnZSwgb2YgcmFuayA1IG9yIHJhbms0IG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoU2l6ZSwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIGNoYW5uZWxzXS5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTpcbiAqICAgICBgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlcixcbiAqICAgICB0aGVuIGBmaWx0ZXJEZXB0aCA9PSBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6XG4gKiAgICAgYFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLiBJZlxuICogICAgIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIEEgc3RyaW5nIGZyb206ICdzYW1lJywgJ3ZhbGlkJy4gVGhlIHR5cGUgb2YgcGFkZGluZyBhbGdvcml0aG1cbiAqICAgICB1c2VkIGluIHRoZSBmb3J3YXJkIHByb3Agb2YgdGhlIG9wLlxuICogQHBhcmFtIGRpbVJvdW5kaW5nTW9kZSBBIHN0cmluZyBmcm9tOiAnY2VpbCcsICdyb3VuZCcsICdmbG9vcicuIElmIG5vbmUgaXNcbiAqICAgICBwcm92aWRlZCwgaXQgd2lsbCBkZWZhdWx0IHRvIHRydW5jYXRlLlxuICovXG5mdW5jdGlvbiBhdmdQb29sM2RHcmFkXzxUIGV4dGVuZHMgVGVuc29yNER8VGVuc29yNUQ+KFxuICAgIGR5OiBUfFRlbnNvckxpa2UsIGlucHV0OiBUfFRlbnNvckxpa2UsXG4gICAgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcixcbiAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIGNvbnN0ICRkeSA9IGNvbnZlcnRUb1RlbnNvcihkeSwgJ2R5JywgJ2F2Z1Bvb2wzZEdyYWQnKTtcbiAgY29uc3QgJGlucHV0ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAnaW5wdXQnLCAnYXZnUG9vbDNkR3JhZCcpO1xuXG4gIGxldCBkeTVEID0gJGR5IGFzIFRlbnNvcjVEO1xuICBsZXQgaW5wdXQ1RCA9ICRpbnB1dCBhcyBUZW5zb3I1RDtcbiAgbGV0IHJlc2hhcGVkVG81RCA9IGZhbHNlO1xuXG4gIGlmICgkaW5wdXQucmFuayA9PT0gNCkge1xuICAgIHJlc2hhcGVkVG81RCA9IHRydWU7XG4gICAgZHk1RCA9IHJlc2hhcGUoXG4gICAgICAgICRkeSwgWzEsICRkeS5zaGFwZVswXSwgJGR5LnNoYXBlWzFdLCAkZHkuc2hhcGVbMl0sICRkeS5zaGFwZVszXV0pO1xuICAgIGlucHV0NUQgPSByZXNoYXBlKCRpbnB1dCwgW1xuICAgICAgMSwgJGlucHV0LnNoYXBlWzBdLCAkaW5wdXQuc2hhcGVbMV0sICRpbnB1dC5zaGFwZVsyXSwgJGlucHV0LnNoYXBlWzNdXG4gICAgXSk7XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIGR5NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBhdmdQb29sM2RHcmFkOiBkeSBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7ZHk1RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dDVELnJhbmsgPT09IDUsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbDNkR3JhZDogaW5wdXQgbXVzdCBiZSByYW5rIDUgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAke2lucHV0NUQucmFua30uYCk7XG4gIGNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoJ2F2Z1Bvb2wzZEdyYWQnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGlucHV0czogQXZnUG9vbDNER3JhZElucHV0cyA9IHtkeTogZHk1RCwgaW5wdXQ6IGlucHV0NUR9O1xuICBjb25zdCBhdHRyczogQXZnUG9vbDNER3JhZEF0dHJzID0ge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gIGNvbnN0IHJlcyA9IEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgICAgICBBdmdQb29sM0RHcmFkLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG81RCkge1xuICAgIHJldHVybiByZXNoYXBlKFxuICAgICAgICAgICAgICAgcmVzLCBbcmVzLnNoYXBlWzFdLCByZXMuc2hhcGVbMl0sIHJlcy5zaGFwZVszXSwgcmVzLnNoYXBlWzRdXSkgYXNcbiAgICAgICAgVDtcbiAgfVxuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sM2RHcmFkID0gb3Aoe2F2Z1Bvb2wzZEdyYWRffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3D } from '../kernel_names';\nimport { avgPool3dGrad } from '../ops/avg_pool_3d_grad';\nexport const avgPool3DGradConfig = {\n    kernelName: AvgPool3D,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { filterSize, strides, pad, dimRoundingMode } = attrs;\n        return {\n            x: () => avgPool3dGrad(dy, x, filterSize, strides, pad, dimRoundingMode)\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNEX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9BdmdQb29sM0RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUd0RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBZTtJQUM3QyxVQUFVLEVBQUUsU0FBUztJQUNyQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQW1CLENBQUM7UUFDaEMsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxHQUM3QyxLQUE2QixDQUFDO1FBRWxDLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsYUFBYSxDQUNsQixFQUFjLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQztTQUNsRSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXZnUG9vbDNELCBBdmdQb29sM0RBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthdmdQb29sM2RHcmFkfSBmcm9tICcuLi9vcHMvYXZnX3Bvb2xfM2RfZ3JhZCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sM0RHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0QsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQgYXMgW1RlbnNvcjVEXTtcbiAgICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgQXZnUG9vbDNEQXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gYXZnUG9vbDNkR3JhZChcbiAgICAgICAgICBkeSBhcyBUZW5zb3I1RCwgeCwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { AvgPoolGrad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the backprop of an 2D avg pool.\n *\n * @param dy The dy error, of rank 4 or rank 3 of shape\n *     [batchSize, height, width, channels]. If rank 3, batch of 1 is\n * assumed.\n * @param input The input image, of rank 4 or rank 3 of shape\n *     [batchSize, height, width, channels]. If rank 3, batch of 1 is\n * assumed.\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n *     `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm used in the forward prop of the op.\n *     'same', 'valid', for more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *         https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n */\nfunction avgPoolGrad_(dy, input, filterSize, strides, pad) {\n    const $dy = convertToTensor(dy, 'dy', 'avgPoolGrad');\n    const $input = convertToTensor(input, 'input', 'avgPoolGrad');\n    util.assert($input.rank === $dy.rank, () => `Rank of input (${$input.rank}) does not match rank of dy (${$dy.rank})`);\n    let input4D = $input;\n    let dy4D = $dy;\n    let reshapedTo4D = false;\n    if ($input.rank === 3) {\n        reshapedTo4D = true;\n        input4D =\n            reshape($input, [1, $input.shape[0], $input.shape[1], $input.shape[2]]);\n        dy4D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2]]);\n    }\n    util.assert(dy4D.rank === 4, () => `Error in avgPoolGrad: dy must be rank 4 but got rank ` +\n        `${dy4D.rank}.`);\n    util.assert(input4D.rank === 4, () => `Error in avgPoolGrad: input must be rank 4 but got rank ` +\n        `${input4D.rank}.`);\n    const inputs = { dy: dy4D, input: input4D };\n    const attrs = { filterSize, strides, pad };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(AvgPoolGrad, inputs, attrs);\n    if (reshapedTo4D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3]]);\n    }\n    return res;\n}\nexport const avgPoolGrad = op({ avgPoolGrad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2xfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2F2Z19wb29sX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFzQyxNQUFNLGlCQUFpQixDQUFDO0FBSWpGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUdoQyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEM7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBaUJHO0FBQ0gsU0FBUyxZQUFZLENBQ2pCLEVBQWdCLEVBQUUsS0FBbUIsRUFBRSxVQUFtQyxFQUMxRSxPQUFnQyxFQUNoQyxHQUEwQztJQUM1QyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNyRCxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUU5RCxJQUFJLENBQUMsTUFBTSxDQUNQLE1BQU0sQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksRUFDeEIsR0FBRyxFQUFFLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxJQUFJLGdDQUMvQixHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUVyQixJQUFJLE9BQU8sR0FBRyxNQUFrQixDQUFDO0lBQ2pDLElBQUksSUFBSSxHQUFHLEdBQWUsQ0FBQztJQUMzQixJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFekIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNyQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLE9BQU87WUFDSCxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEU7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNmLEdBQUcsRUFBRSxDQUFDLHVEQUF1RDtRQUN6RCxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBRTVCLE1BQU0sTUFBTSxHQUFzQixFQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDO0lBRTdELE1BQU0sS0FBSyxHQUFxQixFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLENBQUM7SUFFM0QsMERBQTBEO0lBQzFELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQ1osV0FBVyxFQUFFLE1BQThCLEVBQzNDLEtBQTJCLENBQU0sQ0FBQztJQUVsRCxJQUFJLFlBQVksRUFBRTtRQUNoQixPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFNLENBQUM7S0FDdEU7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0F2Z1Bvb2xHcmFkLCBBdmdQb29sR3JhZEF0dHJzLCBBdmdQb29sR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7RXhwbGljaXRQYWRkaW5nfSBmcm9tICcuL2NvbnZfdXRpbCc7XG5pbXBvcnQge29wfSBmcm9tICcuL29wZXJhdGlvbic7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vcmVzaGFwZSc7XG5cbi8qKlxuICogQ29tcHV0ZXMgdGhlIGJhY2twcm9wIG9mIGFuIDJEIGF2ZyBwb29sLlxuICpcbiAqIEBwYXJhbSBkeSBUaGUgZHkgZXJyb3IsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgICBbYmF0Y2hTaXplLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgaW1hZ2UsIG9mIHJhbmsgNCBvciByYW5rIDMgb2Ygc2hhcGVcbiAqICAgICBbYmF0Y2hTaXplLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uIElmIHJhbmsgMywgYmF0Y2ggb2YgMSBpc1xuICogYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaXplIFRoZSBmaWx0ZXIgc2l6ZTogYFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoXWAuIElmXG4gKiAgICAgYGZpbHRlclNpemVgIGlzIGEgc2luZ2xlIG51bWJlciwgdGhlbiBgZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOiBgW3N0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBUaGUgdHlwZSBvZiBwYWRkaW5nIGFsZ29yaXRobSB1c2VkIGluIHRoZSBmb3J3YXJkIHByb3Agb2YgdGhlIG9wLlxuICogICAgICdzYW1lJywgJ3ZhbGlkJywgZm9yIG1vcmUgaW5mbywgc2VlIHRoaXMgZ3VpZGU6XG4gKiAgICAgW2h0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbl0oXG4gKiAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqL1xuZnVuY3Rpb24gYXZnUG9vbEdyYWRfPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgZHk6IFR8VGVuc29yTGlrZSwgaW5wdXQ6IFR8VGVuc29yTGlrZSwgZmlsdGVyU2l6ZTogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nKTogVCB7XG4gIGNvbnN0ICRkeSA9IGNvbnZlcnRUb1RlbnNvcihkeSwgJ2R5JywgJ2F2Z1Bvb2xHcmFkJyk7XG4gIGNvbnN0ICRpbnB1dCA9IGNvbnZlcnRUb1RlbnNvcihpbnB1dCwgJ2lucHV0JywgJ2F2Z1Bvb2xHcmFkJyk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICAkaW5wdXQucmFuayA9PT0gJGR5LnJhbmssXG4gICAgICAoKSA9PiBgUmFuayBvZiBpbnB1dCAoJHskaW5wdXQucmFua30pIGRvZXMgbm90IG1hdGNoIHJhbmsgb2YgZHkgKCR7XG4gICAgICAgICAgJGR5LnJhbmt9KWApO1xuXG4gIGxldCBpbnB1dDREID0gJGlucHV0IGFzIFRlbnNvcjREO1xuICBsZXQgZHk0RCA9ICRkeSBhcyBUZW5zb3I0RDtcbiAgbGV0IHJlc2hhcGVkVG80RCA9IGZhbHNlO1xuXG4gIGlmICgkaW5wdXQucmFuayA9PT0gMykge1xuICAgIHJlc2hhcGVkVG80RCA9IHRydWU7XG4gICAgaW5wdXQ0RCA9XG4gICAgICAgIHJlc2hhcGUoJGlucHV0LCBbMSwgJGlucHV0LnNoYXBlWzBdLCAkaW5wdXQuc2hhcGVbMV0sICRpbnB1dC5zaGFwZVsyXV0pO1xuICAgIGR5NEQgPSByZXNoYXBlKCRkeSwgWzEsICRkeS5zaGFwZVswXSwgJGR5LnNoYXBlWzFdLCAkZHkuc2hhcGVbMl1dKTtcbiAgfVxuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk0RC5yYW5rID09PSA0LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGF2Z1Bvb2xHcmFkOiBkeSBtdXN0IGJlIHJhbmsgNCBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7ZHk0RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dDRELnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gYXZnUG9vbEdyYWQ6IGlucHV0IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHtpbnB1dDRELnJhbmt9LmApO1xuXG4gIGNvbnN0IGlucHV0czogQXZnUG9vbEdyYWRJbnB1dHMgPSB7ZHk6IGR5NEQsIGlucHV0OiBpbnB1dDREfTtcblxuICBjb25zdCBhdHRyczogQXZnUG9vbEdyYWRBdHRycyA9IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIEF2Z1Bvb2xHcmFkLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsXG4gICAgICAgICAgICAgICAgICBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApIGFzIFQ7XG5cbiAgaWYgKHJlc2hhcGVkVG80RCkge1xuICAgIHJldHVybiByZXNoYXBlKHJlcywgW3Jlcy5zaGFwZVsxXSwgcmVzLnNoYXBlWzJdLCByZXMuc2hhcGVbM11dKSBhcyBUO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sR3JhZCA9IG9wKHthdmdQb29sR3JhZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool } from '../kernel_names';\nimport { avgPoolGrad } from '../ops/avg_pool_grad';\nexport const avgPoolGradConfig = {\n    kernelName: AvgPool,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { filterSize, strides, pad } = attrs;\n        return { x: () => avgPoolGrad(dy, x, filterSize, strides, pad) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQXZnUG9vbF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWU7SUFDM0MsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFtQixDQUFDO1FBQ2hDLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxHQUFHLEtBQTJCLENBQUM7UUFDL0QsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBYyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQyxFQUFDLENBQUM7SUFDN0UsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QXZnUG9vbCwgQXZnUG9vbEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2F2Z1Bvb2xHcmFkfSBmcm9tICcuLi9vcHMvYXZnX3Bvb2xfZ3JhZCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZCBhcyBbVGVuc29yNERdO1xuICAgIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnMgYXMge30gYXMgQXZnUG9vbEF0dHJzO1xuICAgIHJldHVybiB7eDogKCkgPT4gYXZnUG9vbEdyYWQoZHkgYXMgVGVuc29yNEQsIHgsIGZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BatchMatMul } from '../kernel_names';\nimport { matMul } from '../ops/mat_mul';\nexport const batchMatMulGradConfig = {\n    kernelName: BatchMatMul,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved, attrs) => {\n        const [a, b] = saved;\n        const { transposeA, transposeB } = attrs;\n        if (!transposeA && !transposeB) {\n            return {\n                a: () => matMul(dy, b, false, true),\n                b: () => matMul(a, dy, true, false)\n            };\n        }\n        else if (!transposeA && transposeB) {\n            return {\n                a: () => matMul(dy, b, false, false),\n                b: () => matMul(dy, a, true, false)\n            };\n        }\n        else if (transposeA && !transposeB) {\n            return {\n                a: () => matMul(b, dy, false, true),\n                b: () => matMul(a, dy, false, false)\n            };\n        }\n        else {\n            return {\n                a: () => matMul(b, dy, true, true),\n                b: () => matMul(dy, a, true, true)\n            };\n        }\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hNYXRNdWxfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0JhdGNoTWF0TXVsX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdEMsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQWU7SUFDL0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVyQixNQUFNLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQStCLENBQUM7UUFFakUsSUFBSSxDQUFDLFVBQVUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUM5QixPQUFPO2dCQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO2dCQUNuQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUNwQyxDQUFDO1NBQ0g7YUFBTSxJQUFJLENBQUMsVUFBVSxJQUFJLFVBQVUsRUFBRTtZQUNwQyxPQUFPO2dCQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDO2dCQUNwQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUNwQyxDQUFDO1NBQ0g7YUFBTSxJQUFJLFVBQVUsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNwQyxPQUFPO2dCQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO2dCQUNuQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQzthQUNyQyxDQUFDO1NBQ0g7YUFBTTtZQUNMLE9BQU87Z0JBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUM7Z0JBQ2xDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDO2FBQ25DLENBQUM7U0FDSDtJQUNILENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0JhdGNoTWF0TXVsLCBCYXRjaE1hdE11bEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge21hdE11bH0gZnJvbSAnLi4vb3BzL21hdF9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBiYXRjaE1hdE11bEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJhdGNoTWF0TXVsLFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG5cbiAgICBjb25zdCB7dHJhbnNwb3NlQSwgdHJhbnNwb3NlQn0gPSBhdHRycyBhcyB7fSBhcyBCYXRjaE1hdE11bEF0dHJzO1xuXG4gICAgaWYgKCF0cmFuc3Bvc2VBICYmICF0cmFuc3Bvc2VCKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiAoKSA9PiBtYXRNdWwoZHksIGIsIGZhbHNlLCB0cnVlKSxcbiAgICAgICAgYjogKCkgPT4gbWF0TXVsKGEsIGR5LCB0cnVlLCBmYWxzZSlcbiAgICAgIH07XG4gICAgfSBlbHNlIGlmICghdHJhbnNwb3NlQSAmJiB0cmFuc3Bvc2VCKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBhOiAoKSA9PiBtYXRNdWwoZHksIGIsIGZhbHNlLCBmYWxzZSksXG4gICAgICAgIGI6ICgpID0+IG1hdE11bChkeSwgYSwgdHJ1ZSwgZmFsc2UpXG4gICAgICB9O1xuICAgIH0gZWxzZSBpZiAodHJhbnNwb3NlQSAmJiAhdHJhbnNwb3NlQikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogKCkgPT4gbWF0TXVsKGIsIGR5LCBmYWxzZSwgdHJ1ZSksXG4gICAgICAgIGI6ICgpID0+IG1hdE11bChhLCBkeSwgZmFsc2UsIGZhbHNlKVxuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgYTogKCkgPT4gbWF0TXVsKGIsIGR5LCB0cnVlLCB0cnVlKSxcbiAgICAgICAgYjogKCkgPT4gbWF0TXVsKGR5LCBhLCB0cnVlLCB0cnVlKVxuICAgICAgfTtcbiAgICB9XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BatchToSpaceND } from '../kernel_names';\nimport { spaceToBatchND } from '../ops/space_to_batch_nd';\nexport const batchToSpaceNDGradConfig = {\n    kernelName: BatchToSpaceND,\n    gradFunc: (dy, saved, attrs) => {\n        const { blockShape, crops } = attrs;\n        return { x: () => spaceToBatchND(dy, blockShape, crops) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hUb1NwYWNlTkRfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0JhdGNoVG9TcGFjZU5EX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGNBQWMsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWU7SUFDbEQsVUFBVSxFQUFFLGNBQWM7SUFDMUIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsR0FBRyxLQUFrQyxDQUFDO1FBQy9ELE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCYXRjaFRvU3BhY2VORCwgQmF0Y2hUb1NwYWNlTkRBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtzcGFjZVRvQmF0Y2hORH0gZnJvbSAnLi4vb3BzL3NwYWNlX3RvX2JhdGNoX25kJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCYXRjaFRvU3BhY2VORCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7YmxvY2tTaGFwZSwgY3JvcHN9ID0gYXR0cnMgYXMge30gYXMgQmF0Y2hUb1NwYWNlTkRBdHRycztcbiAgICByZXR1cm4ge3g6ICgpID0+IHNwYWNlVG9CYXRjaE5EKGR5LCBibG9ja1NoYXBlLCBjcm9wcyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BroadcastTo } from '../kernel_names';\nimport { sum } from '../ops/sum';\nexport const broadcastToGradConfig = {\n    kernelName: BroadcastTo,\n    gradFunc: (dy, saved, attrs) => {\n        const broadCastToAttrs = attrs;\n        const inputShape = broadCastToAttrs.inputShape;\n        const outputShape = broadCastToAttrs.shape;\n        const reps = Array.from(outputShape);\n        for (let i = inputShape.length - 1; i >= 0; i--) {\n            if (inputShape[i] === outputShape[i]) {\n                reps[i] = 1;\n            }\n            else if (inputShape[i] !== 1) {\n                throw new Error(`broadcastTo(): [${inputShape}] cannot be broadcast to [${outputShape}].`);\n            }\n        }\n        const axes = [];\n        for (let i = 0; i < reps.length; i++) {\n            if (reps[i] > 1) {\n                axes.push(i);\n            }\n        }\n        return { x: () => sum(dy, axes, true /* keepDims */) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJvYWRjYXN0VG9fZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Jyb2FkY2FzdFRvX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFlO0lBQy9DLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sZ0JBQWdCLEdBQ2xCLEtBQW9DLENBQUM7UUFFekMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsVUFBVSxDQUFDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQztRQUUzQyxNQUFNLElBQUksR0FBYSxLQUFLLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9DLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMvQyxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDYjtpQkFBTSxJQUFJLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzlCLE1BQU0sSUFBSSxLQUFLLENBQUMsbUJBQ1osVUFBVSw2QkFBNkIsV0FBVyxJQUFJLENBQUMsQ0FBQzthQUM3RDtTQUNGO1FBQ0QsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO1FBQzFCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3BDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDZixJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2Q7U0FDRjtRQUVELE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFDLENBQUM7SUFDdkQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QnJvYWRjYXN0VG8sIEJyb2FkQ2FzdFRvQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9vcHMvc3VtJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgYnJvYWRjYXN0VG9HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCcm9hZGNhc3RUbyxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBicm9hZENhc3RUb0F0dHJzOiBCcm9hZENhc3RUb0F0dHJzID1cbiAgICAgICAgYXR0cnMgYXMgdW5rbm93biBhcyBCcm9hZENhc3RUb0F0dHJzO1xuXG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IGJyb2FkQ2FzdFRvQXR0cnMuaW5wdXRTaGFwZTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IGJyb2FkQ2FzdFRvQXR0cnMuc2hhcGU7XG5cbiAgICBjb25zdCByZXBzOiBudW1iZXJbXSA9IEFycmF5LmZyb20ob3V0cHV0U2hhcGUpO1xuICAgIGZvciAobGV0IGkgPSBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBpZiAoaW5wdXRTaGFwZVtpXSA9PT0gb3V0cHV0U2hhcGVbaV0pIHtcbiAgICAgICAgcmVwc1tpXSA9IDE7XG4gICAgICB9IGVsc2UgaWYgKGlucHV0U2hhcGVbaV0gIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBicm9hZGNhc3RUbygpOiBbJHtcbiAgICAgICAgICAgIGlucHV0U2hhcGV9XSBjYW5ub3QgYmUgYnJvYWRjYXN0IHRvIFske291dHB1dFNoYXBlfV0uYCk7XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IGF4ZXM6IG51bWJlcltdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVwc1tpXSA+IDEpIHtcbiAgICAgICAgYXhlcy5wdXNoKGkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7eDogKCkgPT4gc3VtKGR5LCBheGVzLCB0cnVlIC8qIGtlZXBEaW1zICovKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cast } from '../kernel_names';\nexport const castGradConfig = {\n    kernelName: Cast,\n    gradFunc: (dy) => {\n        return { x: () => dy.clone() };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FzdF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ2FzdF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUlyQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDYXN0fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBjYXN0R3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2FzdCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBkeS5jbG9uZSgpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Ceil } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const ceilGradConfig = {\n    kernelName: Ceil,\n    gradFunc: (dy) => {\n        // TODO(manrajgrover): Return null for gradients when backprop supports it.\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2VpbF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ2VpbF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQ3ZCLDJFQUEyRTtRQUMzRSxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NlaWx9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBjZWlsR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2VpbCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgLy8gVE9ETyhtYW5yYWpncm92ZXIpOiBSZXR1cm4gbnVsbCBmb3IgZ3JhZGllbnRzIHdoZW4gYmFja3Byb3Agc3VwcG9ydHMgaXQuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ClipByValue } from '../kernel_names';\nimport { greaterEqual } from '../ops/greater_equal';\nimport { lessEqual } from '../ops/less_equal';\nimport { logicalAnd } from '../ops/logical_and';\nimport { where } from '../ops/where';\nimport { zerosLike } from '../ops/zeros_like';\nexport const clipByValueGradConfig = {\n    kernelName: ClipByValue,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { clipValueMin, clipValueMax } = attrs;\n        return {\n            x: () => where(logicalAnd(greaterEqual(x, clipValueMin), lessEqual(x, clipValueMax)), dy, zerosLike(dy)),\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpcEJ5VmFsdWVfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0NsaXBCeVZhbHVlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBbUIsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBZTtJQUMvQyxVQUFVLEVBQUUsV0FBVztJQUN2QixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBQyxHQUFHLEtBQStCLENBQUM7UUFDckUsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQ1YsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLEVBQUUsWUFBWSxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsQ0FBQyxFQUNyRSxFQUFFLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ3ZCLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDbGlwQnlWYWx1ZSwgQ2xpcEJ5VmFsdWVBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtncmVhdGVyRXF1YWx9IGZyb20gJy4uL29wcy9ncmVhdGVyX2VxdWFsJztcbmltcG9ydCB7bGVzc0VxdWFsfSBmcm9tICcuLi9vcHMvbGVzc19lcXVhbCc7XG5pbXBvcnQge2xvZ2ljYWxBbmR9IGZyb20gJy4uL29wcy9sb2dpY2FsX2FuZCc7XG5pbXBvcnQge3doZXJlfSBmcm9tICcuLi9vcHMvd2hlcmUnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgY2xpcEJ5VmFsdWVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCB7Y2xpcFZhbHVlTWluLCBjbGlwVmFsdWVNYXh9ID0gYXR0cnMgYXMge30gYXMgQ2xpcEJ5VmFsdWVBdHRycztcbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gd2hlcmUoXG4gICAgICAgICAgbG9naWNhbEFuZChncmVhdGVyRXF1YWwoeCwgY2xpcFZhbHVlTWluKSwgbGVzc0VxdWFsKHgsIGNsaXBWYWx1ZU1heCkpLFxuICAgICAgICAgIGR5LCB6ZXJvc0xpa2UoZHkpKSxcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ComplexAbs } from '../kernel_names';\nimport { absGradConfig } from './Abs_grad';\nexport const complexAbsGradConfig = {\n    kernelName: ComplexAbs,\n    inputsToSave: ['x'],\n    gradFunc: absGradConfig.gradFunc,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleEFic19ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ29tcGxleEFic19ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFlO0lBQzlDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsYUFBYSxDQUFDLFFBQVE7Q0FDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb21wbGV4QWJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthYnNHcmFkQ29uZmlnfSBmcm9tICcuL0Fic19ncmFkJztcblxuZXhwb3J0IGNvbnN0IGNvbXBsZXhBYnNHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb21wbGV4QWJzLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogYWJzR3JhZENvbmZpZy5ncmFkRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Concat } from '../kernel_names';\nimport { split } from '../ops/split';\nimport { parseAxisParam } from '../util';\nexport const concatGradConfig = {\n    kernelName: Concat,\n    saveAllInputs: true,\n    gradFunc: (dy, saved, attrs) => {\n        const shapes = saved.map(t => t.shape);\n        const { axis } = attrs;\n        const $axis = parseAxisParam(axis, saved[0].shape)[0];\n        const sizeSplits = shapes.map(s => s[$axis]);\n        const derTensors = split(dy, sizeSplits, $axis);\n        return derTensors.map(t => () => t);\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Db25jYXRfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUVuQyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFlO0lBQzFDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQTBCLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxFQUFFLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ2hELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBTyxDQUFDO0lBQzVDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtDb25jYXQsIENvbmNhdEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3NwbGl0fSBmcm9tICcuLi9vcHMvc3BsaXQnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge3BhcnNlQXhpc1BhcmFtfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IGNvbmNhdEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbmNhdCxcbiAgc2F2ZUFsbElucHV0czogdHJ1ZSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBzaGFwZXMgPSBzYXZlZC5tYXAodCA9PiB0LnNoYXBlKTtcbiAgICBjb25zdCB7YXhpc30gPSBhdHRycyBhcyB7fSBhcyBDb25jYXRBdHRycztcbiAgICBjb25zdCAkYXhpcyA9IHBhcnNlQXhpc1BhcmFtKGF4aXMsIHNhdmVkWzBdLnNoYXBlKVswXTtcbiAgICBjb25zdCBzaXplU3BsaXRzID0gc2hhcGVzLm1hcChzID0+IHNbJGF4aXNdKTtcbiAgICBjb25zdCBkZXJUZW5zb3JzID0gc3BsaXQoZHksIHNpemVTcGxpdHMsICRheGlzKTtcbiAgICByZXR1cm4gZGVyVGVuc29ycy5tYXAodCA9PiAoKSA9PiB0KSBhcyB7fTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Conv2D } from '../kernel_names';\nimport { conv2DBackpropFilter } from '../ops/conv2d_backprop_filter';\nimport { conv2DBackpropInput } from '../ops/conv2d_backprop_input';\nimport * as conv_util from '../ops/conv_util';\nimport * as util from '../util';\nexport const conv2DGradConfig = {\n    kernelName: Conv2D,\n    inputsToSave: ['x', 'filter'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x4D, $filter] = saved;\n        const { dilations, strides, pad, dataFormat } = attrs;\n        util.assert(conv_util.tupleValuesAreOne(dilations), () => 'Error in gradient of conv2D: dilation rates greater than 1 ' +\n            `are not yet supported in gradients. Got dilations '${dilations}'`);\n        return {\n            x: () => conv2DBackpropInput(x4D.shape, dy, $filter, strides, pad, dataFormat),\n            filter: () => conv2DBackpropFilter(x4D, dy, $filter.shape, strides, pad, dataFormat)\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Db252MkRfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxLQUFLLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUU5QyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZTtJQUMxQyxVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDO0lBQzdCLFFBQVEsRUFBRSxDQUFDLEVBQVksRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQy9ELE1BQU0sQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLEdBQUcsS0FBNkIsQ0FBQztRQUNyRCxNQUFNLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBMEIsQ0FBQztRQUV6RSxJQUFJLENBQUMsTUFBTSxDQUNQLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxTQUFTLENBQUMsRUFDdEMsR0FBRyxFQUFFLENBQUMsNkRBQTZEO1lBQy9ELHNEQUFzRCxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRTVFLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQ0osbUJBQW1CLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxDQUFDO1lBQ3pFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FDVCxvQkFBb0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLENBQUM7U0FDM0UsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtDb252MkQsIENvbnYyREF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wRmlsdGVyfSBmcm9tICcuLi9vcHMvY29udjJkX2JhY2twcm9wX2ZpbHRlcic7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wSW5wdXR9IGZyb20gJy4uL29wcy9jb252MmRfYmFja3Byb3BfaW5wdXQnO1xuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IGNvbnYyREdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyRCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnLCAnZmlsdGVyJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcjRELCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeDRELCAkZmlsdGVyXSA9IHNhdmVkIGFzIFtUZW5zb3I0RCwgVGVuc29yNERdO1xuICAgIGNvbnN0IHtkaWxhdGlvbnMsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdH0gPSBhdHRycyBhcyB7fSBhcyBDb252MkRBdHRycztcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBjb252X3V0aWwudHVwbGVWYWx1ZXNBcmVPbmUoZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIGdyYWRpZW50IG9mIGNvbnYyRDogZGlsYXRpb24gcmF0ZXMgZ3JlYXRlciB0aGFuIDEgJyArXG4gICAgICAgICAgICBgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGluIGdyYWRpZW50cy4gR290IGRpbGF0aW9ucyAnJHtkaWxhdGlvbnN9J2ApO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+XG4gICAgICAgICAgY29udjJEQmFja3Byb3BJbnB1dCh4NEQuc2hhcGUsIGR5LCAkZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQpLFxuICAgICAgZmlsdGVyOiAoKSA9PlxuICAgICAgICAgIGNvbnYyREJhY2twcm9wRmlsdGVyKHg0RCwgZHksICRmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdClcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Conv2DBackpropInput } from '../kernel_names';\nimport { conv2d } from '../ops/conv2d';\nimport { conv2DBackpropFilter } from '../ops/conv2d_backprop_filter';\nexport const conv2DBackpropInputGradConfig = {\n    kernelName: Conv2DBackpropInput,\n    inputsToSave: ['dy', 'filter'],\n    gradFunc: (ddx, saved, attrs) => {\n        const [dy, filter] = saved;\n        const { strides, pad, dataFormat, dimRoundingMode } = attrs;\n        return {\n            dy: () => conv2d(ddx, filter, strides, pad, dataFormat, 1 /* dilations */, dimRoundingMode),\n            filter: () => conv2DBackpropFilter(ddx, dy, filter.shape, strides, pad, dataFormat, dimRoundingMode)\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BJbnB1dF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ29udjJEQmFja3Byb3BJbnB1dF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxtQkFBbUIsRUFBMkIsTUFBTSxpQkFBaUIsQ0FBQztBQUU5RSxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBR25FLE1BQU0sQ0FBQyxNQUFNLDZCQUE2QixHQUFlO0lBQ3ZELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsWUFBWSxFQUFFLENBQUMsSUFBSSxFQUFFLFFBQVEsQ0FBQztJQUM5QixRQUFRLEVBQUUsQ0FBQyxHQUFhLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUNoRSxNQUFNLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFFbkQsTUFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBQyxHQUM3QyxLQUF1QyxDQUFDO1FBRTVDLE9BQU87WUFDTCxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUNaLEdBQUcsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDLGVBQWUsRUFDeEQsZUFBZSxDQUFDO1lBQ3BCLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FDOUIsR0FBRyxFQUFFLEVBQUUsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQztTQUN0RSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0NvbnYyREJhY2twcm9wSW5wdXQsIENvbnYyREJhY2twcm9wSW5wdXRBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjb252MmR9IGZyb20gJy4uL29wcy9jb252MmQnO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcEZpbHRlcn0gZnJvbSAnLi4vb3BzL2NvbnYyZF9iYWNrcHJvcF9maWx0ZXInO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BJbnB1dEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wSW5wdXQsXG4gIGlucHV0c1RvU2F2ZTogWydkeScsICdmaWx0ZXInXSxcbiAgZ3JhZEZ1bmM6IChkZHg6IFRlbnNvcjRELCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbZHksIGZpbHRlcl0gPSBzYXZlZCBhcyBbVGVuc29yNEQsIFRlbnNvcjREXTtcblxuICAgIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZX0gPVxuICAgICAgICBhdHRycyBhcyB7fSBhcyBDb252MkRCYWNrcHJvcElucHV0QXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgZHk6ICgpID0+IGNvbnYyZChcbiAgICAgICAgICBkZHgsIGZpbHRlciwgc3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCAxIC8qIGRpbGF0aW9ucyAqLyxcbiAgICAgICAgICBkaW1Sb3VuZGluZ01vZGUpLFxuICAgICAgZmlsdGVyOiAoKSA9PiBjb252MkRCYWNrcHJvcEZpbHRlcihcbiAgICAgICAgICBkZHgsIGR5LCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlKVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Conv3DBackpropFilterV2 } from '../kernel_names';\nimport * as util from '../util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the derivative of the filter of a 3D convolution.\n *\n * @param x The input tensor, of rank 5 or rank 4 of shape\n *     [batch, depth, height, width, inChannels]. If rank 4, batch of 1 is\n *     assumed.\n * @param dy The dy image, of rank 5 or rank 4, of shape\n *     [batch, depth, height, width, outDepth]. If rank 4, batch of 1 is\n *     assumed.\n * @param filterShape The shape of the filter, length 5,\n *     [filterDepth, filterHeight, filterWidth, inDepth, outDepth].\n * @param strides The strides of the convolution: [strideDepth, strideHeight,\n * strideWidth].\n * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n *     used in the forward prop of the op.\n */\nfunction conv3DBackpropFilter_(x, dy, filterShape, strides, pad) {\n    let x5D = x;\n    if (x.rank === 4) {\n        x5D = reshape(x, [1, x.shape[0], x.shape[1], x.shape[2], x.shape[3]]);\n    }\n    let dy5D = dy;\n    if (dy5D.rank === 4) {\n        dy5D = reshape(dy, [1, dy.shape[0], dy.shape[1], dy.shape[2], dy.shape[3]]);\n    }\n    util.assert(x5D.rank === 5, () => `Error in conv3dDerFilter: input must be rank 5, but got shape ` +\n        `${x5D.shape}.`);\n    util.assert(dy5D.rank === 5, () => `Error in conv3dDerFilter: dy must be rank 5, but got shape ` +\n        `${dy5D.shape}.`);\n    util.assert(filterShape.length === 5, () => `Error in conv3dDerFilter: filterShape must be length 5, but got ` +\n        `${filterShape}.`);\n    util.assert(x5D.shape[4] === filterShape[3], () => `Error in conv3dDerFilter: depth of input ${x5D.shape[4]}) must ` +\n        `match input depth in filter (${filterShape[3]}.`);\n    util.assert(dy5D.shape[4] === filterShape[4], () => `Error in conv3dDerFilter: depth of dy (${dy5D.shape[4]}) must ` +\n        `match output depth for filter (${filterShape[4]}).`);\n    const inputs = { x: x5D, dy: dy5D };\n    const attrs = { strides, pad, filterShape };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    return ENGINE.runKernel(Conv3DBackpropFilterV2, inputs, attrs);\n}\nexport const conv3DBackpropFilter = op({ conv3DBackpropFilter_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjNkX2JhY2twcm9wX2ZpbHRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2NvbnYzZF9iYWNrcHJvcF9maWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsc0JBQXNCLEVBQTRELE1BQU0saUJBQWlCLENBQUM7QUFJbEgsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILFNBQVMscUJBQXFCLENBQzFCLENBQUksRUFBRSxFQUFLLEVBQUUsV0FBcUQsRUFDbEUsT0FBd0MsRUFBRSxHQUFtQjtJQUMvRCxJQUFJLEdBQUcsR0FBRyxDQUFhLENBQUM7SUFDeEIsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNoQixHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN2RTtJQUNELElBQUksSUFBSSxHQUFHLEVBQWMsQ0FBQztJQUMxQixJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ25CLElBQUksR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdFO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDZCxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQztJQUN6QixJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNmLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtRQUMvRCxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQzFCLElBQUksQ0FBQyxNQUFNLENBQ1AsV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ3hCLEdBQUcsRUFBRSxDQUFDLGtFQUFrRTtRQUNwRSxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUM7SUFDM0IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFDL0IsR0FBRyxFQUFFLENBQUMsNENBQTRDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbkUsZ0NBQWdDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFDaEMsR0FBRyxFQUFFLENBQUMsMENBQTBDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFNBQVM7UUFDbEUsa0NBQWtDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFOUQsTUFBTSxNQUFNLEdBQWlDLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFFaEUsTUFBTSxLQUFLLEdBQWdDLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUMsQ0FBQztJQUV2RSwwREFBMEQ7SUFDMUQsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUNaLHNCQUFzQixFQUFFLE1BQThCLEVBQ3RELEtBQTJCLENBQWEsQ0FBQztBQUN0RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDLEVBQUMscUJBQXFCLEVBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0NvbnYzREJhY2twcm9wRmlsdGVyVjIsIENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycywgQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RCwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBkZXJpdmF0aXZlIG9mIHRoZSBmaWx0ZXIgb2YgYSAzRCBjb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geCBUaGUgaW5wdXQgdGVuc29yLCBvZiByYW5rIDUgb3IgcmFuayA0IG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoLCBkZXB0aCwgaGVpZ2h0LCB3aWR0aCwgaW5DaGFubmVsc10uIElmIHJhbmsgNCwgYmF0Y2ggb2YgMSBpc1xuICogICAgIGFzc3VtZWQuXG4gKiBAcGFyYW0gZHkgVGhlIGR5IGltYWdlLCBvZiByYW5rIDUgb3IgcmFuayA0LCBvZiBzaGFwZVxuICogICAgIFtiYXRjaCwgZGVwdGgsIGhlaWdodCwgd2lkdGgsIG91dERlcHRoXS4gSWYgcmFuayA0LCBiYXRjaCBvZiAxIGlzXG4gKiAgICAgYXNzdW1lZC5cbiAqIEBwYXJhbSBmaWx0ZXJTaGFwZSBUaGUgc2hhcGUgb2YgdGhlIGZpbHRlciwgbGVuZ3RoIDUsXG4gKiAgICAgW2ZpbHRlckRlcHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF0uXG4gKiBAcGFyYW0gc3RyaWRlcyBUaGUgc3RyaWRlcyBvZiB0aGUgY29udm9sdXRpb246IFtzdHJpZGVEZXB0aCwgc3RyaWRlSGVpZ2h0LFxuICogc3RyaWRlV2lkdGhdLlxuICogQHBhcmFtIHBhZCBBIHN0cmluZyBmcm9tOiAnc2FtZScsICd2YWxpZCcuIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtXG4gKiAgICAgdXNlZCBpbiB0aGUgZm9yd2FyZCBwcm9wIG9mIHRoZSBvcC5cbiAqL1xuZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJfPFQgZXh0ZW5kcyBUZW5zb3I0RHxUZW5zb3I1RD4oXG4gICAgeDogVCwgZHk6IFQsIGZpbHRlclNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsIHBhZDogJ3ZhbGlkJ3wnc2FtZScpOiBUZW5zb3I1RCB7XG4gIGxldCB4NUQgPSB4IGFzIFRlbnNvcjVEO1xuICBpZiAoeC5yYW5rID09PSA0KSB7XG4gICAgeDVEID0gcmVzaGFwZSh4LCBbMSwgeC5zaGFwZVswXSwgeC5zaGFwZVsxXSwgeC5zaGFwZVsyXSwgeC5zaGFwZVszXV0pO1xuICB9XG4gIGxldCBkeTVEID0gZHkgYXMgVGVuc29yNUQ7XG4gIGlmIChkeTVELnJhbmsgPT09IDQpIHtcbiAgICBkeTVEID0gcmVzaGFwZShkeSwgWzEsIGR5LnNoYXBlWzBdLCBkeS5zaGFwZVsxXSwgZHkuc2hhcGVbMl0sIGR5LnNoYXBlWzNdXSk7XG4gIH1cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJGaWx0ZXI6IGlucHV0IG11c3QgYmUgcmFuayA1LCBidXQgZ290IHNoYXBlIGAgK1xuICAgICAgICAgIGAke3g1RC5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZHk1RC5yYW5rID09PSA1LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlckZpbHRlcjogZHkgbXVzdCBiZSByYW5rIDUsIGJ1dCBnb3Qgc2hhcGUgYCArXG4gICAgICAgICAgYCR7ZHk1RC5zaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZmlsdGVyU2hhcGUubGVuZ3RoID09PSA1LFxuICAgICAgKCkgPT4gYEVycm9yIGluIGNvbnYzZERlckZpbHRlcjogZmlsdGVyU2hhcGUgbXVzdCBiZSBsZW5ndGggNSwgYnV0IGdvdCBgICtcbiAgICAgICAgICBgJHtmaWx0ZXJTaGFwZX0uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeDVELnNoYXBlWzRdID09PSBmaWx0ZXJTaGFwZVszXSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJGaWx0ZXI6IGRlcHRoIG9mIGlucHV0ICR7eDVELnNoYXBlWzRdfSkgbXVzdCBgICtcbiAgICAgICAgICBgbWF0Y2ggaW5wdXQgZGVwdGggaW4gZmlsdGVyICgke2ZpbHRlclNoYXBlWzNdfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBkeTVELnNoYXBlWzRdID09PSBmaWx0ZXJTaGFwZVs0XSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBjb252M2REZXJGaWx0ZXI6IGRlcHRoIG9mIGR5ICgke2R5NUQuc2hhcGVbNF19KSBtdXN0IGAgK1xuICAgICAgICAgIGBtYXRjaCBvdXRwdXQgZGVwdGggZm9yIGZpbHRlciAoJHtmaWx0ZXJTaGFwZVs0XX0pLmApO1xuXG4gIGNvbnN0IGlucHV0czogQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cyA9IHt4OiB4NUQsIGR5OiBkeTVEfTtcblxuICBjb25zdCBhdHRyczogQ29udjNEQmFja3Byb3BGaWx0ZXJWMkF0dHJzID0ge3N0cmlkZXMsIHBhZCwgZmlsdGVyU2hhcGV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgcmV0dXJuIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICAgQ29udjNEQmFja3Byb3BGaWx0ZXJWMiwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yNUQ7XG59XG5cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcEZpbHRlciA9IG9wKHtjb252M0RCYWNrcHJvcEZpbHRlcl99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Conv3D } from '../kernel_names';\nimport { conv3DBackpropFilter } from '../ops/conv3d_backprop_filter';\nimport { conv3DBackpropInput } from '../ops/conv3d_backprop_input';\nimport { tupleValuesAreOne } from '../ops/conv_util';\nimport * as util from '../util';\nexport const conv3DGradConfig = {\n    kernelName: Conv3D,\n    inputsToSave: ['x', 'filter'],\n    gradFunc: (dy, saved, attrs) => {\n        const { dilations, strides, pad } = attrs;\n        util.assert(tupleValuesAreOne(dilations), () => 'Error in gradient of conv3D: dilation rates greater than 1 are ' +\n            `not yet supported in gradients. Got dilations '${dilations}'`);\n        const [x5D, $filter] = saved;\n        return {\n            x: () => conv3DBackpropInput(x5D.shape, dy, $filter, strides, pad),\n            filter: () => conv3DBackpropFilter(x5D, dy, $filter.shape, strides, pad)\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Db252M0RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWU7SUFDMUMsVUFBVSxFQUFFLE1BQU07SUFDbEIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztJQUM3QixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLEVBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUMsR0FBRyxLQUEwQixDQUFDO1FBQzdELElBQUksQ0FBQyxNQUFNLENBQ1AsaUJBQWlCLENBQUMsU0FBUyxDQUFDLEVBQzVCLEdBQUcsRUFBRSxDQUNELGlFQUFpRTtZQUNqRSxrREFBa0QsU0FBUyxHQUFHLENBQUMsQ0FBQztRQUV4RSxNQUFNLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUU3QixPQUFPO1lBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUN2QixHQUFnQixDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsT0FBbUIsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDO1lBQ25FLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxvQkFBb0IsQ0FDOUIsR0FBZSxFQUFFLEVBQUUsRUFBRyxPQUFvQixDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDO1NBQ3BFLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7Q29udjNELCBDb252M0RBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjb252M0RCYWNrcHJvcEZpbHRlcn0gZnJvbSAnLi4vb3BzL2NvbnYzZF9iYWNrcHJvcF9maWx0ZXInO1xuaW1wb3J0IHtjb252M0RCYWNrcHJvcElucHV0fSBmcm9tICcuLi9vcHMvY29udjNkX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7dHVwbGVWYWx1ZXNBcmVPbmV9IGZyb20gJy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjVEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IGNvbnYzREdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYzRCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnLCAnZmlsdGVyJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcjVELCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7ZGlsYXRpb25zLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnMgYXMge30gYXMgQ29udjNEQXR0cnM7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHR1cGxlVmFsdWVzQXJlT25lKGRpbGF0aW9ucyksXG4gICAgICAgICgpID0+XG4gICAgICAgICAgICAnRXJyb3IgaW4gZ3JhZGllbnQgb2YgY29udjNEOiBkaWxhdGlvbiByYXRlcyBncmVhdGVyIHRoYW4gMSBhcmUgJyArXG4gICAgICAgICAgICBgbm90IHlldCBzdXBwb3J0ZWQgaW4gZ3JhZGllbnRzLiBHb3QgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG5cbiAgICBjb25zdCBbeDVELCAkZmlsdGVyXSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+IGNvbnYzREJhY2twcm9wSW5wdXQoXG4gICAgICAgICAgKHg1RCBhcyBUZW5zb3I1RCkuc2hhcGUsIGR5LCAkZmlsdGVyIGFzIFRlbnNvcjVELCBzdHJpZGVzLCBwYWQpLFxuICAgICAgZmlsdGVyOiAoKSA9PiBjb252M0RCYWNrcHJvcEZpbHRlcihcbiAgICAgICAgICB4NUQgYXMgVGVuc29yNUQsIGR5LCAoJGZpbHRlciBhcyBUZW5zb3I1RCkuc2hhcGUsIHN0cmlkZXMsIHBhZClcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cos } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { sin } from '../ops/sin';\nexport const cosGradConfig = {\n    kernelName: Cos,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(neg(sin(cast(x, 'float32'))), dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Db3NfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQzFELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Nvc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtuZWd9IGZyb20gJy4uL29wcy9uZWcnO1xuaW1wb3J0IHtzaW59IGZyb20gJy4uL29wcy9zaW4nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBjb3NHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb3MsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChuZWcoc2luKGNhc3QoeCwgJ2Zsb2F0MzInKSkpLCBkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cosh } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { sinh } from '../ops/sinh';\nexport const coshGradConfig = {\n    kernelName: Cosh,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(sinh(cast(x, 'float32')), dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zaF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvQ29zaF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUdqQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb3NofSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3Npbmh9IGZyb20gJy4uL29wcy9zaW5oJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgY29zaEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvc2gsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChzaW5oKGNhc3QoeCwgJ2Zsb2F0MzInKSksIGR5KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cumsum } from '../kernel_names';\nimport { getAxesPermutation } from '../ops/axis_util';\nimport { cumsum } from '../ops/cumsum';\nimport { transpose } from '../ops/transpose';\nexport const cumsumGradConfig = {\n    kernelName: Cumsum,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { axis, exclusive, reverse } = attrs;\n        return {\n            x: () => {\n                const permutation = getAxesPermutation([axis], x.rank);\n                let out = cumsum(dy, axis, exclusive, !reverse);\n                if (permutation != null) {\n                    out = transpose(out, permutation);\n                }\n                return out;\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3Vtc3VtX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9DdW1zdW1fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDcEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFHM0MsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWU7SUFDMUMsVUFBVSxFQUFFLE1BQU07SUFDbEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFDLEdBQWdCLEtBQTBCLENBQUM7UUFFM0UsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUU7Z0JBQ04sTUFBTSxXQUFXLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBRXZELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dCQUVoRCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7b0JBQ3ZCLEdBQUcsR0FBRyxTQUFTLENBQUMsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO2lCQUNuQztnQkFFRCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q3Vtc3VtLCBDdW1zdW1BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtnZXRBeGVzUGVybXV0YXRpb259IGZyb20gJy4uL29wcy9heGlzX3V0aWwnO1xuaW1wb3J0IHtjdW1zdW19IGZyb20gJy4uL29wcy9jdW1zdW0nO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4uL29wcy90cmFuc3Bvc2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBjdW1zdW1HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgY29uc3Qge2F4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZX06IEN1bXN1bUF0dHJzID0gYXR0cnMgYXMge30gYXMgQ3Vtc3VtQXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4ge1xuICAgICAgICBjb25zdCBwZXJtdXRhdGlvbiA9IGdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHgucmFuayk7XG5cbiAgICAgICAgbGV0IG91dCA9IGN1bXN1bShkeSwgYXhpcywgZXhjbHVzaXZlLCAhcmV2ZXJzZSk7XG5cbiAgICAgICAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgICBvdXQgPSB0cmFuc3Bvc2Uob3V0LCBwZXJtdXRhdGlvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0O1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DepthwiseConv2dNative } from '../kernel_names';\nimport * as conv_util from '../ops/conv_util';\nimport { depthwiseConv2dNativeBackpropFilter } from '../ops/depthwise_conv2d_native_backprop_filter';\nimport { depthwiseConv2dNativeBackpropInput } from '../ops/depthwise_conv2d_native_backprop_input';\nimport * as util from '../util';\nexport const depthwiseConv2dNativeGradConfig = {\n    kernelName: DepthwiseConv2dNative,\n    inputsToSave: ['x', 'filter'],\n    gradFunc: (dy, saved, attrs) => {\n        const { dilations, strides, pad, dimRoundingMode } = attrs;\n        const $dilations = dilations == null ? [1, 1] : dilations;\n        util.assert(conv_util.tupleValuesAreOne($dilations), () => 'Error in gradient of depthwiseConv2dNative: dilation rates ' +\n            `greater than 1 are not yet supported. Got dilations ` +\n            `'${$dilations}'`);\n        const [x, filter] = saved;\n        util.assert(x.rank === 4, () => `Error in gradient of depthwiseConv2dNative: input must be ` +\n            `rank 4, but got rank ${x.rank}.`);\n        util.assert(filter.rank === 4, () => `Error in gradient of depthwiseConv2dNative: filter must be ` +\n            `rank 4, but got rank ${filter.rank}.`);\n        util.assert(x.shape[3] === filter.shape[2], () => `Error in gradient of depthwiseConv2d: number of input ` +\n            `channels (${x.shape[3]}) must match the inChannels dimension ` +\n            `in filter ${filter.shape[2]}.`);\n        util.assert(conv_util.eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in gradient of depthwiseConv2d: Either strides or ' +\n            `dilations must be  1. Got strides ${strides} and dilations ` +\n            `'${$dilations}'.`);\n        conv_util.checkPadOnDimRoundingMode('depthwiseConv2d', pad, dimRoundingMode);\n        return {\n            x: () => depthwiseConv2dNativeBackpropInput(x.shape, dy, filter, strides, pad, $dilations, dimRoundingMode),\n            filter: () => depthwiseConv2dNativeBackpropFilter(x, dy, filter.shape, strides, pad, $dilations, dimRoundingMode),\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9EZXB0aHdpc2VDb252MmROYXRpdmVfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMscUJBQXFCLEVBQTZCLE1BQU0saUJBQWlCLENBQUM7QUFFbEYsT0FBTyxLQUFLLFNBQVMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsbUNBQW1DLEVBQUMsTUFBTSxnREFBZ0QsQ0FBQztBQUNuRyxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSwrQ0FBK0MsQ0FBQztBQUVqRyxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBZTtJQUN6RCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7SUFDN0IsUUFBUSxFQUFFLENBQUMsRUFBWSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDL0QsTUFBTSxFQUFDLFNBQVMsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxHQUM1QyxLQUF5QyxDQUFDO1FBQzlDLE1BQU0sVUFBVSxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBbUIsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBRTVFLElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUN2QyxHQUFHLEVBQUUsQ0FBQyw2REFBNkQ7WUFDL0Qsc0RBQXNEO1lBQ3RELElBQUksVUFBVSxHQUFHLENBQUMsQ0FBQztRQUUzQixNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFDWixHQUFHLEVBQUUsQ0FBQyw0REFBNEQ7WUFDOUQsd0JBQXdCLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtZQUMvRCx3QkFBd0IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7UUFDaEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQzlCLEdBQUcsRUFBRSxDQUFDLHdEQUF3RDtZQUMxRCxhQUFhLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLHdDQUF3QztZQUMvRCxhQUFhLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXpDLElBQUksQ0FBQyxNQUFNLENBQ1AsU0FBUyxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsRUFDN0QsR0FBRyxFQUFFLENBQUMsMERBQTBEO1lBQzVELHFDQUFxQyxPQUFPLGlCQUFpQjtZQUM3RCxJQUFJLFVBQVUsSUFBSSxDQUFDLENBQUM7UUFFNUIsU0FBUyxDQUFDLHlCQUF5QixDQUMvQixpQkFBaUIsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFFN0MsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FDdkMsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsQ0FBQztZQUNuRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsbUNBQW1DLENBQzdDLENBQUMsRUFBRSxFQUFFLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLENBQUM7U0FDcEUsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtEZXB0aHdpc2VDb252MmROYXRpdmUsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQgKiBhcyBjb252X3V0aWwgZnJvbSAnLi4vb3BzL2NvbnZfdXRpbCc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyfSBmcm9tICcuLi9vcHMvZGVwdGh3aXNlX2NvbnYyZF9uYXRpdmVfYmFja3Byb3BfZmlsdGVyJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dH0gZnJvbSAnLi4vb3BzL2RlcHRod2lzZV9jb252MmRfbmF0aXZlX2JhY2twcm9wX2lucHV0JztcbmltcG9ydCB7VGVuc29yLCBUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmUsXG4gIGlucHV0c1RvU2F2ZTogWyd4JywgJ2ZpbHRlciddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3I0RCwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3Qge2RpbGF0aW9ucywgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnM7XG4gICAgY29uc3QgJGRpbGF0aW9ucyA9IGRpbGF0aW9ucyA9PSBudWxsID8gWzEsIDFdIGFzW251bWJlcixudW1iZXJdIDogZGlsYXRpb25zO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGNvbnZfdXRpbC50dXBsZVZhbHVlc0FyZU9uZSgkZGlsYXRpb25zKSxcbiAgICAgICAgKCkgPT4gJ0Vycm9yIGluIGdyYWRpZW50IG9mIGRlcHRod2lzZUNvbnYyZE5hdGl2ZTogZGlsYXRpb24gcmF0ZXMgJyArXG4gICAgICAgICAgICBgZ3JlYXRlciB0aGFuIDEgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiBHb3QgZGlsYXRpb25zIGAgK1xuICAgICAgICAgICAgYCckeyRkaWxhdGlvbnN9J2ApO1xuXG4gICAgY29uc3QgW3gsIGZpbHRlcl0gPSBzYXZlZCBhcyBbVGVuc29yNEQsIFRlbnNvcjREXTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB4LnJhbmsgPT09IDQsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiBncmFkaWVudCBvZiBkZXB0aHdpc2VDb252MmROYXRpdmU6IGlucHV0IG11c3QgYmUgYCArXG4gICAgICAgICAgICBgcmFuayA0LCBidXQgZ290IHJhbmsgJHt4LnJhbmt9LmApO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBmaWx0ZXIucmFuayA9PT0gNCxcbiAgICAgICAgKCkgPT4gYEVycm9yIGluIGdyYWRpZW50IG9mIGRlcHRod2lzZUNvbnYyZE5hdGl2ZTogZmlsdGVyIG11c3QgYmUgYCArXG4gICAgICAgICAgICBgcmFuayA0LCBidXQgZ290IHJhbmsgJHtmaWx0ZXIucmFua30uYCk7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHguc2hhcGVbM10gPT09IGZpbHRlci5zaGFwZVsyXSxcbiAgICAgICAgKCkgPT4gYEVycm9yIGluIGdyYWRpZW50IG9mIGRlcHRod2lzZUNvbnYyZDogbnVtYmVyIG9mIGlucHV0IGAgK1xuICAgICAgICAgICAgYGNoYW5uZWxzICgke3guc2hhcGVbM119KSBtdXN0IG1hdGNoIHRoZSBpbkNoYW5uZWxzIGRpbWVuc2lvbiBgICtcbiAgICAgICAgICAgIGBpbiBmaWx0ZXIgJHtmaWx0ZXIuc2hhcGVbMl19LmApO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGNvbnZfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgJGRpbGF0aW9ucyksXG4gICAgICAgICgpID0+ICdFcnJvciBpbiBncmFkaWVudCBvZiBkZXB0aHdpc2VDb252MmQ6IEVpdGhlciBzdHJpZGVzIG9yICcgK1xuICAgICAgICAgICAgYGRpbGF0aW9ucyBtdXN0IGJlICAxLiBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgYCArXG4gICAgICAgICAgICBgJyR7JGRpbGF0aW9uc30nLmApO1xuXG4gICAgY29udl91dGlsLmNoZWNrUGFkT25EaW1Sb3VuZGluZ01vZGUoXG4gICAgICAgICdkZXB0aHdpc2VDb252MmQnLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dChcbiAgICAgICAgICB4LnNoYXBlLCBkeSwgZmlsdGVyLCBzdHJpZGVzLCBwYWQsICRkaWxhdGlvbnMsIGRpbVJvdW5kaW5nTW9kZSksXG4gICAgICBmaWx0ZXI6ICgpID0+IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyKFxuICAgICAgICAgIHgsIGR5LCBmaWx0ZXIuc2hhcGUsIHN0cmlkZXMsIHBhZCwgJGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlKSxcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Dilation2D, Dilation2DBackpropFilter, Dilation2DBackpropInput } from '../kernel_names';\nexport const dilation2dGradConfig = {\n    kernelName: Dilation2D,\n    inputsToSave: ['x', 'filter'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x, filter] = saved;\n        const inputInputs = { x, filter, dy };\n        const filterInputs = { x, filter, dy };\n        return {\n            x: () => ENGINE.runKernel(Dilation2DBackpropInput, inputInputs, attrs),\n            filter: () => ENGINE.runKernel(Dilation2DBackpropFilter, filterInputs, attrs)\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yRF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvRGlsYXRpb24yRF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDakMsT0FBTyxFQUFDLFVBQVUsRUFBRSx3QkFBd0IsRUFBa0MsdUJBQXVCLEVBQWdDLE1BQU0saUJBQWlCLENBQUM7QUFNN0osTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWU7SUFDOUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQztJQUM3QixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFFbEQsTUFBTSxXQUFXLEdBQWtDLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUNuRSxNQUFNLFlBQVksR0FBbUMsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxDQUFDO1FBRXJFLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FDckIsdUJBQXVCLEVBQUUsV0FBbUMsRUFBRSxLQUFLLENBQUM7WUFDeEUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQzFCLHdCQUF3QixFQUFFLFlBQW9DLEVBQUUsS0FBSyxDQUFDO1NBQzNFLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtEaWxhdGlvbjJELCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsIERpbGF0aW9uMkRCYWNrcHJvcEZpbHRlcklucHV0cywgRGlsYXRpb24yREJhY2twcm9wSW5wdXQsIERpbGF0aW9uMkRCYWNrcHJvcElucHV0SW5wdXRzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMmRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEaWxhdGlvbjJELFxuICBpbnB1dHNUb1NhdmU6IFsneCcsICdmaWx0ZXInXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4LCBmaWx0ZXJdID0gc2F2ZWQgYXMgW1RlbnNvcjRELCBUZW5zb3IzRF07XG5cbiAgICBjb25zdCBpbnB1dElucHV0czogRGlsYXRpb24yREJhY2twcm9wSW5wdXRJbnB1dHMgPSB7eCwgZmlsdGVyLCBkeX07XG4gICAgY29uc3QgZmlsdGVySW5wdXRzOiBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXJJbnB1dHMgPSB7eCwgZmlsdGVyLCBkeX07XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICBEaWxhdGlvbjJEQmFja3Byb3BJbnB1dCwgaW5wdXRJbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzKSxcbiAgICAgIGZpbHRlcjogKCkgPT4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsIGZpbHRlcklucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { Elu, EluGrad } from '../kernel_names';\nexport const eluGradConfig = {\n    kernelName: Elu,\n    outputsToSave: [true],\n    gradFunc: (dy, saved) => {\n        const [y] = saved;\n        const inputs = { dy, y };\n        return { x: () => ENGINE.runKernel(EluGrad, inputs) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9FbHVfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUUsT0FBTyxFQUFnQixNQUFNLGlCQUFpQixDQUFDO0FBSzVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZTtJQUN2QyxVQUFVLEVBQUUsR0FBRztJQUNmLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVsQixNQUFNLE1BQU0sR0FBa0IsRUFBQyxFQUFFLEVBQUUsQ0FBQyxFQUFDLENBQUM7UUFFdEMsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxNQUE4QixDQUFDLEVBQUMsQ0FBQztJQUM5RSxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RU5HSU5FfSBmcm9tICcuLi9lbmdpbmUnO1xuaW1wb3J0IHtFbHUsIEVsdUdyYWQsIEVsdUdyYWRJbnB1dHN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBlbHVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHUsXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeV0gPSBzYXZlZDtcblxuICAgIGNvbnN0IGlucHV0czogRWx1R3JhZElucHV0cyA9IHtkeSwgeX07XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IEVOR0lORS5ydW5LZXJuZWwoRWx1R3JhZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Erf } from '../kernel_names';\nimport { exp } from '../ops/exp';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { square } from '../ops/square';\nexport const erfGradConfig = {\n    kernelName: Erf,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        const a = mul(exp(neg(square(x))), 2 / Math.sqrt(Math.PI));\n        return { x: () => mul(dy, a) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJmX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9FcmZfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMzRCxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUMvQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFcmZ9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2V4cH0gZnJvbSAnLi4vb3BzL2V4cCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge25lZ30gZnJvbSAnLi4vb3BzL25lZyc7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGVyZkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEVyZixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCBhID0gbXVsKGV4cChuZWcoc3F1YXJlKHgpKSksIDIgLyBNYXRoLnNxcnQoTWF0aC5QSSkpO1xuICAgIHJldHVybiB7eDogKCkgPT4gbXVsKGR5LCBhKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Exp } from '../kernel_names';\nimport { mul } from '../ops/mul';\nexport const expGradConfig = {\n    kernelName: Exp,\n    outputsToSave: [true],\n    gradFunc: (dy, saved) => {\n        const [y] = saved;\n        return { x: () => mul(dy, y) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9FeHBfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDL0IsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RXhwfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBleHBHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHAsXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeV0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChkeSwgeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ExpandDims } from '../kernel_names';\nimport { reshape } from '../ops/reshape';\nexport const expandDimsGradConfig = {\n    kernelName: ExpandDims,\n    inputsToSave: ['input'],\n    gradFunc: (dy, saved) => {\n        const [input] = saved;\n        return { input: () => reshape(dy, input.shape) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwYW5kRGltc19ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvRXhwYW5kRGltc19ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWU7SUFDOUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsWUFBWSxFQUFFLENBQUMsT0FBTyxDQUFDO0lBQ3ZCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUNqRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFeHBhbmREaW1zfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGV4cGFuZERpbXNHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHBhbmREaW1zLFxuICBpbnB1dHNUb1NhdmU6IFsnaW5wdXQnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbaW5wdXRdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHtpbnB1dDogKCkgPT4gcmVzaGFwZShkeSwgaW5wdXQuc2hhcGUpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Expm1 } from '../kernel_names';\nimport { exp } from '../ops/exp';\nimport { mul } from '../ops/mul';\nexport const expm1GradConfig = {\n    kernelName: Expm1,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(dy, exp(x)) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwbTFfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0V4cG0xX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ3BDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0V4cG0xfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtleHB9IGZyb20gJy4uL29wcy9leHAnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBleHBtMUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEV4cG0xLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gbXVsKGR5LCBleHAoeCkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Floor } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const floorGradConfig = {\n    kernelName: Floor,\n    gradFunc: (dy) => {\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3JfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Zsb29yX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vcn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGZsb29yR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRmxvb3IsXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcikgPT4ge1xuICAgIHJldHVybiB7eDogKCkgPT4gemVyb3NMaWtlKGR5KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FloorDiv } from '../kernel_names';\nimport { assertAndGetBroadcastShape, getReductionAxes } from '../ops/broadcast_util';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { square } from '../ops/square';\nimport { sum } from '../ops/sum';\nexport const floorDivGradConfig = {\n    kernelName: FloorDiv,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n        const derA = () => {\n            const res = div(dy, cast(b, 'float32'));\n            const reduceAxes = getReductionAxes(a.shape, outShape);\n            if (reduceAxes.length > 0) {\n                return reshape(sum(res, reduceAxes), a.shape);\n            }\n            return res;\n        };\n        const derB = () => {\n            let res = mul(dy, cast(a, 'float32'));\n            const reduceAxes = getReductionAxes(b.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = reshape(sum(res, reduceAxes), b.shape);\n            }\n            const tmp = square(b);\n            return neg(div(res, cast(tmp, 'float32')));\n        };\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3JEaXZfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Zsb29yRGl2X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZTtJQUM1QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM5QztZQUNELE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QixPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdDLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vckRpdn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUsIGdldFJlZHVjdGlvbkF4ZXN9IGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBmbG9vckRpdkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZsb29yRGl2LFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhLnNoYXBlLCBiLnNoYXBlKTtcblxuICAgIGNvbnN0IGRlckEgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBkaXYoZHksIGNhc3QoYiwgJ2Zsb2F0MzInKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gZ2V0UmVkdWN0aW9uQXhlcyhhLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHN1bShyZXMsIHJlZHVjZUF4ZXMpLCBhLnNoYXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4ge1xuICAgICAgbGV0IHJlcyA9IG11bChkeSwgY2FzdChhLCAnZmxvYXQzMicpKTtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBnZXRSZWR1Y3Rpb25BeGVzKGIuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmVzID0gcmVzaGFwZShzdW0ocmVzLCByZWR1Y2VBeGVzKSwgYi5zaGFwZSk7XG4gICAgICB9XG4gICAgICBjb25zdCB0bXAgPSBzcXVhcmUoYik7XG4gICAgICByZXR1cm4gbmVnKGRpdihyZXMsIGNhc3QodG1wLCAnZmxvYXQzMicpKSk7XG4gICAgfTtcbiAgICByZXR1cm4ge2E6IGRlckEsIGI6IGRlckJ9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FusedBatchNorm } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { getReductionAxes } from '../ops/broadcast_util';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\nimport { rsqrt } from '../ops/rsqrt';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nimport { sum } from '../ops/sum';\nimport { tile } from '../ops/tile';\nexport const fusedBatchNormGradConfig = {\n    kernelName: FusedBatchNorm,\n    inputsToSave: ['x', 'mean', 'variance', 'scale'],\n    gradFunc: (dy, saved, attrs) => {\n        const { varianceEpsilon } = attrs;\n        const [x, mean, variance, scale] = saved;\n        const scaleValue = scale == null ? scalar(1) : scale;\n        const reductionAxes = getReductionAxes(mean.shape, x.shape);\n        const tileShape = [];\n        if (mean.rank === 1) {\n            for (let i = 0; i < x.shape.length - 1; ++i) {\n                tileShape.push(x.shape[i]);\n            }\n            tileShape.push(1);\n        }\n        const xMinusMean = sub(x, mean);\n        const dyTimesScaleValue = mul(dy, scaleValue);\n        const oneOverSqrtVariance = rsqrt(add(variance, scalar(varianceEpsilon)));\n        const minusHalfRCube = mul(mul(mul(oneOverSqrtVariance, oneOverSqrtVariance), oneOverSqrtVariance), scalar(-0.5));\n        const derX = () => {\n            if (mean.rank === 1) {\n                return reshape(mul(mul(dy, tile(reshape(oneOverSqrtVariance, [1, 1, 1, mean.shape[0]]), tileShape)), scaleValue), x.shape);\n            }\n            else {\n                return reshape(mul(mul(dy, oneOverSqrtVariance), scaleValue), x.shape);\n            }\n        };\n        const derMean = () => {\n            let meanDer = mul(mul(oneOverSqrtVariance, scalar(-1)), dyTimesScaleValue);\n            if (mean.rank === 1) {\n                meanDer = sum(meanDer, reductionAxes);\n            }\n            return reshape(meanDer, mean.shape);\n        };\n        const derVariance = () => {\n            let varianceDer = mul(mul(minusHalfRCube, xMinusMean), dyTimesScaleValue);\n            if (mean.rank === 1) {\n                varianceDer = sum(varianceDer, reductionAxes);\n            }\n            return reshape(varianceDer, mean.shape);\n        };\n        const derScale = () => {\n            const xMinusMean2TimesRsqrt = mul(xMinusMean, oneOverSqrtVariance);\n            let scaleDer = mul(dy, xMinusMean2TimesRsqrt);\n            if (mean.rank === 1) {\n                scaleDer = sum(scaleDer, reductionAxes);\n            }\n            return reshape(scaleDer, mean.shape);\n        };\n        const derOffset = () => {\n            let offsetDer = dy;\n            if (mean.rank === 1) {\n                offsetDer = sum(offsetDer, reductionAxes);\n            }\n            return reshape(offsetDer, mean.shape);\n        };\n        return {\n            x: derX,\n            mean: derMean,\n            variance: derVariance,\n            scale: derScale,\n            offset: derOffset\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWRCYXRjaE5vcm1fZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0Z1c2VkQmF0Y2hOb3JtX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLGNBQWMsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRSxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUlqQyxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBZTtJQUNsRCxVQUFVLEVBQUUsY0FBYztJQUMxQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLENBQUM7SUFDaEQsUUFBUSxFQUFFLENBQ04sRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDdEQsTUFBTSxFQUFDLGVBQWUsRUFBQyxHQUFHLEtBQWtDLENBQUM7UUFDN0QsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUV6QyxNQUFN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QUM7UUFDekQsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFO1lBQ3BCLE1BQU0scUJBQXFCLEdBQUcsR0FBRyxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBRW5FLElBQUksUUFBUSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUscUJBQXFCLENBQUMsQ0FBQztZQUM5QyxJQUFJLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUNuQixRQUFRLEdBQUcsR0FBRyxDQUFDLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQzthQUN6QztZQUNELE9BQU8sT0FBTyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsS0FBb0IsQ0FBQyxDQUFDO1FBQ3RELENBQUMsQ0FBQztRQUNGLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtZQUNyQixJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7WUFDbkIsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtnQkFDbkIsU0FBUyxHQUFHLEdBQUcsQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUM7YUFDM0M7WUFDRCxPQUFPLE9BQU8sQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLEtBQW9CLENBQUMsQ0FBQztRQUN2RCxDQUFDLENBQUM7UUFFRixPQUFPO1lBQ0wsQ0FBQyxFQUFFLElBQUk7WUFDUCxJQUFJLEVBQUUsT0FBTztZQUNiLFFBQVEsRUFBRSxXQUFXO1lBQ3JCLEtBQUssRUFBRSxRQUFRO1lBQ2YsTUFBTSxFQUFFLFNBQVM7U0FDbEIsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtGdXNlZEJhdGNoTm9ybSwgRnVzZWRCYXRjaE5vcm1BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHthZGR9IGZyb20gJy4uL29wcy9hZGQnO1xuaW1wb3J0IHtnZXRSZWR1Y3Rpb25BeGVzfSBmcm9tICcuLi9vcHMvYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge3JzcXJ0fSBmcm9tICcuLi9vcHMvcnNxcnQnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4uL29wcy9zdWInO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHt0aWxlfSBmcm9tICcuLi9vcHMvdGlsZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgU2hhcGVNYXB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGZ1c2VkQmF0Y2hOb3JtR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRnVzZWRCYXRjaE5vcm0sXG4gIGlucHV0c1RvU2F2ZTogWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnLCAnc2NhbGUnXSxcbiAgZ3JhZEZ1bmM6IDxSIGV4dGVuZHMgUmFuaz4oXG4gICAgICBkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7dmFyaWFuY2VFcHNpbG9ufSA9IGF0dHJzIGFzIHt9IGFzIEZ1c2VkQmF0Y2hOb3JtQXR0cnM7XG4gICAgY29uc3QgW3gsIG1lYW4sIHZhcmlhbmNlLCBzY2FsZV0gPSBzYXZlZDtcblxuICAgIGNvbnN0IHNjYWxlVmFsdWUgPSBzY2FsZSA9PSBudWxsID8gc2NhbGFyKDEpIDogc2NhbGU7XG4gICAgY29uc3QgcmVkdWN0aW9uQXhlcyA9IGdldFJlZHVjdGlvbkF4ZXMobWVhbi5zaGFwZSwgeC5zaGFwZSk7XG4gICAgY29uc3QgdGlsZVNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICAgIGlmIChtZWFuLnJhbmsgPT09IDEpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgeC5zaGFwZS5sZW5ndGggLSAxOyArK2kpIHtcbiAgICAgICAgdGlsZVNoYXBlLnB1c2goeC5zaGFwZVtpXSk7XG4gICAgICB9XG4gICAgICB0aWxlU2hhcGUucHVzaCgxKTtcbiAgICB9XG5cbiAgICBjb25zdCB4TWludXNNZWFuID0gc3ViKHgsIG1lYW4pO1xuICAgIGNvbnN0IGR5VGltZXNTY2FsZVZhbHVlID0gbXVsKGR5LCBzY2FsZVZhbHVlKTtcbiAgICBjb25zdCBvbmVPdmVyU3FydFZhcmlhbmNlID0gcnNxcnQoYWRkKHZhcmlhbmNlLCBzY2FsYXIodmFyaWFuY2VFcHNpbG9uKSkpO1xuICAgIGNvbnN0IG1pbnVzSGFsZlJDdWJlID0gbXVsKFxuICAgICAgICBtdWwobXVsKG9uZU92ZXJTcXJ0VmFyaWFuY2UsIG9uZU92ZXJTcXJ0VmFyaWFuY2UpLCBvbmVPdmVyU3FydFZhcmlhbmNlKSxcbiAgICAgICAgc2NhbGFyKC0wLjUpKTtcblxuICAgIGNvbnN0IGRlclggPSAoKSA9PiB7XG4gICAgICBpZiAobWVhbi5yYW5rID09PSAxKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKFxuICAgICAgICAgICAgbXVsKG11bChkeSxcbiAgICAgICAgICAgICAgICAgICAgdGlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc2hhcGUob25lT3ZlclNxcnRWYXJpYW5jZSwgWzEsIDEsIDEsIG1lYW4uc2hhcGVbMF1dKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVTaGFwZSkpLFxuICAgICAgICAgICAgICAgIHNjYWxlVmFsdWUpLFxuICAgICAgICAgICAgeC5zaGFwZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShtdWwobXVsKGR5LCBvbmVPdmVyU3FydFZhcmlhbmNlKSwgc2NhbGVWYWx1ZSksIHguc2hhcGUpO1xuICAgICAgfVxuICAgIH07XG4gICAgY29uc3QgZGVyTWVhbiA9ICgpID0+IHtcbiAgICAgIGxldCBtZWFuRGVyID1cbiAgICAgICAgICBtdWwobXVsKG9uZU92ZXJTcXJ0VmFyaWFuY2UsIHNjYWxhcigtMSkpLCBkeVRpbWVzU2NhbGVWYWx1ZSk7XG4gICAgICBpZiAobWVhbi5yYW5rID09PSAxKSB7XG4gICAgICAgIG1lYW5EZXIgPSBzdW0obWVhbkRlciwgcmVkdWN0aW9uQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShtZWFuRGVyLCBtZWFuLnNoYXBlIGFzIFNoYXBlTWFwW1JdKTtcbiAgICB9O1xuICAgIGNvbnN0IGRlclZhcmlhbmNlID0gKCkgPT4ge1xuICAgICAgbGV0IHZhcmlhbmNlRGVyID0gbXVsKG11bChtaW51c0hhbGZSQ3ViZSwgeE1pbnVzTWVhbiksIGR5VGltZXNTY2FsZVZhbHVlKTtcblxuICAgICAgaWYgKG1lYW4ucmFuayA9PT0gMSkge1xuICAgICAgICB2YXJpYW5jZURlciA9IHN1bSh2YXJpYW5jZURlciwgcmVkdWN0aW9uQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZSh2YXJpYW5jZURlciwgbWVhbi5zaGFwZSBhcyBTaGFwZU1hcFtSXSk7XG4gICAgfTtcbiAgICBjb25zdCBkZXJTY2FsZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHhNaW51c01lYW4yVGltZXNSc3FydCA9IG11bCh4TWludXNNZWFuLCBvbmVPdmVyU3FydFZhcmlhbmNlKTtcblxuICAgICAgbGV0IHNjYWxlRGVyID0gbXVsKGR5LCB4TWludXNNZWFuMlRpbWVzUnNxcnQpO1xuICAgICAgaWYgKG1lYW4ucmFuayA9PT0gMSkge1xuICAgICAgICBzY2FsZURlciA9IHN1bShzY2FsZURlciwgcmVkdWN0aW9uQXhlcyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzaGFwZShzY2FsZURlciwgbWVhbi5zaGFwZSBhcyBTaGFwZU1hcFtSXSk7XG4gICAgfTtcbiAgICBjb25zdCBkZXJPZmZzZXQgPSAoKSA9PiB7XG4gICAgICBsZXQgb2Zmc2V0RGVyID0gZHk7XG4gICAgICBpZiAobWVhbi5yYW5rID09PSAxKSB7XG4gICAgICAgIG9mZnNldERlciA9IHN1bShvZmZzZXREZXIsIHJlZHVjdGlvbkF4ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc2hhcGUob2Zmc2V0RGVyLCBtZWFuLnNoYXBlIGFzIFNoYXBlTWFwW1JdKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6IGRlclgsXG4gICAgICBtZWFuOiBkZXJNZWFuLFxuICAgICAgdmFyaWFuY2U6IGRlclZhcmlhbmNlLFxuICAgICAgc2NhbGU6IGRlclNjYWxlLFxuICAgICAgb2Zmc2V0OiBkZXJPZmZzZXRcbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { GatherV2 } from '../kernel_names';\nimport { getUndoAxesPermutation } from '../ops/axis_util';\nimport { reshape } from '../ops/reshape';\nimport { transpose } from '../ops/transpose';\nimport { unsortedSegmentSum } from '../ops/unsorted_segment_sum';\nimport { parseAxisParam } from '../util';\nexport const gatherGradConfig = {\n    kernelName: GatherV2,\n    inputsToSave: ['x', 'indices'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x, indices] = saved;\n        const { axis } = attrs;\n        const parsedAxis = parseAxisParam(axis, x.shape)[0];\n        const derX = () => {\n            const paramsShape = x.shape;\n            const indicesSize = indices.size;\n            const outerShape = paramsShape.slice(0, parsedAxis);\n            const outerDims = outerShape.length;\n            const innerShape = paramsShape.slice(axis, paramsShape.length).slice(1);\n            const innerDims = innerShape.length;\n            const outerAxesIndices = arrayRange(0, outerDims);\n            const innerAxesIndices = arrayRange(outerDims + 1, outerDims + 1 + innerDims);\n            const valuesShape = arrayConcat([outerShape, [indicesSize], innerShape]);\n            const values = reshape(dy, valuesShape);\n            const reshapedIndices = reshape(indices, [indicesSize]);\n            const transposeDims = arrayConcat([[outerDims], outerAxesIndices, innerAxesIndices]);\n            const valuesTranspose = transpose(values, transposeDims);\n            let paramsGrad = unsortedSegmentSum(valuesTranspose, reshapedIndices, x.shape[parsedAxis]);\n            const invertTransposeDims = getUndoAxesPermutation(transposeDims);\n            paramsGrad = transpose(paramsGrad, invertTransposeDims);\n            return paramsGrad;\n        };\n        return { x: derX, indices: () => indices };\n    }\n};\nfunction arrayRange(start, stop) {\n    const result = [];\n    for (let i = start; i < stop; ++i) {\n        result.push(i);\n    }\n    return result;\n}\nfunction arrayConcat(arrays) {\n    const result = [];\n    for (let i = 0; i < arrays.length; ++i) {\n        for (let j = 0; j < arrays[i].length; ++j) {\n            result.push(arrays[i][j]);\n        }\n    }\n    return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyVjJfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0dhdGhlclYyX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBZ0IsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBRS9ELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdkMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWU7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQztJQUM5QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUMzQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBNEIsQ0FBQztRQUU1QyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwRCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxXQUFXLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztZQUM1QixNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBRWpDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQ3BELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7WUFDcEMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4RSxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDO1lBRXBDLE1BQU0sZ0JBQWdCLEdBQUcsVUFBVSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNsRCxNQUFNLGdCQUFnQixHQUNsQixVQUFVLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1lBRXpELE1BQU0sV0FBVyxHQUFHLFdBQVcsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFekUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsQ0FBQztZQUN4QyxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztZQUV4RCxNQUFNLGFBQWEsR0FDZixXQUFXLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUNuRSxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1lBQ3pELElBQUksVUFBVSxHQUFHLGtCQUFrQixDQUMvQixlQUFlLEVBQUUsZUFBMkIsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7WUFFdkUsTUFBTSxtQkFBbUIsR0FBRyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsQ0FBQztZQUNsRSxVQUFVLEdBQUcsU0FBUyxDQUFDLFVBQVUsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1lBRXhELE9BQU8sVUFBVSxDQUFDO1FBQ3BCLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPLEVBQUMsQ0FBQztJQUMzQyxDQUFDO0NBQ0YsQ0FBQztBQUVGLFNBQVMsVUFBVSxDQUFDLEtBQWEsRUFBRSxJQUFZO0lBQzdDLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ2pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEI7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsU0FBUyxXQUFXLENBQUMsTUFBa0I7SUFDckMsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3pDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R2F0aGVyVjIsIEdhdGhlclYyQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Z2V0VW5kb0F4ZXNQZXJtdXRhdGlvbn0gZnJvbSAnLi4vb3BzL2F4aXNfdXRpbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuLi9vcHMvdHJhbnNwb3NlJztcbmltcG9ydCB7dW5zb3J0ZWRTZWdtZW50U3VtfSBmcm9tICcuLi9vcHMvdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtwYXJzZUF4aXNQYXJhbX0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBnYXRoZXJHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBHYXRoZXJWMixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnLCAnaW5kaWNlcyddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4LCBpbmRpY2VzXSA9IHNhdmVkO1xuICAgIGNvbnN0IHtheGlzfSA9IGF0dHJzIGFzIHt9IGFzIEdhdGhlclYyQXR0cnM7XG5cbiAgICBjb25zdCBwYXJzZWRBeGlzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG5cbiAgICBjb25zdCBkZXJYID0gKCkgPT4ge1xuICAgICAgY29uc3QgcGFyYW1zU2hhcGUgPSB4LnNoYXBlO1xuICAgICAgY29uc3QgaW5kaWNlc1NpemUgPSBpbmRpY2VzLnNpemU7XG5cbiAgICAgIGNvbnN0IG91dGVyU2hhcGUgPSBwYXJhbXNTaGFwZS5zbGljZSgwLCBwYXJzZWRBeGlzKTtcbiAgICAgIGNvbnN0IG91dGVyRGltcyA9IG91dGVyU2hhcGUubGVuZ3RoO1xuICAgICAgY29uc3QgaW5uZXJTaGFwZSA9IHBhcmFtc1NoYXBlLnNsaWNlKGF4aXMsIHBhcmFtc1NoYXBlLmxlbmd0aCkuc2xpY2UoMSk7XG4gICAgICBjb25zdCBpbm5lckRpbXMgPSBpbm5lclNoYXBlLmxlbmd0aDtcblxuICAgICAgY29uc3Qgb3V0ZXJBeGVzSW5kaWNlcyA9IGFycmF5UmFuZ2UoMCwgb3V0ZXJEaW1zKTtcbiAgICAgIGNvbnN0IGlubmVyQXhlc0luZGljZXMgPVxuICAgICAgICAgIGFycmF5UmFuZ2Uob3V0ZXJEaW1zICsgMSwgb3V0ZXJEaW1zICsgMSArIGlubmVyRGltcyk7XG5cbiAgICAgIGNvbnN0IHZhbHVlc1NoYXBlID0gYXJyYXlDb25jYXQoW291dGVyU2hhcGUsIFtpbmRpY2VzU2l6ZV0sIGlubmVyU2hhcGVdKTtcblxuICAgICAgY29uc3QgdmFsdWVzID0gcmVzaGFwZShkeSwgdmFsdWVzU2hhcGUpO1xuICAgICAgY29uc3QgcmVzaGFwZWRJbmRpY2VzID0gcmVzaGFwZShpbmRpY2VzLCBbaW5kaWNlc1NpemVdKTtcblxuICAgICAgY29uc3QgdHJhbnNwb3NlRGltcyA9XG4gICAgICAgICAgYXJyYXlDb25jYXQoW1tvdXRlckRpbXNdLCBvdXRlckF4ZXNJbmRpY2VzLCBpbm5lckF4ZXNJbmRpY2VzXSk7XG4gICAgICBjb25zdCB2YWx1ZXNUcmFuc3Bvc2UgPSB0cmFuc3Bvc2UodmFsdWVzLCB0cmFuc3Bvc2VEaW1zKTtcbiAgICAgIGxldCBwYXJhbXNHcmFkID0gdW5zb3J0ZWRTZWdtZW50U3VtKFxuICAgICAgICAgIHZhbHVlc1RyYW5zcG9zZSwgcmVzaGFwZWRJbmRpY2VzIGFzIFRlbnNvcjFELCB4LnNoYXBlW3BhcnNlZEF4aXNdKTtcblxuICAgICAgY29uc3QgaW52ZXJ0VHJhbnNwb3NlRGltcyA9IGdldFVuZG9BeGVzUGVybXV0YXRpb24odHJhbnNwb3NlRGltcyk7XG4gICAgICBwYXJhbXNHcmFkID0gdHJhbnNwb3NlKHBhcmFtc0dyYWQsIGludmVydFRyYW5zcG9zZURpbXMpO1xuXG4gICAgICByZXR1cm4gcGFyYW1zR3JhZDtcbiAgICB9O1xuICAgIHJldHVybiB7eDogZGVyWCwgaW5kaWNlczogKCkgPT4gaW5kaWNlc307XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGFycmF5UmFuZ2Uoc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyKTogbnVtYmVyW10ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgc3RvcDsgKytpKSB7XG4gICAgcmVzdWx0LnB1c2goaSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gYXJyYXlDb25jYXQoYXJyYXlzOiBudW1iZXJbXVtdKTogbnVtYmVyW10ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheXMubGVuZ3RoOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFycmF5c1tpXS5sZW5ndGg7ICsraikge1xuICAgICAgcmVzdWx0LnB1c2goYXJyYXlzW2ldW2pdKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { GreaterEqual } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const greaterEqualGradConfig = {\n    kernelName: GreaterEqual,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        return { a: () => zerosLike(a), b: () => zerosLike(b) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlckVxdWFsX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9HcmVhdGVyRXF1YWxfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFlO0lBQ2hELFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDeEIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN4RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7R3JlYXRlckVxdWFsfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlckVxdWFsLFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHthOiAoKSA9PiB6ZXJvc0xpa2UoYSksIGI6ICgpID0+IHplcm9zTGlrZShiKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Identity } from '../kernel_names';\nimport { cast } from '../ops/cast';\nexport const identityGradConfig = {\n    kernelName: Identity,\n    gradFunc: (dy) => {\n        return { x: () => cast(dy, 'float32') };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWRlbnRpdHlfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0lkZW50aXR5X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFHakMsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWU7SUFDNUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxFQUFDLENBQUM7SUFDeEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SWRlbnRpdHl9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgaWRlbnRpdHlHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJZGVudGl0eSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBjYXN0KGR5LCAnZmxvYXQzMicpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsFinite } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const isFiniteGradConfig = {\n    kernelName: IsFinite,\n    gradFunc: (dy) => {\n        // TODO(nsthorat): Let gradients be null for cases where we want to stop\n        // backpropgation.\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNGaW5pdGVfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0lzRmluaXRlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZTtJQUM1QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtRQUN2Qix3RUFBd0U7UUFDeEUsa0JBQWtCO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNGaW5pdGV9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBpc0Zpbml0ZUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzRmluaXRlLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICAvLyBUT0RPKG5zdGhvcmF0KTogTGV0IGdyYWRpZW50cyBiZSBudWxsIGZvciBjYXNlcyB3aGVyZSB3ZSB3YW50IHRvIHN0b3BcbiAgICAvLyBiYWNrcHJvcGdhdGlvbi5cbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZShkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsInf } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const isInfGradConfig = {\n    kernelName: IsInf,\n    gradFunc: (dy) => {\n        // TODO(nsthorat): Let gradients be null for cases where we want to stop\n        // backpropgation.\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNJbmZfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0lzSW5mX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsd0VBQXdFO1FBQ3hFLGtCQUFrQjtRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNJbmZ9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBpc0luZkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzSW5mLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICAvLyBUT0RPKG5zdGhvcmF0KTogTGV0IGdyYWRpZW50cyBiZSBudWxsIGZvciBjYXNlcyB3aGVyZSB3ZSB3YW50IHRvIHN0b3BcbiAgICAvLyBiYWNrcHJvcGdhdGlvbi5cbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZShkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsNan } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const isNanGradConfig = {\n    kernelName: IsNan,\n    gradFunc: (dy) => {\n        // TODO(nsthorat): Let gradients be null for cases where we want to stop\n        // backpropgation.\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNOYW5fZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0lzTmFuX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsd0VBQXdFO1FBQ3hFLGtCQUFrQjtRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzTmFufSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgaXNOYW5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJc05hbixcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgLy8gVE9ETyhuc3Rob3JhdCk6IExldCBncmFkaWVudHMgYmUgbnVsbCBmb3IgY2FzZXMgd2hlcmUgd2Ugd2FudCB0byBzdG9wXG4gICAgLy8gYmFja3Byb3BnYXRpb24uXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LeakyRelu } from '../kernel_names';\nimport { greater } from '../ops/greater';\nimport { mul } from '../ops/mul';\nimport { where } from '../ops/where';\nexport const leakyReluGradConfig = {\n    kernelName: LeakyRelu,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { alpha } = attrs;\n        const mask = greater(x, 0);\n        // Returns `gradients * (features > 0) + alpha * gradients * (features <=\n        // 0)`.\n        return { x: () => where(mask, dy, mul(dy, alpha)) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVha3lSZWx1X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9MZWFreVJlbHVfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWU7SUFDN0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEtBQTZCLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUUzQix5RUFBeUU7UUFDekUsT0FBTztRQUNQLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0xlYWt5UmVsdSwgTGVha3lSZWx1QXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Z3JlYXRlcn0gZnJvbSAnLi4vb3BzL2dyZWF0ZXInO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHt3aGVyZX0gZnJvbSAnLi4vb3BzL3doZXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgbGVha3lSZWx1R3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTGVha3lSZWx1LFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIGNvbnN0IHthbHBoYX0gPSBhdHRycyBhcyB7fSBhcyBMZWFreVJlbHVBdHRycztcbiAgICBjb25zdCBtYXNrID0gZ3JlYXRlcih4LCAwKTtcblxuICAgIC8vIFJldHVybnMgYGdyYWRpZW50cyAqIChmZWF0dXJlcyA+IDApICsgYWxwaGEgKiBncmFkaWVudHMgKiAoZmVhdHVyZXMgPD1cbiAgICAvLyAwKWAuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB3aGVyZShtYXNrLCBkeSwgbXVsKGR5LCBhbHBoYSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log1p } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { div } from '../ops/div';\nexport const log1pGradConfig = {\n    kernelName: Log1p,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => div(dy, add(x, 1)) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nMXBfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL0xvZzFwX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtMb2cxcH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7YWRkfSBmcm9tICcuLi9vcHMvYWRkJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgbG9nMXBHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2cxcCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IGRpdihkeSwgYWRkKHgsIDEpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nexport const logGradConfig = {\n    kernelName: Log,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => div(dy, cast(x, 'float32')) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Mb2dfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZTtJQUN2QyxVQUFVLEVBQUUsR0FBRztJQUNmLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TG9nfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGxvZ0dyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZyxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IGRpdihkeSwgY2FzdCh4LCAnZmxvYXQzMicpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogSoftmax } from '../kernel_names';\nimport { exp } from '../ops/exp';\nimport { mul } from '../ops/mul';\nimport { sub } from '../ops/sub';\nimport { sum } from '../ops/sum';\nexport const logSoftmaxGradConfig = {\n    kernelName: LogSoftmax,\n    inputsToSave: [],\n    outputsToSave: [true],\n    gradFunc: (dy, saved, attrs) => {\n        const [value] = saved;\n        const { axis } = attrs;\n        return {\n            logits: () => {\n                const keepDims = true;\n                const softmax = exp(value);\n                return sub(dy, mul(sum(dy, axis, keepDims), softmax));\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nU29mdG1heF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTG9nU29mdG1heF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQWtCLE1BQU0saUJBQWlCLENBQUM7QUFFNUQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBZTtJQUM5QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixZQUFZLEVBQUUsRUFBRTtJQUNoQixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN0QixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBOEIsQ0FBQztRQUM5QyxPQUFPO1lBQ0wsTUFBTSxFQUFFLEdBQUcsRUFBRTtnQkFDWCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7Z0JBQ3RCLE1BQU0sT0FBTyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ3hELENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TG9nU29mdG1heCwgTG9nU29mdG1heEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2V4cH0gZnJvbSAnLi4vb3BzL2V4cCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi4vb3BzL3N1bSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IGxvZ1NvZnRtYXhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dTb2Z0bWF4LFxuICBpbnB1dHNUb1NhdmU6IFtdLFxuICBvdXRwdXRzVG9TYXZlOiBbdHJ1ZV0sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3ZhbHVlXSA9IHNhdmVkO1xuICAgIGNvbnN0IHtheGlzfSA9IGF0dHJzIGFzIHt9IGFzIExvZ1NvZnRtYXhBdHRycztcbiAgICByZXR1cm4ge1xuICAgICAgbG9naXRzOiAoKSA9PiB7XG4gICAgICAgIGNvbnN0IGtlZXBEaW1zID0gdHJ1ZTtcbiAgICAgICAgY29uc3Qgc29mdG1heCA9IGV4cCh2YWx1ZSk7XG4gICAgICAgIHJldHVybiBzdWIoZHksIG11bChzdW0oZHksIGF4aXMsIGtlZXBEaW1zKSwgc29mdG1heCkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { LRNGrad } from '../kernel_names';\nimport { op } from './operation';\nfunction localResponseNormalizationBackprop_(x, y, dy, depthRadius = 5, bias = 1, alpha = 1, beta = 0.5) {\n    const inputs = { x, y, dy };\n    const attrs = { depthRadius, bias, alpha, beta };\n    return ENGINE.runKernel(LRNGrad, inputs, attrs);\n}\nexport const localResponseNormalizationBackprop = op({ localResponseNormalizationBackprop_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbl9iYWNrcHJvcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb25fYmFja3Byb3AudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUE4QixNQUFNLGlCQUFpQixDQUFDO0FBS3JFLE9BQU8sRUFBQyxFQUFFLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFL0IsU0FBUyxtQ0FBbUMsQ0FDeEMsQ0FBSSxFQUFFLENBQUksRUFBRSxFQUFLLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDLEVBQUUsSUFBSSxHQUFHLEdBQUc7SUFDckUsTUFBTSxNQUFNLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsQ0FBQztJQUV6QyxNQUFNLEtBQUssR0FBaUIsRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUU3RCxPQUFPLE1BQU0sQ0FBQyxTQUFTLENBQ25CLE9BQU8sRUFBRSxNQUE4QixFQUFFLEtBQTJCLENBQUMsQ0FBQztBQUM1RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0NBQWtDLEdBQzNDLEVBQUUsQ0FBQyxFQUFDLG1DQUFtQyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge0xSTkdyYWQsIExSTkdyYWRBdHRycywgTFJOR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5cbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuZnVuY3Rpb24gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25CYWNrcHJvcF88VCBleHRlbmRzIFRlbnNvcjREPihcbiAgICB4OiBULCB5OiBULCBkeTogVCwgZGVwdGhSYWRpdXMgPSA1LCBiaWFzID0gMSwgYWxwaGEgPSAxLCBiZXRhID0gMC41KTogVCB7XG4gIGNvbnN0IGlucHV0czogTFJOR3JhZElucHV0cyA9IHt4LCB5LCBkeX07XG5cbiAgY29uc3QgYXR0cnM6IExSTkdyYWRBdHRycyA9IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9O1xuXG4gIHJldHVybiBFTkdJTkUucnVuS2VybmVsKFxuICAgICAgTFJOR3JhZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLCBhdHRycyBhcyB7fSBhcyBOYW1lZEF0dHJNYXApO1xufVxuXG5leHBvcnQgY29uc3QgbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25CYWNrcHJvcCA9XG4gICAgb3Aoe2xvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uQmFja3Byb3BffSk7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LRN } from '../kernel_names';\nimport { localResponseNormalizationBackprop } from '../ops/local_response_normalization_backprop';\nexport const lrnGradConfig = {\n    kernelName: LRN,\n    inputsToSave: ['x'],\n    outputsToSave: [true],\n    gradFunc: (dy, saved, attrs) => {\n        const [x, y] = saved;\n        const { depthRadius, bias, alpha, beta } = attrs;\n        return {\n            x: () => localResponseNormalizationBackprop(x, y, dy, depthRadius, bias, alpha, beta)\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9MUk5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsT0FBTyxFQUFDLGtDQUFrQyxFQUFDLE1BQU0sOENBQThDLENBQUM7QUFHaEcsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFDN0MsTUFBTSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxHQUFHLEtBQXVCLENBQUM7UUFFakUsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxrQ0FBa0MsQ0FDdkMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDO1NBQzlDLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7TFJOLCBMUk5BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbkJhY2twcm9wfSBmcm9tICcuLi9vcHMvbG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbl9iYWNrcHJvcCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBscm5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMUk4sXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHNhdmVkIGFzIFtUZW5zb3I0RCwgVGVuc29yNERdO1xuICAgIGNvbnN0IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9ID0gYXR0cnMgYXMge30gYXMgTFJOQXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gbG9jYWxSZXNwb25zZU5vcm1hbGl6YXRpb25CYWNrcHJvcChcbiAgICAgICAgICB4LCB5LCBkeSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as axis_util from '../ops/axis_util';\nimport { cast } from '../ops/cast';\nimport { equal } from '../ops/equal';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\n/**\n * Gradient helper function for the min and max operations.\n */\nexport function gradForMinAndMax(dy, y, xOrig, origAxes) {\n    if (y.rank < xOrig.rank) {\n        y = reshape(y, axis_util.expandShapeToKeepDim(y.shape, origAxes));\n    }\n    if (dy.rank < xOrig.rank) {\n        dy = reshape(dy, axis_util.expandShapeToKeepDim(dy.shape, origAxes));\n    }\n    return {\n        x: () => {\n            const dx = mul(dy, cast(equal(xOrig, y), dy.dtype));\n            return dx;\n        }\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluX21heF9ncmFkX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9taW5fbWF4X2dyYWRfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEtBQUssU0FBUyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUd2Qzs7R0FFRztBQUNILE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsRUFBSyxFQUFFLENBQUksRUFBRSxLQUFhLEVBQUUsUUFBa0I7SUFDaEQsSUFBSSxDQUFDLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUU7UUFDdkIsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLG9CQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQU0sQ0FBQztLQUN4RTtJQUNELElBQUksRUFBRSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsSUFBSSxFQUFFO1FBQ3hCLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFNLENBQUM7S0FDM0U7SUFDRCxPQUFPO1FBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRTtZQUNOLE1BQU0sRUFBRSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDcEQsT0FBTyxFQUFFLENBQUM7UUFDWixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIGF4aXNfdXRpbCBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtlcXVhbH0gZnJvbSAnLi4vb3BzL2VxdWFsJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbi8qKlxuICogR3JhZGllbnQgaGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgbWluIGFuZCBtYXggb3BlcmF0aW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdyYWRGb3JNaW5BbmRNYXg8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgZHk6IFQsIHk6IFQsIHhPcmlnOiBUZW5zb3IsIG9yaWdBeGVzOiBudW1iZXJbXSkge1xuICBpZiAoeS5yYW5rIDwgeE9yaWcucmFuaykge1xuICAgIHkgPSByZXNoYXBlKHksIGF4aXNfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbSh5LnNoYXBlLCBvcmlnQXhlcykpIGFzIFQ7XG4gIH1cbiAgaWYgKGR5LnJhbmsgPCB4T3JpZy5yYW5rKSB7XG4gICAgZHkgPSByZXNoYXBlKGR5LCBheGlzX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0oZHkuc2hhcGUsIG9yaWdBeGVzKSkgYXMgVDtcbiAgfVxuICByZXR1cm4ge1xuICAgIHg6ICgpID0+IHtcbiAgICAgIGNvbnN0IGR4ID0gbXVsKGR5LCBjYXN0KGVxdWFsKHhPcmlnLCB5KSwgZHkuZHR5cGUpKTtcbiAgICAgIHJldHVybiBkeDtcbiAgICB9XG4gIH07XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Max } from '../kernel_names';\nimport * as util from '../util';\nimport { gradForMinAndMax } from './min_max_grad_util';\nexport const maxGradConfig = {\n    kernelName: Max,\n    inputsToSave: ['x'],\n    outputsToSave: [true],\n    gradFunc: (dy, saved, attrs) => {\n        const maxAttrs = attrs;\n        const { reductionIndices } = maxAttrs;\n        const x = saved[0];\n        const y = saved[1];\n        const origAxes = util.parseAxisParam(reductionIndices, x.shape);\n        const maxGrad = gradForMinAndMax(dy, y, x, origAxes);\n        return {\n            x: () => {\n                return maxGrad['x']();\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9NYXhfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFHOUMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLFFBQVEsR0FBYSxLQUF1QixDQUFDO1FBQ25ELE1BQU0sRUFBQyxnQkFBZ0IsRUFBQyxHQUFHLFFBQVEsQ0FBQztRQUNwQyxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkIsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUNOLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNYXgsIE1heEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Z3JhZEZvck1pbkFuZE1heH0gZnJvbSAnLi9taW5fbWF4X2dyYWRfdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBtYXhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXgsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBtYXhBdHRyczogTWF4QXR0cnMgPSBhdHRycyBhcyB7fSBhcyBNYXhBdHRycztcbiAgICBjb25zdCB7cmVkdWN0aW9uSW5kaWNlc30gPSBtYXhBdHRycztcbiAgICBjb25zdCB4ID0gc2F2ZWRbMF07XG4gICAgY29uc3QgeSA9IHNhdmVkWzFdO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShyZWR1Y3Rpb25JbmRpY2VzLCB4LnNoYXBlKTtcbiAgICBjb25zdCBtYXhHcmFkID0gZ3JhZEZvck1pbkFuZE1heChkeSwgeSwgeCwgb3JpZ0F4ZXMpO1xuICAgIHJldHVybiB7XG4gICAgICB4OiAoKSA9PiB7XG4gICAgICAgIHJldHVybiBtYXhHcmFkWyd4J10oKTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Maximum } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { greaterEqual } from '../ops/greater_equal';\nimport { less } from '../ops/less';\nimport { mul } from '../ops/mul';\nexport const maximumGradConfig = {\n    kernelName: Maximum,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const derA = () => mul(dy, cast(greaterEqual(a, b), 'float32'));\n        const derB = () => mul(dy, cast(less(a, b), 'float32'));\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4aW11bV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTWF4aW11bV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHL0IsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWU7SUFDM0MsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztRQUN4RCxPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TWF4aW11bX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtncmVhdGVyRXF1YWx9IGZyb20gJy4uL29wcy9ncmVhdGVyX2VxdWFsJztcbmltcG9ydCB7bGVzc30gZnJvbSAnLi4vb3BzL2xlc3MnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtYXhpbXVtR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4aW11bSxcbiAgaW5wdXRzVG9TYXZlOiBbJ2EnLCAnYiddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFthLCBiXSA9IHNhdmVkO1xuICAgIGNvbnN0IGRlckEgPSAoKSA9PiBtdWwoZHksIGNhc3QoZ3JlYXRlckVxdWFsKGEsIGIpLCAnZmxvYXQzMicpKTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4gbXVsKGR5LCBjYXN0KGxlc3MoYSwgYiksICdmbG9hdDMyJykpO1xuICAgIHJldHVybiB7YTogZGVyQSwgYjogZGVyQn07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPool3DGrad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport { checkPadOnDimRoundingMode } from './conv_util';\nimport { op } from './operation';\nimport { reshape } from './reshape';\n/**\n * Computes the backprop of a 3d max pool.\n *\n * @param dy The dy error, of rank 5 of shape\n *     [batchSize, depth, height, width, channels].\n * assumed.\n * @param input The original input image, of rank 5 or rank 4 of shape\n *     [batchSize, depth, height, width, channels].\n * @param output The original output image, of rank 5 of shape\n *     [batchSize, outDepth, outHeight, outWidth, channels].\n * @param filterSize The filter size:\n *     `[filterDepth, filterHeight, filterWidth]`.\n *     `filterSize` is a single number,\n *     then `filterDepth == filterHeight == filterWidth`.\n * @param strides The strides of the pooling:\n *     `[strideDepth, strideHeight, strideWidth]`. If\n *     `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad A string from: 'same', 'valid'. The type of padding algorithm\n *     used in the forward prop of the op.\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n */\nfunction maxPool3dGrad_(dy, input, output, filterSize, strides, pad, dimRoundingMode) {\n    const $dy = convertToTensor(dy, 'dy', 'maxPool3dGrad');\n    const $input = convertToTensor(input, 'input', 'maxPool3dGrad');\n    const $output = convertToTensor(output, 'output', 'maxPool3dGrad');\n    let dy5D = $dy;\n    let input5D = $input;\n    let output5D = $output;\n    let reshapedTo5D = false;\n    if ($input.rank === 4) {\n        reshapedTo5D = true;\n        dy5D = reshape($dy, [1, $dy.shape[0], $dy.shape[1], $dy.shape[2], $dy.shape[3]]);\n        input5D = reshape($input, [\n            1, $input.shape[0], $input.shape[1], $input.shape[2], $input.shape[3]\n        ]);\n        output5D = reshape($output, [\n            1, $output.shape[0], $output.shape[1], $output.shape[2], $output.shape[3]\n        ]);\n    }\n    util.assert(dy5D.rank === 5, () => `Error in maxPool3dGrad: dy must be rank 5 but got rank ` +\n        `${dy5D.rank}.`);\n    util.assert(input5D.rank === 5, () => `Error in maxPool3dGrad: input must be rank 5 but got rank ` +\n        `${input5D.rank}.`);\n    util.assert(output5D.rank === 5, () => `Error in maxPool3dGrad: output must be rank 5 but got rank ` +\n        `${output5D.rank}.`);\n    checkPadOnDimRoundingMode('maxPool3dGrad', pad, dimRoundingMode);\n    const inputs = { dy: dy5D, input: input5D, output: output5D };\n    const attrs = { filterSize, strides, pad, dimRoundingMode };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    const res = ENGINE.runKernel(MaxPool3DGrad, inputs, attrs);\n    if (reshapedTo5D) {\n        return reshape(res, [res.shape[1], res.shape[2], res.shape[3], res.shape[4]]);\n    }\n    return res;\n}\nexport const maxPool3dGrad = op({ maxPool3dGrad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfM2RfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21heF9wb29sXzNkX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsYUFBYSxFQUEwQyxNQUFNLGlCQUFpQixDQUFDO0FBSXZGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUFDLEVBQUUsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxTQUFTLGNBQWMsQ0FDbkIsRUFBZ0IsRUFBRSxLQUFtQixFQUFFLE1BQW9CLEVBQzNELFVBQTJDLEVBQzNDLE9BQXdDLEVBQUUsR0FBMEIsRUFDcEUsZUFBd0M7SUFDMUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDdkQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDaEUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFbkUsSUFBSSxJQUFJLEdBQUcsR0FBZSxDQUFDO0lBQzNCLElBQUksT0FBTyxHQUFHLE1BQWtCLENBQUM7SUFDakMsSUFBSSxRQUFRLEdBQUcsT0FBbUIsQ0FBQztJQUNuQyxJQUFJLFlBQVksR0FBRyxLQUFLLENBQUM7SUFFekIsSUFBSSxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNyQixZQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLElBQUksR0FBRyxPQUFPLENBQ1YsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFO1lBQ3hCLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztTQUN0RSxDQUFDLENBQUM7UUFDSCxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRTtZQUMxQixDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDMUUsQ0FBQyxDQUFDO0tBQ0o7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNmLEdBQUcsRUFBRSxDQUFDLHlEQUF5RDtRQUMzRCxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3pCLElBQUksQ0FBQyxNQUFNLENBQ1AsT0FBTyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2xCLEdBQUcsRUFBRSxDQUFDLDREQUE0RDtRQUM5RCxHQUFHLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLElBQUksQ0FBQyxNQUFNLENBQ1AsUUFBUSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ25CLEdBQUcsRUFBRSxDQUFDLDZEQUE2RDtRQUMvRCxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzdCLHlCQUF5QixDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDakUsTUFBTSxNQUFNLEdBQ2MsRUFBQyxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ3ZFLE1BQU0sS0FBSyxHQUF1QixFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxDQUFDO0lBRTlFLDBEQUEwRDtJQUMxRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUNaLGFBQWEsRUFBRSxNQUE4QixFQUM3QyxLQUEyQixDQUFNLENBQUM7SUFFbEQsSUFBSSxZQUFZLEVBQUU7UUFDaEIsT0FBTyxPQUFPLENBQ0gsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUNuRSxDQUFDO0tBQ1A7SUFFRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQUcsRUFBRSxDQUFDLEVBQUMsY0FBYyxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge01heFBvb2wzREdyYWQsIE1heFBvb2wzREdyYWRBdHRycywgTWF4UG9vbDNER3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RCwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge05hbWVkVGVuc29yTWFwfSBmcm9tICcuLi90ZW5zb3JfdHlwZXMnO1xuaW1wb3J0IHtjb252ZXJ0VG9UZW5zb3J9IGZyb20gJy4uL3RlbnNvcl91dGlsX2Vudic7XG5pbXBvcnQge1RlbnNvckxpa2V9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Y2hlY2tQYWRPbkRpbVJvdW5kaW5nTW9kZX0gZnJvbSAnLi9jb252X3V0aWwnO1xuaW1wb3J0IHtvcH0gZnJvbSAnLi9vcGVyYXRpb24nO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL3Jlc2hhcGUnO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBiYWNrcHJvcCBvZiBhIDNkIG1heCBwb29sLlxuICpcbiAqIEBwYXJhbSBkeSBUaGUgZHkgZXJyb3IsIG9mIHJhbmsgNSBvZiBzaGFwZVxuICogICAgIFtiYXRjaFNpemUsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBhc3N1bWVkLlxuICogQHBhcmFtIGlucHV0IFRoZSBvcmlnaW5hbCBpbnB1dCBpbWFnZSwgb2YgcmFuayA1IG9yIHJhbmsgNCBvZiBzaGFwZVxuICogICAgIFtiYXRjaFNpemUsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gb3V0cHV0IFRoZSBvcmlnaW5hbCBvdXRwdXQgaW1hZ2UsIG9mIHJhbmsgNSBvZiBzaGFwZVxuICogICAgIFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCBjaGFubmVsc10uXG4gKiBAcGFyYW0gZmlsdGVyU2l6ZSBUaGUgZmlsdGVyIHNpemU6XG4gKiAgICAgYFtmaWx0ZXJEZXB0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aF1gLlxuICogICAgIGBmaWx0ZXJTaXplYCBpcyBhIHNpbmdsZSBudW1iZXIsXG4gKiAgICAgdGhlbiBgZmlsdGVyRGVwdGggPT0gZmlsdGVySGVpZ2h0ID09IGZpbHRlcldpZHRoYC5cbiAqIEBwYXJhbSBzdHJpZGVzIFRoZSBzdHJpZGVzIG9mIHRoZSBwb29saW5nOlxuICogICAgIGBbc3RyaWRlRGVwdGgsIHN0cmlkZUhlaWdodCwgc3RyaWRlV2lkdGhdYC4gSWZcbiAqICAgICBgc3RyaWRlc2AgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBzdHJpZGVIZWlnaHQgPT0gc3RyaWRlV2lkdGhgLlxuICogQHBhcmFtIHBhZCBBIHN0cmluZyBmcm9tOiAnc2FtZScsICd2YWxpZCcuIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtXG4gKiAgICAgdXNlZCBpbiB0aGUgZm9yd2FyZCBwcm9wIG9mIHRoZSBvcC5cbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbDNkR3JhZF88VCBleHRlbmRzIFRlbnNvcjREfFRlbnNvcjVEPihcbiAgICBkeTogVHxUZW5zb3JMaWtlLCBpbnB1dDogVHxUZW5zb3JMaWtlLCBvdXRwdXQ6IFR8VGVuc29yTGlrZSxcbiAgICBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXXxudW1iZXIsIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgY29uc3QgJGR5ID0gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAnbWF4UG9vbDNkR3JhZCcpO1xuICBjb25zdCAkaW5wdXQgPSBjb252ZXJ0VG9UZW5zb3IoaW5wdXQsICdpbnB1dCcsICdtYXhQb29sM2RHcmFkJyk7XG4gIGNvbnN0ICRvdXRwdXQgPSBjb252ZXJ0VG9UZW5zb3Iob3V0cHV0LCAnb3V0cHV0JywgJ21heFBvb2wzZEdyYWQnKTtcblxuICBsZXQgZHk1RCA9ICRkeSBhcyBUZW5zb3I1RDtcbiAgbGV0IGlucHV0NUQgPSAkaW5wdXQgYXMgVGVuc29yNUQ7XG4gIGxldCBvdXRwdXQ1RCA9ICRvdXRwdXQgYXMgVGVuc29yNUQ7XG4gIGxldCByZXNoYXBlZFRvNUQgPSBmYWxzZTtcblxuICBpZiAoJGlucHV0LnJhbmsgPT09IDQpIHtcbiAgICByZXNoYXBlZFRvNUQgPSB0cnVlO1xuICAgIGR5NUQgPSByZXNoYXBlKFxuICAgICAgICAkZHksIFsxLCAkZHkuc2hhcGVbMF0sICRkeS5zaGFwZVsxXSwgJGR5LnNoYXBlWzJdLCAkZHkuc2hhcGVbM11dKTtcbiAgICBpbnB1dDVEID0gcmVzaGFwZSgkaW5wdXQsIFtcbiAgICAgIDEsICRpbnB1dC5zaGFwZVswXSwgJGlucHV0LnNoYXBlWzFdLCAkaW5wdXQuc2hhcGVbMl0sICRpbnB1dC5zaGFwZVszXVxuICAgIF0pO1xuICAgIG91dHB1dDVEID0gcmVzaGFwZSgkb3V0cHV0LCBbXG4gICAgICAxLCAkb3V0cHV0LnNoYXBlWzBdLCAkb3V0cHV0LnNoYXBlWzFdLCAkb3V0cHV0LnNoYXBlWzJdLCAkb3V0cHV0LnNoYXBlWzNdXG4gICAgXSk7XG4gIH1cblxuICB1dGlsLmFzc2VydChcbiAgICAgIGR5NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sM2RHcmFkOiBkeSBtdXN0IGJlIHJhbmsgNSBidXQgZ290IHJhbmsgYCArXG4gICAgICAgICAgYCR7ZHk1RC5yYW5rfS5gKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbnB1dDVELnJhbmsgPT09IDUsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDNkR3JhZDogaW5wdXQgbXVzdCBiZSByYW5rIDUgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAke2lucHV0NUQucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgb3V0cHV0NUQucmFuayA9PT0gNSxcbiAgICAgICgpID0+IGBFcnJvciBpbiBtYXhQb29sM2RHcmFkOiBvdXRwdXQgbXVzdCBiZSByYW5rIDUgYnV0IGdvdCByYW5rIGAgK1xuICAgICAgICAgIGAke291dHB1dDVELnJhbmt9LmApO1xuICBjaGVja1BhZE9uRGltUm91bmRpbmdNb2RlKCdtYXhQb29sM2RHcmFkJywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCBpbnB1dHM6XG4gICAgICBNYXhQb29sM0RHcmFkSW5wdXRzID0ge2R5OiBkeTVELCBpbnB1dDogaW5wdXQ1RCwgb3V0cHV0OiBvdXRwdXQ1RH07XG4gIGNvbnN0IGF0dHJzOiBNYXhQb29sM0RHcmFkQXR0cnMgPSB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9O1xuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgY29uc3QgcmVzID0gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICAgICAgIE1heFBvb2wzREdyYWQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCxcbiAgICAgICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVDtcblxuICBpZiAocmVzaGFwZWRUbzVEKSB7XG4gICAgcmV0dXJuIHJlc2hhcGUoXG4gICAgICAgICAgICAgICByZXMsIFtyZXMuc2hhcGVbMV0sIHJlcy5zaGFwZVsyXSwgcmVzLnNoYXBlWzNdLCByZXMuc2hhcGVbNF1dKSBhc1xuICAgICAgICBUO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2wzZEdyYWQgPSBvcCh7bWF4UG9vbDNkR3JhZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MaxPool3D } from '../kernel_names';\nimport { maxPool3dGrad } from '../ops/max_pool_3d_grad';\nexport const maxPool3DGradConfig = {\n    kernelName: MaxPool3D,\n    inputsToSave: ['x'],\n    outputsToSave: [true],\n    gradFunc: (dy, saved, attrs) => {\n        const [x, y] = saved;\n        const { filterSize, strides, pad, dimRoundingMode } = attrs;\n        return {\n            x: () => maxPool3dGrad(dy, x, y, filterSize, strides, pad, dimRoundingMode)\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNEX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9NYXhQb29sM0RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUd0RCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBZTtJQUM3QyxVQUFVLEVBQUUsU0FBUztJQUNyQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsYUFBYSxFQUFFLENBQUMsSUFBSSxDQUFDO0lBQ3JCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBNkIsQ0FBQztRQUM3QyxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLEdBQzdDLEtBQTZCLENBQUM7UUFFbEMsT0FBTztZQUNMLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxhQUFhLENBQ2xCLEVBQWMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TWF4UG9vbDNELCBNYXhQb29sM0RBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHttYXhQb29sM2RHcmFkfSBmcm9tICcuLi9vcHMvbWF4X3Bvb2xfM2RfZ3JhZCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sM0RHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sM0QsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeCwgeV0gPSBzYXZlZCBhcyBbVGVuc29yNUQsIFRlbnNvcjVEXTtcbiAgICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgTWF4UG9vbDNEQXR0cnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4gbWF4UG9vbDNkR3JhZChcbiAgICAgICAgICBkeSBhcyBUZW5zb3I1RCwgeCwgeSwgZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { MaxPoolGrad } from '../kernel_names';\nimport { convertToTensor } from '../tensor_util_env';\nimport * as util from '../util';\nimport * as conv_util from './conv_util';\nimport { op } from './operation';\n/**\n * Computes the backprop of a 2D max pool.\n *\n * @param dy The dy error, of rank 4 or rank 3 of shape\n *     [batchSize, height, width, channels]. If rank 3, batch of 1 is\n * assumed.\n * @param input The original input image, of rank 4, of shape\n *     [batchSize, height, width, channels].\n * @param output The original output image, of rank 4, of shape\n *     [batchSize, outHeight, outWidth, channels].\n * @param filterSize The filter size: `[filterHeight, filterWidth]`. If\n *     `filterSize` is a single number, then `filterHeight == filterWidth`.\n * @param strides The strides of the pooling: `[strideHeight, strideWidth]`. If\n *     `strides` is a single number, then `strideHeight == strideWidth`.\n * @param pad The type of padding algorithm used in the forward prop of the op.\n *     'same', 'valid', for more info, see this guide:\n *     [https://www.tensorflow.org/api_docs/python/tf/nn/convolution](\n *          https://www.tensorflow.org/api_docs/python/tf/nn/convolution)\n * @param dimRoundingMode A string from: 'ceil', 'round', 'floor'. If none is\n *     provided, it will default to truncate.\n */\nfunction maxPoolGrad_(dy, input, output, filterSize, strides, pad, dimRoundingMode) {\n    const $dy = convertToTensor(dy, 'dy', 'maxPoolGrad');\n    const $input = convertToTensor(input, 'input', 'maxPoolGrad');\n    const $output = convertToTensor(output, 'output', 'maxPoolGrad');\n    util.assert($input.rank === $dy.rank, () => `Rank of input (${$input.rank}) does not match rank of dy ` +\n        `(${$dy.rank})`);\n    util.assert($dy.rank === 4, () => `Error in maxPoolGrad: dy must be rank 4 but got rank ` +\n        `${$dy.rank}.`);\n    util.assert($input.rank === 4, () => `Error in maxPoolGrad: input must be rank 4 but got rank ` +\n        `${$input.rank}.`);\n    conv_util.checkPadOnDimRoundingMode('maxPoolGrad', pad, dimRoundingMode);\n    const inputs = { dy: $dy, input: $input, output: $output };\n    const attrs = { filterSize, strides, pad, dimRoundingMode };\n    // tslint:disable-next-line: no-unnecessary-type-assertion\n    return ENGINE.runKernel(MaxPoolGrad, inputs, attrs);\n}\nexport const maxPoolGrad = op({ maxPoolGrad_ });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL21heF9wb29sX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsV0FBVyxFQUFzQyxNQUFNLGlCQUFpQixDQUFDO0FBSWpGLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxPQUFPLEtBQUssSUFBSSxNQUFNLFNBQVMsQ0FBQztBQUVoQyxPQUFPLEtBQUssU0FBUyxNQUFNLGFBQWEsQ0FBQztBQUN6QyxPQUFPLEVBQUMsRUFBRSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRS9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILFNBQVMsWUFBWSxDQUNqQixFQUF1QixFQUFFLEtBQTBCLEVBQ25ELE1BQTJCLEVBQUUsVUFBbUMsRUFDaEUsT0FBZ0MsRUFDaEMsR0FBb0QsRUFDcEQsZUFBd0M7SUFDMUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDckQsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDOUQsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFFakUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEVBQ3hCLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixNQUFNLENBQUMsSUFBSSw4QkFBOEI7UUFDN0QsSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztJQUV6QixJQUFJLENBQUMsTUFBTSxDQUNQLEdBQUcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUNkLEdBQUcsRUFBRSxDQUFDLHVEQUF1RDtRQUN6RCxHQUFHLEdBQUcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQ2pCLEdBQUcsRUFBRSxDQUFDLDBEQUEwRDtRQUM1RCxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLFNBQVMsQ0FBQyx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3pFLE1BQU0sTUFBTSxHQUFzQixFQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDNUUsTUFBTSxLQUFLLEdBQXFCLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLENBQUM7SUFFNUUsMERBQTBEO0lBQzFELE9BQU8sTUFBTSxDQUFDLFNBQVMsQ0FDWixXQUFXLEVBQUUsTUFBOEIsRUFDM0MsS0FBMkIsQ0FBYSxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDLEVBQUMsWUFBWSxFQUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge01heFBvb2xHcmFkLCBNYXhQb29sR3JhZEF0dHJzLCBNYXhQb29sR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3I0RH0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL3RlbnNvcl90eXBlcyc7XG5pbXBvcnQge2NvbnZlcnRUb1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yX3V0aWxfZW52JztcbmltcG9ydCB7VGVuc29yTGlrZX0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgdXRpbCBmcm9tICcuLi91dGlsJztcblxuaW1wb3J0ICogYXMgY29udl91dGlsIGZyb20gJy4vY29udl91dGlsJztcbmltcG9ydCB7b3B9IGZyb20gJy4vb3BlcmF0aW9uJztcblxuLyoqXG4gKiBDb21wdXRlcyB0aGUgYmFja3Byb3Agb2YgYSAyRCBtYXggcG9vbC5cbiAqXG4gKiBAcGFyYW0gZHkgVGhlIGR5IGVycm9yLCBvZiByYW5rIDQgb3IgcmFuayAzIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoU2l6ZSwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLiBJZiByYW5rIDMsIGJhdGNoIG9mIDEgaXNcbiAqIGFzc3VtZWQuXG4gKiBAcGFyYW0gaW5wdXQgVGhlIG9yaWdpbmFsIGlucHV0IGltYWdlLCBvZiByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoU2l6ZSwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIG91dHB1dCBUaGUgb3JpZ2luYWwgb3V0cHV0IGltYWdlLCBvZiByYW5rIDQsIG9mIHNoYXBlXG4gKiAgICAgW2JhdGNoU2l6ZSwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgY2hhbm5lbHNdLlxuICogQHBhcmFtIGZpbHRlclNpemUgVGhlIGZpbHRlciBzaXplOiBgW2ZpbHRlckhlaWdodCwgZmlsdGVyV2lkdGhdYC4gSWZcbiAqICAgICBgZmlsdGVyU2l6ZWAgaXMgYSBzaW5nbGUgbnVtYmVyLCB0aGVuIGBmaWx0ZXJIZWlnaHQgPT0gZmlsdGVyV2lkdGhgLlxuICogQHBhcmFtIHN0cmlkZXMgVGhlIHN0cmlkZXMgb2YgdGhlIHBvb2xpbmc6IGBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF1gLiBJZlxuICogICAgIGBzdHJpZGVzYCBpcyBhIHNpbmdsZSBudW1iZXIsIHRoZW4gYHN0cmlkZUhlaWdodCA9PSBzdHJpZGVXaWR0aGAuXG4gKiBAcGFyYW0gcGFkIFRoZSB0eXBlIG9mIHBhZGRpbmcgYWxnb3JpdGhtIHVzZWQgaW4gdGhlIGZvcndhcmQgcHJvcCBvZiB0aGUgb3AuXG4gKiAgICAgJ3NhbWUnLCAndmFsaWQnLCBmb3IgbW9yZSBpbmZvLCBzZWUgdGhpcyBndWlkZTpcbiAqICAgICBbaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL25uL2NvbnZvbHV0aW9uXShcbiAqICAgICAgICAgIGh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2FwaV9kb2NzL3B5dGhvbi90Zi9ubi9jb252b2x1dGlvbilcbiAqIEBwYXJhbSBkaW1Sb3VuZGluZ01vZGUgQSBzdHJpbmcgZnJvbTogJ2NlaWwnLCAncm91bmQnLCAnZmxvb3InLiBJZiBub25lIGlzXG4gKiAgICAgcHJvdmlkZWQsIGl0IHdpbGwgZGVmYXVsdCB0byB0cnVuY2F0ZS5cbiAqL1xuZnVuY3Rpb24gbWF4UG9vbEdyYWRfKFxuICAgIGR5OiBUZW5zb3I0RHxUZW5zb3JMaWtlLCBpbnB1dDogVGVuc29yNER8VGVuc29yTGlrZSxcbiAgICBvdXRwdXQ6IFRlbnNvcjREfFRlbnNvckxpa2UsIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfGNvbnZfdXRpbC5FeHBsaWNpdFBhZGRpbmcsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFRlbnNvcjREIHtcbiAgY29uc3QgJGR5ID0gY29udmVydFRvVGVuc29yKGR5LCAnZHknLCAnbWF4UG9vbEdyYWQnKTtcbiAgY29uc3QgJGlucHV0ID0gY29udmVydFRvVGVuc29yKGlucHV0LCAnaW5wdXQnLCAnbWF4UG9vbEdyYWQnKTtcbiAgY29uc3QgJG91dHB1dCA9IGNvbnZlcnRUb1RlbnNvcihvdXRwdXQsICdvdXRwdXQnLCAnbWF4UG9vbEdyYWQnKTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgICRpbnB1dC5yYW5rID09PSAkZHkucmFuayxcbiAgICAgICgpID0+IGBSYW5rIG9mIGlucHV0ICgkeyRpbnB1dC5yYW5rfSkgZG9lcyBub3QgbWF0Y2ggcmFuayBvZiBkeSBgICtcbiAgICAgICAgICBgKCR7JGR5LnJhbmt9KWApO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGR5LnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbEdyYWQ6IGR5IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHskZHkucmFua30uYCk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgJGlucHV0LnJhbmsgPT09IDQsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbEdyYWQ6IGlucHV0IG11c3QgYmUgcmFuayA0IGJ1dCBnb3QgcmFuayBgICtcbiAgICAgICAgICBgJHskaW5wdXQucmFua30uYCk7XG4gIGNvbnZfdXRpbC5jaGVja1BhZE9uRGltUm91bmRpbmdNb2RlKCdtYXhQb29sR3JhZCcsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgY29uc3QgaW5wdXRzOiBNYXhQb29sR3JhZElucHV0cyA9IHtkeTogJGR5LCBpbnB1dDogJGlucHV0LCBvdXRwdXQ6ICRvdXRwdXR9O1xuICBjb25zdCBhdHRyczogTWF4UG9vbEdyYWRBdHRycyA9IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX07XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICByZXR1cm4gRU5HSU5FLnJ1bktlcm5lbChcbiAgICAgICAgICAgICBNYXhQb29sR3JhZCwgaW5wdXRzIGFzIHt9IGFzIE5hbWVkVGVuc29yTWFwLFxuICAgICAgICAgICAgIGF0dHJzIGFzIHt9IGFzIE5hbWVkQXR0ck1hcCkgYXMgVGVuc29yNEQ7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZCA9IG9wKHttYXhQb29sR3JhZF99KTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MaxPool } from '../kernel_names';\nimport { maxPoolGrad } from '../ops/max_pool_grad';\nexport const maxPoolGradConfig = {\n    kernelName: MaxPool,\n    inputsToSave: ['x'],\n    outputsToSave: [true],\n    gradFunc: (dy, saved, attrs) => {\n        const [x, y] = saved;\n        const { filterSize, strides, pad } = attrs;\n        return {\n            x: () => maxPoolGrad(dy, x, y, filterSize, strides, pad)\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTWF4UG9vbF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHakQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWU7SUFDM0MsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQTZCLENBQUM7UUFDN0MsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFDLEdBQUcsS0FBMkIsQ0FBQztRQUUvRCxPQUFPO1lBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFjLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsQ0FBQztTQUNyRSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TWF4UG9vbCwgTWF4UG9vbEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge21heFBvb2xHcmFkfSBmcm9tICcuLi9vcHMvbWF4X3Bvb2xfZ3JhZCc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yNER9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgb3V0cHV0c1RvU2F2ZTogW3RydWVdLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFt4LCB5XSA9IHNhdmVkIGFzIFtUZW5zb3I0RCwgVGVuc29yNERdO1xuICAgIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnMgYXMge30gYXMgTWF4UG9vbEF0dHJzO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+IG1heFBvb2xHcmFkKGR5IGFzIFRlbnNvcjRELCB4LCB5LCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Mean } from '../kernel_names';\nimport { computeOutAndReduceShapes } from '../ops/axis_util';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { ones } from '../ops/ones';\nimport { reshape } from '../ops/reshape';\nimport * as util from '../util';\nexport const meanGradConfig = {\n    kernelName: Mean,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { axis } = attrs;\n        const axes = util.parseAxisParam(axis, x.shape);\n        const shapes = computeOutAndReduceShapes(x.shape, axes);\n        const reduceShape = shapes[1];\n        const reduceSize = util.sizeFromShape(reduceShape);\n        const derX = () => {\n            const expandedDyShape = x.shape.slice();\n            axes.forEach(axis => {\n                expandedDyShape[axis] = 1;\n            });\n            const expandedDy = reshape(dy, expandedDyShape);\n            const res = div(mul(expandedDy, ones(x.shape, 'float32')), reduceSize);\n            return res;\n        };\n        return { x: derX };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVhbl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTWVhbl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUF3QixDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNoRCxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixNQUFNLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xCLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsRUFBRSxFQUFFLGVBQWUsQ0FBQyxDQUFDO1lBQ2hELE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdkUsT0FBTyxHQUFHLENBQUM7UUFDYixDQUFDLENBQUM7UUFFRixPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQ25CLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge01lYW4sIE1lYW5BdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzfSBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7b25lc30gZnJvbSAnLi4vb3BzL29uZXMnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBtZWFuR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWVhbixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCB7YXhpc30gPSBhdHRycyBhcyB7fSBhcyBNZWFuQXR0cnM7XG4gICAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3Qgc2hhcGVzID0gY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyh4LnNoYXBlLCBheGVzKTtcbiAgICBjb25zdCByZWR1Y2VTaGFwZSA9IHNoYXBlc1sxXTtcbiAgICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcblxuICAgIGNvbnN0IGRlclggPSAoKSA9PiB7XG4gICAgICBjb25zdCBleHBhbmRlZER5U2hhcGUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgICBheGVzLmZvckVhY2goYXhpcyA9PiB7XG4gICAgICAgIGV4cGFuZGVkRHlTaGFwZVtheGlzXSA9IDE7XG4gICAgICB9KTtcbiAgICAgIGNvbnN0IGV4cGFuZGVkRHkgPSByZXNoYXBlKGR5LCBleHBhbmRlZER5U2hhcGUpO1xuICAgICAgY29uc3QgcmVzID0gZGl2KG11bChleHBhbmRlZER5LCBvbmVzKHguc2hhcGUsICdmbG9hdDMyJykpLCByZWR1Y2VTaXplKTtcbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcblxuICAgIHJldHVybiB7eDogZGVyWH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Min } from '../kernel_names';\nimport * as util from '../util';\nimport { gradForMinAndMax } from './min_max_grad_util';\nexport const minGradConfig = {\n    kernelName: Min,\n    inputsToSave: ['x'],\n    outputsToSave: [true],\n    gradFunc: (dy, saved, attrs) => {\n        const minAttrs = attrs;\n        const { axis } = minAttrs;\n        const [x, y] = saved;\n        const origAxes = util.parseAxisParam(axis, x.shape);\n        const minGrad = gradForMinAndMax(dy, y, x, origAxes);\n        return {\n            x: () => {\n                return minGrad['x']();\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9NaW5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFHOUMsT0FBTyxLQUFLLElBQUksTUFBTSxTQUFTLENBQUM7QUFFaEMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQztJQUNyQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLFFBQVEsR0FBYSxLQUF1QixDQUFDO1FBQ25ELE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxRQUFRLENBQUM7UUFDeEIsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3JELE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFO2dCQUNOLE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDeEIsQ0FBQztTQUNGLENBQUM7SUFDSixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNaW4sIE1pbkF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi4vdXRpbCc7XG5cbmltcG9ydCB7Z3JhZEZvck1pbkFuZE1heH0gZnJvbSAnLi9taW5fbWF4X2dyYWRfdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBtaW5HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaW4sXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIG91dHB1dHNUb1NhdmU6IFt0cnVlXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBtaW5BdHRyczogTWluQXR0cnMgPSBhdHRycyBhcyB7fSBhcyBNaW5BdHRycztcbiAgICBjb25zdCB7YXhpc30gPSBtaW5BdHRycztcbiAgICBjb25zdCBbeCwgeV0gPSBzYXZlZDtcbiAgICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgY29uc3QgbWluR3JhZCA9IGdyYWRGb3JNaW5BbmRNYXgoZHksIHksIHgsIG9yaWdBeGVzKTtcbiAgICByZXR1cm4ge1xuICAgICAgeDogKCkgPT4ge1xuICAgICAgICByZXR1cm4gbWluR3JhZFsneCddKCk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Minimum } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { greater } from '../ops/greater';\nimport { lessEqual } from '../ops/less_equal';\nimport { mul } from '../ops/mul';\nexport const minimumGradConfig = {\n    kernelName: Minimum,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const derA = () => mul(dy, cast(lessEqual(a, b), 'float32'));\n        const derB = () => mul(dy, cast(greater(a, b), 'float32'));\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvTWluaW11bV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZTtJQUMzQyxVQUFVLEVBQUUsT0FBTztJQUNuQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzNELE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNaW5pbXVtfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2dyZWF0ZXJ9IGZyb20gJy4uL29wcy9ncmVhdGVyJztcbmltcG9ydCB7bGVzc0VxdWFsfSBmcm9tICcuLi9vcHMvbGVzc19lcXVhbCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IG1pbmltdW1HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaW5pbXVtLFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3QgZGVyQSA9ICgpID0+IG11bChkeSwgY2FzdChsZXNzRXF1YWwoYSwgYiksICdmbG9hdDMyJykpO1xuICAgIGNvbnN0IGRlckIgPSAoKSA9PiBtdWwoZHksIGNhc3QoZ3JlYXRlcihhLCBiKSwgJ2Zsb2F0MzInKSk7XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MirrorPad } from '../kernel_names';\nimport { slice } from '../ops/slice';\nexport const mirrorPadGradConfig = {\n    kernelName: MirrorPad,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        // Pad introduces values around the original tensor, so the gradient\n        // slices the original shape out of the gradient.\n        const x = saved[0];\n        const { paddings } = attrs;\n        const begin = paddings.map(p => p[0]);\n        return { x: () => slice(dy, begin, x.shape) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlycm9yUGFkX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9NaXJyb3JQYWRfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkMsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWU7SUFDN0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELG9FQUFvRTtRQUNwRSxpREFBaUQ7UUFDakQsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25CLE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxLQUFrQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QyxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBQyxDQUFDO0lBQzlDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge01pcnJvclBhZCwgTWlycm9yUGFkQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4uL29wcy9zbGljZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IG1pcnJvclBhZEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1pcnJvclBhZCxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICAvLyBQYWQgaW50cm9kdWNlcyB2YWx1ZXMgYXJvdW5kIHRoZSBvcmlnaW5hbCB0ZW5zb3IsIHNvIHRoZSBncmFkaWVudFxuICAgIC8vIHNsaWNlcyB0aGUgb3JpZ2luYWwgc2hhcGUgb3V0IG9mIHRoZSBncmFkaWVudC5cbiAgICBjb25zdCB4ID0gc2F2ZWRbMF07XG4gICAgY29uc3Qge3BhZGRpbmdzfSA9IGF0dHJzIGFzIHVua25vd24gYXMgTWlycm9yUGFkQXR0cnM7XG4gICAgY29uc3QgYmVnaW4gPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKTtcbiAgICByZXR1cm4ge3g6ICgpID0+IHNsaWNlKGR5LCBiZWdpbiwgeC5zaGFwZSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Mod } from '../kernel_names';\nimport { assertAndGetBroadcastShape, getReductionAxes } from '../ops/broadcast_util';\nimport { div } from '../ops/div';\nimport { floor } from '../ops/floor';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nexport const modGradConfig = {\n    kernelName: Mod,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n        const derA = () => {\n            const reduceAxes = getReductionAxes(a.shape, outShape);\n            if (reduceAxes.length > 0) {\n                return reshape(sum(dy, reduceAxes), a.shape);\n            }\n            return dy;\n        };\n        const derB = () => {\n            const res = mul(dy, neg(floor(div(a, b))));\n            const reduceAxes = getReductionAxes(b.shape, outShape);\n            if (reduceAxes.length > 0) {\n                return reshape(sum(res, reduceAxes), b.shape);\n            }\n            return res;\n        };\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Nb2RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLDBCQUEwQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbkYsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ25DLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM5QztZQUNELE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0M7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNb2R9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Fzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlLCBnZXRSZWR1Y3Rpb25BeGVzfSBmcm9tICcuLi9vcHMvYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHtmbG9vcn0gZnJvbSAnLi4vb3BzL2Zsb29yJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtb2RHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNb2QsXG4gIGlucHV0c1RvU2F2ZTogWydhJywgJ2InXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbYSwgYl0gPSBzYXZlZDtcbiAgICBjb25zdCBvdXRTaGFwZSA9IGFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGEuc2hhcGUsIGIuc2hhcGUpO1xuXG4gICAgY29uc3QgZGVyQSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IHJlZHVjZUF4ZXMgPSBnZXRSZWR1Y3Rpb25BeGVzKGEuc2hhcGUsIG91dFNoYXBlKTtcbiAgICAgIGlmIChyZWR1Y2VBeGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHJlc2hhcGUoc3VtKGR5LCByZWR1Y2VBeGVzKSwgYS5zaGFwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gZHk7XG4gICAgfTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gbXVsKGR5LCBuZWcoZmxvb3IoZGl2KGEsIGIpKSkpO1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGdldFJlZHVjdGlvbkF4ZXMoYi5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShzdW0ocmVzLCByZWR1Y2VBeGVzKSwgYi5zaGFwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Multiply } from '../kernel_names';\nimport { assertAndGetBroadcastShape, getReductionAxes } from '../ops/broadcast_util';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nexport const multiplyGradConfig = {\n    kernelName: Multiply,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const outShape = assertAndGetBroadcastShape(a.shape, b.shape);\n        const derA = () => {\n            const res = mul(dy, cast(b, 'float32'));\n            const reduceAxes = getReductionAxes(a.shape, outShape);\n            if (reduceAxes.length > 0) {\n                return reshape(sum(res, reduceAxes), a.shape);\n            }\n            return res;\n        };\n        const derB = () => {\n            const res = mul(dy, cast(a, 'float32'));\n            const reduceAxes = getReductionAxes(b.shape, outShape);\n            if (reduceAxes.length > 0) {\n                return reshape(sum(res, reduceAxes), b.shape);\n            }\n            return res;\n        };\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlwbHlfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL011bHRpcGx5X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQywwQkFBMEIsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZTtJQUM1QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLFFBQVEsR0FBRywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU5RCxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7WUFDeEMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkQsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsT0FBTyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDL0M7WUFDRCxPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsQ0FBQztJQUM1QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNdWx0aXBseX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7YXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUsIGdldFJlZHVjdGlvbkF4ZXN9IGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBtdWx0aXBseUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE11bHRpcGx5LFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3Qgb3V0U2hhcGUgPSBhc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhLnNoYXBlLCBiLnNoYXBlKTtcblxuICAgIGNvbnN0IGRlckEgPSAoKSA9PiB7XG4gICAgICBjb25zdCByZXMgPSBtdWwoZHksIGNhc3QoYiwgJ2Zsb2F0MzInKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gZ2V0UmVkdWN0aW9uQXhlcyhhLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiByZXNoYXBlKHN1bShyZXMsIHJlZHVjZUF4ZXMpLCBhLnNoYXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXM7XG4gICAgfTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gbXVsKGR5LCBjYXN0KGEsICdmbG9hdDMyJykpO1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGdldFJlZHVjdGlvbkF4ZXMoYi5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShzdW0ocmVzLCByZWR1Y2VBeGVzKSwgYi5zaGFwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Neg } from '../kernel_names';\nimport { neg } from '../ops/neg';\nexport const negGradConfig = {\n    kernelName: Neg,\n    gradFunc: (dy) => {\n        return { x: () => neg(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVnX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9OZWdfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLEdBQUc7SUFDZixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtRQUN2QixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge05lZ30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgbmVnR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTmVnLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICByZXR1cm4ge3g6ICgpID0+IG5lZyhkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OneHot } from '../kernel_names';\nimport { zeros } from '../ops/zeros';\nexport const oneHotGradConfig = {\n    kernelName: OneHot,\n    inputsToSave: ['indices'],\n    gradFunc: (dy, saved) => {\n        const indices = saved[0];\n        return { indices: () => zeros(indices.shape, 'float32') };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lSG90X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9PbmVIb3RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUduQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZTtJQUMxQyxVQUFVLEVBQUUsTUFBTTtJQUNsQixZQUFZLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDekIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixPQUFPLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxFQUFDLENBQUM7SUFDMUQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T25lSG90fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc30gZnJvbSAnLi4vb3BzL3plcm9zJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgb25lSG90R3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogT25lSG90LFxuICBpbnB1dHNUb1NhdmU6IFsnaW5kaWNlcyddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IGluZGljZXMgPSBzYXZlZFswXTtcbiAgICByZXR1cm4ge2luZGljZXM6ICgpID0+IHplcm9zKGluZGljZXMuc2hhcGUsICdmbG9hdDMyJyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OnesLike } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const onesLikeGradConfig = {\n    kernelName: OnesLike,\n    gradFunc: (dy) => {\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lc0xpa2VfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL09uZXNMaWtlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBZTtJQUM1QyxVQUFVLEVBQUUsUUFBUTtJQUNwQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsRUFBRTtRQUN2QixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09uZXNMaWtlfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgb25lc0xpa2VHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBPbmVzTGlrZSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pack } from '../kernel_names';\nimport { unstack } from '../ops/unstack';\nexport const packGradConfig = {\n    kernelName: Pack,\n    saveAllInputs: true,\n    gradFunc: (dy, saved, attrs) => {\n        const { axis } = attrs;\n        const derTensors = unstack(dy, axis);\n        return derTensors.map(t => () => t);\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFja19ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUGFja19ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLGFBQWEsRUFBRSxJQUFJO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUF3QixDQUFDO1FBQ3hDLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDckMsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFPLENBQUM7SUFDNUMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UGFjaywgUGFja0F0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3Vuc3RhY2t9IGZyb20gJy4uL29wcy91bnN0YWNrJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgcGFja0dyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBhY2ssXG4gIHNhdmVBbGxJbnB1dHM6IHRydWUsXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3Qge2F4aXN9ID0gYXR0cnMgYXMge30gYXMgUGFja0F0dHJzO1xuICAgIGNvbnN0IGRlclRlbnNvcnMgPSB1bnN0YWNrKGR5LCBheGlzKTtcbiAgICByZXR1cm4gZGVyVGVuc29ycy5tYXAodCA9PiAoKSA9PiB0KSBhcyB7fTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { PadV2 } from '../kernel_names';\nimport { slice } from '../ops/slice';\nexport const padV2GradConfig = {\n    kernelName: PadV2,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        // Pad introduces values around the original tensor, so the gradient\n        // slices the original shape out of the gradient.\n        const x = saved[0];\n        const { paddings } = attrs;\n        const begin = paddings.map(p => p[0]);\n        return { x: () => slice(dy, begin, x.shape) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFkVjJfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1BhZFYyX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBYSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkMsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFlO0lBQ3pDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxvRUFBb0U7UUFDcEUsaURBQWlEO1FBQ2pELE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNuQixNQUFNLEVBQUMsUUFBUSxFQUFDLEdBQUcsS0FBOEIsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUM5QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtQYWRWMiwgUGFkVjJBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vb3BzL3NsaWNlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgcGFkVjJHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQYWRWMixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICAvLyBQYWQgaW50cm9kdWNlcyB2YWx1ZXMgYXJvdW5kIHRoZSBvcmlnaW5hbCB0ZW5zb3IsIHNvIHRoZSBncmFkaWVudFxuICAgIC8vIHNsaWNlcyB0aGUgb3JpZ2luYWwgc2hhcGUgb3V0IG9mIHRoZSBncmFkaWVudC5cbiAgICBjb25zdCB4ID0gc2F2ZWRbMF07XG4gICAgY29uc3Qge3BhZGRpbmdzfSA9IGF0dHJzIGFzIHVua25vd24gYXMgUGFkVjJBdHRycztcbiAgICBjb25zdCBiZWdpbiA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pO1xuICAgIHJldHVybiB7eDogKCkgPT4gc2xpY2UoZHksIGJlZ2luLCB4LnNoYXBlKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pow } from '../kernel_names';\nimport * as broadcast_util from '../ops/broadcast_util';\nimport { cast } from '../ops/cast';\nimport { greater } from '../ops/greater';\nimport { log } from '../ops/log';\nimport { mul } from '../ops/mul';\nimport { pow } from '../ops/pow';\nimport { reshape } from '../ops/reshape';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nimport { sum } from '../ops/sum';\nimport { where } from '../ops/where';\nimport { zerosLike } from '../ops/zeros_like';\nexport const powGradConfig = {\n    kernelName: Pow,\n    inputsToSave: ['a', 'b'],\n    outputsToSave: [true],\n    gradFunc: (dy, saved) => {\n        const [a, b, y] = saved;\n        const base = a;\n        const exp = b;\n        const outShape = broadcast_util.assertAndGetBroadcastShape(base.shape, exp.shape);\n        const derBase = () => {\n            const expFloat = cast(exp, 'float32');\n            let res = mul(dy, mul(expFloat, pow(base, sub(expFloat, scalar(1)))));\n            const reduceAxes = broadcast_util.getReductionAxes(base.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = sum(res, reduceAxes);\n            }\n            return reshape(res, base.shape);\n        };\n        const derExp = () => {\n            const condition = greater(base, 0);\n            const logBase = where(condition, log(base), zerosLike(base));\n            let res = mul(dy, mul(y, logBase));\n            const reduceAxes = broadcast_util.getReductionAxes(exp.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = sum(res, reduceAxes);\n            }\n            return reshape(res, exp.shape);\n        };\n        return { a: derBase, b: derExp };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG93X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9Qb3dfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxLQUFLLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDdkMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxDQUFDLENBQUM7UUFDZixNQUFNLEdBQUcsR0FBRyxDQUFDLENBQUM7UUFDZCxNQUFNLFFBQVEsR0FDVixjQUFjLENBQUMsMEJBQTBCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckUsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFO1lBQ25CLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdEMsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0RSxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN6RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEMsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxNQUFNLEdBQUcsR0FBRyxFQUFFO1lBQ2xCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDN0QsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbkMsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDeEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUI7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pDLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUMsQ0FBQztJQUNqQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UG93fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0ICogYXMgYnJvYWRjYXN0X3V0aWwgZnJvbSAnLi4vb3BzL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHtncmVhdGVyfSBmcm9tICcuLi9vcHMvZ3JlYXRlcic7XG5pbXBvcnQge2xvZ30gZnJvbSAnLi4vb3BzL2xvZyc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3Bvd30gZnJvbSAnLi4vb3BzL3Bvdyc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7c2NhbGFyfSBmcm9tICcuLi9vcHMvc2NhbGFyJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9vcHMvc3ViJztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9vcHMvc3VtJztcbmltcG9ydCB7d2hlcmV9IGZyb20gJy4uL29wcy93aGVyZSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBwb3dHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQb3csXG4gIGlucHV0c1RvU2F2ZTogWydhJywgJ2InXSxcbiAgb3V0cHV0c1RvU2F2ZTogW3RydWVdLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFthLCBiLCB5XSA9IHNhdmVkO1xuICAgIGNvbnN0IGJhc2UgPSBhO1xuICAgIGNvbnN0IGV4cCA9IGI7XG4gICAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShiYXNlLnNoYXBlLCBleHAuc2hhcGUpO1xuXG4gICAgY29uc3QgZGVyQmFzZSA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGV4cEZsb2F0ID0gY2FzdChleHAsICdmbG9hdDMyJyk7XG4gICAgICBsZXQgcmVzID0gbXVsKGR5LCBtdWwoZXhwRmxvYXQsIHBvdyhiYXNlLCBzdWIoZXhwRmxvYXQsIHNjYWxhcigxKSkpKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gYnJvYWRjYXN0X3V0aWwuZ2V0UmVkdWN0aW9uQXhlcyhiYXNlLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBiYXNlLnNoYXBlKTtcbiAgICB9O1xuICAgIGNvbnN0IGRlckV4cCA9ICgpID0+IHtcbiAgICAgIGNvbnN0IGNvbmRpdGlvbiA9IGdyZWF0ZXIoYmFzZSwgMCk7XG4gICAgICBjb25zdCBsb2dCYXNlID0gd2hlcmUoY29uZGl0aW9uLCBsb2coYmFzZSksIHplcm9zTGlrZShiYXNlKSk7XG4gICAgICBsZXQgcmVzID0gbXVsKGR5LCBtdWwoeSwgbG9nQmFzZSkpO1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoZXhwLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHN1bShyZXMsIHJlZHVjZUF4ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBleHAuc2hhcGUpO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJCYXNlLCBiOiBkZXJFeHB9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Prelu } from '../kernel_names';\nimport { getReductionAxes } from '../ops/broadcast_util';\nimport { greater } from '../ops/greater';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nimport { where } from '../ops/where';\nimport { zerosLike } from '../ops/zeros_like';\nexport const preluGradConfig = {\n    kernelName: Prelu,\n    inputsToSave: ['x', 'alpha'],\n    gradFunc: (dy, saved) => {\n        const [x, alpha] = saved;\n        const mask = greater(x, 0);\n        return {\n            x: () => where(mask, dy, mul(dy, alpha)),\n            alpha: () => {\n                let res = where(mask, zerosLike(dy), mul(dy, x));\n                const reduceAxes = getReductionAxes(alpha.shape, dy.shape);\n                if (reduceAxes.length > 0) {\n                    res = sum(res, reduceAxes);\n                }\n                return reshape(res, alpha.shape);\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlbHVfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1ByZWx1X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBZTtJQUN6QyxVQUFVLEVBQUUsS0FBSztJQUNqQixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDO0lBQzVCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRTNCLE9BQU87WUFDTCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUN4QyxLQUFLLEVBQUUsR0FBRyxFQUFFO2dCQUNWLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDakQsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQzNELElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7b0JBQ3pCLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxDQUFDO2lCQUM1QjtnQkFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ25DLENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1ByZWx1fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtnZXRSZWR1Y3Rpb25BeGVzfSBmcm9tICcuLi9vcHMvYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtncmVhdGVyfSBmcm9tICcuLi9vcHMvZ3JlYXRlcic7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7c3VtfSBmcm9tICcuLi9vcHMvc3VtJztcbmltcG9ydCB7d2hlcmV9IGZyb20gJy4uL29wcy93aGVyZSc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBwcmVsdUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFByZWx1LFxuICBpbnB1dHNUb1NhdmU6IFsneCcsICdhbHBoYSddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4LCBhbHBoYV0gPSBzYXZlZDtcbiAgICBjb25zdCBtYXNrID0gZ3JlYXRlcih4LCAwKTtcblxuICAgIHJldHVybiB7XG4gICAgICB4OiAoKSA9PiB3aGVyZShtYXNrLCBkeSwgbXVsKGR5LCBhbHBoYSkpLFxuICAgICAgYWxwaGE6ICgpID0+IHtcbiAgICAgICAgbGV0IHJlcyA9IHdoZXJlKG1hc2ssIHplcm9zTGlrZShkeSksIG11bChkeSwgeCkpO1xuICAgICAgICBjb25zdCByZWR1Y2VBeGVzID0gZ2V0UmVkdWN0aW9uQXhlcyhhbHBoYS5zaGFwZSwgZHkuc2hhcGUpO1xuICAgICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgcmVzID0gc3VtKHJlcywgcmVkdWNlQXhlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc2hhcGUocmVzLCBhbHBoYS5zaGFwZSk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '../base';\nimport { Prod } from '../kernel_names';\nimport { cumprod } from '../ops/cumprod';\nimport { mul } from '../ops/mul';\nimport { reshape } from '../ops/reshape';\nimport { transpose } from '../ops/transpose';\n// Gradient for product operation on a single axis.\nfunction prodGradFn_(x, dy, axis) {\n    // The gradient tensor (dy) has a set of axes removed, so we create re-shaped\n    // versions (of size 1) for the removed axis; this supports broadcasting over\n    // those dimensions.\n    const expandedYShape = x.shape.slice();\n    expandedYShape[axis] = 1;\n    // The actual gradient computation.\n    const expandedDy = reshape(dy, expandedYShape);\n    const xCumProd = cumprod(x, axis, true, false);\n    const xCumRevProd = cumprod(x, axis, true, true);\n    const dx = mul(xCumProd, xCumRevProd);\n    return mul(expandedDy, dx);\n}\n// Support gradients when the product is done on many axes at once.\n// This done py pushing all the axes on which the product is applied into a\n// single axis.\nfunction prodsGradFn_(x, dy, axis) {\n    // Move all axes for doing prod over to the end of the tensor.\n    const xRank = x.shape.length;\n    const finalProdAxis = xRank - axis.length;\n    const xPermutation = backend_util.getAxesPermutation(axis, xRank);\n    let permutedX = x;\n    if (xPermutation != null) {\n        permutedX = transpose(x, xPermutation);\n    }\n    // Reshape all the prod dimensions into a single one, and do compute prod\n    // gradients on that.\n    const newShape = permutedX.shape.slice();\n    const removedShape = newShape.splice(xRank - axis.length, axis.length);\n    const endPartShape = removedShape.reduce((p, c) => p * c, 1);\n    newShape.push(endPartShape);\n    const reshapedPermutedX = permutedX.reshape(newShape);\n    let prodGrad = prodGradFn_(reshapedPermutedX, dy, finalProdAxis);\n    // Undo the re-shaping now we have the dx vector, and permute back to\n    // original axes order.\n    prodGrad = prodGrad.reshape(permutedX.shape);\n    if (xPermutation != null) {\n        const undoPermutation = backend_util.getUndoAxesPermutation(xPermutation);\n        prodGrad = transpose(prodGrad, undoPermutation);\n    }\n    return prodGrad;\n}\n// Running example:\n// [\n//   [\n//     [3.0, 4.0],\n//     [5.0, 6.0],\n//     [7.0, 8.0]\n//   ],\n//   [\n//     [3.0, 5.0],\n//     [0.0, 6.0],\n//     [5.0, 6.0]\n//   ]\n// ]\n//\nexport const prodGradConfig = {\n    kernelName: Prod,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { axis } = attrs;\n        let axisArr = [];\n        if (axis === undefined || axis === null) {\n            axisArr = x.shape.map((_, i) => i);\n        }\n        else if (typeof axis === 'number') {\n            axisArr = [axis];\n        }\n        else {\n            axisArr = axis;\n        }\n        return { x: () => prodsGradFn_(x, dy, axisArr) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUHJvZF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDckMsT0FBTyxFQUFDLElBQUksRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFHM0MsbURBQW1EO0FBQ25ELFNBQVMsV0FBVyxDQUFDLENBQVMsRUFBRSxFQUFVLEVBQUUsSUFBWTtJQUN0RCw2RUFBNkU7SUFDN0UsNkVBQTZFO0lBQzdFLG9CQUFvQjtJQUNwQixNQUFNLGNBQWMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQ3ZDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFekIsbUNBQW1DO0lBQ25DLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxFQUFFLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFDL0MsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQy9DLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUUsR0FBRyxHQUFHLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3RDLE9B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O1lBQ0wsT0FBTyxHQUFHLElBQUksQ0FBQztTQUNoQjtRQUNELE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUMsRUFBRSxFQUFZLEVBQUUsT0FBTyxDQUFDLEVBQUMsQ0FBQztJQUMzRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJy4uL2Jhc2UnO1xuaW1wb3J0IHtQcm9kLCBQcm9kQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y3VtcHJvZH0gZnJvbSAnLi4vb3BzL2N1bXByb2QnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi4vb3BzL3RyYW5zcG9zZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuLy8gR3JhZGllbnQgZm9yIHByb2R1Y3Qgb3BlcmF0aW9uIG9uIGEgc2luZ2xlIGF4aXMuXG5mdW5jdGlvbiBwcm9kR3JhZEZuXyh4OiBUZW5zb3IsIGR5OiBUZW5zb3IsIGF4aXM6IG51bWJlcik6IFRlbnNvciB7XG4gIC8vIFRoZSBncmFkaWVudCB0ZW5zb3IgKGR5KSBoYXMgYSBzZXQgb2YgYXhlcyByZW1vdmVkLCBzbyB3ZSBjcmVhdGUgcmUtc2hhcGVkXG4gIC8vIHZlcnNpb25zIChvZiBzaXplIDEpIGZvciB0aGUgcmVtb3ZlZCBheGlzOyB0aGlzIHN1cHBvcnRzIGJyb2FkY2FzdGluZyBvdmVyXG4gIC8vIHRob3NlIGRpbWVuc2lvbnMuXG4gIGNvbnN0IGV4cGFuZGVkWVNoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICBleHBhbmRlZFlTaGFwZVtheGlzXSA9IDE7XG5cbiAgLy8gVGhlIGFjdHVhbCBncmFkaWVudCBjb21wdXRhdGlvbi5cbiAgY29uc3QgZXhwYW5kZWREeSA9IHJlc2hhcGUoZHksIGV4cGFuZGVkWVNoYXBlKTtcbiAgY29uc3QgeEN1bVByb2QgPSBjdW1wcm9kKHgsIGF4aXMsIHRydWUsIGZhbHNlKTtcbiAgY29uc3QgeEN1bVJldlByb2QgPSBjdW1wcm9kKHgsIGF4aXMsIHRydWUsIHRydWUpO1xuICBjb25zdCBkeCA9IG11bCh4Q3VtUHJvZCwgeEN1bVJldlByb2QpO1xuICByZXR1cm4gbXVsKGV4cGFuZGVkRHksIGR4KTtcbn1cblxuLy8gU3VwcG9ydCBncmFkaWVudHMgd2hlbiB0aGUgcHJvZHVjdCBpcyBkb25lIG9uIG1hbnkgYXhlcyBhdCBvbmNlLlxuLy8gVGhpcyBkb25lIHB5IHB1c2hpbmcgYWxsIHRoZSBheGVzIG9uIHdoaWNoIHRoZSBwcm9kdWN0IGlzIGFwcGxpZWQgaW50byBhXG4vLyBzaW5nbGUgYXhpcy5cbmZ1bmN0aW9uIHByb2RzR3JhZEZuXyh4OiBUZW5zb3IsIGR5OiBUZW5zb3IsIGF4aXM6IG51bWJlcltdKTogVGVuc29yIHtcbiAgLy8gTW92ZSBhbGwgYXhlcyBmb3IgZG9pbmcgcHJvZCBvdmVyIHRvIHRoZSBlbmQgb2YgdGhlIHRlbnNvci5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgZmluYWxQcm9kQXhpcyA9IHhSYW5rIC0gYXhpcy5sZW5ndGg7XG4gIGNvbnN0IHhQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhpcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHhQZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHgsIHhQZXJtdXRhdGlvbik7XG4gIH1cblxuICAvLyBSZXNoYXBlIGFsbCB0aGUgcHJvZCBkaW1lbnNpb25zIGludG8gYSBzaW5nbGUgb25lLCBhbmQgZG8gY29tcHV0ZSBwcm9kXG4gIC8vIGdyYWRpZW50cyBvbiB0aGF0LlxuICBjb25zdCBuZXdTaGFwZSA9IHBlcm11dGVkWC5zaGFwZS5zbGljZSgpO1xuICBjb25zdCByZW1vdmVkU2hhcGUgPSBuZXdTaGFwZS5zcGxpY2UoeFJhbmsgLSBheGlzLmxlbmd0aCwgYXhpcy5sZW5ndGgpO1xuICBjb25zdCBlbmRQYXJ0U2hhcGUgPSByZW1vdmVkU2hhcGUucmVkdWNlKChwLCBjKSA9PiBwICogYywgMSk7XG4gIG5ld1NoYXBlLnB1c2goZW5kUGFydFNoYXBlKTtcbiAgY29uc3QgcmVzaGFwZWRQZXJtdXRlZFggPSBwZXJtdXRlZFgucmVzaGFwZShuZXdTaGFwZSk7XG4gIGxldCBwcm9kR3JhZCA9IHByb2RHcmFkRm5fKHJlc2hhcGVkUGVybXV0ZWRYLCBkeSwgZmluYWxQcm9kQXhpcyk7XG5cbiAgLy8gVW5kbyB0aGUgcmUtc2hhcGluZyBub3cgd2UgaGF2ZSB0aGUgZHggdmVjdG9yLCBhbmQgcGVybXV0ZSBiYWNrIHRvXG4gIC8vIG9yaWdpbmFsIGF4ZXMgb3JkZXIuXG4gIHByb2RHcmFkID0gcHJvZEdyYWQucmVzaGFwZShwZXJtdXRlZFguc2hhcGUpO1xuICBpZiAoeFBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICBjb25zdCB1bmRvUGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0VW5kb0F4ZXNQZXJtdXRhdGlvbih4UGVybXV0YXRpb24pO1xuICAgIHByb2RHcmFkID0gdHJhbnNwb3NlKHByb2RHcmFkLCB1bmRvUGVybXV0YXRpb24pO1xuICB9XG4gIHJldHVybiBwcm9kR3JhZDtcbn1cblxuLy8gUnVubmluZyBleGFtcGxlOlxuLy8gW1xuLy8gICBbXG4vLyAgICAgWzMuMCwgNC4wXSxcbi8vICAgICBbNS4wLCA2LjBdLFxuLy8gICAgIFs3LjAsIDguMF1cbi8vICAgXSxcbi8vICAgW1xuLy8gICAgIFszLjAsIDUuMF0sXG4vLyAgICAgWzAuMCwgNi4wXSxcbi8vICAgICBbNS4wLCA2LjBdXG4vLyAgIF1cbi8vIF1cbi8vXG5leHBvcnQgY29uc3QgcHJvZEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFByb2QsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcnxUZW5zb3JbXSwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgY29uc3Qge2F4aXN9ID0gKGF0dHJzIGFzIHt9KSBhcyBQcm9kQXR0cnM7XG4gICAgbGV0IGF4aXNBcnIgPSBbXSBhcyBudW1iZXJbXTtcbiAgICBpZiAoYXhpcyA9PT0gdW5kZWZpbmVkIHx8IGF4aXMgPT09IG51bGwpIHtcbiAgICAgIGF4aXNBcnIgPSB4LnNoYXBlLm1hcCgoXywgaSkgPT4gaSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXhpcyA9PT0gJ251bWJlcicpIHtcbiAgICAgIGF4aXNBcnIgPSBbYXhpc107XG4gICAgfSBlbHNlIHtcbiAgICAgIGF4aXNBcnIgPSBheGlzO1xuICAgIH1cbiAgICByZXR1cm4ge3g6ICgpID0+IHByb2RzR3JhZEZuXyh4LCBkeSBhcyBUZW5zb3IsIGF4aXNBcnIpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RealDiv } from '../kernel_names';\nimport * as broadcast_util from '../ops/broadcast_util';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { square } from '../ops/square';\nimport { sum } from '../ops/sum';\nexport const divGradConfig = {\n    kernelName: RealDiv,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const outShape = broadcast_util.assertAndGetBroadcastShape(a.shape, b.shape);\n        const derA = () => {\n            const res = div(dy, cast(b, 'float32'));\n            const reduceAxes = broadcast_util.getReductionAxes(a.shape, outShape);\n            if (reduceAxes.length > 0) {\n                return reshape(sum(res, reduceAxes), a.shape);\n            }\n            return res;\n        };\n        const derB = () => {\n            let res = mul(dy, cast(a, 'float32'));\n            const reduceAxes = broadcast_util.getReductionAxes(b.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = reshape(sum(res, reduceAxes), b.shape);\n            }\n            const tmp = square(b);\n            return neg(div(res, cast(tmp, 'float32')));\n        };\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbERpdl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmVhbERpdl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEtBQUssY0FBYyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWU7SUFDdkMsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDckIsTUFBTSxRQUFRLEdBQ1YsY0FBYyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUN4QyxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixPQUFPLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUMvQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDO1FBQ0YsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1lBQ3RDLE1BQU0sVUFBVSxHQUFHLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3RFLElBQUksVUFBVSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7Z0JBQ3pCLEdBQUcsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDOUM7WUFDRCxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3QyxDQUFDLENBQUM7UUFDRixPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UmVhbERpdn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCAqIGFzIGJyb2FkY2FzdF91dGlsIGZyb20gJy4uL29wcy9icm9hZGNhc3RfdXRpbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtzcXVhcmV9IGZyb20gJy4uL29wcy9zcXVhcmUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4uL29wcy9zdW0nO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBkaXZHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWFsRGl2LFxuICBpbnB1dHNUb1NhdmU6IFsnYScsICdiJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW2EsIGJdID0gc2F2ZWQ7XG4gICAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgICBicm9hZGNhc3RfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICBjb25zdCBkZXJBID0gKCkgPT4ge1xuICAgICAgY29uc3QgcmVzID0gZGl2KGR5LCBjYXN0KGIsICdmbG9hdDMyJykpO1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYS5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gcmVzaGFwZShzdW0ocmVzLCByZWR1Y2VBeGVzKSwgYS5zaGFwZSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH07XG4gICAgY29uc3QgZGVyQiA9ICgpID0+IHtcbiAgICAgIGxldCByZXMgPSBtdWwoZHksIGNhc3QoYSwgJ2Zsb2F0MzInKSk7XG4gICAgICBjb25zdCByZWR1Y2VBeGVzID0gYnJvYWRjYXN0X3V0aWwuZ2V0UmVkdWN0aW9uQXhlcyhiLnNoYXBlLCBvdXRTaGFwZSk7XG4gICAgICBpZiAocmVkdWNlQXhlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJlcyA9IHJlc2hhcGUoc3VtKHJlcywgcmVkdWNlQXhlcyksIGIuc2hhcGUpO1xuICAgICAgfVxuICAgICAgY29uc3QgdG1wID0gc3F1YXJlKGIpO1xuICAgICAgcmV0dXJuIG5lZyhkaXYocmVzLCBjYXN0KHRtcCwgJ2Zsb2F0MzInKSkpO1xuICAgIH07XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reciprocal } from '../kernel_names';\nimport { div } from '../ops/div';\nimport { neg } from '../ops/neg';\nimport { square } from '../ops/square';\nexport const reciprocalGradConfig = {\n    kernelName: Reciprocal,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => div(dy, neg(square(x))) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjaXByb2NhbF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmVjaXByb2NhbF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBZTtJQUM5QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFDbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFDLENBQUM7SUFDNUMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UmVjaXByb2NhbH0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7bmVnfSBmcm9tICcuLi9vcHMvbmVnJztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgcmVjaXByb2NhbEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlY2lwcm9jYWwsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBkaXYoZHksIG5lZyhzcXVhcmUoeCkpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu6 } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { lessEqual } from '../ops/less_equal';\nimport { mul } from '../ops/mul';\nimport { step } from '../ops/step';\nexport const relu6GradConfig = {\n    kernelName: Relu6,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        const mask = mul(lessEqual(x, 6), step(x));\n        return { x: () => mul(dy, cast(mask, 'float32')) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdTZfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1JlbHU2X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUdqQyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTNDLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UmVsdTZ9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7bGVzc0VxdWFsfSBmcm9tICcuLi9vcHMvbGVzc19lcXVhbCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3N0ZXB9IGZyb20gJy4uL29wcy9zdGVwJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgcmVsdTZHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWx1NixcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCBtYXNrID0gbXVsKGxlc3NFcXVhbCh4LCA2KSwgc3RlcCh4KSk7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChkeSwgY2FzdChtYXNrLCAnZmxvYXQzMicpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nimport { step } from '../ops/step';\nexport const reluGradConfig = {\n    kernelName: Relu,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(dy, cast(step(x), 'float32')) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmVsdV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUdqQyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UmVsdX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzdGVwfSBmcm9tICcuLi9vcHMvc3RlcCc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHJlbHVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWx1LFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gbXVsKGR5LCBjYXN0KHN0ZXAoeCksICdmbG9hdDMyJykpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reshape } from '../kernel_names';\nimport { reshape } from '../ops/reshape';\nexport const reshapeGradConfig = {\n    kernelName: Reshape,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => reshape(dy, x.shape) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaGFwZV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmVzaGFwZV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHdkMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWU7SUFDM0MsVUFBVSxFQUFFLE9BQU87SUFDbkIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUMsQ0FBQztJQUN6QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UmVzaGFwZX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCByZXNoYXBlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaGFwZSxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICByZXR1cm4ge3g6ICgpID0+IHJlc2hhcGUoZHksIHguc2hhcGUpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ResizeBilinear, ResizeBilinearGrad } from '../kernel_names';\nexport const resizeBilinearGradConfig = {\n    kernelName: ResizeBilinear,\n    inputsToSave: ['images'],\n    gradFunc: (dy, saved, attrs) => {\n        const [images] = saved;\n        const inputs = { dy, images };\n        const imagesDer = () => \n        // tslint:disable-next-line: no-unnecessary-type-assertion\n        ENGINE.runKernel(ResizeBilinearGrad, inputs, attrs);\n        return { images: imagesDer };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXJfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1Jlc2l6ZUJpbGluZWFyX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqQyxPQUFPLEVBQUMsY0FBYyxFQUFFLGtCQUFrQixFQUEyQixNQUFNLGlCQUFpQixDQUFDO0FBTTdGLE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFlO0lBQ2xELFVBQVUsRUFBRSxjQUFjO0lBQzFCLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUE2QixFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUN0RCxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7UUFDbkIsMERBQTBEO1FBQzFELE1BQU0sQ0FBQyxTQUFTLENBQ1osa0JBQWtCLEVBQUUsTUFBOEIsRUFBRSxLQUFLLENBQ3JELENBQUM7UUFFYixPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQzdCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1Jlc2l6ZUJpbGluZWFyLCBSZXNpemVCaWxpbmVhckdyYWQsIFJlc2l6ZUJpbGluZWFyR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXIsXG4gIGlucHV0c1RvU2F2ZTogWydpbWFnZXMnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yNEQsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IFtpbWFnZXNdID0gc2F2ZWQ7XG5cbiAgICBjb25zdCBpbnB1dHM6IFJlc2l6ZUJpbGluZWFyR3JhZElucHV0cyA9IHtkeSwgaW1hZ2VzfTtcbiAgICBjb25zdCBpbWFnZXNEZXIgPSAoKSA9PlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICBSZXNpemVCaWxpbmVhckdyYWQsIGlucHV0cyBhcyB7fSBhcyBOYW1lZFRlbnNvck1hcCwgYXR0cnMpIGFzXG4gICAgICAgIFRlbnNvcjREO1xuXG4gICAgcmV0dXJuIHtpbWFnZXM6IGltYWdlc0Rlcn07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ENGINE } from '../engine';\nimport { ResizeNearestNeighbor, ResizeNearestNeighborGrad } from '../kernel_names';\nexport const resizeNearestNeighborGradConfig = {\n    kernelName: ResizeNearestNeighbor,\n    inputsToSave: ['images'],\n    gradFunc: (dy, saved, attrs) => {\n        const [images] = saved;\n        const inputs = { dy, images };\n        const imagesDer = () => \n        // tslint:disable-next-line: no-unnecessary-type-assertion\n        ENGINE.runKernel(ResizeNearestNeighborGrad, inputs, attrs);\n        return { images: imagesDer };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9SZXNpemVOZWFyZXN0TmVpZ2hib3JfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxxQkFBcUIsRUFBRSx5QkFBeUIsRUFBa0MsTUFBTSxpQkFBaUIsQ0FBQztBQU1sSCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBZTtJQUN6RCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFlBQVksRUFBRSxDQUFDLFFBQVEsQ0FBQztJQUN4QixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFvQyxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsQ0FBQztRQUM3RCxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUU7UUFDbkIsMERBQTBEO1FBQzFELE1BQU0sQ0FBQyxTQUFTLENBQ1oseUJBQXlCLEVBQUUsTUFBOEIsRUFBRSxLQUFLLENBQzVELENBQUM7UUFFYixPQUFPLEVBQUMsTUFBTSxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQzdCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFTkdJTkV9IGZyb20gJy4uL2VuZ2luZSc7XG5pbXBvcnQge1Jlc2l6ZU5lYXJlc3ROZWlnaGJvciwgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCwgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7TmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtOYW1lZFRlbnNvck1hcH0gZnJvbSAnLi4vdGVuc29yX3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgaW5wdXRzVG9TYXZlOiBbJ2ltYWdlcyddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3I0RCwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW2ltYWdlc10gPSBzYXZlZDtcblxuICAgIGNvbnN0IGlucHV0czogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cyA9IHtkeSwgaW1hZ2VzfTtcbiAgICBjb25zdCBpbWFnZXNEZXIgPSAoKSA9PlxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICAgIEVOR0lORS5ydW5LZXJuZWwoXG4gICAgICAgICAgICBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLCBpbnB1dHMgYXMge30gYXMgTmFtZWRUZW5zb3JNYXAsIGF0dHJzKSBhc1xuICAgICAgICBUZW5zb3I0RDtcblxuICAgIHJldHVybiB7aW1hZ2VzOiBpbWFnZXNEZXJ9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reverse } from '../kernel_names';\nimport { reverse } from '../ops/reverse';\nimport { parseAxisParam } from '../util';\nexport const reverseGradConfig = {\n    kernelName: Reverse,\n    gradFunc: (dy, saved, attrs) => {\n        const { dims } = attrs;\n        const axes = parseAxisParam(dims, dy.shape);\n        return { x: () => reverse(dy, axes) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmV2ZXJzZV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvUmV2ZXJzZV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFdkMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV2QyxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZTtJQUMzQyxVQUFVLEVBQUUsT0FBTztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBMkIsQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7UmV2ZXJzZSwgUmV2ZXJzZUF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3JldmVyc2V9IGZyb20gJy4uL29wcy9yZXZlcnNlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuaW1wb3J0IHtwYXJzZUF4aXNQYXJhbX0gZnJvbSAnLi4vdXRpbCc7XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmV2ZXJzZSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7ZGltc30gPSBhdHRycyBhcyB7fSBhcyBSZXZlcnNlQXR0cnM7XG4gICAgY29uc3QgYXhlcyA9IHBhcnNlQXhpc1BhcmFtKGRpbXMsIGR5LnNoYXBlKTtcbiAgICByZXR1cm4ge3g6ICgpID0+IHJldmVyc2UoZHksIGF4ZXMpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Round } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const roundGradConfig = {\n    kernelName: Round,\n    gradFunc: (dy) => {\n        // TODO(nsthorat): Let gradients be null for cases where we want to stop\n        // backpropgation.\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91bmRfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1JvdW5kX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUc1QyxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWU7SUFDekMsVUFBVSxFQUFFLEtBQUs7SUFDakIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEVBQUU7UUFDdkIsd0VBQXdFO1FBQ3hFLGtCQUFrQjtRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ2xDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1JvdW5kfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgcm91bmRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSb3VuZCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yKSA9PiB7XG4gICAgLy8gVE9ETyhuc3Rob3JhdCk6IExldCBncmFkaWVudHMgYmUgbnVsbCBmb3IgY2FzZXMgd2hlcmUgd2Ugd2FudCB0byBzdG9wXG4gICAgLy8gYmFja3Byb3BnYXRpb24uXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Rsqrt } from '../kernel_names';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { neg } from '../ops/neg';\nimport { pow } from '../ops/pow';\nexport const rsqrtGradConfig = {\n    kernelName: Rsqrt,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => neg(div(dy, mul(pow(x, 1.5), 2))) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnNxcnRfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1JzcXJ0X2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXRDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHL0IsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFlO0lBQ3pDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ3RELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1JzcXJ0fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4uL29wcy9kaXYnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtuZWd9IGZyb20gJy4uL29wcy9uZWcnO1xuaW1wb3J0IHtwb3d9IGZyb20gJy4uL29wcy9wb3cnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCByc3FydEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gbmVnKGRpdihkeSwgbXVsKHBvdyh4LCAxLjUpLCAyKSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Select } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { logicalNot } from '../ops/logical_not';\nimport { mul } from '../ops/mul';\nimport { zerosLike } from '../ops/zeros_like';\nexport const selectGradConfig = {\n    kernelName: Select,\n    inputsToSave: ['condition'],\n    gradFunc: (dy, saved) => {\n        const [condition] = saved;\n        return {\n            // TODO(julianoks): Return null for condition gradient\n            // when backprop supports it.\n            condition: () => cast(zerosLike(condition), 'float32'),\n            t: () => mul(dy, cast(condition, dy.dtype)),\n            e: () => mul(dy, cast(logicalNot(condition), dy.dtype))\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0X2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TZWxlY3RfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWU7SUFDMUMsVUFBVSxFQUFFLE1BQU07SUFDbEIsWUFBWSxFQUFFLENBQUMsV0FBVyxDQUFDO0lBQzNCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQzFCLE9BQU87WUFDTCxzREFBc0Q7WUFDdEQsNkJBQTZCO1lBQzdCLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsQ0FBQztZQUN0RCxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMzQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4RCxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2VsZWN0fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2xvZ2ljYWxOb3R9IGZyb20gJy4uL29wcy9sb2dpY2FsX25vdCc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi4vb3BzL3plcm9zX2xpa2UnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTZWxlY3QsXG4gIGlucHV0c1RvU2F2ZTogWydjb25kaXRpb24nXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbY29uZGl0aW9uXSA9IHNhdmVkO1xuICAgIHJldHVybiB7XG4gICAgICAvLyBUT0RPKGp1bGlhbm9rcyk6IFJldHVybiBudWxsIGZvciBjb25kaXRpb24gZ3JhZGllbnRcbiAgICAgIC8vIHdoZW4gYmFja3Byb3Agc3VwcG9ydHMgaXQuXG4gICAgICBjb25kaXRpb246ICgpID0+IGNhc3QoemVyb3NMaWtlKGNvbmRpdGlvbiksICdmbG9hdDMyJyksXG4gICAgICB0OiAoKSA9PiBtdWwoZHksIGNhc3QoY29uZGl0aW9uLCBkeS5kdHlwZSkpLFxuICAgICAgZTogKCkgPT4gbXVsKGR5LCBjYXN0KGxvZ2ljYWxOb3QoY29uZGl0aW9uKSwgZHkuZHR5cGUpKVxuICAgIH07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Selu } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { exp } from '../ops/exp';\nimport { greater } from '../ops/greater';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { SELU_SCALE, SELU_SCALEALPHA } from '../ops/selu_util';\nimport { where } from '../ops/where';\nexport const seluGradConfig = {\n    kernelName: Selu,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return {\n            x: () => {\n                const mask = greater(x, scalar(0));\n                const scaleAlpha = scalar(SELU_SCALEALPHA);\n                const scale = scalar(SELU_SCALE);\n                const greaterThanZeroDer = mul(dy, scale);\n                const lessEqualZeroDer = mul(mul(dy, scaleAlpha), exp(cast(x, 'float32')));\n                return where(mask, greaterThanZeroDer, lessEqualZeroDer);\n            }\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsdV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU2VsdV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsVUFBVSxFQUFFLGVBQWUsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzdELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFHbkMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPO1lBQ0wsQ0FBQyxFQUFFLEdBQUcsRUFBRTtnQkFDTixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVuQyxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLENBQUM7Z0JBQzNDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFFakMsTUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDO2dCQUMxQyxNQUFNLGdCQUFnQixHQUNsQixHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxVQUFVLENBQUMsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRXRELE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxrQkFBa0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1lBQzNELENBQUM7U0FDRixDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge1NlbHV9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7ZXhwfSBmcm9tICcuLi9vcHMvZXhwJztcbmltcG9ydCB7Z3JlYXRlcn0gZnJvbSAnLi4vb3BzL2dyZWF0ZXInO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtTRUxVX1NDQUxFLCBTRUxVX1NDQUxFQUxQSEF9IGZyb20gJy4uL29wcy9zZWx1X3V0aWwnO1xuaW1wb3J0IHt3aGVyZX0gZnJvbSAnLi4vb3BzL3doZXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc2VsdUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNlbHUsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHtcbiAgICAgIHg6ICgpID0+IHtcbiAgICAgICAgY29uc3QgbWFzayA9IGdyZWF0ZXIoeCwgc2NhbGFyKDApKTtcblxuICAgICAgICBjb25zdCBzY2FsZUFscGhhID0gc2NhbGFyKFNFTFVfU0NBTEVBTFBIQSk7XG4gICAgICAgIGNvbnN0IHNjYWxlID0gc2NhbGFyKFNFTFVfU0NBTEUpO1xuXG4gICAgICAgIGNvbnN0IGdyZWF0ZXJUaGFuWmVyb0RlciA9IG11bChkeSwgc2NhbGUpO1xuICAgICAgICBjb25zdCBsZXNzRXF1YWxaZXJvRGVyID1cbiAgICAgICAgICAgIG11bChtdWwoZHksIHNjYWxlQWxwaGEpLCBleHAoY2FzdCh4LCAnZmxvYXQzMicpKSk7XG5cbiAgICAgICAgcmV0dXJuIHdoZXJlKG1hc2ssIGdyZWF0ZXJUaGFuWmVyb0RlciwgbGVzc0VxdWFsWmVyb0Rlcik7XG4gICAgICB9XG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sigmoid } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nexport const sigmoidGradConfig = {\n    kernelName: Sigmoid,\n    outputsToSave: [true],\n    gradFunc: (dy, saved) => {\n        const [y] = saved;\n        return { x: () => mul(dy, mul(y, sub(scalar(1), y))) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbW9pZF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU2lnbW9pZF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZTtJQUMzQyxVQUFVLEVBQUUsT0FBTztJQUNuQixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN2RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTaWdtb2lkfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4uL29wcy9zdWInO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzaWdtb2lkR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2lnbW9pZCxcbiAgb3V0cHV0c1RvU2F2ZTogW3RydWVdLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt5XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiBtdWwoZHksIG11bCh5LCBzdWIoc2NhbGFyKDEpLCB5KSkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sign } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const signGradConfig = {\n    kernelName: Sign,\n    gradFunc: (dy) => {\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbl9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU2lnbl9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2lnbn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHNpZ25HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTaWduLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZShkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sin } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { cos } from '../ops/cos';\nimport { mul } from '../ops/mul';\nexport const sinGradConfig = {\n    kernelName: Sin,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(cos(cast(x, 'float32')), dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TaW5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHL0IsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTaW59IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL29wcy9jYXN0JztcbmltcG9ydCB7Y29zfSBmcm9tICcuLi9vcHMvY29zJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc2luR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2luLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuICAgIHJldHVybiB7eDogKCkgPT4gbXVsKGNvcyhjYXN0KHgsICdmbG9hdDMyJykpLCBkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sinh } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { cosh } from '../ops/cosh';\nimport { mul } from '../ops/mul';\nexport const sinhGradConfig = {\n    kernelName: Sinh,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(cosh(cast(x, 'float32')), dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luaF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU2luaF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDakMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWU7SUFDeEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTaW5ofSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Nvc2h9IGZyb20gJy4uL29wcy9jb3NoJztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc2luaEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpbmgsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChjb3NoKGNhc3QoeCwgJ2Zsb2F0MzInKSksIGR5KX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Slice } from '../kernel_names';\nimport { pad } from '../ops/pad';\nimport { parseSliceParams } from '../ops/slice_util';\nexport const sliceGradConfig = {\n    kernelName: Slice,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { begin, size } = attrs;\n        const inputShape = x.shape;\n        const [begin_, size_] = parseSliceParams(x, begin, size);\n        // Create an Nx2 padding where the first column represents how many\n        // zeros are prepended (at start) for each dimension, and the second\n        // column indicates how many zeros are appended (at end).\n        // The number of zeros to append is the shape of the input\n        // elementwise-subtracted by both the begin vector and sizes vector.\n        const paddings = [];\n        for (let i = 0; i < dy.rank; i++) {\n            paddings.push([begin_[i], inputShape[i] - begin_[i] - size_[i]]);\n        }\n        return { x: () => pad(dy, paddings) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpY2VfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1NsaWNlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBYSxNQUFNLGlCQUFpQixDQUFDO0FBRWxELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHbkQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFlO0lBQ3pDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBeUIsQ0FBQztRQUVoRCxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQzNCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV6RCxtRUFBbUU7UUFDbkUsb0VBQW9FO1FBQ3BFLHlEQUF5RDtRQUV6RCwwREFBMEQ7UUFDMUQsb0VBQW9FO1FBQ3BFLE1BQU0sUUFBUSxHQUE0QixFQUFFLENBQUM7UUFDN0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDbEU7UUFDRCxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLEVBQUMsQ0FBQztJQUN0QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTbGljZSwgU2xpY2VBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtwYWR9IGZyb20gJy4uL29wcy9wYWQnO1xuaW1wb3J0IHtwYXJzZVNsaWNlUGFyYW1zfSBmcm9tICcuLi9vcHMvc2xpY2VfdXRpbCc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHNsaWNlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2xpY2UsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgY29uc3Qge2JlZ2luLCBzaXplfSA9IGF0dHJzIGFzIHt9IGFzIFNsaWNlQXR0cnM7XG5cbiAgICBjb25zdCBpbnB1dFNoYXBlID0geC5zaGFwZTtcbiAgICBjb25zdCBbYmVnaW5fLCBzaXplX10gPSBwYXJzZVNsaWNlUGFyYW1zKHgsIGJlZ2luLCBzaXplKTtcblxuICAgIC8vIENyZWF0ZSBhbiBOeDIgcGFkZGluZyB3aGVyZSB0aGUgZmlyc3QgY29sdW1uIHJlcHJlc2VudHMgaG93IG1hbnlcbiAgICAvLyB6ZXJvcyBhcmUgcHJlcGVuZGVkIChhdCBzdGFydCkgZm9yIGVhY2ggZGltZW5zaW9uLCBhbmQgdGhlIHNlY29uZFxuICAgIC8vIGNvbHVtbiBpbmRpY2F0ZXMgaG93IG1hbnkgemVyb3MgYXJlIGFwcGVuZGVkIChhdCBlbmQpLlxuXG4gICAgLy8gVGhlIG51bWJlciBvZiB6ZXJvcyB0byBhcHBlbmQgaXMgdGhlIHNoYXBlIG9mIHRoZSBpbnB1dFxuICAgIC8vIGVsZW1lbnR3aXNlLXN1YnRyYWN0ZWQgYnkgYm90aCB0aGUgYmVnaW4gdmVjdG9yIGFuZCBzaXplcyB2ZWN0b3IuXG4gICAgY29uc3QgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkeS5yYW5rOyBpKyspIHtcbiAgICAgIHBhZGRpbmdzLnB1c2goW2JlZ2luX1tpXSwgaW5wdXRTaGFwZVtpXSAtIGJlZ2luX1tpXSAtIHNpemVfW2ldXSk7XG4gICAgfVxuICAgIHJldHVybiB7eDogKCkgPT4gcGFkKGR5LCBwYWRkaW5ncyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Softmax } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { sub } from '../ops/sub';\nimport { sum } from '../ops/sum';\nexport const softmaxGradConfig = {\n    kernelName: Softmax,\n    outputsToSave: [true],\n    gradFunc: (dy, saved, attrs) => {\n        const [y] = saved;\n        const { dim } = attrs;\n        const keepDims = true;\n        const dyTimesY = mul(dy, y);\n        return {\n            logits: () => sub(dyTimesY, mul(sum(dyTimesY, [dim], keepDims), y))\n        };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdG1heF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU29mdG1heF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUV0RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUcvQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBZTtJQUMzQyxVQUFVLEVBQUUsT0FBTztJQUNuQixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsS0FBMkIsQ0FBQztRQUMxQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFFdEIsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUM1QixPQUFPO1lBQ0wsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNwRSxDQUFDO0lBQ0osQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U29mdG1heCwgU29mdG1heEF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi4vb3BzL3N1bSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHNvZnRtYXhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTb2Z0bWF4LFxuICBvdXRwdXRzVG9TYXZlOiBbdHJ1ZV0sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3ldID0gc2F2ZWQ7XG4gICAgY29uc3Qge2RpbX0gPSBhdHRycyBhcyB7fSBhcyBTb2Z0bWF4QXR0cnM7XG4gICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuXG4gICAgY29uc3QgZHlUaW1lc1kgPSBtdWwoZHksIHkpO1xuICAgIHJldHVybiB7XG4gICAgICBsb2dpdHM6ICgpID0+IHN1YihkeVRpbWVzWSwgbXVsKHN1bShkeVRpbWVzWSwgW2RpbV0sIGtlZXBEaW1zKSwgeSkpXG4gICAgfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Softplus } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { sigmoid } from '../ops/sigmoid';\nexport const softplusGradConfig = {\n    kernelName: Softplus,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(dy, sigmoid(x)) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHBsdXNfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1NvZnRwbHVzX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBR3ZDLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFlO0lBQzVDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUVsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUN4QyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTb2Z0cGx1c30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7bXVsfSBmcm9tICcuLi9vcHMvbXVsJztcbmltcG9ydCB7c2lnbW9pZH0gZnJvbSAnLi4vb3BzL3NpZ21vaWQnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzb2Z0cGx1c0dyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNvZnRwbHVzLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiBtdWwoZHksIHNpZ21vaWQoeCkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SpaceToBatchND } from '../kernel_names';\nimport { batchToSpaceND } from '../ops/batch_to_space_nd';\nexport const spaceToBatchNDGradConfig = {\n    kernelName: SpaceToBatchND,\n    gradFunc: (dy, saved, attrs) => {\n        const { blockShape, paddings } = attrs;\n        return { x: () => batchToSpaceND(dy, blockShape, paddings) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhY2VUb0JhdGNoTkRfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1NwYWNlVG9CYXRjaE5EX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGNBQWMsRUFBc0IsTUFBTSxpQkFBaUIsQ0FBQztBQUVwRSxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFHeEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQWU7SUFDbEQsVUFBVSxFQUFFLGNBQWM7SUFDMUIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxFQUFDLFVBQVUsRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFrQyxDQUFDO1FBQ2xFLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsY0FBYyxDQUFDLEVBQUUsRUFBRSxVQUFVLEVBQUUsUUFBUSxDQUFDLEVBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTcGFjZVRvQmF0Y2hORCwgU3BhY2VUb0JhdGNoTkRBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtiYXRjaFRvU3BhY2VORH0gZnJvbSAnLi4vb3BzL2JhdGNoX3RvX3NwYWNlX25kJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFjZVRvQmF0Y2hORCxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7YmxvY2tTaGFwZSwgcGFkZGluZ3N9ID0gYXR0cnMgYXMge30gYXMgU3BhY2VUb0JhdGNoTkRBdHRycztcbiAgICByZXR1cm4ge3g6ICgpID0+IGJhdGNoVG9TcGFjZU5EKGR5LCBibG9ja1NoYXBlLCBwYWRkaW5ncyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SplitV } from '../kernel_names';\nimport { concat } from '../ops/concat';\nexport const splitVGradConfig = {\n    kernelName: SplitV,\n    gradFunc: (dy, saved, attrs) => {\n        const { axis } = attrs;\n        return { x: () => concat(dy, axis) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BsaXRWX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TcGxpdFZfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUdyQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZTtJQUMxQyxVQUFVLEVBQUUsTUFBTTtJQUNsQixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBMEIsQ0FBQztRQUUxQyxPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLEVBQUMsQ0FBQztJQUNyQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7U3BsaXRWLCBTcGxpdFZBdHRyc30gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZywgTmFtZWRBdHRyTWFwfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4uL29wcy9jb25jYXQnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzcGxpdFZHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGxpdFYsXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcltdLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB7YXhpc30gPSBhdHRycyBhcyB7fSBhcyBTcGxpdFZBdHRycztcblxuICAgIHJldHVybiB7eDogKCkgPT4gY29uY2F0KGR5LCBheGlzKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sqrt } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { div } from '../ops/div';\nimport { mul } from '../ops/mul';\nimport { sqrt } from '../ops/sqrt';\nexport const sqrtGradConfig = {\n    kernelName: Sqrt,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => div(dy, mul(sqrt(cast(x, 'float32')), 2)) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FydF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU3FydF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBR2pDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUMsQ0FBQztJQUM5RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTcXJ0fSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi9vcHMvY2FzdCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi4vb3BzL2Rpdic7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NxcnR9IGZyb20gJy4uL29wcy9zcXJ0JztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc3FydEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxcnQsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IGRpdihkeSwgbXVsKHNxcnQoY2FzdCh4LCAnZmxvYXQzMicpKSwgMikpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Square } from '../kernel_names';\nimport { cast } from '../ops/cast';\nimport { mul } from '../ops/mul';\nexport const squareGradConfig = {\n    kernelName: Square,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => mul(dy, mul(cast(x, 'float32'), 2)) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TcXVhcmVfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFdkMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNqQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFlO0lBQzFDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEVBQUU7UUFDeEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixPQUFPLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1NxdWFyZX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vb3BzL2Nhc3QnO1xuaW1wb3J0IHttdWx9IGZyb20gJy4uL29wcy9tdWwnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCBzcXVhcmVHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcXVhcmUsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiBtdWwoZHksIG11bChjYXN0KHgsICdmbG9hdDMyJyksIDIpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SquaredDifference } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { sub } from '../ops/sub';\nexport const squaredDifferenceGradConfig = {\n    kernelName: SquaredDifference,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const two = scalar(2);\n        const derA = () => mul(dy, mul(two, sub(a, b)));\n        const derB = () => mul(dy, mul(two, sub(b, a)));\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlZERpZmZlcmVuY2VfZ3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvZ3JhZGllbnRzL1NxdWFyZWREaWZmZXJlbmNlX2dyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFbEQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFHL0IsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQWU7SUFDckQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixZQUFZLEVBQUUsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDO0lBQ3hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNyQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRCxPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDNUIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U3F1YXJlZERpZmZlcmVuY2V9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3F1YXJlZERpZmZlcmVuY2UsXG4gIGlucHV0c1RvU2F2ZTogWydhJywgJ2InXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10pID0+IHtcbiAgICBjb25zdCBbYSwgYl0gPSBzYXZlZDtcbiAgICBjb25zdCB0d28gPSBzY2FsYXIoMik7XG4gICAgY29uc3QgZGVyQSA9ICgpID0+IG11bChkeSwgbXVsKHR3bywgc3ViKGEsIGIpKSk7XG4gICAgY29uc3QgZGVyQiA9ICgpID0+IG11bChkeSwgbXVsKHR3bywgc3ViKGIsIGEpKSk7XG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Step } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const stepGradConfig = {\n    kernelName: Step,\n    gradFunc: (dy) => {\n        // TODO(manrajgrover): Return null for gradients when backprop supports\n        // it.\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RlcF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvU3RlcF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFlO0lBQ3hDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQ3ZCLHVFQUF1RTtRQUN2RSxNQUFNO1FBQ04sT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLEVBQUMsQ0FBQztJQUNsQyxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTdGVwfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3Qgc3RlcEdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0ZXAsXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcikgPT4ge1xuICAgIC8vIFRPRE8obWFucmFqZ3JvdmVyKTogUmV0dXJuIG51bGwgZm9yIGdyYWRpZW50cyB3aGVuIGJhY2twcm9wIHN1cHBvcnRzXG4gICAgLy8gaXQuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiB6ZXJvc0xpa2UoZHkpfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sub } from '../kernel_names';\nimport * as broadcast_util from '../ops/broadcast_util';\nimport { neg } from '../ops/neg';\nimport { reshape } from '../ops/reshape';\nimport { sum } from '../ops/sum';\nexport const subGradConfig = {\n    kernelName: Sub,\n    inputsToSave: ['a', 'b'],\n    gradFunc: (dy, saved) => {\n        const [a, b] = saved;\n        const outShape = broadcast_util.assertAndGetBroadcastShape(a.shape, b.shape);\n        const derA = () => {\n            let res = dy;\n            const reduceAxes = broadcast_util.getReductionAxes(a.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = sum(res, reduceAxes);\n            }\n            return reshape(res, a.shape);\n        };\n        const derB = () => {\n            let res = dy;\n            const reduceAxes = broadcast_util.getReductionAxes(b.shape, outShape);\n            if (reduceAxes.length > 0) {\n                res = sum(res, reduceAxes);\n            }\n            return reshape(neg(res), b.shape);\n        };\n        return { a: derA, b: derB };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TdWJfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxLQUFLLGNBQWMsTUFBTSx1QkFBdUIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZTtJQUN2QyxVQUFVLEVBQUUsR0FBRztJQUNmLFlBQVksRUFBRSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUM7SUFDeEIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLE1BQU0sUUFBUSxHQUNWLGNBQWMsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUVoRSxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxHQUFHLEdBQUcsRUFBRSxDQUFDO1lBQ2IsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdEUsSUFBSSxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtnQkFDekIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLENBQUM7YUFDNUI7WUFDRCxPQUFPLE9BQU8sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9CLENBQUMsQ0FBQztRQUNGLE1BQU0sSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUNoQixJQUFJLEdBQUcsR0FBRyxFQUFFLENBQUM7WUFDYixNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN0RSxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO2dCQUN6QixHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsQ0FBQzthQUM1QjtZQUNELE9BQU8sT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDO1FBRUYsT0FBTyxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtTdWJ9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQgKiBhcyBicm9hZGNhc3RfdXRpbCBmcm9tICcuLi9vcHMvYnJvYWRjYXN0X3V0aWwnO1xuaW1wb3J0IHtuZWd9IGZyb20gJy4uL29wcy9uZWcnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi4vb3BzL3N1bSc7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHN1YkdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1YixcbiAgaW5wdXRzVG9TYXZlOiBbJ2EnLCAnYiddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFthLCBiXSA9IHNhdmVkO1xuICAgIGNvbnN0IG91dFNoYXBlID1cbiAgICAgICAgYnJvYWRjYXN0X3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYS5zaGFwZSwgYi5zaGFwZSk7XG5cbiAgICBjb25zdCBkZXJBID0gKCkgPT4ge1xuICAgICAgbGV0IHJlcyA9IGR5O1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYS5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXMgPSBzdW0ocmVzLCByZWR1Y2VBeGVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNoYXBlKHJlcywgYS5zaGFwZSk7XG4gICAgfTtcbiAgICBjb25zdCBkZXJCID0gKCkgPT4ge1xuICAgICAgbGV0IHJlcyA9IGR5O1xuICAgICAgY29uc3QgcmVkdWNlQXhlcyA9IGJyb2FkY2FzdF91dGlsLmdldFJlZHVjdGlvbkF4ZXMoYi5zaGFwZSwgb3V0U2hhcGUpO1xuICAgICAgaWYgKHJlZHVjZUF4ZXMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXMgPSBzdW0ocmVzLCByZWR1Y2VBeGVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiByZXNoYXBlKG5lZyhyZXMpLCBiLnNoYXBlKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHthOiBkZXJBLCBiOiBkZXJCfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sum } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { ones } from '../ops/ones';\nimport { reshape } from '../ops/reshape';\nimport { parseAxisParam } from '../util';\nexport const sumGradConfig = {\n    kernelName: Sum,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const expandedDyShape = x.shape.slice();\n        const { axis } = attrs;\n        const axes = parseAxisParam(axis, x.shape);\n        axes.forEach(axis => {\n            expandedDyShape[axis] = 1;\n        });\n        const expandedDy = reshape(dy, expandedDyShape);\n        const derX = mul(expandedDy, ones(x.shape, 'float32'));\n        return { x: () => derX };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VtX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9TdW1fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFXLE1BQU0saUJBQWlCLENBQUM7QUFFOUMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2QyxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBZTtJQUN2QyxVQUFVLEVBQUUsR0FBRztJQUNmLFlBQVksRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUNuQixRQUFRLEVBQUUsQ0FBQyxFQUFVLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUM3RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLE1BQU0sZUFBZSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDeEMsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQXVCLENBQUM7UUFFdkMsTUFBTSxJQUFJLEdBQUcsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUNsQixlQUFlLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBQ0gsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEVBQUUsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFFdkQsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxJQUFJLEVBQUMsQ0FBQztJQUN6QixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTdW0sIFN1bUF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge29uZXN9IGZyb20gJy4uL29wcy9vbmVzJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5pbXBvcnQge3BhcnNlQXhpc1BhcmFtfSBmcm9tICcuLi91dGlsJztcblxuZXhwb3J0IGNvbnN0IHN1bUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1bSxcbiAgaW5wdXRzVG9TYXZlOiBbJ3gnXSxcbiAgZ3JhZEZ1bmM6IChkeTogVGVuc29yLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCBbeF0gPSBzYXZlZDtcbiAgICBjb25zdCBleHBhbmRlZER5U2hhcGUgPSB4LnNoYXBlLnNsaWNlKCk7XG4gICAgY29uc3Qge2F4aXN9ID0gYXR0cnMgYXMge30gYXMgU3VtQXR0cnM7XG5cbiAgICBjb25zdCBheGVzID0gcGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gICAgYXhlcy5mb3JFYWNoKGF4aXMgPT4ge1xuICAgICAgZXhwYW5kZWREeVNoYXBlW2F4aXNdID0gMTtcbiAgICB9KTtcbiAgICBjb25zdCBleHBhbmRlZER5ID0gcmVzaGFwZShkeSwgZXhwYW5kZWREeVNoYXBlKTtcbiAgICBjb25zdCBkZXJYID0gbXVsKGV4cGFuZGVkRHksIG9uZXMoeC5zaGFwZSwgJ2Zsb2F0MzInKSk7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IGRlclh9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tan } from '../kernel_names';\nimport { cos } from '../ops/cos';\nimport { div } from '../ops/div';\nimport { square } from '../ops/square';\nexport const tanGradConfig = {\n    kernelName: Tan,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved) => {\n        const [x] = saved;\n        return { x: () => div(dy, square(cos(x))) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9UYW5fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFcEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUMvQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFHckMsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFlO0lBQ3ZDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDO0lBQ25CLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsRUFBRTtRQUN4QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDO1FBRWxCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1Rhbn0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7Y29zfSBmcm9tICcuLi9vcHMvY29zJztcbmltcG9ydCB7ZGl2fSBmcm9tICcuLi9vcHMvZGl2JztcbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi9vcHMvc3F1YXJlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgdGFuR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVGFuLFxuICBpbnB1dHNUb1NhdmU6IFsneCddLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSkgPT4ge1xuICAgIGNvbnN0IFt4XSA9IHNhdmVkO1xuXG4gICAgcmV0dXJuIHt4OiAoKSA9PiBkaXYoZHksIHNxdWFyZShjb3MoeCkpKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tanh } from '../kernel_names';\nimport { mul } from '../ops/mul';\nimport { scalar } from '../ops/scalar';\nimport { square } from '../ops/square';\nimport { sub } from '../ops/sub';\nexport const tanhGradConfig = {\n    kernelName: Tanh,\n    outputsToSave: [true],\n    gradFunc: (dy, saved) => {\n        const [y] = saved;\n        return { x: () => mul(sub(scalar(1), square(y)), dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuaF9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvVGFuaF9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRy9CLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixhQUFhLEVBQUUsQ0FBQyxJQUFJLENBQUM7SUFDckIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFbEIsT0FBTyxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ3ZELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1Rhbmh9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge211bH0gZnJvbSAnLi4vb3BzL211bCc7XG5pbXBvcnQge3NjYWxhcn0gZnJvbSAnLi4vb3BzL3NjYWxhcic7XG5pbXBvcnQge3NxdWFyZX0gZnJvbSAnLi4vb3BzL3NxdWFyZSc7XG5pbXBvcnQge3N1Yn0gZnJvbSAnLi4vb3BzL3N1Yic7XG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnLi4vdGVuc29yJztcblxuZXhwb3J0IGNvbnN0IHRhbmhHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUYW5oLFxuICBvdXRwdXRzVG9TYXZlOiBbdHJ1ZV0sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3ldID0gc2F2ZWQ7XG5cbiAgICByZXR1cm4ge3g6ICgpID0+IG11bChzdWIoc2NhbGFyKDEpLCBzcXVhcmUoeSkpLCBkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tile } from '../kernel_names';\nimport { add } from '../ops/add';\nimport { slice } from '../ops/slice';\nimport { zerosLike } from '../ops/zeros_like';\nexport const tileGradConfig = {\n    kernelName: Tile,\n    inputsToSave: ['x'],\n    gradFunc: (dy, saved, attrs) => {\n        const [x] = saved;\n        const { reps } = attrs;\n        const derX = () => {\n            let xGrad = zerosLike(x);\n            // TODO(cais): Maybe reduce memory footprint by avoiding repeated\n            // slicing.\n            if (x.rank === 1) {\n                for (let i = 0; i < reps[0]; ++i) {\n                    xGrad = add(xGrad, slice(dy, [i * x.shape[0]], [x.shape[0]]));\n                }\n            }\n            else if (x.rank === 2) {\n                for (let i = 0; i < reps[0]; ++i) {\n                    for (let j = 0; j < reps[1]; ++j) {\n                        xGrad = add(xGrad, slice(dy, [i * x.shape[0], j * x.shape[1]], [\n                            x.shape[0], x.shape[1]\n                        ]));\n                    }\n                }\n            }\n            else if (x.rank === 3) {\n                for (let i = 0; i < reps[0]; ++i) {\n                    for (let j = 0; j < reps[1]; ++j) {\n                        for (let k = 0; k < reps[2]; ++k) {\n                            xGrad =\n                                add(xGrad, slice(dy, [i * x.shape[0], j * x.shape[1], k * x.shape[2]], [x.shape[0], x.shape[1], x.shape[2]]));\n                        }\n                    }\n                }\n            }\n            else if (x.rank === 4) {\n                for (let i = 0; i < reps[0]; ++i) {\n                    for (let j = 0; j < reps[1]; ++j) {\n                        for (let k = 0; k < reps[2]; ++k) {\n                            for (let l = 0; l < reps[3]; ++l) {\n                                xGrad =\n                                    add(xGrad, slice(dy, [\n                                        i * x.shape[0], j * x.shape[1], k * x.shape[2],\n                                        l * x.shape[3]\n                                    ], [x.shape[0], x.shape[1], x.shape[2], x.shape[3]]));\n                            }\n                        }\n                    }\n                }\n            }\n            else {\n                throw new Error(`Gradient for tile operation is not implemented for rank-` +\n                    `${x.rank} tensors yet.`);\n            }\n            return xGrad;\n        };\n        return { x: derX };\n    },\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlsZV9ncmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9ncmFkaWVudHMvVGlsZV9ncmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQVksTUFBTSxpQkFBaUIsQ0FBQztBQUVoRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDbkMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBZTtJQUN4QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixZQUFZLEVBQUUsQ0FBQyxHQUFHLENBQUM7SUFDbkIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxLQUFtQixFQUFFLEVBQUU7UUFDN0QsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztRQUNsQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBNkIsQ0FBQztRQUU3QyxNQUFNLElBQUksR0FBRyxHQUFHLEVBQUU7WUFDaEIsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3pCLGlFQUFpRTtZQUNqRSxXQUFXO1lBQ1gsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtnQkFDaEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDaEMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMvRDthQUNGO2lCQUFNLElBQUksQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUU7Z0JBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0JBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUU7d0JBQ2hDLEtBQUssR0FBRyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFOzRCQUNqRCxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3lCQUN2QixDQUFDLENBQUMsQ0FBQztxQkFDakI7aUJBQ0Y7YUFDRjtpQkFBTSxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO2dCQUN2QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO29CQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO3dCQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFOzRCQUNoQyxLQUFLO2dDQUNELEdBQUcsQ0FBQyxLQUFLLEVBQ0wsS0FBSyxDQUNELEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ3BELENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7eUJBQ3BEO3FCQUNGO2lCQUNGO2FBQ0Y7aUJBQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtnQkFDdkIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtvQkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTt3QkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTs0QkFDaEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtnQ0FDaEMsS0FBSztvQ0FDRCxHQUFHLENBQUMsS0FBSyxFQUNMLEtBQUssQ0FDRCxFQUFFLEVBQ0Y7d0NBQ0UsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO3dDQUM5QyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7cUNBQ2YsRUFDRCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7NkJBQ2hFO3lCQUNGO3FCQUNGO2lCQUNGO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDWCwwREFBMEQ7b0JBQzFELEdBQUcsQ0FBQyxDQUFDLElBQUksZUFBZSxDQUFDLENBQUM7YUFDL0I7WUFDRCxPQUFPLEtBQUssQ0FBQztRQUNmLENBQUMsQ0FBQztRQUNGLE9BQU8sRUFBQyxDQUFDLEVBQUUsSUFBSSxFQUFDLENBQUM7SUFDbkIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGlsZSwgVGlsZUF0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4vb3BzL2FkZCc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuLi9vcHMvc2xpY2UnO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgdGlsZUdyYWRDb25maWc6IEdyYWRDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRpbGUsXG4gIGlucHV0c1RvU2F2ZTogWyd4J10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdLCBhdHRyczogTmFtZWRBdHRyTWFwKSA9PiB7XG4gICAgY29uc3QgW3hdID0gc2F2ZWQ7XG4gICAgY29uc3Qge3JlcHN9ID0gYXR0cnMgYXMgdW5rbm93biBhcyBUaWxlQXR0cnM7XG5cbiAgICBjb25zdCBkZXJYID0gKCkgPT4ge1xuICAgICAgbGV0IHhHcmFkID0gemVyb3NMaWtlKHgpO1xuICAgICAgLy8gVE9ETyhjYWlzKTogTWF5YmUgcmVkdWNlIG1lbW9yeSBmb290cHJpbnQgYnkgYXZvaWRpbmcgcmVwZWF0ZWRcbiAgICAgIC8vIHNsaWNpbmcuXG4gICAgICBpZiAoeC5yYW5rID09PSAxKSB7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVwc1swXTsgKytpKSB7XG4gICAgICAgICAgeEdyYWQgPSBhZGQoeEdyYWQsIHNsaWNlKGR5LCBbaSAqIHguc2hhcGVbMF1dLCBbeC5zaGFwZVswXV0pKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBzWzBdOyArK2kpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcHNbMV07ICsraikge1xuICAgICAgICAgICAgeEdyYWQgPSBhZGQoeEdyYWQsIHNsaWNlKGR5LCBbaSAqIHguc2hhcGVbMF0sIGogKiB4LnNoYXBlWzFdXSwgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICB4LnNoYXBlWzBdLCB4LnNoYXBlWzFdXG4gICAgICAgICAgICAgICAgICAgICAgICBdKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHgucmFuayA9PT0gMykge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlcHNbMF07ICsraSkge1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVwc1sxXTsgKytqKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHJlcHNbMl07ICsraykge1xuICAgICAgICAgICAgICB4R3JhZCA9XG4gICAgICAgICAgICAgICAgICBhZGQoeEdyYWQsXG4gICAgICAgICAgICAgICAgICAgICAgc2xpY2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGR5LCBbaSAqIHguc2hhcGVbMF0sIGogKiB4LnNoYXBlWzFdLCBrICogeC5zaGFwZVsyXV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgIFt4LnNoYXBlWzBdLCB4LnNoYXBlWzFdLCB4LnNoYXBlWzJdXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh4LnJhbmsgPT09IDQpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXBzWzBdOyArK2kpIHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlcHNbMV07ICsraikge1xuICAgICAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCByZXBzWzJdOyArK2spIHtcbiAgICAgICAgICAgICAgZm9yIChsZXQgbCA9IDA7IGwgPCByZXBzWzNdOyArK2wpIHtcbiAgICAgICAgICAgICAgICB4R3JhZCA9XG4gICAgICAgICAgICAgICAgICAgIGFkZCh4R3JhZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWNlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkgKiB4LnNoYXBlWzBdLCBqICogeC5zaGFwZVsxXSwgayAqIHguc2hhcGVbMl0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsICogeC5zaGFwZVszXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3guc2hhcGVbMF0sIHguc2hhcGVbMV0sIHguc2hhcGVbMl0sIHguc2hhcGVbM11dKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBHcmFkaWVudCBmb3IgdGlsZSBvcGVyYXRpb24gaXMgbm90IGltcGxlbWVudGVkIGZvciByYW5rLWAgK1xuICAgICAgICAgICAgYCR7eC5yYW5rfSB0ZW5zb3JzIHlldC5gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB4R3JhZDtcbiAgICB9O1xuICAgIHJldHVybiB7eDogZGVyWH07XG4gIH0sXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transpose } from '../kernel_names';\nimport * as axis_util from '../ops/axis_util';\nimport { transpose } from '../ops/transpose';\nexport const transposeGradConfig = {\n    kernelName: Transpose,\n    gradFunc: (dy, saved, attrs) => {\n        const transposeAttrs = attrs;\n        const { perm } = transposeAttrs;\n        const undoPerm = axis_util.getUndoAxesPermutation(perm);\n        return { x: () => transpose(dy, undoPerm) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9UcmFuc3Bvc2VfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFpQixNQUFNLGlCQUFpQixDQUFDO0FBRTFELE9BQU8sS0FBSyxTQUFTLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRzNDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFlO0lBQzdDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxLQUFlLEVBQUUsS0FBbUIsRUFBRSxFQUFFO1FBQzdELE1BQU0sY0FBYyxHQUFtQixLQUE2QixDQUFDO1FBQ3JFLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxjQUFjLENBQUM7UUFDOUIsTUFBTSxRQUFRLEdBQUcsU0FBUyxDQUFDLHNCQUFzQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3hELE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxRQUFRLENBQUMsRUFBQyxDQUFDO0lBQzVDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RyYW5zcG9zZSwgVHJhbnNwb3NlQXR0cnN9IGZyb20gJy4uL2tlcm5lbF9uYW1lcyc7XG5pbXBvcnQge0dyYWRDb25maWcsIE5hbWVkQXR0ck1hcH0gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCAqIGFzIGF4aXNfdXRpbCBmcm9tICcuLi9vcHMvYXhpc191dGlsJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuLi9vcHMvdHJhbnNwb3NlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgdHJhbnNwb3NlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVHJhbnNwb3NlLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IsIHNhdmVkOiBUZW5zb3JbXSwgYXR0cnM6IE5hbWVkQXR0ck1hcCkgPT4ge1xuICAgIGNvbnN0IHRyYW5zcG9zZUF0dHJzOiBUcmFuc3Bvc2VBdHRycyA9IGF0dHJzIGFzIHt9IGFzIFRyYW5zcG9zZUF0dHJzO1xuICAgIGNvbnN0IHtwZXJtfSA9IHRyYW5zcG9zZUF0dHJzO1xuICAgIGNvbnN0IHVuZG9QZXJtID0gYXhpc191dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybSk7XG4gICAgcmV0dXJuIHt4OiAoKSA9PiB0cmFuc3Bvc2UoZHksIHVuZG9QZXJtKX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unpack } from '../kernel_names';\nimport { stack } from '../ops/stack';\nexport const unpackGradConfig = {\n    kernelName: Unpack,\n    gradFunc: (dy, saved, attrs) => {\n        const unpackAttrs = attrs;\n        const { axis } = unpackAttrs;\n        return { value: () => stack(dy, axis) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5wYWNrX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9VbnBhY2tfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsTUFBTSxFQUFjLE1BQU0saUJBQWlCLENBQUM7QUFFcEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUduQyxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBZTtJQUMxQyxVQUFVLEVBQUUsTUFBTTtJQUNsQixRQUFRLEVBQUUsQ0FBQyxFQUFZLEVBQUUsS0FBZSxFQUFFLEtBQW1CLEVBQUUsRUFBRTtRQUMvRCxNQUFNLFdBQVcsR0FBZ0IsS0FBMEIsQ0FBQztRQUM1RCxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsV0FBVyxDQUFDO1FBQzNCLE9BQU8sRUFBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBQyxDQUFDO0lBQ3hDLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtVbnBhY2ssIFVucGFja0F0dHJzfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnLCBOYW1lZEF0dHJNYXB9IGZyb20gJy4uL2tlcm5lbF9yZWdpc3RyeSc7XG5pbXBvcnQge3N0YWNrfSBmcm9tICcuLi9vcHMvc3RhY2snO1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCB1bnBhY2tHcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBVbnBhY2ssXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvcltdLCBzYXZlZDogVGVuc29yW10sIGF0dHJzOiBOYW1lZEF0dHJNYXApID0+IHtcbiAgICBjb25zdCB1bnBhY2tBdHRyczogVW5wYWNrQXR0cnMgPSBhdHRycyBhcyB7fSBhcyBVbnBhY2tBdHRycztcbiAgICBjb25zdCB7YXhpc30gPSB1bnBhY2tBdHRycztcbiAgICByZXR1cm4ge3ZhbHVlOiAoKSA9PiBzdGFjayhkeSwgYXhpcyl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { UnsortedSegmentSum } from '../kernel_names';\nimport { expandDims } from '../ops/expand_dims';\nimport { gather } from '../ops/gather';\nimport { greaterEqual } from '../ops/greater_equal';\nimport { logicalAnd } from '../ops/logical_and';\nimport { maximum } from '../ops/maximum';\nimport { ones } from '../ops/ones';\nimport { scalar } from '../ops/scalar';\nimport { where } from '../ops/where';\nimport { zerosLike } from '../ops/zeros_like';\nexport const unsortedSegmentSumGradConfig = {\n    kernelName: UnsortedSegmentSum,\n    inputsToSave: ['segmentIds'],\n    gradFunc: (dy, saved) => {\n        const [segmentIds] = saved;\n        const derX = () => {\n            return gatherDropNegatives(dy, segmentIds);\n        };\n        return { x: derX };\n    }\n};\nfunction gatherDropNegatives(x, indices) {\n    // Helper function for unsorted segment ops. Gathers params for\n    // positive segment ids and gathers 0 for inputs with negative segment id.\n    // Mirrors _GatherDropNegatives from tensorflow/python/ops/math_grad.py\n    const zeroClippedIndices = maximum(indices, zerosLike(indices));\n    const gathered = gather(x, zeroClippedIndices);\n    let isPositive = greaterEqual(indices, scalar(0, 'int32'));\n    const numIters = gathered.rank - isPositive.rank;\n    for (let i = 0; i < numIters; ++i) {\n        isPositive = expandDims(isPositive, i + 1);\n    }\n    isPositive = logicalAnd(isPositive, ones(gathered.shape, 'bool'));\n    const zeroSlice = zerosLike(gathered);\n    return where(isPositive, gathered, zeroSlice);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zb3J0ZWRTZWdtZW50U3VtX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9VbnNvcnRlZFNlZ21lbnRTdW1fZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVuRCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDOUMsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNyQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ2pDLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNuQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFHNUMsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWU7SUFDdEQsVUFBVSxFQUFFLGtCQUFrQjtJQUM5QixZQUFZLEVBQUUsQ0FBQyxZQUFZLENBQUM7SUFDNUIsUUFBUSxFQUFFLENBQUMsRUFBVSxFQUFFLEtBQWUsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxLQUFLLENBQUM7UUFFM0IsTUFBTSxJQUFJLEdBQUcsR0FBRyxFQUFFO1lBQ2hCLE9BQU8sbUJBQW1CLENBQUMsRUFBRSxFQUFFLFVBQXNCLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUM7UUFDRixPQUFPLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBQyxDQUFDO0lBQ25CLENBQUM7Q0FDRixDQUFDO0FBRUYsU0FBUyxtQkFBbUIsQ0FBbUIsQ0FBSSxFQUFFLE9BQWlCO0lBQ3BFLCtEQUErRDtJQUMvRCwwRUFBMEU7SUFDMUUsdUVBQXVFO0lBQ3ZFLE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNoRSxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxFQUFFLGtCQUE4QixDQUFDLENBQUM7SUFDM0QsSUFBSSxVQUFVLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDM0QsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQ2pELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDakMsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0tBQzVDO0lBQ0QsVUFBVSxHQUFHLFVBQVUsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNsRSxNQUFNLFNBQVMsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEMsT0FBTyxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNoRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1Vuc29ydGVkU2VnbWVudFN1bX0gZnJvbSAnLi4va2VybmVsX25hbWVzJztcbmltcG9ydCB7R3JhZENvbmZpZ30gZnJvbSAnLi4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7ZXhwYW5kRGltc30gZnJvbSAnLi4vb3BzL2V4cGFuZF9kaW1zJztcbmltcG9ydCB7Z2F0aGVyfSBmcm9tICcuLi9vcHMvZ2F0aGVyJztcbmltcG9ydCB7Z3JlYXRlckVxdWFsfSBmcm9tICcuLi9vcHMvZ3JlYXRlcl9lcXVhbCc7XG5pbXBvcnQge2xvZ2ljYWxBbmR9IGZyb20gJy4uL29wcy9sb2dpY2FsX2FuZCc7XG5pbXBvcnQge21heGltdW19IGZyb20gJy4uL29wcy9tYXhpbXVtJztcbmltcG9ydCB7b25lc30gZnJvbSAnLi4vb3BzL29uZXMnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJy4uL29wcy9zY2FsYXInO1xuaW1wb3J0IHt3aGVyZX0gZnJvbSAnLi4vb3BzL3doZXJlJztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuLi9vcHMvemVyb3NfbGlrZSc7XG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUR9IGZyb20gJy4uL3RlbnNvcic7XG5cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW1HcmFkQ29uZmlnOiBHcmFkQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBVbnNvcnRlZFNlZ21lbnRTdW0sXG4gIGlucHV0c1RvU2F2ZTogWydzZWdtZW50SWRzJ10sXG4gIGdyYWRGdW5jOiAoZHk6IFRlbnNvciwgc2F2ZWQ6IFRlbnNvcltdKSA9PiB7XG4gICAgY29uc3QgW3NlZ21lbnRJZHNdID0gc2F2ZWQ7XG5cbiAgICBjb25zdCBkZXJYID0gKCkgPT4ge1xuICAgICAgcmV0dXJuIGdhdGhlckRyb3BOZWdhdGl2ZXMoZHksIHNlZ21lbnRJZHMgYXMgVGVuc29yMUQpO1xuICAgIH07XG4gICAgcmV0dXJuIHt4OiBkZXJYfTtcbiAgfVxufTtcblxuZnVuY3Rpb24gZ2F0aGVyRHJvcE5lZ2F0aXZlczxUIGV4dGVuZHMgVGVuc29yPih4OiBULCBpbmRpY2VzOiBUZW5zb3IxRCkge1xuICAvLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHVuc29ydGVkIHNlZ21lbnQgb3BzLiBHYXRoZXJzIHBhcmFtcyBmb3JcbiAgLy8gcG9zaXRpdmUgc2VnbWVudCBpZHMgYW5kIGdhdGhlcnMgMCBmb3IgaW5wdXRzIHdpdGggbmVnYXRpdmUgc2VnbWVudCBpZC5cbiAgLy8gTWlycm9ycyBfR2F0aGVyRHJvcE5lZ2F0aXZlcyBmcm9tIHRlbnNvcmZsb3cvcHl0aG9uL29wcy9tYXRoX2dyYWQucHlcbiAgY29uc3QgemVyb0NsaXBwZWRJbmRpY2VzID0gbWF4aW11bShpbmRpY2VzLCB6ZXJvc0xpa2UoaW5kaWNlcykpO1xuICBjb25zdCBnYXRoZXJlZCA9IGdhdGhlcih4LCB6ZXJvQ2xpcHBlZEluZGljZXMgYXMgVGVuc29yMUQpO1xuICBsZXQgaXNQb3NpdGl2ZSA9IGdyZWF0ZXJFcXVhbChpbmRpY2VzLCBzY2FsYXIoMCwgJ2ludDMyJykpO1xuICBjb25zdCBudW1JdGVycyA9IGdhdGhlcmVkLnJhbmsgLSBpc1Bvc2l0aXZlLnJhbms7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtSXRlcnM7ICsraSkge1xuICAgIGlzUG9zaXRpdmUgPSBleHBhbmREaW1zKGlzUG9zaXRpdmUsIGkgKyAxKTtcbiAgfVxuICBpc1Bvc2l0aXZlID0gbG9naWNhbEFuZChpc1Bvc2l0aXZlLCBvbmVzKGdhdGhlcmVkLnNoYXBlLCAnYm9vbCcpKTtcbiAgY29uc3QgemVyb1NsaWNlID0gemVyb3NMaWtlKGdhdGhlcmVkKTtcbiAgcmV0dXJuIHdoZXJlKGlzUG9zaXRpdmUsIGdhdGhlcmVkLCB6ZXJvU2xpY2UpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ZerosLike } from '../kernel_names';\nimport { zerosLike } from '../ops/zeros_like';\nexport const zerosLikeGradConfig = {\n    kernelName: ZerosLike,\n    gradFunc: (dy) => {\n        return { x: () => zerosLike(dy) };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmVyb3NMaWtlX2dyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL2dyYWRpZW50cy9aZXJvc0xpa2VfZ3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFMUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRzVDLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFlO0lBQzdDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFFBQVEsRUFBRSxDQUFDLEVBQVUsRUFBRSxFQUFFO1FBQ3ZCLE9BQU8sRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxFQUFDLENBQUM7SUFDbEMsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7WmVyb3NMaWtlfSBmcm9tICcuLi9rZXJuZWxfbmFtZXMnO1xuaW1wb3J0IHtHcmFkQ29uZmlnfSBmcm9tICcuLi9rZXJuZWxfcmVnaXN0cnknO1xuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uL29wcy96ZXJvc19saWtlJztcbmltcG9ydCB7VGVuc29yfSBmcm9tICcuLi90ZW5zb3InO1xuXG5leHBvcnQgY29uc3QgemVyb3NMaWtlR3JhZENvbmZpZzogR3JhZENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogWmVyb3NMaWtlLFxuICBncmFkRnVuYzogKGR5OiBUZW5zb3IpID0+IHtcbiAgICByZXR1cm4ge3g6ICgpID0+IHplcm9zTGlrZShkeSl9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { absGradConfig } from './gradients/Abs_grad';\nimport { acosGradConfig } from './gradients/Acos_grad';\nimport { acoshGradConfig } from './gradients/Acosh_grad';\nimport { addGradConfig } from './gradients/Add_grad';\nimport { addNGradConfig } from './gradients/AddN_grad';\nimport { argMaxGradConfig } from './gradients/ArgMax_grad';\nimport { argMinGradConfig } from './gradients/ArgMin_grad';\nimport { asinGradConfig } from './gradients/Asin_grad';\nimport { asinhGradConfig } from './gradients/Asinh_grad';\nimport { atan2GradConfig } from './gradients/Atan2_grad';\nimport { atanGradConfig } from './gradients/Atan_grad';\nimport { atanhGradConfig } from './gradients/Atanh_grad';\nimport { avgPool3DGradConfig } from './gradients/AvgPool3D_grad';\nimport { avgPoolGradConfig } from './gradients/AvgPool_grad';\nimport { batchMatMulGradConfig } from './gradients/BatchMatMul_grad';\nimport { batchToSpaceNDGradConfig } from './gradients/BatchToSpaceND_grad';\nimport { broadcastToGradConfig } from './gradients/BroadcastTo_grad';\nimport { castGradConfig } from './gradients/Cast_grad';\nimport { ceilGradConfig } from './gradients/Ceil_grad';\nimport { clipByValueGradConfig } from './gradients/ClipByValue_grad';\nimport { complexAbsGradConfig } from './gradients/ComplexAbs_grad';\nimport { concatGradConfig } from './gradients/Concat_grad';\nimport { conv2DGradConfig } from './gradients/Conv2D_grad';\nimport { conv2DBackpropInputGradConfig } from './gradients/Conv2DBackpropInput_grad';\nimport { conv3DGradConfig } from './gradients/Conv3D_grad';\nimport { cosGradConfig } from './gradients/Cos_grad';\nimport { coshGradConfig } from './gradients/Cosh_grad';\nimport { cumsumGradConfig } from './gradients/Cumsum_grad';\nimport { depthwiseConv2dNativeGradConfig } from './gradients/DepthwiseConv2dNative_grad';\nimport { dilation2dGradConfig } from './gradients/Dilation2D_grad';\nimport { eluGradConfig } from './gradients/Elu_grad';\nimport { erfGradConfig } from './gradients/Erf_grad';\nimport { expGradConfig } from './gradients/Exp_grad';\nimport { expandDimsGradConfig } from './gradients/ExpandDims_grad';\nimport { expm1GradConfig } from './gradients/Expm1_grad';\nimport { floorGradConfig } from './gradients/Floor_grad';\nimport { floorDivGradConfig } from './gradients/FloorDiv_grad';\nimport { fusedBatchNormGradConfig } from './gradients/FusedBatchNorm_grad';\nimport { gatherGradConfig } from './gradients/GatherV2_grad';\nimport { greaterEqualGradConfig } from './gradients/GreaterEqual_grad';\nimport { identityGradConfig } from './gradients/Identity_grad';\nimport { isFiniteGradConfig } from './gradients/IsFinite_grad';\nimport { isInfGradConfig } from './gradients/IsInf_grad';\nimport { isNanGradConfig } from './gradients/IsNan_grad';\nimport { leakyReluGradConfig } from './gradients/LeakyRelu_grad';\nimport { log1pGradConfig } from './gradients/Log1p_grad';\nimport { logGradConfig } from './gradients/Log_grad';\nimport { logSoftmaxGradConfig } from './gradients/LogSoftmax_grad';\nimport { lrnGradConfig } from './gradients/LRN_grad';\nimport { maxGradConfig } from './gradients/Max_grad';\nimport { maximumGradConfig } from './gradients/Maximum_grad';\nimport { maxPool3DGradConfig } from './gradients/MaxPool3D_grad';\nimport { maxPoolGradConfig } from './gradients/MaxPool_grad';\nimport { meanGradConfig } from './gradients/Mean_grad';\nimport { minGradConfig } from './gradients/Min_grad';\nimport { minimumGradConfig } from './gradients/Minimum_grad';\nimport { mirrorPadGradConfig } from './gradients/MirrorPad_grad';\nimport { modGradConfig } from './gradients/Mod_grad';\nimport { multiplyGradConfig } from './gradients/Multiply_grad';\nimport { negGradConfig } from './gradients/Neg_grad';\nimport { oneHotGradConfig } from './gradients/OneHot_grad';\nimport { onesLikeGradConfig } from './gradients/OnesLike_grad';\nimport { packGradConfig } from './gradients/Pack_grad';\nimport { padV2GradConfig } from './gradients/PadV2_grad';\nimport { powGradConfig } from './gradients/Pow_grad';\nimport { preluGradConfig } from './gradients/Prelu_grad';\nimport { prodGradConfig } from './gradients/Prod_grad';\nimport { divGradConfig } from './gradients/RealDiv_grad';\nimport { reciprocalGradConfig } from './gradients/Reciprocal_grad';\nimport { relu6GradConfig } from './gradients/Relu6_grad';\nimport { reluGradConfig } from './gradients/Relu_grad';\nimport { reshapeGradConfig } from './gradients/Reshape_grad';\nimport { resizeBilinearGradConfig } from './gradients/ResizeBilinear_grad';\nimport { resizeNearestNeighborGradConfig } from './gradients/ResizeNearestNeighbor_grad';\nimport { reverseGradConfig } from './gradients/Reverse_grad';\nimport { roundGradConfig } from './gradients/Round_grad';\nimport { rsqrtGradConfig } from './gradients/Rsqrt_grad';\nimport { selectGradConfig } from './gradients/Select_grad';\nimport { seluGradConfig } from './gradients/Selu_grad';\nimport { sigmoidGradConfig } from './gradients/Sigmoid_grad';\nimport { signGradConfig } from './gradients/Sign_grad';\nimport { sinGradConfig } from './gradients/Sin_grad';\nimport { sinhGradConfig } from './gradients/Sinh_grad';\nimport { sliceGradConfig } from './gradients/Slice_grad';\nimport { softmaxGradConfig } from './gradients/Softmax_grad';\nimport { softplusGradConfig } from './gradients/Softplus_grad';\nimport { spaceToBatchNDGradConfig } from './gradients/SpaceToBatchND_grad';\nimport { splitVGradConfig } from './gradients/SplitV_grad';\nimport { sqrtGradConfig } from './gradients/Sqrt_grad';\nimport { squareGradConfig } from './gradients/Square_grad';\nimport { squaredDifferenceGradConfig } from './gradients/SquaredDifference_grad';\nimport { stepGradConfig } from './gradients/Step_grad';\nimport { subGradConfig } from './gradients/Sub_grad';\nimport { sumGradConfig } from './gradients/Sum_grad';\nimport { tanGradConfig } from './gradients/Tan_grad';\nimport { tanhGradConfig } from './gradients/Tanh_grad';\nimport { tileGradConfig } from './gradients/Tile_grad';\nimport { transposeGradConfig } from './gradients/Transpose_grad';\nimport { unpackGradConfig } from './gradients/Unpack_grad';\nimport { unsortedSegmentSumGradConfig } from './gradients/UnsortedSegmentSum_grad';\nimport { zerosLikeGradConfig } from './gradients/ZerosLike_grad';\nimport { registerGradient } from './kernel_registry';\n// Export all kernel configs here so that the package can auto register them\nconst gradConfigs = [\n    absGradConfig,\n    acosGradConfig,\n    acoshGradConfig,\n    addGradConfig,\n    addNGradConfig,\n    argMaxGradConfig,\n    argMinGradConfig,\n    asinGradConfig,\n    asinhGradConfig,\n    atan2GradConfig,\n    atanGradConfig,\n    atanhGradConfig,\n    avgPool3DGradConfig,\n    avgPoolGradConfig,\n    batchMatMulGradConfig,\n    batchToSpaceNDGradConfig,\n    broadcastToGradConfig,\n    castGradConfig,\n    ceilGradConfig,\n    clipByValueGradConfig,\n    complexAbsGradConfig,\n    concatGradConfig,\n    conv2DBackpropInputGradConfig,\n    conv2DGradConfig,\n    conv3DGradConfig,\n    cosGradConfig,\n    coshGradConfig,\n    cumsumGradConfig,\n    depthwiseConv2dNativeGradConfig,\n    dilation2dGradConfig,\n    divGradConfig,\n    eluGradConfig,\n    erfGradConfig,\n    expGradConfig,\n    expandDimsGradConfig,\n    expm1GradConfig,\n    floorDivGradConfig,\n    floorGradConfig,\n    fusedBatchNormGradConfig,\n    gatherGradConfig,\n    greaterEqualGradConfig,\n    identityGradConfig,\n    isFiniteGradConfig,\n    isInfGradConfig,\n    isNanGradConfig,\n    leakyReluGradConfig,\n    log1pGradConfig,\n    logGradConfig,\n    logSoftmaxGradConfig,\n    lrnGradConfig,\n    maxGradConfig,\n    maxGradConfig,\n    maximumGradConfig,\n    maxPool3DGradConfig,\n    maxPoolGradConfig,\n    meanGradConfig,\n    minGradConfig,\n    minimumGradConfig,\n    mirrorPadGradConfig,\n    modGradConfig,\n    multiplyGradConfig,\n    negGradConfig,\n    oneHotGradConfig,\n    onesLikeGradConfig,\n    packGradConfig,\n    padV2GradConfig,\n    padV2GradConfig,\n    powGradConfig,\n    preluGradConfig,\n    prodGradConfig,\n    reciprocalGradConfig,\n    relu6GradConfig,\n    reluGradConfig,\n    reshapeGradConfig,\n    resizeBilinearGradConfig,\n    resizeNearestNeighborGradConfig,\n    reverseGradConfig,\n    roundGradConfig,\n    rsqrtGradConfig,\n    selectGradConfig,\n    seluGradConfig,\n    sigmoidGradConfig,\n    signGradConfig,\n    sinGradConfig,\n    sinhGradConfig,\n    sliceGradConfig,\n    softmaxGradConfig,\n    softplusGradConfig,\n    spaceToBatchNDGradConfig,\n    spaceToBatchNDGradConfig,\n    splitVGradConfig,\n    splitVGradConfig,\n    sqrtGradConfig,\n    squaredDifferenceGradConfig,\n    squareGradConfig,\n    stepGradConfig,\n    subGradConfig,\n    sumGradConfig,\n    tanGradConfig,\n    tanhGradConfig,\n    tileGradConfig,\n    transposeGradConfig,\n    unpackGradConfig,\n    unsortedSegmentSumGradConfig,\n    zerosLikeGradConfig\n];\nfor (const gradientConfig of gradConfigs) {\n    registerGradient(gradientConfig);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXJfYWxsX2dyYWRpZW50cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcmVnaXN0ZXJfYWxsX2dyYWRpZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDdkQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDL0QsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0saUNBQWlDLENBQUM7QUFDekUsT0FBTyxFQUFDLHFCQUFx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QUFrQjtJQUNsQixhQUFhO0lBQ2IsZ0JBQWdCO0lBQ2hCLGtCQUFrQjtJQUNsQixjQUFjO0lBQ2QsZUFBZTtJQUNmLGVBQWU7SUFDZixhQUFhO0lBQ2IsZUFBZTtJQUNmLGNBQWM7SUFDZCxvQkFBb0I7SUFDcEIsZUFBZTtJQUNmLGNBQWM7SUFDZCxpQkFBaUI7SUFDakIsd0JBQXdCO0lBQ3hCLCtCQUErQjtJQUMvQixpQkFBaUI7SUFDakIsZUFBZTtJQUNmLGVBQWU7SUFDZixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGlCQUFpQjtJQUNqQixjQUFjO0lBQ2QsYUFBYTtJQUNiLGNBQWM7SUFDZCxlQUFlO0lBQ2YsaUJBQWlCO0lBQ2pCLGtCQUFrQjtJQUNsQix3QkFBd0I7SUFDeEIsd0JBQXdCO0lBQ3hCLGdCQUFnQjtJQUNoQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLDJCQUEyQjtJQUMzQixnQkFBZ0I7SUFDaEIsY0FBYztJQUNkLGFBQWE7SUFDYixhQUFhO0lBQ2IsYUFBYTtJQUNiLGNBQWM7SUFDZCxjQUFjO0lBQ2QsbUJBQW1CO0lBQ25CLGdCQUFnQjtJQUNoQiw0QkFBNEI7SUFDNUIsbUJBQW1CO0NBQ3BCLENBQUM7QUFFRixLQUFLLE1BQU0sY0FBYyxJQUFJLFdBQVcsRUFBRTtJQUN4QyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztDQUNsQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YWJzR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQWJzX2dyYWQnO1xuaW1wb3J0IHthY29zR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQWNvc19ncmFkJztcbmltcG9ydCB7YWNvc2hHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9BY29zaF9ncmFkJztcbmltcG9ydCB7YWRkR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQWRkX2dyYWQnO1xuaW1wb3J0IHthZGROR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQWRkTl9ncmFkJztcbmltcG9ydCB7YXJnTWF4R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQXJnTWF4X2dyYWQnO1xuaW1wb3J0IHthcmdNaW5HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9BcmdNaW5fZ3JhZCc7XG5pbXBvcnQge2FzaW5HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Bc2luX2dyYWQnO1xuaW1wb3J0IHthc2luaEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0FzaW5oX2dyYWQnO1xuaW1wb3J0IHthdGFuMkdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0F0YW4yX2dyYWQnO1xuaW1wb3J0IHthdGFuR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQXRhbl9ncmFkJztcbmltcG9ydCB7YXRhbmhHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9BdGFuaF9ncmFkJztcbmltcG9ydCB7YXZnUG9vbDNER3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQXZnUG9vbDNEX2dyYWQnO1xuaW1wb3J0IHthdmdQb29sR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQXZnUG9vbF9ncmFkJztcbmltcG9ydCB7YmF0Y2hNYXRNdWxHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9CYXRjaE1hdE11bF9ncmFkJztcbmltcG9ydCB7YmF0Y2hUb1NwYWNlTkRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9CYXRjaFRvU3BhY2VORF9ncmFkJztcbmltcG9ydCB7YnJvYWRjYXN0VG9HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Ccm9hZGNhc3RUb19ncmFkJztcbmltcG9ydCB7Y2FzdEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0Nhc3RfZ3JhZCc7XG5pbXBvcnQge2NlaWxHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9DZWlsX2dyYWQnO1xuaW1wb3J0IHtjbGlwQnlWYWx1ZUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0NsaXBCeVZhbHVlX2dyYWQnO1xuaW1wb3J0IHtjb21wbGV4QWJzR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQ29tcGxleEFic19ncmFkJztcbmltcG9ydCB7Y29uY2F0R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvQ29uY2F0X2dyYWQnO1xuaW1wb3J0IHtjb252MkRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Db252MkRfZ3JhZCc7XG5pbXBvcnQge2NvbnYyREJhY2twcm9wSW5wdXRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Db252MkRCYWNrcHJvcElucHV0X2dyYWQnO1xuaW1wb3J0IHtjb252M0RHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Db252M0RfZ3JhZCc7XG5pbXBvcnQge2Nvc0dyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0Nvc19ncmFkJztcbmltcG9ydCB7Y29zaEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0Nvc2hfZ3JhZCc7XG5pbXBvcnQge2N1bXN1bUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0N1bXN1bV9ncmFkJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlX2dyYWQnO1xuaW1wb3J0IHtkaWxhdGlvbjJkR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRGlsYXRpb24yRF9ncmFkJztcbmltcG9ydCB7ZWx1R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRWx1X2dyYWQnO1xuaW1wb3J0IHtlcmZHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9FcmZfZ3JhZCc7XG5pbXBvcnQge2V4cEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0V4cF9ncmFkJztcbmltcG9ydCB7ZXhwYW5kRGltc0dyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0V4cGFuZERpbXNfZ3JhZCc7XG5pbXBvcnQge2V4cG0xR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRXhwbTFfZ3JhZCc7XG5pbXBvcnQge2Zsb29yR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRmxvb3JfZ3JhZCc7XG5pbXBvcnQge2Zsb29yRGl2R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRmxvb3JEaXZfZ3JhZCc7XG5pbXBvcnQge2Z1c2VkQmF0Y2hOb3JtR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvRnVzZWRCYXRjaE5vcm1fZ3JhZCc7XG5pbXBvcnQge2dhdGhlckdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0dhdGhlclYyX2dyYWQnO1xuaW1wb3J0IHtncmVhdGVyRXF1YWxHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9HcmVhdGVyRXF1YWxfZ3JhZCc7XG5pbXBvcnQge2lkZW50aXR5R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvSWRlbnRpdHlfZ3JhZCc7XG5pbXBvcnQge2lzRmluaXRlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvSXNGaW5pdGVfZ3JhZCc7XG5pbXBvcnQge2lzSW5mR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvSXNJbmZfZ3JhZCc7XG5pbXBvcnQge2lzTmFuR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvSXNOYW5fZ3JhZCc7XG5pbXBvcnQge2xlYWt5UmVsdUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL0xlYWt5UmVsdV9ncmFkJztcbmltcG9ydCB7bG9nMXBHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Mb2cxcF9ncmFkJztcbmltcG9ydCB7bG9nR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTG9nX2dyYWQnO1xuaW1wb3J0IHtsb2dTb2Z0bWF4R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTG9nU29mdG1heF9ncmFkJztcbmltcG9ydCB7bHJuR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTFJOX2dyYWQnO1xuaW1wb3J0IHttYXhHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9NYXhfZ3JhZCc7XG5pbXBvcnQge21heGltdW1HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9NYXhpbXVtX2dyYWQnO1xuaW1wb3J0IHttYXhQb29sM0RHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9NYXhQb29sM0RfZ3JhZCc7XG5pbXBvcnQge21heFBvb2xHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9NYXhQb29sX2dyYWQnO1xuaW1wb3J0IHttZWFuR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTWVhbl9ncmFkJztcbmltcG9ydCB7bWluR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTWluX2dyYWQnO1xuaW1wb3J0IHttaW5pbXVtR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTWluaW11bV9ncmFkJztcbmltcG9ydCB7bWlycm9yUGFkR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTWlycm9yUGFkX2dyYWQnO1xuaW1wb3J0IHttb2RHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Nb2RfZ3JhZCc7XG5pbXBvcnQge211bHRpcGx5R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvTXVsdGlwbHlfZ3JhZCc7XG5pbXBvcnQge25lZ0dyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL05lZ19ncmFkJztcbmltcG9ydCB7b25lSG90R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvT25lSG90X2dyYWQnO1xuaW1wb3J0IHtvbmVzTGlrZUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL09uZXNMaWtlX2dyYWQnO1xuaW1wb3J0IHtwYWNrR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUGFja19ncmFkJztcbmltcG9ydCB7cGFkVjJHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9QYWRWMl9ncmFkJztcbmltcG9ydCB7cG93R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUG93X2dyYWQnO1xuaW1wb3J0IHtwcmVsdUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1ByZWx1X2dyYWQnO1xuaW1wb3J0IHtwcm9kR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUHJvZF9ncmFkJztcbmltcG9ydCB7ZGl2R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmVhbERpdl9ncmFkJztcbmltcG9ydCB7cmVjaXByb2NhbEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1JlY2lwcm9jYWxfZ3JhZCc7XG5pbXBvcnQge3JlbHU2R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmVsdTZfZ3JhZCc7XG5pbXBvcnQge3JlbHVHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9SZWx1X2dyYWQnO1xuaW1wb3J0IHtyZXNoYXBlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmVzaGFwZV9ncmFkJztcbmltcG9ydCB7cmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9SZXNpemVCaWxpbmVhcl9ncmFkJztcbmltcG9ydCB7cmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmVzaXplTmVhcmVzdE5laWdoYm9yX2dyYWQnO1xuaW1wb3J0IHtyZXZlcnNlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvUmV2ZXJzZV9ncmFkJztcbmltcG9ydCB7cm91bmRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Sb3VuZF9ncmFkJztcbmltcG9ydCB7cnNxcnRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Sc3FydF9ncmFkJztcbmltcG9ydCB7c2VsZWN0R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU2VsZWN0X2dyYWQnO1xuaW1wb3J0IHtzZWx1R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU2VsdV9ncmFkJztcbmltcG9ydCB7c2lnbW9pZEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1NpZ21vaWRfZ3JhZCc7XG5pbXBvcnQge3NpZ25HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TaWduX2dyYWQnO1xuaW1wb3J0IHtzaW5HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TaW5fZ3JhZCc7XG5pbXBvcnQge3NpbmhHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TaW5oX2dyYWQnO1xuaW1wb3J0IHtzbGljZUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1NsaWNlX2dyYWQnO1xuaW1wb3J0IHtzb2Z0bWF4R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU29mdG1heF9ncmFkJztcbmltcG9ydCB7c29mdHBsdXNHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9Tb2Z0cGx1c19ncmFkJztcbmltcG9ydCB7c3BhY2VUb0JhdGNoTkRHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TcGFjZVRvQmF0Y2hORF9ncmFkJztcbmltcG9ydCB7c3BsaXRWR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3BsaXRWX2dyYWQnO1xuaW1wb3J0IHtzcXJ0R3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3FydF9ncmFkJztcbmltcG9ydCB7c3F1YXJlR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3F1YXJlX2dyYWQnO1xuaW1wb3J0IHtzcXVhcmVkRGlmZmVyZW5jZUdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1NxdWFyZWREaWZmZXJlbmNlX2dyYWQnO1xuaW1wb3J0IHtzdGVwR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3RlcF9ncmFkJztcbmltcG9ydCB7c3ViR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvU3ViX2dyYWQnO1xuaW1wb3J0IHtzdW1HcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9TdW1fZ3JhZCc7XG5pbXBvcnQge3RhbkdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1Rhbl9ncmFkJztcbmltcG9ydCB7dGFuaEdyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1RhbmhfZ3JhZCc7XG5pbXBvcnQge3RpbGVHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9UaWxlX2dyYWQnO1xuaW1wb3J0IHt0cmFuc3Bvc2VHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9UcmFuc3Bvc2VfZ3JhZCc7XG5pbXBvcnQge3VucGFja0dyYWRDb25maWd9IGZyb20gJy4vZ3JhZGllbnRzL1VucGFja19ncmFkJztcbmltcG9ydCB7dW5zb3J0ZWRTZWdtZW50U3VtR3JhZENvbmZpZ30gZnJvbSAnLi9ncmFkaWVudHMvVW5zb3J0ZWRTZWdtZW50U3VtX2dyYWQnO1xuaW1wb3J0IHt6ZXJvc0xpa2VHcmFkQ29uZmlnfSBmcm9tICcuL2dyYWRpZW50cy9aZXJvc0xpa2VfZ3JhZCc7XG5pbXBvcnQge0dyYWRDb25maWd9IGZyb20gJy4va2VybmVsX3JlZ2lzdHJ5JztcbmltcG9ydCB7cmVnaXN0ZXJHcmFkaWVudH0gZnJvbSAnLi9rZXJuZWxfcmVnaXN0cnknO1xuXG4vLyBFeHBvcnQgYWxsIGtlcm5lbCBjb25maWdzIGhlcmUgc28gdGhhdCB0aGUgcGFja2FnZSBjYW4gYXV0byByZWdpc3RlciB0aGVtXG5jb25zdCBncmFkQ29uZmlnczogR3JhZENvbmZpZ1tdID0gW1xuICBhYnNHcmFkQ29uZmlnLFxuICBhY29zR3JhZENvbmZpZyxcbiAgYWNvc2hHcmFkQ29uZmlnLFxuICBhZGRHcmFkQ29uZmlnLFxuICBhZGROR3JhZENvbmZpZyxcbiAgYXJnTWF4R3JhZENvbmZpZyxcbiAgYXJnTWluR3JhZENvbmZpZyxcbiAgYXNpbkdyYWRDb25maWcsXG4gIGFzaW5oR3JhZENvbmZpZyxcbiAgYXRhbjJHcmFkQ29uZmlnLFxuICBhdGFuR3JhZENvbmZpZyxcbiAgYXRhbmhHcmFkQ29uZmlnLFxuICBhdmdQb29sM0RHcmFkQ29uZmlnLFxuICBhdmdQb29sR3JhZENvbmZpZyxcbiAgYmF0Y2hNYXRNdWxHcmFkQ29uZmlnLFxuICBiYXRjaFRvU3BhY2VOREdyYWRDb25maWcsXG4gIGJyb2FkY2FzdFRvR3JhZENvbmZpZyxcbiAgY2FzdEdyYWRDb25maWcsXG4gIGNlaWxHcmFkQ29uZmlnLFxuICBjbGlwQnlWYWx1ZUdyYWRDb25maWcsXG4gIGNvbXBsZXhBYnNHcmFkQ29uZmlnLFxuICBjb25jYXRHcmFkQ29uZmlnLFxuICBjb252MkRCYWNrcHJvcElucHV0R3JhZENvbmZpZyxcbiAgY29udjJER3JhZENvbmZpZyxcbiAgY29udjNER3JhZENvbmZpZyxcbiAgY29zR3JhZENvbmZpZyxcbiAgY29zaEdyYWRDb25maWcsXG4gIGN1bXN1bUdyYWRDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUdyYWRDb25maWcsXG4gIGRpbGF0aW9uMmRHcmFkQ29uZmlnLFxuICBkaXZHcmFkQ29uZmlnLFxuICBlbHVHcmFkQ29uZmlnLFxuICBlcmZHcmFkQ29uZmlnLFxuICBleHBHcmFkQ29uZmlnLFxuICBleHBhbmREaW1zR3JhZENvbmZpZyxcbiAgZXhwbTFHcmFkQ29uZmlnLFxuICBmbG9vckRpdkdyYWRDb25maWcsXG4gIGZsb29yR3JhZENvbmZpZyxcbiAgZnVzZWRCYXRjaE5vcm1HcmFkQ29uZmlnLFxuICBnYXRoZXJHcmFkQ29uZmlnLFxuICBncmVhdGVyRXF1YWxHcmFkQ29uZmlnLFxuICBpZGVudGl0eUdyYWRDb25maWcsXG4gIGlzRmluaXRlR3JhZENvbmZpZyxcbiAgaXNJbmZHcmFkQ29uZmlnLFxuICBpc05hbkdyYWRDb25maWcsXG4gIGxlYWt5UmVsdUdyYWRDb25maWcsXG4gIGxvZzFwR3JhZENvbmZpZyxcbiAgbG9nR3JhZENvbmZpZyxcbiAgbG9nU29mdG1heEdyYWRDb25maWcsXG4gIGxybkdyYWRDb25maWcsXG4gIG1heEdyYWRDb25maWcsXG4gIG1heEdyYWRDb25maWcsXG4gIG1heGltdW1HcmFkQ29uZmlnLFxuICBtYXhQb29sM0RHcmFkQ29uZmlnLFxuICBtYXhQb29sR3JhZENvbmZpZyxcbiAgbWVhbkdyYWRDb25maWcsXG4gIG1pbkdyYWRDb25maWcsXG4gIG1pbmltdW1HcmFkQ29uZmlnLFxuICBtaXJyb3JQYWRHcmFkQ29uZmlnLFxuICBtb2RHcmFkQ29uZmlnLFxuICBtdWx0aXBseUdyYWRDb25maWcsXG4gIG5lZ0dyYWRDb25maWcsXG4gIG9uZUhvdEdyYWRDb25maWcsXG4gIG9uZXNMaWtlR3JhZENvbmZpZyxcbiAgcGFja0dyYWRDb25maWcsXG4gIHBhZFYyR3JhZENvbmZpZyxcbiAgcGFkVjJHcmFkQ29uZmlnLFxuICBwb3dHcmFkQ29uZmlnLFxuICBwcmVsdUdyYWRDb25maWcsXG4gIHByb2RHcmFkQ29uZmlnLFxuICByZWNpcHJvY2FsR3JhZENvbmZpZyxcbiAgcmVsdTZHcmFkQ29uZmlnLFxuICByZWx1R3JhZENvbmZpZyxcbiAgcmVzaGFwZUdyYWRDb25maWcsXG4gIHJlc2l6ZUJpbGluZWFyR3JhZENvbmZpZyxcbiAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgcmV2ZXJzZUdyYWRDb25maWcsXG4gIHJvdW5kR3JhZENvbmZpZyxcbiAgcnNxcnRHcmFkQ29uZmlnLFxuICBzZWxlY3RHcmFkQ29uZmlnLFxuICBzZWx1R3JhZENvbmZpZyxcbiAgc2lnbW9pZEdyYWRDb25maWcsXG4gIHNpZ25HcmFkQ29uZmlnLFxuICBzaW5HcmFkQ29uZmlnLFxuICBzaW5oR3JhZENvbmZpZyxcbiAgc2xpY2VHcmFkQ29uZmlnLFxuICBzb2Z0bWF4R3JhZENvbmZpZyxcbiAgc29mdHBsdXNHcmFkQ29uZmlnLFxuICBzcGFjZVRvQmF0Y2hOREdyYWRDb25maWcsXG4gIHNwYWNlVG9CYXRjaE5ER3JhZENvbmZpZyxcbiAgc3BsaXRWR3JhZENvbmZpZyxcbiAgc3BsaXRWR3JhZENvbmZpZyxcbiAgc3FydEdyYWRDb25maWcsXG4gIHNxdWFyZWREaWZmZXJlbmNlR3JhZENvbmZpZyxcbiAgc3F1YXJlR3JhZENvbmZpZyxcbiAgc3RlcEdyYWRDb25maWcsXG4gIHN1YkdyYWRDb25maWcsXG4gIHN1bUdyYWRDb25maWcsXG4gIHRhbkdyYWRDb25maWcsXG4gIHRhbmhHcmFkQ29uZmlnLFxuICB0aWxlR3JhZENvbmZpZyxcbiAgdHJhbnNwb3NlR3JhZENvbmZpZyxcbiAgdW5wYWNrR3JhZENvbmZpZyxcbiAgdW5zb3J0ZWRTZWdtZW50U3VtR3JhZENvbmZpZyxcbiAgemVyb3NMaWtlR3JhZENvbmZpZ1xuXTtcblxuZm9yIChjb25zdCBncmFkaWVudENvbmZpZyBvZiBncmFkQ29uZmlncykge1xuICByZWdpc3RlckdyYWRpZW50KGdyYWRpZW50Q29uZmlnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { abs } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.abs = function () {\n    this.throwIfDisposed();\n    return abs(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7YWJzfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYWJzPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFicyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGFicyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { acos } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.acos = function () {\n    this.throwIfDisposed();\n    return acos(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2Fjb3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHthY29zfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYWNvczxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hY29zID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCkge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYWNvcyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { acosh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.acosh = function () {\n    this.throwIfDisposed();\n    return acosh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWNvc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hY29zaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBQ3ZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2Fjb3NofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYWNvc2g8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYWNvc2ggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKSB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhY29zaCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { add } from '../../ops/add';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.add = function (b) {\n    this.throwIfDisposed();\n    return add(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYWRkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHthZGR9IGZyb20gJy4uLy4uL29wcy9hZGQnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBhZGQ8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhZGQodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { all } from '../../ops/all';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.all = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return all(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUMxQixJQUFzQixFQUFFLFFBQWtCO0lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YWxsfSBmcm9tICcuLi8uLi9vcHMvYWxsJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYWxsPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sIGtlZXBEaW1zPzogYm9vbGVhbik6XG4gICAgICAgIFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYWxsID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhbGwodGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { any } from '../../ops/any';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.any = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return any(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYW55LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUMxQixJQUFzQixFQUFFLFFBQWtCO0lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YW55fSBmcm9tICcuLi8uLi9vcHMvYW55JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYW55PFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sIGtlZXBEaW1zPzogYm9vbGVhbik6XG4gICAgICAgIFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYW55ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhbnkodGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { argMax } from '../../ops/arg_max';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.argMax = function (axis) {\n    this.throwIfDisposed();\n    return argMax(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FyZ19tYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFDdEMsSUFBYTtJQUNmLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHthcmdNYXh9IGZyb20gJy4uLy4uL29wcy9hcmdfbWF4JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXJnTWF4PFQgZXh0ZW5kcyBUZW5zb3I+KGF4aXM/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFyZ01heCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGF4aXM/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGFyZ01heCh0aGlzLCBheGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { argMin } from '../../ops/arg_min';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.argMin = function (axis) {\n    this.throwIfDisposed();\n    return argMin(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FyZ19taW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFDdEMsSUFBWTtJQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHthcmdNaW59IGZyb20gJy4uLy4uL29wcy9hcmdfbWluJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXJnTWluPFQgZXh0ZW5kcyBUZW5zb3I+KGF4aXM/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFyZ01pbiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGF4aXM6IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYXJnTWluKHRoaXMsIGF4aXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\nimport { assert } from '../../util';\n/**\n * Converts a size-1 `tf.Tensor` to a `tf.Scalar`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.asScalar = function () {\n    this.throwIfDisposed();\n    assert(this.size === 1, () => 'The array must have only 1 element.');\n    return reshape(this, []);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNfc2NhbGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYXNfc2NhbGFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsb0JBQW9CLEVBQWlCLE1BQU0sY0FBYyxDQUFDO0FBRWxFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFRbEM7OztHQUdHO0FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHO0lBRTFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMscUNBQXFDLENBQUMsQ0FBQztJQUNyRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uLy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFNjYWxhciwgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5pbXBvcnQge2Fzc2VydH0gZnJvbSAnLi4vLi4vdXRpbCc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBhc1NjYWxhcjxUIGV4dGVuZHMgVGVuc29yPigpOiBTY2FsYXI7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIHNpemUtMSBgdGYuVGVuc29yYCB0byBhIGB0Zi5TY2FsYXJgLlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFzU2NhbGFyID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6XG4gICAgU2NhbGFyIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgYXNzZXJ0KHRoaXMuc2l6ZSA9PT0gMSwgKCkgPT4gJ1RoZSBhcnJheSBtdXN0IGhhdmUgb25seSAxIGVsZW1lbnQuJyk7XG4gIHJldHVybiByZXNoYXBlKHRoaXMsIFtdKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Casts a `tf.Tensor` to a specified dtype.\n *\n * @param dtype Data-type to cast the tensor to.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.asType = function (dtype) {\n    this.throwIfDisposed();\n    return cast(this, dtype);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNfdHlwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzX3R5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFEOzs7Ozs7R0FNRztBQUNILG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUM3QixLQUFlO0lBQzFCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBSSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDOUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzVHlwZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBkdHlwZTogRGF0YVR5cGUpOiBUO1xuICB9XG59XG5cbi8qKlxuICogQ2FzdHMgYSBgdGYuVGVuc29yYCB0byBhIHNwZWNpZmllZCBkdHlwZS5cbiAqXG4gKiBAcGFyYW0gZHR5cGUgRGF0YS10eXBlIHRvIGNhc3QgdGhlIHRlbnNvciB0by5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXNUeXBlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjYXN0PFQ+KHRoaXMsIGR0eXBlKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor1D`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as1D = function () {\n    this.throwIfDisposed();\n    return reshape(this, [this.size]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXMxZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzMWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7O0dBR0c7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUc7SUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBTSxDQUFDO0FBQ3pDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzMUQ8VCBleHRlbmRzIFRlbnNvcj4oKTogVGVuc29yMUQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDb252ZXJ0cyBhIGB0Zi5UZW5zb3JgIHRvIGEgYHRmLlRlbnNvcjFEYC5cbiAqIEBkb2Mge2hlYWRpbmc6ICdUZW5zb3JzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICovXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hczFEID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiByZXNoYXBlKHRoaXMsIFt0aGlzLnNpemVdKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor2D`.\n *\n * @param rows Number of rows in `tf.Tensor2D`.\n * @param columns Number of columns in `tf.Tensor2D`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as2D = function (rows, columns) {\n    this.throwIfDisposed();\n    return reshape(this, [rows, columns]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXMyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7Ozs7O0dBTUc7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDcEMsSUFBWSxFQUFFLE9BQWU7SUFDL0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBTSxDQUFDO0FBQzdDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzMkQ8VCBleHRlbmRzIFRlbnNvcj4ocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBUZW5zb3IyRDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYHRmLlRlbnNvcmAgdG8gYSBgdGYuVGVuc29yMkRgLlxuICpcbiAqIEBwYXJhbSByb3dzIE51bWJlciBvZiByb3dzIGluIGB0Zi5UZW5zb3IyRGAuXG4gKiBAcGFyYW0gY29sdW1ucyBOdW1iZXIgb2YgY29sdW1ucyBpbiBgdGYuVGVuc29yMkRgLlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFzMkQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaGFwZSh0aGlzLCBbcm93cywgY29sdW1uc10pIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor3D`.\n *\n * @param rows Number of rows in `tf.Tensor3D`.\n * @param columns Number of columns in `tf.Tensor3D`.\n * @param depth Depth of `tf.Tensor3D`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as3D = function (rows, columns, depth) {\n    this.throwIfDisposed();\n    return reshape(this, [rows, columns, depth]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXMzZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzM2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRDs7Ozs7OztHQU9HO0FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFVBQ3BDLElBQVksRUFBRSxPQUFlLEVBQUUsS0FBYTtJQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBTSxDQUFDO0FBQ3BELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzM0Q8VCBleHRlbmRzIFRlbnNvcj4ocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsIGRlcHRoOiBudW1iZXIpOlxuICAgICAgICBUZW5zb3IzRDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnRzIGEgYHRmLlRlbnNvcmAgdG8gYSBgdGYuVGVuc29yM0RgLlxuICpcbiAqIEBwYXJhbSByb3dzIE51bWJlciBvZiByb3dzIGluIGB0Zi5UZW5zb3IzRGAuXG4gKiBAcGFyYW0gY29sdW1ucyBOdW1iZXIgb2YgY29sdW1ucyBpbiBgdGYuVGVuc29yM0RgLlxuICogQHBhcmFtIGRlcHRoIERlcHRoIG9mIGB0Zi5UZW5zb3IzRGAuXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXMzRCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLCBkZXB0aDogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiByZXNoYXBlKHRoaXMsIFtyb3dzLCBjb2x1bW5zLCBkZXB0aF0pIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor4D`.\n *\n * @param rows Number of rows in `tf.Tensor4D`.\n * @param columns Number of columns in `tf.Tensor4D`.\n * @param depth Depth of `tf.Tensor4D`.\n * @param depth2 4th dimension of `tf.Tensor4D`.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as4D = function (rows, columns, depth, depth2) {\n    this.throwIfDisposed();\n    return reshape(this, [rows, columns, depth, depth2]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXM0ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzNGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRDs7Ozs7Ozs7R0FRRztBQUNILG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUNwQyxJQUFZLEVBQUUsT0FBZSxFQUFFLEtBQWEsRUFBRSxNQUFjO0lBQzlELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBTSxDQUFDO0FBQzVELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGFzNEQ8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLCBkZXB0aDogbnVtYmVyLCBkZXB0aDI6IG51bWJlcik6IFRlbnNvcjREO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBgdGYuVGVuc29yYCB0byBhIGB0Zi5UZW5zb3I0RGAuXG4gKlxuICogQHBhcmFtIHJvd3MgTnVtYmVyIG9mIHJvd3MgaW4gYHRmLlRlbnNvcjREYC5cbiAqIEBwYXJhbSBjb2x1bW5zIE51bWJlciBvZiBjb2x1bW5zIGluIGB0Zi5UZW5zb3I0RGAuXG4gKiBAcGFyYW0gZGVwdGggRGVwdGggb2YgYHRmLlRlbnNvcjREYC5cbiAqIEBwYXJhbSBkZXB0aDIgNHRoIGRpbWVuc2lvbiBvZiBgdGYuVGVuc29yNERgLlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmFzNEQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlciwgZGVwdGg6IG51bWJlciwgZGVwdGgyOiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJlc2hhcGUodGhpcywgW3Jvd3MsIGNvbHVtbnMsIGRlcHRoLCBkZXB0aDJdKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Converts a `tf.Tensor` to a `tf.Tensor5D`.\n *\n * @param rows Number of rows in `tf.Tensor5D`.\n * @param columns Number of columns in `tf.Tensor5D`.\n * @param depth Depth of `tf.Tensor5D`.\n * @param depth2 4th dimension of `tf.Tensor5D`.\n * @param depth3 5th dimension of 'tf.Tensor5D'\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.as5D = function (rows, columns, depth, depth2, depth3) {\n    this.throwIfDisposed();\n    return reshape(this, [rows, columns, depth, depth2, depth3]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXM1ZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzNWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVcxRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxHQUFHLFVBQ3BDLElBQVksRUFBRSxPQUFlLEVBQUUsS0FBYSxFQUFFLE1BQWMsRUFDNUQsTUFBYztJQUNoQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFNLENBQUM7QUFDcEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uLy4uL29wcy9yZXNoYXBlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXM1RDxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgICAgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsIGRlcHRoMjogbnVtYmVyLFxuICAgICAgICBkZXB0aDM6IG51bWJlcik6IFRlbnNvcjVEO1xuICB9XG59XG5cbi8qKlxuICogQ29udmVydHMgYSBgdGYuVGVuc29yYCB0byBhIGB0Zi5UZW5zb3I1RGAuXG4gKlxuICogQHBhcmFtIHJvd3MgTnVtYmVyIG9mIHJvd3MgaW4gYHRmLlRlbnNvcjVEYC5cbiAqIEBwYXJhbSBjb2x1bW5zIE51bWJlciBvZiBjb2x1bW5zIGluIGB0Zi5UZW5zb3I1RGAuXG4gKiBAcGFyYW0gZGVwdGggRGVwdGggb2YgYHRmLlRlbnNvcjVEYC5cbiAqIEBwYXJhbSBkZXB0aDIgNHRoIGRpbWVuc2lvbiBvZiBgdGYuVGVuc29yNURgLlxuICogQHBhcmFtIGRlcHRoMyA1dGggZGltZW5zaW9uIG9mICd0Zi5UZW5zb3I1RCdcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXM1RCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLCBkZXB0aDogbnVtYmVyLCBkZXB0aDI6IG51bWJlcixcbiAgICBkZXB0aDM6IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaGFwZSh0aGlzLCBbcm93cywgY29sdW1ucywgZGVwdGgsIGRlcHRoMiwgZGVwdGgzXSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { asin } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.asin = function () {\n    this.throwIfDisposed();\n    return asin(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2FzaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHthc2lufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXNpbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hc2luID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYXNpbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { asinh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.asinh = function () {\n    this.throwIfDisposed();\n    return asinh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXNpbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hc2luaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2FzaW5ofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXNpbmg8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXNpbmggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGFzaW5oKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { atan } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.atan = function () {\n    this.throwIfDisposed();\n    return atan(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2F0YW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHthdGFufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXRhbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hdGFuID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYXRhbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { atan2 } from '../../ops/atan2';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.atan2 = function (b) {\n    this.throwIfDisposed();\n    return atan2(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hdGFuMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUNyQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YXRhbjJ9IGZyb20gJy4uLy4uL29wcy9hdGFuMic7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGF0YW4yPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hdGFuMiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBhdGFuMih0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { atanh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.atanh = function () {\n    this.throwIfDisposed();\n    return atanh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXRhbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hdGFuaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2F0YW5ofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgYXRhbmg8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYXRhbmggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGF0YW5oKHRoaXMpO1xufTtcbiJdfQ==","import { avgPool } from '../../ops/avg_pool';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.avgPool =\n    function (filterSize, strides, pad, dimRoundingMode) {\n        this.throwIfDisposed();\n        return avgPool(this, filterSize, strides, pad, dimRoundingMode);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9hdmdfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFZdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTztJQUNwQyxVQUNhLFVBQW1DLEVBQzVDLE9BQWdDLEVBQ2hDLEdBQTBDLEVBQzFDLGVBQXdDO1FBQzlDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4uLy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHthdmdQb29sfSBmcm9tICcuLi8uLi9vcHMvYXZnX3Bvb2wnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBhdmdQb29sPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLFxuICAgICAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5hdmdQb29sID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICB0aGlzOiBULCBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZyxcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gYXZnUG9vbCh0aGlzLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { batchToSpaceND } from '../../ops/batch_to_space_nd';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.batchToSpaceND = function (blockShape, crops) {\n    this.throwIfDisposed();\n    return batchToSpaceND(this, blockShape, crops);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hfdG9fc3BhY2VfbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9iYXRjaF90b19zcGFjZV9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUM5QyxVQUFvQixFQUFFLEtBQWlCO0lBQ3pDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2pELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmF0Y2hUb1NwYWNlTkR9IGZyb20gJy4uLy4uL29wcy9iYXRjaF90b19zcGFjZV9uZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGJhdGNoVG9TcGFjZU5EPFIgZXh0ZW5kcyBSYW5rPihibG9ja1NoYXBlOiBudW1iZXJbXSwgY3JvcHM6IG51bWJlcltdW10pOlxuICAgICAgICBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYmF0Y2hUb1NwYWNlTkQgPSBmdW5jdGlvbjxSIGV4dGVuZHMgUmFuaz4oXG4gICAgYmxvY2tTaGFwZTogbnVtYmVyW10sIGNyb3BzOiBudW1iZXJbXVtdKTogVGVuc29yPFI+IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGJhdGNoVG9TcGFjZU5EKHRoaXMsIGJsb2NrU2hhcGUsIGNyb3BzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { batchNorm } from '../../ops/batchnorm';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.batchNorm = function (mean, variance, offset, scale, varianceEpsilon) {\n    this.throwIfDisposed();\n    return batchNorm(this, mean, variance, offset, scale, varianceEpsilon);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYmF0Y2hub3JtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsb0JBQW9CLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBY3BFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUN6QyxJQUFtQyxFQUNuQyxRQUF1QyxFQUN2QyxNQUFzQyxFQUN0QyxLQUFxQyxFQUNyQyxlQUF3QjtJQUMxQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxlQUFlLENBQUMsQ0FBQztBQUN6RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhdGNoTm9ybX0gZnJvbSAnLi4vLi4vb3BzL2JhdGNobm9ybSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBiYXRjaE5vcm08VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIG1lYW46IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgICAgICB2YXJpYW5jZTogVGVuc29yPFI+fFRlbnNvcjFEfFRlbnNvckxpa2UsXG4gICAgICAgIG9mZnNldD86IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgICAgICBzY2FsZT86IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgICAgICB2YXJpYW5jZUVwc2lsb24/OiBudW1iZXIpOiBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYmF0Y2hOb3JtID0gZnVuY3Rpb248UiBleHRlbmRzIFJhbms+KFxuICAgIG1lYW46IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHZhcmlhbmNlOiBUZW5zb3I8Uj58VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBvZmZzZXQ/OiBUZW5zb3I8Uj58VGVuc29yMUR8VGVuc29yTGlrZSxcbiAgICBzY2FsZT86IFRlbnNvcjxSPnxUZW5zb3IxRHxUZW5zb3JMaWtlLFxuICAgIHZhcmlhbmNlRXBzaWxvbj86IG51bWJlcik6IFRlbnNvcjxSPiB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBiYXRjaE5vcm0odGhpcywgbWVhbiwgdmFyaWFuY2UsIG9mZnNldCwgc2NhbGUsIHZhcmlhbmNlRXBzaWxvbik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { broadcastTo } from '../../ops/broadcast_to';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.broadcastTo = function (shape) {\n    this.throwIfDisposed();\n    return broadcastTo(this, shape);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvYWRjYXN0X3RvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvYnJvYWRjYXN0X3RvLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUNuRCxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsV0FBVyxHQUFHLFVBQzNDLEtBQWtCO0lBQ3BCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFdBQVcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Jyb2FkY2FzdFRvfSBmcm9tICcuLi8uLi9vcHMvYnJvYWRjYXN0X3RvJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgU2hhcGVNYXB9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGJyb2FkY2FzdFRvPFIgZXh0ZW5kcyBSYW5rPihzaGFwZTogU2hhcGVNYXBbUl0pOiBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuYnJvYWRjYXN0VG8gPSBmdW5jdGlvbjxSIGV4dGVuZHMgUmFuaz4oXG4gICAgc2hhcGU6IFNoYXBlTWFwW1JdKTogVGVuc29yPFI+IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGJyb2FkY2FzdFRvKHRoaXMsIHNoYXBlKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cast = function (dtype) {\n    this.throwIfDisposed();\n    return cast(this, dtype);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2Nhc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUNwQyxLQUFlO0lBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFNLENBQUM7QUFDaEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7RGF0YVR5cGUsIFJhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGNhc3Q8VCBleHRlbmRzIFRlbnNvcj4oZHR5cGU6IERhdGFUeXBlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5jYXN0ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjYXN0KHRoaXMsIGR0eXBlKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { ceil } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.ceil = function () {\n    this.throwIfDisposed();\n    return ceil(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2NlaWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjZWlsfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY2VpbDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5jZWlsID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gY2VpbCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { clipByValue } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.clipByValue = function (min, max) {\n    this.throwIfDisposed();\n    return clipByValue(this, min, max);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcF9ieV92YWx1ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2NsaXBfYnlfdmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxVQUMzQyxHQUFXLEVBQUUsR0FBVztJQUMxQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQU0sQ0FBQztBQUMxQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2NsaXBCeVZhbHVlfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY2xpcEJ5VmFsdWU8VCBleHRlbmRzIFRlbnNvcj4obWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogVGVuc29yO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmNsaXBCeVZhbHVlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgbWluOiBudW1iZXIsIG1heDogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjbGlwQnlWYWx1ZSh0aGlzLCBtaW4sIG1heCkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { concat } from '../../ops/concat';\nimport { getGlobalTensorClass, Tensor } from '../../tensor';\ngetGlobalTensorClass().prototype.concat = function (x, axis) {\n    this.throwIfDisposed();\n    if (x instanceof Tensor) {\n        x = [x];\n    }\n    return concat([this, ...x], axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY29uY2F0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUUsTUFBTSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUN0QyxDQUF3QixFQUFFLElBQWE7SUFDekMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLElBQUksQ0FBQyxZQUFZLE1BQU0sRUFBRTtRQUN2QixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNUO0lBQ0QsT0FBTyxNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQU0sQ0FBQztBQUN6QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi4vLi4vb3BzL2NvbmNhdCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGNvbmNhdDxUIGV4dGVuZHMgVGVuc29yPih0ZW5zb3JzOiBUfEFycmF5PFR8VGVuc29yTGlrZT4sIGF4aXM/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmNvbmNhdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHg6IFR8QXJyYXk8VHxUZW5zb3JMaWtlPiwgYXhpcz86IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICBpZiAoeCBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgIHggPSBbeF07XG4gIH1cbiAgcmV0dXJuIGNvbmNhdChbdGhpcywgLi4ueF0sIGF4aXMpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { conv1d } from '../../ops/conv1d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.conv1d = function (filter, stride, pad, dataFormat, dilation, dimRoundingMode) {\n    this.throwIfDisposed();\n    return conv1d(this, filter, stride, pad, dataFormat, dilation, dimRoundingMode);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY29udjFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBWXRFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUN0QyxNQUE2QixFQUFFLE1BQWMsRUFDN0MsR0FBMEMsRUFBRSxVQUF3QixFQUNwRSxRQUFpQixFQUFFLGVBQXdDO0lBQzdELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FDRixJQUFJLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFDL0MsZUFBZSxDQUFNLENBQUM7QUFDbkMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtjb252MWR9IGZyb20gJy4uLy4uL29wcy9jb252MWQnO1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4uLy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yMkQsIFRlbnNvcjNEfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlM0R9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGNvbnYxZDxUIGV4dGVuZHMgVGVuc29yMkR8VGVuc29yM0Q+KFxuICAgICAgICBmaWx0ZXI6IFRlbnNvcjNEfFRlbnNvckxpa2UzRCwgc3RyaWRlOiBudW1iZXIsXG4gICAgICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZywgZGF0YUZvcm1hdD86ICdOV0MnfCdOQ1cnLFxuICAgICAgICBkaWxhdGlvbj86IG51bWJlciwgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuY29udjFkID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcjJEfFRlbnNvcjNEPihcbiAgICBmaWx0ZXI6IFRlbnNvcjNEfFRlbnNvckxpa2UzRCwgc3RyaWRlOiBudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLCBkYXRhRm9ybWF0PzogJ05XQyd8J05DVycsXG4gICAgZGlsYXRpb24/OiBudW1iZXIsIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGNvbnYxZChcbiAgICAgICAgICAgICB0aGlzLCBmaWx0ZXIsIHN0cmlkZSwgcGFkLCBkYXRhRm9ybWF0LCBkaWxhdGlvbixcbiAgICAgICAgICAgICBkaW1Sb3VuZGluZ01vZGUpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { conv2dTranspose } from '../../ops/conv2d_transpose';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.conv2dTranspose =\n    function (filter, outputShape, strides, pad, dimRoundingMode) {\n        this.throwIfDisposed();\n        return conv2dTranspose(this, filter, outputShape, strides, pad, dimRoundingMode);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkX3RyYW5zcG9zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2NvbnYyZF90cmFuc3Bvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFhdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZTtJQUM1QyxVQUNJLE1BQTZCLEVBQzdCLFdBQXNFLEVBQ3RFLE9BQWdDLEVBQUUsR0FBMEIsRUFDNUQsZUFBd0M7UUFDOUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sZUFBZSxDQUNYLElBQUksRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFNLENBQUM7SUFDNUUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtjb252MmRUcmFuc3Bvc2V9IGZyb20gJy4uLy4uL29wcy9jb252MmRfdHJhbnNwb3NlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZTREfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBjb252MmRUcmFuc3Bvc2U8VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgZmlsdGVyOiBUZW5zb3I0RHxUZW5zb3JMaWtlNEQsXG4gICAgICAgIG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXXxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwYWQ6ICd2YWxpZCd8J3NhbWUnfG51bWJlcixcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuY29udjJkVHJhbnNwb3NlID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICBmaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2U0RCxcbiAgICAgICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyLFxuICAgICAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgICAgdGhpcywgZmlsdGVyLCBvdXRwdXRTaGFwZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { conv2d } from '../../ops/conv2d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.conv2d = function (filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n    this.throwIfDisposed();\n    return conv2d(this, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udjJkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY29udjJkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBYXRFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxVQUN0QyxNQUE2QixFQUFFLE9BQWdDLEVBQy9ELEdBQTBCLEVBQUUsVUFBMEIsRUFDdEQsU0FBbUMsRUFDbkMsZUFBd0M7SUFDMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sTUFBTSxDQUNGLElBQUksRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUNqRCxlQUFlLENBQU0sQ0FBQztBQUNuQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2NvbnYyZH0gZnJvbSAnLi4vLi4vb3BzL2NvbnYyZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2U0RH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY29udjJkPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZTRELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICAgICAgICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuY29udjJkID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICBmaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2U0RCwgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICAgIGRpbGF0aW9ucz86IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGNvbnYyZChcbiAgICAgICAgICAgICB0aGlzLCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLFxuICAgICAgICAgICAgIGRpbVJvdW5kaW5nTW9kZSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cos } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cos = function () {\n    this.throwIfDisposed();\n    return cos(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY29zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7Y29zfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY29zPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmNvcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGNvcyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cosh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cosh = function () {\n    this.throwIfDisposed();\n    return cosh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29zaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2Nvc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjb3NofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgY29zaDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5jb3NoID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gY29zaCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the 'License');\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an 'AS IS' BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { cumprod } from '../../ops/cumprod';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cumprod = function (axis, exclusive, reverse) {\n    this.throwIfDisposed();\n    return cumprod(this, axis, exclusive, reverse);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VtcHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2N1bXByb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxvQkFBb0IsRUFBVSxNQUFNLGNBQWMsQ0FBQztBQWE1RCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDekMsSUFBYSxFQUNiLFNBQW1CLEVBQ25CLE9BQWlCO0lBRWpCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNqRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7IGN1bXByb2QgfSBmcm9tICcuLi8uLi9vcHMvY3VtcHJvZCc7XG5pbXBvcnQgeyBnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yIH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7IFJhbmsgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBjdW1wcm9kPFIgZXh0ZW5kcyBSYW5rPihcbiAgICAgIGF4aXM/OiBudW1iZXIsXG4gICAgICBleGNsdXNpdmU/OiBib29sZWFuLFxuICAgICAgcmV2ZXJzZT86IGJvb2xlYW5cbiAgICApOiBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuY3VtcHJvZCA9IGZ1bmN0aW9uIDxSIGV4dGVuZHMgUmFuaz4oXG4gIGF4aXM/OiBudW1iZXIsXG4gIGV4Y2x1c2l2ZT86IGJvb2xlYW4sXG4gIHJldmVyc2U/OiBib29sZWFuXG4pOiBUZW5zb3I8Uj4ge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gY3VtcHJvZCh0aGlzLCBheGlzLCBleGNsdXNpdmUsIHJldmVyc2UpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { cumsum } from '../../ops/cumsum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.cumsum = function (axis, exclusive, reverse) {\n    this.throwIfDisposed();\n    return cumsum(this, axis, exclusive, reverse);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Vtc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvY3Vtc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFVMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQ3RDLElBQWEsRUFBRSxTQUFtQixFQUFFLE9BQWlCO0lBQ3ZELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2N1bXN1bX0gZnJvbSAnLi4vLi4vb3BzL2N1bXN1bSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGN1bXN1bTxSIGV4dGVuZHMgUmFuaz4oXG4gICAgICAgIGF4aXM/OiBudW1iZXIsIGV4Y2x1c2l2ZT86IGJvb2xlYW4sIHJldmVyc2U/OiBib29sZWFuKTogVGVuc29yPFI+O1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmN1bXN1bSA9IGZ1bmN0aW9uPFIgZXh0ZW5kcyBSYW5rPihcbiAgICBheGlzPzogbnVtYmVyLCBleGNsdXNpdmU/OiBib29sZWFuLCByZXZlcnNlPzogYm9vbGVhbik6IFRlbnNvcjxSPiB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjdW1zdW0odGhpcywgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { depthToSpace } from '../../ops/depth_to_space';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.depthToSpace = function (blockSize, dataFormat) {\n    this.throwIfDisposed();\n    return depthToSpace(this, blockSize, dataFormat);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGhfdG9fc3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9kZXB0aF90b19zcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdEQsT0FBTyxFQUFDLG9CQUFvQixFQUFXLE1BQU0sY0FBYyxDQUFDO0FBVTVELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUM1QyxTQUFpQixFQUFFLFVBQXlCO0lBQzlDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFlBQVksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBTSxDQUFDO0FBQ3hELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7ZGVwdGhUb1NwYWNlfSBmcm9tICcuLi8uLi9vcHMvZGVwdGhfdG9fc3BhY2UnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGRlcHRoVG9TcGFjZTxUIGV4dGVuZHMgVGVuc29yNEQ+KFxuICAgICAgICBibG9ja1NpemU6IG51bWJlciwgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZGVwdGhUb1NwYWNlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcjREPihcbiAgICBibG9ja1NpemU6IG51bWJlciwgZGF0YUZvcm1hdDogJ05IV0MnfCdOQ0hXJyk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gZGVwdGhUb1NwYWNlKHRoaXMsIGJsb2NrU2l6ZSwgZGF0YUZvcm1hdCkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { depthwiseConv2d } from '../../ops/depthwise_conv2d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.depthwiseConv2d =\n    function (filter, strides, pad, dataFormat, dilations, dimRoundingMode) {\n        this.throwIfDisposed();\n        return depthwiseConv2d(this, filter, strides, pad, dataFormat, dilations, dimRoundingMode);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGh3aXNlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2RlcHRod2lzZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFhdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZTtJQUM1QyxVQUNJLE1BQTZCLEVBQUUsT0FBZ0MsRUFDL0QsR0FBMEIsRUFBRSxVQUEwQixFQUN0RCxTQUFtQyxFQUNuQyxlQUF3QztRQUM5QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxlQUFlLENBQ1gsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQ2pELGVBQWUsQ0FBTSxDQUFDO0lBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkfSBmcm9tICcuLi8uLi9vcHMvZGVwdGh3aXNlX2NvbnYyZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2U0RH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZGVwdGh3aXNlQ29udjJkPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZTRELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXIsIGRhdGFGb3JtYXQ/OiAnTkhXQyd8J05DSFcnLFxuICAgICAgICBkaWxhdGlvbnM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZGVwdGh3aXNlQ29udjJkID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICBmaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2U0RCwgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyLCBkYXRhRm9ybWF0PzogJ05IV0MnfCdOQ0hXJyxcbiAgICAgICAgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIGRpbVJvdW5kaW5nTW9kZT86ICdmbG9vcid8J3JvdW5kJ3wnY2VpbCcpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGRlcHRod2lzZUNvbnYyZChcbiAgICAgICAgICAgICB0aGlzLCBmaWx0ZXIsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLFxuICAgICAgICAgICAgIGRpbVJvdW5kaW5nTW9kZSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { dilation2d } from '../../ops/dilation2d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.dilation2d =\n    function (filter, strides, pad, dilations, dataFormat) {\n        this.throwIfDisposed();\n        return dilation2d(this, filter, strides, pad, dilations, dataFormat);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlsYXRpb24yZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2RpbGF0aW9uMmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFZdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVTtJQUN2QyxVQUNJLE1BQTZCLEVBQUUsT0FBZ0MsRUFDL0QsR0FBbUIsRUFBRSxTQUFtQyxFQUN4RCxVQUFtQjtRQUN6QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxVQUFVLENBQU0sQ0FBQztJQUM1RSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2RpbGF0aW9uMmR9IGZyb20gJy4uLy4uL29wcy9kaWxhdGlvbjJkJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZTNEfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBkaWxhdGlvbjJkPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlcjogVGVuc29yM0R8VGVuc29yTGlrZTNELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJywgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIGRhdGFGb3JtYXQ/OiAnTkhXQycpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmRpbGF0aW9uMmQgPVxuICAgIGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlcjogVGVuc29yM0R8VGVuc29yTGlrZTNELCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJywgZGlsYXRpb25zPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIGRhdGFGb3JtYXQ/OiAnTkhXQycpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGRpbGF0aW9uMmQodGhpcywgZmlsdGVyLCBzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGF0YUZvcm1hdCkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { divNoNan } from '../../ops/div_no_nan';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.divNoNan = function (b) {\n    this.throwIfDisposed();\n    return divNoNan(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2X25vX25hbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2Rpdl9ub19uYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUcsVUFDeEMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMzQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZGl2Tm9OYW59IGZyb20gJy4uLy4uL29wcy9kaXZfbm9fbmFuJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZGl2Tm9OYW48VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmRpdk5vTmFuID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGRpdk5vTmFuKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { div } from '../../ops/div';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.div = function (b) {\n    this.throwIfDisposed();\n    return div(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGl2LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZGl2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtkaXZ9IGZyb20gJy4uLy4uL29wcy9kaXYnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBkaXY8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBkaXYodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { dot } from '../../ops/dot';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.dot = function (b) {\n    this.throwIfDisposed();\n    return dot(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZG90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFlO0lBQ2pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDdEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtkb3R9IGZyb20gJy4uLy4uL29wcy9kb3QnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBkb3Q8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUZW5zb3I7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZG90ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYjogVHxUZW5zb3JMaWtlKTogVGVuc29yIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGRvdCh0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { elu } from '../../ops/elu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.elu = function () {\n    this.throwIfDisposed();\n    return elu(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRztJQUNyQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDbkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtlbHV9IGZyb20gJy4uLy4uL29wcy9lbHUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBlbHU8VCBleHRlbmRzIFRlbnNvcj4oKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5lbHUgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBlbHUodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { equal } from '../../ops/equal';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.equal = function (b) {\n    this.throwIfDisposed();\n    return equal(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9lcXVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUNyQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7ZXF1YWx9IGZyb20gJy4uLy4uL29wcy9lcXVhbCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGVxdWFsPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5lcXVhbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBlcXVhbCh0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { erf } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.erf = function () {\n    this.throwIfDisposed();\n    return erf(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZXJmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7ZXJmfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZXJmPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmVyZiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGVyZih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { euclideanNorm } from '../../ops/euclidean_norm';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.euclideanNorm = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return euclideanNorm(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXVjbGlkZWFuX25vcm0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9ldWNsaWRlYW5fbm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFDdkQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGFBQWEsR0FBRyxVQUNwQyxJQUFzQixFQUFFLFFBQWtCO0lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBTSxDQUFDO0FBQ2xELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtldWNsaWRlYW5Ob3JtfSBmcm9tICcuLi8uLi9vcHMvZXVjbGlkZWFuX25vcm0nO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBldWNsaWRlYW5Ob3JtPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICB0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmV1Y2xpZGVhbk5vcm0gPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGV1Y2xpZGVhbk5vcm0odGhpcywgYXhpcywga2VlcERpbXMpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { exp } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.exp = function () {\n    this.throwIfDisposed();\n    return exp(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZXhwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7ZXhwfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZXhwPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmV4cCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGV4cCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { expandDims } from '../../ops/expand_dims';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.expandDims = function (axis) {\n    this.throwIfDisposed();\n    return expandDims(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwYW5kX2RpbXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9leHBhbmRfZGltcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUMxQyxJQUFhO0lBQ2YsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2V4cGFuZERpbXN9IGZyb20gJy4uLy4uL29wcy9leHBhbmRfZGltcyc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGV4cGFuZERpbXM8VCBleHRlbmRzIFRlbnNvcj4oYXhpcz86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZXhwYW5kRGltcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGF4aXM/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGV4cGFuZERpbXModGhpcywgYXhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { expm1 } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.expm1 = function () {\n    this.throwIfDisposed();\n    return expm1(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwbTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9leHBtMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2V4cG0xfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZXhwbTE8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZXhwbTEgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGV4cG0xKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { fft } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.fft = function () {\n    this.throwIfDisposed();\n    return fft(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZ0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZmZ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFFckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBTSxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7ZmZ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZmZ0PFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFRlbnNvcik6IFRlbnNvcjtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5mZnQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUZW5zb3IpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gZmZ0KHRoaXMpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Flatten a Tensor to a 1D array.\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.flatten = function () {\n    this.throwIfDisposed();\n    return reshape(this, [this.size]);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhdHRlbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2ZsYXR0ZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7O0dBR0c7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUc7SUFDekMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBTSxDQUFDO0FBQ3pDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi8uLi9vcHMvcmVzaGFwZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGZsYXR0ZW48VCBleHRlbmRzIFRlbnNvcj4oKTogVGVuc29yMUQ7XG4gIH1cbn1cblxuLyoqXG4gKiBGbGF0dGVuIGEgVGVuc29yIHRvIGEgMUQgYXJyYXkuXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZmxhdHRlbiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaGFwZSh0aGlzLCBbdGhpcy5zaXplXSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { floor } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.floor = function () {\n    this.throwIfDisposed();\n    return floor(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9mbG9vci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2Zsb29yfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZmxvb3I8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZmxvb3IgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGZsb29yKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { floorDiv } from '../../ops/floorDiv';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.floorDiv = function (b) {\n    this.throwIfDisposed();\n    return floorDiv(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxvb3JEaXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9mbG9vckRpdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFFBQVEsR0FBRyxVQUN4QyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzNCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7Zmxvb3JEaXZ9IGZyb20gJy4uLy4uL29wcy9mbG9vckRpdic7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGZsb29yRGl2PFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5mbG9vckRpdiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBmbG9vckRpdih0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { gather } from '../../ops/gather';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.gather = function (indices, axis) {\n    this.throwIfDisposed();\n    return gather(this, indices, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvZ2F0aGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFVMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQzdCLE9BQTBCLEVBQUUsSUFBYTtJQUNwRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2F0aGVyfSBmcm9tICcuLi8uLi9vcHMvZ2F0aGVyJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZ2F0aGVyPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICB0aGlzOiBULCBpbmRpY2VzOiBUZW5zb3J8VGVuc29yTGlrZSwgYXhpcz86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZ2F0aGVyID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgaW5kaWNlczogVGVuc29yfFRlbnNvckxpa2UsIGF4aXM/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGdhdGhlcih0aGlzLCBpbmRpY2VzLCBheGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { greaterEqual } from '../../ops/greater_equal';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.greaterEqual = function (b) {\n    this.throwIfDisposed();\n    return greaterEqual(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlYXRlcl9lcXVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2dyZWF0ZXJfZXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxZQUFZLEdBQUcsVUFDNUMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2dyZWF0ZXJFcXVhbH0gZnJvbSAnLi4vLi4vb3BzL2dyZWF0ZXJfZXF1YWwnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBncmVhdGVyRXF1YWw8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmdyZWF0ZXJFcXVhbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBncmVhdGVyRXF1YWwodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { greater } from '../../ops/greater';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.greater = function (b) {\n    this.throwIfDisposed();\n    return greater(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JlYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2dyZWF0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2dyZWF0ZXJ9IGZyb20gJy4uLy4uL29wcy9ncmVhdGVyJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgZ3JlYXRlcjxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuZ3JlYXRlciA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBncmVhdGVyKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { ifft } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.ifft = function () {\n    this.throwIfDisposed();\n    return ifft(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2lmZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUV0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFNLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtpZmZ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgaWZmdDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUZW5zb3IpOiBUZW5zb3I7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuaWZmdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFRlbnNvcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gaWZmdCh0aGlzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { irfft } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.irfft = function () {\n    this.throwIfDisposed();\n    return irfft(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXJmZnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9pcmZmdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQU0sQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2lyZmZ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgaXJmZnQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVGVuc29yKTogVGVuc29yO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmlyZmZ0ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVGVuc29yKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBpcmZmdCh0aGlzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { isFinite } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.isFinite = function () {\n    this.throwIfDisposed();\n    return isFinite(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfZmluaXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvaXNfZmluaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUc7SUFFMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7aXNGaW5pdGV9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBpc0Zpbml0ZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5pc0Zpbml0ZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gaXNGaW5pdGUodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { isInf } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.isInf = function () {\n    this.throwIfDisposed();\n    return isInf(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfaW5mLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvaXNfaW5mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUc7SUFFdkMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7aXNJbmZ9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBpc0luZjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5pc0luZiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gaXNJbmYodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { isNaN } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.isNaN = function () {\n    this.throwIfDisposed();\n    return isNaN(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXNfbmFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvaXNfbmFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUc7SUFFdkMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3JCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7aXNOYU59IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBpc05hTjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5pc05hTiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gaXNOYU4odGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { leakyRelu } from '../../ops/leaky_relu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.leakyRelu = function (alpha) {\n    this.throwIfDisposed();\n    return leakyRelu(this, alpha);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVha3lfcmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xlYWt5X3JlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFDaEMsS0FBYTtJQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bGVha3lSZWx1fSBmcm9tICcuLi8uLi9vcHMvbGVha3lfcmVsdSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGxlYWt5UmVsdTxUIGV4dGVuZHMgVGVuc29yPihhbHBoYTogbnVtYmVyKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5sZWFreVJlbHUgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBhbHBoYTogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsZWFreVJlbHUodGhpcywgYWxwaGEpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { lessEqual } from '../../ops/less_equal';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.lessEqual = function (b) {\n    this.throwIfDisposed();\n    return lessEqual(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzc19lcXVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xlc3NfZXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFDekMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2xlc3NFcXVhbH0gZnJvbSAnLi4vLi4vb3BzL2xlc3NfZXF1YWwnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsZXNzRXF1YWw8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxlc3NFcXVhbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsZXNzRXF1YWwodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { less } from '../../ops/less';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.less = function (b) {\n    this.throwIfDisposed();\n    return less(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xlc3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDcEMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2xlc3N9IGZyb20gJy4uLy4uL29wcy9sZXNzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbGVzczxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubGVzcyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsZXNzKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { localResponseNormalization } from '../../ops/local_response_normalization';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.localResponseNormalization =\n    function (depthRadius, bias, alpha, beta) {\n        this.throwIfDisposed();\n        return localResponseNormalization(this, depthRadius, bias, alpha, beta);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xvY2FsX3Jlc3BvbnNlX25vcm1hbGl6YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sd0NBQXdDLENBQUM7QUFDbEYsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLDBCQUEwQjtJQUN2RCxVQUNJLFdBQW9CLEVBQUUsSUFBYSxFQUFFLEtBQWMsRUFBRSxJQUFhO1FBQ3hFLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLDBCQUEwQixDQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQU0sQ0FBQztJQUMvRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2xvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9ufSBmcm9tICcuLi8uLi9vcHMvbG9jYWxfcmVzcG9uc2Vfbm9ybWFsaXphdGlvbic7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIGxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICBkZXB0aFJhZGl1cz86IG51bWJlciwgYmlhcz86IG51bWJlciwgYWxwaGE/OiBudW1iZXIsIGJldGE/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgICAgZGVwdGhSYWRpdXM/OiBudW1iZXIsIGJpYXM/OiBudW1iZXIsIGFscGhhPzogbnVtYmVyLCBiZXRhPzogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2NhbFJlc3BvbnNlTm9ybWFsaXphdGlvbih0aGlzLCBkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGEpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { logSigmoid } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logSigmoid = function () {\n    this.throwIfDisposed();\n    return logSigmoid(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3NpZ21vaWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dfc2lnbW9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHO0lBRTVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2xvZ1NpZ21vaWR9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dTaWdtb2lkPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvZ1NpZ21vaWQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBUKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dTaWdtb2lkKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { logSoftmax } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logSoftmax = function (axis) {\n    this.throwIfDisposed();\n    return logSoftmax(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3NvZnRtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dfc29mdG1heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFVBQ2pDLElBQWE7SUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sVUFBVSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNoQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2xvZ1NvZnRtYXh9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dTb2Z0bWF4PFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQsIGF4aXM/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvZ1NvZnRtYXggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBheGlzPzogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dTb2Z0bWF4KHRoaXMsIGF4aXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logSumExp } from '../../ops/log_sum_exp';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logSumExp = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return logSumExp(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nX3N1bV9leHAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dfc3VtX2V4cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDaEQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRyxVQUNoQyxJQUFzQixFQUFFLFFBQWtCO0lBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFNBQVMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3pDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bG9nU3VtRXhwfSBmcm9tICcuLi8uLi9vcHMvbG9nX3N1bV9leHAnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dTdW1FeHA8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHRoaXM6IFQsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sIGtlZXBEaW1zPzogYm9vbGVhbik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9nU3VtRXhwID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dTdW1FeHAodGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { log } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.log = function () {\n    this.throwIfDisposed();\n    return log(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbG9nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7bG9nfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbG9nPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvZyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGxvZyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { log1p } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.log1p = function () {\n    this.throwIfDisposed();\n    return log1p(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nMXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2cxcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2xvZzFwfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbG9nMXA8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9nMXAgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIGxvZzFwKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logicalAnd } from '../../ops/logical_and';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logicalAnd = function (b) {\n    this.throwIfDisposed();\n    return logicalAnd(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9hbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dpY2FsX2FuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUMxQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bG9naWNhbEFuZH0gZnJvbSAnLi4vLi4vb3BzL2xvZ2ljYWxfYW5kJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbG9naWNhbEFuZDxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9naWNhbEFuZCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dpY2FsQW5kKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logicalNot } from '../../ops/logical_not';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logicalNot = function () {\n    this.throwIfDisposed();\n    return logicalNot(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9ub3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dpY2FsX25vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRztJQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFNLENBQUM7QUFDL0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtsb2dpY2FsTm90fSBmcm9tICcuLi8uLi9vcHMvbG9naWNhbF9ub3QnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dpY2FsTm90PFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9naWNhbE5vdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbG9naWNhbE5vdCh0aGlzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logicalOr } from '../../ops/logical_or';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logicalOr = function (b) {\n    this.throwIfDisposed();\n    return logicalOr(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9vci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL2xvZ2ljYWxfb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFDekMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUM1QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2xvZ2ljYWxPcn0gZnJvbSAnLi4vLi4vb3BzL2xvZ2ljYWxfb3InO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rLCBUZW5zb3JMaWtlfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBsb2dpY2FsT3I8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLmxvZ2ljYWxPciA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dpY2FsT3IodGhpcywgYik7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { logicalXor } from '../../ops/logical_xor';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.logicalXor = function (b) {\n    this.throwIfDisposed();\n    return logicalXor(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF94b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9sb2dpY2FsX3hvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDakQsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRyxVQUMxQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bG9naWNhbFhvcn0gZnJvbSAnLi4vLi4vb3BzL2xvZ2ljYWxfeG9yJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbG9naWNhbFhvcjxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubG9naWNhbFhvciA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBsb2dpY2FsWG9yKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { matMul } from '../../ops/mat_mul';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.matMul = function (b, transposeA, transposeB) {\n    this.throwIfDisposed();\n    return matMul(this, b, transposeA, transposeB);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0X211bC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21hdF9tdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVcxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFDN0IsQ0FBb0IsRUFBRSxVQUFvQixFQUNuRCxVQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDakQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHttYXRNdWx9IGZyb20gJy4uLy4uL29wcy9tYXRfbXVsJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbWF0TXVsPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICBiOiBUZW5zb3J8VGVuc29yTGlrZSwgdHJhbnNwb3NlQT86IGJvb2xlYW4sXG4gICAgICAgIHRyYW5zcG9zZUI/OiBib29sZWFuKTogVGVuc29yO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLm1hdE11bCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFQsIGI6IFRlbnNvcnxUZW5zb3JMaWtlLCB0cmFuc3Bvc2VBPzogYm9vbGVhbixcbiAgICB0cmFuc3Bvc2VCPzogYm9vbGVhbik6IFRlbnNvciB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBtYXRNdWwodGhpcywgYiwgdHJhbnNwb3NlQSwgdHJhbnNwb3NlQik7XG59O1xuIl19","import { maxPool } from '../../ops/max_pool';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.maxPool =\n    function (filterSize, strides, pad, dimRoundingMode) {\n        this.throwIfDisposed();\n        return maxPool(this, filterSize, strides, pad, dimRoundingMode);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9tYXhfcG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFZdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsT0FBTztJQUNwQyxVQUNhLFVBQW1DLEVBQzVDLE9BQWdDLEVBQ2hDLEdBQTBDLEVBQzFDLGVBQXdDO1FBQzlDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDbEUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4uLy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHttYXhQb29sfSBmcm9tICcuLi8uLi9vcHMvbWF4X3Bvb2wnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBtYXhQb29sPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGZpbHRlclNpemU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJ3xudW1iZXJ8RXhwbGljaXRQYWRkaW5nLFxuICAgICAgICBkaW1Sb3VuZGluZ01vZGU/OiAnZmxvb3InfCdyb3VuZCd8J2NlaWwnKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5tYXhQb29sID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICB0aGlzOiBULCBmaWx0ZXJTaXplOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgc3RyaWRlczogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIHBhZDogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZyxcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbWF4UG9vbCh0aGlzLCBmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { max } from '../../ops/max';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.max = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return max(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbWF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxJQUFzQixFQUFFLFFBQWtCO0lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHttYXh9IGZyb20gJy4uLy4uL29wcy9tYXgnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBtYXg8VCBleHRlbmRzIFRlbnNvcj4oYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5tYXggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG1heCh0aGlzLCBheGlzLCBrZWVwRGltcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { maximum } from '../../ops/maximum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.maximum = function (b) {\n    this.throwIfDisposed();\n    return maximum(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4aW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21heGltdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge21heGltdW19IGZyb20gJy4uLy4uL29wcy9tYXhpbXVtJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbWF4aW11bTxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubWF4aW11bSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBtYXhpbXVtKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mean } from '../../ops/mean';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.mean = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return mean(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21lYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDcEMsSUFBc0IsRUFBRSxRQUFrQjtJQUM1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge21lYW59IGZyb20gJy4uLy4uL29wcy9tZWFuJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbWVhbjxUIGV4dGVuZHMgVGVuc29yPihheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLm1lYW4gPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG1lYW4odGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { min } from '../../ops/min';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.min = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return min(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxJQUFzQixFQUFFLFFBQWtCO0lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHttaW59IGZyb20gJy4uLy4uL29wcy9taW4nO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBtaW48VCBleHRlbmRzIFRlbnNvcj4oYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5taW4gPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG1pbih0aGlzLCBheGlzLCBrZWVwRGltcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { minimum } from '../../ops/minimum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.minimum = function (b) {\n    this.throwIfDisposed();\n    return minimum(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWluaW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21pbmltdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsQ0FBb0I7SUFDdEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQztBQUMxQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge21pbmltdW19IGZyb20gJy4uLy4uL29wcy9taW5pbXVtJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbWluaW11bTxUIGV4dGVuZHMgVGVuc29yPihiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUubWluaW11bSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBtaW5pbXVtKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mirrorPad } from '../../ops/mirror_pad';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.mirrorPad = function (paddings, mode) {\n    this.throwIfDisposed();\n    return mirrorPad(this, paddings, mode);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yX3BhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL21pcnJvcl9wYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFDaEMsUUFBaUMsRUFDMUMsSUFBMkI7SUFDN0IsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDekMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge21pcnJvclBhZH0gZnJvbSAnLi4vLi4vb3BzL21pcnJvcl9wYWQnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBtaXJyb3JQYWQ8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgbW9kZTogJ3JlZmxlY3QnfCdzeW1tZXRyaWMnKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5taXJyb3JQYWQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBwYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgbW9kZTogJ3JlZmxlY3QnfCdzeW1tZXRyaWMnKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBtaXJyb3JQYWQodGhpcywgcGFkZGluZ3MsIG1vZGUpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mod } from '../../ops/mod';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.mod = function (b) {\n    this.throwIfDisposed();\n    return mod(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbW9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bW9kfSBmcm9tICcuLi8uLi9vcHMvbW9kJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbW9kPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5tb2QgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbW9kKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { mul } from '../../ops/mul';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.mul = function (b) {\n    this.throwIfDisposed();\n    return mul(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbXVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7bXVsfSBmcm9tICcuLi8uLi9vcHMvbXVsJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbXVsPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5tdWwgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbXVsKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { neg } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.neg = function () {\n    this.throwIfDisposed();\n    return neg(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbmVnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7bmVnfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgbmVnPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLm5lZyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG5lZyh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { norm } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.norm = function (ord, axis, keepDims) {\n    this.throwIfDisposed();\n    return norm(this, ord, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL25vcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUNwQyxHQUE4QixFQUFFLElBQXNCLEVBQ3RELFFBQWtCO0lBQ3BCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxRQUFRLENBQU0sQ0FBQztBQUM5QyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge25vcm19IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBub3JtPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICBvcmQ/OiBudW1iZXJ8J2V1Y2xpZGVhbid8J2ZybycsIGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sXG4gICAgICAgIGtlZXBEaW1zPzogYm9vbGVhbik6IFRlbnNvcjtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5ub3JtID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgb3JkPzogbnVtYmVyfCdldWNsaWRlYW4nfCdmcm8nLCBheGlzPzogbnVtYmVyfG51bWJlcltdLFxuICAgIGtlZXBEaW1zPzogYm9vbGVhbikge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gbm9ybSh0aGlzLCBvcmQsIGF4aXMsIGtlZXBEaW1zKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { notEqual } from '../../ops/not_equal';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.notEqual = function (b) {\n    this.throwIfDisposed();\n    return notEqual(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90X2VxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvbm90X2VxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHLFVBQ3hDLENBQW9CO0lBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtub3RFcXVhbH0gZnJvbSAnLi4vLi4vb3BzL25vdF9lcXVhbCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIG5vdEVxdWFsPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5ub3RFcXVhbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBub3RFcXVhbCh0aGlzLCBiKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { oneHot } from '../../ops/one_hot';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.oneHot = function (depth, onValue = 1, offValue = 0) {\n    this.throwIfDisposed();\n    return oneHot(this, depth, onValue, offValue);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lX2hvdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL29uZV9ob3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsVUFDdEMsS0FBYSxFQUFFLE9BQU8sR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLENBQUM7SUFDMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ2hELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtvbmVIb3R9IGZyb20gJy4uLy4uL29wcy9vbmVfaG90JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgb25lSG90KGRlcHRoOiBudW1iZXIsIG9uVmFsdWU6IG51bWJlciwgb2ZmVmFsdWU6IG51bWJlcik6IFRlbnNvcjtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5vbmVIb3QgPSBmdW5jdGlvbihcbiAgICBkZXB0aDogbnVtYmVyLCBvblZhbHVlID0gMSwgb2ZmVmFsdWUgPSAwKTogVGVuc29yIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIG9uZUhvdCh0aGlzLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { onesLike } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.onesLike = function () {\n    this.throwIfDisposed();\n    return onesLike(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25lc19saWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvb25lc19saWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEdBQUc7SUFFMUMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7b25lc0xpa2V9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBvbmVzTGlrZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5vbmVzTGlrZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gb25lc0xpa2UodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { pad } from '../../ops/pad';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.pad = function (paddings, constantValue) {\n    this.throwIfDisposed();\n    return pad(this, paddings, constantValue);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvcGFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUMxQixRQUFpQyxFQUFFLGFBQXFCO0lBQ25FLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQzVDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtwYWR9IGZyb20gJy4uLy4uL29wcy9wYWQnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBwYWQ8VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgY29uc3RhbnRWYWx1ZT86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucGFkID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LCBjb25zdGFudFZhbHVlOiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHBhZCh0aGlzLCBwYWRkaW5ncywgY29uc3RhbnRWYWx1ZSk7XG59O1xuIl19","import { pool } from '../../ops/pool';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.pool = function (windowShape, poolingType, padding, dilationRate, strides, dimRoundingMode) {\n    this.throwIfDisposed();\n    return pool(this, windowShape, poolingType, padding, dilationRate, strides, dimRoundingMode);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Bvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBaUJBLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBY3RFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUMzQixXQUFvQyxFQUFFLFdBQXdCLEVBQ3ZFLE9BQThDLEVBQzlDLFlBQXNDLEVBQ3RDLE9BQWlDLEVBQ2pDLGVBQXdDO0lBQzFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFDOUQsZUFBZSxDQUFDLENBQUM7QUFDL0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtFeHBsaWNpdFBhZGRpbmd9IGZyb20gJy4uLy4uL29wcy9jb252X3V0aWwnO1xuaW1wb3J0IHtwb29sfSBmcm9tICcuLi8uLi9vcHMvcG9vbCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHBvb2w8VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgd2luZG93U2hhcGU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwb29saW5nVHlwZTogJ2F2Zyd8J21heCcsXG4gICAgICAgIHBhZGRpbmc6ICd2YWxpZCd8J3NhbWUnfG51bWJlcnxFeHBsaWNpdFBhZGRpbmcsXG4gICAgICAgIGRpYXRpb25SYXRlPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgICAgIHN0cmlkZXM/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucG9vbCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgdGhpczogVCwgd2luZG93U2hhcGU6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLCBwb29saW5nVHlwZTogJ21heCd8J2F2ZycsXG4gICAgcGFkZGluZzogJ3ZhbGlkJ3wnc2FtZSd8bnVtYmVyfEV4cGxpY2l0UGFkZGluZyxcbiAgICBkaWxhdGlvblJhdGU/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICBzdHJpZGVzPzogW251bWJlciwgbnVtYmVyXXxudW1iZXIsXG4gICAgZGltUm91bmRpbmdNb2RlPzogJ2Zsb29yJ3wncm91bmQnfCdjZWlsJyk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcG9vbCh0aGlzLCB3aW5kb3dTaGFwZSwgcG9vbGluZ1R5cGUsIHBhZGRpbmcsIGRpbGF0aW9uUmF0ZSwgc3RyaWRlcyxcbiAgICAgICAgICAgICAgZGltUm91bmRpbmdNb2RlKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { pow } from '../../ops/pow';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.pow = function (exp) {\n    this.throwIfDisposed();\n    return pow(this, exp);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvcG93LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxHQUFzQjtJQUN4QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0FBQ3hCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cG93fSBmcm9tICcuLi8uLi9vcHMvcG93JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcG93PFQgZXh0ZW5kcyBUZW5zb3I+KGV4cDogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnBvdyA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGV4cDogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHBvdyh0aGlzLCBleHApO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { prelu } from '../../ops/prelu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.prelu = function (alpha) {\n    this.throwIfDisposed();\n    return prelu(this, alpha);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJlbHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9wcmVsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUM1QixLQUFtQjtJQUM5QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzVCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cHJlbHV9IGZyb20gJy4uLy4uL29wcy9wcmVsdSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2V9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHByZWx1PFQgZXh0ZW5kcyBUZW5zb3I+KGFscGhhOiBUfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnByZWx1ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYWxwaGE6IFR8VGVuc29yTGlrZSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcHJlbHUodGhpcywgYWxwaGEpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { prod } from '../../ops/prod';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.prod = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return prod(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Byb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDM0IsSUFBc0IsRUFBRSxRQUFrQjtJQUNyRCxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUNwQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge3Byb2R9IGZyb20gJy4uLy4uL29wcy9wcm9kJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcHJvZDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOlxuICAgICAgICBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnByb2QgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdLCBrZWVwRGltcz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHByb2QodGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { reciprocal } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.reciprocal = function () {\n    this.throwIfDisposed();\n    return reciprocal(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjaXByb2NhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3JlY2lwcm9jYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFVBQVUsR0FBRztJQUU1QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDMUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtyZWNpcHJvY2FsfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmVjaXByb2NhbDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5yZWNpcHJvY2FsID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVjaXByb2NhbCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { relu } from '../../ops/relu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.relu = function () {\n    this.throwIfDisposed();\n    return relu(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3JlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUc7SUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cmVsdX0gZnJvbSAnLi4vLi4vb3BzL3JlbHUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICByZWx1PFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucmVsdSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJlbHUodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { relu6 } from '../../ops/relu6';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.relu6 = function () {\n    this.throwIfDisposed();\n    return relu6(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVsdTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9yZWx1Ni50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRztJQUV2QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDckIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtyZWx1Nn0gZnJvbSAnLi4vLi4vb3BzL3JlbHU2JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmVsdTY8VCBleHRlbmRzIFRlbnNvcj4oKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5yZWx1NiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVsdTYodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Reshapes the tensor into the shape of the provided tensor.\n *\n * @param x The tensor of required shape.\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.reshapeAs = function (x) {\n    this.throwIfDisposed();\n    return reshape(this, x.shape);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZV9hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Jlc2hhcGVfYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7Ozs7O0dBTUc7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsVUFBMkIsQ0FBSTtJQUUxRSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQU0sQ0FBQztBQUNyQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICByZXNoYXBlQXM8VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6IFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBSZXNoYXBlcyB0aGUgdGVuc29yIGludG8gdGhlIHNoYXBlIG9mIHRoZSBwcm92aWRlZCB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciBvZiByZXF1aXJlZCBzaGFwZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucmVzaGFwZUFzID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6XG4gICAgVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiByZXNoYXBlKHRoaXMsIHguc2hhcGUpIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reshape } from '../../ops/reshape';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.reshape = function (shape) {\n    this.throwIfDisposed();\n    return reshape(this, shape);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Jlc2hhcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsS0FBZTtJQUNqQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBTSxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4vLi4vb3BzL3Jlc2hhcGUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICByZXNoYXBlPFQgZXh0ZW5kcyBUZW5zb3I+KHNoYXBlOiBudW1iZXJbXSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucmVzaGFwZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHNoYXBlOiBudW1iZXJbXSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaGFwZSh0aGlzLCBzaGFwZSkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { resizeBilinear } from '../../ops/image/resize_bilinear';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.resizeBilinear =\n    function (newShape2D, alignCorners, halfPixelCenters) {\n        this.throwIfDisposed();\n        return resizeBilinear(this, newShape2D, alignCorners, halfPixelCenters);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvcmVzaXplX2JpbGluZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQ0FBaUMsQ0FBQztBQUMvRCxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBV3RFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWM7SUFDM0MsVUFDYSxVQUE0QixFQUFFLFlBQXNCLEVBQzdELGdCQUEwQjtRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxjQUFjLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUMxRSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge3Jlc2l6ZUJpbGluZWFyfSBmcm9tICcuLi8uLi9vcHMvaW1hZ2UvcmVzaXplX2JpbGluZWFyJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmVzaXplQmlsaW5lYXI8VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgbmV3U2hhcGUyRDogW251bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzPzogYm9vbGVhbixcbiAgICAgICAgaGFsZlBpeGVsQ2VudGVycz86IGJvb2xlYW4pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnJlc2l6ZUJpbGluZWFyID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICB0aGlzOiBULCBuZXdTaGFwZTJEOiBbbnVtYmVyLCBudW1iZXJdLCBhbGlnbkNvcm5lcnM/OiBib29sZWFuLFxuICAgICAgICBoYWxmUGl4ZWxDZW50ZXJzPzogYm9vbGVhbik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmVzaXplQmlsaW5lYXIodGhpcywgbmV3U2hhcGUyRCwgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { resizeNearestNeighbor } from '../../ops/image/resize_nearest_neighbor';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.resizeNearestNeighbor =\n    function (newShape2D, alignCorners, halfFloatCenters) {\n        this.throwIfDisposed();\n        return resizeNearestNeighbor(this, newShape2D, alignCorners, halfFloatCenters);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9yZXNpemVfbmVhcmVzdF9uZWlnaGJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUM5RSxPQUFPLEVBQUMsb0JBQW9CLEVBQXFCLE1BQU0sY0FBYyxDQUFDO0FBV3RFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLHFCQUFxQjtJQUNsRCxVQUNhLFVBQTRCLEVBQUUsWUFBc0IsRUFDN0QsZ0JBQTBCO1FBQ2hDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixPQUFPLHFCQUFxQixDQUN4QixJQUFJLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ3hELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7cmVzaXplTmVhcmVzdE5laWdoYm9yfSBmcm9tICcuLi8uLi9vcHMvaW1hZ2UvcmVzaXplX25lYXJlc3RfbmVpZ2hib3InO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yM0QsIFRlbnNvcjREfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICByZXNpemVOZWFyZXN0TmVpZ2hib3I8VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgbmV3U2hhcGUyRDogW251bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzPzogYm9vbGVhbixcbiAgICAgICAgaGFsZkZsb2F0Q2VudGVycz86IGJvb2xlYW4pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvciA9XG4gICAgZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcjNEfFRlbnNvcjREPihcbiAgICAgICAgdGhpczogVCwgbmV3U2hhcGUyRDogW251bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzPzogYm9vbGVhbixcbiAgICAgICAgaGFsZkZsb2F0Q2VudGVycz86IGJvb2xlYW4pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJlc2l6ZU5lYXJlc3ROZWlnaGJvcihcbiAgICAgIHRoaXMsIG5ld1NoYXBlMkQsIGFsaWduQ29ybmVycywgaGFsZkZsb2F0Q2VudGVycyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { reverse } from '../../ops/reverse';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.reverse = function (axis) {\n    this.throwIfDisposed();\n    return reverse(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3JldmVyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDOUIsSUFBc0I7SUFDakMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge3JldmVyc2V9IGZyb20gJy4uLy4uL29wcy9yZXZlcnNlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmV2ZXJzZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBheGlzPzogbnVtYmVyfG51bWJlcltdKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5yZXZlcnNlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcnxudW1iZXJbXSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmV2ZXJzZSh0aGlzLCBheGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { rfft } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.rfft = function () {\n    this.throwIfDisposed();\n    return rfft(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmZmdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3JmZnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUV0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFNLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtyZmZ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcmZmdDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUZW5zb3IpOiBUZW5zb3I7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucmZmdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFRlbnNvcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gcmZmdCh0aGlzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { round } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.round = function () {\n    this.throwIfDisposed();\n    return round(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9yb3VuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge3JvdW5kfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcm91bmQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucm91bmQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJvdW5kKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { rsqrt } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.rsqrt = function () {\n    this.throwIfDisposed();\n    return rsqrt(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnNxcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9yc3FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNyQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge3JzcXJ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgcnNxcnQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUucnNxcnQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHJzcXJ0KHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { selu } from '../../ops/selu';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.selu = function () {\n    this.throwIfDisposed();\n    return selu(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUc7SUFDdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3BCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c2VsdX0gZnJvbSAnLi4vLi4vb3BzL3NlbHUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBzZWx1PFQgZXh0ZW5kcyBUZW5zb3I+KCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc2VsdSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNlbHUodGhpcyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { separableConv2d } from '../../ops/separable_conv2d';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.separableConv2d =\n    function (depthwiseFilter, pointwiseFilter, strides, pad, dilation, dataFormat) {\n        this.throwIfDisposed();\n        return separableConv2d(this, depthwiseFilter, pointwiseFilter, strides, pad, dilation, dataFormat);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VwYXJhYmxlX2NvbnYyZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NlcGFyYWJsZV9jb252MmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBQzNELE9BQU8sRUFBQyxvQkFBb0IsRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFhdEUsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsZUFBZTtJQUM1QyxVQUNJLGVBQXNDLEVBQ3RDLGVBQW9DLEVBQUUsT0FBZ0MsRUFDdEUsR0FBbUIsRUFBRSxRQUFrQyxFQUN2RCxVQUEwQjtRQUNoQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7UUFDdkIsT0FBTyxlQUFlLENBQ1gsSUFBSSxFQUFFLGVBQWUsRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQzlELFVBQVUsQ0FBTSxDQUFDO0lBQzlCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c2VwYXJhYmxlQ29udjJkfSBmcm9tICcuLi8uLi9vcHMvc2VwYXJhYmxlX2NvbnYyZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3IzRCwgVGVuc29yNER9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1JhbmssIFRlbnNvckxpa2UsIFRlbnNvckxpa2U0RH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2VwYXJhYmxlQ29udjJkPFQgZXh0ZW5kcyBUZW5zb3IzRHxUZW5zb3I0RD4oXG4gICAgICAgIGRlcHRod2lzZUZpbHRlcjogVGVuc29yNER8VGVuc29yTGlrZTRELFxuICAgICAgICBwb2ludHdpc2VGaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2UsIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgICAgICBwYWQ6ICd2YWxpZCd8J3NhbWUnLCBkaWxhdGlvbj86IFtudW1iZXIsIG51bWJlcl18bnVtYmVyLFxuICAgICAgICBkYXRhRm9ybWF0PzogJ05IV0MnfCdOQ0hXJyk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc2VwYXJhYmxlQ29udjJkID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yM0R8VGVuc29yNEQ+KFxuICAgICAgICBkZXB0aHdpc2VGaWx0ZXI6IFRlbnNvcjREfFRlbnNvckxpa2U0RCxcbiAgICAgICAgcG9pbnR3aXNlRmlsdGVyOiBUZW5zb3I0RHxUZW5zb3JMaWtlLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgcGFkOiAndmFsaWQnfCdzYW1lJywgZGlsYXRpb24/OiBbbnVtYmVyLCBudW1iZXJdfG51bWJlcixcbiAgICAgICAgZGF0YUZvcm1hdD86ICdOSFdDJ3wnTkNIVycpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNlcGFyYWJsZUNvbnYyZChcbiAgICAgICAgICAgICB0aGlzLCBkZXB0aHdpc2VGaWx0ZXIsIHBvaW50d2lzZUZpbHRlciwgc3RyaWRlcywgcGFkLCBkaWxhdGlvbixcbiAgICAgICAgICAgICBkYXRhRm9ybWF0KSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sigmoid } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sigmoid = function () {\n    this.throwIfDisposed();\n    return sigmoid(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbW9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NpZ21vaWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRztJQUV6QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzaWdtb2lkfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2lnbW9pZDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zaWdtb2lkID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6XG4gICAgVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBzaWdtb2lkKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sign } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sign = function () {\n    this.throwIfDisposed();\n    return sign(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NpZ24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzaWdufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2lnbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zaWduID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc2lnbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sin } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sin = function () {\n    this.throwIfDisposed();\n    return sin(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7c2lufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2luPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnNpbiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNpbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sinh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sinh = function () {\n    this.throwIfDisposed();\n    return sinh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2luaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NpbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzaW5ofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc2luaDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zaW5oID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc2luaCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { slice } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.slice = function (begin, size) {\n    this.throwIfDisposed();\n    return slice(this, begin, size);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zbGljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNwQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFVMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFVBQzVCLEtBQXNCLEVBQUUsSUFBc0I7SUFDekQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDbEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi4vLi4vb3BzL29wcyc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHNsaWNlPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgICB0aGlzOiBULCBiZWdpbjogbnVtYmVyfG51bWJlcltdLCBzaXplPzogbnVtYmVyfG51bWJlcltdKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFQsIGJlZ2luOiBudW1iZXJ8bnVtYmVyW10sIHNpemU/OiBudW1iZXJ8bnVtYmVyW10pOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNsaWNlKHRoaXMsIGJlZ2luLCBzaXplKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { softmax } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.softmax = function (dim) {\n    this.throwIfDisposed();\n    return softmax(this, dim);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdG1heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NvZnRtYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRyxVQUM5QixHQUFXO0lBQ3RCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDNUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzb2Z0bWF4fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc29mdG1heDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBkaW0/OiBudW1iZXIpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnNvZnRtYXggPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB0aGlzOiBULCBkaW06IG51bWJlcik6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc29mdG1heCh0aGlzLCBkaW0pO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { softplus } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.softplus = function () {\n    this.throwIfDisposed();\n    return softplus(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29mdHBsdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zb2Z0cGx1cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN2QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsUUFBUSxHQUFHO0lBRTFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge3NvZnRwbHVzfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc29mdHBsdXM8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc29mdHBsdXMgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTpcbiAgICBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNvZnRwbHVzKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { spaceToBatchND } from '../../ops/space_to_batch_nd';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.spaceToBatchND = function (blockShape, paddings) {\n    this.throwIfDisposed();\n    return spaceToBatchND(this, blockShape, paddings);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhY2VfdG9fYmF0Y2hfbmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zcGFjZV90b19iYXRjaF9uZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDM0QsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGNBQWMsR0FBRyxVQUM5QyxVQUFvQixFQUFFLFFBQW9CO0lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3BhY2VUb0JhdGNoTkR9IGZyb20gJy4uLy4uL29wcy9zcGFjZV90b19iYXRjaF9uZCc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHNwYWNlVG9CYXRjaE5EPFIgZXh0ZW5kcyBSYW5rPihibG9ja1NoYXBlOiBudW1iZXJbXSwgcGFkZGluZ3M6IG51bWJlcltdW10pOlxuICAgICAgICBUZW5zb3I8Uj47XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3BhY2VUb0JhdGNoTkQgPSBmdW5jdGlvbjxSIGV4dGVuZHMgUmFuaz4oXG4gICAgYmxvY2tTaGFwZTogbnVtYmVyW10sIHBhZGRpbmdzOiBudW1iZXJbXVtdKTogVGVuc29yPFI+IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNwYWNlVG9CYXRjaE5EKHRoaXMsIGJsb2NrU2hhcGUsIHBhZGRpbmdzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { split } from '../../ops/split';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.split = function (numOrSizeSplits, axis) {\n    this.throwIfDisposed();\n    return split(this, numOrSizeSplits, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zcGxpdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUNyQyxlQUFnQyxFQUFFLElBQWE7SUFDakQsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDNUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtzcGxpdH0gZnJvbSAnLi4vLi4vb3BzL3NwbGl0JztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3BsaXQ8VCBleHRlbmRzIFRlbnNvcj4obnVtT3JTaXplU3BsaXRzOiBudW1iZXJbXXxudW1iZXIsIGF4aXM/OiBudW1iZXIpOlxuICAgICAgICBUW107XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBudW1PclNpemVTcGxpdHM6IG51bWJlcltdfG51bWJlciwgYXhpcz86IG51bWJlcik6IFRbXSB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBzcGxpdCh0aGlzLCBudW1PclNpemVTcGxpdHMsIGF4aXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { sqrt } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sqrt = function () {\n    this.throwIfDisposed();\n    return sqrt(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NxcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzcXJ0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3FydDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zcXJ0ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc3FydCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { square } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.square = function () {\n    this.throwIfDisposed();\n    return square(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc3F1YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUc7SUFFeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7c3F1YXJlfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3F1YXJlPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnNxdWFyZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc3F1YXJlKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { squaredDifference } from '../../ops/squared_difference';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.squaredDifference = function (b) {\n    this.throwIfDisposed();\n    return squaredDifference(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1YXJlZF9kaWZmZXJlbmNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc3F1YXJlZF9kaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxpQkFBaUIsR0FBRyxVQUNqRCxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxpQkFBaUIsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3NxdWFyZWREaWZmZXJlbmNlfSBmcm9tICcuLi8uLi9vcHMvc3F1YXJlZF9kaWZmZXJlbmNlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3F1YXJlZERpZmZlcmVuY2U8VCBleHRlbmRzIFRlbnNvcj4oYjogVGVuc29yfFRlbnNvckxpa2UpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnNxdWFyZWREaWZmZXJlbmNlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYjogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHNxdWFyZWREaWZmZXJlbmNlKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { squeeze } from '../../ops/squeeze';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.squeeze = function (axis) {\n    this.throwIfDisposed();\n    return squeeze(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3F1ZWV6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3NxdWVlemUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsSUFBZTtJQUNqQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxPQUFPLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQzdCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3F1ZWV6ZX0gZnJvbSAnLi4vLi4vb3BzL3NxdWVlemUnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICBzcXVlZXplPFQgZXh0ZW5kcyBUZW5zb3I+KGF4aXM/OiBudW1iZXJbXSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3F1ZWV6ZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIGF4aXM/OiBudW1iZXJbXSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc3F1ZWV6ZSh0aGlzLCBheGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { stack } from '../../ops/stack';\nimport { getGlobalTensorClass, Tensor } from '../../tensor';\ngetGlobalTensorClass().prototype.stack = function (x, axis) {\n    this.throwIfDisposed();\n    const tensorsToBeStacked = x instanceof Tensor ? [this, x] : [this, ...x];\n    return stack(tensorsToBeStacked, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy9zdGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFFLE1BQU0sRUFBQyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEdBQUcsVUFDckMsQ0FBa0IsRUFBRSxJQUFhO0lBQ25DLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixNQUFNLGtCQUFrQixHQUFHLENBQUMsWUFBWSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzFFLE9BQU8sS0FBSyxDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBTSxDQUFDO0FBQzlDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3RhY2t9IGZyb20gJy4uLy4uL29wcy9zdGFjayc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHN0YWNrPFQgZXh0ZW5kcyBUZW5zb3I+KHg6IFRlbnNvcnxUZW5zb3JbXSwgYXhpcz86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3RhY2sgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICB4OiBUZW5zb3J8VGVuc29yW10sIGF4aXM/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgY29uc3QgdGVuc29yc1RvQmVTdGFja2VkID0geCBpbnN0YW5jZW9mIFRlbnNvciA/IFt0aGlzLCB4XSA6IFt0aGlzLCAuLi54XTtcbiAgcmV0dXJuIHN0YWNrKHRlbnNvcnNUb0JlU3RhY2tlZCwgYXhpcykgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { step } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.step = function (alpha) {\n    this.throwIfDisposed();\n    return step(this, alpha);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3N0ZXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxVQUMzQixLQUFjO0lBQ3pCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0IsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtzdGVwfSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3RlcDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBhbHBoYT86IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3RlcCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFQsIGFscGhhPzogbnVtYmVyKSB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBzdGVwKHRoaXMsIGFscGhhKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { stridedSlice } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.stridedSlice = function (begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask) {\n    this.throwIfDisposed();\n    return stridedSlice(this, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWRlZF9zbGljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3N0cmlkZWRfc2xpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBWTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxVQUM5QixLQUFlLEVBQUUsR0FBYSxFQUFFLE9BQWlCLEVBQy9ELFNBQWtCLEVBQUUsT0FBZ0IsRUFBRSxZQUFxQixFQUMzRCxXQUFvQixFQUFFLGNBQXVCO0lBQy9DLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLFlBQVksQ0FDUixJQUFJLEVBQUUsS0FBSyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQzNELFdBQVcsRUFBRSxjQUFjLENBQU0sQ0FBQztBQUMvQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge3N0cmlkZWRTbGljZX0gZnJvbSAnLi4vLi4vb3BzL29wcyc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHN0cmlkZWRTbGljZTxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgICAgdGhpczogVGVuc29yLCBiZWdpbjogbnVtYmVyW10sIGVuZDogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdLFxuICAgICAgICBiZWdpbk1hc2s/OiBudW1iZXIsIGVuZE1hc2s/OiBudW1iZXIsIGVsbGlwc2lzTWFzaz86IG51bWJlcixcbiAgICAgICAgbmV3QXhpc01hc2s/OiBudW1iZXIsIHNocmlua0F4aXNNYXNrPzogbnVtYmVyKTogVGVuc29yO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnN0cmlkZWRTbGljZSA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgIHRoaXM6IFRlbnNvciwgYmVnaW46IG51bWJlcltdLCBlbmQ6IG51bWJlcltdLCBzdHJpZGVzOiBudW1iZXJbXSxcbiAgICBiZWdpbk1hc2s/OiBudW1iZXIsIGVuZE1hc2s/OiBudW1iZXIsIGVsbGlwc2lzTWFzaz86IG51bWJlcixcbiAgICBuZXdBeGlzTWFzaz86IG51bWJlciwgc2hyaW5rQXhpc01hc2s/OiBudW1iZXIpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHN0cmlkZWRTbGljZShcbiAgICAgICAgICAgICB0aGlzLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayxcbiAgICAgICAgICAgICBuZXdBeGlzTWFzaywgc2hyaW5rQXhpc01hc2spIGFzIFQ7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { sub } from '../../ops/sub';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sub = function (b) {\n    this.throwIfDisposed();\n    return sub(this, b);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc3ViLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxDQUFvQjtJQUN0QixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3RCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3VifSBmcm9tICcuLi8uLi9vcHMvc3ViJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3ViPFQgZXh0ZW5kcyBUZW5zb3I+KGI6IFRlbnNvcnxUZW5zb3JMaWtlKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS5zdWIgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICBiOiBUZW5zb3J8VGVuc29yTGlrZSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gc3ViKHRoaXMsIGIpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { sum } from '../../ops/sum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.sum = function (axis, keepDims) {\n    this.throwIfDisposed();\n    return sum(this, axis, keepDims);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvc3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsR0FBRyxVQUNuQyxJQUFzQixFQUFFLFFBQWtCO0lBQzVDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO0FBQ25DLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7c3VtfSBmcm9tICcuLi8uLi9vcHMvc3VtJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgc3VtPFQgZXh0ZW5kcyBUZW5zb3I+KGF4aXM/OiBudW1iZXJ8bnVtYmVyW10sIGtlZXBEaW1zPzogYm9vbGVhbik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuc3VtID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYXhpcz86IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM/OiBib29sZWFuKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBzdW0odGhpcywgYXhpcywga2VlcERpbXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { tan } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.tan = function () {\n    this.throwIfDisposed();\n    return tan(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvdGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUc7SUFDckMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ25CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7dGFufSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgdGFuPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnRhbiA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHRhbih0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { tanh } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.tanh = function () {\n    this.throwIfDisposed();\n    return tanh(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFuaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3RhbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRztJQUN0QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDcEIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHt0YW5ofSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgdGFuaDxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBUKTogVDtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS50YW5oID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gdGFuaCh0aGlzKTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { tile } from '../../ops/tile';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.tile = function (reps) {\n    this.throwIfDisposed();\n    return tile(this, reps);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3RpbGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDcEMsSUFBYztJQUNoQixJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBTSxDQUFDO0FBQy9CLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt0aWxlfSBmcm9tICcuLi8uLi9vcHMvdGlsZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHRpbGU8VCBleHRlbmRzIFRlbnNvcj4oYjogbnVtYmVyW10pOiBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnRpbGUgPSBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICByZXBzOiBudW1iZXJbXSk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gdGlsZSh0aGlzLCByZXBzKSBhcyBUO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Casts the array to type `bool`\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.toBool = function () {\n    this.throwIfDisposed();\n    return cast(this, 'bool');\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9fYm9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3RvX2Jvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDbkMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFEOzs7O0dBSUc7QUFDSCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUc7SUFFeEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sSUFBSSxDQUFJLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIFRPRE8gdXBkYXRlIGltcG9ydCBwYXRoIG9uY2Ugb3AgaXMgbW9kdWxhcml6ZWQuXG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICB0b0Jvb2w8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDYXN0cyB0aGUgYXJyYXkgdG8gdHlwZSBgYm9vbGBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudG9Cb29sID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6XG4gICAgVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjYXN0PFQ+KHRoaXMsICdib29sJyk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Casts the array to type `float32`\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.toFloat = function () {\n    this.throwIfDisposed();\n    return cast(this, 'float32');\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9fZmxvYXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy90b19mbG9hdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxrREFBa0Q7QUFDbEQsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuQyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQ7Ozs7R0FJRztBQUNILG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLE9BQU8sR0FBRztJQUV6QyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxJQUFJLENBQUksSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2xDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyB1cGRhdGUgaW1wb3J0IHBhdGggb25jZSBvcCBpcyBtb2R1bGFyaXplZC5cbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi4vLi4vb3BzL29wcyc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHRvRmxvYXQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDYXN0cyB0aGUgYXJyYXkgdG8gdHlwZSBgZmxvYXQzMmBcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnVGVuc29ycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudG9GbG9hdCA9IGZ1bmN0aW9uPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQpOlxuICAgIFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gY2FzdDxUPih0aGlzLCAnZmxvYXQzMicpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { cast } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\n/**\n * Casts the array to type `int32`\n *\n * @doc {heading: 'Tensors', subheading: 'Classes'}\n */\ngetGlobalTensorClass().prototype.toInt = function () {\n    this.throwIfDisposed();\n    return cast(this, 'int32');\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9faW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvdG9faW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILGtEQUFrRDtBQUNsRCxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRDs7OztHQUlHO0FBQ0gsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHO0lBRXZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBSSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHtjYXN0fSBmcm9tICcuLi8uLi9vcHMvb3BzJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgdG9JbnQ8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuLyoqXG4gKiBDYXN0cyB0aGUgYXJyYXkgdG8gdHlwZSBgaW50MzJgXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ1RlbnNvcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLnRvSW50ID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6XG4gICAgVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiBjYXN0PFQ+KHRoaXMsICdpbnQzMicpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { topk } from '../../ops/topk';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.topk = function (k, sorted) {\n    this.throwIfDisposed();\n    return topk(this, k, sorted);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9way5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3RvcGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVUxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEdBQUcsVUFDM0IsQ0FBVSxFQUFFLE1BQWdCO0lBQ3ZDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBNEIsQ0FBQztBQUMxRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7dG9wa30gZnJvbSAnLi4vLi4vb3BzL3RvcGsnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICB0b3BrPFQgZXh0ZW5kcyBUZW5zb3I+KHRoaXM6IFQsIGs/OiBudW1iZXIsIHNvcnRlZD86IGJvb2xlYW4pOlxuICAgICAgICB7dmFsdWVzOiBULCBpbmRpY2VzOiBUfTtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS50b3BrID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgaz86IG51bWJlciwgc29ydGVkPzogYm9vbGVhbik6IHt2YWx1ZXM6IFQsIGluZGljZXM6IFR9IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHRvcGsodGhpcywgaywgc29ydGVkKSBhcyB7dmFsdWVzOiBULCBpbmRpY2VzOiBUfTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { transpose } from '../../ops/transpose';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.transpose = function (perm) {\n    this.throwIfDisposed();\n    return transpose(this, perm);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvdHJhbnNwb3NlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsU0FBUyxHQUFHLFVBQ2hDLElBQWU7SUFDMUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sU0FBUyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMvQixDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuLi8uLi9vcHMvdHJhbnNwb3NlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFua30gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgdHJhbnNwb3NlPFQgZXh0ZW5kcyBUZW5zb3I+KHBlcm0/OiBudW1iZXJbXSk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudHJhbnNwb3NlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgcGVybT86IG51bWJlcltdKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiB0cmFuc3Bvc2UodGhpcywgcGVybSk7XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { unique } from '../../ops/unique';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.unique = function (axis) {\n    this.throwIfDisposed();\n    return unique(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb3JlL3NyYy9wdWJsaWMvY2hhaW5lZF9vcHMvdW5pcXVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsb0JBQW9CLEVBQVMsTUFBTSxjQUFjLENBQUM7QUFTMUQsb0JBQW9CLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLFVBQzdCLElBQWE7SUFDeEIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ3ZCLE9BQU8sTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLENBQTRCLENBQUM7QUFDdkQsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3VuaXF1ZX0gZnJvbSAnLi4vLi4vb3BzL3VuaXF1ZSc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHVuaXF1ZTxUIGV4dGVuZHMgVGVuc29yPih0aGlzOiBULCBheGlzPzogbnVtYmVyKToge3ZhbHVlczogVCwgaW5kaWNlczogVH07XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudW5pcXVlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCwgYXhpcz86IG51bWJlcik6IHt2YWx1ZXM6IFQsIGluZGljZXM6IFR9IHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHVuaXF1ZSh0aGlzLCBheGlzKSBhcyB7dmFsdWVzOiBULCBpbmRpY2VzOiBUfTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { unsortedSegmentSum } from '../../ops/unsorted_segment_sum';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.unsortedSegmentSum =\n    function (segmentIds, numSegments) {\n        this.throwIfDisposed();\n        return unsortedSegmentSum(this, segmentIds, numSegments);\n    };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zb3J0ZWRfc2VnbWVudF9zdW0uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy91bnNvcnRlZF9zZWdtZW50X3N1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNsRSxPQUFPLEVBQUMsb0JBQW9CLEVBQW1CLE1BQU0sY0FBYyxDQUFDO0FBVXBFLG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLGtCQUFrQjtJQUMvQyxVQUNhLFVBQWlDLEVBQUUsV0FBbUI7UUFDckUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLE9BQU8sa0JBQWtCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7dW5zb3J0ZWRTZWdtZW50U3VtfSBmcm9tICcuLi8uLi9vcHMvdW5zb3J0ZWRfc2VnbWVudF9zdW0nO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yLCBUZW5zb3IxRH0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZTFEfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICB1bnNvcnRlZFNlZ21lbnRTdW08VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgICAgIHRoaXM6IFQsIHNlZ21lbnRJZHM6IFRlbnNvcjFEfFRlbnNvckxpa2UxRCwgbnVtU2VnbWVudHM6IG51bWJlcik6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUudW5zb3J0ZWRTZWdtZW50U3VtID1cbiAgICBmdW5jdGlvbjxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgICAgdGhpczogVCwgc2VnbWVudElkczogVGVuc29yMUR8VGVuc29yTGlrZTFELCBudW1TZWdtZW50czogbnVtYmVyKTogVCB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiB1bnNvcnRlZFNlZ21lbnRTdW0odGhpcywgc2VnbWVudElkcywgbnVtU2VnbWVudHMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { unstack } from '../../ops/unstack';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.unstack = function (axis) {\n    this.throwIfDisposed();\n    return unstack(this, axis);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5zdGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3Vuc3RhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxvQkFBb0IsRUFBUyxNQUFNLGNBQWMsQ0FBQztBQVMxRCxvQkFBb0IsRUFBRSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFDdkMsSUFBYTtJQUNmLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFRLENBQUM7QUFDcEMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHt1bnN0YWNrfSBmcm9tICcuLi8uLi9vcHMvdW5zdGFjayc7XG5pbXBvcnQge2dldEdsb2JhbFRlbnNvckNsYXNzLCBUZW5zb3J9IGZyb20gJy4uLy4uL3RlbnNvcic7XG5pbXBvcnQge1Jhbmt9IGZyb20gJy4uLy4uL3R5cGVzJztcblxuZGVjbGFyZSBtb2R1bGUgJy4uLy4uL3RlbnNvcicge1xuICBpbnRlcmZhY2UgVGVuc29yPFIgZXh0ZW5kcyBSYW5rID0gUmFuaz4ge1xuICAgIHVuc3RhY2s8VCBleHRlbmRzIFRlbnNvcj4oYXhpcz86IG51bWJlcik6IFRbXTtcbiAgfVxufVxuXG5nZXRHbG9iYWxUZW5zb3JDbGFzcygpLnByb3RvdHlwZS51bnN0YWNrID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgYXhpcz86IG51bWJlcik6IFRbXSB7XG4gIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gIHJldHVybiB1bnN0YWNrKHRoaXMsIGF4aXMpIGFzIFRbXTtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { where } from '../../ops/where';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.where = function (condition, x) {\n    this.throwIfDisposed();\n    return where(condition, this, x);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2hlcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL3B1YmxpYy9jaGFpbmVkX29wcy93aGVyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBVTFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssR0FBRyxVQUNyQyxTQUE0QixFQUFFLENBQW9CO0lBQ3BELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztJQUN2QixPQUFPLEtBQUssQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBTSxDQUFDO0FBQ3hDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt3aGVyZX0gZnJvbSAnLi4vLi4vb3BzL3doZXJlJztcbmltcG9ydCB7Z2V0R2xvYmFsVGVuc29yQ2xhc3MsIFRlbnNvcn0gZnJvbSAnLi4vLi4vdGVuc29yJztcbmltcG9ydCB7UmFuaywgVGVuc29yTGlrZX0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5kZWNsYXJlIG1vZHVsZSAnLi4vLi4vdGVuc29yJyB7XG4gIGludGVyZmFjZSBUZW5zb3I8UiBleHRlbmRzIFJhbmsgPSBSYW5rPiB7XG4gICAgd2hlcmU8VCBleHRlbmRzIFRlbnNvcj4oY29uZGl0aW9uOiBUZW5zb3J8VGVuc29yTGlrZSwgeDogVGVuc29yfFRlbnNvckxpa2UpOlxuICAgICAgICBUO1xuICB9XG59XG5cbmdldEdsb2JhbFRlbnNvckNsYXNzKCkucHJvdG90eXBlLndoZXJlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgY29uZGl0aW9uOiBUZW5zb3J8VGVuc29yTGlrZSwgeDogVGVuc29yfFRlbnNvckxpa2UpOiBUIHtcbiAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgcmV0dXJuIHdoZXJlKGNvbmRpdGlvbiwgdGhpcywgeCkgYXMgVDtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// TODO update import path once op is modularized.\nimport { zerosLike } from '../../ops/ops';\nimport { getGlobalTensorClass } from '../../tensor';\ngetGlobalTensorClass().prototype.zerosLike = function () {\n    this.throwIfDisposed();\n    return zerosLike(this);\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVyb3NfbGlrZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29yZS9zcmMvcHVibGljL2NoYWluZWRfb3BzL3plcm9zX2xpa2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsa0RBQWtEO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLG9CQUFvQixFQUFTLE1BQU0sY0FBYyxDQUFDO0FBUzFELG9CQUFvQixFQUFFLENBQUMsU0FBUyxDQUFDLFNBQVMsR0FBRztJQUUzQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7SUFDdkIsT0FBTyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDekIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBUT0RPIHVwZGF0ZSBpbXBvcnQgcGF0aCBvbmNlIG9wIGlzIG1vZHVsYXJpemVkLlxuaW1wb3J0IHt6ZXJvc0xpa2V9IGZyb20gJy4uLy4uL29wcy9vcHMnO1xuaW1wb3J0IHtnZXRHbG9iYWxUZW5zb3JDbGFzcywgVGVuc29yfSBmcm9tICcuLi8uLi90ZW5zb3InO1xuaW1wb3J0IHtSYW5rfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmRlY2xhcmUgbW9kdWxlICcuLi8uLi90ZW5zb3InIHtcbiAgaW50ZXJmYWNlIFRlbnNvcjxSIGV4dGVuZHMgUmFuayA9IFJhbms+IHtcbiAgICB6ZXJvc0xpa2U8VCBleHRlbmRzIFRlbnNvcj4odGhpczogVCk6IFQ7XG4gIH1cbn1cblxuZ2V0R2xvYmFsVGVuc29yQ2xhc3MoKS5wcm90b3R5cGUuemVyb3NMaWtlID0gZnVuY3Rpb248VCBleHRlbmRzIFRlbnNvcj4oXG4gICAgdGhpczogVCk6IFQge1xuICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICByZXR1cm4gemVyb3NMaWtlKHRoaXMpO1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Explicit error types.\n *\n * See the following link for more information about why the code includes\n * calls to setPrototypeOf:\n *\n * https://github.com/Microsoft/TypeScript-wiki/blob/master/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work\n */\n// tslint:enable\n/**\n * Equivalent of Python's AttributeError.\n */\nexport class AttributeError extends Error {\n    constructor(message) {\n        super(message);\n        // Set the prototype explicitly.\n        Object.setPrototypeOf(this, AttributeError.prototype);\n    }\n}\n/**\n * Equivalent of Python's RuntimeError.\n */\nexport class RuntimeError extends Error {\n    constructor(message) {\n        super(message);\n        // Set the prototype explicitly.\n        Object.setPrototypeOf(this, RuntimeError.prototype);\n    }\n}\n/**\n * Equivalent of Python's ValueError.\n */\nexport class ValueError extends Error {\n    constructor(message) {\n        super(message);\n        // Set the prototype explicitly.\n        Object.setPrototypeOf(this, ValueError.prototype);\n    }\n}\n/**\n * Equivalent of Python's NotImplementedError.\n */\nexport class NotImplementedError extends Error {\n    constructor(message) {\n        super(message);\n        // Set the prototype explicitly.\n        Object.setPrototypeOf(this, NotImplementedError.prototype);\n    }\n}\n/**\n * Equivalent of Python's AssertionError.\n */\nexport class AssertionError extends Error {\n    constructor(message) {\n        super(message);\n        // Set the prototype explicitly.\n        Object.setPrototypeOf(this, AssertionError.prototype);\n    }\n}\n/**\n * Equivalent of Python's IndexError.\n */\nexport class IndexError extends Error {\n    constructor(message) {\n        super(message);\n        // Set the prototype explicitly.\n        Object.setPrototypeOf(this, IndexError.prototype);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOzs7Ozs7O0dBT0c7QUFDSCxnQkFBZ0I7QUFFaEI7O0dBRUc7QUFDSCxNQUFNLE9BQU8sY0FBZSxTQUFRLEtBQUs7SUFDdkMsWUFBWSxPQUFnQjtRQUMxQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixnQ0FBZ0M7UUFDaEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFlBQWEsU0FBUSxLQUFLO0lBQ3JDLFlBQVksT0FBZ0I7UUFDMUIsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsZ0NBQWdDO1FBQ2hDLE1BQU0sQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN0RCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxVQUFXLFNBQVEsS0FBSztJQUNuQyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sbUJBQW9CLFNBQVEsS0FBSztJQUM1QyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3RCxDQUFDO0NBQ0Y7QUFFRDs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFlLFNBQVEsS0FBSztJQUN2QyxZQUFZLE9BQWdCO1FBQzFCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLGdDQUFnQztRQUNoQyxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDeEQsQ0FBQztDQUNGO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLEtBQUs7SUFDbkMsWUFBWSxPQUFnQjtRQUMxQixLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDZixnQ0FBZ0M7UUFDaEMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ3BELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogRXhwbGljaXQgZXJyb3IgdHlwZXMuXG4gKlxuICogU2VlIHRoZSBmb2xsb3dpbmcgbGluayBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3aHkgdGhlIGNvZGUgaW5jbHVkZXNcbiAqIGNhbGxzIHRvIHNldFByb3RvdHlwZU9mOlxuICpcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvVHlwZVNjcmlwdC13aWtpL2Jsb2IvbWFzdGVyL0JyZWFraW5nLUNoYW5nZXMubWQjZXh0ZW5kaW5nLWJ1aWx0LWlucy1saWtlLWVycm9yLWFycmF5LWFuZC1tYXAtbWF5LW5vLWxvbmdlci13b3JrXG4gKi9cbi8vIHRzbGludDplbmFibGVcblxuLyoqXG4gKiBFcXVpdmFsZW50IG9mIFB5dGhvbidzIEF0dHJpYnV0ZUVycm9yLlxuICovXG5leHBvcnQgY2xhc3MgQXR0cmlidXRlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBBdHRyaWJ1dGVFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCBvZiBQeXRob24ncyBSdW50aW1lRXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBSdW50aW1lRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSdW50aW1lRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgb2YgUHl0aG9uJ3MgVmFsdWVFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIFZhbHVlRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBWYWx1ZUVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBFcXVpdmFsZW50IG9mIFB5dGhvbidzIE5vdEltcGxlbWVudGVkRXJyb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBOb3RJbXBsZW1lbnRlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgTm90SW1wbGVtZW50ZWRFcnJvci5wcm90b3R5cGUpO1xuICB9XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCBvZiBQeXRob24ncyBBc3NlcnRpb25FcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEFzc2VydGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICBjb25zdHJ1Y3RvcihtZXNzYWdlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgLy8gU2V0IHRoZSBwcm90b3R5cGUgZXhwbGljaXRseS5cbiAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgQXNzZXJ0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgb2YgUHl0aG9uJ3MgSW5kZXhFcnJvci5cbiAqL1xuZXhwb3J0IGNsYXNzIEluZGV4RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U/OiBzdHJpbmcpIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICAvLyBTZXQgdGhlIHByb3RvdHlwZSBleHBsaWNpdGx5LlxuICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBJbmRleEVycm9yLnByb3RvdHlwZSk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * LruCache: A mapping from the String to T. If the number of the entries is\n * exceeding the `maxEntries`, the LruCache will delete the least recently\n * used entry.\n */\nexport class LruCache {\n    constructor(maxEntries) {\n        this.maxEntries = maxEntries || 100;\n        this.cache = new Map();\n    }\n    /**\n     * Get the entry for the key and mark it as used recently.\n     */\n    get(key) {\n        let entry;\n        if (this.cache.has(key)) {\n            entry = this.cache.get(key);\n            this.cache.delete(key);\n            this.cache.set(key, entry);\n        }\n        return entry;\n    }\n    /**\n     * Put the entry into the cache. If the key already existed, mark the key as\n     * used recently.\n     */\n    put(key, value) {\n        if (this.cache.has(key)) {\n            this.cache.delete(key);\n        }\n        else if (this.cache.size >= this.maxEntries) {\n            const keyToDelete = this.cache.keys().next().value;\n            this.cache.delete(keyToDelete);\n        }\n        this.cache.set(key, value);\n    }\n    /**\n     * Get the MaxEntries of the cache.\n     */\n    getMaxEntries() {\n        return this.maxEntries;\n    }\n    /**\n     * Set the MaxEntries of the cache. If the maxEntries is decreased, reduce\n     * entries in the cache.\n     */\n    setMaxEntries(maxEntries) {\n        if (maxEntries < 0) {\n            throw new Error(`The maxEntries of LRU caches must be at least 0, but got ${maxEntries}.`);\n        }\n        if (this.maxEntries > maxEntries) {\n            for (let i = 0; i < this.maxEntries - maxEntries; i++) {\n                const keyToDelete = this.cache.keys().next().value;\n                this.cache.delete(keyToDelete);\n            }\n        }\n        this.maxEntries = maxEntries;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3JfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvdXRpbHMvZXhlY3V0b3JfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFDSDs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLFFBQVE7SUFJbkIsWUFBWSxVQUFtQjtRQUM3QixJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsSUFBSSxHQUFHLENBQUM7UUFDcEMsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBYSxDQUFDO0lBQ3BDLENBQUM7SUFFRDs7T0FFRztJQUNJLEdBQUcsQ0FBQyxHQUFXO1FBQ3BCLElBQUksS0FBUSxDQUFDO1FBQ2IsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN2QixLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDNUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1NBQzVCO1FBQ0QsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksR0FBRyxDQUFDLEdBQVcsRUFBRSxLQUFRO1FBQzlCLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDdkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDeEI7YUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDN0MsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUM7WUFDbkQsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDaEM7UUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksYUFBYTtRQUNsQixPQUFPLElBQUksQ0FBQyxVQUFVLENBQUM7SUFDekIsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGFBQWEsQ0FBQyxVQUFrQjtRQUNyQyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDWCw0REFDSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1NBQ3hCO1FBRUQsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRTtZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7Z0JBQ3JELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDO2dCQUNuRCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUNoQztTQUNGO1FBRUQsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogTHJ1Q2FjaGU6IEEgbWFwcGluZyBmcm9tIHRoZSBTdHJpbmcgdG8gVC4gSWYgdGhlIG51bWJlciBvZiB0aGUgZW50cmllcyBpc1xuICogZXhjZWVkaW5nIHRoZSBgbWF4RW50cmllc2AsIHRoZSBMcnVDYWNoZSB3aWxsIGRlbGV0ZSB0aGUgbGVhc3QgcmVjZW50bHlcbiAqIHVzZWQgZW50cnkuXG4gKi9cblxuZXhwb3J0IGNsYXNzIExydUNhY2hlPFQ+IHtcbiAgcHJpdmF0ZSBjYWNoZTogTWFwPHN0cmluZywgVD47XG4gIHByaXZhdGUgbWF4RW50cmllczogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKG1heEVudHJpZXM/OiBudW1iZXIpIHtcbiAgICB0aGlzLm1heEVudHJpZXMgPSBtYXhFbnRyaWVzIHx8IDEwMDtcbiAgICB0aGlzLmNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFQ+KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBlbnRyeSBmb3IgdGhlIGtleSBhbmQgbWFyayBpdCBhcyB1c2VkIHJlY2VudGx5LlxuICAgKi9cbiAgcHVibGljIGdldChrZXk6IHN0cmluZyk6IFQge1xuICAgIGxldCBlbnRyeTogVDtcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgZW50cnkgPSB0aGlzLmNhY2hlLmdldChrZXkpO1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICAgIHRoaXMuY2FjaGUuc2V0KGtleSwgZW50cnkpO1xuICAgIH1cbiAgICByZXR1cm4gZW50cnk7XG4gIH1cblxuICAvKipcbiAgICogUHV0IHRoZSBlbnRyeSBpbnRvIHRoZSBjYWNoZS4gSWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0ZWQsIG1hcmsgdGhlIGtleSBhc1xuICAgKiB1c2VkIHJlY2VudGx5LlxuICAgKi9cbiAgcHVibGljIHB1dChrZXk6IHN0cmluZywgdmFsdWU6IFQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jYWNoZS5oYXMoa2V5KSkge1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuY2FjaGUuc2l6ZSA+PSB0aGlzLm1heEVudHJpZXMpIHtcbiAgICAgIGNvbnN0IGtleVRvRGVsZXRlID0gdGhpcy5jYWNoZS5rZXlzKCkubmV4dCgpLnZhbHVlO1xuICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5VG9EZWxldGUpO1xuICAgIH1cbiAgICB0aGlzLmNhY2hlLnNldChrZXksIHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIE1heEVudHJpZXMgb2YgdGhlIGNhY2hlLlxuICAgKi9cbiAgcHVibGljIGdldE1heEVudHJpZXMoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5tYXhFbnRyaWVzO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgTWF4RW50cmllcyBvZiB0aGUgY2FjaGUuIElmIHRoZSBtYXhFbnRyaWVzIGlzIGRlY3JlYXNlZCwgcmVkdWNlXG4gICAqIGVudHJpZXMgaW4gdGhlIGNhY2hlLlxuICAgKi9cbiAgcHVibGljIHNldE1heEVudHJpZXMobWF4RW50cmllczogbnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKG1heEVudHJpZXMgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRoZSBtYXhFbnRyaWVzIG9mIExSVSBjYWNoZXMgbXVzdCBiZSBhdCBsZWFzdCAwLCBidXQgZ290ICR7XG4gICAgICAgICAgICAgIG1heEVudHJpZXN9LmApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLm1heEVudHJpZXMgPiBtYXhFbnRyaWVzKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWF4RW50cmllcyAtIG1heEVudHJpZXM7IGkrKykge1xuICAgICAgICBjb25zdCBrZXlUb0RlbGV0ZSA9IHRoaXMuY2FjaGUua2V5cygpLm5leHQoKS52YWx1ZTtcbiAgICAgICAgdGhpcy5jYWNoZS5kZWxldGUoa2V5VG9EZWxldGUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMubWF4RW50cmllcyA9IG1heEVudHJpZXM7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: utils/generic_utils.py */\nimport { util } from '@tensorflow/tfjs-core';\nimport { AssertionError, ValueError } from '../errors';\n// tslint:enable\n/**\n * If `value` is an Array, equivalent to Python's `value * numValues`.\n * If `value` is not an Array, equivalent to Python's `[value] * numValues`\n */\n// tslint:disable-next-line:no-any\nexport function pyListRepeat(value, numValues) {\n    if (Array.isArray(value)) {\n        // tslint:disable-next-line:no-any\n        let newArray = [];\n        for (let i = 0; i < numValues; i++) {\n            newArray = newArray.concat(value);\n        }\n        return newArray;\n    }\n    else {\n        const newArray = new Array(numValues);\n        newArray.fill(value);\n        return newArray;\n    }\n}\nexport function assert(val, message) {\n    if (!val) {\n        throw new AssertionError(message);\n    }\n}\n/**\n * Count the number of elements of the `array` that are equal to `reference`.\n */\nexport function count(array, refernce) {\n    let counter = 0;\n    for (const item of array) {\n        if (item === refernce) {\n            counter++;\n        }\n    }\n    return counter;\n}\n/**\n * If an array is of length 1, just return the first element. Otherwise, return\n * the full array.\n * @param tensors\n */\nexport function singletonOrArray(xs) {\n    if (xs.length === 1) {\n        return xs[0];\n    }\n    return xs;\n}\n/**\n * Normalizes a list/tensor into a list.\n *\n * If a tensor is passed, we return\n * a list of size 1 containing the tensor.\n *\n * @param x target object to be normalized.\n */\n// tslint:disable-next-line:no-any\nexport function toList(x) {\n    if (Array.isArray(x)) {\n        return x;\n    }\n    return [x];\n}\n/**\n * Generate a UID for a list\n */\n// tslint:disable-next-line:no-any\nexport function objectListUid(objs) {\n    const objectList = toList(objs);\n    let retVal = '';\n    for (const obj of objectList) {\n        if (obj.id == null) {\n            throw new ValueError(`Object ${obj} passed to objectListUid without an id`);\n        }\n        if (retVal !== '') {\n            retVal = retVal + ', ';\n        }\n        retVal = `${retVal}${Math.abs(obj.id)}`;\n    }\n    return retVal;\n}\n/**\n * Converts string to snake-case.\n * @param name\n */\nexport function toSnakeCase(name) {\n    const intermediate = name.replace(/(.)([A-Z][a-z0-9]+)/g, '$1_$2');\n    const insecure = intermediate.replace(/([a-z])([A-Z])/g, '$1_$2').toLowerCase();\n    /*\n     If the class is private the name starts with \"_\" which is not secure\n     for creating scopes. We prefix the name with \"private\" in this case.\n     */\n    if (insecure[0] !== '_') {\n        return insecure;\n    }\n    return 'private' + insecure;\n}\nexport function toCamelCase(identifier) {\n    // quick return for empty string or single character strings\n    if (identifier.length <= 1) {\n        return identifier;\n    }\n    // Check for the underscore indicating snake_case\n    if (identifier.indexOf('_') === -1) {\n        return identifier;\n    }\n    return identifier.replace(/[_]+(\\w|$)/g, (m, p1) => p1.toUpperCase());\n}\n// tslint:disable-next-line:no-any\nlet _GLOBAL_CUSTOM_OBJECTS = {};\nexport function serializeKerasObject(instance) {\n    if (instance === null || instance === undefined) {\n        return null;\n    }\n    const dict = {};\n    dict['className'] = instance.getClassName();\n    dict['config'] = instance.getConfig();\n    return dict;\n}\n/**\n * Replace ndarray-style scalar objects in serialization objects with numbers.\n *\n * Background: In some versions of tf.keras, certain scalar values in the HDF5\n * model save file can be serialized as: `{'type': 'ndarray', 'value': num}`,\n * where in `num` is a plain number. This method converts such serialization\n * to a `number`.\n *\n * @param config The keras-format serialization object to be processed\n *   (in place).\n */\nfunction convertNDArrayScalarsInConfig(config) {\n    if (config == null || typeof config !== 'object') {\n        return;\n    }\n    else if (Array.isArray(config)) {\n        config.forEach(configItem => convertNDArrayScalarsInConfig(configItem));\n    }\n    else {\n        const fields = Object.keys(config);\n        for (const field of fields) {\n            const value = config[field];\n            if (value != null && typeof value === 'object') {\n                if (!Array.isArray(value) && value['type'] === 'ndarray' &&\n                    typeof value['value'] === 'number') {\n                    config[field] = value['value'];\n                }\n                else {\n                    convertNDArrayScalarsInConfig(value);\n                }\n            }\n        }\n    }\n}\n/**\n * Deserialize a saved Keras Object\n * @param identifier either a string ID or a saved Keras dictionary\n * @param moduleObjects a list of Python class names to object constructors\n * @param customObjects a list of Python class names to object constructors\n * @param printableModuleName debug text for the object being reconstituted\n * @param fastWeightInit Optional flag to use fast weight initialization\n *   during deserialization. This is applicable to cases in which\n *   the initialization will be immediately overwritten by loaded weight\n *   values. Default: `false`.\n * @returns a TensorFlow.js Layers object\n */\n// tslint:disable:no-any\nexport function deserializeKerasObject(identifier, moduleObjects = {}, customObjects = {}, printableModuleName = 'object', fastWeightInit = false) {\n    // tslint:enable\n    if (typeof identifier === 'string') {\n        const functionName = identifier;\n        let fn;\n        if (functionName in customObjects) {\n            fn = customObjects[functionName];\n        }\n        else if (functionName in _GLOBAL_CUSTOM_OBJECTS) {\n            fn = _GLOBAL_CUSTOM_OBJECTS[functionName];\n        }\n        else {\n            fn = moduleObjects[functionName];\n            if (fn == null) {\n                throw new ValueError(`Unknown ${printableModuleName}: ${identifier}. ` +\n                    `This may be due to one of the following reasons:\\n` +\n                    `1. The ${printableModuleName} is defined in Python, in which ` +\n                    `case it needs to be ported to TensorFlow.js or your JavaScript ` +\n                    `code.\\n` +\n                    `2. The custom ${printableModuleName} is defined in JavaScript, ` +\n                    `but is not registered properly with ` +\n                    `tf.serialization.registerClass().`);\n                // TODO(cais): Add link to tutorial page on custom layers.\n            }\n        }\n        return fn;\n    }\n    else {\n        // In this case we are dealing with a Keras config dictionary.\n        const config = identifier;\n        if (config['className'] == null || config['config'] == null) {\n            throw new ValueError(`${printableModuleName}: Improper config format: ` +\n                `${JSON.stringify(config)}.\\n` +\n                `'className' and 'config' must set.`);\n        }\n        const className = config['className'];\n        let cls, fromConfig;\n        if (className in customObjects) {\n            [cls, fromConfig] = customObjects[className];\n        }\n        else if (className in _GLOBAL_CUSTOM_OBJECTS) {\n            [cls, fromConfig] = _GLOBAL_CUSTOM_OBJECTS['className'];\n        }\n        else if (className in moduleObjects) {\n            [cls, fromConfig] = moduleObjects[className];\n        }\n        if (cls == null) {\n            throw new ValueError(`Unknown ${printableModuleName}: ${className}. ` +\n                `This may be due to one of the following reasons:\\n` +\n                `1. The ${printableModuleName} is defined in Python, in which ` +\n                `case it needs to be ported to TensorFlow.js or your JavaScript ` +\n                `code.\\n` +\n                `2. The custom ${printableModuleName} is defined in JavaScript, ` +\n                `but is not registered properly with ` +\n                `tf.serialization.registerClass().`);\n            // TODO(cais): Add link to tutorial page on custom layers.\n        }\n        if (fromConfig != null) {\n            // Porting notes: Instead of checking to see whether fromConfig accepts\n            // customObjects, we create a customObjects dictionary and tack it on to\n            // config['config'] as config['config'].customObjects. Objects can use it,\n            // if they want.\n            // tslint:disable-next-line:no-any\n            const customObjectsCombined = {};\n            for (const key of Object.keys(_GLOBAL_CUSTOM_OBJECTS)) {\n                customObjectsCombined[key] = _GLOBAL_CUSTOM_OBJECTS[key];\n            }\n            for (const key of Object.keys(customObjects)) {\n                customObjectsCombined[key] = customObjects[key];\n            }\n            // Add the customObjects to config\n            const nestedConfig = config['config'];\n            nestedConfig['customObjects'] = customObjectsCombined;\n            const backupCustomObjects = Object.assign({}, _GLOBAL_CUSTOM_OBJECTS);\n            for (const key of Object.keys(customObjects)) {\n                _GLOBAL_CUSTOM_OBJECTS[key] = customObjects[key];\n            }\n            convertNDArrayScalarsInConfig(config['config']);\n            const returnObj = fromConfig(cls, config['config'], customObjects, fastWeightInit);\n            _GLOBAL_CUSTOM_OBJECTS = Object.assign({}, backupCustomObjects);\n            return returnObj;\n        }\n        else {\n            // Then `cls` may be a function returning a class.\n            // In this case by convention `config` holds\n            // the kwargs of the function.\n            const backupCustomObjects = Object.assign({}, _GLOBAL_CUSTOM_OBJECTS);\n            for (const key of Object.keys(customObjects)) {\n                _GLOBAL_CUSTOM_OBJECTS[key] = customObjects[key];\n            }\n            // In python this is **config['config'], for tfjs-layers we require\n            // classes that use this fall-through construction method to take\n            // a config interface that mimics the expansion of named parameters.\n            const returnObj = new cls(config['config']);\n            _GLOBAL_CUSTOM_OBJECTS = Object.assign({}, backupCustomObjects);\n            return returnObj;\n        }\n    }\n}\n/**\n * Compares two numbers for sorting.\n * @param a\n * @param b\n */\nexport function numberCompare(a, b) {\n    return (a < b) ? -1 : ((a > b) ? 1 : 0);\n}\n/**\n * Comparison of two numbers for reverse sorting.\n * @param a\n * @param b\n */\nexport function reverseNumberCompare(a, b) {\n    return -1 * numberCompare(a, b);\n}\n/**\n * Convert a string into the corresponding DType.\n * @param dtype\n * @returns An instance of DType.\n */\nexport function stringToDType(dtype) {\n    switch (dtype) {\n        case 'float32':\n            return 'float32';\n        default:\n            throw new ValueError(`Invalid dtype: ${dtype}`);\n    }\n}\n/**\n * Test the element-by-element equality of two Arrays of strings.\n * @param xs First array of strings.\n * @param ys Second array of strings.\n * @returns Wether the two arrays are all equal, element by element.\n */\nexport function stringsEqual(xs, ys) {\n    if (xs == null || ys == null) {\n        return xs === ys;\n    }\n    if (xs.length !== ys.length) {\n        return false;\n    }\n    for (let i = 0; i < xs.length; ++i) {\n        if (xs[i] !== ys[i]) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Get the unique elements of an array.\n * @param xs Array.\n * @returns An Array consisting of the unique elements in `xs`.\n */\nexport function unique(xs) {\n    if (xs == null) {\n        return xs;\n    }\n    const out = [];\n    // TODO(cais): Maybe improve performance by sorting.\n    for (const x of xs) {\n        if (out.indexOf(x) === -1) {\n            out.push(x);\n        }\n    }\n    return out;\n}\n/**\n * Determine if an Object is empty (i.e., does not have own properties).\n * @param obj Object\n * @returns Whether the Object is empty.\n * @throws ValueError: If object is `null` or `undefined`.\n */\nexport function isObjectEmpty(obj) {\n    if (obj == null) {\n        throw new ValueError(`Invalid value in obj: ${JSON.stringify(obj)}`);\n    }\n    for (const key in obj) {\n        if (obj.hasOwnProperty(key)) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Helper function used to build type union/enum run-time checkers.\n * @param values The list of allowed values.\n * @param label A string name for the type\n * @param value The value to test.\n * @throws ValueError: If the value is not in values nor `undefined`/`null`.\n */\nexport function checkStringTypeUnionValue(values, label, value) {\n    if (value == null) {\n        return;\n    }\n    if (values.indexOf(value) < 0) {\n        throw new ValueError(`${value} is not a valid ${label}.  Valid values are ${values} or null/undefined.`);\n    }\n}\n/**\n * Helper function for verifying the types of inputs.\n *\n * Ensures that the elements of `x` are all of type `expectedType`.\n * Also verifies that the length of `x` is within bounds.\n *\n * @param x Object to test.\n * @param expectedType The string expected type of all of the elements in the\n * Array.\n * @param minLength Return false if x.length is less than this.\n * @param maxLength Return false if x.length is greater than this.\n * @returns true if and only if `x` is an `Array<expectedType>` with\n * length >= `minLength` and <= `maxLength`.\n */\n// tslint:disable:no-any\nexport function checkArrayTypeAndLength(x, expectedType, minLength = 0, maxLength = Infinity) {\n    assert(minLength >= 0);\n    assert(maxLength >= minLength);\n    return (Array.isArray(x) && x.length >= minLength && x.length <= maxLength &&\n        x.every(e => typeof e === expectedType));\n}\n// tslint:enable:no-any\n/**\n * Assert that a value or an array of value are positive integer.\n *\n * @param value The value being asserted on. May be a single number or an array\n *   of numbers.\n * @param name Name of the value, used to make the error message.\n */\nexport function assertPositiveInteger(value, name) {\n    if (Array.isArray(value)) {\n        util.assert(value.length > 0, () => `${name} is unexpectedly an empty array.`);\n        value.forEach((v, i) => assertPositiveInteger(v, `element ${i + 1} of ${name}`));\n    }\n    else {\n        util.assert(Number.isInteger(value) && value > 0, () => `Expected ${name} to be a positive integer, but got ` +\n            `${formatAsFriendlyString(value)}.`);\n    }\n}\n/**\n * Format a value into a display-friendly, human-readable fashion.\n *\n * - `null` is formatted as `'null'`\n * - Strings are formated with flanking pair of quotes.\n * - Arrays are formatted with flanking pair of square brackets.\n *\n * @param value The value to display.\n * @return Formatted string.\n */\n// tslint:disable-next-line:no-any\nexport function formatAsFriendlyString(value) {\n    if (value === null) {\n        return 'null';\n    }\n    else if (Array.isArray(value)) {\n        return '[' + value.map(v => formatAsFriendlyString(v)).join(',') + ']';\n    }\n    else if (typeof value === 'string') {\n        return `\"${value}\"`;\n    }\n    else {\n        return `${value}`;\n    }\n}\n/**\n * Returns a function `f2` (decorator) which wraps the original function\n * `f`. `f2` guarantees that `f` can be called at most once\n * every `waitMs` ms. If `f2` is called more often, it will return\n * the last returned result of `f`.\n *\n * @param f The original function `f` to wrap.\n * @param waitMs The time between two consecutive calls to `f` in ms.\n */\nexport function debounce(f, waitMs, nowFunc) {\n    let lastTime = nowFunc != null ? nowFunc() : util.now();\n    let lastResult;\n    const f2 = (...args) => {\n        const now = nowFunc != null ? nowFunc() : util.now();\n        if (now - lastTime < waitMs) {\n            return lastResult;\n        }\n        lastTime = now;\n        lastResult = f(...args);\n        return lastResult;\n    };\n    return f2;\n}\n/**\n * Returns the fusable activation given a layers identifier.\n *\n * @param activationName The layers identifier string.\n * @return The name of the fusable activation.\n */\nexport function mapActivationToFusedKernel(activationName) {\n    if (activationName === 'relu') {\n        return 'relu';\n    }\n    if (activationName === 'linear') {\n        return 'linear';\n    }\n    if (activationName === 'elu') {\n        return 'elu';\n    }\n    return null;\n}\n/**\n * Returns the cartesian product of sets of values.\n * This works the same as itertools.product in Python.\n *\n * Example:\n *\n * filters = [128, 256, 512]\n * paddings = ['same', 'valid']\n *\n * product = [ [128, 'same'], [128, 'valid'], [256, 'same'], [256, 'valid'],\n * [512, 'same'], [512, 'valid']]\n *\n * @param arrayOfValues List/array of values.\n * @return The cartesian product.\n */\nexport function getCartesianProductOfValues(...arrayOfValues) {\n    assert(arrayOfValues.length > 0, 'arrayOfValues is empty');\n    for (const values of arrayOfValues) {\n        assert(Array.isArray(values), 'one of the values is not an array');\n        assert(values.length > 0, 'one of the values is empty');\n    }\n    return arrayOfValues.reduce((products, values) => {\n        if (products.length === 0) {\n            return values.map(value => [value]);\n        }\n        return values\n            .map(value => {\n            return products.map((prevValue) => [...prevValue, value]);\n        })\n            .reduce((flattenedProduct, unflattenedProduct) => {\n            return flattenedProduct.concat(unflattenedProduct);\n        }, []);\n    }, []);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJpY191dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9nZW5lcmljX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsNkNBQTZDO0FBRTdDLE9BQU8sRUFBaUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGNBQWMsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFckQsZ0JBQWdCO0FBRWhCOzs7R0FHRztBQUNILGtDQUFrQztBQUNsQyxNQUFNLFVBQVUsWUFBWSxDQUFDLEtBQVUsRUFBRSxTQUFpQjtJQUN4RCxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDeEIsa0NBQWtDO1FBQ2xDLElBQUksUUFBUSxHQUFVLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsT0FBTyxRQUFRLENBQUM7S0FDakI7U0FBTTtRQUNMLE1BQU0sUUFBUSxHQUFHLElBQUksS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3RDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckIsT0FBTyxRQUFRLENBQUM7S0FDakI7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FBQyxHQUFZLEVBQUUsT0FBZ0I7SUFDbkQsSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNSLE1BQU0sSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDbkM7QUFDSCxDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUFJLEtBQVUsRUFBRSxR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QyxDQUFDO1NBQ3JDO1FBRUQsT0FBTyxNQUFNO2FBQ1IsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsT0FBTyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDO2FBQ0QsTUFBTSxDQUFDLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLEVBQUUsRUFBRTtZQUMvQyxPQUFPLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3JELENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUNiLENBQUMsRUFBRSxFQUFvQixDQUFDLENBQUM7QUFDM0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZTogdXRpbHMvZ2VuZXJpY191dGlscy5weSAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBmdXNlZCwgc2VyaWFsaXphdGlvbiwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBc3NlcnRpb25FcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcblxuLy8gdHNsaW50OmVuYWJsZVxuXG4vKipcbiAqIElmIGB2YWx1ZWAgaXMgYW4gQXJyYXksIGVxdWl2YWxlbnQgdG8gUHl0aG9uJ3MgYHZhbHVlICogbnVtVmFsdWVzYC5cbiAqIElmIGB2YWx1ZWAgaXMgbm90IGFuIEFycmF5LCBlcXVpdmFsZW50IHRvIFB5dGhvbidzIGBbdmFsdWVdICogbnVtVmFsdWVzYFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gcHlMaXN0UmVwZWF0KHZhbHVlOiBhbnksIG51bVZhbHVlczogbnVtYmVyKTogYW55W10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgbGV0IG5ld0FycmF5OiBhbnlbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHtcbiAgICAgIG5ld0FycmF5ID0gbmV3QXJyYXkuY29uY2F0KHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IG5ld0FycmF5ID0gbmV3IEFycmF5KG51bVZhbHVlcyk7XG4gICAgbmV3QXJyYXkuZmlsbCh2YWx1ZSk7XG4gICAgcmV0dXJuIG5ld0FycmF5O1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnQodmFsOiBib29sZWFuLCBtZXNzYWdlPzogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghdmFsKSB7XG4gICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKG1lc3NhZ2UpO1xuICB9XG59XG5cbi8qKlxuICogQ291bnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgYGFycmF5YCB0aGF0IGFyZSBlcXVhbCB0byBgcmVmZXJlbmNlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50PFQ+KGFycmF5OiBUW10sIHJlZmVybmNlOiBUKSB7XG4gIGxldCBjb3VudGVyID0gMDtcbiAgZm9yIChjb25zdCBpdGVtIG9mIGFycmF5KSB7XG4gICAgaWYgKGl0ZW0gPT09IHJlZmVybmNlKSB7XG4gICAgICBjb3VudGVyKys7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb3VudGVyO1xufVxuXG4vKipcbiAqIElmIGFuIGFycmF5IGlzIG9mIGxlbmd0aCAxLCBqdXN0IHJldHVybiB0aGUgZmlyc3QgZWxlbWVudC4gT3RoZXJ3aXNlLCByZXR1cm5cbiAqIHRoZSBmdWxsIGFycmF5LlxuICogQHBhcmFtIHRlbnNvcnNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpbmdsZXRvbk9yQXJyYXk8VD4oeHM6IFRbXSk6IFR8VFtdIHtcbiAgaWYgKHhzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiB4c1swXTtcbiAgfVxuICByZXR1cm4geHM7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBhIGxpc3QvdGVuc29yIGludG8gYSBsaXN0LlxuICpcbiAqIElmIGEgdGVuc29yIGlzIHBhc3NlZCwgd2UgcmV0dXJuXG4gKiBhIGxpc3Qgb2Ygc2l6ZSAxIGNvbnRhaW5pbmcgdGhlIHRlbnNvci5cbiAqXG4gKiBAcGFyYW0geCB0YXJnZXQgb2JqZWN0IHRvIGJlIG5vcm1hbGl6ZWQuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiB0b0xpc3QoeDogYW55KTogYW55W10ge1xuICBpZiAoQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHJldHVybiB4O1xuICB9XG4gIHJldHVybiBbeF07XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBVSUQgZm9yIGEgbGlzdFxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gb2JqZWN0TGlzdFVpZChvYmpzOiBhbnl8YW55W10pOiBzdHJpbmcge1xuICBjb25zdCBvYmplY3RMaXN0ID0gdG9MaXN0KG9ianMpO1xuICBsZXQgcmV0VmFsID0gJyc7XG4gIGZvciAoY29uc3Qgb2JqIG9mIG9iamVjdExpc3QpIHtcbiAgICBpZiAob2JqLmlkID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBPYmplY3QgJHtvYmp9IHBhc3NlZCB0byBvYmplY3RMaXN0VWlkIHdpdGhvdXQgYW4gaWRgKTtcbiAgICB9XG4gICAgaWYgKHJldFZhbCAhPT0gJycpIHtcbiAgICAgIHJldFZhbCA9IHJldFZhbCArICcsICc7XG4gICAgfVxuICAgIHJldFZhbCA9IGAke3JldFZhbH0ke01hdGguYWJzKG9iai5pZCl9YDtcbiAgfVxuICByZXR1cm4gcmV0VmFsO1xufVxuLyoqXG4gKiBDb252ZXJ0cyBzdHJpbmcgdG8gc25ha2UtY2FzZS5cbiAqIEBwYXJhbSBuYW1lXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b1NuYWtlQ2FzZShuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBpbnRlcm1lZGlhdGUgPSBuYW1lLnJlcGxhY2UoLyguKShbQS1aXVthLXowLTldKykvZywgJyQxXyQyJyk7XG4gIGNvbnN0IGluc2VjdXJlID1cbiAgICAgIGludGVybWVkaWF0ZS5yZXBsYWNlKC8oW2Etel0pKFtBLVpdKS9nLCAnJDFfJDInKS50b0xvd2VyQ2FzZSgpO1xuICAvKlxuICAgSWYgdGhlIGNsYXNzIGlzIHByaXZhdGUgdGhlIG5hbWUgc3RhcnRzIHdpdGggXCJfXCIgd2hpY2ggaXMgbm90IHNlY3VyZVxuICAgZm9yIGNyZWF0aW5nIHNjb3Blcy4gV2UgcHJlZml4IHRoZSBuYW1lIHdpdGggXCJwcml2YXRlXCIgaW4gdGhpcyBjYXNlLlxuICAgKi9cbiAgaWYgKGluc2VjdXJlWzBdICE9PSAnXycpIHtcbiAgICByZXR1cm4gaW5zZWN1cmU7XG4gIH1cbiAgcmV0dXJuICdwcml2YXRlJyArIGluc2VjdXJlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9DYW1lbENhc2UoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgLy8gcXVpY2sgcmV0dXJuIGZvciBlbXB0eSBzdHJpbmcgb3Igc2luZ2xlIGNoYXJhY3RlciBzdHJpbmdzXG4gIGlmIChpZGVudGlmaWVyLmxlbmd0aCA8PSAxKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cbiAgLy8gQ2hlY2sgZm9yIHRoZSB1bmRlcnNjb3JlIGluZGljYXRpbmcgc25ha2VfY2FzZVxuICBpZiAoaWRlbnRpZmllci5pbmRleE9mKCdfJykgPT09IC0xKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH1cbiAgcmV0dXJuIGlkZW50aWZpZXIucmVwbGFjZSgvW19dKyhcXHd8JCkvZywgKG0sIHAxKSA9PiBwMS50b1VwcGVyQ2FzZSgpKTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxubGV0IF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMgPSB7fSBhcyB7W29iak5hbWU6IHN0cmluZ106IGFueX07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVLZXJhc09iamVjdChpbnN0YW5jZTogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUpOlxuICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgaWYgKGluc3RhbmNlID09PSBudWxsIHx8IGluc3RhbmNlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuICBjb25zdCBkaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSA9IHt9O1xuICBkaWN0WydjbGFzc05hbWUnXSA9IGluc3RhbmNlLmdldENsYXNzTmFtZSgpO1xuICBkaWN0Wydjb25maWcnXSA9IGluc3RhbmNlLmdldENvbmZpZygpO1xuICByZXR1cm4gZGljdDtcbn1cblxuLyoqXG4gKiBSZXBsYWNlIG5kYXJyYXktc3R5bGUgc2NhbGFyIG9iamVjdHMgaW4gc2VyaWFsaXphdGlvbiBvYmplY3RzIHdpdGggbnVtYmVycy5cbiAqXG4gKiBCYWNrZ3JvdW5kOiBJbiBzb21lIHZlcnNpb25zIG9mIHRmLmtlcmFzLCBjZXJ0YWluIHNjYWxhciB2YWx1ZXMgaW4gdGhlIEhERjVcbiAqIG1vZGVsIHNhdmUgZmlsZSBjYW4gYmUgc2VyaWFsaXplZCBhczogYHsndHlwZSc6ICduZGFycmF5JywgJ3ZhbHVlJzogbnVtfWAsXG4gKiB3aGVyZSBpbiBgbnVtYCBpcyBhIHBsYWluIG51bWJlci4gVGhpcyBtZXRob2QgY29udmVydHMgc3VjaCBzZXJpYWxpemF0aW9uXG4gKiB0byBhIGBudW1iZXJgLlxuICpcbiAqIEBwYXJhbSBjb25maWcgVGhlIGtlcmFzLWZvcm1hdCBzZXJpYWxpemF0aW9uIG9iamVjdCB0byBiZSBwcm9jZXNzZWRcbiAqICAgKGluIHBsYWNlKS5cbiAqL1xuZnVuY3Rpb24gY29udmVydE5EQXJyYXlTY2FsYXJzSW5Db25maWcoY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSk6XG4gICAgdm9pZCB7XG4gIGlmIChjb25maWcgPT0gbnVsbCB8fCB0eXBlb2YgY29uZmlnICE9PSAnb2JqZWN0Jykge1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25maWcuZm9yRWFjaChjb25maWdJdGVtID0+IGNvbnZlcnROREFycmF5U2NhbGFyc0luQ29uZmlnKGNvbmZpZ0l0ZW0pKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBmaWVsZHMgPSBPYmplY3Qua2V5cyhjb25maWcpO1xuICAgIGZvciAoY29uc3QgZmllbGQgb2YgZmllbGRzKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGNvbmZpZ1tmaWVsZF07XG4gICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWVbJ3R5cGUnXSA9PT0gJ25kYXJyYXknICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWVbJ3ZhbHVlJ10gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uZmlnW2ZpZWxkXSA9IHZhbHVlWyd2YWx1ZSddO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnZlcnROREFycmF5U2NhbGFyc0luQ29uZmlnKHZhbHVlIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBEZXNlcmlhbGl6ZSBhIHNhdmVkIEtlcmFzIE9iamVjdFxuICogQHBhcmFtIGlkZW50aWZpZXIgZWl0aGVyIGEgc3RyaW5nIElEIG9yIGEgc2F2ZWQgS2VyYXMgZGljdGlvbmFyeVxuICogQHBhcmFtIG1vZHVsZU9iamVjdHMgYSBsaXN0IG9mIFB5dGhvbiBjbGFzcyBuYW1lcyB0byBvYmplY3QgY29uc3RydWN0b3JzXG4gKiBAcGFyYW0gY3VzdG9tT2JqZWN0cyBhIGxpc3Qgb2YgUHl0aG9uIGNsYXNzIG5hbWVzIHRvIG9iamVjdCBjb25zdHJ1Y3RvcnNcbiAqIEBwYXJhbSBwcmludGFibGVNb2R1bGVOYW1lIGRlYnVnIHRleHQgZm9yIHRoZSBvYmplY3QgYmVpbmcgcmVjb25zdGl0dXRlZFxuICogQHBhcmFtIGZhc3RXZWlnaHRJbml0IE9wdGlvbmFsIGZsYWcgdG8gdXNlIGZhc3Qgd2VpZ2h0IGluaXRpYWxpemF0aW9uXG4gKiAgIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0byBjYXNlcyBpbiB3aGljaFxuICogICB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0XG4gKiAgIHZhbHVlcy4gRGVmYXVsdDogYGZhbHNlYC5cbiAqIEByZXR1cm5zIGEgVGVuc29yRmxvdy5qcyBMYXllcnMgb2JqZWN0XG4gKi9cbi8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuZXhwb3J0IGZ1bmN0aW9uIGRlc2VyaWFsaXplS2VyYXNPYmplY3QoXG4gICAgaWRlbnRpZmllcjogc3RyaW5nfHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCxcbiAgICBtb2R1bGVPYmplY3RzID0ge30gYXMge1tvYmpOYW1lOiBzdHJpbmddOiBhbnl9LFxuICAgIGN1c3RvbU9iamVjdHMgPSB7fSBhcyB7W29iak5hbWU6IHN0cmluZ106IGFueX0sXG4gICAgcHJpbnRhYmxlTW9kdWxlTmFtZSA9ICdvYmplY3QnLCBmYXN0V2VpZ2h0SW5pdCA9IGZhbHNlKTogYW55IHtcbiAgLy8gdHNsaW50OmVuYWJsZVxuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgZnVuY3Rpb25OYW1lID0gaWRlbnRpZmllcjtcbiAgICBsZXQgZm47XG4gICAgaWYgKGZ1bmN0aW9uTmFtZSBpbiBjdXN0b21PYmplY3RzKSB7XG4gICAgICBmbiA9IGN1c3RvbU9iamVjdHNbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGVsc2UgaWYgKGZ1bmN0aW9uTmFtZSBpbiBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTKSB7XG4gICAgICBmbiA9IF9HTE9CQUxfQ1VTVE9NX09CSkVDVFNbZnVuY3Rpb25OYW1lXTtcbiAgICB9IGVsc2Uge1xuICAgICAgZm4gPSBtb2R1bGVPYmplY3RzW2Z1bmN0aW9uTmFtZV07XG4gICAgICBpZiAoZm4gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBVbmtub3duICR7cHJpbnRhYmxlTW9kdWxlTmFtZX06ICR7aWRlbnRpZmllcn0uIGAgK1xuICAgICAgICAgICAgYFRoaXMgbWF5IGJlIGR1ZSB0byBvbmUgb2YgdGhlIGZvbGxvd2luZyByZWFzb25zOlxcbmAgK1xuICAgICAgICAgICAgYDEuIFRoZSAke3ByaW50YWJsZU1vZHVsZU5hbWV9IGlzIGRlZmluZWQgaW4gUHl0aG9uLCBpbiB3aGljaCBgICtcbiAgICAgICAgICAgIGBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBgICtcbiAgICAgICAgICAgIGBjb2RlLlxcbmAgK1xuICAgICAgICAgICAgYDIuIFRoZSBjdXN0b20gJHtwcmludGFibGVNb2R1bGVOYW1lfSBpcyBkZWZpbmVkIGluIEphdmFTY3JpcHQsIGAgK1xuICAgICAgICAgICAgYGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIGAgK1xuICAgICAgICAgICAgYHRmLnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcygpLmApO1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbGluayB0byB0dXRvcmlhbCBwYWdlIG9uIGN1c3RvbSBsYXllcnMuXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmbjtcbiAgfSBlbHNlIHtcbiAgICAvLyBJbiB0aGlzIGNhc2Ugd2UgYXJlIGRlYWxpbmcgd2l0aCBhIEtlcmFzIGNvbmZpZyBkaWN0aW9uYXJ5LlxuICAgIGNvbnN0IGNvbmZpZyA9IGlkZW50aWZpZXI7XG4gICAgaWYgKGNvbmZpZ1snY2xhc3NOYW1lJ10gPT0gbnVsbCB8fCBjb25maWdbJ2NvbmZpZyddID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGAke3ByaW50YWJsZU1vZHVsZU5hbWV9OiBJbXByb3BlciBjb25maWcgZm9ybWF0OiBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShjb25maWcpfS5cXG5gICtcbiAgICAgICAgICBgJ2NsYXNzTmFtZScgYW5kICdjb25maWcnIG11c3Qgc2V0LmApO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc05hbWUgPSBjb25maWdbJ2NsYXNzTmFtZSddIGFzIHN0cmluZztcbiAgICBsZXQgY2xzLCBmcm9tQ29uZmlnO1xuICAgIGlmIChjbGFzc05hbWUgaW4gY3VzdG9tT2JqZWN0cykge1xuICAgICAgW2NscywgZnJvbUNvbmZpZ10gPSBjdXN0b21PYmplY3RzW2NsYXNzTmFtZV07XG4gICAgfSBlbHNlIGlmIChjbGFzc05hbWUgaW4gX0dMT0JBTF9DVVNUT01fT0JKRUNUUykge1xuICAgICAgW2NscywgZnJvbUNvbmZpZ10gPSBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTWydjbGFzc05hbWUnXTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSBpbiBtb2R1bGVPYmplY3RzKSB7XG4gICAgICBbY2xzLCBmcm9tQ29uZmlnXSA9IG1vZHVsZU9iamVjdHNbY2xhc3NOYW1lXTtcbiAgICB9XG4gICAgaWYgKGNscyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVW5rbm93biAke3ByaW50YWJsZU1vZHVsZU5hbWV9OiAke2NsYXNzTmFtZX0uIGAgK1xuICAgICAgICAgIGBUaGlzIG1heSBiZSBkdWUgdG8gb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVhc29uczpcXG5gICtcbiAgICAgICAgICBgMS4gVGhlICR7cHJpbnRhYmxlTW9kdWxlTmFtZX0gaXMgZGVmaW5lZCBpbiBQeXRob24sIGluIHdoaWNoIGAgK1xuICAgICAgICAgIGBjYXNlIGl0IG5lZWRzIHRvIGJlIHBvcnRlZCB0byBUZW5zb3JGbG93LmpzIG9yIHlvdXIgSmF2YVNjcmlwdCBgICtcbiAgICAgICAgICBgY29kZS5cXG5gICtcbiAgICAgICAgICBgMi4gVGhlIGN1c3RvbSAke3ByaW50YWJsZU1vZHVsZU5hbWV9IGlzIGRlZmluZWQgaW4gSmF2YVNjcmlwdCwgYCArXG4gICAgICAgICAgYGJ1dCBpcyBub3QgcmVnaXN0ZXJlZCBwcm9wZXJseSB3aXRoIGAgK1xuICAgICAgICAgIGB0Zi5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoKS5gKTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBsaW5rIHRvIHR1dG9yaWFsIHBhZ2Ugb24gY3VzdG9tIGxheWVycy5cbiAgICB9XG4gICAgaWYgKGZyb21Db25maWcgIT0gbnVsbCkge1xuICAgICAgLy8gUG9ydGluZyBub3RlczogSW5zdGVhZCBvZiBjaGVja2luZyB0byBzZWUgd2hldGhlciBmcm9tQ29uZmlnIGFjY2VwdHNcbiAgICAgIC8vIGN1c3RvbU9iamVjdHMsIHdlIGNyZWF0ZSBhIGN1c3RvbU9iamVjdHMgZGljdGlvbmFyeSBhbmQgdGFjayBpdCBvbiB0b1xuICAgICAgLy8gY29uZmlnWydjb25maWcnXSBhcyBjb25maWdbJ2NvbmZpZyddLmN1c3RvbU9iamVjdHMuIE9iamVjdHMgY2FuIHVzZSBpdCxcbiAgICAgIC8vIGlmIHRoZXkgd2FudC5cblxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgY29uc3QgY3VzdG9tT2JqZWN0c0NvbWJpbmVkID0ge30gYXMge1tvYmpOYW1lOiBzdHJpbmddOiBhbnl9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoX0dMT0JBTF9DVVNUT01fT0JKRUNUUykpIHtcbiAgICAgICAgY3VzdG9tT2JqZWN0c0NvbWJpbmVkW2tleV0gPSBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2tleV07XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXN0b21PYmplY3RzKSkge1xuICAgICAgICBjdXN0b21PYmplY3RzQ29tYmluZWRba2V5XSA9IGN1c3RvbU9iamVjdHNba2V5XTtcbiAgICAgIH1cbiAgICAgIC8vIEFkZCB0aGUgY3VzdG9tT2JqZWN0cyB0byBjb25maWdcbiAgICAgIGNvbnN0IG5lc3RlZENvbmZpZyA9IGNvbmZpZ1snY29uZmlnJ10gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0O1xuICAgICAgbmVzdGVkQ29uZmlnWydjdXN0b21PYmplY3RzJ10gPSBjdXN0b21PYmplY3RzQ29tYmluZWQ7XG5cbiAgICAgIGNvbnN0IGJhY2t1cEN1c3RvbU9iamVjdHMgPSB7Li4uX0dMT0JBTF9DVVNUT01fT0JKRUNUU307XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhjdXN0b21PYmplY3RzKSkge1xuICAgICAgICBfR0xPQkFMX0NVU1RPTV9PQkpFQ1RTW2tleV0gPSBjdXN0b21PYmplY3RzW2tleV07XG4gICAgICB9XG4gICAgICBjb252ZXJ0TkRBcnJheVNjYWxhcnNJbkNvbmZpZyhjb25maWdbJ2NvbmZpZyddKTtcbiAgICAgIGNvbnN0IHJldHVybk9iaiA9XG4gICAgICAgICAgZnJvbUNvbmZpZyhjbHMsIGNvbmZpZ1snY29uZmlnJ10sIGN1c3RvbU9iamVjdHMsIGZhc3RXZWlnaHRJbml0KTtcbiAgICAgIF9HTE9CQUxfQ1VTVE9NX09CSkVDVFMgPSB7Li4uYmFja3VwQ3VzdG9tT2JqZWN0c307XG5cbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoZW4gYGNsc2AgbWF5IGJlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIGEgY2xhc3MuXG4gICAgICAvLyBJbiB0aGlzIGNhc2UgYnkgY29udmVudGlvbiBgY29uZmlnYCBob2xkc1xuICAgICAgLy8gdGhlIGt3YXJncyBvZiB0aGUgZnVuY3Rpb24uXG4gICAgICBjb25zdCBiYWNrdXBDdXN0b21PYmplY3RzID0gey4uLl9HTE9CQUxfQ1VTVE9NX09CSkVDVFN9O1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMoY3VzdG9tT2JqZWN0cykpIHtcbiAgICAgICAgX0dMT0JBTF9DVVNUT01fT0JKRUNUU1trZXldID0gY3VzdG9tT2JqZWN0c1trZXldO1xuICAgICAgfVxuICAgICAgLy8gSW4gcHl0aG9uIHRoaXMgaXMgKipjb25maWdbJ2NvbmZpZyddLCBmb3IgdGZqcy1sYXllcnMgd2UgcmVxdWlyZVxuICAgICAgLy8gY2xhc3NlcyB0aGF0IHVzZSB0aGlzIGZhbGwtdGhyb3VnaCBjb25zdHJ1Y3Rpb24gbWV0aG9kIHRvIHRha2VcbiAgICAgIC8vIGEgY29uZmlnIGludGVyZmFjZSB0aGF0IG1pbWljcyB0aGUgZXhwYW5zaW9uIG9mIG5hbWVkIHBhcmFtZXRlcnMuXG4gICAgICBjb25zdCByZXR1cm5PYmogPSBuZXcgY2xzKGNvbmZpZ1snY29uZmlnJ10pO1xuICAgICAgX0dMT0JBTF9DVVNUT01fT0JKRUNUUyA9IHsuLi5iYWNrdXBDdXN0b21PYmplY3RzfTtcbiAgICAgIHJldHVybiByZXR1cm5PYmo7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ29tcGFyZXMgdHdvIG51bWJlcnMgZm9yIHNvcnRpbmcuXG4gKiBAcGFyYW0gYVxuICogQHBhcmFtIGJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG51bWJlckNvbXBhcmUoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgcmV0dXJuIChhIDwgYikgPyAtMSA6ICgoYSA+IGIpID8gMSA6IDApO1xufVxuXG4vKipcbiAqIENvbXBhcmlzb24gb2YgdHdvIG51bWJlcnMgZm9yIHJldmVyc2Ugc29ydGluZy5cbiAqIEBwYXJhbSBhXG4gKiBAcGFyYW0gYlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmV2ZXJzZU51bWJlckNvbXBhcmUoYTogbnVtYmVyLCBiOiBudW1iZXIpIHtcbiAgcmV0dXJuIC0xICogbnVtYmVyQ29tcGFyZShhLCBiKTtcbn1cblxuLyoqXG4gKiBDb252ZXJ0IGEgc3RyaW5nIGludG8gdGhlIGNvcnJlc3BvbmRpbmcgRFR5cGUuXG4gKiBAcGFyYW0gZHR5cGVcbiAqIEByZXR1cm5zIEFuIGluc3RhbmNlIG9mIERUeXBlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nVG9EVHlwZShkdHlwZTogc3RyaW5nKTogRGF0YVR5cGUge1xuICBzd2l0Y2ggKGR0eXBlKSB7XG4gICAgY2FzZSAnZmxvYXQzMic6XG4gICAgICByZXR1cm4gJ2Zsb2F0MzInO1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgSW52YWxpZCBkdHlwZTogJHtkdHlwZX1gKTtcbiAgfVxufVxuXG4vKipcbiAqIFRlc3QgdGhlIGVsZW1lbnQtYnktZWxlbWVudCBlcXVhbGl0eSBvZiB0d28gQXJyYXlzIG9mIHN0cmluZ3MuXG4gKiBAcGFyYW0geHMgRmlyc3QgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEBwYXJhbSB5cyBTZWNvbmQgYXJyYXkgb2Ygc3RyaW5ncy5cbiAqIEByZXR1cm5zIFdldGhlciB0aGUgdHdvIGFycmF5cyBhcmUgYWxsIGVxdWFsLCBlbGVtZW50IGJ5IGVsZW1lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdzRXF1YWwoeHM6IHN0cmluZ1tdLCB5czogc3RyaW5nW10pOiBib29sZWFuIHtcbiAgaWYgKHhzID09IG51bGwgfHwgeXMgPT0gbnVsbCkge1xuICAgIHJldHVybiB4cyA9PT0geXM7XG4gIH1cbiAgaWYgKHhzLmxlbmd0aCAhPT0geXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeHMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoeHNbaV0gIT09IHlzW2ldKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufVxuXG4vKipcbiAqIEdldCB0aGUgdW5pcXVlIGVsZW1lbnRzIG9mIGFuIGFycmF5LlxuICogQHBhcmFtIHhzIEFycmF5LlxuICogQHJldHVybnMgQW4gQXJyYXkgY29uc2lzdGluZyBvZiB0aGUgdW5pcXVlIGVsZW1lbnRzIGluIGB4c2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWU8VD4oeHM6IFRbXSk6IFRbXSB7XG4gIGlmICh4cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIHhzO1xuICB9XG4gIGNvbnN0IG91dDogVFtdID0gW107XG4gIC8vIFRPRE8oY2Fpcyk6IE1heWJlIGltcHJvdmUgcGVyZm9ybWFuY2UgYnkgc29ydGluZy5cbiAgZm9yIChjb25zdCB4IG9mIHhzKSB7XG4gICAgaWYgKG91dC5pbmRleE9mKHgpID09PSAtMSkge1xuICAgICAgb3V0LnB1c2goeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGFuIE9iamVjdCBpcyBlbXB0eSAoaS5lLiwgZG9lcyBub3QgaGF2ZSBvd24gcHJvcGVydGllcykuXG4gKiBAcGFyYW0gb2JqIE9iamVjdFxuICogQHJldHVybnMgV2hldGhlciB0aGUgT2JqZWN0IGlzIGVtcHR5LlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBvYmplY3QgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNPYmplY3RFbXB0eShvYmo6IHt9KTogYm9vbGVhbiB7XG4gIGlmIChvYmogPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnZhbGlkIHZhbHVlIGluIG9iajogJHtKU09OLnN0cmluZ2lmeShvYmopfWApO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIG9iaikge1xuICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCB0byBidWlsZCB0eXBlIHVuaW9uL2VudW0gcnVuLXRpbWUgY2hlY2tlcnMuXG4gKiBAcGFyYW0gdmFsdWVzIFRoZSBsaXN0IG9mIGFsbG93ZWQgdmFsdWVzLlxuICogQHBhcmFtIGxhYmVsIEEgc3RyaW5nIG5hbWUgZm9yIHRoZSB0eXBlXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHRlc3QuXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIHRoZSB2YWx1ZSBpcyBub3QgaW4gdmFsdWVzIG5vciBgdW5kZWZpbmVkYC9gbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFxuICAgIHZhbHVlczogc3RyaW5nW10sIGxhYmVsOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHZhbHVlcy5pbmRleE9mKHZhbHVlKSA8IDApIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgJHt2YWx1ZX0gaXMgbm90IGEgdmFsaWQgJHtsYWJlbH0uICBWYWxpZCB2YWx1ZXMgYXJlICR7XG4gICAgICAgIHZhbHVlc30gb3IgbnVsbC91bmRlZmluZWQuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHZlcmlmeWluZyB0aGUgdHlwZXMgb2YgaW5wdXRzLlxuICpcbiAqIEVuc3VyZXMgdGhhdCB0aGUgZWxlbWVudHMgb2YgYHhgIGFyZSBhbGwgb2YgdHlwZSBgZXhwZWN0ZWRUeXBlYC5cbiAqIEFsc28gdmVyaWZpZXMgdGhhdCB0aGUgbGVuZ3RoIG9mIGB4YCBpcyB3aXRoaW4gYm91bmRzLlxuICpcbiAqIEBwYXJhbSB4IE9iamVjdCB0byB0ZXN0LlxuICogQHBhcmFtIGV4cGVjdGVkVHlwZSBUaGUgc3RyaW5nIGV4cGVjdGVkIHR5cGUgb2YgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGVcbiAqIEFycmF5LlxuICogQHBhcmFtIG1pbkxlbmd0aCBSZXR1cm4gZmFsc2UgaWYgeC5sZW5ndGggaXMgbGVzcyB0aGFuIHRoaXMuXG4gKiBAcGFyYW0gbWF4TGVuZ3RoIFJldHVybiBmYWxzZSBpZiB4Lmxlbmd0aCBpcyBncmVhdGVyIHRoYW4gdGhpcy5cbiAqIEByZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgYHhgIGlzIGFuIGBBcnJheTxleHBlY3RlZFR5cGU+YCB3aXRoXG4gKiBsZW5ndGggPj0gYG1pbkxlbmd0aGAgYW5kIDw9IGBtYXhMZW5ndGhgLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBjaGVja0FycmF5VHlwZUFuZExlbmd0aChcbiAgICB4OiBhbnksIGV4cGVjdGVkVHlwZTogc3RyaW5nLCBtaW5MZW5ndGggPSAwLFxuICAgIG1heExlbmd0aCA9IEluZmluaXR5KTogYm9vbGVhbiB7XG4gIGFzc2VydChtaW5MZW5ndGggPj0gMCk7XG4gIGFzc2VydChtYXhMZW5ndGggPj0gbWluTGVuZ3RoKTtcbiAgcmV0dXJuIChcbiAgICAgIEFycmF5LmlzQXJyYXkoeCkgJiYgeC5sZW5ndGggPj0gbWluTGVuZ3RoICYmIHgubGVuZ3RoIDw9IG1heExlbmd0aCAmJlxuICAgICAgeC5ldmVyeShlID0+IHR5cGVvZiBlID09PSBleHBlY3RlZFR5cGUpKTtcbn1cbi8vIHRzbGludDplbmFibGU6bm8tYW55XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgYSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZSBhcmUgcG9zaXRpdmUgaW50ZWdlci5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIGJlaW5nIGFzc2VydGVkIG9uLiBNYXkgYmUgYSBzaW5nbGUgbnVtYmVyIG9yIGFuIGFycmF5XG4gKiAgIG9mIG51bWJlcnMuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB2YWx1ZSwgdXNlZCB0byBtYWtlIHRoZSBlcnJvciBtZXNzYWdlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHZhbHVlOiBudW1iZXJ8bnVtYmVyW10sIG5hbWU6IHN0cmluZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgdmFsdWUubGVuZ3RoID4gMCwgKCkgPT4gYCR7bmFtZX0gaXMgdW5leHBlY3RlZGx5IGFuIGVtcHR5IGFycmF5LmApO1xuICAgIHZhbHVlLmZvckVhY2goXG4gICAgICAgICh2LCBpKSA9PiBhc3NlcnRQb3NpdGl2ZUludGVnZXIodiwgYGVsZW1lbnQgJHtpICsgMX0gb2YgJHtuYW1lfWApKTtcbiAgfSBlbHNlIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgTnVtYmVyLmlzSW50ZWdlcih2YWx1ZSkgJiYgdmFsdWUgPiAwLFxuICAgICAgICAoKSA9PiBgRXhwZWN0ZWQgJHtuYW1lfSB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtmb3JtYXRBc0ZyaWVuZGx5U3RyaW5nKHZhbHVlKX0uYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBGb3JtYXQgYSB2YWx1ZSBpbnRvIGEgZGlzcGxheS1mcmllbmRseSwgaHVtYW4tcmVhZGFibGUgZmFzaGlvbi5cbiAqXG4gKiAtIGBudWxsYCBpcyBmb3JtYXR0ZWQgYXMgYCdudWxsJ2BcbiAqIC0gU3RyaW5ncyBhcmUgZm9ybWF0ZWQgd2l0aCBmbGFua2luZyBwYWlyIG9mIHF1b3Rlcy5cbiAqIC0gQXJyYXlzIGFyZSBmb3JtYXR0ZWQgd2l0aCBmbGFua2luZyBwYWlyIG9mIHNxdWFyZSBicmFja2V0cy5cbiAqXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGRpc3BsYXkuXG4gKiBAcmV0dXJuIEZvcm1hdHRlZCBzdHJpbmcuXG4gKi9cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRBc0ZyaWVuZGx5U3RyaW5nKHZhbHVlOiBhbnkpOiBzdHJpbmcge1xuICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICByZXR1cm4gJ251bGwnO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuICdbJyArIHZhbHVlLm1hcCh2ID0+IGZvcm1hdEFzRnJpZW5kbHlTdHJpbmcodikpLmpvaW4oJywnKSArICddJztcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGBcIiR7dmFsdWV9XCJgO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgJHt2YWx1ZX1gO1xuICB9XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIGBmMmAgKGRlY29yYXRvcikgd2hpY2ggd3JhcHMgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uXG4gKiBgZmAuIGBmMmAgZ3VhcmFudGVlcyB0aGF0IGBmYCBjYW4gYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogZXZlcnkgYHdhaXRNc2AgbXMuIElmIGBmMmAgaXMgY2FsbGVkIG1vcmUgb2Z0ZW4sIGl0IHdpbGwgcmV0dXJuXG4gKiB0aGUgbGFzdCByZXR1cm5lZCByZXN1bHQgb2YgYGZgLlxuICpcbiAqIEBwYXJhbSBmIFRoZSBvcmlnaW5hbCBmdW5jdGlvbiBgZmAgdG8gd3JhcC5cbiAqIEBwYXJhbSB3YWl0TXMgVGhlIHRpbWUgYmV0d2VlbiB0d28gY29uc2VjdXRpdmUgY2FsbHMgdG8gYGZgIGluIG1zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVib3VuY2U8VD4oXG4gICAgZjogKC4uLmFyZ3M6IEFycmF5PHt9PikgPT4gVCwgd2FpdE1zOiBudW1iZXIsXG4gICAgbm93RnVuYz86IEZ1bmN0aW9uKTogKC4uLmFyZ3M6IEFycmF5PHt9PikgPT4gVCB7XG4gIGxldCBsYXN0VGltZSA9IG5vd0Z1bmMgIT0gbnVsbCA/IG5vd0Z1bmMoKSA6IHV0aWwubm93KCk7XG4gIGxldCBsYXN0UmVzdWx0OiBUO1xuICBjb25zdCBmMiA9ICguLi5hcmdzOiBBcnJheTx7fT4pID0+IHtcbiAgICBjb25zdCBub3cgPSBub3dGdW5jICE9IG51bGwgPyBub3dGdW5jKCkgOiB1dGlsLm5vdygpO1xuICAgIGlmIChub3cgLSBsYXN0VGltZSA8IHdhaXRNcykge1xuICAgICAgcmV0dXJuIGxhc3RSZXN1bHQ7XG4gICAgfVxuICAgIGxhc3RUaW1lID0gbm93O1xuICAgIGxhc3RSZXN1bHQgPSBmKC4uLmFyZ3MpO1xuICAgIHJldHVybiBsYXN0UmVzdWx0O1xuICB9O1xuICByZXR1cm4gZjI7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZnVzYWJsZSBhY3RpdmF0aW9uIGdpdmVuIGEgbGF5ZXJzIGlkZW50aWZpZXIuXG4gKlxuICogQHBhcmFtIGFjdGl2YXRpb25OYW1lIFRoZSBsYXllcnMgaWRlbnRpZmllciBzdHJpbmcuXG4gKiBAcmV0dXJuIFRoZSBuYW1lIG9mIHRoZSBmdXNhYmxlIGFjdGl2YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYXBBY3RpdmF0aW9uVG9GdXNlZEtlcm5lbChhY3RpdmF0aW9uTmFtZTogc3RyaW5nKTpcbiAgICBmdXNlZC5BY3RpdmF0aW9uIHtcbiAgaWYgKGFjdGl2YXRpb25OYW1lID09PSAncmVsdScpIHtcbiAgICByZXR1cm4gJ3JlbHUnO1xuICB9XG4gIGlmIChhY3RpdmF0aW9uTmFtZSA9PT0gJ2xpbmVhcicpIHtcbiAgICByZXR1cm4gJ2xpbmVhcic7XG4gIH1cbiAgaWYgKGFjdGl2YXRpb25OYW1lID09PSAnZWx1Jykge1xuICAgIHJldHVybiAnZWx1JztcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxudHlwZSBQb3NzaWJsZVZhbHVlcyA9IEFycmF5PEFycmF5PGJvb2xlYW58c3RyaW5nfG51bWJlcj4+O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGNhcnRlc2lhbiBwcm9kdWN0IG9mIHNldHMgb2YgdmFsdWVzLlxuICogVGhpcyB3b3JrcyB0aGUgc2FtZSBhcyBpdGVydG9vbHMucHJvZHVjdCBpbiBQeXRob24uXG4gKlxuICogRXhhbXBsZTpcbiAqXG4gKiBmaWx0ZXJzID0gWzEyOCwgMjU2LCA1MTJdXG4gKiBwYWRkaW5ncyA9IFsnc2FtZScsICd2YWxpZCddXG4gKlxuICogcHJvZHVjdCA9IFsgWzEyOCwgJ3NhbWUnXSwgWzEyOCwgJ3ZhbGlkJ10sIFsyNTYsICdzYW1lJ10sIFsyNTYsICd2YWxpZCddLFxuICogWzUxMiwgJ3NhbWUnXSwgWzUxMiwgJ3ZhbGlkJ11dXG4gKlxuICogQHBhcmFtIGFycmF5T2ZWYWx1ZXMgTGlzdC9hcnJheSBvZiB2YWx1ZXMuXG4gKiBAcmV0dXJuIFRoZSBjYXJ0ZXNpYW4gcHJvZHVjdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldENhcnRlc2lhblByb2R1Y3RPZlZhbHVlcyguLi5hcnJheU9mVmFsdWVzOiBQb3NzaWJsZVZhbHVlcyk6XG4gICAgUG9zc2libGVWYWx1ZXMge1xuICBhc3NlcnQoYXJyYXlPZlZhbHVlcy5sZW5ndGggPiAwLCAnYXJyYXlPZlZhbHVlcyBpcyBlbXB0eScpO1xuXG4gIGZvciAoY29uc3QgdmFsdWVzIG9mIGFycmF5T2ZWYWx1ZXMpIHtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheSh2YWx1ZXMpLCAnb25lIG9mIHRoZSB2YWx1ZXMgaXMgbm90IGFuIGFycmF5Jyk7XG4gICAgYXNzZXJ0KHZhbHVlcy5sZW5ndGggPiAwLCAnb25lIG9mIHRoZSB2YWx1ZXMgaXMgZW1wdHknKTtcbiAgfVxuXG4gIHJldHVybiBhcnJheU9mVmFsdWVzLnJlZHVjZSgocHJvZHVjdHMsIHZhbHVlcykgPT4ge1xuICAgIGlmIChwcm9kdWN0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB2YWx1ZXMubWFwKHZhbHVlID0+IFt2YWx1ZV0pO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZXNcbiAgICAgICAgLm1hcCh2YWx1ZSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHByb2R1Y3RzLm1hcCgocHJldlZhbHVlKSA9PiBbLi4ucHJldlZhbHVlLCB2YWx1ZV0pO1xuICAgICAgICB9KVxuICAgICAgICAucmVkdWNlKChmbGF0dGVuZWRQcm9kdWN0LCB1bmZsYXR0ZW5lZFByb2R1Y3QpID0+IHtcbiAgICAgICAgICByZXR1cm4gZmxhdHRlbmVkUHJvZHVjdC5jb25jYXQodW5mbGF0dGVuZWRQcm9kdWN0KTtcbiAgICAgICAgfSwgW10pO1xuICB9LCBbXSBhcyBQb3NzaWJsZVZhbHVlcyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Utilities related to persistent state in the backend.\n */\n/**\n * An ID to track `tf.SymbolicTensor`s and derived classes.\n * Required in different places in engine/topology.ts to identify unique\n * tensors.\n */\nlet _nextUniqueTensorId = 0;\nexport function getNextUniqueTensorId() {\n    return _nextUniqueTensorId++;\n}\nconst _uidPrefixes = {};\n/**\n * Provides a unique UID given a string prefix.\n *\n * @param prefix\n */\nexport function getUid(prefix = '') {\n    if (!(prefix in _uidPrefixes)) {\n        _uidPrefixes[prefix] = 0;\n    }\n    _uidPrefixes[prefix] += 1;\n    return prefix + _uidPrefixes[prefix].toString();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvYmFja2VuZC9zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUg7Ozs7R0FJRztBQUNILElBQUksbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRTVCLE1BQU0sVUFBVSxxQkFBcUI7SUFDbkMsT0FBTyxtQkFBbUIsRUFBRSxDQUFDO0FBQy9CLENBQUM7QUFFRCxNQUFNLFlBQVksR0FBK0IsRUFBRSxDQUFDO0FBRXBEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLE1BQU0sR0FBRyxFQUFFO0lBQ2hDLElBQUksQ0FBQyxDQUFDLE1BQU0sSUFBSSxZQUFZLENBQUMsRUFBRTtRQUM3QixZQUFZLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzFCO0lBQ0QsWUFBWSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixPQUFPLE1BQU0sR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7QUFDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVXRpbGl0aWVzIHJlbGF0ZWQgdG8gcGVyc2lzdGVudCBzdGF0ZSBpbiB0aGUgYmFja2VuZC5cbiAqL1xuXG4vKipcbiAqIEFuIElEIHRvIHRyYWNrIGB0Zi5TeW1ib2xpY1RlbnNvcmBzIGFuZCBkZXJpdmVkIGNsYXNzZXMuXG4gKiBSZXF1aXJlZCBpbiBkaWZmZXJlbnQgcGxhY2VzIGluIGVuZ2luZS90b3BvbG9neS50cyB0byBpZGVudGlmeSB1bmlxdWVcbiAqIHRlbnNvcnMuXG4gKi9cbmxldCBfbmV4dFVuaXF1ZVRlbnNvcklkID0gMDtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldE5leHRVbmlxdWVUZW5zb3JJZCgpOiBudW1iZXIge1xuICByZXR1cm4gX25leHRVbmlxdWVUZW5zb3JJZCsrO1xufVxuXG5jb25zdCBfdWlkUHJlZml4ZXM6IHtbcHJlZml4OiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG5cbi8qKlxuICogUHJvdmlkZXMgYSB1bmlxdWUgVUlEIGdpdmVuIGEgc3RyaW5nIHByZWZpeC5cbiAqXG4gKiBAcGFyYW0gcHJlZml4XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRVaWQocHJlZml4ID0gJycpOiBzdHJpbmcge1xuICBpZiAoIShwcmVmaXggaW4gX3VpZFByZWZpeGVzKSkge1xuICAgIF91aWRQcmVmaXhlc1twcmVmaXhdID0gMDtcbiAgfVxuICBfdWlkUHJlZml4ZXNbcHJlZml4XSArPSAxO1xuICByZXR1cm4gcHJlZml4ICsgX3VpZFByZWZpeGVzW3ByZWZpeF0udG9TdHJpbmcoKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nexport const VALID_DATA_FORMAT_VALUES = ['channelsFirst', 'channelsLast'];\nexport const VALID_INTERPOLATION_FORMAT_VALUES = ['nearest', 'bilinear'];\nexport const VALID_PADDING_MODE_VALUES = ['valid', 'same', 'causal'];\nexport const VALID_POOL_MODE_VALUES = ['max', 'avg'];\nexport const VALID_BIDIRECTIONAL_MERGE_MODES = ['sum', 'mul', 'concat', 'ave'];\nexport const VALID_SAMPLE_WEIGHT_MODES = ['temporal'];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2tlcmFzX2Zvcm1hdC9jb21tb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFhSCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBRyxDQUFDLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUcxRSxNQUFNLENBQUMsTUFBTSxpQ0FBaUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztBQU16RSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFJckUsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFJckQsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUkvRSxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gVE9ETyhodWFuKTogYWRkIGxheWVyLXNwZWNpZmljIGlucHV0IHNoYXBlIHR5cGVzIChzZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMtbGF5ZXJzL3B1bGwvNDkyKVxuLyoqIEBkb2NhbGlhcyAobnVsbCB8IG51bWJlcilbXSAqL1xuZXhwb3J0IHR5cGUgU2hhcGUgPSBBcnJheTxudWxsIHwgbnVtYmVyPjtcblxuLy8gVGhlIHRmanMtY29yZSB2ZXJzaW9uIG9mIERhdGFUeXBlIG11c3Qgc3RheSBzeW5jZWQgd2l0aCB0aGlzLlxuZXhwb3J0IHR5cGUgRGF0YVR5cGUgPSAnZmxvYXQzMid8J2ludDMyJ3wnYm9vbCd8J2NvbXBsZXg2NCd8J3N0cmluZyc7XG5cbi8vIFRPRE8oc29lcmdlbCk6IE1vdmUgdGhlIENhbWVsQ2FzZSB2ZXJzaW9ucyBiYWNrIG91dCBvZiBrZXJhc19mb3JtYXRcbi8vIGUuZy4gdG8gc3JjL2NvbW1vbi50cy4gIE1heWJlIGV2ZW4gZHVwbGljYXRlICphbGwqIG9mIHRoZXNlIHRvIGJlIHBlZGFudGljP1xuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXQgPSAnY2hhbm5lbHNGaXJzdCd8J2NoYW5uZWxzTGFzdCc7XG5leHBvcnQgY29uc3QgVkFMSURfREFUQV9GT1JNQVRfVkFMVUVTID0gWydjaGFubmVsc0ZpcnN0JywgJ2NoYW5uZWxzTGFzdCddO1xuXG5leHBvcnQgdHlwZSBJbnRlcnBvbGF0aW9uRm9ybWF0ID0gJ25lYXJlc3QnfCdiaWxpbmVhcic7XG5leHBvcnQgY29uc3QgVkFMSURfSU5URVJQT0xBVElPTl9GT1JNQVRfVkFMVUVTID0gWyduZWFyZXN0JywgJ2JpbGluZWFyJ107XG4vLyBUaGVzZSBjb25zdGFudHMgaGF2ZSBhIHNuYWtlIHZzLiBjYW1lbCBkaXN0aW5jdGlvbi5cbmV4cG9ydCB0eXBlIERhdGFGb3JtYXRTZXJpYWxpemF0aW9uID0gJ2NoYW5uZWxzX2ZpcnN0J3wnY2hhbm5lbHNfbGFzdCc7XG5cbi8qKiBAZG9jaW5saW5lICovXG5leHBvcnQgdHlwZSBQYWRkaW5nTW9kZSA9ICd2YWxpZCd8J3NhbWUnfCdjYXVzYWwnO1xuZXhwb3J0IGNvbnN0IFZBTElEX1BBRERJTkdfTU9ERV9WQUxVRVMgPSBbJ3ZhbGlkJywgJ3NhbWUnLCAnY2F1c2FsJ107XG5cbi8qKiBAZG9jaW5saW5lICovXG5leHBvcnQgdHlwZSBQb29sTW9kZSA9ICdtYXgnfCdhdmcnO1xuZXhwb3J0IGNvbnN0IFZBTElEX1BPT0xfTU9ERV9WQUxVRVMgPSBbJ21heCcsICdhdmcnXTtcblxuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIEJpZGlyZWN0aW9uYWxNZXJnZU1vZGUgPSAnc3VtJ3wnbXVsJ3wnY29uY2F0J3wnYXZlJztcbmV4cG9ydCBjb25zdCBWQUxJRF9CSURJUkVDVElPTkFMX01FUkdFX01PREVTID0gWydzdW0nLCAnbXVsJywgJ2NvbmNhdCcsICdhdmUnXTtcblxuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIFNhbXBsZVdlaWdodE1vZGUgPSAndGVtcG9yYWwnO1xuZXhwb3J0IGNvbnN0IFZBTElEX1NBTVBMRV9XRUlHSFRfTU9ERVMgPSBbJ3RlbXBvcmFsJ107XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Common functions for TensorFlow.js Layers.\n */\nimport { VALID_DATA_FORMAT_VALUES, VALID_INTERPOLATION_FORMAT_VALUES, VALID_PADDING_MODE_VALUES, VALID_POOL_MODE_VALUES } from './keras_format/common';\nimport { checkStringTypeUnionValue } from './utils/generic_utils';\n// A map from the requested scoped name of a Tensor to the number of Tensors\n// wanting that name so far.  This allows enforcing name uniqueness by appending\n// an incrementing index, e.g. scope/name, scope/name_1, scope/name_2, etc.\nconst nameMap = new Map();\nexport function checkDataFormat(value) {\n    checkStringTypeUnionValue(VALID_DATA_FORMAT_VALUES, 'DataFormat', value);\n}\nexport function checkInterpolationFormat(value) {\n    checkStringTypeUnionValue(VALID_INTERPOLATION_FORMAT_VALUES, 'InterpolationFormat', value);\n}\nexport function checkPaddingMode(value) {\n    checkStringTypeUnionValue(VALID_PADDING_MODE_VALUES, 'PaddingMode', value);\n}\nexport function checkPoolMode(value) {\n    checkStringTypeUnionValue(VALID_POOL_MODE_VALUES, 'PoolMode', value);\n}\nconst _nameScopeStack = [];\nconst _nameScopeDivider = '/';\n/**\n * Enter namescope, which can be nested.\n */\nexport function nameScope(name, fn) {\n    _nameScopeStack.push(name);\n    try {\n        const val = fn();\n        _nameScopeStack.pop();\n        return val;\n    }\n    catch (e) {\n        _nameScopeStack.pop();\n        throw e;\n    }\n}\n/**\n * Get the current namescope as a flat, concatenated string.\n */\nfunction currentNameScopePrefix() {\n    if (_nameScopeStack.length === 0) {\n        return '';\n    }\n    else {\n        return _nameScopeStack.join(_nameScopeDivider) + _nameScopeDivider;\n    }\n}\n/**\n * Get the name a Tensor (or Variable) would have if not uniqueified.\n * @param tensorName\n * @return Scoped name string.\n */\nexport function getScopedTensorName(tensorName) {\n    if (!isValidTensorName(tensorName)) {\n        throw new Error('Not a valid tensor name: \\'' + tensorName + '\\'');\n    }\n    return currentNameScopePrefix() + tensorName;\n}\n/**\n * Get unique names for Tensors and Variables.\n * @param scopedName The fully-qualified name of the Tensor, i.e. as produced by\n *  `getScopedTensorName()`.\n * @return A unique version of the given fully scoped name.\n *   If this is the first time that the scoped name is seen in this session,\n *   then the given `scopedName` is returned unaltered.  If the same name is\n *   seen again (producing a collision), an incrementing suffix is added to the\n *   end of the name, so it takes the form 'scope/name_1', 'scope/name_2', etc.\n */\nexport function getUniqueTensorName(scopedName) {\n    if (!isValidTensorName(scopedName)) {\n        throw new Error('Not a valid tensor name: \\'' + scopedName + '\\'');\n    }\n    if (!nameMap.has(scopedName)) {\n        nameMap.set(scopedName, 0);\n    }\n    const index = nameMap.get(scopedName);\n    nameMap.set(scopedName, nameMap.get(scopedName) + 1);\n    if (index > 0) {\n        const result = `${scopedName}_${index}`;\n        // Mark the composed name as used in case someone wants\n        // to call getUniqueTensorName(\"name_1\").\n        nameMap.set(result, 1);\n        return result;\n    }\n    else {\n        return scopedName;\n    }\n}\nconst tensorNameRegex = new RegExp(/^[A-Za-z0-9][-A-Za-z0-9\\._\\/]*$/);\n/**\n * Determine whether a string is a valid tensor name.\n * @param name\n * @returns A Boolean indicating whether `name` is a valid tensor name.\n */\nexport function isValidTensorName(name) {\n    return !!name.match(tensorNameRegex);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2NvbW1vbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBQ0gsT0FBTyxFQUFDLHdCQUF3QixFQUFFLGlDQUFpQyxFQUFFLHlCQUF5QixFQUFFLHNCQUFzQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckosT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFaEUsNEVBQTRFO0FBQzVFLGdGQUFnRjtBQUNoRiwyRUFBMkU7QUFDM0UsTUFBTSxPQUFPLEdBQXdCLElBQUksR0FBRyxFQUFrQixDQUFDO0FBRS9ELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBYztJQUM1Qyx5QkFBeUIsQ0FBQyx3QkFBd0IsRUFBRSxZQUFZLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDM0UsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFjO0lBQ3JELHlCQUF5QixDQUNyQixpQ0FBaUMsRUFBRSxxQkFBcUIsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLEtBQWM7SUFDN0MseUJBQXlCLENBQUMseUJBQXlCLEVBQUUsYUFBYSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUFDLEtBQWM7SUFDMUMseUJBQXlCLENBQUMsc0JBQXNCLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBYSxFQUFFLENBQUM7QUFDckMsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUM7QUFFOUI7O0dBRUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUFJLElBQVksRUFBRSxFQUFXO0lBQ3BELGVBQWUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsSUFBSTtRQUNGLE1BQU0sR0FBRyxHQUFNLEVBQUUsRUFBRSxDQUFDO1FBQ3BCLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QixPQUFPLEdBQUcsQ0FBQztLQUNaO0lBQUMsT0FBTyxDQUFDLEVBQUU7UUFDVixlQUFlLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxDQUFDLENBQUM7S0FDVDtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsc0JBQXNCO0lBQzdCLElBQUksZUFBZSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDaEMsT0FBTyxFQUFFLENBQUM7S0FDWDtTQUFNO1FBQ0wsT0FBTyxlQUFlLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsaUJBQWlCLENBQUM7S0FDcEU7QUFDSCxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxVQUFrQjtJQUNwRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDbEMsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsR0FBRyxVQUFVLEdBQUcsSUFBSSxDQUFDLENBQUM7S0FDcEU7SUFDRCxPQUFPLHNCQUFzQixFQUFFLEdBQUcsVUFBVSxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsVUFBa0I7SUFDcEQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFVBQVUsQ0FBQyxFQUFFO1FBQ2xDLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7UUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDNUI7SUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3RDLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxFQUFFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFckQsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1FBQ2IsTUFBTSxNQUFNLEdBQUcsR0FBRyxVQUFVLElBQUksS0FBSyxFQUFFLENBQUM7UUFDeEMsdURBQXVEO1FBQ3ZELHlDQUF5QztRQUN6QyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztRQUN2QixPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLFVBQVUsQ0FBQztLQUNuQjtBQUNILENBQUM7QUFFRCxNQUFNLGVBQWUsR0FBRyxJQUFJLE1BQU0sQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO0FBRXRFOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUMsSUFBWTtJQUM1QyxPQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIENvbW1vbiBmdW5jdGlvbnMgZm9yIFRlbnNvckZsb3cuanMgTGF5ZXJzLlxuICovXG5pbXBvcnQge1ZBTElEX0RBVEFfRk9STUFUX1ZBTFVFUywgVkFMSURfSU5URVJQT0xBVElPTl9GT1JNQVRfVkFMVUVTLCBWQUxJRF9QQURESU5HX01PREVfVkFMVUVTLCBWQUxJRF9QT09MX01PREVfVkFMVUVTfSBmcm9tICcuL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlfSBmcm9tICcuL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG4vLyBBIG1hcCBmcm9tIHRoZSByZXF1ZXN0ZWQgc2NvcGVkIG5hbWUgb2YgYSBUZW5zb3IgdG8gdGhlIG51bWJlciBvZiBUZW5zb3JzXG4vLyB3YW50aW5nIHRoYXQgbmFtZSBzbyBmYXIuICBUaGlzIGFsbG93cyBlbmZvcmNpbmcgbmFtZSB1bmlxdWVuZXNzIGJ5IGFwcGVuZGluZ1xuLy8gYW4gaW5jcmVtZW50aW5nIGluZGV4LCBlLmcuIHNjb3BlL25hbWUsIHNjb3BlL25hbWVfMSwgc2NvcGUvbmFtZV8yLCBldGMuXG5jb25zdCBuYW1lTWFwOiBNYXA8c3RyaW5nLCBudW1iZXI+ID0gbmV3IE1hcDxzdHJpbmcsIG51bWJlcj4oKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRGF0YUZvcm1hdCh2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX0RBVEFfRk9STUFUX1ZBTFVFUywgJ0RhdGFGb3JtYXQnLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0ludGVycG9sYXRpb25Gb3JtYXQodmFsdWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgY2hlY2tTdHJpbmdUeXBlVW5pb25WYWx1ZShcbiAgICAgIFZBTElEX0lOVEVSUE9MQVRJT05fRk9STUFUX1ZBTFVFUywgJ0ludGVycG9sYXRpb25Gb3JtYXQnLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1BhZGRpbmdNb2RlKHZhbHVlPzogc3RyaW5nKTogdm9pZCB7XG4gIGNoZWNrU3RyaW5nVHlwZVVuaW9uVmFsdWUoVkFMSURfUEFERElOR19NT0RFX1ZBTFVFUywgJ1BhZGRpbmdNb2RlJywgdmFsdWUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tQb29sTW9kZSh2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX1BPT0xfTU9ERV9WQUxVRVMsICdQb29sTW9kZScsIHZhbHVlKTtcbn1cblxuY29uc3QgX25hbWVTY29wZVN0YWNrOiBzdHJpbmdbXSA9IFtdO1xuY29uc3QgX25hbWVTY29wZURpdmlkZXIgPSAnLyc7XG5cbi8qKlxuICogRW50ZXIgbmFtZXNjb3BlLCB3aGljaCBjYW4gYmUgbmVzdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbmFtZVNjb3BlPFQ+KG5hbWU6IHN0cmluZywgZm46ICgpID0+IFQpOiBUIHtcbiAgX25hbWVTY29wZVN0YWNrLnB1c2gobmFtZSk7XG4gIHRyeSB7XG4gICAgY29uc3QgdmFsOiBUID0gZm4oKTtcbiAgICBfbmFtZVNjb3BlU3RhY2sucG9wKCk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIF9uYW1lU2NvcGVTdGFjay5wb3AoKTtcbiAgICB0aHJvdyBlO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50IG5hbWVzY29wZSBhcyBhIGZsYXQsIGNvbmNhdGVuYXRlZCBzdHJpbmcuXG4gKi9cbmZ1bmN0aW9uIGN1cnJlbnROYW1lU2NvcGVQcmVmaXgoKTogc3RyaW5nIHtcbiAgaWYgKF9uYW1lU2NvcGVTdGFjay5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gJyc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIF9uYW1lU2NvcGVTdGFjay5qb2luKF9uYW1lU2NvcGVEaXZpZGVyKSArIF9uYW1lU2NvcGVEaXZpZGVyO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBuYW1lIGEgVGVuc29yIChvciBWYXJpYWJsZSkgd291bGQgaGF2ZSBpZiBub3QgdW5pcXVlaWZpZWQuXG4gKiBAcGFyYW0gdGVuc29yTmFtZVxuICogQHJldHVybiBTY29wZWQgbmFtZSBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTY29wZWRUZW5zb3JOYW1lKHRlbnNvck5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmICghaXNWYWxpZFRlbnNvck5hbWUodGVuc29yTmFtZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ05vdCBhIHZhbGlkIHRlbnNvciBuYW1lOiBcXCcnICsgdGVuc29yTmFtZSArICdcXCcnKTtcbiAgfVxuICByZXR1cm4gY3VycmVudE5hbWVTY29wZVByZWZpeCgpICsgdGVuc29yTmFtZTtcbn1cblxuLyoqXG4gKiBHZXQgdW5pcXVlIG5hbWVzIGZvciBUZW5zb3JzIGFuZCBWYXJpYWJsZXMuXG4gKiBAcGFyYW0gc2NvcGVkTmFtZSBUaGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIFRlbnNvciwgaS5lLiBhcyBwcm9kdWNlZCBieVxuICogIGBnZXRTY29wZWRUZW5zb3JOYW1lKClgLlxuICogQHJldHVybiBBIHVuaXF1ZSB2ZXJzaW9uIG9mIHRoZSBnaXZlbiBmdWxseSBzY29wZWQgbmFtZS5cbiAqICAgSWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB0aGF0IHRoZSBzY29wZWQgbmFtZSBpcyBzZWVuIGluIHRoaXMgc2Vzc2lvbixcbiAqICAgdGhlbiB0aGUgZ2l2ZW4gYHNjb3BlZE5hbWVgIGlzIHJldHVybmVkIHVuYWx0ZXJlZC4gIElmIHRoZSBzYW1lIG5hbWUgaXNcbiAqICAgc2VlbiBhZ2FpbiAocHJvZHVjaW5nIGEgY29sbGlzaW9uKSwgYW4gaW5jcmVtZW50aW5nIHN1ZmZpeCBpcyBhZGRlZCB0byB0aGVcbiAqICAgZW5kIG9mIHRoZSBuYW1lLCBzbyBpdCB0YWtlcyB0aGUgZm9ybSAnc2NvcGUvbmFtZV8xJywgJ3Njb3BlL25hbWVfMicsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaXF1ZVRlbnNvck5hbWUoc2NvcGVkTmFtZTogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFpc1ZhbGlkVGVuc29yTmFtZShzY29wZWROYW1lKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignTm90IGEgdmFsaWQgdGVuc29yIG5hbWU6IFxcJycgKyBzY29wZWROYW1lICsgJ1xcJycpO1xuICB9XG4gIGlmICghbmFtZU1hcC5oYXMoc2NvcGVkTmFtZSkpIHtcbiAgICBuYW1lTWFwLnNldChzY29wZWROYW1lLCAwKTtcbiAgfVxuICBjb25zdCBpbmRleCA9IG5hbWVNYXAuZ2V0KHNjb3BlZE5hbWUpO1xuICBuYW1lTWFwLnNldChzY29wZWROYW1lLCBuYW1lTWFwLmdldChzY29wZWROYW1lKSArIDEpO1xuXG4gIGlmIChpbmRleCA+IDApIHtcbiAgICBjb25zdCByZXN1bHQgPSBgJHtzY29wZWROYW1lfV8ke2luZGV4fWA7XG4gICAgLy8gTWFyayB0aGUgY29tcG9zZWQgbmFtZSBhcyB1c2VkIGluIGNhc2Ugc29tZW9uZSB3YW50c1xuICAgIC8vIHRvIGNhbGwgZ2V0VW5pcXVlVGVuc29yTmFtZShcIm5hbWVfMVwiKS5cbiAgICBuYW1lTWFwLnNldChyZXN1bHQsIDEpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNjb3BlZE5hbWU7XG4gIH1cbn1cblxuY29uc3QgdGVuc29yTmFtZVJlZ2V4ID0gbmV3IFJlZ0V4cCgvXltBLVphLXowLTldWy1BLVphLXowLTlcXC5fXFwvXSokLyk7XG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzdHJpbmcgaXMgYSB2YWxpZCB0ZW5zb3IgbmFtZS5cbiAqIEBwYXJhbSBuYW1lXG4gKiBAcmV0dXJucyBBIEJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGBuYW1lYCBpcyBhIHZhbGlkIHRlbnNvciBuYW1lLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRlbnNvck5hbWUobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhIW5hbWUubWF0Y2godGVuc29yTmFtZVJlZ2V4KTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Math utility functions.\n *\n * This file contains some frequently used math function that operates on\n * number[] or Float32Array and return a number. Many of these functions are\n * not-so-thick wrappers around TF.js Core functions. But they offer the\n * convenience of\n * 1) not having to convert the inputs into Tensors,\n * 2) not having to convert the returned Tensors to numbers.\n */\nimport { ValueError } from '../errors';\n/**\n * Determine if a number is an integer.\n */\nexport function isInteger(x) {\n    return x === parseInt(x.toString(), 10);\n}\n/**\n * Calculate the product of an array of numbers.\n * @param array The array to calculate the product over.\n * @param begin Beginning index, inclusive.\n * @param end Ending index, exclusive.\n * @return The product.\n */\nexport function arrayProd(array, begin, end) {\n    if (begin == null) {\n        begin = 0;\n    }\n    if (end == null) {\n        end = array.length;\n    }\n    let prod = 1;\n    for (let i = begin; i < end; ++i) {\n        prod *= array[i];\n    }\n    return prod;\n}\n/**\n * Compute minimum value.\n * @param array\n * @return minimum value.\n */\nexport function min(array) {\n    // same behavior as tf.min()\n    if (array.length === 0) {\n        return Number.NaN;\n    }\n    let min = Number.POSITIVE_INFINITY;\n    for (let i = 0; i < array.length; i++) {\n        const value = array[i];\n        if (value < min) {\n            min = value;\n        }\n    }\n    return min;\n}\n/**\n * Compute maximum value.\n * @param array\n * @return maximum value\n */\nexport function max(array) {\n    // same behavior as tf.max()\n    if (array.length === 0) {\n        return Number.NaN;\n    }\n    let max = Number.NEGATIVE_INFINITY;\n    for (let i = 0; i < array.length; i++) {\n        const value = array[i];\n        if (value > max) {\n            max = value;\n        }\n    }\n    return max;\n}\n/**\n * Compute sum of array.\n * @param array\n * @return The sum.\n */\nexport function sum(array) {\n    let sum = 0;\n    for (let i = 0; i < array.length; i++) {\n        const value = array[i];\n        sum += value;\n    }\n    return sum;\n}\n/**\n * Compute mean of array.\n * @param array\n * @return The mean.\n */\nexport function mean(array) {\n    return sum(array) / array.length;\n}\n/**\n * Compute variance of array.\n * @param array\n * @return The variance.\n */\nexport function variance(array) {\n    const meanValue = mean(array);\n    const demeaned = array.map((value) => value - meanValue);\n    let sumSquare = 0;\n    for (let i = 0; i < demeaned.length; i++) {\n        const value = demeaned[i];\n        sumSquare += value * value;\n    }\n    return sumSquare / array.length;\n}\n/**\n * Compute median of array.\n * @param array\n * @return The median value.\n */\nexport function median(array) {\n    const arraySorted = array.slice().sort((a, b) => a - b);\n    const lowIdx = Math.floor((arraySorted.length - 1) / 2);\n    const highIdx = Math.ceil((arraySorted.length - 1) / 2);\n    if (lowIdx === highIdx) {\n        return arraySorted[lowIdx];\n    }\n    return (arraySorted[lowIdx] + arraySorted[highIdx]) / 2;\n}\n/**\n * Generate an array of integers in [begin, end).\n * @param begin Beginning integer, inclusive.\n * @param end Ending integer, exclusive.\n * @returns Range array.\n * @throws ValueError, iff `end` < `begin`.\n */\nexport function range(begin, end) {\n    if (end < begin) {\n        throw new ValueError(`end (${end}) < begin (${begin}) is forbidden.`);\n    }\n    const out = [];\n    for (let i = begin; i < end; ++i) {\n        out.push(i);\n    }\n    return out;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0aF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9tYXRoX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7Ozs7Ozs7OztHQVNHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUlyQzs7R0FFRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBUztJQUNqQyxPQUFPLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzFDLENBQUM7QUFFRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsU0FBUyxDQUNyQixLQUEwQixFQUFFLEtBQWMsRUFBRSxHQUFZO0lBQzFELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUNqQixLQUFLLEdBQUcsQ0FBQyxDQUFDO0tBQ1g7SUFDRCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDZixHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztLQUNwQjtJQUVELElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLEtBQUssSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDaEMsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNsQjtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQTRCO0lBQzlDLDRCQUE0QjtJQUM1QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sTUFBTSxDQUFDLEdBQUcsQ0FBQztLQUNuQjtJQUNELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQztJQUNu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TyxFQUFFO1FBQ3RCLE9BQU8sV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxLQUFLLENBQUMsS0FBYSxFQUFFLEdBQVc7SUFDOUMsSUFBSSxHQUFHLEdBQUcsS0FBSyxFQUFFO1FBQ2YsTUFBTSxJQUFJLFVBQVUsQ0FBQyxRQUFRLEdBQUcsY0FBYyxLQUFLLGlCQUFpQixDQUFDLENBQUM7S0FDdkU7SUFDRCxNQUFNLEdBQUcsR0FBYSxFQUFFLENBQUM7SUFDekIsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxHQUFHLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNoQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2I7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIE1hdGggdXRpbGl0eSBmdW5jdGlvbnMuXG4gKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgZnJlcXVlbnRseSB1c2VkIG1hdGggZnVuY3Rpb24gdGhhdCBvcGVyYXRlcyBvblxuICogbnVtYmVyW10gb3IgRmxvYXQzMkFycmF5IGFuZCByZXR1cm4gYSBudW1iZXIuIE1hbnkgb2YgdGhlc2UgZnVuY3Rpb25zIGFyZVxuICogbm90LXNvLXRoaWNrIHdyYXBwZXJzIGFyb3VuZCBURi5qcyBDb3JlIGZ1bmN0aW9ucy4gQnV0IHRoZXkgb2ZmZXIgdGhlXG4gKiBjb252ZW5pZW5jZSBvZlxuICogMSkgbm90IGhhdmluZyB0byBjb252ZXJ0IHRoZSBpbnB1dHMgaW50byBUZW5zb3JzLFxuICogMikgbm90IGhhdmluZyB0byBjb252ZXJ0IHRoZSByZXR1cm5lZCBUZW5zb3JzIHRvIG51bWJlcnMuXG4gKi9cblxuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuXG5leHBvcnQgdHlwZSBBcnJheVR5cGVzID0gVWludDhBcnJheXxJbnQzMkFycmF5fEZsb2F0MzJBcnJheTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgYSBudW1iZXIgaXMgYW4gaW50ZWdlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzSW50ZWdlcih4OiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIHggPT09IHBhcnNlSW50KHgudG9TdHJpbmcoKSwgMTApO1xufVxuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgcHJvZHVjdCBvZiBhbiBhcnJheSBvZiBudW1iZXJzLlxuICogQHBhcmFtIGFycmF5IFRoZSBhcnJheSB0byBjYWxjdWxhdGUgdGhlIHByb2R1Y3Qgb3Zlci5cbiAqIEBwYXJhbSBiZWdpbiBCZWdpbm5pbmcgaW5kZXgsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSBlbmQgRW5kaW5nIGluZGV4LCBleGNsdXNpdmUuXG4gKiBAcmV0dXJuIFRoZSBwcm9kdWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXJyYXlQcm9kKFxuICAgIGFycmF5OiBudW1iZXJbXXxBcnJheVR5cGVzLCBiZWdpbj86IG51bWJlciwgZW5kPzogbnVtYmVyKTogbnVtYmVyIHtcbiAgaWYgKGJlZ2luID09IG51bGwpIHtcbiAgICBiZWdpbiA9IDA7XG4gIH1cbiAgaWYgKGVuZCA9PSBudWxsKSB7XG4gICAgZW5kID0gYXJyYXkubGVuZ3RoO1xuICB9XG5cbiAgbGV0IHByb2QgPSAxO1xuICBmb3IgKGxldCBpID0gYmVnaW47IGkgPCBlbmQ7ICsraSkge1xuICAgIHByb2QgKj0gYXJyYXlbaV07XG4gIH1cbiAgcmV0dXJuIHByb2Q7XG59XG5cbi8qKlxuICogQ29tcHV0ZSBtaW5pbXVtIHZhbHVlLlxuICogQHBhcmFtIGFycmF5XG4gKiBAcmV0dXJuIG1pbmltdW0gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW4oYXJyYXk6IG51bWJlcltdfEZsb2F0MzJBcnJheSk6IG51bWJlciB7XG4gIC8vIHNhbWUgYmVoYXZpb3IgYXMgdGYubWluKClcbiAgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBOdW1iZXIuTmFOO1xuICB9XG4gIGxldCBtaW4gPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZSA9IGFycmF5W2ldO1xuICAgIGlmICh2YWx1ZSA8IG1pbikge1xuICAgICAgbWluID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiBtaW47XG59XG5cbi8qKlxuICogQ29tcHV0ZSBtYXhpbXVtIHZhbHVlLlxuICogQHBhcmFtIGFycmF5XG4gKiBAcmV0dXJuIG1heGltdW0gdmFsdWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heChhcnJheTogbnVtYmVyW118RmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgLy8gc2FtZSBiZWhhdmlvciBhcyB0Zi5tYXgoKVxuICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIE51bWJlci5OYU47XG4gIH1cbiAgbGV0IG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlID0gYXJyYXlbaV07XG4gICAgaWYgKHZhbHVlID4gbWF4KSB7XG4gICAgICBtYXggPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG1heDtcbn1cblxuLyoqXG4gKiBDb21wdXRlIHN1bSBvZiBhcnJheS5cbiAqIEBwYXJhbSBhcnJheVxuICogQHJldHVybiBUaGUgc3VtLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3VtKGFycmF5OiBudW1iZXJbXXxGbG9hdDMyQXJyYXkpOiBudW1iZXIge1xuICBsZXQgc3VtID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IHZhbHVlID0gYXJyYXlbaV07XG4gICAgc3VtICs9IHZhbHVlO1xuICB9XG4gIHJldHVybiBzdW07XG59XG5cbi8qKlxuICogQ29tcHV0ZSBtZWFuIG9mIGFycmF5LlxuICogQHBhcmFtIGFycmF5XG4gKiBAcmV0dXJuIFRoZSBtZWFuLlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVhbihhcnJheTogbnVtYmVyW118RmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgcmV0dXJuIHN1bShhcnJheSkgLyBhcnJheS5sZW5ndGg7XG59XG5cbi8qKlxuICogQ29tcHV0ZSB2YXJpYW5jZSBvZiBhcnJheS5cbiAqIEBwYXJhbSBhcnJheVxuICogQHJldHVybiBUaGUgdmFyaWFuY2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYW5jZShhcnJheTogbnVtYmVyW118RmxvYXQzMkFycmF5KTogbnVtYmVyIHtcbiAgY29uc3QgbWVhblZhbHVlID0gbWVhbihhcnJheSk7XG4gIGNvbnN0IGRlbWVhbmVkID0gYXJyYXkubWFwKCh2YWx1ZTogbnVtYmVyKSA9PiB2YWx1ZSAtIG1lYW5WYWx1ZSk7XG4gIGxldCBzdW1TcXVhcmUgPSAwO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbWVhbmVkLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmFsdWUgPSBkZW1lYW5lZFtpXTtcbiAgICBzdW1TcXVhcmUgKz0gdmFsdWUgKiB2YWx1ZTtcbiAgfVxuICByZXR1cm4gc3VtU3F1YXJlIC8gYXJyYXkubGVuZ3RoO1xufVxuXG4vKipcbiAqIENvbXB1dGUgbWVkaWFuIG9mIGFycmF5LlxuICogQHBhcmFtIGFycmF5XG4gKiBAcmV0dXJuIFRoZSBtZWRpYW4gdmFsdWUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtZWRpYW4oYXJyYXk6IG51bWJlcltdfEZsb2F0MzJBcnJheSk6IG51bWJlciB7XG4gIGNvbnN0IGFycmF5U29ydGVkID0gYXJyYXkuc2xpY2UoKS5zb3J0KChhLCBiKSA9PiBhIC0gYik7XG4gIGNvbnN0IGxvd0lkeCA9IE1hdGguZmxvb3IoKGFycmF5U29ydGVkLmxlbmd0aCAtIDEpIC8gMik7XG4gIGNvbnN0IGhpZ2hJZHggPSBNYXRoLmNlaWwoKGFycmF5U29ydGVkLmxlbmd0aCAtIDEpIC8gMik7XG4gIGlmIChsb3dJZHggPT09IGhpZ2hJZHgpIHtcbiAgICByZXR1cm4gYXJyYXlTb3J0ZWRbbG93SWR4XTtcbiAgfVxuICByZXR1cm4gKGFycmF5U29ydGVkW2xvd0lkeF0gKyBhcnJheVNvcnRlZFtoaWdoSWR4XSkgLyAyO1xufVxuXG4vKipcbiAqIEdlbmVyYXRlIGFuIGFycmF5IG9mIGludGVnZXJzIGluIFtiZWdpbiwgZW5kKS5cbiAqIEBwYXJhbSBiZWdpbiBCZWdpbm5pbmcgaW50ZWdlciwgaW5jbHVzaXZlLlxuICogQHBhcmFtIGVuZCBFbmRpbmcgaW50ZWdlciwgZXhjbHVzaXZlLlxuICogQHJldHVybnMgUmFuZ2UgYXJyYXkuXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3IsIGlmZiBgZW5kYCA8IGBiZWdpbmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5nZShiZWdpbjogbnVtYmVyLCBlbmQ6IG51bWJlcik6IG51bWJlcltdIHtcbiAgaWYgKGVuZCA8IGJlZ2luKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYGVuZCAoJHtlbmR9KSA8IGJlZ2luICgke2JlZ2lufSkgaXMgZm9yYmlkZGVuLmApO1xuICB9XG4gIGNvbnN0IG91dDogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IGJlZ2luOyBpIDwgZW5kOyArK2kpIHtcbiAgICBvdXQucHVzaChpKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { backend } from '@tensorflow/tfjs-core';\nlet _epsilon;\n/**\n * Returns the value of the fuzz factor used in numeric expressions.\n */\nexport function epsilon() {\n    if (_epsilon == null) {\n        _epsilon = backend().epsilon();\n    }\n    return _epsilon;\n}\n/**\n * Sets the value of the fuzz factor used in numeric expressions.\n * @param e New value of epsilon.\n */\nexport function setEpsilon(e) {\n    _epsilon = e;\n}\n/**\n * Returns the default image data format convention.\n */\nexport function imageDataFormat() {\n    return 'channelsLast';\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2JhY2tlbmQvY29tbW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzlDLElBQUksUUFBZ0IsQ0FBQztBQUVyQjs7R0FFRztBQUNILE1BQU0sVUFBVSxPQUFPO0lBQ3JCLElBQUksUUFBUSxJQUFJLElBQUksRUFBRTtRQUNwQixRQUFRLEdBQUcsT0FBTyxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7S0FDaEM7SUFDRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxDQUFTO0lBQ2xDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDZixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZUFBZTtJQUM3QixPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtEYXRhRm9ybWF0fSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcblxubGV0IF9lcHNpbG9uOiBudW1iZXI7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZ1enogZmFjdG9yIHVzZWQgaW4gbnVtZXJpYyBleHByZXNzaW9ucy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGVwc2lsb24oKSB7XG4gIGlmIChfZXBzaWxvbiA9PSBudWxsKSB7XG4gICAgX2Vwc2lsb24gPSBiYWNrZW5kKCkuZXBzaWxvbigpO1xuICB9XG4gIHJldHVybiBfZXBzaWxvbjtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZnV6eiBmYWN0b3IgdXNlZCBpbiBudW1lcmljIGV4cHJlc3Npb25zLlxuICogQHBhcmFtIGUgTmV3IHZhbHVlIG9mIGVwc2lsb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRFcHNpbG9uKGU6IG51bWJlcikge1xuICBfZXBzaWxvbiA9IGU7XG59XG5cbi8qKlxuICogUmV0dXJucyB0aGUgZGVmYXVsdCBpbWFnZSBkYXRhIGZvcm1hdCBjb252ZW50aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW1hZ2VEYXRhRm9ybWF0KCk6IERhdGFGb3JtYXQge1xuICByZXR1cm4gJ2NoYW5uZWxzTGFzdCc7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * deeplearn.js backend.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { onesLike as coreOnesLike, scalar, tensor1d, tidy, where, zerosLike as coreZerosLike } from '@tensorflow/tfjs-core';\nimport { checkDataFormat } from '../common';\nimport { NotImplementedError, ValueError } from '../errors';\nimport * as math_utils from '../utils/math_utils';\nimport { imageDataFormat } from './common';\n// tslint:enable\n/* Setting and getting backend from deeplearn.js. */\n// Default deeplearn.js backend is WebGL (GPU).\nlet backend = 'webgl';\nexport function setBackend(requestedBackend) {\n    tfc.setBackend(requestedBackend);\n    backend = requestedBackend;\n}\nexport function getBackend() {\n    return backend;\n}\n/**\n * Indicates whether the backend is operating symbolically.\n *\n * This function will be used to determine how to interpret user code. If\n * it returns true, calls to the backend construct a symbolic graph; if\n * it returns false, calls to the backend execute immediately.\n */\nexport function isBackendSymbolic() {\n    return false;\n}\n/**\n * Get the number of elements in a Tensor.\n * @param x The Tensor.\n * @return Number of elements in `x`.\n */\nexport function countParams(x) {\n    const shape = x.shape;\n    if (shape.length > 0) {\n        return shape.reduce((a, b) => a * b);\n    }\n    else {\n        // Scalar.\n        return 1;\n    }\n}\n/**\n * Casts a tensor to a different dtype and returns it.\n * @param x Input tensor.\n * @param dtype String: 'float32'|'int32'|'bool'.\n * @returns Tensor of the specified `dtype`.\n */\nexport function cast(x, dtype) {\n    return tfc.cast(x, dtype);\n}\n/**\n * Adds a 1-sized dimension at index \"axis\".\n * @param x Input tensor.\n * @param axis Position where to add the new axis.\n * @returns Result of the dimension expansion.\n */\nexport function expandDims(x, axis = -1) {\n    const outShape = x.shape.slice();\n    if (axis < 0) {\n        axis = outShape.length + axis + 1;\n    }\n    outShape.splice(axis, 0, 1);\n    return tfc.reshape(x, outShape);\n}\n/**\n * Repeats a 2D tensor.\n *\n * If `x` has shape `[samples, dim]` and `n` is 2, for example, the output\n * will have shape `[samples, 2, dim]`.\n *\n * @param x Input tensor.\n * @param n Integer, number of times to repeat.\n * @returns The result of the repeat operation.\n * @throws ValueError: If input tensor is not 2D.\n */\nexport function repeat(x, n) {\n    return tidy(() => {\n        if (x.shape.length !== 2) {\n            throw new ValueError(`repeat() expects a rank-2 tensor, but received a ` +\n                `rank-${x.shape.length} tensor.`);\n        }\n        const y = expandDims(x, 1);\n        return tile(y, [1, n, 1]);\n    });\n}\n/**\n * Flatten a Tensor into 1D.\n * @param x Input tensor.\n * @return The result of the flattening `x`.\n */\nexport function flatten(x) {\n    const newShape = [math_utils.arrayProd(x.shape)];\n    return tfc.reshape(x, newShape);\n}\n/**\n * Turn a nD tensor into a 2D tensor with same 0th dimension.\n * In other words, it flattens each data samples of a batch.\n *\n * @param x The tensor to flatten. The rank of this tensor is required to be 2\n *   or higher.\n * @return The result of the flattening.\n */\nexport function batchFlatten(x) {\n    if (x.rank <= 1) {\n        throw new ValueError(`batchFlatten requires a minimum rank of 2. Got rank: ${x.rank}.`);\n    }\n    const newShape = [x.shape[0], math_utils.arrayProd(x.shape, 1)];\n    return tfc.reshape(x, newShape);\n}\n/**\n * Do slicing along the first axis.\n * @param array input `tf.Tensor`.\n * @param start starting index, inclusive.\n * @param size size of the slice along the first axis.\n * @returns result of the slicing.\n * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n */\nexport function sliceAlongFirstAxis(array, start, size) {\n    return tidy(() => {\n        switch (array.rank) {\n            case 1:\n                return tfc.slice1d(array, start, size);\n            case 2:\n                return tfc.slice2d(array, [start, 0], [size, array.shape[1]]);\n            case 3:\n                return tfc.slice3d(array, [start, 0, 0], [size, array.shape[1], array.shape[2]]);\n            case 4:\n                return tfc.slice4d(array, [start, 0, 0, 0], [size, array.shape[1], array.shape[2], array.shape[3]]);\n            case 5:\n                return tfc.slice(array, [start, 0, 0, 0, 0], [\n                    size, array.shape[1], array.shape[2], array.shape[3], array.shape[4]\n                ]);\n            case 6:\n                return tfc.slice(array, [start, 0, 0, 0, 0, 0], [\n                    size, array.shape[1], array.shape[2], array.shape[3], array.shape[4],\n                    array.shape[5]\n                ]);\n            default:\n                throw new ValueError(`sliceAlongFirstAxis() received an unsupported tensor rank: ` +\n                    `${array.rank}`);\n        }\n    });\n}\n/**\n * Do slicing along the last axis.\n * @param array input `tf.Tensor`.\n * @param start starting index, inclusive.\n * @param size size of the slice along the last axis.\n * @returns result of the slicing.\n * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n */\nexport function sliceAlongLastAxis(array, start, size) {\n    return tidy(() => {\n        switch (array.rank) {\n            case 1:\n                return tfc.slice1d(array, start, size);\n            case 2:\n                return tfc.slice2d(array, [0, start], [array.shape[0], size]);\n            case 3:\n                return tfc.slice3d(array, [0, 0, start], [array.shape[0], array.shape[1], size]);\n            case 4:\n                return tfc.slice4d(array, [0, 0, 0, start], [array.shape[0], array.shape[1], array.shape[2], size]);\n            default:\n                throw new ValueError(`sliceAlongLastAxis() received an unsupported tensor rank: ` +\n                    `${array.rank}`);\n        }\n    });\n}\n/**\n * Do slicing along the sepcified axis.\n * @param array input `tf.Tensor`.\n * @param start starting index, inclusive.\n * @param size of the slice along the chosen axis.\n * @param choose an axis.\n * @returns result of the slicing.\n * @throws ValueError: If `array` is of an unsupported subtype of `tf.Tensor`.\n */\nexport function sliceAlongAxis(array, start, size, axis) {\n    return tidy(() => {\n        switch (array.rank) {\n            case 1:\n                return tfc.slice1d(array, start, size);\n            case 2:\n                switch (axis) {\n                    case 1:\n                        return sliceAlongFirstAxis(array, start, size);\n                    case 2:\n                        return sliceAlongLastAxis(array, start, size);\n                    default:\n                        throw new ValueError(`The axis is not within the rank of the tensor ` +\n                            `${axis}`);\n                }\n            case 3:\n                switch (axis) {\n                    case 1:\n                        return sliceAlongFirstAxis(array, start, size);\n                    case 2:\n                        return tfc.slice3d(array, [0, start, 0], [array.shape[0], size, array.shape[2]]);\n                    case 3:\n                        return sliceAlongLastAxis(array, start, size);\n                    default:\n                        throw new ValueError(`The axis is not within the rank of the tensor ` +\n                            `${axis}`);\n                }\n            case 4:\n                switch (axis) {\n                    case 1:\n                        return sliceAlongFirstAxis(array, start, size);\n                    case 2:\n                        return tfc.slice4d(array, [0, start, 0, 0], [array.shape[0], size, array.shape[2], array.shape[3]]);\n                    case 3:\n                        return tfc.slice4d(array, [0, 0, start, 0], [array.shape[0], array.shape[1], size, array.shape[3]]);\n                    case 4:\n                        return sliceAlongLastAxis(array, start, size);\n                    default:\n                        throw new ValueError(`The axis is not within the rank of the tensor ` +\n                            `${axis}`);\n                }\n            default:\n                throw new ValueError(`sliceAlongLastAxis() received an unsupported tensor rank: ` +\n                    `${array.rank}`);\n        }\n    });\n}\n/**\n * Concatenates a list of tensors alongside the specified axis.\n * @param tensors `Array` of tensors to concatenate.\n * @param axis Concatenation axis.\n * @returns The result of the concatenation.\n */\nexport function concatenate(tensors, axis = -1) {\n    let rank;\n    if (axis < 0) {\n        rank = tensors[0].rank;\n        if (rank !== 0) {\n            axis = rank;\n        }\n        else {\n            axis = 0;\n        }\n    }\n    if (axis === tensors[0].rank) {\n        // Porting Note: This is necessary because tfc.concat() requires axis to be\n        //   in the interval [-rank, rank).\n        axis = -1;\n    }\n    // Porting Note: Sparse concat is not supported yet.\n    return tfc.concat(tensors, axis);\n}\n/**\n * Concatenate two arrays along the first dimension.\n * @param a The 1st `tf.Tensor` to concatenate.\n * @param b The 2nd `tf.Tensor` to concatenate.\n * @returns Result of the concatenation.\n * @throws ValueError: If `a` is of an unsupported subtype of `tf.Tensor`.\n */\nexport function concatAlongFirstAxis(a, b) {\n    switch (a.rank) {\n        case 1:\n            return tfc.concat1d([a, b]);\n        case 2:\n            return tfc.concat2d([a, b], 0);\n        case 3:\n            return tfc.concat3d([a, b], 0);\n        case 4:\n            return tfc.concat4d([a, b], 0);\n        default:\n            throw new ValueError(`concatAlongFirstAxis() received an unsupported ` +\n                `tensor rank: ${a.rank}`);\n    }\n}\n/**\n * Creates a tensor by tiling `x` by `n`.\n * @param x A tensor.\n * @param n An Array of integers or a single integer. If an Array, the length\n *   must be the same as the number of dimensions in `x`. If a single integer,\n *   it will be treated as an Array of length 1.\n */\nexport function tile(x, n) {\n    if (!Array.isArray(n)) {\n        n = [n];\n    }\n    if (x.rank !== n.length) {\n        throw new ValueError(`The length of input n (${n.length}) does not match ` +\n            `the number of dimensions in input x (${x.rank})`);\n    }\n    return tfc.tile(x, n);\n}\n/* Creation of random tensors. */\n/**\n * Get a tensor with normal distribution of values.\n *\n * @param shape Shape of the tensor.\n * @param mean mean value of the normal distribution.\n * @param stddev standard deviation of the normal distribution.\n * @param dtype\n * @param seed\n * @return The normal tensor.\n */\nexport function randomNormal(shape, mean = 0.0, stddev = 1.0, dtype, seed) {\n    return tfc.randomNormal(shape, mean, stddev, dtype, seed);\n}\n/* Linear Algebra */\n/**\n * Multiply two tensors and returns the result as a tensor.\n *\n * For 2D tensors, this is equivalent to matrix multiplication (matMul).\n * For tensors of higher ranks, it follows the Theano behavior,\n * (e.g. `(2, 3) * (4, 3, 5) -> (2, 4, 5)`).  From the Theano documentation:\n *\n * For N dimensions it is a sum product over the last axis of x and the\n * second-to-last of y:\n *\n * @param a A tensor of at least rank 2.\n * @param b A tensor of at least rank 2.\n * @param activation (optional) A string identifying the activation\n *   function.\n * @return Result of the dot operation.\n */\nexport function dot(a, b, activation, bias) {\n    if ((a.rank < 2) || (b.rank < 2)) {\n        throw new NotImplementedError(`dot requires both inputs to be rank >= 2` +\n            ` but got x shape = ${a.shape} and y shape = ${b.shape}`);\n    }\n    if (b.rank >= 3) {\n        const xLastDim = a.shape.slice(-1)[0];\n        const ySecondLastDim = b.shape.slice(-2)[0];\n        if (xLastDim !== ySecondLastDim) {\n            throw new NotImplementedError(`If rank y >= 3, then the second last dim` +\n                ` of y must equal the last dim of x but got x shape = ${a.shape} and ` +\n                ` y shape = ${b.shape}`);\n        }\n    }\n    // Handle basic 2D x 2D case.\n    if ((a.rank === 2) && (b.rank === 2)) {\n        const transposeA = false;\n        const transposeB = false;\n        // tfc.fused.matMul only fuses certain activation functions. Unsupported\n        // activation functions are treated as 'linear' activations, which is\n        // equivalent to a no-op.\n        return tfc.fused.matMul({\n            a,\n            b: b,\n            transposeA,\n            transposeB,\n            bias: bias ? reshapeBias(a.rank, bias, imageDataFormat()) : null,\n            activation\n        });\n    }\n    else {\n        // Reshape x into the analogous 2D Tensor.\n        const aFirstDims = a.shape.slice(); // Holds all but the last dim of x.\n        const aLastDim = aFirstDims.pop();\n        a = tfc.reshape(a, [-1, aLastDim]);\n        // Reshape y into the analogous 2D Tensor, and keep track of the\n        // required dimensions to reproduce the output shape.\n        const bShape = b.shape.slice();\n        const bLastDim = bShape.pop();\n        const ySecondLastDim = bShape.pop();\n        const yOtherDims = [...bShape, bLastDim];\n        // permutation should be like [r-2, 0, 1, 2, ... r-4, r-3, r-1]\n        // where r is the rank of y.\n        const perm = Array.from({ length: b.rank }, (_, i) => {\n            if (i === 0) {\n                return b.rank - 2;\n            }\n            else if (i <= b.rank - 2) {\n                return i - 1;\n            }\n            return i;\n        });\n        b = tfc.reshape(tfc.transpose(b, perm), [ySecondLastDim, -1]);\n        // Multiply x and y as 2D Tensors, and then reshape back to original.\n        const outputShape = [...aFirstDims, ...yOtherDims];\n        const transposeA = false;\n        const transposeB = false;\n        return tfc.reshape(tfc.fused.matMul({\n            a,\n            b,\n            transposeA,\n            transposeB,\n            bias: bias ? reshapeBias(a.rank, bias, imageDataFormat()) : null,\n            activation\n        }), outputShape);\n    }\n}\n/**\n * Compute the sign Tensor of an input Tensor.\n *\n * Elements of the input `tf.Tensor` that are === 0 are mapped to 0.\n * Elements of the input `tf.Tensor` that are > 0 are mapped to 1.\n * Elements of the input `tf.Tensor` that are < 0 are mapped to -1.\n *\n * @param x Input `tf.Tensor`.\n * @return The sign `tf.Tensor`.\n */\nexport function sign(x) {\n    // TODO(cais): Move to the core.\n    return tidy(() => {\n        const zerosLikeX = coreZerosLike(x);\n        const onesLikeX = coreOnesLike(x);\n        return where(tfc.equal(x, zerosLikeX), zerosLikeX, where(tfc.greater(x, coreZerosLike(x)), onesLikeX, tfc.mul(-1, onesLikeX)));\n    });\n}\n/**\n * Computes the one-hot representation of an integer tensor.\n * @param indices nD integer tensor of shape\n *   `(batch_size, dim1, dim2, ... dim(n-1))`\n * @param numClasses Integer, number of classes to consider.\n * @returns (n + 1)D one hot representation of the input\n *   with shape `(batch_size, dim1, dim2, ... dim(n-1), num_classes)`\n */\nexport function oneHot(indices, numClasses) {\n    return tidy(() => {\n        if (indices.rank !== 1) {\n            throw new Error('Only 1D one-hot tensors are supported in the ' +\n                'deeplearn backend, at present.');\n        }\n        indices = tfc.cast(indices, 'int32');\n        return tfc.cast(tfc.oneHot(indices, numClasses), 'float32');\n    });\n}\n/* Elementary math functions. */\n/**\n * Retrieves the elements of indices `indices` in the tensor `reference`.\n * @param reference A tensor.\n * @param indices An integer tensor of indices or an `Array` of integers.\n * @param axis Axis along which to perform the gather operation.\n * @returns The result of the gathering as a tensor.\n */\nexport function gather(reference, indices, axis) {\n    return tidy(() => {\n        if (Array.isArray(indices)) {\n            indices = tensor1d(indices, 'int32');\n        }\n        else {\n            indices = tfc.cast(indices, 'int32');\n        }\n        return tfc.gather(reference, indices, axis);\n    });\n}\n/**\n * Element-wise square.\n * @param x Input tensor.\n * @return element-wise x^2\n */\nexport function square(x) {\n    return tfc.mul(x, x);\n}\n/**\n * Element-wise exponentiation.\n *\n * Porting Note: In PyKeras, `a` (the exponent) is a Python integer, which\n *   takes advatnage of the backend's (e.g., TensorFlow's) automatic\n * conversion to tensor. Here we allow `a` to be either a number or a tensor.\n *\n * @param x The base tensor.\n * @param a The exponent, tensor or number. If a number, it is rounded to the\n *   nearest integer and converted to a tensor.\n * @returns A tensor of the same shape as `x`.\n */\nexport function pow(x, a) {\n    return tidy(() => {\n        if (typeof (a) === 'number') {\n            a = scalar(Math.round(a), 'int32');\n        }\n        if (a.dtype !== 'int32') {\n            throw new NotImplementedError(`Non-int32 dtype (${a.dtype}) is not supported by pow() yet`);\n        }\n        return tfc.pow(x, a);\n    });\n}\n/**\n * Reshapes bias tensor according to rank of x.\n */\nfunction reshapeBias(xRank, bias, dataFormat) {\n    const biasShape = bias.shape;\n    if (bias.rank !== 1 && bias.rank !== xRank) {\n        throw new ValueError(`Unexpected bias dimensions: ${bias.rank}` +\n            `; expected it to be 1 or ${xRank}`);\n    }\n    if (xRank === 5) {\n        if (dataFormat === 'channelsFirst') {\n            if (biasShape.length === 1) {\n                return tfc.reshape(bias, [1, biasShape[0], 1, 1, 1]);\n            }\n            else {\n                return tfc.reshape(bias, [1, biasShape[3], biasShape[0], biasShape[1], biasShape[2]]);\n            }\n        }\n        else if (dataFormat === 'channelsLast') {\n            if (biasShape.length === 1) {\n                return tfc.reshape(bias, [1, 1, 1, 1, biasShape[0]]);\n            }\n            else {\n                return tfc.reshape(bias, [1].concat(biasShape));\n            }\n        }\n    }\n    else if (xRank === 4) {\n        if (dataFormat === 'channelsFirst') {\n            if (biasShape.length === 1) {\n                return tfc.reshape(bias, [1, biasShape[0], 1, 1]);\n            }\n            else {\n                return tfc.reshape(bias, [1, biasShape[2], biasShape[0], biasShape[1]]);\n            }\n        }\n        else if (dataFormat === 'channelsLast') {\n            if (biasShape.length === 1) {\n                return tfc.reshape(bias, [1, 1, 1, biasShape[0]]);\n            }\n            else {\n                return tfc.reshape(bias, [1].concat(biasShape));\n            }\n        }\n    }\n    else if (xRank === 3) {\n        if (dataFormat === 'channelsFirst') {\n            if (biasShape.length === 1) {\n                return tfc.reshape(bias, [1, biasShape[0], 1]);\n            }\n            else {\n                return tfc.reshape(bias, [1, biasShape[1], biasShape[0]]);\n            }\n        }\n        else if (dataFormat === 'channelsLast') {\n            if (biasShape.length === 1) {\n                return tfc.reshape(bias, [1, 1, biasShape[0]]);\n            }\n            else {\n                return tfc.reshape(bias, [1].concat(biasShape));\n            }\n        }\n    }\n    else if (xRank < 3) {\n        return bias;\n    }\n    throw new ValueError(`Unsupported input rank by biasAdd: ${bias.rank}`);\n}\n/* Neural-network operations. */\n/**\n * Add a bias to a tensor.\n *\n * @param x The tensor to add the bias to.\n * @param bias The bias to add to `x`. Must be 1D or the same rank as `x`.\n * @return Result of the bias adding.\n * @throws ValueError: If the rank of `bias` is incorrect.\n */\nexport function biasAdd(x, bias, dataFormat) {\n    return tidy(() => {\n        if (dataFormat == null) {\n            dataFormat = imageDataFormat();\n        }\n        checkDataFormat(dataFormat);\n        return tfc.add(x, reshapeBias(x.rank, bias, dataFormat));\n    });\n}\n/**\n * Exponential linear unit (ELU).\n * @param x A tensor or variable to compute the activation function for.\n * @param alpha: A scalar, a scaling factor for the negative section.\n * @return Output of the ELU operation.\n */\nexport function elu(x, alpha = 1) {\n    // TODO(cais): Add support for alpha values other than 1.\n    if (alpha !== 1) {\n        throw new NotImplementedError(`Support for alpha values other than 1 (${alpha}) is not implemented ` +\n            `yet.`);\n    }\n    return tfc.elu(x);\n}\n/**\n * Softsign of a tensor.\n *\n * Defined as x / (abs(x) + 1), element-wise.\n *\n * @param x: Input.\n * @returns Output.\n */\nexport function softsign(x) {\n    return tidy(() => tfc.div(x, tfc.add(tfc.abs(x), 1)));\n}\n/**\n * Sets entries in `x` to zero at random, while scaling the entire tensor.\n *\n * @param x input tensor.\n * @param level fraction of the entries in the tensor that will be set to 0.\n * @param noiseShape shape of randomly generated keep/drop flags, must be\n *   broadcastable to the shape of `x`. Optional.\n * @param seed random seed to ensure determinism. Optional.\n * @returns Result of the dropout operation.\n */\nexport function dropout(x, level, noiseShape, seed) {\n    return tidy(() => tfc.dropout(x, level, noiseShape, seed));\n}\n/**\n * Element-wise, segment-wise linear approximation of sigmoid.\n *\n * Returns `0.` if `x < -2.5`, `1.` if `x > 2.5`.\n * In `-2.5 <= x <= 2.5`, returns `0.2 * x + 0.5`.\n *\n * @param x Input tensor.\n * @returns Output tensor.\n */\nexport function hardSigmoid(x) {\n    return tidy(() => {\n        const y = tfc.add(.5, tfc.mul(.2, x));\n        return tfc.clipByValue(y, 0, 1);\n    });\n}\n/**\n * Invoke `x` in the training phase, and `alt` otherwise.\n *\n * Porting Note: We do not create placeholder tensors for the `training`\n * boolean flag here, because there is no such thing in the TF.js imperative\n * backend.\n *\n * @param x The function to invoke iff `training` is `true`.\n * @param alt The function to invoke iff `training` is `false`.\n * @param training Boolean flag for whether training phase is active.\n * @returns The return value of `x()` if `training` is `true`, or the return\n *   value of `alt()` if `training` is `false`.\n */\nexport function inTrainPhase(x, alt, training = false) {\n    return training ? x() : alt();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGZqc19iYWNrZW5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2JhY2tlbmQvdGZqc19iYWNrZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxRQUFRLElBQUksWUFBWSxFQUFFLE1BQU0sRUFBb0IsUUFBUSxFQUEwQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFNBQVMsSUFBSSxhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNwTCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFDLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFHMUQsT0FBTyxLQUFLLFVBQVUsTUFBTSxxQkFBcUIsQ0FBQztBQUVsRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXpDLGdCQUFnQjtBQUVoQixvREFBb0Q7QUFFcEQsK0NBQStDO0FBQy9DLElBQUksT0FBTyxHQUFrQixPQUFPLENBQUM7QUFFckMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxnQkFBK0I7SUFDeEQsR0FBRyxDQUFDLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBQ2pDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQztBQUM3QixDQUFDO0FBRUQsTUFBTSxVQUFVLFVBQVU7SUFDeEIsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxpQkFBaUI7SUFDL0IsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBVztJQUNyQyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQ3RCLElB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R0FBRyxLQUFLO0lBQ3hFLE9BQU8sUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7QUFDaEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogZGVlcGxlYXJuLmpzIGJhY2tlbmQuXG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge29uZXNMaWtlIGFzIGNvcmVPbmVzTGlrZSwgc2NhbGFyLCBUZW5zb3IsIFRlbnNvcjFELCB0ZW5zb3IxZCwgVGVuc29yMkQsIFRlbnNvcjNELCBUZW5zb3I0RCwgVGVuc29yNUQsIHRpZHksIHdoZXJlLCB6ZXJvc0xpa2UgYXMgY29yZVplcm9zTGlrZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7Y2hlY2tEYXRhRm9ybWF0fSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0hhc1NoYXBlfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBtYXRoX3V0aWxzIGZyb20gJy4uL3V0aWxzL21hdGhfdXRpbHMnO1xuXG5pbXBvcnQge2ltYWdlRGF0YUZvcm1hdH0gZnJvbSAnLi9jb21tb24nO1xuXG4vLyB0c2xpbnQ6ZW5hYmxlXG5cbi8qIFNldHRpbmcgYW5kIGdldHRpbmcgYmFja2VuZCBmcm9tIGRlZXBsZWFybi5qcy4gKi9cblxuLy8gRGVmYXVsdCBkZWVwbGVhcm4uanMgYmFja2VuZCBpcyBXZWJHTCAoR1BVKS5cbmxldCBiYWNrZW5kOiAnY3B1J3wnd2ViZ2wnID0gJ3dlYmdsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNldEJhY2tlbmQocmVxdWVzdGVkQmFja2VuZDogJ2NwdSd8J3dlYmdsJykge1xuICB0ZmMuc2V0QmFja2VuZChyZXF1ZXN0ZWRCYWNrZW5kKTtcbiAgYmFja2VuZCA9IHJlcXVlc3RlZEJhY2tlbmQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCYWNrZW5kKCk6ICdjcHUnfCd3ZWJnbCcge1xuICByZXR1cm4gYmFja2VuZDtcbn1cblxuLyoqXG4gKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgYmFja2VuZCBpcyBvcGVyYXRpbmcgc3ltYm9saWNhbGx5LlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSBob3cgdG8gaW50ZXJwcmV0IHVzZXIgY29kZS4gSWZcbiAqIGl0IHJldHVybnMgdHJ1ZSwgY2FsbHMgdG8gdGhlIGJhY2tlbmQgY29uc3RydWN0IGEgc3ltYm9saWMgZ3JhcGg7IGlmXG4gKiBpdCByZXR1cm5zIGZhbHNlLCBjYWxscyB0byB0aGUgYmFja2VuZCBleGVjdXRlIGltbWVkaWF0ZWx5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNCYWNrZW5kU3ltYm9saWMoKTogYm9vbGVhbiB7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIFRlbnNvci5cbiAqIEBwYXJhbSB4IFRoZSBUZW5zb3IuXG4gKiBAcmV0dXJuIE51bWJlciBvZiBlbGVtZW50cyBpbiBgeGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb3VudFBhcmFtcyh4OiBIYXNTaGFwZSk6IG51bWJlciB7XG4gIGNvbnN0IHNoYXBlID0geC5zaGFwZTtcbiAgaWYgKHNoYXBlLmxlbmd0aCA+IDApIHtcbiAgICByZXR1cm4gc2hhcGUucmVkdWNlKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gYSAqIGIpO1xuICB9IGVsc2Uge1xuICAgIC8vIFNjYWxhci5cbiAgICByZXR1cm4gMTtcbiAgfVxufVxuXG4vKipcbiAqIENhc3RzIGEgdGVuc29yIHRvIGEgZGlmZmVyZW50IGR0eXBlIGFuZCByZXR1cm5zIGl0LlxuICogQHBhcmFtIHggSW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIFN0cmluZzogJ2Zsb2F0MzInfCdpbnQzMid8J2Jvb2wnLlxuICogQHJldHVybnMgVGVuc29yIG9mIHRoZSBzcGVjaWZpZWQgYGR0eXBlYC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhc3QoeDogVGVuc29yLCBkdHlwZTogdGZjLkRhdGFUeXBlKTogVGVuc29yIHtcbiAgcmV0dXJuIHRmYy5jYXN0KHgsIGR0eXBlKTtcbn1cblxuLyoqXG4gKiBBZGRzIGEgMS1zaXplZCBkaW1lbnNpb24gYXQgaW5kZXggXCJheGlzXCIuXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IuXG4gKiBAcGFyYW0gYXhpcyBQb3NpdGlvbiB3aGVyZSB0byBhZGQgdGhlIG5ldyBheGlzLlxuICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBkaW1lbnNpb24gZXhwYW5zaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kRGltcyh4OiBUZW5zb3IsIGF4aXMgPSAtMSk6IFRlbnNvciB7XG4gIGNvbnN0IG91dFNoYXBlID0geC5zaGFwZS5zbGljZSgpO1xuICBpZiAoYXhpcyA8IDApIHtcbiAgICBheGlzID0gb3V0U2hhcGUubGVuZ3RoICsgYXhpcyArIDE7XG4gIH1cbiAgb3V0U2hhcGUuc3BsaWNlKGF4aXMsIDAsIDEpO1xuICByZXR1cm4gdGZjLnJlc2hhcGUoeCwgb3V0U2hhcGUpO1xufVxuXG4vKipcbiAqIFJlcGVhdHMgYSAyRCB0ZW5zb3IuXG4gKlxuICogSWYgYHhgIGhhcyBzaGFwZSBgW3NhbXBsZXMsIGRpbV1gIGFuZCBgbmAgaXMgMiwgZm9yIGV4YW1wbGUsIHRoZSBvdXRwdXRcbiAqIHdpbGwgaGF2ZSBzaGFwZSBgW3NhbXBsZXMsIDIsIGRpbV1gLlxuICpcbiAqIEBwYXJhbSB4IElucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBuIEludGVnZXIsIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSByZXBlYXQgb3BlcmF0aW9uLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBpbnB1dCB0ZW5zb3IgaXMgbm90IDJELlxuICovXG5leHBvcnQgZnVuY3Rpb24gcmVwZWF0KHg6IFRlbnNvciwgbjogbnVtYmVyKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGlmICh4LnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYHJlcGVhdCgpIGV4cGVjdHMgYSByYW5rLTIgdGVuc29yLCBidXQgcmVjZWl2ZWQgYSBgICtcbiAgICAgICAgICBgcmFuay0ke3guc2hhcGUubGVuZ3RofSB0ZW5zb3IuYCk7XG4gICAgfVxuICAgIGNvbnN0IHkgPSBleHBhbmREaW1zKHgsIDEpO1xuICAgIHJldHVybiB0aWxlKHksIFsxLCBuLCAxXSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEZsYXR0ZW4gYSBUZW5zb3IgaW50byAxRC5cbiAqIEBwYXJhbSB4IElucHV0IHRlbnNvci5cbiAqIEByZXR1cm4gVGhlIHJlc3VsdCBvZiB0aGUgZmxhdHRlbmluZyBgeGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmbGF0dGVuKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gIGNvbnN0IG5ld1NoYXBlID0gW21hdGhfdXRpbHMuYXJyYXlQcm9kKHguc2hhcGUpXTtcbiAgcmV0dXJuIHRmYy5yZXNoYXBlKHgsIG5ld1NoYXBlKTtcbn1cblxuLyoqXG4gKiBUdXJuIGEgbkQgdGVuc29yIGludG8gYSAyRCB0ZW5zb3Igd2l0aCBzYW1lIDB0aCBkaW1lbnNpb24uXG4gKiBJbiBvdGhlciB3b3JkcywgaXQgZmxhdHRlbnMgZWFjaCBkYXRhIHNhbXBsZXMgb2YgYSBiYXRjaC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgdGVuc29yIHRvIGZsYXR0ZW4uIFRoZSByYW5rIG9mIHRoaXMgdGVuc29yIGlzIHJlcXVpcmVkIHRvIGJlIDJcbiAqICAgb3IgaGlnaGVyLlxuICogQHJldHVybiBUaGUgcmVzdWx0IG9mIHRoZSBmbGF0dGVuaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmF0Y2hGbGF0dGVuKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gIGlmICh4LnJhbmsgPD0gMSkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICBgYmF0Y2hGbGF0dGVuIHJlcXVpcmVzIGEgbWluaW11bSByYW5rIG9mIDIuIEdvdCByYW5rOiAke3gucmFua30uYCk7XG4gIH1cbiAgY29uc3QgbmV3U2hhcGUgPSBbeC5zaGFwZVswXSwgbWF0aF91dGlscy5hcnJheVByb2QoeC5zaGFwZSwgMSldO1xuICByZXR1cm4gdGZjLnJlc2hhcGUoeCwgbmV3U2hhcGUpO1xufVxuXG4vKipcbiAqIERvIHNsaWNpbmcgYWxvbmcgdGhlIGZpcnN0IGF4aXMuXG4gKiBAcGFyYW0gYXJyYXkgaW5wdXQgYHRmLlRlbnNvcmAuXG4gKiBAcGFyYW0gc3RhcnQgc3RhcnRpbmcgaW5kZXgsIGluY2x1c2l2ZS5cbiAqIEBwYXJhbSBzaXplIHNpemUgb2YgdGhlIHNsaWNlIGFsb25nIHRoZSBmaXJzdCBheGlzLlxuICogQHJldHVybnMgcmVzdWx0IG9mIHRoZSBzbGljaW5nLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBgYXJyYXlgIGlzIG9mIGFuIHVuc3VwcG9ydGVkIHN1YnR5cGUgb2YgYHRmLlRlbnNvcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZUFsb25nRmlyc3RBeGlzKFxuICAgIGFycmF5OiBUZW5zb3IsIHN0YXJ0OiBudW1iZXIsIHNpemU6IG51bWJlcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBzd2l0Y2ggKGFycmF5LnJhbmspIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZTFkKGFycmF5IGFzIFRlbnNvcjFELCBzdGFydCwgc2l6ZSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2UyZChcbiAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjJELCBbc3RhcnQsIDBdLCBbc2l6ZSwgYXJyYXkuc2hhcGVbMV1dKTtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZTNkKFxuICAgICAgICAgICAgYXJyYXkgYXMgVGVuc29yM0QsIFtzdGFydCwgMCwgMF0sXG4gICAgICAgICAgICBbc2l6ZSwgYXJyYXkuc2hhcGVbMV0sIGFycmF5LnNoYXBlWzJdXSk7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2U0ZChcbiAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjRELCBbc3RhcnQsIDAsIDAsIDBdLFxuICAgICAgICAgICAgW3NpemUsIGFycmF5LnNoYXBlWzFdLCBhcnJheS5zaGFwZVsyXSwgYXJyYXkuc2hhcGVbM11dKTtcbiAgICAgIGNhc2UgNTpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZShhcnJheSBhcyBUZW5zb3I1RCwgW3N0YXJ0LCAwLCAwLCAwLCAwXSwgW1xuICAgICAgICAgIHNpemUsIGFycmF5LnNoYXBlWzFdLCBhcnJheS5zaGFwZVsyXSwgYXJyYXkuc2hhcGVbM10sIGFycmF5LnNoYXBlWzRdXG4gICAgICAgIF0pO1xuICAgICAgY2FzZSA2OlxuICAgICAgICByZXR1cm4gdGZjLnNsaWNlKGFycmF5LCBbc3RhcnQsIDAsIDAsIDAsIDAsIDBdLCBbXG4gICAgICAgICAgc2l6ZSwgYXJyYXkuc2hhcGVbMV0sIGFycmF5LnNoYXBlWzJdLCBhcnJheS5zaGFwZVszXSwgYXJyYXkuc2hhcGVbNF0sXG4gICAgICAgICAgYXJyYXkuc2hhcGVbNV1cbiAgICAgICAgXSk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBzbGljZUFsb25nRmlyc3RBeGlzKCkgcmVjZWl2ZWQgYW4gdW5zdXBwb3J0ZWQgdGVuc29yIHJhbms6IGAgK1xuICAgICAgICAgICAgYCR7YXJyYXkucmFua31gKTtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIERvIHNsaWNpbmcgYWxvbmcgdGhlIGxhc3QgYXhpcy5cbiAqIEBwYXJhbSBhcnJheSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqIEBwYXJhbSBzdGFydCBzdGFydGluZyBpbmRleCwgaW5jbHVzaXZlLlxuICogQHBhcmFtIHNpemUgc2l6ZSBvZiB0aGUgc2xpY2UgYWxvbmcgdGhlIGxhc3QgYXhpcy5cbiAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgc2xpY2luZy5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSWYgYGFycmF5YCBpcyBvZiBhbiB1bnN1cHBvcnRlZCBzdWJ0eXBlIG9mIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VBbG9uZ0xhc3RBeGlzKFxuICAgIGFycmF5OiBUZW5zb3IsIHN0YXJ0OiBudW1iZXIsIHNpemU6IG51bWJlcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBzd2l0Y2ggKGFycmF5LnJhbmspIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZTFkKGFycmF5IGFzIFRlbnNvcjFELCBzdGFydCwgc2l6ZSk7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2UyZChcbiAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjJELCBbMCwgc3RhcnRdLCBbYXJyYXkuc2hhcGVbMF0sIHNpemVdKTtcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgcmV0dXJuIHRmYy5zbGljZTNkKFxuICAgICAgICAgICAgYXJyYXkgYXMgVGVuc29yM0QsIFswLCAwLCBzdGFydF0sXG4gICAgICAgICAgICBbYXJyYXkuc2hhcGVbMF0sIGFycmF5LnNoYXBlWzFdLCBzaXplXSk7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2U0ZChcbiAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjRELCBbMCwgMCwgMCwgc3RhcnRdLFxuICAgICAgICAgICAgW2FycmF5LnNoYXBlWzBdLCBhcnJheS5zaGFwZVsxXSwgYXJyYXkuc2hhcGVbMl0sIHNpemVdKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYHNsaWNlQWxvbmdMYXN0QXhpcygpIHJlY2VpdmVkIGFuIHVuc3VwcG9ydGVkIHRlbnNvciByYW5rOiBgICtcbiAgICAgICAgICAgIGAke2FycmF5LnJhbmt9YCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBEbyBzbGljaW5nIGFsb25nIHRoZSBzZXBjaWZpZWQgYXhpcy5cbiAqIEBwYXJhbSBhcnJheSBpbnB1dCBgdGYuVGVuc29yYC5cbiAqIEBwYXJhbSBzdGFydCBzdGFydGluZyBpbmRleCwgaW5jbHVzaXZlLlxuICogQHBhcmFtIHNpemUgb2YgdGhlIHNsaWNlIGFsb25nIHRoZSBjaG9zZW4gYXhpcy5cbiAqIEBwYXJhbSBjaG9vc2UgYW4gYXhpcy5cbiAqIEByZXR1cm5zIHJlc3VsdCBvZiB0aGUgc2xpY2luZy5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSWYgYGFycmF5YCBpcyBvZiBhbiB1bnN1cHBvcnRlZCBzdWJ0eXBlIG9mIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2xpY2VBbG9uZ0F4aXMoXG4gICAgYXJyYXk6IFRlbnNvciwgc3RhcnQ6IG51bWJlciwgc2l6ZTogbnVtYmVyLCBheGlzOiBudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgc3dpdGNoIChhcnJheS5yYW5rKSB7XG4gICAgICBjYXNlIDE6XG4gICAgICAgIHJldHVybiB0ZmMuc2xpY2UxZChhcnJheSBhcyBUZW5zb3IxRCwgc3RhcnQsIHNpemUpO1xuICAgICAgY2FzZSAyOlxuICAgICAgICBzd2l0Y2ggKGF4aXMpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhhcnJheSwgc3RhcnQsIHNpemUpO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiBzbGljZUFsb25nTGFzdEF4aXMoYXJyYXksIHN0YXJ0LCBzaXplKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSBheGlzIGlzIG5vdCB3aXRoaW4gdGhlIHJhbmsgb2YgdGhlIHRlbnNvciBgICtcbiAgICAgICAgICAgICAgICBgJHtheGlzfWApO1xuICAgICAgICB9XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHN3aXRjaCAoYXhpcykge1xuICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgIHJldHVybiBzbGljZUFsb25nRmlyc3RBeGlzKGFycmF5LCBzdGFydCwgc2l6ZSk7XG4gICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgcmV0dXJuIHRmYy5zbGljZTNkKFxuICAgICAgICAgICAgICAgIGFycmF5IGFzIFRlbnNvcjNELCBbMCwgc3RhcnQsIDBdLFxuICAgICAgICAgICAgICAgIFthcnJheS5zaGFwZVswXSwgc2l6ZSwgYXJyYXkuc2hhcGVbMl1dKTtcbiAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICByZXR1cm4gc2xpY2VBbG9uZ0xhc3RBeGlzKGFycmF5LCBzdGFydCwgc2l6ZSk7XG4gICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgYXhpcyBpcyBub3Qgd2l0aGluIHRoZSByYW5rIG9mIHRoZSB0ZW5zb3IgYCArXG4gICAgICAgICAgICAgICAgYCR7YXhpc31gKTtcbiAgICAgICAgfVxuICAgICAgY2FzZSA0OlxuICAgICAgICBzd2l0Y2ggKGF4aXMpIHtcbiAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICByZXR1cm4gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhhcnJheSwgc3RhcnQsIHNpemUpO1xuICAgICAgICAgIGNhc2UgMjpcbiAgICAgICAgICAgIHJldHVybiB0ZmMuc2xpY2U0ZChcbiAgICAgICAgICAgICAgICBhcnJheSBhcyBUZW5zb3I0RCwgWzAsIHN0YXJ0LCAwLCAwXSxcbiAgICAgICAgICAgICAgICBbYXJyYXkuc2hhcGVbMF0sIHNpemUsIGFycmF5LnNoYXBlWzJdLCBhcnJheS5zaGFwZVszXV0pO1xuICAgICAgICAgIGNhc2UgMzpcbiAgICAgICAgICAgIHJldHVybiB0ZmMuc2xpY2U0ZChcbiAgICAgICAgICAgICAgICBhcnJheSBhcyBUZW5zb3I0RCwgWzAsIDAsIHN0YXJ0LCAwXSxcbiAgICAgICAgICAgICAgICBbYXJyYXkuc2hhcGVbMF0sIGFycmF5LnNoYXBlWzFdLCBzaXplLCBhcnJheS5zaGFwZVszXV0pO1xuICAgICAgICAgIGNhc2UgNDpcbiAgICAgICAgICAgIHJldHVybiBzbGljZUFsb25nTGFzdEF4aXMoYXJyYXksIHN0YXJ0LCBzaXplKTtcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICAgYFRoZSBheGlzIGlzIG5vdCB3aXRoaW4gdGhlIHJhbmsgb2YgdGhlIHRlbnNvciBgICtcbiAgICAgICAgICAgICAgICBgJHtheGlzfWApO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBzbGljZUFsb25nTGFzdEF4aXMoKSByZWNlaXZlZCBhbiB1bnN1cHBvcnRlZCB0ZW5zb3IgcmFuazogYCArXG4gICAgICAgICAgICBgJHthcnJheS5yYW5rfWApO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiB0ZW5zb3JzIGFsb25nc2lkZSB0aGUgc3BlY2lmaWVkIGF4aXMuXG4gKiBAcGFyYW0gdGVuc29ycyBgQXJyYXlgIG9mIHRlbnNvcnMgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcGFyYW0gYXhpcyBDb25jYXRlbmF0aW9uIGF4aXMuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBjb25jYXRlbmF0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0ZW5hdGUodGVuc29yczogVGVuc29yW10sIGF4aXMgPSAtMSk6IFRlbnNvciB7XG4gIGxldCByYW5rOiBudW1iZXI7XG4gIGlmIChheGlzIDwgMCkge1xuICAgIHJhbmsgPSB0ZW5zb3JzWzBdLnJhbms7XG4gICAgaWYgKHJhbmsgIT09IDApIHtcbiAgICAgIGF4aXMgPSByYW5rO1xuICAgIH0gZWxzZSB7XG4gICAgICBheGlzID0gMDtcbiAgICB9XG4gIH1cbiAgaWYgKGF4aXMgPT09IHRlbnNvcnNbMF0ucmFuaykge1xuICAgIC8vIFBvcnRpbmcgTm90ZTogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0ZmMuY29uY2F0KCkgcmVxdWlyZXMgYXhpcyB0byBiZVxuICAgIC8vICAgaW4gdGhlIGludGVydmFsIFstcmFuaywgcmFuaykuXG4gICAgYXhpcyA9IC0xO1xuICB9XG4gIC8vIFBvcnRpbmcgTm90ZTogU3BhcnNlIGNvbmNhdCBpcyBub3Qgc3VwcG9ydGVkIHlldC5cbiAgcmV0dXJuIHRmYy5jb25jYXQodGVuc29ycywgYXhpcyk7XG59XG5cbi8qKlxuICogQ29uY2F0ZW5hdGUgdHdvIGFycmF5cyBhbG9uZyB0aGUgZmlyc3QgZGltZW5zaW9uLlxuICogQHBhcmFtIGEgVGhlIDFzdCBgdGYuVGVuc29yYCB0byBjb25jYXRlbmF0ZS5cbiAqIEBwYXJhbSBiIFRoZSAybmQgYHRmLlRlbnNvcmAgdG8gY29uY2F0ZW5hdGUuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIGNvbmNhdGVuYXRpb24uXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIGBhYCBpcyBvZiBhbiB1bnN1cHBvcnRlZCBzdWJ0eXBlIG9mIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0QWxvbmdGaXJzdEF4aXMoYTogVGVuc29yLCBiOiBUZW5zb3IpOiBUZW5zb3Ige1xuICBzd2l0Y2ggKGEucmFuaykge1xuICAgIGNhc2UgMTpcbiAgICAgIHJldHVybiB0ZmMuY29uY2F0MWQoW2EgYXMgVGVuc29yMUQsIGIgYXMgVGVuc29yMURdKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gdGZjLmNvbmNhdDJkKFthIGFzIFRlbnNvcjJELCBiIGFzIFRlbnNvcjJEXSwgMCk7XG4gICAgY2FzZSAzOlxuICAgICAgcmV0dXJuIHRmYy5jb25jYXQzZChbYSBhcyBUZW5zb3IzRCwgYiBhcyBUZW5zb3IzRF0sIDApO1xuICAgIGNhc2UgNDpcbiAgICAgIHJldHVybiB0ZmMuY29uY2F0NGQoW2EgYXMgVGVuc29yNEQsIGIgYXMgVGVuc29yNERdLCAwKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYGNvbmNhdEFsb25nRmlyc3RBeGlzKCkgcmVjZWl2ZWQgYW4gdW5zdXBwb3J0ZWQgYCArXG4gICAgICAgICAgYHRlbnNvciByYW5rOiAke2EucmFua31gKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSB0ZW5zb3IgYnkgdGlsaW5nIGB4YCBieSBgbmAuXG4gKiBAcGFyYW0geCBBIHRlbnNvci5cbiAqIEBwYXJhbSBuIEFuIEFycmF5IG9mIGludGVnZXJzIG9yIGEgc2luZ2xlIGludGVnZXIuIElmIGFuIEFycmF5LCB0aGUgbGVuZ3RoXG4gKiAgIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIGB4YC4gSWYgYSBzaW5nbGUgaW50ZWdlcixcbiAqICAgaXQgd2lsbCBiZSB0cmVhdGVkIGFzIGFuIEFycmF5IG9mIGxlbmd0aCAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGlsZSh4OiBUZW5zb3IsIG46IG51bWJlcnxudW1iZXJbXSk6IFRlbnNvciB7XG4gIGlmICghQXJyYXkuaXNBcnJheShuKSkge1xuICAgIG4gPSBbbl07XG4gIH1cbiAgaWYgKHgucmFuayAhPT0gbi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYFRoZSBsZW5ndGggb2YgaW5wdXQgbiAoJHtuLmxlbmd0aH0pIGRvZXMgbm90IG1hdGNoIGAgK1xuICAgICAgICBgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIGluIGlucHV0IHggKCR7eC5yYW5rfSlgKTtcbiAgfVxuICByZXR1cm4gdGZjLnRpbGUoeCwgbik7XG59XG5cbi8qIENyZWF0aW9uIG9mIHJhbmRvbSB0ZW5zb3JzLiAqL1xuXG4vKipcbiAqIEdldCBhIHRlbnNvciB3aXRoIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgdmFsdWVzLlxuICpcbiAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIG1lYW4gbWVhbiB2YWx1ZSBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBzdGRkZXYgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIGR0eXBlXG4gKiBAcGFyYW0gc2VlZFxuICogQHJldHVybiBUaGUgbm9ybWFsIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbU5vcm1hbChcbiAgICBzaGFwZTogU2hhcGUsIG1lYW4gPSAwLjAsIHN0ZGRldiA9IDEuMCwgZHR5cGU/OiAnZmxvYXQzMid8J2ludDMyJyxcbiAgICBzZWVkPzogbnVtYmVyKTogVGVuc29yIHtcbiAgcmV0dXJuIHRmYy5yYW5kb21Ob3JtYWwoc2hhcGUsIG1lYW4sIHN0ZGRldiwgZHR5cGUsIHNlZWQpO1xufVxuXG4vKiBMaW5lYXIgQWxnZWJyYSAqL1xuXG4vKipcbiAqIE11bHRpcGx5IHR3byB0ZW5zb3JzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSB0ZW5zb3IuXG4gKlxuICogRm9yIDJEIHRlbnNvcnMsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBtYXRyaXggbXVsdGlwbGljYXRpb24gKG1hdE11bCkuXG4gKiBGb3IgdGVuc29ycyBvZiBoaWdoZXIgcmFua3MsIGl0IGZvbGxvd3MgdGhlIFRoZWFubyBiZWhhdmlvcixcbiAqIChlLmcuIGAoMiwgMykgKiAoNCwgMywgNSkgLT4gKDIsIDQsIDUpYCkuICBGcm9tIHRoZSBUaGVhbm8gZG9jdW1lbnRhdGlvbjpcbiAqXG4gKiBGb3IgTiBkaW1lbnNpb25zIGl0IGlzIGEgc3VtIHByb2R1Y3Qgb3ZlciB0aGUgbGFzdCBheGlzIG9mIHggYW5kIHRoZVxuICogc2Vjb25kLXRvLWxhc3Qgb2YgeTpcbiAqXG4gKiBAcGFyYW0gYSBBIHRlbnNvciBvZiBhdCBsZWFzdCByYW5rIDIuXG4gKiBAcGFyYW0gYiBBIHRlbnNvciBvZiBhdCBsZWFzdCByYW5rIDIuXG4gKiBAcGFyYW0gYWN0aXZhdGlvbiAob3B0aW9uYWwpIEEgc3RyaW5nIGlkZW50aWZ5aW5nIHRoZSBhY3RpdmF0aW9uXG4gKiAgIGZ1bmN0aW9uLlxuICogQHJldHVybiBSZXN1bHQgb2YgdGhlIGRvdCBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3QoXG4gICAgYTogVGVuc29yLCBiOiBUZW5zb3IsIGFjdGl2YXRpb24/OiB0ZmMuZnVzZWQuQWN0aXZhdGlvbixcbiAgICBiaWFzPzogVGVuc29yKTogVGVuc29yIHtcbiAgaWYgKChhLnJhbmsgPCAyKSB8fCAoYi5yYW5rIDwgMikpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgYGRvdCByZXF1aXJlcyBib3RoIGlucHV0cyB0byBiZSByYW5rID49IDJgICtcbiAgICAgICAgYCBidXQgZ290IHggc2hhcGUgPSAke2Euc2hhcGV9IGFuZCB5IHNoYXBlID0gJHtiLnNoYXBlfWApO1xuICB9XG4gIGlmIChiLnJhbmsgPj0gMykge1xuICAgIGNvbnN0IHhMYXN0RGltID0gYS5zaGFwZS5zbGljZSgtMSlbMF07XG4gICAgY29uc3QgeVNlY29uZExhc3REaW0gPSBiLnNoYXBlLnNsaWNlKC0yKVswXTtcbiAgICBpZiAoeExhc3REaW0gIT09IHlTZWNvbmRMYXN0RGltKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICBgSWYgcmFuayB5ID49IDMsIHRoZW4gdGhlIHNlY29uZCBsYXN0IGRpbWAgK1xuICAgICAgICAgIGAgb2YgeSBtdXN0IGVxdWFsIHRoZSBsYXN0IGRpbSBvZiB4IGJ1dCBnb3QgeCBzaGFwZSA9ICR7XG4gICAgICAgICAgICAgIGEuc2hhcGV9IGFuZCBgICtcbiAgICAgICAgICBgIHkgc2hhcGUgPSAke2Iuc2hhcGV9YCk7XG4gICAgfVxuICB9XG4gIC8vIEhhbmRsZSBiYXNpYyAyRCB4IDJEIGNhc2UuXG4gIGlmICgoYS5yYW5rID09PSAyKSAmJiAoYi5yYW5rID09PSAyKSkge1xuICAgIGNvbnN0IHRyYW5zcG9zZUEgPSBmYWxzZTtcbiAgICBjb25zdCB0cmFuc3Bvc2VCID0gZmFsc2U7XG4gICAgLy8gdGZjLmZ1c2VkLm1hdE11bCBvbmx5IGZ1c2VzIGNlcnRhaW4gYWN0aXZhdGlvbiBmdW5jdGlvbnMuIFVuc3VwcG9ydGVkXG4gICAgLy8gYWN0aXZhdGlvbiBmdW5jdGlvbnMgYXJlIHRyZWF0ZWQgYXMgJ2xpbmVhcicgYWN0aXZhdGlvbnMsIHdoaWNoIGlzXG4gICAgLy8gZXF1aXZhbGVudCB0byBhIG5vLW9wLlxuICAgIHJldHVybiB0ZmMuZnVzZWQubWF0TXVsKHtcbiAgICAgIGEsXG4gICAgICBiOiBiIGFzIFRlbnNvcjJELFxuICAgICAgdHJhbnNwb3NlQSxcbiAgICAgIHRyYW5zcG9zZUIsXG4gICAgICBiaWFzOiBiaWFzID8gcmVzaGFwZUJpYXMoYS5yYW5rLCBiaWFzLCBpbWFnZURhdGFGb3JtYXQoKSkgOiBudWxsLFxuICAgICAgYWN0aXZhdGlvblxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIC8vIFJlc2hhcGUgeCBpbnRvIHRoZSBhbmFsb2dvdXMgMkQgVGVuc29yLlxuICAgIGNvbnN0IGFGaXJzdERpbXMgPSBhLnNoYXBlLnNsaWNlKCk7ICAvLyBIb2xkcyBhbGwgYnV0IHRoZSBsYXN0IGRpbSBvZiB4LlxuICAgIGNvbnN0IGFMYXN0RGltID0gYUZpcnN0RGltcy5wb3AoKTtcbiAgICBhID0gdGZjLnJlc2hhcGUoYSwgWy0xLCBhTGFzdERpbV0pO1xuXG4gICAgLy8gUmVzaGFwZSB5IGludG8gdGhlIGFuYWxvZ291cyAyRCBUZW5zb3IsIGFuZCBrZWVwIHRyYWNrIG9mIHRoZVxuICAgIC8vIHJlcXVpcmVkIGRpbWVuc2lvbnMgdG8gcmVwcm9kdWNlIHRoZSBvdXRwdXQgc2hhcGUuXG4gICAgY29uc3QgYlNoYXBlID0gYi5zaGFwZS5zbGljZSgpO1xuICAgIGNvbnN0IGJMYXN0RGltID0gYlNoYXBlLnBvcCgpO1xuICAgIGNvbnN0IHlTZWNvbmRMYXN0RGltID0gYlNoYXBlLnBvcCgpO1xuICAgIGNvbnN0IHlPdGhlckRpbXMgPSBbLi4uYlNoYXBlLCBiTGFzdERpbV07XG4gICAgLy8gcGVybXV0YXRpb24gc2hvdWxkIGJlIGxpa2UgW3ItMiwgMCwgMSwgMiwgLi4uIHItNCwgci0zLCByLTFdXG4gICAgLy8gd2hlcmUgciBpcyB0aGUgcmFuayBvZiB5LlxuICAgIGNvbnN0IHBlcm0gPSBBcnJheS5mcm9tKHtsZW5ndGg6IGIucmFua30sIChfLCBpKSA9PiB7XG4gICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICByZXR1cm4gYi5yYW5rIC0gMjtcbiAgICAgIH0gZWxzZSBpZiAoaSA8PSBiLnJhbmsgLSAyKSB7XG4gICAgICAgIHJldHVybiBpIC0gMTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBpO1xuICAgIH0pO1xuICAgIGIgPSB0ZmMucmVzaGFwZSh0ZmMudHJhbnNwb3NlKGIsIHBlcm0pLCBbeVNlY29uZExhc3REaW0sIC0xXSk7XG5cbiAgICAvLyBNdWx0aXBseSB4IGFuZCB5IGFzIDJEIFRlbnNvcnMsIGFuZCB0aGVuIHJlc2hhcGUgYmFjayB0byBvcmlnaW5hbC5cbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IFsuLi5hRmlyc3REaW1zLCAuLi55T3RoZXJEaW1zXTtcbiAgICBjb25zdCB0cmFuc3Bvc2VBID0gZmFsc2U7XG4gICAgY29uc3QgdHJhbnNwb3NlQiA9IGZhbHNlO1xuICAgIHJldHVybiB0ZmMucmVzaGFwZShcbiAgICAgICAgdGZjLmZ1c2VkLm1hdE11bCh7XG4gICAgICAgICAgYSxcbiAgICAgICAgICBiLFxuICAgICAgICAgIHRyYW5zcG9zZUEsXG4gICAgICAgICAgdHJhbnNwb3NlQixcbiAgICAgICAgICBiaWFzOiBiaWFzID8gcmVzaGFwZUJpYXMoYS5yYW5rLCBiaWFzLCBpbWFnZURhdGFGb3JtYXQoKSkgOiBudWxsLFxuICAgICAgICAgIGFjdGl2YXRpb25cbiAgICAgICAgfSksXG4gICAgICAgIG91dHB1dFNoYXBlKTtcbiAgfVxufVxuXG4vKipcbiAqIENvbXB1dGUgdGhlIHNpZ24gVGVuc29yIG9mIGFuIGlucHV0IFRlbnNvci5cbiAqXG4gKiBFbGVtZW50cyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgdGhhdCBhcmUgPT09IDAgYXJlIG1hcHBlZCB0byAwLlxuICogRWxlbWVudHMgb2YgdGhlIGlucHV0IGB0Zi5UZW5zb3JgIHRoYXQgYXJlID4gMCBhcmUgbWFwcGVkIHRvIDEuXG4gKiBFbGVtZW50cyBvZiB0aGUgaW5wdXQgYHRmLlRlbnNvcmAgdGhhdCBhcmUgPCAwIGFyZSBtYXBwZWQgdG8gLTEuXG4gKlxuICogQHBhcmFtIHggSW5wdXQgYHRmLlRlbnNvcmAuXG4gKiBAcmV0dXJuIFRoZSBzaWduIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2lnbih4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAvLyBUT0RPKGNhaXMpOiBNb3ZlIHRvIHRoZSBjb3JlLlxuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgemVyb3NMaWtlWCA9IGNvcmVaZXJvc0xpa2UoeCk7XG4gICAgY29uc3Qgb25lc0xpa2VYID0gY29yZU9uZXNMaWtlKHgpO1xuICAgIHJldHVybiB3aGVyZShcbiAgICAgICAgdGZjLmVxdWFsKHgsIHplcm9zTGlrZVgpLCB6ZXJvc0xpa2VYLFxuICAgICAgICB3aGVyZShcbiAgICAgICAgICAgIHRmYy5ncmVhdGVyKHgsIGNvcmVaZXJvc0xpa2UoeCkpLCBvbmVzTGlrZVgsXG4gICAgICAgICAgICB0ZmMubXVsKC0xLCBvbmVzTGlrZVgpKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBvbmUtaG90IHJlcHJlc2VudGF0aW9uIG9mIGFuIGludGVnZXIgdGVuc29yLlxuICogQHBhcmFtIGluZGljZXMgbkQgaW50ZWdlciB0ZW5zb3Igb2Ygc2hhcGVcbiAqICAgYChiYXRjaF9zaXplLCBkaW0xLCBkaW0yLCAuLi4gZGltKG4tMSkpYFxuICogQHBhcmFtIG51bUNsYXNzZXMgSW50ZWdlciwgbnVtYmVyIG9mIGNsYXNzZXMgdG8gY29uc2lkZXIuXG4gKiBAcmV0dXJucyAobiArIDEpRCBvbmUgaG90IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnB1dFxuICogICB3aXRoIHNoYXBlIGAoYmF0Y2hfc2l6ZSwgZGltMSwgZGltMiwgLi4uIGRpbShuLTEpLCBudW1fY2xhc3NlcylgXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVIb3QoaW5kaWNlczogVGVuc29yLCBudW1DbGFzc2VzOiBudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKGluZGljZXMucmFuayAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdPbmx5IDFEIG9uZS1ob3QgdGVuc29ycyBhcmUgc3VwcG9ydGVkIGluIHRoZSAnICtcbiAgICAgICAgICAnZGVlcGxlYXJuIGJhY2tlbmQsIGF0IHByZXNlbnQuJyk7XG4gICAgfVxuICAgIGluZGljZXMgPSB0ZmMuY2FzdChpbmRpY2VzLCAnaW50MzInKTtcbiAgICByZXR1cm4gdGZjLmNhc3QodGZjLm9uZUhvdChpbmRpY2VzIGFzIFRlbnNvcjFELCBudW1DbGFzc2VzKSwgJ2Zsb2F0MzInKTtcbiAgfSk7XG59XG5cbi8qIEVsZW1lbnRhcnkgbWF0aCBmdW5jdGlvbnMuICovXG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBlbGVtZW50cyBvZiBpbmRpY2VzIGBpbmRpY2VzYCBpbiB0aGUgdGVuc29yIGByZWZlcmVuY2VgLlxuICogQHBhcmFtIHJlZmVyZW5jZSBBIHRlbnNvci5cbiAqIEBwYXJhbSBpbmRpY2VzIEFuIGludGVnZXIgdGVuc29yIG9mIGluZGljZXMgb3IgYW4gYEFycmF5YCBvZiBpbnRlZ2Vycy5cbiAqIEBwYXJhbSBheGlzIEF4aXMgYWxvbmcgd2hpY2ggdG8gcGVyZm9ybSB0aGUgZ2F0aGVyIG9wZXJhdGlvbi5cbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIGdhdGhlcmluZyBhcyBhIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlcihcbiAgICByZWZlcmVuY2U6IFRlbnNvciwgaW5kaWNlczogbnVtYmVyW118VGVuc29yMUQsIGF4aXM/OiBudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaW5kaWNlcykpIHtcbiAgICAgIGluZGljZXMgPSB0ZW5zb3IxZChpbmRpY2VzLCAnaW50MzInKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5kaWNlcyA9IHRmYy5jYXN0KGluZGljZXMsICdpbnQzMicpO1xuICAgIH1cbiAgICByZXR1cm4gdGZjLmdhdGhlcihyZWZlcmVuY2UsIGluZGljZXMsIGF4aXMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBFbGVtZW50LXdpc2Ugc3F1YXJlLlxuICogQHBhcmFtIHggSW5wdXQgdGVuc29yLlxuICogQHJldHVybiBlbGVtZW50LXdpc2UgeF4yXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmUoeDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRmYy5tdWwoeCwgeCk7XG59XG5cbi8qKlxuICogRWxlbWVudC13aXNlIGV4cG9uZW50aWF0aW9uLlxuICpcbiAqIFBvcnRpbmcgTm90ZTogSW4gUHlLZXJhcywgYGFgICh0aGUgZXhwb25lbnQpIGlzIGEgUHl0aG9uIGludGVnZXIsIHdoaWNoXG4gKiAgIHRha2VzIGFkdmF0bmFnZSBvZiB0aGUgYmFja2VuZCdzIChlLmcuLCBUZW5zb3JGbG93J3MpIGF1dG9tYXRpY1xuICogY29udmVyc2lvbiB0byB0ZW5zb3IuIEhlcmUgd2UgYWxsb3cgYGFgIHRvIGJlIGVpdGhlciBhIG51bWJlciBvciBhIHRlbnNvci5cbiAqXG4gKiBAcGFyYW0geCBUaGUgYmFzZSB0ZW5zb3IuXG4gKiBAcGFyYW0gYSBUaGUgZXhwb25lbnQsIHRlbnNvciBvciBudW1iZXIuIElmIGEgbnVtYmVyLCBpdCBpcyByb3VuZGVkIHRvIHRoZVxuICogICBuZWFyZXN0IGludGVnZXIgYW5kIGNvbnZlcnRlZCB0byBhIHRlbnNvci5cbiAqIEByZXR1cm5zIEEgdGVuc29yIG9mIHRoZSBzYW1lIHNoYXBlIGFzIGB4YC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBvdyh4OiBUZW5zb3IsIGE6IFRlbnNvcnxudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiAoYSkgPT09ICdudW1iZXInKSB7XG4gICAgICBhID0gc2NhbGFyKE1hdGgucm91bmQoYSksICdpbnQzMicpO1xuICAgIH1cbiAgICBpZiAoYS5kdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgYE5vbi1pbnQzMiBkdHlwZSAoJHthLmR0eXBlfSkgaXMgbm90IHN1cHBvcnRlZCBieSBwb3coKSB5ZXRgKTtcbiAgICB9XG4gICAgcmV0dXJuIHRmYy5wb3coeCwgYSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIFJlc2hhcGVzIGJpYXMgdGVuc29yIGFjY29yZGluZyB0byByYW5rIG9mIHguXG4gKi9cbmZ1bmN0aW9uIHJlc2hhcGVCaWFzKHhSYW5rOiBudW1iZXIsIGJpYXM6IFRlbnNvciwgZGF0YUZvcm1hdDogc3RyaW5nKSB7XG4gIGNvbnN0IGJpYXNTaGFwZSA9IGJpYXMuc2hhcGU7XG5cbiAgaWYgKGJpYXMucmFuayAhPT0gMSAmJiBiaWFzLnJhbmsgIT09IHhSYW5rKSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgIGBVbmV4cGVjdGVkIGJpYXMgZGltZW5zaW9uczogJHtiaWFzLnJhbmt9YCArXG4gICAgICAgIGA7IGV4cGVjdGVkIGl0IHRvIGJlIDEgb3IgJHt4UmFua31gKTtcbiAgfVxuXG4gIGlmICh4UmFuayA9PT0gNSkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIGlmIChiaWFzU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZmMucmVzaGFwZShiaWFzLCBbMSwgYmlhc1NoYXBlWzBdLCAxLCAxLCAxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUoXG4gICAgICAgICAgICBiaWFzLCBbMSwgYmlhc1NoYXBlWzNdLCBiaWFzU2hhcGVbMF0sIGJpYXNTaGFwZVsxXSwgYmlhc1NoYXBlWzJdXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgaWYgKGJpYXNTaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKGJpYXMsIFsxLCAxLCAxLCAxLCBiaWFzU2hhcGVbMF1dKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZmMucmVzaGFwZShiaWFzLCBbMV0uY29uY2F0KGJpYXNTaGFwZSkpO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIGlmICh4UmFuayA9PT0gNCkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIGlmIChiaWFzU2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiB0ZmMucmVzaGFwZShiaWFzLCBbMSwgYmlhc1NoYXBlWzBdLCAxLCAxXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUoYmlhcywgWzEsIGJpYXNTaGFwZVsyXSwgYmlhc1NoYXBlWzBdLCBiaWFzU2hhcGVbMV1dKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICBpZiAoYmlhc1NoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUoYmlhcywgWzEsIDEsIDEsIGJpYXNTaGFwZVswXV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKGJpYXMsIFsxXS5jb25jYXQoYmlhc1NoYXBlKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHhSYW5rID09PSAzKSB7XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgaWYgKGJpYXNTaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKGJpYXMsIFsxLCBiaWFzU2hhcGVbMF0sIDFdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZmMucmVzaGFwZShiaWFzLCBbMSwgYmlhc1NoYXBlWzFdLCBiaWFzU2hhcGVbMF1dKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICBpZiAoYmlhc1NoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUoYmlhcywgWzEsIDEsIGJpYXNTaGFwZVswXV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKGJpYXMsIFsxXS5jb25jYXQoYmlhc1NoYXBlKSk7XG4gICAgICB9XG4gICAgfVxuICB9IGVsc2UgaWYgKHhSYW5rIDwgMykge1xuICAgIHJldHVybiBiaWFzO1xuICB9XG4gIHRocm93IG5ldyBWYWx1ZUVycm9yKGBVbnN1cHBvcnRlZCBpbnB1dCByYW5rIGJ5IGJpYXNBZGQ6ICR7Ymlhcy5yYW5rfWApO1xufVxuXG4vKiBOZXVyYWwtbmV0d29yayBvcGVyYXRpb25zLiAqL1xuXG4vKipcbiAqIEFkZCBhIGJpYXMgdG8gYSB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHggVGhlIHRlbnNvciB0byBhZGQgdGhlIGJpYXMgdG8uXG4gKiBAcGFyYW0gYmlhcyBUaGUgYmlhcyB0byBhZGQgdG8gYHhgLiBNdXN0IGJlIDFEIG9yIHRoZSBzYW1lIHJhbmsgYXMgYHhgLlxuICogQHJldHVybiBSZXN1bHQgb2YgdGhlIGJpYXMgYWRkaW5nLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiB0aGUgcmFuayBvZiBgYmlhc2AgaXMgaW5jb3JyZWN0LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmlhc0FkZChcbiAgICB4OiBUZW5zb3IsIGJpYXM6IFRlbnNvciwgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKGRhdGFGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgZGF0YUZvcm1hdCA9IGltYWdlRGF0YUZvcm1hdCgpO1xuICAgIH1cbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG5cbiAgICByZXR1cm4gdGZjLmFkZCh4LCByZXNoYXBlQmlhcyh4LnJhbmssIGJpYXMsIGRhdGFGb3JtYXQpKTtcbiAgfSk7XG59XG5cbi8qKlxuICogRXhwb25lbnRpYWwgbGluZWFyIHVuaXQgKEVMVSkuXG4gKiBAcGFyYW0geCBBIHRlbnNvciBvciB2YXJpYWJsZSB0byBjb21wdXRlIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uIGZvci5cbiAqIEBwYXJhbSBhbHBoYTogQSBzY2FsYXIsIGEgc2NhbGluZyBmYWN0b3IgZm9yIHRoZSBuZWdhdGl2ZSBzZWN0aW9uLlxuICogQHJldHVybiBPdXRwdXQgb2YgdGhlIEVMVSBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbHUoeDogVGVuc29yLCBhbHBoYSA9IDEpOiBUZW5zb3Ige1xuICAvLyBUT0RPKGNhaXMpOiBBZGQgc3VwcG9ydCBmb3IgYWxwaGEgdmFsdWVzIG90aGVyIHRoYW4gMS5cbiAgaWYgKGFscGhhICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgIGBTdXBwb3J0IGZvciBhbHBoYSB2YWx1ZXMgb3RoZXIgdGhhbiAxICgke2FscGhhfSkgaXMgbm90IGltcGxlbWVudGVkIGAgK1xuICAgICAgICBgeWV0LmApO1xuICB9XG4gIHJldHVybiB0ZmMuZWx1KHgpO1xufVxuXG4vKipcbiAqIFNvZnRzaWduIG9mIGEgdGVuc29yLlxuICpcbiAqIERlZmluZWQgYXMgeCAvIChhYnMoeCkgKyAxKSwgZWxlbWVudC13aXNlLlxuICpcbiAqIEBwYXJhbSB4OiBJbnB1dC5cbiAqIEByZXR1cm5zIE91dHB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNvZnRzaWduKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHRmYy5kaXYoeCwgdGZjLmFkZCh0ZmMuYWJzKHgpLCAxKSkpO1xufVxuXG4vKipcbiAqIFNldHMgZW50cmllcyBpbiBgeGAgdG8gemVybyBhdCByYW5kb20sIHdoaWxlIHNjYWxpbmcgdGhlIGVudGlyZSB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHggaW5wdXQgdGVuc29yLlxuICogQHBhcmFtIGxldmVsIGZyYWN0aW9uIG9mIHRoZSBlbnRyaWVzIGluIHRoZSB0ZW5zb3IgdGhhdCB3aWxsIGJlIHNldCB0byAwLlxuICogQHBhcmFtIG5vaXNlU2hhcGUgc2hhcGUgb2YgcmFuZG9tbHkgZ2VuZXJhdGVkIGtlZXAvZHJvcCBmbGFncywgbXVzdCBiZVxuICogICBicm9hZGNhc3RhYmxlIHRvIHRoZSBzaGFwZSBvZiBgeGAuIE9wdGlvbmFsLlxuICogQHBhcmFtIHNlZWQgcmFuZG9tIHNlZWQgdG8gZW5zdXJlIGRldGVybWluaXNtLiBPcHRpb25hbC5cbiAqIEByZXR1cm5zIFJlc3VsdCBvZiB0aGUgZHJvcG91dCBvcGVyYXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkcm9wb3V0KFxuICAgIHg6IFRlbnNvciwgbGV2ZWw6IG51bWJlciwgbm9pc2VTaGFwZT86IG51bWJlcltdLCBzZWVkPzogbnVtYmVyKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4gdGZjLmRyb3BvdXQoeCwgbGV2ZWwsIG5vaXNlU2hhcGUsIHNlZWQpKTtcbn1cblxuLyoqXG4gKiBFbGVtZW50LXdpc2UsIHNlZ21lbnQtd2lzZSBsaW5lYXIgYXBwcm94aW1hdGlvbiBvZiBzaWdtb2lkLlxuICpcbiAqIFJldHVybnMgYDAuYCBpZiBgeCA8IC0yLjVgLCBgMS5gIGlmIGB4ID4gMi41YC5cbiAqIEluIGAtMi41IDw9IHggPD0gMi41YCwgcmV0dXJucyBgMC4yICogeCArIDAuNWAuXG4gKlxuICogQHBhcmFtIHggSW5wdXQgdGVuc29yLlxuICogQHJldHVybnMgT3V0cHV0IHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGhhcmRTaWdtb2lkKHg6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCB5ID0gdGZjLmFkZCguNSwgdGZjLm11bCguMiwgeCkpO1xuICAgIHJldHVybiB0ZmMuY2xpcEJ5VmFsdWUoeSwgMCwgMSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIEludm9rZSBgeGAgaW4gdGhlIHRyYWluaW5nIHBoYXNlLCBhbmQgYGFsdGAgb3RoZXJ3aXNlLlxuICpcbiAqIFBvcnRpbmcgTm90ZTogV2UgZG8gbm90IGNyZWF0ZSBwbGFjZWhvbGRlciB0ZW5zb3JzIGZvciB0aGUgYHRyYWluaW5nYFxuICogYm9vbGVhbiBmbGFnIGhlcmUsIGJlY2F1c2UgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBpbiB0aGUgVEYuanMgaW1wZXJhdGl2ZVxuICogYmFja2VuZC5cbiAqXG4gKiBAcGFyYW0geCBUaGUgZnVuY3Rpb24gdG8gaW52b2tlIGlmZiBgdHJhaW5pbmdgIGlzIGB0cnVlYC5cbiAqIEBwYXJhbSBhbHQgVGhlIGZ1bmN0aW9uIHRvIGludm9rZSBpZmYgYHRyYWluaW5nYCBpcyBgZmFsc2VgLlxuICogQHBhcmFtIHRyYWluaW5nIEJvb2xlYW4gZmxhZyBmb3Igd2hldGhlciB0cmFpbmluZyBwaGFzZSBpcyBhY3RpdmUuXG4gKiBAcmV0dXJucyBUaGUgcmV0dXJuIHZhbHVlIG9mIGB4KClgIGlmIGB0cmFpbmluZ2AgaXMgYHRydWVgLCBvciB0aGUgcmV0dXJuXG4gKiAgIHZhbHVlIG9mIGBhbHQoKWAgaWYgYHRyYWluaW5nYCBpcyBgZmFsc2VgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5UcmFpblBoYXNlPFQ+KHg6ICgpID0+IFQsIGFsdDogKCkgPT4gVCwgdHJhaW5pbmcgPSBmYWxzZSk6IFQge1xuICByZXR1cm4gdHJhaW5pbmcgPyB4KCkgOiBhbHQoKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nexport const VALID_FAN_MODE_VALUES = ['fanIn', 'fanOut', 'fanAvg'];\nexport const VALID_DISTRIBUTION_VALUES = ['normal', 'uniform', 'truncatedNormal'];\n// We can't easily extract a string[] from the string union type, but we can\n// recapitulate the list, enforcing at compile time that the values are valid\n// and that we have the right number of them.\n/**\n * A string array of valid Initializer class names.\n *\n * This is guaranteed to match the `InitializerClassName` union type.\n */\nexport const initializerClassNames = [\n    'Zeros', 'Ones', 'Constant', 'RandomNormal', 'RandomUniform',\n    'TruncatedNormal', 'VarianceScaling', 'Orthogonal', 'Identity'\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXJfY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2tlcmFzX2Zvcm1hdC9pbml0aWFsaXplcl9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFRSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7QUFPbkUsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQ2xDLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBNEU3Qyw0RUFBNEU7QUFDNUUsNkVBQTZFO0FBQzdFLDZDQUE2QztBQUU3Qzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0scUJBQXFCLEdBQTJCO0lBQzNELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxlQUFlO0lBQzVELGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxVQUFVO0NBQy9ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Jhc2VTZXJpYWxpemF0aW9ufSBmcm9tICcuL3R5cGVzJztcblxuLy8gVE9ETyhzb2VyZ2VsKTogTW92ZSB0aGUgQ2FtZWxDYXNlIHZlcnNpb25zIGJhY2sgb3V0IG9mIGtlcmFzX2Zvcm1hdFxuLy8gZS5nLiB0byBzcmMvY29tbW9uLnRzLiAgTWF5YmUgZXZlbiBkdXBsaWNhdGUgKmFsbCogb2YgdGhlc2UgdG8gYmUgcGVkYW50aWM/XG4vKiogQGRvY2lubGluZSAqL1xuZXhwb3J0IHR5cGUgRmFuTW9kZSA9ICdmYW5Jbid8J2Zhbk91dCd8J2ZhbkF2Zyc7XG5leHBvcnQgY29uc3QgVkFMSURfRkFOX01PREVfVkFMVUVTID0gWydmYW5JbicsICdmYW5PdXQnLCAnZmFuQXZnJ107XG5cbi8vIFRoZXNlIGNvbnN0YW50cyBoYXZlIGEgc25ha2UgdnMuIGNhbWVsIGRpc3RpbmN0aW9uLlxuZXhwb3J0IHR5cGUgRmFuTW9kZVNlcmlhbGl6YXRpb24gPSAnZmFuX2luJ3wnZmFuX291dCd8J2Zhbl9hdmcnO1xuXG4vKiogQGRvY2lubGluZSAqL1xuZXhwb3J0IHR5cGUgRGlzdHJpYnV0aW9uID0gJ25vcm1hbCd8J3VuaWZvcm0nfCd0cnVuY2F0ZWROb3JtYWwnO1xuZXhwb3J0IGNvbnN0IFZBTElEX0RJU1RSSUJVVElPTl9WQUxVRVMgPVxuICAgIFsnbm9ybWFsJywgJ3VuaWZvcm0nLCAndHJ1bmNhdGVkTm9ybWFsJ107XG4vLyBUaGVzZSBjb25zdGFudHMgaGF2ZSBhIHNuYWtlIHZzLiBjYW1lbCBkaXN0aW5jdGlvbi5cbmV4cG9ydCB0eXBlIERpc3RyaWJ1dGlvblNlcmlhbGl6YXRpb24gPSAnbm9ybWFsJ3wndW5pZm9ybSd8J3RydW5jYXRlZF9ub3JtYWwnO1xuXG5leHBvcnQgdHlwZSBaZXJvc1NlcmlhbGl6YXRpb24gPSBCYXNlU2VyaWFsaXphdGlvbjwnWmVyb3MnLCB7fT47XG5cbmV4cG9ydCB0eXBlIE9uZXNTZXJpYWxpemF0aW9uID0gQmFzZVNlcmlhbGl6YXRpb248J09uZXMnLCB7fT47XG5cbmV4cG9ydCB0eXBlIENvbnN0YW50Q29uZmlnID0ge1xuICB2YWx1ZTogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgQ29uc3RhbnRTZXJpYWxpemF0aW9uID1cbiAgICBCYXNlU2VyaWFsaXphdGlvbjwnQ29uc3RhbnQnLCBDb25zdGFudENvbmZpZz47XG5cbmV4cG9ydCB0eXBlIFJhbmRvbU5vcm1hbENvbmZpZyA9IHtcbiAgbWVhbj86IG51bWJlcjtcbiAgc3RkZGV2PzogbnVtYmVyO1xuICBzZWVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUmFuZG9tTm9ybWFsU2VyaWFsaXphdGlvbiA9XG4gICAgQmFzZVNlcmlhbGl6YXRpb248J1JhbmRvbU5vcm1hbCcsIFJhbmRvbU5vcm1hbENvbmZpZz47XG5cbmV4cG9ydCB0eXBlIFJhbmRvbVVuaWZvcm1Db25maWcgPSB7XG4gIG1pbnZhbD86IG51bWJlcjtcbiAgbWF4dmFsPzogbnVtYmVyO1xuICBzZWVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgUmFuZG9tVW5pZm9ybVNlcmlhbGl6YXRpb24gPVxuICAgIEJhc2VTZXJpYWxpemF0aW9uPCdSYW5kb21Vbmlmb3JtJywgUmFuZG9tVW5pZm9ybUNvbmZpZz47XG5cbmV4cG9ydCB0eXBlIFRydW5jYXRlZE5vcm1hbENvbmZpZyA9IHtcbiAgbWVhbj86IG51bWJlcjtcbiAgc3RkZGV2PzogbnVtYmVyO1xuICBzZWVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVHJ1bmNhdGVkTm9ybWFsU2VyaWFsaXphdGlvbiA9XG4gICAgQmFzZVNlcmlhbGl6YXRpb248J1RydW5jYXRlZE5vcm1hbCcsIFRydW5jYXRlZE5vcm1hbENvbmZpZz47XG5cbmV4cG9ydCB0eXBlIFZhcmlhbmNlU2NhbGluZ0NvbmZpZyA9IHtcbiAgc2NhbGU/OiBudW1iZXI7XG5cbiAgbW9kZT86IEZhbk1vZGVTZXJpYWxpemF0aW9uO1xuICBkaXN0cmlidXRpb24/OiBEaXN0cmlidXRpb25TZXJpYWxpemF0aW9uO1xuICBzZWVkPzogbnVtYmVyO1xufTtcblxuZXhwb3J0IHR5cGUgVmFyaWFuY2VTY2FsaW5nU2VyaWFsaXphdGlvbiA9XG4gICAgQmFzZVNlcmlhbGl6YXRpb248J1ZhcmlhbmNlU2NhbGluZycsIFZhcmlhbmNlU2NhbGluZ0NvbmZpZz47XG5cbmV4cG9ydCB0eXBlIE9ydGhvZ29uYWxDb25maWcgPSB7XG4gIHNlZWQ/OiBudW1iZXI7XG4gIGdhaW4/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBPcnRob2dvbmFsU2VyaWFsaXphdGlvbiA9XG4gICAgQmFzZVNlcmlhbGl6YXRpb248J09ydGhvZ29uYWwnLCBPcnRob2dvbmFsQ29uZmlnPjtcblxuZXhwb3J0IHR5cGUgSWRlbnRpdHlDb25maWcgPSB7XG4gIGdhaW4/OiBudW1iZXI7XG59O1xuXG5leHBvcnQgdHlwZSBJZGVudGl0eVNlcmlhbGl6YXRpb24gPVxuICAgIEJhc2VTZXJpYWxpemF0aW9uPCdJZGVudGl0eScsIElkZW50aXR5Q29uZmlnPjtcblxuLy8gVXBkYXRlIGluaXRpYWxpemVyQ2xhc3NOYW1lcyBiZWxvdyBpbiBjb25jZXJ0IHdpdGggdGhpcy5cbmV4cG9ydCB0eXBlIEluaXRpYWxpemVyU2VyaWFsaXphdGlvbiA9IFplcm9zU2VyaWFsaXphdGlvbnxPbmVzU2VyaWFsaXphdGlvbnxcbiAgICBDb25zdGFudFNlcmlhbGl6YXRpb258UmFuZG9tVW5pZm9ybVNlcmlhbGl6YXRpb258UmFuZG9tTm9ybWFsU2VyaWFsaXphdGlvbnxcbiAgICBUcnVuY2F0ZWROb3JtYWxTZXJpYWxpemF0aW9ufElkZW50aXR5U2VyaWFsaXphdGlvbnxcbiAgICBWYXJpYW5jZVNjYWxpbmdTZXJpYWxpemF0aW9ufE9ydGhvZ29uYWxTZXJpYWxpemF0aW9uO1xuXG5leHBvcnQgdHlwZSBJbml0aWFsaXplckNsYXNzTmFtZSA9IEluaXRpYWxpemVyU2VyaWFsaXphdGlvblsnY2xhc3NfbmFtZSddO1xuXG4vLyBXZSBjYW4ndCBlYXNpbHkgZXh0cmFjdCBhIHN0cmluZ1tdIGZyb20gdGhlIHN0cmluZyB1bmlvbiB0eXBlLCBidXQgd2UgY2FuXG4vLyByZWNhcGl0dWxhdGUgdGhlIGxpc3QsIGVuZm9yY2luZyBhdCBjb21waWxlIHRpbWUgdGhhdCB0aGUgdmFsdWVzIGFyZSB2YWxpZFxuLy8gYW5kIHRoYXQgd2UgaGF2ZSB0aGUgcmlnaHQgbnVtYmVyIG9mIHRoZW0uXG5cbi8qKlxuICogQSBzdHJpbmcgYXJyYXkgb2YgdmFsaWQgSW5pdGlhbGl6ZXIgY2xhc3MgbmFtZXMuXG4gKlxuICogVGhpcyBpcyBndWFyYW50ZWVkIHRvIG1hdGNoIHRoZSBgSW5pdGlhbGl6ZXJDbGFzc05hbWVgIHVuaW9uIHR5cGUuXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0aWFsaXplckNsYXNzTmFtZXM6IEluaXRpYWxpemVyQ2xhc3NOYW1lW10gPSBbXG4gICdaZXJvcycsICdPbmVzJywgJ0NvbnN0YW50JywgJ1JhbmRvbU5vcm1hbCcsICdSYW5kb21Vbmlmb3JtJyxcbiAgJ1RydW5jYXRlZE5vcm1hbCcsICdWYXJpYW5jZVNjYWxpbmcnLCAnT3J0aG9nb25hbCcsICdJZGVudGl0eSdcbl07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { eye, linalg, mul, ones, randomUniform, scalar, serialization, tidy, transpose, truncatedNormal, zeros } from '@tensorflow/tfjs-core';\nimport * as K from './backend/tfjs_backend';\nimport { checkDataFormat } from './common';\nimport { NotImplementedError, ValueError } from './errors';\nimport { VALID_DISTRIBUTION_VALUES, VALID_FAN_MODE_VALUES } from './keras_format/initializer_config';\nimport { checkStringTypeUnionValue, deserializeKerasObject, serializeKerasObject } from './utils/generic_utils';\nimport { arrayProd } from './utils/math_utils';\nexport function checkFanMode(value) {\n    checkStringTypeUnionValue(VALID_FAN_MODE_VALUES, 'FanMode', value);\n}\nexport function checkDistribution(value) {\n    checkStringTypeUnionValue(VALID_DISTRIBUTION_VALUES, 'Distribution', value);\n}\n/**\n * Initializer base class.\n *\n * @doc {\n *   heading: 'Initializers', subheading: 'Classes', namespace: 'initializers'}\n */\nexport class Initializer extends serialization.Serializable {\n    fromConfigUsesCustomObjects() {\n        return false;\n    }\n    getConfig() {\n        return {};\n    }\n}\nexport class Zeros extends Initializer {\n    apply(shape, dtype) {\n        return zeros(shape, dtype);\n    }\n}\n/** @nocollapse */\nZeros.className = 'Zeros';\nserialization.registerClass(Zeros);\nexport class Ones extends Initializer {\n    apply(shape, dtype) {\n        return ones(shape, dtype);\n    }\n}\n/** @nocollapse */\nOnes.className = 'Ones';\nserialization.registerClass(Ones);\nexport class Constant extends Initializer {\n    constructor(args) {\n        super();\n        if (typeof args !== 'object') {\n            throw new ValueError(`Expected argument of type ConstantConfig but got ${args}`);\n        }\n        if (args.value === undefined) {\n            throw new ValueError(`config must have value set but got ${args}`);\n        }\n        this.value = args.value;\n    }\n    apply(shape, dtype) {\n        return tidy(() => mul(scalar(this.value), ones(shape, dtype)));\n    }\n    getConfig() {\n        return {\n            value: this.value,\n        };\n    }\n}\n/** @nocollapse */\nConstant.className = 'Constant';\nserialization.registerClass(Constant);\nexport class RandomUniform extends Initializer {\n    constructor(args) {\n        super();\n        this.DEFAULT_MINVAL = -0.05;\n        this.DEFAULT_MAXVAL = 0.05;\n        this.minval = args.minval || this.DEFAULT_MINVAL;\n        this.maxval = args.maxval || this.DEFAULT_MAXVAL;\n        this.seed = args.seed;\n    }\n    apply(shape, dtype) {\n        return randomUniform(shape, this.minval, this.maxval, dtype);\n    }\n    getConfig() {\n        return { minval: this.minval, maxval: this.maxval, seed: this.seed };\n    }\n}\n/** @nocollapse */\nRandomUniform.className = 'RandomUniform';\nserialization.registerClass(RandomUniform);\nexport class RandomNormal extends Initializer {\n    constructor(args) {\n        super();\n        this.DEFAULT_MEAN = 0.;\n        this.DEFAULT_STDDEV = 0.05;\n        this.mean = args.mean || this.DEFAULT_MEAN;\n        this.stddev = args.stddev || this.DEFAULT_STDDEV;\n        this.seed = args.seed;\n    }\n    apply(shape, dtype) {\n        dtype = dtype || 'float32';\n        if (dtype !== 'float32' && dtype !== 'int32') {\n            throw new NotImplementedError(`randomNormal does not support dType ${dtype}.`);\n        }\n        return K.randomNormal(shape, this.mean, this.stddev, dtype, this.seed);\n    }\n    getConfig() {\n        return { mean: this.mean, stddev: this.stddev, seed: this.seed };\n    }\n}\n/** @nocollapse */\nRandomNormal.className = 'RandomNormal';\nserialization.registerClass(RandomNormal);\nexport class TruncatedNormal extends Initializer {\n    constructor(args) {\n        super();\n        this.DEFAULT_MEAN = 0.;\n        this.DEFAULT_STDDEV = 0.05;\n        this.mean = args.mean || this.DEFAULT_MEAN;\n        this.stddev = args.stddev || this.DEFAULT_STDDEV;\n        this.seed = args.seed;\n    }\n    apply(shape, dtype) {\n        dtype = dtype || 'float32';\n        if (dtype !== 'float32' && dtype !== 'int32') {\n            throw new NotImplementedError(`truncatedNormal does not support dType ${dtype}.`);\n        }\n        return truncatedNormal(shape, this.mean, this.stddev, dtype, this.seed);\n    }\n    getConfig() {\n        return { mean: this.mean, stddev: this.stddev, seed: this.seed };\n    }\n}\n/** @nocollapse */\nTruncatedNormal.className = 'TruncatedNormal';\nserialization.registerClass(TruncatedNormal);\nexport class Identity extends Initializer {\n    constructor(args) {\n        super();\n        this.gain = args.gain != null ? args.gain : 1.0;\n    }\n    apply(shape, dtype) {\n        return tidy(() => {\n            if (shape.length !== 2 || shape[0] !== shape[1]) {\n                throw new ValueError('Identity matrix initializer can only be used for' +\n                    ' 2D square matrices.');\n            }\n            else {\n                return mul(this.gain, eye(shape[0]));\n            }\n        });\n    }\n    getConfig() {\n        return { gain: this.gain };\n    }\n}\n/** @nocollapse */\nIdentity.className = 'Identity';\nserialization.registerClass(Identity);\n/**\n * Computes the number of input and output units for a weight shape.\n * @param shape Shape of weight.\n * @param dataFormat data format to use for convolution kernels.\n *   Note that all kernels in Keras are standardized on the\n *   CHANNEL_LAST ordering (even when inputs are set to CHANNEL_FIRST).\n * @return An length-2 array: fanIn, fanOut.\n */\nfunction computeFans(shape, dataFormat = 'channelsLast') {\n    let fanIn;\n    let fanOut;\n    checkDataFormat(dataFormat);\n    if (shape.length === 2) {\n        fanIn = shape[0];\n        fanOut = shape[1];\n    }\n    else if ([3, 4, 5].indexOf(shape.length) !== -1) {\n        if (dataFormat === 'channelsFirst') {\n            const receptiveFieldSize = arrayProd(shape, 2);\n            fanIn = shape[1] * receptiveFieldSize;\n            fanOut = shape[0] * receptiveFieldSize;\n        }\n        else if (dataFormat === 'channelsLast') {\n            const receptiveFieldSize = arrayProd(shape, 0, shape.length - 2);\n            fanIn = shape[shape.length - 2] * receptiveFieldSize;\n            fanOut = shape[shape.length - 1] * receptiveFieldSize;\n        }\n    }\n    else {\n        const shapeProd = arrayProd(shape);\n        fanIn = Math.sqrt(shapeProd);\n        fanOut = Math.sqrt(shapeProd);\n    }\n    return [fanIn, fanOut];\n}\nexport class VarianceScaling extends Initializer {\n    /**\n     * Constructor of VarianceScaling.\n     * @throws ValueError for invalid value in scale.\n     */\n    constructor(args) {\n        super();\n        if (args.scale < 0.0) {\n            throw new ValueError(`scale must be a positive float. Got: ${args.scale}`);\n        }\n        this.scale = args.scale == null ? 1.0 : args.scale;\n        this.mode = args.mode == null ? 'fanIn' : args.mode;\n        checkFanMode(this.mode);\n        this.distribution =\n            args.distribution == null ? 'normal' : args.distribution;\n        checkDistribution(this.distribution);\n        this.seed = args.seed;\n    }\n    apply(shape, dtype) {\n        const fans = computeFans(shape);\n        const fanIn = fans[0];\n        const fanOut = fans[1];\n        let scale = this.scale;\n        if (this.mode === 'fanIn') {\n            scale /= Math.max(1, fanIn);\n        }\n        else if (this.mode === 'fanOut') {\n            scale /= Math.max(1, fanOut);\n        }\n        else {\n            scale /= Math.max(1, (fanIn + fanOut) / 2);\n        }\n        if (this.distribution === 'normal') {\n            const stddev = Math.sqrt(scale);\n            dtype = dtype || 'float32';\n            if (dtype !== 'float32' && dtype !== 'int32') {\n                throw new NotImplementedError(`${this.getClassName()} does not support dType ${dtype}.`);\n            }\n            return truncatedNormal(shape, 0, stddev, dtype, this.seed);\n        }\n        else {\n            const limit = Math.sqrt(3 * scale);\n            return randomUniform(shape, -limit, limit, dtype);\n        }\n    }\n    getConfig() {\n        return {\n            scale: this.scale,\n            mode: this.mode,\n            distribution: this.distribution,\n            seed: this.seed\n        };\n    }\n}\n/** @nocollapse */\nVarianceScaling.className = 'VarianceScaling';\nserialization.registerClass(VarianceScaling);\nexport class GlorotUniform extends VarianceScaling {\n    /**\n     * Constructor of GlorotUniform\n     * @param scale\n     * @param mode\n     * @param distribution\n     * @param seed\n     */\n    constructor(args) {\n        super({\n            scale: 1.0,\n            mode: 'fanAvg',\n            distribution: 'uniform',\n            seed: args == null ? null : args.seed\n        });\n    }\n    getClassName() {\n        // In Python Keras, GlorotUniform is not a class, but a helper method\n        // that creates a VarianceScaling object. Use 'VarianceScaling' as\n        // class name to be compatible with that.\n        return VarianceScaling.className;\n    }\n}\n/** @nocollapse */\nGlorotUniform.className = 'GlorotUniform';\nserialization.registerClass(GlorotUniform);\nexport class GlorotNormal extends VarianceScaling {\n    /**\n     * Constructor of GlorotNormal.\n     * @param scale\n     * @param mode\n     * @param distribution\n     * @param seed\n     */\n    constructor(args) {\n        super({\n            scale: 1.0,\n            mode: 'fanAvg',\n            distribution: 'normal',\n            seed: args == null ? null : args.seed\n        });\n    }\n    getClassName() {\n        // In Python Keras, GlorotNormal is not a class, but a helper method\n        // that creates a VarianceScaling object. Use 'VarianceScaling' as\n        // class name to be compatible with that.\n        return VarianceScaling.className;\n    }\n}\n/** @nocollapse */\nGlorotNormal.className = 'GlorotNormal';\nserialization.registerClass(GlorotNormal);\nexport class HeNormal extends VarianceScaling {\n    constructor(args) {\n        super({\n            scale: 2.0,\n            mode: 'fanIn',\n            distribution: 'normal',\n            seed: args == null ? null : args.seed\n        });\n    }\n    getClassName() {\n        // In Python Keras, HeNormal is not a class, but a helper method\n        // that creates a VarianceScaling object. Use 'VarianceScaling' as\n        // class name to be compatible with that.\n        return VarianceScaling.className;\n    }\n}\n/** @nocollapse */\nHeNormal.className = 'HeNormal';\nserialization.registerClass(HeNormal);\nexport class HeUniform extends VarianceScaling {\n    constructor(args) {\n        super({\n            scale: 2.0,\n            mode: 'fanIn',\n            distribution: 'uniform',\n            seed: args == null ? null : args.seed\n        });\n    }\n    getClassName() {\n        // In Python Keras, HeUniform is not a class, but a helper method\n        // that creates a VarianceScaling object. Use 'VarianceScaling' as\n        // class name to be compatible with that.\n        return VarianceScaling.className;\n    }\n}\n/** @nocollapse */\nHeUniform.className = 'HeUniform';\nserialization.registerClass(HeUniform);\nexport class LeCunNormal extends VarianceScaling {\n    constructor(args) {\n        super({\n            scale: 1.0,\n            mode: 'fanIn',\n            distribution: 'normal',\n            seed: args == null ? null : args.seed\n        });\n    }\n    getClassName() {\n        // In Python Keras, LeCunNormal is not a class, but a helper method\n        // that creates a VarianceScaling object. Use 'VarianceScaling' as\n        // class name to be compatible with that.\n        return VarianceScaling.className;\n    }\n}\n/** @nocollapse */\nLeCunNormal.className = 'LeCunNormal';\nserialization.registerClass(LeCunNormal);\nexport class LeCunUniform extends VarianceScaling {\n    constructor(args) {\n        super({\n            scale: 1.0,\n            mode: 'fanIn',\n            distribution: 'uniform',\n            seed: args == null ? null : args.seed\n        });\n    }\n    getClassName() {\n        // In Python Keras, LeCunUniform is not a class, but a helper method\n        // that creates a VarianceScaling object. Use 'VarianceScaling' as\n        // class name to be compatible with that.\n        return VarianceScaling.className;\n    }\n}\n/** @nocollapse */\nLeCunUniform.className = 'LeCunNormal';\nserialization.registerClass(LeCunUniform);\nexport class Orthogonal extends Initializer {\n    constructor(args) {\n        super();\n        this.DEFAULT_GAIN = 1;\n        this.gain = args.gain == null ? this.DEFAULT_GAIN : args.gain;\n        this.seed = args.seed;\n        if (this.seed != null) {\n            throw new NotImplementedError('Random seed is not implemented for Orthogonal Initializer yet.');\n        }\n    }\n    apply(shape, dtype) {\n        return tidy(() => {\n            if (shape.length < 2) {\n                throw new NotImplementedError('Shape must be at least 2D.');\n            }\n            if (shape[0] * shape[1] > 2000) {\n                console.warn(`Orthogonal initializer is being called on a matrix with more ` +\n                    `than 2000 (${shape[0] * shape[1]}) elements: ` +\n                    `Slowness may result.`);\n            }\n            // TODO(cais): Add seed support.\n            const normalizedShape = shape[0] > shape[1] ? [shape[1], shape[0]] : shape;\n            const a = K.randomNormal(normalizedShape, 0, 1, 'float32');\n            let q = linalg.gramSchmidt(a);\n            if (shape[0] > shape[1]) {\n                q = transpose(q);\n            }\n            return mul(this.gain, q);\n        });\n    }\n    getConfig() {\n        return {\n            gain: this.gain,\n            seed: this.seed,\n        };\n    }\n}\n/** @nocollapse */\nOrthogonal.className = 'Orthogonal';\nserialization.registerClass(Orthogonal);\n// Maps the JavaScript-like identifier keys to the corresponding registry\n// symbols.\nexport const INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n    'constant': 'Constant',\n    'glorotNormal': 'GlorotNormal',\n    'glorotUniform': 'GlorotUniform',\n    'heNormal': 'HeNormal',\n    'heUniform': 'HeUniform',\n    'identity': 'Identity',\n    'leCunNormal': 'LeCunNormal',\n    'leCunUniform': 'LeCunUniform',\n    'ones': 'Ones',\n    'orthogonal': 'Orthogonal',\n    'randomNormal': 'RandomNormal',\n    'randomUniform': 'RandomUniform',\n    'truncatedNormal': 'TruncatedNormal',\n    'varianceScaling': 'VarianceScaling',\n    'zeros': 'Zeros'\n};\nfunction deserializeInitializer(config, customObjects = {}) {\n    return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'initializer');\n}\nexport function serializeInitializer(initializer) {\n    return serializeKerasObject(initializer);\n}\nexport function getInitializer(identifier) {\n    if (typeof identifier === 'string') {\n        const className = identifier in INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP ?\n            INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] :\n            identifier;\n        /* We have four 'helper' classes for common initializers that\n        all get serialized as 'VarianceScaling' and shouldn't go through\n        the deserializeInitializer pathway. */\n        if (className === 'GlorotNormal') {\n            return new GlorotNormal();\n        }\n        else if (className === 'GlorotUniform') {\n            return new GlorotUniform();\n        }\n        else if (className === 'HeNormal') {\n            return new HeNormal();\n        }\n        else if (className === 'HeUniform') {\n            return new HeUniform();\n        }\n        else if (className === 'LeCunNormal') {\n            return new LeCunNormal();\n        }\n        else if (className === 'LeCunUniform') {\n            return new LeCunUniform();\n        }\n        else {\n            const config = {};\n            config['className'] = className;\n            config['config'] = {};\n            return deserializeInitializer(config);\n        }\n    }\n    else if (identifier instanceof Initializer) {\n        return identifier;\n    }\n    else {\n        return deserializeInitializer(identifier);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5pdGlhbGl6ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2luaXRpYWxpemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sRUFBVyxHQUFHLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQW9CLElBQUksRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhLLE9BQU8sS0FBSyxDQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBRXpELE9BQU8sRUFBd0IseUJBQXlCLEVBQUUscUJBQXFCLEVBQUMsTUFBTSxtQ0FBbUMsQ0FBQztBQUMxSCxPQUFPLEVBQUMseUJBQXlCLEVBQUUsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFN0MsTUFBTSxVQUFVLFlBQVksQ0FBQyxLQUFjO0lBQ3pDLHlCQUF5QixDQUFDLHFCQUFxQixFQUFFLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNyRSxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUFDLEtBQWM7SUFDOUMseUJBQXlCLENBQUMseUJBQXlCLEVBQUUsY0FBYyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlFLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sT0FBZ0IsV0FBWSxTQUFRLGFBQWEsQ0FBQyxZQUFZO0lBQzNELDJCQUEyQjtRQUNoQyxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFTRCxT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Q3hELFVBQVUsQ0FBQztRQUNmOzs4Q0FFc0M7UUFDdEMsSUFBSSxTQUFTLEtBQUssY0FBYyxFQUFFO1lBQ2hDLE9BQU8sSUFBSSxZQUFZLEVBQUUsQ0FBQztTQUMzQjthQUFNLElBQUksU0FBUyxLQUFLLGVBQWUsRUFBRTtZQUN4QyxPQUFPLElBQUksYUFBYSxFQUFFLENBQUM7U0FDNUI7YUFBTSxJQUFJLFNBQVMsS0FBSyxVQUFVLEVBQUU7WUFDbkMsT0FBTyxJQUFJLFFBQVEsRUFBRSxDQUFDO1NBQ3ZCO2FBQU0sSUFBSSxTQUFTLEtBQUssV0FBVyxFQUFFO1lBQ3BDLE9BQU8sSUFBSSxTQUFTLEVBQUUsQ0FBQztTQUN4QjthQUFNLElBQUksU0FBUyxLQUFLLGFBQWEsRUFBRTtZQUN0QyxPQUFPLElBQUksV0FBVyxFQUFFLENBQUM7U0FDMUI7YUFBTSxJQUFJLFNBQVMsS0FBSyxjQUFjLEVBQUU7WUFDdkMsT0FBTyxJQUFJLFlBQVksRUFBRSxDQUFDO1NBQzNCO2FBQU07WUFDTCxNQUFNLE1BQU0sR0FBNkIsRUFBRSxDQUFDO1lBQzVDLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxTQUFTLENBQUM7WUFDaEMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUN0QixPQUFPLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQ3ZDO0tBQ0Y7U0FBTSxJQUFJLFVBQVUsWUFBWSxXQUFXLEVBQUU7UUFDNUMsT0FBTyxVQUFVLENBQUM7S0FDbkI7U0FBTTtRQUNMLE9BQU8sc0JBQXNCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDM0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgZXllLCBsaW5hbGcsIG11bCwgb25lcywgcmFuZG9tVW5pZm9ybSwgc2NhbGFyLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIFRlbnNvcjJELCB0aWR5LCB0cmFuc3Bvc2UsIHRydW5jYXRlZE5vcm1hbCwgemVyb3N9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCAqIGFzIEsgZnJvbSAnLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge2NoZWNrRGF0YUZvcm1hdH0gZnJvbSAnLi9jb21tb24nO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge0RhdGFGb3JtYXQsIFNoYXBlfSBmcm9tICcuL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtEaXN0cmlidXRpb24sIEZhbk1vZGUsIFZBTElEX0RJU1RSSUJVVElPTl9WQUxVRVMsIFZBTElEX0ZBTl9NT0RFX1ZBTFVFU30gZnJvbSAnLi9rZXJhc19mb3JtYXQvaW5pdGlhbGl6ZXJfY29uZmlnJztcbmltcG9ydCB7Y2hlY2tTdHJpbmdUeXBlVW5pb25WYWx1ZSwgZGVzZXJpYWxpemVLZXJhc09iamVjdCwgc2VyaWFsaXplS2VyYXNPYmplY3R9IGZyb20gJy4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2FycmF5UHJvZH0gZnJvbSAnLi91dGlscy9tYXRoX3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrRmFuTW9kZSh2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX0ZBTl9NT0RFX1ZBTFVFUywgJ0Zhbk1vZGUnLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0Rpc3RyaWJ1dGlvbih2YWx1ZT86IHN0cmluZyk6IHZvaWQge1xuICBjaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFZBTElEX0RJU1RSSUJVVElPTl9WQUxVRVMsICdEaXN0cmlidXRpb24nLCB2YWx1ZSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXIgYmFzZSBjbGFzcy5cbiAqXG4gKiBAZG9jIHtcbiAqICAgaGVhZGluZzogJ0luaXRpYWxpemVycycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgbmFtZXNwYWNlOiAnaW5pdGlhbGl6ZXJzJ31cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluaXRpYWxpemVyIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUge1xuICBwdWJsaWMgZnJvbUNvbmZpZ1VzZXNDdXN0b21PYmplY3RzKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvKipcbiAgICogR2VuZXJhdGUgYW4gaW5pdGlhbCB2YWx1ZS5cbiAgICogQHBhcmFtIHNoYXBlXG4gICAqIEBwYXJhbSBkdHlwZVxuICAgKiBAcmV0dXJuIFRoZSBpbml0IHZhbHVlLlxuICAgKi9cbiAgYWJzdHJhY3QgYXBwbHkoc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yO1xuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgWmVyb3MgZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1plcm9zJztcblxuICBhcHBseShzaGFwZTogU2hhcGUsIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3Ige1xuICAgIHJldHVybiB6ZXJvcyhzaGFwZSwgZHR5cGUpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoWmVyb3MpO1xuXG5leHBvcnQgY2xhc3MgT25lcyBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnT25lcyc7XG5cbiAgYXBwbHkoc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yIHtcbiAgICByZXR1cm4gb25lcyhzaGFwZSwgZHR5cGUpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoT25lcyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ29uc3RhbnRBcmdzIHtcbiAgLyoqIFRoZSB2YWx1ZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSB2YXJpYWJsZS4gKi9cbiAgdmFsdWU6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbnN0YW50IGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdDb25zdGFudCc7XG4gIHByaXZhdGUgdmFsdWU6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoYXJnczogQ29uc3RhbnRBcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAodHlwZW9mIGFyZ3MgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgYXJndW1lbnQgb2YgdHlwZSBDb25zdGFudENvbmZpZyBidXQgZ290ICR7YXJnc31gKTtcbiAgICB9XG4gICAgaWYgKGFyZ3MudmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYGNvbmZpZyBtdXN0IGhhdmUgdmFsdWUgc2V0IGJ1dCBnb3QgJHthcmdzfWApO1xuICAgIH1cbiAgICB0aGlzLnZhbHVlID0gYXJncy52YWx1ZTtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4gbXVsKHNjYWxhcih0aGlzLnZhbHVlKSwgb25lcyhzaGFwZSwgZHR5cGUpKSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgdmFsdWU6IHRoaXMudmFsdWUsXG4gICAgfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnN0YW50KTtcblxuZXhwb3J0IGludGVyZmFjZSBSYW5kb21Vbmlmb3JtQXJncyB7XG4gIC8qKiBMb3dlciBib3VuZCBvZiB0aGUgcmFuZ2Ugb2YgcmFuZG9tIHZhbHVlcyB0byBnZW5lcmF0ZS4gKi9cbiAgbWludmFsPzogbnVtYmVyO1xuICAvKiogVXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlIG9mIHJhbmRvbSB2YWx1ZXMgdG8gZ2VuZXJhdGUuICovXG4gIG1heHZhbD86IG51bWJlcjtcbiAgLyoqIFVzZWQgdG8gc2VlZCB0aGUgcmFuZG9tIGdlbmVyYXRvci4gKi9cbiAgc2VlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJhbmRvbVVuaWZvcm0gZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1JhbmRvbVVuaWZvcm0nO1xuICByZWFkb25seSBERUZBVUxUX01JTlZBTCA9IC0wLjA1O1xuICByZWFkb25seSBERUZBVUxUX01BWFZBTCA9IDAuMDU7XG4gIHByaXZhdGUgbWludmFsOiBudW1iZXI7XG4gIHByaXZhdGUgbWF4dmFsOiBudW1iZXI7XG4gIHByaXZhdGUgc2VlZDogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFJhbmRvbVVuaWZvcm1BcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1pbnZhbCA9IGFyZ3MubWludmFsIHx8IHRoaXMuREVGQVVMVF9NSU5WQUw7XG4gICAgdGhpcy5tYXh2YWwgPSBhcmdzLm1heHZhbCB8fCB0aGlzLkRFRkFVTFRfTUFYVkFMO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgcmV0dXJuIHJhbmRvbVVuaWZvcm0oc2hhcGUsIHRoaXMubWludmFsLCB0aGlzLm1heHZhbCwgZHR5cGUpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHttaW52YWw6IHRoaXMubWludmFsLCBtYXh2YWw6IHRoaXMubWF4dmFsLCBzZWVkOiB0aGlzLnNlZWR9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmFuZG9tVW5pZm9ybSk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmFuZG9tTm9ybWFsQXJncyB7XG4gIC8qKiBNZWFuIG9mIHRoZSByYW5kb20gdmFsdWVzIHRvIGdlbmVyYXRlLiAqL1xuICBtZWFuPzogbnVtYmVyO1xuICAvKiogU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSByYW5kb20gdmFsdWVzIHRvIGdlbmVyYXRlLiAqL1xuICBzdGRkZXY/OiBudW1iZXI7XG4gIC8qKiBVc2VkIHRvIHNlZWQgdGhlIHJhbmRvbSBnZW5lcmF0b3IuICovXG4gIHNlZWQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBSYW5kb21Ob3JtYWwgZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1JhbmRvbU5vcm1hbCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfTUVBTiA9IDAuO1xuICByZWFkb25seSBERUZBVUxUX1NURERFViA9IDAuMDU7XG4gIHByaXZhdGUgbWVhbjogbnVtYmVyO1xuICBwcml2YXRlIHN0ZGRldjogbnVtYmVyO1xuICBwcml2YXRlIHNlZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBSYW5kb21Ob3JtYWxBcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1lYW4gPSBhcmdzLm1lYW4gfHwgdGhpcy5ERUZBVUxUX01FQU47XG4gICAgdGhpcy5zdGRkZXYgPSBhcmdzLnN0ZGRldiB8fCB0aGlzLkRFRkFVTFRfU1REREVWO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicgJiYgZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgIGByYW5kb21Ob3JtYWwgZG9lcyBub3Qgc3VwcG9ydCBkVHlwZSAke2R0eXBlfS5gKTtcbiAgICB9XG5cbiAgICByZXR1cm4gSy5yYW5kb21Ob3JtYWwoc2hhcGUsIHRoaXMubWVhbiwgdGhpcy5zdGRkZXYsIGR0eXBlLCB0aGlzLnNlZWQpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHttZWFuOiB0aGlzLm1lYW4sIHN0ZGRldjogdGhpcy5zdGRkZXYsIHNlZWQ6IHRoaXMuc2VlZH07XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSYW5kb21Ob3JtYWwpO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRydW5jYXRlZE5vcm1hbEFyZ3Mge1xuICAvKiogTWVhbiBvZiB0aGUgcmFuZG9tIHZhbHVlcyB0byBnZW5lcmF0ZS4gKi9cbiAgbWVhbj86IG51bWJlcjtcbiAgLyoqIFN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgcmFuZG9tIHZhbHVlcyB0byBnZW5lcmF0ZS4gKi9cbiAgc3RkZGV2PzogbnVtYmVyO1xuICAvKiogVXNlZCB0byBzZWVkIHRoZSByYW5kb20gZ2VuZXJhdG9yLiAqL1xuICBzZWVkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgVHJ1bmNhdGVkTm9ybWFsIGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdUcnVuY2F0ZWROb3JtYWwnO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfTUVBTiA9IDAuO1xuICByZWFkb25seSBERUZBVUxUX1NURERFViA9IDAuMDU7XG4gIHByaXZhdGUgbWVhbjogbnVtYmVyO1xuICBwcml2YXRlIHN0ZGRldjogbnVtYmVyO1xuICBwcml2YXRlIHNlZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBUcnVuY2F0ZWROb3JtYWxBcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1lYW4gPSBhcmdzLm1lYW4gfHwgdGhpcy5ERUZBVUxUX01FQU47XG4gICAgdGhpcy5zdGRkZXYgPSBhcmdzLnN0ZGRldiB8fCB0aGlzLkRFRkFVTFRfU1REREVWO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgaWYgKGR0eXBlICE9PSAnZmxvYXQzMicgJiYgZHR5cGUgIT09ICdpbnQzMicpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgIGB0cnVuY2F0ZWROb3JtYWwgZG9lcyBub3Qgc3VwcG9ydCBkVHlwZSAke2R0eXBlfS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydW5jYXRlZE5vcm1hbChzaGFwZSwgdGhpcy5tZWFuLCB0aGlzLnN0ZGRldiwgZHR5cGUsIHRoaXMuc2VlZCk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge21lYW46IHRoaXMubWVhbiwgc3RkZGV2OiB0aGlzLnN0ZGRldiwgc2VlZDogdGhpcy5zZWVkfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFRydW5jYXRlZE5vcm1hbCk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSWRlbnRpdHlBcmdzIHtcbiAgLyoqXG4gICAqIE11bHRpcGxpY2F0aXZlIGZhY3RvciB0byBhcHBseSB0byB0aGUgaWRlbnRpdHkgbWF0cml4LlxuICAgKi9cbiAgZ2Fpbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIElkZW50aXR5IGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdJZGVudGl0eSc7XG4gIHByaXZhdGUgZ2FpbjogbnVtYmVyO1xuICBjb25zdHJ1Y3RvcihhcmdzOiBJZGVudGl0eUFyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZ2FpbiA9IGFyZ3MuZ2FpbiAhPSBudWxsID8gYXJncy5nYWluIDogMS4wO1xuICB9XG5cbiAgYXBwbHkoc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpZiAoc2hhcGUubGVuZ3RoICE9PSAyIHx8IHNoYXBlWzBdICE9PSBzaGFwZVsxXSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdJZGVudGl0eSBtYXRyaXggaW5pdGlhbGl6ZXIgY2FuIG9ubHkgYmUgdXNlZCBmb3InICtcbiAgICAgICAgICAgICcgMkQgc3F1YXJlIG1hdHJpY2VzLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG11bCh0aGlzLmdhaW4sIGV5ZShzaGFwZVswXSkpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHtnYWluOiB0aGlzLmdhaW59O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSWRlbnRpdHkpO1xuXG4vKipcbiAqIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgaW5wdXQgYW5kIG91dHB1dCB1bml0cyBmb3IgYSB3ZWlnaHQgc2hhcGUuXG4gKiBAcGFyYW0gc2hhcGUgU2hhcGUgb2Ygd2VpZ2h0LlxuICogQHBhcmFtIGRhdGFGb3JtYXQgZGF0YSBmb3JtYXQgdG8gdXNlIGZvciBjb252b2x1dGlvbiBrZXJuZWxzLlxuICogICBOb3RlIHRoYXQgYWxsIGtlcm5lbHMgaW4gS2VyYXMgYXJlIHN0YW5kYXJkaXplZCBvbiB0aGVcbiAqICAgQ0hBTk5FTF9MQVNUIG9yZGVyaW5nIChldmVuIHdoZW4gaW5wdXRzIGFyZSBzZXQgdG8gQ0hBTk5FTF9GSVJTVCkuXG4gKiBAcmV0dXJuIEFuIGxlbmd0aC0yIGFycmF5OiBmYW5JbiwgZmFuT3V0LlxuICovXG5mdW5jdGlvbiBjb21wdXRlRmFucyhcbiAgICBzaGFwZTogU2hhcGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQgPSAnY2hhbm5lbHNMYXN0Jyk6IG51bWJlcltdIHtcbiAgbGV0IGZhbkluOiBudW1iZXI7XG4gIGxldCBmYW5PdXQ6IG51bWJlcjtcbiAgY2hlY2tEYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICBpZiAoc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgZmFuSW4gPSBzaGFwZVswXTtcbiAgICBmYW5PdXQgPSBzaGFwZVsxXTtcbiAgfSBlbHNlIGlmIChbMywgNCwgNV0uaW5kZXhPZihzaGFwZS5sZW5ndGgpICE9PSAtMSkge1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIGNvbnN0IHJlY2VwdGl2ZUZpZWxkU2l6ZSA9IGFycmF5UHJvZChzaGFwZSwgMik7XG4gICAgICBmYW5JbiA9IHNoYXBlWzFdICogcmVjZXB0aXZlRmllbGRTaXplO1xuICAgICAgZmFuT3V0ID0gc2hhcGVbMF0gKiByZWNlcHRpdmVGaWVsZFNpemU7XG4gICAgfSBlbHNlIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgY29uc3QgcmVjZXB0aXZlRmllbGRTaXplID0gYXJyYXlQcm9kKHNoYXBlLCAwLCBzaGFwZS5sZW5ndGggLSAyKTtcbiAgICAgIGZhbkluID0gc2hhcGVbc2hhcGUubGVuZ3RoIC0gMl0gKiByZWNlcHRpdmVGaWVsZFNpemU7XG4gICAgICBmYW5PdXQgPSBzaGFwZVtzaGFwZS5sZW5ndGggLSAxXSAqIHJlY2VwdGl2ZUZpZWxkU2l6ZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2hhcGVQcm9kID0gYXJyYXlQcm9kKHNoYXBlKTtcbiAgICBmYW5JbiA9IE1hdGguc3FydChzaGFwZVByb2QpO1xuICAgIGZhbk91dCA9IE1hdGguc3FydChzaGFwZVByb2QpO1xuICB9XG5cbiAgcmV0dXJuIFtmYW5JbiwgZmFuT3V0XTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBWYXJpYW5jZVNjYWxpbmdBcmdzIHtcbiAgLyoqIFNjYWxpbmcgZmFjdG9yIChwb3NpdGl2ZSBmbG9hdCkuICovXG4gIHNjYWxlPzogbnVtYmVyO1xuXG4gIC8qKiBGYW5uaW5nIG1vZGUgZm9yIGlucHV0cyBhbmQgb3V0cHV0cy4gKi9cbiAgbW9kZT86IEZhbk1vZGU7XG5cbiAgLyoqIFByb2JhYmlsaXN0aWMgZGlzdHJpYnV0aW9uIG9mIHRoZSB2YWx1ZXMuICovXG4gIGRpc3RyaWJ1dGlvbj86IERpc3RyaWJ1dGlvbjtcblxuICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3Igc2VlZC4gKi9cbiAgc2VlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFZhcmlhbmNlU2NhbGluZyBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnVmFyaWFuY2VTY2FsaW5nJztcbiAgcHJpdmF0ZSBzY2FsZTogbnVtYmVyO1xuICBwcml2YXRlIG1vZGU6IEZhbk1vZGU7XG4gIHByaXZhdGUgZGlzdHJpYnV0aW9uOiBEaXN0cmlidXRpb247XG4gIHByaXZhdGUgc2VlZDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBvZiBWYXJpYW5jZVNjYWxpbmcuXG4gICAqIEB0aHJvd3MgVmFsdWVFcnJvciBmb3IgaW52YWxpZCB2YWx1ZSBpbiBzY2FsZS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFZhcmlhbmNlU2NhbGluZ0FyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIGlmIChhcmdzLnNjYWxlIDwgMC4wKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgc2NhbGUgbXVzdCBiZSBhIHBvc2l0aXZlIGZsb2F0LiBHb3Q6ICR7YXJncy5zY2FsZX1gKTtcbiAgICB9XG4gICAgdGhpcy5zY2FsZSA9IGFyZ3Muc2NhbGUgPT0gbnVsbCA/IDEuMCA6IGFyZ3Muc2NhbGU7XG4gICAgdGhpcy5tb2RlID0gYXJncy5tb2RlID09IG51bGwgPyAnZmFuSW4nIDogYXJncy5tb2RlO1xuICAgIGNoZWNrRmFuTW9kZSh0aGlzLm1vZGUpO1xuICAgIHRoaXMuZGlzdHJpYnV0aW9uID1cbiAgICAgICAgYXJncy5kaXN0cmlidXRpb24gPT0gbnVsbCA/ICdub3JtYWwnIDogYXJncy5kaXN0cmlidXRpb247XG4gICAgY2hlY2tEaXN0cmlidXRpb24odGhpcy5kaXN0cmlidXRpb24pO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgfVxuXG4gIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgY29uc3QgZmFucyA9IGNvbXB1dGVGYW5zKHNoYXBlKTtcbiAgICBjb25zdCBmYW5JbiA9IGZhbnNbMF07XG4gICAgY29uc3QgZmFuT3V0ID0gZmFuc1sxXTtcbiAgICBsZXQgc2NhbGUgPSB0aGlzLnNjYWxlO1xuICAgIGlmICh0aGlzLm1vZGUgPT09ICdmYW5JbicpIHtcbiAgICAgIHNjYWxlIC89IE1hdGgubWF4KDEsIGZhbkluKTtcbiAgICB9IGVsc2UgaWYgKHRoaXMubW9kZSA9PT0gJ2Zhbk91dCcpIHtcbiAgICAgIHNjYWxlIC89IE1hdGgubWF4KDEsIGZhbk91dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNjYWxlIC89IE1hdGgubWF4KDEsIChmYW5JbiArIGZhbk91dCkgLyAyKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kaXN0cmlidXRpb24gPT09ICdub3JtYWwnKSB7XG4gICAgICBjb25zdCBzdGRkZXYgPSBNYXRoLnNxcnQoc2NhbGUpO1xuICAgICAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gICAgICBpZiAoZHR5cGUgIT09ICdmbG9hdDMyJyAmJiBkdHlwZSAhPT0gJ2ludDMyJykge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgIGAke3RoaXMuZ2V0Q2xhc3NOYW1lKCl9IGRvZXMgbm90IHN1cHBvcnQgZFR5cGUgJHtkdHlwZX0uYCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1bmNhdGVkTm9ybWFsKHNoYXBlLCAwLCBzdGRkZXYsIGR0eXBlLCB0aGlzLnNlZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsaW1pdCA9IE1hdGguc3FydCgzICogc2NhbGUpO1xuICAgICAgcmV0dXJuIHJhbmRvbVVuaWZvcm0oc2hhcGUsIC1saW1pdCwgbGltaXQsIGR0eXBlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgc2NhbGU6IHRoaXMuc2NhbGUsXG4gICAgICBtb2RlOiB0aGlzLm1vZGUsXG4gICAgICBkaXN0cmlidXRpb246IHRoaXMuZGlzdHJpYnV0aW9uLFxuICAgICAgc2VlZDogdGhpcy5zZWVkXG4gICAgfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFZhcmlhbmNlU2NhbGluZyk7XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2VlZE9ubHlJbml0aWFsaXplckFyZ3Mge1xuICAvKiogUmFuZG9tIG51bWJlciBnZW5lcmF0b3Igc2VlZC4gKi9cbiAgc2VlZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEdsb3JvdFVuaWZvcm0gZXh0ZW5kcyBWYXJpYW5jZVNjYWxpbmcge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdHbG9yb3RVbmlmb3JtJztcblxuICAvKipcbiAgICogQ29uc3RydWN0b3Igb2YgR2xvcm90VW5pZm9ybVxuICAgKiBAcGFyYW0gc2NhbGVcbiAgICogQHBhcmFtIG1vZGVcbiAgICogQHBhcmFtIGRpc3RyaWJ1dGlvblxuICAgKiBAcGFyYW0gc2VlZFxuICAgKi9cbiAgY29uc3RydWN0b3IoYXJncz86IFNlZWRPbmx5SW5pdGlhbGl6ZXJBcmdzKSB7XG4gICAgc3VwZXIoe1xuICAgICAgc2NhbGU6IDEuMCxcbiAgICAgIG1vZGU6ICdmYW5BdmcnLFxuICAgICAgZGlzdHJpYnV0aW9uOiAndW5pZm9ybScsXG4gICAgICBzZWVkOiBhcmdzID09IG51bGwgPyBudWxsIDogYXJncy5zZWVkXG4gICAgfSk7XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICAvLyBJbiBQeXRob24gS2VyYXMsIEdsb3JvdFVuaWZvcm0gaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2xvcm90VW5pZm9ybSk7XG5cbmV4cG9ydCBjbGFzcyBHbG9yb3ROb3JtYWwgZXh0ZW5kcyBWYXJpYW5jZVNjYWxpbmcge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdHbG9yb3ROb3JtYWwnO1xuXG4gIC8qKlxuICAgKiBDb25zdHJ1Y3RvciBvZiBHbG9yb3ROb3JtYWwuXG4gICAqIEBwYXJhbSBzY2FsZVxuICAgKiBAcGFyYW0gbW9kZVxuICAgKiBAcGFyYW0gZGlzdHJpYnV0aW9uXG4gICAqIEBwYXJhbSBzZWVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihhcmdzPzogU2VlZE9ubHlJbml0aWFsaXplckFyZ3MpIHtcbiAgICBzdXBlcih7XG4gICAgICBzY2FsZTogMS4wLFxuICAgICAgbW9kZTogJ2ZhbkF2ZycsXG4gICAgICBkaXN0cmlidXRpb246ICdub3JtYWwnLFxuICAgICAgc2VlZDogYXJncyA9PSBudWxsID8gbnVsbCA6IGFyZ3Muc2VlZFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgLy8gSW4gUHl0aG9uIEtlcmFzLCBHbG9yb3ROb3JtYWwgaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2xvcm90Tm9ybWFsKTtcblxuZXhwb3J0IGNsYXNzIEhlTm9ybWFsIGV4dGVuZHMgVmFyaWFuY2VTY2FsaW5nIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnSGVOb3JtYWwnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZWVkT25seUluaXRpYWxpemVyQXJncykge1xuICAgIHN1cGVyKHtcbiAgICAgIHNjYWxlOiAyLjAsXG4gICAgICBtb2RlOiAnZmFuSW4nLFxuICAgICAgZGlzdHJpYnV0aW9uOiAnbm9ybWFsJyxcbiAgICAgIHNlZWQ6IGFyZ3MgPT0gbnVsbCA/IG51bGwgOiBhcmdzLnNlZWRcbiAgICB9KTtcbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIC8vIEluIFB5dGhvbiBLZXJhcywgSGVOb3JtYWwgaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSGVOb3JtYWwpO1xuXG5leHBvcnQgY2xhc3MgSGVVbmlmb3JtIGV4dGVuZHMgVmFyaWFuY2VTY2FsaW5nIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnSGVVbmlmb3JtJztcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogU2VlZE9ubHlJbml0aWFsaXplckFyZ3MpIHtcbiAgICBzdXBlcih7XG4gICAgICBzY2FsZTogMi4wLFxuICAgICAgbW9kZTogJ2ZhbkluJyxcbiAgICAgIGRpc3RyaWJ1dGlvbjogJ3VuaWZvcm0nLFxuICAgICAgc2VlZDogYXJncyA9PSBudWxsID8gbnVsbCA6IGFyZ3Muc2VlZFxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q2xhc3NOYW1lKCk6IHN0cmluZyB7XG4gICAgLy8gSW4gUHl0aG9uIEtlcmFzLCBIZVVuaWZvcm0gaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSGVVbmlmb3JtKTtcblxuZXhwb3J0IGNsYXNzIExlQ3VuTm9ybWFsIGV4dGVuZHMgVmFyaWFuY2VTY2FsaW5nIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTGVDdW5Ob3JtYWwnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZWVkT25seUluaXRpYWxpemVyQXJncykge1xuICAgIHN1cGVyKHtcbiAgICAgIHNjYWxlOiAxLjAsXG4gICAgICBtb2RlOiAnZmFuSW4nLFxuICAgICAgZGlzdHJpYnV0aW9uOiAnbm9ybWFsJyxcbiAgICAgIHNlZWQ6IGFyZ3MgPT0gbnVsbCA/IG51bGwgOiBhcmdzLnNlZWRcbiAgICB9KTtcbiAgfVxuXG4gIGdldENsYXNzTmFtZSgpOiBzdHJpbmcge1xuICAgIC8vIEluIFB5dGhvbiBLZXJhcywgTGVDdW5Ob3JtYWwgaXMgbm90IGEgY2xhc3MsIGJ1dCBhIGhlbHBlciBtZXRob2RcbiAgICAvLyB0aGF0IGNyZWF0ZXMgYSBWYXJpYW5jZVNjYWxpbmcgb2JqZWN0LiBVc2UgJ1ZhcmlhbmNlU2NhbGluZycgYXNcbiAgICAvLyBjbGFzcyBuYW1lIHRvIGJlIGNvbXBhdGlibGUgd2l0aCB0aGF0LlxuICAgIHJldHVybiBWYXJpYW5jZVNjYWxpbmcuY2xhc3NOYW1lO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTGVDdW5Ob3JtYWwpO1xuXG5leHBvcnQgY2xhc3MgTGVDdW5Vbmlmb3JtIGV4dGVuZHMgVmFyaWFuY2VTY2FsaW5nIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTGVDdW5Ob3JtYWwnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZWVkT25seUluaXRpYWxpemVyQXJncykge1xuICAgIHN1cGVyKHtcbiAgICAgIHNjYWxlOiAxLjAsXG4gICAgICBtb2RlOiAnZmFuSW4nLFxuICAgICAgZGlzdHJpYnV0aW9uOiAndW5pZm9ybScsXG4gICAgICBzZWVkOiBhcmdzID09IG51bGwgPyBudWxsIDogYXJncy5zZWVkXG4gICAgfSk7XG4gIH1cblxuICBnZXRDbGFzc05hbWUoKTogc3RyaW5nIHtcbiAgICAvLyBJbiBQeXRob24gS2VyYXMsIExlQ3VuVW5pZm9ybSBpcyBub3QgYSBjbGFzcywgYnV0IGEgaGVscGVyIG1ldGhvZFxuICAgIC8vIHRoYXQgY3JlYXRlcyBhIFZhcmlhbmNlU2NhbGluZyBvYmplY3QuIFVzZSAnVmFyaWFuY2VTY2FsaW5nJyBhc1xuICAgIC8vIGNsYXNzIG5hbWUgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoYXQuXG4gICAgcmV0dXJuIFZhcmlhbmNlU2NhbGluZy5jbGFzc05hbWU7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMZUN1blVuaWZvcm0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIE9ydGhvZ29uYWxBcmdzIGV4dGVuZHMgU2VlZE9ubHlJbml0aWFsaXplckFyZ3Mge1xuICAvKipcbiAgICogTXVsdGlwbGljYXRpdmUgZmFjdG9yIHRvIGFwcGx5IHRvIHRoZSBvcnRob2dvbmFsIG1hdHJpeC4gRGVmYXVsdHMgdG8gMS5cbiAgICovXG4gIGdhaW4/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBPcnRob2dvbmFsIGV4dGVuZHMgSW5pdGlhbGl6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdPcnRob2dvbmFsJztcbiAgcmVhZG9ubHkgREVGQVVMVF9HQUlOID0gMTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGdhaW46IG51bWJlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHNlZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogT3J0aG9nb25hbEFyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuZ2FpbiA9IGFyZ3MuZ2FpbiA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0dBSU4gOiBhcmdzLmdhaW47XG4gICAgdGhpcy5zZWVkID0gYXJncy5zZWVkO1xuXG4gICAgaWYgKHRoaXMuc2VlZCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAnUmFuZG9tIHNlZWQgaXMgbm90IGltcGxlbWVudGVkIGZvciBPcnRob2dvbmFsIEluaXRpYWxpemVyIHlldC4nKTtcbiAgICB9XG4gIH1cblxuICBhcHBseShzaGFwZTogU2hhcGUsIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlmIChzaGFwZS5sZW5ndGggPCAyKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdTaGFwZSBtdXN0IGJlIGF0IGxlYXN0IDJELicpO1xuICAgICAgfVxuICAgICAgaWYgKHNoYXBlWzBdICogc2hhcGVbMV0gPiAyMDAwKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgIGBPcnRob2dvbmFsIGluaXRpYWxpemVyIGlzIGJlaW5nIGNhbGxlZCBvbiBhIG1hdHJpeCB3aXRoIG1vcmUgYCArXG4gICAgICAgICAgICBgdGhhbiAyMDAwICgke3NoYXBlWzBdICogc2hhcGVbMV19KSBlbGVtZW50czogYCArXG4gICAgICAgICAgICBgU2xvd25lc3MgbWF5IHJlc3VsdC5gKTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHNlZWQgc3VwcG9ydC5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTaGFwZSA9XG4gICAgICAgICAgc2hhcGVbMF0gPiBzaGFwZVsxXSA/IFtzaGFwZVsxXSwgc2hhcGVbMF1dIDogc2hhcGU7XG4gICAgICBjb25zdCBhID0gSy5yYW5kb21Ob3JtYWwobm9ybWFsaXplZFNoYXBlLCAwLCAxLCAnZmxvYXQzMicpIGFzIFRlbnNvcjJEO1xuICAgICAgbGV0IHEgPSBsaW5hbGcuZ3JhbVNjaG1pZHQoYSkgYXMgVGVuc29yMkQ7XG4gICAgICBpZiAoc2hhcGVbMF0gPiBzaGFwZVsxXSkge1xuICAgICAgICBxID0gdHJhbnNwb3NlKHEpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG11bCh0aGlzLmdhaW4sIHEpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGdhaW46IHRoaXMuZ2FpbixcbiAgICAgIHNlZWQ6IHRoaXMuc2VlZCxcbiAgICB9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoT3J0aG9nb25hbCk7XG5cbi8qKiBAZG9jaW5saW5lICovXG5leHBvcnQgdHlwZSBJbml0aWFsaXplcklkZW50aWZpZXIgPVxuICAgICdjb25zdGFudCd8J2dsb3JvdE5vcm1hbCd8J2dsb3JvdFVuaWZvcm0nfCdoZU5vcm1hbCd8J2hlVW5pZm9ybSd8J2lkZW50aXR5J3xcbiAgICAnbGVDdW5Ob3JtYWwnfCdsZUN1blVuaWZvcm0nfCdvbmVzJ3wnb3J0aG9nb25hbCd8J3JhbmRvbU5vcm1hbCd8XG4gICAgJ3JhbmRvbVVuaWZvcm0nfCd0cnVuY2F0ZWROb3JtYWwnfCd2YXJpYW5jZVNjYWxpbmcnfCd6ZXJvcyd8c3RyaW5nO1xuXG4vLyBNYXBzIHRoZSBKYXZhU2NyaXB0LWxpa2UgaWRlbnRpZmllciBrZXlzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdHJ5XG4vLyBzeW1ib2xzLlxuZXhwb3J0IGNvbnN0IElOSVRJQUxJWkVSX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUDpcbiAgICB7W2lkZW50aWZpZXIgaW4gSW5pdGlhbGl6ZXJJZGVudGlmaWVyXTogc3RyaW5nfSA9IHtcbiAgICAgICdjb25zdGFudCc6ICdDb25zdGFudCcsXG4gICAgICAnZ2xvcm90Tm9ybWFsJzogJ0dsb3JvdE5vcm1hbCcsXG4gICAgICAnZ2xvcm90VW5pZm9ybSc6ICdHbG9yb3RVbmlmb3JtJyxcbiAgICAgICdoZU5vcm1hbCc6ICdIZU5vcm1hbCcsXG4gICAgICAnaGVVbmlmb3JtJzogJ0hlVW5pZm9ybScsXG4gICAgICAnaWRlbnRpdHknOiAnSWRlbnRpdHknLFxuICAgICAgJ2xlQ3VuTm9ybWFsJzogJ0xlQ3VuTm9ybWFsJyxcbiAgICAgICdsZUN1blVuaWZvcm0nOiAnTGVDdW5Vbmlmb3JtJyxcbiAgICAgICdvbmVzJzogJ09uZXMnLFxuICAgICAgJ29ydGhvZ29uYWwnOiAnT3J0aG9nb25hbCcsXG4gICAgICAncmFuZG9tTm9ybWFsJzogJ1JhbmRvbU5vcm1hbCcsXG4gICAgICAncmFuZG9tVW5pZm9ybSc6ICdSYW5kb21Vbmlmb3JtJyxcbiAgICAgICd0cnVuY2F0ZWROb3JtYWwnOiAnVHJ1bmNhdGVkTm9ybWFsJyxcbiAgICAgICd2YXJpYW5jZVNjYWxpbmcnOiAnVmFyaWFuY2VTY2FsaW5nJyxcbiAgICAgICd6ZXJvcyc6ICdaZXJvcydcbiAgICB9O1xuXG5mdW5jdGlvbiBkZXNlcmlhbGl6ZUluaXRpYWxpemVyKFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIGN1c3RvbU9iamVjdHM6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9KTogSW5pdGlhbGl6ZXIge1xuICByZXR1cm4gZGVzZXJpYWxpemVLZXJhc09iamVjdChcbiAgICAgIGNvbmZpZywgc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCxcbiAgICAgIGN1c3RvbU9iamVjdHMsICdpbml0aWFsaXplcicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2VyaWFsaXplSW5pdGlhbGl6ZXIoaW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyKTpcbiAgICBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSB7XG4gIHJldHVybiBzZXJpYWxpemVLZXJhc09iamVjdChpbml0aWFsaXplcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbml0aWFsaXplcihpZGVudGlmaWVyOiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXJ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogSW5pdGlhbGl6ZXIge1xuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaWRlbnRpZmllciBpbiBJTklUSUFMSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVAgP1xuICAgICAgICBJTklUSUFMSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVBbaWRlbnRpZmllcl0gOlxuICAgICAgICBpZGVudGlmaWVyO1xuICAgIC8qIFdlIGhhdmUgZm91ciAnaGVscGVyJyBjbGFzc2VzIGZvciBjb21tb24gaW5pdGlhbGl6ZXJzIHRoYXRcbiAgICBhbGwgZ2V0IHNlcmlhbGl6ZWQgYXMgJ1ZhcmlhbmNlU2NhbGluZycgYW5kIHNob3VsZG4ndCBnbyB0aHJvdWdoXG4gICAgdGhlIGRlc2VyaWFsaXplSW5pdGlhbGl6ZXIgcGF0aHdheS4gKi9cbiAgICBpZiAoY2xhc3NOYW1lID09PSAnR2xvcm90Tm9ybWFsJykge1xuICAgICAgcmV0dXJuIG5ldyBHbG9yb3ROb3JtYWwoKTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PT0gJ0dsb3JvdFVuaWZvcm0nKSB7XG4gICAgICByZXR1cm4gbmV3IEdsb3JvdFVuaWZvcm0oKTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PT0gJ0hlTm9ybWFsJykge1xuICAgICAgcmV0dXJuIG5ldyBIZU5vcm1hbCgpO1xuICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lID09PSAnSGVVbmlmb3JtJykge1xuICAgICAgcmV0dXJuIG5ldyBIZVVuaWZvcm0oKTtcbiAgICB9IGVsc2UgaWYgKGNsYXNzTmFtZSA9PT0gJ0xlQ3VuTm9ybWFsJykge1xuICAgICAgcmV0dXJuIG5ldyBMZUN1bk5vcm1hbCgpO1xuICAgIH0gZWxzZSBpZiAoY2xhc3NOYW1lID09PSAnTGVDdW5Vbmlmb3JtJykge1xuICAgICAgcmV0dXJuIG5ldyBMZUN1blVuaWZvcm0oKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICAgIGNvbmZpZ1snY2xhc3NOYW1lJ10gPSBjbGFzc05hbWU7XG4gICAgICBjb25maWdbJ2NvbmZpZyddID0ge307XG4gICAgICByZXR1cm4gZGVzZXJpYWxpemVJbml0aWFsaXplcihjb25maWcpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpZGVudGlmaWVyIGluc3RhbmNlb2YgSW5pdGlhbGl6ZXIpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVzZXJpYWxpemVJbml0aWFsaXplcihpZGVudGlmaWVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { ValueError } from '../errors';\n// tslint:enable\n/**\n * Determine whether the input is an Array of Shapes.\n */\nexport function isArrayOfShapes(x) {\n    return Array.isArray(x) && Array.isArray(x[0]);\n}\n/**\n * Special case of normalizing shapes to lists.\n *\n * @param x A shape or list of shapes to normalize into a list of Shapes.\n * @return A list of Shapes.\n */\nexport function normalizeShapeList(x) {\n    if (x.length === 0) {\n        return [];\n    }\n    if (!Array.isArray(x[0])) {\n        return [x];\n    }\n    return x;\n}\n/**\n * Helper function to obtain exactly one Tensor.\n * @param xs: A single `tf.Tensor` or an `Array` of `tf.Tensor`s.\n * @return A single `tf.Tensor`. If `xs` is an `Array`, return the first one.\n * @throws ValueError: If `xs` is an `Array` and its length is not 1.\n */\nexport function getExactlyOneTensor(xs) {\n    let x;\n    if (Array.isArray(xs)) {\n        if (xs.length !== 1) {\n            throw new ValueError(`Expected Tensor length to be 1; got ${xs.length}`);\n        }\n        x = xs[0];\n    }\n    else {\n        x = xs;\n    }\n    return x;\n}\n/**\n * Helper function to obtain exactly on instance of Shape.\n *\n * @param shapes Input single `Shape` or Array of `Shape`s.\n * @returns If input is a single `Shape`, return it unchanged. If the input is\n *   an `Array` containing exactly one instance of `Shape`, return the instance.\n *   Otherwise, throw a `ValueError`.\n * @throws ValueError: If input is an `Array` of `Shape`s, and its length is not\n *   1.\n */\nexport function getExactlyOneShape(shapes) {\n    if (Array.isArray(shapes) && Array.isArray(shapes[0])) {\n        if (shapes.length === 1) {\n            shapes = shapes;\n            return shapes[0];\n        }\n        else {\n            throw new ValueError(`Expected exactly 1 Shape; got ${shapes.length}`);\n        }\n    }\n    else {\n        return shapes;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXNfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvdXRpbHMvdHlwZXNfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFLSCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRXJDLGdCQUFnQjtBQUVoQjs7R0FFRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsQ0FBZ0I7SUFDOUMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDakQsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLGtCQUFrQixDQUFDLENBQWdCO0lBQ2pELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbEIsT0FBTyxFQUFFLENBQUM7S0FDWDtJQUNELElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyxDQUFDLENBQVksQ0FBQztLQUN2QjtJQUNELE9BQU8sQ0FBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxFQUFtQjtJQUNyRCxJQUFJLENBQVMsQ0FBQztJQUNkLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUNyQixJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxVQUFVLENBQUMsdUNBQXVDLEVBQUUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1NBQzFFO1FBQ0QsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNYO1NBQU07UUFDTCxDQUFDLEdBQUcsRUFBRSxDQUFDO0tBQ1I7SUFDRCxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBcUI7SUFDdEQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckQsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN2QixNQUFNLEdBQUcsTUFBaUIsQ0FBQztZQUMzQixPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNsQjthQUFNO1lBQ0wsTUFBTSxJQUFJLFVBQVUsQ0FBQyxpQ0FBaUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7U0FDeEU7S0FDRjtTQUFNO1FBQ0wsT0FBTyxNQUFlLENBQUM7S0FDeEI7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiB1dGlscy9nZW5lcmljX3V0aWxzLnB5ICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG4vLyB0c2xpbnQ6ZW5hYmxlXG5cbi8qKlxuICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGlucHV0IGlzIGFuIEFycmF5IG9mIFNoYXBlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXJyYXlPZlNoYXBlcyh4OiBTaGFwZXxTaGFwZVtdKTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHgpICYmIEFycmF5LmlzQXJyYXkoeFswXSk7XG59XG5cbi8qKlxuICogU3BlY2lhbCBjYXNlIG9mIG5vcm1hbGl6aW5nIHNoYXBlcyB0byBsaXN0cy5cbiAqXG4gKiBAcGFyYW0geCBBIHNoYXBlIG9yIGxpc3Qgb2Ygc2hhcGVzIHRvIG5vcm1hbGl6ZSBpbnRvIGEgbGlzdCBvZiBTaGFwZXMuXG4gKiBAcmV0dXJuIEEgbGlzdCBvZiBTaGFwZXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVTaGFwZUxpc3QoeDogU2hhcGV8U2hhcGVbXSk6IFNoYXBlW10ge1xuICBpZiAoeC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gW107XG4gIH1cbiAgaWYgKCFBcnJheS5pc0FycmF5KHhbMF0pKSB7XG4gICAgcmV0dXJuIFt4XSBhcyBTaGFwZVtdO1xuICB9XG4gIHJldHVybiB4IGFzIFNoYXBlW107XG59XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIG9idGFpbiBleGFjdGx5IG9uZSBUZW5zb3IuXG4gKiBAcGFyYW0geHM6IEEgc2luZ2xlIGB0Zi5UZW5zb3JgIG9yIGFuIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzLlxuICogQHJldHVybiBBIHNpbmdsZSBgdGYuVGVuc29yYC4gSWYgYHhzYCBpcyBhbiBgQXJyYXlgLCByZXR1cm4gdGhlIGZpcnN0IG9uZS5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSWYgYHhzYCBpcyBhbiBgQXJyYXlgIGFuZCBpdHMgbGVuZ3RoIGlzIG5vdCAxLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RXhhY3RseU9uZVRlbnNvcih4czogVGVuc29yfFRlbnNvcltdKTogVGVuc29yIHtcbiAgbGV0IHg6IFRlbnNvcjtcbiAgaWYgKEFycmF5LmlzQXJyYXkoeHMpKSB7XG4gICAgaWYgKHhzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEV4cGVjdGVkIFRlbnNvciBsZW5ndGggdG8gYmUgMTsgZ290ICR7eHMubGVuZ3RofWApO1xuICAgIH1cbiAgICB4ID0geHNbMF07XG4gIH0gZWxzZSB7XG4gICAgeCA9IHhzO1xuICB9XG4gIHJldHVybiB4O1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiB0byBvYnRhaW4gZXhhY3RseSBvbiBpbnN0YW5jZSBvZiBTaGFwZS5cbiAqXG4gKiBAcGFyYW0gc2hhcGVzIElucHV0IHNpbmdsZSBgU2hhcGVgIG9yIEFycmF5IG9mIGBTaGFwZWBzLlxuICogQHJldHVybnMgSWYgaW5wdXQgaXMgYSBzaW5nbGUgYFNoYXBlYCwgcmV0dXJuIGl0IHVuY2hhbmdlZC4gSWYgdGhlIGlucHV0IGlzXG4gKiAgIGFuIGBBcnJheWAgY29udGFpbmluZyBleGFjdGx5IG9uZSBpbnN0YW5jZSBvZiBgU2hhcGVgLCByZXR1cm4gdGhlIGluc3RhbmNlLlxuICogICBPdGhlcndpc2UsIHRocm93IGEgYFZhbHVlRXJyb3JgLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBpbnB1dCBpcyBhbiBgQXJyYXlgIG9mIGBTaGFwZWBzLCBhbmQgaXRzIGxlbmd0aCBpcyBub3RcbiAqICAgMS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEV4YWN0bHlPbmVTaGFwZShzaGFwZXM6IFNoYXBlfFNoYXBlW10pOiBTaGFwZSB7XG4gIGlmIChBcnJheS5pc0FycmF5KHNoYXBlcykgJiYgQXJyYXkuaXNBcnJheShzaGFwZXNbMF0pKSB7XG4gICAgaWYgKHNoYXBlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHNoYXBlcyA9IHNoYXBlcyBhcyBTaGFwZVtdO1xuICAgICAgcmV0dXJuIHNoYXBlc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYEV4cGVjdGVkIGV4YWN0bHkgMSBTaGFwZTsgZ290ICR7c2hhcGVzLmxlbmd0aH1gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNoYXBlcyBhcyBTaGFwZTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Count the elements in an Array of LayerVariables.\n *\n * @param weights: The LayerVariables of which the constituent numbers are to\n *   be counted.\n * @returns A count of the elements in all the LayerVariables\n */\nexport function countParamsInWeights(weights) {\n    let count = 0;\n    for (const weight of weights) {\n        if (weight.shape.length === 0) {\n            count += 1;\n        }\n        else {\n            count += weight.shape.reduce((a, b) => a * b);\n        }\n    }\n    return count;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvdXRpbHMvdmFyaWFibGVfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFJSDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsT0FBd0I7SUFDM0QsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUU7UUFDNUIsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDN0IsS0FBSyxJQUFJLENBQUMsQ0FBQztTQUNaO2FBQU07WUFDTCxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDL0M7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuLyoqXG4gKiBDb3VudCB0aGUgZWxlbWVudHMgaW4gYW4gQXJyYXkgb2YgTGF5ZXJWYXJpYWJsZXMuXG4gKlxuICogQHBhcmFtIHdlaWdodHM6IFRoZSBMYXllclZhcmlhYmxlcyBvZiB3aGljaCB0aGUgY29uc3RpdHVlbnQgbnVtYmVycyBhcmUgdG9cbiAqICAgYmUgY291bnRlZC5cbiAqIEByZXR1cm5zIEEgY291bnQgb2YgdGhlIGVsZW1lbnRzIGluIGFsbCB0aGUgTGF5ZXJWYXJpYWJsZXNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvdW50UGFyYW1zSW5XZWlnaHRzKHdlaWdodHM6IExheWVyVmFyaWFibGVbXSk6IG51bWJlciB7XG4gIGxldCBjb3VudCA9IDA7XG4gIGZvciAoY29uc3Qgd2VpZ2h0IG9mIHdlaWdodHMpIHtcbiAgICBpZiAod2VpZ2h0LnNoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgY291bnQgKz0gd2VpZ2h0LnNoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY291bnQ7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { variableGrads } from '@tensorflow/tfjs-core';\nimport { getNextUniqueTensorId } from './backend/state';\nimport { getScopedTensorName, getUniqueTensorName } from './common';\nimport { NotImplementedError } from './errors';\nconst DEFAULT_VARIABLE_NAME_PREFIX = 'Variable';\n/**\n * A `tf.layers.LayerVariable` is similar to a `tf.Tensor` in that it has a\n * dtype and shape, but its value is mutable.  The value is itself represented\n * as a`tf.Tensor`, and can be read with the `read()` method and updated with\n * the `write()` method.\n */\nexport class LayerVariable {\n    /**\n     * Construct Variable from a `tf.Tensor`.\n     *\n     * If not explicitly named, the Variable will be given a name with the\n     * prefix 'Variable'. Variable names are unique. In the case of name\n     * collision, suffixies '_<num>' will be added to the name.\n     *\n     * @param val Initial value of the Variable.\n     * @param name Name of the variable. If `null` or `undefined` is provided, it\n     *   will default a name with the prefix 'Variable'.\n     * @param constraint Optional, projection function to be applied to the\n     * variable after optimize updates\n     * @throws ValueError if `name` is `null` or `undefined`.\n     */\n    constructor(val, dtype = 'float32', name = DEFAULT_VARIABLE_NAME_PREFIX, trainable = true, constraint = null) {\n        this.dtype = dtype == null ? 'float32' : dtype;\n        this.shape = val.shape;\n        this.id = getNextUniqueTensorId();\n        name = name == null ? DEFAULT_VARIABLE_NAME_PREFIX : name;\n        this.originalName = getScopedTensorName(name);\n        this.name = getUniqueTensorName(this.originalName);\n        this.trainable_ = trainable;\n        this.constraint = constraint;\n        this.val = tfc.variable(val, this.trainable_, this.name, this.dtype);\n    }\n    /**\n     * Get a snapshot of the Variable's value.\n     *\n     * The returned value is a snapshot of the Variable's value at the time of\n     * the invocation. Future mutations in the value of the tensor will only\n     * be reflected by future calls to this method.\n     */\n    read() {\n        this.assertNotDisposed();\n        return this.val;\n    }\n    /**\n     * Update the value of the Variable.\n     *\n     * @param newVal: The new value to update to. Must be consistent with the\n     *   dtype and shape of the Variable.\n     * @return This Variable.\n     */\n    write(newVal) {\n        // TODO(cais): Once  TF.js Core supports Tensor.dtype, check dtype match.\n        this.assertNotDisposed();\n        checkShapesMatch(this.val, newVal);\n        // Skip updating if this is the exact same tensor.\n        if (this.val.id !== newVal.id) {\n            this.val.assign(newVal);\n            if (this.constraint != null) {\n                this.val.assign(this.constraint.apply(this.val));\n            }\n        }\n        return this;\n    }\n    /**\n     * Dispose this LayersVariable instance from memory.\n     */\n    dispose() {\n        this.assertNotDisposed();\n        this.val.dispose();\n    }\n    assertNotDisposed() {\n        if (this.val.isDisposed) {\n            throw new Error(`LayersVariable ${this.name} is already disposed.`);\n        }\n    }\n    get trainable() {\n        return this.trainable_;\n    }\n    set trainable(trainable) {\n        this.trainable_ = trainable;\n        this.val.trainable = trainable;\n    }\n}\nfunction checkShapesMatch(x, y) {\n    if (x.shape.toString() !== y.shape.toString()) {\n        throw new Error('Shape mismatch: ' + JSON.stringify(x.shape) + ' vs. ' +\n            JSON.stringify(y.shape));\n    }\n}\n/**\n * Create a Variable.\n * @param x The initial value of the `Variable`.\n * @param dtype optional, the type of the variable.\n * @param name optional, the name of the variable, default provided by\n * Variable.\n * @param constraint optional, a constraint to be applied after every update.\n * @return The newly instantiated `Variable`.\n */\nexport function variable(x, dtype, name, constraint) {\n    return new LayerVariable(x, dtype, name, true, constraint);\n}\n/**\n * Instantiates an all-zeros Variable and returns it.\n *\n * @param shape Shape of the tensor.\n * @param dtype DType of the tensor.\n * @param name Name of the tensor.\n * @return An all-zero Variable.\n */\nexport function zerosVariable(shape, dtype, name) {\n    // TODO(cais): Implement logic for dtype.\n    return new LayerVariable(tfc.zeros(shape), dtype, name);\n}\n/**\n * Instantiates an all-zeros tensor of the same shape as another tensor.\n *\n * @param x The other tensor.\n * @param dtype DType of the tensor.\n * @param name Name of the tensor.\n * @return A newly instantiated Variable.\n */\nexport function zerosLike(x, dtype, name) {\n    return new LayerVariable(tfc.zerosLike(x), dtype, name);\n}\n/**\n * Instantiates an all-ones tensor and returns it.\n *\n * @param shape Shape of the tensor.\n * @param dtype DType of the tensor.\n * @param name Name of the tensor.\n * @return An all-ones Variable.\n */\nexport function onesVariable(shape, dtype, name) {\n    // TODO(cais): Implement logic for dtype.\n    const allocated = tfc.ones(shape);\n    return new LayerVariable(allocated, dtype, name);\n}\n/**\n * Instantiates an all-ones tensor of the same shape as another tensor.\n *\n * @param x The other tensor.\n * @param dtype DType of the tensor.\n * @param name Name of the tensor.\n * @return A newly instantiated Variable.\n */\nexport function onesLike(x, dtype, name) {\n    const allocated = tfc.onesLike(x);\n    return new LayerVariable(allocated, dtype, name);\n}\n/**\n * Instantiate an identity matrix and returns it, as a Variable\n *\n * @param size Number of rows/columns.\n * @param dtype Data type of returned Variable.\n * @param name Name of returned Variable.\n * @return A Variable, an identity matrix.\n */\nexport function eyeVariable(size, dtype, name) {\n    return new LayerVariable(tfc.eye(size), dtype, name);\n}\n/**\n * Get a Variable with uniform distribution of values.\n * @param shape Shape of the tensor.\n * @param minval Lower bound of the uniform distribution.\n * @param maxval Upper bound of the uniform distribution.\n * @param dtype\n * @param seed\n * @param name Optional name.\n * @return The uniform-random Variable.\n */\nexport function randomUniformVariable(shape, minval, maxval, dtype, seed, name = 'randomUniform') {\n    return new LayerVariable(tfc.randomUniform(shape, minval, maxval, dtype), dtype, name);\n}\n/**\n * Get a Variable with truncated-normal distribution of values.\n * @param shape Shape of the tensor.\n * @param mean mean value of the normal distribution.\n * @param stddev standard deviation of the normal distribution.\n * @param dtype\n * @param seed\n * @param name Optional name.\n * @return The truncated-normal-random Variable.\n */\nexport function truncatedNormalVariable(shape, mean = 0.0, stddev = 1.0, dtype, seed, name = 'truncatedNormal') {\n    // TODO(cais): Implement logic for dtype and seed once they are supported\n    // by deeplearn.js.\n    dtype = dtype || 'float32';\n    if (dtype !== 'float32' && dtype !== 'int32') {\n        throw new NotImplementedError(`randomNormal does not support dType ${dtype}.`);\n    }\n    return new LayerVariable(tfc.truncatedNormal(shape, mean, stddev, dtype, seed), dtype, name);\n}\n/**\n * Get a Variable with normal distribution of values.\n * @param shape Shape of the tensor.\n * @param mean mean value of the normal distribution.\n * @param stddev standard deviation of the normal distribution.\n * @param dtype\n * @param seed\n * @param name Optional name.\n * @return The truncated-normal-random Variable.\n */\nexport function randomNormalVariable(shape, mean = 0.0, stddev = 1.0, dtype, seed, name = 'randomNormal') {\n    dtype = dtype || 'float32';\n    if (dtype !== 'float32' && dtype !== 'int32') {\n        throw new NotImplementedError(`randomNormalVariable does not support dType ${dtype}.`);\n    }\n    return new LayerVariable(tfc.randomNormal(shape, mean, stddev, dtype, seed), dtype, name);\n}\n/**\n * Update the value of a Variable.\n * @param x The Variable to be updated.\n * @param xNew The new value to update to.\n * @return The Variable updated.\n */\nexport function update(x, xNew) {\n    return x.write(xNew);\n}\n/**\n * Update the value of a Variable by adding an increment.\n * @param x The Variable to be updated.\n * @param increment The incrment to add to `x`.\n * @return The Variable updated.\n */\nexport function updateAdd(x, increment) {\n    return x.write(tfc.add(x.read(), increment));\n}\n/**\n * Update the value of a Variable by subtracting a decrement.\n * @param x The Variable to be updated.\n * @param decrement The decrement to subtract from `x`.\n * @return The Variable updated.\n */\nexport function updateSub(x, decrement) {\n    return x.write(tfc.sub(x.read(), decrement));\n}\n/**\n * Get the values of an array of Variables.\n *\n * @param tensors An `Array` of `Variable`s to get the values of.\n * @return The values of the inputs, as an `Array` of`tf.Tensor`s.\n */\nexport function batchGetValue(xs) {\n    return xs.map(x => x.read());\n}\n/**\n * Update the value of multiple Variables at once.\n *\n * @param variablesAndValues An `Array`, each element is of type\n *   [Variable, Tensor]. The first item is the\n *   `Variable` of which the value is to be updated. The second item\n *   carries the new value.\n */\nexport function batchSetValue(variablesAndValues) {\n    variablesAndValues.forEach(variableAndValue => {\n        const variable = variableAndValue[0];\n        variable.write(variableAndValue[1]);\n    });\n}\n/**\n * Returns the gradients of `variables` w.r.t. the return value of `lossFn`.\n * @param lossFn A function which returns a Scalar to be used as the function\n *   value (i.e., numerator) for differentiation.\n * @param variables List of variables to be used as the independent variables\n *   (i.e., denominator) for differentiation.\n * @returns An Array of gradients tensors.\n */\nexport function gradients(lossFn, variables) {\n    // TODO(cais): The return type signature can be simplified if deeplearn makes\n    //   the corresponding type public.\n    const variableList = variables.map(variable => variable.read());\n    const valudAndGrads = variableGrads(lossFn, variableList);\n    return variables.map(variable => valudAndGrads.grads[variable.name]);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFyaWFibGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL3ZhcmlhYmxlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILE9BQU8sS0FBSyxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFtQixhQUFhLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUN0RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFbEUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sVUFBVSxDQUFDO0FBSTdDLE1BQU0sNEJBQTRCLEdBQUcsVUFBVSxDQUFDO0FBRWhEOzs7OztHQUtHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFleEI7Ozs7Ozs7Ozs7Ozs7T0FhRztJQUNILFlBQ0ksR0FBVyxFQUFFLFFBQWtCLFNBQVMsRUFDeEMsSUFBSSxHQUFHLDRCQUE0QixFQUFFLFNBQVMsR0FBRyxJQUFJLEVBQ3JELGFBQXlCLElBQUk7UUFDL0IsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUMvQyxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxxQkFBcUIsRUFBRSxDQUFDO1FBRWxDLElBQUksR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQzFELElBQUksQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLElBQUksR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFFN0IsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxLQUFLLENBQUMsTUFBYztRQUNsQix5RUFBeUU7UUFDekUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQyxrREFBa0Q7UUFDbEQsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFBRSxFQUFFO1lBQzdCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3hCLElBQUksSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ2xEO1NBQ0Y7UUFDRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ3JCLENBQUM7SUFFUyxpQkFBaUI7UUFDekIsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRTtZQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLGtCQUFrQixJQUFJLENBQUMsSUFBSSx1QkFBdUIsQ0FBQyxDQUFDO1NBQ3JFO0lBQ0gsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsU0FBa0I7UUFDOUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDNUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQUVELFNBQVMsZ0JBQWdCLENBQUMsQ0FBVyxFQUFFLENBQVc7SUFDaEQsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEVBQUU7UUFDN0MsTUFBTSxJQUFJLEtBQUssQ0FDWCxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPO1lBQ3RELElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7S0FDOUI7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixDQUFTLEVBQUUsS0FBZ0IsRUFBRSxJQUFhLEVBQzFDLFVBQXVCO0lBQ3pCLE9BQU8sSUFBSSxhQUFhLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQzdELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDekIsS0FBWSxFQUFFLEtBQWdCLEVBQUUsSUFBYTtJQUMvQyx5Q0FBeUM7SUFDekMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3JCLENBQVMsRUFBRSxLQUFnQixFQUFFLElBQWE7SUFDNUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQ3hCLEtBQVksRUFBRSxLQUFnQixFQUFFLElBQWE7SUFDL0MseUNBQXlDO0lBQ3pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ25ELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsQ0FBUyxFQUFFLEtBQWdCLEVBQUUsSUFBYTtJQUM1QyxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLE9BQU8sSUFBSSxhQUFhLENBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3ZCLElBQVksRUFBRSxLQUFnQixFQUFFLElBQWE7SUFDL0MsT0FBTyxJQUFJLGFBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2RCxDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLHFCQUFxQixDQUNqQyxLQUFZLEVBQUUsTUFBYyxFQUFFLE1BQWMsRUFBRSxLQUFnQixFQUM5RCxJQUFhLEVBQUUsSUFBSSxHQUFHLGVBQWU7SUFDdkMsT0FBTyxJQUFJLGFBQWEsQ0FDcEIsR0FBRyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDbkMsS0FBWSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFnQixFQUFFLElBQWEsRUFDdkUsSUFBSSxHQUFHLGlCQUFpQjtJQUMxQix5RUFBeUU7SUFDekUsbUJBQW1CO0lBQ25CLEtBQUssR0FBRyxLQUFLLElBQUksU0FBUyxDQUFDO0lBQzNCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxLQUFLLEtBQUssT0FBTyxFQUFFO1FBQzVDLE1BQU0sSUFBSSxtQkFBbUIsQ0FDekIsdUNBQXVDLEtBQUssR0FBRyxDQUFDLENBQUM7S0FDdEQ7SUFDRCxPQUFPLElBQUksYUFBYSxDQUNwQixHQUFHLENBQUMsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDMUUsQ0FBQztBQUNEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDaEMsS0FBWSxFQUFFLElBQUksR0FBRyxHQUFHLEVBQUUsTUFBTSxHQUFHLEdBQUcsRUFBRSxLQUFnQixFQUFFLElBQWEsRUFDdkUsSUFBSSxHQUFHLGNBQWM7SUFDdkIsS0FBSyxHQUFHLEtBQUssSUFBSSxTQUFTLENBQUM7SUFDM0IsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDNUMsTUFBTSxJQUFJLG1CQUFtQixDQUN6QiwrQ0FBK0MsS0FBSyxHQUFHLENBQUMsQ0FBQztLQUM5RDtJQUNELE9BQU8sSUFBSSxhQUFhLENBQ3BCLEdBQUcsQ0FBQyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUFDLENBQWdCLEVBQUUsSUFBWTtJQUNuRCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxDQUFnQixFQUFFLFNBQWlCO0lBQzNELE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBQy9DLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQUMsQ0FBZ0IsRUFBRSxTQUFpQjtJQUMzRCxPQUFPLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsYUFBYSxDQUFDLEVBQW1CO0lBQy9DLE9BQU8sRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO0FBQy9CLENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FDekIsa0JBQWtEO0lBQ3BELGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFO1FBQzVDLE1BQU0sUUFBUSxHQUFrQixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRCxRQUFRLENBQUMsS0FBSyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxTQUFTLENBQ3JCLE1BQXdCLEVBQUUsU0FBMEI7SUFDdEQsNkVBQTZFO0lBQzdFLG1DQUFtQztJQUNuQyxNQUFNLFlBQVksR0FDZCxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksRUFBa0IsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sYUFBYSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDMUQsT0FBTyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0RhdGFUeXBlLCBUZW5zb3IsIHZhcmlhYmxlR3JhZHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0TmV4dFVuaXF1ZVRlbnNvcklkfSBmcm9tICcuL2JhY2tlbmQvc3RhdGUnO1xuaW1wb3J0IHtnZXRTY29wZWRUZW5zb3JOYW1lLCBnZXRVbmlxdWVUZW5zb3JOYW1lfSBmcm9tICcuL2NvbW1vbic7XG5pbXBvcnQge0NvbnN0cmFpbnR9IGZyb20gJy4vY29uc3RyYWludHMnO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge1NoYXBlfSBmcm9tICcuL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtIYXNTaGFwZX0gZnJvbSAnLi90eXBlcyc7XG5cbmNvbnN0IERFRkFVTFRfVkFSSUFCTEVfTkFNRV9QUkVGSVggPSAnVmFyaWFibGUnO1xuXG4vKipcbiAqIEEgYHRmLmxheWVycy5MYXllclZhcmlhYmxlYCBpcyBzaW1pbGFyIHRvIGEgYHRmLlRlbnNvcmAgaW4gdGhhdCBpdCBoYXMgYVxuICogZHR5cGUgYW5kIHNoYXBlLCBidXQgaXRzIHZhbHVlIGlzIG11dGFibGUuICBUaGUgdmFsdWUgaXMgaXRzZWxmIHJlcHJlc2VudGVkXG4gKiBhcyBhYHRmLlRlbnNvcmAsIGFuZCBjYW4gYmUgcmVhZCB3aXRoIHRoZSBgcmVhZCgpYCBtZXRob2QgYW5kIHVwZGF0ZWQgd2l0aFxuICogdGhlIGB3cml0ZSgpYCBtZXRob2QuXG4gKi9cbmV4cG9ydCBjbGFzcyBMYXllclZhcmlhYmxlIHtcbiAgcmVhZG9ubHkgZHR5cGU6IERhdGFUeXBlO1xuICByZWFkb25seSBzaGFwZTogU2hhcGU7XG5cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgLy8gVGhlIGZ1bGx5IHNjb3BlZCBuYW1lIG9mIHRoaXMgVmFyaWFibGUsIGluY2x1ZGluZyBhIHVuaXF1ZSBzdWZmaXggaWYgbmVlZGVkXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLy8gVGhlIG9yaWdpbmFsbHkgcmVxdWVzdGVkIGZ1bGx5IHNjb3BlZCBuYW1lIG9mIHRoaXMgVmFyaWFibGUsIG5vdCBpbmNsdWRpbmdcbiAgLy8gYW55IHVuaXF1ZSBzdWZmaXguICBUaGlzIG1heSBiZSBuZWVkZWQgd2hlbiByZXN0b3Jpbmcgd2VpZ2h0cyBiZWNhdXNlIHRoaXNcbiAgLy8gb3JpZ2luYWwgbmFtZSBpcyB1c2VkIGFzIGEga2V5LlxuICByZWFkb25seSBvcmlnaW5hbE5hbWU6IHN0cmluZztcbiAgcHJpdmF0ZSB0cmFpbmFibGVfOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSB2YWw6IHRmYy5WYXJpYWJsZTtcbiAgcmVhZG9ubHkgY29uc3RyYWludDogQ29uc3RyYWludDtcbiAgLyoqXG4gICAqIENvbnN0cnVjdCBWYXJpYWJsZSBmcm9tIGEgYHRmLlRlbnNvcmAuXG4gICAqXG4gICAqIElmIG5vdCBleHBsaWNpdGx5IG5hbWVkLCB0aGUgVmFyaWFibGUgd2lsbCBiZSBnaXZlbiBhIG5hbWUgd2l0aCB0aGVcbiAgICogcHJlZml4ICdWYXJpYWJsZScuIFZhcmlhYmxlIG5hbWVzIGFyZSB1bmlxdWUuIEluIHRoZSBjYXNlIG9mIG5hbWVcbiAgICogY29sbGlzaW9uLCBzdWZmaXhpZXMgJ188bnVtPicgd2lsbCBiZSBhZGRlZCB0byB0aGUgbmFtZS5cbiAgICpcbiAgICogQHBhcmFtIHZhbCBJbml0aWFsIHZhbHVlIG9mIHRoZSBWYXJpYWJsZS5cbiAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdmFyaWFibGUuIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCBpcyBwcm92aWRlZCwgaXRcbiAgICogICB3aWxsIGRlZmF1bHQgYSBuYW1lIHdpdGggdGhlIHByZWZpeCAnVmFyaWFibGUnLlxuICAgKiBAcGFyYW0gY29uc3RyYWludCBPcHRpb25hbCwgcHJvamVjdGlvbiBmdW5jdGlvbiB0byBiZSBhcHBsaWVkIHRvIHRoZVxuICAgKiB2YXJpYWJsZSBhZnRlciBvcHRpbWl6ZSB1cGRhdGVzXG4gICAqIEB0aHJvd3MgVmFsdWVFcnJvciBpZiBgbmFtZWAgaXMgYG51bGxgIG9yIGB1bmRlZmluZWRgLlxuICAgKi9cbiAgY29uc3RydWN0b3IoXG4gICAgICB2YWw6IFRlbnNvciwgZHR5cGU6IERhdGFUeXBlID0gJ2Zsb2F0MzInLFxuICAgICAgbmFtZSA9IERFRkFVTFRfVkFSSUFCTEVfTkFNRV9QUkVGSVgsIHRyYWluYWJsZSA9IHRydWUsXG4gICAgICBjb25zdHJhaW50OiBDb25zdHJhaW50ID0gbnVsbCkge1xuICAgIHRoaXMuZHR5cGUgPSBkdHlwZSA9PSBudWxsID8gJ2Zsb2F0MzInIDogZHR5cGU7XG4gICAgdGhpcy5zaGFwZSA9IHZhbC5zaGFwZTtcbiAgICB0aGlzLmlkID0gZ2V0TmV4dFVuaXF1ZVRlbnNvcklkKCk7XG5cbiAgICBuYW1lID0gbmFtZSA9PSBudWxsID8gREVGQVVMVF9WQVJJQUJMRV9OQU1FX1BSRUZJWCA6IG5hbWU7XG4gICAgdGhpcy5vcmlnaW5hbE5hbWUgPSBnZXRTY29wZWRUZW5zb3JOYW1lKG5hbWUpO1xuICAgIHRoaXMubmFtZSA9IGdldFVuaXF1ZVRlbnNvck5hbWUodGhpcy5vcmlnaW5hbE5hbWUpO1xuXG4gICAgdGhpcy50cmFpbmFibGVfID0gdHJhaW5hYmxlO1xuICAgIHRoaXMuY29uc3RyYWludCA9IGNvbnN0cmFpbnQ7XG5cbiAgICB0aGlzLnZhbCA9IHRmYy52YXJpYWJsZSh2YWwsIHRoaXMudHJhaW5hYmxlXywgdGhpcy5uYW1lLCB0aGlzLmR0eXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBzbmFwc2hvdCBvZiB0aGUgVmFyaWFibGUncyB2YWx1ZS5cbiAgICpcbiAgICogVGhlIHJldHVybmVkIHZhbHVlIGlzIGEgc25hcHNob3Qgb2YgdGhlIFZhcmlhYmxlJ3MgdmFsdWUgYXQgdGhlIHRpbWUgb2ZcbiAgICogdGhlIGludm9jYXRpb24uIEZ1dHVyZSBtdXRhdGlvbnMgaW4gdGhlIHZhbHVlIG9mIHRoZSB0ZW5zb3Igd2lsbCBvbmx5XG4gICAqIGJlIHJlZmxlY3RlZCBieSBmdXR1cmUgY2FsbHMgdG8gdGhpcyBtZXRob2QuXG4gICAqL1xuICByZWFkKCk6IFRlbnNvciB7XG4gICAgdGhpcy5hc3NlcnROb3REaXNwb3NlZCgpO1xuICAgIHJldHVybiB0aGlzLnZhbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHZhbHVlIG9mIHRoZSBWYXJpYWJsZS5cbiAgICpcbiAgICogQHBhcmFtIG5ld1ZhbDogVGhlIG5ldyB2YWx1ZSB0byB1cGRhdGUgdG8uIE11c3QgYmUgY29uc2lzdGVudCB3aXRoIHRoZVxuICAgKiAgIGR0eXBlIGFuZCBzaGFwZSBvZiB0aGUgVmFyaWFibGUuXG4gICAqIEByZXR1cm4gVGhpcyBWYXJpYWJsZS5cbiAgICovXG4gIHdyaXRlKG5ld1ZhbDogVGVuc29yKSB7XG4gICAgLy8gVE9ETyhjYWlzKTogT25jZSAgVEYuanMgQ29yZSBzdXBwb3J0cyBUZW5zb3IuZHR5cGUsIGNoZWNrIGR0eXBlIG1hdGNoLlxuICAgIHRoaXMuYXNzZXJ0Tm90RGlzcG9zZWQoKTtcbiAgICBjaGVja1NoYXBlc01hdGNoKHRoaXMudmFsLCBuZXdWYWwpO1xuICAgIC8vIFNraXAgdXBkYXRpbmcgaWYgdGhpcyBpcyB0aGUgZXhhY3Qgc2FtZSB0ZW5zb3IuXG4gICAgaWYgKHRoaXMudmFsLmlkICE9PSBuZXdWYWwuaWQpIHtcbiAgICAgIHRoaXMudmFsLmFzc2lnbihuZXdWYWwpO1xuICAgICAgaWYgKHRoaXMuY29uc3RyYWludCAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMudmFsLmFzc2lnbih0aGlzLmNvbnN0cmFpbnQuYXBwbHkodGhpcy52YWwpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGlzIExheWVyc1ZhcmlhYmxlIGluc3RhbmNlIGZyb20gbWVtb3J5LlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmFzc2VydE5vdERpc3Bvc2VkKCk7XG4gICAgdGhpcy52YWwuZGlzcG9zZSgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzc2VydE5vdERpc3Bvc2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnZhbC5pc0Rpc3Bvc2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyc1ZhcmlhYmxlICR7dGhpcy5uYW1lfSBpcyBhbHJlYWR5IGRpc3Bvc2VkLmApO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0cmFpbmFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMudHJhaW5hYmxlXztcbiAgfVxuXG4gIHNldCB0cmFpbmFibGUodHJhaW5hYmxlOiBib29sZWFuKSB7XG4gICAgdGhpcy50cmFpbmFibGVfID0gdHJhaW5hYmxlO1xuICAgIHRoaXMudmFsLnRyYWluYWJsZSA9IHRyYWluYWJsZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBjaGVja1NoYXBlc01hdGNoKHg6IEhhc1NoYXBlLCB5OiBIYXNTaGFwZSk6IHZvaWQge1xuICBpZiAoeC5zaGFwZS50b1N0cmluZygpICE9PSB5LnNoYXBlLnRvU3RyaW5nKCkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdTaGFwZSBtaXNtYXRjaDogJyArIEpTT04uc3RyaW5naWZ5KHguc2hhcGUpICsgJyB2cy4gJyArXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KHkuc2hhcGUpKTtcbiAgfVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIFZhcmlhYmxlLlxuICogQHBhcmFtIHggVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlIGBWYXJpYWJsZWAuXG4gKiBAcGFyYW0gZHR5cGUgb3B0aW9uYWwsIHRoZSB0eXBlIG9mIHRoZSB2YXJpYWJsZS5cbiAqIEBwYXJhbSBuYW1lIG9wdGlvbmFsLCB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUsIGRlZmF1bHQgcHJvdmlkZWQgYnlcbiAqIFZhcmlhYmxlLlxuICogQHBhcmFtIGNvbnN0cmFpbnQgb3B0aW9uYWwsIGEgY29uc3RyYWludCB0byBiZSBhcHBsaWVkIGFmdGVyIGV2ZXJ5IHVwZGF0ZS5cbiAqIEByZXR1cm4gVGhlIG5ld2x5IGluc3RhbnRpYXRlZCBgVmFyaWFibGVgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFyaWFibGUoXG4gICAgeDogVGVuc29yLCBkdHlwZT86IERhdGFUeXBlLCBuYW1lPzogc3RyaW5nLFxuICAgIGNvbnN0cmFpbnQ/OiBDb25zdHJhaW50KTogTGF5ZXJWYXJpYWJsZSB7XG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZSh4LCBkdHlwZSwgbmFtZSwgdHJ1ZSwgY29uc3RyYWludCk7XG59XG5cbi8qKlxuICogSW5zdGFudGlhdGVzIGFuIGFsbC16ZXJvcyBWYXJpYWJsZSBhbmQgcmV0dXJucyBpdC5cbiAqXG4gKiBAcGFyYW0gc2hhcGUgU2hhcGUgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBkdHlwZSBEVHlwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVuc29yLlxuICogQHJldHVybiBBbiBhbGwtemVybyBWYXJpYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHplcm9zVmFyaWFibGUoXG4gICAgc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlLCBuYW1lPzogc3RyaW5nKTogTGF5ZXJWYXJpYWJsZSB7XG4gIC8vIFRPRE8oY2Fpcyk6IEltcGxlbWVudCBsb2dpYyBmb3IgZHR5cGUuXG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZSh0ZmMuemVyb3Moc2hhcGUpLCBkdHlwZSwgbmFtZSk7XG59XG5cbi8qKlxuICogSW5zdGFudGlhdGVzIGFuIGFsbC16ZXJvcyB0ZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgYW5vdGhlciB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHggVGhlIG90aGVyIHRlbnNvci5cbiAqIEBwYXJhbSBkdHlwZSBEVHlwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVuc29yLlxuICogQHJldHVybiBBIG5ld2x5IGluc3RhbnRpYXRlZCBWYXJpYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHplcm9zTGlrZShcbiAgICB4OiBUZW5zb3IsIGR0eXBlPzogRGF0YVR5cGUsIG5hbWU/OiBzdHJpbmcpOiBMYXllclZhcmlhYmxlIHtcbiAgcmV0dXJuIG5ldyBMYXllclZhcmlhYmxlKHRmYy56ZXJvc0xpa2UoeCksIGR0eXBlLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBJbnN0YW50aWF0ZXMgYW4gYWxsLW9uZXMgdGVuc29yIGFuZCByZXR1cm5zIGl0LlxuICpcbiAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIERUeXBlIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcmV0dXJuIEFuIGFsbC1vbmVzIFZhcmlhYmxlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gb25lc1ZhcmlhYmxlKFxuICAgIHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSwgbmFtZT86IHN0cmluZyk6IExheWVyVmFyaWFibGUge1xuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgbG9naWMgZm9yIGR0eXBlLlxuICBjb25zdCBhbGxvY2F0ZWQgPSB0ZmMub25lcyhzaGFwZSk7XG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZShhbGxvY2F0ZWQsIGR0eXBlLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBJbnN0YW50aWF0ZXMgYW4gYWxsLW9uZXMgdGVuc29yIG9mIHRoZSBzYW1lIHNoYXBlIGFzIGFub3RoZXIgdGVuc29yLlxuICpcbiAqIEBwYXJhbSB4IFRoZSBvdGhlciB0ZW5zb3IuXG4gKiBAcGFyYW0gZHR5cGUgRFR5cGUgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlbnNvci5cbiAqIEByZXR1cm4gQSBuZXdseSBpbnN0YW50aWF0ZWQgVmFyaWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvbmVzTGlrZShcbiAgICB4OiBUZW5zb3IsIGR0eXBlPzogRGF0YVR5cGUsIG5hbWU/OiBzdHJpbmcpOiBMYXllclZhcmlhYmxlIHtcbiAgY29uc3QgYWxsb2NhdGVkID0gdGZjLm9uZXNMaWtlKHgpO1xuICByZXR1cm4gbmV3IExheWVyVmFyaWFibGUoYWxsb2NhdGVkLCBkdHlwZSwgbmFtZSk7XG59XG5cbi8qKlxuICogSW5zdGFudGlhdGUgYW4gaWRlbnRpdHkgbWF0cml4IGFuZCByZXR1cm5zIGl0LCBhcyBhIFZhcmlhYmxlXG4gKlxuICogQHBhcmFtIHNpemUgTnVtYmVyIG9mIHJvd3MvY29sdW1ucy5cbiAqIEBwYXJhbSBkdHlwZSBEYXRhIHR5cGUgb2YgcmV0dXJuZWQgVmFyaWFibGUuXG4gKiBAcGFyYW0gbmFtZSBOYW1lIG9mIHJldHVybmVkIFZhcmlhYmxlLlxuICogQHJldHVybiBBIFZhcmlhYmxlLCBhbiBpZGVudGl0eSBtYXRyaXguXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleWVWYXJpYWJsZShcbiAgICBzaXplOiBudW1iZXIsIGR0eXBlPzogRGF0YVR5cGUsIG5hbWU/OiBzdHJpbmcpOiBMYXllclZhcmlhYmxlIHtcbiAgcmV0dXJuIG5ldyBMYXllclZhcmlhYmxlKHRmYy5leWUoc2l6ZSksIGR0eXBlLCBuYW1lKTtcbn1cblxuLyoqXG4gKiBHZXQgYSBWYXJpYWJsZSB3aXRoIHVuaWZvcm0gZGlzdHJpYnV0aW9uIG9mIHZhbHVlcy5cbiAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgdGVuc29yLlxuICogQHBhcmFtIG1pbnZhbCBMb3dlciBib3VuZCBvZiB0aGUgdW5pZm9ybSBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gbWF4dmFsIFVwcGVyIGJvdW5kIG9mIHRoZSB1bmlmb3JtIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBkdHlwZVxuICogQHBhcmFtIHNlZWRcbiAqIEBwYXJhbSBuYW1lIE9wdGlvbmFsIG5hbWUuXG4gKiBAcmV0dXJuIFRoZSB1bmlmb3JtLXJhbmRvbSBWYXJpYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJhbmRvbVVuaWZvcm1WYXJpYWJsZShcbiAgICBzaGFwZTogU2hhcGUsIG1pbnZhbDogbnVtYmVyLCBtYXh2YWw6IG51bWJlciwgZHR5cGU/OiBEYXRhVHlwZSxcbiAgICBzZWVkPzogbnVtYmVyLCBuYW1lID0gJ3JhbmRvbVVuaWZvcm0nKTogTGF5ZXJWYXJpYWJsZSB7XG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZShcbiAgICAgIHRmYy5yYW5kb21Vbmlmb3JtKHNoYXBlLCBtaW52YWwsIG1heHZhbCwgZHR5cGUpLCBkdHlwZSwgbmFtZSk7XG59XG5cbi8qKlxuICogR2V0IGEgVmFyaWFibGUgd2l0aCB0cnVuY2F0ZWQtbm9ybWFsIGRpc3RyaWJ1dGlvbiBvZiB2YWx1ZXMuXG4gKiBAcGFyYW0gc2hhcGUgU2hhcGUgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBtZWFuIG1lYW4gdmFsdWUgb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gc3RkZGV2IHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbm9ybWFsIGRpc3RyaWJ1dGlvbi5cbiAqIEBwYXJhbSBkdHlwZVxuICogQHBhcmFtIHNlZWRcbiAqIEBwYXJhbSBuYW1lIE9wdGlvbmFsIG5hbWUuXG4gKiBAcmV0dXJuIFRoZSB0cnVuY2F0ZWQtbm9ybWFsLXJhbmRvbSBWYXJpYWJsZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHRydW5jYXRlZE5vcm1hbFZhcmlhYmxlKFxuICAgIHNoYXBlOiBTaGFwZSwgbWVhbiA9IDAuMCwgc3RkZGV2ID0gMS4wLCBkdHlwZT86IERhdGFUeXBlLCBzZWVkPzogbnVtYmVyLFxuICAgIG5hbWUgPSAndHJ1bmNhdGVkTm9ybWFsJyk6IExheWVyVmFyaWFibGUge1xuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgbG9naWMgZm9yIGR0eXBlIGFuZCBzZWVkIG9uY2UgdGhleSBhcmUgc3VwcG9ydGVkXG4gIC8vIGJ5IGRlZXBsZWFybi5qcy5cbiAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInICYmIGR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgIGByYW5kb21Ob3JtYWwgZG9lcyBub3Qgc3VwcG9ydCBkVHlwZSAke2R0eXBlfS5gKTtcbiAgfVxuICByZXR1cm4gbmV3IExheWVyVmFyaWFibGUoXG4gICAgICB0ZmMudHJ1bmNhdGVkTm9ybWFsKHNoYXBlLCBtZWFuLCBzdGRkZXYsIGR0eXBlLCBzZWVkKSwgZHR5cGUsIG5hbWUpO1xufVxuLyoqXG4gKiBHZXQgYSBWYXJpYWJsZSB3aXRoIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgdmFsdWVzLlxuICogQHBhcmFtIHNoYXBlIFNoYXBlIG9mIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gbWVhbiBtZWFuIHZhbHVlIG9mIHRoZSBub3JtYWwgZGlzdHJpYnV0aW9uLlxuICogQHBhcmFtIHN0ZGRldiBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG5vcm1hbCBkaXN0cmlidXRpb24uXG4gKiBAcGFyYW0gZHR5cGVcbiAqIEBwYXJhbSBzZWVkXG4gKiBAcGFyYW0gbmFtZSBPcHRpb25hbCBuYW1lLlxuICogQHJldHVybiBUaGUgdHJ1bmNhdGVkLW5vcm1hbC1yYW5kb20gVmFyaWFibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByYW5kb21Ob3JtYWxWYXJpYWJsZShcbiAgICBzaGFwZTogU2hhcGUsIG1lYW4gPSAwLjAsIHN0ZGRldiA9IDEuMCwgZHR5cGU/OiBEYXRhVHlwZSwgc2VlZD86IG51bWJlcixcbiAgICBuYW1lID0gJ3JhbmRvbU5vcm1hbCcpOiBMYXllclZhcmlhYmxlIHtcbiAgZHR5cGUgPSBkdHlwZSB8fCAnZmxvYXQzMic7XG4gIGlmIChkdHlwZSAhPT0gJ2Zsb2F0MzInICYmIGR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgIGByYW5kb21Ob3JtYWxWYXJpYWJsZSBkb2VzIG5vdCBzdXBwb3J0IGRUeXBlICR7ZHR5cGV9LmApO1xuICB9XG4gIHJldHVybiBuZXcgTGF5ZXJWYXJpYWJsZShcbiAgICAgIHRmYy5yYW5kb21Ob3JtYWwoc2hhcGUsIG1lYW4sIHN0ZGRldiwgZHR5cGUsIHNlZWQpLCBkdHlwZSwgbmFtZSk7XG59XG5cbi8qKlxuICogVXBkYXRlIHRoZSB2YWx1ZSBvZiBhIFZhcmlhYmxlLlxuICogQHBhcmFtIHggVGhlIFZhcmlhYmxlIHRvIGJlIHVwZGF0ZWQuXG4gKiBAcGFyYW0geE5ldyBUaGUgbmV3IHZhbHVlIHRvIHVwZGF0ZSB0by5cbiAqIEByZXR1cm4gVGhlIFZhcmlhYmxlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGUoeDogTGF5ZXJWYXJpYWJsZSwgeE5ldzogVGVuc29yKTogTGF5ZXJWYXJpYWJsZSB7XG4gIHJldHVybiB4LndyaXRlKHhOZXcpO1xufVxuXG4vKipcbiAqIFVwZGF0ZSB0aGUgdmFsdWUgb2YgYSBWYXJpYWJsZSBieSBhZGRpbmcgYW4gaW5jcmVtZW50LlxuICogQHBhcmFtIHggVGhlIFZhcmlhYmxlIHRvIGJlIHVwZGF0ZWQuXG4gKiBAcGFyYW0gaW5jcmVtZW50IFRoZSBpbmNybWVudCB0byBhZGQgdG8gYHhgLlxuICogQHJldHVybiBUaGUgVmFyaWFibGUgdXBkYXRlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUFkZCh4OiBMYXllclZhcmlhYmxlLCBpbmNyZW1lbnQ6IFRlbnNvcik6IExheWVyVmFyaWFibGUge1xuICByZXR1cm4geC53cml0ZSh0ZmMuYWRkKHgucmVhZCgpLCBpbmNyZW1lbnQpKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHZhbHVlIG9mIGEgVmFyaWFibGUgYnkgc3VidHJhY3RpbmcgYSBkZWNyZW1lbnQuXG4gKiBAcGFyYW0geCBUaGUgVmFyaWFibGUgdG8gYmUgdXBkYXRlZC5cbiAqIEBwYXJhbSBkZWNyZW1lbnQgVGhlIGRlY3JlbWVudCB0byBzdWJ0cmFjdCBmcm9tIGB4YC5cbiAqIEByZXR1cm4gVGhlIFZhcmlhYmxlIHVwZGF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdWIoeDogTGF5ZXJWYXJpYWJsZSwgZGVjcmVtZW50OiBUZW5zb3IpOiBMYXllclZhcmlhYmxlIHtcbiAgcmV0dXJuIHgud3JpdGUodGZjLnN1Yih4LnJlYWQoKSwgZGVjcmVtZW50KSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSB2YWx1ZXMgb2YgYW4gYXJyYXkgb2YgVmFyaWFibGVzLlxuICpcbiAqIEBwYXJhbSB0ZW5zb3JzIEFuIGBBcnJheWAgb2YgYFZhcmlhYmxlYHMgdG8gZ2V0IHRoZSB2YWx1ZXMgb2YuXG4gKiBAcmV0dXJuIFRoZSB2YWx1ZXMgb2YgdGhlIGlucHV0cywgYXMgYW4gYEFycmF5YCBvZmB0Zi5UZW5zb3Jgcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoR2V0VmFsdWUoeHM6IExheWVyVmFyaWFibGVbXSk6IFRlbnNvcltdIHtcbiAgcmV0dXJuIHhzLm1hcCh4ID0+IHgucmVhZCgpKTtcbn1cblxuLyoqXG4gKiBVcGRhdGUgdGhlIHZhbHVlIG9mIG11bHRpcGxlIFZhcmlhYmxlcyBhdCBvbmNlLlxuICpcbiAqIEBwYXJhbSB2YXJpYWJsZXNBbmRWYWx1ZXMgQW4gYEFycmF5YCwgZWFjaCBlbGVtZW50IGlzIG9mIHR5cGVcbiAqICAgW1ZhcmlhYmxlLCBUZW5zb3JdLiBUaGUgZmlyc3QgaXRlbSBpcyB0aGVcbiAqICAgYFZhcmlhYmxlYCBvZiB3aGljaCB0aGUgdmFsdWUgaXMgdG8gYmUgdXBkYXRlZC4gVGhlIHNlY29uZCBpdGVtXG4gKiAgIGNhcnJpZXMgdGhlIG5ldyB2YWx1ZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoU2V0VmFsdWUoXG4gICAgdmFyaWFibGVzQW5kVmFsdWVzOiBBcnJheTxbTGF5ZXJWYXJpYWJsZSwgVGVuc29yXT4pOiB2b2lkIHtcbiAgdmFyaWFibGVzQW5kVmFsdWVzLmZvckVhY2godmFyaWFibGVBbmRWYWx1ZSA9PiB7XG4gICAgY29uc3QgdmFyaWFibGU6IExheWVyVmFyaWFibGUgPSB2YXJpYWJsZUFuZFZhbHVlWzBdO1xuICAgIHZhcmlhYmxlLndyaXRlKHZhcmlhYmxlQW5kVmFsdWVbMV0pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBncmFkaWVudHMgb2YgYHZhcmlhYmxlc2Agdy5yLnQuIHRoZSByZXR1cm4gdmFsdWUgb2YgYGxvc3NGbmAuXG4gKiBAcGFyYW0gbG9zc0ZuIEEgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhIFNjYWxhciB0byBiZSB1c2VkIGFzIHRoZSBmdW5jdGlvblxuICogICB2YWx1ZSAoaS5lLiwgbnVtZXJhdG9yKSBmb3IgZGlmZmVyZW50aWF0aW9uLlxuICogQHBhcmFtIHZhcmlhYmxlcyBMaXN0IG9mIHZhcmlhYmxlcyB0byBiZSB1c2VkIGFzIHRoZSBpbmRlcGVuZGVudCB2YXJpYWJsZXNcbiAqICAgKGkuZS4sIGRlbm9taW5hdG9yKSBmb3IgZGlmZmVyZW50aWF0aW9uLlxuICogQHJldHVybnMgQW4gQXJyYXkgb2YgZ3JhZGllbnRzIHRlbnNvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBncmFkaWVudHMoXG4gICAgbG9zc0ZuOiAoKSA9PiB0ZmMuU2NhbGFyLCB2YXJpYWJsZXM6IExheWVyVmFyaWFibGVbXSk6IFRlbnNvcltdIHtcbiAgLy8gVE9ETyhjYWlzKTogVGhlIHJldHVybiB0eXBlIHNpZ25hdHVyZSBjYW4gYmUgc2ltcGxpZmllZCBpZiBkZWVwbGVhcm4gbWFrZXNcbiAgLy8gICB0aGUgY29ycmVzcG9uZGluZyB0eXBlIHB1YmxpYy5cbiAgY29uc3QgdmFyaWFibGVMaXN0ID1cbiAgICAgIHZhcmlhYmxlcy5tYXAodmFyaWFibGUgPT4gdmFyaWFibGUucmVhZCgpIGFzIHRmYy5WYXJpYWJsZSk7XG4gIGNvbnN0IHZhbHVkQW5kR3JhZHMgPSB2YXJpYWJsZUdyYWRzKGxvc3NGbiwgdmFyaWFibGVMaXN0KTtcbiAgcmV0dXJuIHZhcmlhYmxlcy5tYXAodmFyaWFibGUgPT4gdmFsdWRBbmRHcmFkcy5ncmFkc1t2YXJpYWJsZS5uYW1lXSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/engine/topology.py */\nimport { serialization, tidy, util } from '@tensorflow/tfjs-core';\nimport { getNextUniqueTensorId, getUid } from '../backend/state';\nimport { getScopedTensorName, getUniqueTensorName, nameScope } from '../common';\nimport { AttributeError, NotImplementedError, RuntimeError, ValueError } from '../errors';\nimport { getInitializer } from '../initializers';\nimport * as generic_utils from '../utils/generic_utils';\nimport * as types_utils from '../utils/types_utils';\nimport * as variable_utils from '../utils/variable_utils';\nimport { batchGetValue, batchSetValue, LayerVariable } from '../variables';\n/**\n * Specifies the ndim, dtype and shape of every input to a layer.\n *\n * Every layer should expose (if appropriate) an `inputSpec` attribute:\n * a list of instances of InputSpec (one per input tensor).\n *\n * A null entry in a shape is compatible with any dimension,\n * a null shape is compatible with any shape.\n */\nexport class InputSpec {\n    constructor(args) {\n        this.dtype = args.dtype;\n        this.shape = args.shape;\n        /*\n          TODO(michaelterry): Could throw error if ndim and shape are both defined\n            (then backport).\n        */\n        if (args.shape != null) {\n            this.ndim = args.shape.length;\n        }\n        else {\n            this.ndim = args.ndim;\n        }\n        this.maxNDim = args.maxNDim;\n        this.minNDim = args.minNDim;\n        this.axes = args.axes || {};\n    }\n}\n/**\n * `tf.SymbolicTensor` is a placeholder for a Tensor without any concrete value.\n *\n * They are most often encountered when building a graph of `Layer`s for a\n * `tf.LayersModel` and the input data's shape, but not values are known.\n *\n * @doc {heading: 'Models', 'subheading': 'Classes'}\n */\nexport class SymbolicTensor {\n    /**\n     *\n     * @param dtype\n     * @param shape\n     * @param sourceLayer The Layer that produced this symbolic tensor.\n     * @param inputs The inputs passed to sourceLayer's __call__() method.\n     * @param nodeIndex\n     * @param tensorIndex\n     * @param callArgs The keyword arguments passed to the __call__() method.\n     * @param name\n     * @param outputTensorIndex The index of this tensor in the list of outputs\n     *   returned by apply().\n     */\n    constructor(dtype, shape, sourceLayer, inputs, callArgs, name, outputTensorIndex) {\n        this.dtype = dtype;\n        this.shape = shape;\n        this.sourceLayer = sourceLayer;\n        this.inputs = inputs;\n        this.callArgs = callArgs;\n        this.outputTensorIndex = outputTensorIndex;\n        this.id = getNextUniqueTensorId();\n        if (name != null) {\n            this.originalName = getScopedTensorName(name);\n            this.name = getUniqueTensorName(this.originalName);\n        }\n        this.rank = shape.length;\n    }\n}\nlet _nextNodeID = 0;\n/**\n * A `Node` describes the connectivity between two layers.\n *\n * Each time a layer is connected to some new input,\n * a node is added to `layer.inboundNodes`.\n *\n * Each time the output of a layer is used by another layer,\n * a node is added to `layer.outboundNodes`.\n *\n * `nodeIndices` and `tensorIndices` are basically fine-grained coordinates\n * describing the origin of the `inputTensors`, verifying the following:\n *\n * `inputTensors[i] ==\n * inboundLayers[i].inboundNodes[nodeIndices[i]].outputTensors[\n *   tensorIndices[i]]`\n *\n * A node from layer A to layer B is added to:\n *     A.outboundNodes\n *     B.inboundNodes\n */\nexport class Node {\n    constructor(args, \n    // TODO(michaelterry): Define actual type for this.\n    callArgs) {\n        this.callArgs = callArgs;\n        this.id = _nextNodeID++;\n        /*\n          Layer instance (NOT a list).\n          this is the layer that takes a list of input tensors\n          and turns them into a list of output tensors.\n          the current node will be added to\n          the inboundNodes of outboundLayer.\n        */\n        this.outboundLayer = args.outboundLayer;\n        /*\n            The following 3 properties describe where\n            the input tensors come from: which layers,\n            and for each layer, which node and which\n            tensor output of each node.\n        */\n        // List of layer instances.\n        this.inboundLayers = args.inboundLayers;\n        // List of integers, 1:1 mapping with inboundLayers.\n        this.nodeIndices = args.nodeIndices;\n        // List of integers, 1:1 mapping with inboundLayers.\n        this.tensorIndices = args.tensorIndices;\n        /*\n            Following 2 properties:\n            tensor inputs and outputs of outboundLayer.\n        */\n        // List of tensors. 1:1 mapping with inboundLayers.\n        this.inputTensors = args.inputTensors;\n        // List of tensors, created by outboundLayer.call().\n        this.outputTensors = args.outputTensors;\n        /*\n            Following 2 properties: input and output masks.\n            List of tensors, 1:1 mapping with inputTensor.\n        */\n        this.inputMasks = args.inputMasks;\n        // List of tensors, created by outboundLayer.computeMask().\n        this.outputMasks = args.outputMasks;\n        // Following 2 properties: input and output shapes.\n        // List of shape tuples, shapes of inputTensors.\n        this.inputShapes = args.inputShapes;\n        // List of shape tuples, shapes of outputTensors.\n        this.outputShapes = args.outputShapes;\n        // Add nodes to all layers involved.\n        for (const layer of args.inboundLayers) {\n            if (layer != null) {\n                layer.outboundNodes.push(this);\n            }\n        }\n        args.outboundLayer.inboundNodes.push(this);\n    }\n    getConfig() {\n        const inboundNames = [];\n        for (const layer of this.inboundLayers) {\n            if (layer != null) {\n                inboundNames.push(layer.name);\n            }\n            else {\n                inboundNames.push(null);\n            }\n        }\n        return {\n            outboundLayer: this.outboundLayer ? this.outboundLayer.name : null,\n            inboundLayers: inboundNames,\n            nodeIndices: this.nodeIndices,\n            tensorIndices: this.tensorIndices\n        };\n    }\n}\nlet _nextLayerID = 0;\n/**\n * A layer is a grouping of operations and weights that can be composed to\n * create a `tf.LayersModel`.\n *\n * Layers are constructed by using the functions under the\n * [tf.layers](#Layers-Basic) namespace.\n *\n * @doc {heading: 'Layers', subheading: 'Classes', namespace: 'layers'}\n */\nexport class Layer extends serialization.Serializable {\n    constructor(args = {}) {\n        super();\n        this._callHook = null;\n        this._addedWeightNames = [];\n        // Porting Notes: PyKeras does not have this property in this base Layer\n        //   class. Instead lets Layer subclass set it dynamically and checks the\n        //   value with `hasattr`. In tfjs-layers, we let this be a member of this\n        //   base class.\n        this._stateful = false;\n        this.id = _nextLayerID++;\n        this.activityRegularizer = null;\n        this.inputSpec = null;\n        this.supportsMasking = false;\n        // These properties will be set upon call of this.build()\n        this._trainableWeights = [];\n        this._nonTrainableWeights = [];\n        this._losses = [];\n        this._updates = [];\n        this._built = false;\n        /*\n          These lists will be filled via successive calls\n          to this.addInboundNode().\n         */\n        this.inboundNodes = [];\n        this.outboundNodes = [];\n        let name = args.name;\n        if (!name) {\n            const prefix = this.getClassName();\n            name = generic_utils.toSnakeCase(prefix) + '_' + getUid(prefix);\n        }\n        this.name = name;\n        this.trainable_ = args.trainable == null ? true : args.trainable;\n        if (args.inputShape != null || args.batchInputShape != null) {\n            /*\n              In this case we will later create an input layer\n              to insert before the current layer\n             */\n            let batchInputShape;\n            if (args.batchInputShape != null) {\n                batchInputShape = args.batchInputShape;\n            }\n            else if (args.inputShape != null) {\n                let batchSize = null;\n                if (args.batchSize != null) {\n                    batchSize = args.batchSize;\n                }\n                batchInputShape = [batchSize].concat(args.inputShape);\n            }\n            this.batchInputShape = batchInputShape;\n            // Set dtype.\n            let dtype = args.dtype;\n            if (dtype == null) {\n                dtype = args.inputDType;\n            }\n            if (dtype == null) {\n                dtype = 'float32';\n            }\n            this.dtype = dtype;\n        }\n        if (args.weights != null) {\n            this.initialWeights = args.weights;\n        }\n        else {\n            this.initialWeights = null;\n        }\n        // The value of `_refCount` is initialized to null. When the layer is used\n        // in a symbolic way for the first time, it will be set to 1.\n        this._refCount = null;\n        this.fastWeightInitDuringBuild = false;\n    }\n    /**\n     * Converts a layer and its index to a unique (immutable type) name.\n     * This function is used internally with `this.containerNodes`.\n     * @param layer The layer.\n     * @param nodeIndex The layer's position (e.g. via enumerate) in a list of\n     *   nodes.\n     *\n     * @returns The unique name.\n     */\n    static nodeKey(layer, nodeIndex) {\n        return layer.name + '_ib-' + nodeIndex.toString();\n    }\n    /**\n     * Returns this.inboundNode at index nodeIndex.\n     *\n     * Porting note: This is a replacement for _get_node_attribute_at_index()\n     * @param nodeIndex\n     * @param attrName The name of the attribute related to request for this node.\n     */\n    getNodeAtIndex(nodeIndex, attrName) {\n        if (this.inboundNodes.length === 0) {\n            throw new RuntimeError('The layer has never been called ' +\n                `and thus has no defined ${attrName}.`);\n        }\n        if (this.inboundNodes.length <= nodeIndex) {\n            throw new ValueError(`Asked to get ${attrName} at node ${nodeIndex}, ` +\n                `but the layer has only ${this.inboundNodes.length} inbound nodes.`);\n        }\n        return this.inboundNodes[nodeIndex];\n    }\n    /**\n     * Retrieves the input tensor(s) of a layer at a given node.\n     *\n     * @param nodeIndex Integer, index of the node from which to retrieve the\n     *   attribute. E.g. `nodeIndex=0` will correspond to the first time the layer\n     *   was called.\n     *\n     * @return A tensor (or list of tensors if the layer has multiple inputs).\n     */\n    getInputAt(nodeIndex) {\n        return generic_utils.singletonOrArray(this.getNodeAtIndex(nodeIndex, 'input').inputTensors);\n    }\n    /**\n     * Retrieves the output tensor(s) of a layer at a given node.\n     *\n     * @param nodeIndex Integer, index of the node from which to retrieve the\n     *   attribute. E.g. `nodeIndex=0` will correspond to the first time the layer\n     *   was called.\n     *\n     * @return A tensor (or list of tensors if the layer has multiple outputs).\n     */\n    getOutputAt(nodeIndex) {\n        return generic_utils.singletonOrArray(this.getNodeAtIndex(nodeIndex, 'output').outputTensors);\n    }\n    // Properties\n    /**\n     * Retrieves the input tensor(s) of a layer.\n     *\n     * Only applicable if the layer has exactly one inbound node,\n     * i.e. if it is connected to one incoming layer.\n     *\n     * @return Input tensor or list of input tensors.\n     *\n     * @exception AttributeError if the layer is connected to more than one\n     *   incoming layers.\n     */\n    get input() {\n        if (this.inboundNodes.length > 1) {\n            throw new AttributeError(`Layer ${this.name}` +\n                ' has multiple inbound nodes, ' +\n                'hence the notion of \"layer input\" ' +\n                'is ill-defined. ' +\n                'Use `getInputAt(nodeIndex)` instead.');\n        }\n        else if (this.inboundNodes.length === 0) {\n            throw new AttributeError(`Layer ${this.name}` +\n                ' is not connected, no input to return.');\n        }\n        return generic_utils.singletonOrArray(this.getNodeAtIndex(0, 'input').inputTensors);\n    }\n    /**\n     * Retrieves the output tensor(s) of a layer.\n     *\n     * Only applicable if the layer has exactly one inbound node,\n     * i.e. if it is connected to one incoming layer.\n     *\n     * @return Output tensor or list of output tensors.\n     *\n     * @exception AttributeError if the layer is connected to more than one\n     *   incoming layers.\n     */\n    get output() {\n        if (this.inboundNodes.length === 0) {\n            throw new AttributeError(`Layer ${this.name}` +\n                ' has no inbound nodes.');\n        }\n        if (this.inboundNodes.length > 1) {\n            throw new AttributeError(`Layer ${this.name}` +\n                ' has multiple inbound nodes, ' +\n                'hence the notion of \"layer output\" ' +\n                'is ill-defined. ' +\n                'Use `getOutputAt(nodeIndex)` instead.');\n        }\n        return generic_utils.singletonOrArray(this.getNodeAtIndex(0, 'output').outputTensors);\n    }\n    get losses() {\n        return this._losses;\n    }\n    /**\n     * Retrieves the Layer's current loss values.\n     *\n     * Used for regularizers during training.\n     */\n    calculateLosses() {\n        // Porting Node: This is an augmentation to Layer.loss in PyKeras.\n        //   In PyKeras, Layer.loss returns symbolic tensors. Here a concrete\n        //   Tensor (specifically Scalar) values are returned. This is due to the\n        //   imperative backend.\n        return this.losses.map(lossFn => lossFn());\n    }\n    get updates() {\n        return this._updates;\n    }\n    get built() {\n        return this._built;\n    }\n    set built(built) {\n        this._built = built;\n    }\n    get trainable() {\n        return this.trainable_;\n    }\n    set trainable(trainable) {\n        this._trainableWeights.forEach(w => w.trainable = trainable);\n        this.trainable_ = trainable;\n    }\n    get trainableWeights() {\n        if (this.trainable_) {\n            return this._trainableWeights.filter(w => w.trainable);\n        }\n        else {\n            return [];\n        }\n    }\n    set trainableWeights(weights) {\n        this._trainableWeights = weights;\n    }\n    get nonTrainableWeights() {\n        if (this.trainable) {\n            return this._trainableWeights.filter(w => !w.trainable)\n                .concat(this._nonTrainableWeights);\n        }\n        else {\n            return this._trainableWeights.concat(this._nonTrainableWeights);\n        }\n    }\n    set nonTrainableWeights(weights) {\n        this._nonTrainableWeights = weights;\n    }\n    /**\n     * The concatenation of the lists trainableWeights and nonTrainableWeights\n     * (in this order).\n     */\n    get weights() {\n        return this.trainableWeights.concat(this.nonTrainableWeights);\n    }\n    get stateful() {\n        return this._stateful;\n    }\n    /**\n     * Reset the states of the layer.\n     *\n     * This method of the base Layer class is essentially a no-op.\n     * Subclasses that are stateful (e.g., stateful RNNs) should override this\n     * method.\n     */\n    resetStates() {\n        if (!this.stateful) {\n            throw new Error('Cannot call the resetStates() method of a non-stateful Layer ' +\n                'object.');\n        }\n    }\n    /**\n     * Checks compatibility between the layer and provided inputs.\n     *\n     * This checks that the tensor(s) `input`\n     * verify the input assumptions of the layer\n     * (if any). If not, exceptions are raised.\n     *\n     * @param inputs Input tensor or list of input tensors.\n     *\n     * @exception ValueError in case of mismatch between\n     *   the provided inputs and the expectations of the layer.\n     */\n    assertInputCompatibility(inputs) {\n        inputs = generic_utils.toList(inputs);\n        if (this.inputSpec == null || this.inputSpec.length === 0) {\n            return;\n        }\n        const inputSpec = generic_utils.toList(this.inputSpec);\n        if (inputs.length !== inputSpec.length) {\n            throw new ValueError(`Layer ${this.name} expects ${inputSpec.length} inputs, ` +\n                `but it received ${inputs.length} input tensors. ` +\n                `Input received: ${inputs}`);\n        }\n        for (let inputIndex = 0; inputIndex < inputs.length; inputIndex++) {\n            const x = inputs[inputIndex];\n            const spec = inputSpec[inputIndex];\n            if (spec == null) {\n                continue;\n            }\n            // Check ndim.\n            const ndim = x.rank;\n            if (spec.ndim != null) {\n                if (ndim !== spec.ndim) {\n                    throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name}: ` +\n                        `expected ndim=${spec.ndim}, found ndim=${ndim}`);\n                }\n            }\n            if (spec.maxNDim != null) {\n                if (ndim > spec.maxNDim) {\n                    throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name}` +\n                        `: expected max_ndim=${spec.maxNDim}, found ndim=${ndim}`);\n                }\n            }\n            if (spec.minNDim != null) {\n                if (ndim < spec.minNDim) {\n                    throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name}` +\n                        `: expected min_ndim=${spec.minNDim}, found ndim=${ndim}.`);\n                }\n            }\n            // Check dtype.\n            if (spec.dtype != null) {\n                if (x.dtype !== spec.dtype) {\n                    throw new ValueError(`Input ${inputIndex} is incompatible with layer ${this.name} ` +\n                        `: expected dtype=${spec.dtype}, found dtype=${x.dtype}.`);\n                }\n            }\n            // Check specific shape axes.\n            if (spec.axes) {\n                const xShape = x.shape;\n                for (const key in spec.axes) {\n                    const axis = Number(key);\n                    const value = spec.axes[key];\n                    // Perform Python-style slicing in case axis < 0;\n                    // TODO(cais): Use https://github.com/alvivi/typescript-underscore to\n                    // ensure type safety through Underscore calls.\n                    const xShapeAtAxis = axis >= 0 ? xShape[axis] : xShape[xShape.length + axis];\n                    if (value != null && [value, null].indexOf(xShapeAtAxis) === -1) {\n                        throw new ValueError(`Input ${inputIndex} is incompatible with layer ` +\n                            `${this.name}: expected axis ${axis} of input shape to ` +\n                            `have value ${value} but got shape ${xShape}.`);\n                    }\n                }\n            }\n            // Check shape.\n            if (spec.shape != null) {\n                for (let i = 0; i < spec.shape.length; ++i) {\n                    const specDim = spec.shape[i];\n                    const dim = x.shape[i];\n                    if (specDim != null && dim != null) {\n                        if (specDim !== dim) {\n                            throw new ValueError(`Input ${inputIndex} is incompatible with layer ` +\n                                `${this.name}: expected shape=${spec.shape}, ` +\n                                `found shape=${x.shape}.`);\n                        }\n                    }\n                }\n            }\n        }\n    }\n    /**\n     * This is where the layer's logic lives.\n     *\n     * @param inputs Input tensor, or list/tuple of input tensors.\n     * @param kwargs Additional keyword arguments.\n     *\n     * @return A tensor or list/tuple of tensors.\n     */\n    call(inputs, kwargs) {\n        return inputs;\n    }\n    invokeCallHook(inputs, kwargs) {\n        if (this._callHook != null) {\n            this._callHook(inputs, kwargs);\n        }\n    }\n    /**\n     * Set call hook.\n     * This is currently used for testing only.\n     * @param callHook\n     */\n    setCallHook(callHook) {\n        this._callHook = callHook;\n    }\n    /**\n     * Clear call hook.\n     * This is currently used for testing only.\n     */\n    clearCallHook() {\n        this._callHook = null;\n    }\n    /**\n     * Builds or executes a `Layer`'s logic.\n     *\n     * When called with `tf.Tensor`(s), execute the `Layer`'s computation and\n     * return Tensor(s). For example:\n     *\n     * ```js\n     * const denseLayer = tf.layers.dense({\n     *   units: 1,\n     *   kernelInitializer: 'zeros',\n     *   useBias: false\n     * });\n     *\n     * // Invoke the layer's apply() method with a `tf.Tensor` (with concrete\n     * // numeric values).\n     * const input = tf.ones([2, 2]);\n     * const output = denseLayer.apply(input);\n     *\n     * // The output's value is expected to be [[0], [0]], due to the fact that\n     * // the dense layer has a kernel initialized to all-zeros and does not have\n     * // a bias.\n     * output.print();\n     * ```\n     *\n     * When called with `tf.SymbolicTensor`(s), this will prepare the layer for\n     * future execution.  This entails internal book-keeping on shapes of\n     * expected Tensors, wiring layers together, and initializing weights.\n     *\n     * Calling `apply` with `tf.SymbolicTensor`s are typically used during the\n     * building of non-`tf.Sequential` models. For example:\n     *\n     * ```js\n     * const flattenLayer = tf.layers.flatten();\n     * const denseLayer = tf.layers.dense({units: 1});\n     *\n     * // Use tf.layers.input() to obtain a SymbolicTensor as input to apply().\n     * const input = tf.input({shape: [2, 2]});\n     * const output1 = flattenLayer.apply(input);\n     *\n     * // output1.shape is [null, 4]. The first dimension is the undetermined\n     * // batch size. The second dimension comes from flattening the [2, 2]\n     * // shape.\n     * console.log(JSON.stringify(output1.shape));\n     *\n     * // The output SymbolicTensor of the flatten layer can be used to call\n     * // the apply() of the dense layer:\n     * const output2 = denseLayer.apply(output1);\n     *\n     * // output2.shape is [null, 1]. The first dimension is the undetermined\n     * // batch size. The second dimension matches the number of units of the\n     * // dense layer.\n     * console.log(JSON.stringify(output2.shape));\n     *\n     * // The input and output can be used to construct a model that consists\n     * // of the flatten and dense layers.\n     * const model = tf.model({inputs: input, outputs: output2});\n     * ```\n     *\n     * @param inputs a `tf.Tensor` or `tf.SymbolicTensor` or an Array of them.\n     * @param kwargs Additional keyword arguments to be passed to `call()`.\n     *\n     * @return Output of the layer's `call` method.\n     *\n     * @exception ValueError error in case the layer is missing shape information\n     *   for its `build` call.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    // Porting Note: This is a replacement for __call__() in Python.\n    apply(inputs, kwargs) {\n        kwargs = kwargs || {};\n        this.assertNotDisposed();\n        // Ensure inputs are all the same type.\n        const inputsList = generic_utils.toList(inputs);\n        let allAreSymbolic = true;\n        for (const input of inputsList) {\n            if (!(input instanceof SymbolicTensor)) {\n                allAreSymbolic = false;\n                break;\n            }\n        }\n        let noneAreSymbolic = true;\n        for (const input of inputsList) {\n            if (input instanceof SymbolicTensor) {\n                noneAreSymbolic = false;\n                break;\n            }\n        }\n        if (allAreSymbolic === noneAreSymbolic) {\n            throw new ValueError('Arguments to apply() must be all ' +\n                'SymbolicTensors or all Tensors');\n        }\n        // TODO(michaelterry): nameScope() may not be necessary.\n        return nameScope(this.name, () => {\n            // Handle laying building (weight creating, input spec locking).\n            if (!this.built) {\n                /*\n                  Throw exceptions in case the input is not compatible\n                  with the inputSpec specified in the layer constructor.\n                 */\n                this.assertInputCompatibility(inputs);\n                // Collect input shapes to build layer.\n                const inputShapes = [];\n                for (const xElem of generic_utils.toList(inputs)) {\n                    inputShapes.push(xElem.shape);\n                }\n                this.build(generic_utils.singletonOrArray(inputShapes));\n                this.built = true;\n                // Load weights that were specified at layer instantiation.\n                if (this.initialWeights) {\n                    this.setWeights(this.initialWeights);\n                }\n                if (this._refCount === null && noneAreSymbolic) {\n                    // The first use of this layer is a non-symbolic call, set ref count\n                    // to 1 so the Layer can be properly disposed if its dispose() method\n                    // is called.\n                    this._refCount = 1;\n                }\n            }\n            /*\n              Throw exceptions in case the input is not compatible\n              with the inputSpec set at build time.\n            */\n            this.assertInputCompatibility(inputs);\n            // Handle mask propagation.\n            // TODO(michaelterry): Mask propagation not currently implemented.\n            // Actually call the layer, collecting output(s), mask(s), and shape(s).\n            if (noneAreSymbolic) {\n                let output = this.call(inputs, kwargs);\n                // TODO(michaelterry): Compute the outputMask\n                // If the layer returns tensors from its inputs, unmodified,\n                // we copy them to avoid loss of tensor metadata.\n                const outputList = generic_utils.toList(output);\n                const outputListCopy = [];\n                // TODO(michaelterry): This copying may not be necessary given our eager\n                // backend.\n                for (let x of outputList) {\n                    if (inputsList.indexOf(x) !== -1) {\n                        x = x.clone();\n                    }\n                    outputListCopy.push(x);\n                }\n                output = generic_utils.singletonOrArray(outputListCopy);\n                if (this.activityRegularizer != null) {\n                    throw new NotImplementedError('Layer invocation in the presence of activity ' +\n                        'regularizer(s) is not supported yet.');\n                }\n                // TODO(michaelterry): Call addInboundNode()?\n                return output;\n            }\n            else {\n                const inputShape = collectInputShape(inputs);\n                const outputShape = this.computeOutputShape(inputShape);\n                let output;\n                const outputDType = guessOutputDType(inputs);\n                this.warnOnIncompatibleInputShape(Array.isArray(inputs) ? inputShape[0] :\n                    inputShape);\n                if (outputShape != null && outputShape.length > 0 &&\n                    Array.isArray(outputShape[0])) {\n                    // We have multiple output shapes. Create multiple output tensors.\n                    output = outputShape\n                        .map((shape, index) => new SymbolicTensor(outputDType, shape, this, generic_utils.toList(inputs), kwargs, this.name, index));\n                }\n                else {\n                    output = new SymbolicTensor(outputDType, outputShape, this, generic_utils.toList(inputs), kwargs, this.name);\n                }\n                /*\n                  Add an inbound node to the layer, so that it keeps track\n                  of the call and of all new variables created during the call.\n                  This also updates the layer history of the output tensor(s).\n                  If the input tensor(s) had no previous history,\n                  this does nothing.\n                */\n                this.addInboundNode(inputs, output, null, null, inputShape, outputShape, kwargs);\n                this._refCount++;\n                if (this.activityRegularizer != null) {\n                    throw new NotImplementedError('Layer invocation in the presence of activity ' +\n                        'regularizer(s) is not supported yet.');\n                }\n                return output;\n            }\n        });\n    }\n    /**\n     * Check compatibility between input shape and this layer's batchInputShape.\n     *\n     * Print warning if any incompatibility is found.\n     *\n     * @param inputShape Input shape to be checked.\n     */\n    warnOnIncompatibleInputShape(inputShape) {\n        if (this.batchInputShape == null) {\n            return;\n        }\n        else if (inputShape.length !== this.batchInputShape.length) {\n            console.warn(`The rank of the input tensor provided (shape: ` +\n                `${JSON.stringify(inputShape)}) does not match that of the ` +\n                `batchInputShape (${JSON.stringify(this.batchInputShape)}) ` +\n                `of the layer ${this.name}`);\n        }\n        else {\n            let dimMismatch = false;\n            this.batchInputShape.forEach((dimension, i) => {\n                if (dimension != null && inputShape[i] != null &&\n                    inputShape[i] !== dimension) {\n                    dimMismatch = true;\n                }\n            });\n            if (dimMismatch) {\n                console.warn(`The shape of the input tensor ` +\n                    `(${JSON.stringify(inputShape)}) does not ` +\n                    `match the expectation of layer ${this.name}: ` +\n                    `${JSON.stringify(this.batchInputShape)}`);\n            }\n        }\n    }\n    /**\n     * Retrieves the output shape(s) of a layer.\n     *\n     * Only applicable if the layer has only one inbound node, or if all inbound\n     * nodes have the same output shape.\n     *\n     * @returns Output shape or shapes.\n     * @throws AttributeError: if the layer is connected to more than one incoming\n     *   nodes.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    get outputShape() {\n        if (this.inboundNodes == null || this.inboundNodes.length === 0) {\n            throw new AttributeError(`The layer ${this.name} has never been called and thus has no ` +\n                `defined output shape.`);\n        }\n        const allOutputShapes = [];\n        for (const node of this.inboundNodes) {\n            const shapeString = JSON.stringify(node.outputShapes);\n            if (allOutputShapes.indexOf(shapeString) === -1) {\n                allOutputShapes.push(shapeString);\n            }\n        }\n        if (allOutputShapes.length === 1) {\n            const outputShapes = this.inboundNodes[0].outputShapes;\n            if (Array.isArray(outputShapes) && Array.isArray(outputShapes[0]) &&\n                outputShapes.length === 1) {\n                return outputShapes[0];\n            }\n            else {\n                return outputShapes;\n            }\n        }\n        else {\n            throw new AttributeError(`The layer ${this.name} has multiple inbound nodes with different ` +\n                `output shapes. Hence the notion of \"output shape\" is ill-defined ` +\n                `for the layer.`);\n            // TODO(cais): Implement getOutputShapeAt().\n        }\n    }\n    /**\n     * Counts the total number of numbers (e.g., float32, int32) in the\n     * weights.\n     *\n     * @returns An integer count.\n     * @throws RuntimeError: If the layer is not built yet (in which case its\n     *   weights are not defined yet.)\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    countParams() {\n        if (!this.built) {\n            throw new RuntimeError(`You tried to call countParams() on ${this.name}, ` +\n                `but the layer is not built yet. Build it first by calling ` +\n                `build(batchInputShape).`);\n        }\n        return variable_utils.countParamsInWeights(this.weights);\n    }\n    /**\n     * Creates the layer weights.\n     *\n     * Must be implemented on all layers that have weights.\n     *\n     * Called when apply() is called to construct the weights.\n     *\n     * @param inputShape A `Shape` or array of `Shape` (unused).\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    build(inputShape) {\n        this.built = true;\n    }\n    /**\n     * Returns the current values of the weights of the layer.\n     *\n     * @param trainableOnly Whether to get the values of only trainable weights.\n     * @returns Weight values as an `Array` of `tf.Tensor`s.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    getWeights(trainableOnly = false) {\n        return batchGetValue(trainableOnly ? this.trainableWeights : this.weights);\n    }\n    /**\n     * Sets the weights of the layer, from Tensors.\n     *\n     * @param weights a list of Tensors. The number of arrays and their shape\n     *   must match number of the dimensions of the weights of the layer (i.e.\n     *   it should match the output of `getWeights`).\n     *\n     * @exception ValueError If the provided weights list does not match the\n     *   layer's specifications.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    setWeights(weights) {\n        tidy(() => {\n            const params = this.weights;\n            if (params.length !== weights.length) {\n                // TODO(cais): Restore the following and use `providedWeights`, instead\n                // of `weights` in the error message, once the deeplearn.js bug is\n                // fixed: https://github.com/PAIR-code/deeplearnjs/issues/498 const\n                // providedWeights = JSON.stringify(weights).slice(0, 50);\n                throw new ValueError(`You called setWeights(weights) on layer \"${this.name}\" ` +\n                    `with a weight list of length ${weights.length}, ` +\n                    `but the layer was expecting ${params.length} weights. ` +\n                    `Provided weights: ${weights}...`);\n            }\n            if (params.length === 0) {\n                return;\n            }\n            const weightValueTuples = [];\n            const paramValues = batchGetValue(params);\n            for (let i = 0; i < paramValues.length; ++i) {\n                const pv = paramValues[i];\n                const p = params[i];\n                const w = weights[i];\n                if (!util.arraysEqual(pv.shape, w.shape)) {\n                    throw new ValueError(`Layer weight shape ${pv.shape} ` +\n                        `not compatible with provided weight shape ${w.shape}`);\n                }\n                weightValueTuples.push([p, w]);\n            }\n            batchSetValue(weightValueTuples);\n        });\n    }\n    /**\n     * Adds a weight variable to the layer.\n     *\n     * @param name Name of the new weight variable.\n     * @param shape The shape of the weight.\n     * @param dtype The dtype of the weight.\n     * @param initializer An initializer instance.\n     * @param regularizer A regularizer instance.\n     * @param trainable Whether the weight should be trained via backprop or not\n     *   (assuming that the layer itself is also trainable).\n     * @param constraint An optional trainable.\n     * @return The created weight variable.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    addWeight(name, shape, dtype, initializer, regularizer, trainable, constraint, getInitializerFunc) {\n        // Reject duplicate weight names.\n        if (this._addedWeightNames.indexOf(name) !== -1) {\n            throw new ValueError(`Duplicate weight name ${name} for layer ${this.name}`);\n        }\n        this._addedWeightNames.push(name);\n        if (dtype == null) {\n            dtype = 'float32';\n        }\n        if (this.fastWeightInitDuringBuild) {\n            initializer = getInitializerFunc != null ? getInitializerFunc() :\n                getInitializer('zeros');\n        }\n        const initValue = initializer.apply(shape, dtype);\n        const weight = new LayerVariable(initValue, dtype, name, trainable, constraint);\n        initValue.dispose();\n        // Request backend not to dispose the weights of the model on scope() exit.\n        if (regularizer != null) {\n            this.addLoss(() => regularizer.apply(weight.read()));\n        }\n        if (trainable == null) {\n            trainable = true;\n        }\n        if (trainable) {\n            this._trainableWeights.push(weight);\n        }\n        else {\n            this._nonTrainableWeights.push(weight);\n        }\n        return weight;\n    }\n    /**\n     * Set the fast-weight-initialization flag.\n     *\n     * In cases where the initialized weight values will be immediately\n     * overwritten by loaded weight values during model loading, setting\n     * the flag to `true` saves unnecessary calls to potentially expensive\n     * initializers and speeds up the loading process.\n     *\n     * @param value Target value of the flag.\n     */\n    setFastWeightInitDuringBuild(value) {\n        this.fastWeightInitDuringBuild = value;\n    }\n    /**\n     * Add losses to the layer.\n     *\n     * The loss may potentially be conditional on some inputs tensors,\n     * for instance activity losses are conditional on the layer's inputs.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    addLoss(losses) {\n        if (losses == null || Array.isArray(losses) && losses.length === 0) {\n            return;\n        }\n        // Update this.losses\n        losses = generic_utils.toList(losses);\n        if (this._losses !== undefined && this._losses !== null) {\n            this.losses.push(...losses);\n        }\n    }\n    /**\n     * Computes the output shape of the layer.\n     *\n     * Assumes that the layer will be built to match that input shape provided.\n     *\n     * @param inputShape A shape (tuple of integers) or a list of shape tuples\n     *   (one per output tensor of the layer). Shape tuples can include null for\n     *   free dimensions, instead of an integer.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    /**\n     * Computes an output mask tensor.\n     *\n     * @param inputs Tensor or list of tensors.\n     * @param mask Tensor or list of tensors.\n     *\n     * @return null or a tensor (or list of tensors, one per output tensor of the\n     * layer).\n     */\n    computeMask(inputs, mask) {\n        if (!this.supportsMasking) {\n            if (mask != null) {\n                if (Array.isArray(mask)) {\n                    mask.forEach(maskElement => {\n                        if (maskElement != null) {\n                            throw new TypeError(`Layer ${this.name} does not support masking, ` +\n                                'but was passed an inputMask.');\n                        }\n                    });\n                }\n                else {\n                    throw new TypeError(`Layer ${this.name} does not support masking, ` +\n                        'but was passed an inputMask.');\n                }\n            }\n            // masking not explicitly supported: return null as mask\n            return null;\n        }\n        // if masking is explictly supported, by default\n        // carry over the input mask\n        return mask;\n    }\n    /**\n     * Internal method to create an inbound node for the layer.\n     *\n     * @param inputTensors List of input tensors.\n     * @param outputTensors List of output tensors.\n     * @param inputMasks List of input masks (a mask can be a tensor, or null).\n     * @param outputMasks List of output masks (a mask can be a tensor, or null).\n     * @param inputShapes List of input shape tuples.\n     * @param outputShapes List of output shape tuples.\n     * @param kwargs Dictionary of keyword arguments that were passed to the\n     *   `call` method of the layer at the call that created the node.\n     */\n    addInboundNode(inputTensors, outputTensors, inputMasks, outputMasks, inputShapes, outputShapes, kwargs = null) {\n        const inputTensorList = generic_utils.toList(inputTensors);\n        outputTensors = generic_utils.toList(outputTensors);\n        inputMasks = generic_utils.toList(inputMasks);\n        outputMasks = generic_utils.toList(outputMasks);\n        inputShapes = types_utils.normalizeShapeList(inputShapes);\n        outputShapes = types_utils.normalizeShapeList(outputShapes);\n        // Collect input tensor(s) coordinates.\n        const inboundLayers = [];\n        const nodeIndices = [];\n        const tensorIndices = [];\n        for (const x of inputTensorList) {\n            /*\n             * TODO(michaelterry): Keras adds this value to tensors; it's not\n             * clear whether we'll use this or not.\n             */\n            inboundLayers.push(x.sourceLayer);\n            nodeIndices.push(x.nodeIndex);\n            tensorIndices.push(x.tensorIndex);\n        }\n        // Create node, add it to inbound nodes.\n        // (This call has side effects.)\n        // tslint:disable-next-line:no-unused-expression\n        new Node({\n            outboundLayer: this,\n            inboundLayers,\n            nodeIndices,\n            tensorIndices,\n            inputTensors: inputTensorList,\n            outputTensors,\n            inputMasks,\n            outputMasks,\n            inputShapes,\n            outputShapes\n        }, kwargs);\n        // Update tensor history\n        for (let i = 0; i < outputTensors.length; i++) {\n            // TODO(michaelterry: _uses_learning_phase not tracked.\n            outputTensors[i].sourceLayer = this;\n            outputTensors[i].nodeIndex = this.inboundNodes.length - 1;\n            outputTensors[i].tensorIndex = i;\n        }\n    }\n    /**\n     * Returns the config of the layer.\n     *\n     * A layer config is a TS dictionary (serializable)\n     * containing the configuration of a layer.\n     * The same layer can be reinstantiated later\n     * (without its trained weights) from this configuration.\n     *\n     * The config of a layer does not include connectivity\n     * information, nor the layer class name.  These are handled\n     * by 'Container' (one layer of abstraction above).\n     *\n     * Porting Note: The TS dictionary follows TS naming standards for\n     * keys, and uses tfjs-layers type-safe Enums.  Serialization methods\n     * should use a helper function to convert to the pythonic storage\n     * standard. (see serialization_utils.convertTsToPythonic)\n     *\n     * @returns TS dictionary of configuration.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    getConfig() {\n        const config = { name: this.name, trainable: this.trainable };\n        if (this.batchInputShape != null) {\n            config['batchInputShape'] = this.batchInputShape;\n        }\n        if (this.dtype != null) {\n            config['dtype'] = this.dtype;\n        }\n        return config;\n    }\n    /**\n     * Dispose the weight variables that this Layer instance holds.\n     *\n     * @returns {number} Number of disposed variables.\n     */\n    disposeWeights() {\n        this.weights.forEach(weight => weight.dispose());\n        return this.weights.length;\n    }\n    assertNotDisposed() {\n        if (this._refCount === 0) {\n            throw new Error(`Layer '${this.name}' is already disposed.`);\n        }\n    }\n    /**\n     * Attempt to dispose layer's weights.\n     *\n     * This method decreases the reference count of the Layer object by 1.\n     *\n     * A Layer is reference-counted. Its reference count is incremented by 1\n     * the first item its `apply()` method is called and when it becomes a part\n     * of a new `Node` (through calling the `apply()` method on a\n     * `tf.SymbolicTensor`).\n     *\n     * If the reference count of a Layer becomes 0, all the weights will be\n     * disposed and the underlying memory (e.g., the textures allocated in WebGL)\n     * will be freed.\n     *\n     * Note: If the reference count is greater than 0 after the decrement, the\n     * weights of the Layer will *not* be disposed.\n     *\n     * After a Layer is disposed, it cannot be used in calls such as `apply()`,\n     * `getWeights()` or `setWeights()` anymore.\n     *\n     * @returns A DisposeResult Object with the following fields:\n     *   - refCountAfterDispose: The reference count of the Container after this\n     *     `dispose()` call.\n     *   - numDisposedVariables: Number of `tf.Variable`s (i.e., weights) disposed\n     *     during this `dispose()` call.\n     * @throws {Error} If the layer is not built yet, or if the layer has already\n     *   been disposed.\n     *\n     * @doc {heading: 'Models', 'subheading': 'Classes'}\n     */\n    dispose() {\n        if (!this.built) {\n            throw new Error(`Cannot dispose Layer ${this.name} because it has not been ` +\n                `built yet.`);\n        }\n        if (this._refCount === null) {\n            throw new Error(`Cannot dispose Layer ${this.name} because it has not been used ` +\n                `yet.`);\n        }\n        this.assertNotDisposed();\n        let numDisposedVariables = 0;\n        if (--this._refCount === 0) {\n            numDisposedVariables = this.disposeWeights();\n        }\n        return { refCountAfterDispose: this._refCount, numDisposedVariables };\n    }\n}\n/**\n * Collects the input shape(s) of a list of `tf.Tensor`s or\n * `tf.SymbolicTensor`s.\n *\n * TODO(michaelterry): Update PyKeras docs (backport).\n *\n * @param inputTensors List of input tensors (or single input tensor).\n *\n * @return List of shape tuples (or single tuple), one tuple per input.\n */\nfunction collectInputShape(inputTensors) {\n    inputTensors =\n        generic_utils.toList(inputTensors);\n    const shapes = [];\n    for (const x of inputTensors) {\n        shapes.push(x.shape);\n    }\n    return generic_utils.singletonOrArray(shapes);\n}\n/**\n * Guesses output dtype based on inputs.\n *\n * At present, just returns 'float32' for any input.\n *\n * @param inputTensors List of input tensors (or single input tensor).\n *\n * @return The guessed DType. At present, always returns 'float32'.\n */\nfunction guessOutputDType(inputTensors) {\n    return 'float32';\n}\n/**\n * Returns the list of input tensors necessary to compute `tensor`.\n *\n * Output will always be a list of tensors (potentially with 1 element).\n *\n * @param tensor The tensor to start from.\n * @param layer Origin layer of the tensor.\n * @param nodeIndex Origin node index of the tensor.\n *\n * @return Array of input tensors.\n */\nexport function getSourceInputs(tensor, layer, nodeIndex) {\n    if (layer == null || (nodeIndex != null && nodeIndex > 0)) {\n        layer = tensor.sourceLayer;\n        nodeIndex = tensor.nodeIndex;\n    }\n    if (layer.inboundNodes.length === 0) {\n        return [tensor];\n    }\n    else {\n        const node = layer.inboundNodes[nodeIndex];\n        if (node.inboundLayers.length === 0) {\n            return node.inputTensors;\n        }\n        else {\n            const sourceTensors = [];\n            for (let i = 0; i < node.inboundLayers.length; i++) {\n                const x = node.inputTensors[i];\n                const layer = node.inboundLayers[i];\n                const nodeIndex = node.nodeIndices[i];\n                const previousSources = getSourceInputs(x, layer, nodeIndex);\n                // Avoid input redundancy.\n                for (const x of previousSources) {\n                    if (sourceTensors.indexOf(x) === -1) {\n                        sourceTensors.push(x);\n                    }\n                }\n            }\n            return sourceTensors;\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wb2xvZ3kuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL3RvcG9sb2d5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsK0NBQStDO0FBRS9DLE9BQU8sRUFBbUIsYUFBYSxFQUFVLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRixPQUFPLEVBQUMscUJBQXFCLEVBQUUsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLG1CQUFtQixFQUFFLFNBQVMsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUU5RSxPQUFPLEVBQUMsY0FBYyxFQUFFLG1CQUFtQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDeEYsT0FBTyxFQUFDLGNBQWMsRUFBYyxNQUFNLGlCQUFpQixDQUFDO0FBSTVELE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEtBQUssY0FBYyxNQUFNLHlCQUF5QixDQUFDO0FBQzFELE9BQU8sRUFBQyxhQUFhLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQXVCekU7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLE9BQU8sU0FBUztJQWNwQixZQUFZLElBQW1CO1FBQzdCLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUN4QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDeEI7OztVQUdFO1FBQ0YsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN0QixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFD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LEVBQUU7WUFDbkMsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDO1NBQzFCO2FBQU07WUFDTCxNQUFNLGFBQWEsR0FBcUIsRUFBRSxDQUFDO1lBQzNDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEQsTUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDL0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDcEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxlQUFlLEdBQUcsZUFBZSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7Z0JBQzdELDBCQUEwQjtnQkFDMUIsS0FBSyxNQUFNLENBQUMsSUFBSSxlQUFlLEVBQUU7b0JBQy9CLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRTt3QkFDbkMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztxQkFDdkI7aUJBQ0Y7YUFDRjtZQUNELE9BQU8sYUFBYSxDQUFDO1NBQ3RCO0tBQ0Y7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9lbmdpbmUvdG9wb2xvZ3kucHkgKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgU2NhbGFyLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0TmV4dFVuaXF1ZVRlbnNvcklkLCBnZXRVaWR9IGZyb20gJy4uL2JhY2tlbmQvc3RhdGUnO1xuaW1wb3J0IHtnZXRTY29wZWRUZW5zb3JOYW1lLCBnZXRVbmlxdWVUZW5zb3JOYW1lLCBuYW1lU2NvcGV9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge0NvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7QXR0cmlidXRlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IsIFJ1bnRpbWVFcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7Z2V0SW5pdGlhbGl6ZXIsIEluaXRpYWxpemVyfSBmcm9tICcuLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge1JlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3MsIFJlZ3VsYXJpemVyRm59IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQgKiBhcyB0eXBlc191dGlscyBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5pbXBvcnQgKiBhcyB2YXJpYWJsZV91dGlscyBmcm9tICcuLi91dGlscy92YXJpYWJsZV91dGlscyc7XG5pbXBvcnQge2JhdGNoR2V0VmFsdWUsIGJhdGNoU2V0VmFsdWUsIExheWVyVmFyaWFibGV9IGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5cbi8vIFRPRE8obWljaGFlbHRlcnJ5KTogVGhpcyBpcyBhIHN0dWIgdW50aWwgaXQncyBkZWZpbmVkLlxuZXhwb3J0IHR5cGUgT3AgPSAoeDogTGF5ZXJWYXJpYWJsZSkgPT4gTGF5ZXJWYXJpYWJsZTtcblxuLyoqXG4gKiBDb25zdHJ1Y3RvciBhcmd1bWVudHMgZm9yIElucHV0U3BlYy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dFNwZWNBcmdzIHtcbiAgLyoqIEV4cGVjdGVkIGRhdGF0eXBlIG9mIHRoZSBpbnB1dC4gKi9cbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqIEV4cGVjdGVkIHNoYXBlIG9mIHRoZSBpbnB1dCAobWF5IGluY2x1ZGUgbnVsbCBmb3IgdW5jaGVja2VkIGF4ZXMpLiAqL1xuICBzaGFwZT86IFNoYXBlO1xuICAvKiogRXhwZWN0ZWQgcmFuayBvZiB0aGUgaW5wdXQuICovXG4gIG5kaW0/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJhbmsgb2YgdGhlIGlucHV0LiAqL1xuICBtYXhORGltPzogbnVtYmVyO1xuICAvKiogTWluaW11bSByYW5rIG9mIHRoZSBpbnB1dC4gKi9cbiAgbWluTkRpbT86IG51bWJlcjtcbiAgLyoqIERpY3Rpb25hcnkgbWFwcGluZyBpbnRlZ2VyIGF4ZXMgdG8gYSBzcGVjaWZpYyBkaW1lbnNpb24gdmFsdWUuICovXG4gIGF4ZXM/OiB7W2F4aXM6IG51bWJlcl06IG51bWJlcn07XG59XG5cbi8qKlxuICogU3BlY2lmaWVzIHRoZSBuZGltLCBkdHlwZSBhbmQgc2hhcGUgb2YgZXZlcnkgaW5wdXQgdG8gYSBsYXllci5cbiAqXG4gKiBFdmVyeSBsYXllciBzaG91bGQgZXhwb3NlIChpZiBhcHByb3ByaWF0ZSkgYW4gYGlucHV0U3BlY2AgYXR0cmlidXRlOlxuICogYSBsaXN0IG9mIGluc3RhbmNlcyBvZiBJbnB1dFNwZWMgKG9uZSBwZXIgaW5wdXQgdGVuc29yKS5cbiAqXG4gKiBBIG51bGwgZW50cnkgaW4gYSBzaGFwZSBpcyBjb21wYXRpYmxlIHdpdGggYW55IGRpbWVuc2lvbixcbiAqIGEgbnVsbCBzaGFwZSBpcyBjb21wYXRpYmxlIHdpdGggYW55IHNoYXBlLlxuICovXG5leHBvcnQgY2xhc3MgSW5wdXRTcGVjIHtcbiAgLyoqIEV4cGVjdGVkIGRhdGF0eXBlIG9mIHRoZSBpbnB1dC4gKi9cbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqIEV4cGVjdGVkIHNoYXBlIG9mIHRoZSBpbnB1dCAobWF5IGluY2x1ZGUgbnVsbCBmb3IgdW5jaGVja2VkIGF4ZXMpLiAqL1xuICBzaGFwZT86IFNoYXBlO1xuICAvKiogRXhwZWN0ZWQgcmFuayBvZiB0aGUgaW5wdXQuICovXG4gIG5kaW0/OiBudW1iZXI7XG4gIC8qKiBNYXhpbXVtIHJhbmsgb2YgdGhlIGlucHV0LiAqL1xuICBtYXhORGltPzogbnVtYmVyO1xuICAvKiogTWluaW11bSByYW5rIG9mIHRoZSBpbnB1dC4gKi9cbiAgbWluTkRpbT86IG51bWJlcjtcbiAgLyoqIERpY3Rpb25hcnkgbWFwcGluZyBpbnRlZ2VyIGF4ZXMgdG8gYSBzcGVjaWZpYyBkaW1lbnNpb24gdmFsdWUuICovXG4gIGF4ZXM/OiB7W2F4aXM6IG51bWJlcl06IG51bWJlcn07XG5cbiAgY29uc3RydWN0b3IoYXJnczogSW5wdXRTcGVjQXJncykge1xuICAgIHRoaXMuZHR5cGUgPSBhcmdzLmR0eXBlO1xuICAgIHRoaXMuc2hhcGUgPSBhcmdzLnNoYXBlO1xuICAgIC8qXG4gICAgICBUT0RPKG1pY2hhZWx0ZXJyeSk6IENvdWxkIHRocm93IGVycm9yIGlmIG5kaW0gYW5kIHNoYXBlIGFyZSBib3RoIGRlZmluZWRcbiAgICAgICAgKHRoZW4gYmFja3BvcnQpLlxuICAgICovXG4gICAgaWYgKGFyZ3Muc2hhcGUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5uZGltID0gYXJncy5zaGFwZS5sZW5ndGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubmRpbSA9IGFyZ3MubmRpbTtcbiAgICB9XG4gICAgdGhpcy5tYXhORGltID0gYXJncy5tYXhORGltO1xuICAgIHRoaXMubWluTkRpbSA9IGFyZ3MubWluTkRpbTtcbiAgICB0aGlzLmF4ZXMgPSBhcmdzLmF4ZXMgfHwge307XG4gIH1cbn1cblxuLyoqXG4gKiBgdGYuU3ltYm9saWNUZW5zb3JgIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGEgVGVuc29yIHdpdGhvdXQgYW55IGNvbmNyZXRlIHZhbHVlLlxuICpcbiAqIFRoZXkgYXJlIG1vc3Qgb2Z0ZW4gZW5jb3VudGVyZWQgd2hlbiBidWlsZGluZyBhIGdyYXBoIG9mIGBMYXllcmBzIGZvciBhXG4gKiBgdGYuTGF5ZXJzTW9kZWxgIGFuZCB0aGUgaW5wdXQgZGF0YSdzIHNoYXBlLCBidXQgbm90IHZhbHVlcyBhcmUga25vd24uXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsICdzdWJoZWFkaW5nJzogJ0NsYXNzZXMnfVxuICovXG5leHBvcnQgY2xhc3MgU3ltYm9saWNUZW5zb3Ige1xuICAvKiBBIHVuaXF1ZSBJRCBmb3IgdGhlIHRlbnNvciB0byBiZSBhYmxlIHRvIGRpZmZlcmVudGlhdGUgdGVuc29ycy4gKi9cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcbiAgLy8gVGhlIGZ1bGx5IHNjb3BlZCBuYW1lIG9mIHRoaXMgVmFyaWFibGUsIGluY2x1ZGluZyBhIHVuaXF1ZSBzdWZmaXggaWYgbmVlZGVkXG4gIHJlYWRvbmx5IG5hbWU6IHN0cmluZztcbiAgLy8gVGhlIG9yaWdpbmFsbHkgcmVxdWVzdGVkIGZ1bGx5IHNjb3BlZCBuYW1lIG9mIHRoaXMgVmFyaWFibGUsIG5vdCBpbmNsdWRpbmdcbiAgLy8gYW55IHVuaXF1ZSBzdWZmaXguICBUaGlzIG1heSBiZSBuZWVkZWQgd2hlbiByZXN0b3Jpbmcgd2VpZ2h0cyBiZWNhdXNlIHRoaXNcbiAgLy8gb3JpZ2luYWwgbmFtZSBpcyB1c2VkIGFzIGEga2V5LlxuICByZWFkb25seSBvcmlnaW5hbE5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBSYW5rL2RpbWVuc2lvbmFsaXR5IG9mIHRoZSB0ZW5zb3IuXG4gICAqL1xuICByZWFkb25seSByYW5rOiBudW1iZXI7XG4gIC8qKlxuICAgKiBSZXBsYWNlbWVudCBmb3IgX2tlcmFzX2hpc3RvcnkuXG4gICAqL1xuICBub2RlSW5kZXg6IG51bWJlcjtcbiAgLyoqXG4gICAqIFJlcGxhY2VtZW50IGZvciBfa2VyYXNfaGlzdG9yeS5cbiAgICovXG4gIHRlbnNvckluZGV4OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBkdHlwZVxuICAgKiBAcGFyYW0gc2hhcGVcbiAgICogQHBhcmFtIHNvdXJjZUxheWVyIFRoZSBMYXllciB0aGF0IHByb2R1Y2VkIHRoaXMgc3ltYm9saWMgdGVuc29yLlxuICAgKiBAcGFyYW0gaW5wdXRzIFRoZSBpbnB1dHMgcGFzc2VkIHRvIHNvdXJjZUxheWVyJ3MgX19jYWxsX18oKSBtZXRob2QuXG4gICAqIEBwYXJhbSBub2RlSW5kZXhcbiAgICogQHBhcmFtIHRlbnNvckluZGV4XG4gICAqIEBwYXJhbSBjYWxsQXJncyBUaGUga2V5d29yZCBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBfX2NhbGxfXygpIG1ldGhvZC5cbiAgICogQHBhcmFtIG5hbWVcbiAgICogQHBhcmFtIG91dHB1dFRlbnNvckluZGV4IFRoZSBpbmRleCBvZiB0aGlzIHRlbnNvciBpbiB0aGUgbGlzdCBvZiBvdXRwdXRzXG4gICAqICAgcmV0dXJuZWQgYnkgYXBwbHkoKS5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcmVhZG9ubHkgZHR5cGU6IERhdGFUeXBlLCByZWFkb25seSBzaGFwZTogU2hhcGUsXG4gICAgICBwdWJsaWMgc291cmNlTGF5ZXI6IExheWVyLCByZWFkb25seSBpbnB1dHM6IFN5bWJvbGljVGVuc29yW10sXG4gICAgICByZWFkb25seSBjYWxsQXJnczogS3dhcmdzLCBuYW1lPzogc3RyaW5nLFxuICAgICAgcmVhZG9ubHkgb3V0cHV0VGVuc29ySW5kZXg/OiBudW1iZXIpIHtcbiAgICB0aGlzLmlkID0gZ2V0TmV4dFVuaXF1ZVRlbnNvcklkKCk7XG4gICAgaWYgKG5hbWUgIT0gbnVsbCkge1xuICAgICAgdGhpcy5vcmlnaW5hbE5hbWUgPSBnZXRTY29wZWRUZW5zb3JOYW1lKG5hbWUpO1xuICAgICAgdGhpcy5uYW1lID0gZ2V0VW5pcXVlVGVuc29yTmFtZSh0aGlzLm9yaWdpbmFsTmFtZSk7XG4gICAgfVxuICAgIHRoaXMucmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgTm9kZS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBOb2RlQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgbGF5ZXIgdGhhdCB0YWtlcyBgaW5wdXRUZW5zb3JzYCBhbmQgdHVybnMgdGhlbSBpbnRvIGBvdXRwdXRUZW5zb3JzYC5cbiAgICogKHRoZSBub2RlIGdldHMgY3JlYXRlZCB3aGVuIHRoZSBgY2FsbGAgbWV0aG9kIG9mIHRoZSBsYXllciBpcyBjYWxsZWQpLlxuICAgKi9cbiAgb3V0Ym91bmRMYXllcjogTGF5ZXI7XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgbGF5ZXJzLCB0aGUgc2FtZSBsZW5ndGggYXMgYGlucHV0VGVuc29yc2AsIHRoZSBsYXllcnMgZnJvbSB3aGVyZVxuICAgKiBgaW5wdXRUZW5zb3JzYCBvcmlnaW5hdGUuXG4gICAqL1xuICBpbmJvdW5kTGF5ZXJzOiBMYXllcltdO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGludGVnZXJzLCB0aGUgc2FtZSBsZW5ndGggYXMgYGluYm91bmRMYXllcnNgLiBgbm9kZUluZGljZXNbaV1gIGlzXG4gICAqIHRoZSBvcmlnaW4gbm9kZSBvZiBgaW5wdXRUZW5zb3JzW2ldYCAobmVjZXNzYXJ5IHNpbmNlIGVhY2ggaW5ib3VuZCBsYXllclxuICAgKiBtaWdodCBoYXZlIHNldmVyYWwgbm9kZXMsIGUuZy4gaWYgdGhlIGxheWVyIGlzIGJlaW5nIHNoYXJlZCB3aXRoIGFcbiAgICogZGlmZmVyZW50IGRhdGEgc3RyZWFtKS5cbiAgICovXG4gIG5vZGVJbmRpY2VzOiBudW1iZXJbXTtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBpbnRlZ2VycywgdGhlIHNhbWUgbGVuZ3RoIGFzIGBpbmJvdW5kTGF5ZXJzYC4gYHRlbnNvckluZGljZXNbaV1gXG4gICAqIGlzIHRoZSBpbmRleCBvZiBgaW5wdXRUZW5zb3JzW2ldYCB3aXRoaW4gdGhlIG91dHB1dCBvZiB0aGUgaW5ib3VuZCBsYXllclxuICAgKiAobmVjZXNzYXJ5IHNpbmNlIGVhY2ggaW5ib3VuZCBsYXllciBtaWdodCBoYXZlIG11bHRpcGxlIHRlbnNvciBvdXRwdXRzLFxuICAgKiB3aXRoIGVhY2ggb25lIGJlaW5nIGluZGVwZW5kZW50bHkgbWFuaXB1bGFibGUpLlxuICAgKi9cbiAgdGVuc29ySW5kaWNlczogbnVtYmVyW107XG4gIC8qKiBMaXN0IG9mIGlucHV0IHRlbnNvcnMuICovXG4gIGlucHV0VGVuc29yczogU3ltYm9saWNUZW5zb3JbXTtcbiAgLyoqIExpc3Qgb2Ygb3V0cHV0IHRlbnNvcnMuICovXG4gIG91dHB1dFRlbnNvcnM6IFN5bWJvbGljVGVuc29yW107XG4gIC8qKiBMaXN0IG9mIGlucHV0IG1hc2tzIChhIG1hc2sgY2FuIGJlIGEgdGVuc29yLCBvciBudWxsKS4gKi9cbiAgaW5wdXRNYXNrczogVGVuc29yW107XG4gIC8qKiBMaXN0IG9mIG91dHB1dCBtYXNrcyAoYSBtYXNrIGNhbiBiZSBhIHRlbnNvciwgb3IgbnVsbCkuICovXG4gIG91dHB1dE1hc2tzOiBUZW5zb3JbXTtcbiAgLyoqIExpc3Qgb2YgaW5wdXQgc2hhcGUgdHVwbGVzLiAqL1xuICBpbnB1dFNoYXBlczogU2hhcGV8U2hhcGVbXTtcbiAgLyoqIExpc3Qgb2Ygb3V0cHV0IHNoYXBlIHR1cGxlcy4gKi9cbiAgb3V0cHV0U2hhcGVzOiBTaGFwZXxTaGFwZVtdO1xufVxuXG4vKipcbiAqIFRoZSB0eXBlIG9mIHRoZSByZXR1cm4gdmFsdWUgb2YgTGF5ZXIuZGlzcG9zZSgpIGFuZCBDb250YWluZXIuZGlzcG9zZSgpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIERpc3Bvc2VSZXN1bHQge1xuICAvKipcbiAgICogUmVmZXJlbmNlIGNvdW50IGFmdGVyIHRoZSBkaXNwb3NlIGNhbGwuXG4gICAqL1xuICByZWZDb3VudEFmdGVyRGlzcG9zZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgb2YgdmFyaWFibGVzIGRpc3Bvc2UgaW4gdGhpcyBkaXNwb3NlIGNhbGwuXG4gICAqL1xuICBudW1EaXNwb3NlZFZhcmlhYmxlczogbnVtYmVyO1xufVxuXG5sZXQgX25leHROb2RlSUQgPSAwO1xuXG4vKipcbiAqIEEgYE5vZGVgIGRlc2NyaWJlcyB0aGUgY29ubmVjdGl2aXR5IGJldHdlZW4gdHdvIGxheWVycy5cbiAqXG4gKiBFYWNoIHRpbWUgYSBsYXllciBpcyBjb25uZWN0ZWQgdG8gc29tZSBuZXcgaW5wdXQsXG4gKiBhIG5vZGUgaXMgYWRkZWQgdG8gYGxheWVyLmluYm91bmROb2Rlc2AuXG4gKlxuICogRWFjaCB0aW1lIHRoZSBvdXRwdXQgb2YgYSBsYXllciBpcyB1c2VkIGJ5IGFub3RoZXIgbGF5ZXIsXG4gKiBhIG5vZGUgaXMgYWRkZWQgdG8gYGxheWVyLm91dGJvdW5kTm9kZXNgLlxuICpcbiAqIGBub2RlSW5kaWNlc2AgYW5kIGB0ZW5zb3JJbmRpY2VzYCBhcmUgYmFzaWNhbGx5IGZpbmUtZ3JhaW5lZCBjb29yZGluYXRlc1xuICogZGVzY3JpYmluZyB0aGUgb3JpZ2luIG9mIHRoZSBgaW5wdXRUZW5zb3JzYCwgdmVyaWZ5aW5nIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogYGlucHV0VGVuc29yc1tpXSA9PVxuICogaW5ib3VuZExheWVyc1tpXS5pbmJvdW5kTm9kZXNbbm9kZUluZGljZXNbaV1dLm91dHB1dFRlbnNvcnNbXG4gKiAgIHRlbnNvckluZGljZXNbaV1dYFxuICpcbiAqIEEgbm9kZSBmcm9tIGxheWVyIEEgdG8gbGF5ZXIgQiBpcyBhZGRlZCB0bzpcbiAqICAgICBBLm91dGJvdW5kTm9kZXNcbiAqICAgICBCLmluYm91bmROb2Rlc1xuICovXG5leHBvcnQgY2xhc3MgTm9kZSB7XG4gIC8qKlxuICAgKiBUaGUgbGF5ZXIgdGhhdCB0YWtlcyBgaW5wdXRUZW5zb3JzYCBhbmQgdHVybnMgdGhlbSBpbnRvIGBvdXRwdXRUZW5zb3JzYFxuICAgKiAodGhlIG5vZGUgZ2V0cyBjcmVhdGVkIHdoZW4gdGhlIGBjYWxsYCBtZXRob2Qgb2YgdGhlIGxheWVyIGlzIGNhbGxlZCkuXG4gICAqL1xuICBvdXRib3VuZExheWVyOiBMYXllcjtcbiAgLyoqXG4gICAqIEEgbGlzdCBvZiBsYXllcnMsIHRoZSBzYW1lIGxlbmd0aCBhcyBgaW5wdXRUZW5zb3JzYCwgdGhlIGxheWVycyBmcm9tIHdoZXJlXG4gICAqIGBpbnB1dFRlbnNvcnNgIG9yaWdpbmF0ZS5cbiAgICovXG4gIGluYm91bmRMYXllcnM6IExheWVyW107XG4gIC8qKlxuICAgKiBBIGxpc3Qgb2YgaW50ZWdlcnMsIHRoZSBzYW1lIGxlbmd0aCBhcyBgaW5ib3VuZExheWVyc2AuIGBub2RlSW5kaWNlc1tpXWAgaXNcbiAgICogdGhlIG9yaWdpbiBub2RlIG9mIGBpbnB1dFRlbnNvcnNbaV1gIChuZWNlc3Nhcnkgc2luY2UgZWFjaCBpbmJvdW5kIGxheWVyXG4gICAqIG1pZ2h0IGhhdmUgc2V2ZXJhbCBub2RlcywgZS5nLiBpZiB0aGUgbGF5ZXIgaXMgYmVpbmcgc2hhcmVkIHdpdGggYVxuICAgKiBkaWZmZXJlbnQgZGF0YSBzdHJlYW0pLlxuICAgKi9cbiAgbm9kZUluZGljZXM6IG51bWJlcltdO1xuICAvKipcbiAgICogQSBsaXN0IG9mIGludGVnZXJzLCB0aGUgc2FtZSBsZW5ndGggYXMgYGluYm91bmRMYXllcnNgLiBgdGVuc29ySW5kaWNlc1tpXWBcbiAgICogaXMgdGhlIGluZGV4IG9mIGBpbnB1dFRlbnNvcnNbaV1gIHdpdGhpbiB0aGUgb3V0cHV0IG9mIHRoZSBpbmJvdW5kIGxheWVyXG4gICAqIChuZWNlc3Nhcnkgc2luY2UgZWFjaCBpbmJvdW5kIGxheWVyIG1pZ2h0IGhhdmUgbXVsdGlwbGUgdGVuc29yIG91dHB1dHMsXG4gICAqIHdpdGggZWFjaCBvbmUgYmVpbmcgaW5kZXBlbmRlbnRseSBtYW5pcHVsYWJsZSkuXG4gICAqL1xuICB0ZW5zb3JJbmRpY2VzOiBudW1iZXJbXTtcbiAgLyoqIExpc3Qgb2YgaW5wdXQgdGVuc29ycy4gKi9cbiAgaW5wdXRUZW5zb3JzOiBTeW1ib2xpY1RlbnNvcltdO1xuICAvKiogTGlzdCBvZiBvdXRwdXQgdGVuc29ycy4gKi9cbiAgb3V0cHV0VGVuc29yczogU3ltYm9saWNUZW5zb3JbXTtcbiAgLyoqIExpc3Qgb2YgaW5wdXQgbWFza3MgKGEgbWFzayBjYW4gYmUgYSB0ZW5zb3IsIG9yIG51bGwpLiAqL1xuICBpbnB1dE1hc2tzOiBUZW5zb3JbXTtcbiAgLyoqIExpc3Qgb2Ygb3V0cHV0IG1hc2tzIChhIG1hc2sgY2FuIGJlIGEgdGVuc29yLCBvciBudWxsKS4gKi9cbiAgb3V0cHV0TWFza3M6IFRlbnNvcltdO1xuICAvKiogTGlzdCBvZiBpbnB1dCBzaGFwZSB0dXBsZXMuICovXG4gIGlucHV0U2hhcGVzOiBTaGFwZXxTaGFwZVtdO1xuICAvKiogTGlzdCBvZiBvdXRwdXQgc2hhcGUgdHVwbGVzLiAqL1xuICBvdXRwdXRTaGFwZXM6IFNoYXBlfFNoYXBlW107XG5cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGFyZ3M6IE5vZGVBcmdzLFxuICAgICAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBEZWZpbmUgYWN0dWFsIHR5cGUgZm9yIHRoaXMuXG4gICAgICBwdWJsaWMgY2FsbEFyZ3M/OiBLd2FyZ3MpIHtcbiAgICB0aGlzLmlkID0gX25leHROb2RlSUQrKztcbiAgICAvKlxuICAgICAgTGF5ZXIgaW5zdGFuY2UgKE5PVCBhIGxpc3QpLlxuICAgICAgdGhpcyBpcyB0aGUgbGF5ZXIgdGhhdCB0YWtlcyBhIGxpc3Qgb2YgaW5wdXQgdGVuc29yc1xuICAgICAgYW5kIHR1cm5zIHRoZW0gaW50byBhIGxpc3Qgb2Ygb3V0cHV0IHRlbnNvcnMuXG4gICAgICB0aGUgY3VycmVudCBub2RlIHdpbGwgYmUgYWRkZWQgdG9cbiAgICAgIHRoZSBpbmJvdW5kTm9kZXMgb2Ygb3V0Ym91bmRMYXllci5cbiAgICAqL1xuICAgIHRoaXMub3V0Ym91bmRMYXllciA9IGFyZ3Mub3V0Ym91bmRMYXllcjtcblxuICAgIC8qXG4gICAgICAgIFRoZSBmb2xsb3dpbmcgMyBwcm9wZXJ0aWVzIGRlc2NyaWJlIHdoZXJlXG4gICAgICAgIHRoZSBpbnB1dCB0ZW5zb3JzIGNvbWUgZnJvbTogd2hpY2ggbGF5ZXJzLFxuICAgICAgICBhbmQgZm9yIGVhY2ggbGF5ZXIsIHdoaWNoIG5vZGUgYW5kIHdoaWNoXG4gICAgICAgIHRlbnNvciBvdXRwdXQgb2YgZWFjaCBub2RlLlxuICAgICovXG5cbiAgICAvLyBMaXN0IG9mIGxheWVyIGluc3RhbmNlcy5cbiAgICB0aGlzLmluYm91bmRMYXllcnMgPSBhcmdzLmluYm91bmRMYXllcnM7XG4gICAgLy8gTGlzdCBvZiBpbnRlZ2VycywgMToxIG1hcHBpbmcgd2l0aCBpbmJvdW5kTGF5ZXJzLlxuICAgIHRoaXMubm9kZUluZGljZXMgPSBhcmdzLm5vZGVJbmRpY2VzO1xuICAgIC8vIExpc3Qgb2YgaW50ZWdlcnMsIDE6MSBtYXBwaW5nIHdpdGggaW5ib3VuZExheWVycy5cbiAgICB0aGlzLnRlbnNvckluZGljZXMgPSBhcmdzLnRlbnNvckluZGljZXM7XG5cbiAgICAvKlxuICAgICAgICBGb2xsb3dpbmcgMiBwcm9wZXJ0aWVzOlxuICAgICAgICB0ZW5zb3IgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIG91dGJvdW5kTGF5ZXIuXG4gICAgKi9cblxuICAgIC8vIExpc3Qgb2YgdGVuc29ycy4gMToxIG1hcHBpbmcgd2l0aCBpbmJvdW5kTGF5ZXJzLlxuICAgIHRoaXMuaW5wdXRUZW5zb3JzID0gYXJncy5pbnB1dFRlbnNvcnM7XG4gICAgLy8gTGlzdCBvZiB0ZW5zb3JzLCBjcmVhdGVkIGJ5IG91dGJvdW5kTGF5ZXIuY2FsbCgpLlxuICAgIHRoaXMub3V0cHV0VGVuc29ycyA9IGFyZ3Mub3V0cHV0VGVuc29ycztcblxuICAgIC8qXG4gICAgICAgIEZvbGxvd2luZyAyIHByb3BlcnRpZXM6IGlucHV0IGFuZCBvdXRwdXQgbWFza3MuXG4gICAgICAgIExpc3Qgb2YgdGVuc29ycywgMToxIG1hcHBpbmcgd2l0aCBpbnB1dFRlbnNvci5cbiAgICAqL1xuICAgIHRoaXMuaW5wdXRNYXNrcyA9IGFyZ3MuaW5wdXRNYXNrcztcbiAgICAvLyBMaXN0IG9mIHRlbnNvcnMsIGNyZWF0ZWQgYnkgb3V0Ym91bmRMYXllci5jb21wdXRlTWFzaygpLlxuICAgIHRoaXMub3V0cHV0TWFza3MgPSBhcmdzLm91dHB1dE1hc2tzO1xuXG4gICAgLy8gRm9sbG93aW5nIDIgcHJvcGVydGllczogaW5wdXQgYW5kIG91dHB1dCBzaGFwZXMuXG5cbiAgICAvLyBMaXN0IG9mIHNoYXBlIHR1cGxlcywgc2hhcGVzIG9mIGlucHV0VGVuc29ycy5cbiAgICB0aGlzLmlucHV0U2hhcGVzID0gYXJncy5pbnB1dFNoYXBlcztcbiAgICAvLyBMaXN0IG9mIHNoYXBlIHR1cGxlcywgc2hhcGVzIG9mIG91dHB1dFRlbnNvcnMuXG4gICAgdGhpcy5vdXRwdXRTaGFwZXMgPSBhcmdzLm91dHB1dFNoYXBlcztcblxuICAgIC8vIEFkZCBub2RlcyB0byBhbGwgbGF5ZXJzIGludm9sdmVkLlxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgYXJncy5pbmJvdW5kTGF5ZXJzKSB7XG4gICAgICBpZiAobGF5ZXIgIT0gbnVsbCkge1xuICAgICAgICBsYXllci5vdXRib3VuZE5vZGVzLnB1c2godGhpcyk7XG4gICAgICB9XG4gICAgfVxuICAgIGFyZ3Mub3V0Ym91bmRMYXllci5pbmJvdW5kTm9kZXMucHVzaCh0aGlzKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGluYm91bmROYW1lczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMuaW5ib3VuZExheWVycykge1xuICAgICAgaWYgKGxheWVyICE9IG51bGwpIHtcbiAgICAgICAgaW5ib3VuZE5hbWVzLnB1c2gobGF5ZXIubmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbmJvdW5kTmFtZXMucHVzaChudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIG91dGJvdW5kTGF5ZXI6IHRoaXMub3V0Ym91bmRMYXllciA/IHRoaXMub3V0Ym91bmRMYXllci5uYW1lIDogbnVsbCxcbiAgICAgIGluYm91bmRMYXllcnM6IGluYm91bmROYW1lcyxcbiAgICAgIG5vZGVJbmRpY2VzOiB0aGlzLm5vZGVJbmRpY2VzLFxuICAgICAgdGVuc29ySW5kaWNlczogdGhpcy50ZW5zb3JJbmRpY2VzXG4gICAgfTtcbiAgfVxufVxuXG4vKiogQ29uc3RydWN0b3IgYXJndW1lbnRzIGZvciBMYXllci4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSWYgZGVmaW5lZCwgd2lsbCBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBpbnB1dCBsYXllciB0byBpbnNlcnQgYmVmb3JlIHRoaXNcbiAgICogbGF5ZXIuIElmIGJvdGggYGlucHV0U2hhcGVgIGFuZCBgYmF0Y2hJbnB1dFNoYXBlYCBhcmUgZGVmaW5lZCxcbiAgICogYGJhdGNoSW5wdXRTaGFwZWAgd2lsbCBiZSB1c2VkLiBUaGlzIGFyZ3VtZW50IGlzIG9ubHkgYXBwbGljYWJsZSB0byBpbnB1dFxuICAgKiBsYXllcnMgKHRoZSBmaXJzdCBsYXllciBvZiBhIG1vZGVsKS5cbiAgICovXG4gIGlucHV0U2hhcGU/OiBTaGFwZTtcbiAgLyoqXG4gICAqIElmIGRlZmluZWQsIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYW4gaW5wdXQgbGF5ZXIgdG8gaW5zZXJ0IGJlZm9yZSB0aGlzXG4gICAqIGxheWVyLiBJZiBib3RoIGBpbnB1dFNoYXBlYCBhbmQgYGJhdGNoSW5wdXRTaGFwZWAgYXJlIGRlZmluZWQsXG4gICAqIGBiYXRjaElucHV0U2hhcGVgIHdpbGwgYmUgdXNlZC4gVGhpcyBhcmd1bWVudCBpcyBvbmx5IGFwcGxpY2FibGUgdG8gaW5wdXRcbiAgICogbGF5ZXJzICh0aGUgZmlyc3QgbGF5ZXIgb2YgYSBtb2RlbCkuXG4gICAqL1xuICBiYXRjaElucHV0U2hhcGU/OiBTaGFwZTtcbiAgLyoqXG4gICAqIElmIGBpbnB1dFNoYXBlYCBpcyBzcGVjaWZpZWQgYW5kIGBiYXRjaElucHV0U2hhcGVgIGlzICpub3QqIHNwZWNpZmllZCxcbiAgICogYGJhdGNoU2l6ZWAgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGBiYXRjaElucHV0U2hhcGVgOiBgW2JhdGNoU2l6ZSxcbiAgICogLi4uaW5wdXRTaGFwZV1gXG4gICAqL1xuICBiYXRjaFNpemU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBUaGUgZGF0YS10eXBlIGZvciB0aGlzIGxheWVyLiBEZWZhdWx0cyB0byAnZmxvYXQzMicuXG4gICAqIFRoaXMgYXJndW1lbnQgaXMgb25seSBhcHBsaWNhYmxlIHRvIGlucHV0IGxheWVycyAodGhlIGZpcnN0IGxheWVyIG9mIGFcbiAgICogbW9kZWwpLlxuICAgKi9cbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqIE5hbWUgZm9yIHRoaXMgbGF5ZXIuICovXG4gIG5hbWU/OiBzdHJpbmc7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSB3ZWlnaHRzIG9mIHRoaXMgbGF5ZXIgYXJlIHVwZGF0YWJsZSBieSBgZml0YC5cbiAgICogRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICovXG4gIHRyYWluYWJsZT86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbml0aWFsIHdlaWdodCB2YWx1ZXMgb2YgdGhlIGxheWVyLlxuICAgKi9cbiAgd2VpZ2h0cz86IFRlbnNvcltdO1xuICAvKiogTGVnYWN5IHN1cHBvcnQuIERvIG5vdCB1c2UgZm9yIG5ldyBjb2RlLiAqL1xuICBpbnB1dERUeXBlPzogRGF0YVR5cGU7XG59XG5cbi8vIElmIG5lY2Vzc2FyeSwgYWRkIGBvdXRwdXRgIGFyZ3VtZW50cyB0byB0aGUgQ2FsbEhvb2sgZnVuY3Rpb24uXG4vLyBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGZvciB0ZXN0aW5nIG9ubHksIGJ1dCBtYXkgYmUgdXNlZCBmb3IgZGVidWdnZXItcmVsYXRlZFxuLy8gcHVycG9zZXMgaW4gdGhlIGZ1dHVyZS5cbmV4cG9ydCB0eXBlIENhbGxIb29rID0gKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncykgPT4gdm9pZDtcblxubGV0IF9uZXh0TGF5ZXJJRCA9IDA7XG5cbi8qKlxuICogQSBsYXllciBpcyBhIGdyb3VwaW5nIG9mIG9wZXJhdGlvbnMgYW5kIHdlaWdodHMgdGhhdCBjYW4gYmUgY29tcG9zZWQgdG9cbiAqIGNyZWF0ZSBhIGB0Zi5MYXllcnNNb2RlbGAuXG4gKlxuICogTGF5ZXJzIGFyZSBjb25zdHJ1Y3RlZCBieSB1c2luZyB0aGUgZnVuY3Rpb25zIHVuZGVyIHRoZVxuICogW3RmLmxheWVyc10oI0xheWVycy1CYXNpYykgbmFtZXNwYWNlLlxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdMYXllcnMnLCBzdWJoZWFkaW5nOiAnQ2xhc3NlcycsIG5hbWVzcGFjZTogJ2xheWVycyd9XG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMYXllciBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIHtcbiAgLyoqIE5hbWUgZm9yIHRoaXMgbGF5ZXIuIE11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIG1vZGVsLiAqL1xuICBuYW1lOiBzdHJpbmc7XG4gIC8qKlxuICAgKiBMaXN0IG9mIElucHV0U3BlYyBjbGFzcyBpbnN0YW5jZXMuXG4gICAqXG4gICAqIEVhY2ggZW50cnkgZGVzY3JpYmVzIG9uZSByZXF1aXJlZCBpbnB1dDpcbiAgICogLSBuZGltXG4gICAqIC0gZHR5cGVcbiAgICogQSBsYXllciB3aXRoIGBuYCBpbnB1dCB0ZW5zb3JzIG11c3QgaGF2ZSBhbiBgaW5wdXRTcGVjYCBvZiBsZW5ndGggYG5gLlxuICAgKi9cbiAgaW5wdXRTcGVjOiBJbnB1dFNwZWNbXTtcbiAgc3VwcG9ydHNNYXNraW5nOiBib29sZWFuO1xuICAvKiogV2hldGhlciB0aGUgbGF5ZXIgd2VpZ2h0cyB3aWxsIGJlIHVwZGF0ZWQgZHVyaW5nIHRyYWluaW5nLiAqL1xuICBwcm90ZWN0ZWQgdHJhaW5hYmxlXzogYm9vbGVhbjtcbiAgYmF0Y2hJbnB1dFNoYXBlOiBTaGFwZTtcbiAgZHR5cGU6IERhdGFUeXBlO1xuICBpbml0aWFsV2VpZ2h0czogVGVuc29yW107XG5cbiAgaW5ib3VuZE5vZGVzOiBOb2RlW107XG4gIG91dGJvdW5kTm9kZXM6IE5vZGVbXTtcblxuICBhY3Rpdml0eVJlZ3VsYXJpemVyOiBSZWd1bGFyaXplcjtcblxuICBwcm90ZWN0ZWQgX3RyYWluYWJsZVdlaWdodHM6IExheWVyVmFyaWFibGVbXTtcbiAgcHJpdmF0ZSBfbm9uVHJhaW5hYmxlV2VpZ2h0czogTGF5ZXJWYXJpYWJsZVtdO1xuICBwcml2YXRlIF9sb3NzZXM6IFJlZ3VsYXJpemVyRm5bXTtcbiAgLy8gVE9ETyhjYWlzKTogX3VwZGF0ZXMgaXMgY3VycmVudGx5IHVudXNlZC5cbiAgcHJpdmF0ZSBfdXBkYXRlczogVGVuc29yW107XG4gIHByaXZhdGUgX2J1aWx0OiBib29sZWFuO1xuICBwcml2YXRlIF9jYWxsSG9vazogQ2FsbEhvb2sgPSBudWxsO1xuXG4gIHByaXZhdGUgX2FkZGVkV2VpZ2h0TmFtZXM6IHN0cmluZ1tdID0gW107XG5cbiAgcmVhZG9ubHkgaWQ6IG51bWJlcjtcblxuICAvLyBQb3J0aW5nIE5vdGVzOiBQeUtlcmFzIGRvZXMgbm90IGhhdmUgdGhpcyBwcm9wZXJ0eSBpbiB0aGlzIGJhc2UgTGF5ZXJcbiAgLy8gICBjbGFzcy4gSW5zdGVhZCBsZXRzIExheWVyIHN1YmNsYXNzIHNldCBpdCBkeW5hbWljYWxseSBhbmQgY2hlY2tzIHRoZVxuICAvLyAgIHZhbHVlIHdpdGggYGhhc2F0dHJgLiBJbiB0ZmpzLWxheWVycywgd2UgbGV0IHRoaXMgYmUgYSBtZW1iZXIgb2YgdGhpc1xuICAvLyAgIGJhc2UgY2xhc3MuXG4gIHByb3RlY3RlZCBfc3RhdGVmdWwgPSBmYWxzZTtcblxuICBwcm90ZWN0ZWQgX3JlZkNvdW50OiBudW1iZXJ8bnVsbDtcblxuICAvLyBBIGZsYWcgZm9yIHdoZXRoZXIgZmFzdCAoaS5lLiwgYWxsLXplcm8pIHdlaWdodCBpbml0aWFsaXphdGlvbiBpcyB0b1xuICAvLyBiZSB1c2VkIGR1cmluZyBgYnVpbGQoKWAgY2FsbC4gVGhpcyBzcGVlZHMgdXAgd2VpZ2h0IGluaXRpYWxpemF0aW9uXG4gIC8vIGJ5IHNhdmluZyB1bm5lY2Vzc2FyeSBjYWxscyB0byBleHBlbnNpdmUgaW5pdGlhbGl6ZXJzIGluIGNhc2VzIHdoZXJlXG4gIC8vIHRoZSBpbml0aWFsaXplZCB2YWx1ZXMgd2lsbCBiZSBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0IHZhbHVlc1xuICAvLyBkdXJpbmcgbW9kZWwgbG9hZGluZy5cbiAgcHJpdmF0ZSBmYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IExheWVyQXJncyA9IHt9KSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmlkID0gX25leHRMYXllcklEKys7XG5cbiAgICB0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIgPSBudWxsO1xuXG4gICAgdGhpcy5pbnB1dFNwZWMgPSBudWxsO1xuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gZmFsc2U7XG5cbiAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIHdpbGwgYmUgc2V0IHVwb24gY2FsbCBvZiB0aGlzLmJ1aWxkKClcbiAgICB0aGlzLl90cmFpbmFibGVXZWlnaHRzID0gW107XG4gICAgdGhpcy5fbm9uVHJhaW5hYmxlV2VpZ2h0cyA9IFtdO1xuICAgIHRoaXMuX2xvc3NlcyA9IFtdO1xuICAgIHRoaXMuX3VwZGF0ZXMgPSBbXTtcbiAgICB0aGlzLl9idWlsdCA9IGZhbHNlO1xuXG4gICAgLypcbiAgICAgIFRoZXNlIGxpc3RzIHdpbGwgYmUgZmlsbGVkIHZpYSBzdWNjZXNzaXZlIGNhbGxzXG4gICAgICB0byB0aGlzLmFkZEluYm91bmROb2RlKCkuXG4gICAgICovXG4gICAgdGhpcy5pbmJvdW5kTm9kZXMgPSBbXTtcbiAgICB0aGlzLm91dGJvdW5kTm9kZXMgPSBbXTtcblxuICAgIGxldCBuYW1lID0gYXJncy5uYW1lO1xuICAgIGlmICghbmFtZSkge1xuICAgICAgY29uc3QgcHJlZml4ID0gdGhpcy5nZXRDbGFzc05hbWUoKTtcbiAgICAgIG5hbWUgPSBnZW5lcmljX3V0aWxzLnRvU25ha2VDYXNlKHByZWZpeCkgKyAnXycgKyBnZXRVaWQocHJlZml4KTtcbiAgICB9XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcblxuICAgIHRoaXMudHJhaW5hYmxlXyA9IGFyZ3MudHJhaW5hYmxlID09IG51bGwgPyB0cnVlIDogYXJncy50cmFpbmFibGU7XG5cbiAgICBpZiAoYXJncy5pbnB1dFNoYXBlICE9IG51bGwgfHwgYXJncy5iYXRjaElucHV0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgLypcbiAgICAgICAgSW4gdGhpcyBjYXNlIHdlIHdpbGwgbGF0ZXIgY3JlYXRlIGFuIGlucHV0IGxheWVyXG4gICAgICAgIHRvIGluc2VydCBiZWZvcmUgdGhlIGN1cnJlbnQgbGF5ZXJcbiAgICAgICAqL1xuICAgICAgbGV0IGJhdGNoSW5wdXRTaGFwZTogU2hhcGU7XG4gICAgICBpZiAoYXJncy5iYXRjaElucHV0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgICBiYXRjaElucHV0U2hhcGUgPSBhcmdzLmJhdGNoSW5wdXRTaGFwZTtcbiAgICAgIH0gZWxzZSBpZiAoYXJncy5pbnB1dFNoYXBlICE9IG51bGwpIHtcbiAgICAgICAgbGV0IGJhdGNoU2l6ZTogbnVtYmVyID0gbnVsbDtcbiAgICAgICAgaWYgKGFyZ3MuYmF0Y2hTaXplICE9IG51bGwpIHtcbiAgICAgICAgICBiYXRjaFNpemUgPSBhcmdzLmJhdGNoU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBiYXRjaElucHV0U2hhcGUgPSBbYmF0Y2hTaXplXS5jb25jYXQoYXJncy5pbnB1dFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmF0Y2hJbnB1dFNoYXBlID0gYmF0Y2hJbnB1dFNoYXBlO1xuXG4gICAgICAvLyBTZXQgZHR5cGUuXG4gICAgICBsZXQgZHR5cGUgPSBhcmdzLmR0eXBlO1xuICAgICAgaWYgKGR0eXBlID09IG51bGwpIHtcbiAgICAgICAgZHR5cGUgPSBhcmdzLmlucHV0RFR5cGU7XG4gICAgICB9XG4gICAgICBpZiAoZHR5cGUgPT0gbnVsbCkge1xuICAgICAgICBkdHlwZSA9ICdmbG9hdDMyJztcbiAgICAgIH1cbiAgICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy53ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgIHRoaXMuaW5pdGlhbFdlaWdodHMgPSBhcmdzLndlaWdodHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5pdGlhbFdlaWdodHMgPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRoZSB2YWx1ZSBvZiBgX3JlZkNvdW50YCBpcyBpbml0aWFsaXplZCB0byBudWxsLiBXaGVuIHRoZSBsYXllciBpcyB1c2VkXG4gICAgLy8gaW4gYSBzeW1ib2xpYyB3YXkgZm9yIHRoZSBmaXJzdCB0aW1lLCBpdCB3aWxsIGJlIHNldCB0byAxLlxuICAgIHRoaXMuX3JlZkNvdW50ID0gbnVsbDtcblxuICAgIHRoaXMuZmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlcnRzIGEgbGF5ZXIgYW5kIGl0cyBpbmRleCB0byBhIHVuaXF1ZSAoaW1tdXRhYmxlIHR5cGUpIG5hbWUuXG4gICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbnRlcm5hbGx5IHdpdGggYHRoaXMuY29udGFpbmVyTm9kZXNgLlxuICAgKiBAcGFyYW0gbGF5ZXIgVGhlIGxheWVyLlxuICAgKiBAcGFyYW0gbm9kZUluZGV4IFRoZSBsYXllcidzIHBvc2l0aW9uIChlLmcuIHZpYSBlbnVtZXJhdGUpIGluIGEgbGlzdCBvZlxuICAgKiAgIG5vZGVzLlxuICAgKlxuICAgKiBAcmV0dXJucyBUaGUgdW5pcXVlIG5hbWUuXG4gICAqL1xuICBwcm90ZWN0ZWQgc3RhdGljIG5vZGVLZXkobGF5ZXI6IExheWVyLCBub2RlSW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBsYXllci5uYW1lICsgJ19pYi0nICsgbm9kZUluZGV4LnRvU3RyaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGlzLmluYm91bmROb2RlIGF0IGluZGV4IG5vZGVJbmRleC5cbiAgICpcbiAgICogUG9ydGluZyBub3RlOiBUaGlzIGlzIGEgcmVwbGFjZW1lbnQgZm9yIF9nZXRfbm9kZV9hdHRyaWJ1dGVfYXRfaW5kZXgoKVxuICAgKiBAcGFyYW0gbm9kZUluZGV4XG4gICAqIEBwYXJhbSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHJlbGF0ZWQgdG8gcmVxdWVzdCBmb3IgdGhpcyBub2RlLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXROb2RlQXRJbmRleChub2RlSW5kZXg6IG51bWJlciwgYXR0ck5hbWU6IHN0cmluZyk6IE5vZGUge1xuICAgIGlmICh0aGlzLmluYm91bmROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoXG4gICAgICAgICAgJ1RoZSBsYXllciBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQgJyArXG4gICAgICAgICAgYGFuZCB0aHVzIGhhcyBubyBkZWZpbmVkICR7YXR0ck5hbWV9LmApO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoIDw9IG5vZGVJbmRleCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEFza2VkIHRvIGdldCAke2F0dHJOYW1lfSBhdCBub2RlICR7bm9kZUluZGV4fSwgYCArXG4gICAgICAgICAgYGJ1dCB0aGUgbGF5ZXIgaGFzIG9ubHkgJHt0aGlzLmluYm91bmROb2Rlcy5sZW5ndGh9IGluYm91bmQgbm9kZXMuYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmluYm91bmROb2Rlc1tub2RlSW5kZXhdO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgaW5wdXQgdGVuc29yKHMpIG9mIGEgbGF5ZXIgYXQgYSBnaXZlbiBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZUluZGV4IEludGVnZXIsIGluZGV4IG9mIHRoZSBub2RlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlXG4gICAqICAgYXR0cmlidXRlLiBFLmcuIGBub2RlSW5kZXg9MGAgd2lsbCBjb3JyZXNwb25kIHRvIHRoZSBmaXJzdCB0aW1lIHRoZSBsYXllclxuICAgKiAgIHdhcyBjYWxsZWQuXG4gICAqXG4gICAqIEByZXR1cm4gQSB0ZW5zb3IgKG9yIGxpc3Qgb2YgdGVuc29ycyBpZiB0aGUgbGF5ZXIgaGFzIG11bHRpcGxlIGlucHV0cykuXG4gICAqL1xuICBnZXRJbnB1dEF0KG5vZGVJbmRleDogbnVtYmVyKTogU3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXSB7XG4gICAgcmV0dXJuIGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShcbiAgICAgICAgdGhpcy5nZXROb2RlQXRJbmRleChub2RlSW5kZXgsICdpbnB1dCcpLmlucHV0VGVuc29ycyk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBvdXRwdXQgdGVuc29yKHMpIG9mIGEgbGF5ZXIgYXQgYSBnaXZlbiBub2RlLlxuICAgKlxuICAgKiBAcGFyYW0gbm9kZUluZGV4IEludGVnZXIsIGluZGV4IG9mIHRoZSBub2RlIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlXG4gICAqICAgYXR0cmlidXRlLiBFLmcuIGBub2RlSW5kZXg9MGAgd2lsbCBjb3JyZXNwb25kIHRvIHRoZSBmaXJzdCB0aW1lIHRoZSBsYXllclxuICAgKiAgIHdhcyBjYWxsZWQuXG4gICAqXG4gICAqIEByZXR1cm4gQSB0ZW5zb3IgKG9yIGxpc3Qgb2YgdGVuc29ycyBpZiB0aGUgbGF5ZXIgaGFzIG11bHRpcGxlIG91dHB1dHMpLlxuICAgKi9cbiAgZ2V0T3V0cHV0QXQobm9kZUluZGV4OiBudW1iZXIpOiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdIHtcbiAgICByZXR1cm4gZ2VuZXJpY191dGlscy5zaW5nbGV0b25PckFycmF5KFxuICAgICAgICB0aGlzLmdldE5vZGVBdEluZGV4KG5vZGVJbmRleCwgJ291dHB1dCcpLm91dHB1dFRlbnNvcnMpO1xuICB9XG5cbiAgLy8gUHJvcGVydGllc1xuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGlucHV0IHRlbnNvcihzKSBvZiBhIGxheWVyLlxuICAgKlxuICAgKiBPbmx5IGFwcGxpY2FibGUgaWYgdGhlIGxheWVyIGhhcyBleGFjdGx5IG9uZSBpbmJvdW5kIG5vZGUsXG4gICAqIGkuZS4gaWYgaXQgaXMgY29ubmVjdGVkIHRvIG9uZSBpbmNvbWluZyBsYXllci5cbiAgICpcbiAgICogQHJldHVybiBJbnB1dCB0ZW5zb3Igb3IgbGlzdCBvZiBpbnB1dCB0ZW5zb3JzLlxuICAgKlxuICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZUVycm9yIGlmIHRoZSBsYXllciBpcyBjb25uZWN0ZWQgdG8gbW9yZSB0aGFuIG9uZVxuICAgKiAgIGluY29taW5nIGxheWVycy5cbiAgICovXG4gIGdldCBpbnB1dCgpOiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdIHtcbiAgICBpZiAodGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFxuICAgICAgICAgIGBMYXllciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAnIGhhcyBtdWx0aXBsZSBpbmJvdW5kIG5vZGVzLCAnICtcbiAgICAgICAgICAnaGVuY2UgdGhlIG5vdGlvbiBvZiBcImxheWVyIGlucHV0XCIgJyArXG4gICAgICAgICAgJ2lzIGlsbC1kZWZpbmVkLiAnICtcbiAgICAgICAgICAnVXNlIGBnZXRJbnB1dEF0KG5vZGVJbmRleClgIGluc3RlYWQuJyk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmluYm91bmROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBBdHRyaWJ1dGVFcnJvcihcbiAgICAgICAgICBgTGF5ZXIgJHt0aGlzLm5hbWV9YCArXG4gICAgICAgICAgJyBpcyBub3QgY29ubmVjdGVkLCBubyBpbnB1dCB0byByZXR1cm4uJyk7XG4gICAgfVxuICAgIHJldHVybiBnZW5lcmljX3V0aWxzLnNpbmdsZXRvbk9yQXJyYXkoXG4gICAgICAgIHRoaXMuZ2V0Tm9kZUF0SW5kZXgoMCwgJ2lucHV0JykuaW5wdXRUZW5zb3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIG91dHB1dCB0ZW5zb3Iocykgb2YgYSBsYXllci5cbiAgICpcbiAgICogT25seSBhcHBsaWNhYmxlIGlmIHRoZSBsYXllciBoYXMgZXhhY3RseSBvbmUgaW5ib3VuZCBub2RlLFxuICAgKiBpLmUuIGlmIGl0IGlzIGNvbm5lY3RlZCB0byBvbmUgaW5jb21pbmcgbGF5ZXIuXG4gICAqXG4gICAqIEByZXR1cm4gT3V0cHV0IHRlbnNvciBvciBsaXN0IG9mIG91dHB1dCB0ZW5zb3JzLlxuICAgKlxuICAgKiBAZXhjZXB0aW9uIEF0dHJpYnV0ZUVycm9yIGlmIHRoZSBsYXllciBpcyBjb25uZWN0ZWQgdG8gbW9yZSB0aGFuIG9uZVxuICAgKiAgIGluY29taW5nIGxheWVycy5cbiAgICovXG4gIGdldCBvdXRwdXQoKTogU3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXSB7XG4gICAgaWYgKHRoaXMuaW5ib3VuZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFxuICAgICAgICAgIGBMYXllciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAnIGhhcyBubyBpbmJvdW5kIG5vZGVzLicpO1xuICAgIH1cbiAgICBpZiAodGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFxuICAgICAgICAgIGBMYXllciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAnIGhhcyBtdWx0aXBsZSBpbmJvdW5kIG5vZGVzLCAnICtcbiAgICAgICAgICAnaGVuY2UgdGhlIG5vdGlvbiBvZiBcImxheWVyIG91dHB1dFwiICcgK1xuICAgICAgICAgICdpcyBpbGwtZGVmaW5lZC4gJyArXG4gICAgICAgICAgJ1VzZSBgZ2V0T3V0cHV0QXQobm9kZUluZGV4KWAgaW5zdGVhZC4nKTtcbiAgICB9XG4gICAgcmV0dXJuIGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShcbiAgICAgICAgdGhpcy5nZXROb2RlQXRJbmRleCgwLCAnb3V0cHV0Jykub3V0cHV0VGVuc29ycyk7XG4gIH1cblxuICBnZXQgbG9zc2VzKCk6IFJlZ3VsYXJpemVyRm5bXSB7XG4gICAgcmV0dXJuIHRoaXMuX2xvc3NlcztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIExheWVyJ3MgY3VycmVudCBsb3NzIHZhbHVlcy5cbiAgICpcbiAgICogVXNlZCBmb3IgcmVndWxhcml6ZXJzIGR1cmluZyB0cmFpbmluZy5cbiAgICovXG4gIGNhbGN1bGF0ZUxvc3NlcygpOiBTY2FsYXJbXSB7XG4gICAgLy8gUG9ydGluZyBOb2RlOiBUaGlzIGlzIGFuIGF1Z21lbnRhdGlvbiB0byBMYXllci5sb3NzIGluIFB5S2VyYXMuXG4gICAgLy8gICBJbiBQeUtlcmFzLCBMYXllci5sb3NzIHJldHVybnMgc3ltYm9saWMgdGVuc29ycy4gSGVyZSBhIGNvbmNyZXRlXG4gICAgLy8gICBUZW5zb3IgKHNwZWNpZmljYWxseSBTY2FsYXIpIHZhbHVlcyBhcmUgcmV0dXJuZWQuIFRoaXMgaXMgZHVlIHRvIHRoZVxuICAgIC8vICAgaW1wZXJhdGl2ZSBiYWNrZW5kLlxuICAgIHJldHVybiB0aGlzLmxvc3Nlcy5tYXAobG9zc0ZuID0+IGxvc3NGbigpKTtcbiAgfVxuXG4gIGdldCB1cGRhdGVzKCk6IFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGhpcy5fdXBkYXRlcztcbiAgfVxuXG4gIGdldCBidWlsdCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fYnVpbHQ7XG4gIH1cblxuICBzZXQgYnVpbHQoYnVpbHQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9idWlsdCA9IGJ1aWx0O1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy50cmFpbmFibGVfO1xuICB9XG5cbiAgc2V0IHRyYWluYWJsZSh0cmFpbmFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl90cmFpbmFibGVXZWlnaHRzLmZvckVhY2godyA9PiB3LnRyYWluYWJsZSA9IHRyYWluYWJsZSk7XG4gICAgdGhpcy50cmFpbmFibGVfID0gdHJhaW5hYmxlO1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZVdlaWdodHMoKTogTGF5ZXJWYXJpYWJsZVtdIHtcbiAgICBpZiAodGhpcy50cmFpbmFibGVfKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhaW5hYmxlV2VpZ2h0cy5maWx0ZXIodyA9PiB3LnRyYWluYWJsZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gIH1cblxuICBzZXQgdHJhaW5hYmxlV2VpZ2h0cyh3ZWlnaHRzOiBMYXllclZhcmlhYmxlW10pIHtcbiAgICB0aGlzLl90cmFpbmFibGVXZWlnaHRzID0gd2VpZ2h0cztcbiAgfVxuXG4gIGdldCBub25UcmFpbmFibGVXZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgaWYgKHRoaXMudHJhaW5hYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5fdHJhaW5hYmxlV2VpZ2h0cy5maWx0ZXIodyA9PiAhdy50cmFpbmFibGUpXG4gICAgICAgICAgLmNvbmNhdCh0aGlzLl9ub25UcmFpbmFibGVXZWlnaHRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3RyYWluYWJsZVdlaWdodHMuY29uY2F0KHRoaXMuX25vblRyYWluYWJsZVdlaWdodHMpO1xuICAgIH1cbiAgfVxuXG4gIHNldCBub25UcmFpbmFibGVXZWlnaHRzKHdlaWdodHM6IExheWVyVmFyaWFibGVbXSkge1xuICAgIHRoaXMuX25vblRyYWluYWJsZVdlaWdodHMgPSB3ZWlnaHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBsaXN0cyB0cmFpbmFibGVXZWlnaHRzIGFuZCBub25UcmFpbmFibGVXZWlnaHRzXG4gICAqIChpbiB0aGlzIG9yZGVyKS5cbiAgICovXG4gIGdldCB3ZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgcmV0dXJuIHRoaXMudHJhaW5hYmxlV2VpZ2h0cy5jb25jYXQodGhpcy5ub25UcmFpbmFibGVXZWlnaHRzKTtcbiAgfVxuXG4gIGdldCBzdGF0ZWZ1bCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fc3RhdGVmdWw7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHN0YXRlcyBvZiB0aGUgbGF5ZXIuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIG9mIHRoZSBiYXNlIExheWVyIGNsYXNzIGlzIGVzc2VudGlhbGx5IGEgbm8tb3AuXG4gICAqIFN1YmNsYXNzZXMgdGhhdCBhcmUgc3RhdGVmdWwgKGUuZy4sIHN0YXRlZnVsIFJOTnMpIHNob3VsZCBvdmVycmlkZSB0aGlzXG4gICAqIG1ldGhvZC5cbiAgICovXG4gIHJlc2V0U3RhdGVzKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5zdGF0ZWZ1bCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdDYW5ub3QgY2FsbCB0aGUgcmVzZXRTdGF0ZXMoKSBtZXRob2Qgb2YgYSBub24tc3RhdGVmdWwgTGF5ZXIgJyArXG4gICAgICAgICAgJ29iamVjdC4nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGNvbXBhdGliaWxpdHkgYmV0d2VlbiB0aGUgbGF5ZXIgYW5kIHByb3ZpZGVkIGlucHV0cy5cbiAgICpcbiAgICogVGhpcyBjaGVja3MgdGhhdCB0aGUgdGVuc29yKHMpIGBpbnB1dGBcbiAgICogdmVyaWZ5IHRoZSBpbnB1dCBhc3N1bXB0aW9ucyBvZiB0aGUgbGF5ZXJcbiAgICogKGlmIGFueSkuIElmIG5vdCwgZXhjZXB0aW9ucyBhcmUgcmFpc2VkLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIElucHV0IHRlbnNvciBvciBsaXN0IG9mIGlucHV0IHRlbnNvcnMuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVmFsdWVFcnJvciBpbiBjYXNlIG9mIG1pc21hdGNoIGJldHdlZW5cbiAgICogICB0aGUgcHJvdmlkZWQgaW5wdXRzIGFuZCB0aGUgZXhwZWN0YXRpb25zIG9mIHRoZSBsYXllci5cbiAgICovXG4gIHByb3RlY3RlZCBhc3NlcnRJbnB1dENvbXBhdGliaWxpdHkoaW5wdXRzOiBUZW5zb3J8VGVuc29yW118U3ltYm9saWNUZW5zb3J8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9saWNUZW5zb3JbXSk6IHZvaWQge1xuICAgIGlucHV0cyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KGlucHV0cyk7XG4gICAgaWYgKHRoaXMuaW5wdXRTcGVjID09IG51bGwgfHwgdGhpcy5pbnB1dFNwZWMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U3BlYyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KHRoaXMuaW5wdXRTcGVjKTtcbiAgICBpZiAoaW5wdXRzLmxlbmd0aCAhPT0gaW5wdXRTcGVjLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYExheWVyICR7dGhpcy5uYW1lfSBleHBlY3RzICR7aW5wdXRTcGVjLmxlbmd0aH0gaW5wdXRzLCBgICtcbiAgICAgICAgICBgYnV0IGl0IHJlY2VpdmVkICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQgdGVuc29ycy4gYCArXG4gICAgICAgICAgYElucHV0IHJlY2VpdmVkOiAke2lucHV0c31gKTtcbiAgICB9XG4gICAgZm9yIChsZXQgaW5wdXRJbmRleCA9IDA7IGlucHV0SW5kZXggPCBpbnB1dHMubGVuZ3RoOyBpbnB1dEluZGV4KyspIHtcbiAgICAgIGNvbnN0IHggPSBpbnB1dHNbaW5wdXRJbmRleF07XG4gICAgICBjb25zdCBzcGVjOiBJbnB1dFNwZWMgPSBpbnB1dFNwZWNbaW5wdXRJbmRleF07XG4gICAgICBpZiAoc3BlYyA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBuZGltLlxuICAgICAgY29uc3QgbmRpbSA9IHgucmFuaztcbiAgICAgIGlmIChzcGVjLm5kaW0gIT0gbnVsbCkge1xuICAgICAgICBpZiAobmRpbSAhPT0gc3BlYy5uZGltKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnB1dCAke2lucHV0SW5kZXh9IGlzIGluY29tcGF0aWJsZSB3aXRoIGxheWVyICR7dGhpcy5uYW1lfTogYCArXG4gICAgICAgICAgICAgIGBleHBlY3RlZCBuZGltPSR7c3BlYy5uZGltfSwgZm91bmQgbmRpbT0ke25kaW19YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChzcGVjLm1heE5EaW0gIT0gbnVsbCkge1xuICAgICAgICBpZiAobmRpbSA+IHNwZWMubWF4TkRpbSkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgSW5wdXQgJHtpbnB1dEluZGV4fSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciAke3RoaXMubmFtZX1gICtcbiAgICAgICAgICAgICAgYDogZXhwZWN0ZWQgbWF4X25kaW09JHtzcGVjLm1heE5EaW19LCBmb3VuZCBuZGltPSR7bmRpbX1gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHNwZWMubWluTkRpbSAhPSBudWxsKSB7XG4gICAgICAgIGlmIChuZGltIDwgc3BlYy5taW5ORGltKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgIGBJbnB1dCAke2lucHV0SW5kZXh9IGlzIGluY29tcGF0aWJsZSB3aXRoIGxheWVyICR7dGhpcy5uYW1lfWAgK1xuICAgICAgICAgICAgICBgOiBleHBlY3RlZCBtaW5fbmRpbT0ke3NwZWMubWluTkRpbX0sIGZvdW5kIG5kaW09JHtuZGltfS5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBkdHlwZS5cbiAgICAgIGlmIChzcGVjLmR0eXBlICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHguZHR5cGUgIT09IHNwZWMuZHR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYElucHV0ICR7aW5wdXRJbmRleH0gaXMgaW5jb21wYXRpYmxlIHdpdGggbGF5ZXIgJHt0aGlzLm5hbWV9IGAgK1xuICAgICAgICAgICAgICBgOiBleHBlY3RlZCBkdHlwZT0ke3NwZWMuZHR5cGV9LCBmb3VuZCBkdHlwZT0ke3guZHR5cGV9LmApO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHNwZWNpZmljIHNoYXBlIGF4ZXMuXG4gICAgICBpZiAoc3BlYy5heGVzKSB7XG4gICAgICAgIGNvbnN0IHhTaGFwZSA9IHguc2hhcGU7XG4gICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNwZWMuYXhlcykge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPSBOdW1iZXIoa2V5KTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNwZWMuYXhlc1trZXldO1xuICAgICAgICAgIC8vIFBlcmZvcm0gUHl0aG9uLXN0eWxlIHNsaWNpbmcgaW4gY2FzZSBheGlzIDwgMDtcbiAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBVc2UgaHR0cHM6Ly9naXRodWIuY29tL2Fsdml2aS90eXBlc2NyaXB0LXVuZGVyc2NvcmUgdG9cbiAgICAgICAgICAvLyBlbnN1cmUgdHlwZSBzYWZldHkgdGhyb3VnaCBVbmRlcnNjb3JlIGNhbGxzLlxuICAgICAgICAgIGNvbnN0IHhTaGFwZUF0QXhpcyA9XG4gICAgICAgICAgICAgIGF4aXMgPj0gMCA/IHhTaGFwZVtheGlzXSA6IHhTaGFwZVt4U2hhcGUubGVuZ3RoICsgYXhpc107XG4gICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgW3ZhbHVlLCBudWxsXS5pbmRleE9mKHhTaGFwZUF0QXhpcykgPT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgICBgSW5wdXQgJHtpbnB1dEluZGV4fSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciBgICtcbiAgICAgICAgICAgICAgICBgJHt0aGlzLm5hbWV9OiBleHBlY3RlZCBheGlzICR7YXhpc30gb2YgaW5wdXQgc2hhcGUgdG8gYCArXG4gICAgICAgICAgICAgICAgYGhhdmUgdmFsdWUgJHt2YWx1ZX0gYnV0IGdvdCBzaGFwZSAke3hTaGFwZX0uYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHNoYXBlLlxuICAgICAgaWYgKHNwZWMuc2hhcGUgIT0gbnVsbCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNwZWMuc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjb25zdCBzcGVjRGltID0gc3BlYy5zaGFwZVtpXTtcbiAgICAgICAgICBjb25zdCBkaW0gPSB4LnNoYXBlW2ldO1xuICAgICAgICAgIGlmIChzcGVjRGltICE9IG51bGwgJiYgZGltICE9IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChzcGVjRGltICE9PSBkaW0pIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBgSW5wdXQgJHtpbnB1dEluZGV4fSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciBgICtcbiAgICAgICAgICAgICAgICAgIGAke3RoaXMubmFtZX06IGV4cGVjdGVkIHNoYXBlPSR7c3BlYy5zaGFwZX0sIGAgK1xuICAgICAgICAgICAgICAgICAgYGZvdW5kIHNoYXBlPSR7eC5zaGFwZX0uYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgd2hlcmUgdGhlIGxheWVyJ3MgbG9naWMgbGl2ZXMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXQgdGVuc29yLCBvciBsaXN0L3R1cGxlIG9mIGlucHV0IHRlbnNvcnMuXG4gICAqIEBwYXJhbSBrd2FyZ3MgQWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy5cbiAgICpcbiAgICogQHJldHVybiBBIHRlbnNvciBvciBsaXN0L3R1cGxlIG9mIHRlbnNvcnMuXG4gICAqL1xuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIGlucHV0cztcbiAgfVxuXG4gIHByb3RlY3RlZCBpbnZva2VDYWxsSG9vayhpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpIHtcbiAgICBpZiAodGhpcy5fY2FsbEhvb2sgIT0gbnVsbCkge1xuICAgICAgdGhpcy5fY2FsbEhvb2soaW5wdXRzLCBrd2FyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgY2FsbCBob29rLlxuICAgKiBUaGlzIGlzIGN1cnJlbnRseSB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuXG4gICAqIEBwYXJhbSBjYWxsSG9va1xuICAgKi9cbiAgc2V0Q2FsbEhvb2soY2FsbEhvb2s6IENhbGxIb29rKSB7XG4gICAgdGhpcy5fY2FsbEhvb2sgPSBjYWxsSG9vaztcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhciBjYWxsIGhvb2suXG4gICAqIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgZm9yIHRlc3Rpbmcgb25seS5cbiAgICovXG4gIGNsZWFyQ2FsbEhvb2soKSB7XG4gICAgdGhpcy5fY2FsbEhvb2sgPSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBvciBleGVjdXRlcyBhIGBMYXllcmAncyBsb2dpYy5cbiAgICpcbiAgICogV2hlbiBjYWxsZWQgd2l0aCBgdGYuVGVuc29yYChzKSwgZXhlY3V0ZSB0aGUgYExheWVyYCdzIGNvbXB1dGF0aW9uIGFuZFxuICAgKiByZXR1cm4gVGVuc29yKHMpLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgZGVuc2VMYXllciA9IHRmLmxheWVycy5kZW5zZSh7XG4gICAqICAgdW5pdHM6IDEsXG4gICAqICAga2VybmVsSW5pdGlhbGl6ZXI6ICd6ZXJvcycsXG4gICAqICAgdXNlQmlhczogZmFsc2VcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEludm9rZSB0aGUgbGF5ZXIncyBhcHBseSgpIG1ldGhvZCB3aXRoIGEgYHRmLlRlbnNvcmAgKHdpdGggY29uY3JldGVcbiAgICogLy8gbnVtZXJpYyB2YWx1ZXMpLlxuICAgKiBjb25zdCBpbnB1dCA9IHRmLm9uZXMoWzIsIDJdKTtcbiAgICogY29uc3Qgb3V0cHV0ID0gZGVuc2VMYXllci5hcHBseShpbnB1dCk7XG4gICAqXG4gICAqIC8vIFRoZSBvdXRwdXQncyB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBbWzBdLCBbMF1dLCBkdWUgdG8gdGhlIGZhY3QgdGhhdFxuICAgKiAvLyB0aGUgZGVuc2UgbGF5ZXIgaGFzIGEga2VybmVsIGluaXRpYWxpemVkIHRvIGFsbC16ZXJvcyBhbmQgZG9lcyBub3QgaGF2ZVxuICAgKiAvLyBhIGJpYXMuXG4gICAqIG91dHB1dC5wcmludCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogV2hlbiBjYWxsZWQgd2l0aCBgdGYuU3ltYm9saWNUZW5zb3JgKHMpLCB0aGlzIHdpbGwgcHJlcGFyZSB0aGUgbGF5ZXIgZm9yXG4gICAqIGZ1dHVyZSBleGVjdXRpb24uICBUaGlzIGVudGFpbHMgaW50ZXJuYWwgYm9vay1rZWVwaW5nIG9uIHNoYXBlcyBvZlxuICAgKiBleHBlY3RlZCBUZW5zb3JzLCB3aXJpbmcgbGF5ZXJzIHRvZ2V0aGVyLCBhbmQgaW5pdGlhbGl6aW5nIHdlaWdodHMuXG4gICAqXG4gICAqIENhbGxpbmcgYGFwcGx5YCB3aXRoIGB0Zi5TeW1ib2xpY1RlbnNvcmBzIGFyZSB0eXBpY2FsbHkgdXNlZCBkdXJpbmcgdGhlXG4gICAqIGJ1aWxkaW5nIG9mIG5vbi1gdGYuU2VxdWVudGlhbGAgbW9kZWxzLiBGb3IgZXhhbXBsZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgZmxhdHRlbkxheWVyID0gdGYubGF5ZXJzLmZsYXR0ZW4oKTtcbiAgICogY29uc3QgZGVuc2VMYXllciA9IHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDF9KTtcbiAgICpcbiAgICogLy8gVXNlIHRmLmxheWVycy5pbnB1dCgpIHRvIG9idGFpbiBhIFN5bWJvbGljVGVuc29yIGFzIGlucHV0IHRvIGFwcGx5KCkuXG4gICAqIGNvbnN0IGlucHV0ID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAgICogY29uc3Qgb3V0cHV0MSA9IGZsYXR0ZW5MYXllci5hcHBseShpbnB1dCk7XG4gICAqXG4gICAqIC8vIG91dHB1dDEuc2hhcGUgaXMgW251bGwsIDRdLiBUaGUgZmlyc3QgZGltZW5zaW9uIGlzIHRoZSB1bmRldGVybWluZWRcbiAgICogLy8gYmF0Y2ggc2l6ZS4gVGhlIHNlY29uZCBkaW1lbnNpb24gY29tZXMgZnJvbSBmbGF0dGVuaW5nIHRoZSBbMiwgMl1cbiAgICogLy8gc2hhcGUuXG4gICAqIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KG91dHB1dDEuc2hhcGUpKTtcbiAgICpcbiAgICogLy8gVGhlIG91dHB1dCBTeW1ib2xpY1RlbnNvciBvZiB0aGUgZmxhdHRlbiBsYXllciBjYW4gYmUgdXNlZCB0byBjYWxsXG4gICAqIC8vIHRoZSBhcHBseSgpIG9mIHRoZSBkZW5zZSBsYXllcjpcbiAgICogY29uc3Qgb3V0cHV0MiA9IGRlbnNlTGF5ZXIuYXBwbHkob3V0cHV0MSk7XG4gICAqXG4gICAqIC8vIG91dHB1dDIuc2hhcGUgaXMgW251bGwsIDFdLiBUaGUgZmlyc3QgZGltZW5zaW9uIGlzIHRoZSB1bmRldGVybWluZWRcbiAgICogLy8gYmF0Y2ggc2l6ZS4gVGhlIHNlY29uZCBkaW1lbnNpb24gbWF0Y2hlcyB0aGUgbnVtYmVyIG9mIHVuaXRzIG9mIHRoZVxuICAgKiAvLyBkZW5zZSBsYXllci5cbiAgICogY29uc29sZS5sb2coSlNPTi5zdHJpbmdpZnkob3V0cHV0Mi5zaGFwZSkpO1xuICAgKlxuICAgKiAvLyBUaGUgaW5wdXQgYW5kIG91dHB1dCBjYW4gYmUgdXNlZCB0byBjb25zdHJ1Y3QgYSBtb2RlbCB0aGF0IGNvbnNpc3RzXG4gICAqIC8vIG9mIHRoZSBmbGF0dGVuIGFuZCBkZW5zZSBsYXllcnMuXG4gICAqIGNvbnN0IG1vZGVsID0gdGYubW9kZWwoe2lucHV0czogaW5wdXQsIG91dHB1dHM6IG91dHB1dDJ9KTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgYSBgdGYuVGVuc29yYCBvciBgdGYuU3ltYm9saWNUZW5zb3JgIG9yIGFuIEFycmF5IG9mIHRoZW0uXG4gICAqIEBwYXJhbSBrd2FyZ3MgQWRkaXRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gYGNhbGwoKWAuXG4gICAqXG4gICAqIEByZXR1cm4gT3V0cHV0IG9mIHRoZSBsYXllcidzIGBjYWxsYCBtZXRob2QuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVmFsdWVFcnJvciBlcnJvciBpbiBjYXNlIHRoZSBsYXllciBpcyBtaXNzaW5nIHNoYXBlIGluZm9ybWF0aW9uXG4gICAqICAgZm9yIGl0cyBgYnVpbGRgIGNhbGwuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIC8vIFBvcnRpbmcgTm90ZTogVGhpcyBpcyBhIHJlcGxhY2VtZW50IGZvciBfX2NhbGxfXygpIGluIFB5dGhvbi5cbiAgYXBwbHkoXG4gICAgICBpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgICAga3dhcmdzPzogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10ge1xuICAgIGt3YXJncyA9IGt3YXJncyB8fCB7fTtcblxuICAgIHRoaXMuYXNzZXJ0Tm90RGlzcG9zZWQoKTtcblxuICAgIC8vIEVuc3VyZSBpbnB1dHMgYXJlIGFsbCB0aGUgc2FtZSB0eXBlLlxuICAgIGNvbnN0IGlucHV0c0xpc3QgPSBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dHMpO1xuXG4gICAgbGV0IGFsbEFyZVN5bWJvbGljID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0c0xpc3QpIHtcbiAgICAgIGlmICghKGlucHV0IGluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3IpKSB7XG4gICAgICAgIGFsbEFyZVN5bWJvbGljID0gZmFsc2U7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBsZXQgbm9uZUFyZVN5bWJvbGljID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGlucHV0c0xpc3QpIHtcbiAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIFN5bWJvbGljVGVuc29yKSB7XG4gICAgICAgIG5vbmVBcmVTeW1ib2xpYyA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoYWxsQXJlU3ltYm9saWMgPT09IG5vbmVBcmVTeW1ib2xpYykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ0FyZ3VtZW50cyB0byBhcHBseSgpIG11c3QgYmUgYWxsICcgK1xuICAgICAgICAgICdTeW1ib2xpY1RlbnNvcnMgb3IgYWxsIFRlbnNvcnMnKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IG5hbWVTY29wZSgpIG1heSBub3QgYmUgbmVjZXNzYXJ5LlxuICAgIHJldHVybiBuYW1lU2NvcGUodGhpcy5uYW1lLCAoKSA9PiB7XG4gICAgICAvLyBIYW5kbGUgbGF5aW5nIGJ1aWxkaW5nICh3ZWlnaHQgY3JlYXRpbmcsIGlucHV0IHNwZWMgbG9ja2luZykuXG4gICAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgICAgLypcbiAgICAgICAgICBUaHJvdyBleGNlcHRpb25zIGluIGNhc2UgdGhlIGlucHV0IGlzIG5vdCBjb21wYXRpYmxlXG4gICAgICAgICAgd2l0aCB0aGUgaW5wdXRTcGVjIHNwZWNpZmllZCBpbiB0aGUgbGF5ZXIgY29uc3RydWN0b3IuXG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLmFzc2VydElucHV0Q29tcGF0aWJpbGl0eShpbnB1dHMpO1xuXG4gICAgICAgIC8vIENvbGxlY3QgaW5wdXQgc2hhcGVzIHRvIGJ1aWxkIGxheWVyLlxuICAgICAgICBjb25zdCBpbnB1dFNoYXBlczogU2hhcGVbXSA9IFtdO1xuICAgICAgICBmb3IgKGNvbnN0IHhFbGVtIG9mIGdlbmVyaWNfdXRpbHMudG9MaXN0KGlucHV0cykpIHtcbiAgICAgICAgICBpbnB1dFNoYXBlcy5wdXNoKHhFbGVtLnNoYXBlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmJ1aWxkKGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShpbnB1dFNoYXBlcykpO1xuICAgICAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcblxuICAgICAgICAvLyBMb2FkIHdlaWdodHMgdGhhdCB3ZXJlIHNwZWNpZmllZCBhdCBsYXllciBpbnN0YW50aWF0aW9uLlxuICAgICAgICBpZiAodGhpcy5pbml0aWFsV2VpZ2h0cykge1xuICAgICAgICAgIHRoaXMuc2V0V2VpZ2h0cyh0aGlzLmluaXRpYWxXZWlnaHRzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLl9yZWZDb3VudCA9PT0gbnVsbCAmJiBub25lQXJlU3ltYm9saWMpIHtcbiAgICAgICAgICAvLyBUaGUgZmlyc3QgdXNlIG9mIHRoaXMgbGF5ZXIgaXMgYSBub24tc3ltYm9saWMgY2FsbCwgc2V0IHJlZiBjb3VudFxuICAgICAgICAgIC8vIHRvIDEgc28gdGhlIExheWVyIGNhbiBiZSBwcm9wZXJseSBkaXNwb3NlZCBpZiBpdHMgZGlzcG9zZSgpIG1ldGhvZFxuICAgICAgICAgIC8vIGlzIGNhbGxlZC5cbiAgICAgICAgICB0aGlzLl9yZWZDb3VudCA9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLypcbiAgICAgICAgVGhyb3cgZXhjZXB0aW9ucyBpbiBjYXNlIHRoZSBpbnB1dCBpcyBub3QgY29tcGF0aWJsZVxuICAgICAgICB3aXRoIHRoZSBpbnB1dFNwZWMgc2V0IGF0IGJ1aWxkIHRpbWUuXG4gICAgICAqL1xuICAgICAgdGhpcy5hc3NlcnRJbnB1dENvbXBhdGliaWxpdHkoaW5wdXRzKTtcblxuICAgICAgLy8gSGFuZGxlIG1hc2sgcHJvcGFnYXRpb24uXG4gICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IE1hc2sgcHJvcGFnYXRpb24gbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZC5cblxuICAgICAgLy8gQWN0dWFsbHkgY2FsbCB0aGUgbGF5ZXIsIGNvbGxlY3Rpbmcgb3V0cHV0KHMpLCBtYXNrKHMpLCBhbmQgc2hhcGUocykuXG4gICAgICBpZiAobm9uZUFyZVN5bWJvbGljKSB7XG4gICAgICAgIGxldCBvdXRwdXQgPSB0aGlzLmNhbGwoaW5wdXRzIGFzIFRlbnNvciB8IFRlbnNvcltdLCBrd2FyZ3MpO1xuICAgICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IENvbXB1dGUgdGhlIG91dHB1dE1hc2tcblxuICAgICAgICAvLyBJZiB0aGUgbGF5ZXIgcmV0dXJucyB0ZW5zb3JzIGZyb20gaXRzIGlucHV0cywgdW5tb2RpZmllZCxcbiAgICAgICAgLy8gd2UgY29weSB0aGVtIHRvIGF2b2lkIGxvc3Mgb2YgdGVuc29yIG1ldGFkYXRhLlxuICAgICAgICBjb25zdCBvdXRwdXRMaXN0OiBUZW5zb3JbXSA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KG91dHB1dCk7XG4gICAgICAgIGNvbnN0IG91dHB1dExpc3RDb3B5OiBUZW5zb3JbXSA9IFtdO1xuICAgICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IFRoaXMgY29weWluZyBtYXkgbm90IGJlIG5lY2Vzc2FyeSBnaXZlbiBvdXIgZWFnZXJcbiAgICAgICAgLy8gYmFja2VuZC5cbiAgICAgICAgZm9yIChsZXQgeCBvZiBvdXRwdXRMaXN0KSB7XG4gICAgICAgICAgaWYgKGlucHV0c0xpc3QuaW5kZXhPZih4KSAhPT0gLTEpIHtcbiAgICAgICAgICAgIHggPSB4LmNsb25lKCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIG91dHB1dExpc3RDb3B5LnB1c2goeCk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0ID0gZ2VuZXJpY191dGlscy5zaW5nbGV0b25PckFycmF5KG91dHB1dExpc3RDb3B5KTtcblxuICAgICAgICBpZiAodGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICAgJ0xheWVyIGludm9jYXRpb24gaW4gdGhlIHByZXNlbmNlIG9mIGFjdGl2aXR5ICcgK1xuICAgICAgICAgICAgICAncmVndWxhcml6ZXIocykgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IENhbGwgYWRkSW5ib3VuZE5vZGUoKT9cbiAgICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGlucHV0U2hhcGUgPSBjb2xsZWN0SW5wdXRTaGFwZShpbnB1dHMpO1xuICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHRoaXMuY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGUpO1xuICAgICAgICBsZXQgb3V0cHV0OiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdO1xuICAgICAgICBjb25zdCBvdXRwdXREVHlwZSA9IGd1ZXNzT3V0cHV0RFR5cGUoaW5wdXRzKTtcbiAgICAgICAgdGhpcy53YXJuT25JbmNvbXBhdGlibGVJbnB1dFNoYXBlKFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShpbnB1dHMpID8gaW5wdXRTaGFwZVswXSBhcyBTaGFwZSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNoYXBlIGFzIFNoYXBlKTtcblxuICAgICAgICBpZiAob3V0cHV0U2hhcGUgIT0gbnVsbCAmJiBvdXRwdXRTaGFwZS5sZW5ndGggPiAwICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KG91dHB1dFNoYXBlWzBdKSkge1xuICAgICAgICAgIC8vIFdlIGhhdmUgbXVsdGlwbGUgb3V0cHV0IHNoYXBlcy4gQ3JlYXRlIG11bHRpcGxlIG91dHB1dCB0ZW5zb3JzLlxuICAgICAgICAgIG91dHB1dCA9IChvdXRwdXRTaGFwZSBhcyBTaGFwZVtdKVxuICAgICAgICAgICAgICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNoYXBlLCBpbmRleCkgPT4gbmV3IFN5bWJvbGljVGVuc29yKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERUeXBlLCBzaGFwZSwgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dHMpLCBrd2FyZ3MsIHRoaXMubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dCA9IG5ldyBTeW1ib2xpY1RlbnNvcihcbiAgICAgICAgICAgICAgb3V0cHV0RFR5cGUsIG91dHB1dFNoYXBlIGFzIFNoYXBlLCB0aGlzLFxuICAgICAgICAgICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dHMpLCBrd2FyZ3MsIHRoaXMubmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgIEFkZCBhbiBpbmJvdW5kIG5vZGUgdG8gdGhlIGxheWVyLCBzbyB0aGF0IGl0IGtlZXBzIHRyYWNrXG4gICAgICAgICAgb2YgdGhlIGNhbGwgYW5kIG9mIGFsbCBuZXcgdmFyaWFibGVzIGNyZWF0ZWQgZHVyaW5nIHRoZSBjYWxsLlxuICAgICAgICAgIFRoaXMgYWxzbyB1cGRhdGVzIHRoZSBsYXllciBoaXN0b3J5IG9mIHRoZSBvdXRwdXQgdGVuc29yKHMpLlxuICAgICAgICAgIElmIHRoZSBpbnB1dCB0ZW5zb3IocykgaGFkIG5vIHByZXZpb3VzIGhpc3RvcnksXG4gICAgICAgICAgdGhpcyBkb2VzIG5vdGhpbmcuXG4gICAgICAgICovXG4gICAgICAgIHRoaXMuYWRkSW5ib3VuZE5vZGUoXG4gICAgICAgICAgICBpbnB1dHMgYXMgU3ltYm9saWNUZW5zb3IgfCBTeW1ib2xpY1RlbnNvcltdLCBvdXRwdXQsIG51bGwsIG51bGwsXG4gICAgICAgICAgICBpbnB1dFNoYXBlLCBvdXRwdXRTaGFwZSwga3dhcmdzKTtcbiAgICAgICAgdGhpcy5fcmVmQ291bnQrKztcblxuICAgICAgICBpZiAodGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyICE9IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICAgJ0xheWVyIGludm9jYXRpb24gaW4gdGhlIHByZXNlbmNlIG9mIGFjdGl2aXR5ICcgK1xuICAgICAgICAgICAgICAncmVndWxhcml6ZXIocykgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrIGNvbXBhdGliaWxpdHkgYmV0d2VlbiBpbnB1dCBzaGFwZSBhbmQgdGhpcyBsYXllcidzIGJhdGNoSW5wdXRTaGFwZS5cbiAgICpcbiAgICogUHJpbnQgd2FybmluZyBpZiBhbnkgaW5jb21wYXRpYmlsaXR5IGlzIGZvdW5kLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRTaGFwZSBJbnB1dCBzaGFwZSB0byBiZSBjaGVja2VkLlxuICAgKi9cbiAgcHJvdGVjdGVkIHdhcm5PbkluY29tcGF0aWJsZUlucHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGUpIHtcbiAgICBpZiAodGhpcy5iYXRjaElucHV0U2hhcGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gZWxzZSBpZiAoaW5wdXRTaGFwZS5sZW5ndGggIT09IHRoaXMuYmF0Y2hJbnB1dFNoYXBlLmxlbmd0aCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBUaGUgcmFuayBvZiB0aGUgaW5wdXQgdGVuc29yIHByb3ZpZGVkIChzaGFwZTogYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZSl9KSBkb2VzIG5vdCBtYXRjaCB0aGF0IG9mIHRoZSBgICtcbiAgICAgICAgICBgYmF0Y2hJbnB1dFNoYXBlICgke0pTT04uc3RyaW5naWZ5KHRoaXMuYmF0Y2hJbnB1dFNoYXBlKX0pIGAgK1xuICAgICAgICAgIGBvZiB0aGUgbGF5ZXIgJHt0aGlzLm5hbWV9YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBkaW1NaXNtYXRjaCA9IGZhbHNlO1xuICAgICAgdGhpcy5iYXRjaElucHV0U2hhcGUuZm9yRWFjaCgoZGltZW5zaW9uLCBpKSA9PiB7XG4gICAgICAgIGlmIChkaW1lbnNpb24gIT0gbnVsbCAmJiBpbnB1dFNoYXBlW2ldICE9IG51bGwgJiZcbiAgICAgICAgICAgIGlucHV0U2hhcGVbaV0gIT09IGRpbWVuc2lvbikge1xuICAgICAgICAgIGRpbU1pc21hdGNoID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoZGltTWlzbWF0Y2gpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgYFRoZSBzaGFwZSBvZiB0aGUgaW5wdXQgdGVuc29yIGAgK1xuICAgICAgICAgICAgYCgke0pTT04uc3RyaW5naWZ5KGlucHV0U2hhcGUpfSkgZG9lcyBub3QgYCArXG4gICAgICAgICAgICBgbWF0Y2ggdGhlIGV4cGVjdGF0aW9uIG9mIGxheWVyICR7dGhpcy5uYW1lfTogYCArXG4gICAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmJhdGNoSW5wdXRTaGFwZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgb3V0cHV0IHNoYXBlKHMpIG9mIGEgbGF5ZXIuXG4gICAqXG4gICAqIE9ubHkgYXBwbGljYWJsZSBpZiB0aGUgbGF5ZXIgaGFzIG9ubHkgb25lIGluYm91bmQgbm9kZSwgb3IgaWYgYWxsIGluYm91bmRcbiAgICogbm9kZXMgaGF2ZSB0aGUgc2FtZSBvdXRwdXQgc2hhcGUuXG4gICAqXG4gICAqIEByZXR1cm5zIE91dHB1dCBzaGFwZSBvciBzaGFwZXMuXG4gICAqIEB0aHJvd3MgQXR0cmlidXRlRXJyb3I6IGlmIHRoZSBsYXllciBpcyBjb25uZWN0ZWQgdG8gbW9yZSB0aGFuIG9uZSBpbmNvbWluZ1xuICAgKiAgIG5vZGVzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgJ3N1YmhlYWRpbmcnOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBnZXQgb3V0cHV0U2hhcGUoKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaWYgKHRoaXMuaW5ib3VuZE5vZGVzID09IG51bGwgfHwgdGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlRXJyb3IoXG4gICAgICAgICAgYFRoZSBsYXllciAke3RoaXMubmFtZX0gaGFzIG5ldmVyIGJlZW4gY2FsbGVkIGFuZCB0aHVzIGhhcyBubyBgICtcbiAgICAgICAgICBgZGVmaW5lZCBvdXRwdXQgc2hhcGUuYCk7XG4gICAgfVxuICAgIGNvbnN0IGFsbE91dHB1dFNoYXBlczogc3RyaW5nW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5vZGUgb2YgdGhpcy5pbmJvdW5kTm9kZXMpIHtcbiAgICAgIGNvbnN0IHNoYXBlU3RyaW5nID0gSlNPTi5zdHJpbmdpZnkobm9kZS5vdXRwdXRTaGFwZXMpO1xuICAgICAgaWYgKGFsbE91dHB1dFNoYXBlcy5pbmRleE9mKHNoYXBlU3RyaW5nKSA9PT0gLTEpIHtcbiAgICAgICAgYWxsT3V0cHV0U2hhcGVzLnB1c2goc2hhcGVTdHJpbmcpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoYWxsT3V0cHV0U2hhcGVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgY29uc3Qgb3V0cHV0U2hhcGVzID0gdGhpcy5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0U2hhcGVzO1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0U2hhcGVzKSAmJiBBcnJheS5pc0FycmF5KG91dHB1dFNoYXBlc1swXSkgJiZcbiAgICAgICAgICBvdXRwdXRTaGFwZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIHJldHVybiAob3V0cHV0U2hhcGVzIGFzIFNoYXBlW10pWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dFNoYXBlcztcbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgQXR0cmlidXRlRXJyb3IoXG4gICAgICAgICAgYFRoZSBsYXllciAke3RoaXMubmFtZX0gaGFzIG11bHRpcGxlIGluYm91bmQgbm9kZXMgd2l0aCBkaWZmZXJlbnQgYCArXG4gICAgICAgICAgYG91dHB1dCBzaGFwZXMuIEhlbmNlIHRoZSBub3Rpb24gb2YgXCJvdXRwdXQgc2hhcGVcIiBpcyBpbGwtZGVmaW5lZCBgICtcbiAgICAgICAgICBgZm9yIHRoZSBsYXllci5gKTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEltcGxlbWVudCBnZXRPdXRwdXRTaGFwZUF0KCkuXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENvdW50cyB0aGUgdG90YWwgbnVtYmVyIG9mIG51bWJlcnMgKGUuZy4sIGZsb2F0MzIsIGludDMyKSBpbiB0aGVcbiAgICogd2VpZ2h0cy5cbiAgICpcbiAgICogQHJldHVybnMgQW4gaW50ZWdlciBjb3VudC5cbiAgICogQHRocm93cyBSdW50aW1lRXJyb3I6IElmIHRoZSBsYXllciBpcyBub3QgYnVpbHQgeWV0IChpbiB3aGljaCBjYXNlIGl0c1xuICAgKiAgIHdlaWdodHMgYXJlIG5vdCBkZWZpbmVkIHlldC4pXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGNvdW50UGFyYW1zKCk6IG51bWJlciB7XG4gICAgaWYgKCF0aGlzLmJ1aWx0KSB7XG4gICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgIGBZb3UgdHJpZWQgdG8gY2FsbCBjb3VudFBhcmFtcygpIG9uICR7dGhpcy5uYW1lfSwgYCArXG4gICAgICAgICAgYGJ1dCB0aGUgbGF5ZXIgaXMgbm90IGJ1aWx0IHlldC4gQnVpbGQgaXQgZmlyc3QgYnkgY2FsbGluZyBgICtcbiAgICAgICAgICBgYnVpbGQoYmF0Y2hJbnB1dFNoYXBlKS5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhcmlhYmxlX3V0aWxzLmNvdW50UGFyYW1zSW5XZWlnaHRzKHRoaXMud2VpZ2h0cyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyB0aGUgbGF5ZXIgd2VpZ2h0cy5cbiAgICpcbiAgICogTXVzdCBiZSBpbXBsZW1lbnRlZCBvbiBhbGwgbGF5ZXJzIHRoYXQgaGF2ZSB3ZWlnaHRzLlxuICAgKlxuICAgKiBDYWxsZWQgd2hlbiBhcHBseSgpIGlzIGNhbGxlZCB0byBjb25zdHJ1Y3QgdGhlIHdlaWdodHMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dFNoYXBlIEEgYFNoYXBlYCBvciBhcnJheSBvZiBgU2hhcGVgICh1bnVzZWQpLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgJ3N1YmhlYWRpbmcnOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKSB7XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIHdlaWdodHMgb2YgdGhlIGxheWVyLlxuICAgKlxuICAgKiBAcGFyYW0gdHJhaW5hYmxlT25seSBXaGV0aGVyIHRvIGdldCB0aGUgdmFsdWVzIG9mIG9ubHkgdHJhaW5hYmxlIHdlaWdodHMuXG4gICAqIEByZXR1cm5zIFdlaWdodCB2YWx1ZXMgYXMgYW4gYEFycmF5YCBvZiBgdGYuVGVuc29yYHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGdldFdlaWdodHModHJhaW5hYmxlT25seSA9IGZhbHNlKTogVGVuc29yW10ge1xuICAgIHJldHVybiBiYXRjaEdldFZhbHVlKHRyYWluYWJsZU9ubHkgPyB0aGlzLnRyYWluYWJsZVdlaWdodHMgOiB0aGlzLndlaWdodHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdlaWdodHMgb2YgdGhlIGxheWVyLCBmcm9tIFRlbnNvcnMuXG4gICAqXG4gICAqIEBwYXJhbSB3ZWlnaHRzIGEgbGlzdCBvZiBUZW5zb3JzLiBUaGUgbnVtYmVyIG9mIGFycmF5cyBhbmQgdGhlaXIgc2hhcGVcbiAgICogICBtdXN0IG1hdGNoIG51bWJlciBvZiB0aGUgZGltZW5zaW9ucyBvZiB0aGUgd2VpZ2h0cyBvZiB0aGUgbGF5ZXIgKGkuZS5cbiAgICogICBpdCBzaG91bGQgbWF0Y2ggdGhlIG91dHB1dCBvZiBgZ2V0V2VpZ2h0c2ApLlxuICAgKlxuICAgKiBAZXhjZXB0aW9uIFZhbHVlRXJyb3IgSWYgdGhlIHByb3ZpZGVkIHdlaWdodHMgbGlzdCBkb2VzIG5vdCBtYXRjaCB0aGVcbiAgICogICBsYXllcidzIHNwZWNpZmljYXRpb25zLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgJ3N1YmhlYWRpbmcnOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBzZXRXZWlnaHRzKHdlaWdodHM6IFRlbnNvcltdKTogdm9pZCB7XG4gICAgdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBwYXJhbXMgPSB0aGlzLndlaWdodHM7XG4gICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gd2VpZ2h0cy5sZW5ndGgpIHtcbiAgICAgICAgLy8gVE9ETyhjYWlzKTogUmVzdG9yZSB0aGUgZm9sbG93aW5nIGFuZCB1c2UgYHByb3ZpZGVkV2VpZ2h0c2AsIGluc3RlYWRcbiAgICAgICAgLy8gb2YgYHdlaWdodHNgIGluIHRoZSBlcnJvciBtZXNzYWdlLCBvbmNlIHRoZSBkZWVwbGVhcm4uanMgYnVnIGlzXG4gICAgICAgIC8vIGZpeGVkOiBodHRwczovL2dpdGh1Yi5jb20vUEFJUi1jb2RlL2RlZXBsZWFybmpzL2lzc3Vlcy80OTggY29uc3RcbiAgICAgICAgLy8gcHJvdmlkZWRXZWlnaHRzID0gSlNPTi5zdHJpbmdpZnkod2VpZ2h0cykuc2xpY2UoMCwgNTApO1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBZb3UgY2FsbGVkIHNldFdlaWdodHMod2VpZ2h0cykgb24gbGF5ZXIgXCIke3RoaXMubmFtZX1cIiBgICtcbiAgICAgICAgICAgIGB3aXRoIGEgd2VpZ2h0IGxpc3Qgb2YgbGVuZ3RoICR7d2VpZ2h0cy5sZW5ndGh9LCBgICtcbiAgICAgICAgICAgIGBidXQgdGhlIGxheWVyIHdhcyBleHBlY3RpbmcgJHtwYXJhbXMubGVuZ3RofSB3ZWlnaHRzLiBgICtcbiAgICAgICAgICAgIGBQcm92aWRlZCB3ZWlnaHRzOiAke3dlaWdodHN9Li4uYCk7XG4gICAgICB9XG4gICAgICBpZiAocGFyYW1zLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB3ZWlnaHRWYWx1ZVR1cGxlczogQXJyYXk8W0xheWVyVmFyaWFibGUsIFRlbnNvcl0+ID0gW107XG4gICAgICBjb25zdCBwYXJhbVZhbHVlcyA9IGJhdGNoR2V0VmFsdWUocGFyYW1zKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGFyYW1WYWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgcHYgPSBwYXJhbVZhbHVlc1tpXTtcbiAgICAgICAgY29uc3QgcCA9IHBhcmFtc1tpXTtcbiAgICAgICAgY29uc3QgdyA9IHdlaWdodHNbaV07XG4gICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbChwdi5zaGFwZSwgdy5zaGFwZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYExheWVyIHdlaWdodCBzaGFwZSAke3B2LnNoYXBlfSBgICtcbiAgICAgICAgICAgICAgYG5vdCBjb21wYXRpYmxlIHdpdGggcHJvdmlkZWQgd2VpZ2h0IHNoYXBlICR7dy5zaGFwZX1gKTtcbiAgICAgICAgfVxuICAgICAgICB3ZWlnaHRWYWx1ZVR1cGxlcy5wdXNoKFtwLCB3XSk7XG4gICAgICB9XG4gICAgICBiYXRjaFNldFZhbHVlKHdlaWdodFZhbHVlVHVwbGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIGEgd2VpZ2h0IHZhcmlhYmxlIHRvIHRoZSBsYXllci5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgbmV3IHdlaWdodCB2YXJpYWJsZS5cbiAgICogQHBhcmFtIHNoYXBlIFRoZSBzaGFwZSBvZiB0aGUgd2VpZ2h0LlxuICAgKiBAcGFyYW0gZHR5cGUgVGhlIGR0eXBlIG9mIHRoZSB3ZWlnaHQuXG4gICAqIEBwYXJhbSBpbml0aWFsaXplciBBbiBpbml0aWFsaXplciBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHJlZ3VsYXJpemVyIEEgcmVndWxhcml6ZXIgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSB0cmFpbmFibGUgV2hldGhlciB0aGUgd2VpZ2h0IHNob3VsZCBiZSB0cmFpbmVkIHZpYSBiYWNrcHJvcCBvciBub3RcbiAgICogICAoYXNzdW1pbmcgdGhhdCB0aGUgbGF5ZXIgaXRzZWxmIGlzIGFsc28gdHJhaW5hYmxlKS5cbiAgICogQHBhcmFtIGNvbnN0cmFpbnQgQW4gb3B0aW9uYWwgdHJhaW5hYmxlLlxuICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIHdlaWdodCB2YXJpYWJsZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsICdzdWJoZWFkaW5nJzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgcHJvdGVjdGVkIGFkZFdlaWdodChcbiAgICAgIG5hbWU6IHN0cmluZywgc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlLCBpbml0aWFsaXplcj86IEluaXRpYWxpemVyLFxuICAgICAgcmVndWxhcml6ZXI/OiBSZWd1bGFyaXplciwgdHJhaW5hYmxlPzogYm9vbGVhbiwgY29uc3RyYWludD86IENvbnN0cmFpbnQsXG4gICAgICBnZXRJbml0aWFsaXplckZ1bmM/OiBGdW5jdGlvbik6IExheWVyVmFyaWFibGUge1xuICAgIC8vIFJlamVjdCBkdXBsaWNhdGUgd2VpZ2h0IG5hbWVzLlxuICAgIGlmICh0aGlzLl9hZGRlZFdlaWdodE5hbWVzLmluZGV4T2YobmFtZSkgIT09IC0xKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgRHVwbGljYXRlIHdlaWdodCBuYW1lICR7bmFtZX0gZm9yIGxheWVyICR7dGhpcy5uYW1lfWApO1xuICAgIH1cbiAgICB0aGlzLl9hZGRlZFdlaWdodE5hbWVzLnB1c2gobmFtZSk7XG5cbiAgICBpZiAoZHR5cGUgPT0gbnVsbCkge1xuICAgICAgZHR5cGUgPSAnZmxvYXQzMic7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCkge1xuICAgICAgaW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplckZ1bmMgIT0gbnVsbCA/IGdldEluaXRpYWxpemVyRnVuYygpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJbml0aWFsaXplcignemVyb3MnKTtcbiAgICB9XG4gICAgY29uc3QgaW5pdFZhbHVlID0gaW5pdGlhbGl6ZXIuYXBwbHkoc2hhcGUsIGR0eXBlKTtcbiAgICBjb25zdCB3ZWlnaHQgPVxuICAgICAgICBuZXcgTGF5ZXJWYXJpYWJsZShpbml0VmFsdWUsIGR0eXBlLCBuYW1lLCB0cmFpbmFibGUsIGNvbnN0cmFpbnQpO1xuICAgIGluaXRWYWx1ZS5kaXNwb3NlKCk7XG4gICAgLy8gUmVxdWVzdCBiYWNrZW5kIG5vdCB0byBkaXNwb3NlIHRoZSB3ZWlnaHRzIG9mIHRoZSBtb2RlbCBvbiBzY29wZSgpIGV4aXQuXG4gICAgaWYgKHJlZ3VsYXJpemVyICE9IG51bGwpIHtcbiAgICAgIHRoaXMuYWRkTG9zcygoKSA9PiByZWd1bGFyaXplci5hcHBseSh3ZWlnaHQucmVhZCgpKSk7XG4gICAgfVxuICAgIGlmICh0cmFpbmFibGUgPT0gbnVsbCkge1xuICAgICAgdHJhaW5hYmxlID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHRyYWluYWJsZSkge1xuICAgICAgdGhpcy5fdHJhaW5hYmxlV2VpZ2h0cy5wdXNoKHdlaWdodCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX25vblRyYWluYWJsZVdlaWdodHMucHVzaCh3ZWlnaHQpO1xuICAgIH1cbiAgICByZXR1cm4gd2VpZ2h0O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmFzdC13ZWlnaHQtaW5pdGlhbGl6YXRpb24gZmxhZy5cbiAgICpcbiAgICogSW4gY2FzZXMgd2hlcmUgdGhlIGluaXRpYWxpemVkIHdlaWdodCB2YWx1ZXMgd2lsbCBiZSBpbW1lZGlhdGVseVxuICAgKiBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0IHZhbHVlcyBkdXJpbmcgbW9kZWwgbG9hZGluZywgc2V0dGluZ1xuICAgKiB0aGUgZmxhZyB0byBgdHJ1ZWAgc2F2ZXMgdW5uZWNlc3NhcnkgY2FsbHMgdG8gcG90ZW50aWFsbHkgZXhwZW5zaXZlXG4gICAqIGluaXRpYWxpemVycyBhbmQgc3BlZWRzIHVwIHRoZSBsb2FkaW5nIHByb2Nlc3MuXG4gICAqXG4gICAqIEBwYXJhbSB2YWx1ZSBUYXJnZXQgdmFsdWUgb2YgdGhlIGZsYWcuXG4gICAqL1xuICBzZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgdGhpcy5mYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkID0gdmFsdWU7XG4gIH1cblxuICAvKipcbiAgICogQWRkIGxvc3NlcyB0byB0aGUgbGF5ZXIuXG4gICAqXG4gICAqIFRoZSBsb3NzIG1heSBwb3RlbnRpYWxseSBiZSBjb25kaXRpb25hbCBvbiBzb21lIGlucHV0cyB0ZW5zb3JzLFxuICAgKiBmb3IgaW5zdGFuY2UgYWN0aXZpdHkgbG9zc2VzIGFyZSBjb25kaXRpb25hbCBvbiB0aGUgbGF5ZXIncyBpbnB1dHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFkZExvc3MobG9zc2VzOiBSZWd1bGFyaXplckZufFJlZ3VsYXJpemVyRm5bXSk6IHZvaWQge1xuICAgIGlmIChsb3NzZXMgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KGxvc3NlcykgJiYgbG9zc2VzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBVcGRhdGUgdGhpcy5sb3NzZXNcbiAgICBsb3NzZXMgPSBnZW5lcmljX3V0aWxzLnRvTGlzdChsb3NzZXMpO1xuICAgIGlmICh0aGlzLl9sb3NzZXMgIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9sb3NzZXMgIT09IG51bGwpIHtcbiAgICAgIHRoaXMubG9zc2VzLnB1c2goLi4ubG9zc2VzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIG91dHB1dCBzaGFwZSBvZiB0aGUgbGF5ZXIuXG4gICAqXG4gICAqIEFzc3VtZXMgdGhhdCB0aGUgbGF5ZXIgd2lsbCBiZSBidWlsdCB0byBtYXRjaCB0aGF0IGlucHV0IHNoYXBlIHByb3ZpZGVkLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRTaGFwZSBBIHNoYXBlICh0dXBsZSBvZiBpbnRlZ2Vycykgb3IgYSBsaXN0IG9mIHNoYXBlIHR1cGxlc1xuICAgKiAgIChvbmUgcGVyIG91dHB1dCB0ZW5zb3Igb2YgdGhlIGxheWVyKS4gU2hhcGUgdHVwbGVzIGNhbiBpbmNsdWRlIG51bGwgZm9yXG4gICAqICAgZnJlZSBkaW1lbnNpb25zLCBpbnN0ZWFkIG9mIGFuIGludGVnZXIuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCAnc3ViaGVhZGluZyc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgYW4gb3V0cHV0IG1hc2sgdGVuc29yLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRzIFRlbnNvciBvciBsaXN0IG9mIHRlbnNvcnMuXG4gICAqIEBwYXJhbSBtYXNrIFRlbnNvciBvciBsaXN0IG9mIHRlbnNvcnMuXG4gICAqXG4gICAqIEByZXR1cm4gbnVsbCBvciBhIHRlbnNvciAob3IgbGlzdCBvZiB0ZW5zb3JzLCBvbmUgcGVyIG91dHB1dCB0ZW5zb3Igb2YgdGhlXG4gICAqIGxheWVyKS5cbiAgICovXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yXG4gICAgICB8VGVuc29yW10ge1xuICAgIGlmICghdGhpcy5zdXBwb3J0c01hc2tpbmcpIHtcbiAgICAgIGlmIChtYXNrICE9IG51bGwpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobWFzaykpIHtcbiAgICAgICAgICBtYXNrLmZvckVhY2gobWFza0VsZW1lbnQgPT4ge1xuICAgICAgICAgICAgaWYgKG1hc2tFbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgICAgIGBMYXllciAke3RoaXMubmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBtYXNraW5nLCBgICtcbiAgICAgICAgICAgICAgICAgICdidXQgd2FzIHBhc3NlZCBhbiBpbnB1dE1hc2suJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICAgYExheWVyICR7dGhpcy5uYW1lfSBkb2VzIG5vdCBzdXBwb3J0IG1hc2tpbmcsIGAgK1xuICAgICAgICAgICAgICAnYnV0IHdhcyBwYXNzZWQgYW4gaW5wdXRNYXNrLicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBtYXNraW5nIG5vdCBleHBsaWNpdGx5IHN1cHBvcnRlZDogcmV0dXJuIG51bGwgYXMgbWFza1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIC8vIGlmIG1hc2tpbmcgaXMgZXhwbGljdGx5IHN1cHBvcnRlZCwgYnkgZGVmYXVsdFxuICAgIC8vIGNhcnJ5IG92ZXIgdGhlIGlucHV0IG1hc2tcbiAgICByZXR1cm4gbWFzaztcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCBtZXRob2QgdG8gY3JlYXRlIGFuIGluYm91bmQgbm9kZSBmb3IgdGhlIGxheWVyLlxuICAgKlxuICAgKiBAcGFyYW0gaW5wdXRUZW5zb3JzIExpc3Qgb2YgaW5wdXQgdGVuc29ycy5cbiAgICogQHBhcmFtIG91dHB1dFRlbnNvcnMgTGlzdCBvZiBvdXRwdXQgdGVuc29ycy5cbiAgICogQHBhcmFtIGlucHV0TWFza3MgTGlzdCBvZiBpbnB1dCBtYXNrcyAoYSBtYXNrIGNhbiBiZSBhIHRlbnNvciwgb3IgbnVsbCkuXG4gICAqIEBwYXJhbSBvdXRwdXRNYXNrcyBMaXN0IG9mIG91dHB1dCBtYXNrcyAoYSBtYXNrIGNhbiBiZSBhIHRlbnNvciwgb3IgbnVsbCkuXG4gICAqIEBwYXJhbSBpbnB1dFNoYXBlcyBMaXN0IG9mIGlucHV0IHNoYXBlIHR1cGxlcy5cbiAgICogQHBhcmFtIG91dHB1dFNoYXBlcyBMaXN0IG9mIG91dHB1dCBzaGFwZSB0dXBsZXMuXG4gICAqIEBwYXJhbSBrd2FyZ3MgRGljdGlvbmFyeSBvZiBrZXl3b3JkIGFyZ3VtZW50cyB0aGF0IHdlcmUgcGFzc2VkIHRvIHRoZVxuICAgKiAgIGBjYWxsYCBtZXRob2Qgb2YgdGhlIGxheWVyIGF0IHRoZSBjYWxsIHRoYXQgY3JlYXRlZCB0aGUgbm9kZS5cbiAgICovXG4gIHByaXZhdGUgYWRkSW5ib3VuZE5vZGUoXG4gICAgICBpbnB1dFRlbnNvcnM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10sXG4gICAgICBvdXRwdXRUZW5zb3JzOiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgICAgaW5wdXRNYXNrczogVGVuc29yfFRlbnNvcltdLCBvdXRwdXRNYXNrczogVGVuc29yfFRlbnNvcltdLFxuICAgICAgaW5wdXRTaGFwZXM6IFNoYXBlfFNoYXBlW10sIG91dHB1dFNoYXBlczogU2hhcGV8U2hhcGVbXSxcbiAgICAgIGt3YXJnczoge30gPSBudWxsKTogdm9pZCB7XG4gICAgY29uc3QgaW5wdXRUZW5zb3JMaXN0OiBTeW1ib2xpY1RlbnNvcltdID1cbiAgICAgICAgZ2VuZXJpY191dGlscy50b0xpc3QoaW5wdXRUZW5zb3JzKTtcbiAgICBvdXRwdXRUZW5zb3JzID0gZ2VuZXJpY191dGlscy50b0xpc3Qob3V0cHV0VGVuc29ycyk7XG4gICAgaW5wdXRNYXNrcyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KGlucHV0TWFza3MpO1xuICAgIG91dHB1dE1hc2tzID0gZ2VuZXJpY191dGlscy50b0xpc3Qob3V0cHV0TWFza3MpO1xuICAgIGlucHV0U2hhcGVzID0gdHlwZXNfdXRpbHMubm9ybWFsaXplU2hhcGVMaXN0KGlucHV0U2hhcGVzKTtcbiAgICBvdXRwdXRTaGFwZXMgPSB0eXBlc191dGlscy5ub3JtYWxpemVTaGFwZUxpc3Qob3V0cHV0U2hhcGVzKTtcblxuICAgIC8vIENvbGxlY3QgaW5wdXQgdGVuc29yKHMpIGNvb3JkaW5hdGVzLlxuICAgIGNvbnN0IGluYm91bmRMYXllcnM6IExheWVyW10gPSBbXTtcbiAgICBjb25zdCBub2RlSW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCB0ZW5zb3JJbmRpY2VzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgeCBvZiBpbnB1dFRlbnNvckxpc3QpIHtcbiAgICAgIC8qXG4gICAgICAgKiBUT0RPKG1pY2hhZWx0ZXJyeSk6IEtlcmFzIGFkZHMgdGhpcyB2YWx1ZSB0byB0ZW5zb3JzOyBpdCdzIG5vdFxuICAgICAgICogY2xlYXIgd2hldGhlciB3ZSdsbCB1c2UgdGhpcyBvciBub3QuXG4gICAgICAgKi9cbiAgICAgIGluYm91bmRMYXllcnMucHVzaCh4LnNvdXJjZUxheWVyKTtcbiAgICAgIG5vZGVJbmRpY2VzLnB1c2goeC5ub2RlSW5kZXgpO1xuICAgICAgdGVuc29ySW5kaWNlcy5wdXNoKHgudGVuc29ySW5kZXgpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBub2RlLCBhZGQgaXQgdG8gaW5ib3VuZCBub2Rlcy5cbiAgICAvLyAoVGhpcyBjYWxsIGhhcyBzaWRlIGVmZmVjdHMuKVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtZXhwcmVzc2lvblxuICAgIG5ldyBOb2RlKFxuICAgICAgICB7XG4gICAgICAgICAgb3V0Ym91bmRMYXllcjogdGhpcyxcbiAgICAgICAgICBpbmJvdW5kTGF5ZXJzLFxuICAgICAgICAgIG5vZGVJbmRpY2VzLFxuICAgICAgICAgIHRlbnNvckluZGljZXMsXG4gICAgICAgICAgaW5wdXRUZW5zb3JzOiBpbnB1dFRlbnNvckxpc3QsXG4gICAgICAgICAgb3V0cHV0VGVuc29ycyxcbiAgICAgICAgICBpbnB1dE1hc2tzLFxuICAgICAgICAgIG91dHB1dE1hc2tzLFxuICAgICAgICAgIGlucHV0U2hhcGVzLFxuICAgICAgICAgIG91dHB1dFNoYXBlc1xuICAgICAgICB9LFxuICAgICAgICBrd2FyZ3MpO1xuXG4gICAgLy8gVXBkYXRlIHRlbnNvciBoaXN0b3J5XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRUZW5zb3JzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeTogX3VzZXNfbGVhcm5pbmdfcGhhc2Ugbm90IHRyYWNrZWQuXG4gICAgICBvdXRwdXRUZW5zb3JzW2ldLnNvdXJjZUxheWVyID0gdGhpcztcbiAgICAgIG91dHB1dFRlbnNvcnNbaV0ubm9kZUluZGV4ID0gdGhpcy5pbmJvdW5kTm9kZXMubGVuZ3RoIC0gMTtcbiAgICAgIG91dHB1dFRlbnNvcnNbaV0udGVuc29ySW5kZXggPSBpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBjb25maWcgb2YgdGhlIGxheWVyLlxuICAgKlxuICAgKiBBIGxheWVyIGNvbmZpZyBpcyBhIFRTIGRpY3Rpb25hcnkgKHNlcmlhbGl6YWJsZSlcbiAgICogY29udGFpbmluZyB0aGUgY29uZmlndXJhdGlvbiBvZiBhIGxheWVyLlxuICAgKiBUaGUgc2FtZSBsYXllciBjYW4gYmUgcmVpbnN0YW50aWF0ZWQgbGF0ZXJcbiAgICogKHdpdGhvdXQgaXRzIHRyYWluZWQgd2VpZ2h0cykgZnJvbSB0aGlzIGNvbmZpZ3VyYXRpb24uXG4gICAqXG4gICAqIFRoZSBjb25maWcgb2YgYSBsYXllciBkb2VzIG5vdCBpbmNsdWRlIGNvbm5lY3Rpdml0eVxuICAgKiBpbmZvcm1hdGlvbiwgbm9yIHRoZSBsYXllciBjbGFzcyBuYW1lLiAgVGhlc2UgYXJlIGhhbmRsZWRcbiAgICogYnkgJ0NvbnRhaW5lcicgKG9uZSBsYXllciBvZiBhYnN0cmFjdGlvbiBhYm92ZSkuXG4gICAqXG4gICAqIFBvcnRpbmcgTm90ZTogVGhlIFRTIGRpY3Rpb25hcnkgZm9sbG93cyBUUyBuYW1pbmcgc3RhbmRhcmRzIGZvclxuICAgKiBrZXlzLCBhbmQgdXNlcyB0ZmpzLWxheWVycyB0eXBlLXNhZmUgRW51bXMuICBTZXJpYWxpemF0aW9uIG1ldGhvZHNcbiAgICogc2hvdWxkIHVzZSBhIGhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IHRvIHRoZSBweXRob25pYyBzdG9yYWdlXG4gICAqIHN0YW5kYXJkLiAoc2VlIHNlcmlhbGl6YXRpb25fdXRpbHMuY29udmVydFRzVG9QeXRob25pYylcbiAgICpcbiAgICogQHJldHVybnMgVFMgZGljdGlvbmFyeSBvZiBjb25maWd1cmF0aW9uLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgJ3N1YmhlYWRpbmcnOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6XG4gICAgICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtuYW1lOiB0aGlzLm5hbWUsIHRyYWluYWJsZTogdGhpcy50cmFpbmFibGV9O1xuICAgIGlmICh0aGlzLmJhdGNoSW5wdXRTaGFwZSAhPSBudWxsKSB7XG4gICAgICBjb25maWdbJ2JhdGNoSW5wdXRTaGFwZSddID0gdGhpcy5iYXRjaElucHV0U2hhcGU7XG4gICAgfVxuICAgIGlmICh0aGlzLmR0eXBlICE9IG51bGwpIHtcbiAgICAgIGNvbmZpZ1snZHR5cGUnXSA9IHRoaXMuZHR5cGU7XG4gICAgfVxuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgd2VpZ2h0IHZhcmlhYmxlcyB0aGF0IHRoaXMgTGF5ZXIgaW5zdGFuY2UgaG9sZHMuXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IE51bWJlciBvZiBkaXNwb3NlZCB2YXJpYWJsZXMuXG4gICAqL1xuICBwcm90ZWN0ZWQgZGlzcG9zZVdlaWdodHMoKTogbnVtYmVyIHtcbiAgICB0aGlzLndlaWdodHMuZm9yRWFjaCh3ZWlnaHQgPT4gd2VpZ2h0LmRpc3Bvc2UoKSk7XG4gICAgcmV0dXJuIHRoaXMud2VpZ2h0cy5sZW5ndGg7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXNzZXJ0Tm90RGlzcG9zZWQoKSB7XG4gICAgaWYgKHRoaXMuX3JlZkNvdW50ID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYExheWVyICcke3RoaXMubmFtZX0nIGlzIGFscmVhZHkgZGlzcG9zZWQuYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF0dGVtcHQgdG8gZGlzcG9zZSBsYXllcidzIHdlaWdodHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGRlY3JlYXNlcyB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBMYXllciBvYmplY3QgYnkgMS5cbiAgICpcbiAgICogQSBMYXllciBpcyByZWZlcmVuY2UtY291bnRlZC4gSXRzIHJlZmVyZW5jZSBjb3VudCBpcyBpbmNyZW1lbnRlZCBieSAxXG4gICAqIHRoZSBmaXJzdCBpdGVtIGl0cyBgYXBwbHkoKWAgbWV0aG9kIGlzIGNhbGxlZCBhbmQgd2hlbiBpdCBiZWNvbWVzIGEgcGFydFxuICAgKiBvZiBhIG5ldyBgTm9kZWAgKHRocm91Z2ggY2FsbGluZyB0aGUgYGFwcGx5KClgIG1ldGhvZCBvbiBhXG4gICAqIGB0Zi5TeW1ib2xpY1RlbnNvcmApLlxuICAgKlxuICAgKiBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIGEgTGF5ZXIgYmVjb21lcyAwLCBhbGwgdGhlIHdlaWdodHMgd2lsbCBiZVxuICAgKiBkaXNwb3NlZCBhbmQgdGhlIHVuZGVybHlpbmcgbWVtb3J5IChlLmcuLCB0aGUgdGV4dHVyZXMgYWxsb2NhdGVkIGluIFdlYkdMKVxuICAgKiB3aWxsIGJlIGZyZWVkLlxuICAgKlxuICAgKiBOb3RlOiBJZiB0aGUgcmVmZXJlbmNlIGNvdW50IGlzIGdyZWF0ZXIgdGhhbiAwIGFmdGVyIHRoZSBkZWNyZW1lbnQsIHRoZVxuICAgKiB3ZWlnaHRzIG9mIHRoZSBMYXllciB3aWxsICpub3QqIGJlIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBBZnRlciBhIExheWVyIGlzIGRpc3Bvc2VkLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiBjYWxscyBzdWNoIGFzIGBhcHBseSgpYCxcbiAgICogYGdldFdlaWdodHMoKWAgb3IgYHNldFdlaWdodHMoKWAgYW55bW9yZS5cbiAgICpcbiAgICogQHJldHVybnMgQSBEaXNwb3NlUmVzdWx0IE9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgZmllbGRzOlxuICAgKiAgIC0gcmVmQ291bnRBZnRlckRpc3Bvc2U6IFRoZSByZWZlcmVuY2UgY291bnQgb2YgdGhlIENvbnRhaW5lciBhZnRlciB0aGlzXG4gICAqICAgICBgZGlzcG9zZSgpYCBjYWxsLlxuICAgKiAgIC0gbnVtRGlzcG9zZWRWYXJpYWJsZXM6IE51bWJlciBvZiBgdGYuVmFyaWFibGVgcyAoaS5lLiwgd2VpZ2h0cykgZGlzcG9zZWRcbiAgICogICAgIGR1cmluZyB0aGlzIGBkaXNwb3NlKClgIGNhbGwuXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiB0aGUgbGF5ZXIgaXMgbm90IGJ1aWx0IHlldCwgb3IgaWYgdGhlIGxheWVyIGhhcyBhbHJlYWR5XG4gICAqICAgYmVlbiBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsICdzdWJoZWFkaW5nJzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgZGlzcG9zZSgpOiBEaXNwb3NlUmVzdWx0IHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGRpc3Bvc2UgTGF5ZXIgJHt0aGlzLm5hbWV9IGJlY2F1c2UgaXQgaGFzIG5vdCBiZWVuIGAgK1xuICAgICAgICAgIGBidWlsdCB5ZXQuYCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuX3JlZkNvdW50ID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBkaXNwb3NlIExheWVyICR7dGhpcy5uYW1lfSBiZWNhdXNlIGl0IGhhcyBub3QgYmVlbiB1c2VkIGAgK1xuICAgICAgICAgIGB5ZXQuYCk7XG4gICAgfVxuXG4gICAgdGhpcy5hc3NlcnROb3REaXNwb3NlZCgpO1xuXG4gICAgbGV0IG51bURpc3Bvc2VkVmFyaWFibGVzID0gMDtcbiAgICBpZiAoLS10aGlzLl9yZWZDb3VudCA9PT0gMCkge1xuICAgICAgbnVtRGlzcG9zZWRWYXJpYWJsZXMgPSB0aGlzLmRpc3Bvc2VXZWlnaHRzKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHtyZWZDb3VudEFmdGVyRGlzcG9zZTogdGhpcy5fcmVmQ291bnQsIG51bURpc3Bvc2VkVmFyaWFibGVzfTtcbiAgfVxufVxuXG4vKipcbiAqIENvbGxlY3RzIHRoZSBpbnB1dCBzaGFwZShzKSBvZiBhIGxpc3Qgb2YgYHRmLlRlbnNvcmBzIG9yXG4gKiBgdGYuU3ltYm9saWNUZW5zb3Jgcy5cbiAqXG4gKiBUT0RPKG1pY2hhZWx0ZXJyeSk6IFVwZGF0ZSBQeUtlcmFzIGRvY3MgKGJhY2twb3J0KS5cbiAqXG4gKiBAcGFyYW0gaW5wdXRUZW5zb3JzIExpc3Qgb2YgaW5wdXQgdGVuc29ycyAob3Igc2luZ2xlIGlucHV0IHRlbnNvcikuXG4gKlxuICogQHJldHVybiBMaXN0IG9mIHNoYXBlIHR1cGxlcyAob3Igc2luZ2xlIHR1cGxlKSwgb25lIHR1cGxlIHBlciBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gY29sbGVjdElucHV0U2hhcGUoaW5wdXRUZW5zb3JzOiBTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdfFRlbnNvcnxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlbnNvcltdKTogU2hhcGV8U2hhcGVbXSB7XG4gIGlucHV0VGVuc29ycyA9XG4gICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dFRlbnNvcnMpIGFzIFN5bWJvbGljVGVuc29yW10gfCBUZW5zb3JbXTtcbiAgY29uc3Qgc2hhcGVzOiBTaGFwZVtdID0gW107XG4gIGZvciAoY29uc3QgeCBvZiBpbnB1dFRlbnNvcnMpIHtcbiAgICBzaGFwZXMucHVzaCh4LnNoYXBlKTtcbiAgfVxuICByZXR1cm4gZ2VuZXJpY191dGlscy5zaW5nbGV0b25PckFycmF5KHNoYXBlcyk7XG59XG5cbi8qKlxuICogR3Vlc3NlcyBvdXRwdXQgZHR5cGUgYmFzZWQgb24gaW5wdXRzLlxuICpcbiAqIEF0IHByZXNlbnQsIGp1c3QgcmV0dXJucyAnZmxvYXQzMicgZm9yIGFueSBpbnB1dC5cbiAqXG4gKiBAcGFyYW0gaW5wdXRUZW5zb3JzIExpc3Qgb2YgaW5wdXQgdGVuc29ycyAob3Igc2luZ2xlIGlucHV0IHRlbnNvcikuXG4gKlxuICogQHJldHVybiBUaGUgZ3Vlc3NlZCBEVHlwZS4gQXQgcHJlc2VudCwgYWx3YXlzIHJldHVybnMgJ2Zsb2F0MzInLlxuICovXG5mdW5jdGlvbiBndWVzc091dHB1dERUeXBlKGlucHV0VGVuc29yczogU3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXXxUZW5zb3J8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIFRlbnNvcltdKTogRGF0YVR5cGUge1xuICByZXR1cm4gJ2Zsb2F0MzInO1xufVxuXG4vKipcbiAqIFJldHVybnMgdGhlIGxpc3Qgb2YgaW5wdXQgdGVuc29ycyBuZWNlc3NhcnkgdG8gY29tcHV0ZSBgdGVuc29yYC5cbiAqXG4gKiBPdXRwdXQgd2lsbCBhbHdheXMgYmUgYSBsaXN0IG9mIHRlbnNvcnMgKHBvdGVudGlhbGx5IHdpdGggMSBlbGVtZW50KS5cbiAqXG4gKiBAcGFyYW0gdGVuc29yIFRoZSB0ZW5zb3IgdG8gc3RhcnQgZnJvbS5cbiAqIEBwYXJhbSBsYXllciBPcmlnaW4gbGF5ZXIgb2YgdGhlIHRlbnNvci5cbiAqIEBwYXJhbSBub2RlSW5kZXggT3JpZ2luIG5vZGUgaW5kZXggb2YgdGhlIHRlbnNvci5cbiAqXG4gKiBAcmV0dXJuIEFycmF5IG9mIGlucHV0IHRlbnNvcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRTb3VyY2VJbnB1dHMoXG4gICAgdGVuc29yOiBTeW1ib2xpY1RlbnNvciwgbGF5ZXI/OiBMYXllcixcbiAgICBub2RlSW5kZXg/OiBudW1iZXIpOiBTeW1ib2xpY1RlbnNvcltdIHtcbiAgaWYgKGxheWVyID09IG51bGwgfHwgKG5vZGVJbmRleCAhPSBudWxsICYmIG5vZGVJbmRleCA+IDApKSB7XG4gICAgbGF5ZXIgPSB0ZW5zb3Iuc291cmNlTGF5ZXI7XG4gICAgbm9kZUluZGV4ID0gdGVuc29yLm5vZGVJbmRleDtcbiAgfVxuICBpZiAobGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBbdGVuc29yXTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBub2RlID0gbGF5ZXIuaW5ib3VuZE5vZGVzW25vZGVJbmRleF07XG4gICAgaWYgKG5vZGUuaW5ib3VuZExheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBub2RlLmlucHV0VGVuc29ycztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc291cmNlVGVuc29yczogU3ltYm9saWNUZW5zb3JbXSA9IFtdO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmluYm91bmRMYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgY29uc3QgeCA9IG5vZGUuaW5wdXRUZW5zb3JzW2ldO1xuICAgICAgICBjb25zdCBsYXllciA9IG5vZGUuaW5ib3VuZExheWVyc1tpXTtcbiAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbm9kZS5ub2RlSW5kaWNlc1tpXTtcbiAgICAgICAgY29uc3QgcHJldmlvdXNTb3VyY2VzID0gZ2V0U291cmNlSW5wdXRzKHgsIGxheWVyLCBub2RlSW5kZXgpO1xuICAgICAgICAvLyBBdm9pZCBpbnB1dCByZWR1bmRhbmN5LlxuICAgICAgICBmb3IgKGNvbnN0IHggb2YgcHJldmlvdXNTb3VyY2VzKSB7XG4gICAgICAgICAgaWYgKHNvdXJjZVRlbnNvcnMuaW5kZXhPZih4KSA9PT0gLTEpIHtcbiAgICAgICAgICAgIHNvdXJjZVRlbnNvcnMucHVzaCh4KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzb3VyY2VUZW5zb3JzO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { serialization } from '@tensorflow/tfjs-core';\nimport { getUid } from '../backend/state';\nimport { ValueError } from '../errors';\nimport { Layer, Node, SymbolicTensor } from './topology';\nexport class InputLayer extends Layer {\n    constructor(args) {\n        super({\n            dtype: args.dtype,\n            name: args.name != null ? args.name : getUid('input').toString()\n        });\n        // Normalize config.batchSize and config.sparse\n        if (args.batchSize == null) {\n            args.batchSize = null;\n        }\n        if (args.sparse == null) {\n            args.sparse = false;\n        }\n        this.trainable = false;\n        this.built = true;\n        this.sparse = args.sparse;\n        if (args.inputShape != null && args.batchInputShape != null) {\n            throw new ValueError('Only provide the inputShape OR ' +\n                'batchInputShape argument to inputLayer, not both at the same time.');\n        }\n        let batchInputShape = args.batchInputShape;\n        if (batchInputShape == null) {\n            if (args.inputShape == null) {\n                throw new ValueError('An InputLayer should be passed either a ' +\n                    '`batchInputShape` or an `inputShape`.');\n            }\n            else {\n                batchInputShape = [args.batchSize].concat(args.inputShape);\n            }\n        }\n        else {\n            // TODO(michaelterry): Backport to PyKeras\n            if (args.batchSize != null) {\n                throw new ValueError('Cannot specify batchSize if batchInputShape is ' +\n                    'specified when creating an InputLayer.');\n            }\n        }\n        const dtype = args.dtype || 'float32';\n        this.batchInputShape = batchInputShape;\n        this.dtype = dtype;\n        // TODO(michaelterry): Backport this to PyKeras?\n        this.inputSpec = [{ shape: batchInputShape }];\n        const inputTensor = new SymbolicTensor(this.dtype, this.batchInputShape, this, [], {}, this.name);\n        inputTensor.nodeIndex = 0;\n        inputTensor.tensorIndex = 0;\n        // Create an input node to add to this.outboundNode.\n        // (This call has side effects.)\n        // tslint:disable-next-line:no-unused-expression\n        new Node({\n            outboundLayer: this,\n            inboundLayers: [],\n            nodeIndices: [],\n            tensorIndices: [],\n            inputTensors: [inputTensor],\n            outputTensors: [inputTensor],\n            inputMasks: [null],\n            outputMasks: [null],\n            inputShapes: [batchInputShape],\n            outputShapes: [batchInputShape]\n        });\n    }\n    apply(inputs, kwargs) {\n        throw new ValueError('Cannot pass any input to an ' +\n            `InputLayer's apply() method. InputLayer name: ${this.name}`);\n    }\n    dispose() {\n        // dispose() for InputLayer is overridden as no-op.\n        return { refCountAfterDispose: this._refCount, numDisposedVariables: 0 };\n    }\n    getConfig() {\n        return {\n            batchInputShape: this.batchInputShape,\n            dtype: this.dtype,\n            sparse: this.sparse,\n            name: this.name\n        };\n    }\n}\n/** @nocollapse */\nInputLayer.className = 'InputLayer';\nserialization.registerClass(InputLayer);\nexport function Input(config) {\n    if (config.batchShape == null && config.shape == null) {\n        throw new Error('Please provide to Input either a `shape`' +\n            ' or a `batchShape` argument. Note that ' +\n            '`shape` does not include the batch ' +\n            'dimension.');\n    }\n    if (config.batchShape != null && config.shape != null) {\n        // TODO(michaelterry): Backport to PyKeras.\n        throw new ValueError('Please provide either a `shape` or `batchShape` ' +\n            'argument to Input, but not both.');\n    }\n    let batchShape = config.batchShape;\n    if (config.shape != null && batchShape == null) {\n        batchShape = [null].concat(config.shape);\n    }\n    let dtype = config.dtype;\n    if (dtype == null) {\n        dtype = 'float32';\n    }\n    const inputLayer = new InputLayer({\n        batchInputShape: batchShape,\n        name: config.name,\n        dtype,\n        sparse: config.sparse\n    });\n    const outputs = inputLayer.inboundNodes[0].outputTensors;\n    return outputs[0];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXRfbGF5ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL2lucHV0X2xheWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFXLGFBQWEsRUFBUyxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBSXJDLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUMsTUFBTSxZQUFZLENBQUM7QUEyQnRFLE1BQU0sT0FBTyxVQUFXLFNBQVEsS0FBSztJQUluQyxZQUFZLElBQW9CO1FBQzlCLEtBQUssQ0FBQztZQUNKLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxRQUFRLEVBQUU7U0FDakUsQ0FBQyxDQUFDO1FBQ0gsK0NBQStDO1FBQy9DLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7U0FDdkI7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3ZCLElBQUksQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7UUFDdkIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDbEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBRTFCLElBQUksSUFBSSxDQUFDLFVB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QyxVQUFVLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ3JELE1BQU0sSUFBSSxLQUFLLENBQ1gsMENBQTBDO1lBQzFDLHlDQUF5QztZQUN6QyxxQ0FBcUM7WUFDckMsWUFBWSxDQUFDLENBQUM7S0FDbkI7SUFDRCxJQUFJLE1BQU0sQ0FBQyxVQUFVLElBQUksSUFBSSxJQUFJLE1BQU0sQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1FBQ3JELDJDQUEyQztRQUMzQyxNQUFNLElBQUksVUFBVSxDQUNoQixrREFBa0Q7WUFDbEQsa0NBQWtDLENBQUMsQ0FBQztLQUN6QztJQUNELElBQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUM7SUFDbkMsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQzlDLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDMUM7SUFFRCxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQ3pCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUNqQixLQUFLLEdBQUcsU0FBUyxDQUFDO0tBQ25CO0lBRUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUM7UUFDaEMsZUFBZSxFQUFFLFVBQVU7UUFDM0IsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1FBQ2pCLEtBQUs7UUFDTCxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07S0FDdEIsQ0FBQyxDQUFDO0lBRUgsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7SUFDekQsT0FBTyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIHNlcmlhbGl6YXRpb24sIFRlbnNvcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtnZXRVaWR9IGZyb20gJy4uL2JhY2tlbmQvc3RhdGUnO1xuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge0Rpc3Bvc2VSZXN1bHQsIExheWVyLCBOb2RlLCBTeW1ib2xpY1RlbnNvcn0gZnJvbSAnLi90b3BvbG9neSc7XG5cbi8qKlxuICogQ29uc3RydWN0b3IgYXJndW1lbnRzIGZvciBJbnB1dExheWVyLlxuICpcbiAqIE5vdGU6IFlvdSBzaG91bGQgcHJvdmlkZSBvbmx5IGlucHV0U2hhcGUgb3IgYmF0Y2hJbnB1dFNoYXBlIChub3QgYm90aCkuXG4gKiBJZiBvbmx5IGlucHV0U2hhcGUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGJhdGNoSW5wdXRTaGFwZSBpcyBkZXRlcm1pbmVkIGJ5XG4gKiB0aGUgYmF0Y2hTaXplIGFyZ3VtZW50IGFuZCB0aGUgaW5wdXRTaGFwZTogW2JhdGNoU2l6ZV0uY29uY2F0KGlucHV0U2hhcGUpLlxuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSW5wdXRMYXllckFyZ3Mge1xuICAvKiogSW5wdXQgc2hhcGUsIG5vdCBpbmNsdWRpbmcgdGhlIGJhdGNoIGF4aXMuICovXG4gIGlucHV0U2hhcGU/OiBTaGFwZTtcbiAgLyoqIE9wdGlvbmFsIGlucHV0IGJhdGNoIHNpemUgKGludGVnZXIgb3IgbnVsbCkuICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcbiAgLyoqIEJhdGNoIGlucHV0IHNoYXBlLCBpbmNsdWRpbmcgdGhlIGJhdGNoIGF4aXMuICovXG4gIGJhdGNoSW5wdXRTaGFwZT86IFNoYXBlO1xuICAvKiogRGF0YXR5cGUgb2YgdGhlIGlucHV0LiAgKi9cbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIHBsYWNlaG9sZGVyIGNyZWF0ZWQgaXMgbWVhbnQgdG8gYmUgc3BhcnNlLlxuICAgKi9cbiAgc3BhcnNlPzogYm9vbGVhbjsgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogTm90IGNsZWFyIHdoZXRoZXIgd2UnbGwgbmVlZCB0aGlzLlxuXG4gIC8qKiBOYW1lIG9mIHRoZSBsYXllci4gKi9cbiAgbmFtZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGNsYXNzIElucHV0TGF5ZXIgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ0lucHV0TGF5ZXInO1xuICBzcGFyc2U6IGJvb2xlYW47XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IElucHV0TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoe1xuICAgICAgZHR5cGU6IGFyZ3MuZHR5cGUsXG4gICAgICBuYW1lOiBhcmdzLm5hbWUgIT0gbnVsbCA/IGFyZ3MubmFtZSA6IGdldFVpZCgnaW5wdXQnKS50b1N0cmluZygpXG4gICAgfSk7XG4gICAgLy8gTm9ybWFsaXplIGNvbmZpZy5iYXRjaFNpemUgYW5kIGNvbmZpZy5zcGFyc2VcbiAgICBpZiAoYXJncy5iYXRjaFNpemUgPT0gbnVsbCkge1xuICAgICAgYXJncy5iYXRjaFNpemUgPSBudWxsO1xuICAgIH1cbiAgICBpZiAoYXJncy5zcGFyc2UgPT0gbnVsbCkge1xuICAgICAgYXJncy5zcGFyc2UgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnRyYWluYWJsZSA9IGZhbHNlO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICAgIHRoaXMuc3BhcnNlID0gYXJncy5zcGFyc2U7XG5cbiAgICBpZiAoYXJncy5pbnB1dFNoYXBlICE9IG51bGwgJiYgYXJncy5iYXRjaElucHV0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ09ubHkgcHJvdmlkZSB0aGUgaW5wdXRTaGFwZSBPUiAnICtcbiAgICAgICAgICAnYmF0Y2hJbnB1dFNoYXBlIGFyZ3VtZW50IHRvIGlucHV0TGF5ZXIsIG5vdCBib3RoIGF0IHRoZSBzYW1lIHRpbWUuJyk7XG4gICAgfVxuICAgIGxldCBiYXRjaElucHV0U2hhcGUgPSBhcmdzLmJhdGNoSW5wdXRTaGFwZTtcbiAgICBpZiAoYmF0Y2hJbnB1dFNoYXBlID09IG51bGwpIHtcbiAgICAgIGlmIChhcmdzLmlucHV0U2hhcGUgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdBbiBJbnB1dExheWVyIHNob3VsZCBiZSBwYXNzZWQgZWl0aGVyIGEgJyArXG4gICAgICAgICAgICAnYGJhdGNoSW5wdXRTaGFwZWAgb3IgYW4gYGlucHV0U2hhcGVgLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYmF0Y2hJbnB1dFNoYXBlID0gW2FyZ3MuYmF0Y2hTaXplXS5jb25jYXQoYXJncy5pbnB1dFNoYXBlKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBCYWNrcG9ydCB0byBQeUtlcmFzXG4gICAgICBpZiAoYXJncy5iYXRjaFNpemUgIT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdDYW5ub3Qgc3BlY2lmeSBiYXRjaFNpemUgaWYgYmF0Y2hJbnB1dFNoYXBlIGlzICcgK1xuICAgICAgICAgICAgJ3NwZWNpZmllZCB3aGVuIGNyZWF0aW5nIGFuIElucHV0TGF5ZXIuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZHR5cGUgPSBhcmdzLmR0eXBlIHx8ICdmbG9hdDMyJztcblxuICAgIHRoaXMuYmF0Y2hJbnB1dFNoYXBlID0gYmF0Y2hJbnB1dFNoYXBlO1xuICAgIHRoaXMuZHR5cGUgPSBkdHlwZTtcbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEJhY2twb3J0IHRoaXMgdG8gUHlLZXJhcz9cbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7c2hhcGU6IGJhdGNoSW5wdXRTaGFwZX1dO1xuXG4gICAgY29uc3QgaW5wdXRUZW5zb3IgPSBuZXcgU3ltYm9saWNUZW5zb3IoXG4gICAgICAgIHRoaXMuZHR5cGUsIHRoaXMuYmF0Y2hJbnB1dFNoYXBlLCB0aGlzLCBbXSwge30sIHRoaXMubmFtZSk7XG4gICAgaW5wdXRUZW5zb3Iubm9kZUluZGV4ID0gMDtcbiAgICBpbnB1dFRlbnNvci50ZW5zb3JJbmRleCA9IDA7XG5cbiAgICAvLyBDcmVhdGUgYW4gaW5wdXQgbm9kZSB0byBhZGQgdG8gdGhpcy5vdXRib3VuZE5vZGUuXG4gICAgLy8gKFRoaXMgY2FsbCBoYXMgc2lkZSBlZmZlY3RzLilcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb25cbiAgICBuZXcgTm9kZSh7XG4gICAgICBvdXRib3VuZExheWVyOiB0aGlzLFxuICAgICAgaW5ib3VuZExheWVyczogW10sXG4gICAgICBub2RlSW5kaWNlczogW10sXG4gICAgICB0ZW5zb3JJbmRpY2VzOiBbXSxcbiAgICAgIGlucHV0VGVuc29yczogW2lucHV0VGVuc29yXSxcbiAgICAgIG91dHB1dFRlbnNvcnM6IFtpbnB1dFRlbnNvcl0sXG4gICAgICBpbnB1dE1hc2tzOiBbbnVsbF0sXG4gICAgICBvdXRwdXRNYXNrczogW251bGxdLFxuICAgICAgaW5wdXRTaGFwZXM6IFtiYXRjaElucHV0U2hhcGVdLFxuICAgICAgb3V0cHV0U2hhcGVzOiBbYmF0Y2hJbnB1dFNoYXBlXVxuICAgIH0pO1xuICB9XG5cbiAgYXBwbHkoXG4gICAgICBpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgICAga3dhcmdzPzogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBwYXNzIGFueSBpbnB1dCB0byBhbiAnICtcbiAgICAgICAgYElucHV0TGF5ZXIncyBhcHBseSgpIG1ldGhvZC4gSW5wdXRMYXllciBuYW1lOiAke3RoaXMubmFtZX1gKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKTogRGlzcG9zZVJlc3VsdCB7XG4gICAgLy8gZGlzcG9zZSgpIGZvciBJbnB1dExheWVyIGlzIG92ZXJyaWRkZW4gYXMgbm8tb3AuXG4gICAgcmV0dXJuIHtyZWZDb3VudEFmdGVyRGlzcG9zZTogdGhpcy5fcmVmQ291bnQsIG51bURpc3Bvc2VkVmFyaWFibGVzOiAwfTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElucHV0U2hhcGU6IHRoaXMuYmF0Y2hJbnB1dFNoYXBlLFxuICAgICAgZHR5cGU6IHRoaXMuZHR5cGUsXG4gICAgICBzcGFyc2U6IHRoaXMuc3BhcnNlLFxuICAgICAgbmFtZTogdGhpcy5uYW1lXG4gICAgfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKElucHV0TGF5ZXIpO1xuXG4vKipcbiAqIENvbmZpZyBmb3IgdGhlIElucHV0IGZ1bmN0aW9uLlxuICpcbiAqIE5vdGU6IFlvdSBzaG91bGQgcHJvdmlkZSBvbmx5IHNoYXBlIG9yIGJhdGNoU2hhcGUgKG5vdCBib3RoKS5cbiAqIElmIG9ubHkgc2hhcGUgaXMgcHJvdmlkZWQsIHRoZW4gdGhlIGJhdGNoU2hhcGUgYmVjb21lc1xuICogW251bGxdLmNvbmNhdChpbnB1dFNoYXBlKS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBJbnB1dENvbmZpZyB7XG4gIC8qKlxuICAgKiBBIHNoYXBlLCBub3QgaW5jbHVkaW5nIHRoZSBiYXRjaCBzaXplLiBGb3IgaW5zdGFuY2UsIGBzaGFwZT1bMzJdYFxuICAgKiBpbmRpY2F0ZXMgdGhhdCB0aGUgZXhwZWN0ZWQgaW5wdXQgd2lsbCBiZSBiYXRjaGVzIG9mIDMyLWRpbWVuc2lvbmFsXG4gICAqIHZlY3RvcnMuXG4gICAqL1xuICBzaGFwZT86IFNoYXBlO1xuICAvKipcbiAgICogQSBzaGFwZSB0dXBsZSAoaW50ZWdlciksIGluY2x1ZGluZyB0aGUgYmF0Y2ggc2l6ZS4gRm9yIGluc3RhbmNlLFxuICAgKiBgYmF0Y2hTaGFwZT1bMTAsIDMyXWAgaW5kaWNhdGVzIHRoYXQgdGhlIGV4cGVjdGVkIGlucHV0IHdpbGwgYmUgYmF0Y2hlcyBvZlxuICAgKiAxMCAzMi1kaW1lbnNpb25hbCB2ZWN0b3JzLiBgYmF0Y2hTaGFwZT1bbnVsbCwgMzJdYCBpbmRpY2F0ZXMgYmF0Y2hlcyBvZiBhblxuICAgKiBhcmJpdHJhcnkgbnVtYmVyIG9mIDMyLWRpbWVuc2lvbmFsIHZlY3RvcnMuXG4gICAqL1xuICBiYXRjaFNoYXBlPzogU2hhcGU7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCBuYW1lIHN0cmluZyBmb3IgdGhlIGxheWVyLiBTaG91bGQgYmUgdW5pcXVlIGluIGEgbW9kZWwgKGRvIG5vdFxuICAgKiByZXVzZSB0aGUgc2FtZSBuYW1lIHR3aWNlKS4gSXQgd2lsbCBiZSBhdXRvZ2VuZXJhdGVkIGlmIGl0IGlzbid0IHByb3ZpZGVkLlxuICAgKi9cbiAgbmFtZT86IHN0cmluZztcbiAgZHR5cGU/OiBEYXRhVHlwZTtcbiAgLyoqXG4gICAqIEEgYm9vbGVhbiBzcGVjaWZ5aW5nIHdoZXRoZXIgdGhlIHBsYWNlaG9sZGVyIHRvIGJlIGNyZWF0ZWQgaXMgc3BhcnNlLlxuICAgKi9cbiAgc3BhcnNlPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIElucHV0KGNvbmZpZzogSW5wdXRDb25maWcpOiBTeW1ib2xpY1RlbnNvciB7XG4gIGlmIChjb25maWcuYmF0Y2hTaGFwZSA9PSBudWxsICYmIGNvbmZpZy5zaGFwZSA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUGxlYXNlIHByb3ZpZGUgdG8gSW5wdXQgZWl0aGVyIGEgYHNoYXBlYCcgK1xuICAgICAgICAnIG9yIGEgYGJhdGNoU2hhcGVgIGFyZ3VtZW50LiBOb3RlIHRoYXQgJyArXG4gICAgICAgICdgc2hhcGVgIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJhdGNoICcgK1xuICAgICAgICAnZGltZW5zaW9uLicpO1xuICB9XG4gIGlmIChjb25maWcuYmF0Y2hTaGFwZSAhPSBudWxsICYmIGNvbmZpZy5zaGFwZSAhPSBudWxsKSB7XG4gICAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBCYWNrcG9ydCB0byBQeUtlcmFzLlxuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAnUGxlYXNlIHByb3ZpZGUgZWl0aGVyIGEgYHNoYXBlYCBvciBgYmF0Y2hTaGFwZWAgJyArXG4gICAgICAgICdhcmd1bWVudCB0byBJbnB1dCwgYnV0IG5vdCBib3RoLicpO1xuICB9XG4gIGxldCBiYXRjaFNoYXBlID0gY29uZmlnLmJhdGNoU2hhcGU7XG4gIGlmIChjb25maWcuc2hhcGUgIT0gbnVsbCAmJiBiYXRjaFNoYXBlID09IG51bGwpIHtcbiAgICBiYXRjaFNoYXBlID0gW251bGxdLmNvbmNhdChjb25maWcuc2hhcGUpO1xuICB9XG5cbiAgbGV0IGR0eXBlID0gY29uZmlnLmR0eXBlO1xuICBpZiAoZHR5cGUgPT0gbnVsbCkge1xuICAgIGR0eXBlID0gJ2Zsb2F0MzInO1xuICB9XG5cbiAgY29uc3QgaW5wdXRMYXllciA9IG5ldyBJbnB1dExheWVyKHtcbiAgICBiYXRjaElucHV0U2hhcGU6IGJhdGNoU2hhcGUsXG4gICAgbmFtZTogY29uZmlnLm5hbWUsXG4gICAgZHR5cGUsXG4gICAgc3BhcnNlOiBjb25maWcuc3BhcnNlXG4gIH0pO1xuXG4gIGNvbnN0IG91dHB1dHMgPSBpbnB1dExheWVyLmluYm91bmROb2Rlc1swXS5vdXRwdXRUZW5zb3JzO1xuICByZXR1cm4gb3V0cHV0c1swXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Executor: Evaluates SymbolicTensor based on feeds.\n */\nimport { cast, dispose, memory, util } from '@tensorflow/tfjs-core';\nimport { ValueError } from '../errors';\nimport { LruCache } from '../utils/executor_utils';\nimport { toList } from '../utils/generic_utils';\nimport { InputLayer } from './input_layer';\nimport { SymbolicTensor } from './topology';\n/**\n * Helper function to check the dtype and shape compatibility of a feed value.\n */\nfunction assertFeedCompatibility(key, val) {\n    // Check dtype compatibility.\n    if (key.dtype == null || key.dtype === val.dtype) {\n        //  a.  If types match, return val tensor as is.\n        return val;\n    }\n    try {\n        //  b. Attempt to convert to expected type.\n        return cast(val, key.dtype);\n    }\n    catch (err) {\n        //  c. If conversion fails, return helpful error.\n        throw new ValueError(`The dtype of the feed (${val.dtype}) can not be cast to the dtype ` +\n            `of the key '${key.name}' (${key.dtype}).`);\n    }\n}\n/**\n * FeedDict: A mapping from unique SymbolicTensors to feed values for them.\n * A feed value is a concrete value represented as an `Tensor`.\n */\nexport class FeedDict {\n    /**\n     * Constructor, optionally does copy-construction.\n     * @param feeds An Array of `Feed`s, or another `FeedDict`, in which case\n     *   copy-construction will be performed.\n     */\n    constructor(feeds) {\n        this.id2Value = {};\n        this.id2Mask = {};\n        this.name2Id = {};\n        if (feeds instanceof FeedDict) {\n            for (const id in feeds.id2Value) {\n                this.id2Value[id] = feeds.id2Value[id];\n                if (id in feeds.id2Mask) {\n                    this.id2Mask[id] = feeds.id2Mask[id];\n                }\n            }\n        }\n        else {\n            if (feeds == null) {\n                return;\n            }\n            for (const feed of feeds) {\n                this.add(feed.key, feed.value);\n            }\n        }\n    }\n    /**\n     * Add a key-value pair to the FeedDict.\n     *\n     * @param key The key of the feed.\n     * @param value The value of the tensor feed.\n     * @param mask The value of the mask feed (optional).\n     * @returns This `FeedDict`.\n     * @throws ValueError: If the key `SymbolicTensor` already exists in the\n     *   `FeedDict`.\n     */\n    add(key, value, mask) {\n        if (this.id2Value[key.id] == null) {\n            this.id2Value[key.id] = assertFeedCompatibility(key, value);\n            this.name2Id[key.name] = key.id;\n            if (mask != null) {\n                this.id2Mask[key.id] = mask;\n            }\n        }\n        else {\n            throw new ValueError(`Duplicate key: name=${key.name}, id=${key.id}`);\n        }\n        return this;\n    }\n    /**\n     * Add a Feed to the FeedDict.\n     * @param feed The new `Feed` to add.\n     * @returns This `FeedDict`.\n     */\n    addFeed(feed) {\n        this.add(feed.key, feed.value);\n    }\n    /**\n     * Probe whether a key already exists in the FeedDict.\n     * @param key\n     */\n    hasKey(key) {\n        return this.id2Value[key.id] != null;\n    }\n    /**\n     * Get all the SymbolicTensor available in this FeedDict.\n     */\n    names() {\n        return Object.keys(this.name2Id);\n    }\n    /**\n     * Get the feed value for given key.\n     * @param key The SymbolicTensor, or its name (as a string), of which the\n     *     value is sought.\n     * @returns If `key` exists, the corresponding feed value.\n     * @throws ValueError: If `key` does not exist in this `FeedDict`.\n     */\n    getValue(key) {\n        if (key instanceof SymbolicTensor) {\n            if (this.id2Value[key.id] == null) {\n                throw new ValueError(`Nonexistent key: ${key.name}`);\n            }\n            else {\n                return this.id2Value[key.id];\n            }\n        }\n        else {\n            const id = this.name2Id[key];\n            if (id == null) {\n                throw new ValueError(`Feed dict has no SymbolicTensor name: ${key}`);\n            }\n            return this.id2Value[id];\n        }\n    }\n    /**\n     * Get the feed mask for given key.\n     * @param key The SymbolicTensor, or its name (as a string), of which the\n     *     value is sought.\n     * @returns If `key` exists, the corresponding feed mask.\n     * @throws ValueError: If `key` does not exist in this `FeedDict`.\n     */\n    getMask(key) {\n        if (key instanceof SymbolicTensor) {\n            if (this.id2Value[key.id] == null) {\n                throw new ValueError(`Nonexistent key: ${key.name}`);\n            }\n            else {\n                return this.id2Mask[key.id];\n            }\n        }\n        else {\n            const id = this.name2Id[key];\n            if (id == null) {\n                throw new ValueError(`Feed dict has no SymbolicTensor name: ${key}`);\n            }\n            return this.id2Mask[id];\n        }\n    }\n    /** Dispose all mask Tensors held by this object. */\n    disposeMasks() {\n        if (this.id2Mask != null) {\n            dispose(this.id2Mask);\n        }\n    }\n}\n// Cache for topologically sorted SymbolicTensors for given execution\n// targets (i.e., fetches).\nexport const cachedSorted = new LruCache();\n// Cache for recipient count maps for given execution targets (i.e., fetches).\nexport const cachedRecipientCounts = new LruCache();\nexport function updateCacheMaxEntries(maxEntries) {\n    if (cachedSorted != null) {\n        cachedSorted.setMaxEntries(maxEntries);\n    }\n    if (cachedRecipientCounts != null) {\n        cachedRecipientCounts.setMaxEntries(maxEntries);\n    }\n}\n/**\n * Execute a SymbolicTensor by using concrete feed values.\n *\n * A `SymbolicTensor` object is a node in a computation graph of TF.js\n * Layers. The object is backed by a source layer and input\n * `SymbolicTensor`s to the source layer. This method evaluates\n * the `call()` method of the source layer, using concrete values of the\n * inputs obtained from either\n * * `feedDict`, if the input key exists in `feedDict`, or else,\n * * a recursive call to `execute()` itself.\n *\n * @param x: The `SymbolicTensor` to execute.\n * @param feedDict: The feed values, as base condition of the recursion.\n *   execution.\n * @param kwargs: Optional keyword arguments.\n * @param probe: A probe object (of interface `ExecutionProbe`) used for\n *   testing memory footprint of `execute` calls.\n * @returns Result of the execution.\n * @throws ValueError: If any `SymbolicTensor`s from `InputLayer`s\n *   encountered during the execution lacks a feed value in `feedDict`.\n */\nexport function execute(fetches, feedDict, kwargs, probe) {\n    const training = kwargs == null ? false : kwargs['training'];\n    const arrayFetches = Array.isArray(fetches);\n    const fetchArray = arrayFetches ? fetches : [fetches];\n    const outputNames = fetchArray.map(t => t.name);\n    const finalOutputs = [];\n    const feedNames = feedDict.names();\n    for (const outputName of outputNames) {\n        if (feedNames.indexOf(outputName) !== -1) {\n            finalOutputs.push(feedDict.getValue(outputName));\n        }\n        else {\n            finalOutputs.push(null);\n        }\n    }\n    if (probe != null) {\n        // For optional probing of memory footprint during execution.\n        probe.maxNumTensors = -Infinity;\n        probe.minNumTensors = Infinity;\n    }\n    // Check cache.\n    const fetchAndFeedKey = outputNames.join(',') + '|' + feedDict.names().sort().join(',');\n    let sorted = cachedSorted.get(fetchAndFeedKey);\n    let recipientCounts;\n    if (sorted == null) {\n        // Cache doesn't contain the desired combination of fetches. Compute\n        // topological sort for the combination for the first time.\n        const out = getTopologicalSortAndRecipientCounts(fetchArray, feedDict);\n        sorted = out.sorted;\n        recipientCounts = out.recipientCounts;\n        // Store results in cache for future use.\n        cachedSorted.put(fetchAndFeedKey, sorted);\n        cachedRecipientCounts.put(fetchAndFeedKey, recipientCounts);\n    }\n    recipientCounts = {};\n    if (!training) {\n        Object.assign(recipientCounts, cachedRecipientCounts.get(fetchAndFeedKey));\n    }\n    const internalFeedDict = new FeedDict(feedDict);\n    // Start iterative execution on the topologically-sorted SymbolicTensors.\n    for (let i = 0; i < sorted.length; ++i) {\n        if (probe != null) {\n            // For optional probing of memory usage during execution.\n            const numTensors = memory().numTensors;\n            if (numTensors > probe.maxNumTensors) {\n                probe.maxNumTensors = numTensors;\n            }\n            if (numTensors < probe.minNumTensors) {\n                probe.minNumTensors = numTensors;\n            }\n        }\n        const symbolic = sorted[i];\n        const srcLayer = symbolic.sourceLayer;\n        if (srcLayer instanceof InputLayer) {\n            continue;\n        }\n        const inputValues = [];\n        const inputMasks = [];\n        const tensorsToDispose = [];\n        let maskExists = false;\n        for (const input of symbolic.inputs) {\n            const value = internalFeedDict.getValue(input);\n            const mask = internalFeedDict.getMask(input);\n            inputValues.push(value);\n            inputMasks.push(mask);\n            if (mask != null) {\n                maskExists = true;\n            }\n            if (!training) {\n                recipientCounts[input.name]--;\n                if (recipientCounts[input.name] === 0 && !feedDict.hasKey(input) &&\n                    outputNames.indexOf(input.name) === -1 && !value.isDisposed &&\n                    input.sourceLayer.stateful !== true) {\n                    tensorsToDispose.push(value);\n                }\n            }\n        }\n        if (maskExists) {\n            kwargs = kwargs || {};\n            kwargs['mask'] = inputMasks[0];\n        }\n        const outputTensors = toList(srcLayer.apply(inputValues, kwargs));\n        let outputMask = null;\n        if (srcLayer.supportsMasking) {\n            outputMask = srcLayer.computeMask(inputValues, inputMasks);\n        }\n        const layerOutputs = getNodeOutputs(symbolic);\n        const outputSymbolicTensors = Array.isArray(layerOutputs) ? layerOutputs : [layerOutputs];\n        for (let i = 0; i < outputSymbolicTensors.length; ++i) {\n            if (!internalFeedDict.hasKey(outputSymbolicTensors[i])) {\n                internalFeedDict.add(outputSymbolicTensors[i], outputTensors[i], Array.isArray(outputMask) ? outputMask[0] : outputMask);\n            }\n            const index = outputNames.indexOf(outputSymbolicTensors[i].name);\n            if (index !== -1) {\n                finalOutputs[index] = outputTensors[i];\n            }\n        }\n        if (!training) {\n            // Clean up Tensors that are no longer needed.\n            dispose(tensorsToDispose);\n        }\n    }\n    // NOTE(cais): Unlike intermediate tensors, we don't discard mask\n    // tensors as we go, because these tensors are sometimes passed over a\n    // series of mutliple layers, i.e., not obeying the immediate input\n    // relations in the graph. If this becomes a memory-usage concern,\n    // we can improve this in the future.\n    internalFeedDict.disposeMasks();\n    return arrayFetches ? finalOutputs : finalOutputs[0];\n}\n/**\n * Sort the `SymbolicTensor`s topologically, for an array of fetches.\n *\n * This function calls getTopologicalSortAndRecipientCountsForOneFetch and\n * merges their results.\n *\n * @param fetch The array of fetches requested. Must be a non-empty array.\n * @param feedDict The dictionary of fed values.\n * @returns sorted: Topologically-sorted array of SymbolicTensors.\n *   recipientCounts: Recipient counts for all SymbolicTensors in `sorted`.\n */\nfunction getTopologicalSortAndRecipientCounts(fetches, feedDict) {\n    util.assert(fetches != null && fetches.length > 0, () => `Expected at least one fetch, got none`);\n    let finalSorted = [];\n    let finalRecipientMap = {};\n    if (fetches.length === 1) {\n        // Special-casing 1 fetch for efficiency.\n        const out = getTopologicalSortAndRecipientCountsForOneFetch(fetches[0], feedDict);\n        finalSorted = out.sorted;\n        finalRecipientMap = out.recipientMap;\n    }\n    else {\n        const visited = new Set();\n        for (const fetch of fetches) {\n            const { sorted, recipientMap } = getTopologicalSortAndRecipientCountsForOneFetch(fetch, feedDict);\n            // Merge sorted SymbolicTensor Arrays.\n            for (const symbolicTensor of sorted) {\n                if (!visited.has(symbolicTensor.name)) {\n                    finalSorted.push(symbolicTensor);\n                    visited.add(symbolicTensor.name);\n                }\n            }\n            // Merge recipient maps.\n            for (const name in recipientMap) {\n                if (finalRecipientMap[name] == null) {\n                    finalRecipientMap[name] = new Set();\n                }\n                recipientMap[name].forEach(recipient => finalRecipientMap[name].add(recipient));\n            }\n        }\n    }\n    return {\n        sorted: finalSorted,\n        recipientCounts: recipientMap2Counts(finalRecipientMap)\n    };\n}\nfunction recipientMap2Counts(recipientMap) {\n    const recipientCounts = {};\n    for (const name in recipientMap) {\n        recipientCounts[name] = recipientMap[name].size;\n    }\n    return recipientCounts;\n}\n/**\n * Sort the `SymbolicTensor`s topologically, for a single fetch.\n *\n * This helper function processes the upstream SymbolicTensors of a single\n * fetch.\n *\n * @param fetch The single fetch requested.\n * @param feedDict The dictionary of fed values.\n * @returns sorted: Topologically-sorted array of SymbolicTensors.\n *   recipientMap: Recipient names for all SymbolicTensors in `sorted`.\n */\nexport function getTopologicalSortAndRecipientCountsForOneFetch(fetch, feedDict) {\n    const visited = new Set();\n    const sorted = [];\n    const recipientMap = {};\n    // Put keys of the feedDict into visited first, so they don't have to be\n    // walked. This is needed in case where there are feeds for intermediate\n    // SymbolicTensors of the graph.\n    for (const key of feedDict.names()) {\n        visited.add(key);\n    }\n    const stack = [];\n    const marks = [];\n    // Initial population of stack and marks.\n    stack.push(fetch);\n    while (stack.length > 0) {\n        const top = stack[stack.length - 1];\n        if (visited.has(top.name)) {\n            stack.pop();\n            continue;\n        }\n        const topIsMarked = marks[marks.length - 1] === stack.length - 1;\n        if (top.inputs.length === 0 || topIsMarked) {\n            // Input SymbolicTensor or all children have been visited.\n            stack.pop();\n            sorted.push(top);\n            visited.add(top.name);\n            if (topIsMarked) {\n                marks.pop();\n            }\n        }\n        else {\n            // A non-input SymbolicTensor whose upstream SymbolicTensors haven't\n            // been visited yet. Push them onto the stack.\n            marks.push(stack.length - 1);\n            for (const input of top.inputs) {\n                // Increment the recipient count. Note that this needs to happen\n                // regardless of whether the SymbolicTensor has been visited before.\n                if (recipientMap[input.name] == null) {\n                    recipientMap[input.name] = new Set();\n                }\n                recipientMap[input.name].add(top.name);\n                if (visited.has(input.name)) {\n                    continue; // Avoid repeated visits to the same SymbolicTensor.\n                }\n                stack.push(input);\n            }\n        }\n    }\n    return { sorted, recipientMap };\n}\n/**\n * Get the symbolic output tensors of the node to which a given fetch belongs.\n * @param fetch The fetched symbolic tensor.\n * @returns The Array of symbolic tensors output by the node to which `fetch`\n *   belongs.\n */\nfunction getNodeOutputs(fetch) {\n    let layerOutputs;\n    if (fetch.sourceLayer.inboundNodes.length === 1) {\n        layerOutputs = fetch.sourceLayer.output;\n    }\n    else {\n        let nodeIndex = null;\n        for (let i = 0; i < fetch.sourceLayer.inboundNodes.length; ++i) {\n            for (const outputTensor of fetch.sourceLayer.inboundNodes[i]\n                .outputTensors) {\n                if (outputTensor.id === fetch.id) {\n                    nodeIndex = i;\n                    break;\n                }\n            }\n        }\n        layerOutputs = fetch.sourceLayer.getOutputAt(nodeIndex);\n    }\n    return layerOutputs;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQVUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFMUUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVyQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDakQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTlDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUUxQzs7R0FFRztBQUNILFNBQVMsdUJBQXVCLENBQUMsR0FBbUIsRUFBRSxHQUFXO0lBQy9ELDZCQUE2QjtJQUM3QixJQUFJLEdBQUcsQ0FBQyxLQUFLLElBQUksSUFBSSxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssR0FBRyxDQUFDLEtBQUssRUFBRTtRQUNoRCxnREFBZ0Q7UUFDaEQsT0FBTyxHQUFHLENBQUM7S0FDWjtJQUNELElBQUk7UUFDRiwyQ0FBMkM7UUFDM0MsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM3QjtJQUFDLE9BQU8sR0FBRyxFQUFFO1FBQ1osaURBQWlEO1FBQ2pELE1BQU0sSUFBSSxVQUFVLENBQ2hCLDBCQUEwQixHQUFHLENBQUMsS0FBSyxpQ0FBaUM7WUFDcEUsZUFBZSxHQUFHLENBQUMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDO0tBQ2pEO0FBQ0gsQ0FBQztBQVVEOzs7R0FHRztBQUNILE1B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WSxFQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBUyxjQUFjLENBQUMsS0FBcUI7SUFFM0MsSUFBSSxZQUE2QyxDQUFDO0lBQ2xELElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQyxZQUFZLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUM7S0FDekM7U0FBTTtRQUNMLElBQUksU0FBUyxHQUFXLElBQUksQ0FBQztRQUM3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzlELEtBQUssTUFBTSxZQUFZLElBQUksS0FBSyxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO2lCQUNsRCxhQUFhLEVBQUU7Z0JBQ3ZCLElBQUksWUFBWSxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsRUFBRSxFQUFFO29CQUNoQyxTQUFTLEdBQUcsQ0FBQyxDQUFDO29CQUNkLE1BQU07aUJBQ1A7YUFDRjtTQUNGO1FBQ0QsWUFBWSxHQUFHLEtBQUssQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQ3pEO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogRXhlY3V0b3I6IEV2YWx1YXRlcyBTeW1ib2xpY1RlbnNvciBiYXNlZCBvbiBmZWVkcy5cbiAqL1xuXG5pbXBvcnQge2Nhc3QsIGRpc3Bvc2UsIG1lbW9yeSwgVGVuc29yLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtMcnVDYWNoZX0gZnJvbSAnLi4vdXRpbHMvZXhlY3V0b3JfdXRpbHMnO1xuaW1wb3J0IHt0b0xpc3R9IGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG5pbXBvcnQge0lucHV0TGF5ZXJ9IGZyb20gJy4vaW5wdXRfbGF5ZXInO1xuaW1wb3J0IHtTeW1ib2xpY1RlbnNvcn0gZnJvbSAnLi90b3BvbG9neSc7XG5cbi8qKlxuICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHRoZSBkdHlwZSBhbmQgc2hhcGUgY29tcGF0aWJpbGl0eSBvZiBhIGZlZWQgdmFsdWUuXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEZlZWRDb21wYXRpYmlsaXR5KGtleTogU3ltYm9saWNUZW5zb3IsIHZhbDogVGVuc29yKTogVGVuc29yIHtcbiAgLy8gQ2hlY2sgZHR5cGUgY29tcGF0aWJpbGl0eS5cbiAgaWYgKGtleS5kdHlwZSA9PSBudWxsIHx8IGtleS5kdHlwZSA9PT0gdmFsLmR0eXBlKSB7XG4gICAgLy8gIGEuICBJZiB0eXBlcyBtYXRjaCwgcmV0dXJuIHZhbCB0ZW5zb3IgYXMgaXMuXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICB0cnkge1xuICAgIC8vICBiLiBBdHRlbXB0IHRvIGNvbnZlcnQgdG8gZXhwZWN0ZWQgdHlwZS5cbiAgICByZXR1cm4gY2FzdCh2YWwsIGtleS5kdHlwZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIC8vICBjLiBJZiBjb252ZXJzaW9uIGZhaWxzLCByZXR1cm4gaGVscGZ1bCBlcnJvci5cbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYFRoZSBkdHlwZSBvZiB0aGUgZmVlZCAoJHt2YWwuZHR5cGV9KSBjYW4gbm90IGJlIGNhc3QgdG8gdGhlIGR0eXBlIGAgK1xuICAgICAgICBgb2YgdGhlIGtleSAnJHtrZXkubmFtZX0nICgke2tleS5kdHlwZX0pLmApO1xuICB9XG59XG5cbi8qKlxuICogQSBjb25jcmV0ZSBUZW5zb3IgdmFsdWUgZm9yIGEgc3ltYm9saWMgdGVuc29yIGFzIHRoZSBrZXkuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRmVlZCB7XG4gIGtleTogU3ltYm9saWNUZW5zb3I7XG4gIHZhbHVlOiBUZW5zb3I7XG59XG5cbi8qKlxuICogRmVlZERpY3Q6IEEgbWFwcGluZyBmcm9tIHVuaXF1ZSBTeW1ib2xpY1RlbnNvcnMgdG8gZmVlZCB2YWx1ZXMgZm9yIHRoZW0uXG4gKiBBIGZlZWQgdmFsdWUgaXMgYSBjb25jcmV0ZSB2YWx1ZSByZXByZXNlbnRlZCBhcyBhbiBgVGVuc29yYC5cbiAqL1xuZXhwb3J0IGNsYXNzIEZlZWREaWN0IHtcbiAgcHJpdmF0ZSBpZDJWYWx1ZToge1tpZDogbnVtYmVyXTogVGVuc29yfSA9IHt9O1xuICBwcml2YXRlIGlkMk1hc2s6IHtbaWQ6IG51bWJlcl06IFRlbnNvcn0gPSB7fTtcbiAgcHJpdmF0ZSBuYW1lMklkOiB7W25hbWU6IHN0cmluZ106IG51bWJlcn0gPSB7fTtcblxuICAvKipcbiAgICogQ29uc3RydWN0b3IsIG9wdGlvbmFsbHkgZG9lcyBjb3B5LWNvbnN0cnVjdGlvbi5cbiAgICogQHBhcmFtIGZlZWRzIEFuIEFycmF5IG9mIGBGZWVkYHMsIG9yIGFub3RoZXIgYEZlZWREaWN0YCwgaW4gd2hpY2ggY2FzZVxuICAgKiAgIGNvcHktY29uc3RydWN0aW9uIHdpbGwgYmUgcGVyZm9ybWVkLlxuICAgKi9cbiAgY29uc3RydWN0b3IoZmVlZHM/OiBGZWVkW118RmVlZERpY3QpIHtcbiAgICBpZiAoZmVlZHMgaW5zdGFuY2VvZiBGZWVkRGljdCkge1xuICAgICAgZm9yIChjb25zdCBpZCBpbiBmZWVkcy5pZDJWYWx1ZSkge1xuICAgICAgICB0aGlzLmlkMlZhbHVlW2lkXSA9IGZlZWRzLmlkMlZhbHVlW2lkXTtcbiAgICAgICAgaWYgKGlkIGluIGZlZWRzLmlkMk1hc2spIHtcbiAgICAgICAgICB0aGlzLmlkMk1hc2tbaWRdID0gZmVlZHMuaWQyTWFza1tpZF07XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGZlZWRzID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBmZWVkIG9mIGZlZWRzKSB7XG4gICAgICAgIHRoaXMuYWRkKGZlZWQua2V5LCBmZWVkLnZhbHVlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWRkIGEga2V5LXZhbHVlIHBhaXIgdG8gdGhlIEZlZWREaWN0LlxuICAgKlxuICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgb2YgdGhlIGZlZWQuXG4gICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgb2YgdGhlIHRlbnNvciBmZWVkLlxuICAgKiBAcGFyYW0gbWFzayBUaGUgdmFsdWUgb2YgdGhlIG1hc2sgZmVlZCAob3B0aW9uYWwpLlxuICAgKiBAcmV0dXJucyBUaGlzIGBGZWVkRGljdGAuXG4gICAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSWYgdGhlIGtleSBgU3ltYm9saWNUZW5zb3JgIGFscmVhZHkgZXhpc3RzIGluIHRoZVxuICAgKiAgIGBGZWVkRGljdGAuXG4gICAqL1xuICBhZGQoa2V5OiBTeW1ib2xpY1RlbnNvciwgdmFsdWU6IFRlbnNvciwgbWFzaz86IFRlbnNvcik6IEZlZWREaWN0IHtcbiAgICBpZiAodGhpcy5pZDJWYWx1ZVtrZXkuaWRdID09IG51bGwpIHtcbiAgICAgIHRoaXMuaWQyVmFsdWVba2V5LmlkXSA9IGFzc2VydEZlZWRDb21wYXRpYmlsaXR5KGtleSwgdmFsdWUpO1xuICAgICAgdGhpcy5uYW1lMklkW2tleS5uYW1lXSA9IGtleS5pZDtcbiAgICAgIGlmIChtYXNrICE9IG51bGwpIHtcbiAgICAgICAgdGhpcy5pZDJNYXNrW2tleS5pZF0gPSBtYXNrO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgRHVwbGljYXRlIGtleTogbmFtZT0ke2tleS5uYW1lfSwgaWQ9JHtrZXkuaWR9YCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIEZlZWQgdG8gdGhlIEZlZWREaWN0LlxuICAgKiBAcGFyYW0gZmVlZCBUaGUgbmV3IGBGZWVkYCB0byBhZGQuXG4gICAqIEByZXR1cm5zIFRoaXMgYEZlZWREaWN0YC5cbiAgICovXG4gIGFkZEZlZWQoZmVlZDogRmVlZCkge1xuICAgIHRoaXMuYWRkKGZlZWQua2V5LCBmZWVkLnZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9iZSB3aGV0aGVyIGEga2V5IGFscmVhZHkgZXhpc3RzIGluIHRoZSBGZWVkRGljdC5cbiAgICogQHBhcmFtIGtleVxuICAgKi9cbiAgaGFzS2V5KGtleTogU3ltYm9saWNUZW5zb3IpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pZDJWYWx1ZVtrZXkuaWRdICE9IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFsbCB0aGUgU3ltYm9saWNUZW5zb3IgYXZhaWxhYmxlIGluIHRoaXMgRmVlZERpY3QuXG4gICAqL1xuICBuYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMubmFtZTJJZCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBmZWVkIHZhbHVlIGZvciBnaXZlbiBrZXkuXG4gICAqIEBwYXJhbSBrZXkgVGhlIFN5bWJvbGljVGVuc29yLCBvciBpdHMgbmFtZSAoYXMgYSBzdHJpbmcpLCBvZiB3aGljaCB0aGVcbiAgICogICAgIHZhbHVlIGlzIHNvdWdodC5cbiAgICogQHJldHVybnMgSWYgYGtleWAgZXhpc3RzLCB0aGUgY29ycmVzcG9uZGluZyBmZWVkIHZhbHVlLlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIGBrZXlgIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYEZlZWREaWN0YC5cbiAgICovXG4gIGdldFZhbHVlKGtleTogU3ltYm9saWNUZW5zb3J8c3RyaW5nKTogVGVuc29yIHtcbiAgICBpZiAoa2V5IGluc3RhbmNlb2YgU3ltYm9saWNUZW5zb3IpIHtcbiAgICAgIGlmICh0aGlzLmlkMlZhbHVlW2tleS5pZF0gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgTm9uZXhpc3RlbnQga2V5OiAke2tleS5uYW1lfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaWQyVmFsdWVba2V5LmlkXTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaWQgPSB0aGlzLm5hbWUySWRba2V5XTtcbiAgICAgIGlmIChpZCA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBGZWVkIGRpY3QgaGFzIG5vIFN5bWJvbGljVGVuc29yIG5hbWU6ICR7a2V5fWApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuaWQyVmFsdWVbaWRdO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGZlZWQgbWFzayBmb3IgZ2l2ZW4ga2V5LlxuICAgKiBAcGFyYW0ga2V5IFRoZSBTeW1ib2xpY1RlbnNvciwgb3IgaXRzIG5hbWUgKGFzIGEgc3RyaW5nKSwgb2Ygd2hpY2ggdGhlXG4gICAqICAgICB2YWx1ZSBpcyBzb3VnaHQuXG4gICAqIEByZXR1cm5zIElmIGBrZXlgIGV4aXN0cywgdGhlIGNvcnJlc3BvbmRpbmcgZmVlZCBtYXNrLlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIGBrZXlgIGRvZXMgbm90IGV4aXN0IGluIHRoaXMgYEZlZWREaWN0YC5cbiAgICovXG4gIGdldE1hc2soa2V5OiBTeW1ib2xpY1RlbnNvcnxzdHJpbmcpOiBUZW5zb3Ige1xuICAgIGlmIChrZXkgaW5zdGFuY2VvZiBTeW1ib2xpY1RlbnNvcikge1xuICAgICAgaWYgKHRoaXMuaWQyVmFsdWVba2V5LmlkXSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBOb25leGlzdGVudCBrZXk6ICR7a2V5Lm5hbWV9YCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5pZDJNYXNrW2tleS5pZF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGlkID0gdGhpcy5uYW1lMklkW2tleV07XG4gICAgICBpZiAoaWQgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgRmVlZCBkaWN0IGhhcyBubyBTeW1ib2xpY1RlbnNvciBuYW1lOiAke2tleX1gKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzLmlkMk1hc2tbaWRdO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBEaXNwb3NlIGFsbCBtYXNrIFRlbnNvcnMgaGVsZCBieSB0aGlzIG9iamVjdC4gKi9cbiAgZGlzcG9zZU1hc2tzKCkge1xuICAgIGlmICh0aGlzLmlkMk1hc2sgIT0gbnVsbCkge1xuICAgICAgZGlzcG9zZSh0aGlzLmlkMk1hc2spO1xuICAgIH1cbiAgfVxufVxuXG4vLyBDYWNoZSBmb3IgdG9wb2xvZ2ljYWxseSBzb3J0ZWQgU3ltYm9saWNUZW5zb3JzIGZvciBnaXZlbiBleGVjdXRpb25cbi8vIHRhcmdldHMgKGkuZS4sIGZldGNoZXMpLlxuZXhwb3J0IGNvbnN0IGNhY2hlZFNvcnRlZDogTHJ1Q2FjaGU8U3ltYm9saWNUZW5zb3JbXT4gPVxuICAgIG5ldyBMcnVDYWNoZTxTeW1ib2xpY1RlbnNvcltdPigpO1xuXG4vLyBDYWNoZSBmb3IgcmVjaXBpZW50IGNvdW50IG1hcHMgZm9yIGdpdmVuIGV4ZWN1dGlvbiB0YXJnZXRzIChpLmUuLCBmZXRjaGVzKS5cbmV4cG9ydCBjb25zdCBjYWNoZWRSZWNpcGllbnRDb3VudHM6IExydUNhY2hlPFJlY2lwaWVudENvdW50cz4gPVxuICAgIG5ldyBMcnVDYWNoZTxSZWNpcGllbnRDb3VudHM+KCk7XG5cbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDYWNoZU1heEVudHJpZXMobWF4RW50cmllczogbnVtYmVyKSB7XG4gIGlmIChjYWNoZWRTb3J0ZWQgIT0gbnVsbCkge1xuICAgIGNhY2hlZFNvcnRlZC5zZXRNYXhFbnRyaWVzKG1heEVudHJpZXMpO1xuICB9XG4gIGlmIChjYWNoZWRSZWNpcGllbnRDb3VudHMgIT0gbnVsbCkge1xuICAgIGNhY2hlZFJlY2lwaWVudENvdW50cy5zZXRNYXhFbnRyaWVzKG1heEVudHJpZXMpO1xuICB9XG59XG5cbi8qKlxuICogSW50ZXJmYWNlIGZvciB0aGUgb3B0aW9uYWwgb2JqZWN0IHVzZWQgZm9yIHByb2JpbmcgdGhlIG1lbW9yeVxuICogdXNhZ2UgYW5kIG90aGVyIHN0YXRpc3RpY3MgZHVyaW5nIGV4ZWN1dGlvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFeGVjdXRpb25Qcm9iZSB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG51bWJlciBvZiB0ZW5zb3JzIHRoYXQgZXhpc3QgZHVyaW5nIGFsbCBzdGVwcyBvZiB0aGVcbiAgICogZXhlY3V0aW9uLiBUZW5zb3IgY291bnRzIGFyZSBtZWFzdXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5XG4gICAqIHN0ZXAuXG4gICAqL1xuICBtYXhOdW1UZW5zb3JzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNaW5pbXVtIG51bWJlciBvZiB0ZW5zb3JzIHRoYXQgZXhpc3QgZHVyaW5nIGFsbCBzdGVwcyBvZiB0aGVcbiAgICogZXhlY3V0aW9uLiBUZW5zb3IgY291bnRzIGFyZSBtZWFzdXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5XG4gICAqIHN0ZXAuXG4gICAqL1xuICBtaW5OdW1UZW5zb3JzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIEV4ZWN1dGUgYSBTeW1ib2xpY1RlbnNvciBieSB1c2luZyBjb25jcmV0ZSBmZWVkIHZhbHVlcy5cbiAqXG4gKiBBIGBTeW1ib2xpY1RlbnNvcmAgb2JqZWN0IGlzIGEgbm9kZSBpbiBhIGNvbXB1dGF0aW9uIGdyYXBoIG9mIFRGLmpzXG4gKiBMYXllcnMuIFRoZSBvYmplY3QgaXMgYmFja2VkIGJ5IGEgc291cmNlIGxheWVyIGFuZCBpbnB1dFxuICogYFN5bWJvbGljVGVuc29yYHMgdG8gdGhlIHNvdXJjZSBsYXllci4gVGhpcyBtZXRob2QgZXZhbHVhdGVzXG4gKiB0aGUgYGNhbGwoKWAgbWV0aG9kIG9mIHRoZSBzb3VyY2UgbGF5ZXIsIHVzaW5nIGNvbmNyZXRlIHZhbHVlcyBvZiB0aGVcbiAqIGlucHV0cyBvYnRhaW5lZCBmcm9tIGVpdGhlclxuICogKiBgZmVlZERpY3RgLCBpZiB0aGUgaW5wdXQga2V5IGV4aXN0cyBpbiBgZmVlZERpY3RgLCBvciBlbHNlLFxuICogKiBhIHJlY3Vyc2l2ZSBjYWxsIHRvIGBleGVjdXRlKClgIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0geDogVGhlIGBTeW1ib2xpY1RlbnNvcmAgdG8gZXhlY3V0ZS5cbiAqIEBwYXJhbSBmZWVkRGljdDogVGhlIGZlZWQgdmFsdWVzLCBhcyBiYXNlIGNvbmRpdGlvbiBvZiB0aGUgcmVjdXJzaW9uLlxuICogICBleGVjdXRpb24uXG4gKiBAcGFyYW0ga3dhcmdzOiBPcHRpb25hbCBrZXl3b3JkIGFyZ3VtZW50cy5cbiAqIEBwYXJhbSBwcm9iZTogQSBwcm9iZSBvYmplY3QgKG9mIGludGVyZmFjZSBgRXhlY3V0aW9uUHJvYmVgKSB1c2VkIGZvclxuICogICB0ZXN0aW5nIG1lbW9yeSBmb290cHJpbnQgb2YgYGV4ZWN1dGVgIGNhbGxzLlxuICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBleGVjdXRpb24uXG4gKiBAdGhyb3dzIFZhbHVlRXJyb3I6IElmIGFueSBgU3ltYm9saWNUZW5zb3JgcyBmcm9tIGBJbnB1dExheWVyYHNcbiAqICAgZW5jb3VudGVyZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gbGFja3MgYSBmZWVkIHZhbHVlIGluIGBmZWVkRGljdGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlKFxuICAgIGZldGNoZXM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10sIGZlZWREaWN0OiBGZWVkRGljdCxcbiAgICBrd2FyZ3M/OiBLd2FyZ3MsIHByb2JlPzogRXhlY3V0aW9uUHJvYmUpOiBUZW5zb3J8XG4gICAgVGVuc29yW118W1RlbnNvciB8IFRlbnNvcltdXSB7XG4gIGNvbnN0IHRyYWluaW5nOiBib29sZWFuID0ga3dhcmdzID09IG51bGwgPyBmYWxzZSA6IGt3YXJnc1sndHJhaW5pbmcnXTtcblxuICBjb25zdCBhcnJheUZldGNoZXMgPSBBcnJheS5pc0FycmF5KGZldGNoZXMpO1xuICBjb25zdCBmZXRjaEFycmF5OiBTeW1ib2xpY1RlbnNvcltdID1cbiAgICAgIGFycmF5RmV0Y2hlcyA/IGZldGNoZXMgYXMgU3ltYm9saWNUZW5zb3JbXSA6IFtmZXRjaGVzIGFzIFN5bWJvbGljVGVuc29yXTtcblxuICBjb25zdCBvdXRwdXROYW1lcyA9IGZldGNoQXJyYXkubWFwKHQgPT4gdC5uYW1lKTtcbiAgY29uc3QgZmluYWxPdXRwdXRzOiBUZW5zb3JbXSA9IFtdO1xuICBjb25zdCBmZWVkTmFtZXMgPSBmZWVkRGljdC5uYW1lcygpO1xuICBmb3IgKGNvbnN0IG91dHB1dE5hbWUgb2Ygb3V0cHV0TmFtZXMpIHtcbiAgICBpZiAoZmVlZE5hbWVzLmluZGV4T2Yob3V0cHV0TmFtZSkgIT09IC0xKSB7XG4gICAgICBmaW5hbE91dHB1dHMucHVzaChmZWVkRGljdC5nZXRWYWx1ZShvdXRwdXROYW1lKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZpbmFsT3V0cHV0cy5wdXNoKG51bGwpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9iZSAhPSBudWxsKSB7XG4gICAgLy8gRm9yIG9wdGlvbmFsIHByb2Jpbmcgb2YgbWVtb3J5IGZvb3RwcmludCBkdXJpbmcgZXhlY3V0aW9uLlxuICAgIHByb2JlLm1heE51bVRlbnNvcnMgPSAtSW5maW5pdHk7XG4gICAgcHJvYmUubWluTnVtVGVuc29ycyA9IEluZmluaXR5O1xuICB9XG5cbiAgLy8gQ2hlY2sgY2FjaGUuXG4gIGNvbnN0IGZldGNoQW5kRmVlZEtleSA9XG4gICAgICBvdXRwdXROYW1lcy5qb2luKCcsJykgKyAnfCcgKyBmZWVkRGljdC5uYW1lcygpLnNvcnQoKS5qb2luKCcsJyk7XG4gIGxldCBzb3J0ZWQ6IFN5bWJvbGljVGVuc29yW10gPSBjYWNoZWRTb3J0ZWQuZ2V0KGZldGNoQW5kRmVlZEtleSk7XG4gIGxldCByZWNpcGllbnRDb3VudHM6IHtbZmV0Y2hOYW1lOiBzdHJpbmddOiBudW1iZXJ9O1xuICBpZiAoc29ydGVkID09IG51bGwpIHtcbiAgICAvLyBDYWNoZSBkb2Vzbid0IGNvbnRhaW4gdGhlIGRlc2lyZWQgY29tYmluYXRpb24gb2YgZmV0Y2hlcy4gQ29tcHV0ZVxuICAgIC8vIHRvcG9sb2dpY2FsIHNvcnQgZm9yIHRoZSBjb21iaW5hdGlvbiBmb3IgdGhlIGZpcnN0IHRpbWUuXG4gICAgY29uc3Qgb3V0ID0gZ2V0VG9wb2xvZ2ljYWxTb3J0QW5kUmVjaXBpZW50Q291bnRzKGZldGNoQXJyYXksIGZlZWREaWN0KTtcbiAgICBzb3J0ZWQgPSBvdXQuc29ydGVkO1xuICAgIHJlY2lwaWVudENvdW50cyA9IG91dC5yZWNpcGllbnRDb3VudHM7XG5cbiAgICAvLyBTdG9yZSByZXN1bHRzIGluIGNhY2hlIGZvciBmdXR1cmUgdXNlLlxuICAgIGNhY2hlZFNvcnRlZC5wdXQoZmV0Y2hBbmRGZWVkS2V5LCBzb3J0ZWQpO1xuICAgIGNhY2hlZFJlY2lwaWVudENvdW50cy5wdXQoZmV0Y2hBbmRGZWVkS2V5LCByZWNpcGllbnRDb3VudHMpO1xuICB9XG4gIHJlY2lwaWVudENvdW50cyA9IHt9O1xuICBpZiAoIXRyYWluaW5nKSB7XG4gICAgT2JqZWN0LmFzc2lnbihyZWNpcGllbnRDb3VudHMsIGNhY2hlZFJlY2lwaWVudENvdW50cy5nZXQoZmV0Y2hBbmRGZWVkS2V5KSk7XG4gIH1cblxuICBjb25zdCBpbnRlcm5hbEZlZWREaWN0ID0gbmV3IEZlZWREaWN0KGZlZWREaWN0KTtcblxuICAvLyBTdGFydCBpdGVyYXRpdmUgZXhlY3V0aW9uIG9uIHRoZSB0b3BvbG9naWNhbGx5LXNvcnRlZCBTeW1ib2xpY1RlbnNvcnMuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc29ydGVkLmxlbmd0aDsgKytpKSB7XG4gICAgaWYgKHByb2JlICE9IG51bGwpIHtcbiAgICAgIC8vIEZvciBvcHRpb25hbCBwcm9iaW5nIG9mIG1lbW9yeSB1c2FnZSBkdXJpbmcgZXhlY3V0aW9uLlxuICAgICAgY29uc3QgbnVtVGVuc29ycyA9IG1lbW9yeSgpLm51bVRlbnNvcnM7XG4gICAgICBpZiAobnVtVGVuc29ycyA+IHByb2JlLm1heE51bVRlbnNvcnMpIHtcbiAgICAgICAgcHJvYmUubWF4TnVtVGVuc29ycyA9IG51bVRlbnNvcnM7XG4gICAgICB9XG4gICAgICBpZiAobnVtVGVuc29ycyA8IHByb2JlLm1pbk51bVRlbnNvcnMpIHtcbiAgICAgICAgcHJvYmUubWluTnVtVGVuc29ycyA9IG51bVRlbnNvcnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgc3ltYm9saWMgPSBzb3J0ZWRbaV07XG4gICAgY29uc3Qgc3JjTGF5ZXIgPSBzeW1ib2xpYy5zb3VyY2VMYXllcjtcbiAgICBpZiAoc3JjTGF5ZXIgaW5zdGFuY2VvZiBJbnB1dExheWVyKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRWYWx1ZXM6IFRlbnNvcltdID0gW107XG4gICAgY29uc3QgaW5wdXRNYXNrczogVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCB0ZW5zb3JzVG9EaXNwb3NlOiBUZW5zb3JbXSA9IFtdO1xuXG4gICAgbGV0IG1hc2tFeGlzdHMgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHN5bWJvbGljLmlucHV0cykge1xuICAgICAgY29uc3QgdmFsdWUgPSBpbnRlcm5hbEZlZWREaWN0LmdldFZhbHVlKGlucHV0KTtcbiAgICAgIGNvbnN0IG1hc2sgPSBpbnRlcm5hbEZlZWREaWN0LmdldE1hc2soaW5wdXQpO1xuICAgICAgaW5wdXRWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICBpbnB1dE1hc2tzLnB1c2gobWFzayk7XG4gICAgICBpZiAobWFzayAhPSBudWxsKSB7XG4gICAgICAgIG1hc2tFeGlzdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgaWYgKCF0cmFpbmluZykge1xuICAgICAgICByZWNpcGllbnRDb3VudHNbaW5wdXQubmFtZV0tLTtcbiAgICAgICAgaWYgKHJlY2lwaWVudENvdW50c1tpbnB1dC5uYW1lXSA9PT0gMCAmJiAhZmVlZERpY3QuaGFzS2V5KGlucHV0KSAmJlxuICAgICAgICAgICAgb3V0cHV0TmFtZXMuaW5kZXhPZihpbnB1dC5uYW1lKSA9PT0gLTEgJiYgIXZhbHVlLmlzRGlzcG9zZWQgJiZcbiAgICAgICAgICAgIGlucHV0LnNvdXJjZUxheWVyLnN0YXRlZnVsICE9PSB0cnVlKSB7XG4gICAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChtYXNrRXhpc3RzKSB7XG4gICAgICBrd2FyZ3MgPSBrd2FyZ3MgfHwge307XG4gICAgICBrd2FyZ3NbJ21hc2snXSA9IGlucHV0TWFza3NbMF07XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFRlbnNvcnMgPVxuICAgICAgICB0b0xpc3Qoc3JjTGF5ZXIuYXBwbHkoaW5wdXRWYWx1ZXMsIGt3YXJncykpIGFzIFRlbnNvcltdO1xuICAgIGxldCBvdXRwdXRNYXNrOiBUZW5zb3J8VGVuc29yW10gPSBudWxsO1xuICAgIGlmIChzcmNMYXllci5zdXBwb3J0c01hc2tpbmcpIHtcbiAgICAgIG91dHB1dE1hc2sgPSBzcmNMYXllci5jb21wdXRlTWFzayhpbnB1dFZhbHVlcywgaW5wdXRNYXNrcyk7XG4gICAgfVxuICAgIGNvbnN0IGxheWVyT3V0cHV0cyA9IGdldE5vZGVPdXRwdXRzKHN5bWJvbGljKTtcbiAgICBjb25zdCBvdXRwdXRTeW1ib2xpY1RlbnNvcnMgPVxuICAgICAgICBBcnJheS5pc0FycmF5KGxheWVyT3V0cHV0cykgPyBsYXllck91dHB1dHMgOiBbbGF5ZXJPdXRwdXRzXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dFN5bWJvbGljVGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKCFpbnRlcm5hbEZlZWREaWN0Lmhhc0tleShvdXRwdXRTeW1ib2xpY1RlbnNvcnNbaV0pKSB7XG4gICAgICAgIGludGVybmFsRmVlZERpY3QuYWRkKFxuICAgICAgICAgICAgb3V0cHV0U3ltYm9saWNUZW5zb3JzW2ldLCBvdXRwdXRUZW5zb3JzW2ldLFxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShvdXRwdXRNYXNrKSA/IG91dHB1dE1hc2tbMF0gOiBvdXRwdXRNYXNrKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGluZGV4ID0gb3V0cHV0TmFtZXMuaW5kZXhPZihvdXRwdXRTeW1ib2xpY1RlbnNvcnNbaV0ubmFtZSk7XG4gICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgIGZpbmFsT3V0cHV0c1tpbmRleF0gPSBvdXRwdXRUZW5zb3JzW2ldO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdHJhaW5pbmcpIHtcbiAgICAgIC8vIENsZWFuIHVwIFRlbnNvcnMgdGhhdCBhcmUgbm8gbG9uZ2VyIG5lZWRlZC5cbiAgICAgIGRpc3Bvc2UodGVuc29yc1RvRGlzcG9zZSk7XG4gICAgfVxuICB9XG4gIC8vIE5PVEUoY2Fpcyk6IFVubGlrZSBpbnRlcm1lZGlhdGUgdGVuc29ycywgd2UgZG9uJ3QgZGlzY2FyZCBtYXNrXG4gIC8vIHRlbnNvcnMgYXMgd2UgZ28sIGJlY2F1c2UgdGhlc2UgdGVuc29ycyBhcmUgc29tZXRpbWVzIHBhc3NlZCBvdmVyIGFcbiAgLy8gc2VyaWVzIG9mIG11dGxpcGxlIGxheWVycywgaS5lLiwgbm90IG9iZXlpbmcgdGhlIGltbWVkaWF0ZSBpbnB1dFxuICAvLyByZWxhdGlvbnMgaW4gdGhlIGdyYXBoLiBJZiB0aGlzIGJlY29tZXMgYSBtZW1vcnktdXNhZ2UgY29uY2VybixcbiAgLy8gd2UgY2FuIGltcHJvdmUgdGhpcyBpbiB0aGUgZnV0dXJlLlxuICBpbnRlcm5hbEZlZWREaWN0LmRpc3Bvc2VNYXNrcygpO1xuXG4gIHJldHVybiBhcnJheUZldGNoZXMgPyBmaW5hbE91dHB1dHMgOiBmaW5hbE91dHB1dHNbMF07XG59XG5cbnR5cGUgUmVjaXBpZW50Q291bnRzID0ge1xuICBbZmV0Y2hOYW1lOiBzdHJpbmddOiBudW1iZXJcbn07XG5cbmV4cG9ydCB0eXBlIFJlY2lwaWVudE1hcCA9IHtcbiAgW2ZldGNoTmFtZTogc3RyaW5nXTogU2V0PHN0cmluZz47XG59O1xuXG4vKipcbiAqIFNvcnQgdGhlIGBTeW1ib2xpY1RlbnNvcmBzIHRvcG9sb2dpY2FsbHksIGZvciBhbiBhcnJheSBvZiBmZXRjaGVzLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FsbHMgZ2V0VG9wb2xvZ2ljYWxTb3J0QW5kUmVjaXBpZW50Q291bnRzRm9yT25lRmV0Y2ggYW5kXG4gKiBtZXJnZXMgdGhlaXIgcmVzdWx0cy5cbiAqXG4gKiBAcGFyYW0gZmV0Y2ggVGhlIGFycmF5IG9mIGZldGNoZXMgcmVxdWVzdGVkLiBNdXN0IGJlIGEgbm9uLWVtcHR5IGFycmF5LlxuICogQHBhcmFtIGZlZWREaWN0IFRoZSBkaWN0aW9uYXJ5IG9mIGZlZCB2YWx1ZXMuXG4gKiBAcmV0dXJucyBzb3J0ZWQ6IFRvcG9sb2dpY2FsbHktc29ydGVkIGFycmF5IG9mIFN5bWJvbGljVGVuc29ycy5cbiAqICAgcmVjaXBpZW50Q291bnRzOiBSZWNpcGllbnQgY291bnRzIGZvciBhbGwgU3ltYm9saWNUZW5zb3JzIGluIGBzb3J0ZWRgLlxuICovXG5mdW5jdGlvbiBnZXRUb3BvbG9naWNhbFNvcnRBbmRSZWNpcGllbnRDb3VudHMoXG4gICAgZmV0Y2hlczogU3ltYm9saWNUZW5zb3JbXSwgZmVlZERpY3Q6IEZlZWREaWN0KTpcbiAgICB7c29ydGVkOiBTeW1ib2xpY1RlbnNvcltdLCByZWNpcGllbnRDb3VudHM6IFJlY2lwaWVudENvdW50c30ge1xuICB1dGlsLmFzc2VydChcbiAgICAgIGZldGNoZXMgIT0gbnVsbCAmJiBmZXRjaGVzLmxlbmd0aCA+IDAsXG4gICAgICAoKSA9PiBgRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIGZldGNoLCBnb3Qgbm9uZWApO1xuXG4gIGxldCBmaW5hbFNvcnRlZDogU3ltYm9saWNUZW5zb3JbXSA9IFtdO1xuICBsZXQgZmluYWxSZWNpcGllbnRNYXA6IFJlY2lwaWVudE1hcCA9IHt9O1xuICBpZiAoZmV0Y2hlcy5sZW5ndGggPT09IDEpIHtcbiAgICAvLyBTcGVjaWFsLWNhc2luZyAxIGZldGNoIGZvciBlZmZpY2llbmN5LlxuICAgIGNvbnN0IG91dCA9XG4gICAgICAgIGdldFRvcG9sb2dpY2FsU29ydEFuZFJlY2lwaWVudENvdW50c0Zvck9uZUZldGNoKGZldGNoZXNbMF0sIGZlZWREaWN0KTtcbiAgICBmaW5hbFNvcnRlZCA9IG91dC5zb3J0ZWQ7XG4gICAgZmluYWxSZWNpcGllbnRNYXAgPSBvdXQucmVjaXBpZW50TWFwO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICBmb3IgKGNvbnN0IGZldGNoIG9mIGZldGNoZXMpIHtcbiAgICAgIGNvbnN0IHtzb3J0ZWQsIHJlY2lwaWVudE1hcH0gPVxuICAgICAgICAgIGdldFRvcG9sb2dpY2FsU29ydEFuZFJlY2lwaWVudENvdW50c0Zvck9uZUZldGNoKGZldGNoLCBmZWVkRGljdCk7XG5cbiAgICAgIC8vIE1lcmdlIHNvcnRlZCBTeW1ib2xpY1RlbnNvciBBcnJheXMuXG4gICAgICBmb3IgKGNvbnN0IHN5bWJvbGljVGVuc29yIG9mIHNvcnRlZCkge1xuICAgICAgICBpZiAoIXZpc2l0ZWQuaGFzKHN5bWJvbGljVGVuc29yLm5hbWUpKSB7XG4gICAgICAgICAgZmluYWxTb3J0ZWQucHVzaChzeW1ib2xpY1RlbnNvcik7XG4gICAgICAgICAgdmlzaXRlZC5hZGQoc3ltYm9saWNUZW5zb3IubmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gTWVyZ2UgcmVjaXBpZW50IG1hcHMuXG4gICAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcmVjaXBpZW50TWFwKSB7XG4gICAgICAgIGlmIChmaW5hbFJlY2lwaWVudE1hcFtuYW1lXSA9PSBudWxsKSB7XG4gICAgICAgICAgZmluYWxSZWNpcGllbnRNYXBbbmFtZV0gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgfVxuICAgICAgICByZWNpcGllbnRNYXBbbmFtZV0uZm9yRWFjaChcbiAgICAgICAgICAgIHJlY2lwaWVudCA9PiBmaW5hbFJlY2lwaWVudE1hcFtuYW1lXS5hZGQocmVjaXBpZW50KSk7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiB7XG4gICAgc29ydGVkOiBmaW5hbFNvcnRlZCxcbiAgICByZWNpcGllbnRDb3VudHM6IHJlY2lwaWVudE1hcDJDb3VudHMoZmluYWxSZWNpcGllbnRNYXApXG4gIH07XG59XG5cbmZ1bmN0aW9uIHJlY2lwaWVudE1hcDJDb3VudHMocmVjaXBpZW50TWFwOiBSZWNpcGllbnRNYXApOiBSZWNpcGllbnRDb3VudHMge1xuICBjb25zdCByZWNpcGllbnRDb3VudHM6IFJlY2lwaWVudENvdW50cyA9IHt9O1xuICBmb3IgKGNvbnN0IG5hbWUgaW4gcmVjaXBpZW50TWFwKSB7XG4gICAgcmVjaXBpZW50Q291bnRzW25hbWVdID0gcmVjaXBpZW50TWFwW25hbWVdLnNpemU7XG4gIH1cbiAgcmV0dXJuIHJlY2lwaWVudENvdW50cztcbn1cblxuLyoqXG4gKiBTb3J0IHRoZSBgU3ltYm9saWNUZW5zb3JgcyB0b3BvbG9naWNhbGx5LCBmb3IgYSBzaW5nbGUgZmV0Y2guXG4gKlxuICogVGhpcyBoZWxwZXIgZnVuY3Rpb24gcHJvY2Vzc2VzIHRoZSB1cHN0cmVhbSBTeW1ib2xpY1RlbnNvcnMgb2YgYSBzaW5nbGVcbiAqIGZldGNoLlxuICpcbiAqIEBwYXJhbSBmZXRjaCBUaGUgc2luZ2xlIGZldGNoIHJlcXVlc3RlZC5cbiAqIEBwYXJhbSBmZWVkRGljdCBUaGUgZGljdGlvbmFyeSBvZiBmZWQgdmFsdWVzLlxuICogQHJldHVybnMgc29ydGVkOiBUb3BvbG9naWNhbGx5LXNvcnRlZCBhcnJheSBvZiBTeW1ib2xpY1RlbnNvcnMuXG4gKiAgIHJlY2lwaWVudE1hcDogUmVjaXBpZW50IG5hbWVzIGZvciBhbGwgU3ltYm9saWNUZW5zb3JzIGluIGBzb3J0ZWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0VG9wb2xvZ2ljYWxTb3J0QW5kUmVjaXBpZW50Q291bnRzRm9yT25lRmV0Y2goXG4gICAgZmV0Y2g6IFN5bWJvbGljVGVuc29yLCBmZWVkRGljdDogRmVlZERpY3QpOlxuICAgIHtzb3J0ZWQ6IFN5bWJvbGljVGVuc29yW10sIHJlY2lwaWVudE1hcDogUmVjaXBpZW50TWFwfSB7XG4gIGNvbnN0IHZpc2l0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgc29ydGVkOiBTeW1ib2xpY1RlbnNvcltdID0gW107XG4gIGNvbnN0IHJlY2lwaWVudE1hcDogUmVjaXBpZW50TWFwID0ge307XG5cbiAgLy8gUHV0IGtleXMgb2YgdGhlIGZlZWREaWN0IGludG8gdmlzaXRlZCBmaXJzdCwgc28gdGhleSBkb24ndCBoYXZlIHRvIGJlXG4gIC8vIHdhbGtlZC4gVGhpcyBpcyBuZWVkZWQgaW4gY2FzZSB3aGVyZSB0aGVyZSBhcmUgZmVlZHMgZm9yIGludGVybWVkaWF0ZVxuICAvLyBTeW1ib2xpY1RlbnNvcnMgb2YgdGhlIGdyYXBoLlxuICBmb3IgKGNvbnN0IGtleSBvZiBmZWVkRGljdC5uYW1lcygpKSB7XG4gICAgdmlzaXRlZC5hZGQoa2V5KTtcbiAgfVxuXG4gIGNvbnN0IHN0YWNrOiBTeW1ib2xpY1RlbnNvcltdID0gW107XG4gIGNvbnN0IG1hcmtzOiBudW1iZXJbXSA9IFtdO1xuXG4gIC8vIEluaXRpYWwgcG9wdWxhdGlvbiBvZiBzdGFjayBhbmQgbWFya3MuXG4gIHN0YWNrLnB1c2goZmV0Y2gpO1xuXG4gIHdoaWxlIChzdGFjay5sZW5ndGggPiAwKSB7XG4gICAgY29uc3QgdG9wID0gc3RhY2tbc3RhY2subGVuZ3RoIC0gMV07XG4gICAgaWYgKHZpc2l0ZWQuaGFzKHRvcC5uYW1lKSkge1xuICAgICAgc3RhY2sucG9wKCk7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgY29uc3QgdG9wSXNNYXJrZWQgPSBtYXJrc1ttYXJrcy5sZW5ndGggLSAxXSA9PT0gc3RhY2subGVuZ3RoIC0gMTtcbiAgICBpZiAodG9wLmlucHV0cy5sZW5ndGggPT09IDAgfHwgdG9wSXNNYXJrZWQpIHtcbiAgICAgIC8vIElucHV0IFN5bWJvbGljVGVuc29yIG9yIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gdmlzaXRlZC5cbiAgICAgIHN0YWNrLnBvcCgpO1xuICAgICAgc29ydGVkLnB1c2godG9wKTtcbiAgICAgIHZpc2l0ZWQuYWRkKHRvcC5uYW1lKTtcbiAgICAgIGlmICh0b3BJc01hcmtlZCkge1xuICAgICAgICBtYXJrcy5wb3AoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy8gQSBub24taW5wdXQgU3ltYm9saWNUZW5zb3Igd2hvc2UgdXBzdHJlYW0gU3ltYm9saWNUZW5zb3JzIGhhdmVuJ3RcbiAgICAgIC8vIGJlZW4gdmlzaXRlZCB5ZXQuIFB1c2ggdGhlbSBvbnRvIHRoZSBzdGFjay5cbiAgICAgIG1hcmtzLnB1c2goc3RhY2subGVuZ3RoIC0gMSk7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIHRvcC5pbnB1dHMpIHtcbiAgICAgICAgLy8gSW5jcmVtZW50IHRoZSByZWNpcGllbnQgY291bnQuIE5vdGUgdGhhdCB0aGlzIG5lZWRzIHRvIGhhcHBlblxuICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIFN5bWJvbGljVGVuc29yIGhhcyBiZWVuIHZpc2l0ZWQgYmVmb3JlLlxuICAgICAgICBpZiAocmVjaXBpZW50TWFwW2lucHV0Lm5hbWVdID09IG51bGwpIHtcbiAgICAgICAgICByZWNpcGllbnRNYXBbaW5wdXQubmFtZV0gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgICAgICAgfVxuICAgICAgICByZWNpcGllbnRNYXBbaW5wdXQubmFtZV0uYWRkKHRvcC5uYW1lKTtcblxuICAgICAgICBpZiAodmlzaXRlZC5oYXMoaW5wdXQubmFtZSkpIHtcbiAgICAgICAgICBjb250aW51ZTsgIC8vIEF2b2lkIHJlcGVhdGVkIHZpc2l0cyB0byB0aGUgc2FtZSBTeW1ib2xpY1RlbnNvci5cbiAgICAgICAgfVxuICAgICAgICBzdGFjay5wdXNoKGlucHV0KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtzb3J0ZWQsIHJlY2lwaWVudE1hcH07XG59XG5cbi8qKlxuICogR2V0IHRoZSBzeW1ib2xpYyBvdXRwdXQgdGVuc29ycyBvZiB0aGUgbm9kZSB0byB3aGljaCBhIGdpdmVuIGZldGNoIGJlbG9uZ3MuXG4gKiBAcGFyYW0gZmV0Y2ggVGhlIGZldGNoZWQgc3ltYm9saWMgdGVuc29yLlxuICogQHJldHVybnMgVGhlIEFycmF5IG9mIHN5bWJvbGljIHRlbnNvcnMgb3V0cHV0IGJ5IHRoZSBub2RlIHRvIHdoaWNoIGBmZXRjaGBcbiAqICAgYmVsb25ncy5cbiAqL1xuZnVuY3Rpb24gZ2V0Tm9kZU91dHB1dHMoZmV0Y2g6IFN5bWJvbGljVGVuc29yKTogU3ltYm9saWNUZW5zb3J8XG4gICAgU3ltYm9saWNUZW5zb3JbXSB7XG4gIGxldCBsYXllck91dHB1dHM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW107XG4gIGlmIChmZXRjaC5zb3VyY2VMYXllci5pbmJvdW5kTm9kZXMubGVuZ3RoID09PSAxKSB7XG4gICAgbGF5ZXJPdXRwdXRzID0gZmV0Y2guc291cmNlTGF5ZXIub3V0cHV0O1xuICB9IGVsc2Uge1xuICAgIGxldCBub2RlSW5kZXg6IG51bWJlciA9IG51bGw7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmZXRjaC5zb3VyY2VMYXllci5pbmJvdW5kTm9kZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0VGVuc29yIG9mIGZldGNoLnNvdXJjZUxheWVyLmluYm91bmROb2Rlc1tpXVxuICAgICAgICAgICAgICAgLm91dHB1dFRlbnNvcnMpIHtcbiAgICAgICAgaWYgKG91dHB1dFRlbnNvci5pZCA9PT0gZmV0Y2guaWQpIHtcbiAgICAgICAgICBub2RlSW5kZXggPSBpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGxheWVyT3V0cHV0cyA9IGZldGNoLnNvdXJjZUxheWVyLmdldE91dHB1dEF0KG5vZGVJbmRleCk7XG4gIH1cbiAgcmV0dXJuIGxheWVyT3V0cHV0cztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { updateCacheMaxEntries } from './engine/executor';\nexport const ENV = env();\n/** The max number of entries for the caches of layers' topological sort. */\nENV.registerFlag('TOPOLOGICAL_SORT_CACHE_MAX_ENTRIES', () => 100, updateCacheMaxEntries);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3NfbGF5ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2ZsYWdzX2xheWVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFMUMsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBRXpCLDRFQUE0RTtBQUM1RSxHQUFHLENBQUMsWUFBWSxDQUNaLG9DQUFvQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1cGRhdGVDYWNoZU1heEVudHJpZXN9IGZyb20gJy4vZW5naW5lL2V4ZWN1dG9yJztcblxuZXhwb3J0IGNvbnN0IEVOViA9IGVudigpO1xuXG4vKiogVGhlIG1heCBudW1iZXIgb2YgZW50cmllcyBmb3IgdGhlIGNhY2hlcyBvZiBsYXllcnMnIHRvcG9sb2dpY2FsIHNvcnQuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdUT1BPTE9HSUNBTF9TT1JUX0NBQ0hFX01BWF9FTlRSSUVTJywgKCkgPT4gMTAwLCB1cGRhdGVDYWNoZU1heEVudHJpZXMpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/contraints.py */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { epsilon } from './backend/common';\nimport { deserializeKerasObject, serializeKerasObject } from './utils/generic_utils';\n/**\n * Helper function used by many of the Constraints to find the L2Norms.\n */\nfunction calcL2Norms(w, axis) {\n    return tidy(() => tfc.sqrt(tfc.sum(tfc.mul(w, w), axis, true)));\n}\n/**\n * Base class for functions that impose constraints on weight values\n *\n * @doc {\n *   heading: 'Constraints',\n *   subheading: 'Classes',\n *   namespace: 'constraints'\n * }\n */\nexport class Constraint extends serialization.Serializable {\n    getConfig() {\n        return {};\n    }\n}\nexport class MaxNorm extends Constraint {\n    constructor(args) {\n        super();\n        this.defaultMaxValue = 2;\n        this.defaultAxis = 0;\n        this.maxValue =\n            args.maxValue != null ? args.maxValue : this.defaultMaxValue;\n        this.axis = args.axis != null ? args.axis : this.defaultAxis;\n    }\n    apply(w) {\n        return tidy(() => {\n            const norms = calcL2Norms(w, this.axis);\n            const desired = tfc.clipByValue(norms, 0, this.maxValue);\n            return tfc.mul(w, tfc.div(desired, tfc.add(epsilon(), norms)));\n        });\n    }\n    getConfig() {\n        return { maxValue: this.maxValue, axis: this.axis };\n    }\n}\n/** @nocollapse */\nMaxNorm.className = 'MaxNorm';\nserialization.registerClass(MaxNorm);\nexport class UnitNorm extends Constraint {\n    constructor(args) {\n        super();\n        this.defaultAxis = 0;\n        this.axis = args.axis != null ? args.axis : this.defaultAxis;\n    }\n    apply(w) {\n        return tidy(() => tfc.div(w, tfc.add(epsilon(), calcL2Norms(w, this.axis))));\n    }\n    getConfig() {\n        return { axis: this.axis };\n    }\n}\n/** @nocollapse */\nUnitNorm.className = 'UnitNorm';\nserialization.registerClass(UnitNorm);\nexport class NonNeg extends Constraint {\n    apply(w) {\n        return tfc.relu(w);\n    }\n}\n/** @nocollapse */\nNonNeg.className = 'NonNeg';\nserialization.registerClass(NonNeg);\nexport class MinMaxNorm extends Constraint {\n    constructor(args) {\n        super();\n        this.defaultMinValue = 0.0;\n        this.defaultMaxValue = 1.0;\n        this.defaultRate = 1.0;\n        this.defaultAxis = 0;\n        this.minValue =\n            args.minValue != null ? args.minValue : this.defaultMinValue;\n        this.maxValue =\n            args.maxValue != null ? args.maxValue : this.defaultMaxValue;\n        this.rate = args.rate != null ? args.rate : this.defaultRate;\n        this.axis = args.axis != null ? args.axis : this.defaultAxis;\n    }\n    apply(w) {\n        return tidy(() => {\n            const norms = calcL2Norms(w, this.axis);\n            const desired = tfc.add(tfc.mul(this.rate, tfc.clipByValue(norms, this.minValue, this.maxValue)), tfc.mul(1.0 - this.rate, norms));\n            return tfc.mul(w, tfc.div(desired, tfc.add(epsilon(), norms)));\n        });\n    }\n    getConfig() {\n        return {\n            minValue: this.minValue,\n            maxValue: this.maxValue,\n            rate: this.rate,\n            axis: this.axis\n        };\n    }\n}\n/** @nocollapse */\nMinMaxNorm.className = 'MinMaxNorm';\nserialization.registerClass(MinMaxNorm);\n// Maps the JavaScript-like identifier keys to the corresponding registry\n// symbols.\nexport const CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n    'maxNorm': 'MaxNorm',\n    'minMaxNorm': 'MinMaxNorm',\n    'nonNeg': 'NonNeg',\n    'unitNorm': 'UnitNorm'\n};\nexport function serializeConstraint(constraint) {\n    return serializeKerasObject(constraint);\n}\nexport function deserializeConstraint(config, customObjects = {}) {\n    return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'constraint');\n}\nexport function getConstraint(identifier) {\n    if (identifier == null) {\n        return null;\n    }\n    if (typeof identifier === 'string') {\n        const className = identifier in CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP ?\n            CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] :\n            identifier;\n        const config = { className, config: {} };\n        return deserializeConstraint(config);\n    }\n    else if (identifier instanceof Constraint) {\n        return identifier;\n    }\n    else {\n        return deserializeConstraint(identifier);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RyYWludHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvY29uc3RyYWludHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCwwQ0FBMEM7QUFFMUMsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsYUFBYSxFQUFVLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEVBQUMsc0JBQXNCLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRjs7R0FFRztBQUNILFNBQVMsV0FBVyxDQUFDLENBQVMsRUFBRSxJQUFZO0lBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRDs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sT0FBZ0IsVUFBVyxTQUFRLGFBQWEsQ0FBQyxZQUFZO0lBR2pFLFNBQVM7UUFDUCxPQUFPLEVBQUUsQ0FBQztJQUNaLENBQUM7Q0FDRjtBQXdCRCxNQUFNLE9BQU8sT0FBUSxTQUFRLFVBQVU7SUFRckMsWUFBWSxJQUFpQjtRQUMzQixLQUFLLEVBQUUsQ0FBQztRQUpPLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBSS9CLElBQUksQ0FBQyxRQUFRO1lBQ1QsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FB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QUFVLEVBQUU7UUFDM0MsT0FBTyxVQUFVLENBQUM7S0FDbkI7U0FBTTtRQUNMLE9BQU8scUJBQXFCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDMUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9jb250cmFpbnRzLnB5ICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2Vwc2lsb259IGZyb20gJy4vYmFja2VuZC9jb21tb24nO1xuaW1wb3J0IHtkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0LCBzZXJpYWxpemVLZXJhc09iamVjdH0gZnJvbSAnLi91dGlscy9nZW5lcmljX3V0aWxzJztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBtYW55IG9mIHRoZSBDb25zdHJhaW50cyB0byBmaW5kIHRoZSBMMk5vcm1zLlxuICovXG5mdW5jdGlvbiBjYWxjTDJOb3Jtcyh3OiBUZW5zb3IsIGF4aXM6IG51bWJlcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHRmYy5zcXJ0KHRmYy5zdW0odGZjLm11bCh3LCB3KSwgYXhpcywgdHJ1ZSkpKTtcbn1cblxuLyoqXG4gKiBCYXNlIGNsYXNzIGZvciBmdW5jdGlvbnMgdGhhdCBpbXBvc2UgY29uc3RyYWludHMgb24gd2VpZ2h0IHZhbHVlc1xuICpcbiAqIEBkb2Mge1xuICogICBoZWFkaW5nOiAnQ29uc3RyYWludHMnLFxuICogICBzdWJoZWFkaW5nOiAnQ2xhc3NlcycsXG4gKiAgIG5hbWVzcGFjZTogJ2NvbnN0cmFpbnRzJ1xuICogfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29uc3RyYWludCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIHtcbiAgLyogUG9ydGluZyBub3RlOiB3YXMgX19jYWxsX18sIGFwcGx5IGNob3NlbiB0byBtYXRjaCBvdGhlciBzaW1pbGFyIGNob2ljZXMgKi9cbiAgYWJzdHJhY3QgYXBwbHkodzogVGVuc29yKTogVGVuc29yO1xuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge307XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNYXhOb3JtQXJncyB7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG5vcm0gZm9yIGluY29taW5nIHdlaWdodHNcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuICAvKipcbiAgICogQXhpcyBhbG9uZyB3aGljaCB0byBjYWxjdWxhdGUgbm9ybXMuXG4gICAqXG4gICAqICBGb3IgaW5zdGFuY2UsIGluIGEgYERlbnNlYCBsYXllciB0aGUgd2VpZ2h0IG1hdHJpeFxuICAgKiAgaGFzIHNoYXBlIGBbaW5wdXREaW0sIG91dHB1dERpbV1gLFxuICAgKiAgc2V0IGBheGlzYCB0byBgMGAgdG8gY29uc3RyYWluIGVhY2ggd2VpZ2h0IHZlY3RvclxuICAgKiAgb2YgbGVuZ3RoIGBbaW5wdXREaW0sXWAuXG4gICAqICBJbiBhIGBDb252MkRgIGxheWVyIHdpdGggYGRhdGFGb3JtYXQ9XCJjaGFubmVsc19sYXN0XCJgLFxuICAgKiAgdGhlIHdlaWdodCB0ZW5zb3IgaGFzIHNoYXBlXG4gICAqICBgW3Jvd3MsIGNvbHMsIGlucHV0RGVwdGgsIG91dHB1dERlcHRoXWAsXG4gICAqICBzZXQgYGF4aXNgIHRvIGBbMCwgMSwgMl1gXG4gICAqICB0byBjb25zdHJhaW4gdGhlIHdlaWdodHMgb2YgZWFjaCBmaWx0ZXIgdGVuc29yIG9mIHNpemVcbiAgICogIGBbcm93cywgY29scywgaW5wdXREZXB0aF1gLlxuICAgKi9cbiAgYXhpcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIE1heE5vcm0gZXh0ZW5kcyBDb25zdHJhaW50IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnTWF4Tm9ybSc7XG4gIHByaXZhdGUgbWF4VmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBheGlzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1heFZhbHVlID0gMjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXhpcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoYXJnczogTWF4Tm9ybUFyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWF4VmFsdWUgPVxuICAgICAgICBhcmdzLm1heFZhbHVlICE9IG51bGwgPyBhcmdzLm1heFZhbHVlIDogdGhpcy5kZWZhdWx0TWF4VmFsdWU7XG4gICAgdGhpcy5heGlzID0gYXJncy5heGlzICE9IG51bGwgPyBhcmdzLmF4aXMgOiB0aGlzLmRlZmF1bHRBeGlzO1xuICB9XG5cbiAgYXBwbHkodzogVGVuc29yKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBub3JtcyA9IGNhbGNMMk5vcm1zKHcsIHRoaXMuYXhpcyk7XG4gICAgICBjb25zdCBkZXNpcmVkID0gdGZjLmNsaXBCeVZhbHVlKG5vcm1zLCAwLCB0aGlzLm1heFZhbHVlKTtcbiAgICAgIHJldHVybiB0ZmMubXVsKHcsIHRmYy5kaXYoZGVzaXJlZCwgdGZjLmFkZChlcHNpbG9uKCksIG5vcm1zKSkpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHttYXhWYWx1ZTogdGhpcy5tYXhWYWx1ZSwgYXhpczogdGhpcy5heGlzfTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE1heE5vcm0pO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVuaXROb3JtQXJncyB7XG4gIC8qKlxuICAgKiBBeGlzIGFsb25nIHdoaWNoIHRvIGNhbGN1bGF0ZSBub3Jtcy5cbiAgICpcbiAgICogRm9yIGluc3RhbmNlLCBpbiBhIGBEZW5zZWAgbGF5ZXIgdGhlIHdlaWdodCBtYXRyaXhcbiAgICogaGFzIHNoYXBlIGBbaW5wdXREaW0sIG91dHB1dERpbV1gLFxuICAgKiBzZXQgYGF4aXNgIHRvIGAwYCB0byBjb25zdHJhaW4gZWFjaCB3ZWlnaHQgdmVjdG9yXG4gICAqIG9mIGxlbmd0aCBgW2lucHV0RGltLF1gLlxuICAgKiBJbiBhIGBDb252MkRgIGxheWVyIHdpdGggYGRhdGFGb3JtYXQ9XCJjaGFubmVsc19sYXN0XCJgLFxuICAgKiB0aGUgd2VpZ2h0IHRlbnNvciBoYXMgc2hhcGVcbiAgICogYFtyb3dzLCBjb2xzLCBpbnB1dERlcHRoLCBvdXRwdXREZXB0aF1gLFxuICAgKiBzZXQgYGF4aXNgIHRvIGBbMCwgMSwgMl1gXG4gICAqIHRvIGNvbnN0cmFpbiB0aGUgd2VpZ2h0cyBvZiBlYWNoIGZpbHRlciB0ZW5zb3Igb2Ygc2l6ZVxuICAgKiBgW3Jvd3MsIGNvbHMsIGlucHV0RGVwdGhdYC5cbiAgICovXG4gIGF4aXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBVbml0Tm9ybSBleHRlbmRzIENvbnN0cmFpbnQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdVbml0Tm9ybSc7XG4gIHByaXZhdGUgYXhpczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRBeGlzID0gMDtcbiAgY29uc3RydWN0b3IoYXJnczogVW5pdE5vcm1BcmdzKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmF4aXMgPSBhcmdzLmF4aXMgIT0gbnVsbCA/IGFyZ3MuYXhpcyA6IHRoaXMuZGVmYXVsdEF4aXM7XG4gIH1cblxuICBhcHBseSh3OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KFxuICAgICAgICAoKSA9PiB0ZmMuZGl2KHcsIHRmYy5hZGQoZXBzaWxvbigpLCBjYWxjTDJOb3Jtcyh3LCB0aGlzLmF4aXMpKSkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgcmV0dXJuIHtheGlzOiB0aGlzLmF4aXN9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVW5pdE5vcm0pO1xuXG5leHBvcnQgY2xhc3MgTm9uTmVnIGV4dGVuZHMgQ29uc3RyYWludCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ05vbk5lZyc7XG5cbiAgYXBwbHkodzogVGVuc29yKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGZjLnJlbHUodyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhOb25OZWcpO1xuXG5leHBvcnQgaW50ZXJmYWNlIE1pbk1heE5vcm1BcmdzIHtcbiAgLyoqXG4gICAqIE1pbmltdW0gbm9ybSBmb3IgaW5jb21pbmcgd2VpZ2h0c1xuICAgKi9cbiAgbWluVmFsdWU/OiBudW1iZXI7XG4gIC8qKlxuICAgKiBNYXhpbXVtIG5vcm0gZm9yIGluY29taW5nIHdlaWdodHNcbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xuICAvKipcbiAgICogQXhpcyBhbG9uZyB3aGljaCB0byBjYWxjdWxhdGUgbm9ybXMuXG4gICAqIEZvciBpbnN0YW5jZSwgaW4gYSBgRGVuc2VgIGxheWVyIHRoZSB3ZWlnaHQgbWF0cml4XG4gICAqIGhhcyBzaGFwZSBgW2lucHV0RGltLCBvdXRwdXREaW1dYCxcbiAgICogc2V0IGBheGlzYCB0byBgMGAgdG8gY29uc3RyYWluIGVhY2ggd2VpZ2h0IHZlY3RvclxuICAgKiBvZiBsZW5ndGggYFtpbnB1dERpbSxdYC5cbiAgICogSW4gYSBgQ29udjJEYCBsYXllciB3aXRoIGBkYXRhRm9ybWF0PVwiY2hhbm5lbHNfbGFzdFwiYCxcbiAgICogdGhlIHdlaWdodCB0ZW5zb3IgaGFzIHNoYXBlXG4gICAqIGBbcm93cywgY29scywgaW5wdXREZXB0aCwgb3V0cHV0RGVwdGhdYCxcbiAgICogc2V0IGBheGlzYCB0byBgWzAsIDEsIDJdYFxuICAgKiB0byBjb25zdHJhaW4gdGhlIHdlaWdodHMgb2YgZWFjaCBmaWx0ZXIgdGVuc29yIG9mIHNpemVcbiAgICogYFtyb3dzLCBjb2xzLCBpbnB1dERlcHRoXWAuXG4gICAqL1xuICBheGlzPzogbnVtYmVyO1xuICAvKipcbiAgICogUmF0ZSBmb3IgZW5mb3JjaW5nIHRoZSBjb25zdHJhaW50OiB3ZWlnaHRzIHdpbGwgYmUgcmVzY2FsZWQgdG8geWllbGQ6XG4gICAqIGAoMSAtIHJhdGUpICogbm9ybSArIHJhdGUgKiBub3JtLmNsaXAobWluVmFsdWUsIG1heFZhbHVlKWAuXG4gICAqIEVmZmVjdGl2ZWx5LCB0aGlzIG1lYW5zIHRoYXQgcmF0ZT0xLjAgc3RhbmRzIGZvciBzdHJpY3RcbiAgICogZW5mb3JjZW1lbnQgb2YgdGhlIGNvbnN0cmFpbnQsIHdoaWxlIHJhdGU8MS4wIG1lYW5zIHRoYXRcbiAgICogd2VpZ2h0cyB3aWxsIGJlIHJlc2NhbGVkIGF0IGVhY2ggc3RlcCB0byBzbG93bHkgbW92ZVxuICAgKiB0b3dhcmRzIGEgdmFsdWUgaW5zaWRlIHRoZSBkZXNpcmVkIGludGVydmFsLlxuICAgKi9cbiAgcmF0ZT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIE1pbk1heE5vcm0gZXh0ZW5kcyBDb25zdHJhaW50IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnTWluTWF4Tm9ybSc7XG4gIHByaXZhdGUgbWluVmFsdWU6IG51bWJlcjtcbiAgcHJpdmF0ZSBtYXhWYWx1ZTogbnVtYmVyO1xuICBwcml2YXRlIHJhdGU6IG51bWJlcjtcbiAgcHJpdmF0ZSBheGlzOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVmYXVsdE1pblZhbHVlID0gMC4wO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlZmF1bHRNYXhWYWx1ZSA9IDEuMDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0UmF0ZSA9IDEuMDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZWZhdWx0QXhpcyA9IDA7XG5cbiAgY29uc3RydWN0b3IoYXJnczogTWluTWF4Tm9ybUFyZ3MpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWluVmFsdWUgPVxuICAgICAgICBhcmdzLm1pblZhbHVlICE9IG51bGwgPyBhcmdzLm1pblZhbHVlIDogdGhpcy5kZWZhdWx0TWluVmFsdWU7XG4gICAgdGhpcy5tYXhWYWx1ZSA9XG4gICAgICAgIGFyZ3MubWF4VmFsdWUgIT0gbnVsbCA/IGFyZ3MubWF4VmFsdWUgOiB0aGlzLmRlZmF1bHRNYXhWYWx1ZTtcbiAgICB0aGlzLnJhdGUgPSBhcmdzLnJhdGUgIT0gbnVsbCA/IGFyZ3MucmF0ZSA6IHRoaXMuZGVmYXVsdFJhdGU7XG4gICAgdGhpcy5heGlzID0gYXJncy5heGlzICE9IG51bGwgPyBhcmdzLmF4aXMgOiB0aGlzLmRlZmF1bHRBeGlzO1xuICB9XG5cbiAgYXBwbHkodzogVGVuc29yKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBub3JtcyA9IGNhbGNMMk5vcm1zKHcsIHRoaXMuYXhpcyk7XG4gICAgICBjb25zdCBkZXNpcmVkID0gdGZjLmFkZChcbiAgICAgICAgICB0ZmMubXVsKFxuICAgICAgICAgICAgICB0aGlzLnJhdGUsIHRmYy5jbGlwQnlWYWx1ZShub3JtcywgdGhpcy5taW5WYWx1ZSwgdGhpcy5tYXhWYWx1ZSkpLFxuICAgICAgICAgIHRmYy5tdWwoMS4wIC0gdGhpcy5yYXRlLCBub3JtcykpO1xuICAgICAgcmV0dXJuIHRmYy5tdWwodywgdGZjLmRpdihkZXNpcmVkLCB0ZmMuYWRkKGVwc2lsb24oKSwgbm9ybXMpKSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4ge1xuICAgICAgbWluVmFsdWU6IHRoaXMubWluVmFsdWUsXG4gICAgICBtYXhWYWx1ZTogdGhpcy5tYXhWYWx1ZSxcbiAgICAgIHJhdGU6IHRoaXMucmF0ZSxcbiAgICAgIGF4aXM6IHRoaXMuYXhpc1xuICAgIH07XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNaW5NYXhOb3JtKTtcblxuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIENvbnN0cmFpbnRJZGVudGlmaWVyID1cbiAgICAnbWF4Tm9ybSd8J21pbk1heE5vcm0nfCdub25OZWcnfCd1bml0Tm9ybSd8c3RyaW5nO1xuXG4vLyBNYXBzIHRoZSBKYXZhU2NyaXB0LWxpa2UgaWRlbnRpZmllciBrZXlzIHRvIHRoZSBjb3JyZXNwb25kaW5nIHJlZ2lzdHJ5XG4vLyBzeW1ib2xzLlxuZXhwb3J0IGNvbnN0IENPTlNUUkFJTlRfSURFTlRJRklFUl9SRUdJU1RSWV9TWU1CT0xfTUFQOlxuICAgIHtbaWRlbnRpZmllciBpbiBDb25zdHJhaW50SWRlbnRpZmllcl06IHN0cmluZ30gPSB7XG4gICAgICAnbWF4Tm9ybSc6ICdNYXhOb3JtJyxcbiAgICAgICdtaW5NYXhOb3JtJzogJ01pbk1heE5vcm0nLFxuICAgICAgJ25vbk5lZyc6ICdOb25OZWcnLFxuICAgICAgJ3VuaXROb3JtJzogJ1VuaXROb3JtJ1xuICAgIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVDb25zdHJhaW50KGNvbnN0cmFpbnQ6IENvbnN0cmFpbnQpOlxuICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgcmV0dXJuIHNlcmlhbGl6ZUtlcmFzT2JqZWN0KGNvbnN0cmFpbnQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVDb25zdHJhaW50KFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIGN1c3RvbU9iamVjdHM6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9KTogQ29uc3RyYWludCB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0KFxuICAgICAgY29uZmlnLCBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25NYXAuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwLFxuICAgICAgY3VzdG9tT2JqZWN0cywgJ2NvbnN0cmFpbnQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbnN0cmFpbnQoaWRlbnRpZmllcjogQ29uc3RyYWludElkZW50aWZpZXJ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3R8Q29uc3RyYWludCk6IENvbnN0cmFpbnQge1xuICBpZiAoaWRlbnRpZmllciA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbiAgaWYgKHR5cGVvZiBpZGVudGlmaWVyID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGNsYXNzTmFtZSA9IGlkZW50aWZpZXIgaW4gQ09OU1RSQUlOVF9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVAgP1xuICAgICAgICBDT05TVFJBSU5UX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUFtpZGVudGlmaWVyXSA6XG4gICAgICAgIGlkZW50aWZpZXI7XG4gICAgY29uc3QgY29uZmlnID0ge2NsYXNzTmFtZSwgY29uZmlnOiB7fX07XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplQ29uc3RyYWludChjb25maWcpO1xuICB9IGVsc2UgaWYgKGlkZW50aWZpZXIgaW5zdGFuY2VvZiBDb25zdHJhaW50KSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplQ29uc3RyYWludChpZGVudGlmaWVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { dispose } from '@tensorflow/tfjs-core';\n/**\n * Turn any Scalar values in a Logs object into actual number values.\n *\n * @param logs The `Logs` object to be resolved in place.\n */\nexport async function resolveScalarsInLogs(logs) {\n    if (logs == null) {\n        return;\n    }\n    const promises = [];\n    const keys = [];\n    const scalarsToDispose = [];\n    for (const key in logs) {\n        const value = logs[key];\n        if (typeof value !== 'number') {\n            const valueScalar = value;\n            promises.push(valueScalar.data());\n            keys.push(key);\n            scalarsToDispose.push(valueScalar);\n        }\n    }\n    if (promises.length > 0) {\n        const values = await Promise.all(promises);\n        for (let i = 0; i < values.length; ++i) {\n            logs[keys[i]] = values[i][0];\n        }\n        // Dispose the original scalar tensors.\n        dispose(scalarsToDispose);\n    }\n}\n/**\n * Dispose all Tensors in an UnresolvedLogs object.\n *\n * @param logs An `UnresolvedLogs` object potentially containing `tf.Tensor`s in\n *   places where the values can be `tf.Tensor` or `number`.\n */\nexport function disposeTensorsInLogs(logs) {\n    if (logs == null) {\n        return;\n    }\n    for (const key in logs) {\n        const value = logs[key];\n        if (typeof value !== 'number') {\n            value.dispose();\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sb2dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLE9BQU8sRUFBUyxNQUFNLHVCQUF1QixDQUFDO0FBV3REOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLG9CQUFvQixDQUFDLElBQW9CO0lBQzdELElBQUksSUFBSSxJQUFJLElBQUksRUFBRTtRQUNoQixPQUFPO0tBQ1I7SUFDRCxNQUFNLFFBQVEsR0FBdUQsRUFBRSxDQUFDO0lBQ3hFLE1BQU0sSUFBSSxHQUFhLEVBQUUsQ0FBQztJQUMxQixNQUFNLGdCQUFnQixHQUFhLEVBQUUsQ0FBQztJQUN0QyxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtRQUN0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDN0IsTUFBTSxXQUFXLEdBQUcsS0FBSyxDQUFDO1lBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNmLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUNwQztLQUNGO0lBQ0QsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM5QjtRQUNELHVDQUF1QztRQUN2QyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztLQUMzQjtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUFvQjtJQUN2RCxJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7UUFDaEIsT0FBTztLQUNSO0lBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUU7UUFDdEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksT0FBTyxLQUFLLEtBQUssUUFBUSxFQUFFO1lBQzdCLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNqQjtLQUNGO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZGlzcG9zZSwgU2NhbGFyfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG4vKipcbiAqIExvZ3MgaW4gd2hpY2ggdmFsdWVzIGNhbiBiZSBlaXRoZXIgbnVtYmVycyBvciBUZW5zb3JzIChTY2FsYXJzKS5cbiAqXG4gKiBVc2VkIGludGVybmFsbHkuXG4gKi9cbmV4cG9ydCB0eXBlIFVucmVzb2x2ZWRMb2dzID0ge1xuICBba2V5OiBzdHJpbmddOiBudW1iZXJ8U2NhbGFyO1xufTtcblxuLyoqXG4gKiBUdXJuIGFueSBTY2FsYXIgdmFsdWVzIGluIGEgTG9ncyBvYmplY3QgaW50byBhY3R1YWwgbnVtYmVyIHZhbHVlcy5cbiAqXG4gKiBAcGFyYW0gbG9ncyBUaGUgYExvZ3NgIG9iamVjdCB0byBiZSByZXNvbHZlZCBpbiBwbGFjZS5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3M6IFVucmVzb2x2ZWRMb2dzKSB7XG4gIGlmIChsb2dzID09IG51bGwpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgcHJvbWlzZXM6IEFycmF5PFByb21pc2U8RmxvYXQzMkFycmF5fEludDMyQXJyYXl8VWludDhBcnJheT4+ID0gW107XG4gIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gIGNvbnN0IHNjYWxhcnNUb0Rpc3Bvc2U6IFNjYWxhcltdID0gW107XG4gIGZvciAoY29uc3Qga2V5IGluIGxvZ3MpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxvZ3Nba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgY29uc3QgdmFsdWVTY2FsYXIgPSB2YWx1ZTtcbiAgICAgIHByb21pc2VzLnB1c2godmFsdWVTY2FsYXIuZGF0YSgpKTtcbiAgICAgIGtleXMucHVzaChrZXkpO1xuICAgICAgc2NhbGFyc1RvRGlzcG9zZS5wdXNoKHZhbHVlU2NhbGFyKTtcbiAgICB9XG4gIH1cbiAgaWYgKHByb21pc2VzLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBhd2FpdCBQcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxvZ3Nba2V5c1tpXV0gPSB2YWx1ZXNbaV1bMF07XG4gICAgfVxuICAgIC8vIERpc3Bvc2UgdGhlIG9yaWdpbmFsIHNjYWxhciB0ZW5zb3JzLlxuICAgIGRpc3Bvc2Uoc2NhbGFyc1RvRGlzcG9zZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBEaXNwb3NlIGFsbCBUZW5zb3JzIGluIGFuIFVucmVzb2x2ZWRMb2dzIG9iamVjdC5cbiAqXG4gKiBAcGFyYW0gbG9ncyBBbiBgVW5yZXNvbHZlZExvZ3NgIG9iamVjdCBwb3RlbnRpYWxseSBjb250YWluaW5nIGB0Zi5UZW5zb3JgcyBpblxuICogICBwbGFjZXMgd2hlcmUgdGhlIHZhbHVlcyBjYW4gYmUgYHRmLlRlbnNvcmAgb3IgYG51bWJlcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkaXNwb3NlVGVuc29yc0luTG9ncyhsb2dzOiBVbnJlc29sdmVkTG9ncykge1xuICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGZvciAoY29uc3Qga2V5IGluIGxvZ3MpIHtcbiAgICBjb25zdCB2YWx1ZSA9IGxvZ3Nba2V5XTtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnbnVtYmVyJykge1xuICAgICAgdmFsdWUuZGlzcG9zZSgpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIExvZ3MgaW4gd2hpY2ggdmFsdWVzIGNhbiBvbmx5IGJlIG51bWJlcnMuXG4gKlxuICogVXNlZCB3aGVuIGNhbGxpbmcgY2xpZW50LXByb3ZpZGVkIGN1c3RvbSBjYWxsYmFja3MuXG4gKi9cbmV4cG9ydCB0eXBlIExvZ3MgPSB7XG4gIFtrZXk6IHN0cmluZ106IG51bWJlcjtcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/callbacks.py */\nimport { add, div, keep, mul, nextFrame, tidy, util } from '@tensorflow/tfjs-core';\nimport { ValueError } from './errors';\nimport { resolveScalarsInLogs } from './logs';\nimport * as generic_utils from './utils/generic_utils';\n/** Verbosity logging level when fitting a model. */\nexport var ModelLoggingVerbosity;\n(function (ModelLoggingVerbosity) {\n    ModelLoggingVerbosity[ModelLoggingVerbosity[\"SILENT\"] = 0] = \"SILENT\";\n    ModelLoggingVerbosity[ModelLoggingVerbosity[\"VERBOSE\"] = 1] = \"VERBOSE\";\n})(ModelLoggingVerbosity || (ModelLoggingVerbosity = {}));\n/** How often to yield to the main thread when training (in ms). */\nexport const DEFAULT_YIELD_EVERY_MS = 125;\n/**\n * Abstract base class used to build new callbacks.\n *\n * The `logs` dictionary that callback methods take as argument will contain\n * keys for quantities relevant to the current batch or epoch.\n *\n * Currently, the `.fit()` method of the `Sequential` model class\n * will include the following quantities in the `logs` that\n * it passes to its callbacks:\n *\n * onEpochEnd: Logs include `acc` and `loss`, and optionally include `valLoss`\n *   (if validation is enabled in `fit`), and `valAcc` (if validation and\n *   accuracy monitoring are enabled).\n * onBatchBegin: Logs include `size`, the number of samples in the current\n *   batch.\n * onBatchEnd: Logs include `loss`, and optionally `acc` (if accuracy monitoring\n *   is enabled).\n */\nexport class BaseCallback {\n    constructor() {\n        // TODO(michaelterry): This type is a best guess.\n        this.validationData = null;\n    }\n    setParams(params) {\n        this.params = params;\n    }\n    async onEpochBegin(epoch, logs) { }\n    async onEpochEnd(epoch, logs) { }\n    async onBatchBegin(batch, logs) { }\n    async onBatchEnd(batch, logs) { }\n    async onTrainBegin(logs) { }\n    async onTrainEnd(logs) { }\n    // LayersModel needs to call Callback.setModel(), but cannot actually depend\n    // on Callback because that creates a cyclic dependency.  Providing this no-op\n    // method on BaseCallback breaks the cycle: this way LayersModel can depend on\n    // BaseCallback but not on Callback.  The argument is typed as `Container`\n    // (the superclass of LayersModel) to avoid recapitulating the cycle. Callback\n    // overrides this method and enforces that the argument is really a\n    // LayersModel.\n    setModel(model) {\n        // Do nothing. Use Callback instead of BaseCallback to track the model.\n    }\n}\n/**\n * Container abstracting a list of callbacks.\n */\nexport class CallbackList {\n    // TODO(cais): When the need arises, uncomment the following lines and\n    // implement the queue for time values.\n    // private deltaTBatch: number;\n    // private deltaTsBatchBegin: Array<number>;\n    // private deltaTsBatchEnd: Array<number>;\n    /**\n     * Constructor of CallbackList.\n     * @param callbacks Array of `Callback` instances.\n     * @param queueLength Queue length for keeping running statistics over\n     *   callback execution time.\n     */\n    constructor(callbacks, queueLength = 10) {\n        // TODO(cais): Make use of queueLength when implementing the queue for time\n        // values.\n        if (callbacks == null) {\n            callbacks = [];\n        }\n        this.callbacks = callbacks;\n        this.queueLength = queueLength;\n    }\n    append(callback) {\n        this.callbacks.push(callback);\n    }\n    setParams(params) {\n        for (const callback of this.callbacks) {\n            callback.setParams(params);\n        }\n    }\n    setModel(model) {\n        for (const callback of this.callbacks) {\n            callback.setModel(model);\n        }\n    }\n    /**\n     * Called at the start of an epoch.\n     * @param epoch Index of epoch.\n     * @param logs Dictionary of logs.\n     */\n    async onEpochBegin(epoch, logs) {\n        if (logs == null) {\n            logs = {};\n        }\n        for (const callback of this.callbacks) {\n            await callback.onEpochBegin(epoch, logs);\n        }\n    }\n    /**\n     * Called at the end of an epoch.\n     * @param epoch Index of epoch.\n     * @param logs Dictionary of logs.\n     */\n    async onEpochEnd(epoch, logs) {\n        if (logs == null) {\n            logs = {};\n        }\n        for (const callback of this.callbacks) {\n            await callback.onEpochEnd(epoch, logs);\n        }\n    }\n    /**\n     * Called  right before processing a batch.\n     * @param batch Index of batch within the current epoch.\n     * @param logs Dictionary of logs.\n     */\n    async onBatchBegin(batch, logs) {\n        if (logs == null) {\n            logs = {};\n        }\n        for (const callback of this.callbacks) {\n            await callback.onBatchBegin(batch, logs);\n        }\n    }\n    /**\n     * Called at the end of a batch.\n     * @param batch Index of batch within the current epoch.\n     * @param logs Dictionary of logs.\n     */\n    async onBatchEnd(batch, logs) {\n        if (logs == null) {\n            logs = {};\n        }\n        for (const callback of this.callbacks) {\n            await callback.onBatchEnd(batch, logs);\n        }\n    }\n    /**\n     * Called at the beginning of training.\n     * @param logs Dictionary of logs.\n     */\n    async onTrainBegin(logs) {\n        if (logs == null) {\n            logs = {};\n        }\n        for (const callback of this.callbacks) {\n            await callback.onTrainBegin(logs);\n        }\n    }\n    /**\n     * Called at the end of training.\n     * @param logs Dictionary of logs.\n     */\n    async onTrainEnd(logs) {\n        if (logs == null) {\n            logs = {};\n        }\n        for (const callback of this.callbacks) {\n            await callback.onTrainEnd(logs);\n        }\n    }\n}\n/**\n * Callback that accumulates epoch averages of metrics.\n *\n * This callback is automatically applied to every LayersModel.\n */\nexport class BaseLogger extends BaseCallback {\n    constructor() {\n        super();\n    }\n    async onEpochBegin(epoch) {\n        this.seen = 0;\n        this.totals = {};\n    }\n    async onBatchEnd(batch, logs) {\n        if (logs == null) {\n            logs = {};\n        }\n        const batchSize = logs['size'] == null ? 0 : logs['size'];\n        this.seen += batchSize;\n        for (const key in logs) {\n            const value = logs[key];\n            if (typeof value === 'number') {\n                if (!this.totals.hasOwnProperty(key)) {\n                    this.totals[key] = 0;\n                }\n                this.totals[key] = this.totals[key] + value * batchSize;\n            }\n            else {\n                let oldTotalsToDispose;\n                if (key in this.totals) {\n                    oldTotalsToDispose = this.totals[key];\n                }\n                else {\n                    this.totals[key] = 0;\n                }\n                const total = tidy(() => add((this.totals[key]), mul(value, batchSize)));\n                this.totals[key] = total;\n                if (oldTotalsToDispose != null) {\n                    oldTotalsToDispose.dispose();\n                }\n            }\n        }\n    }\n    async onEpochEnd(epoch, logs) {\n        if (logs != null) {\n            for (const key of this.params['metrics']) {\n                if (this.totals[key] == null) {\n                    continue;\n                }\n                if (typeof this.totals[key] === 'number') {\n                    logs[key] = this.totals[key] / this.seen;\n                }\n                else {\n                    tidy(() => {\n                        const log = mul(div(1, this.seen), this.totals[key]);\n                        logs[key] = log;\n                        this.totals[key].dispose();\n                        keep(logs[key]);\n                    });\n                }\n            }\n        }\n    }\n}\n/**\n * Callback that records events into a `History` object. This callback is\n * automatically applied to every TF.js Layers model. The `History` object\n * gets returned by the `fit` method of models.\n */\nexport class History extends BaseCallback {\n    async onTrainBegin(logs) {\n        this.epoch = [];\n        this.history = {};\n    }\n    async onEpochEnd(epoch, logs) {\n        if (logs == null) {\n            logs = {};\n        }\n        this.epoch.push(epoch);\n        for (const key in logs) {\n            if (this.history[key] == null) {\n                this.history[key] = [];\n            }\n            this.history[key].push(logs[key]);\n        }\n    }\n    /**\n     * Await the values of all losses and metrics.\n     */\n    async syncData() {\n        const promises = [];\n        const keys = [];\n        const indices = [];\n        for (const key in this.history) {\n            const valueArray = this.history[key];\n            for (let i = 0; i < valueArray.length; ++i) {\n                if (typeof valueArray[i] !== 'number') {\n                    const valueScalar = valueArray[i];\n                    promises.push(valueScalar.data());\n                    keys.push(key);\n                    indices.push(i);\n                }\n            }\n        }\n        const values = await Promise.all(promises);\n        for (let n = 0; n < values.length; ++n) {\n            const tensorToDispose = this.history[keys[n]][indices[n]];\n            tensorToDispose.dispose();\n            this.history[keys[n]][indices[n]] = values[n][0];\n        }\n    }\n}\n/**\n * Custom callback for training.\n */\nexport class CustomCallback extends BaseCallback {\n    constructor(args, yieldEvery) {\n        super();\n        this.currentEpoch = 0;\n        this.nowFunc = args.nowFunc;\n        this.nextFrameFunc = args.nextFrameFunc || nextFrame;\n        this.yieldEvery = yieldEvery || 'auto';\n        if (this.yieldEvery === 'auto') {\n            this.yieldEvery = DEFAULT_YIELD_EVERY_MS;\n        }\n        if (this.yieldEvery === 'never' && args.onYield != null) {\n            throw new Error('yieldEvery is `never` but you provided an `onYield` callback. ' +\n                'Either change `yieldEvery` or remove the callback');\n        }\n        if (util.isNumber(this.yieldEvery)) {\n            // Decorate `maybeWait` so it will be called at most once every\n            // `yieldEvery` ms.\n            this.maybeWait = generic_utils.debounce(this.maybeWait.bind(this), this.yieldEvery, this.nowFunc);\n        }\n        this.trainBegin = args.onTrainBegin;\n        this.trainEnd = args.onTrainEnd;\n        this.epochBegin = args.onEpochBegin;\n        this.epochEnd = args.onEpochEnd;\n        this.batchBegin = args.onBatchBegin;\n        this.batchEnd = args.onBatchEnd;\n        this.yield = args.onYield;\n    }\n    async maybeWait(epoch, batch, logs) {\n        const ps = [];\n        if (this.yield != null) {\n            await resolveScalarsInLogs(logs);\n            ps.push(this.yield(epoch, batch, logs));\n        }\n        ps.push(this.nextFrameFunc());\n        await Promise.all(ps);\n    }\n    async onEpochBegin(epoch, logs) {\n        this.currentEpoch = epoch;\n        if (this.epochBegin != null) {\n            await resolveScalarsInLogs(logs);\n            await this.epochBegin(epoch, logs);\n        }\n    }\n    async onEpochEnd(epoch, logs) {\n        const ps = [];\n        if (this.epochEnd != null) {\n            await resolveScalarsInLogs(logs);\n            ps.push(this.epochEnd(epoch, logs));\n        }\n        if (this.yieldEvery === 'epoch') {\n            ps.push(this.nextFrameFunc());\n        }\n        await Promise.all(ps);\n    }\n    async onBatchBegin(batch, logs) {\n        if (this.batchBegin != null) {\n            await resolveScalarsInLogs(logs);\n            await this.batchBegin(batch, logs);\n        }\n    }\n    async onBatchEnd(batch, logs) {\n        const ps = [];\n        if (this.batchEnd != null) {\n            await resolveScalarsInLogs(logs);\n            ps.push(this.batchEnd(batch, logs));\n        }\n        if (this.yieldEvery === 'batch') {\n            ps.push(this.nextFrameFunc());\n        }\n        else if (util.isNumber(this.yieldEvery)) {\n            ps.push(this.maybeWait(this.currentEpoch, batch, logs));\n        }\n        await Promise.all(ps);\n    }\n    async onTrainBegin(logs) {\n        if (this.trainBegin != null) {\n            await resolveScalarsInLogs(logs);\n            await this.trainBegin(logs);\n        }\n    }\n    async onTrainEnd(logs) {\n        if (this.trainEnd != null) {\n            await resolveScalarsInLogs(logs);\n            await this.trainEnd(logs);\n        }\n    }\n}\n/**\n * Standardize callbacks or configurations of them to an Array of callbacks.\n */\nexport function standardizeCallbacks(callbacks, yieldEvery) {\n    if (callbacks == null) {\n        callbacks = {};\n    }\n    if (callbacks instanceof BaseCallback) {\n        return [callbacks];\n    }\n    if (Array.isArray(callbacks) && callbacks[0] instanceof BaseCallback) {\n        return callbacks;\n    }\n    // Convert custom callback configs to custom callback objects.\n    const callbackConfigs = generic_utils.toList(callbacks);\n    return callbackConfigs.map(callbackConfig => new CustomCallback(callbackConfig, yieldEvery));\n}\n/**\n * A global registry for callback constructors to be used during\n * LayersModel.fit().\n */\nexport class CallbackConstructorRegistry {\n    /**\n     * Blocks public access to constructor.\n     */\n    constructor() { }\n    /**\n     * Register a tf.LayersModel.fit() callback constructor.\n     *\n     * The registered callback constructor will be used to instantiate\n     * callbacks for every tf.LayersModel.fit() call afterwards.\n     *\n     * @param verbosityLevel Level of verbosity at which the `callbackConstructor`\n     *   is to be reigstered.\n     * @param callbackConstructor A no-arg constructor for `tf.Callback`.\n     * @throws Error, if the same callbackConstructor has been registered before,\n     *   either at the same or a different `verbosityLevel`.\n     */\n    static registerCallbackConstructor(verbosityLevel, callbackConstructor) {\n        util.assert(verbosityLevel >= 0 && Number.isInteger(verbosityLevel), () => `Verbosity level is expected to be an integer >= 0, ` +\n            `but got ${verbosityLevel}`);\n        CallbackConstructorRegistry.checkForDuplicate(callbackConstructor);\n        if (CallbackConstructorRegistry.constructors[verbosityLevel] == null) {\n            CallbackConstructorRegistry.constructors[verbosityLevel] = [];\n        }\n        CallbackConstructorRegistry.constructors[verbosityLevel].push(callbackConstructor);\n    }\n    static checkForDuplicate(callbackConstructor) {\n        for (const levelName in CallbackConstructorRegistry.constructors) {\n            const constructors = CallbackConstructorRegistry.constructors[+levelName];\n            constructors.forEach(ctor => {\n                if (ctor === callbackConstructor) {\n                    throw new ValueError('Duplicate callback constructor.');\n                }\n            });\n        }\n    }\n    /**\n     * Clear all registered callback constructors.\n     */\n    static clear() {\n        CallbackConstructorRegistry.constructors = {};\n    }\n    /**\n     * Create callbacks using the registered callback constructors.\n     *\n     * Given `verbosityLevel`, all constructors registered at that level or above\n     * will be called and the instantiated callbacks will be used.\n     *\n     * @param verbosityLevel: Level of verbosity.\n     */\n    static createCallbacks(verbosityLevel) {\n        const constructors = [];\n        for (const levelName in CallbackConstructorRegistry.constructors) {\n            const level = +levelName;\n            if (verbosityLevel >= level) {\n                constructors.push(...CallbackConstructorRegistry.constructors[level]);\n            }\n        }\n        return constructors.map(ctor => new ctor());\n    }\n}\nCallbackConstructorRegistry.constructors = {};\nexport function configureCallbacks(callbacks, verbose, epochs, initialEpoch, numTrainSamples, stepsPerEpoch, batchSize, doValidation, callbackMetrics) {\n    const history = new History();\n    const actualCallbacks = [\n        new BaseLogger(), ...CallbackConstructorRegistry.createCallbacks(verbose)\n    ];\n    if (callbacks != null) {\n        actualCallbacks.push(...callbacks);\n    }\n    actualCallbacks.push(history);\n    const callbackList = new CallbackList(actualCallbacks);\n    // TODO(cais): Figure out when this LayersModel instance can have a\n    // dynamically\n    //   set property called 'callback_model' as in PyKeras.\n    callbackList.setParams({\n        epochs,\n        initialEpoch,\n        samples: numTrainSamples,\n        steps: stepsPerEpoch,\n        batchSize,\n        verbose,\n        doValidation,\n        metrics: callbackMetrics,\n    });\n    return { callbackList, history };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZV9jYWxsYmFja3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvYmFzZV9jYWxsYmFja3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCx5Q0FBeUM7QUFFekMsT0FBTyxFQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQWtCLElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdqRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ3BDLE9BQU8sRUFBTyxvQkFBb0IsRUFBaUIsTUFBTSxRQUFRLENBQUM7QUFDbEUsT0FBTyxLQUFLLGFBQWEsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxvREFBb0Q7QUFDcEQsTUFBTSxDQUFOLElBQVkscUJBR1g7QUFIRCxXQUFZLHFCQUFxQjtJQUMvQixxRUFBVSxDQUFBO0lBQ1YsdUVBQVcsQ0FBQTtBQUNiLENBQUMsRUFIVyxxQkFBcUIsS0FBckIscUJBQXFCLFFBR2hDO0FBRUQsbUVBQW1FO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQztBQVExQzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLE9BQWdCLFlBQVk7SUFBbEM7UUFDRSxpREFBaUQ7UUFDakQsbUJBQWMsR0FBb0IsSUFBSSxDQUFDO0lBZ0N6QyxDQUFDO0lBMUJDLFNBQVMsQ0FBQyxNQUFjO1FBQ3RCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxLQUFLLENBQUMsWUFBWSxDQUFDLEtBQWEsRUFBRSxJQUFxQixJQUFHLENBQUM7SUFFM0QsS0FBSyxDQUFDLFVBQVUsQ0FBQyxLQUFhLEVBQUUsSUFBcUIsSUFBRyxDQUFDO0lBRXpELEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBYSxFQUFFLElB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RSxZQUFxQixFQUN4QyxlQUF5QjtJQUMzQixNQUFNLE9BQU8sR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBQzlCLE1BQU0sZUFBZSxHQUFtQjtRQUN0QyxJQUFJLFVBQVUsRUFBRSxFQUFFLEdBQUcsMkJBQTJCLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQztLQUMxRSxDQUFDO0lBQ0YsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1FBQ3JCLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztLQUNwQztJQUNELGVBQWUsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDOUIsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFdkQsbUVBQW1FO0lBQ25FLGNBQWM7SUFDZCx3REFBd0Q7SUFFeEQsWUFBWSxDQUFDLFNBQVMsQ0FBQztRQUNyQixNQUFNO1FBQ04sWUFBWTtRQUNaLE9BQU8sRUFBRSxlQUFlO1FBQ3hCLEtBQUssRUFBRSxhQUFhO1FBQ3BCLFNBQVM7UUFDVCxPQUFPO1FBQ1AsWUFBWTtRQUNaLE9BQU8sRUFBRSxlQUFlO0tBQ3pCLENBQUMsQ0FBQztJQUNILE9BQU8sRUFBQyxZQUFZLEVBQUUsT0FBTyxFQUFDLENBQUM7QUFDakMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZToga2VyYXMvY2FsbGJhY2tzLnB5ICovXG5cbmltcG9ydCB7YWRkLCBkaXYsIGtlZXAsIG11bCwgbmV4dEZyYW1lLCBTY2FsYXIsIFRlbnNvciwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDb250YWluZXJ9IGZyb20gJy4vZW5naW5lL2NvbnRhaW5lcic7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TG9ncywgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MsIFVucmVzb2x2ZWRMb2dzfSBmcm9tICcuL2xvZ3MnO1xuaW1wb3J0ICogYXMgZ2VuZXJpY191dGlscyBmcm9tICcuL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG4vKiogVmVyYm9zaXR5IGxvZ2dpbmcgbGV2ZWwgd2hlbiBmaXR0aW5nIGEgbW9kZWwuICovXG5leHBvcnQgZW51bSBNb2RlbExvZ2dpbmdWZXJib3NpdHkge1xuICBTSUxFTlQgPSAwLFxuICBWRVJCT1NFID0gMVxufVxuXG4vKiogSG93IG9mdGVuIHRvIHlpZWxkIHRvIHRoZSBtYWluIHRocmVhZCB3aGVuIHRyYWluaW5nIChpbiBtcykuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9ZSUVMRF9FVkVSWV9NUyA9IDEyNTtcblxuZXhwb3J0IHR5cGUgUGFyYW1zID0ge1xuICBba2V5OiBzdHJpbmddOiBudW1iZXJ8c3RyaW5nfGJvb2xlYW58bnVtYmVyW118c3RyaW5nW118Ym9vbGVhbltdO1xufTtcblxuZXhwb3J0IHR5cGUgWWllbGRFdmVyeU9wdGlvbnMgPSAnYXV0byd8J2JhdGNoJ3wnZXBvY2gnfCduZXZlcid8bnVtYmVyO1xuXG4vKipcbiAqIEFic3RyYWN0IGJhc2UgY2xhc3MgdXNlZCB0byBidWlsZCBuZXcgY2FsbGJhY2tzLlxuICpcbiAqIFRoZSBgbG9nc2AgZGljdGlvbmFyeSB0aGF0IGNhbGxiYWNrIG1ldGhvZHMgdGFrZSBhcyBhcmd1bWVudCB3aWxsIGNvbnRhaW5cbiAqIGtleXMgZm9yIHF1YW50aXRpZXMgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgYmF0Y2ggb3IgZXBvY2guXG4gKlxuICogQ3VycmVudGx5LCB0aGUgYC5maXQoKWAgbWV0aG9kIG9mIHRoZSBgU2VxdWVudGlhbGAgbW9kZWwgY2xhc3NcbiAqIHdpbGwgaW5jbHVkZSB0aGUgZm9sbG93aW5nIHF1YW50aXRpZXMgaW4gdGhlIGBsb2dzYCB0aGF0XG4gKiBpdCBwYXNzZXMgdG8gaXRzIGNhbGxiYWNrczpcbiAqXG4gKiBvbkVwb2NoRW5kOiBMb2dzIGluY2x1ZGUgYGFjY2AgYW5kIGBsb3NzYCwgYW5kIG9wdGlvbmFsbHkgaW5jbHVkZSBgdmFsTG9zc2BcbiAqICAgKGlmIHZhbGlkYXRpb24gaXMgZW5hYmxlZCBpbiBgZml0YCksIGFuZCBgdmFsQWNjYCAoaWYgdmFsaWRhdGlvbiBhbmRcbiAqICAgYWNjdXJhY3kgbW9uaXRvcmluZyBhcmUgZW5hYmxlZCkuXG4gKiBvbkJhdGNoQmVnaW46IExvZ3MgaW5jbHVkZSBgc2l6ZWAsIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgY3VycmVudFxuICogICBiYXRjaC5cbiAqIG9uQmF0Y2hFbmQ6IExvZ3MgaW5jbHVkZSBgbG9zc2AsIGFuZCBvcHRpb25hbGx5IGBhY2NgIChpZiBhY2N1cmFjeSBtb25pdG9yaW5nXG4gKiAgIGlzIGVuYWJsZWQpLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZUNhbGxiYWNrIHtcbiAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBUaGlzIHR5cGUgaXMgYSBiZXN0IGd1ZXNzLlxuICB2YWxpZGF0aW9uRGF0YTogVGVuc29yfFRlbnNvcltdID0gbnVsbDtcbiAgLyoqXG4gICAqIFRyYWluaW5nIHBhcmFtZXRlcnMgKGVnLiB2ZXJib3NpdHksIGJhdGNoIHNpemUsIG51bWJlciBvZiBlcG9jaHMuLi4pLlxuICAgKi9cbiAgcGFyYW1zOiBQYXJhbXM7XG5cbiAgc2V0UGFyYW1zKHBhcmFtczogUGFyYW1zKTogdm9pZCB7XG4gICAgdGhpcy5wYXJhbXMgPSBwYXJhbXM7XG4gIH1cblxuICBhc3luYyBvbkVwb2NoQmVnaW4oZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7fVxuXG4gIGFzeW5jIG9uRXBvY2hFbmQoZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7fVxuXG4gIGFzeW5jIG9uQmF0Y2hCZWdpbihiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHt9XG5cbiAgYXN5bmMgb25CYXRjaEVuZChiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHt9XG5cbiAgYXN5bmMgb25UcmFpbkJlZ2luKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge31cblxuICBhc3luYyBvblRyYWluRW5kKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge31cblxuICAvLyBMYXllcnNNb2RlbCBuZWVkcyB0byBjYWxsIENhbGxiYWNrLnNldE1vZGVsKCksIGJ1dCBjYW5ub3QgYWN0dWFsbHkgZGVwZW5kXG4gIC8vIG9uIENhbGxiYWNrIGJlY2F1c2UgdGhhdCBjcmVhdGVzIGEgY3ljbGljIGRlcGVuZGVuY3kuICBQcm92aWRpbmcgdGhpcyBuby1vcFxuICAvLyBtZXRob2Qgb24gQmFzZUNhbGxiYWNrIGJyZWFrcyB0aGUgY3ljbGU6IHRoaXMgd2F5IExheWVyc01vZGVsIGNhbiBkZXBlbmQgb25cbiAgLy8gQmFzZUNhbGxiYWNrIGJ1dCBub3Qgb24gQ2FsbGJhY2suICBUaGUgYXJndW1lbnQgaXMgdHlwZWQgYXMgYENvbnRhaW5lcmBcbiAgLy8gKHRoZSBzdXBlcmNsYXNzIG9mIExheWVyc01vZGVsKSB0byBhdm9pZCByZWNhcGl0dWxhdGluZyB0aGUgY3ljbGUuIENhbGxiYWNrXG4gIC8vIG92ZXJyaWRlcyB0aGlzIG1ldGhvZCBhbmQgZW5mb3JjZXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgcmVhbGx5IGFcbiAgLy8gTGF5ZXJzTW9kZWwuXG4gIHNldE1vZGVsKG1vZGVsOiBDb250YWluZXIpOiB2b2lkIHtcbiAgICAvLyBEbyBub3RoaW5nLiBVc2UgQ2FsbGJhY2sgaW5zdGVhZCBvZiBCYXNlQ2FsbGJhY2sgdG8gdHJhY2sgdGhlIG1vZGVsLlxuICB9XG59XG5cbi8qKlxuICogQ29udGFpbmVyIGFic3RyYWN0aW5nIGEgbGlzdCBvZiBjYWxsYmFja3MuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWxsYmFja0xpc3Qge1xuICBjYWxsYmFja3M6IEJhc2VDYWxsYmFja1tdO1xuICBxdWV1ZUxlbmd0aDogbnVtYmVyO1xuXG4gIC8vIFRPRE8oY2Fpcyk6IFdoZW4gdGhlIG5lZWQgYXJpc2VzLCB1bmNvbW1lbnQgdGhlIGZvbGxvd2luZyBsaW5lcyBhbmRcbiAgLy8gaW1wbGVtZW50IHRoZSBxdWV1ZSBmb3IgdGltZSB2YWx1ZXMuXG4gIC8vIHByaXZhdGUgZGVsdGFUQmF0Y2g6IG51bWJlcjtcbiAgLy8gcHJpdmF0ZSBkZWx0YVRzQmF0Y2hCZWdpbjogQXJyYXk8bnVtYmVyPjtcbiAgLy8gcHJpdmF0ZSBkZWx0YVRzQmF0Y2hFbmQ6IEFycmF5PG51bWJlcj47XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG9mIENhbGxiYWNrTGlzdC5cbiAgICogQHBhcmFtIGNhbGxiYWNrcyBBcnJheSBvZiBgQ2FsbGJhY2tgIGluc3RhbmNlcy5cbiAgICogQHBhcmFtIHF1ZXVlTGVuZ3RoIFF1ZXVlIGxlbmd0aCBmb3Iga2VlcGluZyBydW5uaW5nIHN0YXRpc3RpY3Mgb3ZlclxuICAgKiAgIGNhbGxiYWNrIGV4ZWN1dGlvbiB0aW1lLlxuICAgKi9cbiAgY29uc3RydWN0b3IoY2FsbGJhY2tzPzogQmFzZUNhbGxiYWNrW10sIHF1ZXVlTGVuZ3RoID0gMTApIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBNYWtlIHVzZSBvZiBxdWV1ZUxlbmd0aCB3aGVuIGltcGxlbWVudGluZyB0aGUgcXVldWUgZm9yIHRpbWVcbiAgICAvLyB2YWx1ZXMuXG4gICAgaWYgKGNhbGxiYWNrcyA9PSBudWxsKSB7XG4gICAgICBjYWxsYmFja3MgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5jYWxsYmFja3MgPSBjYWxsYmFja3M7XG4gICAgdGhpcy5xdWV1ZUxlbmd0aCA9IHF1ZXVlTGVuZ3RoO1xuICB9XG5cbiAgYXBwZW5kKGNhbGxiYWNrOiBCYXNlQ2FsbGJhY2spOiB2b2lkIHtcbiAgICB0aGlzLmNhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTtcbiAgfVxuXG4gIHNldFBhcmFtcyhwYXJhbXM6IFBhcmFtcyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGNhbGxiYWNrLnNldFBhcmFtcyhwYXJhbXMpO1xuICAgIH1cbiAgfVxuXG4gIHNldE1vZGVsKG1vZGVsOiBDb250YWluZXIpOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBjYWxsYmFjay5zZXRNb2RlbChtb2RlbCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhdCB0aGUgc3RhcnQgb2YgYW4gZXBvY2guXG4gICAqIEBwYXJhbSBlcG9jaCBJbmRleCBvZiBlcG9jaC5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25FcG9jaEJlZ2luKGVwb2NoOiBudW1iZXIsIGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIGlmIChsb2dzID09IG51bGwpIHtcbiAgICAgIGxvZ3MgPSB7fTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjYWxsYmFjayBvZiB0aGlzLmNhbGxiYWNrcykge1xuICAgICAgYXdhaXQgY2FsbGJhY2sub25FcG9jaEJlZ2luKGVwb2NoLCBsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgYW4gZXBvY2guXG4gICAqIEBwYXJhbSBlcG9jaCBJbmRleCBvZiBlcG9jaC5cbiAgICogQHBhcmFtIGxvZ3MgRGljdGlvbmFyeSBvZiBsb2dzLlxuICAgKi9cbiAgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uRXBvY2hFbmQoZXBvY2gsIGxvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDYWxsZWQgIHJpZ2h0IGJlZm9yZSBwcm9jZXNzaW5nIGEgYmF0Y2guXG4gICAqIEBwYXJhbSBiYXRjaCBJbmRleCBvZiBiYXRjaCB3aXRoaW4gdGhlIGN1cnJlbnQgZXBvY2guXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uQmF0Y2hCZWdpbihiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uQmF0Y2hCZWdpbihiYXRjaCwgbG9ncyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENhbGxlZCBhdCB0aGUgZW5kIG9mIGEgYmF0Y2guXG4gICAqIEBwYXJhbSBiYXRjaCBJbmRleCBvZiBiYXRjaCB3aXRoaW4gdGhlIGN1cnJlbnQgZXBvY2guXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjay5vbkJhdGNoRW5kKGJhdGNoLCBsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdHJhaW5pbmcuXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uVHJhaW5CZWdpbihsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyA9PSBudWxsKSB7XG4gICAgICBsb2dzID0ge307XG4gICAgfVxuICAgIGZvciAoY29uc3QgY2FsbGJhY2sgb2YgdGhpcy5jYWxsYmFja3MpIHtcbiAgICAgIGF3YWl0IGNhbGxiYWNrLm9uVHJhaW5CZWdpbihsb2dzKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ2FsbGVkIGF0IHRoZSBlbmQgb2YgdHJhaW5pbmcuXG4gICAqIEBwYXJhbSBsb2dzIERpY3Rpb25hcnkgb2YgbG9ncy5cbiAgICovXG4gIGFzeW5jIG9uVHJhaW5FbmQobG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIHRoaXMuY2FsbGJhY2tzKSB7XG4gICAgICBhd2FpdCBjYWxsYmFjay5vblRyYWluRW5kKGxvZ3MpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIENhbGxiYWNrIHRoYXQgYWNjdW11bGF0ZXMgZXBvY2ggYXZlcmFnZXMgb2YgbWV0cmljcy5cbiAqXG4gKiBUaGlzIGNhbGxiYWNrIGlzIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBldmVyeSBMYXllcnNNb2RlbC5cbiAqL1xuZXhwb3J0IGNsYXNzIEJhc2VMb2dnZXIgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBwcml2YXRlIHNlZW46IG51bWJlcjtcbiAgcHJpdmF0ZSB0b3RhbHM6IFVucmVzb2x2ZWRMb2dzO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBhc3luYyBvbkVwb2NoQmVnaW4oZXBvY2g6IG51bWJlcikge1xuICAgIHRoaXMuc2VlbiA9IDA7XG4gICAgdGhpcy50b3RhbHMgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICBjb25zdCBiYXRjaFNpemUgPSBsb2dzWydzaXplJ10gPT0gbnVsbCA/IDAgOiBsb2dzWydzaXplJ10gYXMgbnVtYmVyO1xuICAgIHRoaXMuc2VlbiArPSBiYXRjaFNpemU7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gbG9ncykge1xuICAgICAgY29uc3QgdmFsdWUgPSBsb2dzW2tleV07XG4gICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgICAgICBpZiAoIXRoaXMudG90YWxzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICB0aGlzLnRvdGFsc1trZXldID0gMDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvdGFsc1trZXldID0gdGhpcy50b3RhbHNba2V5XSBhcyBudW1iZXIgKyB2YWx1ZSAqIGJhdGNoU2l6ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCBvbGRUb3RhbHNUb0Rpc3Bvc2U6IFNjYWxhcjtcbiAgICAgICAgaWYgKGtleSBpbiB0aGlzLnRvdGFscykge1xuICAgICAgICAgIG9sZFRvdGFsc1RvRGlzcG9zZSA9IHRoaXMudG90YWxzW2tleV0gYXMgU2NhbGFyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMudG90YWxzW2tleV0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHRvdGFsOiBTY2FsYXIgPVxuICAgICAgICAgICAgdGlkeSgoKSA9PiBhZGQoKHRoaXMudG90YWxzW2tleV0pLCBtdWwodmFsdWUsIGJhdGNoU2l6ZSkpKTtcbiAgICAgICAgdGhpcy50b3RhbHNba2V5XSA9IHRvdGFsO1xuICAgICAgICBpZiAob2xkVG90YWxzVG9EaXNwb3NlICE9IG51bGwpIHtcbiAgICAgICAgICBvbGRUb3RhbHNUb0Rpc3Bvc2UuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBpZiAobG9ncyAhPSBudWxsKSB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiB0aGlzLnBhcmFtc1snbWV0cmljcyddIGFzIHN0cmluZ1tdKSB7XG4gICAgICAgIGlmICh0aGlzLnRvdGFsc1trZXldID09IG51bGwpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudG90YWxzW2tleV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgbG9nc1trZXldID0gdGhpcy50b3RhbHNba2V5XSBhcyBudW1iZXIgLyB0aGlzLnNlZW47XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsb2c6IFNjYWxhciA9IG11bChkaXYoMSwgdGhpcy5zZWVuKSwgdGhpcy50b3RhbHNba2V5XSk7XG4gICAgICAgICAgICBsb2dzW2tleV0gPSBsb2c7XG4gICAgICAgICAgICAodGhpcy50b3RhbHNba2V5XSBhcyBUZW5zb3IpLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIGtlZXAobG9nc1trZXldIGFzIFNjYWxhcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDYWxsYmFjayB0aGF0IHJlY29yZHMgZXZlbnRzIGludG8gYSBgSGlzdG9yeWAgb2JqZWN0LiBUaGlzIGNhbGxiYWNrIGlzXG4gKiBhdXRvbWF0aWNhbGx5IGFwcGxpZWQgdG8gZXZlcnkgVEYuanMgTGF5ZXJzIG1vZGVsLiBUaGUgYEhpc3RvcnlgIG9iamVjdFxuICogZ2V0cyByZXR1cm5lZCBieSB0aGUgYGZpdGAgbWV0aG9kIG9mIG1vZGVscy5cbiAqL1xuZXhwb3J0IGNsYXNzIEhpc3RvcnkgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBlcG9jaDogbnVtYmVyW107XG4gIGhpc3Rvcnk6IHtba2V5OiBzdHJpbmddOiBBcnJheTxudW1iZXJ8VGVuc29yPn07XG5cbiAgYXN5bmMgb25UcmFpbkJlZ2luKGxvZ3M/OiBVbnJlc29sdmVkTG9ncykge1xuICAgIHRoaXMuZXBvY2ggPSBbXTtcbiAgICB0aGlzLmhpc3RvcnkgPSB7fTtcbiAgfVxuXG4gIGFzeW5jIG9uRXBvY2hFbmQoZXBvY2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKSB7XG4gICAgaWYgKGxvZ3MgPT0gbnVsbCkge1xuICAgICAgbG9ncyA9IHt9O1xuICAgIH1cbiAgICB0aGlzLmVwb2NoLnB1c2goZXBvY2gpO1xuICAgIGZvciAoY29uc3Qga2V5IGluIGxvZ3MpIHtcbiAgICAgIGlmICh0aGlzLmhpc3Rvcnlba2V5XSA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuaGlzdG9yeVtrZXldID0gW107XG4gICAgICB9XG4gICAgICB0aGlzLmhpc3Rvcnlba2V5XS5wdXNoKGxvZ3Nba2V5XSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEF3YWl0IHRoZSB2YWx1ZXMgb2YgYWxsIGxvc3NlcyBhbmQgbWV0cmljcy5cbiAgICovXG4gIGFzeW5jIHN5bmNEYXRhKCkge1xuICAgIGNvbnN0IHByb21pc2VzOiBBcnJheTxQcm9taXNlPEZsb2F0MzJBcnJheXxJbnQzMkFycmF5fFVpbnQ4QXJyYXk+PiA9IFtdO1xuICAgIGNvbnN0IGtleXM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgaW5kaWNlczogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLmhpc3RvcnkpIHtcbiAgICAgIGNvbnN0IHZhbHVlQXJyYXkgPSB0aGlzLmhpc3Rvcnlba2V5XTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVBcnJheS5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlQXJyYXlbaV0gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgY29uc3QgdmFsdWVTY2FsYXIgPSB2YWx1ZUFycmF5W2ldIGFzIFRlbnNvcjtcbiAgICAgICAgICBwcm9taXNlcy5wdXNoKHZhbHVlU2NhbGFyLmRhdGEoKSk7XG4gICAgICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgICAgICAgaW5kaWNlcy5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlcyA9IGF3YWl0IFByb21pc2UuYWxsKHByb21pc2VzKTtcbiAgICBmb3IgKGxldCBuID0gMDsgbiA8IHZhbHVlcy5sZW5ndGg7ICsrbikge1xuICAgICAgY29uc3QgdGVuc29yVG9EaXNwb3NlID0gdGhpcy5oaXN0b3J5W2tleXNbbl1dW2luZGljZXNbbl1dIGFzIFRlbnNvcjtcbiAgICAgIHRlbnNvclRvRGlzcG9zZS5kaXNwb3NlKCk7XG4gICAgICB0aGlzLmhpc3Rvcnlba2V5c1tuXV1baW5kaWNlc1tuXV0gPSB2YWx1ZXNbbl1bMF07XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3VzdG9tQ2FsbGJhY2tBcmdzIHtcbiAgb25UcmFpbkJlZ2luPzogKGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgb25UcmFpbkVuZD86IChsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uRXBvY2hCZWdpbj86IChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIG9uRXBvY2hFbmQ/OiAoZXBvY2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvbkJhdGNoQmVnaW4/OiAoYmF0Y2g6IG51bWJlciwgbG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBvbkJhdGNoRW5kPzogKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgb25ZaWVsZD86IChlcG9jaDogbnVtYmVyLCBiYXRjaDogbnVtYmVyLCBsb2dzOiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgLy8gVXNlZCBmb3IgdGVzdCBESSBtb2NraW5nLlxuICBub3dGdW5jPzogRnVuY3Rpb247XG4gIG5leHRGcmFtZUZ1bmM/OiBGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBDdXN0b20gY2FsbGJhY2sgZm9yIHRyYWluaW5nLlxuICovXG5leHBvcnQgY2xhc3MgQ3VzdG9tQ2FsbGJhY2sgZXh0ZW5kcyBCYXNlQ2FsbGJhY2sge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdHJhaW5CZWdpbjogKGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRyYWluRW5kOiAobG9ncz86IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXBvY2hCZWdpbjpcbiAgICAgIChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCByZWFkb25seSBlcG9jaEVuZDpcbiAgICAgIChlcG9jaDogbnVtYmVyLCBsb2dzPzogTG9ncykgPT4gdm9pZCB8IFByb21pc2U8dm9pZD47XG4gIHByb3RlY3RlZCByZWFkb25seSBiYXRjaEJlZ2luOlxuICAgICAgKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJhdGNoRW5kOlxuICAgICAgKGJhdGNoOiBudW1iZXIsIGxvZ3M/OiBMb2dzKSA9PiB2b2lkIHwgUHJvbWlzZTx2b2lkPjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHlpZWxkOlxuICAgICAgKGVwb2NoOiBudW1iZXIsIGJhdGNoOiBudW1iZXIsIGxvZ3M6IExvZ3MpID0+IHZvaWQgfCBQcm9taXNlPHZvaWQ+O1xuXG4gIHByaXZhdGUgeWllbGRFdmVyeTogWWllbGRFdmVyeU9wdGlvbnM7XG4gIHByaXZhdGUgY3VycmVudEVwb2NoID0gMDtcbiAgcHVibGljIG5vd0Z1bmM6IEZ1bmN0aW9uO1xuICBwdWJsaWMgbmV4dEZyYW1lRnVuYzogRnVuY3Rpb247XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ3VzdG9tQ2FsbGJhY2tBcmdzLCB5aWVsZEV2ZXJ5PzogWWllbGRFdmVyeU9wdGlvbnMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubm93RnVuYyA9IGFyZ3Mubm93RnVuYztcbiAgICB0aGlzLm5leHRGcmFtZUZ1bmMgPSBhcmdzLm5leHRGcmFtZUZ1bmMgfHwgbmV4dEZyYW1lO1xuICAgIHRoaXMueWllbGRFdmVyeSA9IHlpZWxkRXZlcnkgfHwgJ2F1dG8nO1xuICAgIGlmICh0aGlzLnlpZWxkRXZlcnkgPT09ICdhdXRvJykge1xuICAgICAgdGhpcy55aWVsZEV2ZXJ5ID0gREVGQVVMVF9ZSUVMRF9FVkVSWV9NUztcbiAgICB9XG4gICAgaWYgKHRoaXMueWllbGRFdmVyeSA9PT0gJ25ldmVyJyAmJiBhcmdzLm9uWWllbGQgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICd5aWVsZEV2ZXJ5IGlzIGBuZXZlcmAgYnV0IHlvdSBwcm92aWRlZCBhbiBgb25ZaWVsZGAgY2FsbGJhY2suICcgK1xuICAgICAgICAgICdFaXRoZXIgY2hhbmdlIGB5aWVsZEV2ZXJ5YCBvciByZW1vdmUgdGhlIGNhbGxiYWNrJyk7XG4gICAgfVxuICAgIGlmICh1dGlsLmlzTnVtYmVyKHRoaXMueWllbGRFdmVyeSkpIHtcbiAgICAgIC8vIERlY29yYXRlIGBtYXliZVdhaXRgIHNvIGl0IHdpbGwgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBldmVyeVxuICAgICAgLy8gYHlpZWxkRXZlcnlgIG1zLlxuICAgICAgdGhpcy5tYXliZVdhaXQgPSBnZW5lcmljX3V0aWxzLmRlYm91bmNlKFxuICAgICAgICAgIHRoaXMubWF5YmVXYWl0LmJpbmQodGhpcyksIHRoaXMueWllbGRFdmVyeSBhcyBudW1iZXIsIHRoaXMubm93RnVuYyk7XG4gICAgfVxuICAgIHRoaXMudHJhaW5CZWdpbiA9IGFyZ3Mub25UcmFpbkJlZ2luO1xuICAgIHRoaXMudHJhaW5FbmQgPSBhcmdzLm9uVHJhaW5FbmQ7XG4gICAgdGhpcy5lcG9jaEJlZ2luID0gYXJncy5vbkVwb2NoQmVnaW47XG4gICAgdGhpcy5lcG9jaEVuZCA9IGFyZ3Mub25FcG9jaEVuZDtcbiAgICB0aGlzLmJhdGNoQmVnaW4gPSBhcmdzLm9uQmF0Y2hCZWdpbjtcbiAgICB0aGlzLmJhdGNoRW5kID0gYXJncy5vbkJhdGNoRW5kO1xuICAgIHRoaXMueWllbGQgPSBhcmdzLm9uWWllbGQ7XG4gIH1cblxuICBhc3luYyBtYXliZVdhaXQoZXBvY2g6IG51bWJlciwgYmF0Y2g6IG51bWJlciwgbG9nczogVW5yZXNvbHZlZExvZ3MpIHtcbiAgICBjb25zdCBwczogQXJyYXk8dm9pZHxQcm9taXNlPHZvaWQ+PiA9IFtdO1xuICAgIGlmICh0aGlzLnlpZWxkICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgcHMucHVzaCh0aGlzLnlpZWxkKGVwb2NoLCBiYXRjaCwgbG9ncyBhcyBMb2dzKSk7XG4gICAgfVxuICAgIHBzLnB1c2godGhpcy5uZXh0RnJhbWVGdW5jKCkpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHBzKTtcbiAgfVxuXG4gIGFzeW5jIG9uRXBvY2hCZWdpbihlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0aGlzLmN1cnJlbnRFcG9jaCA9IGVwb2NoO1xuICAgIGlmICh0aGlzLmVwb2NoQmVnaW4gIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBhd2FpdCB0aGlzLmVwb2NoQmVnaW4oZXBvY2gsIGxvZ3MgYXMgTG9ncyk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgb25FcG9jaEVuZChlcG9jaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwczogQXJyYXk8dm9pZHxQcm9taXNlPHZvaWQ+PiA9IFtdO1xuICAgIGlmICh0aGlzLmVwb2NoRW5kICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgcHMucHVzaCh0aGlzLmVwb2NoRW5kKGVwb2NoLCBsb2dzIGFzIExvZ3MpKTtcbiAgICB9XG4gICAgaWYgKHRoaXMueWllbGRFdmVyeSA9PT0gJ2Vwb2NoJykge1xuICAgICAgcHMucHVzaCh0aGlzLm5leHRGcmFtZUZ1bmMoKSk7XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKHBzKTtcbiAgfVxuXG4gIGFzeW5jIG9uQmF0Y2hCZWdpbihiYXRjaDogbnVtYmVyLCBsb2dzPzogVW5yZXNvbHZlZExvZ3MpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAodGhpcy5iYXRjaEJlZ2luICE9IG51bGwpIHtcbiAgICAgIGF3YWl0IHJlc29sdmVTY2FsYXJzSW5Mb2dzKGxvZ3MpO1xuICAgICAgYXdhaXQgdGhpcy5iYXRjaEJlZ2luKGJhdGNoLCBsb2dzIGFzIExvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uQmF0Y2hFbmQoYmF0Y2g6IG51bWJlciwgbG9ncz86IFVucmVzb2x2ZWRMb2dzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcHM6IEFycmF5PHZvaWR8UHJvbWlzZTx2b2lkPj4gPSBbXTtcbiAgICBpZiAodGhpcy5iYXRjaEVuZCAhPSBudWxsKSB7XG4gICAgICBhd2FpdCByZXNvbHZlU2NhbGFyc0luTG9ncyhsb2dzKTtcbiAgICAgIHBzLnB1c2godGhpcy5iYXRjaEVuZChiYXRjaCwgbG9ncyBhcyBMb2dzKSk7XG4gICAgfVxuICAgIGlmICh0aGlzLnlpZWxkRXZlcnkgPT09ICdiYXRjaCcpIHtcbiAgICAgIHBzLnB1c2godGhpcy5uZXh0RnJhbWVGdW5jKCkpO1xuICAgIH0gZWxzZSBpZiAodXRpbC5pc051bWJlcih0aGlzLnlpZWxkRXZlcnkpKSB7XG4gICAgICBwcy5wdXNoKHRoaXMubWF5YmVXYWl0KHRoaXMuY3VycmVudEVwb2NoLCBiYXRjaCwgbG9ncykpO1xuICAgIH1cbiAgICBhd2FpdCBQcm9taXNlLmFsbChwcyk7XG4gIH1cblxuICBhc3luYyBvblRyYWluQmVnaW4obG9ncz86IFVucmVzb2x2ZWRMb2dzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudHJhaW5CZWdpbiAhPSBudWxsKSB7XG4gICAgICBhd2FpdCByZXNvbHZlU2NhbGFyc0luTG9ncyhsb2dzKTtcbiAgICAgIGF3YWl0IHRoaXMudHJhaW5CZWdpbihsb2dzIGFzIExvZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG9uVHJhaW5FbmQobG9ncz86IFVucmVzb2x2ZWRMb2dzKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMudHJhaW5FbmQgIT0gbnVsbCkge1xuICAgICAgYXdhaXQgcmVzb2x2ZVNjYWxhcnNJbkxvZ3MobG9ncyk7XG4gICAgICBhd2FpdCB0aGlzLnRyYWluRW5kKGxvZ3MgYXMgTG9ncyk7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemUgY2FsbGJhY2tzIG9yIGNvbmZpZ3VyYXRpb25zIG9mIHRoZW0gdG8gYW4gQXJyYXkgb2YgY2FsbGJhY2tzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhcmRpemVDYWxsYmFja3MoXG4gICAgY2FsbGJhY2tzOiBCYXNlQ2FsbGJhY2t8QmFzZUNhbGxiYWNrW118Q3VzdG9tQ2FsbGJhY2tBcmdzfFxuICAgIEN1c3RvbUNhbGxiYWNrQXJnc1tdLFxuICAgIHlpZWxkRXZlcnk6IFlpZWxkRXZlcnlPcHRpb25zKTogQmFzZUNhbGxiYWNrW10ge1xuICBpZiAoY2FsbGJhY2tzID09IG51bGwpIHtcbiAgICBjYWxsYmFja3MgPSB7fSBhcyBCYXNlQ2FsbGJhY2s7XG4gIH1cbiAgaWYgKGNhbGxiYWNrcyBpbnN0YW5jZW9mIEJhc2VDYWxsYmFjaykge1xuICAgIHJldHVybiBbY2FsbGJhY2tzXTtcbiAgfVxuICBpZiAoQXJyYXkuaXNBcnJheShjYWxsYmFja3MpICYmIGNhbGxiYWNrc1swXSBpbnN0YW5jZW9mIEJhc2VDYWxsYmFjaykge1xuICAgIHJldHVybiBjYWxsYmFja3MgYXMgQmFzZUNhbGxiYWNrW107XG4gIH1cbiAgLy8gQ29udmVydCBjdXN0b20gY2FsbGJhY2sgY29uZmlncyB0byBjdXN0b20gY2FsbGJhY2sgb2JqZWN0cy5cbiAgY29uc3QgY2FsbGJhY2tDb25maWdzID1cbiAgICAgIGdlbmVyaWNfdXRpbHMudG9MaXN0KGNhbGxiYWNrcykgYXMgQ3VzdG9tQ2FsbGJhY2tBcmdzW107XG4gIHJldHVybiBjYWxsYmFja0NvbmZpZ3MubWFwKFxuICAgICAgY2FsbGJhY2tDb25maWcgPT4gbmV3IEN1c3RvbUNhbGxiYWNrKGNhbGxiYWNrQ29uZmlnLCB5aWVsZEV2ZXJ5KSk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIHR5cGUgQmFzZUNhbGxiYWNrQ29uc3RydWN0b3IgPSB7XG4gIG5ldyAoKTogQmFzZUNhbGxiYWNrXG59O1xuXG4vKipcbiAqIEEgZ2xvYmFsIHJlZ2lzdHJ5IGZvciBjYWxsYmFjayBjb25zdHJ1Y3RvcnMgdG8gYmUgdXNlZCBkdXJpbmdcbiAqIExheWVyc01vZGVsLmZpdCgpLlxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5IHtcbiAgcHJpdmF0ZSBzdGF0aWMgY29uc3RydWN0b3JzOlxuICAgICAge1t2ZXJib3NpdHlMZXZlbDogbnVtYmVyXTogQmFzZUNhbGxiYWNrQ29uc3RydWN0b3JbXX0gPSB7fTtcblxuICAvKipcbiAgICogQmxvY2tzIHB1YmxpYyBhY2Nlc3MgdG8gY29uc3RydWN0b3IuXG4gICAqL1xuICBwcml2YXRlIGNvbnN0cnVjdG9yKCkge31cblxuICAvKipcbiAgICogUmVnaXN0ZXIgYSB0Zi5MYXllcnNNb2RlbC5maXQoKSBjYWxsYmFjayBjb25zdHJ1Y3Rvci5cbiAgICpcbiAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgY29uc3RydWN0b3Igd2lsbCBiZSB1c2VkIHRvIGluc3RhbnRpYXRlXG4gICAqIGNhbGxiYWNrcyBmb3IgZXZlcnkgdGYuTGF5ZXJzTW9kZWwuZml0KCkgY2FsbCBhZnRlcndhcmRzLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5TGV2ZWwgTGV2ZWwgb2YgdmVyYm9zaXR5IGF0IHdoaWNoIHRoZSBgY2FsbGJhY2tDb25zdHJ1Y3RvcmBcbiAgICogICBpcyB0byBiZSByZWlnc3RlcmVkLlxuICAgKiBAcGFyYW0gY2FsbGJhY2tDb25zdHJ1Y3RvciBBIG5vLWFyZyBjb25zdHJ1Y3RvciBmb3IgYHRmLkNhbGxiYWNrYC5cbiAgICogQHRocm93cyBFcnJvciwgaWYgdGhlIHNhbWUgY2FsbGJhY2tDb25zdHJ1Y3RvciBoYXMgYmVlbiByZWdpc3RlcmVkIGJlZm9yZSxcbiAgICogICBlaXRoZXIgYXQgdGhlIHNhbWUgb3IgYSBkaWZmZXJlbnQgYHZlcmJvc2l0eUxldmVsYC5cbiAgICovXG4gIHN0YXRpYyByZWdpc3RlckNhbGxiYWNrQ29uc3RydWN0b3IoXG4gICAgICB2ZXJib3NpdHlMZXZlbDogbnVtYmVyLCBjYWxsYmFja0NvbnN0cnVjdG9yOiBCYXNlQ2FsbGJhY2tDb25zdHJ1Y3Rvcikge1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB2ZXJib3NpdHlMZXZlbCA+PSAwICYmIE51bWJlci5pc0ludGVnZXIodmVyYm9zaXR5TGV2ZWwpLFxuICAgICAgICAoKSA9PiBgVmVyYm9zaXR5IGxldmVsIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIgPj0gMCwgYCArXG4gICAgICAgICAgICBgYnV0IGdvdCAke3ZlcmJvc2l0eUxldmVsfWApO1xuICAgIENhbGxiYWNrQ29uc3RydWN0b3JSZWdpc3RyeS5jaGVja0ZvckR1cGxpY2F0ZShjYWxsYmFja0NvbnN0cnVjdG9yKTtcbiAgICBpZiAoQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0gPT0gbnVsbCkge1xuICAgICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0gPSBbXTtcbiAgICB9XG4gICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1t2ZXJib3NpdHlMZXZlbF0ucHVzaChcbiAgICAgICAgY2FsbGJhY2tDb25zdHJ1Y3Rvcik7XG4gIH1cblxuICBwcml2YXRlIHN0YXRpYyBjaGVja0ZvckR1cGxpY2F0ZShjYWxsYmFja0NvbnN0cnVjdG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzZUNhbGxiYWNrQ29uc3RydWN0b3IpIHtcbiAgICBmb3IgKGNvbnN0IGxldmVsTmFtZSBpbiBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzKSB7XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvcnMgPSBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzWytsZXZlbE5hbWVdO1xuICAgICAgY29uc3RydWN0b3JzLmZvckVhY2goY3RvciA9PiB7XG4gICAgICAgIGlmIChjdG9yID09PSBjYWxsYmFja0NvbnN0cnVjdG9yKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0R1cGxpY2F0ZSBjYWxsYmFjayBjb25zdHJ1Y3Rvci4nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENsZWFyIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrIGNvbnN0cnVjdG9ycy5cbiAgICovXG4gIHByb3RlY3RlZCBzdGF0aWMgY2xlYXIoKSB7XG4gICAgQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9ycyA9IHt9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBjYWxsYmFja3MgdXNpbmcgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgY29uc3RydWN0b3JzLlxuICAgKlxuICAgKiBHaXZlbiBgdmVyYm9zaXR5TGV2ZWxgLCBhbGwgY29uc3RydWN0b3JzIHJlZ2lzdGVyZWQgYXQgdGhhdCBsZXZlbCBvciBhYm92ZVxuICAgKiB3aWxsIGJlIGNhbGxlZCBhbmQgdGhlIGluc3RhbnRpYXRlZCBjYWxsYmFja3Mgd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBAcGFyYW0gdmVyYm9zaXR5TGV2ZWw6IExldmVsIG9mIHZlcmJvc2l0eS5cbiAgICovXG4gIHN0YXRpYyBjcmVhdGVDYWxsYmFja3ModmVyYm9zaXR5TGV2ZWw6IG51bWJlcik6IEJhc2VDYWxsYmFja1tdIHtcbiAgICBjb25zdCBjb25zdHJ1Y3RvcnM6IEJhc2VDYWxsYmFja0NvbnN0cnVjdG9yW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxldmVsTmFtZSBpbiBDYWxsYmFja0NvbnN0cnVjdG9yUmVnaXN0cnkuY29uc3RydWN0b3JzKSB7XG4gICAgICBjb25zdCBsZXZlbCA9ICtsZXZlbE5hbWU7XG4gICAgICBpZiAodmVyYm9zaXR5TGV2ZWwgPj0gbGV2ZWwpIHtcbiAgICAgICAgY29uc3RydWN0b3JzLnB1c2goLi4uQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNvbnN0cnVjdG9yc1tsZXZlbF0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gY29uc3RydWN0b3JzLm1hcChjdG9yID0+IG5ldyBjdG9yKCkpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25maWd1cmVDYWxsYmFja3MoXG4gICAgY2FsbGJhY2tzOiBCYXNlQ2FsbGJhY2tbXSwgdmVyYm9zZTogTW9kZWxMb2dnaW5nVmVyYm9zaXR5LCBlcG9jaHM6IG51bWJlcixcbiAgICBpbml0aWFsRXBvY2g6IG51bWJlciwgbnVtVHJhaW5TYW1wbGVzOiBudW1iZXIsIHN0ZXBzUGVyRXBvY2g6IG51bWJlcixcbiAgICBiYXRjaFNpemU6IG51bWJlciwgZG9WYWxpZGF0aW9uOiBib29sZWFuLFxuICAgIGNhbGxiYWNrTWV0cmljczogc3RyaW5nW10pOiB7Y2FsbGJhY2tMaXN0OiBDYWxsYmFja0xpc3QsIGhpc3Rvcnk6IEhpc3Rvcnl9IHtcbiAgY29uc3QgaGlzdG9yeSA9IG5ldyBIaXN0b3J5KCk7XG4gIGNvbnN0IGFjdHVhbENhbGxiYWNrczogQmFzZUNhbGxiYWNrW10gPSBbXG4gICAgbmV3IEJhc2VMb2dnZXIoKSwgLi4uQ2FsbGJhY2tDb25zdHJ1Y3RvclJlZ2lzdHJ5LmNyZWF0ZUNhbGxiYWNrcyh2ZXJib3NlKVxuICBdO1xuICBpZiAoY2FsbGJhY2tzICE9IG51bGwpIHtcbiAgICBhY3R1YWxDYWxsYmFja3MucHVzaCguLi5jYWxsYmFja3MpO1xuICB9XG4gIGFjdHVhbENhbGxiYWNrcy5wdXNoKGhpc3RvcnkpO1xuICBjb25zdCBjYWxsYmFja0xpc3QgPSBuZXcgQ2FsbGJhY2tMaXN0KGFjdHVhbENhbGxiYWNrcyk7XG5cbiAgLy8gVE9ETyhjYWlzKTogRmlndXJlIG91dCB3aGVuIHRoaXMgTGF5ZXJzTW9kZWwgaW5zdGFuY2UgY2FuIGhhdmUgYVxuICAvLyBkeW5hbWljYWxseVxuICAvLyAgIHNldCBwcm9wZXJ0eSBjYWxsZWQgJ2NhbGxiYWNrX21vZGVsJyBhcyBpbiBQeUtlcmFzLlxuXG4gIGNhbGxiYWNrTGlzdC5zZXRQYXJhbXMoe1xuICAgIGVwb2NocyxcbiAgICBpbml0aWFsRXBvY2gsXG4gICAgc2FtcGxlczogbnVtVHJhaW5TYW1wbGVzLFxuICAgIHN0ZXBzOiBzdGVwc1BlckVwb2NoLFxuICAgIGJhdGNoU2l6ZSxcbiAgICB2ZXJib3NlLFxuICAgIGRvVmFsaWRhdGlvbixcbiAgICBtZXRyaWNzOiBjYWxsYmFja01ldHJpY3MsXG4gIH0pO1xuICByZXR1cm4ge2NhbGxiYWNrTGlzdCwgaGlzdG9yeX07XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original Source layers/__init__.py */\nimport { serialization } from '@tensorflow/tfjs-core';\nimport { deserializeKerasObject } from '../utils/generic_utils';\n/**\n * Instantiate a layer from a config dictionary.\n * @param config dict of the form {class_name: str, config: dict}\n * @param customObjects dict mapping class names (or function names)\n *   of custom (non-Keras) objects to class/functions\n * @param fastWeightInit Optional flag to use fast weight initialization\n *   during deserialization. This is applicable to cases in which\n *   the initialization will be immediately overwritten by loaded weight\n *   values. Default: `false`.\n * @returns Layer instance (may be LayersModel, Sequential, Layer...)\n */\nexport function deserialize(config, customObjects = {}, fastWeightInit = false) {\n    return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'layer', fastWeightInit);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvc2VyaWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILHdDQUF3QztBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFcEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFOUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3ZCLE1BQWdDLEVBQ2hDLGdCQUFnQixFQUE4QixFQUM5QyxjQUFjLEdBQUcsS0FBSztJQUN4QixPQUFPLHNCQUFzQixDQUN6QixNQUFNLEVBQUUsYUFBYSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxDQUFDLFlBQVksRUFDNUQsYUFBYSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgU291cmNlIGxheWVycy9fX2luaXRfXy5weSAqL1xuaW1wb3J0IHtzZXJpYWxpemF0aW9ufSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2Rlc2VyaWFsaXplS2VyYXNPYmplY3R9IGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG4vKipcbiAqIEluc3RhbnRpYXRlIGEgbGF5ZXIgZnJvbSBhIGNvbmZpZyBkaWN0aW9uYXJ5LlxuICogQHBhcmFtIGNvbmZpZyBkaWN0IG9mIHRoZSBmb3JtIHtjbGFzc19uYW1lOiBzdHIsIGNvbmZpZzogZGljdH1cbiAqIEBwYXJhbSBjdXN0b21PYmplY3RzIGRpY3QgbWFwcGluZyBjbGFzcyBuYW1lcyAob3IgZnVuY3Rpb24gbmFtZXMpXG4gKiAgIG9mIGN1c3RvbSAobm9uLUtlcmFzKSBvYmplY3RzIHRvIGNsYXNzL2Z1bmN0aW9uc1xuICogQHBhcmFtIGZhc3RXZWlnaHRJbml0IE9wdGlvbmFsIGZsYWcgdG8gdXNlIGZhc3Qgd2VpZ2h0IGluaXRpYWxpemF0aW9uXG4gKiAgIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0byBjYXNlcyBpbiB3aGljaFxuICogICB0aGUgaW5pdGlhbGl6YXRpb24gd2lsbCBiZSBpbW1lZGlhdGVseSBvdmVyd3JpdHRlbiBieSBsb2FkZWQgd2VpZ2h0XG4gKiAgIHZhbHVlcy4gRGVmYXVsdDogYGZhbHNlYC5cbiAqIEByZXR1cm5zIExheWVyIGluc3RhbmNlIChtYXkgYmUgTGF5ZXJzTW9kZWwsIFNlcXVlbnRpYWwsIExheWVyLi4uKVxuICovXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemUoXG4gICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsXG4gICAgY3VzdG9tT2JqZWN0cyA9IHt9IGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCxcbiAgICBmYXN0V2VpZ2h0SW5pdCA9IGZhbHNlKTogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGUge1xuICByZXR1cm4gZGVzZXJpYWxpemVLZXJhc09iamVjdChcbiAgICAgIGNvbmZpZywgc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCxcbiAgICAgIGN1c3RvbU9iamVjdHMsICdsYXllcicsIGZhc3RXZWlnaHRJbml0KTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original Source: losses.py */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { tidy, util } from '@tensorflow/tfjs-core';\nimport { epsilon } from './backend/common';\nimport * as K from './backend/tfjs_backend';\nimport { ValueError } from './errors';\n/**\n * Normalizes a tensor wrt the L2 norm alongside the specified axis.\n * @param x\n * @param axis Axis along which to perform normalization.\n */\nexport function l2Normalize(x, axis) {\n    return tidy(() => {\n        if (x.dtype !== 'float32') {\n            x = tfc.cast(x, 'float32');\n        }\n        const squareSum = tfc.sum(K.square(x), axis, true);\n        const epsilonTensor = tfc.fill(squareSum.shape, epsilon());\n        const norm = tfc.sqrt(tfc.maximum(squareSum, epsilonTensor));\n        return tfc.div(x, norm);\n    });\n}\nexport function meanSquaredError(yTrue, yPred) {\n    return tidy(() => tfc.mean(K.square(tfc.sub(yPred, yTrue)), -1));\n}\nexport function meanAbsoluteError(yTrue, yPred) {\n    return tidy(() => tfc.mean(tfc.abs(tfc.sub(yPred, yTrue)), -1));\n}\nexport function meanAbsolutePercentageError(yTrue, yPred) {\n    return tidy(() => {\n        const diff = tfc.sub(yTrue, yPred);\n        const clippedTrue = tfc.clipByValue(tfc.abs(yTrue), epsilon(), Number.MAX_VALUE);\n        const absResult = tfc.abs(tfc.div(diff, clippedTrue));\n        return tfc.mul(100, tfc.mean(absResult, -1));\n    });\n}\nexport function meanSquaredLogarithmicError(yTrue, yPred) {\n    return tidy(() => {\n        const clippedPred = tfc.clipByValue(yPred, epsilon(), Number.MAX_VALUE);\n        const firstLog = tfc.log(tfc.add(1, clippedPred));\n        const clippedTrue = tfc.clipByValue(yTrue, epsilon(), Number.MAX_VALUE);\n        const secondLog = tfc.log(tfc.add(1, clippedTrue));\n        return tfc.mean(K.square(tfc.sub(firstLog, secondLog)), -1);\n    });\n}\nexport function squaredHinge(yTrue, yPred) {\n    return tidy(() => {\n        const maxResult = tfc.maximum(0, tfc.sub(1, tfc.mul(yTrue, yPred)));\n        return tfc.mean(K.square(maxResult), -1);\n    });\n}\nexport function hinge(yTrue, yPred) {\n    return tidy(() => {\n        const maxResult = tfc.maximum(0, tfc.sub(1, tfc.mul(yTrue, yPred)));\n        return tfc.mean(maxResult, -1);\n    });\n}\nexport function categoricalHinge(yTrue, yPred) {\n    return tidy(() => {\n        const pos = tfc.sum(tfc.mul(yTrue, yPred), -1);\n        const neg = tfc.max(tfc.mul(tfc.sub(1, yTrue), yPred), -1);\n        return tfc.maximum(0, tfc.add(1, tfc.sub(neg, pos)));\n    });\n}\n/**\n * Logarithm of the hyperbolic cosine of the prediction error.\n *\n * `log(cosh(x))` is approximately equal to `(x ** 2) / 2` for small `x` and\n * to `abs(x) - log(2)` for large `x`. This means that 'logcosh' works mostly\n * like the mean squared error, but will not be so strongly affected by the\n * occasional wildly incorrect prediction.\n */\nexport function logcosh(yTrue, yPred) {\n    return tidy(() => {\n        const log2 = Math.log(2);\n        const predictionDiff = tfc.sub(yPred, yTrue);\n        const logcoshResult = tfc.sub(tfc.add(predictionDiff, tfc.softplus(tfc.mul(-2, predictionDiff))), log2);\n        return tfc.mean(logcoshResult, -1);\n    });\n}\nexport function categoricalCrossentropy(target, output, fromLogits = false) {\n    return tidy(() => {\n        if (fromLogits) {\n            output = tfc.softmax(output);\n        }\n        else {\n            // scale preds so that the class probabilities of each sample sum to 1.\n            const outputSum = tfc.sum(output, output.shape.length - 1, true);\n            output = tfc.div(output, outputSum);\n        }\n        output = tfc.clipByValue(output, epsilon(), 1 - epsilon());\n        return tfc.neg(tfc.sum(tfc.mul(tfc.cast(target, 'float32'), tfc.log(output)), output.shape.length - 1));\n    });\n}\n/**\n * Categorical crossentropy with integer targets.\n *\n * @param target An integer tensor.\n * @param output A tensor resulting from a softmax (unless `fromLogits` is\n *  `true`, in which case `output` is expected to be the logits).\n * @param fromLogits Boolean, whether `output` is the result of a softmax, or is\n *   a tensor of logits.\n */\nexport function sparseCategoricalCrossentropy(target, output, fromLogits = false) {\n    return tidy(() => {\n        const flatTarget = tfc.cast(tfc.floor(K.flatten(target)), 'int32');\n        output = tfc.clipByValue(output, epsilon(), 1 - epsilon());\n        const outputShape = output.shape;\n        const oneHotTarget = tfc.reshape(tfc.oneHot(flatTarget, outputShape[outputShape.length - 1]), outputShape);\n        return categoricalCrossentropy(oneHotTarget, output, fromLogits);\n    });\n}\n/**\n * From TensorFlow's implementation in nn_impl.py:\n *\n * For brevity, let `x = logits`, `z = labels`.  The logistic loss is\n *      z * -log(sigmoid(x)) + (1 - z) * -log(1 - sigmoid(x))\n *    = z * -log(1 / (1 + exp(-x))) + (1 - z) * -log(exp(-x) / (1 + exp(-x)))\n *    = z * log(1 + exp(-x)) + (1 - z) * (-log(exp(-x)) + log(1 + exp(-x)))\n *    = z * log(1 + exp(-x)) + (1 - z) * (x + log(1 + exp(-x))\n *    = (1 - z) * x + log(1 + exp(-x))\n *    = x - x * z + log(1 + exp(-x))\n * For x < 0, to avoid overflow in exp(-x), we reformulate the above\n *      x - x * z + log(1 + exp(-x))\n *    = log(exp(x)) - x * z + log(1 + exp(-x))\n *    = - x * z + log(1 + exp(x))\n * Hence, to ensure stability and avoid overflow, the implementation uses this\n * equivalent formulation\n *    max(x, 0) - x * z + log(1 + exp(-abs(x)))\n *\n * @param labels The labels.\n * @param logits The logits.\n */\nexport function sigmoidCrossEntropyWithLogits(labels, logits) {\n    if (!util.arraysEqual(labels.shape, logits.shape)) {\n        throw new ValueError(`logits and labels must have the same shape, but got shapes ` +\n            `${JSON.stringify(labels.shape)} and ${JSON.stringify(logits.shape)}`);\n    }\n    return tidy(() => {\n        // The logistic loss formula from above is\n        //   x - x * z + log(1 + exp(-x))\n        // For x < 0, a more numerically stable formula is\n        //   -x * z + log(1 + exp(x))\n        // Note that these two expressions can be combined into the following:\n        //   max(x, 0) - x * z + log(1 + exp(-abs(x)))\n        const reluLogits = tfc.relu(logits);\n        const negAbsLogits = tfc.neg(tfc.abs(logits));\n        return tfc.add(tfc.sub(reluLogits, tfc.mul(logits, labels)), tfc.log1p(tfc.exp(negAbsLogits)));\n    });\n}\nexport function binaryCrossentropy(yTrue, yPred) {\n    return tidy(() => {\n        let y;\n        y = tfc.clipByValue(yPred, epsilon(), 1 - epsilon());\n        y = tfc.log(tfc.div(y, tfc.sub(1, y)));\n        return tfc.mean(sigmoidCrossEntropyWithLogits(yTrue, y), -1);\n    });\n}\nexport function kullbackLeiblerDivergence(yTrue, yPred) {\n    return tidy(() => {\n        const clippedTrue = tfc.clipByValue(yTrue, epsilon(), 1);\n        const clippedPred = tfc.clipByValue(yPred, epsilon(), 1);\n        return tfc.sum(tfc.mul(yTrue, tfc.log(tfc.div(clippedTrue, clippedPred))), -1);\n    });\n}\nexport function poisson(yTrue, yPred) {\n    return tidy(() => {\n        const logPred = tfc.log(tfc.add(epsilon(), yPred));\n        return tfc.mean(tfc.sub(yPred, tfc.mul(yTrue, logPred)), -1);\n    });\n}\nexport function cosineProximity(yTrue, yPred) {\n    return tidy(() => {\n        const trueNormalized = l2Normalize(yTrue, -1);\n        const predNormalized = l2Normalize(yPred, -1);\n        const trueXPred = tfc.mul(trueNormalized, predNormalized);\n        return tfc.neg(tfc.sum(trueXPred, -1));\n    });\n}\nexport const mse = meanSquaredError;\nexport const MSE = meanSquaredError;\nexport const mae = meanAbsoluteError;\nexport const MAE = meanAbsoluteError;\nexport const mape = meanAbsolutePercentageError;\nexport const MAPE = meanAbsolutePercentageError;\nexport const msle = meanSquaredLogarithmicError;\nexport const MSLE = meanSquaredLogarithmicError;\nexport const kld = kullbackLeiblerDivergence;\nexport const KLD = kullbackLeiblerDivergence;\nexport const cosine = cosineProximity;\n// TODO(michaelterry): Add deserialize() function.\nexport const lossesMap = {\n    meanSquaredError,\n    meanAbsoluteError,\n    meanAbsolutePercentageError,\n    meanSquaredLogarithmicError,\n    squaredHinge,\n    hinge,\n    categoricalHinge,\n    logcosh,\n    categoricalCrossentropy,\n    sparseCategoricalCrossentropy,\n    binaryCrossentropy,\n    kullbackLeiblerDivergence,\n    poisson,\n    cosineProximity\n};\n// Porting note: This diverges from the PyKeras implementation and may need to\n// change based on (de)serialization requirements.\nexport function get(identifierOrFn) {\n    if (typeof identifierOrFn === 'string') {\n        if (identifierOrFn in lossesMap) {\n            return lossesMap[identifierOrFn];\n        }\n        let errMsg = `Unknown loss ${identifierOrFn}`;\n        if (identifierOrFn.toLowerCase().includes('softmaxcrossentropy')) {\n            errMsg = `Unknown loss ${identifierOrFn}. ` +\n                'Use \"categoricalCrossentropy\" as the string name for ' +\n                'tf.losses.softmaxCrossEntropy';\n        }\n        throw new ValueError(errMsg);\n    }\n    else {\n        return identifierOrFn;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9zc2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2xvc3Nlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILGdDQUFnQztBQUNoQyxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBbUIsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRW5FLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN6QyxPQUFPLEtBQUssQ0FBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFHcEM7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsQ0FBUyxFQUFFLElBQWE7SUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRTtZQUN6QixDQUFDLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDNUI7UUFDRCxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ25ELE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLEVBQUUsYUFBYSxDQUFDLENBQUMsQ0FBQztRQUM3RCxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUMzRCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELE1BQU0sVUFBVSxpQkFBaUIsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUM1RCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sVUFBVSwyQkFBMkIsQ0FDdkMsS0FBYSxFQUFFLEtBQWE7SUFDOUIsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbkMsTUFBTSxXQUFXLEdBQ2IsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUNqRSxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdEQsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLDJCQUEyQixDQUN2QyxLQUFhLEVBQUUsS0FBYTtJQUM5QixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEUsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBRWxELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4RSxNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFFbkQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsU0FBUyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlELENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxZQUFZLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDdkQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0MsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLEtBQUssQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUNoRCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixNQUFNLFNBQVMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUMzRCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0MsTUFBTSxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0QsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkQsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLGNBQWMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLGFBQWEsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUN6QixHQUFHLENBQUMsR0FBRyxDQUFDLGNBQWMsRUFBRSxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUNsRSxJQUFJLENBQUMsQ0FBQztRQUNWLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsdUJBQXVCLENBQ25DLE1BQWMsRUFBRSxNQUFjLEVBQUUsVUFBVSxHQUFHLEtBQUs7SUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsSUFBSSxVQUFVLEVBQUU7WUFDZCxNQUFNLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUM5QjthQUFNO1lBQ0wsdUVBQXVFO1lBQ3ZFLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRSxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7U0FDckM7UUFDRCxNQUFNLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDM0QsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ2xCLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUNyRCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2hDLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLDZCQUE2QixDQUN6QyxNQUFjLEVBQUUsTUFBYyxFQUFFLFVBQVUsR0FBRyxLQUFLO0lBQ3BELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNmLE1BQU0sVUFBVSxHQUNaLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFhLENBQUM7UUFDaEUsTUFBTSxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQzNELE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7UUFDakMsTUFBTSxZQUFZLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FDNUIsR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsV0FBVyxDQUFDLFdBQVcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFDM0QsV0FBVyxDQUFDLENBQUM7UUFDakIsT0FBTyx1QkFBdUIsQ0FBQyxZQUFZLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ25FLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRztBQUNILE1BQU0sVUFBVSw2QkFBNkIsQ0FDekMsTUFBYyxFQUFFLE1BQWM7SUFDaEMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDakQsTUFBTSxJQUFJLFVBQVUsQ0FDaEIsNkRBQTZEO1lBQzdELEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzVFO0lBQ0QsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsMENBQTBDO1FBQzFDLGlDQUFpQztRQUNqQyxrREFBa0Q7UUFDbEQsNkJBQTZCO1FBQzdCLHNFQUFzRTtRQUN0RSw4Q0FBOEM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNwQyxNQUFNLFlBQVksR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUM5QyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQ1YsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsRUFDNUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDN0QsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsSUFBSSxDQUFTLENBQUM7UUFDZCxDQUFDLEdBQUcsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDckQsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyw2QkFBNkIsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUseUJBQXlCLENBQ3JDLEtBQWEsRUFBRSxLQUFhO0lBQzlCLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNmLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ3pELE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FDVixHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxPQUFPLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsZUFBZSxDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQzFELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNmLE1BQU0sY0FBYyxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QyxNQUFNLGNBQWMsR0FBRyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDOUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDMUQsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUM7QUFDcEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0FBQ3BDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQztBQUNyQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUM7QUFDckMsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLDJCQUEyQixDQUFDO0FBQ2hELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRywyQkFBMkIsQ0FBQztBQUNoRCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLDJCQUEyQixDQUFDO0FBQ2hELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyx5QkFBeUIsQ0FBQztBQUM3QyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcseUJBQXlCLENBQUM7QUFDN0MsTUFBTSxDQUFDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQztBQUV0QyxrREFBa0Q7QUFFbEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUE2QztJQUNqRSxnQkFBZ0I7SUFDaEIsaUJBQWlCO0lBQ2pCLDJCQUEyQjtJQUMzQiwyQkFBMkI7SUFDM0IsWUFBWTtJQUNaLEtBQUs7SUFDTCxnQkFBZ0I7SUFDaEIsT0FBTztJQUNQLHVCQUF1QjtJQUN2Qiw2QkFBNkI7SUFDN0Isa0JBQWtCO0lBQ2xCLHlCQUF5QjtJQUN6QixPQUFPO0lBQ1AsZUFBZTtDQUNoQixDQUFDO0FBRUYsOEVBQThFO0FBQzlFLGtEQUFrRDtBQUNsRCxNQUFNLFVBQVUsR0FBRyxDQUFDLGNBQXFDO0lBQ3ZELElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFO1FBQ3RDLElBQUksY0FBYyxJQUFJLFNBQVMsRUFBRTtZQUMvQixPQUFPLFNBQVMsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNsQztRQUNELElBQUksTUFBTSxHQUFHLGdCQUFnQixjQUFjLEVBQUUsQ0FBQztRQUM5QyxJQUFJLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsRUFBRTtZQUNoRSxNQUFNLEdBQUcsZ0JBQWdCLGNBQWMsSUFBSTtnQkFDdkMsdURBQXVEO2dCQUN2RCwrQkFBK0IsQ0FBQztTQUNyQztRQUNELE1BQU0sSUFBSSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDOUI7U0FBTTtRQUNMLE9BQU8sY0FBYyxDQUFDO0tBQ3ZCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIFNvdXJjZTogbG9zc2VzLnB5ICovXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRCwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtlcHNpbG9ufSBmcm9tICcuL2JhY2tlbmQvY29tbW9uJztcbmltcG9ydCAqIGFzIEsgZnJvbSAnLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcbmltcG9ydCB7TG9zc09yTWV0cmljRm59IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSB0ZW5zb3Igd3J0IHRoZSBMMiBub3JtIGFsb25nc2lkZSB0aGUgc3BlY2lmaWVkIGF4aXMuXG4gKiBAcGFyYW0geFxuICogQHBhcmFtIGF4aXMgQXhpcyBhbG9uZyB3aGljaCB0byBwZXJmb3JtIG5vcm1hbGl6YXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsMk5vcm1hbGl6ZSh4OiBUZW5zb3IsIGF4aXM/OiBudW1iZXIpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKHguZHR5cGUgIT09ICdmbG9hdDMyJykge1xuICAgICAgeCA9IHRmYy5jYXN0KHgsICdmbG9hdDMyJyk7XG4gICAgfVxuICAgIGNvbnN0IHNxdWFyZVN1bSA9IHRmYy5zdW0oSy5zcXVhcmUoeCksIGF4aXMsIHRydWUpO1xuICAgIGNvbnN0IGVwc2lsb25UZW5zb3IgPSB0ZmMuZmlsbChzcXVhcmVTdW0uc2hhcGUsIGVwc2lsb24oKSk7XG4gICAgY29uc3Qgbm9ybSA9IHRmYy5zcXJ0KHRmYy5tYXhpbXVtKHNxdWFyZVN1bSwgZXBzaWxvblRlbnNvcikpO1xuICAgIHJldHVybiB0ZmMuZGl2KHgsIG5vcm0pO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lYW5TcXVhcmVkRXJyb3IoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHRmYy5tZWFuKEsuc3F1YXJlKHRmYy5zdWIoeVByZWQsIHlUcnVlKSksIC0xKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZWFuQWJzb2x1dGVFcnJvcih5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4gdGZjLm1lYW4odGZjLmFicyh0ZmMuc3ViKHlQcmVkLCB5VHJ1ZSkpLCAtMSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yKFxuICAgIHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgZGlmZiA9IHRmYy5zdWIoeVRydWUsIHlQcmVkKTtcbiAgICBjb25zdCBjbGlwcGVkVHJ1ZSA9XG4gICAgICAgIHRmYy5jbGlwQnlWYWx1ZSh0ZmMuYWJzKHlUcnVlKSwgZXBzaWxvbigpLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICBjb25zdCBhYnNSZXN1bHQgPSB0ZmMuYWJzKHRmYy5kaXYoZGlmZiwgY2xpcHBlZFRydWUpKTtcbiAgICByZXR1cm4gdGZjLm11bCgxMDAsIHRmYy5tZWFuKGFic1Jlc3VsdCwgLTEpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtZWFuU3F1YXJlZExvZ2FyaXRobWljRXJyb3IoXG4gICAgeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBjbGlwcGVkUHJlZCA9IHRmYy5jbGlwQnlWYWx1ZSh5UHJlZCwgZXBzaWxvbigpLCBOdW1iZXIuTUFYX1ZBTFVFKTtcbiAgICBjb25zdCBmaXJzdExvZyA9IHRmYy5sb2codGZjLmFkZCgxLCBjbGlwcGVkUHJlZCkpO1xuXG4gICAgY29uc3QgY2xpcHBlZFRydWUgPSB0ZmMuY2xpcEJ5VmFsdWUoeVRydWUsIGVwc2lsb24oKSwgTnVtYmVyLk1BWF9WQUxVRSk7XG4gICAgY29uc3Qgc2Vjb25kTG9nID0gdGZjLmxvZyh0ZmMuYWRkKDEsIGNsaXBwZWRUcnVlKSk7XG5cbiAgICByZXR1cm4gdGZjLm1lYW4oSy5zcXVhcmUodGZjLnN1YihmaXJzdExvZywgc2Vjb25kTG9nKSksIC0xKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcXVhcmVkSGluZ2UoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBtYXhSZXN1bHQgPSB0ZmMubWF4aW11bSgwLCB0ZmMuc3ViKDEsIHRmYy5tdWwoeVRydWUsIHlQcmVkKSkpO1xuICAgIHJldHVybiB0ZmMubWVhbihLLnNxdWFyZShtYXhSZXN1bHQpLCAtMSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaGluZ2UoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBtYXhSZXN1bHQgPSB0ZmMubWF4aW11bSgwLCB0ZmMuc3ViKDEsIHRmYy5tdWwoeVRydWUsIHlQcmVkKSkpO1xuICAgIHJldHVybiB0ZmMubWVhbihtYXhSZXN1bHQsIC0xKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjYXRlZ29yaWNhbEhpbmdlKHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgcG9zID0gdGZjLnN1bSh0ZmMubXVsKHlUcnVlLCB5UHJlZCksIC0xKTtcbiAgICBjb25zdCBuZWcgPSB0ZmMubWF4KHRmYy5tdWwodGZjLnN1YigxLCB5VHJ1ZSksIHlQcmVkKSwgLTEpO1xuICAgIHJldHVybiB0ZmMubWF4aW11bSgwLCB0ZmMuYWRkKDEsIHRmYy5zdWIobmVnLCBwb3MpKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIExvZ2FyaXRobSBvZiB0aGUgaHlwZXJib2xpYyBjb3NpbmUgb2YgdGhlIHByZWRpY3Rpb24gZXJyb3IuXG4gKlxuICogYGxvZyhjb3NoKHgpKWAgaXMgYXBwcm94aW1hdGVseSBlcXVhbCB0byBgKHggKiogMikgLyAyYCBmb3Igc21hbGwgYHhgIGFuZFxuICogdG8gYGFicyh4KSAtIGxvZygyKWAgZm9yIGxhcmdlIGB4YC4gVGhpcyBtZWFucyB0aGF0ICdsb2djb3NoJyB3b3JrcyBtb3N0bHlcbiAqIGxpa2UgdGhlIG1lYW4gc3F1YXJlZCBlcnJvciwgYnV0IHdpbGwgbm90IGJlIHNvIHN0cm9uZ2x5IGFmZmVjdGVkIGJ5IHRoZVxuICogb2NjYXNpb25hbCB3aWxkbHkgaW5jb3JyZWN0IHByZWRpY3Rpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBsb2djb3NoKHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgbG9nMiA9IE1hdGgubG9nKDIpO1xuICAgIGNvbnN0IHByZWRpY3Rpb25EaWZmID0gdGZjLnN1Yih5UHJlZCwgeVRydWUpO1xuICAgIGNvbnN0IGxvZ2Nvc2hSZXN1bHQgPSB0ZmMuc3ViKFxuICAgICAgICB0ZmMuYWRkKHByZWRpY3Rpb25EaWZmLCB0ZmMuc29mdHBsdXModGZjLm11bCgtMiwgcHJlZGljdGlvbkRpZmYpKSksXG4gICAgICAgIGxvZzIpO1xuICAgIHJldHVybiB0ZmMubWVhbihsb2djb3NoUmVzdWx0LCAtMSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcmljYWxDcm9zc2VudHJvcHkoXG4gICAgdGFyZ2V0OiBUZW5zb3IsIG91dHB1dDogVGVuc29yLCBmcm9tTG9naXRzID0gZmFsc2UpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKGZyb21Mb2dpdHMpIHtcbiAgICAgIG91dHB1dCA9IHRmYy5zb2Z0bWF4KG91dHB1dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIHNjYWxlIHByZWRzIHNvIHRoYXQgdGhlIGNsYXNzIHByb2JhYmlsaXRpZXMgb2YgZWFjaCBzYW1wbGUgc3VtIHRvIDEuXG4gICAgICBjb25zdCBvdXRwdXRTdW0gPSB0ZmMuc3VtKG91dHB1dCwgb3V0cHV0LnNoYXBlLmxlbmd0aCAtIDEsIHRydWUpO1xuICAgICAgb3V0cHV0ID0gdGZjLmRpdihvdXRwdXQsIG91dHB1dFN1bSk7XG4gICAgfVxuICAgIG91dHB1dCA9IHRmYy5jbGlwQnlWYWx1ZShvdXRwdXQsIGVwc2lsb24oKSwgMSAtIGVwc2lsb24oKSk7XG4gICAgcmV0dXJuIHRmYy5uZWcodGZjLnN1bShcbiAgICAgICAgdGZjLm11bCh0ZmMuY2FzdCh0YXJnZXQsICdmbG9hdDMyJyksIHRmYy5sb2cob3V0cHV0KSksXG4gICAgICAgIG91dHB1dC5zaGFwZS5sZW5ndGggLSAxKSk7XG4gIH0pO1xufVxuXG4vKipcbiAqIENhdGVnb3JpY2FsIGNyb3NzZW50cm9weSB3aXRoIGludGVnZXIgdGFyZ2V0cy5cbiAqXG4gKiBAcGFyYW0gdGFyZ2V0IEFuIGludGVnZXIgdGVuc29yLlxuICogQHBhcmFtIG91dHB1dCBBIHRlbnNvciByZXN1bHRpbmcgZnJvbSBhIHNvZnRtYXggKHVubGVzcyBgZnJvbUxvZ2l0c2AgaXNcbiAqICBgdHJ1ZWAsIGluIHdoaWNoIGNhc2UgYG91dHB1dGAgaXMgZXhwZWN0ZWQgdG8gYmUgdGhlIGxvZ2l0cykuXG4gKiBAcGFyYW0gZnJvbUxvZ2l0cyBCb29sZWFuLCB3aGV0aGVyIGBvdXRwdXRgIGlzIHRoZSByZXN1bHQgb2YgYSBzb2Z0bWF4LCBvciBpc1xuICogICBhIHRlbnNvciBvZiBsb2dpdHMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weShcbiAgICB0YXJnZXQ6IFRlbnNvciwgb3V0cHV0OiBUZW5zb3IsIGZyb21Mb2dpdHMgPSBmYWxzZSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBmbGF0VGFyZ2V0ID1cbiAgICAgICAgdGZjLmNhc3QodGZjLmZsb29yKEsuZmxhdHRlbih0YXJnZXQpKSwgJ2ludDMyJykgYXMgVGVuc29yMUQ7XG4gICAgb3V0cHV0ID0gdGZjLmNsaXBCeVZhbHVlKG91dHB1dCwgZXBzaWxvbigpLCAxIC0gZXBzaWxvbigpKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IG91dHB1dC5zaGFwZTtcbiAgICBjb25zdCBvbmVIb3RUYXJnZXQgPSB0ZmMucmVzaGFwZShcbiAgICAgICAgdGZjLm9uZUhvdChmbGF0VGFyZ2V0LCBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSksXG4gICAgICAgIG91dHB1dFNoYXBlKTtcbiAgICByZXR1cm4gY2F0ZWdvcmljYWxDcm9zc2VudHJvcHkob25lSG90VGFyZ2V0LCBvdXRwdXQsIGZyb21Mb2dpdHMpO1xuICB9KTtcbn1cblxuLyoqXG4gKiBGcm9tIFRlbnNvckZsb3cncyBpbXBsZW1lbnRhdGlvbiBpbiBubl9pbXBsLnB5OlxuICpcbiAqIEZvciBicmV2aXR5LCBsZXQgYHggPSBsb2dpdHNgLCBgeiA9IGxhYmVsc2AuICBUaGUgbG9naXN0aWMgbG9zcyBpc1xuICogICAgICB6ICogLWxvZyhzaWdtb2lkKHgpKSArICgxIC0geikgKiAtbG9nKDEgLSBzaWdtb2lkKHgpKVxuICogICAgPSB6ICogLWxvZygxIC8gKDEgKyBleHAoLXgpKSkgKyAoMSAtIHopICogLWxvZyhleHAoLXgpIC8gKDEgKyBleHAoLXgpKSlcbiAqICAgID0geiAqIGxvZygxICsgZXhwKC14KSkgKyAoMSAtIHopICogKC1sb2coZXhwKC14KSkgKyBsb2coMSArIGV4cCgteCkpKVxuICogICAgPSB6ICogbG9nKDEgKyBleHAoLXgpKSArICgxIC0geikgKiAoeCArIGxvZygxICsgZXhwKC14KSlcbiAqICAgID0gKDEgLSB6KSAqIHggKyBsb2coMSArIGV4cCgteCkpXG4gKiAgICA9IHggLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAqIEZvciB4IDwgMCwgdG8gYXZvaWQgb3ZlcmZsb3cgaW4gZXhwKC14KSwgd2UgcmVmb3JtdWxhdGUgdGhlIGFib3ZlXG4gKiAgICAgIHggLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAqICAgID0gbG9nKGV4cCh4KSkgLSB4ICogeiArIGxvZygxICsgZXhwKC14KSlcbiAqICAgID0gLSB4ICogeiArIGxvZygxICsgZXhwKHgpKVxuICogSGVuY2UsIHRvIGVuc3VyZSBzdGFiaWxpdHkgYW5kIGF2b2lkIG92ZXJmbG93LCB0aGUgaW1wbGVtZW50YXRpb24gdXNlcyB0aGlzXG4gKiBlcXVpdmFsZW50IGZvcm11bGF0aW9uXG4gKiAgICBtYXgoeCwgMCkgLSB4ICogeiArIGxvZygxICsgZXhwKC1hYnMoeCkpKVxuICpcbiAqIEBwYXJhbSBsYWJlbHMgVGhlIGxhYmVscy5cbiAqIEBwYXJhbSBsb2dpdHMgVGhlIGxvZ2l0cy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzKFxuICAgIGxhYmVsczogVGVuc29yLCBsb2dpdHM6IFRlbnNvcik6IFRlbnNvciB7XG4gIGlmICghdXRpbC5hcnJheXNFcXVhbChsYWJlbHMuc2hhcGUsIGxvZ2l0cy5zaGFwZSkpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYGxvZ2l0cyBhbmQgbGFiZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSBzaGFwZSwgYnV0IGdvdCBzaGFwZXMgYCArXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGxhYmVscy5zaGFwZSl9IGFuZCAke0pTT04uc3RyaW5naWZ5KGxvZ2l0cy5zaGFwZSl9YCk7XG4gIH1cbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIC8vIFRoZSBsb2dpc3RpYyBsb3NzIGZvcm11bGEgZnJvbSBhYm92ZSBpc1xuICAgIC8vICAgeCAtIHggKiB6ICsgbG9nKDEgKyBleHAoLXgpKVxuICAgIC8vIEZvciB4IDwgMCwgYSBtb3JlIG51bWVyaWNhbGx5IHN0YWJsZSBmb3JtdWxhIGlzXG4gICAgLy8gICAteCAqIHogKyBsb2coMSArIGV4cCh4KSlcbiAgICAvLyBOb3RlIHRoYXQgdGhlc2UgdHdvIGV4cHJlc3Npb25zIGNhbiBiZSBjb21iaW5lZCBpbnRvIHRoZSBmb2xsb3dpbmc6XG4gICAgLy8gICBtYXgoeCwgMCkgLSB4ICogeiArIGxvZygxICsgZXhwKC1hYnMoeCkpKVxuICAgIGNvbnN0IHJlbHVMb2dpdHMgPSB0ZmMucmVsdShsb2dpdHMpO1xuICAgIGNvbnN0IG5lZ0Fic0xvZ2l0cyA9IHRmYy5uZWcodGZjLmFicyhsb2dpdHMpKTtcbiAgICByZXR1cm4gdGZjLmFkZChcbiAgICAgICAgdGZjLnN1YihyZWx1TG9naXRzLCB0ZmMubXVsKGxvZ2l0cywgbGFiZWxzKSksXG4gICAgICAgIHRmYy5sb2cxcCh0ZmMuZXhwKG5lZ0Fic0xvZ2l0cykpKTtcbiAgfSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlDcm9zc2VudHJvcHkoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBsZXQgeTogVGVuc29yO1xuICAgIHkgPSB0ZmMuY2xpcEJ5VmFsdWUoeVByZWQsIGVwc2lsb24oKSwgMSAtIGVwc2lsb24oKSk7XG4gICAgeSA9IHRmYy5sb2codGZjLmRpdih5LCB0ZmMuc3ViKDEsIHkpKSk7XG4gICAgcmV0dXJuIHRmYy5tZWFuKHNpZ21vaWRDcm9zc0VudHJvcHlXaXRoTG9naXRzKHlUcnVlLCB5KSwgLTEpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGt1bGxiYWNrTGVpYmxlckRpdmVyZ2VuY2UoXG4gICAgeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBjbGlwcGVkVHJ1ZSA9IHRmYy5jbGlwQnlWYWx1ZSh5VHJ1ZSwgZXBzaWxvbigpLCAxKTtcbiAgICBjb25zdCBjbGlwcGVkUHJlZCA9IHRmYy5jbGlwQnlWYWx1ZSh5UHJlZCwgZXBzaWxvbigpLCAxKTtcbiAgICByZXR1cm4gdGZjLnN1bShcbiAgICAgICAgdGZjLm11bCh5VHJ1ZSwgdGZjLmxvZyh0ZmMuZGl2KGNsaXBwZWRUcnVlLCBjbGlwcGVkUHJlZCkpKSwgLTEpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBvaXNzb24oeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjb25zdCBsb2dQcmVkID0gdGZjLmxvZyh0ZmMuYWRkKGVwc2lsb24oKSwgeVByZWQpKTtcbiAgICByZXR1cm4gdGZjLm1lYW4odGZjLnN1Yih5UHJlZCwgdGZjLm11bCh5VHJ1ZSwgbG9nUHJlZCkpLCAtMSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29zaW5lUHJveGltaXR5KHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgdHJ1ZU5vcm1hbGl6ZWQgPSBsMk5vcm1hbGl6ZSh5VHJ1ZSwgLTEpO1xuICAgIGNvbnN0IHByZWROb3JtYWxpemVkID0gbDJOb3JtYWxpemUoeVByZWQsIC0xKTtcbiAgICBjb25zdCB0cnVlWFByZWQgPSB0ZmMubXVsKHRydWVOb3JtYWxpemVkLCBwcmVkTm9ybWFsaXplZCk7XG4gICAgcmV0dXJuIHRmYy5uZWcodGZjLnN1bSh0cnVlWFByZWQsIC0xKSk7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3QgbXNlID0gbWVhblNxdWFyZWRFcnJvcjtcbmV4cG9ydCBjb25zdCBNU0UgPSBtZWFuU3F1YXJlZEVycm9yO1xuZXhwb3J0IGNvbnN0IG1hZSA9IG1lYW5BYnNvbHV0ZUVycm9yO1xuZXhwb3J0IGNvbnN0IE1BRSA9IG1lYW5BYnNvbHV0ZUVycm9yO1xuZXhwb3J0IGNvbnN0IG1hcGUgPSBtZWFuQWJzb2x1dGVQZXJjZW50YWdlRXJyb3I7XG5leHBvcnQgY29uc3QgTUFQRSA9IG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcjtcbmV4cG9ydCBjb25zdCBtc2xlID0gbWVhblNxdWFyZWRMb2dhcml0aG1pY0Vycm9yO1xuZXhwb3J0IGNvbnN0IE1TTEUgPSBtZWFuU3F1YXJlZExvZ2FyaXRobWljRXJyb3I7XG5leHBvcnQgY29uc3Qga2xkID0ga3VsbGJhY2tMZWlibGVyRGl2ZXJnZW5jZTtcbmV4cG9ydCBjb25zdCBLTEQgPSBrdWxsYmFja0xlaWJsZXJEaXZlcmdlbmNlO1xuZXhwb3J0IGNvbnN0IGNvc2luZSA9IGNvc2luZVByb3hpbWl0eTtcblxuLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBBZGQgZGVzZXJpYWxpemUoKSBmdW5jdGlvbi5cblxuZXhwb3J0IGNvbnN0IGxvc3Nlc01hcDoge1tmdW5jdGlvbk5hbWU6IHN0cmluZ106IExvc3NPck1ldHJpY0ZufSA9IHtcbiAgbWVhblNxdWFyZWRFcnJvcixcbiAgbWVhbkFic29sdXRlRXJyb3IsXG4gIG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcixcbiAgbWVhblNxdWFyZWRMb2dhcml0aG1pY0Vycm9yLFxuICBzcXVhcmVkSGluZ2UsXG4gIGhpbmdlLFxuICBjYXRlZ29yaWNhbEhpbmdlLFxuICBsb2djb3NoLFxuICBjYXRlZ29yaWNhbENyb3NzZW50cm9weSxcbiAgc3BhcnNlQ2F0ZWdvcmljYWxDcm9zc2VudHJvcHksXG4gIGJpbmFyeUNyb3NzZW50cm9weSxcbiAga3VsbGJhY2tMZWlibGVyRGl2ZXJnZW5jZSxcbiAgcG9pc3NvbixcbiAgY29zaW5lUHJveGltaXR5XG59O1xuXG4vLyBQb3J0aW5nIG5vdGU6IFRoaXMgZGl2ZXJnZXMgZnJvbSB0aGUgUHlLZXJhcyBpbXBsZW1lbnRhdGlvbiBhbmQgbWF5IG5lZWQgdG9cbi8vIGNoYW5nZSBiYXNlZCBvbiAoZGUpc2VyaWFsaXphdGlvbiByZXF1aXJlbWVudHMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0KGlkZW50aWZpZXJPckZuOiBzdHJpbmd8TG9zc09yTWV0cmljRm4pOiBMb3NzT3JNZXRyaWNGbiB7XG4gIGlmICh0eXBlb2YgaWRlbnRpZmllck9yRm4gPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKGlkZW50aWZpZXJPckZuIGluIGxvc3Nlc01hcCkge1xuICAgICAgcmV0dXJuIGxvc3Nlc01hcFtpZGVudGlmaWVyT3JGbl07XG4gICAgfVxuICAgIGxldCBlcnJNc2cgPSBgVW5rbm93biBsb3NzICR7aWRlbnRpZmllck9yRm59YDtcbiAgICBpZiAoaWRlbnRpZmllck9yRm4udG9Mb3dlckNhc2UoKS5pbmNsdWRlcygnc29mdG1heGNyb3NzZW50cm9weScpKSB7XG4gICAgICBlcnJNc2cgPSBgVW5rbm93biBsb3NzICR7aWRlbnRpZmllck9yRm59LiBgICtcbiAgICAgICAgICAnVXNlIFwiY2F0ZWdvcmljYWxDcm9zc2VudHJvcHlcIiBhcyB0aGUgc3RyaW5nIG5hbWUgZm9yICcgK1xuICAgICAgICAgICd0Zi5sb3NzZXMuc29mdG1heENyb3NzRW50cm9weSc7XG4gICAgfVxuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGVyck1zZyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXJPckZuO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Built-in metrics.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { tidy } from '@tensorflow/tfjs-core';\nimport * as K from './backend/tfjs_backend';\nimport { NotImplementedError, ValueError } from './errors';\nimport { categoricalCrossentropy as categoricalCrossentropyLoss, cosineProximity, meanAbsoluteError, meanAbsolutePercentageError, meanSquaredError, sparseCategoricalCrossentropy as sparseCategoricalCrossentropyLoss } from './losses';\nimport { binaryCrossentropy as lossBinaryCrossentropy } from './losses';\nimport { lossesMap } from './losses';\nimport * as util from './utils/generic_utils';\nexport function binaryAccuracy(yTrue, yPred) {\n    return tidy(() => {\n        const threshold = tfc.mul(.5, tfc.onesLike(yPred));\n        const yPredThresholded = K.cast(tfc.greater(yPred, threshold), yTrue.dtype);\n        return tfc.mean(tfc.equal(yTrue, yPredThresholded), -1);\n    });\n}\nexport function categoricalAccuracy(yTrue, yPred) {\n    return tidy(() => K.cast(tfc.equal(tfc.argMax(yTrue, -1), tfc.argMax(yPred, -1)), 'float32'));\n}\nfunction truePositives(yTrue, yPred) {\n    return tidy(() => {\n        return tfc.cast(tfc.sum(tfc.logicalAnd(tfc.equal(yTrue, 1), tfc.equal(yPred, 1))), 'float32');\n    });\n}\nfunction falseNegatives(yTrue, yPred) {\n    return tidy(() => {\n        return tfc.cast(tfc.sum(tfc.logicalAnd(tfc.equal(yTrue, 1), tfc.equal(yPred, 0))), 'float32');\n    });\n}\nfunction falsePositives(yTrue, yPred) {\n    return tidy(() => {\n        return tfc.cast(tfc.sum(tfc.logicalAnd(tfc.equal(yTrue, 0), tfc.equal(yPred, 1))), 'float32');\n    });\n}\nexport function precision(yTrue, yPred) {\n    return tidy(() => {\n        const tp = truePositives(yTrue, yPred);\n        const fp = falsePositives(yTrue, yPred);\n        const denominator = tfc.add(tp, fp);\n        return tfc.cast(tfc.where(tfc.greater(denominator, 0), tfc.div(tp, denominator), 0), 'float32');\n    });\n}\nexport function recall(yTrue, yPred) {\n    return tidy(() => {\n        const tp = truePositives(yTrue, yPred);\n        const fn = falseNegatives(yTrue, yPred);\n        const denominator = tfc.add(tp, fn);\n        return tfc.cast(tfc.where(tfc.greater(denominator, 0), tfc.div(tp, denominator), 0), 'float32');\n    });\n}\nexport function binaryCrossentropy(yTrue, yPred) {\n    return lossBinaryCrossentropy(yTrue, yPred);\n}\nexport function sparseCategoricalAccuracy(yTrue, yPred) {\n    if (yTrue.rank === yPred.rank) {\n        yTrue = tfc.squeeze(yTrue, [yTrue.rank - 1]);\n    }\n    yPred = tfc.argMax(yPred, -1);\n    if (yPred.dtype !== yTrue.dtype) {\n        yPred = tfc.cast(yPred, yTrue.dtype);\n    }\n    return tfc.cast(tfc.equal(yTrue, yPred), 'float32');\n}\nexport function topKCategoricalAccuracy(yTrue, yPred) {\n    throw new NotImplementedError();\n}\nexport function sparseTopKCategoricalAccuracy(yTrue, yPred) {\n    throw new NotImplementedError();\n}\n// Aliases.\nexport const mse = meanSquaredError;\nexport const MSE = meanSquaredError;\nexport const mae = meanAbsoluteError;\nexport const MAE = meanAbsoluteError;\nexport const mape = meanAbsolutePercentageError;\nexport const MAPE = meanAbsolutePercentageError;\nexport const categoricalCrossentropy = categoricalCrossentropyLoss;\nexport const cosine = cosineProximity;\nexport const sparseCategoricalCrossentropy = sparseCategoricalCrossentropyLoss;\n// TODO(cais, nielsene): Add serialize().\nexport const metricsMap = {\n    binaryAccuracy,\n    categoricalAccuracy,\n    precision,\n    categoricalCrossentropy,\n    sparseCategoricalCrossentropy,\n    mse,\n    MSE,\n    mae,\n    MAE,\n    mape,\n    MAPE,\n    cosine\n};\nexport function get(identifier) {\n    if (typeof identifier === 'string' && identifier in metricsMap) {\n        return metricsMap[identifier];\n    }\n    else if (typeof identifier !== 'string' && identifier != null) {\n        return identifier;\n    }\n    else {\n        throw new ValueError(`Unknown metric ${identifier}`);\n    }\n}\n/**\n * Get the shortcut function name.\n *\n * If the fn name is a string,\n *   directly return the string name.\n * If the function is included in metricsMap or lossesMap,\n *   return key of the map.\n *   - If the function relative to multiple keys,\n *     return the first found key as the function name.\n *   - If the function exists in both lossesMap and metricsMap,\n *     search lossesMap first.\n * If the function is not included in metricsMap or lossesMap,\n *   return the function name.\n *\n * @param fn loss function, metric function, or short cut name.\n * @returns Loss or Metric name in string.\n */\nexport function getLossOrMetricName(fn) {\n    util.assert(fn !== null, `Unknown LossOrMetricFn ${fn}`);\n    if (typeof fn === 'string') {\n        return fn;\n    }\n    else {\n        let fnName;\n        for (const key of Object.keys(lossesMap)) {\n            if (lossesMap[key] === fn) {\n                fnName = key;\n                break;\n            }\n        }\n        if (fnName !== undefined) {\n            return fnName;\n        }\n        for (const key of Object.keys(metricsMap)) {\n            if (metricsMap[key] === fn) {\n                fnName = key;\n                break;\n            }\n        }\n        if (fnName !== undefined) {\n            return fnName;\n        }\n        return fn.name;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9tZXRyaWNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBUyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRCxPQUFPLEtBQUssQ0FBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVDLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDekQsT0FBTyxFQUFDLHVCQUF1QixJQUFJLDJCQUEyQixFQUFFLGVBQWUsRUFBRSxpQkFBaUIsRUFBRSwyQkFBMkIsRUFBRSxnQkFBZ0IsRUFBRSw2QkFBNkIsSUFBSSxpQ0FBaUMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUN2TyxPQUFPLEVBQUMsa0JBQWtCLElBQUksc0JBQXNCLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFDdEUsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUVuQyxPQUFPLEtBQUssSUFBSSxNQUFNLHVCQUF1QixDQUFDO0FBRTlDLE1BQU0sVUFBVSxjQUFjLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDekQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUUsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMxRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDOUQsT0FBTyxJQUFJLENBQ1AsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FDUixHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDLENBQUM7QUFDL0UsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ2pELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNmLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FDWCxHQUFHLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUNqRSxTQUFTLENBQUMsQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUNsRCxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQ1gsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFDakUsU0FBUyxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDbEQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUNYLEdBQUcsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQ2pFLFNBQVMsQ0FBQyxDQUFDO0lBQ2pCLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELE1BQU0sVUFBVSxTQUFTLENBQUMsS0FBYSxFQUFFLEtBQWE7SUFDcEQsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsTUFBTSxFQUFFLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUN2QyxNQUFNLEVBQUUsR0FBRyxjQUFjLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXhDLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRXBDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FDWCxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUNuRSxTQUFTLENBQUMsQ0FBQztJQUNqQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQ2pELE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNmLE1BQU0sRUFBRSxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkMsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV4QyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUVwQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQ1gsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsRUFBRSxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbkUsU0FBUyxDQUFDLENBQUM7SUFDakIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEtBQWEsRUFBRSxLQUFhO0lBQzdELE9BQU8sc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQzlDLENBQUM7QUFFRCxNQUFNLFVBQVUseUJBQXlCLENBQ3JDLEtBQWEsRUFBRSxLQUFhO0lBQzlCLElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxLQUFLLENBQUMsSUFBSSxFQUFFO1FBQzdCLEtBQUssR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUNELEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQy9CLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdEM7SUFDRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDdEQsQ0FBQztBQUVELE1BQU0sVUFBVSx1QkFBdUIsQ0FBQyxLQUFhLEVBQUUsS0FBYTtJQUNsRSxNQUFNLElBQUksbUJBQW1CLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLDZCQUE2QixDQUN6QyxLQUFhLEVBQUUsS0FBYTtJQUM5QixNQUFNLElBQUksbUJBQW1CLEVBQUUsQ0FBQztBQUNsQyxDQUFDO0FBRUQsV0FBVztBQUNYLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQztBQUNwQyxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUM7QUFDcEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDO0FBQ3JDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsQ0FBQztBQUNyQyxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsMkJBQTJCLENBQUM7QUFDaEQsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLDJCQUEyQixDQUFDO0FBQ2hELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLDJCQUEyQixDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUM7QUFDdEMsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsaUNBQWlDLENBQUM7QUFFL0UseUNBQXlDO0FBRXpDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBNkM7SUFDbEUsY0FBYztJQUNkLG1CQUFtQjtJQUNuQixTQUFTO0lBQ1QsdUJBQXVCO0lBQ3ZCLDZCQUE2QjtJQUM3QixHQUFHO0lBQ0gsR0FBRztJQUNILEdBQUc7SUFDSCxHQUFHO0lBQ0gsSUFBSTtJQUNKLElBQUk7SUFDSixNQUFNO0NBQ1AsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBaUM7SUFDbkQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksVUFBVSxJQUFJLFVBQVUsRUFBRTtRQUM5RCxPQUFPLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUMvQjtTQUFNLElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDL0QsT0FBTyxVQUFVLENBQUM7S0FDbkI7U0FBTTtRQUNMLE1BQU0sSUFBSSxVQUFVLENBQUMsa0JBQWtCLFVBQVUsRUFBRSxDQUFDLENBQUM7S0FDdEQ7QUFDSCxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsRUFBeUI7SUFDM0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssSUFBSSxFQUFFLDBCQUEwQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELElBQUksT0FBTyxFQUFFLEtBQUssUUFBUSxFQUFFO1FBQzFCLE9BQU8sRUFBRSxDQUFDO0tBQ1g7U0FBTTtRQUNMLElBQUksTUFBTSxDQUFDO1FBQ1gsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1lBQ3hDLElBQUksU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDekIsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQkFDYixNQUFNO2FBQ1A7U0FDRjtRQUNELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsS0FBSyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ3pDLElBQUksVUFBVSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsRUFBRTtnQkFDMUIsTUFBTSxHQUFHLEdBQUcsQ0FBQztnQkFDYixNQUFNO2FBQ1A7U0FDRjtRQUNELElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRTtZQUN4QixPQUFPLE1BQU0sQ0FBQztTQUNmO1FBQ0QsT0FBUSxFQUFlLENBQUMsSUFBSSxDQUFDO0tBQzlCO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogQnVpbHQtaW4gbWV0cmljcy5cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7VGVuc29yLCB0aWR5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgKiBhcyBLIGZyb20gJy4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuL2Vycm9ycyc7XG5pbXBvcnQge2NhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5IGFzIGNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5TG9zcywgY29zaW5lUHJveGltaXR5LCBtZWFuQWJzb2x1dGVFcnJvciwgbWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yLCBtZWFuU3F1YXJlZEVycm9yLCBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weSBhcyBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weUxvc3N9IGZyb20gJy4vbG9zc2VzJztcbmltcG9ydCB7YmluYXJ5Q3Jvc3NlbnRyb3B5IGFzIGxvc3NCaW5hcnlDcm9zc2VudHJvcHl9IGZyb20gJy4vbG9zc2VzJztcbmltcG9ydCB7bG9zc2VzTWFwfSBmcm9tICcuL2xvc3Nlcyc7XG5pbXBvcnQge0xvc3NPck1ldHJpY0ZufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIHV0aWwgZnJvbSAnLi91dGlscy9nZW5lcmljX3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUFjY3VyYWN5KHlUcnVlOiBUZW5zb3IsIHlQcmVkOiBUZW5zb3IpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY29uc3QgdGhyZXNob2xkID0gdGZjLm11bCguNSwgdGZjLm9uZXNMaWtlKHlQcmVkKSk7XG4gICAgY29uc3QgeVByZWRUaHJlc2hvbGRlZCA9IEsuY2FzdCh0ZmMuZ3JlYXRlcih5UHJlZCwgdGhyZXNob2xkKSwgeVRydWUuZHR5cGUpO1xuICAgIHJldHVybiB0ZmMubWVhbih0ZmMuZXF1YWwoeVRydWUsIHlQcmVkVGhyZXNob2xkZWQpLCAtMSk7XG4gIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2F0ZWdvcmljYWxBY2N1cmFjeSh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoXG4gICAgICAoKSA9PiBLLmNhc3QoXG4gICAgICAgICAgdGZjLmVxdWFsKHRmYy5hcmdNYXgoeVRydWUsIC0xKSwgdGZjLmFyZ01heCh5UHJlZCwgLTEpKSwgJ2Zsb2F0MzInKSk7XG59XG5cbmZ1bmN0aW9uIHRydWVQb3NpdGl2ZXMoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICByZXR1cm4gdGZjLmNhc3QoXG4gICAgICAgIHRmYy5zdW0odGZjLmxvZ2ljYWxBbmQodGZjLmVxdWFsKHlUcnVlLCAxKSwgdGZjLmVxdWFsKHlQcmVkLCAxKSkpLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZmFsc2VOZWdhdGl2ZXMoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICByZXR1cm4gdGZjLmNhc3QoXG4gICAgICAgIHRmYy5zdW0odGZjLmxvZ2ljYWxBbmQodGZjLmVxdWFsKHlUcnVlLCAxKSwgdGZjLmVxdWFsKHlQcmVkLCAwKSkpLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZmFsc2VQb3NpdGl2ZXMoeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICByZXR1cm4gdGZjLmNhc3QoXG4gICAgICAgIHRmYy5zdW0odGZjLmxvZ2ljYWxBbmQodGZjLmVxdWFsKHlUcnVlLCAwKSwgdGZjLmVxdWFsKHlQcmVkLCAxKSkpLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHByZWNpc2lvbih5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNvbnN0IHRwID0gdHJ1ZVBvc2l0aXZlcyh5VHJ1ZSwgeVByZWQpO1xuICAgIGNvbnN0IGZwID0gZmFsc2VQb3NpdGl2ZXMoeVRydWUsIHlQcmVkKTtcblxuICAgIGNvbnN0IGRlbm9taW5hdG9yID0gdGZjLmFkZCh0cCwgZnApO1xuXG4gICAgcmV0dXJuIHRmYy5jYXN0KFxuICAgICAgICB0ZmMud2hlcmUodGZjLmdyZWF0ZXIoZGVub21pbmF0b3IsIDApLCB0ZmMuZGl2KHRwLCBkZW5vbWluYXRvciksIDApLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlY2FsbCh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNvbnN0IHRwID0gdHJ1ZVBvc2l0aXZlcyh5VHJ1ZSwgeVByZWQpO1xuICAgIGNvbnN0IGZuID0gZmFsc2VOZWdhdGl2ZXMoeVRydWUsIHlQcmVkKTtcblxuICAgIGNvbnN0IGRlbm9taW5hdG9yID0gdGZjLmFkZCh0cCwgZm4pO1xuXG4gICAgcmV0dXJuIHRmYy5jYXN0KFxuICAgICAgICB0ZmMud2hlcmUodGZjLmdyZWF0ZXIoZGVub21pbmF0b3IsIDApLCB0ZmMuZGl2KHRwLCBkZW5vbWluYXRvciksIDApLFxuICAgICAgICAnZmxvYXQzMicpO1xuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmFyeUNyb3NzZW50cm9weSh5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIGxvc3NCaW5hcnlDcm9zc2VudHJvcHkoeVRydWUsIHlQcmVkKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUNhdGVnb3JpY2FsQWNjdXJhY3koXG4gICAgeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIGlmICh5VHJ1ZS5yYW5rID09PSB5UHJlZC5yYW5rKSB7XG4gICAgeVRydWUgPSB0ZmMuc3F1ZWV6ZSh5VHJ1ZSwgW3lUcnVlLnJhbmsgLSAxXSk7XG4gIH1cbiAgeVByZWQgPSB0ZmMuYXJnTWF4KHlQcmVkLCAtMSk7XG4gIGlmICh5UHJlZC5kdHlwZSAhPT0geVRydWUuZHR5cGUpIHtcbiAgICB5UHJlZCA9IHRmYy5jYXN0KHlQcmVkLCB5VHJ1ZS5kdHlwZSk7XG4gIH1cbiAgcmV0dXJuIHRmYy5jYXN0KHRmYy5lcXVhbCh5VHJ1ZSwgeVByZWQpLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9wS0NhdGVnb3JpY2FsQWNjdXJhY3koeVRydWU6IFRlbnNvciwgeVByZWQ6IFRlbnNvcik6IFRlbnNvciB7XG4gIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VUb3BLQ2F0ZWdvcmljYWxBY2N1cmFjeShcbiAgICB5VHJ1ZTogVGVuc29yLCB5UHJlZDogVGVuc29yKTogVGVuc29yIHtcbiAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbn1cblxuLy8gQWxpYXNlcy5cbmV4cG9ydCBjb25zdCBtc2UgPSBtZWFuU3F1YXJlZEVycm9yO1xuZXhwb3J0IGNvbnN0IE1TRSA9IG1lYW5TcXVhcmVkRXJyb3I7XG5leHBvcnQgY29uc3QgbWFlID0gbWVhbkFic29sdXRlRXJyb3I7XG5leHBvcnQgY29uc3QgTUFFID0gbWVhbkFic29sdXRlRXJyb3I7XG5leHBvcnQgY29uc3QgbWFwZSA9IG1lYW5BYnNvbHV0ZVBlcmNlbnRhZ2VFcnJvcjtcbmV4cG9ydCBjb25zdCBNQVBFID0gbWVhbkFic29sdXRlUGVyY2VudGFnZUVycm9yO1xuZXhwb3J0IGNvbnN0IGNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5ID0gY2F0ZWdvcmljYWxDcm9zc2VudHJvcHlMb3NzO1xuZXhwb3J0IGNvbnN0IGNvc2luZSA9IGNvc2luZVByb3hpbWl0eTtcbmV4cG9ydCBjb25zdCBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weSA9IHNwYXJzZUNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5TG9zcztcblxuLy8gVE9ETyhjYWlzLCBuaWVsc2VuZSk6IEFkZCBzZXJpYWxpemUoKS5cblxuZXhwb3J0IGNvbnN0IG1ldHJpY3NNYXA6IHtbZnVuY3Rpb25OYW1lOiBzdHJpbmddOiBMb3NzT3JNZXRyaWNGbn0gPSB7XG4gIGJpbmFyeUFjY3VyYWN5LFxuICBjYXRlZ29yaWNhbEFjY3VyYWN5LFxuICBwcmVjaXNpb24sXG4gIGNhdGVnb3JpY2FsQ3Jvc3NlbnRyb3B5LFxuICBzcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weSxcbiAgbXNlLFxuICBNU0UsXG4gIG1hZSxcbiAgTUFFLFxuICBtYXBlLFxuICBNQVBFLFxuICBjb3NpbmVcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXQoaWRlbnRpZmllcjogc3RyaW5nfExvc3NPck1ldHJpY0ZuKTogTG9zc09yTWV0cmljRm4ge1xuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnICYmIGlkZW50aWZpZXIgaW4gbWV0cmljc01hcCkge1xuICAgIHJldHVybiBtZXRyaWNzTWFwW2lkZW50aWZpZXJdO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJyAmJiBpZGVudGlmaWVyICE9IG51bGwpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihgVW5rbm93biBtZXRyaWMgJHtpZGVudGlmaWVyfWApO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBzaG9ydGN1dCBmdW5jdGlvbiBuYW1lLlxuICpcbiAqIElmIHRoZSBmbiBuYW1lIGlzIGEgc3RyaW5nLFxuICogICBkaXJlY3RseSByZXR1cm4gdGhlIHN0cmluZyBuYW1lLlxuICogSWYgdGhlIGZ1bmN0aW9uIGlzIGluY2x1ZGVkIGluIG1ldHJpY3NNYXAgb3IgbG9zc2VzTWFwLFxuICogICByZXR1cm4ga2V5IG9mIHRoZSBtYXAuXG4gKiAgIC0gSWYgdGhlIGZ1bmN0aW9uIHJlbGF0aXZlIHRvIG11bHRpcGxlIGtleXMsXG4gKiAgICAgcmV0dXJuIHRoZSBmaXJzdCBmb3VuZCBrZXkgYXMgdGhlIGZ1bmN0aW9uIG5hbWUuXG4gKiAgIC0gSWYgdGhlIGZ1bmN0aW9uIGV4aXN0cyBpbiBib3RoIGxvc3Nlc01hcCBhbmQgbWV0cmljc01hcCxcbiAqICAgICBzZWFyY2ggbG9zc2VzTWFwIGZpcnN0LlxuICogSWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBpbmNsdWRlZCBpbiBtZXRyaWNzTWFwIG9yIGxvc3Nlc01hcCxcbiAqICAgcmV0dXJuIHRoZSBmdW5jdGlvbiBuYW1lLlxuICpcbiAqIEBwYXJhbSBmbiBsb3NzIGZ1bmN0aW9uLCBtZXRyaWMgZnVuY3Rpb24sIG9yIHNob3J0IGN1dCBuYW1lLlxuICogQHJldHVybnMgTG9zcyBvciBNZXRyaWMgbmFtZSBpbiBzdHJpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb3NzT3JNZXRyaWNOYW1lKGZuOiBzdHJpbmd8TG9zc09yTWV0cmljRm4pOiBzdHJpbmcge1xuICB1dGlsLmFzc2VydChmbiAhPT0gbnVsbCwgYFVua25vd24gTG9zc09yTWV0cmljRm4gJHtmbn1gKTtcbiAgaWYgKHR5cGVvZiBmbiA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZm47XG4gIH0gZWxzZSB7XG4gICAgbGV0IGZuTmFtZTtcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhsb3NzZXNNYXApKSB7XG4gICAgICBpZiAobG9zc2VzTWFwW2tleV0gPT09IGZuKSB7XG4gICAgICAgIGZuTmFtZSA9IGtleTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZuTmFtZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMobWV0cmljc01hcCkpIHtcbiAgICAgIGlmIChtZXRyaWNzTWFwW2tleV0gPT09IGZuKSB7XG4gICAgICAgIGZuTmFtZSA9IGtleTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChmbk5hbWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZuTmFtZTtcbiAgICB9XG4gICAgcmV0dXJuIChmbiBhcyBGdW5jdGlvbikubmFtZTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Optimizers.\n */\nimport { train } from '@tensorflow/tfjs-core';\nimport { epsilon } from './backend/common';\nimport { ValueError } from './errors';\n// Add (de)serialize()\n// Porting note: This diverges from the PyKeras implementation and may need to\n// change based on (de)serialization requirements.\nexport function getOptimizer(identifier) {\n    const optimizerMap = {\n        'Adagrad': () => train.adagrad(0.01),\n        'Adadelta': () => train.adadelta(1, 0.95, epsilon()),\n        'Adam': () => train.adam(0.001, 0.9, 0.999, epsilon()),\n        'Adamax': () => train.adamax(0.002, 0.9, 0.999, epsilon(), 0),\n        'RMSProp': () => train.rmsprop(0.001, 0.9, 0, epsilon()),\n        'SGD': () => train.sgd(0.01)\n    };\n    optimizerMap['adagrad'] = optimizerMap['Adagrad'];\n    optimizerMap['adadelta'] = optimizerMap['Adadelta'];\n    optimizerMap['adam'] = optimizerMap['Adam'];\n    optimizerMap['adamax'] = optimizerMap['Adamax'];\n    optimizerMap['rmsprop'] = optimizerMap['RMSProp'];\n    optimizerMap['sgd'] = optimizerMap['SGD'];\n    if (identifier in optimizerMap) {\n        return optimizerMap[identifier]();\n    }\n    throw new ValueError(`Unknown Optimizer ${identifier}`);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3B0aW1pemVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9vcHRpbWl6ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQVksS0FBSyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRXpDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxVQUFVLENBQUM7QUFFcEMsc0JBQXNCO0FBRXRCLDhFQUE4RTtBQUM5RSxrREFBa0Q7QUFDbEQsTUFBTSxVQUFVLFlBQVksQ0FBQyxVQUFrQjtJQUM3QyxNQUFNLFlBQVksR0FBK0M7UUFDL0QsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3BDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDcEQsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDdEQsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzdELFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDO1FBQ3hELEtBQUssRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQztLQUM3QixDQUFDO0lBQ0YsWUFBWSxDQUFDLFNBQVMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNsRCxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3BELFlBQVksQ0FBQyxNQUFNLENBQUMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxZQUFZLENBQUMsU0FBUyxDQUFDLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQ2xELFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUMsSUFBSSxVQUFVLElBQUksWUFBWSxFQUFFO1FBQzlCLE9BQU8sWUFBWSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7S0FDbkM7SUFDRCxNQUFNLElBQUksVUFBVSxDQUFDLHFCQUFxQixVQUFVLEVBQUUsQ0FBQyxDQUFDO0FBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIE9wdGltaXplcnMuXG4gKi9cblxuaW1wb3J0IHtPcHRpbWl6ZXIsIHRyYWlufSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2Vwc2lsb259IGZyb20gJy4vYmFja2VuZC9jb21tb24nO1xuXG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4vZXJyb3JzJztcblxuLy8gQWRkIChkZSlzZXJpYWxpemUoKVxuXG4vLyBQb3J0aW5nIG5vdGU6IFRoaXMgZGl2ZXJnZXMgZnJvbSB0aGUgUHlLZXJhcyBpbXBsZW1lbnRhdGlvbiBhbmQgbWF5IG5lZWQgdG9cbi8vIGNoYW5nZSBiYXNlZCBvbiAoZGUpc2VyaWFsaXphdGlvbiByZXF1aXJlbWVudHMuXG5leHBvcnQgZnVuY3Rpb24gZ2V0T3B0aW1pemVyKGlkZW50aWZpZXI6IHN0cmluZyk6IE9wdGltaXplciB7XG4gIGNvbnN0IG9wdGltaXplck1hcDoge1tvcHRpbWl6ZXJOYW1lOiBzdHJpbmddOiAoKSA9PiBPcHRpbWl6ZXJ9ID0ge1xuICAgICdBZGFncmFkJzogKCkgPT4gdHJhaW4uYWRhZ3JhZCgwLjAxKSxcbiAgICAnQWRhZGVsdGEnOiAoKSA9PiB0cmFpbi5hZGFkZWx0YSgxLCAwLjk1LCBlcHNpbG9uKCkpLFxuICAgICdBZGFtJzogKCkgPT4gdHJhaW4uYWRhbSgwLjAwMSwgMC45LCAwLjk5OSwgZXBzaWxvbigpKSxcbiAgICAnQWRhbWF4JzogKCkgPT4gdHJhaW4uYWRhbWF4KDAuMDAyLCAwLjksIDAuOTk5LCBlcHNpbG9uKCksIDApLFxuICAgICdSTVNQcm9wJzogKCkgPT4gdHJhaW4ucm1zcHJvcCgwLjAwMSwgMC45LCAwLCBlcHNpbG9uKCkpLFxuICAgICdTR0QnOiAoKSA9PiB0cmFpbi5zZ2QoMC4wMSlcbiAgfTtcbiAgb3B0aW1pemVyTWFwWydhZGFncmFkJ10gPSBvcHRpbWl6ZXJNYXBbJ0FkYWdyYWQnXTtcbiAgb3B0aW1pemVyTWFwWydhZGFkZWx0YSddID0gb3B0aW1pemVyTWFwWydBZGFkZWx0YSddO1xuICBvcHRpbWl6ZXJNYXBbJ2FkYW0nXSA9IG9wdGltaXplck1hcFsnQWRhbSddO1xuICBvcHRpbWl6ZXJNYXBbJ2FkYW1heCddID0gb3B0aW1pemVyTWFwWydBZGFtYXgnXTtcbiAgb3B0aW1pemVyTWFwWydybXNwcm9wJ10gPSBvcHRpbWl6ZXJNYXBbJ1JNU1Byb3AnXTtcbiAgb3B0aW1pemVyTWFwWydzZ2QnXSA9IG9wdGltaXplck1hcFsnU0dEJ107XG5cbiAgaWYgKGlkZW50aWZpZXIgaW4gb3B0aW1pemVyTWFwKSB7XG4gICAgcmV0dXJuIG9wdGltaXplck1hcFtpZGVudGlmaWVyXSgpO1xuICB9XG4gIHRocm93IG5ldyBWYWx1ZUVycm9yKGBVbmtub3duIE9wdGltaXplciAke2lkZW50aWZpZXJ9YCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/** Utility functions related to user-defined metadata. */\n// Maximum recommended serialized size for user-defined metadata.\n// Beyond this limit, a warning message will be printed during model loading and\n// saving.\nexport const MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH = 1 * 1024 * 1024;\n/**\n * Check validity of user-defined metadata.\n *\n * @param userDefinedMetadata\n * @param modelName Name of the model that the user-defined metadata belongs to.\n *   Used during construction of error messages.\n * @param checkSize Whether to check the size of the metadata is under\n *   recommended limit. Default: `false`. If `true`, will try stringify the\n *   JSON object and print a console warning if the serialzied size is above the\n *   limit.\n * @throws Error if `userDefinedMetadata` is not a plain JSON object.\n */\nexport function checkUserDefinedMetadata(userDefinedMetadata, modelName, checkSize = false) {\n    if (userDefinedMetadata == null ||\n        typeof userDefinedMetadata !== 'object' ||\n        Object.getPrototypeOf(userDefinedMetadata) !== Object.prototype ||\n        !plainObjectCheck(userDefinedMetadata)) {\n        throw new Error('User-defined metadata is expected to be a JSON object, but is not.');\n    }\n    if (checkSize) {\n        const out = JSON.stringify(userDefinedMetadata);\n        if (out.length > MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH) {\n            console.warn(`User-defined metadata of model \"${modelName}\" is too large in ` +\n                `size (length=${out.length} when serialized). It is not ` +\n                `recommended to store such large objects in user-defined metadata. ` +\n                `Please make sure its serialized length is <= ` +\n                `${MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH}.`);\n        }\n    }\n}\n/**\n * Check if an input is plain JSON object or any valid subfield of it.\n *\n * @param x The input to be checked.\n * @param assertObject Whether to assert `x` is a JSON object, i.e., reject\n *   cases of arrays and primitives.\n * @return Returns `true` if and only if `x` is a plain JSON object,\n *   a JSON-valid primitive including string, number, boolean and null,\n *   or an array of the said types.\n */\n// tslint:disable-next-line:no-any\nexport function plainObjectCheck(x) {\n    if (x === null) {\n        // Note: typeof `null` is 'object', and `null` is valid in JSON.\n        return true;\n    }\n    else if (typeof x === 'object') {\n        if (Object.getPrototypeOf(x) === Object.prototype) {\n            // `x` is a JavaScript object and its prototype is Object.\n            const keys = Object.keys(x);\n            for (const key of keys) {\n                if (typeof key !== 'string') {\n                    // JSON keys must be strings.\n                    return false;\n                }\n                if (!plainObjectCheck(x[key])) { // Recursive call.\n                    return false;\n                }\n            }\n            return true;\n        }\n        else {\n            // `x` is a JavaScript object but its prototype is not Object.\n            if (Array.isArray(x)) {\n                // `x` is a JavaScript array.\n                for (const item of x) {\n                    if (!plainObjectCheck(item)) { // Recursive call.\n                        return false;\n                    }\n                }\n                return true;\n            }\n            else {\n                // `x` is a JavaScript object and its prototype is not Object,\n                // and it's not an Array. I.e., it's a complex object such as\n                // `Error` and `Date`.\n                return false;\n            }\n        }\n    }\n    else {\n        // `x` is not a JavaScript object or `null`.\n        const xType = typeof x;\n        return xType === 'string' || xType === 'number' || xType === 'boolean';\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlcl9kZWZpbmVkX21ldGFkYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL3VzZXJfZGVmaW5lZF9tZXRhZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILDBEQUEwRDtBQUUxRCxpRUFBaUU7QUFDakUsZ0ZBQWdGO0FBQ2hGLFVBQVU7QUFDVixNQUFNLENBQUMsTUFBTSwyQ0FBMkMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztBQUUzRTs7Ozs7Ozs7Ozs7R0FXRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FDcEMsbUJBQXVCLEVBQUUsU0FBaUIsRUFBRSxTQUFTLEdBQUcsS0FBSztJQUMvRCxJQUFJLG1CQUFtQixJQUFJLElBQUk7UUFDM0IsT0FBTyxtQkFBbUIsS0FBSyxRQUFRO1FBQ3ZDLE1BQU0sQ0FBQyxjQUFjLENBQUMsbUJBQW1CLENBQUMsS0FBSyxNQUFNLENBQUMsU0FBUztRQUMvRCxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixDQUFDLEVBQUU7UUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FDWCxvRUFBb0UsQ0FBQyxDQUFDO0tBQzNFO0lBRUQsSUFBSSxTQUFTLEVBQUU7UUFDYixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDaEQsSUFBSSxHQUFHLENBQUMsTUFBTSxHQUFHLDJDQUEyQyxFQUFFO1lBQzVELE9BQU8sQ0FBQyxJQUFJLENBQ1IsbUNBQW1DLFNBQVMsb0JBQW9CO2dCQUNoRSxnQkFBZ0IsR0FBRyxDQUFDLE1BQU0sK0JBQStCO2dCQUN6RCxvRUFBb0U7Z0JBQ3BFLCtDQUErQztnQkFDL0MsR0FBRywyQ0FBMkMsR0FBRyxDQUFDLENBQUM7U0FDeEQ7S0FDRjtBQUNILENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxrQ0FBa0M7QUFDbEMsTUFBTSxVQUFVLGdCQUFnQixDQUFDLENBQU07SUFDckMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1FBQ2QsZ0VBQWdFO1FBQ2hFLE9BQU8sSUFBSSxDQUFDO0tBQ2I7U0FBTSxJQUFJLE9BQU8sQ0FBQyxLQUFLLFFBQVEsRUFBRTtRQUNoQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLFNBQVMsRUFBRTtZQUNqRCwwREFBMEQ7WUFDMUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM1QixLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksRUFBRTtnQkFDdEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRLEVBQUU7b0JBQzNCLDZCQUE2QjtvQkFDN0IsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUcsa0JBQWtCO29CQUNsRCxPQUFPLEtBQUssQ0FBQztpQkFDZDthQUNGO1lBQ0QsT0FBTyxJQUFJLENBQUM7U0FDYjthQUFNO1lBQ0wsOERBQThEO1lBQzlELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDcEIsNkJBQTZCO2dCQUM3QixLQUFLLE1BQU0sSUFBSSxJQUFJLENBQUMsRUFBRTtvQkFDcEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUcsa0JBQWtCO3dCQUNoRCxPQUFPLEtBQUssQ0FBQztxQkFDZDtpQkFDRjtnQkFDRCxPQUFPLElBQUksQ0FBQzthQUNiO2lCQUFNO2dCQUNMLDhEQUE4RDtnQkFDOUQsNkRBQTZEO2dCQUM3RCxzQkFBc0I7Z0JBQ3RCLE9BQU8sS0FBSyxDQUFDO2FBQ2Q7U0FDRjtLQUNGO1NBQU07UUFDTCw0Q0FBNEM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLENBQUM7UUFDdkIsT0FBTyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFNBQVMsQ0FBQztLQUN4RTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKiogVXRpbGl0eSBmdW5jdGlvbnMgcmVsYXRlZCB0byB1c2VyLWRlZmluZWQgbWV0YWRhdGEuICovXG5cbi8vIE1heGltdW0gcmVjb21tZW5kZWQgc2VyaWFsaXplZCBzaXplIGZvciB1c2VyLWRlZmluZWQgbWV0YWRhdGEuXG4vLyBCZXlvbmQgdGhpcyBsaW1pdCwgYSB3YXJuaW5nIG1lc3NhZ2Ugd2lsbCBiZSBwcmludGVkIGR1cmluZyBtb2RlbCBsb2FkaW5nIGFuZFxuLy8gc2F2aW5nLlxuZXhwb3J0IGNvbnN0IE1BWF9VU0VSX0RFRklORURfTUVUQURBVEFfU0VSSUFMSVpFRF9MRU5HVEggPSAxICogMTAyNCAqIDEwMjQ7XG5cbi8qKlxuICogQ2hlY2sgdmFsaWRpdHkgb2YgdXNlci1kZWZpbmVkIG1ldGFkYXRhLlxuICpcbiAqIEBwYXJhbSB1c2VyRGVmaW5lZE1ldGFkYXRhXG4gKiBAcGFyYW0gbW9kZWxOYW1lIE5hbWUgb2YgdGhlIG1vZGVsIHRoYXQgdGhlIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBiZWxvbmdzIHRvLlxuICogICBVc2VkIGR1cmluZyBjb25zdHJ1Y3Rpb24gb2YgZXJyb3IgbWVzc2FnZXMuXG4gKiBAcGFyYW0gY2hlY2tTaXplIFdoZXRoZXIgdG8gY2hlY2sgdGhlIHNpemUgb2YgdGhlIG1ldGFkYXRhIGlzIHVuZGVyXG4gKiAgIHJlY29tbWVuZGVkIGxpbWl0LiBEZWZhdWx0OiBgZmFsc2VgLiBJZiBgdHJ1ZWAsIHdpbGwgdHJ5IHN0cmluZ2lmeSB0aGVcbiAqICAgSlNPTiBvYmplY3QgYW5kIHByaW50IGEgY29uc29sZSB3YXJuaW5nIGlmIHRoZSBzZXJpYWx6aWVkIHNpemUgaXMgYWJvdmUgdGhlXG4gKiAgIGxpbWl0LlxuICogQHRocm93cyBFcnJvciBpZiBgdXNlckRlZmluZWRNZXRhZGF0YWAgaXMgbm90IGEgcGxhaW4gSlNPTiBvYmplY3QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjaGVja1VzZXJEZWZpbmVkTWV0YWRhdGEoXG4gICAgdXNlckRlZmluZWRNZXRhZGF0YToge30sIG1vZGVsTmFtZTogc3RyaW5nLCBjaGVja1NpemUgPSBmYWxzZSk6IHZvaWQge1xuICBpZiAodXNlckRlZmluZWRNZXRhZGF0YSA9PSBudWxsIHx8XG4gICAgICB0eXBlb2YgdXNlckRlZmluZWRNZXRhZGF0YSAhPT0gJ29iamVjdCcgfHxcbiAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZih1c2VyRGVmaW5lZE1ldGFkYXRhKSAhPT0gT2JqZWN0LnByb3RvdHlwZSB8fFxuICAgICAgIXBsYWluT2JqZWN0Q2hlY2sodXNlckRlZmluZWRNZXRhZGF0YSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdVc2VyLWRlZmluZWQgbWV0YWRhdGEgaXMgZXhwZWN0ZWQgdG8gYmUgYSBKU09OIG9iamVjdCwgYnV0IGlzIG5vdC4nKTtcbiAgfVxuXG4gIGlmIChjaGVja1NpemUpIHtcbiAgICBjb25zdCBvdXQgPSBKU09OLnN0cmluZ2lmeSh1c2VyRGVmaW5lZE1ldGFkYXRhKTtcbiAgICBpZiAob3V0Lmxlbmd0aCA+IE1BWF9VU0VSX0RFRklORURfTUVUQURBVEFfU0VSSUFMSVpFRF9MRU5HVEgpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgVXNlci1kZWZpbmVkIG1ldGFkYXRhIG9mIG1vZGVsIFwiJHttb2RlbE5hbWV9XCIgaXMgdG9vIGxhcmdlIGluIGAgK1xuICAgICAgICAgIGBzaXplIChsZW5ndGg9JHtvdXQubGVuZ3RofSB3aGVuIHNlcmlhbGl6ZWQpLiBJdCBpcyBub3QgYCArXG4gICAgICAgICAgYHJlY29tbWVuZGVkIHRvIHN0b3JlIHN1Y2ggbGFyZ2Ugb2JqZWN0cyBpbiB1c2VyLWRlZmluZWQgbWV0YWRhdGEuIGAgK1xuICAgICAgICAgIGBQbGVhc2UgbWFrZSBzdXJlIGl0cyBzZXJpYWxpemVkIGxlbmd0aCBpcyA8PSBgICtcbiAgICAgICAgICBgJHtNQVhfVVNFUl9ERUZJTkVEX01FVEFEQVRBX1NFUklBTElaRURfTEVOR1RIfS5gKTtcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBDaGVjayBpZiBhbiBpbnB1dCBpcyBwbGFpbiBKU09OIG9iamVjdCBvciBhbnkgdmFsaWQgc3ViZmllbGQgb2YgaXQuXG4gKlxuICogQHBhcmFtIHggVGhlIGlucHV0IHRvIGJlIGNoZWNrZWQuXG4gKiBAcGFyYW0gYXNzZXJ0T2JqZWN0IFdoZXRoZXIgdG8gYXNzZXJ0IGB4YCBpcyBhIEpTT04gb2JqZWN0LCBpLmUuLCByZWplY3RcbiAqICAgY2FzZXMgb2YgYXJyYXlzIGFuZCBwcmltaXRpdmVzLlxuICogQHJldHVybiBSZXR1cm5zIGB0cnVlYCBpZiBhbmQgb25seSBpZiBgeGAgaXMgYSBwbGFpbiBKU09OIG9iamVjdCxcbiAqICAgYSBKU09OLXZhbGlkIHByaW1pdGl2ZSBpbmNsdWRpbmcgc3RyaW5nLCBudW1iZXIsIGJvb2xlYW4gYW5kIG51bGwsXG4gKiAgIG9yIGFuIGFycmF5IG9mIHRoZSBzYWlkIHR5cGVzLlxuICovXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG5leHBvcnQgZnVuY3Rpb24gcGxhaW5PYmplY3RDaGVjayh4OiBhbnkpOiBib29sZWFuIHtcbiAgaWYgKHggPT09IG51bGwpIHtcbiAgICAvLyBOb3RlOiB0eXBlb2YgYG51bGxgIGlzICdvYmplY3QnLCBhbmQgYG51bGxgIGlzIHZhbGlkIGluIEpTT04uXG4gICAgcmV0dXJuIHRydWU7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHggPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSA9PT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgICAgLy8gYHhgIGlzIGEgSmF2YVNjcmlwdCBvYmplY3QgYW5kIGl0cyBwcm90b3R5cGUgaXMgT2JqZWN0LlxuICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHgpO1xuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykge1xuICAgICAgICBpZiAodHlwZW9mIGtleSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAvLyBKU09OIGtleXMgbXVzdCBiZSBzdHJpbmdzLlxuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXBsYWluT2JqZWN0Q2hlY2soeFtrZXldKSkgeyAgLy8gUmVjdXJzaXZlIGNhbGwuXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gYHhgIGlzIGEgSmF2YVNjcmlwdCBvYmplY3QgYnV0IGl0cyBwcm90b3R5cGUgaXMgbm90IE9iamVjdC5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHgpKSB7XG4gICAgICAgIC8vIGB4YCBpcyBhIEphdmFTY3JpcHQgYXJyYXkuXG4gICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiB4KSB7XG4gICAgICAgICAgaWYgKCFwbGFpbk9iamVjdENoZWNrKGl0ZW0pKSB7ICAvLyBSZWN1cnNpdmUgY2FsbC5cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBgeGAgaXMgYSBKYXZhU2NyaXB0IG9iamVjdCBhbmQgaXRzIHByb3RvdHlwZSBpcyBub3QgT2JqZWN0LFxuICAgICAgICAvLyBhbmQgaXQncyBub3QgYW4gQXJyYXkuIEkuZS4sIGl0J3MgYSBjb21wbGV4IG9iamVjdCBzdWNoIGFzXG4gICAgICAgIC8vIGBFcnJvcmAgYW5kIGBEYXRlYC5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBgeGAgaXMgbm90IGEgSmF2YVNjcmlwdCBvYmplY3Qgb3IgYG51bGxgLlxuICAgIGNvbnN0IHhUeXBlID0gdHlwZW9mIHg7XG4gICAgcmV0dXJuIHhUeXBlID09PSAnc3RyaW5nJyB8fCB4VHlwZSA9PT0gJ251bWJlcicgfHwgeFR5cGUgPT09ICdib29sZWFuJztcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { countParamsInWeights } from './variable_utils';\n/**\n * Print the summary of a LayersModel object.\n *\n * @param model tf.LayersModel instance.\n * @param lineLength Total length of printed lines. Set this to adapt to the\n *   display to different terminal or console sizes.\n * @param positions Relative or absolute positions of log elements in each\n *   line. Each number corresponds to right-most (i.e., ending) position of a\n *   column.\n *   If not provided, defaults to `[0.45, 0.85, 1]` for sequential-like\n *   models and `[0.33, 0.55, 0.67, 1]` for non-sequential like models.\n * @param printFn Print function to use.\n *   It will be called on each line of the summary. You can provide a custom\n *   function in order to capture the string summary. Defaults to `console.log`.\n */\nexport function printSummary(model, lineLength, positions, \n// tslint:disable-next-line:no-any\nprintFn = console.log) {\n    const sequentialLike = isModelSequentialLike(model);\n    // Header names for different log elements.\n    const toDisplay = ['Layer (type)', 'Input Shape', 'Output shape', 'Param #'];\n    if (sequentialLike) {\n        lineLength = lineLength || 90;\n        positions = positions || [0.32, 0.61, 0.89, 1];\n    }\n    else {\n        lineLength = lineLength || 115;\n        positions = positions || [0.24, 0.48, 0.70, 0.80, 1];\n        // Header names for different log elements.\n    }\n    if (positions[positions.length - 1] <= 1) {\n        // `positions` is relative. Convert it to absolute positioning.\n        positions = positions.map(p => Math.floor(lineLength * p));\n    }\n    let relevantNodes;\n    if (!sequentialLike) {\n        toDisplay.push('Receives inputs');\n        relevantNodes = [];\n        for (const depth in model.nodesByDepth) {\n            relevantNodes.push(...model.nodesByDepth[depth]);\n        }\n    }\n    printFn('_'.repeat(lineLength));\n    printRow(toDisplay, positions, printFn);\n    printFn('='.repeat(lineLength));\n    const layers = model.layers;\n    for (let i = 0; i < layers.length; ++i) {\n        if (sequentialLike) {\n            printLayerSummary(layers[i], positions, printFn);\n        }\n        else {\n            printLayerSummaryWithConnections(layers[i], positions, relevantNodes, printFn);\n        }\n        printFn((i === layers.length - 1 ? '=' : '_').repeat(lineLength));\n    }\n    // tslint:disable-next-line:no-any\n    model.checkTrainableWeightsConsistency();\n    const trainableCount = countTrainableParams(model);\n    const nonTrainableCount = countParamsInWeights(model.nonTrainableWeights);\n    printFn(`Total params: ${trainableCount + nonTrainableCount}`);\n    printFn(`Trainable params: ${trainableCount}`);\n    printFn(`Non-trainable params: ${nonTrainableCount}`);\n    printFn('_'.repeat(lineLength));\n}\nfunction countTrainableParams(model) {\n    let trainableCount;\n    // tslint:disable:no-any\n    if (model.collectedTrainableWeights != null) {\n        trainableCount =\n            countParamsInWeights(model.collectedTrainableWeights);\n    }\n    else {\n        trainableCount = countParamsInWeights(model.trainableWeights);\n    }\n    // tslint:enable:no-any\n    return trainableCount;\n}\nfunction isModelSequentialLike(model) {\n    let sequentialLike = true;\n    const nodesByDepth = [];\n    const nodes = [];\n    for (const depth in model.nodesByDepth) {\n        nodesByDepth.push(model.nodesByDepth[depth]);\n    }\n    for (const depthNodes of nodesByDepth) {\n        if (depthNodes.length > 1 ||\n            depthNodes.length === 1 && depthNodes[0].inboundLayers.length > 1) {\n            sequentialLike = false;\n            break;\n        }\n        nodes.push(...depthNodes);\n    }\n    if (sequentialLike) {\n        // Search for shared layers.\n        for (const layer of model.layers) {\n            let flag = false;\n            for (const node of layer.inboundNodes) {\n                if (nodes.indexOf(node) !== -1) {\n                    if (flag) {\n                        sequentialLike = false;\n                        break;\n                    }\n                    else {\n                        flag = true;\n                    }\n                }\n            }\n            if (!sequentialLike) {\n                break;\n            }\n        }\n    }\n    return sequentialLike;\n}\nfunction printRow(fields, positions, \n// tslint:disable-next-line:no-any\nprintFn = console.log) {\n    let line = '';\n    for (let i = 0; i < fields.length; ++i) {\n        if (i > 0) {\n            line = line.slice(0, line.length - 1) + ' ';\n        }\n        line += fields[i];\n        line = line.slice(0, positions[i]);\n        line += ' '.repeat(positions[i] - line.length);\n    }\n    printFn(line);\n}\n/**\n * Prints a summary for a single Layer, without connectivity information.\n *\n * @param layer: Layer instance to print.\n */\nfunction printLayerSummary(layer, positions, \n// tslint:disable-next-line:no-any\nprintFn) {\n    let outputShape;\n    let inputShape;\n    try {\n        inputShape = (layer.inboundNodes.map(x => JSON.stringify(x.inputShapes))).join(',');\n    }\n    catch (err) {\n        inputShape = 'multiple';\n    }\n    try {\n        outputShape = JSON.stringify(layer.outputShape);\n    }\n    catch (err) {\n        outputShape = 'multiple';\n    }\n    const name = layer.name;\n    const className = layer.getClassName();\n    const fields = [`${name} (${className})`, inputShape,\n        outputShape, layer.countParams().toString()];\n    printRow(fields, positions, printFn);\n}\n/**\n * Prints a summary for a single Layer, with connectivity information.\n */\nfunction printLayerSummaryWithConnections(layer, positions, relevantNodes, \n// tslint:disable-next-line:no-any\nprintFn) {\n    let outputShape;\n    let inputShape;\n    try {\n        inputShape = (layer.inboundNodes.map(x => JSON.stringify(x.inputShapes))).join(',');\n    }\n    catch (err) {\n        inputShape = 'multiple';\n    }\n    try {\n        outputShape = JSON.stringify(layer.outputShape);\n    }\n    catch (err) {\n        outputShape = 'multiple';\n    }\n    const connections = [];\n    for (const node of layer.inboundNodes) {\n        if (relevantNodes != null && relevantNodes.length > 0 &&\n            relevantNodes.indexOf(node) === -1) {\n            continue;\n        }\n        for (let i = 0; i < node.inboundLayers.length; ++i) {\n            const inboundLayer = node.inboundLayers[i].name;\n            const inboundLayerIndex = node.nodeIndices[i];\n            const inboundTensorIndex = node.tensorIndices[i];\n            connections.push(`${inboundLayer}[${inboundLayerIndex}][${inboundTensorIndex}]`);\n        }\n    }\n    const name = layer.name;\n    const className = layer.getClassName();\n    const firstConnection = connections.length === 0 ? '' : connections[0];\n    const fields = [\n        `${name} (${className})`, inputShape,\n        outputShape, layer.countParams().toString(),\n        firstConnection\n    ];\n    printRow(fields, positions, printFn);\n    for (let i = 1; i < connections.length; ++i) {\n        printRow(['', '', '', '', connections[i]], positions, printFn);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5ZXJfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvdXRpbHMvbGF5ZXJfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFJSCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUV0RDs7Ozs7Ozs7Ozs7Ozs7R0FjRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQ3hCLEtBQWdCLEVBQUUsVUFBbUIsRUFBRSxTQUFvQjtBQUMzRCxrQ0FBa0M7QUFDbEMsVUFDSSxPQUFPLENBQUMsR0FBRztJQUNqQixNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwRCwyQ0FBMkM7SUFDM0MsTUFBTSxTQUFTLEdBQWEsQ0FBQyxjQUFjLEVBQUUsYUFBYSxFQUFFLGNBQWMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN2RixJQUFJLGNBQWMsRUFBRTtRQUNsQixVQUFVLEdBQUcsVUFBVSxJQUFJLEVBQUUsQ0FBQztRQUM5QixTQUFTLEdBQUcsU0FBUyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDaEQ7U0FBTTtRQUNMLFVBQVUsR0FBRyxVQUFVLElBQUksR0FBRyxDQUFDO1FBQy9CLFNBQVMsR0FBRyxTQUFTLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDckQsMkNBQTJDO0tBQzVDO0lBRUQsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUU7UUFDeEMsK0RBQStEO1FBQy9ELFNBQVMsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdB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ICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb250YWluZXJ9IGZyb20gJy4uL2VuZ2luZS9jb250YWluZXInO1xuaW1wb3J0IHtMYXllciwgTm9kZX0gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7Y291bnRQYXJhbXNJbldlaWdodHN9IGZyb20gJy4vdmFyaWFibGVfdXRpbHMnO1xuXG4vKipcbiAqIFByaW50IHRoZSBzdW1tYXJ5IG9mIGEgTGF5ZXJzTW9kZWwgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBtb2RlbCB0Zi5MYXllcnNNb2RlbCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBsaW5lTGVuZ3RoIFRvdGFsIGxlbmd0aCBvZiBwcmludGVkIGxpbmVzLiBTZXQgdGhpcyB0byBhZGFwdCB0byB0aGVcbiAqICAgZGlzcGxheSB0byBkaWZmZXJlbnQgdGVybWluYWwgb3IgY29uc29sZSBzaXplcy5cbiAqIEBwYXJhbSBwb3NpdGlvbnMgUmVsYXRpdmUgb3IgYWJzb2x1dGUgcG9zaXRpb25zIG9mIGxvZyBlbGVtZW50cyBpbiBlYWNoXG4gKiAgIGxpbmUuIEVhY2ggbnVtYmVyIGNvcnJlc3BvbmRzIHRvIHJpZ2h0LW1vc3QgKGkuZS4sIGVuZGluZykgcG9zaXRpb24gb2YgYVxuICogICBjb2x1bW4uXG4gKiAgIElmIG5vdCBwcm92aWRlZCwgZGVmYXVsdHMgdG8gYFswLjQ1LCAwLjg1LCAxXWAgZm9yIHNlcXVlbnRpYWwtbGlrZVxuICogICBtb2RlbHMgYW5kIGBbMC4zMywgMC41NSwgMC42NywgMV1gIGZvciBub24tc2VxdWVudGlhbCBsaWtlIG1vZGVscy5cbiAqIEBwYXJhbSBwcmludEZuIFByaW50IGZ1bmN0aW9uIHRvIHVzZS5cbiAqICAgSXQgd2lsbCBiZSBjYWxsZWQgb24gZWFjaCBsaW5lIG9mIHRoZSBzdW1tYXJ5LiBZb3UgY2FuIHByb3ZpZGUgYSBjdXN0b21cbiAqICAgZnVuY3Rpb24gaW4gb3JkZXIgdG8gY2FwdHVyZSB0aGUgc3RyaW5nIHN1bW1hcnkuIERlZmF1bHRzIHRvIGBjb25zb2xlLmxvZ2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludFN1bW1hcnkoXG4gICAgbW9kZWw6IENvbnRhaW5lciwgbGluZUxlbmd0aD86IG51bWJlciwgcG9zaXRpb25zPzogbnVtYmVyW10sXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHByaW50Rm46IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQgPVxuICAgICAgICBjb25zb2xlLmxvZyk6IHZvaWQge1xuICBjb25zdCBzZXF1ZW50aWFsTGlrZSA9IGlzTW9kZWxTZXF1ZW50aWFsTGlrZShtb2RlbCk7XG5cbiAgLy8gSGVhZGVyIG5hbWVzIGZvciBkaWZmZXJlbnQgbG9nIGVsZW1lbnRzLlxuICBjb25zdCB0b0Rpc3BsYXk6IHN0cmluZ1tdID0gWydMYXllciAodHlwZSknLCAnSW5wdXQgU2hhcGUnLCAnT3V0cHV0IHNoYXBlJywgJ1BhcmFtICMnXTtcbiAgaWYgKHNlcXVlbnRpYWxMaWtlKSB7XG4gICAgbGluZUxlbmd0aCA9IGxpbmVMZW5ndGggfHwgOTA7XG4gICAgcG9zaXRpb25zID0gcG9zaXRpb25zIHx8IFswLjMyLCAwLjYxLCAwLjg5LCAxXTtcbiAgfSBlbHNlIHtcbiAgICBsaW5lTGVuZ3RoID0gbGluZUxlbmd0aCB8fCAxMTU7XG4gICAgcG9zaXRpb25zID0gcG9zaXRpb25zIHx8IFswLjI0LCAwLjQ4LCAwLjcwLCAwLjgwLCAxXTtcbiAgICAvLyBIZWFkZXIgbmFtZXMgZm9yIGRpZmZlcmVudCBsb2cgZWxlbWVudHMuXG4gIH1cblxuICBpZiAocG9zaXRpb25zW3Bvc2l0aW9ucy5sZW5ndGggLSAxXSA8PSAxKSB7XG4gICAgLy8gYHBvc2l0aW9uc2AgaXMgcmVsYXRpdmUuIENvbnZlcnQgaXQgdG8gYWJzb2x1dGUgcG9zaXRpb25pbmcuXG4gICAgcG9zaXRpb25zID0gcG9zaXRpb25zLm1hcChwID0+IE1hdGguZmxvb3IobGluZUxlbmd0aCAqIHApKTtcbiAgfVxuXG4gIGxldCByZWxldmFudE5vZGVzOiBOb2RlW107XG4gIGlmICghc2VxdWVudGlhbExpa2UpIHtcbiAgICB0b0Rpc3BsYXkucHVzaCgnUmVjZWl2ZXMgaW5wdXRzJyk7XG4gICAgcmVsZXZhbnROb2RlcyA9IFtdO1xuICAgIGZvciAoY29uc3QgZGVwdGggaW4gbW9kZWwubm9kZXNCeURlcHRoKSB7XG4gICAgICByZWxldmFudE5vZGVzLnB1c2goLi4ubW9kZWwubm9kZXNCeURlcHRoW2RlcHRoXSk7XG4gICAgfVxuICB9XG5cbiAgcHJpbnRGbignXycucmVwZWF0KGxpbmVMZW5ndGgpKTtcbiAgcHJpbnRSb3codG9EaXNwbGF5LCBwb3NpdGlvbnMsIHByaW50Rm4pO1xuICBwcmludEZuKCc9Jy5yZXBlYXQobGluZUxlbmd0aCkpO1xuXG4gIGNvbnN0IGxheWVycyA9IG1vZGVsLmxheWVycztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXllcnMubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoc2VxdWVudGlhbExpa2UpIHtcbiAgICAgIHByaW50TGF5ZXJTdW1tYXJ5KGxheWVyc1tpXSwgcG9zaXRpb25zLCBwcmludEZuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJpbnRMYXllclN1bW1hcnlXaXRoQ29ubmVjdGlvbnMoXG4gICAgICAgICAgbGF5ZXJzW2ldLCBwb3NpdGlvbnMsIHJlbGV2YW50Tm9kZXMsIHByaW50Rm4pO1xuICAgIH1cbiAgICBwcmludEZuKChpID09PSBsYXllcnMubGVuZ3RoIC0gMSA/ICc9JyA6ICdfJykucmVwZWF0KGxpbmVMZW5ndGgpKTtcbiAgfVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgKG1vZGVsIGFzIGFueSkuY2hlY2tUcmFpbmFibGVXZWlnaHRzQ29uc2lzdGVuY3koKTtcblxuICBjb25zdCB0cmFpbmFibGVDb3VudCA9IGNvdW50VHJhaW5hYmxlUGFyYW1zKG1vZGVsKTtcbiAgY29uc3Qgbm9uVHJhaW5hYmxlQ291bnQgPSBjb3VudFBhcmFtc0luV2VpZ2h0cyhtb2RlbC5ub25UcmFpbmFibGVXZWlnaHRzKTtcblxuICBwcmludEZuKGBUb3RhbCBwYXJhbXM6ICR7dHJhaW5hYmxlQ291bnQgKyBub25UcmFpbmFibGVDb3VudH1gKTtcbiAgcHJpbnRGbihgVHJhaW5hYmxlIHBhcmFtczogJHt0cmFpbmFibGVDb3VudH1gKTtcbiAgcHJpbnRGbihgTm9uLXRyYWluYWJsZSBwYXJhbXM6ICR7bm9uVHJhaW5hYmxlQ291bnR9YCk7XG4gIHByaW50Rm4oJ18nLnJlcGVhdChsaW5lTGVuZ3RoKSk7XG59XG5cbmZ1bmN0aW9uIGNvdW50VHJhaW5hYmxlUGFyYW1zKG1vZGVsOiBDb250YWluZXIpOiBudW1iZXIge1xuICBsZXQgdHJhaW5hYmxlQ291bnQ6IG51bWJlcjtcbiAgLy8gdHNsaW50OmRpc2FibGU6bm8tYW55XG4gIGlmICgobW9kZWwgYXMgYW55KS5jb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzICE9IG51bGwpIHtcbiAgICB0cmFpbmFibGVDb3VudCA9XG4gICAgICAgIGNvdW50UGFyYW1zSW5XZWlnaHRzKChtb2RlbCBhcyBhbnkpLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHMpO1xuICB9IGVsc2Uge1xuICAgIHRyYWluYWJsZUNvdW50ID0gY291bnRQYXJhbXNJbldlaWdodHMobW9kZWwudHJhaW5hYmxlV2VpZ2h0cyk7XG4gIH1cbiAgLy8gdHNsaW50OmVuYWJsZTpuby1hbnlcbiAgcmV0dXJuIHRyYWluYWJsZUNvdW50O1xufVxuXG5mdW5jdGlvbiBpc01vZGVsU2VxdWVudGlhbExpa2UobW9kZWw6IENvbnRhaW5lcik6IGJvb2xlYW4ge1xuICBsZXQgc2VxdWVudGlhbExpa2UgPSB0cnVlO1xuICBjb25zdCBub2Rlc0J5RGVwdGg6IE5vZGVbXVtdID0gW107XG4gIGNvbnN0IG5vZGVzOiBOb2RlW10gPSBbXTtcbiAgZm9yIChjb25zdCBkZXB0aCBpbiBtb2RlbC5ub2Rlc0J5RGVwdGgpIHtcbiAgICBub2Rlc0J5RGVwdGgucHVzaChtb2RlbC5ub2Rlc0J5RGVwdGhbZGVwdGhdKTtcbiAgfVxuICBmb3IgKGNvbnN0IGRlcHRoTm9kZXMgb2Ygbm9kZXNCeURlcHRoKSB7XG4gICAgaWYgKGRlcHRoTm9kZXMubGVuZ3RoID4gMSB8fFxuICAgICAgICBkZXB0aE5vZGVzLmxlbmd0aCA9PT0gMSAmJiBkZXB0aE5vZGVzWzBdLmluYm91bmRMYXllcnMubGVuZ3RoID4gMSkge1xuICAgICAgc2VxdWVudGlhbExpa2UgPSBmYWxzZTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBub2Rlcy5wdXNoKC4uLmRlcHRoTm9kZXMpO1xuICB9XG4gIGlmIChzZXF1ZW50aWFsTGlrZSkge1xuICAgIC8vIFNlYXJjaCBmb3Igc2hhcmVkIGxheWVycy5cbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIG1vZGVsLmxheWVycykge1xuICAgICAgbGV0IGZsYWcgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3Qgbm9kZSBvZiBsYXllci5pbmJvdW5kTm9kZXMpIHtcbiAgICAgICAgaWYgKG5vZGVzLmluZGV4T2Yobm9kZSkgIT09IC0xKSB7XG4gICAgICAgICAgaWYgKGZsYWcpIHtcbiAgICAgICAgICAgIHNlcXVlbnRpYWxMaWtlID0gZmFsc2U7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmxhZyA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIXNlcXVlbnRpYWxMaWtlKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gc2VxdWVudGlhbExpa2U7XG59XG5cbmZ1bmN0aW9uIHByaW50Um93KFxuICAgIGZpZWxkczogc3RyaW5nW10sIHBvc2l0aW9uczogbnVtYmVyW10sXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHByaW50Rm46IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQgPSBjb25zb2xlLmxvZykge1xuICBsZXQgbGluZSA9ICcnO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7ICsraSkge1xuICAgIGlmIChpID4gMCkge1xuICAgICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgbGluZS5sZW5ndGggLSAxKSArICcgJztcbiAgICB9XG4gICAgbGluZSArPSBmaWVsZHNbaV07XG4gICAgbGluZSA9IGxpbmUuc2xpY2UoMCwgcG9zaXRpb25zW2ldKTtcbiAgICBsaW5lICs9ICcgJy5yZXBlYXQocG9zaXRpb25zW2ldIC0gbGluZS5sZW5ndGgpO1xuICB9XG4gIHByaW50Rm4obGluZSk7XG59XG5cbi8qKlxuICogUHJpbnRzIGEgc3VtbWFyeSBmb3IgYSBzaW5nbGUgTGF5ZXIsIHdpdGhvdXQgY29ubmVjdGl2aXR5IGluZm9ybWF0aW9uLlxuICpcbiAqIEBwYXJhbSBsYXllcjogTGF5ZXIgaW5zdGFuY2UgdG8gcHJpbnQuXG4gKi9cbmZ1bmN0aW9uIHByaW50TGF5ZXJTdW1tYXJ5KFxuICAgIGxheWVyOiBMYXllciwgcG9zaXRpb25zOiBudW1iZXJbXSxcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgcHJpbnRGbjogKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkgPT4gdm9pZCkge1xuICBsZXQgb3V0cHV0U2hhcGU6IHN0cmluZztcbiAgbGV0IGlucHV0U2hhcGU6IHN0cmluZztcblxuICB0cnkge1xuICAgIGlucHV0U2hhcGUgPSAobGF5ZXIuaW5ib3VuZE5vZGVzLm1hcChcbiAgICAgIHggPT4gSlNPTi5zdHJpbmdpZnkoeC5pbnB1dFNoYXBlcylcbiAgICApKS5qb2luKCcsJyk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGlucHV0U2hhcGUgPSAnbXVsdGlwbGUnO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBvdXRwdXRTaGFwZSA9IEpTT04uc3RyaW5naWZ5KGxheWVyLm91dHB1dFNoYXBlKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgb3V0cHV0U2hhcGUgPSAnbXVsdGlwbGUnO1xuICB9XG5cbiAgY29uc3QgbmFtZSA9IGxheWVyLm5hbWU7XG4gIGNvbnN0IGNsYXNzTmFtZSA9IGxheWVyLmdldENsYXNzTmFtZSgpO1xuICBjb25zdCBmaWVsZHM6IHN0cmluZ1tdID1cbiAgICAgIFtgJHtuYW1lfSAoJHtjbGFzc05hbWV9KWAsIGlucHV0U2hhcGUsXG4gICAgICBvdXRwdXRTaGFwZSwgbGF5ZXIuY291bnRQYXJhbXMoKS50b1N0cmluZygpXTtcbiAgcHJpbnRSb3coZmllbGRzLCBwb3NpdGlvbnMsIHByaW50Rm4pO1xufVxuXG4vKipcbiAqIFByaW50cyBhIHN1bW1hcnkgZm9yIGEgc2luZ2xlIExheWVyLCB3aXRoIGNvbm5lY3Rpdml0eSBpbmZvcm1hdGlvbi5cbiAqL1xuZnVuY3Rpb24gcHJpbnRMYXllclN1bW1hcnlXaXRoQ29ubmVjdGlvbnMoXG4gICAgbGF5ZXI6IExheWVyLCBwb3NpdGlvbnM6IG51bWJlcltdLCByZWxldmFudE5vZGVzOiBOb2RlW10sXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHByaW50Rm46IChtZXNzYWdlPzogYW55LCAuLi5vcHRpb25hbFBhcmFtczogYW55W10pID0+IHZvaWQpIHtcbiAgbGV0IG91dHB1dFNoYXBlOiBzdHJpbmc7XG4gIGxldCBpbnB1dFNoYXBlOiBzdHJpbmc7XG5cbiAgdHJ5IHtcbiAgICBpbnB1dFNoYXBlID0gKGxheWVyLmluYm91bmROb2Rlcy5tYXAoXG4gICAgICB4ID0+IEpTT04uc3RyaW5naWZ5KHguaW5wdXRTaGFwZXMpXG4gICAgKSkuam9pbignLCcpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBpbnB1dFNoYXBlID0gJ211bHRpcGxlJztcbiAgfVxuXG4gIHRyeSB7XG4gICAgb3V0cHV0U2hhcGUgPSBKU09OLnN0cmluZ2lmeShsYXllci5vdXRwdXRTaGFwZSk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIG91dHB1dFNoYXBlID0gJ211bHRpcGxlJztcbiAgfVxuXG4gIGNvbnN0IGNvbm5lY3Rpb25zOiBzdHJpbmdbXSA9IFtdO1xuICBmb3IgKGNvbnN0IG5vZGUgb2YgbGF5ZXIuaW5ib3VuZE5vZGVzKSB7XG4gICAgaWYgKHJlbGV2YW50Tm9kZXMgIT0gbnVsbCAmJiByZWxldmFudE5vZGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgcmVsZXZhbnROb2Rlcy5pbmRleE9mKG5vZGUpID09PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZS5pbmJvdW5kTGF5ZXJzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBpbmJvdW5kTGF5ZXIgPSBub2RlLmluYm91bmRMYXllcnNbaV0ubmFtZTtcbiAgICAgIGNvbnN0IGluYm91bmRMYXllckluZGV4ID0gbm9kZS5ub2RlSW5kaWNlc1tpXTtcbiAgICAgIGNvbnN0IGluYm91bmRUZW5zb3JJbmRleCA9IG5vZGUudGVuc29ySW5kaWNlc1tpXTtcbiAgICAgIGNvbm5lY3Rpb25zLnB1c2goXG4gICAgICAgICAgYCR7aW5ib3VuZExheWVyfVske2luYm91bmRMYXllckluZGV4fV1bJHtpbmJvdW5kVGVuc29ySW5kZXh9XWApO1xuICAgIH1cbiAgfVxuICBjb25zdCBuYW1lID0gbGF5ZXIubmFtZTtcbiAgY29uc3QgY2xhc3NOYW1lID0gbGF5ZXIuZ2V0Q2xhc3NOYW1lKCk7XG4gIGNvbnN0IGZpcnN0Q29ubmVjdGlvbiA9IGNvbm5lY3Rpb25zLmxlbmd0aCA9PT0gMCA/ICcnIDogY29ubmVjdGlvbnNbMF07XG4gIGNvbnN0IGZpZWxkczogc3RyaW5nW10gPSBbXG4gICAgYCR7bmFtZX0gKCR7Y2xhc3NOYW1lfSlgLCBpbnB1dFNoYXBlLFxuICAgIG91dHB1dFNoYXBlLCBsYXllci5jb3VudFBhcmFtcygpLnRvU3RyaW5nKCksXG4gICAgZmlyc3RDb25uZWN0aW9uXG4gIF07XG5cbiAgcHJpbnRSb3coZmllbGRzLCBwb3NpdGlvbnMsIHByaW50Rm4pO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IGNvbm5lY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgcHJpbnRSb3coWycnLCAnJywgJycsICcnLCBjb25uZWN0aW9uc1tpXV0sIHBvc2l0aW9ucywgcHJpbnRGbik7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport * as generic_utils from '../utils/generic_utils';\n// tslint:enable\n/**\n * Test whether a value in an array is the name of a LayersModel or Layer.\n * @param key The key name that the value is found under. Note that the key\n *   may not be at the level immediately above the value, if the value is in a\n *   nested array.\n * @param index Index of the value in the Array that it is found in.\n * @param value The value object.\n * @returns A boolean indicating whether value is a name.\n */\nfunction isArrayItemInputOrOutputName(key, index, value) {\n    return (key === 'inboundNodes' || key === 'outputLayers' ||\n        key === 'inputLayers') &&\n        index === 0 && typeof value === 'string';\n}\n/**\n * Convert a Pythonic config object to TypeScript config object.\n * @param pythonicConfig The config object to convert.\n * @param key Optional key name of the object being converted.\n * @returns Result of the conversion.\n */\nexport function convertPythonicToTs(pythonicConfig, key) {\n    if (pythonicConfig === null) {\n        return null;\n    }\n    else if (typeof pythonicConfig === 'string') {\n        return generic_utils.toCamelCase(pythonicConfig);\n    }\n    else if ((typeof pythonicConfig === 'number') ||\n        (typeof pythonicConfig === 'boolean')) {\n        return pythonicConfig;\n    }\n    else if (pythonicConfig instanceof Array) {\n        const tsArray = [];\n        const arrayLength = pythonicConfig.length;\n        for (let i = 0; i < arrayLength; ++i) {\n            const item = pythonicConfig[i];\n            if (isArrayItemInputOrOutputName(key, i, item)) {\n                tsArray.push(item);\n            }\n            else {\n                tsArray.push(convertPythonicToTs(item, key));\n            }\n        }\n        return tsArray;\n    }\n    else {\n        const tsDict = {};\n        for (const pythonicKey of Object.keys(pythonicConfig)) {\n            const pythonicValue = pythonicConfig[pythonicKey];\n            if (pythonicKey === 'name' && typeof pythonicValue === 'string') {\n                // Special case the 'name' key with a string value. Name values, such as\n                // the names of LayersModel and Layer instances, should not undergo the\n                // camel-case conversion.\n                tsDict[pythonicKey] = pythonicValue;\n            }\n            else {\n                const tsKey = generic_utils.toCamelCase(pythonicKey);\n                tsDict[tsKey] = convertPythonicToTs(pythonicValue, tsKey);\n            }\n        }\n        return tsDict;\n    }\n}\n/**\n * Convert a TypeScript config object to Python config object.\n * @param tsConfig The config object to convert.\n * @param key Optional key name of the object being converted.\n * @returns Result of the conversion.\n */\nexport function convertTsToPythonic(tsConfig, key) {\n    if (tsConfig === null || tsConfig === undefined) {\n        return null;\n    }\n    else if (typeof tsConfig === 'string') {\n        return generic_utils.toSnakeCase(tsConfig);\n    }\n    else if ((typeof tsConfig === 'number') || (typeof tsConfig === 'boolean')) {\n        return tsConfig;\n    }\n    else if (tsConfig instanceof Array) {\n        const pyArray = [];\n        const arrayLength = tsConfig.length;\n        for (let i = 0; i < arrayLength; ++i) {\n            const item = tsConfig[i];\n            if (isArrayItemInputOrOutputName(key, i, item)) {\n                pyArray.push(item);\n            }\n            else {\n                pyArray.push(convertTsToPythonic(item, key));\n            }\n        }\n        return pyArray;\n    }\n    else {\n        const pyDict = {};\n        for (const tsKey of Object.keys(tsConfig)) {\n            const tsValue = tsConfig[tsKey];\n            const pyKey = generic_utils.toSnakeCase(tsKey);\n            if ((tsKey === 'name' || tsKey === 'className') &&\n                typeof tsValue === 'string') {\n                // Special case the 'name' key with a string value. Name values, such as\n                // the names of LayersModel and Layer instances, should not undergo the\n                // snake-case conversion.\n                pyDict[pyKey] = tsValue;\n            }\n            else {\n                pyDict[pyKey] = convertTsToPythonic(tsValue, tsKey);\n            }\n        }\n        return pyDict;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXphdGlvbl91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9zZXJpYWxpemF0aW9uX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBVUgsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxnQkFBZ0I7QUFFaEI7Ozs7Ozs7O0dBUUc7QUFDSCxTQUFTLDRCQUE0QixDQUNqQyxHQUFXLEVBQUUsS0FBYSxFQUFFLEtBQVE7SUFDdEMsT0FBTyxDQUFDLEdBQUcsS0FBSyxjQUFjLElBQUksR0FBRyxLQUFLLGNBQWM7UUFDaEQsR0FBRyxLQUFLLGFBQWEsQ0FBQztRQUMxQixLQUFLLEtBQUssQ0FBQyxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQztBQUMvQyxDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQy9CLGNBQTJCLEVBQUUsR0FBWTtJQUMzQyxJQUFJLGNBQWMsS0FBSyxJQUFJLEVBQUU7UUFDM0IsT0FBTyxJQUFJLENBQUM7S0FDYjtTQUFNLElBQUksT0FBTyxjQUFjLEtBQUssUUFBUSxFQUFFO1FBQzdDLE9BQU8sYUFBYSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsQ0FBQztLQUNsRDtTQUFNLElBQ0gsQ0FBQyxPQUFPLGNBQWMsS0FBSyxRQUFRLENBQUM7UUFDcEMsQ0FBQyxPQUFPLGNBQWMsS0FBSyxTQUFTLENBQUMsRUFBRTtRQUN6QyxPQUFPLGNBQWMsQ0FBQztLQUN2QjtTQUFNLElBQUksY0FBYyxZQUFZLEtBQUssRUFBRTtRQUMxQyxNQUFNLE9BQU8sR0FBRyxFQUFFLENBQUM7UUFDbkIsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztRQUMxQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFF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Qy9CLHdFQUF3RTtnQkFDeEUsdUVBQXVFO2dCQUN2RSx5QkFBeUI7Z0JBQ3pCLE1BQU0sQ0FBQyxLQUFLLENBQUMsR0FBRyxPQUFPLENBQUM7YUFDekI7aUJBQU07Z0JBQ0wsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQzthQUNyRDtTQUNGO1FBQ0QsT0FBTyxNQUFNLENBQUM7S0FDZjtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBQb3J0aW5nIG5vdGU6IFRoaXMgZmlsZSBkb2Vzbid0IGV4aXN0IGluIFB5S2VyYXMuXG4vLyBJdHMgcHVycG9zZSBoZXJlIGlzIHRvIGNlbnRyYWxpemUgdGhlIGJvdW5kYXJ5IGxheWVyIGJldHdlZW5cbi8vIHRmanMtbGF5ZXJzJ3MgaW50ZXJuYWwgQ29uZmlnIFRTLUNlbnRyaWMgZm9ybWF0IGFuZCBQeUtlcmFzJ3Ncbi8vIHNlcmlhbGl6ZWQgUHl0aG9uIENvbmZpZyBmb3JtYXQuXG5cbmltcG9ydCB7c2VyaWFsaXphdGlvbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtQeUpzb25WYWx1ZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG4vLyB0c2xpbnQ6ZW5hYmxlXG5cbi8qKlxuICogVGVzdCB3aGV0aGVyIGEgdmFsdWUgaW4gYW4gYXJyYXkgaXMgdGhlIG5hbWUgb2YgYSBMYXllcnNNb2RlbCBvciBMYXllci5cbiAqIEBwYXJhbSBrZXkgVGhlIGtleSBuYW1lIHRoYXQgdGhlIHZhbHVlIGlzIGZvdW5kIHVuZGVyLiBOb3RlIHRoYXQgdGhlIGtleVxuICogICBtYXkgbm90IGJlIGF0IHRoZSBsZXZlbCBpbW1lZGlhdGVseSBhYm92ZSB0aGUgdmFsdWUsIGlmIHRoZSB2YWx1ZSBpcyBpbiBhXG4gKiAgIG5lc3RlZCBhcnJheS5cbiAqIEBwYXJhbSBpbmRleCBJbmRleCBvZiB0aGUgdmFsdWUgaW4gdGhlIEFycmF5IHRoYXQgaXQgaXMgZm91bmQgaW4uXG4gKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIG9iamVjdC5cbiAqIEByZXR1cm5zIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdmFsdWUgaXMgYSBuYW1lLlxuICovXG5mdW5jdGlvbiBpc0FycmF5SXRlbUlucHV0T3JPdXRwdXROYW1lPFQ+KFxuICAgIGtleTogc3RyaW5nLCBpbmRleDogbnVtYmVyLCB2YWx1ZTogVCk6IGJvb2xlYW4ge1xuICByZXR1cm4gKGtleSA9PT0gJ2luYm91bmROb2RlcycgfHwga2V5ID09PSAnb3V0cHV0TGF5ZXJzJyB8fFxuICAgICAgICAgIGtleSA9PT0gJ2lucHV0TGF5ZXJzJykgJiZcbiAgICAgIGluZGV4ID09PSAwICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogQ29udmVydCBhIFB5dGhvbmljIGNvbmZpZyBvYmplY3QgdG8gVHlwZVNjcmlwdCBjb25maWcgb2JqZWN0LlxuICogQHBhcmFtIHB5dGhvbmljQ29uZmlnIFRoZSBjb25maWcgb2JqZWN0IHRvIGNvbnZlcnQuXG4gKiBAcGFyYW0ga2V5IE9wdGlvbmFsIGtleSBuYW1lIG9mIHRoZSBvYmplY3QgYmVpbmcgY29udmVydGVkLlxuICogQHJldHVybnMgUmVzdWx0IG9mIHRoZSBjb252ZXJzaW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udmVydFB5dGhvbmljVG9UcyhcbiAgICBweXRob25pY0NvbmZpZzogUHlKc29uVmFsdWUsIGtleT86IHN0cmluZyk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdFZhbHVlIHtcbiAgaWYgKHB5dGhvbmljQ29uZmlnID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHB5dGhvbmljQ29uZmlnID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBnZW5lcmljX3V0aWxzLnRvQ2FtZWxDYXNlKHB5dGhvbmljQ29uZmlnKTtcbiAgfSBlbHNlIGlmIChcbiAgICAgICh0eXBlb2YgcHl0aG9uaWNDb25maWcgPT09ICdudW1iZXInKSB8fFxuICAgICAgKHR5cGVvZiBweXRob25pY0NvbmZpZyA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgIHJldHVybiBweXRob25pY0NvbmZpZztcbiAgfSBlbHNlIGlmIChweXRob25pY0NvbmZpZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgY29uc3QgdHNBcnJheSA9IFtdO1xuICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gcHl0aG9uaWNDb25maWcubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgaXRlbSA9IHB5dGhvbmljQ29uZmlnW2ldO1xuICAgICAgaWYgKGlzQXJyYXlJdGVtSW5wdXRPck91dHB1dE5hbWUoa2V5LCBpLCBpdGVtKSkge1xuICAgICAgICB0c0FycmF5LnB1c2goaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0c0FycmF5LnB1c2goY29udmVydFB5dGhvbmljVG9UcyhpdGVtLCBrZXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRzQXJyYXk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgdHNEaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHB5dGhvbmljS2V5IG9mIE9iamVjdC5rZXlzKHB5dGhvbmljQ29uZmlnKSkge1xuICAgICAgY29uc3QgcHl0aG9uaWNWYWx1ZSA9IHB5dGhvbmljQ29uZmlnW3B5dGhvbmljS2V5XTtcbiAgICAgIGlmIChweXRob25pY0tleSA9PT0gJ25hbWUnICYmIHR5cGVvZiBweXRob25pY1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgdGhlICduYW1lJyBrZXkgd2l0aCBhIHN0cmluZyB2YWx1ZS4gTmFtZSB2YWx1ZXMsIHN1Y2ggYXNcbiAgICAgICAgLy8gdGhlIG5hbWVzIG9mIExheWVyc01vZGVsIGFuZCBMYXllciBpbnN0YW5jZXMsIHNob3VsZCBub3QgdW5kZXJnbyB0aGVcbiAgICAgICAgLy8gY2FtZWwtY2FzZSBjb252ZXJzaW9uLlxuICAgICAgICB0c0RpY3RbcHl0aG9uaWNLZXldID0gcHl0aG9uaWNWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHRzS2V5ID0gZ2VuZXJpY191dGlscy50b0NhbWVsQ2FzZShweXRob25pY0tleSk7XG4gICAgICAgIHRzRGljdFt0c0tleV0gPSBjb252ZXJ0UHl0aG9uaWNUb1RzKHB5dGhvbmljVmFsdWUsIHRzS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRzRGljdDtcbiAgfVxufVxuXG4vKipcbiAqIENvbnZlcnQgYSBUeXBlU2NyaXB0IGNvbmZpZyBvYmplY3QgdG8gUHl0aG9uIGNvbmZpZyBvYmplY3QuXG4gKiBAcGFyYW0gdHNDb25maWcgVGhlIGNvbmZpZyBvYmplY3QgdG8gY29udmVydC5cbiAqIEBwYXJhbSBrZXkgT3B0aW9uYWwga2V5IG5hbWUgb2YgdGhlIG9iamVjdCBiZWluZyBjb252ZXJ0ZWQuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIGNvbnZlcnNpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252ZXJ0VHNUb1B5dGhvbmljKFxuICAgIHRzQ29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZSwga2V5Pzogc3RyaW5nKTogUHlKc29uVmFsdWUge1xuICBpZiAodHNDb25maWcgPT09IG51bGwgfHwgdHNDb25maWcgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBudWxsO1xuICB9IGVsc2UgaWYgKHR5cGVvZiB0c0NvbmZpZyA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZ2VuZXJpY191dGlscy50b1NuYWtlQ2FzZSh0c0NvbmZpZyk7XG4gIH0gZWxzZSBpZiAoXG4gICAgICAodHlwZW9mIHRzQ29uZmlnID09PSAnbnVtYmVyJykgfHwgKHR5cGVvZiB0c0NvbmZpZyA9PT0gJ2Jvb2xlYW4nKSkge1xuICAgIHJldHVybiB0c0NvbmZpZztcbiAgfSBlbHNlIGlmICh0c0NvbmZpZyBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgY29uc3QgcHlBcnJheSA9IFtdO1xuICAgIGNvbnN0IGFycmF5TGVuZ3RoID0gdHNDb25maWcubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgaXRlbSA9IHRzQ29uZmlnW2ldO1xuICAgICAgaWYgKGlzQXJyYXlJdGVtSW5wdXRPck91dHB1dE5hbWUoa2V5LCBpLCBpdGVtKSkge1xuICAgICAgICBweUFycmF5LnB1c2goaXRlbSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBweUFycmF5LnB1c2goY29udmVydFRzVG9QeXRob25pYyhpdGVtLCBrZXkpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHB5QXJyYXk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHlEaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICBmb3IgKGNvbnN0IHRzS2V5IG9mIE9iamVjdC5rZXlzKHRzQ29uZmlnKSkge1xuICAgICAgY29uc3QgdHNWYWx1ZSA9IHRzQ29uZmlnW3RzS2V5XTtcbiAgICAgIGNvbnN0IHB5S2V5ID0gZ2VuZXJpY191dGlscy50b1NuYWtlQ2FzZSh0c0tleSk7XG4gICAgICBpZiAoKHRzS2V5ID09PSAnbmFtZScgfHwgdHNLZXkgPT09ICdjbGFzc05hbWUnKSAmJlxuICAgICAgICAgIHR5cGVvZiB0c1ZhbHVlID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBTcGVjaWFsIGNhc2UgdGhlICduYW1lJyBrZXkgd2l0aCBhIHN0cmluZyB2YWx1ZS4gTmFtZSB2YWx1ZXMsIHN1Y2ggYXNcbiAgICAgICAgLy8gdGhlIG5hbWVzIG9mIExheWVyc01vZGVsIGFuZCBMYXllciBpbnN0YW5jZXMsIHNob3VsZCBub3QgdW5kZXJnbyB0aGVcbiAgICAgICAgLy8gc25ha2UtY2FzZSBjb252ZXJzaW9uLlxuICAgICAgICBweURpY3RbcHlLZXldID0gdHNWYWx1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB5RGljdFtweUtleV0gPSBjb252ZXJ0VHNUb1B5dGhvbmljKHRzVmFsdWUsIHRzS2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHB5RGljdDtcbiAgfVxufVxuIl19","/** @license See the LICENSE file. */\n// This code is auto-generated, do not modify this file!\nconst version = '3.21.0';\nexport { version };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy92ZXJzaW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHFDQUFxQztBQUVyQyx3REFBd0Q7QUFDeEQsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDO0FBQ3pCLE9BQU8sRUFBQyxPQUFPLEVBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKiBAbGljZW5zZSBTZWUgdGhlIExJQ0VOU0UgZmlsZS4gKi9cblxuLy8gVGhpcyBjb2RlIGlzIGF1dG8tZ2VuZXJhdGVkLCBkbyBub3QgbW9kaWZ5IHRoaXMgZmlsZSFcbmNvbnN0IHZlcnNpb24gPSAnMy4yMS4wJztcbmV4cG9ydCB7dmVyc2lvbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source: keras/engine/topology.py */\nimport { tidy } from '@tensorflow/tfjs-core';\nimport { getUid } from '../backend/state';\nimport { NotImplementedError, RuntimeError, ValueError } from '../errors';\nimport { deserialize as deserializeLayer } from '../layers/serialization';\nimport * as generic_utils from '../utils/generic_utils';\nimport { convertTsToPythonic } from '../utils/serialization_utils';\nimport * as types_utils from '../utils/types_utils';\nimport { batchSetValue } from '../variables';\nimport { version as layersVersion } from '../version';\nimport { execute, FeedDict } from './executor';\nimport { InputLayer } from './input_layer';\nimport { Layer, Node } from './topology';\n/**\n * A Container is a directed acyclic graph of layers.\n *\n * It is the topological form of a \"model\". A LayersModel\n * is simply a Container with added training routines.\n *\n */\nexport class Container extends Layer {\n    constructor(args) {\n        // No args passed to super's constructor.\n        super({});\n        this.containerNodes = new Set();\n        this.name = args.name;\n        if (this.name == null) {\n            const prefix = this.getClassName().toLowerCase();\n            this.name = getUid(prefix);\n        }\n        this.supportsMasking = false;\n        this.trainable_ = true;\n        // TODO(michaelterry): Initialize perInputLosses/Updates here.\n        // Container-specific properties.\n        if (Array.isArray(args.inputs)) {\n            this.inputs = args.inputs.slice();\n        }\n        else {\n            this.inputs = [args.inputs];\n        }\n        if (Array.isArray(args.outputs)) {\n            this.outputs = args.outputs.slice();\n        }\n        else {\n            this.outputs = [args.outputs];\n        }\n        // Check for redundancy in inputs.\n        if (generic_utils.unique(this.inputs).length !== this.inputs.length) {\n            throw new ValueError('The list of inputs passed to the model is ' +\n                'redundant. All inputs should only appear once. Found: ' +\n                `${this.inputs.map(x => x.name)}`);\n        }\n        // Check for redundancy in outputs.\n        if (generic_utils.unique(this.outputs).length !== this.outputs.length) {\n            console.warn('The list of outputs passed to the model is redundant. ' +\n                'All outputs should only appear once. Found: ' +\n                `${this.outputs.map(x => x.name)}`);\n        }\n        /*\n          List of initial layers (1 to 1 mapping with this.inputs, hence the same\n          layer might appear twice)\n        */\n        this.inputLayers = [];\n        this.inputLayersNodeIndices = [];\n        this.inputLayersTensorIndices = [];\n        /*\n          List of layers (1 to 1 mapping with this.outputs, hence the same layer\n          might appear twice)\n        */\n        this.outputLayers = [];\n        this.outputLayersNodeIndices = [];\n        this.outputLayersTensorIndices = [];\n        /*\n          All layers in order of horizontal graph traversal. Entries are unique.\n          Includes input and output layers.\n        */\n        this.layers = [];\n        /*\n          References to container layers that were constructed internally. We need\n          these to properly dispose of tensors from nested containers.\n        */\n        this.internalContainerRefs = [];\n        // TODO(michaelterry): Determine if caching still needed with eager\n        // backend.\n        /*\n          This is for performance optimization when calling the Container on new\n          inputs. Every time the Container is called on a set on input tensors,\n          we compute the output tensors, output masks and output shapes in one pass,\n          then cache them here. When one of these outputs is queried later,\n          we retrieve it from there instead of recomputing it.\n        */\n        // this.outputTensorCache = {};\n        // this.outputShapeCache = {};\n        // Build this.outputLayers:\n        for (const x of this.outputs) {\n            const layer = x.sourceLayer;\n            const nodeIndex = x.nodeIndex;\n            const tensorIndex = x.tensorIndex;\n            this.outputLayers.push(layer);\n            this.outputLayersNodeIndices.push(nodeIndex);\n            this.outputLayersTensorIndices.push(tensorIndex);\n        }\n        // TODO(michaelterry): Add output mask cache code.\n        // Build this.inputLayers:\n        for (const x of this.inputs) {\n            const layer = x.sourceLayer;\n            const nodeIndex = x.nodeIndex;\n            const tensorIndex = x.tensorIndex;\n            /*\n              It's supposed to be an input layer, so only one node\n              and one tensor output.\n            */\n            generic_utils.assert(nodeIndex === 0, 'input layer has >1 nodes');\n            generic_utils.assert(tensorIndex === 0, 'input layer has >1 tensors');\n            this.inputLayers.push(layer);\n            this.inputLayersNodeIndices.push(nodeIndex);\n            this.inputLayersTensorIndices.push(tensorIndex);\n        }\n        // Build this.inputNames and this.outputNames.\n        this.inputNames = [];\n        this.outputNames = [];\n        this.feedInputShapes = [];\n        this.feedInputNames = [];\n        this.feedOutputNames = [];\n        for (let i = 0; i < this.inputLayers.length; i++) {\n            const layer = this.inputLayers[i];\n            // Check that layer is an InputLayer.\n            if (!(layer instanceof InputLayer)) {\n                throw new TypeError('Input layers to a LayersModel must be InputLayer objects. ' +\n                    `Received inputs: ${args.inputs}. ` +\n                    `Input ${i} (0-based) originates ` +\n                    `from layer type ${layer.getClassName()}.`);\n            }\n            this.inputNames.push(layer.name);\n            this.feedInputShapes.push(layer.batchInputShape);\n            this.feedInputNames.push(layer.name);\n        }\n        for (const layer of this.outputLayers) {\n            this.outputNames.push(layer.name);\n        }\n        this.internalInputShapes = this.inputs.map(x => x.shape);\n        this.internalOutputShapes = this.outputs.map(x => x.shape);\n        /*\n          Container_nodes: set of nodes included in the graph (not all nodes\n          included in the layers are relevant to the current graph).\n        */\n        // ids of all nodes relevant to the Container:\n        const nodesDepths = {};\n        // To recover nodes from their ID.\n        const nodeIDToNode = {};\n        const layersDepths = {};\n        // To layers from their ID.\n        const layerIDToLayer = {};\n        const layerIndices = {};\n        const nodesInDecreasingDepth = [];\n        /**\n         * Builds a map of the graph of layers.\n         *\n         * This recursively updates the map `layerIndices`,\n         * the list `nodesInDecreasingDepth` and the set `containerNodes`.\n         *\n         * @param tensor Some tensor in a graph.\n         * @param finishedNodes Set of nodes whose subgraphs have been traversed\n         *         completely. Useful to prevent duplicated work.\n         * @param nodesInProgress Set of nodes that are currently active on the\n         *         recursion stack. Useful to detect cycles.\n         * @param layer Layer from which `tensor` comes from. If not provided,\n         *   will be obtained from tensor.sourceLayer.\n         * @param nodeIndex Node index from which `tensor` comes from.\n         * @param tensorIndex TensorIndex from which `tensor` comes from.\n         *\n         * @exception RuntimeError if a cycle is detected.\n         */\n        const buildMapOfGraph = (tensor, finishedNodes, nodesInProgress, layer, nodeIndex, tensorIndex) => {\n            if (layer == null || nodeIndex == null || tensorIndex == null) {\n                layer = tensor.sourceLayer;\n                nodeIndex = tensor.nodeIndex;\n                tensorIndex = tensor.tensorIndex;\n            }\n            const node = layer.inboundNodes[nodeIndex];\n            // Prevent cycles.\n            if (nodesInProgress.indexOf(node) !== -1) {\n                throw new RuntimeError(`The tensor ${tensor.name} at layer \"${layer.name}\" ` +\n                    'is part of a cycle.');\n            }\n            // Don't repeat work for shared subgraphs\n            if (finishedNodes.indexOf(node) !== -1) {\n                return;\n            }\n            // Update containerNodes.\n            this.containerNodes.add(Container.nodeKey(layer, nodeIndex));\n            // Store the traversal order for layer sorting.\n            if (!(layer.id in layerIndices)) {\n                layerIndices[layer.id] = Object.keys(layerIndices).length;\n            }\n            if (nodesInProgress.indexOf(node) === -1) {\n                nodesInProgress.push(node);\n            }\n            // Propagate to all previous tensors connected to this node.\n            const numInboundLayers = node.inboundLayers.length;\n            for (let i = 0; i < numInboundLayers; i++) {\n                const x = node.inputTensors[i];\n                const layer = node.inboundLayers[i];\n                const nodeIndex = node.nodeIndices[i];\n                const tensorIndex = node.tensorIndices[i];\n                buildMapOfGraph(x, finishedNodes, nodesInProgress, layer, nodeIndex, tensorIndex);\n            }\n            finishedNodes.push(node);\n            while (nodesInProgress.indexOf(node) >= 0) {\n                nodesInProgress.splice(nodesInProgress.indexOf(node), 1);\n            }\n            nodesInDecreasingDepth.push(node);\n        };\n        const finishedNodes = [];\n        const nodesInProgress = [];\n        for (const x of this.outputs) {\n            buildMapOfGraph(x, finishedNodes, nodesInProgress);\n        }\n        const reversedNodesInDecreasingDepth = nodesInDecreasingDepth.slice().reverse();\n        for (const node of reversedNodesInDecreasingDepth) {\n            nodeIDToNode[node.id] = node;\n            // If the depth is not set, the node has no outbound nodes (depth 0).\n            if (!(node.id in nodesDepths)) {\n                nodesDepths[node.id] = 0;\n            }\n            let depth = nodesDepths[node.id];\n            // Update the depth of the corresponding layer\n            const previousDepth = (layersDepths[node.outboundLayer.id] == null ?\n                0 :\n                layersDepths[node.outboundLayer.id]);\n            /*\n              If we've seen this layer before at a higher depth, we should use that\n              depth instead of the node depth.  This is necessary for shared layers\n              that have inputs at different depth levels in the graph.\n            */\n            depth = Math.max(depth, previousDepth);\n            layersDepths[node.outboundLayer.id] = depth;\n            layerIDToLayer[node.outboundLayer.id] = node.outboundLayer;\n            nodesDepths[node.id] = depth;\n            // Update the depth of inbound nodes.\n            for (let i = 0; i < node.inboundLayers.length; i++) {\n                const inboundLayer = node.inboundLayers[i];\n                const nodeIndex = node.nodeIndices[i];\n                const inboundNode = inboundLayer.inboundNodes[nodeIndex];\n                const previousDepth = (nodesDepths[inboundNode.id] == null ? 0 :\n                    nodesDepths[inboundNode.id]);\n                nodesDepths[inboundNode.id] = Math.max(depth + 1, previousDepth);\n                nodeIDToNode[inboundNode.id] = inboundNode;\n            }\n        }\n        // Build a dict {depth: list of nodes with this depth}\n        const nodesByDepth = {};\n        for (const nodeID in nodesDepths) {\n            const depth = nodesDepths[nodeID];\n            if (!(depth in nodesByDepth)) {\n                nodesByDepth[depth] = [];\n            }\n            nodesByDepth[depth].push(nodeIDToNode[nodeID]);\n        }\n        // Build a dict {depth: list of layers with this depth}\n        const layersByDepth = {};\n        for (const layerID in layersDepths) {\n            const depth = layersDepths[layerID];\n            if (!(depth in layersByDepth)) {\n                layersByDepth[depth] = [];\n            }\n            layersByDepth[depth].push(layerIDToLayer[layerID]);\n        }\n        // Get sorted list of layer depths.\n        let depthKeys = Object.keys(layersByDepth)\n            .map(x => parseInt(x, 10))\n            .sort(generic_utils.reverseNumberCompare);\n        // Set this.layers and this.layersByDepth.\n        this.layers = [];\n        for (const depth of depthKeys) {\n            const layersForDepth = layersByDepth[depth];\n            // Container.layers needs to have a deterministic order:\n            // here we order them by traversal order.\n            layersForDepth.sort((a, b) => {\n                const aIndex = layerIndices[a.id];\n                const bIndex = layerIndices[b.id];\n                if (aIndex < bIndex) {\n                    return -1;\n                }\n                if (aIndex > bIndex) {\n                    return 1;\n                }\n                return 0;\n            });\n            for (const layer of layersForDepth) {\n                if (layer instanceof Container) {\n                    this.internalContainerRefs.push(layer);\n                }\n                this.layers.push(layer);\n            }\n        }\n        this.layersByDepth = layersByDepth;\n        // Get sorted list of node depths;\n        depthKeys = Object.keys(nodesByDepth)\n            .map(x => parseInt(x, 10))\n            .sort(generic_utils.reverseNumberCompare);\n        // Check that all tensors required are computable.\n        // computable_tensors: all tensors in the graph\n        // that can be computed from the inputs provided.\n        const computableTensors = this.inputs.slice();\n        // To provide a better error msg.\n        const layersWithCompleteInput = [];\n        for (const depth of depthKeys) {\n            for (const node of nodesByDepth[depth]) {\n                const layer = node.outboundLayer;\n                if (layer != null) {\n                    for (const x of node.inputTensors) {\n                        if (computableTensors.indexOf(x) === -1) {\n                            throw new RuntimeError(`Graph disconnected: cannot obtain value for tensor ${x}` +\n                                ` at layer \"${layer.name}\". ` +\n                                'The following previous layers were accessed without ' +\n                                `issue: ${layersWithCompleteInput}`);\n                        }\n                    }\n                    for (const x of node.outputTensors) {\n                        computableTensors.push(x);\n                    }\n                    layersWithCompleteInput.push(layer.name);\n                }\n            }\n        }\n        // Set this.containerNodes and this.nodesByDepth.\n        this.nodesByDepth = nodesByDepth;\n        // Ensure name unicity, which will be crucial for serialization\n        // (since serialized nodes refer to layers by their name).\n        const allNames = this.layers.map(x => x.name);\n        for (const name of allNames) {\n            const numOccurrences = allNames.filter(x => x === name).length;\n            if (numOccurrences !== 1) {\n                throw new RuntimeError(`The name \"${name}\" is used ${numOccurrences} times ` +\n                    'in the model. All layer names should be unique. Layer names: ' +\n                    JSON.stringify(allNames));\n            }\n        }\n        // Layer parameters.\n        // The new container starts with a single inbound node\n        // for its inputs, and no outbound nodes.\n        // Will be appended to by future calls to apply().\n        this.outboundNodes = [];\n        // Will be appended to below, and by future calls to apply().\n        this.inboundNodes = [];\n        // Create the node linking internal inputs to internal outputs.\n        // (This call has side effects.)\n        // tslint:disable-next-line:no-unused-expression\n        new Node({\n            outboundLayer: this,\n            inboundLayers: [],\n            nodeIndices: [],\n            tensorIndices: [],\n            inputTensors: this.inputs,\n            outputTensors: this.outputs,\n            inputMasks: this.inputs.map(x => null),\n            outputMasks: this.outputs.map(x => null),\n            inputShapes: this.inputs.map(x => x.shape),\n            outputShapes: this.outputs.map(x => x.shape)\n        });\n        this.built = true;\n        this._refCount = 1; // The ref count of a container always start at 1.\n    }\n    assertNotDisposed() {\n        if (this._refCount === 0) {\n            throw new Error(`Container '${this.name}' is already disposed.`);\n        }\n    }\n    /**\n     * Attempt to dispose a LayersModel's weights.\n     *\n     * This method decrease the reference count of the LayersModel object by 1.\n     *\n     * A LayersModel is reference-counted. Its reference count is incremented by 1\n     * when it is first constructed and when it is used as a Layer of another\n     * LayersModel.\n     *\n     * If the reference count of a LayersModel becomes 0, the `dispose` method of\n     * all its constituent `Layer`s will be called.\n     *\n     * Note: If the reference count is greater than 0 after the decrement, the\n     * `dispose` method of its constituent `Layer`s will *not* be called.\n     *\n     * After a LayersModel is disposed, it cannot be used in calls such as\n     * 'predict`, `evaluate` or `fit` anymore.\n     *\n     * @returns A DisposeResult Object with the following fields:\n     *   - refCountAfterDispose: The reference count of the LayersModel after this\n     *     `dispose()` call.\n     *   - numDisposedVariables: Number of `tf.Variable`s (i.e., weights) disposed\n     *     during this `dispose()` call.\n     * @throws {Error} If the layer is not built yet, or if the LayersModel has\n     *   already been disposed.\n     */\n    dispose() {\n        this.assertNotDisposed();\n        const result = { refCountAfterDispose: null, numDisposedVariables: 0 };\n        if (--this._refCount === 0) {\n            for (const layer of this.layers) {\n                result.numDisposedVariables += layer.dispose().numDisposedVariables;\n            }\n            // Call dispose on each internally created container layer again to ensure\n            // their refCounts hit zero and their tensors are subsequently deleted.\n            for (const container of this.internalContainerRefs) {\n                result.numDisposedVariables += container.dispose().numDisposedVariables;\n            }\n        }\n        result.refCountAfterDispose = this._refCount;\n        return result;\n    }\n    get trainable() {\n        return this.trainable_;\n    }\n    set trainable(trainable) {\n        this.layers.forEach(layer => {\n            // tslint:disable-next-line:no-any\n            layer._trainableWeights\n                .forEach(w => w.trainable = trainable);\n        });\n        this.trainable_ = trainable;\n    }\n    get trainableWeights() {\n        // Porting Note: This check below is to prevent errors where the\n        //   _trainableWeights inherited from the parent class (Layer) gets\n        //   inadvertently used.\n        if (this._trainableWeights.length > 0) {\n            throw new ValueError('Container instance unexpectedly contains _trainableWeights.' +\n                'The trainable weights of a Container are a union of the ' +\n                'trainable weights of its consituent Layers. Its own ' +\n                '_trainableWeights must remain an empty Array.');\n        }\n        if (!this.trainable) {\n            return [];\n        }\n        let weights = [];\n        for (const layer of this.layers) {\n            weights = weights.concat(layer.trainableWeights);\n        }\n        return weights;\n    }\n    get nonTrainableWeights() {\n        const weights = [];\n        for (const layer of this.layers) {\n            weights.push(...layer.nonTrainableWeights);\n        }\n        if (!this.trainable) {\n            const trainableWeights = [];\n            for (const layer of this.layers) {\n                trainableWeights.push(...layer.trainableWeights);\n            }\n            return trainableWeights.concat(weights);\n        }\n        return weights;\n    }\n    get weights() {\n        return this.trainableWeights.concat(this.nonTrainableWeights);\n    }\n    /**\n     * Loads all layer weights from a JSON object.\n     *\n     * Porting Note: HDF5 weight files cannot be directly loaded in JavaScript /\n     *   TypeScript. The utility script at `scripts/pykeras.py` offers means\n     *   to convert them into JSON strings compatible with this method.\n     * Porting Note: TensorFlow.js Layers supports only loading by name currently.\n     *\n     * @param weights A JSON mapping weight names to weight values as nested\n     *   arrays of numbers, or a `NamedTensorMap`, i.e., a JSON mapping weight\n     *   names to `tf.Tensor` objects.\n     * @param strict Require that the provided weights exactly match those\n     *   required by the container.  Default: `true`.  Passing `false` means that\n     *   extra weights and missing weights will be silently ignored.\n     */\n    loadWeights(weights, strict = true) {\n        const nameToWeight = {};\n        let totalWeightsCount = 0;\n        for (const layer of this.layers) {\n            for (const weight of layer.weights) {\n                if (nameToWeight[weight.originalName] != null) {\n                    throw new ValueError(`Duplicate weight name: ${weight.originalName}`);\n                }\n                nameToWeight[weight.originalName] = weight;\n                totalWeightsCount++;\n            }\n        }\n        const weightValueTuples = [];\n        for (const name in weights) {\n            // TF 2.2.0 added cell name to the weight name in the format of\n            // layer_name/cell_name/weight_name, we need to remove\n            // the inner cell name.\n            let validatedName = name;\n            if (nameToWeight[name] == null) {\n                const tokens = name.split('/');\n                const shortenNameArray = tokens.slice(0, -2).concat([tokens[tokens.length - 1]]);\n                validatedName = shortenNameArray.join('/');\n            }\n            if (nameToWeight[validatedName] != null) {\n                weightValueTuples.push([nameToWeight[validatedName], weights[name]]);\n            }\n            else if (strict) {\n                throw new ValueError(`Provided weight data has no target variable: ${name}`);\n            }\n            delete nameToWeight[validatedName];\n        }\n        if (strict) {\n            // Check that all weights are set.\n            const unsetNames = [];\n            for (const name in nameToWeight) {\n                unsetNames.push(name);\n            }\n            if (unsetNames.length > 0) {\n                throw new ValueError(`${unsetNames.length} of ${totalWeightsCount} weights are not set: ` +\n                    `${unsetNames}`);\n            }\n        }\n        batchSetValue(weightValueTuples);\n    }\n    /**\n     * Util shared between different serialization methods.\n     * @returns LayersModel config with Keras version information added.\n     */\n    updatedConfig() {\n        const theConfig = this.getConfig();\n        const modelConfig = {};\n        modelConfig['className'] = this.getClassName();\n        modelConfig['config'] = theConfig;\n        modelConfig['kerasVersion'] = `tfjs-layers ${layersVersion}`;\n        // TODO(nielsene): Replace something like K.backend() once\n        // possible.\n        modelConfig['backend'] = 'TensorFlow.js';\n        return modelConfig;\n    }\n    /**\n     * Returns a JSON string containing the network configuration.\n     *\n     * To load a network from a JSON save file, use\n     * models.modelFromJSON(jsonString);\n     * @param extraJsonArgs Unused in tfjs-layers, maintained for PyKeras\n     * @param returnString Whether the return value should be stringified\n     *    (default: `true`).\n     * @returns a JSON string if `returnString` (default), or a JSON object if\n     *   `!returnString`.\n     */\n    // tslint:disable-next-line:no-any\n    toJSON(unused, returnString = true) {\n        const modelConfig = convertTsToPythonic(this.updatedConfig());\n        return returnString ? JSON.stringify(modelConfig) : modelConfig;\n    }\n    /**\n     * Call the model on new inputs.\n     *\n     * In this case `call` just reapplies all ops in the graph to the new inputs\n     * (e.g. build a new computational graph from the provided inputs).\n     *\n     * @param inputs A tensor or list of tensors.\n     * @param mask A mask or list of masks. A mask can be either a tensor or null\n     *   (no mask).\n     *\n     * @return A tensor if there is a single output, or a list of tensors if there\n     *   are more than one outputs.\n     */\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = generic_utils.toList(inputs);\n            const feedDict = new FeedDict();\n            for (let i = 0; i < this.inputs.length; ++i) {\n                feedDict.add(this.inputs[i], inputs[i]);\n            }\n            return execute(this.outputs, feedDict, kwargs);\n        });\n    }\n    /**\n     * Computes an output mask tensor.\n     *\n     * @param inputs Tensor or list of tensors.\n     * @param mask Tensor or list of tensors.\n     *\n     * @return null or a tensor (or list of tensors, one per output tensor of the\n     * layer).\n     */\n    computeMask(inputs, mask) {\n        return tidy(() => {\n            inputs = generic_utils.toList(inputs);\n            let masks;\n            if (mask == null) {\n                masks = generic_utils.pyListRepeat(null, inputs.length);\n            }\n            else {\n                masks = generic_utils.toList(mask);\n            }\n            // TODO(michaelterry): Add support for mask caching.\n            return this.runInternalGraph(inputs, masks)[1];\n        });\n    }\n    /**\n     * Computes the output shape of the layer.\n     *\n     * Assumes that the layer will be built to match that input shape provided.\n     *\n     * @param inputShape A shape (tuple of integers) or a list of shape tuples\n     *   (one per output tensor of the layer). Shape tuples can include null for\n     *   free dimensions, instead of an integer.\n     */\n    computeOutputShape(inputShape) {\n        const inputShapes = types_utils.normalizeShapeList(inputShape);\n        if (inputShapes.length !== this.inputLayers.length) {\n            throw new ValueError(`Invalid inputShape argument ${inputShape}: ` +\n                `model has ${this.inputLayers.length} tensor inputs.`);\n        }\n        // TODO(michaelterry): Add caching\n        const layersToOutputShapes = {};\n        for (let i = 0; i < inputShapes.length; i++) {\n            const layer = this.inputLayers[i];\n            const inputShape = inputShapes[i];\n            // It's an input layer: computeOutputShape is identity,\n            // and there is only one node and one tensor output.\n            const shapeKey = layer.name + '_0_0';\n            layersToOutputShapes[shapeKey] = inputShape;\n        }\n        const depthKeys = Object.keys(this.nodesByDepth)\n            .map(x => parseInt(x, 10))\n            .sort(generic_utils.reverseNumberCompare);\n        // Iterate over nodes, by depth level.\n        if (depthKeys.length > 1) {\n            for (const depth of depthKeys) {\n                const nodes = this.nodesByDepth[depth];\n                for (const node of nodes) {\n                    // This is always a single layer, never a list.\n                    const layer = node.outboundLayer;\n                    if (this.inputLayers.map(x => x.id).indexOf(layer.id) !== -1) {\n                        // We've already covered the input layers a few lines above.\n                        continue;\n                    }\n                    // Potentially redundant list, same size of node.inputTensors.\n                    const inputShapes = [];\n                    for (let j = 0; j < node.inboundLayers.length; j++) {\n                        const inboundLayer = node.inboundLayers[j];\n                        const nodeIndex = node.nodeIndices[j];\n                        const tensorIndex = node.tensorIndices[j];\n                        const shapeKey = `${inboundLayer.name}_${nodeIndex}_${tensorIndex}`;\n                        const inputShape = layersToOutputShapes[shapeKey];\n                        inputShapes.push(inputShape);\n                    }\n                    const outputShape = layer.computeOutputShape(generic_utils.singletonOrArray(inputShapes));\n                    const outputShapes = types_utils.normalizeShapeList(outputShape);\n                    const nodeIndex = layer.inboundNodes.indexOf(node);\n                    for (let j = 0; j < outputShapes.length; j++) {\n                        const shapeKey = `${layer.name}_${nodeIndex}_${j}`;\n                        layersToOutputShapes[shapeKey] = outputShapes[j];\n                    }\n                }\n            }\n        }\n        // Read final output shapes from layersToOutputShapes.\n        const outputShapes = [];\n        const outputShapeKeys = [];\n        for (let i = 0; i < this.outputLayers.length; i++) {\n            const layer = this.outputLayers[i];\n            const nodeIndex = this.outputLayersNodeIndices[i];\n            const tensorIndex = this.outputLayersTensorIndices[i];\n            const shapeKey = `${layer.name}_${nodeIndex}_${tensorIndex}`;\n            outputShapeKeys.push(shapeKey);\n        }\n        for (let i = 0; i < outputShapeKeys.length; i++) {\n            const key = outputShapeKeys[i];\n            generic_utils.assert(key in layersToOutputShapes);\n            outputShapes.push(layersToOutputShapes[key]);\n        }\n        // TODO(michaelterry): Update cache\n        return generic_utils.singletonOrArray(outputShapes);\n    }\n    /**\n     * Computes output tensors for new inputs.\n     *\n     * Note:\n     *   - Expects `inputs` to be a list (potentially with 1 element).\n     *\n     * @param inputs List of tensors\n     * @param masks List of masks (tensors or null).\n     * @return Three lists: outputTensors, outputMasks, outputShapes\n     */\n    runInternalGraph(inputs, masks) {\n        if (masks == null) {\n            masks = generic_utils.pyListRepeat(null, inputs.length);\n        }\n        // Dictionary mapping reference tensors to tuples\n        // (computed tensor, compute mask)\n        // we assume a 1:1 mapping from tensor to mask\n        // TODO: raise exception when a `.computeMask()` call\n        // does not return a list the same size as `call`\n        const tensorMap = {};\n        for (let i = 0; i < this.inputs.length; ++i) {\n            const x = this.inputs[i];\n            const y = inputs[i];\n            const mask = masks[i];\n            tensorMap[x.id] = [y, mask];\n        }\n        const depthKeys = Object.keys(this.nodesByDepth)\n            .map(x => parseInt(x, 10))\n            .sort(generic_utils.reverseNumberCompare);\n        for (const depth of depthKeys) {\n            const nodes = this.nodesByDepth[depth];\n            for (const node of nodes) {\n                // This is always a single layer, never a list.\n                const layer = node.outboundLayer;\n                const referenceInputTensors = node.inputTensors;\n                const referenceOutputTensors = node.outputTensors;\n                // If all previous input tensors are available in tensorMap,\n                // then call node.inboundLayer on them.\n                // List of tuples [input, mask]:\n                const computedData = new Array();\n                for (const x of referenceInputTensors) {\n                    if (x.id in tensorMap) {\n                        computedData.push(tensorMap[x.id]);\n                    }\n                }\n                if (computedData.length === referenceInputTensors.length) {\n                    // TODO(michaelterry): Add K.name_scope here, if we need it.\n                    let kwargs = {};\n                    let computedTensors;\n                    let computedMasks;\n                    let outputTensors;\n                    let outputMasks;\n                    // call layer\n                    if (node.callArgs != null) {\n                        kwargs = node.callArgs;\n                    }\n                    if (computedData.length === 1) {\n                        const [computedTensor, computedMask] = computedData[0];\n                        if (kwargs['mask'] == null) {\n                            kwargs['mask'] = computedMask;\n                        }\n                        outputTensors =\n                            generic_utils.toList(layer.call(computedTensor, kwargs));\n                        outputMasks = generic_utils.toList(layer.computeMask(computedTensor, computedMask));\n                        computedTensors = [computedTensor];\n                        computedMasks = [computedMask];\n                    }\n                    else {\n                        computedTensors = computedData.map(x => x[0]);\n                        computedMasks = computedData.map(x => x[1]);\n                        if (kwargs['mask'] == null) {\n                            kwargs['mask'] = computedMasks;\n                        }\n                        outputTensors =\n                            generic_utils.toList(layer.call(computedTensors, kwargs));\n                        outputMasks = generic_utils.toList(layer.computeMask(computedTensors, computedMasks));\n                    }\n                    if (layer.activityRegularizer) {\n                        throw new NotImplementedError('LayersModel invocation with concrete Tensor value(s) in the ' +\n                            'presence of activity regularizer(s) is not supported yet.');\n                    }\n                    // TODO(michaelterry): Add model updates and losses\n                    // Update tensor map.\n                    for (let i = 0; i < referenceOutputTensors.length; ++i) {\n                        const x = referenceOutputTensors[i];\n                        const y = outputTensors[i];\n                        const mask = outputMasks[i];\n                        tensorMap[x.id] = [y, mask];\n                    }\n                }\n            }\n        }\n        const outputTensors = [];\n        const outputMasks = [];\n        const outputShapes = [];\n        for (const x of this.outputs) {\n            generic_utils.assert(x.id in tensorMap, `Could not compute output ${x.name} : ${x.id}`);\n            const [tensor, mask] = tensorMap[x.id];\n            outputShapes.push(tensor.shape);\n            outputTensors.push(tensor);\n            outputMasks.push(mask);\n        }\n        // TODO(michaelterry): Add support for caches.\n        return [outputTensors, outputMasks, outputShapes];\n    }\n    /**\n     * Builds a map of internal node keys to node ordering.\n     * Used in serializaion a node orderings may change as unused nodes are\n     * dropped. Porting Note:  This helper method was pulled out of getConfig to\n     * improve readability.\n     * @param layers An array of Layers in the model.\n     * @returns Map of Node Keys to index order within the layer.\n     */\n    buildNodeConversionMap(layers) {\n        const nodeConversionMap = {};\n        let keptNodes;\n        for (const layer of this.layers) {\n            keptNodes = layer instanceof Container ? 1 : 0;\n            for (let originalNodeIndex = 0; originalNodeIndex < layer.inboundNodes.length; originalNodeIndex++) {\n                const nodeKey = Container.nodeKey(layer, originalNodeIndex);\n                if (this.containerNodes.has(nodeKey)) {\n                    // i.e. we mark it to be saved\n                    nodeConversionMap[nodeKey] = keptNodes;\n                    keptNodes += 1;\n                }\n            }\n        }\n        return nodeConversionMap;\n    }\n    /**\n     * Retrieves a layer based on either its name (unique) or index.\n     *\n     * Indices are based on order of horizontal graph traversal (bottom-up).\n     *\n     * If both `name` and `index` are specified, `index` takes precedence.\n     *\n     * @param name Name of layer.\n     * @param index Index of layer.\n     * @returns A Layer instance.\n     * @throws ValueError: In case of invalid layer name or index.\n     *\n     * @doc {\n     *    heading: 'Layers',\n     *    subheading: 'Classes',\n     *    namespace: 'layers',\n     *    subclasses: ['LayersModel']\n     * }\n     */\n    getLayer(name, index) {\n        if (index != null) {\n            if (this.layers.length <= index) {\n                throw new ValueError(`Was asked to retrieve layer at index ${index}, but model only ` +\n                    `has ${this.layers.length} layer(s).`);\n            }\n            else {\n                return this.layers[index];\n            }\n        }\n        else {\n            if (name == null) {\n                throw new ValueError('Provide either a layer name or layer index');\n            }\n        }\n        for (const layer of this.layers) {\n            if (layer.name === name) {\n                return layer;\n            }\n        }\n        throw new ValueError(`No such layer: ${name}`);\n    }\n    /**\n     * Retrieves the Container's current loss values.\n     *\n     * Used for regularizers during training.\n     */\n    calculateLosses() {\n        // Porting Node: This is an augmentation to Container.loss in PyKeras.\n        //   In PyKeras, Container.loss returns symbolic tensors. Here a concrete\n        //   Tensor (specifically Scalar) values are returned. This is due to the\n        //   imperative backend.\n        return tidy(() => {\n            const losses = [];\n            for (const layer of this.layers) {\n                for (let nodeIndex = 0; nodeIndex < layer.inboundNodes.length; ++nodeIndex) {\n                    const nodeKey = Container.nodeKey(layer, nodeIndex);\n                    if (this.containerNodes.has(nodeKey)) {\n                        losses.push(...layer.calculateLosses());\n                    }\n                }\n            }\n            // TODO(cais): Add any unconditional model-level losses?\n            return losses;\n        });\n    }\n    getConfig() {\n        const config = { name: this.name };\n        // Build a map from layer unique name (self._node_key)\n        // to the index of the nodes that are saved in the config.\n        // Only nodes in container_nodes are saved.\n        const nodeConversionMap = this.buildNodeConversionMap(this.layers);\n        // Serialize and save the layers in layerConfigs\n        const layerConfigs = [];\n        for (const layer of this.layers) {\n            const layerClassName = layer.getClassName();\n            const layerConfig = layer.getConfig();\n            const filteredInboundNodes = [];\n            for (let originalNodeIndex = 0; originalNodeIndex < layer.inboundNodes.length; originalNodeIndex++) {\n                const node = layer.inboundNodes[originalNodeIndex];\n                const nodeKey = Container.nodeKey(layer, originalNodeIndex);\n                let kwargs = {};\n                if (this.containerNodes.has(nodeKey)) {\n                    // The node is relevant to the model:\n                    // add to filteredInboundNodes.\n                    if (node.callArgs) {\n                        try {\n                            JSON.stringify(node.callArgs);\n                            kwargs = node.callArgs;\n                        }\n                        catch (err) {\n                            console.warn(`Layer ${layer.name} was passed ` +\n                                `non-serializable keyword arguments: ` +\n                                `${node.callArgs}. They will not be included ` +\n                                `in the serialized model (and thus will be ` +\n                                `missing at deserialization time).`);\n                            kwargs = {};\n                        }\n                    }\n                    if (node.inboundLayers.length > 0) {\n                        const nodeData = [];\n                        for (let i = 0; i < node.inboundLayers.length; i++) {\n                            const inboundLayer = node.inboundLayers[i];\n                            const nodeIndex = node.nodeIndices[i];\n                            const tensorIndex = node.tensorIndices[i];\n                            const nodeKey = Container.nodeKey(inboundLayer, nodeIndex);\n                            let newNodeIndex = nodeConversionMap[nodeKey];\n                            if (newNodeIndex == null) {\n                                newNodeIndex = 0;\n                            }\n                            nodeData.push([inboundLayer.name, newNodeIndex, tensorIndex, kwargs]);\n                        }\n                        filteredInboundNodes.push(nodeData);\n                    }\n                }\n            }\n            const dict = {};\n            dict['name'] = layer.name;\n            dict['className'] = layerClassName;\n            dict['config'] = layerConfig;\n            dict['inboundNodes'] = filteredInboundNodes;\n            layerConfigs.push(dict);\n        }\n        config['layers'] = layerConfigs;\n        // Gather info about inputs and outputs\n        const modelInputs = [];\n        for (let i = 0; i < this.inputLayers.length; i++) {\n            const layer = this.inputLayers[i];\n            const nodeIndex = this.inputLayersNodeIndices[i];\n            const nodeKey = Container.nodeKey(layer, nodeIndex);\n            if (!this.containerNodes.has(nodeKey)) {\n                continue;\n            }\n            let newNodeIndex = nodeConversionMap[nodeKey];\n            if (newNodeIndex === null || newNodeIndex === undefined) {\n                newNodeIndex = 0;\n            }\n            const tensorIndex = this.inputLayersTensorIndices[i];\n            modelInputs.push([layer.name, newNodeIndex, tensorIndex]);\n        }\n        config['inputLayers'] = modelInputs;\n        const modelOutputs = [];\n        for (let i = 0; i < this.outputLayers.length; i++) {\n            const layer = this.outputLayers[i];\n            const nodeIndex = this.outputLayersNodeIndices[i];\n            const nodeKey = Container.nodeKey(layer, nodeIndex);\n            if (!this.containerNodes.has(nodeKey)) {\n                continue;\n            }\n            let newNodeIndex = nodeConversionMap[nodeKey];\n            if (newNodeIndex === null || newNodeIndex === undefined) {\n                newNodeIndex = 0;\n            }\n            const tensorIndex = this.outputLayersTensorIndices[i];\n            modelOutputs.push([layer.name, newNodeIndex, tensorIndex]);\n        }\n        config['outputLayers'] = modelOutputs;\n        return config;\n    }\n    /**\n     * Instantiates a LayersModel from its config (output of `get_config()`).\n     * @param cls the class to create\n     * @param config LayersModel config dictionary.\n     * @param customObjects An optional dictionary of custom objects.\n     * @param fastWeightInit Optional flag to use fast weight initialization\n     *   during deserialization. This is applicable to cases in which\n     *   the initialization will be immediately overwritten by loaded weight\n     *   values. Default: `false`.\n     * @returns A LayersModel instance.\n     * @throws ValueError: In case of improperly formatted config dict.\n     */\n    /** @nocollapse */\n    static fromConfig(cls, config, customObjects = {}, fastWeightInit = false) {\n        // Layer instances created during\n        // the graph reconstruction process\n        const createdLayers = {};\n        // Dictionary mapping layer instances to\n        // node data that specifies a layer call.\n        // It acts as a queue that maintains any unprocessed\n        // layer call until it becomes possible to process it\n        // (i.e. until the input tensors to the call all exist).\n        const unprocessedNodes = {};\n        function addUnprocessedNode(layer, nodeData) {\n            if (!(layer.name in unprocessedNodes)) {\n                unprocessedNodes[layer.name] = [nodeData];\n            }\n            else {\n                unprocessedNodes[layer.name].push(nodeData);\n            }\n        }\n        function processNode(layer, nodeData) {\n            const inputTensors = [];\n            let kwargs;\n            for (const inputData of nodeData) {\n                const inboundLayerName = inputData[0];\n                const inboundNodeIndex = inputData[1];\n                const inboundTensorIndex = inputData[2];\n                kwargs = inputData[3] == null ?\n                    {} :\n                    inputData[3];\n                if (!(inboundLayerName in createdLayers)) {\n                    addUnprocessedNode(layer, nodeData);\n                    return;\n                }\n                const inboundLayer = createdLayers[inboundLayerName];\n                if (inboundLayer.inboundNodes.length <= inboundNodeIndex) {\n                    addUnprocessedNode(layer, nodeData);\n                    return;\n                }\n                const inboundNode = inboundLayer.inboundNodes[inboundNodeIndex];\n                inputTensors.push(inboundNode.outputTensors[inboundTensorIndex]);\n            }\n            // Call layer on its inputs, thus creating the node\n            // and building the layer if needed.\n            // Note: This has Eager vs Graph Implications.\n            if (inputTensors.length > 0) {\n                layer.apply(generic_utils.singletonOrArray(inputTensors), kwargs); // was ** kwargs\n            }\n        }\n        /**\n         * Deserialize a layer, then call it on appropriate inputs.\n         * @param layerData: layer config dict.\n         * @throws ValueError: In case of improperly formatted `layer_data`\n         * dict.\n         */\n        function processLayer(layerData) {\n            const layerName = layerData['name'];\n            // Instantiate layer.\n            const layer = deserializeLayer(layerData, config['customObjects'] != null ?\n                config['customObjects'] :\n                {});\n            layer.setFastWeightInitDuringBuild(fastWeightInit);\n            createdLayers[layerName] = layer;\n            // Gather layer inputs.\n            const inboundNodesData = layerData['inboundNodes'];\n            inboundNodesData.forEach(nodeData => {\n                if (!(nodeData instanceof Array)) {\n                    throw new ValueError(`Corrupted configuration, expected array for nodeData: ${nodeData}`);\n                }\n                // We don't process nodes (i.e. make layer calls)\n                // on the fly because the inbound node may not yet exist,\n                // in case of layer shared at different topological depths\n                // (e.g.a model such as A(B(A(B(x)))))\n                addUnprocessedNode(layer, nodeData);\n            });\n        }\n        // First, we create all layers and enqueue nodes to be processed.\n        const name = config['name'];\n        const layersFromConfig = config['layers'];\n        for (const layerData of layersFromConfig) {\n            processLayer(layerData);\n        }\n        // Then we process nodes in order of layer depth.\n        // Nodes that cannot yet be processed(if the inbound node\n        // does not yet exist) are re - enqueued, and the process\n        // is repeated until all nodes are processed.\n        while (!generic_utils.isObjectEmpty(unprocessedNodes)) {\n            for (const layerData of layersFromConfig) {\n                const layer = createdLayers[layerData['name']];\n                if (layer.name in unprocessedNodes) {\n                    const currentUnprocessedNodesForLayer = unprocessedNodes[layer.name];\n                    delete unprocessedNodes[layer.name];\n                    for (const nodeData of currentUnprocessedNodesForLayer) {\n                        processNode(layer, nodeData);\n                    }\n                }\n            }\n        }\n        const inputTensors = [];\n        const outputTensors = [];\n        const inputLayersFromConfig = config['inputLayers'];\n        for (const layerData of inputLayersFromConfig) {\n            const layerName = layerData[0];\n            const nodeIndex = layerData[1];\n            const tensorIndex = layerData[2];\n            generic_utils.assert(layerName in createdLayers);\n            const layer = createdLayers[layerName];\n            const layerOutputTensors = layer.inboundNodes[nodeIndex].outputTensors;\n            inputTensors.push(layerOutputTensors[tensorIndex]);\n        }\n        const outputLayersFromConfig = config['outputLayers'];\n        for (const layerData of outputLayersFromConfig) {\n            const layerName = layerData[0];\n            const nodeIndex = layerData[1];\n            const tensorIndex = layerData[2];\n            generic_utils.assert(layerName in createdLayers);\n            const layer = createdLayers[layerName];\n            const layerOutputTensors = layer.inboundNodes[nodeIndex].outputTensors;\n            outputTensors.push(layerOutputTensors[tensorIndex]);\n        }\n        return new cls({ inputs: inputTensors, outputs: outputTensors, name });\n    }\n    /**\n     * Determine whether the container is stateful.\n     *\n     * Porting Note: this is the equivalent of the stateful @property of\n     *   the Container class in PyKeras.\n     */\n    get stateful() {\n        // Porting Note: This check is to prevent inadvertent setting of the\n        //   _stateful property of the Container instance.\n        if (this._stateful) {\n            throw new ValueError('Container instance unexpectedly has _stateful = true. The ' +\n                'statefulness of a Container is determined by the Layers it ' +\n                'contains. Its _stateful property must remain the default false.');\n        }\n        for (const layer of this.layers) {\n            if (layer.stateful) {\n                return true;\n            }\n        }\n        return false;\n    }\n    /**\n     * Reset the state of all stateful constituent layers (if any).\n     *\n     * Examples of stateful layers include RNN layers whose `stateful` property\n     * is set as `true`.\n     */\n    resetStates() {\n        tidy(() => {\n            this.layers.forEach(layer => {\n                // tslint:disable:no-any\n                if (layer.stateful) {\n                    layer.resetStates();\n                }\n                // tslint:enable:no-any\n            });\n        });\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2VuZ2luZS9jb250YWluZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCwrQ0FBK0M7QUFFL0MsT0FBTyxFQUFnRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDeEMsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFJeEUsT0FBTyxFQUFDLFdBQVcsSUFBSSxnQkFBZ0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXhFLE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDakUsT0FBTyxLQUFLLFdBQVcsTUFBTSxzQkFBc0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsYUFBYSxFQUFnQixNQUFNLGNBQWMsQ0FBQztBQUMxRCxPQUFPLEVBQUMsT0FBTyxJQUFJLGFBQWEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwRCxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUM3QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBZ0IsS0FBSyxFQUFFLElBQUksRUFBaUIsTUFBTSxZQUFZLENBQUM7QUFTdEU7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFnQixTQUFVLFNBQVEsS0FBSztJQW9DM0MsWUFBWSxJQUFtQjtRQUM3Qix5Q0FBeUM7UUFDekMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBcEJaLG1CQUFjLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztRQXFCakMsSUFBSSxDQUFDLElB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Z2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9lbmdpbmUvdG9wb2xvZ3kucHkgKi9cblxuaW1wb3J0IHtOYW1lZFRlbnNvck1hcCwgU2NhbGFyLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0VWlkfSBmcm9tICcuLi9iYWNrZW5kL3N0YXRlJztcbmltcG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvciwgUnVudGltZUVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge1RlbnNvcktleVdpdGhBcmdzQXJyYXl9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9ub2RlX2NvbmZpZyc7XG5pbXBvcnQge1B5SnNvbkRpY3R9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC90eXBlcyc7XG5pbXBvcnQge2Rlc2VyaWFsaXplIGFzIGRlc2VyaWFsaXplTGF5ZXJ9IGZyb20gJy4uL2xheWVycy9zZXJpYWxpemF0aW9uJztcbmltcG9ydCB7S3dhcmdzfSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBnZW5lcmljX3V0aWxzIGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuaW1wb3J0IHtjb252ZXJ0VHNUb1B5dGhvbmljfSBmcm9tICcuLi91dGlscy9zZXJpYWxpemF0aW9uX3V0aWxzJztcbmltcG9ydCAqIGFzIHR5cGVzX3V0aWxzIGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7YmF0Y2hTZXRWYWx1ZSwgTGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcbmltcG9ydCB7dmVyc2lvbiBhcyBsYXllcnNWZXJzaW9ufSBmcm9tICcuLi92ZXJzaW9uJztcblxuaW1wb3J0IHtleGVjdXRlLCBGZWVkRGljdH0gZnJvbSAnLi9leGVjdXRvcic7XG5pbXBvcnQge0lucHV0TGF5ZXJ9IGZyb20gJy4vaW5wdXRfbGF5ZXInO1xuaW1wb3J0IHtEaXNwb3NlUmVzdWx0LCBMYXllciwgTm9kZSwgU3ltYm9saWNUZW5zb3J9IGZyb20gJy4vdG9wb2xvZ3knO1xuXG4vKiogQ29uc3RydWN0b3IgY29uZmlnIGZvciBDb250YWluZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbnRhaW5lckFyZ3Mge1xuICBpbnB1dHM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW107XG4gIG91dHB1dHM6IFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW107XG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBDb250YWluZXIgaXMgYSBkaXJlY3RlZCBhY3ljbGljIGdyYXBoIG9mIGxheWVycy5cbiAqXG4gKiBJdCBpcyB0aGUgdG9wb2xvZ2ljYWwgZm9ybSBvZiBhIFwibW9kZWxcIi4gQSBMYXllcnNNb2RlbFxuICogaXMgc2ltcGx5IGEgQ29udGFpbmVyIHdpdGggYWRkZWQgdHJhaW5pbmcgcm91dGluZXMuXG4gKlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ29udGFpbmVyIGV4dGVuZHMgTGF5ZXIge1xuICBpbnB1dHM6IFN5bWJvbGljVGVuc29yW107XG4gIG91dHB1dHM6IFN5bWJvbGljVGVuc29yW107XG5cbiAgaW5wdXRMYXllcnM6IExheWVyW107XG4gIGlucHV0TGF5ZXJzTm9kZUluZGljZXM6IG51bWJlcltdO1xuICBpbnB1dExheWVyc1RlbnNvckluZGljZXM6IG51bWJlcltdO1xuXG4gIG91dHB1dExheWVyczogTGF5ZXJbXTtcbiAgb3V0cHV0TGF5ZXJzTm9kZUluZGljZXM6IG51bWJlcltdO1xuICBvdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzOiBudW1iZXJbXTtcblxuICBsYXllcnM6IExheWVyW107XG4gIGxheWVyc0J5RGVwdGg6IHtbZGVwdGg6IHN0cmluZ106IExheWVyW119O1xuICBub2Rlc0J5RGVwdGg6IHtbZGVwdGg6IHN0cmluZ106IE5vZGVbXX07XG5cbiAgaW50ZXJuYWxDb250YWluZXJSZWZzOiBDb250YWluZXJbXTtcblxuICBjb250YWluZXJOb2RlcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIGNhY2hlIHN1cHBvcnRcbiAgLy8gcHJpdmF0ZSBvdXRwdXRNYXNrQ2FjaGU6IGFueTtcbiAgLy8gcHJpdmF0ZSBvdXRwdXRUZW5zb3JDYWNoZTogYW55O1xuICAvLyBwcml2YXRlIG91dHB1dFNoYXBlQ2FjaGU6IGFueTtcblxuICBpbnB1dE5hbWVzOiBzdHJpbmdbXTtcbiAgb3V0cHV0TmFtZXM6IHN0cmluZ1tdO1xuICBmZWVkSW5wdXRTaGFwZXM6IFNoYXBlW107XG5cbiAgcHJvdGVjdGVkIGludGVybmFsSW5wdXRTaGFwZXM6IFNoYXBlW107XG4gIHByb3RlY3RlZCBpbnRlcm5hbE91dHB1dFNoYXBlczogU2hhcGVbXTtcbiAgLy8gVE9ETyhjYWlzKTogTWF5YmUgJ2ZlZWQnIHNob3VsZCBub3QgaW4gdGhlIG5hbWVzIG9mIHRoZXNlIHZhcmlhYmxlcyxcbiAgLy8gICBkdWUgdG8gdGhlIGZhY3QgdGhhdCBvdXIgYmFja2VuZCBpcyBub3Qgc3ltYm9saWMuXG4gIHByb3RlY3RlZCBmZWVkSW5wdXROYW1lczogc3RyaW5nW107XG4gIHByb3RlY3RlZCBmZWVkT3V0cHV0TmFtZXM6IHN0cmluZ1tdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnRhaW5lckFyZ3MpIHtcbiAgICAvLyBObyBhcmdzIHBhc3NlZCB0byBzdXBlcidzIGNvbnN0cnVjdG9yLlxuICAgIHN1cGVyKHt9KTtcbiAgICB0aGlzLm5hbWUgPSBhcmdzLm5hbWU7XG4gICAgaWYgKHRoaXMubmFtZSA9PSBudWxsKSB7XG4gICAgICBjb25zdCBwcmVmaXggPSB0aGlzLmdldENsYXNzTmFtZSgpLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLm5hbWUgPSBnZXRVaWQocHJlZml4KTtcbiAgICB9XG5cbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IGZhbHNlO1xuICAgIHRoaXMudHJhaW5hYmxlXyA9IHRydWU7XG5cbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEluaXRpYWxpemUgcGVySW5wdXRMb3NzZXMvVXBkYXRlcyBoZXJlLlxuXG4gICAgLy8gQ29udGFpbmVyLXNwZWNpZmljIHByb3BlcnRpZXMuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5pbnB1dHMpKSB7XG4gICAgICB0aGlzLmlucHV0cyA9IGFyZ3MuaW5wdXRzLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaW5wdXRzID0gW2FyZ3MuaW5wdXRzXTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5vdXRwdXRzKSkge1xuICAgICAgdGhpcy5vdXRwdXRzID0gYXJncy5vdXRwdXRzLnNsaWNlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub3V0cHV0cyA9IFthcmdzLm91dHB1dHNdO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciByZWR1bmRhbmN5IGluIGlucHV0cy5cbiAgICBpZiAoZ2VuZXJpY191dGlscy51bmlxdWUodGhpcy5pbnB1dHMpLmxlbmd0aCAhPT0gdGhpcy5pbnB1dHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnVGhlIGxpc3Qgb2YgaW5wdXRzIHBhc3NlZCB0byB0aGUgbW9kZWwgaXMgJyArXG4gICAgICAgICAgJ3JlZHVuZGFudC4gQWxsIGlucHV0cyBzaG91bGQgb25seSBhcHBlYXIgb25jZS4gRm91bmQ6ICcgK1xuICAgICAgICAgIGAke3RoaXMuaW5wdXRzLm1hcCh4ID0+IHgubmFtZSl9YCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgZm9yIHJlZHVuZGFuY3kgaW4gb3V0cHV0cy5cbiAgICBpZiAoZ2VuZXJpY191dGlscy51bmlxdWUodGhpcy5vdXRwdXRzKS5sZW5ndGggIT09IHRoaXMub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnVGhlIGxpc3Qgb2Ygb3V0cHV0cyBwYXNzZWQgdG8gdGhlIG1vZGVsIGlzIHJlZHVuZGFudC4gJyArXG4gICAgICAgICAgJ0FsbCBvdXRwdXRzIHNob3VsZCBvbmx5IGFwcGVhciBvbmNlLiBGb3VuZDogJyArXG4gICAgICAgICAgYCR7dGhpcy5vdXRwdXRzLm1hcCh4ID0+IHgubmFtZSl9YCk7XG4gICAgfVxuXG4gICAgLypcbiAgICAgIExpc3Qgb2YgaW5pdGlhbCBsYXllcnMgKDEgdG8gMSBtYXBwaW5nIHdpdGggdGhpcy5pbnB1dHMsIGhlbmNlIHRoZSBzYW1lXG4gICAgICBsYXllciBtaWdodCBhcHBlYXIgdHdpY2UpXG4gICAgKi9cbiAgICB0aGlzLmlucHV0TGF5ZXJzID0gW107XG4gICAgdGhpcy5pbnB1dExheWVyc05vZGVJbmRpY2VzID0gW107XG4gICAgdGhpcy5pbnB1dExheWVyc1RlbnNvckluZGljZXMgPSBbXTtcbiAgICAvKlxuICAgICAgTGlzdCBvZiBsYXllcnMgKDEgdG8gMSBtYXBwaW5nIHdpdGggdGhpcy5vdXRwdXRzLCBoZW5jZSB0aGUgc2FtZSBsYXllclxuICAgICAgbWlnaHQgYXBwZWFyIHR3aWNlKVxuICAgICovXG4gICAgdGhpcy5vdXRwdXRMYXllcnMgPSBbXTtcbiAgICB0aGlzLm91dHB1dExheWVyc05vZGVJbmRpY2VzID0gW107XG4gICAgdGhpcy5vdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzID0gW107XG4gICAgLypcbiAgICAgIEFsbCBsYXllcnMgaW4gb3JkZXIgb2YgaG9yaXpvbnRhbCBncmFwaCB0cmF2ZXJzYWwuIEVudHJpZXMgYXJlIHVuaXF1ZS5cbiAgICAgIEluY2x1ZGVzIGlucHV0IGFuZCBvdXRwdXQgbGF5ZXJzLlxuICAgICovXG4gICAgdGhpcy5sYXllcnMgPSBbXTtcblxuICAgIC8qXG4gICAgICBSZWZlcmVuY2VzIHRvIGNvbnRhaW5lciBsYXllcnMgdGhhdCB3ZXJlIGNvbnN0cnVjdGVkIGludGVybmFsbHkuIFdlIG5lZWRcbiAgICAgIHRoZXNlIHRvIHByb3Blcmx5IGRpc3Bvc2Ugb2YgdGVuc29ycyBmcm9tIG5lc3RlZCBjb250YWluZXJzLlxuICAgICovXG4gICAgdGhpcy5pbnRlcm5hbENvbnRhaW5lclJlZnMgPSBbXTtcblxuICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogRGV0ZXJtaW5lIGlmIGNhY2hpbmcgc3RpbGwgbmVlZGVkIHdpdGggZWFnZXJcbiAgICAvLyBiYWNrZW5kLlxuICAgIC8qXG4gICAgICBUaGlzIGlzIGZvciBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gd2hlbiBjYWxsaW5nIHRoZSBDb250YWluZXIgb24gbmV3XG4gICAgICBpbnB1dHMuIEV2ZXJ5IHRpbWUgdGhlIENvbnRhaW5lciBpcyBjYWxsZWQgb24gYSBzZXQgb24gaW5wdXQgdGVuc29ycyxcbiAgICAgIHdlIGNvbXB1dGUgdGhlIG91dHB1dCB0ZW5zb3JzLCBvdXRwdXQgbWFza3MgYW5kIG91dHB1dCBzaGFwZXMgaW4gb25lIHBhc3MsXG4gICAgICB0aGVuIGNhY2hlIHRoZW0gaGVyZS4gV2hlbiBvbmUgb2YgdGhlc2Ugb3V0cHV0cyBpcyBxdWVyaWVkIGxhdGVyLFxuICAgICAgd2UgcmV0cmlldmUgaXQgZnJvbSB0aGVyZSBpbnN0ZWFkIG9mIHJlY29tcHV0aW5nIGl0LlxuICAgICovXG4gICAgLy8gdGhpcy5vdXRwdXRUZW5zb3JDYWNoZSA9IHt9O1xuICAgIC8vIHRoaXMub3V0cHV0U2hhcGVDYWNoZSA9IHt9O1xuXG4gICAgLy8gQnVpbGQgdGhpcy5vdXRwdXRMYXllcnM6XG4gICAgZm9yIChjb25zdCB4IG9mIHRoaXMub3V0cHV0cykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB4LnNvdXJjZUxheWVyO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0geC5ub2RlSW5kZXg7XG4gICAgICBjb25zdCB0ZW5zb3JJbmRleCA9IHgudGVuc29ySW5kZXg7XG4gICAgICB0aGlzLm91dHB1dExheWVycy5wdXNoKGxheWVyKTtcbiAgICAgIHRoaXMub3V0cHV0TGF5ZXJzTm9kZUluZGljZXMucHVzaChub2RlSW5kZXgpO1xuICAgICAgdGhpcy5vdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzLnB1c2godGVuc29ySW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIG91dHB1dCBtYXNrIGNhY2hlIGNvZGUuXG5cbiAgICAvLyBCdWlsZCB0aGlzLmlucHV0TGF5ZXJzOlxuICAgIGZvciAoY29uc3QgeCBvZiB0aGlzLmlucHV0cykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB4LnNvdXJjZUxheWVyO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0geC5ub2RlSW5kZXg7XG4gICAgICBjb25zdCB0ZW5zb3JJbmRleCA9IHgudGVuc29ySW5kZXg7XG4gICAgICAvKlxuICAgICAgICBJdCdzIHN1cHBvc2VkIHRvIGJlIGFuIGlucHV0IGxheWVyLCBzbyBvbmx5IG9uZSBub2RlXG4gICAgICAgIGFuZCBvbmUgdGVuc29yIG91dHB1dC5cbiAgICAgICovXG4gICAgICBnZW5lcmljX3V0aWxzLmFzc2VydChub2RlSW5kZXggPT09IDAsICdpbnB1dCBsYXllciBoYXMgPjEgbm9kZXMnKTtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KHRlbnNvckluZGV4ID09PSAwLCAnaW5wdXQgbGF5ZXIgaGFzID4xIHRlbnNvcnMnKTtcbiAgICAgIHRoaXMuaW5wdXRMYXllcnMucHVzaChsYXllcik7XG4gICAgICB0aGlzLmlucHV0TGF5ZXJzTm9kZUluZGljZXMucHVzaChub2RlSW5kZXgpO1xuICAgICAgdGhpcy5pbnB1dExheWVyc1RlbnNvckluZGljZXMucHVzaCh0ZW5zb3JJbmRleCk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgdGhpcy5pbnB1dE5hbWVzIGFuZCB0aGlzLm91dHB1dE5hbWVzLlxuICAgIHRoaXMuaW5wdXROYW1lcyA9IFtdO1xuICAgIHRoaXMub3V0cHV0TmFtZXMgPSBbXTtcbiAgICB0aGlzLmZlZWRJbnB1dFNoYXBlcyA9IFtdO1xuICAgIHRoaXMuZmVlZElucHV0TmFtZXMgPSBbXTtcbiAgICB0aGlzLmZlZWRPdXRwdXROYW1lcyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnB1dExheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmlucHV0TGF5ZXJzW2ldO1xuICAgICAgLy8gQ2hlY2sgdGhhdCBsYXllciBpcyBhbiBJbnB1dExheWVyLlxuICAgICAgaWYgKCEobGF5ZXIgaW5zdGFuY2VvZiBJbnB1dExheWVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgICAgJ0lucHV0IGxheWVycyB0byBhIExheWVyc01vZGVsIG11c3QgYmUgSW5wdXRMYXllciBvYmplY3RzLiAnICtcbiAgICAgICAgICAgIGBSZWNlaXZlZCBpbnB1dHM6ICR7YXJncy5pbnB1dHN9LiBgICtcbiAgICAgICAgICAgIGBJbnB1dCAke2l9ICgwLWJhc2VkKSBvcmlnaW5hdGVzIGAgK1xuICAgICAgICAgICAgYGZyb20gbGF5ZXIgdHlwZSAke2xheWVyLmdldENsYXNzTmFtZSgpfS5gKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuaW5wdXROYW1lcy5wdXNoKGxheWVyLm5hbWUpO1xuICAgICAgdGhpcy5mZWVkSW5wdXRTaGFwZXMucHVzaChsYXllci5iYXRjaElucHV0U2hhcGUpO1xuXG4gICAgICB0aGlzLmZlZWRJbnB1dE5hbWVzLnB1c2gobGF5ZXIubmFtZSk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5vdXRwdXRMYXllcnMpIHtcbiAgICAgIHRoaXMub3V0cHV0TmFtZXMucHVzaChsYXllci5uYW1lKTtcbiAgICB9XG5cbiAgICB0aGlzLmludGVybmFsSW5wdXRTaGFwZXMgPSB0aGlzLmlucHV0cy5tYXAoeCA9PiB4LnNoYXBlKTtcbiAgICB0aGlzLmludGVybmFsT3V0cHV0U2hhcGVzID0gdGhpcy5vdXRwdXRzLm1hcCh4ID0+IHguc2hhcGUpO1xuXG4gICAgLypcbiAgICAgIENvbnRhaW5lcl9ub2Rlczogc2V0IG9mIG5vZGVzIGluY2x1ZGVkIGluIHRoZSBncmFwaCAobm90IGFsbCBub2Rlc1xuICAgICAgaW5jbHVkZWQgaW4gdGhlIGxheWVycyBhcmUgcmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgZ3JhcGgpLlxuICAgICovXG4gICAgLy8gaWRzIG9mIGFsbCBub2RlcyByZWxldmFudCB0byB0aGUgQ29udGFpbmVyOlxuICAgIGNvbnN0IG5vZGVzRGVwdGhzOiB7W25vZGVJRDogc3RyaW5nXTogbnVtYmVyfSA9IHt9O1xuICAgIC8vIFRvIHJlY292ZXIgbm9kZXMgZnJvbSB0aGVpciBJRC5cbiAgICBjb25zdCBub2RlSURUb05vZGU6IHtbbm9kZUlEOiBzdHJpbmddOiBOb2RlfSA9IHt9O1xuICAgIGNvbnN0IGxheWVyc0RlcHRoczoge1tsYXllcklEOiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgLy8gVG8gbGF5ZXJzIGZyb20gdGhlaXIgSUQuXG4gICAgY29uc3QgbGF5ZXJJRFRvTGF5ZXI6IHtbbGF5ZXJJRDogc3RyaW5nXTogTGF5ZXJ9ID0ge307XG4gICAgY29uc3QgbGF5ZXJJbmRpY2VzOiB7W2xheWVySUQ6IHN0cmluZ106IG51bWJlcn0gPSB7fTtcbiAgICBjb25zdCBub2Rlc0luRGVjcmVhc2luZ0RlcHRoOiBOb2RlW10gPSBbXTtcblxuICAgIC8qKlxuICAgICAqIEJ1aWxkcyBhIG1hcCBvZiB0aGUgZ3JhcGggb2YgbGF5ZXJzLlxuICAgICAqXG4gICAgICogVGhpcyByZWN1cnNpdmVseSB1cGRhdGVzIHRoZSBtYXAgYGxheWVySW5kaWNlc2AsXG4gICAgICogdGhlIGxpc3QgYG5vZGVzSW5EZWNyZWFzaW5nRGVwdGhgIGFuZCB0aGUgc2V0IGBjb250YWluZXJOb2Rlc2AuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gdGVuc29yIFNvbWUgdGVuc29yIGluIGEgZ3JhcGguXG4gICAgICogQHBhcmFtIGZpbmlzaGVkTm9kZXMgU2V0IG9mIG5vZGVzIHdob3NlIHN1YmdyYXBocyBoYXZlIGJlZW4gdHJhdmVyc2VkXG4gICAgICogICAgICAgICBjb21wbGV0ZWx5LiBVc2VmdWwgdG8gcHJldmVudCBkdXBsaWNhdGVkIHdvcmsuXG4gICAgICogQHBhcmFtIG5vZGVzSW5Qcm9ncmVzcyBTZXQgb2Ygbm9kZXMgdGhhdCBhcmUgY3VycmVudGx5IGFjdGl2ZSBvbiB0aGVcbiAgICAgKiAgICAgICAgIHJlY3Vyc2lvbiBzdGFjay4gVXNlZnVsIHRvIGRldGVjdCBjeWNsZXMuXG4gICAgICogQHBhcmFtIGxheWVyIExheWVyIGZyb20gd2hpY2ggYHRlbnNvcmAgY29tZXMgZnJvbS4gSWYgbm90IHByb3ZpZGVkLFxuICAgICAqICAgd2lsbCBiZSBvYnRhaW5lZCBmcm9tIHRlbnNvci5zb3VyY2VMYXllci5cbiAgICAgKiBAcGFyYW0gbm9kZUluZGV4IE5vZGUgaW5kZXggZnJvbSB3aGljaCBgdGVuc29yYCBjb21lcyBmcm9tLlxuICAgICAqIEBwYXJhbSB0ZW5zb3JJbmRleCBUZW5zb3JJbmRleCBmcm9tIHdoaWNoIGB0ZW5zb3JgIGNvbWVzIGZyb20uXG4gICAgICpcbiAgICAgKiBAZXhjZXB0aW9uIFJ1bnRpbWVFcnJvciBpZiBhIGN5Y2xlIGlzIGRldGVjdGVkLlxuICAgICAqL1xuICAgIGNvbnN0IGJ1aWxkTWFwT2ZHcmFwaCA9XG4gICAgICAgICh0ZW5zb3I6IFN5bWJvbGljVGVuc29yLCBmaW5pc2hlZE5vZGVzOiBOb2RlW10sIG5vZGVzSW5Qcm9ncmVzczogTm9kZVtdLFxuICAgICAgICAgbGF5ZXI/OiBMYXllciwgbm9kZUluZGV4PzogbnVtYmVyLCB0ZW5zb3JJbmRleD86IG51bWJlcikgPT4ge1xuICAgICAgICAgIGlmIChsYXllciA9PSBudWxsIHx8IG5vZGVJbmRleCA9PSBudWxsIHx8IHRlbnNvckluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgIGxheWVyID0gdGVuc29yLnNvdXJjZUxheWVyO1xuICAgICAgICAgICAgbm9kZUluZGV4ID0gdGVuc29yLm5vZGVJbmRleDtcbiAgICAgICAgICAgIHRlbnNvckluZGV4ID0gdGVuc29yLnRlbnNvckluZGV4O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBub2RlID0gbGF5ZXIuaW5ib3VuZE5vZGVzW25vZGVJbmRleF07XG5cbiAgICAgICAgICAvLyBQcmV2ZW50IGN5Y2xlcy5cbiAgICAgICAgICBpZiAobm9kZXNJblByb2dyZXNzLmluZGV4T2Yobm9kZSkgIT09IC0xKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgdGVuc29yICR7dGVuc29yLm5hbWV9IGF0IGxheWVyIFwiJHtsYXllci5uYW1lfVwiIGAgK1xuICAgICAgICAgICAgICAgICdpcyBwYXJ0IG9mIGEgY3ljbGUuJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRG9uJ3QgcmVwZWF0IHdvcmsgZm9yIHNoYXJlZCBzdWJncmFwaHNcbiAgICAgICAgICBpZiAoZmluaXNoZWROb2Rlcy5pbmRleE9mKG5vZGUpICE9PSAtMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFVwZGF0ZSBjb250YWluZXJOb2Rlcy5cbiAgICAgICAgICB0aGlzLmNvbnRhaW5lck5vZGVzLmFkZChDb250YWluZXIubm9kZUtleShsYXllciwgbm9kZUluZGV4KSk7XG5cbiAgICAgICAgICAvLyBTdG9yZSB0aGUgdHJhdmVyc2FsIG9yZGVyIGZvciBsYXllciBzb3J0aW5nLlxuICAgICAgICAgIGlmICghKGxheWVyLmlkIGluIGxheWVySW5kaWNlcykpIHtcbiAgICAgICAgICAgIGxheWVySW5kaWNlc1tsYXllci5pZF0gPSBPYmplY3Qua2V5cyhsYXllckluZGljZXMpLmxlbmd0aDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAobm9kZXNJblByb2dyZXNzLmluZGV4T2Yobm9kZSkgPT09IC0xKSB7XG4gICAgICAgICAgICBub2Rlc0luUHJvZ3Jlc3MucHVzaChub2RlKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBQcm9wYWdhdGUgdG8gYWxsIHByZXZpb3VzIHRlbnNvcnMgY29ubmVjdGVkIHRvIHRoaXMgbm9kZS5cbiAgICAgICAgICBjb25zdCBudW1JbmJvdW5kTGF5ZXJzID0gbm9kZS5pbmJvdW5kTGF5ZXJzLmxlbmd0aDtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUluYm91bmRMYXllcnM7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgeCA9IG5vZGUuaW5wdXRUZW5zb3JzW2ldO1xuICAgICAgICAgICAgY29uc3QgbGF5ZXIgPSBub2RlLmluYm91bmRMYXllcnNbaV07XG4gICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2RlLm5vZGVJbmRpY2VzW2ldO1xuICAgICAgICAgICAgY29uc3QgdGVuc29ySW5kZXggPSBub2RlLnRlbnNvckluZGljZXNbaV07XG4gICAgICAgICAgICBidWlsZE1hcE9mR3JhcGgoXG4gICAgICAgICAgICAgICAgeCwgZmluaXNoZWROb2Rlcywgbm9kZXNJblByb2dyZXNzLCBsYXllciwgbm9kZUluZGV4LFxuICAgICAgICAgICAgICAgIHRlbnNvckluZGV4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmluaXNoZWROb2Rlcy5wdXNoKG5vZGUpO1xuICAgICAgICAgIHdoaWxlIChub2Rlc0luUHJvZ3Jlc3MuaW5kZXhPZihub2RlKSA+PSAwKSB7XG4gICAgICAgICAgICBub2Rlc0luUHJvZ3Jlc3Muc3BsaWNlKG5vZGVzSW5Qcm9ncmVzcy5pbmRleE9mKG5vZGUpLCAxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbm9kZXNJbkRlY3JlYXNpbmdEZXB0aC5wdXNoKG5vZGUpO1xuICAgICAgICB9O1xuXG4gICAgY29uc3QgZmluaXNoZWROb2RlczogTm9kZVtdID0gW107XG4gICAgY29uc3Qgbm9kZXNJblByb2dyZXNzOiBOb2RlW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IHggb2YgdGhpcy5vdXRwdXRzKSB7XG4gICAgICBidWlsZE1hcE9mR3JhcGgoeCwgZmluaXNoZWROb2Rlcywgbm9kZXNJblByb2dyZXNzKTtcbiAgICB9XG5cbiAgICBjb25zdCByZXZlcnNlZE5vZGVzSW5EZWNyZWFzaW5nRGVwdGggPVxuICAgICAgICBub2Rlc0luRGVjcmVhc2luZ0RlcHRoLnNsaWNlKCkucmV2ZXJzZSgpO1xuICAgIGZvciAoY29uc3Qgbm9kZSBvZiByZXZlcnNlZE5vZGVzSW5EZWNyZWFzaW5nRGVwdGgpIHtcbiAgICAgIG5vZGVJRFRvTm9kZVtub2RlLmlkXSA9IG5vZGU7XG4gICAgICAvLyBJZiB0aGUgZGVwdGggaXMgbm90IHNldCwgdGhlIG5vZGUgaGFzIG5vIG91dGJvdW5kIG5vZGVzIChkZXB0aCAwKS5cbiAgICAgIGlmICghKG5vZGUuaWQgaW4gbm9kZXNEZXB0aHMpKSB7XG4gICAgICAgIG5vZGVzRGVwdGhzW25vZGUuaWRdID0gMDtcbiAgICAgIH1cbiAgICAgIGxldCBkZXB0aCA9IG5vZGVzRGVwdGhzW25vZGUuaWRdO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRlcHRoIG9mIHRoZSBjb3JyZXNwb25kaW5nIGxheWVyXG4gICAgICBjb25zdCBwcmV2aW91c0RlcHRoID1cbiAgICAgICAgICAobGF5ZXJzRGVwdGhzW25vZGUub3V0Ym91bmRMYXllci5pZF0gPT0gbnVsbCA/XG4gICAgICAgICAgICAgICAwIDpcbiAgICAgICAgICAgICAgIGxheWVyc0RlcHRoc1tub2RlLm91dGJvdW5kTGF5ZXIuaWRdKTtcblxuICAgICAgLypcbiAgICAgICAgSWYgd2UndmUgc2VlbiB0aGlzIGxheWVyIGJlZm9yZSBhdCBhIGhpZ2hlciBkZXB0aCwgd2Ugc2hvdWxkIHVzZSB0aGF0XG4gICAgICAgIGRlcHRoIGluc3RlYWQgb2YgdGhlIG5vZGUgZGVwdGguICBUaGlzIGlzIG5lY2Vzc2FyeSBmb3Igc2hhcmVkIGxheWVyc1xuICAgICAgICB0aGF0IGhhdmUgaW5wdXRzIGF0IGRpZmZlcmVudCBkZXB0aCBsZXZlbHMgaW4gdGhlIGdyYXBoLlxuICAgICAgKi9cbiAgICAgIGRlcHRoID0gTWF0aC5tYXgoZGVwdGgsIHByZXZpb3VzRGVwdGgpO1xuICAgICAgbGF5ZXJzRGVwdGhzW25vZGUub3V0Ym91bmRMYXllci5pZF0gPSBkZXB0aDtcbiAgICAgIGxheWVySURUb0xheWVyW25vZGUub3V0Ym91bmRMYXllci5pZF0gPSBub2RlLm91dGJvdW5kTGF5ZXI7XG4gICAgICBub2Rlc0RlcHRoc1tub2RlLmlkXSA9IGRlcHRoO1xuXG4gICAgICAvLyBVcGRhdGUgdGhlIGRlcHRoIG9mIGluYm91bmQgbm9kZXMuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGUuaW5ib3VuZExheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBpbmJvdW5kTGF5ZXIgPSBub2RlLmluYm91bmRMYXllcnNbaV07XG4gICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IG5vZGUubm9kZUluZGljZXNbaV07XG4gICAgICAgIGNvbnN0IGluYm91bmROb2RlID0gaW5ib3VuZExheWVyLmluYm91bmROb2Rlc1tub2RlSW5kZXhdO1xuICAgICAgICBjb25zdCBwcmV2aW91c0RlcHRoID1cbiAgICAgICAgICAgIChub2Rlc0RlcHRoc1tpbmJvdW5kTm9kZS5pZF0gPT0gbnVsbCA/IDAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXNEZXB0aHNbaW5ib3VuZE5vZGUuaWRdKTtcbiAgICAgICAgbm9kZXNEZXB0aHNbaW5ib3VuZE5vZGUuaWRdID0gTWF0aC5tYXgoZGVwdGggKyAxLCBwcmV2aW91c0RlcHRoKTtcbiAgICAgICAgbm9kZUlEVG9Ob2RlW2luYm91bmROb2RlLmlkXSA9IGluYm91bmROb2RlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJ1aWxkIGEgZGljdCB7ZGVwdGg6IGxpc3Qgb2Ygbm9kZXMgd2l0aCB0aGlzIGRlcHRofVxuICAgIGNvbnN0IG5vZGVzQnlEZXB0aDoge1tkZXB0aDogc3RyaW5nXTogTm9kZVtdfSA9IHt9O1xuICAgIGZvciAoY29uc3Qgbm9kZUlEIGluIG5vZGVzRGVwdGhzKSB7XG4gICAgICBjb25zdCBkZXB0aCA9IG5vZGVzRGVwdGhzW25vZGVJRF07XG4gICAgICBpZiAoIShkZXB0aCBpbiBub2Rlc0J5RGVwdGgpKSB7XG4gICAgICAgIG5vZGVzQnlEZXB0aFtkZXB0aF0gPSBbXTtcbiAgICAgIH1cbiAgICAgIG5vZGVzQnlEZXB0aFtkZXB0aF0ucHVzaChub2RlSURUb05vZGVbbm9kZUlEXSk7XG4gICAgfVxuXG4gICAgLy8gQnVpbGQgYSBkaWN0IHtkZXB0aDogbGlzdCBvZiBsYXllcnMgd2l0aCB0aGlzIGRlcHRofVxuICAgIGNvbnN0IGxheWVyc0J5RGVwdGg6IHtbZGVwdGg6IHN0cmluZ106IExheWVyW119ID0ge307XG4gICAgZm9yIChjb25zdCBsYXllcklEIGluIGxheWVyc0RlcHRocykge1xuICAgICAgY29uc3QgZGVwdGggPSBsYXllcnNEZXB0aHNbbGF5ZXJJRF07XG4gICAgICBpZiAoIShkZXB0aCBpbiBsYXllcnNCeURlcHRoKSkge1xuICAgICAgICBsYXllcnNCeURlcHRoW2RlcHRoXSA9IFtdO1xuICAgICAgfVxuICAgICAgbGF5ZXJzQnlEZXB0aFtkZXB0aF0ucHVzaChsYXllcklEVG9MYXllcltsYXllcklEXSk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHNvcnRlZCBsaXN0IG9mIGxheWVyIGRlcHRocy5cbiAgICBsZXQgZGVwdGhLZXlzID0gT2JqZWN0LmtleXMobGF5ZXJzQnlEZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoeCA9PiBwYXJzZUludCh4LCAxMCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc29ydChnZW5lcmljX3V0aWxzLnJldmVyc2VOdW1iZXJDb21wYXJlKTtcblxuICAgIC8vIFNldCB0aGlzLmxheWVycyBhbmQgdGhpcy5sYXllcnNCeURlcHRoLlxuICAgIHRoaXMubGF5ZXJzID0gW107XG4gICAgZm9yIChjb25zdCBkZXB0aCBvZiBkZXB0aEtleXMpIHtcbiAgICAgIGNvbnN0IGxheWVyc0ZvckRlcHRoID0gbGF5ZXJzQnlEZXB0aFtkZXB0aF07XG4gICAgICAvLyBDb250YWluZXIubGF5ZXJzIG5lZWRzIHRvIGhhdmUgYSBkZXRlcm1pbmlzdGljIG9yZGVyOlxuICAgICAgLy8gaGVyZSB3ZSBvcmRlciB0aGVtIGJ5IHRyYXZlcnNhbCBvcmRlci5cbiAgICAgIGxheWVyc0ZvckRlcHRoLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgY29uc3QgYUluZGV4ID0gbGF5ZXJJbmRpY2VzW2EuaWRdO1xuICAgICAgICBjb25zdCBiSW5kZXggPSBsYXllckluZGljZXNbYi5pZF07XG4gICAgICAgIGlmIChhSW5kZXggPCBiSW5kZXgpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFJbmRleCA+IGJJbmRleCkge1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfSk7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIGxheWVyc0ZvckRlcHRoKSB7XG4gICAgICAgIGlmIChsYXllciBpbnN0YW5jZW9mIENvbnRhaW5lcikge1xuICAgICAgICAgIHRoaXMuaW50ZXJuYWxDb250YWluZXJSZWZzLnB1c2gobGF5ZXIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmxheWVyc0J5RGVwdGggPSBsYXllcnNCeURlcHRoO1xuXG4gICAgLy8gR2V0IHNvcnRlZCBsaXN0IG9mIG5vZGUgZGVwdGhzO1xuICAgIGRlcHRoS2V5cyA9IE9iamVjdC5rZXlzKG5vZGVzQnlEZXB0aClcbiAgICAgICAgICAgICAgICAgICAgLm1hcCh4ID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgLnNvcnQoZ2VuZXJpY191dGlscy5yZXZlcnNlTnVtYmVyQ29tcGFyZSk7XG5cbiAgICAvLyBDaGVjayB0aGF0IGFsbCB0ZW5zb3JzIHJlcXVpcmVkIGFyZSBjb21wdXRhYmxlLlxuICAgIC8vIGNvbXB1dGFibGVfdGVuc29yczogYWxsIHRlbnNvcnMgaW4gdGhlIGdyYXBoXG4gICAgLy8gdGhhdCBjYW4gYmUgY29tcHV0ZWQgZnJvbSB0aGUgaW5wdXRzIHByb3ZpZGVkLlxuICAgIGNvbnN0IGNvbXB1dGFibGVUZW5zb3JzID0gdGhpcy5pbnB1dHMuc2xpY2UoKTtcblxuICAgIC8vIFRvIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbXNnLlxuICAgIGNvbnN0IGxheWVyc1dpdGhDb21wbGV0ZUlucHV0OiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgZGVwdGggb2YgZGVwdGhLZXlzKSB7XG4gICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXNCeURlcHRoW2RlcHRoXSkge1xuICAgICAgICBjb25zdCBsYXllciA9IG5vZGUub3V0Ym91bmRMYXllcjtcbiAgICAgICAgaWYgKGxheWVyICE9IG51bGwpIHtcbiAgICAgICAgICBmb3IgKGNvbnN0IHggb2Ygbm9kZS5pbnB1dFRlbnNvcnMpIHtcbiAgICAgICAgICAgIGlmIChjb21wdXRhYmxlVGVuc29ycy5pbmRleE9mKHgpID09PSAtMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgICAgICAgICAgYEdyYXBoIGRpc2Nvbm5lY3RlZDogY2Fubm90IG9idGFpbiB2YWx1ZSBmb3IgdGVuc29yICR7eH1gICtcbiAgICAgICAgICAgICAgICAgIGAgYXQgbGF5ZXIgXCIke2xheWVyLm5hbWV9XCIuIGAgK1xuICAgICAgICAgICAgICAgICAgJ1RoZSBmb2xsb3dpbmcgcHJldmlvdXMgbGF5ZXJzIHdlcmUgYWNjZXNzZWQgd2l0aG91dCAnICtcbiAgICAgICAgICAgICAgICAgIGBpc3N1ZTogJHtsYXllcnNXaXRoQ29tcGxldGVJbnB1dH1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCB4IG9mIG5vZGUub3V0cHV0VGVuc29ycykge1xuICAgICAgICAgICAgY29tcHV0YWJsZVRlbnNvcnMucHVzaCh4KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgbGF5ZXJzV2l0aENvbXBsZXRlSW5wdXQucHVzaChsYXllci5uYW1lKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCB0aGlzLmNvbnRhaW5lck5vZGVzIGFuZCB0aGlzLm5vZGVzQnlEZXB0aC5cbiAgICB0aGlzLm5vZGVzQnlEZXB0aCA9IG5vZGVzQnlEZXB0aDtcblxuICAgIC8vIEVuc3VyZSBuYW1lIHVuaWNpdHksIHdoaWNoIHdpbGwgYmUgY3J1Y2lhbCBmb3Igc2VyaWFsaXphdGlvblxuICAgIC8vIChzaW5jZSBzZXJpYWxpemVkIG5vZGVzIHJlZmVyIHRvIGxheWVycyBieSB0aGVpciBuYW1lKS5cbiAgICBjb25zdCBhbGxOYW1lcyA9IHRoaXMubGF5ZXJzLm1hcCh4ID0+IHgubmFtZSk7XG4gICAgZm9yIChjb25zdCBuYW1lIG9mIGFsbE5hbWVzKSB7XG4gICAgICBjb25zdCBudW1PY2N1cnJlbmNlcyA9IGFsbE5hbWVzLmZpbHRlcih4ID0+IHggPT09IG5hbWUpLmxlbmd0aDtcbiAgICAgIGlmIChudW1PY2N1cnJlbmNlcyAhPT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgICAgYFRoZSBuYW1lIFwiJHtuYW1lfVwiIGlzIHVzZWQgJHtudW1PY2N1cnJlbmNlc30gdGltZXMgYCArXG4gICAgICAgICAgICAnaW4gdGhlIG1vZGVsLiBBbGwgbGF5ZXIgbmFtZXMgc2hvdWxkIGJlIHVuaXF1ZS4gTGF5ZXIgbmFtZXM6ICcgK1xuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoYWxsTmFtZXMpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMYXllciBwYXJhbWV0ZXJzLlxuICAgIC8vIFRoZSBuZXcgY29udGFpbmVyIHN0YXJ0cyB3aXRoIGEgc2luZ2xlIGluYm91bmQgbm9kZVxuICAgIC8vIGZvciBpdHMgaW5wdXRzLCBhbmQgbm8gb3V0Ym91bmQgbm9kZXMuXG4gICAgLy8gV2lsbCBiZSBhcHBlbmRlZCB0byBieSBmdXR1cmUgY2FsbHMgdG8gYXBwbHkoKS5cbiAgICB0aGlzLm91dGJvdW5kTm9kZXMgPSBbXTtcbiAgICAvLyBXaWxsIGJlIGFwcGVuZGVkIHRvIGJlbG93LCBhbmQgYnkgZnV0dXJlIGNhbGxzIHRvIGFwcGx5KCkuXG4gICAgdGhpcy5pbmJvdW5kTm9kZXMgPSBbXTtcblxuICAgIC8vIENyZWF0ZSB0aGUgbm9kZSBsaW5raW5nIGludGVybmFsIGlucHV0cyB0byBpbnRlcm5hbCBvdXRwdXRzLlxuICAgIC8vIChUaGlzIGNhbGwgaGFzIHNpZGUgZWZmZWN0cy4pXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgbmV3IE5vZGUoe1xuICAgICAgb3V0Ym91bmRMYXllcjogdGhpcyxcbiAgICAgIGluYm91bmRMYXllcnM6IFtdLFxuICAgICAgbm9kZUluZGljZXM6IFtdLFxuICAgICAgdGVuc29ySW5kaWNlczogW10sXG4gICAgICBpbnB1dFRlbnNvcnM6IHRoaXMuaW5wdXRzLFxuICAgICAgb3V0cHV0VGVuc29yczogdGhpcy5vdXRwdXRzLFxuICAgICAgaW5wdXRNYXNrczogdGhpcy5pbnB1dHMubWFwKHggPT4gbnVsbCksXG4gICAgICBvdXRwdXRNYXNrczogdGhpcy5vdXRwdXRzLm1hcCh4ID0+IG51bGwpLFxuICAgICAgaW5wdXRTaGFwZXM6IHRoaXMuaW5wdXRzLm1hcCh4ID0+IHguc2hhcGUpLFxuICAgICAgb3V0cHV0U2hhcGVzOiB0aGlzLm91dHB1dHMubWFwKHggPT4geC5zaGFwZSlcbiAgICB9KTtcbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgICB0aGlzLl9yZWZDb3VudCA9IDE7ICAvLyBUaGUgcmVmIGNvdW50IG9mIGEgY29udGFpbmVyIGFsd2F5cyBzdGFydCBhdCAxLlxuICB9XG5cbiAgcHJvdGVjdGVkIGFzc2VydE5vdERpc3Bvc2VkKCkge1xuICAgIGlmICh0aGlzLl9yZWZDb3VudCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb250YWluZXIgJyR7dGhpcy5uYW1lfScgaXMgYWxyZWFkeSBkaXNwb3NlZC5gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQXR0ZW1wdCB0byBkaXNwb3NlIGEgTGF5ZXJzTW9kZWwncyB3ZWlnaHRzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBkZWNyZWFzZSB0aGUgcmVmZXJlbmNlIGNvdW50IG9mIHRoZSBMYXllcnNNb2RlbCBvYmplY3QgYnkgMS5cbiAgICpcbiAgICogQSBMYXllcnNNb2RlbCBpcyByZWZlcmVuY2UtY291bnRlZC4gSXRzIHJlZmVyZW5jZSBjb3VudCBpcyBpbmNyZW1lbnRlZCBieSAxXG4gICAqIHdoZW4gaXQgaXMgZmlyc3QgY29uc3RydWN0ZWQgYW5kIHdoZW4gaXQgaXMgdXNlZCBhcyBhIExheWVyIG9mIGFub3RoZXJcbiAgICogTGF5ZXJzTW9kZWwuXG4gICAqXG4gICAqIElmIHRoZSByZWZlcmVuY2UgY291bnQgb2YgYSBMYXllcnNNb2RlbCBiZWNvbWVzIDAsIHRoZSBgZGlzcG9zZWAgbWV0aG9kIG9mXG4gICAqIGFsbCBpdHMgY29uc3RpdHVlbnQgYExheWVyYHMgd2lsbCBiZSBjYWxsZWQuXG4gICAqXG4gICAqIE5vdGU6IElmIHRoZSByZWZlcmVuY2UgY291bnQgaXMgZ3JlYXRlciB0aGFuIDAgYWZ0ZXIgdGhlIGRlY3JlbWVudCwgdGhlXG4gICAqIGBkaXNwb3NlYCBtZXRob2Qgb2YgaXRzIGNvbnN0aXR1ZW50IGBMYXllcmBzIHdpbGwgKm5vdCogYmUgY2FsbGVkLlxuICAgKlxuICAgKiBBZnRlciBhIExheWVyc01vZGVsIGlzIGRpc3Bvc2VkLCBpdCBjYW5ub3QgYmUgdXNlZCBpbiBjYWxscyBzdWNoIGFzXG4gICAqICdwcmVkaWN0YCwgYGV2YWx1YXRlYCBvciBgZml0YCBhbnltb3JlLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIERpc3Bvc2VSZXN1bHQgT2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBmaWVsZHM6XG4gICAqICAgLSByZWZDb3VudEFmdGVyRGlzcG9zZTogVGhlIHJlZmVyZW5jZSBjb3VudCBvZiB0aGUgTGF5ZXJzTW9kZWwgYWZ0ZXIgdGhpc1xuICAgKiAgICAgYGRpc3Bvc2UoKWAgY2FsbC5cbiAgICogICAtIG51bURpc3Bvc2VkVmFyaWFibGVzOiBOdW1iZXIgb2YgYHRmLlZhcmlhYmxlYHMgKGkuZS4sIHdlaWdodHMpIGRpc3Bvc2VkXG4gICAqICAgICBkdXJpbmcgdGhpcyBgZGlzcG9zZSgpYCBjYWxsLlxuICAgKiBAdGhyb3dzIHtFcnJvcn0gSWYgdGhlIGxheWVyIGlzIG5vdCBidWlsdCB5ZXQsIG9yIGlmIHRoZSBMYXllcnNNb2RlbCBoYXNcbiAgICogICBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuXG4gICAqL1xuICBkaXNwb3NlKCk6IERpc3Bvc2VSZXN1bHQge1xuICAgIHRoaXMuYXNzZXJ0Tm90RGlzcG9zZWQoKTtcbiAgICBjb25zdCByZXN1bHQ6XG4gICAgICAgIERpc3Bvc2VSZXN1bHQgPSB7cmVmQ291bnRBZnRlckRpc3Bvc2U6IG51bGwsIG51bURpc3Bvc2VkVmFyaWFibGVzOiAwfTtcbiAgICBpZiAoLS10aGlzLl9yZWZDb3VudCA9PT0gMCkge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgICByZXN1bHQubnVtRGlzcG9zZWRWYXJpYWJsZXMgKz0gbGF5ZXIuZGlzcG9zZSgpLm51bURpc3Bvc2VkVmFyaWFibGVzO1xuICAgICAgfVxuXG4gICAgICAvLyBDYWxsIGRpc3Bvc2Ugb24gZWFjaCBpbnRlcm5hbGx5IGNyZWF0ZWQgY29udGFpbmVyIGxheWVyIGFnYWluIHRvIGVuc3VyZVxuICAgICAgLy8gdGhlaXIgcmVmQ291bnRzIGhpdCB6ZXJvIGFuZCB0aGVpciB0ZW5zb3JzIGFyZSBzdWJzZXF1ZW50bHkgZGVsZXRlZC5cbiAgICAgIGZvciAoY29uc3QgY29udGFpbmVyIG9mIHRoaXMuaW50ZXJuYWxDb250YWluZXJSZWZzKSB7XG4gICAgICAgIHJlc3VsdC5udW1EaXNwb3NlZFZhcmlhYmxlcyArPSBjb250YWluZXIuZGlzcG9zZSgpLm51bURpc3Bvc2VkVmFyaWFibGVzO1xuICAgICAgfVxuICAgIH1cbiAgICByZXN1bHQucmVmQ291bnRBZnRlckRpc3Bvc2UgPSB0aGlzLl9yZWZDb3VudDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZSgpIHtcbiAgICByZXR1cm4gdGhpcy50cmFpbmFibGVfO1xuICB9XG5cbiAgc2V0IHRyYWluYWJsZSh0cmFpbmFibGU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmxheWVycy5mb3JFYWNoKGxheWVyID0+IHtcbiAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICgobGF5ZXIgYXMgYW55KS5fdHJhaW5hYmxlV2VpZ2h0cyBhcyBMYXllclZhcmlhYmxlW10pXG4gICAgICAgICAgLmZvckVhY2godyA9PiB3LnRyYWluYWJsZSA9IHRyYWluYWJsZSk7XG4gICAgfSk7XG4gICAgdGhpcy50cmFpbmFibGVfID0gdHJhaW5hYmxlO1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZVdlaWdodHMoKTogTGF5ZXJWYXJpYWJsZVtdIHtcbiAgICAvLyBQb3J0aW5nIE5vdGU6IFRoaXMgY2hlY2sgYmVsb3cgaXMgdG8gcHJldmVudCBlcnJvcnMgd2hlcmUgdGhlXG4gICAgLy8gICBfdHJhaW5hYmxlV2VpZ2h0cyBpbmhlcml0ZWQgZnJvbSB0aGUgcGFyZW50IGNsYXNzIChMYXllcikgZ2V0c1xuICAgIC8vICAgaW5hZHZlcnRlbnRseSB1c2VkLlxuICAgIGlmICh0aGlzLl90cmFpbmFibGVXZWlnaHRzLmxlbmd0aCA+IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdDb250YWluZXIgaW5zdGFuY2UgdW5leHBlY3RlZGx5IGNvbnRhaW5zIF90cmFpbmFibGVXZWlnaHRzLicgK1xuICAgICAgICAgICdUaGUgdHJhaW5hYmxlIHdlaWdodHMgb2YgYSBDb250YWluZXIgYXJlIGEgdW5pb24gb2YgdGhlICcgK1xuICAgICAgICAgICd0cmFpbmFibGUgd2VpZ2h0cyBvZiBpdHMgY29uc2l0dWVudCBMYXllcnMuIEl0cyBvd24gJyArXG4gICAgICAgICAgJ190cmFpbmFibGVXZWlnaHRzIG11c3QgcmVtYWluIGFuIGVtcHR5IEFycmF5LicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy50cmFpbmFibGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgbGV0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIHdlaWdodHMgPSB3ZWlnaHRzLmNvbmNhdChsYXllci50cmFpbmFibGVXZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodHM7XG4gIH1cblxuICBnZXQgbm9uVHJhaW5hYmxlV2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIHdlaWdodHMucHVzaCguLi5sYXllci5ub25UcmFpbmFibGVXZWlnaHRzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYWluYWJsZSkge1xuICAgICAgY29uc3QgdHJhaW5hYmxlV2VpZ2h0czogTGF5ZXJWYXJpYWJsZVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICAgIHRyYWluYWJsZVdlaWdodHMucHVzaCguLi5sYXllci50cmFpbmFibGVXZWlnaHRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmFpbmFibGVXZWlnaHRzLmNvbmNhdCh3ZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodHM7XG4gIH1cblxuICBnZXQgd2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIHJldHVybiB0aGlzLnRyYWluYWJsZVdlaWdodHMuY29uY2F0KHRoaXMubm9uVHJhaW5hYmxlV2VpZ2h0cyk7XG4gIH1cblxuICAvKipcbiAgICogTG9hZHMgYWxsIGxheWVyIHdlaWdodHMgZnJvbSBhIEpTT04gb2JqZWN0LlxuICAgKlxuICAgKiBQb3J0aW5nIE5vdGU6IEhERjUgd2VpZ2h0IGZpbGVzIGNhbm5vdCBiZSBkaXJlY3RseSBsb2FkZWQgaW4gSmF2YVNjcmlwdCAvXG4gICAqICAgVHlwZVNjcmlwdC4gVGhlIHV0aWxpdHkgc2NyaXB0IGF0IGBzY3JpcHRzL3B5a2VyYXMucHlgIG9mZmVycyBtZWFuc1xuICAgKiAgIHRvIGNvbnZlcnQgdGhlbSBpbnRvIEpTT04gc3RyaW5ncyBjb21wYXRpYmxlIHdpdGggdGhpcyBtZXRob2QuXG4gICAqIFBvcnRpbmcgTm90ZTogVGVuc29yRmxvdy5qcyBMYXllcnMgc3VwcG9ydHMgb25seSBsb2FkaW5nIGJ5IG5hbWUgY3VycmVudGx5LlxuICAgKlxuICAgKiBAcGFyYW0gd2VpZ2h0cyBBIEpTT04gbWFwcGluZyB3ZWlnaHQgbmFtZXMgdG8gd2VpZ2h0IHZhbHVlcyBhcyBuZXN0ZWRcbiAgICogICBhcnJheXMgb2YgbnVtYmVycywgb3IgYSBgTmFtZWRUZW5zb3JNYXBgLCBpLmUuLCBhIEpTT04gbWFwcGluZyB3ZWlnaHRcbiAgICogICBuYW1lcyB0byBgdGYuVGVuc29yYCBvYmplY3RzLlxuICAgKiBAcGFyYW0gc3RyaWN0IFJlcXVpcmUgdGhhdCB0aGUgcHJvdmlkZWQgd2VpZ2h0cyBleGFjdGx5IG1hdGNoIHRob3NlXG4gICAqICAgcmVxdWlyZWQgYnkgdGhlIGNvbnRhaW5lci4gIERlZmF1bHQ6IGB0cnVlYC4gIFBhc3NpbmcgYGZhbHNlYCBtZWFucyB0aGF0XG4gICAqICAgZXh0cmEgd2VpZ2h0cyBhbmQgbWlzc2luZyB3ZWlnaHRzIHdpbGwgYmUgc2lsZW50bHkgaWdub3JlZC5cbiAgICovXG4gIGxvYWRXZWlnaHRzKHdlaWdodHM6IE5hbWVkVGVuc29yTWFwLCBzdHJpY3QgPSB0cnVlKSB7XG4gICAgY29uc3QgbmFtZVRvV2VpZ2h0OiB7W25hbWU6IHN0cmluZ106IExheWVyVmFyaWFibGV9ID0ge307XG4gICAgbGV0IHRvdGFsV2VpZ2h0c0NvdW50ID0gMDtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICBmb3IgKGNvbnN0IHdlaWdodCBvZiBsYXllci53ZWlnaHRzKSB7XG4gICAgICAgIGlmIChuYW1lVG9XZWlnaHRbd2VpZ2h0Lm9yaWdpbmFsTmFtZV0gIT0gbnVsbCkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBEdXBsaWNhdGUgd2VpZ2h0IG5hbWU6ICR7d2VpZ2h0Lm9yaWdpbmFsTmFtZX1gKTtcbiAgICAgICAgfVxuICAgICAgICBuYW1lVG9XZWlnaHRbd2VpZ2h0Lm9yaWdpbmFsTmFtZV0gPSB3ZWlnaHQ7XG4gICAgICAgIHRvdGFsV2VpZ2h0c0NvdW50Kys7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3Qgd2VpZ2h0VmFsdWVUdXBsZXM6IEFycmF5PFtMYXllclZhcmlhYmxlLCBUZW5zb3JdPiA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBpbiB3ZWlnaHRzKSB7XG4gICAgICAvLyBURiAyLjIuMCBhZGRlZCBjZWxsIG5hbWUgdG8gdGhlIHdlaWdodCBuYW1lIGluIHRoZSBmb3JtYXQgb2ZcbiAgICAgIC8vIGxheWVyX25hbWUvY2VsbF9uYW1lL3dlaWdodF9uYW1lLCB3ZSBuZWVkIHRvIHJlbW92ZVxuICAgICAgLy8gdGhlIGlubmVyIGNlbGwgbmFtZS5cbiAgICAgIGxldCB2YWxpZGF0ZWROYW1lID0gbmFtZTtcbiAgICAgIGlmIChuYW1lVG9XZWlnaHRbbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0b2tlbnMgPSBuYW1lLnNwbGl0KCcvJyk7XG4gICAgICAgIGNvbnN0IHNob3J0ZW5OYW1lQXJyYXkgPVxuICAgICAgICAgICAgdG9rZW5zLnNsaWNlKDAsIC0yKS5jb25jYXQoW3Rva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV1dKTtcbiAgICAgICAgdmFsaWRhdGVkTmFtZSA9IHNob3J0ZW5OYW1lQXJyYXkuam9pbignLycpO1xuICAgICAgfVxuICAgICAgaWYgKG5hbWVUb1dlaWdodFt2YWxpZGF0ZWROYW1lXSAhPSBudWxsKSB7XG4gICAgICAgIHdlaWdodFZhbHVlVHVwbGVzLnB1c2goW25hbWVUb1dlaWdodFt2YWxpZGF0ZWROYW1lXSwgd2VpZ2h0c1tuYW1lXV0pO1xuICAgICAgfSBlbHNlIGlmIChzdHJpY3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgUHJvdmlkZWQgd2VpZ2h0IGRhdGEgaGFzIG5vIHRhcmdldCB2YXJpYWJsZTogJHtuYW1lfWApO1xuICAgICAgfVxuICAgICAgZGVsZXRlIG5hbWVUb1dlaWdodFt2YWxpZGF0ZWROYW1lXTtcbiAgICB9XG5cbiAgICBpZiAoc3RyaWN0KSB7XG4gICAgICAvLyBDaGVjayB0aGF0IGFsbCB3ZWlnaHRzIGFyZSBzZXQuXG4gICAgICBjb25zdCB1bnNldE5hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBuYW1lIGluIG5hbWVUb1dlaWdodCkge1xuICAgICAgICB1bnNldE5hbWVzLnB1c2gobmFtZSk7XG4gICAgICB9XG4gICAgICBpZiAodW5zZXROYW1lcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYCR7dW5zZXROYW1lcy5sZW5ndGh9IG9mICR7XG4gICAgICAgICAgICAgICAgdG90YWxXZWlnaHRzQ291bnR9IHdlaWdodHMgYXJlIG5vdCBzZXQ6IGAgK1xuICAgICAgICAgICAgYCR7dW5zZXROYW1lc31gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBiYXRjaFNldFZhbHVlKHdlaWdodFZhbHVlVHVwbGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVdGlsIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBzZXJpYWxpemF0aW9uIG1ldGhvZHMuXG4gICAqIEByZXR1cm5zIExheWVyc01vZGVsIGNvbmZpZyB3aXRoIEtlcmFzIHZlcnNpb24gaW5mb3JtYXRpb24gYWRkZWQuXG4gICAqL1xuICBwcm90ZWN0ZWQgdXBkYXRlZENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IHRoZUNvbmZpZyA9IHRoaXMuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgbW9kZWxDb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9O1xuICAgIG1vZGVsQ29uZmlnWydjbGFzc05hbWUnXSA9IHRoaXMuZ2V0Q2xhc3NOYW1lKCk7XG4gICAgbW9kZWxDb25maWdbJ2NvbmZpZyddID0gdGhlQ29uZmlnO1xuICAgIG1vZGVsQ29uZmlnWydrZXJhc1ZlcnNpb24nXSA9IGB0ZmpzLWxheWVycyAke2xheWVyc1ZlcnNpb259YDtcbiAgICAvLyBUT0RPKG5pZWxzZW5lKTogUmVwbGFjZSBzb21ldGhpbmcgbGlrZSBLLmJhY2tlbmQoKSBvbmNlXG4gICAgLy8gcG9zc2libGUuXG4gICAgbW9kZWxDb25maWdbJ2JhY2tlbmQnXSA9ICdUZW5zb3JGbG93LmpzJztcbiAgICByZXR1cm4gbW9kZWxDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBhIEpTT04gc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5ldHdvcmsgY29uZmlndXJhdGlvbi5cbiAgICpcbiAgICogVG8gbG9hZCBhIG5ldHdvcmsgZnJvbSBhIEpTT04gc2F2ZSBmaWxlLCB1c2VcbiAgICogbW9kZWxzLm1vZGVsRnJvbUpTT04oanNvblN0cmluZyk7XG4gICAqIEBwYXJhbSBleHRyYUpzb25BcmdzIFVudXNlZCBpbiB0ZmpzLWxheWVycywgbWFpbnRhaW5lZCBmb3IgUHlLZXJhc1xuICAgKiBAcGFyYW0gcmV0dXJuU3RyaW5nIFdoZXRoZXIgdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgc3RyaW5naWZpZWRcbiAgICogICAgKGRlZmF1bHQ6IGB0cnVlYCkuXG4gICAqIEByZXR1cm5zIGEgSlNPTiBzdHJpbmcgaWYgYHJldHVyblN0cmluZ2AgKGRlZmF1bHQpLCBvciBhIEpTT04gb2JqZWN0IGlmXG4gICAqICAgYCFyZXR1cm5TdHJpbmdgLlxuICAgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICB0b0pTT04odW51c2VkPzogYW55LCByZXR1cm5TdHJpbmcgPSB0cnVlKTogc3RyaW5nfFB5SnNvbkRpY3Qge1xuICAgIGNvbnN0IG1vZGVsQ29uZmlnID0gY29udmVydFRzVG9QeXRob25pYyh0aGlzLnVwZGF0ZWRDb25maWcoKSkgYXMgUHlKc29uRGljdDtcbiAgICByZXR1cm4gcmV0dXJuU3RyaW5nID8gSlNPTi5zdHJpbmdpZnkobW9kZWxDb25maWcpIDogbW9kZWxDb25maWc7XG4gIH1cblxuICAvKipcbiAgICogQ2FsbCB0aGUgbW9kZWwgb24gbmV3IGlucHV0cy5cbiAgICpcbiAgICogSW4gdGhpcyBjYXNlIGBjYWxsYCBqdXN0IHJlYXBwbGllcyBhbGwgb3BzIGluIHRoZSBncmFwaCB0byB0aGUgbmV3IGlucHV0c1xuICAgKiAoZS5nLiBidWlsZCBhIG5ldyBjb21wdXRhdGlvbmFsIGdyYXBoIGZyb20gdGhlIHByb3ZpZGVkIGlucHV0cykuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgQSB0ZW5zb3Igb3IgbGlzdCBvZiB0ZW5zb3JzLlxuICAgKiBAcGFyYW0gbWFzayBBIG1hc2sgb3IgbGlzdCBvZiBtYXNrcy4gQSBtYXNrIGNhbiBiZSBlaXRoZXIgYSB0ZW5zb3Igb3IgbnVsbFxuICAgKiAgIChubyBtYXNrKS5cbiAgICpcbiAgICogQHJldHVybiBBIHRlbnNvciBpZiB0aGVyZSBpcyBhIHNpbmdsZSBvdXRwdXQsIG9yIGEgbGlzdCBvZiB0ZW5zb3JzIGlmIHRoZXJlXG4gICAqICAgYXJlIG1vcmUgdGhhbiBvbmUgb3V0cHV0cy5cbiAgICovXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpbnB1dHMgPSBnZW5lcmljX3V0aWxzLnRvTGlzdChpbnB1dHMpO1xuICAgICAgY29uc3QgZmVlZERpY3QgPSBuZXcgRmVlZERpY3QoKTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnB1dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgZmVlZERpY3QuYWRkKHRoaXMuaW5wdXRzW2ldLCBpbnB1dHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV4ZWN1dGUodGhpcy5vdXRwdXRzLCBmZWVkRGljdCwga3dhcmdzKSBhcyBUZW5zb3IgfCBUZW5zb3JbXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBhbiBvdXRwdXQgbWFzayB0ZW5zb3IuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIG9yIGxpc3Qgb2YgdGVuc29ycy5cbiAgICogQHBhcmFtIG1hc2sgVGVuc29yIG9yIGxpc3Qgb2YgdGVuc29ycy5cbiAgICpcbiAgICogQHJldHVybiBudWxsIG9yIGEgdGVuc29yIChvciBsaXN0IG9mIHRlbnNvcnMsIG9uZSBwZXIgb3V0cHV0IHRlbnNvciBvZiB0aGVcbiAgICogbGF5ZXIpLlxuICAgKi9cbiAgY29tcHV0ZU1hc2soaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIG1hc2s/OiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3JcbiAgICAgIHxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaW5wdXRzID0gZ2VuZXJpY191dGlscy50b0xpc3QoaW5wdXRzKTtcbiAgICAgIGxldCBtYXNrczogVGVuc29yW107XG4gICAgICBpZiAobWFzayA9PSBudWxsKSB7XG4gICAgICAgIG1hc2tzID0gZ2VuZXJpY191dGlscy5weUxpc3RSZXBlYXQobnVsbCwgaW5wdXRzLmxlbmd0aCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtYXNrcyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KG1hc2spO1xuICAgICAgfVxuICAgICAgLy8gVE9ETyhtaWNoYWVsdGVycnkpOiBBZGQgc3VwcG9ydCBmb3IgbWFzayBjYWNoaW5nLlxuICAgICAgcmV0dXJuIHRoaXMucnVuSW50ZXJuYWxHcmFwaChpbnB1dHMsIG1hc2tzKVsxXTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyB0aGUgb3V0cHV0IHNoYXBlIG9mIHRoZSBsYXllci5cbiAgICpcbiAgICogQXNzdW1lcyB0aGF0IHRoZSBsYXllciB3aWxsIGJlIGJ1aWx0IHRvIG1hdGNoIHRoYXQgaW5wdXQgc2hhcGUgcHJvdmlkZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dFNoYXBlIEEgc2hhcGUgKHR1cGxlIG9mIGludGVnZXJzKSBvciBhIGxpc3Qgb2Ygc2hhcGUgdHVwbGVzXG4gICAqICAgKG9uZSBwZXIgb3V0cHV0IHRlbnNvciBvZiB0aGUgbGF5ZXIpLiBTaGFwZSB0dXBsZXMgY2FuIGluY2x1ZGUgbnVsbCBmb3JcbiAgICogICBmcmVlIGRpbWVuc2lvbnMsIGluc3RlYWQgb2YgYW4gaW50ZWdlci5cbiAgICovXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgY29uc3QgaW5wdXRTaGFwZXMgPSB0eXBlc191dGlscy5ub3JtYWxpemVTaGFwZUxpc3QoaW5wdXRTaGFwZSk7XG4gICAgaWYgKGlucHV0U2hhcGVzLmxlbmd0aCAhPT0gdGhpcy5pbnB1dExheWVycy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBJbnZhbGlkIGlucHV0U2hhcGUgYXJndW1lbnQgJHtpbnB1dFNoYXBlfTogYCArXG4gICAgICAgICAgYG1vZGVsIGhhcyAke3RoaXMuaW5wdXRMYXllcnMubGVuZ3RofSB0ZW5zb3IgaW5wdXRzLmApO1xuICAgIH1cblxuICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIGNhY2hpbmdcbiAgICBjb25zdCBsYXllcnNUb091dHB1dFNoYXBlczoge1tzaGFwZUtleTogc3RyaW5nXTogU2hhcGV9ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNoYXBlcy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmlucHV0TGF5ZXJzW2ldO1xuICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0U2hhcGVzW2ldO1xuICAgICAgLy8gSXQncyBhbiBpbnB1dCBsYXllcjogY29tcHV0ZU91dHB1dFNoYXBlIGlzIGlkZW50aXR5LFxuICAgICAgLy8gYW5kIHRoZXJlIGlzIG9ubHkgb25lIG5vZGUgYW5kIG9uZSB0ZW5zb3Igb3V0cHV0LlxuICAgICAgY29uc3Qgc2hhcGVLZXkgPSBsYXllci5uYW1lICsgJ18wXzAnO1xuICAgICAgbGF5ZXJzVG9PdXRwdXRTaGFwZXNbc2hhcGVLZXldID0gaW5wdXRTaGFwZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXB0aEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzQnlEZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh4ID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoZ2VuZXJpY191dGlscy5yZXZlcnNlTnVtYmVyQ29tcGFyZSk7XG4gICAgLy8gSXRlcmF0ZSBvdmVyIG5vZGVzLCBieSBkZXB0aCBsZXZlbC5cbiAgICBpZiAoZGVwdGhLZXlzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGZvciAoY29uc3QgZGVwdGggb2YgZGVwdGhLZXlzKSB7XG4gICAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5ub2Rlc0J5RGVwdGhbZGVwdGhdO1xuICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2Ygbm9kZXMpIHtcbiAgICAgICAgICAvLyBUaGlzIGlzIGFsd2F5cyBhIHNpbmdsZSBsYXllciwgbmV2ZXIgYSBsaXN0LlxuICAgICAgICAgIGNvbnN0IGxheWVyID0gbm9kZS5vdXRib3VuZExheWVyO1xuICAgICAgICAgIGlmICh0aGlzLmlucHV0TGF5ZXJzLm1hcCh4ID0+IHguaWQpLmluZGV4T2YobGF5ZXIuaWQpICE9PSAtMSkge1xuICAgICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBjb3ZlcmVkIHRoZSBpbnB1dCBsYXllcnMgYSBmZXcgbGluZXMgYWJvdmUuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gUG90ZW50aWFsbHkgcmVkdW5kYW50IGxpc3QsIHNhbWUgc2l6ZSBvZiBub2RlLmlucHV0VGVuc29ycy5cbiAgICAgICAgICBjb25zdCBpbnB1dFNoYXBlczogU2hhcGVbXSA9IFtdO1xuICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbm9kZS5pbmJvdW5kTGF5ZXJzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBpbmJvdW5kTGF5ZXIgPSBub2RlLmluYm91bmRMYXllcnNbal07XG4gICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2RlLm5vZGVJbmRpY2VzW2pdO1xuICAgICAgICAgICAgY29uc3QgdGVuc29ySW5kZXggPSBub2RlLnRlbnNvckluZGljZXNbal07XG4gICAgICAgICAgICBjb25zdCBzaGFwZUtleSA9IGAke2luYm91bmRMYXllci5uYW1lfV8ke25vZGVJbmRleH1fJHt0ZW5zb3JJbmRleH1gO1xuICAgICAgICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGxheWVyc1RvT3V0cHV0U2hhcGVzW3NoYXBlS2V5XTtcbiAgICAgICAgICAgIGlucHV0U2hhcGVzLnB1c2goaW5wdXRTaGFwZSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBsYXllci5jb21wdXRlT3V0cHV0U2hhcGUoXG4gICAgICAgICAgICAgIGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShpbnB1dFNoYXBlcykpO1xuXG4gICAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGVzID0gdHlwZXNfdXRpbHMubm9ybWFsaXplU2hhcGVMaXN0KG91dHB1dFNoYXBlKTtcbiAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBsYXllci5pbmJvdW5kTm9kZXMuaW5kZXhPZihub2RlKTtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dHB1dFNoYXBlcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgY29uc3Qgc2hhcGVLZXkgPSBgJHtsYXllci5uYW1lfV8ke25vZGVJbmRleH1fJHtqfWA7XG4gICAgICAgICAgICBsYXllcnNUb091dHB1dFNoYXBlc1tzaGFwZUtleV0gPSBvdXRwdXRTaGFwZXNbal07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVhZCBmaW5hbCBvdXRwdXQgc2hhcGVzIGZyb20gbGF5ZXJzVG9PdXRwdXRTaGFwZXMuXG4gICAgY29uc3Qgb3V0cHV0U2hhcGVzOiBTaGFwZVtdID0gW107XG4gICAgY29uc3Qgb3V0cHV0U2hhcGVLZXlzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXRMYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGxheWVyID0gdGhpcy5vdXRwdXRMYXllcnNbaV07XG4gICAgICBjb25zdCBub2RlSW5kZXggPSB0aGlzLm91dHB1dExheWVyc05vZGVJbmRpY2VzW2ldO1xuICAgICAgY29uc3QgdGVuc29ySW5kZXggPSB0aGlzLm91dHB1dExheWVyc1RlbnNvckluZGljZXNbaV07XG4gICAgICBjb25zdCBzaGFwZUtleSA9IGAke2xheWVyLm5hbWV9XyR7bm9kZUluZGV4fV8ke3RlbnNvckluZGV4fWA7XG4gICAgICBvdXRwdXRTaGFwZUtleXMucHVzaChzaGFwZUtleSk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRTaGFwZUtleXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGtleSA9IG91dHB1dFNoYXBlS2V5c1tpXTtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KGtleSBpbiBsYXllcnNUb091dHB1dFNoYXBlcyk7XG4gICAgICBvdXRwdXRTaGFwZXMucHVzaChsYXllcnNUb091dHB1dFNoYXBlc1trZXldKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IFVwZGF0ZSBjYWNoZVxuICAgIHJldHVybiBnZW5lcmljX3V0aWxzLnNpbmdsZXRvbk9yQXJyYXkob3V0cHV0U2hhcGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21wdXRlcyBvdXRwdXQgdGVuc29ycyBmb3IgbmV3IGlucHV0cy5cbiAgICpcbiAgICogTm90ZTpcbiAgICogICAtIEV4cGVjdHMgYGlucHV0c2AgdG8gYmUgYSBsaXN0IChwb3RlbnRpYWxseSB3aXRoIDEgZWxlbWVudCkuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dHMgTGlzdCBvZiB0ZW5zb3JzXG4gICAqIEBwYXJhbSBtYXNrcyBMaXN0IG9mIG1hc2tzICh0ZW5zb3JzIG9yIG51bGwpLlxuICAgKiBAcmV0dXJuIFRocmVlIGxpc3RzOiBvdXRwdXRUZW5zb3JzLCBvdXRwdXRNYXNrcywgb3V0cHV0U2hhcGVzXG4gICAqL1xuICBwcm90ZWN0ZWQgcnVuSW50ZXJuYWxHcmFwaChpbnB1dHM6IFRlbnNvcltdLCBtYXNrcz86IFRlbnNvcltdKTpcbiAgICAgIFtUZW5zb3JbXSwgVGVuc29yW10sIFNoYXBlW11dIHtcbiAgICBpZiAobWFza3MgPT0gbnVsbCkge1xuICAgICAgbWFza3MgPSBnZW5lcmljX3V0aWxzLnB5TGlzdFJlcGVhdChudWxsLCBpbnB1dHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBEaWN0aW9uYXJ5IG1hcHBpbmcgcmVmZXJlbmNlIHRlbnNvcnMgdG8gdHVwbGVzXG4gICAgLy8gKGNvbXB1dGVkIHRlbnNvciwgY29tcHV0ZSBtYXNrKVxuICAgIC8vIHdlIGFzc3VtZSBhIDE6MSBtYXBwaW5nIGZyb20gdGVuc29yIHRvIG1hc2tcbiAgICAvLyBUT0RPOiByYWlzZSBleGNlcHRpb24gd2hlbiBhIGAuY29tcHV0ZU1hc2soKWAgY2FsbFxuICAgIC8vIGRvZXMgbm90IHJldHVybiBhIGxpc3QgdGhlIHNhbWUgc2l6ZSBhcyBgY2FsbGBcbiAgICBjb25zdCB0ZW5zb3JNYXA6IHtbdGVuc29ySUQ6IHN0cmluZ106IFtUZW5zb3IsIFRlbnNvcl19ID0ge307XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgeCA9IHRoaXMuaW5wdXRzW2ldO1xuICAgICAgY29uc3QgeSA9IGlucHV0c1tpXTtcbiAgICAgIGNvbnN0IG1hc2sgPSBtYXNrc1tpXTtcbiAgICAgIHRlbnNvck1hcFt4LmlkXSA9IFt5LCBtYXNrXTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXB0aEtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm5vZGVzQnlEZXB0aClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh4ID0+IHBhcnNlSW50KHgsIDEwKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoZ2VuZXJpY191dGlscy5yZXZlcnNlTnVtYmVyQ29tcGFyZSk7XG4gICAgZm9yIChjb25zdCBkZXB0aCBvZiBkZXB0aEtleXMpIHtcbiAgICAgIGNvbnN0IG5vZGVzID0gdGhpcy5ub2Rlc0J5RGVwdGhbZGVwdGhdO1xuICAgICAgZm9yIChjb25zdCBub2RlIG9mIG5vZGVzKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgYWx3YXlzIGEgc2luZ2xlIGxheWVyLCBuZXZlciBhIGxpc3QuXG4gICAgICAgIGNvbnN0IGxheWVyID0gbm9kZS5vdXRib3VuZExheWVyO1xuICAgICAgICBjb25zdCByZWZlcmVuY2VJbnB1dFRlbnNvcnMgPSBub2RlLmlucHV0VGVuc29ycztcbiAgICAgICAgY29uc3QgcmVmZXJlbmNlT3V0cHV0VGVuc29ycyA9IG5vZGUub3V0cHV0VGVuc29ycztcblxuICAgICAgICAvLyBJZiBhbGwgcHJldmlvdXMgaW5wdXQgdGVuc29ycyBhcmUgYXZhaWxhYmxlIGluIHRlbnNvck1hcCxcbiAgICAgICAgLy8gdGhlbiBjYWxsIG5vZGUuaW5ib3VuZExheWVyIG9uIHRoZW0uXG4gICAgICAgIC8vIExpc3Qgb2YgdHVwbGVzIFtpbnB1dCwgbWFza106XG4gICAgICAgIGNvbnN0IGNvbXB1dGVkRGF0YSA9IG5ldyBBcnJheTxbVGVuc29yLCBUZW5zb3JdPigpO1xuICAgICAgICBmb3IgKGNvbnN0IHggb2YgcmVmZXJlbmNlSW5wdXRUZW5zb3JzKSB7XG4gICAgICAgICAgaWYgKHguaWQgaW4gdGVuc29yTWFwKSB7XG4gICAgICAgICAgICBjb21wdXRlZERhdGEucHVzaCh0ZW5zb3JNYXBbeC5pZF0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoY29tcHV0ZWREYXRhLmxlbmd0aCA9PT0gcmVmZXJlbmNlSW5wdXRUZW5zb3JzLmxlbmd0aCkge1xuICAgICAgICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIEsubmFtZV9zY29wZSBoZXJlLCBpZiB3ZSBuZWVkIGl0LlxuICAgICAgICAgIGxldCBrd2FyZ3M6IEt3YXJncyA9IHt9O1xuICAgICAgICAgIGxldCBjb21wdXRlZFRlbnNvcnM6IFRlbnNvcltdO1xuICAgICAgICAgIGxldCBjb21wdXRlZE1hc2tzOiBUZW5zb3JbXTtcbiAgICAgICAgICBsZXQgb3V0cHV0VGVuc29yczogVGVuc29yW107XG4gICAgICAgICAgbGV0IG91dHB1dE1hc2tzOiBUZW5zb3JbXTtcbiAgICAgICAgICAvLyBjYWxsIGxheWVyXG4gICAgICAgICAgaWYgKG5vZGUuY2FsbEFyZ3MgIT0gbnVsbCkge1xuICAgICAgICAgICAga3dhcmdzID0gbm9kZS5jYWxsQXJncztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbXB1dGVkRGF0YS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGNvbnN0IFtjb21wdXRlZFRlbnNvciwgY29tcHV0ZWRNYXNrXSA9IGNvbXB1dGVkRGF0YVswXTtcbiAgICAgICAgICAgIGlmIChrd2FyZ3NbJ21hc2snXSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgIGt3YXJnc1snbWFzayddID0gY29tcHV0ZWRNYXNrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb3V0cHV0VGVuc29ycyA9XG4gICAgICAgICAgICAgICAgZ2VuZXJpY191dGlscy50b0xpc3QobGF5ZXIuY2FsbChjb21wdXRlZFRlbnNvciwga3dhcmdzKSk7XG4gICAgICAgICAgICBvdXRwdXRNYXNrcyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KFxuICAgICAgICAgICAgICAgIGxheWVyLmNvbXB1dGVNYXNrKGNvbXB1dGVkVGVuc29yLCBjb21wdXRlZE1hc2spKTtcbiAgICAgICAgICAgIGNvbXB1dGVkVGVuc29ycyA9IFtjb21wdXRlZFRlbnNvcl07XG4gICAgICAgICAgICBjb21wdXRlZE1hc2tzID0gW2NvbXB1dGVkTWFza107XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbXB1dGVkVGVuc29ycyA9IGNvbXB1dGVkRGF0YS5tYXAoeCA9PiB4WzBdKTtcbiAgICAgICAgICAgIGNvbXB1dGVkTWFza3MgPSBjb21wdXRlZERhdGEubWFwKHggPT4geFsxXSk7XG4gICAgICAgICAgICBpZiAoa3dhcmdzWydtYXNrJ10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBrd2FyZ3NbJ21hc2snXSA9IGNvbXB1dGVkTWFza3M7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBvdXRwdXRUZW5zb3JzID1cbiAgICAgICAgICAgICAgICBnZW5lcmljX3V0aWxzLnRvTGlzdChsYXllci5jYWxsKGNvbXB1dGVkVGVuc29ycywga3dhcmdzKSk7XG4gICAgICAgICAgICBvdXRwdXRNYXNrcyA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KFxuICAgICAgICAgICAgICAgIGxheWVyLmNvbXB1dGVNYXNrKGNvbXB1dGVkVGVuc29ycywgY29tcHV0ZWRNYXNrcykpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChsYXllci5hY3Rpdml0eVJlZ3VsYXJpemVyKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICAgICAnTGF5ZXJzTW9kZWwgaW52b2NhdGlvbiB3aXRoIGNvbmNyZXRlIFRlbnNvciB2YWx1ZShzKSBpbiB0aGUgJyArXG4gICAgICAgICAgICAgICAgJ3ByZXNlbmNlIG9mIGFjdGl2aXR5IHJlZ3VsYXJpemVyKHMpIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEFkZCBtb2RlbCB1cGRhdGVzIGFuZCBsb3NzZXNcblxuICAgICAgICAgIC8vIFVwZGF0ZSB0ZW5zb3IgbWFwLlxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVmZXJlbmNlT3V0cHV0VGVuc29ycy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgY29uc3QgeCA9IHJlZmVyZW5jZU91dHB1dFRlbnNvcnNbaV07XG4gICAgICAgICAgICBjb25zdCB5ID0gb3V0cHV0VGVuc29yc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IG1hc2sgPSBvdXRwdXRNYXNrc1tpXTtcbiAgICAgICAgICAgIHRlbnNvck1hcFt4LmlkXSA9IFt5LCBtYXNrXTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzOiBUZW5zb3JbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dE1hc2tzOiBUZW5zb3JbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlczogU2hhcGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgeCBvZiB0aGlzLm91dHB1dHMpIHtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KFxuICAgICAgICAgIHguaWQgaW4gdGVuc29yTWFwLCBgQ291bGQgbm90IGNvbXB1dGUgb3V0cHV0ICR7eC5uYW1lfSA6ICR7eC5pZH1gKTtcbiAgICAgIGNvbnN0IFt0ZW5zb3IsIG1hc2tdID0gdGVuc29yTWFwW3guaWRdO1xuICAgICAgb3V0cHV0U2hhcGVzLnB1c2godGVuc29yLnNoYXBlKTtcbiAgICAgIG91dHB1dFRlbnNvcnMucHVzaCh0ZW5zb3IpO1xuICAgICAgb3V0cHV0TWFza3MucHVzaChtYXNrKTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEFkZCBzdXBwb3J0IGZvciBjYWNoZXMuXG4gICAgcmV0dXJuIFtvdXRwdXRUZW5zb3JzLCBvdXRwdXRNYXNrcywgb3V0cHV0U2hhcGVzXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBCdWlsZHMgYSBtYXAgb2YgaW50ZXJuYWwgbm9kZSBrZXlzIHRvIG5vZGUgb3JkZXJpbmcuXG4gICAqIFVzZWQgaW4gc2VyaWFsaXphaW9uIGEgbm9kZSBvcmRlcmluZ3MgbWF5IGNoYW5nZSBhcyB1bnVzZWQgbm9kZXMgYXJlXG4gICAqIGRyb3BwZWQuIFBvcnRpbmcgTm90ZTogIFRoaXMgaGVscGVyIG1ldGhvZCB3YXMgcHVsbGVkIG91dCBvZiBnZXRDb25maWcgdG9cbiAgICogaW1wcm92ZSByZWFkYWJpbGl0eS5cbiAgICogQHBhcmFtIGxheWVycyBBbiBhcnJheSBvZiBMYXllcnMgaW4gdGhlIG1vZGVsLlxuICAgKiBAcmV0dXJucyBNYXAgb2YgTm9kZSBLZXlzIHRvIGluZGV4IG9yZGVyIHdpdGhpbiB0aGUgbGF5ZXIuXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTm9kZUNvbnZlcnNpb25NYXAobGF5ZXJzOiBMYXllcltdKToge1tub2RlS2V5OiBzdHJpbmddOiBudW1iZXJ9IHtcbiAgICBjb25zdCBub2RlQ29udmVyc2lvbk1hcDoge1tub2RlS2V5OiBzdHJpbmddOiBudW1iZXJ9ID0ge307XG4gICAgbGV0IGtlcHROb2RlczogbnVtYmVyO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIGtlcHROb2RlcyA9IGxheWVyIGluc3RhbmNlb2YgQ29udGFpbmVyID8gMSA6IDA7XG4gICAgICBmb3IgKGxldCBvcmlnaW5hbE5vZGVJbmRleCA9IDA7XG4gICAgICAgICAgIG9yaWdpbmFsTm9kZUluZGV4IDwgbGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aDsgb3JpZ2luYWxOb2RlSW5kZXgrKykge1xuICAgICAgICBjb25zdCBub2RlS2V5ID0gQ29udGFpbmVyLm5vZGVLZXkobGF5ZXIsIG9yaWdpbmFsTm9kZUluZGV4KTtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyTm9kZXMuaGFzKG5vZGVLZXkpKSB7XG4gICAgICAgICAgLy8gaS5lLiB3ZSBtYXJrIGl0IHRvIGJlIHNhdmVkXG4gICAgICAgICAgbm9kZUNvbnZlcnNpb25NYXBbbm9kZUtleV0gPSBrZXB0Tm9kZXM7XG4gICAgICAgICAga2VwdE5vZGVzICs9IDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG5vZGVDb252ZXJzaW9uTWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhIGxheWVyIGJhc2VkIG9uIGVpdGhlciBpdHMgbmFtZSAodW5pcXVlKSBvciBpbmRleC5cbiAgICpcbiAgICogSW5kaWNlcyBhcmUgYmFzZWQgb24gb3JkZXIgb2YgaG9yaXpvbnRhbCBncmFwaCB0cmF2ZXJzYWwgKGJvdHRvbS11cCkuXG4gICAqXG4gICAqIElmIGJvdGggYG5hbWVgIGFuZCBgaW5kZXhgIGFyZSBzcGVjaWZpZWQsIGBpbmRleGAgdGFrZXMgcHJlY2VkZW5jZS5cbiAgICpcbiAgICogQHBhcmFtIG5hbWUgTmFtZSBvZiBsYXllci5cbiAgICogQHBhcmFtIGluZGV4IEluZGV4IG9mIGxheWVyLlxuICAgKiBAcmV0dXJucyBBIExheWVyIGluc3RhbmNlLlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IEluIGNhc2Ugb2YgaW52YWxpZCBsYXllciBuYW1lIG9yIGluZGV4LlxuICAgKlxuICAgKiBAZG9jIHtcbiAgICogICAgaGVhZGluZzogJ0xheWVycycsXG4gICAqICAgIHN1YmhlYWRpbmc6ICdDbGFzc2VzJyxcbiAgICogICAgbmFtZXNwYWNlOiAnbGF5ZXJzJyxcbiAgICogICAgc3ViY2xhc3NlczogWydMYXllcnNNb2RlbCddXG4gICAqIH1cbiAgICovXG4gIGdldExheWVyKG5hbWU/OiBzdHJpbmcsIGluZGV4PzogbnVtYmVyKTogTGF5ZXIge1xuICAgIGlmIChpbmRleCAhPSBudWxsKSB7XG4gICAgICBpZiAodGhpcy5sYXllcnMubGVuZ3RoIDw9IGluZGV4KSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFdhcyBhc2tlZCB0byByZXRyaWV2ZSBsYXllciBhdCBpbmRleCAke2luZGV4fSwgYnV0IG1vZGVsIG9ubHkgYCArXG4gICAgICAgICAgICBgaGFzICR7dGhpcy5sYXllcnMubGVuZ3RofSBsYXllcihzKS5gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmxheWVyc1tpbmRleF07XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChuYW1lID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ1Byb3ZpZGUgZWl0aGVyIGEgbGF5ZXIgbmFtZSBvciBsYXllciBpbmRleCcpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIGlmIChsYXllci5uYW1lID09PSBuYW1lKSB7XG4gICAgICAgIHJldHVybiBsYXllcjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYE5vIHN1Y2ggbGF5ZXI6ICR7bmFtZX1gKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIENvbnRhaW5lcidzIGN1cnJlbnQgbG9zcyB2YWx1ZXMuXG4gICAqXG4gICAqIFVzZWQgZm9yIHJlZ3VsYXJpemVycyBkdXJpbmcgdHJhaW5pbmcuXG4gICAqL1xuICBjYWxjdWxhdGVMb3NzZXMoKTogU2NhbGFyW10ge1xuICAgIC8vIFBvcnRpbmcgTm9kZTogVGhpcyBpcyBhbiBhdWdtZW50YXRpb24gdG8gQ29udGFpbmVyLmxvc3MgaW4gUHlLZXJhcy5cbiAgICAvLyAgIEluIFB5S2VyYXMsIENvbnRhaW5lci5sb3NzIHJldHVybnMgc3ltYm9saWMgdGVuc29ycy4gSGVyZSBhIGNvbmNyZXRlXG4gICAgLy8gICBUZW5zb3IgKHNwZWNpZmljYWxseSBTY2FsYXIpIHZhbHVlcyBhcmUgcmV0dXJuZWQuIFRoaXMgaXMgZHVlIHRvIHRoZVxuICAgIC8vICAgaW1wZXJhdGl2ZSBiYWNrZW5kLlxuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGxvc3NlczogU2NhbGFyW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgICAgZm9yIChsZXQgbm9kZUluZGV4ID0gMDsgbm9kZUluZGV4IDwgbGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aDtcbiAgICAgICAgICAgICArK25vZGVJbmRleCkge1xuICAgICAgICAgIGNvbnN0IG5vZGVLZXkgPSBDb250YWluZXIubm9kZUtleShsYXllciwgbm9kZUluZGV4KTtcbiAgICAgICAgICBpZiAodGhpcy5jb250YWluZXJOb2Rlcy5oYXMobm9kZUtleSkpIHtcbiAgICAgICAgICAgIGxvc3Nlcy5wdXNoKC4uLmxheWVyLmNhbGN1bGF0ZUxvc3NlcygpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBhbnkgdW5jb25kaXRpb25hbCBtb2RlbC1sZXZlbCBsb3NzZXM/XG4gICAgICByZXR1cm4gbG9zc2VzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7bmFtZTogdGhpcy5uYW1lfTtcblxuICAgIC8vIEJ1aWxkIGEgbWFwIGZyb20gbGF5ZXIgdW5pcXVlIG5hbWUgKHNlbGYuX25vZGVfa2V5KVxuICAgIC8vIHRvIHRoZSBpbmRleCBvZiB0aGUgbm9kZXMgdGhhdCBhcmUgc2F2ZWQgaW4gdGhlIGNvbmZpZy5cbiAgICAvLyBPbmx5IG5vZGVzIGluIGNvbnRhaW5lcl9ub2RlcyBhcmUgc2F2ZWQuXG4gICAgY29uc3Qgbm9kZUNvbnZlcnNpb25NYXA6IHtbbm9kZUtleTogc3RyaW5nXTogbnVtYmVyfSA9XG4gICAgICAgIHRoaXMuYnVpbGROb2RlQ29udmVyc2lvbk1hcCh0aGlzLmxheWVycyk7XG5cbiAgICAvLyBTZXJpYWxpemUgYW5kIHNhdmUgdGhlIGxheWVycyBpbiBsYXllckNvbmZpZ3NcbiAgICBjb25zdCBsYXllckNvbmZpZ3MgPSBbXTtcbiAgICBmb3IgKGNvbnN0IGxheWVyIG9mIHRoaXMubGF5ZXJzKSB7XG4gICAgICBjb25zdCBsYXllckNsYXNzTmFtZSA9IGxheWVyLmdldENsYXNzTmFtZSgpO1xuICAgICAgY29uc3QgbGF5ZXJDb25maWcgPSBsYXllci5nZXRDb25maWcoKTtcbiAgICAgIGNvbnN0IGZpbHRlcmVkSW5ib3VuZE5vZGVzID0gW107XG4gICAgICBmb3IgKGxldCBvcmlnaW5hbE5vZGVJbmRleCA9IDA7XG4gICAgICAgICAgIG9yaWdpbmFsTm9kZUluZGV4IDwgbGF5ZXIuaW5ib3VuZE5vZGVzLmxlbmd0aDsgb3JpZ2luYWxOb2RlSW5kZXgrKykge1xuICAgICAgICBjb25zdCBub2RlID0gbGF5ZXIuaW5ib3VuZE5vZGVzW29yaWdpbmFsTm9kZUluZGV4XTtcbiAgICAgICAgY29uc3Qgbm9kZUtleSA9IENvbnRhaW5lci5ub2RlS2V5KGxheWVyLCBvcmlnaW5hbE5vZGVJbmRleCk7XG4gICAgICAgIGxldCBrd2FyZ3MgPSB7fTtcbiAgICAgICAgaWYgKHRoaXMuY29udGFpbmVyTm9kZXMuaGFzKG5vZGVLZXkpKSB7XG4gICAgICAgICAgLy8gVGhlIG5vZGUgaXMgcmVsZXZhbnQgdG8gdGhlIG1vZGVsOlxuICAgICAgICAgIC8vIGFkZCB0byBmaWx0ZXJlZEluYm91bmROb2Rlcy5cbiAgICAgICAgICBpZiAobm9kZS5jYWxsQXJncykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkobm9kZS5jYWxsQXJncyk7XG4gICAgICAgICAgICAgIGt3YXJncyA9IG5vZGUuY2FsbEFyZ3M7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgICAgICAgYExheWVyICR7bGF5ZXIubmFtZX0gd2FzIHBhc3NlZCBgICtcbiAgICAgICAgICAgICAgICAgIGBub24tc2VyaWFsaXphYmxlIGtleXdvcmQgYXJndW1lbnRzOiBgICtcbiAgICAgICAgICAgICAgICAgIGAke25vZGUuY2FsbEFyZ3N9LiBUaGV5IHdpbGwgbm90IGJlIGluY2x1ZGVkIGAgK1xuICAgICAgICAgICAgICAgICAgYGluIHRoZSBzZXJpYWxpemVkIG1vZGVsIChhbmQgdGh1cyB3aWxsIGJlIGAgK1xuICAgICAgICAgICAgICAgICAgYG1pc3NpbmcgYXQgZGVzZXJpYWxpemF0aW9uIHRpbWUpLmApO1xuICAgICAgICAgICAgICBrd2FyZ3MgPSB7fTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKG5vZGUuaW5ib3VuZExheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBub2RlRGF0YSA9IFtdO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmluYm91bmRMYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5ib3VuZExheWVyID0gbm9kZS5pbmJvdW5kTGF5ZXJzW2ldO1xuICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBub2RlLm5vZGVJbmRpY2VzW2ldO1xuICAgICAgICAgICAgICBjb25zdCB0ZW5zb3JJbmRleCA9IG5vZGUudGVuc29ySW5kaWNlc1tpXTtcbiAgICAgICAgICAgICAgY29uc3Qgbm9kZUtleSA9IENvbnRhaW5lci5ub2RlS2V5KGluYm91bmRMYXllciwgbm9kZUluZGV4KTtcbiAgICAgICAgICAgICAgbGV0IG5ld05vZGVJbmRleCA9IG5vZGVDb252ZXJzaW9uTWFwW25vZGVLZXldO1xuICAgICAgICAgICAgICBpZiAobmV3Tm9kZUluZGV4ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICBuZXdOb2RlSW5kZXggPSAwO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIG5vZGVEYXRhLnB1c2goXG4gICAgICAgICAgICAgICAgICBbaW5ib3VuZExheWVyLm5hbWUsIG5ld05vZGVJbmRleCwgdGVuc29ySW5kZXgsIGt3YXJnc10pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZmlsdGVyZWRJbmJvdW5kTm9kZXMucHVzaChub2RlRGF0YSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjb25zdCBkaWN0OiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICAgIGRpY3RbJ25hbWUnXSA9IGxheWVyLm5hbWU7XG4gICAgICBkaWN0WydjbGFzc05hbWUnXSA9IGxheWVyQ2xhc3NOYW1lO1xuICAgICAgZGljdFsnY29uZmlnJ10gPSBsYXllckNvbmZpZztcbiAgICAgIGRpY3RbJ2luYm91bmROb2RlcyddID0gZmlsdGVyZWRJbmJvdW5kTm9kZXM7XG4gICAgICBsYXllckNvbmZpZ3MucHVzaChkaWN0KTtcbiAgICB9XG4gICAgY29uZmlnWydsYXllcnMnXSA9IGxheWVyQ29uZmlncztcbiAgICAvLyBHYXRoZXIgaW5mbyBhYm91dCBpbnB1dHMgYW5kIG91dHB1dHNcbiAgICBjb25zdCBtb2RlbElucHV0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5pbnB1dExheWVycy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgbGF5ZXIgPSB0aGlzLmlucHV0TGF5ZXJzW2ldO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gdGhpcy5pbnB1dExheWVyc05vZGVJbmRpY2VzW2ldO1xuXG4gICAgICBjb25zdCBub2RlS2V5ID0gQ29udGFpbmVyLm5vZGVLZXkobGF5ZXIsIG5vZGVJbmRleCk7XG4gICAgICBpZiAoIXRoaXMuY29udGFpbmVyTm9kZXMuaGFzKG5vZGVLZXkpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IG5ld05vZGVJbmRleCA9IG5vZGVDb252ZXJzaW9uTWFwW25vZGVLZXldO1xuICAgICAgaWYgKG5ld05vZGVJbmRleCA9PT0gbnVsbCB8fCBuZXdOb2RlSW5kZXggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBuZXdOb2RlSW5kZXggPSAwO1xuICAgICAgfVxuICAgICAgY29uc3QgdGVuc29ySW5kZXggPSB0aGlzLmlucHV0TGF5ZXJzVGVuc29ySW5kaWNlc1tpXTtcbiAgICAgIG1vZGVsSW5wdXRzLnB1c2goW2xheWVyLm5hbWUsIG5ld05vZGVJbmRleCwgdGVuc29ySW5kZXhdKTtcbiAgICB9XG4gICAgY29uZmlnWydpbnB1dExheWVycyddID0gbW9kZWxJbnB1dHM7XG5cbiAgICBjb25zdCBtb2RlbE91dHB1dHMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub3V0cHV0TGF5ZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBsYXllciA9IHRoaXMub3V0cHV0TGF5ZXJzW2ldO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gdGhpcy5vdXRwdXRMYXllcnNOb2RlSW5kaWNlc1tpXTtcblxuICAgICAgY29uc3Qgbm9kZUtleSA9IENvbnRhaW5lci5ub2RlS2V5KGxheWVyLCBub2RlSW5kZXgpO1xuICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lck5vZGVzLmhhcyhub2RlS2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBuZXdOb2RlSW5kZXggPSBub2RlQ29udmVyc2lvbk1hcFtub2RlS2V5XTtcbiAgICAgIGlmIChuZXdOb2RlSW5kZXggPT09IG51bGwgfHwgbmV3Tm9kZUluZGV4ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbmV3Tm9kZUluZGV4ID0gMDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRlbnNvckluZGV4ID0gdGhpcy5vdXRwdXRMYXllcnNUZW5zb3JJbmRpY2VzW2ldO1xuICAgICAgbW9kZWxPdXRwdXRzLnB1c2goW2xheWVyLm5hbWUsIG5ld05vZGVJbmRleCwgdGVuc29ySW5kZXhdKTtcbiAgICB9XG4gICAgY29uZmlnWydvdXRwdXRMYXllcnMnXSA9IG1vZGVsT3V0cHV0cztcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgLyoqXG4gICAqIEluc3RhbnRpYXRlcyBhIExheWVyc01vZGVsIGZyb20gaXRzIGNvbmZpZyAob3V0cHV0IG9mIGBnZXRfY29uZmlnKClgKS5cbiAgICogQHBhcmFtIGNscyB0aGUgY2xhc3MgdG8gY3JlYXRlXG4gICAqIEBwYXJhbSBjb25maWcgTGF5ZXJzTW9kZWwgY29uZmlnIGRpY3Rpb25hcnkuXG4gICAqIEBwYXJhbSBjdXN0b21PYmplY3RzIEFuIG9wdGlvbmFsIGRpY3Rpb25hcnkgb2YgY3VzdG9tIG9iamVjdHMuXG4gICAqIEBwYXJhbSBmYXN0V2VpZ2h0SW5pdCBPcHRpb25hbCBmbGFnIHRvIHVzZSBmYXN0IHdlaWdodCBpbml0aWFsaXphdGlvblxuICAgKiAgIGR1cmluZyBkZXNlcmlhbGl6YXRpb24uIFRoaXMgaXMgYXBwbGljYWJsZSB0byBjYXNlcyBpbiB3aGljaFxuICAgKiAgIHRoZSBpbml0aWFsaXphdGlvbiB3aWxsIGJlIGltbWVkaWF0ZWx5IG92ZXJ3cml0dGVuIGJ5IGxvYWRlZCB3ZWlnaHRcbiAgICogICB2YWx1ZXMuIERlZmF1bHQ6IGBmYWxzZWAuXG4gICAqIEByZXR1cm5zIEEgTGF5ZXJzTW9kZWwgaW5zdGFuY2UuXG4gICAqIEB0aHJvd3MgVmFsdWVFcnJvcjogSW4gY2FzZSBvZiBpbXByb3Blcmx5IGZvcm1hdHRlZCBjb25maWcgZGljdC5cbiAgICovXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsXG4gICAgICBjdXN0b21PYmplY3RzID0ge30gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgZmFzdFdlaWdodEluaXQgPSBmYWxzZSk6IFQge1xuICAgIC8vIExheWVyIGluc3RhbmNlcyBjcmVhdGVkIGR1cmluZ1xuICAgIC8vIHRoZSBncmFwaCByZWNvbnN0cnVjdGlvbiBwcm9jZXNzXG4gICAgY29uc3QgY3JlYXRlZExheWVyczoge1tsYXllck5hbWU6IHN0cmluZ106IExheWVyfSA9IHt9O1xuXG4gICAgLy8gRGljdGlvbmFyeSBtYXBwaW5nIGxheWVyIGluc3RhbmNlcyB0b1xuICAgIC8vIG5vZGUgZGF0YSB0aGF0IHNwZWNpZmllcyBhIGxheWVyIGNhbGwuXG4gICAgLy8gSXQgYWN0cyBhcyBhIHF1ZXVlIHRoYXQgbWFpbnRhaW5zIGFueSB1bnByb2Nlc3NlZFxuICAgIC8vIGxheWVyIGNhbGwgdW50aWwgaXQgYmVjb21lcyBwb3NzaWJsZSB0byBwcm9jZXNzIGl0XG4gICAgLy8gKGkuZS4gdW50aWwgdGhlIGlucHV0IHRlbnNvcnMgdG8gdGhlIGNhbGwgYWxsIGV4aXN0KS5cbiAgICBjb25zdCB1bnByb2Nlc3NlZE5vZGVzOiB7W2xheWVyOiBzdHJpbmddOiBUZW5zb3JLZXlXaXRoQXJnc0FycmF5W11bXX0gPSB7fTtcbiAgICBmdW5jdGlvbiBhZGRVbnByb2Nlc3NlZE5vZGUoXG4gICAgICAgIGxheWVyOiBMYXllciwgbm9kZURhdGE6IFRlbnNvcktleVdpdGhBcmdzQXJyYXlbXSkge1xuICAgICAgaWYgKCEobGF5ZXIubmFtZSBpbiB1bnByb2Nlc3NlZE5vZGVzKSkge1xuICAgICAgICB1bnByb2Nlc3NlZE5vZGVzW2xheWVyLm5hbWVdID0gW25vZGVEYXRhXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHVucHJvY2Vzc2VkTm9kZXNbbGF5ZXIubmFtZV0ucHVzaChub2RlRGF0YSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gcHJvY2Vzc05vZGUobGF5ZXI6IExheWVyLCBub2RlRGF0YTogVGVuc29yS2V5V2l0aEFyZ3NBcnJheVtdKSB7XG4gICAgICBjb25zdCBpbnB1dFRlbnNvcnM6IFN5bWJvbGljVGVuc29yW10gPSBbXTtcbiAgICAgIGxldCBrd2FyZ3M7XG4gICAgICBmb3IgKGNvbnN0IGlucHV0RGF0YSBvZiBub2RlRGF0YSkge1xuICAgICAgICBjb25zdCBpbmJvdW5kTGF5ZXJOYW1lID0gaW5wdXREYXRhWzBdO1xuICAgICAgICBjb25zdCBpbmJvdW5kTm9kZUluZGV4ID0gaW5wdXREYXRhWzFdO1xuICAgICAgICBjb25zdCBpbmJvdW5kVGVuc29ySW5kZXggPSBpbnB1dERhdGFbMl07XG5cbiAgICAgICAga3dhcmdzID0gaW5wdXREYXRhWzNdID09IG51bGwgP1xuICAgICAgICAgICAge30gOlxuICAgICAgICAgICAgaW5wdXREYXRhWzNdIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdDtcbiAgICAgICAgaWYgKCEoaW5ib3VuZExheWVyTmFtZSBpbiBjcmVhdGVkTGF5ZXJzKSkge1xuICAgICAgICAgIGFkZFVucHJvY2Vzc2VkTm9kZShsYXllciwgbm9kZURhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmJvdW5kTGF5ZXIgPSBjcmVhdGVkTGF5ZXJzW2luYm91bmRMYXllck5hbWVdO1xuICAgICAgICBpZiAoaW5ib3VuZExheWVyLmluYm91bmROb2Rlcy5sZW5ndGggPD0gaW5ib3VuZE5vZGVJbmRleCkge1xuICAgICAgICAgIGFkZFVucHJvY2Vzc2VkTm9kZShsYXllciwgbm9kZURhdGEpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmJvdW5kTm9kZSA9IGluYm91bmRMYXllci5pbmJvdW5kTm9kZXNbaW5ib3VuZE5vZGVJbmRleF07XG4gICAgICAgIGlucHV0VGVuc29ycy5wdXNoKGluYm91bmROb2RlLm91dHB1dFRlbnNvcnNbaW5ib3VuZFRlbnNvckluZGV4XSk7XG4gICAgICB9XG4gICAgICAvLyBDYWxsIGxheWVyIG9uIGl0cyBpbnB1dHMsIHRodXMgY3JlYXRpbmcgdGhlIG5vZGVcbiAgICAgIC8vIGFuZCBidWlsZGluZyB0aGUgbGF5ZXIgaWYgbmVlZGVkLlxuICAgICAgLy8gTm90ZTogVGhpcyBoYXMgRWFnZXIgdnMgR3JhcGggSW1wbGljYXRpb25zLlxuICAgICAgaWYgKGlucHV0VGVuc29ycy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxheWVyLmFwcGx5KFxuICAgICAgICAgICAgZ2VuZXJpY191dGlscy5zaW5nbGV0b25PckFycmF5KGlucHV0VGVuc29ycyksXG4gICAgICAgICAgICBrd2FyZ3MpOyAgLy8gd2FzICoqIGt3YXJnc1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERlc2VyaWFsaXplIGEgbGF5ZXIsIHRoZW4gY2FsbCBpdCBvbiBhcHByb3ByaWF0ZSBpbnB1dHMuXG4gICAgICogQHBhcmFtIGxheWVyRGF0YTogbGF5ZXIgY29uZmlnIGRpY3QuXG4gICAgICogQHRocm93cyBWYWx1ZUVycm9yOiBJbiBjYXNlIG9mIGltcHJvcGVybHkgZm9ybWF0dGVkIGBsYXllcl9kYXRhYFxuICAgICAqIGRpY3QuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJvY2Vzc0xheWVyKGxheWVyRGF0YTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0fG51bGwpIHtcbiAgICAgIGNvbnN0IGxheWVyTmFtZSA9IGxheWVyRGF0YVsnbmFtZSddIGFzIHN0cmluZztcbiAgICAgIC8vIEluc3RhbnRpYXRlIGxheWVyLlxuICAgICAgY29uc3QgbGF5ZXIgPVxuICAgICAgICAgIGRlc2VyaWFsaXplTGF5ZXIoXG4gICAgICAgICAgICAgIGxheWVyRGF0YSxcbiAgICAgICAgICAgICAgY29uZmlnWydjdXN0b21PYmplY3RzJ10gIT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICBjb25maWdbJ2N1c3RvbU9iamVjdHMnXSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgOlxuICAgICAgICAgICAgICAgICAge30pIGFzIExheWVyO1xuICAgICAgbGF5ZXIuc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZChmYXN0V2VpZ2h0SW5pdCk7XG4gICAgICBjcmVhdGVkTGF5ZXJzW2xheWVyTmFtZV0gPSBsYXllcjtcbiAgICAgIC8vIEdhdGhlciBsYXllciBpbnB1dHMuXG4gICAgICBjb25zdCBpbmJvdW5kTm9kZXNEYXRhID1cbiAgICAgICAgICBsYXllckRhdGFbJ2luYm91bmROb2RlcyddIGFzIFRlbnNvcktleVdpdGhBcmdzQXJyYXlbXVtdO1xuICAgICAgaW5ib3VuZE5vZGVzRGF0YS5mb3JFYWNoKG5vZGVEYXRhID0+IHtcbiAgICAgICAgaWYgKCEobm9kZURhdGEgaW5zdGFuY2VvZiBBcnJheSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYENvcnJ1cHRlZCBjb25maWd1cmF0aW9uLCBleHBlY3RlZCBhcnJheSBmb3Igbm9kZURhdGE6ICR7XG4gICAgICAgICAgICAgICAgICBub2RlRGF0YX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBXZSBkb24ndCBwcm9jZXNzIG5vZGVzIChpLmUuIG1ha2UgbGF5ZXIgY2FsbHMpXG4gICAgICAgIC8vIG9uIHRoZSBmbHkgYmVjYXVzZSB0aGUgaW5ib3VuZCBub2RlIG1heSBub3QgeWV0IGV4aXN0LFxuICAgICAgICAvLyBpbiBjYXNlIG9mIGxheWVyIHNoYXJlZCBhdCBkaWZmZXJlbnQgdG9wb2xvZ2ljYWwgZGVwdGhzXG4gICAgICAgIC8vIChlLmcuYSBtb2RlbCBzdWNoIGFzIEEoQihBKEIoeCkpKSkpXG4gICAgICAgIGFkZFVucHJvY2Vzc2VkTm9kZShsYXllciwgbm9kZURhdGEpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRmlyc3QsIHdlIGNyZWF0ZSBhbGwgbGF5ZXJzIGFuZCBlbnF1ZXVlIG5vZGVzIHRvIGJlIHByb2Nlc3NlZC5cbiAgICBjb25zdCBuYW1lID0gY29uZmlnWyduYW1lJ107XG4gICAgY29uc3QgbGF5ZXJzRnJvbUNvbmZpZyA9IGNvbmZpZ1snbGF5ZXJzJ10gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0W107XG4gICAgZm9yIChjb25zdCBsYXllckRhdGEgb2YgbGF5ZXJzRnJvbUNvbmZpZykge1xuICAgICAgcHJvY2Vzc0xheWVyKGxheWVyRGF0YSk7XG4gICAgfVxuXG4gICAgLy8gVGhlbiB3ZSBwcm9jZXNzIG5vZGVzIGluIG9yZGVyIG9mIGxheWVyIGRlcHRoLlxuICAgIC8vIE5vZGVzIHRoYXQgY2Fubm90IHlldCBiZSBwcm9jZXNzZWQoaWYgdGhlIGluYm91bmQgbm9kZVxuICAgIC8vIGRvZXMgbm90IHlldCBleGlzdCkgYXJlIHJlIC0gZW5xdWV1ZWQsIGFuZCB0aGUgcHJvY2Vzc1xuICAgIC8vIGlzIHJlcGVhdGVkIHVudGlsIGFsbCBub2RlcyBhcmUgcHJvY2Vzc2VkLlxuICAgIHdoaWxlICghZ2VuZXJpY191dGlscy5pc09iamVjdEVtcHR5KHVucHJvY2Vzc2VkTm9kZXMpKSB7XG4gICAgICBmb3IgKGNvbnN0IGxheWVyRGF0YSBvZiBsYXllcnNGcm9tQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IGxheWVyID0gY3JlYXRlZExheWVyc1tsYXllckRhdGFbJ25hbWUnXSBhcyBzdHJpbmddO1xuICAgICAgICBpZiAobGF5ZXIubmFtZSBpbiB1bnByb2Nlc3NlZE5vZGVzKSB7XG4gICAgICAgICAgY29uc3QgY3VycmVudFVucHJvY2Vzc2VkTm9kZXNGb3JMYXllciA9IHVucHJvY2Vzc2VkTm9kZXNbbGF5ZXIubmFtZV07XG4gICAgICAgICAgZGVsZXRlIHVucHJvY2Vzc2VkTm9kZXNbbGF5ZXIubmFtZV07XG4gICAgICAgICAgZm9yIChjb25zdCBub2RlRGF0YSBvZiBjdXJyZW50VW5wcm9jZXNzZWROb2Rlc0ZvckxheWVyKSB7XG4gICAgICAgICAgICBwcm9jZXNzTm9kZShsYXllciwgbm9kZURhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGlucHV0VGVuc29yczogU3ltYm9saWNUZW5zb3JbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dFRlbnNvcnM6IFN5bWJvbGljVGVuc29yW10gPSBbXTtcbiAgICBjb25zdCBpbnB1dExheWVyc0Zyb21Db25maWcgPVxuICAgICAgICBjb25maWdbJ2lucHV0TGF5ZXJzJ10gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0W107XG4gICAgZm9yIChjb25zdCBsYXllckRhdGEgb2YgaW5wdXRMYXllcnNGcm9tQ29uZmlnKSB7XG4gICAgICBjb25zdCBsYXllck5hbWUgPSBsYXllckRhdGFbMF0gYXMgc3RyaW5nO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbGF5ZXJEYXRhWzFdIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IHRlbnNvckluZGV4ID0gbGF5ZXJEYXRhWzJdIGFzIG51bWJlcjtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KGxheWVyTmFtZSBpbiBjcmVhdGVkTGF5ZXJzKTtcbiAgICAgIGNvbnN0IGxheWVyID0gY3JlYXRlZExheWVyc1tsYXllck5hbWVdO1xuICAgICAgY29uc3QgbGF5ZXJPdXRwdXRUZW5zb3JzID0gbGF5ZXIuaW5ib3VuZE5vZGVzW25vZGVJbmRleF0ub3V0cHV0VGVuc29ycztcbiAgICAgIGlucHV0VGVuc29ycy5wdXNoKGxheWVyT3V0cHV0VGVuc29yc1t0ZW5zb3JJbmRleF0pO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRMYXllcnNGcm9tQ29uZmlnID1cbiAgICAgICAgY29uZmlnWydvdXRwdXRMYXllcnMnXSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RbXTtcbiAgICBmb3IgKGNvbnN0IGxheWVyRGF0YSBvZiBvdXRwdXRMYXllcnNGcm9tQ29uZmlnKSB7XG4gICAgICBjb25zdCBsYXllck5hbWUgPSBsYXllckRhdGFbMF0gYXMgc3RyaW5nO1xuICAgICAgY29uc3Qgbm9kZUluZGV4ID0gbGF5ZXJEYXRhWzFdIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IHRlbnNvckluZGV4ID0gbGF5ZXJEYXRhWzJdIGFzIG51bWJlcjtcbiAgICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0KGxheWVyTmFtZSBpbiBjcmVhdGVkTGF5ZXJzKTtcbiAgICAgIGNvbnN0IGxheWVyID0gY3JlYXRlZExheWVyc1tsYXllck5hbWVdO1xuICAgICAgY29uc3QgbGF5ZXJPdXRwdXRUZW5zb3JzID0gbGF5ZXIuaW5ib3VuZE5vZGVzW25vZGVJbmRleF0ub3V0cHV0VGVuc29ycztcbiAgICAgIG91dHB1dFRlbnNvcnMucHVzaChsYXllck91dHB1dFRlbnNvcnNbdGVuc29ySW5kZXhdKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBjbHMoe2lucHV0czogaW5wdXRUZW5zb3JzLCBvdXRwdXRzOiBvdXRwdXRUZW5zb3JzLCBuYW1lfSk7XG4gIH1cblxuICAvKipcbiAgICogRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGNvbnRhaW5lciBpcyBzdGF0ZWZ1bC5cbiAgICpcbiAgICogUG9ydGluZyBOb3RlOiB0aGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBzdGF0ZWZ1bCBAcHJvcGVydHkgb2ZcbiAgICogICB0aGUgQ29udGFpbmVyIGNsYXNzIGluIFB5S2VyYXMuXG4gICAqL1xuICBnZXQgc3RhdGVmdWwoKTogYm9vbGVhbiB7XG4gICAgLy8gUG9ydGluZyBOb3RlOiBUaGlzIGNoZWNrIGlzIHRvIHByZXZlbnQgaW5hZHZlcnRlbnQgc2V0dGluZyBvZiB0aGVcbiAgICAvLyAgIF9zdGF0ZWZ1bCBwcm9wZXJ0eSBvZiB0aGUgQ29udGFpbmVyIGluc3RhbmNlLlxuICAgIGlmICh0aGlzLl9zdGF0ZWZ1bCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ0NvbnRhaW5lciBpbnN0YW5jZSB1bmV4cGVjdGVkbHkgaGFzIF9zdGF0ZWZ1bCA9IHRydWUuIFRoZSAnICtcbiAgICAgICAgICAnc3RhdGVmdWxuZXNzIG9mIGEgQ29udGFpbmVyIGlzIGRldGVybWluZWQgYnkgdGhlIExheWVycyBpdCAnICtcbiAgICAgICAgICAnY29udGFpbnMuIEl0cyBfc3RhdGVmdWwgcHJvcGVydHkgbXVzdCByZW1haW4gdGhlIGRlZmF1bHQgZmFsc2UuJyk7XG4gICAgfVxuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIGlmIChsYXllci5zdGF0ZWZ1bCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiBhbGwgc3RhdGVmdWwgY29uc3RpdHVlbnQgbGF5ZXJzIChpZiBhbnkpLlxuICAgKlxuICAgKiBFeGFtcGxlcyBvZiBzdGF0ZWZ1bCBsYXllcnMgaW5jbHVkZSBSTk4gbGF5ZXJzIHdob3NlIGBzdGF0ZWZ1bGAgcHJvcGVydHlcbiAgICogaXMgc2V0IGFzIGB0cnVlYC5cbiAgICovXG4gIHJlc2V0U3RhdGVzKCkge1xuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5sYXllcnMuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWFueVxuICAgICAgICBpZiAobGF5ZXIuc3RhdGVmdWwpIHtcbiAgICAgICAgICBsYXllci5yZXNldFN0YXRlcygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRzbGludDplbmFibGU6bm8tYW55XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { argMax, clone, dispose, mul, reshape, tensor1d, tidy } from '@tensorflow/tfjs-core';\nfunction standardizeSampleOrClassWeights(xWeight, outputNames, weightType) {\n    const numOutputs = outputNames.length;\n    if (xWeight == null || (Array.isArray(xWeight) && xWeight.length === 0)) {\n        return outputNames.map(name => null);\n    }\n    if (numOutputs === 1) {\n        if (Array.isArray(xWeight) && xWeight.length === 1) {\n            return xWeight;\n        }\n        else if (typeof xWeight === 'object' && outputNames[0] in xWeight) {\n            return [xWeight[outputNames[0]]];\n        }\n        else {\n            return [xWeight];\n        }\n    }\n    if (Array.isArray(xWeight)) {\n        if (xWeight.length !== numOutputs) {\n            throw new Error(`Provided ${weightType} is an array of ${xWeight.length} ` +\n                `element(s), but the model has ${numOutputs} outputs. ` +\n                `Make sure a set of weights is provided for each model output.`);\n        }\n        return xWeight;\n    }\n    else if (typeof xWeight === 'object' && Object.keys(xWeight).length > 0 &&\n        typeof xWeight[Object.keys(xWeight)[0]] ===\n            'object') {\n        const output = [];\n        outputNames.forEach(outputName => {\n            if (outputName in xWeight) {\n                output.push(xWeight[outputName]);\n            }\n            else {\n                output.push(null);\n            }\n        });\n        return output;\n    }\n    else {\n        throw new Error(`The model has multiple (${numOutputs}) outputs, ` +\n            `so ${weightType} must be either an array with ` +\n            `${numOutputs} elements or an object with ${outputNames} keys. ` +\n            `Provided ${weightType} not understood: ${JSON.stringify(xWeight)}`);\n    }\n}\n/**\n * Standardize class weighting objects.\n *\n * This function takes a single class-weighting object, an array of them,\n * or a map from output name to class-weighting object. It compares it to the\n * output name(s) of the model, base on which it outputs an array of\n * class-weighting objects of which the length matches the number of outputs.\n *\n * @param classWeight Input class-weighting object(s).\n * @param outputNames All output name(s) of the model.\n * @return An array of class-weighting objects. The length of the array matches\n *   the model's number of outputs.\n */\nexport function standardizeClassWeights(classWeight, outputNames) {\n    return standardizeSampleOrClassWeights(classWeight, outputNames, 'classWeight');\n}\nexport function standardizeSampleWeights(classWeight, outputNames) {\n    return standardizeSampleOrClassWeights(classWeight, outputNames, 'sampleWeight');\n}\n/**\n * Standardize by-sample and/or by-class weights for training.\n *\n * Note that this function operates on one model output at a time. For a model\n * with multiple outputs, you must call this function multiple times.\n *\n * @param y The target tensor that the by-sample and/or by-class weight is for.\n *     The values of y are assumed to encode the classes, either directly\n *     as an integer index, or as one-hot encoding.\n * @param sampleWeight By-sample weights.\n * @param classWeight By-class weights: an object mapping class indices\n *     (integers) to a weight (float) to apply to the model's loss for the\n *     samples from this class during training. This can be useful to tell the\n *     model to \"pay more attention\" to samples from an under-represented class.\n * @param sampleWeightMode The mode for the sample weights.\n * @return A Promise of weight tensor, of which the size of the first dimension\n *     matches that of `y`.\n */\nexport async function standardizeWeights(y, sampleWeight, classWeight, sampleWeightMode) {\n    if (sampleWeight != null || sampleWeightMode != null) {\n        // TODO(cais): Once 'temporal' mode is implemented, document it in the doc\n        // string.\n        throw new Error('Support sampleWeight is not implemented yet');\n    }\n    if (classWeight != null) {\n        // Apply class weights per sample.\n        const yClasses = tidy(() => {\n            if (y.shape.length === 1) {\n                // Assume class indices.\n                return clone(y);\n            }\n            else if (y.shape.length === 2) {\n                if (y.shape[1] > 1) {\n                    // Assume one-hot encoding of classes.\n                    const axis = 1;\n                    return argMax(y, axis);\n                }\n                else if (y.shape[1] === 1) {\n                    // Class index.\n                    return reshape(y, [y.shape[0]]);\n                }\n                else {\n                    throw new Error(`Encountered unexpected last-dimension size (${y.shape[1]}) ` +\n                        `during handling of class weights. The size is expected to be ` +\n                        `>= 1.`);\n                }\n            }\n            else {\n                throw new Error(`Unexpected rank of target (y) tensor (${y.rank}) during ` +\n                    `handling of class weights. The rank is expected to be 1 or 2.`);\n            }\n        });\n        const yClassIndices = Array.from(await yClasses.data());\n        dispose(yClasses);\n        const classSampleWeight = [];\n        yClassIndices.forEach(classIndex => {\n            if (classWeight[classIndex] == null) {\n                throw new Error(`classWeight must contain all classes in the training data. ` +\n                    `The class ${classIndex} exists in the data but not in ` +\n                    `classWeight`);\n            }\n            else {\n                classSampleWeight.push(classWeight[classIndex]);\n            }\n        });\n        return tensor1d(classSampleWeight, 'float32');\n    }\n    else {\n        return null;\n    }\n}\n/**\n * Apply per-sample weights on the loss values from a number of samples.\n *\n * @param losses Loss tensor of shape `[batchSize]`.\n * @param sampleWeights Per-sample weight tensor of shape `[batchSize]`.\n * @returns Tensor of the same shape as`losses`.\n */\nexport function computeWeightedLoss(losses, sampleWeights) {\n    return mul(losses, sampleWeights);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmdfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL3RyYWluaW5nX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQW9CLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQXVCN0csU0FBUywrQkFBK0IsQ0FDcEMsT0FBaUQsRUFBRSxXQUFxQixFQUN4RSxVQUF3QztJQUMxQyxNQUFNLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO0lBQ3RDLElBQUksT0FBTyxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsRUFBRTtRQUN2RSxPQUFPLFdBQVcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUN0QztJQUNELElBQUksVUFBVSxLQUFLLENBQUMsRUFBRTtRQUNwQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDbEQsT0FBTyxPQUFPLENBQUM7U0FDaEI7YUFBTSxJQUFJLE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksT0FBTyxFQUFFO1lBQ25FLE9BQU8sQ0FBRSxPQUEwQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNMLE9BQU8sQ0FBQyxPQUFzQixDQUFDLENBQUM7U0FDakM7S0FDRjtJQUNELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsRUFBRTtRQUMxQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO1lBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQ1gsWUFBWSxVQUFVLG1CQUFtQixPQUFPLENBQUMsTUFBTSxHQUFHO2dCQUMxRCxpQ0FBaUMsVUFBVSxZQUFZO2dCQUN2RCwrREFBK0QsQ0FBQyxDQUFDO1NBQ3RFO1FBQ0QsT0FBTyxPQUFPLENBQUM7S0FDaEI7U0FBTSxJQUNILE9BQU8sT0FBTyxLQUFLLFFBQVEsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQzlELE9BQVEsT0FBMEIsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3ZELFFBQVEsRUFBRTtRQUNoQixNQUFNLE1BQU0sR0FBa0IsRUFBRSxDQUFDO1FBQ2pDLFdBQVcsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDL0IsSUFBSSxVQUFVLElBQUksT0FBTyxFQUFFO2dCQUN6QixNQUFNLENBQUMsSUFBSSxDQUFFLE9BQTBCLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUN0RDtpQkFBTTtnQkFDTCxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2FBQ25CO1FBQ0gsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUNYLDJCQUEyQixVQUFVLGFBQWE7WUFDbEQsTUFBTSxVQUFVLGdDQUFnQztZQUNoRCxHQUFHLFVBQVUsK0JBQStCLFdBQVcsU0FBUztZQUNoRSxZQUFZLFVBQVUsb0JBQW9CLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzFFO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSx1QkFBdUIsQ0FDbkMsV0FBcUQsRUFDckQsV0FBcUI7SUFDdkIsT0FBTywrQkFBK0IsQ0FDbEMsV0FBVyxFQUFFLFdBQVcsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHdCQUF3QixDQUNwQyxXQUFxRCxFQUNyRCxXQUFxQjtJQUN2QixPQUFPLCtCQUErQixDQUNsQyxXQUFXLEVBQUUsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FpQkc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLGtCQUFrQixDQUNwQyxDQUFTLEVBQUUsWUFBcUIsRUFBRSxXQUF5QixFQUMzRCxnQkFBNkI7SUFDL0IsSUFBSSxZQUFZLElBQUksSUFBSSxJQUFJLGdCQUFnQixJQUFJLElBQUksRUFBRTtRQUNwRCwwRUFBMEU7UUFDMUUsVUFBVTtRQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkNBQTZDLENBQUMsQ0FBQztLQUNoRTtJQUVELElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixrQ0FBa0M7UUFDbEMsTUFBTSxRQUFRLEdBQWEsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNuQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDeEIsd0JBQXdCO2dCQUN4QixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQWEsQ0FBQzthQUM3QjtpQkFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDbEIsc0NBQXNDO29CQUN0QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUM7b0JBQ2YsT0FBTyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUN4QjtxQkFBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO29CQUMzQixlQUFlO29CQUNmLE9BQU8sT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUNqQztxQkFBTTtvQkFDTCxNQUFNLElBQUksS0FBSyxDQUNYLCtDQUErQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJO3dCQUM3RCwrREFBK0Q7d0JBQy9ELE9BQU8sQ0FBQyxDQUFDO2lCQUNkO2FBQ0Y7aUJBQU07Z0JBQ0wsTUFBTSxJQUFJLEtBQUssQ0FDWCx5Q0FBeUMsQ0FBQyxDQUFDLElBQUksV0FBVztvQkFDMUQsK0RBQStELENBQUMsQ0FBQzthQUN0RTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxhQUFhLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hELE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsQixNQUFNLGlCQUFpQixHQUFhLEVBQUUsQ0FBQztRQUN2QyxhQUFhLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFO1lBQ2pDLElBQUksV0FBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLElBQUksRUFBRTtnQkFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDWCw2REFBNkQ7b0JBQzdELGFBQWEsVUFBVSxpQ0FBaUM7b0JBQ3hELGFBQWEsQ0FBQyxDQUFDO2FBQ3BCO2lCQUFNO2dCQUNMLGlCQUFpQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQzthQUNqRDtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxRQUFRLENBQUMsaUJBQWlCLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDL0M7U0FBTTtRQUNMLE9BQU8sSUFBSSxDQUFDO0tBQ2I7QUFDSCxDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLG1CQUFtQixDQUFDLE1BQWMsRUFBRSxhQUFxQjtJQUN2RSxPQUFPLEdBQUcsQ0FBQyxNQUFNLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YXJnTWF4LCBjbG9uZSwgZGlzcG9zZSwgbXVsLCByZXNoYXBlLCBUZW5zb3IsIFRlbnNvcjFELCB0ZW5zb3IxZCwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuLyoqXG4gKiBGb3IgbXVsdGktY2xhc3MgY2xhc3NpZmljYXRpb24gcHJvYmxlbXMsIHRoaXMgb2JqZWN0IGlzIGRlc2lnbmVkIHRvIHN0b3JlIGFcbiAqIG1hcHBpbmcgZnJvbSBjbGFzcyBpbmRleCB0byB0aGUgXCJ3ZWlnaHRcIiBvZiB0aGUgY2xhc3MsIHdoZXJlIGhpZ2hlciB3ZWlnaHRlZFxuICogY2xhc3NlcyBoYXZlIGxhcmdlciBpbXBhY3Qgb24gbG9zcywgYWNjdXJhY3ksIGFuZCBvdGhlciBtZXRyaWNzLlxuICpcbiAqIFRoaXMgaXMgdXNlZnVsIGZvciBjYXNlcyBpbiB3aGljaCB5b3Ugd2FudCB0aGUgbW9kZWwgdG8gXCJwYXkgbW9yZSBhdHRlbnRpb25cIlxuICogdG8gZXhhbXBsZXMgZnJvbSBhbiB1bmRlci1yZXByZXNlbnRlZCBjbGFzcywgZS5nLiwgaW4gdW5iYWxhbmNlZCBkYXRhc2V0cy5cbiAqL1xuZXhwb3J0IHR5cGUgQ2xhc3NXZWlnaHQgPSB7XG4gIFtjbGFzc0luZGV4OiBudW1iZXJdOiBudW1iZXJcbn07XG5cbi8qKlxuICogQ2xhc3Mgd2VpZ2h0aW5nIGZvciBhIG1vZGVsIHdpdGggbXVsdGlwbGUgb3V0cHV0cy5cbiAqXG4gKiBUaGlzIG9iamVjdCBtYXBzIGVhY2ggb3V0cHV0IG5hbWUgdG8gYSBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0LlxuICovXG5leHBvcnQgdHlwZSBDbGFzc1dlaWdodE1hcCA9IHtcbiAgW291dHB1dE5hbWU6IHN0cmluZ106IENsYXNzV2VpZ2h0XG59O1xuXG5mdW5jdGlvbiBzdGFuZGFyZGl6ZVNhbXBsZU9yQ2xhc3NXZWlnaHRzKFxuICAgIHhXZWlnaHQ6IENsYXNzV2VpZ2h0fENsYXNzV2VpZ2h0W118Q2xhc3NXZWlnaHRNYXAsIG91dHB1dE5hbWVzOiBzdHJpbmdbXSxcbiAgICB3ZWlnaHRUeXBlOiAnc2FtcGxlV2VpZ2h0J3wnY2xhc3NXZWlnaHQnKTogQ2xhc3NXZWlnaHRbXSB7XG4gIGNvbnN0IG51bU91dHB1dHMgPSBvdXRwdXROYW1lcy5sZW5ndGg7XG4gIGlmICh4V2VpZ2h0ID09IG51bGwgfHwgKEFycmF5LmlzQXJyYXkoeFdlaWdodCkgJiYgeFdlaWdodC5sZW5ndGggPT09IDApKSB7XG4gICAgcmV0dXJuIG91dHB1dE5hbWVzLm1hcChuYW1lID0+IG51bGwpO1xuICB9XG4gIGlmIChudW1PdXRwdXRzID09PSAxKSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoeFdlaWdodCkgJiYgeFdlaWdodC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiB4V2VpZ2h0O1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHhXZWlnaHQgPT09ICdvYmplY3QnICYmIG91dHB1dE5hbWVzWzBdIGluIHhXZWlnaHQpIHtcbiAgICAgIHJldHVybiBbKHhXZWlnaHQgYXMgQ2xhc3NXZWlnaHRNYXApW291dHB1dE5hbWVzWzBdXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeFdlaWdodCBhcyBDbGFzc1dlaWdodF07XG4gICAgfVxuICB9XG4gIGlmIChBcnJheS5pc0FycmF5KHhXZWlnaHQpKSB7XG4gICAgaWYgKHhXZWlnaHQubGVuZ3RoICE9PSBudW1PdXRwdXRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFByb3ZpZGVkICR7d2VpZ2h0VHlwZX0gaXMgYW4gYXJyYXkgb2YgJHt4V2VpZ2h0Lmxlbmd0aH0gYCArXG4gICAgICAgICAgYGVsZW1lbnQocyksIGJ1dCB0aGUgbW9kZWwgaGFzICR7bnVtT3V0cHV0c30gb3V0cHV0cy4gYCArXG4gICAgICAgICAgYE1ha2Ugc3VyZSBhIHNldCBvZiB3ZWlnaHRzIGlzIHByb3ZpZGVkIGZvciBlYWNoIG1vZGVsIG91dHB1dC5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHhXZWlnaHQ7XG4gIH0gZWxzZSBpZiAoXG4gICAgICB0eXBlb2YgeFdlaWdodCA9PT0gJ29iamVjdCcgJiYgT2JqZWN0LmtleXMoeFdlaWdodCkubGVuZ3RoID4gMCAmJlxuICAgICAgdHlwZW9mICh4V2VpZ2h0IGFzIENsYXNzV2VpZ2h0TWFwKVtPYmplY3Qua2V5cyh4V2VpZ2h0KVswXV0gPT09XG4gICAgICAgICAgJ29iamVjdCcpIHtcbiAgICBjb25zdCBvdXRwdXQ6IENsYXNzV2VpZ2h0W10gPSBbXTtcbiAgICBvdXRwdXROYW1lcy5mb3JFYWNoKG91dHB1dE5hbWUgPT4ge1xuICAgICAgaWYgKG91dHB1dE5hbWUgaW4geFdlaWdodCkge1xuICAgICAgICBvdXRwdXQucHVzaCgoeFdlaWdodCBhcyBDbGFzc1dlaWdodE1hcClbb3V0cHV0TmFtZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0LnB1c2gobnVsbCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUaGUgbW9kZWwgaGFzIG11bHRpcGxlICgke251bU91dHB1dHN9KSBvdXRwdXRzLCBgICtcbiAgICAgICAgYHNvICR7d2VpZ2h0VHlwZX0gbXVzdCBiZSBlaXRoZXIgYW4gYXJyYXkgd2l0aCBgICtcbiAgICAgICAgYCR7bnVtT3V0cHV0c30gZWxlbWVudHMgb3IgYW4gb2JqZWN0IHdpdGggJHtvdXRwdXROYW1lc30ga2V5cy4gYCArXG4gICAgICAgIGBQcm92aWRlZCAke3dlaWdodFR5cGV9IG5vdCB1bmRlcnN0b29kOiAke0pTT04uc3RyaW5naWZ5KHhXZWlnaHQpfWApO1xuICB9XG59XG5cbi8qKlxuICogU3RhbmRhcmRpemUgY2xhc3Mgd2VpZ2h0aW5nIG9iamVjdHMuXG4gKlxuICogVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHNpbmdsZSBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0LCBhbiBhcnJheSBvZiB0aGVtLFxuICogb3IgYSBtYXAgZnJvbSBvdXRwdXQgbmFtZSB0byBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0LiBJdCBjb21wYXJlcyBpdCB0byB0aGVcbiAqIG91dHB1dCBuYW1lKHMpIG9mIHRoZSBtb2RlbCwgYmFzZSBvbiB3aGljaCBpdCBvdXRwdXRzIGFuIGFycmF5IG9mXG4gKiBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0cyBvZiB3aGljaCB0aGUgbGVuZ3RoIG1hdGNoZXMgdGhlIG51bWJlciBvZiBvdXRwdXRzLlxuICpcbiAqIEBwYXJhbSBjbGFzc1dlaWdodCBJbnB1dCBjbGFzcy13ZWlnaHRpbmcgb2JqZWN0KHMpLlxuICogQHBhcmFtIG91dHB1dE5hbWVzIEFsbCBvdXRwdXQgbmFtZShzKSBvZiB0aGUgbW9kZWwuXG4gKiBAcmV0dXJuIEFuIGFycmF5IG9mIGNsYXNzLXdlaWdodGluZyBvYmplY3RzLiBUaGUgbGVuZ3RoIG9mIHRoZSBhcnJheSBtYXRjaGVzXG4gKiAgIHRoZSBtb2RlbCdzIG51bWJlciBvZiBvdXRwdXRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc3RhbmRhcmRpemVDbGFzc1dlaWdodHMoXG4gICAgY2xhc3NXZWlnaHQ6IENsYXNzV2VpZ2h0fENsYXNzV2VpZ2h0W118Q2xhc3NXZWlnaHRNYXAsXG4gICAgb3V0cHV0TmFtZXM6IHN0cmluZ1tdKTogQ2xhc3NXZWlnaHRbXSB7XG4gIHJldHVybiBzdGFuZGFyZGl6ZVNhbXBsZU9yQ2xhc3NXZWlnaHRzKFxuICAgICAgY2xhc3NXZWlnaHQsIG91dHB1dE5hbWVzLCAnY2xhc3NXZWlnaHQnKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0YW5kYXJkaXplU2FtcGxlV2VpZ2h0cyhcbiAgICBjbGFzc1dlaWdodDogQ2xhc3NXZWlnaHR8Q2xhc3NXZWlnaHRbXXxDbGFzc1dlaWdodE1hcCxcbiAgICBvdXRwdXROYW1lczogc3RyaW5nW10pOiBDbGFzc1dlaWdodFtdIHtcbiAgcmV0dXJuIHN0YW5kYXJkaXplU2FtcGxlT3JDbGFzc1dlaWdodHMoXG4gICAgICBjbGFzc1dlaWdodCwgb3V0cHV0TmFtZXMsICdzYW1wbGVXZWlnaHQnKTtcbn1cblxuLyoqXG4gKiBTdGFuZGFyZGl6ZSBieS1zYW1wbGUgYW5kL29yIGJ5LWNsYXNzIHdlaWdodHMgZm9yIHRyYWluaW5nLlxuICpcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIG9wZXJhdGVzIG9uIG9uZSBtb2RlbCBvdXRwdXQgYXQgYSB0aW1lLiBGb3IgYSBtb2RlbFxuICogd2l0aCBtdWx0aXBsZSBvdXRwdXRzLCB5b3UgbXVzdCBjYWxsIHRoaXMgZnVuY3Rpb24gbXVsdGlwbGUgdGltZXMuXG4gKlxuICogQHBhcmFtIHkgVGhlIHRhcmdldCB0ZW5zb3IgdGhhdCB0aGUgYnktc2FtcGxlIGFuZC9vciBieS1jbGFzcyB3ZWlnaHQgaXMgZm9yLlxuICogICAgIFRoZSB2YWx1ZXMgb2YgeSBhcmUgYXNzdW1lZCB0byBlbmNvZGUgdGhlIGNsYXNzZXMsIGVpdGhlciBkaXJlY3RseVxuICogICAgIGFzIGFuIGludGVnZXIgaW5kZXgsIG9yIGFzIG9uZS1ob3QgZW5jb2RpbmcuXG4gKiBAcGFyYW0gc2FtcGxlV2VpZ2h0IEJ5LXNhbXBsZSB3ZWlnaHRzLlxuICogQHBhcmFtIGNsYXNzV2VpZ2h0IEJ5LWNsYXNzIHdlaWdodHM6IGFuIG9iamVjdCBtYXBwaW5nIGNsYXNzIGluZGljZXNcbiAqICAgICAoaW50ZWdlcnMpIHRvIGEgd2VpZ2h0IChmbG9hdCkgdG8gYXBwbHkgdG8gdGhlIG1vZGVsJ3MgbG9zcyBmb3IgdGhlXG4gKiAgICAgc2FtcGxlcyBmcm9tIHRoaXMgY2xhc3MgZHVyaW5nIHRyYWluaW5nLiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8gdGVsbCB0aGVcbiAqICAgICBtb2RlbCB0byBcInBheSBtb3JlIGF0dGVudGlvblwiIHRvIHNhbXBsZXMgZnJvbSBhbiB1bmRlci1yZXByZXNlbnRlZCBjbGFzcy5cbiAqIEBwYXJhbSBzYW1wbGVXZWlnaHRNb2RlIFRoZSBtb2RlIGZvciB0aGUgc2FtcGxlIHdlaWdodHMuXG4gKiBAcmV0dXJuIEEgUHJvbWlzZSBvZiB3ZWlnaHQgdGVuc29yLCBvZiB3aGljaCB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgZGltZW5zaW9uXG4gKiAgICAgbWF0Y2hlcyB0aGF0IG9mIGB5YC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHN0YW5kYXJkaXplV2VpZ2h0cyhcbiAgICB5OiBUZW5zb3IsIHNhbXBsZVdlaWdodD86IFRlbnNvciwgY2xhc3NXZWlnaHQ/OiBDbGFzc1dlaWdodCxcbiAgICBzYW1wbGVXZWlnaHRNb2RlPzogJ3RlbXBvcmFsJyk6IFByb21pc2U8VGVuc29yPiB7XG4gIGlmIChzYW1wbGVXZWlnaHQgIT0gbnVsbCB8fCBzYW1wbGVXZWlnaHRNb2RlICE9IG51bGwpIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBPbmNlICd0ZW1wb3JhbCcgbW9kZSBpcyBpbXBsZW1lbnRlZCwgZG9jdW1lbnQgaXQgaW4gdGhlIGRvY1xuICAgIC8vIHN0cmluZy5cbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1N1cHBvcnQgc2FtcGxlV2VpZ2h0IGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQnKTtcbiAgfVxuXG4gIGlmIChjbGFzc1dlaWdodCAhPSBudWxsKSB7XG4gICAgLy8gQXBwbHkgY2xhc3Mgd2VpZ2h0cyBwZXIgc2FtcGxlLlxuICAgIGNvbnN0IHlDbGFzc2VzOiBUZW5zb3IxRCA9IHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKHkuc2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIC8vIEFzc3VtZSBjbGFzcyBpbmRpY2VzLlxuICAgICAgICByZXR1cm4gY2xvbmUoeSkgYXMgVGVuc29yMUQ7XG4gICAgICB9IGVsc2UgaWYgKHkuc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGlmICh5LnNoYXBlWzFdID4gMSkge1xuICAgICAgICAgIC8vIEFzc3VtZSBvbmUtaG90IGVuY29kaW5nIG9mIGNsYXNzZXMuXG4gICAgICAgICAgY29uc3QgYXhpcyA9IDE7XG4gICAgICAgICAgcmV0dXJuIGFyZ01heCh5LCBheGlzKTtcbiAgICAgICAgfSBlbHNlIGlmICh5LnNoYXBlWzFdID09PSAxKSB7XG4gICAgICAgICAgLy8gQ2xhc3MgaW5kZXguXG4gICAgICAgICAgcmV0dXJuIHJlc2hhcGUoeSwgW3kuc2hhcGVbMF1dKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBFbmNvdW50ZXJlZCB1bmV4cGVjdGVkIGxhc3QtZGltZW5zaW9uIHNpemUgKCR7eS5zaGFwZVsxXX0pIGAgK1xuICAgICAgICAgICAgICBgZHVyaW5nIGhhbmRsaW5nIG9mIGNsYXNzIHdlaWdodHMuIFRoZSBzaXplIGlzIGV4cGVjdGVkIHRvIGJlIGAgK1xuICAgICAgICAgICAgICBgPj0gMS5gKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuZXhwZWN0ZWQgcmFuayBvZiB0YXJnZXQgKHkpIHRlbnNvciAoJHt5LnJhbmt9KSBkdXJpbmcgYCArXG4gICAgICAgICAgICBgaGFuZGxpbmcgb2YgY2xhc3Mgd2VpZ2h0cy4gVGhlIHJhbmsgaXMgZXhwZWN0ZWQgdG8gYmUgMSBvciAyLmApO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgY29uc3QgeUNsYXNzSW5kaWNlcyA9IEFycmF5LmZyb20oYXdhaXQgeUNsYXNzZXMuZGF0YSgpKTtcbiAgICBkaXNwb3NlKHlDbGFzc2VzKTtcbiAgICBjb25zdCBjbGFzc1NhbXBsZVdlaWdodDogbnVtYmVyW10gPSBbXTtcbiAgICB5Q2xhc3NJbmRpY2VzLmZvckVhY2goY2xhc3NJbmRleCA9PiB7XG4gICAgICBpZiAoY2xhc3NXZWlnaHRbY2xhc3NJbmRleF0gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgY2xhc3NXZWlnaHQgbXVzdCBjb250YWluIGFsbCBjbGFzc2VzIGluIHRoZSB0cmFpbmluZyBkYXRhLiBgICtcbiAgICAgICAgICAgIGBUaGUgY2xhc3MgJHtjbGFzc0luZGV4fSBleGlzdHMgaW4gdGhlIGRhdGEgYnV0IG5vdCBpbiBgICtcbiAgICAgICAgICAgIGBjbGFzc1dlaWdodGApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY2xhc3NTYW1wbGVXZWlnaHQucHVzaChjbGFzc1dlaWdodFtjbGFzc0luZGV4XSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGVuc29yMWQoY2xhc3NTYW1wbGVXZWlnaHQsICdmbG9hdDMyJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBcHBseSBwZXItc2FtcGxlIHdlaWdodHMgb24gdGhlIGxvc3MgdmFsdWVzIGZyb20gYSBudW1iZXIgb2Ygc2FtcGxlcy5cbiAqXG4gKiBAcGFyYW0gbG9zc2VzIExvc3MgdGVuc29yIG9mIHNoYXBlIGBbYmF0Y2hTaXplXWAuXG4gKiBAcGFyYW0gc2FtcGxlV2VpZ2h0cyBQZXItc2FtcGxlIHdlaWdodCB0ZW5zb3Igb2Ygc2hhcGUgYFtiYXRjaFNpemVdYC5cbiAqIEByZXR1cm5zIFRlbnNvciBvZiB0aGUgc2FtZSBzaGFwZSBhc2Bsb3NzZXNgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcHV0ZVdlaWdodGVkTG9zcyhsb3NzZXM6IFRlbnNvciwgc2FtcGxlV2VpZ2h0czogVGVuc29yKSB7XG4gIHJldHVybiBtdWwobG9zc2VzLCBzYW1wbGVXZWlnaHRzKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Interfaces and methods for training models using TensorFlow.js datasets.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { scalar } from '@tensorflow/tfjs-core';\nimport { configureCallbacks, standardizeCallbacks } from '../base_callbacks';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { disposeTensorsInLogs } from '../logs';\nimport { singletonOrArray, toList } from '../utils/generic_utils';\nimport { standardizeClassWeights, standardizeWeights } from './training_utils';\n// Default batch size used during tensor-based validation.\nconst DEFAULT_VALIDATION_BATCH_SIZE = 32;\n/**\n * Standardize the output of a dataset iterator for use by\n * LayersModel.fitDataset().\n *\n * @param model: A `tf.LayersModel` object.\n * @param iteratorOut The output of a dataset iterator. It is required to be\n *   an object of the form `{xs: TensorOrArrayOrMap, ys:\n * TensorOrArrayOrMap}`, where `TensorOrArrayOrMap` is a single `tf.Tensor`,\n * a `tf.Tensor[]`, or a flat map from string names to `tf.Tensor`s.\n * @returns A flat array of `tf.Tensor` objects: the input `tf.Tensor`s\n *   followed by the target `tf.Tensor`s.  When `tf.Tensor`s are provided\n *   as a map, the order in the resulting array is taken from the `inputNames`\n *   and `outputNames` of the model.\n */\nfunction standardizeDataIteratorOutput(\n// Type `model` as `any` here to avoid circular dependency w/\n// training.ts.\n// tslint:disable-next-line:no-any\nmodel, iteratorOut) {\n    let xs;\n    let ys;\n    const iteratorOutObj = iteratorOut;\n    xs = iteratorOutObj['xs'];\n    ys = iteratorOutObj['ys'];\n    tfc.util.assert(xs != null && ys != null, () => 'A Dataset iterator for fitDataset() is expected to generate ' +\n        'objects of the form `{xs: xVal, ys: yVal}`, where the two ' +\n        'values may be `tf.Tensor`, an array of Tensors, or a map of ' +\n        'string to Tensor.  The provided Dataset instead generates ' +\n        `${iteratorOut}`);\n    const flattenedXs = flattenTensorOrArrayOrMap('input', model.inputNames, xs);\n    const flattenedYs = flattenTensorOrArrayOrMap('output', model.outputNames, ys);\n    const batchSize = flattenedXs[0].shape[0];\n    tfc.util.assert(flattenedXs.length === model.inputs.length, () => `LayersModel has ${model.inputs.length} inputs, but the dataset ` +\n        `provides ${flattenedXs.length} inputs.  (Expected input keys: ` +\n        `${JSON.stringify(model.inputNames)})`);\n    tfc.util.assert(flattenedYs.length === model.outputs.length, () => `LayersModel has ${model.outputs.length} outputs, but the dataset ` +\n        `provides ${flattenedYs.length} outputs.  (Expected output keys: ` +\n        `${JSON.stringify(model.outputNames)})`);\n    for (let xIndex = 0; xIndex < flattenedXs.length; xIndex++) {\n        tfc.util.assert(flattenedXs[xIndex].shape[0] === batchSize, () => `Batch size mismatch: input ` +\n            `${model.inputNames[xIndex]} has ${flattenedXs[xIndex].shape[0]}; ` +\n            `expected  ${batchSize} based on input ${model.inputNames[0]}.`);\n    }\n    for (let yIndex = 0; yIndex < flattenedYs.length; yIndex++) {\n        tfc.util.assert(flattenedYs[yIndex].shape[0] === batchSize, () => `Batch size mismatch: output ` +\n            `${model.outputNames[yIndex]} has ${flattenedYs[yIndex].shape[0]}; ` +\n            `expected  ${batchSize} based on input ${model.inputNames[0]}.`);\n    }\n    return { xs: flattenedXs, ys: flattenedYs };\n}\nfunction flattenTensorOrArrayOrMap(inputOrOutput, names, values) {\n    if (values instanceof tfc.Tensor) {\n        return [values];\n    }\n    else if (Array.isArray(values)) {\n        tfc.util.assert(values.length === names.length, () => `Received an array of ${values.length} Tensors, but expected ${names.length} to match the ${inputOrOutput} keys ${names}.`);\n        return values;\n    }\n    else {\n        const result = [];\n        // Check that all the required keys are available.\n        for (const name of names) {\n            if (values[name] == null) {\n                throw new ValueError(`The feature data generated by the dataset lacks the required ` +\n                    `${inputOrOutput} key '${name}'.`);\n            }\n            result.push(values[name]);\n        }\n        return result;\n    }\n}\nfunction standardizeTensorValidationData(data) {\n    if (data.length === 3) {\n        throw new NotImplementedError('Validation with sample weights is not implemented yet.');\n    }\n    return { xs: data[0], ys: data[1] };\n}\nexport async function fitDataset(\n// Type `model` as `any` here to avoid circular dependency w/\n// training.ts.\n// tslint:disable-next-line:no-any\nmodel, dataset, args) {\n    const hasBatchesPerEpoch = args.batchesPerEpoch != null;\n    tfc.util.assert(model.optimizer != null, () => 'You must compile a model before training/testing. Use ' +\n        'LayersModel.compile(modelCompileConfig).');\n    tfc.util.assert(args != null, () => `For fitDataset(), the 2nd argument (config) is required, ` +\n        `but it is not provided in this call.`);\n    tfc.util.assert(args.epochs != null && args.epochs > 0 && Number.isInteger(args.epochs), () => `For fitDataset(), config.epochs is expected to be a positive ` +\n        `integer, but got ${args.epochs}`);\n    tfc.util.assert(!hasBatchesPerEpoch ||\n        (args.batchesPerEpoch > 0 && Number.isInteger(args.batchesPerEpoch)), () => `For fitDataset(), config.batchesPerEpoch is expected to be a ` +\n        `positive integer if specified, but got ${args.batchesPerEpoch}`);\n    tfc.util.assert(\n    // tslint:disable-next-line:no-any\n    args['validationSplit'] == null, () => '`validationSplit` is not supported by `fitDataset()`. ' +\n        'Use validationData instead.');\n    if (model.isTraining) {\n        throw new Error('Cannot start training because another fit() call is ongoing.');\n    }\n    model.isTraining = true;\n    try {\n        const doValidation = args.validationData != null;\n        let valXs;\n        let valYs;\n        if (doValidation) {\n            if (isDatasetObject(args.validationData)) {\n                tfc.util.assert(args.validationBatches == null ||\n                    (args.validationBatches > 0 &&\n                        Number.isInteger(args.validationBatches)), () => `For fitDataset() with dataset-based validation, ` +\n                    `config.validationBatches is expected not to be provided, ` +\n                    `or to be a positive integer, ` +\n                    `but got ${args.validationBatches}`);\n            }\n            else {\n                const validationData = standardizeTensorValidationData(args.validationData);\n                valXs = validationData.xs;\n                valYs = validationData.ys;\n            }\n        }\n        const trainFunction = model.makeTrainFunction();\n        const outLabels = model.getDedupedMetricsNames();\n        let callbackMetrics;\n        if (doValidation) {\n            callbackMetrics =\n                outLabels.slice().concat(outLabels.map(n => 'val_' + n));\n        }\n        else {\n            callbackMetrics = outLabels.slice();\n        }\n        const callbacks = standardizeCallbacks(args.callbacks, args.yieldEvery);\n        const verbose = args.verbose == null ? 1 : args.verbose;\n        const { callbackList, history } = configureCallbacks(callbacks, verbose, args.epochs, null, null, getStepsPerEpoch(dataset, args), null, // Batch size determined by the dataset itself.\n        doValidation, callbackMetrics);\n        callbackList.setModel(model);\n        model.history = history;\n        await callbackList.onTrainBegin();\n        model.stopTraining_ = false;\n        let epoch = args.initialEpoch == null ? 0 : args.initialEpoch;\n        let dataIterator = await dataset.iterator();\n        while (epoch < args.epochs) {\n            const epochLogs = {};\n            await callbackList.onEpochBegin(epoch);\n            let stepsDone = 0;\n            let batchIndex = 0;\n            if (!hasBatchesPerEpoch) {\n                dataIterator = await dataset.iterator();\n            }\n            while (hasBatchesPerEpoch ? stepsDone < args.batchesPerEpoch : true) {\n                const iteratorOut = await dataIterator.next();\n                // If `batchesPerEpoch` is specified, the dataset should not be\n                // exhausted until all epoches are done.\n                if (hasBatchesPerEpoch && iteratorOut.done) {\n                    console.warn('You provided `batchesPerEpoch` as ' +\n                        `${args.batchesPerEpoch}, ` +\n                        'but your dataset iterator ran out of data after ' +\n                        `${stepsDone} batches; ` +\n                        'interrupting training. Make sure that your ' +\n                        'dataset can generate at least `batchesPerEpoch * epochs` ' +\n                        'batches (in this case, ' +\n                        `${args.batchesPerEpoch * args.epochs} batches). ` +\n                        'You may need to use the repeat() function when building ' +\n                        'your dataset.');\n                    break;\n                }\n                if (iteratorOut.value != null) {\n                    const { xs, ys } = standardizeDataIteratorOutput(model, iteratorOut.value);\n                    const batchLogs = {};\n                    batchLogs['batch'] = batchIndex;\n                    batchLogs['size'] = xs[0].shape[0];\n                    await callbackList.onBatchBegin(batchIndex, batchLogs);\n                    const sampleWeights = [];\n                    if (args.classWeight != null) {\n                        const standardClassWeights = standardizeClassWeights(args.classWeight, model.outputNames);\n                        for (let i = 0; i < standardClassWeights.length; ++i) {\n                            sampleWeights.push(await standardizeWeights(ys[i], null, standardClassWeights[i]));\n                        }\n                    }\n                    // Train on batch.\n                    const ins = xs.concat(ys).concat(sampleWeights);\n                    const outs = trainFunction(ins);\n                    tfc.dispose(ins);\n                    for (let i = 0; i < outLabels.length; ++i) {\n                        const label = outLabels[i];\n                        const out = outs[i];\n                        batchLogs[label] = out;\n                        tfc.keep(out);\n                    }\n                    await callbackList.onBatchEnd(batchIndex, batchLogs);\n                    disposeTensorsInLogs(batchLogs);\n                    batchIndex++;\n                    stepsDone++;\n                }\n                if (hasBatchesPerEpoch ? stepsDone >= args.batchesPerEpoch :\n                    iteratorOut.done) {\n                    // Epoch finished. Perform validation.\n                    if (doValidation) {\n                        let valOuts;\n                        if (isDatasetObject(args.validationData)) {\n                            valOuts = toList(await model.evaluateDataset(args.validationData, { batches: args.validationBatches }));\n                        }\n                        else {\n                            valOuts = toList(model.evaluate(valXs, valYs, {\n                                batchSize: args.validationBatchSize == null ?\n                                    DEFAULT_VALIDATION_BATCH_SIZE :\n                                    args.validationBatchSize,\n                                verbose: 0\n                            }));\n                        }\n                        for (let i = 0; i < model.metricsNames.length; ++i) {\n                            epochLogs[`val_${model.metricsNames[i]}`] = valOuts[i];\n                        }\n                    }\n                    // Call `break` to exit one epoch lopp after validation is done. If\n                    // config.batchesPerEpoch is specified, an epoch while loop will\n                    // stop when `stepsDone >= config.batchesPerEpoch`. When\n                    // config.batchesPerEpoch is not provided, the following `break` is\n                    // required to exit the while lopp after dataset is exhausted.\n                    break;\n                }\n                if (model.stopTraining_) {\n                    break;\n                }\n            }\n            await callbackList.onEpochEnd(epoch, epochLogs);\n            epoch++;\n            if (model.stopTraining_) {\n                break;\n            }\n        }\n        await callbackList.onTrainEnd();\n        await model.history.syncData();\n        return model.history;\n    }\n    finally {\n        model.isTraining = false;\n    }\n}\n/** Helper function that determines number of steps (batches) per epoch. */\nfunction getStepsPerEpoch(dataset, args) {\n    // Attempt to determine # of batches in an epoch.\n    let stepsPerEpoch = null;\n    if (args.batchesPerEpoch != null) {\n        stepsPerEpoch = args.batchesPerEpoch;\n    }\n    else if (Number.isFinite(dataset.size)) {\n        stepsPerEpoch = dataset.size;\n    }\n    return stepsPerEpoch;\n}\n// Check if provided object is a Dataset object by checking its .iterator\n// element.\nfunction isDatasetObject(dataset) {\n    return (typeof dataset.iterator === 'function');\n}\n// Check if provided object is a LazyIterator object by checking it's .next\n// element.\nfunction isLazyIteratorObject(iterator) {\n    return (typeof iterator.next === 'function');\n}\nexport async function evaluateDataset(\n// Type `model` as `any` here to avoid circular dependency w/\n// training.ts.\n// tslint:disable-next-line:no-any\nmodel, dataset, args) {\n    args = args || {};\n    const hasBatches = args.batches != null;\n    const f = model.testFunction;\n    let outs = [];\n    if (args.verbose > 0) {\n        throw new NotImplementedError('Verbose mode is not implemented yet.');\n    }\n    tfc.util.assert(!hasBatches || (args.batches > 0 && Number.isInteger(args.batches)), () => 'Test loop expects `batches` to be a positive integer, but ' +\n        `received ${JSON.stringify(args.batches)}`);\n    const dataIterator = isLazyIteratorObject(dataset) ?\n        dataset :\n        await dataset.iterator();\n    // Keeps track of number of examples used in this evaluation.\n    let numExamples = 0;\n    let batch = 0;\n    while (hasBatches ? batch < args.batches : true) {\n        const iteratorOut = await dataIterator.next();\n        outs = tfc.tidy(() => {\n            if (iteratorOut.value) {\n                // TODO(cais): Once real dataset is available, use\n                //   `map(x => standardizeDataIteratorOutput(model, x).map(f)`.\n                const { xs, ys } = standardizeDataIteratorOutput(model, iteratorOut.value);\n                const xsAndYs = xs.concat(ys);\n                const batchOuts = tfc.tidy(() => f(xsAndYs));\n                tfc.dispose(xsAndYs);\n                if (batch === 0) {\n                    for (let i = 0; i < batchOuts.length; ++i) {\n                        outs.push(scalar(0));\n                    }\n                }\n                const batchSize = xsAndYs[0].shape[0];\n                for (let i = 0; i < batchOuts.length; ++i) {\n                    const batchOut = batchOuts[i];\n                    const oldScalar = outs[i];\n                    outs[i] =\n                        tfc.tidy(() => tfc.add(outs[i], tfc.mul(batchSize, batchOut)));\n                    if (batch > 0) {\n                        tfc.dispose(oldScalar);\n                    }\n                }\n                tfc.dispose(batchOuts);\n                numExamples += batchSize;\n                ++batch;\n            }\n            return outs;\n        });\n        if (iteratorOut.done) {\n            if (hasBatches) {\n                console.warn('Your dataset iterator ran out of data during evaluateDataset(). ' +\n                    'Interrupting evalution. Make sure that your ' +\n                    'dataset can generate at least `batches` ' +\n                    `batches (in this case, ${args.batches} batches). ` +\n                    'You may need to use the repeat() function when building ' +\n                    'your dataset.');\n            }\n            break;\n        }\n    }\n    for (let i = 0; i < outs.length; ++i) {\n        const oldScalar = outs[i];\n        outs[i] = tfc.div(outs[i], numExamples);\n        tfc.dispose(oldScalar);\n    }\n    return singletonOrArray(outs);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmdfZGF0YXNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9lbmdpbmUvdHJhaW5pbmdfZGF0YXNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFlLGtCQUFrQixFQUFzRCxvQkFBb0IsRUFBb0IsTUFBTSxtQkFBbUIsQ0FBQztBQUNoSyxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFELE9BQU8sRUFBQyxvQkFBb0IsRUFBaUIsTUFBTSxTQUFTLENBQUM7QUFFN0QsT0FBTyxFQUFDLGdCQUFnQixFQUFFLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBR2hFLE9BQU8sRUFBOEIsdUJBQXVCLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQWlLMUcsMERBQTBEO0FBQzFELE1BQU0sNkJBQTZCLEdBQUcsRUFBRSxDQUFDO0FBRXpDOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxTQUFTLDZCQUE2QjtBQUNsQyw2REFBNkQ7QUFDN0QsZUFBZTtBQUNmLGtDQUFrQztBQUNsQyxLQUFVLEVBQUUsV0FBZTtJQUM3QixJQUFJLEVBQXNCLENBQUM7SUFDM0IsSUFBSSxFQUFzQixDQUFDO0lBRTNCLE1BQU0sY0FBYyxHQUFHLFdBQWdDLENBQUM7SUFDeEQsRUFBRSxHQUFHLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixFQUFFLEdBQUcsY0FBYyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUNYLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxJQUFJ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YixHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO3FCQUN4QjtpQkFDRjtnQkFDRCxHQUFHLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN2QixXQUFXLElBQUksU0FBUyxDQUFDO2dCQUV6QixFQUFFLEtBQUssQ0FBQzthQUNUO1lBQ0QsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLENBQUMsQ0FBQztRQUVILElBQUksV0FBVyxDQUFDLElBQUksRUFBRTtZQUNwQixJQUFJLFVBQVUsRUFBRTtnQkFDZCxPQUFPLENBQUMsSUFBSSxDQUNSLGtFQUFrRTtvQkFDbEUsOENBQThDO29CQUM5QywwQ0FBMEM7b0JBQzFDLDBCQUEwQixJQUFJLENBQUMsT0FBTyxhQUFhO29CQUNuRCwwREFBMEQ7b0JBQzFELGVBQWUsQ0FBQyxDQUFDO2FBQ3RCO1lBQ0QsTUFBTTtTQUNQO0tBQ0Y7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ3hDLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDeEI7SUFFRCxPQUFPLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIEludGVyZmFjZXMgYW5kIG1ldGhvZHMgZm9yIHRyYWluaW5nIG1vZGVscyB1c2luZyBUZW5zb3JGbG93LmpzIGRhdGFzZXRzLlxuICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtzY2FsYXJ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0Jhc2VDYWxsYmFjaywgY29uZmlndXJlQ2FsbGJhY2tzLCBDdXN0b21DYWxsYmFja0FyZ3MsIEhpc3RvcnksIE1vZGVsTG9nZ2luZ1ZlcmJvc2l0eSwgc3RhbmRhcmRpemVDYWxsYmFja3MsIFlpZWxkRXZlcnlPcHRpb25zfSBmcm9tICcuLi9iYXNlX2NhbGxiYWNrcyc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2Rpc3Bvc2VUZW5zb3JzSW5Mb2dzLCBVbnJlc29sdmVkTG9nc30gZnJvbSAnLi4vbG9ncyc7XG5pbXBvcnQge1RlbnNvck9yQXJyYXlPck1hcH0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtzaW5nbGV0b25PckFycmF5LCB0b0xpc3R9IGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuXG5pbXBvcnQge0RhdGFzZXQsIExhenlJdGVyYXRvcn0gZnJvbSAnLi9kYXRhc2V0X3N0dWInO1xuaW1wb3J0IHtDbGFzc1dlaWdodCwgQ2xhc3NXZWlnaHRNYXAsIHN0YW5kYXJkaXplQ2xhc3NXZWlnaHRzLCBzdGFuZGFyZGl6ZVdlaWdodHN9IGZyb20gJy4vdHJhaW5pbmdfdXRpbHMnO1xuXG4vKipcbiAqIEludGVyZmFjZSBmb3IgY29uZmlndXJpbmcgbW9kZWwgdHJhaW5pbmcgYmFzZWQgb24gYSBkYXRhc2V0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEZpdERhdGFzZXRBcmdzPFQ+IHtcbiAgLyoqXG4gICAqIChPcHRpb25hbCkgVG90YWwgbnVtYmVyIG9mIHN0ZXBzIChiYXRjaGVzIG9mIHNhbXBsZXMpIGJlZm9yZVxuICAgKiBkZWNsYXJpbmcgb25lIGVwb2NoIGZpbmlzaGVkIGFuZCBzdGFydGluZyB0aGUgbmV4dCBlcG9jaC4gSXQgc2hvdWxkXG4gICAqIHR5cGljYWxseSBiZSBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb2YgeW91ciBkYXRhc2V0IGRpdmlkZWQgYnlcbiAgICogdGhlIGJhdGNoIHNpemUsIHNvIHRoYXQgYGZpdERhdGFzZXRgKCkgY2FsbCBjYW4gdXRpbGl6ZSB0aGUgZW50aXJlIGRhdGFzZXQuXG4gICAqIElmIGl0IGlzIG5vdCBwcm92aWRlZCwgdXNlIGBkb25lYCByZXR1cm4gdmFsdWUgaW4gYGl0ZXJhdG9yLm5leHQoKWAgYXNcbiAgICogc2lnbmFsIHRvIGZpbmlzaCBhbiBlcG9jaC5cbiAgICovXG4gIGJhdGNoZXNQZXJFcG9jaD86IG51bWJlcjtcblxuICAvKipcbiAgICogSW50ZWdlciBudW1iZXIgb2YgdGltZXMgdG8gaXRlcmF0ZSBvdmVyIHRoZSB0cmFpbmluZyBkYXRhc2V0LlxuICAgKi9cbiAgZXBvY2hzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFZlcmJvc2l0eSBsZXZlbC5cbiAgICpcbiAgICogRXhwZWN0ZWQgdG8gYmUgMCwgMSwgb3IgMi4gRGVmYXVsdDogMS5cbiAgICpcbiAgICogMCAtIE5vIHByaW50ZWQgbWVzc2FnZSBkdXJpbmcgZml0KCkgY2FsbC5cbiAgICogMSAtIEluIE5vZGUuanMgKHRmanMtbm9kZSksIHByaW50cyB0aGUgcHJvZ3Jlc3MgYmFyLCB0b2dldGhlciB3aXRoXG4gICAqICAgICByZWFsLXRpbWUgdXBkYXRlcyBvZiBsb3NzIGFuZCBtZXRyaWMgdmFsdWVzIGFuZCB0cmFpbmluZyBzcGVlZC5cbiAgICogICAgIEluIHRoZSBicm93c2VyOiBubyBhY3Rpb24uIFRoaXMgaXMgdGhlIGRlZmF1bHQuXG4gICAqIDIgLSBOb3QgaW1wbGVtZW50ZWQgeWV0LlxuICAgKi9cbiAgdmVyYm9zZT86IE1vZGVsTG9nZ2luZ1ZlcmJvc2l0eTtcblxuICAvKipcbiAgICogTGlzdCBvZiBjYWxsYmFja3MgdG8gYmUgY2FsbGVkIGR1cmluZyB0cmFpbmluZy5cbiAgICogQ2FuIGhhdmUgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZyBjYWxsYmFja3M6XG4gICAqICAgLSBgb25UcmFpbkJlZ2luKGxvZ3MpYDogY2FsbGVkIHdoZW4gdHJhaW5pbmcgc3RhcnRzLlxuICAgKiAgIC0gYG9uVHJhaW5FbmQobG9ncylgOiBjYWxsZWQgd2hlbiB0cmFpbmluZyBlbmRzLlxuICAgKiAgIC0gYG9uRXBvY2hCZWdpbihlcG9jaCwgbG9ncylgOiBjYWxsZWQgYXQgdGhlIHN0YXJ0IG9mIGV2ZXJ5IGVwb2NoLlxuICAgKiAgIC0gYG9uRXBvY2hFbmQoZXBvY2gsIGxvZ3MpYDogY2FsbGVkIGF0IHRoZSBlbmQgb2YgZXZlcnkgZXBvY2guXG4gICAqICAgLSBgb25CYXRjaEJlZ2luKGJhdGNoLCBsb2dzKWA6IGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgYmF0Y2guXG4gICAqICAgLSBgb25CYXRjaEVuZChiYXRjaCwgbG9ncylgOiBjYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBiYXRjaC5cbiAgICogICAtIGBvbllpZWxkKGVwb2NoLCBiYXRjaCwgbG9ncylgOiBjYWxsZWQgZXZlcnkgYHlpZWxkRXZlcnlgIG1pbGxpc2Vjb25kc1xuICAgKiAgICAgIHdpdGggdGhlIGN1cnJlbnQgZXBvY2gsIGJhdGNoIGFuZCBsb2dzLiBUaGUgbG9ncyBhcmUgdGhlIHNhbWVcbiAgICogICAgICBhcyBpbiBgb25CYXRjaEVuZCgpYC4gTm90ZSB0aGF0IGBvbllpZWxkYCBjYW4gc2tpcCBiYXRjaGVzIG9yXG4gICAqICAgICAgZXBvY2hzLiBTZWUgYWxzbyBkb2NzIGZvciBgeWllbGRFdmVyeWAgYmVsb3cuXG4gICAqL1xuICBjYWxsYmFja3M/OiBCYXNlQ2FsbGJhY2tbXXxDdXN0b21DYWxsYmFja0FyZ3N8Q3VzdG9tQ2FsbGJhY2tBcmdzW107XG5cbiAgLyoqXG4gICAqIERhdGEgb24gd2hpY2ggdG8gZXZhbHVhdGUgdGhlIGxvc3MgYW5kIGFueSBtb2RlbFxuICAgKiBtZXRyaWNzIGF0IHRoZSBlbmQgb2YgZWFjaCBlcG9jaC4gVGhlIG1vZGVsIHdpbGwgbm90IGJlIHRyYWluZWQgb24gdGhpc1xuICAgKiBkYXRhLiBUaGlzIGNvdWxkIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOlxuICAgKlxuICAgKiAgIC0gQW4gYXJyYXkgYFt4VmFsLCB5VmFsXWAsIHdoZXJlIHRoZSB0d28gdmFsdWVzIG1heSBiZSBgdGYuVGVuc29yYCxcbiAgICogICAgIGFuIGFycmF5IG9mIFRlbnNvcnMsIG9yIGEgbWFwIG9mIHN0cmluZyB0byBUZW5zb3IuXG4gICAqICAgLSBTaW1pbGFybHksIGFuIGFycmF5IGAgW3hWYWwsIHlWYWwsIHZhbFNhbXBsZVdlaWdodHNdYFxuICAgKiAgICAgKG5vdCBpbXBsZW1lbnRlZCB5ZXQpLlxuICAgKiAgIC0gYSBgRGF0YXNldGAgb2JqZWN0IHdpdGggZWxlbWVudHMgb2YgdGhlIGZvcm0gYHt4czogeFZhbCwgeXM6IHlWYWx9YCxcbiAgICogICAgIHdoZXJlIGB4c2AgYW5kIGB5c2AgYXJlIHRoZSBmZWF0dXJlIGFuZCBsYWJlbCB0ZW5zb3JzLCByZXNwZWN0aXZlbHkuXG4gICAqXG4gICAqIElmIGB2YWxpZGF0aW9uRGF0YWAgaXMgYW4gQXJyYXkgb2YgVGVuc29yIG9iamVjdHMsIGVhY2ggYHRmLlRlbnNvcmAgd2lsbCBiZVxuICAgKiBzbGljZWQgaW50byBiYXRjaGVzIGR1cmluZyB2YWxpZGF0aW9uLCB1c2luZyB0aGUgcGFyYW1ldGVyXG4gICAqIGB2YWxpZGF0aW9uQmF0Y2hTaXplYCAod2hpY2ggZGVmYXVsdHMgdG8gMzIpLiBUaGUgZW50aXJldHkgb2YgdGhlXG4gICAqIGB0Zi5UZW5zb3JgIG9iamVjdHMgd2lsbCBiZSB1c2VkIGluIHRoZSB2YWxpZGF0aW9uLlxuICAgKlxuICAgKiBJZiBgdmFsaWRhdGlvbkRhdGFgIGlzIGEgZGF0YXNldCBvYmplY3QsIGFuZCB0aGUgYHZhbGlkYXRpb25CYXRjaGVzYFxuICAgKiBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgdmFsaWRhdGlvbiB3aWxsIHVzZSBgdmFsaWRhdGlvbkJhdGNoZXNgIGJhdGNoZXNcbiAgICogZHJhd24gZnJvbSB0aGUgZGF0YXNldCBvYmplY3QuIElmIGB2YWxpZGF0aW9uQmF0Y2hlc2AgcGFyYW1ldGVyIGlzIG5vdFxuICAgKiBzcGVjaWZpZWQsIHRoZSB2YWxpZGF0aW9uIHdpbGwgc3RvcCB3aGVuIHRoZSBkYXRhc2V0IGlzIGV4aGF1c3RlZC5cbiAgICpcbiAgICogVGhlIG1vZGVsIHdpbGwgbm90IGJlIHRyYWluZWQgb24gdGhpcyBkYXRhLlxuICAgKi9cbiAgdmFsaWRhdGlvbkRhdGE/OiBbXG4gICAgVGVuc29yT3JBcnJheU9yTWFwLCBUZW5zb3JPckFycmF5T3JNYXBcbiAgXXxbVGVuc29yT3JBcnJheU9yTWFwLCBUZW5zb3JPckFycmF5T3JNYXAsIFRlbnNvck9yQXJyYXlPck1hcF18RGF0YXNldDxUPjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgYmF0Y2ggc2l6ZSBmb3IgdmFsaWRhdGlvbi5cbiAgICpcbiAgICogVXNlZCBvbmx5IGlmIGB2YWxpZGF0aW9uRGF0YWAgaXMgYW4gYXJyYXkgb2YgYHRmLlRlbnNvcmAgb2JqZWN0cywgaS5lLiwgbm90XG4gICAqIGEgZGF0YXNldCBvYmplY3QuXG4gICAqXG4gICAqIElmIG5vdCBzcGVjaWZpZWQsIGl0cyB2YWx1ZSBkZWZhdWx0cyB0byAzMi5cbiAgICovXG4gIHZhbGlkYXRpb25CYXRjaFNpemU/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIChPcHRpb25hbCkgT25seSByZWxldmFudCBpZiBgdmFsaWRhdGlvbkRhdGFgIGlzIHNwZWNpZmllZCBhbmQgaXMgYSBkYXRhc2V0XG4gICAqIG9iamVjdC5cbiAgICpcbiAgICogVG90YWwgbnVtYmVyIG9mIGJhdGNoZXMgb2Ygc2FtcGxlcyB0byBkcmF3IGZyb20gYHZhbGlkYXRpb25EYXRhYCBmb3JcbiAgICogdmFsaWRhdGlvbiBwdXJwb3NlIGJlZm9yZSBzdG9wcGluZyBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGVwb2NoLiBJZiBub3RcbiAgICogc3BlY2lmaWVkLCBgZXZhbHVhdGVEYXRhc2V0YCB3aWxsIHVzZSBgaXRlcmF0b3IubmV4dCgpLmRvbmVgIGFzIHNpZ25hbCB0b1xuICAgKiBzdG9wIHZhbGlkYXRpb24uXG4gICAqL1xuICB2YWxpZGF0aW9uQmF0Y2hlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogQ29uZmlndXJlcyB0aGUgZnJlcXVlbmN5IG9mIHlpZWxkaW5nIHRoZSBtYWluIHRocmVhZCB0byBvdGhlciB0YXNrcy5cbiAgICpcbiAgICogSW4gdGhlIGJyb3dzZXIgZW52aXJvbm1lbnQsIHlpZWxkaW5nIHRoZSBtYWluIHRocmVhZCBjYW4gaW1wcm92ZSB0aGVcbiAgICogcmVzcG9uc2l2ZW5lc3Mgb2YgdGhlIHBhZ2UgZHVyaW5nIHRyYWluaW5nLiBJbiB0aGUgTm9kZS5qcyBlbnZpcm9ubWVudCxcbiAgICogaXQgY2FuIGVuc3VyZSB0YXNrcyBxdWV1ZWQgaW4gdGhlIGV2ZW50IGxvb3AgY2FuIGJlIGhhbmRsZWQgaW4gYSB0aW1lbHlcbiAgICogbWFubmVyLlxuICAgKlxuICAgKiBUaGUgdmFsdWUgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICAgKiAgIC0gYCdhdXRvJ2A6IFRoZSB5aWVsZGluZyBoYXBwZW5zIGF0IGEgY2VydGFpbiBmcmFtZSByYXRlIChjdXJyZW50bHkgc2V0XG4gICAqICAgICAgICAgICAgICAgYXQgMTI1bXMpLiBUaGlzIGlzIHRoZSBkZWZhdWx0LlxuICAgKiAgIC0gYCdiYXRjaCdgOiB5aWVsZCBldmVyeSBiYXRjaC5cbiAgICogICAtIGAnZXBvY2gnYDogeWllbGQgZXZlcnkgZXBvY2guXG4gICAqICAgLSBhIGBudW1iZXJgOiBXaWxsIHlpZWxkIGV2ZXJ5IGBudW1iZXJgIG1pbGxpc2Vjb25kcy5cbiAgICogICAtIGAnbmV2ZXInYDogbmV2ZXIgeWllbGQuIChCdXQgeWllbGRpbmcgY2FuIHN0aWxsIGhhcHBlbiB0aHJvdWdoIGBhd2FpdFxuICAgKiAgICAgIG5leHRGcmFtZSgpYCBjYWxscyBpbiBjdXN0b20gY2FsbGJhY2tzLilcbiAgICovXG4gIHlpZWxkRXZlcnk/OiBZaWVsZEV2ZXJ5T3B0aW9ucztcblxuICAvKipcbiAgICogRXBvY2ggYXQgd2hpY2ggdG8gc3RhcnQgdHJhaW5pbmcgKHVzZWZ1bCBmb3IgcmVzdW1pbmcgYSBwcmV2aW91cyB0cmFpbmluZ1xuICAgKiBydW4pLiBXaGVuIHRoaXMgaXMgdXNlZCwgYGVwb2Noc2AgaXMgdGhlIGluZGV4IG9mIHRoZSBcImZpbmFsIGVwb2NoXCIuXG4gICAqIFRoZSBtb2RlbCBpcyBub3QgdHJhaW5lZCBmb3IgYSBudW1iZXIgb2YgaXRlcmF0aW9ucyBnaXZlbiBieSBgZXBvY2hzYCxcbiAgICogYnV0IG1lcmVseSB1bnRpbCB0aGUgZXBvY2ggb2YgaW5kZXggYGVwb2Noc2AgaXMgcmVhY2hlZC5cbiAgICovXG4gIGluaXRpYWxFcG9jaD86IG51bWJlcjtcblxuICAvKipcbiAgICogT3B0aW9uYWwgb2JqZWN0IG1hcHBpbmcgY2xhc3MgaW5kaWNlcyAoaW50ZWdlcnMpIHRvXG4gICAqIGEgd2VpZ2h0IChmbG9hdCkgdG8gYXBwbHkgdG8gdGhlIG1vZGVsJ3MgbG9zcyBmb3IgdGhlIHNhbXBsZXMgZnJvbSB0aGlzXG4gICAqIGNsYXNzIGR1cmluZyB0cmFpbmluZy4gVGhpcyBjYW4gYmUgdXNlZnVsIHRvIHRlbGwgdGhlIG1vZGVsIHRvIFwicGF5IG1vcmVcbiAgICogYXR0ZW50aW9uXCIgdG8gc2FtcGxlcyBmcm9tIGFuIHVuZGVyLXJlcHJlc2VudGVkIGNsYXNzLlxuICAgKlxuICAgKiBJZiB0aGUgbW9kZWwgaGFzIG11bHRpcGxlIG91dHB1dHMsIGEgY2xhc3Mgd2VpZ2h0IGNhbiBiZSBzcGVjaWZpZWQgZm9yXG4gICAqIGVhY2ggb2YgdGhlIG91dHB1dHMgYnkgc2V0dGluZyB0aGlzIGZpZWxkIGFuIGFycmF5IG9mIHdlaWdodCBvYmplY3RcbiAgICogb3IgYW4gb2JqZWN0IHRoYXQgbWFwcyBtb2RlbCBvdXRwdXQgbmFtZXMgKGUuZy4sIGBtb2RlbC5vdXRwdXROYW1lc1swXWApXG4gICAqIHRvIHdlaWdodCBvYmplY3RzLlxuICAgKi9cbiAgY2xhc3NXZWlnaHQ/OiBDbGFzc1dlaWdodHxDbGFzc1dlaWdodFtdfENsYXNzV2VpZ2h0TWFwO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEZpdERhdGFzZXRFbGVtZW50IHtcbiAgeHM6IFRlbnNvck9yQXJyYXlPck1hcDtcbiAgeXM6IFRlbnNvck9yQXJyYXlPck1hcDtcbn1cblxuLyoqXG4gKiBJbnRlcmZhY2UgZm9yIGNvbmZpZ3VyaW5nIG1vZGVsIGV2YWx1YXRpb24gYmFzZWQgb24gYSBkYXRhc2V0IG9iamVjdC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEV2YWx1YXRlRGF0YXNldEFyZ3Mge1xuICAvKipcbiAgICogTnVtYmVyIG9mIGJhdGNoZXMgdG8gZHJhdyBmcm9tIHRoZSBkYXRhc2V0IG9iamVjdCBiZWZvcmUgZW5kaW5nIHRoZVxuICAgKiBldmFsdWF0aW9uLlxuICAgKi9cbiAgYmF0Y2hlcz86IG51bWJlcjtcblxuICAvKipcbiAgICogVmVyYm9zaXR5IG1vZGUuXG4gICAqL1xuICB2ZXJib3NlPzogTW9kZWxMb2dnaW5nVmVyYm9zaXR5O1xufVxuXG4vLyBEZWZhdWx0IGJhdGNoIHNpemUgdXNlZCBkdXJpbmcgdGVuc29yLWJhc2VkIHZhbGlkYXRpb24uXG5jb25zdCBERUZBVUxUX1ZBTElEQVRJT05fQkFUQ0hfU0laRSA9IDMyO1xuXG4vKipcbiAqIFN0YW5kYXJkaXplIHRoZSBvdXRwdXQgb2YgYSBkYXRhc2V0IGl0ZXJhdG9yIGZvciB1c2UgYnlcbiAqIExheWVyc01vZGVsLmZpdERhdGFzZXQoKS5cbiAqXG4gKiBAcGFyYW0gbW9kZWw6IEEgYHRmLkxheWVyc01vZGVsYCBvYmplY3QuXG4gKiBAcGFyYW0gaXRlcmF0b3JPdXQgVGhlIG91dHB1dCBvZiBhIGRhdGFzZXQgaXRlcmF0b3IuIEl0IGlzIHJlcXVpcmVkIHRvIGJlXG4gKiAgIGFuIG9iamVjdCBvZiB0aGUgZm9ybSBge3hzOiBUZW5zb3JPckFycmF5T3JNYXAsIHlzOlxuICogVGVuc29yT3JBcnJheU9yTWFwfWAsIHdoZXJlIGBUZW5zb3JPckFycmF5T3JNYXBgIGlzIGEgc2luZ2xlIGB0Zi5UZW5zb3JgLFxuICogYSBgdGYuVGVuc29yW11gLCBvciBhIGZsYXQgbWFwIGZyb20gc3RyaW5nIG5hbWVzIHRvIGB0Zi5UZW5zb3Jgcy5cbiAqIEByZXR1cm5zIEEgZmxhdCBhcnJheSBvZiBgdGYuVGVuc29yYCBvYmplY3RzOiB0aGUgaW5wdXQgYHRmLlRlbnNvcmBzXG4gKiAgIGZvbGxvd2VkIGJ5IHRoZSB0YXJnZXQgYHRmLlRlbnNvcmBzLiAgV2hlbiBgdGYuVGVuc29yYHMgYXJlIHByb3ZpZGVkXG4gKiAgIGFzIGEgbWFwLCB0aGUgb3JkZXIgaW4gdGhlIHJlc3VsdGluZyBhcnJheSBpcyB0YWtlbiBmcm9tIHRoZSBgaW5wdXROYW1lc2BcbiAqICAgYW5kIGBvdXRwdXROYW1lc2Agb2YgdGhlIG1vZGVsLlxuICovXG5mdW5jdGlvbiBzdGFuZGFyZGl6ZURhdGFJdGVyYXRvck91dHB1dChcbiAgICAvLyBUeXBlIGBtb2RlbGAgYXMgYGFueWAgaGVyZSB0byBhdm9pZCBjaXJjdWxhciBkZXBlbmRlbmN5IHcvXG4gICAgLy8gdHJhaW5pbmcudHMuXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIG1vZGVsOiBhbnksIGl0ZXJhdG9yT3V0OiB7fSk6IHt4czogdGZjLlRlbnNvcltdLCB5czogdGZjLlRlbnNvcltdfSB7XG4gIGxldCB4czogVGVuc29yT3JBcnJheU9yTWFwO1xuICBsZXQgeXM6IFRlbnNvck9yQXJyYXlPck1hcDtcblxuICBjb25zdCBpdGVyYXRvck91dE9iaiA9IGl0ZXJhdG9yT3V0IGFzIEZpdERhdGFzZXRFbGVtZW50O1xuICB4cyA9IGl0ZXJhdG9yT3V0T2JqWyd4cyddO1xuICB5cyA9IGl0ZXJhdG9yT3V0T2JqWyd5cyddO1xuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICB4cyAhPSBudWxsICYmIHlzICE9IG51bGwsXG4gICAgICAoKSA9PiAnQSBEYXRhc2V0IGl0ZXJhdG9yIGZvciBmaXREYXRhc2V0KCkgaXMgZXhwZWN0ZWQgdG8gZ2VuZXJhdGUgJyArXG4gICAgICAgICAgJ29iamVjdHMgb2YgdGhlIGZvcm0gYHt4czogeFZhbCwgeXM6IHlWYWx9YCwgd2hlcmUgdGhlIHR3byAnICtcbiAgICAgICAgICAndmFsdWVzIG1heSBiZSBgdGYuVGVuc29yYCwgYW4gYXJyYXkgb2YgVGVuc29ycywgb3IgYSBtYXAgb2YgJyArXG4gICAgICAgICAgJ3N0cmluZyB0byBUZW5zb3IuICBUaGUgcHJvdmlkZWQgRGF0YXNldCBpbnN0ZWFkIGdlbmVyYXRlcyAnICtcbiAgICAgICAgICBgJHtpdGVyYXRvck91dH1gKTtcblxuICBjb25zdCBmbGF0dGVuZWRYczogdGZjLlRlbnNvcltdID1cbiAgICAgIGZsYXR0ZW5UZW5zb3JPckFycmF5T3JNYXAoJ2lucHV0JywgbW9kZWwuaW5wdXROYW1lcywgeHMpO1xuICBjb25zdCBmbGF0dGVuZWRZczogdGZjLlRlbnNvcltdID1cbiAgICAgIGZsYXR0ZW5UZW5zb3JPckFycmF5T3JNYXAoJ291dHB1dCcsIG1vZGVsLm91dHB1dE5hbWVzLCB5cyk7XG5cbiAgY29uc3QgYmF0Y2hTaXplOiBudW1iZXIgPSBmbGF0dGVuZWRYc1swXS5zaGFwZVswXTtcblxuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICBmbGF0dGVuZWRYcy5sZW5ndGggPT09IG1vZGVsLmlucHV0cy5sZW5ndGgsXG4gICAgICAoKSA9PiBgTGF5ZXJzTW9kZWwgaGFzICR7bW9kZWwuaW5wdXRzLmxlbmd0aH0gaW5wdXRzLCBidXQgdGhlIGRhdGFzZXQgYCArXG4gICAgICAgICAgYHByb3ZpZGVzICR7ZmxhdHRlbmVkWHMubGVuZ3RofSBpbnB1dHMuICAoRXhwZWN0ZWQgaW5wdXQga2V5czogYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobW9kZWwuaW5wdXROYW1lcyl9KWApO1xuXG4gIHRmYy51dGlsLmFzc2VydChcbiAgICAgIGZsYXR0ZW5lZFlzLmxlbmd0aCA9PT0gbW9kZWwub3V0cHV0cy5sZW5ndGgsXG4gICAgICAoKSA9PlxuICAgICAgICAgIGBMYXllcnNNb2RlbCBoYXMgJHttb2RlbC5vdXRwdXRzLmxlbmd0aH0gb3V0cHV0cywgYnV0IHRoZSBkYXRhc2V0IGAgK1xuICAgICAgICAgIGBwcm92aWRlcyAke2ZsYXR0ZW5lZFlzLmxlbmd0aH0gb3V0cHV0cy4gIChFeHBlY3RlZCBvdXRwdXQga2V5czogYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkobW9kZWwub3V0cHV0TmFtZXMpfSlgKTtcblxuICBmb3IgKGxldCB4SW5kZXggPSAwOyB4SW5kZXggPCBmbGF0dGVuZWRYcy5sZW5ndGg7IHhJbmRleCsrKSB7XG4gICAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgICBmbGF0dGVuZWRYc1t4SW5kZXhdLnNoYXBlWzBdID09PSBiYXRjaFNpemUsXG4gICAgICAgICgpID0+IGBCYXRjaCBzaXplIG1pc21hdGNoOiBpbnB1dCBgICtcbiAgICAgICAgICAgIGAke21vZGVsLmlucHV0TmFtZXNbeEluZGV4XX0gaGFzICR7XG4gICAgICAgICAgICAgICAgICBmbGF0dGVuZWRYc1t4SW5kZXhdLnNoYXBlWzBdfTsgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQgICR7YmF0Y2hTaXplfSBiYXNlZCBvbiBpbnB1dCAke21vZGVsLmlucHV0TmFtZXNbMF19LmApO1xuICB9XG5cbiAgZm9yIChsZXQgeUluZGV4ID0gMDsgeUluZGV4IDwgZmxhdHRlbmVkWXMubGVuZ3RoOyB5SW5kZXgrKykge1xuICAgIHRmYy51dGlsLmFzc2VydChcbiAgICAgICAgZmxhdHRlbmVkWXNbeUluZGV4XS5zaGFwZVswXSA9PT0gYmF0Y2hTaXplLFxuICAgICAgICAoKSA9PiBgQmF0Y2ggc2l6ZSBtaXNtYXRjaDogb3V0cHV0IGAgK1xuICAgICAgICAgICAgYCR7bW9kZWwub3V0cHV0TmFtZXNbeUluZGV4XX0gaGFzICR7XG4gICAgICAgICAgICAgICAgICBmbGF0dGVuZWRZc1t5SW5kZXhdLnNoYXBlWzBdfTsgYCArXG4gICAgICAgICAgICBgZXhwZWN0ZWQgICR7YmF0Y2hTaXplfSBiYXNlZCBvbiBpbnB1dCAke21vZGVsLmlucHV0TmFtZXNbMF19LmApO1xuICB9XG5cbiAgcmV0dXJuIHt4czogZmxhdHRlbmVkWHMsIHlzOiBmbGF0dGVuZWRZc307XG59XG5cbmZ1bmN0aW9uIGZsYXR0ZW5UZW5zb3JPckFycmF5T3JNYXAoXG4gICAgaW5wdXRPck91dHB1dDogc3RyaW5nLCBuYW1lczogc3RyaW5nW10sIHZhbHVlczogVGVuc29yT3JBcnJheU9yTWFwKSB7XG4gIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiB0ZmMuVGVuc29yKSB7XG4gICAgcmV0dXJuIFt2YWx1ZXNdO1xuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWVzKSkge1xuICAgIHRmYy51dGlsLmFzc2VydChcbiAgICAgICAgdmFsdWVzLmxlbmd0aCA9PT0gbmFtZXMubGVuZ3RoLFxuICAgICAgICAoKSA9PiBgUmVjZWl2ZWQgYW4gYXJyYXkgb2YgJHt2YWx1ZXMubGVuZ3RofSBUZW5zb3JzLCBidXQgZXhwZWN0ZWQgJHtcbiAgICAgICAgICAgIG5hbWVzLmxlbmd0aH0gdG8gbWF0Y2ggdGhlICR7aW5wdXRPck91dHB1dH0ga2V5cyAke25hbWVzfS5gKTtcbiAgICByZXR1cm4gdmFsdWVzO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHJlc3VsdDogdGZjLlRlbnNvcltdID0gW107XG4gICAgLy8gQ2hlY2sgdGhhdCBhbGwgdGhlIHJlcXVpcmVkIGtleXMgYXJlIGF2YWlsYWJsZS5cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGlmICh2YWx1ZXNbbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBUaGUgZmVhdHVyZSBkYXRhIGdlbmVyYXRlZCBieSB0aGUgZGF0YXNldCBsYWNrcyB0aGUgcmVxdWlyZWQgYCArXG4gICAgICAgICAgICBgJHtpbnB1dE9yT3V0cHV0fSBrZXkgJyR7bmFtZX0nLmApO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2godmFsdWVzW25hbWVdKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG5mdW5jdGlvbiBzdGFuZGFyZGl6ZVRlbnNvclZhbGlkYXRpb25EYXRhPFQ+KFxuICAgIGRhdGE6XG4gICAgICAgIFtcbiAgICAgICAgICB0ZmMuVGVuc29yfHRmYy5UZW5zb3JbXSwgdGZjLlRlbnNvcnx0ZmMuVGVuc29yW11cbiAgICAgICAgXXxbdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXSwgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXSxcbiAgICAgICAgICAgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXV0pOlxuICAgIHt4czogdGZjLlRlbnNvcnx0ZmMuVGVuc29yW10sIHlzOiB0ZmMuVGVuc29yfHRmYy5UZW5zb3JbXX0ge1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDMpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgJ1ZhbGlkYXRpb24gd2l0aCBzYW1wbGUgd2VpZ2h0cyBpcyBub3QgaW1wbGVtZW50ZWQgeWV0LicpO1xuICB9XG4gIHJldHVybiB7eHM6IGRhdGFbMF0sIHlzOiBkYXRhWzFdfTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpdERhdGFzZXQ8VD4oXG4gICAgLy8gVHlwZSBgbW9kZWxgIGFzIGBhbnlgIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3L1xuICAgIC8vIHRyYWluaW5nLnRzLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBtb2RlbDogYW55LCBkYXRhc2V0OiBEYXRhc2V0PFQ+LFxuICAgIGFyZ3M6IE1vZGVsRml0RGF0YXNldEFyZ3M8VD4pOiBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgY29uc3QgaGFzQmF0Y2hlc1BlckVwb2NoID0gYXJncy5iYXRjaGVzUGVyRXBvY2ggIT0gbnVsbDtcbiAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgbW9kZWwub3B0aW1pemVyICE9IG51bGwsXG4gICAgICAoKSA9PiAnWW91IG11c3QgY29tcGlsZSBhIG1vZGVsIGJlZm9yZSB0cmFpbmluZy90ZXN0aW5nLiBVc2UgJyArXG4gICAgICAgICAgJ0xheWVyc01vZGVsLmNvbXBpbGUobW9kZWxDb21waWxlQ29uZmlnKS4nKTtcblxuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICBhcmdzICE9IG51bGwsXG4gICAgICAoKSA9PiBgRm9yIGZpdERhdGFzZXQoKSwgdGhlIDJuZCBhcmd1bWVudCAoY29uZmlnKSBpcyByZXF1aXJlZCwgYCArXG4gICAgICAgICAgYGJ1dCBpdCBpcyBub3QgcHJvdmlkZWQgaW4gdGhpcyBjYWxsLmApO1xuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICBhcmdzLmVwb2NocyAhPSBudWxsICYmIGFyZ3MuZXBvY2hzID4gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGFyZ3MuZXBvY2hzKSxcbiAgICAgICgpID0+IGBGb3IgZml0RGF0YXNldCgpLCBjb25maWcuZXBvY2hzIGlzIGV4cGVjdGVkIHRvIGJlIGEgcG9zaXRpdmUgYCArXG4gICAgICAgICAgYGludGVnZXIsIGJ1dCBnb3QgJHthcmdzLmVwb2Noc31gKTtcbiAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgIWhhc0JhdGNoZXNQZXJFcG9jaCB8fFxuICAgICAgICAgIChhcmdzLmJhdGNoZXNQZXJFcG9jaCA+IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihhcmdzLmJhdGNoZXNQZXJFcG9jaCkpLFxuICAgICAgKCkgPT4gYEZvciBmaXREYXRhc2V0KCksIGNvbmZpZy5iYXRjaGVzUGVyRXBvY2ggaXMgZXhwZWN0ZWQgdG8gYmUgYSBgICtcbiAgICAgICAgICBgcG9zaXRpdmUgaW50ZWdlciBpZiBzcGVjaWZpZWQsIGJ1dCBnb3QgJHthcmdzLmJhdGNoZXNQZXJFcG9jaH1gKTtcbiAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgKGFyZ3MgYXMgYW55KVsndmFsaWRhdGlvblNwbGl0J10gPT0gbnVsbCxcbiAgICAgICgpID0+ICdgdmFsaWRhdGlvblNwbGl0YCBpcyBub3Qgc3VwcG9ydGVkIGJ5IGBmaXREYXRhc2V0KClgLiAnICtcbiAgICAgICAgICAnVXNlIHZhbGlkYXRpb25EYXRhIGluc3RlYWQuJyk7XG5cbiAgaWYgKG1vZGVsLmlzVHJhaW5pbmcpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3Qgc3RhcnQgdHJhaW5pbmcgYmVjYXVzZSBhbm90aGVyIGZpdCgpIGNhbGwgaXMgb25nb2luZy4nKTtcbiAgfVxuICBtb2RlbC5pc1RyYWluaW5nID0gdHJ1ZTtcblxuICB0cnkge1xuICAgIGNvbnN0IGRvVmFsaWRhdGlvbiA9IGFyZ3MudmFsaWRhdGlvbkRhdGEgIT0gbnVsbDtcbiAgICBsZXQgdmFsWHM6IHRmYy5UZW5zb3J8dGZjLlRlbnNvcltdO1xuICAgIGxldCB2YWxZczogdGZjLlRlbnNvcnx0ZmMuVGVuc29yW107XG4gICAgaWYgKGRvVmFsaWRhdGlvbikge1xuICAgICAgaWYgKGlzRGF0YXNldE9iamVjdChhcmdzLnZhbGlkYXRpb25EYXRhKSkge1xuICAgICAgICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICAgICAgICBhcmdzLnZhbGlkYXRpb25CYXRjaGVzID09IG51bGwgfHxcbiAgICAgICAgICAgICAgICAoYXJncy52YWxpZGF0aW9uQmF0Y2hlcyA+IDAgJiZcbiAgICAgICAgICAgICAgICAgTnVtYmVyLmlzSW50ZWdlcihhcmdzLnZhbGlkYXRpb25CYXRjaGVzKSksXG4gICAgICAgICAgICAoKSA9PiBgRm9yIGZpdERhdGFzZXQoKSB3aXRoIGRhdGFzZXQtYmFzZWQgdmFsaWRhdGlvbiwgYCArXG4gICAgICAgICAgICAgICAgYGNvbmZpZy52YWxpZGF0aW9uQmF0Y2hlcyBpcyBleHBlY3RlZCBub3QgdG8gYmUgcHJvdmlkZWQsIGAgK1xuICAgICAgICAgICAgICAgIGBvciB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGAgK1xuICAgICAgICAgICAgICAgIGBidXQgZ290ICR7YXJncy52YWxpZGF0aW9uQmF0Y2hlc31gKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHZhbGlkYXRpb25EYXRhID0gc3RhbmRhcmRpemVUZW5zb3JWYWxpZGF0aW9uRGF0YShcbiAgICAgICAgICAgIGFyZ3MudmFsaWRhdGlvbkRhdGEgYXNcbiAgICAgICAgICAgICAgICAgICAgW3RmYy5UZW5zb3IgfCB0ZmMuVGVuc29yW10sIHRmYy5UZW5zb3IgfCB0ZmMuVGVuc29yW11dIHxcbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXSwgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXSxcbiAgICAgICAgICAgICAgdGZjLlRlbnNvciB8IHRmYy5UZW5zb3JbXVxuICAgICAgICAgICAgXSk7XG4gICAgICAgIHZhbFhzID0gdmFsaWRhdGlvbkRhdGEueHM7XG4gICAgICAgIHZhbFlzID0gdmFsaWRhdGlvbkRhdGEueXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdHJhaW5GdW5jdGlvbiA9IG1vZGVsLm1ha2VUcmFpbkZ1bmN0aW9uKCk7XG4gICAgY29uc3Qgb3V0TGFiZWxzID0gbW9kZWwuZ2V0RGVkdXBlZE1ldHJpY3NOYW1lcygpIGFzIHN0cmluZ1tdO1xuXG4gICAgbGV0IGNhbGxiYWNrTWV0cmljczogc3RyaW5nW107XG4gICAgaWYgKGRvVmFsaWRhdGlvbikge1xuICAgICAgY2FsbGJhY2tNZXRyaWNzID1cbiAgICAgICAgICBvdXRMYWJlbHMuc2xpY2UoKS5jb25jYXQob3V0TGFiZWxzLm1hcChuID0+ICd2YWxfJyArIG4pKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY2FsbGJhY2tNZXRyaWNzID0gb3V0TGFiZWxzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gc3RhbmRhcmRpemVDYWxsYmFja3MoYXJncy5jYWxsYmFja3MsIGFyZ3MueWllbGRFdmVyeSk7XG4gICAgY29uc3QgdmVyYm9zZSA9IGFyZ3MudmVyYm9zZSA9PSBudWxsID8gMSA6IGFyZ3MudmVyYm9zZTtcbiAgICBjb25zdCB7Y2FsbGJhY2tMaXN0LCBoaXN0b3J5fSA9IGNvbmZpZ3VyZUNhbGxiYWNrcyhcbiAgICAgICAgY2FsbGJhY2tzLCB2ZXJib3NlLCBhcmdzLmVwb2NocywgbnVsbCwgbnVsbCxcbiAgICAgICAgZ2V0U3RlcHNQZXJFcG9jaChkYXRhc2V0LCBhcmdzKSxcbiAgICAgICAgbnVsbCwgIC8vIEJhdGNoIHNpemUgZGV0ZXJtaW5lZCBieSB0aGUgZGF0YXNldCBpdHNlbGYuXG4gICAgICAgIGRvVmFsaWRhdGlvbiwgY2FsbGJhY2tNZXRyaWNzKTtcbiAgICBjYWxsYmFja0xpc3Quc2V0TW9kZWwobW9kZWwpO1xuICAgIG1vZGVsLmhpc3RvcnkgPSBoaXN0b3J5O1xuXG4gICAgYXdhaXQgY2FsbGJhY2tMaXN0Lm9uVHJhaW5CZWdpbigpO1xuICAgIG1vZGVsLnN0b3BUcmFpbmluZ18gPSBmYWxzZTtcbiAgICBsZXQgZXBvY2ggPSBhcmdzLmluaXRpYWxFcG9jaCA9PSBudWxsID8gMCA6IGFyZ3MuaW5pdGlhbEVwb2NoO1xuXG4gICAgbGV0IGRhdGFJdGVyYXRvciA9IGF3YWl0IGRhdGFzZXQuaXRlcmF0b3IoKTtcbiAgICB3aGlsZSAoZXBvY2ggPCBhcmdzLmVwb2Nocykge1xuICAgICAgY29uc3QgZXBvY2hMb2dzOiBVbnJlc29sdmVkTG9ncyA9IHt9O1xuICAgICAgYXdhaXQgY2FsbGJhY2tMaXN0Lm9uRXBvY2hCZWdpbihlcG9jaCk7XG4gICAgICBsZXQgc3RlcHNEb25lID0gMDtcbiAgICAgIGxldCBiYXRjaEluZGV4ID0gMDtcbiAgICAgIGlmICghaGFzQmF0Y2hlc1BlckVwb2NoKSB7XG4gICAgICAgIGRhdGFJdGVyYXRvciA9IGF3YWl0IGRhdGFzZXQuaXRlcmF0b3IoKTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChoYXNCYXRjaGVzUGVyRXBvY2ggPyBzdGVwc0RvbmUgPCBhcmdzLmJhdGNoZXNQZXJFcG9jaCA6IHRydWUpIHtcbiAgICAgICAgY29uc3QgaXRlcmF0b3JPdXQgPSBhd2FpdCBkYXRhSXRlcmF0b3IubmV4dCgpO1xuXG4gICAgICAgIC8vIElmIGBiYXRjaGVzUGVyRXBvY2hgIGlzIHNwZWNpZmllZCwgdGhlIGRhdGFzZXQgc2hvdWxkIG5vdCBiZVxuICAgICAgICAvLyBleGhhdXN0ZWQgdW50aWwgYWxsIGVwb2NoZXMgYXJlIGRvbmUuXG4gICAgICAgIGlmIChoYXNCYXRjaGVzUGVyRXBvY2ggJiYgaXRlcmF0b3JPdXQuZG9uZSkge1xuICAgICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICAgJ1lvdSBwcm92aWRlZCBgYmF0Y2hlc1BlckVwb2NoYCBhcyAnICtcbiAgICAgICAgICAgICAgYCR7YXJncy5iYXRjaGVzUGVyRXBvY2h9LCBgICtcbiAgICAgICAgICAgICAgJ2J1dCB5b3VyIGRhdGFzZXQgaXRlcmF0b3IgcmFuIG91dCBvZiBkYXRhIGFmdGVyICcgK1xuICAgICAgICAgICAgICBgJHtzdGVwc0RvbmV9IGJhdGNoZXM7IGAgK1xuICAgICAgICAgICAgICAnaW50ZXJydXB0aW5nIHRyYWluaW5nLiBNYWtlIHN1cmUgdGhhdCB5b3VyICcgK1xuICAgICAgICAgICAgICAnZGF0YXNldCBjYW4gZ2VuZXJhdGUgYXQgbGVhc3QgYGJhdGNoZXNQZXJFcG9jaCAqIGVwb2Noc2AgJyArXG4gICAgICAgICAgICAgICdiYXRjaGVzIChpbiB0aGlzIGNhc2UsICcgK1xuICAgICAgICAgICAgICBgJHthcmdzLmJhdGNoZXNQZXJFcG9jaCAqIGFyZ3MuZXBvY2hzfSBiYXRjaGVzKS4gYCArXG4gICAgICAgICAgICAgICdZb3UgbWF5IG5lZWQgdG8gdXNlIHRoZSByZXBlYXQoKSBmdW5jdGlvbiB3aGVuIGJ1aWxkaW5nICcgK1xuICAgICAgICAgICAgICAneW91ciBkYXRhc2V0LicpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGl0ZXJhdG9yT3V0LnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICBjb25zdCB7eHMsIHlzfSA9XG4gICAgICAgICAgICAgIHN0YW5kYXJkaXplRGF0YUl0ZXJhdG9yT3V0cHV0KG1vZGVsLCBpdGVyYXRvck91dC52YWx1ZSk7XG4gICAgICAgICAgY29uc3QgYmF0Y2hMb2dzOiBVbnJlc29sdmVkTG9ncyA9IHt9O1xuICAgICAgICAgIGJhdGNoTG9nc1snYmF0Y2gnXSA9IGJhdGNoSW5kZXg7XG4gICAgICAgICAgYmF0Y2hMb2dzWydzaXplJ10gPSB4c1swXS5zaGFwZVswXTtcblxuICAgICAgICAgIGF3YWl0IGNhbGxiYWNrTGlzdC5vbkJhdGNoQmVnaW4oYmF0Y2hJbmRleCwgYmF0Y2hMb2dzKTtcblxuICAgICAgICAgIGNvbnN0IHNhbXBsZVdlaWdodHM6IHRmYy5UZW5zb3JbXSA9IFtdO1xuICAgICAgICAgIGlmIChhcmdzLmNsYXNzV2VpZ2h0ICE9IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnN0IHN0YW5kYXJkQ2xhc3NXZWlnaHRzID1cbiAgICAgICAgICAgICAgICBzdGFuZGFyZGl6ZUNsYXNzV2VpZ2h0cyhhcmdzLmNsYXNzV2VpZ2h0LCBtb2RlbC5vdXRwdXROYW1lcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0YW5kYXJkQ2xhc3NXZWlnaHRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIHNhbXBsZVdlaWdodHMucHVzaChhd2FpdCBzdGFuZGFyZGl6ZVdlaWdodHMoXG4gICAgICAgICAgICAgICAgICB5c1tpXSwgbnVsbCwgc3RhbmRhcmRDbGFzc1dlaWdodHNbaV0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvLyBUcmFpbiBvbiBiYXRjaC5cbiAgICAgICAgICBjb25zdCBpbnMgPSB4cy5jb25jYXQoeXMpLmNvbmNhdChzYW1wbGVXZWlnaHRzKTtcbiAgICAgICAgICBjb25zdCBvdXRzID0gdHJhaW5GdW5jdGlvbihpbnMpO1xuICAgICAgICAgIHRmYy5kaXNwb3NlKGlucyk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRMYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gb3V0TGFiZWxzW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0gb3V0c1tpXTtcbiAgICAgICAgICAgIGJhdGNoTG9nc1tsYWJlbF0gPSBvdXQ7XG4gICAgICAgICAgICB0ZmMua2VlcChvdXQpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGF3YWl0IGNhbGxiYWNrTGlzdC5vbkJhdGNoRW5kKGJhdGNoSW5kZXgsIGJhdGNoTG9ncyk7XG4gICAgICAgICAgZGlzcG9zZVRlbnNvcnNJbkxvZ3MoYmF0Y2hMb2dzKTtcblxuICAgICAgICAgIGJhdGNoSW5kZXgrKztcbiAgICAgICAgICBzdGVwc0RvbmUrKztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNCYXRjaGVzUGVyRXBvY2ggPyBzdGVwc0RvbmUgPj0gYXJncy5iYXRjaGVzUGVyRXBvY2ggOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcmF0b3JPdXQuZG9uZSkge1xuICAgICAgICAgIC8vIEVwb2NoIGZpbmlzaGVkLiBQZXJmb3JtIHZhbGlkYXRpb24uXG4gICAgICAgICAgaWYgKGRvVmFsaWRhdGlvbikge1xuICAgICAgICAgICAgbGV0IHZhbE91dHM6IHRmYy5TY2FsYXJbXTtcbiAgICAgICAgICAgIGlmIChpc0RhdGFzZXRPYmplY3QoYXJncy52YWxpZGF0aW9uRGF0YSkpIHtcbiAgICAgICAgICAgICAgdmFsT3V0cyA9IHRvTGlzdChhd2FpdCBtb2RlbC5ldmFsdWF0ZURhdGFzZXQoXG4gICAgICAgICAgICAgICAgICBhcmdzLnZhbGlkYXRpb25EYXRhLCB7YmF0Y2hlczogYXJncy52YWxpZGF0aW9uQmF0Y2hlc30pKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHZhbE91dHMgPSB0b0xpc3QobW9kZWwuZXZhbHVhdGUodmFsWHMsIHZhbFlzLCB7XG4gICAgICAgICAgICAgICAgYmF0Y2hTaXplOiBhcmdzLnZhbGlkYXRpb25CYXRjaFNpemUgPT0gbnVsbCA/XG4gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfVkFMSURBVElPTl9CQVRDSF9TSVpFIDpcbiAgICAgICAgICAgICAgICAgICAgYXJncy52YWxpZGF0aW9uQmF0Y2hTaXplLFxuICAgICAgICAgICAgICAgIHZlcmJvc2U6IDBcbiAgICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RlbC5tZXRyaWNzTmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgZXBvY2hMb2dzW2B2YWxfJHttb2RlbC5tZXRyaWNzTmFtZXNbaV19YF0gPSB2YWxPdXRzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBDYWxsIGBicmVha2AgdG8gZXhpdCBvbmUgZXBvY2ggbG9wcCBhZnRlciB2YWxpZGF0aW9uIGlzIGRvbmUuIElmXG4gICAgICAgICAgLy8gY29uZmlnLmJhdGNoZXNQZXJFcG9jaCBpcyBzcGVjaWZpZWQsIGFuIGVwb2NoIHdoaWxlIGxvb3Agd2lsbFxuICAgICAgICAgIC8vIHN0b3Agd2hlbiBgc3RlcHNEb25lID49IGNvbmZpZy5iYXRjaGVzUGVyRXBvY2hgLiBXaGVuXG4gICAgICAgICAgLy8gY29uZmlnLmJhdGNoZXNQZXJFcG9jaCBpcyBub3QgcHJvdmlkZWQsIHRoZSBmb2xsb3dpbmcgYGJyZWFrYCBpc1xuICAgICAgICAgIC8vIHJlcXVpcmVkIHRvIGV4aXQgdGhlIHdoaWxlIGxvcHAgYWZ0ZXIgZGF0YXNldCBpcyBleGhhdXN0ZWQuXG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobW9kZWwuc3RvcFRyYWluaW5nXykge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBhd2FpdCBjYWxsYmFja0xpc3Qub25FcG9jaEVuZChlcG9jaCwgZXBvY2hMb2dzKTtcbiAgICAgIGVwb2NoKys7XG4gICAgICBpZiAobW9kZWwuc3RvcFRyYWluaW5nXykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYXdhaXQgY2FsbGJhY2tMaXN0Lm9uVHJhaW5FbmQoKTtcbiAgICBhd2FpdCBtb2RlbC5oaXN0b3J5LnN5bmNEYXRhKCk7XG4gICAgcmV0dXJuIG1vZGVsLmhpc3Rvcnk7XG4gIH0gZmluYWxseSB7XG4gICAgbW9kZWwuaXNUcmFpbmluZyA9IGZhbHNlO1xuICB9XG59XG5cbi8qKiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIG51bWJlciBvZiBzdGVwcyAoYmF0Y2hlcykgcGVyIGVwb2NoLiAqL1xuZnVuY3Rpb24gZ2V0U3RlcHNQZXJFcG9jaDxUPihcbiAgICBkYXRhc2V0OiBEYXRhc2V0PFQ+LCBhcmdzOiBNb2RlbEZpdERhdGFzZXRBcmdzPFQ+KTogbnVtYmVyIHtcbiAgLy8gQXR0ZW1wdCB0byBkZXRlcm1pbmUgIyBvZiBiYXRjaGVzIGluIGFuIGVwb2NoLlxuICBsZXQgc3RlcHNQZXJFcG9jaDogbnVtYmVyID0gbnVsbDtcbiAgaWYgKGFyZ3MuYmF0Y2hlc1BlckVwb2NoICE9IG51bGwpIHtcbiAgICBzdGVwc1BlckVwb2NoID0gYXJncy5iYXRjaGVzUGVyRXBvY2g7XG4gIH0gZWxzZSBpZiAoTnVtYmVyLmlzRmluaXRlKGRhdGFzZXQuc2l6ZSkpIHtcbiAgICBzdGVwc1BlckVwb2NoID0gZGF0YXNldC5zaXplO1xuICB9XG4gIHJldHVybiBzdGVwc1BlckVwb2NoO1xufVxuXG4vLyBDaGVjayBpZiBwcm92aWRlZCBvYmplY3QgaXMgYSBEYXRhc2V0IG9iamVjdCBieSBjaGVja2luZyBpdHMgLml0ZXJhdG9yXG4vLyBlbGVtZW50LlxuZnVuY3Rpb24gaXNEYXRhc2V0T2JqZWN0PFQ+KFxuICAgIGRhdGFzZXQ6XG4gICAgICAgIFtcbiAgICAgICAgICBUZW5zb3JPckFycmF5T3JNYXAsIFRlbnNvck9yQXJyYXlPck1hcFxuICAgICAgICBdfFtUZW5zb3JPckFycmF5T3JNYXAsIFRlbnNvck9yQXJyYXlPck1hcCwgVGVuc29yT3JBcnJheU9yTWFwXXxcbiAgICBEYXRhc2V0PFQ+KTogYm9vbGVhbiB7XG4gIHJldHVybiAodHlwZW9mIChkYXRhc2V0IGFzIERhdGFzZXQ8VD4pLml0ZXJhdG9yID09PSAnZnVuY3Rpb24nKTtcbn1cblxuLy8gQ2hlY2sgaWYgcHJvdmlkZWQgb2JqZWN0IGlzIGEgTGF6eUl0ZXJhdG9yIG9iamVjdCBieSBjaGVja2luZyBpdCdzIC5uZXh0XG4vLyBlbGVtZW50LlxuZnVuY3Rpb24gaXNMYXp5SXRlcmF0b3JPYmplY3Q8VD4oaXRlcmF0b3I6IERhdGFzZXQ8VD58XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5SXRlcmF0b3I8VD4pOiBib29sZWFuIHtcbiAgcmV0dXJuICh0eXBlb2YgKGl0ZXJhdG9yIGFzIExhenlJdGVyYXRvcjxUPikubmV4dCA9PT0gJ2Z1bmN0aW9uJyk7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBldmFsdWF0ZURhdGFzZXQ8VD4oXG4gICAgLy8gVHlwZSBgbW9kZWxgIGFzIGBhbnlgIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3L1xuICAgIC8vIHRyYWluaW5nLnRzLlxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBtb2RlbDogYW55LCBkYXRhc2V0OiBEYXRhc2V0PFQ+fExhenlJdGVyYXRvcjxUPixcbiAgICBhcmdzOiBNb2RlbEV2YWx1YXRlRGF0YXNldEFyZ3MpOiBQcm9taXNlPHRmYy5TY2FsYXJ8dGZjLlNjYWxhcltdPiB7XG4gIGFyZ3MgPSBhcmdzIHx8IHt9O1xuICBjb25zdCBoYXNCYXRjaGVzID0gYXJncy5iYXRjaGVzICE9IG51bGw7XG4gIGNvbnN0IGYgPSBtb2RlbC50ZXN0RnVuY3Rpb247XG4gIGxldCBvdXRzOiB0ZmMuU2NhbGFyW10gPSBbXTtcbiAgaWYgKGFyZ3MudmVyYm9zZSA+IDApIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignVmVyYm9zZSBtb2RlIGlzIG5vdCBpbXBsZW1lbnRlZCB5ZXQuJyk7XG4gIH1cblxuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICAhaGFzQmF0Y2hlcyB8fCAoYXJncy5iYXRjaGVzID4gMCAmJiBOdW1iZXIuaXNJbnRlZ2VyKGFyZ3MuYmF0Y2hlcykpLFxuICAgICAgKCkgPT4gJ1Rlc3QgbG9vcCBleHBlY3RzIGBiYXRjaGVzYCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCAnICtcbiAgICAgICAgICBgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShhcmdzLmJhdGNoZXMpfWApO1xuICBjb25zdCBkYXRhSXRlcmF0b3IgPSBpc0xhenlJdGVyYXRvck9iamVjdChkYXRhc2V0KSA/XG4gICAgICBkYXRhc2V0IGFzIExhenlJdGVyYXRvcjxUPjpcbiAgICAgIGF3YWl0IChkYXRhc2V0IGFzIERhdGFzZXQ8VD4pLml0ZXJhdG9yKCk7XG4gIC8vIEtlZXBzIHRyYWNrIG9mIG51bWJlciBvZiBleGFtcGxlcyB1c2VkIGluIHRoaXMgZXZhbHVhdGlvbi5cbiAgbGV0IG51bUV4YW1wbGVzID0gMDtcbiAgbGV0IGJhdGNoID0gMDtcblxuICB3aGlsZSAoaGFzQmF0Y2hlcyA/IGJhdGNoIDwgYXJncy5iYXRjaGVzIDogdHJ1ZSkge1xuICAgIGNvbnN0IGl0ZXJhdG9yT3V0ID0gYXdhaXQgZGF0YUl0ZXJhdG9yLm5leHQoKTtcbiAgICBvdXRzID0gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgaWYgKGl0ZXJhdG9yT3V0LnZhbHVlKSB7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IE9uY2UgcmVhbCBkYXRhc2V0IGlzIGF2YWlsYWJsZSwgdXNlXG4gICAgICAgIC8vICAgYG1hcCh4ID0+IHN0YW5kYXJkaXplRGF0YUl0ZXJhdG9yT3V0cHV0KG1vZGVsLCB4KS5tYXAoZilgLlxuICAgICAgICBjb25zdCB7eHMsIHlzfSA9XG4gICAgICAgICAgICBzdGFuZGFyZGl6ZURhdGFJdGVyYXRvck91dHB1dChtb2RlbCwgaXRlcmF0b3JPdXQudmFsdWUpO1xuICAgICAgICBjb25zdCB4c0FuZFlzID0geHMuY29uY2F0KHlzKTtcbiAgICAgICAgY29uc3QgYmF0Y2hPdXRzID0gdGZjLnRpZHkoKCkgPT4gZih4c0FuZFlzKSk7XG4gICAgICAgIHRmYy5kaXNwb3NlKHhzQW5kWXMpO1xuXG4gICAgICAgIGlmIChiYXRjaCA9PT0gMCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hPdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBvdXRzLnB1c2goc2NhbGFyKDApKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBiYXRjaFNpemUgPSB4c0FuZFlzWzBdLnNoYXBlWzBdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoT3V0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGNvbnN0IGJhdGNoT3V0ID0gYmF0Y2hPdXRzW2ldO1xuICAgICAgICAgIGNvbnN0IG9sZFNjYWxhciA9IG91dHNbaV07XG4gICAgICAgICAgb3V0c1tpXSA9XG4gICAgICAgICAgICAgIHRmYy50aWR5KCgpID0+IHRmYy5hZGQob3V0c1tpXSwgdGZjLm11bChiYXRjaFNpemUsIGJhdGNoT3V0KSkpO1xuICAgICAgICAgIGlmIChiYXRjaCA+IDApIHtcbiAgICAgICAgICAgIHRmYy5kaXNwb3NlKG9sZFNjYWxhcik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRmYy5kaXNwb3NlKGJhdGNoT3V0cyk7XG4gICAgICAgIG51bUV4YW1wbGVzICs9IGJhdGNoU2l6ZTtcblxuICAgICAgICArK2JhdGNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHM7XG4gICAgfSk7XG5cbiAgICBpZiAoaXRlcmF0b3JPdXQuZG9uZSkge1xuICAgICAgaWYgKGhhc0JhdGNoZXMpIHtcbiAgICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICAgJ1lvdXIgZGF0YXNldCBpdGVyYXRvciByYW4gb3V0IG9mIGRhdGEgZHVyaW5nIGV2YWx1YXRlRGF0YXNldCgpLiAnICtcbiAgICAgICAgICAgICdJbnRlcnJ1cHRpbmcgZXZhbHV0aW9uLiBNYWtlIHN1cmUgdGhhdCB5b3VyICcgK1xuICAgICAgICAgICAgJ2RhdGFzZXQgY2FuIGdlbmVyYXRlIGF0IGxlYXN0IGBiYXRjaGVzYCAnICtcbiAgICAgICAgICAgIGBiYXRjaGVzIChpbiB0aGlzIGNhc2UsICR7YXJncy5iYXRjaGVzfSBiYXRjaGVzKS4gYCArXG4gICAgICAgICAgICAnWW91IG1heSBuZWVkIHRvIHVzZSB0aGUgcmVwZWF0KCkgZnVuY3Rpb24gd2hlbiBidWlsZGluZyAnICtcbiAgICAgICAgICAgICd5b3VyIGRhdGFzZXQuJyk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBvbGRTY2FsYXIgPSBvdXRzW2ldO1xuICAgIG91dHNbaV0gPSB0ZmMuZGl2KG91dHNbaV0sIG51bUV4YW1wbGVzKTtcbiAgICB0ZmMuZGlzcG9zZShvbGRTY2FsYXIpO1xuICB9XG5cbiAgcmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkob3V0cyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Interfaces and methods for training models using tf.Tensor objects.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { Tensor, tensor1d, util } from '@tensorflow/tfjs-core';\nimport { expandDims, gather, sliceAlongFirstAxis } from '../backend/tfjs_backend';\nimport { configureCallbacks, standardizeCallbacks } from '../base_callbacks';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { disposeTensorsInLogs } from '../logs';\nimport { range } from '../utils/math_utils';\nexport function checkBatchSize(batchSize) {\n    tfc.util.assert(batchSize > 0 && Number.isInteger(batchSize), () => `batchSize is required to be a positive integer, but got ${batchSize}`);\n}\n/**\n * Slice a Tensor or an Array of Tensors, by start and stop indices.\n *\n * Porting Note: The `_slice_arrays` function in PyKeras is covered by this\n *   function and `sliceArraysByIndices()` together.\n *\n * @param arrays: the input.\n * @param start: the starting index (inclusive).\n * @param stop: the stopping index (exclusive).\n * @returns The result of the slicing. If `arrays` is an `Array` of\n *   `tf.Tensor`s, the slicing will be applied to all elements of the `Array`\n *   in the same way.\n */\nexport function sliceArrays(arrays, start, stop) {\n    if (arrays == null) {\n        return [null];\n    }\n    else if (Array.isArray(arrays)) {\n        return arrays.map(array => sliceAlongFirstAxis(array, start, stop - start));\n    }\n    else { // Tensor.\n        return sliceAlongFirstAxis(arrays, start, stop - start);\n    }\n}\n/**\n * Slice a Tensor or an Array of Tensors, by random-order indices.\n *\n * Porting Note: The `_slice_arrays` function in PyKeras is covered by this\n *   function and `sliceArrays()` together.\n *\n * @param arrays The input `tf.Tensor` or `Array` of `tf.Tensor`s to slice.\n *   If an `Array` of `tf.Tensor`s, all `tf.Tensor`s will be sliced in the\n *   same fashion.\n * @param indices The indices to use for slicing along the first (batch)\n *   dimension.\n * @returns Result(s) of the slicing.\n */\nexport function sliceArraysByIndices(arrays, indices) {\n    return tfc.tidy(() => {\n        if (arrays == null) {\n            return null;\n        }\n        else if (Array.isArray(arrays)) {\n            return arrays.map(array => sliceArraysByIndices(array, indices));\n        }\n        else {\n            // TODO(cais): indices should be a pre-constructed Tensor1D to avoid\n            //   tensor1d() calls.\n            return gather(arrays, indices.dtype === 'int32' ? indices : tfc.cast(indices, 'int32'));\n        }\n    });\n}\n/**\n * Returns a list of batch indices (tuples of indices).\n * @param size: Integer, total size of the data to slice into batches.\n * @param batchSize: Integer, batch size.\n * @returns An Array of [batchStart, batchEnd] tuples. batchStart is\n *   inclusive; batchEnd is exclusive. I.e., each batch consists of indices x\n *   that satisfy batchStart <= x < batchEnd.\n */\nexport function makeBatches(size, batchSize) {\n    const output = [];\n    let batchStart = 0;\n    let batchEnd = null;\n    while (batchStart < size) {\n        batchEnd = batchStart + batchSize;\n        if (batchEnd >= size) {\n            batchEnd = size;\n        }\n        output.push([batchStart, batchEnd]);\n        batchStart = batchEnd;\n    }\n    return output;\n}\n/**\n * Abstract fit function for `f(ins)`.\n * @param f A Function returning a list of tensors. For training, this\n *   function is expected to perform the updates to the variables.\n * @param ins List of tensors to be fed to `f`.\n * @param outLabels List of strings, display names of the outputs of `f`.\n * @param batchSize Integer batch size or `== null` if unknown. Default : 32.\n * @param epochs Number of times to iterate over the data. Default : 1.\n * @param verbose Verbosity mode: 0, 1, or 2. Default: 1.\n * @param callbacks List of callbacks to be called during training.\n * @param valF Function to call for validation.\n * @param valIns List of tensors to be fed to `valF`.\n * @param shuffle Whether to shuffle the data at the beginning of every\n * epoch. Default : true.\n * @param callbackMetrics List of strings, the display names of the metrics\n *   passed to the callbacks. They should be the concatenation of the\n *   display names of the outputs of `f` and the list of display names\n *   of the outputs of `valF`.\n * @param initialEpoch Epoch at which to start training (useful for\n *   resuming a previous training run). Default : 0.\n * @param stepsPerEpoch Total number of steps (batches on samples) before\n *   declaring one epoch finished and starting the next epoch. Ignored with\n *   the default value of `undefined` or `null`.\n * @param validationSteps Number of steps to run validation for (only if\n *   doing validation from data tensors). Not applicable for tfjs-layers.\n * @returns A `History` object.\n */\nasync function fitLoop(\n// Type `model` as `any` here to avoid circular dependency w/ training.ts.\n// tslint:disable-next-line:no-any\nmodel, f, ins, outLabels, batchSize, epochs, verbose, callbacks, valF, valIns, shuffle, callbackMetrics, initialEpoch, stepsPerEpoch, validationSteps) {\n    if (batchSize == null) {\n        batchSize = 32;\n    }\n    if (epochs == null) {\n        epochs = 1;\n    }\n    if (shuffle == null) {\n        shuffle = true;\n    }\n    if (initialEpoch == null) {\n        initialEpoch = 0;\n    }\n    // TODO(cais): Change const to let below when implementing validation.\n    let doValidation = false;\n    if (valF != null && valIns != null) {\n        doValidation = true;\n        // TODO(cais): verbose message.\n    }\n    if (validationSteps != null) {\n        doValidation = true;\n        if (stepsPerEpoch == null) {\n            throw new ValueError('Can only use `validationSteps` when doing step-wise training, ' +\n                'i.e., `stepsPerEpoch` must be set.');\n        }\n    }\n    const numTrainSamples = model.checkNumSamples(ins, batchSize, stepsPerEpoch, 'steps_per_epoch');\n    let indexArray;\n    if (numTrainSamples != null) {\n        indexArray = range(0, numTrainSamples);\n    }\n    if (verbose == null) {\n        verbose = 1;\n    }\n    const { callbackList, history } = configureCallbacks(callbacks, verbose, epochs, initialEpoch, numTrainSamples, stepsPerEpoch, batchSize, doValidation, callbackMetrics);\n    callbackList.setModel(model);\n    model.history = history;\n    await callbackList.onTrainBegin();\n    model.stopTraining_ = false;\n    // TODO(cais): Take care of callbacks.validation_data as in PyKeras.\n    // TODO(cais): Pre-convert feeds for performance as in PyKeras.\n    for (let epoch = initialEpoch; epoch < epochs; ++epoch) {\n        await callbackList.onEpochBegin(epoch);\n        const epochLogs = {};\n        if (stepsPerEpoch != null) {\n            throw new NotImplementedError('stepsPerEpoch mode is not implemented yet.');\n        }\n        else {\n            if (shuffle === 'batch') {\n                throw new NotImplementedError('batch shuffling is not implemneted yet');\n            }\n            else if (shuffle) {\n                util.shuffle(indexArray);\n            }\n            // Convert the potentially shuffled indices to Tensor1D, to avoid the\n            // cost of repeated creation of Array1Ds later on.\n            const epochIndexArray1D = tensor1d(indexArray);\n            const batches = makeBatches(numTrainSamples, batchSize);\n            for (let batchIndex = 0; batchIndex < batches.length; ++batchIndex) {\n                const batchLogs = {};\n                await callbackList.onBatchBegin(batchIndex, batchLogs);\n                tfc.tidy(() => {\n                    const batchStart = batches[batchIndex][0];\n                    const batchEnd = batches[batchIndex][1];\n                    const batchIds = sliceAlongFirstAxis(epochIndexArray1D, batchStart, batchEnd - batchStart);\n                    batchLogs['batch'] = batchIndex;\n                    batchLogs['size'] = batchEnd - batchStart;\n                    // TODO(cais): In ins, train flag can be a number, instead of an\n                    //   Tensor? Do we need to handle this in tfjs-layers?\n                    const insBatch = sliceArraysByIndices(ins, batchIds);\n                    const outs = f(insBatch);\n                    for (let i = 0; i < outLabels.length; ++i) {\n                        const label = outLabels[i];\n                        const out = outs[i];\n                        batchLogs[label] = out;\n                        tfc.keep(out);\n                        // TODO(cais): Use scope() to avoid ownership.\n                    }\n                    if (batchIndex === batches.length - 1) { // Last batch.\n                        if (doValidation) {\n                            const valOuts = model.testLoop(valF, valIns, batchSize);\n                            // Porting Notes: In tfjs-layers, valOuts is always an Array.\n                            for (let i = 0; i < outLabels.length; ++i) {\n                                const label = outLabels[i];\n                                const out = valOuts[i];\n                                tfc.keep(out);\n                                // TODO(cais): Use scope() to avoid ownership.\n                                epochLogs['val_' + label] = out;\n                            }\n                        }\n                    }\n                });\n                await callbackList.onBatchEnd(batchIndex, batchLogs);\n                disposeTensorsInLogs(batchLogs);\n                if (model.stopTraining_) {\n                    break;\n                }\n                // TODO(cais): return outs as list of Tensor.\n            }\n            epochIndexArray1D.dispose();\n        }\n        // TODO(cais): Run validation at the end of the epoch.\n        await callbackList.onEpochEnd(epoch, epochLogs);\n        if (model.stopTraining_) {\n            break;\n        }\n    }\n    await callbackList.onTrainEnd();\n    await model.history.syncData();\n    return model.history;\n}\nexport async function fitTensors(\n// Type `model` as `any` here to avoid circular dependency w/ training.ts.\n// tslint:disable-next-line:no-any\nmodel, x, y, args = {}) {\n    if (model.isTraining) {\n        throw new Error('Cannot start training because another fit() call is ongoing.');\n    }\n    model.isTraining = true;\n    let inputs;\n    let targets;\n    let originalInputs;\n    let originalTargets;\n    let inputValX;\n    let inputValY;\n    let valX;\n    let valY;\n    let sampleWeights;\n    try {\n        const batchSize = args.batchSize == null ? 32 : args.batchSize;\n        checkBatchSize(batchSize);\n        // Validate user data.\n        // TODO(cais): Support sampleWeight.\n        const checkBatchAxis = false;\n        const standardizedOuts = await model.standardizeUserData(x, y, args.sampleWeight, args.classWeight, checkBatchAxis, batchSize);\n        inputs = standardizedOuts[0];\n        targets = standardizedOuts[1];\n        sampleWeights = standardizedOuts[2];\n        // Prepare validation data.\n        let doValidation = false;\n        let valIns;\n        if (args.validationData != null && args.validationData.length > 0) {\n            doValidation = true;\n            if (args.validationData.length === 2) {\n                // config.validationData consists of valX and valY.\n                inputValX = args.validationData[0];\n                inputValY = args.validationData[1];\n            }\n            else if (args.validationData.length === 3) {\n                throw new NotImplementedError('validationData including sample weights is not supported yet.');\n            }\n            else {\n                throw new ValueError(`When passing validation data, it must contain 2 (valX, valY) ` +\n                    `or 3 (valX, valY, valSampleWeight) items; ` +\n                    `${args.validationData} is invalid.`);\n            }\n            const checkBatchAxis = true;\n            const valStandardized = await model.standardizeUserData(inputValX, inputValY, null, /** Unused sample weights. */ null, /** Unused class weights. */ checkBatchAxis, batchSize);\n            valX = valStandardized[0];\n            valY = valStandardized[1];\n            valIns = valX.concat(valY);\n            // TODO(cais): Add useLearningPhase data properly.\n        }\n        else if (args.validationSplit != null && args.validationSplit > 0 &&\n            args.validationSplit < 1) {\n            doValidation = true;\n            // Porting Note: In tfjs-layers, inputs[0] is always a Tensor.\n            const splitAt = Math.floor(inputs[0].shape[0] * (1 - args.validationSplit));\n            const originalBatchSize = inputs[0].shape[0];\n            valX = sliceArrays(inputs, splitAt, originalBatchSize);\n            originalInputs = inputs;\n            inputs = sliceArrays(inputs, 0, splitAt);\n            valY = sliceArrays(targets, splitAt, originalBatchSize);\n            originalTargets = targets;\n            targets = sliceArrays(targets, 0, splitAt);\n            // TODO(cais): Once sampleWeights becomes available, slice it to get\n            //   valSampleWeights.\n            valIns = valX.concat(valY);\n            // TODO(cais): Add useLearningPhase data properly.\n        }\n        else if (args.validationSteps != null) {\n            doValidation = true;\n            // TODO(cais): Add useLearningPhase.\n        }\n        const ins = inputs.concat(targets).concat(sampleWeights);\n        model.checkTrainableWeightsConsistency();\n        // TODO(cais): Handle use_learning_phase and learning_phase?\n        // Porting Note: Here we see a key deviation of tfjs-layers from\n        // Keras.\n        //  Due to the imperative nature of tfjs-layers' backend (tfjs-core),\n        //  we do not construct symbolic computation graphs to embody the\n        //  training process. Instead, we define a function that performs the\n        //  training action. In PyKeras, the data (inputs and targets) are fed\n        //  through graph placeholders. In tfjs-layers, the data are fed as\n        //  function arguments. Since the function are defined below in the\n        //  scope, we don't have equivalents of PyKeras's\n        //  `_make_train_funciton`.\n        const trainFunction = model.makeTrainFunction();\n        const outLabels = model.getDedupedMetricsNames();\n        let valFunction;\n        let callbackMetrics;\n        if (doValidation) {\n            model.makeTestFunction();\n            valFunction = model.testFunction;\n            callbackMetrics =\n                outLabels.slice().concat(outLabels.map(n => 'val_' + n));\n        }\n        else {\n            valFunction = null;\n            valIns = [];\n            callbackMetrics = outLabels.slice();\n        }\n        const callbacks = standardizeCallbacks(args.callbacks, args.yieldEvery);\n        const out = await fitLoop(model, trainFunction, ins, outLabels, batchSize, args.epochs, args.verbose, callbacks, valFunction, valIns, args.shuffle, callbackMetrics, args.initialEpoch, null, null);\n        return out;\n    }\n    finally {\n        model.isTraining = false;\n        // Memory clean up.\n        disposeNewTensors(inputs, x);\n        disposeNewTensors(targets, y);\n        disposeNewTensors(originalInputs, x);\n        disposeNewTensors(originalTargets, y);\n        disposeNewTensors(valX, inputValX);\n        disposeNewTensors(valY, inputValY);\n        if (sampleWeights != null) {\n            tfc.dispose(sampleWeights);\n        }\n    }\n    // TODO(cais): Add value to outLabels.\n}\n/**\n * Ensure tensors all have a rank of at least 2.\n *\n * If a tensor has a rank of 1, it is dimension-expanded to rank 2.\n * If any tensor has a rank of 0 (i.e., is a scalar), an error will be thrown.\n */\nexport function ensureTensorsRank2OrHigher(tensors) {\n    const outs = [];\n    if (tensors instanceof Tensor) {\n        tensors = [tensors];\n    }\n    // Make Tensors at least 2D.\n    for (let i = 0; i < tensors.length; ++i) {\n        const tensor = tensors[i];\n        if (tensor.rank === 1) {\n            outs.push(expandDims(tensor, 1));\n        }\n        else if (tensor.rank === 0) {\n            throw new Error('Expected tensor to be at least 1D, but received a 0D tensor ' +\n                '(scalar).');\n        }\n        else {\n            outs.push(tensor);\n        }\n    }\n    return outs;\n}\n/**\n * Compare a set of tensors with a reference (old) set, discard the ones\n * in the new set that are not present in the reference set.\n *\n * This method is used for memory clenaup during calls such as\n * LayersModel.fit().\n *\n * @param tensors New set which may contain Tensors not present in\n *   `refTensors`.\n * @param refTensors Reference Tensor set.\n */\n// TODO(cais, kangyizhang): Deduplicate with tfjs-data.\nexport function disposeNewTensors(tensors, refTensors) {\n    if (tensors == null) {\n        return;\n    }\n    const oldTensorIds = [];\n    if (refTensors instanceof Tensor) {\n        oldTensorIds.push(refTensors.id);\n    }\n    else if (Array.isArray(refTensors)) {\n        refTensors.forEach(t => oldTensorIds.push(t.id));\n    }\n    else if (refTensors != null) {\n        // `oldTensors` is a map from string name to Tensor.\n        for (const name in refTensors) {\n            const oldTensor = refTensors[name];\n            oldTensorIds.push(oldTensor.id);\n        }\n    }\n    const tensorsToDispose = [];\n    if (tensors instanceof Tensor) {\n        if (oldTensorIds.indexOf(tensors.id) === -1) {\n            tensorsToDispose.push(tensors);\n        }\n    }\n    else if (Array.isArray(tensors)) {\n        tensors.forEach(t => {\n            if (oldTensorIds.indexOf(t.id) === -1) {\n                tensorsToDispose.push(t);\n            }\n        });\n    }\n    else if (tensors != null) {\n        // `oldTensors` is a map from string name to Tensor.\n        for (const name in tensors) {\n            const tensor = tensors[name];\n            if (oldTensorIds.indexOf(tensor.id) === -1) {\n                tensorsToDispose.push(tensor);\n            }\n        }\n    }\n    tensorsToDispose.forEach(t => {\n        if (!t.isDisposed) {\n            t.dispose();\n        }\n    });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmdfdGVuc29ycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9lbmdpbmUvdHJhaW5pbmdfdGVuc29ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQVMsTUFBTSxFQUFZLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUvRSxPQUFPLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ2hGLE9BQU8sRUFBZSxrQkFBa0IsRUFBc0Qsb0JBQW9CLEVBQW9CLE1BQU0sbUJBQW1CLENBQUM7QUFDaEssT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsb0JBQW9CLEVBQWlCLE1BQU0sU0FBUyxDQUFDO0FBQzdELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQTRJMUMsTUFBTSxVQUFVLGNBQWMsQ0FBQyxTQUFpQjtJQUM5QyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FDWCxTQUFTLEdBQUcsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLEVBQzVDLEdBQUcsRUFBRSxDQUFDLDJEQUNGLFNBQVMsRUFBRSxDQUFDLENBQUM7QUFDdkIsQ0FBQztBQUVEOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQ3ZCLE1BQXVCLEVBQUUsS0FBYSxFQUFFLElBQVk7SUFDdEQsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1FBQ2xCLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNmO1NBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0s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RjtLQUNGO0lBRUQsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFO1lBQ2pCLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztTQUNiO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBJbnRlcmZhY2VzIGFuZCBtZXRob2RzIGZvciB0cmFpbmluZyBtb2RlbHMgdXNpbmcgdGYuVGVuc29yIG9iamVjdHMuXG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge1NjYWxhciwgVGVuc29yLCBUZW5zb3IxRCwgdGVuc29yMWQsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7ZXhwYW5kRGltcywgZ2F0aGVyLCBzbGljZUFsb25nRmlyc3RBeGlzfSBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge0Jhc2VDYWxsYmFjaywgY29uZmlndXJlQ2FsbGJhY2tzLCBDdXN0b21DYWxsYmFja0FyZ3MsIEhpc3RvcnksIE1vZGVsTG9nZ2luZ1ZlcmJvc2l0eSwgc3RhbmRhcmRpemVDYWxsYmFja3MsIFlpZWxkRXZlcnlPcHRpb25zfSBmcm9tICcuLi9iYXNlX2NhbGxiYWNrcyc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2Rpc3Bvc2VUZW5zb3JzSW5Mb2dzLCBVbnJlc29sdmVkTG9nc30gZnJvbSAnLi4vbG9ncyc7XG5pbXBvcnQge3JhbmdlfSBmcm9tICcuLi91dGlscy9tYXRoX3V0aWxzJztcbmltcG9ydCB7Q2xhc3NXZWlnaHQsIENsYXNzV2VpZ2h0TWFwfSBmcm9tICcuL3RyYWluaW5nX3V0aWxzJztcblxuLyoqXG4gKiBJbnRlcmZhY2UgY29uZmlndXJhdGlvbiBtb2RlbCB0cmFpbmluZyBiYXNlZCBvbiBkYXRhIGFzIGB0Zi5UZW5zb3Jgcy5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBNb2RlbEZpdEFyZ3Mge1xuICAvKipcbiAgICogTnVtYmVyIG9mIHNhbXBsZXMgcGVyIGdyYWRpZW50IHVwZGF0ZS4gSWYgdW5zcGVjaWZpZWQsIGl0XG4gICAqIHdpbGwgZGVmYXVsdCB0byAzMi5cbiAgICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogSW50ZWdlciBudW1iZXIgb2YgdGltZXMgdG8gaXRlcmF0ZSBvdmVyIHRoZSB0cmFpbmluZyBkYXRhIGFycmF5cy5cbiAgICovXG4gIGVwb2Nocz86IG51bWJlcjtcblxuICAvKipcbiAgICogVmVyYm9zaXR5IGxldmVsLlxuICAgKlxuICAgKiBFeHBlY3RlZCB0byBiZSAwLCAxLCBvciAyLiBEZWZhdWx0OiAxLlxuICAgKlxuICAgKiAwIC0gTm8gcHJpbnRlZCBtZXNzYWdlIGR1cmluZyBmaXQoKSBjYWxsLlxuICAgKiAxIC0gSW4gTm9kZS5qcyAodGZqcy1ub2RlKSwgcHJpbnRzIHRoZSBwcm9ncmVzcyBiYXIsIHRvZ2V0aGVyIHdpdGhcbiAgICogICAgIHJlYWwtdGltZSB1cGRhdGVzIG9mIGxvc3MgYW5kIG1ldHJpYyB2YWx1ZXMgYW5kIHRyYWluaW5nIHNwZWVkLlxuICAgKiAgICAgSW4gdGhlIGJyb3dzZXI6IG5vIGFjdGlvbi4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAgICogMiAtIE5vdCBpbXBsZW1lbnRlZCB5ZXQuXG4gICAqL1xuICB2ZXJib3NlPzogTW9kZWxMb2dnaW5nVmVyYm9zaXR5O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgZHVyaW5nIHRyYWluaW5nLlxuICAgKiBDYW4gaGF2ZSBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIGNhbGxiYWNrczpcbiAgICogICAtIGBvblRyYWluQmVnaW4obG9ncylgOiBjYWxsZWQgd2hlbiB0cmFpbmluZyBzdGFydHMuXG4gICAqICAgLSBgb25UcmFpbkVuZChsb2dzKWA6IGNhbGxlZCB3aGVuIHRyYWluaW5nIGVuZHMuXG4gICAqICAgLSBgb25FcG9jaEJlZ2luKGVwb2NoLCBsb2dzKWA6IGNhbGxlZCBhdCB0aGUgc3RhcnQgb2YgZXZlcnkgZXBvY2guXG4gICAqICAgLSBgb25FcG9jaEVuZChlcG9jaCwgbG9ncylgOiBjYWxsZWQgYXQgdGhlIGVuZCBvZiBldmVyeSBlcG9jaC5cbiAgICogICAtIGBvbkJhdGNoQmVnaW4oYmF0Y2gsIGxvZ3MpYDogY2FsbGVkIGF0IHRoZSBzdGFydCBvZiBldmVyeSBiYXRjaC5cbiAgICogICAtIGBvbkJhdGNoRW5kKGJhdGNoLCBsb2dzKWA6IGNhbGxlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IGJhdGNoLlxuICAgKiAgIC0gYG9uWWllbGQoZXBvY2gsIGJhdGNoLCBsb2dzKWA6IGNhbGxlZCBldmVyeSBgeWllbGRFdmVyeWAgbWlsbGlzZWNvbmRzXG4gICAqICAgICAgd2l0aCB0aGUgY3VycmVudCBlcG9jaCwgYmF0Y2ggYW5kIGxvZ3MuIFRoZSBsb2dzIGFyZSB0aGUgc2FtZVxuICAgKiAgICAgIGFzIGluIGBvbkJhdGNoRW5kKClgLiBOb3RlIHRoYXQgYG9uWWllbGRgIGNhbiBza2lwIGJhdGNoZXMgb3JcbiAgICogICAgICBlcG9jaHMuIFNlZSBhbHNvIGRvY3MgZm9yIGB5aWVsZEV2ZXJ5YCBiZWxvdy5cbiAgICovXG4gIGNhbGxiYWNrcz86IEJhc2VDYWxsYmFja1tdfEN1c3RvbUNhbGxiYWNrQXJnc3xDdXN0b21DYWxsYmFja0FyZ3NbXTtcblxuICAvKipcbiAgICogRmxvYXQgYmV0d2VlbiAwIGFuZCAxOiBmcmFjdGlvbiBvZiB0aGUgdHJhaW5pbmcgZGF0YVxuICAgKiB0byBiZSB1c2VkIGFzIHZhbGlkYXRpb24gZGF0YS4gVGhlIG1vZGVsIHdpbGwgc2V0IGFwYXJ0IHRoaXMgZnJhY3Rpb24gb2ZcbiAgICogdGhlIHRyYWluaW5nIGRhdGEsIHdpbGwgbm90IHRyYWluIG9uIGl0LCBhbmQgd2lsbCBldmFsdWF0ZSB0aGUgbG9zcyBhbmRcbiAgICogYW55IG1vZGVsIG1ldHJpY3Mgb24gdGhpcyBkYXRhIGF0IHRoZSBlbmQgb2YgZWFjaCBlcG9jaC5cbiAgICogVGhlIHZhbGlkYXRpb24gZGF0YSBpcyBzZWxlY3RlZCBmcm9tIHRoZSBsYXN0IHNhbXBsZXMgaW4gdGhlIGB4YCBhbmQgYHlgXG4gICAqIGRhdGEgcHJvdmlkZWQsIGJlZm9yZSBzaHVmZmxpbmcuXG4gICAqL1xuICB2YWxpZGF0aW9uU3BsaXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIERhdGEgb24gd2hpY2ggdG8gZXZhbHVhdGUgdGhlIGxvc3MgYW5kIGFueSBtb2RlbFxuICAgKiBtZXRyaWNzIGF0IHRoZSBlbmQgb2YgZWFjaCBlcG9jaC4gVGhlIG1vZGVsIHdpbGwgbm90IGJlIHRyYWluZWQgb24gdGhpc1xuICAgKiBkYXRhLiBUaGlzIGNvdWxkIGJlIGEgdHVwbGUgW3hWYWwsIHlWYWxdIG9yIGEgdHVwbGUgW3hWYWwsIHlWYWwsXG4gICAqIHZhbFNhbXBsZVdlaWdodHNdLiBUaGUgbW9kZWwgd2lsbCBub3QgYmUgdHJhaW5lZCBvbiB0aGlzIGRhdGEuXG4gICAqIGB2YWxpZGF0aW9uRGF0YWAgd2lsbCBvdmVycmlkZSBgdmFsaWRhdGlvblNwbGl0YC5cbiAgICovXG4gIHZhbGlkYXRpb25EYXRhPzogW1xuICAgIFRlbnNvcnxUZW5zb3JbXSwgVGVuc29yfFRlbnNvcltdXG4gIF18W1RlbnNvciB8IFRlbnNvcltdLCBUZW5zb3J8VGVuc29yW10sIFRlbnNvcnxUZW5zb3JbXV07XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgdHJhaW5pbmcgZGF0YSBiZWZvcmUgZWFjaCBlcG9jaC4gSGFzXG4gICAqIG5vIGVmZmVjdCB3aGVuIGBzdGVwc1BlckVwb2NoYCBpcyBub3QgYG51bGxgLlxuICAgKi9cbiAgc2h1ZmZsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIE9wdGlvbmFsIG9iamVjdCBtYXBwaW5nIGNsYXNzIGluZGljZXMgKGludGVnZXJzKSB0b1xuICAgKiBhIHdlaWdodCAoZmxvYXQpIHRvIGFwcGx5IHRvIHRoZSBtb2RlbCdzIGxvc3MgZm9yIHRoZSBzYW1wbGVzIGZyb20gdGhpc1xuICAgKiBjbGFzcyBkdXJpbmcgdHJhaW5pbmcuIFRoaXMgY2FuIGJlIHVzZWZ1bCB0byB0ZWxsIHRoZSBtb2RlbCB0byBcInBheSBtb3JlXG4gICAqIGF0dGVudGlvblwiIHRvIHNhbXBsZXMgZnJvbSBhbiB1bmRlci1yZXByZXNlbnRlZCBjbGFzcy5cbiAgICpcbiAgICogSWYgdGhlIG1vZGVsIGhhcyBtdWx0aXBsZSBvdXRwdXRzLCBhIGNsYXNzIHdlaWdodCBjYW4gYmUgc3BlY2lmaWVkIGZvclxuICAgKiBlYWNoIG9mIHRoZSBvdXRwdXRzIGJ5IHNldHRpbmcgdGhpcyBmaWVsZCBhbiBhcnJheSBvZiB3ZWlnaHQgb2JqZWN0XG4gICAqIG9yIGFuIG9iamVjdCB0aGF0IG1hcHMgbW9kZWwgb3V0cHV0IG5hbWVzIChlLmcuLCBgbW9kZWwub3V0cHV0TmFtZXNbMF1gKVxuICAgKiB0byB3ZWlnaHQgb2JqZWN0cy5cbiAgICovXG4gIGNsYXNzV2VpZ2h0PzogQ2xhc3NXZWlnaHR8Q2xhc3NXZWlnaHRbXXxDbGFzc1dlaWdodE1hcDtcblxuICAvKipcbiAgICogT3B0aW9uYWwgYXJyYXkgb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIHgsIGNvbnRhaW5pbmdcbiAgICogd2VpZ2h0cyB0byBhcHBseSB0byB0aGUgbW9kZWwncyBsb3NzIGZvciBlYWNoIHNhbXBsZS4gSW4gdGhlIGNhc2Ugb2ZcbiAgICogdGVtcG9yYWwgZGF0YSwgeW91IGNhbiBwYXNzIGEgMkQgYXJyYXkgd2l0aCBzaGFwZSAoc2FtcGxlcyxcbiAgICogc2VxdWVuY2VMZW5ndGgpLCB0byBhcHBseSBhIGRpZmZlcmVudCB3ZWlnaHQgdG8gZXZlcnkgdGltZXN0ZXAgb2YgZXZlcnlcbiAgICogc2FtcGxlLiBJbiB0aGlzIGNhc2UgeW91IHNob3VsZCBtYWtlIHN1cmUgdG8gc3BlY2lmeVxuICAgKiBzYW1wbGVXZWlnaHRNb2RlPVwidGVtcG9yYWxcIiBpbiBjb21waWxlKCkuXG4gICAqL1xuICBzYW1wbGVXZWlnaHQ/OiBUZW5zb3I7XG5cbiAgLyoqXG4gICAqIEVwb2NoIGF0IHdoaWNoIHRvIHN0YXJ0IHRyYWluaW5nICh1c2VmdWwgZm9yIHJlc3VtaW5nIGEgcHJldmlvdXMgdHJhaW5pbmdcbiAgICogcnVuKS4gV2hlbiB0aGlzIGlzIHVzZWQsIGBlcG9jaHNgIGlzIHRoZSBpbmRleCBvZiB0aGUgXCJmaW5hbCBlcG9jaFwiLlxuICAgKiBUaGUgbW9kZWwgaXMgbm90IHRyYWluZWQgZm9yIGEgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgZ2l2ZW4gYnkgYGVwb2Noc2AsXG4gICAqIGJ1dCBtZXJlbHkgdW50aWwgdGhlIGVwb2NoIG9mIGluZGV4IGBlcG9jaHNgIGlzIHJlYWNoZWQuXG4gICAqL1xuICBpbml0aWFsRXBvY2g/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRvdGFsIG51bWJlciBvZiBzdGVwcyAoYmF0Y2hlcyBvZiBzYW1wbGVzKSBiZWZvcmVcbiAgICogZGVjbGFyaW5nIG9uZSBlcG9jaCBmaW5pc2hlZCBhbmQgc3RhcnRpbmcgdGhlIG5leHQgZXBvY2guIFdoZW4gdHJhaW5pbmdcbiAgICogd2l0aCBJbnB1dCBUZW5zb3JzIHN1Y2ggYXMgVGVuc29yRmxvdyBkYXRhIHRlbnNvcnMsIHRoZSBkZWZhdWx0IGBudWxsYCBpc1xuICAgKiBlcXVhbCB0byB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBzYW1wbGVzIGluIHlvdXIgZGF0YXNldCBkaXZpZGVkIGJ5IHRoZVxuICAgKiBiYXRjaCBzaXplLCBvciAxIGlmIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQuXG4gICAqL1xuICBzdGVwc1BlckVwb2NoPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPbmx5IHJlbGV2YW50IGlmIGBzdGVwc1BlckVwb2NoYCBpcyBzcGVjaWZpZWQuIFRvdGFsIG51bWJlciBvZiBzdGVwc1xuICAgKiAoYmF0Y2hlcyBvZiBzYW1wbGVzKSB0byB2YWxpZGF0ZSBiZWZvcmUgc3RvcHBpbmcuXG4gICAqL1xuICB2YWxpZGF0aW9uU3RlcHM/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgdGhlIGZyZXF1ZW5jeSBvZiB5aWVsZGluZyB0aGUgbWFpbiB0aHJlYWQgdG8gb3RoZXIgdGFza3MuXG4gICAqXG4gICAqIEluIHRoZSBicm93c2VyIGVudmlyb25tZW50LCB5aWVsZGluZyB0aGUgbWFpbiB0aHJlYWQgY2FuIGltcHJvdmUgdGhlXG4gICAqIHJlc3BvbnNpdmVuZXNzIG9mIHRoZSBwYWdlIGR1cmluZyB0cmFpbmluZy4gSW4gdGhlIE5vZGUuanMgZW52aXJvbm1lbnQsXG4gICAqIGl0IGNhbiBlbnN1cmUgdGFza3MgcXVldWVkIGluIHRoZSBldmVudCBsb29wIGNhbiBiZSBoYW5kbGVkIGluIGEgdGltZWx5XG4gICAqIG1hbm5lci5cbiAgICpcbiAgICogVGhlIHZhbHVlIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzpcbiAgICogICAtIGAnYXV0bydgOiBUaGUgeWllbGRpbmcgaGFwcGVucyBhdCBhIGNlcnRhaW4gZnJhbWUgcmF0ZSAoY3VycmVudGx5IHNldFxuICAgKiAgICAgICAgICAgICAgIGF0IDEyNW1zKS4gVGhpcyBpcyB0aGUgZGVmYXVsdC5cbiAgICogICAtIGAnYmF0Y2gnYDogeWllbGQgZXZlcnkgYmF0Y2guXG4gICAqICAgLSBgJ2Vwb2NoJ2A6IHlpZWxkIGV2ZXJ5IGVwb2NoLlxuICAgKiAgIC0gYW55IGBudW1iZXJgOiB5aWVsZCBldmVyeSBgbnVtYmVyYCBtaWxsaXNlY29uZHMuXG4gICAqICAgLSBgJ25ldmVyJ2A6IG5ldmVyIHlpZWxkLiAoeWllbGRpbmcgY2FuIHN0aWxsIGhhcHBlbiB0aHJvdWdoIGBhd2FpdFxuICAgKiAgICAgIG5leHRGcmFtZSgpYCBjYWxscyBpbiBjdXN0b20gY2FsbGJhY2tzLilcbiAgICovXG4gIHlpZWxkRXZlcnk/OiBZaWVsZEV2ZXJ5T3B0aW9ucztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNoZWNrQmF0Y2hTaXplKGJhdGNoU2l6ZTogbnVtYmVyKSB7XG4gIHRmYy51dGlsLmFzc2VydChcbiAgICAgIGJhdGNoU2l6ZSA+IDAgJiYgTnVtYmVyLmlzSW50ZWdlcihiYXRjaFNpemUpLFxuICAgICAgKCkgPT4gYGJhdGNoU2l6ZSBpcyByZXF1aXJlZCB0byBiZSBhIHBvc2l0aXZlIGludGVnZXIsIGJ1dCBnb3QgJHtcbiAgICAgICAgICBiYXRjaFNpemV9YCk7XG59XG5cbi8qKlxuICogU2xpY2UgYSBUZW5zb3Igb3IgYW4gQXJyYXkgb2YgVGVuc29ycywgYnkgc3RhcnQgYW5kIHN0b3AgaW5kaWNlcy5cbiAqXG4gKiBQb3J0aW5nIE5vdGU6IFRoZSBgX3NsaWNlX2FycmF5c2AgZnVuY3Rpb24gaW4gUHlLZXJhcyBpcyBjb3ZlcmVkIGJ5IHRoaXNcbiAqICAgZnVuY3Rpb24gYW5kIGBzbGljZUFycmF5c0J5SW5kaWNlcygpYCB0b2dldGhlci5cbiAqXG4gKiBAcGFyYW0gYXJyYXlzOiB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gc3RhcnQ6IHRoZSBzdGFydGluZyBpbmRleCAoaW5jbHVzaXZlKS5cbiAqIEBwYXJhbSBzdG9wOiB0aGUgc3RvcHBpbmcgaW5kZXggKGV4Y2x1c2l2ZSkuXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSBzbGljaW5nLiBJZiBgYXJyYXlzYCBpcyBhbiBgQXJyYXlgIG9mXG4gKiAgIGB0Zi5UZW5zb3JgcywgdGhlIHNsaWNpbmcgd2lsbCBiZSBhcHBsaWVkIHRvIGFsbCBlbGVtZW50cyBvZiB0aGUgYEFycmF5YFxuICogICBpbiB0aGUgc2FtZSB3YXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzbGljZUFycmF5cyhcbiAgICBhcnJheXM6IFRlbnNvcnxUZW5zb3JbXSwgc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyKTogVGVuc29yfFRlbnNvcltdIHtcbiAgaWYgKGFycmF5cyA9PSBudWxsKSB7XG4gICAgcmV0dXJuIFtudWxsXTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFycmF5cykpIHtcbiAgICByZXR1cm4gYXJyYXlzLm1hcChhcnJheSA9PiBzbGljZUFsb25nRmlyc3RBeGlzKGFycmF5LCBzdGFydCwgc3RvcCAtIHN0YXJ0KSk7XG4gIH0gZWxzZSB7ICAvLyBUZW5zb3IuXG4gICAgcmV0dXJuIHNsaWNlQWxvbmdGaXJzdEF4aXMoYXJyYXlzLCBzdGFydCwgc3RvcCAtIHN0YXJ0KTtcbiAgfVxufVxuXG4vKipcbiAqIFNsaWNlIGEgVGVuc29yIG9yIGFuIEFycmF5IG9mIFRlbnNvcnMsIGJ5IHJhbmRvbS1vcmRlciBpbmRpY2VzLlxuICpcbiAqIFBvcnRpbmcgTm90ZTogVGhlIGBfc2xpY2VfYXJyYXlzYCBmdW5jdGlvbiBpbiBQeUtlcmFzIGlzIGNvdmVyZWQgYnkgdGhpc1xuICogICBmdW5jdGlvbiBhbmQgYHNsaWNlQXJyYXlzKClgIHRvZ2V0aGVyLlxuICpcbiAqIEBwYXJhbSBhcnJheXMgVGhlIGlucHV0IGB0Zi5UZW5zb3JgIG9yIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzIHRvIHNsaWNlLlxuICogICBJZiBhbiBgQXJyYXlgIG9mIGB0Zi5UZW5zb3JgcywgYWxsIGB0Zi5UZW5zb3JgcyB3aWxsIGJlIHNsaWNlZCBpbiB0aGVcbiAqICAgc2FtZSBmYXNoaW9uLlxuICogQHBhcmFtIGluZGljZXMgVGhlIGluZGljZXMgdG8gdXNlIGZvciBzbGljaW5nIGFsb25nIHRoZSBmaXJzdCAoYmF0Y2gpXG4gKiAgIGRpbWVuc2lvbi5cbiAqIEByZXR1cm5zIFJlc3VsdChzKSBvZiB0aGUgc2xpY2luZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlQXJyYXlzQnlJbmRpY2VzKFxuICAgIGFycmF5czogVGVuc29yfFRlbnNvcltdLCBpbmRpY2VzOiBUZW5zb3IxRCk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gIHJldHVybiB0ZmMudGlkeSgoKSA9PiB7XG4gICAgaWYgKGFycmF5cyA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJyYXlzKSkge1xuICAgICAgcmV0dXJuIGFycmF5cy5tYXAoXG4gICAgICAgICAgYXJyYXkgPT4gKHNsaWNlQXJyYXlzQnlJbmRpY2VzKGFycmF5LCBpbmRpY2VzKSBhcyBUZW5zb3IpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gVE9ETyhjYWlzKTogaW5kaWNlcyBzaG91bGQgYmUgYSBwcmUtY29uc3RydWN0ZWQgVGVuc29yMUQgdG8gYXZvaWRcbiAgICAgIC8vICAgdGVuc29yMWQoKSBjYWxscy5cbiAgICAgIHJldHVybiBnYXRoZXIoXG4gICAgICAgICAgYXJyYXlzLFxuICAgICAgICAgIGluZGljZXMuZHR5cGUgPT09ICdpbnQzMicgPyBpbmRpY2VzIDogdGZjLmNhc3QoaW5kaWNlcywgJ2ludDMyJykpO1xuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGxpc3Qgb2YgYmF0Y2ggaW5kaWNlcyAodHVwbGVzIG9mIGluZGljZXMpLlxuICogQHBhcmFtIHNpemU6IEludGVnZXIsIHRvdGFsIHNpemUgb2YgdGhlIGRhdGEgdG8gc2xpY2UgaW50byBiYXRjaGVzLlxuICogQHBhcmFtIGJhdGNoU2l6ZTogSW50ZWdlciwgYmF0Y2ggc2l6ZS5cbiAqIEByZXR1cm5zIEFuIEFycmF5IG9mIFtiYXRjaFN0YXJ0LCBiYXRjaEVuZF0gdHVwbGVzLiBiYXRjaFN0YXJ0IGlzXG4gKiAgIGluY2x1c2l2ZTsgYmF0Y2hFbmQgaXMgZXhjbHVzaXZlLiBJLmUuLCBlYWNoIGJhdGNoIGNvbnNpc3RzIG9mIGluZGljZXMgeFxuICogICB0aGF0IHNhdGlzZnkgYmF0Y2hTdGFydCA8PSB4IDwgYmF0Y2hFbmQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtYWtlQmF0Y2hlcyhcbiAgICBzaXplOiBudW1iZXIsIGJhdGNoU2l6ZTogbnVtYmVyKTogQXJyYXk8W251bWJlciwgbnVtYmVyXT4ge1xuICBjb25zdCBvdXRwdXQ6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW107XG4gIGxldCBiYXRjaFN0YXJ0ID0gMDtcbiAgbGV0IGJhdGNoRW5kOiBudW1iZXIgPSBudWxsO1xuICB3aGlsZSAoYmF0Y2hTdGFydCA8IHNpemUpIHtcbiAgICBiYXRjaEVuZCA9IGJhdGNoU3RhcnQgKyBiYXRjaFNpemU7XG4gICAgaWYgKGJhdGNoRW5kID49IHNpemUpIHtcbiAgICAgIGJhdGNoRW5kID0gc2l6ZTtcbiAgICB9XG4gICAgb3V0cHV0LnB1c2goW2JhdGNoU3RhcnQsIGJhdGNoRW5kXSk7XG4gICAgYmF0Y2hTdGFydCA9IGJhdGNoRW5kO1xuICB9XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgZml0IGZ1bmN0aW9uIGZvciBgZihpbnMpYC5cbiAqIEBwYXJhbSBmIEEgRnVuY3Rpb24gcmV0dXJuaW5nIGEgbGlzdCBvZiB0ZW5zb3JzLiBGb3IgdHJhaW5pbmcsIHRoaXNcbiAqICAgZnVuY3Rpb24gaXMgZXhwZWN0ZWQgdG8gcGVyZm9ybSB0aGUgdXBkYXRlcyB0byB0aGUgdmFyaWFibGVzLlxuICogQHBhcmFtIGlucyBMaXN0IG9mIHRlbnNvcnMgdG8gYmUgZmVkIHRvIGBmYC5cbiAqIEBwYXJhbSBvdXRMYWJlbHMgTGlzdCBvZiBzdHJpbmdzLCBkaXNwbGF5IG5hbWVzIG9mIHRoZSBvdXRwdXRzIG9mIGBmYC5cbiAqIEBwYXJhbSBiYXRjaFNpemUgSW50ZWdlciBiYXRjaCBzaXplIG9yIGA9PSBudWxsYCBpZiB1bmtub3duLiBEZWZhdWx0IDogMzIuXG4gKiBAcGFyYW0gZXBvY2hzIE51bWJlciBvZiB0aW1lcyB0byBpdGVyYXRlIG92ZXIgdGhlIGRhdGEuIERlZmF1bHQgOiAxLlxuICogQHBhcmFtIHZlcmJvc2UgVmVyYm9zaXR5IG1vZGU6IDAsIDEsIG9yIDIuIERlZmF1bHQ6IDEuXG4gKiBAcGFyYW0gY2FsbGJhY2tzIExpc3Qgb2YgY2FsbGJhY2tzIHRvIGJlIGNhbGxlZCBkdXJpbmcgdHJhaW5pbmcuXG4gKiBAcGFyYW0gdmFsRiBGdW5jdGlvbiB0byBjYWxsIGZvciB2YWxpZGF0aW9uLlxuICogQHBhcmFtIHZhbElucyBMaXN0IG9mIHRlbnNvcnMgdG8gYmUgZmVkIHRvIGB2YWxGYC5cbiAqIEBwYXJhbSBzaHVmZmxlIFdoZXRoZXIgdG8gc2h1ZmZsZSB0aGUgZGF0YSBhdCB0aGUgYmVnaW5uaW5nIG9mIGV2ZXJ5XG4gKiBlcG9jaC4gRGVmYXVsdCA6IHRydWUuXG4gKiBAcGFyYW0gY2FsbGJhY2tNZXRyaWNzIExpc3Qgb2Ygc3RyaW5ncywgdGhlIGRpc3BsYXkgbmFtZXMgb2YgdGhlIG1ldHJpY3NcbiAqICAgcGFzc2VkIHRvIHRoZSBjYWxsYmFja3MuIFRoZXkgc2hvdWxkIGJlIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZVxuICogICBkaXNwbGF5IG5hbWVzIG9mIHRoZSBvdXRwdXRzIG9mIGBmYCBhbmQgdGhlIGxpc3Qgb2YgZGlzcGxheSBuYW1lc1xuICogICBvZiB0aGUgb3V0cHV0cyBvZiBgdmFsRmAuXG4gKiBAcGFyYW0gaW5pdGlhbEVwb2NoIEVwb2NoIGF0IHdoaWNoIHRvIHN0YXJ0IHRyYWluaW5nICh1c2VmdWwgZm9yXG4gKiAgIHJlc3VtaW5nIGEgcHJldmlvdXMgdHJhaW5pbmcgcnVuKS4gRGVmYXVsdCA6IDAuXG4gKiBAcGFyYW0gc3RlcHNQZXJFcG9jaCBUb3RhbCBudW1iZXIgb2Ygc3RlcHMgKGJhdGNoZXMgb24gc2FtcGxlcykgYmVmb3JlXG4gKiAgIGRlY2xhcmluZyBvbmUgZXBvY2ggZmluaXNoZWQgYW5kIHN0YXJ0aW5nIHRoZSBuZXh0IGVwb2NoLiBJZ25vcmVkIHdpdGhcbiAqICAgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYHVuZGVmaW5lZGAgb3IgYG51bGxgLlxuICogQHBhcmFtIHZhbGlkYXRpb25TdGVwcyBOdW1iZXIgb2Ygc3RlcHMgdG8gcnVuIHZhbGlkYXRpb24gZm9yIChvbmx5IGlmXG4gKiAgIGRvaW5nIHZhbGlkYXRpb24gZnJvbSBkYXRhIHRlbnNvcnMpLiBOb3QgYXBwbGljYWJsZSBmb3IgdGZqcy1sYXllcnMuXG4gKiBAcmV0dXJucyBBIGBIaXN0b3J5YCBvYmplY3QuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZpdExvb3AoXG4gICAgLy8gVHlwZSBgbW9kZWxgIGFzIGBhbnlgIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3LyB0cmFpbmluZy50cy5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgbW9kZWw6IGFueSwgZjogKGRhdGE6IFRlbnNvcltdKSA9PiBTY2FsYXJbXSwgaW5zOiBUZW5zb3JbXSxcbiAgICBvdXRMYWJlbHM/OiBzdHJpbmdbXSwgYmF0Y2hTaXplPzogbnVtYmVyLCBlcG9jaHM/OiBudW1iZXIsIHZlcmJvc2U/OiBudW1iZXIsXG4gICAgY2FsbGJhY2tzPzogQmFzZUNhbGxiYWNrW10sIHZhbEY/OiAoZGF0YTogVGVuc29yW10pID0+IFNjYWxhcltdLFxuICAgIHZhbElucz86IFRlbnNvcltdLCBzaHVmZmxlPzogYm9vbGVhbnxzdHJpbmcsIGNhbGxiYWNrTWV0cmljcz86IHN0cmluZ1tdLFxuICAgIGluaXRpYWxFcG9jaD86IG51bWJlciwgc3RlcHNQZXJFcG9jaD86IG51bWJlcixcbiAgICB2YWxpZGF0aW9uU3RlcHM/OiBudW1iZXIpOiBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgaWYgKGJhdGNoU2l6ZSA9PSBudWxsKSB7XG4gICAgYmF0Y2hTaXplID0gMzI7XG4gIH1cbiAgaWYgKGVwb2NocyA9PSBudWxsKSB7XG4gICAgZXBvY2hzID0gMTtcbiAgfVxuICBpZiAoc2h1ZmZsZSA9PSBudWxsKSB7XG4gICAgc2h1ZmZsZSA9IHRydWU7XG4gIH1cbiAgaWYgKGluaXRpYWxFcG9jaCA9PSBudWxsKSB7XG4gICAgaW5pdGlhbEVwb2NoID0gMDtcbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IENoYW5nZSBjb25zdCB0byBsZXQgYmVsb3cgd2hlbiBpbXBsZW1lbnRpbmcgdmFsaWRhdGlvbi5cbiAgbGV0IGRvVmFsaWRhdGlvbiA9IGZhbHNlO1xuICBpZiAodmFsRiAhPSBudWxsICYmIHZhbElucyAhPSBudWxsKSB7XG4gICAgZG9WYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAvLyBUT0RPKGNhaXMpOiB2ZXJib3NlIG1lc3NhZ2UuXG4gIH1cbiAgaWYgKHZhbGlkYXRpb25TdGVwcyAhPSBudWxsKSB7XG4gICAgZG9WYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICBpZiAoc3RlcHNQZXJFcG9jaCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnQ2FuIG9ubHkgdXNlIGB2YWxpZGF0aW9uU3RlcHNgIHdoZW4gZG9pbmcgc3RlcC13aXNlIHRyYWluaW5nLCAnICtcbiAgICAgICAgICAnaS5lLiwgYHN0ZXBzUGVyRXBvY2hgIG11c3QgYmUgc2V0LicpO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG51bVRyYWluU2FtcGxlcyA9XG4gICAgICBtb2RlbC5jaGVja051bVNhbXBsZXMoaW5zLCBiYXRjaFNpemUsIHN0ZXBzUGVyRXBvY2gsICdzdGVwc19wZXJfZXBvY2gnKTtcbiAgbGV0IGluZGV4QXJyYXk6IG51bWJlcltdO1xuICBpZiAobnVtVHJhaW5TYW1wbGVzICE9IG51bGwpIHtcbiAgICBpbmRleEFycmF5ID0gcmFuZ2UoMCwgbnVtVHJhaW5TYW1wbGVzKTtcbiAgfVxuXG4gIGlmICh2ZXJib3NlID09IG51bGwpIHtcbiAgICB2ZXJib3NlID0gMTtcbiAgfVxuXG4gIGNvbnN0IHtjYWxsYmFja0xpc3QsIGhpc3Rvcnl9ID0gY29uZmlndXJlQ2FsbGJhY2tzKFxuICAgICAgY2FsbGJhY2tzLCB2ZXJib3NlLCBlcG9jaHMsIGluaXRpYWxFcG9jaCwgbnVtVHJhaW5TYW1wbGVzLCBzdGVwc1BlckVwb2NoLFxuICAgICAgYmF0Y2hTaXplLCBkb1ZhbGlkYXRpb24sIGNhbGxiYWNrTWV0cmljcyk7XG4gIGNhbGxiYWNrTGlzdC5zZXRNb2RlbChtb2RlbCk7XG4gIG1vZGVsLmhpc3RvcnkgPSBoaXN0b3J5O1xuICBhd2FpdCBjYWxsYmFja0xpc3Qub25UcmFpbkJlZ2luKCk7XG4gIG1vZGVsLnN0b3BUcmFpbmluZ18gPSBmYWxzZTtcbiAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIGNhbGxiYWNrcy52YWxpZGF0aW9uX2RhdGEgYXMgaW4gUHlLZXJhcy5cbiAgLy8gVE9ETyhjYWlzKTogUHJlLWNvbnZlcnQgZmVlZHMgZm9yIHBlcmZvcm1hbmNlIGFzIGluIFB5S2VyYXMuXG5cbiAgZm9yIChsZXQgZXBvY2ggPSBpbml0aWFsRXBvY2g7IGVwb2NoIDwgZXBvY2hzOyArK2Vwb2NoKSB7XG4gICAgYXdhaXQgY2FsbGJhY2tMaXN0Lm9uRXBvY2hCZWdpbihlcG9jaCk7XG4gICAgY29uc3QgZXBvY2hMb2dzOiBVbnJlc29sdmVkTG9ncyA9IHt9O1xuICAgIGlmIChzdGVwc1BlckVwb2NoICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgICdzdGVwc1BlckVwb2NoIG1vZGUgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNodWZmbGUgPT09ICdiYXRjaCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ2JhdGNoIHNodWZmbGluZyBpcyBub3QgaW1wbGVtbmV0ZWQgeWV0Jyk7XG4gICAgICB9IGVsc2UgaWYgKHNodWZmbGUpIHtcbiAgICAgICAgdXRpbC5zaHVmZmxlKGluZGV4QXJyYXkpO1xuICAgICAgfVxuICAgICAgLy8gQ29udmVydCB0aGUgcG90ZW50aWFsbHkgc2h1ZmZsZWQgaW5kaWNlcyB0byBUZW5zb3IxRCwgdG8gYXZvaWQgdGhlXG4gICAgICAvLyBjb3N0IG9mIHJlcGVhdGVkIGNyZWF0aW9uIG9mIEFycmF5MURzIGxhdGVyIG9uLlxuICAgICAgY29uc3QgZXBvY2hJbmRleEFycmF5MUQgPSB0ZW5zb3IxZChpbmRleEFycmF5KTtcblxuICAgICAgY29uc3QgYmF0Y2hlcyA9IG1ha2VCYXRjaGVzKG51bVRyYWluU2FtcGxlcywgYmF0Y2hTaXplKTtcbiAgICAgIGZvciAobGV0IGJhdGNoSW5kZXggPSAwOyBiYXRjaEluZGV4IDwgYmF0Y2hlcy5sZW5ndGg7ICsrYmF0Y2hJbmRleCkge1xuICAgICAgICBjb25zdCBiYXRjaExvZ3M6IFVucmVzb2x2ZWRMb2dzID0ge307XG4gICAgICAgIGF3YWl0IGNhbGxiYWNrTGlzdC5vbkJhdGNoQmVnaW4oYmF0Y2hJbmRleCwgYmF0Y2hMb2dzKTtcblxuICAgICAgICB0ZmMudGlkeSgoKSA9PiB7XG4gICAgICAgICAgY29uc3QgYmF0Y2hTdGFydCA9IGJhdGNoZXNbYmF0Y2hJbmRleF1bMF07XG4gICAgICAgICAgY29uc3QgYmF0Y2hFbmQgPSBiYXRjaGVzW2JhdGNoSW5kZXhdWzFdO1xuICAgICAgICAgIGNvbnN0IGJhdGNoSWRzID0gc2xpY2VBbG9uZ0ZpcnN0QXhpcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcG9jaEluZGV4QXJyYXkxRCwgYmF0Y2hTdGFydCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXRjaEVuZCAtIGJhdGNoU3RhcnQpIGFzIFRlbnNvcjFEO1xuICAgICAgICAgIGJhdGNoTG9nc1snYmF0Y2gnXSA9IGJhdGNoSW5kZXg7XG4gICAgICAgICAgYmF0Y2hMb2dzWydzaXplJ10gPSBiYXRjaEVuZCAtIGJhdGNoU3RhcnQ7XG5cbiAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBJbiBpbnMsIHRyYWluIGZsYWcgY2FuIGJlIGEgbnVtYmVyLCBpbnN0ZWFkIG9mIGFuXG4gICAgICAgICAgLy8gICBUZW5zb3I/IERvIHdlIG5lZWQgdG8gaGFuZGxlIHRoaXMgaW4gdGZqcy1sYXllcnM/XG4gICAgICAgICAgY29uc3QgaW5zQmF0Y2ggPSBzbGljZUFycmF5c0J5SW5kaWNlcyhpbnMsIGJhdGNoSWRzKSBhcyBUZW5zb3JbXTtcbiAgICAgICAgICBjb25zdCBvdXRzID0gZihpbnNCYXRjaCk7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRMYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gb3V0TGFiZWxzW2ldO1xuICAgICAgICAgICAgY29uc3Qgb3V0ID0gb3V0c1tpXTtcbiAgICAgICAgICAgIGJhdGNoTG9nc1tsYWJlbF0gPSBvdXQ7XG4gICAgICAgICAgICB0ZmMua2VlcChvdXQpO1xuICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogVXNlIHNjb3BlKCkgdG8gYXZvaWQgb3duZXJzaGlwLlxuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChiYXRjaEluZGV4ID09PSBiYXRjaGVzLmxlbmd0aCAtIDEpIHsgIC8vIExhc3QgYmF0Y2guXG4gICAgICAgICAgICBpZiAoZG9WYWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbE91dHMgPSBtb2RlbC50ZXN0TG9vcCh2YWxGLCB2YWxJbnMsIGJhdGNoU2l6ZSk7XG4gICAgICAgICAgICAgIC8vIFBvcnRpbmcgTm90ZXM6IEluIHRmanMtbGF5ZXJzLCB2YWxPdXRzIGlzIGFsd2F5cyBhbiBBcnJheS5cbiAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRMYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBsYWJlbCA9IG91dExhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXQgPSB2YWxPdXRzW2ldO1xuICAgICAgICAgICAgICAgIHRmYy5rZWVwKG91dCk7XG4gICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogVXNlIHNjb3BlKCkgdG8gYXZvaWQgb3duZXJzaGlwLlxuICAgICAgICAgICAgICAgIGVwb2NoTG9nc1sndmFsXycgKyBsYWJlbF0gPSBvdXQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGF3YWl0IGNhbGxiYWNrTGlzdC5vbkJhdGNoRW5kKGJhdGNoSW5kZXgsIGJhdGNoTG9ncyk7XG4gICAgICAgIGRpc3Bvc2VUZW5zb3JzSW5Mb2dzKGJhdGNoTG9ncyk7XG5cbiAgICAgICAgaWYgKG1vZGVsLnN0b3BUcmFpbmluZ18pIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLyBUT0RPKGNhaXMpOiByZXR1cm4gb3V0cyBhcyBsaXN0IG9mIFRlbnNvci5cbiAgICAgIH1cblxuICAgICAgZXBvY2hJbmRleEFycmF5MUQuZGlzcG9zZSgpO1xuICAgIH1cbiAgICAvLyBUT0RPKGNhaXMpOiBSdW4gdmFsaWRhdGlvbiBhdCB0aGUgZW5kIG9mIHRoZSBlcG9jaC5cbiAgICBhd2FpdCBjYWxsYmFja0xpc3Qub25FcG9jaEVuZChlcG9jaCwgZXBvY2hMb2dzKTtcbiAgICBpZiAobW9kZWwuc3RvcFRyYWluaW5nXykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIGF3YWl0IGNhbGxiYWNrTGlzdC5vblRyYWluRW5kKCk7XG5cbiAgYXdhaXQgbW9kZWwuaGlzdG9yeS5zeW5jRGF0YSgpO1xuICByZXR1cm4gbW9kZWwuaGlzdG9yeTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpdFRlbnNvcnMoXG4gICAgLy8gVHlwZSBgbW9kZWxgIGFzIGBhbnlgIGhlcmUgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jeSB3LyB0cmFpbmluZy50cy5cbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgbW9kZWw6IGFueSwgeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgIHk6IFRlbnNvcnxUZW5zb3JbXXx7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSxcbiAgICBhcmdzOiBNb2RlbEZpdEFyZ3MgPSB7fSk6IFByb21pc2U8SGlzdG9yeT4ge1xuICBpZiAobW9kZWwuaXNUcmFpbmluZykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBzdGFydCB0cmFpbmluZyBiZWNhdXNlIGFub3RoZXIgZml0KCkgY2FsbCBpcyBvbmdvaW5nLicpO1xuICB9XG4gIG1vZGVsLmlzVHJhaW5pbmcgPSB0cnVlO1xuICBsZXQgaW5wdXRzOiBUZW5zb3JbXTtcbiAgbGV0IHRhcmdldHM6IFRlbnNvcltdO1xuICBsZXQgb3JpZ2luYWxJbnB1dHM6IFRlbnNvcltdO1xuICBsZXQgb3JpZ2luYWxUYXJnZXRzOiBUZW5zb3JbXTtcbiAgbGV0IGlucHV0VmFsWDogVGVuc29yfFRlbnNvcltdO1xuICBsZXQgaW5wdXRWYWxZOiBUZW5zb3J8VGVuc29yW107XG4gIGxldCB2YWxYOiBUZW5zb3J8VGVuc29yW107XG4gIGxldCB2YWxZOiBUZW5zb3J8VGVuc29yW107XG4gIGxldCBzYW1wbGVXZWlnaHRzOiBUZW5zb3JbXTtcbiAgdHJ5IHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBhcmdzLmJhdGNoU2l6ZSA9PSBudWxsID8gMzIgOiBhcmdzLmJhdGNoU2l6ZTtcbiAgICBjaGVja0JhdGNoU2l6ZShiYXRjaFNpemUpO1xuXG4gICAgLy8gVmFsaWRhdGUgdXNlciBkYXRhLlxuICAgIC8vIFRPRE8oY2Fpcyk6IFN1cHBvcnQgc2FtcGxlV2VpZ2h0LlxuICAgIGNvbnN0IGNoZWNrQmF0Y2hBeGlzID0gZmFsc2U7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkT3V0cyA9XG4gICAgICAgIGF3YWl0IG1vZGVsLnN0YW5kYXJkaXplVXNlckRhdGEoXG4gICAgICAgICAgICB4LCB5LCBhcmdzLnNhbXBsZVdlaWdodCwgYXJncy5jbGFzc1dlaWdodCwgY2hlY2tCYXRjaEF4aXMsXG4gICAgICAgICAgICBiYXRjaFNpemUpIGFzIFtUZW5zb3JbXSwgVGVuc29yW10sIFRlbnNvcltdXTtcbiAgICBpbnB1dHMgPSBzdGFuZGFyZGl6ZWRPdXRzWzBdO1xuICAgIHRhcmdldHMgPSBzdGFuZGFyZGl6ZWRPdXRzWzFdO1xuICAgIHNhbXBsZVdlaWdodHMgPSBzdGFuZGFyZGl6ZWRPdXRzWzJdO1xuXG4gICAgLy8gUHJlcGFyZSB2YWxpZGF0aW9uIGRhdGEuXG4gICAgbGV0IGRvVmFsaWRhdGlvbiA9IGZhbHNlO1xuICAgIGxldCB2YWxJbnM6IFRlbnNvcltdO1xuICAgIGlmIChhcmdzLnZhbGlkYXRpb25EYXRhICE9IG51bGwgJiYgYXJncy52YWxpZGF0aW9uRGF0YS5sZW5ndGggPiAwKSB7XG4gICAgICBkb1ZhbGlkYXRpb24gPSB0cnVlO1xuICAgICAgaWYgKGFyZ3MudmFsaWRhdGlvbkRhdGEubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIC8vIGNvbmZpZy52YWxpZGF0aW9uRGF0YSBjb25zaXN0cyBvZiB2YWxYIGFuZCB2YWxZLlxuICAgICAgICBpbnB1dFZhbFggPSBhcmdzLnZhbGlkYXRpb25EYXRhWzBdO1xuICAgICAgICBpbnB1dFZhbFkgPSBhcmdzLnZhbGlkYXRpb25EYXRhWzFdO1xuICAgICAgfSBlbHNlIGlmIChhcmdzLnZhbGlkYXRpb25EYXRhLmxlbmd0aCA9PT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICd2YWxpZGF0aW9uRGF0YSBpbmNsdWRpbmcgc2FtcGxlIHdlaWdodHMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBXaGVuIHBhc3NpbmcgdmFsaWRhdGlvbiBkYXRhLCBpdCBtdXN0IGNvbnRhaW4gMiAodmFsWCwgdmFsWSkgYCArXG4gICAgICAgICAgICBgb3IgMyAodmFsWCwgdmFsWSwgdmFsU2FtcGxlV2VpZ2h0KSBpdGVtczsgYCArXG4gICAgICAgICAgICBgJHthcmdzLnZhbGlkYXRpb25EYXRhfSBpcyBpbnZhbGlkLmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBjaGVja0JhdGNoQXhpcyA9IHRydWU7XG4gICAgICBjb25zdCB2YWxTdGFuZGFyZGl6ZWQgPVxuICAgICAgICAgIGF3YWl0IG1vZGVsLnN0YW5kYXJkaXplVXNlckRhdGEoXG4gICAgICAgICAgICAgIGlucHV0VmFsWCwgaW5wdXRWYWxZLCBudWxsLCAvKiogVW51c2VkIHNhbXBsZSB3ZWlnaHRzLiAqL1xuICAgICAgICAgICAgICBudWxsLCAgICAgICAgICAgICAgICAgICAgICAgLyoqIFVudXNlZCBjbGFzcyB3ZWlnaHRzLiAqL1xuICAgICAgICAgICAgICBjaGVja0JhdGNoQXhpcywgYmF0Y2hTaXplKSBhcyBbVGVuc29yW10sIFRlbnNvcltdLCBUZW5zb3JbXV07XG4gICAgICB2YWxYID0gdmFsU3RhbmRhcmRpemVkWzBdO1xuICAgICAgdmFsWSA9IHZhbFN0YW5kYXJkaXplZFsxXTtcbiAgICAgIHZhbElucyA9IHZhbFguY29uY2F0KHZhbFkpO1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHVzZUxlYXJuaW5nUGhhc2UgZGF0YSBwcm9wZXJseS5cbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBhcmdzLnZhbGlkYXRpb25TcGxpdCAhPSBudWxsICYmIGFyZ3MudmFsaWRhdGlvblNwbGl0ID4gMCAmJlxuICAgICAgICBhcmdzLnZhbGlkYXRpb25TcGxpdCA8IDEpIHtcbiAgICAgIGRvVmFsaWRhdGlvbiA9IHRydWU7XG4gICAgICAvLyBQb3J0aW5nIE5vdGU6IEluIHRmanMtbGF5ZXJzLCBpbnB1dHNbMF0gaXMgYWx3YXlzIGEgVGVuc29yLlxuICAgICAgY29uc3Qgc3BsaXRBdCA9XG4gICAgICAgICAgTWF0aC5mbG9vcihpbnB1dHNbMF0uc2hhcGVbMF0gKiAoMSAtIGFyZ3MudmFsaWRhdGlvblNwbGl0KSk7XG4gICAgICBjb25zdCBvcmlnaW5hbEJhdGNoU2l6ZSA9IGlucHV0c1swXS5zaGFwZVswXTtcbiAgICAgIHZhbFggPSBzbGljZUFycmF5cyhpbnB1dHMsIHNwbGl0QXQsIG9yaWdpbmFsQmF0Y2hTaXplKSBhcyBUZW5zb3JbXTtcbiAgICAgIG9yaWdpbmFsSW5wdXRzID0gaW5wdXRzO1xuICAgICAgaW5wdXRzID0gc2xpY2VBcnJheXMoaW5wdXRzLCAwLCBzcGxpdEF0KSBhcyBUZW5zb3JbXTtcbiAgICAgIHZhbFkgPSBzbGljZUFycmF5cyh0YXJnZXRzLCBzcGxpdEF0LCBvcmlnaW5hbEJhdGNoU2l6ZSkgYXMgVGVuc29yW107XG4gICAgICBvcmlnaW5hbFRhcmdldHMgPSB0YXJnZXRzO1xuICAgICAgdGFyZ2V0cyA9IHNsaWNlQXJyYXlzKHRhcmdldHMsIDAsIHNwbGl0QXQpIGFzIFRlbnNvcltdO1xuICAgICAgLy8gVE9ETyhjYWlzKTogT25jZSBzYW1wbGVXZWlnaHRzIGJlY29tZXMgYXZhaWxhYmxlLCBzbGljZSBpdCB0byBnZXRcbiAgICAgIC8vICAgdmFsU2FtcGxlV2VpZ2h0cy5cbiAgICAgIHZhbElucyA9IHZhbFguY29uY2F0KHZhbFkpO1xuXG4gICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgdXNlTGVhcm5pbmdQaGFzZSBkYXRhIHByb3Blcmx5LlxuICAgIH0gZWxzZSBpZiAoYXJncy52YWxpZGF0aW9uU3RlcHMgIT0gbnVsbCkge1xuICAgICAgZG9WYWxpZGF0aW9uID0gdHJ1ZTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB1c2VMZWFybmluZ1BoYXNlLlxuICAgIH1cblxuICAgIGNvbnN0IGlucyA9IGlucHV0cy5jb25jYXQodGFyZ2V0cykuY29uY2F0KHNhbXBsZVdlaWdodHMpO1xuXG4gICAgbW9kZWwuY2hlY2tUcmFpbmFibGVXZWlnaHRzQ29uc2lzdGVuY3koKTtcblxuICAgIC8vIFRPRE8oY2Fpcyk6IEhhbmRsZSB1c2VfbGVhcm5pbmdfcGhhc2UgYW5kIGxlYXJuaW5nX3BoYXNlP1xuXG4gICAgLy8gUG9ydGluZyBOb3RlOiBIZXJlIHdlIHNlZSBhIGtleSBkZXZpYXRpb24gb2YgdGZqcy1sYXllcnMgZnJvbVxuICAgIC8vIEtlcmFzLlxuICAgIC8vICBEdWUgdG8gdGhlIGltcGVyYXRpdmUgbmF0dXJlIG9mIHRmanMtbGF5ZXJzJyBiYWNrZW5kICh0ZmpzLWNvcmUpLFxuICAgIC8vICB3ZSBkbyBub3QgY29uc3RydWN0IHN5bWJvbGljIGNvbXB1dGF0aW9uIGdyYXBocyB0byBlbWJvZHkgdGhlXG4gICAgLy8gIHRyYWluaW5nIHByb2Nlc3MuIEluc3RlYWQsIHdlIGRlZmluZSBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgdGhlXG4gICAgLy8gIHRyYWluaW5nIGFjdGlvbi4gSW4gUHlLZXJhcywgdGhlIGRhdGEgKGlucHV0cyBhbmQgdGFyZ2V0cykgYXJlIGZlZFxuICAgIC8vICB0aHJvdWdoIGdyYXBoIHBsYWNlaG9sZGVycy4gSW4gdGZqcy1sYXllcnMsIHRoZSBkYXRhIGFyZSBmZWQgYXNcbiAgICAvLyAgZnVuY3Rpb24gYXJndW1lbnRzLiBTaW5jZSB0aGUgZnVuY3Rpb24gYXJlIGRlZmluZWQgYmVsb3cgaW4gdGhlXG4gICAgLy8gIHNjb3BlLCB3ZSBkb24ndCBoYXZlIGVxdWl2YWxlbnRzIG9mIFB5S2VyYXMnc1xuICAgIC8vICBgX21ha2VfdHJhaW5fZnVuY2l0b25gLlxuICAgIGNvbnN0IHRyYWluRnVuY3Rpb24gPSBtb2RlbC5tYWtlVHJhaW5GdW5jdGlvbigpO1xuICAgIGNvbnN0IG91dExhYmVscyA9IG1vZGVsLmdldERlZHVwZWRNZXRyaWNzTmFtZXMoKSBhcyBzdHJpbmdbXTtcblxuICAgIGxldCB2YWxGdW5jdGlvbjogKGRhdGE6IFRlbnNvcltdKSA9PiBTY2FsYXJbXTtcbiAgICBsZXQgY2FsbGJhY2tNZXRyaWNzOiBzdHJpbmdbXTtcbiAgICBpZiAoZG9WYWxpZGF0aW9uKSB7XG4gICAgICBtb2RlbC5tYWtlVGVzdEZ1bmN0aW9uKCk7XG4gICAgICB2YWxGdW5jdGlvbiA9IG1vZGVsLnRlc3RGdW5jdGlvbjtcbiAgICAgIGNhbGxiYWNrTWV0cmljcyA9XG4gICAgICAgICAgb3V0TGFiZWxzLnNsaWNlKCkuY29uY2F0KG91dExhYmVscy5tYXAobiA9PiAndmFsXycgKyBuKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbEZ1bmN0aW9uID0gbnVsbDtcbiAgICAgIHZhbElucyA9IFtdO1xuICAgICAgY2FsbGJhY2tNZXRyaWNzID0gb3V0TGFiZWxzLnNsaWNlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgY2FsbGJhY2tzID0gc3RhbmRhcmRpemVDYWxsYmFja3MoYXJncy5jYWxsYmFja3MsIGFyZ3MueWllbGRFdmVyeSk7XG4gICAgY29uc3Qgb3V0ID0gYXdhaXQgZml0TG9vcChcbiAgICAgICAgbW9kZWwsIHRyYWluRnVuY3Rpb24sIGlucywgb3V0TGFiZWxzLCBiYXRjaFNpemUsIGFyZ3MuZXBvY2hzLFxuICAgICAgICBhcmdzLnZlcmJvc2UsIGNhbGxiYWNrcywgdmFsRnVuY3Rpb24sIHZhbElucywgYXJncy5zaHVmZmxlLFxuICAgICAgICBjYWxsYmFja01ldHJpY3MsIGFyZ3MuaW5pdGlhbEVwb2NoLCBudWxsLCBudWxsKTtcbiAgICByZXR1cm4gb3V0O1xuICB9IGZpbmFsbHkge1xuICAgIG1vZGVsLmlzVHJhaW5pbmcgPSBmYWxzZTtcbiAgICAvLyBNZW1vcnkgY2xlYW4gdXAuXG4gICAgZGlzcG9zZU5ld1RlbnNvcnMoaW5wdXRzLCB4KTtcbiAgICBkaXNwb3NlTmV3VGVuc29ycyh0YXJnZXRzLCB5KTtcbiAgICBkaXNwb3NlTmV3VGVuc29ycyhvcmlnaW5hbElucHV0cywgeCk7XG4gICAgZGlzcG9zZU5ld1RlbnNvcnMob3JpZ2luYWxUYXJnZXRzLCB5KTtcbiAgICBkaXNwb3NlTmV3VGVuc29ycyh2YWxYIGFzIFRlbnNvcltdLCBpbnB1dFZhbFgpO1xuICAgIGRpc3Bvc2VOZXdUZW5zb3JzKHZhbFkgYXMgVGVuc29yW10sIGlucHV0VmFsWSk7XG4gICAgaWYgKHNhbXBsZVdlaWdodHMgIT0gbnVsbCkge1xuICAgICAgdGZjLmRpc3Bvc2Uoc2FtcGxlV2VpZ2h0cyk7XG4gICAgfVxuICB9XG4gIC8vIFRPRE8oY2Fpcyk6IEFkZCB2YWx1ZSB0byBvdXRMYWJlbHMuXG59XG5cbi8qKlxuICogRW5zdXJlIHRlbnNvcnMgYWxsIGhhdmUgYSByYW5rIG9mIGF0IGxlYXN0IDIuXG4gKlxuICogSWYgYSB0ZW5zb3IgaGFzIGEgcmFuayBvZiAxLCBpdCBpcyBkaW1lbnNpb24tZXhwYW5kZWQgdG8gcmFuayAyLlxuICogSWYgYW55IHRlbnNvciBoYXMgYSByYW5rIG9mIDAgKGkuZS4sIGlzIGEgc2NhbGFyKSwgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVUZW5zb3JzUmFuazJPckhpZ2hlcih0ZW5zb3JzOiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3JbXSB7XG4gIGNvbnN0IG91dHM6IFRlbnNvcltdID0gW107XG4gIGlmICh0ZW5zb3JzIGluc3RhbmNlb2YgVGVuc29yKSB7XG4gICAgdGVuc29ycyA9IFt0ZW5zb3JzXTtcbiAgfVxuXG4gIC8vIE1ha2UgVGVuc29ycyBhdCBsZWFzdCAyRC5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW5zb3JzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgdGVuc29yID0gdGVuc29yc1tpXTtcbiAgICBpZiAodGVuc29yLnJhbmsgPT09IDEpIHtcbiAgICAgIG91dHMucHVzaChleHBhbmREaW1zKHRlbnNvciwgMSkpO1xuICAgIH0gZWxzZSBpZiAodGVuc29yLnJhbmsgPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRXhwZWN0ZWQgdGVuc29yIHRvIGJlIGF0IGxlYXN0IDFELCBidXQgcmVjZWl2ZWQgYSAwRCB0ZW5zb3IgJyArXG4gICAgICAgICAgJyhzY2FsYXIpLicpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRzLnB1c2godGVuc29yKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIG91dHM7XG59XG5cbi8qKlxuICogQ29tcGFyZSBhIHNldCBvZiB0ZW5zb3JzIHdpdGggYSByZWZlcmVuY2UgKG9sZCkgc2V0LCBkaXNjYXJkIHRoZSBvbmVzXG4gKiBpbiB0aGUgbmV3IHNldCB0aGF0IGFyZSBub3QgcHJlc2VudCBpbiB0aGUgcmVmZXJlbmNlIHNldC5cbiAqXG4gKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBtZW1vcnkgY2xlbmF1cCBkdXJpbmcgY2FsbHMgc3VjaCBhc1xuICogTGF5ZXJzTW9kZWwuZml0KCkuXG4gKlxuICogQHBhcmFtIHRlbnNvcnMgTmV3IHNldCB3aGljaCBtYXkgY29udGFpbiBUZW5zb3JzIG5vdCBwcmVzZW50IGluXG4gKiAgIGByZWZUZW5zb3JzYC5cbiAqIEBwYXJhbSByZWZUZW5zb3JzIFJlZmVyZW5jZSBUZW5zb3Igc2V0LlxuICovXG4vLyBUT0RPKGNhaXMsIGthbmd5aXpoYW5nKTogRGVkdXBsaWNhdGUgd2l0aCB0ZmpzLWRhdGEuXG5leHBvcnQgZnVuY3Rpb24gZGlzcG9zZU5ld1RlbnNvcnMoXG4gICAgdGVuc29yczogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgIHJlZlRlbnNvcnM6IFRlbnNvcnxUZW5zb3JbXXx7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSk6IHZvaWQge1xuICBpZiAodGVuc29ycyA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG9sZFRlbnNvcklkczogbnVtYmVyW10gPSBbXTtcbiAgaWYgKHJlZlRlbnNvcnMgaW5zdGFuY2VvZiBUZW5zb3IpIHtcbiAgICBvbGRUZW5zb3JJZHMucHVzaChyZWZUZW5zb3JzLmlkKTtcbiAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHJlZlRlbnNvcnMpKSB7XG4gICAgcmVmVGVuc29ycy5mb3JFYWNoKHQgPT4gb2xkVGVuc29ySWRzLnB1c2godC5pZCkpO1xuICB9IGVsc2UgaWYgKHJlZlRlbnNvcnMgIT0gbnVsbCkge1xuICAgIC8vIGBvbGRUZW5zb3JzYCBpcyBhIG1hcCBmcm9tIHN0cmluZyBuYW1lIHRvIFRlbnNvci5cbiAgICBmb3IgKGNvbnN0IG5hbWUgaW4gcmVmVGVuc29ycykge1xuICAgICAgY29uc3Qgb2xkVGVuc29yID0gcmVmVGVuc29yc1tuYW1lXTtcbiAgICAgIG9sZFRlbnNvcklkcy5wdXNoKG9sZFRlbnNvci5pZCk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdGVuc29yc1RvRGlzcG9zZTogVGVuc29yW10gPSBbXTtcbiAgaWYgKHRlbnNvcnMgaW5zdGFuY2VvZiBUZW5zb3IpIHtcbiAgICBpZiAob2xkVGVuc29ySWRzLmluZGV4T2YodGVuc29ycy5pZCkgPT09IC0xKSB7XG4gICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2godGVuc29ycyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGVuc29ycykpIHtcbiAgICB0ZW5zb3JzLmZvckVhY2godCA9PiB7XG4gICAgICBpZiAob2xkVGVuc29ySWRzLmluZGV4T2YodC5pZCkgPT09IC0xKSB7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh0KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfSBlbHNlIGlmICh0ZW5zb3JzICE9IG51bGwpIHtcbiAgICAvLyBgb2xkVGVuc29yc2AgaXMgYSBtYXAgZnJvbSBzdHJpbmcgbmFtZSB0byBUZW5zb3IuXG4gICAgZm9yIChjb25zdCBuYW1lIGluIHRlbnNvcnMpIHtcbiAgICAgIGNvbnN0IHRlbnNvciA9IHRlbnNvcnNbbmFtZV07XG4gICAgICBpZiAob2xkVGVuc29ySWRzLmluZGV4T2YodGVuc29yLmlkKSA9PT0gLTEpIHtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHRlbnNvcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgdGVuc29yc1RvRGlzcG9zZS5mb3JFYWNoKHQgPT4ge1xuICAgIGlmICghdC5pc0Rpc3Bvc2VkKSB7XG4gICAgICB0LmRpc3Bvc2UoKTtcbiAgICB9XG4gIH0pO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original Source: engine/training.py */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { io, Optimizer, scalar, serialization, Tensor, tensor1d, util } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { nameScope } from '../common';\nimport { NotImplementedError, RuntimeError, ValueError } from '../errors';\nimport { deserialize } from '../layers/serialization';\nimport * as losses from '../losses';\nimport * as Metrics from '../metrics';\nimport * as optimizers from '../optimizers';\nimport { checkUserDefinedMetadata } from '../user_defined_metadata';\nimport { count, pyListRepeat, singletonOrArray, toCamelCase, toSnakeCase, unique } from '../utils/generic_utils';\nimport { printSummary } from '../utils/layer_utils';\nimport { range } from '../utils/math_utils';\nimport { convertPythonicToTs } from '../utils/serialization_utils';\nimport { version } from '../version';\nimport { Container } from './container';\nimport { execute, FeedDict } from './executor';\nimport { evaluateDataset, fitDataset } from './training_dataset';\nimport { checkBatchSize, disposeNewTensors, ensureTensorsRank2OrHigher, fitTensors, makeBatches, sliceArrays, sliceArraysByIndices } from './training_tensors';\nimport { computeWeightedLoss, standardizeClassWeights, standardizeWeights } from './training_utils';\n/**\n * Helper function for polymorphic input data: 1. singleton Tensor.\n */\nexport function isDataTensor(x) {\n    return x instanceof Tensor;\n}\n/**\n * Helper function for polymorphic input data: 2. Array of Tensor.\n */\nexport function isDataArray(x) {\n    return Array.isArray(x);\n}\n/**\n * Helper function for polymorphic input data: 3. \"dict\" of Tensor.\n */\nexport function isDataDict(x) {\n    return !isDataTensor(x) && !isDataArray(x);\n}\n/**\n * Normalizes inputs and targets provided by users.\n * @param data User-provided input data (polymorphic).\n * @param names An Array of expected Tensor names.\n * @param shapes Optional Array of expected Tensor shapes.\n * @param checkBatchAxis Whether to check that the batch axis of the arrays\n *   match  the expected value found in `shapes`.\n * @param exceptionPrefix String prefix used for exception formatting.\n * @returns List of standardized input Tensors (one Tensor per model input).\n * @throws ValueError: in case of improperly formatted user data.\n */\nexport function standardizeInputData(data, names, shapes, checkBatchAxis = true, exceptionPrefix = '') {\n    if (names == null || names.length === 0) {\n        // Check for the case where the model expected no data, but some data got\n        // sent.\n        if (data != null) {\n            let gotUnexpectedData = false;\n            if (isDataArray(data) && data.length > 0) {\n                gotUnexpectedData = true;\n            }\n            else if (isDataDict(data)) {\n                for (const key in data) {\n                    if (data.hasOwnProperty(key)) {\n                        gotUnexpectedData = true;\n                        break;\n                    }\n                }\n            }\n            else {\n                // `data` is a singleton Tensor in this case.\n                gotUnexpectedData = true;\n            }\n            if (gotUnexpectedData) {\n                throw new ValueError(`Error when checking model ${exceptionPrefix} expected no data, ` +\n                    `but got ${data}`);\n            }\n        }\n        return [];\n    }\n    if (data == null) {\n        return names.map(name => null);\n    }\n    let arrays;\n    if (isDataDict(data)) {\n        data = data;\n        arrays = [];\n        for (const name of names) {\n            if (data[name] == null) {\n                throw new ValueError(`No data provided for \"${name}\". Need data for each key in: ` +\n                    `${names}`);\n            }\n            arrays.push(data[name]);\n        }\n    }\n    else if (isDataArray(data)) {\n        data = data;\n        if (data.length !== names.length) {\n            throw new ValueError(`Error when checking model ${exceptionPrefix}: the Array of ` +\n                `Tensors that you are passing to your model is not the size the ` +\n                `model expected. Expected to see ${names.length} Tensor(s), but ` +\n                `instead got the following list of Tensor(s): ${data}`);\n        }\n        arrays = data;\n    }\n    else {\n        data = data;\n        if (names.length > 1) {\n            throw new ValueError(`The model ${exceptionPrefix} expects ${names.length} Tensor(s), ` +\n                `but only received one Tensor. Found: Tensor with shape ${data.shape}`);\n        }\n        arrays = [data];\n    }\n    arrays = ensureTensorsRank2OrHigher(arrays);\n    // Check shape compatibility.\n    if (shapes != null) {\n        for (let i = 0; i < names.length; ++i) {\n            if (shapes[i] == null) {\n                continue;\n            }\n            const array = arrays[i];\n            if (array.shape.length !== shapes[i].length) {\n                throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i]} ` +\n                    `to have ${shapes[i].length} dimension(s). but got array with ` +\n                    `shape ${array.shape}`);\n            }\n            for (let j = 0; j < shapes[i].length; ++j) {\n                if (j === 0 && !checkBatchAxis) {\n                    // Skip the first (batch) axis.\n                    continue;\n                }\n                const dim = array.shape[j];\n                const refDim = shapes[i][j];\n                if (refDim != null && refDim >= 0 && dim !== refDim) {\n                    throw new ValueError(`${exceptionPrefix} expected a batch of elements where each ` +\n                        `example has shape [${shapes[i].slice(1, shapes[i].length)}] ` +\n                        `(i.e.,tensor shape [*,${shapes[i].slice(1, shapes[i].length)}])` +\n                        ` but the ${exceptionPrefix} received an input with ${array.shape[0]}` +\n                        ` examples, each with shape [${array.shape.slice(1, array.shape.length)}]` +\n                        ` (tensor shape [${array.shape}])`);\n                }\n            }\n        }\n    }\n    return arrays;\n}\n/**\n * User input validation for Tensors.\n * @param inputs `Array` of `tf.Tensor`s for inputs.\n * @param targets `Array` of `tf.Tensor`s for targets.\n * @param weights Optional `Array` of `tf.Tensor`s for sample weights.\n * @throws ValueError: in case of incorrectly formatted data.\n */\nexport function checkArrayLengths(inputs, targets, weights) {\n    const setX = unique(inputs.map(input => input.shape[0]));\n    setX.sort();\n    const setY = unique(targets.map(target => target.shape[0]));\n    setY.sort();\n    // TODO(cais): Check `weights` as well.\n    if (setX.length > 1) {\n        throw new ValueError(`All input Tensors (x) should have the same number of samples. ` +\n            `Got array shapes: ` +\n            `${JSON.stringify(inputs.map(input => input.shape))}`);\n    }\n    if (setY.length > 1) {\n        throw new ValueError(`All target Tensors (y) should have the same number of samples. ` +\n            `Got array shapes: ` +\n            `${JSON.stringify(targets.map(target => target.shape))}`);\n    }\n    if (setX.length > 0 && setY.length > 0 && !util.arraysEqual(setX, setY)) {\n        throw new ValueError(`Input Tensors should have the same number of samples as target ` +\n            `Tensors. Found ${setX[0]} input sample(s) and ${setY[0]} target ` +\n            `sample(s).`);\n    }\n}\n/**\n * Validation on the compatibility of targes and loss functions.\n *\n * This helps prevent users from using loss functions incorrectly.\n *\n * @param targets `Array` of `tf.Tensor`s of targets.\n * @param lossFns `Array` of loss functions.\n * @param outputShapes `Array` of shapes of model outputs.\n */\nfunction checkLossAndTargetCompatibility(targets, lossFns, outputShapes) {\n    // TODO(cais): Dedicated test coverage?\n    const keyLosses = [\n        losses.meanSquaredError, losses.binaryCrossentropy,\n        losses.categoricalCrossentropy\n    ];\n    for (let i = 0; i < targets.length; ++i) {\n        const y = targets[i];\n        const loss = lossFns[i];\n        const shape = outputShapes[i];\n        if (loss == null) {\n            continue;\n        }\n        if (loss === losses.categoricalCrossentropy) {\n            if (y.shape[y.shape.length - 1] === 1) {\n                throw new ValueError(`You are passing a target array of shape ${y.shape} while using ` +\n                    `a loss 'categorical_crossentropy'. 'categorical_crossentropy'` +\n                    `expects targets to be binary matrices (1s and 0s) of shape ` +\n                    `[samples, classes].`);\n                // TODO(cais): Example code in error message.\n            }\n        }\n        if (keyLosses.indexOf(loss) !== -1) {\n            const slicedYShape = y.shape.slice(1);\n            const slicedShape = shape.slice(1);\n            for (let j = 0; j < slicedYShape.length; ++j) {\n                const targetDim = slicedYShape[j];\n                const outDim = slicedShape[j];\n                if (outDim != null && targetDim !== outDim) {\n                    throw new ValueError(`A target Tensor with shape ${y.shape} was passed for an ` +\n                        `output of shape ${shape}, while using a loss function that ` +\n                        `expects targets to have the same shape as the output.`);\n                }\n            }\n        }\n    }\n}\n/**\n * Check inputs provided by the user.\n *\n * Porting Note: This corresponds to _standardize_input_data() in Python\n *   Keras. Because of the strong typing in TF.js, we do not need to convert\n *   the data. Specifically:\n *   1) in PyKeras, `data` can be `DataFrame` instances from pandas, for\n *      example. We don't need to worry about that here because there is no\n *      widely popular javascript/typesdcript equivalent of pandas (so far).\n *      If one becomes available in the future, we can add support.\n *   2) in PyKeras, inputs can be Python dict. But here we are stipulating\n * that the data is either a single `tf.Tensor` or an Array of `tf.Tensor`s. We\n * may add support for `Object` data inputs in the future when the need\n * arises.\n *\n * Instead, we perform basic checks for number of parameters and shapes.\n *\n * @param data: The input data.\n * @param names: Name for the inputs, from the model.\n * @param shapes: Expected shapes for the input data, from the model.\n * @param checkBatchAxis: Whether the size along the batch axis (i.e., the\n *   first dimension) will be checked for matching.\n * @param exceptionPrefix: Execption prefix message, used in generating error\n *   messages.\n * @throws ValueError: on incorrect number of inputs or mismatches in shapes.\n */\nfunction checkInputData(data, names, shapes, checkBatchAxis = true, exceptionPrefix = '') {\n    let arrays;\n    if (Array.isArray(data)) {\n        if (data.length !== names.length) {\n            throw new ValueError(`Error when checking model ${exceptionPrefix}: the Array of ` +\n                `Tensors that you are passing to your model is not the size the ` +\n                `the model expected. Expected to see ${names.length} Tensor(s),` +\n                ` but instead got ${data.length} Tensors(s).`);\n        }\n        arrays = data;\n    }\n    else {\n        if (names.length > 1) {\n            throw new ValueError(`The model expects ${names.length} ${exceptionPrefix} Tensors, ` +\n                `but only received one Tensor. Found: array with shape ` +\n                `${JSON.stringify(data.shape)}.`);\n        }\n        arrays = [data];\n    }\n    if (shapes != null) {\n        for (let i = 0; i < names.length; ++i) {\n            if (shapes[i] == null) {\n                continue;\n            }\n            const array = arrays[i];\n            if (array.shape.length !== shapes[i].length) {\n                throw new ValueError(`Error when checking ${exceptionPrefix}: expected ${names[i]} ` +\n                    `to have ${shapes[i].length} dimension(s), but got array with ` +\n                    `shape ${JSON.stringify(array.shape)}`);\n            }\n            for (let j = 0; j < shapes[i].length; ++j) {\n                if (j === 0 && !checkBatchAxis) {\n                    continue;\n                }\n                const dim = array.shape[j];\n                const refDim = shapes[i][j];\n                if (refDim != null) {\n                    if (refDim !== dim) {\n                        throw new ValueError(`Error when checking ${exceptionPrefix}: expected ` +\n                            `${names[i]} to have shape ${JSON.stringify(shapes[i])} but ` +\n                            `got array with shape ${JSON.stringify(array.shape)}.`);\n                    }\n                }\n            }\n        }\n    }\n}\n/**\n * Maps metric functions to model outputs.\n * @param metrics An shortcut strings name, metric function, `Array` or dict\n *   (`Object`) of metric functions.\n * @param outputNames An `Array` of the names of model outputs.\n * @returns An `Array` (one entry per model output) of `Array` of metric\n *   functions. For instance, if the model has 2 outputs, and for the first\n *   output we want to compute `binaryAccuracy` and `binaryCrossentropy`,\n *   and just `binaryAccuracy` for the second output, the `Array` would look\n *   like:\n *     `[[binaryAccuracy, binaryCrossentropy],  [binaryAccuracy]]`\n * @throws TypeError: incompatible metrics format.\n */\nexport function collectMetrics(metrics, outputNames) {\n    if (metrics == null || Array.isArray(metrics) && metrics.length === 0) {\n        return outputNames.map(name => []);\n    }\n    let wrappedMetrics;\n    if (typeof metrics === 'string' || typeof metrics === 'function') {\n        wrappedMetrics = [metrics];\n    }\n    else if (Array.isArray(metrics) || typeof metrics === 'object') {\n        wrappedMetrics = metrics;\n    }\n    else {\n        throw new TypeError('Type of metrics argument not understood. Expected an string,' +\n            `function, Array, or Object, found: ${metrics}`);\n    }\n    if (Array.isArray(wrappedMetrics)) {\n        // We then apply all metrics to all outputs.\n        return outputNames.map(name => wrappedMetrics);\n    }\n    else {\n        // In this case, metrics is a dict.\n        const nestedMetrics = [];\n        for (const name of outputNames) {\n            let outputMetrics = wrappedMetrics.hasOwnProperty(name) ? wrappedMetrics[name] : [];\n            if (!Array.isArray(outputMetrics)) {\n                outputMetrics = [outputMetrics];\n            }\n            nestedMetrics.push(outputMetrics);\n        }\n        return nestedMetrics;\n    }\n}\nconst LAYERS_MODEL_FORMAT_NAME = 'layers-model';\n/**\n * A `tf.LayersModel` is a directed, acyclic graph of `tf.Layer`s plus methods\n * for training, evaluation, prediction and saving.\n *\n * `tf.LayersModel` is the basic unit of training, inference and evaluation in\n * TensorFlow.js. To create a `tf.LayersModel`, use `tf.LayersModel`.\n *\n * See also:\n *   `tf.Sequential`, `tf.loadLayersModel`.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\nexport class LayersModel extends Container {\n    constructor(args) {\n        super(args);\n        this.isTraining = false;\n    }\n    /**\n     * Print a text summary of the model's layers.\n     *\n     * The summary includes\n     * - Name and type of all layers that comprise the model.\n     * - Output shape(s) of the layers\n     * - Number of weight parameters of each layer\n     * - If the model has non-sequential-like topology, the inputs each layer\n     *   receives\n     * - The total number of trainable and non-trainable parameters of the model.\n     *\n     * ```js\n     * const input1 = tf.input({shape: [10]});\n     * const input2 = tf.input({shape: [20]});\n     * const dense1 = tf.layers.dense({units: 4}).apply(input1);\n     * const dense2 = tf.layers.dense({units: 8}).apply(input2);\n     * const concat = tf.layers.concatenate().apply([dense1, dense2]);\n     * const output =\n     *     tf.layers.dense({units: 3, activation: 'softmax'}).apply(concat);\n     *\n     * const model = tf.model({inputs: [input1, input2], outputs: output});\n     * model.summary();\n     * ```\n     *\n     * @param lineLength Custom line length, in number of characters.\n     * @param positions Custom widths of each of the columns, as either\n     *   fractions of `lineLength` (e.g., `[0.5, 0.75, 1]`) or absolute number\n     *   of characters (e.g., `[30, 50, 65]`). Each number corresponds to\n     *   right-most (i.e., ending) position of a column.\n     * @param printFn Custom print function. Can be used to replace the default\n     *   `console.log`. For example, you can use `x => {}` to mute the printed\n     *   messages in the console.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    summary(lineLength, positions, printFn = console.log) {\n        if (!this.built) {\n            throw new ValueError(`This model has never been called, thus its weights have not been ` +\n                `created yet. So no summary can be displayed. Build the model ` +\n                `first (e.g., by calling it on some test data).`);\n        }\n        printSummary(this, lineLength, positions, printFn);\n    }\n    /**\n     * Configures and prepares the model for training and evaluation.  Compiling\n     * outfits the model with an optimizer, loss, and/or metrics.  Calling `fit`\n     * or `evaluate` on an un-compiled model will throw an error.\n     *\n     * @param args a `ModelCompileArgs` specifying the loss, optimizer, and\n     * metrics to be used for fitting and evaluating this model.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    compile(args) {\n        if (args.loss == null) {\n            args.loss = [];\n        }\n        this.loss = args.loss;\n        if (typeof args.optimizer === 'string') {\n            this.optimizer_ = optimizers.getOptimizer(args.optimizer);\n            this.isOptimizerOwned = true;\n        }\n        else {\n            if (!(args.optimizer instanceof Optimizer)) {\n                throw new ValueError(`User-defined optimizer must be an instance of tf.Optimizer.`);\n            }\n            this.optimizer_ = args.optimizer;\n            this.isOptimizerOwned = false;\n        }\n        // TODO(cais): Add lossWeights.\n        // TODO(cais): Add sampleWeightMode.\n        // Prepare loss functions.\n        let lossFunctions = [];\n        if (!Array.isArray(args.loss) && typeof args.loss !== 'string' &&\n            typeof args.loss !== 'function') {\n            args.loss = args.loss;\n            for (const name in args.loss) {\n                if (this.outputNames.indexOf(name) === -1) {\n                    throw new ValueError(`Unknown entry in loss dictionary: \"${name}\". ` +\n                        `Only expected the following keys: ${this.outputNames}`);\n                }\n            }\n            for (const name of this.outputNames) {\n                if (args.loss[name] == null) {\n                    console.warn(`Output \"${name}\" is missing from loss dictionary. We assume ` +\n                        `this was done on purpose, and we will not be expecting data ` +\n                        `to be passed to ${name} during training`);\n                }\n                lossFunctions.push(losses.get(args.loss[name]));\n            }\n        }\n        else if (Array.isArray(args.loss)) {\n            if (args.loss.length !== this.outputs.length) {\n                throw new ValueError(`When passing an Array as loss, it should have one entry per ` +\n                    `model output. The model has ${this.outputs.length} output(s), ` +\n                    `but you passed loss=${args.loss}.`);\n            }\n            const theLosses = args.loss;\n            lossFunctions = theLosses.map(l => losses.get(l));\n        }\n        else {\n            const lossFunction = losses.get(args.loss);\n            this.outputs.forEach(_ => {\n                lossFunctions.push(lossFunction);\n            });\n        }\n        this.lossFunctions = lossFunctions;\n        this.feedOutputNames = [];\n        this.feedOutputShapes = [];\n        this.feedLossFns = [];\n        for (let i = 0; i < this.outputs.length; ++i) {\n            // TODO(cais): Logic for skipping target(s).\n            const shape = this.internalOutputShapes[i];\n            const name = this.outputNames[i];\n            this.feedOutputNames.push(name);\n            this.feedOutputShapes.push(shape);\n            this.feedLossFns.push(this.lossFunctions[i]);\n        }\n        // TODO(cais): Add logic for output masks.\n        // TODO(cais): Add logic for sample weights.\n        const skipTargetIndices = [];\n        // Prepare metrics.\n        this.metrics = args.metrics;\n        // TODO(cais): Add weightedMetrics.\n        this.metricsNames = ['loss'];\n        this.metricsTensors = [];\n        // Compute total loss.\n        // Porting Note: In PyKeras, metrics_tensors are symbolic tensor objects.\n        //   Here, metricsTensors are TypeScript functions. This difference is due\n        //   to the difference in symbolic/imperative property of the backends.\n        nameScope('loss', () => {\n            for (let i = 0; i < this.outputs.length; ++i) {\n                if (skipTargetIndices.indexOf(i) !== -1) {\n                    continue;\n                }\n                // TODO(cais): Add weightedLoss, sampleWeight and mask.\n                //   The following line should be weightedLoss\n                const weightedLoss = this.lossFunctions[i];\n                if (this.outputs.length > 1) {\n                    this.metricsTensors.push([weightedLoss, i]);\n                    this.metricsNames.push(this.outputNames[i] + '_loss');\n                }\n            }\n            // Porting Note: Due to the imperative nature of the backend, we calculate\n            //   the regularizer penalties in the totalLossFunction, instead of here.\n        });\n        const nestedMetrics = collectMetrics(args.metrics, this.outputNames);\n        // TODO(cais): Add nestedWeightedMetrics.\n        /**\n         * Helper function used in loop below.\n         */\n        const appendMetric = (outputIndex, metricName, metricTensor) => {\n            if (this.outputNames.length > 1) {\n                metricName = this.outputNames[outputIndex] + '_' + metricName;\n            }\n            this.metricsNames.push(metricName);\n            this.metricsTensors.push([metricTensor, outputIndex]);\n        };\n        nameScope('metric', () => {\n            for (let i = 0; i < this.outputs.length; ++i) {\n                if (skipTargetIndices.indexOf(i) !== -1) {\n                    continue;\n                }\n                const outputMetrics = nestedMetrics[i];\n                // TODO(cais): Add weights and outputWeightedMetrics.\n                // TODO(cais): Add optional arg `weights` to the following function.\n                const handleMetrics = (metrics) => {\n                    const metricNamePrefix = '';\n                    let metricName;\n                    let accFn;\n                    let weightedMetricFn;\n                    //  TODO(cais): Use 'weights_' for weighted metrics.\n                    for (const metric of metrics) {\n                        if (typeof metric === 'string' &&\n                            ['accuracy', 'acc', 'crossentropy', 'ce'].indexOf(metric) !==\n                                -1) {\n                            const outputShape = this.internalOutputShapes[i];\n                            if (outputShape[outputShape.length - 1] === 1 ||\n                                this.lossFunctions[i] === losses.binaryCrossentropy) {\n                                // case: binary accuracy/crossentropy.\n                                if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n                                    accFn = Metrics.binaryAccuracy;\n                                }\n                                else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n                                    accFn = Metrics.binaryCrossentropy;\n                                }\n                            }\n                            else if (this.lossFunctions[i] ===\n                                losses.sparseCategoricalCrossentropy) {\n                                // case: categorical accuracy / crossentropy with sparse\n                                // targets.\n                                if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n                                    accFn = Metrics.sparseCategoricalAccuracy;\n                                }\n                                else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n                                    accFn = Metrics.sparseCategoricalCrossentropy;\n                                }\n                            }\n                            else {\n                                // case: categorical accuracy / crossentropy.\n                                if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n                                    accFn = Metrics.categoricalAccuracy;\n                                }\n                                else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n                                    accFn = Metrics.categoricalCrossentropy;\n                                }\n                            }\n                            let suffix;\n                            if (['accuracy', 'acc'].indexOf(metric) !== -1) {\n                                suffix = 'acc';\n                            }\n                            else if (['crossentropy', 'ce'].indexOf(metric) !== -1) {\n                                suffix = 'ce';\n                            }\n                            // TODO(cais): Add weighting actually.\n                            weightedMetricFn = accFn;\n                            metricName = metricNamePrefix + suffix;\n                        }\n                        else {\n                            const metricFn = Metrics.get(metric);\n                            // TODO(cais): Add weighting actually.\n                            weightedMetricFn = metricFn;\n                            metricName =\n                                metricNamePrefix + Metrics.getLossOrMetricName(metric);\n                        }\n                        // TODO(cais): Add weighting and masking to metricResult.\n                        let metricResult;\n                        nameScope(metricName, () => {\n                            metricResult = weightedMetricFn;\n                        });\n                        appendMetric(i, metricName, metricResult);\n                    }\n                };\n                handleMetrics(outputMetrics);\n                // TODO(cais): Call handleMetrics with weights.\n            }\n        });\n        // Porting Notes: Given the imperative backend of tfjs-core,\n        //   there is no need for constructing the symbolic graph and placeholders.\n        this.collectedTrainableWeights = this.trainableWeights;\n    }\n    /**\n     * Check trainable weights count consistency.\n     *\n     * This will raise a warning if `this.trainableWeights` and\n     * `this.collectedTrainableWeights` are inconsistent (i.e., have different\n     * numbers of parameters).\n     * Inconsistency will typically arise when one modifies `model.trainable`\n     * without calling `model.compile()` again.\n     */\n    checkTrainableWeightsConsistency() {\n        if (this.collectedTrainableWeights == null) {\n            return;\n        }\n        if (this.trainableWeights.length !==\n            this.collectedTrainableWeights.length) {\n            console.warn('Discrepancy between trainableweights and collected trainable ' +\n                'weights. Did you set `model.trainable` without calling ' +\n                '`model.compile()` afterwards?');\n        }\n    }\n    /**\n     * Returns the loss value & metrics values for the model in test mode.\n     *\n     * Loss and metrics are specified during `compile()`, which needs to happen\n     * before calls to `evaluate()`.\n     *\n     * Computation is done in batches.\n     *\n     * ```js\n     * const model = tf.sequential({\n     *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n     * });\n     * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n     * const result = model.evaluate(\n     *     tf.ones([8, 10]), tf.ones([8, 1]), {batchSize: 4});\n     * result.print();\n     * ```\n     *\n     * @param x `tf.Tensor` of test data, or an `Array` of `tf.Tensor`s if the\n     * model has multiple inputs.\n     * @param y `tf.Tensor` of target data, or an `Array` of `tf.Tensor`s if the\n     * model has multiple outputs.\n     * @param args A `ModelEvaluateArgs`, containing optional fields.\n     *\n     * @return `Scalar` test loss (if the model has a single output and no\n     *   metrics) or `Array` of `Scalar`s (if the model has multiple outputs\n     *   and/or metrics). The attribute `model.metricsNames`\n     *   will give you the display labels for the scalar outputs.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    evaluate(x, y, args = {}) {\n        const batchSize = args.batchSize == null ? 32 : args.batchSize;\n        checkBatchSize(batchSize);\n        // TODO(cais): Standardize `config.sampleWeights` as well.\n        // Validate user data.\n        const checkBatchAxis = true;\n        const standardizedOuts = this.standardizeUserDataXY(x, y, checkBatchAxis, batchSize);\n        try {\n            // TODO(cais): If uses `useLearningPhase`, set the corresponding element\n            // of the input to 0.\n            const ins = standardizedOuts[0].concat(standardizedOuts[1]);\n            this.makeTestFunction();\n            const f = this.testFunction;\n            const testOuts = this.testLoop(f, ins, batchSize, args.verbose, args.steps);\n            return singletonOrArray(testOuts);\n        }\n        finally {\n            disposeNewTensors(standardizedOuts[0], x);\n            disposeNewTensors(standardizedOuts[1], y);\n        }\n    }\n    // TODO(cais): Add code snippet below once real dataset objects are\n    //   available.\n    /**\n     * Evaluate model using a dataset object.\n     *\n     * Note: Unlike `evaluate()`, this method is asynchronous (`async`).\n     *\n     * @param dataset A dataset object. Its `iterator()` method is expected\n     *   to generate a dataset iterator object, the `next()` method of which\n     *   is expected to produce data batches for evaluation. The return value\n     *   of the `next()` call ought to contain a boolean `done` field and a\n     *   `value` field. The `value` field is expected to be an array of two\n     *   `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n     *   case is for models with exactly one input and one output (e.g.\n     *   a sequential model). The latter case is for models with multiple\n     *   inputs and/or multiple outputs. Of the two items in the array, the\n     *   first is the input feature(s) and the second is the output target(s).\n     * @param args A configuration object for the dataset-based evaluation.\n     * @returns Loss and metric values as an Array of `Scalar` objects.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    async evaluateDataset(dataset, args) {\n        this.makeTestFunction();\n        return evaluateDataset(this, dataset, args);\n    }\n    /**\n     * Get number of samples provided for training, evaluation or prediction.\n     *\n     * @param ins Input `tf.Tensor`.\n     * @param batchSize Integer batch size, optional.\n     * @param steps Total number of steps (batches of samples) before\n     * declaring loop finished. Optional.\n     * @param stepsName The public API's parameter name for `steps`.\n     * @returns Number of samples provided.\n     */\n    checkNumSamples(ins, batchSize, steps, stepsName = 'steps') {\n        let numSamples;\n        if (steps != null) {\n            numSamples = null;\n            if (batchSize != null) {\n                throw new ValueError(`If ${stepsName} is set, batchSize must be null or undefined.` +\n                    `Got batchSize = ${batchSize}`);\n            }\n        }\n        else if (ins != null) {\n            if (Array.isArray(ins)) {\n                numSamples = ins[0].shape[0];\n            }\n            else {\n                numSamples = ins.shape[0];\n            }\n        }\n        else {\n            throw new ValueError(`Either the input data should have a defined shape, or ` +\n                `${stepsName} shoud be specified.`);\n        }\n        return numSamples;\n    }\n    /**\n     * Execute internal tensors of the model with input data feed.\n     * @param inputs Input data feed. Must match the inputs of the model.\n     * @param outputs Names of the output tensors to be fetched. Must match\n     *   names of the SymbolicTensors that belong to the graph.\n     * @returns Fetched values for `outputs`.\n     */\n    execute(inputs, outputs) {\n        if (Array.isArray(outputs) && outputs.length === 0) {\n            throw new ValueError('`outputs` is an empty Array, which is not allowed.');\n        }\n        const outputsIsArray = Array.isArray(outputs);\n        const outputNames = (outputsIsArray ? outputs : [outputs]);\n        const outputSymbolicTensors = this.retrieveSymbolicTensors(outputNames);\n        // Format the input into a FeedDict.\n        const feedDict = new FeedDict();\n        if (inputs instanceof Tensor) {\n            inputs = [inputs];\n        }\n        if (Array.isArray(inputs)) {\n            if (inputs.length !== this.inputs.length) {\n                throw new ValueError(`The number of inputs provided (${inputs.length}) ` +\n                    `does not match the number of inputs of this model ` +\n                    `(${this.inputs.length}).`);\n            }\n            for (let i = 0; i < this.inputs.length; ++i) {\n                feedDict.add(this.inputs[i], inputs[i]);\n            }\n        }\n        else {\n            for (const input of this.inputs) {\n                const tensorValue = inputs[input.name];\n                if (tensorValue == null) {\n                    throw new ValueError(`No value is provided for the model's input ${input.name}`);\n                }\n                feedDict.add(input, tensorValue);\n            }\n        }\n        // Run execution.\n        const executeOutputs = execute(outputSymbolicTensors, feedDict);\n        return outputsIsArray ? executeOutputs : executeOutputs[0];\n    }\n    /**\n     * Retrieve the model's internal symbolic tensors from symbolic-tensor names.\n     */\n    retrieveSymbolicTensors(symbolicTensorNames) {\n        const outputSymbolicTensors = pyListRepeat(null, symbolicTensorNames.length);\n        let outputsRemaining = symbolicTensorNames.length;\n        for (const layer of this.layers) {\n            const layerOutputs = Array.isArray(layer.output) ? layer.output : [layer.output];\n            const layerOutputNames = layerOutputs.map(output => output.name);\n            for (let i = 0; i < symbolicTensorNames.length; ++i) {\n                const index = layerOutputNames.indexOf(symbolicTensorNames[i]);\n                if (index !== -1) {\n                    outputSymbolicTensors[i] = layerOutputs[index];\n                    outputsRemaining--;\n                }\n                if (outputsRemaining === 0) {\n                    break;\n                }\n            }\n            if (outputsRemaining === 0) {\n                break;\n            }\n        }\n        if (outputsRemaining > 0) {\n            const remainingNames = [];\n            outputSymbolicTensors.forEach((tensor, i) => {\n                if (tensor == null) {\n                    remainingNames.push(symbolicTensorNames[i]);\n                }\n            });\n            throw new ValueError(`Cannot find SymbolicTensors for output name(s): ` +\n                `${JSON.stringify(remainingNames)}`);\n        }\n        return outputSymbolicTensors;\n    }\n    /**\n     * Helper method to loop over some data in batches.\n     *\n     * Porting Note: Not using the functional approach in the Python equivalent\n     *   due to the imperative backend.\n     * Porting Note: Does not support step mode currently.\n     *\n     * @param ins: input data\n     * @param batchSize: integer batch size.\n     * @param verbose: verbosity model\n     * @returns: Predictions as `tf.Tensor` (if a single output) or an `Array` of\n     *   `tf.Tensor` (if multipe outputs).\n     */\n    predictLoop(ins, batchSize = 32, verbose = false) {\n        return tfc.tidy(() => {\n            const numSamples = this.checkNumSamples(ins);\n            if (verbose) {\n                throw new NotImplementedError('Verbose predictLoop() is not implemented yet.');\n            }\n            // Sample-based predictions.\n            // Porting Note: Tensor currently does not support sliced assignments as\n            //   in numpy, e.g., x[1:3] = y. Therefore we use concatenation while\n            //   iterating over the batches.\n            const batches = makeBatches(numSamples, batchSize);\n            const outsBatches = this.outputs.map(output => []);\n            // TODO(cais): Can the scope() be pushed down inside the for loop?\n            for (let batchIndex = 0; batchIndex < batches.length; ++batchIndex) {\n                const batchOuts = tfc.tidy(() => {\n                    const batchStart = batches[batchIndex][0];\n                    const batchEnd = batches[batchIndex][1];\n                    // TODO(cais): Take care of the case of the last element is a flag for\n                    //   training/test.\n                    const insBatch = sliceArrays(ins, batchStart, batchEnd);\n                    // Construct the feeds for execute();\n                    const feeds = [];\n                    if (Array.isArray(insBatch)) {\n                        for (let i = 0; i < insBatch.length; ++i) {\n                            feeds.push({ key: this.inputs[i], value: insBatch[i] });\n                        }\n                    }\n                    else {\n                        feeds.push({ key: this.inputs[0], value: insBatch });\n                    }\n                    const feedDict = new FeedDict(feeds);\n                    return execute(this.outputs, feedDict);\n                });\n                batchOuts.forEach((batchOut, i) => outsBatches[i].push(batchOut));\n            }\n            return singletonOrArray(outsBatches.map(batches => tfc.concat(batches, 0)));\n        });\n    }\n    /**\n     * Generates output predictions for the input samples.\n     *\n     * Computation is done in batches.\n     *\n     * Note: the \"step\" mode of predict() is currently not supported.\n     *   This is because the TensorFlow.js core backend is imperative only.\n     *\n     * ```js\n     * const model = tf.sequential({\n     *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n     * });\n     * model.predict(tf.ones([8, 10]), {batchSize: 4}).print();\n     * ```\n     *\n     * @param x The input data, as a Tensor, or an `Array` of `tf.Tensor`s if\n     *   the model has multiple inputs.\n     * @param args A `ModelPredictArgs` object containing optional fields.\n     *\n     * @return Prediction results as a `tf.Tensor`(s).\n     *\n     * @exception ValueError In case of mismatch between the provided input data\n     *   and the model's expectations, or in case a stateful model receives a\n     *   number of samples that is not a multiple of the batch size.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    predict(x, args = {}) {\n        const xsRank2OrHigher = ensureTensorsRank2OrHigher(x);\n        checkInputData(xsRank2OrHigher, this.inputNames, this.feedInputShapes, false);\n        try {\n            // TODO(cais): Take care of stateful models.\n            //   if (this.stateful) ...\n            // TODO(cais): Take care of the learning_phase boolean flag.\n            //   if (this.useLearningPhase) ...\n            const batchSize = args.batchSize == null ? 32 : args.batchSize;\n            checkBatchSize(batchSize);\n            return this.predictLoop(xsRank2OrHigher, batchSize);\n        }\n        finally {\n            disposeNewTensors(xsRank2OrHigher, x);\n        }\n    }\n    /**\n     * Returns predictions for a single batch of samples.\n     *\n     * ```js\n     * const model = tf.sequential({\n     *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n     * });\n     * model.predictOnBatch(tf.ones([8, 10])).print();\n     * ```\n     * @param x: Input samples, as a Tensor (for models with exactly one\n     *   input) or an array of Tensors (for models with more than one input).\n     * @return Tensor(s) of predictions\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    predictOnBatch(x) {\n        checkInputData(x, this.inputNames, this.feedInputShapes, true);\n        // TODO(cais): Take care of the learning_phase boolean flag.\n        //   if (this.useLearningPhase) ...\n        const batchSize = (Array.isArray(x) ? x[0] : x).shape[0];\n        return this.predictLoop(x, batchSize);\n    }\n    standardizeUserDataXY(x, y, checkBatchAxis = true, batchSize) {\n        // TODO(cais): Add sampleWeight, classWeight\n        if (this.optimizer_ == null) {\n            throw new RuntimeError('You must compile a model before training/testing. Use ' +\n                'LayersModel.compile(modelCompileArgs).');\n        }\n        const outputShapes = [];\n        for (let i = 0; i < this.feedOutputShapes.length; ++i) {\n            const outputShape = this.feedOutputShapes[i];\n            const lossFn = this.feedLossFns[i];\n            if (lossFn === losses.sparseCategoricalCrossentropy) {\n                outputShapes.push(outputShape.slice(0, outputShape.length - 1).concat([1]));\n            }\n            else {\n                // Porting Note: Because of strong typing `lossFn` must be a function.\n                outputShapes.push(outputShape);\n            }\n        }\n        x = standardizeInputData(x, this.feedInputNames, this.feedInputShapes, false, 'input');\n        y = standardizeInputData(y, this.feedOutputNames, outputShapes, false, 'target');\n        // TODO(cais): Standardize sampleWeights & classWeights.\n        checkArrayLengths(x, y, null);\n        // TODO(cais): Check sampleWeights as well.\n        checkLossAndTargetCompatibility(y, this.feedLossFns, this.feedOutputShapes);\n        if (this.stateful && batchSize != null && batchSize > 0) {\n            if (x[0].shape[0] % batchSize !== 0) {\n                throw new ValueError(`In a stateful network, you should only pass inputs with a ` +\n                    `number of samples that is divisible by the batch size ` +\n                    `${batchSize}. Found: ${x[0].shape[0]} sample(s).`);\n            }\n        }\n        return [x, y];\n    }\n    async standardizeUserData(x, y, sampleWeight, classWeight, checkBatchAxis = true, batchSize) {\n        const [standardXs, standardYs] = this.standardizeUserDataXY(x, y, checkBatchAxis, batchSize);\n        // TODO(cais): Handle sampleWeights.\n        if (sampleWeight != null) {\n            throw new Error('sample weight is not supported yet.');\n        }\n        let standardSampleWeights = null;\n        if (classWeight != null) {\n            const classWeights = standardizeClassWeights(classWeight, this.outputNames);\n            standardSampleWeights = [];\n            for (let i = 0; i < classWeights.length; ++i) {\n                standardSampleWeights.push(await standardizeWeights(standardYs[i], null, classWeights[i]));\n            }\n        }\n        // TODO(cais): Deal with the case of model.stateful == true.\n        return [standardXs, standardYs, standardSampleWeights];\n    }\n    /**\n     * Loop over some test data in batches.\n     * @param f A Function returning a list of tensors.\n     * @param ins Array of tensors to be fed to `f`.\n     * @param batchSize Integer batch size or `null` / `undefined`.\n     * @param verbose verbosity mode.\n     * @param steps Total number of steps (batches of samples) before\n     * declaring test finished. Ignored with the default value of `null` /\n     * `undefined`.\n     * @returns Array of Scalars.\n     */\n    testLoop(f, ins, batchSize, verbose = 0, steps) {\n        return tfc.tidy(() => {\n            const numSamples = this.checkNumSamples(ins, batchSize, steps, 'steps');\n            const outs = [];\n            if (verbose > 0) {\n                throw new NotImplementedError('Verbose mode is not implemented yet.');\n            }\n            // TODO(cais): Use `indicesForConversionToDense' to prevent slow down.\n            if (steps != null) {\n                throw new NotImplementedError('steps mode in testLoop() is not implemented yet');\n            }\n            else {\n                const batches = makeBatches(numSamples, batchSize);\n                const indexArray = tensor1d(range(0, numSamples));\n                for (let batchIndex = 0; batchIndex < batches.length; ++batchIndex) {\n                    const batchStart = batches[batchIndex][0];\n                    const batchEnd = batches[batchIndex][1];\n                    const batchIds = K.sliceAlongFirstAxis(indexArray, batchStart, batchEnd - batchStart);\n                    // TODO(cais): In ins, train flag can be a number, instead of an\n                    //   Tensor? Do we need to handle this in tfjs-layers?\n                    const insBatch = sliceArraysByIndices(ins, batchIds);\n                    const batchOuts = f(insBatch);\n                    if (batchIndex === 0) {\n                        for (let i = 0; i < batchOuts.length; ++i) {\n                            outs.push(scalar(0));\n                        }\n                    }\n                    for (let i = 0; i < batchOuts.length; ++i) {\n                        const batchOut = batchOuts[i];\n                        outs[i] =\n                            tfc.add(outs[i], tfc.mul(batchEnd - batchStart, batchOut));\n                    }\n                }\n                for (let i = 0; i < outs.length; ++i) {\n                    outs[i] = tfc.div(outs[i], numSamples);\n                }\n            }\n            return outs;\n        });\n    }\n    getDedupedMetricsNames() {\n        const outLabels = this.metricsNames;\n        // Rename duplicated metrics names (can happen with an output layer\n        // shared among multiple dataflows).\n        const dedupedOutLabels = [];\n        for (let i = 0; i < outLabels.length; ++i) {\n            const label = outLabels[i];\n            let newLabel = label;\n            if (count(outLabels, label) > 1) {\n                const dupIndex = count(outLabels.slice(0, i), label);\n                newLabel += `_${dupIndex}`;\n            }\n            dedupedOutLabels.push(newLabel);\n        }\n        return dedupedOutLabels;\n    }\n    /**\n     * Creates a function that performs the following actions:\n     *\n     * 1. computes the losses\n     * 2. sums them to get the total loss\n     * 3. call the optimizer computes the gradients of the LayersModel's\n     *    trainable weights w.r.t. the total loss and update the variables\n     * 4. calculates the metrics\n     * 5. returns the values of the losses and metrics.\n     */\n    makeTrainFunction() {\n        return (data) => {\n            const lossValues = [];\n            const inputs = data.slice(0, this.inputs.length);\n            const targets = data.slice(this.inputs.length, this.inputs.length + this.outputs.length);\n            const sampleWeights = data.slice(this.inputs.length + this.outputs.length, this.inputs.length + this.outputs.length * 2);\n            const metricsValues = [];\n            // Create a function that computes the total loss based on the\n            // inputs. This function is used for obtaining gradients through\n            // backprop.\n            const totalLossFunction = () => {\n                const feeds = [];\n                for (let i = 0; i < this.inputs.length; ++i) {\n                    feeds.push({ key: this.inputs[i], value: inputs[i] });\n                }\n                const feedDict = new FeedDict(feeds);\n                const outputs = execute(this.outputs, feedDict, { 'training': true });\n                // TODO(cais): Take care of the case of multiple outputs from a\n                //   single layer?\n                let totalLoss;\n                for (let i = 0; i < this.lossFunctions.length; ++i) {\n                    const lossFunction = this.lossFunctions[i];\n                    let loss = lossFunction(targets[i], outputs[i]);\n                    if (sampleWeights[i] != null) {\n                        loss = computeWeightedLoss(loss, sampleWeights[i]);\n                    }\n                    // TODO(cais): push Scalar instead.\n                    const meanLoss = tfc.mean(loss);\n                    // TODO(cais): Use a scope() instead, to avoid ownership.\n                    lossValues.push(meanLoss);\n                    if (i === 0) {\n                        totalLoss = loss;\n                    }\n                    else {\n                        totalLoss = tfc.add(totalLoss, loss);\n                    }\n                }\n                // Compute the metrics.\n                // TODO(cais): These should probably be calculated outside\n                //   totalLossFunction to benefit speed?\n                for (let i = 0; i < this.metricsTensors.length; ++i) {\n                    let weightedMetric;\n                    if (this.outputs.length > 1 && i < this.outputs.length) {\n                        weightedMetric = lossValues[i];\n                    }\n                    else {\n                        const metric = this.metricsTensors[i][0];\n                        const outputIndex = this.metricsTensors[i][1];\n                        weightedMetric =\n                            tfc.mean(metric(targets[outputIndex], outputs[outputIndex]));\n                    }\n                    tfc.keep(weightedMetric);\n                    // TODO(cais): Use a scope() instead, to avoid ownership.\n                    metricsValues.push(weightedMetric);\n                }\n                totalLoss = tfc.mean(totalLoss);\n                // Add regularizer penalties.\n                this.calculateLosses().forEach(regularizerLoss => {\n                    totalLoss = tfc.add(totalLoss, regularizerLoss);\n                });\n                return totalLoss;\n            };\n            const variables = this.collectedTrainableWeights.map(param => param.read());\n            const returnCost = true;\n            const totalLossValue = this.optimizer_.minimize(totalLossFunction, returnCost, variables);\n            return [totalLossValue].concat(metricsValues);\n        };\n    }\n    /**\n     * Create a function which, when invoked with an array of `tf.Tensor`s as a\n     * batch of inputs, returns the prespecified loss and metrics of the model\n     * under the batch of input data.\n     */\n    makeTestFunction() {\n        this.testFunction = (data) => {\n            return tfc.tidy(() => {\n                const valOutputs = [];\n                let totalLoss;\n                const inputs = data.slice(0, this.inputs.length);\n                const targets = data.slice(this.inputs.length, this.inputs.length + this.outputs.length);\n                const feeds = [];\n                for (let i = 0; i < this.inputs.length; ++i) {\n                    feeds.push({ key: this.inputs[i], value: inputs[i] });\n                }\n                const feedDict = new FeedDict(feeds);\n                const outputs = execute(this.outputs, feedDict);\n                // Compute total loss.\n                for (let i = 0; i < this.lossFunctions.length; ++i) {\n                    const lossFunction = this.lossFunctions[i];\n                    // TODO(cais): Add sample weighting and replace the simple\n                    // averaging.\n                    const loss = tfc.mean(lossFunction(targets[i], outputs[i]));\n                    if (i === 0) {\n                        totalLoss = loss;\n                    }\n                    else {\n                        totalLoss = tfc.add(totalLoss, loss);\n                    }\n                    valOutputs.push(totalLoss);\n                }\n                // Compute the metrics.\n                for (let i = 0; i < this.metricsTensors.length; ++i) {\n                    const metric = this.metricsTensors[i][0];\n                    const outputIndex = this.metricsTensors[i][1];\n                    // TODO(cais): Replace K.mean() with a proper weighting function.\n                    const meanMetric = tfc.mean(metric(targets[outputIndex], outputs[outputIndex]));\n                    valOutputs.push(meanMetric);\n                }\n                return valOutputs;\n            });\n        };\n    }\n    /**\n     * Trains the model for a fixed number of epochs (iterations on a\n     * dataset).\n     *\n     * ```js\n     * const model = tf.sequential({\n     *     layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n     * });\n     * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n     * for (let i = 1; i < 5 ; ++i) {\n     *   const h = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), {\n     *       batchSize: 4,\n     *       epochs: 3\n     *   });\n     *   console.log(\"Loss after Epoch \" + i + \" : \" + h.history.loss[0]);\n     * }\n     * ```\n     *\n     * @param x `tf.Tensor` of training data, or an array of `tf.Tensor`s if the\n     * model has multiple inputs. If all inputs in the model are named, you\n     * can also pass a dictionary mapping input names to `tf.Tensor`s.\n     * @param y `tf.Tensor` of target (label) data, or an array of `tf.Tensor`s if\n     * the model has multiple outputs. If all outputs in the model are named,\n     * you can also pass a dictionary mapping output names to `tf.Tensor`s.\n     * @param args A `ModelFitArgs`, containing optional fields.\n     *\n     * @return A `History` instance. Its `history` attribute contains all\n     *   information collected during training.\n     *\n     * @exception ValueError In case of mismatch between the provided input\n     * data and what the model expects.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    async fit(x, y, args = {}) {\n        return fitTensors(this, x, y, args);\n    }\n    // TODO(cais): Add code snippet below when it's possible to instantiate\n    //   actual dataset objects.\n    /**\n     * Trains the model using a dataset object.\n     *\n     * @param dataset A dataset object. Its `iterator()` method is expected\n     *   to generate a dataset iterator object, the `next()` method of which\n     *   is expected to produce data batches for training. The return value\n     *   of the `next()` call ought to contain a boolean `done` field and a\n     *   `value` field. The `value` field is expected to be an array of two\n     *   `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n     *   case is for models with exactly one input and one output (e.g.\n     *   a sequential model). The latter case is for models with multiple\n     *   inputs and/or multiple outputs.\n     *   Of the two items in the array, the first is the input feature(s) and\n     *   the second is the output target(s).\n     * @param args A `ModelFitDatasetArgs`, containing optional fields.\n     *\n     * @return A `History` instance. Its `history` attribute contains all\n     *   information collected during training.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    async fitDataset(dataset, args) {\n        return fitDataset(this, dataset, args);\n    }\n    /**\n     * Runs a single gradient update on a single batch of data.\n     *\n     * This method differs from `fit()` and `fitDataset()` in the following\n     * regards:\n     *   - It operates on exactly one batch of data.\n     *   - It returns only the loss and metric values, instead of\n     *     returning the batch-by-batch loss and metric values.\n     *   - It doesn't support fine-grained options such as verbosity and\n     *     callbacks.\n     *\n     * @param x Input data. It could be one of the following:\n     *   - A `tf.Tensor`, or an Array of `tf.Tensor`s (in case the model has\n     *     multiple inputs).\n     *   - An Object mapping input names to corresponding `tf.Tensor` (if the\n     *     model has named inputs).\n     * @param y Target data. It could be either a `tf.Tensor` or multiple\n     *   `tf.Tensor`s. It should be consistent with `x`.\n     * @returns Training loss or losses (in case the model has\n     *   multiple outputs), along with metrics (if any), as numbers.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    async trainOnBatch(x, y) {\n        // TODO(cais): Support sampleWeight and classWeight.\n        // TODO(cais): Support Dataset objects.\n        const standardizeOut = await this.standardizeUserData(x, y);\n        const inputs = standardizeOut[0];\n        const targets = standardizeOut[1];\n        const trainFunction = this.makeTrainFunction();\n        const losses = trainFunction(inputs.concat(targets));\n        const lossValues = [];\n        for (const loss of losses) {\n            const v = await loss.data();\n            lossValues.push(v[0]);\n        }\n        tfc.dispose(losses);\n        disposeNewTensors(standardizeOut[0], x);\n        disposeNewTensors(standardizeOut[1], y);\n        return singletonOrArray(lossValues);\n    }\n    /**\n     * Extract weight values of the model.\n     *\n     * @param config: An instance of `io.SaveConfig`, which specifies\n     * model-saving options such as whether only trainable weights are to be\n     * saved.\n     * @returns A `NamedTensorMap` mapping original weight names (i.e.,\n     *   non-uniqueified weight names) to their values.\n     */\n    getNamedWeights(config) {\n        const namedWeights = [];\n        const trainableOnly = config != null && config.trainableOnly;\n        const weights = trainableOnly ? this.trainableWeights : this.weights;\n        const weightValues = this.getWeights(trainableOnly);\n        for (let i = 0; i < weights.length; ++i) {\n            if (trainableOnly && !weights[i].trainable) {\n                // Optionally skip non-trainable weights.\n                continue;\n            }\n            namedWeights.push({ name: weights[i].originalName, tensor: weightValues[i] });\n        }\n        return namedWeights;\n    }\n    /**\n     * Setter used for force stopping of LayersModel.fit() (i.e., training).\n     *\n     * Example:\n     *\n     * ```js\n     * const input = tf.input({shape: [10]});\n     * const output = tf.layers.dense({units: 1}).apply(input);\n     * const model = tf.model({inputs: [input], outputs: [output]});\n     * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n     * const xs = tf.ones([8, 10]);\n     * const ys = tf.zeros([8, 1]);\n     *\n     * const history = await model.fit(xs, ys, {\n     *   epochs: 10,\n     *   callbacks: {\n     *     onEpochEnd: async (epoch, logs) => {\n     *       if (epoch === 2) {\n     *         model.stopTraining = true;\n     *       }\n     *     }\n     *   }\n     * });\n     *\n     * // There should be only 3 values in the loss array, instead of 10\n     * values,\n     * // due to the stopping after 3 epochs.\n     * console.log(history.history.loss);\n     * ```\n     */\n    set stopTraining(stop) {\n        this.stopTraining_ = stop;\n    }\n    get stopTraining() {\n        return this.stopTraining_;\n    }\n    get optimizer() {\n        return this.optimizer_;\n    }\n    set optimizer(optimizer) {\n        if (this.optimizer_ !== optimizer) {\n            this.optimizer_ = optimizer;\n            this.isOptimizerOwned = false;\n        }\n    }\n    dispose() {\n        const result = super.dispose();\n        if (result.refCountAfterDispose === 0 && this.optimizer != null &&\n            this.isOptimizerOwned) {\n            const numTensorsBeforeOptmizerDisposal = tfc.memory().numTensors;\n            this.optimizer_.dispose();\n            result.numDisposedVariables +=\n                numTensorsBeforeOptmizerDisposal - tfc.memory().numTensors;\n        }\n        return result;\n    }\n    getLossIdentifiers() {\n        let lossNames;\n        if (typeof this.loss === 'string') {\n            lossNames = toSnakeCase(this.loss);\n        }\n        else if (Array.isArray(this.loss)) {\n            for (const loss of this.loss) {\n                if (typeof loss !== 'string') {\n                    throw new Error('Serialization of non-string loss is not supported.');\n                }\n            }\n            lossNames = this.loss.map(name => toSnakeCase(name));\n        }\n        else {\n            const outputNames = Object.keys(this.loss);\n            lossNames = {};\n            const losses = this.loss;\n            for (const outputName of outputNames) {\n                if (typeof losses[outputName] === 'string') {\n                    lossNames[outputName] =\n                        toSnakeCase(losses[outputName]);\n                }\n                else {\n                    throw new Error('Serialization of non-string loss is not supported.');\n                }\n            }\n        }\n        return lossNames;\n    }\n    getMetricIdentifiers() {\n        if (typeof this.metrics === 'string' ||\n            typeof this.metrics === 'function') {\n            return [toSnakeCase(Metrics.getLossOrMetricName(this.metrics))];\n        }\n        else if (Array.isArray(this.metrics)) {\n            return this.metrics.map(metric => toSnakeCase(Metrics.getLossOrMetricName(metric)));\n        }\n        else {\n            const metricsIdentifiers = {};\n            for (const key in this.metrics) {\n                metricsIdentifiers[key] =\n                    toSnakeCase(Metrics.getLossOrMetricName(this.metrics[key]));\n            }\n            return metricsIdentifiers;\n        }\n    }\n    getTrainingConfig() {\n        return {\n            loss: this.getLossIdentifiers(),\n            metrics: this.getMetricIdentifiers(),\n            optimizer_config: {\n                class_name: this.optimizer.getClassName(),\n                config: this.optimizer.getConfig()\n            }\n        };\n        // TODO(cais): Add weight_metrics when they are supported.\n        // TODO(cais): Add sample_weight_mode when it's supported.\n        // TODO(cais): Add loss_weights when it's supported.\n    }\n    loadTrainingConfig(trainingConfig) {\n        if (trainingConfig.weighted_metrics != null) {\n            throw new Error('Loading weight_metrics is not supported yet.');\n        }\n        if (trainingConfig.loss_weights != null) {\n            throw new Error('Loading loss_weights is not supported yet.');\n        }\n        if (trainingConfig.sample_weight_mode != null) {\n            throw new Error('Loading sample_weight_mode is not supported yet.');\n        }\n        const tsConfig = convertPythonicToTs(trainingConfig.optimizer_config);\n        const optimizer = deserialize(tsConfig);\n        let loss;\n        if (typeof trainingConfig.loss === 'string') {\n            loss = toCamelCase(trainingConfig.loss);\n        }\n        else if (Array.isArray(trainingConfig.loss)) {\n            loss = trainingConfig.loss.map(lossEntry => toCamelCase(lossEntry));\n        }\n        else if (trainingConfig.loss != null) {\n            loss = {};\n            for (const key in trainingConfig.loss) {\n                loss[key] = toCamelCase(trainingConfig.loss[key]);\n            }\n        }\n        let metrics;\n        if (Array.isArray(trainingConfig.metrics)) {\n            metrics = trainingConfig.metrics.map(metric => toCamelCase(metric));\n        }\n        else if (trainingConfig.metrics != null) {\n            metrics = {};\n            for (const key in trainingConfig.metrics) {\n                metrics[key] = toCamelCase(trainingConfig.metrics[key]);\n            }\n        }\n        this.compile({ loss, metrics, optimizer });\n    }\n    /**\n     * Save the configuration and/or weights of the LayersModel.\n     *\n     * An `IOHandler` is an object that has a `save` method of the proper\n     * signature defined. The `save` method manages the storing or\n     * transmission of serialized data (\"artifacts\") that represent the\n     * model's topology and weights onto or via a specific medium, such as\n     * file downloads, local storage, IndexedDB in the web browser and HTTP\n     * requests to a server. TensorFlow.js provides `IOHandler`\n     * implementations for a number of frequently used saving mediums, such as\n     * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io`\n     * for more details.\n     *\n     * This method also allows you to refer to certain types of `IOHandler`s\n     * as URL-like string shortcuts, such as 'localstorage://' and\n     * 'indexeddb://'.\n     *\n     * Example 1: Save `model`'s topology and weights to browser [local\n     * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n     * then load it back.\n     *\n     * ```js\n     * const model = tf.sequential(\n     *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n     * console.log('Prediction from original model:');\n     * model.predict(tf.ones([1, 3])).print();\n     *\n     * const saveResults = await model.save('localstorage://my-model-1');\n     *\n     * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1');\n     * console.log('Prediction from loaded model:');\n     * loadedModel.predict(tf.ones([1, 3])).print();\n     * ```\n     *\n     * Example 2. Saving `model`'s topology and weights to browser\n     * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API);\n     * then load it back.\n     *\n     * ```js\n     * const model = tf.sequential(\n     *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n     * console.log('Prediction from original model:');\n     * model.predict(tf.ones([1, 3])).print();\n     *\n     * const saveResults = await model.save('indexeddb://my-model-1');\n     *\n     * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1');\n     * console.log('Prediction from loaded model:');\n     * loadedModel.predict(tf.ones([1, 3])).print();\n     * ```\n     *\n     * Example 3. Saving `model`'s topology and weights as two files\n     * (`my-model-1.json` and `my-model-1.weights.bin`) downloaded from\n     * browser.\n     *\n     * ```js\n     * const model = tf.sequential(\n     *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n     * const saveResults = await model.save('downloads://my-model-1');\n     * ```\n     *\n     * Example 4. Send  `model`'s topology and weights to an HTTP server.\n     * See the documentation of `tf.io.http` for more details\n     * including specifying request parameters and implementation of the\n     * server.\n     *\n     * ```js\n     * const model = tf.sequential(\n     *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n     * const saveResults = await model.save('http://my-server/model/upload');\n     * ```\n     *\n     * @param handlerOrURL An instance of `IOHandler` or a URL-like,\n     * scheme-based string shortcut for `IOHandler`.\n     * @param config Options for saving the model.\n     * @returns A `Promise` of `SaveResult`, which summarizes the result of\n     * the saving, such as byte sizes of the saved artifacts for the model's\n     *   topology and weight values.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n     */\n    async save(handlerOrURL, config) {\n        if (typeof handlerOrURL === 'string') {\n            const handlers = io.getSaveHandlers(handlerOrURL);\n            if (handlers.length === 0) {\n                throw new ValueError(`Cannot find any save handlers for URL '${handlerOrURL}'`);\n            }\n            else if (handlers.length > 1) {\n                throw new ValueError(`Found more than one (${handlers.length}) save handlers for ` +\n                    `URL '${handlerOrURL}'`);\n            }\n            handlerOrURL = handlers[0];\n        }\n        if (handlerOrURL.save == null) {\n            throw new ValueError('LayersModel.save() cannot proceed because the IOHandler ' +\n                'provided does not have the `save` attribute defined.');\n        }\n        const weightDataAndSpecs = await io.encodeWeights(this.getNamedWeights(config));\n        const returnString = false;\n        const unusedArg = null;\n        const modelConfig = this.toJSON(unusedArg, returnString);\n        const modelArtifacts = {\n            modelTopology: modelConfig,\n            format: LAYERS_MODEL_FORMAT_NAME,\n            generatedBy: `TensorFlow.js tfjs-layers v${version}`,\n            convertedBy: null,\n        };\n        const includeOptimizer = config == null ? false : config.includeOptimizer;\n        if (includeOptimizer && this.optimizer != null) {\n            modelArtifacts.trainingConfig = this.getTrainingConfig();\n            const weightType = 'optimizer';\n            const { data: optimizerWeightData, specs: optimizerWeightSpecs } = await io.encodeWeights(await this.optimizer.getWeights(), weightType);\n            weightDataAndSpecs.specs.push(...optimizerWeightSpecs);\n            weightDataAndSpecs.data = io.concatenateArrayBuffers([weightDataAndSpecs.data, optimizerWeightData]);\n        }\n        if (this.userDefinedMetadata != null) {\n            // Check serialized size of user-defined metadata.\n            const checkSize = true;\n            checkUserDefinedMetadata(this.userDefinedMetadata, this.name, checkSize);\n            modelArtifacts.userDefinedMetadata = this.userDefinedMetadata;\n        }\n        modelArtifacts.weightData = weightDataAndSpecs.data;\n        modelArtifacts.weightSpecs = weightDataAndSpecs.specs;\n        return handlerOrURL.save(modelArtifacts);\n    }\n    /**\n     * Set user-defined metadata.\n     *\n     * The set metadata will be serialized together with the topology\n     * and weights of the model during `save()` calls.\n     *\n     * @param setUserDefinedMetadata\n     */\n    setUserDefinedMetadata(userDefinedMetadata) {\n        checkUserDefinedMetadata(userDefinedMetadata, this.name);\n        this.userDefinedMetadata = userDefinedMetadata;\n    }\n    /**\n     * Get user-defined metadata.\n     *\n     * The metadata is supplied via one of the two routes:\n     *   1. By calling `setUserDefinedMetadata()`.\n     *   2. Loaded during model loading (if the model is constructed\n     *      via `tf.loadLayersModel()`.)\n     *\n     * If no user-defined metadata is available from either of the\n     * two routes, this function will return `undefined`.\n     */\n    getUserDefinedMetadata() {\n        return this.userDefinedMetadata;\n    }\n}\n// The class name is 'Model' rather than 'LayersModel' for backwards\n// compatibility since this class name shows up in the serialization format.\n/** @nocollapse */\nLayersModel.className = 'Model';\nserialization.registerClass(LayersModel);\n/**\n * A `tf.Functional` is an alias to `tf.LayersModel`.\n *\n * See also:\n *   `tf.LayersModel`, `tf.Sequential`, `tf.loadLayersModel`.\n */\n/** @doc {heading: 'Models', subheading: 'Classes'} */\nexport class Functional extends LayersModel {\n}\nFunctional.className = 'Functional';\nserialization.registerClass(Functional);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhaW5pbmcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvZW5naW5lL3RyYWluaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgseUNBQXlDO0FBRXpDLE9BQU8sS0FBSyxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFDLEVBQUUsRUFBMEQsU0FBUyxFQUFVLE1BQU0sRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFZLFFBQVEsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3SyxPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBRTdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDcEMsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFlBQVksRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFLeEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxNQUFNLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sS0FBSyxPQUFPLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sS0FBSyxVQUFVLE1BQU0sZUFBZSxDQUFDO0FBRTVDLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDL0csT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw4QkFBOEIsQ0FBQztBQUVqRSxPQUFPLEVBQUMsT0FBTyxFQUFD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bUIsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUM7U0FDL0Q7UUFFRCxjQUFjLENBQUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNwRCxjQUFjLENBQUMsV0FBVyxHQUFHLGtCQUFrQixDQUFDLEtBQUssQ0FBQztRQUN0RCxPQUFPLFlBQVksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxzQkFBc0IsQ0FBQyxtQkFBdUI7UUFDNUMsd0JBQXdCLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQztJQUNqRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNILHNCQUFzQjtRQUNwQixPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztJQUNsQyxDQUFDOztBQTc0Q0Qsb0VBQW9FO0FBQ3BFLDRFQUE0RTtBQUM1RSxrQkFBa0I7QUFDWCxxQkFBUyxHQUFHLE9BQU8sQ0FBQztBQTQ0QzdCLGFBQWEsQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFekM7Ozs7O0dBS0c7QUFDSCxzREFBc0Q7QUFDdEQsTUFBTSxPQUFPLFVBQVcsU0FBUSxXQUFXOztBQUNsQyxvQkFBUyxHQUFHLFlBQVksQ0FBQztBQUVsQyxhQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyogT3JpZ2luYWwgU291cmNlOiBlbmdpbmUvdHJhaW5pbmcucHkgKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2lvLCBNb2RlbFByZWRpY3RDb25maWcgYXMgTW9kZWxQcmVkaWN0QXJncywgTmFtZWRUZW5zb3JNYXAsIE9wdGltaXplciwgU2NhbGFyLCBzY2FsYXIsIHNlcmlhbGl6YXRpb24sIFRlbnNvciwgVGVuc29yMUQsIHRlbnNvcjFkLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQgKiBhcyBLIGZyb20gJy4uL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7SGlzdG9yeSwgTW9kZWxMb2dnaW5nVmVyYm9zaXR5fSBmcm9tICcuLi9iYXNlX2NhbGxiYWNrcyc7XG5pbXBvcnQge25hbWVTY29wZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvciwgUnVudGltZUVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0xvc3NJZGVudGlmaWVyfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvbG9zc19jb25maWcnO1xuaW1wb3J0IHtPcHRpbWl6ZXJTZXJpYWxpemF0aW9ufSBmcm9tICcuLi9rZXJhc19mb3JtYXQvb3B0aW1pemVyX2NvbmZpZyc7XG5pbXBvcnQge01ldHJpY3NJZGVudGlmaWVyLCBUcmFpbmluZ0NvbmZpZ30gZnJvbSAnLi4va2VyYXNfZm9ybWF0L3RyYWluaW5nX2NvbmZpZyc7XG5pbXBvcnQge2Rlc2VyaWFsaXplfSBmcm9tICcuLi9sYXllcnMvc2VyaWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyBsb3NzZXMgZnJvbSAnLi4vbG9zc2VzJztcbmltcG9ydCAqIGFzIE1ldHJpY3MgZnJvbSAnLi4vbWV0cmljcyc7XG5pbXBvcnQgKiBhcyBvcHRpbWl6ZXJzIGZyb20gJy4uL29wdGltaXplcnMnO1xuaW1wb3J0IHtMb3NzT3JNZXRyaWNGbiwgTmFtZWRUZW5zb3J9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7Y2hlY2tVc2VyRGVmaW5lZE1ldGFkYXRhfSBmcm9tICcuLi91c2VyX2RlZmluZWRfbWV0YWRhdGEnO1xuaW1wb3J0IHtjb3VudCwgcHlMaXN0UmVwZWF0LCBzaW5nbGV0b25PckFycmF5LCB0b0NhbWVsQ2FzZSwgdG9TbmFrZUNhc2UsIHVuaXF1ZX0gZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge3ByaW50U3VtbWFyeX0gZnJvbSAnLi4vdXRpbHMvbGF5ZXJfdXRpbHMnO1xuaW1wb3J0IHtyYW5nZX0gZnJvbSAnLi4vdXRpbHMvbWF0aF91dGlscyc7XG5pbXBvcnQge2NvbnZlcnRQeXRob25pY1RvVHN9IGZyb20gJy4uL3V0aWxzL3NlcmlhbGl6YXRpb25fdXRpbHMnO1xuaW1wb3J0IHtMYXllclZhcmlhYmxlfSBmcm9tICcuLi92YXJpYWJsZXMnO1xuaW1wb3J0IHt2ZXJzaW9ufSBmcm9tICcuLi92ZXJzaW9uJztcblxuaW1wb3J0IHtDb250YWluZXIsIENvbnRhaW5lckFyZ3N9IGZyb20gJy4vY29udGFpbmVyJztcbmltcG9ydCB7RGF0YXNldH0gZnJvbSAnLi9kYXRhc2V0X3N0dWInO1xuaW1wb3J0IHtleGVjdXRlLCBGZWVkRGljdH0gZnJvbSAnLi9leGVjdXRvcic7XG5pbXBvcnQge0Rpc3Bvc2VSZXN1bHQsIFN5bWJvbGljVGVuc29yfSBmcm9tICcuL3RvcG9sb2d5JztcbmltcG9ydCB7ZXZhbHVhdGVEYXRhc2V0LCBmaXREYXRhc2V0LCBNb2RlbEV2YWx1YXRlRGF0YXNldEFyZ3MsIE1vZGVsRml0RGF0YXNldEFyZ3N9IGZyb20gJy4vdHJhaW5pbmdfZGF0YXNldCc7XG5pbXBvcnQge2NoZWNrQmF0Y2hTaXplLCBkaXNwb3NlTmV3VGVuc29ycywgZW5zdXJlVGVuc29yc1JhbmsyT3JIaWdoZXIsIGZpdFRlbnNvcnMsIG1ha2VCYXRjaGVzLCBNb2RlbEZpdEFyZ3MsIHNsaWNlQXJyYXlzLCBzbGljZUFycmF5c0J5SW5kaWNlc30gZnJvbSAnLi90cmFpbmluZ190ZW5zb3JzJztcbmltcG9ydCB7Q2xhc3NXZWlnaHQsIENsYXNzV2VpZ2h0TWFwLCBjb21wdXRlV2VpZ2h0ZWRMb3NzLCBzdGFuZGFyZGl6ZUNsYXNzV2VpZ2h0cywgc3RhbmRhcmRpemVXZWlnaHRzfSBmcm9tICcuL3RyYWluaW5nX3V0aWxzJztcblxuLyoqXG4gKiBIZWxwZXIgZnVuY3Rpb24gZm9yIHBvbHltb3JwaGljIGlucHV0IGRhdGE6IDEuIHNpbmdsZXRvbiBUZW5zb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0RhdGFUZW5zb3IoeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yW119KTogYm9vbGVhbiB7XG4gIHJldHVybiB4IGluc3RhbmNlb2YgVGVuc29yO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgcG9seW1vcnBoaWMgaW5wdXQgZGF0YTogMi4gQXJyYXkgb2YgVGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhQXJyYXkoeDogVGVuc29yfFRlbnNvcltdfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9KTogYm9vbGVhbiB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KHgpO1xufVxuXG4vKipcbiAqIEhlbHBlciBmdW5jdGlvbiBmb3IgcG9seW1vcnBoaWMgaW5wdXQgZGF0YTogMy4gXCJkaWN0XCIgb2YgVGVuc29yLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEYXRhRGljdCh4OiBUZW5zb3J8VGVuc29yW118XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSk6IGJvb2xlYW4ge1xuICByZXR1cm4gIWlzRGF0YVRlbnNvcih4KSAmJiAhaXNEYXRhQXJyYXkoeCk7XG59XG5cbi8qKlxuICogTm9ybWFsaXplcyBpbnB1dHMgYW5kIHRhcmdldHMgcHJvdmlkZWQgYnkgdXNlcnMuXG4gKiBAcGFyYW0gZGF0YSBVc2VyLXByb3ZpZGVkIGlucHV0IGRhdGEgKHBvbHltb3JwaGljKS5cbiAqIEBwYXJhbSBuYW1lcyBBbiBBcnJheSBvZiBleHBlY3RlZCBUZW5zb3IgbmFtZXMuXG4gKiBAcGFyYW0gc2hhcGVzIE9wdGlvbmFsIEFycmF5IG9mIGV4cGVjdGVkIFRlbnNvciBzaGFwZXMuXG4gKiBAcGFyYW0gY2hlY2tCYXRjaEF4aXMgV2hldGhlciB0byBjaGVjayB0aGF0IHRoZSBiYXRjaCBheGlzIG9mIHRoZSBhcnJheXNcbiAqICAgbWF0Y2ggIHRoZSBleHBlY3RlZCB2YWx1ZSBmb3VuZCBpbiBgc2hhcGVzYC5cbiAqIEBwYXJhbSBleGNlcHRpb25QcmVmaXggU3RyaW5nIHByZWZpeCB1c2VkIGZvciBleGNlcHRpb24gZm9ybWF0dGluZy5cbiAqIEByZXR1cm5zIExpc3Qgb2Ygc3RhbmRhcmRpemVkIGlucHV0IFRlbnNvcnMgKG9uZSBUZW5zb3IgcGVyIG1vZGVsIGlucHV0KS5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvcjogaW4gY2FzZSBvZiBpbXByb3Blcmx5IGZvcm1hdHRlZCB1c2VyIGRhdGEuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFyZGl6ZUlucHV0RGF0YShcbiAgICBkYXRhOiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sIG5hbWVzOiBzdHJpbmdbXSxcbiAgICBzaGFwZXM/OiBTaGFwZVtdLCBjaGVja0JhdGNoQXhpcyA9IHRydWUsIGV4Y2VwdGlvblByZWZpeCA9ICcnKTogVGVuc29yW10ge1xuICBpZiAobmFtZXMgPT0gbnVsbCB8fCBuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAvLyBDaGVjayBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIG1vZGVsIGV4cGVjdGVkIG5vIGRhdGEsIGJ1dCBzb21lIGRhdGEgZ290XG4gICAgLy8gc2VudC5cbiAgICBpZiAoZGF0YSAhPSBudWxsKSB7XG4gICAgICBsZXQgZ290VW5leHBlY3RlZERhdGEgPSBmYWxzZTtcbiAgICAgIGlmIChpc0RhdGFBcnJheShkYXRhKSAmJiAoZGF0YSBhcyBUZW5zb3JbXSkubGVuZ3RoID4gMCkge1xuICAgICAgICBnb3RVbmV4cGVjdGVkRGF0YSA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGlzRGF0YURpY3QoZGF0YSkpIHtcbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgIGlmIChkYXRhLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgIGdvdFVuZXhwZWN0ZWREYXRhID0gdHJ1ZTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gYGRhdGFgIGlzIGEgc2luZ2xldG9uIFRlbnNvciBpbiB0aGlzIGNhc2UuXG4gICAgICAgIGdvdFVuZXhwZWN0ZWREYXRhID0gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGlmIChnb3RVbmV4cGVjdGVkRGF0YSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciB3aGVuIGNoZWNraW5nIG1vZGVsICR7ZXhjZXB0aW9uUHJlZml4fSBleHBlY3RlZCBubyBkYXRhLCBgICtcbiAgICAgICAgICAgIGBidXQgZ290ICR7ZGF0YX1gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmIChkYXRhID09IG51bGwpIHtcbiAgICByZXR1cm4gbmFtZXMubWFwKG5hbWUgPT4gbnVsbCk7XG4gIH1cblxuICBsZXQgYXJyYXlzOiBUZW5zb3JbXTtcbiAgaWYgKGlzRGF0YURpY3QoZGF0YSkpIHtcbiAgICBkYXRhID0gZGF0YSBhcyB7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfTtcbiAgICBhcnJheXMgPSBbXTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgIGlmIChkYXRhW25hbWVdID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgTm8gZGF0YSBwcm92aWRlZCBmb3IgXCIke25hbWV9XCIuIE5lZWQgZGF0YSBmb3IgZWFjaCBrZXkgaW46IGAgK1xuICAgICAgICAgICAgYCR7bmFtZXN9YCk7XG4gICAgICB9XG4gICAgICBhcnJheXMucHVzaChkYXRhW25hbWVdKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaXNEYXRhQXJyYXkoZGF0YSkpIHtcbiAgICBkYXRhID0gZGF0YSBhcyBUZW5zb3JbXTtcbiAgICBpZiAoZGF0YS5sZW5ndGggIT09IG5hbWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEVycm9yIHdoZW4gY2hlY2tpbmcgbW9kZWwgJHtleGNlcHRpb25QcmVmaXh9OiB0aGUgQXJyYXkgb2YgYCArXG4gICAgICAgICAgYFRlbnNvcnMgdGhhdCB5b3UgYXJlIHBhc3NpbmcgdG8geW91ciBtb2RlbCBpcyBub3QgdGhlIHNpemUgdGhlIGAgK1xuICAgICAgICAgIGBtb2RlbCBleHBlY3RlZC4gRXhwZWN0ZWQgdG8gc2VlICR7bmFtZXMubGVuZ3RofSBUZW5zb3IocyksIGJ1dCBgICtcbiAgICAgICAgICBgaW5zdGVhZCBnb3QgdGhlIGZvbGxvd2luZyBsaXN0IG9mIFRlbnNvcihzKTogJHtkYXRhfWApO1xuICAgIH1cbiAgICBhcnJheXMgPSBkYXRhO1xuICB9IGVsc2Uge1xuICAgIGRhdGEgPSBkYXRhIGFzIFRlbnNvcjtcbiAgICBpZiAobmFtZXMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBtb2RlbCAke2V4Y2VwdGlvblByZWZpeH0gZXhwZWN0cyAke25hbWVzLmxlbmd0aH0gVGVuc29yKHMpLCBgICtcbiAgICAgICAgICBgYnV0IG9ubHkgcmVjZWl2ZWQgb25lIFRlbnNvci4gRm91bmQ6IFRlbnNvciB3aXRoIHNoYXBlICR7XG4gICAgICAgICAgICAgIGRhdGEuc2hhcGV9YCk7XG4gICAgfVxuICAgIGFycmF5cyA9IFtkYXRhXTtcbiAgfVxuXG4gIGFycmF5cyA9IGVuc3VyZVRlbnNvcnNSYW5rMk9ySGlnaGVyKGFycmF5cyk7XG5cbiAgLy8gQ2hlY2sgc2hhcGUgY29tcGF0aWJpbGl0eS5cbiAgaWYgKHNoYXBlcyAhPSBudWxsKSB7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuYW1lcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKHNoYXBlc1tpXSA9PSBudWxsKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgYXJyYXkgPSBhcnJheXNbaV07XG4gICAgICBpZiAoYXJyYXkuc2hhcGUubGVuZ3RoICE9PSBzaGFwZXNbaV0ubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYEVycm9yIHdoZW4gY2hlY2tpbmcgJHtleGNlcHRpb25QcmVmaXh9OiBleHBlY3RlZCAke25hbWVzW2ldfSBgICtcbiAgICAgICAgICAgIGB0byBoYXZlICR7c2hhcGVzW2ldLmxlbmd0aH0gZGltZW5zaW9uKHMpLiBidXQgZ290IGFycmF5IHdpdGggYCArXG4gICAgICAgICAgICBgc2hhcGUgJHthcnJheS5zaGFwZX1gKTtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2hhcGVzW2ldLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGlmIChqID09PSAwICYmICFjaGVja0JhdGNoQXhpcykge1xuICAgICAgICAgIC8vIFNraXAgdGhlIGZpcnN0IChiYXRjaCkgYXhpcy5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkaW0gPSBhcnJheS5zaGFwZVtqXTtcbiAgICAgICAgY29uc3QgcmVmRGltID0gc2hhcGVzW2ldW2pdO1xuICAgICAgICBpZiAocmVmRGltICE9IG51bGwgJiYgcmVmRGltID49IDAgJiYgZGltICE9PSByZWZEaW0pIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYCR7ZXhjZXB0aW9uUHJlZml4fSBleHBlY3RlZCBhIGJhdGNoIG9mIGVsZW1lbnRzIHdoZXJlIGVhY2ggYCArXG4gICAgICAgICAgICAgIGBleGFtcGxlIGhhcyBzaGFwZSBbJHtzaGFwZXNbaV0uc2xpY2UoMSwgc2hhcGVzW2ldLmxlbmd0aCl9XSBgICtcbiAgICAgICAgICAgICAgYChpLmUuLHRlbnNvciBzaGFwZSBbKiwke1xuICAgICAgICAgICAgICAgICAgc2hhcGVzW2ldLnNsaWNlKDEsIHNoYXBlc1tpXS5sZW5ndGgpfV0pYCArXG4gICAgICAgICAgICAgIGAgYnV0IHRoZSAke2V4Y2VwdGlvblByZWZpeH0gcmVjZWl2ZWQgYW4gaW5wdXQgd2l0aCAke1xuICAgICAgICAgICAgICAgICAgYXJyYXkuc2hhcGVbMF19YCArXG4gICAgICAgICAgICAgIGAgZXhhbXBsZXMsIGVhY2ggd2l0aCBzaGFwZSBbJHtcbiAgICAgICAgICAgICAgICAgIGFycmF5LnNoYXBlLnNsaWNlKDEsIGFycmF5LnNoYXBlLmxlbmd0aCl9XWAgK1xuICAgICAgICAgICAgICBgICh0ZW5zb3Igc2hhcGUgWyR7YXJyYXkuc2hhcGV9XSlgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYXJyYXlzO1xufVxuXG4vKipcbiAqIFVzZXIgaW5wdXQgdmFsaWRhdGlvbiBmb3IgVGVuc29ycy5cbiAqIEBwYXJhbSBpbnB1dHMgYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgZm9yIGlucHV0cy5cbiAqIEBwYXJhbSB0YXJnZXRzIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzIGZvciB0YXJnZXRzLlxuICogQHBhcmFtIHdlaWdodHMgT3B0aW9uYWwgYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgZm9yIHNhbXBsZSB3ZWlnaHRzLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBpbiBjYXNlIG9mIGluY29ycmVjdGx5IGZvcm1hdHRlZCBkYXRhLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY2hlY2tBcnJheUxlbmd0aHMoXG4gICAgaW5wdXRzOiBUZW5zb3JbXSwgdGFyZ2V0czogVGVuc29yW10sIHdlaWdodHM/OiBUZW5zb3JbXSkge1xuICBjb25zdCBzZXRYID0gdW5pcXVlKGlucHV0cy5tYXAoaW5wdXQgPT4gaW5wdXQuc2hhcGVbMF0pKTtcbiAgc2V0WC5zb3J0KCk7XG4gIGNvbnN0IHNldFkgPSB1bmlxdWUodGFyZ2V0cy5tYXAodGFyZ2V0ID0+IHRhcmdldC5zaGFwZVswXSkpO1xuICBzZXRZLnNvcnQoKTtcbiAgLy8gVE9ETyhjYWlzKTogQ2hlY2sgYHdlaWdodHNgIGFzIHdlbGwuXG4gIGlmIChzZXRYLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYEFsbCBpbnB1dCBUZW5zb3JzICh4KSBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygc2FtcGxlcy4gYCArXG4gICAgICAgIGBHb3QgYXJyYXkgc2hhcGVzOiBgICtcbiAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoaW5wdXRzLm1hcChpbnB1dCA9PiBpbnB1dC5zaGFwZSkpfWApO1xuICB9XG4gIGlmIChzZXRZLmxlbmd0aCA+IDEpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgYEFsbCB0YXJnZXQgVGVuc29ycyAoeSkgc2hvdWxkIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMuIGAgK1xuICAgICAgICBgR290IGFycmF5IHNoYXBlczogYCArXG4gICAgICAgIGAke0pTT04uc3RyaW5naWZ5KHRhcmdldHMubWFwKHRhcmdldCA9PiB0YXJnZXQuc2hhcGUpKX1gKTtcbiAgfVxuICBpZiAoc2V0WC5sZW5ndGggPiAwICYmIHNldFkubGVuZ3RoID4gMCAmJiAhdXRpbC5hcnJheXNFcXVhbChzZXRYLCBzZXRZKSkge1xuICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICBgSW5wdXQgVGVuc29ycyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygc2FtcGxlcyBhcyB0YXJnZXQgYCArXG4gICAgICAgIGBUZW5zb3JzLiBGb3VuZCAke3NldFhbMF19IGlucHV0IHNhbXBsZShzKSBhbmQgJHtzZXRZWzBdfSB0YXJnZXQgYCArXG4gICAgICAgIGBzYW1wbGUocykuYCk7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0aW9uIG9uIHRoZSBjb21wYXRpYmlsaXR5IG9mIHRhcmdlcyBhbmQgbG9zcyBmdW5jdGlvbnMuXG4gKlxuICogVGhpcyBoZWxwcyBwcmV2ZW50IHVzZXJzIGZyb20gdXNpbmcgbG9zcyBmdW5jdGlvbnMgaW5jb3JyZWN0bHkuXG4gKlxuICogQHBhcmFtIHRhcmdldHMgYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgb2YgdGFyZ2V0cy5cbiAqIEBwYXJhbSBsb3NzRm5zIGBBcnJheWAgb2YgbG9zcyBmdW5jdGlvbnMuXG4gKiBAcGFyYW0gb3V0cHV0U2hhcGVzIGBBcnJheWAgb2Ygc2hhcGVzIG9mIG1vZGVsIG91dHB1dHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrTG9zc0FuZFRhcmdldENvbXBhdGliaWxpdHkoXG4gICAgdGFyZ2V0czogVGVuc29yW10sIGxvc3NGbnM6IExvc3NPck1ldHJpY0ZuW10sIG91dHB1dFNoYXBlczogU2hhcGVbXSkge1xuICAvLyBUT0RPKGNhaXMpOiBEZWRpY2F0ZWQgdGVzdCBjb3ZlcmFnZT9cbiAgY29uc3Qga2V5TG9zc2VzID0gW1xuICAgIGxvc3Nlcy5tZWFuU3F1YXJlZEVycm9yLCBsb3NzZXMuYmluYXJ5Q3Jvc3NlbnRyb3B5LFxuICAgIGxvc3Nlcy5jYXRlZ29yaWNhbENyb3NzZW50cm9weVxuICBdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCB5ID0gdGFyZ2V0c1tpXTtcbiAgICBjb25zdCBsb3NzID0gbG9zc0Zuc1tpXTtcbiAgICBjb25zdCBzaGFwZSA9IG91dHB1dFNoYXBlc1tpXTtcbiAgICBpZiAobG9zcyA9PSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgaWYgKGxvc3MgPT09IGxvc3Nlcy5jYXRlZ29yaWNhbENyb3NzZW50cm9weSkge1xuICAgICAgaWYgKHkuc2hhcGVbeS5zaGFwZS5sZW5ndGggLSAxXSA9PT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBZb3UgYXJlIHBhc3NpbmcgYSB0YXJnZXQgYXJyYXkgb2Ygc2hhcGUgJHt5LnNoYXBlfSB3aGlsZSB1c2luZyBgICtcbiAgICAgICAgICAgIGBhIGxvc3MgJ2NhdGVnb3JpY2FsX2Nyb3NzZW50cm9weScuICdjYXRlZ29yaWNhbF9jcm9zc2VudHJvcHknYCArXG4gICAgICAgICAgICBgZXhwZWN0cyB0YXJnZXRzIHRvIGJlIGJpbmFyeSBtYXRyaWNlcyAoMXMgYW5kIDBzKSBvZiBzaGFwZSBgICtcbiAgICAgICAgICAgIGBbc2FtcGxlcywgY2xhc3Nlc10uYCk7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IEV4YW1wbGUgY29kZSBpbiBlcnJvciBtZXNzYWdlLlxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoa2V5TG9zc2VzLmluZGV4T2YobG9zcykgIT09IC0xKSB7XG4gICAgICBjb25zdCBzbGljZWRZU2hhcGUgPSB5LnNoYXBlLnNsaWNlKDEpO1xuICAgICAgY29uc3Qgc2xpY2VkU2hhcGUgPSBzaGFwZS5zbGljZSgxKTtcbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2xpY2VkWVNoYXBlLmxlbmd0aDsgKytqKSB7XG4gICAgICAgIGNvbnN0IHRhcmdldERpbSA9IHNsaWNlZFlTaGFwZVtqXTtcbiAgICAgICAgY29uc3Qgb3V0RGltID0gc2xpY2VkU2hhcGVbal07XG4gICAgICAgIGlmIChvdXREaW0gIT0gbnVsbCAmJiB0YXJnZXREaW0gIT09IG91dERpbSkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgQSB0YXJnZXQgVGVuc29yIHdpdGggc2hhcGUgJHt5LnNoYXBlfSB3YXMgcGFzc2VkIGZvciBhbiBgICtcbiAgICAgICAgICAgICAgYG91dHB1dCBvZiBzaGFwZSAke3NoYXBlfSwgd2hpbGUgdXNpbmcgYSBsb3NzIGZ1bmN0aW9uIHRoYXQgYCArXG4gICAgICAgICAgICAgIGBleHBlY3RzIHRhcmdldHMgdG8gaGF2ZSB0aGUgc2FtZSBzaGFwZSBhcyB0aGUgb3V0cHV0LmApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQ2hlY2sgaW5wdXRzIHByb3ZpZGVkIGJ5IHRoZSB1c2VyLlxuICpcbiAqIFBvcnRpbmcgTm90ZTogVGhpcyBjb3JyZXNwb25kcyB0byBfc3RhbmRhcmRpemVfaW5wdXRfZGF0YSgpIGluIFB5dGhvblxuICogICBLZXJhcy4gQmVjYXVzZSBvZiB0aGUgc3Ryb25nIHR5cGluZyBpbiBURi5qcywgd2UgZG8gbm90IG5lZWQgdG8gY29udmVydFxuICogICB0aGUgZGF0YS4gU3BlY2lmaWNhbGx5OlxuICogICAxKSBpbiBQeUtlcmFzLCBgZGF0YWAgY2FuIGJlIGBEYXRhRnJhbWVgIGluc3RhbmNlcyBmcm9tIHBhbmRhcywgZm9yXG4gKiAgICAgIGV4YW1wbGUuIFdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdCBoZXJlIGJlY2F1c2UgdGhlcmUgaXMgbm9cbiAqICAgICAgd2lkZWx5IHBvcHVsYXIgamF2YXNjcmlwdC90eXBlc2RjcmlwdCBlcXVpdmFsZW50IG9mIHBhbmRhcyAoc28gZmFyKS5cbiAqICAgICAgSWYgb25lIGJlY29tZXMgYXZhaWxhYmxlIGluIHRoZSBmdXR1cmUsIHdlIGNhbiBhZGQgc3VwcG9ydC5cbiAqICAgMikgaW4gUHlLZXJhcywgaW5wdXRzIGNhbiBiZSBQeXRob24gZGljdC4gQnV0IGhlcmUgd2UgYXJlIHN0aXB1bGF0aW5nXG4gKiB0aGF0IHRoZSBkYXRhIGlzIGVpdGhlciBhIHNpbmdsZSBgdGYuVGVuc29yYCBvciBhbiBBcnJheSBvZiBgdGYuVGVuc29yYHMuIFdlXG4gKiBtYXkgYWRkIHN1cHBvcnQgZm9yIGBPYmplY3RgIGRhdGEgaW5wdXRzIGluIHRoZSBmdXR1cmUgd2hlbiB0aGUgbmVlZFxuICogYXJpc2VzLlxuICpcbiAqIEluc3RlYWQsIHdlIHBlcmZvcm0gYmFzaWMgY2hlY2tzIGZvciBudW1iZXIgb2YgcGFyYW1ldGVycyBhbmQgc2hhcGVzLlxuICpcbiAqIEBwYXJhbSBkYXRhOiBUaGUgaW5wdXQgZGF0YS5cbiAqIEBwYXJhbSBuYW1lczogTmFtZSBmb3IgdGhlIGlucHV0cywgZnJvbSB0aGUgbW9kZWwuXG4gKiBAcGFyYW0gc2hhcGVzOiBFeHBlY3RlZCBzaGFwZXMgZm9yIHRoZSBpbnB1dCBkYXRhLCBmcm9tIHRoZSBtb2RlbC5cbiAqIEBwYXJhbSBjaGVja0JhdGNoQXhpczogV2hldGhlciB0aGUgc2l6ZSBhbG9uZyB0aGUgYmF0Y2ggYXhpcyAoaS5lLiwgdGhlXG4gKiAgIGZpcnN0IGRpbWVuc2lvbikgd2lsbCBiZSBjaGVja2VkIGZvciBtYXRjaGluZy5cbiAqIEBwYXJhbSBleGNlcHRpb25QcmVmaXg6IEV4ZWNwdGlvbiBwcmVmaXggbWVzc2FnZSwgdXNlZCBpbiBnZW5lcmF0aW5nIGVycm9yXG4gKiAgIG1lc3NhZ2VzLlxuICogQHRocm93cyBWYWx1ZUVycm9yOiBvbiBpbmNvcnJlY3QgbnVtYmVyIG9mIGlucHV0cyBvciBtaXNtYXRjaGVzIGluIHNoYXBlcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tJbnB1dERhdGEoXG4gICAgZGF0YTogVGVuc29yfFRlbnNvcltdLCBuYW1lczogc3RyaW5nW10sIHNoYXBlcz86IFNoYXBlW10sXG4gICAgY2hlY2tCYXRjaEF4aXMgPSB0cnVlLCBleGNlcHRpb25QcmVmaXggPSAnJykge1xuICBsZXQgYXJyYXlzOiBUZW5zb3JbXTtcbiAgaWYgKEFycmF5LmlzQXJyYXkoZGF0YSkpIHtcbiAgICBpZiAoZGF0YS5sZW5ndGggIT09IG5hbWVzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEVycm9yIHdoZW4gY2hlY2tpbmcgbW9kZWwgJHtleGNlcHRpb25QcmVmaXh9OiB0aGUgQXJyYXkgb2YgYCArXG4gICAgICAgICAgYFRlbnNvcnMgdGhhdCB5b3UgYXJlIHBhc3NpbmcgdG8geW91ciBtb2RlbCBpcyBub3QgdGhlIHNpemUgdGhlIGAgK1xuICAgICAgICAgIGB0aGUgbW9kZWwgZXhwZWN0ZWQuIEV4cGVjdGVkIHRvIHNlZSAke25hbWVzLmxlbmd0aH0gVGVuc29yKHMpLGAgK1xuICAgICAgICAgIGAgYnV0IGluc3RlYWQgZ290ICR7ZGF0YS5sZW5ndGh9IFRlbnNvcnMocykuYCk7XG4gICAgfVxuICAgIGFycmF5cyA9IGRhdGE7XG4gIH0gZWxzZSB7XG4gICAgaWYgKG5hbWVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBUaGUgbW9kZWwgZXhwZWN0cyAke25hbWVzLmxlbmd0aH0gJHtleGNlcHRpb25QcmVmaXh9IFRlbnNvcnMsIGAgK1xuICAgICAgICAgIGBidXQgb25seSByZWNlaXZlZCBvbmUgVGVuc29yLiBGb3VuZDogYXJyYXkgd2l0aCBzaGFwZSBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShkYXRhLnNoYXBlKX0uYCk7XG4gICAgfVxuICAgIGFycmF5cyA9IFtkYXRhXTtcbiAgfVxuXG4gIGlmIChzaGFwZXMgIT0gbnVsbCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChzaGFwZXNbaV0gPT0gbnVsbCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGFycmF5ID0gYXJyYXlzW2ldO1xuICAgICAgaWYgKGFycmF5LnNoYXBlLmxlbmd0aCAhPT0gc2hhcGVzW2ldLmxlbmd0aCkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBFcnJvciB3aGVuIGNoZWNraW5nICR7ZXhjZXB0aW9uUHJlZml4fTogZXhwZWN0ZWQgJHtuYW1lc1tpXX0gYCArXG4gICAgICAgICAgICBgdG8gaGF2ZSAke3NoYXBlc1tpXS5sZW5ndGh9IGRpbWVuc2lvbihzKSwgYnV0IGdvdCBhcnJheSB3aXRoIGAgK1xuICAgICAgICAgICAgYHNoYXBlICR7SlNPTi5zdHJpbmdpZnkoYXJyYXkuc2hhcGUpfWApO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzaGFwZXNbaV0ubGVuZ3RoOyArK2opIHtcbiAgICAgICAgaWYgKGogPT09IDAgJiYgIWNoZWNrQmF0Y2hBeGlzKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGltID0gYXJyYXkuc2hhcGVbal07XG4gICAgICAgIGNvbnN0IHJlZkRpbSA9IHNoYXBlc1tpXVtqXTtcbiAgICAgICAgaWYgKHJlZkRpbSAhPSBudWxsKSB7XG4gICAgICAgICAgaWYgKHJlZkRpbSAhPT0gZGltKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgICBgRXJyb3Igd2hlbiBjaGVja2luZyAke2V4Y2VwdGlvblByZWZpeH06IGV4cGVjdGVkIGAgK1xuICAgICAgICAgICAgICAgIGAke25hbWVzW2ldfSB0byBoYXZlIHNoYXBlICR7SlNPTi5zdHJpbmdpZnkoc2hhcGVzW2ldKX0gYnV0IGAgK1xuICAgICAgICAgICAgICAgIGBnb3QgYXJyYXkgd2l0aCBzaGFwZSAke0pTT04uc3RyaW5naWZ5KGFycmF5LnNoYXBlKX0uYCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogTWFwcyBtZXRyaWMgZnVuY3Rpb25zIHRvIG1vZGVsIG91dHB1dHMuXG4gKiBAcGFyYW0gbWV0cmljcyBBbiBzaG9ydGN1dCBzdHJpbmdzIG5hbWUsIG1ldHJpYyBmdW5jdGlvbiwgYEFycmF5YCBvciBkaWN0XG4gKiAgIChgT2JqZWN0YCkgb2YgbWV0cmljIGZ1bmN0aW9ucy5cbiAqIEBwYXJhbSBvdXRwdXROYW1lcyBBbiBgQXJyYXlgIG9mIHRoZSBuYW1lcyBvZiBtb2RlbCBvdXRwdXRzLlxuICogQHJldHVybnMgQW4gYEFycmF5YCAob25lIGVudHJ5IHBlciBtb2RlbCBvdXRwdXQpIG9mIGBBcnJheWAgb2YgbWV0cmljXG4gKiAgIGZ1bmN0aW9ucy4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbW9kZWwgaGFzIDIgb3V0cHV0cywgYW5kIGZvciB0aGUgZmlyc3RcbiAqICAgb3V0cHV0IHdlIHdhbnQgdG8gY29tcHV0ZSBgYmluYXJ5QWNjdXJhY3lgIGFuZCBgYmluYXJ5Q3Jvc3NlbnRyb3B5YCxcbiAqICAgYW5kIGp1c3QgYGJpbmFyeUFjY3VyYWN5YCBmb3IgdGhlIHNlY29uZCBvdXRwdXQsIHRoZSBgQXJyYXlgIHdvdWxkIGxvb2tcbiAqICAgbGlrZTpcbiAqICAgICBgW1tiaW5hcnlBY2N1cmFjeSwgYmluYXJ5Q3Jvc3NlbnRyb3B5XSwgIFtiaW5hcnlBY2N1cmFjeV1dYFxuICogQHRocm93cyBUeXBlRXJyb3I6IGluY29tcGF0aWJsZSBtZXRyaWNzIGZvcm1hdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbGxlY3RNZXRyaWNzKFxuICAgIG1ldHJpY3M6IHN0cmluZ3xMb3NzT3JNZXRyaWNGbnxBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+fFxuICAgIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nIHwgTG9zc09yTWV0cmljRm59LFxuICAgIG91dHB1dE5hbWVzOiBzdHJpbmdbXSk6IEFycmF5PEFycmF5PHN0cmluZ3xMb3NzT3JNZXRyaWNGbj4+IHtcbiAgaWYgKG1ldHJpY3MgPT0gbnVsbCB8fCBBcnJheS5pc0FycmF5KG1ldHJpY3MpICYmIG1ldHJpY3MubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIG91dHB1dE5hbWVzLm1hcChuYW1lID0+IFtdKTtcbiAgfVxuXG4gIGxldCB3cmFwcGVkTWV0cmljczogQXJyYXk8c3RyaW5nfExvc3NPck1ldHJpY0ZuPnxcbiAgICAgIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nIHwgTG9zc09yTWV0cmljRm59O1xuICBpZiAodHlwZW9mIG1ldHJpY3MgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBtZXRyaWNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgd3JhcHBlZE1ldHJpY3MgPSBbbWV0cmljc107XG4gIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXRyaWNzKSB8fCB0eXBlb2YgbWV0cmljcyA9PT0gJ29iamVjdCcpIHtcbiAgICB3cmFwcGVkTWV0cmljcyA9IG1ldHJpY3MgYXMgQXJyYXk8c3RyaW5nfExvc3NPck1ldHJpY0ZuPnxcbiAgICAgICAge1tvdXRwdXROYW1lOiBzdHJpbmddOiBzdHJpbmd9IHwge1tvdXRwdXROYW1lOiBzdHJpbmddOiBMb3NzT3JNZXRyaWNGbn07XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1R5cGUgb2YgbWV0cmljcyBhcmd1bWVudCBub3QgdW5kZXJzdG9vZC4gRXhwZWN0ZWQgYW4gc3RyaW5nLCcgK1xuICAgICAgICBgZnVuY3Rpb24sIEFycmF5LCBvciBPYmplY3QsIGZvdW5kOiAke21ldHJpY3N9YCk7XG4gIH1cblxuICBpZiAoQXJyYXkuaXNBcnJheSh3cmFwcGVkTWV0cmljcykpIHtcbiAgICAvLyBXZSB0aGVuIGFwcGx5IGFsbCBtZXRyaWNzIHRvIGFsbCBvdXRwdXRzLlxuICAgIHJldHVybiBvdXRwdXROYW1lcy5tYXAoXG4gICAgICAgIG5hbWUgPT4gd3JhcHBlZE1ldHJpY3MgYXMgQXJyYXk8c3RyaW5nfExvc3NPck1ldHJpY0ZuPik7XG4gIH0gZWxzZSB7XG4gICAgLy8gSW4gdGhpcyBjYXNlLCBtZXRyaWNzIGlzIGEgZGljdC5cbiAgICBjb25zdCBuZXN0ZWRNZXRyaWNzOiBBcnJheTxBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+PiA9IFtdO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvdXRwdXROYW1lcykge1xuICAgICAgbGV0IG91dHB1dE1ldHJpY3M6IHN0cmluZ3xMb3NzT3JNZXRyaWNGbnxBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+ID1cbiAgICAgICAgICB3cmFwcGVkTWV0cmljcy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IHdyYXBwZWRNZXRyaWNzW25hbWVdIDogW107XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3V0cHV0TWV0cmljcykpIHtcbiAgICAgICAgb3V0cHV0TWV0cmljcyA9IFtvdXRwdXRNZXRyaWNzXTtcbiAgICAgIH1cbiAgICAgIG5lc3RlZE1ldHJpY3MucHVzaChvdXRwdXRNZXRyaWNzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5lc3RlZE1ldHJpY3M7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBNb2RlbEV2YWx1YXRlQXJncyB7XG4gIC8qKlxuICAgKiBCYXRjaCBzaXplIChJbnRlZ2VyKS4gSWYgdW5zcGVjaWZpZWQsIGl0IHdpbGwgZGVmYXVsdCB0byAzMi5cbiAgICovXG4gIGJhdGNoU2l6ZT86IG51bWJlcjtcblxuICAvKipcbiAgICogVmVyYm9zaXR5IG1vZGUuXG4gICAqL1xuICB2ZXJib3NlPzogTW9kZWxMb2dnaW5nVmVyYm9zaXR5O1xuXG4gIC8qKlxuICAgKiBUZW5zb3Igb2Ygd2VpZ2h0cyB0byB3ZWlnaHQgdGhlIGNvbnRyaWJ1dGlvbiBvZiBkaWZmZXJlbnQgc2FtcGxlcyB0byB0aGVcbiAgICogbG9zcyBhbmQgbWV0cmljcy5cbiAgICovXG4gIHNhbXBsZVdlaWdodD86IFRlbnNvcjtcblxuICAvKipcbiAgICogaW50ZWdlcjogdG90YWwgbnVtYmVyIG9mIHN0ZXBzIChiYXRjaGVzIG9mIHNhbXBsZXMpXG4gICAqIGJlZm9yZSBkZWNsYXJpbmcgdGhlIGV2YWx1YXRpb24gcm91bmQgZmluaXNoZWQuIElnbm9yZWQgd2l0aCB0aGUgZGVmYXVsdFxuICAgKiB2YWx1ZSBvZiBgdW5kZWZpbmVkYC5cbiAgICovXG4gIHN0ZXBzPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIENvbmZpZ3VyYXRpb24gZm9yIGNhbGxzIHRvIGBMYXllcnNNb2RlbC5jb21waWxlKClgLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsQ29tcGlsZUFyZ3Mge1xuICAvKipcbiAgICogQW4gaW5zdGFuY2Ugb2YgYHRmLnRyYWluLk9wdGltaXplcmAgb3IgYSBzdHJpbmcgbmFtZSBmb3IgYW4gT3B0aW1pemVyLlxuICAgKi9cbiAgb3B0aW1pemVyOiBzdHJpbmd8T3B0aW1pemVyO1xuXG4gIC8qKlxuICAgKiBPYmplY3QgZnVuY3Rpb24ocykgb3IgbmFtZShzKSBvZiBvYmplY3QgZnVuY3Rpb24ocykuXG4gICAqIElmIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0cywgeW91IGNhbiB1c2UgYSBkaWZmZXJlbnQgbG9zc1xuICAgKiBvbiBlYWNoIG91dHB1dCBieSBwYXNzaW5nIGEgZGljdGlvbmFyeSBvciBhbiBBcnJheSBvZiBsb3NzZXMuXG4gICAqIFRoZSBsb3NzIHZhbHVlIHRoYXQgd2lsbCBiZSBtaW5pbWl6ZWQgYnkgdGhlIG1vZGVsIHdpbGwgdGhlbiBiZSB0aGUgc3VtXG4gICAqIG9mIGFsbCBpbmRpdmlkdWFsIGxvc3Nlcy5cbiAgICovXG4gIGxvc3M6IHN0cmluZ3xzdHJpbmdbXXx7W291dHB1dE5hbWU6IHN0cmluZ106IHN0cmluZ318TG9zc09yTWV0cmljRm58XG4gICAgICBMb3NzT3JNZXRyaWNGbltdfHtbb3V0cHV0TmFtZTogc3RyaW5nXTogTG9zc09yTWV0cmljRm59O1xuXG4gIC8qKlxuICAgKiBMaXN0IG9mIG1ldHJpY3MgdG8gYmUgZXZhbHVhdGVkIGJ5IHRoZSBtb2RlbCBkdXJpbmcgdHJhaW5pbmcgYW5kIHRlc3RpbmcuXG4gICAqIFR5cGljYWxseSB5b3Ugd2lsbCB1c2UgYG1ldHJpY3M9WydhY2N1cmFjeSddYC5cbiAgICogVG8gc3BlY2lmeSBkaWZmZXJlbnQgbWV0cmljcyBmb3IgZGlmZmVyZW50IG91dHB1dHMgb2YgYSBtdWx0aS1vdXRwdXRcbiAgICogbW9kZWwsIHlvdSBjb3VsZCBhbHNvIHBhc3MgYSBkaWN0aW9uYXJ5LlxuICAgKi9cbiAgbWV0cmljcz86IHN0cmluZ3xMb3NzT3JNZXRyaWNGbnxBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+fFxuICAgICAge1tvdXRwdXROYW1lOiBzdHJpbmddOiBzdHJpbmcgfCBMb3NzT3JNZXRyaWNGbn07XG5cbiAgLy8gVE9ETyhjYWlzKTogQWRkIGxvc3NXZWlnaHRzLCBzYW1wbGVXZWlnaHRNb2RlLCB3ZWlnaHRlZE1ldHJpY3MsIGFuZFxuICAvLyAgIHRhcmdldFRlbnNvcnMuXG59XG5cbmNvbnN0IExBWUVSU19NT0RFTF9GT1JNQVRfTkFNRSA9ICdsYXllcnMtbW9kZWwnO1xuXG4vKipcbiAqIEEgYHRmLkxheWVyc01vZGVsYCBpcyBhIGRpcmVjdGVkLCBhY3ljbGljIGdyYXBoIG9mIGB0Zi5MYXllcmBzIHBsdXMgbWV0aG9kc1xuICogZm9yIHRyYWluaW5nLCBldmFsdWF0aW9uLCBwcmVkaWN0aW9uIGFuZCBzYXZpbmcuXG4gKlxuICogYHRmLkxheWVyc01vZGVsYCBpcyB0aGUgYmFzaWMgdW5pdCBvZiB0cmFpbmluZywgaW5mZXJlbmNlIGFuZCBldmFsdWF0aW9uIGluXG4gKiBUZW5zb3JGbG93LmpzLiBUbyBjcmVhdGUgYSBgdGYuTGF5ZXJzTW9kZWxgLCB1c2UgYHRmLkxheWVyc01vZGVsYC5cbiAqXG4gKiBTZWUgYWxzbzpcbiAqICAgYHRmLlNlcXVlbnRpYWxgLCBgdGYubG9hZExheWVyc01vZGVsYC5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICovXG5leHBvcnQgY2xhc3MgTGF5ZXJzTW9kZWwgZXh0ZW5kcyBDb250YWluZXIgaW1wbGVtZW50cyB0ZmMuSW5mZXJlbmNlTW9kZWwge1xuICAvLyBUaGUgY2xhc3MgbmFtZSBpcyAnTW9kZWwnIHJhdGhlciB0aGFuICdMYXllcnNNb2RlbCcgZm9yIGJhY2t3YXJkc1xuICAvLyBjb21wYXRpYmlsaXR5IHNpbmNlIHRoaXMgY2xhc3MgbmFtZSBzaG93cyB1cCBpbiB0aGUgc2VyaWFsaXphdGlvbiBmb3JtYXQuXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ01vZGVsJztcbiAgcHJvdGVjdGVkIG9wdGltaXplcl86IE9wdGltaXplcjtcbiAgLy8gV2hldGhlciB0aGUgbW9kZWwgaW5zdGFuY2Ugb3ducyB0aGUgb3B0aW1pemVyOiBgdHJ1ZWAgaWYgYW5kIG9ubHkgaWZcbiAgLy8gYG9wdGltaXplcmAgaXMgY3JlYXRlZCBmcm9tIGEgc3RyaW5nIHBhcmFtZXRlciBkdXJpbmcgYGNvbXBpbGUoKWAgY2FsbC5cbiAgcHJvdGVjdGVkIGlzT3B0aW1pemVyT3duZWQ6IGJvb2xlYW47XG5cbiAgbG9zczogc3RyaW5nfHN0cmluZ1tdfHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nfXxMb3NzT3JNZXRyaWNGbnxcbiAgICAgIExvc3NPck1ldHJpY0ZuW118e1tvdXRwdXROYW1lOiBzdHJpbmddOiBMb3NzT3JNZXRyaWNGbn07XG4gIGxvc3NGdW5jdGlvbnM6IExvc3NPck1ldHJpY0ZuW107XG5cbiAgLy8gVE9ETyhjYWlzKTogVGhlc2UgcHJpdmF0ZSB2YXJpYWJsZXMgc2hvdWxkIHByb2JhYmx5IG5vdCBoYXZlIHRoZSBzdHJpbmdcbiAgLy8gICAnZmVlZCcgaW4gdGhlaXIgbmFtZXMsIGJlY2F1c2Ugd2UgYXJlIG5vdCBkZWFsaW5nIHdpdGggYSBzeW1ib2xpY1xuICAvLyAgIGJhY2tlbmQuXG4gIHByaXZhdGUgZmVlZE91dHB1dFNoYXBlczogU2hhcGVbXTtcbiAgcHJpdmF0ZSBmZWVkTG9zc0ZuczogTG9zc09yTWV0cmljRm5bXTtcbiAgcHJpdmF0ZSBjb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzOiBMYXllclZhcmlhYmxlW107XG4gIHByaXZhdGUgdGVzdEZ1bmN0aW9uOiAoZGF0YTogVGVuc29yW10pID0+IFNjYWxhcltdO1xuICBoaXN0b3J5OiBIaXN0b3J5O1xuXG4gIC8vIEEgcHVibGljIHByb3BlcnR5IHRoYXQgY2FuIGJlIHNldCBieSBDYWxsYmFja3MgdG8gb3JkZXIgZWFybHkgc3RvcHBpbmdcbiAgLy8gZHVyaW5nIGBmaXQoKWAgY2FsbHMuXG4gIHByb3RlY3RlZCBzdG9wVHJhaW5pbmdfOiBib29sZWFuO1xuICBwcm90ZWN0ZWQgaXNUcmFpbmluZzogYm9vbGVhbjtcblxuICBtZXRyaWNzOiBzdHJpbmd8TG9zc09yTWV0cmljRm58QXJyYXk8c3RyaW5nfExvc3NPck1ldHJpY0ZuPnxcbiAgICAgIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nIHwgTG9zc09yTWV0cmljRm59O1xuICBtZXRyaWNzTmFtZXM6IHN0cmluZ1tdO1xuICAvLyBQb3J0aW5nIE5vdGU6IGBtZXRyaWNzX3RlbnNvcnNgIGluIFB5S2VyYXMgaXMgYSBzeW1ib2xpYyB0ZW5zb3IuIEJ1dCBnaXZlblxuICAvLyAgIHRoZSBpbXBlcmF0aXZlIG5hdHVyZSBvZiB0ZmpzLWNvcmUsIGBtZXRyaWNzVGVuc29yc2AgaXMgYVxuICAvLyAgIFR5cGVTY3JpcHQgZnVuY3Rpb24gaGVyZS5cbiAgLy8gICBBbHNvIG5vdGUgdGhhdCBkdWUgdG8gdGhlIGltcGVyYXRpdmUgbmF0dXJlIG9mIHRmanMtY29yZSwgYG1ldHJpY3NUZW5zb3JgXG4gIC8vICAgaGVyZSBuZWVkcyBhbiBvdXRwdXQgaW5kZXggdG8ga2VlcCB0cmFjayBvZiB3aGljaCBvdXRwdXQgb2YgdGhlXG4gIC8vICAgTGF5ZXJzTW9kZWwgYSBtZXRyaWMgYmVsb25ncyB0by4gVGhpcyBpcyB1bmxpa2UgYG1ldHJpY3NfdGVuc29yc2AgaW5cbiAgLy8gICBQeUtlcmFzLCB3aGljaCBpcyBhIGBsaXN0YCBvZiBzeW1ib2xpYyB0ZW5zb3JzLCBlYWNoIG9mIHdoaWNoIGhhc1xuICAvLyAgIGltcGxpY2l0IFwia25vd2xlZGdlXCIgb2YgdGhlIG91dHB1dHMgaXQgZGVwZW5kcyBvbi5cbiAgbWV0cmljc1RlbnNvcnM6IEFycmF5PFtMb3NzT3JNZXRyaWNGbiwgbnVtYmVyXT47XG5cbiAgLy8gVXNlciBkZWZpbmQgbWV0YWRhdGEgKGlmIGFueSkuXG4gIHByaXZhdGUgdXNlckRlZmluZWRNZXRhZGF0YToge307XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ29udGFpbmVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRoaXMuaXNUcmFpbmluZyA9IGZhbHNlO1xuICB9XG5cbiAgLyoqXG4gICAqIFByaW50IGEgdGV4dCBzdW1tYXJ5IG9mIHRoZSBtb2RlbCdzIGxheWVycy5cbiAgICpcbiAgICogVGhlIHN1bW1hcnkgaW5jbHVkZXNcbiAgICogLSBOYW1lIGFuZCB0eXBlIG9mIGFsbCBsYXllcnMgdGhhdCBjb21wcmlzZSB0aGUgbW9kZWwuXG4gICAqIC0gT3V0cHV0IHNoYXBlKHMpIG9mIHRoZSBsYXllcnNcbiAgICogLSBOdW1iZXIgb2Ygd2VpZ2h0IHBhcmFtZXRlcnMgb2YgZWFjaCBsYXllclxuICAgKiAtIElmIHRoZSBtb2RlbCBoYXMgbm9uLXNlcXVlbnRpYWwtbGlrZSB0b3BvbG9neSwgdGhlIGlucHV0cyBlYWNoIGxheWVyXG4gICAqICAgcmVjZWl2ZXNcbiAgICogLSBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYWluYWJsZSBhbmQgbm9uLXRyYWluYWJsZSBwYXJhbWV0ZXJzIG9mIHRoZSBtb2RlbC5cbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMTBdfSk7XG4gICAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIwXX0pO1xuICAgKiBjb25zdCBkZW5zZTEgPSB0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiA0fSkuYXBwbHkoaW5wdXQxKTtcbiAgICogY29uc3QgZGVuc2UyID0gdGYubGF5ZXJzLmRlbnNlKHt1bml0czogOH0pLmFwcGx5KGlucHV0Mik7XG4gICAqIGNvbnN0IGNvbmNhdCA9IHRmLmxheWVycy5jb25jYXRlbmF0ZSgpLmFwcGx5KFtkZW5zZTEsIGRlbnNlMl0pO1xuICAgKiBjb25zdCBvdXRwdXQgPVxuICAgKiAgICAgdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMywgYWN0aXZhdGlvbjogJ3NvZnRtYXgnfSkuYXBwbHkoY29uY2F0KTtcbiAgICpcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5tb2RlbCh7aW5wdXRzOiBbaW5wdXQxLCBpbnB1dDJdLCBvdXRwdXRzOiBvdXRwdXR9KTtcbiAgICogbW9kZWwuc3VtbWFyeSgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGxpbmVMZW5ndGggQ3VzdG9tIGxpbmUgbGVuZ3RoLCBpbiBudW1iZXIgb2YgY2hhcmFjdGVycy5cbiAgICogQHBhcmFtIHBvc2l0aW9ucyBDdXN0b20gd2lkdGhzIG9mIGVhY2ggb2YgdGhlIGNvbHVtbnMsIGFzIGVpdGhlclxuICAgKiAgIGZyYWN0aW9ucyBvZiBgbGluZUxlbmd0aGAgKGUuZy4sIGBbMC41LCAwLjc1LCAxXWApIG9yIGFic29sdXRlIG51bWJlclxuICAgKiAgIG9mIGNoYXJhY3RlcnMgKGUuZy4sIGBbMzAsIDUwLCA2NV1gKS4gRWFjaCBudW1iZXIgY29ycmVzcG9uZHMgdG9cbiAgICogICByaWdodC1tb3N0IChpLmUuLCBlbmRpbmcpIHBvc2l0aW9uIG9mIGEgY29sdW1uLlxuICAgKiBAcGFyYW0gcHJpbnRGbiBDdXN0b20gcHJpbnQgZnVuY3Rpb24uIENhbiBiZSB1c2VkIHRvIHJlcGxhY2UgdGhlIGRlZmF1bHRcbiAgICogICBgY29uc29sZS5sb2dgLiBGb3IgZXhhbXBsZSwgeW91IGNhbiB1c2UgYHggPT4ge31gIHRvIG11dGUgdGhlIHByaW50ZWRcbiAgICogICBtZXNzYWdlcyBpbiB0aGUgY29uc29sZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIHN1bW1hcnkoXG4gICAgICBsaW5lTGVuZ3RoPzogbnVtYmVyLCBwb3NpdGlvbnM/OiBudW1iZXJbXSxcbiAgICAgIHByaW50Rm46XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgKG1lc3NhZ2U/OiBhbnksIC4uLm9wdGlvbmFsUGFyYW1zOiBhbnlbXSkgPT4gdm9pZCA9IGNvbnNvbGUubG9nKSB7XG4gICAgaWYgKCF0aGlzLmJ1aWx0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVGhpcyBtb2RlbCBoYXMgbmV2ZXIgYmVlbiBjYWxsZWQsIHRodXMgaXRzIHdlaWdodHMgaGF2ZSBub3QgYmVlbiBgICtcbiAgICAgICAgICBgY3JlYXRlZCB5ZXQuIFNvIG5vIHN1bW1hcnkgY2FuIGJlIGRpc3BsYXllZC4gQnVpbGQgdGhlIG1vZGVsIGAgK1xuICAgICAgICAgIGBmaXJzdCAoZS5nLiwgYnkgY2FsbGluZyBpdCBvbiBzb21lIHRlc3QgZGF0YSkuYCk7XG4gICAgfVxuICAgIHByaW50U3VtbWFyeSh0aGlzLCBsaW5lTGVuZ3RoLCBwb3NpdGlvbnMsIHByaW50Rm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbmZpZ3VyZXMgYW5kIHByZXBhcmVzIHRoZSBtb2RlbCBmb3IgdHJhaW5pbmcgYW5kIGV2YWx1YXRpb24uICBDb21waWxpbmdcbiAgICogb3V0Zml0cyB0aGUgbW9kZWwgd2l0aCBhbiBvcHRpbWl6ZXIsIGxvc3MsIGFuZC9vciBtZXRyaWNzLiAgQ2FsbGluZyBgZml0YFxuICAgKiBvciBgZXZhbHVhdGVgIG9uIGFuIHVuLWNvbXBpbGVkIG1vZGVsIHdpbGwgdGhyb3cgYW4gZXJyb3IuXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIGEgYE1vZGVsQ29tcGlsZUFyZ3NgIHNwZWNpZnlpbmcgdGhlIGxvc3MsIG9wdGltaXplciwgYW5kXG4gICAqIG1ldHJpY3MgdG8gYmUgdXNlZCBmb3IgZml0dGluZyBhbmQgZXZhbHVhdGluZyB0aGlzIG1vZGVsLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgY29tcGlsZShhcmdzOiBNb2RlbENvbXBpbGVBcmdzKTogdm9pZCB7XG4gICAgaWYgKGFyZ3MubG9zcyA9PSBudWxsKSB7XG4gICAgICBhcmdzLmxvc3MgPSBbXTtcbiAgICB9XG4gICAgdGhpcy5sb3NzID0gYXJncy5sb3NzO1xuXG4gICAgaWYgKHR5cGVvZiBhcmdzLm9wdGltaXplciA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMub3B0aW1pemVyXyA9IG9wdGltaXplcnMuZ2V0T3B0aW1pemVyKGFyZ3Mub3B0aW1pemVyKTtcbiAgICAgIHRoaXMuaXNPcHRpbWl6ZXJPd25lZCA9IHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghKGFyZ3Mub3B0aW1pemVyIGluc3RhbmNlb2YgT3B0aW1pemVyKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBVc2VyLWRlZmluZWQgb3B0aW1pemVyIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgdGYuT3B0aW1pemVyLmApO1xuICAgICAgfVxuICAgICAgdGhpcy5vcHRpbWl6ZXJfID0gYXJncy5vcHRpbWl6ZXI7XG4gICAgICB0aGlzLmlzT3B0aW1pemVyT3duZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbG9zc1dlaWdodHMuXG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIHNhbXBsZVdlaWdodE1vZGUuXG5cbiAgICAvLyBQcmVwYXJlIGxvc3MgZnVuY3Rpb25zLlxuICAgIGxldCBsb3NzRnVuY3Rpb25zOiBMb3NzT3JNZXRyaWNGbltdID0gW107XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGFyZ3MubG9zcykgJiYgdHlwZW9mIGFyZ3MubG9zcyAhPT0gJ3N0cmluZycgJiZcbiAgICAgICAgdHlwZW9mIGFyZ3MubG9zcyAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYXJncy5sb3NzID0gYXJncy5sb3NzIGFzIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogc3RyaW5nfTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBpbiBhcmdzLmxvc3MpIHtcbiAgICAgICAgaWYgKHRoaXMub3V0cHV0TmFtZXMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFVua25vd24gZW50cnkgaW4gbG9zcyBkaWN0aW9uYXJ5OiBcIiR7bmFtZX1cIi4gYCArXG4gICAgICAgICAgICAgIGBPbmx5IGV4cGVjdGVkIHRoZSBmb2xsb3dpbmcga2V5czogJHt0aGlzLm91dHB1dE5hbWVzfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgdGhpcy5vdXRwdXROYW1lcykge1xuICAgICAgICBpZiAoYXJncy5sb3NzW25hbWVdID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgIGBPdXRwdXQgXCIke25hbWV9XCIgaXMgbWlzc2luZyBmcm9tIGxvc3MgZGljdGlvbmFyeS4gV2UgYXNzdW1lIGAgK1xuICAgICAgICAgICAgICBgdGhpcyB3YXMgZG9uZSBvbiBwdXJwb3NlLCBhbmQgd2Ugd2lsbCBub3QgYmUgZXhwZWN0aW5nIGRhdGEgYCArXG4gICAgICAgICAgICAgIGB0byBiZSBwYXNzZWQgdG8gJHtuYW1lfSBkdXJpbmcgdHJhaW5pbmdgKTtcbiAgICAgICAgfVxuICAgICAgICBsb3NzRnVuY3Rpb25zLnB1c2gobG9zc2VzLmdldChhcmdzLmxvc3NbbmFtZV0pKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5sb3NzKSkge1xuICAgICAgaWYgKGFyZ3MubG9zcy5sZW5ndGggIT09IHRoaXMub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgV2hlbiBwYXNzaW5nIGFuIEFycmF5IGFzIGxvc3MsIGl0IHNob3VsZCBoYXZlIG9uZSBlbnRyeSBwZXIgYCArXG4gICAgICAgICAgICBgbW9kZWwgb3V0cHV0LiBUaGUgbW9kZWwgaGFzICR7dGhpcy5vdXRwdXRzLmxlbmd0aH0gb3V0cHV0KHMpLCBgICtcbiAgICAgICAgICAgIGBidXQgeW91IHBhc3NlZCBsb3NzPSR7YXJncy5sb3NzfS5gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRoZUxvc3NlcyA9IGFyZ3MubG9zcyBhcyBBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+O1xuICAgICAgbG9zc0Z1bmN0aW9ucyA9IHRoZUxvc3Nlcy5tYXAobCA9PiBsb3NzZXMuZ2V0KGwpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbG9zc0Z1bmN0aW9uID0gbG9zc2VzLmdldChhcmdzLmxvc3MpO1xuICAgICAgdGhpcy5vdXRwdXRzLmZvckVhY2goXyA9PiB7XG4gICAgICAgIGxvc3NGdW5jdGlvbnMucHVzaChsb3NzRnVuY3Rpb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgdGhpcy5sb3NzRnVuY3Rpb25zID0gbG9zc0Z1bmN0aW9ucztcblxuICAgIHRoaXMuZmVlZE91dHB1dE5hbWVzID0gW107XG4gICAgdGhpcy5mZWVkT3V0cHV0U2hhcGVzID0gW107XG4gICAgdGhpcy5mZWVkTG9zc0ZucyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBMb2dpYyBmb3Igc2tpcHBpbmcgdGFyZ2V0KHMpLlxuICAgICAgY29uc3Qgc2hhcGUgPSB0aGlzLmludGVybmFsT3V0cHV0U2hhcGVzW2ldO1xuICAgICAgY29uc3QgbmFtZSA9IHRoaXMub3V0cHV0TmFtZXNbaV07XG4gICAgICB0aGlzLmZlZWRPdXRwdXROYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgdGhpcy5mZWVkT3V0cHV0U2hhcGVzLnB1c2goc2hhcGUpO1xuICAgICAgdGhpcy5mZWVkTG9zc0Zucy5wdXNoKHRoaXMubG9zc0Z1bmN0aW9uc1tpXSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIGxvZ2ljIGZvciBvdXRwdXQgbWFza3MuXG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIGxvZ2ljIGZvciBzYW1wbGUgd2VpZ2h0cy5cbiAgICBjb25zdCBza2lwVGFyZ2V0SW5kaWNlczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8vIFByZXBhcmUgbWV0cmljcy5cbiAgICB0aGlzLm1ldHJpY3MgPSBhcmdzLm1ldHJpY3M7XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIHdlaWdodGVkTWV0cmljcy5cbiAgICB0aGlzLm1ldHJpY3NOYW1lcyA9IFsnbG9zcyddO1xuICAgIHRoaXMubWV0cmljc1RlbnNvcnMgPSBbXTtcblxuICAgIC8vIENvbXB1dGUgdG90YWwgbG9zcy5cbiAgICAvLyBQb3J0aW5nIE5vdGU6IEluIFB5S2VyYXMsIG1ldHJpY3NfdGVuc29ycyBhcmUgc3ltYm9saWMgdGVuc29yIG9iamVjdHMuXG4gICAgLy8gICBIZXJlLCBtZXRyaWNzVGVuc29ycyBhcmUgVHlwZVNjcmlwdCBmdW5jdGlvbnMuIFRoaXMgZGlmZmVyZW5jZSBpcyBkdWVcbiAgICAvLyAgIHRvIHRoZSBkaWZmZXJlbmNlIGluIHN5bWJvbGljL2ltcGVyYXRpdmUgcHJvcGVydHkgb2YgdGhlIGJhY2tlbmRzLlxuICAgIG5hbWVTY29wZSgnbG9zcycsICgpID0+IHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5vdXRwdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChza2lwVGFyZ2V0SW5kaWNlcy5pbmRleE9mKGkpICE9PSAtMSkge1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB3ZWlnaHRlZExvc3MsIHNhbXBsZVdlaWdodCBhbmQgbWFzay5cbiAgICAgICAgLy8gICBUaGUgZm9sbG93aW5nIGxpbmUgc2hvdWxkIGJlIHdlaWdodGVkTG9zc1xuICAgICAgICBjb25zdCB3ZWlnaHRlZExvc3MgPSB0aGlzLmxvc3NGdW5jdGlvbnNbaV07XG4gICAgICAgIGlmICh0aGlzLm91dHB1dHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgIHRoaXMubWV0cmljc1RlbnNvcnMucHVzaChbd2VpZ2h0ZWRMb3NzLCBpXSk7XG4gICAgICAgICAgdGhpcy5tZXRyaWNzTmFtZXMucHVzaCh0aGlzLm91dHB1dE5hbWVzW2ldICsgJ19sb3NzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gUG9ydGluZyBOb3RlOiBEdWUgdG8gdGhlIGltcGVyYXRpdmUgbmF0dXJlIG9mIHRoZSBiYWNrZW5kLCB3ZSBjYWxjdWxhdGVcbiAgICAgIC8vICAgdGhlIHJlZ3VsYXJpemVyIHBlbmFsdGllcyBpbiB0aGUgdG90YWxMb3NzRnVuY3Rpb24sIGluc3RlYWQgb2YgaGVyZS5cbiAgICB9KTtcblxuICAgIGNvbnN0IG5lc3RlZE1ldHJpY3MgPSBjb2xsZWN0TWV0cmljcyhhcmdzLm1ldHJpY3MsIHRoaXMub3V0cHV0TmFtZXMpO1xuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBuZXN0ZWRXZWlnaHRlZE1ldHJpY3MuXG5cbiAgICAvKipcbiAgICAgKiBIZWxwZXIgZnVuY3Rpb24gdXNlZCBpbiBsb29wIGJlbG93LlxuICAgICAqL1xuICAgIGNvbnN0IGFwcGVuZE1ldHJpYyA9XG4gICAgICAgIChvdXRwdXRJbmRleDogbnVtYmVyLCBtZXRyaWNOYW1lOiBzdHJpbmcsXG4gICAgICAgICBtZXRyaWNUZW5zb3I6IExvc3NPck1ldHJpY0ZuKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMub3V0cHV0TmFtZXMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbWV0cmljTmFtZSA9IHRoaXMub3V0cHV0TmFtZXNbb3V0cHV0SW5kZXhdICsgJ18nICsgbWV0cmljTmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhpcy5tZXRyaWNzTmFtZXMucHVzaChtZXRyaWNOYW1lKTtcbiAgICAgICAgICB0aGlzLm1ldHJpY3NUZW5zb3JzLnB1c2goW21ldHJpY1RlbnNvciwgb3V0cHV0SW5kZXhdKTtcbiAgICAgICAgfTtcblxuICAgIG5hbWVTY29wZSgnbWV0cmljJywgKCkgPT4ge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm91dHB1dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKHNraXBUYXJnZXRJbmRpY2VzLmluZGV4T2YoaSkgIT09IC0xKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3V0cHV0TWV0cmljcyA9IG5lc3RlZE1ldHJpY3NbaV07XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB3ZWlnaHRzIGFuZCBvdXRwdXRXZWlnaHRlZE1ldHJpY3MuXG5cbiAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIG9wdGlvbmFsIGFyZyBgd2VpZ2h0c2AgdG8gdGhlIGZvbGxvd2luZyBmdW5jdGlvbi5cbiAgICAgICAgY29uc3QgaGFuZGxlTWV0cmljcyA9IChtZXRyaWNzOiBBcnJheTxzdHJpbmd8TG9zc09yTWV0cmljRm4+KSA9PiB7XG4gICAgICAgICAgY29uc3QgbWV0cmljTmFtZVByZWZpeCA9ICcnO1xuICAgICAgICAgIGxldCBtZXRyaWNOYW1lOiBzdHJpbmc7XG4gICAgICAgICAgbGV0IGFjY0ZuOiBMb3NzT3JNZXRyaWNGbjtcbiAgICAgICAgICBsZXQgd2VpZ2h0ZWRNZXRyaWNGbjogTG9zc09yTWV0cmljRm47XG4gICAgICAgICAgLy8gIFRPRE8oY2Fpcyk6IFVzZSAnd2VpZ2h0c18nIGZvciB3ZWlnaHRlZCBtZXRyaWNzLlxuXG4gICAgICAgICAgZm9yIChjb25zdCBtZXRyaWMgb2YgbWV0cmljcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRyaWMgPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgICAgICAgWydhY2N1cmFjeScsICdhY2MnLCAnY3Jvc3NlbnRyb3B5JywgJ2NlJ10uaW5kZXhPZihtZXRyaWMpICE9PVxuICAgICAgICAgICAgICAgICAgICAtMSkge1xuICAgICAgICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHRoaXMuaW50ZXJuYWxPdXRwdXRTaGFwZXNbaV07XG5cbiAgICAgICAgICAgICAgaWYgKG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIDFdID09PSAxIHx8XG4gICAgICAgICAgICAgICAgICB0aGlzLmxvc3NGdW5jdGlvbnNbaV0gPT09IGxvc3Nlcy5iaW5hcnlDcm9zc2VudHJvcHkpIHtcbiAgICAgICAgICAgICAgICAvLyBjYXNlOiBiaW5hcnkgYWNjdXJhY3kvY3Jvc3NlbnRyb3B5LlxuICAgICAgICAgICAgICAgIGlmIChbJ2FjY3VyYWN5JywgJ2FjYyddLmluZGV4T2YobWV0cmljKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGFjY0ZuID0gTWV0cmljcy5iaW5hcnlBY2N1cmFjeTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFsnY3Jvc3NlbnRyb3B5JywgJ2NlJ10uaW5kZXhPZihtZXRyaWMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgYWNjRm4gPSBNZXRyaWNzLmJpbmFyeUNyb3NzZW50cm9weTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICB0aGlzLmxvc3NGdW5jdGlvbnNbaV0gPT09XG4gICAgICAgICAgICAgICAgICBsb3NzZXMuc3BhcnNlQ2F0ZWdvcmljYWxDcm9zc2VudHJvcHkpIHtcbiAgICAgICAgICAgICAgICAvLyBjYXNlOiBjYXRlZ29yaWNhbCBhY2N1cmFjeSAvIGNyb3NzZW50cm9weSB3aXRoIHNwYXJzZVxuICAgICAgICAgICAgICAgIC8vIHRhcmdldHMuXG4gICAgICAgICAgICAgICAgaWYgKFsnYWNjdXJhY3knLCAnYWNjJ10uaW5kZXhPZihtZXRyaWMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgYWNjRm4gPSBNZXRyaWNzLnNwYXJzZUNhdGVnb3JpY2FsQWNjdXJhY3k7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbJ2Nyb3NzZW50cm9weScsICdjZSddLmluZGV4T2YobWV0cmljKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGFjY0ZuID0gTWV0cmljcy5zcGFyc2VDYXRlZ29yaWNhbENyb3NzZW50cm9weTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gY2FzZTogY2F0ZWdvcmljYWwgYWNjdXJhY3kgLyBjcm9zc2VudHJvcHkuXG4gICAgICAgICAgICAgICAgaWYgKFsnYWNjdXJhY3knLCAnYWNjJ10uaW5kZXhPZihtZXRyaWMpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgYWNjRm4gPSBNZXRyaWNzLmNhdGVnb3JpY2FsQWNjdXJhY3k7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChbJ2Nyb3NzZW50cm9weScsICdjZSddLmluZGV4T2YobWV0cmljKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgIGFjY0ZuID0gTWV0cmljcy5jYXRlZ29yaWNhbENyb3NzZW50cm9weTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGV0IHN1ZmZpeDogc3RyaW5nO1xuICAgICAgICAgICAgICBpZiAoWydhY2N1cmFjeScsICdhY2MnXS5pbmRleE9mKG1ldHJpYykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3VmZml4ID0gJ2FjYyc7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoWydjcm9zc2VudHJvcHknLCAnY2UnXS5pbmRleE9mKG1ldHJpYykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgc3VmZml4ID0gJ2NlJztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgd2VpZ2h0aW5nIGFjdHVhbGx5LlxuICAgICAgICAgICAgICB3ZWlnaHRlZE1ldHJpY0ZuID0gYWNjRm47XG4gICAgICAgICAgICAgIG1ldHJpY05hbWUgPSBtZXRyaWNOYW1lUHJlZml4ICsgc3VmZml4O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgY29uc3QgbWV0cmljRm4gPSBNZXRyaWNzLmdldChtZXRyaWMpO1xuICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgd2VpZ2h0aW5nIGFjdHVhbGx5LlxuICAgICAgICAgICAgICB3ZWlnaHRlZE1ldHJpY0ZuID0gbWV0cmljRm47XG4gICAgICAgICAgICAgIG1ldHJpY05hbWUgPVxuICAgICAgICAgICAgICAgICAgbWV0cmljTmFtZVByZWZpeCArIE1ldHJpY3MuZ2V0TG9zc09yTWV0cmljTmFtZShtZXRyaWMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgd2VpZ2h0aW5nIGFuZCBtYXNraW5nIHRvIG1ldHJpY1Jlc3VsdC5cbiAgICAgICAgICAgIGxldCBtZXRyaWNSZXN1bHQ6IExvc3NPck1ldHJpY0ZuO1xuICAgICAgICAgICAgbmFtZVNjb3BlKG1ldHJpY05hbWUsICgpID0+IHtcbiAgICAgICAgICAgICAgbWV0cmljUmVzdWx0ID0gd2VpZ2h0ZWRNZXRyaWNGbjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgYXBwZW5kTWV0cmljKGksIG1ldHJpY05hbWUsIG1ldHJpY1Jlc3VsdCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGhhbmRsZU1ldHJpY3Mob3V0cHV0TWV0cmljcyk7XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IENhbGwgaGFuZGxlTWV0cmljcyB3aXRoIHdlaWdodHMuXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBQb3J0aW5nIE5vdGVzOiBHaXZlbiB0aGUgaW1wZXJhdGl2ZSBiYWNrZW5kIG9mIHRmanMtY29yZSxcbiAgICAvLyAgIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGNvbnN0cnVjdGluZyB0aGUgc3ltYm9saWMgZ3JhcGggYW5kIHBsYWNlaG9sZGVycy5cbiAgICB0aGlzLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHMgPSB0aGlzLnRyYWluYWJsZVdlaWdodHM7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgdHJhaW5hYmxlIHdlaWdodHMgY291bnQgY29uc2lzdGVuY3kuXG4gICAqXG4gICAqIFRoaXMgd2lsbCByYWlzZSBhIHdhcm5pbmcgaWYgYHRoaXMudHJhaW5hYmxlV2VpZ2h0c2AgYW5kXG4gICAqIGB0aGlzLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHNgIGFyZSBpbmNvbnNpc3RlbnQgKGkuZS4sIGhhdmUgZGlmZmVyZW50XG4gICAqIG51bWJlcnMgb2YgcGFyYW1ldGVycykuXG4gICAqIEluY29uc2lzdGVuY3kgd2lsbCB0eXBpY2FsbHkgYXJpc2Ugd2hlbiBvbmUgbW9kaWZpZXMgYG1vZGVsLnRyYWluYWJsZWBcbiAgICogd2l0aG91dCBjYWxsaW5nIGBtb2RlbC5jb21waWxlKClgIGFnYWluLlxuICAgKi9cbiAgcHJvdGVjdGVkIGNoZWNrVHJhaW5hYmxlV2VpZ2h0c0NvbnNpc3RlbmN5KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNvbGxlY3RlZFRyYWluYWJsZVdlaWdodHMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy50cmFpbmFibGVXZWlnaHRzLmxlbmd0aCAhPT1cbiAgICAgICAgdGhpcy5jb2xsZWN0ZWRUcmFpbmFibGVXZWlnaHRzLmxlbmd0aCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdEaXNjcmVwYW5jeSBiZXR3ZWVuIHRyYWluYWJsZXdlaWdodHMgYW5kIGNvbGxlY3RlZCB0cmFpbmFibGUgJyArXG4gICAgICAgICAgJ3dlaWdodHMuIERpZCB5b3Ugc2V0IGBtb2RlbC50cmFpbmFibGVgIHdpdGhvdXQgY2FsbGluZyAnICtcbiAgICAgICAgICAnYG1vZGVsLmNvbXBpbGUoKWAgYWZ0ZXJ3YXJkcz8nKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgbG9zcyB2YWx1ZSAmIG1ldHJpY3MgdmFsdWVzIGZvciB0aGUgbW9kZWwgaW4gdGVzdCBtb2RlLlxuICAgKlxuICAgKiBMb3NzIGFuZCBtZXRyaWNzIGFyZSBzcGVjaWZpZWQgZHVyaW5nIGBjb21waWxlKClgLCB3aGljaCBuZWVkcyB0byBoYXBwZW5cbiAgICogYmVmb3JlIGNhbGxzIHRvIGBldmFsdWF0ZSgpYC5cbiAgICpcbiAgICogQ29tcHV0YXRpb24gaXMgZG9uZSBpbiBiYXRjaGVzLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLmNvbXBpbGUoe29wdGltaXplcjogJ3NnZCcsIGxvc3M6ICdtZWFuU3F1YXJlZEVycm9yJ30pO1xuICAgKiBjb25zdCByZXN1bHQgPSBtb2RlbC5ldmFsdWF0ZShcbiAgICogICAgIHRmLm9uZXMoWzgsIDEwXSksIHRmLm9uZXMoWzgsIDFdKSwge2JhdGNoU2l6ZTogNH0pO1xuICAgKiByZXN1bHQucHJpbnQoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB4IGB0Zi5UZW5zb3JgIG9mIHRlc3QgZGF0YSwgb3IgYW4gYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgaWYgdGhlXG4gICAqIG1vZGVsIGhhcyBtdWx0aXBsZSBpbnB1dHMuXG4gICAqIEBwYXJhbSB5IGB0Zi5UZW5zb3JgIG9mIHRhcmdldCBkYXRhLCBvciBhbiBgQXJyYXlgIG9mIGB0Zi5UZW5zb3JgcyBpZiB0aGVcbiAgICogbW9kZWwgaGFzIG11bHRpcGxlIG91dHB1dHMuXG4gICAqIEBwYXJhbSBhcmdzIEEgYE1vZGVsRXZhbHVhdGVBcmdzYCwgY29udGFpbmluZyBvcHRpb25hbCBmaWVsZHMuXG4gICAqXG4gICAqIEByZXR1cm4gYFNjYWxhcmAgdGVzdCBsb3NzIChpZiB0aGUgbW9kZWwgaGFzIGEgc2luZ2xlIG91dHB1dCBhbmQgbm9cbiAgICogICBtZXRyaWNzKSBvciBgQXJyYXlgIG9mIGBTY2FsYXJgcyAoaWYgdGhlIG1vZGVsIGhhcyBtdWx0aXBsZSBvdXRwdXRzXG4gICAqICAgYW5kL29yIG1ldHJpY3MpLiBUaGUgYXR0cmlidXRlIGBtb2RlbC5tZXRyaWNzTmFtZXNgXG4gICAqICAgd2lsbCBnaXZlIHlvdSB0aGUgZGlzcGxheSBsYWJlbHMgZm9yIHRoZSBzY2FsYXIgb3V0cHV0cy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGV2YWx1YXRlKFxuICAgICAgeDogVGVuc29yfFRlbnNvcltdLCB5OiBUZW5zb3J8VGVuc29yW10sXG4gICAgICBhcmdzOiBNb2RlbEV2YWx1YXRlQXJncyA9IHt9KTogU2NhbGFyfFNjYWxhcltdIHtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBhcmdzLmJhdGNoU2l6ZSA9PSBudWxsID8gMzIgOiBhcmdzLmJhdGNoU2l6ZTtcbiAgICBjaGVja0JhdGNoU2l6ZShiYXRjaFNpemUpO1xuXG4gICAgLy8gVE9ETyhjYWlzKTogU3RhbmRhcmRpemUgYGNvbmZpZy5zYW1wbGVXZWlnaHRzYCBhcyB3ZWxsLlxuICAgIC8vIFZhbGlkYXRlIHVzZXIgZGF0YS5cbiAgICBjb25zdCBjaGVja0JhdGNoQXhpcyA9IHRydWU7XG4gICAgY29uc3Qgc3RhbmRhcmRpemVkT3V0cyA9XG4gICAgICAgIHRoaXMuc3RhbmRhcmRpemVVc2VyRGF0YVhZKHgsIHksIGNoZWNrQmF0Y2hBeGlzLCBiYXRjaFNpemUpO1xuICAgIHRyeSB7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBJZiB1c2VzIGB1c2VMZWFybmluZ1BoYXNlYCwgc2V0IHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRcbiAgICAgIC8vIG9mIHRoZSBpbnB1dCB0byAwLlxuICAgICAgY29uc3QgaW5zID0gc3RhbmRhcmRpemVkT3V0c1swXS5jb25jYXQoc3RhbmRhcmRpemVkT3V0c1sxXSk7XG4gICAgICB0aGlzLm1ha2VUZXN0RnVuY3Rpb24oKTtcbiAgICAgIGNvbnN0IGYgPSB0aGlzLnRlc3RGdW5jdGlvbjtcbiAgICAgIGNvbnN0IHRlc3RPdXRzID1cbiAgICAgICAgICB0aGlzLnRlc3RMb29wKGYsIGlucywgYmF0Y2hTaXplLCBhcmdzLnZlcmJvc2UsIGFyZ3Muc3RlcHMpO1xuICAgICAgcmV0dXJuIHNpbmdsZXRvbk9yQXJyYXkodGVzdE91dHMpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3NlTmV3VGVuc29ycyhzdGFuZGFyZGl6ZWRPdXRzWzBdLCB4KTtcbiAgICAgIGRpc3Bvc2VOZXdUZW5zb3JzKHN0YW5kYXJkaXplZE91dHNbMV0sIHkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IEFkZCBjb2RlIHNuaXBwZXQgYmVsb3cgb25jZSByZWFsIGRhdGFzZXQgb2JqZWN0cyBhcmVcbiAgLy8gICBhdmFpbGFibGUuXG4gIC8qKlxuICAgKiBFdmFsdWF0ZSBtb2RlbCB1c2luZyBhIGRhdGFzZXQgb2JqZWN0LlxuICAgKlxuICAgKiBOb3RlOiBVbmxpa2UgYGV2YWx1YXRlKClgLCB0aGlzIG1ldGhvZCBpcyBhc3luY2hyb25vdXMgKGBhc3luY2ApLlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YXNldCBBIGRhdGFzZXQgb2JqZWN0LiBJdHMgYGl0ZXJhdG9yKClgIG1ldGhvZCBpcyBleHBlY3RlZFxuICAgKiAgIHRvIGdlbmVyYXRlIGEgZGF0YXNldCBpdGVyYXRvciBvYmplY3QsIHRoZSBgbmV4dCgpYCBtZXRob2Qgb2Ygd2hpY2hcbiAgICogICBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGRhdGEgYmF0Y2hlcyBmb3IgZXZhbHVhdGlvbi4gVGhlIHJldHVybiB2YWx1ZVxuICAgKiAgIG9mIHRoZSBgbmV4dCgpYCBjYWxsIG91Z2h0IHRvIGNvbnRhaW4gYSBib29sZWFuIGBkb25lYCBmaWVsZCBhbmQgYVxuICAgKiAgIGB2YWx1ZWAgZmllbGQuIFRoZSBgdmFsdWVgIGZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGFycmF5IG9mIHR3b1xuICAgKiAgIGB0Zi5UZW5zb3JgcyBvciBhbiBhcnJheSBvZiB0d28gbmVzdGVkIGB0Zi5UZW5zb3JgIHN0cnVjdHVyZXMuIFRoZSBmb3JtZXJcbiAgICogICBjYXNlIGlzIGZvciBtb2RlbHMgd2l0aCBleGFjdGx5IG9uZSBpbnB1dCBhbmQgb25lIG91dHB1dCAoZS5nLlxuICAgKiAgIGEgc2VxdWVudGlhbCBtb2RlbCkuIFRoZSBsYXR0ZXIgY2FzZSBpcyBmb3IgbW9kZWxzIHdpdGggbXVsdGlwbGVcbiAgICogICBpbnB1dHMgYW5kL29yIG11bHRpcGxlIG91dHB1dHMuIE9mIHRoZSB0d28gaXRlbXMgaW4gdGhlIGFycmF5LCB0aGVcbiAgICogICBmaXJzdCBpcyB0aGUgaW5wdXQgZmVhdHVyZShzKSBhbmQgdGhlIHNlY29uZCBpcyB0aGUgb3V0cHV0IHRhcmdldChzKS5cbiAgICogQHBhcmFtIGFyZ3MgQSBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgdGhlIGRhdGFzZXQtYmFzZWQgZXZhbHVhdGlvbi5cbiAgICogQHJldHVybnMgTG9zcyBhbmQgbWV0cmljIHZhbHVlcyBhcyBhbiBBcnJheSBvZiBgU2NhbGFyYCBvYmplY3RzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgZXZhbHVhdGVEYXRhc2V0KGRhdGFzZXQ6IERhdGFzZXQ8e30+LCBhcmdzPzogTW9kZWxFdmFsdWF0ZURhdGFzZXRBcmdzKTpcbiAgICAgIFByb21pc2U8U2NhbGFyfFNjYWxhcltdPiB7XG4gICAgdGhpcy5tYWtlVGVzdEZ1bmN0aW9uKCk7XG4gICAgcmV0dXJuIGV2YWx1YXRlRGF0YXNldCh0aGlzLCBkYXRhc2V0LCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgbnVtYmVyIG9mIHNhbXBsZXMgcHJvdmlkZWQgZm9yIHRyYWluaW5nLCBldmFsdWF0aW9uIG9yIHByZWRpY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSBpbnMgSW5wdXQgYHRmLlRlbnNvcmAuXG4gICAqIEBwYXJhbSBiYXRjaFNpemUgSW50ZWdlciBiYXRjaCBzaXplLCBvcHRpb25hbC5cbiAgICogQHBhcmFtIHN0ZXBzIFRvdGFsIG51bWJlciBvZiBzdGVwcyAoYmF0Y2hlcyBvZiBzYW1wbGVzKSBiZWZvcmVcbiAgICogZGVjbGFyaW5nIGxvb3AgZmluaXNoZWQuIE9wdGlvbmFsLlxuICAgKiBAcGFyYW0gc3RlcHNOYW1lIFRoZSBwdWJsaWMgQVBJJ3MgcGFyYW1ldGVyIG5hbWUgZm9yIGBzdGVwc2AuXG4gICAqIEByZXR1cm5zIE51bWJlciBvZiBzYW1wbGVzIHByb3ZpZGVkLlxuICAgKi9cbiAgcHJpdmF0ZSBjaGVja051bVNhbXBsZXMoXG4gICAgICBpbnM6IFRlbnNvcnxUZW5zb3JbXSwgYmF0Y2hTaXplPzogbnVtYmVyLCBzdGVwcz86IG51bWJlcixcbiAgICAgIHN0ZXBzTmFtZSA9ICdzdGVwcycpOiBudW1iZXIge1xuICAgIGxldCBudW1TYW1wbGVzOiBudW1iZXI7XG4gICAgaWYgKHN0ZXBzICE9IG51bGwpIHtcbiAgICAgIG51bVNhbXBsZXMgPSBudWxsO1xuICAgICAgaWYgKGJhdGNoU2l6ZSAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYElmICR7c3RlcHNOYW1lfSBpcyBzZXQsIGJhdGNoU2l6ZSBtdXN0IGJlIG51bGwgb3IgdW5kZWZpbmVkLmAgK1xuICAgICAgICAgICAgYEdvdCBiYXRjaFNpemUgPSAke2JhdGNoU2l6ZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlucyAhPSBudWxsKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShpbnMpKSB7XG4gICAgICAgIG51bVNhbXBsZXMgPSBpbnNbMF0uc2hhcGVbMF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBudW1TYW1wbGVzID0gaW5zLnNoYXBlWzBdO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgRWl0aGVyIHRoZSBpbnB1dCBkYXRhIHNob3VsZCBoYXZlIGEgZGVmaW5lZCBzaGFwZSwgb3IgYCArXG4gICAgICAgICAgYCR7c3RlcHNOYW1lfSBzaG91ZCBiZSBzcGVjaWZpZWQuYCk7XG4gICAgfVxuICAgIHJldHVybiBudW1TYW1wbGVzO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgaW50ZXJuYWwgdGVuc29ycyBvZiB0aGUgbW9kZWwgd2l0aCBpbnB1dCBkYXRhIGZlZWQuXG4gICAqIEBwYXJhbSBpbnB1dHMgSW5wdXQgZGF0YSBmZWVkLiBNdXN0IG1hdGNoIHRoZSBpbnB1dHMgb2YgdGhlIG1vZGVsLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBOYW1lcyBvZiB0aGUgb3V0cHV0IHRlbnNvcnMgdG8gYmUgZmV0Y2hlZC4gTXVzdCBtYXRjaFxuICAgKiAgIG5hbWVzIG9mIHRoZSBTeW1ib2xpY1RlbnNvcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGdyYXBoLlxuICAgKiBAcmV0dXJucyBGZXRjaGVkIHZhbHVlcyBmb3IgYG91dHB1dHNgLlxuICAgKi9cbiAgZXhlY3V0ZShpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxOYW1lZFRlbnNvck1hcCwgb3V0cHV0czogc3RyaW5nfHN0cmluZ1tdKTpcbiAgICAgIFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkob3V0cHV0cykgJiYgb3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdgb3V0cHV0c2AgaXMgYW4gZW1wdHkgQXJyYXksIHdoaWNoIGlzIG5vdCBhbGxvd2VkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IG91dHB1dHNJc0FycmF5ID0gQXJyYXkuaXNBcnJheShvdXRwdXRzKTtcbiAgICBjb25zdCBvdXRwdXROYW1lcyA9XG4gICAgICAgIChvdXRwdXRzSXNBcnJheSA/IG91dHB1dHMgYXMgc3RyaW5nW10gOiBbb3V0cHV0cyBhcyBzdHJpbmddKTtcbiAgICBjb25zdCBvdXRwdXRTeW1ib2xpY1RlbnNvcnMgPSB0aGlzLnJldHJpZXZlU3ltYm9saWNUZW5zb3JzKG91dHB1dE5hbWVzKTtcblxuICAgIC8vIEZvcm1hdCB0aGUgaW5wdXQgaW50byBhIEZlZWREaWN0LlxuICAgIGNvbnN0IGZlZWREaWN0ID0gbmV3IEZlZWREaWN0KCk7XG4gICAgaWYgKGlucHV0cyBpbnN0YW5jZW9mIFRlbnNvcikge1xuICAgICAgaW5wdXRzID0gW2lucHV0c107XG4gICAgfVxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSB0aGlzLmlucHV0cy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgVGhlIG51bWJlciBvZiBpbnB1dHMgcHJvdmlkZWQgKCR7aW5wdXRzLmxlbmd0aH0pIGAgK1xuICAgICAgICAgICAgYGRvZXMgbm90IG1hdGNoIHRoZSBudW1iZXIgb2YgaW5wdXRzIG9mIHRoaXMgbW9kZWwgYCArXG4gICAgICAgICAgICBgKCR7dGhpcy5pbnB1dHMubGVuZ3RofSkuYCk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5wdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGZlZWREaWN0LmFkZCh0aGlzLmlucHV0c1tpXSwgaW5wdXRzW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgZm9yIChjb25zdCBpbnB1dCBvZiB0aGlzLmlucHV0cykge1xuICAgICAgICBjb25zdCB0ZW5zb3JWYWx1ZSA9IGlucHV0c1tpbnB1dC5uYW1lXTtcbiAgICAgICAgaWYgKHRlbnNvclZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYE5vIHZhbHVlIGlzIHByb3ZpZGVkIGZvciB0aGUgbW9kZWwncyBpbnB1dCAke2lucHV0Lm5hbWV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgZmVlZERpY3QuYWRkKGlucHV0LCB0ZW5zb3JWYWx1ZSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUnVuIGV4ZWN1dGlvbi5cbiAgICBjb25zdCBleGVjdXRlT3V0cHV0cyA9IGV4ZWN1dGUob3V0cHV0U3ltYm9saWNUZW5zb3JzLCBmZWVkRGljdCkgYXMgVGVuc29yW107XG4gICAgcmV0dXJuIG91dHB1dHNJc0FycmF5ID8gZXhlY3V0ZU91dHB1dHMgOiBleGVjdXRlT3V0cHV0c1swXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZSB0aGUgbW9kZWwncyBpbnRlcm5hbCBzeW1ib2xpYyB0ZW5zb3JzIGZyb20gc3ltYm9saWMtdGVuc29yIG5hbWVzLlxuICAgKi9cbiAgcHJpdmF0ZSByZXRyaWV2ZVN5bWJvbGljVGVuc29ycyhzeW1ib2xpY1RlbnNvck5hbWVzOiBzdHJpbmdbXSk6XG4gICAgICBTeW1ib2xpY1RlbnNvcltdIHtcbiAgICBjb25zdCBvdXRwdXRTeW1ib2xpY1RlbnNvcnM6IFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBweUxpc3RSZXBlYXQobnVsbCwgc3ltYm9saWNUZW5zb3JOYW1lcy5sZW5ndGgpO1xuICAgIGxldCBvdXRwdXRzUmVtYWluaW5nID0gc3ltYm9saWNUZW5zb3JOYW1lcy5sZW5ndGg7XG4gICAgZm9yIChjb25zdCBsYXllciBvZiB0aGlzLmxheWVycykge1xuICAgICAgY29uc3QgbGF5ZXJPdXRwdXRzOiBTeW1ib2xpY1RlbnNvcltdID1cbiAgICAgICAgICBBcnJheS5pc0FycmF5KGxheWVyLm91dHB1dCkgPyBsYXllci5vdXRwdXQgOiBbbGF5ZXIub3V0cHV0XTtcbiAgICAgIGNvbnN0IGxheWVyT3V0cHV0TmFtZXMgPSBsYXllck91dHB1dHMubWFwKG91dHB1dCA9PiBvdXRwdXQubmFtZSk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN5bWJvbGljVGVuc29yTmFtZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgaW5kZXggPSBsYXllck91dHB1dE5hbWVzLmluZGV4T2Yoc3ltYm9saWNUZW5zb3JOYW1lc1tpXSk7XG4gICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICBvdXRwdXRTeW1ib2xpY1RlbnNvcnNbaV0gPSBsYXllck91dHB1dHNbaW5kZXhdO1xuICAgICAgICAgIG91dHB1dHNSZW1haW5pbmctLTtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3V0cHV0c1JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAob3V0cHV0c1JlbWFpbmluZyA9PT0gMCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3V0cHV0c1JlbWFpbmluZyA+IDApIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZ05hbWVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgb3V0cHV0U3ltYm9saWNUZW5zb3JzLmZvckVhY2goKHRlbnNvciwgaSkgPT4ge1xuICAgICAgICBpZiAodGVuc29yID09IG51bGwpIHtcbiAgICAgICAgICByZW1haW5pbmdOYW1lcy5wdXNoKHN5bWJvbGljVGVuc29yTmFtZXNbaV0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgZmluZCBTeW1ib2xpY1RlbnNvcnMgZm9yIG91dHB1dCBuYW1lKHMpOiBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShyZW1haW5pbmdOYW1lcyl9YCk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRTeW1ib2xpY1RlbnNvcnM7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byBsb29wIG92ZXIgc29tZSBkYXRhIGluIGJhdGNoZXMuXG4gICAqXG4gICAqIFBvcnRpbmcgTm90ZTogTm90IHVzaW5nIHRoZSBmdW5jdGlvbmFsIGFwcHJvYWNoIGluIHRoZSBQeXRob24gZXF1aXZhbGVudFxuICAgKiAgIGR1ZSB0byB0aGUgaW1wZXJhdGl2ZSBiYWNrZW5kLlxuICAgKiBQb3J0aW5nIE5vdGU6IERvZXMgbm90IHN1cHBvcnQgc3RlcCBtb2RlIGN1cnJlbnRseS5cbiAgICpcbiAgICogQHBhcmFtIGluczogaW5wdXQgZGF0YVxuICAgKiBAcGFyYW0gYmF0Y2hTaXplOiBpbnRlZ2VyIGJhdGNoIHNpemUuXG4gICAqIEBwYXJhbSB2ZXJib3NlOiB2ZXJib3NpdHkgbW9kZWxcbiAgICogQHJldHVybnM6IFByZWRpY3Rpb25zIGFzIGB0Zi5UZW5zb3JgIChpZiBhIHNpbmdsZSBvdXRwdXQpIG9yIGFuIGBBcnJheWAgb2ZcbiAgICogICBgdGYuVGVuc29yYCAoaWYgbXVsdGlwZSBvdXRwdXRzKS5cbiAgICovXG4gIHByaXZhdGUgcHJlZGljdExvb3AoaW5zOiBUZW5zb3J8VGVuc29yW10sIGJhdGNoU2l6ZSA9IDMyLCB2ZXJib3NlID0gZmFsc2UpOlxuICAgICAgVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgbnVtU2FtcGxlcyA9IHRoaXMuY2hlY2tOdW1TYW1wbGVzKGlucyk7XG4gICAgICBpZiAodmVyYm9zZSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICdWZXJib3NlIHByZWRpY3RMb29wKCkgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICAgIH1cblxuICAgICAgLy8gU2FtcGxlLWJhc2VkIHByZWRpY3Rpb25zLlxuICAgICAgLy8gUG9ydGluZyBOb3RlOiBUZW5zb3IgY3VycmVudGx5IGRvZXMgbm90IHN1cHBvcnQgc2xpY2VkIGFzc2lnbm1lbnRzIGFzXG4gICAgICAvLyAgIGluIG51bXB5LCBlLmcuLCB4WzE6M10gPSB5LiBUaGVyZWZvcmUgd2UgdXNlIGNvbmNhdGVuYXRpb24gd2hpbGVcbiAgICAgIC8vICAgaXRlcmF0aW5nIG92ZXIgdGhlIGJhdGNoZXMuXG5cbiAgICAgIGNvbnN0IGJhdGNoZXMgPSBtYWtlQmF0Y2hlcyhudW1TYW1wbGVzLCBiYXRjaFNpemUpO1xuICAgICAgY29uc3Qgb3V0c0JhdGNoZXM6IFRlbnNvcltdW10gPSB0aGlzLm91dHB1dHMubWFwKG91dHB1dCA9PiBbXSk7XG5cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IENhbiB0aGUgc2NvcGUoKSBiZSBwdXNoZWQgZG93biBpbnNpZGUgdGhlIGZvciBsb29wP1xuICAgICAgZm9yIChsZXQgYmF0Y2hJbmRleCA9IDA7IGJhdGNoSW5kZXggPCBiYXRjaGVzLmxlbmd0aDsgKytiYXRjaEluZGV4KSB7XG4gICAgICAgIGNvbnN0IGJhdGNoT3V0cyA9IHRmYy50aWR5KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBiYXRjaFN0YXJ0ID0gYmF0Y2hlc1tiYXRjaEluZGV4XVswXTtcbiAgICAgICAgICBjb25zdCBiYXRjaEVuZCA9IGJhdGNoZXNbYmF0Y2hJbmRleF1bMV07XG4gICAgICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIHRoZSBjYXNlIG9mIHRoZSBsYXN0IGVsZW1lbnQgaXMgYSBmbGFnIGZvclxuICAgICAgICAgIC8vICAgdHJhaW5pbmcvdGVzdC5cbiAgICAgICAgICBjb25zdCBpbnNCYXRjaCA9IHNsaWNlQXJyYXlzKGlucywgYmF0Y2hTdGFydCwgYmF0Y2hFbmQpO1xuXG4gICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBmZWVkcyBmb3IgZXhlY3V0ZSgpO1xuICAgICAgICAgIGNvbnN0IGZlZWRzID0gW107XG4gICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoaW5zQmF0Y2gpKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluc0JhdGNoLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgIGZlZWRzLnB1c2goe2tleTogdGhpcy5pbnB1dHNbaV0sIHZhbHVlOiBpbnNCYXRjaFtpXX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmZWVkcy5wdXNoKHtrZXk6IHRoaXMuaW5wdXRzWzBdLCB2YWx1ZTogaW5zQmF0Y2h9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgZmVlZERpY3QgPSBuZXcgRmVlZERpY3QoZmVlZHMpO1xuICAgICAgICAgIHJldHVybiBleGVjdXRlKHRoaXMub3V0cHV0cywgZmVlZERpY3QpIGFzIFRlbnNvcltdO1xuICAgICAgICB9KTtcbiAgICAgICAgYmF0Y2hPdXRzLmZvckVhY2goKGJhdGNoT3V0LCBpKSA9PiBvdXRzQmF0Y2hlc1tpXS5wdXNoKGJhdGNoT3V0KSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2luZ2xldG9uT3JBcnJheShcbiAgICAgICAgICBvdXRzQmF0Y2hlcy5tYXAoYmF0Y2hlcyA9PiB0ZmMuY29uY2F0KGJhdGNoZXMsIDApKSk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG91dHB1dCBwcmVkaWN0aW9ucyBmb3IgdGhlIGlucHV0IHNhbXBsZXMuXG4gICAqXG4gICAqIENvbXB1dGF0aW9uIGlzIGRvbmUgaW4gYmF0Y2hlcy5cbiAgICpcbiAgICogTm90ZTogdGhlIFwic3RlcFwiIG1vZGUgb2YgcHJlZGljdCgpIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuICAgKiAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgVGVuc29yRmxvdy5qcyBjb3JlIGJhY2tlbmQgaXMgaW1wZXJhdGl2ZSBvbmx5LlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbOCwgMTBdKSwge2JhdGNoU2l6ZTogNH0pLnByaW50KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0geCBUaGUgaW5wdXQgZGF0YSwgYXMgYSBUZW5zb3IsIG9yIGFuIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzIGlmXG4gICAqICAgdGhlIG1vZGVsIGhhcyBtdWx0aXBsZSBpbnB1dHMuXG4gICAqIEBwYXJhbSBhcmdzIEEgYE1vZGVsUHJlZGljdEFyZ3NgIG9iamVjdCBjb250YWluaW5nIG9wdGlvbmFsIGZpZWxkcy5cbiAgICpcbiAgICogQHJldHVybiBQcmVkaWN0aW9uIHJlc3VsdHMgYXMgYSBgdGYuVGVuc29yYChzKS5cbiAgICpcbiAgICogQGV4Y2VwdGlvbiBWYWx1ZUVycm9yIEluIGNhc2Ugb2YgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YVxuICAgKiAgIGFuZCB0aGUgbW9kZWwncyBleHBlY3RhdGlvbnMsIG9yIGluIGNhc2UgYSBzdGF0ZWZ1bCBtb2RlbCByZWNlaXZlcyBhXG4gICAqICAgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgYmF0Y2ggc2l6ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIHByZWRpY3QoeDogVGVuc29yfFRlbnNvcltdLCBhcmdzOiBNb2RlbFByZWRpY3RBcmdzID0ge30pOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNvbnN0IHhzUmFuazJPckhpZ2hlciA9IGVuc3VyZVRlbnNvcnNSYW5rMk9ySGlnaGVyKHgpO1xuICAgIGNoZWNrSW5wdXREYXRhKFxuICAgICAgICB4c1JhbmsyT3JIaWdoZXIsIHRoaXMuaW5wdXROYW1lcywgdGhpcy5mZWVkSW5wdXRTaGFwZXMsIGZhbHNlKTtcbiAgICB0cnkge1xuICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIHN0YXRlZnVsIG1vZGVscy5cbiAgICAgIC8vICAgaWYgKHRoaXMuc3RhdGVmdWwpIC4uLlxuICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIHRoZSBsZWFybmluZ19waGFzZSBib29sZWFuIGZsYWcuXG4gICAgICAvLyAgIGlmICh0aGlzLnVzZUxlYXJuaW5nUGhhc2UpIC4uLlxuICAgICAgY29uc3QgYmF0Y2hTaXplID0gYXJncy5iYXRjaFNpemUgPT0gbnVsbCA/IDMyIDogYXJncy5iYXRjaFNpemU7XG4gICAgICBjaGVja0JhdGNoU2l6ZShiYXRjaFNpemUpO1xuICAgICAgcmV0dXJuIHRoaXMucHJlZGljdExvb3AoeHNSYW5rMk9ySGlnaGVyLCBiYXRjaFNpemUpO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBkaXNwb3NlTmV3VGVuc29ycyh4c1JhbmsyT3JIaWdoZXIsIHgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHByZWRpY3Rpb25zIGZvciBhIHNpbmdsZSBiYXRjaCBvZiBzYW1wbGVzLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLnByZWRpY3RPbkJhdGNoKHRmLm9uZXMoWzgsIDEwXSkpLnByaW50KCk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0geDogSW5wdXQgc2FtcGxlcywgYXMgYSBUZW5zb3IgKGZvciBtb2RlbHMgd2l0aCBleGFjdGx5IG9uZVxuICAgKiAgIGlucHV0KSBvciBhbiBhcnJheSBvZiBUZW5zb3JzIChmb3IgbW9kZWxzIHdpdGggbW9yZSB0aGFuIG9uZSBpbnB1dCkuXG4gICAqIEByZXR1cm4gVGVuc29yKHMpIG9mIHByZWRpY3Rpb25zXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBwcmVkaWN0T25CYXRjaCh4OiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNoZWNrSW5wdXREYXRhKHgsIHRoaXMuaW5wdXROYW1lcywgdGhpcy5mZWVkSW5wdXRTaGFwZXMsIHRydWUpO1xuICAgIC8vIFRPRE8oY2Fpcyk6IFRha2UgY2FyZSBvZiB0aGUgbGVhcm5pbmdfcGhhc2UgYm9vbGVhbiBmbGFnLlxuICAgIC8vICAgaWYgKHRoaXMudXNlTGVhcm5pbmdQaGFzZSkgLi4uXG4gICAgY29uc3QgYmF0Y2hTaXplID0gKEFycmF5LmlzQXJyYXkoeCkgPyB4WzBdIDogeCkuc2hhcGVbMF07XG4gICAgcmV0dXJuIHRoaXMucHJlZGljdExvb3AoeCwgYmF0Y2hTaXplKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBzdGFuZGFyZGl6ZVVzZXJEYXRhWFkoXG4gICAgICB4OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICB5OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sIGNoZWNrQmF0Y2hBeGlzID0gdHJ1ZSxcbiAgICAgIGJhdGNoU2l6ZT86IG51bWJlcik6IFtUZW5zb3JbXSwgVGVuc29yW11dIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgc2FtcGxlV2VpZ2h0LCBjbGFzc1dlaWdodFxuICAgIGlmICh0aGlzLm9wdGltaXplcl8gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihcbiAgICAgICAgICAnWW91IG11c3QgY29tcGlsZSBhIG1vZGVsIGJlZm9yZSB0cmFpbmluZy90ZXN0aW5nLiBVc2UgJyArXG4gICAgICAgICAgJ0xheWVyc01vZGVsLmNvbXBpbGUobW9kZWxDb21waWxlQXJncykuJyk7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFNoYXBlczogU2hhcGVbXSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5mZWVkT3V0cHV0U2hhcGVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHRoaXMuZmVlZE91dHB1dFNoYXBlc1tpXTtcbiAgICAgIGNvbnN0IGxvc3NGbiA9IHRoaXMuZmVlZExvc3NGbnNbaV07XG4gICAgICBpZiAobG9zc0ZuID09PSBsb3NzZXMuc3BhcnNlQ2F0ZWdvcmljYWxDcm9zc2VudHJvcHkpIHtcbiAgICAgICAgb3V0cHV0U2hhcGVzLnB1c2goXG4gICAgICAgICAgICBvdXRwdXRTaGFwZS5zbGljZSgwLCBvdXRwdXRTaGFwZS5sZW5ndGggLSAxKS5jb25jYXQoWzFdKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQb3J0aW5nIE5vdGU6IEJlY2F1c2Ugb2Ygc3Ryb25nIHR5cGluZyBgbG9zc0ZuYCBtdXN0IGJlIGEgZnVuY3Rpb24uXG4gICAgICAgIG91dHB1dFNoYXBlcy5wdXNoKG91dHB1dFNoYXBlKTtcbiAgICAgIH1cbiAgICB9XG4gICAgeCA9IHN0YW5kYXJkaXplSW5wdXREYXRhKFxuICAgICAgICB4LCB0aGlzLmZlZWRJbnB1dE5hbWVzLCB0aGlzLmZlZWRJbnB1dFNoYXBlcywgZmFsc2UsICdpbnB1dCcpO1xuICAgIHkgPSBzdGFuZGFyZGl6ZUlucHV0RGF0YShcbiAgICAgICAgeSwgdGhpcy5mZWVkT3V0cHV0TmFtZXMsIG91dHB1dFNoYXBlcywgZmFsc2UsICd0YXJnZXQnKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBTdGFuZGFyZGl6ZSBzYW1wbGVXZWlnaHRzICYgY2xhc3NXZWlnaHRzLlxuICAgIGNoZWNrQXJyYXlMZW5ndGhzKHgsIHksIG51bGwpO1xuICAgIC8vIFRPRE8oY2Fpcyk6IENoZWNrIHNhbXBsZVdlaWdodHMgYXMgd2VsbC5cbiAgICBjaGVja0xvc3NBbmRUYXJnZXRDb21wYXRpYmlsaXR5KHksIHRoaXMuZmVlZExvc3NGbnMsIHRoaXMuZmVlZE91dHB1dFNoYXBlcyk7XG4gICAgaWYgKHRoaXMuc3RhdGVmdWwgJiYgYmF0Y2hTaXplICE9IG51bGwgJiYgYmF0Y2hTaXplID4gMCkge1xuICAgICAgaWYgKHhbMF0uc2hhcGVbMF0gJSBiYXRjaFNpemUgIT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgSW4gYSBzdGF0ZWZ1bCBuZXR3b3JrLCB5b3Ugc2hvdWxkIG9ubHkgcGFzcyBpbnB1dHMgd2l0aCBhIGAgK1xuICAgICAgICAgICAgYG51bWJlciBvZiBzYW1wbGVzIHRoYXQgaXMgZGl2aXNpYmxlIGJ5IHRoZSBiYXRjaCBzaXplIGAgK1xuICAgICAgICAgICAgYCR7YmF0Y2hTaXplfS4gRm91bmQ6ICR7eFswXS5zaGFwZVswXX0gc2FtcGxlKHMpLmApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3gsIHldO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIHN0YW5kYXJkaXplVXNlckRhdGEoXG4gICAgICB4OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICB5OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICBzYW1wbGVXZWlnaHQ/OiBUZW5zb3J8VGVuc29yW118e1tvdXRwdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgICAgY2xhc3NXZWlnaHQ/OiBDbGFzc1dlaWdodHxDbGFzc1dlaWdodFtdfENsYXNzV2VpZ2h0TWFwLFxuICAgICAgY2hlY2tCYXRjaEF4aXMgPSB0cnVlLFxuICAgICAgYmF0Y2hTaXplPzogbnVtYmVyKTogUHJvbWlzZTxbVGVuc29yW10sIFRlbnNvcltdLCBUZW5zb3JbXV0+IHtcbiAgICBjb25zdCBbc3RhbmRhcmRYcywgc3RhbmRhcmRZc10gPVxuICAgICAgICB0aGlzLnN0YW5kYXJkaXplVXNlckRhdGFYWSh4LCB5LCBjaGVja0JhdGNoQXhpcywgYmF0Y2hTaXplKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBIYW5kbGUgc2FtcGxlV2VpZ2h0cy5cbiAgICBpZiAoc2FtcGxlV2VpZ2h0ICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignc2FtcGxlIHdlaWdodCBpcyBub3Qgc3VwcG9ydGVkIHlldC4nKTtcbiAgICB9XG5cbiAgICBsZXQgc3RhbmRhcmRTYW1wbGVXZWlnaHRzOiBUZW5zb3JbXSA9IG51bGw7XG4gICAgaWYgKGNsYXNzV2VpZ2h0ICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IGNsYXNzV2VpZ2h0cyA9XG4gICAgICAgICAgc3RhbmRhcmRpemVDbGFzc1dlaWdodHMoY2xhc3NXZWlnaHQsIHRoaXMub3V0cHV0TmFtZXMpO1xuICAgICAgc3RhbmRhcmRTYW1wbGVXZWlnaHRzID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsYXNzV2VpZ2h0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBzdGFuZGFyZFNhbXBsZVdlaWdodHMucHVzaChcbiAgICAgICAgICAgIGF3YWl0IHN0YW5kYXJkaXplV2VpZ2h0cyhzdGFuZGFyZFlzW2ldLCBudWxsLCBjbGFzc1dlaWdodHNbaV0pKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUT0RPKGNhaXMpOiBEZWFsIHdpdGggdGhlIGNhc2Ugb2YgbW9kZWwuc3RhdGVmdWwgPT0gdHJ1ZS5cbiAgICByZXR1cm4gW3N0YW5kYXJkWHMsIHN0YW5kYXJkWXMsIHN0YW5kYXJkU2FtcGxlV2VpZ2h0c107XG4gIH1cblxuICAvKipcbiAgICogTG9vcCBvdmVyIHNvbWUgdGVzdCBkYXRhIGluIGJhdGNoZXMuXG4gICAqIEBwYXJhbSBmIEEgRnVuY3Rpb24gcmV0dXJuaW5nIGEgbGlzdCBvZiB0ZW5zb3JzLlxuICAgKiBAcGFyYW0gaW5zIEFycmF5IG9mIHRlbnNvcnMgdG8gYmUgZmVkIHRvIGBmYC5cbiAgICogQHBhcmFtIGJhdGNoU2l6ZSBJbnRlZ2VyIGJhdGNoIHNpemUgb3IgYG51bGxgIC8gYHVuZGVmaW5lZGAuXG4gICAqIEBwYXJhbSB2ZXJib3NlIHZlcmJvc2l0eSBtb2RlLlxuICAgKiBAcGFyYW0gc3RlcHMgVG90YWwgbnVtYmVyIG9mIHN0ZXBzIChiYXRjaGVzIG9mIHNhbXBsZXMpIGJlZm9yZVxuICAgKiBkZWNsYXJpbmcgdGVzdCBmaW5pc2hlZC4gSWdub3JlZCB3aXRoIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGBudWxsYCAvXG4gICAqIGB1bmRlZmluZWRgLlxuICAgKiBAcmV0dXJucyBBcnJheSBvZiBTY2FsYXJzLlxuICAgKi9cbiAgcHJpdmF0ZSB0ZXN0TG9vcChcbiAgICAgIGY6IChkYXRhOiBUZW5zb3JbXSkgPT4gU2NhbGFyW10sIGluczogVGVuc29yW10sIGJhdGNoU2l6ZT86IG51bWJlcixcbiAgICAgIHZlcmJvc2UgPSAwLCBzdGVwcz86IG51bWJlcik6IFNjYWxhcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgbnVtU2FtcGxlcyA9IHRoaXMuY2hlY2tOdW1TYW1wbGVzKGlucywgYmF0Y2hTaXplLCBzdGVwcywgJ3N0ZXBzJyk7XG4gICAgICBjb25zdCBvdXRzOiBTY2FsYXJbXSA9IFtdO1xuICAgICAgaWYgKHZlcmJvc2UgPiAwKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCdWZXJib3NlIG1vZGUgaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICAgIH1cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFVzZSBgaW5kaWNlc0ZvckNvbnZlcnNpb25Ub0RlbnNlJyB0byBwcmV2ZW50IHNsb3cgZG93bi5cbiAgICAgIGlmIChzdGVwcyAhPSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgICAgJ3N0ZXBzIG1vZGUgaW4gdGVzdExvb3AoKSBpcyBub3QgaW1wbGVtZW50ZWQgeWV0Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBiYXRjaGVzID0gbWFrZUJhdGNoZXMobnVtU2FtcGxlcywgYmF0Y2hTaXplKTtcbiAgICAgICAgY29uc3QgaW5kZXhBcnJheSA9IHRlbnNvcjFkKHJhbmdlKDAsIG51bVNhbXBsZXMpKTtcbiAgICAgICAgZm9yIChsZXQgYmF0Y2hJbmRleCA9IDA7IGJhdGNoSW5kZXggPCBiYXRjaGVzLmxlbmd0aDsgKytiYXRjaEluZGV4KSB7XG4gICAgICAgICAgY29uc3QgYmF0Y2hTdGFydCA9IGJhdGNoZXNbYmF0Y2hJbmRleF1bMF07XG4gICAgICAgICAgY29uc3QgYmF0Y2hFbmQgPSBiYXRjaGVzW2JhdGNoSW5kZXhdWzFdO1xuICAgICAgICAgIGNvbnN0IGJhdGNoSWRzID1cbiAgICAgICAgICAgICAgSy5zbGljZUFsb25nRmlyc3RBeGlzKFxuICAgICAgICAgICAgICAgICAgaW5kZXhBcnJheSwgYmF0Y2hTdGFydCwgYmF0Y2hFbmQgLSBiYXRjaFN0YXJ0KSBhcyBUZW5zb3IxRDtcbiAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBJbiBpbnMsIHRyYWluIGZsYWcgY2FuIGJlIGEgbnVtYmVyLCBpbnN0ZWFkIG9mIGFuXG4gICAgICAgICAgLy8gICBUZW5zb3I/IERvIHdlIG5lZWQgdG8gaGFuZGxlIHRoaXMgaW4gdGZqcy1sYXllcnM/XG4gICAgICAgICAgY29uc3QgaW5zQmF0Y2ggPSBzbGljZUFycmF5c0J5SW5kaWNlcyhpbnMsIGJhdGNoSWRzKSBhcyBTY2FsYXJbXTtcbiAgICAgICAgICBjb25zdCBiYXRjaE91dHMgPSBmKGluc0JhdGNoKTtcbiAgICAgICAgICBpZiAoYmF0Y2hJbmRleCA9PT0gMCkge1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBiYXRjaE91dHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgb3V0cy5wdXNoKHNjYWxhcigwKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hPdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBjb25zdCBiYXRjaE91dCA9IGJhdGNoT3V0c1tpXTtcbiAgICAgICAgICAgIG91dHNbaV0gPVxuICAgICAgICAgICAgICAgIHRmYy5hZGQob3V0c1tpXSwgdGZjLm11bChiYXRjaEVuZCAtIGJhdGNoU3RhcnQsIGJhdGNoT3V0KSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIG91dHNbaV0gPSB0ZmMuZGl2KG91dHNbaV0sIG51bVNhbXBsZXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cztcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBnZXREZWR1cGVkTWV0cmljc05hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBvdXRMYWJlbHMgPSB0aGlzLm1ldHJpY3NOYW1lcztcbiAgICAvLyBSZW5hbWUgZHVwbGljYXRlZCBtZXRyaWNzIG5hbWVzIChjYW4gaGFwcGVuIHdpdGggYW4gb3V0cHV0IGxheWVyXG4gICAgLy8gc2hhcmVkIGFtb25nIG11bHRpcGxlIGRhdGFmbG93cykuXG4gICAgY29uc3QgZGVkdXBlZE91dExhYmVscyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0TGFiZWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBsYWJlbCA9IG91dExhYmVsc1tpXTtcbiAgICAgIGxldCBuZXdMYWJlbCA9IGxhYmVsO1xuICAgICAgaWYgKGNvdW50KG91dExhYmVscywgbGFiZWwpID4gMSkge1xuICAgICAgICBjb25zdCBkdXBJbmRleCA9IGNvdW50KG91dExhYmVscy5zbGljZSgwLCBpKSwgbGFiZWwpO1xuICAgICAgICBuZXdMYWJlbCArPSBgXyR7ZHVwSW5kZXh9YDtcbiAgICAgIH1cbiAgICAgIGRlZHVwZWRPdXRMYWJlbHMucHVzaChuZXdMYWJlbCk7XG4gICAgfVxuICAgIHJldHVybiBkZWR1cGVkT3V0TGFiZWxzO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczpcbiAgICpcbiAgICogMS4gY29tcHV0ZXMgdGhlIGxvc3Nlc1xuICAgKiAyLiBzdW1zIHRoZW0gdG8gZ2V0IHRoZSB0b3RhbCBsb3NzXG4gICAqIDMuIGNhbGwgdGhlIG9wdGltaXplciBjb21wdXRlcyB0aGUgZ3JhZGllbnRzIG9mIHRoZSBMYXllcnNNb2RlbCdzXG4gICAqICAgIHRyYWluYWJsZSB3ZWlnaHRzIHcuci50LiB0aGUgdG90YWwgbG9zcyBhbmQgdXBkYXRlIHRoZSB2YXJpYWJsZXNcbiAgICogNC4gY2FsY3VsYXRlcyB0aGUgbWV0cmljc1xuICAgKiA1LiByZXR1cm5zIHRoZSB2YWx1ZXMgb2YgdGhlIGxvc3NlcyBhbmQgbWV0cmljcy5cbiAgICovXG4gIHByb3RlY3RlZCBtYWtlVHJhaW5GdW5jdGlvbigpOiAoZGF0YTogVGVuc29yW10pID0+IFNjYWxhcltdIHtcbiAgICByZXR1cm4gKGRhdGE6IFRlbnNvcltdKSA9PiB7XG4gICAgICBjb25zdCBsb3NzVmFsdWVzOiBTY2FsYXJbXSA9IFtdO1xuXG4gICAgICBjb25zdCBpbnB1dHMgPSBkYXRhLnNsaWNlKDAsIHRoaXMuaW5wdXRzLmxlbmd0aCk7XG4gICAgICBjb25zdCB0YXJnZXRzID0gZGF0YS5zbGljZShcbiAgICAgICAgICB0aGlzLmlucHV0cy5sZW5ndGgsIHRoaXMuaW5wdXRzLmxlbmd0aCArIHRoaXMub3V0cHV0cy5sZW5ndGgpO1xuICAgICAgY29uc3Qgc2FtcGxlV2VpZ2h0cyA9IGRhdGEuc2xpY2UoXG4gICAgICAgICAgdGhpcy5pbnB1dHMubGVuZ3RoICsgdGhpcy5vdXRwdXRzLmxlbmd0aCxcbiAgICAgICAgICB0aGlzLmlucHV0cy5sZW5ndGggKyB0aGlzLm91dHB1dHMubGVuZ3RoICogMik7XG5cbiAgICAgIGNvbnN0IG1ldHJpY3NWYWx1ZXM6IFNjYWxhcltdID0gW107XG5cbiAgICAgIC8vIENyZWF0ZSBhIGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgdGhlIHRvdGFsIGxvc3MgYmFzZWQgb24gdGhlXG4gICAgICAvLyBpbnB1dHMuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3Igb2J0YWluaW5nIGdyYWRpZW50cyB0aHJvdWdoXG4gICAgICAvLyBiYWNrcHJvcC5cbiAgICAgIGNvbnN0IHRvdGFsTG9zc0Z1bmN0aW9uID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBmZWVkcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuaW5wdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgZmVlZHMucHVzaCh7a2V5OiB0aGlzLmlucHV0c1tpXSwgdmFsdWU6IGlucHV0c1tpXX0pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGZlZWREaWN0ID0gbmV3IEZlZWREaWN0KGZlZWRzKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0cyA9XG4gICAgICAgICAgICBleGVjdXRlKHRoaXMub3V0cHV0cywgZmVlZERpY3QsIHsndHJhaW5pbmcnOiB0cnVlfSkgYXMgVGVuc29yW107XG4gICAgICAgIC8vIFRPRE8oY2Fpcyk6IFRha2UgY2FyZSBvZiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBvdXRwdXRzIGZyb20gYVxuICAgICAgICAvLyAgIHNpbmdsZSBsYXllcj9cblxuICAgICAgICBsZXQgdG90YWxMb3NzOiBUZW5zb3I7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb3NzRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgbG9zc0Z1bmN0aW9uID0gdGhpcy5sb3NzRnVuY3Rpb25zW2ldO1xuICAgICAgICAgIGxldCBsb3NzID0gbG9zc0Z1bmN0aW9uKHRhcmdldHNbaV0sIG91dHB1dHNbaV0pO1xuICAgICAgICAgIGlmIChzYW1wbGVXZWlnaHRzW2ldICE9IG51bGwpIHtcbiAgICAgICAgICAgIGxvc3MgPSBjb21wdXRlV2VpZ2h0ZWRMb3NzKGxvc3MsIHNhbXBsZVdlaWdodHNbaV0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IHB1c2ggU2NhbGFyIGluc3RlYWQuXG4gICAgICAgICAgY29uc3QgbWVhbkxvc3M6IFNjYWxhciA9IHRmYy5tZWFuKGxvc3MpO1xuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFVzZSBhIHNjb3BlKCkgaW5zdGVhZCwgdG8gYXZvaWQgb3duZXJzaGlwLlxuICAgICAgICAgIGxvc3NWYWx1ZXMucHVzaChtZWFuTG9zcyk7XG4gICAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIHRvdGFsTG9zcyA9IGxvc3M7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvdGFsTG9zcyA9IHRmYy5hZGQodG90YWxMb3NzLCBsb3NzKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBtZXRyaWNzLlxuICAgICAgICAvLyBUT0RPKGNhaXMpOiBUaGVzZSBzaG91bGQgcHJvYmFibHkgYmUgY2FsY3VsYXRlZCBvdXRzaWRlXG4gICAgICAgIC8vICAgdG90YWxMb3NzRnVuY3Rpb24gdG8gYmVuZWZpdCBzcGVlZD9cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm1ldHJpY3NUZW5zb3JzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgbGV0IHdlaWdodGVkTWV0cmljOiBTY2FsYXI7XG5cbiAgICAgICAgICBpZiAodGhpcy5vdXRwdXRzLmxlbmd0aCA+IDEgJiYgaSA8IHRoaXMub3V0cHV0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHdlaWdodGVkTWV0cmljID0gbG9zc1ZhbHVlc1tpXTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgbWV0cmljID0gdGhpcy5tZXRyaWNzVGVuc29yc1tpXVswXTtcbiAgICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gdGhpcy5tZXRyaWNzVGVuc29yc1tpXVsxXTtcbiAgICAgICAgICAgIHdlaWdodGVkTWV0cmljID1cbiAgICAgICAgICAgICAgICB0ZmMubWVhbihtZXRyaWModGFyZ2V0c1tvdXRwdXRJbmRleF0sIG91dHB1dHNbb3V0cHV0SW5kZXhdKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGZjLmtlZXAod2VpZ2h0ZWRNZXRyaWMpO1xuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFVzZSBhIHNjb3BlKCkgaW5zdGVhZCwgdG8gYXZvaWQgb3duZXJzaGlwLlxuICAgICAgICAgIG1ldHJpY3NWYWx1ZXMucHVzaCh3ZWlnaHRlZE1ldHJpYyk7XG4gICAgICAgIH1cblxuICAgICAgICB0b3RhbExvc3MgPSB0ZmMubWVhbih0b3RhbExvc3MpO1xuXG4gICAgICAgIC8vIEFkZCByZWd1bGFyaXplciBwZW5hbHRpZXMuXG4gICAgICAgIHRoaXMuY2FsY3VsYXRlTG9zc2VzKCkuZm9yRWFjaChyZWd1bGFyaXplckxvc3MgPT4ge1xuICAgICAgICAgIHRvdGFsTG9zcyA9IHRmYy5hZGQodG90YWxMb3NzLCByZWd1bGFyaXplckxvc3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdG90YWxMb3NzIGFzIFNjYWxhcjtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IHZhcmlhYmxlcyA9IHRoaXMuY29sbGVjdGVkVHJhaW5hYmxlV2VpZ2h0cy5tYXAoXG4gICAgICAgICAgcGFyYW0gPT4gcGFyYW0ucmVhZCgpIGFzIHRmYy5WYXJpYWJsZSk7XG4gICAgICBjb25zdCByZXR1cm5Db3N0ID0gdHJ1ZTtcbiAgICAgIGNvbnN0IHRvdGFsTG9zc1ZhbHVlID1cbiAgICAgICAgICB0aGlzLm9wdGltaXplcl8ubWluaW1pemUodG90YWxMb3NzRnVuY3Rpb24sIHJldHVybkNvc3QsIHZhcmlhYmxlcyk7XG5cbiAgICAgIHJldHVybiBbdG90YWxMb3NzVmFsdWVdLmNvbmNhdChtZXRyaWNzVmFsdWVzKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIGZ1bmN0aW9uIHdoaWNoLCB3aGVuIGludm9rZWQgd2l0aCBhbiBhcnJheSBvZiBgdGYuVGVuc29yYHMgYXMgYVxuICAgKiBiYXRjaCBvZiBpbnB1dHMsIHJldHVybnMgdGhlIHByZXNwZWNpZmllZCBsb3NzIGFuZCBtZXRyaWNzIG9mIHRoZSBtb2RlbFxuICAgKiB1bmRlciB0aGUgYmF0Y2ggb2YgaW5wdXQgZGF0YS5cbiAgICovXG4gIHByaXZhdGUgbWFrZVRlc3RGdW5jdGlvbigpIHtcbiAgICB0aGlzLnRlc3RGdW5jdGlvbiA9IChkYXRhOiBUZW5zb3JbXSkgPT4ge1xuICAgICAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICAgICAgY29uc3QgdmFsT3V0cHV0czogU2NhbGFyW10gPSBbXTtcbiAgICAgICAgbGV0IHRvdGFsTG9zczogU2NhbGFyO1xuICAgICAgICBjb25zdCBpbnB1dHMgPSBkYXRhLnNsaWNlKDAsIHRoaXMuaW5wdXRzLmxlbmd0aCk7XG4gICAgICAgIGNvbnN0IHRhcmdldHMgPSBkYXRhLnNsaWNlKFxuICAgICAgICAgICAgdGhpcy5pbnB1dHMubGVuZ3RoLCB0aGlzLmlucHV0cy5sZW5ndGggKyB0aGlzLm91dHB1dHMubGVuZ3RoKTtcbiAgICAgICAgY29uc3QgZmVlZHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgIGZlZWRzLnB1c2goe2tleTogdGhpcy5pbnB1dHNbaV0sIHZhbHVlOiBpbnB1dHNbaV19KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmZWVkRGljdCA9IG5ldyBGZWVkRGljdChmZWVkcyk7XG4gICAgICAgIGNvbnN0IG91dHB1dHMgPSBleGVjdXRlKHRoaXMub3V0cHV0cywgZmVlZERpY3QpIGFzIFRlbnNvcltdO1xuICAgICAgICAvLyBDb21wdXRlIHRvdGFsIGxvc3MuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5sb3NzRnVuY3Rpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgY29uc3QgbG9zc0Z1bmN0aW9uID0gdGhpcy5sb3NzRnVuY3Rpb25zW2ldO1xuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBzYW1wbGUgd2VpZ2h0aW5nIGFuZCByZXBsYWNlIHRoZSBzaW1wbGVcbiAgICAgICAgICAvLyBhdmVyYWdpbmcuXG4gICAgICAgICAgY29uc3QgbG9zczogU2NhbGFyID0gdGZjLm1lYW4obG9zc0Z1bmN0aW9uKHRhcmdldHNbaV0sIG91dHB1dHNbaV0pKTtcbiAgICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgdG90YWxMb3NzID0gbG9zcztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdG90YWxMb3NzID0gdGZjLmFkZCh0b3RhbExvc3MsIGxvc3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB2YWxPdXRwdXRzLnB1c2godG90YWxMb3NzKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBDb21wdXRlIHRoZSBtZXRyaWNzLlxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubWV0cmljc1RlbnNvcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICBjb25zdCBtZXRyaWMgPSB0aGlzLm1ldHJpY3NUZW5zb3JzW2ldWzBdO1xuICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gdGhpcy5tZXRyaWNzVGVuc29yc1tpXVsxXTtcbiAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBSZXBsYWNlIEsubWVhbigpIHdpdGggYSBwcm9wZXIgd2VpZ2h0aW5nIGZ1bmN0aW9uLlxuICAgICAgICAgIGNvbnN0IG1lYW5NZXRyaWMgPVxuICAgICAgICAgICAgICB0ZmMubWVhbihtZXRyaWModGFyZ2V0c1tvdXRwdXRJbmRleF0sIG91dHB1dHNbb3V0cHV0SW5kZXhdKSk7XG4gICAgICAgICAgdmFsT3V0cHV0cy5wdXNoKG1lYW5NZXRyaWMgYXMgU2NhbGFyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsT3V0cHV0cztcbiAgICAgIH0pO1xuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogVHJhaW5zIHRoZSBtb2RlbCBmb3IgYSBmaXhlZCBudW1iZXIgb2YgZXBvY2hzIChpdGVyYXRpb25zIG9uIGFcbiAgICogZGF0YXNldCkuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCh7XG4gICAqICAgICBsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdfSldXG4gICAqIH0pO1xuICAgKiBtb2RlbC5jb21waWxlKHtvcHRpbWl6ZXI6ICdzZ2QnLCBsb3NzOiAnbWVhblNxdWFyZWRFcnJvcid9KTtcbiAgICogZm9yIChsZXQgaSA9IDE7IGkgPCA1IDsgKytpKSB7XG4gICAqICAgY29uc3QgaCA9IGF3YWl0IG1vZGVsLmZpdCh0Zi5vbmVzKFs4LCAxMF0pLCB0Zi5vbmVzKFs4LCAxXSksIHtcbiAgICogICAgICAgYmF0Y2hTaXplOiA0LFxuICAgKiAgICAgICBlcG9jaHM6IDNcbiAgICogICB9KTtcbiAgICogICBjb25zb2xlLmxvZyhcIkxvc3MgYWZ0ZXIgRXBvY2ggXCIgKyBpICsgXCIgOiBcIiArIGguaGlzdG9yeS5sb3NzWzBdKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHggYHRmLlRlbnNvcmAgb2YgdHJhaW5pbmcgZGF0YSwgb3IgYW4gYXJyYXkgb2YgYHRmLlRlbnNvcmBzIGlmIHRoZVxuICAgKiBtb2RlbCBoYXMgbXVsdGlwbGUgaW5wdXRzLiBJZiBhbGwgaW5wdXRzIGluIHRoZSBtb2RlbCBhcmUgbmFtZWQsIHlvdVxuICAgKiBjYW4gYWxzbyBwYXNzIGEgZGljdGlvbmFyeSBtYXBwaW5nIGlucHV0IG5hbWVzIHRvIGB0Zi5UZW5zb3Jgcy5cbiAgICogQHBhcmFtIHkgYHRmLlRlbnNvcmAgb2YgdGFyZ2V0IChsYWJlbCkgZGF0YSwgb3IgYW4gYXJyYXkgb2YgYHRmLlRlbnNvcmBzIGlmXG4gICAqIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0cy4gSWYgYWxsIG91dHB1dHMgaW4gdGhlIG1vZGVsIGFyZSBuYW1lZCxcbiAgICogeW91IGNhbiBhbHNvIHBhc3MgYSBkaWN0aW9uYXJ5IG1hcHBpbmcgb3V0cHV0IG5hbWVzIHRvIGB0Zi5UZW5zb3Jgcy5cbiAgICogQHBhcmFtIGFyZ3MgQSBgTW9kZWxGaXRBcmdzYCwgY29udGFpbmluZyBvcHRpb25hbCBmaWVsZHMuXG4gICAqXG4gICAqIEByZXR1cm4gQSBgSGlzdG9yeWAgaW5zdGFuY2UuIEl0cyBgaGlzdG9yeWAgYXR0cmlidXRlIGNvbnRhaW5zIGFsbFxuICAgKiAgIGluZm9ybWF0aW9uIGNvbGxlY3RlZCBkdXJpbmcgdHJhaW5pbmcuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVmFsdWVFcnJvciBJbiBjYXNlIG9mIG1pc21hdGNoIGJldHdlZW4gdGhlIHByb3ZpZGVkIGlucHV0XG4gICAqIGRhdGEgYW5kIHdoYXQgdGhlIG1vZGVsIGV4cGVjdHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyBmaXQoXG4gICAgICB4OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICB5OiBUZW5zb3J8VGVuc29yW118e1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0sXG4gICAgICBhcmdzOiBNb2RlbEZpdEFyZ3MgPSB7fSk6IFByb21pc2U8SGlzdG9yeT4ge1xuICAgIHJldHVybiBmaXRUZW5zb3JzKHRoaXMsIHgsIHksIGFyZ3MpO1xuICB9XG5cbiAgLy8gVE9ETyhjYWlzKTogQWRkIGNvZGUgc25pcHBldCBiZWxvdyB3aGVuIGl0J3MgcG9zc2libGUgdG8gaW5zdGFudGlhdGVcbiAgLy8gICBhY3R1YWwgZGF0YXNldCBvYmplY3RzLlxuICAvKipcbiAgICogVHJhaW5zIHRoZSBtb2RlbCB1c2luZyBhIGRhdGFzZXQgb2JqZWN0LlxuICAgKlxuICAgKiBAcGFyYW0gZGF0YXNldCBBIGRhdGFzZXQgb2JqZWN0LiBJdHMgYGl0ZXJhdG9yKClgIG1ldGhvZCBpcyBleHBlY3RlZFxuICAgKiAgIHRvIGdlbmVyYXRlIGEgZGF0YXNldCBpdGVyYXRvciBvYmplY3QsIHRoZSBgbmV4dCgpYCBtZXRob2Qgb2Ygd2hpY2hcbiAgICogICBpcyBleHBlY3RlZCB0byBwcm9kdWNlIGRhdGEgYmF0Y2hlcyBmb3IgdHJhaW5pbmcuIFRoZSByZXR1cm4gdmFsdWVcbiAgICogICBvZiB0aGUgYG5leHQoKWAgY2FsbCBvdWdodCB0byBjb250YWluIGEgYm9vbGVhbiBgZG9uZWAgZmllbGQgYW5kIGFcbiAgICogICBgdmFsdWVgIGZpZWxkLiBUaGUgYHZhbHVlYCBmaWVsZCBpcyBleHBlY3RlZCB0byBiZSBhbiBhcnJheSBvZiB0d29cbiAgICogICBgdGYuVGVuc29yYHMgb3IgYW4gYXJyYXkgb2YgdHdvIG5lc3RlZCBgdGYuVGVuc29yYCBzdHJ1Y3R1cmVzLiBUaGUgZm9ybWVyXG4gICAqICAgY2FzZSBpcyBmb3IgbW9kZWxzIHdpdGggZXhhY3RseSBvbmUgaW5wdXQgYW5kIG9uZSBvdXRwdXQgKGUuZy5cbiAgICogICBhIHNlcXVlbnRpYWwgbW9kZWwpLiBUaGUgbGF0dGVyIGNhc2UgaXMgZm9yIG1vZGVscyB3aXRoIG11bHRpcGxlXG4gICAqICAgaW5wdXRzIGFuZC9vciBtdWx0aXBsZSBvdXRwdXRzLlxuICAgKiAgIE9mIHRoZSB0d28gaXRlbXMgaW4gdGhlIGFycmF5LCB0aGUgZmlyc3QgaXMgdGhlIGlucHV0IGZlYXR1cmUocykgYW5kXG4gICAqICAgdGhlIHNlY29uZCBpcyB0aGUgb3V0cHV0IHRhcmdldChzKS5cbiAgICogQHBhcmFtIGFyZ3MgQSBgTW9kZWxGaXREYXRhc2V0QXJnc2AsIGNvbnRhaW5pbmcgb3B0aW9uYWwgZmllbGRzLlxuICAgKlxuICAgKiBAcmV0dXJuIEEgYEhpc3RvcnlgIGluc3RhbmNlLiBJdHMgYGhpc3RvcnlgIGF0dHJpYnV0ZSBjb250YWlucyBhbGxcbiAgICogICBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZHVyaW5nIHRyYWluaW5nLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgZml0RGF0YXNldDxUPihkYXRhc2V0OiBEYXRhc2V0PFQ+LCBhcmdzOiBNb2RlbEZpdERhdGFzZXRBcmdzPFQ+KTpcbiAgICAgIFByb21pc2U8SGlzdG9yeT4ge1xuICAgIHJldHVybiBmaXREYXRhc2V0KHRoaXMsIGRhdGFzZXQsIGFyZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJ1bnMgYSBzaW5nbGUgZ3JhZGllbnQgdXBkYXRlIG9uIGEgc2luZ2xlIGJhdGNoIG9mIGRhdGEuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSBgZml0KClgIGFuZCBgZml0RGF0YXNldCgpYCBpbiB0aGUgZm9sbG93aW5nXG4gICAqIHJlZ2FyZHM6XG4gICAqICAgLSBJdCBvcGVyYXRlcyBvbiBleGFjdGx5IG9uZSBiYXRjaCBvZiBkYXRhLlxuICAgKiAgIC0gSXQgcmV0dXJucyBvbmx5IHRoZSBsb3NzIGFuZCBtZXRyaWMgdmFsdWVzLCBpbnN0ZWFkIG9mXG4gICAqICAgICByZXR1cm5pbmcgdGhlIGJhdGNoLWJ5LWJhdGNoIGxvc3MgYW5kIG1ldHJpYyB2YWx1ZXMuXG4gICAqICAgLSBJdCBkb2Vzbid0IHN1cHBvcnQgZmluZS1ncmFpbmVkIG9wdGlvbnMgc3VjaCBhcyB2ZXJib3NpdHkgYW5kXG4gICAqICAgICBjYWxsYmFja3MuXG4gICAqXG4gICAqIEBwYXJhbSB4IElucHV0IGRhdGEuIEl0IGNvdWxkIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOlxuICAgKiAgIC0gQSBgdGYuVGVuc29yYCwgb3IgYW4gQXJyYXkgb2YgYHRmLlRlbnNvcmBzIChpbiBjYXNlIHRoZSBtb2RlbCBoYXNcbiAgICogICAgIG11bHRpcGxlIGlucHV0cykuXG4gICAqICAgLSBBbiBPYmplY3QgbWFwcGluZyBpbnB1dCBuYW1lcyB0byBjb3JyZXNwb25kaW5nIGB0Zi5UZW5zb3JgIChpZiB0aGVcbiAgICogICAgIG1vZGVsIGhhcyBuYW1lZCBpbnB1dHMpLlxuICAgKiBAcGFyYW0geSBUYXJnZXQgZGF0YS4gSXQgY291bGQgYmUgZWl0aGVyIGEgYHRmLlRlbnNvcmAgb3IgbXVsdGlwbGVcbiAgICogICBgdGYuVGVuc29yYHMuIEl0IHNob3VsZCBiZSBjb25zaXN0ZW50IHdpdGggYHhgLlxuICAgKiBAcmV0dXJucyBUcmFpbmluZyBsb3NzIG9yIGxvc3NlcyAoaW4gY2FzZSB0aGUgbW9kZWwgaGFzXG4gICAqICAgbXVsdGlwbGUgb3V0cHV0cyksIGFsb25nIHdpdGggbWV0cmljcyAoaWYgYW55KSwgYXMgbnVtYmVycy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGFzeW5jIHRyYWluT25CYXRjaChcbiAgICAgIHg6IFRlbnNvcnxUZW5zb3JbXXx7W2lucHV0TmFtZTogc3RyaW5nXTogVGVuc29yfSxcbiAgICAgIHk6IFRlbnNvcnxUZW5zb3JbXXxcbiAgICAgIHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9KTogUHJvbWlzZTxudW1iZXJ8bnVtYmVyW10+IHtcbiAgICAvLyBUT0RPKGNhaXMpOiBTdXBwb3J0IHNhbXBsZVdlaWdodCBhbmQgY2xhc3NXZWlnaHQuXG4gICAgLy8gVE9ETyhjYWlzKTogU3VwcG9ydCBEYXRhc2V0IG9iamVjdHMuXG4gICAgY29uc3Qgc3RhbmRhcmRpemVPdXQgPSBhd2FpdCB0aGlzLnN0YW5kYXJkaXplVXNlckRhdGEoeCwgeSk7XG4gICAgY29uc3QgaW5wdXRzID0gc3RhbmRhcmRpemVPdXRbMF07XG4gICAgY29uc3QgdGFyZ2V0cyA9IHN0YW5kYXJkaXplT3V0WzFdO1xuICAgIGNvbnN0IHRyYWluRnVuY3Rpb24gPSB0aGlzLm1ha2VUcmFpbkZ1bmN0aW9uKCk7XG4gICAgY29uc3QgbG9zc2VzID0gdHJhaW5GdW5jdGlvbihpbnB1dHMuY29uY2F0KHRhcmdldHMpKTtcbiAgICBjb25zdCBsb3NzVmFsdWVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbG9zcyBvZiBsb3NzZXMpIHtcbiAgICAgIGNvbnN0IHYgPSBhd2FpdCBsb3NzLmRhdGEoKTtcbiAgICAgIGxvc3NWYWx1ZXMucHVzaCh2WzBdKTtcbiAgICB9XG4gICAgdGZjLmRpc3Bvc2UobG9zc2VzKTtcbiAgICBkaXNwb3NlTmV3VGVuc29ycyhzdGFuZGFyZGl6ZU91dFswXSwgeCk7XG4gICAgZGlzcG9zZU5ld1RlbnNvcnMoc3RhbmRhcmRpemVPdXRbMV0sIHkpO1xuICAgIHJldHVybiBzaW5nbGV0b25PckFycmF5KGxvc3NWYWx1ZXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4dHJhY3Qgd2VpZ2h0IHZhbHVlcyBvZiB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWc6IEFuIGluc3RhbmNlIG9mIGBpby5TYXZlQ29uZmlnYCwgd2hpY2ggc3BlY2lmaWVzXG4gICAqIG1vZGVsLXNhdmluZyBvcHRpb25zIHN1Y2ggYXMgd2hldGhlciBvbmx5IHRyYWluYWJsZSB3ZWlnaHRzIGFyZSB0byBiZVxuICAgKiBzYXZlZC5cbiAgICogQHJldHVybnMgQSBgTmFtZWRUZW5zb3JNYXBgIG1hcHBpbmcgb3JpZ2luYWwgd2VpZ2h0IG5hbWVzIChpLmUuLFxuICAgKiAgIG5vbi11bmlxdWVpZmllZCB3ZWlnaHQgbmFtZXMpIHRvIHRoZWlyIHZhbHVlcy5cbiAgICovXG4gIHByb3RlY3RlZCBnZXROYW1lZFdlaWdodHMoY29uZmlnPzogaW8uU2F2ZUNvbmZpZyk6IE5hbWVkVGVuc29yW10ge1xuICAgIGNvbnN0IG5hbWVkV2VpZ2h0czogTmFtZWRUZW5zb3JbXSA9IFtdO1xuXG4gICAgY29uc3QgdHJhaW5hYmxlT25seSA9IGNvbmZpZyAhPSBudWxsICYmIGNvbmZpZy50cmFpbmFibGVPbmx5O1xuICAgIGNvbnN0IHdlaWdodHMgPSB0cmFpbmFibGVPbmx5ID8gdGhpcy50cmFpbmFibGVXZWlnaHRzIDogdGhpcy53ZWlnaHRzO1xuICAgIGNvbnN0IHdlaWdodFZhbHVlcyA9IHRoaXMuZ2V0V2VpZ2h0cyh0cmFpbmFibGVPbmx5KTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdlaWdodHMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0cmFpbmFibGVPbmx5ICYmICF3ZWlnaHRzW2ldLnRyYWluYWJsZSkge1xuICAgICAgICAvLyBPcHRpb25hbGx5IHNraXAgbm9uLXRyYWluYWJsZSB3ZWlnaHRzLlxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIG5hbWVkV2VpZ2h0cy5wdXNoKFxuICAgICAgICAgIHtuYW1lOiB3ZWlnaHRzW2ldLm9yaWdpbmFsTmFtZSwgdGVuc29yOiB3ZWlnaHRWYWx1ZXNbaV19KTtcbiAgICB9XG4gICAgcmV0dXJuIG5hbWVkV2VpZ2h0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgdXNlZCBmb3IgZm9yY2Ugc3RvcHBpbmcgb2YgTGF5ZXJzTW9kZWwuZml0KCkgKGkuZS4sIHRyYWluaW5nKS5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgaW5wdXQgPSB0Zi5pbnB1dCh7c2hhcGU6IFsxMF19KTtcbiAgICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMX0pLmFwcGx5KGlucHV0KTtcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5tb2RlbCh7aW5wdXRzOiBbaW5wdXRdLCBvdXRwdXRzOiBbb3V0cHV0XX0pO1xuICAgKiBtb2RlbC5jb21waWxlKHtsb3NzOiAnbWVhblNxdWFyZWRFcnJvcicsIG9wdGltaXplcjogJ3NnZCd9KTtcbiAgICogY29uc3QgeHMgPSB0Zi5vbmVzKFs4LCAxMF0pO1xuICAgKiBjb25zdCB5cyA9IHRmLnplcm9zKFs4LCAxXSk7XG4gICAqXG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCBtb2RlbC5maXQoeHMsIHlzLCB7XG4gICAqICAgZXBvY2hzOiAxMCxcbiAgICogICBjYWxsYmFja3M6IHtcbiAgICogICAgIG9uRXBvY2hFbmQ6IGFzeW5jIChlcG9jaCwgbG9ncykgPT4ge1xuICAgKiAgICAgICBpZiAoZXBvY2ggPT09IDIpIHtcbiAgICogICAgICAgICBtb2RlbC5zdG9wVHJhaW5pbmcgPSB0cnVlO1xuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gVGhlcmUgc2hvdWxkIGJlIG9ubHkgMyB2YWx1ZXMgaW4gdGhlIGxvc3MgYXJyYXksIGluc3RlYWQgb2YgMTBcbiAgICogdmFsdWVzLFxuICAgKiAvLyBkdWUgdG8gdGhlIHN0b3BwaW5nIGFmdGVyIDMgZXBvY2hzLlxuICAgKiBjb25zb2xlLmxvZyhoaXN0b3J5Lmhpc3RvcnkubG9zcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0IHN0b3BUcmFpbmluZyhzdG9wOiBib29sZWFuKSB7XG4gICAgdGhpcy5zdG9wVHJhaW5pbmdfID0gc3RvcDtcbiAgfVxuXG4gIGdldCBzdG9wVHJhaW5pbmcoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuc3RvcFRyYWluaW5nXztcbiAgfVxuXG4gIGdldCBvcHRpbWl6ZXIoKTogT3B0aW1pemVyIHtcbiAgICByZXR1cm4gdGhpcy5vcHRpbWl6ZXJfO1xuICB9XG5cbiAgc2V0IG9wdGltaXplcihvcHRpbWl6ZXI6IE9wdGltaXplcikge1xuICAgIGlmICh0aGlzLm9wdGltaXplcl8gIT09IG9wdGltaXplcikge1xuICAgICAgdGhpcy5vcHRpbWl6ZXJfID0gb3B0aW1pemVyO1xuICAgICAgdGhpcy5pc09wdGltaXplck93bmVkID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgZGlzcG9zZSgpOiBEaXNwb3NlUmVzdWx0IHtcbiAgICBjb25zdCByZXN1bHQgPSBzdXBlci5kaXNwb3NlKCk7XG4gICAgaWYgKHJlc3VsdC5yZWZDb3VudEFmdGVyRGlzcG9zZSA9PT0gMCAmJiB0aGlzLm9wdGltaXplciAhPSBudWxsICYmXG4gICAgICAgIHRoaXMuaXNPcHRpbWl6ZXJPd25lZCkge1xuICAgICAgY29uc3QgbnVtVGVuc29yc0JlZm9yZU9wdG1pemVyRGlzcG9zYWwgPSB0ZmMubWVtb3J5KCkubnVtVGVuc29ycztcbiAgICAgIHRoaXMub3B0aW1pemVyXy5kaXNwb3NlKCk7XG4gICAgICByZXN1bHQubnVtRGlzcG9zZWRWYXJpYWJsZXMgKz1cbiAgICAgICAgICBudW1UZW5zb3JzQmVmb3JlT3B0bWl6ZXJEaXNwb3NhbCAtIHRmYy5tZW1vcnkoKS5udW1UZW5zb3JzO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRMb3NzSWRlbnRpZmllcnMoKTogTG9zc0lkZW50aWZpZXJ8TG9zc0lkZW50aWZpZXJbXXxcbiAgICAgIHtbb3V0cHV0TmFtZTogc3RyaW5nXTogTG9zc0lkZW50aWZpZXJ9IHtcbiAgICBsZXQgbG9zc05hbWVzOiBMb3NzSWRlbnRpZmllcnxMb3NzSWRlbnRpZmllcltdfFxuICAgICAgICB7W291dHB1dE5hbWU6IHN0cmluZ106IExvc3NJZGVudGlmaWVyfTtcbiAgICBpZiAodHlwZW9mIHRoaXMubG9zcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGxvc3NOYW1lcyA9IHRvU25ha2VDYXNlKHRoaXMubG9zcykgYXMgTG9zc0lkZW50aWZpZXI7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMubG9zcykpIHtcbiAgICAgIGZvciAoY29uc3QgbG9zcyBvZiB0aGlzLmxvc3MpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBsb3NzICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignU2VyaWFsaXphdGlvbiBvZiBub24tc3RyaW5nIGxvc3MgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbG9zc05hbWVzID0gKHRoaXMubG9zcyBhcyBzdHJpbmdbXSkubWFwKG5hbWUgPT4gdG9TbmFrZUNhc2UobmFtZSkpIGFzXG4gICAgICAgICAgTG9zc0lkZW50aWZpZXJbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3V0cHV0TmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLmxvc3MpO1xuICAgICAgbG9zc05hbWVzID0ge30gYXMge1tvdXRwdXROYW1lOiBzdHJpbmddOiBMb3NzSWRlbnRpZmllcn07XG4gICAgICBjb25zdCBsb3NzZXMgPVxuICAgICAgICAgIHRoaXMubG9zcyBhcyB7W291dHB1dE5hbWU6IHN0cmluZ106IExvc3NPck1ldHJpY0ZuIHwgc3RyaW5nfTtcbiAgICAgIGZvciAoY29uc3Qgb3V0cHV0TmFtZSBvZiBvdXRwdXROYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIGxvc3Nlc1tvdXRwdXROYW1lXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICBsb3NzTmFtZXNbb3V0cHV0TmFtZV0gPVxuICAgICAgICAgICAgICB0b1NuYWtlQ2FzZShsb3NzZXNbb3V0cHV0TmFtZV0gYXMgc3RyaW5nKSBhcyBMb3NzSWRlbnRpZmllcjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlcmlhbGl6YXRpb24gb2Ygbm9uLXN0cmluZyBsb3NzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxvc3NOYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWV0cmljSWRlbnRpZmllcnMoKTogTWV0cmljc0lkZW50aWZpZXJbXXxcbiAgICAgIHtba2V5OiBzdHJpbmddOiBNZXRyaWNzSWRlbnRpZmllcn0ge1xuICAgIGlmICh0eXBlb2YgdGhpcy5tZXRyaWNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICB0eXBlb2YgdGhpcy5tZXRyaWNzID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gW3RvU25ha2VDYXNlKE1ldHJpY3MuZ2V0TG9zc09yTWV0cmljTmFtZSh0aGlzLm1ldHJpY3MpKV07XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMubWV0cmljcykpIHtcbiAgICAgIHJldHVybiB0aGlzLm1ldHJpY3MubWFwKFxuICAgICAgICAgIG1ldHJpYyA9PiB0b1NuYWtlQ2FzZShNZXRyaWNzLmdldExvc3NPck1ldHJpY05hbWUobWV0cmljKSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBtZXRyaWNzSWRlbnRpZmllcnM6IHtba2V5OiBzdHJpbmddOiBNZXRyaWNzSWRlbnRpZmllcn0gPSB7fTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRoaXMubWV0cmljcykge1xuICAgICAgICBtZXRyaWNzSWRlbnRpZmllcnNba2V5XSA9XG4gICAgICAgICAgICB0b1NuYWtlQ2FzZShNZXRyaWNzLmdldExvc3NPck1ldHJpY05hbWUodGhpcy5tZXRyaWNzW2tleV0pKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZXRyaWNzSWRlbnRpZmllcnM7XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIGdldFRyYWluaW5nQ29uZmlnKCk6IFRyYWluaW5nQ29uZmlnIHtcbiAgICByZXR1cm4ge1xuICAgICAgbG9zczogdGhpcy5nZXRMb3NzSWRlbnRpZmllcnMoKSxcbiAgICAgIG1ldHJpY3M6IHRoaXMuZ2V0TWV0cmljSWRlbnRpZmllcnMoKSxcbiAgICAgIG9wdGltaXplcl9jb25maWc6IHtcbiAgICAgICAgY2xhc3NfbmFtZTogdGhpcy5vcHRpbWl6ZXIuZ2V0Q2xhc3NOYW1lKCksXG4gICAgICAgIGNvbmZpZzogdGhpcy5vcHRpbWl6ZXIuZ2V0Q29uZmlnKClcbiAgICAgIH0gYXMgT3B0aW1pemVyU2VyaWFsaXphdGlvblxuICAgIH07XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIHdlaWdodF9tZXRyaWNzIHdoZW4gdGhleSBhcmUgc3VwcG9ydGVkLlxuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBzYW1wbGVfd2VpZ2h0X21vZGUgd2hlbiBpdCdzIHN1cHBvcnRlZC5cbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbG9zc193ZWlnaHRzIHdoZW4gaXQncyBzdXBwb3J0ZWQuXG4gIH1cblxuICBsb2FkVHJhaW5pbmdDb25maWcodHJhaW5pbmdDb25maWc6IFRyYWluaW5nQ29uZmlnKSB7XG4gICAgaWYgKHRyYWluaW5nQ29uZmlnLndlaWdodGVkX21ldHJpY3MgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2FkaW5nIHdlaWdodF9tZXRyaWNzIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LicpO1xuICAgIH1cbiAgICBpZiAodHJhaW5pbmdDb25maWcubG9zc193ZWlnaHRzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTG9hZGluZyBsb3NzX3dlaWdodHMgaXMgbm90IHN1cHBvcnRlZCB5ZXQuJyk7XG4gICAgfVxuICAgIGlmICh0cmFpbmluZ0NvbmZpZy5zYW1wbGVfd2VpZ2h0X21vZGUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdMb2FkaW5nIHNhbXBsZV93ZWlnaHRfbW9kZSBpcyBub3Qgc3VwcG9ydGVkIHlldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCB0c0NvbmZpZyA9IGNvbnZlcnRQeXRob25pY1RvVHModHJhaW5pbmdDb25maWcub3B0aW1pemVyX2NvbmZpZykgYXNcbiAgICAgICAgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0O1xuICAgIGNvbnN0IG9wdGltaXplciA9IGRlc2VyaWFsaXplKHRzQ29uZmlnKSBhcyBPcHRpbWl6ZXI7XG5cbiAgICBsZXQgbG9zcztcbiAgICBpZiAodHlwZW9mIHRyYWluaW5nQ29uZmlnLmxvc3MgPT09ICdzdHJpbmcnKSB7XG4gICAgICBsb3NzID0gdG9DYW1lbENhc2UodHJhaW5pbmdDb25maWcubG9zcyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRyYWluaW5nQ29uZmlnLmxvc3MpKSB7XG4gICAgICBsb3NzID0gdHJhaW5pbmdDb25maWcubG9zcy5tYXAobG9zc0VudHJ5ID0+IHRvQ2FtZWxDYXNlKGxvc3NFbnRyeSkpO1xuICAgIH0gZWxzZSBpZiAodHJhaW5pbmdDb25maWcubG9zcyAhPSBudWxsKSB7XG4gICAgICBsb3NzID0ge30gYXMge1tvdXRwdXROYW1lOiBzdHJpbmddOiBMb3NzSWRlbnRpZmllcn07XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB0cmFpbmluZ0NvbmZpZy5sb3NzKSB7XG4gICAgICAgIGxvc3Nba2V5XSA9IHRvQ2FtZWxDYXNlKHRyYWluaW5nQ29uZmlnLmxvc3Nba2V5XSkgYXMgTG9zc0lkZW50aWZpZXI7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IG1ldHJpY3M7XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodHJhaW5pbmdDb25maWcubWV0cmljcykpIHtcbiAgICAgIG1ldHJpY3MgPSB0cmFpbmluZ0NvbmZpZy5tZXRyaWNzLm1hcChtZXRyaWMgPT4gdG9DYW1lbENhc2UobWV0cmljKSk7XG4gICAgfSBlbHNlIGlmICh0cmFpbmluZ0NvbmZpZy5tZXRyaWNzICE9IG51bGwpIHtcbiAgICAgIG1ldHJpY3MgPSB7fSBhcyB7W291dHB1dE5hbWU6IHN0cmluZ106IE1ldHJpY3NJZGVudGlmaWVyfTtcbiAgICAgIGZvciAoY29uc3Qga2V5IGluIHRyYWluaW5nQ29uZmlnLm1ldHJpY3MpIHtcbiAgICAgICAgbWV0cmljc1trZXldID0gdG9DYW1lbENhc2UodHJhaW5pbmdDb25maWcubWV0cmljc1trZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvbXBpbGUoe2xvc3MsIG1ldHJpY3MsIG9wdGltaXplcn0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNhdmUgdGhlIGNvbmZpZ3VyYXRpb24gYW5kL29yIHdlaWdodHMgb2YgdGhlIExheWVyc01vZGVsLlxuICAgKlxuICAgKiBBbiBgSU9IYW5kbGVyYCBpcyBhbiBvYmplY3QgdGhhdCBoYXMgYSBgc2F2ZWAgbWV0aG9kIG9mIHRoZSBwcm9wZXJcbiAgICogc2lnbmF0dXJlIGRlZmluZWQuIFRoZSBgc2F2ZWAgbWV0aG9kIG1hbmFnZXMgdGhlIHN0b3Jpbmcgb3JcbiAgICogdHJhbnNtaXNzaW9uIG9mIHNlcmlhbGl6ZWQgZGF0YSAoXCJhcnRpZmFjdHNcIikgdGhhdCByZXByZXNlbnQgdGhlXG4gICAqIG1vZGVsJ3MgdG9wb2xvZ3kgYW5kIHdlaWdodHMgb250byBvciB2aWEgYSBzcGVjaWZpYyBtZWRpdW0sIHN1Y2ggYXNcbiAgICogZmlsZSBkb3dubG9hZHMsIGxvY2FsIHN0b3JhZ2UsIEluZGV4ZWREQiBpbiB0aGUgd2ViIGJyb3dzZXIgYW5kIEhUVFBcbiAgICogcmVxdWVzdHMgdG8gYSBzZXJ2ZXIuIFRlbnNvckZsb3cuanMgcHJvdmlkZXMgYElPSGFuZGxlcmBcbiAgICogaW1wbGVtZW50YXRpb25zIGZvciBhIG51bWJlciBvZiBmcmVxdWVudGx5IHVzZWQgc2F2aW5nIG1lZGl1bXMsIHN1Y2ggYXNcbiAgICogYHRmLmlvLmJyb3dzZXJEb3dubG9hZHNgIGFuZCBgdGYuaW8uYnJvd3NlckxvY2FsU3RvcmFnZWAuIFNlZSBgdGYuaW9gXG4gICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGFsc28gYWxsb3dzIHlvdSB0byByZWZlciB0byBjZXJ0YWluIHR5cGVzIG9mIGBJT0hhbmRsZXJgc1xuICAgKiBhcyBVUkwtbGlrZSBzdHJpbmcgc2hvcnRjdXRzLCBzdWNoIGFzICdsb2NhbHN0b3JhZ2U6Ly8nIGFuZFxuICAgKiAnaW5kZXhlZGRiOi8vJy5cbiAgICpcbiAgICogRXhhbXBsZSAxOiBTYXZlIGBtb2RlbGAncyB0b3BvbG9neSBhbmQgd2VpZ2h0cyB0byBicm93c2VyIFtsb2NhbFxuICAgKiBzdG9yYWdlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2xvY2FsU3RvcmFnZSk7XG4gICAqIHRoZW4gbG9hZCBpdCBiYWNrLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoXG4gICAqICAgICB7bGF5ZXJzOiBbdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzNdfSldfSk7XG4gICAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gb3JpZ2luYWwgbW9kZWw6Jyk7XG4gICAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbMSwgM10pKS5wcmludCgpO1xuICAgKlxuICAgKiBjb25zdCBzYXZlUmVzdWx0cyA9IGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnKTtcbiAgICpcbiAgICogY29uc3QgbG9hZGVkTW9kZWwgPSBhd2FpdCB0Zi5sb2FkTGF5ZXJzTW9kZWwoJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnKTtcbiAgICogY29uc29sZS5sb2coJ1ByZWRpY3Rpb24gZnJvbSBsb2FkZWQgbW9kZWw6Jyk7XG4gICAqIGxvYWRlZE1vZGVsLnByZWRpY3QodGYub25lcyhbMSwgM10pKS5wcmludCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogRXhhbXBsZSAyLiBTYXZpbmcgYG1vZGVsYCdzIHRvcG9sb2d5IGFuZCB3ZWlnaHRzIHRvIGJyb3dzZXJcbiAgICogW0luZGV4ZWREQl0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0luZGV4ZWREQl9BUEkpO1xuICAgKiB0aGVuIGxvYWQgaXQgYmFjay5cbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKFxuICAgKiAgICAge2xheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFszXX0pXX0pO1xuICAgKiBjb25zb2xlLmxvZygnUHJlZGljdGlvbiBmcm9tIG9yaWdpbmFsIG1vZGVsOicpO1xuICAgKiBtb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAgICpcbiAgICogY29uc3Qgc2F2ZVJlc3VsdHMgPSBhd2FpdCBtb2RlbC5zYXZlKCdpbmRleGVkZGI6Ly9teS1tb2RlbC0xJyk7XG4gICAqXG4gICAqIGNvbnN0IGxvYWRlZE1vZGVsID0gYXdhaXQgdGYubG9hZExheWVyc01vZGVsKCdpbmRleGVkZGI6Ly9teS1tb2RlbC0xJyk7XG4gICAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gbG9hZGVkIG1vZGVsOicpO1xuICAgKiBsb2FkZWRNb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEV4YW1wbGUgMy4gU2F2aW5nIGBtb2RlbGAncyB0b3BvbG9neSBhbmQgd2VpZ2h0cyBhcyB0d28gZmlsZXNcbiAgICogKGBteS1tb2RlbC0xLmpzb25gIGFuZCBgbXktbW9kZWwtMS53ZWlnaHRzLmJpbmApIGRvd25sb2FkZWQgZnJvbVxuICAgKiBicm93c2VyLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoXG4gICAqICAgICB7bGF5ZXJzOiBbdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzNdfSldfSk7XG4gICAqIGNvbnN0IHNhdmVSZXN1bHRzID0gYXdhaXQgbW9kZWwuc2F2ZSgnZG93bmxvYWRzOi8vbXktbW9kZWwtMScpO1xuICAgKiBgYGBcbiAgICpcbiAgICogRXhhbXBsZSA0LiBTZW5kICBgbW9kZWxgJ3MgdG9wb2xvZ3kgYW5kIHdlaWdodHMgdG8gYW4gSFRUUCBzZXJ2ZXIuXG4gICAqIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBgdGYuaW8uaHR0cGAgZm9yIG1vcmUgZGV0YWlsc1xuICAgKiBpbmNsdWRpbmcgc3BlY2lmeWluZyByZXF1ZXN0IHBhcmFtZXRlcnMgYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZVxuICAgKiBzZXJ2ZXIuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbChcbiAgICogICAgIHtsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbM119KV19KTtcbiAgICogY29uc3Qgc2F2ZVJlc3VsdHMgPSBhd2FpdCBtb2RlbC5zYXZlKCdodHRwOi8vbXktc2VydmVyL21vZGVsL3VwbG9hZCcpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXJPclVSTCBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCBvciBhIFVSTC1saWtlLFxuICAgKiBzY2hlbWUtYmFzZWQgc3RyaW5nIHNob3J0Y3V0IGZvciBgSU9IYW5kbGVyYC5cbiAgICogQHBhcmFtIGNvbmZpZyBPcHRpb25zIGZvciBzYXZpbmcgdGhlIG1vZGVsLlxuICAgKiBAcmV0dXJucyBBIGBQcm9taXNlYCBvZiBgU2F2ZVJlc3VsdGAsIHdoaWNoIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBvZlxuICAgKiB0aGUgc2F2aW5nLCBzdWNoIGFzIGJ5dGUgc2l6ZXMgb2YgdGhlIHNhdmVkIGFydGlmYWN0cyBmb3IgdGhlIG1vZGVsJ3NcbiAgICogICB0b3BvbG9neSBhbmQgd2VpZ2h0IHZhbHVlcy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgaWdub3JlQ0k6IHRydWV9XG4gICAqL1xuICBhc3luYyBzYXZlKGhhbmRsZXJPclVSTDogaW8uSU9IYW5kbGVyfHN0cmluZywgY29uZmlnPzogaW8uU2F2ZUNvbmZpZyk6XG4gICAgICBQcm9taXNlPGlvLlNhdmVSZXN1bHQ+IHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXJPclVSTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gaW8uZ2V0U2F2ZUhhbmRsZXJzKGhhbmRsZXJPclVSTCk7XG4gICAgICBpZiAoaGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBzYXZlIGhhbmRsZXJzIGZvciBVUkwgJyR7aGFuZGxlck9yVVJMfSdgKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlcnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBGb3VuZCBtb3JlIHRoYW4gb25lICgke2hhbmRsZXJzLmxlbmd0aH0pIHNhdmUgaGFuZGxlcnMgZm9yIGAgK1xuICAgICAgICAgICAgYFVSTCAnJHtoYW5kbGVyT3JVUkx9J2ApO1xuICAgICAgfVxuICAgICAgaGFuZGxlck9yVVJMID0gaGFuZGxlcnNbMF07XG4gICAgfVxuICAgIGlmIChoYW5kbGVyT3JVUkwuc2F2ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnTGF5ZXJzTW9kZWwuc2F2ZSgpIGNhbm5vdCBwcm9jZWVkIGJlY2F1c2UgdGhlIElPSGFuZGxlciAnICtcbiAgICAgICAgICAncHJvdmlkZWQgZG9lcyBub3QgaGF2ZSB0aGUgYHNhdmVgIGF0dHJpYnV0ZSBkZWZpbmVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHdlaWdodERhdGFBbmRTcGVjcyA9XG4gICAgICAgIGF3YWl0IGlvLmVuY29kZVdlaWdodHModGhpcy5nZXROYW1lZFdlaWdodHMoY29uZmlnKSk7XG5cbiAgICBjb25zdCByZXR1cm5TdHJpbmcgPSBmYWxzZTtcbiAgICBjb25zdCB1bnVzZWRBcmc6IHt9ID0gbnVsbDtcbiAgICBjb25zdCBtb2RlbENvbmZpZyA9IHRoaXMudG9KU09OKHVudXNlZEFyZywgcmV0dXJuU3RyaW5nKTtcbiAgICBjb25zdCBtb2RlbEFydGlmYWN0czogaW8uTW9kZWxBcnRpZmFjdHMgPSB7XG4gICAgICBtb2RlbFRvcG9sb2d5OiBtb2RlbENvbmZpZyxcbiAgICAgIGZvcm1hdDogTEFZRVJTX01PREVMX0ZPUk1BVF9OQU1FLFxuICAgICAgZ2VuZXJhdGVkQnk6IGBUZW5zb3JGbG93LmpzIHRmanMtbGF5ZXJzIHYke3ZlcnNpb259YCxcbiAgICAgIGNvbnZlcnRlZEJ5OiBudWxsLFxuICAgIH07XG5cbiAgICBjb25zdCBpbmNsdWRlT3B0aW1pemVyID0gY29uZmlnID09IG51bGwgPyBmYWxzZSA6IGNvbmZpZy5pbmNsdWRlT3B0aW1pemVyO1xuICAgIGlmIChpbmNsdWRlT3B0aW1pemVyICYmIHRoaXMub3B0aW1pemVyICE9IG51bGwpIHtcbiAgICAgIG1vZGVsQXJ0aWZhY3RzLnRyYWluaW5nQ29uZmlnID0gdGhpcy5nZXRUcmFpbmluZ0NvbmZpZygpO1xuICAgICAgY29uc3Qgd2VpZ2h0VHlwZSA9ICdvcHRpbWl6ZXInO1xuICAgICAgY29uc3Qge2RhdGE6IG9wdGltaXplcldlaWdodERhdGEsIHNwZWNzOiBvcHRpbWl6ZXJXZWlnaHRTcGVjc30gPVxuICAgICAgICAgIGF3YWl0IGlvLmVuY29kZVdlaWdodHMoYXdhaXQgdGhpcy5vcHRpbWl6ZXIuZ2V0V2VpZ2h0cygpLCB3ZWlnaHRUeXBlKTtcbiAgICAgIHdlaWdodERhdGFBbmRTcGVjcy5zcGVjcy5wdXNoKC4uLm9wdGltaXplcldlaWdodFNwZWNzKTtcbiAgICAgIHdlaWdodERhdGFBbmRTcGVjcy5kYXRhID0gaW8uY29uY2F0ZW5hdGVBcnJheUJ1ZmZlcnMoXG4gICAgICAgICAgW3dlaWdodERhdGFBbmRTcGVjcy5kYXRhLCBvcHRpbWl6ZXJXZWlnaHREYXRhXSk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgICAvLyBDaGVjayBzZXJpYWxpemVkIHNpemUgb2YgdXNlci1kZWZpbmVkIG1ldGFkYXRhLlxuICAgICAgY29uc3QgY2hlY2tTaXplID0gdHJ1ZTtcbiAgICAgIGNoZWNrVXNlckRlZmluZWRNZXRhZGF0YSh0aGlzLnVzZXJEZWZpbmVkTWV0YWRhdGEsIHRoaXMubmFtZSwgY2hlY2tTaXplKTtcbiAgICAgIG1vZGVsQXJ0aWZhY3RzLnVzZXJEZWZpbmVkTWV0YWRhdGEgPSB0aGlzLnVzZXJEZWZpbmVkTWV0YWRhdGE7XG4gICAgfVxuXG4gICAgbW9kZWxBcnRpZmFjdHMud2VpZ2h0RGF0YSA9IHdlaWdodERhdGFBbmRTcGVjcy5kYXRhO1xuICAgIG1vZGVsQXJ0aWZhY3RzLndlaWdodFNwZWNzID0gd2VpZ2h0RGF0YUFuZFNwZWNzLnNwZWNzO1xuICAgIHJldHVybiBoYW5kbGVyT3JVUkwuc2F2ZShtb2RlbEFydGlmYWN0cyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHVzZXItZGVmaW5lZCBtZXRhZGF0YS5cbiAgICpcbiAgICogVGhlIHNldCBtZXRhZGF0YSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG9nZXRoZXIgd2l0aCB0aGUgdG9wb2xvZ3lcbiAgICogYW5kIHdlaWdodHMgb2YgdGhlIG1vZGVsIGR1cmluZyBgc2F2ZSgpYCBjYWxscy5cbiAgICpcbiAgICogQHBhcmFtIHNldFVzZXJEZWZpbmVkTWV0YWRhdGFcbiAgICovXG4gIHNldFVzZXJEZWZpbmVkTWV0YWRhdGEodXNlckRlZmluZWRNZXRhZGF0YToge30pOiB2b2lkIHtcbiAgICBjaGVja1VzZXJEZWZpbmVkTWV0YWRhdGEodXNlckRlZmluZWRNZXRhZGF0YSwgdGhpcy5uYW1lKTtcbiAgICB0aGlzLnVzZXJEZWZpbmVkTWV0YWRhdGEgPSB1c2VyRGVmaW5lZE1ldGFkYXRhO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCB1c2VyLWRlZmluZWQgbWV0YWRhdGEuXG4gICAqXG4gICAqIFRoZSBtZXRhZGF0YSBpcyBzdXBwbGllZCB2aWEgb25lIG9mIHRoZSB0d28gcm91dGVzOlxuICAgKiAgIDEuIEJ5IGNhbGxpbmcgYHNldFVzZXJEZWZpbmVkTWV0YWRhdGEoKWAuXG4gICAqICAgMi4gTG9hZGVkIGR1cmluZyBtb2RlbCBsb2FkaW5nIChpZiB0aGUgbW9kZWwgaXMgY29uc3RydWN0ZWRcbiAgICogICAgICB2aWEgYHRmLmxvYWRMYXllcnNNb2RlbCgpYC4pXG4gICAqXG4gICAqIElmIG5vIHVzZXItZGVmaW5lZCBtZXRhZGF0YSBpcyBhdmFpbGFibGUgZnJvbSBlaXRoZXIgb2YgdGhlXG4gICAqIHR3byByb3V0ZXMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gICAqL1xuICBnZXRVc2VyRGVmaW5lZE1ldGFkYXRhKCk6IHt9IHtcbiAgICByZXR1cm4gdGhpcy51c2VyRGVmaW5lZE1ldGFkYXRhO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTGF5ZXJzTW9kZWwpO1xuXG4vKipcbiAqIEEgYHRmLkZ1bmN0aW9uYWxgIGlzIGFuIGFsaWFzIHRvIGB0Zi5MYXllcnNNb2RlbGAuXG4gKlxuICogU2VlIGFsc286XG4gKiAgIGB0Zi5MYXllcnNNb2RlbGAsIGB0Zi5TZXF1ZW50aWFsYCwgYHRmLmxvYWRMYXllcnNNb2RlbGAuXG4gKi9cbi8qKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfSAqL1xuZXhwb3J0IGNsYXNzIEZ1bmN0aW9uYWwgZXh0ZW5kcyBMYXllcnNNb2RlbCB7XG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRnVuY3Rpb25hbCc7XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRnVuY3Rpb25hbCk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* Original source keras/models.py */\nimport { dispose, io, serialization, util } from '@tensorflow/tfjs-core';\nimport { getUid } from './backend/state';\nimport { Input } from './engine/input_layer';\nimport { getSourceInputs, Node } from './engine/topology';\nimport { LayersModel } from './engine/training';\nimport { NotImplementedError, RuntimeError, ValueError } from './errors';\nimport { deserialize } from './layers/serialization';\nimport * as generic_utils from './utils/generic_utils';\nimport { convertPythonicToTs } from './utils/serialization_utils';\nimport { getExactlyOneShape } from './utils/types_utils';\n/**\n * Parses a JSON model configuration file and returns a model instance.\n *\n * ```js\n * // This example shows how to serialize a model using `toJSON()` and\n * // deserialize it as another model using `tf.models.modelFromJSON()`.\n * // Note: this example serializes and deserializes only the topology\n * // of the model; the weights of the loaded model will be different\n * // from those of the the original model, due to random weight\n * // initialization.\n * // To load the topology and weights of a model, use `tf.loadLayersModel()`.\n * const model1 = tf.sequential();\n * model1.add(tf.layers.repeatVector({inputShape: [2], n: 4}));\n * // Serialize `model1` as a JSON object.\n * const model1JSON = model1.toJSON(null, false);\n * model1.summary();\n *\n * const model2 = await tf.models.modelFromJSON(model1JSON);\n * model2.summary();\n * ```\n *\n *  @param modelAndWeightsConfig JSON object or string encoding a model and\n *       weights configuration. It can also be only the topology JSON of the\n *       model, in which case the weights will not be loaded.\n *  @param custom_objects Optional dictionary mapping names\n *       (strings) to custom classes or functions to be\n *       considered during deserialization.\n * @returns A TensorFlow.js Layers `tf.LayersModel` instance (uncompiled).\n */\nexport async function modelFromJSON(modelAndWeightsConfig, customObjects) {\n    if (!('modelTopology' in modelAndWeightsConfig)) {\n        modelAndWeightsConfig = { modelTopology: modelAndWeightsConfig };\n    }\n    modelAndWeightsConfig = modelAndWeightsConfig;\n    let modelTopology = modelAndWeightsConfig.modelTopology;\n    if (modelTopology['model_config'] != null) {\n        // If the model-topology JSON contains a 'model_config' field, then it is\n        // a full model JSON (e.g., from `keras.Model.save()`), which contains\n        // not only the model's architecture in its 'model_config' field, but\n        // additional information such as the model's optimizer. We use only the\n        // 'model_config' field currently.\n        modelTopology = modelTopology['model_config'];\n    }\n    const tsConfig = convertPythonicToTs(modelTopology);\n    const model = deserialize(tsConfig, customObjects);\n    if (modelAndWeightsConfig.weightsManifest != null) {\n        // Load the weight values keyed by the original tensor names in the model\n        // file that was loaded.  These should match the keys of the weight\n        // manifest.\n        const weightValues = await io.loadWeights(modelAndWeightsConfig.weightsManifest, modelAndWeightsConfig.pathPrefix, model.weights.map(weight => weight.originalName));\n        // Map the weights to the unique tensor names generated during model loading\n        const uniqueWeightValues = {};\n        for (const weight of model.weights) {\n            uniqueWeightValues[weight.originalName] =\n                weightValues[weight.originalName];\n        }\n        model.loadWeights(uniqueWeightValues);\n        // Dispose temporary weight values.\n        dispose(weightValues);\n    }\n    return model;\n}\n/**\n * Load a model, including its topology and optionally weights.  See the\n * Tutorial named \"How to import a Keras Model\" for usage examples.\n *\n * Example 1: Save `model`'s topology and weights to browser [local\n * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n * then load it back.\n *\n * ```js\n * const model = tf.sequential(\n *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * console.log('Prediction from original model:');\n * model.predict(tf.ones([1, 3])).print();\n *\n * const saveResults = await model.save('localstorage://my-model-1');\n *\n * const loadedModel = await tf.loadLayersModel('localstorage://my-model-1');\n * console.log('Prediction from loaded model:');\n * loadedModel.predict(tf.ones([1, 3])).print();\n * ```\n *\n * Example 2. Saving `model`'s topology and weights to browser\n * [IndexedDB](https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API);\n * then load it back.\n *\n * ```js\n * const model = tf.sequential(\n *     {layers: [tf.layers.dense({units: 1, inputShape: [3]})]});\n * console.log('Prediction from original model:');\n * model.predict(tf.ones([1, 3])).print();\n *\n * const saveResults = await model.save('indexeddb://my-model-1');\n *\n * const loadedModel = await tf.loadLayersModel('indexeddb://my-model-1');\n * console.log('Prediction from loaded model:');\n * loadedModel.predict(tf.ones([1, 3])).print();\n * ```\n *\n * Example 3. Load a model from user-selected files from HTML\n * [file input\n * elements](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/file).\n *\n * ```js\n * // Note: this code snippet will not work without the HTML elements in the\n * //   page\n * const jsonUpload = document.getElementById('json-upload');\n * const weightsUpload = document.getElementById('weights-upload');\n *\n * const model = await tf.loadLayersModel(\n *     tf.io.browserFiles([jsonUpload.files[0], weightsUpload.files[0]]));\n * ```\n *\n * Example 4. Load a model from an HTTP server.\n *\n * ```js\n * const model = await\n *     tf.loadLayersModel('https://storage.googleapis.com/tfjs-models/tfjs/iris_v1/model.json');\n * model.summary();\n * ```\n *\n * @param pathOrIOHandler Can be either of the two formats\n *   1. A string path to the `ModelAndWeightsConfig` JSON describing\n *      the model in the canonical TensorFlow.js format. This path will be\n *      interpreted as a relative HTTP path, to which `fetch` will be used to\n *      request the model topology and weight manifest JSON.\n *      The content of the JSON file is assumed to be a JSON object with the\n *      following fields and values:\n *      - 'modelTopology': A JSON object that can be either of:\n *        1. a model architecture JSON consistent with the format of the return\n *            value of `keras.Model.to_json()`\n *        2. a full model JSON in the format of `keras.models.save_model()`.\n *      - 'weightsManifest': A TensorFlow.js weights manifest.\n *      See the Python converter function `save_model()` for more details.\n *      It is also assumed that model weights can be accessed from relative\n *      paths described by the `paths` fields in weights manifest.\n *   2. An `tf.io.IOHandler` object that loads model artifacts with its `load`\n *      method.\n * @param options Optional configuration arguments for the model loading,\n *   including:\n *   - `strict`: Require that the provided weights exactly match those required\n *     by the layers.  Default true.  Passing false means that both extra\n *     weights and missing weights will be silently ignored.\n *   - `onProgress`: A progress callback of the form:\n *     `(fraction: number) => void`. This callback can be used to monitor the\n *     model-loading process.\n * @returns A `Promise` of `tf.LayersModel`, with the topology and weights\n *     loaded.\n */\nexport async function loadLayersModelInternal(pathOrIOHandler, options) {\n    if (options == null) {\n        options = {};\n    }\n    if (typeof pathOrIOHandler === 'string') {\n        const handlers = io.getLoadHandlers(pathOrIOHandler, options);\n        if (handlers.length === 0) {\n            // For backward compatibility: if no load handler can be found,\n            // assume it is a relative http path.\n            // TODO(cais): Reformat the args into a single `LoadOptions` once the core\n            // is refactored.\n            handlers.push(io.browserHTTPRequest(pathOrIOHandler, options));\n        }\n        else if (handlers.length > 1) {\n            throw new ValueError(`Found more than one (${handlers.length}) load handlers for ` +\n                `URL '${pathOrIOHandler}'`);\n        }\n        pathOrIOHandler = handlers[0];\n    }\n    return loadLayersModelFromIOHandler(pathOrIOHandler, undefined, options);\n}\n/**\n * Load a model and optionally its weights, using an IOHandler object.\n *\n * @param handler The instance of `IOHandler` to be used during the model\n *   loading.\n * @param customObjects Any optional custom objects to be used during model\n *   loading.\n * @param strict Whether the weight loading will be done in strict mode.\n *   Default: `true`.\n */\nexport async function loadLayersModelFromIOHandler(handler, customObjects, options) {\n    if (options == null) {\n        options = {};\n    }\n    if (handler.load == null) {\n        throw new ValueError('Cannot proceed with model loading because the IOHandler provided ' +\n            'does not have the `load` method implemented.');\n    }\n    const artifacts = await handler.load();\n    let modelTopology = artifacts.modelTopology;\n    if (modelTopology['model_config'] != null) {\n        modelTopology = modelTopology['model_config'];\n    }\n    const strict = options.strict == null ? true : options.strict;\n    // If weights are provided and the weight-loading mode is strict, use\n    // fast weight initialization. This skips costly initializers such as\n    // 'orthogonal' and saves unnecessary computation in cases where\n    // the initialized weight values will immediately be overwritten by\n    // loaded weight values.\n    const fastWeightInit = artifacts.weightData != null && artifacts.weightSpecs != null && strict;\n    const model = deserialize(convertPythonicToTs(modelTopology), customObjects, fastWeightInit);\n    const trainingConfig = artifacts.trainingConfig;\n    if (trainingConfig != null) {\n        model.loadTrainingConfig(trainingConfig);\n    }\n    if (artifacts.userDefinedMetadata != null) {\n        model.setUserDefinedMetadata(artifacts.userDefinedMetadata);\n    }\n    // If weightData is present, load the weights into the model.\n    if (artifacts.weightData != null) {\n        // Loading weights requires weightSpecs.\n        if (artifacts.weightSpecs == null) {\n            throw new ValueError('LayersModel artifacts contains weight data, but not weight specs. ' +\n                'Therefore loading of weights cannot proceed.');\n        }\n        const { modelWeights, optimizerWeights } = decodeModelAndOptimizerWeights(artifacts.weightData, artifacts.weightSpecs);\n        model.loadWeights(modelWeights, strict);\n        if (model.optimizer != null && optimizerWeights.length > 0) {\n            await model.optimizer.setWeights(optimizerWeights);\n        }\n        // Dispose temporary weight values.\n        dispose(modelWeights);\n        dispose(optimizerWeights.map(w => w.tensor));\n    }\n    return model;\n}\nfunction decodeModelAndOptimizerWeights(buffer, specs) {\n    const name2Tensor = io.decodeWeights(buffer, specs);\n    const modelWeights = {};\n    const optimizerWeights = [];\n    specs.forEach(spec => {\n        if (spec.group === 'optimizer') {\n            optimizerWeights.push({ name: spec.name, tensor: name2Tensor[spec.name] });\n        }\n        else {\n            modelWeights[spec.name] = name2Tensor[spec.name];\n        }\n    });\n    return { modelWeights, optimizerWeights };\n}\n/**\n * A model with a stack of layers, feeding linearly from one to the next.\n *\n * `tf.sequential` is a factory function that creates an instance of\n * `tf.Sequential`.\n *\n * ```js\n *  // Define a model for linear regression.\n *  const model = tf.sequential();\n *  model.add(tf.layers.dense({units: 1, inputShape: [1]}));\n *\n *  // Prepare the model for training: Specify the loss and the optimizer.\n *  model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n *\n *  // Generate some synthetic data for training.\n *  const xs = tf.tensor2d([1, 2, 3, 4], [4, 1]);\n *  const ys = tf.tensor2d([1, 3, 5, 7], [4, 1]);\n *\n *  // Train the model using the data then do inference on a data point the\n *  // model hasn't seen:\n *  await model.fit(xs, ys);\n *  model.predict(tf.tensor2d([5], [1, 1])).print();\n * ```\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\nexport class Sequential extends LayersModel {\n    constructor(args) {\n        super({ inputs: [], outputs: [] });\n        args = args || {};\n        this.trainable = true;\n        this.built = false;\n        // Set model name.\n        this.name = (args.name != null) ? args.name : getUid('sequential_');\n        // Add to the model any layers passed to the constructor.\n        if (args.layers != null) {\n            for (const layer of args.layers) {\n                this.add(layer);\n            }\n        }\n    }\n    // Helper function to Sequential.add  Throws if the new output shape will be\n    // invalid.\n    checkShape(layer) {\n        const shape = layer.inboundNodes[0].outputTensors[0].shape;\n        if (shape.some(x => x < 0)) {\n            throw new ValueError('Negative dimension size caused by adding layer ' +\n                `${layer.name} with input shape [` +\n                `${layer.inboundNodes[0].inputTensors[0].shape}]`);\n        }\n    }\n    /**\n     * Adds a layer instance on top of the layer stack.\n     *\n     * ```js\n     *  const model = tf.sequential();\n     *  model.add(tf.layers.dense({units: 8, inputShape: [1]}));\n     *  model.add(tf.layers.dense({units: 4, activation: 'relu6'}));\n     *  model.add(tf.layers.dense({units: 1, activation: 'relu6'}));\n     *  // Note that the untrained model is random at this point.\n     *  model.predict(tf.randomNormal([10, 1])).print();\n     * ```\n     * @param layer Layer instance.\n     *\n     * @exception ValueError In case the `layer` argument does not know its\n     * input shape.\n     * @exception ValueError In case the `layer` argument has multiple output\n     *   tensors, or is already connected somewhere else (forbidden in\n     *   `Sequential` models).\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    add(layer) {\n        const isLayerModelInstance = layer instanceof Sequential || layer instanceof LayersModel;\n        let modelLayer;\n        if (isLayerModelInstance) {\n            modelLayer = layer;\n            if (modelLayer.outputs.length !== 1) {\n                throw new ValueError('All layers in a Sequential model ' +\n                    'should have a single output tensor. ' +\n                    'For multi-output layers, ' +\n                    'use the functional API.');\n            }\n            if (modelLayer.inputs.length !== 1) {\n                throw new ValueError('All layers in a Sequential model ' +\n                    'should have a single input tensor. ' +\n                    'For multi-input layers, ' +\n                    'use the functional API.');\n            }\n        }\n        if (this.outputs.length === 0) {\n            // first layer in model: check that it is an input layer\n            if (layer.inboundNodes.length === 0) {\n                // create an input layer\n                if (layer.batchInputShape == null) {\n                    throw new ValueError('The first layer in a Sequential model must ' +\n                        'get an `inputShape` or `batchInputShape` argument.');\n                }\n                // Instantiate the input layer.\n                const x = Input({\n                    batchShape: layer.batchInputShape,\n                    dtype: layer.dtype,\n                    name: layer.name + '_input'\n                });\n                // This will build the current layer and create the node connecting\n                // the current layer to the input layer we just created.\n                layer.apply(x);\n            }\n            if (isLayerModelInstance) {\n                this.outputs = modelLayer.outputs;\n                this.inputs = modelLayer.inputs;\n            }\n            else {\n                if (layer.inboundNodes.length !== 1) {\n                    throw new ValueError('A layer added to a Sequential model must not already be ' +\n                        `connected somewhere else. LayersModel received layer ${layer.name} ` +\n                        `which has ${layer.inboundNodes.length} pre-existing inbound ` +\n                        'connections.');\n                }\n                if (layer.inboundNodes[0].outputTensors.length !== 1) {\n                    throw new ValueError('All layers in a Sequential model ' +\n                        'should have a single output tensor. ' +\n                        'For multi-output layers, ' +\n                        'use the functional API.');\n                }\n                this.checkShape(layer);\n                this.outputs = [layer.inboundNodes[0].outputTensors[0]];\n                this.inputs = getSourceInputs(this.outputs[0]);\n            }\n            this.inboundNodes = [];\n            // We create an input node, which we will keep updated\n            // as we add more layers.\n            // (This call has side effects.)\n            // tslint:disable-next-line:no-unused-expression\n            new Node({\n                outboundLayer: this,\n                inboundLayers: [],\n                nodeIndices: [],\n                tensorIndices: [],\n                inputTensors: this.inputs,\n                outputTensors: this.outputs,\n                // no model-level masking for now\n                inputMasks: generic_utils.pyListRepeat(null, this.inputs.length),\n                outputMasks: [null],\n                inputShapes: this.inputs.map(x => x.shape),\n                outputShapes: this.outputs[0].shape\n            });\n        }\n        else {\n            const outputTensor = layer.apply(this.outputs[0]);\n            if (Array.isArray(outputTensor)) {\n                throw new TypeError('All layers in a Sequential model ' +\n                    'should have a single output tensor. ' +\n                    'For multi-output layers, ' +\n                    'use the functional API.');\n            }\n            this.checkShape(layer);\n            this.outputs = [outputTensor];\n            // update self.inbound_nodes\n            this.inboundNodes[0].outputTensors = this.outputs;\n            this.inboundNodes[0].outputShapes = [this.outputs[0].shape];\n        }\n        this.layers.push(layer);\n        this.built = false;\n    }\n    /**\n     * Removes the last layer in the model.\n     *\n     * @exception TypeError if there are no layers in the model.\n     */\n    pop() {\n        if (this.layers.length === 0) {\n            throw new TypeError('There are no layers in the model.');\n        }\n        this.layers.pop();\n        if (this.layers.length === 0) {\n            this.outputs = [];\n            this.inboundNodes = [];\n            this.outboundNodes = [];\n        }\n        else {\n            const lastLayerIndex = this.layers.length - 1;\n            this.layers[lastLayerIndex].outboundNodes = [];\n            this.outputs = [this.layers[lastLayerIndex].output];\n            // update self.inbound_nodes\n            this.inboundNodes[0].outputTensors = this.outputs;\n            this.inboundNodes[0].outputShapes = [this.outputs[0].shape];\n        }\n    }\n    call(inputs, kwargs) {\n        if (this.model == null) {\n            this.build();\n        }\n        return this.model.call(inputs, kwargs);\n    }\n    build(inputShape) {\n        // Call `getExactlyOneShape` without using its return value,\n        // to verify that exactly one input shape is provided.\n        getExactlyOneShape(inputShape);\n        if (this.inputs.length === 0 || this.outputs.length === 0) {\n            throw new TypeError('Sequential model cannot be built: model is empty.' +\n                ' Add some layers first.');\n        }\n        // actually create the model\n        this.model = new LayersModel({\n            inputs: this.inputs,\n            outputs: this.outputs[0],\n            name: this.name + '_model'\n        });\n        this.model.trainable = this.trainable;\n        // mirror model attributes\n        this.supportsMasking = this.model.supportsMasking;\n        // TODO(michaelterry): Add caches\n        this.inputLayers = this.model.inputLayers;\n        this.inputLayersNodeIndices = this.model.inputLayersNodeIndices;\n        this.inputLayersTensorIndices = this.model.inputLayersTensorIndices;\n        this.outputLayers = this.model.outputLayers;\n        this.outputLayersNodeIndices = this.model.outputLayersNodeIndices;\n        this.outputLayersTensorIndices = this.model.outputLayersTensorIndices;\n        this.nodesByDepth = this.model.nodesByDepth;\n        this.containerNodes = this.model.containerNodes;\n        this.outputNames = this.model.outputNames;\n        this.inputNames = this.model.inputNames;\n        // TODO(michaelterry): Add feedInputNames, feedInputs, if needed.\n        // TODO(michaelterry): Add callbackModel if needed.\n        this.built = true;\n    }\n    countParams() {\n        if (!this.built) {\n            this.build();\n        }\n        return super.countParams();\n    }\n    /**\n     * Print a text summary of the Sequential model's layers.\n     *\n     * The summary includes\n     * - Name and type of all layers that comprise the model.\n     * - Output shape(s) of the layers\n     * - Number of weight parameters of each layer\n     * - The total number of trainable and non-trainable parameters of the\n     * model.\n     *\n     * ```js\n     * const model = tf.sequential();\n     * model.add(\n     *     tf.layers.dense({units: 100, inputShape: [10], activation: 'relu'}));\n     * model.add(tf.layers.dense({units: 1, activation: 'sigmoid'}));\n     *\n     * model.summary();\n     * ```\n     *\n     * @param lineLength Custom line length, in number of characters.\n     * @param positions Custom widths of each of the columns, as either\n     *   fractions of `lineLength` (e.g., `[0.5, 0.75, 1]`) or absolute number\n     *   of characters (e.g., `[30, 50, 65]`). Each number corresponds to\n     *   right-most (i.e., ending) position of a column.\n     * @param printFn Custom print function. Can be used to replace the default\n     *   `console.log`. For example, you can use `x => {}` to mute the printed\n     *   messages in the console.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    summary(lineLength, positions, printFn = console.log) {\n        if (!this.built) {\n            this.build();\n        }\n        super.summary(lineLength, positions, printFn);\n    }\n    /**\n     * Sets the weights of the model.\n     *\n     * @param weights Should be a list of Tensors with shapes and types matching\n     *   the output of `model.getWeights()`.\n     */\n    setWeights(weights) {\n        if (this.model == null) {\n            this.build();\n        }\n        this.model.setWeights(weights);\n    }\n    /**\n     * Returns the loss value & metrics values for the model in test mode.\n     *\n     * Loss and metrics are specified during `compile()`, which needs to happen\n     * before calls to `evaluate()`.\n     *\n     * Computation is done in batches.\n     *\n     * ```js\n     * const model = tf.sequential({\n     *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n     * });\n     * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n     * const result = model.evaluate(tf.ones([8, 10]), tf.ones([8, 1]), {\n     *   batchSize: 4,\n     * });\n     * result.print();\n     * ```\n     *\n     * @param x `tf.Tensor` of test data, or an `Array` of `tf.Tensor`s if the\n     * model has multiple inputs.\n     * @param y `tf.Tensor` of target data, or an `Array` of `tf.Tensor`s if the\n     * model has multiple outputs.\n     * @param args A `ModelEvaluateConfig`, containing optional fields.\n     *\n     * @return `Scalar` test loss (if the model has a single output and no\n     *   metrics) or `Array` of `Scalar`s (if the model has multiple outputs\n     *   and/or metrics). The attribute `model.metricsNames`\n     *   will give you the display labels for the scalar outputs.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    evaluate(x, y, args = {}) {\n        if (!this.built) {\n            throw new RuntimeError('The model needs to be compiled before being used.');\n        }\n        return this.model.evaluate(x, y, args);\n    }\n    // TODO(cais): Add code snippet below once real dataset objects are\n    //   available.\n    /**\n     * Evaluate model using a dataset object.\n     *\n     * Note: Unlike `evaluate()`, this method is asynchronous (`async`).\n     *\n     * @param dataset A dataset object. Its `iterator()` method is expected\n     *   to generate a dataset iterator object, the `next()` method of which\n     *   is expected to produce data batches for evaluation. The return value\n     *   of the `next()` call ought to contain a boolean `done` field and a\n     *   `value` field. The `value` field is expected to be an array of two\n     *   `tf.Tensor`s or an array of two nested `tf.Tensor` structures. The former\n     *   case is for models with exactly one input and one output (e.g.\n     *   a sequential model). The latter case is for models with multiple\n     *   inputs and/or multiple outputs. Of the two items in the array, the\n     *   first is the input feature(s) and the second is the output target(s).\n     * @param args A configuration object for the dataset-based evaluation.\n     * @returns Loss and metric values as an Array of `Scalar` objects.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    async evaluateDataset(dataset, args) {\n        if (!this.built) {\n            throw new RuntimeError('The model needs to be compiled before being used.');\n        }\n        return this.model.evaluateDataset(dataset, args);\n    }\n    /**\n     * Generates output predictions for the input samples.\n     *\n     * Computation is done in batches.\n     *\n     * Note: the \"step\" mode of predict() is currently not supported.\n     *   This is because the TensorFlow.js core backend is imperative only.\n     *\n     * ```js\n     * const model = tf.sequential({\n     *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n     * });\n     * model.predict(tf.ones([2, 10])).print();\n     * ```\n     *\n     * @param x The input data, as a Tensor, or an `Array` of `tf.Tensor`s if\n     *   the model has multiple inputs.\n     * @param conifg A `ModelPredictConfig` object containing optional fields.\n     *\n     * @return `tf.Tensor`(s) of predictions.\n     *\n     * @exception ValueError In case of mismatch between the provided input data\n     *   and the model's expectations, or in case a stateful model receives a\n     *   number of samples that is not a multiple of the batch size.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    predict(x, args = {}) {\n        if (this.model == null) {\n            this.build();\n        }\n        return this.model.predict(x, args);\n    }\n    /**\n     * Returns predictions for a single batch of samples.\n     *\n     * @param x: Input samples, as a Tensor, or list of Tensors (if the model\n     *   has multiple inputs).\n     * @return Tensor(s) of predictions\n     */\n    predictOnBatch(x) {\n        if (this.model == null) {\n            this.build();\n        }\n        return this.model.predictOnBatch(x);\n    }\n    /**\n     * See `LayersModel.compile`.\n     *\n     * @param args\n     */\n    compile(args) {\n        this.build();\n        this.model.compile(args);\n        this.optimizer_ = this.model.optimizer;\n        // tslint:disable-next-line:no-any\n        this.isOptimizerOwned = this.model.isOptimizerOwned;\n        this.loss = this.model.loss;\n        this.metrics = this.model.metrics;\n        // TODO(cais): Add this.lossWeights, this.sampleWeightMode,\n        //   this.weightedMetrics, this.targets.\n        this.metricsTensors = this.model.metricsTensors;\n        this.metricsNames = this.model.metricsNames;\n        // TODO(cais): Add sampleWeights.\n    }\n    get optimizer() {\n        return this.model == null ? undefined : this.model.optimizer;\n    }\n    set optimizer(optimizer) {\n        this.model.optimizer = optimizer;\n    }\n    /**\n     * Trains the model for a fixed number of epochs (iterations on a dataset).\n     *\n     * ```js\n     * const model = tf.sequential({\n     *   layers: [tf.layers.dense({units: 1, inputShape: [10]})]\n     * });\n     * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n     * const history = await model.fit(tf.ones([8, 10]), tf.ones([8, 1]), {\n     *   batchSize: 4,\n     *   epochs: 3\n     * });\n     * console.log(history.history.loss[0]);\n     * ```\n     *\n     * @param x `tf.Tensor` of training data, or an array of `tf.Tensor`s if the\n     * model has multiple inputs. If all inputs in the model are named, you can\n     * also pass a dictionary mapping input names to `tf.Tensor`s.\n     * @param y `tf.Tensor` of target (label) data, or an array of `tf.Tensor`s if\n     * the model has multiple outputs. If all outputs in the model are named, you\n     *  can also pass a dictionary mapping output names to `tf.Tensor`s.\n     * @param args  A `ModelFitConfig`, containing optional fields.\n     *\n     * @return A `History` instance. Its `history` attribute contains all\n     *   information collected during training.\n     *\n     * @exception ValueError In case of mismatch between the provided input data\n     *   and what the model expects.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    async fit(x, y, args = {}) {\n        if (!this.built) {\n            throw new RuntimeError('The model needs to be compiled before ' +\n                'being used.');\n        }\n        return this.model.fit(x, y, args);\n    }\n    /**\n     * Trains the model using a dataset object.\n     *\n     * ```js\n     * const xArray = [\n     *   [1, 1, 1, 1, 1, 1, 1, 1, 1],\n     *   [1, 1, 1, 1, 1, 1, 1, 1, 1],\n     *   [1, 1, 1, 1, 1, 1, 1, 1, 1],\n     *   [1, 1, 1, 1, 1, 1, 1, 1, 1],\n     * ];\n     * const yArray = [1, 1, 1, 1];\n     * // Create a dataset from the JavaScript array.\n     * const xDataset = tf.data.array(xArray);\n     * const yDataset = tf.data.array(yArray);\n     * // Zip combines the `x` and `y` Datasets into a single Dataset, the\n     * // iterator of which will return an object containing of two tensors,\n     * // corresponding to `x` and `y`.  The call to `batch(4)` will bundle\n     * // four such samples into a single object, with the same keys now pointing\n     * // to tensors that hold 4 examples, organized along the batch dimension.\n     * // The call to `shuffle(4)` causes each iteration through the dataset to\n     * // happen in a different order.  The size of the shuffle window is 4.\n     * const xyDataset = tf.data.zip({xs: xDataset, ys: yDataset})\n     *     .batch(4)\n     *     .shuffle(4);\n     * const model = tf.sequential({\n     *   layers: [tf.layers.dense({units: 1, inputShape: [9]})]\n     * });\n     * model.compile({optimizer: 'sgd', loss: 'meanSquaredError'});\n     * const history = await model.fitDataset(xyDataset, {\n     *   epochs: 4,\n     *   callbacks: {onEpochEnd: (epoch, logs) => console.log(logs.loss)}\n     * });\n     * ```\n     *\n     * @param dataset A dataset object. Its `iterator()` method is expected to\n     *   generate a dataset iterator object, the `next()` method of which is\n     *   expected to produce data batches for evaluation. The return value of the\n     *   `next()` call ought to contain a boolean `done` field and a `value`\n     *   field.\n     *\n     *   The `value` field is expected to be an object of with fields\n     *   `xs` and `ys`, which point to the feature tensor and the target tensor,\n     *   respectively. This case is for models with exactly one input and one\n     *   output (e.g. a sequential model). For example:\n     *   ```js\n     *   {value: {xs: xsTensor, ys: ysTensor}, done: false}\n     *   ```\n     *\n     *   If the model has multiple inputs, the `xs` field of `value` should\n     *   be an object mapping input names to their respective feature tensors.\n     *   For example:\n     *   ```js\n     *   {\n     *     value: {\n     *       xs: {\n     *         input_1: xsTensor1,\n     *         input_2: xsTensor2\n     *       },\n     *       ys: ysTensor\n     *     },\n     *     done: false\n     *   }\n     *   ```\n     *   If the model has multiple outputs, the `ys` field of `value` should\n     *   be an object mapping output names to their respective target tensors.\n     *   For example:\n     *   ```js\n     *   {\n     *     value: {\n     *       xs: xsTensor,\n     *       ys: {\n     *         output_1: ysTensor1,\n     *         output_2: ysTensor2\n     *       },\n     *     },\n     *     done: false\n     *   }\n     *   ```\n     * @param args A `ModelFitDatasetArgs`, containing optional fields.\n     *\n     * @return A `History` instance. Its `history` attribute contains all\n     *   information collected during training.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n     */\n    async fitDataset(dataset, args) {\n        if (!this.built) {\n            throw new RuntimeError('The model needs to be compiled before ' +\n                'being used.');\n        }\n        return this.model.fitDataset(dataset, args);\n    }\n    /**\n     * Runs a single gradient update on a single batch of data.\n     *\n     * This method differs from `fit()` and `fitDataset()` in the following\n     * regards:\n     *   - It operates on exactly one batch of data.\n     *   - It returns only the loss and metric values, instead of\n     *     returning the batch-by-batch loss and metric values.\n     *   - It doesn't support fine-grained options such as verbosity and\n     *     callbacks.\n     *\n     * @param x Input data. It could be one of the following:\n     *   - A `tf.Tensor`, or an Array of `tf.Tensor`s (in case the model has\n     *     multiple inputs).\n     *   - An Object mapping input names to corresponding `tf.Tensor` (if the\n     *     model has named inputs).\n     * @param y Target data. It could be either a `tf.Tensor` or multiple\n     *   `tf.Tensor`s. It should be consistent with `x`.\n     * @returns Training loss or losses (in case the model has\n     *   multiple outputs), along with metrics (if any), as numbers.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    async trainOnBatch(x, y) {\n        return this.model.trainOnBatch(x, y);\n    }\n    /* See parent class for JsDoc */\n    /** @nocollapse */\n    static fromConfig(cls, config, customObjects = {}, fastWeightInit = false) {\n        let configArray;\n        let extraModelConfig = {};\n        if (config instanceof Array) {\n            if (!(config[0].className != null) ||\n                config[0]['className'] === 'Merge') {\n                throw new ValueError('Legacy serialization format not supported yet.');\n            }\n            configArray = config;\n        }\n        else {\n            util.assert(config['layers'] != null, () => `When the config data for a Sequential model is not an Array, ` +\n                `it must be an Object that contains the 'layers' field.`);\n            configArray = config['layers'];\n            delete config['layers'];\n            extraModelConfig = config;\n        }\n        const model = new cls(extraModelConfig);\n        if (!(model instanceof Sequential)) {\n            throw new NotImplementedError(`Sequential.fromConfig called on non-Sequential input: ${model}`);\n        }\n        for (const conf of configArray) {\n            const customObjects = undefined;\n            const layer = deserialize(conf, customObjects, fastWeightInit);\n            if (fastWeightInit) {\n                layer.setFastWeightInitDuringBuild(true);\n            }\n            model.add(layer);\n        }\n        return model;\n    }\n    /**\n     * Setter used for force stopping of LayersModel.fit() (i.e., training).\n     *\n     * Example:\n     *\n     * ```js\n     * const model = tf.sequential();\n     * model.add(tf.layers.dense({units: 1, inputShape: [10]}));\n     * model.compile({loss: 'meanSquaredError', optimizer: 'sgd'});\n     * const xs = tf.ones([8, 10]);\n     * const ys = tf.zeros([8, 1]);\n     *\n     * const history = await model.fit(xs, ys, {\n     *   epochs: 10,\n     *   callbacks: {\n     *     onEpochEnd: async (epoch, logs) => {\n     *       if (epoch === 2) {\n     *         model.stopTraining = true;\n     *       }\n     *     }\n     *   }\n     * });\n     *\n     * // There should be only 3 values in the loss array, instead of 10 values,\n     * // due to the stopping after 3 epochs.\n     * console.log(history.history.loss);\n     * ```\n     */\n    set stopTraining(stop) {\n        // TODO(cais): When refactoring to remove the composition pattern happens,\n        // remove this method overriding.\n        if (this.model == null) {\n            throw new ValueError('Cannot set the stopTraining property of a sequential model before ' +\n                'it is compiled.');\n        }\n        this.model.stopTraining = stop;\n    }\n    get stopTraining() {\n        if (this.model == null) {\n            throw new ValueError('Cannot get the stopTraining property of a sequential model before ' +\n                'it is compiled.');\n        }\n        return this.model.stopTraining;\n    }\n    // TODO(cais): Override get trainableWeights() here\n    // tslint:disable-next-line:no-any\n    getConfig() {\n        // NOTE(cais): We override the return type of getConfig() to `any` here,\n        //   because the `Sequential` class is a special case among `Container`\n        //   subtypes in that its getConfig() method returns an Array (not a\n        //   dict).\n        const layers = [];\n        for (const layer of this.layers) {\n            const dict = {};\n            dict['className'] = layer.getClassName();\n            dict['config'] = layer.getConfig();\n            layers.push(dict);\n        }\n        return { name: this.name, layers };\n    }\n}\n/** @nocollapse */\nSequential.className = 'Sequential';\nserialization.registerClass(Sequential);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL21vZGVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILHFDQUFxQztBQUVyQyxPQUFPLEVBQUMsT0FBTyxFQUFFLEVBQUUsRUFBcUMsYUFBYSxFQUFVLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWxILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUd2QyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGVBQWUsRUFBUyxJQUFJLEVBQWlCLE1BQU0sbUJBQW1CLENBQUM7QUFDL0UsT0FBTyxFQUFDLFdBQVcsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUduRixPQUFPLEVBQUMsbUJBQW1CLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUl2RSxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFbkQsT0FBTyxLQUFLLGFBQWEsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUNoRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTRCRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsYUFBYSxDQUMvQixxQkFBdUQsRUFDdkQsYUFBd0M7SUFDMUMsSUFBSSxDQUFDLENBQUMsZUFBZSxJQUFJLHFCQUFxQixDQUFDLEVBQUU7UUFDL0MscUJBQXFCLEdBQUcsRUFBQyxhQUFhLEVBQUUscUJBQXFCLEVBQUMsQ0FBQztLQUNoRTtJQUNELHFCQUFxQixHQUFHLHFCQUE4QyxDQUFDO0lBRXZFLElBQUksYUFBYSxHQUFHLHFCQUFx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QUM7U0FDbkI7UUFDRCxPQUFPLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFDLENBQUM7SUFDbkMsQ0FBQzs7QUF6c0JELGtCQUFrQjtBQUNYLG9CQUFTLEdBQUcsWUFBWSxDQUFDO0FBMHNCbEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIE9yaWdpbmFsIHNvdXJjZSBrZXJhcy9tb2RlbHMucHkgKi9cblxuaW1wb3J0IHtkaXNwb3NlLCBpbywgTmFtZWRUZW5zb3JNYXAsIE9wdGltaXplciwgU2NhbGFyLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0VWlkfSBmcm9tICcuL2JhY2tlbmQvc3RhdGUnO1xuaW1wb3J0IHtIaXN0b3J5fSBmcm9tICcuL2Jhc2VfY2FsbGJhY2tzJztcbmltcG9ydCB7RGF0YXNldH0gZnJvbSAnLi9lbmdpbmUvZGF0YXNldF9zdHViJztcbmltcG9ydCB7SW5wdXR9IGZyb20gJy4vZW5naW5lL2lucHV0X2xheWVyJztcbmltcG9ydCB7Z2V0U291cmNlSW5wdXRzLCBMYXllciwgTm9kZSwgU3ltYm9saWNUZW5zb3J9IGZyb20gJy4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7TGF5ZXJzTW9kZWwsIE1vZGVsQ29tcGlsZUFyZ3MsIE1vZGVsRXZhbHVhdGVBcmdzfSBmcm9tICcuL2VuZ2luZS90cmFpbmluZyc7XG5pbXBvcnQge01vZGVsRXZhbHVhdGVEYXRhc2V0QXJncywgTW9kZWxGaXREYXRhc2V0QXJnc30gZnJvbSAnLi9lbmdpbmUvdHJhaW5pbmdfZGF0YXNldCc7XG5pbXBvcnQge01vZGVsRml0QXJnc30gZnJvbSAnLi9lbmdpbmUvdHJhaW5pbmdfdGVuc29ycyc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFJ1bnRpbWVFcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7VHJhaW5pbmdDb25maWd9IGZyb20gJy4va2VyYXNfZm9ybWF0L3RyYWluaW5nX2NvbmZpZyc7XG5pbXBvcnQge1B5SnNvbkRpY3R9IGZyb20gJy4va2VyYXNfZm9ybWF0L3R5cGVzJztcbmltcG9ydCB7ZGVzZXJpYWxpemV9IGZyb20gJy4vbGF5ZXJzL3NlcmlhbGl6YXRpb24nO1xuaW1wb3J0IHtLd2FyZ3MsIE5hbWVkVGVuc29yfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi91dGlscy9nZW5lcmljX3V0aWxzJztcbmltcG9ydCB7Y29udmVydFB5dGhvbmljVG9Uc30gZnJvbSAnLi91dGlscy9zZXJpYWxpemF0aW9uX3V0aWxzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlfSBmcm9tICcuL3V0aWxzL3R5cGVzX3V0aWxzJztcblxuLyoqXG4gKiBQYXJzZXMgYSBKU09OIG1vZGVsIGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgcmV0dXJucyBhIG1vZGVsIGluc3RhbmNlLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBUaGlzIGV4YW1wbGUgc2hvd3MgaG93IHRvIHNlcmlhbGl6ZSBhIG1vZGVsIHVzaW5nIGB0b0pTT04oKWAgYW5kXG4gKiAvLyBkZXNlcmlhbGl6ZSBpdCBhcyBhbm90aGVyIG1vZGVsIHVzaW5nIGB0Zi5tb2RlbHMubW9kZWxGcm9tSlNPTigpYC5cbiAqIC8vIE5vdGU6IHRoaXMgZXhhbXBsZSBzZXJpYWxpemVzIGFuZCBkZXNlcmlhbGl6ZXMgb25seSB0aGUgdG9wb2xvZ3lcbiAqIC8vIG9mIHRoZSBtb2RlbDsgdGhlIHdlaWdodHMgb2YgdGhlIGxvYWRlZCBtb2RlbCB3aWxsIGJlIGRpZmZlcmVudFxuICogLy8gZnJvbSB0aG9zZSBvZiB0aGUgdGhlIG9yaWdpbmFsIG1vZGVsLCBkdWUgdG8gcmFuZG9tIHdlaWdodFxuICogLy8gaW5pdGlhbGl6YXRpb24uXG4gKiAvLyBUbyBsb2FkIHRoZSB0b3BvbG9neSBhbmQgd2VpZ2h0cyBvZiBhIG1vZGVsLCB1c2UgYHRmLmxvYWRMYXllcnNNb2RlbCgpYC5cbiAqIGNvbnN0IG1vZGVsMSA9IHRmLnNlcXVlbnRpYWwoKTtcbiAqIG1vZGVsMS5hZGQodGYubGF5ZXJzLnJlcGVhdFZlY3Rvcih7aW5wdXRTaGFwZTogWzJdLCBuOiA0fSkpO1xuICogLy8gU2VyaWFsaXplIGBtb2RlbDFgIGFzIGEgSlNPTiBvYmplY3QuXG4gKiBjb25zdCBtb2RlbDFKU09OID0gbW9kZWwxLnRvSlNPTihudWxsLCBmYWxzZSk7XG4gKiBtb2RlbDEuc3VtbWFyeSgpO1xuICpcbiAqIGNvbnN0IG1vZGVsMiA9IGF3YWl0IHRmLm1vZGVscy5tb2RlbEZyb21KU09OKG1vZGVsMUpTT04pO1xuICogbW9kZWwyLnN1bW1hcnkoKTtcbiAqIGBgYFxuICpcbiAqICBAcGFyYW0gbW9kZWxBbmRXZWlnaHRzQ29uZmlnIEpTT04gb2JqZWN0IG9yIHN0cmluZyBlbmNvZGluZyBhIG1vZGVsIGFuZFxuICogICAgICAgd2VpZ2h0cyBjb25maWd1cmF0aW9uLiBJdCBjYW4gYWxzbyBiZSBvbmx5IHRoZSB0b3BvbG9neSBKU09OIG9mIHRoZVxuICogICAgICAgbW9kZWwsIGluIHdoaWNoIGNhc2UgdGhlIHdlaWdodHMgd2lsbCBub3QgYmUgbG9hZGVkLlxuICogIEBwYXJhbSBjdXN0b21fb2JqZWN0cyBPcHRpb25hbCBkaWN0aW9uYXJ5IG1hcHBpbmcgbmFtZXNcbiAqICAgICAgIChzdHJpbmdzKSB0byBjdXN0b20gY2xhc3NlcyBvciBmdW5jdGlvbnMgdG8gYmVcbiAqICAgICAgIGNvbnNpZGVyZWQgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi5cbiAqIEByZXR1cm5zIEEgVGVuc29yRmxvdy5qcyBMYXllcnMgYHRmLkxheWVyc01vZGVsYCBpbnN0YW5jZSAodW5jb21waWxlZCkuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBtb2RlbEZyb21KU09OKFxuICAgIG1vZGVsQW5kV2VpZ2h0c0NvbmZpZzogTW9kZWxBbmRXZWlnaHRzQ29uZmlnfFB5SnNvbkRpY3QsXG4gICAgY3VzdG9tT2JqZWN0cz86IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFByb21pc2U8TGF5ZXJzTW9kZWw+IHtcbiAgaWYgKCEoJ21vZGVsVG9wb2xvZ3knIGluIG1vZGVsQW5kV2VpZ2h0c0NvbmZpZykpIHtcbiAgICBtb2RlbEFuZFdlaWdodHNDb25maWcgPSB7bW9kZWxUb3BvbG9neTogbW9kZWxBbmRXZWlnaHRzQ29uZmlnfTtcbiAgfVxuICBtb2RlbEFuZFdlaWdodHNDb25maWcgPSBtb2RlbEFuZFdlaWdodHNDb25maWcgYXMgTW9kZWxBbmRXZWlnaHRzQ29uZmlnO1xuXG4gIGxldCBtb2RlbFRvcG9sb2d5ID0gbW9kZWxBbmRXZWlnaHRzQ29uZmlnLm1vZGVsVG9wb2xvZ3k7XG4gIGlmIChtb2RlbFRvcG9sb2d5Wydtb2RlbF9jb25maWcnXSAhPSBudWxsKSB7XG4gICAgLy8gSWYgdGhlIG1vZGVsLXRvcG9sb2d5IEpTT04gY29udGFpbnMgYSAnbW9kZWxfY29uZmlnJyBmaWVsZCwgdGhlbiBpdCBpc1xuICAgIC8vIGEgZnVsbCBtb2RlbCBKU09OIChlLmcuLCBmcm9tIGBrZXJhcy5Nb2RlbC5zYXZlKClgKSwgd2hpY2ggY29udGFpbnNcbiAgICAvLyBub3Qgb25seSB0aGUgbW9kZWwncyBhcmNoaXRlY3R1cmUgaW4gaXRzICdtb2RlbF9jb25maWcnIGZpZWxkLCBidXRcbiAgICAvLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1Y2ggYXMgdGhlIG1vZGVsJ3Mgb3B0aW1pemVyLiBXZSB1c2Ugb25seSB0aGVcbiAgICAvLyAnbW9kZWxfY29uZmlnJyBmaWVsZCBjdXJyZW50bHkuXG4gICAgbW9kZWxUb3BvbG9neSA9IG1vZGVsVG9wb2xvZ3lbJ21vZGVsX2NvbmZpZyddIGFzIFB5SnNvbkRpY3Q7XG4gIH1cbiAgY29uc3QgdHNDb25maWcgPVxuICAgICAgY29udmVydFB5dGhvbmljVG9Ucyhtb2RlbFRvcG9sb2d5KSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Q7XG4gIGNvbnN0IG1vZGVsID0gZGVzZXJpYWxpemUodHNDb25maWcsIGN1c3RvbU9iamVjdHMpIGFzIExheWVyc01vZGVsO1xuXG4gIGlmIChtb2RlbEFuZFdlaWdodHNDb25maWcud2VpZ2h0c01hbmlmZXN0ICE9IG51bGwpIHtcbiAgICAvLyBMb2FkIHRoZSB3ZWlnaHQgdmFsdWVzIGtleWVkIGJ5IHRoZSBvcmlnaW5hbCB0ZW5zb3IgbmFtZXMgaW4gdGhlIG1vZGVsXG4gICAgLy8gZmlsZSB0aGF0IHdhcyBsb2FkZWQuICBUaGVzZSBzaG91bGQgbWF0Y2ggdGhlIGtleXMgb2YgdGhlIHdlaWdodFxuICAgIC8vIG1hbmlmZXN0LlxuICAgIGNvbnN0IHdlaWdodFZhbHVlcyA9IGF3YWl0IGlvLmxvYWRXZWlnaHRzKFxuICAgICAgICBtb2RlbEFuZFdlaWdodHNDb25maWcud2VpZ2h0c01hbmlmZXN0LCBtb2RlbEFuZFdlaWdodHNDb25maWcucGF0aFByZWZpeCxcbiAgICAgICAgbW9kZWwud2VpZ2h0cy5tYXAod2VpZ2h0ID0+IHdlaWdodC5vcmlnaW5hbE5hbWUpKTtcblxuICAgIC8vIE1hcCB0aGUgd2VpZ2h0cyB0byB0aGUgdW5pcXVlIHRlbnNvciBuYW1lcyBnZW5lcmF0ZWQgZHVyaW5nIG1vZGVsIGxvYWRpbmdcbiAgICBjb25zdCB1bmlxdWVXZWlnaHRWYWx1ZXM6IE5hbWVkVGVuc29yTWFwID0ge307XG4gICAgZm9yIChjb25zdCB3ZWlnaHQgb2YgbW9kZWwud2VpZ2h0cykge1xuICAgICAgdW5pcXVlV2VpZ2h0VmFsdWVzW3dlaWdodC5vcmlnaW5hbE5hbWVdID1cbiAgICAgICAgICB3ZWlnaHRWYWx1ZXNbd2VpZ2h0Lm9yaWdpbmFsTmFtZV07XG4gICAgfVxuXG4gICAgbW9kZWwubG9hZFdlaWdodHModW5pcXVlV2VpZ2h0VmFsdWVzKTtcbiAgICAvLyBEaXNwb3NlIHRlbXBvcmFyeSB3ZWlnaHQgdmFsdWVzLlxuICAgIGRpc3Bvc2Uod2VpZ2h0VmFsdWVzKTtcbiAgfVxuICByZXR1cm4gbW9kZWw7XG59XG5cbi8qKlxuICogT3B0aW9ucyBmb3IgbG9hZGluZyBhIHNhdmVkIG1vZGUgaW4gVGVuc29yRmxvdy5qcyBmb3JtYXQuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgTW9kZWxBbmRXZWlnaHRzQ29uZmlnIHtcbiAgLyoqXG4gICAqIEEgSlNPTiBvYmplY3Qgb3IgSlNPTiBzdHJpbmcgY29udGFpbmluZyB0aGUgbW9kZWwgY29uZmlnLlxuICAgKlxuICAgKiBUaGlzIGNhbiBiZSBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZyB0d28gZm9ybWF0czpcbiAgICogICAtIEEgbW9kZWwgYXJjaGllY3R1cmUtb25seSBjb25maWcsICBpLmUuLCBhIGZvcm1hdCBjb25zaXN0ZW50IHdpdGggdGhlXG4gICAqICAgICByZXR1cm4gdmFsdWUgb2Zga2VyYXMuTW9kZWwudG9fanNvbigpYC5cbiAgICogICAtIEEgZnVsbCBtb2RlbCBjb25maWcsIGNvbnRhaW5pbmcgbm90IG9ubHkgbW9kZWwgYXJjaGl0ZWN0dXJlLCBidXQgYWxzb1xuICAgKiAgICAgdHJhaW5pbmcgb3B0aW9ucyBhbmQgc3RhdGUsIGkuZS4sIGEgZm9ybWF0IGNvbnNpc3RlbnQgd2l0aCB0aGUgcmV0dXJuXG4gICAqICAgICB2YWx1ZSBvZiBga2VyYXMubW9kZWxzLnNhdmVfbW9kZWwoKWAuXG4gICAqL1xuICBtb2RlbFRvcG9sb2d5OiBQeUpzb25EaWN0O1xuXG4gIC8qKlxuICAgKiBBIHdlaWdodHMgbWFuaWZlc3QgaW4gVGVuc29yRmxvdy5qcyBmb3JtYXQuXG4gICAqL1xuICB3ZWlnaHRzTWFuaWZlc3Q/OiBpby5XZWlnaHRzTWFuaWZlc3RDb25maWc7XG5cbiAgLyoqXG4gICAqIFBhdGggdG8gcHJlcGVuZCB0byB0aGUgcGF0aHMgaW4gYHdlaWdodE1hbmlmZXN0YCBiZWZvcmUgZmV0Y2hpbmcuXG4gICAqXG4gICAqIFRoZSBwYXRoIG1heSBvcHRpb25hbGx5IGVuZCBpbiBhIHNsYXNoICgnLycpLlxuICAgKi9cbiAgcGF0aFByZWZpeD86IHN0cmluZztcbn1cblxuLy8gVE9ETyhuaWVsc2VuZSk6IFJlbW92ZSBhZnRlcjogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNDAwXG5leHBvcnQgaW50ZXJmYWNlIE1vZGVsUHJlZGljdEFyZ3Mge1xuICAvKipcbiAgICogT3B0aW9uYWwuIEJhdGNoIHNpemUgKEludGVnZXIpLiBJZiB1bnNwZWNpZmllZCwgaXQgd2lsbCBkZWZhdWx0IHRvIDMyLlxuICAgKi9cbiAgYmF0Y2hTaXplPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBPcHRpb25hbC4gVmVyYm9zaXR5IG1vZGUuIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgdmVyYm9zZT86IGJvb2xlYW47XG59XG5cbi8qKlxuICogTG9hZCBhIG1vZGVsLCBpbmNsdWRpbmcgaXRzIHRvcG9sb2d5IGFuZCBvcHRpb25hbGx5IHdlaWdodHMuICBTZWUgdGhlXG4gKiBUdXRvcmlhbCBuYW1lZCBcIkhvdyB0byBpbXBvcnQgYSBLZXJhcyBNb2RlbFwiIGZvciB1c2FnZSBleGFtcGxlcy5cbiAqXG4gKiBFeGFtcGxlIDE6IFNhdmUgYG1vZGVsYCdzIHRvcG9sb2d5IGFuZCB3ZWlnaHRzIHRvIGJyb3dzZXIgW2xvY2FsXG4gKiBzdG9yYWdlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2xvY2FsU3RvcmFnZSk7XG4gKiB0aGVuIGxvYWQgaXQgYmFjay5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKFxuICogICAgIHtsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbM119KV19KTtcbiAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gb3JpZ2luYWwgbW9kZWw6Jyk7XG4gKiBtb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0cyA9IGF3YWl0IG1vZGVsLnNhdmUoJ2xvY2Fsc3RvcmFnZTovL215LW1vZGVsLTEnKTtcbiAqXG4gKiBjb25zdCBsb2FkZWRNb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCgnbG9jYWxzdG9yYWdlOi8vbXktbW9kZWwtMScpO1xuICogY29uc29sZS5sb2coJ1ByZWRpY3Rpb24gZnJvbSBsb2FkZWQgbW9kZWw6Jyk7XG4gKiBsb2FkZWRNb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEV4YW1wbGUgMi4gU2F2aW5nIGBtb2RlbGAncyB0b3BvbG9neSBhbmQgd2VpZ2h0cyB0byBicm93c2VyXG4gKiBbSW5kZXhlZERCXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvSW5kZXhlZERCX0FQSSk7XG4gKiB0aGVuIGxvYWQgaXQgYmFjay5cbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKFxuICogICAgIHtsYXllcnM6IFt0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbM119KV19KTtcbiAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gb3JpZ2luYWwgbW9kZWw6Jyk7XG4gKiBtb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAqXG4gKiBjb25zdCBzYXZlUmVzdWx0cyA9IGF3YWl0IG1vZGVsLnNhdmUoJ2luZGV4ZWRkYjovL215LW1vZGVsLTEnKTtcbiAqXG4gKiBjb25zdCBsb2FkZWRNb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbCgnaW5kZXhlZGRiOi8vbXktbW9kZWwtMScpO1xuICogY29uc29sZS5sb2coJ1ByZWRpY3Rpb24gZnJvbSBsb2FkZWQgbW9kZWw6Jyk7XG4gKiBsb2FkZWRNb2RlbC5wcmVkaWN0KHRmLm9uZXMoWzEsIDNdKSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEV4YW1wbGUgMy4gTG9hZCBhIG1vZGVsIGZyb20gdXNlci1zZWxlY3RlZCBmaWxlcyBmcm9tIEhUTUxcbiAqIFtmaWxlIGlucHV0XG4gKiBlbGVtZW50c10oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2lucHV0L2ZpbGUpLlxuICpcbiAqIGBgYGpzXG4gKiAvLyBOb3RlOiB0aGlzIGNvZGUgc25pcHBldCB3aWxsIG5vdCB3b3JrIHdpdGhvdXQgdGhlIEhUTUwgZWxlbWVudHMgaW4gdGhlXG4gKiAvLyAgIHBhZ2VcbiAqIGNvbnN0IGpzb25VcGxvYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnanNvbi11cGxvYWQnKTtcbiAqIGNvbnN0IHdlaWdodHNVcGxvYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnd2VpZ2h0cy11cGxvYWQnKTtcbiAqXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRMYXllcnNNb2RlbChcbiAqICAgICB0Zi5pby5icm93c2VyRmlsZXMoW2pzb25VcGxvYWQuZmlsZXNbMF0sIHdlaWdodHNVcGxvYWQuZmlsZXNbMF1dKSk7XG4gKiBgYGBcbiAqXG4gKiBFeGFtcGxlIDQuIExvYWQgYSBtb2RlbCBmcm9tIGFuIEhUVFAgc2VydmVyLlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0XG4gKiAgICAgdGYubG9hZExheWVyc01vZGVsKCdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vdGZqcy1tb2RlbHMvdGZqcy9pcmlzX3YxL21vZGVsLmpzb24nKTtcbiAqIG1vZGVsLnN1bW1hcnkoKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBwYXRoT3JJT0hhbmRsZXIgQ2FuIGJlIGVpdGhlciBvZiB0aGUgdHdvIGZvcm1hdHNcbiAqICAgMS4gQSBzdHJpbmcgcGF0aCB0byB0aGUgYE1vZGVsQW5kV2VpZ2h0c0NvbmZpZ2AgSlNPTiBkZXNjcmliaW5nXG4gKiAgICAgIHRoZSBtb2RlbCBpbiB0aGUgY2Fub25pY2FsIFRlbnNvckZsb3cuanMgZm9ybWF0LiBUaGlzIHBhdGggd2lsbCBiZVxuICogICAgICBpbnRlcnByZXRlZCBhcyBhIHJlbGF0aXZlIEhUVFAgcGF0aCwgdG8gd2hpY2ggYGZldGNoYCB3aWxsIGJlIHVzZWQgdG9cbiAqICAgICAgcmVxdWVzdCB0aGUgbW9kZWwgdG9wb2xvZ3kgYW5kIHdlaWdodCBtYW5pZmVzdCBKU09OLlxuICogICAgICBUaGUgY29udGVudCBvZiB0aGUgSlNPTiBmaWxlIGlzIGFzc3VtZWQgdG8gYmUgYSBKU09OIG9iamVjdCB3aXRoIHRoZVxuICogICAgICBmb2xsb3dpbmcgZmllbGRzIGFuZCB2YWx1ZXM6XG4gKiAgICAgIC0gJ21vZGVsVG9wb2xvZ3knOiBBIEpTT04gb2JqZWN0IHRoYXQgY2FuIGJlIGVpdGhlciBvZjpcbiAqICAgICAgICAxLiBhIG1vZGVsIGFyY2hpdGVjdHVyZSBKU09OIGNvbnNpc3RlbnQgd2l0aCB0aGUgZm9ybWF0IG9mIHRoZSByZXR1cm5cbiAqICAgICAgICAgICAgdmFsdWUgb2YgYGtlcmFzLk1vZGVsLnRvX2pzb24oKWBcbiAqICAgICAgICAyLiBhIGZ1bGwgbW9kZWwgSlNPTiBpbiB0aGUgZm9ybWF0IG9mIGBrZXJhcy5tb2RlbHMuc2F2ZV9tb2RlbCgpYC5cbiAqICAgICAgLSAnd2VpZ2h0c01hbmlmZXN0JzogQSBUZW5zb3JGbG93LmpzIHdlaWdodHMgbWFuaWZlc3QuXG4gKiAgICAgIFNlZSB0aGUgUHl0aG9uIGNvbnZlcnRlciBmdW5jdGlvbiBgc2F2ZV9tb2RlbCgpYCBmb3IgbW9yZSBkZXRhaWxzLlxuICogICAgICBJdCBpcyBhbHNvIGFzc3VtZWQgdGhhdCBtb2RlbCB3ZWlnaHRzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHJlbGF0aXZlXG4gKiAgICAgIHBhdGhzIGRlc2NyaWJlZCBieSB0aGUgYHBhdGhzYCBmaWVsZHMgaW4gd2VpZ2h0cyBtYW5pZmVzdC5cbiAqICAgMi4gQW4gYHRmLmlvLklPSGFuZGxlcmAgb2JqZWN0IHRoYXQgbG9hZHMgbW9kZWwgYXJ0aWZhY3RzIHdpdGggaXRzIGBsb2FkYFxuICogICAgICBtZXRob2QuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25hbCBjb25maWd1cmF0aW9uIGFyZ3VtZW50cyBmb3IgdGhlIG1vZGVsIGxvYWRpbmcsXG4gKiAgIGluY2x1ZGluZzpcbiAqICAgLSBgc3RyaWN0YDogUmVxdWlyZSB0aGF0IHRoZSBwcm92aWRlZCB3ZWlnaHRzIGV4YWN0bHkgbWF0Y2ggdGhvc2UgcmVxdWlyZWRcbiAqICAgICBieSB0aGUgbGF5ZXJzLiAgRGVmYXVsdCB0cnVlLiAgUGFzc2luZyBmYWxzZSBtZWFucyB0aGF0IGJvdGggZXh0cmFcbiAqICAgICB3ZWlnaHRzIGFuZCBtaXNzaW5nIHdlaWdodHMgd2lsbCBiZSBzaWxlbnRseSBpZ25vcmVkLlxuICogICAtIGBvblByb2dyZXNzYDogQSBwcm9ncmVzcyBjYWxsYmFjayBvZiB0aGUgZm9ybTpcbiAqICAgICBgKGZyYWN0aW9uOiBudW1iZXIpID0+IHZvaWRgLiBUaGlzIGNhbGxiYWNrIGNhbiBiZSB1c2VkIHRvIG1vbml0b3IgdGhlXG4gKiAgICAgbW9kZWwtbG9hZGluZyBwcm9jZXNzLlxuICogQHJldHVybnMgQSBgUHJvbWlzZWAgb2YgYHRmLkxheWVyc01vZGVsYCwgd2l0aCB0aGUgdG9wb2xvZ3kgYW5kIHdlaWdodHNcbiAqICAgICBsb2FkZWQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBsb2FkTGF5ZXJzTW9kZWxJbnRlcm5hbChcbiAgICBwYXRoT3JJT0hhbmRsZXI6IHN0cmluZ3xpby5JT0hhbmRsZXIsXG4gICAgb3B0aW9ucz86IGlvLkxvYWRPcHRpb25zKTogUHJvbWlzZTxMYXllcnNNb2RlbD4ge1xuICBpZiAob3B0aW9ucyA9PSBudWxsKSB7XG4gICAgb3B0aW9ucyA9IHt9O1xuICB9XG4gIGlmICh0eXBlb2YgcGF0aE9ySU9IYW5kbGVyID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IGhhbmRsZXJzID0gaW8uZ2V0TG9hZEhhbmRsZXJzKHBhdGhPcklPSGFuZGxlciwgb3B0aW9ucyk7XG4gICAgaWYgKGhhbmRsZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHk6IGlmIG5vIGxvYWQgaGFuZGxlciBjYW4gYmUgZm91bmQsXG4gICAgICAvLyBhc3N1bWUgaXQgaXMgYSByZWxhdGl2ZSBodHRwIHBhdGguXG4gICAgICAvLyBUT0RPKGNhaXMpOiBSZWZvcm1hdCB0aGUgYXJncyBpbnRvIGEgc2luZ2xlIGBMb2FkT3B0aW9uc2Agb25jZSB0aGUgY29yZVxuICAgICAgLy8gaXMgcmVmYWN0b3JlZC5cbiAgICAgIGhhbmRsZXJzLnB1c2goaW8uYnJvd3NlckhUVFBSZXF1ZXN0KHBhdGhPcklPSGFuZGxlciwgb3B0aW9ucykpO1xuICAgIH0gZWxzZSBpZiAoaGFuZGxlcnMubGVuZ3RoID4gMSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEZvdW5kIG1vcmUgdGhhbiBvbmUgKCR7aGFuZGxlcnMubGVuZ3RofSkgbG9hZCBoYW5kbGVycyBmb3IgYCArXG4gICAgICAgICAgYFVSTCAnJHtwYXRoT3JJT0hhbmRsZXJ9J2ApO1xuICAgIH1cbiAgICBwYXRoT3JJT0hhbmRsZXIgPSBoYW5kbGVyc1swXTtcbiAgfVxuICByZXR1cm4gbG9hZExheWVyc01vZGVsRnJvbUlPSGFuZGxlcihwYXRoT3JJT0hhbmRsZXIsIHVuZGVmaW5lZCwgb3B0aW9ucyk7XG59XG5cbi8qKlxuICogTG9hZCBhIG1vZGVsIGFuZCBvcHRpb25hbGx5IGl0cyB3ZWlnaHRzLCB1c2luZyBhbiBJT0hhbmRsZXIgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSBoYW5kbGVyIFRoZSBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCB0byBiZSB1c2VkIGR1cmluZyB0aGUgbW9kZWxcbiAqICAgbG9hZGluZy5cbiAqIEBwYXJhbSBjdXN0b21PYmplY3RzIEFueSBvcHRpb25hbCBjdXN0b20gb2JqZWN0cyB0byBiZSB1c2VkIGR1cmluZyBtb2RlbFxuICogICBsb2FkaW5nLlxuICogQHBhcmFtIHN0cmljdCBXaGV0aGVyIHRoZSB3ZWlnaHQgbG9hZGluZyB3aWxsIGJlIGRvbmUgaW4gc3RyaWN0IG1vZGUuXG4gKiAgIERlZmF1bHQ6IGB0cnVlYC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRMYXllcnNNb2RlbEZyb21JT0hhbmRsZXIoXG4gICAgaGFuZGxlcjogaW8uSU9IYW5kbGVyLCBjdXN0b21PYmplY3RzPzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIG9wdGlvbnM/OiBpby5Mb2FkT3B0aW9ucyk6IFByb21pc2U8TGF5ZXJzTW9kZWw+IHtcbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuICBpZiAoaGFuZGxlci5sb2FkID09IG51bGwpIHtcbiAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgJ0Nhbm5vdCBwcm9jZWVkIHdpdGggbW9kZWwgbG9hZGluZyBiZWNhdXNlIHRoZSBJT0hhbmRsZXIgcHJvdmlkZWQgJyArXG4gICAgICAgICdkb2VzIG5vdCBoYXZlIHRoZSBgbG9hZGAgbWV0aG9kIGltcGxlbWVudGVkLicpO1xuICB9XG4gIGNvbnN0IGFydGlmYWN0cyA9IGF3YWl0IGhhbmRsZXIubG9hZCgpO1xuICBsZXQgbW9kZWxUb3BvbG9neSA9IGFydGlmYWN0cy5tb2RlbFRvcG9sb2d5IGFzIFB5SnNvbkRpY3Q7XG4gIGlmIChtb2RlbFRvcG9sb2d5Wydtb2RlbF9jb25maWcnXSAhPSBudWxsKSB7XG4gICAgbW9kZWxUb3BvbG9neSA9IG1vZGVsVG9wb2xvZ3lbJ21vZGVsX2NvbmZpZyddIGFzIFB5SnNvbkRpY3Q7XG4gIH1cblxuICBjb25zdCBzdHJpY3QgPSBvcHRpb25zLnN0cmljdCA9PSBudWxsID8gdHJ1ZSA6IG9wdGlvbnMuc3RyaWN0O1xuICAvLyBJZiB3ZWlnaHRzIGFyZSBwcm92aWRlZCBhbmQgdGhlIHdlaWdodC1sb2FkaW5nIG1vZGUgaXMgc3RyaWN0LCB1c2VcbiAgLy8gZmFzdCB3ZWlnaHQgaW5pdGlhbGl6YXRpb24uIFRoaXMgc2tpcHMgY29zdGx5IGluaXRpYWxpemVycyBzdWNoIGFzXG4gIC8vICdvcnRob2dvbmFsJyBhbmQgc2F2ZXMgdW5uZWNlc3NhcnkgY29tcHV0YXRpb24gaW4gY2FzZXMgd2hlcmVcbiAgLy8gdGhlIGluaXRpYWxpemVkIHdlaWdodCB2YWx1ZXMgd2lsbCBpbW1lZGlhdGVseSBiZSBvdmVyd3JpdHRlbiBieVxuICAvLyBsb2FkZWQgd2VpZ2h0IHZhbHVlcy5cbiAgY29uc3QgZmFzdFdlaWdodEluaXQgPVxuICAgICAgYXJ0aWZhY3RzLndlaWdodERhdGEgIT0gbnVsbCAmJiBhcnRpZmFjdHMud2VpZ2h0U3BlY3MgIT0gbnVsbCAmJiBzdHJpY3Q7XG4gIGNvbnN0IG1vZGVsID1cbiAgICAgIGRlc2VyaWFsaXplKFxuICAgICAgICAgIGNvbnZlcnRQeXRob25pY1RvVHMobW9kZWxUb3BvbG9neSkgYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgICAgIGN1c3RvbU9iamVjdHMsIGZhc3RXZWlnaHRJbml0KSBhcyBMYXllcnNNb2RlbDtcblxuICBjb25zdCB0cmFpbmluZ0NvbmZpZyA9IGFydGlmYWN0cy50cmFpbmluZ0NvbmZpZyBhcyBUcmFpbmluZ0NvbmZpZztcbiAgaWYgKHRyYWluaW5nQ29uZmlnICE9IG51bGwpIHtcbiAgICBtb2RlbC5sb2FkVHJhaW5pbmdDb25maWcodHJhaW5pbmdDb25maWcpO1xuICB9XG4gIGlmIChhcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSAhPSBudWxsKSB7XG4gICAgbW9kZWwuc2V0VXNlckRlZmluZWRNZXRhZGF0YShhcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YSk7XG4gIH1cblxuICAvLyBJZiB3ZWlnaHREYXRhIGlzIHByZXNlbnQsIGxvYWQgdGhlIHdlaWdodHMgaW50byB0aGUgbW9kZWwuXG4gIGlmIChhcnRpZmFjdHMud2VpZ2h0RGF0YSAhPSBudWxsKSB7XG4gICAgLy8gTG9hZGluZyB3ZWlnaHRzIHJlcXVpcmVzIHdlaWdodFNwZWNzLlxuICAgIGlmIChhcnRpZmFjdHMud2VpZ2h0U3BlY3MgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ0xheWVyc01vZGVsIGFydGlmYWN0cyBjb250YWlucyB3ZWlnaHQgZGF0YSwgYnV0IG5vdCB3ZWlnaHQgc3BlY3MuICcgK1xuICAgICAgICAgICdUaGVyZWZvcmUgbG9hZGluZyBvZiB3ZWlnaHRzIGNhbm5vdCBwcm9jZWVkLicpO1xuICAgIH1cblxuICAgIGNvbnN0IHttb2RlbFdlaWdodHMsIG9wdGltaXplcldlaWdodHN9ID0gZGVjb2RlTW9kZWxBbmRPcHRpbWl6ZXJXZWlnaHRzKFxuICAgICAgICBhcnRpZmFjdHMud2VpZ2h0RGF0YSwgYXJ0aWZhY3RzLndlaWdodFNwZWNzKTtcbiAgICBtb2RlbC5sb2FkV2VpZ2h0cyhtb2RlbFdlaWdodHMsIHN0cmljdCk7XG5cbiAgICBpZiAobW9kZWwub3B0aW1pemVyICE9IG51bGwgJiYgb3B0aW1pemVyV2VpZ2h0cy5sZW5ndGggPiAwKSB7XG4gICAgICBhd2FpdCBtb2RlbC5vcHRpbWl6ZXIuc2V0V2VpZ2h0cyhvcHRpbWl6ZXJXZWlnaHRzKTtcbiAgICB9XG5cbiAgICAvLyBEaXNwb3NlIHRlbXBvcmFyeSB3ZWlnaHQgdmFsdWVzLlxuICAgIGRpc3Bvc2UobW9kZWxXZWlnaHRzKTtcbiAgICBkaXNwb3NlKG9wdGltaXplcldlaWdodHMubWFwKHcgPT4gdy50ZW5zb3IpKTtcbiAgfVxuICByZXR1cm4gbW9kZWw7XG59XG5cbmZ1bmN0aW9uIGRlY29kZU1vZGVsQW5kT3B0aW1pemVyV2VpZ2h0cyhcbiAgICBidWZmZXI6IEFycmF5QnVmZmVyLCBzcGVjczogaW8uV2VpZ2h0c01hbmlmZXN0RW50cnlbXSk6XG4gICAge21vZGVsV2VpZ2h0czogTmFtZWRUZW5zb3JNYXAsIG9wdGltaXplcldlaWdodHM6IE5hbWVkVGVuc29yW119IHtcbiAgY29uc3QgbmFtZTJUZW5zb3IgPSBpby5kZWNvZGVXZWlnaHRzKGJ1ZmZlciwgc3BlY3MpO1xuICBjb25zdCBtb2RlbFdlaWdodHM6IE5hbWVkVGVuc29yTWFwID0ge307XG4gIGNvbnN0IG9wdGltaXplcldlaWdodHM6IE5hbWVkVGVuc29yW10gPSBbXTtcbiAgc3BlY3MuZm9yRWFjaChzcGVjID0+IHtcbiAgICBpZiAoc3BlYy5ncm91cCA9PT0gJ29wdGltaXplcicpIHtcbiAgICAgIG9wdGltaXplcldlaWdodHMucHVzaCh7bmFtZTogc3BlYy5uYW1lLCB0ZW5zb3I6IG5hbWUyVGVuc29yW3NwZWMubmFtZV19KTtcbiAgICB9IGVsc2Uge1xuICAgICAgbW9kZWxXZWlnaHRzW3NwZWMubmFtZV0gPSBuYW1lMlRlbnNvcltzcGVjLm5hbWVdO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiB7bW9kZWxXZWlnaHRzLCBvcHRpbWl6ZXJXZWlnaHRzfTtcbn1cblxuLyoqXG4gKiBDb25maWd1cmF0aW9uIGZvciBhIFNlcXVlbnRpYWwgbW9kZWwuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU2VxdWVudGlhbEFyZ3Mge1xuICAvKiogU3RhY2sgb2YgbGF5ZXJzIGZvciB0aGUgbW9kZWwuICovXG4gIGxheWVycz86IExheWVyW107XG5cbiAgLyoqIFRoZSBuYW1lIG9mIHRoaXMgbW9kZWwuICovXG4gIG5hbWU/OiBzdHJpbmc7XG59XG5cbi8qKlxuICogQSBtb2RlbCB3aXRoIGEgc3RhY2sgb2YgbGF5ZXJzLCBmZWVkaW5nIGxpbmVhcmx5IGZyb20gb25lIHRvIHRoZSBuZXh0LlxuICpcbiAqIGB0Zi5zZXF1ZW50aWFsYCBpcyBhIGZhY3RvcnkgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGluc3RhbmNlIG9mXG4gKiBgdGYuU2VxdWVudGlhbGAuXG4gKlxuICogYGBganNcbiAqICAvLyBEZWZpbmUgYSBtb2RlbCBmb3IgbGluZWFyIHJlZ3Jlc3Npb24uXG4gKiAgY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gKiAgbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxXX0pKTtcbiAqXG4gKiAgLy8gUHJlcGFyZSB0aGUgbW9kZWwgZm9yIHRyYWluaW5nOiBTcGVjaWZ5IHRoZSBsb3NzIGFuZCB0aGUgb3B0aW1pemVyLlxuICogIG1vZGVsLmNvbXBpbGUoe2xvc3M6ICdtZWFuU3F1YXJlZEVycm9yJywgb3B0aW1pemVyOiAnc2dkJ30pO1xuICpcbiAqICAvLyBHZW5lcmF0ZSBzb21lIHN5bnRoZXRpYyBkYXRhIGZvciB0cmFpbmluZy5cbiAqICBjb25zdCB4cyA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzQsIDFdKTtcbiAqICBjb25zdCB5cyA9IHRmLnRlbnNvcjJkKFsxLCAzLCA1LCA3XSwgWzQsIDFdKTtcbiAqXG4gKiAgLy8gVHJhaW4gdGhlIG1vZGVsIHVzaW5nIHRoZSBkYXRhIHRoZW4gZG8gaW5mZXJlbmNlIG9uIGEgZGF0YSBwb2ludCB0aGVcbiAqICAvLyBtb2RlbCBoYXNuJ3Qgc2VlbjpcbiAqICBhd2FpdCBtb2RlbC5maXQoeHMsIHlzKTtcbiAqICBtb2RlbC5wcmVkaWN0KHRmLnRlbnNvcjJkKFs1XSwgWzEsIDFdKSkucHJpbnQoKTtcbiAqIGBgYFxuICpcbiAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gKi9cbmV4cG9ydCBjbGFzcyBTZXF1ZW50aWFsIGV4dGVuZHMgTGF5ZXJzTW9kZWwge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdTZXF1ZW50aWFsJztcbiAgcHJpdmF0ZSBtb2RlbDogTGF5ZXJzTW9kZWw7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZXF1ZW50aWFsQXJncykge1xuICAgIHN1cGVyKHtpbnB1dHM6IFtdLCBvdXRwdXRzOiBbXX0pO1xuICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuXG4gICAgdGhpcy50cmFpbmFibGUgPSB0cnVlO1xuICAgIHRoaXMuYnVpbHQgPSBmYWxzZTtcblxuICAgIC8vIFNldCBtb2RlbCBuYW1lLlxuICAgIHRoaXMubmFtZSA9IChhcmdzLm5hbWUgIT0gbnVsbCkgPyBhcmdzLm5hbWUgOiBnZXRVaWQoJ3NlcXVlbnRpYWxfJyk7XG5cbiAgICAvLyBBZGQgdG8gdGhlIG1vZGVsIGFueSBsYXllcnMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICBpZiAoYXJncy5sYXllcnMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBsYXllciBvZiBhcmdzLmxheWVycykge1xuICAgICAgICB0aGlzLmFkZChsYXllcik7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIFNlcXVlbnRpYWwuYWRkICBUaHJvd3MgaWYgdGhlIG5ldyBvdXRwdXQgc2hhcGUgd2lsbCBiZVxuICAvLyBpbnZhbGlkLlxuICBwcml2YXRlIGNoZWNrU2hhcGUobGF5ZXI6IExheWVyKSB7XG4gICAgY29uc3Qgc2hhcGUgPSBsYXllci5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0VGVuc29yc1swXS5zaGFwZTtcbiAgICBpZiAoc2hhcGUuc29tZSh4ID0+IHggPCAwKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ05lZ2F0aXZlIGRpbWVuc2lvbiBzaXplIGNhdXNlZCBieSBhZGRpbmcgbGF5ZXIgJyArXG4gICAgICAgICAgYCR7bGF5ZXIubmFtZX0gd2l0aCBpbnB1dCBzaGFwZSBbYCArXG4gICAgICAgICAgYCR7bGF5ZXIuaW5ib3VuZE5vZGVzWzBdLmlucHV0VGVuc29yc1swXS5zaGFwZX1dYCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYSBsYXllciBpbnN0YW5jZSBvbiB0b3Agb2YgdGhlIGxheWVyIHN0YWNrLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiAgY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gICAqICBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogOCwgaW5wdXRTaGFwZTogWzFdfSkpO1xuICAgKiAgbW9kZWwuYWRkKHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDQsIGFjdGl2YXRpb246ICdyZWx1Nid9KSk7XG4gICAqICBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgYWN0aXZhdGlvbjogJ3JlbHU2J30pKTtcbiAgICogIC8vIE5vdGUgdGhhdCB0aGUgdW50cmFpbmVkIG1vZGVsIGlzIHJhbmRvbSBhdCB0aGlzIHBvaW50LlxuICAgKiAgbW9kZWwucHJlZGljdCh0Zi5yYW5kb21Ob3JtYWwoWzEwLCAxXSkpLnByaW50KCk7XG4gICAqIGBgYFxuICAgKiBAcGFyYW0gbGF5ZXIgTGF5ZXIgaW5zdGFuY2UuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVmFsdWVFcnJvciBJbiBjYXNlIHRoZSBgbGF5ZXJgIGFyZ3VtZW50IGRvZXMgbm90IGtub3cgaXRzXG4gICAqIGlucHV0IHNoYXBlLlxuICAgKiBAZXhjZXB0aW9uIFZhbHVlRXJyb3IgSW4gY2FzZSB0aGUgYGxheWVyYCBhcmd1bWVudCBoYXMgbXVsdGlwbGUgb3V0cHV0XG4gICAqICAgdGVuc29ycywgb3IgaXMgYWxyZWFkeSBjb25uZWN0ZWQgc29tZXdoZXJlIGVsc2UgKGZvcmJpZGRlbiBpblxuICAgKiAgIGBTZXF1ZW50aWFsYCBtb2RlbHMpLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYWRkKGxheWVyOiBMYXllcik6IHZvaWQge1xuICAgIGNvbnN0IGlzTGF5ZXJNb2RlbEluc3RhbmNlID1cbiAgICAgICAgbGF5ZXIgaW5zdGFuY2VvZiBTZXF1ZW50aWFsIHx8IGxheWVyIGluc3RhbmNlb2YgTGF5ZXJzTW9kZWw7XG4gICAgbGV0IG1vZGVsTGF5ZXI6IExheWVyc01vZGVsO1xuICAgIGlmIChpc0xheWVyTW9kZWxJbnN0YW5jZSkge1xuICAgICAgbW9kZWxMYXllciA9IGxheWVyIGFzIExheWVyc01vZGVsO1xuICAgICAgaWYgKG1vZGVsTGF5ZXIub3V0cHV0cy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAnQWxsIGxheWVycyBpbiBhIFNlcXVlbnRpYWwgbW9kZWwgJyArXG4gICAgICAgICAgICAnc2hvdWxkIGhhdmUgYSBzaW5nbGUgb3V0cHV0IHRlbnNvci4gJyArXG4gICAgICAgICAgICAnRm9yIG11bHRpLW91dHB1dCBsYXllcnMsICcgK1xuICAgICAgICAgICAgJ3VzZSB0aGUgZnVuY3Rpb25hbCBBUEkuJyk7XG4gICAgICB9XG4gICAgICBpZiAobW9kZWxMYXllci5pbnB1dHMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgJ0FsbCBsYXllcnMgaW4gYSBTZXF1ZW50aWFsIG1vZGVsICcgK1xuICAgICAgICAgICAgJ3Nob3VsZCBoYXZlIGEgc2luZ2xlIGlucHV0IHRlbnNvci4gJyArXG4gICAgICAgICAgICAnRm9yIG11bHRpLWlucHV0IGxheWVycywgJyArXG4gICAgICAgICAgICAndXNlIHRoZSBmdW5jdGlvbmFsIEFQSS4nKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5vdXRwdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgLy8gZmlyc3QgbGF5ZXIgaW4gbW9kZWw6IGNoZWNrIHRoYXQgaXQgaXMgYW4gaW5wdXQgbGF5ZXJcbiAgICAgIGlmIChsYXllci5pbmJvdW5kTm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIGNyZWF0ZSBhbiBpbnB1dCBsYXllclxuICAgICAgICBpZiAobGF5ZXIuYmF0Y2hJbnB1dFNoYXBlID09IG51bGwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgJ1RoZSBmaXJzdCBsYXllciBpbiBhIFNlcXVlbnRpYWwgbW9kZWwgbXVzdCAnICtcbiAgICAgICAgICAgICAgJ2dldCBhbiBgaW5wdXRTaGFwZWAgb3IgYGJhdGNoSW5wdXRTaGFwZWAgYXJndW1lbnQuJyk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSW5zdGFudGlhdGUgdGhlIGlucHV0IGxheWVyLlxuICAgICAgICBjb25zdCB4ID0gSW5wdXQoe1xuICAgICAgICAgIGJhdGNoU2hhcGU6IGxheWVyLmJhdGNoSW5wdXRTaGFwZSxcbiAgICAgICAgICBkdHlwZTogbGF5ZXIuZHR5cGUsXG4gICAgICAgICAgbmFtZTogbGF5ZXIubmFtZSArICdfaW5wdXQnXG4gICAgICAgIH0pO1xuICAgICAgICAvLyBUaGlzIHdpbGwgYnVpbGQgdGhlIGN1cnJlbnQgbGF5ZXIgYW5kIGNyZWF0ZSB0aGUgbm9kZSBjb25uZWN0aW5nXG4gICAgICAgIC8vIHRoZSBjdXJyZW50IGxheWVyIHRvIHRoZSBpbnB1dCBsYXllciB3ZSBqdXN0IGNyZWF0ZWQuXG4gICAgICAgIGxheWVyLmFwcGx5KHgpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNMYXllck1vZGVsSW5zdGFuY2UpIHtcbiAgICAgICAgdGhpcy5vdXRwdXRzID0gbW9kZWxMYXllci5vdXRwdXRzO1xuICAgICAgICB0aGlzLmlucHV0cyA9IG1vZGVsTGF5ZXIuaW5wdXRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGxheWVyLmluYm91bmROb2Rlcy5sZW5ndGggIT09IDEpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgJ0EgbGF5ZXIgYWRkZWQgdG8gYSBTZXF1ZW50aWFsIG1vZGVsIG11c3Qgbm90IGFscmVhZHkgYmUgJyArXG4gICAgICAgICAgICAgIGBjb25uZWN0ZWQgc29tZXdoZXJlIGVsc2UuIExheWVyc01vZGVsIHJlY2VpdmVkIGxheWVyICR7XG4gICAgICAgICAgICAgICAgICBsYXllci5uYW1lfSBgICtcbiAgICAgICAgICAgICAgYHdoaWNoIGhhcyAke2xheWVyLmluYm91bmROb2Rlcy5sZW5ndGh9IHByZS1leGlzdGluZyBpbmJvdW5kIGAgK1xuICAgICAgICAgICAgICAnY29ubmVjdGlvbnMuJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobGF5ZXIuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFRlbnNvcnMubGVuZ3RoICE9PSAxKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICdBbGwgbGF5ZXJzIGluIGEgU2VxdWVudGlhbCBtb2RlbCAnICtcbiAgICAgICAgICAgICAgJ3Nob3VsZCBoYXZlIGEgc2luZ2xlIG91dHB1dCB0ZW5zb3IuICcgK1xuICAgICAgICAgICAgICAnRm9yIG11bHRpLW91dHB1dCBsYXllcnMsICcgK1xuICAgICAgICAgICAgICAndXNlIHRoZSBmdW5jdGlvbmFsIEFQSS4nKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmNoZWNrU2hhcGUobGF5ZXIpO1xuICAgICAgICB0aGlzLm91dHB1dHMgPSBbbGF5ZXIuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFRlbnNvcnNbMF1dO1xuICAgICAgICB0aGlzLmlucHV0cyA9IGdldFNvdXJjZUlucHV0cyh0aGlzLm91dHB1dHNbMF0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmluYm91bmROb2RlcyA9IFtdO1xuICAgICAgLy8gV2UgY3JlYXRlIGFuIGlucHV0IG5vZGUsIHdoaWNoIHdlIHdpbGwga2VlcCB1cGRhdGVkXG4gICAgICAvLyBhcyB3ZSBhZGQgbW9yZSBsYXllcnMuXG4gICAgICAvLyAoVGhpcyBjYWxsIGhhcyBzaWRlIGVmZmVjdHMuKVxuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC1leHByZXNzaW9uXG4gICAgICBuZXcgTm9kZSh7XG4gICAgICAgIG91dGJvdW5kTGF5ZXI6IHRoaXMsXG4gICAgICAgIGluYm91bmRMYXllcnM6IFtdLFxuICAgICAgICBub2RlSW5kaWNlczogW10sXG4gICAgICAgIHRlbnNvckluZGljZXM6IFtdLFxuICAgICAgICBpbnB1dFRlbnNvcnM6IHRoaXMuaW5wdXRzLFxuICAgICAgICBvdXRwdXRUZW5zb3JzOiB0aGlzLm91dHB1dHMsXG4gICAgICAgIC8vIG5vIG1vZGVsLWxldmVsIG1hc2tpbmcgZm9yIG5vd1xuICAgICAgICBpbnB1dE1hc2tzOiBnZW5lcmljX3V0aWxzLnB5TGlzdFJlcGVhdChudWxsLCB0aGlzLmlucHV0cy5sZW5ndGgpLFxuICAgICAgICBvdXRwdXRNYXNrczogW251bGxdLFxuICAgICAgICBpbnB1dFNoYXBlczogdGhpcy5pbnB1dHMubWFwKHggPT4geC5zaGFwZSksXG4gICAgICAgIG91dHB1dFNoYXBlczogdGhpcy5vdXRwdXRzWzBdLnNoYXBlXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgb3V0cHV0VGVuc29yID0gbGF5ZXIuYXBwbHkodGhpcy5vdXRwdXRzWzBdKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG91dHB1dFRlbnNvcikpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgICAgICdBbGwgbGF5ZXJzIGluIGEgU2VxdWVudGlhbCBtb2RlbCAnICtcbiAgICAgICAgICAgICdzaG91bGQgaGF2ZSBhIHNpbmdsZSBvdXRwdXQgdGVuc29yLiAnICtcbiAgICAgICAgICAgICdGb3IgbXVsdGktb3V0cHV0IGxheWVycywgJyArXG4gICAgICAgICAgICAndXNlIHRoZSBmdW5jdGlvbmFsIEFQSS4nKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuY2hlY2tTaGFwZShsYXllcik7XG4gICAgICB0aGlzLm91dHB1dHMgPSBbb3V0cHV0VGVuc29yIGFzIFN5bWJvbGljVGVuc29yXTtcbiAgICAgIC8vIHVwZGF0ZSBzZWxmLmluYm91bmRfbm9kZXNcbiAgICAgIHRoaXMuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFRlbnNvcnMgPSB0aGlzLm91dHB1dHM7XG4gICAgICB0aGlzLmluYm91bmROb2Rlc1swXS5vdXRwdXRTaGFwZXMgPSBbdGhpcy5vdXRwdXRzWzBdLnNoYXBlXTtcbiAgICB9XG5cbiAgICB0aGlzLmxheWVycy5wdXNoKGxheWVyKTtcbiAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyB0aGUgbGFzdCBsYXllciBpbiB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEBleGNlcHRpb24gVHlwZUVycm9yIGlmIHRoZXJlIGFyZSBubyBsYXllcnMgaW4gdGhlIG1vZGVsLlxuICAgKi9cbiAgcG9wKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZXJlIGFyZSBubyBsYXllcnMgaW4gdGhlIG1vZGVsLicpO1xuICAgIH1cblxuICAgIHRoaXMubGF5ZXJzLnBvcCgpO1xuICAgIGlmICh0aGlzLmxheWVycy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMub3V0cHV0cyA9IFtdO1xuICAgICAgdGhpcy5pbmJvdW5kTm9kZXMgPSBbXTtcbiAgICAgIHRoaXMub3V0Ym91bmROb2RlcyA9IFtdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBsYXN0TGF5ZXJJbmRleCA9IHRoaXMubGF5ZXJzLmxlbmd0aCAtIDE7XG4gICAgICB0aGlzLmxheWVyc1tsYXN0TGF5ZXJJbmRleF0ub3V0Ym91bmROb2RlcyA9IFtdO1xuICAgICAgdGhpcy5vdXRwdXRzID0gW3RoaXMubGF5ZXJzW2xhc3RMYXllckluZGV4XS5vdXRwdXQgYXMgU3ltYm9saWNUZW5zb3JdO1xuICAgICAgLy8gdXBkYXRlIHNlbGYuaW5ib3VuZF9ub2Rlc1xuICAgICAgdGhpcy5pbmJvdW5kTm9kZXNbMF0ub3V0cHV0VGVuc29ycyA9IHRoaXMub3V0cHV0cztcbiAgICAgIHRoaXMuaW5ib3VuZE5vZGVzWzBdLm91dHB1dFNoYXBlcyA9IFt0aGlzLm91dHB1dHNbMF0uc2hhcGVdO1xuICAgIH1cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmJ1aWxkKCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmNhbGwoaW5wdXRzLCBrd2FyZ3MpO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZT86IFNoYXBlfFNoYXBlW10pIHtcbiAgICAvLyBDYWxsIGBnZXRFeGFjdGx5T25lU2hhcGVgIHdpdGhvdXQgdXNpbmcgaXRzIHJldHVybiB2YWx1ZSxcbiAgICAvLyB0byB2ZXJpZnkgdGhhdCBleGFjdGx5IG9uZSBpbnB1dCBzaGFwZSBpcyBwcm92aWRlZC5cbiAgICBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICBpZiAodGhpcy5pbnB1dHMubGVuZ3RoID09PSAwIHx8IHRoaXMub3V0cHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXG4gICAgICAgICAgJ1NlcXVlbnRpYWwgbW9kZWwgY2Fubm90IGJlIGJ1aWx0OiBtb2RlbCBpcyBlbXB0eS4nICtcbiAgICAgICAgICAnIEFkZCBzb21lIGxheWVycyBmaXJzdC4nKTtcbiAgICB9XG4gICAgLy8gYWN0dWFsbHkgY3JlYXRlIHRoZSBtb2RlbFxuICAgIHRoaXMubW9kZWwgPSBuZXcgTGF5ZXJzTW9kZWwoe1xuICAgICAgaW5wdXRzOiB0aGlzLmlucHV0cyxcbiAgICAgIG91dHB1dHM6IHRoaXMub3V0cHV0c1swXSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSArICdfbW9kZWwnXG4gICAgfSk7XG4gICAgdGhpcy5tb2RlbC50cmFpbmFibGUgPSB0aGlzLnRyYWluYWJsZTtcblxuICAgIC8vIG1pcnJvciBtb2RlbCBhdHRyaWJ1dGVzXG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0aGlzLm1vZGVsLnN1cHBvcnRzTWFza2luZztcbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEFkZCBjYWNoZXNcbiAgICB0aGlzLmlucHV0TGF5ZXJzID0gdGhpcy5tb2RlbC5pbnB1dExheWVycztcbiAgICB0aGlzLmlucHV0TGF5ZXJzTm9kZUluZGljZXMgPSB0aGlzLm1vZGVsLmlucHV0TGF5ZXJzTm9kZUluZGljZXM7XG4gICAgdGhpcy5pbnB1dExheWVyc1RlbnNvckluZGljZXMgPSB0aGlzLm1vZGVsLmlucHV0TGF5ZXJzVGVuc29ySW5kaWNlcztcbiAgICB0aGlzLm91dHB1dExheWVycyA9IHRoaXMubW9kZWwub3V0cHV0TGF5ZXJzO1xuICAgIHRoaXMub3V0cHV0TGF5ZXJzTm9kZUluZGljZXMgPSB0aGlzLm1vZGVsLm91dHB1dExheWVyc05vZGVJbmRpY2VzO1xuICAgIHRoaXMub3V0cHV0TGF5ZXJzVGVuc29ySW5kaWNlcyA9IHRoaXMubW9kZWwub3V0cHV0TGF5ZXJzVGVuc29ySW5kaWNlcztcbiAgICB0aGlzLm5vZGVzQnlEZXB0aCA9IHRoaXMubW9kZWwubm9kZXNCeURlcHRoO1xuICAgIHRoaXMuY29udGFpbmVyTm9kZXMgPSB0aGlzLm1vZGVsLmNvbnRhaW5lck5vZGVzO1xuICAgIHRoaXMub3V0cHV0TmFtZXMgPSB0aGlzLm1vZGVsLm91dHB1dE5hbWVzO1xuICAgIHRoaXMuaW5wdXROYW1lcyA9IHRoaXMubW9kZWwuaW5wdXROYW1lcztcbiAgICAvLyBUT0RPKG1pY2hhZWx0ZXJyeSk6IEFkZCBmZWVkSW5wdXROYW1lcywgZmVlZElucHV0cywgaWYgbmVlZGVkLlxuICAgIC8vIFRPRE8obWljaGFlbHRlcnJ5KTogQWRkIGNhbGxiYWNrTW9kZWwgaWYgbmVlZGVkLlxuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY291bnRQYXJhbXMoKTogbnVtYmVyIHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHN1cGVyLmNvdW50UGFyYW1zKCk7XG4gIH1cblxuICAvKipcbiAgICogUHJpbnQgYSB0ZXh0IHN1bW1hcnkgb2YgdGhlIFNlcXVlbnRpYWwgbW9kZWwncyBsYXllcnMuXG4gICAqXG4gICAqIFRoZSBzdW1tYXJ5IGluY2x1ZGVzXG4gICAqIC0gTmFtZSBhbmQgdHlwZSBvZiBhbGwgbGF5ZXJzIHRoYXQgY29tcHJpc2UgdGhlIG1vZGVsLlxuICAgKiAtIE91dHB1dCBzaGFwZShzKSBvZiB0aGUgbGF5ZXJzXG4gICAqIC0gTnVtYmVyIG9mIHdlaWdodCBwYXJhbWV0ZXJzIG9mIGVhY2ggbGF5ZXJcbiAgICogLSBUaGUgdG90YWwgbnVtYmVyIG9mIHRyYWluYWJsZSBhbmQgbm9uLXRyYWluYWJsZSBwYXJhbWV0ZXJzIG9mIHRoZVxuICAgKiBtb2RlbC5cbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gICAqIG1vZGVsLmFkZChcbiAgICogICAgIHRmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEwMCwgaW5wdXRTaGFwZTogWzEwXSwgYWN0aXZhdGlvbjogJ3JlbHUnfSkpO1xuICAgKiBtb2RlbC5hZGQodGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgYWN0aXZhdGlvbjogJ3NpZ21vaWQnfSkpO1xuICAgKlxuICAgKiBtb2RlbC5zdW1tYXJ5KCk7XG4gICAqIGBgYFxuICAgKlxuICAgKiBAcGFyYW0gbGluZUxlbmd0aCBDdXN0b20gbGluZSBsZW5ndGgsIGluIG51bWJlciBvZiBjaGFyYWN0ZXJzLlxuICAgKiBAcGFyYW0gcG9zaXRpb25zIEN1c3RvbSB3aWR0aHMgb2YgZWFjaCBvZiB0aGUgY29sdW1ucywgYXMgZWl0aGVyXG4gICAqICAgZnJhY3Rpb25zIG9mIGBsaW5lTGVuZ3RoYCAoZS5nLiwgYFswLjUsIDAuNzUsIDFdYCkgb3IgYWJzb2x1dGUgbnVtYmVyXG4gICAqICAgb2YgY2hhcmFjdGVycyAoZS5nLiwgYFszMCwgNTAsIDY1XWApLiBFYWNoIG51bWJlciBjb3JyZXNwb25kcyB0b1xuICAgKiAgIHJpZ2h0LW1vc3QgKGkuZS4sIGVuZGluZykgcG9zaXRpb24gb2YgYSBjb2x1bW4uXG4gICAqIEBwYXJhbSBwcmludEZuIEN1c3RvbSBwcmludCBmdW5jdGlvbi4gQ2FuIGJlIHVzZWQgdG8gcmVwbGFjZSB0aGUgZGVmYXVsdFxuICAgKiAgIGBjb25zb2xlLmxvZ2AuIEZvciBleGFtcGxlLCB5b3UgY2FuIHVzZSBgeCA9PiB7fWAgdG8gbXV0ZSB0aGUgcHJpbnRlZFxuICAgKiAgIG1lc3NhZ2VzIGluIHRoZSBjb25zb2xlLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgc3VtbWFyeShcbiAgICAgIGxpbmVMZW5ndGg/OiBudW1iZXIsIHBvc2l0aW9ucz86IG51bWJlcltdLFxuICAgICAgcHJpbnRGbjpcbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICAobWVzc2FnZT86IGFueSwgLi4ub3B0aW9uYWxQYXJhbXM6IGFueVtdKSA9PiB2b2lkID0gY29uc29sZS5sb2cpIHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICB9XG4gICAgc3VwZXIuc3VtbWFyeShsaW5lTGVuZ3RoLCBwb3NpdGlvbnMsIHByaW50Rm4pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgdGhlIHdlaWdodHMgb2YgdGhlIG1vZGVsLlxuICAgKlxuICAgKiBAcGFyYW0gd2VpZ2h0cyBTaG91bGQgYmUgYSBsaXN0IG9mIFRlbnNvcnMgd2l0aCBzaGFwZXMgYW5kIHR5cGVzIG1hdGNoaW5nXG4gICAqICAgdGhlIG91dHB1dCBvZiBgbW9kZWwuZ2V0V2VpZ2h0cygpYC5cbiAgICovXG4gIHNldFdlaWdodHMod2VpZ2h0czogVGVuc29yW10pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aGlzLmJ1aWxkKCk7XG4gICAgfVxuICAgIHRoaXMubW9kZWwuc2V0V2VpZ2h0cyh3ZWlnaHRzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHRoZSBsb3NzIHZhbHVlICYgbWV0cmljcyB2YWx1ZXMgZm9yIHRoZSBtb2RlbCBpbiB0ZXN0IG1vZGUuXG4gICAqXG4gICAqIExvc3MgYW5kIG1ldHJpY3MgYXJlIHNwZWNpZmllZCBkdXJpbmcgYGNvbXBpbGUoKWAsIHdoaWNoIG5lZWRzIHRvIGhhcHBlblxuICAgKiBiZWZvcmUgY2FsbHMgdG8gYGV2YWx1YXRlKClgLlxuICAgKlxuICAgKiBDb21wdXRhdGlvbiBpcyBkb25lIGluIGJhdGNoZXMuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IG1vZGVsID0gdGYuc2VxdWVudGlhbCh7XG4gICAqICAgbGF5ZXJzOiBbdGYubGF5ZXJzLmRlbnNlKHt1bml0czogMSwgaW5wdXRTaGFwZTogWzEwXX0pXVxuICAgKiB9KTtcbiAgICogbW9kZWwuY29tcGlsZSh7b3B0aW1pemVyOiAnc2dkJywgbG9zczogJ21lYW5TcXVhcmVkRXJyb3InfSk7XG4gICAqIGNvbnN0IHJlc3VsdCA9IG1vZGVsLmV2YWx1YXRlKHRmLm9uZXMoWzgsIDEwXSksIHRmLm9uZXMoWzgsIDFdKSwge1xuICAgKiAgIGJhdGNoU2l6ZTogNCxcbiAgICogfSk7XG4gICAqIHJlc3VsdC5wcmludCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHggYHRmLlRlbnNvcmAgb2YgdGVzdCBkYXRhLCBvciBhbiBgQXJyYXlgIG9mIGB0Zi5UZW5zb3JgcyBpZiB0aGVcbiAgICogbW9kZWwgaGFzIG11bHRpcGxlIGlucHV0cy5cbiAgICogQHBhcmFtIHkgYHRmLlRlbnNvcmAgb2YgdGFyZ2V0IGRhdGEsIG9yIGFuIGBBcnJheWAgb2YgYHRmLlRlbnNvcmBzIGlmIHRoZVxuICAgKiBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0cy5cbiAgICogQHBhcmFtIGFyZ3MgQSBgTW9kZWxFdmFsdWF0ZUNvbmZpZ2AsIGNvbnRhaW5pbmcgb3B0aW9uYWwgZmllbGRzLlxuICAgKlxuICAgKiBAcmV0dXJuIGBTY2FsYXJgIHRlc3QgbG9zcyAoaWYgdGhlIG1vZGVsIGhhcyBhIHNpbmdsZSBvdXRwdXQgYW5kIG5vXG4gICAqICAgbWV0cmljcykgb3IgYEFycmF5YCBvZiBgU2NhbGFyYHMgKGlmIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0c1xuICAgKiAgIGFuZC9vciBtZXRyaWNzKS4gVGhlIGF0dHJpYnV0ZSBgbW9kZWwubWV0cmljc05hbWVzYFxuICAgKiAgIHdpbGwgZ2l2ZSB5b3UgdGhlIGRpc3BsYXkgbGFiZWxzIGZvciB0aGUgc2NhbGFyIG91dHB1dHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBldmFsdWF0ZShcbiAgICAgIHg6IFRlbnNvcnxUZW5zb3JbXSwgeTogVGVuc29yfFRlbnNvcltdLFxuICAgICAgYXJnczogTW9kZWxFdmFsdWF0ZUFyZ3MgPSB7fSk6IFNjYWxhcnxTY2FsYXJbXSB7XG4gICAgaWYgKCF0aGlzLmJ1aWx0KSB7XG4gICAgICB0aHJvdyBuZXcgUnVudGltZUVycm9yKFxuICAgICAgICAgICdUaGUgbW9kZWwgbmVlZHMgdG8gYmUgY29tcGlsZWQgYmVmb3JlIGJlaW5nIHVzZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmV2YWx1YXRlKHgsIHksIGFyZ3MpO1xuICB9XG5cbiAgLy8gVE9ETyhjYWlzKTogQWRkIGNvZGUgc25pcHBldCBiZWxvdyBvbmNlIHJlYWwgZGF0YXNldCBvYmplY3RzIGFyZVxuICAvLyAgIGF2YWlsYWJsZS5cbiAgLyoqXG4gICAqIEV2YWx1YXRlIG1vZGVsIHVzaW5nIGEgZGF0YXNldCBvYmplY3QuXG4gICAqXG4gICAqIE5vdGU6IFVubGlrZSBgZXZhbHVhdGUoKWAsIHRoaXMgbWV0aG9kIGlzIGFzeW5jaHJvbm91cyAoYGFzeW5jYCkuXG4gICAqXG4gICAqIEBwYXJhbSBkYXRhc2V0IEEgZGF0YXNldCBvYmplY3QuIEl0cyBgaXRlcmF0b3IoKWAgbWV0aG9kIGlzIGV4cGVjdGVkXG4gICAqICAgdG8gZ2VuZXJhdGUgYSBkYXRhc2V0IGl0ZXJhdG9yIG9iamVjdCwgdGhlIGBuZXh0KClgIG1ldGhvZCBvZiB3aGljaFxuICAgKiAgIGlzIGV4cGVjdGVkIHRvIHByb2R1Y2UgZGF0YSBiYXRjaGVzIGZvciBldmFsdWF0aW9uLiBUaGUgcmV0dXJuIHZhbHVlXG4gICAqICAgb2YgdGhlIGBuZXh0KClgIGNhbGwgb3VnaHQgdG8gY29udGFpbiBhIGJvb2xlYW4gYGRvbmVgIGZpZWxkIGFuZCBhXG4gICAqICAgYHZhbHVlYCBmaWVsZC4gVGhlIGB2YWx1ZWAgZmllbGQgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgb2YgdHdvXG4gICAqICAgYHRmLlRlbnNvcmBzIG9yIGFuIGFycmF5IG9mIHR3byBuZXN0ZWQgYHRmLlRlbnNvcmAgc3RydWN0dXJlcy4gVGhlIGZvcm1lclxuICAgKiAgIGNhc2UgaXMgZm9yIG1vZGVscyB3aXRoIGV4YWN0bHkgb25lIGlucHV0IGFuZCBvbmUgb3V0cHV0IChlLmcuXG4gICAqICAgYSBzZXF1ZW50aWFsIG1vZGVsKS4gVGhlIGxhdHRlciBjYXNlIGlzIGZvciBtb2RlbHMgd2l0aCBtdWx0aXBsZVxuICAgKiAgIGlucHV0cyBhbmQvb3IgbXVsdGlwbGUgb3V0cHV0cy4gT2YgdGhlIHR3byBpdGVtcyBpbiB0aGUgYXJyYXksIHRoZVxuICAgKiAgIGZpcnN0IGlzIHRoZSBpbnB1dCBmZWF0dXJlKHMpIGFuZCB0aGUgc2Vjb25kIGlzIHRoZSBvdXRwdXQgdGFyZ2V0KHMpLlxuICAgKiBAcGFyYW0gYXJncyBBIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciB0aGUgZGF0YXNldC1iYXNlZCBldmFsdWF0aW9uLlxuICAgKiBAcmV0dXJucyBMb3NzIGFuZCBtZXRyaWMgdmFsdWVzIGFzIGFuIEFycmF5IG9mIGBTY2FsYXJgIG9iamVjdHMuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyBldmFsdWF0ZURhdGFzZXQoZGF0YXNldDogRGF0YXNldDx7fT4sIGFyZ3M6IE1vZGVsRXZhbHVhdGVEYXRhc2V0QXJncyk6XG4gICAgICBQcm9taXNlPFNjYWxhcnxTY2FsYXJbXT4ge1xuICAgIGlmICghdGhpcy5idWlsdCkge1xuICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFcnJvcihcbiAgICAgICAgICAnVGhlIG1vZGVsIG5lZWRzIHRvIGJlIGNvbXBpbGVkIGJlZm9yZSBiZWluZyB1c2VkLicpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5tb2RlbC5ldmFsdWF0ZURhdGFzZXQoZGF0YXNldCwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGVzIG91dHB1dCBwcmVkaWN0aW9ucyBmb3IgdGhlIGlucHV0IHNhbXBsZXMuXG4gICAqXG4gICAqIENvbXB1dGF0aW9uIGlzIGRvbmUgaW4gYmF0Y2hlcy5cbiAgICpcbiAgICogTm90ZTogdGhlIFwic3RlcFwiIG1vZGUgb2YgcHJlZGljdCgpIGlzIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLlxuICAgKiAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgVGVuc29yRmxvdy5qcyBjb3JlIGJhY2tlbmQgaXMgaW1wZXJhdGl2ZSBvbmx5LlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLnByZWRpY3QodGYub25lcyhbMiwgMTBdKSkucHJpbnQoKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB4IFRoZSBpbnB1dCBkYXRhLCBhcyBhIFRlbnNvciwgb3IgYW4gYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgaWZcbiAgICogICB0aGUgbW9kZWwgaGFzIG11bHRpcGxlIGlucHV0cy5cbiAgICogQHBhcmFtIGNvbmlmZyBBIGBNb2RlbFByZWRpY3RDb25maWdgIG9iamVjdCBjb250YWluaW5nIG9wdGlvbmFsIGZpZWxkcy5cbiAgICpcbiAgICogQHJldHVybiBgdGYuVGVuc29yYChzKSBvZiBwcmVkaWN0aW9ucy5cbiAgICpcbiAgICogQGV4Y2VwdGlvbiBWYWx1ZUVycm9yIEluIGNhc2Ugb2YgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YVxuICAgKiAgIGFuZCB0aGUgbW9kZWwncyBleHBlY3RhdGlvbnMsIG9yIGluIGNhc2UgYSBzdGF0ZWZ1bCBtb2RlbCByZWNlaXZlcyBhXG4gICAqICAgbnVtYmVyIG9mIHNhbXBsZXMgdGhhdCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgYmF0Y2ggc2l6ZS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIHByZWRpY3QoeDogVGVuc29yfFRlbnNvcltdLCBhcmdzOiBNb2RlbFByZWRpY3RBcmdzID0ge30pOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGlmICh0aGlzLm1vZGVsID09IG51bGwpIHtcbiAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwucHJlZGljdCh4LCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm5zIHByZWRpY3Rpb25zIGZvciBhIHNpbmdsZSBiYXRjaCBvZiBzYW1wbGVzLlxuICAgKlxuICAgKiBAcGFyYW0geDogSW5wdXQgc2FtcGxlcywgYXMgYSBUZW5zb3IsIG9yIGxpc3Qgb2YgVGVuc29ycyAoaWYgdGhlIG1vZGVsXG4gICAqICAgaGFzIG11bHRpcGxlIGlucHV0cykuXG4gICAqIEByZXR1cm4gVGVuc29yKHMpIG9mIHByZWRpY3Rpb25zXG4gICAqL1xuICBwcmVkaWN0T25CYXRjaCh4OiBUZW5zb3IpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGlmICh0aGlzLm1vZGVsID09IG51bGwpIHtcbiAgICAgIHRoaXMuYnVpbGQoKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubW9kZWwucHJlZGljdE9uQmF0Y2goeCk7XG4gIH1cblxuICAvKipcbiAgICogU2VlIGBMYXllcnNNb2RlbC5jb21waWxlYC5cbiAgICpcbiAgICogQHBhcmFtIGFyZ3NcbiAgICovXG4gIGNvbXBpbGUoYXJnczogTW9kZWxDb21waWxlQXJncyk6IHZvaWQge1xuICAgIHRoaXMuYnVpbGQoKTtcbiAgICB0aGlzLm1vZGVsLmNvbXBpbGUoYXJncyk7XG4gICAgdGhpcy5vcHRpbWl6ZXJfID0gdGhpcy5tb2RlbC5vcHRpbWl6ZXI7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIHRoaXMuaXNPcHRpbWl6ZXJPd25lZCA9ICh0aGlzLm1vZGVsIGFzIGFueSkuaXNPcHRpbWl6ZXJPd25lZDtcbiAgICB0aGlzLmxvc3MgPSB0aGlzLm1vZGVsLmxvc3M7XG4gICAgdGhpcy5tZXRyaWNzID0gdGhpcy5tb2RlbC5tZXRyaWNzO1xuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB0aGlzLmxvc3NXZWlnaHRzLCB0aGlzLnNhbXBsZVdlaWdodE1vZGUsXG4gICAgLy8gICB0aGlzLndlaWdodGVkTWV0cmljcywgdGhpcy50YXJnZXRzLlxuICAgIHRoaXMubWV0cmljc1RlbnNvcnMgPSB0aGlzLm1vZGVsLm1ldHJpY3NUZW5zb3JzO1xuICAgIHRoaXMubWV0cmljc05hbWVzID0gdGhpcy5tb2RlbC5tZXRyaWNzTmFtZXM7XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIHNhbXBsZVdlaWdodHMuXG4gIH1cblxuICBnZXQgb3B0aW1pemVyKCk6IE9wdGltaXplciB7XG4gICAgcmV0dXJuIHRoaXMubW9kZWwgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHRoaXMubW9kZWwub3B0aW1pemVyO1xuICB9XG5cbiAgc2V0IG9wdGltaXplcihvcHRpbWl6ZXI6IE9wdGltaXplcikge1xuICAgIHRoaXMubW9kZWwub3B0aW1pemVyID0gb3B0aW1pemVyO1xuICB9XG5cbiAgLyoqXG4gICAqIFRyYWlucyB0aGUgbW9kZWwgZm9yIGEgZml4ZWQgbnVtYmVyIG9mIGVwb2NocyAoaXRlcmF0aW9ucyBvbiBhIGRhdGFzZXQpLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFsxMF19KV1cbiAgICogfSk7XG4gICAqIG1vZGVsLmNvbXBpbGUoe29wdGltaXplcjogJ3NnZCcsIGxvc3M6ICdtZWFuU3F1YXJlZEVycm9yJ30pO1xuICAgKiBjb25zdCBoaXN0b3J5ID0gYXdhaXQgbW9kZWwuZml0KHRmLm9uZXMoWzgsIDEwXSksIHRmLm9uZXMoWzgsIDFdKSwge1xuICAgKiAgIGJhdGNoU2l6ZTogNCxcbiAgICogICBlcG9jaHM6IDNcbiAgICogfSk7XG4gICAqIGNvbnNvbGUubG9nKGhpc3RvcnkuaGlzdG9yeS5sb3NzWzBdKTtcbiAgICogYGBgXG4gICAqXG4gICAqIEBwYXJhbSB4IGB0Zi5UZW5zb3JgIG9mIHRyYWluaW5nIGRhdGEsIG9yIGFuIGFycmF5IG9mIGB0Zi5UZW5zb3JgcyBpZiB0aGVcbiAgICogbW9kZWwgaGFzIG11bHRpcGxlIGlucHV0cy4gSWYgYWxsIGlucHV0cyBpbiB0aGUgbW9kZWwgYXJlIG5hbWVkLCB5b3UgY2FuXG4gICAqIGFsc28gcGFzcyBhIGRpY3Rpb25hcnkgbWFwcGluZyBpbnB1dCBuYW1lcyB0byBgdGYuVGVuc29yYHMuXG4gICAqIEBwYXJhbSB5IGB0Zi5UZW5zb3JgIG9mIHRhcmdldCAobGFiZWwpIGRhdGEsIG9yIGFuIGFycmF5IG9mIGB0Zi5UZW5zb3JgcyBpZlxuICAgKiB0aGUgbW9kZWwgaGFzIG11bHRpcGxlIG91dHB1dHMuIElmIGFsbCBvdXRwdXRzIGluIHRoZSBtb2RlbCBhcmUgbmFtZWQsIHlvdVxuICAgKiAgY2FuIGFsc28gcGFzcyBhIGRpY3Rpb25hcnkgbWFwcGluZyBvdXRwdXQgbmFtZXMgdG8gYHRmLlRlbnNvcmBzLlxuICAgKiBAcGFyYW0gYXJncyAgQSBgTW9kZWxGaXRDb25maWdgLCBjb250YWluaW5nIG9wdGlvbmFsIGZpZWxkcy5cbiAgICpcbiAgICogQHJldHVybiBBIGBIaXN0b3J5YCBpbnN0YW5jZS4gSXRzIGBoaXN0b3J5YCBhdHRyaWJ1dGUgY29udGFpbnMgYWxsXG4gICAqICAgaW5mb3JtYXRpb24gY29sbGVjdGVkIGR1cmluZyB0cmFpbmluZy5cbiAgICpcbiAgICogQGV4Y2VwdGlvbiBWYWx1ZUVycm9yIEluIGNhc2Ugb2YgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgcHJvdmlkZWQgaW5wdXQgZGF0YVxuICAgKiAgIGFuZCB3aGF0IHRoZSBtb2RlbCBleHBlY3RzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgZml0KFxuICAgICAgeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgICAgeTogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgICAgYXJnczogTW9kZWxGaXRBcmdzID0ge30pOiBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoXG4gICAgICAgICAgJ1RoZSBtb2RlbCBuZWVkcyB0byBiZSBjb21waWxlZCBiZWZvcmUgJyArXG4gICAgICAgICAgJ2JlaW5nIHVzZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmZpdCh4LCB5LCBhcmdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUcmFpbnMgdGhlIG1vZGVsIHVzaW5nIGEgZGF0YXNldCBvYmplY3QuXG4gICAqXG4gICAqIGBgYGpzXG4gICAqIGNvbnN0IHhBcnJheSA9IFtcbiAgICogICBbMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV0sXG4gICAqICAgWzEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDFdLFxuICAgKiAgIFsxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxXSxcbiAgICogICBbMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMV0sXG4gICAqIF07XG4gICAqIGNvbnN0IHlBcnJheSA9IFsxLCAxLCAxLCAxXTtcbiAgICogLy8gQ3JlYXRlIGEgZGF0YXNldCBmcm9tIHRoZSBKYXZhU2NyaXB0IGFycmF5LlxuICAgKiBjb25zdCB4RGF0YXNldCA9IHRmLmRhdGEuYXJyYXkoeEFycmF5KTtcbiAgICogY29uc3QgeURhdGFzZXQgPSB0Zi5kYXRhLmFycmF5KHlBcnJheSk7XG4gICAqIC8vIFppcCBjb21iaW5lcyB0aGUgYHhgIGFuZCBgeWAgRGF0YXNldHMgaW50byBhIHNpbmdsZSBEYXRhc2V0LCB0aGVcbiAgICogLy8gaXRlcmF0b3Igb2Ygd2hpY2ggd2lsbCByZXR1cm4gYW4gb2JqZWN0IGNvbnRhaW5pbmcgb2YgdHdvIHRlbnNvcnMsXG4gICAqIC8vIGNvcnJlc3BvbmRpbmcgdG8gYHhgIGFuZCBgeWAuICBUaGUgY2FsbCB0byBgYmF0Y2goNClgIHdpbGwgYnVuZGxlXG4gICAqIC8vIGZvdXIgc3VjaCBzYW1wbGVzIGludG8gYSBzaW5nbGUgb2JqZWN0LCB3aXRoIHRoZSBzYW1lIGtleXMgbm93IHBvaW50aW5nXG4gICAqIC8vIHRvIHRlbnNvcnMgdGhhdCBob2xkIDQgZXhhbXBsZXMsIG9yZ2FuaXplZCBhbG9uZyB0aGUgYmF0Y2ggZGltZW5zaW9uLlxuICAgKiAvLyBUaGUgY2FsbCB0byBgc2h1ZmZsZSg0KWAgY2F1c2VzIGVhY2ggaXRlcmF0aW9uIHRocm91Z2ggdGhlIGRhdGFzZXQgdG9cbiAgICogLy8gaGFwcGVuIGluIGEgZGlmZmVyZW50IG9yZGVyLiAgVGhlIHNpemUgb2YgdGhlIHNodWZmbGUgd2luZG93IGlzIDQuXG4gICAqIGNvbnN0IHh5RGF0YXNldCA9IHRmLmRhdGEuemlwKHt4czogeERhdGFzZXQsIHlzOiB5RGF0YXNldH0pXG4gICAqICAgICAuYmF0Y2goNClcbiAgICogICAgIC5zaHVmZmxlKDQpO1xuICAgKiBjb25zdCBtb2RlbCA9IHRmLnNlcXVlbnRpYWwoe1xuICAgKiAgIGxheWVyczogW3RmLmxheWVycy5kZW5zZSh7dW5pdHM6IDEsIGlucHV0U2hhcGU6IFs5XX0pXVxuICAgKiB9KTtcbiAgICogbW9kZWwuY29tcGlsZSh7b3B0aW1pemVyOiAnc2dkJywgbG9zczogJ21lYW5TcXVhcmVkRXJyb3InfSk7XG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCBtb2RlbC5maXREYXRhc2V0KHh5RGF0YXNldCwge1xuICAgKiAgIGVwb2NoczogNCxcbiAgICogICBjYWxsYmFja3M6IHtvbkVwb2NoRW5kOiAoZXBvY2gsIGxvZ3MpID0+IGNvbnNvbGUubG9nKGxvZ3MubG9zcyl9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGRhdGFzZXQgQSBkYXRhc2V0IG9iamVjdC4gSXRzIGBpdGVyYXRvcigpYCBtZXRob2QgaXMgZXhwZWN0ZWQgdG9cbiAgICogICBnZW5lcmF0ZSBhIGRhdGFzZXQgaXRlcmF0b3Igb2JqZWN0LCB0aGUgYG5leHQoKWAgbWV0aG9kIG9mIHdoaWNoIGlzXG4gICAqICAgZXhwZWN0ZWQgdG8gcHJvZHVjZSBkYXRhIGJhdGNoZXMgZm9yIGV2YWx1YXRpb24uIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhlXG4gICAqICAgYG5leHQoKWAgY2FsbCBvdWdodCB0byBjb250YWluIGEgYm9vbGVhbiBgZG9uZWAgZmllbGQgYW5kIGEgYHZhbHVlYFxuICAgKiAgIGZpZWxkLlxuICAgKlxuICAgKiAgIFRoZSBgdmFsdWVgIGZpZWxkIGlzIGV4cGVjdGVkIHRvIGJlIGFuIG9iamVjdCBvZiB3aXRoIGZpZWxkc1xuICAgKiAgIGB4c2AgYW5kIGB5c2AsIHdoaWNoIHBvaW50IHRvIHRoZSBmZWF0dXJlIHRlbnNvciBhbmQgdGhlIHRhcmdldCB0ZW5zb3IsXG4gICAqICAgcmVzcGVjdGl2ZWx5LiBUaGlzIGNhc2UgaXMgZm9yIG1vZGVscyB3aXRoIGV4YWN0bHkgb25lIGlucHV0IGFuZCBvbmVcbiAgICogICBvdXRwdXQgKGUuZy4gYSBzZXF1ZW50aWFsIG1vZGVsKS4gRm9yIGV4YW1wbGU6XG4gICAqICAgYGBganNcbiAgICogICB7dmFsdWU6IHt4czogeHNUZW5zb3IsIHlzOiB5c1RlbnNvcn0sIGRvbmU6IGZhbHNlfVxuICAgKiAgIGBgYFxuICAgKlxuICAgKiAgIElmIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgaW5wdXRzLCB0aGUgYHhzYCBmaWVsZCBvZiBgdmFsdWVgIHNob3VsZFxuICAgKiAgIGJlIGFuIG9iamVjdCBtYXBwaW5nIGlucHV0IG5hbWVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgZmVhdHVyZSB0ZW5zb3JzLlxuICAgKiAgIEZvciBleGFtcGxlOlxuICAgKiAgIGBgYGpzXG4gICAqICAge1xuICAgKiAgICAgdmFsdWU6IHtcbiAgICogICAgICAgeHM6IHtcbiAgICogICAgICAgICBpbnB1dF8xOiB4c1RlbnNvcjEsXG4gICAqICAgICAgICAgaW5wdXRfMjogeHNUZW5zb3IyXG4gICAqICAgICAgIH0sXG4gICAqICAgICAgIHlzOiB5c1RlbnNvclxuICAgKiAgICAgfSxcbiAgICogICAgIGRvbmU6IGZhbHNlXG4gICAqICAgfVxuICAgKiAgIGBgYFxuICAgKiAgIElmIHRoZSBtb2RlbCBoYXMgbXVsdGlwbGUgb3V0cHV0cywgdGhlIGB5c2AgZmllbGQgb2YgYHZhbHVlYCBzaG91bGRcbiAgICogICBiZSBhbiBvYmplY3QgbWFwcGluZyBvdXRwdXQgbmFtZXMgdG8gdGhlaXIgcmVzcGVjdGl2ZSB0YXJnZXQgdGVuc29ycy5cbiAgICogICBGb3IgZXhhbXBsZTpcbiAgICogICBgYGBqc1xuICAgKiAgIHtcbiAgICogICAgIHZhbHVlOiB7XG4gICAqICAgICAgIHhzOiB4c1RlbnNvcixcbiAgICogICAgICAgeXM6IHtcbiAgICogICAgICAgICBvdXRwdXRfMTogeXNUZW5zb3IxLFxuICAgKiAgICAgICAgIG91dHB1dF8yOiB5c1RlbnNvcjJcbiAgICogICAgICAgfSxcbiAgICogICAgIH0sXG4gICAqICAgICBkb25lOiBmYWxzZVxuICAgKiAgIH1cbiAgICogICBgYGBcbiAgICogQHBhcmFtIGFyZ3MgQSBgTW9kZWxGaXREYXRhc2V0QXJnc2AsIGNvbnRhaW5pbmcgb3B0aW9uYWwgZmllbGRzLlxuICAgKlxuICAgKiBAcmV0dXJuIEEgYEhpc3RvcnlgIGluc3RhbmNlLiBJdHMgYGhpc3RvcnlgIGF0dHJpYnV0ZSBjb250YWlucyBhbGxcbiAgICogICBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgZHVyaW5nIHRyYWluaW5nLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnLCBpZ25vcmVDSTogdHJ1ZX1cbiAgICovXG4gIGFzeW5jIGZpdERhdGFzZXQ8VD4oZGF0YXNldDogRGF0YXNldDxUPiwgYXJnczogTW9kZWxGaXREYXRhc2V0QXJnczxUPik6XG4gICAgICBQcm9taXNlPEhpc3Rvcnk+IHtcbiAgICBpZiAoIXRoaXMuYnVpbHQpIHtcbiAgICAgIHRocm93IG5ldyBSdW50aW1lRXJyb3IoXG4gICAgICAgICAgJ1RoZSBtb2RlbCBuZWVkcyB0byBiZSBjb21waWxlZCBiZWZvcmUgJyArXG4gICAgICAgICAgJ2JlaW5nIHVzZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLmZpdERhdGFzZXQoZGF0YXNldCwgYXJncyk7XG4gIH1cblxuICAvKipcbiAgICogUnVucyBhIHNpbmdsZSBncmFkaWVudCB1cGRhdGUgb24gYSBzaW5nbGUgYmF0Y2ggb2YgZGF0YS5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBmaXQoKWAgYW5kIGBmaXREYXRhc2V0KClgIGluIHRoZSBmb2xsb3dpbmdcbiAgICogcmVnYXJkczpcbiAgICogICAtIEl0IG9wZXJhdGVzIG9uIGV4YWN0bHkgb25lIGJhdGNoIG9mIGRhdGEuXG4gICAqICAgLSBJdCByZXR1cm5zIG9ubHkgdGhlIGxvc3MgYW5kIG1ldHJpYyB2YWx1ZXMsIGluc3RlYWQgb2ZcbiAgICogICAgIHJldHVybmluZyB0aGUgYmF0Y2gtYnktYmF0Y2ggbG9zcyBhbmQgbWV0cmljIHZhbHVlcy5cbiAgICogICAtIEl0IGRvZXNuJ3Qgc3VwcG9ydCBmaW5lLWdyYWluZWQgb3B0aW9ucyBzdWNoIGFzIHZlcmJvc2l0eSBhbmRcbiAgICogICAgIGNhbGxiYWNrcy5cbiAgICpcbiAgICogQHBhcmFtIHggSW5wdXQgZGF0YS4gSXQgY291bGQgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6XG4gICAqICAgLSBBIGB0Zi5UZW5zb3JgLCBvciBhbiBBcnJheSBvZiBgdGYuVGVuc29yYHMgKGluIGNhc2UgdGhlIG1vZGVsIGhhc1xuICAgKiAgICAgbXVsdGlwbGUgaW5wdXRzKS5cbiAgICogICAtIEFuIE9iamVjdCBtYXBwaW5nIGlucHV0IG5hbWVzIHRvIGNvcnJlc3BvbmRpbmcgYHRmLlRlbnNvcmAgKGlmIHRoZVxuICAgKiAgICAgbW9kZWwgaGFzIG5hbWVkIGlucHV0cykuXG4gICAqIEBwYXJhbSB5IFRhcmdldCBkYXRhLiBJdCBjb3VsZCBiZSBlaXRoZXIgYSBgdGYuVGVuc29yYCBvciBtdWx0aXBsZVxuICAgKiAgIGB0Zi5UZW5zb3Jgcy4gSXQgc2hvdWxkIGJlIGNvbnNpc3RlbnQgd2l0aCBgeGAuXG4gICAqIEByZXR1cm5zIFRyYWluaW5nIGxvc3Mgb3IgbG9zc2VzIChpbiBjYXNlIHRoZSBtb2RlbCBoYXNcbiAgICogICBtdWx0aXBsZSBvdXRwdXRzKSwgYWxvbmcgd2l0aCBtZXRyaWNzIChpZiBhbnkpLCBhcyBudW1iZXJzLlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICAgKi9cbiAgYXN5bmMgdHJhaW5PbkJhdGNoKFxuICAgICAgeDogVGVuc29yfFRlbnNvcltdfHtbaW5wdXROYW1lOiBzdHJpbmddOiBUZW5zb3J9LFxuICAgICAgeTogVGVuc29yfFRlbnNvcltdfFxuICAgICAge1tpbnB1dE5hbWU6IHN0cmluZ106IFRlbnNvcn0pOiBQcm9taXNlPG51bWJlcnxudW1iZXJbXT4ge1xuICAgIHJldHVybiB0aGlzLm1vZGVsLnRyYWluT25CYXRjaCh4LCB5KTtcbiAgfVxuXG4gIC8qIFNlZSBwYXJlbnQgY2xhc3MgZm9yIEpzRG9jICovXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsXG4gICAgICBjdXN0b21PYmplY3RzID0ge30gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgZmFzdFdlaWdodEluaXQgPSBmYWxzZSk6IFQge1xuICAgIGxldCBjb25maWdBcnJheTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0QXJyYXk7XG4gICAgbGV0IGV4dHJhTW9kZWxDb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9O1xuICAgIGlmIChjb25maWcgaW5zdGFuY2VvZiBBcnJheSkge1xuICAgICAgaWYgKCEoY29uZmlnWzBdLmNsYXNzTmFtZSAhPSBudWxsKSB8fFxuICAgICAgICAgIGNvbmZpZ1swXVsnY2xhc3NOYW1lJ10gPT09ICdNZXJnZScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0xlZ2FjeSBzZXJpYWxpemF0aW9uIGZvcm1hdCBub3Qgc3VwcG9ydGVkIHlldC4nKTtcbiAgICAgIH1cbiAgICAgIGNvbmZpZ0FycmF5ID0gY29uZmlnO1xuICAgIH0gZWxzZSB7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICBjb25maWdbJ2xheWVycyddICE9IG51bGwsXG4gICAgICAgICAgKCkgPT5cbiAgICAgICAgICAgICAgYFdoZW4gdGhlIGNvbmZpZyBkYXRhIGZvciBhIFNlcXVlbnRpYWwgbW9kZWwgaXMgbm90IGFuIEFycmF5LCBgICtcbiAgICAgICAgICAgICAgYGl0IG11c3QgYmUgYW4gT2JqZWN0IHRoYXQgY29udGFpbnMgdGhlICdsYXllcnMnIGZpZWxkLmApO1xuICAgICAgY29uZmlnQXJyYXkgPSBjb25maWdbJ2xheWVycyddIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdEFycmF5O1xuICAgICAgZGVsZXRlIGNvbmZpZ1snbGF5ZXJzJ107XG4gICAgICBleHRyYU1vZGVsQ29uZmlnID0gY29uZmlnO1xuICAgIH1cblxuICAgIGNvbnN0IG1vZGVsID0gbmV3IGNscyhleHRyYU1vZGVsQ29uZmlnKTtcbiAgICBpZiAoIShtb2RlbCBpbnN0YW5jZW9mIFNlcXVlbnRpYWwpKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICBgU2VxdWVudGlhbC5mcm9tQ29uZmlnIGNhbGxlZCBvbiBub24tU2VxdWVudGlhbCBpbnB1dDogJHttb2RlbH1gKTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBjb25mIG9mIGNvbmZpZ0FycmF5KSB7XG4gICAgICBjb25zdCBjdXN0b21PYmplY3RzOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB1bmRlZmluZWQ7XG4gICAgICBjb25zdCBsYXllciA9IGRlc2VyaWFsaXplKFxuICAgICAgICAgICAgICAgICAgICAgICAgY29uZiBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsIGN1c3RvbU9iamVjdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICBmYXN0V2VpZ2h0SW5pdCkgYXMgTGF5ZXI7XG4gICAgICBpZiAoZmFzdFdlaWdodEluaXQpIHtcbiAgICAgICAgbGF5ZXIuc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCh0cnVlKTtcbiAgICAgIH1cbiAgICAgIG1vZGVsLmFkZChsYXllcik7XG4gICAgfVxuICAgIHJldHVybiBtb2RlbDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXR0ZXIgdXNlZCBmb3IgZm9yY2Ugc3RvcHBpbmcgb2YgTGF5ZXJzTW9kZWwuZml0KCkgKGkuZS4sIHRyYWluaW5nKS5cbiAgICpcbiAgICogRXhhbXBsZTpcbiAgICpcbiAgICogYGBganNcbiAgICogY29uc3QgbW9kZWwgPSB0Zi5zZXF1ZW50aWFsKCk7XG4gICAqIG1vZGVsLmFkZCh0Zi5sYXllcnMuZGVuc2Uoe3VuaXRzOiAxLCBpbnB1dFNoYXBlOiBbMTBdfSkpO1xuICAgKiBtb2RlbC5jb21waWxlKHtsb3NzOiAnbWVhblNxdWFyZWRFcnJvcicsIG9wdGltaXplcjogJ3NnZCd9KTtcbiAgICogY29uc3QgeHMgPSB0Zi5vbmVzKFs4LCAxMF0pO1xuICAgKiBjb25zdCB5cyA9IHRmLnplcm9zKFs4LCAxXSk7XG4gICAqXG4gICAqIGNvbnN0IGhpc3RvcnkgPSBhd2FpdCBtb2RlbC5maXQoeHMsIHlzLCB7XG4gICAqICAgZXBvY2hzOiAxMCxcbiAgICogICBjYWxsYmFja3M6IHtcbiAgICogICAgIG9uRXBvY2hFbmQ6IGFzeW5jIChlcG9jaCwgbG9ncykgPT4ge1xuICAgKiAgICAgICBpZiAoZXBvY2ggPT09IDIpIHtcbiAgICogICAgICAgICBtb2RlbC5zdG9wVHJhaW5pbmcgPSB0cnVlO1xuICAgKiAgICAgICB9XG4gICAqICAgICB9XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICpcbiAgICogLy8gVGhlcmUgc2hvdWxkIGJlIG9ubHkgMyB2YWx1ZXMgaW4gdGhlIGxvc3MgYXJyYXksIGluc3RlYWQgb2YgMTAgdmFsdWVzLFxuICAgKiAvLyBkdWUgdG8gdGhlIHN0b3BwaW5nIGFmdGVyIDMgZXBvY2hzLlxuICAgKiBjb25zb2xlLmxvZyhoaXN0b3J5Lmhpc3RvcnkubG9zcyk7XG4gICAqIGBgYFxuICAgKi9cbiAgc2V0IHN0b3BUcmFpbmluZyhzdG9wOiBib29sZWFuKSB7XG4gICAgLy8gVE9ETyhjYWlzKTogV2hlbiByZWZhY3RvcmluZyB0byByZW1vdmUgdGhlIGNvbXBvc2l0aW9uIHBhdHRlcm4gaGFwcGVucyxcbiAgICAvLyByZW1vdmUgdGhpcyBtZXRob2Qgb3ZlcnJpZGluZy5cbiAgICBpZiAodGhpcy5tb2RlbCA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IHNldCB0aGUgc3RvcFRyYWluaW5nIHByb3BlcnR5IG9mIGEgc2VxdWVudGlhbCBtb2RlbCBiZWZvcmUgJyArXG4gICAgICAgICAgJ2l0IGlzIGNvbXBpbGVkLicpO1xuICAgIH1cbiAgICB0aGlzLm1vZGVsLnN0b3BUcmFpbmluZyA9IHN0b3A7XG4gIH1cblxuICBnZXQgc3RvcFRyYWluaW5nKCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLm1vZGVsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdDYW5ub3QgZ2V0IHRoZSBzdG9wVHJhaW5pbmcgcHJvcGVydHkgb2YgYSBzZXF1ZW50aWFsIG1vZGVsIGJlZm9yZSAnICtcbiAgICAgICAgICAnaXQgaXMgY29tcGlsZWQuJyk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1vZGVsLnN0b3BUcmFpbmluZztcbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IE92ZXJyaWRlIGdldCB0cmFpbmFibGVXZWlnaHRzKCkgaGVyZVxuXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgZ2V0Q29uZmlnKCk6IGFueSB7XG4gICAgLy8gTk9URShjYWlzKTogV2Ugb3ZlcnJpZGUgdGhlIHJldHVybiB0eXBlIG9mIGdldENvbmZpZygpIHRvIGBhbnlgIGhlcmUsXG4gICAgLy8gICBiZWNhdXNlIHRoZSBgU2VxdWVudGlhbGAgY2xhc3MgaXMgYSBzcGVjaWFsIGNhc2UgYW1vbmcgYENvbnRhaW5lcmBcbiAgICAvLyAgIHN1YnR5cGVzIGluIHRoYXQgaXRzIGdldENvbmZpZygpIG1ldGhvZCByZXR1cm5zIGFuIEFycmF5IChub3QgYVxuICAgIC8vICAgZGljdCkuXG4gICAgY29uc3QgbGF5ZXJzOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgbGF5ZXIgb2YgdGhpcy5sYXllcnMpIHtcbiAgICAgIGNvbnN0IGRpY3Q6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9O1xuICAgICAgZGljdFsnY2xhc3NOYW1lJ10gPSBsYXllci5nZXRDbGFzc05hbWUoKTtcbiAgICAgIGRpY3RbJ2NvbmZpZyddID0gbGF5ZXIuZ2V0Q29uZmlnKCk7XG4gICAgICBsYXllcnMucHVzaChkaWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIHtuYW1lOiB0aGlzLm5hbWUsIGxheWVyc307XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTZXF1ZW50aWFsKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n// Layer activation functions\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport * as K from './backend/tfjs_backend';\nimport { deserializeKerasObject } from './utils/generic_utils';\n/**\n * Base class for Activations.\n *\n * Special note: due to cross-language compatibility reasons, the\n * static readonly className field in this family of classes must be set to\n * the initialLowerCamelCase name of the activation.\n */\nexport class Activation extends serialization.Serializable {\n    getConfig() {\n        return {};\n    }\n}\n/**\n * Exponential linear unit (ELU).\n * Reference: https://arxiv.org/abs/1511.07289\n */\nexport class Elu extends Activation {\n    /**\n     * Calculate the activation function.\n     *\n     * @param x: Input.\n     * @param alpha: Scaling factor the negative section.\n     * @return Output of the ELU activation.\n     */\n    apply(x, alpha = 1) {\n        return K.elu(x, alpha);\n    }\n}\n/** @nocollapse */\nElu.className = 'elu';\nserialization.registerClass(Elu);\n/**\n * Scaled Exponential Linear Unit. (Klambauer et al., 2017).\n * Reference: Self-Normalizing Neural Networks, https://arxiv.org/abs/1706.02515\n * Notes:\n *   - To be used together with the initialization \"lecunNormal\".\n *   - To be used together with the dropout variant \"AlphaDropout\".\n */\nexport class Selu extends Activation {\n    apply(x) {\n        return tfc.selu(x);\n    }\n}\n/** @nocollapse */\nSelu.className = 'selu';\nserialization.registerClass(Selu);\n/**\n *  Rectified linear unit\n */\nexport class Relu extends Activation {\n    apply(x) {\n        return tfc.relu(x);\n    }\n}\n/** @nocollapse */\nRelu.className = 'relu';\nserialization.registerClass(Relu);\n/**\n * Rectified linear unit activation maxing out at 6.0.\n */\nexport class Relu6 extends Activation {\n    apply(x) {\n        return tidy(() => tfc.minimum(6.0, tfc.relu(x)));\n    }\n}\n/** @nocollapse */\nRelu6.className = 'relu6';\nserialization.registerClass(Relu6);\n//* Linear activation (no-op) */\nexport class Linear extends Activation {\n    apply(x) {\n        return x;\n    }\n}\n/** @nocollapse */\nLinear.className = 'linear';\nserialization.registerClass(Linear);\n/**\n * Sigmoid activation function.\n */\nexport class Sigmoid extends Activation {\n    apply(x) {\n        return tfc.sigmoid(x);\n    }\n}\n/** @nocollapse */\nSigmoid.className = 'sigmoid';\nserialization.registerClass(Sigmoid);\n/**\n * Segment-wise linear approximation of sigmoid.\n */\nexport class HardSigmoid extends Activation {\n    apply(x) {\n        return K.hardSigmoid(x);\n    }\n}\n/** @nocollapse */\nHardSigmoid.className = 'hardSigmoid';\nserialization.registerClass(HardSigmoid);\n/**\n * Softplus activation function.\n */\nexport class Softplus extends Activation {\n    apply(x) {\n        return tfc.softplus(x);\n    }\n}\n/** @nocollapse */\nSoftplus.className = 'softplus';\nserialization.registerClass(Softplus);\n/**\n * Softsign activation function.\n */\nexport class Softsign extends Activation {\n    apply(x) {\n        return K.softsign(x);\n    }\n}\n/** @nocollapse */\nSoftsign.className = 'softsign';\nserialization.registerClass(Softsign);\n/**\n * Hyperbolic tangent function.\n */\nexport class Tanh extends Activation {\n    apply(x) {\n        return tfc.tanh(x);\n    }\n}\n/** @nocollapse */\nTanh.className = 'tanh';\nserialization.registerClass(Tanh);\n/**\n * Softmax activation function\n */\nexport class Softmax extends Activation {\n    /**\n     * Calculate the activation function.\n     *\n     * @param x Tensor.\n     * @param axis Integer, axis along which the softmax normalization is applied.\n     * Invalid if < 2, as softmax across 1 (the batch dimension) is assumed to be\n     * an error.\n     *\n     * @returns a Tensor of the same shape as x\n     *\n     * @throws ValueError: In case `dim(x) < 2`.\n     */\n    apply(x, axis = (-1)) {\n        return tfc.softmax(x, axis);\n    }\n}\n/** @nocollapse */\nSoftmax.className = 'softmax';\nserialization.registerClass(Softmax);\n/**\n * Log softmax activation function\n */\nexport class LogSoftmax extends Activation {\n    /**\n     * Calculate the activation function of log softmax:\n     * log( exp(x_i) / sum(exp(x)) )\n     *\n     * @param x Tensor.\n     * @param axis Integer, axis along which the softmax normalization is applied.\n     * Invalid if < 2, as softmax across 1 (the batch dimension) is assumed to be\n     * an error.\n     *\n     * @returns a Tensor of the same shape as x\n     *\n     * @throws ValueError: In case `dim(x) < 2`.\n     */\n    apply(x, axis = (-1)) {\n        return tfc.logSoftmax(x, axis);\n    }\n}\n/** @nocollapse */\nLogSoftmax.className = 'logSoftmax';\nserialization.registerClass(LogSoftmax);\n/**\n * Swish activation function\n */\nexport class Swish extends Activation {\n    /**\n     * Calculate the activation function.\n     *\n     * @param x Tensor.\n     * @param alpha Scaling factor for the sigmoid function.\n     * @returns a Tensor of the same shape as x\n     */\n    apply(x, alpha = 1) {\n        return tidy(() => tfc.mul(tfc.sigmoid(tfc.mul(x, alpha)), x));\n    }\n}\n/** @nocollapse */\nSwish.className = 'swish';\nserialization.registerClass(Swish);\n/**\n * Mish activation function\n */\nexport class Mish extends Activation {\n    /**\n     * Calculate the activation function.\n     *\n     * @param x Tensor.\n     * @returns a Tensor of the same shape as x\n     */\n    apply(x) {\n        return tidy(() => tfc.mul(x, tfc.tanh(tfc.softplus(x))));\n    }\n}\n/** @nocollapse */\nMish.className = 'mish';\nserialization.registerClass(Mish);\nexport function serializeActivation(activation) {\n    return activation.getClassName();\n}\nexport function deserializeActivation(config, customObjects = {}) {\n    return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'activation');\n}\nexport function getActivation(identifier) {\n    if (identifier == null) {\n        const config = {};\n        config['className'] = 'linear';\n        config['config'] = {};\n        return deserializeActivation(config);\n    }\n    if (typeof identifier === 'string') {\n        const config = {};\n        config['className'] = identifier;\n        config['config'] = {};\n        return deserializeActivation(config);\n    }\n    else if (identifier instanceof Activation) {\n        return identifier;\n    }\n    else {\n        return deserializeActivation(identifier);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aXZhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvYWN0aXZhdGlvbnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSCw2QkFBNkI7QUFDN0IsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsYUFBYSxFQUFVLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xFLE9BQU8sS0FBSyxDQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUMsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFN0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFnQixVQUFXLFNBQVEsYUFBYSxDQUFDLFlBQVk7SUFFakUsU0FBUztRQUNQLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztDQUNGO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLEdBQUksU0FBUSxVQUFVO0lBR2pDOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxDQUFTLEVBQUUsS0FBSyxHQUFHLENBQUM7UUFDeEIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6QixDQUFDOztBQVhELGtCQUFrQjtBQUNGLGFBQVMsR0FBRyxLQUFLLENBQUM7QUFZcEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUVqQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLE9BQU8sSUFBSyxTQUFRLFVBQVU7SUFHbEMsS0FBSyxDQUFDLENBQVM7UUFDYixPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDckIsQ0FBQzs7QUFKRCxrQkFBa0I7QUFDRixjQUFTLEdBQUcsTUFBTSxDQUFDO0FBS3JDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFFbEM7O0dBRUc7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b3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBMYXllciBhY3RpdmF0aW9uIGZ1bmN0aW9uc1xuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3NlcmlhbGl6YXRpb24sIFRlbnNvciwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCAqIGFzIEsgZnJvbSAnLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge0FjdGl2YXRpb25JZGVudGlmaWVyfSBmcm9tICcuL2tlcmFzX2Zvcm1hdC9hY3RpdmF0aW9uX2NvbmZpZyc7XG5pbXBvcnQge2Rlc2VyaWFsaXplS2VyYXNPYmplY3R9IGZyb20gJy4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5cbi8qKlxuICogQmFzZSBjbGFzcyBmb3IgQWN0aXZhdGlvbnMuXG4gKlxuICogU3BlY2lhbCBub3RlOiBkdWUgdG8gY3Jvc3MtbGFuZ3VhZ2UgY29tcGF0aWJpbGl0eSByZWFzb25zLCB0aGVcbiAqIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgZmllbGQgaW4gdGhpcyBmYW1pbHkgb2YgY2xhc3NlcyBtdXN0IGJlIHNldCB0b1xuICogdGhlIGluaXRpYWxMb3dlckNhbWVsQ2FzZSBuYW1lIG9mIHRoZSBhY3RpdmF0aW9uLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQWN0aXZhdGlvbiBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIHtcbiAgYWJzdHJhY3QgYXBwbHkodGVuc29yOiBUZW5zb3IsIGF4aXM/OiBudW1iZXIpOiBUZW5zb3I7XG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIHJldHVybiB7fTtcbiAgfVxufVxuXG4vKipcbiAqIEV4cG9uZW50aWFsIGxpbmVhciB1bml0IChFTFUpLlxuICogUmVmZXJlbmNlOiBodHRwczovL2FyeGl2Lm9yZy9hYnMvMTUxMS4wNzI4OVxuICovXG5leHBvcnQgY2xhc3MgRWx1IGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ2VsdSc7XG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB4OiBJbnB1dC5cbiAgICogQHBhcmFtIGFscGhhOiBTY2FsaW5nIGZhY3RvciB0aGUgbmVnYXRpdmUgc2VjdGlvbi5cbiAgICogQHJldHVybiBPdXRwdXQgb2YgdGhlIEVMVSBhY3RpdmF0aW9uLlxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yLCBhbHBoYSA9IDEpOiBUZW5zb3Ige1xuICAgIHJldHVybiBLLmVsdSh4LCBhbHBoYSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhFbHUpO1xuXG4vKipcbiAqIFNjYWxlZCBFeHBvbmVudGlhbCBMaW5lYXIgVW5pdC4gKEtsYW1iYXVlciBldCBhbC4sIDIwMTcpLlxuICogUmVmZXJlbmNlOiBTZWxmLU5vcm1hbGl6aW5nIE5ldXJhbCBOZXR3b3JrcywgaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE3MDYuMDI1MTVcbiAqIE5vdGVzOlxuICogICAtIFRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgaW5pdGlhbGl6YXRpb24gXCJsZWN1bk5vcm1hbFwiLlxuICogICAtIFRvIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCB0aGUgZHJvcG91dCB2YXJpYW50IFwiQWxwaGFEcm9wb3V0XCIuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZWx1IGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ3NlbHUnO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0ZmMuc2VsdSh4KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNlbHUpO1xuXG4vKipcbiAqICBSZWN0aWZpZWQgbGluZWFyIHVuaXRcbiAqL1xuZXhwb3J0IGNsYXNzIFJlbHUgZXh0ZW5kcyBBY3RpdmF0aW9uIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAncmVsdSc7XG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRmYy5yZWx1KHgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVsdSk7XG5cbi8qKlxuICogUmVjdGlmaWVkIGxpbmVhciB1bml0IGFjdGl2YXRpb24gbWF4aW5nIG91dCBhdCA2LjAuXG4gKi9cbmV4cG9ydCBjbGFzcyBSZWx1NiBleHRlbmRzIEFjdGl2YXRpb24ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdyZWx1Nic7XG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4gdGZjLm1pbmltdW0oNi4wLCB0ZmMucmVsdSh4KSkpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVsdTYpO1xuXG4vLyogTGluZWFyIGFjdGl2YXRpb24gKG5vLW9wKSAqL1xuZXhwb3J0IGNsYXNzIExpbmVhciBleHRlbmRzIEFjdGl2YXRpb24ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdsaW5lYXInO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiB4O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTGluZWFyKTtcblxuLyoqXG4gKiBTaWdtb2lkIGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTaWdtb2lkIGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ3NpZ21vaWQnO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0ZmMuc2lnbW9pZCh4KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNpZ21vaWQpO1xuXG4vKipcbiAqIFNlZ21lbnQtd2lzZSBsaW5lYXIgYXBwcm94aW1hdGlvbiBvZiBzaWdtb2lkLlxuICovXG5leHBvcnQgY2xhc3MgSGFyZFNpZ21vaWQgZXh0ZW5kcyBBY3RpdmF0aW9uIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnaGFyZFNpZ21vaWQnO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiBLLmhhcmRTaWdtb2lkKHgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoSGFyZFNpZ21vaWQpO1xuXG4vKipcbiAqIFNvZnRwbHVzIGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2Z0cGx1cyBleHRlbmRzIEFjdGl2YXRpb24ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdzb2Z0cGx1cyc7XG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRmYy5zb2Z0cGx1cyh4KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFNvZnRwbHVzKTtcblxuLyoqXG4gKiBTb2Z0c2lnbiBhY3RpdmF0aW9uIGZ1bmN0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgU29mdHNpZ24gZXh0ZW5kcyBBY3RpdmF0aW9uIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAnc29mdHNpZ24nO1xuICBhcHBseSh4OiBUZW5zb3IpOiBUZW5zb3Ige1xuICAgIHJldHVybiBLLnNvZnRzaWduKHgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU29mdHNpZ24pO1xuXG4vKipcbiAqIEh5cGVyYm9saWMgdGFuZ2VudCBmdW5jdGlvbi5cbiAqL1xuZXhwb3J0IGNsYXNzIFRhbmggZXh0ZW5kcyBBY3RpdmF0aW9uIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyByZWFkb25seSBjbGFzc05hbWUgPSAndGFuaCc7XG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRmYy50YW5oKHgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVGFuaCk7XG5cbi8qKlxuICogU29mdG1heCBhY3RpdmF0aW9uIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBTb2Z0bWF4IGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ3NvZnRtYXgnO1xuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geCBUZW5zb3IuXG4gICAqIEBwYXJhbSBheGlzIEludGVnZXIsIGF4aXMgYWxvbmcgd2hpY2ggdGhlIHNvZnRtYXggbm9ybWFsaXphdGlvbiBpcyBhcHBsaWVkLlxuICAgKiBJbnZhbGlkIGlmIDwgMiwgYXMgc29mdG1heCBhY3Jvc3MgMSAodGhlIGJhdGNoIGRpbWVuc2lvbikgaXMgYXNzdW1lZCB0byBiZVxuICAgKiBhbiBlcnJvci5cbiAgICpcbiAgICogQHJldHVybnMgYSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgeFxuICAgKlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IEluIGNhc2UgYGRpbSh4KSA8IDJgLlxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yLCBheGlzOiBudW1iZXIgPSAoLTEpKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGZjLnNvZnRtYXgoeCwgYXhpcyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTb2Z0bWF4KTtcblxuLyoqXG4gKiBMb2cgc29mdG1heCBhY3RpdmF0aW9uIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBMb2dTb2Z0bWF4IGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ2xvZ1NvZnRtYXgnO1xuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uIG9mIGxvZyBzb2Z0bWF4OlxuICAgKiBsb2coIGV4cCh4X2kpIC8gc3VtKGV4cCh4KSkgKVxuICAgKlxuICAgKiBAcGFyYW0geCBUZW5zb3IuXG4gICAqIEBwYXJhbSBheGlzIEludGVnZXIsIGF4aXMgYWxvbmcgd2hpY2ggdGhlIHNvZnRtYXggbm9ybWFsaXphdGlvbiBpcyBhcHBsaWVkLlxuICAgKiBJbnZhbGlkIGlmIDwgMiwgYXMgc29mdG1heCBhY3Jvc3MgMSAodGhlIGJhdGNoIGRpbWVuc2lvbikgaXMgYXNzdW1lZCB0byBiZVxuICAgKiBhbiBlcnJvci5cbiAgICpcbiAgICogQHJldHVybnMgYSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgeFxuICAgKlxuICAgKiBAdGhyb3dzIFZhbHVlRXJyb3I6IEluIGNhc2UgYGRpbSh4KSA8IDJgLlxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yLCBheGlzOiBudW1iZXIgPSAoLTEpKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGZjLmxvZ1NvZnRtYXgoeCwgYXhpcyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMb2dTb2Z0bWF4KTtcblxuLyoqXG4gKiBTd2lzaCBhY3RpdmF0aW9uIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBTd2lzaCBleHRlbmRzIEFjdGl2YXRpb24ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIHJlYWRvbmx5IGNsYXNzTmFtZSA9ICdzd2lzaCc7XG4gIC8qKlxuICAgKiBDYWxjdWxhdGUgdGhlIGFjdGl2YXRpb24gZnVuY3Rpb24uXG4gICAqXG4gICAqIEBwYXJhbSB4IFRlbnNvci5cbiAgICogQHBhcmFtIGFscGhhIFNjYWxpbmcgZmFjdG9yIGZvciB0aGUgc2lnbW9pZCBmdW5jdGlvbi5cbiAgICogQHJldHVybnMgYSBUZW5zb3Igb2YgdGhlIHNhbWUgc2hhcGUgYXMgeFxuICAgKi9cbiAgYXBwbHkoeDogVGVuc29yLCBhbHBoYSA9IDEpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHRmYy5tdWwodGZjLnNpZ21vaWQodGZjLm11bCh4LCBhbHBoYSkpLCB4KSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTd2lzaCk7XG5cbi8qKlxuICogTWlzaCBhY3RpdmF0aW9uIGZ1bmN0aW9uXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXNoIGV4dGVuZHMgQWN0aXZhdGlvbiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgcmVhZG9ubHkgY2xhc3NOYW1lID0gJ21pc2gnO1xuICAvKipcbiAgICogQ2FsY3VsYXRlIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0geCBUZW5zb3IuXG4gICAqIEByZXR1cm5zIGEgVGVuc29yIG9mIHRoZSBzYW1lIHNoYXBlIGFzIHhcbiAgICovXG4gIGFwcGx5KHg6IFRlbnNvcik6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4gdGZjLm11bCh4LCB0ZmMudGFuaCh0ZmMuc29mdHBsdXMoeCkpKSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNaXNoKTtcblxuZXhwb3J0IGZ1bmN0aW9uIHNlcmlhbGl6ZUFjdGl2YXRpb24oYWN0aXZhdGlvbjogQWN0aXZhdGlvbik6IHN0cmluZyB7XG4gIHJldHVybiBhY3RpdmF0aW9uLmdldENsYXNzTmFtZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVzZXJpYWxpemVBY3RpdmF0aW9uKFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIGN1c3RvbU9iamVjdHM6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9KTogQWN0aXZhdGlvbiB7XG4gIHJldHVybiBkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0KFxuICAgICAgY29uZmlnLCBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YXRpb25NYXAuZ2V0TWFwKCkuY2xhc3NOYW1lTWFwLFxuICAgICAgY3VzdG9tT2JqZWN0cywgJ2FjdGl2YXRpb24nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEFjdGl2YXRpb24oaWRlbnRpZmllcjogQWN0aXZhdGlvbklkZW50aWZpZXJ8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3R8QWN0aXZhdGlvbik6IEFjdGl2YXRpb24ge1xuICBpZiAoaWRlbnRpZmllciA9PSBudWxsKSB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICBjb25maWdbJ2NsYXNzTmFtZSddID0gJ2xpbmVhcic7XG4gICAgY29uZmlnWydjb25maWcnXSA9IHt9O1xuICAgIHJldHVybiBkZXNlcmlhbGl6ZUFjdGl2YXRpb24oY29uZmlnKTtcbiAgfVxuICBpZiAodHlwZW9mIGlkZW50aWZpZXIgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7fTtcbiAgICBjb25maWdbJ2NsYXNzTmFtZSddID0gaWRlbnRpZmllcjtcbiAgICBjb25maWdbJ2NvbmZpZyddID0ge307XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplQWN0aXZhdGlvbihjb25maWcpO1xuICB9IGVsc2UgaWYgKGlkZW50aWZpZXIgaW5zdGFuY2VvZiBBY3RpdmF0aW9uKSB7XG4gICAgcmV0dXJuIGlkZW50aWZpZXI7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplQWN0aXZhdGlvbihpZGVudGlmaWVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/* original source: keras/regularizers.py */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { abs, add, serialization, sum, tidy, zeros } from '@tensorflow/tfjs-core';\nimport * as K from './backend/tfjs_backend';\nimport { deserializeKerasObject, serializeKerasObject } from './utils/generic_utils';\nfunction assertObjectArgs(args) {\n    if (args != null && typeof args !== 'object') {\n        throw new Error(`Argument to L1L2 regularizer's constructor is expected to be an ` +\n            `object, but received: ${args}`);\n    }\n}\n/**\n * Regularizer base class.\n */\nexport class Regularizer extends serialization.Serializable {\n}\nexport class L1L2 extends Regularizer {\n    constructor(args) {\n        super();\n        assertObjectArgs(args);\n        this.l1 = args == null || args.l1 == null ? 0.01 : args.l1;\n        this.l2 = args == null || args.l2 == null ? 0.01 : args.l2;\n        this.hasL1 = this.l1 !== 0;\n        this.hasL2 = this.l2 !== 0;\n    }\n    /**\n     * Porting note: Renamed from __call__.\n     * @param x Variable of which to calculate the regularization score.\n     */\n    apply(x) {\n        return tidy(() => {\n            let regularization = zeros([1]);\n            if (this.hasL1) {\n                regularization = add(regularization, sum(tfc.mul(this.l1, abs(x))));\n            }\n            if (this.hasL2) {\n                regularization =\n                    add(regularization, sum(tfc.mul(this.l2, K.square(x))));\n            }\n            return tfc.reshape(regularization, []);\n        });\n    }\n    getConfig() {\n        return { 'l1': this.l1, 'l2': this.l2 };\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls({ l1: config['l1'], l2: config['l2'] });\n    }\n}\n/** @nocollapse */\nL1L2.className = 'L1L2';\nserialization.registerClass(L1L2);\nexport function l1(args) {\n    assertObjectArgs(args);\n    return new L1L2({ l1: args != null ? args.l1 : null, l2: 0 });\n}\nexport function l2(args) {\n    assertObjectArgs(args);\n    return new L1L2({ l2: args != null ? args.l2 : null, l1: 0 });\n}\n// Maps the JavaScript-like identifier keys to the corresponding keras symbols.\nexport const REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP = {\n    'l1l2': 'L1L2'\n};\nexport function serializeRegularizer(constraint) {\n    return serializeKerasObject(constraint);\n}\nexport function deserializeRegularizer(config, customObjects = {}) {\n    return deserializeKerasObject(config, serialization.SerializationMap.getMap().classNameMap, customObjects, 'regularizer');\n}\nexport function getRegularizer(identifier) {\n    if (identifier == null) {\n        return null;\n    }\n    if (typeof identifier === 'string') {\n        const className = identifier in REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP ?\n            REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP[identifier] :\n            identifier;\n        const config = { className, config: {} };\n        return deserializeRegularizer(config);\n    }\n    else if (identifier instanceof Regularizer) {\n        return identifier;\n    }\n    else {\n        return deserializeRegularizer(identifier);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVndWxhcml6ZXJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL3JlZ3VsYXJpemVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVILDRDQUE0QztBQUU1QyxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxHQUFHLEVBQUUsR0FBRyxFQUFVLGFBQWEsRUFBRSxHQUFHLEVBQVUsSUFBSSxFQUFFLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2hHLE9BQU8sS0FBSyxDQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDNUMsT0FBTyxFQUFDLHNCQUFzQixFQUFFLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbkYsU0FBUyxnQkFBZ0IsQ0FBQyxJQUE0QjtJQUNwRCxJQUFJLElBQUksSUFBSSxJQUFJLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQ1gsa0VBQWtFO1lBQ2xFLHlCQUF5QixJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQ3RDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixXQUFZLFNBQVEsYUFBYSxDQUFDLFlBQVk7Q0FFbkU7QUFtQkQsTUFBTSxPQUFPLElBQUssU0FBUSxXQUFXO0lBUW5DLFlBQVksSUFBZTtRQUN6QixLQUFLLEVBQUUsQ0FBQztRQUVSLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsRUFBRSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1FBQzNELElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMs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QUFDLFlBQVksRUFDNUQsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLFVBRVc7SUFDeEMsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3RCLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFDRCxJQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTtRQUNsQyxNQUFNLFNBQVMsR0FBRyxVQUFVLElBQUksMENBQTBDLENBQUMsQ0FBQztZQUN4RSwwQ0FBMEMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO1lBQ3hELFVBQVUsQ0FBQztRQUNmLE1BQU0sTUFBTSxHQUFHLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBQztRQUN2QyxPQUFPLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3ZDO1NBQU0sSUFBSSxVQUFVLFlBQVksV0FBVyxFQUFFO1FBQzVDLE9BQU8sVUFBVSxDQUFDO0tBQ25CO1NBQU07UUFDTCxPQUFPLHNCQUFzQixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQzNDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qIG9yaWdpbmFsIHNvdXJjZToga2VyYXMvcmVndWxhcml6ZXJzLnB5ICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHthYnMsIGFkZCwgU2NhbGFyLCBzZXJpYWxpemF0aW9uLCBzdW0sIFRlbnNvciwgdGlkeSwgemVyb3N9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBLIGZyb20gJy4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtkZXNlcmlhbGl6ZUtlcmFzT2JqZWN0LCBzZXJpYWxpemVLZXJhc09iamVjdH0gZnJvbSAnLi91dGlscy9nZW5lcmljX3V0aWxzJztcblxuZnVuY3Rpb24gYXNzZXJ0T2JqZWN0QXJncyhhcmdzOiBMMUFyZ3N8TDJBcmdzfEwxTDJBcmdzKTogdm9pZCB7XG4gIGlmIChhcmdzICE9IG51bGwgJiYgdHlwZW9mIGFyZ3MgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQXJndW1lbnQgdG8gTDFMMiByZWd1bGFyaXplcidzIGNvbnN0cnVjdG9yIGlzIGV4cGVjdGVkIHRvIGJlIGFuIGAgK1xuICAgICAgICBgb2JqZWN0LCBidXQgcmVjZWl2ZWQ6ICR7YXJnc31gKTtcbiAgfVxufVxuXG4vKipcbiAqIFJlZ3VsYXJpemVyIGJhc2UgY2xhc3MuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBSZWd1bGFyaXplciBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlIHtcbiAgYWJzdHJhY3QgYXBwbHkoeDogVGVuc29yKTogU2NhbGFyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEwxTDJBcmdzIHtcbiAgLyoqIEwxIHJlZ3VsYXJpemF0aW9uIHJhdGUuIERlZmF1bHRzIHRvIDAuMDEuICovXG4gIGwxPzogbnVtYmVyO1xuICAvKiogTDIgcmVndWxhcml6YXRpb24gcmF0ZS4gRGVmYXVsdHMgdG8gMC4wMS4gKi9cbiAgbDI/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTDFBcmdzIHtcbiAgLyoqIEwxIHJlZ3VsYXJpemF0aW9uIHJhdGUuIERlZmF1bHRzIHRvIDAuMDEuICovXG4gIGwxOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgTDJBcmdzIHtcbiAgLyoqIEwyIHJlZ3VsYXJpemF0aW9uIHJhdGUuIERlZmF1bHRzIHRvIDAuMDEuICovXG4gIGwyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBMMUwyIGV4dGVuZHMgUmVndWxhcml6ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdMMUwyJztcblxuICBwcml2YXRlIHJlYWRvbmx5IGwxOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbDI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNMMTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBoYXNMMjogYm9vbGVhbjtcbiAgY29uc3RydWN0b3IoYXJncz86IEwxTDJBcmdzKSB7XG4gICAgc3VwZXIoKTtcblxuICAgIGFzc2VydE9iamVjdEFyZ3MoYXJncyk7XG5cbiAgICB0aGlzLmwxID0gYXJncyA9PSBudWxsIHx8IGFyZ3MubDEgPT0gbnVsbCA/IDAuMDEgOiBhcmdzLmwxO1xuICAgIHRoaXMubDIgPSBhcmdzID09IG51bGwgfHwgYXJncy5sMiA9PSBudWxsID8gMC4wMSA6IGFyZ3MubDI7XG4gICAgdGhpcy5oYXNMMSA9IHRoaXMubDEgIT09IDA7XG4gICAgdGhpcy5oYXNMMiA9IHRoaXMubDIgIT09IDA7XG4gIH1cblxuICAvKipcbiAgICogUG9ydGluZyBub3RlOiBSZW5hbWVkIGZyb20gX19jYWxsX18uXG4gICAqIEBwYXJhbSB4IFZhcmlhYmxlIG9mIHdoaWNoIHRvIGNhbGN1bGF0ZSB0aGUgcmVndWxhcml6YXRpb24gc2NvcmUuXG4gICAqL1xuICBhcHBseSh4OiBUZW5zb3IpOiBTY2FsYXIge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCByZWd1bGFyaXphdGlvbjogVGVuc29yID0gemVyb3MoWzFdKTtcbiAgICAgIGlmICh0aGlzLmhhc0wxKSB7XG4gICAgICAgIHJlZ3VsYXJpemF0aW9uID0gYWRkKHJlZ3VsYXJpemF0aW9uLCBzdW0odGZjLm11bCh0aGlzLmwxLCBhYnMoeCkpKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5oYXNMMikge1xuICAgICAgICByZWd1bGFyaXphdGlvbiA9XG4gICAgICAgICAgICBhZGQocmVndWxhcml6YXRpb24sIHN1bSh0ZmMubXVsKHRoaXMubDIsIEsuc3F1YXJlKHgpKSkpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRmYy5yZXNoYXBlKHJlZ3VsYXJpemF0aW9uLCBbXSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICByZXR1cm4geydsMSc6IHRoaXMubDEsICdsMic6IHRoaXMubDJ9O1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sXG4gICAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIHJldHVybiBuZXcgY2xzKHtsMTogY29uZmlnWydsMSddIGFzIG51bWJlciwgbDI6IGNvbmZpZ1snbDInXSBhcyBudW1iZXJ9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEwxTDIpO1xuXG5leHBvcnQgZnVuY3Rpb24gbDEoYXJncz86IEwxQXJncykge1xuICBhc3NlcnRPYmplY3RBcmdzKGFyZ3MpO1xuICByZXR1cm4gbmV3IEwxTDIoe2wxOiBhcmdzICE9IG51bGwgPyBhcmdzLmwxIDogbnVsbCwgbDI6IDB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGwyKGFyZ3M6IEwyQXJncykge1xuICBhc3NlcnRPYmplY3RBcmdzKGFyZ3MpO1xuICByZXR1cm4gbmV3IEwxTDIoe2wyOiBhcmdzICE9IG51bGwgPyBhcmdzLmwyIDogbnVsbCwgbDE6IDB9KTtcbn1cblxuLyoqIEBkb2NpbmxpbmUgKi9cbmV4cG9ydCB0eXBlIFJlZ3VsYXJpemVySWRlbnRpZmllciA9ICdsMWwyJ3xzdHJpbmc7XG5cbi8vIE1hcHMgdGhlIEphdmFTY3JpcHQtbGlrZSBpZGVudGlmaWVyIGtleXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcga2VyYXMgc3ltYm9scy5cbmV4cG9ydCBjb25zdCBSRUdVTEFSSVpFUl9JREVOVElGSUVSX1JFR0lTVFJZX1NZTUJPTF9NQVA6XG4gICAge1tpZGVudGlmaWVyIGluIFJlZ3VsYXJpemVySWRlbnRpZmllcl06IHN0cmluZ30gPSB7XG4gICAgICAnbDFsMic6ICdMMUwyJ1xuICAgIH07XG5cbmV4cG9ydCBmdW5jdGlvbiBzZXJpYWxpemVSZWd1bGFyaXplcihjb25zdHJhaW50OiBSZWd1bGFyaXplcik6XG4gICAgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0VmFsdWUge1xuICByZXR1cm4gc2VyaWFsaXplS2VyYXNPYmplY3QoY29uc3RyYWludCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXNlcmlhbGl6ZVJlZ3VsYXJpemVyKFxuICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgIGN1c3RvbU9iamVjdHM6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9KTogUmVndWxhcml6ZXIge1xuICByZXR1cm4gZGVzZXJpYWxpemVLZXJhc09iamVjdChcbiAgICAgIGNvbmZpZywgc2VyaWFsaXphdGlvbi5TZXJpYWxpemF0aW9uTWFwLmdldE1hcCgpLmNsYXNzTmFtZU1hcCxcbiAgICAgIGN1c3RvbU9iamVjdHMsICdyZWd1bGFyaXplcicpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UmVndWxhcml6ZXIoaWRlbnRpZmllcjogUmVndWxhcml6ZXJJZGVudGlmaWVyfFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWd1bGFyaXplcik6IFJlZ3VsYXJpemVyIHtcbiAgaWYgKGlkZW50aWZpZXIgPT0gbnVsbCkge1xuICAgIHJldHVybiBudWxsO1xuICB9XG4gIGlmICh0eXBlb2YgaWRlbnRpZmllciA9PT0gJ3N0cmluZycpIHtcbiAgICBjb25zdCBjbGFzc05hbWUgPSBpZGVudGlmaWVyIGluIFJFR1VMQVJJWkVSX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUCA/XG4gICAgICAgIFJFR1VMQVJJWkVSX0lERU5USUZJRVJfUkVHSVNUUllfU1lNQk9MX01BUFtpZGVudGlmaWVyXSA6XG4gICAgICAgIGlkZW50aWZpZXI7XG4gICAgY29uc3QgY29uZmlnID0ge2NsYXNzTmFtZSwgY29uZmlnOiB7fX07XG4gICAgcmV0dXJuIGRlc2VyaWFsaXplUmVndWxhcml6ZXIoY29uZmlnKTtcbiAgfSBlbHNlIGlmIChpZGVudGlmaWVyIGluc3RhbmNlb2YgUmVndWxhcml6ZXIpIHtcbiAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZGVzZXJpYWxpemVSZWd1bGFyaXplcihpZGVudGlmaWVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n *  Advanced activation layers.\n */\nimport { cast, clipByValue, elu, greater, leakyRelu, mul, prelu, relu, serialization } from '@tensorflow/tfjs-core';\nimport { Softmax as softmaxActivation } from '../activations';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nexport class ReLU extends Layer {\n    constructor(args) {\n        super(args == null ? {} : args);\n        this.supportsMasking = true;\n        if (args != null) {\n            this.maxValue = args.maxValue;\n        }\n    }\n    call(inputs, kwargs) {\n        inputs = getExactlyOneTensor(inputs);\n        let output = relu(inputs);\n        if (this.maxValue != null) {\n            output = clipByValue(output, 0, this.maxValue);\n        }\n        return output;\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const config = { maxValue: this.maxValue };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nReLU.className = 'ReLU';\nserialization.registerClass(ReLU);\nexport class LeakyReLU extends Layer {\n    constructor(args) {\n        super(args == null ? {} : args);\n        this.DEFAULT_ALPHA = 0.3;\n        if (args == null) {\n            args = {};\n        }\n        this.alpha = args.alpha == null ? this.DEFAULT_ALPHA : args.alpha;\n    }\n    call(inputs, kwargs) {\n        const x = getExactlyOneTensor(inputs);\n        return leakyRelu(x, this.alpha);\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const config = { alpha: this.alpha };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nLeakyReLU.className = 'LeakyReLU';\nserialization.registerClass(LeakyReLU);\nexport class PReLU extends Layer {\n    constructor(args) {\n        super(args == null ? {} : args);\n        this.DEFAULT_ALPHA_INITIALIZER = 'zeros';\n        if (args == null) {\n            args = {};\n        }\n        this.supportsMasking = true;\n        this.alphaInitializer =\n            getInitializer(args.alphaInitializer || this.DEFAULT_ALPHA_INITIALIZER);\n        this.alphaRegularizer = getRegularizer(args.alphaRegularizer);\n        this.alphaConstraint = getConstraint(args.alphaConstraint);\n        if (args.sharedAxes == null) {\n            this.sharedAxes = null;\n        }\n        else if (Array.isArray(args.sharedAxes)) {\n            this.sharedAxes = args.sharedAxes;\n        }\n        else if (typeof args.sharedAxes === 'number') {\n            this.sharedAxes = [args.sharedAxes];\n        }\n        else {\n            throw new ValueError(`Expected sharedAxes to be a number or an array of numbers, ` +\n                `but got ${args.sharedAxes}`);\n        }\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const paramShape = inputShape.slice(1);\n        if (this.sharedAxes != null) {\n            for (const i of this.sharedAxes) {\n                paramShape[i - 1] = 1;\n            }\n        }\n        this.alpha = this.addWeight('alpha', paramShape, 'float32', this.alphaInitializer, this.alphaRegularizer, true, this.alphaConstraint);\n        // Set input spec.\n        const axes = {};\n        if (this.sharedAxes != null) {\n            for (let i = 1; i < inputShape.length; ++i) {\n                axes[i] = inputShape[i];\n            }\n        }\n        this.inputSpec = [new InputSpec({\n                ndim: inputShape.length,\n                axes,\n            })];\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        inputs = getExactlyOneTensor(inputs);\n        return prelu(inputs, this.alpha.read());\n    }\n    getConfig() {\n        const config = {\n            alphaInitializer: serializeInitializer(this.alphaInitializer),\n            alphaRegularizer: serializeRegularizer(this.alphaRegularizer),\n            alphaConstraint: serializeConstraint(this.alphaConstraint),\n            sharedAxes: this.sharedAxes\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nPReLU.className = 'PReLU';\nserialization.registerClass(PReLU);\nexport class ELU extends Layer {\n    constructor(args) {\n        super(args == null ? {} : args);\n        this.DEFAULT_ALPHA = 1.0;\n        if (args == null) {\n            args = {};\n        }\n        if (args.alpha != null && args.alpha !== this.DEFAULT_ALPHA) {\n            throw new NotImplementedError(`Non-default alpha value (${args.alpha}) is not supported by the ` +\n                `ELU layer yet.`);\n        }\n        this.alpha = args.alpha == null ? this.DEFAULT_ALPHA : args.alpha;\n    }\n    call(inputs, kwargs) {\n        const x = getExactlyOneTensor(inputs);\n        return elu(x);\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const config = { alpha: this.alpha };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nELU.className = 'ELU';\nserialization.registerClass(ELU);\nexport class ThresholdedReLU extends Layer {\n    constructor(args) {\n        super(args == null ? {} : args);\n        this.DEFAULT_THETA = 1.0;\n        if (args == null) {\n            args = {};\n        }\n        this.theta = args.theta == null ? this.DEFAULT_THETA : args.theta;\n    }\n    call(inputs, kwargs) {\n        const x = getExactlyOneTensor(inputs);\n        return mul(x, cast(greater(x, this.theta), 'float32'));\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const config = { theta: this.theta };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nThresholdedReLU.className = 'ThresholdedReLU';\nserialization.registerClass(ThresholdedReLU);\nexport class Softmax extends Layer {\n    constructor(args) {\n        super(args == null ? {} : args);\n        this.DEFAULT_AXIS = 1.0;\n        if (args == null) {\n            args = {};\n        }\n        this.softmax = new softmaxActivation().apply;\n        this.axis = args.axis == null ? this.DEFAULT_AXIS : args.axis;\n    }\n    call(inputs, kwargs) {\n        const x = getExactlyOneTensor(inputs);\n        return this.softmax(x, this.axis);\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const config = { axis: this.axis };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nSoftmax.className = 'Softmax';\nserialization.registerClass(Softmax);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWRfYWN0aXZhdGlvbnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL2FkdmFuY2VkX2FjdGl2YXRpb25zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxSCxPQUFPLEVBQUMsT0FBTyxJQUFJLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDNUQsT0FBTyxFQUFhLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxjQUFjLEVBQWUsb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVsRixPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQVU3RSxNQUFNLE9BQU8sSUFBSyxTQUFRLEtBQUs7SUFLN0IsWUFBWSxJQUFvQjtRQUM5QixLQUFLLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7WUFDaEIs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LE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQTdCRCxrQkFBa0I7QUFDWCxpQkFBUyxHQUFHLFNBQVMsQ0FBQztBQThCL0IsYUFBYSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogIEFkdmFuY2VkIGFjdGl2YXRpb24gbGF5ZXJzLlxuICovXG5cbmltcG9ydCB7Y2FzdCwgY2xpcEJ5VmFsdWUsIGVsdSwgZ3JlYXRlciwgbGVha3lSZWx1LCBtdWwsIHByZWx1LCByZWx1LCBzZXJpYWxpemF0aW9uLCBUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7U29mdG1heCBhcyBzb2Z0bWF4QWN0aXZhdGlvbn0gZnJvbSAnLi4vYWN0aXZhdGlvbnMnO1xuaW1wb3J0IHtDb25zdHJhaW50LCBnZXRDb25zdHJhaW50LCBzZXJpYWxpemVDb25zdHJhaW50fSBmcm9tICcuLi9jb25zdHJhaW50cyc7XG5pbXBvcnQge0lucHV0U3BlYywgTGF5ZXIsIExheWVyQXJnc30gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7Z2V0SW5pdGlhbGl6ZXIsIEluaXRpYWxpemVyLCBJbml0aWFsaXplcklkZW50aWZpZXIsIHNlcmlhbGl6ZUluaXRpYWxpemVyfSBmcm9tICcuLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge2dldFJlZ3VsYXJpemVyLCBSZWd1bGFyaXplciwgc2VyaWFsaXplUmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFJlTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmxvYXQsIHRoZSBtYXhpbXVtIG91dHB1dCB2YWx1ZS5cbiAgICovXG4gIG1heFZhbHVlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUmVMVSc7XG4gIG1heFZhbHVlOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYXJncz86IFJlTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gdHJ1ZTtcbiAgICBpZiAoYXJncyAhPSBudWxsKSB7XG4gICAgICB0aGlzLm1heFZhbHVlID0gYXJncy5tYXhWYWx1ZTtcbiAgICB9XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgaW5wdXRzID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIGxldCBvdXRwdXQgPSByZWx1KGlucHV0cyk7XG4gICAgaWYgKHRoaXMubWF4VmFsdWUgIT0gbnVsbCkge1xuICAgICAgb3V0cHV0ID0gY2xpcEJ5VmFsdWUob3V0cHV0LCAwLCB0aGlzLm1heFZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHttYXhWYWx1ZTogdGhpcy5tYXhWYWx1ZX07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVMVSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBMZWFreVJlTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmxvYXQgYD49IDBgLiBOZWdhdGl2ZSBzbG9wZSBjb2VmZmljaWVudC4gRGVmYXVsdHMgdG8gYDAuM2AuXG4gICAqL1xuICBhbHBoYT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIExlYWt5UmVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTGVha3lSZUxVJztcbiAgcmVhZG9ubHkgYWxwaGE6IG51bWJlcjtcblxuICByZWFkb25seSBERUZBVUxUX0FMUEhBID0gMC4zO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMZWFreVJlTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5hbHBoYSA9IGFyZ3MuYWxwaGEgPT0gbnVsbCA/IHRoaXMuREVGQVVMVF9BTFBIQSA6IGFyZ3MuYWxwaGE7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgY29uc3QgeCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICByZXR1cm4gbGVha3lSZWx1KHgsIHRoaXMuYWxwaGEpO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge2FscGhhOiB0aGlzLmFscGhhfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMZWFreVJlTFUpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgUFJlTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBsZWFybmFibGUgYWxwaGEuXG4gICAqL1xuICBhbHBoYUluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJ8SW5pdGlhbGl6ZXJJZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmb3IgdGhlIGxlYXJuYWJsZSBhbHBoYS5cbiAgICovXG4gIGFscGhhUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGxlYXJuYWJsZSBhbHBoYS5cbiAgICovXG4gIGFscGhhQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIFRoZSBheGVzIGFsb25nIHdoaWNoIHRvIHNoYXJlIGxlYXJuYWJsZSBwYXJhbWV0ZXJzIGZvciB0aGUgYWN0aXZhdGlvblxuICAgKiBmdW5jdGlvbi4gRm9yIGV4YW1wbGUsIGlmIHRoZSBpbmNvbWluZyBmZWF0dXJlIG1hcHMgYXJlIGZyb20gYSAyRFxuICAgKiBjb252b2x1dGlvbiB3aXRoIG91dHB1dCBzaGFwZSBgW251bUV4YW1wbGVzLCBoZWlnaHQsIHdpZHRoLCBjaGFubmVsc11gLFxuICAgKiBhbmQgeW91IHdpc2ggdG8gc2hhcmUgcGFyYW1ldGVycyBhY3Jvc3Mgc3BhY2UgKGhlaWdodCBhbmQgd2lkdGgpIHNvIHRoYXRcbiAgICogZWFjaCBmaWx0ZXIgY2hhbm5lbHMgaGFzIG9ubHkgb25lIHNldCBvZiBwYXJhbWV0ZXJzLCBzZXRcbiAgICogYHNoYXJlZF9heGVzOiBbMSwgMl1gLlxuICAgKi9cbiAgc2hhcmVkQXhlcz86IG51bWJlcnxudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFBSZUxVIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdQUmVMVSc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxwaGFJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxwaGFSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYWxwaGFDb25zdHJhaW50OiBDb25zdHJhaW50O1xuICBwcml2YXRlIHJlYWRvbmx5IHNoYXJlZEF4ZXM6IG51bWJlcltdO1xuICBwcml2YXRlIGFscGhhOiBMYXllclZhcmlhYmxlO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfQUxQSEFfSU5JVElBTElaRVI6IEluaXRpYWxpemVySWRlbnRpZmllciA9ICd6ZXJvcyc7XG5cbiAgY29uc3RydWN0b3IoYXJncz86IFBSZUxVTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyA9PSBudWxsID8ge30gOiBhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuXG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuYWxwaGFJbml0aWFsaXplciA9XG4gICAgICAgIGdldEluaXRpYWxpemVyKGFyZ3MuYWxwaGFJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfQUxQSEFfSU5JVElBTElaRVIpO1xuICAgIHRoaXMuYWxwaGFSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuYWxwaGFSZWd1bGFyaXplcik7XG4gICAgdGhpcy5hbHBoYUNvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MuYWxwaGFDb25zdHJhaW50KTtcbiAgICBpZiAoYXJncy5zaGFyZWRBeGVzID09IG51bGwpIHtcbiAgICAgIHRoaXMuc2hhcmVkQXhlcyA9IG51bGw7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3Muc2hhcmVkQXhlcykpIHtcbiAgICAgIHRoaXMuc2hhcmVkQXhlcyA9IGFyZ3Muc2hhcmVkQXhlcztcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBhcmdzLnNoYXJlZEF4ZXMgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLnNoYXJlZEF4ZXMgPSBbYXJncy5zaGFyZWRBeGVzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEV4cGVjdGVkIHNoYXJlZEF4ZXMgdG8gYmUgYSBudW1iZXIgb3IgYW4gYXJyYXkgb2YgbnVtYmVycywgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHthcmdzLnNoYXJlZEF4ZXN9YCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSkge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgcGFyYW1TaGFwZTogU2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKDEpO1xuICAgIGlmICh0aGlzLnNoYXJlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChjb25zdCBpIG9mIHRoaXMuc2hhcmVkQXhlcykge1xuICAgICAgICBwYXJhbVNoYXBlW2kgLSAxXSA9IDE7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuYWxwaGEgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2FscGhhJywgcGFyYW1TaGFwZSwgJ2Zsb2F0MzInLCB0aGlzLmFscGhhSW5pdGlhbGl6ZXIsXG4gICAgICAgIHRoaXMuYWxwaGFSZWd1bGFyaXplciwgdHJ1ZSwgdGhpcy5hbHBoYUNvbnN0cmFpbnQpO1xuICAgIC8vIFNldCBpbnB1dCBzcGVjLlxuICAgIGNvbnN0IGF4ZXM6IHtbYXhpczogbnVtYmVyXTogbnVtYmVyfSA9IHt9O1xuICAgIGlmICh0aGlzLnNoYXJlZEF4ZXMgIT0gbnVsbCkge1xuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGF4ZXNbaV0gPSBpbnB1dFNoYXBlW2ldO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtcbiAgICAgIG5kaW06IGlucHV0U2hhcGUubGVuZ3RoLFxuICAgICAgYXhlcyxcbiAgICB9KV07XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgaW5wdXRzID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIHJldHVybiBwcmVsdShpbnB1dHMsIHRoaXMuYWxwaGEucmVhZCgpKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge1xuICAgICAgYWxwaGFJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5hbHBoYUluaXRpYWxpemVyKSxcbiAgICAgIGFscGhhUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWxwaGFSZWd1bGFyaXplciksXG4gICAgICBhbHBoYUNvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5hbHBoYUNvbnN0cmFpbnQpLFxuICAgICAgc2hhcmVkQXhlczogdGhpcy5zaGFyZWRBeGVzXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhQUmVMVSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBFTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmxvYXQgYD49IDBgLiBOZWdhdGl2ZSBzbG9wZSBjb2VmZmljaWVudC4gRGVmYXVsdHMgdG8gYDEuMGAuXG4gICAqL1xuICBhbHBoYT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRUxVJztcbiAgcmVhZG9ubHkgYWxwaGE6IG51bWJlcjtcblxuICByZWFkb25seSBERUZBVUxUX0FMUEhBID0gMS4wO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBFTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICBpZiAoYXJncy5hbHBoYSAhPSBudWxsICYmIGFyZ3MuYWxwaGEgIT09IHRoaXMuREVGQVVMVF9BTFBIQSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgYE5vbi1kZWZhdWx0IGFscGhhIHZhbHVlICgke2FyZ3MuYWxwaGF9KSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBgICtcbiAgICAgICAgICBgRUxVIGxheWVyIHlldC5gKTtcbiAgICB9XG5cbiAgICB0aGlzLmFscGhhID0gYXJncy5hbHBoYSA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0FMUEhBIDogYXJncy5hbHBoYTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBjb25zdCB4ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIHJldHVybiBlbHUoeCk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIHJldHVybiBpbnB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7YWxwaGE6IHRoaXMuYWxwaGF9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEVMVSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBUaHJlc2hvbGRlZFJlTFVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmxvYXQgPj0gMC4gVGhyZXNob2xkIGxvY2F0aW9uIG9mIGFjdGl2YXRpb24uXG4gICAqL1xuICB0aGV0YT86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFRocmVzaG9sZGVkUmVMVSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnVGhyZXNob2xkZWRSZUxVJztcbiAgcmVhZG9ubHkgdGhldGE6IG51bWJlcjtcblxuICByZWFkb25seSBERUZBVUxUX1RIRVRBID0gMS4wO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBUaHJlc2hvbGRlZFJlTFVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzID09IG51bGwgPyB7fSA6IGFyZ3MpO1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG5cbiAgICB0aGlzLnRoZXRhID0gYXJncy50aGV0YSA9PSBudWxsID8gdGhpcy5ERUZBVUxUX1RIRVRBIDogYXJncy50aGV0YTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICBjb25zdCB4ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIHJldHVybiBtdWwoeCwgY2FzdChncmVhdGVyKHgsIHRoaXMudGhldGEpLCAnZmxvYXQzMicpKTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt0aGV0YTogdGhpcy50aGV0YX07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVGhyZXNob2xkZWRSZUxVKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFNvZnRtYXhMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW50ZWdlciwgYXhpcyBhbG9uZyB3aGljaCB0aGUgc29mdG1heCBub3JtYWxpemF0aW9uIGlzIGFwcGxpZWQuXG4gICAqIERlZmF1bHRzIHRvIGAtMWAgKGkuZS4sIHRoZSBsYXN0IGF4aXMpLlxuICAgKi9cbiAgYXhpcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFNvZnRtYXggZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NvZnRtYXgnO1xuICByZWFkb25seSBheGlzOiBudW1iZXI7XG4gIHJlYWRvbmx5IHNvZnRtYXg6ICh0OiBUZW5zb3IsIGE/OiBudW1iZXIpID0+IFRlbnNvcjtcbiAgcmVhZG9ubHkgREVGQVVMVF9BWElTID0gMS4wO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTb2Z0bWF4TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyA9PSBudWxsID8ge30gOiBhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuICAgIHRoaXMuc29mdG1heCA9IG5ldyBzb2Z0bWF4QWN0aXZhdGlvbigpLmFwcGx5O1xuICAgIHRoaXMuYXhpcyA9IGFyZ3MuYXhpcyA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0FYSVMgOiBhcmdzLmF4aXM7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgY29uc3QgeCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICByZXR1cm4gdGhpcy5zb2Z0bWF4KHgsIHRoaXMuYXhpcyk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIHJldHVybiBpbnB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7YXhpczogdGhpcy5heGlzfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTb2Z0bWF4KTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { ValueError } from '../errors';\nimport { pyListRepeat } from './generic_utils';\nimport { isInteger, max } from './math_utils';\n/**\n * Transforms a single number of array of numbers into an array of numbers.\n * @param value\n * @param n: The size of the tuple to be returned.\n * @param name: Name of the parameter, used for generating error messages.\n * @returns An array of numbers.\n */\nexport function normalizeArray(value, n, name) {\n    if (typeof value === 'number') {\n        return pyListRepeat(value, n);\n    }\n    else {\n        if (value.length !== n) {\n            throw new ValueError(`The ${name} argument must be an integer or tuple of ${n} integers.` +\n                ` Received: ${value.length} elements.`);\n        }\n        for (let i = 0; i < n; ++i) {\n            const singleValue = value[i];\n            if (!isInteger(singleValue)) {\n                throw new ValueError(`The ${name} argument must be an integer or tuple of ${n}` +\n                    ` integers. Received: ${JSON.stringify(value)} including a` +\n                    ` non-integer number ${singleValue}`);\n            }\n        }\n        return value;\n    }\n}\n/**\n * Determines output length of a convolution given input length.\n * @param inputLength\n * @param filterSize\n * @param padding\n * @param stride\n * @param dilation: dilation rate.\n */\nexport function convOutputLength(inputLength, filterSize, padding, stride, dilation = 1) {\n    if (inputLength == null) {\n        return inputLength;\n    }\n    const dilatedFilterSize = filterSize + (filterSize - 1) * (dilation - 1);\n    let outputLength;\n    if (padding === 'same') {\n        outputLength = inputLength;\n    }\n    else { // VALID\n        outputLength = inputLength - dilatedFilterSize + 1;\n    }\n    return Math.floor((outputLength + stride - 1) / stride);\n}\nexport function deconvLength(dimSize, strideSize, kernelSize, padding) {\n    if (dimSize == null) {\n        return null;\n    }\n    if (padding === 'valid') {\n        dimSize = dimSize * strideSize + max([kernelSize - strideSize, 0]);\n    }\n    else if (padding === 'same') {\n        dimSize = dimSize * strideSize;\n    }\n    else {\n        throw new ValueError(`Unsupport padding mode: ${padding}.`);\n    }\n    return dimSize;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy91dGlscy9jb252X3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdyQyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFNUM7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGNBQWMsQ0FDMUIsS0FBc0IsRUFBRSxDQUFTLEVBQUUsSUFBWTtJQUNqRCxJQUFJLE9BQU8sS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM3QixPQUFPLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDL0I7U0FBTTtRQUNMLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDdEIsTUFBTSxJQUFJLFVBQVUsQ0FDaEIsT0FBTyxJQUFJLDRDQUE0QyxDQUFDLFlBQVk7Z0JBQ3BFLGNBQWMsS0FBSyxDQUFDLE1BQU0sWUFBWSxDQUFDLENBQUM7U0FDN0M7UUFDRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQzFCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxFQUFFO2dCQUMzQixNQUFNLElBQUksVUFBVSxDQUNoQixPQUFPLElBQUksNENBQTRDLENBQUMsRUFBRTtvQkFDMUQsd0JBQXdCLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLGNBQWM7b0JBQzNELHVCQUF1QixXQUFXLEVBQUUsQ0FBQyxDQUFDO2FBQzNDO1NBQ0Y7UUFDRCxPQUFPLEtBQUssQ0FBQztLQUNkO0FBQ0gsQ0FBQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLFdBQW1CLEVBQUUsVUFBa0IsRUFBRSxPQUFvQixFQUM3RCxNQUFjLEVBQUUsUUFBUSxHQUFHLENBQUM7SUFDOUIsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ3ZCLE9BQU8sV0FBVyxDQUFDO0tBQ3BCO0lBQ0QsTUFBTSxpQkFBaUIsR0FBRyxVQUFVLEdBQUcsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekUsSUFBSSxZQUFvQixDQUFDO0lBQ3pCLElBQUksT0FBTyxLQUFLLE1BQU0sRUFBRTtRQUN0QixZQUFZLEdBQUcsV0FBVyxDQUFDO0tBQzVCO1NBQU0sRUFBRyxRQUFRO1FBQ2hCLFlBQVksR0FBRyxXQUFXLEdBQUcsaUJBQWlCLEdBQUcsQ0FBQyxDQUFDO0tBQ3BEO0lBQ0QsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsWUFBWSxHQUFHLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQztBQUMxRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FDeEIsT0FBZSxFQUFFLFVBQWtCLEVBQUUsVUFBa0IsRUFDdkQsT0FBb0I7SUFDdEIsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDO0tBQ2I7SUFFRCxJQUFJLE9BQU8sS0FBSyxPQUFPLEVBQUU7UUFDdkIsT0FBTyxHQUFHLE9BQU8sR0FBRyxVQUFVLEdBQUcsR0FBRyxDQUFDLENBQUMsVUFBVSxHQUFHLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3BFO1NBQU0sSUFBSSxPQUFPLEtBQUssTUFBTSxFQUFFO1FBQzdCLE9BQU8sR0FBRyxPQUFPLEdBQUcsVUFBVSxDQUFDO0tBQ2hDO1NBQU07UUFDTCxNQUFNLElBQUksVUFBVSxDQUFDLDJCQUEyQixPQUFPLEdBQUcsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7UGFkZGluZ01vZGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuXG5pbXBvcnQge3B5TGlzdFJlcGVhdH0gZnJvbSAnLi9nZW5lcmljX3V0aWxzJztcbmltcG9ydCB7aXNJbnRlZ2VyLCBtYXh9IGZyb20gJy4vbWF0aF91dGlscyc7XG5cbi8qKlxuICogVHJhbnNmb3JtcyBhIHNpbmdsZSBudW1iZXIgb2YgYXJyYXkgb2YgbnVtYmVycyBpbnRvIGFuIGFycmF5IG9mIG51bWJlcnMuXG4gKiBAcGFyYW0gdmFsdWVcbiAqIEBwYXJhbSBuOiBUaGUgc2l6ZSBvZiB0aGUgdHVwbGUgdG8gYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0gbmFtZTogTmFtZSBvZiB0aGUgcGFyYW1ldGVyLCB1c2VkIGZvciBnZW5lcmF0aW5nIGVycm9yIG1lc3NhZ2VzLlxuICogQHJldHVybnMgQW4gYXJyYXkgb2YgbnVtYmVycy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG5vcm1hbGl6ZUFycmF5KFxuICAgIHZhbHVlOiBudW1iZXJ8bnVtYmVyW10sIG46IG51bWJlciwgbmFtZTogc3RyaW5nKTogbnVtYmVyW10ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBweUxpc3RSZXBlYXQodmFsdWUsIG4pO1xuICB9IGVsc2Uge1xuICAgIGlmICh2YWx1ZS5sZW5ndGggIT09IG4pIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBUaGUgJHtuYW1lfSBhcmd1bWVudCBtdXN0IGJlIGFuIGludGVnZXIgb3IgdHVwbGUgb2YgJHtufSBpbnRlZ2Vycy5gICtcbiAgICAgICAgICBgIFJlY2VpdmVkOiAke3ZhbHVlLmxlbmd0aH0gZWxlbWVudHMuYCk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSB7XG4gICAgICBjb25zdCBzaW5nbGVWYWx1ZSA9IHZhbHVlW2ldO1xuICAgICAgaWYgKCFpc0ludGVnZXIoc2luZ2xlVmFsdWUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFRoZSAke25hbWV9IGFyZ3VtZW50IG11c3QgYmUgYW4gaW50ZWdlciBvciB0dXBsZSBvZiAke259YCArXG4gICAgICAgICAgICBgIGludGVnZXJzLiBSZWNlaXZlZDogJHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9IGluY2x1ZGluZyBhYCArXG4gICAgICAgICAgICBgIG5vbi1pbnRlZ2VyIG51bWJlciAke3NpbmdsZVZhbHVlfWApO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIG91dHB1dCBsZW5ndGggb2YgYSBjb252b2x1dGlvbiBnaXZlbiBpbnB1dCBsZW5ndGguXG4gKiBAcGFyYW0gaW5wdXRMZW5ndGhcbiAqIEBwYXJhbSBmaWx0ZXJTaXplXG4gKiBAcGFyYW0gcGFkZGluZ1xuICogQHBhcmFtIHN0cmlkZVxuICogQHBhcmFtIGRpbGF0aW9uOiBkaWxhdGlvbiByYXRlLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udk91dHB1dExlbmd0aChcbiAgICBpbnB1dExlbmd0aDogbnVtYmVyLCBmaWx0ZXJTaXplOiBudW1iZXIsIHBhZGRpbmc6IFBhZGRpbmdNb2RlLFxuICAgIHN0cmlkZTogbnVtYmVyLCBkaWxhdGlvbiA9IDEpOiBudW1iZXIge1xuICBpZiAoaW5wdXRMZW5ndGggPT0gbnVsbCkge1xuICAgIHJldHVybiBpbnB1dExlbmd0aDtcbiAgfVxuICBjb25zdCBkaWxhdGVkRmlsdGVyU2l6ZSA9IGZpbHRlclNpemUgKyAoZmlsdGVyU2l6ZSAtIDEpICogKGRpbGF0aW9uIC0gMSk7XG4gIGxldCBvdXRwdXRMZW5ndGg6IG51bWJlcjtcbiAgaWYgKHBhZGRpbmcgPT09ICdzYW1lJykge1xuICAgIG91dHB1dExlbmd0aCA9IGlucHV0TGVuZ3RoO1xuICB9IGVsc2UgeyAgLy8gVkFMSURcbiAgICBvdXRwdXRMZW5ndGggPSBpbnB1dExlbmd0aCAtIGRpbGF0ZWRGaWx0ZXJTaXplICsgMTtcbiAgfVxuICByZXR1cm4gTWF0aC5mbG9vcigob3V0cHV0TGVuZ3RoICsgc3RyaWRlIC0gMSkgLyBzdHJpZGUpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZGVjb252TGVuZ3RoKFxuICAgIGRpbVNpemU6IG51bWJlciwgc3RyaWRlU2l6ZTogbnVtYmVyLCBrZXJuZWxTaXplOiBudW1iZXIsXG4gICAgcGFkZGluZzogUGFkZGluZ01vZGUpOiBudW1iZXIge1xuICBpZiAoZGltU2l6ZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBpZiAocGFkZGluZyA9PT0gJ3ZhbGlkJykge1xuICAgIGRpbVNpemUgPSBkaW1TaXplICogc3RyaWRlU2l6ZSArIG1heChba2VybmVsU2l6ZSAtIHN0cmlkZVNpemUsIDBdKTtcbiAgfSBlbHNlIGlmIChwYWRkaW5nID09PSAnc2FtZScpIHtcbiAgICBkaW1TaXplID0gZGltU2l6ZSAqIHN0cmlkZVNpemU7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoYFVuc3VwcG9ydCBwYWRkaW5nIG1vZGU6ICR7cGFkZGluZ30uYCk7XG4gIH1cbiAgcmV0dXJuIGRpbVNpemU7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Convolutional Layers\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { getActivation, serializeActivation } from '../activations';\nimport { imageDataFormat } from '../backend/common';\nimport * as K from '../backend/tfjs_backend';\nimport { checkDataFormat, checkInterpolationFormat, checkPaddingMode } from '../common';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { convOutputLength, deconvLength, normalizeArray } from '../utils/conv_utils';\nimport * as generic_utils from '../utils/generic_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\n/**\n * Transpose and cast the input before the conv2d.\n * @param x Input image tensor.\n * @param dataFormat\n */\nexport function preprocessConv2DInput(x, dataFormat) {\n    // TODO(cais): Cast type to float32 if not.\n    return tidy(() => {\n        checkDataFormat(dataFormat);\n        if (dataFormat === 'channelsFirst') {\n            return tfc.transpose(x, [0, 2, 3, 1]); // NCHW -> NHWC.\n        }\n        else {\n            return x;\n        }\n    });\n}\n/**\n * Transpose and cast the input before the conv3d.\n * @param x Input image tensor.\n * @param dataFormat\n */\nexport function preprocessConv3DInput(x, dataFormat) {\n    return tidy(() => {\n        checkDataFormat(dataFormat);\n        if (dataFormat === 'channelsFirst') {\n            return tfc.transpose(x, [0, 2, 3, 4, 1]); // NCDHW -> NDHWC.\n        }\n        else {\n            return x;\n        }\n    });\n}\n/**\n * 1D-convolution with bias added.\n *\n * Porting Note: This function does not exist in the Python Keras backend.\n *   It is exactly the same as `conv2d`, except the added `bias`.\n *\n * @param x Input tensor, rank-3, of shape `[batchSize, width, inChannels]`.\n * @param kernel Kernel, rank-3, of shape `[filterWidth, inDepth, outDepth]`.\n * @param bias Bias, rank-3, of shape `[outDepth]`.\n * @param strides\n * @param padding Padding mode.\n * @param dataFormat Data format.\n * @param dilationRate\n * @returns The result of the 1D convolution.\n * @throws ValueError, if `x`, `kernel` or `bias` is not of the correct rank.\n */\nexport function conv1dWithBias(x, kernel, bias, strides = 1, padding = 'valid', dataFormat, dilationRate = 1) {\n    return tidy(() => {\n        if (dataFormat == null) {\n            dataFormat = imageDataFormat();\n        }\n        checkDataFormat(dataFormat);\n        // Check the ranks of x, kernel and bias.\n        if (x.shape.length !== 3) {\n            throw new ValueError(`The input of a conv1dWithBias operation should be 3, but is ` +\n                `${x.shape.length} instead.`);\n        }\n        if (kernel.shape.length !== 3) {\n            throw new ValueError(`The kernel for a conv1dWithBias operation should be 3, but is ` +\n                `${kernel.shape.length} instead`);\n        }\n        if (bias != null && bias.shape.length !== 1) {\n            throw new ValueError(`The bias for a conv1dWithBias operation should be 1, but is ` +\n                `${kernel.shape.length} instead`);\n        }\n        // TODO(cais): Support CAUSAL padding mode.\n        if (dataFormat === 'channelsFirst') {\n            x = tfc.transpose(x, [0, 2, 1]); // NCW -> NWC.\n        }\n        if (padding === 'causal') {\n            throw new NotImplementedError('The support for CAUSAL padding mode in conv1dWithBias is not ' +\n                'implemented yet.');\n        }\n        let y = tfc.conv1d(x, kernel, strides, padding === 'same' ? 'same' : 'valid', 'NWC', dilationRate);\n        if (bias != null) {\n            y = K.biasAdd(y, bias);\n        }\n        return y;\n    });\n}\n/**\n * 1D-convolution.\n *\n * @param x Input tensor, rank-3, of shape `[batchSize, width, inChannels]`.\n * @param kernel Kernel, rank-3, of shape `[filterWidth, inDepth, outDepth]`.s\n * @param strides\n * @param padding Padding mode.\n * @param dataFormat Data format.\n * @param dilationRate\n * @returns The result of the 1D convolution.\n * @throws ValueError, if `x`, `kernel` or `bias` is not of the correct rank.\n */\nexport function conv1d(x, kernel, strides = 1, padding = 'valid', dataFormat, dilationRate = 1) {\n    return tidy(() => {\n        checkDataFormat(dataFormat);\n        return conv1dWithBias(x, kernel, null, strides, padding, dataFormat, dilationRate);\n    });\n}\n/**\n * 2D Convolution\n * @param x\n * @param kernel kernel of the convolution.\n * @param strides strides array.\n * @param padding padding mode. Default to 'valid'.\n * @param dataFormat data format. Defaults to 'channelsLast'.\n * @param dilationRate dilation rate array.\n * @returns Result of the 2D pooling.\n */\nexport function conv2d(x, kernel, strides = [1, 1], padding = 'valid', dataFormat, dilationRate) {\n    return tidy(() => {\n        checkDataFormat(dataFormat);\n        return conv2dWithBiasActivation(x, kernel, null, strides, padding, dataFormat, dilationRate);\n    });\n}\n/**\n * 2D Convolution with an added bias and optional activation.\n * Note: This function does not exist in the Python Keras Backend. This function\n * is exactly the same as `conv2d`, except the added `bias`.\n */\nexport function conv2dWithBiasActivation(x, kernel, bias, strides = [1, 1], padding = 'valid', dataFormat, dilationRate, activation = null) {\n    return tidy(() => {\n        if (dataFormat == null) {\n            dataFormat = imageDataFormat();\n        }\n        checkDataFormat(dataFormat);\n        if (x.rank !== 3 && x.rank !== 4) {\n            throw new ValueError(`conv2dWithBiasActivation expects input to be of rank 3 or 4, ` +\n                `but received ${x.rank}.`);\n        }\n        if (kernel.rank !== 3 && kernel.rank !== 4) {\n            throw new ValueError(`conv2dWithBiasActivation expects kernel to be of rank 3 or 4, ` +\n                `but received ${x.rank}.`);\n        }\n        let y = preprocessConv2DInput(x, dataFormat);\n        if (padding === 'causal') {\n            throw new NotImplementedError('The support for CAUSAL padding mode in conv1dWithBias is not ' +\n                'implemented yet.');\n        }\n        y = tfc.fused.conv2d({\n            x: y,\n            filter: kernel,\n            strides: strides,\n            pad: padding === 'same' ? 'same' : 'valid',\n            dilations: dilationRate,\n            dataFormat: 'NHWC',\n            bias,\n            activation\n        });\n        if (dataFormat === 'channelsFirst') {\n            y = tfc.transpose(y, [0, 3, 1, 2]);\n        }\n        return y;\n    });\n}\n/**\n * 3D Convolution.\n * @param x\n * @param kernel kernel of the convolution.\n * @param strides strides array.\n * @param padding padding mode. Default to 'valid'.\n * @param dataFormat data format. Defaults to 'channelsLast'.\n * @param dilationRate dilation rate array.\n * @returns Result of the 3D convolution.\n */\nexport function conv3d(x, kernel, strides = [1, 1, 1], padding = 'valid', dataFormat, dilationRate) {\n    return tidy(() => {\n        checkDataFormat(dataFormat);\n        return conv3dWithBias(x, kernel, null, strides, padding, dataFormat, dilationRate);\n    });\n}\n/**\n * 3D Convolution with an added bias.\n * Note: This function does not exist in the Python Keras Backend. This function\n * is exactly the same as `conv3d`, except the added `bias`.\n */\nexport function conv3dWithBias(x, kernel, bias, strides = [1, 1, 1], padding = 'valid', dataFormat, dilationRate) {\n    return tidy(() => {\n        if (dataFormat == null) {\n            dataFormat = imageDataFormat();\n        }\n        checkDataFormat(dataFormat);\n        if (x.rank !== 4 && x.rank !== 5) {\n            throw new ValueError(`conv3dWithBias expects input to be of rank 4 or 5, but received ` +\n                `${x.rank}.`);\n        }\n        if (kernel.rank !== 4 && kernel.rank !== 5) {\n            throw new ValueError(`conv3dWithBias expects kernel to be of rank 4 or 5, but received ` +\n                `${x.rank}.`);\n        }\n        let y = preprocessConv3DInput(x, dataFormat);\n        if (padding === 'causal') {\n            throw new NotImplementedError('The support for CAUSAL padding mode in conv3dWithBias is not ' +\n                'implemented yet.');\n        }\n        y = tfc.conv3d(y, kernel, strides, padding === 'same' ? 'same' : 'valid', 'NDHWC', dilationRate);\n        if (bias != null) {\n            y = K.biasAdd(y, bias);\n        }\n        if (dataFormat === 'channelsFirst') {\n            y = tfc.transpose(y, [0, 4, 1, 2, 3]);\n        }\n        return y;\n    });\n}\n/**\n * Abstract convolution layer.\n */\nexport class BaseConv extends Layer {\n    constructor(rank, args) {\n        super(args);\n        this.bias = null;\n        this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n        this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n        BaseConv.verifyArgs(args);\n        this.rank = rank;\n        generic_utils.assertPositiveInteger(this.rank, 'rank');\n        if (this.rank !== 1 && this.rank !== 2 && this.rank !== 3) {\n            throw new NotImplementedError(`Convolution layer for rank other than 1, 2, or 3 (${this.rank}) is ` +\n                `not implemented yet.`);\n        }\n        this.kernelSize = normalizeArray(args.kernelSize, rank, 'kernelSize');\n        this.strides = normalizeArray(args.strides == null ? 1 : args.strides, rank, 'strides');\n        this.padding = args.padding == null ? 'valid' : args.padding;\n        checkPaddingMode(this.padding);\n        this.dataFormat =\n            args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n        checkDataFormat(this.dataFormat);\n        this.activation = getActivation(args.activation);\n        this.useBias = args.useBias == null ? true : args.useBias;\n        this.biasInitializer =\n            getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n        this.biasConstraint = getConstraint(args.biasConstraint);\n        this.biasRegularizer = getRegularizer(args.biasRegularizer);\n        this.activityRegularizer = getRegularizer(args.activityRegularizer);\n        this.dilationRate = normalizeArray(args.dilationRate == null ? 1 : args.dilationRate, rank, 'dilationRate');\n        if (this.rank === 1 &&\n            (Array.isArray(this.dilationRate) && this.dilationRate.length !== 1)) {\n            throw new ValueError(`dilationRate must be a number or an array of a single number ` +\n                `for 1D convolution, but received ` +\n                `${JSON.stringify(this.dilationRate)}`);\n        }\n        else if (this.rank === 2) {\n            if (typeof this.dilationRate === 'number') {\n                this.dilationRate = [this.dilationRate, this.dilationRate];\n            }\n            else if (this.dilationRate.length !== 2) {\n                throw new ValueError(`dilationRate must be a number or array of two numbers for 2D ` +\n                    `convolution, but received ${JSON.stringify(this.dilationRate)}`);\n            }\n        }\n        else if (this.rank === 3) {\n            if (typeof this.dilationRate === 'number') {\n                this.dilationRate =\n                    [this.dilationRate, this.dilationRate, this.dilationRate];\n            }\n            else if (this.dilationRate.length !== 3) {\n                throw new ValueError(`dilationRate must be a number or array of three numbers for 3D ` +\n                    `convolution, but received ${JSON.stringify(this.dilationRate)}`);\n            }\n        }\n    }\n    static verifyArgs(args) {\n        // Check config.kernelSize type and shape.\n        generic_utils.assert('kernelSize' in args, `required key 'kernelSize' not in config`);\n        if (typeof args.kernelSize !== 'number' &&\n            !generic_utils.checkArrayTypeAndLength(args.kernelSize, 'number', 1, 3)) {\n            throw new ValueError(`BaseConv expects config.kernelSize to be number or number[] with ` +\n                `length 1, 2, or 3, but received ${JSON.stringify(args.kernelSize)}.`);\n        }\n    }\n    getConfig() {\n        const config = {\n            kernelSize: this.kernelSize,\n            strides: this.strides,\n            padding: this.padding,\n            dataFormat: this.dataFormat,\n            dilationRate: this.dilationRate,\n            activation: serializeActivation(this.activation),\n            useBias: this.useBias,\n            biasInitializer: serializeInitializer(this.biasInitializer),\n            biasRegularizer: serializeRegularizer(this.biasRegularizer),\n            activityRegularizer: serializeRegularizer(this.activityRegularizer),\n            biasConstraint: serializeConstraint(this.biasConstraint)\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/**\n * Abstract nD convolution layer.  Ancestor of convolution layers which reduce\n * across channels, i.e., Conv1D and Conv2D, but not DepthwiseConv2D.\n */\nexport class Conv extends BaseConv {\n    constructor(rank, args) {\n        super(rank, args);\n        this.kernel = null;\n        Conv.verifyArgs(args);\n        this.filters = args.filters;\n        generic_utils.assertPositiveInteger(this.filters, 'filters');\n        this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n        this.kernelConstraint = getConstraint(args.kernelConstraint);\n        this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n        if (inputShape[channelAxis] == null) {\n            throw new ValueError(`The channel dimension of the input should be defined. ` +\n                `Found ${inputShape[channelAxis]}`);\n        }\n        const inputDim = inputShape[channelAxis];\n        const kernelShape = this.kernelSize.concat([inputDim, this.filters]);\n        this.kernel = this.addWeight('kernel', kernelShape, null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n        if (this.useBias) {\n            this.bias = this.addWeight('bias', [this.filters], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n        }\n        this.inputSpec = [{ ndim: this.rank + 2, axes: { [channelAxis]: inputDim } }];\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = getExactlyOneTensor(inputs);\n            let outputs;\n            const biasValue = this.bias == null ? null : this.bias.read();\n            const fusedActivationName = generic_utils.mapActivationToFusedKernel(this.activation.getClassName());\n            if (fusedActivationName != null && this.rank === 2) {\n                outputs = conv2dWithBiasActivation(inputs, this.kernel.read(), biasValue, this.strides, this.padding, this.dataFormat, this.dilationRate, fusedActivationName);\n            }\n            else {\n                if (this.rank === 1) {\n                    outputs = conv1dWithBias(inputs, this.kernel.read(), biasValue, this.strides[0], this.padding, this.dataFormat, this.dilationRate[0]);\n                }\n                else if (this.rank === 2) {\n                    // TODO(cais): Move up to constructor.\n                    outputs = conv2dWithBiasActivation(inputs, this.kernel.read(), biasValue, this.strides, this.padding, this.dataFormat, this.dilationRate);\n                }\n                else if (this.rank === 3) {\n                    outputs = conv3dWithBias(inputs, this.kernel.read(), biasValue, this.strides, this.padding, this.dataFormat, this.dilationRate);\n                }\n                else {\n                    throw new NotImplementedError('convolutions greater than 3D are not implemented yet.');\n                }\n                if (this.activation != null) {\n                    outputs = this.activation.apply(outputs);\n                }\n            }\n            return outputs;\n        });\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const newSpace = [];\n        const space = (this.dataFormat === 'channelsLast') ?\n            inputShape.slice(1, inputShape.length - 1) :\n            inputShape.slice(2);\n        for (let i = 0; i < space.length; ++i) {\n            const newDim = convOutputLength(space[i], this.kernelSize[i], this.padding, this.strides[i], typeof this.dilationRate === 'number' ? this.dilationRate :\n                this.dilationRate[i]);\n            newSpace.push(newDim);\n        }\n        let outputShape = [inputShape[0]];\n        if (this.dataFormat === 'channelsLast') {\n            outputShape = outputShape.concat(newSpace);\n            outputShape.push(this.filters);\n        }\n        else {\n            outputShape.push(this.filters);\n            outputShape = outputShape.concat(newSpace);\n        }\n        return outputShape;\n    }\n    getConfig() {\n        const config = {\n            filters: this.filters,\n            kernelInitializer: serializeInitializer(this.kernelInitializer),\n            kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n            kernelConstraint: serializeConstraint(this.kernelConstraint)\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    static verifyArgs(args) {\n        // Check config.filters type, shape, and value.\n        if (!('filters' in args) || typeof args.filters !== 'number' ||\n            args.filters < 1) {\n            throw new ValueError(`Convolution layer expected config.filters to be a 'number' > 0 ` +\n                `but got ${JSON.stringify(args.filters)}`);\n        }\n    }\n}\nexport class Conv2D extends Conv {\n    constructor(args) {\n        super(2, args);\n        Conv2D.verifyArgs(args);\n    }\n    getConfig() {\n        const config = super.getConfig();\n        delete config['rank'];\n        return config;\n    }\n    static verifyArgs(args) {\n        // config.kernelSize must be a number or array of numbers.\n        if ((typeof args.kernelSize !== 'number') &&\n            !generic_utils.checkArrayTypeAndLength(args.kernelSize, 'number', 1, 2)) {\n            throw new ValueError(`Conv2D expects config.kernelSize to be number or number[] with ` +\n                `length 1 or 2, but received ${JSON.stringify(args.kernelSize)}.`);\n        }\n    }\n}\n/** @nocollapse */\nConv2D.className = 'Conv2D';\nserialization.registerClass(Conv2D);\nexport class Conv3D extends Conv {\n    constructor(args) {\n        super(3, args);\n        Conv3D.verifyArgs(args);\n    }\n    getConfig() {\n        const config = super.getConfig();\n        delete config['rank'];\n        return config;\n    }\n    static verifyArgs(args) {\n        // config.kernelSize must be a number or array of numbers.\n        if (typeof args.kernelSize !== 'number') {\n            if (!(Array.isArray(args.kernelSize) &&\n                (args.kernelSize.length === 1 || args.kernelSize.length === 3))) {\n                throw new ValueError(`Conv3D expects config.kernelSize to be number or` +\n                    ` [number, number, number], but received ${JSON.stringify(args.kernelSize)}.`);\n            }\n        }\n    }\n}\n/** @nocollapse */\nConv3D.className = 'Conv3D';\nserialization.registerClass(Conv3D);\nexport class Conv2DTranspose extends Conv2D {\n    constructor(args) {\n        super(args);\n        this.inputSpec = [new InputSpec({ ndim: 4 })];\n        if (this.padding !== 'same' && this.padding !== 'valid') {\n            throw new ValueError(`Conv2DTranspose currently supports only padding modes 'same' ` +\n                `and 'valid', but received padding mode ${this.padding}`);\n        }\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        if (inputShape.length !== 4) {\n            throw new ValueError('Input should have rank 4; Received input shape: ' +\n                JSON.stringify(inputShape));\n        }\n        const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n        if (inputShape[channelAxis] == null) {\n            throw new ValueError('The channel dimension of the inputs should be defined. ' +\n                'Found `None`.');\n        }\n        const inputDim = inputShape[channelAxis];\n        const kernelShape = this.kernelSize.concat([this.filters, inputDim]);\n        this.kernel = this.addWeight('kernel', kernelShape, 'float32', this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n        if (this.useBias) {\n            this.bias = this.addWeight('bias', [this.filters], 'float32', this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n        }\n        // Set input spec.\n        this.inputSpec =\n            [new InputSpec({ ndim: 4, axes: { [channelAxis]: inputDim } })];\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tfc.tidy(() => {\n            let input = getExactlyOneTensor(inputs);\n            if (input.shape.length !== 4) {\n                throw new ValueError(`Conv2DTranspose.call() expects input tensor to be rank-4, but ` +\n                    `received a tensor of rank-${input.shape.length}`);\n            }\n            const inputShape = input.shape;\n            const batchSize = inputShape[0];\n            let hAxis;\n            let wAxis;\n            if (this.dataFormat === 'channelsFirst') {\n                hAxis = 2;\n                wAxis = 3;\n            }\n            else {\n                hAxis = 1;\n                wAxis = 2;\n            }\n            const height = inputShape[hAxis];\n            const width = inputShape[wAxis];\n            const kernelH = this.kernelSize[0];\n            const kernelW = this.kernelSize[1];\n            const strideH = this.strides[0];\n            const strideW = this.strides[1];\n            // Infer the dynamic output shape.\n            const outHeight = deconvLength(height, strideH, kernelH, this.padding);\n            const outWidth = deconvLength(width, strideW, kernelW, this.padding);\n            // Porting Note: We don't branch based on `this.dataFormat` here,\n            // because\n            //   the tjfs-core function `conv2dTranspose` called below always\n            //   assumes channelsLast.\n            const outputShape = [batchSize, outHeight, outWidth, this.filters];\n            if (this.dataFormat !== 'channelsLast') {\n                input = tfc.transpose(input, [0, 2, 3, 1]);\n            }\n            let outputs = tfc.conv2dTranspose(input, this.kernel.read(), outputShape, this.strides, this.padding);\n            if (this.dataFormat !== 'channelsLast') {\n                outputs = tfc.transpose(outputs, [0, 3, 1, 2]);\n            }\n            if (this.bias != null) {\n                outputs =\n                    K.biasAdd(outputs, this.bias.read(), this.dataFormat);\n            }\n            if (this.activation != null) {\n                outputs = this.activation.apply(outputs);\n            }\n            return outputs;\n        });\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const outputShape = inputShape.slice();\n        let channelAxis;\n        let heightAxis;\n        let widthAxis;\n        if (this.dataFormat === 'channelsFirst') {\n            channelAxis = 1;\n            heightAxis = 2;\n            widthAxis = 3;\n        }\n        else {\n            channelAxis = 3;\n            heightAxis = 1;\n            widthAxis = 2;\n        }\n        const kernelH = this.kernelSize[0];\n        const kernelW = this.kernelSize[1];\n        const strideH = this.strides[0];\n        const strideW = this.strides[1];\n        outputShape[channelAxis] = this.filters;\n        outputShape[heightAxis] =\n            deconvLength(outputShape[heightAxis], strideH, kernelH, this.padding);\n        outputShape[widthAxis] =\n            deconvLength(outputShape[widthAxis], strideW, kernelW, this.padding);\n        return outputShape;\n    }\n    getConfig() {\n        const config = super.getConfig();\n        delete config['dilationRate'];\n        return config;\n    }\n}\n/** @nocollapse */\nConv2DTranspose.className = 'Conv2DTranspose';\nserialization.registerClass(Conv2DTranspose);\nexport class Conv3DTranspose extends Conv3D {\n    constructor(args) {\n        super(args);\n        this.inputSpec = [new InputSpec({ ndim: 5 })];\n        if (this.padding !== 'same' && this.padding !== 'valid') {\n            throw new ValueError(`Conv3DTranspose currently supports only padding modes 'same' ` +\n                `and 'valid', but received padding mode ${this.padding}`);\n        }\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        if (inputShape.length !== 5) {\n            throw new ValueError('Input should have rank 5; Received input shape: ' +\n                JSON.stringify(inputShape));\n        }\n        const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n        if (inputShape[channelAxis] == null) {\n            throw new ValueError('The channel dimension of the inputs should be defined. ' +\n                'Found `None`.');\n        }\n        const inputDim = inputShape[channelAxis];\n        const kernelShape = this.kernelSize.concat([this.filters, inputDim]);\n        this.kernel = this.addWeight('kernel', kernelShape, 'float32', this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n        if (this.useBias) {\n            this.bias = this.addWeight('bias', [this.filters], 'float32', this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n        }\n        // Set input spec.\n        this.inputSpec =\n            [new InputSpec({ ndim: 5, axes: { [channelAxis]: inputDim } })];\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tfc.tidy(() => {\n            let input = getExactlyOneTensor(inputs);\n            if (input.shape.length !== 5) {\n                throw new ValueError(`Conv3DTranspose.call() expects input tensor to be rank-4, but ` +\n                    `received a tensor of rank-${input.shape.length}`);\n            }\n            const inputShape = input.shape;\n            const batchSize = inputShape[0];\n            let hAxis;\n            let wAxis;\n            let dAxis;\n            if (this.dataFormat === 'channelsFirst') {\n                dAxis = 2;\n                hAxis = 3;\n                wAxis = 4;\n            }\n            else {\n                dAxis = 1;\n                hAxis = 2;\n                wAxis = 3;\n            }\n            const depth = inputShape[dAxis];\n            const height = inputShape[hAxis];\n            const width = inputShape[wAxis];\n            const kernelD = this.kernelSize[0];\n            const kernelH = this.kernelSize[1];\n            const kernelW = this.kernelSize[2];\n            const strideD = this.strides[0];\n            const strideH = this.strides[1];\n            const strideW = this.strides[2];\n            // Infer the dynamic output shape.\n            const outDepth = deconvLength(depth, strideD, kernelD, this.padding);\n            const outHeight = deconvLength(height, strideH, kernelH, this.padding);\n            const outWidth = deconvLength(width, strideW, kernelW, this.padding);\n            // Same as `conv2dTranspose`. We always assumes channelsLast.\n            const outputShape = [batchSize, outDepth, outHeight, outWidth, this.filters];\n            if (this.dataFormat !== 'channelsLast') {\n                input = tfc.transpose(input, [0, 2, 3, 4, 1]);\n            }\n            let outputs = tfc.conv3dTranspose(input, this.kernel.read(), outputShape, this.strides, this.padding);\n            if (this.dataFormat !== 'channelsLast') {\n                outputs = tfc.transpose(outputs, [0, 4, 1, 2, 3]);\n            }\n            if (this.bias !== null) {\n                outputs =\n                    K.biasAdd(outputs, this.bias.read(), this.dataFormat);\n            }\n            if (this.activation !== null) {\n                outputs = this.activation.apply(outputs);\n            }\n            return outputs;\n        });\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const outputShape = inputShape.slice();\n        let channelAxis;\n        let depthAxis;\n        let heightAxis;\n        let widthAxis;\n        if (this.dataFormat === 'channelsFirst') {\n            channelAxis = 1;\n            depthAxis = 2;\n            heightAxis = 3;\n            widthAxis = 4;\n        }\n        else {\n            channelAxis = 4;\n            depthAxis = 1;\n            heightAxis = 2;\n            widthAxis = 3;\n        }\n        const kernelD = this.kernelSize[0];\n        const kernelH = this.kernelSize[1];\n        const kernelW = this.kernelSize[2];\n        const strideD = this.strides[0];\n        const strideH = this.strides[1];\n        const strideW = this.strides[2];\n        outputShape[channelAxis] = this.filters;\n        outputShape[depthAxis] =\n            deconvLength(outputShape[depthAxis], strideD, kernelD, this.padding);\n        outputShape[heightAxis] =\n            deconvLength(outputShape[heightAxis], strideH, kernelH, this.padding);\n        outputShape[widthAxis] =\n            deconvLength(outputShape[widthAxis], strideW, kernelW, this.padding);\n        return outputShape;\n    }\n    getConfig() {\n        const config = super.getConfig();\n        delete config['dilationRate'];\n        return config;\n    }\n}\n/** @nocollapse */\nConv3DTranspose.className = 'Conv3DTranspose';\nserialization.registerClass(Conv3DTranspose);\nexport class SeparableConv extends Conv {\n    constructor(rank, config) {\n        super(rank, config);\n        this.DEFAULT_DEPTHWISE_INITIALIZER = 'glorotUniform';\n        this.DEFAULT_POINTWISE_INITIALIZER = 'glorotUniform';\n        this.depthwiseKernel = null;\n        this.pointwiseKernel = null;\n        if (config.filters == null) {\n            throw new ValueError('The `filters` configuration field is required by SeparableConv, ' +\n                'but is unspecified.');\n        }\n        if (config.kernelInitializer != null || config.kernelRegularizer != null ||\n            config.kernelConstraint != null) {\n            throw new ValueError('Fields kernelInitializer, kernelRegularizer and kernelConstraint ' +\n                'are invalid for SeparableConv2D. Use depthwiseInitializer, ' +\n                'depthwiseRegularizer, depthwiseConstraint, pointwiseInitializer, ' +\n                'pointwiseRegularizer and pointwiseConstraint instead.');\n        }\n        if (config.padding != null && config.padding !== 'same' &&\n            config.padding !== 'valid') {\n            throw new ValueError(`SeparableConv${this.rank}D supports only padding modes: ` +\n                `'same' and 'valid', but received ${JSON.stringify(config.padding)}`);\n        }\n        this.depthMultiplier =\n            config.depthMultiplier == null ? 1 : config.depthMultiplier;\n        this.depthwiseInitializer = getInitializer(config.depthwiseInitializer || this.DEFAULT_DEPTHWISE_INITIALIZER);\n        this.depthwiseRegularizer = getRegularizer(config.depthwiseRegularizer);\n        this.depthwiseConstraint = getConstraint(config.depthwiseConstraint);\n        this.pointwiseInitializer = getInitializer(config.depthwiseInitializer || this.DEFAULT_POINTWISE_INITIALIZER);\n        this.pointwiseRegularizer = getRegularizer(config.pointwiseRegularizer);\n        this.pointwiseConstraint = getConstraint(config.pointwiseConstraint);\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        if (inputShape.length < this.rank + 2) {\n            throw new ValueError(`Inputs to SeparableConv${this.rank}D should have rank ` +\n                `${this.rank + 2}, but received input shape: ` +\n                `${JSON.stringify(inputShape)}`);\n        }\n        const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n        if (inputShape[channelAxis] == null || inputShape[channelAxis] < 0) {\n            throw new ValueError(`The channel dimension of the inputs should be defined, ` +\n                `but found ${JSON.stringify(inputShape[channelAxis])}`);\n        }\n        const inputDim = inputShape[channelAxis];\n        const depthwiseKernelShape = this.kernelSize.concat([inputDim, this.depthMultiplier]);\n        const pointwiseKernelShape = [];\n        for (let i = 0; i < this.rank; ++i) {\n            pointwiseKernelShape.push(1);\n        }\n        pointwiseKernelShape.push(inputDim * this.depthMultiplier, this.filters);\n        const trainable = true;\n        this.depthwiseKernel = this.addWeight('depthwise_kernel', depthwiseKernelShape, 'float32', this.depthwiseInitializer, this.depthwiseRegularizer, trainable, this.depthwiseConstraint);\n        this.pointwiseKernel = this.addWeight('pointwise_kernel', pointwiseKernelShape, 'float32', this.pointwiseInitializer, this.pointwiseRegularizer, trainable, this.pointwiseConstraint);\n        if (this.useBias) {\n            this.bias = this.addWeight('bias', [this.filters], 'float32', this.biasInitializer, this.biasRegularizer, trainable, this.biasConstraint);\n        }\n        else {\n            this.bias = null;\n        }\n        this.inputSpec =\n            [new InputSpec({ ndim: this.rank + 2, axes: { [channelAxis]: inputDim } })];\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = getExactlyOneTensor(inputs);\n            let output;\n            if (this.rank === 1) {\n                throw new NotImplementedError('1D separable convolution is not implemented yet.');\n            }\n            else if (this.rank === 2) {\n                if (this.dataFormat === 'channelsFirst') {\n                    inputs = tfc.transpose(inputs, [0, 2, 3, 1]); // NCHW -> NHWC.\n                }\n                output = tfc.separableConv2d(inputs, this.depthwiseKernel.read(), this.pointwiseKernel.read(), this.strides, this.padding, this.dilationRate, 'NHWC');\n            }\n            if (this.useBias) {\n                output = K.biasAdd(output, this.bias.read(), this.dataFormat);\n            }\n            if (this.activation != null) {\n                output = this.activation.apply(output);\n            }\n            if (this.dataFormat === 'channelsFirst') {\n                output = tfc.transpose(output, [0, 3, 1, 2]); // NHWC -> NCHW.\n            }\n            return output;\n        });\n    }\n    getConfig() {\n        const config = super.getConfig();\n        delete config['rank'];\n        delete config['kernelInitializer'];\n        delete config['kernelRegularizer'];\n        delete config['kernelConstraint'];\n        config['depthwiseInitializer'] =\n            serializeInitializer(this.depthwiseInitializer);\n        config['pointwiseInitializer'] =\n            serializeInitializer(this.pointwiseInitializer);\n        config['depthwiseRegularizer'] =\n            serializeRegularizer(this.depthwiseRegularizer);\n        config['pointwiseRegularizer'] =\n            serializeRegularizer(this.pointwiseRegularizer);\n        config['depthwiseConstraint'] =\n            serializeConstraint(this.depthwiseConstraint);\n        config['pointwiseConstraint'] =\n            serializeConstraint(this.pointwiseConstraint);\n        return config;\n    }\n}\n/** @nocollapse */\nSeparableConv.className = 'SeparableConv';\nexport class SeparableConv2D extends SeparableConv {\n    constructor(args) {\n        super(2, args);\n    }\n}\n/** @nocollapse */\nSeparableConv2D.className = 'SeparableConv2D';\nserialization.registerClass(SeparableConv2D);\nexport class Conv1D extends Conv {\n    constructor(args) {\n        super(1, args);\n        Conv1D.verifyArgs(args);\n        this.inputSpec = [{ ndim: 3 }];\n    }\n    getConfig() {\n        const config = super.getConfig();\n        delete config['rank'];\n        delete config['dataFormat'];\n        return config;\n    }\n    static verifyArgs(args) {\n        // config.kernelSize must be a number or array of numbers.\n        if (typeof args.kernelSize !== 'number' &&\n            !generic_utils.checkArrayTypeAndLength(args.kernelSize, 'number', 1, 1)) {\n            throw new ValueError(`Conv1D expects config.kernelSize to be number or number[] with ` +\n                `length 1, but received ${JSON.stringify(args.kernelSize)}.`);\n        }\n    }\n}\n/** @nocollapse */\nConv1D.className = 'Conv1D';\nserialization.registerClass(Conv1D);\nexport class Cropping2D extends Layer {\n    constructor(args) {\n        super(args);\n        if (typeof args.cropping === 'number') {\n            this.cropping =\n                [[args.cropping, args.cropping], [args.cropping, args.cropping]];\n        }\n        else if (typeof args.cropping[0] === 'number') {\n            this.cropping = [\n                [args.cropping[0], args.cropping[0]],\n                [args.cropping[1], args.cropping[1]]\n            ];\n        }\n        else {\n            this.cropping = args.cropping;\n        }\n        this.dataFormat =\n            args.dataFormat === undefined ? 'channelsLast' : args.dataFormat;\n        this.inputSpec = [{ ndim: 4 }];\n    }\n    computeOutputShape(inputShape) {\n        if (this.dataFormat === 'channelsFirst') {\n            return [\n                inputShape[0], inputShape[1],\n                inputShape[2] - this.cropping[0][0] - this.cropping[0][1],\n                inputShape[3] - this.cropping[1][0] - this.cropping[1][1]\n            ];\n        }\n        else {\n            return [\n                inputShape[0],\n                inputShape[1] - this.cropping[0][0] - this.cropping[0][1],\n                inputShape[2] - this.cropping[1][0] - this.cropping[1][1], inputShape[3]\n            ];\n        }\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = getExactlyOneTensor(inputs);\n            if (this.dataFormat === 'channelsLast') {\n                const hSliced = K.sliceAlongAxis(inputs, this.cropping[0][0], inputs.shape[1] - this.cropping[0][0] - this.cropping[0][1], 2);\n                return K.sliceAlongAxis(hSliced, this.cropping[1][0], inputs.shape[2] - this.cropping[1][1] - this.cropping[1][0], 3);\n            }\n            else {\n                const hSliced = K.sliceAlongAxis(inputs, this.cropping[0][0], inputs.shape[2] - this.cropping[0][0] - this.cropping[0][1], 3);\n                return K.sliceAlongAxis(hSliced, this.cropping[1][0], inputs.shape[3] - this.cropping[1][1] - this.cropping[1][0], 4);\n            }\n        });\n    }\n    getConfig() {\n        const config = { cropping: this.cropping, dataFormat: this.dataFormat };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nCropping2D.className = 'Cropping2D';\nserialization.registerClass(Cropping2D);\nexport class UpSampling2D extends Layer {\n    constructor(args) {\n        super(args);\n        this.DEFAULT_SIZE = [2, 2];\n        this.inputSpec = [{ ndim: 4 }];\n        this.size = args.size == null ? this.DEFAULT_SIZE : args.size;\n        this.dataFormat =\n            args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n        checkDataFormat(this.dataFormat);\n        this.interpolation =\n            args.interpolation == null ? 'nearest' : args.interpolation;\n        checkInterpolationFormat(this.interpolation);\n    }\n    computeOutputShape(inputShape) {\n        if (this.dataFormat === 'channelsFirst') {\n            const height = inputShape[2] == null ? null : this.size[0] * inputShape[2];\n            const width = inputShape[3] == null ? null : this.size[1] * inputShape[3];\n            return [inputShape[0], inputShape[1], height, width];\n        }\n        else {\n            const height = inputShape[1] == null ? null : this.size[0] * inputShape[1];\n            const width = inputShape[2] == null ? null : this.size[1] * inputShape[2];\n            return [inputShape[0], height, width, inputShape[3]];\n        }\n    }\n    call(inputs, kwargs) {\n        return tfc.tidy(() => {\n            let input = getExactlyOneTensor(inputs);\n            const inputShape = input.shape;\n            if (this.dataFormat === 'channelsFirst') {\n                input = tfc.transpose(input, [0, 2, 3, 1]);\n                const height = this.size[0] * inputShape[2];\n                const width = this.size[1] * inputShape[3];\n                const resized = this.interpolation === 'nearest' ?\n                    tfc.image.resizeNearestNeighbor(input, [height, width]) :\n                    tfc.image.resizeBilinear(input, [height, width]);\n                return tfc.transpose(resized, [0, 3, 1, 2]);\n            }\n            else {\n                const height = this.size[0] * inputShape[1];\n                const width = this.size[1] * inputShape[2];\n                return this.interpolation === 'nearest' ?\n                    tfc.image.resizeNearestNeighbor(input, [height, width]) :\n                    tfc.image.resizeBilinear(input, [height, width]);\n            }\n        });\n    }\n    getConfig() {\n        const config = {\n            size: this.size,\n            dataFormat: this.dataFormat,\n            interpolation: this.interpolation\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nUpSampling2D.className = 'UpSampling2D';\nserialization.registerClass(UpSampling2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb25hbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvY29udm9sdXRpb25hbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQVEsYUFBYSxFQUE0RCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzSCxPQUFPLEVBQWEsYUFBYSxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxDQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLGVBQWUsRUFBRSx3QkFBd0IsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUN0RixPQUFPLEVBQW1DLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBR3pHLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxFQUFDLGdCQUFnQixFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNuRixPQUFPLEtBQUssYUFBYSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHNCQUFzQixD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QUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7YUFDdEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxNQUFNLEdBQUc7WUFDWCxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDZixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO1NBQ3BDLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7QUFsRUQsa0JBQWtCO0FBQ1gsc0JBQVMsR0FBRyxjQUFjLENBQUM7QUFtRXBDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBDb252b2x1dGlvbmFsIExheWVyc1xuICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtmdXNlZCwgc2VyaWFsaXphdGlvbiwgVGVuc29yLCBUZW5zb3IxRCwgVGVuc29yMkQsIFRlbnNvcjNELCBUZW5zb3I0RCwgVGVuc29yNUQsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QWN0aXZhdGlvbiwgZ2V0QWN0aXZhdGlvbiwgc2VyaWFsaXplQWN0aXZhdGlvbn0gZnJvbSAnLi4vYWN0aXZhdGlvbnMnO1xuaW1wb3J0IHtpbWFnZURhdGFGb3JtYXR9IGZyb20gJy4uL2JhY2tlbmQvY29tbW9uJztcbmltcG9ydCAqIGFzIEsgZnJvbSAnLi4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtjaGVja0RhdGFGb3JtYXQsIGNoZWNrSW50ZXJwb2xhdGlvbkZvcm1hdCwgY2hlY2tQYWRkaW5nTW9kZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7Q29uc3RyYWludCwgQ29uc3RyYWludElkZW50aWZpZXIsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtnZXRJbml0aWFsaXplciwgSW5pdGlhbGl6ZXIsIEluaXRpYWxpemVySWRlbnRpZmllciwgc2VyaWFsaXplSW5pdGlhbGl6ZXJ9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge0FjdGl2YXRpb25JZGVudGlmaWVyfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvYWN0aXZhdGlvbl9jb25maWcnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBJbnRlcnBvbGF0aW9uRm9ybWF0LCBQYWRkaW5nTW9kZSwgU2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtnZXRSZWd1bGFyaXplciwgUmVndWxhcml6ZXIsIFJlZ3VsYXJpemVySWRlbnRpZmllciwgc2VyaWFsaXplUmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtjb252T3V0cHV0TGVuZ3RoLCBkZWNvbnZMZW5ndGgsIG5vcm1hbGl6ZUFycmF5fSBmcm9tICcuLi91dGlscy9jb252X3V0aWxzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZSwgZ2V0RXhhY3RseU9uZVRlbnNvcn0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuaW1wb3J0IHtMYXllclZhcmlhYmxlfSBmcm9tICcuLi92YXJpYWJsZXMnO1xuXG4vKipcbiAqIFRyYW5zcG9zZSBhbmQgY2FzdCB0aGUgaW5wdXQgYmVmb3JlIHRoZSBjb252MmQuXG4gKiBAcGFyYW0geCBJbnB1dCBpbWFnZSB0ZW5zb3IuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcHJvY2Vzc0NvbnYyRElucHV0KFxuICAgIHg6IFRlbnNvciwgZGF0YUZvcm1hdDogRGF0YUZvcm1hdCk6IFRlbnNvciB7XG4gIC8vIFRPRE8oY2Fpcyk6IENhc3QgdHlwZSB0byBmbG9hdDMyIGlmIG5vdC5cbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICByZXR1cm4gdGZjLnRyYW5zcG9zZSh4LCBbMCwgMiwgMywgMV0pOyAgLy8gTkNIVyAtPiBOSFdDLlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIFRyYW5zcG9zZSBhbmQgY2FzdCB0aGUgaW5wdXQgYmVmb3JlIHRoZSBjb252M2QuXG4gKiBAcGFyYW0geCBJbnB1dCBpbWFnZSB0ZW5zb3IuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcHJlcHJvY2Vzc0NvbnYzRElucHV0KFxuICAgIHg6IFRlbnNvciwgZGF0YUZvcm1hdDogRGF0YUZvcm1hdCk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgcmV0dXJuIHRmYy50cmFuc3Bvc2UoeCwgWzAsIDIsIDMsIDQsIDFdKTsgIC8vIE5DREhXIC0+IE5ESFdDLlxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xufVxuXG4vKipcbiAqIDFELWNvbnZvbHV0aW9uIHdpdGggYmlhcyBhZGRlZC5cbiAqXG4gKiBQb3J0aW5nIE5vdGU6IFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZXhpc3QgaW4gdGhlIFB5dGhvbiBLZXJhcyBiYWNrZW5kLlxuICogICBJdCBpcyBleGFjdGx5IHRoZSBzYW1lIGFzIGBjb252MmRgLCBleGNlcHQgdGhlIGFkZGVkIGBiaWFzYC5cbiAqXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IsIHJhbmstMywgb2Ygc2hhcGUgYFtiYXRjaFNpemUsIHdpZHRoLCBpbkNoYW5uZWxzXWAuXG4gKiBAcGFyYW0ga2VybmVsIEtlcm5lbCwgcmFuay0zLCBvZiBzaGFwZSBgW2ZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF1gLlxuICogQHBhcmFtIGJpYXMgQmlhcywgcmFuay0zLCBvZiBzaGFwZSBgW291dERlcHRoXWAuXG4gKiBAcGFyYW0gc3RyaWRlc1xuICogQHBhcmFtIHBhZGRpbmcgUGFkZGluZyBtb2RlLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgRGF0YSBmb3JtYXQuXG4gKiBAcGFyYW0gZGlsYXRpb25SYXRlXG4gKiBAcmV0dXJucyBUaGUgcmVzdWx0IG9mIHRoZSAxRCBjb252b2x1dGlvbi5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvciwgaWYgYHhgLCBga2VybmVsYCBvciBgYmlhc2AgaXMgbm90IG9mIHRoZSBjb3JyZWN0IHJhbmsuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252MWRXaXRoQmlhcyhcbiAgICB4OiBUZW5zb3IsIGtlcm5lbDogVGVuc29yLCBiaWFzOiBUZW5zb3IsIHN0cmlkZXMgPSAxLCBwYWRkaW5nID0gJ3ZhbGlkJyxcbiAgICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCwgZGlsYXRpb25SYXRlID0gMSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICAvLyBDaGVjayB0aGUgcmFua3Mgb2YgeCwga2VybmVsIGFuZCBiaWFzLlxuICAgIGlmICh4LnNoYXBlLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBpbnB1dCBvZiBhIGNvbnYxZFdpdGhCaWFzIG9wZXJhdGlvbiBzaG91bGQgYmUgMywgYnV0IGlzIGAgK1xuICAgICAgICAgIGAke3guc2hhcGUubGVuZ3RofSBpbnN0ZWFkLmApO1xuICAgIH1cbiAgICBpZiAoa2VybmVsLnNoYXBlLmxlbmd0aCAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBrZXJuZWwgZm9yIGEgY29udjFkV2l0aEJpYXMgb3BlcmF0aW9uIHNob3VsZCBiZSAzLCBidXQgaXMgYCArXG4gICAgICAgICAgYCR7a2VybmVsLnNoYXBlLmxlbmd0aH0gaW5zdGVhZGApO1xuICAgIH1cbiAgICBpZiAoYmlhcyAhPSBudWxsICYmIGJpYXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVGhlIGJpYXMgZm9yIGEgY29udjFkV2l0aEJpYXMgb3BlcmF0aW9uIHNob3VsZCBiZSAxLCBidXQgaXMgYCArXG4gICAgICAgICAgYCR7a2VybmVsLnNoYXBlLmxlbmd0aH0gaW5zdGVhZGApO1xuICAgIH1cbiAgICAvLyBUT0RPKGNhaXMpOiBTdXBwb3J0IENBVVNBTCBwYWRkaW5nIG1vZGUuXG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgeCA9IHRmYy50cmFuc3Bvc2UoeCwgWzAsIDIsIDFdKTsgIC8vIE5DVyAtPiBOV0MuXG4gICAgfVxuICAgIGlmIChwYWRkaW5nID09PSAnY2F1c2FsJykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ1RoZSBzdXBwb3J0IGZvciBDQVVTQUwgcGFkZGluZyBtb2RlIGluIGNvbnYxZFdpdGhCaWFzIGlzIG5vdCAnICtcbiAgICAgICAgICAnaW1wbGVtZW50ZWQgeWV0LicpO1xuICAgIH1cbiAgICBsZXQgeTogVGVuc29yID0gdGZjLmNvbnYxZChcbiAgICAgICAgeCBhcyBUZW5zb3IyRCB8IFRlbnNvcjNELCBrZXJuZWwgYXMgVGVuc29yM0QsIHN0cmlkZXMsXG4gICAgICAgIHBhZGRpbmcgPT09ICdzYW1lJyA/ICdzYW1lJyA6ICd2YWxpZCcsICdOV0MnLCBkaWxhdGlvblJhdGUpO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgIHkgPSBLLmJpYXNBZGQoeSwgYmlhcyk7XG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuLyoqXG4gKiAxRC1jb252b2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IsIHJhbmstMywgb2Ygc2hhcGUgYFtiYXRjaFNpemUsIHdpZHRoLCBpbkNoYW5uZWxzXWAuXG4gKiBAcGFyYW0ga2VybmVsIEtlcm5lbCwgcmFuay0zLCBvZiBzaGFwZSBgW2ZpbHRlcldpZHRoLCBpbkRlcHRoLCBvdXREZXB0aF1gLnNcbiAqIEBwYXJhbSBzdHJpZGVzXG4gKiBAcGFyYW0gcGFkZGluZyBQYWRkaW5nIG1vZGUuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBEYXRhIGZvcm1hdC5cbiAqIEBwYXJhbSBkaWxhdGlvblJhdGVcbiAqIEByZXR1cm5zIFRoZSByZXN1bHQgb2YgdGhlIDFEIGNvbnZvbHV0aW9uLlxuICogQHRocm93cyBWYWx1ZUVycm9yLCBpZiBgeGAsIGBrZXJuZWxgIG9yIGBiaWFzYCBpcyBub3Qgb2YgdGhlIGNvcnJlY3QgcmFuay5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYxZChcbiAgICB4OiBUZW5zb3IsIGtlcm5lbDogVGVuc29yLCBzdHJpZGVzID0gMSwgcGFkZGluZyA9ICd2YWxpZCcsXG4gICAgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQsIGRpbGF0aW9uUmF0ZSA9IDEpOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY2hlY2tEYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIHJldHVybiBjb252MWRXaXRoQmlhcyhcbiAgICAgICAgeCwga2VybmVsLCBudWxsLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCBkaWxhdGlvblJhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiAyRCBDb252b2x1dGlvblxuICogQHBhcmFtIHhcbiAqIEBwYXJhbSBrZXJuZWwga2VybmVsIG9mIHRoZSBjb252b2x1dGlvbi5cbiAqIEBwYXJhbSBzdHJpZGVzIHN0cmlkZXMgYXJyYXkuXG4gKiBAcGFyYW0gcGFkZGluZyBwYWRkaW5nIG1vZGUuIERlZmF1bHQgdG8gJ3ZhbGlkJy5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IGRhdGEgZm9ybWF0LiBEZWZhdWx0cyB0byAnY2hhbm5lbHNMYXN0Jy5cbiAqIEBwYXJhbSBkaWxhdGlvblJhdGUgZGlsYXRpb24gcmF0ZSBhcnJheS5cbiAqIEByZXR1cm5zIFJlc3VsdCBvZiB0aGUgMkQgcG9vbGluZy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZChcbiAgICB4OiBUZW5zb3IsIGtlcm5lbDogVGVuc29yLCBzdHJpZGVzID0gWzEsIDFdLCBwYWRkaW5nID0gJ3ZhbGlkJyxcbiAgICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCwgZGlsYXRpb25SYXRlPzogW251bWJlciwgbnVtYmVyXSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgcmV0dXJuIGNvbnYyZFdpdGhCaWFzQWN0aXZhdGlvbihcbiAgICAgICAgeCwga2VybmVsLCBudWxsLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCBkaWxhdGlvblJhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiAyRCBDb252b2x1dGlvbiB3aXRoIGFuIGFkZGVkIGJpYXMgYW5kIG9wdGlvbmFsIGFjdGl2YXRpb24uXG4gKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBQeXRob24gS2VyYXMgQmFja2VuZC4gVGhpcyBmdW5jdGlvblxuICogaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBgY29udjJkYCwgZXhjZXB0IHRoZSBhZGRlZCBgYmlhc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252MmRXaXRoQmlhc0FjdGl2YXRpb24oXG4gICAgeDogVGVuc29yLCBrZXJuZWw6IFRlbnNvciwgYmlhczogVGVuc29yLCBzdHJpZGVzID0gWzEsIDFdLFxuICAgIHBhZGRpbmcgPSAndmFsaWQnLCBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCwgZGlsYXRpb25SYXRlPzogW251bWJlciwgbnVtYmVyXSxcbiAgICBhY3RpdmF0aW9uOiBmdXNlZC5BY3RpdmF0aW9uID0gbnVsbCk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBpZiAoeC5yYW5rICE9PSAzICYmIHgucmFuayAhPT0gNCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYGNvbnYyZFdpdGhCaWFzQWN0aXZhdGlvbiBleHBlY3RzIGlucHV0IHRvIGJlIG9mIHJhbmsgMyBvciA0LCBgICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7eC5yYW5rfS5gKTtcbiAgICB9XG4gICAgaWYgKGtlcm5lbC5yYW5rICE9PSAzICYmIGtlcm5lbC5yYW5rICE9PSA0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgY29udjJkV2l0aEJpYXNBY3RpdmF0aW9uIGV4cGVjdHMga2VybmVsIHRvIGJlIG9mIHJhbmsgMyBvciA0LCBgICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7eC5yYW5rfS5gKTtcbiAgICB9XG4gICAgbGV0IHkgPSBwcmVwcm9jZXNzQ29udjJESW5wdXQoeCwgZGF0YUZvcm1hdCk7XG4gICAgaWYgKHBhZGRpbmcgPT09ICdjYXVzYWwnKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAnVGhlIHN1cHBvcnQgZm9yIENBVVNBTCBwYWRkaW5nIG1vZGUgaW4gY29udjFkV2l0aEJpYXMgaXMgbm90ICcgK1xuICAgICAgICAgICdpbXBsZW1lbnRlZCB5ZXQuJyk7XG4gICAgfVxuICAgIHkgPSB0ZmMuZnVzZWQuY29udjJkKHtcbiAgICAgIHg6IHkgYXMgVGVuc29yM0QgfCBUZW5zb3I0RCxcbiAgICAgIGZpbHRlcjoga2VybmVsIGFzIFRlbnNvcjRELFxuICAgICAgc3RyaWRlczogc3RyaWRlcyBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkOiBwYWRkaW5nID09PSAnc2FtZScgPyAnc2FtZScgOiAndmFsaWQnLFxuICAgICAgZGlsYXRpb25zOiBkaWxhdGlvblJhdGUsXG4gICAgICBkYXRhRm9ybWF0OiAnTkhXQycsXG4gICAgICBiaWFzLFxuICAgICAgYWN0aXZhdGlvblxuICAgIH0pO1xuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIHkgPSB0ZmMudHJhbnNwb3NlKHksIFswLCAzLCAxLCAyXSk7XG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuLyoqXG4gKiAzRCBDb252b2x1dGlvbi5cbiAqIEBwYXJhbSB4XG4gKiBAcGFyYW0ga2VybmVsIGtlcm5lbCBvZiB0aGUgY29udm9sdXRpb24uXG4gKiBAcGFyYW0gc3RyaWRlcyBzdHJpZGVzIGFycmF5LlxuICogQHBhcmFtIHBhZGRpbmcgcGFkZGluZyBtb2RlLiBEZWZhdWx0IHRvICd2YWxpZCcuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCBkYXRhIGZvcm1hdC4gRGVmYXVsdHMgdG8gJ2NoYW5uZWxzTGFzdCcuXG4gKiBAcGFyYW0gZGlsYXRpb25SYXRlIGRpbGF0aW9uIHJhdGUgYXJyYXkuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIDNEIGNvbnZvbHV0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29udjNkKFxuICAgIHg6IFRlbnNvciwga2VybmVsOiBUZW5zb3IsIHN0cmlkZXMgPSBbMSwgMSwgMV0sIHBhZGRpbmcgPSAndmFsaWQnLFxuICAgIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0LCBkaWxhdGlvblJhdGU/OiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgY2hlY2tEYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICAgIHJldHVybiBjb252M2RXaXRoQmlhcyhcbiAgICAgICAgeCwga2VybmVsLCBudWxsLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCBkaWxhdGlvblJhdGUpO1xuICB9KTtcbn1cblxuLyoqXG4gKiAzRCBDb252b2x1dGlvbiB3aXRoIGFuIGFkZGVkIGJpYXMuXG4gKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGV4aXN0IGluIHRoZSBQeXRob24gS2VyYXMgQmFja2VuZC4gVGhpcyBmdW5jdGlvblxuICogaXMgZXhhY3RseSB0aGUgc2FtZSBhcyBgY29udjNkYCwgZXhjZXB0IHRoZSBhZGRlZCBgYmlhc2AuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjb252M2RXaXRoQmlhcyhcbiAgICB4OiBUZW5zb3IsIGtlcm5lbDogVGVuc29yLCBiaWFzOiBUZW5zb3IsIHN0cmlkZXMgPSBbMSwgMSwgMV0sXG4gICAgcGFkZGluZyA9ICd2YWxpZCcsIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0LFxuICAgIGRpbGF0aW9uUmF0ZT86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBpZiAoeC5yYW5rICE9PSA0ICYmIHgucmFuayAhPT0gNSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYGNvbnYzZFdpdGhCaWFzIGV4cGVjdHMgaW5wdXQgdG8gYmUgb2YgcmFuayA0IG9yIDUsIGJ1dCByZWNlaXZlZCBgICtcbiAgICAgICAgICBgJHt4LnJhbmt9LmApO1xuICAgIH1cbiAgICBpZiAoa2VybmVsLnJhbmsgIT09IDQgJiYga2VybmVsLnJhbmsgIT09IDUpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBjb252M2RXaXRoQmlhcyBleHBlY3RzIGtlcm5lbCB0byBiZSBvZiByYW5rIDQgb3IgNSwgYnV0IHJlY2VpdmVkIGAgK1xuICAgICAgICAgIGAke3gucmFua30uYCk7XG4gICAgfVxuICAgIGxldCB5ID0gcHJlcHJvY2Vzc0NvbnYzRElucHV0KHgsIGRhdGFGb3JtYXQpO1xuICAgIGlmIChwYWRkaW5nID09PSAnY2F1c2FsJykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ1RoZSBzdXBwb3J0IGZvciBDQVVTQUwgcGFkZGluZyBtb2RlIGluIGNvbnYzZFdpdGhCaWFzIGlzIG5vdCAnICtcbiAgICAgICAgICAnaW1wbGVtZW50ZWQgeWV0LicpO1xuICAgIH1cbiAgICB5ID0gdGZjLmNvbnYzZChcbiAgICAgICAgeSBhcyBUZW5zb3I0RCB8IHRmYy5UZW5zb3I8dGZjLlJhbmsuUjU+LFxuICAgICAgICBrZXJuZWwgYXMgdGZjLlRlbnNvcjx0ZmMuUmFuay5SNT4sIHN0cmlkZXMgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICBwYWRkaW5nID09PSAnc2FtZScgPyAnc2FtZScgOiAndmFsaWQnLCAnTkRIV0MnLCBkaWxhdGlvblJhdGUpO1xuICAgIGlmIChiaWFzICE9IG51bGwpIHtcbiAgICAgIHkgPSBLLmJpYXNBZGQoeSwgYmlhcyBhcyBUZW5zb3IxRCk7XG4gICAgfVxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIHkgPSB0ZmMudHJhbnNwb3NlKHksIFswLCA0LCAxLCAyLCAzXSk7XG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuLyoqXG4gKiBCYXNlIExheWVyQ29uZmlnIGZvciBkZXB0aHdpc2UgYW5kIG5vbi1kZXB0aHdpc2UgY29udm9sdXRpb25hbCBsYXllcnMuXG4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBCYXNlQ29udkxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgZGltZW5zaW9ucyBvZiB0aGUgY29udm9sdXRpb24gd2luZG93LiBJZiBrZXJuZWxTaXplIGlzIGEgbnVtYmVyLCB0aGVcbiAgICogY29udm9sdXRpb25hbCB3aW5kb3cgd2lsbCBiZSBzcXVhcmUuXG4gICAqL1xuICBrZXJuZWxTaXplOiBudW1iZXJ8bnVtYmVyW107XG5cbiAgLyoqXG4gICAqIFRoZSBzdHJpZGVzIG9mIHRoZSBjb252b2x1dGlvbiBpbiBlYWNoIGRpbWVuc2lvbi4gSWYgc3RyaWRlcyBpcyBhIG51bWJlcixcbiAgICogc3RyaWRlcyBpbiBib3RoIGRpbWVuc2lvbnMgYXJlIGVxdWFsLlxuICAgKlxuICAgKiBTcGVjaWZ5aW5nIGFueSBzdHJpZGUgdmFsdWUgIT0gMSBpcyBpbmNvbXBhdGlibGUgd2l0aCBzcGVjaWZ5aW5nIGFueVxuICAgKiBgZGlsYXRpb25SYXRlYCB2YWx1ZSAhPSAxLlxuICAgKi9cbiAgc3RyaWRlcz86IG51bWJlcnxudW1iZXJbXTtcblxuICAvKipcbiAgICogUGFkZGluZyBtb2RlLlxuICAgKi9cbiAgcGFkZGluZz86IFBhZGRpbmdNb2RlO1xuXG4gIC8qKlxuICAgKiBGb3JtYXQgb2YgdGhlIGRhdGEsIHdoaWNoIGRldGVybWluZXMgdGhlIG9yZGVyaW5nIG9mIHRoZSBkaW1lbnNpb25zIGluXG4gICAqIHRoZSBpbnB1dHMuXG4gICAqXG4gICAqIGBjaGFubmVsc19sYXN0YCBjb3JyZXNwb25kcyB0byBpbnB1dHMgd2l0aCBzaGFwZVxuICAgKiAgIGAoYmF0Y2gsIC4uLiwgY2hhbm5lbHMpYFxuICAgKlxuICAgKiAgYGNoYW5uZWxzX2ZpcnN0YCBjb3JyZXNwb25kcyB0byBpbnB1dHMgd2l0aCBzaGFwZSBgKGJhdGNoLCBjaGFubmVscyxcbiAgICogLi4uKWAuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBjaGFubmVsc19sYXN0YC5cbiAgICovXG4gIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0O1xuXG4gIC8qKlxuICAgKiBUaGUgZGlsYXRpb24gcmF0ZSB0byB1c2UgZm9yIHRoZSBkaWxhdGVkIGNvbnZvbHV0aW9uIGluIGVhY2ggZGltZW5zaW9uLlxuICAgKiBTaG91bGQgYmUgYW4gaW50ZWdlciBvciBhcnJheSBvZiB0d28gb3IgdGhyZWUgaW50ZWdlcnMuXG4gICAqXG4gICAqIEN1cnJlbnRseSwgc3BlY2lmeWluZyBhbnkgYGRpbGF0aW9uUmF0ZWAgdmFsdWUgIT0gMSBpcyBpbmNvbXBhdGlibGUgd2l0aFxuICAgKiBzcGVjaWZ5aW5nIGFueSBgc3RyaWRlc2AgdmFsdWUgIT0gMS5cbiAgICovXG4gIGRpbGF0aW9uUmF0ZT86IG51bWJlcnxbbnVtYmVyXXxbbnVtYmVyLCBudW1iZXJdfFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICAvKipcbiAgICogQWN0aXZhdGlvbiBmdW5jdGlvbiBvZiB0aGUgbGF5ZXIuXG4gICAqXG4gICAqIElmIHlvdSBkb24ndCBzcGVjaWZ5IHRoZSBhY3RpdmF0aW9uLCBub25lIGlzIGFwcGxpZWQuXG4gICAqL1xuICBhY3RpdmF0aW9uPzogQWN0aXZhdGlvbklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdGhlIGxheWVyIHVzZXMgYSBiaWFzIHZlY3Rvci4gRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgdXNlQmlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgY29udm9sdXRpb25hbCBrZXJuZWwgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICBrZXJuZWxJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBiaWFzIHZlY3Rvci5cbiAgICovXG4gIGJpYXNJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGNvbnZvbHV0aW9uYWwga2VybmVsIHdlaWdodHMuXG4gICAqL1xuICBrZXJuZWxDb25zdHJhaW50PzogQ29uc3RyYWludElkZW50aWZpZXJ8Q29uc3RyYWludDtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgYmlhc0NvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBrZXJuZWwgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICBrZXJuZWxSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGFjdGl2YXRpb24uXG4gICAqL1xuICBhY3Rpdml0eVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xufVxuXG4vKipcbiAqIExheWVyQ29uZmlnIGZvciBub24tZGVwdGh3aXNlIGNvbnZvbHV0aW9uYWwgbGF5ZXJzLlxuICogQXBwbGllcyB0byBub24tZGVwdGh3aXNlIGNvbnZvbHV0aW9uIG9mIGFsbCByYW5rcyAoZS5nLCBDb252MUQsIENvbnYyRCxcbiAqIENvbnYzRCkuXG4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDb252TGF5ZXJBcmdzIGV4dGVuZHMgQmFzZUNvbnZMYXllckFyZ3Mge1xuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc3BhY2UgKGkuZS4gdGhlIG51bWJlciBvZiBmaWx0ZXJzIGluIHRoZVxuICAgKiBjb252b2x1dGlvbikuXG4gICAqL1xuICBmaWx0ZXJzOiBudW1iZXI7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgY29udm9sdXRpb24gbGF5ZXIuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBCYXNlQ29udiBleHRlbmRzIExheWVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJhbms6IG51bWJlcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGtlcm5lbFNpemU6IG51bWJlcltdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaWRlczogbnVtYmVyW107XG4gIHByb3RlY3RlZCByZWFkb25seSBwYWRkaW5nOiBQYWRkaW5nTW9kZTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdXNlQmlhczogYm9vbGVhbjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpbGF0aW9uUmF0ZTogbnVtYmVyW107XG5cbiAgLy8gQmlhcy1yZWxhdGVkIG1lbWJlcnMgYXJlIGhlcmUgYmVjYXVzZSBhbGwgY29udm9sdXRpb24gc3ViY2xhc3NlcyB1c2UgdGhlXG4gIC8vIHNhbWUgY29uZmlndXJhdGlvbiBwYXJtZXRlcnMgdG8gY29udHJvbCBiaWFzLiAgS2VybmVsLXJlbGF0ZWQgbWVtYmVyc1xuICAvLyBhcmUgaW4gc3ViY2xhc3MgYENvbnZgIGJlY2F1c2Ugc29tZSBzdWJjbGFzc2VzIHVzZSBkaWZmZXJlbnQgcGFyYW1ldGVycyB0b1xuICAvLyBjb250cm9sIGtlcm5lbCBwcm9wZXJ0aWVzLCBmb3IgaW5zdGFuY2UsIGBEZXB0aHdpc2VDb252MkRgIHVzZXNcbiAgLy8gYGRlcHRod2lzZUluaXRpYWxpemVyYCBpbnN0ZWFkIG9mIGBrZXJuZWxJbml0aWFsaXplcmAuXG4gIHByb3RlY3RlZCByZWFkb25seSBiaWFzSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJpYXNDb25zdHJhaW50PzogQ29uc3RyYWludDtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGJpYXNSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVyO1xuXG4gIHByb3RlY3RlZCBiaWFzOiBMYXllclZhcmlhYmxlID0gbnVsbDtcblxuICByZWFkb25seSBERUZBVUxUX0tFUk5FTF9JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID0gJ2dsb3JvdE5vcm1hbCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfQklBU19JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID0gJ3plcm9zJztcblxuICBjb25zdHJ1Y3RvcihyYW5rOiBudW1iZXIsIGFyZ3M6IEJhc2VDb252TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyBhcyBMYXllckFyZ3MpO1xuICAgIEJhc2VDb252LnZlcmlmeUFyZ3MoYXJncyk7XG4gICAgdGhpcy5yYW5rID0gcmFuaztcbiAgICBnZW5lcmljX3V0aWxzLmFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnJhbmssICdyYW5rJyk7XG4gICAgaWYgKHRoaXMucmFuayAhPT0gMSAmJiB0aGlzLnJhbmsgIT09IDIgJiYgdGhpcy5yYW5rICE9PSAzKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICBgQ29udm9sdXRpb24gbGF5ZXIgZm9yIHJhbmsgb3RoZXIgdGhhbiAxLCAyLCBvciAzICgke1xuICAgICAgICAgICAgICB0aGlzLnJhbmt9KSBpcyBgICtcbiAgICAgICAgICBgbm90IGltcGxlbWVudGVkIHlldC5gKTtcbiAgICB9XG4gICAgdGhpcy5rZXJuZWxTaXplID0gbm9ybWFsaXplQXJyYXkoYXJncy5rZXJuZWxTaXplLCByYW5rLCAna2VybmVsU2l6ZScpO1xuICAgIHRoaXMuc3RyaWRlcyA9IG5vcm1hbGl6ZUFycmF5KFxuICAgICAgICBhcmdzLnN0cmlkZXMgPT0gbnVsbCA/IDEgOiBhcmdzLnN0cmlkZXMsIHJhbmssICdzdHJpZGVzJyk7XG4gICAgdGhpcy5wYWRkaW5nID0gYXJncy5wYWRkaW5nID09IG51bGwgPyAndmFsaWQnIDogYXJncy5wYWRkaW5nO1xuICAgIGNoZWNrUGFkZGluZ01vZGUodGhpcy5wYWRkaW5nKTtcbiAgICB0aGlzLmRhdGFGb3JtYXQgPVxuICAgICAgICBhcmdzLmRhdGFGb3JtYXQgPT0gbnVsbCA/ICdjaGFubmVsc0xhc3QnIDogYXJncy5kYXRhRm9ybWF0O1xuICAgIGNoZWNrRGF0YUZvcm1hdCh0aGlzLmRhdGFGb3JtYXQpO1xuICAgIHRoaXMuYWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oYXJncy5hY3RpdmF0aW9uKTtcbiAgICB0aGlzLnVzZUJpYXMgPSBhcmdzLnVzZUJpYXMgPT0gbnVsbCA/IHRydWUgOiBhcmdzLnVzZUJpYXM7XG4gICAgdGhpcy5iaWFzSW5pdGlhbGl6ZXIgPVxuICAgICAgICBnZXRJbml0aWFsaXplcihhcmdzLmJpYXNJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfQklBU19JTklUSUFMSVpFUik7XG4gICAgdGhpcy5iaWFzQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5iaWFzQ29uc3RyYWludCk7XG4gICAgdGhpcy5iaWFzUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmJpYXNSZWd1bGFyaXplcik7XG4gICAgdGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5hY3Rpdml0eVJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLmRpbGF0aW9uUmF0ZSA9IG5vcm1hbGl6ZUFycmF5KFxuICAgICAgICBhcmdzLmRpbGF0aW9uUmF0ZSA9PSBudWxsID8gMSA6IGFyZ3MuZGlsYXRpb25SYXRlLCByYW5rLFxuICAgICAgICAnZGlsYXRpb25SYXRlJyk7XG4gICAgaWYgKHRoaXMucmFuayA9PT0gMSAmJlxuICAgICAgICAoQXJyYXkuaXNBcnJheSh0aGlzLmRpbGF0aW9uUmF0ZSkgJiYgdGhpcy5kaWxhdGlvblJhdGUubGVuZ3RoICE9PSAxKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYGRpbGF0aW9uUmF0ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGFuIGFycmF5IG9mIGEgc2luZ2xlIG51bWJlciBgICtcbiAgICAgICAgICBgZm9yIDFEIGNvbnZvbHV0aW9uLCBidXQgcmVjZWl2ZWQgYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkodGhpcy5kaWxhdGlvblJhdGUpfWApO1xuICAgIH0gZWxzZSBpZiAodGhpcy5yYW5rID09PSAyKSB7XG4gICAgICBpZiAodHlwZW9mIHRoaXMuZGlsYXRpb25SYXRlID09PSAnbnVtYmVyJykge1xuICAgICAgICB0aGlzLmRpbGF0aW9uUmF0ZSA9IFt0aGlzLmRpbGF0aW9uUmF0ZSwgdGhpcy5kaWxhdGlvblJhdGVdO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLmRpbGF0aW9uUmF0ZS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgZGlsYXRpb25SYXRlIG11c3QgYmUgYSBudW1iZXIgb3IgYXJyYXkgb2YgdHdvIG51bWJlcnMgZm9yIDJEIGAgK1xuICAgICAgICAgICAgYGNvbnZvbHV0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRpbGF0aW9uUmF0ZSl9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDMpIHtcbiAgICAgIGlmICh0eXBlb2YgdGhpcy5kaWxhdGlvblJhdGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuZGlsYXRpb25SYXRlID1cbiAgICAgICAgICAgIFt0aGlzLmRpbGF0aW9uUmF0ZSwgdGhpcy5kaWxhdGlvblJhdGUsIHRoaXMuZGlsYXRpb25SYXRlXTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5kaWxhdGlvblJhdGUubGVuZ3RoICE9PSAzKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYGRpbGF0aW9uUmF0ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGFycmF5IG9mIHRocmVlIG51bWJlcnMgZm9yIDNEIGAgK1xuICAgICAgICAgICAgYGNvbnZvbHV0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRpbGF0aW9uUmF0ZSl9YCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyB2ZXJpZnlBcmdzKGFyZ3M6IEJhc2VDb252TGF5ZXJBcmdzKSB7XG4gICAgLy8gQ2hlY2sgY29uZmlnLmtlcm5lbFNpemUgdHlwZSBhbmQgc2hhcGUuXG4gICAgZ2VuZXJpY191dGlscy5hc3NlcnQoXG4gICAgICAgICdrZXJuZWxTaXplJyBpbiBhcmdzLCBgcmVxdWlyZWQga2V5ICdrZXJuZWxTaXplJyBub3QgaW4gY29uZmlnYCk7XG4gICAgaWYgKHR5cGVvZiBhcmdzLmtlcm5lbFNpemUgIT09ICdudW1iZXInICYmXG4gICAgICAgICFnZW5lcmljX3V0aWxzLmNoZWNrQXJyYXlUeXBlQW5kTGVuZ3RoKFxuICAgICAgICAgICAgYXJncy5rZXJuZWxTaXplLCAnbnVtYmVyJywgMSwgMykpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBCYXNlQ29udiBleHBlY3RzIGNvbmZpZy5rZXJuZWxTaXplIHRvIGJlIG51bWJlciBvciBudW1iZXJbXSB3aXRoIGAgK1xuICAgICAgICAgIGBsZW5ndGggMSwgMiwgb3IgMywgYnV0IHJlY2VpdmVkICR7XG4gICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFyZ3Mua2VybmVsU2l6ZSl9LmApO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge1xuICAgICAga2VybmVsU2l6ZTogdGhpcy5rZXJuZWxTaXplLFxuICAgICAgc3RyaWRlczogdGhpcy5zdHJpZGVzLFxuICAgICAgcGFkZGluZzogdGhpcy5wYWRkaW5nLFxuICAgICAgZGF0YUZvcm1hdDogdGhpcy5kYXRhRm9ybWF0LFxuICAgICAgZGlsYXRpb25SYXRlOiB0aGlzLmRpbGF0aW9uUmF0ZSxcbiAgICAgIGFjdGl2YXRpb246IHNlcmlhbGl6ZUFjdGl2YXRpb24odGhpcy5hY3RpdmF0aW9uKSxcbiAgICAgIHVzZUJpYXM6IHRoaXMudXNlQmlhcyxcbiAgICAgIGJpYXNJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5iaWFzSW5pdGlhbGl6ZXIpLFxuICAgICAgYmlhc1JlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmJpYXNSZWd1bGFyaXplciksXG4gICAgICBhY3Rpdml0eVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIpLFxuICAgICAgYmlhc0NvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5iaWFzQ29uc3RyYWludClcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG4vKipcbiAqIEFic3RyYWN0IG5EIGNvbnZvbHV0aW9uIGxheWVyLiAgQW5jZXN0b3Igb2YgY29udm9sdXRpb24gbGF5ZXJzIHdoaWNoIHJlZHVjZVxuICogYWNyb3NzIGNoYW5uZWxzLCBpLmUuLCBDb252MUQgYW5kIENvbnYyRCwgYnV0IG5vdCBEZXB0aHdpc2VDb252MkQuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDb252IGV4dGVuZHMgQmFzZUNvbnYge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZmlsdGVyczogbnVtYmVyO1xuXG4gIHByb3RlY3RlZCBrZXJuZWw6IExheWVyVmFyaWFibGUgPSBudWxsO1xuXG4gIC8vIEJpYXMtcmVsYXRlZCBwcm9wZXJ0aWVzIGFyZSBzdG9yZWQgaW4gdGhlIHN1cGVyY2xhc3MgYEJhc2VDb252YCBiZWNhdXNlIGFsbFxuICAvLyBjb252b2x1dGlvbiBzdWJjbGFzc2VzIHVzZSB0aGUgc2FtZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgdG8gY29udHJvbFxuICAvLyBiaWFzLiBLZXJuZWwtcmVsYXRlZCBwcm9wZXJ0aWVzIGFyZSBkZWZpbmVkIGhlcmUgcmF0aGVyIHRoYW4gaW4gdGhlXG4gIC8vIHN1cGVyY2xhc3MgYmVjYXVzZSBzb21lIGNvbnZvbHV0aW9uIHN1YmNsYXNzZXMgdXNlIGRpZmZlcmVudCBuYW1lcyBhbmRcbiAgLy8gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGZvciB0aGVpciBpbnRlcm5hbCBrZXJuZWwgc3RhdGUuXG4gIHByb3RlY3RlZCByZWFkb25seSBrZXJuZWxJbml0aWFsaXplcj86IEluaXRpYWxpemVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkga2VybmVsQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBrZXJuZWxSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVyO1xuXG4gIGNvbnN0cnVjdG9yKHJhbms6IG51bWJlciwgYXJnczogQ29udkxheWVyQXJncykge1xuICAgIHN1cGVyKHJhbmssIGFyZ3MgYXMgQmFzZUNvbnZMYXllckFyZ3MpO1xuICAgIENvbnYudmVyaWZ5QXJncyhhcmdzKTtcbiAgICB0aGlzLmZpbHRlcnMgPSBhcmdzLmZpbHRlcnM7XG4gICAgZ2VuZXJpY191dGlscy5hc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy5maWx0ZXJzLCAnZmlsdGVycycpO1xuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5rZXJuZWxJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3Mua2VybmVsQ29uc3RyYWludCk7XG4gICAgdGhpcy5rZXJuZWxSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3Mua2VybmVsUmVndWxhcml6ZXIpO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgY2hhbm5lbEF4aXMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IDEgOiBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7XG4gICAgaWYgKGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBUaGUgY2hhbm5lbCBkaW1lbnNpb24gb2YgdGhlIGlucHV0IHNob3VsZCBiZSBkZWZpbmVkLiBgICtcbiAgICAgICAgICBgRm91bmQgJHtpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXX1gKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXTtcblxuICAgIGNvbnN0IGtlcm5lbFNoYXBlID0gdGhpcy5rZXJuZWxTaXplLmNvbmNhdChbaW5wdXREaW0sIHRoaXMuZmlsdGVyc10pO1xuXG4gICAgdGhpcy5rZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2tlcm5lbCcsIGtlcm5lbFNoYXBlLCBudWxsLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIGlmICh0aGlzLnVzZUJpYXMpIHtcbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMuZmlsdGVyc10sIG51bGwsIHRoaXMuYmlhc0luaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMuYmlhc1JlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmJpYXNDb25zdHJhaW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bmRpbTogdGhpcy5yYW5rICsgMiwgYXhlczoge1tjaGFubmVsQXhpc106IGlucHV0RGltfX1dO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGxldCBvdXRwdXRzOiBUZW5zb3I7XG4gICAgICBjb25zdCBiaWFzVmFsdWUgPSB0aGlzLmJpYXMgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmJpYXMucmVhZCgpO1xuICAgICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uTmFtZSA9IGdlbmVyaWNfdXRpbHMubWFwQWN0aXZhdGlvblRvRnVzZWRLZXJuZWwoXG4gICAgICAgICAgdGhpcy5hY3RpdmF0aW9uLmdldENsYXNzTmFtZSgpKTtcblxuICAgICAgaWYgKGZ1c2VkQWN0aXZhdGlvbk5hbWUgIT0gbnVsbCAmJiB0aGlzLnJhbmsgPT09IDIpIHtcbiAgICAgICAgb3V0cHV0cyA9IGNvbnYyZFdpdGhCaWFzQWN0aXZhdGlvbihcbiAgICAgICAgICAgIGlucHV0cywgdGhpcy5rZXJuZWwucmVhZCgpLCBiaWFzVmFsdWUsIHRoaXMuc3RyaWRlcywgdGhpcy5wYWRkaW5nLFxuICAgICAgICAgICAgdGhpcy5kYXRhRm9ybWF0LCB0aGlzLmRpbGF0aW9uUmF0ZSBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAgICAgZnVzZWRBY3RpdmF0aW9uTmFtZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICAgICAgb3V0cHV0cyA9IGNvbnYxZFdpdGhCaWFzKFxuICAgICAgICAgICAgICBpbnB1dHMsIHRoaXMua2VybmVsLnJlYWQoKSwgYmlhc1ZhbHVlLCB0aGlzLnN0cmlkZXNbMF0sXG4gICAgICAgICAgICAgIHRoaXMucGFkZGluZywgdGhpcy5kYXRhRm9ybWF0LCB0aGlzLmRpbGF0aW9uUmF0ZVswXSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5yYW5rID09PSAyKSB7XG4gICAgICAgICAgLy8gVE9ETyhjYWlzKTogTW92ZSB1cCB0byBjb25zdHJ1Y3Rvci5cbiAgICAgICAgICBvdXRwdXRzID0gY29udjJkV2l0aEJpYXNBY3RpdmF0aW9uKFxuICAgICAgICAgICAgICBpbnB1dHMsIHRoaXMua2VybmVsLnJlYWQoKSwgYmlhc1ZhbHVlLCB0aGlzLnN0cmlkZXMsIHRoaXMucGFkZGluZyxcbiAgICAgICAgICAgICAgdGhpcy5kYXRhRm9ybWF0LCB0aGlzLmRpbGF0aW9uUmF0ZSBhcyBbbnVtYmVyLCBudW1iZXJdKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnJhbmsgPT09IDMpIHtcbiAgICAgICAgICBvdXRwdXRzID0gY29udjNkV2l0aEJpYXMoXG4gICAgICAgICAgICAgIGlucHV0cywgdGhpcy5rZXJuZWwucmVhZCgpLCBiaWFzVmFsdWUsIHRoaXMuc3RyaWRlcywgdGhpcy5wYWRkaW5nLFxuICAgICAgICAgICAgICB0aGlzLmRhdGFGb3JtYXQsIHRoaXMuZGlsYXRpb25SYXRlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgICAgICdjb252b2x1dGlvbnMgZ3JlYXRlciB0aGFuIDNEIGFyZSBub3QgaW1wbGVtZW50ZWQgeWV0LicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgb3V0cHV0cyA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseShvdXRwdXRzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gb3V0cHV0cztcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBuZXdTcGFjZTogbnVtYmVyW10gPSBbXTtcbiAgICBjb25zdCBzcGFjZSA9ICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSA/XG4gICAgICAgIGlucHV0U2hhcGUuc2xpY2UoMSwgaW5wdXRTaGFwZS5sZW5ndGggLSAxKSA6XG4gICAgICAgIGlucHV0U2hhcGUuc2xpY2UoMik7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFjZS5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgbmV3RGltID0gY29udk91dHB1dExlbmd0aChcbiAgICAgICAgICBzcGFjZVtpXSwgdGhpcy5rZXJuZWxTaXplW2ldLCB0aGlzLnBhZGRpbmcsIHRoaXMuc3RyaWRlc1tpXSxcbiAgICAgICAgICB0eXBlb2YgdGhpcy5kaWxhdGlvblJhdGUgPT09ICdudW1iZXInID8gdGhpcy5kaWxhdGlvblJhdGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpbGF0aW9uUmF0ZVtpXSk7XG4gICAgICBuZXdTcGFjZS5wdXNoKG5ld0RpbSk7XG4gICAgfVxuXG4gICAgbGV0IG91dHB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF1dO1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICBvdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlLmNvbmNhdChuZXdTcGFjZSk7XG4gICAgICBvdXRwdXRTaGFwZS5wdXNoKHRoaXMuZmlsdGVycyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFNoYXBlLnB1c2godGhpcy5maWx0ZXJzKTtcbiAgICAgIG91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGUuY29uY2F0KG5ld1NwYWNlKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLFxuICAgICAga2VybmVsUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMua2VybmVsUmVndWxhcml6ZXIpLFxuICAgICAga2VybmVsQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmtlcm5lbENvbnN0cmFpbnQpXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIHZlcmlmeUFyZ3MoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIC8vIENoZWNrIGNvbmZpZy5maWx0ZXJzIHR5cGUsIHNoYXBlLCBhbmQgdmFsdWUuXG4gICAgaWYgKCEoJ2ZpbHRlcnMnIGluIGFyZ3MpIHx8IHR5cGVvZiBhcmdzLmZpbHRlcnMgIT09ICdudW1iZXInIHx8XG4gICAgICAgIGFyZ3MuZmlsdGVycyA8IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBDb252b2x1dGlvbiBsYXllciBleHBlY3RlZCBjb25maWcuZmlsdGVycyB0byBiZSBhICdudW1iZXInID4gMCBgICtcbiAgICAgICAgICBgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KGFyZ3MuZmlsdGVycyl9YCk7XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252MkQgZXh0ZW5kcyBDb252IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udjJEJztcbiAgY29uc3RydWN0b3IoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIHN1cGVyKDIsIGFyZ3MpO1xuICAgIENvbnYyRC52ZXJpZnlBcmdzKGFyZ3MpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1sncmFuayddO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIHZlcmlmeUFyZ3MoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIC8vIGNvbmZpZy5rZXJuZWxTaXplIG11c3QgYmUgYSBudW1iZXIgb3IgYXJyYXkgb2YgbnVtYmVycy5cbiAgICBpZiAoKHR5cGVvZiBhcmdzLmtlcm5lbFNpemUgIT09ICdudW1iZXInKSAmJlxuICAgICAgICAhZ2VuZXJpY191dGlscy5jaGVja0FycmF5VHlwZUFuZExlbmd0aChcbiAgICAgICAgICAgIGFyZ3Mua2VybmVsU2l6ZSwgJ251bWJlcicsIDEsIDIpKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgQ29udjJEIGV4cGVjdHMgY29uZmlnLmtlcm5lbFNpemUgdG8gYmUgbnVtYmVyIG9yIG51bWJlcltdIHdpdGggYCArXG4gICAgICAgICAgYGxlbmd0aCAxIG9yIDIsIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KGFyZ3Mua2VybmVsU2l6ZSl9LmApO1xuICAgIH1cbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYyRCk7XG5cbmV4cG9ydCBjbGFzcyBDb252M0QgZXh0ZW5kcyBDb252IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udjNEJztcbiAgY29uc3RydWN0b3IoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIHN1cGVyKDMsIGFyZ3MpO1xuICAgIENvbnYzRC52ZXJpZnlBcmdzKGFyZ3MpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1sncmFuayddO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBwcm90ZWN0ZWQgc3RhdGljIHZlcmlmeUFyZ3MoYXJnczogQ29udkxheWVyQXJncykge1xuICAgIC8vIGNvbmZpZy5rZXJuZWxTaXplIG11c3QgYmUgYSBudW1iZXIgb3IgYXJyYXkgb2YgbnVtYmVycy5cbiAgICBpZiAodHlwZW9mIGFyZ3Mua2VybmVsU2l6ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgIGlmICghKEFycmF5LmlzQXJyYXkoYXJncy5rZXJuZWxTaXplKSAmJlxuICAgICAgICAgICAgKGFyZ3Mua2VybmVsU2l6ZS5sZW5ndGggPT09IDEgfHwgYXJncy5rZXJuZWxTaXplLmxlbmd0aCA9PT0gMykpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYENvbnYzRCBleHBlY3RzIGNvbmZpZy5rZXJuZWxTaXplIHRvIGJlIG51bWJlciBvcmAgK1xuICAgICAgICAgICAgYCBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGJ1dCByZWNlaXZlZCAke1xuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGFyZ3Mua2VybmVsU2l6ZSl9LmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYzRCk7XG5cbmV4cG9ydCBjbGFzcyBDb252MkRUcmFuc3Bvc2UgZXh0ZW5kcyBDb252MkQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdDb252MkRUcmFuc3Bvc2UnO1xuICBpbnB1dFNwZWM6IElucHV0U3BlY1tdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA0fSldO1xuXG4gICAgaWYgKHRoaXMucGFkZGluZyAhPT0gJ3NhbWUnICYmIHRoaXMucGFkZGluZyAhPT0gJ3ZhbGlkJykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYENvbnYyRFRyYW5zcG9zZSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBwYWRkaW5nIG1vZGVzICdzYW1lJyBgICtcbiAgICAgICAgICBgYW5kICd2YWxpZCcsIGJ1dCByZWNlaXZlZCBwYWRkaW5nIG1vZGUgJHt0aGlzLnBhZGRpbmd9YCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICBpZiAoaW5wdXRTaGFwZS5sZW5ndGggIT09IDQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdJbnB1dCBzaG91bGQgaGF2ZSByYW5rIDQ7IFJlY2VpdmVkIGlucHV0IHNoYXBlOiAnICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpbnB1dFNoYXBlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbEF4aXMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IDEgOiBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7XG4gICAgaWYgKGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdUaGUgY2hhbm5lbCBkaW1lbnNpb24gb2YgdGhlIGlucHV0cyBzaG91bGQgYmUgZGVmaW5lZC4gJyArXG4gICAgICAgICAgJ0ZvdW5kIGBOb25lYC4nKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXTtcbiAgICBjb25zdCBrZXJuZWxTaGFwZSA9IHRoaXMua2VybmVsU2l6ZS5jb25jYXQoW3RoaXMuZmlsdGVycywgaW5wdXREaW1dKTtcblxuICAgIHRoaXMua2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdrZXJuZWwnLCBrZXJuZWxTaGFwZSwgJ2Zsb2F0MzInLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIGlmICh0aGlzLnVzZUJpYXMpIHtcbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMuZmlsdGVyc10sICdmbG9hdDMyJywgdGhpcy5iaWFzSW5pdGlhbGl6ZXIsXG4gICAgICAgICAgdGhpcy5iaWFzUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYmlhc0NvbnN0cmFpbnQpO1xuICAgIH1cblxuICAgIC8vIFNldCBpbnB1dCBzcGVjLlxuICAgIHRoaXMuaW5wdXRTcGVjID1cbiAgICAgICAgW25ldyBJbnB1dFNwZWMoe25kaW06IDQsIGF4ZXM6IHtbY2hhbm5lbEF4aXNdOiBpbnB1dERpbX19KV07XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICAgIGxldCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGlmIChpbnB1dC5zaGFwZS5sZW5ndGggIT09IDQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgQ29udjJEVHJhbnNwb3NlLmNhbGwoKSBleHBlY3RzIGlucHV0IHRlbnNvciB0byBiZSByYW5rLTQsIGJ1dCBgICtcbiAgICAgICAgICAgIGByZWNlaXZlZCBhIHRlbnNvciBvZiByYW5rLSR7aW5wdXQuc2hhcGUubGVuZ3RofWApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnB1dFNoYXBlID0gaW5wdXQuc2hhcGU7XG4gICAgICBjb25zdCBiYXRjaFNpemUgPSBpbnB1dFNoYXBlWzBdO1xuXG4gICAgICBsZXQgaEF4aXM6IG51bWJlcjtcbiAgICAgIGxldCB3QXhpczogbnVtYmVyO1xuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICAgIGhBeGlzID0gMjtcbiAgICAgICAgd0F4aXMgPSAzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaEF4aXMgPSAxO1xuICAgICAgICB3QXhpcyA9IDI7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGhlaWdodCA9IGlucHV0U2hhcGVbaEF4aXNdO1xuICAgICAgY29uc3Qgd2lkdGggPSBpbnB1dFNoYXBlW3dBeGlzXTtcbiAgICAgIGNvbnN0IGtlcm5lbEggPSB0aGlzLmtlcm5lbFNpemVbMF07XG4gICAgICBjb25zdCBrZXJuZWxXID0gdGhpcy5rZXJuZWxTaXplWzFdO1xuICAgICAgY29uc3Qgc3RyaWRlSCA9IHRoaXMuc3RyaWRlc1swXTtcbiAgICAgIGNvbnN0IHN0cmlkZVcgPSB0aGlzLnN0cmlkZXNbMV07XG5cbiAgICAgIC8vIEluZmVyIHRoZSBkeW5hbWljIG91dHB1dCBzaGFwZS5cbiAgICAgIGNvbnN0IG91dEhlaWdodCA9IGRlY29udkxlbmd0aChoZWlnaHQsIHN0cmlkZUgsIGtlcm5lbEgsIHRoaXMucGFkZGluZyk7XG4gICAgICBjb25zdCBvdXRXaWR0aCA9IGRlY29udkxlbmd0aCh3aWR0aCwgc3RyaWRlVywga2VybmVsVywgdGhpcy5wYWRkaW5nKTtcblxuICAgICAgLy8gUG9ydGluZyBOb3RlOiBXZSBkb24ndCBicmFuY2ggYmFzZWQgb24gYHRoaXMuZGF0YUZvcm1hdGAgaGVyZSxcbiAgICAgIC8vIGJlY2F1c2VcbiAgICAgIC8vICAgdGhlIHRqZnMtY29yZSBmdW5jdGlvbiBgY29udjJkVHJhbnNwb3NlYCBjYWxsZWQgYmVsb3cgYWx3YXlzXG4gICAgICAvLyAgIGFzc3VtZXMgY2hhbm5lbHNMYXN0LlxuICAgICAgY29uc3Qgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdID1cbiAgICAgICAgICBbYmF0Y2hTaXplLCBvdXRIZWlnaHQsIG91dFdpZHRoLCB0aGlzLmZpbHRlcnNdO1xuXG4gICAgICBpZiAodGhpcy5kYXRhRm9ybWF0ICE9PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICBpbnB1dCA9IHRmYy50cmFuc3Bvc2UoaW5wdXQsIFswLCAyLCAzLCAxXSk7XG4gICAgICB9XG4gICAgICBsZXQgb3V0cHV0cyA9IHRmYy5jb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgaW5wdXQgYXMgVGVuc29yNEQsIHRoaXMua2VybmVsLnJlYWQoKSBhcyBUZW5zb3I0RCwgb3V0cHV0U2hhcGUsXG4gICAgICAgICAgdGhpcy5zdHJpZGVzIGFzIFtudW1iZXIsIG51bWJlcl0sIHRoaXMucGFkZGluZyBhcyAnc2FtZScgfCAndmFsaWQnKTtcbiAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgIT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIG91dHB1dHMgPSB0ZmMudHJhbnNwb3NlKG91dHB1dHMsIFswLCAzLCAxLCAyXSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLmJpYXMgIT0gbnVsbCkge1xuICAgICAgICBvdXRwdXRzID1cbiAgICAgICAgICAgIEsuYmlhc0FkZChvdXRwdXRzLCB0aGlzLmJpYXMucmVhZCgpLCB0aGlzLmRhdGFGb3JtYXQpIGFzIFRlbnNvcjREO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIG91dHB1dHMgPSB0aGlzLmFjdGl2YXRpb24uYXBwbHkob3V0cHV0cykgYXMgVGVuc29yNEQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0cztcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IGlucHV0U2hhcGUuc2xpY2UoKTtcblxuICAgIGxldCBjaGFubmVsQXhpczogbnVtYmVyO1xuICAgIGxldCBoZWlnaHRBeGlzOiBudW1iZXI7XG4gICAgbGV0IHdpZHRoQXhpczogbnVtYmVyO1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgY2hhbm5lbEF4aXMgPSAxO1xuICAgICAgaGVpZ2h0QXhpcyA9IDI7XG4gICAgICB3aWR0aEF4aXMgPSAzO1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsQXhpcyA9IDM7XG4gICAgICBoZWlnaHRBeGlzID0gMTtcbiAgICAgIHdpZHRoQXhpcyA9IDI7XG4gICAgfVxuXG4gICAgY29uc3Qga2VybmVsSCA9IHRoaXMua2VybmVsU2l6ZVswXTtcbiAgICBjb25zdCBrZXJuZWxXID0gdGhpcy5rZXJuZWxTaXplWzFdO1xuICAgIGNvbnN0IHN0cmlkZUggPSB0aGlzLnN0cmlkZXNbMF07XG4gICAgY29uc3Qgc3RyaWRlVyA9IHRoaXMuc3RyaWRlc1sxXTtcblxuICAgIG91dHB1dFNoYXBlW2NoYW5uZWxBeGlzXSA9IHRoaXMuZmlsdGVycztcbiAgICBvdXRwdXRTaGFwZVtoZWlnaHRBeGlzXSA9XG4gICAgICAgIGRlY29udkxlbmd0aChvdXRwdXRTaGFwZVtoZWlnaHRBeGlzXSwgc3RyaWRlSCwga2VybmVsSCwgdGhpcy5wYWRkaW5nKTtcbiAgICBvdXRwdXRTaGFwZVt3aWR0aEF4aXNdID1cbiAgICAgICAgZGVjb252TGVuZ3RoKG91dHB1dFNoYXBlW3dpZHRoQXhpc10sIHN0cmlkZVcsIGtlcm5lbFcsIHRoaXMucGFkZGluZyk7XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1snZGlsYXRpb25SYXRlJ107XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYyRFRyYW5zcG9zZSk7XG5cbmV4cG9ydCBjbGFzcyBDb252M0RUcmFuc3Bvc2UgZXh0ZW5kcyBDb252M0Qge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdDb252M0RUcmFuc3Bvc2UnO1xuICBpbnB1dFNwZWM6IElucHV0U3BlY1tdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA1fSldO1xuXG4gICAgaWYgKHRoaXMucGFkZGluZyAhPT0gJ3NhbWUnICYmIHRoaXMucGFkZGluZyAhPT0gJ3ZhbGlkJykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYENvbnYzRFRyYW5zcG9zZSBjdXJyZW50bHkgc3VwcG9ydHMgb25seSBwYWRkaW5nIG1vZGVzICdzYW1lJyBgICtcbiAgICAgICAgICBgYW5kICd2YWxpZCcsIGJ1dCByZWNlaXZlZCBwYWRkaW5nIG1vZGUgJHt0aGlzLnBhZGRpbmd9YCk7XG4gICAgfVxuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICBpZiAoaW5wdXRTaGFwZS5sZW5ndGggIT09IDUpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdJbnB1dCBzaG91bGQgaGF2ZSByYW5rIDU7IFJlY2VpdmVkIGlucHV0IHNoYXBlOiAnICtcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShpbnB1dFNoYXBlKSk7XG4gICAgfVxuXG4gICAgY29uc3QgY2hhbm5lbEF4aXMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IDEgOiBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7XG4gICAgaWYgKGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdUaGUgY2hhbm5lbCBkaW1lbnNpb24gb2YgdGhlIGlucHV0cyBzaG91bGQgYmUgZGVmaW5lZC4gJyArXG4gICAgICAgICAgJ0ZvdW5kIGBOb25lYC4nKTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXTtcbiAgICBjb25zdCBrZXJuZWxTaGFwZSA9IHRoaXMua2VybmVsU2l6ZS5jb25jYXQoW3RoaXMuZmlsdGVycywgaW5wdXREaW1dKTtcblxuICAgIHRoaXMua2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdrZXJuZWwnLCBrZXJuZWxTaGFwZSwgJ2Zsb2F0MzInLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIGlmICh0aGlzLnVzZUJpYXMpIHtcbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMuZmlsdGVyc10sICdmbG9hdDMyJywgdGhpcy5iaWFzSW5pdGlhbGl6ZXIsXG4gICAgICAgICAgdGhpcy5iaWFzUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYmlhc0NvbnN0cmFpbnQpO1xuICAgIH1cblxuICAgIC8vIFNldCBpbnB1dCBzcGVjLlxuICAgIHRoaXMuaW5wdXRTcGVjID1cbiAgICAgICAgW25ldyBJbnB1dFNwZWMoe25kaW06IDUsIGF4ZXM6IHtbY2hhbm5lbEF4aXNdOiBpbnB1dERpbX19KV07XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRmYy50aWR5PHRmYy5UZW5zb3I1RD4oKCkgPT4ge1xuICAgICAgbGV0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgaWYgKGlucHV0LnNoYXBlLmxlbmd0aCAhPT0gNSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBDb252M0RUcmFuc3Bvc2UuY2FsbCgpIGV4cGVjdHMgaW5wdXQgdGVuc29yIHRvIGJlIHJhbmstNCwgYnV0IGAgK1xuICAgICAgICAgICAgYHJlY2VpdmVkIGEgdGVuc29yIG9mIHJhbmstJHtpbnB1dC5zaGFwZS5sZW5ndGh9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IGlucHV0U2hhcGVbMF07XG5cbiAgICAgIGxldCBoQXhpczogbnVtYmVyO1xuICAgICAgbGV0IHdBeGlzOiBudW1iZXI7XG4gICAgICBsZXQgZEF4aXM6IG51bWJlcjtcblxuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICAgIGRBeGlzID0gMjtcbiAgICAgICAgaEF4aXMgPSAzO1xuICAgICAgICB3QXhpcyA9IDQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkQXhpcyA9IDE7XG4gICAgICAgIGhBeGlzID0gMjtcbiAgICAgICAgd0F4aXMgPSAzO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBkZXB0aCA9IGlucHV0U2hhcGVbZEF4aXNdO1xuICAgICAgY29uc3QgaGVpZ2h0ID0gaW5wdXRTaGFwZVtoQXhpc107XG4gICAgICBjb25zdCB3aWR0aCA9IGlucHV0U2hhcGVbd0F4aXNdO1xuICAgICAgY29uc3Qga2VybmVsRCA9IHRoaXMua2VybmVsU2l6ZVswXTtcbiAgICAgIGNvbnN0IGtlcm5lbEggPSB0aGlzLmtlcm5lbFNpemVbMV07XG4gICAgICBjb25zdCBrZXJuZWxXID0gdGhpcy5rZXJuZWxTaXplWzJdO1xuICAgICAgY29uc3Qgc3RyaWRlRCA9IHRoaXMuc3RyaWRlc1swXTtcbiAgICAgIGNvbnN0IHN0cmlkZUggPSB0aGlzLnN0cmlkZXNbMV07XG4gICAgICBjb25zdCBzdHJpZGVXID0gdGhpcy5zdHJpZGVzWzJdO1xuXG4gICAgICAvLyBJbmZlciB0aGUgZHluYW1pYyBvdXRwdXQgc2hhcGUuXG4gICAgICBjb25zdCBvdXREZXB0aCA9IGRlY29udkxlbmd0aChkZXB0aCwgc3RyaWRlRCwga2VybmVsRCwgdGhpcy5wYWRkaW5nKTtcbiAgICAgIGNvbnN0IG91dEhlaWdodCA9IGRlY29udkxlbmd0aChoZWlnaHQsIHN0cmlkZUgsIGtlcm5lbEgsIHRoaXMucGFkZGluZyk7XG4gICAgICBjb25zdCBvdXRXaWR0aCA9IGRlY29udkxlbmd0aCh3aWR0aCwgc3RyaWRlVywga2VybmVsVywgdGhpcy5wYWRkaW5nKTtcblxuICAgICAgLy8gU2FtZSBhcyBgY29udjJkVHJhbnNwb3NlYC4gV2UgYWx3YXlzIGFzc3VtZXMgY2hhbm5lbHNMYXN0LlxuICAgICAgY29uc3Qgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPVxuICAgICAgICAgIFtiYXRjaFNpemUsIG91dERlcHRoLCBvdXRIZWlnaHQsIG91dFdpZHRoLCB0aGlzLmZpbHRlcnNdO1xuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgaW5wdXQgPSB0ZmMudHJhbnNwb3NlKGlucHV0LCBbMCwgMiwgMywgNCwgMV0pO1xuICAgICAgfVxuICAgICAgbGV0IG91dHB1dHMgPSB0ZmMuY29udjNkVHJhbnNwb3NlKFxuICAgICAgICAgIGlucHV0IGFzIFRlbnNvcjVELCB0aGlzLmtlcm5lbC5yZWFkKCkgYXMgVGVuc29yNUQsIG91dHB1dFNoYXBlLFxuICAgICAgICAgIHRoaXMuc3RyaWRlcyBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgdGhpcy5wYWRkaW5nIGFzICdzYW1lJyB8ICd2YWxpZCcpO1xuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzTGFzdCcpIHtcbiAgICAgICAgb3V0cHV0cyA9IHRmYy50cmFuc3Bvc2Uob3V0cHV0cywgWzAsIDQsIDEsIDIsIDNdKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuYmlhcyAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXRzID1cbiAgICAgICAgICAgIEsuYmlhc0FkZChvdXRwdXRzLCB0aGlzLmJpYXMucmVhZCgpLCB0aGlzLmRhdGFGb3JtYXQpIGFzIFRlbnNvcjVEO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvbiAhPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXRzID0gdGhpcy5hY3RpdmF0aW9uLmFwcGx5KG91dHB1dHMpIGFzIFRlbnNvcjVEO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dHM7XG4gICAgfSk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKCk7XG5cbiAgICBsZXQgY2hhbm5lbEF4aXM6IG51bWJlcjtcbiAgICBsZXQgZGVwdGhBeGlzOiBudW1iZXI7XG4gICAgbGV0IGhlaWdodEF4aXM6IG51bWJlcjtcbiAgICBsZXQgd2lkdGhBeGlzOiBudW1iZXI7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICBjaGFubmVsQXhpcyA9IDE7XG4gICAgICBkZXB0aEF4aXMgPSAyO1xuICAgICAgaGVpZ2h0QXhpcyA9IDM7XG4gICAgICB3aWR0aEF4aXMgPSA0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjaGFubmVsQXhpcyA9IDQ7XG4gICAgICBkZXB0aEF4aXMgPSAxO1xuICAgICAgaGVpZ2h0QXhpcyA9IDI7XG4gICAgICB3aWR0aEF4aXMgPSAzO1xuICAgIH1cblxuICAgIGNvbnN0IGtlcm5lbEQgPSB0aGlzLmtlcm5lbFNpemVbMF07XG4gICAgY29uc3Qga2VybmVsSCA9IHRoaXMua2VybmVsU2l6ZVsxXTtcbiAgICBjb25zdCBrZXJuZWxXID0gdGhpcy5rZXJuZWxTaXplWzJdO1xuICAgIGNvbnN0IHN0cmlkZUQgPSB0aGlzLnN0cmlkZXNbMF07XG4gICAgY29uc3Qgc3RyaWRlSCA9IHRoaXMuc3RyaWRlc1sxXTtcbiAgICBjb25zdCBzdHJpZGVXID0gdGhpcy5zdHJpZGVzWzJdO1xuXG4gICAgb3V0cHV0U2hhcGVbY2hhbm5lbEF4aXNdID0gdGhpcy5maWx0ZXJzO1xuICAgIG91dHB1dFNoYXBlW2RlcHRoQXhpc10gPVxuICAgICAgICBkZWNvbnZMZW5ndGgob3V0cHV0U2hhcGVbZGVwdGhBeGlzXSwgc3RyaWRlRCwga2VybmVsRCwgdGhpcy5wYWRkaW5nKTtcbiAgICBvdXRwdXRTaGFwZVtoZWlnaHRBeGlzXSA9XG4gICAgICAgIGRlY29udkxlbmd0aChvdXRwdXRTaGFwZVtoZWlnaHRBeGlzXSwgc3RyaWRlSCwga2VybmVsSCwgdGhpcy5wYWRkaW5nKTtcbiAgICBvdXRwdXRTaGFwZVt3aWR0aEF4aXNdID1cbiAgICAgICAgZGVjb252TGVuZ3RoKG91dHB1dFNoYXBlW3dpZHRoQXhpc10sIHN0cmlkZVcsIGtlcm5lbFcsIHRoaXMucGFkZGluZyk7XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1snZGlsYXRpb25SYXRlJ107XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYzRFRyYW5zcG9zZSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBTZXBhcmFibGVDb252TGF5ZXJBcmdzIGV4dGVuZHMgQ29udkxheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGRlcHRod2lzZSBjb252b2x1dGlvbiBvdXRwdXQgY2hhbm5lbHMgZm9yIGVhY2ggaW5wdXRcbiAgICogY2hhbm5lbC5cbiAgICogVGhlIHRvdGFsIG51bWJlciBvZiBkZXB0aHdpc2UgY29udm9sdXRpb24gb3V0cHV0IGNoYW5uZWxzIHdpbGwgYmUgZXF1YWxcbiAgICogdG8gYGZpbHRlcnNJbiAqIGRlcHRoTXVsdGlwbGllcmAuIERlZmF1bHQ6IDEuXG4gICAqL1xuICBkZXB0aE11bHRpcGxpZXI/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgZGVwdGh3aXNlIGtlcm5lbCBtYXRyaXguXG4gICAqL1xuICBkZXB0aHdpc2VJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBwb2ludHdpc2Uga2VybmVsIG1hdHJpeC5cbiAgICovXG4gIHBvaW50d2lzZUluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBkZXB0aHdpc2Uga2VybmVsIG1hdHJpeC5cbiAgICovXG4gIGRlcHRod2lzZVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBwb2ludHdpc2Uga2VybmVsIG1hdHJpeC5cbiAgICovXG4gIHBvaW50d2lzZVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGRlcHRod2lzZSBrZXJuZWwgbWF0cml4LlxuICAgKi9cbiAgZGVwdGh3aXNlQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgcG9pbnR3aXNlIGtlcm5lbCBtYXRyaXguXG4gICAqL1xuICBwb2ludHdpc2VDb25zdHJhaW50PzogQ29uc3RyYWludElkZW50aWZpZXJ8Q29uc3RyYWludDtcbn1cblxuZXhwb3J0IGNsYXNzIFNlcGFyYWJsZUNvbnYgZXh0ZW5kcyBDb252IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnU2VwYXJhYmxlQ29udic7XG5cbiAgcmVhZG9ubHkgZGVwdGhNdWx0aXBsaWVyOiBudW1iZXI7XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRlcHRod2lzZUluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXI7XG4gIHByb3RlY3RlZCByZWFkb25seSBkZXB0aHdpc2VSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGVwdGh3aXNlQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG4gIHByb3RlY3RlZCByZWFkb25seSBwb2ludHdpc2VJbml0aWFsaXplcj86IEluaXRpYWxpemVyO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9pbnR3aXNlUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcjtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvaW50d2lzZUNvbnN0cmFpbnQ/OiBDb25zdHJhaW50O1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfREVQVEhXSVNFX0lOSVRJQUxJWkVSOiBJbml0aWFsaXplcklkZW50aWZpZXIgPVxuICAgICAgJ2dsb3JvdFVuaWZvcm0nO1xuICByZWFkb25seSBERUZBVUxUX1BPSU5UV0lTRV9JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID1cbiAgICAgICdnbG9yb3RVbmlmb3JtJztcblxuICBwcm90ZWN0ZWQgZGVwdGh3aXNlS2VybmVsOiBMYXllclZhcmlhYmxlID0gbnVsbDtcbiAgcHJvdGVjdGVkIHBvaW50d2lzZUtlcm5lbDogTGF5ZXJWYXJpYWJsZSA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocmFuazogbnVtYmVyLCBjb25maWc/OiBTZXBhcmFibGVDb252TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIocmFuaywgY29uZmlnKTtcblxuICAgIGlmIChjb25maWcuZmlsdGVycyA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnVGhlIGBmaWx0ZXJzYCBjb25maWd1cmF0aW9uIGZpZWxkIGlzIHJlcXVpcmVkIGJ5IFNlcGFyYWJsZUNvbnYsICcgK1xuICAgICAgICAgICdidXQgaXMgdW5zcGVjaWZpZWQuJyk7XG4gICAgfVxuICAgIGlmIChjb25maWcua2VybmVsSW5pdGlhbGl6ZXIgIT0gbnVsbCB8fCBjb25maWcua2VybmVsUmVndWxhcml6ZXIgIT0gbnVsbCB8fFxuICAgICAgICBjb25maWcua2VybmVsQ29uc3RyYWludCAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnRmllbGRzIGtlcm5lbEluaXRpYWxpemVyLCBrZXJuZWxSZWd1bGFyaXplciBhbmQga2VybmVsQ29uc3RyYWludCAnICtcbiAgICAgICAgICAnYXJlIGludmFsaWQgZm9yIFNlcGFyYWJsZUNvbnYyRC4gVXNlIGRlcHRod2lzZUluaXRpYWxpemVyLCAnICtcbiAgICAgICAgICAnZGVwdGh3aXNlUmVndWxhcml6ZXIsIGRlcHRod2lzZUNvbnN0cmFpbnQsIHBvaW50d2lzZUluaXRpYWxpemVyLCAnICtcbiAgICAgICAgICAncG9pbnR3aXNlUmVndWxhcml6ZXIgYW5kIHBvaW50d2lzZUNvbnN0cmFpbnQgaW5zdGVhZC4nKTtcbiAgICB9XG4gICAgaWYgKGNvbmZpZy5wYWRkaW5nICE9IG51bGwgJiYgY29uZmlnLnBhZGRpbmcgIT09ICdzYW1lJyAmJlxuICAgICAgICBjb25maWcucGFkZGluZyAhPT0gJ3ZhbGlkJykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFNlcGFyYWJsZUNvbnYke3RoaXMucmFua31EIHN1cHBvcnRzIG9ubHkgcGFkZGluZyBtb2RlczogYCArXG4gICAgICAgICAgYCdzYW1lJyBhbmQgJ3ZhbGlkJywgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoY29uZmlnLnBhZGRpbmcpfWApO1xuICAgIH1cblxuICAgIHRoaXMuZGVwdGhNdWx0aXBsaWVyID1cbiAgICAgICAgY29uZmlnLmRlcHRoTXVsdGlwbGllciA9PSBudWxsID8gMSA6IGNvbmZpZy5kZXB0aE11bHRpcGxpZXI7XG4gICAgdGhpcy5kZXB0aHdpc2VJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKFxuICAgICAgICBjb25maWcuZGVwdGh3aXNlSW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX0RFUFRIV0lTRV9JTklUSUFMSVpFUik7XG4gICAgdGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGNvbmZpZy5kZXB0aHdpc2VSZWd1bGFyaXplcik7XG4gICAgdGhpcy5kZXB0aHdpc2VDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChjb25maWcuZGVwdGh3aXNlQ29uc3RyYWludCk7XG4gICAgdGhpcy5wb2ludHdpc2VJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKFxuICAgICAgICBjb25maWcuZGVwdGh3aXNlSW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX1BPSU5UV0lTRV9JTklUSUFMSVpFUik7XG4gICAgdGhpcy5wb2ludHdpc2VSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGNvbmZpZy5wb2ludHdpc2VSZWd1bGFyaXplcik7XG4gICAgdGhpcy5wb2ludHdpc2VDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChjb25maWcucG9pbnR3aXNlQ29uc3RyYWludCk7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBpZiAoaW5wdXRTaGFwZS5sZW5ndGggPCB0aGlzLnJhbmsgKyAyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgSW5wdXRzIHRvIFNlcGFyYWJsZUNvbnYke3RoaXMucmFua31EIHNob3VsZCBoYXZlIHJhbmsgYCArXG4gICAgICAgICAgYCR7dGhpcy5yYW5rICsgMn0sIGJ1dCByZWNlaXZlZCBpbnB1dCBzaGFwZTogYCArXG4gICAgICAgICAgYCR7SlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZSl9YCk7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxBeGlzID1cbiAgICAgICAgdGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcgPyAxIDogaW5wdXRTaGFwZS5sZW5ndGggLSAxO1xuICAgIGlmIChpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXSA9PSBudWxsIHx8IGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdIDwgMCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBjaGFubmVsIGRpbWVuc2lvbiBvZiB0aGUgaW5wdXRzIHNob3VsZCBiZSBkZWZpbmVkLCBgICtcbiAgICAgICAgICBgYnV0IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZVtjaGFubmVsQXhpc10pfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RGltID0gaW5wdXRTaGFwZVtjaGFubmVsQXhpc107XG4gICAgY29uc3QgZGVwdGh3aXNlS2VybmVsU2hhcGUgPVxuICAgICAgICB0aGlzLmtlcm5lbFNpemUuY29uY2F0KFtpbnB1dERpbSwgdGhpcy5kZXB0aE11bHRpcGxpZXJdKTtcbiAgICBjb25zdCBwb2ludHdpc2VLZXJuZWxTaGFwZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5rOyArK2kpIHtcbiAgICAgIHBvaW50d2lzZUtlcm5lbFNoYXBlLnB1c2goMSk7XG4gICAgfVxuICAgIHBvaW50d2lzZUtlcm5lbFNoYXBlLnB1c2goaW5wdXREaW0gKiB0aGlzLmRlcHRoTXVsdGlwbGllciwgdGhpcy5maWx0ZXJzKTtcblxuICAgIGNvbnN0IHRyYWluYWJsZSA9IHRydWU7XG4gICAgdGhpcy5kZXB0aHdpc2VLZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2RlcHRod2lzZV9rZXJuZWwnLCBkZXB0aHdpc2VLZXJuZWxTaGFwZSwgJ2Zsb2F0MzInLFxuICAgICAgICB0aGlzLmRlcHRod2lzZUluaXRpYWxpemVyLCB0aGlzLmRlcHRod2lzZVJlZ3VsYXJpemVyLCB0cmFpbmFibGUsXG4gICAgICAgIHRoaXMuZGVwdGh3aXNlQ29uc3RyYWludCk7XG4gICAgdGhpcy5wb2ludHdpc2VLZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ3BvaW50d2lzZV9rZXJuZWwnLCBwb2ludHdpc2VLZXJuZWxTaGFwZSwgJ2Zsb2F0MzInLFxuICAgICAgICB0aGlzLnBvaW50d2lzZUluaXRpYWxpemVyLCB0aGlzLnBvaW50d2lzZVJlZ3VsYXJpemVyLCB0cmFpbmFibGUsXG4gICAgICAgIHRoaXMucG9pbnR3aXNlQ29uc3RyYWludCk7XG4gICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgdGhpcy5iaWFzID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JpYXMnLCBbdGhpcy5maWx0ZXJzXSwgJ2Zsb2F0MzInLCB0aGlzLmJpYXNJbml0aWFsaXplcixcbiAgICAgICAgICB0aGlzLmJpYXNSZWd1bGFyaXplciwgdHJhaW5hYmxlLCB0aGlzLmJpYXNDb25zdHJhaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWFzID0gbnVsbDtcbiAgICB9XG5cbiAgICB0aGlzLmlucHV0U3BlYyA9XG4gICAgICAgIFtuZXcgSW5wdXRTcGVjKHtuZGltOiB0aGlzLnJhbmsgKyAyLCBheGVzOiB7W2NoYW5uZWxBeGlzXTogaW5wdXREaW19fSldO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcblxuICAgICAgbGV0IG91dHB1dDogVGVuc29yO1xuICAgICAgaWYgKHRoaXMucmFuayA9PT0gMSkge1xuICAgICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAgICcxRCBzZXBhcmFibGUgY29udm9sdXRpb24gaXMgbm90IGltcGxlbWVudGVkIHlldC4nKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5yYW5rID09PSAyKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgICAgIGlucHV0cyA9IHRmYy50cmFuc3Bvc2UoaW5wdXRzLCBbMCwgMiwgMywgMV0pOyAgLy8gTkNIVyAtPiBOSFdDLlxuICAgICAgICB9XG5cbiAgICAgICAgb3V0cHV0ID0gdGZjLnNlcGFyYWJsZUNvbnYyZChcbiAgICAgICAgICAgIGlucHV0cyBhcyBUZW5zb3I0RCwgdGhpcy5kZXB0aHdpc2VLZXJuZWwucmVhZCgpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgdGhpcy5wb2ludHdpc2VLZXJuZWwucmVhZCgpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgdGhpcy5zdHJpZGVzIGFzIFtudW1iZXIsIG51bWJlcl0sIHRoaXMucGFkZGluZyBhcyAnc2FtZScgfCAndmFsaWQnLFxuICAgICAgICAgICAgdGhpcy5kaWxhdGlvblJhdGUgYXMgW251bWJlciwgbnVtYmVyXSwgJ05IV0MnKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgICBvdXRwdXQgPSBLLmJpYXNBZGQob3V0cHV0LCB0aGlzLmJpYXMucmVhZCgpLCB0aGlzLmRhdGFGb3JtYXQpO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuYWN0aXZhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgIG91dHB1dCA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseShvdXRwdXQpO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgICAgb3V0cHV0ID0gdGZjLnRyYW5zcG9zZShvdXRwdXQsIFswLCAzLCAxLCAyXSk7ICAvLyBOSFdDIC0+IE5DSFcuXG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1sncmFuayddO1xuICAgIGRlbGV0ZSBjb25maWdbJ2tlcm5lbEluaXRpYWxpemVyJ107XG4gICAgZGVsZXRlIGNvbmZpZ1sna2VybmVsUmVndWxhcml6ZXInXTtcbiAgICBkZWxldGUgY29uZmlnWydrZXJuZWxDb25zdHJhaW50J107XG4gICAgY29uZmlnWydkZXB0aHdpc2VJbml0aWFsaXplciddID1cbiAgICAgICAgc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5kZXB0aHdpc2VJbml0aWFsaXplcik7XG4gICAgY29uZmlnWydwb2ludHdpc2VJbml0aWFsaXplciddID1cbiAgICAgICAgc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5wb2ludHdpc2VJbml0aWFsaXplcik7XG4gICAgY29uZmlnWydkZXB0aHdpc2VSZWd1bGFyaXplciddID1cbiAgICAgICAgc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplcik7XG4gICAgY29uZmlnWydwb2ludHdpc2VSZWd1bGFyaXplciddID1cbiAgICAgICAgc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5wb2ludHdpc2VSZWd1bGFyaXplcik7XG4gICAgY29uZmlnWydkZXB0aHdpc2VDb25zdHJhaW50J10gPVxuICAgICAgICBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMuZGVwdGh3aXNlQ29uc3RyYWludCk7XG4gICAgY29uZmlnWydwb2ludHdpc2VDb25zdHJhaW50J10gPVxuICAgICAgICBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucG9pbnR3aXNlQ29uc3RyYWludCk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgU2VwYXJhYmxlQ29udjJEIGV4dGVuZHMgU2VwYXJhYmxlQ29udiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NlcGFyYWJsZUNvbnYyRCc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBTZXBhcmFibGVDb252TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoMiwgYXJncyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTZXBhcmFibGVDb252MkQpO1xuXG5leHBvcnQgY2xhc3MgQ29udjFEIGV4dGVuZHMgQ29udiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0NvbnYxRCc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgICBzdXBlcigxLCBhcmdzKTtcbiAgICBDb252MUQudmVyaWZ5QXJncyhhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bmRpbTogM31dO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgZGVsZXRlIGNvbmZpZ1sncmFuayddO1xuICAgIGRlbGV0ZSBjb25maWdbJ2RhdGFGb3JtYXQnXTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgcHJvdGVjdGVkIHN0YXRpYyB2ZXJpZnlBcmdzKGFyZ3M6IENvbnZMYXllckFyZ3MpIHtcbiAgICAvLyBjb25maWcua2VybmVsU2l6ZSBtdXN0IGJlIGEgbnVtYmVyIG9yIGFycmF5IG9mIG51bWJlcnMuXG4gICAgaWYgKHR5cGVvZiBhcmdzLmtlcm5lbFNpemUgIT09ICdudW1iZXInICYmXG4gICAgICAgICFnZW5lcmljX3V0aWxzLmNoZWNrQXJyYXlUeXBlQW5kTGVuZ3RoKFxuICAgICAgICAgICAgYXJncy5rZXJuZWxTaXplLCAnbnVtYmVyJywgMSwgMSkpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBDb252MUQgZXhwZWN0cyBjb25maWcua2VybmVsU2l6ZSB0byBiZSBudW1iZXIgb3IgbnVtYmVyW10gd2l0aCBgICtcbiAgICAgICAgICBgbGVuZ3RoIDEsIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KGFyZ3Mua2VybmVsU2l6ZSl9LmApO1xuICAgIH1cbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnYxRCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDcm9wcGluZzJETGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIERpbWVuc2lvbiBvZiB0aGUgY3JvcHBpbmcgYWxvbmcgdGhlIHdpZHRoIGFuZCB0aGUgaGVpZ2h0LlxuICAgKiAtIElmIGludGVnZXI6IHRoZSBzYW1lIHN5bW1ldHJpYyBjcm9wcGluZ1xuICAgKiAgaXMgYXBwbGllZCB0byB3aWR0aCBhbmQgaGVpZ2h0LlxuICAgKiAtIElmIGxpc3Qgb2YgMiBpbnRlZ2VyczpcbiAgICogICBpbnRlcnByZXRlZCBhcyB0d28gZGlmZmVyZW50XG4gICAqICAgc3ltbWV0cmljIGNyb3BwaW5nIHZhbHVlcyBmb3IgaGVpZ2h0IGFuZCB3aWR0aDpcbiAgICogICBgW3N5bW1ldHJpY19oZWlnaHRfY3JvcCwgc3ltbWV0cmljX3dpZHRoX2Nyb3BdYC5cbiAgICogLSBJZiBhIGxpc3Qgb2YgMiBsaXN0cyBvZiAyIGludGVnZXJzOlxuICAgKiAgIGludGVycHJldGVkIGFzXG4gICAqICAgYFtbdG9wX2Nyb3AsIGJvdHRvbV9jcm9wXSwgW2xlZnRfY3JvcCwgcmlnaHRfY3JvcF1dYFxuICAgKi9cbiAgY3JvcHBpbmc6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdfFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcblxuICAvKipcbiAgICogRm9ybWF0IG9mIHRoZSBkYXRhLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBvcmRlcmluZyBvZiB0aGUgZGltZW5zaW9ucyBpblxuICAgKiB0aGUgaW5wdXRzLlxuICAgKlxuICAgKiBgY2hhbm5lbHNfbGFzdGAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogICBgKGJhdGNoLCAuLi4sIGNoYW5uZWxzKWBcbiAgICpcbiAgICogYGNoYW5uZWxzX2ZpcnN0YCBjb3JyZXNwb25kcyB0byBpbnB1dHMgd2l0aCBzaGFwZVxuICAgKiAgIGAoYmF0Y2gsIGNoYW5uZWxzLCAuLi4pYFxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgY2hhbm5lbHNfbGFzdGAuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbn1cblxuZXhwb3J0IGNsYXNzIENyb3BwaW5nMkQgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0Nyb3BwaW5nMkQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY3JvcHBpbmc6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ3JvcHBpbmcyRExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIGlmICh0eXBlb2YgYXJncy5jcm9wcGluZyA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY3JvcHBpbmcgPVxuICAgICAgICAgIFtbYXJncy5jcm9wcGluZywgYXJncy5jcm9wcGluZ10sIFthcmdzLmNyb3BwaW5nLCBhcmdzLmNyb3BwaW5nXV07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJncy5jcm9wcGluZ1swXSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY3JvcHBpbmcgPSBbXG4gICAgICAgIFthcmdzLmNyb3BwaW5nWzBdLCBhcmdzLmNyb3BwaW5nWzBdXSxcbiAgICAgICAgW2FyZ3MuY3JvcHBpbmdbMV0gYXMgbnVtYmVyLCBhcmdzLmNyb3BwaW5nWzFdIGFzIG51bWJlcl1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuY3JvcHBpbmcgPSBhcmdzLmNyb3BwaW5nIGFzIFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcbiAgICB9XG4gICAgdGhpcy5kYXRhRm9ybWF0ID1cbiAgICAgICAgYXJncy5kYXRhRm9ybWF0ID09PSB1bmRlZmluZWQgPyAnY2hhbm5lbHNMYXN0JyA6IGFyZ3MuZGF0YUZvcm1hdDtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bmRpbTogNH1dO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlKTogU2hhcGUge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgcmV0dXJuIFtcbiAgICAgICAgaW5wdXRTaGFwZVswXSwgaW5wdXRTaGFwZVsxXSxcbiAgICAgICAgaW5wdXRTaGFwZVsyXSAtIHRoaXMuY3JvcHBpbmdbMF1bMF0gLSB0aGlzLmNyb3BwaW5nWzBdWzFdLFxuICAgICAgICBpbnB1dFNoYXBlWzNdIC0gdGhpcy5jcm9wcGluZ1sxXVswXSAtIHRoaXMuY3JvcHBpbmdbMV1bMV1cbiAgICAgIF07XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbXG4gICAgICAgIGlucHV0U2hhcGVbMF0sXG4gICAgICAgIGlucHV0U2hhcGVbMV0gLSB0aGlzLmNyb3BwaW5nWzBdWzBdIC0gdGhpcy5jcm9wcGluZ1swXVsxXSxcbiAgICAgICAgaW5wdXRTaGFwZVsyXSAtIHRoaXMuY3JvcHBpbmdbMV1bMF0gLSB0aGlzLmNyb3BwaW5nWzFdWzFdLCBpbnB1dFNoYXBlWzNdXG4gICAgICBdO1xuICAgIH1cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpbnB1dHMgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG5cbiAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIGNvbnN0IGhTbGljZWQgPSBLLnNsaWNlQWxvbmdBeGlzKFxuICAgICAgICAgICAgaW5wdXRzLCB0aGlzLmNyb3BwaW5nWzBdWzBdLFxuICAgICAgICAgICAgaW5wdXRzLnNoYXBlWzFdIC0gdGhpcy5jcm9wcGluZ1swXVswXSAtIHRoaXMuY3JvcHBpbmdbMF1bMV0sIDIpO1xuICAgICAgICByZXR1cm4gSy5zbGljZUFsb25nQXhpcyhcbiAgICAgICAgICAgIGhTbGljZWQsIHRoaXMuY3JvcHBpbmdbMV1bMF0sXG4gICAgICAgICAgICBpbnB1dHMuc2hhcGVbMl0gLSB0aGlzLmNyb3BwaW5nWzFdWzFdIC0gdGhpcy5jcm9wcGluZ1sxXVswXSwgMyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBoU2xpY2VkID0gSy5zbGljZUFsb25nQXhpcyhcbiAgICAgICAgICAgIGlucHV0cywgdGhpcy5jcm9wcGluZ1swXVswXSxcbiAgICAgICAgICAgIGlucHV0cy5zaGFwZVsyXSAtIHRoaXMuY3JvcHBpbmdbMF1bMF0gLSB0aGlzLmNyb3BwaW5nWzBdWzFdLCAzKTtcbiAgICAgICAgcmV0dXJuIEsuc2xpY2VBbG9uZ0F4aXMoXG4gICAgICAgICAgICBoU2xpY2VkLCB0aGlzLmNyb3BwaW5nWzFdWzBdLFxuICAgICAgICAgICAgaW5wdXRzLnNoYXBlWzNdIC0gdGhpcy5jcm9wcGluZ1sxXVsxXSAtIHRoaXMuY3JvcHBpbmdbMV1bMF0sIDQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0ge2Nyb3BwaW5nOiB0aGlzLmNyb3BwaW5nLCBkYXRhRm9ybWF0OiB0aGlzLmRhdGFGb3JtYXR9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENyb3BwaW5nMkQpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgVXBTYW1wbGluZzJETGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIFRoZSB1cHNhbXBsaW5nIGZhY3RvcnMgZm9yIHJvd3MgYW5kIGNvbHVtbnMuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGBbMiwgMl1gLlxuICAgKi9cbiAgc2l6ZT86IG51bWJlcltdO1xuICAvKipcbiAgICogRm9ybWF0IG9mIHRoZSBkYXRhLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBvcmRlcmluZyBvZiB0aGUgZGltZW5zaW9ucyBpblxuICAgKiB0aGUgaW5wdXRzLlxuICAgKlxuICAgKiBgXCJjaGFubmVsc0xhc3RcImAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogICBgW2JhdGNoLCAuLi4sIGNoYW5uZWxzXWBcbiAgICpcbiAgICogIGBcImNoYW5uZWxzRmlyc3RcImAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGUgYFtiYXRjaCwgY2hhbm5lbHMsXG4gICAqIC4uLl1gLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBgXCJjaGFubmVsc0xhc3RcImAuXG4gICAqL1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbiAgLyoqXG4gICAqIFRoZSBpbnRlcnBvbGF0aW9uIG1lY2hhbmlzbSwgb25lIG9mIGBcIm5lYXJlc3RcImAgb3IgYFwiYmlsaW5lYXJcImAsIGRlZmF1bHRcbiAgICogdG8gYFwibmVhcmVzdFwiYC5cbiAgICovXG4gIGludGVycG9sYXRpb24/OiBJbnRlcnBvbGF0aW9uRm9ybWF0O1xufVxuXG5leHBvcnQgY2xhc3MgVXBTYW1wbGluZzJEIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdVcFNhbXBsaW5nMkQnO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgREVGQVVMVF9TSVpFID0gWzIsIDJdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc2l6ZTogbnVtYmVyW107XG4gIHByb3RlY3RlZCByZWFkb25seSBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0O1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGlvbkZvcm1hdDtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBVcFNhbXBsaW5nMkRMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bmRpbTogNH1dO1xuICAgIHRoaXMuc2l6ZSA9IGFyZ3Muc2l6ZSA9PSBudWxsID8gdGhpcy5ERUZBVUxUX1NJWkUgOiBhcmdzLnNpemU7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID1cbiAgICAgICAgYXJncy5kYXRhRm9ybWF0ID09IG51bGwgPyAnY2hhbm5lbHNMYXN0JyA6IGFyZ3MuZGF0YUZvcm1hdDtcbiAgICBjaGVja0RhdGFGb3JtYXQodGhpcy5kYXRhRm9ybWF0KTtcbiAgICB0aGlzLmludGVycG9sYXRpb24gPVxuICAgICAgICBhcmdzLmludGVycG9sYXRpb24gPT0gbnVsbCA/ICduZWFyZXN0JyA6IGFyZ3MuaW50ZXJwb2xhdGlvbjtcbiAgICBjaGVja0ludGVycG9sYXRpb25Gb3JtYXQodGhpcy5pbnRlcnBvbGF0aW9uKTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIGNvbnN0IGhlaWdodCA9XG4gICAgICAgICAgaW5wdXRTaGFwZVsyXSA9PSBudWxsID8gbnVsbCA6IHRoaXMuc2l6ZVswXSAqIGlucHV0U2hhcGVbMl07XG4gICAgICBjb25zdCB3aWR0aCA9IGlucHV0U2hhcGVbM10gPT0gbnVsbCA/IG51bGwgOiB0aGlzLnNpemVbMV0gKiBpbnB1dFNoYXBlWzNdO1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBpbnB1dFNoYXBlWzFdLCBoZWlnaHQsIHdpZHRoXTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgaGVpZ2h0ID1cbiAgICAgICAgICBpbnB1dFNoYXBlWzFdID09IG51bGwgPyBudWxsIDogdGhpcy5zaXplWzBdICogaW5wdXRTaGFwZVsxXTtcbiAgICAgIGNvbnN0IHdpZHRoID0gaW5wdXRTaGFwZVsyXSA9PSBudWxsID8gbnVsbCA6IHRoaXMuc2l6ZVsxXSAqIGlucHV0U2hhcGVbMl07XG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIGhlaWdodCwgd2lkdGgsIGlucHV0U2hhcGVbM11dO1xuICAgIH1cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgbGV0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpIGFzIFRlbnNvcjREO1xuICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuXG4gICAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgICAgaW5wdXQgPSB0ZmMudHJhbnNwb3NlKGlucHV0LCBbMCwgMiwgMywgMV0pO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0aGlzLnNpemVbMF0gKiBpbnB1dFNoYXBlWzJdO1xuICAgICAgICBjb25zdCB3aWR0aCA9IHRoaXMuc2l6ZVsxXSAqIGlucHV0U2hhcGVbM107XG5cbiAgICAgICAgY29uc3QgcmVzaXplZCA9IHRoaXMuaW50ZXJwb2xhdGlvbiA9PT0gJ25lYXJlc3QnID9cbiAgICAgICAgICAgIHRmYy5pbWFnZS5yZXNpemVOZWFyZXN0TmVpZ2hib3IoaW5wdXQsIFtoZWlnaHQsIHdpZHRoXSkgOlxuICAgICAgICAgICAgdGZjLmltYWdlLnJlc2l6ZUJpbGluZWFyKGlucHV0LCBbaGVpZ2h0LCB3aWR0aF0pO1xuICAgICAgICByZXR1cm4gdGZjLnRyYW5zcG9zZShyZXNpemVkLCBbMCwgMywgMSwgMl0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaGVpZ2h0ID0gdGhpcy5zaXplWzBdICogaW5wdXRTaGFwZVsxXTtcbiAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLnNpemVbMV0gKiBpbnB1dFNoYXBlWzJdO1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcnBvbGF0aW9uID09PSAnbmVhcmVzdCcgP1xuICAgICAgICAgICAgdGZjLmltYWdlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvcihpbnB1dCwgW2hlaWdodCwgd2lkdGhdKSA6XG4gICAgICAgICAgICB0ZmMuaW1hZ2UucmVzaXplQmlsaW5lYXIoaW5wdXQsIFtoZWlnaHQsIHdpZHRoXSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICAgIHNpemU6IHRoaXMuc2l6ZSwgXG4gICAgICAgIGRhdGFGb3JtYXQ6IHRoaXMuZGF0YUZvcm1hdCwgXG4gICAgICAgIGludGVycG9sYXRpb246IHRoaXMuaW50ZXJwb2xhdGlvblxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoVXBTYW1wbGluZzJEKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Depthwise Convolutional Layers\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { imageDataFormat } from '../backend/common';\nimport * as K from '../backend/tfjs_backend';\nimport { checkDataFormat } from '../common';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { convOutputLength } from '../utils/conv_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nimport { BaseConv, preprocessConv2DInput } from './convolutional';\n/**\n * 2D convolution with separable filters.\n * @param x Input tensor.\n * @param depthwiseKernel Convolution kernel for depthwise convolution.\n * @param strides Strides (Array of two integers).\n * @param padding Padding model.\n * @param dataFormat Data format.\n * @param dilationRate Array of two integers, dilation rates for the separable\n *   convolution.\n * @returns Output tensor.\n * @throws ValueError If depthwiseKernel is not a 4D array.\n */\nexport function depthwiseConv2d(x, depthwiseKernel, strides = [1, 1], padding = 'valid', dataFormat, dilationRate) {\n    return tidy(() => {\n        if (dataFormat == null) {\n            dataFormat = imageDataFormat();\n        }\n        checkDataFormat(dataFormat);\n        let y = preprocessConv2DInput(x, dataFormat);\n        if (x.rank !== 4) {\n            throw new ValueError(`Input for depthwiseConv2d is required to be 4-D, but is instead ` +\n                `${x.rank}-D`);\n        }\n        if (depthwiseKernel.rank !== 4) {\n            throw new ValueError(`depthwiseKernel is required to be 4-D, but is instead ` +\n                `${depthwiseKernel.rank}-D`);\n        }\n        y = tfc.depthwiseConv2d(y, depthwiseKernel, strides, padding === 'same' ? 'same' : 'valid', 'NHWC', dilationRate);\n        if (dataFormat === 'channelsFirst') {\n            y = tfc.transpose(y, [0, 3, 1, 2]);\n        }\n        return y;\n    });\n}\nexport class DepthwiseConv2D extends BaseConv {\n    constructor(args) {\n        super(2, args);\n        this.depthwiseKernel = null;\n        this.depthMultiplier =\n            args.depthMultiplier == null ? 1 : args.depthMultiplier;\n        this.depthwiseInitializer = getInitializer(args.depthwiseInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n        this.depthwiseConstraint = getConstraint(args.depthwiseConstraint);\n        this.depthwiseRegularizer = getRegularizer(args.depthwiseRegularizer);\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        if (inputShape.length < 4) {\n            throw new ValueError(`Inputs to DepthwiseConv2D should have rank 4. ` +\n                `Received input shape: ${JSON.stringify(inputShape)}.`);\n        }\n        const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : 3;\n        if (inputShape[channelAxis] == null || inputShape[channelAxis] < 0) {\n            throw new ValueError('The channel dimension of the inputs to DepthwiseConv2D should ' +\n                `be defined, but is not (${inputShape[channelAxis]}).`);\n        }\n        const inputDim = inputShape[channelAxis];\n        const depthwiseKernelShape = [\n            this.kernelSize[0], this.kernelSize[1], inputDim, this.depthMultiplier\n        ];\n        this.depthwiseKernel = this.addWeight('depthwise_kernel', depthwiseKernelShape, null, this.depthwiseInitializer, this.depthwiseRegularizer, true, this.depthwiseConstraint);\n        if (this.useBias) {\n            this.bias = this.addWeight('bias', [inputDim * this.depthMultiplier], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n        }\n        else {\n            this.bias = null;\n        }\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = getExactlyOneTensor(inputs);\n            let outputs = depthwiseConv2d(inputs, this.depthwiseKernel.read(), this.strides, this.padding, this.dataFormat, null);\n            // TODO(cais): Add support for dilation.\n            if (this.useBias) {\n                outputs = K.biasAdd(outputs, this.bias.read(), this.dataFormat);\n            }\n            if (this.activation != null) {\n                outputs = this.activation.apply(outputs);\n            }\n            return outputs;\n        });\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const rows = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n        const cols = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n        const outFilters = this.dataFormat === 'channelsFirst' ?\n            inputShape[1] * this.depthMultiplier :\n            inputShape[3] * this.depthMultiplier;\n        const outRows = convOutputLength(rows, this.kernelSize[0], this.padding, this.strides[0]);\n        const outCols = convOutputLength(cols, this.kernelSize[1], this.padding, this.strides[1]);\n        if (this.dataFormat === 'channelsFirst') {\n            return [inputShape[0], outFilters, outRows, outCols];\n        }\n        else {\n            // In this case, assume 'channelsLast'.\n            return [inputShape[0], outRows, outCols, outFilters];\n        }\n    }\n    getConfig() {\n        const config = super.getConfig();\n        config['depthMultiplier'] = this.depthMultiplier;\n        config['depthwiseInitializer'] =\n            serializeInitializer(this.depthwiseInitializer);\n        config['depthwiseRegularizer'] =\n            serializeRegularizer(this.depthwiseRegularizer);\n        config['depthwiseConstraint'] =\n            serializeConstraint(this.depthwiseRegularizer);\n        return config;\n    }\n}\n/** @nocollapse */\nDepthwiseConv2D.className = 'DepthwiseConv2D';\nserialization.registerClass(DepthwiseConv2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb25hbF9kZXB0aHdpc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL2NvbnZvbHV0aW9uYWxfZGVwdGh3aXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQW9CLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTVFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNsRCxPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDMUMsT0FBTyxFQUFtQyxhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3JDLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxFQUFDLGNBQWMsRUFBc0Msb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUV6RyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUc3RSxPQUFPLEVBQUMsUUFBUSxFQUFvQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRWxHOzs7Ozs7Ozs7OztHQVdHO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsQ0FBUyxFQUFFLGVBQXVCLEVBQUUsVUFBNEIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQ3RFLE9BQU8sR0FBRyxPQUFPLEVB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Q0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsRUFBRTtZQUN2QyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7U0FDdEQ7YUFBTTtZQUNMLHVDQUF1QztZQUN2QyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDdEQ7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1FBQ2pELE1BQU0sQ0FBQyxzQkFBc0IsQ0FBQztZQUMxQixvQkFBb0IsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsQ0FBQztRQUNwRCxNQUFNLENBQUMsc0JBQXNCLENBQUM7WUFDMUIsb0JBQW9CLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFDcEQsTUFBTSxDQUFDLHFCQUFxQixDQUFDO1lBQ3pCLG1CQUFtQixDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBQ25ELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBbkdELGtCQUFrQjtBQUNYLHlCQUFTLEdBQUcsaUJBQWlCLENBQUM7QUFvR3ZDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBEZXB0aHdpc2UgQ29udm9sdXRpb25hbCBMYXllcnNcbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7c2VyaWFsaXphdGlvbiwgVGVuc29yLCBUZW5zb3I0RCwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtpbWFnZURhdGFGb3JtYXR9IGZyb20gJy4uL2JhY2tlbmQvY29tbW9uJztcbmltcG9ydCAqIGFzIEsgZnJvbSAnLi4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtjaGVja0RhdGFGb3JtYXR9IGZyb20gJy4uL2NvbW1vbic7XG5pbXBvcnQge0NvbnN0cmFpbnQsIENvbnN0cmFpbnRJZGVudGlmaWVyLCBnZXRDb25zdHJhaW50LCBzZXJpYWxpemVDb25zdHJhaW50fSBmcm9tICcuLi9jb25zdHJhaW50cyc7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2dldEluaXRpYWxpemVyLCBJbml0aWFsaXplciwgSW5pdGlhbGl6ZXJJZGVudGlmaWVyLCBzZXJpYWxpemVJbml0aWFsaXplcn0gZnJvbSAnLi4vaW5pdGlhbGl6ZXJzJztcbmltcG9ydCB7RGF0YUZvcm1hdCwgU2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtnZXRSZWd1bGFyaXplciwgUmVndWxhcml6ZXIsIFJlZ3VsYXJpemVySWRlbnRpZmllciwgc2VyaWFsaXplUmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtjb252T3V0cHV0TGVuZ3RofSBmcm9tICcuLi91dGlscy9jb252X3V0aWxzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlLCBnZXRFeGFjdGx5T25lVGVuc29yfSBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5pbXBvcnQge0xheWVyVmFyaWFibGV9IGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5cbmltcG9ydCB7QmFzZUNvbnYsIEJhc2VDb252TGF5ZXJBcmdzLCBDb252TGF5ZXJBcmdzLCBwcmVwcm9jZXNzQ29udjJESW5wdXR9IGZyb20gJy4vY29udm9sdXRpb25hbCc7XG5cbi8qKlxuICogMkQgY29udm9sdXRpb24gd2l0aCBzZXBhcmFibGUgZmlsdGVycy5cbiAqIEBwYXJhbSB4IElucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBkZXB0aHdpc2VLZXJuZWwgQ29udm9sdXRpb24ga2VybmVsIGZvciBkZXB0aHdpc2UgY29udm9sdXRpb24uXG4gKiBAcGFyYW0gc3RyaWRlcyBTdHJpZGVzIChBcnJheSBvZiB0d28gaW50ZWdlcnMpLlxuICogQHBhcmFtIHBhZGRpbmcgUGFkZGluZyBtb2RlbC5cbiAqIEBwYXJhbSBkYXRhRm9ybWF0IERhdGEgZm9ybWF0LlxuICogQHBhcmFtIGRpbGF0aW9uUmF0ZSBBcnJheSBvZiB0d28gaW50ZWdlcnMsIGRpbGF0aW9uIHJhdGVzIGZvciB0aGUgc2VwYXJhYmxlXG4gKiAgIGNvbnZvbHV0aW9uLlxuICogQHJldHVybnMgT3V0cHV0IHRlbnNvci5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvciBJZiBkZXB0aHdpc2VLZXJuZWwgaXMgbm90IGEgNEQgYXJyYXkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmQoXG4gICAgeDogVGVuc29yLCBkZXB0aHdpc2VLZXJuZWw6IFRlbnNvciwgc3RyaWRlczogW251bWJlciwgbnVtYmVyXSA9IFsxLCAxXSxcbiAgICBwYWRkaW5nID0gJ3ZhbGlkJywgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQsXG4gICAgZGlsYXRpb25SYXRlPzogW251bWJlciwgbnVtYmVyXSk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBsZXQgeSA9IHByZXByb2Nlc3NDb252MkRJbnB1dCh4LCBkYXRhRm9ybWF0KTtcbiAgICBpZiAoeC5yYW5rICE9PSA0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgSW5wdXQgZm9yIGRlcHRod2lzZUNvbnYyZCBpcyByZXF1aXJlZCB0byBiZSA0LUQsIGJ1dCBpcyBpbnN0ZWFkIGAgK1xuICAgICAgICAgIGAke3gucmFua30tRGApO1xuICAgIH1cbiAgICBpZiAoZGVwdGh3aXNlS2VybmVsLnJhbmsgIT09IDQpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBkZXB0aHdpc2VLZXJuZWwgaXMgcmVxdWlyZWQgdG8gYmUgNC1ELCBidXQgaXMgaW5zdGVhZCBgICtcbiAgICAgICAgICBgJHtkZXB0aHdpc2VLZXJuZWwucmFua30tRGApO1xuICAgIH1cbiAgICB5ID0gdGZjLmRlcHRod2lzZUNvbnYyZChcbiAgICAgICAgeSBhcyBUZW5zb3I0RCwgZGVwdGh3aXNlS2VybmVsIGFzIFRlbnNvcjRELCBzdHJpZGVzLFxuICAgICAgICBwYWRkaW5nID09PSAnc2FtZScgPyAnc2FtZScgOiAndmFsaWQnLCAnTkhXQycsIGRpbGF0aW9uUmF0ZSk7XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgeSA9IHRmYy50cmFuc3Bvc2UoeSwgWzAsIDMsIDEsIDJdKTtcbiAgICB9XG4gICAgcmV0dXJuIHk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRGVwdGh3aXNlQ29udjJETGF5ZXJBcmdzIGV4dGVuZHMgQmFzZUNvbnZMYXllckFyZ3Mge1xuICAvKipcbiAgICogQW4gaW50ZWdlciBvciBBcnJheSBvZiAyIGludGVnZXJzLCBzcGVjaWZ5aW5nIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZVxuICAgKiAyRCBjb252b2x1dGlvbiB3aW5kb3cuIENhbiBiZSBhIHNpbmdsZSBpbnRlZ2VyIHRvIHNwZWNpZnkgdGhlIHNhbWUgdmFsdWVcbiAgICogZm9yIGFsbCBzcGF0aWFsIGRpbWVuc2lvbnMuXG4gICAqL1xuICBrZXJuZWxTaXplOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBkZXB0aHdpc2UgY29udm9sdXRpb24gb3V0cHV0IGNoYW5uZWxzIGZvciBlYWNoIGlucHV0XG4gICAqIGNoYW5uZWwuXG4gICAqIFRoZSB0b3RhbCBudW1iZXIgb2YgZGVwdGh3aXNlIGNvbnZvbHV0aW9uIG91dHB1dCBjaGFubmVscyB3aWxsIGJlIGVxdWFsIHRvXG4gICAqIGBmaWx0ZXJzSW4gKiBkZXB0aE11bHRpcGxpZXJgLlxuICAgKiBEZWZhdWx0OiAxLlxuICAgKi9cbiAgZGVwdGhNdWx0aXBsaWVyPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGRlcHRod2lzZSBrZXJuZWwgbWF0cml4LlxuICAgKiBEZWZhdWx0OiBHbG9yb3ROb3JtYWwuXG4gICAqL1xuICBkZXB0aHdpc2VJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGRlcHRod2lzZSBrZXJuZWwgbWF0cml4LlxuICAgKi9cbiAgZGVwdGh3aXNlQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZ1bmN0aW9uIGZvciB0aGUgZGVwdGh3aXNlIGtlcm5lbCBtYXRyaXguXG4gICAqL1xuICBkZXB0aHdpc2VSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcbn1cblxuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnYyRCBleHRlbmRzIEJhc2VDb252IHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRGVwdGh3aXNlQ29udjJEJztcbiAgcHJpdmF0ZSByZWFkb25seSBkZXB0aE11bHRpcGxpZXI6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXB0aHdpc2VJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZGVwdGh3aXNlQ29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXB0aHdpc2VSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG5cbiAgcHJpdmF0ZSBkZXB0aHdpc2VLZXJuZWw6IExheWVyVmFyaWFibGUgPSBudWxsO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IERlcHRod2lzZUNvbnYyRExheWVyQXJncykge1xuICAgIHN1cGVyKDIsIGFyZ3MgYXMgQ29udkxheWVyQXJncyk7XG4gICAgdGhpcy5kZXB0aE11bHRpcGxpZXIgPVxuICAgICAgICBhcmdzLmRlcHRoTXVsdGlwbGllciA9PSBudWxsID8gMSA6IGFyZ3MuZGVwdGhNdWx0aXBsaWVyO1xuICAgIHRoaXMuZGVwdGh3aXNlSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5kZXB0aHdpc2VJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmRlcHRod2lzZUNvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MuZGVwdGh3aXNlQ29uc3RyYWludCk7XG4gICAgdGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuZGVwdGh3aXNlUmVndWxhcml6ZXIpO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgaWYgKGlucHV0U2hhcGUubGVuZ3RoIDwgNCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYElucHV0cyB0byBEZXB0aHdpc2VDb252MkQgc2hvdWxkIGhhdmUgcmFuayA0LiBgICtcbiAgICAgICAgICBgUmVjZWl2ZWQgaW5wdXQgc2hhcGU6ICR7SlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZSl9LmApO1xuICAgIH1cbiAgICBjb25zdCBjaGFubmVsQXhpcyA9IHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnID8gMSA6IDM7XG4gICAgaWYgKGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdID09IG51bGwgfHwgaW5wdXRTaGFwZVtjaGFubmVsQXhpc10gPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnVGhlIGNoYW5uZWwgZGltZW5zaW9uIG9mIHRoZSBpbnB1dHMgdG8gRGVwdGh3aXNlQ29udjJEIHNob3VsZCAnICtcbiAgICAgICAgICBgYmUgZGVmaW5lZCwgYnV0IGlzIG5vdCAoJHtpbnB1dFNoYXBlW2NoYW5uZWxBeGlzXX0pLmApO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dERpbSA9IGlucHV0U2hhcGVbY2hhbm5lbEF4aXNdO1xuICAgIGNvbnN0IGRlcHRod2lzZUtlcm5lbFNoYXBlOiBTaGFwZSA9IFtcbiAgICAgIHRoaXMua2VybmVsU2l6ZVswXSwgdGhpcy5rZXJuZWxTaXplWzFdLCBpbnB1dERpbSwgdGhpcy5kZXB0aE11bHRpcGxpZXJcbiAgICBdO1xuXG4gICAgdGhpcy5kZXB0aHdpc2VLZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2RlcHRod2lzZV9rZXJuZWwnLCBkZXB0aHdpc2VLZXJuZWxTaGFwZSwgbnVsbCxcbiAgICAgICAgdGhpcy5kZXB0aHdpc2VJbml0aWFsaXplciwgdGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplciwgdHJ1ZSxcbiAgICAgICAgdGhpcy5kZXB0aHdpc2VDb25zdHJhaW50KTtcbiAgICBpZiAodGhpcy51c2VCaWFzKSB7XG4gICAgICB0aGlzLmJpYXMgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgICAnYmlhcycsIFtpbnB1dERpbSAqIHRoaXMuZGVwdGhNdWx0aXBsaWVyXSwgbnVsbCwgdGhpcy5iaWFzSW5pdGlhbGl6ZXIsXG4gICAgICAgICAgdGhpcy5iaWFzUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYmlhc0NvbnN0cmFpbnQpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJpYXMgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpbnB1dHMgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBsZXQgb3V0cHV0cyA9IGRlcHRod2lzZUNvbnYyZChcbiAgICAgICAgICBpbnB1dHMsIHRoaXMuZGVwdGh3aXNlS2VybmVsLnJlYWQoKSwgdGhpcy5zdHJpZGVzIGFzIFtudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgdGhpcy5wYWRkaW5nLCB0aGlzLmRhdGFGb3JtYXQsIG51bGwpO1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHN1cHBvcnQgZm9yIGRpbGF0aW9uLlxuICAgICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgICBvdXRwdXRzID0gSy5iaWFzQWRkKG91dHB1dHMsIHRoaXMuYmlhcy5yZWFkKCksIHRoaXMuZGF0YUZvcm1hdCk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5hY3RpdmF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgb3V0cHV0cyA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseShvdXRwdXRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXRzO1xuICAgIH0pO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IHJvd3MgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IGlucHV0U2hhcGVbMl0gOiBpbnB1dFNoYXBlWzFdO1xuICAgIGNvbnN0IGNvbHMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IGlucHV0U2hhcGVbM10gOiBpbnB1dFNoYXBlWzJdO1xuICAgIGNvbnN0IG91dEZpbHRlcnMgPSB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/XG4gICAgICAgIGlucHV0U2hhcGVbMV0gKiB0aGlzLmRlcHRoTXVsdGlwbGllciA6XG4gICAgICAgIGlucHV0U2hhcGVbM10gKiB0aGlzLmRlcHRoTXVsdGlwbGllcjtcbiAgICBjb25zdCBvdXRSb3dzID0gY29udk91dHB1dExlbmd0aChcbiAgICAgICAgcm93cywgdGhpcy5rZXJuZWxTaXplWzBdLCB0aGlzLnBhZGRpbmcsIHRoaXMuc3RyaWRlc1swXSk7XG4gICAgY29uc3Qgb3V0Q29scyA9IGNvbnZPdXRwdXRMZW5ndGgoXG4gICAgICAgIGNvbHMsIHRoaXMua2VybmVsU2l6ZVsxXSwgdGhpcy5wYWRkaW5nLCB0aGlzLnN0cmlkZXNbMV0pO1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBvdXRGaWx0ZXJzLCBvdXRSb3dzLCBvdXRDb2xzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gdGhpcyBjYXNlLCBhc3N1bWUgJ2NoYW5uZWxzTGFzdCcuXG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIG91dFJvd3MsIG91dENvbHMsIG91dEZpbHRlcnNdO1xuICAgIH1cbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIGNvbmZpZ1snZGVwdGhNdWx0aXBsaWVyJ10gPSB0aGlzLmRlcHRoTXVsdGlwbGllcjtcbiAgICBjb25maWdbJ2RlcHRod2lzZUluaXRpYWxpemVyJ10gPVxuICAgICAgICBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmRlcHRod2lzZUluaXRpYWxpemVyKTtcbiAgICBjb25maWdbJ2RlcHRod2lzZVJlZ3VsYXJpemVyJ10gPVxuICAgICAgICBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmRlcHRod2lzZVJlZ3VsYXJpemVyKTtcbiAgICBjb25maWdbJ2RlcHRod2lzZUNvbnN0cmFpbnQnXSA9XG4gICAgICAgIHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5kZXB0aHdpc2VSZWd1bGFyaXplcik7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKERlcHRod2lzZUNvbnYyRCk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Recurrent Neural Network Layers.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy, util } from '@tensorflow/tfjs-core';\nimport { getActivation, serializeActivation } from '../activations';\nimport * as K from '../backend/tfjs_backend';\nimport { nameScope } from '../common';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, SymbolicTensor } from '../engine/topology';\nimport { Layer } from '../engine/topology';\nimport { AttributeError, NotImplementedError, ValueError } from '../errors';\nimport { getInitializer, Initializer, Ones, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { assertPositiveInteger } from '../utils/generic_utils';\nimport * as math_utils from '../utils/math_utils';\nimport { getExactlyOneShape, getExactlyOneTensor, isArrayOfShapes } from '../utils/types_utils';\nimport { batchGetValue, batchSetValue } from '../variables';\nimport { deserialize } from './serialization';\n/**\n * Standardize `apply()` args to a single list of tensor inputs.\n *\n * When running a model loaded from file, the input tensors `initialState` and\n * `constants` are passed to `RNN.apply()` as part of `inputs` instead of the\n * dedicated kwargs fields. `inputs` consists of\n * `[inputs, initialState0, initialState1, ..., constant0, constant1]` in this\n * case.\n * This method makes sure that arguments are\n * separated and that `initialState` and `constants` are `Array`s of tensors\n * (or None).\n *\n * @param inputs Tensor or `Array` of  tensors.\n * @param initialState Tensor or `Array` of tensors or `null`/`undefined`.\n * @param constants Tensor or `Array` of tensors or `null`/`undefined`.\n * @returns An object consisting of\n *   inputs: A tensor.\n *   initialState: `Array` of tensors or `null`.\n *   constants: `Array` of tensors or `null`.\n * @throws ValueError, if `inputs` is an `Array` but either `initialState` or\n *   `constants` is provided.\n */\nexport function standardizeArgs(inputs, initialState, constants, numConstants) {\n    if (Array.isArray(inputs)) {\n        if (initialState != null || constants != null) {\n            throw new ValueError('When inputs is an array, neither initialState or constants ' +\n                'should be provided');\n        }\n        if (numConstants != null) {\n            constants = inputs.slice(inputs.length - numConstants, inputs.length);\n            inputs = inputs.slice(0, inputs.length - numConstants);\n        }\n        if (inputs.length > 1) {\n            initialState = inputs.slice(1, inputs.length);\n        }\n        inputs = inputs[0];\n    }\n    function toListOrNull(x) {\n        if (x == null || Array.isArray(x)) {\n            return x;\n        }\n        else {\n            return [x];\n        }\n    }\n    initialState = toListOrNull(initialState);\n    constants = toListOrNull(constants);\n    return { inputs, initialState, constants };\n}\n/**\n * Iterates over the time dimension of a tensor.\n *\n * @param stepFunction RNN step function.\n *   Parameters:\n *     inputs: tensor with shape `[samples, ...]` (no time dimension),\n *       representing input for the batch of samples at a certain time step.\n *     states: an Array of tensors.\n *   Returns:\n *     outputs: tensor with shape `[samples, outputDim]` (no time dimension).\n *     newStates: list of tensors, same length and shapes as `states`. The first\n *       state in the list must be the output tensor at the previous timestep.\n * @param inputs Tensor of temporal data of shape `[samples, time, ...]` (at\n *   least 3D).\n * @param initialStates Tensor with shape `[samples, outputDim]` (no time\n *   dimension), containing the initial values of the states used in the step\n *   function.\n * @param goBackwards If `true`, do the iteration over the time dimension in\n *   reverse order and return the reversed sequence.\n * @param mask Binary tensor with shape `[sample, time, 1]`, with a zero for\n *   every element that is masked.\n * @param constants An Array of constant values passed at each step.\n * @param unroll Whether to unroll the RNN or to use a symbolic loop. *Not*\n *   applicable to this imperative deeplearn.js backend. Its value is ignored.\n * @param needPerStepOutputs Whether the per-step outputs are to be\n *   concatenated into a single tensor and returned (as the second return\n *   value). Default: `false`. This arg is included so that the relatively\n *   expensive concatenation of the stepwise outputs can be omitted unless\n *   the stepwise outputs need to be kept (e.g., for an LSTM layer of which\n *   `returnSequence` is `true`.)\n * @returns An Array: `[lastOutput, outputs, newStates]`.\n *   lastOutput: the lastest output of the RNN, of shape `[samples, ...]`.\n *   outputs: tensor with shape `[samples, time, ...]` where each entry\n *     `output[s, t]` is the output of the step function at time `t` for sample\n *     `s`. This return value is provided if and only if the\n *     `needPerStepOutputs` is set as `true`. If it is set as `false`, this\n *     return value will be `undefined`.\n *   newStates: Array of tensors, latest states returned by the step function,\n *      of shape `(samples, ...)`.\n * @throws ValueError If input dimension is less than 3.\n *\n * TODO(nielsene): This needs to be tidy-ed.\n */\nexport function rnn(stepFunction, inputs, initialStates, goBackwards = false, mask, constants, unroll = false, needPerStepOutputs = false) {\n    return tfc.tidy(() => {\n        const ndim = inputs.shape.length;\n        if (ndim < 3) {\n            throw new ValueError(`Input should be at least 3D, but is ${ndim}D.`);\n        }\n        // Transpose to time-major, i.e., from [batch, time, ...] to [time, batch,\n        // ...].\n        const axes = [1, 0].concat(math_utils.range(2, ndim));\n        inputs = tfc.transpose(inputs, axes);\n        if (constants != null) {\n            throw new NotImplementedError('The rnn() functoin of the deeplearn.js backend does not support ' +\n                'constants yet.');\n        }\n        // Porting Note: the unroll option is ignored by the imperative backend.\n        if (unroll) {\n            console.warn('Backend rnn(): the unroll = true option is not applicable to the ' +\n                'imperative deeplearn.js backend.');\n        }\n        if (mask != null) {\n            mask = tfc.cast(tfc.cast(mask, 'bool'), 'float32');\n            if (mask.rank === ndim - 1) {\n                mask = tfc.expandDims(mask, -1);\n            }\n            mask = tfc.transpose(mask, axes);\n        }\n        if (goBackwards) {\n            inputs = tfc.reverse(inputs, 0);\n            if (mask != null) {\n                mask = tfc.reverse(mask, 0);\n            }\n        }\n        // Porting Note: PyKeras with TensorFlow backend uses a symbolic loop\n        //   (tf.while_loop). But for the imperative deeplearn.js backend, we just\n        //   use the usual TypeScript control flow to iterate over the time steps in\n        //   the inputs.\n        // Porting Note: PyKeras patches a \"_use_learning_phase\" attribute to\n        // outputs.\n        //   This is not idiomatic in TypeScript. The info regarding whether we are\n        //   in a learning (i.e., training) phase for RNN is passed in a different\n        //   way.\n        const perStepOutputs = [];\n        let lastOutput;\n        let states = initialStates;\n        const timeSteps = inputs.shape[0];\n        const perStepInputs = tfc.unstack(inputs);\n        let perStepMasks;\n        if (mask != null) {\n            perStepMasks = tfc.unstack(mask);\n        }\n        for (let t = 0; t < timeSteps; ++t) {\n            const currentInput = perStepInputs[t];\n            const stepOutputs = tfc.tidy(() => stepFunction(currentInput, states));\n            if (mask == null) {\n                lastOutput = stepOutputs[0];\n                states = stepOutputs[1];\n            }\n            else {\n                const maskedOutputs = tfc.tidy(() => {\n                    const stepMask = perStepMasks[t];\n                    const negStepMask = tfc.sub(tfc.onesLike(stepMask), stepMask);\n                    // TODO(cais): Would tfc.where() be better for performance?\n                    const output = tfc.add(tfc.mul(stepOutputs[0], stepMask), tfc.mul(states[0], negStepMask));\n                    const newStates = states.map((state, i) => {\n                        return tfc.add(tfc.mul(stepOutputs[1][i], stepMask), tfc.mul(state, negStepMask));\n                    });\n                    return { output, newStates };\n                });\n                lastOutput = maskedOutputs.output;\n                states = maskedOutputs.newStates;\n            }\n            if (needPerStepOutputs) {\n                perStepOutputs.push(lastOutput);\n            }\n        }\n        let outputs;\n        if (needPerStepOutputs) {\n            const axis = 1;\n            outputs = tfc.stack(perStepOutputs, axis);\n        }\n        return [lastOutput, outputs, states];\n    });\n}\nexport class RNN extends Layer {\n    constructor(args) {\n        super(args);\n        let cell;\n        if (args.cell == null) {\n            throw new ValueError('cell property is missing for the constructor of RNN.');\n        }\n        else if (Array.isArray(args.cell)) {\n            cell = new StackedRNNCells({ cells: args.cell });\n        }\n        else {\n            cell = args.cell;\n        }\n        if (cell.stateSize == null) {\n            throw new ValueError('The RNN cell should have an attribute `stateSize` (tuple of ' +\n                'integers, one integer per RNN state).');\n        }\n        this.cell = cell;\n        this.returnSequences =\n            args.returnSequences == null ? false : args.returnSequences;\n        this.returnState = args.returnState == null ? false : args.returnState;\n        this.goBackwards = args.goBackwards == null ? false : args.goBackwards;\n        this._stateful = args.stateful == null ? false : args.stateful;\n        this.unroll = args.unroll == null ? false : args.unroll;\n        this.supportsMasking = true;\n        this.inputSpec = [new InputSpec({ ndim: 3 })];\n        this.stateSpec = null;\n        this.states_ = null;\n        // TODO(cais): Add constantsSpec and numConstants.\n        this.numConstants = null;\n        // TODO(cais): Look into the use of initial_state in the kwargs of the\n        //   constructor.\n        this.keptStates = [];\n    }\n    // Porting Note: This is the equivalent of `RNN.states` property getter in\n    //   PyKeras.\n    getStates() {\n        if (this.states_ == null) {\n            const numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1;\n            return math_utils.range(0, numStates).map(x => null);\n        }\n        else {\n            return this.states_;\n        }\n    }\n    // Porting Note: This is the equivalent of the `RNN.states` property setter in\n    //   PyKeras.\n    setStates(states) {\n        this.states_ = states;\n    }\n    computeOutputShape(inputShape) {\n        if (isArrayOfShapes(inputShape)) {\n            inputShape = inputShape[0];\n        }\n        inputShape = inputShape;\n        // TODO(cais): Remove the casting once stacked RNN cells become supported.\n        let stateSize = this.cell.stateSize;\n        if (!Array.isArray(stateSize)) {\n            stateSize = [stateSize];\n        }\n        const outputDim = stateSize[0];\n        let outputShape;\n        if (this.returnSequences) {\n            outputShape = [inputShape[0], inputShape[1], outputDim];\n        }\n        else {\n            outputShape = [inputShape[0], outputDim];\n        }\n        if (this.returnState) {\n            const stateShape = [];\n            for (const dim of stateSize) {\n                stateShape.push([inputShape[0], dim]);\n            }\n            return [outputShape].concat(stateShape);\n        }\n        else {\n            return outputShape;\n        }\n    }\n    computeMask(inputs, mask) {\n        return tfc.tidy(() => {\n            if (Array.isArray(mask)) {\n                mask = mask[0];\n            }\n            const outputMask = this.returnSequences ? mask : null;\n            if (this.returnState) {\n                const stateMask = this.states.map(s => null);\n                return [outputMask].concat(stateMask);\n            }\n            else {\n                return outputMask;\n            }\n        });\n    }\n    /**\n     * Get the current state tensors of the RNN.\n     *\n     * If the state hasn't been set, return an array of `null`s of the correct\n     * length.\n     */\n    get states() {\n        if (this.states_ == null) {\n            const numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1;\n            const output = [];\n            for (let i = 0; i < numStates; ++i) {\n                output.push(null);\n            }\n            return output;\n        }\n        else {\n            return this.states_;\n        }\n    }\n    set states(s) {\n        this.states_ = s;\n    }\n    build(inputShape) {\n        // Note inputShape will be an Array of Shapes of initial states and\n        // constants if these are passed in apply().\n        const constantShape = null;\n        if (this.numConstants != null) {\n            throw new NotImplementedError('Constants support is not implemented in RNN yet.');\n        }\n        if (isArrayOfShapes(inputShape)) {\n            inputShape = inputShape[0];\n        }\n        inputShape = inputShape;\n        const batchSize = this.stateful ? inputShape[0] : null;\n        const inputDim = inputShape.slice(2);\n        this.inputSpec[0] = new InputSpec({ shape: [batchSize, null, ...inputDim] });\n        // Allow cell (if RNNCell Layer) to build before we set or validate\n        // stateSpec.\n        const stepInputShape = [inputShape[0]].concat(inputShape.slice(2));\n        if (constantShape != null) {\n            throw new NotImplementedError('Constants support is not implemented in RNN yet.');\n        }\n        else {\n            this.cell.build(stepInputShape);\n        }\n        // Set or validate stateSpec.\n        let stateSize;\n        if (Array.isArray(this.cell.stateSize)) {\n            stateSize = this.cell.stateSize;\n        }\n        else {\n            stateSize = [this.cell.stateSize];\n        }\n        if (this.stateSpec != null) {\n            if (!util.arraysEqual(this.stateSpec.map(spec => spec.shape[spec.shape.length - 1]), stateSize)) {\n                throw new ValueError(`An initialState was passed that is not compatible with ` +\n                    `cell.stateSize. Received stateSpec=${this.stateSpec}; ` +\n                    `However cell.stateSize is ${this.cell.stateSize}`);\n            }\n        }\n        else {\n            this.stateSpec =\n                stateSize.map(dim => new InputSpec({ shape: [null, dim] }));\n        }\n        if (this.stateful) {\n            this.resetStates();\n        }\n    }\n    /**\n     * Reset the state tensors of the RNN.\n     *\n     * If the `states` argument is `undefined` or `null`, will set the\n     * state tensor(s) of the RNN to all-zero tensors of the appropriate\n     * shape(s).\n     *\n     * If `states` is provided, will set the state tensors of the RNN to its\n     * value.\n     *\n     * @param states Optional externally-provided initial states.\n     * @param training Whether this call is done during training. For stateful\n     *   RNNs, this affects whether the old states are kept or discarded. In\n     *   particular, if `training` is `true`, the old states will be kept so\n     *   that subsequent backpropgataion through time (BPTT) may work properly.\n     *   Else, the old states will be discarded.\n     */\n    resetStates(states, training = false) {\n        tidy(() => {\n            if (!this.stateful) {\n                throw new AttributeError('Cannot call resetStates() on an RNN Layer that is not stateful.');\n            }\n            const batchSize = this.inputSpec[0].shape[0];\n            if (batchSize == null) {\n                throw new ValueError('If an RNN is stateful, it needs to know its batch size. Specify ' +\n                    'the batch size of your input tensors: \\n' +\n                    '- If using a Sequential model, specify the batch size by ' +\n                    'passing a `batchInputShape` option to your first layer.\\n' +\n                    '- If using the functional API, specify the batch size by ' +\n                    'passing a `batchShape` option to your Input layer.');\n            }\n            // Initialize state if null.\n            if (this.states_ == null) {\n                if (Array.isArray(this.cell.stateSize)) {\n                    this.states_ =\n                        this.cell.stateSize.map(dim => tfc.zeros([batchSize, dim]));\n                }\n                else {\n                    this.states_ = [tfc.zeros([batchSize, this.cell.stateSize])];\n                }\n            }\n            else if (states == null) {\n                // Dispose old state tensors.\n                tfc.dispose(this.states_);\n                // For stateful RNNs, fully dispose kept old states.\n                if (this.keptStates != null) {\n                    tfc.dispose(this.keptStates);\n                    this.keptStates = [];\n                }\n                if (Array.isArray(this.cell.stateSize)) {\n                    this.states_ =\n                        this.cell.stateSize.map(dim => tfc.zeros([batchSize, dim]));\n                }\n                else {\n                    this.states_[0] = tfc.zeros([batchSize, this.cell.stateSize]);\n                }\n            }\n            else {\n                if (!Array.isArray(states)) {\n                    states = [states];\n                }\n                if (states.length !== this.states_.length) {\n                    throw new ValueError(`Layer ${this.name} expects ${this.states_.length} state(s), ` +\n                        `but it received ${states.length} state value(s). Input ` +\n                        `received: ${states}`);\n                }\n                if (training === true) {\n                    // Store old state tensors for complete disposal later, i.e., during\n                    // the next no-arg call to this method. We do not dispose the old\n                    // states immediately because that BPTT (among other things) require\n                    // them.\n                    this.keptStates.push(this.states_.slice());\n                }\n                else {\n                    tfc.dispose(this.states_);\n                }\n                for (let index = 0; index < this.states_.length; ++index) {\n                    const value = states[index];\n                    const dim = Array.isArray(this.cell.stateSize) ?\n                        this.cell.stateSize[index] :\n                        this.cell.stateSize;\n                    const expectedShape = [batchSize, dim];\n                    if (!util.arraysEqual(value.shape, expectedShape)) {\n                        throw new ValueError(`State ${index} is incompatible with layer ${this.name}: ` +\n                            `expected shape=${expectedShape}, received shape=${value.shape}`);\n                    }\n                    this.states_[index] = value;\n                }\n            }\n            this.states_ = this.states_.map(state => tfc.keep(state.clone()));\n        });\n    }\n    apply(inputs, kwargs) {\n        // TODO(cais): Figure out whether initialState is in kwargs or inputs.\n        let initialState = kwargs == null ? null : kwargs['initialState'];\n        let constants = kwargs == null ? null : kwargs['constants'];\n        if (kwargs == null) {\n            kwargs = {};\n        }\n        const standardized = standardizeArgs(inputs, initialState, constants, this.numConstants);\n        inputs = standardized.inputs;\n        initialState = standardized.initialState;\n        constants = standardized.constants;\n        // If any of `initial_state` or `constants` are specified and are\n        // `tf.SymbolicTensor`s, then add them to the inputs and temporarily modify\n        // the input_spec to include them.\n        let additionalInputs = [];\n        let additionalSpecs = [];\n        if (initialState != null) {\n            kwargs['initialState'] = initialState;\n            additionalInputs = additionalInputs.concat(initialState);\n            this.stateSpec = [];\n            for (const state of initialState) {\n                this.stateSpec.push(new InputSpec({ shape: state.shape }));\n            }\n            // TODO(cais): Use the following instead.\n            // this.stateSpec = initialState.map(state => new InputSpec({shape:\n            // state.shape}));\n            additionalSpecs = additionalSpecs.concat(this.stateSpec);\n        }\n        if (constants != null) {\n            kwargs['constants'] = constants;\n            additionalInputs = additionalInputs.concat(constants);\n            // TODO(cais): Add this.constantsSpec.\n            this.numConstants = constants.length;\n        }\n        const isTensor = additionalInputs[0] instanceof SymbolicTensor;\n        if (isTensor) {\n            // Compute full input spec, including state and constants.\n            const fullInput = [inputs].concat(additionalInputs);\n            const fullInputSpec = this.inputSpec.concat(additionalSpecs);\n            // Perform the call with temporarily replaced inputSpec.\n            const originalInputSpec = this.inputSpec;\n            this.inputSpec = fullInputSpec;\n            const output = super.apply(fullInput, kwargs);\n            this.inputSpec = originalInputSpec;\n            return output;\n        }\n        else {\n            return super.apply(inputs, kwargs);\n        }\n    }\n    // tslint:disable-next-line:no-any\n    call(inputs, kwargs) {\n        // Input shape: `[samples, time (padded with zeros), input_dim]`.\n        // Note that the .build() method of subclasses **must** define\n        // this.inputSpec and this.stateSpec owith complete input shapes.\n        return tidy(() => {\n            const mask = kwargs == null ? null : kwargs['mask'];\n            const training = kwargs == null ? null : kwargs['training'];\n            let initialState = kwargs == null ? null : kwargs['initialState'];\n            inputs = getExactlyOneTensor(inputs);\n            if (initialState == null) {\n                if (this.stateful) {\n                    initialState = this.states_;\n                }\n                else {\n                    initialState = this.getInitialState(inputs);\n                }\n            }\n            const numStates = Array.isArray(this.cell.stateSize) ? this.cell.stateSize.length : 1;\n            if (initialState.length !== numStates) {\n                throw new ValueError(`RNN Layer has ${numStates} state(s) but was passed ` +\n                    `${initialState.length} initial state(s).`);\n            }\n            if (this.unroll) {\n                console.warn('Ignoring unroll = true for RNN layer, due to imperative backend.');\n            }\n            const cellCallKwargs = { training };\n            // TODO(cais): Add support for constants.\n            const step = (inputs, states) => {\n                // `inputs` and `states` are concatenated to form a single `Array` of\n                // `tf.Tensor`s as the input to `cell.call()`.\n                const outputs = this.cell.call([inputs].concat(states), cellCallKwargs);\n                // Marshall the return value into output and new states.\n                return [outputs[0], outputs.slice(1)];\n            };\n            // TODO(cais): Add support for constants.\n            const rnnOutputs = rnn(step, inputs, initialState, this.goBackwards, mask, null, this.unroll, this.returnSequences);\n            const lastOutput = rnnOutputs[0];\n            const outputs = rnnOutputs[1];\n            const states = rnnOutputs[2];\n            if (this.stateful) {\n                this.resetStates(states, training);\n            }\n            const output = this.returnSequences ? outputs : lastOutput;\n            // TODO(cais): Porperty set learning phase flag.\n            if (this.returnState) {\n                return [output].concat(states);\n            }\n            else {\n                return output;\n            }\n        });\n    }\n    getInitialState(inputs) {\n        return tidy(() => {\n            // Build an all-zero tensor of shape [samples, outputDim].\n            // [Samples, timeSteps, inputDim].\n            let initialState = tfc.zeros(inputs.shape);\n            // [Samples].\n            initialState = tfc.sum(initialState, [1, 2]);\n            initialState = K.expandDims(initialState); // [Samples, 1].\n            if (Array.isArray(this.cell.stateSize)) {\n                return this.cell.stateSize.map(dim => dim > 1 ? K.tile(initialState, [1, dim]) : initialState);\n            }\n            else {\n                return this.cell.stateSize > 1 ?\n                    [K.tile(initialState, [1, this.cell.stateSize])] :\n                    [initialState];\n            }\n        });\n    }\n    get trainableWeights() {\n        if (!this.trainable) {\n            return [];\n        }\n        // Porting Note: In TypeScript, `this` is always an instance of `Layer`.\n        return this.cell.trainableWeights;\n    }\n    get nonTrainableWeights() {\n        // Porting Note: In TypeScript, `this` is always an instance of `Layer`.\n        if (!this.trainable) {\n            return this.cell.weights;\n        }\n        return this.cell.nonTrainableWeights;\n    }\n    setFastWeightInitDuringBuild(value) {\n        super.setFastWeightInitDuringBuild(value);\n        if (this.cell != null) {\n            this.cell.setFastWeightInitDuringBuild(value);\n        }\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const config = {\n            returnSequences: this.returnSequences,\n            returnState: this.returnState,\n            goBackwards: this.goBackwards,\n            stateful: this.stateful,\n            unroll: this.unroll,\n        };\n        if (this.numConstants != null) {\n            config['numConstants'] = this.numConstants;\n        }\n        const cellConfig = this.cell.getConfig();\n        if (this.getClassName() === RNN.className) {\n            config['cell'] = {\n                'className': this.cell.getClassName(),\n                'config': cellConfig,\n            };\n        }\n        // this order is necessary, to prevent cell name from replacing layer name\n        return Object.assign({}, cellConfig, baseConfig, config);\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config, customObjects = {}) {\n        const cellConfig = config['cell'];\n        const cell = deserialize(cellConfig, customObjects);\n        return new cls(Object.assign(config, { cell }));\n    }\n}\n/** @nocollapse */\nRNN.className = 'RNN';\nserialization.registerClass(RNN);\n// Porting Note: This is a common parent class for RNN cells. There is no\n// equivalent of this in PyKeras. Having a common parent class forgoes the\n//  need for `has_attr(cell, ...)` checks or its TypeScript equivalent.\n/**\n * An RNNCell layer.\n *\n * @doc {heading: 'Layers', subheading: 'Classes'}\n */\nexport class RNNCell extends Layer {\n}\nexport class SimpleRNNCell extends RNNCell {\n    constructor(args) {\n        super(args);\n        this.DEFAULT_ACTIVATION = 'tanh';\n        this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n        this.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n        this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n        this.units = args.units;\n        assertPositiveInteger(this.units, `units`);\n        this.activation = getActivation(args.activation == null ? this.DEFAULT_ACTIVATION : args.activation);\n        this.useBias = args.useBias == null ? true : args.useBias;\n        this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n        this.recurrentInitializer = getInitializer(args.recurrentInitializer || this.DEFAULT_RECURRENT_INITIALIZER);\n        this.biasInitializer =\n            getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n        this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n        this.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n        this.biasRegularizer = getRegularizer(args.biasRegularizer);\n        this.kernelConstraint = getConstraint(args.kernelConstraint);\n        this.recurrentConstraint = getConstraint(args.recurrentConstraint);\n        this.biasConstraint = getConstraint(args.biasConstraint);\n        this.dropout = math_utils.min([1, math_utils.max([0, args.dropout == null ? 0 : args.dropout])]);\n        this.recurrentDropout = math_utils.min([\n            1,\n            math_utils.max([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])\n        ]);\n        this.dropoutFunc = args.dropoutFunc;\n        this.stateSize = this.units;\n        this.dropoutMask = null;\n        this.recurrentDropoutMask = null;\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        // TODO(cais): Use regularizer.\n        this.kernel = this.addWeight('kernel', [inputShape[inputShape.length - 1], this.units], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n        this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n        if (this.useBias) {\n            this.bias = this.addWeight('bias', [this.units], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n        }\n        else {\n            this.bias = null;\n        }\n        this.built = true;\n    }\n    // Porting Note: PyKeras' equivalent of this method takes two tensor inputs:\n    //   `inputs` and `states`. Here, the two tensors are combined into an\n    //   `Tensor[]` Array as the first input argument.\n    //   Similarly, PyKeras' equivalent of this method returns two values:\n    //    `output` and `[output]`. Here the two are combined into one length-2\n    //    `Tensor[]`, consisting of `output` repeated.\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = inputs;\n            if (inputs.length !== 2) {\n                throw new ValueError(`SimpleRNNCell expects 2 input Tensors, got ${inputs.length}.`);\n            }\n            let prevOutput = inputs[1];\n            inputs = inputs[0];\n            const training = kwargs['training'] == null ? false : kwargs['training'];\n            if (0 < this.dropout && this.dropout < 1 && this.dropoutMask == null) {\n                this.dropoutMask = generateDropoutMask({\n                    ones: () => tfc.onesLike(inputs),\n                    rate: this.dropout,\n                    training,\n                    dropoutFunc: this.dropoutFunc,\n                });\n            }\n            if (0 < this.recurrentDropout && this.recurrentDropout < 1 &&\n                this.recurrentDropoutMask == null) {\n                this.recurrentDropoutMask = generateDropoutMask({\n                    ones: () => tfc.onesLike(prevOutput),\n                    rate: this.recurrentDropout,\n                    training,\n                    dropoutFunc: this.dropoutFunc,\n                });\n            }\n            let h;\n            const dpMask = this.dropoutMask;\n            const recDpMask = this.recurrentDropoutMask;\n            if (dpMask != null) {\n                h = K.dot(tfc.mul(inputs, dpMask), this.kernel.read());\n            }\n            else {\n                h = K.dot(inputs, this.kernel.read());\n            }\n            if (this.bias != null) {\n                h = K.biasAdd(h, this.bias.read());\n            }\n            if (recDpMask != null) {\n                prevOutput = tfc.mul(prevOutput, recDpMask);\n            }\n            let output = tfc.add(h, K.dot(prevOutput, this.recurrentKernel.read()));\n            if (this.activation != null) {\n                output = this.activation.apply(output);\n            }\n            // TODO(cais): Properly set learning phase on output tensor?\n            return [output, output];\n        });\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const config = {\n            units: this.units,\n            activation: serializeActivation(this.activation),\n            useBias: this.useBias,\n            kernelInitializer: serializeInitializer(this.kernelInitializer),\n            recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n            biasInitializer: serializeInitializer(this.biasInitializer),\n            kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n            recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n            biasRegularizer: serializeRegularizer(this.biasRegularizer),\n            activityRegularizer: serializeRegularizer(this.activityRegularizer),\n            kernelConstraint: serializeConstraint(this.kernelConstraint),\n            recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n            biasConstraint: serializeConstraint(this.biasConstraint),\n            dropout: this.dropout,\n            recurrentDropout: this.recurrentDropout,\n        };\n        return Object.assign({}, baseConfig, config);\n    }\n}\n/** @nocollapse */\nSimpleRNNCell.className = 'SimpleRNNCell';\nserialization.registerClass(SimpleRNNCell);\nexport class SimpleRNN extends RNN {\n    constructor(args) {\n        args.cell = new SimpleRNNCell(args);\n        super(args);\n        // TODO(cais): Add activityRegularizer.\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            if (this.cell.dropoutMask != null) {\n                tfc.dispose(this.cell.dropoutMask);\n                this.cell.dropoutMask = null;\n            }\n            if (this.cell.recurrentDropoutMask != null) {\n                tfc.dispose(this.cell.recurrentDropoutMask);\n                this.cell.recurrentDropoutMask = null;\n            }\n            const mask = kwargs == null ? null : kwargs['mask'];\n            const training = kwargs == null ? null : kwargs['training'];\n            const initialState = kwargs == null ? null : kwargs['initialState'];\n            return super.call(inputs, { mask, training, initialState });\n        });\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config);\n    }\n}\n/** @nocollapse */\nSimpleRNN.className = 'SimpleRNN';\nserialization.registerClass(SimpleRNN);\nexport class GRUCell extends RNNCell {\n    constructor(args) {\n        super(args);\n        this.DEFAULT_ACTIVATION = 'tanh';\n        this.DEFAULT_RECURRENT_ACTIVATION = 'hardSigmoid';\n        this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n        this.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n        this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n        if (args.resetAfter) {\n            throw new ValueError(`GRUCell does not support reset_after parameter set to true.`);\n        }\n        this.units = args.units;\n        assertPositiveInteger(this.units, 'units');\n        this.activation = getActivation(args.activation === undefined ? this.DEFAULT_ACTIVATION :\n            args.activation);\n        this.recurrentActivation = getActivation(args.recurrentActivation === undefined ?\n            this.DEFAULT_RECURRENT_ACTIVATION :\n            args.recurrentActivation);\n        this.useBias = args.useBias == null ? true : args.useBias;\n        this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n        this.recurrentInitializer = getInitializer(args.recurrentInitializer || this.DEFAULT_RECURRENT_INITIALIZER);\n        this.biasInitializer =\n            getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n        this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n        this.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n        this.biasRegularizer = getRegularizer(args.biasRegularizer);\n        this.kernelConstraint = getConstraint(args.kernelConstraint);\n        this.recurrentConstraint = getConstraint(args.recurrentConstraint);\n        this.biasConstraint = getConstraint(args.biasConstraint);\n        this.dropout = math_utils.min([1, math_utils.max([0, args.dropout == null ? 0 : args.dropout])]);\n        this.recurrentDropout = math_utils.min([\n            1,\n            math_utils.max([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])\n        ]);\n        this.dropoutFunc = args.dropoutFunc;\n        this.implementation = args.implementation;\n        this.stateSize = this.units;\n        this.dropoutMask = null;\n        this.recurrentDropoutMask = null;\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const inputDim = inputShape[inputShape.length - 1];\n        this.kernel = this.addWeight('kernel', [inputDim, this.units * 3], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n        this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units * 3], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n        if (this.useBias) {\n            this.bias = this.addWeight('bias', [this.units * 3], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n        }\n        else {\n            this.bias = null;\n        }\n        // Porting Notes: Unlike the PyKeras implementation, we perform slicing\n        //   of the weights and bias in the call() method, at execution time.\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = inputs;\n            if (inputs.length !== 2) {\n                throw new ValueError(`GRUCell expects 2 input Tensors (inputs, h, c), got ` +\n                    `${inputs.length}.`);\n            }\n            const training = kwargs['training'] == null ? false : kwargs['training'];\n            let hTMinus1 = inputs[1]; // Previous memory state.\n            inputs = inputs[0];\n            // Note: For superior performance, TensorFlow.js always uses\n            // implementation 2, regardless of the actual value of\n            // config.implementation.\n            if (0 < this.dropout && this.dropout < 1 && this.dropoutMask == null) {\n                this.dropoutMask = generateDropoutMask({\n                    ones: () => tfc.onesLike(inputs),\n                    rate: this.dropout,\n                    training,\n                    count: 3,\n                    dropoutFunc: this.dropoutFunc,\n                });\n            }\n            if (0 < this.recurrentDropout && this.recurrentDropout < 1 &&\n                this.recurrentDropoutMask == null) {\n                this.recurrentDropoutMask = generateDropoutMask({\n                    ones: () => tfc.onesLike(hTMinus1),\n                    rate: this.recurrentDropout,\n                    training,\n                    count: 3,\n                    dropoutFunc: this.dropoutFunc,\n                });\n            }\n            const dpMask = this.dropoutMask;\n            const recDpMask = this.recurrentDropoutMask;\n            let z;\n            let r;\n            let hh;\n            if (0 < this.dropout && this.dropout < 1) {\n                inputs = tfc.mul(inputs, dpMask[0]);\n            }\n            let matrixX = K.dot(inputs, this.kernel.read());\n            if (this.useBias) {\n                matrixX = K.biasAdd(matrixX, this.bias.read());\n            }\n            if (0 < this.recurrentDropout && this.recurrentDropout < 1) {\n                hTMinus1 = tfc.mul(hTMinus1, recDpMask[0]);\n            }\n            const recurrentKernelValue = this.recurrentKernel.read();\n            const [rk1, rk2] = tfc.split(recurrentKernelValue, [2 * this.units, this.units], recurrentKernelValue.rank - 1);\n            const matrixInner = K.dot(hTMinus1, rk1);\n            const [xZ, xR, xH] = tfc.split(matrixX, 3, matrixX.rank - 1);\n            const [recurrentZ, recurrentR] = tfc.split(matrixInner, 2, matrixInner.rank - 1);\n            z = this.recurrentActivation.apply(tfc.add(xZ, recurrentZ));\n            r = this.recurrentActivation.apply(tfc.add(xR, recurrentR));\n            const recurrentH = K.dot(tfc.mul(r, hTMinus1), rk2);\n            hh = this.activation.apply(tfc.add(xH, recurrentH));\n            const h = tfc.add(tfc.mul(z, hTMinus1), tfc.mul(tfc.add(1, tfc.neg(z)), hh));\n            // TODO(cais): Add use_learning_phase flag properly.\n            return [h, h];\n        });\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const config = {\n            units: this.units,\n            activation: serializeActivation(this.activation),\n            recurrentActivation: serializeActivation(this.recurrentActivation),\n            useBias: this.useBias,\n            kernelInitializer: serializeInitializer(this.kernelInitializer),\n            recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n            biasInitializer: serializeInitializer(this.biasInitializer),\n            kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n            recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n            biasRegularizer: serializeRegularizer(this.biasRegularizer),\n            activityRegularizer: serializeRegularizer(this.activityRegularizer),\n            kernelConstraint: serializeConstraint(this.kernelConstraint),\n            recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n            biasConstraint: serializeConstraint(this.biasConstraint),\n            dropout: this.dropout,\n            recurrentDropout: this.recurrentDropout,\n            implementation: this.implementation,\n            resetAfter: false\n        };\n        return Object.assign({}, baseConfig, config);\n    }\n}\n/** @nocollapse */\nGRUCell.className = 'GRUCell';\nserialization.registerClass(GRUCell);\nexport class GRU extends RNN {\n    constructor(args) {\n        if (args.implementation === 0) {\n            console.warn('`implementation=0` has been deprecated, and now defaults to ' +\n                '`implementation=1`. Please update your layer call.');\n        }\n        args.cell = new GRUCell(args);\n        super(args);\n        // TODO(cais): Add activityRegularizer.\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            if (this.cell.dropoutMask != null) {\n                tfc.dispose(this.cell.dropoutMask);\n                this.cell.dropoutMask = null;\n            }\n            if (this.cell.recurrentDropoutMask != null) {\n                tfc.dispose(this.cell.recurrentDropoutMask);\n                this.cell.recurrentDropoutMask = null;\n            }\n            const mask = kwargs == null ? null : kwargs['mask'];\n            const training = kwargs == null ? null : kwargs['training'];\n            const initialState = kwargs == null ? null : kwargs['initialState'];\n            return super.call(inputs, { mask, training, initialState });\n        });\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        if (config['implmentation'] === 0) {\n            config['implementation'] = 1;\n        }\n        return new cls(config);\n    }\n}\n/** @nocollapse */\nGRU.className = 'GRU';\nserialization.registerClass(GRU);\nexport class LSTMCell extends RNNCell {\n    constructor(args) {\n        super(args);\n        this.DEFAULT_ACTIVATION = 'tanh';\n        this.DEFAULT_RECURRENT_ACTIVATION = 'hardSigmoid';\n        this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n        this.DEFAULT_RECURRENT_INITIALIZER = 'orthogonal';\n        this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n        this.units = args.units;\n        assertPositiveInteger(this.units, 'units');\n        this.activation = getActivation(args.activation === undefined ? this.DEFAULT_ACTIVATION :\n            args.activation);\n        this.recurrentActivation = getActivation(args.recurrentActivation === undefined ?\n            this.DEFAULT_RECURRENT_ACTIVATION :\n            args.recurrentActivation);\n        this.useBias = args.useBias == null ? true : args.useBias;\n        this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n        this.recurrentInitializer = getInitializer(args.recurrentInitializer || this.DEFAULT_RECURRENT_INITIALIZER);\n        this.biasInitializer =\n            getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n        this.unitForgetBias = args.unitForgetBias;\n        this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n        this.recurrentRegularizer = getRegularizer(args.recurrentRegularizer);\n        this.biasRegularizer = getRegularizer(args.biasRegularizer);\n        this.kernelConstraint = getConstraint(args.kernelConstraint);\n        this.recurrentConstraint = getConstraint(args.recurrentConstraint);\n        this.biasConstraint = getConstraint(args.biasConstraint);\n        this.dropout = math_utils.min([1, math_utils.max([0, args.dropout == null ? 0 : args.dropout])]);\n        this.recurrentDropout = math_utils.min([\n            1,\n            math_utils.max([0, args.recurrentDropout == null ? 0 : args.recurrentDropout])\n        ]);\n        this.dropoutFunc = args.dropoutFunc;\n        this.implementation = args.implementation;\n        this.stateSize = [this.units, this.units];\n        this.dropoutMask = null;\n        this.recurrentDropoutMask = null;\n    }\n    build(inputShape) {\n        var _a;\n        inputShape = getExactlyOneShape(inputShape);\n        const inputDim = inputShape[inputShape.length - 1];\n        this.kernel = this.addWeight('kernel', [inputDim, this.units * 4], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n        this.recurrentKernel = this.addWeight('recurrent_kernel', [this.units, this.units * 4], null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n        let biasInitializer;\n        if (this.useBias) {\n            if (this.unitForgetBias) {\n                const capturedBiasInit = this.biasInitializer;\n                const capturedUnits = this.units;\n                biasInitializer = new (_a = class CustomInit extends Initializer {\n                        apply(shape, dtype) {\n                            // TODO(cais): More informative variable names?\n                            const bI = capturedBiasInit.apply([capturedUnits]);\n                            const bF = (new Ones()).apply([capturedUnits]);\n                            const bCAndH = capturedBiasInit.apply([capturedUnits * 2]);\n                            return K.concatAlongFirstAxis(K.concatAlongFirstAxis(bI, bF), bCAndH);\n                        }\n                    },\n                    /** @nocollapse */\n                    _a.className = 'CustomInit',\n                    _a)();\n            }\n            else {\n                biasInitializer = this.biasInitializer;\n            }\n            this.bias = this.addWeight('bias', [this.units * 4], null, biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n        }\n        else {\n            this.bias = null;\n        }\n        // Porting Notes: Unlike the PyKeras implementation, we perform slicing\n        //   of the weights and bias in the call() method, at execution time.\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            const training = kwargs['training'] == null ? false : kwargs['training'];\n            inputs = inputs;\n            if (inputs.length !== 3) {\n                throw new ValueError(`LSTMCell expects 3 input Tensors (inputs, h, c), got ` +\n                    `${inputs.length}.`);\n            }\n            let hTMinus1 = inputs[1]; // Previous memory state.\n            const cTMinus1 = inputs[2]; // Previous carry state.\n            inputs = inputs[0];\n            if (0 < this.dropout && this.dropout < 1 && this.dropoutMask == null) {\n                this.dropoutMask = generateDropoutMask({\n                    ones: () => tfc.onesLike(inputs),\n                    rate: this.dropout,\n                    training,\n                    count: 4,\n                    dropoutFunc: this.dropoutFunc\n                });\n            }\n            if (0 < this.recurrentDropout && this.recurrentDropout < 1 &&\n                this.recurrentDropoutMask == null) {\n                this.recurrentDropoutMask = generateDropoutMask({\n                    ones: () => tfc.onesLike(hTMinus1),\n                    rate: this.recurrentDropout,\n                    training,\n                    count: 4,\n                    dropoutFunc: this.dropoutFunc\n                });\n            }\n            const dpMask = this.dropoutMask;\n            const recDpMask = this.recurrentDropoutMask;\n            // Note: For superior performance, TensorFlow.js always uses\n            // implementation 2 regardless of the actual value of\n            // config.implementation.\n            let i;\n            let f;\n            let c;\n            let o;\n            if (0 < this.dropout && this.dropout < 1) {\n                inputs = tfc.mul(inputs, dpMask[0]);\n            }\n            let z = K.dot(inputs, this.kernel.read());\n            if (0 < this.recurrentDropout && this.recurrentDropout < 1) {\n                hTMinus1 = tfc.mul(hTMinus1, recDpMask[0]);\n            }\n            z = tfc.add(z, K.dot(hTMinus1, this.recurrentKernel.read()));\n            if (this.useBias) {\n                z = K.biasAdd(z, this.bias.read());\n            }\n            const [z0, z1, z2, z3] = tfc.split(z, 4, z.rank - 1);\n            i = this.recurrentActivation.apply(z0);\n            f = this.recurrentActivation.apply(z1);\n            c = tfc.add(tfc.mul(f, cTMinus1), tfc.mul(i, this.activation.apply(z2)));\n            o = this.recurrentActivation.apply(z3);\n            const h = tfc.mul(o, this.activation.apply(c));\n            // TODO(cais): Add use_learning_phase flag properly.\n            return [h, h, c];\n        });\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const config = {\n            units: this.units,\n            activation: serializeActivation(this.activation),\n            recurrentActivation: serializeActivation(this.recurrentActivation),\n            useBias: this.useBias,\n            kernelInitializer: serializeInitializer(this.kernelInitializer),\n            recurrentInitializer: serializeInitializer(this.recurrentInitializer),\n            biasInitializer: serializeInitializer(this.biasInitializer),\n            unitForgetBias: this.unitForgetBias,\n            kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n            recurrentRegularizer: serializeRegularizer(this.recurrentRegularizer),\n            biasRegularizer: serializeRegularizer(this.biasRegularizer),\n            activityRegularizer: serializeRegularizer(this.activityRegularizer),\n            kernelConstraint: serializeConstraint(this.kernelConstraint),\n            recurrentConstraint: serializeConstraint(this.recurrentConstraint),\n            biasConstraint: serializeConstraint(this.biasConstraint),\n            dropout: this.dropout,\n            recurrentDropout: this.recurrentDropout,\n            implementation: this.implementation,\n        };\n        return Object.assign({}, baseConfig, config);\n    }\n}\n/** @nocollapse */\nLSTMCell.className = 'LSTMCell';\nserialization.registerClass(LSTMCell);\nexport class LSTM extends RNN {\n    constructor(args) {\n        if (args.implementation === 0) {\n            console.warn('`implementation=0` has been deprecated, and now defaults to ' +\n                '`implementation=1`. Please update your layer call.');\n        }\n        args.cell = new LSTMCell(args);\n        super(args);\n        // TODO(cais): Add activityRegularizer.\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            if (this.cell.dropoutMask != null) {\n                tfc.dispose(this.cell.dropoutMask);\n                this.cell.dropoutMask = null;\n            }\n            if (this.cell.recurrentDropoutMask != null) {\n                tfc.dispose(this.cell.recurrentDropoutMask);\n                this.cell.recurrentDropoutMask = null;\n            }\n            const mask = kwargs == null ? null : kwargs['mask'];\n            const training = kwargs == null ? null : kwargs['training'];\n            const initialState = kwargs == null ? null : kwargs['initialState'];\n            return super.call(inputs, { mask, training, initialState });\n        });\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        if (config['implmentation'] === 0) {\n            config['implementation'] = 1;\n        }\n        return new cls(config);\n    }\n}\n/** @nocollapse */\nLSTM.className = 'LSTM';\nserialization.registerClass(LSTM);\nexport class StackedRNNCells extends RNNCell {\n    constructor(args) {\n        super(args);\n        this.cells = args.cells;\n    }\n    get stateSize() {\n        // States are a flat list in reverse order of the cell stack.\n        // This allows perserving the requirement `stack.statesize[0] ===\n        // outputDim`. E.g., states of a 2-layer LSTM would be `[h2, c2, h1, c1]`,\n        // assuming one LSTM has states `[h, c]`.\n        const stateSize = [];\n        for (const cell of this.cells.slice().reverse()) {\n            if (Array.isArray(cell.stateSize)) {\n                stateSize.push(...cell.stateSize);\n            }\n            else {\n                stateSize.push(cell.stateSize);\n            }\n        }\n        return stateSize;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = inputs;\n            let states = inputs.slice(1);\n            // Recover per-cell states.\n            const nestedStates = [];\n            for (const cell of this.cells.slice().reverse()) {\n                if (Array.isArray(cell.stateSize)) {\n                    nestedStates.push(states.splice(0, cell.stateSize.length));\n                }\n                else {\n                    nestedStates.push(states.splice(0, 1));\n                }\n            }\n            nestedStates.reverse();\n            // Call the cells in order and store the returned states.\n            const newNestedStates = [];\n            let callInputs;\n            for (let i = 0; i < this.cells.length; ++i) {\n                const cell = this.cells[i];\n                states = nestedStates[i];\n                // TODO(cais): Take care of constants.\n                if (i === 0) {\n                    callInputs = [inputs[0]].concat(states);\n                }\n                else {\n                    callInputs = [callInputs[0]].concat(states);\n                }\n                callInputs = cell.call(callInputs, kwargs);\n                newNestedStates.push(callInputs.slice(1));\n            }\n            // Format the new states as a flat list in reverse cell order.\n            states = [];\n            for (const cellStates of newNestedStates.slice().reverse()) {\n                states.push(...cellStates);\n            }\n            return [callInputs[0]].concat(states);\n        });\n    }\n    build(inputShape) {\n        if (isArrayOfShapes(inputShape)) {\n            // TODO(cais): Take care of input constants.\n            // const constantShape = inputShape.slice(1);\n            inputShape = inputShape[0];\n        }\n        inputShape = inputShape;\n        let outputDim;\n        this.cells.forEach((cell, i) => {\n            nameScope(`RNNCell_${i}`, () => {\n                // TODO(cais): Take care of input constants.\n                cell.build(inputShape);\n                if (Array.isArray(cell.stateSize)) {\n                    outputDim = cell.stateSize[0];\n                }\n                else {\n                    outputDim = cell.stateSize;\n                }\n                inputShape = [inputShape[0], outputDim];\n            });\n        });\n        this.built = true;\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const getCellConfig = (cell) => {\n            return {\n                'className': cell.getClassName(),\n                'config': cell.getConfig(),\n            };\n        };\n        const cellConfigs = this.cells.map(getCellConfig);\n        const config = { 'cells': cellConfigs };\n        return Object.assign({}, baseConfig, config);\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config, customObjects = {}) {\n        const cells = [];\n        for (const cellConfig of config['cells']) {\n            cells.push(deserialize(cellConfig, customObjects));\n        }\n        return new cls({ cells });\n    }\n    get trainableWeights() {\n        if (!this.trainable) {\n            return [];\n        }\n        const weights = [];\n        for (const cell of this.cells) {\n            weights.push(...cell.trainableWeights);\n        }\n        return weights;\n    }\n    get nonTrainableWeights() {\n        const weights = [];\n        for (const cell of this.cells) {\n            weights.push(...cell.nonTrainableWeights);\n        }\n        if (!this.trainable) {\n            const trainableWeights = [];\n            for (const cell of this.cells) {\n                trainableWeights.push(...cell.trainableWeights);\n            }\n            return trainableWeights.concat(weights);\n        }\n        return weights;\n    }\n    /**\n     * Retrieve the weights of a the model.\n     *\n     * @returns A flat `Array` of `tf.Tensor`s.\n     */\n    getWeights() {\n        const weights = [];\n        for (const cell of this.cells) {\n            weights.push(...cell.weights);\n        }\n        return batchGetValue(weights);\n    }\n    /**\n     * Set the weights of the model.\n     *\n     * @param weights An `Array` of `tf.Tensor`s with shapes and types matching\n     *     the output of `getWeights()`.\n     */\n    setWeights(weights) {\n        const tuples = [];\n        for (const cell of this.cells) {\n            const numParams = cell.weights.length;\n            const inputWeights = weights.splice(numParams);\n            for (let i = 0; i < cell.weights.length; ++i) {\n                tuples.push([cell.weights[i], inputWeights[i]]);\n            }\n        }\n        batchSetValue(tuples);\n    }\n}\n/** @nocollapse */\nStackedRNNCells.className = 'StackedRNNCells';\nserialization.registerClass(StackedRNNCells);\nexport function generateDropoutMask(args) {\n    const { ones, rate, training = false, count = 1, dropoutFunc } = args;\n    const droppedInputs = () => dropoutFunc != null ? dropoutFunc(ones(), rate) : K.dropout(ones(), rate);\n    const createMask = () => K.inTrainPhase(droppedInputs, ones, training);\n    // just in case count is provided with null or undefined\n    if (!count || count <= 1) {\n        return tfc.keep(createMask().clone());\n    }\n    const masks = Array(count).fill(undefined).map(createMask);\n    return masks.map(m => tfc.keep(m.clone()));\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjdXJyZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1sYXllcnMvc3JjL2xheWVycy9yZWN1cnJlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7O0dBUUc7QUFFSDs7R0FFRztBQUVILE9BQU8sS0FBSyxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFDN0MsT0FBTyxFQUFXLGFBQWEsRUFBVSxJQUFJLEVBQUUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsT0FBTyxFQUFhLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlFLE9BQU8sS0FBSyxDQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNwQyxPQUFPLEVBQW1DLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxTQUFTLEVBQUUsY0FBYyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDN0QsT0FBTyxFQUFDLEtBQUssRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxjQUFjLEVBQUUsV0FBVyxFQUF5QixJQUFJLEVBQUUsb0JBQW9CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUcvRyxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sS0FBSyxVQUFVLE1BQU0scUJBQXFCLENBQUM7QUFDbEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFD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QUFDO0lBRXZFLHdEQUF3RDtJQUN4RCxJQUFJLENBQUMsS0FBSyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUU7UUFDeEIsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDdkM7SUFFRCxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUUzRCxPQUFPLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGVuc29yRmxvdy5qcyBMYXllcnM6IFJlY3VycmVudCBOZXVyYWwgTmV0d29yayBMYXllcnMuXG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0RhdGFUeXBlLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QWN0aXZhdGlvbiwgZ2V0QWN0aXZhdGlvbiwgc2VyaWFsaXplQWN0aXZhdGlvbn0gZnJvbSAnLi4vYWN0aXZhdGlvbnMnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge25hbWVTY29wZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7Q29uc3RyYWludCwgQ29uc3RyYWludElkZW50aWZpZXIsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7SW5wdXRTcGVjLCBTeW1ib2xpY1RlbnNvcn0gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7TGF5ZXIsIExheWVyQXJnc30gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7QXR0cmlidXRlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2dldEluaXRpYWxpemVyLCBJbml0aWFsaXplciwgSW5pdGlhbGl6ZXJJZGVudGlmaWVyLCBPbmVzLCBzZXJpYWxpemVJbml0aWFsaXplcn0gZnJvbSAnLi4vaW5pdGlhbGl6ZXJzJztcbmltcG9ydCB7QWN0aXZhdGlvbklkZW50aWZpZXJ9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9hY3RpdmF0aW9uX2NvbmZpZyc7XG5pbXBvcnQge1NoYXBlfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7Z2V0UmVndWxhcml6ZXIsIFJlZ3VsYXJpemVyLCBSZWd1bGFyaXplcklkZW50aWZpZXIsIHNlcmlhbGl6ZVJlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3MsIFJublN0ZXBGdW5jdGlvbn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHthc3NlcnRQb3NpdGl2ZUludGVnZXJ9IGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuaW1wb3J0ICogYXMgbWF0aF91dGlscyBmcm9tICcuLi91dGlscy9tYXRoX3V0aWxzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlLCBnZXRFeGFjdGx5T25lVGVuc29yLCBpc0FycmF5T2ZTaGFwZXN9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7YmF0Y2hHZXRWYWx1ZSwgYmF0Y2hTZXRWYWx1ZSwgTGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuaW1wb3J0IHtkZXNlcmlhbGl6ZX0gZnJvbSAnLi9zZXJpYWxpemF0aW9uJztcblxuLyoqXG4gKiBTdGFuZGFyZGl6ZSBgYXBwbHkoKWAgYXJncyB0byBhIHNpbmdsZSBsaXN0IG9mIHRlbnNvciBpbnB1dHMuXG4gKlxuICogV2hlbiBydW5uaW5nIGEgbW9kZWwgbG9hZGVkIGZyb20gZmlsZSwgdGhlIGlucHV0IHRlbnNvcnMgYGluaXRpYWxTdGF0ZWAgYW5kXG4gKiBgY29uc3RhbnRzYCBhcmUgcGFzc2VkIHRvIGBSTk4uYXBwbHkoKWAgYXMgcGFydCBvZiBgaW5wdXRzYCBpbnN0ZWFkIG9mIHRoZVxuICogZGVkaWNhdGVkIGt3YXJncyBmaWVsZHMuIGBpbnB1dHNgIGNvbnNpc3RzIG9mXG4gKiBgW2lucHV0cywgaW5pdGlhbFN0YXRlMCwgaW5pdGlhbFN0YXRlMSwgLi4uLCBjb25zdGFudDAsIGNvbnN0YW50MV1gIGluIHRoaXNcbiAqIGNhc2UuXG4gKiBUaGlzIG1ldGhvZCBtYWtlcyBzdXJlIHRoYXQgYXJndW1lbnRzIGFyZVxuICogc2VwYXJhdGVkIGFuZCB0aGF0IGBpbml0aWFsU3RhdGVgIGFuZCBgY29uc3RhbnRzYCBhcmUgYEFycmF5YHMgb2YgdGVuc29yc1xuICogKG9yIE5vbmUpLlxuICpcbiAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIG9yIGBBcnJheWAgb2YgIHRlbnNvcnMuXG4gKiBAcGFyYW0gaW5pdGlhbFN0YXRlIFRlbnNvciBvciBgQXJyYXlgIG9mIHRlbnNvcnMgb3IgYG51bGxgL2B1bmRlZmluZWRgLlxuICogQHBhcmFtIGNvbnN0YW50cyBUZW5zb3Igb3IgYEFycmF5YCBvZiB0ZW5zb3JzIG9yIGBudWxsYC9gdW5kZWZpbmVkYC5cbiAqIEByZXR1cm5zIEFuIG9iamVjdCBjb25zaXN0aW5nIG9mXG4gKiAgIGlucHV0czogQSB0ZW5zb3IuXG4gKiAgIGluaXRpYWxTdGF0ZTogYEFycmF5YCBvZiB0ZW5zb3JzIG9yIGBudWxsYC5cbiAqICAgY29uc3RhbnRzOiBgQXJyYXlgIG9mIHRlbnNvcnMgb3IgYG51bGxgLlxuICogQHRocm93cyBWYWx1ZUVycm9yLCBpZiBgaW5wdXRzYCBpcyBhbiBgQXJyYXlgIGJ1dCBlaXRoZXIgYGluaXRpYWxTdGF0ZWAgb3JcbiAqICAgYGNvbnN0YW50c2AgaXMgcHJvdmlkZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzdGFuZGFyZGl6ZUFyZ3MoXG4gICAgaW5wdXRzOiBUZW5zb3J8VGVuc29yW118U3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXSxcbiAgICBpbml0aWFsU3RhdGU6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgIGNvbnN0YW50czogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10sXG4gICAgbnVtQ29uc3RhbnRzPzogbnVtYmVyKToge1xuICBpbnB1dHM6IFRlbnNvcnxTeW1ib2xpY1RlbnNvcixcbiAgaW5pdGlhbFN0YXRlOiBUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcltdLFxuICBjb25zdGFudHM6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW11cbn0ge1xuICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgaWYgKGluaXRpYWxTdGF0ZSAhPSBudWxsIHx8IGNvbnN0YW50cyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnV2hlbiBpbnB1dHMgaXMgYW4gYXJyYXksIG5laXRoZXIgaW5pdGlhbFN0YXRlIG9yIGNvbnN0YW50cyAnICtcbiAgICAgICAgICAnc2hvdWxkIGJlIHByb3ZpZGVkJyk7XG4gICAgfVxuICAgIGlmIChudW1Db25zdGFudHMgIT0gbnVsbCkge1xuICAgICAgY29uc3RhbnRzID0gaW5wdXRzLnNsaWNlKGlucHV0cy5sZW5ndGggLSBudW1Db25zdGFudHMsIGlucHV0cy5sZW5ndGgpO1xuICAgICAgaW5wdXRzID0gaW5wdXRzLnNsaWNlKDAsIGlucHV0cy5sZW5ndGggLSBudW1Db25zdGFudHMpO1xuICAgIH1cbiAgICBpZiAoaW5wdXRzLmxlbmd0aCA+IDEpIHtcbiAgICAgIGluaXRpYWxTdGF0ZSA9IGlucHV0cy5zbGljZSgxLCBpbnB1dHMubGVuZ3RoKTtcbiAgICB9XG4gICAgaW5wdXRzID0gaW5wdXRzWzBdO1xuICB9XG5cbiAgZnVuY3Rpb24gdG9MaXN0T3JOdWxsKHg6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxcbiAgICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbGljVGVuc29yW10pOiBUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcltdIHtcbiAgICBpZiAoeCA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoeCkpIHtcbiAgICAgIHJldHVybiB4IGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFt4XSBhcyBUZW5zb3JbXSB8IFN5bWJvbGljVGVuc29yW107XG4gICAgfVxuICB9XG5cbiAgaW5pdGlhbFN0YXRlID0gdG9MaXN0T3JOdWxsKGluaXRpYWxTdGF0ZSk7XG4gIGNvbnN0YW50cyA9IHRvTGlzdE9yTnVsbChjb25zdGFudHMpO1xuXG4gIHJldHVybiB7aW5wdXRzLCBpbml0aWFsU3RhdGUsIGNvbnN0YW50c307XG59XG5cbi8qKlxuICogSXRlcmF0ZXMgb3ZlciB0aGUgdGltZSBkaW1lbnNpb24gb2YgYSB0ZW5zb3IuXG4gKlxuICogQHBhcmFtIHN0ZXBGdW5jdGlvbiBSTk4gc3RlcCBmdW5jdGlvbi5cbiAqICAgUGFyYW1ldGVyczpcbiAqICAgICBpbnB1dHM6IHRlbnNvciB3aXRoIHNoYXBlIGBbc2FtcGxlcywgLi4uXWAgKG5vIHRpbWUgZGltZW5zaW9uKSxcbiAqICAgICAgIHJlcHJlc2VudGluZyBpbnB1dCBmb3IgdGhlIGJhdGNoIG9mIHNhbXBsZXMgYXQgYSBjZXJ0YWluIHRpbWUgc3RlcC5cbiAqICAgICBzdGF0ZXM6IGFuIEFycmF5IG9mIHRlbnNvcnMuXG4gKiAgIFJldHVybnM6XG4gKiAgICAgb3V0cHV0czogdGVuc29yIHdpdGggc2hhcGUgYFtzYW1wbGVzLCBvdXRwdXREaW1dYCAobm8gdGltZSBkaW1lbnNpb24pLlxuICogICAgIG5ld1N0YXRlczogbGlzdCBvZiB0ZW5zb3JzLCBzYW1lIGxlbmd0aCBhbmQgc2hhcGVzIGFzIGBzdGF0ZXNgLiBUaGUgZmlyc3RcbiAqICAgICAgIHN0YXRlIGluIHRoZSBsaXN0IG11c3QgYmUgdGhlIG91dHB1dCB0ZW5zb3IgYXQgdGhlIHByZXZpb3VzIHRpbWVzdGVwLlxuICogQHBhcmFtIGlucHV0cyBUZW5zb3Igb2YgdGVtcG9yYWwgZGF0YSBvZiBzaGFwZSBgW3NhbXBsZXMsIHRpbWUsIC4uLl1gIChhdFxuICogICBsZWFzdCAzRCkuXG4gKiBAcGFyYW0gaW5pdGlhbFN0YXRlcyBUZW5zb3Igd2l0aCBzaGFwZSBgW3NhbXBsZXMsIG91dHB1dERpbV1gIChubyB0aW1lXG4gKiAgIGRpbWVuc2lvbiksIGNvbnRhaW5pbmcgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBzdGF0ZXMgdXNlZCBpbiB0aGUgc3RlcFxuICogICBmdW5jdGlvbi5cbiAqIEBwYXJhbSBnb0JhY2t3YXJkcyBJZiBgdHJ1ZWAsIGRvIHRoZSBpdGVyYXRpb24gb3ZlciB0aGUgdGltZSBkaW1lbnNpb24gaW5cbiAqICAgcmV2ZXJzZSBvcmRlciBhbmQgcmV0dXJuIHRoZSByZXZlcnNlZCBzZXF1ZW5jZS5cbiAqIEBwYXJhbSBtYXNrIEJpbmFyeSB0ZW5zb3Igd2l0aCBzaGFwZSBgW3NhbXBsZSwgdGltZSwgMV1gLCB3aXRoIGEgemVybyBmb3JcbiAqICAgZXZlcnkgZWxlbWVudCB0aGF0IGlzIG1hc2tlZC5cbiAqIEBwYXJhbSBjb25zdGFudHMgQW4gQXJyYXkgb2YgY29uc3RhbnQgdmFsdWVzIHBhc3NlZCBhdCBlYWNoIHN0ZXAuXG4gKiBAcGFyYW0gdW5yb2xsIFdoZXRoZXIgdG8gdW5yb2xsIHRoZSBSTk4gb3IgdG8gdXNlIGEgc3ltYm9saWMgbG9vcC4gKk5vdCpcbiAqICAgYXBwbGljYWJsZSB0byB0aGlzIGltcGVyYXRpdmUgZGVlcGxlYXJuLmpzIGJhY2tlbmQuIEl0cyB2YWx1ZSBpcyBpZ25vcmVkLlxuICogQHBhcmFtIG5lZWRQZXJTdGVwT3V0cHV0cyBXaGV0aGVyIHRoZSBwZXItc3RlcCBvdXRwdXRzIGFyZSB0byBiZVxuICogICBjb25jYXRlbmF0ZWQgaW50byBhIHNpbmdsZSB0ZW5zb3IgYW5kIHJldHVybmVkIChhcyB0aGUgc2Vjb25kIHJldHVyblxuICogICB2YWx1ZSkuIERlZmF1bHQ6IGBmYWxzZWAuIFRoaXMgYXJnIGlzIGluY2x1ZGVkIHNvIHRoYXQgdGhlIHJlbGF0aXZlbHlcbiAqICAgZXhwZW5zaXZlIGNvbmNhdGVuYXRpb24gb2YgdGhlIHN0ZXB3aXNlIG91dHB1dHMgY2FuIGJlIG9taXR0ZWQgdW5sZXNzXG4gKiAgIHRoZSBzdGVwd2lzZSBvdXRwdXRzIG5lZWQgdG8gYmUga2VwdCAoZS5nLiwgZm9yIGFuIExTVE0gbGF5ZXIgb2Ygd2hpY2hcbiAqICAgYHJldHVyblNlcXVlbmNlYCBpcyBgdHJ1ZWAuKVxuICogQHJldHVybnMgQW4gQXJyYXk6IGBbbGFzdE91dHB1dCwgb3V0cHV0cywgbmV3U3RhdGVzXWAuXG4gKiAgIGxhc3RPdXRwdXQ6IHRoZSBsYXN0ZXN0IG91dHB1dCBvZiB0aGUgUk5OLCBvZiBzaGFwZSBgW3NhbXBsZXMsIC4uLl1gLlxuICogICBvdXRwdXRzOiB0ZW5zb3Igd2l0aCBzaGFwZSBgW3NhbXBsZXMsIHRpbWUsIC4uLl1gIHdoZXJlIGVhY2ggZW50cnlcbiAqICAgICBgb3V0cHV0W3MsIHRdYCBpcyB0aGUgb3V0cHV0IG9mIHRoZSBzdGVwIGZ1bmN0aW9uIGF0IHRpbWUgYHRgIGZvciBzYW1wbGVcbiAqICAgICBgc2AuIFRoaXMgcmV0dXJuIHZhbHVlIGlzIHByb3ZpZGVkIGlmIGFuZCBvbmx5IGlmIHRoZVxuICogICAgIGBuZWVkUGVyU3RlcE91dHB1dHNgIGlzIHNldCBhcyBgdHJ1ZWAuIElmIGl0IGlzIHNldCBhcyBgZmFsc2VgLCB0aGlzXG4gKiAgICAgcmV0dXJuIHZhbHVlIHdpbGwgYmUgYHVuZGVmaW5lZGAuXG4gKiAgIG5ld1N0YXRlczogQXJyYXkgb2YgdGVuc29ycywgbGF0ZXN0IHN0YXRlcyByZXR1cm5lZCBieSB0aGUgc3RlcCBmdW5jdGlvbixcbiAqICAgICAgb2Ygc2hhcGUgYChzYW1wbGVzLCAuLi4pYC5cbiAqIEB0aHJvd3MgVmFsdWVFcnJvciBJZiBpbnB1dCBkaW1lbnNpb24gaXMgbGVzcyB0aGFuIDMuXG4gKlxuICogVE9ETyhuaWVsc2VuZSk6IFRoaXMgbmVlZHMgdG8gYmUgdGlkeS1lZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJubihcbiAgICBzdGVwRnVuY3Rpb246IFJublN0ZXBGdW5jdGlvbiwgaW5wdXRzOiBUZW5zb3IsIGluaXRpYWxTdGF0ZXM6IFRlbnNvcltdLFxuICAgIGdvQmFja3dhcmRzID0gZmFsc2UsIG1hc2s/OiBUZW5zb3IsIGNvbnN0YW50cz86IFRlbnNvcltdLCB1bnJvbGwgPSBmYWxzZSxcbiAgICBuZWVkUGVyU3RlcE91dHB1dHMgPSBmYWxzZSk6IFtUZW5zb3IsIFRlbnNvciwgVGVuc29yW11dIHtcbiAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICBjb25zdCBuZGltID0gaW5wdXRzLnNoYXBlLmxlbmd0aDtcbiAgICBpZiAobmRpbSA8IDMpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGBJbnB1dCBzaG91bGQgYmUgYXQgbGVhc3QgM0QsIGJ1dCBpcyAke25kaW19RC5gKTtcbiAgICB9XG5cbiAgICAvLyBUcmFuc3Bvc2UgdG8gdGltZS1tYWpvciwgaS5lLiwgZnJvbSBbYmF0Y2gsIHRpbWUsIC4uLl0gdG8gW3RpbWUsIGJhdGNoLFxuICAgIC8vIC4uLl0uXG4gICAgY29uc3QgYXhlcyA9IFsxLCAwXS5jb25jYXQobWF0aF91dGlscy5yYW5nZSgyLCBuZGltKSk7XG4gICAgaW5wdXRzID0gdGZjLnRyYW5zcG9zZShpbnB1dHMsIGF4ZXMpO1xuXG4gICAgaWYgKGNvbnN0YW50cyAhPSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgICAnVGhlIHJubigpIGZ1bmN0b2luIG9mIHRoZSBkZWVwbGVhcm4uanMgYmFja2VuZCBkb2VzIG5vdCBzdXBwb3J0ICcgK1xuICAgICAgICAgICdjb25zdGFudHMgeWV0LicpO1xuICAgIH1cblxuICAgIC8vIFBvcnRpbmcgTm90ZTogdGhlIHVucm9sbCBvcHRpb24gaXMgaWdub3JlZCBieSB0aGUgaW1wZXJhdGl2ZSBiYWNrZW5kLlxuICAgIGlmICh1bnJvbGwpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAnQmFja2VuZCBybm4oKTogdGhlIHVucm9sbCA9IHRydWUgb3B0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIHRvIHRoZSAnICtcbiAgICAgICAgICAnaW1wZXJhdGl2ZSBkZWVwbGVhcm4uanMgYmFja2VuZC4nKTtcbiAgICB9XG5cbiAgICBpZiAobWFzayAhPSBudWxsKSB7XG4gICAgICBtYXNrID0gdGZjLmNhc3QodGZjLmNhc3QobWFzaywgJ2Jvb2wnKSwgJ2Zsb2F0MzInKTtcbiAgICAgIGlmIChtYXNrLnJhbmsgPT09IG5kaW0gLSAxKSB7XG4gICAgICAgIG1hc2sgPSB0ZmMuZXhwYW5kRGltcyhtYXNrLCAtMSk7XG4gICAgICB9XG4gICAgICBtYXNrID0gdGZjLnRyYW5zcG9zZShtYXNrLCBheGVzKTtcbiAgICB9XG5cbiAgICBpZiAoZ29CYWNrd2FyZHMpIHtcbiAgICAgIGlucHV0cyA9IHRmYy5yZXZlcnNlKGlucHV0cywgMCk7XG4gICAgICBpZiAobWFzayAhPSBudWxsKSB7XG4gICAgICAgIG1hc2sgPSB0ZmMucmV2ZXJzZShtYXNrLCAwKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQb3J0aW5nIE5vdGU6IFB5S2VyYXMgd2l0aCBUZW5zb3JGbG93IGJhY2tlbmQgdXNlcyBhIHN5bWJvbGljIGxvb3BcbiAgICAvLyAgICh0Zi53aGlsZV9sb29wKS4gQnV0IGZvciB0aGUgaW1wZXJhdGl2ZSBkZWVwbGVhcm4uanMgYmFja2VuZCwgd2UganVzdFxuICAgIC8vICAgdXNlIHRoZSB1c3VhbCBUeXBlU2NyaXB0IGNvbnRyb2wgZmxvdyB0byBpdGVyYXRlIG92ZXIgdGhlIHRpbWUgc3RlcHMgaW5cbiAgICAvLyAgIHRoZSBpbnB1dHMuXG4gICAgLy8gUG9ydGluZyBOb3RlOiBQeUtlcmFzIHBhdGNoZXMgYSBcIl91c2VfbGVhcm5pbmdfcGhhc2VcIiBhdHRyaWJ1dGUgdG9cbiAgICAvLyBvdXRwdXRzLlxuICAgIC8vICAgVGhpcyBpcyBub3QgaWRpb21hdGljIGluIFR5cGVTY3JpcHQuIFRoZSBpbmZvIHJlZ2FyZGluZyB3aGV0aGVyIHdlIGFyZVxuICAgIC8vICAgaW4gYSBsZWFybmluZyAoaS5lLiwgdHJhaW5pbmcpIHBoYXNlIGZvciBSTk4gaXMgcGFzc2VkIGluIGEgZGlmZmVyZW50XG4gICAgLy8gICB3YXkuXG5cbiAgICBjb25zdCBwZXJTdGVwT3V0cHV0czogVGVuc29yW10gPSBbXTtcbiAgICBsZXQgbGFzdE91dHB1dDogVGVuc29yO1xuICAgIGxldCBzdGF0ZXMgPSBpbml0aWFsU3RhdGVzO1xuICAgIGNvbnN0IHRpbWVTdGVwcyA9IGlucHV0cy5zaGFwZVswXTtcbiAgICBjb25zdCBwZXJTdGVwSW5wdXRzID0gdGZjLnVuc3RhY2soaW5wdXRzKTtcbiAgICBsZXQgcGVyU3RlcE1hc2tzOiBUZW5zb3JbXTtcbiAgICBpZiAobWFzayAhPSBudWxsKSB7XG4gICAgICBwZXJTdGVwTWFza3MgPSB0ZmMudW5zdGFjayhtYXNrKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCB0ID0gMDsgdCA8IHRpbWVTdGVwczsgKyt0KSB7XG4gICAgICBjb25zdCBjdXJyZW50SW5wdXQgPSBwZXJTdGVwSW5wdXRzW3RdO1xuICAgICAgY29uc3Qgc3RlcE91dHB1dHMgPSB0ZmMudGlkeSgoKSA9PiBzdGVwRnVuY3Rpb24oY3VycmVudElucHV0LCBzdGF0ZXMpKTtcblxuICAgICAgaWYgKG1hc2sgPT0gbnVsbCkge1xuICAgICAgICBsYXN0T3V0cHV0ID0gc3RlcE91dHB1dHNbMF07XG4gICAgICAgIHN0YXRlcyA9IHN0ZXBPdXRwdXRzWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgbWFza2VkT3V0cHV0cyA9IHRmYy50aWR5KCgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGVwTWFzayA9IHBlclN0ZXBNYXNrc1t0XTtcbiAgICAgICAgICBjb25zdCBuZWdTdGVwTWFzayA9IHRmYy5zdWIodGZjLm9uZXNMaWtlKHN0ZXBNYXNrKSwgc3RlcE1hc2spO1xuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFdvdWxkIHRmYy53aGVyZSgpIGJlIGJldHRlciBmb3IgcGVyZm9ybWFuY2U/XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gdGZjLmFkZChcbiAgICAgICAgICAgICAgdGZjLm11bChzdGVwT3V0cHV0c1swXSwgc3RlcE1hc2spLFxuICAgICAgICAgICAgICB0ZmMubXVsKHN0YXRlc1swXSwgbmVnU3RlcE1hc2spKTtcbiAgICAgICAgICBjb25zdCBuZXdTdGF0ZXMgPSBzdGF0ZXMubWFwKChzdGF0ZSwgaSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHRmYy5hZGQoXG4gICAgICAgICAgICAgICAgdGZjLm11bChzdGVwT3V0cHV0c1sxXVtpXSwgc3RlcE1hc2spLFxuICAgICAgICAgICAgICAgIHRmYy5tdWwoc3RhdGUsIG5lZ1N0ZXBNYXNrKSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHtvdXRwdXQsIG5ld1N0YXRlc307XG4gICAgICAgIH0pO1xuICAgICAgICBsYXN0T3V0cHV0ID0gbWFza2VkT3V0cHV0cy5vdXRwdXQ7XG4gICAgICAgIHN0YXRlcyA9IG1hc2tlZE91dHB1dHMubmV3U3RhdGVzO1xuICAgICAgfVxuXG4gICAgICBpZiAobmVlZFBlclN0ZXBPdXRwdXRzKSB7XG4gICAgICAgIHBlclN0ZXBPdXRwdXRzLnB1c2gobGFzdE91dHB1dCk7XG4gICAgICB9XG4gICAgfVxuICAgIGxldCBvdXRwdXRzOiBUZW5zb3I7XG4gICAgaWYgKG5lZWRQZXJTdGVwT3V0cHV0cykge1xuICAgICAgY29uc3QgYXhpcyA9IDE7XG4gICAgICBvdXRwdXRzID0gdGZjLnN0YWNrKHBlclN0ZXBPdXRwdXRzLCBheGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIFtsYXN0T3V0cHV0LCBvdXRwdXRzLCBzdGF0ZXNdIGFzIFtUZW5zb3IsIFRlbnNvciwgVGVuc29yW11dO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEJhc2VSTk5MYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogQSBSTk4gY2VsbCBpbnN0YW5jZS4gQSBSTk4gY2VsbCBpcyBhIGNsYXNzIHRoYXQgaGFzOlxuICAgKiAgIC0gYSBgY2FsbCgpYCBtZXRob2QsIHdoaWNoIHRha2VzIGBbVGVuc29yLCBUZW5zb3JdYCBhcyB0aGVcbiAgICogICAgIGZpcnN0IGlucHV0IGFyZ3VtZW50LiBUaGUgZmlyc3QgaXRlbSBpcyB0aGUgaW5wdXQgYXQgdGltZSB0LCBhbmRcbiAgICogICAgIHNlY29uZCBpdGVtIGlzIHRoZSBjZWxsIHN0YXRlIGF0IHRpbWUgdC5cbiAgICogICAgIFRoZSBgY2FsbCgpYCBtZXRob2QgcmV0dXJucyBgW291dHB1dEF0VCwgc3RhdGVzQXRUUGx1czFdYC5cbiAgICogICAgIFRoZSBgY2FsbCgpYCBtZXRob2Qgb2YgdGhlIGNlbGwgY2FuIGFsc28gdGFrZSB0aGUgYXJndW1lbnQgYGNvbnN0YW50c2AsXG4gICAqICAgICBzZWUgc2VjdGlvbiBcIk5vdGUgb24gcGFzc2luZyBleHRlcm5hbCBjb25zdGFudHNcIiBiZWxvdy5cbiAgICogICAgIFBvcnRpbmcgTm9kZTogUHlLZXJhcyBvdmVycmlkZXMgdGhlIGBjYWxsKClgIHNpZ25hdHVyZSBvZiBSTk4gY2VsbHMsXG4gICAqICAgICAgIHdoaWNoIGFyZSBMYXllciBzdWJ0eXBlcywgdG8gYWNjZXB0IHR3byBhcmd1bWVudHMuIHRmanMtbGF5ZXJzIGRvZXNcbiAgICogICAgICAgbm90IGRvIHN1Y2ggb3ZlcnJpZGluZy4gSW5zdGVhZCB3ZSBwcmVzZXZlIHRoZSBgY2FsbCgpYCBzaWduYXR1cmUsXG4gICAqICAgICAgIHdoaWNoIGR1ZSB0byBpdHMgYFRlbnNvcnxUZW5zb3JbXWAgYXJndW1lbnQgYW5kIHJldHVybiB2YWx1ZSBpc1xuICAgKiAgICAgICBmbGV4aWJsZSBlbm91Z2ggdG8gaGFuZGxlIHRoZSBpbnB1dHMgYW5kIHN0YXRlcy5cbiAgICogICAtIGEgYHN0YXRlU2l6ZWAgYXR0cmlidXRlLiBUaGlzIGNhbiBiZSBhIHNpbmdsZSBpbnRlZ2VyIChzaW5nbGUgc3RhdGUpXG4gICAqICAgICBpbiB3aGljaCBjYXNlIGl0IGlzIHRoZSBzaXplIG9mIHRoZSByZWN1cnJlbnQgc3RhdGUgKHdoaWNoIHNob3VsZCBiZVxuICAgKiAgICAgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgdGhlIGNlbGwgb3V0cHV0KS4gVGhpcyBjYW4gYWxzbyBiZSBhbiBBcnJheSBvZlxuICAgKiAgICAgaW50ZWdlcnMgKG9uZSBzaXplIHBlciBzdGF0ZSkuIEluIHRoaXMgY2FzZSwgdGhlIGZpcnN0IGVudHJ5XG4gICAqICAgICAoYHN0YXRlU2l6ZVswXWApIHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgc2l6ZSBvZiB0aGUgY2VsbCBvdXRwdXQuXG4gICAqIEl0IGlzIGFsc28gcG9zc2libGUgZm9yIGBjZWxsYCB0byBiZSBhIGxpc3Qgb2YgUk5OIGNlbGwgaW5zdGFuY2VzLCBpbiB3aGljaFxuICAgKiBjYXNlIHRoZSBjZWxscyBnZXQgc3RhY2tlZCBvbiBhZnRlciB0aGUgb3RoZXIgaW4gdGhlIFJOTiwgaW1wbGVtZW50aW5nIGFuXG4gICAqIGVmZmljaWVudCBzdGFja2VkIFJOTi5cbiAgICovXG4gIGNlbGw/OiBSTk5DZWxsfFJOTkNlbGxbXTtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXR1cm4gdGhlIGxhc3Qgb3V0cHV0IGluIHRoZSBvdXRwdXQgc2VxdWVuY2UsIG9yIHRoZSBmdWxsXG4gICAqIHNlcXVlbmNlLlxuICAgKi9cbiAgcmV0dXJuU2VxdWVuY2VzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hldGhlciB0byByZXR1cm4gdGhlIGxhc3Qgc3RhdGUgaW4gYWRkaXRpb24gdG8gdGhlIG91dHB1dC5cbiAgICovXG4gIHJldHVyblN0YXRlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBwcm9jZXNzIHRoZSBpbnB1dCBzZXF1ZW5jZSBiYWNrd2FyZHMgYW5kIHJldHVybiB0aGUgcmV2ZXJzZWRcbiAgICogc2VxdWVuY2UgKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKi9cbiAgZ29CYWNrd2FyZHM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBsYXN0IHN0YXRlIGZvciBlYWNoIHNhbXBsZSBhdCBpbmRleCBpIGluIGEgYmF0Y2ggd2lsbCBiZVxuICAgKiB1c2VkIGFzIGluaXRpYWwgc3RhdGUgb2YgdGhlIHNhbXBsZSBvZiBpbmRleCBpIGluIHRoZSBmb2xsb3dpbmcgYmF0Y2hcbiAgICogKGRlZmF1bHQ6IGBmYWxzZWApLlxuICAgKlxuICAgKiBZb3UgY2FuIHNldCBSTk4gbGF5ZXJzIHRvIGJlIFwic3RhdGVmdWxcIiwgd2hpY2ggbWVhbnMgdGhhdCB0aGUgc3RhdGVzXG4gICAqIGNvbXB1dGVkIGZvciB0aGUgc2FtcGxlcyBpbiBvbmUgYmF0Y2ggd2lsbCBiZSByZXVzZWQgYXMgaW5pdGlhbCBzdGF0ZXNcbiAgICogZm9yIHRoZSBzYW1wbGVzIGluIHRoZSBuZXh0IGJhdGNoLiBUaGlzIGFzc3VtZXMgYSBvbmUtdG8tb25lIG1hcHBpbmdcbiAgICogYmV0d2VlbiBzYW1wbGVzIGluIGRpZmZlcmVudCBzdWNjZXNzaXZlIGJhdGNoZXMuXG4gICAqXG4gICAqIFRvIGVuYWJsZSBcInN0YXRlZnVsbmVzc1wiOlxuICAgKiAgIC0gc3BlY2lmeSBgc3RhdGVmdWw6IHRydWVgIGluIHRoZSBsYXllciBjb25zdHJ1Y3Rvci5cbiAgICogICAtIHNwZWNpZnkgYSBmaXhlZCBiYXRjaCBzaXplIGZvciB5b3VyIG1vZGVsLCBieSBwYXNzaW5nXG4gICAqICAgICAtIGlmIHNlcXVlbnRpYWwgbW9kZWw6XG4gICAqICAgICAgIGBiYXRjaElucHV0U2hhcGU6IFsuLi5dYCB0byB0aGUgZmlyc3QgbGF5ZXIgaW4geW91ciBtb2RlbC5cbiAgICogICAgIC0gZWxzZSBmb3IgZnVuY3Rpb25hbCBtb2RlbCB3aXRoIDEgb3IgbW9yZSBJbnB1dCBsYXllcnM6XG4gICAqICAgICAgIGBiYXRjaFNoYXBlOiBbLi4uXWAgdG8gYWxsIHRoZSBmaXJzdCBsYXllcnMgaW4geW91ciBtb2RlbC5cbiAgICogICAgIFRoaXMgaXMgdGhlIGV4cGVjdGVkIHNoYXBlIG9mIHlvdXIgaW5wdXRzXG4gICAqICAgICAqaW5jbHVkaW5nIHRoZSBiYXRjaCBzaXplKi5cbiAgICogICAgIEl0IHNob3VsZCBiZSBhIHR1cGxlIG9mIGludGVnZXJzLCBlLmcuLCBgWzMyLCAxMCwgMTAwXWAuXG4gICAqICAgLSBzcGVjaWZ5IGBzaHVmZmxlOiBmYWxzZWAgd2hlbiBjYWxsaW5nIGBMYXllcnNNb2RlbC5maXQoKWAuXG4gICAqXG4gICAqIFRvIHJlc2V0IHRoZSBzdGF0ZSBvZiB5b3VyIG1vZGVsLCBjYWxsIGByZXNldFN0YXRlcygpYCBvbiBlaXRoZXIgdGhlXG4gICAqIHNwZWNpZmljIGxheWVyIG9yIG9uIHRoZSBlbnRpcmUgbW9kZWwuXG4gICAqL1xuICBzdGF0ZWZ1bD86IGJvb2xlYW47XG4gIC8vIFRPRE8oY2Fpcyk6IEV4cGxvcmUgd2hldGhlciB3ZSBjYW4gd2FybiB1c2VycyB3aGVuIHRoZXkgZmFpbCB0byBzZXRcbiAgLy8gICBgc2h1ZmZsZTogZmFsc2VgIHdoZW4gdHJhaW5pbmcgYSBtb2RlbCBjb25zaXN0aW5nIG9mIHN0YXRlZnVsIFJOTnNcbiAgLy8gICBhbmQgYW55IHN0YXRlZnVsIExheWVycyBpbiBnZW5lcmFsLlxuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIHRoZSBuZXR3b3JrIHdpbGwgYmUgdW5yb2xsZWQsIGVsc2UgYSBzeW1ib2xpYyBsb29wIHdpbGwgYmVcbiAgICogdXNlZC4gVW5yb2xsaW5nIGNhbiBzcGVlZCB1cCBhIFJOTiwgYWx0aG91Z2ggaXQgdGVuZHMgdG8gYmUgbW9yZVxuICAgKiBtZW1vcnktaW50ZW5zaXZlLiBVbnJvbGxpbmcgaXMgb25seSBzdWl0YWJsZSBmb3Igc2hvcnQgc2VxdWVuY2VzIChkZWZhdWx0OlxuICAgKiBgZmFsc2VgKS5cbiAgICogUG9ydGluZyBOb3RlOiB0ZmpzLWxheWVycyBoYXMgYW4gaW1wZXJhdGl2ZSBiYWNrZW5kLiBSTk5zIGFyZSBleGVjdXRlZCB3aXRoXG4gICAqICAgbm9ybWFsIFR5cGVTY3JpcHQgY29udHJvbCBmbG93LiBIZW5jZSB0aGlzIHByb3BlcnR5IGlzIGluYXBwbGljYWJsZSBhbmRcbiAgICogICBpZ25vcmVkIGluIHRmanMtbGF5ZXJzLlxuICAgKi9cbiAgdW5yb2xsPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogRGltZW5zaW9uYWxpdHkgb2YgdGhlIGlucHV0IChpbnRlZ2VyKS5cbiAgICogICBUaGlzIG9wdGlvbiAob3IgYWx0ZXJuYXRpdmVseSwgdGhlIG9wdGlvbiBgaW5wdXRTaGFwZWApIGlzIHJlcXVpcmVkIHdoZW5cbiAgICogICB0aGlzIGxheWVyIGlzIHVzZWQgYXMgdGhlIGZpcnN0IGxheWVyIGluIGEgbW9kZWwuXG4gICAqL1xuICBpbnB1dERpbT86IG51bWJlcjtcblxuICAvKipcbiAgICogTGVuZ3RoIG9mIHRoZSBpbnB1dCBzZXF1ZW5jZXMsIHRvIGJlIHNwZWNpZmllZCB3aGVuIGl0IGlzIGNvbnN0YW50LlxuICAgKiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGlmIHlvdSBhcmUgZ29pbmcgdG8gY29ubmVjdCBgRmxhdHRlbmAgdGhlblxuICAgKiBgRGVuc2VgIGxheWVycyB1cHN0cmVhbSAod2l0aG91dCBpdCwgdGhlIHNoYXBlIG9mIHRoZSBkZW5zZSBvdXRwdXRzIGNhbm5vdFxuICAgKiBiZSBjb21wdXRlZCkuIE5vdGUgdGhhdCBpZiB0aGUgcmVjdXJyZW50IGxheWVyIGlzIG5vdCB0aGUgZmlyc3QgbGF5ZXIgaW5cbiAgICogeW91ciBtb2RlbCwgeW91IHdvdWxkIG5lZWQgdG8gc3BlY2lmeSB0aGUgaW5wdXQgbGVuZ3RoIGF0IHRoZSBsZXZlbCBvZiB0aGVcbiAgICogZmlyc3QgbGF5ZXIgKGUuZy4sIHZpYSB0aGUgYGlucHV0U2hhcGVgIG9wdGlvbikuXG4gICAqL1xuICBpbnB1dExlbmd0aD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIFJOTiBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUk5OJztcbiAgcHVibGljIHJlYWRvbmx5IGNlbGw6IFJOTkNlbGw7XG4gIHB1YmxpYyByZWFkb25seSByZXR1cm5TZXF1ZW5jZXM6IGJvb2xlYW47XG4gIHB1YmxpYyByZWFkb25seSByZXR1cm5TdGF0ZTogYm9vbGVhbjtcbiAgcHVibGljIHJlYWRvbmx5IGdvQmFja3dhcmRzOiBib29sZWFuO1xuICBwdWJsaWMgcmVhZG9ubHkgdW5yb2xsOiBib29sZWFuO1xuXG4gIHB1YmxpYyBzdGF0ZVNwZWM6IElucHV0U3BlY1tdO1xuICBwcm90ZWN0ZWQgc3RhdGVzXzogVGVuc29yW107XG5cbiAgLy8gTk9URShjYWlzKTogRm9yIHN0YXRlZnVsIFJOTnMsIHRoZSBvbGQgc3RhdGVzIGNhbm5vdCBiZSBkaXNwb3NlZCByaWdodFxuICAvLyBhd2F5IHdoZW4gbmV3IHN0YXRlcyBhcmUgc2V0LCBiZWNhdXNlIHRoZSBvbGQgc3RhdGVzIG1heSBuZWVkIHRvIGJlIHVzZWRcbiAgLy8gbGF0ZXIgZm9yIGJhY2twcm9wYWdhdGlvbiB0aHJvdWdoIHRpbWUgKEJQVFQpIGFuZCBvdGhlciBwdXJwb3Nlcy4gU28gd2VcbiAgLy8ga2VlcCB0aGVtIGhlcmUgZm9yIGZpbmFsIGRpc3Bvc2FsIHdoZW4gdGhlIHN0YXRlIGlzIHJlc2V0IGNvbXBsZXRlbHlcbiAgLy8gKGkuZS4sIHRocm91Z2ggbm8tYXJnIGNhbGwgdG8gYHJlc2V0U3RhdGVzKClgKS5cbiAgcHJvdGVjdGVkIGtlcHRTdGF0ZXM6IFRlbnNvcltdW107XG5cbiAgcHJpdmF0ZSBudW1Db25zdGFudHM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBSTk5MYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICBsZXQgY2VsbDogUk5OQ2VsbDtcbiAgICBpZiAoYXJncy5jZWxsID09IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdjZWxsIHByb3BlcnR5IGlzIG1pc3NpbmcgZm9yIHRoZSBjb25zdHJ1Y3RvciBvZiBSTk4uJyk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGFyZ3MuY2VsbCkpIHtcbiAgICAgIGNlbGwgPSBuZXcgU3RhY2tlZFJOTkNlbGxzKHtjZWxsczogYXJncy5jZWxsfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNlbGwgPSBhcmdzLmNlbGw7XG4gICAgfVxuICAgIGlmIChjZWxsLnN0YXRlU2l6ZSA9PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnVGhlIFJOTiBjZWxsIHNob3VsZCBoYXZlIGFuIGF0dHJpYnV0ZSBgc3RhdGVTaXplYCAodHVwbGUgb2YgJyArXG4gICAgICAgICAgJ2ludGVnZXJzLCBvbmUgaW50ZWdlciBwZXIgUk5OIHN0YXRlKS4nKTtcbiAgICB9XG4gICAgdGhpcy5jZWxsID0gY2VsbDtcbiAgICB0aGlzLnJldHVyblNlcXVlbmNlcyA9XG4gICAgICAgIGFyZ3MucmV0dXJuU2VxdWVuY2VzID09IG51bGwgPyBmYWxzZSA6IGFyZ3MucmV0dXJuU2VxdWVuY2VzO1xuICAgIHRoaXMucmV0dXJuU3RhdGUgPSBhcmdzLnJldHVyblN0YXRlID09IG51bGwgPyBmYWxzZSA6IGFyZ3MucmV0dXJuU3RhdGU7XG4gICAgdGhpcy5nb0JhY2t3YXJkcyA9IGFyZ3MuZ29CYWNrd2FyZHMgPT0gbnVsbCA/IGZhbHNlIDogYXJncy5nb0JhY2t3YXJkcztcbiAgICB0aGlzLl9zdGF0ZWZ1bCA9IGFyZ3Muc3RhdGVmdWwgPT0gbnVsbCA/IGZhbHNlIDogYXJncy5zdGF0ZWZ1bDtcbiAgICB0aGlzLnVucm9sbCA9IGFyZ3MudW5yb2xsID09IG51bGwgPyBmYWxzZSA6IGFyZ3MudW5yb2xsO1xuXG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuaW5wdXRTcGVjID0gW25ldyBJbnB1dFNwZWMoe25kaW06IDN9KV07XG4gICAgdGhpcy5zdGF0ZVNwZWMgPSBudWxsO1xuICAgIHRoaXMuc3RhdGVzXyA9IG51bGw7XG4gICAgLy8gVE9ETyhjYWlzKTogQWRkIGNvbnN0YW50c1NwZWMgYW5kIG51bUNvbnN0YW50cy5cbiAgICB0aGlzLm51bUNvbnN0YW50cyA9IG51bGw7XG4gICAgLy8gVE9ETyhjYWlzKTogTG9vayBpbnRvIHRoZSB1c2Ugb2YgaW5pdGlhbF9zdGF0ZSBpbiB0aGUga3dhcmdzIG9mIHRoZVxuICAgIC8vICAgY29uc3RydWN0b3IuXG5cbiAgICB0aGlzLmtlcHRTdGF0ZXMgPSBbXTtcbiAgfVxuXG4gIC8vIFBvcnRpbmcgTm90ZTogVGhpcyBpcyB0aGUgZXF1aXZhbGVudCBvZiBgUk5OLnN0YXRlc2AgcHJvcGVydHkgZ2V0dGVyIGluXG4gIC8vICAgUHlLZXJhcy5cbiAgZ2V0U3RhdGVzKCk6IFRlbnNvcltdIHtcbiAgICBpZiAodGhpcy5zdGF0ZXNfID09IG51bGwpIHtcbiAgICAgIGNvbnN0IG51bVN0YXRlcyA9XG4gICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmNlbGwuc3RhdGVTaXplKSA/IHRoaXMuY2VsbC5zdGF0ZVNpemUubGVuZ3RoIDogMTtcbiAgICAgIHJldHVybiBtYXRoX3V0aWxzLnJhbmdlKDAsIG51bVN0YXRlcykubWFwKHggPT4gbnVsbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLnN0YXRlc187XG4gICAgfVxuICB9XG5cbiAgLy8gUG9ydGluZyBOb3RlOiBUaGlzIGlzIHRoZSBlcXVpdmFsZW50IG9mIHRoZSBgUk5OLnN0YXRlc2AgcHJvcGVydHkgc2V0dGVyIGluXG4gIC8vICAgUHlLZXJhcy5cbiAgc2V0U3RhdGVzKHN0YXRlczogVGVuc29yW10pOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlc18gPSBzdGF0ZXM7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIGlmIChpc0FycmF5T2ZTaGFwZXMoaW5wdXRTaGFwZSkpIHtcbiAgICAgIGlucHV0U2hhcGUgPSAoaW5wdXRTaGFwZSBhcyBTaGFwZVtdKVswXTtcbiAgICB9XG4gICAgaW5wdXRTaGFwZSA9IGlucHV0U2hhcGUgYXMgU2hhcGU7XG5cbiAgICAvLyBUT0RPKGNhaXMpOiBSZW1vdmUgdGhlIGNhc3Rpbmcgb25jZSBzdGFja2VkIFJOTiBjZWxscyBiZWNvbWUgc3VwcG9ydGVkLlxuICAgIGxldCBzdGF0ZVNpemUgPSB0aGlzLmNlbGwuc3RhdGVTaXplO1xuICAgIGlmICghQXJyYXkuaXNBcnJheShzdGF0ZVNpemUpKSB7XG4gICAgICBzdGF0ZVNpemUgPSBbc3RhdGVTaXplXTtcbiAgICB9XG4gICAgY29uc3Qgb3V0cHV0RGltID0gc3RhdGVTaXplWzBdO1xuICAgIGxldCBvdXRwdXRTaGFwZTogU2hhcGV8U2hhcGVbXTtcbiAgICBpZiAodGhpcy5yZXR1cm5TZXF1ZW5jZXMpIHtcbiAgICAgIG91dHB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF0sIGlucHV0U2hhcGVbMV0sIG91dHB1dERpbV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF0sIG91dHB1dERpbV07XG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmV0dXJuU3RhdGUpIHtcbiAgICAgIGNvbnN0IHN0YXRlU2hhcGU6IFNoYXBlW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgZGltIG9mIHN0YXRlU2l6ZSkge1xuICAgICAgICBzdGF0ZVNoYXBlLnB1c2goW2lucHV0U2hhcGVbMF0sIGRpbV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtvdXRwdXRTaGFwZV0uY29uY2F0KHN0YXRlU2hhcGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG4gICAgfVxuICB9XG5cbiAgY29tcHV0ZU1hc2soaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIG1hc2s/OiBUZW5zb3J8VGVuc29yW10pOiBUZW5zb3JcbiAgICAgIHxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KG1hc2spKSB7XG4gICAgICAgIG1hc2sgPSBtYXNrWzBdO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3V0cHV0TWFzayA9IHRoaXMucmV0dXJuU2VxdWVuY2VzID8gbWFzayA6IG51bGw7XG5cbiAgICAgIGlmICh0aGlzLnJldHVyblN0YXRlKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlTWFzayA9IHRoaXMuc3RhdGVzLm1hcChzID0+IG51bGwpO1xuICAgICAgICByZXR1cm4gW291dHB1dE1hc2tdLmNvbmNhdChzdGF0ZU1hc2spO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG91dHB1dE1hc2s7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBjdXJyZW50IHN0YXRlIHRlbnNvcnMgb2YgdGhlIFJOTi5cbiAgICpcbiAgICogSWYgdGhlIHN0YXRlIGhhc24ndCBiZWVuIHNldCwgcmV0dXJuIGFuIGFycmF5IG9mIGBudWxsYHMgb2YgdGhlIGNvcnJlY3RcbiAgICogbGVuZ3RoLlxuICAgKi9cbiAgZ2V0IHN0YXRlcygpOiBUZW5zb3JbXSB7XG4gICAgaWYgKHRoaXMuc3RhdGVzXyA9PSBudWxsKSB7XG4gICAgICBjb25zdCBudW1TdGF0ZXMgPVxuICAgICAgICAgIEFycmF5LmlzQXJyYXkodGhpcy5jZWxsLnN0YXRlU2l6ZSkgPyB0aGlzLmNlbGwuc3RhdGVTaXplLmxlbmd0aCA6IDE7XG4gICAgICBjb25zdCBvdXRwdXQ6IFRlbnNvcltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVN0YXRlczsgKytpKSB7XG4gICAgICAgIG91dHB1dC5wdXNoKG51bGwpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhdGVzXztcbiAgICB9XG4gIH1cblxuICBzZXQgc3RhdGVzKHM6IFRlbnNvcltdKSB7XG4gICAgdGhpcy5zdGF0ZXNfID0gcztcbiAgfVxuXG4gIHB1YmxpYyBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgLy8gTm90ZSBpbnB1dFNoYXBlIHdpbGwgYmUgYW4gQXJyYXkgb2YgU2hhcGVzIG9mIGluaXRpYWwgc3RhdGVzIGFuZFxuICAgIC8vIGNvbnN0YW50cyBpZiB0aGVzZSBhcmUgcGFzc2VkIGluIGFwcGx5KCkuXG4gICAgY29uc3QgY29uc3RhbnRTaGFwZTogU2hhcGVbXSA9IG51bGw7XG4gICAgaWYgKHRoaXMubnVtQ29uc3RhbnRzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgICdDb25zdGFudHMgc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQgaW4gUk5OIHlldC4nKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheU9mU2hhcGVzKGlucHV0U2hhcGUpKSB7XG4gICAgICBpbnB1dFNoYXBlID0gKGlucHV0U2hhcGUgYXMgU2hhcGVbXSlbMF07XG4gICAgfVxuICAgIGlucHV0U2hhcGUgPSBpbnB1dFNoYXBlIGFzIFNoYXBlO1xuXG4gICAgY29uc3QgYmF0Y2hTaXplOiBudW1iZXIgPSB0aGlzLnN0YXRlZnVsID8gaW5wdXRTaGFwZVswXSA6IG51bGw7XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlLnNsaWNlKDIpO1xuICAgIHRoaXMuaW5wdXRTcGVjWzBdID0gbmV3IElucHV0U3BlYyh7c2hhcGU6IFtiYXRjaFNpemUsIG51bGwsIC4uLmlucHV0RGltXX0pO1xuXG4gICAgLy8gQWxsb3cgY2VsbCAoaWYgUk5OQ2VsbCBMYXllcikgdG8gYnVpbGQgYmVmb3JlIHdlIHNldCBvciB2YWxpZGF0ZVxuICAgIC8vIHN0YXRlU3BlYy5cbiAgICBjb25zdCBzdGVwSW5wdXRTaGFwZSA9IFtpbnB1dFNoYXBlWzBdXS5jb25jYXQoaW5wdXRTaGFwZS5zbGljZSgyKSk7XG4gICAgaWYgKGNvbnN0YW50U2hhcGUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ0NvbnN0YW50cyBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCBpbiBSTk4geWV0LicpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNlbGwuYnVpbGQoc3RlcElucHV0U2hhcGUpO1xuICAgIH1cblxuICAgIC8vIFNldCBvciB2YWxpZGF0ZSBzdGF0ZVNwZWMuXG4gICAgbGV0IHN0YXRlU2l6ZTogbnVtYmVyW107XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jZWxsLnN0YXRlU2l6ZSkpIHtcbiAgICAgIHN0YXRlU2l6ZSA9IHRoaXMuY2VsbC5zdGF0ZVNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0YXRlU2l6ZSA9IFt0aGlzLmNlbGwuc3RhdGVTaXplXTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5zdGF0ZVNwZWMgIT0gbnVsbCkge1xuICAgICAgaWYgKCF1dGlsLmFycmF5c0VxdWFsKFxuICAgICAgICAgICAgICB0aGlzLnN0YXRlU3BlYy5tYXAoc3BlYyA9PiBzcGVjLnNoYXBlW3NwZWMuc2hhcGUubGVuZ3RoIC0gMV0pLFxuICAgICAgICAgICAgICBzdGF0ZVNpemUpKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYEFuIGluaXRpYWxTdGF0ZSB3YXMgcGFzc2VkIHRoYXQgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBgICtcbiAgICAgICAgICAgIGBjZWxsLnN0YXRlU2l6ZS4gUmVjZWl2ZWQgc3RhdGVTcGVjPSR7dGhpcy5zdGF0ZVNwZWN9OyBgICtcbiAgICAgICAgICAgIGBIb3dldmVyIGNlbGwuc3RhdGVTaXplIGlzICR7dGhpcy5jZWxsLnN0YXRlU2l6ZX1gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zdGF0ZVNwZWMgPVxuICAgICAgICAgIHN0YXRlU2l6ZS5tYXAoZGltID0+IG5ldyBJbnB1dFNwZWMoe3NoYXBlOiBbbnVsbCwgZGltXX0pKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuc3RhdGVmdWwpIHtcbiAgICAgIHRoaXMucmVzZXRTdGF0ZXMoKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUmVzZXQgdGhlIHN0YXRlIHRlbnNvcnMgb2YgdGhlIFJOTi5cbiAgICpcbiAgICogSWYgdGhlIGBzdGF0ZXNgIGFyZ3VtZW50IGlzIGB1bmRlZmluZWRgIG9yIGBudWxsYCwgd2lsbCBzZXQgdGhlXG4gICAqIHN0YXRlIHRlbnNvcihzKSBvZiB0aGUgUk5OIHRvIGFsbC16ZXJvIHRlbnNvcnMgb2YgdGhlIGFwcHJvcHJpYXRlXG4gICAqIHNoYXBlKHMpLlxuICAgKlxuICAgKiBJZiBgc3RhdGVzYCBpcyBwcm92aWRlZCwgd2lsbCBzZXQgdGhlIHN0YXRlIHRlbnNvcnMgb2YgdGhlIFJOTiB0byBpdHNcbiAgICogdmFsdWUuXG4gICAqXG4gICAqIEBwYXJhbSBzdGF0ZXMgT3B0aW9uYWwgZXh0ZXJuYWxseS1wcm92aWRlZCBpbml0aWFsIHN0YXRlcy5cbiAgICogQHBhcmFtIHRyYWluaW5nIFdoZXRoZXIgdGhpcyBjYWxsIGlzIGRvbmUgZHVyaW5nIHRyYWluaW5nLiBGb3Igc3RhdGVmdWxcbiAgICogICBSTk5zLCB0aGlzIGFmZmVjdHMgd2hldGhlciB0aGUgb2xkIHN0YXRlcyBhcmUga2VwdCBvciBkaXNjYXJkZWQuIEluXG4gICAqICAgcGFydGljdWxhciwgaWYgYHRyYWluaW5nYCBpcyBgdHJ1ZWAsIHRoZSBvbGQgc3RhdGVzIHdpbGwgYmUga2VwdCBzb1xuICAgKiAgIHRoYXQgc3Vic2VxdWVudCBiYWNrcHJvcGdhdGFpb24gdGhyb3VnaCB0aW1lIChCUFRUKSBtYXkgd29yayBwcm9wZXJseS5cbiAgICogICBFbHNlLCB0aGUgb2xkIHN0YXRlcyB3aWxsIGJlIGRpc2NhcmRlZC5cbiAgICovXG4gIHJlc2V0U3RhdGVzKHN0YXRlcz86IFRlbnNvcnxUZW5zb3JbXSwgdHJhaW5pbmcgPSBmYWxzZSk6IHZvaWQge1xuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLnN0YXRlZnVsKSB7XG4gICAgICAgIHRocm93IG5ldyBBdHRyaWJ1dGVFcnJvcihcbiAgICAgICAgICAgICdDYW5ub3QgY2FsbCByZXNldFN0YXRlcygpIG9uIGFuIFJOTiBMYXllciB0aGF0IGlzIG5vdCBzdGF0ZWZ1bC4nKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHRoaXMuaW5wdXRTcGVjWzBdLnNoYXBlWzBdO1xuICAgICAgaWYgKGJhdGNoU2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgJ0lmIGFuIFJOTiBpcyBzdGF0ZWZ1bCwgaXQgbmVlZHMgdG8ga25vdyBpdHMgYmF0Y2ggc2l6ZS4gU3BlY2lmeSAnICtcbiAgICAgICAgICAgICd0aGUgYmF0Y2ggc2l6ZSBvZiB5b3VyIGlucHV0IHRlbnNvcnM6IFxcbicgK1xuICAgICAgICAgICAgJy0gSWYgdXNpbmcgYSBTZXF1ZW50aWFsIG1vZGVsLCBzcGVjaWZ5IHRoZSBiYXRjaCBzaXplIGJ5ICcgK1xuICAgICAgICAgICAgJ3Bhc3NpbmcgYSBgYmF0Y2hJbnB1dFNoYXBlYCBvcHRpb24gdG8geW91ciBmaXJzdCBsYXllci5cXG4nICtcbiAgICAgICAgICAgICctIElmIHVzaW5nIHRoZSBmdW5jdGlvbmFsIEFQSSwgc3BlY2lmeSB0aGUgYmF0Y2ggc2l6ZSBieSAnICtcbiAgICAgICAgICAgICdwYXNzaW5nIGEgYGJhdGNoU2hhcGVgIG9wdGlvbiB0byB5b3VyIElucHV0IGxheWVyLicpO1xuICAgICAgfVxuICAgICAgLy8gSW5pdGlhbGl6ZSBzdGF0ZSBpZiBudWxsLlxuICAgICAgaWYgKHRoaXMuc3RhdGVzXyA9PSBudWxsKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID1cbiAgICAgICAgICAgICAgdGhpcy5jZWxsLnN0YXRlU2l6ZS5tYXAoZGltID0+IHRmYy56ZXJvcyhbYmF0Y2hTaXplLCBkaW1dKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID0gW3RmYy56ZXJvcyhbYmF0Y2hTaXplLCB0aGlzLmNlbGwuc3RhdGVTaXplXSldO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlcyA9PSBudWxsKSB7XG4gICAgICAgIC8vIERpc3Bvc2Ugb2xkIHN0YXRlIHRlbnNvcnMuXG4gICAgICAgIHRmYy5kaXNwb3NlKHRoaXMuc3RhdGVzXyk7XG4gICAgICAgIC8vIEZvciBzdGF0ZWZ1bCBSTk5zLCBmdWxseSBkaXNwb3NlIGtlcHQgb2xkIHN0YXRlcy5cbiAgICAgICAgaWYgKHRoaXMua2VwdFN0YXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgdGZjLmRpc3Bvc2UodGhpcy5rZXB0U3RhdGVzKTtcbiAgICAgICAgICB0aGlzLmtlcHRTdGF0ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID1cbiAgICAgICAgICAgICAgdGhpcy5jZWxsLnN0YXRlU2l6ZS5tYXAoZGltID0+IHRmYy56ZXJvcyhbYmF0Y2hTaXplLCBkaW1dKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfWzBdID0gdGZjLnplcm9zKFtiYXRjaFNpemUsIHRoaXMuY2VsbC5zdGF0ZVNpemVdKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHN0YXRlcykpIHtcbiAgICAgICAgICBzdGF0ZXMgPSBbc3RhdGVzXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGVzLmxlbmd0aCAhPT0gdGhpcy5zdGF0ZXNfLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgTGF5ZXIgJHt0aGlzLm5hbWV9IGV4cGVjdHMgJHt0aGlzLnN0YXRlc18ubGVuZ3RofSBzdGF0ZShzKSwgYCArXG4gICAgICAgICAgICAgIGBidXQgaXQgcmVjZWl2ZWQgJHtzdGF0ZXMubGVuZ3RofSBzdGF0ZSB2YWx1ZShzKS4gSW5wdXQgYCArXG4gICAgICAgICAgICAgIGByZWNlaXZlZDogJHtzdGF0ZXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhaW5pbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAvLyBTdG9yZSBvbGQgc3RhdGUgdGVuc29ycyBmb3IgY29tcGxldGUgZGlzcG9zYWwgbGF0ZXIsIGkuZS4sIGR1cmluZ1xuICAgICAgICAgIC8vIHRoZSBuZXh0IG5vLWFyZyBjYWxsIHRvIHRoaXMgbWV0aG9kLiBXZSBkbyBub3QgZGlzcG9zZSB0aGUgb2xkXG4gICAgICAgICAgLy8gc3RhdGVzIGltbWVkaWF0ZWx5IGJlY2F1c2UgdGhhdCBCUFRUIChhbW9uZyBvdGhlciB0aGluZ3MpIHJlcXVpcmVcbiAgICAgICAgICAvLyB0aGVtLlxuICAgICAgICAgIHRoaXMua2VwdFN0YXRlcy5wdXNoKHRoaXMuc3RhdGVzXy5zbGljZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLnN0YXRlc18pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc3RhdGVzXy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN0YXRlc1tpbmRleF07XG4gICAgICAgICAgY29uc3QgZGltID0gQXJyYXkuaXNBcnJheSh0aGlzLmNlbGwuc3RhdGVTaXplKSA/XG4gICAgICAgICAgICAgIHRoaXMuY2VsbC5zdGF0ZVNpemVbaW5kZXhdIDpcbiAgICAgICAgICAgICAgdGhpcy5jZWxsLnN0YXRlU2l6ZTtcbiAgICAgICAgICBjb25zdCBleHBlY3RlZFNoYXBlID0gW2JhdGNoU2l6ZSwgZGltXTtcbiAgICAgICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwodmFsdWUuc2hhcGUsIGV4cGVjdGVkU2hhcGUpKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgICBgU3RhdGUgJHtpbmRleH0gaXMgaW5jb21wYXRpYmxlIHdpdGggbGF5ZXIgJHt0aGlzLm5hbWV9OiBgICtcbiAgICAgICAgICAgICAgICBgZXhwZWN0ZWQgc2hhcGU9JHtleHBlY3RlZFNoYXBlfSwgcmVjZWl2ZWQgc2hhcGU9JHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWUuc2hhcGV9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMuc3RhdGVzX1tpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhpcy5zdGF0ZXNfID0gdGhpcy5zdGF0ZXNfLm1hcChzdGF0ZSA9PiB0ZmMua2VlcChzdGF0ZS5jbG9uZSgpKSk7XG4gICAgfSk7XG4gIH1cblxuICBhcHBseShcbiAgICAgIGlucHV0czogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10sXG4gICAgICBrd2FyZ3M/OiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW118U3ltYm9saWNUZW5zb3J8U3ltYm9saWNUZW5zb3JbXSB7XG4gICAgLy8gVE9ETyhjYWlzKTogRmlndXJlIG91dCB3aGV0aGVyIGluaXRpYWxTdGF0ZSBpcyBpbiBrd2FyZ3Mgb3IgaW5wdXRzLlxuICAgIGxldCBpbml0aWFsU3RhdGU6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuICAgIGxldCBjb25zdGFudHM6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2NvbnN0YW50cyddO1xuICAgIGlmIChrd2FyZ3MgPT0gbnVsbCkge1xuICAgICAga3dhcmdzID0ge307XG4gICAgfVxuXG4gICAgY29uc3Qgc3RhbmRhcmRpemVkID1cbiAgICAgICAgc3RhbmRhcmRpemVBcmdzKGlucHV0cywgaW5pdGlhbFN0YXRlLCBjb25zdGFudHMsIHRoaXMubnVtQ29uc3RhbnRzKTtcbiAgICBpbnB1dHMgPSBzdGFuZGFyZGl6ZWQuaW5wdXRzO1xuICAgIGluaXRpYWxTdGF0ZSA9IHN0YW5kYXJkaXplZC5pbml0aWFsU3RhdGU7XG4gICAgY29uc3RhbnRzID0gc3RhbmRhcmRpemVkLmNvbnN0YW50cztcblxuICAgIC8vIElmIGFueSBvZiBgaW5pdGlhbF9zdGF0ZWAgb3IgYGNvbnN0YW50c2AgYXJlIHNwZWNpZmllZCBhbmQgYXJlXG4gICAgLy8gYHRmLlN5bWJvbGljVGVuc29yYHMsIHRoZW4gYWRkIHRoZW0gdG8gdGhlIGlucHV0cyBhbmQgdGVtcG9yYXJpbHkgbW9kaWZ5XG4gICAgLy8gdGhlIGlucHV0X3NwZWMgdG8gaW5jbHVkZSB0aGVtLlxuXG4gICAgbGV0IGFkZGl0aW9uYWxJbnB1dHM6IEFycmF5PFRlbnNvcnxTeW1ib2xpY1RlbnNvcj4gPSBbXTtcbiAgICBsZXQgYWRkaXRpb25hbFNwZWNzOiBJbnB1dFNwZWNbXSA9IFtdO1xuICAgIGlmIChpbml0aWFsU3RhdGUgIT0gbnVsbCkge1xuICAgICAga3dhcmdzWydpbml0aWFsU3RhdGUnXSA9IGluaXRpYWxTdGF0ZTtcbiAgICAgIGFkZGl0aW9uYWxJbnB1dHMgPSBhZGRpdGlvbmFsSW5wdXRzLmNvbmNhdChpbml0aWFsU3RhdGUpO1xuICAgICAgdGhpcy5zdGF0ZVNwZWMgPSBbXTtcbiAgICAgIGZvciAoY29uc3Qgc3RhdGUgb2YgaW5pdGlhbFN0YXRlKSB7XG4gICAgICAgIHRoaXMuc3RhdGVTcGVjLnB1c2gobmV3IElucHV0U3BlYyh7c2hhcGU6IHN0YXRlLnNoYXBlfSkpO1xuICAgICAgfVxuICAgICAgLy8gVE9ETyhjYWlzKTogVXNlIHRoZSBmb2xsb3dpbmcgaW5zdGVhZC5cbiAgICAgIC8vIHRoaXMuc3RhdGVTcGVjID0gaW5pdGlhbFN0YXRlLm1hcChzdGF0ZSA9PiBuZXcgSW5wdXRTcGVjKHtzaGFwZTpcbiAgICAgIC8vIHN0YXRlLnNoYXBlfSkpO1xuICAgICAgYWRkaXRpb25hbFNwZWNzID0gYWRkaXRpb25hbFNwZWNzLmNvbmNhdCh0aGlzLnN0YXRlU3BlYyk7XG4gICAgfVxuICAgIGlmIChjb25zdGFudHMgIT0gbnVsbCkge1xuICAgICAga3dhcmdzWydjb25zdGFudHMnXSA9IGNvbnN0YW50cztcbiAgICAgIGFkZGl0aW9uYWxJbnB1dHMgPSBhZGRpdGlvbmFsSW5wdXRzLmNvbmNhdChjb25zdGFudHMpO1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHRoaXMuY29uc3RhbnRzU3BlYy5cbiAgICAgIHRoaXMubnVtQ29uc3RhbnRzID0gY29uc3RhbnRzLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCBpc1RlbnNvciA9IGFkZGl0aW9uYWxJbnB1dHNbMF0gaW5zdGFuY2VvZiBTeW1ib2xpY1RlbnNvcjtcbiAgICBpZiAoaXNUZW5zb3IpIHtcbiAgICAgIC8vIENvbXB1dGUgZnVsbCBpbnB1dCBzcGVjLCBpbmNsdWRpbmcgc3RhdGUgYW5kIGNvbnN0YW50cy5cbiAgICAgIGNvbnN0IGZ1bGxJbnB1dCA9XG4gICAgICAgICAgW2lucHV0c10uY29uY2F0KGFkZGl0aW9uYWxJbnB1dHMpIGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXTtcbiAgICAgIGNvbnN0IGZ1bGxJbnB1dFNwZWMgPSB0aGlzLmlucHV0U3BlYy5jb25jYXQoYWRkaXRpb25hbFNwZWNzKTtcbiAgICAgIC8vIFBlcmZvcm0gdGhlIGNhbGwgd2l0aCB0ZW1wb3JhcmlseSByZXBsYWNlZCBpbnB1dFNwZWMuXG4gICAgICBjb25zdCBvcmlnaW5hbElucHV0U3BlYyA9IHRoaXMuaW5wdXRTcGVjO1xuICAgICAgdGhpcy5pbnB1dFNwZWMgPSBmdWxsSW5wdXRTcGVjO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gc3VwZXIuYXBwbHkoZnVsbElucHV0LCBrd2FyZ3MpO1xuICAgICAgdGhpcy5pbnB1dFNwZWMgPSBvcmlnaW5hbElucHV0U3BlYztcbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdXBlci5hcHBseShpbnB1dHMsIGt3YXJncyk7XG4gICAgfVxuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgLy8gSW5wdXQgc2hhcGU6IGBbc2FtcGxlcywgdGltZSAocGFkZGVkIHdpdGggemVyb3MpLCBpbnB1dF9kaW1dYC5cbiAgICAvLyBOb3RlIHRoYXQgdGhlIC5idWlsZCgpIG1ldGhvZCBvZiBzdWJjbGFzc2VzICoqbXVzdCoqIGRlZmluZVxuICAgIC8vIHRoaXMuaW5wdXRTcGVjIGFuZCB0aGlzLnN0YXRlU3BlYyBvd2l0aCBjb21wbGV0ZSBpbnB1dCBzaGFwZXMuXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgbWFzayA9IGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snbWFzayddIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHRyYWluaW5nID0ga3dhcmdzID09IG51bGwgPyBudWxsIDoga3dhcmdzWyd0cmFpbmluZyddO1xuICAgICAgbGV0IGluaXRpYWxTdGF0ZTogVGVuc29yW10gPVxuICAgICAgICAgIGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snaW5pdGlhbFN0YXRlJ107XG5cbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGlmIChpbml0aWFsU3RhdGUgPT0gbnVsbCkge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZWZ1bCkge1xuICAgICAgICAgIGluaXRpYWxTdGF0ZSA9IHRoaXMuc3RhdGVzXztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpbml0aWFsU3RhdGUgPSB0aGlzLmdldEluaXRpYWxTdGF0ZShpbnB1dHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG51bVN0YXRlcyA9XG4gICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmNlbGwuc3RhdGVTaXplKSA/IHRoaXMuY2VsbC5zdGF0ZVNpemUubGVuZ3RoIDogMTtcbiAgICAgIGlmIChpbml0aWFsU3RhdGUubGVuZ3RoICE9PSBudW1TdGF0ZXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgUk5OIExheWVyIGhhcyAke251bVN0YXRlc30gc3RhdGUocykgYnV0IHdhcyBwYXNzZWQgYCArXG4gICAgICAgICAgICBgJHtpbml0aWFsU3RhdGUubGVuZ3RofSBpbml0aWFsIHN0YXRlKHMpLmApO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMudW5yb2xsKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICAgICdJZ25vcmluZyB1bnJvbGwgPSB0cnVlIGZvciBSTk4gbGF5ZXIsIGR1ZSB0byBpbXBlcmF0aXZlIGJhY2tlbmQuJyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGNlbGxDYWxsS3dhcmdzOiBLd2FyZ3MgPSB7dHJhaW5pbmd9O1xuXG4gICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgc3VwcG9ydCBmb3IgY29uc3RhbnRzLlxuICAgICAgY29uc3Qgc3RlcCA9IChpbnB1dHM6IFRlbnNvciwgc3RhdGVzOiBUZW5zb3JbXSkgPT4ge1xuICAgICAgICAvLyBgaW5wdXRzYCBhbmQgYHN0YXRlc2AgYXJlIGNvbmNhdGVuYXRlZCB0byBmb3JtIGEgc2luZ2xlIGBBcnJheWAgb2ZcbiAgICAgICAgLy8gYHRmLlRlbnNvcmBzIGFzIHRoZSBpbnB1dCB0byBgY2VsbC5jYWxsKClgLlxuICAgICAgICBjb25zdCBvdXRwdXRzID1cbiAgICAgICAgICAgIHRoaXMuY2VsbC5jYWxsKFtpbnB1dHNdLmNvbmNhdChzdGF0ZXMpLCBjZWxsQ2FsbEt3YXJncykgYXMgVGVuc29yW107XG4gICAgICAgIC8vIE1hcnNoYWxsIHRoZSByZXR1cm4gdmFsdWUgaW50byBvdXRwdXQgYW5kIG5ldyBzdGF0ZXMuXG4gICAgICAgIHJldHVybiBbb3V0cHV0c1swXSwgb3V0cHV0cy5zbGljZSgxKV0gYXMgW1RlbnNvciwgVGVuc29yW11dO1xuICAgICAgfTtcblxuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHN1cHBvcnQgZm9yIGNvbnN0YW50cy5cblxuICAgICAgY29uc3Qgcm5uT3V0cHV0cyA9XG4gICAgICAgICAgcm5uKHN0ZXAsIGlucHV0cywgaW5pdGlhbFN0YXRlLCB0aGlzLmdvQmFja3dhcmRzLCBtYXNrLCBudWxsLFxuICAgICAgICAgICAgICB0aGlzLnVucm9sbCwgdGhpcy5yZXR1cm5TZXF1ZW5jZXMpO1xuICAgICAgY29uc3QgbGFzdE91dHB1dCA9IHJubk91dHB1dHNbMF07XG4gICAgICBjb25zdCBvdXRwdXRzID0gcm5uT3V0cHV0c1sxXTtcbiAgICAgIGNvbnN0IHN0YXRlcyA9IHJubk91dHB1dHNbMl07XG5cbiAgICAgIGlmICh0aGlzLnN0YXRlZnVsKSB7XG4gICAgICAgIHRoaXMucmVzZXRTdGF0ZXMoc3RhdGVzLCB0cmFpbmluZyk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucmV0dXJuU2VxdWVuY2VzID8gb3V0cHV0cyA6IGxhc3RPdXRwdXQ7XG5cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFBvcnBlcnR5IHNldCBsZWFybmluZyBwaGFzZSBmbGFnLlxuXG4gICAgICBpZiAodGhpcy5yZXR1cm5TdGF0ZSkge1xuICAgICAgICByZXR1cm4gW291dHB1dF0uY29uY2F0KHN0YXRlcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gb3V0cHV0O1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFN0YXRlKGlucHV0czogVGVuc29yKTogVGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIC8vIEJ1aWxkIGFuIGFsbC16ZXJvIHRlbnNvciBvZiBzaGFwZSBbc2FtcGxlcywgb3V0cHV0RGltXS5cbiAgICAgIC8vIFtTYW1wbGVzLCB0aW1lU3RlcHMsIGlucHV0RGltXS5cbiAgICAgIGxldCBpbml0aWFsU3RhdGUgPSB0ZmMuemVyb3MoaW5wdXRzLnNoYXBlKTtcbiAgICAgIC8vIFtTYW1wbGVzXS5cbiAgICAgIGluaXRpYWxTdGF0ZSA9IHRmYy5zdW0oaW5pdGlhbFN0YXRlLCBbMSwgMl0pO1xuICAgICAgaW5pdGlhbFN0YXRlID0gSy5leHBhbmREaW1zKGluaXRpYWxTdGF0ZSk7ICAvLyBbU2FtcGxlcywgMV0uXG5cbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGwuc3RhdGVTaXplLm1hcChcbiAgICAgICAgICAgIGRpbSA9PiBkaW0gPiAxID8gSy50aWxlKGluaXRpYWxTdGF0ZSwgWzEsIGRpbV0pIDogaW5pdGlhbFN0YXRlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNlbGwuc3RhdGVTaXplID4gMSA/XG4gICAgICAgICAgICBbSy50aWxlKGluaXRpYWxTdGF0ZSwgWzEsIHRoaXMuY2VsbC5zdGF0ZVNpemVdKV0gOlxuICAgICAgICAgICAgW2luaXRpYWxTdGF0ZV07XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBnZXQgdHJhaW5hYmxlV2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIGlmICghdGhpcy50cmFpbmFibGUpIHtcbiAgICAgIHJldHVybiBbXTtcbiAgICB9XG4gICAgLy8gUG9ydGluZyBOb3RlOiBJbiBUeXBlU2NyaXB0LCBgdGhpc2AgaXMgYWx3YXlzIGFuIGluc3RhbmNlIG9mIGBMYXllcmAuXG4gICAgcmV0dXJuIHRoaXMuY2VsbC50cmFpbmFibGVXZWlnaHRzO1xuICB9XG5cbiAgZ2V0IG5vblRyYWluYWJsZVdlaWdodHMoKTogTGF5ZXJWYXJpYWJsZVtdIHtcbiAgICAvLyBQb3J0aW5nIE5vdGU6IEluIFR5cGVTY3JpcHQsIGB0aGlzYCBpcyBhbHdheXMgYW4gaW5zdGFuY2Ugb2YgYExheWVyYC5cbiAgICBpZiAoIXRoaXMudHJhaW5hYmxlKSB7XG4gICAgICByZXR1cm4gdGhpcy5jZWxsLndlaWdodHM7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLmNlbGwubm9uVHJhaW5hYmxlV2VpZ2h0cztcbiAgfVxuXG4gIHNldEZhc3RXZWlnaHRJbml0RHVyaW5nQnVpbGQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBzdXBlci5zZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlKTtcbiAgICBpZiAodGhpcy5jZWxsICE9IG51bGwpIHtcbiAgICAgIHRoaXMuY2VsbC5zZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIHJldHVyblNlcXVlbmNlczogdGhpcy5yZXR1cm5TZXF1ZW5jZXMsXG4gICAgICByZXR1cm5TdGF0ZTogdGhpcy5yZXR1cm5TdGF0ZSxcbiAgICAgIGdvQmFja3dhcmRzOiB0aGlzLmdvQmFja3dhcmRzLFxuICAgICAgc3RhdGVmdWw6IHRoaXMuc3RhdGVmdWwsXG4gICAgICB1bnJvbGw6IHRoaXMudW5yb2xsLFxuICAgIH07XG5cbiAgICBpZiAodGhpcy5udW1Db25zdGFudHMgIT0gbnVsbCkge1xuICAgICAgY29uZmlnWydudW1Db25zdGFudHMnXSA9IHRoaXMubnVtQ29uc3RhbnRzO1xuICAgIH1cblxuICAgIGNvbnN0IGNlbGxDb25maWcgPSB0aGlzLmNlbGwuZ2V0Q29uZmlnKCk7XG5cbiAgICBpZiAodGhpcy5nZXRDbGFzc05hbWUoKSA9PT0gUk5OLmNsYXNzTmFtZSkge1xuICAgICAgY29uZmlnWydjZWxsJ10gPSB7XG4gICAgICAgICdjbGFzc05hbWUnOiB0aGlzLmNlbGwuZ2V0Q2xhc3NOYW1lKCksXG4gICAgICAgICdjb25maWcnOiBjZWxsQ29uZmlnLFxuICAgICAgfSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RWYWx1ZTtcbiAgICB9XG5cbiAgICAvLyB0aGlzIG9yZGVyIGlzIG5lY2Vzc2FyeSwgdG8gcHJldmVudCBjZWxsIG5hbWUgZnJvbSByZXBsYWNpbmcgbGF5ZXIgbmFtZVxuICAgIHJldHVybiB7Li4uY2VsbENvbmZpZywgLi4uYmFzZUNvbmZpZywgLi4uY29uZmlnfTtcbiAgfVxuXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QsXG4gICAgICBjdXN0b21PYmplY3RzID0ge30gYXMgc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogVCB7XG4gICAgY29uc3QgY2VsbENvbmZpZyA9IGNvbmZpZ1snY2VsbCddIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdDtcbiAgICBjb25zdCBjZWxsID0gZGVzZXJpYWxpemUoY2VsbENvbmZpZywgY3VzdG9tT2JqZWN0cykgYXMgUk5OQ2VsbDtcbiAgICByZXR1cm4gbmV3IGNscyhPYmplY3QuYXNzaWduKGNvbmZpZywge2NlbGx9KSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSTk4pO1xuXG4vLyBQb3J0aW5nIE5vdGU6IFRoaXMgaXMgYSBjb21tb24gcGFyZW50IGNsYXNzIGZvciBSTk4gY2VsbHMuIFRoZXJlIGlzIG5vXG4vLyBlcXVpdmFsZW50IG9mIHRoaXMgaW4gUHlLZXJhcy4gSGF2aW5nIGEgY29tbW9uIHBhcmVudCBjbGFzcyBmb3Jnb2VzIHRoZVxuLy8gIG5lZWQgZm9yIGBoYXNfYXR0cihjZWxsLCAuLi4pYCBjaGVja3Mgb3IgaXRzIFR5cGVTY3JpcHQgZXF1aXZhbGVudC5cbi8qKlxuICogQW4gUk5OQ2VsbCBsYXllci5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTGF5ZXJzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnfVxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUk5OQ2VsbCBleHRlbmRzIExheWVyIHtcbiAgLyoqXG4gICAqIFNpemUocykgb2YgdGhlIHN0YXRlcy5cbiAgICogRm9yIFJOTiBjZWxscyB3aXRoIG9ubHkgYSBzaW5nbGUgc3RhdGUsIHRoaXMgaXMgYSBzaW5nbGUgaW50ZWdlci5cbiAgICovXG4gIC8vIFNlZVxuICAvLyBodHRwczovL3d3dy50eXBlc2NyaXB0bGFuZy5vcmcvZG9jcy9oYW5kYm9vay9yZWxlYXNlLW5vdGVzL3R5cGVzY3JpcHQtNC0wLmh0bWwjcHJvcGVydGllcy1vdmVycmlkaW5nLWFjY2Vzc29ycy1hbmQtdmljZS12ZXJzYS1pcy1hbi1lcnJvclxuICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGVTaXplOiBudW1iZXJ8bnVtYmVyW107XG4gIHB1YmxpYyBkcm9wb3V0TWFzazogVGVuc29yfFRlbnNvcltdO1xuICBwdWJsaWMgcmVjdXJyZW50RHJvcG91dE1hc2s6IFRlbnNvcnxUZW5zb3JbXTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFNpbXBsZVJOTkNlbGxMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogdW5pdHM6IFBvc2l0aXZlIGludGVnZXIsIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc3BhY2UuXG4gICAqL1xuICB1bml0czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICogRGVmYXVsdDogaHlwZXJib2xpYyB0YW5nZW50ICgndGFuaCcpLlxuICAgKiBJZiB5b3UgcGFzcyBgbnVsbGAsICAnbGluZWFyJyBhY3RpdmF0aW9uIHdpbGwgYmUgYXBwbGllZC5cbiAgICovXG4gIGFjdGl2YXRpb24/OiBBY3RpdmF0aW9uSWRlbnRpZmllcjtcblxuICAvKipcbiAgICogV2hldGhlciB0aGUgbGF5ZXIgdXNlcyBhIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgdXNlQmlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgYGtlcm5lbGAgd2VpZ2h0cyBtYXRyaXgsIHVzZWQgZm9yIHRoZSBsaW5lYXJcbiAgICogdHJhbnNmb3JtYXRpb24gb2YgdGhlIGlucHV0cy5cbiAgICovXG4gIGtlcm5lbEluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGByZWN1cnJlbnRLZXJuZWxgIHdlaWdodHMgbWF0cml4LCB1c2VkIGZvclxuICAgKiBsaW5lYXIgdHJhbnNmb3JtYXRpb24gb2YgdGhlIHJlY3VycmVudCBzdGF0ZS5cbiAgICovXG4gIHJlY3VycmVudEluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgYmlhc0luaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBga2VybmVsYCB3ZWlnaHRzIG1hdHJpeC5cbiAgICovXG4gIGtlcm5lbFJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBgcmVjdXJyZW50X2tlcm5lbGAgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICByZWN1cnJlbnRSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYGtlcm5lbGAgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICBrZXJuZWxDb25zdHJhaW50PzogQ29uc3RyYWludElkZW50aWZpZXJ8Q29uc3RyYWludDtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBgcmVjdXJyZW50S2VybmVsYCB3ZWlnaHRzIG1hdHJpeC5cbiAgICovXG4gIHJlY3VycmVudENvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgYmlhc0NvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBGbG9hdCBudW1iZXIgYmV0d2VlbiAwIGFuZCAxLiBGcmFjdGlvbiBvZiB0aGUgdW5pdHMgdG8gZHJvcCBmb3IgdGhlIGxpbmVhclxuICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgaW5wdXRzLlxuICAgKi9cbiAgZHJvcG91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogRmxvYXQgbnVtYmVyIGJldHdlZW4gMCBhbmQgMS4gRnJhY3Rpb24gb2YgdGhlIHVuaXRzIHRvIGRyb3AgZm9yIHRoZSBsaW5lYXJcbiAgICogdHJhbnNmb3JtYXRpb24gb2YgdGhlIHJlY3VycmVudCBzdGF0ZS5cbiAgICovXG4gIHJlY3VycmVudERyb3BvdXQ/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoaXMgaXMgYWRkZWQgZm9yIHRlc3QgREkgcHVycG9zZS5cbiAgICovXG4gIGRyb3BvdXRGdW5jPzogRnVuY3Rpb247XG59XG5cbmV4cG9ydCBjbGFzcyBTaW1wbGVSTk5DZWxsIGV4dGVuZHMgUk5OQ2VsbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NpbXBsZVJOTkNlbGwnO1xuICByZWFkb25seSB1bml0czogbnVtYmVyO1xuICByZWFkb25seSBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICByZWFkb25seSB1c2VCaWFzOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IGtlcm5lbEluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50SW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICByZWFkb25seSBiaWFzSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuXG4gIHJlYWRvbmx5IGtlcm5lbENvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHJlYWRvbmx5IHJlY3VycmVudENvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHJlYWRvbmx5IGJpYXNDb25zdHJhaW50OiBDb25zdHJhaW50O1xuXG4gIHJlYWRvbmx5IGtlcm5lbFJlZ3VsYXJpemVyOiBSZWd1bGFyaXplcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50UmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICByZWFkb25seSBiaWFzUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuXG4gIHJlYWRvbmx5IGRyb3BvdXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50RHJvcG91dDogbnVtYmVyO1xuICByZWFkb25seSBkcm9wb3V0RnVuYzogRnVuY3Rpb247XG5cbiAgcmVhZG9ubHkgc3RhdGVTaXplOiBudW1iZXI7XG5cbiAga2VybmVsOiBMYXllclZhcmlhYmxlO1xuICByZWN1cnJlbnRLZXJuZWw6IExheWVyVmFyaWFibGU7XG4gIGJpYXM6IExheWVyVmFyaWFibGU7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9BQ1RJVkFUSU9OID0gJ3RhbmgnO1xuICByZWFkb25seSBERUZBVUxUX0tFUk5FTF9JTklUSUFMSVpFUiA9ICdnbG9yb3ROb3JtYWwnO1xuICByZWFkb25seSBERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUiA9ICdvcnRob2dvbmFsJztcbiAgcmVhZG9ubHkgREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSOiBJbml0aWFsaXplcklkZW50aWZpZXIgPSAnemVyb3MnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFNpbXBsZVJOTkNlbGxMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnVuaXRzID0gYXJncy51bml0cztcbiAgICBhc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy51bml0cywgYHVuaXRzYCk7XG4gICAgdGhpcy5hY3RpdmF0aW9uID0gZ2V0QWN0aXZhdGlvbihcbiAgICAgICAgYXJncy5hY3RpdmF0aW9uID09IG51bGwgPyB0aGlzLkRFRkFVTFRfQUNUSVZBVElPTiA6IGFyZ3MuYWN0aXZhdGlvbik7XG4gICAgdGhpcy51c2VCaWFzID0gYXJncy51c2VCaWFzID09IG51bGwgPyB0cnVlIDogYXJncy51c2VCaWFzO1xuXG4gICAgdGhpcy5rZXJuZWxJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKFxuICAgICAgICBhcmdzLmtlcm5lbEluaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVIpO1xuICAgIHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5yZWN1cnJlbnRJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfUkVDVVJSRU5UX0lOSVRJQUxJWkVSKTtcblxuICAgIHRoaXMuYmlhc0luaXRpYWxpemVyID1cbiAgICAgICAgZ2V0SW5pdGlhbGl6ZXIoYXJncy5iaWFzSW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX0JJQVNfSU5JVElBTElaRVIpO1xuXG4gICAgdGhpcy5rZXJuZWxSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3Mua2VybmVsUmVndWxhcml6ZXIpO1xuICAgIHRoaXMucmVjdXJyZW50UmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLnJlY3VycmVudFJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLmJpYXNSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuYmlhc1JlZ3VsYXJpemVyKTtcblxuICAgIHRoaXMua2VybmVsQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5rZXJuZWxDb25zdHJhaW50KTtcbiAgICB0aGlzLnJlY3VycmVudENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MucmVjdXJyZW50Q29uc3RyYWludCk7XG4gICAgdGhpcy5iaWFzQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5iaWFzQ29uc3RyYWludCk7XG5cbiAgICB0aGlzLmRyb3BvdXQgPSBtYXRoX3V0aWxzLm1pbihcbiAgICAgICAgWzEsIG1hdGhfdXRpbHMubWF4KFswLCBhcmdzLmRyb3BvdXQgPT0gbnVsbCA/IDAgOiBhcmdzLmRyb3BvdXRdKV0pO1xuICAgIHRoaXMucmVjdXJyZW50RHJvcG91dCA9IG1hdGhfdXRpbHMubWluKFtcbiAgICAgIDEsXG4gICAgICBtYXRoX3V0aWxzLm1heChcbiAgICAgICAgICBbMCwgYXJncy5yZWN1cnJlbnREcm9wb3V0ID09IG51bGwgPyAwIDogYXJncy5yZWN1cnJlbnREcm9wb3V0XSlcbiAgICBdKTtcbiAgICB0aGlzLmRyb3BvdXRGdW5jID0gYXJncy5kcm9wb3V0RnVuYztcbiAgICB0aGlzLnN0YXRlU2l6ZSA9IHRoaXMudW5pdHM7XG4gICAgdGhpcy5kcm9wb3V0TWFzayA9IG51bGw7XG4gICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IG51bGw7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBVc2UgcmVndWxhcml6ZXIuXG4gICAgdGhpcy5rZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2tlcm5lbCcsIFtpbnB1dFNoYXBlW2lucHV0U2hhcGUubGVuZ3RoIC0gMV0sIHRoaXMudW5pdHNdLCBudWxsLFxuICAgICAgICB0aGlzLmtlcm5lbEluaXRpYWxpemVyLCB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLFxuICAgICAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIHRoaXMucmVjdXJyZW50S2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdyZWN1cnJlbnRfa2VybmVsJywgW3RoaXMudW5pdHMsIHRoaXMudW5pdHNdLCBudWxsLFxuICAgICAgICB0aGlzLnJlY3VycmVudEluaXRpYWxpemVyLCB0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyLCB0cnVlLFxuICAgICAgICB0aGlzLnJlY3VycmVudENvbnN0cmFpbnQpO1xuICAgIGlmICh0aGlzLnVzZUJpYXMpIHtcbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMudW5pdHNdLCBudWxsLCB0aGlzLmJpYXNJbml0aWFsaXplcixcbiAgICAgICAgICB0aGlzLmJpYXNSZWd1bGFyaXplciwgdHJ1ZSwgdGhpcy5iaWFzQ29uc3RyYWludCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlhcyA9IG51bGw7XG4gICAgfVxuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgLy8gUG9ydGluZyBOb3RlOiBQeUtlcmFzJyBlcXVpdmFsZW50IG9mIHRoaXMgbWV0aG9kIHRha2VzIHR3byB0ZW5zb3IgaW5wdXRzOlxuICAvLyAgIGBpbnB1dHNgIGFuZCBgc3RhdGVzYC4gSGVyZSwgdGhlIHR3byB0ZW5zb3JzIGFyZSBjb21iaW5lZCBpbnRvIGFuXG4gIC8vICAgYFRlbnNvcltdYCBBcnJheSBhcyB0aGUgZmlyc3QgaW5wdXQgYXJndW1lbnQuXG4gIC8vICAgU2ltaWxhcmx5LCBQeUtlcmFzJyBlcXVpdmFsZW50IG9mIHRoaXMgbWV0aG9kIHJldHVybnMgdHdvIHZhbHVlczpcbiAgLy8gICAgYG91dHB1dGAgYW5kIGBbb3V0cHV0XWAuIEhlcmUgdGhlIHR3byBhcmUgY29tYmluZWQgaW50byBvbmUgbGVuZ3RoLTJcbiAgLy8gICAgYFRlbnNvcltdYCwgY29uc2lzdGluZyBvZiBgb3V0cHV0YCByZXBlYXRlZC5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGlucHV0cyBhcyBUZW5zb3JbXTtcbiAgICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFNpbXBsZVJOTkNlbGwgZXhwZWN0cyAyIGlucHV0IFRlbnNvcnMsIGdvdCAke2lucHV0cy5sZW5ndGh9LmApO1xuICAgICAgfVxuICAgICAgbGV0IHByZXZPdXRwdXQgPSBpbnB1dHNbMV07XG4gICAgICBpbnB1dHMgPSBpbnB1dHNbMF07XG4gICAgICBjb25zdCB0cmFpbmluZyA9IGt3YXJnc1sndHJhaW5pbmcnXSA9PSBudWxsID8gZmFsc2UgOiBrd2FyZ3NbJ3RyYWluaW5nJ107XG5cbiAgICAgIGlmICgwIDwgdGhpcy5kcm9wb3V0ICYmIHRoaXMuZHJvcG91dCA8IDEgJiYgdGhpcy5kcm9wb3V0TWFzayA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZHJvcG91dE1hc2sgPSBnZW5lcmF0ZURyb3BvdXRNYXNrKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lczogKCkgPT4gdGZjLm9uZXNMaWtlKGlucHV0cyBhcyBUZW5zb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLmRyb3BvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm9wb3V0RnVuYzogdGhpcy5kcm9wb3V0RnVuYyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIGFzIFRlbnNvcjtcbiAgICAgIH1cbiAgICAgIGlmICgwIDwgdGhpcy5yZWN1cnJlbnREcm9wb3V0ICYmIHRoaXMucmVjdXJyZW50RHJvcG91dCA8IDEgJiZcbiAgICAgICAgICB0aGlzLnJlY3VycmVudERyb3BvdXRNYXNrID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IGdlbmVyYXRlRHJvcG91dE1hc2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVzOiAoKSA9PiB0ZmMub25lc0xpa2UocHJldk91dHB1dCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BvdXRGdW5jOiB0aGlzLmRyb3BvdXRGdW5jLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkgYXMgVGVuc29yO1xuICAgICAgfVxuICAgICAgbGV0IGg6IFRlbnNvcjtcbiAgICAgIGNvbnN0IGRwTWFzazogVGVuc29yID0gdGhpcy5kcm9wb3V0TWFzayBhcyBUZW5zb3I7XG4gICAgICBjb25zdCByZWNEcE1hc2s6IFRlbnNvciA9IHRoaXMucmVjdXJyZW50RHJvcG91dE1hc2sgYXMgVGVuc29yO1xuICAgICAgaWYgKGRwTWFzayAhPSBudWxsKSB7XG4gICAgICAgIGggPSBLLmRvdCh0ZmMubXVsKGlucHV0cywgZHBNYXNrKSwgdGhpcy5rZXJuZWwucmVhZCgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGggPSBLLmRvdChpbnB1dHMsIHRoaXMua2VybmVsLnJlYWQoKSk7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5iaWFzICE9IG51bGwpIHtcbiAgICAgICAgaCA9IEsuYmlhc0FkZChoLCB0aGlzLmJpYXMucmVhZCgpKTtcbiAgICAgIH1cbiAgICAgIGlmIChyZWNEcE1hc2sgIT0gbnVsbCkge1xuICAgICAgICBwcmV2T3V0cHV0ID0gdGZjLm11bChwcmV2T3V0cHV0LCByZWNEcE1hc2spO1xuICAgICAgfVxuICAgICAgbGV0IG91dHB1dCA9IHRmYy5hZGQoaCwgSy5kb3QocHJldk91dHB1dCwgdGhpcy5yZWN1cnJlbnRLZXJuZWwucmVhZCgpKSk7XG4gICAgICBpZiAodGhpcy5hY3RpdmF0aW9uICE9IG51bGwpIHtcbiAgICAgICAgb3V0cHV0ID0gdGhpcy5hY3RpdmF0aW9uLmFwcGx5KG91dHB1dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFByb3Blcmx5IHNldCBsZWFybmluZyBwaGFzZSBvbiBvdXRwdXQgdGVuc29yP1xuICAgICAgcmV0dXJuIFtvdXRwdXQsIG91dHB1dF07XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIHVuaXRzOiB0aGlzLnVuaXRzLFxuICAgICAgYWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLFxuICAgICAgdXNlQmlhczogdGhpcy51c2VCaWFzLFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLFxuICAgICAgcmVjdXJyZW50SW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIpLFxuICAgICAgYmlhc0luaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksXG4gICAgICBrZXJuZWxSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksXG4gICAgICByZWN1cnJlbnRSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciksXG4gICAgICBiaWFzUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxcbiAgICAgIGFjdGl2aXR5UmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksXG4gICAgICBrZXJuZWxDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksXG4gICAgICByZWN1cnJlbnRDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucmVjdXJyZW50Q29uc3RyYWludCksXG4gICAgICBiaWFzQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KSxcbiAgICAgIGRyb3BvdXQ6IHRoaXMuZHJvcG91dCxcbiAgICAgIHJlY3VycmVudERyb3BvdXQ6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsuLi5iYXNlQ29uZmlnLCAuLi5jb25maWd9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU2ltcGxlUk5OQ2VsbCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBTaW1wbGVSTk5MYXllckFyZ3MgZXh0ZW5kcyBCYXNlUk5OTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIFBvc2l0aXZlIGludGVnZXIsIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc3BhY2UuXG4gICAqL1xuICB1bml0czogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBBY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gIGh5cGVyYm9saWMgdGFuZ2VudCAoYHRhbmhgKVxuICAgKlxuICAgKiBJZiB5b3UgcGFzcyBgbnVsbGAsIG5vIGFjdGl2YXRpb24gd2lsbCBiZSBhcHBsaWVkLlxuICAgKi9cbiAgYWN0aXZhdGlvbj86IEFjdGl2YXRpb25JZGVudGlmaWVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBsYXllciB1c2VzIGEgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICB1c2VCaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBga2VybmVsYCB3ZWlnaHRzIG1hdHJpeCwgdXNlZCBmb3IgdGhlIGxpbmVhclxuICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgaW5wdXRzLlxuICAgKi9cbiAga2VybmVsSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgYHJlY3VycmVudEtlcm5lbGAgd2VpZ2h0cyBtYXRyaXgsIHVzZWQgZm9yXG4gICAqIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgcmVjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgcmVjdXJyZW50SW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGtlcm5lbCB3ZWlnaHRzIG1hdHJpeC5cbiAgICovXG4gIGtlcm5lbFJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSByZWN1cnJlbnRLZXJuZWwgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICByZWN1cnJlbnRSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUga2VybmVsIHdlaWdodHMgbWF0cml4LlxuICAgKi9cbiAga2VybmVsQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgcmVjdXJyZW50S2VybmVsIHdlaWdodHMgbWF0cml4LlxuICAgKi9cbiAgcmVjdXJyZW50Q29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIENvbnN0cmFpbnQgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG5cbiAgLyoqXG4gICAqIE51bWJlciBiZXR3ZWVuIDAgYW5kIDEuIEZyYWN0aW9uIG9mIHRoZSB1bml0cyB0byBkcm9wIGZvciB0aGUgbGluZWFyXG4gICAqIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBpbnB1dHMuXG4gICAqL1xuICBkcm9wb3V0PzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBOdW1iZXIgYmV0d2VlbiAwIGFuZCAxLiBGcmFjdGlvbiBvZiB0aGUgdW5pdHMgdG8gZHJvcCBmb3IgdGhlIGxpbmVhclxuICAgKiB0cmFuc2Zvcm1hdGlvbiBvZiB0aGUgcmVjdXJyZW50IHN0YXRlLlxuICAgKi9cbiAgcmVjdXJyZW50RHJvcG91dD86IG51bWJlcjtcblxuICAvKipcbiAgICogVGhpcyBpcyBhZGRlZCBmb3IgdGVzdCBESSBwdXJwb3NlLlxuICAgKi9cbiAgZHJvcG91dEZ1bmM/OiBGdW5jdGlvbjtcbn1cblxuLyoqXG4gKiBSTk5MYXllckNvbmZpZyBpcyBpZGVudGljYWwgdG8gQmFzZVJOTkxheWVyQ29uZmlnLCBleGNlcHQgaXQgbWFrZXMgdGhlXG4gKiBgY2VsbGAgcHJvcGVydHkgcmVxdWlyZWQuIFRoaXMgaW50ZXJmYWNlIGlzIHRvIGJlIHVzZWQgd2l0aCBjb25zdHJ1Y3RvcnNcbiAqIG9mIGNvbmNyZXRlIFJOTiBsYXllciBzdWJ0eXBlcy5cbiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFJOTkxheWVyQXJncyBleHRlbmRzIEJhc2VSTk5MYXllckFyZ3Mge1xuICBjZWxsOiBSTk5DZWxsfFJOTkNlbGxbXTtcbn1cblxuZXhwb3J0IGNsYXNzIFNpbXBsZVJOTiBleHRlbmRzIFJOTiB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NpbXBsZVJOTic7XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFNpbXBsZVJOTkxheWVyQXJncykge1xuICAgIGFyZ3MuY2VsbCA9IG5ldyBTaW1wbGVSTk5DZWxsKGFyZ3MpO1xuICAgIHN1cGVyKGFyZ3MgYXMgUk5OTGF5ZXJBcmdzKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgYWN0aXZpdHlSZWd1bGFyaXplci5cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jZWxsLmRyb3BvdXRNYXNrICE9IG51bGwpIHtcbiAgICAgICAgdGZjLmRpc3Bvc2UodGhpcy5jZWxsLmRyb3BvdXRNYXNrKTtcbiAgICAgICAgdGhpcy5jZWxsLmRyb3BvdXRNYXNrID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2sgIT0gbnVsbCkge1xuICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2spO1xuICAgICAgICB0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgbWFzayA9IGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snbWFzayddO1xuICAgICAgY29uc3QgdHJhaW5pbmcgPSBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ3RyYWluaW5nJ107XG4gICAgICBjb25zdCBpbml0aWFsU3RhdGU6IFRlbnNvcltdID1cbiAgICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuICAgICAgcmV0dXJuIHN1cGVyLmNhbGwoaW5wdXRzLCB7bWFzaywgdHJhaW5pbmcsIGluaXRpYWxTdGF0ZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sXG4gICAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIHJldHVybiBuZXcgY2xzKGNvbmZpZyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTaW1wbGVSTk4pO1xuXG4vLyBQb3J0aW5nIE5vdGU6IFNpbmNlIHRoaXMgaXMgYSBzdXBlcnNldCBvZiBTaW1wbGVSTk5MYXllckNvbmZpZywgd2UgZXh0ZW5kXG4vLyAgIHRoYXQgaW50ZXJmYWNlIGluc3RlYWQgb2YgcmVwZWF0aW5nIHRoZSBmaWVsZHMuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgR1JVQ2VsbExheWVyQXJncyBleHRlbmRzIFNpbXBsZVJOTkNlbGxMYXllckFyZ3Mge1xuICAvKipcbiAgICogQWN0aXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgZm9yIHRoZSByZWN1cnJlbnQgc3RlcC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gaGFyZCBzaWdtb2lkIChgaGFyZFNpZ21vaWRgKS5cbiAgICpcbiAgICogSWYgYG51bGxgLCBubyBhY3RpdmF0aW9uIGlzIGFwcGxpZWQuXG4gICAqL1xuICByZWN1cnJlbnRBY3RpdmF0aW9uPzogQWN0aXZhdGlvbklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG1vZGUsIGVpdGhlciAxIG9yIDIuXG4gICAqXG4gICAqIE1vZGUgMSB3aWxsIHN0cnVjdHVyZSBpdHMgb3BlcmF0aW9ucyBhcyBhIGxhcmdlciBudW1iZXIgb2ZcbiAgICogICBzbWFsbGVyIGRvdCBwcm9kdWN0cyBhbmQgYWRkaXRpb25zLlxuICAgKlxuICAgKiBNb2RlIDIgd2lsbCBiYXRjaCB0aGVtIGludG8gZmV3ZXIsIGxhcmdlciBvcGVyYXRpb25zLiBUaGVzZSBtb2RlcyB3aWxsXG4gICAqIGhhdmUgZGlmZmVyZW50IHBlcmZvcm1hbmNlIHByb2ZpbGVzIG9uIGRpZmZlcmVudCBoYXJkd2FyZSBhbmRcbiAgICogZm9yIGRpZmZlcmVudCBhcHBsaWNhdGlvbnMuXG4gICAqXG4gICAqIE5vdGU6IEZvciBzdXBlcmlvciBwZXJmb3JtYW5jZSwgVGVuc29yRmxvdy5qcyBhbHdheXMgdXNlcyBpbXBsZW1lbnRhdGlvblxuICAgKiAyLCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpZWxkLlxuICAgKi9cbiAgaW1wbGVtZW50YXRpb24/OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEdSVSBjb252ZW50aW9uICh3aGV0aGVyIHRvIGFwcGx5IHJlc2V0IGdhdGUgYWZ0ZXIgb3IgYmVmb3JlIG1hdHJpeFxuICAgKiBtdWx0aXBsaWNhdGlvbikuIGZhbHNlID0gXCJiZWZvcmVcIiwgdHJ1ZSA9IFwiYWZ0ZXJcIiAob25seSBmYWxzZSBpc1xuICAgKiBzdXBwb3J0ZWQpLlxuICAgKi9cbiAgcmVzZXRBZnRlcj86IGJvb2xlYW47XG59XG5cbmV4cG9ydCBjbGFzcyBHUlVDZWxsIGV4dGVuZHMgUk5OQ2VsbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0dSVUNlbGwnO1xuICByZWFkb25seSB1bml0czogbnVtYmVyO1xuICByZWFkb25seSBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICByZWFkb25seSByZWN1cnJlbnRBY3RpdmF0aW9uOiBBY3RpdmF0aW9uO1xuICByZWFkb25seSB1c2VCaWFzOiBib29sZWFuO1xuXG4gIHJlYWRvbmx5IGtlcm5lbEluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50SW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICByZWFkb25seSBiaWFzSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuXG4gIHJlYWRvbmx5IGtlcm5lbFJlZ3VsYXJpemVyOiBSZWd1bGFyaXplcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50UmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICByZWFkb25seSBiaWFzUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuXG4gIHJlYWRvbmx5IGtlcm5lbENvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHJlYWRvbmx5IHJlY3VycmVudENvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHJlYWRvbmx5IGJpYXNDb25zdHJhaW50OiBDb25zdHJhaW50O1xuXG4gIHJlYWRvbmx5IGRyb3BvdXQ6IG51bWJlcjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50RHJvcG91dDogbnVtYmVyO1xuICByZWFkb25seSBkcm9wb3V0RnVuYzogRnVuY3Rpb247XG5cbiAgcmVhZG9ubHkgc3RhdGVTaXplOiBudW1iZXI7XG4gIHJlYWRvbmx5IGltcGxlbWVudGF0aW9uOiBudW1iZXI7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9BQ1RJVkFUSU9OID0gJ3RhbmgnO1xuICByZWFkb25seSBERUZBVUxUX1JFQ1VSUkVOVF9BQ1RJVkFUSU9OOiBBY3RpdmF0aW9uSWRlbnRpZmllciA9ICdoYXJkU2lnbW9pZCc7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVIgPSAnZ2xvcm90Tm9ybWFsJztcbiAgcmVhZG9ubHkgREVGQVVMVF9SRUNVUlJFTlRfSU5JVElBTElaRVIgPSAnb3J0aG9nb25hbCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfQklBU19JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID0gJ3plcm9zJztcblxuICBrZXJuZWw6IExheWVyVmFyaWFibGU7XG4gIHJlY3VycmVudEtlcm5lbDogTGF5ZXJWYXJpYWJsZTtcbiAgYmlhczogTGF5ZXJWYXJpYWJsZTtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBHUlVDZWxsTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgaWYgKGFyZ3MucmVzZXRBZnRlcikge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEdSVUNlbGwgZG9lcyBub3Qgc3VwcG9ydCByZXNldF9hZnRlciBwYXJhbWV0ZXIgc2V0IHRvIHRydWUuYCk7XG4gICAgfVxuICAgIHRoaXMudW5pdHMgPSBhcmdzLnVuaXRzO1xuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnVuaXRzLCAndW5pdHMnKTtcbiAgICB0aGlzLmFjdGl2YXRpb24gPSBnZXRBY3RpdmF0aW9uKFxuICAgICAgICBhcmdzLmFjdGl2YXRpb24gPT09IHVuZGVmaW5lZCA/IHRoaXMuREVGQVVMVF9BQ1RJVkFUSU9OIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFjdGl2YXRpb24pO1xuICAgIHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oXG4gICAgICAgIGFyZ3MucmVjdXJyZW50QWN0aXZhdGlvbiA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuREVGQVVMVF9SRUNVUlJFTlRfQUNUSVZBVElPTiA6XG4gICAgICAgICAgICBhcmdzLnJlY3VycmVudEFjdGl2YXRpb24pO1xuICAgIHRoaXMudXNlQmlhcyA9IGFyZ3MudXNlQmlhcyA9PSBudWxsID8gdHJ1ZSA6IGFyZ3MudXNlQmlhcztcblxuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5rZXJuZWxJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLnJlY3VycmVudEluaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoXG4gICAgICAgIGFyZ3MucmVjdXJyZW50SW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUik7XG5cbiAgICB0aGlzLmJpYXNJbml0aWFsaXplciA9XG4gICAgICAgIGdldEluaXRpYWxpemVyKGFyZ3MuYmlhc0luaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKTtcblxuICAgIHRoaXMua2VybmVsUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmtlcm5lbFJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5yZWN1cnJlbnRSZWd1bGFyaXplcik7XG4gICAgdGhpcy5iaWFzUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmJpYXNSZWd1bGFyaXplcik7XG5cbiAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3Mua2VybmVsQ29uc3RyYWludCk7XG4gICAgdGhpcy5yZWN1cnJlbnRDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLnJlY3VycmVudENvbnN0cmFpbnQpO1xuICAgIHRoaXMuYmlhc0NvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MuYmlhc0NvbnN0cmFpbnQpO1xuXG4gICAgdGhpcy5kcm9wb3V0ID0gbWF0aF91dGlscy5taW4oXG4gICAgICAgIFsxLCBtYXRoX3V0aWxzLm1heChbMCwgYXJncy5kcm9wb3V0ID09IG51bGwgPyAwIDogYXJncy5kcm9wb3V0XSldKTtcbiAgICB0aGlzLnJlY3VycmVudERyb3BvdXQgPSBtYXRoX3V0aWxzLm1pbihbXG4gICAgICAxLFxuICAgICAgbWF0aF91dGlscy5tYXgoXG4gICAgICAgICAgWzAsIGFyZ3MucmVjdXJyZW50RHJvcG91dCA9PSBudWxsID8gMCA6IGFyZ3MucmVjdXJyZW50RHJvcG91dF0pXG4gICAgXSk7XG4gICAgdGhpcy5kcm9wb3V0RnVuYyA9IGFyZ3MuZHJvcG91dEZ1bmM7XG4gICAgdGhpcy5pbXBsZW1lbnRhdGlvbiA9IGFyZ3MuaW1wbGVtZW50YXRpb247XG4gICAgdGhpcy5zdGF0ZVNpemUgPSB0aGlzLnVuaXRzO1xuICAgIHRoaXMuZHJvcG91dE1hc2sgPSBudWxsO1xuICAgIHRoaXMucmVjdXJyZW50RHJvcG91dE1hc2sgPSBudWxsO1xuICB9XG5cbiAgcHVibGljIGJ1aWxkKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiB2b2lkIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IGlucHV0RGltID0gaW5wdXRTaGFwZVtpbnB1dFNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIHRoaXMua2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdrZXJuZWwnLCBbaW5wdXREaW0sIHRoaXMudW5pdHMgKiAzXSwgbnVsbCwgdGhpcy5rZXJuZWxJbml0aWFsaXplcixcbiAgICAgICAgdGhpcy5rZXJuZWxSZWd1bGFyaXplciwgdHJ1ZSwgdGhpcy5rZXJuZWxDb25zdHJhaW50KTtcbiAgICB0aGlzLnJlY3VycmVudEtlcm5lbCA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAncmVjdXJyZW50X2tlcm5lbCcsIFt0aGlzLnVuaXRzLCB0aGlzLnVuaXRzICogM10sIG51bGwsXG4gICAgICAgIHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIsIHRoaXMucmVjdXJyZW50UmVndWxhcml6ZXIsIHRydWUsXG4gICAgICAgIHRoaXMucmVjdXJyZW50Q29uc3RyYWludCk7XG4gICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgdGhpcy5iaWFzID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JpYXMnLCBbdGhpcy51bml0cyAqIDNdLCBudWxsLCB0aGlzLmJpYXNJbml0aWFsaXplcixcbiAgICAgICAgICB0aGlzLmJpYXNSZWd1bGFyaXplciwgdHJ1ZSwgdGhpcy5iaWFzQ29uc3RyYWludCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYmlhcyA9IG51bGw7XG4gICAgfVxuICAgIC8vIFBvcnRpbmcgTm90ZXM6IFVubGlrZSB0aGUgUHlLZXJhcyBpbXBsZW1lbnRhdGlvbiwgd2UgcGVyZm9ybSBzbGljaW5nXG4gICAgLy8gICBvZiB0aGUgd2VpZ2h0cyBhbmQgYmlhcyBpbiB0aGUgY2FsbCgpIG1ldGhvZCwgYXQgZXhlY3V0aW9uIHRpbWUuXG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaW5wdXRzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuICAgICAgaWYgKGlucHV0cy5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgR1JVQ2VsbCBleHBlY3RzIDIgaW5wdXQgVGVuc29ycyAoaW5wdXRzLCBoLCBjKSwgZ290IGAgK1xuICAgICAgICAgICAgYCR7aW5wdXRzLmxlbmd0aH0uYCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyYWluaW5nID0ga3dhcmdzWyd0cmFpbmluZyddID09IG51bGwgPyBmYWxzZSA6IGt3YXJnc1sndHJhaW5pbmcnXTtcbiAgICAgIGxldCBoVE1pbnVzMSA9IGlucHV0c1sxXTsgIC8vIFByZXZpb3VzIG1lbW9yeSBzdGF0ZS5cbiAgICAgIGlucHV0cyA9IGlucHV0c1swXTtcblxuICAgICAgLy8gTm90ZTogRm9yIHN1cGVyaW9yIHBlcmZvcm1hbmNlLCBUZW5zb3JGbG93LmpzIGFsd2F5cyB1c2VzXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiAyLCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgdmFsdWUgb2ZcbiAgICAgIC8vIGNvbmZpZy5pbXBsZW1lbnRhdGlvbi5cbiAgICAgIGlmICgwIDwgdGhpcy5kcm9wb3V0ICYmIHRoaXMuZHJvcG91dCA8IDEgJiYgdGhpcy5kcm9wb3V0TWFzayA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZHJvcG91dE1hc2sgPSBnZW5lcmF0ZURyb3BvdXRNYXNrKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lczogKCkgPT4gdGZjLm9uZXNMaWtlKGlucHV0cyBhcyBUZW5zb3IpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLmRyb3BvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcG91dEZ1bmM6IHRoaXMuZHJvcG91dEZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JbXTtcbiAgICAgIH1cbiAgICAgIGlmICgwIDwgdGhpcy5yZWN1cnJlbnREcm9wb3V0ICYmIHRoaXMucmVjdXJyZW50RHJvcG91dCA8IDEgJiZcbiAgICAgICAgICB0aGlzLnJlY3VycmVudERyb3BvdXRNYXNrID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IGdlbmVyYXRlRHJvcG91dE1hc2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVzOiAoKSA9PiB0ZmMub25lc0xpa2UoaFRNaW51czEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLnJlY3VycmVudERyb3BvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogMyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcG91dEZ1bmM6IHRoaXMuZHJvcG91dEZ1bmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JbXTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRwTWFzayA9IHRoaXMuZHJvcG91dE1hc2sgYXMgW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdO1xuICAgICAgY29uc3QgcmVjRHBNYXNrID0gdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayBhcyBbVGVuc29yLCBUZW5zb3IsIFRlbnNvcl07XG4gICAgICBsZXQgejogVGVuc29yO1xuICAgICAgbGV0IHI6IFRlbnNvcjtcbiAgICAgIGxldCBoaDogVGVuc29yO1xuXG4gICAgICBpZiAoMCA8IHRoaXMuZHJvcG91dCAmJiB0aGlzLmRyb3BvdXQgPCAxKSB7XG4gICAgICAgIGlucHV0cyA9IHRmYy5tdWwoaW5wdXRzLCBkcE1hc2tbMF0pO1xuICAgICAgfVxuICAgICAgbGV0IG1hdHJpeFggPSBLLmRvdChpbnB1dHMsIHRoaXMua2VybmVsLnJlYWQoKSk7XG4gICAgICBpZiAodGhpcy51c2VCaWFzKSB7XG4gICAgICAgIG1hdHJpeFggPSBLLmJpYXNBZGQobWF0cml4WCwgdGhpcy5iaWFzLnJlYWQoKSk7XG4gICAgICB9XG4gICAgICBpZiAoMCA8IHRoaXMucmVjdXJyZW50RHJvcG91dCAmJiB0aGlzLnJlY3VycmVudERyb3BvdXQgPCAxKSB7XG4gICAgICAgIGhUTWludXMxID0gdGZjLm11bChoVE1pbnVzMSwgcmVjRHBNYXNrWzBdKTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgcmVjdXJyZW50S2VybmVsVmFsdWUgPSB0aGlzLnJlY3VycmVudEtlcm5lbC5yZWFkKCk7XG4gICAgICBjb25zdCBbcmsxLCByazJdID0gdGZjLnNwbGl0KFxuICAgICAgICAgIHJlY3VycmVudEtlcm5lbFZhbHVlLCBbMiAqIHRoaXMudW5pdHMsIHRoaXMudW5pdHNdLFxuICAgICAgICAgIHJlY3VycmVudEtlcm5lbFZhbHVlLnJhbmsgLSAxKTtcbiAgICAgIGNvbnN0IG1hdHJpeElubmVyID0gSy5kb3QoaFRNaW51czEsIHJrMSk7XG5cbiAgICAgIGNvbnN0IFt4WiwgeFIsIHhIXSA9IHRmYy5zcGxpdChtYXRyaXhYLCAzLCBtYXRyaXhYLnJhbmsgLSAxKTtcbiAgICAgIGNvbnN0IFtyZWN1cnJlbnRaLCByZWN1cnJlbnRSXSA9XG4gICAgICAgICAgdGZjLnNwbGl0KG1hdHJpeElubmVyLCAyLCBtYXRyaXhJbm5lci5yYW5rIC0gMSk7XG4gICAgICB6ID0gdGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KHRmYy5hZGQoeFosIHJlY3VycmVudFopKTtcbiAgICAgIHIgPSB0aGlzLnJlY3VycmVudEFjdGl2YXRpb24uYXBwbHkodGZjLmFkZCh4UiwgcmVjdXJyZW50UikpO1xuXG4gICAgICBjb25zdCByZWN1cnJlbnRIID0gSy5kb3QodGZjLm11bChyLCBoVE1pbnVzMSksIHJrMik7XG4gICAgICBoaCA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseSh0ZmMuYWRkKHhILCByZWN1cnJlbnRIKSk7XG5cbiAgICAgIGNvbnN0IGggPVxuICAgICAgICAgIHRmYy5hZGQodGZjLm11bCh6LCBoVE1pbnVzMSksIHRmYy5tdWwodGZjLmFkZCgxLCB0ZmMubmVnKHopKSwgaGgpKTtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCB1c2VfbGVhcm5pbmdfcGhhc2UgZmxhZyBwcm9wZXJseS5cbiAgICAgIHJldHVybiBbaCwgaF07XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG5cbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIHVuaXRzOiB0aGlzLnVuaXRzLFxuICAgICAgYWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLFxuICAgICAgcmVjdXJyZW50QWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLnJlY3VycmVudEFjdGl2YXRpb24pLFxuICAgICAgdXNlQmlhczogdGhpcy51c2VCaWFzLFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLFxuICAgICAgcmVjdXJyZW50SW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMucmVjdXJyZW50SW5pdGlhbGl6ZXIpLFxuICAgICAgYmlhc0luaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksXG4gICAgICBrZXJuZWxSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksXG4gICAgICByZWN1cnJlbnRSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciksXG4gICAgICBiaWFzUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxcbiAgICAgIGFjdGl2aXR5UmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksXG4gICAgICBrZXJuZWxDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksXG4gICAgICByZWN1cnJlbnRDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucmVjdXJyZW50Q29uc3RyYWludCksXG4gICAgICBiaWFzQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KSxcbiAgICAgIGRyb3BvdXQ6IHRoaXMuZHJvcG91dCxcbiAgICAgIHJlY3VycmVudERyb3BvdXQ6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICAgIGltcGxlbWVudGF0aW9uOiB0aGlzLmltcGxlbWVudGF0aW9uLFxuICAgICAgcmVzZXRBZnRlcjogZmFsc2VcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsuLi5iYXNlQ29uZmlnLCAuLi5jb25maWd9O1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR1JVQ2VsbCk7XG5cbi8vIFBvcnRpbmcgTm90ZTogU2luY2UgdGhpcyBpcyBhIHN1cGVyc2V0IG9mIFNpbXBsZVJOTkxheWVyQ29uZmlnLCB3ZSBpbmhlcml0XG4vLyAgIGZyb20gdGhhdCBpbnRlcmZhY2UgaW5zdGVhZCBvZiByZXBlYXRpbmcgdGhlIGZpZWxkcyBoZXJlLlxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEdSVUxheWVyQXJncyBleHRlbmRzIFNpbXBsZVJOTkxheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHJlY3VycmVudCBzdGVwLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBoYXJkIHNpZ21vaWQgKGBoYXJkU2lnbW9pZGApLlxuICAgKlxuICAgKiBJZiBgbnVsbGAsIG5vIGFjdGl2YXRpb24gaXMgYXBwbGllZC5cbiAgICovXG4gIHJlY3VycmVudEFjdGl2YXRpb24/OiBBY3RpdmF0aW9uSWRlbnRpZmllcjtcblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gbW9kZSwgZWl0aGVyIDEgb3IgMi5cbiAgICpcbiAgICogTW9kZSAxIHdpbGwgc3RydWN0dXJlIGl0cyBvcGVyYXRpb25zIGFzIGEgbGFyZ2VyIG51bWJlciBvZlxuICAgKiBzbWFsbGVyIGRvdCBwcm9kdWN0cyBhbmQgYWRkaXRpb25zLlxuICAgKlxuICAgKiBNb2RlIDIgd2lsbCBiYXRjaCB0aGVtIGludG8gZmV3ZXIsIGxhcmdlciBvcGVyYXRpb25zLiBUaGVzZSBtb2RlcyB3aWxsXG4gICAqIGhhdmUgZGlmZmVyZW50IHBlcmZvcm1hbmNlIHByb2ZpbGVzIG9uIGRpZmZlcmVudCBoYXJkd2FyZSBhbmRcbiAgICogZm9yIGRpZmZlcmVudCBhcHBsaWNhdGlvbnMuXG4gICAqXG4gICAqIE5vdGU6IEZvciBzdXBlcmlvciBwZXJmb3JtYW5jZSwgVGVuc29yRmxvdy5qcyBhbHdheXMgdXNlcyBpbXBsZW1lbnRhdGlvblxuICAgKiAyLCByZWdhcmRsZXNzIG9mIHRoZSBhY3R1YWwgdmFsdWUgb2YgdGhpcyBjb25maWd1cmF0aW9uIGZpZWxkLlxuICAgKi9cbiAgaW1wbGVtZW50YXRpb24/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHUlUgZXh0ZW5kcyBSTk4ge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdHUlUnO1xuICBjb25zdHJ1Y3RvcihhcmdzOiBHUlVMYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncy5pbXBsZW1lbnRhdGlvbiA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdgaW1wbGVtZW50YXRpb249MGAgaGFzIGJlZW4gZGVwcmVjYXRlZCwgYW5kIG5vdyBkZWZhdWx0cyB0byAnICtcbiAgICAgICAgICAnYGltcGxlbWVudGF0aW9uPTFgLiBQbGVhc2UgdXBkYXRlIHlvdXIgbGF5ZXIgY2FsbC4nKTtcbiAgICB9XG4gICAgYXJncy5jZWxsID0gbmV3IEdSVUNlbGwoYXJncyk7XG4gICAgc3VwZXIoYXJncyBhcyBSTk5MYXllckFyZ3MpO1xuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBhY3Rpdml0eVJlZ3VsYXJpemVyLlxuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlmICh0aGlzLmNlbGwuZHJvcG91dE1hc2sgIT0gbnVsbCkge1xuICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLmNlbGwuZHJvcG91dE1hc2spO1xuICAgICAgICB0aGlzLmNlbGwuZHJvcG91dE1hc2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayAhPSBudWxsKSB7XG4gICAgICAgIHRmYy5kaXNwb3NlKHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayk7XG4gICAgICAgIHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayA9IG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCBtYXNrID0ga3dhcmdzID09IG51bGwgPyBudWxsIDoga3dhcmdzWydtYXNrJ107XG4gICAgICBjb25zdCB0cmFpbmluZyA9IGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1sndHJhaW5pbmcnXTtcbiAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZTogVGVuc29yW10gPVxuICAgICAgICAgIGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snaW5pdGlhbFN0YXRlJ107XG4gICAgICByZXR1cm4gc3VwZXIuY2FsbChpbnB1dHMsIHttYXNrLCB0cmFpbmluZywgaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPixcbiAgICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogVCB7XG4gICAgaWYgKGNvbmZpZ1snaW1wbG1lbnRhdGlvbiddID09PSAwKSB7XG4gICAgICBjb25maWdbJ2ltcGxlbWVudGF0aW9uJ10gPSAxO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IGNscyhjb25maWcpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR1JVKTtcblxuLy8gUG9ydGluZyBOb3RlOiBTaW5jZSB0aGlzIGlzIGEgc3VwZXJzZXQgb2YgU2ltcGxlUk5OTGF5ZXJDb25maWcsIHdlIGV4dGVuZFxuLy8gICB0aGF0IGludGVyZmFjZSBpbnN0ZWFkIG9mIHJlcGVhdGluZyB0aGUgZmllbGRzLlxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIExTVE1DZWxsTGF5ZXJBcmdzIGV4dGVuZHMgU2ltcGxlUk5OQ2VsbExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZSBmb3IgdGhlIHJlY3VycmVudCBzdGVwLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byBoYXJkIHNpZ21vaWQgKGBoYXJkU2lnbW9pZGApLlxuICAgKlxuICAgKiBJZiBgbnVsbGAsIG5vIGFjdGl2YXRpb24gaXMgYXBwbGllZC5cbiAgICovXG4gIHJlY3VycmVudEFjdGl2YXRpb24/OiBBY3RpdmF0aW9uSWRlbnRpZmllcjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhZGQgMSB0byB0aGUgYmlhcyBvZiB0aGUgZm9yZ2V0IGdhdGUgYXQgaW5pdGlhbGl6YXRpb24uXG4gICAqIFNldHRpbmcgaXQgdG8gYHRydWVgIHdpbGwgYWxzbyBmb3JjZSBgYmlhc0luaXRpYWxpemVyID0gJ3plcm9zJ2AuXG4gICAqIFRoaXMgaXMgcmVjb21tZW5kZWQgaW5cbiAgICogW0pvemVmb3dpY3ogZXRcbiAgICogYWwuXShodHRwOi8vd3d3LmptbHIub3JnL3Byb2NlZWRpbmdzL3BhcGVycy92Mzcvam96ZWZvd2ljejE1LnBkZilcbiAgICovXG4gIHVuaXRGb3JnZXRCaWFzPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSW1wbGVtZW50YXRpb24gbW9kZSwgZWl0aGVyIDEgb3IgMi5cbiAgICpcbiAgICogTW9kZSAxIHdpbGwgc3RydWN0dXJlIGl0cyBvcGVyYXRpb25zIGFzIGEgbGFyZ2VyIG51bWJlciBvZlxuICAgKiAgIHNtYWxsZXIgZG90IHByb2R1Y3RzIGFuZCBhZGRpdGlvbnMuXG4gICAqXG4gICAqIE1vZGUgMiB3aWxsIGJhdGNoIHRoZW0gaW50byBmZXdlciwgbGFyZ2VyIG9wZXJhdGlvbnMuIFRoZXNlIG1vZGVzIHdpbGxcbiAgICogaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgcHJvZmlsZXMgb24gZGlmZmVyZW50IGhhcmR3YXJlIGFuZFxuICAgKiBmb3IgZGlmZmVyZW50IGFwcGxpY2F0aW9ucy5cbiAgICpcbiAgICogTm90ZTogRm9yIHN1cGVyaW9yIHBlcmZvcm1hbmNlLCBUZW5zb3JGbG93LmpzIGFsd2F5cyB1c2VzIGltcGxlbWVudGF0aW9uXG4gICAqIDIsIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGlzIGNvbmZpZ3VyYXRpb24gZmllbGQuXG4gICAqL1xuICBpbXBsZW1lbnRhdGlvbj86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIExTVE1DZWxsIGV4dGVuZHMgUk5OQ2VsbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0xTVE1DZWxsJztcbiAgcmVhZG9ubHkgdW5pdHM6IG51bWJlcjtcbiAgcmVhZG9ubHkgYWN0aXZhdGlvbjogQWN0aXZhdGlvbjtcbiAgcmVhZG9ubHkgcmVjdXJyZW50QWN0aXZhdGlvbjogQWN0aXZhdGlvbjtcbiAgcmVhZG9ubHkgdXNlQmlhczogYm9vbGVhbjtcblxuICByZWFkb25seSBrZXJuZWxJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHJlYWRvbmx5IHJlY3VycmVudEluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgYmlhc0luaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgdW5pdEZvcmdldEJpYXM6IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkga2VybmVsQ29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcmVhZG9ubHkgcmVjdXJyZW50Q29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcmVhZG9ubHkgYmlhc0NvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG5cbiAgcmVhZG9ubHkga2VybmVsUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICByZWFkb25seSByZWN1cnJlbnRSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHJlYWRvbmx5IGJpYXNSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG5cbiAgcmVhZG9ubHkgZHJvcG91dDogbnVtYmVyO1xuICByZWFkb25seSByZWN1cnJlbnREcm9wb3V0OiBudW1iZXI7XG4gIHJlYWRvbmx5IGRyb3BvdXRGdW5jOiBGdW5jdGlvbjtcblxuICByZWFkb25seSBzdGF0ZVNpemU6IG51bWJlcltdO1xuICByZWFkb25seSBpbXBsZW1lbnRhdGlvbjogbnVtYmVyO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfQUNUSVZBVElPTiA9ICd0YW5oJztcbiAgcmVhZG9ubHkgREVGQVVMVF9SRUNVUlJFTlRfQUNUSVZBVElPTiA9ICdoYXJkU2lnbW9pZCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSID0gJ2dsb3JvdE5vcm1hbCc7XG4gIHJlYWRvbmx5IERFRkFVTFRfUkVDVVJSRU5UX0lOSVRJQUxJWkVSID0gJ29ydGhvZ29uYWwnO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfQklBU19JTklUSUFMSVpFUiA9ICd6ZXJvcyc7XG5cbiAga2VybmVsOiBMYXllclZhcmlhYmxlO1xuICByZWN1cnJlbnRLZXJuZWw6IExheWVyVmFyaWFibGU7XG4gIGJpYXM6IExheWVyVmFyaWFibGU7XG5cbiAgY29uc3RydWN0b3IoYXJnczogTFNUTUNlbGxMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcblxuICAgIHRoaXMudW5pdHMgPSBhcmdzLnVuaXRzO1xuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnVuaXRzLCAndW5pdHMnKTtcbiAgICB0aGlzLmFjdGl2YXRpb24gPSBnZXRBY3RpdmF0aW9uKFxuICAgICAgICBhcmdzLmFjdGl2YXRpb24gPT09IHVuZGVmaW5lZCA/IHRoaXMuREVGQVVMVF9BQ1RJVkFUSU9OIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLmFjdGl2YXRpb24pO1xuICAgIHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oXG4gICAgICAgIGFyZ3MucmVjdXJyZW50QWN0aXZhdGlvbiA9PT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgIHRoaXMuREVGQVVMVF9SRUNVUlJFTlRfQUNUSVZBVElPTiA6XG4gICAgICAgICAgICBhcmdzLnJlY3VycmVudEFjdGl2YXRpb24pO1xuICAgIHRoaXMudXNlQmlhcyA9IGFyZ3MudXNlQmlhcyA9PSBudWxsID8gdHJ1ZSA6IGFyZ3MudXNlQmlhcztcblxuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5rZXJuZWxJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLnJlY3VycmVudEluaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoXG4gICAgICAgIGFyZ3MucmVjdXJyZW50SW5pdGlhbGl6ZXIgfHwgdGhpcy5ERUZBVUxUX1JFQ1VSUkVOVF9JTklUSUFMSVpFUik7XG5cbiAgICB0aGlzLmJpYXNJbml0aWFsaXplciA9XG4gICAgICAgIGdldEluaXRpYWxpemVyKGFyZ3MuYmlhc0luaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLnVuaXRGb3JnZXRCaWFzID0gYXJncy51bml0Rm9yZ2V0QmlhcztcblxuICAgIHRoaXMua2VybmVsUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmtlcm5lbFJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5yZWN1cnJlbnRSZWd1bGFyaXplcik7XG4gICAgdGhpcy5iaWFzUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmJpYXNSZWd1bGFyaXplcik7XG5cbiAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3Mua2VybmVsQ29uc3RyYWludCk7XG4gICAgdGhpcy5yZWN1cnJlbnRDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLnJlY3VycmVudENvbnN0cmFpbnQpO1xuICAgIHRoaXMuYmlhc0NvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3MuYmlhc0NvbnN0cmFpbnQpO1xuXG4gICAgdGhpcy5kcm9wb3V0ID0gbWF0aF91dGlscy5taW4oXG4gICAgICAgIFsxLCBtYXRoX3V0aWxzLm1heChbMCwgYXJncy5kcm9wb3V0ID09IG51bGwgPyAwIDogYXJncy5kcm9wb3V0XSldKTtcbiAgICB0aGlzLnJlY3VycmVudERyb3BvdXQgPSBtYXRoX3V0aWxzLm1pbihbXG4gICAgICAxLFxuICAgICAgbWF0aF91dGlscy5tYXgoXG4gICAgICAgICAgWzAsIGFyZ3MucmVjdXJyZW50RHJvcG91dCA9PSBudWxsID8gMCA6IGFyZ3MucmVjdXJyZW50RHJvcG91dF0pXG4gICAgXSk7XG4gICAgdGhpcy5kcm9wb3V0RnVuYyA9IGFyZ3MuZHJvcG91dEZ1bmM7XG4gICAgdGhpcy5pbXBsZW1lbnRhdGlvbiA9IGFyZ3MuaW1wbGVtZW50YXRpb247XG4gICAgdGhpcy5zdGF0ZVNpemUgPSBbdGhpcy51bml0cywgdGhpcy51bml0c107XG4gICAgdGhpcy5kcm9wb3V0TWFzayA9IG51bGw7XG4gICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IG51bGw7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgaW5wdXREaW0gPSBpbnB1dFNoYXBlW2lucHV0U2hhcGUubGVuZ3RoIC0gMV07XG4gICAgdGhpcy5rZXJuZWwgPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ2tlcm5lbCcsIFtpbnB1dERpbSwgdGhpcy51bml0cyAqIDRdLCBudWxsLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICB0aGlzLmtlcm5lbFJlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmtlcm5lbENvbnN0cmFpbnQpO1xuICAgIHRoaXMucmVjdXJyZW50S2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICdyZWN1cnJlbnRfa2VybmVsJywgW3RoaXMudW5pdHMsIHRoaXMudW5pdHMgKiA0XSwgbnVsbCxcbiAgICAgICAgdGhpcy5yZWN1cnJlbnRJbml0aWFsaXplciwgdGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciwgdHJ1ZSxcbiAgICAgICAgdGhpcy5yZWN1cnJlbnRDb25zdHJhaW50KTtcbiAgICBsZXQgYmlhc0luaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgICBpZiAodGhpcy51c2VCaWFzKSB7XG4gICAgICBpZiAodGhpcy51bml0Rm9yZ2V0Qmlhcykge1xuICAgICAgICBjb25zdCBjYXB0dXJlZEJpYXNJbml0ID0gdGhpcy5iaWFzSW5pdGlhbGl6ZXI7XG4gICAgICAgIGNvbnN0IGNhcHR1cmVkVW5pdHMgPSB0aGlzLnVuaXRzO1xuICAgICAgICBiaWFzSW5pdGlhbGl6ZXIgPSBuZXcgKGNsYXNzIEN1c3RvbUluaXQgZXh0ZW5kcyBJbml0aWFsaXplciB7XG4gICAgICAgICAgLyoqIEBub2NvbGxhcHNlICovXG4gICAgICAgICAgc3RhdGljIGNsYXNzTmFtZSA9ICdDdXN0b21Jbml0JztcblxuICAgICAgICAgIGFwcGx5KHNoYXBlOiBTaGFwZSwgZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBNb3JlIGluZm9ybWF0aXZlIHZhcmlhYmxlIG5hbWVzP1xuICAgICAgICAgICAgY29uc3QgYkkgPSBjYXB0dXJlZEJpYXNJbml0LmFwcGx5KFtjYXB0dXJlZFVuaXRzXSk7XG4gICAgICAgICAgICBjb25zdCBiRiA9IChuZXcgT25lcygpKS5hcHBseShbY2FwdHVyZWRVbml0c10pO1xuICAgICAgICAgICAgY29uc3QgYkNBbmRIID0gY2FwdHVyZWRCaWFzSW5pdC5hcHBseShbY2FwdHVyZWRVbml0cyAqIDJdKTtcbiAgICAgICAgICAgIHJldHVybiBLLmNvbmNhdEFsb25nRmlyc3RBeGlzKFxuICAgICAgICAgICAgICAgIEsuY29uY2F0QWxvbmdGaXJzdEF4aXMoYkksIGJGKSwgYkNBbmRIKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaWFzSW5pdGlhbGl6ZXIgPSB0aGlzLmJpYXNJbml0aWFsaXplcjtcbiAgICAgIH1cbiAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdiaWFzJywgW3RoaXMudW5pdHMgKiA0XSwgbnVsbCwgYmlhc0luaXRpYWxpemVyLCB0aGlzLmJpYXNSZWd1bGFyaXplcixcbiAgICAgICAgICB0cnVlLCB0aGlzLmJpYXNDb25zdHJhaW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5iaWFzID0gbnVsbDtcbiAgICB9XG4gICAgLy8gUG9ydGluZyBOb3RlczogVW5saWtlIHRoZSBQeUtlcmFzIGltcGxlbWVudGF0aW9uLCB3ZSBwZXJmb3JtIHNsaWNpbmdcbiAgICAvLyAgIG9mIHRoZSB3ZWlnaHRzIGFuZCBiaWFzIGluIHRoZSBjYWxsKCkgbWV0aG9kLCBhdCBleGVjdXRpb24gdGltZS5cbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCB0cmFpbmluZyA9IGt3YXJnc1sndHJhaW5pbmcnXSA9PSBudWxsID8gZmFsc2UgOiBrd2FyZ3NbJ3RyYWluaW5nJ107XG4gICAgICBpbnB1dHMgPSBpbnB1dHMgYXMgVGVuc29yW107XG4gICAgICBpZiAoaW5wdXRzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBMU1RNQ2VsbCBleHBlY3RzIDMgaW5wdXQgVGVuc29ycyAoaW5wdXRzLCBoLCBjKSwgZ290IGAgK1xuICAgICAgICAgICAgYCR7aW5wdXRzLmxlbmd0aH0uYCk7XG4gICAgICB9XG4gICAgICBsZXQgaFRNaW51czEgPSBpbnB1dHNbMV07ICAgIC8vIFByZXZpb3VzIG1lbW9yeSBzdGF0ZS5cbiAgICAgIGNvbnN0IGNUTWludXMxID0gaW5wdXRzWzJdOyAgLy8gUHJldmlvdXMgY2Fycnkgc3RhdGUuXG4gICAgICBpbnB1dHMgPSBpbnB1dHNbMF07XG4gICAgICBpZiAoMCA8IHRoaXMuZHJvcG91dCAmJiB0aGlzLmRyb3BvdXQgPCAxICYmIHRoaXMuZHJvcG91dE1hc2sgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRyb3BvdXRNYXNrID0gZ2VuZXJhdGVEcm9wb3V0TWFzayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXM6ICgpID0+IHRmYy5vbmVzTGlrZShpbnB1dHMgYXMgVGVuc29yKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogdGhpcy5kcm9wb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IDQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BvdXRGdW5jOiB0aGlzLmRyb3BvdXRGdW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JbXTtcbiAgICAgIH1cbiAgICAgIGlmICgwIDwgdGhpcy5yZWN1cnJlbnREcm9wb3V0ICYmIHRoaXMucmVjdXJyZW50RHJvcG91dCA8IDEgJiZcbiAgICAgICAgICB0aGlzLnJlY3VycmVudERyb3BvdXRNYXNrID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayA9IGdlbmVyYXRlRHJvcG91dE1hc2soe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVzOiAoKSA9PiB0ZmMub25lc0xpa2UoaFRNaW51czEpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXRlOiB0aGlzLnJlY3VycmVudERyb3BvdXQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWluaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDogNCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcG91dEZ1bmM6IHRoaXMuZHJvcG91dEZ1bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIGFzIFRlbnNvcltdO1xuICAgICAgfVxuICAgICAgY29uc3QgZHBNYXNrID0gdGhpcy5kcm9wb3V0TWFzayBhcyBbVGVuc29yLCBUZW5zb3IsIFRlbnNvciwgVGVuc29yXTtcbiAgICAgIGNvbnN0IHJlY0RwTWFzayA9XG4gICAgICAgICAgdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayBhcyBbVGVuc29yLCBUZW5zb3IsIFRlbnNvciwgVGVuc29yXTtcblxuICAgICAgLy8gTm90ZTogRm9yIHN1cGVyaW9yIHBlcmZvcm1hbmNlLCBUZW5zb3JGbG93LmpzIGFsd2F5cyB1c2VzXG4gICAgICAvLyBpbXBsZW1lbnRhdGlvbiAyIHJlZ2FyZGxlc3Mgb2YgdGhlIGFjdHVhbCB2YWx1ZSBvZlxuICAgICAgLy8gY29uZmlnLmltcGxlbWVudGF0aW9uLlxuICAgICAgbGV0IGk6IFRlbnNvcjtcbiAgICAgIGxldCBmOiBUZW5zb3I7XG4gICAgICBsZXQgYzogVGVuc29yO1xuICAgICAgbGV0IG86IFRlbnNvcjtcbiAgICAgIGlmICgwIDwgdGhpcy5kcm9wb3V0ICYmIHRoaXMuZHJvcG91dCA8IDEpIHtcbiAgICAgICAgaW5wdXRzID0gdGZjLm11bChpbnB1dHMsIGRwTWFza1swXSk7XG4gICAgICB9XG4gICAgICBsZXQgeiA9IEsuZG90KGlucHV0cywgdGhpcy5rZXJuZWwucmVhZCgpKTtcbiAgICAgIGlmICgwIDwgdGhpcy5yZWN1cnJlbnREcm9wb3V0ICYmIHRoaXMucmVjdXJyZW50RHJvcG91dCA8IDEpIHtcbiAgICAgICAgaFRNaW51czEgPSB0ZmMubXVsKGhUTWludXMxLCByZWNEcE1hc2tbMF0pO1xuICAgICAgfVxuICAgICAgeiA9IHRmYy5hZGQoeiwgSy5kb3QoaFRNaW51czEsIHRoaXMucmVjdXJyZW50S2VybmVsLnJlYWQoKSkpO1xuICAgICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgICB6ID0gSy5iaWFzQWRkKHosIHRoaXMuYmlhcy5yZWFkKCkpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbejAsIHoxLCB6MiwgejNdID0gdGZjLnNwbGl0KHosIDQsIHoucmFuayAtIDEpO1xuXG4gICAgICBpID0gdGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KHowKTtcbiAgICAgIGYgPSB0aGlzLnJlY3VycmVudEFjdGl2YXRpb24uYXBwbHkoejEpO1xuICAgICAgYyA9IHRmYy5hZGQodGZjLm11bChmLCBjVE1pbnVzMSksIHRmYy5tdWwoaSwgdGhpcy5hY3RpdmF0aW9uLmFwcGx5KHoyKSkpO1xuICAgICAgbyA9IHRoaXMucmVjdXJyZW50QWN0aXZhdGlvbi5hcHBseSh6Myk7XG5cbiAgICAgIGNvbnN0IGggPSB0ZmMubXVsKG8sIHRoaXMuYWN0aXZhdGlvbi5hcHBseShjKSk7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgdXNlX2xlYXJuaW5nX3BoYXNlIGZsYWcgcHJvcGVybHkuXG4gICAgICByZXR1cm4gW2gsIGgsIGNdO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuXG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICB1bml0czogdGhpcy51bml0cyxcbiAgICAgIGFjdGl2YXRpb246IHNlcmlhbGl6ZUFjdGl2YXRpb24odGhpcy5hY3RpdmF0aW9uKSxcbiAgICAgIHJlY3VycmVudEFjdGl2YXRpb246IHNlcmlhbGl6ZUFjdGl2YXRpb24odGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uKSxcbiAgICAgIHVzZUJpYXM6IHRoaXMudXNlQmlhcyxcbiAgICAgIGtlcm5lbEluaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmtlcm5lbEluaXRpYWxpemVyKSxcbiAgICAgIHJlY3VycmVudEluaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLnJlY3VycmVudEluaXRpYWxpemVyKSxcbiAgICAgIGJpYXNJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5iaWFzSW5pdGlhbGl6ZXIpLFxuICAgICAgdW5pdEZvcmdldEJpYXM6IHRoaXMudW5pdEZvcmdldEJpYXMsXG4gICAgICBrZXJuZWxSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksXG4gICAgICByZWN1cnJlbnRSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5yZWN1cnJlbnRSZWd1bGFyaXplciksXG4gICAgICBiaWFzUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxcbiAgICAgIGFjdGl2aXR5UmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksXG4gICAgICBrZXJuZWxDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksXG4gICAgICByZWN1cnJlbnRDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMucmVjdXJyZW50Q29uc3RyYWludCksXG4gICAgICBiaWFzQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KSxcbiAgICAgIGRyb3BvdXQ6IHRoaXMuZHJvcG91dCxcbiAgICAgIHJlY3VycmVudERyb3BvdXQ6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICAgIGltcGxlbWVudGF0aW9uOiB0aGlzLmltcGxlbWVudGF0aW9uLFxuICAgIH07XG5cbiAgICByZXR1cm4gey4uLmJhc2VDb25maWcsIC4uLmNvbmZpZ307XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhMU1RNQ2VsbCk7XG5cbi8vIFBvcnRpbmcgTm90ZTogU2luY2UgdGhpcyBpcyBhIHN1cGVyc2V0IG9mIFNpbXBsZVJOTkxheWVyQ29uZmlnLCB3ZSBpbmhlcml0XG4vLyAgIGZyb20gdGhhdCBpbnRlcmZhY2UgaW5zdGVhZCBvZiByZXBlYXRpbmcgdGhlIGZpZWxkcyBoZXJlLlxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIExTVE1MYXllckFyZ3MgZXh0ZW5kcyBTaW1wbGVSTk5MYXllckFyZ3Mge1xuICAvKipcbiAgICogQWN0aXZhdGlvbiBmdW5jdGlvbiB0byB1c2UgZm9yIHRoZSByZWN1cnJlbnQgc3RlcC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gaGFyZCBzaWdtb2lkIChgaGFyZFNpZ21vaWRgKS5cbiAgICpcbiAgICogSWYgYG51bGxgLCBubyBhY3RpdmF0aW9uIGlzIGFwcGxpZWQuXG4gICAqL1xuICByZWN1cnJlbnRBY3RpdmF0aW9uPzogQWN0aXZhdGlvbklkZW50aWZpZXI7XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgYWRkIDEgdG8gdGhlIGJpYXMgb2YgdGhlIGZvcmdldCBnYXRlIGF0IGluaXRpYWxpemF0aW9uLlxuICAgKiBTZXR0aW5nIGl0IHRvIGB0cnVlYCB3aWxsIGFsc28gZm9yY2UgYGJpYXNJbml0aWFsaXplciA9ICd6ZXJvcydgLlxuICAgKiBUaGlzIGlzIHJlY29tbWVuZGVkIGluXG4gICAqIFtKb3plZm93aWN6IGV0XG4gICAqIGFsLl0oaHR0cDovL3d3dy5qbWxyLm9yZy9wcm9jZWVkaW5ncy9wYXBlcnMvdjM3L2pvemVmb3dpY3oxNS5wZGYpXG4gICAqL1xuICB1bml0Rm9yZ2V0Qmlhcz86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEltcGxlbWVudGF0aW9uIG1vZGUsIGVpdGhlciAxIG9yIDIuXG4gICAqICAgTW9kZSAxIHdpbGwgc3RydWN0dXJlIGl0cyBvcGVyYXRpb25zIGFzIGEgbGFyZ2VyIG51bWJlciBvZlxuICAgKiAgIHNtYWxsZXIgZG90IHByb2R1Y3RzIGFuZCBhZGRpdGlvbnMsIHdoZXJlYXMgbW9kZSAyIHdpbGxcbiAgICogICBiYXRjaCB0aGVtIGludG8gZmV3ZXIsIGxhcmdlciBvcGVyYXRpb25zLiBUaGVzZSBtb2RlcyB3aWxsXG4gICAqICAgaGF2ZSBkaWZmZXJlbnQgcGVyZm9ybWFuY2UgcHJvZmlsZXMgb24gZGlmZmVyZW50IGhhcmR3YXJlIGFuZFxuICAgKiAgIGZvciBkaWZmZXJlbnQgYXBwbGljYXRpb25zLlxuICAgKlxuICAgKiBOb3RlOiBGb3Igc3VwZXJpb3IgcGVyZm9ybWFuY2UsIFRlbnNvckZsb3cuanMgYWx3YXlzIHVzZXMgaW1wbGVtZW50YXRpb25cbiAgICogMiwgcmVnYXJkbGVzcyBvZiB0aGUgYWN0dWFsIHZhbHVlIG9mIHRoaXMgY29uZmlnIGZpZWxkLlxuICAgKi9cbiAgaW1wbGVtZW50YXRpb24/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBMU1RNIGV4dGVuZHMgUk5OIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTFNUTSc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IExTVE1MYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncy5pbXBsZW1lbnRhdGlvbiA9PT0gMCkge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgICdgaW1wbGVtZW50YXRpb249MGAgaGFzIGJlZW4gZGVwcmVjYXRlZCwgYW5kIG5vdyBkZWZhdWx0cyB0byAnICtcbiAgICAgICAgICAnYGltcGxlbWVudGF0aW9uPTFgLiBQbGVhc2UgdXBkYXRlIHlvdXIgbGF5ZXIgY2FsbC4nKTtcbiAgICB9XG4gICAgYXJncy5jZWxsID0gbmV3IExTVE1DZWxsKGFyZ3MpO1xuICAgIHN1cGVyKGFyZ3MgYXMgUk5OTGF5ZXJBcmdzKTtcbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgYWN0aXZpdHlSZWd1bGFyaXplci5cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jZWxsLmRyb3BvdXRNYXNrICE9IG51bGwpIHtcbiAgICAgICAgdGZjLmRpc3Bvc2UodGhpcy5jZWxsLmRyb3BvdXRNYXNrKTtcbiAgICAgICAgdGhpcy5jZWxsLmRyb3BvdXRNYXNrID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2sgIT0gbnVsbCkge1xuICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2spO1xuICAgICAgICB0aGlzLmNlbGwucmVjdXJyZW50RHJvcG91dE1hc2sgPSBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3QgbWFzayA9IGt3YXJncyA9PSBudWxsID8gbnVsbCA6IGt3YXJnc1snbWFzayddO1xuICAgICAgY29uc3QgdHJhaW5pbmcgPSBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ3RyYWluaW5nJ107XG4gICAgICBjb25zdCBpbml0aWFsU3RhdGU6IFRlbnNvcltdID1cbiAgICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuICAgICAgcmV0dXJuIHN1cGVyLmNhbGwoaW5wdXRzLCB7bWFzaywgdHJhaW5pbmcsIGluaXRpYWxTdGF0ZX0pO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBmcm9tQ29uZmlnPFQgZXh0ZW5kcyBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlQ29uc3RydWN0b3I8VD4sXG4gICAgICBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIGlmIChjb25maWdbJ2ltcGxtZW50YXRpb24nXSA9PT0gMCkge1xuICAgICAgY29uZmlnWydpbXBsZW1lbnRhdGlvbiddID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnKTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKExTVE0pO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgU3RhY2tlZFJOTkNlbGxzQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBbiBgQXJyYXlgIG9mIGBSTk5DZWxsYCBpbnN0YW5jZXMuXG4gICAqL1xuICBjZWxsczogUk5OQ2VsbFtdO1xufVxuXG5leHBvcnQgY2xhc3MgU3RhY2tlZFJOTkNlbGxzIGV4dGVuZHMgUk5OQ2VsbCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1N0YWNrZWRSTk5DZWxscyc7XG4gIHByb3RlY3RlZCBjZWxsczogUk5OQ2VsbFtdO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFN0YWNrZWRSTk5DZWxsc0FyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmNlbGxzID0gYXJncy5jZWxscztcbiAgfVxuXG4gIGdldCBzdGF0ZVNpemUoKTogbnVtYmVyW10ge1xuICAgIC8vIFN0YXRlcyBhcmUgYSBmbGF0IGxpc3QgaW4gcmV2ZXJzZSBvcmRlciBvZiB0aGUgY2VsbCBzdGFjay5cbiAgICAvLyBUaGlzIGFsbG93cyBwZXJzZXJ2aW5nIHRoZSByZXF1aXJlbWVudCBgc3RhY2suc3RhdGVzaXplWzBdID09PVxuICAgIC8vIG91dHB1dERpbWAuIEUuZy4sIHN0YXRlcyBvZiBhIDItbGF5ZXIgTFNUTSB3b3VsZCBiZSBgW2gyLCBjMiwgaDEsIGMxXWAsXG4gICAgLy8gYXNzdW1pbmcgb25lIExTVE0gaGFzIHN0YXRlcyBgW2gsIGNdYC5cbiAgICBjb25zdCBzdGF0ZVNpemU6IG51bWJlcltdID0gW107XG4gICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMuc2xpY2UoKS5yZXZlcnNlKCkpIHtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KGNlbGwuc3RhdGVTaXplKSkge1xuICAgICAgICBzdGF0ZVNpemUucHVzaCguLi5jZWxsLnN0YXRlU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZVNpemUucHVzaChjZWxsLnN0YXRlU2l6ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzdGF0ZVNpemU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaW5wdXRzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuICAgICAgbGV0IHN0YXRlcyA9IGlucHV0cy5zbGljZSgxKTtcblxuICAgICAgLy8gUmVjb3ZlciBwZXItY2VsbCBzdGF0ZXMuXG4gICAgICBjb25zdCBuZXN0ZWRTdGF0ZXM6IFRlbnNvcltdW10gPSBbXTtcbiAgICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNlbGwuc3RhdGVTaXplKSkge1xuICAgICAgICAgIG5lc3RlZFN0YXRlcy5wdXNoKHN0YXRlcy5zcGxpY2UoMCwgY2VsbC5zdGF0ZVNpemUubGVuZ3RoKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbmVzdGVkU3RhdGVzLnB1c2goc3RhdGVzLnNwbGljZSgwLCAxKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIG5lc3RlZFN0YXRlcy5yZXZlcnNlKCk7XG5cbiAgICAgIC8vIENhbGwgdGhlIGNlbGxzIGluIG9yZGVyIGFuZCBzdG9yZSB0aGUgcmV0dXJuZWQgc3RhdGVzLlxuICAgICAgY29uc3QgbmV3TmVzdGVkU3RhdGVzOiBUZW5zb3JbXVtdID0gW107XG4gICAgICBsZXQgY2FsbElucHV0czogVGVuc29yW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY2VsbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgY2VsbCA9IHRoaXMuY2VsbHNbaV07XG4gICAgICAgIHN0YXRlcyA9IG5lc3RlZFN0YXRlc1tpXTtcbiAgICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIGNvbnN0YW50cy5cbiAgICAgICAgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICBjYWxsSW5wdXRzID0gW2lucHV0c1swXV0uY29uY2F0KHN0YXRlcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2FsbElucHV0cyA9IFtjYWxsSW5wdXRzWzBdXS5jb25jYXQoc3RhdGVzKTtcbiAgICAgICAgfVxuICAgICAgICBjYWxsSW5wdXRzID0gY2VsbC5jYWxsKGNhbGxJbnB1dHMsIGt3YXJncykgYXMgVGVuc29yW107XG4gICAgICAgIG5ld05lc3RlZFN0YXRlcy5wdXNoKGNhbGxJbnB1dHMuc2xpY2UoMSkpO1xuICAgICAgfVxuXG4gICAgICAvLyBGb3JtYXQgdGhlIG5ldyBzdGF0ZXMgYXMgYSBmbGF0IGxpc3QgaW4gcmV2ZXJzZSBjZWxsIG9yZGVyLlxuICAgICAgc3RhdGVzID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNlbGxTdGF0ZXMgb2YgbmV3TmVzdGVkU3RhdGVzLnNsaWNlKCkucmV2ZXJzZSgpKSB7XG4gICAgICAgIHN0YXRlcy5wdXNoKC4uLmNlbGxTdGF0ZXMpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtjYWxsSW5wdXRzWzBdXS5jb25jYXQoc3RhdGVzKTtcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaWYgKGlzQXJyYXlPZlNoYXBlcyhpbnB1dFNoYXBlKSkge1xuICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIGlucHV0IGNvbnN0YW50cy5cbiAgICAgIC8vIGNvbnN0IGNvbnN0YW50U2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKDEpO1xuICAgICAgaW5wdXRTaGFwZSA9IChpbnB1dFNoYXBlIGFzIFNoYXBlW10pWzBdO1xuICAgIH1cbiAgICBpbnB1dFNoYXBlID0gaW5wdXRTaGFwZSBhcyBTaGFwZTtcbiAgICBsZXQgb3V0cHV0RGltOiBudW1iZXI7XG4gICAgdGhpcy5jZWxscy5mb3JFYWNoKChjZWxsLCBpKSA9PiB7XG4gICAgICBuYW1lU2NvcGUoYFJOTkNlbGxfJHtpfWAsICgpID0+IHtcbiAgICAgICAgLy8gVE9ETyhjYWlzKTogVGFrZSBjYXJlIG9mIGlucHV0IGNvbnN0YW50cy5cblxuICAgICAgICBjZWxsLmJ1aWxkKGlucHV0U2hhcGUpO1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjZWxsLnN0YXRlU2l6ZSkpIHtcbiAgICAgICAgICBvdXRwdXREaW0gPSBjZWxsLnN0YXRlU2l6ZVswXTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBvdXRwdXREaW0gPSBjZWxsLnN0YXRlU2l6ZTtcbiAgICAgICAgfVxuICAgICAgICBpbnB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF0sIG91dHB1dERpbV0gYXMgU2hhcGU7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcblxuICAgIGNvbnN0IGdldENlbGxDb25maWcgPSAoY2VsbDogUk5OQ2VsbCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgJ2NsYXNzTmFtZSc6IGNlbGwuZ2V0Q2xhc3NOYW1lKCksXG4gICAgICAgICdjb25maWcnOiBjZWxsLmdldENvbmZpZygpLFxuICAgICAgfTtcbiAgICB9O1xuXG4gICAgY29uc3QgY2VsbENvbmZpZ3MgPSB0aGlzLmNlbGxzLm1hcChnZXRDZWxsQ29uZmlnKTtcblxuICAgIGNvbnN0IGNvbmZpZyA9IHsnY2VsbHMnOiBjZWxsQ29uZmlnc307XG5cbiAgICByZXR1cm4gey4uLmJhc2VDb25maWcsIC4uLmNvbmZpZ307XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPixcbiAgICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgY3VzdG9tT2JqZWN0cyA9IHt9IGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIGNvbnN0IGNlbGxzOiBSTk5DZWxsW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNlbGxDb25maWcgb2YgKGNvbmZpZ1snY2VsbHMnXSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3RbXSkpIHtcbiAgICAgIGNlbGxzLnB1c2goZGVzZXJpYWxpemUoY2VsbENvbmZpZywgY3VzdG9tT2JqZWN0cykgYXMgUk5OQ2VsbCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgY2xzKHtjZWxsc30pO1xuICB9XG5cbiAgZ2V0IHRyYWluYWJsZVdlaWdodHMoKTogTGF5ZXJWYXJpYWJsZVtdIHtcbiAgICBpZiAoIXRoaXMudHJhaW5hYmxlKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICB3ZWlnaHRzLnB1c2goLi4uY2VsbC50cmFpbmFibGVXZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodHM7XG4gIH1cblxuICBnZXQgbm9uVHJhaW5hYmxlV2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIGNvbnN0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICB3ZWlnaHRzLnB1c2goLi4uY2VsbC5ub25UcmFpbmFibGVXZWlnaHRzKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnRyYWluYWJsZSkge1xuICAgICAgY29uc3QgdHJhaW5hYmxlV2VpZ2h0czogTGF5ZXJWYXJpYWJsZVtdID0gW107XG4gICAgICBmb3IgKGNvbnN0IGNlbGwgb2YgdGhpcy5jZWxscykge1xuICAgICAgICB0cmFpbmFibGVXZWlnaHRzLnB1c2goLi4uY2VsbC50cmFpbmFibGVXZWlnaHRzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cmFpbmFibGVXZWlnaHRzLmNvbmNhdCh3ZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIHdlaWdodHM7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmUgdGhlIHdlaWdodHMgb2YgYSB0aGUgbW9kZWwuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgZmxhdCBgQXJyYXlgIG9mIGB0Zi5UZW5zb3Jgcy5cbiAgICovXG4gIGdldFdlaWdodHMoKTogVGVuc29yW10ge1xuICAgIGNvbnN0IHdlaWdodHM6IExheWVyVmFyaWFibGVbXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2VsbCBvZiB0aGlzLmNlbGxzKSB7XG4gICAgICB3ZWlnaHRzLnB1c2goLi4uY2VsbC53ZWlnaHRzKTtcbiAgICB9XG4gICAgcmV0dXJuIGJhdGNoR2V0VmFsdWUod2VpZ2h0cyk7XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSB3ZWlnaHRzIG9mIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQHBhcmFtIHdlaWdodHMgQW4gYEFycmF5YCBvZiBgdGYuVGVuc29yYHMgd2l0aCBzaGFwZXMgYW5kIHR5cGVzIG1hdGNoaW5nXG4gICAqICAgICB0aGUgb3V0cHV0IG9mIGBnZXRXZWlnaHRzKClgLlxuICAgKi9cbiAgc2V0V2VpZ2h0cyh3ZWlnaHRzOiBUZW5zb3JbXSk6IHZvaWQge1xuICAgIGNvbnN0IHR1cGxlczogQXJyYXk8W0xheWVyVmFyaWFibGUsIFRlbnNvcl0+ID0gW107XG4gICAgZm9yIChjb25zdCBjZWxsIG9mIHRoaXMuY2VsbHMpIHtcbiAgICAgIGNvbnN0IG51bVBhcmFtcyA9IGNlbGwud2VpZ2h0cy5sZW5ndGg7XG4gICAgICBjb25zdCBpbnB1dFdlaWdodHMgPSB3ZWlnaHRzLnNwbGljZShudW1QYXJhbXMpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjZWxsLndlaWdodHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdHVwbGVzLnB1c2goW2NlbGwud2VpZ2h0c1tpXSwgaW5wdXRXZWlnaHRzW2ldXSk7XG4gICAgICB9XG4gICAgfVxuICAgIGJhdGNoU2V0VmFsdWUodHVwbGVzKTtcbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IE1heWJlIGltcGxlbW50IGBsb3NzZXNgIGFuZCBgZ2V0TG9zc2VzRm9yYC5cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhTdGFja2VkUk5OQ2VsbHMpO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2VuZXJhdGVEcm9wb3V0TWFzayhhcmdzOiB7XG4gIG9uZXM6ICgpID0+IHRmYy5UZW5zb3IsXG4gIHJhdGU6IG51bWJlcixcbiAgdHJhaW5pbmc/OiBib29sZWFuLFxuICBjb3VudD86IG51bWJlcixcbiAgZHJvcG91dEZ1bmM/OiBGdW5jdGlvbixcbn0pOiB0ZmMuVGVuc29yfHRmYy5UZW5zb3JbXSB7XG4gIGNvbnN0IHtvbmVzLCByYXRlLCB0cmFpbmluZyA9IGZhbHNlLCBjb3VudCA9IDEsIGRyb3BvdXRGdW5jfSA9IGFyZ3M7XG5cbiAgY29uc3QgZHJvcHBlZElucHV0cyA9ICgpID0+XG4gICAgICBkcm9wb3V0RnVuYyAhPSBudWxsID8gZHJvcG91dEZ1bmMob25lcygpLCByYXRlKSA6IEsuZHJvcG91dChvbmVzKCksIHJhdGUpO1xuXG4gIGNvbnN0IGNyZWF0ZU1hc2sgPSAoKSA9PiBLLmluVHJhaW5QaGFzZShkcm9wcGVkSW5wdXRzLCBvbmVzLCB0cmFpbmluZyk7XG5cbiAgLy8ganVzdCBpbiBjYXNlIGNvdW50IGlzIHByb3ZpZGVkIHdpdGggbnVsbCBvciB1bmRlZmluZWRcbiAgaWYgKCFjb3VudCB8fCBjb3VudCA8PSAxKSB7XG4gICAgcmV0dXJuIHRmYy5rZWVwKGNyZWF0ZU1hc2soKS5jbG9uZSgpKTtcbiAgfVxuXG4gIGNvbnN0IG1hc2tzID0gQXJyYXkoY291bnQpLmZpbGwodW5kZWZpbmVkKS5tYXAoY3JlYXRlTWFzayk7XG5cbiAgcmV0dXJuIG1hc2tzLm1hcChtID0+IHRmYy5rZWVwKG0uY2xvbmUoKSkpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nvar __rest = (this && this.__rest) || function (s, e) {\n    var t = {};\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n        t[p] = s[p];\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n                t[p[i]] = s[p[i]];\n        }\n    return t;\n};\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { util } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { checkDataFormat, checkPaddingMode } from '../common';\nimport { InputSpec } from '../engine/topology';\nimport { AttributeError, NotImplementedError, ValueError } from '../errors';\nimport { Initializer } from '../initializers';\nimport { convOutputLength, normalizeArray } from '../utils/conv_utils';\nimport { assertPositiveInteger } from '../utils/generic_utils';\nimport { getExactlyOneShape } from '../utils/types_utils';\nimport { generateDropoutMask, LSTMCell, RNN, RNNCell } from './recurrent';\nclass ConvRNN2DCell extends RNNCell {\n}\n/**\n * Base class for convolutional-recurrent layers.\n */\nclass ConvRNN2D extends RNN {\n    constructor(args) {\n        if (args.unroll) {\n            throw new NotImplementedError('Unrolling is not possible with convolutional RNNs.');\n        }\n        if (Array.isArray(args.cell)) {\n            throw new NotImplementedError('It is not possible at the moment to stack convolutional cells.');\n        }\n        super(args);\n        this.inputSpec = [new InputSpec({ ndim: 5 })];\n    }\n    call(inputs, kwargs) {\n        return tfc.tidy(() => {\n            if (this.cell.dropoutMask != null) {\n                tfc.dispose(this.cell.dropoutMask);\n                this.cell.dropoutMask = null;\n            }\n            if (this.cell.recurrentDropoutMask != null) {\n                tfc.dispose(this.cell.recurrentDropoutMask);\n                this.cell.recurrentDropoutMask = null;\n            }\n            if (kwargs && kwargs['constants']) {\n                throw new ValueError('ConvRNN2D cell does not support constants');\n            }\n            const mask = kwargs == null ? null : kwargs['mask'];\n            const training = kwargs == null ? null : kwargs['training'];\n            const initialState = kwargs == null ? null : kwargs['initialState'];\n            return super.call(inputs, { mask, training, initialState });\n        });\n    }\n    computeOutputShape(inputShape) {\n        let outShape = this.computeSingleOutputShape(inputShape);\n        if (!this.returnSequences) {\n            outShape = [outShape[0], ...outShape.slice(2)];\n        }\n        if (this.returnState) {\n            outShape =\n                [outShape, ...Array(2).fill([inputShape[0], ...outShape.slice(-3)])];\n        }\n        return outShape;\n    }\n    getInitialState(inputs) {\n        return tfc.tidy(() => {\n            const { stateSize } = this.cell;\n            const inputShape = inputs.shape;\n            const outputShape = this.computeSingleOutputShape(inputShape);\n            const stateShape = [outputShape[0], ...outputShape.slice(2)];\n            const initialState = tfc.zeros(stateShape);\n            if (Array.isArray(stateSize)) {\n                return Array(stateSize.length).fill(initialState);\n            }\n            return [initialState];\n        });\n    }\n    resetStates(states, training = false) {\n        tfc.tidy(() => {\n            if (!this.stateful) {\n                throw new AttributeError('Cannot call resetStates() on an RNN Layer that is not stateful.');\n            }\n            const inputShape = this.inputSpec[0].shape;\n            const outputShape = this.computeSingleOutputShape(inputShape);\n            const stateShape = [outputShape[0], ...outputShape.slice(2)];\n            const batchSize = inputShape[0];\n            if (batchSize == null) {\n                throw new ValueError('If an RNN is stateful, it needs to know its batch size. Specify ' +\n                    'the batch size of your input tensors: \\n' +\n                    '- If using a Sequential model, specify the batch size by ' +\n                    'passing a `batchInputShape` option to your first layer.\\n' +\n                    '- If using the functional API, specify the batch size by ' +\n                    'passing a `batchShape` option to your Input layer.');\n            }\n            // Initialize state if null.\n            if (this.getStates() == null) {\n                if (Array.isArray(this.cell.stateSize)) {\n                    this.states_ = this.cell.stateSize.map(() => tfc.zeros(stateShape));\n                }\n                else {\n                    this.states_ = [tfc.zeros(stateShape)];\n                }\n            }\n            else if (states == null) {\n                // Dispose old state tensors.\n                tfc.dispose(this.states_);\n                // For stateful RNNs, fully dispose kept old states.\n                if (this.keptStates != null) {\n                    tfc.dispose(this.keptStates);\n                    this.keptStates = [];\n                }\n                if (Array.isArray(this.cell.stateSize)) {\n                    this.states_ = this.cell.stateSize.map(() => tfc.zeros(stateShape));\n                }\n                else {\n                    this.states_[0] = tfc.zeros(stateShape);\n                }\n            }\n            else {\n                if (!Array.isArray(states)) {\n                    states = [states];\n                }\n                if (states.length !== this.states_.length) {\n                    throw new ValueError(`Layer ${this.name} expects ${this.states_.length} state(s), ` +\n                        `but it received ${states.length} state value(s). Input ` +\n                        `received: ${states}`);\n                }\n                if (training) {\n                    // Store old state tensors for complete disposal later, i.e., during\n                    // the next no-arg call to this method. We do not dispose the old\n                    // states immediately because that BPTT (among other things) require\n                    // them.\n                    this.keptStates.push(this.states_.slice());\n                }\n                else {\n                    tfc.dispose(this.states_);\n                }\n                for (let index = 0; index < this.states_.length; ++index) {\n                    const value = states[index];\n                    const expectedShape = stateShape;\n                    if (!util.arraysEqual(value.shape, expectedShape)) {\n                        throw new ValueError(`State ${index} is incompatible with layer ${this.name}: ` +\n                            `expected shape=${expectedShape}, received shape=${value.shape}`);\n                    }\n                    this.states_[index] = value;\n                }\n            }\n            this.states_ = this.states_.map(state => tfc.keep(state.clone()));\n        });\n    }\n    computeSingleOutputShape(inputShape) {\n        const { dataFormat, filters, kernelSize, padding, strides, dilationRate } = this.cell;\n        const isChannelsFirst = dataFormat === 'channelsFirst';\n        const h = inputShape[isChannelsFirst ? 3 : 2];\n        const w = inputShape[isChannelsFirst ? 4 : 3];\n        const hOut = convOutputLength(h, kernelSize[0], padding, strides[0], dilationRate[0]);\n        const wOut = convOutputLength(w, kernelSize[1], padding, strides[1], dilationRate[1]);\n        const outShape = [\n            ...inputShape.slice(0, 2),\n            ...(isChannelsFirst ? [filters, hOut, wOut] : [hOut, wOut, filters])\n        ];\n        return outShape;\n    }\n}\n/** @nocollapse */\nConvRNN2D.className = 'ConvRNN2D';\nexport class ConvLSTM2DCell extends LSTMCell {\n    constructor(args) {\n        const { filters, kernelSize, strides, padding, dataFormat, dilationRate, } = args;\n        super(Object.assign({}, args, { units: filters }));\n        this.filters = filters;\n        assertPositiveInteger(this.filters, 'filters');\n        this.kernelSize = normalizeArray(kernelSize, 2, 'kernelSize');\n        this.kernelSize.forEach(size => assertPositiveInteger(size, 'kernelSize'));\n        this.strides = normalizeArray(strides || 1, 2, 'strides');\n        this.strides.forEach(stride => assertPositiveInteger(stride, 'strides'));\n        this.padding = padding || 'valid';\n        checkPaddingMode(this.padding);\n        this.dataFormat = dataFormat || 'channelsLast';\n        checkDataFormat(this.dataFormat);\n        this.dilationRate = normalizeArray(dilationRate || 1, 2, 'dilationRate');\n        this.dilationRate.forEach(rate => assertPositiveInteger(rate, 'dilationRate'));\n    }\n    build(inputShape) {\n        var _a;\n        inputShape = getExactlyOneShape(inputShape);\n        const channelAxis = this.dataFormat === 'channelsFirst' ? 1 : inputShape.length - 1;\n        if (inputShape[channelAxis] == null) {\n            throw new ValueError(`The channel dimension of the input should be defined. ` +\n                `Found ${inputShape[channelAxis]}`);\n        }\n        const inputDim = inputShape[channelAxis];\n        const numOfKernels = 4;\n        const kernelShape = this.kernelSize.concat([inputDim, this.filters * numOfKernels]);\n        this.kernel = this.addWeight('kernel', kernelShape, null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n        const recurrentKernelShape = this.kernelSize.concat([this.filters, this.filters * numOfKernels]);\n        this.recurrentKernel = this.addWeight('recurrent_kernel', recurrentKernelShape, null, this.recurrentInitializer, this.recurrentRegularizer, true, this.recurrentConstraint);\n        if (this.useBias) {\n            let biasInitializer;\n            if (this.unitForgetBias) {\n                const init = this.biasInitializer;\n                const filters = this.filters;\n                biasInitializer = new (_a = class CustomInit extends Initializer {\n                        apply(shape, dtype) {\n                            const biasI = init.apply([filters]);\n                            const biasF = tfc.ones([filters]);\n                            const biasCAndO = init.apply([filters * 2]);\n                            return K.concatenate([biasI, biasF, biasCAndO]);\n                        }\n                    },\n                    /** @nocollapse */\n                    _a.className = 'CustomInit',\n                    _a)();\n            }\n            else {\n                biasInitializer = this.biasInitializer;\n            }\n            this.bias = this.addWeight('bias', [this.filters * numOfKernels], null, biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n        }\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tfc.tidy(() => {\n            if (inputs.length !== 3) {\n                throw new ValueError(`ConvLSTM2DCell expects 3 input Tensors (inputs, h, c), got ` +\n                    `${inputs.length}.`);\n            }\n            const training = kwargs['training'] || false;\n            const x = inputs[0]; // Current input\n            const hTMinus1 = inputs[1]; // Previous memory state.\n            const cTMinus1 = inputs[2]; // Previous carry state.\n            const numOfKernels = 4;\n            if (0 < this.dropout && this.dropout < 1 && this.dropoutMask == null) {\n                this.dropoutMask = generateDropoutMask({\n                    ones: () => tfc.onesLike(x),\n                    rate: this.dropout,\n                    training,\n                    count: numOfKernels,\n                    dropoutFunc: this.dropoutFunc\n                });\n            }\n            const dropoutMask = this.dropoutMask;\n            const applyDropout = (x, mask, index) => {\n                if (!mask || !mask[index]) {\n                    return x;\n                }\n                return tfc.mul(mask[index], x);\n            };\n            let xI = applyDropout(x, dropoutMask, 0);\n            let xF = applyDropout(x, dropoutMask, 1);\n            let xC = applyDropout(x, dropoutMask, 2);\n            let xO = applyDropout(x, dropoutMask, 3);\n            if (0 < this.recurrentDropout && this.recurrentDropout < 1 &&\n                this.recurrentDropoutMask == null) {\n                this.recurrentDropoutMask = generateDropoutMask({\n                    ones: () => tfc.onesLike(hTMinus1),\n                    rate: this.recurrentDropout,\n                    training,\n                    count: numOfKernels,\n                    dropoutFunc: this.dropoutFunc\n                });\n            }\n            const recDropoutMask = this.recurrentDropoutMask;\n            let hI = applyDropout(hTMinus1, recDropoutMask, 0);\n            let hF = applyDropout(hTMinus1, recDropoutMask, 1);\n            let hC = applyDropout(hTMinus1, recDropoutMask, 2);\n            let hO = applyDropout(hTMinus1, recDropoutMask, 3);\n            const kernelChannelAxis = 3;\n            const [kernelI, kernelF, kernelC, kernelO] = tfc.split(this.kernel.read(), numOfKernels, kernelChannelAxis);\n            const [biasI, biasF, biasC, biasO] = this.useBias ?\n                tfc.split(this.bias.read(), numOfKernels) :\n                [null, null, null, null];\n            xI = this.inputConv(xI, kernelI, biasI, this.padding);\n            xF = this.inputConv(xF, kernelF, biasF, this.padding);\n            xC = this.inputConv(xC, kernelC, biasC, this.padding);\n            xO = this.inputConv(xO, kernelO, biasO, this.padding);\n            const [recKernelI, recKernelF, recKernelC, recKernelO] = tfc.split(this.recurrentKernel.read(), numOfKernels, kernelChannelAxis);\n            hI = this.recurrentConv(hI, recKernelI);\n            hF = this.recurrentConv(hF, recKernelF);\n            hC = this.recurrentConv(hC, recKernelC);\n            hO = this.recurrentConv(hO, recKernelO);\n            const i = this.recurrentActivation.apply(tfc.add(xI, hI));\n            const f = this.recurrentActivation.apply(tfc.add(xF, hF));\n            const c = tfc.add(tfc.mul(f, cTMinus1), tfc.mul(i, this.activation.apply(tfc.add(xC, hC))));\n            const h = tfc.mul(this.recurrentActivation.apply(tfc.add(xO, hO)), this.activation.apply(c));\n            return [h, h, c];\n        });\n    }\n    getConfig() {\n        const _a = super.getConfig(), { 'units': _ } = _a, baseConfig = __rest(_a, ['units']);\n        const config = {\n            filters: this.filters,\n            kernelSize: this.kernelSize,\n            padding: this.padding,\n            dataFormat: this.dataFormat,\n            dilationRate: this.dilationRate,\n            strides: this.strides,\n        };\n        return Object.assign({}, baseConfig, config);\n    }\n    inputConv(x, w, b, padding) {\n        const out = tfc.conv2d(x, w, this.strides, (padding || 'valid'), this.dataFormat === 'channelsFirst' ? 'NCHW' : 'NHWC', this.dilationRate);\n        if (b) {\n            return K.biasAdd(out, b, this.dataFormat);\n        }\n        return out;\n    }\n    recurrentConv(x, w) {\n        const strides = 1;\n        return tfc.conv2d(x, w, strides, 'same', this.dataFormat === 'channelsFirst' ? 'NCHW' : 'NHWC');\n    }\n}\n/** @nocollapse */\nConvLSTM2DCell.className = 'ConvLSTM2DCell';\ntfc.serialization.registerClass(ConvLSTM2DCell);\nexport class ConvLSTM2D extends ConvRNN2D {\n    constructor(args) {\n        const cell = new ConvLSTM2DCell(args);\n        super(Object.assign({}, args, { cell }));\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        return new cls(config);\n    }\n}\n/** @nocollapse */\nConvLSTM2D.className = 'ConvLSTM2D';\ntfc.serialization.registerClass(ConvLSTM2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb25hbF9yZWN1cnJlbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL2NvbnZvbHV0aW9uYWxfcmVjdXJyZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHOzs7Ozs7Ozs7Ozs7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBUyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxlQUFlLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFNUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxjQUFjLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzFFLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUk1QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsY0FBYyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFeEQsT0FBTyxFQUFtQixtQkFBbUIsRUFBRSxRQUFRLEVBQW9DLEdBQUcsRUFBRSxPQUFPLEVBQXVDLE1BQU0sYUFBYSxDQUFDO0FBc0RsSyxNQUFlLGFBQWMsU0FBUSxPQUFPO0NBeUIzQztBQUtEOztHQUVHO0FBQ0gsTUFBTSxTQUFVLFNBQVEsR0FBRztJQU16QixZQUFZLElBQXdCO1FBQ2xDLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNmLE1BQU0sSUFBSSxtQkFBbUIsQ0FDekIsb0RBQW9ELENBQUMsQ0FB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QUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7O0FBZEQsa0JBQWtCO0FBQ1gsb0JBQVMsR0FBRyxZQUFZLENBQUM7QUFnQmxDLEdBQUcsQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge1RlbnNvciwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBY3RpdmF0aW9ufSBmcm9tICcuLi9hY3RpdmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBLIGZyb20gJy4uL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7Y2hlY2tEYXRhRm9ybWF0LCBjaGVja1BhZGRpbmdNb2RlfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtDb25zdHJhaW50fSBmcm9tICcuLi9jb25zdHJhaW50cyc7XG5pbXBvcnQge0lucHV0U3BlY30gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7QXR0cmlidXRlRXJyb3IsIE5vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge0luaXRpYWxpemVyfSBmcm9tICcuLi9pbml0aWFsaXplcnMnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBEYXRhVHlwZSwgUGFkZGluZ01vZGUsIFNoYXBlfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7UmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtjb252T3V0cHV0TGVuZ3RoLCBub3JtYWxpemVBcnJheX0gZnJvbSAnLi4vdXRpbHMvY29udl91dGlscyc7XG5pbXBvcnQge2Fzc2VydFBvc2l0aXZlSW50ZWdlcn0gZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZX0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuXG5pbXBvcnQge0Jhc2VSTk5MYXllckFyZ3MsIGdlbmVyYXRlRHJvcG91dE1hc2ssIExTVE1DZWxsLCBMU1RNQ2VsbExheWVyQXJncywgTFNUTUxheWVyQXJncywgUk5OLCBSTk5DZWxsLCBSTk5MYXllckFyZ3MsIFNpbXBsZVJOTkNlbGxMYXllckFyZ3N9IGZyb20gJy4vcmVjdXJyZW50JztcblxuZGVjbGFyZSBpbnRlcmZhY2UgQ29udlJOTjJEQ2VsbEFyZ3MgZXh0ZW5kc1xuICAgIE9taXQ8U2ltcGxlUk5OQ2VsbExheWVyQXJncywgJ3VuaXRzJz4ge1xuICAvKipcbiAgICogVGhlIGRpbWVuc2lvbmFsaXR5IG9mIHRoZSBvdXRwdXQgc3BhY2UgKGkuZS4gdGhlIG51bWJlciBvZiBmaWx0ZXJzIGluIHRoZVxuICAgKiBjb252b2x1dGlvbikuXG4gICAqL1xuICBmaWx0ZXJzOiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBjb252b2x1dGlvbiB3aW5kb3cuIElmIGtlcm5lbFNpemUgaXMgYSBudW1iZXIsIHRoZVxuICAgKiBjb252b2x1dGlvbmFsIHdpbmRvdyB3aWxsIGJlIHNxdWFyZS5cbiAgICovXG4gIGtlcm5lbFNpemU6IG51bWJlcnxudW1iZXJbXTtcblxuICAvKipcbiAgICogVGhlIHN0cmlkZXMgb2YgdGhlIGNvbnZvbHV0aW9uIGluIGVhY2ggZGltZW5zaW9uLiBJZiBzdHJpZGVzIGlzIGEgbnVtYmVyLFxuICAgKiBzdHJpZGVzIGluIGJvdGggZGltZW5zaW9ucyBhcmUgZXF1YWwuXG4gICAqXG4gICAqIFNwZWNpZnlpbmcgYW55IHN0cmlkZSB2YWx1ZSAhPSAxIGlzIGluY29tcGF0aWJsZSB3aXRoIHNwZWNpZnlpbmcgYW55XG4gICAqIGBkaWxhdGlvblJhdGVgIHZhbHVlICE9IDEuXG4gICAqL1xuICBzdHJpZGVzPzogbnVtYmVyfG51bWJlcltdO1xuXG4gIC8qKlxuICAgKiBQYWRkaW5nIG1vZGUuXG4gICAqL1xuICBwYWRkaW5nPzogUGFkZGluZ01vZGU7XG5cbiAgLyoqXG4gICAqIEZvcm1hdCBvZiB0aGUgZGF0YSwgd2hpY2ggZGV0ZXJtaW5lcyB0aGUgb3JkZXJpbmcgb2YgdGhlIGRpbWVuc2lvbnMgaW5cbiAgICogdGhlIGlucHV0cy5cbiAgICpcbiAgICogYGNoYW5uZWxzX2xhc3RgIGNvcnJlc3BvbmRzIHRvIGlucHV0cyB3aXRoIHNoYXBlXG4gICAqICAgYChiYXRjaCwgLi4uLCBjaGFubmVscylgXG4gICAqXG4gICAqICBgY2hhbm5lbHNfZmlyc3RgIGNvcnJlc3BvbmRzIHRvIGlucHV0cyB3aXRoIHNoYXBlIGAoYmF0Y2gsIGNoYW5uZWxzLFxuICAgKiAuLi4pYC5cbiAgICpcbiAgICogRGVmYXVsdHMgdG8gYGNoYW5uZWxzX2xhc3RgLlxuICAgKi9cbiAgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQ7XG5cbiAgLyoqXG4gICAqIFRoZSBkaWxhdGlvbiByYXRlIHRvIHVzZSBmb3IgdGhlIGRpbGF0ZWQgY29udm9sdXRpb24gaW4gZWFjaCBkaW1lbnNpb24uXG4gICAqIFNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGFycmF5IG9mIHR3byBvciB0aHJlZSBpbnRlZ2Vycy5cbiAgICpcbiAgICogQ3VycmVudGx5LCBzcGVjaWZ5aW5nIGFueSBgZGlsYXRpb25SYXRlYCB2YWx1ZSAhPSAxIGlzIGluY29tcGF0aWJsZSB3aXRoXG4gICAqIHNwZWNpZnlpbmcgYW55IGBzdHJpZGVzYCB2YWx1ZSAhPSAxLlxuICAgKi9cbiAgZGlsYXRpb25SYXRlPzogbnVtYmVyfFtudW1iZXJdfFtudW1iZXIsIG51bWJlcl07XG59XG5cbmFic3RyYWN0IGNsYXNzIENvbnZSTk4yRENlbGwgZXh0ZW5kcyBSTk5DZWxsIHtcbiAgcmVhZG9ubHkgZmlsdGVyczogbnVtYmVyO1xuICByZWFkb25seSBrZXJuZWxTaXplOiBudW1iZXJbXTtcbiAgcmVhZG9ubHkgc3RyaWRlczogbnVtYmVyW107XG4gIHJlYWRvbmx5IHBhZGRpbmc6IFBhZGRpbmdNb2RlO1xuICByZWFkb25seSBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0O1xuICByZWFkb25seSBkaWxhdGlvblJhdGU6IG51bWJlcltdO1xuXG4gIHJlYWRvbmx5IGFjdGl2YXRpb246IEFjdGl2YXRpb247XG4gIHJlYWRvbmx5IHVzZUJpYXM6IGJvb2xlYW47XG5cbiAgcmVhZG9ubHkga2VybmVsSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICByZWFkb25seSByZWN1cnJlbnRJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHJlYWRvbmx5IGJpYXNJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG5cbiAgcmVhZG9ubHkga2VybmVsQ29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcmVhZG9ubHkgcmVjdXJyZW50Q29uc3RyYWludDogQ29uc3RyYWludDtcbiAgcmVhZG9ubHkgYmlhc0NvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG5cbiAgcmVhZG9ubHkga2VybmVsUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuICByZWFkb25seSByZWN1cnJlbnRSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHJlYWRvbmx5IGJpYXNSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG5cbiAgcmVhZG9ubHkgZHJvcG91dDogbnVtYmVyO1xuICByZWFkb25seSByZWN1cnJlbnREcm9wb3V0OiBudW1iZXI7XG59XG5cbmRlY2xhcmUgaW50ZXJmYWNlIENvbnZSTk4yRExheWVyQXJncyBleHRlbmRzIEJhc2VSTk5MYXllckFyZ3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252Uk5OMkRDZWxsQXJncyB7fVxuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIGNvbnZvbHV0aW9uYWwtcmVjdXJyZW50IGxheWVycy5cbiAqL1xuY2xhc3MgQ29udlJOTjJEIGV4dGVuZHMgUk5OIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udlJOTjJEJztcblxuICByZWFkb25seSBjZWxsOiBDb252Uk5OMkRDZWxsO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IENvbnZSTk4yRExheWVyQXJncykge1xuICAgIGlmIChhcmdzLnVucm9sbCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ1Vucm9sbGluZyBpcyBub3QgcG9zc2libGUgd2l0aCBjb252b2x1dGlvbmFsIFJOTnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYXJncy5jZWxsKSkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ0l0IGlzIG5vdCBwb3NzaWJsZSBhdCB0aGUgbW9tZW50IHRvIHN0YWNrIGNvbnZvbHV0aW9uYWwgY2VsbHMuJyk7XG4gICAgfVxuXG4gICAgc3VwZXIoYXJncyBhcyBSTk5MYXllckFyZ3MpO1xuXG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbbmV3IElucHV0U3BlYyh7bmRpbTogNX0pXTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMuY2VsbC5kcm9wb3V0TWFzayAhPSBudWxsKSB7XG4gICAgICAgIHRmYy5kaXNwb3NlKHRoaXMuY2VsbC5kcm9wb3V0TWFzayk7XG5cbiAgICAgICAgdGhpcy5jZWxsLmRyb3BvdXRNYXNrID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayAhPSBudWxsKSB7XG4gICAgICAgIHRmYy5kaXNwb3NlKHRoaXMuY2VsbC5yZWN1cnJlbnREcm9wb3V0TWFzayk7XG5cbiAgICAgICAgdGhpcy5jZWxsLnJlY3VycmVudERyb3BvdXRNYXNrID0gbnVsbDtcbiAgICAgIH1cblxuICAgICAgaWYgKGt3YXJncyAmJiBrd2FyZ3NbJ2NvbnN0YW50cyddKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdDb252Uk5OMkQgY2VsbCBkb2VzIG5vdCBzdXBwb3J0IGNvbnN0YW50cycpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBtYXNrID0ga3dhcmdzID09IG51bGwgPyBudWxsIDoga3dhcmdzWydtYXNrJ107XG5cbiAgICAgIGNvbnN0IHRyYWluaW5nID0ga3dhcmdzID09IG51bGwgPyBudWxsIDoga3dhcmdzWyd0cmFpbmluZyddO1xuXG4gICAgICBjb25zdCBpbml0aWFsU3RhdGU6IFRlbnNvcltdID1cbiAgICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuXG4gICAgICByZXR1cm4gc3VwZXIuY2FsbChpbnB1dHMsIHttYXNrLCB0cmFpbmluZywgaW5pdGlhbFN0YXRlfSk7XG4gICAgfSk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGUpOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBsZXQgb3V0U2hhcGU6IFNoYXBlID0gdGhpcy5jb21wdXRlU2luZ2xlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICBpZiAoIXRoaXMucmV0dXJuU2VxdWVuY2VzKSB7XG4gICAgICBvdXRTaGFwZSA9IFtvdXRTaGFwZVswXSwgLi4ub3V0U2hhcGUuc2xpY2UoMildO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJldHVyblN0YXRlKSB7XG4gICAgICBvdXRTaGFwZSA9XG4gICAgICAgICAgW291dFNoYXBlLCAuLi5BcnJheSgyKS5maWxsKFtpbnB1dFNoYXBlWzBdLCAuLi5vdXRTaGFwZS5zbGljZSgtMyldKV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dFNoYXBlO1xuICB9XG5cbiAgZ2V0SW5pdGlhbFN0YXRlKGlucHV0czogdGZjLlRlbnNvcik6IHRmYy5UZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHtzdGF0ZVNpemV9ID0gdGhpcy5jZWxsO1xuXG4gICAgICBjb25zdCBpbnB1dFNoYXBlID0gaW5wdXRzLnNoYXBlO1xuXG4gICAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHRoaXMuY29tcHV0ZVNpbmdsZU91dHB1dFNoYXBlKGlucHV0U2hhcGUpO1xuXG4gICAgICBjb25zdCBzdGF0ZVNoYXBlID0gW291dHB1dFNoYXBlWzBdLCAuLi5vdXRwdXRTaGFwZS5zbGljZSgyKV07XG5cbiAgICAgIGNvbnN0IGluaXRpYWxTdGF0ZSA9IHRmYy56ZXJvcyhzdGF0ZVNoYXBlKTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RhdGVTaXplKSkge1xuICAgICAgICByZXR1cm4gQXJyYXkoc3RhdGVTaXplLmxlbmd0aCkuZmlsbChpbml0aWFsU3RhdGUpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gW2luaXRpYWxTdGF0ZV07XG4gICAgfSk7XG4gIH1cblxuICByZXNldFN0YXRlcyhzdGF0ZXM/OiBUZW5zb3J8VGVuc29yW10sIHRyYWluaW5nID0gZmFsc2UpOiB2b2lkIHtcbiAgICB0ZmMudGlkeSgoKSA9PiB7XG4gICAgICBpZiAoIXRoaXMuc3RhdGVmdWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEF0dHJpYnV0ZUVycm9yKFxuICAgICAgICAgICAgJ0Nhbm5vdCBjYWxsIHJlc2V0U3RhdGVzKCkgb24gYW4gUk5OIExheWVyIHRoYXQgaXMgbm90IHN0YXRlZnVsLicpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBpbnB1dFNoYXBlID0gdGhpcy5pbnB1dFNwZWNbMF0uc2hhcGU7XG5cbiAgICAgIGNvbnN0IG91dHB1dFNoYXBlID0gdGhpcy5jb21wdXRlU2luZ2xlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZSk7XG5cbiAgICAgIGNvbnN0IHN0YXRlU2hhcGUgPSBbb3V0cHV0U2hhcGVbMF0sIC4uLm91dHB1dFNoYXBlLnNsaWNlKDIpXTtcblxuICAgICAgY29uc3QgYmF0Y2hTaXplID0gaW5wdXRTaGFwZVswXTtcblxuICAgICAgaWYgKGJhdGNoU2l6ZSA9PSBudWxsKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgJ0lmIGFuIFJOTiBpcyBzdGF0ZWZ1bCwgaXQgbmVlZHMgdG8ga25vdyBpdHMgYmF0Y2ggc2l6ZS4gU3BlY2lmeSAnICtcbiAgICAgICAgICAgICd0aGUgYmF0Y2ggc2l6ZSBvZiB5b3VyIGlucHV0IHRlbnNvcnM6IFxcbicgK1xuICAgICAgICAgICAgJy0gSWYgdXNpbmcgYSBTZXF1ZW50aWFsIG1vZGVsLCBzcGVjaWZ5IHRoZSBiYXRjaCBzaXplIGJ5ICcgK1xuICAgICAgICAgICAgJ3Bhc3NpbmcgYSBgYmF0Y2hJbnB1dFNoYXBlYCBvcHRpb24gdG8geW91ciBmaXJzdCBsYXllci5cXG4nICtcbiAgICAgICAgICAgICctIElmIHVzaW5nIHRoZSBmdW5jdGlvbmFsIEFQSSwgc3BlY2lmeSB0aGUgYmF0Y2ggc2l6ZSBieSAnICtcbiAgICAgICAgICAgICdwYXNzaW5nIGEgYGJhdGNoU2hhcGVgIG9wdGlvbiB0byB5b3VyIElucHV0IGxheWVyLicpO1xuICAgICAgfVxuXG4gICAgICAvLyBJbml0aWFsaXplIHN0YXRlIGlmIG51bGwuXG4gICAgICBpZiAodGhpcy5nZXRTdGF0ZXMoKSA9PSBudWxsKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID0gdGhpcy5jZWxsLnN0YXRlU2l6ZS5tYXAoKCkgPT4gdGZjLnplcm9zKHN0YXRlU2hhcGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlc18gPSBbdGZjLnplcm9zKHN0YXRlU2hhcGUpXTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzdGF0ZXMgPT0gbnVsbCkge1xuICAgICAgICAvLyBEaXNwb3NlIG9sZCBzdGF0ZSB0ZW5zb3JzLlxuICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLnN0YXRlc18pO1xuXG4gICAgICAgIC8vIEZvciBzdGF0ZWZ1bCBSTk5zLCBmdWxseSBkaXNwb3NlIGtlcHQgb2xkIHN0YXRlcy5cbiAgICAgICAgaWYgKHRoaXMua2VwdFN0YXRlcyAhPSBudWxsKSB7XG4gICAgICAgICAgdGZjLmRpc3Bvc2UodGhpcy5rZXB0U3RhdGVzKTtcbiAgICAgICAgICB0aGlzLmtlcHRTdGF0ZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuY2VsbC5zdGF0ZVNpemUpKSB7XG4gICAgICAgICAgdGhpcy5zdGF0ZXNfID0gdGhpcy5jZWxsLnN0YXRlU2l6ZS5tYXAoKCkgPT4gdGZjLnplcm9zKHN0YXRlU2hhcGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnN0YXRlc19bMF0gPSB0ZmMuemVyb3Moc3RhdGVTaGFwZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdGF0ZXMpKSB7XG4gICAgICAgICAgc3RhdGVzID0gW3N0YXRlc107XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGVzLmxlbmd0aCAhPT0gdGhpcy5zdGF0ZXNfLmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgTGF5ZXIgJHt0aGlzLm5hbWV9IGV4cGVjdHMgJHt0aGlzLnN0YXRlc18ubGVuZ3RofSBzdGF0ZShzKSwgYCArXG4gICAgICAgICAgICAgIGBidXQgaXQgcmVjZWl2ZWQgJHtzdGF0ZXMubGVuZ3RofSBzdGF0ZSB2YWx1ZShzKS4gSW5wdXQgYCArXG4gICAgICAgICAgICAgIGByZWNlaXZlZDogJHtzdGF0ZXN9YCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodHJhaW5pbmcpIHtcbiAgICAgICAgICAvLyBTdG9yZSBvbGQgc3RhdGUgdGVuc29ycyBmb3IgY29tcGxldGUgZGlzcG9zYWwgbGF0ZXIsIGkuZS4sIGR1cmluZ1xuICAgICAgICAgIC8vIHRoZSBuZXh0IG5vLWFyZyBjYWxsIHRvIHRoaXMgbWV0aG9kLiBXZSBkbyBub3QgZGlzcG9zZSB0aGUgb2xkXG4gICAgICAgICAgLy8gc3RhdGVzIGltbWVkaWF0ZWx5IGJlY2F1c2UgdGhhdCBCUFRUIChhbW9uZyBvdGhlciB0aGluZ3MpIHJlcXVpcmVcbiAgICAgICAgICAvLyB0aGVtLlxuICAgICAgICAgIHRoaXMua2VwdFN0YXRlcy5wdXNoKHRoaXMuc3RhdGVzXy5zbGljZSgpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZmMuZGlzcG9zZSh0aGlzLnN0YXRlc18pO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMuc3RhdGVzXy5sZW5ndGg7ICsraW5kZXgpIHtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN0YXRlc1tpbmRleF07XG5cbiAgICAgICAgICBjb25zdCBleHBlY3RlZFNoYXBlID0gc3RhdGVTaGFwZTtcblxuICAgICAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh2YWx1ZS5zaGFwZSwgZXhwZWN0ZWRTaGFwZSkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICAgIGBTdGF0ZSAke2luZGV4fSBpcyBpbmNvbXBhdGlibGUgd2l0aCBsYXllciAke3RoaXMubmFtZX06IGAgK1xuICAgICAgICAgICAgICAgIGBleHBlY3RlZCBzaGFwZT0ke2V4cGVjdGVkU2hhcGV9LCByZWNlaXZlZCBzaGFwZT0ke1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5zaGFwZX1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLnN0YXRlc19baW5kZXhdID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdGhpcy5zdGF0ZXNfID0gdGhpcy5zdGF0ZXNfLm1hcChzdGF0ZSA9PiB0ZmMua2VlcChzdGF0ZS5jbG9uZSgpKSk7XG4gICAgfSk7XG4gIH1cblxuICBwcm90ZWN0ZWQgY29tcHV0ZVNpbmdsZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlKTogU2hhcGUge1xuICAgIGNvbnN0IHtkYXRhRm9ybWF0LCBmaWx0ZXJzLCBrZXJuZWxTaXplLCBwYWRkaW5nLCBzdHJpZGVzLCBkaWxhdGlvblJhdGV9ID1cbiAgICAgICAgdGhpcy5jZWxsO1xuXG4gICAgY29uc3QgaXNDaGFubmVsc0ZpcnN0ID0gZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnO1xuXG4gICAgY29uc3QgaCA9IGlucHV0U2hhcGVbaXNDaGFubmVsc0ZpcnN0ID8gMyA6IDJdO1xuICAgIGNvbnN0IHcgPSBpbnB1dFNoYXBlW2lzQ2hhbm5lbHNGaXJzdCA/IDQgOiAzXTtcblxuICAgIGNvbnN0IGhPdXQgPSBjb252T3V0cHV0TGVuZ3RoKFxuICAgICAgICBoLCBrZXJuZWxTaXplWzBdLCBwYWRkaW5nLCBzdHJpZGVzWzBdLCBkaWxhdGlvblJhdGVbMF0pO1xuICAgIGNvbnN0IHdPdXQgPSBjb252T3V0cHV0TGVuZ3RoKFxuICAgICAgICB3LCBrZXJuZWxTaXplWzFdLCBwYWRkaW5nLCBzdHJpZGVzWzFdLCBkaWxhdGlvblJhdGVbMV0pO1xuXG4gICAgY29uc3Qgb3V0U2hhcGU6IFNoYXBlID0gW1xuICAgICAgLi4uaW5wdXRTaGFwZS5zbGljZSgwLCAyKSxcbiAgICAgIC4uLihpc0NoYW5uZWxzRmlyc3QgPyBbZmlsdGVycywgaE91dCwgd091dF0gOiBbaE91dCwgd091dCwgZmlsdGVyc10pXG4gICAgXTtcblxuICAgIHJldHVybiBvdXRTaGFwZTtcbiAgfVxufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQ29udkxTVE0yRENlbGxBcmdzIGV4dGVuZHNcbiAgICBPbWl0PExTVE1DZWxsTGF5ZXJBcmdzLCAndW5pdHMnPiwgQ29udlJOTjJEQ2VsbEFyZ3Mge31cblxuZXhwb3J0IGNsYXNzIENvbnZMU1RNMkRDZWxsIGV4dGVuZHMgTFNUTUNlbGwgaW1wbGVtZW50cyBDb252Uk5OMkRDZWxsIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udkxTVE0yRENlbGwnO1xuXG4gIHJlYWRvbmx5IGZpbHRlcnM6IG51bWJlcjtcbiAgcmVhZG9ubHkga2VybmVsU2l6ZTogbnVtYmVyW107XG4gIHJlYWRvbmx5IHN0cmlkZXM6IG51bWJlcltdO1xuICByZWFkb25seSBwYWRkaW5nOiBQYWRkaW5nTW9kZTtcbiAgcmVhZG9ubHkgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcbiAgcmVhZG9ubHkgZGlsYXRpb25SYXRlOiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBDb252TFNUTTJEQ2VsbEFyZ3MpIHtcbiAgICBjb25zdCB7XG4gICAgICBmaWx0ZXJzLFxuICAgICAga2VybmVsU2l6ZSxcbiAgICAgIHN0cmlkZXMsXG4gICAgICBwYWRkaW5nLFxuICAgICAgZGF0YUZvcm1hdCxcbiAgICAgIGRpbGF0aW9uUmF0ZSxcbiAgICB9ID0gYXJncztcblxuICAgIHN1cGVyKHsuLi5hcmdzLCB1bml0czogZmlsdGVyc30pO1xuXG4gICAgdGhpcy5maWx0ZXJzID0gZmlsdGVycztcbiAgICBhc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy5maWx0ZXJzLCAnZmlsdGVycycpO1xuXG4gICAgdGhpcy5rZXJuZWxTaXplID0gbm9ybWFsaXplQXJyYXkoa2VybmVsU2l6ZSwgMiwgJ2tlcm5lbFNpemUnKTtcbiAgICB0aGlzLmtlcm5lbFNpemUuZm9yRWFjaChzaXplID0+IGFzc2VydFBvc2l0aXZlSW50ZWdlcihzaXplLCAna2VybmVsU2l6ZScpKTtcblxuICAgIHRoaXMuc3RyaWRlcyA9IG5vcm1hbGl6ZUFycmF5KHN0cmlkZXMgfHwgMSwgMiwgJ3N0cmlkZXMnKTtcbiAgICB0aGlzLnN0cmlkZXMuZm9yRWFjaChzdHJpZGUgPT4gYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHN0cmlkZSwgJ3N0cmlkZXMnKSk7XG5cbiAgICB0aGlzLnBhZGRpbmcgPSBwYWRkaW5nIHx8ICd2YWxpZCc7XG4gICAgY2hlY2tQYWRkaW5nTW9kZSh0aGlzLnBhZGRpbmcpO1xuXG4gICAgdGhpcy5kYXRhRm9ybWF0ID0gZGF0YUZvcm1hdCB8fCAnY2hhbm5lbHNMYXN0JztcbiAgICBjaGVja0RhdGFGb3JtYXQodGhpcy5kYXRhRm9ybWF0KTtcblxuICAgIHRoaXMuZGlsYXRpb25SYXRlID0gbm9ybWFsaXplQXJyYXkoZGlsYXRpb25SYXRlIHx8IDEsIDIsICdkaWxhdGlvblJhdGUnKTtcbiAgICB0aGlzLmRpbGF0aW9uUmF0ZS5mb3JFYWNoKFxuICAgICAgICByYXRlID0+IGFzc2VydFBvc2l0aXZlSW50ZWdlcihyYXRlLCAnZGlsYXRpb25SYXRlJykpO1xuICB9XG5cbiAgcHVibGljIGJ1aWxkKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiB2b2lkIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuXG4gICAgY29uc3QgY2hhbm5lbEF4aXMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IDEgOiBpbnB1dFNoYXBlLmxlbmd0aCAtIDE7XG5cbiAgICBpZiAoaW5wdXRTaGFwZVtjaGFubmVsQXhpc10gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYFRoZSBjaGFubmVsIGRpbWVuc2lvbiBvZiB0aGUgaW5wdXQgc2hvdWxkIGJlIGRlZmluZWQuIGAgK1xuICAgICAgICAgIGBGb3VuZCAke2lucHV0U2hhcGVbY2hhbm5lbEF4aXNdfWApO1xuICAgIH1cblxuICAgIGNvbnN0IGlucHV0RGltID0gaW5wdXRTaGFwZVtjaGFubmVsQXhpc107XG5cbiAgICBjb25zdCBudW1PZktlcm5lbHMgPSA0O1xuXG4gICAgY29uc3Qga2VybmVsU2hhcGUgPVxuICAgICAgICB0aGlzLmtlcm5lbFNpemUuY29uY2F0KFtpbnB1dERpbSwgdGhpcy5maWx0ZXJzICogbnVtT2ZLZXJuZWxzXSk7XG5cbiAgICB0aGlzLmtlcm5lbCA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAna2VybmVsJywga2VybmVsU2hhcGUsIG51bGwsIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIsXG4gICAgICAgIHRoaXMua2VybmVsUmVndWxhcml6ZXIsIHRydWUsIHRoaXMua2VybmVsQ29uc3RyYWludCk7XG5cbiAgICBjb25zdCByZWN1cnJlbnRLZXJuZWxTaGFwZSA9XG4gICAgICAgIHRoaXMua2VybmVsU2l6ZS5jb25jYXQoW3RoaXMuZmlsdGVycywgdGhpcy5maWx0ZXJzICogbnVtT2ZLZXJuZWxzXSk7XG5cbiAgICB0aGlzLnJlY3VycmVudEtlcm5lbCA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAncmVjdXJyZW50X2tlcm5lbCcsIHJlY3VycmVudEtlcm5lbFNoYXBlLCBudWxsLFxuICAgICAgICB0aGlzLnJlY3VycmVudEluaXRpYWxpemVyLCB0aGlzLnJlY3VycmVudFJlZ3VsYXJpemVyLCB0cnVlLFxuICAgICAgICB0aGlzLnJlY3VycmVudENvbnN0cmFpbnQpO1xuXG4gICAgaWYgKHRoaXMudXNlQmlhcykge1xuICAgICAgbGV0IGJpYXNJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG5cbiAgICAgIGlmICh0aGlzLnVuaXRGb3JnZXRCaWFzKSB7XG4gICAgICAgIGNvbnN0IGluaXQgPSB0aGlzLmJpYXNJbml0aWFsaXplcjtcblxuICAgICAgICBjb25zdCBmaWx0ZXJzID0gdGhpcy5maWx0ZXJzO1xuXG4gICAgICAgIGJpYXNJbml0aWFsaXplciA9IG5ldyAoY2xhc3MgQ3VzdG9tSW5pdCBleHRlbmRzIEluaXRpYWxpemVyIHtcbiAgICAgICAgICAvKiogQG5vY29sbGFwc2UgKi9cbiAgICAgICAgICBzdGF0aWMgY2xhc3NOYW1lID0gJ0N1c3RvbUluaXQnO1xuXG4gICAgICAgICAgYXBwbHkoc2hhcGU6IFNoYXBlLCBkdHlwZT86IERhdGFUeXBlKTogdGZjLlRlbnNvciB7XG4gICAgICAgICAgICBjb25zdCBiaWFzSSA9IGluaXQuYXBwbHkoW2ZpbHRlcnNdKTtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNGID0gdGZjLm9uZXMoW2ZpbHRlcnNdKTtcbiAgICAgICAgICAgIGNvbnN0IGJpYXNDQW5kTyA9IGluaXQuYXBwbHkoW2ZpbHRlcnMgKiAyXSk7XG4gICAgICAgICAgICByZXR1cm4gSy5jb25jYXRlbmF0ZShbYmlhc0ksIGJpYXNGLCBiaWFzQ0FuZE9dKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBiaWFzSW5pdGlhbGl6ZXIgPSB0aGlzLmJpYXNJbml0aWFsaXplcjtcbiAgICAgIH1cblxuICAgICAgdGhpcy5iaWFzID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JpYXMnLCBbdGhpcy5maWx0ZXJzICogbnVtT2ZLZXJuZWxzXSwgbnVsbCwgYmlhc0luaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMuYmlhc1JlZ3VsYXJpemVyLCB0cnVlLCB0aGlzLmJpYXNDb25zdHJhaW50KTtcbiAgICB9XG5cbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiB0ZmMuVGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogdGZjLlRlbnNvcltdIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgaWYgKGlucHV0cy5sZW5ndGggIT09IDMpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgQ29udkxTVE0yRENlbGwgZXhwZWN0cyAzIGlucHV0IFRlbnNvcnMgKGlucHV0cywgaCwgYyksIGdvdCBgICtcbiAgICAgICAgICAgIGAke2lucHV0cy5sZW5ndGh9LmApO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB0cmFpbmluZyA9IGt3YXJnc1sndHJhaW5pbmcnXSB8fCBmYWxzZTtcblxuICAgICAgY29uc3QgeCA9IGlucHV0c1swXTsgICAgICAgICAvLyBDdXJyZW50IGlucHV0XG4gICAgICBjb25zdCBoVE1pbnVzMSA9IGlucHV0c1sxXTsgIC8vIFByZXZpb3VzIG1lbW9yeSBzdGF0ZS5cbiAgICAgIGNvbnN0IGNUTWludXMxID0gaW5wdXRzWzJdOyAgLy8gUHJldmlvdXMgY2Fycnkgc3RhdGUuXG5cbiAgICAgIGNvbnN0IG51bU9mS2VybmVscyA9IDQ7XG5cbiAgICAgIHR5cGUgRHJvcG91dE1hc2tzID0gW3RmYy5UZW5zb3IsIHRmYy5UZW5zb3IsIHRmYy5UZW5zb3IsIHRmYy5UZW5zb3JdO1xuXG4gICAgICBpZiAoMCA8IHRoaXMuZHJvcG91dCAmJiB0aGlzLmRyb3BvdXQgPCAxICYmIHRoaXMuZHJvcG91dE1hc2sgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRyb3BvdXRNYXNrID0gZ2VuZXJhdGVEcm9wb3V0TWFzayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXM6ICgpID0+IHRmYy5vbmVzTGlrZSh4KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0ZTogdGhpcy5kcm9wb3V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbmluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6IG51bU9mS2VybmVscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJvcG91dEZ1bmM6IHRoaXMuZHJvcG91dEZ1bmNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIGFzIHRmYy5UZW5zb3JbXTtcbiAgICAgIH1cblxuICAgICAgY29uc3QgZHJvcG91dE1hc2sgPSB0aGlzLmRyb3BvdXRNYXNrIGFzIERyb3BvdXRNYXNrcztcblxuICAgICAgY29uc3QgYXBwbHlEcm9wb3V0ID1cbiAgICAgICAgICAoeDogdGZjLlRlbnNvciwgbWFzazogdGZjLlRlbnNvcltdLCBpbmRleDogbnVtYmVyKSA9PiB7XG4gICAgICAgICAgICBpZiAoIW1hc2sgfHwgIW1hc2tbaW5kZXhdKSB7XG4gICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGZjLm11bChtYXNrW2luZGV4XSwgeCk7XG4gICAgICAgICAgfTtcblxuICAgICAgbGV0IHhJID0gYXBwbHlEcm9wb3V0KHgsIGRyb3BvdXRNYXNrLCAwKTtcbiAgICAgIGxldCB4RiA9IGFwcGx5RHJvcG91dCh4LCBkcm9wb3V0TWFzaywgMSk7XG4gICAgICBsZXQgeEMgPSBhcHBseURyb3BvdXQoeCwgZHJvcG91dE1hc2ssIDIpO1xuICAgICAgbGV0IHhPID0gYXBwbHlEcm9wb3V0KHgsIGRyb3BvdXRNYXNrLCAzKTtcblxuICAgICAgaWYgKDAgPCB0aGlzLnJlY3VycmVudERyb3BvdXQgJiYgdGhpcy5yZWN1cnJlbnREcm9wb3V0IDwgMSAmJlxuICAgICAgICAgIHRoaXMucmVjdXJyZW50RHJvcG91dE1hc2sgPT0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlY3VycmVudERyb3BvdXRNYXNrID0gZ2VuZXJhdGVEcm9wb3V0TWFzayh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZXM6ICgpID0+IHRmYy5vbmVzTGlrZShoVE1pbnVzMSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGU6IHRoaXMucmVjdXJyZW50RHJvcG91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaW5pbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OiBudW1PZktlcm5lbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRyb3BvdXRGdW5jOiB0aGlzLmRyb3BvdXRGdW5jXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSBhcyB0ZmMuVGVuc29yW107XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHJlY0Ryb3BvdXRNYXNrID0gdGhpcy5yZWN1cnJlbnREcm9wb3V0TWFzayBhcyBEcm9wb3V0TWFza3M7XG5cbiAgICAgIGxldCBoSSA9IGFwcGx5RHJvcG91dChoVE1pbnVzMSwgcmVjRHJvcG91dE1hc2ssIDApO1xuICAgICAgbGV0IGhGID0gYXBwbHlEcm9wb3V0KGhUTWludXMxLCByZWNEcm9wb3V0TWFzaywgMSk7XG4gICAgICBsZXQgaEMgPSBhcHBseURyb3BvdXQoaFRNaW51czEsIHJlY0Ryb3BvdXRNYXNrLCAyKTtcbiAgICAgIGxldCBoTyA9IGFwcGx5RHJvcG91dChoVE1pbnVzMSwgcmVjRHJvcG91dE1hc2ssIDMpO1xuXG4gICAgICBjb25zdCBrZXJuZWxDaGFubmVsQXhpcyA9IDM7XG5cbiAgICAgIGNvbnN0IFtrZXJuZWxJLCBrZXJuZWxGLCBrZXJuZWxDLCBrZXJuZWxPXTogdGZjLlRlbnNvcltdID1cbiAgICAgICAgICB0ZmMuc3BsaXQodGhpcy5rZXJuZWwucmVhZCgpLCBudW1PZktlcm5lbHMsIGtlcm5lbENoYW5uZWxBeGlzKTtcblxuICAgICAgY29uc3QgW2JpYXNJLCBiaWFzRiwgYmlhc0MsIGJpYXNPXTogdGZjLlRlbnNvcltdID0gdGhpcy51c2VCaWFzID9cbiAgICAgICAgICB0ZmMuc3BsaXQodGhpcy5iaWFzLnJlYWQoKSwgbnVtT2ZLZXJuZWxzKSA6XG4gICAgICAgICAgW251bGwsIG51bGwsIG51bGwsIG51bGxdO1xuXG4gICAgICB4SSA9IHRoaXMuaW5wdXRDb252KHhJLCBrZXJuZWxJLCBiaWFzSSwgdGhpcy5wYWRkaW5nKTtcbiAgICAgIHhGID0gdGhpcy5pbnB1dENvbnYoeEYsIGtlcm5lbEYsIGJpYXNGLCB0aGlzLnBhZGRpbmcpO1xuICAgICAgeEMgPSB0aGlzLmlucHV0Q29udih4Qywga2VybmVsQywgYmlhc0MsIHRoaXMucGFkZGluZyk7XG4gICAgICB4TyA9IHRoaXMuaW5wdXRDb252KHhPLCBrZXJuZWxPLCBiaWFzTywgdGhpcy5wYWRkaW5nKTtcblxuICAgICAgY29uc3QgW3JlY0tlcm5lbEksIHJlY0tlcm5lbEYsIHJlY0tlcm5lbEMsIHJlY0tlcm5lbE9dOiB0ZmMuVGVuc29yW10gPVxuICAgICAgICAgIHRmYy5zcGxpdChcbiAgICAgICAgICAgICAgdGhpcy5yZWN1cnJlbnRLZXJuZWwucmVhZCgpLCBudW1PZktlcm5lbHMsIGtlcm5lbENoYW5uZWxBeGlzKTtcblxuICAgICAgaEkgPSB0aGlzLnJlY3VycmVudENvbnYoaEksIHJlY0tlcm5lbEkpO1xuICAgICAgaEYgPSB0aGlzLnJlY3VycmVudENvbnYoaEYsIHJlY0tlcm5lbEYpO1xuICAgICAgaEMgPSB0aGlzLnJlY3VycmVudENvbnYoaEMsIHJlY0tlcm5lbEMpO1xuICAgICAgaE8gPSB0aGlzLnJlY3VycmVudENvbnYoaE8sIHJlY0tlcm5lbE8pO1xuXG4gICAgICBjb25zdCBpID0gdGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KHRmYy5hZGQoeEksIGhJKSk7XG4gICAgICBjb25zdCBmID0gdGhpcy5yZWN1cnJlbnRBY3RpdmF0aW9uLmFwcGx5KHRmYy5hZGQoeEYsIGhGKSk7XG4gICAgICBjb25zdCBjID0gdGZjLmFkZChcbiAgICAgICAgICB0ZmMubXVsKGYsIGNUTWludXMxKSxcbiAgICAgICAgICB0ZmMubXVsKGksIHRoaXMuYWN0aXZhdGlvbi5hcHBseSh0ZmMuYWRkKHhDLCBoQykpKSk7XG4gICAgICBjb25zdCBoID0gdGZjLm11bChcbiAgICAgICAgICB0aGlzLnJlY3VycmVudEFjdGl2YXRpb24uYXBwbHkodGZjLmFkZCh4TywgaE8pKSxcbiAgICAgICAgICB0aGlzLmFjdGl2YXRpb24uYXBwbHkoYykpO1xuXG4gICAgICByZXR1cm4gW2gsIGgsIGNdO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHRmYy5zZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IHsndW5pdHMnOiBfLCAuLi5iYXNlQ29uZmlnfSA9IHN1cGVyLmdldENvbmZpZygpO1xuXG4gICAgY29uc3QgY29uZmlnOiB0ZmMuc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge1xuICAgICAgZmlsdGVyczogdGhpcy5maWx0ZXJzLFxuICAgICAga2VybmVsU2l6ZTogdGhpcy5rZXJuZWxTaXplLFxuICAgICAgcGFkZGluZzogdGhpcy5wYWRkaW5nLFxuICAgICAgZGF0YUZvcm1hdDogdGhpcy5kYXRhRm9ybWF0LFxuICAgICAgZGlsYXRpb25SYXRlOiB0aGlzLmRpbGF0aW9uUmF0ZSxcbiAgICAgIHN0cmlkZXM6IHRoaXMuc3RyaWRlcyxcbiAgICB9O1xuXG4gICAgcmV0dXJuIHsuLi5iYXNlQ29uZmlnLCAuLi5jb25maWd9O1xuICB9XG5cbiAgaW5wdXRDb252KHg6IFRlbnNvciwgdzogVGVuc29yLCBiPzogVGVuc29yLCBwYWRkaW5nPzogUGFkZGluZ01vZGUpIHtcbiAgICBjb25zdCBvdXQgPSB0ZmMuY29udjJkKFxuICAgICAgICB4IGFzIHRmYy5UZW5zb3IzRCwgdyBhcyB0ZmMuVGVuc29yNEQsIHRoaXMuc3RyaWRlcyBhcyBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgICAocGFkZGluZyB8fCAndmFsaWQnKSBhcyAnc2FtZScgfCAndmFsaWQnLFxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/ICdOQ0hXJyA6ICdOSFdDJyxcbiAgICAgICAgdGhpcy5kaWxhdGlvblJhdGUgYXMgW251bWJlciwgbnVtYmVyXSk7XG5cbiAgICBpZiAoYikge1xuICAgICAgcmV0dXJuIEsuYmlhc0FkZChvdXQsIGIsIHRoaXMuZGF0YUZvcm1hdCkgYXMgdGZjLlRlbnNvcjNEO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICByZWN1cnJlbnRDb252KHg6IFRlbnNvciwgdzogVGVuc29yKSB7XG4gICAgY29uc3Qgc3RyaWRlcyA9IDE7XG5cbiAgICByZXR1cm4gdGZjLmNvbnYyZChcbiAgICAgICAgeCBhcyB0ZmMuVGVuc29yM0QsIHcgYXMgdGZjLlRlbnNvcjRELCBzdHJpZGVzLCAnc2FtZScsXG4gICAgICAgIHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnID8gJ05DSFcnIDogJ05IV0MnKTtcbiAgfVxufVxuXG50ZmMuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnZMU1RNMkRDZWxsKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIENvbnZMU1RNMkRBcmdzIGV4dGVuZHNcbiAgICBPbWl0PExTVE1MYXllckFyZ3MsICd1bml0cyd8J2NlbGwnPiwgQ29udlJOTjJETGF5ZXJBcmdzIHt9XG5cbmV4cG9ydCBjbGFzcyBDb252TFNUTTJEIGV4dGVuZHMgQ29udlJOTjJEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQ29udkxTVE0yRCc7XG5cbiAgY29uc3RydWN0b3IoYXJnczogQ29udkxTVE0yREFyZ3MpIHtcbiAgICBjb25zdCBjZWxsID0gbmV3IENvbnZMU1RNMkRDZWxsKGFyZ3MpO1xuXG4gICAgc3VwZXIoey4uLmFyZ3MsIGNlbGx9IGFzIENvbnZSTk4yRExheWVyQXJncyk7XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIHRmYy5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZT4oXG4gICAgICBjbHM6IHRmYy5zZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiB0ZmMuc2VyaWFsaXphdGlvbi5Db25maWdEaWN0KTogVCB7XG4gICAgcmV0dXJuIG5ldyBjbHMoY29uZmlnKTtcbiAgfVxufVxuXG50ZmMuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbnZMU1RNMkQpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Basic Layers.\n */\nimport { any, cast, mul, notEqual, reshape, serialization, tidy, transpose, util } from '@tensorflow/tfjs-core';\nimport { getActivation, serializeActivation } from '../activations';\nimport * as K from '../backend/tfjs_backend';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport { assertPositiveInteger, mapActivationToFusedKernel } from '../utils/generic_utils';\nimport { arrayProd, range } from '../utils/math_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nexport class Dropout extends Layer {\n    constructor(args) {\n        super(args);\n        this.rate = Math.max(Math.min(args.rate, 1), 0);\n        // So that the scalar doesn't get tidied up between executions.\n        this.noiseShape = args.noiseShape;\n        this.seed = args.seed;\n        this.supportsMasking = true;\n    }\n    getNoiseShape(input) {\n        if (this.noiseShape == null) {\n            return this.noiseShape;\n        }\n        const inputShape = input.shape;\n        const noiseShape = [];\n        for (let i = 0; i < this.noiseShape.length; ++i) {\n            noiseShape.push(this.noiseShape[i] == null ? inputShape[i] : this.noiseShape[i]);\n        }\n        return noiseShape;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            const input = getExactlyOneTensor(inputs);\n            if (0 < this.rate && this.rate < 1) {\n                const training = kwargs['training'] == null ? false : kwargs['training'];\n                const noiseShape = this.getNoiseShape(input);\n                const output = K.inTrainPhase(() => K.dropout(input, this.rate, noiseShape, this.seed), () => input, training);\n                return output;\n            }\n            return inputs;\n        });\n    }\n    getConfig() {\n        const config = {\n            rate: this.rate,\n            noiseShape: this.noiseShape,\n            seed: this.seed,\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    dispose() {\n        return super.dispose();\n    }\n}\n/** @nocollapse */\nDropout.className = 'Dropout';\nserialization.registerClass(Dropout);\nexport class SpatialDropout1D extends Dropout {\n    constructor(args) {\n        super(args);\n        this.inputSpec = [{ ndim: 3 }];\n    }\n    getNoiseShape(input) {\n        const inputShape = input.shape;\n        return [inputShape[0], 1, inputShape[2]];\n    }\n}\n/** @nocollapse */\nSpatialDropout1D.className = 'SpatialDropout1D';\nserialization.registerClass(SpatialDropout1D);\nexport class Dense extends Layer {\n    constructor(args) {\n        super(args);\n        // Default activation: Linear (none).\n        this.activation = null;\n        this.useBias = true;\n        this.kernel = null;\n        this.bias = null;\n        this.DEFAULT_KERNEL_INITIALIZER = 'glorotNormal';\n        this.DEFAULT_BIAS_INITIALIZER = 'zeros';\n        if (args.batchInputShape == null && args.inputShape == null &&\n            args.inputDim != null) {\n            // This logic is copied from Layer's constructor, since we can't\n            // do exactly what the Python constructor does for Dense().\n            let batchSize = null;\n            if (args.batchSize != null) {\n                batchSize = args.batchSize;\n            }\n            this.batchInputShape = [batchSize, args.inputDim];\n        }\n        this.units = args.units;\n        assertPositiveInteger(this.units, 'units');\n        this.activation = getActivation(args.activation);\n        if (args.useBias != null) {\n            this.useBias = args.useBias;\n        }\n        this.kernelInitializer = getInitializer(args.kernelInitializer || this.DEFAULT_KERNEL_INITIALIZER);\n        this.biasInitializer =\n            getInitializer(args.biasInitializer || this.DEFAULT_BIAS_INITIALIZER);\n        this.kernelConstraint = getConstraint(args.kernelConstraint);\n        this.biasConstraint = getConstraint(args.biasConstraint);\n        this.kernelRegularizer = getRegularizer(args.kernelRegularizer);\n        this.biasRegularizer = getRegularizer(args.biasRegularizer);\n        this.activityRegularizer = getRegularizer(args.activityRegularizer);\n        this.supportsMasking = true;\n        this.inputSpec = [{ minNDim: 2 }];\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const inputLastDim = inputShape[inputShape.length - 1];\n        if (this.kernel == null) {\n            this.kernel = this.addWeight('kernel', [inputLastDim, this.units], null, this.kernelInitializer, this.kernelRegularizer, true, this.kernelConstraint);\n            if (this.useBias) {\n                this.bias = this.addWeight('bias', [this.units], null, this.biasInitializer, this.biasRegularizer, true, this.biasConstraint);\n            }\n        }\n        this.inputSpec = [{ minNDim: 2, axes: { [-1]: inputLastDim } }];\n        this.built = true;\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const outputShape = inputShape.slice();\n        outputShape[outputShape.length - 1] = this.units;\n        return outputShape;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            // Dense layer accepts only a single input.\n            const input = getExactlyOneTensor(inputs);\n            const fusedActivationName = mapActivationToFusedKernel(this.activation.getClassName());\n            let output;\n            if (fusedActivationName != null) {\n                output = K.dot(input, this.kernel.read(), fusedActivationName, this.bias ? this.bias.read() : null);\n            }\n            else {\n                output = K.dot(input, this.kernel.read());\n                if (this.bias != null) {\n                    output = K.biasAdd(output, this.bias.read());\n                }\n                if (this.activation != null) {\n                    output = this.activation.apply(output);\n                }\n            }\n            return output;\n        });\n    }\n    getConfig() {\n        const config = {\n            units: this.units,\n            activation: serializeActivation(this.activation),\n            useBias: this.useBias,\n            kernelInitializer: serializeInitializer(this.kernelInitializer),\n            biasInitializer: serializeInitializer(this.biasInitializer),\n            kernelRegularizer: serializeRegularizer(this.kernelRegularizer),\n            biasRegularizer: serializeRegularizer(this.biasRegularizer),\n            activityRegularizer: serializeRegularizer(this.activityRegularizer),\n            kernelConstraint: serializeConstraint(this.kernelConstraint),\n            biasConstraint: serializeConstraint(this.biasConstraint)\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nDense.className = 'Dense';\nserialization.registerClass(Dense);\nexport class Flatten extends Layer {\n    constructor(args) {\n        args = args || {};\n        super(args);\n        this.inputSpec = [{ minNDim: 3 }];\n        this.dataFormat = args.dataFormat;\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        for (const dim of inputShape.slice(1)) {\n            if (dim == null) {\n                throw new ValueError(`The shape of the input to \"Flatten\" is not fully defined ` +\n                    `(got ${inputShape.slice(1)}). Make sure to pass a complete ` +\n                    `\"input_shape\" or \"batch_input_shape\" argument to the first ` +\n                    `layer in your model.`);\n            }\n        }\n        return [inputShape[0], arrayProd(inputShape, 1)];\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            let input = getExactlyOneTensor(inputs);\n            if (this.dataFormat === 'channelsFirst' && input.rank > 1) {\n                const permutation = [0];\n                for (let i = 2; i < input.rank; ++i) {\n                    permutation.push(i);\n                }\n                permutation.push(1);\n                input = transpose(input, permutation);\n            }\n            return K.batchFlatten(input);\n        });\n    }\n    getConfig() {\n        const config = {};\n        if (this.dataFormat != null) {\n            config['dataFormat'] = this.dataFormat;\n        }\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nFlatten.className = 'Flatten';\nserialization.registerClass(Flatten);\nexport class Activation extends Layer {\n    constructor(args) {\n        super(args);\n        this.supportsMasking = true;\n        this.activation = getActivation(args.activation);\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            const input = getExactlyOneTensor(inputs);\n            return this.activation.apply(input);\n        });\n    }\n    getConfig() {\n        const config = { activation: serializeActivation(this.activation) };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nActivation.className = 'Activation';\nserialization.registerClass(Activation);\nexport class RepeatVector extends Layer {\n    constructor(args) {\n        super(args);\n        this.n = args.n;\n        this.inputSpec = [{ ndim: 2 }];\n    }\n    computeOutputShape(inputShape) {\n        return [inputShape[0], this.n, inputShape[1]];\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = getExactlyOneTensor(inputs);\n            return K.repeat(inputs, this.n);\n        });\n    }\n    getConfig() {\n        const config = {\n            n: this.n,\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nRepeatVector.className = 'RepeatVector';\nserialization.registerClass(RepeatVector);\nexport class Reshape extends Layer {\n    constructor(args) {\n        super(args);\n        this.targetShape = args.targetShape;\n        // Make sure that all unknown dimensions are represented as `null`.\n        for (let i = 0; i < this.targetShape.length; ++i) {\n            if (this.isUnknown(this.targetShape[i])) {\n                this.targetShape[i] = null;\n            }\n        }\n    }\n    isUnknown(dim) {\n        return dim < 0 || dim == null;\n    }\n    /**\n     * Finds and replaces a missing dimension in output shape.\n     *\n     * This is a near direct port of the internal Numpy function\n     * `_fix_unknown_dimension` in `numpy/core/src/multiarray/shape.c`.\n     *\n     * @param inputShape: Original shape of array begin reshape.\n     * @param outputShape: Target shape of the array, with at most a single\n     * `null` or negative number, which indicates an underdetermined dimension\n     * that should be derived from `inputShape` and the known dimensions of\n     *   `outputShape`.\n     * @returns: The output shape with `null` replaced with its computed value.\n     * @throws: ValueError: If `inputShape` and `outputShape` do not match.\n     */\n    fixUnknownDimension(inputShape, outputShape) {\n        const errorMsg = 'Total size of new array must be unchanged.';\n        const finalShape = outputShape.slice();\n        let known = 1;\n        let unknown = null;\n        for (let i = 0; i < finalShape.length; ++i) {\n            const dim = finalShape[i];\n            if (this.isUnknown(dim)) {\n                if (unknown === null) {\n                    unknown = i;\n                }\n                else {\n                    throw new ValueError('Can only specifiy one unknown dimension.');\n                }\n            }\n            else {\n                known *= dim;\n            }\n        }\n        const originalSize = arrayProd(inputShape);\n        if (unknown !== null) {\n            if (known === 0 || originalSize % known !== 0) {\n                throw new ValueError(errorMsg);\n            }\n            finalShape[unknown] = originalSize / known;\n        }\n        else if (originalSize !== known) {\n            throw new ValueError(errorMsg);\n        }\n        return finalShape;\n    }\n    computeOutputShape(inputShape) {\n        let anyUnknownDims = false;\n        for (let i = 0; i < inputShape.length; ++i) {\n            if (this.isUnknown(inputShape[i])) {\n                anyUnknownDims = true;\n                break;\n            }\n        }\n        if (anyUnknownDims) {\n            return inputShape.slice(0, 1).concat(this.targetShape);\n        }\n        else {\n            return inputShape.slice(0, 1).concat(this.fixUnknownDimension(inputShape.slice(1), this.targetShape));\n        }\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            const input = getExactlyOneTensor(inputs);\n            const inputShape = input.shape;\n            const outputShape = inputShape.slice(0, 1).concat(this.fixUnknownDimension(inputShape.slice(1), this.targetShape));\n            return reshape(input, outputShape);\n        });\n    }\n    getConfig() {\n        const config = {\n            targetShape: this.targetShape,\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nReshape.className = 'Reshape';\nserialization.registerClass(Reshape);\nexport class Permute extends Layer {\n    constructor(args) {\n        super(args);\n        if (args.dims == null) {\n            throw new Error('Required configuration field `dims` is missing during Permute ' +\n                'constructor call.');\n        }\n        if (!Array.isArray(args.dims)) {\n            throw new Error('Permute constructor requires `dims` to be an Array, but received ' +\n                `${args.dims} instead.`);\n        }\n        // Check the validity of the permutation indices.\n        const expectedSortedIndices = range(1, args.dims.length + 1);\n        if (!util.arraysEqual(args.dims.slice().sort(), expectedSortedIndices)) {\n            throw new Error('Invalid permutation `dims`: ' + JSON.stringify(args.dims) +\n                ' `dims` must contain consecutive integers starting from 1.');\n        }\n        this.dims = args.dims;\n        this.dimsIncludingBatch = [0].concat(this.dims);\n        this.inputSpec = [new InputSpec({ ndim: this.dims.length + 1 })];\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const outputShape = inputShape.slice();\n        this.dims.forEach((dim, i) => {\n            outputShape[i + 1] = inputShape[dim];\n        });\n        return outputShape;\n    }\n    call(inputs, kwargs) {\n        return transpose(getExactlyOneTensor(inputs), this.dimsIncludingBatch);\n    }\n    getConfig() {\n        const config = {\n            dims: this.dims,\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nPermute.className = 'Permute';\nserialization.registerClass(Permute);\nexport class Masking extends Layer {\n    constructor(args) {\n        super(args == null ? {} : args);\n        this.supportsMasking = true;\n        if (args != null) {\n            this.maskValue = args.maskValue == null ? 0 : args.maskValue;\n        }\n        else {\n            this.maskValue = 0;\n        }\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const config = { maskValue: this.maskValue };\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    computeMask(inputs, mask) {\n        const input = getExactlyOneTensor(inputs);\n        const axis = -1;\n        return any(notEqual(input, this.maskValue), axis);\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            const input = getExactlyOneTensor(inputs);\n            const axis = -1;\n            const keepDims = true;\n            const booleanMask = any(notEqual(input, this.maskValue), axis, keepDims);\n            const output = mul(input, cast(booleanMask, input.dtype));\n            return output;\n        });\n    }\n}\n/** @nocollapse */\nMasking.className = 'Masking';\nserialization.registerClass(Masking);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvY29yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFVLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEgsT0FBTyxFQUE2QixhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5RixPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBbUMsYUFBYSxFQUFFLG1CQUFtQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEcsT0FBTyxFQUFnQixTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDOUUsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBSXpHLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxFQUFDLHFCQUFxQixFQUFFLDBCQUEwQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDekYsT0FBTyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQXFCN0UsTUFBTSxPQUFPLE9BQVEsU0FBUSxLQUFLO0lBT2hDLFlBQVksSUFBc0I7UUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFD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MUMsTUFBTSxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLE1BQU0sV0FBVyxHQUFHLEdBQUcsQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDekUsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQzFELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUF6Q0Qsa0JBQWtCO0FBQ1gsaUJBQVMsR0FBRyxTQUFTLENBQUM7QUEwQy9CLGFBQWEsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBCYXNpYyBMYXllcnMuXG4gKi9cblxuaW1wb3J0IHthbnksIGNhc3QsIG11bCwgbm90RXF1YWwsIHJlc2hhcGUsIHNlcmlhbGl6YXRpb24sIFRlbnNvciwgdGlkeSwgdHJhbnNwb3NlLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0FjdGl2YXRpb24gYXMgQWN0aXZhdGlvbkZuLCBnZXRBY3RpdmF0aW9uLCBzZXJpYWxpemVBY3RpdmF0aW9ufSBmcm9tICcuLi9hY3RpdmF0aW9ucyc7XG5pbXBvcnQgKiBhcyBLIGZyb20gJy4uL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7Q29uc3RyYWludCwgQ29uc3RyYWludElkZW50aWZpZXIsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7RGlzcG9zZVJlc3VsdCwgSW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtnZXRJbml0aWFsaXplciwgSW5pdGlhbGl6ZXIsIEluaXRpYWxpemVySWRlbnRpZmllciwgc2VyaWFsaXplSW5pdGlhbGl6ZXJ9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge0FjdGl2YXRpb25JZGVudGlmaWVyfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvYWN0aXZhdGlvbl9jb25maWcnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0xheWVyQ29uZmlnfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvdG9wb2xvZ3lfY29uZmlnJztcbmltcG9ydCB7Z2V0UmVndWxhcml6ZXIsIFJlZ3VsYXJpemVyLCBSZWd1bGFyaXplcklkZW50aWZpZXIsIHNlcmlhbGl6ZVJlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7YXNzZXJ0UG9zaXRpdmVJbnRlZ2VyLCBtYXBBY3RpdmF0aW9uVG9GdXNlZEtlcm5lbH0gZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2FycmF5UHJvZCwgcmFuZ2V9IGZyb20gJy4uL3V0aWxzL21hdGhfdXRpbHMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIERyb3BvdXRMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKiogRmxvYXQgYmV0d2VlbiAwIGFuZCAxLiBGcmFjdGlvbiBvZiB0aGUgaW5wdXQgdW5pdHMgdG8gZHJvcC4gKi9cbiAgcmF0ZTogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJbnRlZ2VyIGFycmF5IHJlcHJlc2VudGluZyB0aGUgc2hhcGUgb2YgdGhlIGJpbmFyeSBkcm9wb3V0IG1hc2sgdGhhdCB3aWxsXG4gICAqIGJlIG11bHRpcGxpZWQgd2l0aCB0aGUgaW5wdXQuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgaWYgeW91ciBpbnB1dHMgaGF2ZSBzaGFwZSBgKGJhdGNoU2l6ZSwgdGltZXN0ZXBzLCBmZWF0dXJlcylgXG4gICAqIGFuZCB5b3Ugd2FudCB0aGUgZHJvcG91dCBtYXNrIHRvIGJlIHRoZSBzYW1lIGZvciBhbGwgdGltZXN0ZXBzLCB5b3UgY2FuIHVzZVxuICAgKiBgbm9pc2Vfc2hhcGU9KGJhdGNoX3NpemUsIDEsIGZlYXR1cmVzKWAuXG4gICAqL1xuICBub2lzZVNoYXBlPzogbnVtYmVyW107XG5cbiAgLyoqIEFuIGludGVnZXIgdG8gdXNlIGFzIHJhbmRvbSBzZWVkLiAqL1xuICBzZWVkPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgRHJvcG91dCBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRHJvcG91dCc7XG4gIHByaXZhdGUgcmVhZG9ubHkgcmF0ZTogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG5vaXNlU2hhcGU6IG51bWJlcltdO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlZWQ6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBEcm9wb3V0TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5yYXRlID0gTWF0aC5tYXgoTWF0aC5taW4oYXJncy5yYXRlLCAxKSwgMCk7XG4gICAgLy8gU28gdGhhdCB0aGUgc2NhbGFyIGRvZXNuJ3QgZ2V0IHRpZGllZCB1cCBiZXR3ZWVuIGV4ZWN1dGlvbnMuXG4gICAgdGhpcy5ub2lzZVNoYXBlID0gYXJncy5ub2lzZVNoYXBlO1xuICAgIHRoaXMuc2VlZCA9IGFyZ3Muc2VlZDtcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Tm9pc2VTaGFwZShpbnB1dDogVGVuc29yKTogU2hhcGUge1xuICAgIGlmICh0aGlzLm5vaXNlU2hhcGUgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRoaXMubm9pc2VTaGFwZTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgIGNvbnN0IG5vaXNlU2hhcGU6IFNoYXBlID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5vaXNlU2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIG5vaXNlU2hhcGUucHVzaChcbiAgICAgICAgICB0aGlzLm5vaXNlU2hhcGVbaV0gPT0gbnVsbCA/IGlucHV0U2hhcGVbaV0gOiB0aGlzLm5vaXNlU2hhcGVbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gbm9pc2VTaGFwZTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgaWYgKDAgPCB0aGlzLnJhdGUgJiYgdGhpcy5yYXRlIDwgMSkge1xuICAgICAgICBjb25zdCB0cmFpbmluZyA9XG4gICAgICAgICAgICBrd2FyZ3NbJ3RyYWluaW5nJ10gPT0gbnVsbCA/IGZhbHNlIDoga3dhcmdzWyd0cmFpbmluZyddO1xuICAgICAgICBjb25zdCBub2lzZVNoYXBlID0gdGhpcy5nZXROb2lzZVNoYXBlKGlucHV0KTtcbiAgICAgICAgY29uc3Qgb3V0cHV0ID0gSy5pblRyYWluUGhhc2UoXG4gICAgICAgICAgICAoKSA9PiBLLmRyb3BvdXQoaW5wdXQsIHRoaXMucmF0ZSwgbm9pc2VTaGFwZSwgdGhpcy5zZWVkKSxcbiAgICAgICAgICAgICgpID0+IGlucHV0LCB0cmFpbmluZyk7XG4gICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gaW5wdXRzO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgcmF0ZTogdGhpcy5yYXRlLFxuICAgICAgbm9pc2VTaGFwZTogdGhpcy5ub2lzZVNoYXBlLFxuICAgICAgc2VlZDogdGhpcy5zZWVkLFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgZGlzcG9zZSgpOiBEaXNwb3NlUmVzdWx0IHtcbiAgICByZXR1cm4gc3VwZXIuZGlzcG9zZSgpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRHJvcG91dCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBEZW5zZUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKiBQb3NpdGl2ZSBpbnRlZ2VyLCBkaW1lbnNpb25hbGl0eSBvZiB0aGUgb3V0cHV0IHNwYWNlLiAqL1xuICB1bml0czogbnVtYmVyO1xuICAvKipcbiAgICogQWN0aXZhdGlvbiBmdW5jdGlvbiB0byB1c2UuXG4gICAqXG4gICAqIElmIHVuc3BlY2lmaWVkLCBubyBhY3RpdmF0aW9uIGlzIGFwcGxpZWQuXG4gICAqL1xuICBhY3RpdmF0aW9uPzogQWN0aXZhdGlvbklkZW50aWZpZXI7XG4gIC8qKiBXaGV0aGVyIHRvIGFwcGx5IGEgYmlhcy4gKi9cbiAgdXNlQmlhcz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGRlbnNlIGtlcm5lbCB3ZWlnaHRzIG1hdHJpeC5cbiAgICovXG4gIGtlcm5lbEluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBiaWFzIHZlY3Rvci5cbiAgICovXG4gIGJpYXNJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcbiAgLyoqXG4gICAqIElmIHNwZWNpZmllZCwgZGVmaW5lcyBpbnB1dFNoYXBlIGFzIGBbaW5wdXREaW1dYC5cbiAgICovXG4gIGlucHV0RGltPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZvciB0aGUga2VybmVsIHdlaWdodHMuXG4gICAqL1xuICBrZXJuZWxDb25zdHJhaW50PzogQ29uc3RyYWludElkZW50aWZpZXJ8Q29uc3RyYWludDtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGJpYXMgdmVjdG9yLlxuICAgKi9cbiAgYmlhc0NvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBkZW5zZSBrZXJuZWwgd2VpZ2h0cyBtYXRyaXguXG4gICAqL1xuICBrZXJuZWxSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYmlhcyB2ZWN0b3IuXG4gICAqL1xuICBiaWFzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG5cbiAgLyoqXG4gICAqIFJlZ3VsYXJpemVyIGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGFjdGl2YXRpb24uXG4gICAqL1xuICBhY3Rpdml0eVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNwYXRpYWxEcm9wb3V0MURMYXllckNvbmZpZyBleHRlbmRzIExheWVyQ29uZmlnIHtcbiAgLyoqIEZsb2F0IGJldHdlZW4gMCBhbmQgMS4gRnJhY3Rpb24gb2YgdGhlIGlucHV0IHVuaXRzIHRvIGRyb3AuICovXG4gIHJhdGU6IG51bWJlcjtcblxuICAvKiogQW4gaW50ZWdlciB0byB1c2UgYXMgcmFuZG9tIHNlZWQuICovXG4gIHNlZWQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBTcGF0aWFsRHJvcG91dDFEIGV4dGVuZHMgRHJvcG91dCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1NwYXRpYWxEcm9wb3V0MUQnO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFNwYXRpYWxEcm9wb3V0MURMYXllckNvbmZpZykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRoaXMuaW5wdXRTcGVjID0gW3tuZGltOiAzfV07XG4gIH1cblxuICBwcm90ZWN0ZWQgZ2V0Tm9pc2VTaGFwZShpbnB1dDogVGVuc29yKTogU2hhcGUge1xuICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIDEsIGlucHV0U2hhcGVbMl1dO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoU3BhdGlhbERyb3BvdXQxRCk7XG5cbmV4cG9ydCBjbGFzcyBEZW5zZSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRGVuc2UnO1xuICBwcml2YXRlIHVuaXRzOiBudW1iZXI7XG4gIC8vIERlZmF1bHQgYWN0aXZhdGlvbjogTGluZWFyIChub25lKS5cbiAgcHJpdmF0ZSBhY3RpdmF0aW9uOiBBY3RpdmF0aW9uRm4gPSBudWxsO1xuICBwcml2YXRlIHVzZUJpYXMgPSB0cnVlO1xuICBwcml2YXRlIGtlcm5lbEluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcHJpdmF0ZSBiaWFzSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcml2YXRlIGtlcm5lbDogTGF5ZXJWYXJpYWJsZSA9IG51bGw7XG4gIHByaXZhdGUgYmlhczogTGF5ZXJWYXJpYWJsZSA9IG51bGw7XG5cbiAgcmVhZG9ubHkgREVGQVVMVF9LRVJORUxfSU5JVElBTElaRVI6IEluaXRpYWxpemVySWRlbnRpZmllciA9ICdnbG9yb3ROb3JtYWwnO1xuICByZWFkb25seSBERUZBVUxUX0JJQVNfSU5JVElBTElaRVI6IEluaXRpYWxpemVySWRlbnRpZmllciA9ICd6ZXJvcyc7XG4gIHByaXZhdGUgcmVhZG9ubHkga2VybmVsQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmlhc0NvbnN0cmFpbnQ/OiBDb25zdHJhaW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGtlcm5lbFJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmlhc1JlZ3VsYXJpemVyPzogUmVndWxhcml6ZXI7XG5cbiAgY29uc3RydWN0b3IoYXJnczogRGVuc2VMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICBpZiAoYXJncy5iYXRjaElucHV0U2hhcGUgPT0gbnVsbCAmJiBhcmdzLmlucHV0U2hhcGUgPT0gbnVsbCAmJlxuICAgICAgICBhcmdzLmlucHV0RGltICE9IG51bGwpIHtcbiAgICAgIC8vIFRoaXMgbG9naWMgaXMgY29waWVkIGZyb20gTGF5ZXIncyBjb25zdHJ1Y3Rvciwgc2luY2Ugd2UgY2FuJ3RcbiAgICAgIC8vIGRvIGV4YWN0bHkgd2hhdCB0aGUgUHl0aG9uIGNvbnN0cnVjdG9yIGRvZXMgZm9yIERlbnNlKCkuXG4gICAgICBsZXQgYmF0Y2hTaXplOiBudW1iZXIgPSBudWxsO1xuICAgICAgaWYgKGFyZ3MuYmF0Y2hTaXplICE9IG51bGwpIHtcbiAgICAgICAgYmF0Y2hTaXplID0gYXJncy5iYXRjaFNpemU7XG4gICAgICB9XG4gICAgICB0aGlzLmJhdGNoSW5wdXRTaGFwZSA9IFtiYXRjaFNpemUsIGFyZ3MuaW5wdXREaW1dO1xuICAgIH1cblxuICAgIHRoaXMudW5pdHMgPSBhcmdzLnVuaXRzO1xuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnVuaXRzLCAndW5pdHMnKTtcbiAgICB0aGlzLmFjdGl2YXRpb24gPSBnZXRBY3RpdmF0aW9uKGFyZ3MuYWN0aXZhdGlvbik7XG4gICAgaWYgKGFyZ3MudXNlQmlhcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLnVzZUJpYXMgPSBhcmdzLnVzZUJpYXM7XG4gICAgfVxuICAgIHRoaXMua2VybmVsSW5pdGlhbGl6ZXIgPSBnZXRJbml0aWFsaXplcihcbiAgICAgICAgYXJncy5rZXJuZWxJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfS0VSTkVMX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmJpYXNJbml0aWFsaXplciA9XG4gICAgICAgIGdldEluaXRpYWxpemVyKGFyZ3MuYmlhc0luaXRpYWxpemVyIHx8IHRoaXMuREVGQVVMVF9CSUFTX0lOSVRJQUxJWkVSKTtcbiAgICB0aGlzLmtlcm5lbENvbnN0cmFpbnQgPSBnZXRDb25zdHJhaW50KGFyZ3Mua2VybmVsQ29uc3RyYWludCk7XG4gICAgdGhpcy5iaWFzQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5iaWFzQ29uc3RyYWludCk7XG4gICAgdGhpcy5rZXJuZWxSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3Mua2VybmVsUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuYmlhc1JlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5iaWFzUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuYWN0aXZpdHlSZWd1bGFyaXplcik7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuXG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbe21pbk5EaW06IDJ9XTtcbiAgfVxuXG4gIHB1YmxpYyBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBpbnB1dExhc3REaW0gPSBpbnB1dFNoYXBlW2lucHV0U2hhcGUubGVuZ3RoIC0gMV07XG4gICAgaWYgKHRoaXMua2VybmVsID09IG51bGwpIHtcbiAgICAgIHRoaXMua2VybmVsID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2tlcm5lbCcsIFtpbnB1dExhc3REaW0sIHRoaXMudW5pdHNdLCBudWxsLCB0aGlzLmtlcm5lbEluaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMua2VybmVsUmVndWxhcml6ZXIsIHRydWUsIHRoaXMua2VybmVsQ29uc3RyYWludCk7XG4gICAgICBpZiAodGhpcy51c2VCaWFzKSB7XG4gICAgICAgIHRoaXMuYmlhcyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICAgJ2JpYXMnLCBbdGhpcy51bml0c10sIG51bGwsIHRoaXMuYmlhc0luaXRpYWxpemVyLFxuICAgICAgICAgICAgdGhpcy5iaWFzUmVndWxhcml6ZXIsIHRydWUsIHRoaXMuYmlhc0NvbnN0cmFpbnQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaW5wdXRTcGVjID0gW3ttaW5ORGltOiAyLCBheGVzOiB7Wy0xXTogaW5wdXRMYXN0RGltfX1dO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gaW5wdXRTaGFwZS5zbGljZSgpO1xuICAgIG91dHB1dFNoYXBlW291dHB1dFNoYXBlLmxlbmd0aCAtIDFdID0gdGhpcy51bml0cztcbiAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICAvLyBEZW5zZSBsYXllciBhY2NlcHRzIG9ubHkgYSBzaW5nbGUgaW5wdXQuXG4gICAgICBjb25zdCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbk5hbWUgPVxuICAgICAgICAgIG1hcEFjdGl2YXRpb25Ub0Z1c2VkS2VybmVsKHRoaXMuYWN0aXZhdGlvbi5nZXRDbGFzc05hbWUoKSk7XG4gICAgICBsZXQgb3V0cHV0OiBUZW5zb3I7XG5cbiAgICAgIGlmIChmdXNlZEFjdGl2YXRpb25OYW1lICE9IG51bGwpIHtcbiAgICAgICAgb3V0cHV0ID0gSy5kb3QoXG4gICAgICAgICAgICBpbnB1dCwgdGhpcy5rZXJuZWwucmVhZCgpLCBmdXNlZEFjdGl2YXRpb25OYW1lLFxuICAgICAgICAgICAgdGhpcy5iaWFzID8gdGhpcy5iaWFzLnJlYWQoKSA6IG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ID0gSy5kb3QoaW5wdXQsIHRoaXMua2VybmVsLnJlYWQoKSk7XG4gICAgICAgIGlmICh0aGlzLmJpYXMgIT0gbnVsbCkge1xuICAgICAgICAgIG91dHB1dCA9IEsuYmlhc0FkZChvdXRwdXQsIHRoaXMuYmlhcy5yZWFkKCkpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmFjdGl2YXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgIG91dHB1dCA9IHRoaXMuYWN0aXZhdGlvbi5hcHBseShvdXRwdXQpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgIHVuaXRzOiB0aGlzLnVuaXRzLFxuICAgICAgYWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pLFxuICAgICAgdXNlQmlhczogdGhpcy51c2VCaWFzLFxuICAgICAga2VybmVsSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMua2VybmVsSW5pdGlhbGl6ZXIpLFxuICAgICAgYmlhc0luaXRpYWxpemVyOiBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLmJpYXNJbml0aWFsaXplciksXG4gICAgICBrZXJuZWxSZWd1bGFyaXplcjogc2VyaWFsaXplUmVndWxhcml6ZXIodGhpcy5rZXJuZWxSZWd1bGFyaXplciksXG4gICAgICBiaWFzUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmlhc1JlZ3VsYXJpemVyKSxcbiAgICAgIGFjdGl2aXR5UmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYWN0aXZpdHlSZWd1bGFyaXplciksXG4gICAgICBrZXJuZWxDb25zdHJhaW50OiBzZXJpYWxpemVDb25zdHJhaW50KHRoaXMua2VybmVsQ29uc3RyYWludCksXG4gICAgICBiaWFzQ29uc3RyYWludDogc2VyaWFsaXplQ29uc3RyYWludCh0aGlzLmJpYXNDb25zdHJhaW50KVxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoRGVuc2UpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgRmxhdHRlbkxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKiBJbWFnZSBkYXRhIGZvcm1hdDogY2hhbm5lbHNMYXN0IChkZWZhdWx0KSBvciBjaGFubmVsc0ZpcnN0LiAqL1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbn1cblxuZXhwb3J0IGNsYXNzIEZsYXR0ZW4gZXh0ZW5kcyBMYXllciB7XG4gIHByaXZhdGUgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdGbGF0dGVuJztcbiAgY29uc3RydWN0b3IoYXJncz86IEZsYXR0ZW5MYXllckFyZ3MpIHtcbiAgICBhcmdzID0gYXJncyB8fCB7fTtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFt7bWluTkRpbTogM31dO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9IGFyZ3MuZGF0YUZvcm1hdDtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBmb3IgKGNvbnN0IGRpbSBvZiBpbnB1dFNoYXBlLnNsaWNlKDEpKSB7XG4gICAgICBpZiAoZGltID09IG51bGwpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICBgVGhlIHNoYXBlIG9mIHRoZSBpbnB1dCB0byBcIkZsYXR0ZW5cIiBpcyBub3QgZnVsbHkgZGVmaW5lZCBgICtcbiAgICAgICAgICAgIGAoZ290ICR7aW5wdXRTaGFwZS5zbGljZSgxKX0pLiBNYWtlIHN1cmUgdG8gcGFzcyBhIGNvbXBsZXRlIGAgK1xuICAgICAgICAgICAgYFwiaW5wdXRfc2hhcGVcIiBvciBcImJhdGNoX2lucHV0X3NoYXBlXCIgYXJndW1lbnQgdG8gdGhlIGZpcnN0IGAgK1xuICAgICAgICAgICAgYGxheWVyIGluIHlvdXIgbW9kZWwuYCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgYXJyYXlQcm9kKGlucHV0U2hhcGUsIDEpXTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcblxuICAgICAgbGV0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnICYmIGlucHV0LnJhbmsgPiAxKSB7XG4gICAgICAgIGNvbnN0IHBlcm11dGF0aW9uOiBudW1iZXJbXSA9IFswXTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCBpbnB1dC5yYW5rOyArK2kpIHtcbiAgICAgICAgICBwZXJtdXRhdGlvbi5wdXNoKGkpO1xuICAgICAgICB9XG4gICAgICAgIHBlcm11dGF0aW9uLnB1c2goMSk7XG4gICAgICAgIGlucHV0ID0gdHJhbnNwb3NlKGlucHV0LCBwZXJtdXRhdGlvbik7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBLLmJhdGNoRmxhdHRlbihpbnB1dCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHt9O1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgIT0gbnVsbCkge1xuICAgICAgY29uZmlnWydkYXRhRm9ybWF0J10gPSB0aGlzLmRhdGFGb3JtYXQ7XG4gICAgfVxuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEZsYXR0ZW4pO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQWN0aXZhdGlvbkxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBhY3RpdmF0aW9uIGZ1bmN0aW9uIHRvIHVzZS5cbiAgICovXG4gIGFjdGl2YXRpb246IEFjdGl2YXRpb25JZGVudGlmaWVyO1xufVxuXG5leHBvcnQgY2xhc3MgQWN0aXZhdGlvbiBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQWN0aXZhdGlvbic7XG4gIGFjdGl2YXRpb246IEFjdGl2YXRpb25GbjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBBY3RpdmF0aW9uTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuYWN0aXZhdGlvbiA9IGdldEFjdGl2YXRpb24oYXJncy5hY3RpdmF0aW9uKTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgcmV0dXJuIHRoaXMuYWN0aXZhdGlvbi5hcHBseShpbnB1dCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7YWN0aXZhdGlvbjogc2VyaWFsaXplQWN0aXZhdGlvbih0aGlzLmFjdGl2YXRpb24pfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhBY3RpdmF0aW9uKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFJlc2hhcGVMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKiogVGhlIHRhcmdldCBzaGFwZS4gRG9lcyBub3QgaW5jbHVkZSB0aGUgYmF0Y2ggYXhpcy4gKi9cbiAgdGFyZ2V0U2hhcGU6IFNoYXBlO1xufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgUmVwZWF0VmVjdG9yTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIFRoZSBpbnRlZ2VyIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIGlucHV0LlxuICAgKi9cbiAgbjogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgUmVwZWF0VmVjdG9yIGV4dGVuZHMgTGF5ZXIge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdSZXBlYXRWZWN0b3InO1xuICByZWFkb25seSBuOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYXJnczogUmVwZWF0VmVjdG9yTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5uID0gYXJncy5uO1xuICAgIHRoaXMuaW5wdXRTcGVjID0gW3tuZGltOiAyfV07XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGUpOiBTaGFwZSB7XG4gICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCB0aGlzLm4sIGlucHV0U2hhcGVbMV1dO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIHJldHVybiBLLnJlcGVhdChpbnB1dHMsIHRoaXMubik7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBuOiB0aGlzLm4sXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhSZXBlYXRWZWN0b3IpO1xuXG5leHBvcnQgY2xhc3MgUmVzaGFwZSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUmVzaGFwZSc7XG4gIHByaXZhdGUgdGFyZ2V0U2hhcGU6IFNoYXBlO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFJlc2hhcGVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnRhcmdldFNoYXBlID0gYXJncy50YXJnZXRTaGFwZTtcblxuICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFsbCB1bmtub3duIGRpbWVuc2lvbnMgYXJlIHJlcHJlc2VudGVkIGFzIGBudWxsYC5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMudGFyZ2V0U2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmlzVW5rbm93bih0aGlzLnRhcmdldFNoYXBlW2ldKSkge1xuICAgICAgICB0aGlzLnRhcmdldFNoYXBlW2ldID0gbnVsbDtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGlzVW5rbm93bihkaW06IG51bWJlcik6IGJvb2xlYW4ge1xuICAgIHJldHVybiBkaW0gPCAwIHx8IGRpbSA9PSBudWxsO1xuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuZCByZXBsYWNlcyBhIG1pc3NpbmcgZGltZW5zaW9uIGluIG91dHB1dCBzaGFwZS5cbiAgICpcbiAgICogVGhpcyBpcyBhIG5lYXIgZGlyZWN0IHBvcnQgb2YgdGhlIGludGVybmFsIE51bXB5IGZ1bmN0aW9uXG4gICAqIGBfZml4X3Vua25vd25fZGltZW5zaW9uYCBpbiBgbnVtcHkvY29yZS9zcmMvbXVsdGlhcnJheS9zaGFwZS5jYC5cbiAgICpcbiAgICogQHBhcmFtIGlucHV0U2hhcGU6IE9yaWdpbmFsIHNoYXBlIG9mIGFycmF5IGJlZ2luIHJlc2hhcGUuXG4gICAqIEBwYXJhbSBvdXRwdXRTaGFwZTogVGFyZ2V0IHNoYXBlIG9mIHRoZSBhcnJheSwgd2l0aCBhdCBtb3N0IGEgc2luZ2xlXG4gICAqIGBudWxsYCBvciBuZWdhdGl2ZSBudW1iZXIsIHdoaWNoIGluZGljYXRlcyBhbiB1bmRlcmRldGVybWluZWQgZGltZW5zaW9uXG4gICAqIHRoYXQgc2hvdWxkIGJlIGRlcml2ZWQgZnJvbSBgaW5wdXRTaGFwZWAgYW5kIHRoZSBrbm93biBkaW1lbnNpb25zIG9mXG4gICAqICAgYG91dHB1dFNoYXBlYC5cbiAgICogQHJldHVybnM6IFRoZSBvdXRwdXQgc2hhcGUgd2l0aCBgbnVsbGAgcmVwbGFjZWQgd2l0aCBpdHMgY29tcHV0ZWQgdmFsdWUuXG4gICAqIEB0aHJvd3M6IFZhbHVlRXJyb3I6IElmIGBpbnB1dFNoYXBlYCBhbmQgYG91dHB1dFNoYXBlYCBkbyBub3QgbWF0Y2guXG4gICAqL1xuICBwcml2YXRlIGZpeFVua25vd25EaW1lbnNpb24oaW5wdXRTaGFwZTogU2hhcGUsIG91dHB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICBjb25zdCBlcnJvck1zZyA9ICdUb3RhbCBzaXplIG9mIG5ldyBhcnJheSBtdXN0IGJlIHVuY2hhbmdlZC4nO1xuICAgIGNvbnN0IGZpbmFsU2hhcGUgPSBvdXRwdXRTaGFwZS5zbGljZSgpO1xuICAgIGxldCBrbm93biA9IDE7XG4gICAgbGV0IHVua25vd24gPSBudWxsO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmluYWxTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3QgZGltID0gZmluYWxTaGFwZVtpXTtcbiAgICAgIGlmICh0aGlzLmlzVW5rbm93bihkaW0pKSB7XG4gICAgICAgIGlmICh1bmtub3duID09PSBudWxsKSB7XG4gICAgICAgICAgdW5rbm93biA9IGk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ0NhbiBvbmx5IHNwZWNpZml5IG9uZSB1bmtub3duIGRpbWVuc2lvbi4nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAga25vd24gKj0gZGltO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbmFsU2l6ZSA9IGFycmF5UHJvZChpbnB1dFNoYXBlKTtcbiAgICBpZiAodW5rbm93biAhPT0gbnVsbCkge1xuICAgICAgaWYgKGtub3duID09PSAwIHx8IG9yaWdpbmFsU2l6ZSAlIGtub3duICE9PSAwKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGVycm9yTXNnKTtcbiAgICAgIH1cbiAgICAgIGZpbmFsU2hhcGVbdW5rbm93bl0gPSBvcmlnaW5hbFNpemUgLyBrbm93bjtcbiAgICB9IGVsc2UgaWYgKG9yaWdpbmFsU2l6ZSAhPT0ga25vd24pIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKGVycm9yTXNnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmluYWxTaGFwZTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICBsZXQgYW55VW5rbm93bkRpbXMgPSBmYWxzZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0U2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmlzVW5rbm93bihpbnB1dFNoYXBlW2ldKSkge1xuICAgICAgICBhbnlVbmtub3duRGltcyA9IHRydWU7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChhbnlVbmtub3duRGltcykge1xuICAgICAgcmV0dXJuIGlucHV0U2hhcGUuc2xpY2UoMCwgMSkuY29uY2F0KHRoaXMudGFyZ2V0U2hhcGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRTaGFwZS5zbGljZSgwLCAxKS5jb25jYXQoXG4gICAgICAgICAgdGhpcy5maXhVbmtub3duRGltZW5zaW9uKGlucHV0U2hhcGUuc2xpY2UoMSksIHRoaXMudGFyZ2V0U2hhcGUpKTtcbiAgICB9XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICBjb25zdCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICAgIGNvbnN0IG91dHB1dFNoYXBlID0gaW5wdXRTaGFwZS5zbGljZSgwLCAxKS5jb25jYXQoXG4gICAgICAgICAgdGhpcy5maXhVbmtub3duRGltZW5zaW9uKGlucHV0U2hhcGUuc2xpY2UoMSksIHRoaXMudGFyZ2V0U2hhcGUpKTtcbiAgICAgIHJldHVybiByZXNoYXBlKGlucHV0LCBvdXRwdXRTaGFwZSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICB0YXJnZXRTaGFwZTogdGhpcy50YXJnZXRTaGFwZSxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFJlc2hhcGUpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgUGVybXV0ZUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBcnJheSBvZiBpbnRlZ2Vycy4gUGVybXV0YXRpb24gcGF0dGVybi4gRG9lcyBub3QgaW5jbHVkZSB0aGVcbiAgICogc2FtcGxlIChiYXRjaCkgZGltZW5zaW9uLiBJbmRleCBzdGFydHMgYXQgMS5cbiAgICogRm9yIGluc3RhbmNlLCBgWzIsIDFdYCBwZXJtdXRlcyB0aGUgZmlyc3QgYW5kIHNlY29uZCBkaW1lbnNpb25zXG4gICAqIG9mIHRoZSBpbnB1dC5cbiAgICovXG4gIGRpbXM6IG51bWJlcltdO1xufVxuXG5leHBvcnQgY2xhc3MgUGVybXV0ZSBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnUGVybXV0ZSc7XG4gIHJlYWRvbmx5IGRpbXM6IG51bWJlcltdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpbXNJbmNsdWRpbmdCYXRjaDogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3IoYXJnczogUGVybXV0ZUxheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIGlmIChhcmdzLmRpbXMgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdSZXF1aXJlZCBjb25maWd1cmF0aW9uIGZpZWxkIGBkaW1zYCBpcyBtaXNzaW5nIGR1cmluZyBQZXJtdXRlICcgK1xuICAgICAgICAgICdjb25zdHJ1Y3RvciBjYWxsLicpO1xuICAgIH1cbiAgICBpZiAoIUFycmF5LmlzQXJyYXkoYXJncy5kaW1zKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdQZXJtdXRlIGNvbnN0cnVjdG9yIHJlcXVpcmVzIGBkaW1zYCB0byBiZSBhbiBBcnJheSwgYnV0IHJlY2VpdmVkICcgK1xuICAgICAgICAgIGAke2FyZ3MuZGltc30gaW5zdGVhZC5gKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGUgdmFsaWRpdHkgb2YgdGhlIHBlcm11dGF0aW9uIGluZGljZXMuXG4gICAgY29uc3QgZXhwZWN0ZWRTb3J0ZWRJbmRpY2VzID0gcmFuZ2UoMSwgYXJncy5kaW1zLmxlbmd0aCArIDEpO1xuICAgIGlmICghdXRpbC5hcnJheXNFcXVhbChhcmdzLmRpbXMuc2xpY2UoKS5zb3J0KCksIGV4cGVjdGVkU29ydGVkSW5kaWNlcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSW52YWxpZCBwZXJtdXRhdGlvbiBgZGltc2A6ICcgKyBKU09OLnN0cmluZ2lmeShhcmdzLmRpbXMpICtcbiAgICAgICAgICAnIGBkaW1zYCBtdXN0IGNvbnRhaW4gY29uc2VjdXRpdmUgaW50ZWdlcnMgc3RhcnRpbmcgZnJvbSAxLicpO1xuICAgIH1cblxuICAgIHRoaXMuZGltcyA9IGFyZ3MuZGltcztcbiAgICB0aGlzLmRpbXNJbmNsdWRpbmdCYXRjaCA9IFswXS5jb25jYXQodGhpcy5kaW1zKTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiB0aGlzLmRpbXMubGVuZ3RoICsgMX0pXTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IGlucHV0U2hhcGUuc2xpY2UoKTtcbiAgICB0aGlzLmRpbXMuZm9yRWFjaCgoZGltOiBudW1iZXIsIGk6IG51bWJlcikgPT4ge1xuICAgICAgb3V0cHV0U2hhcGVbaSArIDFdID0gKGlucHV0U2hhcGUgYXMgU2hhcGUpW2RpbV07XG4gICAgfSk7XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0cmFuc3Bvc2UoZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLCB0aGlzLmRpbXNJbmNsdWRpbmdCYXRjaCk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBkaW1zOiB0aGlzLmRpbXMsXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhQZXJtdXRlKTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIE1hc2tpbmdBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIE1hc2tpbmcgVmFsdWUuIERlZmF1bHRzIHRvIGAwLjBgLlxuICAgKi9cbiAgbWFza1ZhbHVlPzogbnVtYmVyO1xufVxuXG5leHBvcnQgY2xhc3MgTWFza2luZyBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWFza2luZyc7XG4gIG1hc2tWYWx1ZTogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBNYXNraW5nQXJncykge1xuICAgIHN1cGVyKGFyZ3MgPT0gbnVsbCA/IHt9IDogYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIGlmIChhcmdzICE9IG51bGwpIHtcbiAgICAgIHRoaXMubWFza1ZhbHVlID0gYXJncy5tYXNrVmFsdWUgPT0gbnVsbCA/IDAgOiBhcmdzLm1hc2tWYWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tYXNrVmFsdWUgPSAwO1xuICAgIH1cbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBnZXRDb25maWcoKSB7XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHttYXNrVmFsdWU6IHRoaXMubWFza1ZhbHVlfTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yIHtcbiAgICBjb25zdCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICBjb25zdCBheGlzID0gLTE7XG4gICAgcmV0dXJuIGFueShub3RFcXVhbChpbnB1dCwgdGhpcy5tYXNrVmFsdWUpLCBheGlzKTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgY29uc3QgYXhpcyA9IC0xO1xuICAgICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgICAgY29uc3QgYm9vbGVhbk1hc2sgPSBhbnkobm90RXF1YWwoaW5wdXQsIHRoaXMubWFza1ZhbHVlKSwgYXhpcywga2VlcERpbXMpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gbXVsKGlucHV0LCBjYXN0KGJvb2xlYW5NYXNrLCBpbnB1dC5kdHlwZSkpO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE1hc2tpbmcpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Embedding Layer.\n *\n * Original source: keras/constraints.py\n */\nimport { notEqual, reshape, serialization, tidy, zerosLike } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { Layer } from '../engine/topology';\nimport { ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport * as generic_utils from '../utils/generic_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nexport class Embedding extends Layer {\n    constructor(args) {\n        super(args);\n        this.embeddings = null;\n        this.DEFAULT_EMBEDDINGS_INITIALIZER = 'randomUniform';\n        if (args.batchInputShape == null && args.inputShape == null) {\n            // Porting Note: This logic is copied from Layer's constructor, since we\n            // can't do exactly what the Python constructor does for Embedding().\n            // Specifically, the super constructor can not be called after the\n            // mutation of the `config` argument.\n            let batchSize = null;\n            if (args.batchSize != null) {\n                batchSize = args.batchSize;\n            }\n            if (args.inputLength == null) {\n                // Fix super-constructor to what it would have done if\n                // 'config.inputShape' were (None, )\n                this.batchInputShape = [batchSize, null];\n            }\n            else {\n                // Fix super-constructor to what it would have done if\n                // 'config.inputShape' were (config.inputLength, )\n                this.batchInputShape =\n                    [batchSize].concat(generic_utils.toList(args.inputLength));\n            }\n        }\n        this.inputDim = args.inputDim;\n        generic_utils.assertPositiveInteger(this.inputDim, 'inputDim');\n        this.outputDim = args.outputDim;\n        generic_utils.assertPositiveInteger(this.outputDim, 'outputDim');\n        this.embeddingsInitializer = getInitializer(args.embeddingsInitializer || this.DEFAULT_EMBEDDINGS_INITIALIZER);\n        this.embeddingsRegularizer = getRegularizer(args.embeddingsRegularizer);\n        this.activityRegularizer = getRegularizer(args.activityRegularizer);\n        this.embeddingsConstraint = getConstraint(args.embeddingsConstraint);\n        this.maskZero = args.maskZero;\n        this.supportsMasking = args.maskZero;\n        this.inputLength = args.inputLength;\n    }\n    build(inputShape) {\n        this.embeddings = this.addWeight('embeddings', [this.inputDim, this.outputDim], this.dtype, this.embeddingsInitializer, this.embeddingsRegularizer, true, this.embeddingsConstraint);\n        this.built = true;\n    }\n    // Override warnOnIncompatibleInputShape because an embedding layer allows\n    // the input to have varying ranks.\n    warnOnIncompatibleInputShape(inputShape) { }\n    computeMask(inputs, mask) {\n        return tidy(() => {\n            if (!this.maskZero) {\n                return null;\n            }\n            else {\n                inputs = getExactlyOneTensor(inputs);\n                return notEqual(inputs, zerosLike(inputs));\n            }\n        });\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        if (this.inputLength == null) {\n            return [...inputShape, this.outputDim];\n        }\n        // inputLength can be an array if input is 3D or higher.\n        const inLens = generic_utils.toList(this.inputLength);\n        if (inLens.length !== inputShape.length - 1) {\n            throw new ValueError(`\"inputLength\" is ${this.inputLength}, but received ` +\n                `input shape has shape ${inputShape}`);\n        }\n        else {\n            let i = 0;\n            for (let k = 0; k < inLens.length; ++k) {\n                const s1 = inLens[k];\n                const s2 = inputShape[k + 1];\n                if ((s1 != null) && (s2 != null) && (s1 !== s2)) {\n                    throw new ValueError(`\"inputLength\" is ${this.inputLength}, but received ` +\n                        `input shape has shape ${inputShape}`);\n                }\n                else if (s1 == null) {\n                    inLens[i] = s2;\n                }\n                i++;\n            }\n        }\n        return [inputShape[0], ...inLens, this.outputDim];\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            // Embedding layer accepts only a single input.\n            let input = getExactlyOneTensor(inputs);\n            if (input.dtype !== 'int32') {\n                input = K.cast(input, 'int32');\n            }\n            const output = K.gather(this.embeddings.read(), reshape(input, [input.size]));\n            return reshape(output, getExactlyOneShape(this.computeOutputShape(input.shape)));\n        });\n    }\n    getConfig() {\n        const config = {\n            inputDim: this.inputDim,\n            outputDim: this.outputDim,\n            embeddingsInitializer: serializeInitializer(this.embeddingsInitializer),\n            embeddingsRegularizer: serializeRegularizer(this.embeddingsRegularizer),\n            activityRegularizer: serializeRegularizer(this.activityRegularizer),\n            embeddingsConstraint: serializeConstraint(this.embeddingsConstraint),\n            maskZero: this.maskZero,\n            inputLength: this.inputLength\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nEmbedding.className = 'Embedding';\nserialization.registerClass(Embedding);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkaW5ncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvZW1iZWRkaW5ncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOzs7O0dBSUc7QUFDSCxPQUFPLEVBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQVUsSUFBSSxFQUFFLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWhHLE9BQU8sS0FBSyxDQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFtQyxhQUFhLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNwRyxPQUFPLEVBQUMsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDcEQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQWlEN0UsTUFBTSxPQUFPLFNBQVUsU0FBUSxLQUFLO0lBZ0JsQyxZQUFZLElBQXdCO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQVJOLGVBQVUsR0FBa0IsSUFBSSxDQUFDO1FBRWhDLG1DQUE4QixHQUNuQyxlQUFlLENBQUM7UUFNbEIsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksRUFBRTtZQUMzRCx3RUFBd0U7WUFDeEUscUVBQXFFO1lBQ3JFLGtFQUFrRTtZQUNsRSxxQ0FBcUM7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QUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQzs7QUFwSUQsa0JBQWtCO0FBQ1gsbUJBQVMsR0FBRyxXQUFXLENBQUM7QUFxSWpDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBFbWJlZGRpbmcgTGF5ZXIuXG4gKlxuICogT3JpZ2luYWwgc291cmNlOiBrZXJhcy9jb25zdHJhaW50cy5weVxuICovXG5pbXBvcnQge25vdEVxdWFsLCByZXNoYXBlLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHksIHplcm9zTGlrZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgSyBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge0NvbnN0cmFpbnQsIENvbnN0cmFpbnRJZGVudGlmaWVyLCBnZXRDb25zdHJhaW50LCBzZXJpYWxpemVDb25zdHJhaW50fSBmcm9tICcuLi9jb25zdHJhaW50cyc7XG5pbXBvcnQge0xheWVyLCBMYXllckFyZ3N9IGZyb20gJy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQge1ZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge2dldEluaXRpYWxpemVyLCBJbml0aWFsaXplciwgSW5pdGlhbGl6ZXJJZGVudGlmaWVyLCBzZXJpYWxpemVJbml0aWFsaXplcn0gZnJvbSAnLi4vaW5pdGlhbGl6ZXJzJztcbmltcG9ydCB7U2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtnZXRSZWd1bGFyaXplciwgUmVndWxhcml6ZXIsIFJlZ3VsYXJpemVySWRlbnRpZmllciwgc2VyaWFsaXplUmVndWxhcml6ZXJ9IGZyb20gJy4uL3JlZ3VsYXJpemVycyc7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0ICogYXMgZ2VuZXJpY191dGlscyBmcm9tICcuLi91dGlscy9nZW5lcmljX3V0aWxzJztcbmltcG9ydCB7Z2V0RXhhY3RseU9uZVNoYXBlLCBnZXRFeGFjdGx5T25lVGVuc29yfSBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5pbXBvcnQge0xheWVyVmFyaWFibGV9IGZyb20gJy4uL3ZhcmlhYmxlcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBFbWJlZGRpbmdMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW50ZWdlciA+IDAuIFNpemUgb2YgdGhlIHZvY2FidWxhcnksIGkuZS4gbWF4aW11bSBpbnRlZ2VyIGluZGV4ICsgMS5cbiAgICovXG4gIGlucHV0RGltOiBudW1iZXI7XG4gIC8qKlxuICAgKiBJbnRlZ2VyID49IDAuIERpbWVuc2lvbiBvZiB0aGUgZGVuc2UgZW1iZWRkaW5nLlxuICAgKi9cbiAgb3V0cHV0RGltOiBudW1iZXI7XG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGBlbWJlZGRpbmdzYCBtYXRyaXguXG4gICAqL1xuICBlbWJlZGRpbmdzSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmdW5jdGlvbiBhcHBsaWVkIHRvIHRoZSBgZW1iZWRkaW5nc2AgbWF0cml4LlxuICAgKi9cbiAgZW1iZWRkaW5nc1JlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuICAvKipcbiAgICogUmVndWxhcml6ZXIgZnVuY3Rpb24gYXBwbGllZCB0byB0aGUgYWN0aXZhdGlvbi5cbiAgICovXG4gIGFjdGl2aXR5UmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZ1bmN0aW9uIGFwcGxpZWQgdG8gdGhlIGBlbWJlZGRpbmdzYCBtYXRyaXguXG4gICAqL1xuICBlbWJlZGRpbmdzQ29uc3RyYWludD86IENvbnN0cmFpbnRJZGVudGlmaWVyfENvbnN0cmFpbnQ7XG4gIC8qKlxuICAgKiBXaGV0aGVyIHRoZSBpbnB1dCB2YWx1ZSAwIGlzIGEgc3BlY2lhbCBcInBhZGRpbmdcIiB2YWx1ZSB0aGF0IHNob3VsZCBiZVxuICAgKiBtYXNrZWQgb3V0LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIHJlY3VycmVudCBsYXllcnMgd2hpY2ggbWF5IHRha2VcbiAgICogdmFyaWFibGUgbGVuZ3RoIGlucHV0LlxuICAgKlxuICAgKiBJZiB0aGlzIGlzIGBUcnVlYCB0aGVuIGFsbCBzdWJzZXF1ZW50IGxheWVycyBpbiB0aGUgbW9kZWwgbmVlZCB0byBzdXBwb3J0XG4gICAqIG1hc2tpbmcgb3IgYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLiBJZiBtYXNrWmVybyBpcyBzZXQgdG8gYFRydWVgLCBhcyBhXG4gICAqIGNvbnNlcXVlbmNlLCBpbmRleCAwIGNhbm5vdCBiZSB1c2VkIGluIHRoZSB2b2NhYnVsYXJ5IChpbnB1dERpbSBzaG91bGRcbiAgICogZXF1YWwgc2l6ZSBvZiB2b2NhYnVsYXJ5ICsgMSkuXG4gICAqL1xuICBtYXNrWmVybz86IGJvb2xlYW47XG4gIC8qKlxuICAgKiBMZW5ndGggb2YgaW5wdXQgc2VxdWVuY2VzLCB3aGVuIGl0IGlzIGNvbnN0YW50LlxuICAgKlxuICAgKiBUaGlzIGFyZ3VtZW50IGlzIHJlcXVpcmVkIGlmIHlvdSBhcmUgZ29pbmcgdG8gY29ubmVjdCBgZmxhdHRlbmAgdGhlblxuICAgKiBgZGVuc2VgIGxheWVycyB1cHN0cmVhbSAod2l0aG91dCBpdCwgdGhlIHNoYXBlIG9mIHRoZSBkZW5zZSBvdXRwdXRzIGNhbm5vdFxuICAgKiBiZSBjb21wdXRlZCkuXG4gICAqL1xuICBpbnB1dExlbmd0aD86IG51bWJlcnxudW1iZXJbXTtcbn1cblxuZXhwb3J0IGNsYXNzIEVtYmVkZGluZyBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnRW1iZWRkaW5nJztcbiAgcHJpdmF0ZSBpbnB1dERpbTogbnVtYmVyO1xuICBwcml2YXRlIG91dHB1dERpbTogbnVtYmVyO1xuICBwcml2YXRlIGVtYmVkZGluZ3NJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgbWFza1plcm86IGJvb2xlYW47XG4gIHByaXZhdGUgaW5wdXRMZW5ndGg6IG51bWJlcnxudW1iZXJbXTtcblxuICBwcml2YXRlIGVtYmVkZGluZ3M6IExheWVyVmFyaWFibGUgPSBudWxsO1xuXG4gIHJlYWRvbmx5IERFRkFVTFRfRU1CRURESU5HU19JTklUSUFMSVpFUjogSW5pdGlhbGl6ZXJJZGVudGlmaWVyID1cbiAgICAgICdyYW5kb21Vbmlmb3JtJztcbiAgcHJpdmF0ZSByZWFkb25seSBlbWJlZGRpbmdzUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcjtcbiAgcHJpdmF0ZSByZWFkb25seSBlbWJlZGRpbmdzQ29uc3RyYWludD86IENvbnN0cmFpbnQ7XG5cbiAgY29uc3RydWN0b3IoYXJnczogRW1iZWRkaW5nTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgaWYgKGFyZ3MuYmF0Y2hJbnB1dFNoYXBlID09IG51bGwgJiYgYXJncy5pbnB1dFNoYXBlID09IG51bGwpIHtcbiAgICAgIC8vIFBvcnRpbmcgTm90ZTogVGhpcyBsb2dpYyBpcyBjb3BpZWQgZnJvbSBMYXllcidzIGNvbnN0cnVjdG9yLCBzaW5jZSB3ZVxuICAgICAgLy8gY2FuJ3QgZG8gZXhhY3RseSB3aGF0IHRoZSBQeXRob24gY29uc3RydWN0b3IgZG9lcyBmb3IgRW1iZWRkaW5nKCkuXG4gICAgICAvLyBTcGVjaWZpY2FsbHksIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBjYW4gbm90IGJlIGNhbGxlZCBhZnRlciB0aGVcbiAgICAgIC8vIG11dGF0aW9uIG9mIHRoZSBgY29uZmlnYCBhcmd1bWVudC5cbiAgICAgIGxldCBiYXRjaFNpemU6IG51bWJlciA9IG51bGw7XG4gICAgICBpZiAoYXJncy5iYXRjaFNpemUgIT0gbnVsbCkge1xuICAgICAgICBiYXRjaFNpemUgPSBhcmdzLmJhdGNoU2l6ZTtcbiAgICAgIH1cbiAgICAgIGlmIChhcmdzLmlucHV0TGVuZ3RoID09IG51bGwpIHtcbiAgICAgICAgLy8gRml4IHN1cGVyLWNvbnN0cnVjdG9yIHRvIHdoYXQgaXQgd291bGQgaGF2ZSBkb25lIGlmXG4gICAgICAgIC8vICdjb25maWcuaW5wdXRTaGFwZScgd2VyZSAoTm9uZSwgKVxuICAgICAgICB0aGlzLmJhdGNoSW5wdXRTaGFwZSA9IFtiYXRjaFNpemUsIG51bGxdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRml4IHN1cGVyLWNvbnN0cnVjdG9yIHRvIHdoYXQgaXQgd291bGQgaGF2ZSBkb25lIGlmXG4gICAgICAgIC8vICdjb25maWcuaW5wdXRTaGFwZScgd2VyZSAoY29uZmlnLmlucHV0TGVuZ3RoLCApXG4gICAgICAgIHRoaXMuYmF0Y2hJbnB1dFNoYXBlID1cbiAgICAgICAgICAgIFtiYXRjaFNpemVdLmNvbmNhdChnZW5lcmljX3V0aWxzLnRvTGlzdChhcmdzLmlucHV0TGVuZ3RoKSk7XG4gICAgICB9XG4gICAgfVxuICAgIHRoaXMuaW5wdXREaW0gPSBhcmdzLmlucHV0RGltO1xuICAgIGdlbmVyaWNfdXRpbHMuYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHRoaXMuaW5wdXREaW0sICdpbnB1dERpbScpO1xuICAgIHRoaXMub3V0cHV0RGltID0gYXJncy5vdXRwdXREaW07XG4gICAgZ2VuZXJpY191dGlscy5hc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy5vdXRwdXREaW0sICdvdXRwdXREaW0nKTtcbiAgICB0aGlzLmVtYmVkZGluZ3NJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKFxuICAgICAgICBhcmdzLmVtYmVkZGluZ3NJbml0aWFsaXplciB8fCB0aGlzLkRFRkFVTFRfRU1CRURESU5HU19JTklUSUFMSVpFUik7XG4gICAgdGhpcy5lbWJlZGRpbmdzUmVndWxhcml6ZXIgPSBnZXRSZWd1bGFyaXplcihhcmdzLmVtYmVkZGluZ3NSZWd1bGFyaXplcik7XG4gICAgdGhpcy5hY3Rpdml0eVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5hY3Rpdml0eVJlZ3VsYXJpemVyKTtcbiAgICB0aGlzLmVtYmVkZGluZ3NDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLmVtYmVkZGluZ3NDb25zdHJhaW50KTtcbiAgICB0aGlzLm1hc2taZXJvID0gYXJncy5tYXNrWmVybztcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IGFyZ3MubWFza1plcm87XG4gICAgdGhpcy5pbnB1dExlbmd0aCA9IGFyZ3MuaW5wdXRMZW5ndGg7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIHRoaXMuZW1iZWRkaW5ncyA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAnZW1iZWRkaW5ncycsIFt0aGlzLmlucHV0RGltLCB0aGlzLm91dHB1dERpbV0sIHRoaXMuZHR5cGUsXG4gICAgICAgIHRoaXMuZW1iZWRkaW5nc0luaXRpYWxpemVyLCB0aGlzLmVtYmVkZGluZ3NSZWd1bGFyaXplciwgdHJ1ZSxcbiAgICAgICAgdGhpcy5lbWJlZGRpbmdzQ29uc3RyYWludCk7XG4gICAgdGhpcy5idWlsdCA9IHRydWU7XG4gIH1cblxuICAvLyBPdmVycmlkZSB3YXJuT25JbmNvbXBhdGlibGVJbnB1dFNoYXBlIGJlY2F1c2UgYW4gZW1iZWRkaW5nIGxheWVyIGFsbG93c1xuICAvLyB0aGUgaW5wdXQgdG8gaGF2ZSB2YXJ5aW5nIHJhbmtzLlxuICBwcm90ZWN0ZWQgd2Fybk9uSW5jb21wYXRpYmxlSW5wdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSkge31cblxuICBjb21wdXRlTWFzayhpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwgbWFzaz86IFRlbnNvcnxUZW5zb3JbXSk6IFRlbnNvciB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKCF0aGlzLm1hc2taZXJvKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaW5wdXRzID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgICByZXR1cm4gbm90RXF1YWwoaW5wdXRzLCB6ZXJvc0xpa2UoaW5wdXRzKSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgaWYgKHRoaXMuaW5wdXRMZW5ndGggPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIFsuLi5pbnB1dFNoYXBlLCB0aGlzLm91dHB1dERpbV07XG4gICAgfVxuICAgIC8vIGlucHV0TGVuZ3RoIGNhbiBiZSBhbiBhcnJheSBpZiBpbnB1dCBpcyAzRCBvciBoaWdoZXIuXG4gICAgY29uc3QgaW5MZW5zOiBudW1iZXJbXSA9IGdlbmVyaWNfdXRpbHMudG9MaXN0KHRoaXMuaW5wdXRMZW5ndGgpO1xuICAgIGlmIChpbkxlbnMubGVuZ3RoICE9PSBpbnB1dFNoYXBlLmxlbmd0aCAtIDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBcImlucHV0TGVuZ3RoXCIgaXMgJHt0aGlzLmlucHV0TGVuZ3RofSwgYnV0IHJlY2VpdmVkIGAgK1xuICAgICAgICAgIGBpbnB1dCBzaGFwZSBoYXMgc2hhcGUgJHtpbnB1dFNoYXBlfWApO1xuICAgIH0gZWxzZSB7XG4gICAgICBsZXQgaSA9IDA7XG4gICAgICBmb3IgKGxldCBrID0gMDsgayA8IGluTGVucy5sZW5ndGg7ICsraykge1xuICAgICAgICBjb25zdCBzMSA9IGluTGVuc1trXTtcbiAgICAgICAgY29uc3QgczIgPSBpbnB1dFNoYXBlW2sgKyAxXTtcbiAgICAgICAgaWYgKChzMSAhPSBudWxsKSAmJiAoczIgIT0gbnVsbCkgJiYgKHMxICE9PSBzMikpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFwiaW5wdXRMZW5ndGhcIiBpcyAke3RoaXMuaW5wdXRMZW5ndGh9LCBidXQgcmVjZWl2ZWQgYCArXG4gICAgICAgICAgICAgIGBpbnB1dCBzaGFwZSBoYXMgc2hhcGUgJHtpbnB1dFNoYXBlfWApO1xuICAgICAgICB9IGVsc2UgaWYgKHMxID09IG51bGwpIHtcbiAgICAgICAgICBpbkxlbnNbaV0gPSBzMjtcbiAgICAgICAgfVxuICAgICAgICBpKys7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgLi4uaW5MZW5zLCB0aGlzLm91dHB1dERpbV07XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICAvLyBFbWJlZGRpbmcgbGF5ZXIgYWNjZXB0cyBvbmx5IGEgc2luZ2xlIGlucHV0LlxuICAgICAgbGV0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgaWYgKGlucHV0LmR0eXBlICE9PSAnaW50MzInKSB7XG4gICAgICAgIGlucHV0ID0gSy5jYXN0KGlucHV0LCAnaW50MzInKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgICAgSy5nYXRoZXIodGhpcy5lbWJlZGRpbmdzLnJlYWQoKSwgcmVzaGFwZShpbnB1dCwgW2lucHV0LnNpemVdKSk7XG4gICAgICByZXR1cm4gcmVzaGFwZShcbiAgICAgICAgICBvdXRwdXQsIGdldEV4YWN0bHlPbmVTaGFwZSh0aGlzLmNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dC5zaGFwZSkpKTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtcbiAgICAgIGlucHV0RGltOiB0aGlzLmlucHV0RGltLFxuICAgICAgb3V0cHV0RGltOiB0aGlzLm91dHB1dERpbSxcbiAgICAgIGVtYmVkZGluZ3NJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5lbWJlZGRpbmdzSW5pdGlhbGl6ZXIpLFxuICAgICAgZW1iZWRkaW5nc1JlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmVtYmVkZGluZ3NSZWd1bGFyaXplciksXG4gICAgICBhY3Rpdml0eVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmFjdGl2aXR5UmVndWxhcml6ZXIpLFxuICAgICAgZW1iZWRkaW5nc0NvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5lbWJlZGRpbmdzQ29uc3RyYWludCksXG4gICAgICBtYXNrWmVybzogdGhpcy5tYXNrWmVybyxcbiAgICAgIGlucHV0TGVuZ3RoOiB0aGlzLmlucHV0TGVuZ3RoXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhFbWJlZGRpbmcpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Merge Layers.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy, util } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { l2Normalize } from '../losses';\nimport * as generic_utils from '../utils/generic_utils';\nimport * as mathUtils from '../utils/math_utils';\nimport { getExactlyOneShape } from '../utils/types_utils';\n/**\n * Generic Merge layer for element-wise merge functions.\n *\n * Used to implement `Sum`, `Average`, `Concatenate`, etc.\n */\nexport class Merge extends Layer {\n    constructor(args) {\n        super(args || {});\n        this.supportsMasking = true;\n    }\n    /**\n     * Logic for merging multiple tensors, to be overridden by subclasses.\n     * @param inputs\n     */\n    mergeFunction(inputs) {\n        throw new NotImplementedError();\n    }\n    /**\n     * Computes the shape of the result of an elementwise operation.\n     *\n     * @param shape1: Shape of the first tensor.\n     * @param shape2: Shape of the second tensor.\n     * @returns Expected output shape when an elementwise operation is carried\n     *   out on 2 tensors with shapes `shape1` and `shape2`.\n     * @throws ValueError: If `shape1` and `shape2` are not compatible for\n     *   element-wise operations.\n     */\n    computeElementwiseOpOutputShape(shape1, shape2) {\n        if (shape1 == null || shape2 == null) {\n            return null;\n        }\n        else if (shape1.length < shape2.length) {\n            return this.computeElementwiseOpOutputShape(shape2, shape1);\n        }\n        else if (shape2.length === 0) {\n            return shape1;\n        }\n        const outputShape = shape1.slice(0, shape1.length - shape2.length);\n        for (let k = 0; k < shape2.length; ++k) {\n            const i = shape1[shape1.length - shape2.length + k];\n            const j = shape2[k];\n            if (i == null || j == null || i < 0 || j < 0) {\n                outputShape.push(null);\n            }\n            else if (i === 1) {\n                outputShape.push(j);\n            }\n            else if (j === 1) {\n                outputShape.push(i);\n            }\n            else {\n                if (i !== j) {\n                    throw new ValueError('Operands could not be broadcast together with shapes ' +\n                        JSON.stringify(shape1) + ' ' + JSON.stringify(shape2));\n                }\n                outputShape.push(i);\n            }\n        }\n        return outputShape;\n    }\n    build(inputShape) {\n        // Used purely for shape validation.\n        if (Array.isArray(inputShape) && !Array.isArray(inputShape[0])) {\n            // Make sure that inputShape is an Array of shape.\n            inputShape = [getExactlyOneShape(inputShape)];\n        }\n        inputShape = inputShape;\n        if (inputShape.length < 2) {\n            throw new ValueError('A merge layer should be called on an Array of at least 2 inputs.' +\n                ` Got ${inputShape.length} input(s).`);\n        }\n        // Make sure that there is at most one unique batch size among the input\n        // shapes.\n        let batchSizes = [];\n        for (const shape of inputShape) {\n            if (shape != null && shape[0] !== null) {\n                batchSizes.push(shape[0]);\n            }\n        }\n        batchSizes = generic_utils.unique(batchSizes);\n        if (batchSizes.length > 1) {\n            throw new ValueError(`Can not merge tensors with different batch sizes. ` +\n                `Got tensors with shapes: ${JSON.stringify(inputShape)}.`);\n        }\n        let outputShape = inputShape[0] == null ? null : inputShape[0].slice(1);\n        for (let i = 1; i < inputShape.length; ++i) {\n            const shape = inputShape[i] == null ? null : inputShape[i].slice(1);\n            outputShape = this.computeElementwiseOpOutputShape(outputShape, shape);\n        }\n        // If the inputs have different ranks, we have to reshape them to make them\n        // broadcastable.\n        const allRanks = inputShape.map(shape => shape.length);\n        if (inputShape.indexOf(null) === -1 &&\n            generic_utils.unique(allRanks).length === 1) {\n            this.reshapeRequired = false;\n        }\n        else {\n            this.reshapeRequired = true;\n        }\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = inputs;\n            if (this.reshapeRequired) {\n                const reshapedInputs = [];\n                const inputDims = inputs.map(input => input.rank);\n                if (inputDims.indexOf(null) === -1) {\n                    // If ranks of all inputs are available, we simply expand each of them\n                    // at axis=1 until all of them have the same rank.\n                    const maxNDim = mathUtils.max(inputDims);\n                    for (let x of inputs) {\n                        const xNDim = x.rank;\n                        for (let k = 0; k < maxNDim - xNDim; ++k) {\n                            x = K.expandDims(x, 1);\n                        }\n                        reshapedInputs.push(x);\n                    }\n                    return this.mergeFunction(reshapedInputs);\n                }\n                else {\n                    // Transpose all inputs so that batch size is the last dimension.\n                    // [batchSize, dim1, dim2, ...] -> [dim1, dim2, ..., batchSize]\n                    let transposed = false;\n                    for (const x of inputs) {\n                        const xNDim = x.rank;\n                        if (xNDim == null) {\n                            const xShape = x.shape;\n                            const batchSize = xShape[0];\n                            const newShape = xShape.slice(1).concat([batchSize]);\n                            let xTransposed = tfc.reshape(x, [batchSize].concat(mathUtils.arrayProd(xShape.slice(1))));\n                            xTransposed = tfc.transpose(xTransposed, [1, 0]);\n                            xTransposed = tfc.reshape(xTransposed, newShape);\n                            reshapedInputs.push(xTransposed);\n                            transposed = true;\n                        }\n                        else if (xNDim > 1) {\n                            const dims = mathUtils.range(1, xNDim).concat([0]);\n                            reshapedInputs.push(tfc.transpose(x, dims));\n                            transposed = true;\n                        }\n                        else {\n                            // We don't transpose inputs if they are 1D vectors or scalars.\n                            reshapedInputs.push(x);\n                        }\n                    }\n                    let y = this.mergeFunction(reshapedInputs);\n                    const yNDim = y.rank;\n                    if (transposed) {\n                        // If inputs have been transposed, we have to transpose the output\n                        // too.\n                        if (yNDim == null) {\n                            const yShape = y.shape;\n                            const yNDim = yShape.length;\n                            const batchSize = yShape[yNDim - 1];\n                            const newShape = [batchSize].concat(yShape.slice(0, yShape.length - 1));\n                            y = tfc.reshape(tfc.transpose(tfc.reshape(y, [-1, batchSize]), [1, 0]), newShape);\n                        }\n                        else if (yNDim > 1) {\n                            const dims = [yNDim - 1].concat(mathUtils.range(0, yNDim - 1));\n                            y = tfc.transpose(y, dims);\n                        }\n                    }\n                    return y;\n                }\n            }\n            else {\n                return this.mergeFunction(inputs);\n            }\n        });\n    }\n    computeOutputShape(inputShape) {\n        inputShape = inputShape;\n        let outputShape;\n        if (inputShape[0] == null) {\n            outputShape = null;\n        }\n        else {\n            outputShape = inputShape[0].slice(1);\n        }\n        for (let i = 1; i < inputShape.length; ++i) {\n            const shape = inputShape[i] == null ? null : inputShape[i].slice(1);\n            outputShape = this.computeElementwiseOpOutputShape(outputShape, shape);\n        }\n        let batchSizes = [];\n        for (const shape of inputShape) {\n            if (shape != null && shape[0] !== null) {\n                batchSizes.push(shape[0]);\n            }\n        }\n        batchSizes = generic_utils.unique(batchSizes);\n        if (batchSizes.length === 1) {\n            outputShape = batchSizes.concat(outputShape);\n        }\n        else {\n            outputShape = [null].concat(outputShape);\n        }\n        return outputShape;\n    }\n    computeMask(inputs, mask) {\n        return tfc.tidy(() => {\n            if (mask == null) {\n                return null;\n            }\n            if (!Array.isArray(mask)) {\n                throw new ValueError('`mask` should be an Array');\n            }\n            if (!Array.isArray(inputs)) {\n                throw new ValueError('`inputs` should be an Array');\n            }\n            if (mask.length !== inputs.length) {\n                throw new ValueError(`The Array 'inputs' and 'mask' are expected to have the same ` +\n                    `length, but have different lengths ` +\n                    `(${inputs.length} vs ${mask.length})`);\n            }\n            if (mask.every(m => m == null)) {\n                return null;\n            }\n            mask = mask.map(m => m == null ? m : tfc.expandDims(m, 0));\n            let output = mask[0];\n            for (let i = 1; i < mask.length - 1; ++i) {\n                output = tfc.logicalAnd(output, mask[i]);\n            }\n            return output;\n        });\n    }\n}\nexport class Add extends Merge {\n    constructor(args) {\n        super(args);\n    }\n    mergeFunction(inputs) {\n        return tidy(() => {\n            let output = inputs[0].clone();\n            for (let i = 1; i < inputs.length; ++i) {\n                output = tfc.add(output, inputs[i]);\n            }\n            return output;\n        });\n    }\n}\n/** @nocollapse */\nAdd.className = 'Add';\nserialization.registerClass(Add);\n/**\n * Calculate the element-wise sum of inputs, which all have the same shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Add` layer, by using no input argument\n *    or a single configuration argument. The resultant `Add` layer can then\n *    be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const addLayer = tf.layers.add();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = addLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.add([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n * tf.layers.add([input1, input2]).print();\n * // Gives [[11, 22], [33, 44]].\n *\n */\nexport function add(config) {\n    if (Array.isArray(config)) {\n        const layer = new Add({});\n        return layer.apply(config);\n    }\n    else {\n        return new Add(config);\n    }\n}\nexport class Multiply extends Merge {\n    constructor(args) {\n        super(args);\n    }\n    mergeFunction(inputs) {\n        return tidy(() => {\n            let output = inputs[0].clone();\n            for (let i = 1; i < inputs.length; ++i) {\n                output = tfc.mul(output, inputs[i]);\n            }\n            return output;\n        });\n    }\n}\n/** @nocollapse */\nMultiply.className = 'Multiply';\nserialization.registerClass(Multiply);\n/**\n * Calculate the element-wise product of inputs, which all have the same shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Multiply` layer, by using no input argument\n *    or a single configuration argument. The resultant `Multiply` layer can\n *    then be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const multiplyLayer = tf.layers.multiply();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = multiplyLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.multiply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n * tf.layers.multiply([input1, input2]).print();\n * // Gives [[10, 40], [90, 160]].\n *\n */\nexport function multiply(config) {\n    if (Array.isArray(config)) {\n        const layer = new Multiply({});\n        return layer.apply(config);\n    }\n    else {\n        return new Multiply(config);\n    }\n}\nexport class Average extends Merge {\n    constructor(args) {\n        super(args);\n    }\n    mergeFunction(inputs) {\n        return tidy(() => {\n            let output = inputs[0].clone();\n            for (let i = 1; i < inputs.length; ++i) {\n                output = tfc.add(output, inputs[i]);\n            }\n            return tfc.mul(1 / inputs.length, output);\n        });\n    }\n}\n/** @nocollapse */\nAverage.className = 'Average';\nserialization.registerClass(Average);\n/**\n * Calculate the element-wise arithmetic mean of inputs, which all have the same\n * shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Average` layer, by using no input argument\n *    or a single configuration argument. The resultant `Average` layer can then\n *    be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const averageLayer = tf.layers.average();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = averageLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.average([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 2, 3, 4], [2, 2]);\n * const input2 = tf.tensor2d([10, 20, 30, 40], [2, 2]);\n * tf.layers.average([input1, input2]).print();\n * // Gives [[5.5, 11], [16.5, 22]].\n *\n */\nexport function average(config) {\n    if (Array.isArray(config)) {\n        const layer = new Average({});\n        return layer.apply(config);\n    }\n    else {\n        return new Average(config);\n    }\n}\nexport class Maximum extends Merge {\n    constructor(args) {\n        super(args);\n    }\n    mergeFunction(inputs) {\n        return tidy(() => {\n            let output = inputs[0];\n            for (let i = 1; i < inputs.length; ++i) {\n                output = tfc.maximum(output, inputs[i]);\n            }\n            return output;\n        });\n    }\n}\n/** @nocollapse */\nMaximum.className = 'Maximum';\nserialization.registerClass(Maximum);\n/**\n * Calculate the element-wise maximum of inputs, which all have the same shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Maximum` layer, by using no input argument\n *    or a single configuration argument. The resultant `Maximum` layer can then\n *    be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const maximumLayer = tf.layers.maximum();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = maximumLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.maximum([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 20, 3, 40], [2, 2]);\n * const input2 = tf.tensor2d([10, 2, 30, 4], [2, 2]);\n * tf.layers.maximum([input1, input2]).print();\n * // Gives [[10, 20], [30, 40]].\n *\n */\nexport function maximum(config) {\n    if (Array.isArray(config)) {\n        const layer = new Maximum({});\n        return layer.apply(config);\n    }\n    else {\n        return new Maximum(config);\n    }\n}\nexport class Minimum extends Merge {\n    constructor(args) {\n        super(args);\n    }\n    mergeFunction(inputs) {\n        return tidy(() => {\n            let output = inputs[0];\n            for (let i = 1; i < inputs.length; ++i) {\n                output = tfc.minimum(output, inputs[i]);\n            }\n            return output;\n        });\n    }\n}\n/** @nocollapse */\nMinimum.className = 'Minimum';\nserialization.registerClass(Minimum);\n/**\n * Calculate the element-wise minimum of inputs, which all have the same shape.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Minimum` layer, by using no input argument\n *    or a single configuration argument. The resultant `Minimum` layer can then\n *    be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const minimumLayer = tf.layers.minimum();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = minimumLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 2]});\n * const input2 = tf.input({shape: [2, 2]});\n * const output = tf.layers.minimum([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([1, 20, 3, 40], [2, 2]);\n * const input2 = tf.tensor2d([10, 2, 30, 4], [2, 2]);\n * tf.layers.minimum([input1, input2]).print();\n * // Gives [[1, 2], [3, 4]].\n *\n */\nexport function minimum(config) {\n    if (Array.isArray(config)) {\n        const layer = new Minimum({});\n        return layer.apply(config);\n    }\n    else {\n        return new Minimum(config);\n    }\n}\nexport class Concatenate extends Merge {\n    constructor(args) {\n        super(args);\n        this.DEFAULT_AXIS = -1;\n        if (args == null) {\n            args = {};\n        }\n        this.axis = args.axis == null ? this.DEFAULT_AXIS : args.axis;\n        this.supportsMasking = true;\n        this.reshapeRequired = false;\n    }\n    build(inputShape) {\n        // Used purely for shape validation.]\n        if (!(Array.isArray(inputShape) && Array.isArray(inputShape[0])) ||\n            inputShape.length === 1) {\n            throw new ValueError('A `Concatenate` layer should be called on a list of at least 2 ' +\n                'inputs');\n        }\n        inputShape = inputShape;\n        let allNoneShape = true;\n        for (const shape of inputShape) {\n            if (shape != null) {\n                allNoneShape = false;\n                break;\n            }\n        }\n        if (allNoneShape) {\n            return;\n        }\n        const shapeSet = [];\n        for (let i = 0; i < inputShape.length; ++i) {\n            const shapeWithoutConcatAxis = inputShape[i].slice();\n            shapeWithoutConcatAxis.splice(this.axis, 1);\n            let exists = false;\n            for (const shape of shapeSet) {\n                if (util.arraysEqual(shape, shapeWithoutConcatAxis)) {\n                    exists = true;\n                    break;\n                }\n            }\n            if (!exists) {\n                shapeSet.push(shapeWithoutConcatAxis);\n            }\n        }\n        if (shapeSet.length > 1) {\n            throw new ValueError('A `Concatenate` layer requires inputs with matching shapes ' +\n                'except for the concat axis. Got input shapes: ' +\n                JSON.stringify(inputShape));\n        }\n    }\n    mergeFunction(inputs) {\n        return tidy(() => {\n            return K.concatenate(inputs, this.axis);\n        });\n    }\n    computeOutputShape(inputShape) {\n        if (!(Array.isArray(inputShape) && Array.isArray(inputShape[0]))) {\n            throw new ValueError('A `Concatenate` layer should be called on a list of inputs.');\n        }\n        const inputShapes = inputShape;\n        const outputShape = inputShapes[0].slice();\n        const axis = this.axis < 0 ? outputShape.length + this.axis : this.axis;\n        // Porting Note: the line above is because TypeScript doesn't support\n        //   negative indices.\n        for (const shape of inputShapes.slice(1)) {\n            if (outputShape[axis] == null || shape[axis] == null) {\n                outputShape[axis] = null;\n                break;\n            }\n            outputShape[axis] += shape[axis];\n        }\n        return outputShape;\n    }\n    computeMask(inputs, mask) {\n        if (mask == null) {\n            return null;\n        }\n        if (!Array.isArray(mask)) {\n            throw new ValueError('`mask` should be an array for Concatenate');\n        }\n        if (!Array.isArray(inputs)) {\n            throw new ValueError('`inputs` should be an array for Concatenate');\n        }\n        if (mask.length !== inputs.length) {\n            throw new ValueError(`Mismatch in the length of mask (${mask.length}) ` +\n                `and the legnth of inputs (${inputs.length})`);\n        }\n        return tfc.tidy(() => {\n            let allNullMasks = true;\n            mask.forEach(m => {\n                if (m != null) {\n                    allNullMasks = false;\n                    return;\n                }\n            });\n            if (allNullMasks) {\n                return null;\n            }\n            const outputMasks = [];\n            for (let i = 0; i < inputs.length; ++i) {\n                if (mask[i] == null) {\n                    // Input is unmasked. Append all 1's to masks.\n                    outputMasks.push(tfc.cast(tfc.onesLike(inputs[i]), 'bool'));\n                }\n                else if (mask[i].rank < inputs[i].rank) {\n                    // Mask is smaller than the input, expand it.\n                    outputMasks.push(tfc.expandDims(mask[i], -1));\n                }\n                else {\n                    outputMasks.push(mask[i]);\n                }\n            }\n            const concatenatedMasks = tfc.concat(outputMasks, this.axis);\n            return tfc.all(concatenatedMasks, -1, false);\n        });\n    }\n    getConfig() {\n        const config = {\n            'axis': this.axis,\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nConcatenate.className = 'Concatenate';\nserialization.registerClass(Concatenate);\n/**\n * Concatenate an `Array` of inputs.\n *\n * This function can be invoked in three ways.\n *\n * 1. Construct an instance of `Concatenate` layer, by using no input argument\n *    or a single configuration argument. The resultant `Concatenate` layer can\n *    then be used on `tf.SymbolicTensor`s or `tf.Tensor`s. For example:\n *\n * ```js\n * const concatLayer = tf.layers.concatenate();\n *\n * // The layer can be applied to inputs.\n * const input1 = tf.input({shape: [2, 3]});\n * const input2 = tf.input({shape: [2, 4]});\n * const output = concatLayer.apply([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 7], with the first dimension as the undetermined batch\n * // dimension and the last dimension as the result of concatenating the\n * // last dimensions of the two inputs.\n * ```\n *\n * 2. Invoke directly on an `Array` of `tf.SymbolicTensor`s. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.SymbolicTensor`. For example:\n *\n * ```js\n * const input1 = tf.input({shape: [2, 3]});\n * const input2 = tf.input({shape: [2, 4]});\n * const output = tf.layers.concatenate([input1, input2]);\n * console.log(output.shape);\n * // You get [null, 2, 2], with the first dimension as the undetermined batch\n * // dimension and the last dimension as the result of concatenating the\n * // last dimensions of the two inputs.\n * ```\n *\n * 3. Invoke directly on `tf.Tensor`s, i.e., concrete values. This constructs\n *    an `Layer` object internally and calls its `apply` method on the inputs,\n *    generating a new `tf.Tensor` as the result of the computation. For\n * example:\n *\n * ```js\n * const input1 = tf.tensor2d([[1, 2], [3, 4]], [2, 2]);\n * const input2 = tf.tensor2d([[10, 20], [30, 40]], [2, 2]);\n * tf.layers.concatenate([input1, input2]).print();\n * // Gives [[1, 2, 10, 20], [3, 4, 30, 40]].\n *\n */\nexport function concatenate(config) {\n    if (Array.isArray(config)) {\n        const layer = new Concatenate({});\n        return layer.apply(config);\n    }\n    else {\n        return new Concatenate(config);\n    }\n}\n/**\n * Interpretable potentially negative axis index.\n *\n * For example, given axis = -1, and dim = 3, this function will return 2.\n *\n * @param axis The axis index, may be a positive, zero or negative integer.\n * @param dim Total number of dimensions, a positive integer.\n * @returns A non-negative axis index equivalent to the input `axis`.\n */\nfunction interpretAxis(axis, dim) {\n    while (axis < 0) {\n        axis += dim;\n    }\n    return axis;\n}\nfunction batchDot(x, y, axes) {\n    if (x.shape.length > 3 || y.shape.length > 3) {\n        throw new NotImplementedError('batchDot is not implemented for tensors of 4D or higher rank yet');\n    }\n    tfc.util.assert(x.shape.length >= 2, () => `batchDot requires the rank of x to be >= 2, ` +\n        `but got ${x.shape.length}`);\n    tfc.util.assert(x.shape.length >= 2, () => `batchDot requires the rank of y to be >= 2, ` +\n        `but got ${y.shape.length}`);\n    if (typeof axes === 'number') {\n        axes = [axes, axes];\n    }\n    if (x.dtype === 'complex64' || y.dtype === 'complex64') {\n        throw new NotImplementedError('batchDot is not implemented for complex64-type Tensors yet.');\n    }\n    const xNDim = x.shape.length;\n    const yNDim = y.shape.length;\n    if (axes == null) {\n        // Behave like batchMatmul by default.\n        axes = [xNDim - 1, yNDim - 2];\n    }\n    const axesArray = axes;\n    return tfc.tidy(() => {\n        let diff;\n        if (xNDim > yNDim) {\n            diff = xNDim - yNDim;\n            const diffShape = [];\n            for (let i = 0; i < diff; ++i) {\n                diffShape.push(1);\n            }\n            y = tfc.reshape(y, y.shape.concat(diffShape));\n        }\n        else if (yNDim > xNDim) {\n            diff = yNDim - xNDim;\n            const diffShape = [];\n            for (let i = 0; i < diff; ++i) {\n                diffShape.push(1);\n            }\n            x = tfc.reshape(x, x.shape.concat(diffShape));\n        }\n        else {\n            diff = 0;\n        }\n        let out;\n        if (x.shape.length === 2 && y.shape.length === 2) {\n            if (axesArray[0] === axesArray[1]) {\n                out = tfc.sum(tfc.mul(x, y), axesArray[0]);\n            }\n            else {\n                out = tfc.sum(tfc.mul(tfc.transpose(x, [1, 0]), y), axesArray[1]);\n            }\n        }\n        else {\n            const adjX = axesArray[0] !== x.shape.length - 1;\n            const adjY = axesArray[1] === y.shape.length - 1;\n            out = tfc.matMul(x, y, adjX, adjY);\n        }\n        if (diff > 0) {\n            let idx;\n            if (xNDim > yNDim) {\n                idx = xNDim + yNDim - 3;\n            }\n            else {\n                idx = xNDim - 1;\n            }\n            const squeezeAxes = [];\n            for (let i = idx; i < idx + diff; ++i) {\n                squeezeAxes.push(i);\n            }\n            out = tfc.squeeze(out, squeezeAxes);\n        }\n        if (out.shape.length === 1) {\n            out = tfc.expandDims(out, 1);\n        }\n        return out;\n    });\n}\nexport class Dot extends Merge {\n    constructor(args) {\n        super(args);\n        this.axes = args.axes;\n        this.normalize = args.normalize == null ? false : args.normalize;\n        this.supportsMasking = true;\n        this.reshapeRequired = false;\n    }\n    build(inputShape) {\n        tfc.util.assert(Array.isArray(inputShape) && inputShape.length === 2 &&\n            Array.isArray(inputShape[0]) && Array.isArray(inputShape[1]), () => 'A `Dot` layer should be called on a list of exactly 2 inputs.');\n        const shape1 = inputShape[0];\n        const shape2 = inputShape[1];\n        if (shape1.length > 3 || shape2.length > 3) {\n            throw new NotImplementedError('Dot layer does not support tensors of 4D or higher rank yet.');\n        }\n        const axes = this.interpretAxes(shape1, shape2);\n        if (shape1[axes[0]] !== shape2[axes[1]]) {\n            throw new ValueError(`Dimension incompatibility: ` +\n                `${shape1[axes[0]]} !== ${shape2[axes[1]]}`);\n        }\n    }\n    mergeFunction(inputs) {\n        if (inputs.length !== 2) {\n            throw new ValueError('A `Dot` layer must be called on exactly 2 inputs, ' +\n                `but received ${inputs.length} input(s).`);\n        }\n        let x1 = inputs[0];\n        let x2 = inputs[1];\n        let axes;\n        if (!Array.isArray(this.axes)) {\n            axes = [\n                interpretAxis(this.axes, x1.shape.length),\n                interpretAxis(this.axes, x2.shape.length)\n            ];\n        }\n        else {\n            axes = this.axes.map((axis, i) => interpretAxis(axis, inputs[i].shape.length));\n        }\n        if (this.normalize) {\n            x1 = l2Normalize(x1, axes[0]);\n            x2 = l2Normalize(x2, axes[1]);\n        }\n        return batchDot(x1, x2, axes);\n    }\n    interpretAxes(shape1, shape2) {\n        let axes;\n        if (!Array.isArray(this.axes)) {\n            // `this.axes` is a single integer.\n            axes = [\n                interpretAxis(this.axes, shape1.length),\n                interpretAxis(this.axes, shape2.length)\n            ];\n        }\n        else {\n            // `this.axes` is an Array of integers.\n            axes = this.axes;\n        }\n        return axes;\n    }\n    computeOutputShape(inputShape) {\n        tfc.util.assert(Array.isArray(inputShape) && inputShape.length === 2 &&\n            Array.isArray(inputShape[0]) && Array.isArray(inputShape[1]), () => 'A `Dot` layer should be called on a list of exactly 2 inputs.');\n        const shape1 = inputShape[0].slice();\n        const shape2 = inputShape[1].slice();\n        if (shape1.length > 3 || shape2.length > 3) {\n            throw new NotImplementedError('Dot layer does not support tensors of 4D or higher rank yet.');\n        }\n        const axes = this.interpretAxes(shape1, shape2);\n        shape1.splice(axes[0], 1);\n        shape2.splice(axes[1], 1);\n        shape2.splice(0, 1);\n        const outputShape = shape1.concat(shape2);\n        if (outputShape.length === 1) {\n            outputShape.push(1);\n        }\n        return outputShape;\n    }\n    computeMask(inputs, mask) {\n        return null;\n    }\n    getConfig() {\n        const config = {\n            'axes': this.axes,\n            'normalize': this.normalize\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nDot.className = 'Dot';\nserialization.registerClass(Dot);\n// TODO(cais): Add functional interfaces for the merge layers.\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVyZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL21lcmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQVUsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3hFLE9BQU8sS0FBSyxDQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDN0MsT0FBTyxFQUFDLEtBQUssRUFBNEIsTUFBTSxvQkFBb0IsQ0FBQztBQUNwRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUUsVUFBVSxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRTFELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFdEMsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXhEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQWdCLEtBQU0sU0FBUSxLQUFLO0lBR3ZDLFlBQVksSUFBZ0I7UUFDMUIsS0FBSyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQ7OztPQUdHO0lBQ08sYUFBYSxDQUFDLE1BQWdCO1FBQ3RDLE1BQU0sSUFBSSxtQkFBbUIsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSywrQkFBK0IsQ0FBQyxNQUFhLEVBQUUsTUFBYTtRQUNsRSxJQUFJLE1BQU0sSUFBSSxJQUFJLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtZQUNwQyxPQUFPLElB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QUFDLENBQUM7U0FDckU7UUFFRCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNoRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNwQixNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFDLElBQUksV0FBVyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDNUIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyQjtRQUNELE9BQU8sV0FBVyxDQUFDO0lBQ3JCLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBdUIsRUFBRSxJQUFzQjtRQUN6RCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxNQUFNLEdBQTZCO1lBQ3ZDLE1BQU0sRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNqQixXQUFXLEVBQUUsSUFBSSxDQUFDLFNBQVM7U0FDNUIsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQS9HRCxrQkFBa0I7QUFDWCxhQUFTLEdBQUcsS0FBSyxDQUFDO0FBZ0gzQixhQUFhLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRWpDLDhEQUE4RCIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGVuc29yRmxvdy5qcyBMYXllcnM6IE1lcmdlIExheWVycy5cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7c2VyaWFsaXphdGlvbiwgVGVuc29yLCB0aWR5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge0xheWVyLCBMYXllckFyZ3MsIFN5bWJvbGljVGVuc29yfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge2wyTm9ybWFsaXplfSBmcm9tICcuLi9sb3NzZXMnO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQgKiBhcyBtYXRoVXRpbHMgZnJvbSAnLi4vdXRpbHMvbWF0aF91dGlscyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZX0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuXG4vKipcbiAqIEdlbmVyaWMgTWVyZ2UgbGF5ZXIgZm9yIGVsZW1lbnQtd2lzZSBtZXJnZSBmdW5jdGlvbnMuXG4gKlxuICogVXNlZCB0byBpbXBsZW1lbnQgYFN1bWAsIGBBdmVyYWdlYCwgYENvbmNhdGVuYXRlYCwgZXRjLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgTWVyZ2UgZXh0ZW5kcyBMYXllciB7XG4gIHByb3RlY3RlZCByZXNoYXBlUmVxdWlyZWQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYXJncz86IExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgfHwge30pO1xuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2dpYyBmb3IgbWVyZ2luZyBtdWx0aXBsZSB0ZW5zb3JzLCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuXG4gICAqIEBwYXJhbSBpbnB1dHNcbiAgICovXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cblxuICAvKipcbiAgICogQ29tcHV0ZXMgdGhlIHNoYXBlIG9mIHRoZSByZXN1bHQgb2YgYW4gZWxlbWVudHdpc2Ugb3BlcmF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gc2hhcGUxOiBTaGFwZSBvZiB0aGUgZmlyc3QgdGVuc29yLlxuICAgKiBAcGFyYW0gc2hhcGUyOiBTaGFwZSBvZiB0aGUgc2Vjb25kIHRlbnNvci5cbiAgICogQHJldHVybnMgRXhwZWN0ZWQgb3V0cHV0IHNoYXBlIHdoZW4gYW4gZWxlbWVudHdpc2Ugb3BlcmF0aW9uIGlzIGNhcnJpZWRcbiAgICogICBvdXQgb24gMiB0ZW5zb3JzIHdpdGggc2hhcGVzIGBzaGFwZTFgIGFuZCBgc2hhcGUyYC5cbiAgICogQHRocm93cyBWYWx1ZUVycm9yOiBJZiBgc2hhcGUxYCBhbmQgYHNoYXBlMmAgYXJlIG5vdCBjb21wYXRpYmxlIGZvclxuICAgKiAgIGVsZW1lbnQtd2lzZSBvcGVyYXRpb25zLlxuICAgKi9cbiAgcHJpdmF0ZSBjb21wdXRlRWxlbWVudHdpc2VPcE91dHB1dFNoYXBlKHNoYXBlMTogU2hhcGUsIHNoYXBlMjogU2hhcGUpOiBTaGFwZSB7XG4gICAgaWYgKHNoYXBlMSA9PSBudWxsIHx8IHNoYXBlMiA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9IGVsc2UgaWYgKHNoYXBlMS5sZW5ndGggPCBzaGFwZTIubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb21wdXRlRWxlbWVudHdpc2VPcE91dHB1dFNoYXBlKHNoYXBlMiwgc2hhcGUxKTtcbiAgICB9IGVsc2UgaWYgKHNoYXBlMi5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBzaGFwZTE7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dFNoYXBlOiBTaGFwZSA9IHNoYXBlMS5zbGljZSgwLCBzaGFwZTEubGVuZ3RoIC0gc2hhcGUyLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBzaGFwZTIubGVuZ3RoOyArK2spIHtcbiAgICAgIGNvbnN0IGkgPSBzaGFwZTFbc2hhcGUxLmxlbmd0aCAtIHNoYXBlMi5sZW5ndGggKyBrXTtcbiAgICAgIGNvbnN0IGogPSBzaGFwZTJba107XG4gICAgICBpZiAoaSA9PSBudWxsIHx8IGogPT0gbnVsbCB8fCBpIDwgMCB8fCBqIDwgMCkge1xuICAgICAgICBvdXRwdXRTaGFwZS5wdXNoKG51bGwpO1xuICAgICAgfSBlbHNlIGlmIChpID09PSAxKSB7XG4gICAgICAgIG91dHB1dFNoYXBlLnB1c2goaik7XG4gICAgICB9IGVsc2UgaWYgKGogPT09IDEpIHtcbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaChpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChpICE9PSBqKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAgICdPcGVyYW5kcyBjb3VsZCBub3QgYmUgYnJvYWRjYXN0IHRvZ2V0aGVyIHdpdGggc2hhcGVzICcgK1xuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShzaGFwZTEpICsgJyAnICsgSlNPTi5zdHJpbmdpZnkoc2hhcGUyKSk7XG4gICAgICAgIH1cbiAgICAgICAgb3V0cHV0U2hhcGUucHVzaChpKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFNoYXBlO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIC8vIFVzZWQgcHVyZWx5IGZvciBzaGFwZSB2YWxpZGF0aW9uLlxuICAgIGlmIChBcnJheS5pc0FycmF5KGlucHV0U2hhcGUpICYmICFBcnJheS5pc0FycmF5KGlucHV0U2hhcGVbMF0pKSB7XG4gICAgICAvLyBNYWtlIHN1cmUgdGhhdCBpbnB1dFNoYXBlIGlzIGFuIEFycmF5IG9mIHNoYXBlLlxuICAgICAgaW5wdXRTaGFwZSA9IFtnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSldO1xuICAgIH1cbiAgICBpbnB1dFNoYXBlID0gaW5wdXRTaGFwZSBhcyBTaGFwZVtdO1xuICAgIGlmIChpbnB1dFNoYXBlLmxlbmd0aCA8IDIpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdBIG1lcmdlIGxheWVyIHNob3VsZCBiZSBjYWxsZWQgb24gYW4gQXJyYXkgb2YgYXQgbGVhc3QgMiBpbnB1dHMuJyArXG4gICAgICAgICAgYCBHb3QgJHtpbnB1dFNoYXBlLmxlbmd0aH0gaW5wdXQocykuYCk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgYXQgbW9zdCBvbmUgdW5pcXVlIGJhdGNoIHNpemUgYW1vbmcgdGhlIGlucHV0XG4gICAgLy8gc2hhcGVzLlxuICAgIGxldCBiYXRjaFNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2YgaW5wdXRTaGFwZSkge1xuICAgICAgaWYgKHNoYXBlICE9IG51bGwgJiYgc2hhcGVbMF0gIT09IG51bGwpIHtcbiAgICAgICAgYmF0Y2hTaXplcy5wdXNoKHNoYXBlWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYmF0Y2hTaXplcyA9IGdlbmVyaWNfdXRpbHMudW5pcXVlKGJhdGNoU2l6ZXMpO1xuICAgIGlmIChiYXRjaFNpemVzLmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBDYW4gbm90IG1lcmdlIHRlbnNvcnMgd2l0aCBkaWZmZXJlbnQgYmF0Y2ggc2l6ZXMuIGAgK1xuICAgICAgICAgIGBHb3QgdGVuc29ycyB3aXRoIHNoYXBlczogJHtKU09OLnN0cmluZ2lmeShpbnB1dFNoYXBlKX0uYCk7XG4gICAgfVxuXG4gICAgbGV0IG91dHB1dFNoYXBlOiBTaGFwZSA9XG4gICAgICAgIGlucHV0U2hhcGVbMF0gPT0gbnVsbCA/IG51bGwgOiBpbnB1dFNoYXBlWzBdLnNsaWNlKDEpO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRTaGFwZS5sZW5ndGg7ICsraSkge1xuICAgICAgY29uc3Qgc2hhcGUgPSBpbnB1dFNoYXBlW2ldID09IG51bGwgPyBudWxsIDogaW5wdXRTaGFwZVtpXS5zbGljZSgxKTtcbiAgICAgIG91dHB1dFNoYXBlID0gdGhpcy5jb21wdXRlRWxlbWVudHdpc2VPcE91dHB1dFNoYXBlKG91dHB1dFNoYXBlLCBzaGFwZSk7XG4gICAgfVxuICAgIC8vIElmIHRoZSBpbnB1dHMgaGF2ZSBkaWZmZXJlbnQgcmFua3MsIHdlIGhhdmUgdG8gcmVzaGFwZSB0aGVtIHRvIG1ha2UgdGhlbVxuICAgIC8vIGJyb2FkY2FzdGFibGUuXG4gICAgY29uc3QgYWxsUmFua3MgPSBpbnB1dFNoYXBlLm1hcChzaGFwZSA9PiBzaGFwZS5sZW5ndGgpO1xuICAgIGlmIChpbnB1dFNoYXBlLmluZGV4T2YobnVsbCkgPT09IC0xICYmXG4gICAgICAgIGdlbmVyaWNfdXRpbHMudW5pcXVlKGFsbFJhbmtzKS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRoaXMucmVzaGFwZVJlcXVpcmVkID0gZmFsc2U7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzaGFwZVJlcXVpcmVkID0gdHJ1ZTtcbiAgICB9XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaW5wdXRzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuICAgICAgaWYgKHRoaXMucmVzaGFwZVJlcXVpcmVkKSB7XG4gICAgICAgIGNvbnN0IHJlc2hhcGVkSW5wdXRzOiBUZW5zb3JbXSA9IFtdO1xuICAgICAgICBjb25zdCBpbnB1dERpbXMgPSBpbnB1dHMubWFwKGlucHV0ID0+IGlucHV0LnJhbmspO1xuICAgICAgICBpZiAoaW5wdXREaW1zLmluZGV4T2YobnVsbCkgPT09IC0xKSB7XG4gICAgICAgICAgLy8gSWYgcmFua3Mgb2YgYWxsIGlucHV0cyBhcmUgYXZhaWxhYmxlLCB3ZSBzaW1wbHkgZXhwYW5kIGVhY2ggb2YgdGhlbVxuICAgICAgICAgIC8vIGF0IGF4aXM9MSB1bnRpbCBhbGwgb2YgdGhlbSBoYXZlIHRoZSBzYW1lIHJhbmsuXG4gICAgICAgICAgY29uc3QgbWF4TkRpbSA9IG1hdGhVdGlscy5tYXgoaW5wdXREaW1zKTtcbiAgICAgICAgICBmb3IgKGxldCB4IG9mIGlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgeE5EaW0gPSB4LnJhbms7XG4gICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IG1heE5EaW0gLSB4TkRpbTsgKytrKSB7XG4gICAgICAgICAgICAgIHggPSBLLmV4cGFuZERpbXMoeCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXNoYXBlZElucHV0cy5wdXNoKHgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhpcy5tZXJnZUZ1bmN0aW9uKHJlc2hhcGVkSW5wdXRzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBUcmFuc3Bvc2UgYWxsIGlucHV0cyBzbyB0aGF0IGJhdGNoIHNpemUgaXMgdGhlIGxhc3QgZGltZW5zaW9uLlxuICAgICAgICAgIC8vIFtiYXRjaFNpemUsIGRpbTEsIGRpbTIsIC4uLl0gLT4gW2RpbTEsIGRpbTIsIC4uLiwgYmF0Y2hTaXplXVxuICAgICAgICAgIGxldCB0cmFuc3Bvc2VkID0gZmFsc2U7XG4gICAgICAgICAgZm9yIChjb25zdCB4IG9mIGlucHV0cykge1xuICAgICAgICAgICAgY29uc3QgeE5EaW0gPSB4LnJhbms7XG4gICAgICAgICAgICBpZiAoeE5EaW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCB4U2hhcGUgPSB4LnNoYXBlO1xuICAgICAgICAgICAgICBjb25zdCBiYXRjaFNpemUgPSB4U2hhcGVbMF07XG4gICAgICAgICAgICAgIGNvbnN0IG5ld1NoYXBlID0geFNoYXBlLnNsaWNlKDEpLmNvbmNhdChbYmF0Y2hTaXplXSk7XG4gICAgICAgICAgICAgIGxldCB4VHJhbnNwb3NlZCA9IHRmYy5yZXNoYXBlKFxuICAgICAgICAgICAgICAgICAgeCwgW2JhdGNoU2l6ZV0uY29uY2F0KG1hdGhVdGlscy5hcnJheVByb2QoeFNoYXBlLnNsaWNlKDEpKSkpO1xuICAgICAgICAgICAgICB4VHJhbnNwb3NlZCA9IHRmYy50cmFuc3Bvc2UoeFRyYW5zcG9zZWQsIFsxLCAwXSk7XG4gICAgICAgICAgICAgIHhUcmFuc3Bvc2VkID0gdGZjLnJlc2hhcGUoeFRyYW5zcG9zZWQsIG5ld1NoYXBlKTtcbiAgICAgICAgICAgICAgcmVzaGFwZWRJbnB1dHMucHVzaCh4VHJhbnNwb3NlZCk7XG4gICAgICAgICAgICAgIHRyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh4TkRpbSA+IDEpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGltcyA9IG1hdGhVdGlscy5yYW5nZSgxLCB4TkRpbSkuY29uY2F0KFswXSk7XG4gICAgICAgICAgICAgIHJlc2hhcGVkSW5wdXRzLnB1c2godGZjLnRyYW5zcG9zZSh4LCBkaW1zKSk7XG4gICAgICAgICAgICAgIHRyYW5zcG9zZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgdHJhbnNwb3NlIGlucHV0cyBpZiB0aGV5IGFyZSAxRCB2ZWN0b3JzIG9yIHNjYWxhcnMuXG4gICAgICAgICAgICAgIHJlc2hhcGVkSW5wdXRzLnB1c2goeCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGxldCB5ID0gdGhpcy5tZXJnZUZ1bmN0aW9uKHJlc2hhcGVkSW5wdXRzKTtcbiAgICAgICAgICBjb25zdCB5TkRpbSA9IHkucmFuaztcbiAgICAgICAgICBpZiAodHJhbnNwb3NlZCkge1xuICAgICAgICAgICAgLy8gSWYgaW5wdXRzIGhhdmUgYmVlbiB0cmFuc3Bvc2VkLCB3ZSBoYXZlIHRvIHRyYW5zcG9zZSB0aGUgb3V0cHV0XG4gICAgICAgICAgICAvLyB0b28uXG4gICAgICAgICAgICBpZiAoeU5EaW0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICBjb25zdCB5U2hhcGUgPSB5LnNoYXBlO1xuICAgICAgICAgICAgICBjb25zdCB5TkRpbSA9IHlTaGFwZS5sZW5ndGg7XG4gICAgICAgICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHlTaGFwZVt5TkRpbSAtIDFdO1xuICAgICAgICAgICAgICBjb25zdCBuZXdTaGFwZSA9XG4gICAgICAgICAgICAgICAgICBbYmF0Y2hTaXplXS5jb25jYXQoeVNoYXBlLnNsaWNlKDAsIHlTaGFwZS5sZW5ndGggLSAxKSk7XG4gICAgICAgICAgICAgIHkgPSB0ZmMucmVzaGFwZShcbiAgICAgICAgICAgICAgICAgIHRmYy50cmFuc3Bvc2UodGZjLnJlc2hhcGUoeSwgWy0xLCBiYXRjaFNpemVdKSwgWzEsIDBdKSxcbiAgICAgICAgICAgICAgICAgIG5ld1NoYXBlKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoeU5EaW0gPiAxKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGRpbXMgPSBbeU5EaW0gLSAxXS5jb25jYXQobWF0aFV0aWxzLnJhbmdlKDAsIHlORGltIC0gMSkpO1xuICAgICAgICAgICAgICB5ID0gdGZjLnRyYW5zcG9zZSh5LCBkaW1zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lcmdlRnVuY3Rpb24oaW5wdXRzKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGlucHV0U2hhcGUgYXMgU2hhcGVbXTtcbiAgICBsZXQgb3V0cHV0U2hhcGU6IFNoYXBlO1xuICAgIGlmIChpbnB1dFNoYXBlWzBdID09IG51bGwpIHtcbiAgICAgIG91dHB1dFNoYXBlID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlWzBdLnNsaWNlKDEpO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0U2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHNoYXBlID0gaW5wdXRTaGFwZVtpXSA9PSBudWxsID8gbnVsbCA6IGlucHV0U2hhcGVbaV0uc2xpY2UoMSk7XG4gICAgICBvdXRwdXRTaGFwZSA9IHRoaXMuY29tcHV0ZUVsZW1lbnR3aXNlT3BPdXRwdXRTaGFwZShvdXRwdXRTaGFwZSwgc2hhcGUpO1xuICAgIH1cblxuICAgIGxldCBiYXRjaFNpemVzOiBudW1iZXJbXSA9IFtdO1xuICAgIGZvciAoY29uc3Qgc2hhcGUgb2YgaW5wdXRTaGFwZSkge1xuICAgICAgaWYgKHNoYXBlICE9IG51bGwgJiYgc2hhcGVbMF0gIT09IG51bGwpIHtcbiAgICAgICAgYmF0Y2hTaXplcy5wdXNoKHNoYXBlWzBdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgYmF0Y2hTaXplcyA9IGdlbmVyaWNfdXRpbHMudW5pcXVlKGJhdGNoU2l6ZXMpO1xuICAgIGlmIChiYXRjaFNpemVzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgb3V0cHV0U2hhcGUgPSBiYXRjaFNpemVzLmNvbmNhdChvdXRwdXRTaGFwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFNoYXBlID0gW251bGxdLmNvbmNhdChvdXRwdXRTaGFwZSk7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRTaGFwZTtcbiAgfVxuXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGZjLnRpZHkoKCkgPT4ge1xuICAgICAgaWYgKG1hc2sgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmICghQXJyYXkuaXNBcnJheShtYXNrKSkge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignYG1hc2tgIHNob3VsZCBiZSBhbiBBcnJheScpO1xuICAgICAgfVxuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoJ2BpbnB1dHNgIHNob3VsZCBiZSBhbiBBcnJheScpO1xuICAgICAgfVxuICAgICAgaWYgKG1hc2subGVuZ3RoICE9PSBpbnB1dHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFRoZSBBcnJheSAnaW5wdXRzJyBhbmQgJ21hc2snIGFyZSBleHBlY3RlZCB0byBoYXZlIHRoZSBzYW1lIGAgK1xuICAgICAgICAgICAgYGxlbmd0aCwgYnV0IGhhdmUgZGlmZmVyZW50IGxlbmd0aHMgYCArXG4gICAgICAgICAgICBgKCR7aW5wdXRzLmxlbmd0aH0gdnMgJHttYXNrLmxlbmd0aH0pYCk7XG4gICAgICB9XG4gICAgICBpZiAobWFzay5ldmVyeShtID0+IG0gPT0gbnVsbCkpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBtYXNrID0gbWFzay5tYXAobSA9PiBtID09IG51bGwgPyBtIDogdGZjLmV4cGFuZERpbXMobSwgMCkpO1xuICAgICAgbGV0IG91dHB1dCA9IG1hc2tbMF07XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IG1hc2subGVuZ3RoIC0gMTsgKytpKSB7XG4gICAgICAgIG91dHB1dCA9IHRmYy5sb2dpY2FsQW5kKG91dHB1dCwgbWFza1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBZGQgZXh0ZW5kcyBNZXJnZSB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0FkZCc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dHNbMF0uY2xvbmUoKTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG91dHB1dCA9IHRmYy5hZGQob3V0cHV0LCBpbnB1dHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEFkZCk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBlbGVtZW50LXdpc2Ugc3VtIG9mIGlucHV0cywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgaW52b2tlZCBpbiB0aHJlZSB3YXlzLlxuICpcbiAqIDEuIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBgQWRkYCBsYXllciwgYnkgdXNpbmcgbm8gaW5wdXQgYXJndW1lbnRcbiAqICAgIG9yIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24gYXJndW1lbnQuIFRoZSByZXN1bHRhbnQgYEFkZGAgbGF5ZXIgY2FuIHRoZW5cbiAqICAgIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYWRkTGF5ZXIgPSB0Zi5sYXllcnMuYWRkKCk7XG4gKlxuICogLy8gVGhlIGxheWVyIGNhbiBiZSBhcHBsaWVkIHRvIGlucHV0cy5cbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gYWRkTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAyLiBJbnZva2UgZGlyZWN0bHkgb24gYW4gYEFycmF5YCBvZiBgdGYuU3ltYm9saWNUZW5zb3Jgcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlN5bWJvbGljVGVuc29yYC4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLmFkZChbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKG91dHB1dC5zaGFwZSk7XG4gKiAvLyBZb3UgZ2V0IFtudWxsLCAyLCAyXSwgd2l0aCB0aGUgZmlyc3QgZGltZW5zaW9uIGFzIHRoZSB1bmRldGVybWluZWQgYmF0Y2hcbiAqIC8vIGRpbWVuc2lvbi5cbiAqIGBgYFxuICpcbiAqIDMuIEludm9rZSBkaXJlY3RseSBvbiBgdGYuVGVuc29yYHMsIGkuZS4sIGNvbmNyZXRlIHZhbHVlcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlRlbnNvcmAgYXMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uIEZvclxuICogZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQxID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICogY29uc3QgaW5wdXQyID0gdGYudGVuc29yMmQoWzEwLCAyMCwgMzAsIDQwXSwgWzIsIDJdKTtcbiAqIHRmLmxheWVycy5hZGQoW2lucHV0MSwgaW5wdXQyXSkucHJpbnQoKTtcbiAqIC8vIEdpdmVzIFtbMTEsIDIyXSwgWzMzLCA0NF1dLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZChjb25maWc/OiBTeW1ib2xpY1RlbnNvcltdfFRlbnNvcltdfExheWVyQXJncyk6IExheWVyfFxuICAgIFN5bWJvbGljVGVuc29yfFRlbnNvciB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBBZGQoe30pO1xuICAgIHJldHVybiBsYXllci5hcHBseShjb25maWcpIGFzIFN5bWJvbGljVGVuc29yIHwgVGVuc29yO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgQWRkKGNvbmZpZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpcGx5IGV4dGVuZHMgTWVyZ2Uge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdNdWx0aXBseSc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dHNbMF0uY2xvbmUoKTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgaW5wdXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIG91dHB1dCA9IHRmYy5tdWwob3V0cHV0LCBpbnB1dHNbaV0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKE11bHRpcGx5KTtcblxuLyoqXG4gKiBDYWxjdWxhdGUgdGhlIGVsZW1lbnQtd2lzZSBwcm9kdWN0IG9mIGlucHV0cywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWUgc2hhcGUuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgaW52b2tlZCBpbiB0aHJlZSB3YXlzLlxuICpcbiAqIDEuIENvbnN0cnVjdCBhbiBpbnN0YW5jZSBvZiBgTXVsdGlwbHlgIGxheWVyLCBieSB1c2luZyBubyBpbnB1dCBhcmd1bWVudFxuICogICAgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBhcmd1bWVudC4gVGhlIHJlc3VsdGFudCBgTXVsdGlwbHlgIGxheWVyIGNhblxuICogICAgdGhlbiBiZSB1c2VkIG9uIGB0Zi5TeW1ib2xpY1RlbnNvcmBzIG9yIGB0Zi5UZW5zb3Jgcy4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IG11bHRpcGx5TGF5ZXIgPSB0Zi5sYXllcnMubXVsdGlwbHkoKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBtdWx0aXBseUxheWVyLmFwcGx5KFtpbnB1dDEsIGlucHV0Ml0pO1xuICogY29uc29sZS5sb2cob3V0cHV0LnNoYXBlKTtcbiAqIC8vIFlvdSBnZXQgW251bGwsIDIsIDJdLCB3aXRoIHRoZSBmaXJzdCBkaW1lbnNpb24gYXMgdGhlIHVuZGV0ZXJtaW5lZCBiYXRjaFxuICogLy8gZGltZW5zaW9uLlxuICogYGBgXG4gKlxuICogMi4gSW52b2tlIGRpcmVjdGx5IG9uIGFuIGBBcnJheWAgb2YgYHRmLlN5bWJvbGljVGVuc29yYHMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5TeW1ib2xpY1RlbnNvcmAuIEZvciBleGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBpbnB1dDEgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3QgaW5wdXQyID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IG91dHB1dCA9IHRmLmxheWVycy5tdWx0aXBseShbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKG91dHB1dC5zaGFwZSk7XG4gKiAvLyBZb3UgZ2V0IFtudWxsLCAyLCAyXSwgd2l0aCB0aGUgZmlyc3QgZGltZW5zaW9uIGFzIHRoZSB1bmRldGVybWluZWQgYmF0Y2hcbiAqIC8vIGRpbWVuc2lvbi5cbiAqIGBgYFxuICpcbiAqIDMuIEludm9rZSBkaXJlY3RseSBvbiBgdGYuVGVuc29yYHMsIGkuZS4sIGNvbmNyZXRlIHZhbHVlcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlRlbnNvcmAgYXMgdGhlIHJlc3VsdCBvZiB0aGUgY29tcHV0YXRpb24uIEZvclxuICogZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQxID0gdGYudGVuc29yMmQoWzEsIDIsIDMsIDRdLCBbMiwgMl0pO1xuICogY29uc3QgaW5wdXQyID0gdGYudGVuc29yMmQoWzEwLCAyMCwgMzAsIDQwXSwgWzIsIDJdKTtcbiAqIHRmLmxheWVycy5tdWx0aXBseShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1sxMCwgNDBdLCBbOTAsIDE2MF1dLlxuICpcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG11bHRpcGx5KGNvbmZpZz86IFN5bWJvbGljVGVuc29yW118VGVuc29yW118TGF5ZXJBcmdzKTogTGF5ZXJ8XG4gICAgU3ltYm9saWNUZW5zb3J8VGVuc29yIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnKSkge1xuICAgIGNvbnN0IGxheWVyID0gbmV3IE11bHRpcGx5KHt9KTtcbiAgICByZXR1cm4gbGF5ZXIuYXBwbHkoY29uZmlnKSBhcyBTeW1ib2xpY1RlbnNvciB8IFRlbnNvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IE11bHRpcGx5KGNvbmZpZyk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF2ZXJhZ2UgZXh0ZW5kcyBNZXJnZSB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0F2ZXJhZ2UnO1xuICBjb25zdHJ1Y3RvcihhcmdzPzogTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgbWVyZ2VGdW5jdGlvbihpbnB1dHM6IFRlbnNvcltdKTogVGVuc29yIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBsZXQgb3V0cHV0ID0gaW5wdXRzWzBdLmNsb25lKCk7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBvdXRwdXQgPSB0ZmMuYWRkKG91dHB1dCwgaW5wdXRzW2ldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZmMubXVsKDEgLyBpbnB1dHMubGVuZ3RoLCBvdXRwdXQpO1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQXZlcmFnZSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBlbGVtZW50LXdpc2UgYXJpdGhtZXRpYyBtZWFuIG9mIGlucHV0cywgd2hpY2ggYWxsIGhhdmUgdGhlIHNhbWVcbiAqIHNoYXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgaW4gdGhyZWUgd2F5cy5cbiAqXG4gKiAxLiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgYEF2ZXJhZ2VgIGxheWVyLCBieSB1c2luZyBubyBpbnB1dCBhcmd1bWVudFxuICogICAgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBhcmd1bWVudC4gVGhlIHJlc3VsdGFudCBgQXZlcmFnZWAgbGF5ZXIgY2FuIHRoZW5cbiAqICAgIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgYXZlcmFnZUxheWVyID0gdGYubGF5ZXJzLmF2ZXJhZ2UoKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBhdmVyYWdlTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAyLiBJbnZva2UgZGlyZWN0bHkgb24gYW4gYEFycmF5YCBvZiBgdGYuU3ltYm9saWNUZW5zb3Jgcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlN5bWJvbGljVGVuc29yYC4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLmF2ZXJhZ2UoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAzLiBJbnZva2UgZGlyZWN0bHkgb24gYHRmLlRlbnNvcmBzLCBpLmUuLCBjb25jcmV0ZSB2YWx1ZXMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5UZW5zb3JgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLnRlbnNvcjJkKFsxLCAyLCAzLCA0XSwgWzIsIDJdKTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLnRlbnNvcjJkKFsxMCwgMjAsIDMwLCA0MF0sIFsyLCAyXSk7XG4gKiB0Zi5sYXllcnMuYXZlcmFnZShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1s1LjUsIDExXSwgWzE2LjUsIDIyXV0uXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gYXZlcmFnZShjb25maWc/OiBTeW1ib2xpY1RlbnNvcltdfFRlbnNvcltdfExheWVyQXJncyk6IExheWVyfFxuICAgIFN5bWJvbGljVGVuc29yfFRlbnNvciB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBBdmVyYWdlKHt9KTtcbiAgICByZXR1cm4gbGF5ZXIuYXBwbHkoY29uZmlnKSBhcyBTeW1ib2xpY1RlbnNvciB8IFRlbnNvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IEF2ZXJhZ2UoY29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4aW11bSBleHRlbmRzIE1lcmdlIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWF4aW11bSc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dHNbMF07XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBvdXRwdXQgPSB0ZmMubWF4aW11bShvdXRwdXQsIGlucHV0c1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWF4aW11bSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBlbGVtZW50LXdpc2UgbWF4aW11bSBvZiBpbnB1dHMsIHdoaWNoIGFsbCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgaW4gdGhyZWUgd2F5cy5cbiAqXG4gKiAxLiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgYE1heGltdW1gIGxheWVyLCBieSB1c2luZyBubyBpbnB1dCBhcmd1bWVudFxuICogICAgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBhcmd1bWVudC4gVGhlIHJlc3VsdGFudCBgTWF4aW11bWAgbGF5ZXIgY2FuIHRoZW5cbiAqICAgIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbWF4aW11bUxheWVyID0gdGYubGF5ZXJzLm1heGltdW0oKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBtYXhpbXVtTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAyLiBJbnZva2UgZGlyZWN0bHkgb24gYW4gYEFycmF5YCBvZiBgdGYuU3ltYm9saWNUZW5zb3Jgcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlN5bWJvbGljVGVuc29yYC4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLm1heGltdW0oW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAzLiBJbnZva2UgZGlyZWN0bHkgb24gYHRmLlRlbnNvcmBzLCBpLmUuLCBjb25jcmV0ZSB2YWx1ZXMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5UZW5zb3JgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLnRlbnNvcjJkKFsxLCAyMCwgMywgNDBdLCBbMiwgMl0pO1xuICogY29uc3QgaW5wdXQyID0gdGYudGVuc29yMmQoWzEwLCAyLCAzMCwgNF0sIFsyLCAyXSk7XG4gKiB0Zi5sYXllcnMubWF4aW11bShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1sxMCwgMjBdLCBbMzAsIDQwXV0uXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gbWF4aW11bShjb25maWc/OiBTeW1ib2xpY1RlbnNvcltdfFRlbnNvcltdfExheWVyQXJncyk6IExheWVyfFxuICAgIFN5bWJvbGljVGVuc29yfFRlbnNvciB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBNYXhpbXVtKHt9KTtcbiAgICByZXR1cm4gbGF5ZXIuYXBwbHkoY29uZmlnKSBhcyBTeW1ib2xpY1RlbnNvciB8IFRlbnNvcjtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbmV3IE1heGltdW0oY29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWluaW11bSBleHRlbmRzIE1lcmdlIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWluaW11bSc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGxldCBvdXRwdXQgPSBpbnB1dHNbMF07XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBvdXRwdXQgPSB0ZmMubWluaW11bShvdXRwdXQsIGlucHV0c1tpXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWluaW11bSk7XG5cbi8qKlxuICogQ2FsY3VsYXRlIHRoZSBlbGVtZW50LXdpc2UgbWluaW11bSBvZiBpbnB1dHMsIHdoaWNoIGFsbCBoYXZlIHRoZSBzYW1lIHNoYXBlLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGludm9rZWQgaW4gdGhyZWUgd2F5cy5cbiAqXG4gKiAxLiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgYE1pbmltdW1gIGxheWVyLCBieSB1c2luZyBubyBpbnB1dCBhcmd1bWVudFxuICogICAgb3IgYSBzaW5nbGUgY29uZmlndXJhdGlvbiBhcmd1bWVudC4gVGhlIHJlc3VsdGFudCBgTWluaW11bWAgbGF5ZXIgY2FuIHRoZW5cbiAqICAgIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgbWluaW11bUxheWVyID0gdGYubGF5ZXJzLm1pbmltdW0oKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgMl19KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBtaW5pbXVtTGF5ZXIuYXBwbHkoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAyLiBJbnZva2UgZGlyZWN0bHkgb24gYW4gYEFycmF5YCBvZiBgdGYuU3ltYm9saWNUZW5zb3Jgcy4gVGhpcyBjb25zdHJ1Y3RzXG4gKiAgICBhbiBgTGF5ZXJgIG9iamVjdCBpbnRlcm5hbGx5IGFuZCBjYWxscyBpdHMgYGFwcGx5YCBtZXRob2Qgb24gdGhlIGlucHV0cyxcbiAqICAgIGdlbmVyYXRpbmcgYSBuZXcgYHRmLlN5bWJvbGljVGVuc29yYC4gRm9yIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDJdfSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi5pbnB1dCh7c2hhcGU6IFsyLCAyXX0pO1xuICogY29uc3Qgb3V0cHV0ID0gdGYubGF5ZXJzLm1pbmltdW0oW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24uXG4gKiBgYGBcbiAqXG4gKiAzLiBJbnZva2UgZGlyZWN0bHkgb24gYHRmLlRlbnNvcmBzLCBpLmUuLCBjb25jcmV0ZSB2YWx1ZXMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5UZW5zb3JgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLnRlbnNvcjJkKFsxLCAyMCwgMywgNDBdLCBbMiwgMl0pO1xuICogY29uc3QgaW5wdXQyID0gdGYudGVuc29yMmQoWzEwLCAyLCAzMCwgNF0sIFsyLCAyXSk7XG4gKiB0Zi5sYXllcnMubWluaW11bShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1sxLCAyXSwgWzMsIDRdXS5cbiAqXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBtaW5pbXVtKGNvbmZpZz86IFN5bWJvbGljVGVuc29yW118VGVuc29yW118TGF5ZXJBcmdzKTogTGF5ZXJ8XG4gICAgU3ltYm9saWNUZW5zb3J8VGVuc29yIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnKSkge1xuICAgIGNvbnN0IGxheWVyID0gbmV3IE1pbmltdW0oe30pO1xuICAgIHJldHVybiBsYXllci5hcHBseShjb25maWcpIGFzIFN5bWJvbGljVGVuc29yIHwgVGVuc29yO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBuZXcgTWluaW11bShjb25maWcpO1xuICB9XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBDb25jYXRlbmF0ZUxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBBeGlzIGFsb25nIHdoaWNoIHRvIGNvbmNhdGVuYXRlLlxuICAgKi9cbiAgYXhpcz86IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIENvbmNhdGVuYXRlIGV4dGVuZHMgTWVyZ2Uge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdDb25jYXRlbmF0ZSc7XG4gIHJlYWRvbmx5IERFRkFVTFRfQVhJUyA9IC0xO1xuICBwcml2YXRlIHJlYWRvbmx5IGF4aXM6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogQ29uY2F0ZW5hdGVMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuICAgIHRoaXMuYXhpcyA9IGFyZ3MuYXhpcyA9PSBudWxsID8gdGhpcy5ERUZBVUxUX0FYSVMgOiBhcmdzLmF4aXM7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVzaGFwZVJlcXVpcmVkID0gZmFsc2U7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgLy8gVXNlZCBwdXJlbHkgZm9yIHNoYXBlIHZhbGlkYXRpb24uXVxuICAgIGlmICghKEFycmF5LmlzQXJyYXkoaW5wdXRTaGFwZSkgJiYgQXJyYXkuaXNBcnJheShpbnB1dFNoYXBlWzBdKSkgfHxcbiAgICAgICAgaW5wdXRTaGFwZS5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdBIGBDb25jYXRlbmF0ZWAgbGF5ZXIgc2hvdWxkIGJlIGNhbGxlZCBvbiBhIGxpc3Qgb2YgYXQgbGVhc3QgMiAnICtcbiAgICAgICAgICAnaW5wdXRzJyk7XG4gICAgfVxuICAgIGlucHV0U2hhcGUgPSBpbnB1dFNoYXBlIGFzIFNoYXBlW107XG5cbiAgICBsZXQgYWxsTm9uZVNoYXBlID0gdHJ1ZTtcbiAgICBmb3IgKGNvbnN0IHNoYXBlIG9mIGlucHV0U2hhcGUpIHtcbiAgICAgIGlmIChzaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIGFsbE5vbmVTaGFwZSA9IGZhbHNlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGFsbE5vbmVTaGFwZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHNoYXBlU2V0OiBTaGFwZVtdID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dFNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBzaGFwZVdpdGhvdXRDb25jYXRBeGlzID0gaW5wdXRTaGFwZVtpXS5zbGljZSgpO1xuICAgICAgc2hhcGVXaXRob3V0Q29uY2F0QXhpcy5zcGxpY2UodGhpcy5heGlzLCAxKTtcbiAgICAgIGxldCBleGlzdHMgPSBmYWxzZTtcbiAgICAgIGZvciAoY29uc3Qgc2hhcGUgb2Ygc2hhcGVTZXQpIHtcbiAgICAgICAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHNoYXBlV2l0aG91dENvbmNhdEF4aXMpKSB7XG4gICAgICAgICAgZXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKCFleGlzdHMpIHtcbiAgICAgICAgc2hhcGVTZXQucHVzaChzaGFwZVdpdGhvdXRDb25jYXRBeGlzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHNoYXBlU2V0Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICdBIGBDb25jYXRlbmF0ZWAgbGF5ZXIgcmVxdWlyZXMgaW5wdXRzIHdpdGggbWF0Y2hpbmcgc2hhcGVzICcgK1xuICAgICAgICAgICdleGNlcHQgZm9yIHRoZSBjb25jYXQgYXhpcy4gR290IGlucHV0IHNoYXBlczogJyArXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoaW5wdXRTaGFwZSkpO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIHJldHVybiBLLmNvbmNhdGVuYXRlKGlucHV0cywgdGhpcy5heGlzKTtcbiAgICB9KTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaWYgKCEoQXJyYXkuaXNBcnJheShpbnB1dFNoYXBlKSAmJiBBcnJheS5pc0FycmF5KGlucHV0U2hhcGVbMF0pKSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgJ0EgYENvbmNhdGVuYXRlYCBsYXllciBzaG91bGQgYmUgY2FsbGVkIG9uIGEgbGlzdCBvZiBpbnB1dHMuJyk7XG4gICAgfVxuICAgIGNvbnN0IGlucHV0U2hhcGVzID0gaW5wdXRTaGFwZSBhcyBTaGFwZVtdO1xuICAgIGNvbnN0IG91dHB1dFNoYXBlID0gaW5wdXRTaGFwZXNbMF0uc2xpY2UoKTtcbiAgICBjb25zdCBheGlzID0gdGhpcy5heGlzIDwgMCA/IG91dHB1dFNoYXBlLmxlbmd0aCArIHRoaXMuYXhpcyA6IHRoaXMuYXhpcztcbiAgICAvLyBQb3J0aW5nIE5vdGU6IHRoZSBsaW5lIGFib3ZlIGlzIGJlY2F1c2UgVHlwZVNjcmlwdCBkb2Vzbid0IHN1cHBvcnRcbiAgICAvLyAgIG5lZ2F0aXZlIGluZGljZXMuXG4gICAgZm9yIChjb25zdCBzaGFwZSBvZiBpbnB1dFNoYXBlcy5zbGljZSgxKSkge1xuICAgICAgaWYgKG91dHB1dFNoYXBlW2F4aXNdID09IG51bGwgfHwgc2hhcGVbYXhpc10gPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXRTaGFwZVtheGlzXSA9IG51bGw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgb3V0cHV0U2hhcGVbYXhpc10gKz0gc2hhcGVbYXhpc107XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXRTaGFwZTtcbiAgfVxuXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yIHtcbiAgICBpZiAobWFzayA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KG1hc2spKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcignYG1hc2tgIHNob3VsZCBiZSBhbiBhcnJheSBmb3IgQ29uY2F0ZW5hdGUnKTtcbiAgICB9XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KGlucHV0cykpIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKCdgaW5wdXRzYCBzaG91bGQgYmUgYW4gYXJyYXkgZm9yIENvbmNhdGVuYXRlJyk7XG4gICAgfVxuICAgIGlmIChtYXNrLmxlbmd0aCAhPT0gaW5wdXRzLmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYE1pc21hdGNoIGluIHRoZSBsZW5ndGggb2YgbWFzayAoJHttYXNrLmxlbmd0aH0pIGAgK1xuICAgICAgICAgIGBhbmQgdGhlIGxlZ250aCBvZiBpbnB1dHMgKCR7aW5wdXRzLmxlbmd0aH0pYCk7XG4gICAgfVxuICAgIHJldHVybiB0ZmMudGlkeSgoKSA9PiB7XG4gICAgICBsZXQgYWxsTnVsbE1hc2tzID0gdHJ1ZTtcbiAgICAgIG1hc2suZm9yRWFjaChtID0+IHtcbiAgICAgICAgaWYgKG0gIT0gbnVsbCkge1xuICAgICAgICAgIGFsbE51bGxNYXNrcyA9IGZhbHNlO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBpZiAoYWxsTnVsbE1hc2tzKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY29uc3Qgb3V0cHV0TWFza3M6IFRlbnNvcltdID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0cy5sZW5ndGg7ICsraSkge1xuICAgICAgICBpZiAobWFza1tpXSA9PSBudWxsKSB7XG4gICAgICAgICAgLy8gSW5wdXQgaXMgdW5tYXNrZWQuIEFwcGVuZCBhbGwgMSdzIHRvIG1hc2tzLlxuICAgICAgICAgIG91dHB1dE1hc2tzLnB1c2godGZjLmNhc3QodGZjLm9uZXNMaWtlKGlucHV0c1tpXSksICdib29sJykpO1xuICAgICAgICB9IGVsc2UgaWYgKG1hc2tbaV0ucmFuayA8IGlucHV0c1tpXS5yYW5rKSB7XG4gICAgICAgICAgLy8gTWFzayBpcyBzbWFsbGVyIHRoYW4gdGhlIGlucHV0LCBleHBhbmQgaXQuXG4gICAgICAgICAgb3V0cHV0TWFza3MucHVzaCh0ZmMuZXhwYW5kRGltcyhtYXNrW2ldLCAtMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG91dHB1dE1hc2tzLnB1c2gobWFza1tpXSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbmNhdGVuYXRlZE1hc2tzID0gdGZjLmNvbmNhdChvdXRwdXRNYXNrcywgdGhpcy5heGlzKTtcbiAgICAgIHJldHVybiB0ZmMuYWxsKGNvbmNhdGVuYXRlZE1hc2tzLCAtMSwgZmFsc2UpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICAnYXhpcyc6IHRoaXMuYXhpcyxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKENvbmNhdGVuYXRlKTtcblxuLyoqXG4gKiBDb25jYXRlbmF0ZSBhbiBgQXJyYXlgIG9mIGlucHV0cy5cbiAqXG4gKiBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBpbnZva2VkIGluIHRocmVlIHdheXMuXG4gKlxuICogMS4gQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIGBDb25jYXRlbmF0ZWAgbGF5ZXIsIGJ5IHVzaW5nIG5vIGlucHV0IGFyZ3VtZW50XG4gKiAgICBvciBhIHNpbmdsZSBjb25maWd1cmF0aW9uIGFyZ3VtZW50LiBUaGUgcmVzdWx0YW50IGBDb25jYXRlbmF0ZWAgbGF5ZXIgY2FuXG4gKiAgICB0aGVuIGJlIHVzZWQgb24gYHRmLlN5bWJvbGljVGVuc29yYHMgb3IgYHRmLlRlbnNvcmBzLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgY29uY2F0TGF5ZXIgPSB0Zi5sYXllcnMuY29uY2F0ZW5hdGUoKTtcbiAqXG4gKiAvLyBUaGUgbGF5ZXIgY2FuIGJlIGFwcGxpZWQgdG8gaW5wdXRzLlxuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgM119KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDRdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSBjb25jYXRMYXllci5hcHBseShbaW5wdXQxLCBpbnB1dDJdKTtcbiAqIGNvbnNvbGUubG9nKG91dHB1dC5zaGFwZSk7XG4gKiAvLyBZb3UgZ2V0IFtudWxsLCAyLCA3XSwgd2l0aCB0aGUgZmlyc3QgZGltZW5zaW9uIGFzIHRoZSB1bmRldGVybWluZWQgYmF0Y2hcbiAqIC8vIGRpbWVuc2lvbiBhbmQgdGhlIGxhc3QgZGltZW5zaW9uIGFzIHRoZSByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyB0aGVcbiAqIC8vIGxhc3QgZGltZW5zaW9ucyBvZiB0aGUgdHdvIGlucHV0cy5cbiAqIGBgYFxuICpcbiAqIDIuIEludm9rZSBkaXJlY3RseSBvbiBhbiBgQXJyYXlgIG9mIGB0Zi5TeW1ib2xpY1RlbnNvcmBzLiBUaGlzIGNvbnN0cnVjdHNcbiAqICAgIGFuIGBMYXllcmAgb2JqZWN0IGludGVybmFsbHkgYW5kIGNhbGxzIGl0cyBgYXBwbHlgIG1ldGhvZCBvbiB0aGUgaW5wdXRzLFxuICogICAgZ2VuZXJhdGluZyBhIG5ldyBgdGYuU3ltYm9saWNUZW5zb3JgLiBGb3IgZXhhbXBsZTpcbiAqXG4gKiBgYGBqc1xuICogY29uc3QgaW5wdXQxID0gdGYuaW5wdXQoe3NoYXBlOiBbMiwgM119KTtcbiAqIGNvbnN0IGlucHV0MiA9IHRmLmlucHV0KHtzaGFwZTogWzIsIDRdfSk7XG4gKiBjb25zdCBvdXRwdXQgPSB0Zi5sYXllcnMuY29uY2F0ZW5hdGUoW2lucHV0MSwgaW5wdXQyXSk7XG4gKiBjb25zb2xlLmxvZyhvdXRwdXQuc2hhcGUpO1xuICogLy8gWW91IGdldCBbbnVsbCwgMiwgMl0sIHdpdGggdGhlIGZpcnN0IGRpbWVuc2lvbiBhcyB0aGUgdW5kZXRlcm1pbmVkIGJhdGNoXG4gKiAvLyBkaW1lbnNpb24gYW5kIHRoZSBsYXN0IGRpbWVuc2lvbiBhcyB0aGUgcmVzdWx0IG9mIGNvbmNhdGVuYXRpbmcgdGhlXG4gKiAvLyBsYXN0IGRpbWVuc2lvbnMgb2YgdGhlIHR3byBpbnB1dHMuXG4gKiBgYGBcbiAqXG4gKiAzLiBJbnZva2UgZGlyZWN0bHkgb24gYHRmLlRlbnNvcmBzLCBpLmUuLCBjb25jcmV0ZSB2YWx1ZXMuIFRoaXMgY29uc3RydWN0c1xuICogICAgYW4gYExheWVyYCBvYmplY3QgaW50ZXJuYWxseSBhbmQgY2FsbHMgaXRzIGBhcHBseWAgbWV0aG9kIG9uIHRoZSBpbnB1dHMsXG4gKiAgICBnZW5lcmF0aW5nIGEgbmV3IGB0Zi5UZW5zb3JgIGFzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXB1dGF0aW9uLiBGb3JcbiAqIGV4YW1wbGU6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IGlucHV0MSA9IHRmLnRlbnNvcjJkKFtbMSwgMl0sIFszLCA0XV0sIFsyLCAyXSk7XG4gKiBjb25zdCBpbnB1dDIgPSB0Zi50ZW5zb3IyZChbWzEwLCAyMF0sIFszMCwgNDBdXSwgWzIsIDJdKTtcbiAqIHRmLmxheWVycy5jb25jYXRlbmF0ZShbaW5wdXQxLCBpbnB1dDJdKS5wcmludCgpO1xuICogLy8gR2l2ZXMgW1sxLCAyLCAxMCwgMjBdLCBbMywgNCwgMzAsIDQwXV0uXG4gKlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0ZW5hdGUoY29uZmlnPzogU3ltYm9saWNUZW5zb3JbXXxUZW5zb3JbXXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25jYXRlbmF0ZUxheWVyQXJncyk6IExheWVyfFN5bWJvbGljVGVuc29yfFRlbnNvciB7XG4gIGlmIChBcnJheS5pc0FycmF5KGNvbmZpZykpIHtcbiAgICBjb25zdCBsYXllciA9IG5ldyBDb25jYXRlbmF0ZSh7fSk7XG4gICAgcmV0dXJuIGxheWVyLmFwcGx5KGNvbmZpZykgYXMgU3ltYm9saWNUZW5zb3IgfCBUZW5zb3I7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIG5ldyBDb25jYXRlbmF0ZShjb25maWcpO1xuICB9XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBEb3RMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogQXhpcyBvciBheGVzIGFsb25nIHdoaWNoIHRoZSBkb3QgcHJvZHVjdCB3aWxsIGJlIHRha2VuLlxuICAgKlxuICAgKiBJbnRlZ2VyIG9yIGFuIEFycmF5IG9mIGludGVnZXJzLlxuICAgKi9cbiAgYXhlczogbnVtYmVyfFtudW1iZXIsIG51bWJlcl07XG5cbiAgLyoqXG4gICAqIFdoZXRoZXIgdG8gTDItbm9ybWFsaXplIHNhbXBsZXMgYWxvbmcgdGhlIGRvdCBwcm9kdWN0IGF4aXNcbiAgICogYmVmb3JlIHRha2luZyB0aGUgZG90IHByb2R1Y3QuXG4gICAqXG4gICAqIElmIHNldCB0byBgdHJ1ZWAsIHRoZSBvdXRwdXQgb2YgdGhlIGRvdCBwcm9kdWN0IGlzIHRoZSBjb3NpbmVcbiAgICogcHJveGltaXR5IGJldHdlZW4gdGhlIHR3byBzYW1wbGVzLlxuICAgKi9cbiAgbm9ybWFsaXplPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBJbnRlcnByZXRhYmxlIHBvdGVudGlhbGx5IG5lZ2F0aXZlIGF4aXMgaW5kZXguXG4gKlxuICogRm9yIGV4YW1wbGUsIGdpdmVuIGF4aXMgPSAtMSwgYW5kIGRpbSA9IDMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMi5cbiAqXG4gKiBAcGFyYW0gYXhpcyBUaGUgYXhpcyBpbmRleCwgbWF5IGJlIGEgcG9zaXRpdmUsIHplcm8gb3IgbmVnYXRpdmUgaW50ZWdlci5cbiAqIEBwYXJhbSBkaW0gVG90YWwgbnVtYmVyIG9mIGRpbWVuc2lvbnMsIGEgcG9zaXRpdmUgaW50ZWdlci5cbiAqIEByZXR1cm5zIEEgbm9uLW5lZ2F0aXZlIGF4aXMgaW5kZXggZXF1aXZhbGVudCB0byB0aGUgaW5wdXQgYGF4aXNgLlxuICovXG5mdW5jdGlvbiBpbnRlcnByZXRBeGlzKGF4aXM6IG51bWJlciwgZGltOiBudW1iZXIpOiBudW1iZXIge1xuICB3aGlsZSAoYXhpcyA8IDApIHtcbiAgICBheGlzICs9IGRpbTtcbiAgfVxuICByZXR1cm4gYXhpcztcbn1cblxuZnVuY3Rpb24gYmF0Y2hEb3QoeDogVGVuc29yLCB5OiBUZW5zb3IsIGF4ZXM6IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdKTogVGVuc29yIHtcbiAgaWYgKHguc2hhcGUubGVuZ3RoID4gMyB8fCB5LnNoYXBlLmxlbmd0aCA+IDMpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgJ2JhdGNoRG90IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGVuc29ycyBvZiA0RCBvciBoaWdoZXIgcmFuayB5ZXQnKTtcbiAgfVxuICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICB4LnNoYXBlLmxlbmd0aCA+PSAyLFxuICAgICAgKCkgPT4gYGJhdGNoRG90IHJlcXVpcmVzIHRoZSByYW5rIG9mIHggdG8gYmUgPj0gMiwgYCArXG4gICAgICAgICAgYGJ1dCBnb3QgJHt4LnNoYXBlLmxlbmd0aH1gKTtcbiAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgeC5zaGFwZS5sZW5ndGggPj0gMixcbiAgICAgICgpID0+IGBiYXRjaERvdCByZXF1aXJlcyB0aGUgcmFuayBvZiB5IHRvIGJlID49IDIsIGAgK1xuICAgICAgICAgIGBidXQgZ290ICR7eS5zaGFwZS5sZW5ndGh9YCk7XG5cbiAgaWYgKHR5cGVvZiBheGVzID09PSAnbnVtYmVyJykge1xuICAgIGF4ZXMgPSBbYXhlcywgYXhlc107XG4gIH1cblxuICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcgfHwgeS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcihcbiAgICAgICAgJ2JhdGNoRG90IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgY29tcGxleDY0LXR5cGUgVGVuc29ycyB5ZXQuJyk7XG4gIH1cblxuICBjb25zdCB4TkRpbSA9IHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCB5TkRpbSA9IHkuc2hhcGUubGVuZ3RoO1xuICBpZiAoYXhlcyA9PSBudWxsKSB7XG4gICAgLy8gQmVoYXZlIGxpa2UgYmF0Y2hNYXRtdWwgYnkgZGVmYXVsdC5cbiAgICBheGVzID0gW3hORGltIC0gMSwgeU5EaW0gLSAyXTtcbiAgfVxuICBjb25zdCBheGVzQXJyYXkgPSBheGVzIGFzIFtudW1iZXIsIG51bWJlcl07XG5cbiAgcmV0dXJuIHRmYy50aWR5KCgpID0+IHtcbiAgICBsZXQgZGlmZjogbnVtYmVyO1xuICAgIGlmICh4TkRpbSA+IHlORGltKSB7XG4gICAgICBkaWZmID0geE5EaW0gLSB5TkRpbTtcbiAgICAgIGNvbnN0IGRpZmZTaGFwZTogU2hhcGUgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlmZjsgKytpKSB7XG4gICAgICAgIGRpZmZTaGFwZS5wdXNoKDEpO1xuICAgICAgfVxuICAgICAgeSA9IHRmYy5yZXNoYXBlKHksIHkuc2hhcGUuY29uY2F0KGRpZmZTaGFwZSkpO1xuICAgIH0gZWxzZSBpZiAoeU5EaW0gPiB4TkRpbSkge1xuICAgICAgZGlmZiA9IHlORGltIC0geE5EaW07XG4gICAgICBjb25zdCBkaWZmU2hhcGU6IFNoYXBlID0gW107XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpZmY7ICsraSkge1xuICAgICAgICBkaWZmU2hhcGUucHVzaCgxKTtcbiAgICAgIH1cbiAgICAgIHggPSB0ZmMucmVzaGFwZSh4LCB4LnNoYXBlLmNvbmNhdChkaWZmU2hhcGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGlmZiA9IDA7XG4gICAgfVxuXG4gICAgbGV0IG91dDogVGVuc29yO1xuICAgIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMiAmJiB5LnNoYXBlLmxlbmd0aCA9PT0gMikge1xuICAgICAgaWYgKGF4ZXNBcnJheVswXSA9PT0gYXhlc0FycmF5WzFdKSB7XG4gICAgICAgIG91dCA9IHRmYy5zdW0odGZjLm11bCh4LCB5KSwgYXhlc0FycmF5WzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dCA9IHRmYy5zdW0odGZjLm11bCh0ZmMudHJhbnNwb3NlKHgsIFsxLCAwXSksIHkpLCBheGVzQXJyYXlbMV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhZGpYID0gYXhlc0FycmF5WzBdICE9PSB4LnNoYXBlLmxlbmd0aCAtIDE7XG4gICAgICBjb25zdCBhZGpZID0gYXhlc0FycmF5WzFdID09PSB5LnNoYXBlLmxlbmd0aCAtIDE7XG4gICAgICBvdXQgPSB0ZmMubWF0TXVsKHgsIHksIGFkalgsIGFkalkpO1xuICAgIH1cblxuICAgIGlmIChkaWZmID4gMCkge1xuICAgICAgbGV0IGlkeDogbnVtYmVyO1xuICAgICAgaWYgKHhORGltID4geU5EaW0pIHtcbiAgICAgICAgaWR4ID0geE5EaW0gKyB5TkRpbSAtIDM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZHggPSB4TkRpbSAtIDE7XG4gICAgICB9XG4gICAgICBjb25zdCBzcXVlZXplQXhlczogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSBpZHg7IGkgPCBpZHggKyBkaWZmOyArK2kpIHtcbiAgICAgICAgc3F1ZWV6ZUF4ZXMucHVzaChpKTtcbiAgICAgIH1cbiAgICAgIG91dCA9IHRmYy5zcXVlZXplKG91dCwgc3F1ZWV6ZUF4ZXMpO1xuICAgIH1cbiAgICBpZiAob3V0LnNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgb3V0ID0gdGZjLmV4cGFuZERpbXMob3V0LCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIG91dDtcbiAgfSk7XG59XG5cbmV4cG9ydCBjbGFzcyBEb3QgZXh0ZW5kcyBNZXJnZSB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0RvdCc7XG5cbiAgcHJpdmF0ZSBheGVzOiBudW1iZXJ8W251bWJlciwgbnVtYmVyXTtcbiAgcHJpdmF0ZSBub3JtYWxpemU6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYXJnczogRG90TGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5heGVzID0gYXJncy5heGVzO1xuICAgIHRoaXMubm9ybWFsaXplID0gYXJncy5ub3JtYWxpemUgPT0gbnVsbCA/IGZhbHNlIDogYXJncy5ub3JtYWxpemU7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMucmVzaGFwZVJlcXVpcmVkID0gZmFsc2U7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgdGZjLnV0aWwuYXNzZXJ0KFxuICAgICAgICBBcnJheS5pc0FycmF5KGlucHV0U2hhcGUpICYmIGlucHV0U2hhcGUubGVuZ3RoID09PSAyICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGlucHV0U2hhcGVbMF0pICYmIEFycmF5LmlzQXJyYXkoaW5wdXRTaGFwZVsxXSksXG4gICAgICAgICgpID0+ICdBIGBEb3RgIGxheWVyIHNob3VsZCBiZSBjYWxsZWQgb24gYSBsaXN0IG9mIGV4YWN0bHkgMiBpbnB1dHMuJyk7XG4gICAgY29uc3Qgc2hhcGUxID0gaW5wdXRTaGFwZVswXSBhcyBTaGFwZTtcbiAgICBjb25zdCBzaGFwZTIgPSBpbnB1dFNoYXBlWzFdIGFzIFNoYXBlO1xuICAgIGlmIChzaGFwZTEubGVuZ3RoID4gMyB8fCBzaGFwZTIubGVuZ3RoID4gMykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ0RvdCBsYXllciBkb2VzIG5vdCBzdXBwb3J0IHRlbnNvcnMgb2YgNEQgb3IgaGlnaGVyIHJhbmsgeWV0LicpO1xuICAgIH1cblxuICAgIGNvbnN0IGF4ZXMgPSB0aGlzLmludGVycHJldEF4ZXMoc2hhcGUxLCBzaGFwZTIpO1xuICAgIGlmIChzaGFwZTFbYXhlc1swXV0gIT09IHNoYXBlMltheGVzWzFdXSkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYERpbWVuc2lvbiBpbmNvbXBhdGliaWxpdHk6IGAgK1xuICAgICAgICAgIGAke3NoYXBlMVtheGVzWzBdXX0gIT09ICR7c2hhcGUyW2F4ZXNbMV1dfWApO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBtZXJnZUZ1bmN0aW9uKGlucHV0czogVGVuc29yW10pOiBUZW5zb3Ige1xuICAgIGlmIChpbnB1dHMubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnQSBgRG90YCBsYXllciBtdXN0IGJlIGNhbGxlZCBvbiBleGFjdGx5IDIgaW5wdXRzLCAnICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQocykuYCk7XG4gICAgfVxuXG4gICAgbGV0IHgxID0gaW5wdXRzWzBdO1xuICAgIGxldCB4MiA9IGlucHV0c1sxXTtcbiAgICBsZXQgYXhlczogW251bWJlciwgbnVtYmVyXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5heGVzKSkge1xuICAgICAgYXhlcyA9IFtcbiAgICAgICAgaW50ZXJwcmV0QXhpcyh0aGlzLmF4ZXMsIHgxLnNoYXBlLmxlbmd0aCksXG4gICAgICAgIGludGVycHJldEF4aXModGhpcy5heGVzLCB4Mi5zaGFwZS5sZW5ndGgpXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICBheGVzID0gdGhpcy5heGVzLm1hcChcbiAgICAgICAgICAgICAgICAgKGF4aXMsIGkpID0+IGludGVycHJldEF4aXMoXG4gICAgICAgICAgICAgICAgICAgICBheGlzLCBpbnB1dHNbaV0uc2hhcGUubGVuZ3RoKSkgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICB9XG4gICAgaWYgKHRoaXMubm9ybWFsaXplKSB7XG4gICAgICB4MSA9IGwyTm9ybWFsaXplKHgxLCBheGVzWzBdKTtcbiAgICAgIHgyID0gbDJOb3JtYWxpemUoeDIsIGF4ZXNbMV0pO1xuICAgIH1cbiAgICByZXR1cm4gYmF0Y2hEb3QoeDEsIHgyLCBheGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgaW50ZXJwcmV0QXhlcyhzaGFwZTE6IFNoYXBlLCBzaGFwZTI6IFNoYXBlKTogbnVtYmVyW10ge1xuICAgIGxldCBheGVzOiBudW1iZXJbXTtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodGhpcy5heGVzKSkge1xuICAgICAgLy8gYHRoaXMuYXhlc2AgaXMgYSBzaW5nbGUgaW50ZWdlci5cbiAgICAgIGF4ZXMgPSBbXG4gICAgICAgIGludGVycHJldEF4aXModGhpcy5heGVzLCBzaGFwZTEubGVuZ3RoKSxcbiAgICAgICAgaW50ZXJwcmV0QXhpcyh0aGlzLmF4ZXMsIHNoYXBlMi5sZW5ndGgpXG4gICAgICBdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgdGhpcy5heGVzYCBpcyBhbiBBcnJheSBvZiBpbnRlZ2Vycy5cbiAgICAgIGF4ZXMgPSB0aGlzLmF4ZXM7XG4gICAgfVxuICAgIHJldHVybiBheGVzO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICB0ZmMudXRpbC5hc3NlcnQoXG4gICAgICAgIEFycmF5LmlzQXJyYXkoaW5wdXRTaGFwZSkgJiYgaW5wdXRTaGFwZS5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoaW5wdXRTaGFwZVswXSkgJiYgQXJyYXkuaXNBcnJheShpbnB1dFNoYXBlWzFdKSxcbiAgICAgICAgKCkgPT4gJ0EgYERvdGAgbGF5ZXIgc2hvdWxkIGJlIGNhbGxlZCBvbiBhIGxpc3Qgb2YgZXhhY3RseSAyIGlucHV0cy4nKTtcbiAgICBjb25zdCBzaGFwZTEgPSAoaW5wdXRTaGFwZVswXSBhcyBTaGFwZSkuc2xpY2UoKTtcbiAgICBjb25zdCBzaGFwZTIgPSAoaW5wdXRTaGFwZVsxXSBhcyBTaGFwZSkuc2xpY2UoKTtcbiAgICBpZiAoc2hhcGUxLmxlbmd0aCA+IDMgfHwgc2hhcGUyLmxlbmd0aCA+IDMpIHtcbiAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICAgICdEb3QgbGF5ZXIgZG9lcyBub3Qgc3VwcG9ydCB0ZW5zb3JzIG9mIDREIG9yIGhpZ2hlciByYW5rIHlldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBheGVzID0gdGhpcy5pbnRlcnByZXRBeGVzKHNoYXBlMSwgc2hhcGUyKTtcbiAgICBzaGFwZTEuc3BsaWNlKGF4ZXNbMF0sIDEpO1xuICAgIHNoYXBlMi5zcGxpY2UoYXhlc1sxXSwgMSk7XG4gICAgc2hhcGUyLnNwbGljZSgwLCAxKTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9IHNoYXBlMS5jb25jYXQoc2hhcGUyKTtcbiAgICBpZiAob3V0cHV0U2hhcGUubGVuZ3RoID09PSAxKSB7XG4gICAgICBvdXRwdXRTaGFwZS5wdXNoKDEpO1xuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0U2hhcGU7XG4gIH1cblxuICBjb21wdXRlTWFzayhpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwgbWFzaz86IFRlbnNvcnxUZW5zb3JbXSk6IFRlbnNvciB7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgICdheGVzJzogdGhpcy5heGVzLFxuICAgICAgJ25vcm1hbGl6ZSc6IHRoaXMubm9ybWFsaXplXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhEb3QpO1xuXG4vLyBUT0RPKGNhaXMpOiBBZGQgZnVuY3Rpb25hbCBpbnRlcmZhY2VzIGZvciB0aGUgbWVyZ2UgbGF5ZXJzLlxuIl19","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Noise Layers.\n */\nimport { add, greaterEqual, mul, randomUniform, serialization, tidy } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { Layer } from '../engine/topology';\nimport { getExactlyOneTensor } from '../utils/types_utils';\nexport class GaussianNoise extends Layer {\n    constructor(args) {\n        super(args);\n        this.supportsMasking = true;\n        this.stddev = args.stddev;\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const config = { stddev: this.stddev };\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            const input = getExactlyOneTensor(inputs);\n            const noised = () => add(K.randomNormal(input.shape, 0, this.stddev), input);\n            const output = K.inTrainPhase(noised, () => input, kwargs['training'] || false);\n            return output;\n        });\n    }\n}\n/** @nocollapse */\nGaussianNoise.className = 'GaussianNoise';\nserialization.registerClass(GaussianNoise);\nexport class GaussianDropout extends Layer {\n    constructor(args) {\n        super(args);\n        this.supportsMasking = true;\n        this.rate = args.rate;\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const config = { rate: this.rate };\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            const input = getExactlyOneTensor(inputs);\n            if (this.rate > 0 && this.rate < 1) {\n                const noised = () => {\n                    const stddev = Math.sqrt(this.rate / (1 - this.rate));\n                    return mul(input, K.randomNormal(input.shape, 1, stddev));\n                };\n                return K.inTrainPhase(noised, () => input, kwargs['training'] || false);\n            }\n            return input;\n        });\n    }\n}\n/** @nocollapse */\nGaussianDropout.className = 'GaussianDropout';\nserialization.registerClass(GaussianDropout);\n/**\n * Applies Alpha Dropout to the input.\n *\n * As it is a regularization layer, it is only active at training time.\n *\n * Alpha Dropout is a `Dropout` that keeps mean and variance of inputs\n * to their original values, in order to ensure the self-normalizing property\n * even after this dropout.\n * Alpha Dropout fits well to Scaled Exponential Linear Units\n * by randomly setting activations to the negative saturation value.\n *\n * Arguments:\n *   - `rate`: float, drop probability (as with `Dropout`).\n *     The multiplicative noise will have\n *     standard deviation `sqrt(rate / (1 - rate))`.\n *   - `noise_shape`: A 1-D `Tensor` of type `int32`, representing the\n *     shape for randomly generated keep/drop flags.\n *\n * Input shape:\n *   Arbitrary. Use the keyword argument `inputShape`\n *   (tuple of integers, does not include the samples axis)\n *   when using this layer as the first layer in a model.\n *\n * Output shape:\n *   Same shape as input.\n *\n * References:\n *   - [Self-Normalizing Neural Networks](https://arxiv.org/abs/1706.02515)\n */\nexport class AlphaDropout extends Layer {\n    constructor(args) {\n        super(args);\n        this.supportsMasking = true;\n        this.rate = args.rate;\n        this.noiseShape = args.noiseShape;\n    }\n    _getNoiseShape(inputs) {\n        return this.noiseShape || getExactlyOneTensor(inputs).shape;\n    }\n    computeOutputShape(inputShape) {\n        return inputShape;\n    }\n    getConfig() {\n        const baseConfig = super.getConfig();\n        const config = { rate: this.rate };\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            if (this.rate < 1 && this.rate > 0) {\n                const noiseShape = this._getNoiseShape(inputs);\n                const droppedInputs = () => {\n                    const input = getExactlyOneTensor(inputs);\n                    const alpha = 1.6732632423543772848170429916717;\n                    const scale = 1.0507009873554804934193349852946;\n                    const alphaP = -alpha * scale;\n                    let keptIdx = greaterEqual(randomUniform(noiseShape), this.rate);\n                    keptIdx = K.cast(keptIdx, 'float32'); // get default dtype.\n                    // Get affine transformation params.\n                    const a = ((1 - this.rate) * (1 + this.rate * alphaP ** 2)) ** -0.5;\n                    const b = -a * alphaP * this.rate;\n                    // Apply mask.\n                    const x = add(mul(input, keptIdx), mul(add(keptIdx, -1), alphaP));\n                    return add(mul(x, a), b);\n                };\n                return K.inTrainPhase(droppedInputs, () => getExactlyOneTensor(inputs), kwargs['training'] || false);\n            }\n            return inputs;\n        });\n    }\n}\n/** @nocollapse */\nAlphaDropout.className = 'AlphaDropout';\nserialization.registerClass(AlphaDropout);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9pc2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL25vaXNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsYUFBYSxFQUFFLGFBQWEsRUFBVSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RyxPQUFPLEtBQUssQ0FBQyxNQUFNLHlCQUF5QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxLQUFLLEVBQVksTUFBTSxvQkFBb0IsQ0FBQztBQUdwRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQU96RCxNQUFNLE9BQU8sYUFBYyxTQUFRLEtBQUs7SUFLdEMsWUFBWSxJQUF1QjtRQUNqQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztRQUM1QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUM7SUFDNUIsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQXlCO1FBQzFDLE9BQU8sVUFBVSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLEVBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUMsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQXVCLEVBQUUsTUFBYztRQUMxQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFB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LEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBRSxxQkFBcUI7b0JBRTVELG9DQUFvQztvQkFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQztvQkFDcEUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsTUFBTSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBRWxDLGNBQWM7b0JBQ2QsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO29CQUVsRSxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUMzQixDQUFDLENBQUM7Z0JBQ0YsT0FBTyxDQUFDLENBQUMsWUFBWSxDQUNqQixhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEVBQ2hELE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQzthQUNsQztZQUNELE9BQU8sTUFBTSxDQUFDO1FBQ2hCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUEzREQsa0JBQWtCO0FBQ1gsc0JBQVMsR0FBRyxjQUFjLENBQUM7QUE0RHBDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlXG4gKiBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgb3IgYXRcbiAqIGh0dHBzOi8vb3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvTUlULlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKipcbiAqIFRlbnNvckZsb3cuanMgTGF5ZXJzOiBOb2lzZSBMYXllcnMuXG4gKi9cblxuaW1wb3J0IHthZGQsIGdyZWF0ZXJFcXVhbCwgbXVsLCByYW5kb21Vbmlmb3JtLCBzZXJpYWxpemF0aW9uLCBUZW5zb3IsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCAqIGFzIEsgZnJvbSAnLi4vYmFja2VuZC90ZmpzX2JhY2tlbmQnO1xuaW1wb3J0IHtMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lVGVuc29yfSBmcm9tICcuLi91dGlscy90eXBlc191dGlscyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBHYXVzc2lhbk5vaXNlQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKiBTdGFuZGFyZCBEZXZpYXRpb24uICAqL1xuICBzdGRkZXY6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIEdhdXNzaWFuTm9pc2UgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0dhdXNzaWFuTm9pc2UnO1xuICByZWFkb25seSBzdGRkZXY6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBHYXVzc2lhbk5vaXNlQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRoaXMuc3VwcG9ydHNNYXNraW5nID0gdHJ1ZTtcbiAgICB0aGlzLnN0ZGRldiA9IGFyZ3Muc3RkZGV2O1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIGdldENvbmZpZygpIHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgY29uZmlnID0ge3N0ZGRldjogdGhpcy5zdGRkZXZ9O1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIHRoaXMuaW52b2tlQ2FsbEhvb2soaW5wdXRzLCBrd2FyZ3MpO1xuICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBjb25zdCBub2lzZWQgPSAoKSA9PlxuICAgICAgICAgIGFkZChLLnJhbmRvbU5vcm1hbChpbnB1dC5zaGFwZSwgMCwgdGhpcy5zdGRkZXYpLCBpbnB1dCk7XG4gICAgICBjb25zdCBvdXRwdXQgPVxuICAgICAgICAgIEsuaW5UcmFpblBoYXNlKG5vaXNlZCwgKCkgPT4gaW5wdXQsIGt3YXJnc1sndHJhaW5pbmcnXSB8fCBmYWxzZSk7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2F1c3NpYW5Ob2lzZSk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBHYXVzc2lhbkRyb3BvdXRBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqIGRyb3AgcHJvYmFiaWxpdHkuICAqL1xuICByYXRlOiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBHYXVzc2lhbkRyb3BvdXQgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0dhdXNzaWFuRHJvcG91dCc7XG4gIHJlYWRvbmx5IHJhdGU6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBHYXVzc2lhbkRyb3BvdXRBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMucmF0ZSA9IGFyZ3MucmF0ZTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgcmV0dXJuIGlucHV0U2hhcGU7XG4gIH1cblxuICBnZXRDb25maWcoKSB7XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIGNvbnN0IGNvbmZpZyA9IHtyYXRlOiB0aGlzLnJhdGV9O1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIHRoaXMuaW52b2tlQ2FsbEhvb2soaW5wdXRzLCBrd2FyZ3MpO1xuICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBpZiAodGhpcy5yYXRlID4gMCAmJiB0aGlzLnJhdGUgPCAxKSB7XG4gICAgICAgIGNvbnN0IG5vaXNlZCA9ICgpID0+IHtcbiAgICAgICAgICBjb25zdCBzdGRkZXYgPSBNYXRoLnNxcnQodGhpcy5yYXRlIC8gKDEgLSB0aGlzLnJhdGUpKTtcbiAgICAgICAgICByZXR1cm4gbXVsKGlucHV0LCBLLnJhbmRvbU5vcm1hbChpbnB1dC5zaGFwZSwgMSwgc3RkZGV2KSk7XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBLLmluVHJhaW5QaGFzZShub2lzZWQsICgpID0+IGlucHV0LCBrd2FyZ3NbJ3RyYWluaW5nJ10gfHwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlucHV0O1xuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2F1c3NpYW5Ecm9wb3V0KTtcblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIEFscGhhRHJvcG91dEFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKiogZHJvcCBwcm9iYWJpbGl0eS4gICovXG4gIHJhdGU6IG51bWJlcjtcbiAgLyoqXG4gICAqIEEgMS1EIGBUZW5zb3JgIG9mIHR5cGUgYGludDMyYCwgcmVwcmVzZW50aW5nIHRoZVxuICAgKiBzaGFwZSBmb3IgcmFuZG9tbHkgZ2VuZXJhdGVkIGtlZXAvZHJvcCBmbGFncy5cbiAgICovXG4gIG5vaXNlU2hhcGU/OiBTaGFwZTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIEFscGhhIERyb3BvdXQgdG8gdGhlIGlucHV0LlxuICpcbiAqIEFzIGl0IGlzIGEgcmVndWxhcml6YXRpb24gbGF5ZXIsIGl0IGlzIG9ubHkgYWN0aXZlIGF0IHRyYWluaW5nIHRpbWUuXG4gKlxuICogQWxwaGEgRHJvcG91dCBpcyBhIGBEcm9wb3V0YCB0aGF0IGtlZXBzIG1lYW4gYW5kIHZhcmlhbmNlIG9mIGlucHV0c1xuICogdG8gdGhlaXIgb3JpZ2luYWwgdmFsdWVzLCBpbiBvcmRlciB0byBlbnN1cmUgdGhlIHNlbGYtbm9ybWFsaXppbmcgcHJvcGVydHlcbiAqIGV2ZW4gYWZ0ZXIgdGhpcyBkcm9wb3V0LlxuICogQWxwaGEgRHJvcG91dCBmaXRzIHdlbGwgdG8gU2NhbGVkIEV4cG9uZW50aWFsIExpbmVhciBVbml0c1xuICogYnkgcmFuZG9tbHkgc2V0dGluZyBhY3RpdmF0aW9ucyB0byB0aGUgbmVnYXRpdmUgc2F0dXJhdGlvbiB2YWx1ZS5cbiAqXG4gKiBBcmd1bWVudHM6XG4gKiAgIC0gYHJhdGVgOiBmbG9hdCwgZHJvcCBwcm9iYWJpbGl0eSAoYXMgd2l0aCBgRHJvcG91dGApLlxuICogICAgIFRoZSBtdWx0aXBsaWNhdGl2ZSBub2lzZSB3aWxsIGhhdmVcbiAqICAgICBzdGFuZGFyZCBkZXZpYXRpb24gYHNxcnQocmF0ZSAvICgxIC0gcmF0ZSkpYC5cbiAqICAgLSBgbm9pc2Vfc2hhcGVgOiBBIDEtRCBgVGVuc29yYCBvZiB0eXBlIGBpbnQzMmAsIHJlcHJlc2VudGluZyB0aGVcbiAqICAgICBzaGFwZSBmb3IgcmFuZG9tbHkgZ2VuZXJhdGVkIGtlZXAvZHJvcCBmbGFncy5cbiAqXG4gKiBJbnB1dCBzaGFwZTpcbiAqICAgQXJiaXRyYXJ5LiBVc2UgdGhlIGtleXdvcmQgYXJndW1lbnQgYGlucHV0U2hhcGVgXG4gKiAgICh0dXBsZSBvZiBpbnRlZ2VycywgZG9lcyBub3QgaW5jbHVkZSB0aGUgc2FtcGxlcyBheGlzKVxuICogICB3aGVuIHVzaW5nIHRoaXMgbGF5ZXIgYXMgdGhlIGZpcnN0IGxheWVyIGluIGEgbW9kZWwuXG4gKlxuICogT3V0cHV0IHNoYXBlOlxuICogICBTYW1lIHNoYXBlIGFzIGlucHV0LlxuICpcbiAqIFJlZmVyZW5jZXM6XG4gKiAgIC0gW1NlbGYtTm9ybWFsaXppbmcgTmV1cmFsIE5ldHdvcmtzXShodHRwczovL2FyeGl2Lm9yZy9hYnMvMTcwNi4wMjUxNSlcbiAqL1xuZXhwb3J0IGNsYXNzIEFscGhhRHJvcG91dCBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQWxwaGFEcm9wb3V0JztcbiAgcmVhZG9ubHkgcmF0ZTogbnVtYmVyO1xuICByZWFkb25seSBub2lzZVNoYXBlOiBTaGFwZTtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBBbHBoYURyb3BvdXRBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMucmF0ZSA9IGFyZ3MucmF0ZTtcbiAgICB0aGlzLm5vaXNlU2hhcGUgPSBhcmdzLm5vaXNlU2hhcGU7XG4gIH1cblxuICBfZ2V0Tm9pc2VTaGFwZShpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSkge1xuICAgIHJldHVybiB0aGlzLm5vaXNlU2hhcGUgfHwgZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLnNoYXBlO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICByZXR1cm4gaW5wdXRTaGFwZTtcbiAgfVxuXG4gIGdldENvbmZpZygpIHtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgY29uc3QgY29uZmlnID0ge3JhdGU6IHRoaXMucmF0ZX07XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMucmF0ZSA8IDEgJiYgdGhpcy5yYXRlID4gMCkge1xuICAgICAgICBjb25zdCBub2lzZVNoYXBlID0gdGhpcy5fZ2V0Tm9pc2VTaGFwZShpbnB1dHMpO1xuXG4gICAgICAgIGNvbnN0IGRyb3BwZWRJbnB1dHMgPSAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG5cbiAgICAgICAgICBjb25zdCBhbHBoYSA9IDEuNjczMjYzMjQyMzU0Mzc3Mjg0ODE3MDQyOTkxNjcxNztcbiAgICAgICAgICBjb25zdCBzY2FsZSA9IDEuMDUwNzAwOTg3MzU1NDgwNDkzNDE5MzM0OTg1Mjk0NjtcblxuICAgICAgICAgIGNvbnN0IGFscGhhUCA9IC1hbHBoYSAqIHNjYWxlO1xuXG4gICAgICAgICAgbGV0IGtlcHRJZHggPSBncmVhdGVyRXF1YWwocmFuZG9tVW5pZm9ybShub2lzZVNoYXBlKSwgdGhpcy5yYXRlKTtcblxuICAgICAgICAgIGtlcHRJZHggPSBLLmNhc3Qoa2VwdElkeCwgJ2Zsb2F0MzInKTsgIC8vIGdldCBkZWZhdWx0IGR0eXBlLlxuXG4gICAgICAgICAgLy8gR2V0IGFmZmluZSB0cmFuc2Zvcm1hdGlvbiBwYXJhbXMuXG4gICAgICAgICAgY29uc3QgYSA9ICgoMSAtIHRoaXMucmF0ZSkgKiAoMSArIHRoaXMucmF0ZSAqIGFscGhhUCAqKiAyKSkgKiogLTAuNTtcbiAgICAgICAgICBjb25zdCBiID0gLWEgKiBhbHBoYVAgKiB0aGlzLnJhdGU7XG5cbiAgICAgICAgICAvLyBBcHBseSBtYXNrLlxuICAgICAgICAgIGNvbnN0IHggPSBhZGQobXVsKGlucHV0LCBrZXB0SWR4KSwgbXVsKGFkZChrZXB0SWR4LCAtMSksIGFscGhhUCkpO1xuXG4gICAgICAgICAgcmV0dXJuIGFkZChtdWwoeCwgYSksIGIpO1xuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gSy5pblRyYWluUGhhc2UoXG4gICAgICAgICAgICBkcm9wcGVkSW5wdXRzLCAoKSA9PiBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyksXG4gICAgICAgICAgICBrd2FyZ3NbJ3RyYWluaW5nJ10gfHwgZmFsc2UpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEFscGhhRHJvcG91dCk7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Normalization layers.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { moments, reshape, serialization, tidy, util } from '@tensorflow/tfjs-core';\nimport { getConstraint, serializeConstraint } from '../constraints';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { getInitializer, serializeInitializer } from '../initializers';\nimport { getRegularizer, serializeRegularizer } from '../regularizers';\nimport * as generic_utils from '../utils/generic_utils';\nimport * as math_utils from '../utils/math_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\n/**\n * Applies batch normalization on x given mean, var, beta and gamma.\n *\n * I.e. returns:\n *   `output = (x - mean) / (sqrt(var) + epsilon) * gamma + beta`\n *\n * @param x Input tensor.\n * @param mean Mean of batch.\n * @param variance Variance of batch.\n * @param beta Tensor with which to center the input.\n * @param gamma Tensor by which to scale the input.\n * @param epsilon Fuzz factor.\n * @returns The result of the batch normalization.\n */\nexport function batchNormalization(x, mean, variance, beta, gamma, epsilon = 1e-3) {\n    let out;\n    if (x.rank === 2) {\n        out = tfc.batchNorm2d(x, mean, variance, beta, gamma, epsilon);\n    }\n    else if (x.rank === 3) {\n        // TODO(cais): Check rank; give proper error message.\n        out = tfc.batchNorm3d(x, mean, variance, beta, gamma, epsilon);\n    }\n    else if (x.rank === 4) {\n        out = tfc.batchNorm4d(x, mean, variance, beta, gamma, epsilon);\n    }\n    else {\n        throw new NotImplementedError(`batchNormalization is not implemented for array of rank ${x.rank} ` +\n            `yet`);\n    }\n    return out;\n}\n/**\n * Non-broadcasting batch normalization for use in training (not inference).\n *\n * The input is normalized to zero mean and unit variance along the\n * `reductionAxes`, followed by scaling with `gamma` and shifted by `beta`.\n * The result of that is returned as the first element\n * of the returned `Array`. The other two elements are the mean and variance,\n * respectively.\n *\n * @param x Input tensor to be normalized.\n * @param gamma Tensor by which to scale the input.\n * @param beta Tensor by which to center the input.\n * @param reductionAxes Axes over which to normalize.\n * @param epsilon Fuzz factor.\n * @returns An `Array` of three `Tensors`:\n *   [normalized tensor, mean of input, variance of input].\n */\nfunction regularNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon = 1e-3) {\n    return tidy(() => {\n        const meanAndVariance = tfc.moments(x, reductionAxes);\n        const mean = meanAndVariance.mean;\n        const variance = meanAndVariance.variance;\n        const normed = batchNormalization(x, mean, variance, beta, gamma, epsilon);\n        return [normed, mean, variance];\n    });\n}\n/**\n * Broadcasting batch normalization for use in training (not inference).\n *\n * The input is normalized to zero mean and unit variance along the\n * `reductionAxes`, followed by scaling with `gamma` and shifted by `beta`.\n * The result of that is returned as the first element\n * of the returned `Array`. The other two elements are the mean and variance,\n * respectively.\n *\n * @param x Input tensor to be normalized.\n * @param gamma Tensor by which to scale the input.\n * @param beta Tensor by which to center the input.\n * @param reductionAxes Axes over which to normalize.\n * @param epsilon Fuzz factor.\n * @returns An `Array` of three `Tensors`:\n *   [normalized tensor, mean of input, variance of input].\n */\nfunction broadcastNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon = 1e-3) {\n    return tidy(() => {\n        const meanAndVariance = tfc.moments(x, reductionAxes);\n        const mean = meanAndVariance.mean;\n        const variance = meanAndVariance.variance;\n        const targetShape = [];\n        for (const axis of math_utils.range(0, x.rank)) {\n            if (reductionAxes.indexOf(axis) !== -1) {\n                targetShape.push(1);\n            }\n            else {\n                targetShape.push(x.shape[axis]);\n            }\n        }\n        const broadcastMean = reshape(mean, targetShape);\n        const broadcastVariance = reshape(variance, targetShape);\n        const broadcastGamma = gamma == null ? null : reshape(gamma, targetShape);\n        const broadcastBeta = beta == null ? null : reshape(beta, targetShape);\n        const normed = batchNormalization(x, broadcastMean, broadcastVariance, broadcastBeta, broadcastGamma, epsilon);\n        return [normed, mean, variance];\n    });\n}\n/**\n * Batch normalization for use in training (not inference).\n *\n * @param x Input tensor to be normalized.\n * @param gamma Tensor by which to scale the input.\n * @param beta Tensor by which to center the input.\n * @param reductionAxes Axes over which to normalize.\n * @param epsilon Fuzz factor.\n * @returns An `Array` of three `Tensors`:\n *   [normalized tensor, mean of input, variance of input].\n */\nexport function normalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon = 1e-3) {\n    if (util.arraysEqual(reductionAxes.slice().sort(), math_utils.range(0, x.rank - 1))) {\n        return regularNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon);\n    }\n    else {\n        return broadcastNormalizeBatchInTraining(x, gamma, beta, reductionAxes, epsilon);\n    }\n}\nexport class BatchNormalization extends Layer {\n    constructor(args) {\n        if (args == null) {\n            args = {};\n        }\n        super(args);\n        this.supportsMasking = true;\n        this.axis = args.axis == null ? -1 : args.axis;\n        this.momentum = args.momentum == null ? 0.99 : args.momentum;\n        this.epsilon = args.epsilon == null ? 1e-3 : args.epsilon;\n        this.center = args.center == null ? true : args.center;\n        this.scale = args.scale == null ? true : args.scale;\n        this.betaInitializer = getInitializer(args.betaInitializer || 'zeros');\n        this.gammaInitializer = getInitializer(args.gammaInitializer || 'ones');\n        this.movingMeanInitializer =\n            getInitializer(args.movingMeanInitializer || 'zeros');\n        this.movingVarianceInitializer =\n            getInitializer(args.movingVarianceInitializer || 'ones');\n        this.betaConstraint = getConstraint(args.betaConstraint);\n        this.gammaConstraint = getConstraint(args.gammaConstraint);\n        this.betaRegularizer = getRegularizer(args.betaRegularizer);\n        this.gammaRegularizer = getRegularizer(args.gammaRegularizer);\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const axis = this.axis >= 0 ? this.axis : (this.axis + inputShape.length);\n        const dim = inputShape[axis];\n        if (dim == null) {\n            throw new ValueError(`Axis ${axis} of input tensor should have a defined dimension but ` +\n                `the layer received an input with shape ` +\n                `${JSON.stringify(inputShape)}.`);\n        }\n        this.inputSpec =\n            [new InputSpec({ ndim: inputShape.length, axes: { [axis]: dim } })];\n        const shape = [dim];\n        if (this.scale) {\n            this.gamma = this.addWeight('gamma', shape, null, this.gammaInitializer, this.gammaRegularizer, true, this.gammaConstraint);\n        }\n        if (this.center) {\n            this.beta = this.addWeight('beta', shape, null, this.betaInitializer, this.betaRegularizer, true, this.betaConstraint);\n        }\n        this.movingMean = this.addWeight('moving_mean', shape, null, this.movingMeanInitializer, null, false);\n        this.movingVariance = this.addWeight('moving_variance', shape, null, this.movingVarianceInitializer, null, false);\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            const training = kwargs['training'] == null ? false : kwargs['training'];\n            const input = getExactlyOneTensor(inputs);\n            const inputShape = input.shape;\n            const ndim = inputShape.length;\n            const reductionAxes = math_utils.range(0, ndim);\n            const axis = this.axis >= 0 ? this.axis : (this.axis + ndim);\n            reductionAxes.splice(axis, 1);\n            const broadcastShape = generic_utils.pyListRepeat(1, ndim);\n            broadcastShape[axis] = inputShape[axis];\n            const sortedReductionAxes = reductionAxes.slice();\n            sortedReductionAxes.sort();\n            const needsBroadcasting = !util.arraysEqual(sortedReductionAxes, math_utils.range(0, ndim).slice(0, ndim - 1));\n            const normalizeInference = () => {\n                if (needsBroadcasting) {\n                    const broadcastMovingMean = reshape(this.movingMean.read(), broadcastShape);\n                    const broadcastMovingVariance = reshape(this.movingVariance.read(), broadcastShape);\n                    const broadcastBeta = this.center ? reshape(this.beta.read(), broadcastShape) : null;\n                    const broadcastGamma = this.scale ? reshape(this.gamma.read(), broadcastShape) : null;\n                    return batchNormalization(input, broadcastMovingMean, broadcastMovingVariance, broadcastBeta, broadcastGamma, this.epsilon);\n                }\n                else {\n                    return batchNormalization(input, this.movingMean.read(), this.movingVariance.read(), this.beta == null ? null : this.beta.read(), this.gamma == null ? null : this.gamma.read(), this.epsilon);\n                }\n            };\n            if (!training) {\n                return normalizeInference();\n            }\n            const [normedTraining, mean, variance] = normalizeBatchInTraining(input, this.gamma.read(), this.beta.read(), reductionAxes, this.epsilon);\n            const doMovingAverage = (variable, value, momentum) => {\n                tfc.tidy(() => {\n                    const decay = 1 - momentum;\n                    const origValue = variable.read();\n                    const updateDelta = tfc.mul(tfc.sub(origValue, value), decay);\n                    variable.write(tfc.sub(origValue, updateDelta));\n                });\n            };\n            // Perform updates to moving mean and moving variance for training.\n            // Porting Note: In PyKeras, these updates to `movingMean` and\n            //   `movingAverage` are done as a deferred Graph, added to the `Layer`'s\n            //   `update`s using the `add_update()` method. Here we do it imperatively\n            //   and encapsulate the updates in a function that is invoked\n            //   immediately.\n            const updateMovingMeanAndVariance = () => {\n                doMovingAverage(this.movingMean, mean, this.momentum);\n                doMovingAverage(this.movingVariance, variance, this.momentum);\n            };\n            updateMovingMeanAndVariance();\n            return normedTraining;\n        });\n    }\n    getConfig() {\n        const config = {\n            axis: this.axis,\n            momentum: this.momentum,\n            epsilon: this.epsilon,\n            center: this.center,\n            scale: this.scale,\n            betaInitializer: serializeInitializer(this.betaInitializer),\n            gammaInitializer: serializeInitializer(this.gammaInitializer),\n            movingMeanInitializer: serializeInitializer(this.movingMeanInitializer),\n            movingVarianceInitializer: serializeInitializer(this.movingVarianceInitializer),\n            betaRegularizer: serializeRegularizer(this.betaRegularizer),\n            gammaRegularizer: serializeRegularizer(this.gammaRegularizer),\n            betaConstraint: serializeConstraint(this.betaConstraint),\n            gammaConstraint: serializeConstraint(this.gammaConstraint)\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nBatchNormalization.className = 'BatchNormalization';\nserialization.registerClass(BatchNormalization);\nexport class LayerNormalization extends Layer {\n    constructor(args) {\n        if (args == null) {\n            args = {};\n        }\n        super(args);\n        this.axis = args.axis == null ? -1 : args.axis;\n        if (typeof this.axis === 'number') {\n            if (!Number.isInteger(this.axis)) {\n                throw new Error(`Expected axis to be an integer, but received ${this.axis}`);\n            }\n        }\n        else if (Array.isArray(this.axis)) {\n            for (const axis of this.axis) {\n                if (!Number.isInteger(axis)) {\n                    throw new Error(`Expected axis to be an array of integers, ` +\n                        `but received ${JSON.stringify(this.axis)}`);\n                }\n            }\n        }\n        else {\n            throw new Error(`Expected axis to be an integer or an array of integers, ` +\n                `but received ${JSON.stringify(this.axis)}`);\n        }\n        this.epsilon = args.epsilon == null ? 1e-3 : args.epsilon;\n        this.center = args.center == null ? true : args.center;\n        this.scale = args.scale == null ? true : args.scale;\n        this.betaInitializer = getInitializer(args.betaInitializer || 'zeros');\n        this.gammaInitializer = getInitializer(args.gammaInitializer || 'ones');\n        this.betaRegularizer = getRegularizer(args.betaRegularizer);\n        this.gammaRegularizer = getRegularizer(args.gammaRegularizer);\n        this.supportsMasking = true;\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const nDims = inputShape.length;\n        // Convert axis to array and resolve negatives.\n        if (typeof this.axis === 'number') {\n            this.axis = [this.axis];\n        }\n        for (let i = 0; i < this.axis.length; ++i) {\n            if (this.axis[i] < 0) {\n                this.axis[i] += nDims;\n            }\n        }\n        // Further validate axes.\n        for (const axis of this.axis) {\n            if (axis < 0 || axis >= nDims) {\n                throw new Error(`Invalid axis: ${axis}`);\n            }\n        }\n        if (this.axis.length !== generic_utils.unique(this.axis).length) {\n            throw new Error(`Found duplicate axes in: ${this.axis}`);\n        }\n        const paramShape = this.axis.map(axis => inputShape[axis]);\n        const trainable = true;\n        if (this.scale) {\n            this.gamma = this.addWeight('gamma', paramShape, 'float32', this.gammaInitializer, this.gammaRegularizer, trainable);\n        }\n        else {\n            this.gamma = null;\n        }\n        if (this.center) {\n            this.beta = this.addWeight('beta', paramShape, 'float32', this.betaInitializer, this.betaRegularizer, trainable);\n        }\n        else {\n            this.beta = null;\n        }\n        this.built = true;\n    }\n    call(inputs, kwargs) {\n        const input = getExactlyOneTensor(inputs);\n        const inputShape = input.shape;\n        const nDims = inputShape.length;\n        return tidy(() => {\n            const keepDims = true;\n            let { mean, variance } = moments(input, this.axis, keepDims);\n            const broadcastShape = generic_utils.pyListRepeat(1, nDims);\n            for (const dim of this.axis) {\n                broadcastShape[dim] = inputShape[dim];\n            }\n            const broadcast = (v) => {\n                if (v != null && v.shape.length !== nDims) {\n                    return tfc.reshape(v, broadcastShape);\n                }\n                else {\n                    return v;\n                }\n            };\n            let scale = this.scale ? broadcast(this.gamma.read()) : null;\n            let offset = this.center ? broadcast(this.beta.read()) : null;\n            // TODO(https://github.com/tensorflow/tfjs/issues/2120): The tiling below\n            // is a workaround for the limitation of core's batchNormalization?d don't\n            // support broadcasting in their gradients. In addition, the tiling is\n            // necessary to ensure correctness on the browser CPU backend regardless\n            // of forward or backward computation. Remove this workaround once the\n            // limitation is addressed. See .\n            const momentsTiling = [];\n            const scaleOffsetTiling = [];\n            for (let i = 0; i < nDims; ++i) {\n                if (this.axis.indexOf(i) !== -1) {\n                    momentsTiling.push(inputShape[i]);\n                    scaleOffsetTiling.push(1);\n                }\n                else {\n                    momentsTiling.push(1);\n                    scaleOffsetTiling.push(inputShape[i]);\n                }\n            }\n            mean = tfc.tile(mean, momentsTiling);\n            variance = tfc.tile(variance, momentsTiling);\n            if (scale != null) {\n                scale = tfc.tile(scale, scaleOffsetTiling);\n            }\n            if (offset != null) {\n                offset = tfc.tile(offset, scaleOffsetTiling);\n            }\n            return batchNormalization(input, mean, variance, offset, scale, this.epsilon);\n        });\n    }\n    getConfig() {\n        const config = {\n            axis: this.axis,\n            epsilon: this.epsilon,\n            center: this.center,\n            scale: this.scale,\n            betaInitializer: serializeInitializer(this.betaInitializer),\n            gammaInitializer: serializeInitializer(this.gammaInitializer),\n            betaRegularizer: serializeRegularizer(this.betaRegularizer),\n            gammaRegularizer: serializeRegularizer(this.gammaRegularizer)\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nLayerNormalization.className = 'LayerNormalization';\nserialization.registerClass(LayerNormalization);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvbm9ybWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQWtELElBQUksRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVsSSxPQUFPLEVBQW1DLGFBQWEsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3BHLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLG1CQUFtQixFQUFFLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMxRCxPQUFPLEVBQUMsY0FBYyxFQUFzQyxvQkFBb0IsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRXpHLE9BQU8sRUFBQyxjQUFjLEVBQXNDLG9CQUFvQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFekcsT0FBTyxLQUFLLGFBQWEsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssVUFBVSxNQUFNLHFCQUFxQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRzdFOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQzlCLENBQVMsRUFBRSxJQUFZLEVBQUUsUUFBZ0IsRUFBRSxJQUFhLEVBQUUsS0FBYyxFQUN4RSxPQUFPLEdBQUcsSUFBSTtJQUNoQixJQUFJLEdBQVcsQ0FBQztJQUNoQixJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2hCLEdBQUcsR0FB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UUFDUCxNQUFNLE1BQU0sR0FBNkI7WUFDdkMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtZQUNuQixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsZUFBZSxFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxlQUFlLENBQUM7WUFDM0QsZ0JBQWdCLEVBQUUsb0JBQW9CLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDO1lBQzdELGVBQWUsRUFBRSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQzNELGdCQUFnQixFQUFFLG9CQUFvQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztTQUM5RCxDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7O0FBdEtELGtCQUFrQjtBQUNYLDRCQUFTLEdBQUcsb0JBQW9CLENBQUM7QUF1SzFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogTm9ybWFsaXphdGlvbiBsYXllcnMuXG4gKi9cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge21vbWVudHMsIHJlc2hhcGUsIHNlcmlhbGl6YXRpb24sIFRlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJELCBUZW5zb3IzRCwgVGVuc29yNEQsIHRpZHksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q29uc3RyYWludCwgQ29uc3RyYWludElkZW50aWZpZXIsIGdldENvbnN0cmFpbnQsIHNlcmlhbGl6ZUNvbnN0cmFpbnR9IGZyb20gJy4uL2NvbnN0cmFpbnRzJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtOb3RJbXBsZW1lbnRlZEVycm9yLCBWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtnZXRJbml0aWFsaXplciwgSW5pdGlhbGl6ZXIsIEluaXRpYWxpemVySWRlbnRpZmllciwgc2VyaWFsaXplSW5pdGlhbGl6ZXJ9IGZyb20gJy4uL2luaXRpYWxpemVycyc7XG5pbXBvcnQge1NoYXBlfSBmcm9tICcuLi9rZXJhc19mb3JtYXQvY29tbW9uJztcbmltcG9ydCB7Z2V0UmVndWxhcml6ZXIsIFJlZ3VsYXJpemVyLCBSZWd1bGFyaXplcklkZW50aWZpZXIsIHNlcmlhbGl6ZVJlZ3VsYXJpemVyfSBmcm9tICcuLi9yZWd1bGFyaXplcnMnO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCAqIGFzIGdlbmVyaWNfdXRpbHMgZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQgKiBhcyBtYXRoX3V0aWxzIGZyb20gJy4uL3V0aWxzL21hdGhfdXRpbHMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuLyoqXG4gKiBBcHBsaWVzIGJhdGNoIG5vcm1hbGl6YXRpb24gb24geCBnaXZlbiBtZWFuLCB2YXIsIGJldGEgYW5kIGdhbW1hLlxuICpcbiAqIEkuZS4gcmV0dXJuczpcbiAqICAgYG91dHB1dCA9ICh4IC0gbWVhbikgLyAoc3FydCh2YXIpICsgZXBzaWxvbikgKiBnYW1tYSArIGJldGFgXG4gKlxuICogQHBhcmFtIHggSW5wdXQgdGVuc29yLlxuICogQHBhcmFtIG1lYW4gTWVhbiBvZiBiYXRjaC5cbiAqIEBwYXJhbSB2YXJpYW5jZSBWYXJpYW5jZSBvZiBiYXRjaC5cbiAqIEBwYXJhbSBiZXRhIFRlbnNvciB3aXRoIHdoaWNoIHRvIGNlbnRlciB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gZ2FtbWEgVGVuc29yIGJ5IHdoaWNoIHRvIHNjYWxlIHRoZSBpbnB1dC5cbiAqIEBwYXJhbSBlcHNpbG9uIEZ1enogZmFjdG9yLlxuICogQHJldHVybnMgVGhlIHJlc3VsdCBvZiB0aGUgYmF0Y2ggbm9ybWFsaXphdGlvbi5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTm9ybWFsaXphdGlvbihcbiAgICB4OiBUZW5zb3IsIG1lYW46IFRlbnNvciwgdmFyaWFuY2U6IFRlbnNvciwgYmV0YT86IFRlbnNvciwgZ2FtbWE/OiBUZW5zb3IsXG4gICAgZXBzaWxvbiA9IDFlLTMpOiBUZW5zb3Ige1xuICBsZXQgb3V0OiBUZW5zb3I7XG4gIGlmICh4LnJhbmsgPT09IDIpIHtcbiAgICBvdXQgPSB0ZmMuYmF0Y2hOb3JtMmQoXG4gICAgICAgIHggYXMgVGVuc29yMkQsIG1lYW4gYXMgVGVuc29yMkQgfCBUZW5zb3IxRCxcbiAgICAgICAgdmFyaWFuY2UgYXMgVGVuc29yMkQgfCBUZW5zb3IxRCwgYmV0YSBhcyBUZW5zb3IyRCB8IFRlbnNvcjFELFxuICAgICAgICBnYW1tYSBhcyBUZW5zb3IyRCB8IFRlbnNvcjFELCBlcHNpbG9uKTtcbiAgfSBlbHNlIGlmICh4LnJhbmsgPT09IDMpIHtcbiAgICAvLyBUT0RPKGNhaXMpOiBDaGVjayByYW5rOyBnaXZlIHByb3BlciBlcnJvciBtZXNzYWdlLlxuICAgIG91dCA9IHRmYy5iYXRjaE5vcm0zZChcbiAgICAgICAgeCBhcyBUZW5zb3IzRCwgbWVhbiBhcyBUZW5zb3IzRCB8IFRlbnNvcjFELFxuICAgICAgICB2YXJpYW5jZSBhcyBUZW5zb3IzRCB8IFRlbnNvcjFELCBiZXRhIGFzIFRlbnNvcjNEIHwgVGVuc29yMUQsXG4gICAgICAgIGdhbW1hIGFzIFRlbnNvcjNEIHwgVGVuc29yMUQsIGVwc2lsb24pO1xuICB9IGVsc2UgaWYgKHgucmFuayA9PT0gNCkge1xuICAgIG91dCA9IHRmYy5iYXRjaE5vcm00ZChcbiAgICAgICAgeCBhcyBUZW5zb3I0RCwgbWVhbiBhcyBUZW5zb3I0RCB8IFRlbnNvcjFELFxuICAgICAgICB2YXJpYW5jZSBhcyBUZW5zb3I0RCB8IFRlbnNvcjFELCBiZXRhIGFzIFRlbnNvcjREIHwgVGVuc29yMUQsXG4gICAgICAgIGdhbW1hIGFzIFRlbnNvcjREIHwgVGVuc29yMUQsIGVwc2lsb24pO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKFxuICAgICAgICBgYmF0Y2hOb3JtYWxpemF0aW9uIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgYXJyYXkgb2YgcmFuayAke3gucmFua30gYCArXG4gICAgICAgIGB5ZXRgKTtcbiAgfVxuICByZXR1cm4gb3V0O1xufVxuXG4vKipcbiAqIE5vbi1icm9hZGNhc3RpbmcgYmF0Y2ggbm9ybWFsaXphdGlvbiBmb3IgdXNlIGluIHRyYWluaW5nIChub3QgaW5mZXJlbmNlKS5cbiAqXG4gKiBUaGUgaW5wdXQgaXMgbm9ybWFsaXplZCB0byB6ZXJvIG1lYW4gYW5kIHVuaXQgdmFyaWFuY2UgYWxvbmcgdGhlXG4gKiBgcmVkdWN0aW9uQXhlc2AsIGZvbGxvd2VkIGJ5IHNjYWxpbmcgd2l0aCBgZ2FtbWFgIGFuZCBzaGlmdGVkIGJ5IGBiZXRhYC5cbiAqIFRoZSByZXN1bHQgb2YgdGhhdCBpcyByZXR1cm5lZCBhcyB0aGUgZmlyc3QgZWxlbWVudFxuICogb2YgdGhlIHJldHVybmVkIGBBcnJheWAuIFRoZSBvdGhlciB0d28gZWxlbWVudHMgYXJlIHRoZSBtZWFuIGFuZCB2YXJpYW5jZSxcbiAqIHJlc3BlY3RpdmVseS5cbiAqXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IgdG8gYmUgbm9ybWFsaXplZC5cbiAqIEBwYXJhbSBnYW1tYSBUZW5zb3IgYnkgd2hpY2ggdG8gc2NhbGUgdGhlIGlucHV0LlxuICogQHBhcmFtIGJldGEgVGVuc29yIGJ5IHdoaWNoIHRvIGNlbnRlciB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gcmVkdWN0aW9uQXhlcyBBeGVzIG92ZXIgd2hpY2ggdG8gbm9ybWFsaXplLlxuICogQHBhcmFtIGVwc2lsb24gRnV6eiBmYWN0b3IuXG4gKiBAcmV0dXJucyBBbiBgQXJyYXlgIG9mIHRocmVlIGBUZW5zb3JzYDpcbiAqICAgW25vcm1hbGl6ZWQgdGVuc29yLCBtZWFuIG9mIGlucHV0LCB2YXJpYW5jZSBvZiBpbnB1dF0uXG4gKi9cbmZ1bmN0aW9uIHJlZ3VsYXJOb3JtYWxpemVCYXRjaEluVHJhaW5pbmcoXG4gICAgeDogVGVuc29yLCBnYW1tYTogVGVuc29yLCBiZXRhOiBUZW5zb3IsIHJlZHVjdGlvbkF4ZXM6IG51bWJlcltdLFxuICAgIGVwc2lsb24gPSAxZS0zKTogW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgICAgICBjb25zdCBtZWFuQW5kVmFyaWFuY2UgPSB0ZmMubW9tZW50cyh4LCByZWR1Y3Rpb25BeGVzKTtcbiAgICAgICAgICAgY29uc3QgbWVhbiA9IG1lYW5BbmRWYXJpYW5jZS5tZWFuO1xuICAgICAgICAgICBjb25zdCB2YXJpYW5jZSA9IG1lYW5BbmRWYXJpYW5jZS52YXJpYW5jZTtcbiAgICAgICAgICAgY29uc3Qgbm9ybWVkID1cbiAgICAgICAgICAgICAgIGJhdGNoTm9ybWFsaXphdGlvbih4LCBtZWFuLCB2YXJpYW5jZSwgYmV0YSwgZ2FtbWEsIGVwc2lsb24pO1xuICAgICAgICAgICByZXR1cm4gW25vcm1lZCwgbWVhbiwgdmFyaWFuY2VdO1xuICAgICAgICAgfSkgYXMgW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdO1xufVxuXG4vKipcbiAqIEJyb2FkY2FzdGluZyBiYXRjaCBub3JtYWxpemF0aW9uIGZvciB1c2UgaW4gdHJhaW5pbmcgKG5vdCBpbmZlcmVuY2UpLlxuICpcbiAqIFRoZSBpbnB1dCBpcyBub3JtYWxpemVkIHRvIHplcm8gbWVhbiBhbmQgdW5pdCB2YXJpYW5jZSBhbG9uZyB0aGVcbiAqIGByZWR1Y3Rpb25BeGVzYCwgZm9sbG93ZWQgYnkgc2NhbGluZyB3aXRoIGBnYW1tYWAgYW5kIHNoaWZ0ZWQgYnkgYGJldGFgLlxuICogVGhlIHJlc3VsdCBvZiB0aGF0IGlzIHJldHVybmVkIGFzIHRoZSBmaXJzdCBlbGVtZW50XG4gKiBvZiB0aGUgcmV0dXJuZWQgYEFycmF5YC4gVGhlIG90aGVyIHR3byBlbGVtZW50cyBhcmUgdGhlIG1lYW4gYW5kIHZhcmlhbmNlLFxuICogcmVzcGVjdGl2ZWx5LlxuICpcbiAqIEBwYXJhbSB4IElucHV0IHRlbnNvciB0byBiZSBub3JtYWxpemVkLlxuICogQHBhcmFtIGdhbW1hIFRlbnNvciBieSB3aGljaCB0byBzY2FsZSB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gYmV0YSBUZW5zb3IgYnkgd2hpY2ggdG8gY2VudGVyIHRoZSBpbnB1dC5cbiAqIEBwYXJhbSByZWR1Y3Rpb25BeGVzIEF4ZXMgb3ZlciB3aGljaCB0byBub3JtYWxpemUuXG4gKiBAcGFyYW0gZXBzaWxvbiBGdXp6IGZhY3Rvci5cbiAqIEByZXR1cm5zIEFuIGBBcnJheWAgb2YgdGhyZWUgYFRlbnNvcnNgOlxuICogICBbbm9ybWFsaXplZCB0ZW5zb3IsIG1lYW4gb2YgaW5wdXQsIHZhcmlhbmNlIG9mIGlucHV0XS5cbiAqL1xuZnVuY3Rpb24gYnJvYWRjYXN0Tm9ybWFsaXplQmF0Y2hJblRyYWluaW5nKFxuICAgIHg6IFRlbnNvciwgZ2FtbWE6IFRlbnNvciwgYmV0YTogVGVuc29yLCByZWR1Y3Rpb25BeGVzOiBudW1iZXJbXSxcbiAgICBlcHNpbG9uID0gMWUtMyk6IFtUZW5zb3IsIFRlbnNvciwgVGVuc29yXSB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgICAgICAgY29uc3QgbWVhbkFuZFZhcmlhbmNlID0gdGZjLm1vbWVudHMoeCwgcmVkdWN0aW9uQXhlcyk7XG4gICAgICAgICAgIGNvbnN0IG1lYW4gPSBtZWFuQW5kVmFyaWFuY2UubWVhbjtcbiAgICAgICAgICAgY29uc3QgdmFyaWFuY2UgPSBtZWFuQW5kVmFyaWFuY2UudmFyaWFuY2U7XG4gICAgICAgICAgIGNvbnN0IHRhcmdldFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICAgICAgICAgICBmb3IgKGNvbnN0IGF4aXMgb2YgbWF0aF91dGlscy5yYW5nZSgwLCB4LnJhbmspKSB7XG4gICAgICAgICAgICAgaWYgKHJlZHVjdGlvbkF4ZXMuaW5kZXhPZihheGlzKSAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgIHRhcmdldFNoYXBlLnB1c2goMSk7XG4gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgIHRhcmdldFNoYXBlLnB1c2goeC5zaGFwZVtheGlzXSk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdE1lYW4gPSByZXNoYXBlKG1lYW4sIHRhcmdldFNoYXBlKTtcbiAgICAgICAgICAgY29uc3QgYnJvYWRjYXN0VmFyaWFuY2UgPSByZXNoYXBlKHZhcmlhbmNlLCB0YXJnZXRTaGFwZSk7XG4gICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdEdhbW1hID1cbiAgICAgICAgICAgICAgIGdhbW1hID09IG51bGwgPyBudWxsIDogcmVzaGFwZShnYW1tYSwgdGFyZ2V0U2hhcGUpO1xuICAgICAgICAgICBjb25zdCBicm9hZGNhc3RCZXRhID1cbiAgICAgICAgICAgICAgIGJldGEgPT0gbnVsbCA/IG51bGwgOiByZXNoYXBlKGJldGEsIHRhcmdldFNoYXBlKTtcbiAgICAgICAgICAgY29uc3Qgbm9ybWVkID0gYmF0Y2hOb3JtYWxpemF0aW9uKFxuICAgICAgICAgICAgICAgeCwgYnJvYWRjYXN0TWVhbiwgYnJvYWRjYXN0VmFyaWFuY2UsIGJyb2FkY2FzdEJldGEsXG4gICAgICAgICAgICAgICBicm9hZGNhc3RHYW1tYSwgZXBzaWxvbik7XG4gICAgICAgICAgIHJldHVybiBbbm9ybWVkLCBtZWFuLCB2YXJpYW5jZV07XG4gICAgICAgICB9KSBhcyBbVGVuc29yLCBUZW5zb3IsIFRlbnNvcl07XG59XG5cbi8qKlxuICogQmF0Y2ggbm9ybWFsaXphdGlvbiBmb3IgdXNlIGluIHRyYWluaW5nIChub3QgaW5mZXJlbmNlKS5cbiAqXG4gKiBAcGFyYW0geCBJbnB1dCB0ZW5zb3IgdG8gYmUgbm9ybWFsaXplZC5cbiAqIEBwYXJhbSBnYW1tYSBUZW5zb3IgYnkgd2hpY2ggdG8gc2NhbGUgdGhlIGlucHV0LlxuICogQHBhcmFtIGJldGEgVGVuc29yIGJ5IHdoaWNoIHRvIGNlbnRlciB0aGUgaW5wdXQuXG4gKiBAcGFyYW0gcmVkdWN0aW9uQXhlcyBBeGVzIG92ZXIgd2hpY2ggdG8gbm9ybWFsaXplLlxuICogQHBhcmFtIGVwc2lsb24gRnV6eiBmYWN0b3IuXG4gKiBAcmV0dXJucyBBbiBgQXJyYXlgIG9mIHRocmVlIGBUZW5zb3JzYDpcbiAqICAgW25vcm1hbGl6ZWQgdGVuc29yLCBtZWFuIG9mIGlucHV0LCB2YXJpYW5jZSBvZiBpbnB1dF0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBub3JtYWxpemVCYXRjaEluVHJhaW5pbmcoXG4gICAgeDogVGVuc29yLCBnYW1tYTogVGVuc29yLCBiZXRhOiBUZW5zb3IsIHJlZHVjdGlvbkF4ZXM6IG51bWJlcltdLFxuICAgIGVwc2lsb24gPSAxZS0zKTogW1RlbnNvciwgVGVuc29yLCBUZW5zb3JdIHtcbiAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoXG4gICAgICAgICAgcmVkdWN0aW9uQXhlcy5zbGljZSgpLnNvcnQoKSwgbWF0aF91dGlscy5yYW5nZSgwLCB4LnJhbmsgLSAxKSkpIHtcbiAgICByZXR1cm4gcmVndWxhck5vcm1hbGl6ZUJhdGNoSW5UcmFpbmluZyhcbiAgICAgICAgeCwgZ2FtbWEsIGJldGEsIHJlZHVjdGlvbkF4ZXMsIGVwc2lsb24pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBicm9hZGNhc3ROb3JtYWxpemVCYXRjaEluVHJhaW5pbmcoXG4gICAgICAgIHgsIGdhbW1hLCBiZXRhLCByZWR1Y3Rpb25BeGVzLCBlcHNpbG9uKTtcbiAgfVxufVxuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgQmF0Y2hOb3JtYWxpemF0aW9uTGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIFRoZSBpbnRlZ2VyIGF4aXMgdGhhdCBzaG91bGQgYmUgbm9ybWFsaXplZCAodHlwaWNhbGx5IHRoZSBmZWF0dXJlcyBheGlzKS5cbiAgICogRGVmYXVsdHMgdG8gLTEuXG4gICAqXG4gICAqIEZvciBpbnN0YW5jZSwgYWZ0ZXIgYSBgQ29udjJEYCBsYXllciB3aXRoIGBkYXRhX2Zvcm1hdD1cImNoYW5uZWxzX2ZpcnN0XCJgLFxuICAgKiBzZXQgYGF4aXM9MWAgaW4gYGJhdGNoTm9ybWFsaXphdGlvbmAuXG4gICAqL1xuICBheGlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBNb21lbnR1bSBvZiB0aGUgbW92aW5nIGF2ZXJhZ2UuIERlZmF1bHRzIHRvIDAuOTkuXG4gICAqL1xuICBtb21lbnR1bT86IG51bWJlcjtcblxuICAvKipcbiAgICogU21hbGwgZmxvYXQgYWRkZWQgdG8gdGhlIHZhcmlhbmNlIHRvIGF2b2lkIGRpdmlkaW5nIGJ5IHplcm8uIERlZmF1bHRzIHRvXG4gICAqIDFlLTMuXG4gICAqL1xuICBlcHNpbG9uPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBJZiBgdHJ1ZWAsIGFkZCBvZmZzZXQgb2YgYGJldGFgIHRvIG5vcm1hbGl6ZWQgdGVuc29yLlxuICAgKiBJZiBgZmFsc2VgLCBgYmV0YWAgaXMgaWdub3JlZC5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgY2VudGVyPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBtdWx0aXBseSBieSBgZ2FtbWFgLlxuICAgKiBJZiBgZmFsc2VgLCBgZ2FtbWFgIGlzIG5vdCB1c2VkLlxuICAgKiBXaGVuIHRoZSBuZXh0IGxheWVyIGlzIGxpbmVhciAoYWxzbyBlLmcuIGBubi5yZWx1YCksXG4gICAqIHRoaXMgY2FuIGJlIGRpc2FibGVkIHNpbmNlIHRoZSBzY2FsaW5nIHdpbGwgYmUgZG9uZSBieSB0aGUgbmV4dCBsYXllci5cbiAgICogRGVmYXVsdHMgdG8gYHRydWVgLlxuICAgKi9cbiAgc2NhbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGJldGEgd2VpZ2h0LlxuICAgKiAgRGVmYXVsdHMgdG8gJ3plcm9zJy5cbiAgICovXG4gIGJldGFJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZXIgZm9yIHRoZSBnYW1tYSB3ZWlnaHQuXG4gICAqICBEZWZhdWx0cyB0byBgb25lc2AuXG4gICAqL1xuICBnYW1tYUluaXRpYWxpemVyPzogSW5pdGlhbGl6ZXJJZGVudGlmaWVyfEluaXRpYWxpemVyO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIG1vdmluZyBtZWFuLlxuICAgKiBEZWZhdWx0cyB0byBgemVyb3NgXG4gICAqL1xuICBtb3ZpbmdNZWFuSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgbW92aW5nIHZhcmlhbmNlLlxuICAgKiAgRGVmYXVsdHMgdG8gJ09uZXMnLlxuICAgKi9cbiAgbW92aW5nVmFyaWFuY2VJbml0aWFsaXplcj86IEluaXRpYWxpemVySWRlbnRpZmllcnxJbml0aWFsaXplcjtcblxuICAvKipcbiAgICogQ29uc3RyYWludCBmb3IgdGhlIGJldGEgd2VpZ2h0LlxuICAgKi9cbiAgYmV0YUNvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBDb25zdHJhaW50IGZvciBnYW1tYSB3ZWlnaHQuXG4gICAqL1xuICBnYW1tYUNvbnN0cmFpbnQ/OiBDb25zdHJhaW50SWRlbnRpZmllcnxDb25zdHJhaW50O1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmb3IgdGhlIGJldGEgd2VpZ2h0LlxuICAgKi9cbiAgYmV0YVJlZ3VsYXJpemVyPzogUmVndWxhcml6ZXJJZGVudGlmaWVyfFJlZ3VsYXJpemVyO1xuXG4gIC8qKlxuICAgKiBSZWd1bGFyaXplciBmb3IgdGhlIGdhbW1hIHdlaWdodC5cbiAgICovXG4gIGdhbW1hUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBCYXRjaE5vcm1hbGl6YXRpb24gZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0JhdGNoTm9ybWFsaXphdGlvbic7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXhpczogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vbWVudHVtOiBudW1iZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZXBzaWxvbjogbnVtYmVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGNlbnRlcjogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBzY2FsZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSByZWFkb25seSBiZXRhSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGdhbW1hSW5pdGlhbGl6ZXI6IEluaXRpYWxpemVyO1xuICBwcml2YXRlIHJlYWRvbmx5IG1vdmluZ01lYW5Jbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgbW92aW5nVmFyaWFuY2VJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmV0YUNvbnN0cmFpbnQ6IENvbnN0cmFpbnQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2FtbWFDb25zdHJhaW50OiBDb25zdHJhaW50O1xuICBwcml2YXRlIHJlYWRvbmx5IGJldGFSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHByaXZhdGUgcmVhZG9ubHkgZ2FtbWFSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHByaXZhdGUgZ2FtbWE6IExheWVyVmFyaWFibGU7XG4gIHByaXZhdGUgYmV0YTogTGF5ZXJWYXJpYWJsZTtcbiAgcHJpdmF0ZSBtb3ZpbmdNZWFuOiBMYXllclZhcmlhYmxlO1xuICBwcml2YXRlIG1vdmluZ1ZhcmlhbmNlOiBMYXllclZhcmlhYmxlO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M/OiBCYXRjaE5vcm1hbGl6YXRpb25MYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncyA9PSBudWxsKSB7XG4gICAgICBhcmdzID0ge307XG4gICAgfVxuICAgIHN1cGVyKGFyZ3MpO1xuXG4gICAgdGhpcy5zdXBwb3J0c01hc2tpbmcgPSB0cnVlO1xuICAgIHRoaXMuYXhpcyA9IGFyZ3MuYXhpcyA9PSBudWxsID8gLTEgOiBhcmdzLmF4aXM7XG4gICAgdGhpcy5tb21lbnR1bSA9IGFyZ3MubW9tZW50dW0gPT0gbnVsbCA/IDAuOTkgOiBhcmdzLm1vbWVudHVtO1xuICAgIHRoaXMuZXBzaWxvbiA9IGFyZ3MuZXBzaWxvbiA9PSBudWxsID8gMWUtMyA6IGFyZ3MuZXBzaWxvbjtcbiAgICB0aGlzLmNlbnRlciA9IGFyZ3MuY2VudGVyID09IG51bGwgPyB0cnVlIDogYXJncy5jZW50ZXI7XG4gICAgdGhpcy5zY2FsZSA9IGFyZ3Muc2NhbGUgPT0gbnVsbCA/IHRydWUgOiBhcmdzLnNjYWxlO1xuICAgIHRoaXMuYmV0YUluaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoYXJncy5iZXRhSW5pdGlhbGl6ZXIgfHwgJ3plcm9zJyk7XG4gICAgdGhpcy5nYW1tYUluaXRpYWxpemVyID0gZ2V0SW5pdGlhbGl6ZXIoYXJncy5nYW1tYUluaXRpYWxpemVyIHx8ICdvbmVzJyk7XG4gICAgdGhpcy5tb3ZpbmdNZWFuSW5pdGlhbGl6ZXIgPVxuICAgICAgICBnZXRJbml0aWFsaXplcihhcmdzLm1vdmluZ01lYW5Jbml0aWFsaXplciB8fCAnemVyb3MnKTtcbiAgICB0aGlzLm1vdmluZ1ZhcmlhbmNlSW5pdGlhbGl6ZXIgPVxuICAgICAgICBnZXRJbml0aWFsaXplcihhcmdzLm1vdmluZ1ZhcmlhbmNlSW5pdGlhbGl6ZXIgfHwgJ29uZXMnKTtcbiAgICB0aGlzLmJldGFDb25zdHJhaW50ID0gZ2V0Q29uc3RyYWludChhcmdzLmJldGFDb25zdHJhaW50KTtcbiAgICB0aGlzLmdhbW1hQ29uc3RyYWludCA9IGdldENvbnN0cmFpbnQoYXJncy5nYW1tYUNvbnN0cmFpbnQpO1xuICAgIHRoaXMuYmV0YVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5iZXRhUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuZ2FtbWFSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuZ2FtbWFSZWd1bGFyaXplcik7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgYXhpcyA9IHRoaXMuYXhpcyA+PSAwID8gdGhpcy5heGlzIDogKHRoaXMuYXhpcyArIGlucHV0U2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBkaW0gPSBpbnB1dFNoYXBlW2F4aXNdO1xuICAgIGlmIChkaW0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYEF4aXMgJHtheGlzfSBvZiBpbnB1dCB0ZW5zb3Igc2hvdWxkIGhhdmUgYSBkZWZpbmVkIGRpbWVuc2lvbiBidXQgYCArXG4gICAgICAgICAgYHRoZSBsYXllciByZWNlaXZlZCBhbiBpbnB1dCB3aXRoIHNoYXBlIGAgK1xuICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGlucHV0U2hhcGUpfS5gKTtcbiAgICB9XG4gICAgdGhpcy5pbnB1dFNwZWMgPVxuICAgICAgICBbbmV3IElucHV0U3BlYyh7bmRpbTogaW5wdXRTaGFwZS5sZW5ndGgsIGF4ZXM6IHtbYXhpc106IGRpbX19KV07XG4gICAgY29uc3Qgc2hhcGUgPSBbZGltXTtcbiAgICBpZiAodGhpcy5zY2FsZSkge1xuICAgICAgdGhpcy5nYW1tYSA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdnYW1tYScsIHNoYXBlLCBudWxsLCB0aGlzLmdhbW1hSW5pdGlhbGl6ZXIsIHRoaXMuZ2FtbWFSZWd1bGFyaXplcixcbiAgICAgICAgICB0cnVlLCB0aGlzLmdhbW1hQ29uc3RyYWludCk7XG4gICAgfVxuICAgIGlmICh0aGlzLmNlbnRlcikge1xuICAgICAgdGhpcy5iZXRhID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JldGEnLCBzaGFwZSwgbnVsbCwgdGhpcy5iZXRhSW5pdGlhbGl6ZXIsIHRoaXMuYmV0YVJlZ3VsYXJpemVyLCB0cnVlLFxuICAgICAgICAgIHRoaXMuYmV0YUNvbnN0cmFpbnQpO1xuICAgIH1cbiAgICB0aGlzLm1vdmluZ01lYW4gPSB0aGlzLmFkZFdlaWdodChcbiAgICAgICAgJ21vdmluZ19tZWFuJywgc2hhcGUsIG51bGwsIHRoaXMubW92aW5nTWVhbkluaXRpYWxpemVyLCBudWxsLCBmYWxzZSk7XG4gICAgdGhpcy5tb3ZpbmdWYXJpYW5jZSA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAnbW92aW5nX3ZhcmlhbmNlJywgc2hhcGUsIG51bGwsIHRoaXMubW92aW5nVmFyaWFuY2VJbml0aWFsaXplciwgbnVsbCxcbiAgICAgICAgZmFsc2UpO1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHRyYWluaW5nID0ga3dhcmdzWyd0cmFpbmluZyddID09IG51bGwgPyBmYWxzZSA6IGt3YXJnc1sndHJhaW5pbmcnXTtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgY29uc3QgaW5wdXRTaGFwZSA9IGlucHV0LnNoYXBlO1xuICAgICAgY29uc3QgbmRpbSA9IGlucHV0U2hhcGUubGVuZ3RoO1xuICAgICAgY29uc3QgcmVkdWN0aW9uQXhlcyA9IG1hdGhfdXRpbHMucmFuZ2UoMCwgbmRpbSk7XG4gICAgICBjb25zdCBheGlzID0gdGhpcy5heGlzID49IDAgPyB0aGlzLmF4aXMgOiAodGhpcy5heGlzICsgbmRpbSk7XG4gICAgICByZWR1Y3Rpb25BeGVzLnNwbGljZShheGlzLCAxKTtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdFNoYXBlID0gZ2VuZXJpY191dGlscy5weUxpc3RSZXBlYXQoMSwgbmRpbSk7XG4gICAgICBicm9hZGNhc3RTaGFwZVtheGlzXSA9IGlucHV0U2hhcGVbYXhpc107XG5cbiAgICAgIGNvbnN0IHNvcnRlZFJlZHVjdGlvbkF4ZXMgPSByZWR1Y3Rpb25BeGVzLnNsaWNlKCk7XG4gICAgICBzb3J0ZWRSZWR1Y3Rpb25BeGVzLnNvcnQoKTtcbiAgICAgIGNvbnN0IG5lZWRzQnJvYWRjYXN0aW5nID0gIXV0aWwuYXJyYXlzRXF1YWwoXG4gICAgICAgICAgc29ydGVkUmVkdWN0aW9uQXhlcywgbWF0aF91dGlscy5yYW5nZSgwLCBuZGltKS5zbGljZSgwLCBuZGltIC0gMSkpO1xuXG4gICAgICBjb25zdCBub3JtYWxpemVJbmZlcmVuY2U6ICgpID0+IFRlbnNvciA9ICgpID0+IHtcbiAgICAgICAgaWYgKG5lZWRzQnJvYWRjYXN0aW5nKSB7XG4gICAgICAgICAgY29uc3QgYnJvYWRjYXN0TW92aW5nTWVhbiA9XG4gICAgICAgICAgICAgIHJlc2hhcGUodGhpcy5tb3ZpbmdNZWFuLnJlYWQoKSwgYnJvYWRjYXN0U2hhcGUpO1xuICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdE1vdmluZ1ZhcmlhbmNlID1cbiAgICAgICAgICAgICAgcmVzaGFwZSh0aGlzLm1vdmluZ1ZhcmlhbmNlLnJlYWQoKSwgYnJvYWRjYXN0U2hhcGUpO1xuICAgICAgICAgIGNvbnN0IGJyb2FkY2FzdEJldGEgPVxuICAgICAgICAgICAgICB0aGlzLmNlbnRlciA/IHJlc2hhcGUodGhpcy5iZXRhLnJlYWQoKSwgYnJvYWRjYXN0U2hhcGUpIDogbnVsbDtcbiAgICAgICAgICBjb25zdCBicm9hZGNhc3RHYW1tYSA9XG4gICAgICAgICAgICAgIHRoaXMuc2NhbGUgPyByZXNoYXBlKHRoaXMuZ2FtbWEucmVhZCgpLCBicm9hZGNhc3RTaGFwZSkgOiBudWxsO1xuICAgICAgICAgIHJldHVybiBiYXRjaE5vcm1hbGl6YXRpb24oXG4gICAgICAgICAgICAgIGlucHV0LCBicm9hZGNhc3RNb3ZpbmdNZWFuLCBicm9hZGNhc3RNb3ZpbmdWYXJpYW5jZSxcbiAgICAgICAgICAgICAgYnJvYWRjYXN0QmV0YSwgYnJvYWRjYXN0R2FtbWEsIHRoaXMuZXBzaWxvbik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGJhdGNoTm9ybWFsaXphdGlvbihcbiAgICAgICAgICAgICAgaW5wdXQsIHRoaXMubW92aW5nTWVhbi5yZWFkKCksIHRoaXMubW92aW5nVmFyaWFuY2UucmVhZCgpLFxuICAgICAgICAgICAgICB0aGlzLmJldGEgPT0gbnVsbCA/IG51bGwgOiB0aGlzLmJldGEucmVhZCgpLFxuICAgICAgICAgICAgICB0aGlzLmdhbW1hID09IG51bGwgPyBudWxsIDogdGhpcy5nYW1tYS5yZWFkKCksIHRoaXMuZXBzaWxvbik7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIGlmICghdHJhaW5pbmcpIHtcbiAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZUluZmVyZW5jZSgpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBbbm9ybWVkVHJhaW5pbmcsIG1lYW4sIHZhcmlhbmNlXSA9IG5vcm1hbGl6ZUJhdGNoSW5UcmFpbmluZyhcbiAgICAgICAgICBpbnB1dCwgdGhpcy5nYW1tYS5yZWFkKCksIHRoaXMuYmV0YS5yZWFkKCksIHJlZHVjdGlvbkF4ZXMsXG4gICAgICAgICAgdGhpcy5lcHNpbG9uKTtcblxuICAgICAgY29uc3QgZG9Nb3ZpbmdBdmVyYWdlID1cbiAgICAgICAgICAodmFyaWFibGU6IExheWVyVmFyaWFibGUsIHZhbHVlOiBUZW5zb3IsIG1vbWVudHVtOiBudW1iZXIpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIHRmYy50aWR5KCgpID0+IHtcbiAgICAgICAgICAgICAgY29uc3QgZGVjYXkgPSAxIC0gbW9tZW50dW07XG4gICAgICAgICAgICAgIGNvbnN0IG9yaWdWYWx1ZSA9IHZhcmlhYmxlLnJlYWQoKTtcbiAgICAgICAgICAgICAgY29uc3QgdXBkYXRlRGVsdGEgPSB0ZmMubXVsKHRmYy5zdWIob3JpZ1ZhbHVlLCB2YWx1ZSksIGRlY2F5KTtcbiAgICAgICAgICAgICAgdmFyaWFibGUud3JpdGUodGZjLnN1YihvcmlnVmFsdWUsIHVwZGF0ZURlbHRhKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAvLyBQZXJmb3JtIHVwZGF0ZXMgdG8gbW92aW5nIG1lYW4gYW5kIG1vdmluZyB2YXJpYW5jZSBmb3IgdHJhaW5pbmcuXG4gICAgICAvLyBQb3J0aW5nIE5vdGU6IEluIFB5S2VyYXMsIHRoZXNlIHVwZGF0ZXMgdG8gYG1vdmluZ01lYW5gIGFuZFxuICAgICAgLy8gICBgbW92aW5nQXZlcmFnZWAgYXJlIGRvbmUgYXMgYSBkZWZlcnJlZCBHcmFwaCwgYWRkZWQgdG8gdGhlIGBMYXllcmAnc1xuICAgICAgLy8gICBgdXBkYXRlYHMgdXNpbmcgdGhlIGBhZGRfdXBkYXRlKClgIG1ldGhvZC4gSGVyZSB3ZSBkbyBpdCBpbXBlcmF0aXZlbHlcbiAgICAgIC8vICAgYW5kIGVuY2Fwc3VsYXRlIHRoZSB1cGRhdGVzIGluIGEgZnVuY3Rpb24gdGhhdCBpcyBpbnZva2VkXG4gICAgICAvLyAgIGltbWVkaWF0ZWx5LlxuICAgICAgY29uc3QgdXBkYXRlTW92aW5nTWVhbkFuZFZhcmlhbmNlID0gKCkgPT4ge1xuICAgICAgICBkb01vdmluZ0F2ZXJhZ2UodGhpcy5tb3ZpbmdNZWFuLCBtZWFuLCB0aGlzLm1vbWVudHVtKTtcbiAgICAgICAgZG9Nb3ZpbmdBdmVyYWdlKHRoaXMubW92aW5nVmFyaWFuY2UsIHZhcmlhbmNlLCB0aGlzLm1vbWVudHVtKTtcbiAgICAgIH07XG4gICAgICB1cGRhdGVNb3ZpbmdNZWFuQW5kVmFyaWFuY2UoKTtcblxuICAgICAgcmV0dXJuIG5vcm1lZFRyYWluaW5nO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICBheGlzOiB0aGlzLmF4aXMsXG4gICAgICBtb21lbnR1bTogdGhpcy5tb21lbnR1bSxcbiAgICAgIGVwc2lsb246IHRoaXMuZXBzaWxvbixcbiAgICAgIGNlbnRlcjogdGhpcy5jZW50ZXIsXG4gICAgICBzY2FsZTogdGhpcy5zY2FsZSxcbiAgICAgIGJldGFJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5iZXRhSW5pdGlhbGl6ZXIpLFxuICAgICAgZ2FtbWFJbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5nYW1tYUluaXRpYWxpemVyKSxcbiAgICAgIG1vdmluZ01lYW5Jbml0aWFsaXplcjogc2VyaWFsaXplSW5pdGlhbGl6ZXIodGhpcy5tb3ZpbmdNZWFuSW5pdGlhbGl6ZXIpLFxuICAgICAgbW92aW5nVmFyaWFuY2VJbml0aWFsaXplcjpcbiAgICAgICAgICBzZXJpYWxpemVJbml0aWFsaXplcih0aGlzLm1vdmluZ1ZhcmlhbmNlSW5pdGlhbGl6ZXIpLFxuICAgICAgYmV0YVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmJldGFSZWd1bGFyaXplciksXG4gICAgICBnYW1tYVJlZ3VsYXJpemVyOiBzZXJpYWxpemVSZWd1bGFyaXplcih0aGlzLmdhbW1hUmVndWxhcml6ZXIpLFxuICAgICAgYmV0YUNvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5iZXRhQ29uc3RyYWludCksXG4gICAgICBnYW1tYUNvbnN0cmFpbnQ6IHNlcmlhbGl6ZUNvbnN0cmFpbnQodGhpcy5nYW1tYUNvbnN0cmFpbnQpXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhCYXRjaE5vcm1hbGl6YXRpb24pO1xuXG5leHBvcnQgaW50ZXJmYWNlIExheWVyTm9ybWFsaXphdGlvbkxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgYXhpcyBvciBheGVzIHRoYXQgc2hvdWxkIGJlIG5vcm1hbGl6ZWQgKHR5cGljYWxseSwgdGhlIGZlYXR1cmUgYXhpcykuXG4gICAqIERlZmF1bHRzIHRvIC0xICh0aGUgbGFzdCBheGlzKS5cbiAgICovXG4gIGF4aXM/OiBudW1iZXJ8bnVtYmVyW107XG5cbiAgLyoqXG4gICAqIEEgc21hbGwgcG9zaXRpdmUgZmxvYXQgYWRkZWQgdG8gdmFyaWFuY2UgdG8gYXZvaWQgZGl2aXNvbiBieSB6ZXJvLlxuICAgKiBEZWZhdWx0cyB0byAxZS0zLlxuICAgKi9cbiAgZXBzaWxvbj86IG51bWJlcjtcblxuICAvKipcbiAgICogSWYgYHRydWVgLCBhZGQgb2Zmc2V0IG9mIGBiZXRhYCB0byBub3JtYWxpemVkIHRlbnNvci5cbiAgICogSWYgYGZhbHNlYCwgYGJldGFgIGlzIGlnbm9yZWQuXG4gICAqIERlZmF1bHQ6IGB0cnVlYC5cbiAgICovXG4gIGNlbnRlcj86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIElmIGB0cnVlYCwgbXVsdGlwbHkgb3V0cHV0IGJ5IGBnYW1tYWAuXG4gICAqIElmIGBmYWxzZWAsIGBnYW1tYWAgaXMgbm90IHVzZWQuXG4gICAqIFdoZW4gdGhlIG5leHQgbGF5ZXIgaXMgbGluZWFyLCB0aGlzIGNhbiBiZSBkaXNhYmxlZCBzaW5jZSBzY2FsaW5nIHdpbGxcbiAgICogYmUgZG9uZSBieSB0aGUgbmV4dCBsYXllci5cbiAgICogRGVmYXVsdDogYHRydWVgLlxuICAgKi9cbiAgc2NhbGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBJbml0aWFsaXplciBmb3IgdGhlIGJldGEgd2VpZ2h0LlxuICAgKiBEZWZhdWx0OiBgJ3plcm9zJ2AuXG4gICAqL1xuICBiZXRhSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqXG4gICAqIEluaXRpYWxpemVyIGZvciB0aGUgZ2FtbWEgd2VpZ2h0LlxuICAgKiBEZWZhdWx0OiBgJ29uZXMnYC5cbiAgICovXG4gIGdhbW1hSW5pdGlhbGl6ZXI/OiBJbml0aWFsaXplcklkZW50aWZpZXJ8SW5pdGlhbGl6ZXI7XG5cbiAgLyoqIFJlZ3VsYXJpemVyIGZvciB0aGUgYmV0YSB3ZWlnaHQuICovXG4gIGJldGFSZWd1bGFyaXplcj86IFJlZ3VsYXJpemVySWRlbnRpZmllcnxSZWd1bGFyaXplcjtcblxuICAvKiogUmVndWxhcml6ZXIgZm9yIHRoZSBnYW1tYSB3ZWlnaHQuICovXG4gIGdhbW1hUmVndWxhcml6ZXI/OiBSZWd1bGFyaXplcklkZW50aWZpZXJ8UmVndWxhcml6ZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBMYXllck5vcm1hbGl6YXRpb24gZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0xheWVyTm9ybWFsaXphdGlvbic7XG5cbiAgcHJpdmF0ZSBheGlzOiBudW1iZXJ8bnVtYmVyW107XG4gIHJlYWRvbmx5IGVwc2lsb246IG51bWJlcjtcbiAgcmVhZG9ubHkgY2VudGVyOiBib29sZWFuO1xuICByZWFkb25seSBzY2FsZTogYm9vbGVhbjtcbiAgcmVhZG9ubHkgYmV0YUluaXRpYWxpemVyOiBJbml0aWFsaXplcjtcbiAgcmVhZG9ubHkgZ2FtbWFJbml0aWFsaXplcjogSW5pdGlhbGl6ZXI7XG4gIHJlYWRvbmx5IGJldGFSZWd1bGFyaXplcjogUmVndWxhcml6ZXI7XG4gIHJlYWRvbmx5IGdhbW1hUmVndWxhcml6ZXI6IFJlZ3VsYXJpemVyO1xuXG4gIHByaXZhdGUgZ2FtbWE6IExheWVyVmFyaWFibGU7XG4gIHByaXZhdGUgYmV0YTogTGF5ZXJWYXJpYWJsZTtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogTGF5ZXJOb3JtYWxpemF0aW9uTGF5ZXJBcmdzKSB7XG4gICAgaWYgKGFyZ3MgPT0gbnVsbCkge1xuICAgICAgYXJncyA9IHt9O1xuICAgIH1cbiAgICBzdXBlcihhcmdzKTtcblxuICAgIHRoaXMuYXhpcyA9IGFyZ3MuYXhpcyA9PSBudWxsID8gLTEgOiBhcmdzLmF4aXM7XG4gICAgaWYgKHR5cGVvZiB0aGlzLmF4aXMgPT09ICdudW1iZXInKSB7XG4gICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIodGhpcy5heGlzKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRXhwZWN0ZWQgYXhpcyB0byBiZSBhbiBpbnRlZ2VyLCBidXQgcmVjZWl2ZWQgJHt0aGlzLmF4aXN9YCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYXhpcykpIHtcbiAgICAgIGZvciAoY29uc3QgYXhpcyBvZiB0aGlzLmF4aXMpIHtcbiAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGF4aXMpKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICBgRXhwZWN0ZWQgYXhpcyB0byBiZSBhbiBhcnJheSBvZiBpbnRlZ2VycywgYCArXG4gICAgICAgICAgICAgIGBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmF4aXMpfWApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0ZWQgYXhpcyB0byBiZSBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIGludGVnZXJzLCBgICtcbiAgICAgICAgICBgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkodGhpcy5heGlzKX1gKTtcbiAgICB9XG5cbiAgICB0aGlzLmVwc2lsb24gPSBhcmdzLmVwc2lsb24gPT0gbnVsbCA/IDFlLTMgOiBhcmdzLmVwc2lsb247XG4gICAgdGhpcy5jZW50ZXIgPSBhcmdzLmNlbnRlciA9PSBudWxsID8gdHJ1ZSA6IGFyZ3MuY2VudGVyO1xuICAgIHRoaXMuc2NhbGUgPSBhcmdzLnNjYWxlID09IG51bGwgPyB0cnVlIDogYXJncy5zY2FsZTtcbiAgICB0aGlzLmJldGFJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKGFyZ3MuYmV0YUluaXRpYWxpemVyIHx8ICd6ZXJvcycpO1xuICAgIHRoaXMuZ2FtbWFJbml0aWFsaXplciA9IGdldEluaXRpYWxpemVyKGFyZ3MuZ2FtbWFJbml0aWFsaXplciB8fCAnb25lcycpO1xuICAgIHRoaXMuYmV0YVJlZ3VsYXJpemVyID0gZ2V0UmVndWxhcml6ZXIoYXJncy5iZXRhUmVndWxhcml6ZXIpO1xuICAgIHRoaXMuZ2FtbWFSZWd1bGFyaXplciA9IGdldFJlZ3VsYXJpemVyKGFyZ3MuZ2FtbWFSZWd1bGFyaXplcik7XG5cbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gIH1cblxuICBwdWJsaWMgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgbkRpbXMgPSBpbnB1dFNoYXBlLmxlbmd0aDtcblxuICAgIC8vIENvbnZlcnQgYXhpcyB0byBhcnJheSBhbmQgcmVzb2x2ZSBuZWdhdGl2ZXMuXG4gICAgaWYgKHR5cGVvZiB0aGlzLmF4aXMgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLmF4aXMgPSBbdGhpcy5heGlzXTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF4aXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmICh0aGlzLmF4aXNbaV0gPCAwKSB7XG4gICAgICAgIHRoaXMuYXhpc1tpXSArPSBuRGltcztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGdXJ0aGVyIHZhbGlkYXRlIGF4ZXMuXG4gICAgZm9yIChjb25zdCBheGlzIG9mIHRoaXMuYXhpcykge1xuICAgICAgaWYgKGF4aXMgPCAwIHx8IGF4aXMgPj0gbkRpbXMpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGF4aXM6ICR7YXhpc31gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHRoaXMuYXhpcy5sZW5ndGggIT09IGdlbmVyaWNfdXRpbHMudW5pcXVlKHRoaXMuYXhpcykubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZvdW5kIGR1cGxpY2F0ZSBheGVzIGluOiAke3RoaXMuYXhpc31gKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXJhbVNoYXBlID0gdGhpcy5heGlzLm1hcChheGlzID0+IGlucHV0U2hhcGVbYXhpc10pIGFzIG51bWJlcltdO1xuXG4gICAgY29uc3QgdHJhaW5hYmxlID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zY2FsZSkge1xuICAgICAgdGhpcy5nYW1tYSA9IHRoaXMuYWRkV2VpZ2h0KFxuICAgICAgICAgICdnYW1tYScsIHBhcmFtU2hhcGUsICdmbG9hdDMyJywgdGhpcy5nYW1tYUluaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMuZ2FtbWFSZWd1bGFyaXplciwgdHJhaW5hYmxlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5nYW1tYSA9IG51bGw7XG4gICAgfVxuICAgIGlmICh0aGlzLmNlbnRlcikge1xuICAgICAgdGhpcy5iZXRhID0gdGhpcy5hZGRXZWlnaHQoXG4gICAgICAgICAgJ2JldGEnLCBwYXJhbVNoYXBlLCAnZmxvYXQzMicsIHRoaXMuYmV0YUluaXRpYWxpemVyLFxuICAgICAgICAgIHRoaXMuYmV0YVJlZ3VsYXJpemVyLCB0cmFpbmFibGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJldGEgPSBudWxsO1xuICAgIH1cblxuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICBjb25zdCBuRGltcyA9IGlucHV0U2hhcGUubGVuZ3RoO1xuXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3Qga2VlcERpbXMgPSB0cnVlO1xuICAgICAgbGV0IHttZWFuLCB2YXJpYW5jZX0gPSBtb21lbnRzKGlucHV0LCB0aGlzLmF4aXMsIGtlZXBEaW1zKTtcbiAgICAgIGNvbnN0IGJyb2FkY2FzdFNoYXBlID0gZ2VuZXJpY191dGlscy5weUxpc3RSZXBlYXQoMSwgbkRpbXMpO1xuICAgICAgZm9yIChjb25zdCBkaW0gb2YgdGhpcy5heGlzIGFzIG51bWJlcltdKSB7XG4gICAgICAgIGJyb2FkY2FzdFNoYXBlW2RpbV0gPSBpbnB1dFNoYXBlW2RpbV07XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJyb2FkY2FzdCA9ICh2OiBUZW5zb3IpID0+IHtcbiAgICAgICAgaWYgKHYgIT0gbnVsbCAmJiB2LnNoYXBlLmxlbmd0aCAhPT0gbkRpbXMpIHtcbiAgICAgICAgICByZXR1cm4gdGZjLnJlc2hhcGUodiwgYnJvYWRjYXN0U2hhcGUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBsZXQgc2NhbGUgPSB0aGlzLnNjYWxlID8gYnJvYWRjYXN0KHRoaXMuZ2FtbWEucmVhZCgpKSA6IG51bGw7XG4gICAgICBsZXQgb2Zmc2V0ID0gdGhpcy5jZW50ZXIgPyBicm9hZGNhc3QodGhpcy5iZXRhLnJlYWQoKSkgOiBudWxsO1xuXG4gICAgICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzIxMjApOiBUaGUgdGlsaW5nIGJlbG93XG4gICAgICAvLyBpcyBhIHdvcmthcm91bmQgZm9yIHRoZSBsaW1pdGF0aW9uIG9mIGNvcmUncyBiYXRjaE5vcm1hbGl6YXRpb24/ZCBkb24ndFxuICAgICAgLy8gc3VwcG9ydCBicm9hZGNhc3RpbmcgaW4gdGhlaXIgZ3JhZGllbnRzLiBJbiBhZGRpdGlvbiwgdGhlIHRpbGluZyBpc1xuICAgICAgLy8gbmVjZXNzYXJ5IHRvIGVuc3VyZSBjb3JyZWN0bmVzcyBvbiB0aGUgYnJvd3NlciBDUFUgYmFja2VuZCByZWdhcmRsZXNzXG4gICAgICAvLyBvZiBmb3J3YXJkIG9yIGJhY2t3YXJkIGNvbXB1dGF0aW9uLiBSZW1vdmUgdGhpcyB3b3JrYXJvdW5kIG9uY2UgdGhlXG4gICAgICAvLyBsaW1pdGF0aW9uIGlzIGFkZHJlc3NlZC4gU2VlIC5cbiAgICAgIGNvbnN0IG1vbWVudHNUaWxpbmc6IG51bWJlcltdID0gW107XG4gICAgICBjb25zdCBzY2FsZU9mZnNldFRpbGluZzogbnVtYmVyW10gPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbkRpbXM7ICsraSkge1xuICAgICAgICBpZiAoKHRoaXMuYXhpcyBhcyBudW1iZXJbXSkuaW5kZXhPZihpKSAhPT0gLTEpIHtcbiAgICAgICAgICBtb21lbnRzVGlsaW5nLnB1c2goaW5wdXRTaGFwZVtpXSk7XG4gICAgICAgICAgc2NhbGVPZmZzZXRUaWxpbmcucHVzaCgxKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb21lbnRzVGlsaW5nLnB1c2goMSk7XG4gICAgICAgICAgc2NhbGVPZmZzZXRUaWxpbmcucHVzaChpbnB1dFNoYXBlW2ldKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgbWVhbiA9IHRmYy50aWxlKG1lYW4sIG1vbWVudHNUaWxpbmcpO1xuICAgICAgdmFyaWFuY2UgPSB0ZmMudGlsZSh2YXJpYW5jZSwgbW9tZW50c1RpbGluZyk7XG4gICAgICBpZiAoc2NhbGUgIT0gbnVsbCkge1xuICAgICAgICBzY2FsZSA9IHRmYy50aWxlKHNjYWxlLCBzY2FsZU9mZnNldFRpbGluZyk7XG4gICAgICB9XG4gICAgICBpZiAob2Zmc2V0ICE9IG51bGwpIHtcbiAgICAgICAgb2Zmc2V0ID0gdGZjLnRpbGUob2Zmc2V0LCBzY2FsZU9mZnNldFRpbGluZyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBiYXRjaE5vcm1hbGl6YXRpb24oXG4gICAgICAgICAgaW5wdXQsIG1lYW4sIHZhcmlhbmNlLCBvZmZzZXQsIHNjYWxlLCB0aGlzLmVwc2lsb24pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICBheGlzOiB0aGlzLmF4aXMsXG4gICAgICBlcHNpbG9uOiB0aGlzLmVwc2lsb24sXG4gICAgICBjZW50ZXI6IHRoaXMuY2VudGVyLFxuICAgICAgc2NhbGU6IHRoaXMuc2NhbGUsXG4gICAgICBiZXRhSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuYmV0YUluaXRpYWxpemVyKSxcbiAgICAgIGdhbW1hSW5pdGlhbGl6ZXI6IHNlcmlhbGl6ZUluaXRpYWxpemVyKHRoaXMuZ2FtbWFJbml0aWFsaXplciksXG4gICAgICBiZXRhUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuYmV0YVJlZ3VsYXJpemVyKSxcbiAgICAgIGdhbW1hUmVndWxhcml6ZXI6IHNlcmlhbGl6ZVJlZ3VsYXJpemVyKHRoaXMuZ2FtbWFSZWd1bGFyaXplcilcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKExheWVyTm9ybWFsaXphdGlvbik7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Padding Layers.\n */\n// Porting Note: In Python Keras, the padding layers are in convolutional.py,\n//   but we decided to put them in a separate file (padding.ts) for clarity.\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { imageDataFormat } from '../backend/common';\nimport { InputSpec, Layer } from '../engine/topology';\nimport { ValueError } from '../errors';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\n/**\n * Pads the middle dimension of a 3D tensor.\n *\n * @param x Input `tf.Tensor` to be padded.\n * @param padding `Array` of 2 integers, how many zeros to add at the start and\n *   end of the middle dimension (i.e., dimension 1).\n * @return A padded 3D `tf.Tensor`.\n */\nexport function temporalPadding(x, padding) {\n    return tidy(() => {\n        if (x.rank !== 3) {\n            throw new ValueError(`temporalPadding expects input tensor to be 3-D, but received a ` +\n                `${x.rank}-D tensor.`);\n        }\n        if (padding == null) {\n            padding = [1, 1];\n        }\n        if (padding.length !== 2) {\n            throw new ValueError(`temporalPadding expects input padding pattern to be a length-2 ` +\n                `array, but received a length-${padding.length} array.`);\n        }\n        const pattern = [[0, 0], padding, [0, 0]];\n        return tfc.pad(x, pattern);\n    });\n}\n/**\n * Pads the 2nd and 3rd dimensions of a 4D tensor.\n *\n * @param x Input `tf.Tensor` to be padded.\n * @param padding `Array` of two `Array`s, each of which is an `Array` of two\n *   integers. The amount of padding at the beginning and end of the 2nd and 3rd\n *   dimensions, respectively.\n * @param dataFormat 'channelsLast' (default) or 'channelsFirst'.\n * @return Padded 4D `tf.Tensor`.\n */\nexport function spatial2dPadding(x, padding, dataFormat) {\n    return tidy(() => {\n        if (x.rank !== 4) {\n            throw new ValueError(`temporalPadding expects input tensor to be 4-D, but received a ` +\n                `${x.rank}-D tensor.`);\n        }\n        if (padding == null) {\n            padding = [[1, 1], [1, 1]];\n        }\n        if (padding.length !== 2 || padding[0].length !== 2 ||\n            padding[1].length !== 2) {\n            throw new ValueError('spatial2dPadding expects `padding` to be an Array of two Arrays, ' +\n                'each of which is an Array of two integers.');\n        }\n        if (dataFormat == null) {\n            dataFormat = imageDataFormat();\n        }\n        if (dataFormat !== 'channelsLast' && dataFormat !== 'channelsFirst') {\n            throw new ValueError(`Unknown data format: ${dataFormat}. ` +\n                `Supported data formats are 'channelsLast' and 'channelsFirst.`);\n        }\n        let pattern;\n        if (dataFormat === 'channelsFirst') {\n            pattern = [[0, 0], [0, 0], padding[0], padding[1]];\n        }\n        else {\n            pattern = [[0, 0], padding[0], padding[1], [0, 0]];\n        }\n        return tfc.pad(x, pattern);\n    });\n}\nexport class ZeroPadding2D extends Layer {\n    constructor(args) {\n        if (args == null) {\n            args = {};\n        }\n        super(args);\n        this.dataFormat =\n            args.dataFormat == null ? imageDataFormat() : args.dataFormat;\n        // TODO(cais): Maybe refactor the following logic surrounding `padding`\n        //   into a helper method.\n        if (args.padding == null) {\n            this.padding = [[1, 1], [1, 1]];\n        }\n        else if (typeof args.padding === 'number') {\n            this.padding =\n                [[args.padding, args.padding], [args.padding, args.padding]];\n        }\n        else {\n            args.padding = args.padding;\n            if (args.padding.length !== 2) {\n                throw new ValueError(`ZeroPadding2D expects padding to be a length-2 array, but ` +\n                    `received a length-${args.padding.length} array.`);\n            }\n            let heightPadding;\n            let widthPadding;\n            if (typeof args.padding[0] === 'number') {\n                heightPadding = [args.padding[0], args.padding[0]];\n                widthPadding = [args.padding[1], args.padding[1]];\n            }\n            else {\n                args.padding = args.padding;\n                if (args.padding[0].length !== 2) {\n                    throw new ValueError(`ZeroPadding2D expects height padding to be a length-2 array, ` +\n                        `but received a length-${args.padding[0].length} array.`);\n                }\n                heightPadding = args.padding[0];\n                if (args.padding[1].length !== 2) {\n                    throw new ValueError(`ZeroPadding2D expects width padding to be a length-2 array, ` +\n                        `but received a length-${args.padding[1].length} array.`);\n                }\n                widthPadding = args.padding[1];\n            }\n            this.padding = [heightPadding, widthPadding];\n        }\n        this.inputSpec = [new InputSpec({ ndim: 4 })];\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        let rows;\n        let cols;\n        if (this.dataFormat === 'channelsFirst') {\n            if (inputShape[2] != null && inputShape[2] >= 0) {\n                rows = inputShape[2] + this.padding[0][0] + this.padding[0][1];\n            }\n            else {\n                rows = null;\n            }\n            if (inputShape[3] != null && inputShape[3] >= 0) {\n                cols = inputShape[3] + this.padding[1][0] + this.padding[1][1];\n            }\n            else {\n                cols = null;\n            }\n            return [inputShape[0], inputShape[1], rows, cols];\n        }\n        else {\n            if (inputShape[1] != null && inputShape[1] >= 0) {\n                rows = inputShape[1] + this.padding[0][0] + this.padding[0][1];\n            }\n            else {\n                rows = null;\n            }\n            if (inputShape[2] != null && inputShape[2] >= 0) {\n                cols = inputShape[2] + this.padding[1][0] + this.padding[1][1];\n            }\n            else {\n                cols = null;\n            }\n            return [inputShape[0], rows, cols, inputShape[3]];\n        }\n    }\n    call(inputs, kwargs) {\n        return tidy(() => spatial2dPadding(getExactlyOneTensor(inputs), this.padding, this.dataFormat));\n    }\n    getConfig() {\n        const config = {\n            padding: this.padding,\n            dataFormat: this.dataFormat,\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\n/** @nocollapse */\nZeroPadding2D.className = 'ZeroPadding2D';\nserialization.registerClass(ZeroPadding2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkZGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvcGFkZGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsNkVBQTZFO0FBQzdFLDRFQUE0RTtBQUU1RSxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQVUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFZLE1BQU0sb0JBQW9CLENBQUM7QUFDL0QsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUdyQyxPQUFPLEVBQUMsa0JBQWtCLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RTs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FBQyxDQUFTLEVBQUUsT0FBMEI7SUFDbkUsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ2YsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNoQixNQUFNLElBQUksVUFBVSxDQUNoQixpRUFBaUU7Z0JBQ2pFLEdBQUcsQ0FBQyxDQUFDLElBQUksWUFBWSxDQUFDLENBQUM7U0FDNUI7UUFFRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQ2xCO1FBQ0QsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUN4QixNQUFNLElBQUksVUFBVSxDQUNoQixpRUFBaUU7Z0JBQ2pFLGdDQUFnQyxPQUFPLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQztTQUM5RDtRQUVELE1B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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuRDtJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUNQLEdBQUcsRUFBRSxDQUFDLGdCQUFnQixDQUNsQixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxNQUFNLEdBQTZCO1lBQ3ZDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7U0FDNUIsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDOztBQXJHRCxrQkFBa0I7QUFDWCx1QkFBUyxHQUFHLGVBQWUsQ0FBQztBQXNHckMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogUGFkZGluZyBMYXllcnMuXG4gKi9cblxuLy8gUG9ydGluZyBOb3RlOiBJbiBQeXRob24gS2VyYXMsIHRoZSBwYWRkaW5nIGxheWVycyBhcmUgaW4gY29udm9sdXRpb25hbC5weSxcbi8vICAgYnV0IHdlIGRlY2lkZWQgdG8gcHV0IHRoZW0gaW4gYSBzZXBhcmF0ZSBmaWxlIChwYWRkaW5nLnRzKSBmb3IgY2xhcml0eS5cblxuaW1wb3J0ICogYXMgdGZjIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3NlcmlhbGl6YXRpb24sIFRlbnNvciwgdGlkeX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtpbWFnZURhdGFGb3JtYXR9IGZyb20gJy4uL2JhY2tlbmQvY29tbW9uJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzfSBmcm9tICcuLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHtWYWx1ZUVycm9yfSBmcm9tICcuLi9lcnJvcnMnO1xuaW1wb3J0IHtEYXRhRm9ybWF0LCBTaGFwZX0gZnJvbSAnLi4va2VyYXNfZm9ybWF0L2NvbW1vbic7XG5pbXBvcnQge0t3YXJnc30gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcblxuLyoqXG4gKiBQYWRzIHRoZSBtaWRkbGUgZGltZW5zaW9uIG9mIGEgM0QgdGVuc29yLlxuICpcbiAqIEBwYXJhbSB4IElucHV0IGB0Zi5UZW5zb3JgIHRvIGJlIHBhZGRlZC5cbiAqIEBwYXJhbSBwYWRkaW5nIGBBcnJheWAgb2YgMiBpbnRlZ2VycywgaG93IG1hbnkgemVyb3MgdG8gYWRkIGF0IHRoZSBzdGFydCBhbmRcbiAqICAgZW5kIG9mIHRoZSBtaWRkbGUgZGltZW5zaW9uIChpLmUuLCBkaW1lbnNpb24gMSkuXG4gKiBAcmV0dXJuIEEgcGFkZGVkIDNEIGB0Zi5UZW5zb3JgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdGVtcG9yYWxQYWRkaW5nKHg6IFRlbnNvciwgcGFkZGluZz86IFtudW1iZXIsIG51bWJlcl0pOiBUZW5zb3Ige1xuICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgaWYgKHgucmFuayAhPT0gMykge1xuICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgYHRlbXBvcmFsUGFkZGluZyBleHBlY3RzIGlucHV0IHRlbnNvciB0byBiZSAzLUQsIGJ1dCByZWNlaXZlZCBhIGAgK1xuICAgICAgICAgIGAke3gucmFua30tRCB0ZW5zb3IuYCk7XG4gICAgfVxuXG4gICAgaWYgKHBhZGRpbmcgPT0gbnVsbCkge1xuICAgICAgcGFkZGluZyA9IFsxLCAxXTtcbiAgICB9XG4gICAgaWYgKHBhZGRpbmcubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgdGVtcG9yYWxQYWRkaW5nIGV4cGVjdHMgaW5wdXQgcGFkZGluZyBwYXR0ZXJuIHRvIGJlIGEgbGVuZ3RoLTIgYCArXG4gICAgICAgICAgYGFycmF5LCBidXQgcmVjZWl2ZWQgYSBsZW5ndGgtJHtwYWRkaW5nLmxlbmd0aH0gYXJyYXkuYCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGF0dGVybjogQXJyYXk8W251bWJlciwgbnVtYmVyXT4gPSBbWzAsIDBdLCBwYWRkaW5nLCBbMCwgMF1dO1xuICAgIHJldHVybiB0ZmMucGFkKHgsIHBhdHRlcm4pO1xuICB9KTtcbn1cblxuLyoqXG4gKiBQYWRzIHRoZSAybmQgYW5kIDNyZCBkaW1lbnNpb25zIG9mIGEgNEQgdGVuc29yLlxuICpcbiAqIEBwYXJhbSB4IElucHV0IGB0Zi5UZW5zb3JgIHRvIGJlIHBhZGRlZC5cbiAqIEBwYXJhbSBwYWRkaW5nIGBBcnJheWAgb2YgdHdvIGBBcnJheWBzLCBlYWNoIG9mIHdoaWNoIGlzIGFuIGBBcnJheWAgb2YgdHdvXG4gKiAgIGludGVnZXJzLiBUaGUgYW1vdW50IG9mIHBhZGRpbmcgYXQgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIHRoZSAybmQgYW5kIDNyZFxuICogICBkaW1lbnNpb25zLCByZXNwZWN0aXZlbHkuXG4gKiBAcGFyYW0gZGF0YUZvcm1hdCAnY2hhbm5lbHNMYXN0JyAoZGVmYXVsdCkgb3IgJ2NoYW5uZWxzRmlyc3QnLlxuICogQHJldHVybiBQYWRkZWQgNEQgYHRmLlRlbnNvcmAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGF0aWFsMmRQYWRkaW5nKFxuICAgIHg6IFRlbnNvciwgcGFkZGluZz86IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXSxcbiAgICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCk6IFRlbnNvciB7XG4gIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICBpZiAoeC5yYW5rICE9PSA0KSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgdGVtcG9yYWxQYWRkaW5nIGV4cGVjdHMgaW5wdXQgdGVuc29yIHRvIGJlIDQtRCwgYnV0IHJlY2VpdmVkIGEgYCArXG4gICAgICAgICAgYCR7eC5yYW5rfS1EIHRlbnNvci5gKTtcbiAgICB9XG5cbiAgICBpZiAocGFkZGluZyA9PSBudWxsKSB7XG4gICAgICBwYWRkaW5nID0gW1sxLCAxXSwgWzEsIDFdXTtcbiAgICB9XG4gICAgaWYgKHBhZGRpbmcubGVuZ3RoICE9PSAyIHx8IHBhZGRpbmdbMF0ubGVuZ3RoICE9PSAyIHx8XG4gICAgICAgIHBhZGRpbmdbMV0ubGVuZ3RoICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAnc3BhdGlhbDJkUGFkZGluZyBleHBlY3RzIGBwYWRkaW5nYCB0byBiZSBhbiBBcnJheSBvZiB0d28gQXJyYXlzLCAnICtcbiAgICAgICAgICAnZWFjaCBvZiB3aGljaCBpcyBhbiBBcnJheSBvZiB0d28gaW50ZWdlcnMuJyk7XG4gICAgfVxuXG4gICAgaWYgKGRhdGFGb3JtYXQgPT0gbnVsbCkge1xuICAgICAgZGF0YUZvcm1hdCA9IGltYWdlRGF0YUZvcm1hdCgpO1xuICAgIH1cbiAgICBpZiAoZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzTGFzdCcgJiYgZGF0YUZvcm1hdCAhPT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVW5rbm93biBkYXRhIGZvcm1hdDogJHtkYXRhRm9ybWF0fS4gYCArXG4gICAgICAgICAgYFN1cHBvcnRlZCBkYXRhIGZvcm1hdHMgYXJlICdjaGFubmVsc0xhc3QnIGFuZCAnY2hhbm5lbHNGaXJzdC5gKTtcbiAgICB9XG5cbiAgICBsZXQgcGF0dGVybjogQXJyYXk8W251bWJlciwgbnVtYmVyXT47XG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgcGF0dGVybiA9IFtbMCwgMF0sIFswLCAwXSwgcGFkZGluZ1swXSwgcGFkZGluZ1sxXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIHBhdHRlcm4gPSBbWzAsIDBdLCBwYWRkaW5nWzBdLCBwYWRkaW5nWzFdLCBbMCwgMF1dO1xuICAgIH1cblxuICAgIHJldHVybiB0ZmMucGFkKHgsIHBhdHRlcm4pO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFplcm9QYWRkaW5nMkRMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogSW50ZWdlciwgb3IgYEFycmF5YCBvZiAyIGludGVnZXJzLCBvciBgQXJyYXlgIG9mIDIgYEFycmF5YHMsIGVhY2ggb2ZcbiAgICogd2hpY2ggaXMgYW4gYEFycmF5YCBvZiAyIGludGVnZXJzLlxuICAgKiAtIElmIGludGVnZXIsIHRoZSBzYW1lIHN5bW1ldHJpYyBwYWRkaW5nIGlzIGFwcGxpZWQgdG8gd2lkdGggYW5kIGhlaWdodC5cbiAgICogLSBJZiBgQXJyYXlgIG9mIDIgaW50ZWdlcnMsIGludGVycHJldGVkIGFzIHR3byBkaWZmZXJlbnQgc3ltbWV0cmljIHZhbHVlc1xuICAgKiAgIGZvciBoZWlnaHQgYW5kIHdpZHRoOlxuICAgKiAgIGBbc3ltbWV0cmljSGVpZ2h0UGFkLCBzeW1tZXRyaWNXaWR0aFBhZF1gLlxuICAgKiAtIElmIGBBcnJheWAgb2YgMiBgQXJyYXlgcywgaW50ZXJwcmV0ZWQgYXM6XG4gICAqICAgYFtbdG9wUGFkLCBib3R0b21QYWRdLCBbbGVmdFBhZCwgcmlnaHRQYWRdXWAuXG4gICAqL1xuICBwYWRkaW5nPzogbnVtYmVyfFtudW1iZXIsIG51bWJlcl18W1tudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1dO1xuXG4gIC8qKlxuICAgKiBPbmUgb2YgYCdjaGFubmVsc0xhc3QnYCAoZGVmYXVsdCkgYW5kIGAnY2hhbm5lbHNGaXJzdCdgLlxuICAgKlxuICAgKiBUaGUgb3JkZXJpbmcgb2YgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGlucHV0cy5cbiAgICogYGNoYW5uZWxzTGFzdGAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdYCB3aGlsZSBgY2hhbm5lbHNGaXJzdGBcbiAgICogY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogYFtiYXRjaCwgY2hhbm5lbHMsIGhlaWdodCwgd2lkdGhdYC5cbiAgICovXG4gIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0O1xufVxuXG5leHBvcnQgY2xhc3MgWmVyb1BhZGRpbmcyRCBleHRlbmRzIExheWVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnWmVyb1BhZGRpbmcyRCc7XG4gIHJlYWRvbmx5IGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQ7XG4gIHJlYWRvbmx5IHBhZGRpbmc6IFtbbnVtYmVyLCBudW1iZXJdLCBbbnVtYmVyLCBudW1iZXJdXTtcblxuICBjb25zdHJ1Y3RvcihhcmdzPzogWmVyb1BhZGRpbmcyRExheWVyQXJncykge1xuICAgIGlmIChhcmdzID09IG51bGwpIHtcbiAgICAgIGFyZ3MgPSB7fTtcbiAgICB9XG4gICAgc3VwZXIoYXJncyk7XG5cbiAgICB0aGlzLmRhdGFGb3JtYXQgPVxuICAgICAgICBhcmdzLmRhdGFGb3JtYXQgPT0gbnVsbCA/IGltYWdlRGF0YUZvcm1hdCgpIDogYXJncy5kYXRhRm9ybWF0O1xuICAgIC8vIFRPRE8oY2Fpcyk6IE1heWJlIHJlZmFjdG9yIHRoZSBmb2xsb3dpbmcgbG9naWMgc3Vycm91bmRpbmcgYHBhZGRpbmdgXG4gICAgLy8gICBpbnRvIGEgaGVscGVyIG1ldGhvZC5cbiAgICBpZiAoYXJncy5wYWRkaW5nID09IG51bGwpIHtcbiAgICAgIHRoaXMucGFkZGluZyA9IFtbMSwgMV0sIFsxLCAxXV07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgYXJncy5wYWRkaW5nID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5wYWRkaW5nID1cbiAgICAgICAgICBbW2FyZ3MucGFkZGluZywgYXJncy5wYWRkaW5nXSwgW2FyZ3MucGFkZGluZywgYXJncy5wYWRkaW5nXV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGFyZ3MucGFkZGluZyA9IGFyZ3MucGFkZGluZztcbiAgICAgIGlmIChhcmdzLnBhZGRpbmcubGVuZ3RoICE9PSAyKSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYFplcm9QYWRkaW5nMkQgZXhwZWN0cyBwYWRkaW5nIHRvIGJlIGEgbGVuZ3RoLTIgYXJyYXksIGJ1dCBgICtcbiAgICAgICAgICAgIGByZWNlaXZlZCBhIGxlbmd0aC0ke2FyZ3MucGFkZGluZy5sZW5ndGh9IGFycmF5LmApO1xuICAgICAgfVxuXG4gICAgICBsZXQgaGVpZ2h0UGFkZGluZzogW251bWJlciwgbnVtYmVyXTtcbiAgICAgIGxldCB3aWR0aFBhZGRpbmc6IFtudW1iZXIsIG51bWJlcl07XG4gICAgICBpZiAodHlwZW9mIGFyZ3MucGFkZGluZ1swXSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgaGVpZ2h0UGFkZGluZyA9IFthcmdzLnBhZGRpbmdbMF0sIGFyZ3MucGFkZGluZ1swXV07XG4gICAgICAgIHdpZHRoUGFkZGluZyA9IFthcmdzLnBhZGRpbmdbMV0gYXMgbnVtYmVyLCBhcmdzLnBhZGRpbmdbMV0gYXMgbnVtYmVyXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFyZ3MucGFkZGluZyA9IGFyZ3MucGFkZGluZyBhcyBbW251bWJlciwgbnVtYmVyXSwgW251bWJlciwgbnVtYmVyXV07XG5cbiAgICAgICAgaWYgKGFyZ3MucGFkZGluZ1swXS5sZW5ndGggIT09IDIpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICAgYFplcm9QYWRkaW5nMkQgZXhwZWN0cyBoZWlnaHQgcGFkZGluZyB0byBiZSBhIGxlbmd0aC0yIGFycmF5LCBgICtcbiAgICAgICAgICAgICAgYGJ1dCByZWNlaXZlZCBhIGxlbmd0aC0ke2FyZ3MucGFkZGluZ1swXS5sZW5ndGh9IGFycmF5LmApO1xuICAgICAgICB9XG4gICAgICAgIGhlaWdodFBhZGRpbmcgPSBhcmdzLnBhZGRpbmdbMF0gYXMgW251bWJlciwgbnVtYmVyXTtcblxuICAgICAgICBpZiAoYXJncy5wYWRkaW5nWzFdLmxlbmd0aCAhPT0gMikge1xuICAgICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgICBgWmVyb1BhZGRpbmcyRCBleHBlY3RzIHdpZHRoIHBhZGRpbmcgdG8gYmUgYSBsZW5ndGgtMiBhcnJheSwgYCArXG4gICAgICAgICAgICAgIGBidXQgcmVjZWl2ZWQgYSBsZW5ndGgtJHthcmdzLnBhZGRpbmdbMV0ubGVuZ3RofSBhcnJheS5gKTtcbiAgICAgICAgfVxuICAgICAgICB3aWR0aFBhZGRpbmcgPSBhcmdzLnBhZGRpbmdbMV0gYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGFkZGluZyA9IFtoZWlnaHRQYWRkaW5nLCB3aWR0aFBhZGRpbmddO1xuICAgIH1cbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA0fSldO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuXG4gICAgbGV0IHJvd3M6IG51bWJlcjtcbiAgICBsZXQgY29sczogbnVtYmVyO1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0Jykge1xuICAgICAgaWYgKGlucHV0U2hhcGVbMl0gIT0gbnVsbCAmJiBpbnB1dFNoYXBlWzJdID49IDApIHtcbiAgICAgICAgcm93cyA9IGlucHV0U2hhcGVbMl0gKyB0aGlzLnBhZGRpbmdbMF1bMF0gKyB0aGlzLnBhZGRpbmdbMF1bMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByb3dzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChpbnB1dFNoYXBlWzNdICE9IG51bGwgJiYgaW5wdXRTaGFwZVszXSA+PSAwKSB7XG4gICAgICAgIGNvbHMgPSBpbnB1dFNoYXBlWzNdICsgdGhpcy5wYWRkaW5nWzFdWzBdICsgdGhpcy5wYWRkaW5nWzFdWzFdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29scyA9IG51bGw7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIGlucHV0U2hhcGVbMV0sIHJvd3MsIGNvbHNdO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoaW5wdXRTaGFwZVsxXSAhPSBudWxsICYmIGlucHV0U2hhcGVbMV0gPj0gMCkge1xuICAgICAgICByb3dzID0gaW5wdXRTaGFwZVsxXSArIHRoaXMucGFkZGluZ1swXVswXSArIHRoaXMucGFkZGluZ1swXVsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJvd3MgPSBudWxsO1xuICAgICAgfVxuICAgICAgaWYgKGlucHV0U2hhcGVbMl0gIT0gbnVsbCAmJiBpbnB1dFNoYXBlWzJdID49IDApIHtcbiAgICAgICAgY29scyA9IGlucHV0U2hhcGVbMl0gKyB0aGlzLnBhZGRpbmdbMV1bMF0gKyB0aGlzLnBhZGRpbmdbMV1bMV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb2xzID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgcm93cywgY29scywgaW5wdXRTaGFwZVszXV07XG4gICAgfVxuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KFxuICAgICAgICAoKSA9PiBzcGF0aWFsMmRQYWRkaW5nKFxuICAgICAgICAgICAgZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLCB0aGlzLnBhZGRpbmcsIHRoaXMuZGF0YUZvcm1hdCkpO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICBwYWRkaW5nOiB0aGlzLnBhZGRpbmcsXG4gICAgICBkYXRhRm9ybWF0OiB0aGlzLmRhdGFGb3JtYXQsXG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhaZXJvUGFkZGluZzJEKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * TensorFlow.js Layers: Pooling Layers.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport { imageDataFormat } from '../backend/common';\nimport * as K from '../backend/tfjs_backend';\nimport { checkDataFormat, checkPaddingMode, checkPoolMode } from '../common';\nimport { InputSpec } from '../engine/topology';\nimport { Layer } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { convOutputLength } from '../utils/conv_utils';\nimport { assertPositiveInteger } from '../utils/generic_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nimport { preprocessConv2DInput, preprocessConv3DInput } from './convolutional';\n/**\n * 2D pooling.\n * @param x\n * @param poolSize\n * @param stridesdes strides. Defaults to [1, 1].\n * @param padding padding. Defaults to 'valid'.\n * @param dataFormat data format. Defaults to 'channelsLast'.\n * @param poolMode Mode of pooling. Defaults to 'max'.\n * @returns Result of the 2D pooling.\n */\nexport function pool2d(x, poolSize, strides, padding, dataFormat, poolMode) {\n    return tidy(() => {\n        checkDataFormat(dataFormat);\n        checkPoolMode(poolMode);\n        checkPaddingMode(padding);\n        if (strides == null) {\n            strides = [1, 1];\n        }\n        if (padding == null) {\n            padding = 'valid';\n        }\n        if (dataFormat == null) {\n            dataFormat = imageDataFormat();\n        }\n        if (poolMode == null) {\n            poolMode = 'max';\n        }\n        // TODO(cais): Remove the preprocessing step once deeplearn.js supports\n        // dataFormat as an input argument.\n        x = preprocessConv2DInput(x, dataFormat); // x is NHWC after preprocessing.\n        let y;\n        const paddingString = (padding === 'same') ? 'same' : 'valid';\n        if (poolMode === 'max') {\n            // TODO(cais): Rank check?\n            y = tfc.maxPool(x, poolSize, strides, paddingString);\n        }\n        else { // 'avg'\n            // TODO(cais): Check the dtype and rank of x and give clear error message\n            //   if those are incorrect.\n            y = tfc.avgPool(\n            // TODO(cais): Rank check?\n            x, poolSize, strides, paddingString);\n        }\n        if (dataFormat === 'channelsFirst') {\n            y = tfc.transpose(y, [0, 3, 1, 2]); // NHWC -> NCHW.\n        }\n        return y;\n    });\n}\n/**\n * 3D pooling.\n * @param x\n * @param poolSize. Default to [1, 1, 1].\n * @param strides strides. Defaults to [1, 1, 1].\n * @param padding padding. Defaults to 'valid'.\n * @param dataFormat data format. Defaults to 'channelsLast'.\n * @param poolMode Mode of pooling. Defaults to 'max'.\n * @returns Result of the 3D pooling.\n */\nexport function pool3d(x, poolSize, strides, padding, dataFormat, poolMode) {\n    return tidy(() => {\n        checkDataFormat(dataFormat);\n        checkPoolMode(poolMode);\n        checkPaddingMode(padding);\n        if (strides == null) {\n            strides = [1, 1, 1];\n        }\n        if (padding == null) {\n            padding = 'valid';\n        }\n        if (dataFormat == null) {\n            dataFormat = imageDataFormat();\n        }\n        if (poolMode == null) {\n            poolMode = 'max';\n        }\n        // x is NDHWC after preprocessing.\n        x = preprocessConv3DInput(x, dataFormat);\n        let y;\n        const paddingString = (padding === 'same') ? 'same' : 'valid';\n        if (poolMode === 'max') {\n            y = tfc.maxPool3d(x, poolSize, strides, paddingString);\n        }\n        else { // 'avg'\n            y = tfc.avgPool3d(x, poolSize, strides, paddingString);\n        }\n        if (dataFormat === 'channelsFirst') {\n            y = tfc.transpose(y, [0, 4, 1, 2, 3]); // NDHWC -> NCDHW.\n        }\n        return y;\n    });\n}\n/**\n * Abstract class for different pooling 1D layers.\n */\nexport class Pooling1D extends Layer {\n    /**\n     *\n     * @param args Parameters for the Pooling layer.\n     *\n     * config.poolSize defaults to 2.\n     */\n    constructor(args) {\n        if (args.poolSize == null) {\n            args.poolSize = 2;\n        }\n        super(args);\n        if (typeof args.poolSize === 'number') {\n            this.poolSize = [args.poolSize];\n        }\n        else if (Array.isArray(args.poolSize) &&\n            args.poolSize.length === 1 &&\n            typeof args.poolSize[0] === 'number') {\n            this.poolSize = args.poolSize;\n        }\n        else {\n            throw new ValueError(`poolSize for 1D convolutional layer must be a number or an ` +\n                `Array of a single number, but received ` +\n                `${JSON.stringify(args.poolSize)}`);\n        }\n        assertPositiveInteger(this.poolSize, 'poolSize');\n        if (args.strides == null) {\n            this.strides = this.poolSize;\n        }\n        else {\n            if (typeof args.strides === 'number') {\n                this.strides = [args.strides];\n            }\n            else if (Array.isArray(args.strides) &&\n                args.strides.length === 1 &&\n                typeof args.strides[0] === 'number') {\n                this.strides = args.strides;\n            }\n            else {\n                throw new ValueError(`strides for 1D convolutional layer must be a number or an ` +\n                    `Array of a single number, but received ` +\n                    `${JSON.stringify(args.strides)}`);\n            }\n        }\n        assertPositiveInteger(this.strides, 'strides');\n        this.padding = args.padding == null ? 'valid' : args.padding;\n        checkPaddingMode(this.padding);\n        this.inputSpec = [new InputSpec({ ndim: 3 })];\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const length = convOutputLength(inputShape[1], this.poolSize[0], this.padding, this.strides[0]);\n        return [inputShape[0], length, inputShape[2]];\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            // Add dummy last dimension.\n            inputs = K.expandDims(getExactlyOneTensor(inputs), 2);\n            const output = this.poolingFunction(getExactlyOneTensor(inputs), [this.poolSize[0], 1], [this.strides[0], 1], this.padding, 'channelsLast');\n            // Remove dummy last dimension.\n            return tfc.squeeze(output, [2]);\n        });\n    }\n    getConfig() {\n        const config = {\n            poolSize: this.poolSize,\n            padding: this.padding,\n            strides: this.strides,\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\nexport class MaxPooling1D extends Pooling1D {\n    constructor(args) {\n        super(args);\n    }\n    poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n        checkDataFormat(dataFormat);\n        checkPaddingMode(padding);\n        return pool2d(inputs, poolSize, strides, padding, dataFormat, 'max');\n    }\n}\n/** @nocollapse */\nMaxPooling1D.className = 'MaxPooling1D';\nserialization.registerClass(MaxPooling1D);\nexport class AveragePooling1D extends Pooling1D {\n    constructor(args) {\n        super(args);\n    }\n    poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n        checkDataFormat(dataFormat);\n        checkPaddingMode(padding);\n        return pool2d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n    }\n}\n/** @nocollapse */\nAveragePooling1D.className = 'AveragePooling1D';\nserialization.registerClass(AveragePooling1D);\n/**\n * Abstract class for different pooling 2D layers.\n */\nexport class Pooling2D extends Layer {\n    constructor(args) {\n        if (args.poolSize == null) {\n            args.poolSize = [2, 2];\n        }\n        super(args);\n        this.poolSize = Array.isArray(args.poolSize) ?\n            args.poolSize :\n            [args.poolSize, args.poolSize];\n        if (args.strides == null) {\n            this.strides = this.poolSize;\n        }\n        else if (Array.isArray(args.strides)) {\n            if (args.strides.length !== 2) {\n                throw new ValueError(`If the strides property of a 2D pooling layer is an Array, ` +\n                    `it is expected to have a length of 2, but received length ` +\n                    `${args.strides.length}.`);\n            }\n            this.strides = args.strides;\n        }\n        else {\n            // `config.strides` is a number.\n            this.strides = [args.strides, args.strides];\n        }\n        assertPositiveInteger(this.poolSize, 'poolSize');\n        assertPositiveInteger(this.strides, 'strides');\n        this.padding = args.padding == null ? 'valid' : args.padding;\n        this.dataFormat =\n            args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n        checkDataFormat(this.dataFormat);\n        checkPaddingMode(this.padding);\n        this.inputSpec = [new InputSpec({ ndim: 4 })];\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        let rows = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n        let cols = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n        rows =\n            convOutputLength(rows, this.poolSize[0], this.padding, this.strides[0]);\n        cols =\n            convOutputLength(cols, this.poolSize[1], this.padding, this.strides[1]);\n        if (this.dataFormat === 'channelsFirst') {\n            return [inputShape[0], inputShape[1], rows, cols];\n        }\n        else {\n            return [inputShape[0], rows, cols, inputShape[3]];\n        }\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            return this.poolingFunction(getExactlyOneTensor(inputs), this.poolSize, this.strides, this.padding, this.dataFormat);\n        });\n    }\n    getConfig() {\n        const config = {\n            poolSize: this.poolSize,\n            padding: this.padding,\n            strides: this.strides,\n            dataFormat: this.dataFormat\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\nexport class MaxPooling2D extends Pooling2D {\n    constructor(args) {\n        super(args);\n    }\n    poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n        checkDataFormat(dataFormat);\n        checkPaddingMode(padding);\n        return pool2d(inputs, poolSize, strides, padding, dataFormat, 'max');\n    }\n}\n/** @nocollapse */\nMaxPooling2D.className = 'MaxPooling2D';\nserialization.registerClass(MaxPooling2D);\nexport class AveragePooling2D extends Pooling2D {\n    constructor(args) {\n        super(args);\n    }\n    poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n        checkDataFormat(dataFormat);\n        checkPaddingMode(padding);\n        return pool2d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n    }\n}\n/** @nocollapse */\nAveragePooling2D.className = 'AveragePooling2D';\nserialization.registerClass(AveragePooling2D);\n/**\n * Abstract class for different pooling 3D layers.\n */\nexport class Pooling3D extends Layer {\n    constructor(args) {\n        if (args.poolSize == null) {\n            args.poolSize = [2, 2, 2];\n        }\n        super(args);\n        this.poolSize = Array.isArray(args.poolSize) ?\n            args.poolSize :\n            [args.poolSize, args.poolSize, args.poolSize];\n        if (args.strides == null) {\n            this.strides = this.poolSize;\n        }\n        else if (Array.isArray(args.strides)) {\n            if (args.strides.length !== 3) {\n                throw new ValueError(`If the strides property of a 3D pooling layer is an Array, ` +\n                    `it is expected to have a length of 3, but received length ` +\n                    `${args.strides.length}.`);\n            }\n            this.strides = args.strides;\n        }\n        else {\n            // `config.strides` is a number.\n            this.strides = [args.strides, args.strides, args.strides];\n        }\n        assertPositiveInteger(this.poolSize, 'poolSize');\n        assertPositiveInteger(this.strides, 'strides');\n        this.padding = args.padding == null ? 'valid' : args.padding;\n        this.dataFormat =\n            args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n        checkDataFormat(this.dataFormat);\n        checkPaddingMode(this.padding);\n        this.inputSpec = [new InputSpec({ ndim: 5 })];\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        let depths = this.dataFormat === 'channelsFirst' ? inputShape[2] : inputShape[1];\n        let rows = this.dataFormat === 'channelsFirst' ? inputShape[3] : inputShape[2];\n        let cols = this.dataFormat === 'channelsFirst' ? inputShape[4] : inputShape[3];\n        depths = convOutputLength(depths, this.poolSize[0], this.padding, this.strides[0]);\n        rows =\n            convOutputLength(rows, this.poolSize[1], this.padding, this.strides[1]);\n        cols =\n            convOutputLength(cols, this.poolSize[2], this.padding, this.strides[2]);\n        if (this.dataFormat === 'channelsFirst') {\n            return [inputShape[0], inputShape[1], depths, rows, cols];\n        }\n        else {\n            return [inputShape[0], depths, rows, cols, inputShape[4]];\n        }\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            this.invokeCallHook(inputs, kwargs);\n            return this.poolingFunction(getExactlyOneTensor(inputs), this.poolSize, this.strides, this.padding, this.dataFormat);\n        });\n    }\n    getConfig() {\n        const config = {\n            poolSize: this.poolSize,\n            padding: this.padding,\n            strides: this.strides,\n            dataFormat: this.dataFormat\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\nexport class MaxPooling3D extends Pooling3D {\n    constructor(args) {\n        super(args);\n    }\n    poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n        checkDataFormat(dataFormat);\n        checkPaddingMode(padding);\n        return pool3d(inputs, poolSize, strides, padding, dataFormat, 'max');\n    }\n}\n/** @nocollapse */\nMaxPooling3D.className = 'MaxPooling3D';\nserialization.registerClass(MaxPooling3D);\nexport class AveragePooling3D extends Pooling3D {\n    constructor(args) {\n        super(args);\n    }\n    poolingFunction(inputs, poolSize, strides, padding, dataFormat) {\n        checkDataFormat(dataFormat);\n        checkPaddingMode(padding);\n        return pool3d(inputs, poolSize, strides, padding, dataFormat, 'avg');\n    }\n}\n/** @nocollapse */\nAveragePooling3D.className = 'AveragePooling3D';\nserialization.registerClass(AveragePooling3D);\n/**\n * Abstract class for different global pooling 1D layers.\n */\nexport class GlobalPooling1D extends Layer {\n    constructor(args) {\n        super(args);\n        this.inputSpec = [new InputSpec({ ndim: 3 })];\n    }\n    computeOutputShape(inputShape) {\n        return [inputShape[0], inputShape[2]];\n    }\n    call(inputs, kwargs) {\n        throw new NotImplementedError();\n    }\n}\nexport class GlobalAveragePooling1D extends GlobalPooling1D {\n    constructor(args) {\n        super(args || {});\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            const input = getExactlyOneTensor(inputs);\n            return tfc.mean(input, 1);\n        });\n    }\n}\n/** @nocollapse */\nGlobalAveragePooling1D.className = 'GlobalAveragePooling1D';\nserialization.registerClass(GlobalAveragePooling1D);\nexport class GlobalMaxPooling1D extends GlobalPooling1D {\n    constructor(args) {\n        super(args || {});\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            const input = getExactlyOneTensor(inputs);\n            return tfc.max(input, 1);\n        });\n    }\n}\n/** @nocollapse */\nGlobalMaxPooling1D.className = 'GlobalMaxPooling1D';\nserialization.registerClass(GlobalMaxPooling1D);\n/**\n * Abstract class for different global pooling 2D layers.\n */\nexport class GlobalPooling2D extends Layer {\n    constructor(args) {\n        super(args);\n        this.dataFormat =\n            args.dataFormat == null ? 'channelsLast' : args.dataFormat;\n        checkDataFormat(this.dataFormat);\n        this.inputSpec = [new InputSpec({ ndim: 4 })];\n    }\n    computeOutputShape(inputShape) {\n        inputShape = inputShape;\n        if (this.dataFormat === 'channelsLast') {\n            return [inputShape[0], inputShape[3]];\n        }\n        else {\n            return [inputShape[0], inputShape[1]];\n        }\n    }\n    call(inputs, kwargs) {\n        throw new NotImplementedError();\n    }\n    getConfig() {\n        const config = { dataFormat: this.dataFormat };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n}\nexport class GlobalAveragePooling2D extends GlobalPooling2D {\n    call(inputs, kwargs) {\n        return tidy(() => {\n            const input = getExactlyOneTensor(inputs);\n            if (this.dataFormat === 'channelsLast') {\n                return tfc.mean(input, [1, 2]);\n            }\n            else {\n                return tfc.mean(input, [2, 3]);\n            }\n        });\n    }\n}\n/** @nocollapse */\nGlobalAveragePooling2D.className = 'GlobalAveragePooling2D';\nserialization.registerClass(GlobalAveragePooling2D);\nexport class GlobalMaxPooling2D extends GlobalPooling2D {\n    call(inputs, kwargs) {\n        return tidy(() => {\n            const input = getExactlyOneTensor(inputs);\n            if (this.dataFormat === 'channelsLast') {\n                return tfc.max(input, [1, 2]);\n            }\n            else {\n                return tfc.max(input, [2, 3]);\n            }\n        });\n    }\n}\n/** @nocollapse */\nGlobalMaxPooling2D.className = 'GlobalMaxPooling2D';\nserialization.registerClass(GlobalMaxPooling2D);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbGluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvcG9vbGluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7R0FRRztBQUVIOztHQUVHO0FBRUgsT0FBTyxLQUFLLEdBQUcsTUFBTSx1QkFBdUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsYUFBYSxFQUF3QyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVoRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbEQsT0FBTyxLQUFLLENBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsZUFBZSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUMzRSxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFDLEtBQUssRUFBWSxNQUFNLG9CQUFvQixDQUFDO0FBQ3BELE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFHMUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDckQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFN0UsT0FBTyxFQUFDLHFCQUFxQixFQUFFLHFCQUFxQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0U7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsQ0FBUyxFQUFFLFFBQTBCLEVBQUUsT0FBMEIsRUFDakUsT0FBcUIsRUFBRSxVQUF1QixFQUM5QyxRQUFtQjtJQUNyQixPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDZixlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3hCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixPQUFPLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDbEI7UUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUNuQjtRQUNELElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUN0QixVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDcEIsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUNsQjtRQUVELHVFQUF1RTtRQUN2RSxtQ0FBbUM7UUFDbkMsQ0FBQyxHQUFHLHFCQUFxQixDQUFDLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQyxDQUFFLGlDQUFpQztRQUM1RSxJQUFJLENBQVMsQ0FBQztRQUNkLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBTyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUM5RCxJQUFJLFFBQVEsS0FBSyxLQUFLLEVBQUU7WUFDdEIsMEJBQTBCO1lBQzFCLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQWEsRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQ2xFO2FBQU0sRUFBRyxRQUFRO1lBQ2hCLHlFQUF5RTtZQUN6RSw0QkFBNEI7WUFDNUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPO1lBQ1gsMEJBQTBCO1lBQzFCLENBQXdCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUNqRTtRQUNELElBQUksVUFBVSxLQUFLLGVBQWUsRUFBRTtZQUNsQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsZ0JBQWdCO1NBQ3REO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDWCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRDs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLFVBQVUsTUFBTSxDQUNsQixDQUFXLEVBQUUsUUFBa0MsRUFDL0MsT0FBa0MsRUFBRSxPQUFxQixFQUN6RCxVQUF1QixFQUFFLFFBQW1CO0lBQzlDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtRQUNmLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDeEIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ25CLE9BQU8sR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDckI7UUFDRCxJQUFJLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUNuQjtRQUNELElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUN0QixVQUFVLEdBQUcsZUFBZSxFQUFFLENBQUM7U0FDaEM7UUFDRCxJQUFJLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDcEIsUUFBUSxHQUFHLEtBQUssQ0FBQztTQUNsQjtRQUVELGtDQUFrQztRQUNsQyxDQUFDLEdBQUcscUJBQXFCLENBQUMsQ0FBVyxFQUFFLFVBQVUsQ0FBYSxDQUFDO1FBQy9ELElBQUksQ0FBUyxDQUFDO1FBQ2QsTUFBTSxhQUFhLEdBQUcsQ0FBQyxPQUFPLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBQzlELElBQUksUUFBUSxLQUFLLEtBQUssRUFBRTtZQUN0QixDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN4RDthQUFNLEVBQUcsUUFBUTtZQUNoQixDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQztTQUN4RDtRQUNELElBQUksVUFBVSxLQUFLLGVBQWUsRUFBRTtZQUNsQyxDQUFDLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFFLGtCQUFrQjtTQUMzRDtRQUNELE9BQU8sQ0FBQyxDQUFDO0lBQ1gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDO0FBaUJEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixTQUFVLFNBQVEsS0FBSztJQUszQzs7Ozs7T0FLRztJQUNILFlBQVksSUFBd0I7UUFDbEMsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUNuQjtRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNaLElBQUksT0FBTyxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ2pDO2FBQU0sSUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQXFCLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDeEMsT0FBUSxJQUFJLENBQUMsUUFBcUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDdEQsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQy9CO2FBQU07WUFDTCxNQUFNLElBQUksVUFBVSxDQUNoQiw2REFBNkQ7Z0JBQzdELHlDQUF5QztnQkFDekMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDekM7UUFDRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQzlCO2FBQU07WUFDTCxJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7Z0JBQ3BDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7YUFDL0I7aUJBQU0sSUFDSCxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7Z0JBQzFCLElBQUksQ0FBQyxPQUFvQixDQUFDLE1BQU0sS0FBSyxDQUFDO2dCQUN2QyxPQUFRLElBQUksQ0FBQyxPQUFvQixDQUFDLENBQUMsQ0FBQyxLQUFLLFFBQVEsRUFBRTtnQkFDckQsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO2FBQzdCO2lCQUFNO2dCQUNMLE1BQU0sSUFBSSxVQUFVLENBQ2hCLDREQUE0RDtvQkFDNUQseUNBQXlDO29CQUN6QyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQzthQUN4QztTQUNGO1FBQ0QscUJBQXFCLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUUvQyxJQUFJLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUM7UUFDN0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQXlCO1FBQzFDLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QyxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FDM0IsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEUsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQU1ELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEMsNEJBQTRCO1lBQzVCLE1BQU0sR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQy9CLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDbEQsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDeEQsK0JBQStCO1lBQy9CLE9BQU8sR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLE1BQU0sR0FBRztZQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3RCLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBR3pDLFlBQVksSUFBd0I7UUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVTLGVBQWUsQ0FDckIsTUFBYyxFQUFFLFFBQTBCLEVBQUUsT0FBeUIsRUFDckUsT0FBb0IsRUFBRSxVQUFzQjtRQUM5QyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDOztBQVpELGtCQUFrQjtBQUNYLHNCQUFTLEdBQUcsY0FBYyxDQUFDO0FBYXBDLGFBQWEsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7QUFFMUMsTUFBTSxPQUFPLGdCQUFpQixTQUFRLFNBQVM7SUFHN0MsWUFBWSxJQUF3QjtRQUNsQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRVMsZUFBZSxDQUNyQixNQUFjLEVBQUUsUUFBMEIsRUFBRSxPQUF5QixFQUNyRSxPQUFvQixFQUFFLFVBQXNCO1FBQzlDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7O0FBWkQsa0JBQWtCO0FBQ1gsMEJBQVMsR0FBRyxrQkFBa0IsQ0FBQztBQWF4QyxhQUFhLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUE0QjlDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixTQUFVLFNBQVEsS0FBSztJQU0zQyxZQUFZLElBQXdCO1FBQ2xDLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLEVBQUU7WUFDekIsSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUN4QjtRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDZixDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ25DLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLEVBQUU7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDO1NBQzlCO2FBQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsRUFBRTtZQUN0QyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDN0IsTUFBTSxJQUFJLFVBQVUsQ0FDaEIsNkRBQTZEO29CQUM3RCw0REFBNEQ7b0JBQzVELEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO2FBQ2hDO1lBQ0QsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO1NBQzdCO2FBQU07WUFDTCxnQ0FBZ0M7WUFDaEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzdDO1FBQ0QscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVTtZQUNYLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0QsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsVUFBeUI7UUFDMUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksSUFBSSxHQUNKLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLElBQUksR0FDSixJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSTtZQUNBLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUk7WUFDQSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ25EO0lBQ0gsQ0FBQztJQU1ELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2YsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsZUFBZSxDQUN2QixtQkFBbUIsQ0FBQyxNQUFNLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQ3hELElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JDLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLE1BQU0sR0FBRztZQUNiLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUTtZQUN2QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtTQUM1QixDQUFDO1FBQ0YsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBQ3JDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2xDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxZQUFhLFNBQVEsU0FBUztJQUd6QyxZQUFZLElBQXdCO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFUyxlQUFlLENBQ3JCLE1BQWMsRUFBRSxRQUEwQixFQUFFLE9BQXlCLEVBQ3JFLE9BQW9CLEVBQUUsVUFBc0I7UUFDOUMsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDdkUsQ0FBQzs7QUFaRCxrQkFBa0I7QUFDWCxzQkFBUyxHQUFHLGNBQWMsQ0FBQztBQWFwQyxhQUFhLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0FBRTFDLE1BQU0sT0FBTyxnQkFBaUIsU0FBUSxTQUFTO0lBRzdDLFlBQVksSUFBd0I7UUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVTLGVBQWUsQ0FDckIsTUFBYyxFQUFFLFFBQTBCLEVBQUUsT0FBeUIsRUFDckUsT0FBb0IsRUFBRSxVQUFzQjtRQUM5QyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDNUIsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDMUIsT0FBTyxNQUFNLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN2RSxDQUFDOztBQVpELGtCQUFrQjtBQUNYLDBCQUFTLEdBQUcsa0JBQWtCLENBQUM7QUFheEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBNEI5Qzs7R0FFRztBQUNILE1BQU0sT0FBZ0IsU0FBVSxTQUFRLEtBQUs7SUFNM0MsWUFBWSxJQUF3QjtRQUNsQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1NBQzNCO1FBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLFFBQVEsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNmLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQztTQUM5QjthQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQzdCLE1BQU0sSUFBSSxVQUFVLENBQ2hCLDZEQUE2RDtvQkFDN0QsNERBQTREO29CQUM1RCxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQzthQUNoQztZQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQztTQUM3QjthQUFNO1lBQ0wsZ0NBQWdDO1lBQ2hDLElBQUksQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQzNEO1FBQ0QscUJBQXFCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRCxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztRQUM3RCxJQUFJLENBQUMsVUFBVTtZQUNYLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0QsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFFL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLElBQUksU0FBUyxDQUFDLEVBQUMsSUFBSSxFQUFFLENBQUMsRUFBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsVUFBeUI7UUFDMUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLElBQUksTUFBTSxHQUNOLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN4RSxJQUFJLElBQUksR0FDSixJQUFJLENBQUMsVUFBVSxLQUFLLGVBQWUsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDeEUsSUFBSSxJQUFJLEdBQ0osSUFBSSxDQUFDLFVBQVUsS0FBSyxlQUFlLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sR0FBRyxnQkFBZ0IsQ0FDckIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDN0QsSUFBSTtZQUNBLGdCQUFnQixDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzVFLElBQUk7WUFDQSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM1RSxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssZUFBZSxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7U0FDM0Q7YUFBTTtZQUNMLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0Q7SUFDSCxDQUFDO0lBT0QsSUFBSSxDQUFDLE1BQXVCLEVBQUUsTUFBYztRQUMxQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwQyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQ3ZCLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFDeEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDckMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUFHO1lBQ2IsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRO1lBQ3ZCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTztZQUNyQixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87WUFDckIsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVO1NBQzVCLENBQUM7UUFDRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLFlBQWEsU0FBUSxTQUFTO0lBR3pDLFlBQVksSUFBd0I7UUFDbEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2QsQ0FBQztJQUVTLGVBQWUsQ0FDckIsTUFBYyxFQUFFLFFBQWtDLEVBQ2xELE9BQWlDLEVBQUUsT0FBb0IsRUFDdkQsVUFBc0I7UUFDeEIsZUFBZSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVCLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLE9BQU8sTUFBTSxDQUNULE1BQWtCLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pFLENBQUM7O0FBZEQsa0JBQWtCO0FBQ1gsc0JBQVMsR0FBRyxjQUFjLENBQUM7QUFlcEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUUxQyxNQUFNLE9BQU8sZ0JBQWlCLFNBQVEsU0FBUztJQUc3QyxZQUFZLElBQXdCO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNkLENBQUM7SUFFUyxlQUFlLENBQ3JCLE1BQWMsRUFBRSxRQUFrQyxFQUNsRCxPQUFpQyxFQUFFLE9BQW9CLEVBQ3ZELFVBQXNCO1FBQ3hCLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixPQUFPLE1BQU0sQ0FDVCxNQUFrQixFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RSxDQUFDOztBQWRELGtCQUFrQjtBQUNYLDBCQUFTLEdBQUcsa0JBQWtCLENBQUM7QUFleEMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRTlDOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixlQUFnQixTQUFRLEtBQUs7SUFDakQsWUFBWSxJQUFlO1FBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNaLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELGtCQUFrQixDQUFDLFVBQWlCO1FBQ2xDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEMsQ0FBQztJQUVELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsTUFBTSxJQUFJLG1CQUFtQixFQUFFLENBQUM7SUFDbEMsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFHekQsWUFBWSxJQUFnQjtRQUMxQixLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDNUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQVhELGtCQUFrQjtBQUNYLGdDQUFTLEdBQUcsd0JBQXdCLENBQUM7QUFZOUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRXBELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxlQUFlO0lBR3JELFlBQVksSUFBZTtRQUN6QixLQUFLLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3BCLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sS0FBSyxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQzFDLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQVhELGtCQUFrQjtBQUNYLDRCQUFTLEdBQUcsb0JBQW9CLENBQUM7QUFZMUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0FBY2hEOztHQUVHO0FBQ0gsTUFBTSxPQUFnQixlQUFnQixTQUFRLEtBQUs7SUFFakQsWUFBWSxJQUE4QjtRQUN4QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsVUFBVTtZQUNYLElBQUksQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDL0QsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUF5QjtRQUMxQyxVQUFVLEdBQUcsVUFBbUIsQ0FBQztRQUNqQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssY0FBYyxFQUFFO1lBQ3RDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkM7YUFBTTtZQUNMLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdkM7SUFDSCxDQUFDO0lBRUQsSUFBSSxDQUFDLE1BQXVCLEVBQUUsTUFBYztRQUMxQyxNQUFNLElBQUksbUJBQW1CLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUFHLEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxVQUFVLEVBQUMsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFJekQsSUFBSSxDQUFDLE1BQXVCLEVBQUUsTUFBYztRQUMxQyxPQUFPLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDZixNQUFNLEtBQUssR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUMxQyxJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssY0FBYyxFQUFFO2dCQUN0QyxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDaEM7aUJBQU07Z0JBQ0wsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2hDO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDOztBQVpELGtCQUFrQjtBQUNYLGdDQUFTLEdBQUcsd0JBQXdCLENBQUM7QUFhOUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0FBRXBELE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxlQUFlO0lBSXJELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2YsTUFBTSxLQUFLLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDMUMsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLGNBQWMsRUFBRTtnQkFDdEMsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQy9CO2lCQUFNO2dCQUNMLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzs7QUFaRCxrQkFBa0I7QUFDWCw0QkFBUyxHQUFHLG9CQUFvQixDQUFDO0FBYTFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTENcbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGVcbiAqIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBvciBhdFxuICogaHR0cHM6Ly9vcGVuc291cmNlLm9yZy9saWNlbnNlcy9NSVQuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGVuc29yRmxvdy5qcyBMYXllcnM6IFBvb2xpbmcgTGF5ZXJzLlxuICovXG5cbmltcG9ydCAqIGFzIHRmYyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtzZXJpYWxpemF0aW9uLCBUZW5zb3IsIFRlbnNvcjNELCBUZW5zb3I0RCwgVGVuc29yNUQsIHRpZHl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7aW1hZ2VEYXRhRm9ybWF0fSBmcm9tICcuLi9iYWNrZW5kL2NvbW1vbic7XG5pbXBvcnQgKiBhcyBLIGZyb20gJy4uL2JhY2tlbmQvdGZqc19iYWNrZW5kJztcbmltcG9ydCB7Y2hlY2tEYXRhRm9ybWF0LCBjaGVja1BhZGRpbmdNb2RlLCBjaGVja1Bvb2xNb2RlfSBmcm9tICcuLi9jb21tb24nO1xuaW1wb3J0IHtJbnB1dFNwZWN9IGZyb20gJy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQge0xheWVyLCBMYXllckFyZ3N9IGZyb20gJy4uL2VuZ2luZS90b3BvbG9neSc7XG5pbXBvcnQge05vdEltcGxlbWVudGVkRXJyb3IsIFZhbHVlRXJyb3J9IGZyb20gJy4uL2Vycm9ycyc7XG5pbXBvcnQge0RhdGFGb3JtYXQsIFBhZGRpbmdNb2RlLCBQb29sTW9kZSwgU2hhcGV9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7Y29udk91dHB1dExlbmd0aH0gZnJvbSAnLi4vdXRpbHMvY29udl91dGlscyc7XG5pbXBvcnQge2Fzc2VydFBvc2l0aXZlSW50ZWdlcn0gZnJvbSAnLi4vdXRpbHMvZ2VuZXJpY191dGlscyc7XG5pbXBvcnQge2dldEV4YWN0bHlPbmVTaGFwZSwgZ2V0RXhhY3RseU9uZVRlbnNvcn0gZnJvbSAnLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuXG5pbXBvcnQge3ByZXByb2Nlc3NDb252MkRJbnB1dCwgcHJlcHJvY2Vzc0NvbnYzRElucHV0fSBmcm9tICcuL2NvbnZvbHV0aW9uYWwnO1xuXG4vKipcbiAqIDJEIHBvb2xpbmcuXG4gKiBAcGFyYW0geFxuICogQHBhcmFtIHBvb2xTaXplXG4gKiBAcGFyYW0gc3RyaWRlc2RlcyBzdHJpZGVzLiBEZWZhdWx0cyB0byBbMSwgMV0uXG4gKiBAcGFyYW0gcGFkZGluZyBwYWRkaW5nLiBEZWZhdWx0cyB0byAndmFsaWQnLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgZGF0YSBmb3JtYXQuIERlZmF1bHRzIHRvICdjaGFubmVsc0xhc3QnLlxuICogQHBhcmFtIHBvb2xNb2RlIE1vZGUgb2YgcG9vbGluZy4gRGVmYXVsdHMgdG8gJ21heCcuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIDJEIHBvb2xpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb29sMmQoXG4gICAgeDogVGVuc29yLCBwb29sU2l6ZTogW251bWJlciwgbnVtYmVyXSwgc3RyaWRlcz86IFtudW1iZXIsIG51bWJlcl0sXG4gICAgcGFkZGluZz86IFBhZGRpbmdNb2RlLCBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdCxcbiAgICBwb29sTW9kZT86IFBvb2xNb2RlKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1Bvb2xNb2RlKHBvb2xNb2RlKTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICAgIHN0cmlkZXMgPSBbMSwgMV07XG4gICAgfVxuICAgIGlmIChwYWRkaW5nID09IG51bGwpIHtcbiAgICAgIHBhZGRpbmcgPSAndmFsaWQnO1xuICAgIH1cbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGlmIChwb29sTW9kZSA9PSBudWxsKSB7XG4gICAgICBwb29sTW9kZSA9ICdtYXgnO1xuICAgIH1cblxuICAgIC8vIFRPRE8oY2Fpcyk6IFJlbW92ZSB0aGUgcHJlcHJvY2Vzc2luZyBzdGVwIG9uY2UgZGVlcGxlYXJuLmpzIHN1cHBvcnRzXG4gICAgLy8gZGF0YUZvcm1hdCBhcyBhbiBpbnB1dCBhcmd1bWVudC5cbiAgICB4ID0gcHJlcHJvY2Vzc0NvbnYyRElucHV0KHgsIGRhdGFGb3JtYXQpOyAgLy8geCBpcyBOSFdDIGFmdGVyIHByZXByb2Nlc3NpbmcuXG4gICAgbGV0IHk6IFRlbnNvcjtcbiAgICBjb25zdCBwYWRkaW5nU3RyaW5nID0gKHBhZGRpbmcgPT09ICdzYW1lJykgPyAnc2FtZScgOiAndmFsaWQnO1xuICAgIGlmIChwb29sTW9kZSA9PT0gJ21heCcpIHtcbiAgICAgIC8vIFRPRE8oY2Fpcyk6IFJhbmsgY2hlY2s/XG4gICAgICB5ID0gdGZjLm1heFBvb2woeCBhcyBUZW5zb3I0RCwgcG9vbFNpemUsIHN0cmlkZXMsIHBhZGRpbmdTdHJpbmcpO1xuICAgIH0gZWxzZSB7ICAvLyAnYXZnJ1xuICAgICAgLy8gVE9ETyhjYWlzKTogQ2hlY2sgdGhlIGR0eXBlIGFuZCByYW5rIG9mIHggYW5kIGdpdmUgY2xlYXIgZXJyb3IgbWVzc2FnZVxuICAgICAgLy8gICBpZiB0aG9zZSBhcmUgaW5jb3JyZWN0LlxuICAgICAgeSA9IHRmYy5hdmdQb29sKFxuICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IFJhbmsgY2hlY2s/XG4gICAgICAgICAgeCBhcyBUZW5zb3IzRCB8IFRlbnNvcjRELCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZ1N0cmluZyk7XG4gICAgfVxuICAgIGlmIChkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIHkgPSB0ZmMudHJhbnNwb3NlKHksIFswLCAzLCAxLCAyXSk7ICAvLyBOSFdDIC0+IE5DSFcuXG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuLyoqXG4gKiAzRCBwb29saW5nLlxuICogQHBhcmFtIHhcbiAqIEBwYXJhbSBwb29sU2l6ZS4gRGVmYXVsdCB0byBbMSwgMSwgMV0uXG4gKiBAcGFyYW0gc3RyaWRlcyBzdHJpZGVzLiBEZWZhdWx0cyB0byBbMSwgMSwgMV0uXG4gKiBAcGFyYW0gcGFkZGluZyBwYWRkaW5nLiBEZWZhdWx0cyB0byAndmFsaWQnLlxuICogQHBhcmFtIGRhdGFGb3JtYXQgZGF0YSBmb3JtYXQuIERlZmF1bHRzIHRvICdjaGFubmVsc0xhc3QnLlxuICogQHBhcmFtIHBvb2xNb2RlIE1vZGUgb2YgcG9vbGluZy4gRGVmYXVsdHMgdG8gJ21heCcuXG4gKiBAcmV0dXJucyBSZXN1bHQgb2YgdGhlIDNEIHBvb2xpbmcuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwb29sM2QoXG4gICAgeDogVGVuc29yNUQsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgc3RyaWRlcz86IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgcGFkZGluZz86IFBhZGRpbmdNb2RlLFxuICAgIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0LCBwb29sTW9kZT86IFBvb2xNb2RlKTogVGVuc29yIHtcbiAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1Bvb2xNb2RlKHBvb2xNb2RlKTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIGlmIChzdHJpZGVzID09IG51bGwpIHtcbiAgICAgIHN0cmlkZXMgPSBbMSwgMSwgMV07XG4gICAgfVxuICAgIGlmIChwYWRkaW5nID09IG51bGwpIHtcbiAgICAgIHBhZGRpbmcgPSAndmFsaWQnO1xuICAgIH1cbiAgICBpZiAoZGF0YUZvcm1hdCA9PSBudWxsKSB7XG4gICAgICBkYXRhRm9ybWF0ID0gaW1hZ2VEYXRhRm9ybWF0KCk7XG4gICAgfVxuICAgIGlmIChwb29sTW9kZSA9PSBudWxsKSB7XG4gICAgICBwb29sTW9kZSA9ICdtYXgnO1xuICAgIH1cblxuICAgIC8vIHggaXMgTkRIV0MgYWZ0ZXIgcHJlcHJvY2Vzc2luZy5cbiAgICB4ID0gcHJlcHJvY2Vzc0NvbnYzRElucHV0KHggYXMgVGVuc29yLCBkYXRhRm9ybWF0KSBhcyBUZW5zb3I1RDtcbiAgICBsZXQgeTogVGVuc29yO1xuICAgIGNvbnN0IHBhZGRpbmdTdHJpbmcgPSAocGFkZGluZyA9PT0gJ3NhbWUnKSA/ICdzYW1lJyA6ICd2YWxpZCc7XG4gICAgaWYgKHBvb2xNb2RlID09PSAnbWF4Jykge1xuICAgICAgeSA9IHRmYy5tYXhQb29sM2QoeCwgcG9vbFNpemUsIHN0cmlkZXMsIHBhZGRpbmdTdHJpbmcpO1xuICAgIH0gZWxzZSB7ICAvLyAnYXZnJ1xuICAgICAgeSA9IHRmYy5hdmdQb29sM2QoeCwgcG9vbFNpemUsIHN0cmlkZXMsIHBhZGRpbmdTdHJpbmcpO1xuICAgIH1cbiAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICB5ID0gdGZjLnRyYW5zcG9zZSh5LCBbMCwgNCwgMSwgMiwgM10pOyAgLy8gTkRIV0MgLT4gTkNESFcuXG4gICAgfVxuICAgIHJldHVybiB5O1xuICB9KTtcbn1cblxuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIFBvb2xpbmcxRExheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBTaXplIG9mIHRoZSB3aW5kb3cgdG8gcG9vbCBvdmVyLCBzaG91bGQgYmUgYW4gaW50ZWdlci5cbiAgICovXG4gIHBvb2xTaXplPzogbnVtYmVyfFtudW1iZXJdO1xuICAvKipcbiAgICogUGVyaW9kIGF0IHdoaWNoIHRvIHNhbXBsZSB0aGUgcG9vbGVkIHZhbHVlcy5cbiAgICpcbiAgICogSWYgYG51bGxgLCBkZWZhdWx0cyB0byBgcG9vbFNpemVgLlxuICAgKi9cbiAgc3RyaWRlcz86IG51bWJlcnxbbnVtYmVyXTtcbiAgLyoqIEhvdyB0byBmaWxsIGluIGRhdGEgdGhhdCdzIG5vdCBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHBvb2xTaXplLiAqL1xuICBwYWRkaW5nPzogUGFkZGluZ01vZGU7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgZm9yIGRpZmZlcmVudCBwb29saW5nIDFEIGxheWVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvb2xpbmcxRCBleHRlbmRzIExheWVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvb2xTaXplOiBbbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmlkZXM6IFtudW1iZXJdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFkZGluZzogUGFkZGluZ01vZGU7XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBhcmdzIFBhcmFtZXRlcnMgZm9yIHRoZSBQb29saW5nIGxheWVyLlxuICAgKlxuICAgKiBjb25maWcucG9vbFNpemUgZGVmYXVsdHMgdG8gMi5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFBvb2xpbmcxRExheWVyQXJncykge1xuICAgIGlmIChhcmdzLnBvb2xTaXplID09IG51bGwpIHtcbiAgICAgIGFyZ3MucG9vbFNpemUgPSAyO1xuICAgIH1cbiAgICBzdXBlcihhcmdzKTtcbiAgICBpZiAodHlwZW9mIGFyZ3MucG9vbFNpemUgPT09ICdudW1iZXInKSB7XG4gICAgICB0aGlzLnBvb2xTaXplID0gW2FyZ3MucG9vbFNpemVdO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkoYXJncy5wb29sU2l6ZSkgJiZcbiAgICAgICAgKGFyZ3MucG9vbFNpemUgYXMgbnVtYmVyW10pLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICB0eXBlb2YgKGFyZ3MucG9vbFNpemUgYXMgbnVtYmVyW10pWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgdGhpcy5wb29sU2l6ZSA9IGFyZ3MucG9vbFNpemU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgIGBwb29sU2l6ZSBmb3IgMUQgY29udm9sdXRpb25hbCBsYXllciBtdXN0IGJlIGEgbnVtYmVyIG9yIGFuIGAgK1xuICAgICAgICAgIGBBcnJheSBvZiBhIHNpbmdsZSBudW1iZXIsIGJ1dCByZWNlaXZlZCBgICtcbiAgICAgICAgICBgJHtKU09OLnN0cmluZ2lmeShhcmdzLnBvb2xTaXplKX1gKTtcbiAgICB9XG4gICAgYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHRoaXMucG9vbFNpemUsICdwb29sU2l6ZScpO1xuICAgIGlmIChhcmdzLnN0cmlkZXMgPT0gbnVsbCkge1xuICAgICAgdGhpcy5zdHJpZGVzID0gdGhpcy5wb29sU2l6ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzLnN0cmlkZXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuc3RyaWRlcyA9IFthcmdzLnN0cmlkZXNdO1xuICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICBBcnJheS5pc0FycmF5KGFyZ3Muc3RyaWRlcykgJiZcbiAgICAgICAgICAoYXJncy5zdHJpZGVzIGFzIG51bWJlcltdKS5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgICB0eXBlb2YgKGFyZ3Muc3RyaWRlcyBhcyBudW1iZXJbXSlbMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgIHRoaXMuc3RyaWRlcyA9IGFyZ3Muc3RyaWRlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBWYWx1ZUVycm9yKFxuICAgICAgICAgICAgYHN0cmlkZXMgZm9yIDFEIGNvbnZvbHV0aW9uYWwgbGF5ZXIgbXVzdCBiZSBhIG51bWJlciBvciBhbiBgICtcbiAgICAgICAgICAgIGBBcnJheSBvZiBhIHNpbmdsZSBudW1iZXIsIGJ1dCByZWNlaXZlZCBgICtcbiAgICAgICAgICAgIGAke0pTT04uc3RyaW5naWZ5KGFyZ3Muc3RyaWRlcyl9YCk7XG4gICAgICB9XG4gICAgfVxuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnN0cmlkZXMsICdzdHJpZGVzJyk7XG5cbiAgICB0aGlzLnBhZGRpbmcgPSBhcmdzLnBhZGRpbmcgPT0gbnVsbCA/ICd2YWxpZCcgOiBhcmdzLnBhZGRpbmc7XG4gICAgY2hlY2tQYWRkaW5nTW9kZSh0aGlzLnBhZGRpbmcpO1xuICAgIHRoaXMuaW5wdXRTcGVjID0gW25ldyBJbnB1dFNwZWMoe25kaW06IDN9KV07XG4gIH1cblxuICBjb21wdXRlT3V0cHV0U2hhcGUoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IFNoYXBlfFNoYXBlW10ge1xuICAgIGlucHV0U2hhcGUgPSBnZXRFeGFjdGx5T25lU2hhcGUoaW5wdXRTaGFwZSk7XG4gICAgY29uc3QgbGVuZ3RoID0gY29udk91dHB1dExlbmd0aChcbiAgICAgICAgaW5wdXRTaGFwZVsxXSwgdGhpcy5wb29sU2l6ZVswXSwgdGhpcy5wYWRkaW5nLCB0aGlzLnN0cmlkZXNbMF0pO1xuICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgbGVuZ3RoLCBpbnB1dFNoYXBlWzJdXTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlcl0sIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICBwYWRkaW5nOiBQYWRkaW5nTW9kZSwgZGF0YUZvcm1hdDogRGF0YUZvcm1hdCk6IFRlbnNvcjtcblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICAvLyBBZGQgZHVtbXkgbGFzdCBkaW1lbnNpb24uXG4gICAgICBpbnB1dHMgPSBLLmV4cGFuZERpbXMoZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLCAyKTtcbiAgICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgICAgIGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKSwgW3RoaXMucG9vbFNpemVbMF0sIDFdLFxuICAgICAgICAgIFt0aGlzLnN0cmlkZXNbMF0sIDFdLCB0aGlzLnBhZGRpbmcsICdjaGFubmVsc0xhc3QnKTtcbiAgICAgIC8vIFJlbW92ZSBkdW1teSBsYXN0IGRpbWVuc2lvbi5cbiAgICAgIHJldHVybiB0ZmMuc3F1ZWV6ZShvdXRwdXQsIFsyXSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBwb29sU2l6ZTogdGhpcy5wb29sU2l6ZSxcbiAgICAgIHBhZGRpbmc6IHRoaXMucGFkZGluZyxcbiAgICAgIHN0cmlkZXM6IHRoaXMuc3RyaWRlcyxcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4UG9vbGluZzFEIGV4dGVuZHMgUG9vbGluZzFEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWF4UG9vbGluZzFEJztcbiAgY29uc3RydWN0b3IoYXJnczogUG9vbGluZzFETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgaW5wdXRzOiBUZW5zb3IsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkZGluZzogUGFkZGluZ01vZGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIHJldHVybiBwb29sMmQoaW5wdXRzLCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZywgZGF0YUZvcm1hdCwgJ21heCcpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWF4UG9vbGluZzFEKTtcblxuZXhwb3J0IGNsYXNzIEF2ZXJhZ2VQb29saW5nMUQgZXh0ZW5kcyBQb29saW5nMUQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdBdmVyYWdlUG9vbGluZzFEJztcbiAgY29uc3RydWN0b3IoYXJnczogUG9vbGluZzFETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgaW5wdXRzOiBUZW5zb3IsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkZGluZzogUGFkZGluZ01vZGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIHJldHVybiBwb29sMmQoaW5wdXRzLCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZywgZGF0YUZvcm1hdCwgJ2F2ZycpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQXZlcmFnZVBvb2xpbmcxRCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBQb29saW5nMkRMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmFjdG9ycyBieSB3aGljaCB0byBkb3duc2NhbGUgaW4gZWFjaCBkaW1lbnNpb24gW3ZlcnRpY2FsLCBob3Jpem9udGFsXS5cbiAgICogRXhwZWN0cyBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIDIgaW50ZWdlcnMuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBgWzIsIDJdYCB3aWxsIGhhbHZlIHRoZSBpbnB1dCBpbiBib3RoIHNwYXRpYWwgZGltZW5zaW9ucy5cbiAgICogSWYgb25seSBvbmUgaW50ZWdlciBpcyBzcGVjaWZpZWQsIHRoZSBzYW1lIHdpbmRvdyBsZW5ndGhcbiAgICogd2lsbCBiZSB1c2VkIGZvciBib3RoIGRpbWVuc2lvbnMuXG4gICAqL1xuICBwb29sU2l6ZT86IG51bWJlcnxbbnVtYmVyLCBudW1iZXJdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgc3RyaWRlIGluIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBwb29saW5nIHdpbmRvdy4gRXhwZWN0c1xuICAgKiBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIDIgaW50ZWdlcnMuIEludGVnZXIsIHR1cGxlIG9mIDIgaW50ZWdlcnMsIG9yXG4gICAqIE5vbmUuXG4gICAqXG4gICAqIElmIGBudWxsYCwgZGVmYXVsdHMgdG8gYHBvb2xTaXplYC5cbiAgICovXG4gIHN0cmlkZXM/OiBudW1iZXJ8W251bWJlciwgbnVtYmVyXTtcblxuICAvKiogVGhlIHBhZGRpbmcgdHlwZSB0byB1c2UgZm9yIHRoZSBwb29saW5nIGxheWVyLiAqL1xuICBwYWRkaW5nPzogUGFkZGluZ01vZGU7XG4gIC8qKiBUaGUgZGF0YSBmb3JtYXQgdG8gdXNlIGZvciB0aGUgcG9vbGluZyBsYXllci4gKi9cbiAgZGF0YUZvcm1hdD86IERhdGFGb3JtYXQ7XG59XG5cbi8qKlxuICogQWJzdHJhY3QgY2xhc3MgZm9yIGRpZmZlcmVudCBwb29saW5nIDJEIGxheWVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFBvb2xpbmcyRCBleHRlbmRzIExheWVyIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyaWRlczogW251bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZGRpbmc6IFBhZGRpbmdNb2RlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBQb29saW5nMkRMYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncy5wb29sU2l6ZSA9PSBudWxsKSB7XG4gICAgICBhcmdzLnBvb2xTaXplID0gWzIsIDJdO1xuICAgIH1cbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnBvb2xTaXplID0gQXJyYXkuaXNBcnJheShhcmdzLnBvb2xTaXplKSA/XG4gICAgICAgIGFyZ3MucG9vbFNpemUgOlxuICAgICAgICBbYXJncy5wb29sU2l6ZSwgYXJncy5wb29sU2l6ZV07XG4gICAgaWYgKGFyZ3Muc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0cmlkZXMgPSB0aGlzLnBvb2xTaXplO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmdzLnN0cmlkZXMpKSB7XG4gICAgICBpZiAoYXJncy5zdHJpZGVzLmxlbmd0aCAhPT0gMikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBJZiB0aGUgc3RyaWRlcyBwcm9wZXJ0eSBvZiBhIDJEIHBvb2xpbmcgbGF5ZXIgaXMgYW4gQXJyYXksIGAgK1xuICAgICAgICAgICAgYGl0IGlzIGV4cGVjdGVkIHRvIGhhdmUgYSBsZW5ndGggb2YgMiwgYnV0IHJlY2VpdmVkIGxlbmd0aCBgICtcbiAgICAgICAgICAgIGAke2FyZ3Muc3RyaWRlcy5sZW5ndGh9LmApO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHJpZGVzID0gYXJncy5zdHJpZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgY29uZmlnLnN0cmlkZXNgIGlzIGEgbnVtYmVyLlxuICAgICAgdGhpcy5zdHJpZGVzID0gW2FyZ3Muc3RyaWRlcywgYXJncy5zdHJpZGVzXTtcbiAgICB9XG4gICAgYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHRoaXMucG9vbFNpemUsICdwb29sU2l6ZScpO1xuICAgIGFzc2VydFBvc2l0aXZlSW50ZWdlcih0aGlzLnN0cmlkZXMsICdzdHJpZGVzJyk7XG4gICAgdGhpcy5wYWRkaW5nID0gYXJncy5wYWRkaW5nID09IG51bGwgPyAndmFsaWQnIDogYXJncy5wYWRkaW5nO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9XG4gICAgICAgIGFyZ3MuZGF0YUZvcm1hdCA9PSBudWxsID8gJ2NoYW5uZWxzTGFzdCcgOiBhcmdzLmRhdGFGb3JtYXQ7XG4gICAgY2hlY2tEYXRhRm9ybWF0KHRoaXMuZGF0YUZvcm1hdCk7XG4gICAgY2hlY2tQYWRkaW5nTW9kZSh0aGlzLnBhZGRpbmcpO1xuXG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbbmV3IElucHV0U3BlYyh7bmRpbTogNH0pXTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBsZXQgcm93cyA9XG4gICAgICAgIHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnID8gaW5wdXRTaGFwZVsyXSA6IGlucHV0U2hhcGVbMV07XG4gICAgbGV0IGNvbHMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IGlucHV0U2hhcGVbM10gOiBpbnB1dFNoYXBlWzJdO1xuICAgIHJvd3MgPVxuICAgICAgICBjb252T3V0cHV0TGVuZ3RoKHJvd3MsIHRoaXMucG9vbFNpemVbMF0sIHRoaXMucGFkZGluZywgdGhpcy5zdHJpZGVzWzBdKTtcbiAgICBjb2xzID1cbiAgICAgICAgY29udk91dHB1dExlbmd0aChjb2xzLCB0aGlzLnBvb2xTaXplWzFdLCB0aGlzLnBhZGRpbmcsIHRoaXMuc3RyaWRlc1sxXSk7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnKSB7XG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIGlucHV0U2hhcGVbMV0sIHJvd3MsIGNvbHNdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIHJvd3MsIGNvbHMsIGlucHV0U2hhcGVbM11dO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlcl0sIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICBwYWRkaW5nOiBQYWRkaW5nTW9kZSwgZGF0YUZvcm1hdDogRGF0YUZvcm1hdCk6IFRlbnNvcjtcblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgdGhpcy5pbnZva2VDYWxsSG9vayhpbnB1dHMsIGt3YXJncyk7XG4gICAgICByZXR1cm4gdGhpcy5wb29saW5nRnVuY3Rpb24oXG4gICAgICAgICAgZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpLCB0aGlzLnBvb2xTaXplLCB0aGlzLnN0cmlkZXMsXG4gICAgICAgICAgdGhpcy5wYWRkaW5nLCB0aGlzLmRhdGFGb3JtYXQpO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnID0ge1xuICAgICAgcG9vbFNpemU6IHRoaXMucG9vbFNpemUsXG4gICAgICBwYWRkaW5nOiB0aGlzLnBhZGRpbmcsXG4gICAgICBzdHJpZGVzOiB0aGlzLnN0cmlkZXMsXG4gICAgICBkYXRhRm9ybWF0OiB0aGlzLmRhdGFGb3JtYXRcbiAgICB9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTWF4UG9vbGluZzJEIGV4dGVuZHMgUG9vbGluZzJEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnTWF4UG9vbGluZzJEJztcbiAgY29uc3RydWN0b3IoYXJnczogUG9vbGluZzJETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgaW5wdXRzOiBUZW5zb3IsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkZGluZzogUGFkZGluZ01vZGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIHJldHVybiBwb29sMmQoaW5wdXRzLCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZywgZGF0YUZvcm1hdCwgJ21heCcpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoTWF4UG9vbGluZzJEKTtcblxuZXhwb3J0IGNsYXNzIEF2ZXJhZ2VQb29saW5nMkQgZXh0ZW5kcyBQb29saW5nMkQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdBdmVyYWdlUG9vbGluZzJEJztcbiAgY29uc3RydWN0b3IoYXJnczogUG9vbGluZzJETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcG9vbGluZ0Z1bmN0aW9uKFxuICAgICAgaW5wdXRzOiBUZW5zb3IsIHBvb2xTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgICAgcGFkZGluZzogUGFkZGluZ01vZGUsIGRhdGFGb3JtYXQ6IERhdGFGb3JtYXQpOiBUZW5zb3Ige1xuICAgIGNoZWNrRGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHBhZGRpbmcpO1xuICAgIHJldHVybiBwb29sMmQoaW5wdXRzLCBwb29sU2l6ZSwgc3RyaWRlcywgcGFkZGluZywgZGF0YUZvcm1hdCwgJ2F2ZycpO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoQXZlcmFnZVBvb2xpbmcyRCk7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBQb29saW5nM0RMYXllckFyZ3MgZXh0ZW5kcyBMYXllckFyZ3Mge1xuICAvKipcbiAgICogRmFjdG9ycyBieSB3aGljaCB0byBkb3duc2NhbGUgaW4gZWFjaCBkaW1lbnNpb24gW2RlcHRoLCBoZWlnaHQsIHdpZHRoXS5cbiAgICogRXhwZWN0cyBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIDMgaW50ZWdlcnMuXG4gICAqXG4gICAqIEZvciBleGFtcGxlLCBgWzIsIDIsIDJdYCB3aWxsIGhhbHZlIHRoZSBpbnB1dCBpbiB0aHJlZSBkaW1lbnNpb25zLlxuICAgKiBJZiBvbmx5IG9uZSBpbnRlZ2VyIGlzIHNwZWNpZmllZCwgdGhlIHNhbWUgd2luZG93IGxlbmd0aFxuICAgKiB3aWxsIGJlIHVzZWQgZm9yIGFsbCBkaW1lbnNpb25zLlxuICAgKi9cbiAgcG9vbFNpemU/OiBudW1iZXJ8W251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIC8qKlxuICAgKiBUaGUgc2l6ZSBvZiB0aGUgc3RyaWRlIGluIGVhY2ggZGltZW5zaW9uIG9mIHRoZSBwb29saW5nIHdpbmRvdy4gRXhwZWN0c1xuICAgKiBhbiBpbnRlZ2VyIG9yIGFuIGFycmF5IG9mIDMgaW50ZWdlcnMuIEludGVnZXIsIHR1cGxlIG9mIDMgaW50ZWdlcnMsIG9yXG4gICAqIE5vbmUuXG4gICAqXG4gICAqIElmIGBudWxsYCwgZGVmYXVsdHMgdG8gYHBvb2xTaXplYC5cbiAgICovXG4gIHN0cmlkZXM/OiBudW1iZXJ8W251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gIC8qKiBUaGUgcGFkZGluZyB0eXBlIHRvIHVzZSBmb3IgdGhlIHBvb2xpbmcgbGF5ZXIuICovXG4gIHBhZGRpbmc/OiBQYWRkaW5nTW9kZTtcbiAgLyoqIFRoZSBkYXRhIGZvcm1hdCB0byB1c2UgZm9yIHRoZSBwb29saW5nIGxheWVyLiAqL1xuICBkYXRhRm9ybWF0PzogRGF0YUZvcm1hdDtcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgZGlmZmVyZW50IHBvb2xpbmcgM0QgbGF5ZXJzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgUG9vbGluZzNEIGV4dGVuZHMgTGF5ZXIge1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZGRpbmc6IFBhZGRpbmdNb2RlO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBQb29saW5nM0RMYXllckFyZ3MpIHtcbiAgICBpZiAoYXJncy5wb29sU2l6ZSA9PSBudWxsKSB7XG4gICAgICBhcmdzLnBvb2xTaXplID0gWzIsIDIsIDJdO1xuICAgIH1cbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnBvb2xTaXplID0gQXJyYXkuaXNBcnJheShhcmdzLnBvb2xTaXplKSA/XG4gICAgICAgIGFyZ3MucG9vbFNpemUgOlxuICAgICAgICBbYXJncy5wb29sU2l6ZSwgYXJncy5wb29sU2l6ZSwgYXJncy5wb29sU2l6ZV07XG4gICAgaWYgKGFyZ3Muc3RyaWRlcyA9PSBudWxsKSB7XG4gICAgICB0aGlzLnN0cmlkZXMgPSB0aGlzLnBvb2xTaXplO1xuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShhcmdzLnN0cmlkZXMpKSB7XG4gICAgICBpZiAoYXJncy5zdHJpZGVzLmxlbmd0aCAhPT0gMykge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgIGBJZiB0aGUgc3RyaWRlcyBwcm9wZXJ0eSBvZiBhIDNEIHBvb2xpbmcgbGF5ZXIgaXMgYW4gQXJyYXksIGAgK1xuICAgICAgICAgICAgYGl0IGlzIGV4cGVjdGVkIHRvIGhhdmUgYSBsZW5ndGggb2YgMywgYnV0IHJlY2VpdmVkIGxlbmd0aCBgICtcbiAgICAgICAgICAgIGAke2FyZ3Muc3RyaWRlcy5sZW5ndGh9LmApO1xuICAgICAgfVxuICAgICAgdGhpcy5zdHJpZGVzID0gYXJncy5zdHJpZGVzO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBgY29uZmlnLnN0cmlkZXNgIGlzIGEgbnVtYmVyLlxuICAgICAgdGhpcy5zdHJpZGVzID0gW2FyZ3Muc3RyaWRlcywgYXJncy5zdHJpZGVzLCBhcmdzLnN0cmlkZXNdO1xuICAgIH1cbiAgICBhc3NlcnRQb3NpdGl2ZUludGVnZXIodGhpcy5wb29sU2l6ZSwgJ3Bvb2xTaXplJyk7XG4gICAgYXNzZXJ0UG9zaXRpdmVJbnRlZ2VyKHRoaXMuc3RyaWRlcywgJ3N0cmlkZXMnKTtcbiAgICB0aGlzLnBhZGRpbmcgPSBhcmdzLnBhZGRpbmcgPT0gbnVsbCA/ICd2YWxpZCcgOiBhcmdzLnBhZGRpbmc7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID1cbiAgICAgICAgYXJncy5kYXRhRm9ybWF0ID09IG51bGwgPyAnY2hhbm5lbHNMYXN0JyA6IGFyZ3MuZGF0YUZvcm1hdDtcbiAgICBjaGVja0RhdGFGb3JtYXQodGhpcy5kYXRhRm9ybWF0KTtcbiAgICBjaGVja1BhZGRpbmdNb2RlKHRoaXMucGFkZGluZyk7XG5cbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA1fSldO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gZ2V0RXhhY3RseU9uZVNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGxldCBkZXB0aHMgPVxuICAgICAgICB0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0ZpcnN0JyA/IGlucHV0U2hhcGVbMl0gOiBpbnB1dFNoYXBlWzFdO1xuICAgIGxldCByb3dzID1cbiAgICAgICAgdGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcgPyBpbnB1dFNoYXBlWzNdIDogaW5wdXRTaGFwZVsyXTtcbiAgICBsZXQgY29scyA9XG4gICAgICAgIHRoaXMuZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzRmlyc3QnID8gaW5wdXRTaGFwZVs0XSA6IGlucHV0U2hhcGVbM107XG4gICAgZGVwdGhzID0gY29udk91dHB1dExlbmd0aChcbiAgICAgICAgZGVwdGhzLCB0aGlzLnBvb2xTaXplWzBdLCB0aGlzLnBhZGRpbmcsIHRoaXMuc3RyaWRlc1swXSk7XG4gICAgcm93cyA9XG4gICAgICAgIGNvbnZPdXRwdXRMZW5ndGgocm93cywgdGhpcy5wb29sU2l6ZVsxXSwgdGhpcy5wYWRkaW5nLCB0aGlzLnN0cmlkZXNbMV0pO1xuICAgIGNvbHMgPVxuICAgICAgICBjb252T3V0cHV0TGVuZ3RoKGNvbHMsIHRoaXMucG9vbFNpemVbMl0sIHRoaXMucGFkZGluZywgdGhpcy5zdHJpZGVzWzJdKTtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNGaXJzdCcpIHtcbiAgICAgIHJldHVybiBbaW5wdXRTaGFwZVswXSwgaW5wdXRTaGFwZVsxXSwgZGVwdGhzLCByb3dzLCBjb2xzXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBkZXB0aHMsIHJvd3MsIGNvbHMsIGlucHV0U2hhcGVbNF1dO1xuICAgIH1cbiAgfVxuXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgcGFkZGluZzogUGFkZGluZ01vZGUsXG4gICAgICBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0KTogVGVuc29yO1xuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICB0aGlzLmludm9rZUNhbGxIb29rKGlucHV0cywga3dhcmdzKTtcbiAgICAgIHJldHVybiB0aGlzLnBvb2xpbmdGdW5jdGlvbihcbiAgICAgICAgICBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyksIHRoaXMucG9vbFNpemUsIHRoaXMuc3RyaWRlcyxcbiAgICAgICAgICB0aGlzLnBhZGRpbmcsIHRoaXMuZGF0YUZvcm1hdCk7XG4gICAgfSk7XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWcgPSB7XG4gICAgICBwb29sU2l6ZTogdGhpcy5wb29sU2l6ZSxcbiAgICAgIHBhZGRpbmc6IHRoaXMucGFkZGluZyxcbiAgICAgIHN0cmlkZXM6IHRoaXMuc3RyaWRlcyxcbiAgICAgIGRhdGFGb3JtYXQ6IHRoaXMuZGF0YUZvcm1hdFxuICAgIH07XG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXhQb29saW5nM0QgZXh0ZW5kcyBQb29saW5nM0Qge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdNYXhQb29saW5nM0QnO1xuICBjb25zdHJ1Y3RvcihhcmdzOiBQb29saW5nM0RMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgcGFkZGluZzogUGFkZGluZ01vZGUsXG4gICAgICBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0KTogVGVuc29yIHtcbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY2hlY2tQYWRkaW5nTW9kZShwYWRkaW5nKTtcbiAgICByZXR1cm4gcG9vbDNkKFxuICAgICAgICBpbnB1dHMgYXMgVGVuc29yNUQsIHBvb2xTaXplLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCAnbWF4Jyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhNYXhQb29saW5nM0QpO1xuXG5leHBvcnQgY2xhc3MgQXZlcmFnZVBvb2xpbmczRCBleHRlbmRzIFBvb2xpbmczRCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0F2ZXJhZ2VQb29saW5nM0QnO1xuICBjb25zdHJ1Y3RvcihhcmdzOiBQb29saW5nM0RMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBwb29saW5nRnVuY3Rpb24oXG4gICAgICBpbnB1dHM6IFRlbnNvciwgcG9vbFNpemU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIHN0cmlkZXM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgcGFkZGluZzogUGFkZGluZ01vZGUsXG4gICAgICBkYXRhRm9ybWF0OiBEYXRhRm9ybWF0KTogVGVuc29yIHtcbiAgICBjaGVja0RhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gICAgY2hlY2tQYWRkaW5nTW9kZShwYWRkaW5nKTtcbiAgICByZXR1cm4gcG9vbDNkKFxuICAgICAgICBpbnB1dHMgYXMgVGVuc29yNUQsIHBvb2xTaXplLCBzdHJpZGVzLCBwYWRkaW5nLCBkYXRhRm9ybWF0LCAnYXZnJyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhBdmVyYWdlUG9vbGluZzNEKTtcblxuLyoqXG4gKiBBYnN0cmFjdCBjbGFzcyBmb3IgZGlmZmVyZW50IGdsb2JhbCBwb29saW5nIDFEIGxheWVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEdsb2JhbFBvb2xpbmcxRCBleHRlbmRzIExheWVyIHtcbiAgY29uc3RydWN0b3IoYXJnczogTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbbmV3IElucHV0U3BlYyh7bmRpbTogM30pXTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZSk6IFNoYXBlIHtcbiAgICByZXR1cm4gW2lucHV0U2hhcGVbMF0sIGlucHV0U2hhcGVbMl1dO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEVycm9yKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEdsb2JhbEF2ZXJhZ2VQb29saW5nMUQgZXh0ZW5kcyBHbG9iYWxQb29saW5nMUQge1xuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGNsYXNzTmFtZSA9ICdHbG9iYWxBdmVyYWdlUG9vbGluZzFEJztcbiAgY29uc3RydWN0b3IoYXJncz86IExheWVyQXJncykge1xuICAgIHN1cGVyKGFyZ3MgfHwge30pO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3J8VGVuc29yW10ge1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gZ2V0RXhhY3RseU9uZVRlbnNvcihpbnB1dHMpO1xuICAgICAgcmV0dXJuIHRmYy5tZWFuKGlucHV0LCAxKTtcbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEdsb2JhbEF2ZXJhZ2VQb29saW5nMUQpO1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsTWF4UG9vbGluZzFEIGV4dGVuZHMgR2xvYmFsUG9vbGluZzFEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnR2xvYmFsTWF4UG9vbGluZzFEJztcbiAgY29uc3RydWN0b3IoYXJnczogTGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyB8fCB7fSk7XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICByZXR1cm4gdGZjLm1heChpbnB1dCwgMSk7XG4gICAgfSk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhHbG9iYWxNYXhQb29saW5nMUQpO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgR2xvYmFsUG9vbGluZzJETGF5ZXJBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgLyoqXG4gICAqIE9uZSBvZiBgQ0hBTk5FTF9MQVNUYCAoZGVmYXVsdCkgb3IgYENIQU5ORUxfRklSU1RgLlxuICAgKlxuICAgKiBUaGUgb3JkZXJpbmcgb2YgdGhlIGRpbWVuc2lvbnMgaW4gdGhlIGlucHV0cy4gYENIQU5ORUxfTEFTVGAgY29ycmVzcG9uZHNcbiAgICogdG8gaW5wdXRzIHdpdGggc2hhcGUgYFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbHNdYCB3aGlsZVxuICAgKiBgQ0hBTk5FTF9GSVJTVGAgY29ycmVzcG9uZHMgdG8gaW5wdXRzIHdpdGggc2hhcGVcbiAgICogYFtiYXRjaCwgY2hhbm5lbHMsIGhlaWdodCwgd2lkdGhdYC5cbiAgICovXG4gIGRhdGFGb3JtYXQ/OiBEYXRhRm9ybWF0O1xufVxuXG4vKipcbiAqIEFic3RyYWN0IGNsYXNzIGZvciBkaWZmZXJlbnQgZ2xvYmFsIHBvb2xpbmcgMkQgbGF5ZXJzLlxuICovXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgR2xvYmFsUG9vbGluZzJEIGV4dGVuZHMgTGF5ZXIge1xuICBwcm90ZWN0ZWQgZGF0YUZvcm1hdDogRGF0YUZvcm1hdDtcbiAgY29uc3RydWN0b3IoYXJnczogR2xvYmFsUG9vbGluZzJETGF5ZXJBcmdzKSB7XG4gICAgc3VwZXIoYXJncyk7XG4gICAgdGhpcy5kYXRhRm9ybWF0ID1cbiAgICAgICAgYXJncy5kYXRhRm9ybWF0ID09IG51bGwgPyAnY2hhbm5lbHNMYXN0JyA6IGFyZ3MuZGF0YUZvcm1hdDtcbiAgICBjaGVja0RhdGFGb3JtYXQodGhpcy5kYXRhRm9ybWF0KTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IFtuZXcgSW5wdXRTcGVjKHtuZGltOiA0fSldO1xuICB9XG5cbiAgY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGU6IFNoYXBlfFNoYXBlW10pOiBTaGFwZXxTaGFwZVtdIHtcbiAgICBpbnB1dFNoYXBlID0gaW5wdXRTaGFwZSBhcyBTaGFwZTtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBpbnB1dFNoYXBlWzNdXTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIFtpbnB1dFNoYXBlWzBdLCBpbnB1dFNoYXBlWzFdXTtcbiAgICB9XG4gIH1cblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZyA9IHtkYXRhRm9ybWF0OiB0aGlzLmRhdGFGb3JtYXR9O1xuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgR2xvYmFsQXZlcmFnZVBvb2xpbmcyRCBleHRlbmRzIEdsb2JhbFBvb2xpbmcyRCB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ0dsb2JhbEF2ZXJhZ2VQb29saW5nMkQnO1xuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBpbnB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnKSB7XG4gICAgICAgIHJldHVybiB0ZmMubWVhbihpbnB1dCwgWzEsIDJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZmMubWVhbihpbnB1dCwgWzIsIDNdKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKEdsb2JhbEF2ZXJhZ2VQb29saW5nMkQpO1xuXG5leHBvcnQgY2xhc3MgR2xvYmFsTWF4UG9vbGluZzJEIGV4dGVuZHMgR2xvYmFsUG9vbGluZzJEIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnR2xvYmFsTWF4UG9vbGluZzJEJztcblxuICBjYWxsKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBrd2FyZ3M6IEt3YXJncyk6IFRlbnNvcnxUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgaW5wdXQgPSBnZXRFeGFjdGx5T25lVGVuc29yKGlucHV0cyk7XG4gICAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0Jykge1xuICAgICAgICByZXR1cm4gdGZjLm1heChpbnB1dCwgWzEsIDJdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZmMubWF4KGlucHV0LCBbMiwgM10pO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoR2xvYmFsTWF4UG9vbGluZzJEKTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\n/**\n * Layers that augment the functionality of a base layer.\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { serialization, tidy } from '@tensorflow/tfjs-core';\nimport * as K from '../backend/tfjs_backend';\nimport { nameScope } from '../common';\nimport { InputSpec, Layer, SymbolicTensor } from '../engine/topology';\nimport { NotImplementedError, ValueError } from '../errors';\nimport { VALID_BIDIRECTIONAL_MERGE_MODES } from '../keras_format/common';\nimport * as generic_utils from '../utils/generic_utils';\nimport { getExactlyOneShape, getExactlyOneTensor } from '../utils/types_utils';\nimport { rnn, standardizeArgs } from './recurrent';\nimport { deserialize } from './serialization';\n/**\n * Abstract wrapper base class.\n *\n * Wrappers take another layer and augment it in various ways.\n * Do not use this class as a layer, it is only an abstract base class.\n * Two usable wrappers are the `TimeDistributed` and `Bidirectional` wrappers.\n */\nexport class Wrapper extends Layer {\n    constructor(args) {\n        // Porting Note: In PyKeras, `self.layer` is set prior to the calling\n        //   `super()`. But we can't do that here due to TypeScript's restriction.\n        //   See: https://github.com/Microsoft/TypeScript/issues/8277\n        //   As a result, we have to add checks in `get trainable()` and\n        //   `set trainable()` below in order to prevent using `this.layer` when\n        //   its value is `undefined`. The super constructor does use the getter\n        //   and the setter of `this.layer`.\n        super(args);\n        this.layer = args.layer;\n    }\n    build(inputShape) {\n        this.built = true;\n    }\n    // TODO(cais): Implement activityRegularizer getter.\n    get trainable() {\n        // Porting Note: the check of `this.layer` here is necessary due to the\n        //   way the `constructor` of this class is written (see Porting Note\n        //   above).\n        if (this.layer != null) {\n            return this.layer.trainable;\n        }\n        else {\n            return false;\n        }\n    }\n    set trainable(value) {\n        // Porting Note: the check of `this.layer` here is necessary due to the\n        //   way the `constructor` of this class is written (see Porting Note\n        //   above).\n        if (this.layer != null) {\n            this.layer.trainable = value;\n        }\n    }\n    get trainableWeights() {\n        return this.layer.trainableWeights;\n    }\n    // TODO(cais): Implement setter for trainableWeights.\n    get nonTrainableWeights() {\n        return this.layer.nonTrainableWeights;\n    }\n    // TODO(cais): Implement setter for nonTrainableWeights.\n    get updates() {\n        // tslint:disable-next-line:no-any\n        return this.layer._updates;\n    }\n    // TODO(cais): Implement getUpdatesFor().\n    get losses() {\n        return this.layer.losses;\n    }\n    // TODO(cais): Implement getLossesFor().\n    getWeights() {\n        return this.layer.getWeights();\n    }\n    setWeights(weights) {\n        this.layer.setWeights(weights);\n    }\n    getConfig() {\n        const config = {\n            'layer': {\n                'className': this.layer.getClassName(),\n                'config': this.layer.getConfig(),\n            }\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    setFastWeightInitDuringBuild(value) {\n        super.setFastWeightInitDuringBuild(value);\n        if (this.layer != null) {\n            this.layer.setFastWeightInitDuringBuild(value);\n        }\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config, customObjects = {}) {\n        const layerConfig = config['layer'];\n        const layer = deserialize(layerConfig, customObjects);\n        delete config['layer'];\n        const newConfig = { layer };\n        Object.assign(newConfig, config);\n        return new cls(newConfig);\n    }\n}\nexport class TimeDistributed extends Wrapper {\n    constructor(args) {\n        super(args);\n        this.supportsMasking = true;\n    }\n    build(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        if (inputShape.length < 3) {\n            throw new ValueError(`TimeDistributed layer expects an input shape >= 3D, but received ` +\n                `input shape ${JSON.stringify(inputShape)}`);\n        }\n        this.inputSpec = [{ shape: inputShape }];\n        const childInputShape = [inputShape[0]].concat(inputShape.slice(2));\n        if (!this.layer.built) {\n            this.layer.build(childInputShape);\n            this.layer.built = true;\n        }\n        super.build(inputShape);\n    }\n    computeOutputShape(inputShape) {\n        inputShape = getExactlyOneShape(inputShape);\n        const childInputShape = [inputShape[0]].concat(inputShape.slice(2));\n        const childOutputShape = this.layer.computeOutputShape(childInputShape);\n        const timesteps = inputShape[1];\n        return [childOutputShape[0], timesteps].concat(childOutputShape.slice(1));\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            // TODO(cais): Add 'training' and 'useLearningPhase' to kwargs.\n            inputs = getExactlyOneTensor(inputs);\n            // Porting Note: In tfjs-layers, `inputs` are always concrete tensor\n            // values. Hence the inputs can't have an undetermined first (batch)\n            // dimension, which is why we always use the K.rnn approach here.\n            const step = (inputs, states) => {\n                // TODO(cais): Add useLearningPhase.\n                // NOTE(cais): `layer.call` may return a length-1 array of Tensor in\n                //   some cases (e.g., `layer` is a `Sequential` instance), which is\n                //   why `getExactlyOneTensor` is used below.\n                const output = getExactlyOneTensor(this.layer.call(inputs, kwargs));\n                return [output, []];\n            };\n            const rnnOutputs = rnn(step, inputs, [], false /* goBackwards */, null /* mask */, null /* constants */, false /* unroll */, true /* needPerStepOutputs */);\n            const y = rnnOutputs[1];\n            // TODO(cais): Add activity regularization.\n            // TODO(cais): Add useLearningPhase.\n            return y;\n        });\n    }\n}\n/** @nocollapse */\nTimeDistributed.className = 'TimeDistributed';\nserialization.registerClass(TimeDistributed);\nexport function checkBidirectionalMergeMode(value) {\n    generic_utils.checkStringTypeUnionValue(VALID_BIDIRECTIONAL_MERGE_MODES, 'BidirectionalMergeMode', value);\n}\nconst DEFAULT_BIDIRECTIONAL_MERGE_MODE = 'concat';\nexport class Bidirectional extends Wrapper {\n    constructor(args) {\n        super(args);\n        // Note: When creating `this.forwardLayer`, the original Layer object\n        //   (`config.layer`) ought to be cloned. This is why we call\n        //   `getConfig()` followed by `deserialize()`. Without this cloning,\n        //   the layer names saved during serialization will incorrectly contain\n        //   the 'forward_' prefix. In Python Keras, this is done using\n        //   `copy.copy` (shallow copy), which does not have a simple equivalent\n        //   in JavaScript. JavaScript's `Object.assign()` does not copy\n        //   methods.\n        const layerConfig = args.layer.getConfig();\n        const forwDict = {};\n        forwDict['className'] = args.layer.getClassName();\n        forwDict['config'] = layerConfig;\n        this.forwardLayer = deserialize(forwDict);\n        layerConfig['goBackwards'] =\n            layerConfig['goBackwards'] === true ? false : true;\n        const backDict = {};\n        backDict['className'] = args.layer.getClassName();\n        backDict['config'] = layerConfig;\n        this.backwardLayer = deserialize(backDict);\n        this.forwardLayer.name = 'forward_' + this.forwardLayer.name;\n        this.backwardLayer.name = 'backward_' + this.backwardLayer.name;\n        this.mergeMode = args.mergeMode === undefined ?\n            DEFAULT_BIDIRECTIONAL_MERGE_MODE :\n            args.mergeMode;\n        checkBidirectionalMergeMode(this.mergeMode);\n        if (args.weights) {\n            throw new NotImplementedError('weights support is not implemented for Bidirectional layer yet.');\n        }\n        this._stateful = args.layer.stateful;\n        this.returnSequences = args.layer.returnSequences;\n        this.returnState = args.layer.returnState;\n        this.supportsMasking = true;\n        this._trainable = true;\n        this.inputSpec = args.layer.inputSpec;\n        this.numConstants = null;\n    }\n    get trainable() {\n        return this._trainable;\n    }\n    set trainable(value) {\n        // Porting Note: the check of `this.layer` here is necessary due to the\n        //   way the `constructor` of this class is written (see Porting Note\n        //   above).\n        this._trainable = value;\n        if (this.forwardLayer != null) {\n            this.forwardLayer.trainable = value;\n        }\n        if (this.backwardLayer != null) {\n            this.backwardLayer.trainable = value;\n        }\n    }\n    getWeights() {\n        return this.forwardLayer.getWeights().concat(this.backwardLayer.getWeights());\n    }\n    setWeights(weights) {\n        const numWeights = weights.length;\n        const numeightsOver2 = Math.floor(numWeights / 2);\n        this.forwardLayer.setWeights(weights.slice(0, numeightsOver2));\n        this.backwardLayer.setWeights(weights.slice(numeightsOver2));\n    }\n    computeOutputShape(inputShape) {\n        let layerShapes = this.forwardLayer.computeOutputShape(inputShape);\n        if (!(Array.isArray(layerShapes) && Array.isArray(layerShapes[0]))) {\n            layerShapes = [layerShapes];\n        }\n        layerShapes = layerShapes;\n        let outputShape;\n        let outputShapes;\n        let stateShape;\n        if (this.returnState) {\n            stateShape = layerShapes.slice(1);\n            outputShape = layerShapes[0];\n        }\n        else {\n            outputShape = layerShapes[0];\n        }\n        outputShape = outputShape;\n        if (this.mergeMode === 'concat') {\n            outputShape[outputShape.length - 1] *= 2;\n            outputShapes = [outputShape];\n        }\n        else if (this.mergeMode == null) {\n            outputShapes = [outputShape, outputShape.slice()];\n        }\n        else {\n            outputShapes = [outputShape];\n        }\n        if (this.returnState) {\n            if (this.mergeMode == null) {\n                return outputShapes.concat(stateShape).concat(stateShape.slice());\n            }\n            return [outputShape].concat(stateShape).concat(stateShape.slice());\n        }\n        return generic_utils.singletonOrArray(outputShapes);\n    }\n    apply(inputs, kwargs) {\n        let initialState = kwargs == null ? null : kwargs['initialState'];\n        let constants = kwargs == null ? null : kwargs['constants'];\n        if (kwargs == null) {\n            kwargs = {};\n        }\n        const standardized = standardizeArgs(inputs, initialState, constants, this.numConstants);\n        inputs = standardized.inputs;\n        initialState = standardized.initialState;\n        constants = standardized.constants;\n        if (Array.isArray(inputs)) {\n            initialState = inputs.slice(1);\n            inputs = inputs[0];\n        }\n        if ((initialState == null || initialState.length === 0) &&\n            constants == null) {\n            return super.apply(inputs, kwargs);\n        }\n        const additionalInputs = [];\n        const additionalSpecs = [];\n        if (initialState != null) {\n            const numStates = initialState.length;\n            if (numStates % 2 > 0) {\n                throw new ValueError('When passing `initialState` to a Bidrectional RNN, ' +\n                    'the state should be an Array containing the states of ' +\n                    'the underlying RNNs.');\n            }\n            kwargs['initialState'] = initialState;\n            additionalInputs.push(...initialState);\n            const stateSpecs = initialState\n                .map(state => new InputSpec({ shape: state.shape }));\n            this.forwardLayer.stateSpec = stateSpecs.slice(0, numStates / 2);\n            this.backwardLayer.stateSpec = stateSpecs.slice(numStates / 2);\n            additionalSpecs.push(...stateSpecs);\n        }\n        if (constants != null) {\n            throw new NotImplementedError('Support for constants in Bidirectional layers is not ' +\n                'implemented yet.');\n        }\n        const isSymbolicTensor = additionalInputs[0] instanceof SymbolicTensor;\n        for (const tensor of additionalInputs) {\n            if (tensor instanceof SymbolicTensor !== isSymbolicTensor) {\n                throw new ValueError('The initial state of a Bidirectional layer cannot be ' +\n                    'specified as a mix of symbolic and non-symbolic tensors');\n            }\n        }\n        if (isSymbolicTensor) {\n            // Compute the full input and specs, including the states.\n            const fullInput = [inputs].concat(additionalInputs);\n            const fullInputSpec = this.inputSpec.concat(additionalSpecs);\n            // Perform the call temporarily and replace inputSpec.\n            // Note: with initial states symbolic calls and non-symbolic calls to\n            // this method differ in how the initial states are passed. For\n            // symbolic calls, the initial states are passed in the first arg, as\n            // an Array of SymbolicTensors; for non-symbolic calls, they are\n            // passed in the second arg as a part of the kwargs. Hence the need to\n            // temporarily modify inputSpec here.\n            // TODO(cais): Make refactoring so that this hacky code below is no\n            // longer needed.\n            const originalInputSpec = this.inputSpec;\n            this.inputSpec = fullInputSpec;\n            const output = super.apply(fullInput, kwargs);\n            this.inputSpec = originalInputSpec;\n            return output;\n        }\n        else {\n            return super.apply(inputs, kwargs);\n        }\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            const initialState = kwargs['initialState'];\n            let y;\n            let yRev;\n            if (initialState == null) {\n                y = this.forwardLayer.call(inputs, kwargs);\n                yRev = this.backwardLayer.call(inputs, kwargs);\n            }\n            else {\n                const forwardState = initialState.slice(0, initialState.length / 2);\n                const backwardState = initialState.slice(initialState.length / 2);\n                y = this.forwardLayer.call(inputs, Object.assign(kwargs, { initialState: forwardState }));\n                yRev = this.backwardLayer.call(inputs, Object.assign(kwargs, { initialState: backwardState }));\n            }\n            let states;\n            if (this.returnState) {\n                if (Array.isArray(y)) {\n                    states = y.slice(1).concat(yRev.slice(1));\n                }\n                else {\n                }\n                y = y[0];\n                yRev = yRev[0];\n            }\n            if (this.returnSequences) {\n                yRev = tfc.reverse(yRev, 1);\n            }\n            let output;\n            if (this.mergeMode === 'concat') {\n                output = K.concatenate([y, yRev]);\n            }\n            else if (this.mergeMode === 'sum') {\n                output = tfc.add(y, yRev);\n            }\n            else if (this.mergeMode === 'ave') {\n                output = tfc.mul(.5, tfc.add(y, yRev));\n            }\n            else if (this.mergeMode === 'mul') {\n                output = tfc.mul(y, yRev);\n            }\n            else if (this.mergeMode == null) {\n                output = [y, yRev];\n            }\n            // TODO(cais): Properly set learning phase.\n            if (this.returnState) {\n                if (this.mergeMode == null) {\n                    return output.concat(states);\n                }\n                return [output].concat(states);\n            }\n            return output;\n        });\n    }\n    resetStates(states) {\n        this.forwardLayer.resetStates();\n        this.backwardLayer.resetStates();\n    }\n    build(inputShape) {\n        nameScope(this.forwardLayer.name, () => {\n            this.forwardLayer.build(inputShape);\n        });\n        nameScope(this.backwardLayer.name, () => {\n            this.backwardLayer.build(inputShape);\n        });\n        this.built = true;\n    }\n    computeMask(inputs, mask) {\n        if (Array.isArray(mask)) {\n            mask = mask[0];\n        }\n        let outputMask;\n        if (this.returnSequences) {\n            if (this.mergeMode == null) {\n                outputMask = [mask, mask];\n            }\n            else {\n                outputMask = mask;\n            }\n        }\n        else {\n            if (this.mergeMode == null) {\n                outputMask = [null, null];\n            }\n            else {\n                outputMask = null;\n            }\n        }\n        if (this.returnState) {\n            const states = this.forwardLayer.states;\n            const stateMask = states.map(state => null);\n            if (Array.isArray(outputMask)) {\n                return outputMask.concat(stateMask).concat(stateMask);\n            }\n            else {\n                return [outputMask].concat(stateMask).concat(stateMask);\n            }\n        }\n        else {\n            return outputMask;\n        }\n    }\n    get trainableWeights() {\n        return this.forwardLayer.trainableWeights.concat(this.backwardLayer.trainableWeights);\n    }\n    get nonTrainableWeights() {\n        return this.forwardLayer.nonTrainableWeights.concat(this.backwardLayer.nonTrainableWeights);\n    }\n    // TODO(cais): Implement constraints().\n    setFastWeightInitDuringBuild(value) {\n        super.setFastWeightInitDuringBuild(value);\n        if (this.forwardLayer != null) {\n            this.forwardLayer.setFastWeightInitDuringBuild(value);\n        }\n        if (this.backwardLayer != null) {\n            this.backwardLayer.setFastWeightInitDuringBuild(value);\n        }\n    }\n    getConfig() {\n        const config = {\n            'mergeMode': this.mergeMode,\n        };\n        // TODO(cais): Add logic for `numConstants` once the property is added.\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    /** @nocollapse */\n    static fromConfig(cls, config) {\n        const rnnLayer = deserialize(config['layer']);\n        delete config['layer'];\n        // TODO(cais): Add logic for `numConstants` once the property is added.\n        if (config['numConstants'] != null) {\n            throw new NotImplementedError(`Deserialization of a Bidirectional layer with numConstants ` +\n                `present is not supported yet.`);\n        }\n        // tslint:disable-next-line:no-any\n        const newConfig = config;\n        newConfig['layer'] = rnnLayer;\n        return new cls(newConfig);\n    }\n}\n/** @nocollapse */\nBidirectional.className = 'Bidirectional';\nserialization.registerClass(Bidirectional);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid3JhcHBlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWxheWVycy9zcmMvbGF5ZXJzL3dyYXBwZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUg7O0dBRUc7QUFFSCxPQUFPLEtBQUssR0FBRyxNQUFNLHVCQUF1QixDQUFDO0FBQzdDLE9BQU8sRUFBQyxhQUFhLEVBQVUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDbEUsT0FBTyxLQUFLLENBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFhLGNBQWMsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQy9FLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxVQUFVLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDMUQsT0FBTyxFQUFnQywrQkFBK0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBR3RHLE9BQU8sS0FBSyxhQUFhLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFDLGtCQUFrQixFQUFFLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFHN0UsT0FBTyxFQUFDLEdBQUcsRUFBTyxlQUFlLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDdEQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBUzVDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBZ0IsT0FBUSxTQUFRLEtBQUs7SUFHekMsWUFBWSxJQUFzQjtRQUNoQyxxRUFBcUU7UUFDckUsMEVBQTBFO1FBQzFFLDZEQUE2RDtRQUM3RCxnRUFBZ0U7UUFDaEUsd0VBQXdFO1FBQ3hFLHdFQUF3RTtRQUN4RSxvQ0FBb0M7UUFDcEMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ1osSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQzFCLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBeUI7UUFDN0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7SUFDcEIsQ0FBQztJQUVELG9EQUFvRDtJQUVwRCxJQUFJLFNBQVM7UUFDWCx1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLFlBQVk7UUFDWixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7U0FDN0I7YUFBTTtZQUNMLE9BQU8sS0FBSyxDQUFDO1NBQ2Q7SUFDSCxDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBYztRQUMxQix1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLFlBQVk7UUFDWixJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ3RCLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUM5QjtJQUNILENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLENBQUM7SUFDckMsQ0FBQztJQUNELHFEQUFxRDtJQUVyRCxJQUFJLG1CQUFtQjtRQUNyQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsbUJBQW1CLENBQUM7SUFDeEMsQ0FBQztJQUNELHdEQUF3RDtJQUV4RCxJQUFJLE9BQU87UUFDVCxrQ0FBa0M7UUFDbEMsT0FBUSxJQUFJLENBQUMsS0FBYSxDQUFDLFFBQVEsQ0FBQztJQUN0QyxDQUFDO0lBRUQseUNBQXlDO0lBRXpDLElBQUksTUFBTTtRQUNSLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDM0IsQ0FBQztJQUVELHdDQUF3QztJQUV4QyxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBaUI7UUFDMUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVELFNBQVM7UUFDUCxNQUFNLE1BQU0sR0FBNkI7WUFDdkMsT0FBTyxFQUFFO2dCQUNQLFdBQVcsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRTtnQkFDdEMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFO2FBQ2pDO1NBQ0YsQ0FBQztRQUNGLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsNEJBQTRCLENBQUMsS0FBYztRQUN6QyxLQUFLLENBQUMsNEJBQTRCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDMUMsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN0QixJQUFJLENBQUMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixNQUFNLENBQUMsVUFBVSxDQUNiLEdBQTZDLEVBQzdDLE1BQWdDLEVBQ2hDLGdCQUFnQixFQUE4QjtRQUNoRCxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUE2QixDQUFDO1FBQ2hFLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFVLENBQUM7UUFDL0QsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkIsTUFBTSxTQUFTLEdBQUcsRUFBQyxLQUFLLEVBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNqQyxPQUFPLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxlQUFnQixTQUFRLE9BQU87SUFHMUMsWUFBWSxJQUFzQjtRQUNoQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDWixJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQztJQUM5QixDQUFDO0lBRUQsS0FBSyxDQUFDLFVBQXlCO1FBQzdCLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QyxJQUFJLFVBQVUsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLE1BQU0sSUFBSSxVQUFVLENBQ2hCLG1FQUFtRTtnQkFDbkUsZUFBZSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNsRDtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sZUFBZSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUU7WUFDckIsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1NBQ3pCO1FBQ0QsS0FBSyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUMxQixDQUFDO0lBRUQsa0JBQWtCLENBQUMsVUFBeUI7UUFDMUMsVUFBVSxHQUFHLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sZUFBZSxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwRSxNQUFNLGdCQUFnQixHQUNsQixJQUFJLENBQUMsS0FBSyxDQUFDLGtCQUFrQixDQUFDLGVBQWUsQ0FBVSxDQUFDO1FBQzVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLCtEQUErRDtZQUMvRCxNQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDckMsb0VBQW9FO1lBQ3BFLG9FQUFvRTtZQUNwRSxpRUFBaUU7WUFDakUsTUFBTSxJQUFJLEdBQW9CLENBQUMsTUFBYyxFQUFFLE1BQWdCLEVBQUUsRUFBRTtnQkFDakUsb0NBQW9DO2dCQUNwQyxvRUFBb0U7Z0JBQ3BFLG9FQUFvRTtnQkFDcEUsNkNBQTZDO2dCQUM3QyxNQUFNLE1BQU0sR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDcEUsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztZQUN0QixDQUFDLENBQUM7WUFDRixNQUFNLFVBQVUsR0FDWixHQUFHLENBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsS0FBSyxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxVQUFVLEVBQzFELElBQUksQ0FBQyxlQUFlLEVBQUUsS0FBSyxDQUFDLFlBQVksRUFDeEMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7WUFDdkMsTUFBTSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3hCLDJDQUEyQztZQUMzQyxvQ0FBb0M7WUFDcEMsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBeERELGtCQUFrQjtBQUNYLHlCQUFTLEdBQUcsaUJBQWlCLENBQUM7QUEyRHZDLGFBQWEsQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7QUFFN0MsTUFBTSxVQUFVLDJCQUEyQixDQUFDLEtBQWM7SUFDeEQsYUFBYSxDQUFDLHlCQUF5QixDQUNuQywrQkFBK0IsRUFBRSx3QkFBd0IsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUN4RSxDQUFDO0FBa0JELE1BQU0sZ0NBQWdDLEdBQTJCLFFBQVEsQ0FBQztBQUUxRSxNQUFNLE9BQU8sYUFBYyxTQUFRLE9BQU87SUFXeEMsWUFBWSxJQUE0QjtRQUN0QyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFWixxRUFBcUU7UUFDckUsNkRBQTZEO1FBQzdELHFFQUFxRTtRQUNyRSx3RUFBd0U7UUFDeEUsK0RBQStEO1FBQy9ELHdFQUF3RTtRQUN4RSxnRUFBZ0U7UUFDaEUsYUFBYTtRQUNiLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDM0MsTUFBTSxRQUFRLEdBQTZCLEVBQUUsQ0FBQztRQUM5QyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBUSxDQUFDO1FBQ2pELFdBQVcsQ0FBQyxhQUFhLENBQUM7WUFDdEIsV0FBVyxDQUFDLGFBQWEsQ0FBQyxLQUFLLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkQsTUFBTSxRQUFRLEdBQTZCLEVBQUUsQ0FBQztRQUM5QyxRQUFRLENBQUMsV0FBVyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNsRCxRQUFRLENBQUMsUUFBUSxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsV0FBVyxDQUFDLFFBQVEsQ0FBUSxDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQztRQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksR0FBRyxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUM7UUFFaEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQzNDLGdDQUFnQyxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUNuQiwyQkFBMkIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDNUMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxtQkFBbUIsQ0FDekIsaUVBQWlFLENBQUMsQ0FBQztTQUN4RTtRQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQztRQUNsRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDO1FBQzVCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUM7UUFDdEMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7SUFDM0IsQ0FBQztJQUVELElBQUksU0FBUztRQUNYLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQztJQUN6QixDQUFDO0lBRUQsSUFBSSxTQUFTLENBQUMsS0FBYztRQUMxQix1RUFBdUU7UUFDdkUscUVBQXFFO1FBQ3JFLFlBQVk7UUFDWixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztRQUN4QixJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFO1lBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUNyQztRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ3RDO0lBQ0gsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUN4QyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVELFVBQVUsQ0FBQyxPQUFpQjtRQUMxQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2xDLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUF5QjtRQUMxQyxJQUFJLFdBQVcsR0FDWCxJQUFJLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3JELElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2xFLFdBQVcsR0FBRyxDQUFDLFdBQW9CLENBQUMsQ0FBQztTQUN0QztRQUNELFdBQVcsR0FBRyxXQUFzQixDQUFDO1FBRXJDLElBQUksV0FBa0IsQ0FBQztRQUN2QixJQUFJLFlBQXFCLENBQUM7UUFDMUIsSUFBSSxVQUFtQixDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixVQUFVLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsQyxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlCO2FBQU07WUFDTCxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMxQixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO1lBQy9CLFdBQVcsQ0FBQyxXQUFXLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUN6QyxZQUFZLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5QjthQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDakMsWUFBWSxHQUFHLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ25EO2FBQU07WUFDTCxZQUFZLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5QjtRQUVELElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtZQUNwQixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO2dCQUMxQixPQUFPLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2FBQ25FO1lBQ0QsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDcEU7UUFDRCxPQUFPLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQsS0FBSyxDQUNELE1BQXVELEVBQ3ZELE1BQWU7UUFDakIsSUFBSSxZQUFZLEdBQ1osTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDbkQsSUFBSSxTQUFTLEdBQ1QsTUFBTSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEQsSUFBSSxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ2xCLE1BQU0sR0FBRyxFQUFFLENBQUM7U0FDYjtRQUNELE1BQU0sWUFBWSxHQUNkLGVBQWUsQ0FBQyxNQUFNLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDeEUsTUFBTSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7UUFDN0IsWUFBWSxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUM7UUFDekMsU0FBUyxHQUFHLFlBQVksQ0FBQyxTQUFTLENBQUM7UUFFbkMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pCLFlBQVksR0FBSSxNQUFzQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSxNQUFNLEdBQUksTUFBc0MsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyRDtRQUVELElBQUksQ0FBQyxZQUFZLElBQUksSUFBSSxJQUFJLFlBQVksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDO1lBQ25ELFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDckIsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNwQztRQUNELE1BQU0sZ0JBQWdCLEdBQWlDLEVBQUUsQ0FBQztRQUMxRCxNQUFNLGVBQWUsR0FBZ0IsRUFBRSxDQUFDO1FBQ3hDLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtZQUN4QixNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQ3RDLElBQUksU0FBUyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ3JCLE1BQU0sSUFBSSxVQUFVLENBQ2hCLHFEQUFxRDtvQkFDckQsd0RBQXdEO29CQUN4RCxzQkFBc0IsQ0FBQyxDQUFDO2FBQzdCO1lBQ0QsTUFBTSxDQUFDLGNBQWMsQ0FBQyxHQUFHLFlBQVksQ0FBQztZQUN0QyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQztZQUN2QyxNQUFNLFVBQVUsR0FBSSxZQUE2QztpQkFDekMsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxTQUFTLENBQUMsRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBQyxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDL0QsZUFBZSxDQUFDLElBQUksQ0FBQyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSSxTQUFTLElBQUksSUFBSSxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxtQkFBbUIsQ0FDekIsdURBQXVEO2dCQUN2RCxrQkFBa0IsQ0FBQyxDQUFDO1NBQ3pCO1FBRUQsTUFBTSxnQkFBZ0IsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsWUFBWSxjQUFjLENBQUM7UUFDdkUsS0FBSyxNQUFNLE1BQU0sSUFBSSxnQkFBZ0IsRUFBRTtZQUNyQyxJQUFJLE1BQU0sWUFBWSxjQUFjLEtBQUssZ0JBQWdCLEVBQUU7Z0JBQ3pELE1BQU0sSUFBSSxVQUFVLENBQ2hCLHVEQUF1RDtvQkFDdkQseURBQXlELENBQUMsQ0FBQzthQUNoRTtTQUNGO1FBRUQsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQiwwREFBMEQ7WUFDMUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUNwRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxlQUFlLENBQUMsQ0FBQztZQUM3RCxzREFBc0Q7WUFDdEQscUVBQXFFO1lBQ3JFLCtEQUErRDtZQUMvRCxxRUFBcUU7WUFDckUsZ0VBQWdFO1lBQ2hFLHNFQUFzRTtZQUN0RSxxQ0FBcUM7WUFDckMsbUVBQW1FO1lBQ25FLGlCQUFpQjtZQUNqQixNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDekMsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLENBQUM7WUFDL0IsTUFBTSxNQUFNLEdBQ1IsS0FBSyxDQUFDLEtBQUssQ0FBQyxTQUF3QyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxTQUFTLEdBQUcsaUJBQWlCLENBQUM7WUFDbkMsT0FBTyxNQUFNLENBQUM7U0FDZjthQUFNO1lBQ0wsT0FBTyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztTQUNwQztJQUNILENBQUM7SUFFRCxJQUFJLENBQUMsTUFBdUIsRUFBRSxNQUFjO1FBQzFDLE9BQU8sSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNmLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUU1QyxJQUFJLENBQWtCLENBQUM7WUFDdkIsSUFBSSxJQUFxQixDQUFDO1lBQzFCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtnQkFDeEIsQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFDM0MsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQzthQUNoRDtpQkFBTTtnQkFDTCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNwRSxNQUFNLGFBQWEsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ2xFLENBQUMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FDdEIsTUFBTSxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUMsWUFBWSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUMsQ0FBQztnQkFDakUsSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUMxQixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBQyxZQUFZLEVBQUUsYUFBYSxFQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ25FO1lBRUQsSUFBSSxNQUFnQixDQUFDO1lBQ3JCLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDcEIsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO29CQUNwQixNQUFNLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUUsSUFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztpQkFDekQ7cUJBQU07aUJBQ047Z0JBQ0QsQ0FBQyxHQUFJLENBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkIsSUFBSSxHQUFJLElBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDOUI7WUFFRCxJQUFJLElBQUksQ0FBQyxlQUFlLEVBQUU7Z0JBQ3hCLElBQUksR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLElBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN2QztZQUVELElBQUksTUFBdUIsQ0FBQztZQUM1QixJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO2dCQUMvQixNQUFNLEdBQUcsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQVcsRUFBRSxJQUFjLENBQUMsQ0FBQyxDQUFDO2FBQ3ZEO2lCQUFNLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxLQUFLLEVBQUU7Z0JBQ25DLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQVcsRUFBRSxJQUFjLENBQUMsQ0FBQzthQUMvQztpQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO2dCQUNuQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFXLEVBQUUsSUFBYyxDQUFDLENBQUMsQ0FBQzthQUM1RDtpQkFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO2dCQUNuQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFXLEVBQUUsSUFBYyxDQUFDLENBQUM7YUFDL0M7aUJBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtnQkFDakMsTUFBTSxHQUFHLENBQUMsQ0FBVyxFQUFFLElBQWMsQ0FBQyxDQUFDO2FBQ3hDO1lBRUQsMkNBQTJDO1lBQzNDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDcEIsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksRUFBRTtvQkFDMUIsT0FBUSxNQUFtQixDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDNUM7Z0JBQ0QsT0FBTyxDQUFDLE1BQWdCLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7YUFDMUM7WUFDRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsTUFBd0I7UUFDbEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNoQyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFRCxLQUFLLENBQUMsVUFBeUI7UUFDN0IsU0FBUyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRTtZQUNyQyxJQUFJLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILFNBQVMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxHQUFHLEVBQUU7WUFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQXVCLEVBQUUsSUFBc0I7UUFFekQsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3ZCLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDaEI7UUFDRCxJQUFJLFVBQTJCLENBQUM7UUFDaEMsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO1lBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7Z0JBQzFCLFVBQVUsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMzQjtpQkFBTTtnQkFDTCxVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQ25CO1NBQ0Y7YUFBTTtZQUNMLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7Z0JBQzFCLFVBQVUsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzthQUMzQjtpQkFBTTtnQkFDTCxVQUFVLEdBQUcsSUFBSSxDQUFDO2FBQ25CO1NBQ0Y7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDcEIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUM7WUFDeEMsTUFBTSxTQUFTLEdBQWEsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDN0IsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN2RDtpQkFBTTtnQkFDTCxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQzthQUN6RDtTQUNGO2FBQU07WUFDTCxPQUFPLFVBQVUsQ0FBQztTQUNuQjtJQUNILENBQUM7SUFFRCxJQUFJLGdCQUFnQjtRQUNsQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUM1QyxJQUFJLENBQUMsYUFBYSxDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELElBQUksbUJBQW1CO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLENBQy9DLElBQUksQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsdUNBQXVDO0lBRXZDLDRCQUE0QixDQUFDLEtBQWM7UUFDekMsS0FBSyxDQUFDLDRCQUE0QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLElBQUksSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLEVBQUU7WUFDN0IsSUFBSSxDQUFDLFlBQVksQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2RDtRQUNELElBQUksSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLEVBQUU7WUFDOUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyw0QkFBNEIsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN4RDtJQUNILENBQUM7SUFFRCxTQUFTO1FBQ1AsTUFBTSxNQUFNLEdBQTZCO1lBQ3ZDLFdBQVcsRUFBRSxJQUFJLENBQUMsU0FBUztTQUM1QixDQUFDO1FBQ0YsdUVBQXVFO1FBQ3ZFLE1BQU0sVUFBVSxHQUFHLEtBQUssQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNsQyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLE1BQU0sQ0FBQyxVQUFVLENBQ2IsR0FBNkMsRUFDN0MsTUFBZ0M7UUFDbEMsTUFBTSxRQUFRLEdBQ1YsV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQTZCLENBQVEsQ0FBQztRQUNwRSxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2Qix1RUFBdUU7UUFDdkUsSUFBSSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2xDLE1BQU0sSUFBSSxtQkFBbUIsQ0FDekIsNkRBQTZEO2dCQUM3RCwrQkFBK0IsQ0FBQyxDQUFDO1NBQ3RDO1FBQ0Qsa0NBQWtDO1FBQ2xDLE1BQU0sU0FBUyxHQUF5QixNQUFNLENBQUM7UUFDL0MsU0FBUyxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUM5QixPQUFPLElBQUksR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDO0lBQzVCLENBQUM7O0FBL1ZELGtCQUFrQjtBQUNYLHVCQUFTLEdBQUcsZUFBZSxDQUFDO0FBZ1dyQyxhQUFhLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqXG4gKiBMYXllcnMgdGhhdCBhdWdtZW50IHRoZSBmdW5jdGlvbmFsaXR5IG9mIGEgYmFzZSBsYXllci5cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7c2VyaWFsaXphdGlvbiwgVGVuc29yLCB0aWR5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQge25hbWVTY29wZX0gZnJvbSAnLi4vY29tbW9uJztcbmltcG9ydCB7SW5wdXRTcGVjLCBMYXllciwgTGF5ZXJBcmdzLCBTeW1ib2xpY1RlbnNvcn0gZnJvbSAnLi4vZW5naW5lL3RvcG9sb2d5JztcbmltcG9ydCB7Tm90SW1wbGVtZW50ZWRFcnJvciwgVmFsdWVFcnJvcn0gZnJvbSAnLi4vZXJyb3JzJztcbmltcG9ydCB7QmlkaXJlY3Rpb25hbE1lcmdlTW9kZSwgU2hhcGUsIFZBTElEX0JJRElSRUNUSU9OQUxfTUVSR0VfTU9ERVN9IGZyb20gJy4uL2tlcmFzX2Zvcm1hdC9jb21tb24nO1xuaW1wb3J0IHtLd2FyZ3N9IGZyb20gJy4uL3R5cGVzJztcbmltcG9ydCB7UmVndWxhcml6ZXJGbiwgUm5uU3RlcEZ1bmN0aW9ufSBmcm9tICcuLi90eXBlcyc7XG5pbXBvcnQgKiBhcyBnZW5lcmljX3V0aWxzIGZyb20gJy4uL3V0aWxzL2dlbmVyaWNfdXRpbHMnO1xuaW1wb3J0IHtnZXRFeGFjdGx5T25lU2hhcGUsIGdldEV4YWN0bHlPbmVUZW5zb3J9IGZyb20gJy4uL3V0aWxzL3R5cGVzX3V0aWxzJztcbmltcG9ydCB7TGF5ZXJWYXJpYWJsZX0gZnJvbSAnLi4vdmFyaWFibGVzJztcblxuaW1wb3J0IHtybm4sIFJOTiwgc3RhbmRhcmRpemVBcmdzfSBmcm9tICcuL3JlY3VycmVudCc7XG5pbXBvcnQge2Rlc2VyaWFsaXplfSBmcm9tICcuL3NlcmlhbGl6YXRpb24nO1xuXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgV3JhcHBlckxheWVyQXJncyBleHRlbmRzIExheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgbGF5ZXIgdG8gYmUgd3JhcHBlZC5cbiAgICovXG4gIGxheWVyOiBMYXllcjtcbn1cblxuLyoqXG4gKiBBYnN0cmFjdCB3cmFwcGVyIGJhc2UgY2xhc3MuXG4gKlxuICogV3JhcHBlcnMgdGFrZSBhbm90aGVyIGxheWVyIGFuZCBhdWdtZW50IGl0IGluIHZhcmlvdXMgd2F5cy5cbiAqIERvIG5vdCB1c2UgdGhpcyBjbGFzcyBhcyBhIGxheWVyLCBpdCBpcyBvbmx5IGFuIGFic3RyYWN0IGJhc2UgY2xhc3MuXG4gKiBUd28gdXNhYmxlIHdyYXBwZXJzIGFyZSB0aGUgYFRpbWVEaXN0cmlidXRlZGAgYW5kIGBCaWRpcmVjdGlvbmFsYCB3cmFwcGVycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIFdyYXBwZXIgZXh0ZW5kcyBMYXllciB7XG4gIHJlYWRvbmx5IGxheWVyOiBMYXllcjtcblxuICBjb25zdHJ1Y3RvcihhcmdzOiBXcmFwcGVyTGF5ZXJBcmdzKSB7XG4gICAgLy8gUG9ydGluZyBOb3RlOiBJbiBQeUtlcmFzLCBgc2VsZi5sYXllcmAgaXMgc2V0IHByaW9yIHRvIHRoZSBjYWxsaW5nXG4gICAgLy8gICBgc3VwZXIoKWAuIEJ1dCB3ZSBjYW4ndCBkbyB0aGF0IGhlcmUgZHVlIHRvIFR5cGVTY3JpcHQncyByZXN0cmljdGlvbi5cbiAgICAvLyAgIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy84Mjc3XG4gICAgLy8gICBBcyBhIHJlc3VsdCwgd2UgaGF2ZSB0byBhZGQgY2hlY2tzIGluIGBnZXQgdHJhaW5hYmxlKClgIGFuZFxuICAgIC8vICAgYHNldCB0cmFpbmFibGUoKWAgYmVsb3cgaW4gb3JkZXIgdG8gcHJldmVudCB1c2luZyBgdGhpcy5sYXllcmAgd2hlblxuICAgIC8vICAgaXRzIHZhbHVlIGlzIGB1bmRlZmluZWRgLiBUaGUgc3VwZXIgY29uc3RydWN0b3IgZG9lcyB1c2UgdGhlIGdldHRlclxuICAgIC8vICAgYW5kIHRoZSBzZXR0ZXIgb2YgYHRoaXMubGF5ZXJgLlxuICAgIHN1cGVyKGFyZ3MpO1xuICAgIHRoaXMubGF5ZXIgPSBhcmdzLmxheWVyO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIHRoaXMuYnVpbHQgPSB0cnVlO1xuICB9XG5cbiAgLy8gVE9ETyhjYWlzKTogSW1wbGVtZW50IGFjdGl2aXR5UmVndWxhcml6ZXIgZ2V0dGVyLlxuXG4gIGdldCB0cmFpbmFibGUoKTogYm9vbGVhbiB7XG4gICAgLy8gUG9ydGluZyBOb3RlOiB0aGUgY2hlY2sgb2YgYHRoaXMubGF5ZXJgIGhlcmUgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGVcbiAgICAvLyAgIHdheSB0aGUgYGNvbnN0cnVjdG9yYCBvZiB0aGlzIGNsYXNzIGlzIHdyaXR0ZW4gKHNlZSBQb3J0aW5nIE5vdGVcbiAgICAvLyAgIGFib3ZlKS5cbiAgICBpZiAodGhpcy5sYXllciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYXllci50cmFpbmFibGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBzZXQgdHJhaW5hYmxlKHZhbHVlOiBib29sZWFuKSB7XG4gICAgLy8gUG9ydGluZyBOb3RlOiB0aGUgY2hlY2sgb2YgYHRoaXMubGF5ZXJgIGhlcmUgaXMgbmVjZXNzYXJ5IGR1ZSB0byB0aGVcbiAgICAvLyAgIHdheSB0aGUgYGNvbnN0cnVjdG9yYCBvZiB0aGlzIGNsYXNzIGlzIHdyaXR0ZW4gKHNlZSBQb3J0aW5nIE5vdGVcbiAgICAvLyAgIGFib3ZlKS5cbiAgICBpZiAodGhpcy5sYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmxheWVyLnRyYWluYWJsZSA9IHZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0cmFpbmFibGVXZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIudHJhaW5hYmxlV2VpZ2h0cztcbiAgfVxuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgc2V0dGVyIGZvciB0cmFpbmFibGVXZWlnaHRzLlxuXG4gIGdldCBub25UcmFpbmFibGVXZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIubm9uVHJhaW5hYmxlV2VpZ2h0cztcbiAgfVxuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgc2V0dGVyIGZvciBub25UcmFpbmFibGVXZWlnaHRzLlxuXG4gIGdldCB1cGRhdGVzKCk6IFRlbnNvcltdIHtcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgcmV0dXJuICh0aGlzLmxheWVyIGFzIGFueSkuX3VwZGF0ZXM7XG4gIH1cblxuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgZ2V0VXBkYXRlc0ZvcigpLlxuXG4gIGdldCBsb3NzZXMoKTogUmVndWxhcml6ZXJGbltdIHtcbiAgICByZXR1cm4gdGhpcy5sYXllci5sb3NzZXM7XG4gIH1cblxuICAvLyBUT0RPKGNhaXMpOiBJbXBsZW1lbnQgZ2V0TG9zc2VzRm9yKCkuXG5cbiAgZ2V0V2VpZ2h0cygpOiBUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMubGF5ZXIuZ2V0V2VpZ2h0cygpO1xuICB9XG5cbiAgc2V0V2VpZ2h0cyh3ZWlnaHRzOiBUZW5zb3JbXSk6IHZvaWQge1xuICAgIHRoaXMubGF5ZXIuc2V0V2VpZ2h0cyh3ZWlnaHRzKTtcbiAgfVxuXG4gIGdldENvbmZpZygpOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3Qge1xuICAgIGNvbnN0IGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge1xuICAgICAgJ2xheWVyJzoge1xuICAgICAgICAnY2xhc3NOYW1lJzogdGhpcy5sYXllci5nZXRDbGFzc05hbWUoKSxcbiAgICAgICAgJ2NvbmZpZyc6IHRoaXMubGF5ZXIuZ2V0Q29uZmlnKCksXG4gICAgICB9XG4gICAgfTtcbiAgICBjb25zdCBiYXNlQ29uZmlnID0gc3VwZXIuZ2V0Q29uZmlnKCk7XG4gICAgT2JqZWN0LmFzc2lnbihjb25maWcsIGJhc2VDb25maWcpO1xuICAgIHJldHVybiBjb25maWc7XG4gIH1cblxuICBzZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlOiBib29sZWFuKSB7XG4gICAgc3VwZXIuc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCh2YWx1ZSk7XG4gICAgaWYgKHRoaXMubGF5ZXIgIT0gbnVsbCkge1xuICAgICAgdGhpcy5sYXllci5zZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIGZyb21Db25maWc8VCBleHRlbmRzIHNlcmlhbGl6YXRpb24uU2VyaWFsaXphYmxlPihcbiAgICAgIGNsczogc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGVDb25zdHJ1Y3RvcjxUPixcbiAgICAgIGNvbmZpZzogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0LFxuICAgICAgY3VzdG9tT2JqZWN0cyA9IHt9IGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCk6IFQge1xuICAgIGNvbnN0IGxheWVyQ29uZmlnID0gY29uZmlnWydsYXllciddIGFzIHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdDtcbiAgICBjb25zdCBsYXllciA9IGRlc2VyaWFsaXplKGxheWVyQ29uZmlnLCBjdXN0b21PYmplY3RzKSBhcyBMYXllcjtcbiAgICBkZWxldGUgY29uZmlnWydsYXllciddO1xuICAgIGNvbnN0IG5ld0NvbmZpZyA9IHtsYXllcn07XG4gICAgT2JqZWN0LmFzc2lnbihuZXdDb25maWcsIGNvbmZpZyk7XG4gICAgcmV0dXJuIG5ldyBjbHMobmV3Q29uZmlnKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVGltZURpc3RyaWJ1dGVkIGV4dGVuZHMgV3JhcHBlciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1RpbWVEaXN0cmlidXRlZCc7XG4gIGNvbnN0cnVjdG9yKGFyZ3M6IFdyYXBwZXJMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gIH1cblxuICBidWlsZChpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogdm9pZCB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBpZiAoaW5wdXRTaGFwZS5sZW5ndGggPCAzKSB7XG4gICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICBgVGltZURpc3RyaWJ1dGVkIGxheWVyIGV4cGVjdHMgYW4gaW5wdXQgc2hhcGUgPj0gM0QsIGJ1dCByZWNlaXZlZCBgICtcbiAgICAgICAgICBgaW5wdXQgc2hhcGUgJHtKU09OLnN0cmluZ2lmeShpbnB1dFNoYXBlKX1gKTtcbiAgICB9XG4gICAgdGhpcy5pbnB1dFNwZWMgPSBbe3NoYXBlOiBpbnB1dFNoYXBlfV07XG4gICAgY29uc3QgY2hpbGRJbnB1dFNoYXBlID0gW2lucHV0U2hhcGVbMF1dLmNvbmNhdChpbnB1dFNoYXBlLnNsaWNlKDIpKTtcbiAgICBpZiAoIXRoaXMubGF5ZXIuYnVpbHQpIHtcbiAgICAgIHRoaXMubGF5ZXIuYnVpbGQoY2hpbGRJbnB1dFNoYXBlKTtcbiAgICAgIHRoaXMubGF5ZXIuYnVpbHQgPSB0cnVlO1xuICAgIH1cbiAgICBzdXBlci5idWlsZChpbnB1dFNoYXBlKTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgaW5wdXRTaGFwZSA9IGdldEV4YWN0bHlPbmVTaGFwZShpbnB1dFNoYXBlKTtcbiAgICBjb25zdCBjaGlsZElucHV0U2hhcGUgPSBbaW5wdXRTaGFwZVswXV0uY29uY2F0KGlucHV0U2hhcGUuc2xpY2UoMikpO1xuICAgIGNvbnN0IGNoaWxkT3V0cHV0U2hhcGUgPVxuICAgICAgICB0aGlzLmxheWVyLmNvbXB1dGVPdXRwdXRTaGFwZShjaGlsZElucHV0U2hhcGUpIGFzIFNoYXBlO1xuICAgIGNvbnN0IHRpbWVzdGVwcyA9IGlucHV0U2hhcGVbMV07XG4gICAgcmV0dXJuIFtjaGlsZE91dHB1dFNoYXBlWzBdLCB0aW1lc3RlcHNdLmNvbmNhdChjaGlsZE91dHB1dFNoYXBlLnNsaWNlKDEpKTtcbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgJ3RyYWluaW5nJyBhbmQgJ3VzZUxlYXJuaW5nUGhhc2UnIHRvIGt3YXJncy5cbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIC8vIFBvcnRpbmcgTm90ZTogSW4gdGZqcy1sYXllcnMsIGBpbnB1dHNgIGFyZSBhbHdheXMgY29uY3JldGUgdGVuc29yXG4gICAgICAvLyB2YWx1ZXMuIEhlbmNlIHRoZSBpbnB1dHMgY2FuJ3QgaGF2ZSBhbiB1bmRldGVybWluZWQgZmlyc3QgKGJhdGNoKVxuICAgICAgLy8gZGltZW5zaW9uLCB3aGljaCBpcyB3aHkgd2UgYWx3YXlzIHVzZSB0aGUgSy5ybm4gYXBwcm9hY2ggaGVyZS5cbiAgICAgIGNvbnN0IHN0ZXA6IFJublN0ZXBGdW5jdGlvbiA9IChpbnB1dHM6IFRlbnNvciwgc3RhdGVzOiBUZW5zb3JbXSkgPT4ge1xuICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgdXNlTGVhcm5pbmdQaGFzZS5cbiAgICAgICAgLy8gTk9URShjYWlzKTogYGxheWVyLmNhbGxgIG1heSByZXR1cm4gYSBsZW5ndGgtMSBhcnJheSBvZiBUZW5zb3IgaW5cbiAgICAgICAgLy8gICBzb21lIGNhc2VzIChlLmcuLCBgbGF5ZXJgIGlzIGEgYFNlcXVlbnRpYWxgIGluc3RhbmNlKSwgd2hpY2ggaXNcbiAgICAgICAgLy8gICB3aHkgYGdldEV4YWN0bHlPbmVUZW5zb3JgIGlzIHVzZWQgYmVsb3cuXG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGdldEV4YWN0bHlPbmVUZW5zb3IodGhpcy5sYXllci5jYWxsKGlucHV0cywga3dhcmdzKSk7XG4gICAgICAgIHJldHVybiBbb3V0cHV0LCBbXV07XG4gICAgICB9O1xuICAgICAgY29uc3Qgcm5uT3V0cHV0cyA9XG4gICAgICAgICAgcm5uKHN0ZXAsIGlucHV0cywgW10sIGZhbHNlIC8qIGdvQmFja3dhcmRzICovLCBudWxsIC8qIG1hc2sgKi8sXG4gICAgICAgICAgICAgIG51bGwgLyogY29uc3RhbnRzICovLCBmYWxzZSAvKiB1bnJvbGwgKi8sXG4gICAgICAgICAgICAgIHRydWUgLyogbmVlZFBlclN0ZXBPdXRwdXRzICovKTtcbiAgICAgIGNvbnN0IHkgPSBybm5PdXRwdXRzWzFdO1xuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIGFjdGl2aXR5IHJlZ3VsYXJpemF0aW9uLlxuICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHVzZUxlYXJuaW5nUGhhc2UuXG4gICAgICByZXR1cm4geTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFRPRE8oY2Fpcyk6IEltcGxlbWVudCBkZXRhaWxlZCBjb21wdXRlTWFzaygpIGxvZ2ljLlxufVxuc2VyaWFsaXphdGlvbi5yZWdpc3RlckNsYXNzKFRpbWVEaXN0cmlidXRlZCk7XG5cbmV4cG9ydCBmdW5jdGlvbiBjaGVja0JpZGlyZWN0aW9uYWxNZXJnZU1vZGUodmFsdWU/OiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2VuZXJpY191dGlscy5jaGVja1N0cmluZ1R5cGVVbmlvblZhbHVlKFxuICAgICAgVkFMSURfQklESVJFQ1RJT05BTF9NRVJHRV9NT0RFUywgJ0JpZGlyZWN0aW9uYWxNZXJnZU1vZGUnLCB2YWx1ZSk7XG59XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBCaWRpcmVjdGlvbmFsTGF5ZXJBcmdzIGV4dGVuZHMgV3JhcHBlckxheWVyQXJncyB7XG4gIC8qKlxuICAgKiBUaGUgaW5zdGFuY2Ugb2YgYW4gYFJOTmAgbGF5ZXIgdG8gYmUgd3JhcHBlZC5cbiAgICovXG4gIGxheWVyOiBSTk47XG5cbiAgLyoqXG4gICAqIE1vZGUgYnkgd2hpY2ggb3V0cHV0cyBvZiB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgUk5OcyBhcmVcbiAgICogY29tYmluZWQuIElmIGBudWxsYCBvciBgdW5kZWZpbmVkYCwgdGhlIG91dHB1dCB3aWxsIG5vdCBiZVxuICAgKiBjb21iaW5lZCwgdGhleSB3aWxsIGJlIHJldHVybmVkIGFzIGFuIGBBcnJheWAuXG4gICAqXG4gICAqIElmIGB1bmRlZmluZWRgIChpLmUuLCBub3QgcHJvdmlkZWQpLCBkZWZhdWx0cyB0byBgJ2NvbmNhdCdgLlxuICAgKi9cbiAgbWVyZ2VNb2RlPzogQmlkaXJlY3Rpb25hbE1lcmdlTW9kZTtcbn1cblxuY29uc3QgREVGQVVMVF9CSURJUkVDVElPTkFMX01FUkdFX01PREU6IEJpZGlyZWN0aW9uYWxNZXJnZU1vZGUgPSAnY29uY2F0JztcblxuZXhwb3J0IGNsYXNzIEJpZGlyZWN0aW9uYWwgZXh0ZW5kcyBXcmFwcGVyIHtcbiAgLyoqIEBub2NvbGxhcHNlICovXG4gIHN0YXRpYyBjbGFzc05hbWUgPSAnQmlkaXJlY3Rpb25hbCc7XG4gIG1lcmdlTW9kZTogQmlkaXJlY3Rpb25hbE1lcmdlTW9kZTtcbiAgcHJpdmF0ZSBmb3J3YXJkTGF5ZXI6IFJOTjtcbiAgcHJpdmF0ZSBiYWNrd2FyZExheWVyOiBSTk47XG4gIHByaXZhdGUgcmV0dXJuU2VxdWVuY2VzOiBib29sZWFuO1xuICBwcml2YXRlIHJldHVyblN0YXRlOiBib29sZWFuO1xuICBwcml2YXRlIG51bUNvbnN0YW50cz86IG51bWJlcjtcbiAgcHJpdmF0ZSBfdHJhaW5hYmxlOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKGFyZ3M6IEJpZGlyZWN0aW9uYWxMYXllckFyZ3MpIHtcbiAgICBzdXBlcihhcmdzKTtcblxuICAgIC8vIE5vdGU6IFdoZW4gY3JlYXRpbmcgYHRoaXMuZm9yd2FyZExheWVyYCwgdGhlIG9yaWdpbmFsIExheWVyIG9iamVjdFxuICAgIC8vICAgKGBjb25maWcubGF5ZXJgKSBvdWdodCB0byBiZSBjbG9uZWQuIFRoaXMgaXMgd2h5IHdlIGNhbGxcbiAgICAvLyAgIGBnZXRDb25maWcoKWAgZm9sbG93ZWQgYnkgYGRlc2VyaWFsaXplKClgLiBXaXRob3V0IHRoaXMgY2xvbmluZyxcbiAgICAvLyAgIHRoZSBsYXllciBuYW1lcyBzYXZlZCBkdXJpbmcgc2VyaWFsaXphdGlvbiB3aWxsIGluY29ycmVjdGx5IGNvbnRhaW5cbiAgICAvLyAgIHRoZSAnZm9yd2FyZF8nIHByZWZpeC4gSW4gUHl0aG9uIEtlcmFzLCB0aGlzIGlzIGRvbmUgdXNpbmdcbiAgICAvLyAgIGBjb3B5LmNvcHlgIChzaGFsbG93IGNvcHkpLCB3aGljaCBkb2VzIG5vdCBoYXZlIGEgc2ltcGxlIGVxdWl2YWxlbnRcbiAgICAvLyAgIGluIEphdmFTY3JpcHQuIEphdmFTY3JpcHQncyBgT2JqZWN0LmFzc2lnbigpYCBkb2VzIG5vdCBjb3B5XG4gICAgLy8gICBtZXRob2RzLlxuICAgIGNvbnN0IGxheWVyQ29uZmlnID0gYXJncy5sYXllci5nZXRDb25maWcoKTtcbiAgICBjb25zdCBmb3J3RGljdDogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge307XG4gICAgZm9yd0RpY3RbJ2NsYXNzTmFtZSddID0gYXJncy5sYXllci5nZXRDbGFzc05hbWUoKTtcbiAgICBmb3J3RGljdFsnY29uZmlnJ10gPSBsYXllckNvbmZpZztcbiAgICB0aGlzLmZvcndhcmRMYXllciA9IGRlc2VyaWFsaXplKGZvcndEaWN0KSBhcyBSTk47XG4gICAgbGF5ZXJDb25maWdbJ2dvQmFja3dhcmRzJ10gPVxuICAgICAgICBsYXllckNvbmZpZ1snZ29CYWNrd2FyZHMnXSA9PT0gdHJ1ZSA/IGZhbHNlIDogdHJ1ZTtcbiAgICBjb25zdCBiYWNrRGljdDogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0ID0ge307XG4gICAgYmFja0RpY3RbJ2NsYXNzTmFtZSddID0gYXJncy5sYXllci5nZXRDbGFzc05hbWUoKTtcbiAgICBiYWNrRGljdFsnY29uZmlnJ10gPSBsYXllckNvbmZpZztcbiAgICB0aGlzLmJhY2t3YXJkTGF5ZXIgPSBkZXNlcmlhbGl6ZShiYWNrRGljdCkgYXMgUk5OO1xuICAgIHRoaXMuZm9yd2FyZExheWVyLm5hbWUgPSAnZm9yd2FyZF8nICsgdGhpcy5mb3J3YXJkTGF5ZXIubmFtZTtcbiAgICB0aGlzLmJhY2t3YXJkTGF5ZXIubmFtZSA9ICdiYWNrd2FyZF8nICsgdGhpcy5iYWNrd2FyZExheWVyLm5hbWU7XG5cbiAgICB0aGlzLm1lcmdlTW9kZSA9IGFyZ3MubWVyZ2VNb2RlID09PSB1bmRlZmluZWQgP1xuICAgICAgICBERUZBVUxUX0JJRElSRUNUSU9OQUxfTUVSR0VfTU9ERSA6XG4gICAgICAgIGFyZ3MubWVyZ2VNb2RlO1xuICAgIGNoZWNrQmlkaXJlY3Rpb25hbE1lcmdlTW9kZSh0aGlzLm1lcmdlTW9kZSk7XG4gICAgaWYgKGFyZ3Mud2VpZ2h0cykge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ3dlaWdodHMgc3VwcG9ydCBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIEJpZGlyZWN0aW9uYWwgbGF5ZXIgeWV0LicpO1xuICAgIH1cbiAgICB0aGlzLl9zdGF0ZWZ1bCA9IGFyZ3MubGF5ZXIuc3RhdGVmdWw7XG4gICAgdGhpcy5yZXR1cm5TZXF1ZW5jZXMgPSBhcmdzLmxheWVyLnJldHVyblNlcXVlbmNlcztcbiAgICB0aGlzLnJldHVyblN0YXRlID0gYXJncy5sYXllci5yZXR1cm5TdGF0ZTtcbiAgICB0aGlzLnN1cHBvcnRzTWFza2luZyA9IHRydWU7XG4gICAgdGhpcy5fdHJhaW5hYmxlID0gdHJ1ZTtcbiAgICB0aGlzLmlucHV0U3BlYyA9IGFyZ3MubGF5ZXIuaW5wdXRTcGVjO1xuICAgIHRoaXMubnVtQ29uc3RhbnRzID0gbnVsbDtcbiAgfVxuXG4gIGdldCB0cmFpbmFibGUoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYWluYWJsZTtcbiAgfVxuXG4gIHNldCB0cmFpbmFibGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAvLyBQb3J0aW5nIE5vdGU6IHRoZSBjaGVjayBvZiBgdGhpcy5sYXllcmAgaGVyZSBpcyBuZWNlc3NhcnkgZHVlIHRvIHRoZVxuICAgIC8vICAgd2F5IHRoZSBgY29uc3RydWN0b3JgIG9mIHRoaXMgY2xhc3MgaXMgd3JpdHRlbiAoc2VlIFBvcnRpbmcgTm90ZVxuICAgIC8vICAgYWJvdmUpLlxuICAgIHRoaXMuX3RyYWluYWJsZSA9IHZhbHVlO1xuICAgIGlmICh0aGlzLmZvcndhcmRMYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZvcndhcmRMYXllci50cmFpbmFibGUgPSB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFja3dhcmRMYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJhY2t3YXJkTGF5ZXIudHJhaW5hYmxlID0gdmFsdWU7XG4gICAgfVxuICB9XG5cbiAgZ2V0V2VpZ2h0cygpOiBUZW5zb3JbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yd2FyZExheWVyLmdldFdlaWdodHMoKS5jb25jYXQoXG4gICAgICAgIHRoaXMuYmFja3dhcmRMYXllci5nZXRXZWlnaHRzKCkpO1xuICB9XG5cbiAgc2V0V2VpZ2h0cyh3ZWlnaHRzOiBUZW5zb3JbXSk6IHZvaWQge1xuICAgIGNvbnN0IG51bVdlaWdodHMgPSB3ZWlnaHRzLmxlbmd0aDtcbiAgICBjb25zdCBudW1laWdodHNPdmVyMiA9IE1hdGguZmxvb3IobnVtV2VpZ2h0cyAvIDIpO1xuICAgIHRoaXMuZm9yd2FyZExheWVyLnNldFdlaWdodHMod2VpZ2h0cy5zbGljZSgwLCBudW1laWdodHNPdmVyMikpO1xuICAgIHRoaXMuYmFja3dhcmRMYXllci5zZXRXZWlnaHRzKHdlaWdodHMuc2xpY2UobnVtZWlnaHRzT3ZlcjIpKTtcbiAgfVxuXG4gIGNvbXB1dGVPdXRwdXRTaGFwZShpbnB1dFNoYXBlOiBTaGFwZXxTaGFwZVtdKTogU2hhcGV8U2hhcGVbXSB7XG4gICAgbGV0IGxheWVyU2hhcGVzOiBTaGFwZXxTaGFwZVtdID1cbiAgICAgICAgdGhpcy5mb3J3YXJkTGF5ZXIuY29tcHV0ZU91dHB1dFNoYXBlKGlucHV0U2hhcGUpO1xuICAgIGlmICghKEFycmF5LmlzQXJyYXkobGF5ZXJTaGFwZXMpICYmIEFycmF5LmlzQXJyYXkobGF5ZXJTaGFwZXNbMF0pKSkge1xuICAgICAgbGF5ZXJTaGFwZXMgPSBbbGF5ZXJTaGFwZXMgYXMgU2hhcGVdO1xuICAgIH1cbiAgICBsYXllclNoYXBlcyA9IGxheWVyU2hhcGVzIGFzIFNoYXBlW107XG5cbiAgICBsZXQgb3V0cHV0U2hhcGU6IFNoYXBlO1xuICAgIGxldCBvdXRwdXRTaGFwZXM6IFNoYXBlW107XG4gICAgbGV0IHN0YXRlU2hhcGU6IFNoYXBlW107XG4gICAgaWYgKHRoaXMucmV0dXJuU3RhdGUpIHtcbiAgICAgIHN0YXRlU2hhcGUgPSBsYXllclNoYXBlcy5zbGljZSgxKTtcbiAgICAgIG91dHB1dFNoYXBlID0gbGF5ZXJTaGFwZXNbMF07XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dFNoYXBlID0gbGF5ZXJTaGFwZXNbMF07XG4gICAgfVxuICAgIG91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgaWYgKHRoaXMubWVyZ2VNb2RlID09PSAnY29uY2F0Jykge1xuICAgICAgb3V0cHV0U2hhcGVbb3V0cHV0U2hhcGUubGVuZ3RoIC0gMV0gKj0gMjtcbiAgICAgIG91dHB1dFNoYXBlcyA9IFtvdXRwdXRTaGFwZV07XG4gICAgfSBlbHNlIGlmICh0aGlzLm1lcmdlTW9kZSA9PSBudWxsKSB7XG4gICAgICBvdXRwdXRTaGFwZXMgPSBbb3V0cHV0U2hhcGUsIG91dHB1dFNoYXBlLnNsaWNlKCldO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXRTaGFwZXMgPSBbb3V0cHV0U2hhcGVdO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJldHVyblN0YXRlKSB7XG4gICAgICBpZiAodGhpcy5tZXJnZU1vZGUgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gb3V0cHV0U2hhcGVzLmNvbmNhdChzdGF0ZVNoYXBlKS5jb25jYXQoc3RhdGVTaGFwZS5zbGljZSgpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbb3V0cHV0U2hhcGVdLmNvbmNhdChzdGF0ZVNoYXBlKS5jb25jYXQoc3RhdGVTaGFwZS5zbGljZSgpKTtcbiAgICB9XG4gICAgcmV0dXJuIGdlbmVyaWNfdXRpbHMuc2luZ2xldG9uT3JBcnJheShvdXRwdXRTaGFwZXMpO1xuICB9XG5cbiAgYXBwbHkoXG4gICAgICBpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxTeW1ib2xpY1RlbnNvcnxTeW1ib2xpY1RlbnNvcltdLFxuICAgICAga3dhcmdzPzogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdfFN5bWJvbGljVGVuc29yfFN5bWJvbGljVGVuc29yW10ge1xuICAgIGxldCBpbml0aWFsU3RhdGU6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuICAgIGxldCBjb25zdGFudHM6IFRlbnNvcltdfFN5bWJvbGljVGVuc29yW10gPVxuICAgICAgICBrd2FyZ3MgPT0gbnVsbCA/IG51bGwgOiBrd2FyZ3NbJ2NvbnN0YW50cyddO1xuICAgIGlmIChrd2FyZ3MgPT0gbnVsbCkge1xuICAgICAga3dhcmdzID0ge307XG4gICAgfVxuICAgIGNvbnN0IHN0YW5kYXJkaXplZCA9XG4gICAgICAgIHN0YW5kYXJkaXplQXJncyhpbnB1dHMsIGluaXRpYWxTdGF0ZSwgY29uc3RhbnRzLCB0aGlzLm51bUNvbnN0YW50cyk7XG4gICAgaW5wdXRzID0gc3RhbmRhcmRpemVkLmlucHV0cztcbiAgICBpbml0aWFsU3RhdGUgPSBzdGFuZGFyZGl6ZWQuaW5pdGlhbFN0YXRlO1xuICAgIGNvbnN0YW50cyA9IHN0YW5kYXJkaXplZC5jb25zdGFudHM7XG5cbiAgICBpZiAoQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgICBpbml0aWFsU3RhdGUgPSAoaW5wdXRzIGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXSkuc2xpY2UoMSk7XG4gICAgICBpbnB1dHMgPSAoaW5wdXRzIGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXSlbMF07XG4gICAgfVxuXG4gICAgaWYgKChpbml0aWFsU3RhdGUgPT0gbnVsbCB8fCBpbml0aWFsU3RhdGUubGVuZ3RoID09PSAwKSAmJlxuICAgICAgICBjb25zdGFudHMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHN1cGVyLmFwcGx5KGlucHV0cywga3dhcmdzKTtcbiAgICB9XG4gICAgY29uc3QgYWRkaXRpb25hbElucHV0czogQXJyYXk8VGVuc29yfFN5bWJvbGljVGVuc29yPiA9IFtdO1xuICAgIGNvbnN0IGFkZGl0aW9uYWxTcGVjczogSW5wdXRTcGVjW10gPSBbXTtcbiAgICBpZiAoaW5pdGlhbFN0YXRlICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG51bVN0YXRlcyA9IGluaXRpYWxTdGF0ZS5sZW5ndGg7XG4gICAgICBpZiAobnVtU3RhdGVzICUgMiA+IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFZhbHVlRXJyb3IoXG4gICAgICAgICAgICAnV2hlbiBwYXNzaW5nIGBpbml0aWFsU3RhdGVgIHRvIGEgQmlkcmVjdGlvbmFsIFJOTiwgJyArXG4gICAgICAgICAgICAndGhlIHN0YXRlIHNob3VsZCBiZSBhbiBBcnJheSBjb250YWluaW5nIHRoZSBzdGF0ZXMgb2YgJyArXG4gICAgICAgICAgICAndGhlIHVuZGVybHlpbmcgUk5Ocy4nKTtcbiAgICAgIH1cbiAgICAgIGt3YXJnc1snaW5pdGlhbFN0YXRlJ10gPSBpbml0aWFsU3RhdGU7XG4gICAgICBhZGRpdGlvbmFsSW5wdXRzLnB1c2goLi4uaW5pdGlhbFN0YXRlKTtcbiAgICAgIGNvbnN0IHN0YXRlU3BlY3MgPSAoaW5pdGlhbFN0YXRlIGFzIEFycmF5PFRlbnNvcnxTeW1ib2xpY1RlbnNvcj4pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoc3RhdGUgPT4gbmV3IElucHV0U3BlYyh7c2hhcGU6IHN0YXRlLnNoYXBlfSkpO1xuICAgICAgdGhpcy5mb3J3YXJkTGF5ZXIuc3RhdGVTcGVjID0gc3RhdGVTcGVjcy5zbGljZSgwLCBudW1TdGF0ZXMgLyAyKTtcbiAgICAgIHRoaXMuYmFja3dhcmRMYXllci5zdGF0ZVNwZWMgPSBzdGF0ZVNwZWNzLnNsaWNlKG51bVN0YXRlcyAvIDIpO1xuICAgICAgYWRkaXRpb25hbFNwZWNzLnB1c2goLi4uc3RhdGVTcGVjcyk7XG4gICAgfVxuICAgIGlmIChjb25zdGFudHMgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgJ1N1cHBvcnQgZm9yIGNvbnN0YW50cyBpbiBCaWRpcmVjdGlvbmFsIGxheWVycyBpcyBub3QgJyArXG4gICAgICAgICAgJ2ltcGxlbWVudGVkIHlldC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBpc1N5bWJvbGljVGVuc29yID0gYWRkaXRpb25hbElucHV0c1swXSBpbnN0YW5jZW9mIFN5bWJvbGljVGVuc29yO1xuICAgIGZvciAoY29uc3QgdGVuc29yIG9mIGFkZGl0aW9uYWxJbnB1dHMpIHtcbiAgICAgIGlmICh0ZW5zb3IgaW5zdGFuY2VvZiBTeW1ib2xpY1RlbnNvciAhPT0gaXNTeW1ib2xpY1RlbnNvcikge1xuICAgICAgICB0aHJvdyBuZXcgVmFsdWVFcnJvcihcbiAgICAgICAgICAgICdUaGUgaW5pdGlhbCBzdGF0ZSBvZiBhIEJpZGlyZWN0aW9uYWwgbGF5ZXIgY2Fubm90IGJlICcgK1xuICAgICAgICAgICAgJ3NwZWNpZmllZCBhcyBhIG1peCBvZiBzeW1ib2xpYyBhbmQgbm9uLXN5bWJvbGljIHRlbnNvcnMnKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaXNTeW1ib2xpY1RlbnNvcikge1xuICAgICAgLy8gQ29tcHV0ZSB0aGUgZnVsbCBpbnB1dCBhbmQgc3BlY3MsIGluY2x1ZGluZyB0aGUgc3RhdGVzLlxuICAgICAgY29uc3QgZnVsbElucHV0ID0gW2lucHV0c10uY29uY2F0KGFkZGl0aW9uYWxJbnB1dHMpO1xuICAgICAgY29uc3QgZnVsbElucHV0U3BlYyA9IHRoaXMuaW5wdXRTcGVjLmNvbmNhdChhZGRpdGlvbmFsU3BlY3MpO1xuICAgICAgLy8gUGVyZm9ybSB0aGUgY2FsbCB0ZW1wb3JhcmlseSBhbmQgcmVwbGFjZSBpbnB1dFNwZWMuXG4gICAgICAvLyBOb3RlOiB3aXRoIGluaXRpYWwgc3RhdGVzIHN5bWJvbGljIGNhbGxzIGFuZCBub24tc3ltYm9saWMgY2FsbHMgdG9cbiAgICAgIC8vIHRoaXMgbWV0aG9kIGRpZmZlciBpbiBob3cgdGhlIGluaXRpYWwgc3RhdGVzIGFyZSBwYXNzZWQuIEZvclxuICAgICAgLy8gc3ltYm9saWMgY2FsbHMsIHRoZSBpbml0aWFsIHN0YXRlcyBhcmUgcGFzc2VkIGluIHRoZSBmaXJzdCBhcmcsIGFzXG4gICAgICAvLyBhbiBBcnJheSBvZiBTeW1ib2xpY1RlbnNvcnM7IGZvciBub24tc3ltYm9saWMgY2FsbHMsIHRoZXkgYXJlXG4gICAgICAvLyBwYXNzZWQgaW4gdGhlIHNlY29uZCBhcmcgYXMgYSBwYXJ0IG9mIHRoZSBrd2FyZ3MuIEhlbmNlIHRoZSBuZWVkIHRvXG4gICAgICAvLyB0ZW1wb3JhcmlseSBtb2RpZnkgaW5wdXRTcGVjIGhlcmUuXG4gICAgICAvLyBUT0RPKGNhaXMpOiBNYWtlIHJlZmFjdG9yaW5nIHNvIHRoYXQgdGhpcyBoYWNreSBjb2RlIGJlbG93IGlzIG5vXG4gICAgICAvLyBsb25nZXIgbmVlZGVkLlxuICAgICAgY29uc3Qgb3JpZ2luYWxJbnB1dFNwZWMgPSB0aGlzLmlucHV0U3BlYztcbiAgICAgIHRoaXMuaW5wdXRTcGVjID0gZnVsbElucHV0U3BlYztcbiAgICAgIGNvbnN0IG91dHB1dCA9XG4gICAgICAgICAgc3VwZXIuYXBwbHkoZnVsbElucHV0IGFzIFRlbnNvcltdIHwgU3ltYm9saWNUZW5zb3JbXSwga3dhcmdzKTtcbiAgICAgIHRoaXMuaW5wdXRTcGVjID0gb3JpZ2luYWxJbnB1dFNwZWM7XG4gICAgICByZXR1cm4gb3V0cHV0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gc3VwZXIuYXBwbHkoaW5wdXRzLCBrd2FyZ3MpO1xuICAgIH1cbiAgfVxuXG4gIGNhbGwoaW5wdXRzOiBUZW5zb3J8VGVuc29yW10sIGt3YXJnczogS3dhcmdzKTogVGVuc29yfFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCBpbml0aWFsU3RhdGUgPSBrd2FyZ3NbJ2luaXRpYWxTdGF0ZSddO1xuXG4gICAgICBsZXQgeTogVGVuc29yfFRlbnNvcltdO1xuICAgICAgbGV0IHlSZXY6IFRlbnNvcnxUZW5zb3JbXTtcbiAgICAgIGlmIChpbml0aWFsU3RhdGUgPT0gbnVsbCkge1xuICAgICAgICB5ID0gdGhpcy5mb3J3YXJkTGF5ZXIuY2FsbChpbnB1dHMsIGt3YXJncyk7XG4gICAgICAgIHlSZXYgPSB0aGlzLmJhY2t3YXJkTGF5ZXIuY2FsbChpbnB1dHMsIGt3YXJncyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBmb3J3YXJkU3RhdGUgPSBpbml0aWFsU3RhdGUuc2xpY2UoMCwgaW5pdGlhbFN0YXRlLmxlbmd0aCAvIDIpO1xuICAgICAgICBjb25zdCBiYWNrd2FyZFN0YXRlID0gaW5pdGlhbFN0YXRlLnNsaWNlKGluaXRpYWxTdGF0ZS5sZW5ndGggLyAyKTtcbiAgICAgICAgeSA9IHRoaXMuZm9yd2FyZExheWVyLmNhbGwoXG4gICAgICAgICAgICBpbnB1dHMsIE9iamVjdC5hc3NpZ24oa3dhcmdzLCB7aW5pdGlhbFN0YXRlOiBmb3J3YXJkU3RhdGV9KSk7XG4gICAgICAgIHlSZXYgPSB0aGlzLmJhY2t3YXJkTGF5ZXIuY2FsbChcbiAgICAgICAgICAgIGlucHV0cywgT2JqZWN0LmFzc2lnbihrd2FyZ3MsIHtpbml0aWFsU3RhdGU6IGJhY2t3YXJkU3RhdGV9KSk7XG4gICAgICB9XG5cbiAgICAgIGxldCBzdGF0ZXM6IFRlbnNvcltdO1xuICAgICAgaWYgKHRoaXMucmV0dXJuU3RhdGUpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoeSkpIHtcbiAgICAgICAgICBzdGF0ZXMgPSB5LnNsaWNlKDEpLmNvbmNhdCgoeVJldiBhcyBUZW5zb3JbXSkuc2xpY2UoMSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICB9XG4gICAgICAgIHkgPSAoeSBhcyBUZW5zb3JbXSlbMF07XG4gICAgICAgIHlSZXYgPSAoeVJldiBhcyBUZW5zb3JbXSlbMF07XG4gICAgICB9XG5cbiAgICAgIGlmICh0aGlzLnJldHVyblNlcXVlbmNlcykge1xuICAgICAgICB5UmV2ID0gdGZjLnJldmVyc2UoeVJldiBhcyBUZW5zb3IsIDEpO1xuICAgICAgfVxuXG4gICAgICBsZXQgb3V0cHV0OiBUZW5zb3J8VGVuc29yW107XG4gICAgICBpZiAodGhpcy5tZXJnZU1vZGUgPT09ICdjb25jYXQnKSB7XG4gICAgICAgIG91dHB1dCA9IEsuY29uY2F0ZW5hdGUoW3kgYXMgVGVuc29yLCB5UmV2IGFzIFRlbnNvcl0pO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1lcmdlTW9kZSA9PT0gJ3N1bScpIHtcbiAgICAgICAgb3V0cHV0ID0gdGZjLmFkZCh5IGFzIFRlbnNvciwgeVJldiBhcyBUZW5zb3IpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLm1lcmdlTW9kZSA9PT0gJ2F2ZScpIHtcbiAgICAgICAgb3V0cHV0ID0gdGZjLm11bCguNSwgdGZjLmFkZCh5IGFzIFRlbnNvciwgeVJldiBhcyBUZW5zb3IpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXJnZU1vZGUgPT09ICdtdWwnKSB7XG4gICAgICAgIG91dHB1dCA9IHRmYy5tdWwoeSBhcyBUZW5zb3IsIHlSZXYgYXMgVGVuc29yKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5tZXJnZU1vZGUgPT0gbnVsbCkge1xuICAgICAgICBvdXRwdXQgPSBbeSBhcyBUZW5zb3IsIHlSZXYgYXMgVGVuc29yXTtcbiAgICAgIH1cblxuICAgICAgLy8gVE9ETyhjYWlzKTogUHJvcGVybHkgc2V0IGxlYXJuaW5nIHBoYXNlLlxuICAgICAgaWYgKHRoaXMucmV0dXJuU3RhdGUpIHtcbiAgICAgICAgaWYgKHRoaXMubWVyZ2VNb2RlID09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gKG91dHB1dCBhcyBUZW5zb3JbXSkuY29uY2F0KHN0YXRlcyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtvdXRwdXQgYXMgVGVuc29yXS5jb25jYXQoc3RhdGVzKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgfSk7XG4gIH1cblxuICByZXNldFN0YXRlcyhzdGF0ZXM/OiBUZW5zb3J8VGVuc29yW10pOiB2b2lkIHtcbiAgICB0aGlzLmZvcndhcmRMYXllci5yZXNldFN0YXRlcygpO1xuICAgIHRoaXMuYmFja3dhcmRMYXllci5yZXNldFN0YXRlcygpO1xuICB9XG5cbiAgYnVpbGQoaW5wdXRTaGFwZTogU2hhcGV8U2hhcGVbXSk6IHZvaWQge1xuICAgIG5hbWVTY29wZSh0aGlzLmZvcndhcmRMYXllci5uYW1lLCAoKSA9PiB7XG4gICAgICB0aGlzLmZvcndhcmRMYXllci5idWlsZChpbnB1dFNoYXBlKTtcbiAgICB9KTtcbiAgICBuYW1lU2NvcGUodGhpcy5iYWNrd2FyZExheWVyLm5hbWUsICgpID0+IHtcbiAgICAgIHRoaXMuYmFja3dhcmRMYXllci5idWlsZChpbnB1dFNoYXBlKTtcbiAgICB9KTtcbiAgICB0aGlzLmJ1aWx0ID0gdHJ1ZTtcbiAgfVxuXG4gIGNvbXB1dGVNYXNrKGlucHV0czogVGVuc29yfFRlbnNvcltdLCBtYXNrPzogVGVuc29yfFRlbnNvcltdKTogVGVuc29yXG4gICAgICB8VGVuc29yW10ge1xuICAgIGlmIChBcnJheS5pc0FycmF5KG1hc2spKSB7XG4gICAgICBtYXNrID0gbWFza1swXTtcbiAgICB9XG4gICAgbGV0IG91dHB1dE1hc2s6IFRlbnNvcnxUZW5zb3JbXTtcbiAgICBpZiAodGhpcy5yZXR1cm5TZXF1ZW5jZXMpIHtcbiAgICAgIGlmICh0aGlzLm1lcmdlTW9kZSA9PSBudWxsKSB7XG4gICAgICAgIG91dHB1dE1hc2sgPSBbbWFzaywgbWFza107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRwdXRNYXNrID0gbWFzaztcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHRoaXMubWVyZ2VNb2RlID09IG51bGwpIHtcbiAgICAgICAgb3V0cHV0TWFzayA9IFtudWxsLCBudWxsXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dHB1dE1hc2sgPSBudWxsO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodGhpcy5yZXR1cm5TdGF0ZSkge1xuICAgICAgY29uc3Qgc3RhdGVzID0gdGhpcy5mb3J3YXJkTGF5ZXIuc3RhdGVzO1xuICAgICAgY29uc3Qgc3RhdGVNYXNrOiBUZW5zb3JbXSA9IHN0YXRlcy5tYXAoc3RhdGUgPT4gbnVsbCk7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShvdXRwdXRNYXNrKSkge1xuICAgICAgICByZXR1cm4gb3V0cHV0TWFzay5jb25jYXQoc3RhdGVNYXNrKS5jb25jYXQoc3RhdGVNYXNrKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBbb3V0cHV0TWFza10uY29uY2F0KHN0YXRlTWFzaykuY29uY2F0KHN0YXRlTWFzayk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvdXRwdXRNYXNrO1xuICAgIH1cbiAgfVxuXG4gIGdldCB0cmFpbmFibGVXZWlnaHRzKCk6IExheWVyVmFyaWFibGVbXSB7XG4gICAgcmV0dXJuIHRoaXMuZm9yd2FyZExheWVyLnRyYWluYWJsZVdlaWdodHMuY29uY2F0KFxuICAgICAgICB0aGlzLmJhY2t3YXJkTGF5ZXIudHJhaW5hYmxlV2VpZ2h0cyk7XG4gIH1cblxuICBnZXQgbm9uVHJhaW5hYmxlV2VpZ2h0cygpOiBMYXllclZhcmlhYmxlW10ge1xuICAgIHJldHVybiB0aGlzLmZvcndhcmRMYXllci5ub25UcmFpbmFibGVXZWlnaHRzLmNvbmNhdChcbiAgICAgICAgdGhpcy5iYWNrd2FyZExheWVyLm5vblRyYWluYWJsZVdlaWdodHMpO1xuICB9XG5cbiAgLy8gVE9ETyhjYWlzKTogSW1wbGVtZW50IGNvbnN0cmFpbnRzKCkuXG5cbiAgc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCh2YWx1ZTogYm9vbGVhbikge1xuICAgIHN1cGVyLnNldEZhc3RXZWlnaHRJbml0RHVyaW5nQnVpbGQodmFsdWUpO1xuICAgIGlmICh0aGlzLmZvcndhcmRMYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmZvcndhcmRMYXllci5zZXRGYXN0V2VpZ2h0SW5pdER1cmluZ0J1aWxkKHZhbHVlKTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYmFja3dhcmRMYXllciAhPSBudWxsKSB7XG4gICAgICB0aGlzLmJhY2t3YXJkTGF5ZXIuc2V0RmFzdFdlaWdodEluaXREdXJpbmdCdWlsZCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0Q29uZmlnKCk6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCB7XG4gICAgY29uc3QgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QgPSB7XG4gICAgICAnbWVyZ2VNb2RlJzogdGhpcy5tZXJnZU1vZGUsXG4gICAgfTtcbiAgICAvLyBUT0RPKGNhaXMpOiBBZGQgbG9naWMgZm9yIGBudW1Db25zdGFudHNgIG9uY2UgdGhlIHByb3BlcnR5IGlzIGFkZGVkLlxuICAgIGNvbnN0IGJhc2VDb25maWcgPSBzdXBlci5nZXRDb25maWcoKTtcbiAgICBPYmplY3QuYXNzaWduKGNvbmZpZywgYmFzZUNvbmZpZyk7XG4gICAgcmV0dXJuIGNvbmZpZztcbiAgfVxuXG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgZnJvbUNvbmZpZzxUIGV4dGVuZHMgc2VyaWFsaXphdGlvbi5TZXJpYWxpemFibGU+KFxuICAgICAgY2xzOiBzZXJpYWxpemF0aW9uLlNlcmlhbGl6YWJsZUNvbnN0cnVjdG9yPFQ+LFxuICAgICAgY29uZmlnOiBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QpOiBUIHtcbiAgICBjb25zdCBybm5MYXllciA9XG4gICAgICAgIGRlc2VyaWFsaXplKGNvbmZpZ1snbGF5ZXInXSBhcyBzZXJpYWxpemF0aW9uLkNvbmZpZ0RpY3QpIGFzIFJOTjtcbiAgICBkZWxldGUgY29uZmlnWydsYXllciddO1xuICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBsb2dpYyBmb3IgYG51bUNvbnN0YW50c2Agb25jZSB0aGUgcHJvcGVydHkgaXMgYWRkZWQuXG4gICAgaWYgKGNvbmZpZ1snbnVtQ29uc3RhbnRzJ10gIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoXG4gICAgICAgICAgYERlc2VyaWFsaXphdGlvbiBvZiBhIEJpZGlyZWN0aW9uYWwgbGF5ZXIgd2l0aCBudW1Db25zdGFudHMgYCArXG4gICAgICAgICAgYHByZXNlbnQgaXMgbm90IHN1cHBvcnRlZCB5ZXQuYCk7XG4gICAgfVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBjb25zdCBuZXdDb25maWc6IHtba2V5OiBzdHJpbmddOiBhbnl9ID0gY29uZmlnO1xuICAgIG5ld0NvbmZpZ1snbGF5ZXInXSA9IHJubkxheWVyO1xuICAgIHJldHVybiBuZXcgY2xzKG5ld0NvbmZpZyk7XG4gIH1cbn1cbnNlcmlhbGl6YXRpb24ucmVnaXN0ZXJDbGFzcyhCaWRpcmVjdGlvbmFsKTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 CodeSmith LLC\n *\n * Use of this source code is governed by an MIT-style\n * license that can be found in the LICENSE file or at\n * https://opensource.org/licenses/MIT.\n * =============================================================================\n */\nimport { Layer } from '../../engine/topology';\nimport { serialization, mul, add, tidy } from '@tensorflow/tfjs-core';\nimport { getExactlyOneTensor } from '../../utils/types_utils';\nimport * as K from '../../backend/tfjs_backend';\n/**\n * Preprocessing Rescaling Layer\n *\n * This rescales images by a scaling and offset factor\n */\nexport class Rescaling extends Layer {\n    constructor(args) {\n        super(args);\n        this.scale = args.scale;\n        if (args.offset) {\n            this.offset = args.offset;\n        }\n        else {\n            this.offset = 0;\n        }\n    }\n    getConfig() {\n        const config = {\n            'scale': this.scale,\n            'offset': this.offset\n        };\n        const baseConfig = super.getConfig();\n        Object.assign(config, baseConfig);\n        return config;\n    }\n    call(inputs, kwargs) {\n        return tidy(() => {\n            inputs = getExactlyOneTensor(inputs);\n            if (inputs.dtype !== 'float32') {\n                inputs = K.cast(inputs, 'float32');\n            }\n            return add(mul(inputs, this.scale), this.offset);\n        });\n    }\n}\n/** @nocollapse */\nRescaling.className = 'Rescaling';\nserialization.registerClass(Rescaling);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VfcHJlcHJvY2Vzc2luZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtbGF5ZXJzL3NyYy9sYXllcnMvcHJlcHJvY2Vzc2luZy9pbWFnZV9wcmVwcm9jZXNzaW5nLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7OztHQVFHO0FBRUgsT0FBTyxFQUFZLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxhQUFhLEVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM5RCxPQUFPLEtBQUssQ0FBQyxNQUFNLDRCQUE0QixDQUFDO0FBUWhEOzs7O0dBSUc7QUFDSCxNQUFNLE9BQU8sU0FBVSxTQUFRLEtBQUs7SUFLbEMsWUFBWSxJQUFtQjtRQUM3QixLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFWixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFeEIsSUFBRyxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ2hCLElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztTQUN6QjthQUFNO1lBQ0wsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7U0FDakI7SUFDSCxDQUFDO0lBRUQsU0FBUztRQUNQLE1BQU0sTUFBTSxHQUE2QjtZQUN2QyxPQUFPLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDbkIsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNO1NBQ3RCLENBQUM7UUFFRixNQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7UUFDckMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDbEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVELElBQUksQ0FBQyxNQUF1QixFQUFFLE1BQWM7UUFDMUMsT0FBTyxJQUFJLENBQUMsR0FBRyxFQUFFO1lBQ2YsTUFBTSxHQUFHLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ3JDLElBQUcsTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7Z0JBQzNCLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQzthQUN0QztZQUNELE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7O0FBbkNELGtCQUFrQjtBQUNYLG1CQUFTLEdBQUcsV0FBVyxDQUFDO0FBcUNqQyxhQUFhLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgQ29kZVNtaXRoIExMQ1xuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZVxuICogbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIG9yIGF0XG4gKiBodHRwczovL29wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL01JVC5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtMYXllckFyZ3MsIExheWVyfSBmcm9tICcuLi8uLi9lbmdpbmUvdG9wb2xvZ3knO1xuaW1wb3J0IHsgc2VyaWFsaXphdGlvbiwgVGVuc29yLCBtdWwsIGFkZCwgdGlkeSB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgeyBnZXRFeGFjdGx5T25lVGVuc29yIH0gZnJvbSAnLi4vLi4vdXRpbHMvdHlwZXNfdXRpbHMnO1xuaW1wb3J0ICogYXMgSyBmcm9tICcuLi8uLi9iYWNrZW5kL3RmanNfYmFja2VuZCc7XG5pbXBvcnQgeyBLd2FyZ3MgfSBmcm9tICcuLi8uLi90eXBlcyc7XG5cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBSZXNjYWxpbmdBcmdzIGV4dGVuZHMgTGF5ZXJBcmdzIHtcbiAgc2NhbGU6IG51bWJlcjtcbiAgb2Zmc2V0PzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFByZXByb2Nlc3NpbmcgUmVzY2FsaW5nIExheWVyXG4gKlxuICogVGhpcyByZXNjYWxlcyBpbWFnZXMgYnkgYSBzY2FsaW5nIGFuZCBvZmZzZXQgZmFjdG9yXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNjYWxpbmcgZXh0ZW5kcyBMYXllciB7XG4gIC8qKiBAbm9jb2xsYXBzZSAqL1xuICBzdGF0aWMgY2xhc3NOYW1lID0gJ1Jlc2NhbGluZyc7XG4gIHByaXZhdGUgcmVhZG9ubHkgc2NhbGU6IG51bWJlcjtcbiAgcHJpdmF0ZSByZWFkb25seSBvZmZzZXQ6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoYXJnczogUmVzY2FsaW5nQXJncykge1xuICAgIHN1cGVyKGFyZ3MpO1xuXG4gICAgdGhpcy5zY2FsZSA9IGFyZ3Muc2NhbGU7XG5cbiAgICBpZihhcmdzLm9mZnNldCkge1xuICAgIHRoaXMub2Zmc2V0ID0gYXJncy5vZmZzZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub2Zmc2V0ID0gMDtcbiAgICB9XG4gIH1cblxuICBnZXRDb25maWcoKTogc2VyaWFsaXphdGlvbi5Db25maWdEaWN0IHtcbiAgICBjb25zdCBjb25maWc6IHNlcmlhbGl6YXRpb24uQ29uZmlnRGljdCA9IHtcbiAgICAgICdzY2FsZSc6IHRoaXMuc2NhbGUsXG4gICAgICAnb2Zmc2V0JzogdGhpcy5vZmZzZXRcbiAgICB9O1xuXG4gICAgY29uc3QgYmFzZUNvbmZpZyA9IHN1cGVyLmdldENvbmZpZygpO1xuICAgIE9iamVjdC5hc3NpZ24oY29uZmlnLCBiYXNlQ29uZmlnKTtcbiAgICByZXR1cm4gY29uZmlnO1xuICB9XG5cbiAgY2FsbChpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXSwga3dhcmdzOiBLd2FyZ3MpOiBUZW5zb3JbXXxUZW5zb3Ige1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGlucHV0cyA9IGdldEV4YWN0bHlPbmVUZW5zb3IoaW5wdXRzKTtcbiAgICAgIGlmKGlucHV0cy5kdHlwZSAhPT0gJ2Zsb2F0MzInKSB7XG4gICAgICAgICAgaW5wdXRzID0gSy5jYXN0KGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhZGQobXVsKGlucHV0cywgdGhpcy5zY2FsZSksIHRoaXMub2Zmc2V0KTtcbiAgICB9KTtcbiAgfVxufVxuXG5zZXJpYWxpemF0aW9uLnJlZ2lzdGVyQ2xhc3MoUmVzY2FsaW5nKTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nconst ENV = env();\n/** Whether to keep intermediate tensors. */\nENV.registerFlag('KEEP_INTERMEDIATE_TENSORS', () => false, debugValue => {\n    if (debugValue) {\n        console.warn('Keep intermediate tensors is ON. This will print the values of all ' +\n            'intermediate tensors during model inference. Not all models ' +\n            'support this mode. For details, check e2e/benchmarks/ ' +\n            'model_config.js. This significantly impacts performance.');\n    }\n});\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3MuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZmxhZ3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFDLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBRWxCLDRDQUE0QztBQUM1QyxHQUFHLENBQUMsWUFBWSxDQUFDLDJCQUEyQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsRUFBRTtJQUN0RSxJQUFJLFVBQVUsRUFBRTtRQUNkLE9BQU8sQ0FBQyxJQUFJLENBQ1IscUVBQXFFO1lBQ3JFLDhEQUE4RDtZQUM5RCx3REFBd0Q7WUFDeEQsMERBQTBELENBQUMsQ0FBQztLQUNqRTtBQUNILENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3QgRU5WID0gZW52KCk7XG5cbi8qKiBXaGV0aGVyIHRvIGtlZXAgaW50ZXJtZWRpYXRlIHRlbnNvcnMuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdLRUVQX0lOVEVSTUVESUFURV9URU5TT1JTJywgKCkgPT4gZmFsc2UsIGRlYnVnVmFsdWUgPT4ge1xuICBpZiAoZGVidWdWYWx1ZSkge1xuICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ0tlZXAgaW50ZXJtZWRpYXRlIHRlbnNvcnMgaXMgT04uIFRoaXMgd2lsbCBwcmludCB0aGUgdmFsdWVzIG9mIGFsbCAnICtcbiAgICAgICAgJ2ludGVybWVkaWF0ZSB0ZW5zb3JzIGR1cmluZyBtb2RlbCBpbmZlcmVuY2UuIE5vdCBhbGwgbW9kZWxzICcgK1xuICAgICAgICAnc3VwcG9ydCB0aGlzIG1vZGUuIEZvciBkZXRhaWxzLCBjaGVjayBlMmUvYmVuY2htYXJrcy8gJyArXG4gICAgICAgICdtb2RlbF9jb25maWcuanMuIFRoaXMgc2lnbmlmaWNhbnRseSBpbXBhY3RzIHBlcmZvcm1hbmNlLicpO1xuICB9XG59KTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\n/** DataType enum. */\nexport var DataType;\n(function (DataType) {\n    // Not a legal value for DataType.  Used to indicate a DataType field\n    // has not been set.\n    DataType[DataType[\"DT_INVALID\"] = 0] = \"DT_INVALID\";\n    // Data types that all computation devices are expected to be\n    // capable to support.\n    DataType[DataType[\"DT_FLOAT\"] = 1] = \"DT_FLOAT\";\n    DataType[DataType[\"DT_DOUBLE\"] = 2] = \"DT_DOUBLE\";\n    DataType[DataType[\"DT_INT32\"] = 3] = \"DT_INT32\";\n    DataType[DataType[\"DT_UINT8\"] = 4] = \"DT_UINT8\";\n    DataType[DataType[\"DT_INT16\"] = 5] = \"DT_INT16\";\n    DataType[DataType[\"DT_INT8\"] = 6] = \"DT_INT8\";\n    DataType[DataType[\"DT_STRING\"] = 7] = \"DT_STRING\";\n    DataType[DataType[\"DT_COMPLEX64\"] = 8] = \"DT_COMPLEX64\";\n    DataType[DataType[\"DT_INT64\"] = 9] = \"DT_INT64\";\n    DataType[DataType[\"DT_BOOL\"] = 10] = \"DT_BOOL\";\n    DataType[DataType[\"DT_QINT8\"] = 11] = \"DT_QINT8\";\n    DataType[DataType[\"DT_QUINT8\"] = 12] = \"DT_QUINT8\";\n    DataType[DataType[\"DT_QINT32\"] = 13] = \"DT_QINT32\";\n    DataType[DataType[\"DT_BFLOAT16\"] = 14] = \"DT_BFLOAT16\";\n    DataType[DataType[\"DT_QINT16\"] = 15] = \"DT_QINT16\";\n    DataType[DataType[\"DT_QUINT16\"] = 16] = \"DT_QUINT16\";\n    DataType[DataType[\"DT_UINT16\"] = 17] = \"DT_UINT16\";\n    DataType[DataType[\"DT_COMPLEX128\"] = 18] = \"DT_COMPLEX128\";\n    DataType[DataType[\"DT_HALF\"] = 19] = \"DT_HALF\";\n    DataType[DataType[\"DT_RESOURCE\"] = 20] = \"DT_RESOURCE\";\n    DataType[DataType[\"DT_VARIANT\"] = 21] = \"DT_VARIANT\";\n    DataType[DataType[\"DT_UINT32\"] = 22] = \"DT_UINT32\";\n    DataType[DataType[\"DT_UINT64\"] = 23] = \"DT_UINT64\";\n    // Do not use!  These are only for parameters.  Every enum above\n    // should have a corresponding value below (verified by types_test).\n    DataType[DataType[\"DT_FLOAT_REF\"] = 101] = \"DT_FLOAT_REF\";\n    DataType[DataType[\"DT_DOUBLE_REF\"] = 102] = \"DT_DOUBLE_REF\";\n    DataType[DataType[\"DT_INT32_REF\"] = 103] = \"DT_INT32_REF\";\n    DataType[DataType[\"DT_UINT8_REF\"] = 104] = \"DT_UINT8_REF\";\n    DataType[DataType[\"DT_INT16_REF\"] = 105] = \"DT_INT16_REF\";\n    DataType[DataType[\"DT_INT8_REF\"] = 106] = \"DT_INT8_REF\";\n    DataType[DataType[\"DT_STRING_REF\"] = 107] = \"DT_STRING_REF\";\n    DataType[DataType[\"DT_COMPLEX64_REF\"] = 108] = \"DT_COMPLEX64_REF\";\n    DataType[DataType[\"DT_INT64_REF\"] = 109] = \"DT_INT64_REF\";\n    DataType[DataType[\"DT_BOOL_REF\"] = 110] = \"DT_BOOL_REF\";\n    DataType[DataType[\"DT_QINT8_REF\"] = 111] = \"DT_QINT8_REF\";\n    DataType[DataType[\"DT_QUINT8_REF\"] = 112] = \"DT_QUINT8_REF\";\n    DataType[DataType[\"DT_QINT32_REF\"] = 113] = \"DT_QINT32_REF\";\n    DataType[DataType[\"DT_BFLOAT16_REF\"] = 114] = \"DT_BFLOAT16_REF\";\n    DataType[DataType[\"DT_QINT16_REF\"] = 115] = \"DT_QINT16_REF\";\n    DataType[DataType[\"DT_QUINT16_REF\"] = 116] = \"DT_QUINT16_REF\";\n    DataType[DataType[\"DT_UINT16_REF\"] = 117] = \"DT_UINT16_REF\";\n    DataType[DataType[\"DT_COMPLEX128_REF\"] = 118] = \"DT_COMPLEX128_REF\";\n    DataType[DataType[\"DT_HALF_REF\"] = 119] = \"DT_HALF_REF\";\n    DataType[DataType[\"DT_RESOURCE_REF\"] = 120] = \"DT_RESOURCE_REF\";\n    DataType[DataType[\"DT_VARIANT_REF\"] = 121] = \"DT_VARIANT_REF\";\n    DataType[DataType[\"DT_UINT32_REF\"] = 122] = \"DT_UINT32_REF\";\n    DataType[DataType[\"DT_UINT64_REF\"] = 123] = \"DT_UINT64_REF\";\n})(DataType || (DataType = {}));\nexport var SaverDef;\n(function (SaverDef) {\n    /** CheckpointFormatVersion enum. */\n    let CheckpointFormatVersion;\n    (function (CheckpointFormatVersion) {\n        CheckpointFormatVersion[CheckpointFormatVersion[\"LEGACY\"] = 0] = \"LEGACY\";\n        CheckpointFormatVersion[CheckpointFormatVersion[\"V1\"] = 1] = \"V1\";\n        CheckpointFormatVersion[CheckpointFormatVersion[\"V2\"] = 2] = \"V2\";\n    })(CheckpointFormatVersion = SaverDef.CheckpointFormatVersion || (SaverDef.CheckpointFormatVersion = {}));\n})(SaverDef || (SaverDef = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGlsZWRfYXBpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL2RhdGEvY29tcGlsZWRfYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7O0dBZ0JHO0FBYUgscUJBQXFCO0FBQ3JCLE1BQU0sQ0FBTixJQUFZLFFBd0RYO0FBeERELFdBQVksUUFBUTtJQUNsQixxRUFBcUU7SUFDckUsb0JBQW9CO0lBQ3BCLG1EQUFjLENBQUE7SUFFZCw2REFBNkQ7SUFDN0Qsc0JBQXNCO0lBQ3RCLCtDQUFZLENBQUE7SUFDWixpREFBYSxDQUFBO0lBQ2IsK0NBQVksQ0FBQTtJQUNaLCtDQUFZLENBQUE7SUFDWiwrQ0FBWSxDQUFBO0lBQ1osNkNBQVcsQ0FBQTtJQUNYLGlEQUFhLENBQUE7SUFDYix1REFBZ0IsQ0FBQTtJQUNoQiwrQ0FBWSxDQUFBO0lBQ1osOENBQVksQ0FBQTtJQUNaLGdEQUFhLENBQUE7SUFDYixrREFBYyxDQUFBO0lBQ2Qsa0RBQWMsQ0FBQTtJQUNkLHNEQUFnQixDQUFBO0lBQ2hCLGtEQUFjLENBQUE7SUFDZCxvREFBZSxDQUFBO0lBQ2Ysa0RBQWMsQ0FBQTtJQUNkLDBEQUFrQixDQUFBO0lBQ2xCLDhDQUFZLENBQUE7SUFDWixzREFBZ0IsQ0FBQTtJQUNoQixvREFBZSxDQUFBO0lBQ2Ysa0RBQWMsQ0FBQTtJQUNkLGtEQUFjLENBQUE7SUFFZCxnRUFBZ0U7SUFDaEUsb0VBQW9FO0lBQ3BFLHlEQUFrQixDQUFBO0lBQ2xCLDJEQUFtQixDQUFBO0lBQ25CLHlEQUFrQixDQUFBO0lBQ2xCLHlEQUFrQixDQUFBO0lBQ2xCLHlEQUFrQixDQUFBO0lBQ2xCLHVEQUFpQixDQUFBO0lBQ2pCLDJEQUFtQixDQUFBO0lBQ25CLGlFQUFzQixDQUFBO0lBQ3RCLHlEQUFrQixDQUFBO0lBQ2xCLHVEQUFpQixDQUFBO0lBQ2pCLHlEQUFrQixDQUFBO0lBQ2xCLDJEQUFtQixDQUFBO0lBQ25CLDJEQUFtQixDQUFBO0lBQ25CLCtEQUFxQixDQUFBO0lBQ3JCLDJEQUFtQixDQUFBO0lBQ25CLDZEQUFvQixDQUFBO0lBQ3BCLDJEQUFtQixDQUFBO0lBQ25CLG1FQUF1QixDQUFBO0lBQ3ZCLHVEQUFpQixDQUFBO0lBQ2pCLCtEQUFxQixDQUFBO0lBQ3JCLDZEQUFvQixDQUFBO0lBQ3BCLDJEQUFtQixDQUFBO0lBQ25CLDJEQUFtQixDQUFBO0FBQ3JCLENBQUMsRUF4RFcsUUFBUSxLQUFSLFFBQVEsUUF3RG5CO0FBMlBELE1BQU0sS0FBVyxRQUFRLENBR3hCO0FBSEQsV0FBaUIsUUFBUTtJQUN2QixvQ0FBb0M7SUFDcEMsSUFBWSx1QkFBMEQ7SUFBdEUsV0FBWSx1QkFBdUI7UUFBRSx5RUFBWSxDQUFBO1FBQUUsaUVBQVEsQ0FBQTtRQUFFLGlFQUFRLENBQUE7SUFBQSxDQUFDLEVBQTFELHVCQUF1QixHQUF2QixnQ0FBdUIsS0FBdkIsZ0NBQXVCLFFBQW1DO0FBQ3hFLENBQUMsRUFIZ0IsUUFBUSxLQUFSLFFBQVEsUUFHeEIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vKiB0c2xpbnQ6ZGlzYWJsZSAqL1xuXG4vKiogUHJvcGVydGllcyBvZiBhbiBBbnkuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUFueSB7XG4gIC8qKiBBbnkgdHlwZVVybCAqL1xuICB0eXBlVXJsPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogQW55IHZhbHVlICovXG4gIHZhbHVlPzogKFVpbnQ4QXJyYXl8bnVsbCk7XG59XG5cbi8qKiBEYXRhVHlwZSBlbnVtLiAqL1xuZXhwb3J0IGVudW0gRGF0YVR5cGUge1xuICAvLyBOb3QgYSBsZWdhbCB2YWx1ZSBmb3IgRGF0YVR5cGUuICBVc2VkIHRvIGluZGljYXRlIGEgRGF0YVR5cGUgZmllbGRcbiAgLy8gaGFzIG5vdCBiZWVuIHNldC5cbiAgRFRfSU5WQUxJRCA9IDAsXG5cbiAgLy8gRGF0YSB0eXBlcyB0aGF0IGFsbCBjb21wdXRhdGlvbiBkZXZpY2VzIGFyZSBleHBlY3RlZCB0byBiZVxuICAvLyBjYXBhYmxlIHRvIHN1cHBvcnQuXG4gIERUX0ZMT0FUID0gMSxcbiAgRFRfRE9VQkxFID0gMixcbiAgRFRfSU5UMzIgPSAzLFxuICBEVF9VSU5UOCA9IDQsXG4gIERUX0lOVDE2ID0gNSxcbiAgRFRfSU5UOCA9IDYsXG4gIERUX1NUUklORyA9IDcsXG4gIERUX0NPTVBMRVg2NCA9IDgsICAvLyBTaW5nbGUtcHJlY2lzaW9uIGNvbXBsZXhcbiAgRFRfSU5UNjQgPSA5LFxuICBEVF9CT09MID0gMTAsXG4gIERUX1FJTlQ4ID0gMTEsICAgICAvLyBRdWFudGl6ZWQgaW50OFxuICBEVF9RVUlOVDggPSAxMiwgICAgLy8gUXVhbnRpemVkIHVpbnQ4XG4gIERUX1FJTlQzMiA9IDEzLCAgICAvLyBRdWFudGl6ZWQgaW50MzJcbiAgRFRfQkZMT0FUMTYgPSAxNCwgIC8vIEZsb2F0MzIgdHJ1bmNhdGVkIHRvIDE2IGJpdHMuICBPbmx5IGZvciBjYXN0IG9wcy5cbiAgRFRfUUlOVDE2ID0gMTUsICAgIC8vIFF1YW50aXplZCBpbnQxNlxuICBEVF9RVUlOVDE2ID0gMTYsICAgLy8gUXVhbnRpemVkIHVpbnQxNlxuICBEVF9VSU5UMTYgPSAxNyxcbiAgRFRfQ09NUExFWDEyOCA9IDE4LCAgLy8gRG91YmxlLXByZWNpc2lvbiBjb21wbGV4XG4gIERUX0hBTEYgPSAxOSxcbiAgRFRfUkVTT1VSQ0UgPSAyMCxcbiAgRFRfVkFSSUFOVCA9IDIxLCAgLy8gQXJiaXRyYXJ5IEMrKyBkYXRhIHR5cGVzXG4gIERUX1VJTlQzMiA9IDIyLFxuICBEVF9VSU5UNjQgPSAyMyxcblxuICAvLyBEbyBub3QgdXNlISAgVGhlc2UgYXJlIG9ubHkgZm9yIHBhcmFtZXRlcnMuICBFdmVyeSBlbnVtIGFib3ZlXG4gIC8vIHNob3VsZCBoYXZlIGEgY29ycmVzcG9uZGluZyB2YWx1ZSBiZWxvdyAodmVyaWZpZWQgYnkgdHlwZXNfdGVzdCkuXG4gIERUX0ZMT0FUX1JFRiA9IDEwMSxcbiAgRFRfRE9VQkxFX1JFRiA9IDEwMixcbiAgRFRfSU5UMzJfUkVGID0gMTAzLFxuICBEVF9VSU5UOF9SRUYgPSAxMDQsXG4gIERUX0lOVDE2X1JFRiA9IDEwNSxcbiAgRFRfSU5UOF9SRUYgPSAxMDYsXG4gIERUX1NUUklOR19SRUYgPSAxMDcsXG4gIERUX0NPTVBMRVg2NF9SRUYgPSAxMDgsXG4gIERUX0lOVDY0X1JFRiA9IDEwOSxcbiAgRFRfQk9PTF9SRUYgPSAxMTAsXG4gIERUX1FJTlQ4X1JFRiA9IDExMSxcbiAgRFRfUVVJTlQ4X1JFRiA9IDExMixcbiAgRFRfUUlOVDMyX1JFRiA9IDExMyxcbiAgRFRfQkZMT0FUMTZfUkVGID0gMTE0LFxuICBEVF9RSU5UMTZfUkVGID0gMTE1LFxuICBEVF9RVUlOVDE2X1JFRiA9IDExNixcbiAgRFRfVUlOVDE2X1JFRiA9IDExNyxcbiAgRFRfQ09NUExFWDEyOF9SRUYgPSAxMTgsXG4gIERUX0hBTEZfUkVGID0gMTE5LFxuICBEVF9SRVNPVVJDRV9SRUYgPSAxMjAsXG4gIERUX1ZBUklBTlRfUkVGID0gMTIxLFxuICBEVF9VSU5UMzJfUkVGID0gMTIyLFxuICBEVF9VSU5UNjRfUkVGID0gMTIzLFxufVxuXG4vKiogUHJvcGVydGllcyBvZiBhIFRlbnNvclNoYXBlLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElUZW5zb3JTaGFwZSB7XG4gIC8qKiBUZW5zb3JTaGFwZSBkaW0gKi9cbiAgZGltPzogKFRlbnNvclNoYXBlLklEaW1bXXxudWxsKTtcblxuICAvKiogVGVuc29yU2hhcGUgdW5rbm93blJhbmsgKi9cbiAgdW5rbm93blJhbms/OiAoYm9vbGVhbnxudWxsKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUZW5zb3JTaGFwZSB7XG4gIC8qKiBQcm9wZXJ0aWVzIG9mIGEgRGltLiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSURpbSB7XG4gICAgLyoqIERpbSBzaXplICovXG4gICAgc2l6ZT86IChudW1iZXJ8c3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIERpbSBuYW1lICovXG4gICAgbmFtZT86IChzdHJpbmd8bnVsbCk7XG4gIH1cbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBUZW5zb3IuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSVRlbnNvciB7XG4gIC8qKiBUZW5zb3IgZHR5cGUgKi9cbiAgZHR5cGU/OiAoRGF0YVR5cGV8bnVsbCk7XG5cbiAgLyoqIFRlbnNvciB0ZW5zb3JTaGFwZSAqL1xuICB0ZW5zb3JTaGFwZT86IChJVGVuc29yU2hhcGV8bnVsbCk7XG5cbiAgLyoqIFRlbnNvciB2ZXJzaW9uTnVtYmVyICovXG4gIHZlcnNpb25OdW1iZXI/OiAobnVtYmVyfG51bGwpO1xuXG4gIC8qKiBUZW5zb3IgdGVuc29yQ29udGVudCAqL1xuICB0ZW5zb3JDb250ZW50PzogKFVpbnQ4QXJyYXl8bnVsbCk7XG5cbiAgLyoqIFRlbnNvciBmbG9hdFZhbCAqL1xuICBmbG9hdFZhbD86IChudW1iZXJbXXxudWxsKTtcblxuICAvKiogVGVuc29yIGRvdWJsZVZhbCAqL1xuICBkb3VibGVWYWw/OiAobnVtYmVyW118bnVsbCk7XG5cbiAgLyoqIFRlbnNvciBpbnRWYWwgKi9cbiAgaW50VmFsPzogKG51bWJlcltdfG51bGwpO1xuXG4gIC8qKiBUZW5zb3Igc3RyaW5nVmFsICovXG4gIHN0cmluZ1ZhbD86IChVaW50OEFycmF5W118bnVsbCk7XG5cbiAgLyoqIFRlbnNvciBzY29tcGxleFZhbCAqL1xuICBzY29tcGxleFZhbD86IChudW1iZXJbXXxudWxsKTtcblxuICAvKiogVGVuc29yIGludDY0VmFsICovXG4gIGludDY0VmFsPzogKChudW1iZXIgfCBzdHJpbmcpW118bnVsbCk7XG5cbiAgLyoqIFRlbnNvciBib29sVmFsICovXG4gIGJvb2xWYWw/OiAoYm9vbGVhbltdfG51bGwpO1xuXG4gIC8qKiBUZW5zb3IgdWludDMyVmFsICovXG4gIHVpbnQzMlZhbD86IChudW1iZXJbXXxudWxsKTtcblxuICAvKiogVGVuc29yIHVpbnQ2NFZhbCAqL1xuICB1aW50NjRWYWw/OiAoKG51bWJlciB8IHN0cmluZylbXXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYW4gQXR0clZhbHVlLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElBdHRyVmFsdWUge1xuICAvKiogQXR0clZhbHVlIGxpc3QgKi9cbiAgbGlzdD86IChBdHRyVmFsdWUuSUxpc3RWYWx1ZXxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHMgKi9cbiAgcz86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIEF0dHJWYWx1ZSBpICovXG4gIGk/OiAobnVtYmVyfHN0cmluZ3xudWxsKTtcblxuICAvKiogQXR0clZhbHVlIGYgKi9cbiAgZj86IChudW1iZXJ8bnVsbCk7XG5cbiAgLyoqIEF0dHJWYWx1ZSBiICovXG4gIGI/OiAoYm9vbGVhbnxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHR5cGUgKi9cbiAgdHlwZT86IChEYXRhVHlwZXxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHNoYXBlICovXG4gIHNoYXBlPzogKElUZW5zb3JTaGFwZXxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHRlbnNvciAqL1xuICB0ZW5zb3I/OiAoSVRlbnNvcnxudWxsKTtcblxuICAvKiogQXR0clZhbHVlIHBsYWNlaG9sZGVyICovXG4gIHBsYWNlaG9sZGVyPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogQXR0clZhbHVlIGZ1bmMgKi9cbiAgZnVuYz86IChJTmFtZUF0dHJMaXN0fG51bGwpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIEF0dHJWYWx1ZSB7XG4gIC8qKiBQcm9wZXJ0aWVzIG9mIGEgTGlzdFZhbHVlLiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUxpc3RWYWx1ZSB7XG4gICAgLyoqIExpc3RWYWx1ZSBzICovXG4gICAgcz86IChzdHJpbmdbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgaSAqL1xuICAgIGk/OiAoKG51bWJlciB8IHN0cmluZylbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgZiAqL1xuICAgIGY/OiAobnVtYmVyW118bnVsbCk7XG5cbiAgICAvKiogTGlzdFZhbHVlIGIgKi9cbiAgICBiPzogKGJvb2xlYW5bXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgdHlwZSAqL1xuICAgIHR5cGU/OiAoRGF0YVR5cGVbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgc2hhcGUgKi9cbiAgICBzaGFwZT86IChJVGVuc29yU2hhcGVbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgdGVuc29yICovXG4gICAgdGVuc29yPzogKElUZW5zb3JbXXxudWxsKTtcblxuICAgIC8qKiBMaXN0VmFsdWUgZnVuYyAqL1xuICAgIGZ1bmM/OiAoSU5hbWVBdHRyTGlzdFtdfG51bGwpO1xuICB9XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgTmFtZUF0dHJMaXN0LiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElOYW1lQXR0ckxpc3Qge1xuICAvKiogTmFtZUF0dHJMaXN0IG5hbWUgKi9cbiAgbmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIE5hbWVBdHRyTGlzdCBhdHRyICovXG4gIGF0dHI/OiAoe1trOiBzdHJpbmddOiBJQXR0clZhbHVlfXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBOb2RlRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElOb2RlRGVmIHtcbiAgLyoqIE5vZGVEZWYgbmFtZSAqL1xuICBuYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogTm9kZURlZiBvcCAqL1xuICBvcD86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIE5vZGVEZWYgaW5wdXQgKi9cbiAgaW5wdXQ/OiAoc3RyaW5nW118bnVsbCk7XG5cbiAgLyoqIE5vZGVEZWYgZGV2aWNlICovXG4gIGRldmljZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIE5vZGVEZWYgYXR0ciAqL1xuICBhdHRyPzogKHtbazogc3RyaW5nXTogSUF0dHJWYWx1ZX18bnVsbCk7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgVmVyc2lvbkRlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJVmVyc2lvbkRlZiB7XG4gIC8qKiBWZXJzaW9uRGVmIHByb2R1Y2VyICovXG4gIHByb2R1Y2VyPzogKG51bWJlcnxudWxsKTtcblxuICAvKiogVmVyc2lvbkRlZiBtaW5Db25zdW1lciAqL1xuICBtaW5Db25zdW1lcj86IChudW1iZXJ8bnVsbCk7XG5cbiAgLyoqIFZlcnNpb25EZWYgYmFkQ29uc3VtZXJzICovXG4gIGJhZENvbnN1bWVycz86IChudW1iZXJbXXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBHcmFwaERlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJR3JhcGhEZWYge1xuICAvKiogR3JhcGhEZWYgbm9kZSAqL1xuICBub2RlPzogKElOb2RlRGVmW118bnVsbCk7XG5cbiAgLyoqIEdyYXBoRGVmIHZlcnNpb25zICovXG4gIHZlcnNpb25zPzogKElWZXJzaW9uRGVmfG51bGwpO1xuXG4gIC8qKiBHcmFwaERlZiBsaWJyYXJ5ICovXG4gIGxpYnJhcnk/OiAoSUZ1bmN0aW9uRGVmTGlicmFyeXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBDb2xsZWN0aW9uRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElDb2xsZWN0aW9uRGVmIHtcbiAgLyoqIENvbGxlY3Rpb25EZWYgbm9kZUxpc3QgKi9cbiAgbm9kZUxpc3Q/OiAoQ29sbGVjdGlvbkRlZi5JTm9kZUxpc3R8bnVsbCk7XG5cbiAgLyoqIENvbGxlY3Rpb25EZWYgYnl0ZXNMaXN0ICovXG4gIGJ5dGVzTGlzdD86IChDb2xsZWN0aW9uRGVmLklCeXRlc0xpc3R8bnVsbCk7XG5cbiAgLyoqIENvbGxlY3Rpb25EZWYgaW50NjRMaXN0ICovXG4gIGludDY0TGlzdD86IChDb2xsZWN0aW9uRGVmLklJbnQ2NExpc3R8bnVsbCk7XG5cbiAgLyoqIENvbGxlY3Rpb25EZWYgZmxvYXRMaXN0ICovXG4gIGZsb2F0TGlzdD86IChDb2xsZWN0aW9uRGVmLklGbG9hdExpc3R8bnVsbCk7XG5cbiAgLyoqIENvbGxlY3Rpb25EZWYgYW55TGlzdCAqL1xuICBhbnlMaXN0PzogKENvbGxlY3Rpb25EZWYuSUFueUxpc3R8bnVsbCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgQ29sbGVjdGlvbkRlZiB7XG4gIC8qKiBQcm9wZXJ0aWVzIG9mIGEgTm9kZUxpc3QuICovXG4gIGV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJTm9kZUxpc3Qge1xuICAgIC8qKiBOb2RlTGlzdCB2YWx1ZSAqL1xuICAgIHZhbHVlPzogKHN0cmluZ1tdfG51bGwpO1xuICB9XG5cbiAgLyoqIFByb3BlcnRpZXMgb2YgYSBCeXRlc0xpc3QuICovXG4gIGV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJQnl0ZXNMaXN0IHtcbiAgICAvKiogQnl0ZXNMaXN0IHZhbHVlICovXG4gICAgdmFsdWU/OiAoVWludDhBcnJheVtdfG51bGwpO1xuICB9XG5cbiAgLyoqIFByb3BlcnRpZXMgb2YgYW4gSW50NjRMaXN0LiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUludDY0TGlzdCB7XG4gICAgLyoqIEludDY0TGlzdCB2YWx1ZSAqL1xuICAgIHZhbHVlPzogKChudW1iZXIgfCBzdHJpbmcpW118bnVsbCk7XG4gIH1cblxuICAvKiogUHJvcGVydGllcyBvZiBhIEZsb2F0TGlzdC4gKi9cbiAgZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElGbG9hdExpc3Qge1xuICAgIC8qKiBGbG9hdExpc3QgdmFsdWUgKi9cbiAgICB2YWx1ZT86IChudW1iZXJbXXxudWxsKTtcbiAgfVxuXG4gIC8qKiBQcm9wZXJ0aWVzIG9mIGFuIEFueUxpc3QuICovXG4gIGV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJQW55TGlzdCB7XG4gICAgLyoqIEFueUxpc3QgdmFsdWUgKi9cbiAgICB2YWx1ZT86IChJQW55W118bnVsbCk7XG4gIH1cbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBTYXZlckRlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJU2F2ZXJEZWYge1xuICAvKiogU2F2ZXJEZWYgZmlsZW5hbWVUZW5zb3JOYW1lICovXG4gIGZpbGVuYW1lVGVuc29yTmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIFNhdmVyRGVmIHNhdmVUZW5zb3JOYW1lICovXG4gIHNhdmVUZW5zb3JOYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogU2F2ZXJEZWYgcmVzdG9yZU9wTmFtZSAqL1xuICByZXN0b3JlT3BOYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogU2F2ZXJEZWYgbWF4VG9LZWVwICovXG4gIG1heFRvS2VlcD86IChudW1iZXJ8bnVsbCk7XG5cbiAgLyoqIFNhdmVyRGVmIHNoYXJkZWQgKi9cbiAgc2hhcmRlZD86IChib29sZWFufG51bGwpO1xuXG4gIC8qKiBTYXZlckRlZiBrZWVwQ2hlY2twb2ludEV2ZXJ5TkhvdXJzICovXG4gIGtlZXBDaGVja3BvaW50RXZlcnlOSG91cnM/OiAobnVtYmVyfG51bGwpO1xuXG4gIC8qKiBTYXZlckRlZiB2ZXJzaW9uICovXG4gIHZlcnNpb24/OiAoU2F2ZXJEZWYuQ2hlY2twb2ludEZvcm1hdFZlcnNpb258bnVsbCk7XG59XG5cbmV4cG9ydCBuYW1lc3BhY2UgU2F2ZXJEZWYge1xuICAvKiogQ2hlY2twb2ludEZvcm1hdFZlcnNpb24gZW51bS4gKi9cbiAgZXhwb3J0IGVudW0gQ2hlY2twb2ludEZvcm1hdFZlcnNpb24geydMRUdBQ1knID0gMCwgJ1YxJyA9IDEsICdWMicgPSAyfVxufVxuXG4vKiogUHJvcGVydGllcyBvZiBhIFRlbnNvckluZm8uICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSVRlbnNvckluZm8ge1xuICAvKiogVGVuc29ySW5mbyBuYW1lICovXG4gIG5hbWU/OiAoc3RyaW5nfG51bGwpO1xuXG4gIC8qKiBUZW5zb3JJbmZvIGNvb1NwYXJzZSAqL1xuICBjb29TcGFyc2U/OiAoVGVuc29ySW5mby5JQ29vU3BhcnNlfG51bGwpO1xuXG4gIC8qKiBUZW5zb3JJbmZvIGR0eXBlICovXG4gIGR0eXBlPzogKERhdGFUeXBlfG51bGwpO1xuXG4gIC8qKiBUZW5zb3JJbmZvIHRlbnNvclNoYXBlICovXG4gIHRlbnNvclNoYXBlPzogKElUZW5zb3JTaGFwZXxudWxsKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBUZW5zb3JJbmZvIHtcbiAgLyoqIFByb3BlcnRpZXMgb2YgYSBDb29TcGFyc2UuICovXG4gIGV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJQ29vU3BhcnNlIHtcbiAgICAvKiogQ29vU3BhcnNlIHZhbHVlc1RlbnNvck5hbWUgKi9cbiAgICB2YWx1ZXNUZW5zb3JOYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAgIC8qKiBDb29TcGFyc2UgaW5kaWNlc1RlbnNvck5hbWUgKi9cbiAgICBpbmRpY2VzVGVuc29yTmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQ29vU3BhcnNlIGRlbnNlU2hhcGVUZW5zb3JOYW1lICovXG4gICAgZGVuc2VTaGFwZVRlbnNvck5hbWU/OiAoc3RyaW5nfG51bGwpO1xuICB9XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgU2lnbmF0dXJlRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElTaWduYXR1cmVEZWYge1xuICAvKiogU2lnbmF0dXJlRGVmIGlucHV0cyAqL1xuICBpbnB1dHM/OiAoe1trOiBzdHJpbmddOiBJVGVuc29ySW5mb318bnVsbCk7XG5cbiAgLyoqIFNpZ25hdHVyZURlZiBvdXRwdXRzICovXG4gIG91dHB1dHM/OiAoe1trOiBzdHJpbmddOiBJVGVuc29ySW5mb318bnVsbCk7XG5cbiAgLyoqIFNpZ25hdHVyZURlZiBtZXRob2ROYW1lICovXG4gIG1ldGhvZE5hbWU/OiAoc3RyaW5nfG51bGwpO1xufVxuXG4vKiogUHJvcGVydGllcyBvZiBhbiBBc3NldEZpbGVEZWYuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUFzc2V0RmlsZURlZiB7XG4gIC8qKiBBc3NldEZpbGVEZWYgdGVuc29ySW5mbyAqL1xuICB0ZW5zb3JJbmZvPzogKElUZW5zb3JJbmZvfG51bGwpO1xuXG4gIC8qKiBBc3NldEZpbGVEZWYgZmlsZW5hbWUgKi9cbiAgZmlsZW5hbWU/OiAoc3RyaW5nfG51bGwpO1xufVxuXG4vKiogUHJvcGVydGllcyBvZiBhbiBPcERlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJT3BEZWYge1xuICAvKiogT3BEZWYgbmFtZSAqL1xuICBuYW1lPzogKHN0cmluZ3xudWxsKTtcblxuICAvKiogT3BEZWYgaW5wdXRBcmcgKi9cbiAgaW5wdXRBcmc/OiAoT3BEZWYuSUFyZ0RlZltdfG51bGwpO1xuXG4gIC8qKiBPcERlZiBvdXRwdXRBcmcgKi9cbiAgb3V0cHV0QXJnPzogKE9wRGVmLklBcmdEZWZbXXxudWxsKTtcblxuICAvKiogT3BEZWYgYXR0ciAqL1xuICBhdHRyPzogKE9wRGVmLklBdHRyRGVmW118bnVsbCk7XG5cbiAgLyoqIE9wRGVmIGRlcHJlY2F0aW9uICovXG4gIGRlcHJlY2F0aW9uPzogKE9wRGVmLklPcERlcHJlY2F0aW9ufG51bGwpO1xuXG4gIC8qKiBPcERlZiBzdW1tYXJ5ICovXG4gIHN1bW1hcnk/OiAoc3RyaW5nfG51bGwpO1xuXG4gIC8qKiBPcERlZiBkZXNjcmlwdGlvbiAqL1xuICBkZXNjcmlwdGlvbj86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIE9wRGVmIGlzQ29tbXV0YXRpdmUgKi9cbiAgaXNDb21tdXRhdGl2ZT86IChib29sZWFufG51bGwpO1xuXG4gIC8qKiBPcERlZiBpc0FnZ3JlZ2F0ZSAqL1xuICBpc0FnZ3JlZ2F0ZT86IChib29sZWFufG51bGwpO1xuXG4gIC8qKiBPcERlZiBpc1N0YXRlZnVsICovXG4gIGlzU3RhdGVmdWw/OiAoYm9vbGVhbnxudWxsKTtcblxuICAvKiogT3BEZWYgYWxsb3dzVW5pbml0aWFsaXplZElucHV0ICovXG4gIGFsbG93c1VuaW5pdGlhbGl6ZWRJbnB1dD86IChib29sZWFufG51bGwpO1xufVxuXG5leHBvcnQgbmFtZXNwYWNlIE9wRGVmIHtcbiAgLyoqIFByb3BlcnRpZXMgb2YgYW4gQXJnRGVmLiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUFyZ0RlZiB7XG4gICAgLyoqIEFyZ0RlZiBuYW1lICovXG4gICAgbmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXJnRGVmIGRlc2NyaXB0aW9uICovXG4gICAgZGVzY3JpcHRpb24/OiAoc3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIEFyZ0RlZiB0eXBlICovXG4gICAgdHlwZT86IChEYXRhVHlwZXxudWxsKTtcblxuICAgIC8qKiBBcmdEZWYgdHlwZUF0dHIgKi9cbiAgICB0eXBlQXR0cj86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXJnRGVmIG51bWJlckF0dHIgKi9cbiAgICBudW1iZXJBdHRyPzogKHN0cmluZ3xudWxsKTtcblxuICAgIC8qKiBBcmdEZWYgdHlwZUxpc3RBdHRyICovXG4gICAgdHlwZUxpc3RBdHRyPzogKHN0cmluZ3xudWxsKTtcblxuICAgIC8qKiBBcmdEZWYgaXNSZWYgKi9cbiAgICBpc1JlZj86IChib29sZWFufG51bGwpO1xuICB9XG5cbiAgLyoqIFByb3BlcnRpZXMgb2YgYW4gQXR0ckRlZi4gKi9cbiAgZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElBdHRyRGVmIHtcbiAgICAvKiogQXR0ckRlZiBuYW1lICovXG4gICAgbmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXR0ckRlZiB0eXBlICovXG4gICAgdHlwZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXR0ckRlZiBkZWZhdWx0VmFsdWUgKi9cbiAgICBkZWZhdWx0VmFsdWU/OiAoSUF0dHJWYWx1ZXxudWxsKTtcblxuICAgIC8qKiBBdHRyRGVmIGRlc2NyaXB0aW9uICovXG4gICAgZGVzY3JpcHRpb24/OiAoc3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIEF0dHJEZWYgaGFzTWluaW11bSAqL1xuICAgIGhhc01pbmltdW0/OiAoYm9vbGVhbnxudWxsKTtcblxuICAgIC8qKiBBdHRyRGVmIG1pbmltdW0gKi9cbiAgICBtaW5pbXVtPzogKG51bWJlcnxzdHJpbmd8bnVsbCk7XG5cbiAgICAvKiogQXR0ckRlZiBhbGxvd2VkVmFsdWVzICovXG4gICAgYWxsb3dlZFZhbHVlcz86IChJQXR0clZhbHVlfG51bGwpO1xuICB9XG5cbiAgLyoqIFByb3BlcnRpZXMgb2YgYW4gT3BEZXByZWNhdGlvbi4gKi9cbiAgZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElPcERlcHJlY2F0aW9uIHtcbiAgICAvKiogT3BEZXByZWNhdGlvbiB2ZXJzaW9uICovXG4gICAgdmVyc2lvbj86IChudW1iZXJ8bnVsbCk7XG5cbiAgICAvKiogT3BEZXByZWNhdGlvbiBleHBsYW5hdGlvbiAqL1xuICAgIGV4cGxhbmF0aW9uPzogKHN0cmluZ3xudWxsKTtcbiAgfVxufVxuXG4vKiogUHJvcGVydGllcyBvZiBhbiBPcExpc3QuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSU9wTGlzdCB7XG4gIC8qKiBPcExpc3Qgb3AgKi9cbiAgb3A/OiAoSU9wRGVmW118bnVsbCk7XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgTWV0YUdyYXBoRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElNZXRhR3JhcGhEZWYge1xuICAvKiogTWV0YUdyYXBoRGVmIG1ldGFJbmZvRGVmICovXG4gIG1ldGFJbmZvRGVmPzogKE1ldGFHcmFwaERlZi5JTWV0YUluZm9EZWZ8bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBncmFwaERlZiAqL1xuICBncmFwaERlZj86IChJR3JhcGhEZWZ8bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBzYXZlckRlZiAqL1xuICBzYXZlckRlZj86IChJU2F2ZXJEZWZ8bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBjb2xsZWN0aW9uRGVmICovXG4gIGNvbGxlY3Rpb25EZWY/OiAoe1trOiBzdHJpbmddOiBJQ29sbGVjdGlvbkRlZn18bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBzaWduYXR1cmVEZWYgKi9cbiAgc2lnbmF0dXJlRGVmPzogKHtbazogc3RyaW5nXTogSVNpZ25hdHVyZURlZn18bnVsbCk7XG5cbiAgLyoqIE1ldGFHcmFwaERlZiBhc3NldEZpbGVEZWYgKi9cbiAgYXNzZXRGaWxlRGVmPzogKElBc3NldEZpbGVEZWZbXXxudWxsKTtcbn1cblxuZXhwb3J0IG5hbWVzcGFjZSBNZXRhR3JhcGhEZWYge1xuICAvKiogUHJvcGVydGllcyBvZiBhIE1ldGFJbmZvRGVmLiAqL1xuICBleHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSU1ldGFJbmZvRGVmIHtcbiAgICAvKiogTWV0YUluZm9EZWYgbWV0YUdyYXBoVmVyc2lvbiAqL1xuICAgIG1ldGFHcmFwaFZlcnNpb24/OiAoc3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIE1ldGFJbmZvRGVmIHN0cmlwcGVkT3BMaXN0ICovXG4gICAgc3RyaXBwZWRPcExpc3Q/OiAoSU9wTGlzdHxudWxsKTtcblxuICAgIC8qKiBNZXRhSW5mb0RlZiBhbnlJbmZvICovXG4gICAgYW55SW5mbz86IChJQW55fG51bGwpO1xuXG4gICAgLyoqIE1ldGFJbmZvRGVmIHRhZ3MgKi9cbiAgICB0YWdzPzogKHN0cmluZ1tdfG51bGwpO1xuXG4gICAgLyoqIE1ldGFJbmZvRGVmIHRlbnNvcmZsb3dWZXJzaW9uICovXG4gICAgdGVuc29yZmxvd1ZlcnNpb24/OiAoc3RyaW5nfG51bGwpO1xuXG4gICAgLyoqIE1ldGFJbmZvRGVmIHRlbnNvcmZsb3dHaXRWZXJzaW9uICovXG4gICAgdGVuc29yZmxvd0dpdFZlcnNpb24/OiAoc3RyaW5nfG51bGwpO1xuICB9XG59XG5cbi8qKiBQcm9wZXJ0aWVzIG9mIGEgU2F2ZWRNb2RlbC4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJU2F2ZWRNb2RlbCB7XG4gIC8qKiBTYXZlZE1vZGVsIHNhdmVkTW9kZWxTY2hlbWFWZXJzaW9uICovXG4gIHNhdmVkTW9kZWxTY2hlbWFWZXJzaW9uPzogKG51bWJlcnxzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIFNhdmVkTW9kZWwgbWV0YUdyYXBocyAqL1xuICBtZXRhR3JhcGhzPzogKElNZXRhR3JhcGhEZWZbXXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBGdW5jdGlvbkRlZkxpYnJhcnkuICovXG5leHBvcnQgZGVjbGFyZSBpbnRlcmZhY2UgSUZ1bmN0aW9uRGVmTGlicmFyeSB7XG4gIC8qKiBGdW5jdGlvbkRlZkxpYnJhcnkgZnVuY3Rpb24gKi9cbiAgJ2Z1bmN0aW9uJz86IChJRnVuY3Rpb25EZWZbXXxudWxsKTtcblxuICAvKiogRnVuY3Rpb25EZWZMaWJyYXJ5IGdyYWRpZW50ICovXG4gIGdyYWRpZW50PzogKElHcmFkaWVudERlZltdfG51bGwpO1xufVxuXG4vKiogUHJvcGVydGllcyBvZiBhIEZ1bmN0aW9uRGVmLiAqL1xuZXhwb3J0IGRlY2xhcmUgaW50ZXJmYWNlIElGdW5jdGlvbkRlZiB7XG4gIC8qKiBGdW5jdGlvbkRlZiBzaWduYXR1cmUgKi9cbiAgc2lnbmF0dXJlPzogKElPcERlZnxudWxsKTtcblxuICAvKiogRnVuY3Rpb25EZWYgYXR0ciAqL1xuICBhdHRyPzogKHtbazogc3RyaW5nXTogSUF0dHJWYWx1ZX18bnVsbCk7XG5cbiAgLyoqIEZ1bmN0aW9uRGVmIG5vZGVEZWYgKi9cbiAgbm9kZURlZj86IChJTm9kZURlZltdfG51bGwpO1xuXG4gIC8qKiBGdW5jdGlvbkRlZiByZXQgKi9cbiAgcmV0PzogKHtbazogc3RyaW5nXTogc3RyaW5nfXxudWxsKTtcbn1cblxuLyoqIFByb3BlcnRpZXMgb2YgYSBHcmFkaWVudERlZi4gKi9cbmV4cG9ydCBkZWNsYXJlIGludGVyZmFjZSBJR3JhZGllbnREZWYge1xuICAvKiogR3JhZGllbnREZWYgZnVuY3Rpb25OYW1lICovXG4gIGZ1bmN0aW9uTmFtZT86IChzdHJpbmd8bnVsbCk7XG5cbiAgLyoqIEdyYWRpZW50RGVmIGdyYWRpZW50RnVuYyAqL1xuICBncmFkaWVudEZ1bmM/OiAoc3RyaW5nfG51bGwpO1xufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nconst CUSTOM_OPS = {};\n/**\n * Register an Op for graph model executor. This allows you to register\n * TensorFlow custom op or override existing op.\n *\n * Here is an example of registering a new MatMul Op.\n * ```js\n * const customMatmul = (node) =>\n *    tf.matMul(\n *        node.inputs[0], node.inputs[1],\n *        node.attrs['transpose_a'], node.attrs['transpose_b']);\n *\n * tf.registerOp('MatMul', customMatmul);\n * ```\n * The inputs and attrs of the node object are based on the TensorFlow op\n * registry.\n *\n * @param name The Tensorflow Op name.\n * @param opFunc An op function which is called with the current graph node\n * during execution and needs to return a tensor or a list of tensors. The node\n * has the following attributes:\n *    - attr: A map from attribute name to its value\n *    - inputs: A list of input tensors\n *\n * @doc {heading: 'Models', subheading: 'Op Registry'}\n */\nexport function registerOp(name, opFunc) {\n    const opMapper = {\n        tfOpName: name,\n        category: 'custom',\n        inputs: [],\n        attrs: [],\n        customExecutor: opFunc\n    };\n    CUSTOM_OPS[name] = opMapper;\n}\n/**\n * Retrieve the OpMapper object for the registered op.\n *\n * @param name The Tensorflow Op name.\n *\n * @doc {heading: 'Models', subheading: 'Op Registry'}\n */\nexport function getRegisteredOp(name) {\n    return CUSTOM_OPS[name];\n}\n/**\n * Deregister the Op for graph model executor.\n *\n * @param name The Tensorflow Op name.\n *\n * @doc {heading: 'Models', subheading: 'Op Registry'}\n */\nexport function deregisterOp(name) {\n    delete CUSTOM_OPS[name];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9jdXN0b21fb3AvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxVQUFVLEdBQThCLEVBQUUsQ0FBQztBQUVqRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBd0JHO0FBQ0gsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUFZLEVBQUUsTUFBa0I7SUFDekQsTUFBTSxRQUFRLEdBQWE7UUFDekIsUUFBUSxFQUFFLElBQUk7UUFDZCxRQUFRLEVBQUUsUUFBUTtRQUNsQixNQUFNLEVBQUUsRUFBRTtRQUNWLEtBQUssRUFBRSxFQUFFO1FBQ1QsY0FBYyxFQUFFLE1BQU07S0FDdkIsQ0FBQztJQUVGLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxRQUFRLENBQUM7QUFDOUIsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWTtJQUMxQyxPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFZO0lBQ3ZDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcEV4ZWN1dG9yLCBPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5jb25zdCBDVVNUT01fT1BTOiB7W2tleTogc3RyaW5nXTogT3BNYXBwZXJ9ID0ge307XG5cbi8qKlxuICogUmVnaXN0ZXIgYW4gT3AgZm9yIGdyYXBoIG1vZGVsIGV4ZWN1dG9yLiBUaGlzIGFsbG93cyB5b3UgdG8gcmVnaXN0ZXJcbiAqIFRlbnNvckZsb3cgY3VzdG9tIG9wIG9yIG92ZXJyaWRlIGV4aXN0aW5nIG9wLlxuICpcbiAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiByZWdpc3RlcmluZyBhIG5ldyBNYXRNdWwgT3AuXG4gKiBgYGBqc1xuICogY29uc3QgY3VzdG9tTWF0bXVsID0gKG5vZGUpID0+XG4gKiAgICB0Zi5tYXRNdWwoXG4gKiAgICAgICAgbm9kZS5pbnB1dHNbMF0sIG5vZGUuaW5wdXRzWzFdLFxuICogICAgICAgIG5vZGUuYXR0cnNbJ3RyYW5zcG9zZV9hJ10sIG5vZGUuYXR0cnNbJ3RyYW5zcG9zZV9iJ10pO1xuICpcbiAqIHRmLnJlZ2lzdGVyT3AoJ01hdE11bCcsIGN1c3RvbU1hdG11bCk7XG4gKiBgYGBcbiAqIFRoZSBpbnB1dHMgYW5kIGF0dHJzIG9mIHRoZSBub2RlIG9iamVjdCBhcmUgYmFzZWQgb24gdGhlIFRlbnNvckZsb3cgb3BcbiAqIHJlZ2lzdHJ5LlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBUZW5zb3JmbG93IE9wIG5hbWUuXG4gKiBAcGFyYW0gb3BGdW5jIEFuIG9wIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCB3aXRoIHRoZSBjdXJyZW50IGdyYXBoIG5vZGVcbiAqIGR1cmluZyBleGVjdXRpb24gYW5kIG5lZWRzIHRvIHJldHVybiBhIHRlbnNvciBvciBhIGxpc3Qgb2YgdGVuc29ycy4gVGhlIG5vZGVcbiAqIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6XG4gKiAgICAtIGF0dHI6IEEgbWFwIGZyb20gYXR0cmlidXRlIG5hbWUgdG8gaXRzIHZhbHVlXG4gKiAgICAtIGlucHV0czogQSBsaXN0IG9mIGlucHV0IHRlbnNvcnNcbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ09wIFJlZ2lzdHJ5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHJlZ2lzdGVyT3AobmFtZTogc3RyaW5nLCBvcEZ1bmM6IE9wRXhlY3V0b3IpIHtcbiAgY29uc3Qgb3BNYXBwZXI6IE9wTWFwcGVyID0ge1xuICAgIHRmT3BOYW1lOiBuYW1lLFxuICAgIGNhdGVnb3J5OiAnY3VzdG9tJyxcbiAgICBpbnB1dHM6IFtdLFxuICAgIGF0dHJzOiBbXSxcbiAgICBjdXN0b21FeGVjdXRvcjogb3BGdW5jXG4gIH07XG5cbiAgQ1VTVE9NX09QU1tuYW1lXSA9IG9wTWFwcGVyO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSBPcE1hcHBlciBvYmplY3QgZm9yIHRoZSByZWdpc3RlcmVkIG9wLlxuICpcbiAqIEBwYXJhbSBuYW1lIFRoZSBUZW5zb3JmbG93IE9wIG5hbWUuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdPcCBSZWdpc3RyeSd9XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRSZWdpc3RlcmVkT3AobmFtZTogc3RyaW5nKTogT3BNYXBwZXIge1xuICByZXR1cm4gQ1VTVE9NX09QU1tuYW1lXTtcbn1cblxuLyoqXG4gKiBEZXJlZ2lzdGVyIHRoZSBPcCBmb3IgZ3JhcGggbW9kZWwgZXhlY3V0b3IuXG4gKlxuICogQHBhcmFtIG5hbWUgVGhlIFRlbnNvcmZsb3cgT3AgbmFtZS5cbiAqXG4gKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ09wIFJlZ2lzdHJ5J31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGRlcmVnaXN0ZXJPcChuYW1lOiBzdHJpbmcpIHtcbiAgZGVsZXRlIENVU1RPTV9PUFNbbmFtZV07XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { clone, util } from '@tensorflow/tfjs-core';\nexport function getParamValue(paramName, node, tensorMap, context, resourceManager) {\n    const inputParam = node.inputParams[paramName];\n    if (inputParam && inputParam.inputIndexStart !== undefined) {\n        const start = inputParam.inputIndexStart;\n        const end = inputParam.inputIndexEnd === 0 ?\n            undefined :\n            (inputParam.inputIndexEnd === undefined ? start + 1 :\n                inputParam.inputIndexEnd);\n        if (inputParam.type === 'tensor') {\n            return getTensor(node.inputNames[inputParam.inputIndexStart], tensorMap, context, resourceManager);\n        }\n        if (inputParam.type === 'tensors') {\n            const inputs = node.inputNames.slice(start, end);\n            return inputs.map(name => getTensor(name, tensorMap, context, resourceManager));\n        }\n        const tensor = getTensor(node.inputNames.slice(start)[0], tensorMap, context, resourceManager);\n        const data = tensor.dataSync();\n        return inputParam.type === 'number' ?\n            data[0] :\n            util.toNestedArray(tensor.shape, data);\n    }\n    const attrParam = node.attrParams[paramName];\n    return attrParam && attrParam.value;\n}\n/**\n * Retrieve the tensor from tensorsMap based on input name.\n * @param name Node input name\n * @param tensorsMap Tensors map keyed by the node\n * @param context contains tensors and information for running the current node.\n * @param resourceManager Optional. Contains global resources of the model.\n */\nexport function getTensor(name, tensorsMap, context, resourceManager) {\n    const [nodeName, index] = parseNodeName(name);\n    if (resourceManager != null) {\n        const tensor = resourceManager.getHashTableHandleByName(nodeName);\n        if (tensor != null) {\n            return tensor;\n        }\n    }\n    const contextId = context.currentContextIds.find(contextId => {\n        return !!tensorsMap[getNodeNameWithContextId(nodeName, contextId)];\n    });\n    return contextId !== undefined ?\n        tensorsMap[getNodeNameWithContextId(nodeName, contextId)][index] :\n        undefined;\n}\n/**\n * Retrieve the tensors based on input name for current context.\n * @param name Node input name\n * @param tensorsMap Tensors map keyed by the node\n */\nexport function getTensorsForCurrentContenxt(name, tensorsMap, context) {\n    return tensorsMap[getNodeNameWithContextId(name, context.currentContextId)];\n}\n/**\n * Returns the node name, outputName and index from the Node input name.\n * @param inputName The input name of the node, in format of\n * node_name:output_index, i.e. MatMul:0, if the output_index is not set, it is\n * default to 0.\n * If the input name contains output name i.e. StringSplit:indices:0, it will\n * return ['StringSplit', 0, 'indices'].\n */\nexport function getNodeNameAndIndex(inputName, context) {\n    const [nodeName, index, outputName] = parseNodeName(inputName);\n    return [\n        getNodeNameWithContextId(nodeName, context && context.currentContextId),\n        index, outputName\n    ];\n}\nfunction getNodeNameWithContextId(name, contextId) {\n    return !!contextId ? `${name}-${contextId}` : name;\n}\nexport function parseNodeName(name) {\n    const parts = name.split(':');\n    if (parts.length === 1) {\n        return [name, 0, undefined];\n    }\n    const nodeName = parts[0];\n    const outputName = parts.length === 3 ? parts[1] : undefined;\n    const index = Number(parts[parts.length - 1]);\n    return [nodeName, index, outputName];\n}\nexport function split(arr, size) {\n    const res = [];\n    for (let i = 0; i < arr.length; i += size) {\n        res.push(arr.slice(i, i + size));\n    }\n    return res;\n}\nexport function getPadding(node, tensorMap, context) {\n    let pad = getParamValue('pad', node, tensorMap, context);\n    if (pad === 'explicit') {\n        // This is 1d array, we need to convert it to 2d array\n        pad = getParamValue('explicitPaddings', node, tensorMap, context);\n        const explicitPadding = [[0, 0], [0, 0], [0, 0], [0, 0]];\n        for (let i = 0; i < 4; i++) {\n            explicitPadding[i][0] = pad[i * 2];\n            explicitPadding[i][1] = pad[i * 2 + 1];\n        }\n        return explicitPadding;\n    }\n    return pad;\n}\n/**\n *  Reuse the tensor if it is marked as keep, otherwise clone the tensor to\n *  avoid disposal. This is important for TensorArray and TensorList ops, since\n *  internally they use a tensor as the id for TensorArray and TensorList, and\n * to simplify lookup, they also use Tensor.id as the key to the internal map.\n * These id tensors have been marked as kept in the backend, we need avoid clone\n * them in order to create new Tensor.id.\n * @param tensor\n */\nexport function cloneTensor(tensor) {\n    return tensor.kept ? tensor : clone(tensor);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBVSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQU8xRCxNQUFNLFVBQVUsYUFBYSxDQUN6QixTQUFpQixFQUFFLElBQVUsRUFBRSxTQUEwQixFQUN6RCxPQUF5QixFQUFFLGVBQWlDO0lBQzlELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDL0MsSUFBSSxVQUFVLElBQUksVUFBVSxDQUFDLGVBQWUsS0FBSyxTQUFTLEVBQUU7UUFDMUQsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQztRQUN6QyxNQUFNLEdBQUcsR0FBRyxVQUFVLENBQUMsYUFBYSxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLFNBQVMsQ0FBQyxDQUFDO1lBQ1gsQ0FBQyxVQUFVLENBQUMsYUFBYSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUNYLFVBQVUsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4RSxJQUFJLFVBQVUsQ0FBQyxJQUFJLEtBQUssUUFBUSxFQUFFO1lBQ2hDLE9BQU8sU0FBUyxDQUNaLElBQUksQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQy9ELGVBQWUsQ0FBQyxDQUFDO1NBQ3RCO1FBQ0QsSUFBSSxVQUFVLENBQUMsSUFBSSxLQUFLLFNBQVMsRUFBRTtZQUNqQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENB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QU0sZUFBZSxHQUVqQixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUMxQixlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUksR0FBZ0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakQsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFJLEdBQWdCLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN0RDtRQUNELE9BQU8sZUFBZSxDQUFDO0tBQ3hCO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUFDLE1BQWM7SUFDeEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Nsb25lLCBUZW5zb3IsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtSZXNvdXJjZU1hbmFnZXJ9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL3Jlc291cmNlX21hbmFnZXInO1xuaW1wb3J0IHtOb2RlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFBhcmFtVmFsdWUoXG4gICAgcGFyYW1OYW1lOiBzdHJpbmcsIG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIHJlc291cmNlTWFuYWdlcj86IFJlc291cmNlTWFuYWdlcik6IFZhbHVlVHlwZSB7XG4gIGNvbnN0IGlucHV0UGFyYW0gPSBub2RlLmlucHV0UGFyYW1zW3BhcmFtTmFtZV07XG4gIGlmIChpbnB1dFBhcmFtICYmIGlucHV0UGFyYW0uaW5wdXRJbmRleFN0YXJ0ICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBzdGFydCA9IGlucHV0UGFyYW0uaW5wdXRJbmRleFN0YXJ0O1xuICAgIGNvbnN0IGVuZCA9IGlucHV0UGFyYW0uaW5wdXRJbmRleEVuZCA9PT0gMCA/XG4gICAgICAgIHVuZGVmaW5lZCA6XG4gICAgICAgIChpbnB1dFBhcmFtLmlucHV0SW5kZXhFbmQgPT09IHVuZGVmaW5lZCA/IHN0YXJ0ICsgMSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UGFyYW0uaW5wdXRJbmRleEVuZCk7XG4gICAgaWYgKGlucHV0UGFyYW0udHlwZSA9PT0gJ3RlbnNvcicpIHtcbiAgICAgIHJldHVybiBnZXRUZW5zb3IoXG4gICAgICAgICAgbm9kZS5pbnB1dE5hbWVzW2lucHV0UGFyYW0uaW5wdXRJbmRleFN0YXJ0XSwgdGVuc29yTWFwLCBjb250ZXh0LFxuICAgICAgICAgIHJlc291cmNlTWFuYWdlcik7XG4gICAgfVxuICAgIGlmIChpbnB1dFBhcmFtLnR5cGUgPT09ICd0ZW5zb3JzJykge1xuICAgICAgY29uc3QgaW5wdXRzID0gbm9kZS5pbnB1dE5hbWVzLnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgICByZXR1cm4gaW5wdXRzLm1hcChcbiAgICAgICAgICBuYW1lID0+IGdldFRlbnNvcihuYW1lLCB0ZW5zb3JNYXAsIGNvbnRleHQsIHJlc291cmNlTWFuYWdlcikpO1xuICAgIH1cbiAgICBjb25zdCB0ZW5zb3IgPSBnZXRUZW5zb3IoXG4gICAgICAgIG5vZGUuaW5wdXROYW1lcy5zbGljZShzdGFydClbMF0sIHRlbnNvck1hcCwgY29udGV4dCwgcmVzb3VyY2VNYW5hZ2VyKTtcbiAgICBjb25zdCBkYXRhID0gdGVuc29yLmRhdGFTeW5jKCk7XG4gICAgcmV0dXJuIGlucHV0UGFyYW0udHlwZSA9PT0gJ251bWJlcicgP1xuICAgICAgICBkYXRhWzBdIDpcbiAgICAgICAgdXRpbC50b05lc3RlZEFycmF5KHRlbnNvci5zaGFwZSwgZGF0YSk7XG4gIH1cbiAgY29uc3QgYXR0clBhcmFtID0gbm9kZS5hdHRyUGFyYW1zW3BhcmFtTmFtZV07XG4gIHJldHVybiBhdHRyUGFyYW0gJiYgYXR0clBhcmFtLnZhbHVlO1xufVxuXG4vKipcbiAqIFJldHJpZXZlIHRoZSB0ZW5zb3IgZnJvbSB0ZW5zb3JzTWFwIGJhc2VkIG9uIGlucHV0IG5hbWUuXG4gKiBAcGFyYW0gbmFtZSBOb2RlIGlucHV0IG5hbWVcbiAqIEBwYXJhbSB0ZW5zb3JzTWFwIFRlbnNvcnMgbWFwIGtleWVkIGJ5IHRoZSBub2RlXG4gKiBAcGFyYW0gY29udGV4dCBjb250YWlucyB0ZW5zb3JzIGFuZCBpbmZvcm1hdGlvbiBmb3IgcnVubmluZyB0aGUgY3VycmVudCBub2RlLlxuICogQHBhcmFtIHJlc291cmNlTWFuYWdlciBPcHRpb25hbC4gQ29udGFpbnMgZ2xvYmFsIHJlc291cmNlcyBvZiB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3IoXG4gICAgbmFtZTogc3RyaW5nLCB0ZW5zb3JzTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgcmVzb3VyY2VNYW5hZ2VyPzogUmVzb3VyY2VNYW5hZ2VyKTogVGVuc29yIHtcbiAgY29uc3QgW25vZGVOYW1lLCBpbmRleF0gPSBwYXJzZU5vZGVOYW1lKG5hbWUpO1xuXG4gIGlmIChyZXNvdXJjZU1hbmFnZXIgIT0gbnVsbCkge1xuICAgIGNvbnN0IHRlbnNvciA9IHJlc291cmNlTWFuYWdlci5nZXRIYXNoVGFibGVIYW5kbGVCeU5hbWUobm9kZU5hbWUpO1xuICAgIGlmICh0ZW5zb3IgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRlbnNvcjtcbiAgICB9XG4gIH1cblxuICBjb25zdCBjb250ZXh0SWQgPSBjb250ZXh0LmN1cnJlbnRDb250ZXh0SWRzLmZpbmQoY29udGV4dElkID0+IHtcbiAgICByZXR1cm4gISF0ZW5zb3JzTWFwW2dldE5vZGVOYW1lV2l0aENvbnRleHRJZChub2RlTmFtZSwgY29udGV4dElkKV07XG4gIH0pO1xuXG4gIHJldHVybiBjb250ZXh0SWQgIT09IHVuZGVmaW5lZCA/XG4gICAgICB0ZW5zb3JzTWFwW2dldE5vZGVOYW1lV2l0aENvbnRleHRJZChub2RlTmFtZSwgY29udGV4dElkKV1baW5kZXhdIDpcbiAgICAgIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgdGVuc29ycyBiYXNlZCBvbiBpbnB1dCBuYW1lIGZvciBjdXJyZW50IGNvbnRleHQuXG4gKiBAcGFyYW0gbmFtZSBOb2RlIGlucHV0IG5hbWVcbiAqIEBwYXJhbSB0ZW5zb3JzTWFwIFRlbnNvcnMgbWFwIGtleWVkIGJ5IHRoZSBub2RlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3JzRm9yQ3VycmVudENvbnRlbnh0KFxuICAgIG5hbWU6IHN0cmluZywgdGVuc29yc01hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQpOiBUZW5zb3JbXSB7XG4gIHJldHVybiB0ZW5zb3JzTWFwW2dldE5vZGVOYW1lV2l0aENvbnRleHRJZChuYW1lLCBjb250ZXh0LmN1cnJlbnRDb250ZXh0SWQpXTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBub2RlIG5hbWUsIG91dHB1dE5hbWUgYW5kIGluZGV4IGZyb20gdGhlIE5vZGUgaW5wdXQgbmFtZS5cbiAqIEBwYXJhbSBpbnB1dE5hbWUgVGhlIGlucHV0IG5hbWUgb2YgdGhlIG5vZGUsIGluIGZvcm1hdCBvZlxuICogbm9kZV9uYW1lOm91dHB1dF9pbmRleCwgaS5lLiBNYXRNdWw6MCwgaWYgdGhlIG91dHB1dF9pbmRleCBpcyBub3Qgc2V0LCBpdCBpc1xuICogZGVmYXVsdCB0byAwLlxuICogSWYgdGhlIGlucHV0IG5hbWUgY29udGFpbnMgb3V0cHV0IG5hbWUgaS5lLiBTdHJpbmdTcGxpdDppbmRpY2VzOjAsIGl0IHdpbGxcbiAqIHJldHVybiBbJ1N0cmluZ1NwbGl0JywgMCwgJ2luZGljZXMnXS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVOYW1lQW5kSW5kZXgoXG4gICAgaW5wdXROYW1lOiBzdHJpbmcsIGNvbnRleHQ/OiBFeGVjdXRpb25Db250ZXh0KTogW3N0cmluZywgbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgW25vZGVOYW1lLCBpbmRleCwgb3V0cHV0TmFtZV0gPSBwYXJzZU5vZGVOYW1lKGlucHV0TmFtZSk7XG5cbiAgcmV0dXJuIFtcbiAgICBnZXROb2RlTmFtZVdpdGhDb250ZXh0SWQobm9kZU5hbWUsIGNvbnRleHQgJiYgY29udGV4dC5jdXJyZW50Q29udGV4dElkKSxcbiAgICBpbmRleCwgb3V0cHV0TmFtZVxuICBdO1xufVxuXG5mdW5jdGlvbiBnZXROb2RlTmFtZVdpdGhDb250ZXh0SWQobmFtZTogc3RyaW5nLCBjb250ZXh0SWQ/OiBzdHJpbmcpOiBzdHJpbmcge1xuICByZXR1cm4gISFjb250ZXh0SWQgPyBgJHtuYW1lfS0ke2NvbnRleHRJZH1gIDogbmFtZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlTm9kZU5hbWUobmFtZTogc3RyaW5nKTogW3N0cmluZywgbnVtYmVyLCBzdHJpbmddIHtcbiAgY29uc3QgcGFydHMgPSBuYW1lLnNwbGl0KCc6Jyk7XG4gIGlmIChwYXJ0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gW25hbWUsIDAsIHVuZGVmaW5lZF07XG4gIH1cblxuICBjb25zdCBub2RlTmFtZSA9IHBhcnRzWzBdO1xuICBjb25zdCBvdXRwdXROYW1lID0gcGFydHMubGVuZ3RoID09PSAzID8gcGFydHNbMV0gOiB1bmRlZmluZWQ7XG4gIGNvbnN0IGluZGV4ID0gTnVtYmVyKHBhcnRzW3BhcnRzLmxlbmd0aCAtIDFdKTtcbiAgcmV0dXJuIFtub2RlTmFtZSwgaW5kZXgsIG91dHB1dE5hbWVdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXQoYXJyOiBudW1iZXJbXSwgc2l6ZTogbnVtYmVyKSB7XG4gIGNvbnN0IHJlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkgKz0gc2l6ZSkge1xuICAgIHJlcy5wdXNoKGFyci5zbGljZShpLCBpICsgc2l6ZSkpO1xuICB9XG4gIHJldHVybiByZXM7XG59XG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFkZGluZyhcbiAgICBub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KTogVmFsdWVUeXBlIHtcbiAgbGV0IHBhZCA9IGdldFBhcmFtVmFsdWUoJ3BhZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gIGlmIChwYWQgPT09ICdleHBsaWNpdCcpIHtcbiAgICAvLyBUaGlzIGlzIDFkIGFycmF5LCB3ZSBuZWVkIHRvIGNvbnZlcnQgaXQgdG8gMmQgYXJyYXlcbiAgICBwYWQgPSBnZXRQYXJhbVZhbHVlKCdleHBsaWNpdFBhZGRpbmdzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICBjb25zdCBleHBsaWNpdFBhZGRpbmc6IFtcbiAgICAgIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl0sIFtudW1iZXIsIG51bWJlcl1cbiAgICBdID0gW1swLCAwXSwgWzAsIDBdLCBbMCwgMF0sIFswLCAwXV07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHtcbiAgICAgIGV4cGxpY2l0UGFkZGluZ1tpXVswXSA9IChwYWQgYXMgbnVtYmVyW10pW2kgKiAyXTtcbiAgICAgIGV4cGxpY2l0UGFkZGluZ1tpXVsxXSA9IChwYWQgYXMgbnVtYmVyW10pW2kgKiAyICsgMV07XG4gICAgfVxuICAgIHJldHVybiBleHBsaWNpdFBhZGRpbmc7XG4gIH1cbiAgcmV0dXJuIHBhZDtcbn1cblxuLyoqXG4gKiAgUmV1c2UgdGhlIHRlbnNvciBpZiBpdCBpcyBtYXJrZWQgYXMga2VlcCwgb3RoZXJ3aXNlIGNsb25lIHRoZSB0ZW5zb3IgdG9cbiAqICBhdm9pZCBkaXNwb3NhbC4gVGhpcyBpcyBpbXBvcnRhbnQgZm9yIFRlbnNvckFycmF5IGFuZCBUZW5zb3JMaXN0IG9wcywgc2luY2VcbiAqICBpbnRlcm5hbGx5IHRoZXkgdXNlIGEgdGVuc29yIGFzIHRoZSBpZCBmb3IgVGVuc29yQXJyYXkgYW5kIFRlbnNvckxpc3QsIGFuZFxuICogdG8gc2ltcGxpZnkgbG9va3VwLCB0aGV5IGFsc28gdXNlIFRlbnNvci5pZCBhcyB0aGUga2V5IHRvIHRoZSBpbnRlcm5hbCBtYXAuXG4gKiBUaGVzZSBpZCB0ZW5zb3JzIGhhdmUgYmVlbiBtYXJrZWQgYXMga2VwdCBpbiB0aGUgYmFja2VuZCwgd2UgbmVlZCBhdm9pZCBjbG9uZVxuICogdGhlbSBpbiBvcmRlciB0byBjcmVhdGUgbmV3IFRlbnNvci5pZC5cbiAqIEBwYXJhbSB0ZW5zb3JcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNsb25lVGVuc29yKHRlbnNvcjogVGVuc29yKTogVGVuc29yIHtcbiAgcmV0dXJuIHRlbnNvci5rZXB0ID8gdGVuc29yIDogY2xvbmUodGVuc29yKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'Add',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'AddV2',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'AddN',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'end': 0,\n                'name': 'tensors',\n                'type': 'tensors'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'BiasAdd',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Sub',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'RealDiv',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Div',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'DivNoNan',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'FloorDiv',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Mul',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Maximum',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Minimum',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Pow',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SquaredDifference',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Mod',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'FloorMod',\n        'category': 'arithmetic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJpdGhtZXRpYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvYXJpdGhtZXRpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFB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RUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBZGQnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0FkZFYyJyxcbiAgICAnY2F0ZWdvcnknOiAnYXJpdGhtZXRpYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBZGROJyxcbiAgICAnY2F0ZWdvcnknOiAnYXJpdGhtZXRpYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ2VuZCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcnMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCaWFzQWRkJyxcbiAgICAnY2F0ZWdvcnknOiAnYXJpdGhtZXRpYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTdWInLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JlYWxEaXYnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0RpdicsXG4gICAgJ2NhdGVnb3J5JzogJ2FyaXRobWV0aWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRGl2Tm9OYW4nLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0Zsb29yRGl2JyxcbiAgICAnY2F0ZWdvcnknOiAnYXJpdGhtZXRpYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdNdWwnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01heGltdW0nLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01pbmltdW0nLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1BvdycsXG4gICAgJ2NhdGVnb3J5JzogJ2FyaXRobWV0aWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3F1YXJlZERpZmZlcmVuY2UnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01vZCcsXG4gICAgJ2NhdGVnb3J5JzogJ2FyaXRobWV0aWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRmxvb3JNb2QnLFxuICAgICdjYXRlZ29yeSc6ICdhcml0aG1ldGljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'Abs',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Acos',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Asin',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Atan',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Atan2',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'y',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Ceil',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ClipByValue',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'clipValueMin',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'clipValueMax',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Complex',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'real',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'imag',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ComplexAbs',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Cos',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Cosh',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Elu',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Exp',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Floor',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Log',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Imag',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'Tout',\n                'name': 'outputType',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Neg',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Real',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'Tout',\n                'name': 'outputType',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Prelu',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'alpha',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Relu',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Relu6',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Selu',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Sigmoid',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Sin',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Sinh',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Sqrt',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Rsqrt',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Square',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Tan',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Tanh',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Sign',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Round',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Expm1',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Log1p',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Reciprocal',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Softplus',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Asinh',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Acosh',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Atanh',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Erf',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Prod',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axes',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool',\n                'notSupported': true\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LeakyRelu',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'alpha',\n                'name': 'alpha',\n                'type': 'number',\n                'defaultValue': 0.2\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'IsNan',\n        'category': 'basic_math',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfbWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvYmFzaWNfbWF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsS0FBSztRQUNqQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7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O1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxHQUFHO2FBQ3BCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0FicycsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBY29zJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0FzaW4nLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQXRhbicsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBdGFuMicsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd5JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ2VpbCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDbGlwQnlWYWx1ZScsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdjbGlwVmFsdWVNaW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdjbGlwVmFsdWVNYXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDb21wbGV4JyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAncmVhbCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2ltYWcnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDb21wbGV4QWJzJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0NvcycsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDb3NoJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0VsdScsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFeHAnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRmxvb3InLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9nJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0ltYWcnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVG91dCcsXG4gICAgICAgICduYW1lJzogJ291dHB1dFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05lZycsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdSZWFsJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RvdXQnLFxuICAgICAgICAnbmFtZSc6ICdvdXRwdXRUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdQcmVsdScsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdhbHBoYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JlbHUnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmVsdTYnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU2VsdScsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTaWdtb2lkJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NpbicsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTaW5oJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NxcnQnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUnNxcnQnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3F1YXJlJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RhbicsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUYW5oJyxcbiAgICAnY2F0ZWdvcnknOiAnYmFzaWNfbWF0aCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NpZ24nLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUm91bmQnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRXhwbTEnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9nMXAnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmVjaXByb2NhbCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTb2Z0cGx1cycsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBc2luaCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBY29zaCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBdGFuaCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFcmYnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUHJvZCcsXG4gICAgJ2NhdGVnb3J5JzogJ2Jhc2ljX21hdGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMZWFreVJlbHUnLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2FscGhhJyxcbiAgICAgICAgJ25hbWUnOiAnYWxwaGEnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMC4yXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSXNOYW4nLFxuICAgICdjYXRlZ29yeSc6ICdiYXNpY19tYXRoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH1cbl07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'EmptyTensorList',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'elementShape',\n                'type': 'shape'\n            },\n            {\n                'start': 1,\n                'name': 'maxNumElements',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LoopCond',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'pred',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Switch',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'data',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'pred',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Merge',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'end': 0,\n                'name': 'tensors',\n                'type': 'tensors'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Enter',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensor',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'frame_name',\n                'name': 'frameName',\n                'type': 'string'\n            },\n            {\n                'tfName': 'is_constant',\n                'name': 'isConstant',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Exit',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensor',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'NextIteration',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensor',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArrayV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'size',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'element_shape',\n                'name': 'elementShape',\n                'type': 'shape'\n            },\n            {\n                'tfName': 'dynamic_size',\n                'name': 'dynamicSize',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'clear_after_read',\n                'name': 'clearAfterRead',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'identical_element_shapes',\n                'name': 'identicalElementShapes',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'tensor_array_name',\n                'name': 'name',\n                'type': 'string'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArrayWriteV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorArrayId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'index',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'tensor',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'flowIn',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArrayReadV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorArrayId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'index',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'flowIn',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArrayGatherV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorArrayId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'flowIn',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'element_shape',\n                'name': 'elementShape',\n                'type': 'shape'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArrayScatterV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorArrayId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'tensor',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'flowIn',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArrayConcatV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorArrayId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'flowIn',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'element_shape_except0',\n                'name': 'elementShapeExcept0',\n                'type': 'shape',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArraySplitV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorArrayId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'tensor',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'lengths',\n                'type': 'number[]'\n            },\n            {\n                'start': 3,\n                'name': 'flowIn',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArraySizeV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorArrayId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'flowIn',\n                'type': 'number'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorArrayCloseV3',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorArrayId',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'StatelessIf',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'cond',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'end': 0,\n                'name': 'args',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'then_branch',\n                'name': 'thenBranch',\n                'type': 'func'\n            },\n            {\n                'tfName': 'else_branch',\n                'name': 'elseBranch',\n                'type': 'func'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'If',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'cond',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'end': 0,\n                'name': 'args',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'then_branch',\n                'name': 'thenBranch',\n                'type': 'func'\n            },\n            {\n                'tfName': 'else_branch',\n                'name': 'elseBranch',\n                'type': 'func'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'StatelessWhile',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'end': 0,\n                'name': 'args',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'cond',\n                'name': 'cond',\n                'type': 'func'\n            },\n            {\n                'tfName': 'body',\n                'name': 'body',\n                'type': 'func'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'While',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'end': 0,\n                'name': 'args',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'cond',\n                'name': 'cond',\n                'type': 'func'\n            },\n            {\n                'tfName': 'body',\n                'name': 'body',\n                'type': 'func'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListScatter',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensor',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'elementShape',\n                'type': 'shape'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListScatterV2',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensor',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'elementShape',\n                'type': 'shape'\n            },\n            {\n                'start': 3,\n                'name': 'numElements',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListGather',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'elementShape',\n                'type': 'shape'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListGetItem',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'index',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'elementShape',\n                'type': 'shape'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListSetItem',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'index',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'tensor',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListReserve',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'elementShape',\n                'type': 'shape'\n            },\n            {\n                'start': 1,\n                'name': 'numElements',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListFromTensor',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensor',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'elementShape',\n                'type': 'shape'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListStack',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'elementShape',\n                'type': 'shape'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'num_elements',\n                'name': 'numElements',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListSplit',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensor',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'elementShape',\n                'type': 'shape'\n            },\n            {\n                'start': 2,\n                'name': 'lengths',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListConcat',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_shape',\n                'name': 'elementShape',\n                'type': 'shape'\n            },\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListConcatV2',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_shape',\n                'name': 'elementShape',\n                'type': 'shape'\n            },\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListPopBack',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'elementShape',\n                'type': 'shape'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListPushBack',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'tensor',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'element_dtype',\n                'name': 'elementDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListLength',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TensorListResize',\n        'category': 'control',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensorListId',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'size',\n                'type': 'number'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvY29udHJvbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsaUJBQWlCO1FBQzdCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsT0FBTzthQUNoQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsZUFBZTtnQkFDekIsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxPQUFPO2FBQ2hCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLFNBQVM7UUFDckIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsUUFBUTtRQUNwQixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJ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VUFBVSxFQUFFLFNBQVM7UUFDckIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsZUFBZTtnQkFDekIsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxPQUFPO2FBQ2hCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLGtCQUFrQjtRQUM5QixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsa0JBQWtCO1FBQzlCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFbXB0eVRlbnNvckxpc3QnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ21heE51bUVsZW1lbnRzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50RFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9vcENvbmQnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdwcmVkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTd2l0Y2gnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdkYXRhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAncHJlZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTWVyZ2UnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29ycycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0VudGVyJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZnJhbWVfbmFtZScsXG4gICAgICAgICduYW1lJzogJ2ZyYW1lTmFtZScsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnaXNfY29uc3RhbnQnLFxuICAgICAgICAnbmFtZSc6ICdpc0NvbnN0YW50JyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRXhpdCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05leHRJdGVyYXRpb24nLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheVYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfc2hhcGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZHluYW1pY19zaXplJyxcbiAgICAgICAgJ25hbWUnOiAnZHluYW1pY1NpemUnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdjbGVhcl9hZnRlcl9yZWFkJyxcbiAgICAgICAgJ25hbWUnOiAnY2xlYXJBZnRlclJlYWQnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdpZGVudGljYWxfZWxlbWVudF9zaGFwZXMnLFxuICAgICAgICAnbmFtZSc6ICdpZGVudGljYWxFbGVtZW50U2hhcGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAndGVuc29yX2FycmF5X25hbWUnLFxuICAgICAgICAnbmFtZSc6ICduYW1lJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheVdyaXRlVjMnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JBcnJheUlkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kZXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdmbG93SW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheVJlYWRWMycsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvckFycmF5SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdpbmRleCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2Zsb3dJbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheUdhdGhlclYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yQXJyYXlJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2luZGljZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2Zsb3dJbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfc2hhcGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGVuc29yQXJyYXlTY2F0dGVyVjMnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JBcnJheUlkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAndGVuc29yJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnZmxvd0luJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JBcnJheUNvbmNhdFYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yQXJyYXlJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2Zsb3dJbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfc2hhcGVfZXhjZXB0MCcsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnRTaGFwZUV4Y2VwdDAnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckFycmF5U3BsaXRWMycsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvckFycmF5SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdsZW5ndGhzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdmbG93SW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckFycmF5U2l6ZVYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yQXJyYXlJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2Zsb3dJbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGVuc29yQXJyYXlDbG9zZVYzJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yQXJyYXlJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RhdGVsZXNzSWYnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdjb25kJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ2VuZCc6IDAsXG4gICAgICAgICduYW1lJzogJ2FyZ3MnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3RoZW5fYnJhbmNoJyxcbiAgICAgICAgJ25hbWUnOiAndGhlbkJyYW5jaCcsXG4gICAgICAgICd0eXBlJzogJ2Z1bmMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2Vsc2VfYnJhbmNoJyxcbiAgICAgICAgJ25hbWUnOiAnZWxzZUJyYW5jaCcsXG4gICAgICAgICd0eXBlJzogJ2Z1bmMnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0lmJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnY29uZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICdlbmQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhcmdzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd0aGVuX2JyYW5jaCcsXG4gICAgICAgICduYW1lJzogJ3RoZW5CcmFuY2gnLFxuICAgICAgICAndHlwZSc6ICdmdW5jJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbHNlX2JyYW5jaCcsXG4gICAgICAgICduYW1lJzogJ2Vsc2VCcmFuY2gnLFxuICAgICAgICAndHlwZSc6ICdmdW5jJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTdGF0ZWxlc3NXaGlsZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICdlbmQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhcmdzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdjb25kJyxcbiAgICAgICAgJ25hbWUnOiAnY29uZCcsXG4gICAgICAgICd0eXBlJzogJ2Z1bmMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2JvZHknLFxuICAgICAgICAnbmFtZSc6ICdib2R5JyxcbiAgICAgICAgJ3R5cGUnOiAnZnVuYydcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnV2hpbGUnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAnYXJncycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnY29uZCcsXG4gICAgICAgICduYW1lJzogJ2NvbmQnLFxuICAgICAgICAndHlwZSc6ICdmdW5jJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdib2R5JyxcbiAgICAgICAgJ25hbWUnOiAnYm9keScsXG4gICAgICAgICd0eXBlJzogJ2Z1bmMnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RTY2F0dGVyJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnc2hhcGUnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnREVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JMaXN0U2NhdHRlclYyJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnc2hhcGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdudW1FbGVtZW50cycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RHYXRoZXInLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdpbmRpY2VzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RHZXRJdGVtJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yTGlzdElkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kZXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RTZXRJdGVtJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yTGlzdElkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kZXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnREVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JMaXN0UmVzZXJ2ZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ3NoYXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnbnVtRWxlbWVudHMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnREVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JMaXN0RnJvbVRlbnNvcicsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ3NoYXBlJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50RFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGVuc29yTGlzdFN0YWNrJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udHJvbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29yTGlzdElkJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnc2hhcGUnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnREVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdudW1fZWxlbWVudHMnLFxuICAgICAgICAnbmFtZSc6ICdudW1FbGVtZW50cycsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUZW5zb3JMaXN0U3BsaXQnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2xlbmd0aHMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RDb25jYXQnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxlbWVudF9zaGFwZScsXG4gICAgICAgICduYW1lJzogJ2VsZW1lbnRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ3NoYXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RDb25jYXRWMicsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvckxpc3RJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X3NoYXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnc2hhcGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2VsZW1lbnRfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50RFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGVuc29yTGlzdFBvcEJhY2snLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdlbGVtZW50U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RQdXNoQmFjaycsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnRyb2wnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RlbnNvckxpc3RJZCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlbGVtZW50X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZWxlbWVudERUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RMZW5ndGgnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RlbnNvckxpc3RSZXNpemUnLFxuICAgICdjYXRlZ29yeSc6ICdjb250cm9sJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JMaXN0SWQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXVxuO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'AvgPool',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            },\n            {\n                'tfName': 'ksize',\n                'name': 'kernelSize',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'MaxPool',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            },\n            {\n                'tfName': 'ksize',\n                'name': 'kernelSize',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'explicit_paddings',\n                'name': 'explicitPaddings',\n                'type': 'number[]',\n                'defaultValue': [],\n                'notSupported': true\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'MaxPoolWithArgmax',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'ksize',\n                'name': 'kernelSize',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'include_batch_in_index',\n                'name': 'includeBatchInIndex',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'AvgPool3D',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            },\n            {\n                'tfName': 'ksize',\n                'name': 'kernelSize',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'MaxPool3D',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            },\n            {\n                'tfName': 'ksize',\n                'name': 'kernelSize',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Conv1D',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'stride',\n                'name': 'stride',\n                'type': 'number'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'defaultValue': 'NWC'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'dilation',\n                'name': 'dilation',\n                'type': 'number',\n                'defaultValue': 1\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Conv2D',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'useCudnnOnGpu',\n                'name': 'useCudnnOnGpu',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'defaultValue': 'NHWC'\n            },\n            {\n                'tfName': 'explicit_paddings',\n                'name': 'explicitPaddings',\n                'type': 'number[]',\n                'defaultValue': []\n            },\n            {\n                'tfName': 'dilations',\n                'name': 'dilations',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': '_FusedConv2D',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'end': 0,\n                'name': 'args',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'num_args',\n                'name': 'numArgs',\n                'type': 'number'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'explicit_paddings',\n                'name': 'explicitPaddings',\n                'type': 'number[]',\n                'defaultValue': []\n            },\n            {\n                'tfName': 'use_cudnn_on_gpu',\n                'name': 'useCudnnOnGpu',\n                'type': 'bool',\n                'defaultValue': true\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'defaultValue': 'NHWC'\n            },\n            {\n                'tfName': 'dilations',\n                'name': 'dilations',\n                'type': 'number[]',\n                'defaultValue': [\n                    1,\n                    1,\n                    1,\n                    1\n                ]\n            },\n            {\n                'tfName': 'fused_ops',\n                'name': 'fusedOps',\n                'type': 'string[]',\n                'defaultValue': []\n            },\n            {\n                'tfName': 'epsilon',\n                'name': 'epsilon',\n                'type': 'number',\n                'defaultValue': 0.0001\n            },\n            {\n                'tfName': 'leakyrelu_alpha',\n                'name': 'leakyreluAlpha',\n                'type': 'number',\n                'defaultValue': 0.2\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Conv2DBackpropInput',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 2,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            },\n            {\n                'start': 0,\n                'name': 'outputShape',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            },\n            {\n                'tfName': 'explicit_paddings',\n                'name': 'explicitPaddings',\n                'type': 'number[]',\n                'defaultValue': []\n            },\n            {\n                'tfName': 'dilations',\n                'name': 'dilations',\n                'type': 'number[]',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'DepthwiseConv2d',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'input',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'defaultValue': 'NHWC'\n            },\n            {\n                'tfName': 'explicit_paddings',\n                'name': 'explicitPaddings',\n                'type': 'number[]',\n                'defaultValue': []\n            },\n            {\n                'tfName': 'dilations',\n                'name': 'dilations',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'DepthwiseConv2dNative',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'input',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'defaultValue': 'NHWC'\n            },\n            {\n                'tfName': 'explicit_paddings',\n                'name': 'explicitPaddings',\n                'type': 'number[]',\n                'defaultValue': []\n            },\n            {\n                'tfName': 'dilations',\n                'name': 'dilations',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'FusedDepthwiseConv2dNative',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'end': 0,\n                'name': 'args',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'num_args',\n                'name': 'numArgs',\n                'type': 'number'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'defaultValue': 'NHWC'\n            },\n            {\n                'tfName': 'dilations',\n                'name': 'dilations',\n                'type': 'number[]',\n                'defaultValue': [\n                    1,\n                    1,\n                    1,\n                    1\n                ]\n            },\n            {\n                'tfName': 'fused_ops',\n                'name': 'fusedOps',\n                'type': 'string[]',\n                'defaultValue': []\n            },\n            {\n                'tfName': 'explicit_paddings',\n                'name': 'explicitPaddings',\n                'type': 'number[]',\n                'defaultValue': []\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Conv3D',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'defaultValue': 'NHWC'\n            },\n            {\n                'tfName': 'dilations',\n                'name': 'dilations',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Dilation2D',\n        'category': 'convolution',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'filter',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'strides',\n                'name': 'strides',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'rates',\n                'name': 'dilations',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'padding',\n                'name': 'pad',\n                'type': 'string'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L2NvbnZvbHV0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsYUFBYTtRQUN6QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsVUFBVTthQUNuQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLE9BQU87Z0JBQ2pCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsVUFBVTthQUNuQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixjQUFjLEVBQUUsRUFBRTtnQkFDbEIsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxtQkFBbUI7UUFDL0IsVUFBVSxFQUFFLGFBQWE7UUFDekIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLHdCQUF3QjtnQkFDbEMsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsTUFBTSxFQUFFLE1BQU07YUFDZjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFdBQVc7UUFDdkIsVUFBVSxFQUFFLGFBQWE7UUFDekIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsSUFBSTthQUNyQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxPQUFPO2dCQUNqQixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsUUFBUTtRQUNwQixVQUFVLEVBQUUsYUFBYTtRQUN6QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFFBQVE7Z0JBQ2xCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxLQUFLO2FBQ3RCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsQ0FBQzthQUNsQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsZUFBZTtnQkFDekIsTUFBTSxFQUFFLGVBQWU7Z0JBQ3ZCLE1BQU0sRUFBRSxNQUFNO2FBQ2Y7WUFDRDtnQkFDRSxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsTUFBTTthQUN2QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixjQUFjLEVBQUUsRUFBRTthQUNuQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsY0FBYztRQUMxQixVQUFVLEVBQUUsYUFBYTtRQUN6QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEtBQUssRUFBRSxDQUFDO2dCQUNSLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLEdBQUc7Z0JBQ2IsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsTUFBTSxFQUFFLGtCQUFrQjtnQkFDMUIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLGNBQWMsRUFBRSxFQUFFO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsTUFBTSxFQUFFLGVBQWU7Z0JBQ3ZCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLE1BQU07YUFDdkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixjQUFjLEVBQUU7b0JBQ2QsQ0FBQztvQkFDRCxDQUFDO29CQUNELENBQUM7b0JBQ0QsQ0FBQztpQkFDRjthQUNGO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsY0FBYyxFQUFFLEVBQUU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsTUFBTTthQUN2QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxpQkFBaUI7Z0JBQzNCLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsR0FBRzthQUNwQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxxQkFBcUI7UUFDakMsVUFBVSxFQUFFLGFBQWE7UUFDekIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsYUFBYTtnQkFDckIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsSUFBSTthQUNyQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixjQUFjLEVBQUUsRUFBRTthQUNuQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLGlCQUFpQjtRQUM3QixVQUFVLEVBQUUsYUFBYTtRQUN6QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsVUFBVTthQUNuQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxNQUFNO2FBQ3ZCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLG1CQUFtQjtnQkFDN0IsTUFBTSxFQUFFLGtCQUFrQjtnQkFDMUIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLGNBQWMsRUFBRSxFQUFFO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixNQUFNLEVBQUUsVUFBVTthQUNuQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSx1QkFBdUI7UUFDbkMsVUFBVSxFQUFFLGFBQWE7UUFDekIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsTUFBTTthQUN2QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixjQUFjLEVBQUUsRUFBRTthQUNuQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsNEJBQTRCO1FBQ3hDLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFNBQVM7YUFDbEI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxVQUFVO2dCQUNwQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsTUFBTTthQUN2QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLGNBQWMsRUFBRTtvQkFDZCxDQUFDO29CQUNELENBQUM7b0JBQ0QsQ0FBQztvQkFDRCxDQUFDO2lCQUNGO2FBQ0Y7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixjQUFjLEVBQUUsRUFBRTthQUNuQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxtQkFBbUI7Z0JBQzdCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixjQUFjLEVBQUUsRUFBRTthQUNuQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFVBQVUsRUFBRSxhQUFhO1FBQ3pCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLE1BQU07YUFDdkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFlBQVk7UUFDeEIsVUFBVSxFQUFFLGFBQWE7UUFDekIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxTQUFTO2dCQUNuQixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBdmdQb29sJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna3NpemUnLFxuICAgICAgICAnbmFtZSc6ICdrZXJuZWxTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTWF4UG9vbCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnZvbHV0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2tzaXplJyxcbiAgICAgICAgJ25hbWUnOiAna2VybmVsU2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdleHBsaWNpdF9wYWRkaW5ncycsXG4gICAgICAgICduYW1lJzogJ2V4cGxpY2l0UGFkZGluZ3MnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXSxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdNYXhQb29sV2l0aEFyZ21heCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnZvbHV0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2tzaXplJyxcbiAgICAgICAgJ25hbWUnOiAna2VybmVsU2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdpbmNsdWRlX2JhdGNoX2luX2luZGV4JyxcbiAgICAgICAgJ25hbWUnOiAnaW5jbHVkZUJhdGNoSW5JbmRleCcsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQXZnUG9vbDNEJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna3NpemUnLFxuICAgICAgICAnbmFtZSc6ICdrZXJuZWxTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTWF4UG9vbDNEJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna3NpemUnLFxuICAgICAgICAnbmFtZSc6ICdrZXJuZWxTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ29udjFEJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdmaWx0ZXInLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlJyxcbiAgICAgICAgJ25hbWUnOiAnc3RyaWRlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ25hbWUnOiAncGFkJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ05XQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkaWxhdGlvbicsXG4gICAgICAgICduYW1lJzogJ2RpbGF0aW9uJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDFcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ29udjJEJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdmaWx0ZXInLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ25hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ25hbWUnOiAncGFkJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd1c2VDdWRubk9uR3B1JyxcbiAgICAgICAgJ25hbWUnOiAndXNlQ3Vkbm5PbkdwdScsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAnTkhXQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXhwbGljaXRfcGFkZGluZ3MnLFxuICAgICAgICAnbmFtZSc6ICdleHBsaWNpdFBhZGRpbmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogW11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ19GdXNlZENvbnYyRCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnZvbHV0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZmlsdGVyJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ2VuZCc6IDAsXG4gICAgICAgICduYW1lJzogJ2FyZ3MnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ251bV9hcmdzJyxcbiAgICAgICAgJ25hbWUnOiAnbnVtQXJncycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ25hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ25hbWUnOiAncGFkJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdleHBsaWNpdF9wYWRkaW5ncycsXG4gICAgICAgICduYW1lJzogJ2V4cGxpY2l0UGFkZGluZ3MnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd1c2VfY3Vkbm5fb25fZ3B1JyxcbiAgICAgICAgJ25hbWUnOiAndXNlQ3Vkbm5PbkdwdScsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogJ05IV0MnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RpbGF0aW9ucycsXG4gICAgICAgICduYW1lJzogJ2RpbGF0aW9ucycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IFtcbiAgICAgICAgICAxLFxuICAgICAgICAgIDEsXG4gICAgICAgICAgMSxcbiAgICAgICAgICAxXG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZnVzZWRfb3BzJyxcbiAgICAgICAgJ25hbWUnOiAnZnVzZWRPcHMnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmdbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlcHNpbG9uJyxcbiAgICAgICAgJ25hbWUnOiAnZXBzaWxvbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLjAwMDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbGVha3lyZWx1X2FscGhhJyxcbiAgICAgICAgJ25hbWUnOiAnbGVha3lyZWx1QWxwaGEnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMC4yXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0NvbnYyREJhY2twcm9wSW5wdXQnLFxuICAgICdjYXRlZ29yeSc6ICdjb252b2x1dGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2ZpbHRlcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ291dHB1dFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXhwbGljaXRfcGFkZGluZ3MnLFxuICAgICAgICAnbmFtZSc6ICdleHBsaWNpdFBhZGRpbmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogW11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdEZXB0aHdpc2VDb252MmQnLFxuICAgICdjYXRlZ29yeSc6ICdjb252b2x1dGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW5wdXQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdmaWx0ZXInLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncGFkZGluZycsXG4gICAgICAgICduYW1lJzogJ3BhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6ICdOSFdDJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdleHBsaWNpdF9wYWRkaW5ncycsXG4gICAgICAgICduYW1lJzogJ2V4cGxpY2l0UGFkZGluZ3MnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkaWxhdGlvbnMnLFxuICAgICAgICAnbmFtZSc6ICdkaWxhdGlvbnMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRGVwdGh3aXNlQ29udjJkTmF0aXZlJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2lucHV0JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZmlsdGVyJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAnTkhXQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXhwbGljaXRfcGFkZGluZ3MnLFxuICAgICAgICAnbmFtZSc6ICdleHBsaWNpdFBhZGRpbmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogW11cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0Z1c2VkRGVwdGh3aXNlQ29udjJkTmF0aXZlJyxcbiAgICAnY2F0ZWdvcnknOiAnY29udm9sdXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdmaWx0ZXInLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAnYXJncycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbnVtX2FyZ3MnLFxuICAgICAgICAnbmFtZSc6ICdudW1BcmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAnTkhXQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogW1xuICAgICAgICAgIDEsXG4gICAgICAgICAgMSxcbiAgICAgICAgICAxLFxuICAgICAgICAgIDFcbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdmdXNlZF9vcHMnLFxuICAgICAgICAnbmFtZSc6ICdmdXNlZE9wcycsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZ1tdJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IFtdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2V4cGxpY2l0X3BhZGRpbmdzJyxcbiAgICAgICAgJ25hbWUnOiAnZXhwbGljaXRQYWRkaW5ncycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IFtdXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0NvbnYzRCcsXG4gICAgJ2NhdGVnb3J5JzogJ2NvbnZvbHV0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZmlsdGVyJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAnbmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAnbmFtZSc6ICdwYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAnTkhXQydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ25hbWUnOiAnZGlsYXRpb25zJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0RpbGF0aW9uMkQnLFxuICAgICdjYXRlZ29yeSc6ICdjb252b2x1dGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2ZpbHRlcicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzdHJpZGVzJyxcbiAgICAgICAgJ25hbWUnOiAnc3RyaWRlcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdyYXRlcycsXG4gICAgICAgICduYW1lJzogJ2RpbGF0aW9ucycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ25hbWUnOiAncGFkJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXVxuO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'Fill',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'shape',\n                'type': 'number[]'\n            },\n            {\n                'start': 1,\n                'name': 'value',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LinSpace',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'start',\n                'type': 'number'\n            },\n            {\n                'start': 1,\n                'name': 'stop',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'num',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'OneHot',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'indices',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'depth',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'onValue',\n                'type': 'number',\n                'defaultValue': 1\n            },\n            {\n                'start': 3,\n                'name': 'offValue',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'axis',\n                'name': 'axis',\n                'type': 'number',\n                'notSupported': true\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Ones',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'shape',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'OnesLike',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'RandomStandardNormal',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'shape',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'seed',\n                'name': 'seed',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'seed2',\n                'name': 'seed2',\n                'type': 'number',\n                'defaultValue': 0,\n                'notSupported': true\n            },\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'T',\n                'name': 'T',\n                'type': 'number',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'RandomUniform',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'shape',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'minval',\n                'name': 'minval',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'maxval',\n                'name': 'maxval',\n                'type': 'number',\n                'defaultValue': 1\n            },\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'seed',\n                'name': 'seed',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'seed2',\n                'name': 'seed2',\n                'type': 'number',\n                'defaultValue': 0,\n                'notSupported': true\n            },\n            {\n                'tfName': 'T',\n                'name': 'T',\n                'type': 'number',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Range',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'start',\n                'type': 'number'\n            },\n            {\n                'start': 1,\n                'name': 'stop',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'step',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'Tidx',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TruncatedNormal',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'shape',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'means',\n                'name': 'mean',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'stddev',\n                'name': 'stdDev',\n                'type': 'number',\n                'defaultValue': 1\n            },\n            {\n                'tfName': 'seed',\n                'name': 'seed',\n                'type': 'number'\n            },\n            {\n                'tfName': 'seed2',\n                'name': 'seed2',\n                'type': 'number',\n                'defaultValue': 0,\n                'notSupported': true\n            },\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'T',\n                'name': 'T',\n                'type': 'number',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Zeros',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'shape',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ZerosLike',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Multinomial',\n        'category': 'creation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'logits',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'numSamples',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'seed',\n                'name': 'seed',\n                'type': 'number'\n            },\n            {\n                'tfName': 'seed2',\n                'name': 'seed2',\n                'type': 'number'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'output_dtype',\n                'name': 'output_dtype',\n                'type': 'dtype'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L2NyZWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2FBQ2hCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLFVBQVU7UUFDdEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxLQUFLO2dCQUNiLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztn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QjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxjQUFjO2dCQUN4QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0NBQ0YsQ0FDQSIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0ZpbGwnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3ZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMaW5TcGFjZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NyZWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdzdGFydCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3N0b3AnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdudW0nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdPbmVIb3QnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2RlcHRoJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnb25WYWx1ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAxXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdvZmZWYWx1ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYXhpcycsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnT25lcycsXG4gICAgJ2NhdGVnb3J5JzogJ2NyZWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdzaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdPbmVzTGlrZScsXG4gICAgJ2NhdGVnb3J5JzogJ2NyZWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmFuZG9tU3RhbmRhcmROb3JtYWwnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzZWVkJyxcbiAgICAgICAgJ25hbWUnOiAnc2VlZCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NlZWQyJyxcbiAgICAgICAgJ25hbWUnOiAnc2VlZDInLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMCxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnVCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JhbmRvbVVuaWZvcm0nLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtaW52YWwnLFxuICAgICAgICAnbmFtZSc6ICdtaW52YWwnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtYXh2YWwnLFxuICAgICAgICAnbmFtZSc6ICdtYXh2YWwnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NlZWQnLFxuICAgICAgICAnbmFtZSc6ICdzZWVkJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2VlZDInLFxuICAgICAgICAnbmFtZSc6ICdzZWVkMicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnVCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JhbmdlJyxcbiAgICAnY2F0ZWdvcnknOiAnY3JlYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3N0YXJ0JyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc3RvcCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3N0ZXAnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RpZHgnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdUcnVuY2F0ZWROb3JtYWwnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtZWFucycsXG4gICAgICAgICduYW1lJzogJ21lYW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzdGRkZXYnLFxuICAgICAgICAnbmFtZSc6ICdzdGREZXYnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzZWVkJyxcbiAgICAgICAgJ25hbWUnOiAnc2VlZCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2VlZDInLFxuICAgICAgICAnbmFtZSc6ICdzZWVkMicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdUJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnWmVyb3MnLFxuICAgICdjYXRlZ29yeSc6ICdjcmVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnWmVyb3NMaWtlJyxcbiAgICAnY2F0ZWdvcnknOiAnY3JlYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ011bHRpbm9taWFsJyxcbiAgICAnY2F0ZWdvcnknOiAnY3JlYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2xvZ2l0cycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ251bVNhbXBsZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2VlZCcsXG4gICAgICAgICduYW1lJzogJ3NlZWQnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NlZWQyJyxcbiAgICAgICAgJ25hbWUnOiAnc2VlZDInLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdvdXRwdXRfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdvdXRwdXRfZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH1cbl1cbjtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'NonMaxSuppressionV2',\n        'category': 'dynamic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'boxes',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'scores',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'maxOutputSize',\n                'type': 'number'\n            },\n            {\n                'start': 3,\n                'name': 'iouThreshold',\n                'type': 'number'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'NonMaxSuppressionV3',\n        'category': 'dynamic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'boxes',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'scores',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'maxOutputSize',\n                'type': 'number'\n            },\n            {\n                'start': 3,\n                'name': 'iouThreshold',\n                'type': 'number'\n            },\n            {\n                'start': 4,\n                'name': 'scoreThreshold',\n                'type': 'number'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'NonMaxSuppressionV4',\n        'category': 'dynamic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'boxes',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'scores',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'maxOutputSize',\n                'type': 'number'\n            },\n            {\n                'start': 3,\n                'name': 'iouThreshold',\n                'type': 'number'\n            },\n            {\n                'start': 4,\n                'name': 'scoreThreshold',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'T_threshold',\n                'name': 'threshold',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'pad_to_max_output_size',\n                'name': 'padToMaxOutputSize',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'NonMaxSuppressionV5',\n        'category': 'dynamic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'boxes',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'scores',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'maxOutputSize',\n                'type': 'number'\n            },\n            {\n                'start': 3,\n                'name': 'iouThreshold',\n                'type': 'number'\n            },\n            {\n                'start': 4,\n                'name': 'scoreThreshold',\n                'type': 'number'\n            },\n            {\n                'start': 5,\n                'name': 'softNmsSigma',\n                'type': 'number'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Where',\n        'category': 'dynamic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'condition',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ListDiff',\n        'category': 'dynamic',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'y',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvZHluYW1pYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUscUJBQXFCO1FBQ2pDLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGVBQWU7Z0JBQ3ZCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLHFCQUFxQjtRQUNqQyxVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxlQUFlO2dCQUN2QixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dC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Q0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdOb25NYXhTdXBwcmVzc2lvblYyJyxcbiAgICAnY2F0ZWdvcnknOiAnZHluYW1pYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYm94ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzY29yZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdtYXhPdXRwdXRTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnaW91VGhyZXNob2xkJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdOb25NYXhTdXBwcmVzc2lvblYzJyxcbiAgICAnY2F0ZWdvcnknOiAnZHluYW1pYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYm94ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzY29yZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdtYXhPdXRwdXRTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnaW91VGhyZXNob2xkJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogNCxcbiAgICAgICAgJ25hbWUnOiAnc2NvcmVUaHJlc2hvbGQnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05vbk1heFN1cHByZXNzaW9uVjQnLFxuICAgICdjYXRlZ29yeSc6ICdkeW5hbWljJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdib3hlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3Njb3JlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ21heE91dHB1dFNpemUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdpb3VUaHJlc2hvbGQnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiA0LFxuICAgICAgICAnbmFtZSc6ICdzY29yZVRocmVzaG9sZCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RfdGhyZXNob2xkJyxcbiAgICAgICAgJ25hbWUnOiAndGhyZXNob2xkJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwYWRfdG9fbWF4X291dHB1dF9zaXplJyxcbiAgICAgICAgJ25hbWUnOiAncGFkVG9NYXhPdXRwdXRTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTm9uTWF4U3VwcHJlc3Npb25WNScsXG4gICAgJ2NhdGVnb3J5JzogJ2R5bmFtaWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2JveGVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2NvcmVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnbWF4T3V0cHV0U2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDMsXG4gICAgICAgICduYW1lJzogJ2lvdVRocmVzaG9sZCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDQsXG4gICAgICAgICduYW1lJzogJ3Njb3JlVGhyZXNob2xkJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogNSxcbiAgICAgICAgJ25hbWUnOiAnc29mdE5tc1NpZ21hJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdXaGVyZScsXG4gICAgJ2NhdGVnb3J5JzogJ2R5bmFtaWMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2NvbmRpdGlvbicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xpc3REaWZmJyxcbiAgICAnY2F0ZWdvcnknOiAnZHluYW1pYycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3knLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'LowerBound',\n        'category': 'evaluation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'sortedSequence',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'values',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'TopKV2',\n        'category': 'evaluation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'k',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'sorted',\n                'name': 'sorted',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'UpperBound',\n        'category': 'evaluation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'sortedSequence',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'values',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Unique',\n        'category': 'evaluation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'UniqueV2',\n        'category': 'evaluation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvZXZhbHVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsWUFBWTtRQUN4QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsZ0JBQWdCO2dCQUN4QixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxnQkFBZ0I7Z0JBQ3hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFFBQVE7UUFDcEIsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsVUFBVTtRQUN0QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMb3dlckJvdW5kJyxcbiAgICAnY2F0ZWdvcnknOiAnZXZhbHVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnc29ydGVkU2VxdWVuY2UnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd2YWx1ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RvcEtWMicsXG4gICAgJ2NhdGVnb3J5JzogJ2V2YWx1YXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdrJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NvcnRlZCcsXG4gICAgICAgICduYW1lJzogJ3NvcnRlZCcsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1VwcGVyQm91bmQnLFxuICAgICdjYXRlZ29yeSc6ICdldmFsdWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdzb3J0ZWRTZXF1ZW5jZScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3ZhbHVlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVW5pcXVlJyxcbiAgICAnY2F0ZWdvcnknOiAnZXZhbHVhdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVW5pcXVlVjInLFxuICAgICdjYXRlZ29yeSc6ICdldmFsdWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYXhpcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdXG4gIH1cbl1cbjtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'PlaceholderWithDefault',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'default',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'shape',\n                'name': 'shape',\n                'type': 'shape'\n            },\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Placeholder',\n        'category': 'graph',\n        'attrs': [\n            {\n                'tfName': 'shape',\n                'name': 'shape',\n                'type': 'shape'\n            },\n            {\n                'tfName': 'dtype',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Const',\n        'category': 'graph'\n    },\n    {\n        'tfOpName': 'Identity',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'IdentityN',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'end': 0,\n                'name': 'x',\n                'type': 'tensors'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Snapshot',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Rank',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Size',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Shape',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ShapeN',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'end': 0,\n                'name': 'x',\n                'type': 'tensors'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Print',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'data',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'message',\n                'name': 'message',\n                'type': 'string'\n            },\n            {\n                'tfName': 'first_n',\n                'name': 'firstN',\n                'type': 'number',\n                'notSupported': true\n            },\n            {\n                'tfName': 'summarize',\n                'name': 'summarize',\n                'type': 'number',\n                'defaultValue': 3\n            }\n        ]\n    },\n    {\n        'tfOpName': 'NoOp',\n        'category': 'graph',\n        'inputs': []\n    },\n    {\n        'tfOpName': 'StopGradient',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'FakeQuantWithMinMaxVars',\n        'category': 'graph',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'min',\n                'name': 'min',\n                'type': 'number'\n            },\n            {\n                'tfName': 'max',\n                'name': 'max',\n                'type': 'number'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L2dyYXBoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSx3QkFBd0I7UUFDcEMsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsYUFBYTtRQUN6QixVQUFVLEVBQUUsT0FBTztRQUNuQixPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsT0FBTztnQkFDakIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsT0FBTztLQUNwQjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsV0FBVztRQUN2QixVQUFVLEVBQUUsT0FBTztRQUNuQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsU0FBUzthQUNsQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLE1BQU07UUFDbEIsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsT0FBTztRQUNuQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFFBQVE7UUFDcEIsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsS0FBSyxFQUFFLENBQUM7Z0JBQ1IsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFNBQVM7YUFDbEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsT0FBTztRQUNuQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxTQUFTO2FBQ2xCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsU0FBUztnQkFDbkIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsQ0FBQzthQUNsQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFFBQVEsRUFBRSxFQUFFO0tBQ2I7SUFDRDtRQUNFLFVBQVUsRUFBRSxjQUFjO1FBQzFCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLHlCQUF5QjtRQUNyQyxVQUFVLEVBQUUsT0FBTztRQUNuQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLEtBQUs7Z0JBQ2YsTUFBTSxFQUFFLEtBQUs7Z0JBQ2IsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUGxhY2Vob2xkZXJXaXRoRGVmYXVsdCcsXG4gICAgJ2NhdGVnb3J5JzogJ2dyYXBoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdkZWZhdWx0JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NoYXBlJyxcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdzaGFwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdQbGFjZWhvbGRlcicsXG4gICAgJ2NhdGVnb3J5JzogJ2dyYXBoJyxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2hhcGUnLFxuICAgICAgICAnbmFtZSc6ICdzaGFwZScsXG4gICAgICAgICd0eXBlJzogJ3NoYXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkdHlwZScsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0NvbnN0JyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSWRlbnRpdHknLFxuICAgICdjYXRlZ29yeSc6ICdncmFwaCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSWRlbnRpdHlOJyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICdlbmQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU25hcHNob3QnLFxuICAgICdjYXRlZ29yeSc6ICdncmFwaCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmFuaycsXG4gICAgJ2NhdGVnb3J5JzogJ2dyYXBoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTaXplJyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NoYXBlJyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NoYXBlTicsXG4gICAgJ2NhdGVnb3J5JzogJ2dyYXBoJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1ByaW50JyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdkYXRhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtZXNzYWdlJyxcbiAgICAgICAgJ25hbWUnOiAnbWVzc2FnZScsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZmlyc3RfbicsXG4gICAgICAgICduYW1lJzogJ2ZpcnN0TicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3N1bW1hcml6ZScsXG4gICAgICAgICduYW1lJzogJ3N1bW1hcml6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAzXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05vT3AnLFxuICAgICdjYXRlZ29yeSc6ICdncmFwaCcsXG4gICAgJ2lucHV0cyc6IFtdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RvcEdyYWRpZW50JyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0Zha2VRdWFudFdpdGhNaW5NYXhWYXJzJyxcbiAgICAnY2F0ZWdvcnknOiAnZ3JhcGgnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbWluJyxcbiAgICAgICAgJ25hbWUnOiAnbWluJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtYXgnLFxuICAgICAgICAnbmFtZSc6ICdtYXgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'HashTable',\n        'category': 'hash_table',\n        'inputs': [],\n        'attrs': [\n            {\n                'tfName': 'shared_name',\n                'name': 'sharedName',\n                'type': 'string'\n            },\n            {\n                'tfName': 'use_node_name_sharing',\n                'name': 'useNodeNameSharing',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'key_dtype',\n                'name': 'keyDType',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'value_dtype',\n                'name': 'valueDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'HashTableV2',\n        'category': 'hash_table',\n        'inputs': [],\n        'attrs': [\n            {\n                'tfName': 'shared_name',\n                'name': 'sharedName',\n                'type': 'string'\n            },\n            {\n                'tfName': 'use_node_name_sharing',\n                'name': 'useNodeNameSharing',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'key_dtype',\n                'name': 'keyDType',\n                'type': 'dtype'\n            },\n            {\n                'tfName': 'value_dtype',\n                'name': 'valueDType',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LookupTableImport',\n        'category': 'hash_table',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tableHandle',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'keys',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'values',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'Tin',\n                'name': 'tIn',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'Tout',\n                'name': 'tOut',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LookupTableImportV2',\n        'category': 'hash_table',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tableHandle',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'keys',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'values',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'Tin',\n                'name': 'tIn',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'Tout',\n                'name': 'tOut',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LookupTableFind',\n        'category': 'hash_table',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tableHandle',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'keys',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'defaultValue',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'Tin',\n                'name': 'tIn',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'Tout',\n                'name': 'tOut',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LookupTableFindV2',\n        'category': 'hash_table',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tableHandle',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'keys',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'defaultValue',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'Tin',\n                'name': 'tIn',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'Tout',\n                'name': 'tOut',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LookupTableSize',\n        'category': 'hash_table',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tableHandle',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LookupTableSizeV2',\n        'category': 'hash_table',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tableHandle',\n                'type': 'tensor'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaF90YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvaGFzaF90YWJsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsV0FBVztRQUN2QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsT0FBTzthQUNoQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsYUFBYTtRQUN6QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUUsRUFBRTtRQUNaLE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxhQUFhO2dCQUN2QixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsdUJBQXVCO2dCQUNqQyxNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFV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RSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGNBQWM7Z0JBQ3RCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxpQkFBaUI7UUFDN0IsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsYUFBYTtnQkFDckIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0hhc2hUYWJsZScsXG4gICAgJ2NhdGVnb3J5JzogJ2hhc2hfdGFibGUnLFxuICAgICdpbnB1dHMnOiBbXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnc2hhcmVkX25hbWUnLFxuICAgICAgICAnbmFtZSc6ICdzaGFyZWROYW1lJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd1c2Vfbm9kZV9uYW1lX3NoYXJpbmcnLFxuICAgICAgICAnbmFtZSc6ICd1c2VOb2RlTmFtZVNoYXJpbmcnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdrZXlfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICdrZXlEVHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd2YWx1ZV9kdHlwZScsXG4gICAgICAgICduYW1lJzogJ3ZhbHVlRFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSGFzaFRhYmxlVjInLFxuICAgICdjYXRlZ29yeSc6ICdoYXNoX3RhYmxlJyxcbiAgICAnaW5wdXRzJzogW10sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NoYXJlZF9uYW1lJyxcbiAgICAgICAgJ25hbWUnOiAnc2hhcmVkTmFtZScsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAndXNlX25vZGVfbmFtZV9zaGFyaW5nJyxcbiAgICAgICAgJ25hbWUnOiAndXNlTm9kZU5hbWVTaGFyaW5nJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2V5X2R0eXBlJyxcbiAgICAgICAgJ25hbWUnOiAna2V5RFR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAndmFsdWVfZHR5cGUnLFxuICAgICAgICAnbmFtZSc6ICd2YWx1ZURUeXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xvb2t1cFRhYmxlSW1wb3J0JyxcbiAgICAnY2F0ZWdvcnknOiAnaGFzaF90YWJsZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGFibGVIYW5kbGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdrZXlzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAndmFsdWVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RpbicsXG4gICAgICAgICduYW1lJzogJ3RJbicsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVG91dCcsXG4gICAgICAgICduYW1lJzogJ3RPdXQnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xvb2t1cFRhYmxlSW1wb3J0VjInLFxuICAgICdjYXRlZ29yeSc6ICdoYXNoX3RhYmxlJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0YWJsZUhhbmRsZScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2tleXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICd2YWx1ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVGluJyxcbiAgICAgICAgJ25hbWUnOiAndEluJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUb3V0JyxcbiAgICAgICAgJ25hbWUnOiAndE91dCcsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9va3VwVGFibGVGaW5kJyxcbiAgICAnY2F0ZWdvcnknOiAnaGFzaF90YWJsZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGFibGVIYW5kbGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdrZXlzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RpbicsXG4gICAgICAgICduYW1lJzogJ3RJbicsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVG91dCcsXG4gICAgICAgICduYW1lJzogJ3RPdXQnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xvb2t1cFRhYmxlRmluZFYyJyxcbiAgICAnY2F0ZWdvcnknOiAnaGFzaF90YWJsZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAndGFibGVIYW5kbGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdrZXlzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1RpbicsXG4gICAgICAgICduYW1lJzogJ3RJbicsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVG91dCcsXG4gICAgICAgICduYW1lJzogJ3RPdXQnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xvb2t1cFRhYmxlU2l6ZScsXG4gICAgJ2NhdGVnb3J5JzogJ2hhc2hfdGFibGUnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RhYmxlSGFuZGxlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMb29rdXBUYWJsZVNpemVWMicsXG4gICAgJ2NhdGVnb3J5JzogJ2hhc2hfdGFibGUnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3RhYmxlSGFuZGxlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'ResizeBilinear',\n        'category': 'image',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'images',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'size',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'align_corners',\n                'name': 'alignCorners',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'half_pixel_centers',\n                'name': 'halfPixelCenters',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ResizeNearestNeighbor',\n        'category': 'image',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'images',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'size',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'align_corners',\n                'name': 'alignCorners',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'half_pixel_centers',\n                'name': 'halfPixelCenters',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'CropAndResize',\n        'category': 'image',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'image',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'boxes',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'boxInd',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'cropSize',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'method',\n                'name': 'method',\n                'type': 'string'\n            },\n            {\n                'tfName': 'extrapolation_value',\n                'name': 'extrapolationValue',\n                'type': 'number'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ImageProjectiveTransformV3',\n        'category': 'image',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'images',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'transforms',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'outputShape',\n                'type': 'number[]'\n            },\n            {\n                'start': 3,\n                'name': 'fillValue',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'interpolation',\n                'name': 'interpolation',\n                'type': 'string'\n            },\n            {\n                'tfName': 'fill_mode',\n                'name': 'fillMode',\n                'type': 'string'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L2ltYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLE1BQU07YUFDZjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxNQUFNO2FBQ2Y7WUFDRDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSx1QkFBdUI7UUFDbkMsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLE1BQU07YUFDZjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxvQkFBb0I7Z0JBQzlCLE1BQU0sRUFBRSxrQkFBa0I7Z0JBQzFCLE1BQU0sRUFBRSxNQUFNO2FBQ2Y7WUFDRDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxlQUFlO1FBQzNCLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxRQUFRO2dCQUNsQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUscUJBQXFCO2dCQUMvQixNQUFNLEVBQUUsb0JBQW9CO2dCQUM1QixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSw0QkFBNEI7UUFDeEMsVUFBVSxFQUFFLE9BQU87UUFDbkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFdBQVc7Z0JBQ25CLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsZUFBZTtnQkFDekIsTUFBTSxFQUFFLGVBQWU7Z0JBQ3ZCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2dCQUNsQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmVzaXplQmlsaW5lYXInLFxuICAgICdjYXRlZ29yeSc6ICdpbWFnZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW1hZ2VzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2FsaWduX2Nvcm5lcnMnLFxuICAgICAgICAnbmFtZSc6ICdhbGlnbkNvcm5lcnMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdoYWxmX3BpeGVsX2NlbnRlcnMnLFxuICAgICAgICAnbmFtZSc6ICdoYWxmUGl4ZWxDZW50ZXJzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdSZXNpemVOZWFyZXN0TmVpZ2hib3InLFxuICAgICdjYXRlZ29yeSc6ICdpbWFnZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW1hZ2VzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2FsaWduX2Nvcm5lcnMnLFxuICAgICAgICAnbmFtZSc6ICdhbGlnbkNvcm5lcnMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdoYWxmX3BpeGVsX2NlbnRlcnMnLFxuICAgICAgICAnbmFtZSc6ICdoYWxmUGl4ZWxDZW50ZXJzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDcm9wQW5kUmVzaXplJyxcbiAgICAnY2F0ZWdvcnknOiAnaW1hZ2UnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2ltYWdlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYm94ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdib3hJbmQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdjcm9wU2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ21ldGhvZCcsXG4gICAgICAgICduYW1lJzogJ21ldGhvZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXh0cmFwb2xhdGlvbl92YWx1ZScsXG4gICAgICAgICduYW1lJzogJ2V4dHJhcG9sYXRpb25WYWx1ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnSW1hZ2VQcm9qZWN0aXZlVHJhbnNmb3JtVjMnLFxuICAgICdjYXRlZ29yeSc6ICdpbWFnZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW1hZ2VzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAndHJhbnNmb3JtcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ291dHB1dFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdmaWxsVmFsdWUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnaW50ZXJwb2xhdGlvbicsXG4gICAgICAgICduYW1lJzogJ2ludGVycG9sYXRpb24nLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2ZpbGxfbW9kZScsXG4gICAgICAgICduYW1lJzogJ2ZpbGxNb2RlJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'Equal',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'NotEqual',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Greater',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'GreaterEqual',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Less',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LessEqual',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LogicalAnd',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LogicalNot',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LogicalOr',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Select',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'condition',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SelectV2',\n        'category': 'logical',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'condition',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3QvbG9naWNhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFVBQVUsRUFBRSxTQUFTO1FBQ3JCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFF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QUUsU0FBUztRQUNyQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsT0FBTztnQkFDZixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRXF1YWwnLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ05vdEVxdWFsJyxcbiAgICAnY2F0ZWdvcnknOiAnbG9naWNhbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdHcmVhdGVyJyxcbiAgICAnY2F0ZWdvcnknOiAnbG9naWNhbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdHcmVhdGVyRXF1YWwnLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xlc3MnLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xlc3NFcXVhbCcsXG4gICAgJ2NhdGVnb3J5JzogJ2xvZ2ljYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9naWNhbEFuZCcsXG4gICAgJ2NhdGVnb3J5JzogJ2xvZ2ljYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnTG9naWNhbE5vdCcsXG4gICAgJ2NhdGVnb3J5JzogJ2xvZ2ljYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMb2dpY2FsT3InLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NlbGVjdCcsXG4gICAgJ2NhdGVnb3J5JzogJ2xvZ2ljYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2NvbmRpdGlvbicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU2VsZWN0VjInLFxuICAgICdjYXRlZ29yeSc6ICdsb2dpY2FsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdjb25kaXRpb24nLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': '_FusedMatMul',\n        'category': 'matrices',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'end': 0,\n                'name': 'args',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'num_args',\n                'name': 'numArgs',\n                'type': 'number'\n            },\n            {\n                'tfName': 'fused_ops',\n                'name': 'fusedOps',\n                'type': 'string[]',\n                'defaultValue': []\n            },\n            {\n                'tfName': 'epsilon',\n                'name': 'epsilon',\n                'type': 'number',\n                'defaultValue': 0.0001\n            },\n            {\n                'tfName': 'transpose_a',\n                'name': 'transposeA',\n                'type': 'bool',\n                'defaultValue': false\n            },\n            {\n                'tfName': 'transpose_b',\n                'name': 'transposeB',\n                'type': 'bool',\n                'defaultValue': false\n            },\n            {\n                'tfName': 'leakyrelu_alpha',\n                'name': 'leakyreluAlpha',\n                'type': 'number',\n                'defaultValue': 0.2\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'MatMul',\n        'category': 'matrices',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'transpose_a',\n                'name': 'transposeA',\n                'type': 'bool',\n                'defaultValue': false\n            },\n            {\n                'tfName': 'transpose_b',\n                'name': 'transposeB',\n                'type': 'bool',\n                'defaultValue': false\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'BatchMatMul',\n        'category': 'matrices',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'adj_x',\n                'name': 'transposeA',\n                'type': 'bool',\n                'defaultValue': false\n            },\n            {\n                'tfName': 'adj_y',\n                'name': 'transposeB',\n                'type': 'bool',\n                'defaultValue': false\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'BatchMatMulV2',\n        'category': 'matrices',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'a',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'b',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'adj_x',\n                'name': 'transposeA',\n                'type': 'bool',\n                'defaultValue': false\n            },\n            {\n                'tfName': 'adj_y',\n                'name': 'transposeB',\n                'type': 'bool',\n                'defaultValue': false\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Transpose',\n        'category': 'matrices',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'perm',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Einsum',\n        'category': 'matrices',\n        'inputs': [\n            {\n                'start': 0,\n                'end': 0,\n                'name': 'tensors',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'equation',\n                'name': 'equation',\n                'type': 'string'\n            },\n            {\n                'tfName': 'N',\n                'name': 'n',\n                'type': 'number',\n                'defaultValue': 2\n            },\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cmljZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L21hdHJpY2VzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxjQUFjO1FBQzFCLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsU0FBUzthQUNsQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLGNBQWMsRUFBRSxFQUFFO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLE1BQU07YUFDdkI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsYUFBYTtnQkFDdkIsTUFBTSxFQUFFLFlBQVk7Z0JBQ3BCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxLQUFL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KipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnX0Z1c2VkTWF0TXVsJyxcbiAgICAnY2F0ZWdvcnknOiAnbWF0cmljZXMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ2VuZCc6IDAsXG4gICAgICAgICduYW1lJzogJ2FyZ3MnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ251bV9hcmdzJyxcbiAgICAgICAgJ25hbWUnOiAnbnVtQXJncycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZnVzZWRfb3BzJyxcbiAgICAgICAgJ25hbWUnOiAnZnVzZWRPcHMnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmdbXScsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBbXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlcHNpbG9uJyxcbiAgICAgICAgJ25hbWUnOiAnZXBzaWxvbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLjAwMDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAndHJhbnNwb3NlX2EnLFxuICAgICAgICAnbmFtZSc6ICd0cmFuc3Bvc2VBJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCcsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd0cmFuc3Bvc2VfYicsXG4gICAgICAgICduYW1lJzogJ3RyYW5zcG9zZUInLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IGZhbHNlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2xlYWt5cmVsdV9hbHBoYScsXG4gICAgICAgICduYW1lJzogJ2xlYWt5cmVsdUFscGhhJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDAuMlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01hdE11bCcsXG4gICAgJ2NhdGVnb3J5JzogJ21hdHJpY2VzJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd0cmFuc3Bvc2VfYScsXG4gICAgICAgICduYW1lJzogJ3RyYW5zcG9zZUEnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IGZhbHNlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3RyYW5zcG9zZV9iJyxcbiAgICAgICAgJ25hbWUnOiAndHJhbnNwb3NlQicsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCYXRjaE1hdE11bCcsXG4gICAgJ2NhdGVnb3J5JzogJ21hdHJpY2VzJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdhZGpfeCcsXG4gICAgICAgICduYW1lJzogJ3RyYW5zcG9zZUEnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IGZhbHNlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2Fkal95JyxcbiAgICAgICAgJ25hbWUnOiAndHJhbnNwb3NlQicsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCYXRjaE1hdE11bFYyJyxcbiAgICAnY2F0ZWdvcnknOiAnbWF0cmljZXMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2EnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdiJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2Fkal94JyxcbiAgICAgICAgJ25hbWUnOiAndHJhbnNwb3NlQScsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogZmFsc2VcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYWRqX3knLFxuICAgICAgICAnbmFtZSc6ICd0cmFuc3Bvc2VCJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCcsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdUJyxcbiAgICAgICAgJ25hbWUnOiAnZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1RyYW5zcG9zZScsXG4gICAgJ2NhdGVnb3J5JzogJ21hdHJpY2VzJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAncGVybScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRWluc3VtJyxcbiAgICAnY2F0ZWdvcnknOiAnbWF0cmljZXMnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICdlbmQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3JzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29ycydcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlcXVhdGlvbicsXG4gICAgICAgICduYW1lJzogJ2VxdWF0aW9uJyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdOJyxcbiAgICAgICAgJ25hbWUnOiAnbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAyXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1QnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXVxuO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'EuclideanNorm',\n        'category': 'normalization',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool',\n                'defaultValue': false\n            }\n        ]\n    },\n    {\n        'tfOpName': 'FusedBatchNorm',\n        'category': 'normalization',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'scale',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'offset',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'mean',\n                'type': 'tensor'\n            },\n            {\n                'start': 4,\n                'name': 'variance',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'epsilon',\n                'name': 'epsilon',\n                'type': 'number',\n                'defaultValue': 0.001\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'FusedBatchNormV2',\n        'category': 'normalization',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'scale',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'offset',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'mean',\n                'type': 'tensor'\n            },\n            {\n                'start': 4,\n                'name': 'variance',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'epsilon',\n                'name': 'epsilon',\n                'type': 'number',\n                'defaultValue': 0.001\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'FusedBatchNormV3',\n        'category': 'normalization',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'scale',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'offset',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'mean',\n                'type': 'tensor'\n            },\n            {\n                'start': 4,\n                'name': 'variance',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'epsilon',\n                'name': 'epsilon',\n                'type': 'number',\n                'defaultValue': 0.001\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LRN',\n        'category': 'normalization',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'depth_radius',\n                'name': 'radius',\n                'type': 'number',\n                'defaultValue': 5\n            },\n            {\n                'tfName': 'bias',\n                'name': 'bias',\n                'type': 'number',\n                'defaultValue': 1\n            },\n            {\n                'tfName': 'alpha',\n                'name': 'alpha',\n                'type': 'number',\n                'defaultValue': 1\n            },\n            {\n                'tfName': 'beta',\n                'name': 'beta',\n                'type': 'number',\n                'defaultValue': 0.5\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Softmax',\n        'category': 'normalization',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'LogSoftmax',\n        'category': 'normalization',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SparseToDense',\n        'category': 'normalization',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'sparseIndices',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'outputShape',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'sparseValues',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'defaultValue',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'validate_indices',\n                'name': 'validateIndices',\n                'type': 'bool',\n                'defaultValue': true,\n                'notSupported': true\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXphdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3Qvbm9ybWFsaXphdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsZUFBZTtRQUMzQixVQUFVLEVBQUUsZUFBZTtRQUMzQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxLQUFLO2FBQ3RCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLGdCQUFnQjtRQUM1QixVQUFVLEVBQUUsZUFBZTtRQUMzQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2Qs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QUNuQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsTUFBTSxFQUFFLGlCQUFpQjtnQkFDekIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsY0FBYyxFQUFFLElBQUk7Z0JBQ3BCLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFdWNsaWRlYW5Ob3JtJyxcbiAgICAnY2F0ZWdvcnknOiAnbm9ybWFsaXphdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdrZWVwX2RpbXMnLFxuICAgICAgICAnbmFtZSc6ICdrZWVwRGltcycsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogZmFsc2VcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRnVzZWRCYXRjaE5vcm0nLFxuICAgICdjYXRlZ29yeSc6ICdub3JtYWxpemF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2NhbGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdvZmZzZXQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAzLFxuICAgICAgICAnbmFtZSc6ICdtZWFuJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogNCxcbiAgICAgICAgJ25hbWUnOiAndmFyaWFuY2UnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXBzaWxvbicsXG4gICAgICAgICduYW1lJzogJ2Vwc2lsb24nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMC4wMDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGF0YV9mb3JtYXQnLFxuICAgICAgICAnbmFtZSc6ICdkYXRhRm9ybWF0JyxcbiAgICAgICAgJ3R5cGUnOiAnc3RyaW5nJyxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnRnVzZWRCYXRjaE5vcm1WMicsXG4gICAgJ2NhdGVnb3J5JzogJ25vcm1hbGl6YXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzY2FsZScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ29mZnNldCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDMsXG4gICAgICAgICduYW1lJzogJ21lYW4nLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiA0LFxuICAgICAgICAnbmFtZSc6ICd2YXJpYW5jZScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdlcHNpbG9uJyxcbiAgICAgICAgJ25hbWUnOiAnZXBzaWxvbicsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwLjAwMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdGdXNlZEJhdGNoTm9ybVYzJyxcbiAgICAnY2F0ZWdvcnknOiAnbm9ybWFsaXphdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3NjYWxlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnb2Zmc2V0JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnbWVhbicsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDQsXG4gICAgICAgICduYW1lJzogJ3ZhcmlhbmNlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2Vwc2lsb24nLFxuICAgICAgICAnbmFtZSc6ICdlcHNpbG9uJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDAuMDAxXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2RhdGFfZm9ybWF0JyxcbiAgICAgICAgJ25hbWUnOiAnZGF0YUZvcm1hdCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZycsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0xSTicsXG4gICAgJ2NhdGVnb3J5JzogJ25vcm1hbGl6YXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZGVwdGhfcmFkaXVzJyxcbiAgICAgICAgJ25hbWUnOiAncmFkaXVzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYmlhcycsXG4gICAgICAgICduYW1lJzogJ2JpYXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdhbHBoYScsXG4gICAgICAgICduYW1lJzogJ2FscGhhJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYmV0YScsXG4gICAgICAgICduYW1lJzogJ2JldGEnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMC41XG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NvZnRtYXgnLFxuICAgICdjYXRlZ29yeSc6ICdub3JtYWxpemF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdMb2dTb2Z0bWF4JyxcbiAgICAnY2F0ZWdvcnknOiAnbm9ybWFsaXphdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3BhcnNlVG9EZW5zZScsXG4gICAgJ2NhdGVnb3J5JzogJ25vcm1hbGl6YXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3NwYXJzZUluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdvdXRwdXRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnc3BhcnNlVmFsdWVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3ZhbGlkYXRlX2luZGljZXMnLFxuICAgICAgICAnbmFtZSc6ICd2YWxpZGF0ZUluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IHRydWUsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9XG5dXG47XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'Bincount',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'size',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'weights',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'DenseBincount',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'size',\n                'type': 'number'\n            },\n            {\n                'start': 2,\n                'name': 'weights',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'binary_output',\n                'name': 'binaryOutput',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Max',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Mean',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Min',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Sum',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'All',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Any',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ArgMax',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ArgMin',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Prod',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'keep_dims',\n                'name': 'keepDims',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Cumprod',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'exclusive',\n                'name': 'exclusive',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'reverse',\n                'name': 'reverse',\n                'type': 'bool'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Cumsum',\n        'category': 'reduction',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'exclusive',\n                'name': 'exclusive',\n                'type': 'bool'\n            },\n            {\n                'tfName': 'reverse',\n                'name': 'reverse',\n                'type': 'bool'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWN0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvb3BfbGlzdC9yZWR1Y3Rpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFlO0lBQzlCO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLFdBQVc7UUFDdkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxlQUFlO1FBQzNCLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGO0tBQ0Y7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USxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsTUFBTTthQUNmO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFFBQVE7UUFDcEIsVUFBVSxFQUFFLFdBQVc7UUFDdkIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixNQUFNLEVBQUUsTUFBTTthQUNmO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFNBQVM7Z0JBQ25CLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsTUFBTTthQUNmO1NBQ0Y7S0FDRjtDQUNGLENBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtPcE1hcHBlcn0gZnJvbSAnLi4vdHlwZXMnO1xuXG5leHBvcnQgY29uc3QganNvbjogT3BNYXBwZXJbXSA9IFtcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCaW5jb3VudCcsXG4gICAgJ2NhdGVnb3J5JzogJ3JlZHVjdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3NpemUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICd3ZWlnaHRzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdEZW5zZUJpbmNvdW50JyxcbiAgICAnY2F0ZWdvcnknOiAncmVkdWN0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnc2l6ZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3dlaWdodHMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYmluYXJ5X291dHB1dCcsXG4gICAgICAgICduYW1lJzogJ2JpbmFyeU91dHB1dCcsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01heCcsXG4gICAgJ2NhdGVnb3J5JzogJ3JlZHVjdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdrZWVwX2RpbXMnLFxuICAgICAgICAnbmFtZSc6ICdrZWVwRGltcycsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ01lYW4nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdNaW4nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTdW0nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBbGwnLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBbnknLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAna2VlcF9kaW1zJyxcbiAgICAgICAgJ25hbWUnOiAna2VlcERpbXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBcmdNYXgnLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdBcmdNaW4nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdQcm9kJyxcbiAgICAnY2F0ZWdvcnknOiAncmVkdWN0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYXhpcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2tlZXBfZGltcycsXG4gICAgICAgICduYW1lJzogJ2tlZXBEaW1zJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ3VtcHJvZCcsXG4gICAgJ2NhdGVnb3J5JzogJ3JlZHVjdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZXhjbHVzaXZlJyxcbiAgICAgICAgJ25hbWUnOiAnZXhjbHVzaXZlJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncmV2ZXJzZScsXG4gICAgICAgICduYW1lJzogJ3JldmVyc2UnLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDdW1zdW0nLFxuICAgICdjYXRlZ29yeSc6ICdyZWR1Y3Rpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2V4Y2x1c2l2ZScsXG4gICAgICAgICduYW1lJzogJ2V4Y2x1c2l2ZScsXG4gICAgICAgICd0eXBlJzogJ2Jvb2wnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3JldmVyc2UnLFxuICAgICAgICAnbmFtZSc6ICdyZXZlcnNlJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdXG4gIH1cbl1cbjtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'ConcatV2',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'end': -1,\n                'name': 'tensors',\n                'type': 'tensors'\n            },\n            {\n                'start': -1,\n                'name': 'axis',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'N',\n                'name': 'n',\n                'type': 'number',\n                'defaultValue': 2\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Concat',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 1,\n                'end': 0,\n                'name': 'tensors',\n                'type': 'tensors'\n            },\n            {\n                'start': 0,\n                'name': 'axis',\n                'type': 'number'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'N',\n                'name': 'n',\n                'type': 'number',\n                'defaultValue': 2\n            }\n        ]\n    },\n    {\n        'tfOpName': 'GatherV2',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'axis',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'batch_dims',\n                'name': 'batchDims',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Gather',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'validate_indices',\n                'name': 'validateIndices',\n                'type': 'bool',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Reverse',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'dims',\n                'type': 'bool[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ReverseV2',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Slice',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'begin',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'size',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'StridedSlice',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'begin',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'end',\n                'type': 'number[]'\n            },\n            {\n                'start': 3,\n                'name': 'strides',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'begin_mask',\n                'name': 'beginMask',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'end_mask',\n                'name': 'endMask',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'new_axis_mask',\n                'name': 'newAxisMask',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'ellipsis_mask',\n                'name': 'ellipsisMask',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'shrink_axis_mask',\n                'name': 'shrinkAxisMask',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Pack',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'end': 0,\n                'name': 'tensors',\n                'type': 'tensors'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'axis',\n                'name': 'axis',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Unpack',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'tensor',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'axis',\n                'name': 'axis',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'tfName': 'num',\n                'name': 'num',\n                'type': 'number',\n                'defaultValue': 0,\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Tile',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'reps',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Split',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'axis',\n                'type': 'number',\n                'defaultValue': 0\n            },\n            {\n                'start': 1,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'num_split',\n                'name': 'numOrSizeSplits',\n                'type': 'number',\n                'defaultValue': 1\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SplitV',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'numOrSizeSplits',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'axis',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ScatterNd',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'indices',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'values',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'shape',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'GatherNd',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SparseToDense',\n        'category': 'slice_join',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'sparseIndices',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'outputShape',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'sparseValues',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'defaultValue',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'validate_indices',\n                'name': 'validateIndices',\n                'type': 'bool',\n                'defaultValue': false,\n                'notSupported': true\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2Vfam9pbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wX2xpc3Qvc2xpY2Vfam9pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLENBQUMsTUFBTSxJQUFJLEdBQWU7SUFDOUI7UUFDRSxVQUFVLEVBQUUsVUFBVTtRQUN0QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixLQUFLLEVBQUUsQ0FBQyxDQUFDO2dCQUNULE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsU0FBUzthQUNsQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDLENBQUM7Z0JBQ1gsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsQ0FBQzthQUNsQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxRQUFRO1FBQ3BCLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLEtBQUssRUFBRSxDQUFDO2dCQUNSLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsU0FBUzthQUNsQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsR0FBRztnQkFDYixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLENBQUM7YUFDbEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsVUFBVTtRQUN0QixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsQ0FBQzthQUNsQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLENBQUM7YUFDbEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsUUFBUTtRQUNwQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLGtCQUFrQjtnQkFDNUIsTUFBTSxFQUFFLGlCQUFpQjtnQkFDekIsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsU0FBUztRQUNyQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFdBQVc7UUFDdkIsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsVUFBVTthQUNuQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsVUFBVTthQUNuQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxjQUFjO1FBQzFCLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsVUFBVTthQUNuQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsVUFBVTthQUNuQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLFlBQVk7Z0JBQ3RCLE1BQU0sRUFBRSxXQUFXO2dCQUNuQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLENBQUM7YUFDbEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsTUFBTSxFQUFFLFNBQVM7Z0JBQ2pCLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsQ0FBQzthQUNsQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxlQUFlO2dCQUN6QixNQUFNLEVBQUUsYUFBYTtnQkFDckIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxDQUFDO2FBQ2xCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLGVBQWU7Z0JBQ3pCLE1BQU0sRUFBRSxjQUFjO2dCQUN0QixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLENBQUM7YUFDbEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsa0JBQWtCO2dCQUM1QixNQUFNLEVBQUUsZ0JBQWdCO2dCQUN4QixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLENBQUM7YUFDbEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixLQUFLLEVBQUUsQ0FBQztnQkFDUixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFNBQVM7YUFDbEI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLENBQUM7YUFDbEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsUUFBUTtRQUNwQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLENBQUM7YUFDbEI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsS0FBSztnQkFDZixNQUFNLEVBQUUsS0FBSztnQkFDYixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLENBQUM7Z0JBQ2pCLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLE1BQU07UUFDbEIsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsVUFBVTthQUNuQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxPQUFPO1FBQ25CLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsQ0FBQzthQUNsQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7UUFDRCxPQUFPLEVBQUU7WUFDUDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLGlCQUFpQjtnQkFDekIsTUFBTSxFQUFFLFFBQVE7Z0JBQ2hCLGNBQWMsRUFBRSxDQUFDO2FBQ2xCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFFBQVE7UUFDcEIsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsaUJBQWlCO2dCQUN6QixNQUFNLEVBQUUsVUFBVTthQUNuQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxNQUFNO2dCQUNkLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixjQUFjLEVBQUUsQ0FBQzthQUNsQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxXQUFXO1FBQ3ZCLFVBQVUsRUFBRSxZQUFZO1FBQ3hCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxRQUFRO2dCQUNoQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLFVBQVU7UUFDdEIsVUFBVSxFQUFFLFlBQVk7UUFDeEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsZUFBZTtRQUMzQixVQUFVLEVBQUUsWUFBWTtRQUN4QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsZUFBZTtnQkFDdkIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsYUFBYTtnQkFDckIsTUFBTSxFQUFFLFVBQVU7YUFDbkI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxrQkFBa0I7Z0JBQzVCLE1BQU0sRUFBRSxpQkFBaUI7Z0JBQ3pCLE1BQU0sRUFBRSxNQUFNO2dCQUNkLGNBQWMsRUFBRSxLQUFLO2dCQUNyQixjQUFjLEVBQUUsSUFBSTthQUNyQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ29uY2F0VjInLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogLTEsXG4gICAgICAgICduYW1lJzogJ3RlbnNvcnMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3JzJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogLTEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnTicsXG4gICAgICAgICduYW1lJzogJ24nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMlxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdDb25jYXQnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29ycycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ04nLFxuICAgICAgICAnbmFtZSc6ICduJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnR2F0aGVyVjInLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2JhdGNoX2RpbXMnLFxuICAgICAgICAnbmFtZSc6ICdiYXRjaERpbXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdHYXRoZXInLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICd2YWxpZGF0ZV9pbmRpY2VzJyxcbiAgICAgICAgJ25hbWUnOiAndmFsaWRhdGVJbmRpY2VzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCcsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JldmVyc2UnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZGltcycsXG4gICAgICAgICd0eXBlJzogJ2Jvb2xbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUmV2ZXJzZVYyJyxcbiAgICAnY2F0ZWdvcnknOiAnc2xpY2Vfam9pbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU2xpY2UnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnYmVnaW4nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3NpemUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RyaWRlZFNsaWNlJyxcbiAgICAnY2F0ZWdvcnknOiAnc2xpY2Vfam9pbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2JlZ2luJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdlbmQnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDMsXG4gICAgICAgICduYW1lJzogJ3N0cmlkZXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdiZWdpbl9tYXNrJyxcbiAgICAgICAgJ25hbWUnOiAnYmVnaW5NYXNrJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZW5kX21hc2snLFxuICAgICAgICAnbmFtZSc6ICdlbmRNYXNrJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbmV3X2F4aXNfbWFzaycsXG4gICAgICAgICduYW1lJzogJ25ld0F4aXNNYXNrJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnZWxsaXBzaXNfbWFzaycsXG4gICAgICAgICduYW1lJzogJ2VsbGlwc2lzTWFzaycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3Nocmlua19heGlzX21hc2snLFxuICAgICAgICAnbmFtZSc6ICdzaHJpbmtBeGlzTWFzaycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1BhY2snLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnZW5kJzogMCxcbiAgICAgICAgJ25hbWUnOiAndGVuc29ycycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcnMnXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYXhpcycsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdVbnBhY2snLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd0ZW5zb3InLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYXhpcycsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdudW0nLFxuICAgICAgICAnbmFtZSc6ICdudW0nLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMCxcbiAgICAgICAgJ25vdFN1cHBvcnRlZCc6IHRydWVcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnVGlsZScsXG4gICAgJ2NhdGVnb3J5JzogJ3NsaWNlX2pvaW4nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdyZXBzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NwbGl0JyxcbiAgICAnY2F0ZWdvcnknOiAnc2xpY2Vfam9pbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnYXhpcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAwXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ251bV9zcGxpdCcsXG4gICAgICAgICduYW1lJzogJ251bU9yU2l6ZVNwbGl0cycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdkZWZhdWx0VmFsdWUnOiAxXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NwbGl0VicsXG4gICAgJ2NhdGVnb3J5JzogJ3NsaWNlX2pvaW4nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdudW1PclNpemVTcGxpdHMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTY2F0dGVyTmQnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdpbmRpY2VzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAndmFsdWVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnc2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnR2F0aGVyTmQnLFxuICAgICdjYXRlZ29yeSc6ICdzbGljZV9qb2luJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3BhcnNlVG9EZW5zZScsXG4gICAgJ2NhdGVnb3J5JzogJ3NsaWNlX2pvaW4nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3NwYXJzZUluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdvdXRwdXRTaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnc3BhcnNlVmFsdWVzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3ZhbGlkYXRlX2luZGljZXMnLFxuICAgICAgICAnbmFtZSc6ICd2YWxpZGF0ZUluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICdib29sJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IGZhbHNlLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'SparseFillEmptyRows',\n        'category': 'sparse',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'indices',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'values',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'denseShape',\n                'type': 'tensor'\n            },\n            {\n                'start': 3,\n                'name': 'defaultValue',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SparseReshape',\n        'category': 'sparse',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'inputIndices',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'inputShape',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'newShape',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'T',\n                'name': 'dtype',\n                'type': 'dtype',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SparseSegmentMean',\n        'category': 'sparse',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'data',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'segmentIds',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SparseSegmentSum',\n        'category': 'sparse',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'data',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'indices',\n                'type': 'tensor'\n            },\n            {\n                'start': 2,\n                'name': 'segmentIds',\n                'type': 'tensor'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvb3BfbGlzdC9zcGFyc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFlO0lBQzlCO1FBQ0UsVUFBVSxFQUFFLHFCQUFxQjtRQUNqQyxVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsZUFBZTtRQUMzQixVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsY0FBYztnQkFDdEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxHQUFHO2dCQUNiLE1BQU0sRUFBRSxPQUFPO2dCQUNmLE1BQU0sRUFBRSxPQUFPO2dCQUNmLGNBQWMsRUFBRSxJQUFJO2FBQ3JCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLG1CQUFtQjtRQUMvQixVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7SUFDRDtRQUNFLFVBQVUsRUFBRSxrQkFBa0I7UUFDOUIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsU0FBUztnQkFDakIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1NwYXJzZUZpbGxFbXB0eVJvd3MnLFxuICAgICdjYXRlZ29yeSc6ICdzcGFyc2UnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2luZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICd2YWx1ZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdkZW5zZVNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMyxcbiAgICAgICAgJ25hbWUnOiAnZGVmYXVsdFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTcGFyc2VSZXNoYXBlJyxcbiAgICAnY2F0ZWdvcnknOiAnc3BhcnNlJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdpbnB1dEluZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdpbnB1dFNoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMixcbiAgICAgICAgJ25hbWUnOiAnbmV3U2hhcGUnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnVCcsXG4gICAgICAgICduYW1lJzogJ2R0eXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnZHR5cGUnLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTcGFyc2VTZWdtZW50TWVhbicsXG4gICAgJ2NhdGVnb3J5JzogJ3NwYXJzZScsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnZGF0YScsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2luZGljZXMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdzZWdtZW50SWRzJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTcGFyc2VTZWdtZW50U3VtJyxcbiAgICAnY2F0ZWdvcnknOiAnc3BhcnNlJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdkYXRhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnaW5kaWNlcycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3NlZ21lbnRJZHMnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'FFT',\n        'category': 'spectral',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'IFFT',\n        'category': 'spectral',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'RFFT',\n        'category': 'spectral',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'fft_length',\n                'type': 'number',\n                'notSupported': true\n            }\n        ]\n    },\n    {\n        'tfOpName': 'IRFFT',\n        'category': 'spectral',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'fft_length',\n                'type': 'number',\n                'notSupported': true\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY3RyYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L3NwZWN0cmFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxLQUFLO1FBQ2pCLFVBQVUsRUFBRSxVQUFVO1FBQ3RCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1NBQ0Y7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLE1BQU07UUFDbEIsVUFBVSxFQUFFLFVBQVU7UUFDdEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsTUFBTTtRQUNsQixVQUFVLEVBQUUsVUFBVTtRQUN0QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsT0FBTztRQUNuQixVQUFVLEVBQUUsVUFBVTtRQUN0QixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsR0FBRztnQkFDWCxNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsY0FBYyxFQUFFLElBQUk7YUFDckI7U0FDRjtLQUNGO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge09wTWFwcGVyfSBmcm9tICcuLi90eXBlcyc7XG5cbmV4cG9ydCBjb25zdCBqc29uOiBPcE1hcHBlcltdID0gW1xuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0ZGVCcsXG4gICAgJ2NhdGVnb3J5JzogJ3NwZWN0cmFsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdJRkZUJyxcbiAgICAnY2F0ZWdvcnknOiAnc3BlY3RyYWwnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ1JGRlQnLFxuICAgICdjYXRlZ29yeSc6ICdzcGVjdHJhbCcsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2ZmdF9sZW5ndGgnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnbm90U3VwcG9ydGVkJzogdHJ1ZVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdJUkZGVCcsXG4gICAgJ2NhdGVnb3J5JzogJ3NwZWN0cmFsJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZmZ0X2xlbmd0aCcsXG4gICAgICAgICd0eXBlJzogJ251bWJlcicsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9XG4gICAgXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'StringNGrams',\n        'category': 'string',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'data',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'dataSplits',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'separator',\n                'name': 'separator',\n                'type': 'string'\n            },\n            {\n                'tfName': 'ngram_widths',\n                'name': 'nGramWidths',\n                'type': 'number[]'\n            },\n            {\n                'tfName': 'left_pad',\n                'name': 'leftPad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'right_pad',\n                'name': 'rightPad',\n                'type': 'string'\n            },\n            {\n                'tfName': 'pad_width',\n                'name': 'padWidth',\n                'type': 'number'\n            },\n            {\n                'tfName': 'preserve_short_sequences',\n                'name': 'preserveShortSequences',\n                'type': 'bool'\n            }\n        ],\n        'outputs': [\n            'ngrams',\n            'ngrams_splits'\n        ]\n    },\n    {\n        'tfOpName': 'StringSplit',\n        'category': 'string',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'input',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'delimiter',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'skip_empty',\n                'name': 'skipEmpty',\n                'type': 'bool'\n            }\n        ],\n        'outputs': [\n            'indices',\n            'values',\n            'shape'\n        ]\n    },\n    {\n        'tfOpName': 'StringToHashBucketFast',\n        'category': 'string',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'input',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'num_buckets',\n                'name': 'numBuckets',\n                'type': 'number'\n            }\n        ]\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvb3BfbGlzdC9zdHJpbmcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFlO0lBQzlCO1FBQ0UsVUFBVSxFQUFFLGNBQWM7UUFDMUIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsWUFBWTtnQkFDcEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsY0FBYztnQkFDeEIsTUFBTSxFQUFFLGFBQWE7Z0JBQ3JCLE1BQU0sRUFBRSxVQUFVO2FBQ25CO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLFVBQVU7Z0JBQ3BCLE1BQU0sRUFBRSxTQUFTO2dCQUNqQixNQUFNLEVBQUUsUUFBUTthQUNqQjtZQUNEO2dCQUNFLFFBQVEsRUFBRSxXQUFXO2dCQUNyQixNQUFNLEVBQUUsVUFBVTtnQkFDbEIsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsV0FBVztnQkFDckIsTUFBTSxFQUFFLFVBQVU7Z0JBQ2xCLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsUUFBUSxFQUFFLDBCQUEwQjtnQkFDcEMsTUFBTSxFQUFFLHdCQUF3QjtnQkFDaEMsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsUUFBUTtZQUNSLGVBQWU7U0FDaEI7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLGFBQWE7UUFDekIsVUFBVSxFQUFFLFFBQVE7UUFDcEIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLFFBQVE7YUFDakI7WUFDRDtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxZQUFZO2dCQUN0QixNQUFNLEVBQUUsV0FBVztnQkFDbkIsTUFBTSxFQUFFLE1BQU07YUFDZjtTQUNGO1FBQ0QsU0FBUyxFQUFFO1lBQ1QsU0FBUztZQUNULFFBQVE7WUFDUixPQUFPO1NBQ1I7S0FDRjtJQUNEO1FBQ0UsVUFBVSxFQUFFLHdCQUF3QjtRQUNwQyxVQUFVLEVBQUUsUUFBUTtRQUNwQixRQUFRLEVBQUU7WUFDUjtnQkFDRSxPQUFPLEVBQUUsQ0FBQztnQkFDVixNQUFNLEVBQUUsT0FBTztnQkFDZixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO1FBQ0QsT0FBTyxFQUFFO1lBQ1A7Z0JBQ0UsUUFBUSxFQUFFLGFBQWE7Z0JBQ3ZCLE1BQU0sRUFBRSxZQUFZO2dCQUNwQixNQUFNLEVBQUUsUUFBUTthQUNqQjtTQUNGO0tBQ0Y7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RyaW5nTkdyYW1zJyxcbiAgICAnY2F0ZWdvcnknOiAnc3RyaW5nJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICdkYXRhJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZGF0YVNwbGl0cycsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdzZXBhcmF0b3InLFxuICAgICAgICAnbmFtZSc6ICdzZXBhcmF0b3InLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ25ncmFtX3dpZHRocycsXG4gICAgICAgICduYW1lJzogJ25HcmFtV2lkdGhzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ2xlZnRfcGFkJyxcbiAgICAgICAgJ25hbWUnOiAnbGVmdFBhZCcsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAncmlnaHRfcGFkJyxcbiAgICAgICAgJ25hbWUnOiAncmlnaHRQYWQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3BhZF93aWR0aCcsXG4gICAgICAgICduYW1lJzogJ3BhZFdpZHRoJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdwcmVzZXJ2ZV9zaG9ydF9zZXF1ZW5jZXMnLFxuICAgICAgICAnbmFtZSc6ICdwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzJyxcbiAgICAgICAgJ3R5cGUnOiAnYm9vbCdcbiAgICAgIH1cbiAgICBdLFxuICAgICdvdXRwdXRzJzogW1xuICAgICAgJ25ncmFtcycsXG4gICAgICAnbmdyYW1zX3NwbGl0cydcbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RyaW5nU3BsaXQnLFxuICAgICdjYXRlZ29yeSc6ICdzdHJpbmcnLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ2lucHV0JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnZGVsaW1pdGVyJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ3NraXBfZW1wdHknLFxuICAgICAgICAnbmFtZSc6ICdza2lwRW1wdHknLFxuICAgICAgICAndHlwZSc6ICdib29sJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ291dHB1dHMnOiBbXG4gICAgICAnaW5kaWNlcycsXG4gICAgICAndmFsdWVzJyxcbiAgICAgICdzaGFwZSdcbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3RyaW5nVG9IYXNoQnVja2V0RmFzdCcsXG4gICAgJ2NhdGVnb3J5JzogJ3N0cmluZycsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAnaW5wdXQnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnbnVtX2J1Y2tldHMnLFxuICAgICAgICAnbmFtZSc6ICdudW1CdWNrZXRzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfVxuXTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport const json = [\n    {\n        'tfOpName': 'Cast',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'SrcT',\n                'name': 'sdtype',\n                'type': 'dtype',\n                'notSupported': true\n            },\n            {\n                'tfName': 'DstT',\n                'name': 'dtype',\n                'type': 'dtype'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'ExpandDims',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'axis',\n                'type': 'number'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'MirrorPad',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'padding',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'mode',\n                'name': 'mode',\n                'type': 'string'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Pad',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'padding',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'constant_value',\n                'name': 'constantValue',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ]\n    },\n    {\n        'tfOpName': 'PadV2',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'padding',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'constantValue',\n                'type': 'number',\n                'defaultValue': 0\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Reshape',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'shape',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'Squeeze',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'axis',\n                'tfDeprecatedName': 'squeeze_dims',\n                'name': 'axis',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'SpaceToBatchND',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'blockShape',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'paddings',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'BatchToSpaceND',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'blockShape',\n                'type': 'number[]'\n            },\n            {\n                'start': 2,\n                'name': 'crops',\n                'type': 'number[]'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'DepthToSpace',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': [\n            {\n                'tfName': 'block_size',\n                'name': 'blockSize',\n                'type': 'number'\n            },\n            {\n                'tfName': 'data_format',\n                'name': 'dataFormat',\n                'type': 'string'\n            }\n        ]\n    },\n    {\n        'tfOpName': 'BroadcastTo',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 'x',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 'shape',\n                'type': 'number[]'\n            }\n        ],\n        'attrs': []\n    },\n    {\n        'tfOpName': 'BroadcastArgs',\n        'category': 'transformation',\n        'inputs': [\n            {\n                'start': 0,\n                'name': 's0',\n                'type': 'tensor'\n            },\n            {\n                'start': 1,\n                'name': 's1',\n                'type': 'tensor'\n            }\n        ],\n        'attrs': []\n    }\n];\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9vcF9saXN0L3RyYW5zZm9ybWF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBZTtJQUM5QjtRQUNFLFVBQVUsRUFBRSxNQUFNO1FBQ2xCLFVBQVUsRUFBRSxnQkFBZ0I7UUFDNUIsUUFBUSxFQUFFO1lBQ1I7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLEdBQUc7Z0JBQ1gsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRTtZQUNQO2dCQUNFLFFBQVEsRUFBRSxNQUFNO2dCQUNoQixNQUFNLEVBQUUsUUFBUTtnQkFDaEIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsY0FBYyxFQUFFLElBQUk7YUFDckI7WUFDRDtnQkFDRSxRQUFRLEVBQUUsTUFBTTtnQkFDaEIsTUFBTSxFQUFFLE9BQU87Z0JBQ2YsTUFBTSxFQUFFLE9BQU87YUFDaEI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsWUFBWTtRQUN4QixVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dCQUNYLE1BQU0sRUFBRSxRQUFRO2FBQ2pCO1lBQ0Q7Z0JBQ0UsT0FBTyxFQUFFLENBQUM7Z0JBQ1YsTUFBTSxFQUFFLE1BQU07Z0JBQ2QsTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtLQUNGO0lBQ0Q7UUFDRSxVQUFVLEVBQUUsV0FBVztRQUN2QixVQUFVLEVBQUUsZ0JBQWdCO1FBQzVCLFFBQVEsRUFBRTtZQUNSO2dCQUNFLE9BQU8sRUFBRSxDQUFDO2dCQUNWLE1BQU0sRUFBRSxHQUFHO2dC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QUk7Z0JBQ1osTUFBTSxFQUFFLFFBQVE7YUFDakI7U0FDRjtRQUNELE9BQU8sRUFBRSxFQUFFO0tBQ1o7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7T3BNYXBwZXJ9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGNvbnN0IGpzb246IE9wTWFwcGVyW10gPSBbXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnQ2FzdCcsXG4gICAgJ2NhdGVnb3J5JzogJ3RyYW5zZm9ybWF0aW9uJyxcbiAgICAnaW5wdXRzJzogW1xuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAwLFxuICAgICAgICAnbmFtZSc6ICd4JyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW1xuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ1NyY1QnLFxuICAgICAgICAnbmFtZSc6ICdzZHR5cGUnLFxuICAgICAgICAndHlwZSc6ICdkdHlwZScsXG4gICAgICAgICdub3RTdXBwb3J0ZWQnOiB0cnVlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAndGZOYW1lJzogJ0RzdFQnLFxuICAgICAgICAnbmFtZSc6ICdkdHlwZScsXG4gICAgICAgICd0eXBlJzogJ2R0eXBlJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdFeHBhbmREaW1zJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdheGlzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdNaXJyb3JQYWQnLFxuICAgICdjYXRlZ29yeSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdtb2RlJyxcbiAgICAgICAgJ25hbWUnOiAnbW9kZScsXG4gICAgICAgICd0eXBlJzogJ3N0cmluZydcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUGFkJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdwYWRkaW5nJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnY29uc3RhbnRfdmFsdWUnLFxuICAgICAgICAnbmFtZSc6ICdjb25zdGFudFZhbHVlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJyxcbiAgICAgICAgJ2RlZmF1bHRWYWx1ZSc6IDBcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnUGFkVjInLFxuICAgICdjYXRlZ29yeSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ3BhZGRpbmcnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ2NvbnN0YW50VmFsdWUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXInLFxuICAgICAgICAnZGVmYXVsdFZhbHVlJzogMFxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdSZXNoYXBlJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdTcXVlZXplJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXG4gICAgICB7XG4gICAgICAgICd0Zk5hbWUnOiAnYXhpcycsXG4gICAgICAgICd0ZkRlcHJlY2F0ZWROYW1lJzogJ3NxdWVlemVfZGltcycsXG4gICAgICAgICduYW1lJzogJ2F4aXMnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIHtcbiAgICAndGZPcE5hbWUnOiAnU3BhY2VUb0JhdGNoTkQnLFxuICAgICdjYXRlZ29yeSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDEsXG4gICAgICAgICduYW1lJzogJ2Jsb2NrU2hhcGUnLFxuICAgICAgICAndHlwZSc6ICdudW1iZXJbXSdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDIsXG4gICAgICAgICduYW1lJzogJ3BhZGRpbmdzJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0JhdGNoVG9TcGFjZU5EJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdibG9ja1NoYXBlJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyW10nXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAyLFxuICAgICAgICAnbmFtZSc6ICdjcm9wcycsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF1cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdEZXB0aFRvU3BhY2UnLFxuICAgICdjYXRlZ29yeSc6ICd0cmFuc2Zvcm1hdGlvbicsXG4gICAgJ2lucHV0cyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMCxcbiAgICAgICAgJ25hbWUnOiAneCcsXG4gICAgICAgICd0eXBlJzogJ3RlbnNvcidcbiAgICAgIH1cbiAgICBdLFxuICAgICdhdHRycyc6IFtcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdibG9ja19zaXplJyxcbiAgICAgICAgJ25hbWUnOiAnYmxvY2tTaXplJyxcbiAgICAgICAgJ3R5cGUnOiAnbnVtYmVyJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3RmTmFtZSc6ICdkYXRhX2Zvcm1hdCcsXG4gICAgICAgICduYW1lJzogJ2RhdGFGb3JtYXQnLFxuICAgICAgICAndHlwZSc6ICdzdHJpbmcnXG4gICAgICB9XG4gICAgXVxuICB9LFxuICB7XG4gICAgJ3RmT3BOYW1lJzogJ0Jyb2FkY2FzdFRvJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3gnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAnc3RhcnQnOiAxLFxuICAgICAgICAnbmFtZSc6ICdzaGFwZScsXG4gICAgICAgICd0eXBlJzogJ251bWJlcltdJ1xuICAgICAgfVxuICAgIF0sXG4gICAgJ2F0dHJzJzogW11cbiAgfSxcbiAge1xuICAgICd0Zk9wTmFtZSc6ICdCcm9hZGNhc3RBcmdzJyxcbiAgICAnY2F0ZWdvcnknOiAndHJhbnNmb3JtYXRpb24nLFxuICAgICdpbnB1dHMnOiBbXG4gICAgICB7XG4gICAgICAgICdzdGFydCc6IDAsXG4gICAgICAgICduYW1lJzogJ3MwJyxcbiAgICAgICAgJ3R5cGUnOiAndGVuc29yJ1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgJ3N0YXJ0JzogMSxcbiAgICAgICAgJ25hbWUnOiAnczEnLFxuICAgICAgICAndHlwZSc6ICd0ZW5zb3InXG4gICAgICB9XG4gICAgXSxcbiAgICAnYXR0cnMnOiBbXVxuICB9XG5dO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport * as tensorflow from '../data/compiled_api';\nimport { getRegisteredOp } from './custom_op/register';\nimport { getNodeNameAndIndex } from './executors/utils';\nimport * as arithmetic from './op_list/arithmetic';\nimport * as basicMath from './op_list/basic_math';\nimport * as control from './op_list/control';\nimport * as convolution from './op_list/convolution';\nimport * as creation from './op_list/creation';\nimport * as dynamic from './op_list/dynamic';\nimport * as evaluation from './op_list/evaluation';\nimport * as graph from './op_list/graph';\nimport * as hashTable from './op_list/hash_table';\nimport * as image from './op_list/image';\nimport * as logical from './op_list/logical';\nimport * as matrices from './op_list/matrices';\nimport * as normalization from './op_list/normalization';\nimport * as reduction from './op_list/reduction';\nimport * as sliceJoin from './op_list/slice_join';\nimport * as sparse from './op_list/sparse';\nimport * as spectral from './op_list/spectral';\nimport * as string from './op_list/string';\nimport * as transformation from './op_list/transformation';\nexport class OperationMapper {\n    // Singleton instance for the mapper\n    static get Instance() {\n        return this._instance || (this._instance = new this());\n    }\n    // Loads the op mapping from the JSON file.\n    constructor() {\n        const ops = [\n            arithmetic, basicMath, control, convolution, creation, dynamic,\n            evaluation, graph, hashTable, image, logical, matrices, normalization,\n            reduction, sliceJoin, sparse, spectral, string, transformation\n        ];\n        const mappersJson = [].concat(...ops.map(op => op.json));\n        this.opMappers = mappersJson.reduce((map, mapper) => {\n            map[mapper.tfOpName] = mapper;\n            return map;\n        }, {});\n    }\n    // Converts the model inference graph from Tensorflow GraphDef to local\n    // representation for TensorFlow.js API\n    transformGraph(graph, signature = {}) {\n        const tfNodes = graph.node;\n        const placeholders = [];\n        const weights = [];\n        const initNodes = [];\n        const nodes = tfNodes.reduce((map, node) => {\n            map[node.name] = this.mapNode(node);\n            if (node.op.startsWith('Placeholder')) {\n                placeholders.push(map[node.name]);\n            }\n            else if (node.op === 'Const') {\n                weights.push(map[node.name]);\n            }\n            else if (node.input == null || node.input.length === 0) {\n                initNodes.push(map[node.name]);\n            }\n            return map;\n        }, {});\n        let inputs = [];\n        const outputs = [];\n        let inputNodeNameToKey = {};\n        let outputNodeNameToKey = {};\n        if (signature != null) {\n            inputNodeNameToKey = this.mapSignatureEntries(signature.inputs);\n            outputNodeNameToKey = this.mapSignatureEntries(signature.outputs);\n        }\n        const allNodes = Object.keys(nodes);\n        allNodes.forEach(key => {\n            const node = nodes[key];\n            node.inputNames.forEach((name, index) => {\n                const [nodeName, , outputName] = getNodeNameAndIndex(name);\n                const inputNode = nodes[nodeName];\n                if (inputNode.outputs != null) {\n                    const outputIndex = inputNode.outputs.indexOf(outputName);\n                    if (outputIndex !== -1) {\n                        const inputName = `${nodeName}:${outputIndex}`;\n                        // update the input name to use the mapped output index directly.\n                        node.inputNames[index] = inputName;\n                    }\n                }\n                node.inputs.push(inputNode);\n                inputNode.children.push(node);\n            });\n        });\n        // if signature has not outputs set, add any node that does not have\n        // outputs.\n        if (Object.keys(outputNodeNameToKey).length === 0) {\n            allNodes.forEach(key => {\n                const node = nodes[key];\n                if (node.children.length === 0) {\n                    outputs.push(node);\n                }\n            });\n        }\n        else {\n            Object.keys(outputNodeNameToKey).forEach(name => {\n                const [nodeName,] = getNodeNameAndIndex(name);\n                const node = nodes[nodeName];\n                if (node != null) {\n                    node.signatureKey = outputNodeNameToKey[name];\n                    outputs.push(node);\n                }\n            });\n        }\n        if (Object.keys(inputNodeNameToKey).length > 0) {\n            Object.keys(inputNodeNameToKey).forEach(name => {\n                const [nodeName,] = getNodeNameAndIndex(name);\n                const node = nodes[nodeName];\n                if (node) {\n                    node.signatureKey = inputNodeNameToKey[name];\n                    inputs.push(node);\n                }\n            });\n        }\n        else {\n            inputs = placeholders;\n        }\n        let functions = {};\n        if (graph.library != null && graph.library.function != null) {\n            functions = graph.library.function.reduce((functions, func) => {\n                functions[func.signature.name] = this.mapFunction(func);\n                return functions;\n            }, {});\n        }\n        const result = { nodes, inputs, outputs, weights, placeholders, signature, functions };\n        if (initNodes.length > 0) {\n            result.initNodes = initNodes;\n        }\n        return result;\n    }\n    mapSignatureEntries(entries) {\n        return Object.keys(entries || {})\n            .reduce((prev, curr) => {\n            prev[entries[curr].name] = curr;\n            return prev;\n        }, {});\n    }\n    mapNode(node) {\n        // Unsupported ops will cause an error at run-time (not parse time), since\n        // they may not be used by the actual execution subgraph.\n        const mapper = getRegisteredOp(node.op) || this.opMappers[node.op] || {};\n        if (node.attr == null) {\n            node.attr = {};\n        }\n        const newNode = {\n            name: node.name,\n            op: node.op,\n            category: mapper.category,\n            inputNames: (node.input ||\n                []).map(input => input.startsWith('^') ? input.slice(1) : input),\n            inputs: [],\n            children: [],\n            inputParams: {},\n            attrParams: {},\n            rawAttrs: node.attr,\n            outputs: mapper.outputs\n        };\n        if (mapper.inputs != null) {\n            newNode.inputParams =\n                mapper.inputs.reduce((map, param) => {\n                    map[param.name] = {\n                        type: param.type,\n                        inputIndexStart: param.start,\n                        inputIndexEnd: param.end\n                    };\n                    return map;\n                }, {});\n        }\n        if (mapper.attrs != null) {\n            newNode.attrParams =\n                mapper.attrs.reduce((map, param) => {\n                    const type = param.type;\n                    let value = undefined;\n                    switch (param.type) {\n                        case 'string':\n                            value = getStringParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getStringParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'string[]':\n                            value = getStringArrayParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getStringArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'number':\n                            value = getNumberParam(node.attr, param.tfName, (param.defaultValue || 0));\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getNumberParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'number[]':\n                            value = getNumericArrayParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getNumericArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'bool':\n                            value = getBoolParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getBoolParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'bool[]':\n                            value = getBoolArrayParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getBoolArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'shape':\n                            value = getTensorShapeParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getTensorShapeParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'shape[]':\n                            value = getTensorShapeArrayParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getTensorShapeArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'dtype':\n                            value = getDtypeParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getDtypeParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'dtype[]':\n                            value = getDtypeArrayParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getDtypeArrayParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'func':\n                            value = getFuncParam(node.attr, param.tfName, param.defaultValue);\n                            if (value === undefined && !!param.tfDeprecatedName) {\n                                value = getFuncParam(node.attr, param.tfDeprecatedName, param.defaultValue);\n                            }\n                            break;\n                        case 'tensor':\n                        case 'tensors':\n                            break;\n                        default:\n                            throw new Error(`Unsupported param type: ${param.type} for op: ${node.op}`);\n                    }\n                    map[param.name] = { value, type };\n                    return map;\n                }, {});\n        }\n        return newNode;\n    }\n    // map the TFunctionDef to TFJS graph object\n    mapFunction(functionDef) {\n        const tfNodes = functionDef.nodeDef;\n        const placeholders = [];\n        const weights = [];\n        let nodes = {};\n        if (tfNodes != null) {\n            nodes = tfNodes.reduce((map, node) => {\n                map[node.name] = this.mapNode(node);\n                if (node.op === 'Const') {\n                    weights.push(map[node.name]);\n                }\n                return map;\n            }, {});\n        }\n        const inputs = [];\n        const outputs = [];\n        functionDef.signature.inputArg.forEach(arg => {\n            const [nodeName,] = getNodeNameAndIndex(arg.name);\n            const node = {\n                name: nodeName,\n                op: 'Placeholder',\n                inputs: [],\n                inputNames: [],\n                category: 'graph',\n                inputParams: {},\n                attrParams: { dtype: { value: parseDtypeParam(arg.type), type: 'dtype' } },\n                children: []\n            };\n            node.signatureKey = arg.name;\n            inputs.push(node);\n            nodes[nodeName] = node;\n        });\n        const allNodes = Object.keys(nodes);\n        allNodes.forEach(key => {\n            const node = nodes[key];\n            node.inputNames.forEach((name, index) => {\n                const [nodeName, , outputName] = getNodeNameAndIndex(name);\n                const inputNode = nodes[nodeName];\n                if (inputNode.outputs != null) {\n                    const outputIndex = inputNode.outputs.indexOf(outputName);\n                    if (outputIndex !== -1) {\n                        const inputName = `${nodeName}:${outputIndex}`;\n                        // update the input name to use the mapped output index directly.\n                        node.inputNames[index] = inputName;\n                    }\n                }\n                node.inputs.push(inputNode);\n                inputNode.children.push(node);\n            });\n        });\n        const returnNodeMap = functionDef.ret;\n        functionDef.signature.outputArg.forEach(output => {\n            const [nodeName, index] = getNodeNameAndIndex(returnNodeMap[output.name]);\n            const node = nodes[nodeName];\n            if (node != null) {\n                node.defaultOutput = index;\n                outputs.push(node);\n            }\n        });\n        const signature = this.mapArgsToSignature(functionDef);\n        return { nodes, inputs, outputs, weights, placeholders, signature };\n    }\n    mapArgsToSignature(functionDef) {\n        return {\n            methodName: functionDef.signature.name,\n            inputs: functionDef.signature.inputArg.reduce((map, arg) => {\n                map[arg.name] = this.mapArgToTensorInfo(arg);\n                return map;\n            }, {}),\n            outputs: functionDef.signature.outputArg.reduce((map, arg) => {\n                map[arg.name] = this.mapArgToTensorInfo(arg, functionDef.ret);\n                return map;\n            }, {}),\n        };\n    }\n    mapArgToTensorInfo(arg, nameMap) {\n        let name = arg.name;\n        if (nameMap != null) {\n            name = nameMap[name];\n        }\n        return { name, dtype: arg.type };\n    }\n}\nexport function decodeBase64(text) {\n    const global = env().global;\n    if (typeof global.atob !== 'undefined') {\n        return global.atob(text);\n    }\n    else if (typeof Buffer !== 'undefined') {\n        return new Buffer(text, 'base64').toString();\n    }\n    else {\n        throw new Error('Unable to decode base64 in this environment. ' +\n            'Missing built-in atob() or Buffer()');\n    }\n}\nexport function parseStringParam(s, keepCase) {\n    const value = Array.isArray(s) ? String.fromCharCode.apply(null, s) : decodeBase64(s);\n    return keepCase ? value : value.toLowerCase();\n}\nexport function getStringParam(attrs, name, def, keepCase = false) {\n    const param = attrs[name];\n    if (param != null) {\n        return parseStringParam(param.s, keepCase);\n    }\n    return def;\n}\nexport function getBoolParam(attrs, name, def) {\n    const param = attrs[name];\n    return param ? param.b : def;\n}\nexport function getNumberParam(attrs, name, def) {\n    const param = attrs[name] || {};\n    const value = param['i'] != null ? param['i'] : (param['f'] != null ? param['f'] : def);\n    return (typeof value === 'number') ? value : parseInt(value, 10);\n}\nexport function parseDtypeParam(value) {\n    if (typeof (value) === 'string') {\n        // tslint:disable-next-line:no-any\n        value = tensorflow.DataType[value];\n    }\n    switch (value) {\n        case tensorflow.DataType.DT_FLOAT:\n        case tensorflow.DataType.DT_HALF:\n            return 'float32';\n        case tensorflow.DataType.DT_INT32:\n        case tensorflow.DataType.DT_INT64:\n        case tensorflow.DataType.DT_INT8:\n        case tensorflow.DataType.DT_UINT8:\n            return 'int32';\n        case tensorflow.DataType.DT_BOOL:\n            return 'bool';\n        case tensorflow.DataType.DT_DOUBLE:\n            return 'float32';\n        case tensorflow.DataType.DT_STRING:\n            return 'string';\n        default:\n            // Unknown dtype error will happen at runtime (instead of parse time),\n            // since these nodes might not be used by the actual subgraph execution.\n            return null;\n    }\n}\nexport function getFuncParam(attrs, name, def) {\n    const param = attrs[name];\n    if (param && param.func) {\n        return param.func.name;\n    }\n    return def;\n}\nexport function getDtypeParam(attrs, name, def) {\n    const param = attrs[name];\n    if (param && param.type) {\n        return parseDtypeParam(param.type);\n    }\n    return def;\n}\nexport function getDtypeArrayParam(attrs, name, def) {\n    const param = attrs[name];\n    if (param && param.list && param.list.type) {\n        return param.list.type.map(v => parseDtypeParam(v));\n    }\n    return def;\n}\nexport function parseTensorShapeParam(shape) {\n    if (shape.unknownRank) {\n        return undefined;\n    }\n    if (shape.dim != null) {\n        return shape.dim.map(dim => (typeof dim.size === 'number') ? dim.size : parseInt(dim.size, 10));\n    }\n    return [];\n}\nexport function getTensorShapeParam(attrs, name, def) {\n    const param = attrs[name];\n    if (param && param.shape) {\n        return parseTensorShapeParam(param.shape);\n    }\n    return def;\n}\nexport function getNumericArrayParam(attrs, name, def) {\n    const param = attrs[name];\n    if (param) {\n        return ((param.list.f && param.list.f.length ? param.list.f :\n            param.list.i) ||\n            [])\n            .map(v => (typeof v === 'number') ? v : parseInt(v, 10));\n    }\n    return def;\n}\nexport function getStringArrayParam(attrs, name, def, keepCase = false) {\n    const param = attrs[name];\n    if (param && param.list && param.list.s) {\n        return param.list.s.map((v) => {\n            return parseStringParam(v, keepCase);\n        });\n    }\n    return def;\n}\nexport function getTensorShapeArrayParam(attrs, name, def) {\n    const param = attrs[name];\n    if (param && param.list && param.list.shape) {\n        return param.list.shape.map((v) => {\n            return parseTensorShapeParam(v);\n        });\n    }\n    return def;\n}\nexport function getBoolArrayParam(attrs, name, def) {\n    const param = attrs[name];\n    if (param && param.list && param.list.b) {\n        return param.list.b;\n    }\n    return def;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uX21hcHBlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL29wZXJhdGlvbl9tYXBwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFXLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXBELE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3RELE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLFNBQVMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxXQUFXLE1BQU0sdUJBQXVCLENBQUM7QUFDckQsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssT0FBTyxNQUFNLG1CQUFtQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxVQUFVLE1BQU0sc0JBQXNCLENBQUM7QUFDbkQsT0FBTyxLQUFLLEtBQUssTUFBTSxpQkFBaUIsQ0FBQztBQUN6QyxPQUFPLEtBQUssU0FBUyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxLQUFLLE1BQU0saUJBQWlCLENBQUM7QUFDekMsT0FBTyxLQUFLLE9BQU8sTUFBTSxtQkFBbUIsQ0FBQztBQUM3QyxPQUFPLEtBQUssUUFBUSxNQUFNLG9CQUFvQixDQUFDO0FBQy9DLE9BQU8sS0FBSyxhQUFhLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxLQUFLLFNBQVMsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEtBQUssU0FBUyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxNQUFNLE1BQU0sa0JBQWtCLENBQUM7QUFDM0MsT0FBTyxLQUFLLFFBQVEsTUFBTSxvQkFBb0IsQ0FBQztBQUMvQyxPQUFPLEtBQUssTUFBTSxNQUFNLGtCQUFrQixDQUFDO0FBQzNDLE9BQU8sS0FBSyxjQUFjLE1BQU0sMEJBQTBCLENBQUM7QUFHM0QsTUFBTSxPQUFPLGVBQWU7SUFLMUIsb0NBQW9DO0lBQzdCLE1BQU0sS0FBSyxRQUFRO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLFNBQVMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO0lBQ3pELENBQUM7SUFFRCwyQ0FBMkM7SUFDM0M7UUFDRSxNQUFNLEdBQUcsR0FBRztZQUNWLFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsT0FBTztZQUM5RCxVQUFVLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxhQUFhO1lBQ3JFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsY0FBYztTQUMvRCxDQUFDO1FBQ0YsTUFBTSxXQUFXLEdBQWUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUMsU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQy9CLENBQUMsR0FBRyxFQUFFLE1BQWdCLEVBQUUsRUFBRTtZQUN4QixHQUFHLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUM5QixPQUFPLEdBQUcsQ0FBQztRQUNiLENBQUMsRUFDRCxFQUFFLENBQUMsQ0FBQztJQUNWLENBQUM7SUFFRCx1RUFBdUU7SUFDdkUsdUNBQXVDO0lBQ3ZDLGNBQWMsQ0FDVixLQUEyQixFQUMzQixZQUFzQyxFQUFFO1FBQzFDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDM0IsTUFBTSxZQUFZLEdBQVcsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sT0FBTyxHQUFXLEVBQUUsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBVyxFQUFFLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBd0IsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDaEUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLElBQUksSUFBSSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLEVBQUU7Z0JBQ3JDLFlBQVksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQ25DO2lCQUFNLElBQUksSUFBSSxDQUFDLEVBQUUsS0FBSyxPQUFPLEVBQUU7Z0JBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2FBQzlCO2lCQUFNLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN4RCxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNoQztZQUNELE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBRVAsSUFBSSxNQUFNLEdBQVcsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sT0FBTyxHQUFXLEVBQUUsQ0FBQztRQUMzQixJQUFJLGtCQUFrQixHQUE0QixFQUFFLENBQUM7UUFDckQsSUFBSSxtQkFBbUIsR0FBNEIsRUFBRSxDQUFDO1FBQ3RELElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtZQUNyQixrQkFBa0IsR0FBRyxJQUFJLENBQUMsbUJBQW1CLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2hFLG1CQUFtQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDbkU7UUFDRCxNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3BDLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUN0QyxNQUFNLENBQUMsUUFBUSxFQUFFLEFBQUQsRUFBRyxVQUFVLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUNsQyxJQUFJLFNBQVMsQ0FBQyxPQUFPLElBQUksSUFBSSxFQUFFO29CQUM3QixNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztvQkFDMUQsSUFBSSxXQUFXLEtBQUssQ0FBQyxDQUFDLEVBQUU7d0JBQ3RCLE1BQU0sU0FBUyxHQUFHLEdBQUcsUUFBUSxJQUFJLFdBQVcsRUFBRSxDQUFDO3dCQUMvQyxpRUFBaUU7d0JBQ2pFLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDO3FCQUNwQztpQkFDRjtnQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDaEMsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUVILG9FQUFvRTtRQUNwRSxXQUFXO1FBQ1gsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtZQUNqRCxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNyQixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7Z0JBQ3hCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO29CQUM5QixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNwQjtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ0o7YUFBTTtZQUNMLE1BQU0sQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQzlDLE1BQU0sQ0FBQyxRQUFRLEVBQUcsR0FBRyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUM3QixJQUFJLElBQUksSUFBSSxJQUFJLEVBQUU7b0JBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzlDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ3BCO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7WUFDOUMsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDN0MsTUFBTSxDQUFDLFFBQVEsRUFBRyxHQUFHLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUMvQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7Z0JBQzdCLElBQUksSUFBSSxFQUFFO29CQUNSLElBQUksQ0FBQyxZQUFZLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzdDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7aUJBQ25CO1lBQ0gsQ0FBQyxDQUFDLENBQUM7U0FDSjthQUFNO1lBQ0wsTUFBTSxHQUFHLFlBQVksQ0FBQztTQUN2QjtRQUVELElBQUksU0FBUyxHQUFHLEVBQUUsQ0FBQztRQUNuQixJQUFJLEtBQUssQ0FBQyxPQUFPLElBQUksSUFBSSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxJQUFJLElBQUksRUFBRTtZQUMzRCxTQUFTLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxFQUFFO2dCQUM1RCxTQUFTLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUN4RCxPQUFPLFNBQVMsQ0FBQztZQUNuQixDQUFDLEVBQUUsRUFBNEIsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsTUFBTSxNQUFNLEdBQ1IsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUMsQ0FBQztRQUUxRSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1lBQ3hCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1NBQzlCO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVPLG1CQUFtQixDQUFDLE9BQThDO1FBQ3hFLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksRUFBRSxDQUFDO2FBQzVCLE1BQU0sQ0FBMEIsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUU7WUFDOUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDaEMsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDYixDQUFDO0lBRU8sT0FBTyxDQUFDLElBQXlCO1FBQ3ZDLDBFQUEwRTtRQUMxRSx5REFBeUQ7UUFDekQsTUFBTSxNQUFNLEdBQ1IsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsSUFBSSxFQUFjLENBQUM7UUFDMUUsSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRTtZQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQztTQUNoQjtRQUVELE1BQU0sT0FBTyxHQUFTO1lBQ3BCLElBQUksRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNmLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtZQUN6QixVQUFVLEVBQ04sQ0FBQyxJQUFJLENBQUMsS0FBSztnQkFDVixFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7WUFDckUsTUFBTSxFQUFFLEVBQUU7WUFDVixRQUFRLEVBQUUsRUFBRTtZQUNaLFdBQVcsRUFBRSxFQUFFO1lBQ2YsVUFBVSxFQUFFLEVBQUU7WUFDZCxRQUFRLEVBQUUsSUFBSSxDQUFDLElBQUk7WUFDbkIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1NBQ3hCLENBQUM7UUFFRixJQUFJLE1BQU0sQ0FBQyxNQUFNLElBQUksSUFBSSxFQUFFO1lBQ3pCLE9BQU8sQ0FBQyxXQUFXO2dCQUNmLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUNoQixDQUFDLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRTtvQkFDYixHQUFHLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHO3dCQUNoQixJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUk7d0JBQ2hCLGVBQWUsRUFBRSxLQUFLLENBQUMsS0FBSzt3QkFDNUIsYUFBYSxFQUFFLEtBQUssQ0FBQyxHQUFHO3FCQUN6QixDQUFDO29CQUNGLE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUMsRUFDRCxFQUFFLENBQUMsQ0FBQztTQUNiO1FBQ0QsSUFBSSxNQUFNLENBQUMsS0FBSyxJQUFJLElBQUksRUFBRTtZQUN4QixPQUFPLENBQUMsVUFBVTtnQkFDZCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBOEIsQ0FBQyxHQUFHLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQzlELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7b0JBQ3hCLElBQUksS0FBSyxHQUFHLFNBQVMsQ0FBQztvQkFDdEIsUUFBUSxLQUFLLENBQUMsSUFBSSxFQUFFO3dCQUNsQixLQUFLLFFBQVE7NEJBQ1gsS0FBSyxHQUFHLGNBQWMsQ0FDbEIsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUFzQixDQUFDLENBQUM7NEJBRTNELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO2dDQUNuRCxLQUFLLEdBQUcsY0FBYyxDQUNsQixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFDakMsS0FBSyxDQUFDLFlBQXNCLENBQUMsQ0FBQzs2QkFDbkM7NEJBQ0QsTUFBTTt3QkFDUixLQUFLLFVBQVU7NEJBQ2IsS0FBSyxHQUFHLG1CQUFtQixDQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQXdCLENBQUMsQ0FBQzs0QkFFN0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7Z0NBQ25ELEtBQUssR0FBRyxtQkFBbUIsQ0FDdkIsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQ2pDLEtBQUssQ0FBQyxZQUF3QixDQUFDLENBQUM7NkJBQ3JDOzRCQUNELE1BQU07d0JBQ1IsS0FBSyxRQUFROzRCQUNYLEtBQUssR0FBRyxjQUFjLENBQ2xCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFDdkIsQ0FBQyxLQUFLLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBVyxDQUFDLENBQUM7NEJBQ3pDLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO2dDQUNuRCxLQUFLLEdBQUcsY0FBYyxDQUNsQixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFDakMsS0FBSyxDQUFDLFlBQXNCLENBQUMsQ0FBQzs2QkFDbkM7NEJBQ0QsTUFBTTt3QkFDUixLQUFLLFVBQVU7NEJBQ2IsS0FBSyxHQUFHLG9CQUFvQixDQUN4QixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQXdCLENBQUMsQ0FBQzs0QkFDN0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7Z0NBQ25ELEtBQUssR0FBRyxvQkFBb0IsQ0FDeEIsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQ2pDLEtBQUssQ0FBQyxZQUF3QixDQUFDLENBQUM7NkJBQ3JDOzRCQUNELE1BQU07d0JBQ1IsS0FBSyxNQUFNOzRCQUNULEtBQUssR0FBRyxZQUFZLENBQ2hCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsWUFBdUIsQ0FBQyxDQUFDOzRCQUM1RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtnQ0FDbkQsS0FBSyxHQUFHLFlBQVksQ0FDaEIsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQ2pDLEtBQUssQ0FBQyxZQUF1QixDQUFDLENBQUM7NkJBQ3BDOzRCQUNELE1BQU07d0JBQ1IsS0FBSyxRQUFROzRCQUNYLEtBQUssR0FBRyxpQkFBaUIsQ0FDckIsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUF5QixDQUFDLENBQUM7NEJBQzlELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO2dDQUNuRCxLQUFLLEdBQUcsaUJBQWlCLENBQ3JCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixFQUNqQyxLQUFLLENBQUMsWUFBeUIsQ0FBQyxDQUFDOzZCQUN0Qzs0QkFDRCxNQUFNO3dCQUNSLEtBQUssT0FBTzs0QkFDVixLQUFLLEdBQUcsbUJBQW1CLENBQ3ZCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsWUFBd0IsQ0FBQyxDQUFDOzRCQUM3RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtnQ0FDbkQsS0FBSyxHQUFHLG1CQUFtQixDQUN2QixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsRUFDakMsS0FBSyxDQUFDLFlBQXdCLENBQUMsQ0FBQzs2QkFDckM7NEJBQ0QsTUFBTTt3QkFDUixLQUFLLFNBQVM7NEJBQ1osS0FBSyxHQUFHLHdCQUF3QixDQUM1QixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQTBCLENBQUMsQ0FBQzs0QkFDL0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7Z0NBQ25ELEtBQUssR0FBRyx3QkFBd0IsQ0FDNUIsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQ2pDLEtBQUssQ0FBQyxZQUEwQixDQUFDLENBQUM7NkJBQ3ZDOzRCQUNELE1BQU07d0JBQ1IsS0FBSyxPQUFPOzRCQUNWLEtBQUssR0FBRyxhQUFhLENBQ2pCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsWUFBd0IsQ0FBQyxDQUFDOzRCQUM3RCxJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsRUFBRTtnQ0FDbkQsS0FBSyxHQUFHLGFBQWEsQ0FDakIsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLEVBQ2pDLEtBQUssQ0FBQyxZQUF3QixDQUFDLENBQUM7NkJBQ3JDOzRCQUNELE1BQU07d0JBQ1IsS0FBSyxTQUFTOzRCQUNaLEtBQUssR0FBRyxrQkFBa0IsQ0FDdEIsSUFBSSxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxZQUEwQixDQUFDLENBQUM7NEJBQy9ELElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLGdCQUFnQixFQUFFO2dDQUNuRCxLQUFLLEdBQUcsa0JBQWtCLENBQ3RCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixFQUNqQyxLQUFLLENBQUMsWUFBMEIsQ0FBQyxDQUFDOzZCQUN2Qzs0QkFDRCxNQUFNO3dCQUNSLEtBQUssTUFBTTs0QkFDVCxLQUFLLEdBQUcsWUFBWSxDQUNoQixJQUFJLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLFlBQXNCLENBQUMsQ0FBQzs0QkFDM0QsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsZ0JBQWdCLEVBQUU7Z0NBQ25ELEtBQUssR0FBRyxZQUFZLENBQ2hCLElBQUksQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixFQUNqQyxLQUFLLENBQUMsWUFBc0IsQ0FBQyxDQUFDOzZCQUNuQzs0QkFDRCxNQUFNO3dCQUNSLEtBQUssUUFBUSxDQUFDO3dCQUNkLEtBQUssU0FBUzs0QkFDWixNQUFNO3dCQUNSOzRCQUNFLE1BQU0sSUFBSSxLQUFLLENBQ1gsMkJBQTJCLEtBQUssQ0FBQyxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7cUJBQ25FO29CQUNELEdBQUcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUM7b0JBQ2hDLE9BQU8sR0FBRyxDQUFDO2dCQUNiLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNaO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztJQUVELDRDQUE0QztJQUNwQyxXQUFXLENBQUMsV0FBb0M7UUFDdEQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLE9BQU8sQ0FBQztRQUNwQyxNQUFNLFlBQVksR0FBVyxFQUFFLENBQUM7UUFDaEMsTUFBTSxPQUFPLEdBQVcsRUFBRSxDQUFDO1FBQzNCLElBQUksS0FBSyxHQUEwQixFQUFFLENBQUM7UUFDdEMsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ25CLEtBQUssR0FBRyxPQUFPLENBQUMsTUFBTSxDQUF3QixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTtnQkFDMUQsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2dCQUNwQyxJQUFJLElBQUksQ0FBQyxFQUFFLEtBQUssT0FBTyxFQUFFO29CQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztpQkFDOUI7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDUjtRQUNELE1BQU0sTUFBTSxHQUFXLEVBQUUsQ0FBQztRQUMxQixNQUFNLE9BQU8sR0FBVyxFQUFFLENBQUM7UUFFM0IsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQzNDLE1BQU0sQ0FBQyxRQUFRLEVBQUcsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDbkQsTUFBTSxJQUFJLEdBQVM7Z0JBQ2pCLElBQUksRUFBRSxRQUFRO2dCQUNkLEVBQUUsRUFBRSxhQUFhO2dCQUNqQixNQUFNLEVBQUUsRUFBRTtnQkFDVixVQUFVLEVBQUUsRUFBRTtnQkFDZCxRQUFRLEVBQUUsT0FBTztnQkFDakIsV0FBVyxFQUFFLEVBQUU7Z0JBQ2YsVUFBVSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBQyxFQUFDO2dCQUN0RSxRQUFRLEVBQUUsRUFBRTthQUNiLENBQUM7WUFDRixJQUFJLENBQUMsWUFBWSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7WUFDN0IsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsQixLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO1FBQ3pCLENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNwQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN4QixJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDdEMsTUFBTSxDQUFDLFFBQVEsRUFBRSxBQUFELEVBQUcsVUFBVSxDQUFDLEdBQUcsbUJBQW1CLENBQUMsSUFBSSxDQUFDLENBQUM7Z0JBQzNELE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztnQkFDbEMsSUFBSSxTQUFTLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtvQkFDN0IsTUFBTSxXQUFXLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7b0JBQzFELElBQUksV0FBVyxLQUFLLENBQUMsQ0FBQyxFQUFFO3dCQUN0QixNQUFNLFNBQVMsR0FBRyxHQUFHLFFBQVEsSUFBSSxXQUFXLEVBQUUsQ0FBQzt3QkFDL0MsaUVBQWlFO3dCQUNqRSxJQUFJLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxHQUFHLFNBQVMsQ0FBQztxQkFDcEM7aUJBQ0Y7Z0JBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7Z0JBQzVCLFNBQVMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ2hDLENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGFBQWEsR0FBRyxXQUFXLENBQUMsR0FBRyxDQUFDO1FBRXRDLFdBQVcsQ0FBQyxTQUFTLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvQyxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMxRSxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDN0IsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO2dCQUNoQixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztnQkFDM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUNwQjtRQUNILENBQUMsQ0FBQyxDQUFDO1FBRUgsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3ZELE9BQU8sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLFNBQVMsRUFBQyxDQUFDO0lBQ3BFLENBQUM7SUFFTyxrQkFBa0IsQ0FBQyxXQUFvQztRQUU3RCxPQUFPO1lBQ0wsVUFBVSxFQUFFLFdBQVcsQ0FBQyxTQUFTLENBQUMsSUFBSTtZQUN0QyxNQUFNLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUN6QyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDWCxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQkFDN0MsT0FBTyxHQUFHLENBQUM7WUFDYixDQUFDLEVBQ0QsRUFBNkMsQ0FBQztZQUNsRCxPQUFPLEVBQUUsV0FBVyxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUMzQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDWCxHQUFHLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxHQUFHLEVBQUUsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUM5RCxPQUFPLEdBQUcsQ0FBQztZQUNiLENBQUMsRUFDRCxFQUE2QyxDQUFDO1NBQ25ELENBQUM7SUFDSixDQUFDO0lBRU8sa0JBQWtCLENBQ3RCLEdBQTZCLEVBQzdCLE9BQWlDO1FBQ25DLElBQUksSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUM7UUFDcEIsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ25CLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDdEI7UUFDRCxPQUFPLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsSUFBSSxFQUFDLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBRUQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUFZO0lBQ3ZDLE1BQU0sTUFBTSxHQUFHLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUM1QixJQUFJLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxXQUFXLEVBQUU7UUFDdEMsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQzFCO1NBQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7UUFDeEMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7S0FDOUM7U0FBTTtRQUNMLE1BQU0sSUFBSSxLQUFLLENBQ1gsK0NBQStDO1lBQy9DLHFDQUFxQyxDQUFDLENBQUM7S0FDNUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUFDLENBQVksRUFBRSxRQUFpQjtJQUM5RCxNQUFNLEtBQUssR0FDUCxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1RSxPQUFPLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7QUFDaEQsQ0FBQztBQUVELE1BQU0sVUFBVSxjQUFjLENBQzFCLEtBQTZDLEVBQUUsSUFBWSxFQUFFLEdBQVcsRUFDeEUsUUFBUSxHQUFHLEtBQUs7SUFDbEIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUNqQixPQUFPLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7S0FDNUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUN4QixLQUE2QyxFQUFFLElBQVksRUFDM0QsR0FBWTtJQUNkLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0FBQy9CLENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUMxQixLQUE2QyxFQUFFLElBQVksRUFDM0QsR0FBVztJQUNiLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDaEMsTUFBTSxLQUFLLEdBQ1AsS0FBSyxDQUFDLEdBQUcsQ0FBQyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDOUUsT0FBTyxDQUFDLE9BQU8sS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsS0FBaUM7SUFDL0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssUUFBUSxFQUFFO1FBQy9CLGtDQUFrQztRQUNsQyxLQUFLLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQyxLQUFZLENBQUMsQ0FBQztLQUMzQztJQUNELFFBQVEsS0FBSyxFQUFFO1FBQ2IsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNsQyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM5QixPQUFPLFNBQVMsQ0FBQztRQUNuQixLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ2xDLEtBQUssVUFBVSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDbEMsS0FBSyxVQUFVLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNqQyxLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsUUFBUTtZQUMvQixPQUFPLE9BQU8sQ0FBQztRQUNqQixLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsT0FBTztZQUM5QixPQUFPLE1BQU0sQ0FBQztRQUNoQixLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUztZQUNoQyxPQUFPLFNBQVMsQ0FBQztRQUNuQixLQUFLLFVBQVUsQ0FBQyxRQUFRLENBQUMsU0FBUztZQUNoQyxPQUFPLFFBQVEsQ0FBQztRQUNsQjtZQUNFLHNFQUFzRTtZQUN0RSx3RUFBd0U7WUFDeEUsT0FBTyxJQUFJLENBQUM7S0FDZjtBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsWUFBWSxDQUN4QixLQUE2QyxFQUFFLElBQVksRUFDM0QsR0FBVztJQUNiLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7S0FDeEI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLFVBQVUsYUFBYSxDQUN6QixLQUE2QyxFQUFFLElBQVksRUFDM0QsR0FBYTtJQUNmLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFO1FBQ3ZCLE9BQU8sZUFBZSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztLQUNwQztJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxrQkFBa0IsQ0FDOUIsS0FBNkMsRUFBRSxJQUFZLEVBQzNELEdBQWU7SUFDakIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUU7UUFDMUMsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNyRDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxLQUE4QjtJQUVsRSxJQUFJLEtBQUssQ0FBQyxXQUFXLEVBQUU7UUFDckIsT0FBTyxTQUFTLENBQUM7S0FDbEI7SUFDRCxJQUFJLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxFQUFFO1FBQ3JCLE9BQU8sS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ2hCLEdBQUcsQ0FBQyxFQUFFLENBQ0YsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDN0U7SUFDRCxPQUFPLEVBQUUsQ0FBQztBQUNaLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQy9CLEtBQTZDLEVBQUUsSUFBWSxFQUMzRCxHQUFjO0lBQ2hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFO1FBQ3hCLE9BQU8scUJBQXFCLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzNDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxLQUE2QyxFQUFFLElBQVksRUFDM0QsR0FBYTtJQUNmLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixJQUFJLEtBQUssRUFBRTtRQUNULE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1lBQ3BELEVBQUUsQ0FBQzthQUNOLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxVQUFVLG1CQUFtQixDQUMvQixLQUE2QyxFQUFFLElBQVksRUFBRSxHQUFhLEVBQzFFLFFBQVEsR0FBRyxLQUFLO0lBQ2xCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7WUFDNUIsT0FBTyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkMsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FDcEMsS0FBNkMsRUFBRSxJQUFZLEVBQzNELEdBQWU7SUFDakIsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLElBQUksS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDM0MsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNoQyxPQUFPLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLEtBQTZDLEVBQUUsSUFBWSxFQUMzRCxHQUFjO0lBQ2hCLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMxQixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQ3ZDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7S0FDckI7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIGVudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgdGVuc29yZmxvdyBmcm9tICcuLi9kYXRhL2NvbXBpbGVkX2FwaSc7XG5cbmltcG9ydCB7Z2V0UmVnaXN0ZXJlZE9wfSBmcm9tICcuL2N1c3RvbV9vcC9yZWdpc3Rlcic7XG5pbXBvcnQge2dldE5vZGVOYW1lQW5kSW5kZXh9IGZyb20gJy4vZXhlY3V0b3JzL3V0aWxzJztcbmltcG9ydCAqIGFzIGFyaXRobWV0aWMgZnJvbSAnLi9vcF9saXN0L2FyaXRobWV0aWMnO1xuaW1wb3J0ICogYXMgYmFzaWNNYXRoIGZyb20gJy4vb3BfbGlzdC9iYXNpY19tYXRoJztcbmltcG9ydCAqIGFzIGNvbnRyb2wgZnJvbSAnLi9vcF9saXN0L2NvbnRyb2wnO1xuaW1wb3J0ICogYXMgY29udm9sdXRpb24gZnJvbSAnLi9vcF9saXN0L2NvbnZvbHV0aW9uJztcbmltcG9ydCAqIGFzIGNyZWF0aW9uIGZyb20gJy4vb3BfbGlzdC9jcmVhdGlvbic7XG5pbXBvcnQgKiBhcyBkeW5hbWljIGZyb20gJy4vb3BfbGlzdC9keW5hbWljJztcbmltcG9ydCAqIGFzIGV2YWx1YXRpb24gZnJvbSAnLi9vcF9saXN0L2V2YWx1YXRpb24nO1xuaW1wb3J0ICogYXMgZ3JhcGggZnJvbSAnLi9vcF9saXN0L2dyYXBoJztcbmltcG9ydCAqIGFzIGhhc2hUYWJsZSBmcm9tICcuL29wX2xpc3QvaGFzaF90YWJsZSc7XG5pbXBvcnQgKiBhcyBpbWFnZSBmcm9tICcuL29wX2xpc3QvaW1hZ2UnO1xuaW1wb3J0ICogYXMgbG9naWNhbCBmcm9tICcuL29wX2xpc3QvbG9naWNhbCc7XG5pbXBvcnQgKiBhcyBtYXRyaWNlcyBmcm9tICcuL29wX2xpc3QvbWF0cmljZXMnO1xuaW1wb3J0ICogYXMgbm9ybWFsaXphdGlvbiBmcm9tICcuL29wX2xpc3Qvbm9ybWFsaXphdGlvbic7XG5pbXBvcnQgKiBhcyByZWR1Y3Rpb24gZnJvbSAnLi9vcF9saXN0L3JlZHVjdGlvbic7XG5pbXBvcnQgKiBhcyBzbGljZUpvaW4gZnJvbSAnLi9vcF9saXN0L3NsaWNlX2pvaW4nO1xuaW1wb3J0ICogYXMgc3BhcnNlIGZyb20gJy4vb3BfbGlzdC9zcGFyc2UnO1xuaW1wb3J0ICogYXMgc3BlY3RyYWwgZnJvbSAnLi9vcF9saXN0L3NwZWN0cmFsJztcbmltcG9ydCAqIGFzIHN0cmluZyBmcm9tICcuL29wX2xpc3Qvc3RyaW5nJztcbmltcG9ydCAqIGFzIHRyYW5zZm9ybWF0aW9uIGZyb20gJy4vb3BfbGlzdC90cmFuc2Zvcm1hdGlvbic7XG5pbXBvcnQge0dyYXBoLCBJbnB1dFBhcmFtVmFsdWUsIE5vZGUsIE9wTWFwcGVyLCBQYXJhbVZhbHVlfSBmcm9tICcuL3R5cGVzJztcblxuZXhwb3J0IGNsYXNzIE9wZXJhdGlvbk1hcHBlciB7XG4gIHByaXZhdGUgc3RhdGljIF9pbnN0YW5jZTogT3BlcmF0aW9uTWFwcGVyO1xuXG4gIHByaXZhdGUgb3BNYXBwZXJzOiB7W2tleTogc3RyaW5nXTogT3BNYXBwZXJ9O1xuXG4gIC8vIFNpbmdsZXRvbiBpbnN0YW5jZSBmb3IgdGhlIG1hcHBlclxuICBwdWJsaWMgc3RhdGljIGdldCBJbnN0YW5jZSgpIHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UgfHwgKHRoaXMuX2luc3RhbmNlID0gbmV3IHRoaXMoKSk7XG4gIH1cblxuICAvLyBMb2FkcyB0aGUgb3AgbWFwcGluZyBmcm9tIHRoZSBKU09OIGZpbGUuXG4gIHByaXZhdGUgY29uc3RydWN0b3IoKSB7XG4gICAgY29uc3Qgb3BzID0gW1xuICAgICAgYXJpdGhtZXRpYywgYmFzaWNNYXRoLCBjb250cm9sLCBjb252b2x1dGlvbiwgY3JlYXRpb24sIGR5bmFtaWMsXG4gICAgICBldmFsdWF0aW9uLCBncmFwaCwgaGFzaFRhYmxlLCBpbWFnZSwgbG9naWNhbCwgbWF0cmljZXMsIG5vcm1hbGl6YXRpb24sXG4gICAgICByZWR1Y3Rpb24sIHNsaWNlSm9pbiwgc3BhcnNlLCBzcGVjdHJhbCwgc3RyaW5nLCB0cmFuc2Zvcm1hdGlvblxuICAgIF07XG4gICAgY29uc3QgbWFwcGVyc0pzb246IE9wTWFwcGVyW10gPSBbXS5jb25jYXQoLi4ub3BzLm1hcChvcCA9PiBvcC5qc29uKSk7XG5cbiAgICB0aGlzLm9wTWFwcGVycyA9IG1hcHBlcnNKc29uLnJlZHVjZTx7W2tleTogc3RyaW5nXTogT3BNYXBwZXJ9PihcbiAgICAgICAgKG1hcCwgbWFwcGVyOiBPcE1hcHBlcikgPT4ge1xuICAgICAgICAgIG1hcFttYXBwZXIudGZPcE5hbWVdID0gbWFwcGVyO1xuICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgIH0sXG4gICAgICAgIHt9KTtcbiAgfVxuXG4gIC8vIENvbnZlcnRzIHRoZSBtb2RlbCBpbmZlcmVuY2UgZ3JhcGggZnJvbSBUZW5zb3JmbG93IEdyYXBoRGVmIHRvIGxvY2FsXG4gIC8vIHJlcHJlc2VudGF0aW9uIGZvciBUZW5zb3JGbG93LmpzIEFQSVxuICB0cmFuc2Zvcm1HcmFwaChcbiAgICAgIGdyYXBoOiB0ZW5zb3JmbG93LklHcmFwaERlZixcbiAgICAgIHNpZ25hdHVyZTogdGVuc29yZmxvdy5JU2lnbmF0dXJlRGVmID0ge30pOiBHcmFwaCB7XG4gICAgY29uc3QgdGZOb2RlcyA9IGdyYXBoLm5vZGU7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzOiBOb2RlW10gPSBbXTtcbiAgICBjb25zdCB3ZWlnaHRzOiBOb2RlW10gPSBbXTtcbiAgICBjb25zdCBpbml0Tm9kZXM6IE5vZGVbXSA9IFtdO1xuICAgIGNvbnN0IG5vZGVzID0gdGZOb2Rlcy5yZWR1Y2U8e1trZXk6IHN0cmluZ106IE5vZGV9PigobWFwLCBub2RlKSA9PiB7XG4gICAgICBtYXBbbm9kZS5uYW1lXSA9IHRoaXMubWFwTm9kZShub2RlKTtcbiAgICAgIGlmIChub2RlLm9wLnN0YXJ0c1dpdGgoJ1BsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2gobWFwW25vZGUubmFtZV0pO1xuICAgICAgfSBlbHNlIGlmIChub2RlLm9wID09PSAnQ29uc3QnKSB7XG4gICAgICAgIHdlaWdodHMucHVzaChtYXBbbm9kZS5uYW1lXSk7XG4gICAgICB9IGVsc2UgaWYgKG5vZGUuaW5wdXQgPT0gbnVsbCB8fCBub2RlLmlucHV0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBpbml0Tm9kZXMucHVzaChtYXBbbm9kZS5uYW1lXSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gbWFwO1xuICAgIH0sIHt9KTtcblxuICAgIGxldCBpbnB1dHM6IE5vZGVbXSA9IFtdO1xuICAgIGNvbnN0IG91dHB1dHM6IE5vZGVbXSA9IFtdO1xuICAgIGxldCBpbnB1dE5vZGVOYW1lVG9LZXk6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgbGV0IG91dHB1dE5vZGVOYW1lVG9LZXk6IHtba2V5OiBzdHJpbmddOiBzdHJpbmd9ID0ge307XG4gICAgaWYgKHNpZ25hdHVyZSAhPSBudWxsKSB7XG4gICAgICBpbnB1dE5vZGVOYW1lVG9LZXkgPSB0aGlzLm1hcFNpZ25hdHVyZUVudHJpZXMoc2lnbmF0dXJlLmlucHV0cyk7XG4gICAgICBvdXRwdXROb2RlTmFtZVRvS2V5ID0gdGhpcy5tYXBTaWduYXR1cmVFbnRyaWVzKHNpZ25hdHVyZS5vdXRwdXRzKTtcbiAgICB9XG4gICAgY29uc3QgYWxsTm9kZXMgPSBPYmplY3Qua2V5cyhub2Rlcyk7XG4gICAgYWxsTm9kZXMuZm9yRWFjaChrZXkgPT4ge1xuICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzW2tleV07XG4gICAgICBub2RlLmlucHV0TmFtZXMuZm9yRWFjaCgobmFtZSwgaW5kZXgpID0+IHtcbiAgICAgICAgY29uc3QgW25vZGVOYW1lLCAsIG91dHB1dE5hbWVdID0gZ2V0Tm9kZU5hbWVBbmRJbmRleChuYW1lKTtcbiAgICAgICAgY29uc3QgaW5wdXROb2RlID0gbm9kZXNbbm9kZU5hbWVdO1xuICAgICAgICBpZiAoaW5wdXROb2RlLm91dHB1dHMgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IG91dHB1dEluZGV4ID0gaW5wdXROb2RlLm91dHB1dHMuaW5kZXhPZihvdXRwdXROYW1lKTtcbiAgICAgICAgICBpZiAob3V0cHV0SW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICBjb25zdCBpbnB1dE5hbWUgPSBgJHtub2RlTmFtZX06JHtvdXRwdXRJbmRleH1gO1xuICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBpbnB1dCBuYW1lIHRvIHVzZSB0aGUgbWFwcGVkIG91dHB1dCBpbmRleCBkaXJlY3RseS5cbiAgICAgICAgICAgIG5vZGUuaW5wdXROYW1lc1tpbmRleF0gPSBpbnB1dE5hbWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5vZGUuaW5wdXRzLnB1c2goaW5wdXROb2RlKTtcbiAgICAgICAgaW5wdXROb2RlLmNoaWxkcmVuLnB1c2gobm9kZSk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIC8vIGlmIHNpZ25hdHVyZSBoYXMgbm90IG91dHB1dHMgc2V0LCBhZGQgYW55IG5vZGUgdGhhdCBkb2VzIG5vdCBoYXZlXG4gICAgLy8gb3V0cHV0cy5cbiAgICBpZiAoT2JqZWN0LmtleXMob3V0cHV0Tm9kZU5hbWVUb0tleSkubGVuZ3RoID09PSAwKSB7XG4gICAgICBhbGxOb2Rlcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1trZXldO1xuICAgICAgICBpZiAobm9kZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBvdXRwdXRzLnB1c2gobm9kZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBPYmplY3Qua2V5cyhvdXRwdXROb2RlTmFtZVRvS2V5KS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZU5hbWUsIF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KG5hbWUpO1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbbm9kZU5hbWVdO1xuICAgICAgICBpZiAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgICAgbm9kZS5zaWduYXR1cmVLZXkgPSBvdXRwdXROb2RlTmFtZVRvS2V5W25hbWVdO1xuICAgICAgICAgIG91dHB1dHMucHVzaChub2RlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaWYgKE9iamVjdC5rZXlzKGlucHV0Tm9kZU5hbWVUb0tleSkubGVuZ3RoID4gMCkge1xuICAgICAgT2JqZWN0LmtleXMoaW5wdXROb2RlTmFtZVRvS2V5KS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZU5hbWUsIF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KG5hbWUpO1xuICAgICAgICBjb25zdCBub2RlID0gbm9kZXNbbm9kZU5hbWVdO1xuICAgICAgICBpZiAobm9kZSkge1xuICAgICAgICAgIG5vZGUuc2lnbmF0dXJlS2V5ID0gaW5wdXROb2RlTmFtZVRvS2V5W25hbWVdO1xuICAgICAgICAgIGlucHV0cy5wdXNoKG5vZGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgaW5wdXRzID0gcGxhY2Vob2xkZXJzO1xuICAgIH1cblxuICAgIGxldCBmdW5jdGlvbnMgPSB7fTtcbiAgICBpZiAoZ3JhcGgubGlicmFyeSAhPSBudWxsICYmIGdyYXBoLmxpYnJhcnkuZnVuY3Rpb24gIT0gbnVsbCkge1xuICAgICAgZnVuY3Rpb25zID0gZ3JhcGgubGlicmFyeS5mdW5jdGlvbi5yZWR1Y2UoKGZ1bmN0aW9ucywgZnVuYykgPT4ge1xuICAgICAgICBmdW5jdGlvbnNbZnVuYy5zaWduYXR1cmUubmFtZV0gPSB0aGlzLm1hcEZ1bmN0aW9uKGZ1bmMpO1xuICAgICAgICByZXR1cm4gZnVuY3Rpb25zO1xuICAgICAgfSwge30gYXMge1trZXk6IHN0cmluZ106IEdyYXBofSk7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzdWx0OiBHcmFwaCA9XG4gICAgICAgIHtub2RlcywgaW5wdXRzLCBvdXRwdXRzLCB3ZWlnaHRzLCBwbGFjZWhvbGRlcnMsIHNpZ25hdHVyZSwgZnVuY3Rpb25zfTtcblxuICAgIGlmIChpbml0Tm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgcmVzdWx0LmluaXROb2RlcyA9IGluaXROb2RlcztcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBtYXBTaWduYXR1cmVFbnRyaWVzKGVudHJpZXM6IHtbazogc3RyaW5nXTogdGVuc29yZmxvdy5JVGVuc29ySW5mb30pIHtcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoZW50cmllcyB8fCB7fSlcbiAgICAgICAgLnJlZHVjZTx7W2tleTogc3RyaW5nXTogc3RyaW5nfT4oKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICBwcmV2W2VudHJpZXNbY3Vycl0ubmFtZV0gPSBjdXJyO1xuICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIG1hcE5vZGUobm9kZTogdGVuc29yZmxvdy5JTm9kZURlZik6IE5vZGUge1xuICAgIC8vIFVuc3VwcG9ydGVkIG9wcyB3aWxsIGNhdXNlIGFuIGVycm9yIGF0IHJ1bi10aW1lIChub3QgcGFyc2UgdGltZSksIHNpbmNlXG4gICAgLy8gdGhleSBtYXkgbm90IGJlIHVzZWQgYnkgdGhlIGFjdHVhbCBleGVjdXRpb24gc3ViZ3JhcGguXG4gICAgY29uc3QgbWFwcGVyID1cbiAgICAgICAgZ2V0UmVnaXN0ZXJlZE9wKG5vZGUub3ApIHx8IHRoaXMub3BNYXBwZXJzW25vZGUub3BdIHx8IHt9IGFzIE9wTWFwcGVyO1xuICAgIGlmIChub2RlLmF0dHIgPT0gbnVsbCkge1xuICAgICAgbm9kZS5hdHRyID0ge307XG4gICAgfVxuXG4gICAgY29uc3QgbmV3Tm9kZTogTm9kZSA9IHtcbiAgICAgIG5hbWU6IG5vZGUubmFtZSxcbiAgICAgIG9wOiBub2RlLm9wLFxuICAgICAgY2F0ZWdvcnk6IG1hcHBlci5jYXRlZ29yeSxcbiAgICAgIGlucHV0TmFtZXM6XG4gICAgICAgICAgKG5vZGUuaW5wdXQgfHxcbiAgICAgICAgICAgW10pLm1hcChpbnB1dCA9PiBpbnB1dC5zdGFydHNXaXRoKCdeJykgPyBpbnB1dC5zbGljZSgxKSA6IGlucHV0KSxcbiAgICAgIGlucHV0czogW10sXG4gICAgICBjaGlsZHJlbjogW10sXG4gICAgICBpbnB1dFBhcmFtczoge30sXG4gICAgICBhdHRyUGFyYW1zOiB7fSxcbiAgICAgIHJhd0F0dHJzOiBub2RlLmF0dHIsXG4gICAgICBvdXRwdXRzOiBtYXBwZXIub3V0cHV0c1xuICAgIH07XG5cbiAgICBpZiAobWFwcGVyLmlucHV0cyAhPSBudWxsKSB7XG4gICAgICBuZXdOb2RlLmlucHV0UGFyYW1zID1cbiAgICAgICAgICBtYXBwZXIuaW5wdXRzLnJlZHVjZTx7W2tleTogc3RyaW5nXTogSW5wdXRQYXJhbVZhbHVlfT4oXG4gICAgICAgICAgICAgIChtYXAsIHBhcmFtKSA9PiB7XG4gICAgICAgICAgICAgICAgbWFwW3BhcmFtLm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogcGFyYW0udHlwZSxcbiAgICAgICAgICAgICAgICAgIGlucHV0SW5kZXhTdGFydDogcGFyYW0uc3RhcnQsXG4gICAgICAgICAgICAgICAgICBpbnB1dEluZGV4RW5kOiBwYXJhbS5lbmRcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIHt9KTtcbiAgICB9XG4gICAgaWYgKG1hcHBlci5hdHRycyAhPSBudWxsKSB7XG4gICAgICBuZXdOb2RlLmF0dHJQYXJhbXMgPVxuICAgICAgICAgIG1hcHBlci5hdHRycy5yZWR1Y2U8e1trZXk6IHN0cmluZ106IFBhcmFtVmFsdWV9PigobWFwLCBwYXJhbSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgdHlwZSA9IHBhcmFtLnR5cGU7XG4gICAgICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBzd2l0Y2ggKHBhcmFtLnR5cGUpIHtcbiAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldFN0cmluZ1BhcmFtKFxuICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmTmFtZSwgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIHN0cmluZyk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0U3RyaW5nUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50ZkRlcHJlY2F0ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnc3RyaW5nW10nOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0U3RyaW5nQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50Zk5hbWUsIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBzdHJpbmdbXSk7XG5cbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0U3RyaW5nQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIHN0cmluZ1tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXROdW1iZXJQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50Zk5hbWUsXG4gICAgICAgICAgICAgICAgICAgIChwYXJhbS5kZWZhdWx0VmFsdWUgfHwgMCkgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0TnVtYmVyUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50ZkRlcHJlY2F0ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnbnVtYmVyW10nOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0TnVtZXJpY0FycmF5UGFyYW0oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZOYW1lLCBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgbnVtYmVyW10pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXROdW1lcmljQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIG51bWJlcltdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2Jvb2wnOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0Qm9vbFBhcmFtKFxuICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmTmFtZSwgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIGJvb2xlYW4pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRCb29sUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50ZkRlcHJlY2F0ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBib29sZWFuKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2Jvb2xbXSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRCb29sQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50Zk5hbWUsIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBib29sZWFuW10pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRCb29sQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIGJvb2xlYW5bXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBjYXNlICdzaGFwZSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRUZW5zb3JTaGFwZVBhcmFtKFxuICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmTmFtZSwgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIG51bWJlcltdKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VGVuc29yU2hhcGVQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIG51bWJlcltdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3NoYXBlW10nOlxuICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0VGVuc29yU2hhcGVBcnJheVBhcmFtKFxuICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmTmFtZSwgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIG51bWJlcltdW10pO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRUZW5zb3JTaGFwZUFycmF5UGFyYW0oXG4gICAgICAgICAgICAgICAgICAgICAgbm9kZS5hdHRyLCBwYXJhbS50ZkRlcHJlY2F0ZWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmRlZmF1bHRWYWx1ZSBhcyBudW1iZXJbXVtdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ2R0eXBlJzpcbiAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldER0eXBlUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZOYW1lLCBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgRGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkICYmICEhcGFyYW0udGZEZXByZWNhdGVkTmFtZSkge1xuICAgICAgICAgICAgICAgICAgdmFsdWUgPSBnZXREdHlwZVBhcmFtKFxuICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZEZXByZWNhdGVkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgRGF0YVR5cGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZHR5cGVbXSc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXREdHlwZUFycmF5UGFyYW0oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZOYW1lLCBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgRGF0YVR5cGVbXSk7XG4gICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgISFwYXJhbS50ZkRlcHJlY2F0ZWROYW1lKSB7XG4gICAgICAgICAgICAgICAgICB2YWx1ZSA9IGdldER0eXBlQXJyYXlQYXJhbShcbiAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHIsIHBhcmFtLnRmRGVwcmVjYXRlZE5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgcGFyYW0uZGVmYXVsdFZhbHVlIGFzIERhdGFUeXBlW10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgY2FzZSAnZnVuYyc6XG4gICAgICAgICAgICAgICAgdmFsdWUgPSBnZXRGdW5jUGFyYW0oXG4gICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZOYW1lLCBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhIXBhcmFtLnRmRGVwcmVjYXRlZE5hbWUpIHtcbiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZ2V0RnVuY1BhcmFtKFxuICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0ciwgcGFyYW0udGZEZXByZWNhdGVkTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICBwYXJhbS5kZWZhdWx0VmFsdWUgYXMgc3RyaW5nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIGNhc2UgJ3RlbnNvcic6XG4gICAgICAgICAgICAgIGNhc2UgJ3RlbnNvcnMnOlxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICAgICAgYFVuc3VwcG9ydGVkIHBhcmFtIHR5cGU6ICR7cGFyYW0udHlwZX0gZm9yIG9wOiAke25vZGUub3B9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBtYXBbcGFyYW0ubmFtZV0gPSB7dmFsdWUsIHR5cGV9O1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICB9LCB7fSk7XG4gICAgfVxuICAgIHJldHVybiBuZXdOb2RlO1xuICB9XG5cbiAgLy8gbWFwIHRoZSBURnVuY3Rpb25EZWYgdG8gVEZKUyBncmFwaCBvYmplY3RcbiAgcHJpdmF0ZSBtYXBGdW5jdGlvbihmdW5jdGlvbkRlZjogdGVuc29yZmxvdy5JRnVuY3Rpb25EZWYpOiBHcmFwaCB7XG4gICAgY29uc3QgdGZOb2RlcyA9IGZ1bmN0aW9uRGVmLm5vZGVEZWY7XG4gICAgY29uc3QgcGxhY2Vob2xkZXJzOiBOb2RlW10gPSBbXTtcbiAgICBjb25zdCB3ZWlnaHRzOiBOb2RlW10gPSBbXTtcbiAgICBsZXQgbm9kZXM6IHtba2V5OiBzdHJpbmddOiBOb2RlfSA9IHt9O1xuICAgIGlmICh0Zk5vZGVzICE9IG51bGwpIHtcbiAgICAgIG5vZGVzID0gdGZOb2Rlcy5yZWR1Y2U8e1trZXk6IHN0cmluZ106IE5vZGV9PigobWFwLCBub2RlKSA9PiB7XG4gICAgICAgIG1hcFtub2RlLm5hbWVdID0gdGhpcy5tYXBOb2RlKG5vZGUpO1xuICAgICAgICBpZiAobm9kZS5vcCA9PT0gJ0NvbnN0Jykge1xuICAgICAgICAgIHdlaWdodHMucHVzaChtYXBbbm9kZS5uYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgIH0sIHt9KTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRzOiBOb2RlW10gPSBbXTtcbiAgICBjb25zdCBvdXRwdXRzOiBOb2RlW10gPSBbXTtcblxuICAgIGZ1bmN0aW9uRGVmLnNpZ25hdHVyZS5pbnB1dEFyZy5mb3JFYWNoKGFyZyA9PiB7XG4gICAgICBjb25zdCBbbm9kZU5hbWUsIF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KGFyZy5uYW1lKTtcbiAgICAgIGNvbnN0IG5vZGU6IE5vZGUgPSB7XG4gICAgICAgIG5hbWU6IG5vZGVOYW1lLFxuICAgICAgICBvcDogJ1BsYWNlaG9sZGVyJyxcbiAgICAgICAgaW5wdXRzOiBbXSxcbiAgICAgICAgaW5wdXROYW1lczogW10sXG4gICAgICAgIGNhdGVnb3J5OiAnZ3JhcGgnLFxuICAgICAgICBpbnB1dFBhcmFtczoge30sXG4gICAgICAgIGF0dHJQYXJhbXM6IHtkdHlwZToge3ZhbHVlOiBwYXJzZUR0eXBlUGFyYW0oYXJnLnR5cGUpLCB0eXBlOiAnZHR5cGUnfX0sXG4gICAgICAgIGNoaWxkcmVuOiBbXVxuICAgICAgfTtcbiAgICAgIG5vZGUuc2lnbmF0dXJlS2V5ID0gYXJnLm5hbWU7XG4gICAgICBpbnB1dHMucHVzaChub2RlKTtcbiAgICAgIG5vZGVzW25vZGVOYW1lXSA9IG5vZGU7XG4gICAgfSk7XG5cbiAgICBjb25zdCBhbGxOb2RlcyA9IE9iamVjdC5rZXlzKG5vZGVzKTtcbiAgICBhbGxOb2Rlcy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCBub2RlID0gbm9kZXNba2V5XTtcbiAgICAgIG5vZGUuaW5wdXROYW1lcy5mb3JFYWNoKChuYW1lLCBpbmRleCkgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZU5hbWUsICwgb3V0cHV0TmFtZV0gPSBnZXROb2RlTmFtZUFuZEluZGV4KG5hbWUpO1xuICAgICAgICBjb25zdCBpbnB1dE5vZGUgPSBub2Rlc1tub2RlTmFtZV07XG4gICAgICAgIGlmIChpbnB1dE5vZGUub3V0cHV0cyAhPSBudWxsKSB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSBpbnB1dE5vZGUub3V0cHV0cy5pbmRleE9mKG91dHB1dE5hbWUpO1xuICAgICAgICAgIGlmIChvdXRwdXRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgIGNvbnN0IGlucHV0TmFtZSA9IGAke25vZGVOYW1lfToke291dHB1dEluZGV4fWA7XG4gICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGlucHV0IG5hbWUgdG8gdXNlIHRoZSBtYXBwZWQgb3V0cHV0IGluZGV4IGRpcmVjdGx5LlxuICAgICAgICAgICAgbm9kZS5pbnB1dE5hbWVzW2luZGV4XSA9IGlucHV0TmFtZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbm9kZS5pbnB1dHMucHVzaChpbnB1dE5vZGUpO1xuICAgICAgICBpbnB1dE5vZGUuY2hpbGRyZW4ucHVzaChub2RlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgY29uc3QgcmV0dXJuTm9kZU1hcCA9IGZ1bmN0aW9uRGVmLnJldDtcblxuICAgIGZ1bmN0aW9uRGVmLnNpZ25hdHVyZS5vdXRwdXRBcmcuZm9yRWFjaChvdXRwdXQgPT4ge1xuICAgICAgY29uc3QgW25vZGVOYW1lLCBpbmRleF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KHJldHVybk5vZGVNYXBbb3V0cHV0Lm5hbWVdKTtcbiAgICAgIGNvbnN0IG5vZGUgPSBub2Rlc1tub2RlTmFtZV07XG4gICAgICBpZiAobm9kZSAhPSBudWxsKSB7XG4gICAgICAgIG5vZGUuZGVmYXVsdE91dHB1dCA9IGluZGV4O1xuICAgICAgICBvdXRwdXRzLnB1c2gobm9kZSk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBjb25zdCBzaWduYXR1cmUgPSB0aGlzLm1hcEFyZ3NUb1NpZ25hdHVyZShmdW5jdGlvbkRlZik7XG4gICAgcmV0dXJuIHtub2RlcywgaW5wdXRzLCBvdXRwdXRzLCB3ZWlnaHRzLCBwbGFjZWhvbGRlcnMsIHNpZ25hdHVyZX07XG4gIH1cblxuICBwcml2YXRlIG1hcEFyZ3NUb1NpZ25hdHVyZShmdW5jdGlvbkRlZjogdGVuc29yZmxvdy5JRnVuY3Rpb25EZWYpOlxuICAgICAgdGVuc29yZmxvdy5JU2lnbmF0dXJlRGVmIHtcbiAgICByZXR1cm4ge1xuICAgICAgbWV0aG9kTmFtZTogZnVuY3Rpb25EZWYuc2lnbmF0dXJlLm5hbWUsXG4gICAgICBpbnB1dHM6IGZ1bmN0aW9uRGVmLnNpZ25hdHVyZS5pbnB1dEFyZy5yZWR1Y2UoXG4gICAgICAgICAgKG1hcCwgYXJnKSA9PiB7XG4gICAgICAgICAgICBtYXBbYXJnLm5hbWVdID0gdGhpcy5tYXBBcmdUb1RlbnNvckluZm8oYXJnKTtcbiAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgfSxcbiAgICAgICAgICB7fSBhcyB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JVGVuc29ySW5mb30pLFxuICAgICAgb3V0cHV0czogZnVuY3Rpb25EZWYuc2lnbmF0dXJlLm91dHB1dEFyZy5yZWR1Y2UoXG4gICAgICAgICAgKG1hcCwgYXJnKSA9PiB7XG4gICAgICAgICAgICBtYXBbYXJnLm5hbWVdID0gdGhpcy5tYXBBcmdUb1RlbnNvckluZm8oYXJnLCBmdW5jdGlvbkRlZi5yZXQpO1xuICAgICAgICAgICAgcmV0dXJuIG1hcDtcbiAgICAgICAgICB9LFxuICAgICAgICAgIHt9IGFzIHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklUZW5zb3JJbmZvfSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgbWFwQXJnVG9UZW5zb3JJbmZvKFxuICAgICAgYXJnOiB0ZW5zb3JmbG93Lk9wRGVmLklBcmdEZWYsXG4gICAgICBuYW1lTWFwPzoge1trZXk6IHN0cmluZ106IHN0cmluZ30pOiB0ZW5zb3JmbG93LklUZW5zb3JJbmZvIHtcbiAgICBsZXQgbmFtZSA9IGFyZy5uYW1lO1xuICAgIGlmIChuYW1lTWFwICE9IG51bGwpIHtcbiAgICAgIG5hbWUgPSBuYW1lTWFwW25hbWVdO1xuICAgIH1cbiAgICByZXR1cm4ge25hbWUsIGR0eXBlOiBhcmcudHlwZX07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY29kZUJhc2U2NCh0ZXh0OiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBnbG9iYWwgPSBlbnYoKS5nbG9iYWw7XG4gIGlmICh0eXBlb2YgZ2xvYmFsLmF0b2IgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGdsb2JhbC5hdG9iKHRleHQpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBCdWZmZXIgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIodGV4dCwgJ2Jhc2U2NCcpLnRvU3RyaW5nKCk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnVW5hYmxlIHRvIGRlY29kZSBiYXNlNjQgaW4gdGhpcyBlbnZpcm9ubWVudC4gJyArXG4gICAgICAgICdNaXNzaW5nIGJ1aWx0LWluIGF0b2IoKSBvciBCdWZmZXIoKScpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVN0cmluZ1BhcmFtKHM6IFtdfHN0cmluZywga2VlcENhc2U6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB2YWx1ZSA9XG4gICAgICBBcnJheS5pc0FycmF5KHMpID8gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBzKSA6IGRlY29kZUJhc2U2NChzKTtcbiAgcmV0dXJuIGtlZXBDYXNlID8gdmFsdWUgOiB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nUGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsIGRlZjogc3RyaW5nLFxuICAgIGtlZXBDYXNlID0gZmFsc2UpOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdO1xuICBpZiAocGFyYW0gIT0gbnVsbCkge1xuICAgIHJldHVybiBwYXJzZVN0cmluZ1BhcmFtKHBhcmFtLnMsIGtlZXBDYXNlKTtcbiAgfVxuICByZXR1cm4gZGVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0Qm9vbFBhcmFtKFxuICAgIGF0dHJzOiB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JQXR0clZhbHVlfSwgbmFtZTogc3RyaW5nLFxuICAgIGRlZjogYm9vbGVhbik6IGJvb2xlYW4ge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdO1xuICByZXR1cm4gcGFyYW0gPyBwYXJhbS5iIDogZGVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TnVtYmVyUGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdIHx8IHt9O1xuICBjb25zdCB2YWx1ZSA9XG4gICAgICBwYXJhbVsnaSddICE9IG51bGwgPyBwYXJhbVsnaSddIDogKHBhcmFtWydmJ10gIT0gbnVsbCA/IHBhcmFtWydmJ10gOiBkZWYpO1xuICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpID8gdmFsdWUgOiBwYXJzZUludCh2YWx1ZSwgMTApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEdHlwZVBhcmFtKHZhbHVlOiBzdHJpbmd8dGVuc29yZmxvdy5EYXRhVHlwZSk6IERhdGFUeXBlIHtcbiAgaWYgKHR5cGVvZiAodmFsdWUpID09PSAnc3RyaW5nJykge1xuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICB2YWx1ZSA9IHRlbnNvcmZsb3cuRGF0YVR5cGVbdmFsdWUgYXMgYW55XTtcbiAgfVxuICBzd2l0Y2ggKHZhbHVlKSB7XG4gICAgY2FzZSB0ZW5zb3JmbG93LkRhdGFUeXBlLkRUX0ZMT0FUOlxuICAgIGNhc2UgdGVuc29yZmxvdy5EYXRhVHlwZS5EVF9IQUxGOlxuICAgICAgcmV0dXJuICdmbG9hdDMyJztcbiAgICBjYXNlIHRlbnNvcmZsb3cuRGF0YVR5cGUuRFRfSU5UMzI6XG4gICAgY2FzZSB0ZW5zb3JmbG93LkRhdGFUeXBlLkRUX0lOVDY0OlxuICAgIGNhc2UgdGVuc29yZmxvdy5EYXRhVHlwZS5EVF9JTlQ4OlxuICAgIGNhc2UgdGVuc29yZmxvdy5EYXRhVHlwZS5EVF9VSU5UODpcbiAgICAgIHJldHVybiAnaW50MzInO1xuICAgIGNhc2UgdGVuc29yZmxvdy5EYXRhVHlwZS5EVF9CT09MOlxuICAgICAgcmV0dXJuICdib29sJztcbiAgICBjYXNlIHRlbnNvcmZsb3cuRGF0YVR5cGUuRFRfRE9VQkxFOlxuICAgICAgcmV0dXJuICdmbG9hdDMyJztcbiAgICBjYXNlIHRlbnNvcmZsb3cuRGF0YVR5cGUuRFRfU1RSSU5HOlxuICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgIGRlZmF1bHQ6XG4gICAgICAvLyBVbmtub3duIGR0eXBlIGVycm9yIHdpbGwgaGFwcGVuIGF0IHJ1bnRpbWUgKGluc3RlYWQgb2YgcGFyc2UgdGltZSksXG4gICAgICAvLyBzaW5jZSB0aGVzZSBub2RlcyBtaWdodCBub3QgYmUgdXNlZCBieSB0aGUgYWN0dWFsIHN1YmdyYXBoIGV4ZWN1dGlvbi5cbiAgICAgIHJldHVybiBudWxsO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGdW5jUGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBzdHJpbmcpOiBzdHJpbmcge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdO1xuICBpZiAocGFyYW0gJiYgcGFyYW0uZnVuYykge1xuICAgIHJldHVybiBwYXJhbS5mdW5jLm5hbWU7XG4gIH1cbiAgcmV0dXJuIGRlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldER0eXBlUGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBEYXRhVHlwZSk6IERhdGFUeXBlIHtcbiAgY29uc3QgcGFyYW0gPSBhdHRyc1tuYW1lXTtcbiAgaWYgKHBhcmFtICYmIHBhcmFtLnR5cGUpIHtcbiAgICByZXR1cm4gcGFyc2VEdHlwZVBhcmFtKHBhcmFtLnR5cGUpO1xuICB9XG4gIHJldHVybiBkZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXREdHlwZUFycmF5UGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBEYXRhVHlwZVtdKTogRGF0YVR5cGVbXSB7XG4gIGNvbnN0IHBhcmFtID0gYXR0cnNbbmFtZV07XG4gIGlmIChwYXJhbSAmJiBwYXJhbS5saXN0ICYmIHBhcmFtLmxpc3QudHlwZSkge1xuICAgIHJldHVybiBwYXJhbS5saXN0LnR5cGUubWFwKHYgPT4gcGFyc2VEdHlwZVBhcmFtKHYpKTtcbiAgfVxuICByZXR1cm4gZGVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VUZW5zb3JTaGFwZVBhcmFtKHNoYXBlOiB0ZW5zb3JmbG93LklUZW5zb3JTaGFwZSk6IG51bWJlcltdfFxuICAgIHVuZGVmaW5lZCB7XG4gIGlmIChzaGFwZS51bmtub3duUmFuaykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgaWYgKHNoYXBlLmRpbSAhPSBudWxsKSB7XG4gICAgcmV0dXJuIHNoYXBlLmRpbS5tYXAoXG4gICAgICAgIGRpbSA9PlxuICAgICAgICAgICAgKHR5cGVvZiBkaW0uc2l6ZSA9PT0gJ251bWJlcicpID8gZGltLnNpemUgOiBwYXJzZUludChkaW0uc2l6ZSwgMTApKTtcbiAgfVxuICByZXR1cm4gW107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3JTaGFwZVBhcmFtKFxuICAgIGF0dHJzOiB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JQXR0clZhbHVlfSwgbmFtZTogc3RyaW5nLFxuICAgIGRlZj86IG51bWJlcltdKTogbnVtYmVyW118dW5kZWZpbmVkIHtcbiAgY29uc3QgcGFyYW0gPSBhdHRyc1tuYW1lXTtcbiAgaWYgKHBhcmFtICYmIHBhcmFtLnNoYXBlKSB7XG4gICAgcmV0dXJuIHBhcnNlVGVuc29yU2hhcGVQYXJhbShwYXJhbS5zaGFwZSk7XG4gIH1cbiAgcmV0dXJuIGRlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE51bWVyaWNBcnJheVBhcmFtKFxuICAgIGF0dHJzOiB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JQXR0clZhbHVlfSwgbmFtZTogc3RyaW5nLFxuICAgIGRlZjogbnVtYmVyW10pOiBudW1iZXJbXSB7XG4gIGNvbnN0IHBhcmFtID0gYXR0cnNbbmFtZV07XG4gIGlmIChwYXJhbSkge1xuICAgIHJldHVybiAoKHBhcmFtLmxpc3QuZiAmJiBwYXJhbS5saXN0LmYubGVuZ3RoID8gcGFyYW0ubGlzdC5mIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLmxpc3QuaSkgfHxcbiAgICAgICAgICAgIFtdKVxuICAgICAgICAubWFwKHYgPT4gKHR5cGVvZiB2ID09PSAnbnVtYmVyJykgPyB2IDogcGFyc2VJbnQodiwgMTApKTtcbiAgfVxuICByZXR1cm4gZGVmO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0U3RyaW5nQXJyYXlQYXJhbShcbiAgICBhdHRyczoge1trZXk6IHN0cmluZ106IHRlbnNvcmZsb3cuSUF0dHJWYWx1ZX0sIG5hbWU6IHN0cmluZywgZGVmOiBzdHJpbmdbXSxcbiAgICBrZWVwQ2FzZSA9IGZhbHNlKTogc3RyaW5nW10ge1xuICBjb25zdCBwYXJhbSA9IGF0dHJzW25hbWVdO1xuICBpZiAocGFyYW0gJiYgcGFyYW0ubGlzdCAmJiBwYXJhbS5saXN0LnMpIHtcbiAgICByZXR1cm4gcGFyYW0ubGlzdC5zLm1hcCgodikgPT4ge1xuICAgICAgcmV0dXJuIHBhcnNlU3RyaW5nUGFyYW0odiwga2VlcENhc2UpO1xuICAgIH0pO1xuICB9XG4gIHJldHVybiBkZWY7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZW5zb3JTaGFwZUFycmF5UGFyYW0oXG4gICAgYXR0cnM6IHtba2V5OiBzdHJpbmddOiB0ZW5zb3JmbG93LklBdHRyVmFsdWV9LCBuYW1lOiBzdHJpbmcsXG4gICAgZGVmOiBudW1iZXJbXVtdKTogbnVtYmVyW11bXSB7XG4gIGNvbnN0IHBhcmFtID0gYXR0cnNbbmFtZV07XG4gIGlmIChwYXJhbSAmJiBwYXJhbS5saXN0ICYmIHBhcmFtLmxpc3Quc2hhcGUpIHtcbiAgICByZXR1cm4gcGFyYW0ubGlzdC5zaGFwZS5tYXAoKHYpID0+IHtcbiAgICAgIHJldHVybiBwYXJzZVRlbnNvclNoYXBlUGFyYW0odik7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGRlZjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJvb2xBcnJheVBhcmFtKFxuICAgIGF0dHJzOiB7W2tleTogc3RyaW5nXTogdGVuc29yZmxvdy5JQXR0clZhbHVlfSwgbmFtZTogc3RyaW5nLFxuICAgIGRlZjogYm9vbGVhbltdKTogYm9vbGVhbltdIHtcbiAgY29uc3QgcGFyYW0gPSBhdHRyc1tuYW1lXTtcbiAgaWYgKHBhcmFtICYmIHBhcmFtLmxpc3QgJiYgcGFyYW0ubGlzdC5iKSB7XG4gICAgcmV0dXJuIHBhcmFtLmxpc3QuYjtcbiAgfVxuICByZXR1cm4gZGVmO1xufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getTensor } from '../executors/utils';\nimport { getBoolArrayParam, getBoolParam, getDtypeArrayParam, getDtypeParam, getNumberParam, getNumericArrayParam, getStringArrayParam, getStringParam, getTensorShapeArrayParam, getTensorShapeParam } from '../operation_mapper';\n/**\n * Helper class for lookup inputs and params for nodes in the model graph.\n */\nexport class NodeValueImpl {\n    constructor(node, tensorMap, context) {\n        this.node = node;\n        this.tensorMap = tensorMap;\n        this.context = context;\n        this.inputs = [];\n        this.attrs = {};\n        this.inputs = node.inputNames.map(name => this.getInput(name));\n        if (node.rawAttrs != null) {\n            this.attrs = Object.keys(node.rawAttrs)\n                .reduce((attrs, key) => {\n                attrs[key] = this.getAttr(key);\n                return attrs;\n            }, {});\n        }\n    }\n    /**\n     * Return the value of the attribute or input param.\n     * @param name String: name of attribute or input param.\n     */\n    getInput(name) {\n        return getTensor(name, this.tensorMap, this.context);\n    }\n    /**\n     * Return the value of the attribute or input param.\n     * @param name String: name of attribute or input param.\n     */\n    getAttr(name, defaultValue) {\n        const value = this.node.rawAttrs[name];\n        if (value.tensor != null) {\n            return getTensor(name, this.tensorMap, this.context);\n        }\n        if (value.i != null || value.f != null) {\n            return getNumberParam(this.node.rawAttrs, name, defaultValue);\n        }\n        if (value.s != null) {\n            return getStringParam(this.node.rawAttrs, name, defaultValue);\n        }\n        if (value.b != null) {\n            return getBoolParam(this.node.rawAttrs, name, defaultValue);\n        }\n        if (value.shape != null) {\n            return getTensorShapeParam(this.node.rawAttrs, name, defaultValue);\n        }\n        if (value.type != null) {\n            return getDtypeParam(this.node.rawAttrs, name, defaultValue);\n        }\n        if (value.list != null) {\n            if (value.list.i != null || value.list.f != null) {\n                return getNumericArrayParam(this.node.rawAttrs, name, defaultValue);\n            }\n            if (value.list.s != null) {\n                return getStringArrayParam(this.node.rawAttrs, name, defaultValue);\n            }\n            if (value.list.shape != null) {\n                return getTensorShapeArrayParam(this.node.rawAttrs, name, defaultValue);\n            }\n            if (value.list.b != null) {\n                return getBoolArrayParam(this.node.rawAttrs, name, defaultValue);\n            }\n            if (value.list.type != null) {\n                return getDtypeArrayParam(this.node.rawAttrs, name, defaultValue);\n            }\n        }\n        return defaultValue;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZV92YWx1ZV9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvY3VzdG9tX29wL25vZGVfdmFsdWVfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFNSCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDN0MsT0FBTyxFQUFDLGlCQUFpQixFQUFFLFlBQVksRUFBRSxrQkFBa0IsRUFBRSxhQUFhLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLG1CQUFtQixFQUFFLGNBQWMsRUFBRSx3QkFBd0IsRUFBRSxtQkFBbUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBR2pPOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUFHeEIsWUFDWSxJQUFVLEVBQVUsU0FBMEIsRUFDOUMsT0FBeUI7UUFEekIsU0FBSSxHQUFKLElBQUksQ0FBTTtRQUFVLGNBQVMsR0FBVCxTQUFTLENBQWlCO1FBQzlDLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBSnJCLFdBQU0sR0FBYSxFQUFFLENBQUM7UUFDdEIsVUFBSyxHQUErQixFQUFFLENBQUM7UUFJckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMvRCxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxFQUFFO1lBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO2lCQUNyQixNQUFNLENBQUMsQ0FBQyxLQUFpQyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNqRCxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFD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SSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFlBQTBCLENBQUMsQ0FBQzthQUMzRDtTQUNGO1FBRUQsT0FBTyxZQUFZLENBQUM7SUFDdEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtnZXRUZW5zb3J9IGZyb20gJy4uL2V4ZWN1dG9ycy91dGlscyc7XG5pbXBvcnQge2dldEJvb2xBcnJheVBhcmFtLCBnZXRCb29sUGFyYW0sIGdldER0eXBlQXJyYXlQYXJhbSwgZ2V0RHR5cGVQYXJhbSwgZ2V0TnVtYmVyUGFyYW0sIGdldE51bWVyaWNBcnJheVBhcmFtLCBnZXRTdHJpbmdBcnJheVBhcmFtLCBnZXRTdHJpbmdQYXJhbSwgZ2V0VGVuc29yU2hhcGVBcnJheVBhcmFtLCBnZXRUZW5zb3JTaGFwZVBhcmFtfSBmcm9tICcuLi9vcGVyYXRpb25fbWFwcGVyJztcbmltcG9ydCB7R3JhcGhOb2RlLCBOb2RlLCBWYWx1ZVR5cGV9IGZyb20gJy4uL3R5cGVzJztcblxuLyoqXG4gKiBIZWxwZXIgY2xhc3MgZm9yIGxvb2t1cCBpbnB1dHMgYW5kIHBhcmFtcyBmb3Igbm9kZXMgaW4gdGhlIG1vZGVsIGdyYXBoLlxuICovXG5leHBvcnQgY2xhc3MgTm9kZVZhbHVlSW1wbCBpbXBsZW1lbnRzIEdyYXBoTm9kZSB7XG4gIHB1YmxpYyByZWFkb25seSBpbnB1dHM6IFRlbnNvcltdID0gW107XG4gIHB1YmxpYyByZWFkb25seSBhdHRyczoge1trZXk6IHN0cmluZ106IFZhbHVlVHlwZX0gPSB7fTtcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIG5vZGU6IE5vZGUsIHByaXZhdGUgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgICBwcml2YXRlIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgICB0aGlzLmlucHV0cyA9IG5vZGUuaW5wdXROYW1lcy5tYXAobmFtZSA9PiB0aGlzLmdldElucHV0KG5hbWUpKTtcbiAgICBpZiAobm9kZS5yYXdBdHRycyAhPSBudWxsKSB7XG4gICAgICB0aGlzLmF0dHJzID0gT2JqZWN0LmtleXMobm9kZS5yYXdBdHRycylcbiAgICAgICAgICAgICAgICAgICAgICAgLnJlZHVjZSgoYXR0cnM6IHtba2V5OiBzdHJpbmddOiBWYWx1ZVR5cGV9LCBrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyc1trZXldID0gdGhpcy5nZXRBdHRyKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF0dHJzO1xuICAgICAgICAgICAgICAgICAgICAgICB9LCB7fSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBvciBpbnB1dCBwYXJhbS5cbiAgICogQHBhcmFtIG5hbWUgU3RyaW5nOiBuYW1lIG9mIGF0dHJpYnV0ZSBvciBpbnB1dCBwYXJhbS5cbiAgICovXG4gIHByaXZhdGUgZ2V0SW5wdXQobmFtZTogc3RyaW5nKTogVGVuc29yIHtcbiAgICByZXR1cm4gZ2V0VGVuc29yKG5hbWUsIHRoaXMudGVuc29yTWFwLCB0aGlzLmNvbnRleHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBvciBpbnB1dCBwYXJhbS5cbiAgICogQHBhcmFtIG5hbWUgU3RyaW5nOiBuYW1lIG9mIGF0dHJpYnV0ZSBvciBpbnB1dCBwYXJhbS5cbiAgICovXG4gIHByaXZhdGUgZ2V0QXR0cihuYW1lOiBzdHJpbmcsIGRlZmF1bHRWYWx1ZT86IFZhbHVlVHlwZSk6IFZhbHVlVHlwZSB7XG4gICAgY29uc3QgdmFsdWUgPSB0aGlzLm5vZGUucmF3QXR0cnNbbmFtZV07XG4gICAgaWYgKHZhbHVlLnRlbnNvciAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0VGVuc29yKG5hbWUsIHRoaXMudGVuc29yTWFwLCB0aGlzLmNvbnRleHQpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuaSAhPSBudWxsIHx8IHZhbHVlLmYgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGdldE51bWJlclBhcmFtKHRoaXMubm9kZS5yYXdBdHRycywgbmFtZSwgZGVmYXVsdFZhbHVlIGFzIG51bWJlcik7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5zICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBnZXRTdHJpbmdQYXJhbSh0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBzdHJpbmcpO1xuICAgIH1cbiAgICBpZiAodmFsdWUuYiAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0Qm9vbFBhcmFtKHRoaXMubm9kZS5yYXdBdHRycywgbmFtZSwgZGVmYXVsdFZhbHVlIGFzIGJvb2xlYW4pO1xuICAgIH1cbiAgICBpZiAodmFsdWUuc2hhcGUgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGdldFRlbnNvclNoYXBlUGFyYW0oXG4gICAgICAgICAgdGhpcy5ub2RlLnJhd0F0dHJzLCBuYW1lLCBkZWZhdWx0VmFsdWUgYXMgbnVtYmVyW10pO1xuICAgIH1cbiAgICBpZiAodmFsdWUudHlwZSAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gZ2V0RHR5cGVQYXJhbSh0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBEYXRhVHlwZSk7XG4gICAgfVxuICAgIGlmICh2YWx1ZS5saXN0ICE9IG51bGwpIHtcbiAgICAgIGlmICh2YWx1ZS5saXN0LmkgIT0gbnVsbCB8fCB2YWx1ZS5saXN0LmYgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZ2V0TnVtZXJpY0FycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBudW1iZXJbXSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUubGlzdC5zICE9IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGdldFN0cmluZ0FycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBzdHJpbmdbXSk7XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUubGlzdC5zaGFwZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXRUZW5zb3JTaGFwZUFycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBudW1iZXJbXVtdKTtcbiAgICAgIH1cbiAgICAgIGlmICh2YWx1ZS5saXN0LmIgIT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gZ2V0Qm9vbEFycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBib29sZWFuW10pO1xuICAgICAgfVxuICAgICAgaWYgKHZhbHVlLmxpc3QudHlwZSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBnZXREdHlwZUFycmF5UGFyYW0oXG4gICAgICAgICAgICB0aGlzLm5vZGUucmF3QXR0cnMsIG5hbWUsIGRlZmF1bHRWYWx1ZSBhcyBEYXRhVHlwZVtdKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * This file exports ops used by the converters executors. By default it\n * re-exports all ops. In a custom build this is aliased to a file that will\n * only exports ops for a given model.json.\n */\nexport * from './ops';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzX2Zvcl9jb252ZXJ0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvcmUvc3JjL29wcy9vcHNfZm9yX2NvbnZlcnRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSDs7OztHQUlHO0FBQ0gsY0FBYyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qKlxuICogVGhpcyBmaWxlIGV4cG9ydHMgb3BzIHVzZWQgYnkgdGhlIGNvbnZlcnRlcnMgZXhlY3V0b3JzLiBCeSBkZWZhdWx0IGl0XG4gKiByZS1leHBvcnRzIGFsbCBvcHMuIEluIGEgY3VzdG9tIGJ1aWxkIHRoaXMgaXMgYWxpYXNlZCB0byBhIGZpbGUgdGhhdCB3aWxsXG4gKiBvbmx5IGV4cG9ydHMgb3BzIGZvciBhIGdpdmVuIG1vZGVsLmpzb24uXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vb3BzJztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'BiasAdd':\n        case 'AddV2':\n        case 'Add': {\n            return [ops.add(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'AddN': {\n            return [ops.addN(getParamValue('tensors', node, tensorMap, context))];\n        }\n        case 'FloorMod':\n        case 'Mod':\n            return [ops.mod(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        case 'Mul':\n            return [ops.mul(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        case 'RealDiv':\n        case 'Div': {\n            return [ops.div(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'DivNoNan': {\n            return [ops.divNoNan(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'FloorDiv': {\n            return [ops.floorDiv(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'Sub': {\n            return [ops.sub(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'Minimum': {\n            return [ops.minimum(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'Maximum': {\n            return [ops.maximum(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'Pow': {\n            return [ops.pow(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'SquaredDifference': {\n            return [ops.squaredDifference(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'arithmetic';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJpdGhtZXRpY19leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9hcml0aG1ldGljX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUN0QyxPQUF5QixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQVksRUFBRTtJQUNuRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixLQUFLLFNBQVMsQ0FBQztRQUNmLEtBQUssT0FBTyxDQUFDO1FBQ2IsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUNWLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUNWLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksRUFDeEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssTUFBTSxDQUFDLENBQUM7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDWixhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFjLENBQUMsQ0FBQyxDQUFDO1NBQ3ZFO1FBQ0QsS0FBSyxVQUFVLENBQUM7UUFDaEIsS0FBSyxLQUFLO1lBQ1IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1gsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FB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SUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnQmlhc0FkZCc6XG4gICAgICAgIGNhc2UgJ0FkZFYyJzpcbiAgICAgICAgY2FzZSAnQWRkJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmFkZChcbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciksXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0FkZE4nOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYWRkTigoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcnMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcltdKSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0Zsb29yTW9kJzpcbiAgICAgICAgY2FzZSAnTW9kJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5tb2QoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ011bCc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMubXVsKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdSZWFsRGl2JzpcbiAgICAgICAgY2FzZSAnRGl2Jzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmRpdihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdEaXZOb05hbic6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5kaXZOb05hbihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdGbG9vckRpdic6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5mbG9vckRpdihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTdWInOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc3ViKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ01pbmltdW0nOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMubWluaW11bShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNYXhpbXVtJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLm1heGltdW0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUG93Jzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnBvdyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTcXVhcmVkRGlmZmVyZW5jZSc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5zcXVhcmVkRGlmZmVyZW5jZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2FyaXRobWV0aWMnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue, getTensor } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'Abs':\n        case 'ComplexAbs':\n            return [ops.abs(getParamValue('x', node, tensorMap, context))];\n        case 'Acos':\n            return [ops.acos(getParamValue('x', node, tensorMap, context))];\n        case 'Acosh':\n            return [ops.acosh(getParamValue('x', node, tensorMap, context))];\n        case 'Asin':\n            return [ops.asin(getParamValue('x', node, tensorMap, context))];\n        case 'Asinh':\n            return [ops.asinh(getParamValue('x', node, tensorMap, context))];\n        case 'Atan':\n            return [ops.atan(getParamValue('x', node, tensorMap, context))];\n        case 'Atan2':\n            return [ops.atan2(getParamValue('x', node, tensorMap, context), getParamValue('y', node, tensorMap, context))];\n        case 'Atanh':\n            return [ops.atanh(getParamValue('x', node, tensorMap, context))];\n        case 'Ceil':\n            return [ops.ceil(getParamValue('x', node, tensorMap, context))];\n        case 'Complex':\n            return [ops.complex(getParamValue('real', node, tensorMap, context), getParamValue('imag', node, tensorMap, context))];\n        case 'Cos':\n            return [ops.cos(getParamValue('x', node, tensorMap, context))];\n        case 'Cosh':\n            return [ops.cosh(getParamValue('x', node, tensorMap, context))];\n        case 'Elu':\n            return [ops.elu(getParamValue('x', node, tensorMap, context))];\n        case 'Erf':\n            return [ops.erf(getParamValue('x', node, tensorMap, context))];\n        case 'Exp':\n            return [ops.exp(getParamValue('x', node, tensorMap, context))];\n        case 'Expm1': {\n            return [ops.expm1(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Floor':\n            return [ops.floor(getParamValue('x', node, tensorMap, context))];\n        case 'Log':\n            return [ops.log(getParamValue('x', node, tensorMap, context))];\n        case 'Log1p': {\n            return [ops.log1p(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Imag':\n            return [ops.imag(getParamValue('x', node, tensorMap, context))];\n        case 'Neg':\n            return [ops.neg(getParamValue('x', node, tensorMap, context))];\n        case 'Reciprocal': {\n            return [ops.reciprocal(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Real':\n            return [ops.real(getParamValue('x', node, tensorMap, context))];\n        case 'Relu':\n            return [ops.relu(getParamValue('x', node, tensorMap, context))];\n        case 'Round': {\n            return [ops.round(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Selu':\n            return [ops.selu(getParamValue('x', node, tensorMap, context))];\n        case 'Sigmoid':\n            return [ops.sigmoid(getParamValue('x', node, tensorMap, context))];\n        case 'Sin':\n            return [ops.sin(getParamValue('x', node, tensorMap, context))];\n        case 'Sign': {\n            return [ops.sign(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Sinh': {\n            return [ops.sinh(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Softplus': {\n            return [ops.softplus(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Sqrt': {\n            return [ops.sqrt(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Square': {\n            return [ops.square(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Tanh': {\n            return [ops.tanh(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'Tan':\n            return [ops.tan(getParamValue('x', node, tensorMap, context))];\n        case 'ClipByValue':\n            return [ops.clipByValue(getParamValue('x', node, tensorMap, context), getParamValue('clipValueMin', node, tensorMap, context), getParamValue('clipValueMax', node, tensorMap, context))];\n        case 'Relu6':\n            return [ops.relu6(getParamValue('x', node, tensorMap, context))];\n        case 'Rsqrt':\n            return [ops.rsqrt(getTensor(node.inputNames[0], tensorMap, context))];\n        case 'Prod':\n            return [ops.prod(getParamValue('x', node, tensorMap, context), getParamValue('axes', node, tensorMap, context))];\n        case 'LeakyRelu':\n            return [ops.leakyRelu(getParamValue('x', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context))];\n        case 'Prelu':\n            return [ops.prelu(getParamValue('x', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context))];\n        case 'IsNan':\n            return [ops.isNaN(getTensor(node.inputNames[0], tensorMap, context))];\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'basic_math';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzaWNfbWF0aF9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9iYXNpY19tYXRoX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUUsU0FBUyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRWpELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxLQUFLLENBQUM7UUFDWCxLQUFLLFlBQVk7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDWCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1FBQy9ELEtBQUssTUFBTTtZQUNULE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNaLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7UUFDL0QsS0FBSyxPQUFPO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2IsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztRQUMvRCxLQUFLLE1BQU07WUFDVCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDWixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFX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RSxPQUFPLENBQWEsQ0FBQyxDQUFDLENBQUM7UUFDcEUsS0FBSyxXQUFXO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ2pCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztRQUNuRSxLQUFLLE9BQU87WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDYixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxPQUFPO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2IsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWUsIGdldFRlbnNvcn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBvcHMgPSB0Zk9wcyk6IFRlbnNvcltdID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICBjYXNlICdBYnMnOlxuICAgICAgICBjYXNlICdDb21wbGV4QWJzJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5hYnMoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdBY29zJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5hY29zKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnQWNvc2gnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmFjb3NoKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnQXNpbic6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYXNpbihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0FzaW5oJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5hc2luaChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0F0YW4nOlxuICAgICAgICAgIHJldHVybiBbb3BzLmF0YW4oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdBdGFuMic6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYXRhbjIoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0F0YW5oJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5hdGFuaChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0NlaWwnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmNlaWwoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdDb21wbGV4JzpcbiAgICAgICAgICByZXR1cm4gW29wcy5jb21wbGV4KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdyZWFsJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ltYWcnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdDb3MnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmNvcyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0Nvc2gnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmNvc2goXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdFbHUnOlxuICAgICAgICAgIHJldHVybiBbb3BzLmVsdShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0VyZic6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuZXJmKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnRXhwJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5leHAoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdFeHBtMSc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5leHBtMShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnRmxvb3InOlxuICAgICAgICAgIHJldHVybiBbb3BzLmZsb29yKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnTG9nJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5sb2coXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdMb2cxcCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5sb2cxcChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW1hZyc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuaW1hZyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG5cbiAgICAgICAgY2FzZSAnTmVnJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5uZWcoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdSZWNpcHJvY2FsJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnJlY2lwcm9jYWwoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JlYWwnOlxuICAgICAgICAgIHJldHVybiBbb3BzLnJlYWwoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdSZWx1JzpcbiAgICAgICAgICByZXR1cm4gW29wcy5yZWx1KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnUm91bmQnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucm91bmQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NlbHUnOlxuICAgICAgICAgIHJldHVybiBbb3BzLnNlbHUoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdTaWdtb2lkJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5zaWdtb2lkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnU2luJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5zaW4oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICBjYXNlICdTaWduJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnNpZ24oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NpbmgnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc2luaChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU29mdHBsdXMnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc29mdHBsdXMoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NxcnQnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc3FydChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3F1YXJlJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnNxdWFyZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnVGFuaCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy50YW5oKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdUYW4nOlxuICAgICAgICAgIHJldHVybiBbb3BzLnRhbihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ0NsaXBCeVZhbHVlJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5jbGlwQnlWYWx1ZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdjbGlwVmFsdWVNaW4nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY2xpcFZhbHVlTWF4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgbnVtYmVyKV07XG4gICAgICAgIGNhc2UgJ1JlbHU2JzpcbiAgICAgICAgICByZXR1cm4gW29wcy5yZWx1NihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIGNhc2UgJ1JzcXJ0JzpcbiAgICAgICAgICByZXR1cm4gW29wcy5yc3FydChcbiAgICAgICAgICAgICAgZ2V0VGVuc29yKG5vZGUuaW5wdXROYW1lc1swXSwgdGVuc29yTWFwLCBjb250ZXh0KSldO1xuICAgICAgICBjYXNlICdQcm9kJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5wcm9kKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4ZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdKV07XG4gICAgICAgIGNhc2UgJ0xlYWt5UmVsdSc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMubGVha3lSZWx1KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2FscGhhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXIpXTtcbiAgICAgICAgY2FzZSAnUHJlbHUnOlxuICAgICAgICAgIHJldHVybiBbb3BzLnByZWx1KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2FscGhhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgY2FzZSAnSXNOYW4nOlxuICAgICAgICAgIHJldHVybiBbb3BzLmlzTmFOKFxuICAgICAgICAgICAgICBnZXRUZW5zb3Iobm9kZS5pbnB1dE5hbWVzWzBdLCB0ZW5zb3JNYXAsIGNvbnRleHQpKV07XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAnYmFzaWNfbWF0aCc7XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/**\n * This differs from util.assertShapesMatch in that it allows values of\n * negative one, an undefined size of a dimensinon, in a shape to match\n * anything.\n */\nimport { util } from '@tensorflow/tfjs-core';\n/**\n * Used by TensorList and TensorArray to verify if elementShape matches, support\n * negative value as the dim shape.\n * @param shapeA\n * @param shapeB\n * @param errorMessagePrefix\n */\nexport function assertShapesMatchAllowUndefinedSize(shapeA, shapeB, errorMessagePrefix = '') {\n    // constant shape means unknown rank\n    if (typeof shapeA === 'number' || typeof shapeB === 'number') {\n        return;\n    }\n    util.assert(shapeA.length === shapeB.length, () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`);\n    for (let i = 0; i < shapeA.length; i++) {\n        const dim0 = shapeA[i];\n        const dim1 = shapeB[i];\n        util.assert(dim0 < 0 || dim1 < 0 || dim0 === dim1, () => errorMessagePrefix + ` Shapes ${shapeA} and ${shapeB} must match`);\n    }\n}\nexport function fullDefinedShape(elementShape) {\n    if (typeof elementShape === 'number' || elementShape.some(dim => dim < 0)) {\n        return false;\n    }\n    return true;\n}\n/**\n * Generate the output element shape from the list elementShape, list tensors\n * and input param.\n * @param listElementShape\n * @param tensors\n * @param elementShape\n */\nexport function inferElementShape(listElementShape, tensors, elementShape) {\n    let partialShape = mergeElementShape(listElementShape, elementShape);\n    const notfullDefinedShape = !fullDefinedShape(partialShape);\n    if (notfullDefinedShape && tensors.length === 0) {\n        throw new Error(`Tried to calculate elements of an empty list` +\n            ` with non-fully-defined elementShape: ${partialShape}`);\n    }\n    if (notfullDefinedShape) {\n        tensors.forEach(tensor => {\n            partialShape = mergeElementShape(tensor.shape, partialShape);\n        });\n    }\n    if (!fullDefinedShape(partialShape)) {\n        throw new Error(`Non-fully-defined elementShape: ${partialShape}`);\n    }\n    return partialShape;\n}\nexport function mergeElementShape(elementShapeA, elementShapeB) {\n    if (typeof elementShapeA === 'number') {\n        return elementShapeB;\n    }\n    if (typeof elementShapeB === 'number') {\n        return elementShapeA;\n    }\n    if (elementShapeA.length !== elementShapeB.length) {\n        throw new Error(`Incompatible ranks during merge: ${elementShapeA} vs. ${elementShapeB}`);\n    }\n    const result = [];\n    for (let i = 0; i < elementShapeA.length; ++i) {\n        const dim0 = elementShapeA[i];\n        const dim1 = elementShapeB[i];\n        if (dim0 >= 0 && dim1 >= 0 && dim0 !== dim1) {\n            throw new Error(`Incompatible shape during merge: ${elementShapeA} vs. ${elementShapeB}`);\n        }\n        result[i] = dim0 >= 0 ? dim0 : dim1;\n    }\n    return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX3V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL2V4ZWN1dG9yL3RlbnNvcl91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSDs7OztHQUlHO0FBRUgsT0FBTyxFQUFTLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRW5EOzs7Ozs7R0FNRztBQUNILE1BQU0sVUFBVSxtQ0FBbUMsQ0FDL0MsTUFBdUIsRUFBRSxNQUF1QixFQUNoRCxrQkFBa0IsR0FBRyxFQUFFO0lBQ3pCLG9DQUFvQztJQUNwQyxJQUFJLE9BQU8sTUFBTSxLQUFLLFFBQVEsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7UUFDNUQsT0FBTztLQUNSO0lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxNQUFNLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxNQUFNLEVBQy9CLEdBQUcsRUFBRSxDQUFDLGtCQUFrQixHQUFHLFdBQVcsTUFBTSxRQUFRLE1BQU0sYUFBYSxDQUFDLENBQUM7SUFDN0UsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3ZCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUNQLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUNyQyxHQUFHLEVBQUUsQ0FDRCxrQkFBa0IsR0FBRyxXQUFXLE1BQU0sUUFBUSxNQUFNLGFBQWEsQ0FBQyxDQUFDO0tBQzVFO0FBQ0gsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxZQUE2QjtJQUM1RCxJQUFJLE9BQU8sWUFBWSxLQUFLLFFBQVEsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxFQUFFO1FBQ3pFLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUM7QUFDRDs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLGdCQUFpQyxFQUFFLE9BQWlCLEVBQ3BELFlBQTZCO0lBQy9CLElBQUksWUFBWSxHQUFHLGlCQUFpQixDQUFDLGdCQUFnQixFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUM1RCxJQUFJLG1CQUFtQixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQy9DLE1BQU0sSUFBSSxLQUFLLENBQ1gsOENBQThDO1lBQzlDLHlDQUF5QyxZQUFZLEVBQUUsQ0FBQyxDQUFDO0tBQzlEO0lBQ0QsSUFBSSxtQkFBbUIsRUFBRTtRQUN2QixPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3ZCLFlBQVksR0FBRyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0tBQ0o7SUFDRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsWUFBWSxFQUFFLENBQUMsQ0FBQztLQUNwRTtJQUNELE9BQU8sWUFBd0IsQ0FBQztBQUNsQyxDQUFDO0FBRUQsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixhQUE4QixFQUFFLGFBQThCO0lBRWhFLElBQUksT0FBTyxhQUFhLEtBQUssUUFBUSxFQUFFO1FBQ3JDLE9BQU8sYUFBYSxDQUFDO0tBQ3RCO0lBQ0QsSUFBSSxPQUFPLGFBQWEsS0FBSyxRQUFRLEVBQUU7UUFDckMsT0FBTyxhQUFhLENBQUM7S0FDdEI7SUFFRCxJQUFJLGFBQWEsQ0FBQyxNQUFNLEtBQUssYUFBYSxDQUFDLE1BQU0sRUFBRTtRQUNqRCxNQUFNLElBQUksS0FBSyxDQUFDLG9DQUFvQyxhQUFhLFFBQzdELGFBQWEsRUFBRSxDQUFDLENBQUM7S0FDdEI7SUFFRCxNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDN0MsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixJQUFJLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLEtBQUssSUFBSSxFQUFFO1lBQzNDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLGFBQWEsUUFDN0QsYUFBYSxFQUFFLENBQUMsQ0FBQztTQUN0QjtRQUNELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztLQUNyQztJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJcbi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbi8qKlxuICogVGhpcyBkaWZmZXJzIGZyb20gdXRpbC5hc3NlcnRTaGFwZXNNYXRjaCBpbiB0aGF0IGl0IGFsbG93cyB2YWx1ZXMgb2ZcbiAqIG5lZ2F0aXZlIG9uZSwgYW4gdW5kZWZpbmVkIHNpemUgb2YgYSBkaW1lbnNpbm9uLCBpbiBhIHNoYXBlIHRvIG1hdGNoXG4gKiBhbnl0aGluZy5cbiAqL1xuXG5pbXBvcnQge1RlbnNvciwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuLyoqXG4gKiBVc2VkIGJ5IFRlbnNvckxpc3QgYW5kIFRlbnNvckFycmF5IHRvIHZlcmlmeSBpZiBlbGVtZW50U2hhcGUgbWF0Y2hlcywgc3VwcG9ydFxuICogbmVnYXRpdmUgdmFsdWUgYXMgdGhlIGRpbSBzaGFwZS5cbiAqIEBwYXJhbSBzaGFwZUFcbiAqIEBwYXJhbSBzaGFwZUJcbiAqIEBwYXJhbSBlcnJvck1lc3NhZ2VQcmVmaXhcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplKFxuICAgIHNoYXBlQTogbnVtYmVyfG51bWJlcltdLCBzaGFwZUI6IG51bWJlcnxudW1iZXJbXSxcbiAgICBlcnJvck1lc3NhZ2VQcmVmaXggPSAnJyk6IHZvaWQge1xuICAvLyBjb25zdGFudCBzaGFwZSBtZWFucyB1bmtub3duIHJhbmtcbiAgaWYgKHR5cGVvZiBzaGFwZUEgPT09ICdudW1iZXInIHx8IHR5cGVvZiBzaGFwZUIgPT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgc2hhcGVBLmxlbmd0aCA9PT0gc2hhcGVCLmxlbmd0aCxcbiAgICAgICgpID0+IGVycm9yTWVzc2FnZVByZWZpeCArIGAgU2hhcGVzICR7c2hhcGVBfSBhbmQgJHtzaGFwZUJ9IG11c3QgbWF0Y2hgKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZUEubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkaW0wID0gc2hhcGVBW2ldO1xuICAgIGNvbnN0IGRpbTEgPSBzaGFwZUJbaV07XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGRpbTAgPCAwIHx8IGRpbTEgPCAwIHx8IGRpbTAgPT09IGRpbTEsXG4gICAgICAgICgpID0+XG4gICAgICAgICAgICBlcnJvck1lc3NhZ2VQcmVmaXggKyBgIFNoYXBlcyAke3NoYXBlQX0gYW5kICR7c2hhcGVCfSBtdXN0IG1hdGNoYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZ1bGxEZWZpbmVkU2hhcGUoZWxlbWVudFNoYXBlOiBudW1iZXJ8bnVtYmVyW10pOiBib29sZWFuIHtcbiAgaWYgKHR5cGVvZiBlbGVtZW50U2hhcGUgPT09ICdudW1iZXInIHx8IGVsZW1lbnRTaGFwZS5zb21lKGRpbSA9PiBkaW0gPCAwKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cbi8qKlxuICogR2VuZXJhdGUgdGhlIG91dHB1dCBlbGVtZW50IHNoYXBlIGZyb20gdGhlIGxpc3QgZWxlbWVudFNoYXBlLCBsaXN0IHRlbnNvcnNcbiAqIGFuZCBpbnB1dCBwYXJhbS5cbiAqIEBwYXJhbSBsaXN0RWxlbWVudFNoYXBlXG4gKiBAcGFyYW0gdGVuc29yc1xuICogQHBhcmFtIGVsZW1lbnRTaGFwZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaW5mZXJFbGVtZW50U2hhcGUoXG4gICAgbGlzdEVsZW1lbnRTaGFwZTogbnVtYmVyfG51bWJlcltdLCB0ZW5zb3JzOiBUZW5zb3JbXSxcbiAgICBlbGVtZW50U2hhcGU6IG51bWJlcnxudW1iZXJbXSk6IG51bWJlcltdIHtcbiAgbGV0IHBhcnRpYWxTaGFwZSA9IG1lcmdlRWxlbWVudFNoYXBlKGxpc3RFbGVtZW50U2hhcGUsIGVsZW1lbnRTaGFwZSk7XG4gIGNvbnN0IG5vdGZ1bGxEZWZpbmVkU2hhcGUgPSAhZnVsbERlZmluZWRTaGFwZShwYXJ0aWFsU2hhcGUpO1xuICBpZiAobm90ZnVsbERlZmluZWRTaGFwZSAmJiB0ZW5zb3JzLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFRyaWVkIHRvIGNhbGN1bGF0ZSBlbGVtZW50cyBvZiBhbiBlbXB0eSBsaXN0YCArXG4gICAgICAgIGAgd2l0aCBub24tZnVsbHktZGVmaW5lZCBlbGVtZW50U2hhcGU6ICR7cGFydGlhbFNoYXBlfWApO1xuICB9XG4gIGlmIChub3RmdWxsRGVmaW5lZFNoYXBlKSB7XG4gICAgdGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICBwYXJ0aWFsU2hhcGUgPSBtZXJnZUVsZW1lbnRTaGFwZSh0ZW5zb3Iuc2hhcGUsIHBhcnRpYWxTaGFwZSk7XG4gICAgfSk7XG4gIH1cbiAgaWYgKCFmdWxsRGVmaW5lZFNoYXBlKHBhcnRpYWxTaGFwZSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYE5vbi1mdWxseS1kZWZpbmVkIGVsZW1lbnRTaGFwZTogJHtwYXJ0aWFsU2hhcGV9YCk7XG4gIH1cbiAgcmV0dXJuIHBhcnRpYWxTaGFwZSBhcyBudW1iZXJbXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1lcmdlRWxlbWVudFNoYXBlKFxuICAgIGVsZW1lbnRTaGFwZUE6IG51bWJlcnxudW1iZXJbXSwgZWxlbWVudFNoYXBlQjogbnVtYmVyfG51bWJlcltdKTogbnVtYmVyfFxuICAgIG51bWJlcltdIHtcbiAgaWYgKHR5cGVvZiBlbGVtZW50U2hhcGVBID09PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBlbGVtZW50U2hhcGVCO1xuICB9XG4gIGlmICh0eXBlb2YgZWxlbWVudFNoYXBlQiA9PT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZWxlbWVudFNoYXBlQTtcbiAgfVxuXG4gIGlmIChlbGVtZW50U2hhcGVBLmxlbmd0aCAhPT0gZWxlbWVudFNoYXBlQi5sZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluY29tcGF0aWJsZSByYW5rcyBkdXJpbmcgbWVyZ2U6ICR7ZWxlbWVudFNoYXBlQX0gdnMuICR7XG4gICAgICAgIGVsZW1lbnRTaGFwZUJ9YCk7XG4gIH1cblxuICBjb25zdCByZXN1bHQ6IG51bWJlcltdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudFNoYXBlQS5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IGRpbTAgPSBlbGVtZW50U2hhcGVBW2ldO1xuICAgIGNvbnN0IGRpbTEgPSBlbGVtZW50U2hhcGVCW2ldO1xuICAgIGlmIChkaW0wID49IDAgJiYgZGltMSA+PSAwICYmIGRpbTAgIT09IGRpbTEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW5jb21wYXRpYmxlIHNoYXBlIGR1cmluZyBtZXJnZTogJHtlbGVtZW50U2hhcGVBfSB2cy4gJHtcbiAgICAgICAgICBlbGVtZW50U2hhcGVCfWApO1xuICAgIH1cbiAgICByZXN1bHRbaV0gPSBkaW0wID49IDAgPyBkaW0wIDogZGltMTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { concat, keep, reshape, scalar, slice, stack, tensor, tidy, unstack } from '@tensorflow/tfjs-core';\nimport { assertShapesMatchAllowUndefinedSize } from './tensor_utils';\n/**\n * The TensorArray object keeps an array of Tensors.  It\n * allows reading from the array and writing to the array.\n */\nexport class TensorArray {\n    constructor(name, dtype, maxSize, elementShape, identicalElementShapes, dynamicSize, clearAfterRead) {\n        this.name = name;\n        this.dtype = dtype;\n        this.maxSize = maxSize;\n        this.elementShape = elementShape;\n        this.identicalElementShapes = identicalElementShapes;\n        this.dynamicSize = dynamicSize;\n        this.clearAfterRead = clearAfterRead;\n        this.tensors = [];\n        this.closed_ = false;\n        this.idTensor = scalar(0);\n        keep(this.idTensor);\n    }\n    get id() {\n        return this.idTensor.id;\n    }\n    get closed() {\n        return this.closed_;\n    }\n    /**\n     * Dispose the tensors and idTensor and mark the TensoryArray as closed.\n     */\n    clearAndClose(keepIds) {\n        this.tensors.forEach(tensor => {\n            if (keepIds == null || !keepIds.has(tensor.tensor.id)) {\n                tensor.tensor.dispose();\n            }\n        });\n        this.tensors = [];\n        this.closed_ = true;\n        this.idTensor.dispose();\n    }\n    size() {\n        return this.tensors.length;\n    }\n    /**\n     * Read the value at location index in the TensorArray.\n     * @param index Number the index to read from.\n     */\n    read(index) {\n        if (this.closed_) {\n            throw new Error(`TensorArray ${this.name} has already been closed.`);\n        }\n        if (index < 0 || index >= this.size()) {\n            throw new Error(`Tried to read from index ${index}, but array size is: ${this.size()}`);\n        }\n        const tensorWithState = this.tensors[index];\n        if (tensorWithState.cleared) {\n            throw new Error(`TensorArray ${this.name}: Could not read index ${index} twice because it was cleared after a previous read ` +\n                `(perhaps try setting clear_after_read = false?).`);\n        }\n        if (this.clearAfterRead) {\n            tensorWithState.cleared = true;\n        }\n        tensorWithState.read = true;\n        return tensorWithState.tensor;\n    }\n    /**\n     * Helper method to read multiple tensors from the specified indices.\n     */\n    readMany(indices) {\n        return indices.map(index => this.read(index));\n    }\n    /**\n     * Write value into the index of the TensorArray.\n     * @param index number the index to write to.\n     * @param tensor\n     */\n    write(index, tensor) {\n        if (this.closed_) {\n            throw new Error(`TensorArray ${this.name} has already been closed.`);\n        }\n        if (index < 0 || !this.dynamicSize && index >= this.maxSize) {\n            throw new Error(`Tried to write to index ${index}, but array is not resizeable and size is: ${this.maxSize}`);\n        }\n        const t = this.tensors[index] || {};\n        if (tensor.dtype !== this.dtype) {\n            throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index},\n          because the value dtype is ${tensor.dtype}, but TensorArray dtype is ${this.dtype}.`);\n        }\n        // Set the shape for the first time write to unknow shape tensor array\n        if (this.size() === 0 &&\n            (this.elementShape == null || this.elementShape.length === 0)) {\n            this.elementShape = tensor.shape;\n        }\n        assertShapesMatchAllowUndefinedSize(this.elementShape, tensor.shape, `TensorArray ${this.name}: Could not write to TensorArray index ${index}.`);\n        if (t.read) {\n            throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index}, because it has already been read.`);\n        }\n        if (t.written) {\n            throw new Error(`TensorArray ${this.name}: Could not write to TensorArray index ${index}, because it has already been written.`);\n        }\n        t.tensor = tensor;\n        keep(tensor);\n        t.written = true;\n        this.tensors[index] = t;\n    }\n    /**\n     * Helper method to write multiple tensors to the specified indices.\n     */\n    writeMany(indices, tensors) {\n        if (indices.length !== tensors.length) {\n            throw new Error(`TensorArray ${this.name}: could not write multiple tensors,` +\n                `because the index size: ${indices.length} is not the same as tensors size: ${tensors.length}.`);\n        }\n        indices.forEach((i, index) => this.write(i, tensors[index]));\n    }\n    /**\n     * Return selected values in the TensorArray as a packed Tensor. All of\n     * selected values must have been written and their shapes must all match.\n     * @param [indices] number[] Optional. Taking values in [0, max_value). If the\n     *    TensorArray is not dynamic, max_value=size(). If not specified returns\n     *    all tensors in the original order.\n     * @param [dtype]\n     */\n    gather(indices, dtype) {\n        if (!!dtype && dtype !== this.dtype) {\n            throw new Error(`TensorArray dtype is ${this.dtype} but gather requested dtype ${dtype}`);\n        }\n        if (!indices) {\n            indices = [];\n            for (let i = 0; i < this.size(); i++) {\n                indices.push(i);\n            }\n        }\n        else {\n            indices = indices.slice(0, this.size());\n        }\n        if (indices.length === 0) {\n            return tensor([], [0].concat(this.elementShape));\n        }\n        // Read all the PersistentTensors into a vector to keep track of\n        // their memory.\n        const tensors = this.readMany(indices);\n        assertShapesMatchAllowUndefinedSize(this.elementShape, tensors[0].shape, 'TensorArray shape mismatch: ');\n        return stack(tensors, 0);\n    }\n    /**\n     * Return the values in the TensorArray as a concatenated Tensor.\n     */\n    concat(dtype) {\n        if (!!dtype && dtype !== this.dtype) {\n            throw new Error(`TensorArray dtype is ${this.dtype} but concat requested dtype ${dtype}`);\n        }\n        if (this.size() === 0) {\n            return tensor([], [0].concat(this.elementShape));\n        }\n        const indices = [];\n        for (let i = 0; i < this.size(); i++) {\n            indices.push(i);\n        }\n        // Collect all the tensors from the tensors array.\n        const tensors = this.readMany(indices);\n        assertShapesMatchAllowUndefinedSize(this.elementShape, tensors[0].shape, `TensorArray shape mismatch: tensor array shape (${this.elementShape}) vs first tensor shape (${tensors[0].shape})`);\n        return concat(tensors, 0);\n    }\n    /**\n     * Scatter the values of a Tensor in specific indices of a TensorArray.\n     * @param indices nummber[] values in [0, max_value). If the\n     *    TensorArray is not dynamic, max_value=size().\n     * @param tensor Tensor input tensor.\n     */\n    scatter(indices, tensor) {\n        if (tensor.dtype !== this.dtype) {\n            throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${tensor.dtype}`);\n        }\n        if (indices.length !== tensor.shape[0]) {\n            throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${indices.length} vs. ${tensor.shape[0]}`);\n        }\n        const maxIndex = Math.max(...indices);\n        if (!this.dynamicSize && maxIndex >= this.maxSize) {\n            throw new Error(`Max index must be < array size (${maxIndex}  vs. ${this.maxSize})`);\n        }\n        this.writeMany(indices, unstack(tensor, 0));\n    }\n    /**\n     * Split the values of a Tensor into the TensorArray.\n     * @param length number[] with the lengths to use when splitting value along\n     *    its first dimension.\n     * @param tensor Tensor, the tensor to split.\n     */\n    split(length, tensor) {\n        if (tensor.dtype !== this.dtype) {\n            throw new Error(`TensorArray dtype is ${this.dtype} but tensor has dtype ${tensor.dtype}`);\n        }\n        let totalLength = 0;\n        const cumulativeLengths = length.map(len => {\n            totalLength += len;\n            return totalLength;\n        });\n        if (totalLength !== tensor.shape[0]) {\n            throw new Error(`Expected sum of lengths to be equal to\n          tensor.shape[0], but sum of lengths is\n        ${totalLength}, and tensor's shape is: ${tensor.shape}`);\n        }\n        if (!this.dynamicSize && length.length !== this.maxSize) {\n            throw new Error(`TensorArray's size is not equal to the size of lengths (${this.maxSize} vs. ${length.length}), ` +\n                'and the TensorArray is not marked as dynamically resizeable');\n        }\n        const elementPerRow = totalLength === 0 ? 0 : tensor.size / totalLength;\n        const tensors = [];\n        tidy(() => {\n            tensor = reshape(tensor, [1, totalLength, elementPerRow]);\n            for (let i = 0; i < length.length; ++i) {\n                const previousLength = (i === 0) ? 0 : cumulativeLengths[i - 1];\n                const indices = [0, previousLength, 0];\n                const sizes = [1, length[i], elementPerRow];\n                tensors[i] = reshape(slice(tensor, indices, sizes), this.elementShape);\n            }\n            return tensors;\n        });\n        const indices = [];\n        for (let i = 0; i < length.length; i++) {\n            indices[i] = i;\n        }\n        this.writeMany(indices, tensors);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX2FycmF5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL2V4ZWN1dG9yL3RlbnNvcl9hcnJheS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFZLElBQUksRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzSCxPQUFPLEVBQUMsbUNBQW1DLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQVFuRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sV0FBVztJQUl0QixZQUNhLElBQVksRUFBVyxLQUFlLEVBQVUsT0FBZSxFQUNoRSxZQUFzQixFQUFXLHNCQUErQixFQUMvRCxXQUFvQixFQUFXLGNBQXVCO1FBRnRELFNBQUksR0FBSixJQUFJLENBQVE7UUFBVyxVQUFLLEdBQUwsS0FBSyxDQUFVO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNoRSxpQkFBWSxHQUFaLFlBQVksQ0FBVTtRQUFXLDJCQUFzQixHQUF0QixzQkFBc0IsQ0FBUztRQUMvRCxnQkFBVyxHQUFYLFdBQVcsQ0FBUztRQUFXLG1CQUFjLEdBQWQsY0FBYyxDQUFTO1FBTjNELFlBQU8sR0FBc0IsRUFBRSxDQUFDO1FBQ2hDLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFNdEIsSUFBSSxDQUFDLFFBQVEsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUIsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0QixDQUFDO0lBRUQsSUFBSSxFQUFFO1FBQ0osT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRUQsSUFBSSxNQUFNO1FBQ1IsT0FBTyxJQUFJLENB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RUFBRSxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7YUFDeEU7WUFDRCxPQUFPLE9BQU8sQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztRQUNILE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztRQUNuQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2hCO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbkMsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2NvbmNhdCwgRGF0YVR5cGUsIGtlZXAsIHJlc2hhcGUsIHNjYWxhciwgc2xpY2UsIHN0YWNrLCBUZW5zb3IsIHRlbnNvciwgdGlkeSwgdW5zdGFja30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHthc3NlcnRTaGFwZXNNYXRjaEFsbG93VW5kZWZpbmVkU2l6ZX0gZnJvbSAnLi90ZW5zb3JfdXRpbHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvcldpdGhTdGF0ZSB7XG4gIHRlbnNvcj86IFRlbnNvcjtcbiAgd3JpdHRlbj86IGJvb2xlYW47XG4gIHJlYWQ/OiBib29sZWFuO1xuICBjbGVhcmVkPzogYm9vbGVhbjtcbn1cbi8qKlxuICogVGhlIFRlbnNvckFycmF5IG9iamVjdCBrZWVwcyBhbiBhcnJheSBvZiBUZW5zb3JzLiAgSXRcbiAqIGFsbG93cyByZWFkaW5nIGZyb20gdGhlIGFycmF5IGFuZCB3cml0aW5nIHRvIHRoZSBhcnJheS5cbiAqL1xuZXhwb3J0IGNsYXNzIFRlbnNvckFycmF5IHtcbiAgcHJpdmF0ZSB0ZW5zb3JzOiBUZW5zb3JXaXRoU3RhdGVbXSA9IFtdO1xuICBwcml2YXRlIGNsb3NlZF8gPSBmYWxzZTtcbiAgcmVhZG9ubHkgaWRUZW5zb3I6IFRlbnNvcjtcbiAgY29uc3RydWN0b3IoXG4gICAgICByZWFkb25seSBuYW1lOiBzdHJpbmcsIHJlYWRvbmx5IGR0eXBlOiBEYXRhVHlwZSwgcHJpdmF0ZSBtYXhTaXplOiBudW1iZXIsXG4gICAgICBwcml2YXRlIGVsZW1lbnRTaGFwZTogbnVtYmVyW10sIHJlYWRvbmx5IGlkZW50aWNhbEVsZW1lbnRTaGFwZXM6IGJvb2xlYW4sXG4gICAgICByZWFkb25seSBkeW5hbWljU2l6ZTogYm9vbGVhbiwgcmVhZG9ubHkgY2xlYXJBZnRlclJlYWQ6IGJvb2xlYW4pIHtcbiAgICB0aGlzLmlkVGVuc29yID0gc2NhbGFyKDApO1xuICAgIGtlZXAodGhpcy5pZFRlbnNvcik7XG4gIH1cblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaWRUZW5zb3IuaWQ7XG4gIH1cblxuICBnZXQgY2xvc2VkKCkge1xuICAgIHJldHVybiB0aGlzLmNsb3NlZF87XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgdGVuc29ycyBhbmQgaWRUZW5zb3IgYW5kIG1hcmsgdGhlIFRlbnNvcnlBcnJheSBhcyBjbG9zZWQuXG4gICAqL1xuICBjbGVhckFuZENsb3NlKGtlZXBJZHM/OiBTZXQ8bnVtYmVyPikge1xuICAgIHRoaXMudGVuc29ycy5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICBpZiAoa2VlcElkcyA9PSBudWxsIHx8ICFrZWVwSWRzLmhhcyh0ZW5zb3IudGVuc29yLmlkKSkge1xuICAgICAgICB0ZW5zb3IudGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRlbnNvcnMgPSBbXTtcbiAgICB0aGlzLmNsb3NlZF8gPSB0cnVlO1xuICAgIHRoaXMuaWRUZW5zb3IuZGlzcG9zZSgpO1xuICB9XG5cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRlbnNvcnMubGVuZ3RoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlYWQgdGhlIHZhbHVlIGF0IGxvY2F0aW9uIGluZGV4IGluIHRoZSBUZW5zb3JBcnJheS5cbiAgICogQHBhcmFtIGluZGV4IE51bWJlciB0aGUgaW5kZXggdG8gcmVhZCBmcm9tLlxuICAgKi9cbiAgcmVhZChpbmRleDogbnVtYmVyKTogVGVuc29yIHtcbiAgICBpZiAodGhpcy5jbG9zZWRfKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbnNvckFycmF5ICR7dGhpcy5uYW1lfSBoYXMgYWxyZWFkeSBiZWVuIGNsb3NlZC5gKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuc2l6ZSgpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyaWVkIHRvIHJlYWQgZnJvbSBpbmRleCAke2luZGV4fSwgYnV0IGFycmF5IHNpemUgaXM6ICR7XG4gICAgICAgICAgdGhpcy5zaXplKCl9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVuc29yV2l0aFN0YXRlID0gdGhpcy50ZW5zb3JzW2luZGV4XTtcbiAgICBpZiAodGVuc29yV2l0aFN0YXRlLmNsZWFyZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVuc29yQXJyYXkgJHt0aGlzLm5hbWV9OiBDb3VsZCBub3QgcmVhZCBpbmRleCAke1xuICAgICAgICAgICAgICBpbmRleH0gdHdpY2UgYmVjYXVzZSBpdCB3YXMgY2xlYXJlZCBhZnRlciBhIHByZXZpb3VzIHJlYWQgYCArXG4gICAgICAgICAgYChwZXJoYXBzIHRyeSBzZXR0aW5nIGNsZWFyX2FmdGVyX3JlYWQgPSBmYWxzZT8pLmApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmNsZWFyQWZ0ZXJSZWFkKSB7XG4gICAgICB0ZW5zb3JXaXRoU3RhdGUuY2xlYXJlZCA9IHRydWU7XG4gICAgfVxuXG4gICAgdGVuc29yV2l0aFN0YXRlLnJlYWQgPSB0cnVlO1xuICAgIHJldHVybiB0ZW5zb3JXaXRoU3RhdGUudGVuc29yO1xuICB9XG5cbiAgLyoqXG4gICAqIEhlbHBlciBtZXRob2QgdG8gcmVhZCBtdWx0aXBsZSB0ZW5zb3JzIGZyb20gdGhlIHNwZWNpZmllZCBpbmRpY2VzLlxuICAgKi9cbiAgcmVhZE1hbnkoaW5kaWNlczogbnVtYmVyW10pOiBUZW5zb3JbXSB7XG4gICAgcmV0dXJuIGluZGljZXMubWFwKGluZGV4ID0+IHRoaXMucmVhZChpbmRleCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFdyaXRlIHZhbHVlIGludG8gdGhlIGluZGV4IG9mIHRoZSBUZW5zb3JBcnJheS5cbiAgICogQHBhcmFtIGluZGV4IG51bWJlciB0aGUgaW5kZXggdG8gd3JpdGUgdG8uXG4gICAqIEBwYXJhbSB0ZW5zb3JcbiAgICovXG4gIHdyaXRlKGluZGV4OiBudW1iZXIsIHRlbnNvcjogVGVuc29yKSB7XG4gICAgaWYgKHRoaXMuY2xvc2VkXykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZW5zb3JBcnJheSAke3RoaXMubmFtZX0gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQuYCk7XG4gICAgfVxuXG4gICAgaWYgKGluZGV4IDwgMCB8fCAhdGhpcy5keW5hbWljU2l6ZSAmJiBpbmRleCA+PSB0aGlzLm1heFNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJpZWQgdG8gd3JpdGUgdG8gaW5kZXggJHtcbiAgICAgICAgICBpbmRleH0sIGJ1dCBhcnJheSBpcyBub3QgcmVzaXplYWJsZSBhbmQgc2l6ZSBpczogJHt0aGlzLm1heFNpemV9YCk7XG4gICAgfVxuXG4gICAgY29uc3QgdCA9IHRoaXMudGVuc29yc1tpbmRleF0gfHwge307XG5cbiAgICBpZiAodGVuc29yLmR0eXBlICE9PSB0aGlzLmR0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbnNvckFycmF5ICR7XG4gICAgICAgICAgdGhpcy5uYW1lfTogQ291bGQgbm90IHdyaXRlIHRvIFRlbnNvckFycmF5IGluZGV4ICR7aW5kZXh9LFxuICAgICAgICAgIGJlY2F1c2UgdGhlIHZhbHVlIGR0eXBlIGlzICR7XG4gICAgICAgICAgdGVuc29yLmR0eXBlfSwgYnV0IFRlbnNvckFycmF5IGR0eXBlIGlzICR7dGhpcy5kdHlwZX0uYCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IHRoZSBzaGFwZSBmb3IgdGhlIGZpcnN0IHRpbWUgd3JpdGUgdG8gdW5rbm93IHNoYXBlIHRlbnNvciBhcnJheVxuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCAmJlxuICAgICAgICAodGhpcy5lbGVtZW50U2hhcGUgPT0gbnVsbCB8fCB0aGlzLmVsZW1lbnRTaGFwZS5sZW5ndGggPT09IDApKSB7XG4gICAgICB0aGlzLmVsZW1lbnRTaGFwZSA9IHRlbnNvci5zaGFwZTtcbiAgICB9XG5cbiAgICBhc3NlcnRTaGFwZXNNYXRjaEFsbG93VW5kZWZpbmVkU2l6ZShcbiAgICAgICAgdGhpcy5lbGVtZW50U2hhcGUsIHRlbnNvci5zaGFwZSxcbiAgICAgICAgYFRlbnNvckFycmF5ICR7dGhpcy5uYW1lfTogQ291bGQgbm90IHdyaXRlIHRvIFRlbnNvckFycmF5IGluZGV4ICR7XG4gICAgICAgICAgICBpbmRleH0uYCk7XG5cbiAgICBpZiAodC5yZWFkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlbnNvckFycmF5ICR7dGhpcy5uYW1lfTogQ291bGQgbm90IHdyaXRlIHRvIFRlbnNvckFycmF5IGluZGV4ICR7XG4gICAgICAgICAgICAgIGluZGV4fSwgYmVjYXVzZSBpdCBoYXMgYWxyZWFkeSBiZWVuIHJlYWQuYCk7XG4gICAgfVxuXG4gICAgaWYgKHQud3JpdHRlbikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZW5zb3JBcnJheSAke3RoaXMubmFtZX06IENvdWxkIG5vdCB3cml0ZSB0byBUZW5zb3JBcnJheSBpbmRleCAke1xuICAgICAgICAgICAgICBpbmRleH0sIGJlY2F1c2UgaXQgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLmApO1xuICAgIH1cblxuICAgIHQudGVuc29yID0gdGVuc29yO1xuICAgIGtlZXAodGVuc29yKTtcbiAgICB0LndyaXR0ZW4gPSB0cnVlO1xuXG4gICAgdGhpcy50ZW5zb3JzW2luZGV4XSA9IHQ7XG4gIH1cblxuICAvKipcbiAgICogSGVscGVyIG1ldGhvZCB0byB3cml0ZSBtdWx0aXBsZSB0ZW5zb3JzIHRvIHRoZSBzcGVjaWZpZWQgaW5kaWNlcy5cbiAgICovXG4gIHdyaXRlTWFueShpbmRpY2VzOiBudW1iZXJbXSwgdGVuc29yczogVGVuc29yW10pIHtcbiAgICBpZiAoaW5kaWNlcy5sZW5ndGggIT09IHRlbnNvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFRlbnNvckFycmF5ICR7dGhpcy5uYW1lfTogY291bGQgbm90IHdyaXRlIG11bHRpcGxlIHRlbnNvcnMsYCArXG4gICAgICAgICAgYGJlY2F1c2UgdGhlIGluZGV4IHNpemU6ICR7XG4gICAgICAgICAgICAgIGluZGljZXMubGVuZ3RofSBpcyBub3QgdGhlIHNhbWUgYXMgdGVuc29ycyBzaXplOiAke1xuICAgICAgICAgICAgICB0ZW5zb3JzLmxlbmd0aH0uYCk7XG4gICAgfVxuXG4gICAgaW5kaWNlcy5mb3JFYWNoKChpLCBpbmRleCkgPT4gdGhpcy53cml0ZShpLCB0ZW5zb3JzW2luZGV4XSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiBzZWxlY3RlZCB2YWx1ZXMgaW4gdGhlIFRlbnNvckFycmF5IGFzIGEgcGFja2VkIFRlbnNvci4gQWxsIG9mXG4gICAqIHNlbGVjdGVkIHZhbHVlcyBtdXN0IGhhdmUgYmVlbiB3cml0dGVuIGFuZCB0aGVpciBzaGFwZXMgbXVzdCBhbGwgbWF0Y2guXG4gICAqIEBwYXJhbSBbaW5kaWNlc10gbnVtYmVyW10gT3B0aW9uYWwuIFRha2luZyB2YWx1ZXMgaW4gWzAsIG1heF92YWx1ZSkuIElmIHRoZVxuICAgKiAgICBUZW5zb3JBcnJheSBpcyBub3QgZHluYW1pYywgbWF4X3ZhbHVlPXNpemUoKS4gSWYgbm90IHNwZWNpZmllZCByZXR1cm5zXG4gICAqICAgIGFsbCB0ZW5zb3JzIGluIHRoZSBvcmlnaW5hbCBvcmRlci5cbiAgICogQHBhcmFtIFtkdHlwZV1cbiAgICovXG4gIGdhdGhlcihpbmRpY2VzPzogbnVtYmVyW10sIGR0eXBlPzogRGF0YVR5cGUpOiBUZW5zb3Ige1xuICAgIGlmICghIWR0eXBlICYmIGR0eXBlICE9PSB0aGlzLmR0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRlbnNvckFycmF5IGR0eXBlIGlzICR7XG4gICAgICAgICAgdGhpcy5kdHlwZX0gYnV0IGdhdGhlciByZXF1ZXN0ZWQgZHR5cGUgJHtkdHlwZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoIWluZGljZXMpIHtcbiAgICAgIGluZGljZXMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5zaXplKCk7IGkrKykge1xuICAgICAgICBpbmRpY2VzLnB1c2goaSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluZGljZXMgPSBpbmRpY2VzLnNsaWNlKDAsIHRoaXMuc2l6ZSgpKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kaWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0ZW5zb3IoW10sIFswXS5jb25jYXQodGhpcy5lbGVtZW50U2hhcGUpKTtcbiAgICB9XG5cbiAgICAvLyBSZWFkIGFsbCB0aGUgUGVyc2lzdGVudFRlbnNvcnMgaW50byBhIHZlY3RvciB0byBrZWVwIHRyYWNrIG9mXG4gICAgLy8gdGhlaXIgbWVtb3J5LlxuICAgIGNvbnN0IHRlbnNvcnMgPSB0aGlzLnJlYWRNYW55KGluZGljZXMpO1xuXG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIHRoaXMuZWxlbWVudFNoYXBlLCB0ZW5zb3JzWzBdLnNoYXBlLCAnVGVuc29yQXJyYXkgc2hhcGUgbWlzbWF0Y2g6ICcpO1xuXG4gICAgcmV0dXJuIHN0YWNrKHRlbnNvcnMsIDApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdmFsdWVzIGluIHRoZSBUZW5zb3JBcnJheSBhcyBhIGNvbmNhdGVuYXRlZCBUZW5zb3IuXG4gICAqL1xuICBjb25jYXQoZHR5cGU/OiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgaWYgKCEhZHR5cGUgJiYgZHR5cGUgIT09IHRoaXMuZHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yQXJyYXkgZHR5cGUgaXMgJHtcbiAgICAgICAgICB0aGlzLmR0eXBlfSBidXQgY29uY2F0IHJlcXVlc3RlZCBkdHlwZSAke2R0eXBlfWApO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnNpemUoKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRlbnNvcihbXSwgWzBdLmNvbmNhdCh0aGlzLmVsZW1lbnRTaGFwZSkpO1xuICAgIH1cblxuICAgIGNvbnN0IGluZGljZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuc2l6ZSgpOyBpKyspIHtcbiAgICAgIGluZGljZXMucHVzaChpKTtcbiAgICB9XG4gICAgLy8gQ29sbGVjdCBhbGwgdGhlIHRlbnNvcnMgZnJvbSB0aGUgdGVuc29ycyBhcnJheS5cbiAgICBjb25zdCB0ZW5zb3JzID0gdGhpcy5yZWFkTWFueShpbmRpY2VzKTtcblxuICAgIGFzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplKFxuICAgICAgICB0aGlzLmVsZW1lbnRTaGFwZSwgdGVuc29yc1swXS5zaGFwZSxcbiAgICAgICAgYFRlbnNvckFycmF5IHNoYXBlIG1pc21hdGNoOiB0ZW5zb3IgYXJyYXkgc2hhcGUgKCR7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRTaGFwZX0pIHZzIGZpcnN0IHRlbnNvciBzaGFwZSAoJHt0ZW5zb3JzWzBdLnNoYXBlfSlgKTtcblxuICAgIHJldHVybiBjb25jYXQodGVuc29ycywgMCk7XG4gIH1cblxuICAvKipcbiAgICogU2NhdHRlciB0aGUgdmFsdWVzIG9mIGEgVGVuc29yIGluIHNwZWNpZmljIGluZGljZXMgb2YgYSBUZW5zb3JBcnJheS5cbiAgICogQHBhcmFtIGluZGljZXMgbnVtbWJlcltdIHZhbHVlcyBpbiBbMCwgbWF4X3ZhbHVlKS4gSWYgdGhlXG4gICAqICAgIFRlbnNvckFycmF5IGlzIG5vdCBkeW5hbWljLCBtYXhfdmFsdWU9c2l6ZSgpLlxuICAgKiBAcGFyYW0gdGVuc29yIFRlbnNvciBpbnB1dCB0ZW5zb3IuXG4gICAqL1xuICBzY2F0dGVyKGluZGljZXM6IG51bWJlcltdLCB0ZW5zb3I6IFRlbnNvcikge1xuICAgIGlmICh0ZW5zb3IuZHR5cGUgIT09IHRoaXMuZHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yQXJyYXkgZHR5cGUgaXMgJHtcbiAgICAgICAgICB0aGlzLmR0eXBlfSBidXQgdGVuc29yIGhhcyBkdHlwZSAke3RlbnNvci5kdHlwZX1gKTtcbiAgICB9XG5cbiAgICBpZiAoaW5kaWNlcy5sZW5ndGggIT09IHRlbnNvci5zaGFwZVswXSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsZW4oaW5kaWNlcykgPT0gdGVuc29yLnNoYXBlWzBdLCBidXQgc2F3OiAke1xuICAgICAgICAgIGluZGljZXMubGVuZ3RofSB2cy4gJHt0ZW5zb3Iuc2hhcGVbMF19YCk7XG4gICAgfVxuXG4gICAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi5pbmRpY2VzKTtcblxuICAgIGlmICghdGhpcy5keW5hbWljU2l6ZSAmJiBtYXhJbmRleCA+PSB0aGlzLm1heFNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgTWF4IGluZGV4IG11c3QgYmUgPCBhcnJheSBzaXplICgke21heEluZGV4fSAgdnMuICR7dGhpcy5tYXhTaXplfSlgKTtcbiAgICB9XG5cbiAgICB0aGlzLndyaXRlTWFueShpbmRpY2VzLCB1bnN0YWNrKHRlbnNvciwgMCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNwbGl0IHRoZSB2YWx1ZXMgb2YgYSBUZW5zb3IgaW50byB0aGUgVGVuc29yQXJyYXkuXG4gICAqIEBwYXJhbSBsZW5ndGggbnVtYmVyW10gd2l0aCB0aGUgbGVuZ3RocyB0byB1c2Ugd2hlbiBzcGxpdHRpbmcgdmFsdWUgYWxvbmdcbiAgICogICAgaXRzIGZpcnN0IGRpbWVuc2lvbi5cbiAgICogQHBhcmFtIHRlbnNvciBUZW5zb3IsIHRoZSB0ZW5zb3IgdG8gc3BsaXQuXG4gICAqL1xuICBzcGxpdChsZW5ndGg6IG51bWJlcltdLCB0ZW5zb3I6IFRlbnNvcikge1xuICAgIGlmICh0ZW5zb3IuZHR5cGUgIT09IHRoaXMuZHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yQXJyYXkgZHR5cGUgaXMgJHtcbiAgICAgICAgICB0aGlzLmR0eXBlfSBidXQgdGVuc29yIGhhcyBkdHlwZSAke3RlbnNvci5kdHlwZX1gKTtcbiAgICB9XG4gICAgbGV0IHRvdGFsTGVuZ3RoID0gMDtcbiAgICBjb25zdCBjdW11bGF0aXZlTGVuZ3RocyA9IGxlbmd0aC5tYXAobGVuID0+IHtcbiAgICAgIHRvdGFsTGVuZ3RoICs9IGxlbjtcbiAgICAgIHJldHVybiB0b3RhbExlbmd0aDtcbiAgICB9KTtcblxuICAgIGlmICh0b3RhbExlbmd0aCAhPT0gdGVuc29yLnNoYXBlWzBdKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHN1bSBvZiBsZW5ndGhzIHRvIGJlIGVxdWFsIHRvXG4gICAgICAgICAgdGVuc29yLnNoYXBlWzBdLCBidXQgc3VtIG9mIGxlbmd0aHMgaXNcbiAgICAgICAgJHt0b3RhbExlbmd0aH0sIGFuZCB0ZW5zb3IncyBzaGFwZSBpczogJHt0ZW5zb3Iuc2hhcGV9YCk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLmR5bmFtaWNTaXplICYmIGxlbmd0aC5sZW5ndGggIT09IHRoaXMubWF4U2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUZW5zb3JBcnJheSdzIHNpemUgaXMgbm90IGVxdWFsIHRvIHRoZSBzaXplIG9mIGxlbmd0aHMgKCR7XG4gICAgICAgICAgICAgIHRoaXMubWF4U2l6ZX0gdnMuICR7bGVuZ3RoLmxlbmd0aH0pLCBgICtcbiAgICAgICAgICAnYW5kIHRoZSBUZW5zb3JBcnJheSBpcyBub3QgbWFya2VkIGFzIGR5bmFtaWNhbGx5IHJlc2l6ZWFibGUnKTtcbiAgICB9XG5cbiAgICBjb25zdCBlbGVtZW50UGVyUm93ID0gdG90YWxMZW5ndGggPT09IDAgPyAwIDogdGVuc29yLnNpemUgLyB0b3RhbExlbmd0aDtcbiAgICBjb25zdCB0ZW5zb3JzOiBUZW5zb3JbXSA9IFtdO1xuICAgIHRpZHkoKCkgPT4ge1xuICAgICAgdGVuc29yID0gcmVzaGFwZSh0ZW5zb3IsIFsxLCB0b3RhbExlbmd0aCwgZWxlbWVudFBlclJvd10pO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGgubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgY29uc3QgcHJldmlvdXNMZW5ndGggPSAoaSA9PT0gMCkgPyAwIDogY3VtdWxhdGl2ZUxlbmd0aHNbaSAtIDFdO1xuICAgICAgICBjb25zdCBpbmRpY2VzID0gWzAsIHByZXZpb3VzTGVuZ3RoLCAwXTtcbiAgICAgICAgY29uc3Qgc2l6ZXMgPSBbMSwgbGVuZ3RoW2ldLCBlbGVtZW50UGVyUm93XTtcbiAgICAgICAgdGVuc29yc1tpXSA9IHJlc2hhcGUoc2xpY2UodGVuc29yLCBpbmRpY2VzLCBzaXplcyksIHRoaXMuZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0ZW5zb3JzO1xuICAgIH0pO1xuICAgIGNvbnN0IGluZGljZXMgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aC5sZW5ndGg7IGkrKykge1xuICAgICAgaW5kaWNlc1tpXSA9IGk7XG4gICAgfVxuICAgIHRoaXMud3JpdGVNYW55KGluZGljZXMsIHRlbnNvcnMpO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { concat, keep, reshape, scalar, slice, stack, tensor, tidy, unstack } from '@tensorflow/tfjs-core';\nimport { assertShapesMatchAllowUndefinedSize, inferElementShape, mergeElementShape } from './tensor_utils';\n/**\n * TensorList stores a container of `tf.Tensor` objects, which are accessible\n * via tensors field.\n *\n * In order to get a copy of the underlying list, use the copy method:\n * ```\n *    TensorList b = a.copy();\n *    b.tensors().pushBack(t);  // This does not modify a.tensors().\n * ```\n *\n * Note that this is not a deep copy: the memory locations of the underlying\n * tensors will still point to the same locations of the corresponding tensors\n * in the original.\n */\nexport class TensorList {\n    /**\n     *\n     * @param tensors list of tensors\n     * @param elementShape shape of each tensor, this can be a single number (any\n     * shape is allowed) or partial shape (dim = -1).\n     * @param elementDtype data type of each tensor\n     * @param maxNumElements The maximum allowed size of `tensors`. Defaults to -1\n     *   meaning that the size of `tensors` is unbounded.\n     */\n    constructor(tensors, elementShape, elementDtype, maxNumElements = -1) {\n        this.tensors = tensors;\n        this.elementShape = elementShape;\n        this.elementDtype = elementDtype;\n        if (tensors != null) {\n            tensors.forEach(tensor => {\n                if (elementDtype !== tensor.dtype) {\n                    throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${tensor.dtype}`);\n                }\n                assertShapesMatchAllowUndefinedSize(elementShape, tensor.shape, 'TensorList shape mismatch: ');\n                keep(tensor);\n            });\n        }\n        this.idTensor = scalar(0);\n        this.maxNumElements = maxNumElements;\n        keep(this.idTensor);\n    }\n    get id() {\n        return this.idTensor.id;\n    }\n    /**\n     * Get a new TensorList containing a copy of the underlying tensor container.\n     */\n    copy() {\n        return new TensorList([...this.tensors], this.elementShape, this.elementDtype);\n    }\n    /**\n     * Dispose the tensors and idTensor and clear the tensor list.\n     */\n    clearAndClose(keepIds) {\n        this.tensors.forEach(tensor => {\n            if (keepIds == null || !keepIds.has(tensor.id)) {\n                tensor.dispose();\n            }\n        });\n        this.tensors.length = 0;\n        this.idTensor.dispose();\n    }\n    /**\n     * The size of the tensors in the tensor list.\n     */\n    size() {\n        return this.tensors.length;\n    }\n    /**\n     * Return a tensor that stacks a list of rank-R tf.Tensors into one rank-(R+1)\n     * tf.Tensor.\n     * @param elementShape shape of each tensor\n     * @param elementDtype data type of each tensor\n     * @param numElements the number of elements to stack\n     */\n    stack(elementShape, elementDtype, numElements = -1) {\n        if (elementDtype !== this.elementDtype) {\n            throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${this.elementDtype}`);\n        }\n        if (numElements !== -1 && this.tensors.length !== numElements) {\n            throw new Error(`Operation expected a list with ${numElements} elements but got a list with ${this.tensors.length} elements.`);\n        }\n        assertShapesMatchAllowUndefinedSize(elementShape, this.elementShape, 'TensorList shape mismatch: ');\n        const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n        return tidy(() => {\n            const reshapedTensors = this.tensors.map(tensor => reshape(tensor, outputElementShape));\n            return stack(reshapedTensors, 0);\n        });\n    }\n    /**\n     * Pop a tensor from the end of the list.\n     * @param elementShape shape of the tensor\n     * @param elementDtype data type of the tensor\n     */\n    popBack(elementShape, elementDtype) {\n        if (elementDtype !== this.elementDtype) {\n            throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${this.elementDtype}`);\n        }\n        if (this.size() === 0) {\n            throw new Error('Trying to pop from an empty list.');\n        }\n        const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n        const tensor = this.tensors.pop();\n        tensor.kept = false;\n        assertShapesMatchAllowUndefinedSize(tensor.shape, elementShape, 'TensorList shape mismatch: ');\n        return reshape(tensor, outputElementShape);\n    }\n    /**\n     * Push a tensor to the end of the list.\n     * @param tensor Tensor to be pushed.\n     */\n    pushBack(tensor) {\n        if (tensor.dtype !== this.elementDtype) {\n            throw new Error(`Invalid data types; op elements ${tensor.dtype}, but list elements ${this.elementDtype}`);\n        }\n        assertShapesMatchAllowUndefinedSize(tensor.shape, this.elementShape, 'TensorList shape mismatch: ');\n        if (this.maxNumElements === this.size()) {\n            throw new Error(`Trying to push element into a full list.`);\n        }\n        keep(tensor);\n        this.tensors.push(tensor);\n    }\n    /**\n     * Update the size of the list.\n     * @param size the new size of the list.\n     */\n    resize(size) {\n        if (size < 0) {\n            throw new Error(`TensorListResize expects size to be non-negative. Got: ${size}`);\n        }\n        if (this.maxNumElements !== -1 && size > this.maxNumElements) {\n            throw new Error(`TensorListResize input size ${size} is greater maxNumElement ${this.maxNumElements}.`);\n        }\n        const destTensorList = new TensorList([], this.elementShape, this.elementDtype, this.maxNumElements);\n        destTensorList.tensors.length = size;\n        for (let i = 0; i < Math.min(this.tensors.length, size); ++i) {\n            destTensorList.tensors[i] = this.tensors[i];\n        }\n        return destTensorList;\n    }\n    /**\n     * Retrieve the element at the provided index\n     * @param elementShape shape of the tensor\n     * @param elementDtype dtype of the tensor\n     * @param elementIndex index of the tensor\n     */\n    getItem(elementIndex, elementShape, elementDtype) {\n        if (elementDtype !== this.elementDtype) {\n            throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${this.elementDtype}`);\n        }\n        if (elementIndex < 0 || elementIndex > this.tensors.length) {\n            throw new Error(`Trying to access element ${elementIndex} in a list with ${this.tensors.length} elements.`);\n        }\n        if (this.tensors[elementIndex] == null) {\n            throw new Error(`element at index ${elementIndex} is null.`);\n        }\n        assertShapesMatchAllowUndefinedSize(this.tensors[elementIndex].shape, elementShape, 'TensorList shape mismatch: ');\n        const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n        return reshape(this.tensors[elementIndex], outputElementShape);\n    }\n    /**\n     * Set the tensor at the index\n     * @param elementIndex index of the tensor\n     * @param tensor the tensor to be inserted into the list\n     */\n    setItem(elementIndex, tensor) {\n        if (tensor.dtype !== this.elementDtype) {\n            throw new Error(`Invalid data types; op elements ${tensor.dtype}, but list elements ${this.elementDtype}`);\n        }\n        if (elementIndex < 0 ||\n            this.maxNumElements !== -1 && elementIndex >= this.maxNumElements) {\n            throw new Error(`Trying to set element ${elementIndex} in a list with max ${this.maxNumElements} elements.`);\n        }\n        assertShapesMatchAllowUndefinedSize(this.elementShape, tensor.shape, 'TensorList shape mismatch: ');\n        keep(tensor);\n        // dispose the previous value if it is replacing.\n        if (this.tensors[elementIndex] != null) {\n            this.tensors[elementIndex].kept = false;\n        }\n        this.tensors[elementIndex] = tensor;\n    }\n    /**\n     * Return selected values in the TensorList as a stacked Tensor. All of\n     * selected values must have been written and their shapes must all match.\n     * @param indices indices of tensors to gather\n     * @param elementDtype output tensor dtype\n     * @param elementShape output tensor element shape\n     */\n    gather(indices, elementDtype, elementShape) {\n        if (elementDtype !== this.elementDtype) {\n            throw new Error(`Invalid data types; op elements ${elementDtype}, but list elements ${this.elementDtype}`);\n        }\n        assertShapesMatchAllowUndefinedSize(this.elementShape, elementShape, 'TensorList shape mismatch: ');\n        // When indices is greater than the size of the list, indices beyond the\n        // size of the list are ignored.\n        indices = indices.slice(0, this.size());\n        const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n        if (indices.length === 0) {\n            return tensor([], [0].concat(outputElementShape));\n        }\n        return tidy(() => {\n            const tensors = indices.map(i => reshape(this.tensors[i], outputElementShape));\n            return stack(tensors, 0);\n        });\n    }\n    /**\n     * Return the values in the TensorList as a concatenated Tensor.\n     * @param elementDtype output tensor dtype\n     * @param elementShape output tensor element shape\n     */\n    concat(elementDtype, elementShape) {\n        if (!!elementDtype && elementDtype !== this.elementDtype) {\n            throw new Error(`TensorList dtype is ${this.elementDtype} but concat requested dtype ${elementDtype}`);\n        }\n        assertShapesMatchAllowUndefinedSize(this.elementShape, elementShape, 'TensorList shape mismatch: ');\n        const outputElementShape = inferElementShape(this.elementShape, this.tensors, elementShape);\n        if (this.size() === 0) {\n            return tensor([], [0].concat(outputElementShape));\n        }\n        return tidy(() => {\n            const tensors = this.tensors.map(t => reshape(t, outputElementShape));\n            return concat(tensors, 0);\n        });\n    }\n}\n/**\n * Creates a TensorList which, when stacked, has the value of tensor.\n * @param tensor from tensor\n * @param elementShape output tensor element shape\n */\nexport function fromTensor(tensor, elementShape, elementDtype) {\n    const dtype = tensor.dtype;\n    if (tensor.shape.length < 1) {\n        throw new Error(`Tensor must be at least a vector, but saw shape: ${tensor.shape}`);\n    }\n    if (tensor.dtype !== elementDtype) {\n        throw new Error(`Invalid data types; op elements ${tensor.dtype}, but list elements ${elementDtype}`);\n    }\n    const tensorElementShape = tensor.shape.slice(1);\n    assertShapesMatchAllowUndefinedSize(tensorElementShape, elementShape, 'TensorList shape mismatch: ');\n    const tensorList = unstack(tensor);\n    return new TensorList(tensorList, elementShape, dtype);\n}\n/**\n * Return a TensorList of the given size with empty elements.\n * @param elementShape the shape of the future elements of the list\n * @param elementDtype the desired type of elements in the list\n * @param numElements the number of elements to reserve\n * @param maxNumElements the maximum number of elements in th list\n */\nexport function reserve(elementShape, elementDtype, numElements, maxNumElements) {\n    return new TensorList([], elementShape, elementDtype, maxNumElements);\n}\n/**\n * Put tensors at specific indices of a stacked tensor into a TensorList.\n * @param indices list of indices on how to scatter the tensor.\n * @param tensor input tensor.\n * @param elementShape the shape of the future elements of the list\n * @param numElements the number of elements to scatter\n */\nexport function scatter(tensor, indices, elementShape, numElements) {\n    if (indices.length !== tensor.shape[0]) {\n        throw new Error(`Expected len(indices) == tensor.shape[0], but saw: ${indices.length} vs. ${tensor.shape[0]}`);\n    }\n    const maxIndex = Math.max(...indices);\n    if (numElements != null && numElements !== -1 && maxIndex >= numElements) {\n        throw new Error(`Max index must be < array size (${maxIndex}  vs. ${numElements})`);\n    }\n    const list = new TensorList([], elementShape, tensor.dtype, numElements);\n    const tensors = unstack(tensor, 0);\n    indices.forEach((value, index) => {\n        list.setItem(value, tensors[index]);\n    });\n    return list;\n}\n/**\n * Split the values of a Tensor into a TensorList.\n * @param length the lengths to use when splitting value along\n *    its first dimension.\n * @param tensor the tensor to split.\n * @param elementShape the shape of the future elements of the list\n */\nexport function split(tensor, length, elementShape) {\n    let totalLength = 0;\n    const cumulativeLengths = length.map(len => {\n        totalLength += len;\n        return totalLength;\n    });\n    if (totalLength !== tensor.shape[0]) {\n        throw new Error(`Expected sum of lengths to be equal to\n          tensor.shape[0], but sum of lengths is\n        ${totalLength}, and tensor's shape is: ${tensor.shape}`);\n    }\n    const shapeWithoutFirstDim = tensor.shape.slice(1);\n    const outputElementShape = mergeElementShape(shapeWithoutFirstDim, elementShape);\n    const elementPerRow = totalLength === 0 ? 0 : tensor.size / totalLength;\n    const tensors = tidy(() => {\n        const tensors = [];\n        tensor = reshape(tensor, [1, totalLength, elementPerRow]);\n        for (let i = 0; i < length.length; ++i) {\n            const previousLength = (i === 0) ? 0 : cumulativeLengths[i - 1];\n            const indices = [0, previousLength, 0];\n            const sizes = [1, length[i], elementPerRow];\n            tensors[i] = reshape(slice(tensor, indices, sizes), outputElementShape);\n        }\n        tensor.dispose();\n        return tensors;\n    });\n    const list = new TensorList([], elementShape, tensor.dtype, length.length);\n    for (let i = 0; i < tensors.length; i++) {\n        list.setItem(i, tensors[i]);\n    }\n    return list;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVuc29yX2xpc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvdGVuc29yX2xpc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBWSxJQUFJLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0gsT0FBTyxFQUFDLG1DQUFtQyxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFekc7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUVILE1BQU0sT0FBTyxVQUFVO0lBT3JCOzs7Ozs7OztPQVFHO0lBQ0gsWUFDYSxPQUFpQixFQUFXLFlBQTZCLEVBQ3pELFlBQXNCLEVBQUUsY0FBYyxHQUFHLENBQUMsQ0FBQztRQUQzQyxZQUFPLEdBQVAsT0FBTyxDQUFVO1FBQVcsaUJBQVksR0FBWixZQUFZLENBQWlCO1FBQ3pELGlCQUFZLEdBQVosWUFBWSxDQUFVO1FBQ2pDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtZQUNuQixPQUFPLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFO2dCQUN2QixJQUFJLFlBQVksS0FBSyxNQUFNLENBQUMsS0FBSyxFQUFFO29CQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLG1DQUNaLFlBQVksdUJBQXVCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO2lCQUN4RDtnQkFDRCxtQ0FBbUMsQ0FDL0IsWUFBWSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsNkJBQTZCLENBQUMsQ0FBQztnQkFFL0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1lBQ2YsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUNELElBQUks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SUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDN0I7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Y29uY2F0LCBEYXRhVHlwZSwga2VlcCwgcmVzaGFwZSwgc2NhbGFyLCBzbGljZSwgc3RhY2ssIFRlbnNvciwgdGVuc29yLCB0aWR5LCB1bnN0YWNrfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2Fzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplLCBpbmZlckVsZW1lbnRTaGFwZSwgbWVyZ2VFbGVtZW50U2hhcGV9IGZyb20gJy4vdGVuc29yX3V0aWxzJztcblxuLyoqXG4gKiBUZW5zb3JMaXN0IHN0b3JlcyBhIGNvbnRhaW5lciBvZiBgdGYuVGVuc29yYCBvYmplY3RzLCB3aGljaCBhcmUgYWNjZXNzaWJsZVxuICogdmlhIHRlbnNvcnMgZmllbGQuXG4gKlxuICogSW4gb3JkZXIgdG8gZ2V0IGEgY29weSBvZiB0aGUgdW5kZXJseWluZyBsaXN0LCB1c2UgdGhlIGNvcHkgbWV0aG9kOlxuICogYGBgXG4gKiAgICBUZW5zb3JMaXN0IGIgPSBhLmNvcHkoKTtcbiAqICAgIGIudGVuc29ycygpLnB1c2hCYWNrKHQpOyAgLy8gVGhpcyBkb2VzIG5vdCBtb2RpZnkgYS50ZW5zb3JzKCkuXG4gKiBgYGBcbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBpcyBub3QgYSBkZWVwIGNvcHk6IHRoZSBtZW1vcnkgbG9jYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nXG4gKiB0ZW5zb3JzIHdpbGwgc3RpbGwgcG9pbnQgdG8gdGhlIHNhbWUgbG9jYXRpb25zIG9mIHRoZSBjb3JyZXNwb25kaW5nIHRlbnNvcnNcbiAqIGluIHRoZSBvcmlnaW5hbC5cbiAqL1xuXG5leHBvcnQgY2xhc3MgVGVuc29yTGlzdCB7XG4gIHJlYWRvbmx5IGlkVGVuc29yOiBUZW5zb3I7XG4gIG1heE51bUVsZW1lbnRzOiBudW1iZXI7XG5cbiAgZ2V0IGlkKCkge1xuICAgIHJldHVybiB0aGlzLmlkVGVuc29yLmlkO1xuICB9XG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gdGVuc29ycyBsaXN0IG9mIHRlbnNvcnNcbiAgICogQHBhcmFtIGVsZW1lbnRTaGFwZSBzaGFwZSBvZiBlYWNoIHRlbnNvciwgdGhpcyBjYW4gYmUgYSBzaW5nbGUgbnVtYmVyIChhbnlcbiAgICogc2hhcGUgaXMgYWxsb3dlZCkgb3IgcGFydGlhbCBzaGFwZSAoZGltID0gLTEpLlxuICAgKiBAcGFyYW0gZWxlbWVudER0eXBlIGRhdGEgdHlwZSBvZiBlYWNoIHRlbnNvclxuICAgKiBAcGFyYW0gbWF4TnVtRWxlbWVudHMgVGhlIG1heGltdW0gYWxsb3dlZCBzaXplIG9mIGB0ZW5zb3JzYC4gRGVmYXVsdHMgdG8gLTFcbiAgICogICBtZWFuaW5nIHRoYXQgdGhlIHNpemUgb2YgYHRlbnNvcnNgIGlzIHVuYm91bmRlZC5cbiAgICovXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcmVhZG9ubHkgdGVuc29yczogVGVuc29yW10sIHJlYWRvbmx5IGVsZW1lbnRTaGFwZTogbnVtYmVyfG51bWJlcltdLFxuICAgICAgcmVhZG9ubHkgZWxlbWVudER0eXBlOiBEYXRhVHlwZSwgbWF4TnVtRWxlbWVudHMgPSAtMSkge1xuICAgIGlmICh0ZW5zb3JzICE9IG51bGwpIHtcbiAgICAgIHRlbnNvcnMuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudER0eXBlICE9PSB0ZW5zb3IuZHR5cGUpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSB0eXBlczsgb3AgZWxlbWVudHMgJHtcbiAgICAgICAgICAgICAgZWxlbWVudER0eXBlfSwgYnV0IGxpc3QgZWxlbWVudHMgJHt0ZW5zb3IuZHR5cGV9YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgICAgICBlbGVtZW50U2hhcGUsIHRlbnNvci5zaGFwZSwgJ1RlbnNvckxpc3Qgc2hhcGUgbWlzbWF0Y2g6ICcpO1xuXG4gICAgICAgIGtlZXAodGVuc29yKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmlkVGVuc29yID0gc2NhbGFyKDApO1xuICAgIHRoaXMubWF4TnVtRWxlbWVudHMgPSBtYXhOdW1FbGVtZW50cztcbiAgICBrZWVwKHRoaXMuaWRUZW5zb3IpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIG5ldyBUZW5zb3JMaXN0IGNvbnRhaW5pbmcgYSBjb3B5IG9mIHRoZSB1bmRlcmx5aW5nIHRlbnNvciBjb250YWluZXIuXG4gICAqL1xuICBjb3B5KCk6IFRlbnNvckxpc3Qge1xuICAgIHJldHVybiBuZXcgVGVuc29yTGlzdChcbiAgICAgICAgWy4uLnRoaXMudGVuc29yc10sIHRoaXMuZWxlbWVudFNoYXBlLCB0aGlzLmVsZW1lbnREdHlwZSk7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZSB0aGUgdGVuc29ycyBhbmQgaWRUZW5zb3IgYW5kIGNsZWFyIHRoZSB0ZW5zb3IgbGlzdC5cbiAgICovXG4gIGNsZWFyQW5kQ2xvc2Uoa2VlcElkcz86IFNldDxudW1iZXI+KSB7XG4gICAgdGhpcy50ZW5zb3JzLmZvckVhY2godGVuc29yID0+IHtcbiAgICAgIGlmIChrZWVwSWRzID09IG51bGwgfHwgIWtlZXBJZHMuaGFzKHRlbnNvci5pZCkpIHtcbiAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnRlbnNvcnMubGVuZ3RoID0gMDtcbiAgICB0aGlzLmlkVGVuc29yLmRpc3Bvc2UoKTtcbiAgfVxuICAvKipcbiAgICogVGhlIHNpemUgb2YgdGhlIHRlbnNvcnMgaW4gdGhlIHRlbnNvciBsaXN0LlxuICAgKi9cbiAgc2l6ZSgpIHtcbiAgICByZXR1cm4gdGhpcy50ZW5zb3JzLmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gYSB0ZW5zb3IgdGhhdCBzdGFja3MgYSBsaXN0IG9mIHJhbmstUiB0Zi5UZW5zb3JzIGludG8gb25lIHJhbmstKFIrMSlcbiAgICogdGYuVGVuc29yLlxuICAgKiBAcGFyYW0gZWxlbWVudFNoYXBlIHNoYXBlIG9mIGVhY2ggdGVuc29yXG4gICAqIEBwYXJhbSBlbGVtZW50RHR5cGUgZGF0YSB0eXBlIG9mIGVhY2ggdGVuc29yXG4gICAqIEBwYXJhbSBudW1FbGVtZW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHN0YWNrXG4gICAqL1xuICBzdGFjayhlbGVtZW50U2hhcGU6IG51bWJlcltdLCBlbGVtZW50RHR5cGU6IERhdGFUeXBlLCBudW1FbGVtZW50cyA9IC0xKTpcbiAgICAgIFRlbnNvciB7XG4gICAgaWYgKGVsZW1lbnREdHlwZSAhPT0gdGhpcy5lbGVtZW50RHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIHR5cGVzOyBvcCBlbGVtZW50cyAke1xuICAgICAgICAgIGVsZW1lbnREdHlwZX0sIGJ1dCBsaXN0IGVsZW1lbnRzICR7dGhpcy5lbGVtZW50RHR5cGV9YCk7XG4gICAgfVxuICAgIGlmIChudW1FbGVtZW50cyAhPT0gLTEgJiYgdGhpcy50ZW5zb3JzLmxlbmd0aCAhPT0gbnVtRWxlbWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgT3BlcmF0aW9uIGV4cGVjdGVkIGEgbGlzdCB3aXRoICR7XG4gICAgICAgICAgbnVtRWxlbWVudHN9IGVsZW1lbnRzIGJ1dCBnb3QgYSBsaXN0IHdpdGggJHtcbiAgICAgICAgICB0aGlzLnRlbnNvcnMubGVuZ3RofSBlbGVtZW50cy5gKTtcbiAgICB9XG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIGVsZW1lbnRTaGFwZSwgdGhpcy5lbGVtZW50U2hhcGUsICdUZW5zb3JMaXN0IHNoYXBlIG1pc21hdGNoOiAnKTtcbiAgICBjb25zdCBvdXRwdXRFbGVtZW50U2hhcGUgPVxuICAgICAgICBpbmZlckVsZW1lbnRTaGFwZSh0aGlzLmVsZW1lbnRTaGFwZSwgdGhpcy50ZW5zb3JzLCBlbGVtZW50U2hhcGUpO1xuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHJlc2hhcGVkVGVuc29ycyA9XG4gICAgICAgICAgdGhpcy50ZW5zb3JzLm1hcCh0ZW5zb3IgPT4gcmVzaGFwZSh0ZW5zb3IsIG91dHB1dEVsZW1lbnRTaGFwZSkpO1xuICAgICAgcmV0dXJuIHN0YWNrKHJlc2hhcGVkVGVuc29ycywgMCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogUG9wIGEgdGVuc29yIGZyb20gdGhlIGVuZCBvZiB0aGUgbGlzdC5cbiAgICogQHBhcmFtIGVsZW1lbnRTaGFwZSBzaGFwZSBvZiB0aGUgdGVuc29yXG4gICAqIEBwYXJhbSBlbGVtZW50RHR5cGUgZGF0YSB0eXBlIG9mIHRoZSB0ZW5zb3JcbiAgICovXG4gIHBvcEJhY2soZWxlbWVudFNoYXBlOiBudW1iZXJbXSwgZWxlbWVudER0eXBlOiBEYXRhVHlwZSk6IFRlbnNvciB7XG4gICAgaWYgKGVsZW1lbnREdHlwZSAhPT0gdGhpcy5lbGVtZW50RHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIHR5cGVzOyBvcCBlbGVtZW50cyAke1xuICAgICAgICAgIGVsZW1lbnREdHlwZX0sIGJ1dCBsaXN0IGVsZW1lbnRzICR7dGhpcy5lbGVtZW50RHR5cGV9YCk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2l6ZSgpID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RyeWluZyB0byBwb3AgZnJvbSBhbiBlbXB0eSBsaXN0LicpO1xuICAgIH1cbiAgICBjb25zdCBvdXRwdXRFbGVtZW50U2hhcGUgPVxuICAgICAgICBpbmZlckVsZW1lbnRTaGFwZSh0aGlzLmVsZW1lbnRTaGFwZSwgdGhpcy50ZW5zb3JzLCBlbGVtZW50U2hhcGUpO1xuICAgIGNvbnN0IHRlbnNvciA9IHRoaXMudGVuc29ycy5wb3AoKTtcbiAgICB0ZW5zb3Iua2VwdCA9IGZhbHNlO1xuXG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIHRlbnNvci5zaGFwZSwgZWxlbWVudFNoYXBlLCAnVGVuc29yTGlzdCBzaGFwZSBtaXNtYXRjaDogJyk7XG5cbiAgICByZXR1cm4gcmVzaGFwZSh0ZW5zb3IsIG91dHB1dEVsZW1lbnRTaGFwZSk7XG4gIH1cblxuICAvKipcbiAgICogUHVzaCBhIHRlbnNvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0LlxuICAgKiBAcGFyYW0gdGVuc29yIFRlbnNvciB0byBiZSBwdXNoZWQuXG4gICAqL1xuICBwdXNoQmFjayh0ZW5zb3I6IFRlbnNvcikge1xuICAgIGlmICh0ZW5zb3IuZHR5cGUgIT09IHRoaXMuZWxlbWVudER0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSB0eXBlczsgb3AgZWxlbWVudHMgJHtcbiAgICAgICAgICB0ZW5zb3IuZHR5cGV9LCBidXQgbGlzdCBlbGVtZW50cyAke3RoaXMuZWxlbWVudER0eXBlfWApO1xuICAgIH1cblxuICAgIGFzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplKFxuICAgICAgICB0ZW5zb3Iuc2hhcGUsIHRoaXMuZWxlbWVudFNoYXBlLCAnVGVuc29yTGlzdCBzaGFwZSBtaXNtYXRjaDogJyk7XG5cbiAgICBpZiAodGhpcy5tYXhOdW1FbGVtZW50cyA9PT0gdGhpcy5zaXplKCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVHJ5aW5nIHRvIHB1c2ggZWxlbWVudCBpbnRvIGEgZnVsbCBsaXN0LmApO1xuICAgIH1cbiAgICBrZWVwKHRlbnNvcik7XG4gICAgdGhpcy50ZW5zb3JzLnB1c2godGVuc29yKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGRhdGUgdGhlIHNpemUgb2YgdGhlIGxpc3QuXG4gICAqIEBwYXJhbSBzaXplIHRoZSBuZXcgc2l6ZSBvZiB0aGUgbGlzdC5cbiAgICovXG4gIHJlc2l6ZShzaXplOiBudW1iZXIpIHtcbiAgICBpZiAoc2l6ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgVGVuc29yTGlzdFJlc2l6ZSBleHBlY3RzIHNpemUgdG8gYmUgbm9uLW5lZ2F0aXZlLiBHb3Q6ICR7c2l6ZX1gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5tYXhOdW1FbGVtZW50cyAhPT0gLTEgJiYgc2l6ZSA+IHRoaXMubWF4TnVtRWxlbWVudHMpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yTGlzdFJlc2l6ZSBpbnB1dCBzaXplICR7XG4gICAgICAgICAgc2l6ZX0gaXMgZ3JlYXRlciBtYXhOdW1FbGVtZW50ICR7dGhpcy5tYXhOdW1FbGVtZW50c30uYCk7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzdFRlbnNvckxpc3Q6IFRlbnNvckxpc3QgPSBuZXcgVGVuc29yTGlzdChcbiAgICAgICAgW10sIHRoaXMuZWxlbWVudFNoYXBlLCB0aGlzLmVsZW1lbnREdHlwZSwgdGhpcy5tYXhOdW1FbGVtZW50cyk7XG4gICAgZGVzdFRlbnNvckxpc3QudGVuc29ycy5sZW5ndGggPSBzaXplO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgTWF0aC5taW4odGhpcy50ZW5zb3JzLmxlbmd0aCwgc2l6ZSk7ICsraSkge1xuICAgICAgZGVzdFRlbnNvckxpc3QudGVuc29yc1tpXSA9IHRoaXMudGVuc29yc1tpXTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc3RUZW5zb3JMaXN0O1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlIHRoZSBlbGVtZW50IGF0IHRoZSBwcm92aWRlZCBpbmRleFxuICAgKiBAcGFyYW0gZWxlbWVudFNoYXBlIHNoYXBlIG9mIHRoZSB0ZW5zb3JcbiAgICogQHBhcmFtIGVsZW1lbnREdHlwZSBkdHlwZSBvZiB0aGUgdGVuc29yXG4gICAqIEBwYXJhbSBlbGVtZW50SW5kZXggaW5kZXggb2YgdGhlIHRlbnNvclxuICAgKi9cbiAgZ2V0SXRlbShlbGVtZW50SW5kZXg6IG51bWJlciwgZWxlbWVudFNoYXBlOiBudW1iZXJbXSwgZWxlbWVudER0eXBlOiBEYXRhVHlwZSk6XG4gICAgICBUZW5zb3Ige1xuICAgIGlmIChlbGVtZW50RHR5cGUgIT09IHRoaXMuZWxlbWVudER0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSB0eXBlczsgb3AgZWxlbWVudHMgJHtcbiAgICAgICAgICBlbGVtZW50RHR5cGV9LCBidXQgbGlzdCBlbGVtZW50cyAke3RoaXMuZWxlbWVudER0eXBlfWApO1xuICAgIH1cbiAgICBpZiAoZWxlbWVudEluZGV4IDwgMCB8fCBlbGVtZW50SW5kZXggPiB0aGlzLnRlbnNvcnMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byBhY2Nlc3MgZWxlbWVudCAke1xuICAgICAgICAgIGVsZW1lbnRJbmRleH0gaW4gYSBsaXN0IHdpdGggJHt0aGlzLnRlbnNvcnMubGVuZ3RofSBlbGVtZW50cy5gKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50ZW5zb3JzW2VsZW1lbnRJbmRleF0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBlbGVtZW50IGF0IGluZGV4ICR7ZWxlbWVudEluZGV4fSBpcyBudWxsLmApO1xuICAgIH1cblxuICAgIGFzc2VydFNoYXBlc01hdGNoQWxsb3dVbmRlZmluZWRTaXplKFxuICAgICAgICB0aGlzLnRlbnNvcnNbZWxlbWVudEluZGV4XS5zaGFwZSwgZWxlbWVudFNoYXBlLFxuICAgICAgICAnVGVuc29yTGlzdCBzaGFwZSBtaXNtYXRjaDogJyk7XG4gICAgY29uc3Qgb3V0cHV0RWxlbWVudFNoYXBlID1cbiAgICAgICAgaW5mZXJFbGVtZW50U2hhcGUodGhpcy5lbGVtZW50U2hhcGUsIHRoaXMudGVuc29ycywgZWxlbWVudFNoYXBlKTtcbiAgICByZXR1cm4gcmVzaGFwZSh0aGlzLnRlbnNvcnNbZWxlbWVudEluZGV4XSwgb3V0cHV0RWxlbWVudFNoYXBlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdGhlIHRlbnNvciBhdCB0aGUgaW5kZXhcbiAgICogQHBhcmFtIGVsZW1lbnRJbmRleCBpbmRleCBvZiB0aGUgdGVuc29yXG4gICAqIEBwYXJhbSB0ZW5zb3IgdGhlIHRlbnNvciB0byBiZSBpbnNlcnRlZCBpbnRvIHRoZSBsaXN0XG4gICAqL1xuICBzZXRJdGVtKGVsZW1lbnRJbmRleDogbnVtYmVyLCB0ZW5zb3I6IFRlbnNvcikge1xuICAgIGlmICh0ZW5zb3IuZHR5cGUgIT09IHRoaXMuZWxlbWVudER0eXBlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgZGF0YSB0eXBlczsgb3AgZWxlbWVudHMgJHtcbiAgICAgICAgICB0ZW5zb3IuZHR5cGV9LCBidXQgbGlzdCBlbGVtZW50cyAke3RoaXMuZWxlbWVudER0eXBlfWApO1xuICAgIH1cblxuICAgIGlmIChlbGVtZW50SW5kZXggPCAwIHx8XG4gICAgICAgIHRoaXMubWF4TnVtRWxlbWVudHMgIT09IC0xICYmIGVsZW1lbnRJbmRleCA+PSB0aGlzLm1heE51bUVsZW1lbnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYFRyeWluZyB0byBzZXQgZWxlbWVudCAke1xuICAgICAgICAgIGVsZW1lbnRJbmRleH0gaW4gYSBsaXN0IHdpdGggbWF4ICR7dGhpcy5tYXhOdW1FbGVtZW50c30gZWxlbWVudHMuYCk7XG4gICAgfVxuXG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIHRoaXMuZWxlbWVudFNoYXBlLCB0ZW5zb3Iuc2hhcGUsICdUZW5zb3JMaXN0IHNoYXBlIG1pc21hdGNoOiAnKTtcbiAgICBrZWVwKHRlbnNvcik7XG5cbiAgICAvLyBkaXNwb3NlIHRoZSBwcmV2aW91cyB2YWx1ZSBpZiBpdCBpcyByZXBsYWNpbmcuXG4gICAgaWYgKHRoaXMudGVuc29yc1tlbGVtZW50SW5kZXhdICE9IG51bGwpIHtcbiAgICAgIHRoaXMudGVuc29yc1tlbGVtZW50SW5kZXhdLmtlcHQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnRlbnNvcnNbZWxlbWVudEluZGV4XSA9IHRlbnNvcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXR1cm4gc2VsZWN0ZWQgdmFsdWVzIGluIHRoZSBUZW5zb3JMaXN0IGFzIGEgc3RhY2tlZCBUZW5zb3IuIEFsbCBvZlxuICAgKiBzZWxlY3RlZCB2YWx1ZXMgbXVzdCBoYXZlIGJlZW4gd3JpdHRlbiBhbmQgdGhlaXIgc2hhcGVzIG11c3QgYWxsIG1hdGNoLlxuICAgKiBAcGFyYW0gaW5kaWNlcyBpbmRpY2VzIG9mIHRlbnNvcnMgdG8gZ2F0aGVyXG4gICAqIEBwYXJhbSBlbGVtZW50RHR5cGUgb3V0cHV0IHRlbnNvciBkdHlwZVxuICAgKiBAcGFyYW0gZWxlbWVudFNoYXBlIG91dHB1dCB0ZW5zb3IgZWxlbWVudCBzaGFwZVxuICAgKi9cbiAgZ2F0aGVyKGluZGljZXM6IG51bWJlcltdLCBlbGVtZW50RHR5cGU6IERhdGFUeXBlLCBlbGVtZW50U2hhcGU6IG51bWJlcltdKTpcbiAgICAgIFRlbnNvciB7XG4gICAgaWYgKGVsZW1lbnREdHlwZSAhPT0gdGhpcy5lbGVtZW50RHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBkYXRhIHR5cGVzOyBvcCBlbGVtZW50cyAke1xuICAgICAgICAgIGVsZW1lbnREdHlwZX0sIGJ1dCBsaXN0IGVsZW1lbnRzICR7dGhpcy5lbGVtZW50RHR5cGV9YCk7XG4gICAgfVxuXG4gICAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICAgIHRoaXMuZWxlbWVudFNoYXBlLCBlbGVtZW50U2hhcGUsICdUZW5zb3JMaXN0IHNoYXBlIG1pc21hdGNoOiAnKTtcblxuICAgIC8vIFdoZW4gaW5kaWNlcyBpcyBncmVhdGVyIHRoYW4gdGhlIHNpemUgb2YgdGhlIGxpc3QsIGluZGljZXMgYmV5b25kIHRoZVxuICAgIC8vIHNpemUgb2YgdGhlIGxpc3QgYXJlIGlnbm9yZWQuXG4gICAgaW5kaWNlcyA9IGluZGljZXMuc2xpY2UoMCwgdGhpcy5zaXplKCkpO1xuICAgIGNvbnN0IG91dHB1dEVsZW1lbnRTaGFwZSA9XG4gICAgICAgIGluZmVyRWxlbWVudFNoYXBlKHRoaXMuZWxlbWVudFNoYXBlLCB0aGlzLnRlbnNvcnMsIGVsZW1lbnRTaGFwZSk7XG4gICAgaWYgKGluZGljZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGVuc29yKFtdLCBbMF0uY29uY2F0KG91dHB1dEVsZW1lbnRTaGFwZSkpO1xuICAgIH1cblxuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHRlbnNvcnMgPVxuICAgICAgICAgIGluZGljZXMubWFwKGkgPT4gcmVzaGFwZSh0aGlzLnRlbnNvcnNbaV0sIG91dHB1dEVsZW1lbnRTaGFwZSkpO1xuICAgICAgcmV0dXJuIHN0YWNrKHRlbnNvcnMsIDApO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgdmFsdWVzIGluIHRoZSBUZW5zb3JMaXN0IGFzIGEgY29uY2F0ZW5hdGVkIFRlbnNvci5cbiAgICogQHBhcmFtIGVsZW1lbnREdHlwZSBvdXRwdXQgdGVuc29yIGR0eXBlXG4gICAqIEBwYXJhbSBlbGVtZW50U2hhcGUgb3V0cHV0IHRlbnNvciBlbGVtZW50IHNoYXBlXG4gICAqL1xuICBjb25jYXQoZWxlbWVudER0eXBlOiBEYXRhVHlwZSwgZWxlbWVudFNoYXBlOiBudW1iZXJbXSk6IFRlbnNvciB7XG4gICAgaWYgKCEhZWxlbWVudER0eXBlICYmIGVsZW1lbnREdHlwZSAhPT0gdGhpcy5lbGVtZW50RHR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgVGVuc29yTGlzdCBkdHlwZSBpcyAke1xuICAgICAgICAgIHRoaXMuZWxlbWVudER0eXBlfSBidXQgY29uY2F0IHJlcXVlc3RlZCBkdHlwZSAke2VsZW1lbnREdHlwZX1gKTtcbiAgICB9XG5cbiAgICBhc3NlcnRTaGFwZXNNYXRjaEFsbG93VW5kZWZpbmVkU2l6ZShcbiAgICAgICAgdGhpcy5lbGVtZW50U2hhcGUsIGVsZW1lbnRTaGFwZSwgJ1RlbnNvckxpc3Qgc2hhcGUgbWlzbWF0Y2g6ICcpO1xuICAgIGNvbnN0IG91dHB1dEVsZW1lbnRTaGFwZSA9XG4gICAgICAgIGluZmVyRWxlbWVudFNoYXBlKHRoaXMuZWxlbWVudFNoYXBlLCB0aGlzLnRlbnNvcnMsIGVsZW1lbnRTaGFwZSk7XG5cbiAgICBpZiAodGhpcy5zaXplKCkgPT09IDApIHtcbiAgICAgIHJldHVybiB0ZW5zb3IoW10sIFswXS5jb25jYXQob3V0cHV0RWxlbWVudFNoYXBlKSk7XG4gICAgfVxuICAgIHJldHVybiB0aWR5KCgpID0+IHtcbiAgICAgIGNvbnN0IHRlbnNvcnMgPSB0aGlzLnRlbnNvcnMubWFwKHQgPT4gcmVzaGFwZSh0LCBvdXRwdXRFbGVtZW50U2hhcGUpKTtcbiAgICAgIHJldHVybiBjb25jYXQodGVuc29ycywgMCk7XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBDcmVhdGVzIGEgVGVuc29yTGlzdCB3aGljaCwgd2hlbiBzdGFja2VkLCBoYXMgdGhlIHZhbHVlIG9mIHRlbnNvci5cbiAqIEBwYXJhbSB0ZW5zb3IgZnJvbSB0ZW5zb3JcbiAqIEBwYXJhbSBlbGVtZW50U2hhcGUgb3V0cHV0IHRlbnNvciBlbGVtZW50IHNoYXBlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmcm9tVGVuc29yKFxuICAgIHRlbnNvcjogVGVuc29yLCBlbGVtZW50U2hhcGU6IG51bWJlcltdLCBlbGVtZW50RHR5cGU6IERhdGFUeXBlKSB7XG4gIGNvbnN0IGR0eXBlID0gdGVuc29yLmR0eXBlO1xuICBpZiAodGVuc29yLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUZW5zb3IgbXVzdCBiZSBhdCBsZWFzdCBhIHZlY3RvciwgYnV0IHNhdyBzaGFwZTogJHt0ZW5zb3Iuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKHRlbnNvci5kdHlwZSAhPT0gZWxlbWVudER0eXBlKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGRhdGEgdHlwZXM7IG9wIGVsZW1lbnRzICR7XG4gICAgICAgIHRlbnNvci5kdHlwZX0sIGJ1dCBsaXN0IGVsZW1lbnRzICR7ZWxlbWVudER0eXBlfWApO1xuICB9XG4gIGNvbnN0IHRlbnNvckVsZW1lbnRTaGFwZSA9IHRlbnNvci5zaGFwZS5zbGljZSgxKTtcbiAgYXNzZXJ0U2hhcGVzTWF0Y2hBbGxvd1VuZGVmaW5lZFNpemUoXG4gICAgICB0ZW5zb3JFbGVtZW50U2hhcGUsIGVsZW1lbnRTaGFwZSwgJ1RlbnNvckxpc3Qgc2hhcGUgbWlzbWF0Y2g6ICcpO1xuICBjb25zdCB0ZW5zb3JMaXN0OiBUZW5zb3JbXSA9IHVuc3RhY2sodGVuc29yKTtcbiAgcmV0dXJuIG5ldyBUZW5zb3JMaXN0KHRlbnNvckxpc3QsIGVsZW1lbnRTaGFwZSwgZHR5cGUpO1xufVxuXG4vKipcbiAqIFJldHVybiBhIFRlbnNvckxpc3Qgb2YgdGhlIGdpdmVuIHNpemUgd2l0aCBlbXB0eSBlbGVtZW50cy5cbiAqIEBwYXJhbSBlbGVtZW50U2hhcGUgdGhlIHNoYXBlIG9mIHRoZSBmdXR1cmUgZWxlbWVudHMgb2YgdGhlIGxpc3RcbiAqIEBwYXJhbSBlbGVtZW50RHR5cGUgdGhlIGRlc2lyZWQgdHlwZSBvZiBlbGVtZW50cyBpbiB0aGUgbGlzdFxuICogQHBhcmFtIG51bUVsZW1lbnRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgdG8gcmVzZXJ2ZVxuICogQHBhcmFtIG1heE51bUVsZW1lbnRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aCBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXNlcnZlKFxuICAgIGVsZW1lbnRTaGFwZTogbnVtYmVyW10sIGVsZW1lbnREdHlwZTogRGF0YVR5cGUsIG51bUVsZW1lbnRzOiBudW1iZXIsXG4gICAgbWF4TnVtRWxlbWVudHM6IG51bWJlcikge1xuICByZXR1cm4gbmV3IFRlbnNvckxpc3QoW10sIGVsZW1lbnRTaGFwZSwgZWxlbWVudER0eXBlLCBtYXhOdW1FbGVtZW50cyk7XG59XG5cbi8qKlxuICogUHV0IHRlbnNvcnMgYXQgc3BlY2lmaWMgaW5kaWNlcyBvZiBhIHN0YWNrZWQgdGVuc29yIGludG8gYSBUZW5zb3JMaXN0LlxuICogQHBhcmFtIGluZGljZXMgbGlzdCBvZiBpbmRpY2VzIG9uIGhvdyB0byBzY2F0dGVyIHRoZSB0ZW5zb3IuXG4gKiBAcGFyYW0gdGVuc29yIGlucHV0IHRlbnNvci5cbiAqIEBwYXJhbSBlbGVtZW50U2hhcGUgdGhlIHNoYXBlIG9mIHRoZSBmdXR1cmUgZWxlbWVudHMgb2YgdGhlIGxpc3RcbiAqIEBwYXJhbSBudW1FbGVtZW50cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNjYXR0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXIoXG4gICAgdGVuc29yOiBUZW5zb3IsIGluZGljZXM6IG51bWJlcltdLCBlbGVtZW50U2hhcGU6IG51bWJlcltdLFxuICAgIG51bUVsZW1lbnRzPzogbnVtYmVyKTogVGVuc29yTGlzdCB7XG4gIGlmIChpbmRpY2VzLmxlbmd0aCAhPT0gdGVuc29yLnNoYXBlWzBdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBsZW4oaW5kaWNlcykgPT0gdGVuc29yLnNoYXBlWzBdLCBidXQgc2F3OiAke1xuICAgICAgICBpbmRpY2VzLmxlbmd0aH0gdnMuICR7dGVuc29yLnNoYXBlWzBdfWApO1xuICB9XG5cbiAgY29uc3QgbWF4SW5kZXggPSBNYXRoLm1heCguLi5pbmRpY2VzKTtcblxuICBpZiAobnVtRWxlbWVudHMgIT0gbnVsbCAmJiBudW1FbGVtZW50cyAhPT0gLTEgJiYgbWF4SW5kZXggPj0gbnVtRWxlbWVudHMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBNYXggaW5kZXggbXVzdCBiZSA8IGFycmF5IHNpemUgKCR7bWF4SW5kZXh9ICB2cy4gJHtudW1FbGVtZW50c30pYCk7XG4gIH1cblxuICBjb25zdCBsaXN0ID0gbmV3IFRlbnNvckxpc3QoW10sIGVsZW1lbnRTaGFwZSwgdGVuc29yLmR0eXBlLCBudW1FbGVtZW50cyk7XG4gIGNvbnN0IHRlbnNvcnMgPSB1bnN0YWNrKHRlbnNvciwgMCk7XG4gIGluZGljZXMuZm9yRWFjaCgodmFsdWUsIGluZGV4KSA9PiB7XG4gICAgbGlzdC5zZXRJdGVtKHZhbHVlLCB0ZW5zb3JzW2luZGV4XSk7XG4gIH0pO1xuICByZXR1cm4gbGlzdDtcbn1cblxuLyoqXG4gKiBTcGxpdCB0aGUgdmFsdWVzIG9mIGEgVGVuc29yIGludG8gYSBUZW5zb3JMaXN0LlxuICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RocyB0byB1c2Ugd2hlbiBzcGxpdHRpbmcgdmFsdWUgYWxvbmdcbiAqICAgIGl0cyBmaXJzdCBkaW1lbnNpb24uXG4gKiBAcGFyYW0gdGVuc29yIHRoZSB0ZW5zb3IgdG8gc3BsaXQuXG4gKiBAcGFyYW0gZWxlbWVudFNoYXBlIHRoZSBzaGFwZSBvZiB0aGUgZnV0dXJlIGVsZW1lbnRzIG9mIHRoZSBsaXN0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzcGxpdChcbiAgICB0ZW5zb3I6IFRlbnNvciwgbGVuZ3RoOiBudW1iZXJbXSwgZWxlbWVudFNoYXBlOiBudW1iZXJbXSkge1xuICBsZXQgdG90YWxMZW5ndGggPSAwO1xuICBjb25zdCBjdW11bGF0aXZlTGVuZ3RocyA9IGxlbmd0aC5tYXAobGVuID0+IHtcbiAgICB0b3RhbExlbmd0aCArPSBsZW47XG4gICAgcmV0dXJuIHRvdGFsTGVuZ3RoO1xuICB9KTtcblxuICBpZiAodG90YWxMZW5ndGggIT09IHRlbnNvci5zaGFwZVswXSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgc3VtIG9mIGxlbmd0aHMgdG8gYmUgZXF1YWwgdG9cbiAgICAgICAgICB0ZW5zb3Iuc2hhcGVbMF0sIGJ1dCBzdW0gb2YgbGVuZ3RocyBpc1xuICAgICAgICAke3RvdGFsTGVuZ3RofSwgYW5kIHRlbnNvcidzIHNoYXBlIGlzOiAke3RlbnNvci5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0IHNoYXBlV2l0aG91dEZpcnN0RGltID0gdGVuc29yLnNoYXBlLnNsaWNlKDEpO1xuICBjb25zdCBvdXRwdXRFbGVtZW50U2hhcGUgPVxuICAgICAgbWVyZ2VFbGVtZW50U2hhcGUoc2hhcGVXaXRob3V0Rmlyc3REaW0sIGVsZW1lbnRTaGFwZSk7XG4gIGNvbnN0IGVsZW1lbnRQZXJSb3cgPSB0b3RhbExlbmd0aCA9PT0gMCA/IDAgOiB0ZW5zb3Iuc2l6ZSAvIHRvdGFsTGVuZ3RoO1xuICBjb25zdCB0ZW5zb3JzOiBUZW5zb3JbXSA9IHRpZHkoKCkgPT4ge1xuICAgIGNvbnN0IHRlbnNvcnMgPSBbXTtcbiAgICB0ZW5zb3IgPSByZXNoYXBlKHRlbnNvciwgWzEsIHRvdGFsTGVuZ3RoLCBlbGVtZW50UGVyUm93XSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGgubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHByZXZpb3VzTGVuZ3RoID0gKGkgPT09IDApID8gMCA6IGN1bXVsYXRpdmVMZW5ndGhzW2kgLSAxXTtcbiAgICAgIGNvbnN0IGluZGljZXMgPSBbMCwgcHJldmlvdXNMZW5ndGgsIDBdO1xuICAgICAgY29uc3Qgc2l6ZXMgPSBbMSwgbGVuZ3RoW2ldLCBlbGVtZW50UGVyUm93XTtcbiAgICAgIHRlbnNvcnNbaV0gPSByZXNoYXBlKFxuICAgICAgICAgIHNsaWNlKHRlbnNvciwgaW5kaWNlcywgc2l6ZXMpLCBvdXRwdXRFbGVtZW50U2hhcGUgYXMgbnVtYmVyW10pO1xuICAgIH1cbiAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgIHJldHVybiB0ZW5zb3JzO1xuICB9KTtcblxuICBjb25zdCBsaXN0ID0gbmV3IFRlbnNvckxpc3QoW10sIGVsZW1lbnRTaGFwZSwgdGVuc29yLmR0eXBlLCBsZW5ndGgubGVuZ3RoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHRlbnNvcnMubGVuZ3RoOyBpKyspIHtcbiAgICBsaXN0LnNldEl0ZW0oaSwgdGVuc29yc1tpXSk7XG4gIH1cbiAgcmV0dXJuIGxpc3Q7XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { scalar } from '@tensorflow/tfjs-core';\nimport { TensorArray } from '../../executor/tensor_array';\nimport { fromTensor, reserve, scatter, split } from '../../executor/tensor_list';\nimport { cloneTensor, getParamValue, getTensor } from './utils';\nexport const executeOp = async (node, tensorMap, context) => {\n    switch (node.op) {\n        case 'If':\n        case 'StatelessIf': {\n            const thenFunc = getParamValue('thenBranch', node, tensorMap, context);\n            const elseFunc = getParamValue('elseBranch', node, tensorMap, context);\n            const cond = getParamValue('cond', node, tensorMap, context);\n            const args = getParamValue('args', node, tensorMap, context);\n            const condValue = await cond.data();\n            if (condValue[0]) {\n                return context.functionMap[thenFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap);\n            }\n            else {\n                return context.functionMap[elseFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap);\n            }\n        }\n        case 'While':\n        case 'StatelessWhile': {\n            const bodyFunc = getParamValue('body', node, tensorMap, context);\n            const condFunc = getParamValue('cond', node, tensorMap, context);\n            const args = getParamValue('args', node, tensorMap, context);\n            // Calculate the condition of the loop\n            const condResult = (await context.functionMap[condFunc].executeFunctionAsync(args, context.tensorArrayMap, context.tensorListMap));\n            const argIds = args.map(tensor => tensor.id);\n            let condValue = await condResult[0].data();\n            // Dispose the intermediate tensors for condition function\n            condResult.forEach(tensor => {\n                if (!tensor.kept && argIds.indexOf(tensor.id) === -1) {\n                    tensor.dispose();\n                }\n            });\n            let result = args;\n            while (condValue[0]) {\n                // Record the previous result for intermediate tensor tracking\n                const origResult = result;\n                // Execution the body of the loop\n                result = await context.functionMap[bodyFunc].executeFunctionAsync(result, context.tensorArrayMap, context.tensorListMap);\n                const resultIds = result.map(tensor => tensor.id);\n                // Dispose the intermediate tensor for body function that is not global\n                // kept, not input/output of the body function\n                origResult.forEach(tensor => {\n                    if (!tensor.kept && argIds.indexOf(tensor.id) === -1 &&\n                        resultIds.indexOf(tensor.id) === -1) {\n                        tensor.dispose();\n                    }\n                });\n                // Recalcuate the condition of the loop using the latest results.\n                const condResult = (await context.functionMap[condFunc].executeFunctionAsync(result, context.tensorArrayMap, context.tensorListMap));\n                condValue = await condResult[0].data();\n                // Dispose the intermediate tensors for condition function\n                condResult.forEach(tensor => {\n                    if (!tensor.kept && argIds.indexOf(tensor.id) === -1 &&\n                        resultIds.indexOf(tensor.id) === -1) {\n                        tensor.dispose();\n                    }\n                });\n            }\n            return result;\n        }\n        case 'LoopCond': {\n            const pred = getParamValue('pred', node, tensorMap, context);\n            return [cloneTensor(pred)];\n        }\n        case 'Switch': {\n            const pred = getParamValue('pred', node, tensorMap, context);\n            let data = getParamValue('data', node, tensorMap, context);\n            if (!data.kept) {\n                data = cloneTensor(data);\n            }\n            // Outputs nodes :0 => false, :1 => true\n            return (await pred.data())[0] ? [undefined, data] : [data, undefined];\n        }\n        case 'Merge': {\n            const inputName = node.inputNames.find(name => getTensor(name, tensorMap, context) !== undefined);\n            if (inputName) {\n                const data = getTensor(inputName, tensorMap, context);\n                return [cloneTensor(data)];\n            }\n            return undefined;\n        }\n        case 'Enter': {\n            const frameId = getParamValue('frameName', node, tensorMap, context);\n            const data = getParamValue('tensor', node, tensorMap, context);\n            context.enterFrame(frameId);\n            return [cloneTensor(data)];\n        }\n        case 'Exit': {\n            const data = getParamValue('tensor', node, tensorMap, context);\n            context.exitFrame();\n            return [cloneTensor(data)];\n        }\n        case 'NextIteration': {\n            const data = getParamValue('tensor', node, tensorMap, context);\n            context.nextIteration();\n            return [cloneTensor(data)];\n        }\n        case 'TensorArrayV3': {\n            const size = getParamValue('size', node, tensorMap, context);\n            const dtype = getParamValue('dtype', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const dynamicSize = getParamValue('dynamicSize', node, tensorMap, context);\n            const clearAfterRead = getParamValue('clearAfterRead', node, tensorMap, context);\n            const identicalElementShapes = getParamValue('identicalElementShapes', node, tensorMap, context);\n            const name = getParamValue('name', node, tensorMap, context);\n            const tensorArray = new TensorArray(name, dtype, size, elementShape, identicalElementShapes, dynamicSize, clearAfterRead);\n            context.addTensorArray(tensorArray);\n            return [tensorArray.idTensor, scalar(1.0)];\n        }\n        case 'TensorArrayWriteV3': {\n            const id = getParamValue('tensorArrayId', node, tensorMap, context);\n            const index = getParamValue('index', node, tensorMap, context);\n            const writeTensor = getParamValue('tensor', node, tensorMap, context);\n            const writeTensorArray = context.getTensorArray(id.id);\n            writeTensorArray.write(index, writeTensor);\n            return [writeTensorArray.idTensor];\n        }\n        case 'TensorArrayReadV3': {\n            const readId = getParamValue('tensorArrayId', node, tensorMap, context);\n            const readIndex = getParamValue('index', node, tensorMap, context);\n            const readTensorArray = context.getTensorArray(readId.id);\n            return [readTensorArray.read(readIndex)];\n        }\n        case 'TensorArrayGatherV3': {\n            const gatherId = getParamValue('tensorArrayId', node, tensorMap, context);\n            const gatherIndices = getParamValue('indices', node, tensorMap, context);\n            const gatherDtype = getParamValue('dtype', node, tensorMap, context);\n            const gatherTensorArray = context.getTensorArray(gatherId.id);\n            return [gatherTensorArray.gather(gatherIndices, gatherDtype)];\n        }\n        case 'TensorArrayScatterV3': {\n            const scatterId = getParamValue('tensorArrayId', node, tensorMap, context);\n            const scatterIndices = getParamValue('indices', node, tensorMap, context);\n            const scatterTensor = getParamValue('tensor', node, tensorMap, context);\n            const scatterTensorArray = context.getTensorArray(scatterId.id);\n            scatterTensorArray.scatter(scatterIndices, scatterTensor);\n            return [scatterTensorArray.idTensor];\n        }\n        case 'TensorArrayConcatV3': {\n            const concatId = getParamValue('tensorArrayId', node, tensorMap, context);\n            const concatTensorArray = context.getTensorArray(concatId.id);\n            const concatDtype = getParamValue('dtype', node, tensorMap, context);\n            return [concatTensorArray.concat(concatDtype)];\n        }\n        case 'TensorArraySplitV3': {\n            const splitId = getParamValue('tensorArrayId', node, tensorMap, context);\n            const splitTensor = getParamValue('tensor', node, tensorMap, context);\n            const lengths = getParamValue('lengths', node, tensorMap, context);\n            const splitTensorArray = context.getTensorArray(splitId.id);\n            splitTensorArray.split(lengths, splitTensor);\n            return [splitTensorArray.idTensor];\n        }\n        case 'TensorArraySizeV3': {\n            const sizeId = getParamValue('tensorArrayId', node, tensorMap, context);\n            const sizeTensorArray = context.getTensorArray(sizeId.id);\n            return [scalar(sizeTensorArray.size(), 'int32')];\n        }\n        case 'TensorArrayCloseV3': {\n            const closeId = getParamValue('tensorArrayId', node, tensorMap, context);\n            const closeTensorArray = context.getTensorArray(closeId.id);\n            closeTensorArray.clearAndClose();\n            return [closeTensorArray.idTensor];\n        }\n        case 'TensorListSetItem': {\n            const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n            const index = getParamValue('index', node, tensorMap, context);\n            const writeTensor = getParamValue('tensor', node, tensorMap, context);\n            const tensorList = context.getTensorList(idTensor.id);\n            tensorList.setItem(index, writeTensor);\n            return [tensorList.idTensor];\n        }\n        case 'TensorListGetItem': {\n            const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n            const readIndex = getParamValue('index', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const elementDType = getParamValue('elementDType', node, tensorMap, context);\n            const tensorList = context.getTensorList(idTensor.id);\n            return [tensorList.getItem(readIndex, elementShape, elementDType)];\n        }\n        case 'TensorListScatterV2':\n        case 'TensorListScatter': {\n            const scatterIndices = getParamValue('indices', node, tensorMap, context);\n            const scatterTensor = getParamValue('tensor', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const numElements = getParamValue('numElements', node, tensorMap, context);\n            const tensorList = scatter(scatterTensor, scatterIndices, elementShape, numElements);\n            context.addTensorList(tensorList);\n            return [tensorList.idTensor];\n        }\n        case 'TensorListReserve':\n        case 'EmptyTensorList': {\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const elementDtype = getParamValue('elementDType', node, tensorMap, context);\n            let numElementsParam;\n            if (node.op === 'TensorListReserve') {\n                numElementsParam = 'numElements';\n            }\n            else {\n                numElementsParam = 'maxNumElements';\n            }\n            const numElements = getParamValue(numElementsParam, node, tensorMap, context);\n            const maxNumElements = node.op === 'TensorListReserve' ? -1 : numElements;\n            const tensorList = reserve(elementShape, elementDtype, numElements, maxNumElements);\n            context.addTensorList(tensorList);\n            return [tensorList.idTensor];\n        }\n        case 'TensorListGather': {\n            const gatherId = getParamValue('tensorListId', node, tensorMap, context);\n            const gatherIndices = getParamValue('indices', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const elementDtype = getParamValue('elementDType', node, tensorMap, context);\n            const tensorList = context.getTensorList(gatherId.id);\n            return [tensorList.gather(gatherIndices, elementDtype, elementShape)];\n        }\n        case 'TensorListStack': {\n            const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const elementDtype = getParamValue('elementDType', node, tensorMap, context);\n            const numElements = getParamValue('numElements', node, tensorMap, context);\n            const tensorList = context.getTensorList(idTensor.id);\n            return [tensorList.stack(elementShape, elementDtype, numElements)];\n        }\n        case 'TensorListFromTensor': {\n            const tensor = getParamValue('tensor', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const elementDtype = getParamValue('elementDType', node, tensorMap, context);\n            const tensorList = fromTensor(tensor, elementShape, elementDtype);\n            context.addTensorList(tensorList);\n            return [tensorList.idTensor];\n        }\n        case 'TensorListConcat':\n        case 'TensorListConcatV2': {\n            const concatId = getParamValue('tensorListId', node, tensorMap, context);\n            const tensorList = context.getTensorList(concatId.id);\n            const concatDtype = getParamValue('dtype', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            return [tensorList.concat(concatDtype, elementShape)];\n        }\n        case 'TensorListPushBack': {\n            const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n            const writeTensor = getParamValue('tensor', node, tensorMap, context);\n            const tensorList = context.getTensorList(idTensor.id);\n            tensorList.pushBack(writeTensor);\n            return [tensorList.idTensor];\n        }\n        case 'TensorListPopBack': {\n            const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const elementDType = getParamValue('elementDType', node, tensorMap, context);\n            const tensorList = context.getTensorList(idTensor.id);\n            return [tensorList.popBack(elementShape, elementDType)];\n        }\n        case 'TensorListSplit': {\n            const splitTensor = getParamValue('tensor', node, tensorMap, context);\n            const elementShape = getParamValue('elementShape', node, tensorMap, context);\n            const lengths = getParamValue('lengths', node, tensorMap, context);\n            const tensorList = split(splitTensor, lengths, elementShape);\n            context.addTensorList(tensorList);\n            return [tensorList.idTensor];\n        }\n        case 'TensorListLength': {\n            const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n            const tensorList = context.getTensorList(idTensor.id);\n            return [scalar(tensorList.size(), 'int32')];\n        }\n        case 'TensorListResize': {\n            const idTensor = getParamValue('tensorListId', node, tensorMap, context);\n            const size = getParamValue('size', node, tensorMap, context);\n            const srcTensorList = context.getTensorList(idTensor.id);\n            const destTensorList = srcTensorList.resize(size);\n            context.addTensorList(destTensorList);\n            return [destTensorList.idTensor];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'control';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udHJvbF9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9jb250cm9sX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBVyxNQUFNLEVBQVMsTUFBTSx1QkFBdUIsQ0FBQztBQUkvRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRy9FLE9BQU8sRUFBQyxXQUFXLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQTRCLEtBQUssRUFDbkQsSUFBVSxFQUFFLFNBQTBCLEVBQ3RDLE9BQXlCLEVBQXFCLEVBQUU7SUFDbEQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxJQUFJLENBQUM7UUFDVixLQUFLLGFBQWEsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sUUFBUSxHQUNWLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUNwRSxNQUFNLFFBQVEsR0FDVixhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDcEUsTUFBTSxJQUFJLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQ3ZFLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUN6RSxNQUFNLFNBQVMsR0FB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LEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQzdDO1FBQ0QsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sUUFBUSxHQUNWLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUN0RSxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFFdkUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDekQsTUFBTSxjQUFjLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNsRCxPQUFPLENBQUMsYUFBYSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3RDLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDbEM7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIHNjYWxhciwgVGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge05hbWVkVGVuc29yc01hcH0gZnJvbSAnLi4vLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL2V4ZWN1dGlvbl9jb250ZXh0JztcbmltcG9ydCB7VGVuc29yQXJyYXl9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL3RlbnNvcl9hcnJheSc7XG5pbXBvcnQge2Zyb21UZW5zb3IsIHJlc2VydmUsIHNjYXR0ZXIsIHNwbGl0fSBmcm9tICcuLi8uLi9leGVjdXRvci90ZW5zb3JfbGlzdCc7XG5pbXBvcnQge0ludGVybmFsT3BBc3luY0V4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Y2xvbmVUZW5zb3IsIGdldFBhcmFtVmFsdWUsIGdldFRlbnNvcn0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BBc3luY0V4ZWN1dG9yID0gYXN5bmMoXG4gICAgbm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCk6IFByb21pc2U8VGVuc29yW10+ID0+IHtcbiAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgY2FzZSAnSWYnOlxuICAgIGNhc2UgJ1N0YXRlbGVzc0lmJzoge1xuICAgICAgY29uc3QgdGhlbkZ1bmMgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RoZW5CcmFuY2gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGVsc2VGdW5jID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbHNlQnJhbmNoJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBzdHJpbmc7XG4gICAgICBjb25zdCBjb25kID0gZ2V0UGFyYW1WYWx1ZSgnY29uZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgYXJncyA9IGdldFBhcmFtVmFsdWUoJ2FyZ3MnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcltdO1xuICAgICAgY29uc3QgY29uZFZhbHVlID0gYXdhaXQgY29uZC5kYXRhKCk7XG4gICAgICBpZiAoY29uZFZhbHVlWzBdKSB7XG4gICAgICAgIHJldHVybiBjb250ZXh0LmZ1bmN0aW9uTWFwW3RoZW5GdW5jXS5leGVjdXRlRnVuY3Rpb25Bc3luYyhcbiAgICAgICAgICAgIGFyZ3MsIGNvbnRleHQudGVuc29yQXJyYXlNYXAsIGNvbnRleHQudGVuc29yTGlzdE1hcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gY29udGV4dC5mdW5jdGlvbk1hcFtlbHNlRnVuY10uZXhlY3V0ZUZ1bmN0aW9uQXN5bmMoXG4gICAgICAgICAgICBhcmdzLCBjb250ZXh0LnRlbnNvckFycmF5TWFwLCBjb250ZXh0LnRlbnNvckxpc3RNYXApO1xuICAgICAgfVxuICAgIH1cbiAgICBjYXNlICdXaGlsZSc6XG4gICAgY2FzZSAnU3RhdGVsZXNzV2hpbGUnOiB7XG4gICAgICBjb25zdCBib2R5RnVuYyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYm9keScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgY29uZEZ1bmMgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2NvbmQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZztcbiAgICAgIGNvbnN0IGFyZ3MgPSBnZXRQYXJhbVZhbHVlKCdhcmdzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3JbXTtcblxuICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBjb25kaXRpb24gb2YgdGhlIGxvb3BcbiAgICAgIGNvbnN0IGNvbmRSZXN1bHQgPVxuICAgICAgICAgIChhd2FpdCBjb250ZXh0LmZ1bmN0aW9uTWFwW2NvbmRGdW5jXS5leGVjdXRlRnVuY3Rpb25Bc3luYyhcbiAgICAgICAgICAgICAgYXJncywgY29udGV4dC50ZW5zb3JBcnJheU1hcCwgY29udGV4dC50ZW5zb3JMaXN0TWFwKSk7XG4gICAgICBjb25zdCBhcmdJZHMgPSBhcmdzLm1hcCh0ZW5zb3IgPT4gdGVuc29yLmlkKTtcbiAgICAgIGxldCBjb25kVmFsdWUgPSBhd2FpdCBjb25kUmVzdWx0WzBdLmRhdGEoKTtcbiAgICAgIC8vIERpc3Bvc2UgdGhlIGludGVybWVkaWF0ZSB0ZW5zb3JzIGZvciBjb25kaXRpb24gZnVuY3Rpb25cbiAgICAgIGNvbmRSZXN1bHQuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICBpZiAoIXRlbnNvci5rZXB0ICYmIGFyZ0lkcy5pbmRleE9mKHRlbnNvci5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIGxldCByZXN1bHQ6IFRlbnNvcltdID0gYXJncztcblxuICAgICAgd2hpbGUgKGNvbmRWYWx1ZVswXSkge1xuICAgICAgICAvLyBSZWNvcmQgdGhlIHByZXZpb3VzIHJlc3VsdCBmb3IgaW50ZXJtZWRpYXRlIHRlbnNvciB0cmFja2luZ1xuICAgICAgICBjb25zdCBvcmlnUmVzdWx0ID0gcmVzdWx0O1xuICAgICAgICAvLyBFeGVjdXRpb24gdGhlIGJvZHkgb2YgdGhlIGxvb3BcbiAgICAgICAgcmVzdWx0ID0gYXdhaXQgY29udGV4dC5mdW5jdGlvbk1hcFtib2R5RnVuY10uZXhlY3V0ZUZ1bmN0aW9uQXN5bmMoXG4gICAgICAgICAgICByZXN1bHQsIGNvbnRleHQudGVuc29yQXJyYXlNYXAsIGNvbnRleHQudGVuc29yTGlzdE1hcCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdElkcyA9IHJlc3VsdC5tYXAodGVuc29yID0+IHRlbnNvci5pZCk7XG5cbiAgICAgICAgLy8gRGlzcG9zZSB0aGUgaW50ZXJtZWRpYXRlIHRlbnNvciBmb3IgYm9keSBmdW5jdGlvbiB0aGF0IGlzIG5vdCBnbG9iYWxcbiAgICAgICAgLy8ga2VwdCwgbm90IGlucHV0L291dHB1dCBvZiB0aGUgYm9keSBmdW5jdGlvblxuICAgICAgICBvcmlnUmVzdWx0LmZvckVhY2godGVuc29yID0+IHtcbiAgICAgICAgICBpZiAoIXRlbnNvci5rZXB0ICYmIGFyZ0lkcy5pbmRleE9mKHRlbnNvci5pZCkgPT09IC0xICYmXG4gICAgICAgICAgICAgIHJlc3VsdElkcy5pbmRleE9mKHRlbnNvci5pZCkgPT09IC0xKSB7XG4gICAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVjYWxjdWF0ZSB0aGUgY29uZGl0aW9uIG9mIHRoZSBsb29wIHVzaW5nIHRoZSBsYXRlc3QgcmVzdWx0cy5cbiAgICAgICAgY29uc3QgY29uZFJlc3VsdCA9XG4gICAgICAgICAgICAoYXdhaXQgY29udGV4dC5mdW5jdGlvbk1hcFtjb25kRnVuY10uZXhlY3V0ZUZ1bmN0aW9uQXN5bmMoXG4gICAgICAgICAgICAgICAgcmVzdWx0LCBjb250ZXh0LnRlbnNvckFycmF5TWFwLCBjb250ZXh0LnRlbnNvckxpc3RNYXApKTtcbiAgICAgICAgY29uZFZhbHVlID0gYXdhaXQgY29uZFJlc3VsdFswXS5kYXRhKCk7XG4gICAgICAgIC8vIERpc3Bvc2UgdGhlIGludGVybWVkaWF0ZSB0ZW5zb3JzIGZvciBjb25kaXRpb24gZnVuY3Rpb25cbiAgICAgICAgY29uZFJlc3VsdC5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICAgICAgaWYgKCF0ZW5zb3Iua2VwdCAmJiBhcmdJZHMuaW5kZXhPZih0ZW5zb3IuaWQpID09PSAtMSAmJlxuICAgICAgICAgICAgICByZXN1bHRJZHMuaW5kZXhPZih0ZW5zb3IuaWQpID09PSAtMSkge1xuICAgICAgICAgICAgdGVuc29yLmRpc3Bvc2UoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FzZSAnTG9vcENvbmQnOiB7XG4gICAgICBjb25zdCBwcmVkID0gZ2V0UGFyYW1WYWx1ZSgncHJlZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihwcmVkKV07XG4gICAgfVxuICAgIGNhc2UgJ1N3aXRjaCc6IHtcbiAgICAgIGNvbnN0IHByZWQgPSBnZXRQYXJhbVZhbHVlKCdwcmVkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBsZXQgZGF0YSA9IGdldFBhcmFtVmFsdWUoJ2RhdGEnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGlmICghZGF0YS5rZXB0KSB7XG4gICAgICAgIGRhdGEgPSBjbG9uZVRlbnNvcihkYXRhKTtcbiAgICAgIH1cbiAgICAgIC8vIE91dHB1dHMgbm9kZXMgOjAgPT4gZmFsc2UsIDoxID0+IHRydWVcbiAgICAgIHJldHVybiAoYXdhaXQgcHJlZC5kYXRhKCkpWzBdID8gW3VuZGVmaW5lZCwgZGF0YV0gOiBbZGF0YSwgdW5kZWZpbmVkXTtcbiAgICB9XG4gICAgY2FzZSAnTWVyZ2UnOiB7XG4gICAgICBjb25zdCBpbnB1dE5hbWUgPSBub2RlLmlucHV0TmFtZXMuZmluZChcbiAgICAgICAgICBuYW1lID0+IGdldFRlbnNvcihuYW1lLCB0ZW5zb3JNYXAsIGNvbnRleHQpICE9PSB1bmRlZmluZWQpO1xuICAgICAgaWYgKGlucHV0TmFtZSkge1xuICAgICAgICBjb25zdCBkYXRhID0gZ2V0VGVuc29yKGlucHV0TmFtZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihkYXRhKV07XG4gICAgICB9XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjYXNlICdFbnRlcic6IHtcbiAgICAgIGNvbnN0IGZyYW1lSWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ZyYW1lTmFtZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgZGF0YSA9IGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29udGV4dC5lbnRlckZyYW1lKGZyYW1lSWQpO1xuICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihkYXRhKV07XG4gICAgfVxuICAgIGNhc2UgJ0V4aXQnOiB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb250ZXh0LmV4aXRGcmFtZSgpO1xuICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihkYXRhKV07XG4gICAgfVxuICAgIGNhc2UgJ05leHRJdGVyYXRpb24nOiB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb250ZXh0Lm5leHRJdGVyYXRpb24oKTtcbiAgICAgIHJldHVybiBbY2xvbmVUZW5zb3IoZGF0YSldO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JBcnJheVYzJzoge1xuICAgICAgY29uc3Qgc2l6ZSA9IGdldFBhcmFtVmFsdWUoJ3NpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgIGNvbnN0IGR0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCBlbGVtZW50U2hhcGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnRTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBkeW5hbWljU2l6ZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHluYW1pY1NpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIGJvb2xlYW47XG4gICAgICBjb25zdCBjbGVhckFmdGVyUmVhZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY2xlYXJBZnRlclJlYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIGJvb2xlYW47XG4gICAgICBjb25zdCBpZGVudGljYWxFbGVtZW50U2hhcGVzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpZGVudGljYWxFbGVtZW50U2hhcGVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgIGJvb2xlYW47XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UGFyYW1WYWx1ZSgnbmFtZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgdGVuc29yQXJyYXkgPSBuZXcgVGVuc29yQXJyYXkoXG4gICAgICAgICAgbmFtZSwgZHR5cGUsIHNpemUsIGVsZW1lbnRTaGFwZSwgaWRlbnRpY2FsRWxlbWVudFNoYXBlcywgZHluYW1pY1NpemUsXG4gICAgICAgICAgY2xlYXJBZnRlclJlYWQpO1xuICAgICAgY29udGV4dC5hZGRUZW5zb3JBcnJheSh0ZW5zb3JBcnJheSk7XG4gICAgICByZXR1cm4gW3RlbnNvckFycmF5LmlkVGVuc29yLCBzY2FsYXIoMS4wKV07XG4gICAgfVxuICAgIGNhc2UgJ1RlbnNvckFycmF5V3JpdGVWMyc6IHtcbiAgICAgIGNvbnN0IGlkID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JBcnJheUlkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCBpbmRleCA9IGdldFBhcmFtVmFsdWUoJ2luZGV4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICBjb25zdCB3cml0ZVRlbnNvciA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCB3cml0ZVRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShpZC5pZCk7XG4gICAgICB3cml0ZVRlbnNvckFycmF5LndyaXRlKGluZGV4LCB3cml0ZVRlbnNvcik7XG4gICAgICByZXR1cm4gW3dyaXRlVGVuc29yQXJyYXkuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JBcnJheVJlYWRWMyc6IHtcbiAgICAgIGNvbnN0IHJlYWRJZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yQXJyYXlJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgcmVhZEluZGV4ID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRleCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgcmVhZFRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShyZWFkSWQuaWQpO1xuICAgICAgcmV0dXJuIFtyZWFkVGVuc29yQXJyYXkucmVhZChyZWFkSW5kZXgpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlHYXRoZXJWMyc6IHtcbiAgICAgIGNvbnN0IGdhdGhlcklkID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JBcnJheUlkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCBnYXRoZXJJbmRpY2VzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRpY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgIGNvbnN0IGdhdGhlckR0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCBnYXRoZXJUZW5zb3JBcnJheSA9IGNvbnRleHQuZ2V0VGVuc29yQXJyYXkoZ2F0aGVySWQuaWQpO1xuICAgICAgcmV0dXJuIFtnYXRoZXJUZW5zb3JBcnJheS5nYXRoZXIoZ2F0aGVySW5kaWNlcywgZ2F0aGVyRHR5cGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlTY2F0dGVyVjMnOiB7XG4gICAgICBjb25zdCBzY2F0dGVySWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckFycmF5SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHNjYXR0ZXJJbmRpY2VzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRpY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgIGNvbnN0IHNjYXR0ZXJUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3Qgc2NhdHRlclRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShzY2F0dGVySWQuaWQpO1xuICAgICAgc2NhdHRlclRlbnNvckFycmF5LnNjYXR0ZXIoc2NhdHRlckluZGljZXMsIHNjYXR0ZXJUZW5zb3IpO1xuICAgICAgcmV0dXJuIFtzY2F0dGVyVGVuc29yQXJyYXkuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JBcnJheUNvbmNhdFYzJzoge1xuICAgICAgY29uc3QgY29uY2F0SWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckFycmF5SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IGNvbmNhdFRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShjb25jYXRJZC5pZCk7XG4gICAgICBjb25zdCBjb25jYXREdHlwZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgcmV0dXJuIFtjb25jYXRUZW5zb3JBcnJheS5jb25jYXQoY29uY2F0RHR5cGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlTcGxpdFYzJzoge1xuICAgICAgY29uc3Qgc3BsaXRJZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yQXJyYXlJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3Qgc3BsaXRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgbGVuZ3RocyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbGVuZ3RocycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBzcGxpdFRlbnNvckFycmF5ID0gY29udGV4dC5nZXRUZW5zb3JBcnJheShzcGxpdElkLmlkKTtcbiAgICAgIHNwbGl0VGVuc29yQXJyYXkuc3BsaXQobGVuZ3Rocywgc3BsaXRUZW5zb3IpO1xuICAgICAgcmV0dXJuIFtzcGxpdFRlbnNvckFycmF5LmlkVGVuc29yXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlTaXplVjMnOiB7XG4gICAgICBjb25zdCBzaXplSWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckFycmF5SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHNpemVUZW5zb3JBcnJheSA9IGNvbnRleHQuZ2V0VGVuc29yQXJyYXkoc2l6ZUlkLmlkKTtcbiAgICAgIHJldHVybiBbc2NhbGFyKHNpemVUZW5zb3JBcnJheS5zaXplKCksICdpbnQzMicpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yQXJyYXlDbG9zZVYzJzoge1xuICAgICAgY29uc3QgY2xvc2VJZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yQXJyYXlJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgY2xvc2VUZW5zb3JBcnJheSA9IGNvbnRleHQuZ2V0VGVuc29yQXJyYXkoY2xvc2VJZC5pZCk7XG4gICAgICBjbG9zZVRlbnNvckFycmF5LmNsZWFyQW5kQ2xvc2UoKTtcbiAgICAgIHJldHVybiBbY2xvc2VUZW5zb3JBcnJheS5pZFRlbnNvcl07XG4gICAgfVxuICAgIGNhc2UgJ1RlbnNvckxpc3RTZXRJdGVtJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgaW5kZXggPSBnZXRQYXJhbVZhbHVlKCdpbmRleCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3Qgd3JpdGVUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IGNvbnRleHQuZ2V0VGVuc29yTGlzdChpZFRlbnNvci5pZCk7XG4gICAgICB0ZW5zb3JMaXN0LnNldEl0ZW0oaW5kZXgsIHdyaXRlVGVuc29yKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5pZFRlbnNvcl07XG4gICAgfVxuICAgIGNhc2UgJ1RlbnNvckxpc3RHZXRJdGVtJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgcmVhZEluZGV4ID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRleCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuXG4gICAgICBjb25zdCBlbGVtZW50RFR5cGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnREVHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCB0ZW5zb3JMaXN0ID0gY29udGV4dC5nZXRUZW5zb3JMaXN0KGlkVGVuc29yLmlkKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5nZXRJdGVtKHJlYWRJbmRleCwgZWxlbWVudFNoYXBlLCBlbGVtZW50RFR5cGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdFNjYXR0ZXJWMic6XG4gICAgY2FzZSAnVGVuc29yTGlzdFNjYXR0ZXInOiB7XG4gICAgICBjb25zdCBzY2F0dGVySW5kaWNlcyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBzY2F0dGVyVGVuc29yID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IGVsZW1lbnRTaGFwZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZWxlbWVudFNoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgIGNvbnN0IG51bUVsZW1lbnRzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdudW1FbGVtZW50cycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9XG4gICAgICAgICAgc2NhdHRlcihzY2F0dGVyVGVuc29yLCBzY2F0dGVySW5kaWNlcywgZWxlbWVudFNoYXBlLCBudW1FbGVtZW50cyk7XG4gICAgICBjb250ZXh0LmFkZFRlbnNvckxpc3QodGVuc29yTGlzdCk7XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JMaXN0UmVzZXJ2ZSc6XG4gICAgY2FzZSAnRW1wdHlUZW5zb3JMaXN0Jzoge1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgY29uc3QgZWxlbWVudER0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgbGV0IG51bUVsZW1lbnRzUGFyYW07XG5cbiAgICAgIGlmIChub2RlLm9wID09PSAnVGVuc29yTGlzdFJlc2VydmUnKSB7XG4gICAgICAgIG51bUVsZW1lbnRzUGFyYW0gPSAnbnVtRWxlbWVudHMnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbnVtRWxlbWVudHNQYXJhbSA9ICdtYXhOdW1FbGVtZW50cyc7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IG51bUVsZW1lbnRzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKG51bUVsZW1lbnRzUGFyYW0sIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgY29uc3QgbWF4TnVtRWxlbWVudHMgPSBub2RlLm9wID09PSAnVGVuc29yTGlzdFJlc2VydmUnID8gLTEgOiBudW1FbGVtZW50cztcbiAgICAgIGNvbnN0IHRlbnNvckxpc3QgPVxuICAgICAgICAgIHJlc2VydmUoZWxlbWVudFNoYXBlLCBlbGVtZW50RHR5cGUsIG51bUVsZW1lbnRzLCBtYXhOdW1FbGVtZW50cyk7XG4gICAgICBjb250ZXh0LmFkZFRlbnNvckxpc3QodGVuc29yTGlzdCk7XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JMaXN0R2F0aGVyJzoge1xuICAgICAgY29uc3QgZ2F0aGVySWQgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgZ2F0aGVySW5kaWNlcyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBlbGVtZW50U2hhcGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnRTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBlbGVtZW50RHR5cGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnREVHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCB0ZW5zb3JMaXN0ID0gY29udGV4dC5nZXRUZW5zb3JMaXN0KGdhdGhlcklkLmlkKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5nYXRoZXIoZ2F0aGVySW5kaWNlcywgZWxlbWVudER0eXBlLCBlbGVtZW50U2hhcGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdFN0YWNrJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgY29uc3QgZWxlbWVudER0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgY29uc3QgbnVtRWxlbWVudHMgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ251bUVsZW1lbnRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICBjb25zdCB0ZW5zb3JMaXN0ID0gY29udGV4dC5nZXRUZW5zb3JMaXN0KGlkVGVuc29yLmlkKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5zdGFjayhlbGVtZW50U2hhcGUsIGVsZW1lbnREdHlwZSwgbnVtRWxlbWVudHMpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdEZyb21UZW5zb3InOiB7XG4gICAgICBjb25zdCB0ZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgY29uc3QgZWxlbWVudER0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IGZyb21UZW5zb3IodGVuc29yLCBlbGVtZW50U2hhcGUsIGVsZW1lbnREdHlwZSk7XG4gICAgICBjb250ZXh0LmFkZFRlbnNvckxpc3QodGVuc29yTGlzdCk7XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QuaWRUZW5zb3JdO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JMaXN0Q29uY2F0JzpcbiAgICBjYXNlICdUZW5zb3JMaXN0Q29uY2F0VjInOiB7XG4gICAgICBjb25zdCBjb25jYXRJZCA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yTGlzdElkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCB0ZW5zb3JMaXN0ID0gY29udGV4dC5nZXRUZW5zb3JMaXN0KGNvbmNhdElkLmlkKTtcbiAgICAgIGNvbnN0IGNvbmNhdER0eXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG4gICAgICBjb25zdCBlbGVtZW50U2hhcGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnRTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QuY29uY2F0KGNvbmNhdER0eXBlLCBlbGVtZW50U2hhcGUpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdFB1c2hCYWNrJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3Qgd3JpdGVUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IGNvbnRleHQuZ2V0VGVuc29yTGlzdChpZFRlbnNvci5pZCk7XG4gICAgICB0ZW5zb3JMaXN0LnB1c2hCYWNrKHdyaXRlVGVuc29yKTtcbiAgICAgIHJldHVybiBbdGVuc29yTGlzdC5pZFRlbnNvcl07XG4gICAgfVxuICAgIGNhc2UgJ1RlbnNvckxpc3RQb3BCYWNrJzoge1xuICAgICAgY29uc3QgaWRUZW5zb3IgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RlbnNvckxpc3RJZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgY29uc3QgZWxlbWVudFNoYXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgY29uc3QgZWxlbWVudERUeXBlID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGVtZW50RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IGNvbnRleHQuZ2V0VGVuc29yTGlzdChpZFRlbnNvci5pZCk7XG4gICAgICByZXR1cm4gW3RlbnNvckxpc3QucG9wQmFjayhlbGVtZW50U2hhcGUsIGVsZW1lbnREVHlwZSldO1xuICAgIH1cbiAgICBjYXNlICdUZW5zb3JMaXN0U3BsaXQnOiB7XG4gICAgICBjb25zdCBzcGxpdFRlbnNvciA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICBjb25zdCBlbGVtZW50U2hhcGUgPVxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VsZW1lbnRTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICBjb25zdCBsZW5ndGhzID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdsZW5ndGhzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcblxuICAgICAgY29uc3QgdGVuc29yTGlzdCA9IHNwbGl0KHNwbGl0VGVuc29yLCBsZW5ndGhzLCBlbGVtZW50U2hhcGUpO1xuICAgICAgY29udGV4dC5hZGRUZW5zb3JMaXN0KHRlbnNvckxpc3QpO1xuICAgICAgcmV0dXJuIFt0ZW5zb3JMaXN0LmlkVGVuc29yXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdExlbmd0aCc6IHtcbiAgICAgIGNvbnN0IGlkVGVuc29yID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JMaXN0SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHRlbnNvckxpc3QgPSBjb250ZXh0LmdldFRlbnNvckxpc3QoaWRUZW5zb3IuaWQpO1xuICAgICAgcmV0dXJuIFtzY2FsYXIodGVuc29yTGlzdC5zaXplKCksICdpbnQzMicpXTtcbiAgICB9XG4gICAgY2FzZSAnVGVuc29yTGlzdFJlc2l6ZSc6IHtcbiAgICAgIGNvbnN0IGlkVGVuc29yID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JMaXN0SWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHNpemUgPSBnZXRQYXJhbVZhbHVlKCdzaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG5cbiAgICAgIGNvbnN0IHNyY1RlbnNvckxpc3QgPSBjb250ZXh0LmdldFRlbnNvckxpc3QoaWRUZW5zb3IuaWQpO1xuICAgICAgY29uc3QgZGVzdFRlbnNvckxpc3QgPSBzcmNUZW5zb3JMaXN0LnJlc2l6ZShzaXplKTtcbiAgICAgIGNvbnRleHQuYWRkVGVuc29yTGlzdChkZXN0VGVuc29yTGlzdCk7XG4gICAgICByZXR1cm4gW2Rlc3RUZW5zb3JMaXN0LmlkVGVuc29yXTtcbiAgICB9XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdjb250cm9sJztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getPadding, getParamValue } from './utils';\nfunction fusedConvAndDepthWiseParams(node, tensorMap, context) {\n    const [extraOp, activationFunc] = getParamValue('fusedOps', node, tensorMap, context);\n    const isBiasAdd = extraOp === 'biasadd';\n    const noBiasAdd = !isBiasAdd;\n    const isPrelu = activationFunc === 'prelu';\n    const isBatchNorm = extraOp === 'fusedbatchnorm';\n    const numArgs = getParamValue('numArgs', node, tensorMap, context);\n    if (isBiasAdd) {\n        if (isPrelu && numArgs !== 2) {\n            throw new Error('FusedConv2d and DepthwiseConv2d with BiasAdd and Prelu ' +\n                'must have two extra arguments: bias and alpha.');\n        }\n        if (!isPrelu && isBiasAdd && numArgs !== 1) {\n            throw new Error('FusedConv2d and DepthwiseConv2d with BiasAdd must have ' +\n                'one extra argument: bias.');\n        }\n    }\n    if (isBatchNorm) {\n        throw new Error('FusedConv2d and DepthwiseConv2d with FusedBatchNorm is not supported');\n    }\n    const stride = getParamValue('strides', node, tensorMap, context);\n    const pad = getPadding(node, tensorMap, context);\n    const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n        .toUpperCase();\n    const dilations = getParamValue('dilations', node, tensorMap, context);\n    let [biasArg, preluArg] = getParamValue('args', node, tensorMap, context);\n    if (noBiasAdd) {\n        preluArg = biasArg;\n        biasArg = undefined;\n    }\n    const leakyreluAlpha = getParamValue('leakyreluAlpha', node, tensorMap, context);\n    return {\n        stride,\n        pad,\n        dataFormat,\n        dilations,\n        biasArg,\n        preluArg,\n        activationFunc,\n        leakyreluAlpha\n    };\n}\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'Conv1D': {\n            const stride = getParamValue('stride', node, tensorMap, context);\n            const pad = getParamValue('pad', node, tensorMap, context);\n            const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n                .toUpperCase();\n            const dilation = getParamValue('dilation', node, tensorMap, context);\n            return [ops.conv1d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), stride, pad, dataFormat, dilation)];\n        }\n        case 'Conv2D': {\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getPadding(node, tensorMap, context);\n            const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n                .toUpperCase();\n            const dilations = getParamValue('dilations', node, tensorMap, context);\n            return [ops.conv2d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [stride[1], stride[2]], pad, dataFormat, [dilations[1], dilations[2]])];\n        }\n        case '_FusedConv2D': {\n            const { stride, pad, dataFormat, dilations, biasArg, preluArg, activationFunc, leakyreluAlpha } = fusedConvAndDepthWiseParams(node, tensorMap, context);\n            return [ops.fused.conv2d({\n                    x: getParamValue('x', node, tensorMap, context),\n                    filter: getParamValue('filter', node, tensorMap, context),\n                    strides: [stride[1], stride[2]],\n                    pad: pad,\n                    dataFormat: dataFormat,\n                    dilations: [dilations[1], dilations[2]],\n                    bias: biasArg,\n                    activation: activationFunc,\n                    preluActivationWeights: preluArg,\n                    leakyreluAlpha\n                })];\n        }\n        case 'FusedDepthwiseConv2dNative': {\n            const { stride, pad, dataFormat, dilations, biasArg, preluArg, activationFunc, leakyreluAlpha, } = fusedConvAndDepthWiseParams(node, tensorMap, context);\n            return [ops.fused.depthwiseConv2d({\n                    x: getParamValue('x', node, tensorMap, context),\n                    filter: getParamValue('filter', node, tensorMap, context),\n                    strides: [stride[1], stride[2]],\n                    pad: pad,\n                    dataFormat: dataFormat,\n                    dilations: [dilations[1], dilations[2]],\n                    bias: biasArg,\n                    activation: activationFunc,\n                    preluActivationWeights: preluArg,\n                    leakyreluAlpha\n                })];\n        }\n        case 'Conv2DBackpropInput':\n        case 'Conv2dTranspose': {\n            const shape = getParamValue('outputShape', node, tensorMap, context);\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getPadding(node, tensorMap, context);\n            return [ops.conv2dTranspose(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), shape, [stride[1], stride[2]], pad)];\n        }\n        case 'DepthwiseConv2dNative':\n        case 'DepthwiseConv2d': {\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getPadding(node, tensorMap, context);\n            const dilations = getParamValue('dilations', node, tensorMap, context);\n            const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n                .toUpperCase();\n            return [ops.depthwiseConv2d(getParamValue('input', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [stride[1], stride[2]], pad, dataFormat, [dilations[1], dilations[2]])];\n        }\n        case 'Conv3D': {\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getParamValue('pad', node, tensorMap, context);\n            const dataFormat = getParamValue('dataFormat', node, tensorMap, context)\n                .toUpperCase();\n            const dilations = getParamValue('dilations', node, tensorMap, context);\n            return [ops.conv3d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [stride[1], stride[2], stride[3]], pad, dataFormat, [dilations[1], dilations[2], dilations[3]])];\n        }\n        case 'AvgPool': {\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getParamValue('pad', node, tensorMap, context);\n            const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n            return [ops.avgPool(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2]], [stride[1], stride[2]], pad)];\n        }\n        case 'MaxPool': {\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getParamValue('pad', node, tensorMap, context);\n            const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n            return [ops.maxPool(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2]], [stride[1], stride[2]], pad)];\n        }\n        case 'MaxPoolWithArgmax': {\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getParamValue('pad', node, tensorMap, context);\n            const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n            const includeBatchInIndex = getParamValue('includeBatchInIndex', node, tensorMap, context);\n            const { result, indexes } = ops.maxPoolWithArgmax(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2]], [stride[1], stride[2]], pad, includeBatchInIndex);\n            return [result, indexes];\n        }\n        case 'AvgPool3D': {\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getParamValue('pad', node, tensorMap, context);\n            const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n            return [ops.avgPool3d(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2], kernelSize[3]], [stride[1], stride[2], stride[3]], pad)];\n        }\n        case 'MaxPool3D': {\n            const stride = getParamValue('strides', node, tensorMap, context);\n            const pad = getParamValue('pad', node, tensorMap, context);\n            const kernelSize = getParamValue('kernelSize', node, tensorMap, context);\n            return [ops.maxPool3d(getParamValue('x', node, tensorMap, context), [kernelSize[1], kernelSize[2], kernelSize[3]], [stride[1], stride[2], stride[3]], pad)];\n        }\n        case 'Dilation2D': {\n            const strides = getParamValue('strides', node, tensorMap, context);\n            const pad = getParamValue('pad', node, tensorMap, context);\n            const dilations = getParamValue('dilations', node, tensorMap, context);\n            // strides: [1, stride_height, stride_width, 1].\n            const strideHeight = strides[1];\n            const strideWidth = strides[2];\n            // dilations: [1, dilation_height, dilation_width, 1].\n            const dilationHeight = dilations[1];\n            const dilationWidth = dilations[2];\n            return [ops.dilation2d(getParamValue('x', node, tensorMap, context), getParamValue('filter', node, tensorMap, context), [strideHeight, strideWidth], pad, [dilationHeight, dilationWidth], 'NHWC' /* dataFormat */)];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'convolution';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udm9sdXRpb25fZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvY29udm9sdXRpb25fZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLFVBQVUsRUFBRSxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFbEQsU0FBUywyQkFBMkIsQ0FDaEMsSUFBVSxFQUFFLFNBQTBCLEVBQUUsT0FBeUI7SUFDbkUsTUFBTSxDQUFDLE9BQU8sRUFBRSxjQUFjLENBQUMsR0FDMUIsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYyxDQUFDO0lBRXRFLE1BQU0sU0FBUyxHQUFHLE9BQU8sS0FBSyxTQUFTLENBQUM7SUFDeEMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxTQUFTLENBQUM7SUFDN0IsTUFBTSxPQUFPLEdBQUcsY0FBYyxLQUFLLE9BQU8sQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxPQUFPLEtBQUssZ0JBQWdCLENBQUM7SUFFakQsTUFBTSxPQUFPLEdBQ1IsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFDO0lBQ25FLElBQUksU0FBUyxFQUFFO1FBQ2IsSUFBSSxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUNYLHlEQUF5RDtnQkFDekQsZ0RBQWdELENBQUMsQ0FBQztTQUN2RDtRQUNELElBQUksQ0FBQyxPQUFPLElBQUksU0FBUyxJQUFJLE9BQU8sS0FBSyxDQUFDLEVBQUU7WUFDMUMsTUFBTSxJQUFJLEtBQUssQ0FDWCx5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T0FBTyxDQUFhLENBQUM7WUFDbkUsTUFBTSxHQUFHLEdBQUcsYUFBYSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1lBQzNELE1BQU0sU0FBUyxHQUNYLGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUVyRSxnREFBZ0Q7WUFDaEQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUUvQixzREFBc0Q7WUFDdEQsTUFBTSxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUVuQyxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FDbEIsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDL0IsRUFDWixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzdELENBQUMsWUFBWSxFQUFFLFdBQVcsQ0FBQyxFQUFFLEdBQXVCLEVBQ3BELENBQUMsY0FBYyxFQUFFLGFBQWEsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7U0FDaEU7UUFFRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxhQUFhLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UmFuaywgVGVuc29yLCBUZW5zb3IzRCwgVGVuc29yNEQsIFRlbnNvcjVEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhZGRpbmcsIGdldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5mdW5jdGlvbiBmdXNlZENvbnZBbmREZXB0aFdpc2VQYXJhbXMoXG4gICAgbm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQpIHtcbiAgY29uc3QgW2V4dHJhT3AsIGFjdGl2YXRpb25GdW5jXSA9XG4gICAgICAoZ2V0UGFyYW1WYWx1ZSgnZnVzZWRPcHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZ1tdKTtcblxuICBjb25zdCBpc0JpYXNBZGQgPSBleHRyYU9wID09PSAnYmlhc2FkZCc7XG4gIGNvbnN0IG5vQmlhc0FkZCA9ICFpc0JpYXNBZGQ7XG4gIGNvbnN0IGlzUHJlbHUgPSBhY3RpdmF0aW9uRnVuYyA9PT0gJ3ByZWx1JztcbiAgY29uc3QgaXNCYXRjaE5vcm0gPSBleHRyYU9wID09PSAnZnVzZWRiYXRjaG5vcm0nO1xuXG4gIGNvbnN0IG51bUFyZ3MgPVxuICAgICAgKGdldFBhcmFtVmFsdWUoJ251bUFyZ3MnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcik7XG4gIGlmIChpc0JpYXNBZGQpIHtcbiAgICBpZiAoaXNQcmVsdSAmJiBudW1BcmdzICE9PSAyKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0Z1c2VkQ29udjJkIGFuZCBEZXB0aHdpc2VDb252MmQgd2l0aCBCaWFzQWRkIGFuZCBQcmVsdSAnICtcbiAgICAgICAgICAnbXVzdCBoYXZlIHR3byBleHRyYSBhcmd1bWVudHM6IGJpYXMgYW5kIGFscGhhLicpO1xuICAgIH1cbiAgICBpZiAoIWlzUHJlbHUgJiYgaXNCaWFzQWRkICYmIG51bUFyZ3MgIT09IDEpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnRnVzZWRDb252MmQgYW5kIERlcHRod2lzZUNvbnYyZCB3aXRoIEJpYXNBZGQgbXVzdCBoYXZlICcgK1xuICAgICAgICAgICdvbmUgZXh0cmEgYXJndW1lbnQ6IGJpYXMuJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc0JhdGNoTm9ybSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0Z1c2VkQ29udjJkIGFuZCBEZXB0aHdpc2VDb252MmQgd2l0aCBGdXNlZEJhdGNoTm9ybSBpcyBub3Qgc3VwcG9ydGVkJyk7XG4gIH1cbiAgY29uc3Qgc3RyaWRlID0gZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gIGNvbnN0IHBhZCA9IGdldFBhZGRpbmcobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgY29uc3QgZGF0YUZvcm1hdCA9XG4gICAgICAoZ2V0UGFyYW1WYWx1ZSgnZGF0YUZvcm1hdCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nKVxuICAgICAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICBjb25zdCBkaWxhdGlvbnMgPVxuICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGlsYXRpb25zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgbGV0IFtiaWFzQXJnLCBwcmVsdUFyZ10gPVxuICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXJncycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yW107XG4gIGlmIChub0JpYXNBZGQpIHtcbiAgICBwcmVsdUFyZyA9IGJpYXNBcmc7XG4gICAgYmlhc0FyZyA9IHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBsZWFreXJlbHVBbHBoYSA9XG4gICAgICBnZXRQYXJhbVZhbHVlKCdsZWFreXJlbHVBbHBoYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuXG4gIHJldHVybiB7XG4gICAgc3RyaWRlLFxuICAgIHBhZCxcbiAgICBkYXRhRm9ybWF0LFxuICAgIGRpbGF0aW9ucyxcbiAgICBiaWFzQXJnLFxuICAgIHByZWx1QXJnLFxuICAgIGFjdGl2YXRpb25GdW5jLFxuICAgIGxlYWt5cmVsdUFscGhhXG4gIH07XG59XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBvcHMgPSB0Zk9wcyk6IFRlbnNvcltdID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICBjYXNlICdDb252MUQnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFyYW1WYWx1ZSgncGFkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBkYXRhRm9ybWF0ID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ2RhdGFGb3JtYXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGNvbnN0IGRpbGF0aW9uID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGlsYXRpb24nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICByZXR1cm4gW29wcy5jb252MWQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWx0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNELFxuICAgICAgICAgICAgICBzdHJpZGUsIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnLCBkYXRhRm9ybWF0IGFzICdOV0MnIHwgJ05DVycsXG4gICAgICAgICAgICAgIGRpbGF0aW9uKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ29udjJEJzoge1xuICAgICAgICAgIGNvbnN0IHN0cmlkZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3N0cmlkZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHBhZCA9IGdldFBhZGRpbmcobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBkYXRhRm9ybWF0ID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ2RhdGFGb3JtYXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGNvbnN0IGRpbGF0aW9ucyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RpbGF0aW9ucycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgcmV0dXJuIFtvcHMuY29udjJkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IzRCB8XG4gICAgICAgICAgICAgICAgICBUZW5zb3I0RCxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZmlsdGVyJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I0RCxcbiAgICAgICAgICAgICAgW3N0cmlkZVsxXSwgc3RyaWRlWzJdXSwgcGFkIGFzICd2YWxpZCcgfCAnc2FtZScsXG4gICAgICAgICAgICAgIGRhdGFGb3JtYXQgYXMgJ05IV0MnIHwgJ05DSFcnLCBbZGlsYXRpb25zWzFdLCBkaWxhdGlvbnNbMl1dKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnX0Z1c2VkQ29udjJEJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHN0cmlkZSxcbiAgICAgICAgICAgIHBhZCxcbiAgICAgICAgICAgIGRhdGFGb3JtYXQsXG4gICAgICAgICAgICBkaWxhdGlvbnMsXG4gICAgICAgICAgICBiaWFzQXJnLFxuICAgICAgICAgICAgcHJlbHVBcmcsXG4gICAgICAgICAgICBhY3RpdmF0aW9uRnVuYyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgICAgICAgfSA9IGZ1c2VkQ29udkFuZERlcHRoV2lzZVBhcmFtcyhub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuXG4gICAgICAgICAgcmV0dXJuIFtvcHMuZnVzZWQuY29udjJkKHtcbiAgICAgICAgICAgIHg6IGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICBUZW5zb3I0RCxcbiAgICAgICAgICAgIGZpbHRlcjogZ2V0UGFyYW1WYWx1ZSgnZmlsdGVyJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgc3RyaWRlczogW3N0cmlkZVsxXSwgc3RyaWRlWzJdXSxcbiAgICAgICAgICAgIHBhZDogcGFkIGFzICd2YWxpZCcgfCAnc2FtZScsXG4gICAgICAgICAgICBkYXRhRm9ybWF0OiBkYXRhRm9ybWF0IGFzICdOSFdDJyB8ICdOQ0hXJyxcbiAgICAgICAgICAgIGRpbGF0aW9uczogW2RpbGF0aW9uc1sxXSwgZGlsYXRpb25zWzJdXSxcbiAgICAgICAgICAgIGJpYXM6IGJpYXNBcmcsXG4gICAgICAgICAgICBhY3RpdmF0aW9uOiBhY3RpdmF0aW9uRnVuYyBhcyB0Zk9wcy5mdXNlZC5BY3RpdmF0aW9uLFxuICAgICAgICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0czogcHJlbHVBcmcsXG4gICAgICAgICAgICBsZWFreXJlbHVBbHBoYVxuICAgICAgICAgIH0pXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ0Z1c2VkRGVwdGh3aXNlQ29udjJkTmF0aXZlJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIHN0cmlkZSxcbiAgICAgICAgICAgIHBhZCxcbiAgICAgICAgICAgIGRhdGFGb3JtYXQsXG4gICAgICAgICAgICBkaWxhdGlvbnMsXG4gICAgICAgICAgICBiaWFzQXJnLFxuICAgICAgICAgICAgcHJlbHVBcmcsXG4gICAgICAgICAgICBhY3RpdmF0aW9uRnVuYyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhLFxuICAgICAgICAgIH0gPSBmdXNlZENvbnZBbmREZXB0aFdpc2VQYXJhbXMobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLmZ1c2VkLmRlcHRod2lzZUNvbnYyZCh7XG4gICAgICAgICAgICB4OiBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IzRCB8XG4gICAgICAgICAgICAgICAgVGVuc29yNEQsXG4gICAgICAgICAgICBmaWx0ZXI6IGdldFBhcmFtVmFsdWUoJ2ZpbHRlcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICBUZW5zb3I0RCxcbiAgICAgICAgICAgIHN0cmlkZXM6IFtzdHJpZGVbMV0sIHN0cmlkZVsyXV0sXG4gICAgICAgICAgICBwYWQ6IHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnLFxuICAgICAgICAgICAgZGF0YUZvcm1hdDogZGF0YUZvcm1hdCBhcyAnTkhXQycgfCAnTkNIVycsXG4gICAgICAgICAgICBkaWxhdGlvbnM6IFtkaWxhdGlvbnNbMV0sIGRpbGF0aW9uc1syXV0sXG4gICAgICAgICAgICBiaWFzOiBiaWFzQXJnLFxuICAgICAgICAgICAgYWN0aXZhdGlvbjogYWN0aXZhdGlvbkZ1bmMgYXMgdGZPcHMuZnVzZWQuQWN0aXZhdGlvbixcbiAgICAgICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHM6IHByZWx1QXJnLFxuICAgICAgICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICAgICAgICB9KV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ29udjJEQmFja3Byb3BJbnB1dCc6XG4gICAgICAgIGNhc2UgJ0NvbnYyZFRyYW5zcG9zZSc6IHtcbiAgICAgICAgICBjb25zdCBzaGFwZSA9IGdldFBhcmFtVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ291dHB1dFNoYXBlJywgbm9kZSwgdGVuc29yTWFwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB8XG4gICAgICAgICAgICAgIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgICAgICAgIGNvbnN0IHN0cmlkZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3N0cmlkZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHBhZCA9IGdldFBhZGRpbmcobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICByZXR1cm4gW29wcy5jb252MmRUcmFuc3Bvc2UoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWx0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgICBzaGFwZSwgW3N0cmlkZVsxXSwgc3RyaWRlWzJdXSwgcGFkIGFzICd2YWxpZCcgfCAnc2FtZScpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdEZXB0aHdpc2VDb252MmROYXRpdmUnOlxuICAgICAgICBjYXNlICdEZXB0aHdpc2VDb252MmQnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFkZGluZyhub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IGRpbGF0aW9ucyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RpbGF0aW9ucycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgZGF0YUZvcm1hdCA9XG4gICAgICAgICAgICAgIChnZXRQYXJhbVZhbHVlKCdkYXRhRm9ybWF0Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBzdHJpbmcpXG4gICAgICAgICAgICAgICAgICAudG9VcHBlckNhc2UoKTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLmRlcHRod2lzZUNvbnYyZChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5wdXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWx0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgICBbc3RyaWRlWzFdLCBzdHJpZGVbMl1dLCBwYWQgYXMgJ3ZhbGlkJyB8ICdzYW1lJyxcbiAgICAgICAgICAgICAgZGF0YUZvcm1hdCBhcyAnTkhXQycgfCAnTkNIVycsIFtkaWxhdGlvbnNbMV0sIGRpbGF0aW9uc1syXV0pXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDb252M0QnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFyYW1WYWx1ZSgncGFkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBkYXRhRm9ybWF0ID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ2RhdGFGb3JtYXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZylcbiAgICAgICAgICAgICAgICAgIC50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgIGNvbnN0IGRpbGF0aW9ucyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RpbGF0aW9ucycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgcmV0dXJuIFtvcHMuY29udjNkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I0RCB8XG4gICAgICAgICAgICAgICAgICBUZW5zb3I8UmFuay5SNT4sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ZpbHRlcicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjxSYW5rLlI1PixcbiAgICAgICAgICAgICAgW3N0cmlkZVsxXSwgc3RyaWRlWzJdLCBzdHJpZGVbM11dLCBwYWQgYXMgJ3ZhbGlkJyB8ICdzYW1lJyxcbiAgICAgICAgICAgICAgZGF0YUZvcm1hdCBhcyAnTkRIV0MnIHwgJ05DREhXJyxcbiAgICAgICAgICAgICAgW2RpbGF0aW9uc1sxXSwgZGlsYXRpb25zWzJdLCBkaWxhdGlvbnNbM11dKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQXZnUG9vbCc6IHtcbiAgICAgICAgICBjb25zdCBzdHJpZGUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdHJpZGVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBwYWQgPSBnZXRQYXJhbVZhbHVlKCdwYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IGtlcm5lbFNpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdrZXJuZWxTaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLmF2Z1Bvb2woXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBba2VybmVsU2l6ZVsxXSwga2VybmVsU2l6ZVsyXV0sIFtzdHJpZGVbMV0sIHN0cmlkZVsyXV0sXG4gICAgICAgICAgICAgIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWF4UG9vbCc6IHtcbiAgICAgICAgICBjb25zdCBzdHJpZGUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdHJpZGVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBwYWQgPSBnZXRQYXJhbVZhbHVlKCdwYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuICAgICAgICAgIGNvbnN0IGtlcm5lbFNpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdrZXJuZWxTaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLm1heFBvb2woXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBba2VybmVsU2l6ZVsxXSwga2VybmVsU2l6ZVsyXV0sIFtzdHJpZGVbMV0sIHN0cmlkZVsyXV0sXG4gICAgICAgICAgICAgIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWF4UG9vbFdpdGhBcmdtYXgnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFyYW1WYWx1ZSgncGFkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBrZXJuZWxTaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2VybmVsU2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgaW5jbHVkZUJhdGNoSW5JbmRleCA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luY2x1ZGVCYXRjaEluSW5kZXgnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIGJvb2xlYW47XG4gICAgICAgICAgY29uc3Qge3Jlc3VsdCwgaW5kZXhlc30gPSBvcHMubWF4UG9vbFdpdGhBcmdtYXgoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgICBba2VybmVsU2l6ZVsxXSwga2VybmVsU2l6ZVsyXV0sIFtzdHJpZGVbMV0sIHN0cmlkZVsyXV0sXG4gICAgICAgICAgICAgIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnLCBpbmNsdWRlQmF0Y2hJbkluZGV4KTtcbiAgICAgICAgICByZXR1cm4gW3Jlc3VsdCwgaW5kZXhlc107XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQXZnUG9vbDNEJzoge1xuICAgICAgICAgIGNvbnN0IHN0cmlkZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3N0cmlkZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHBhZCA9IGdldFBhcmFtVmFsdWUoJ3BhZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgICAgY29uc3Qga2VybmVsU2l6ZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlcm5lbFNpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuXG4gICAgICAgICAgcmV0dXJuIFtvcHMuYXZnUG9vbDNkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I1RCxcbiAgICAgICAgICAgICAgW2tlcm5lbFNpemVbMV0sIGtlcm5lbFNpemVbMl0sIGtlcm5lbFNpemVbM11dLFxuICAgICAgICAgICAgICBbc3RyaWRlWzFdLCBzdHJpZGVbMl0sIHN0cmlkZVszXV0sIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnKV07XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdNYXhQb29sM0QnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgcGFkID0gZ2V0UGFyYW1WYWx1ZSgncGFkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjb25zdCBrZXJuZWxTaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2VybmVsU2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG5cbiAgICAgICAgICByZXR1cm4gW29wcy5tYXhQb29sM2QoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjVELFxuICAgICAgICAgICAgICBba2VybmVsU2l6ZVsxXSwga2VybmVsU2l6ZVsyXSwga2VybmVsU2l6ZVszXV0sXG4gICAgICAgICAgICAgIFtzdHJpZGVbMV0sIHN0cmlkZVsyXSwgc3RyaWRlWzNdXSwgcGFkIGFzICd2YWxpZCcgfCAnc2FtZScpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ0RpbGF0aW9uMkQnOiB7XG4gICAgICAgICAgY29uc3Qgc3RyaWRlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3N0cmlkZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHBhZCA9IGdldFBhcmFtVmFsdWUoJ3BhZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgICAgY29uc3QgZGlsYXRpb25zID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGlsYXRpb25zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcblxuICAgICAgICAgIC8vIHN0cmlkZXM6IFsxLCBzdHJpZGVfaGVpZ2h0LCBzdHJpZGVfd2lkdGgsIDFdLlxuICAgICAgICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IHN0cmlkZXNbMV07XG4gICAgICAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBzdHJpZGVzWzJdO1xuXG4gICAgICAgICAgLy8gZGlsYXRpb25zOiBbMSwgZGlsYXRpb25faGVpZ2h0LCBkaWxhdGlvbl93aWR0aCwgMV0uXG4gICAgICAgICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBkaWxhdGlvbnNbMV07XG4gICAgICAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGRpbGF0aW9uc1syXTtcblxuICAgICAgICAgIHJldHVybiBbb3BzLmRpbGF0aW9uMmQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNEIHxcbiAgICAgICAgICAgICAgICAgIFRlbnNvcjRELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWx0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjNELFxuICAgICAgICAgICAgICBbc3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aF0sIHBhZCBhcyAndmFsaWQnIHwgJ3NhbWUnLFxuICAgICAgICAgICAgICBbZGlsYXRpb25IZWlnaHQsIGRpbGF0aW9uV2lkdGhdLCAnTkhXQycgLyogZGF0YUZvcm1hdCAqLyldO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgfVxuICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdjb252b2x1dGlvbic7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'Fill': {\n            const shape = getParamValue('shape', node, tensorMap, context);\n            const dtype = getParamValue('dtype', node, tensorMap, context);\n            const value = getParamValue('value', node, tensorMap, context);\n            return [ops.fill(shape, value, dtype)];\n        }\n        case 'LinSpace': {\n            const start = getParamValue('start', node, tensorMap, context);\n            const stop = getParamValue('stop', node, tensorMap, context);\n            const num = getParamValue('num', node, tensorMap, context);\n            return [ops.linspace(start, stop, num)];\n        }\n        case 'Multinomial': {\n            const logits = getParamValue('logits', node, tensorMap, context);\n            const numSamples = getParamValue('numSamples', node, tensorMap, context);\n            const seed = getParamValue('seed', node, tensorMap, context);\n            return [ops.multinomial(logits, numSamples, seed)];\n        }\n        case 'OneHot': {\n            const indices = getParamValue('indices', node, tensorMap, context);\n            const depth = getParamValue('depth', node, tensorMap, context);\n            const onValue = getParamValue('onValue', node, tensorMap, context);\n            const offValue = getParamValue('offValue', node, tensorMap, context);\n            const dtype = getParamValue('dtype', node, tensorMap, context);\n            return [ops.oneHot(indices, depth, onValue, offValue, dtype)];\n        }\n        case 'Ones': {\n            return [ops.ones(getParamValue('shape', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n        }\n        case 'OnesLike': {\n            return [ops.onesLike(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'RandomStandardNormal': {\n            return [ops.randomStandardNormal(getParamValue('shape', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context), getParamValue('seed', node, tensorMap, context))];\n        }\n        case 'RandomUniform': {\n            return [ops.randomUniform(\n                // tslint:disable-next-line:no-any\n                getParamValue('shape', node, tensorMap, context), getParamValue('minval', node, tensorMap, context), getParamValue('maxval', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n        }\n        case 'Range': {\n            const start = getParamValue('start', node, tensorMap, context);\n            const stop = getParamValue('stop', node, tensorMap, context);\n            const step = getParamValue('step', node, tensorMap, context);\n            return [ops.range(start, stop, step, getParamValue('dtype', node, tensorMap, context))];\n        }\n        case 'TruncatedNormal': {\n            const shape = getParamValue('shape', node, tensorMap, context);\n            const mean = getParamValue('mean', node, tensorMap, context);\n            const stdDev = getParamValue('stdDev', node, tensorMap, context);\n            const seed = getParamValue('seed', node, tensorMap, context);\n            return [ops.truncatedNormal(shape, mean, stdDev, getParamValue('dtype', node, tensorMap, context), seed)];\n        }\n        case 'Zeros': {\n            return [ops.zeros(getParamValue('shape', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n        }\n        case 'ZerosLike': {\n            return [ops.zerosLike(getParamValue('x', node, tensorMap, context))];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'creation';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRpb25fZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvY3JlYXRpb25fZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQUUsT0FBeUIsRUFDakUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ3hCLFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssTUFBTSxDQUFDLENBQUM7WUFDWCxNQUFNLEtBQUssR0FDUCxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUM7WUFDakUsTUFBTSxLQUFLLEdBQ1AsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2pFLE1BQU0sS0FBSyxHQUNQLGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUMvRCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7U0FDeEM7UUFDRCxLQUFLLFVBQVUsQ0FBQyxDQUFDO1lBQ2YsTUFBTSxLQUFLLEdBQ1AsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQy9ELE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxF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QixhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUNwQyxFQUNYLElBQUksQ0FBQyxDQUFDLENBQUM7U0FDWjtRQUNELEtBQUssT0FBTyxDQUFDLENBQUM7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDYixhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzVELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0Q7WUFDRSxNQUFNLFNBQVMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDOUQ7QUFDSCxDQUFDLENBQUM7QUFFTixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCwgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnRmlsbCc6IHtcbiAgICAgICAgICBjb25zdCBzaGFwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBkdHlwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2R0eXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBEYXRhVHlwZTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3ZhbHVlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuZmlsbChzaGFwZSwgdmFsdWUsIGR0eXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTGluU3BhY2UnOiB7XG4gICAgICAgICAgY29uc3Qgc3RhcnQgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdGFydCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHN0b3AgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdG9wJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgbnVtID0gZ2V0UGFyYW1WYWx1ZSgnbnVtJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgcmV0dXJuIFtvcHMubGluc3BhY2Uoc3RhcnQsIHN0b3AsIG51bSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ011bHRpbm9taWFsJzoge1xuICAgICAgICAgIGNvbnN0IGxvZ2l0cyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2xvZ2l0cycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yMUQ7XG4gICAgICAgICAgY29uc3QgbnVtU2FtcGxlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ251bVNhbXBsZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBzZWVkID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2VlZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIHJldHVybiBbb3BzLm11bHRpbm9taWFsKGxvZ2l0cywgbnVtU2FtcGxlcywgc2VlZCldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ09uZUhvdCc6IHtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yMUQ7XG4gICAgICAgICAgY29uc3QgZGVwdGggPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkZXB0aCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IG9uVmFsdWUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdvblZhbHVlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3Qgb2ZmVmFsdWUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdvZmZWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IGR0eXBlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgICAgIHJldHVybiBbb3BzLm9uZUhvdChpbmRpY2VzLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWUsIGR0eXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnT25lcyc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5vbmVzKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2R0eXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBEYXRhVHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ09uZXNMaWtlJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLm9uZXNMaWtlKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdSYW5kb21TdGFuZGFyZE5vcm1hbCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5yYW5kb21TdGFuZGFyZE5vcm1hbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgJ2Zsb2F0MzInIHxcbiAgICAgICAgICAgICAgICAgICdpbnQzMicsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NlZWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JhbmRvbVVuaWZvcm0nOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmFuZG9tVW5pZm9ybShcbiAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYW55LFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdtaW52YWwnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbWF4dmFsJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXIsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2R0eXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBEYXRhVHlwZSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JhbmdlJzoge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0ID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RhcnQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBzdG9wID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RvcCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHN0ZXAgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdGVwJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmFuZ2UoXG4gICAgICAgICAgICAgIHN0YXJ0LCBzdG9wLCBzdGVwLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkdHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgJ2Zsb2F0MzInIHxcbiAgICAgICAgICAgICAgICAgICdpbnQzMicpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdUcnVuY2F0ZWROb3JtYWwnOiB7XG4gICAgICAgICAgY29uc3Qgc2hhcGUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgbWVhbiA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ21lYW4nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBzdGREZXYgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdGREZXYnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBzZWVkID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2VlZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIHJldHVybiBbb3BzLnRydW5jYXRlZE5vcm1hbChcbiAgICAgICAgICAgICAgc2hhcGUsIG1lYW4sIHN0ZERldixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzICdmbG9hdDMyJyB8XG4gICAgICAgICAgICAgICAgICAnaW50MzInLFxuICAgICAgICAgICAgICBzZWVkKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnWmVyb3MnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuemVyb3MoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXSxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZHR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnWmVyb3NMaWtlJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLnplcm9zTGlrZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgfVxuICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdjcmVhdGlvbic7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nfunction nmsParams(node, tensorMap, context) {\n    const boxes = getParamValue('boxes', node, tensorMap, context);\n    const scores = getParamValue('scores', node, tensorMap, context);\n    const maxOutputSize = getParamValue('maxOutputSize', node, tensorMap, context);\n    const iouThreshold = getParamValue('iouThreshold', node, tensorMap, context);\n    const scoreThreshold = getParamValue('scoreThreshold', node, tensorMap, context);\n    const softNmsSigma = getParamValue('softNmsSigma', node, tensorMap, context);\n    return {\n        boxes,\n        scores,\n        maxOutputSize,\n        iouThreshold,\n        scoreThreshold,\n        softNmsSigma\n    };\n}\nexport const executeOp = async (node, tensorMap, context, resourceManager, ops = tfOps) => {\n    switch (node.op) {\n        case 'NonMaxSuppressionV5': {\n            const { boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma } = nmsParams(node, tensorMap, context);\n            const result = await ops.image.nonMaxSuppressionWithScoreAsync(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma);\n            return [result.selectedIndices, result.selectedScores];\n        }\n        case 'NonMaxSuppressionV4': {\n            const { boxes, scores, maxOutputSize, iouThreshold, scoreThreshold } = nmsParams(node, tensorMap, context);\n            const padToMaxOutputSize = getParamValue('padToMaxOutputSize', node, tensorMap, context);\n            const result = await ops.image.nonMaxSuppressionPaddedAsync(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize);\n            return [result.selectedIndices, result.validOutputs];\n        }\n        case 'NonMaxSuppressionV3':\n        case 'NonMaxSuppressionV2': {\n            const { boxes, scores, maxOutputSize, iouThreshold, scoreThreshold } = nmsParams(node, tensorMap, context);\n            return [await ops.image.nonMaxSuppressionAsync(boxes, scores, maxOutputSize, iouThreshold, scoreThreshold)];\n        }\n        case 'Where': {\n            const condition = ops.cast(getParamValue('condition', node, tensorMap, context), 'bool');\n            const result = [await ops.whereAsync(condition)];\n            condition.dispose();\n            return result;\n        }\n        case 'ListDiff': {\n            return ops.setdiff1dAsync(getParamValue('x', node, tensorMap, context), getParamValue('y', node, tensorMap, context));\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'dynamic';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHluYW1pY19leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9keW5hbWljX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTzFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsU0FBUyxTQUFTLENBQ2QsSUFBVSxFQUFFLFNBQTBCLEVBQUUsT0FBeUI7SUFDbkUsTUFBTSxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO0lBQ3pFLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztJQUMzRSxNQUFNLGFBQWEsR0FDZixhQUFhLENBQUMsZUFBZSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7SUFDdkUsTUFBTSxZQUFZLEdBQ2QsYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO0lBQ3RFLE1BQU0sY0FBYyxHQUNoQixhQUFhLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztJQUN4RSxNQUFNLFlBQVksR0FDZCxhQUFhLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7SUFFdEUsT0FBTztRQUNMLEtBQUs7UUFDTCxNQUFNO1FBQ04sYUFBYTtRQUNiLFlBQVk7UUFDWixjQUFjO1FBQ2QsWUFBWTtLQUNiLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxD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eXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvciwgVGVuc29yMUQsIFRlbnNvcjJEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQgeyBSZXNvdXJjZU1hbmFnZXIgfSBmcm9tICcuLi8uLi9leGVjdXRvci9yZXNvdXJjZV9tYW5hZ2VyJztcbmltcG9ydCB7SW50ZXJuYWxPcEFzeW5jRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZnVuY3Rpb24gbm1zUGFyYW1zKFxuICAgIG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLCBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0KSB7XG4gIGNvbnN0IGJveGVzID0gZ2V0UGFyYW1WYWx1ZSgnYm94ZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgY29uc3Qgc2NvcmVzID0gZ2V0UGFyYW1WYWx1ZSgnc2NvcmVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gIGNvbnN0IG1heE91dHB1dFNpemUgPVxuICAgICAgZ2V0UGFyYW1WYWx1ZSgnbWF4T3V0cHV0U2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICBjb25zdCBpb3VUaHJlc2hvbGQgPVxuICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW91VGhyZXNob2xkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gIGNvbnN0IHNjb3JlVGhyZXNob2xkID1cbiAgICAgIGdldFBhcmFtVmFsdWUoJ3Njb3JlVGhyZXNob2xkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gIGNvbnN0IHNvZnRObXNTaWdtYSA9XG4gICAgICBnZXRQYXJhbVZhbHVlKCdzb2Z0Tm1zU2lnbWEnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcblxuICByZXR1cm4ge1xuICAgIGJveGVzLFxuICAgIHNjb3JlcyxcbiAgICBtYXhPdXRwdXRTaXplLFxuICAgIGlvdVRocmVzaG9sZCxcbiAgICBzY29yZVRocmVzaG9sZCxcbiAgICBzb2Z0Tm1zU2lnbWFcbiAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEFzeW5jRXhlY3V0b3IgPSBhc3luYyhcbiAgICBub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCByZXNvdXJjZU1hbmFnZXI6IFJlc291cmNlTWFuYWdlcixcbiAgICBvcHMgPSB0Zk9wcyk6IFByb21pc2U8VGVuc29yW10+ID0+IHtcbiAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgY2FzZSAnTm9uTWF4U3VwcHJlc3Npb25WNSc6IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgYm94ZXMsXG4gICAgICAgIHNjb3JlcyxcbiAgICAgICAgbWF4T3V0cHV0U2l6ZSxcbiAgICAgICAgaW91VGhyZXNob2xkLFxuICAgICAgICBzY29yZVRocmVzaG9sZCxcbiAgICAgICAgc29mdE5tc1NpZ21hXG4gICAgICB9ID0gbm1zUGFyYW1zKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IG9wcy5pbWFnZS5ub25NYXhTdXBwcmVzc2lvbldpdGhTY29yZUFzeW5jKFxuICAgICAgICAgIGJveGVzIGFzIFRlbnNvcjJELCBzY29yZXMgYXMgVGVuc29yMUQsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCxcbiAgICAgICAgICBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hKTtcblxuICAgICAgcmV0dXJuIFtyZXN1bHQuc2VsZWN0ZWRJbmRpY2VzLCByZXN1bHQuc2VsZWN0ZWRTY29yZXNdO1xuICAgIH1cbiAgICBjYXNlICdOb25NYXhTdXBwcmVzc2lvblY0Jzoge1xuICAgICAgY29uc3Qge2JveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGR9ID1cbiAgICAgICAgICBubXNQYXJhbXMobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcblxuICAgICAgY29uc3QgcGFkVG9NYXhPdXRwdXRTaXplID1cbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdwYWRUb01heE91dHB1dFNpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgYm9vbGVhbjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgb3BzLmltYWdlLm5vbk1heFN1cHByZXNzaW9uUGFkZGVkQXN5bmMoXG4gICAgICAgICAgYm94ZXMgYXMgVGVuc29yMkQsIHNjb3JlcyBhcyBUZW5zb3IxRCwgbWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLFxuICAgICAgICAgIHNjb3JlVGhyZXNob2xkLCBwYWRUb01heE91dHB1dFNpemUpO1xuXG4gICAgICByZXR1cm4gW3Jlc3VsdC5zZWxlY3RlZEluZGljZXMsIHJlc3VsdC52YWxpZE91dHB1dHNdO1xuICAgIH1cbiAgICBjYXNlICdOb25NYXhTdXBwcmVzc2lvblYzJzpcbiAgICBjYXNlICdOb25NYXhTdXBwcmVzc2lvblYyJzoge1xuICAgICAgY29uc3Qge2JveGVzLCBzY29yZXMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGR9ID1cbiAgICAgICAgICBubXNQYXJhbXMobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcblxuICAgICAgcmV0dXJuIFthd2FpdCBvcHMuaW1hZ2Uubm9uTWF4U3VwcHJlc3Npb25Bc3luYyhcbiAgICAgICAgICBib3hlcyBhcyBUZW5zb3IyRCwgc2NvcmVzIGFzIFRlbnNvcjFELCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsXG4gICAgICAgICAgc2NvcmVUaHJlc2hvbGQpXTtcbiAgICB9XG4gICAgY2FzZSAnV2hlcmUnOiB7XG4gICAgICBjb25zdCBjb25kaXRpb24gPSBvcHMuY2FzdChcbiAgICAgICAgICAoZ2V0UGFyYW1WYWx1ZSgnY29uZGl0aW9uJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpLFxuICAgICAgICAgICdib29sJyk7XG4gICAgICBjb25zdCByZXN1bHQgPSBbYXdhaXQgb3BzLndoZXJlQXN5bmMoY29uZGl0aW9uKV07XG4gICAgICBjb25kaXRpb24uZGlzcG9zZSgpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FzZSAnTGlzdERpZmYnOiB7XG4gICAgICByZXR1cm4gb3BzLnNldGRpZmYxZEFzeW5jKFxuICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd5Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2R5bmFtaWMnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'LowerBound': {\n            const sortedSequence = getParamValue('sortedSequence', node, tensorMap, context);\n            const values = getParamValue('values', node, tensorMap, context);\n            return [ops.lowerBound(sortedSequence, values)];\n        }\n        case 'TopKV2': {\n            const x = getParamValue('x', node, tensorMap, context);\n            const k = getParamValue('k', node, tensorMap, context);\n            const sorted = getParamValue('sorted', node, tensorMap, context);\n            const result = ops.topk(x, k, sorted);\n            return [result.values, result.indices];\n        }\n        case 'UpperBound': {\n            const sortedSequence = getParamValue('sortedSequence', node, tensorMap, context);\n            const values = getParamValue('values', node, tensorMap, context);\n            return [ops.upperBound(sortedSequence, values)];\n        }\n        case 'Unique': {\n            const x = getParamValue('x', node, tensorMap, context);\n            const result = ops.unique(x);\n            return [result.values, result.indices];\n        }\n        case 'UniqueV2': {\n            const x = getParamValue('x', node, tensorMap, context);\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const result = ops.unique(x, axis);\n            return [result.values, result.indices];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'evaluation';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZhbHVhdGlvbl9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9ldmFsdWF0aW9uX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUFFLE9BQXlCLEVBQ2pFLEdBQUcsR0FBRyxLQUFLLEVBQ0MsRUFBRTtJQUNULFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssWUFBWSxDQUFDLENBQUM7WUFDakIsTUFBTSxjQUFjLEdBQ2hCLGFBQWEsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDbEQsQ0FBQztZQUNYLE1BQU0sTUFBTSxHQUNSLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUNoRSxPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxjQUFjLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUNqRDtRQUNELEtBQUssUUFBUSxDQUFDLENBQUM7WUFDYixNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDakUsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQ2pFLE1BQU0sTUFBTSxHQUNSLGFBQWEsQ0FBQyxRQUFRLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksQ0FBQztZQUNqRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDdEMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsS0FBSyxZQUFZLENBQUMsQ0FBQztZQUNqQixNQUFNLGNBQWMsR0FDaEIsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUNsRCxDQUFDO1lBQ1gsTUFBTSxNQUFNLEdBQ1IsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1NBQ2pEO1FBQ0QsS0FBSyxRQUFRLENBQUMsQ0FBQztZQUNiLE1BQU0sQ0FBQyxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUNqRSxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzdCLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4QztRQUNELEtBQUssVUFBVSxDQUFDLENBQUM7WUFDZixNQUFNLENBQUMsR0FBRyxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDakUsTUFBTSxJQUFJLEdBQ04sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQzlELE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1lBQ25DLE9BQU8sQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUN4QztRQUNEO1lBQ0UsTUFBTSxTQUFTLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDO0FBRVYsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyB0Zk9wcyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BzX2Zvcl9jb252ZXJ0ZXInO1xuXG5pbXBvcnQge05hbWVkVGVuc29yc01hcH0gZnJvbSAnLi4vLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL2V4ZWN1dGlvbl9jb250ZXh0JztcbmltcG9ydCB7SW50ZXJuYWxPcEV4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Z2V0UGFyYW1WYWx1ZX0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLCBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LFxuICAgICBvcHMgPSB0Zk9wcyk6XG4gICAgICAgIFRlbnNvcltdID0+IHtcbiAgICAgICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgICAgIGNhc2UgJ0xvd2VyQm91bmQnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFNlcXVlbmNlID1cbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NvcnRlZFNlcXVlbmNlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndmFsdWVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgICAgIHJldHVybiBbb3BzLmxvd2VyQm91bmQoc29ydGVkU2VxdWVuY2UsIHZhbHVlcyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVG9wS1YyJzoge1xuICAgICAgICAgICAgICBjb25zdCB4ID0gZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCBrID0gZ2V0UGFyYW1WYWx1ZSgnaycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgICAgICBjb25zdCBzb3J0ZWQgPVxuICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc29ydGVkJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHMudG9wayh4LCBrLCBzb3J0ZWQpO1xuICAgICAgICAgICAgICByZXR1cm4gW3Jlc3VsdC52YWx1ZXMsIHJlc3VsdC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1VwcGVyQm91bmQnOiB7XG4gICAgICAgICAgICAgIGNvbnN0IHNvcnRlZFNlcXVlbmNlID1cbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NvcnRlZFNlcXVlbmNlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndmFsdWVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgICAgIHJldHVybiBbb3BzLnVwcGVyQm91bmQoc29ydGVkU2VxdWVuY2UsIHZhbHVlcyldO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2FzZSAnVW5pcXVlJzoge1xuICAgICAgICAgICAgICBjb25zdCB4ID0gZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHMudW5pcXVlKHgpO1xuICAgICAgICAgICAgICByZXR1cm4gW3Jlc3VsdC52YWx1ZXMsIHJlc3VsdC5pbmRpY2VzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1VuaXF1ZVYyJzoge1xuICAgICAgICAgICAgICBjb25zdCB4ID0gZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gb3BzLnVuaXF1ZSh4LCBheGlzKTtcbiAgICAgICAgICAgICAgcmV0dXJuIFtyZXN1bHQudmFsdWVzLCByZXN1bHQuaW5kaWNlc107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2V2YWx1YXRpb24nO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { cloneTensor, getParamValue, getTensor } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'Const': {\n            return tensorMap[node.name];\n        }\n        case 'PlaceholderWithDefault':\n            const def = getParamValue('default', node, tensorMap, context);\n            return [getTensor(node.name, tensorMap, context) || def];\n        case 'Placeholder':\n            return [getTensor(node.name, tensorMap, context)];\n        case 'Identity':\n        case 'StopGradient':\n        case 'FakeQuantWithMinMaxVars': { // This op is currently ignored.\n            const data = getParamValue('x', node, tensorMap, context);\n            return [cloneTensor(data)];\n        }\n        case 'IdentityN':\n            return getParamValue('x', node, tensorMap, context)\n                .map((t) => cloneTensor(t));\n        case 'Snapshot':\n            const snapshot = getParamValue('x', node, tensorMap, context);\n            return [cloneTensor(snapshot)];\n        case 'Shape':\n            return [ops.tensor1d(getParamValue('x', node, tensorMap, context).shape, 'int32')];\n        case 'ShapeN':\n            return getParamValue('x', node, tensorMap, context)\n                .map((t) => ops.tensor1d(t.shape));\n        case 'Size':\n            return [ops.scalar(getParamValue('x', node, tensorMap, context).size, 'int32')];\n        case 'Rank':\n            return [ops.scalar(getParamValue('x', node, tensorMap, context).rank, 'int32')];\n        case 'NoOp':\n            return [ops.scalar(1)];\n        case 'Print':\n            const input = getParamValue('x', node, tensorMap, context);\n            const data = getParamValue('data', node, tensorMap, context);\n            const message = getParamValue('message', node, tensorMap, context);\n            const summarize = getParamValue('summarize', node, tensorMap, context);\n            console.warn('The graph has a tf.print() operation,' +\n                'usually used for debugging, which slows down performance.');\n            console.log(message);\n            for (let i = 0; i < data.length; i++) {\n                console.log(Array.prototype.slice.call(data[i].dataSync())\n                    .slice(0, summarize));\n            }\n            return [input];\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'graph';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvZ3JhcGhfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLFdBQVcsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxPQUFPLENBQUMsQ0FBQztZQUNaLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUM3QjtRQUNELEtBQUssd0JBQXdCO1lBQzNCLE1BQU0sR0FBRyxHQUNMLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUNqRSxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQzNELEtBQUssYUFBYTtZQUNoQixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDcEQsS0FBSyxVQUFVLENBQUM7UUFDaEIsS0FBSyxjQUFjLENBQUM7UUFDcEIsS0FBSyx5QkFBeUIsQ0FBQyxDQUFDLEVBQUcsZ0NBQWdDO1lBQ2pFLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxHQUFHLEVB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LE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2Nsb25lVGVuc29yLCBnZXRQYXJhbVZhbHVlLCBnZXRUZW5zb3J9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnQ29uc3QnOiB7XG4gICAgICAgICAgcmV0dXJuIHRlbnNvck1hcFtub2RlLm5hbWVdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1BsYWNlaG9sZGVyV2l0aERlZmF1bHQnOlxuICAgICAgICAgIGNvbnN0IGRlZiA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RlZmF1bHQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICByZXR1cm4gW2dldFRlbnNvcihub2RlLm5hbWUsIHRlbnNvck1hcCwgY29udGV4dCkgfHwgZGVmXTtcbiAgICAgICAgY2FzZSAnUGxhY2Vob2xkZXInOlxuICAgICAgICAgIHJldHVybiBbZ2V0VGVuc29yKG5vZGUubmFtZSwgdGVuc29yTWFwLCBjb250ZXh0KV07XG4gICAgICAgIGNhc2UgJ0lkZW50aXR5JzpcbiAgICAgICAgY2FzZSAnU3RvcEdyYWRpZW50JzpcbiAgICAgICAgY2FzZSAnRmFrZVF1YW50V2l0aE1pbk1heFZhcnMnOiB7ICAvLyBUaGlzIG9wIGlzIGN1cnJlbnRseSBpZ25vcmVkLlxuICAgICAgICAgIGNvbnN0IGRhdGEgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihkYXRhKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSWRlbnRpdHlOJzpcbiAgICAgICAgICByZXR1cm4gKGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcltdKVxuICAgICAgICAgICAgICAubWFwKCh0OiBUZW5zb3IpID0+IGNsb25lVGVuc29yKHQpKTtcbiAgICAgICAgY2FzZSAnU25hcHNob3QnOlxuICAgICAgICAgIGNvbnN0IHNuYXBzaG90ID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcik7XG4gICAgICAgICAgcmV0dXJuIFtjbG9uZVRlbnNvcihzbmFwc2hvdCldO1xuICAgICAgICBjYXNlICdTaGFwZSc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMudGVuc29yMWQoXG4gICAgICAgICAgICAgIChnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpLnNoYXBlLFxuICAgICAgICAgICAgICAnaW50MzInKV07XG4gICAgICAgIGNhc2UgJ1NoYXBlTic6XG4gICAgICAgICAgcmV0dXJuIChnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3JbXSlcbiAgICAgICAgICAgICAgLm1hcCgodDogVGVuc29yKSA9PiBvcHMudGVuc29yMWQodC5zaGFwZSkpO1xuICAgICAgICBjYXNlICdTaXplJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5zY2FsYXIoXG4gICAgICAgICAgICAgIChnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpLnNpemUsXG4gICAgICAgICAgICAgICdpbnQzMicpXTtcbiAgICAgICAgY2FzZSAnUmFuayc6XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc2NhbGFyKFxuICAgICAgICAgICAgICAoZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKS5yYW5rLFxuICAgICAgICAgICAgICAnaW50MzInKV07XG4gICAgICAgIGNhc2UgJ05vT3AnOlxuICAgICAgICAgIHJldHVybiBbb3BzLnNjYWxhcigxKV07XG4gICAgICAgIGNhc2UgJ1ByaW50JzpcbiAgICAgICAgICBjb25zdCBpbnB1dCA9IGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCBkYXRhID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGF0YScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yW107XG4gICAgICAgICAgY29uc3QgbWVzc2FnZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ21lc3NhZ2UnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZztcbiAgICAgICAgICBjb25zdCBzdW1tYXJpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzdW1tYXJpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAgICdUaGUgZ3JhcGggaGFzIGEgdGYucHJpbnQoKSBvcGVyYXRpb24sJyArXG4gICAgICAgICAgICAgICd1c3VhbGx5IHVzZWQgZm9yIGRlYnVnZ2luZywgd2hpY2ggc2xvd3MgZG93biBwZXJmb3JtYW5jZS4nKTtcbiAgICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRhdGFbaV0uZGF0YVN5bmMoKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgc3VtbWFyaXplKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBbaW5wdXRdO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAnZ3JhcGgnO1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { keep, scalar, stack, tidy, unstack, util } from '@tensorflow/tfjs-core';\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\n/**\n * Hashtable contains a set of tensors, which can be accessed by key.\n */\nexport class HashTable {\n    /**\n     * Constructor of HashTable. Creates a hash table.\n     *\n     * @param keyDType `dtype` of the table keys.\n     * @param valueDType `dtype` of the table values.\n     */\n    constructor(keyDType, valueDType) {\n        this.keyDType = keyDType;\n        this.valueDType = valueDType;\n        this.handle = scalar(0);\n        // tslint:disable-next-line: no-any\n        this.tensorMap = new Map();\n        keep(this.handle);\n    }\n    get id() {\n        return this.handle.id;\n    }\n    /**\n     * Dispose the tensors and handle and clear the hashtable.\n     */\n    clearAndClose() {\n        this.tensorMap.forEach(value => value.dispose());\n        this.tensorMap.clear();\n        this.handle.dispose();\n    }\n    /**\n     * The number of items in the hash table.\n     */\n    size() {\n        return this.tensorMap.size;\n    }\n    /**\n     * The number of items in the hash table as a rank-0 tensor.\n     */\n    tensorSize() {\n        return tfOps.scalar(this.size(), 'int32');\n    }\n    /**\n     * Replaces the contents of the table with the specified keys and values.\n     * @param keys Keys to store in the hashtable.\n     * @param values Values to store in the hashtable.\n     */\n    async import(keys, values) {\n        this.checkKeyAndValueTensor(keys, values);\n        // We only store the primitive values of the keys, this allows lookup\n        // to be O(1).\n        const $keys = await keys.data();\n        // Clear the hashTable before inserting new values.\n        this.tensorMap.forEach(value => value.dispose());\n        this.tensorMap.clear();\n        return tidy(() => {\n            const $values = unstack(values);\n            const keysLength = $keys.length;\n            const valuesLength = $values.length;\n            util.assert(keysLength === valuesLength, () => `The number of elements doesn't match, keys has ` +\n                `${keysLength} elements, the values has ${valuesLength} ` +\n                `elements.`);\n            for (let i = 0; i < keysLength; i++) {\n                const key = $keys[i];\n                const value = $values[i];\n                keep(value);\n                this.tensorMap.set(key, value);\n            }\n            return this.handle;\n        });\n    }\n    /**\n     * Looks up keys in a hash table, outputs the corresponding values.\n     *\n     * Performs batch lookups, for every element in the key tensor, `find`\n     * stacks the corresponding value into the return tensor.\n     *\n     * If an element is not present in the table, the given `defaultValue` is\n     * used.\n     *\n     * @param keys Keys to look up. Must have the same type as the keys of the\n     *     table.\n     * @param defaultValue The scalar `defaultValue` is the value output for keys\n     *     not present in the table. It must also be of the same type as the\n     *     table values.\n     */\n    async find(keys, defaultValue) {\n        this.checkKeyAndValueTensor(keys, defaultValue);\n        const $keys = await keys.data();\n        return tidy(() => {\n            const result = [];\n            for (let i = 0; i < $keys.length; i++) {\n                const key = $keys[i];\n                const value = this.findWithDefault(key, defaultValue);\n                result.push(value);\n            }\n            return stack(result);\n        });\n    }\n    // tslint:disable-next-line: no-any\n    findWithDefault(key, defaultValue) {\n        const result = this.tensorMap.get(key);\n        return result != null ? result : defaultValue;\n    }\n    checkKeyAndValueTensor(key, value) {\n        if (key.dtype !== this.keyDType) {\n            throw new Error(`Expect key dtype ${this.keyDType}, but got ` +\n                `${key.dtype}`);\n        }\n        if (value.dtype !== this.valueDType) {\n            throw new Error(`Expect value dtype ${this.valueDType}, but got ` +\n                `${value.dtype}`);\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaF90YWJsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9leGVjdXRvci9oYXNoX3RhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBVyxJQUFJLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBVSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pHLGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBRTFFOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFVcEI7Ozs7O09BS0c7SUFDSCxZQUFxQixRQUFrQixFQUFXLFVBQW9CO1FBQWpELGFBQVEsR0FBUixRQUFRLENBQVU7UUFBVyxlQUFVLEdBQVYsVUFBVSxDQUFVO1FBQ3BFLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hCLG1DQUFtQztRQUNuQyxJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7UUFFeEMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBaEJELElBQUksRUFBRTtRQUNKLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7SUFDeEIsQ0FBQztJQWdCRDs7T0FFRztJQUNILGFBQWE7UUFDWCxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJO1FBQ0YsT0FB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QUM7SUFFTyxzQkFBc0IsQ0FBQyxHQUFXLEVBQUUsS0FBYTtRQUN2RCxJQUFJLEdBQUcsQ0FBQyxLQUFLLEtBQUssSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUMvQixNQUFNLElBQUksS0FBSyxDQUNYLG9CQUFvQixJQUFJLENBQUMsUUFBUSxZQUFZO2dCQUM3QyxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1NBQ3JCO1FBRUQsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDWCxzQkFBc0IsSUFBSSxDQUFDLFVBQVUsWUFBWTtnQkFDakQsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztTQUN2QjtJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7RGF0YVR5cGUsIGtlZXAsIHNjYWxhciwgc3RhY2ssIFRlbnNvciwgdGlkeSwgdW5zdGFjaywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbi8qKlxuICogSGFzaHRhYmxlIGNvbnRhaW5zIGEgc2V0IG9mIHRlbnNvcnMsIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBrZXkuXG4gKi9cbmV4cG9ydCBjbGFzcyBIYXNoVGFibGUge1xuICByZWFkb25seSBoYW5kbGU6IFRlbnNvcjtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICBwcml2YXRlIHRlbnNvck1hcDogTWFwPGFueSwgVGVuc29yPjtcblxuICBnZXQgaWQoKSB7XG4gICAgcmV0dXJuIHRoaXMuaGFuZGxlLmlkO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnN0cnVjdG9yIG9mIEhhc2hUYWJsZS4gQ3JlYXRlcyBhIGhhc2ggdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBrZXlEVHlwZSBgZHR5cGVgIG9mIHRoZSB0YWJsZSBrZXlzLlxuICAgKiBAcGFyYW0gdmFsdWVEVHlwZSBgZHR5cGVgIG9mIHRoZSB0YWJsZSB2YWx1ZXMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihyZWFkb25seSBrZXlEVHlwZTogRGF0YVR5cGUsIHJlYWRvbmx5IHZhbHVlRFR5cGU6IERhdGFUeXBlKSB7XG4gICAgdGhpcy5oYW5kbGUgPSBzY2FsYXIoMCk7XG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgICB0aGlzLnRlbnNvck1hcCA9IG5ldyBNYXA8YW55LCBUZW5zb3I+KCk7XG5cbiAgICBrZWVwKHRoaXMuaGFuZGxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIHRoZSB0ZW5zb3JzIGFuZCBoYW5kbGUgYW5kIGNsZWFyIHRoZSBoYXNodGFibGUuXG4gICAqL1xuICBjbGVhckFuZENsb3NlKCkge1xuICAgIHRoaXMudGVuc29yTWFwLmZvckVhY2godmFsdWUgPT4gdmFsdWUuZGlzcG9zZSgpKTtcbiAgICB0aGlzLnRlbnNvck1hcC5jbGVhcigpO1xuICAgIHRoaXMuaGFuZGxlLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBoYXNoIHRhYmxlLlxuICAgKi9cbiAgc2l6ZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnRlbnNvck1hcC5zaXplO1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gdGhlIGhhc2ggdGFibGUgYXMgYSByYW5rLTAgdGVuc29yLlxuICAgKi9cbiAgdGVuc29yU2l6ZSgpOiBUZW5zb3Ige1xuICAgIHJldHVybiB0Zk9wcy5zY2FsYXIodGhpcy5zaXplKCksICdpbnQzMicpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2VzIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGUgd2l0aCB0aGUgc3BlY2lmaWVkIGtleXMgYW5kIHZhbHVlcy5cbiAgICogQHBhcmFtIGtleXMgS2V5cyB0byBzdG9yZSBpbiB0aGUgaGFzaHRhYmxlLlxuICAgKiBAcGFyYW0gdmFsdWVzIFZhbHVlcyB0byBzdG9yZSBpbiB0aGUgaGFzaHRhYmxlLlxuICAgKi9cbiAgYXN5bmMgaW1wb3J0KGtleXM6IFRlbnNvciwgdmFsdWVzOiBUZW5zb3IpOiBQcm9taXNlPFRlbnNvcj4ge1xuICAgIHRoaXMuY2hlY2tLZXlBbmRWYWx1ZVRlbnNvcihrZXlzLCB2YWx1ZXMpO1xuXG4gICAgLy8gV2Ugb25seSBzdG9yZSB0aGUgcHJpbWl0aXZlIHZhbHVlcyBvZiB0aGUga2V5cywgdGhpcyBhbGxvd3MgbG9va3VwXG4gICAgLy8gdG8gYmUgTygxKS5cbiAgICBjb25zdCAka2V5cyA9IGF3YWl0IGtleXMuZGF0YSgpO1xuXG4gICAgLy8gQ2xlYXIgdGhlIGhhc2hUYWJsZSBiZWZvcmUgaW5zZXJ0aW5nIG5ldyB2YWx1ZXMuXG4gICAgdGhpcy50ZW5zb3JNYXAuZm9yRWFjaCh2YWx1ZSA9PiB2YWx1ZS5kaXNwb3NlKCkpO1xuICAgIHRoaXMudGVuc29yTWFwLmNsZWFyKCk7XG5cbiAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICBjb25zdCAkdmFsdWVzID0gdW5zdGFjayh2YWx1ZXMpO1xuXG4gICAgICBjb25zdCBrZXlzTGVuZ3RoID0gJGtleXMubGVuZ3RoO1xuICAgICAgY29uc3QgdmFsdWVzTGVuZ3RoID0gJHZhbHVlcy5sZW5ndGg7XG5cbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgIGtleXNMZW5ndGggPT09IHZhbHVlc0xlbmd0aCxcbiAgICAgICAgICAoKSA9PiBgVGhlIG51bWJlciBvZiBlbGVtZW50cyBkb2Vzbid0IG1hdGNoLCBrZXlzIGhhcyBgICtcbiAgICAgICAgICAgICAgYCR7a2V5c0xlbmd0aH0gZWxlbWVudHMsIHRoZSB2YWx1ZXMgaGFzICR7dmFsdWVzTGVuZ3RofSBgICtcbiAgICAgICAgICAgICAgYGVsZW1lbnRzLmApO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXNMZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBrZXkgPSAka2V5c1tpXTtcbiAgICAgICAgY29uc3QgdmFsdWUgPSAkdmFsdWVzW2ldO1xuXG4gICAgICAgIGtlZXAodmFsdWUpO1xuICAgICAgICB0aGlzLnRlbnNvck1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmhhbmRsZTtcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb29rcyB1cCBrZXlzIGluIGEgaGFzaCB0YWJsZSwgb3V0cHV0cyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuXG4gICAqXG4gICAqIFBlcmZvcm1zIGJhdGNoIGxvb2t1cHMsIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBrZXkgdGVuc29yLCBgZmluZGBcbiAgICogc3RhY2tzIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGludG8gdGhlIHJldHVybiB0ZW5zb3IuXG4gICAqXG4gICAqIElmIGFuIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgaW4gdGhlIHRhYmxlLCB0aGUgZ2l2ZW4gYGRlZmF1bHRWYWx1ZWAgaXNcbiAgICogdXNlZC5cbiAgICpcbiAgICogQHBhcmFtIGtleXMgS2V5cyB0byBsb29rIHVwLiBNdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUga2V5cyBvZiB0aGVcbiAgICogICAgIHRhYmxlLlxuICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSBzY2FsYXIgYGRlZmF1bHRWYWx1ZWAgaXMgdGhlIHZhbHVlIG91dHB1dCBmb3Iga2V5c1xuICAgKiAgICAgbm90IHByZXNlbnQgaW4gdGhlIHRhYmxlLiBJdCBtdXN0IGFsc28gYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGVcbiAgICogICAgIHRhYmxlIHZhbHVlcy5cbiAgICovXG4gIGFzeW5jIGZpbmQoa2V5czogVGVuc29yLCBkZWZhdWx0VmFsdWU6IFRlbnNvcik6IFByb21pc2U8VGVuc29yPiB7XG4gICAgdGhpcy5jaGVja0tleUFuZFZhbHVlVGVuc29yKGtleXMsIGRlZmF1bHRWYWx1ZSk7XG5cbiAgICBjb25zdCAka2V5cyA9IGF3YWl0IGtleXMuZGF0YSgpO1xuXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgcmVzdWx0OiBUZW5zb3JbXSA9IFtdO1xuXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8ICRrZXlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGtleSA9ICRrZXlzW2ldO1xuXG4gICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5maW5kV2l0aERlZmF1bHQoa2V5LCBkZWZhdWx0VmFsdWUpO1xuICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdGFjayhyZXN1bHQpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1hbnlcbiAgcHJpdmF0ZSBmaW5kV2l0aERlZmF1bHQoa2V5OiBhbnksIGRlZmF1bHRWYWx1ZTogVGVuc29yKTogVGVuc29yIHtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnRlbnNvck1hcC5nZXQoa2V5KTtcblxuICAgIHJldHVybiByZXN1bHQgIT0gbnVsbCA/IHJlc3VsdCA6IGRlZmF1bHRWYWx1ZTtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tLZXlBbmRWYWx1ZVRlbnNvcihrZXk6IFRlbnNvciwgdmFsdWU6IFRlbnNvcikge1xuICAgIGlmIChrZXkuZHR5cGUgIT09IHRoaXMua2V5RFR5cGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRXhwZWN0IGtleSBkdHlwZSAke3RoaXMua2V5RFR5cGV9LCBidXQgZ290IGAgK1xuICAgICAgICAgIGAke2tleS5kdHlwZX1gKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUuZHR5cGUgIT09IHRoaXMudmFsdWVEVHlwZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBFeHBlY3QgdmFsdWUgZHR5cGUgJHt0aGlzLnZhbHVlRFR5cGV9LCBidXQgZ290IGAgK1xuICAgICAgICAgIGAke3ZhbHVlLmR0eXBlfWApO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { HashTable } from '../../executor/hash_table';\nimport { getParamValue } from './utils';\nexport const executeOp = async (node, tensorMap, context, resourceManager) => {\n    switch (node.op) {\n        case 'HashTable':\n        case 'HashTableV2': {\n            const keyDType = getParamValue('keyDType', node, tensorMap, context);\n            const valueDType = getParamValue('valueDType', node, tensorMap, context);\n            const hashTable = new HashTable(keyDType, valueDType);\n            resourceManager.addHashTable(node.name, hashTable);\n            return [hashTable.handle];\n        }\n        case 'LookupTableImport':\n        case 'LookupTableImportV2': {\n            const handle = getParamValue('tableHandle', node, tensorMap, context, resourceManager);\n            const keys = getParamValue('keys', node, tensorMap, context);\n            const values = getParamValue('values', node, tensorMap, context);\n            const hashTable = resourceManager.getHashTableById(handle.id);\n            return [await hashTable.import(keys, values)];\n        }\n        case 'LookupTableFind':\n        case 'LookupTableFindV2': {\n            const handle = getParamValue('tableHandle', node, tensorMap, context, resourceManager);\n            const keys = getParamValue('keys', node, tensorMap, context);\n            const defaultValue = getParamValue('defaultValue', node, tensorMap, context);\n            const hashTable = resourceManager.getHashTableById(handle.id);\n            return [await hashTable.find(keys, defaultValue)];\n        }\n        case 'LookupTableSize':\n        case 'LookupTableSizeV2': {\n            const handle = getParamValue('tableHandle', node, tensorMap, context, resourceManager);\n            const hashTable = resourceManager.getHashTableById(handle.id);\n            return [hashTable.tensorSize()];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'hash_table';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGFzaF90YWJsZV9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9oYXNoX3RhYmxlX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQU1ILE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSwyQkFBMkIsQ0FBQztBQUlwRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBNEIsS0FBSyxFQUNuRCxJQUFVLEVBQUUsU0FBMEIsRUFBRSxPQUF5QixFQUNqRSxlQUFnQyxFQUFxQixFQUFFO0lBQ3pELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssV0FBVyxDQUFDO1FBQ2pCLEtBQUssYUFBYSxDQUFDLENBQUM7WUFDbEIsTUFBTSxRQUFRLEdBQ1YsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ3BFLE1BQU0sVUFBVSxHQUNaLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUV0RSxNQUFNLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDdEQsZUFBZSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQ25ELE9BQU8sQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDM0I7UUFDRCxLQUFLLG1CQUFtQixDQUFDO1FBQ3pCLEtBQUsscUJBQXFCLENBQUMsQ0FBQztZQUMxQixNQUFNLE1BQU0sR0FBRyxhQUFhLENBQ1QsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUN2QyxlQUFlLENBQVcsQ0FBQztZQUM5QyxNQUFNLElBQUksR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDdkUsTUFBTSxNQUFNLEdBQ1IsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBRWhFLE1BQU0sU0FBUyxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFOUQsT0FBTyxDQUFDLE1BQU0sU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztTQUMvQztRQUNELEtBQUssaUJBQWlCLENBQUM7UUFDdkIsS0FBSyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3hCLE1BQU0sTUFBTSxHQUFHLGFBQWEsQ0FDVCxhQUFhLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQ3ZDLGVBQWUsQ0FBVyxDQUFDO1lBQzlDLE1BQU0sSUFBSSxHQUFHLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUN2RSxNQUFNLFlBQVksR0FDZCxhQUFhLENBQUMsY0FBYyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFFdEUsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsTUFBTSxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsS0FBSyxpQkFBaUIsQ0FBQztRQUN2QixLQUFLLG1CQUFtQixDQUFDLENBQUM7WUFDeEIsTUFBTSxNQUFNLEdBQUcsYUFBYSxDQUNULGFBQWEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFDdkMsZUFBZSxDQUFXLENBQUM7WUFFOUMsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM5RCxPQUFPLENBQUMsU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDakM7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIFRlbnNvcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0hhc2hUYWJsZX0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvaGFzaF90YWJsZSc7XG5pbXBvcnQge1Jlc291cmNlTWFuYWdlcn0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvcmVzb3VyY2VfbWFuYWdlcic7XG5pbXBvcnQge0ludGVybmFsT3BBc3luY0V4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Z2V0UGFyYW1WYWx1ZX0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BBc3luY0V4ZWN1dG9yID0gYXN5bmMoXG4gICAgbm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgcmVzb3VyY2VNYW5hZ2VyOiBSZXNvdXJjZU1hbmFnZXIpOiBQcm9taXNlPFRlbnNvcltdPiA9PiB7XG4gIHN3aXRjaCAobm9kZS5vcCkge1xuICAgIGNhc2UgJ0hhc2hUYWJsZSc6XG4gICAgY2FzZSAnSGFzaFRhYmxlVjInOiB7XG4gICAgICBjb25zdCBrZXlEVHlwZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2V5RFR5cGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIERhdGFUeXBlO1xuICAgICAgY29uc3QgdmFsdWVEVHlwZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndmFsdWVEVHlwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgRGF0YVR5cGU7XG5cbiAgICAgIGNvbnN0IGhhc2hUYWJsZSA9IG5ldyBIYXNoVGFibGUoa2V5RFR5cGUsIHZhbHVlRFR5cGUpO1xuICAgICAgcmVzb3VyY2VNYW5hZ2VyLmFkZEhhc2hUYWJsZShub2RlLm5hbWUsIGhhc2hUYWJsZSk7XG4gICAgICByZXR1cm4gW2hhc2hUYWJsZS5oYW5kbGVdO1xuICAgIH1cbiAgICBjYXNlICdMb29rdXBUYWJsZUltcG9ydCc6XG4gICAgY2FzZSAnTG9va3VwVGFibGVJbXBvcnRWMic6IHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9IGdldFBhcmFtVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYmxlSGFuZGxlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWFuYWdlcikgYXMgVGVuc29yO1xuICAgICAgY29uc3Qga2V5cyA9IGdldFBhcmFtVmFsdWUoJ2tleXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IHZhbHVlcyA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndmFsdWVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG5cbiAgICAgIGNvbnN0IGhhc2hUYWJsZSA9IHJlc291cmNlTWFuYWdlci5nZXRIYXNoVGFibGVCeUlkKGhhbmRsZS5pZCk7XG5cbiAgICAgIHJldHVybiBbYXdhaXQgaGFzaFRhYmxlLmltcG9ydChrZXlzLCB2YWx1ZXMpXTtcbiAgICB9XG4gICAgY2FzZSAnTG9va3VwVGFibGVGaW5kJzpcbiAgICBjYXNlICdMb29rdXBUYWJsZUZpbmRWMic6IHtcbiAgICAgIGNvbnN0IGhhbmRsZSA9IGdldFBhcmFtVmFsdWUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3RhYmxlSGFuZGxlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlTWFuYWdlcikgYXMgVGVuc29yO1xuICAgICAgY29uc3Qga2V5cyA9IGdldFBhcmFtVmFsdWUoJ2tleXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGVmYXVsdFZhbHVlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG5cbiAgICAgIGNvbnN0IGhhc2hUYWJsZSA9IHJlc291cmNlTWFuYWdlci5nZXRIYXNoVGFibGVCeUlkKGhhbmRsZS5pZCk7XG4gICAgICByZXR1cm4gW2F3YWl0IGhhc2hUYWJsZS5maW5kKGtleXMsIGRlZmF1bHRWYWx1ZSldO1xuICAgIH1cbiAgICBjYXNlICdMb29rdXBUYWJsZVNpemUnOlxuICAgIGNhc2UgJ0xvb2t1cFRhYmxlU2l6ZVYyJzoge1xuICAgICAgY29uc3QgaGFuZGxlID0gZ2V0UGFyYW1WYWx1ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAndGFibGVIYW5kbGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VNYW5hZ2VyKSBhcyBUZW5zb3I7XG5cbiAgICAgIGNvbnN0IGhhc2hUYWJsZSA9IHJlc291cmNlTWFuYWdlci5nZXRIYXNoVGFibGVCeUlkKGhhbmRsZS5pZCk7XG4gICAgICByZXR1cm4gW2hhc2hUYWJsZS50ZW5zb3JTaXplKCldO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgfVxufTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2hhc2hfdGFibGUnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'ResizeBilinear': {\n            const images = getParamValue('images', node, tensorMap, context);\n            const size = getParamValue('size', node, tensorMap, context);\n            const alignCorners = getParamValue('alignCorners', node, tensorMap, context);\n            const halfPixelCenters = getParamValue('halfPixelCenters', node, tensorMap, context);\n            return [ops.image.resizeBilinear(images, [size[0], size[1]], alignCorners, halfPixelCenters)];\n        }\n        case 'ResizeNearestNeighbor': {\n            const images = getParamValue('images', node, tensorMap, context);\n            const size = getParamValue('size', node, tensorMap, context);\n            const alignCorners = getParamValue('alignCorners', node, tensorMap, context);\n            const halfPixelCenters = getParamValue('halfPixelCenters', node, tensorMap, context);\n            return [ops.image.resizeNearestNeighbor(images, [size[0], size[1]], alignCorners, halfPixelCenters)];\n        }\n        case 'CropAndResize': {\n            const image = getParamValue('image', node, tensorMap, context);\n            const boxes = getParamValue('boxes', node, tensorMap, context);\n            const boxInd = getParamValue('boxInd', node, tensorMap, context);\n            const cropSize = getParamValue('cropSize', node, tensorMap, context);\n            const method = getParamValue('method', node, tensorMap, context);\n            const extrapolationValue = getParamValue('extrapolationValue', node, tensorMap, context);\n            return [ops.image.cropAndResize(image, boxes, boxInd, cropSize, method, extrapolationValue)];\n        }\n        case 'ImageProjectiveTransformV3': {\n            const images = getParamValue('images', node, tensorMap, context);\n            const transforms = getParamValue('transforms', node, tensorMap, context);\n            const outputShape = getParamValue('outputShape', node, tensorMap, context);\n            const fillValue = getParamValue('fillValue', node, tensorMap, context);\n            const interpolation = getParamValue('interpolation', node, tensorMap, context);\n            const fillMode = getParamValue('fillMode', node, tensorMap, context);\n            return [ops.image.transform(images, transforms, interpolation.toLowerCase(), fillMode.toLowerCase(), fillValue, outputShape)];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'image';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW1hZ2VfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvaW1hZ2VfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQ3RDLE9BQXlCLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ25ELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssZ0JBQWdCLENBQUMsQ0FBQztZQUNyQixNQUFNLE1BQU0sR0FDUixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDaEUsTUFBTSxJQUFJLEdBQ04sYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2hFLE1BQU0sWUFBWSxHQUNkLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQy9DLENBQUM7WUFDWixNQUFNLGdCQUFnQixHQUNsQixhQUFhLENBQUMsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ25ELENBQUM7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxjQUFjLENBQzVCLE1BQTZCLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsWUFBWSxFQUMvRCxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7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QUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRCwgVGVuc29yMkQsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgICAgIGNhc2UgJ1Jlc2l6ZUJpbGluZWFyJzoge1xuICAgICAgICAgIGNvbnN0IGltYWdlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ltYWdlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBhbGlnbkNvcm5lcnMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhbGlnbkNvcm5lcnMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIGJvb2xlYW47XG4gICAgICAgICAgY29uc3QgaGFsZlBpeGVsQ2VudGVycyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2hhbGZQaXhlbENlbnRlcnMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIGJvb2xlYW47XG4gICAgICAgICAgcmV0dXJuIFtvcHMuaW1hZ2UucmVzaXplQmlsaW5lYXIoXG4gICAgICAgICAgICAgIGltYWdlcyBhcyBUZW5zb3IzRCB8IFRlbnNvcjRELCBbc2l6ZVswXSwgc2l6ZVsxXV0sIGFsaWduQ29ybmVycyxcbiAgICAgICAgICAgICAgaGFsZlBpeGVsQ2VudGVycyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1Jlc2l6ZU5lYXJlc3ROZWlnaGJvcic6IHtcbiAgICAgICAgICBjb25zdCBpbWFnZXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbWFnZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCBzaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgYWxpZ25Db3JuZXJzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYWxpZ25Db3JuZXJzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICBib29sZWFuO1xuICAgICAgICAgIGNvbnN0IGhhbGZQaXhlbENlbnRlcnMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdoYWxmUGl4ZWxDZW50ZXJzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLmltYWdlLnJlc2l6ZU5lYXJlc3ROZWlnaGJvcihcbiAgICAgICAgICAgICAgaW1hZ2VzIGFzIFRlbnNvcjNEIHwgVGVuc29yNEQsIFtzaXplWzBdLCBzaXplWzFdXSwgYWxpZ25Db3JuZXJzLFxuICAgICAgICAgICAgICBoYWxmUGl4ZWxDZW50ZXJzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ3JvcEFuZFJlc2l6ZSc6IHtcbiAgICAgICAgICBjb25zdCBpbWFnZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2ltYWdlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgY29uc3QgYm94ZXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdib3hlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IGJveEluZCA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2JveEluZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IGNyb3BTaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY3JvcFNpemUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IG1ldGhvZCA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ21ldGhvZCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgc3RyaW5nO1xuICAgICAgICAgIGNvbnN0IGV4dHJhcG9sYXRpb25WYWx1ZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2V4dHJhcG9sYXRpb25WYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgbnVtYmVyO1xuICAgICAgICAgIHJldHVybiBbb3BzLmltYWdlLmNyb3BBbmRSZXNpemUoXG4gICAgICAgICAgICAgIGltYWdlIGFzIFRlbnNvcjRELCBib3hlcyBhcyBUZW5zb3IyRCwgYm94SW5kIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBjcm9wU2l6ZSBhcyBbbnVtYmVyLCBudW1iZXJdLCBtZXRob2QgYXMgJ2JpbGluZWFyJyB8ICduZWFyZXN0JyxcbiAgICAgICAgICAgICAgZXh0cmFwb2xhdGlvblZhbHVlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW1hZ2VQcm9qZWN0aXZlVHJhbnNmb3JtVjMnOiB7XG4gICAgICAgICAgY29uc3QgaW1hZ2VzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW1hZ2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgY29uc3QgdHJhbnNmb3JtcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3RyYW5zZm9ybXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCBvdXRwdXRTaGFwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ291dHB1dFNoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBmaWxsVmFsdWUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdmaWxsVmFsdWUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW50ZXJwb2xhdGlvbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgc3RyaW5nO1xuICAgICAgICAgIGNvbnN0IGZpbGxNb2RlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZmlsbE1vZGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZztcbiAgICAgICAgICByZXR1cm4gW29wcy5pbWFnZS50cmFuc2Zvcm0oXG4gICAgICAgICAgICAgIGltYWdlcyBhcyBUZW5zb3I0RCxcbiAgICAgICAgICAgICAgdHJhbnNmb3JtcyBhcyBUZW5zb3IyRCxcbiAgICAgICAgICAgICAgaW50ZXJwb2xhdGlvbi50b0xvd2VyQ2FzZSgpIGFzICdiaWxpbmVhcicgfCAnbmVhcmVzdCcsXG4gICAgICAgICAgICAgIGZpbGxNb2RlLnRvTG93ZXJDYXNlKCkgYXMgJ2NvbnN0YW50JyB8ICdyZWZsZWN0JyB8ICd3cmFwJyB8ICduZWFyZXN0JyxcbiAgICAgICAgICAgICAgZmlsbFZhbHVlLFxuICAgICAgICAgICAgICBvdXRwdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXJdKV07XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgfVxuICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdpbWFnZSc7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'Equal': {\n            return [ops.equal(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'NotEqual': {\n            return [ops.notEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'Greater': {\n            return [ops.greater(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'GreaterEqual': {\n            return [ops.greaterEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'Less': {\n            return [ops.less(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'LessEqual': {\n            return [ops.lessEqual(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'LogicalAnd': {\n            return [ops.logicalAnd(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'LogicalNot': {\n            return [ops.logicalNot(getParamValue('a', node, tensorMap, context))];\n        }\n        case 'LogicalOr': {\n            return [ops.logicalOr(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        case 'Select':\n        case 'SelectV2': {\n            return [ops.where(getParamValue('condition', node, tensorMap, context), getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context))];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'logical';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naWNhbF9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9sb2dpY2FsX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUN0QyxPQUF5QixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQVksRUFBRTtJQUNuRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixLQUFLLE9BQU8sQ0FBQyxDQUFDO1lBQ1osT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQ2IsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxVQUFVLENBQUMsQ0FBQztZQUNmLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUNoQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLFNBQVMsQ0FBQyxDQUFDO1lBQ2QsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQ2YsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxjQUFjLENBQUMsQ0FBQztZQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FDcEIsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNaLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssV0FBVyxDQUFDLENBQUM7WUFDaEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQ2pCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssWUFBWSxDQUFDLENBQUM7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssWUFBWSxDQUFDLENBQUM7WUFDakIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLFdBQVcsQ0FBQyxDQUFDO1lBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLFFBQVEsQ0FBQztRQUNkLEtBQUssVUFBVSxDQUFDLENBQUM7WUFDZixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDYixhQUFhLENBQUMsV0FBVyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzlELGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNEO1lBQ0UsTUFBTSxTQUFTLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDO0FBRU4sTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyB0Zk9wcyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BzX2Zvcl9jb252ZXJ0ZXInO1xuXG5pbXBvcnQge05hbWVkVGVuc29yc01hcH0gZnJvbSAnLi4vLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL2V4ZWN1dGlvbl9jb250ZXh0JztcbmltcG9ydCB7SW50ZXJuYWxPcEV4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Z2V0UGFyYW1WYWx1ZX0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBvcHMgPSB0Zk9wcyk6IFRlbnNvcltdID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICBjYXNlICdFcXVhbCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5lcXVhbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOb3RFcXVhbCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5ub3RFcXVhbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdHcmVhdGVyJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmdyZWF0ZXIoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnR3JlYXRlckVxdWFsJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmdyZWF0ZXJFcXVhbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMZXNzJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxlc3MoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTGVzc0VxdWFsJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxlc3NFcXVhbChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMb2dpY2FsQW5kJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxvZ2ljYWxBbmQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTG9naWNhbE5vdCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5sb2dpY2FsTm90KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMb2dpY2FsT3InOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMubG9naWNhbE9yKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NlbGVjdCc6XG4gICAgICAgIGNhc2UgJ1NlbGVjdFYyJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLndoZXJlKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdjb25kaXRpb24nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ2xvZ2ljYWwnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'BatchMatMul':\n        case 'BatchMatMulV2':\n        case 'MatMul':\n            return [ops.matMul(getParamValue('a', node, tensorMap, context), getParamValue('b', node, tensorMap, context), getParamValue('transposeA', node, tensorMap, context), getParamValue('transposeB', node, tensorMap, context))];\n        case 'Einsum':\n            return [ops.einsum(getParamValue('equation', node, tensorMap, context), ...getParamValue('tensors', node, tensorMap, context))];\n        case 'Transpose':\n            return [ops.transpose(getParamValue('x', node, tensorMap, context), getParamValue('perm', node, tensorMap, context))];\n        case '_FusedMatMul':\n            const [extraOp, activationFunc] = getParamValue('fusedOps', node, tensorMap, context);\n            const isBiasAdd = extraOp === 'biasadd';\n            const isPrelu = activationFunc === 'prelu';\n            const numArgs = getParamValue('numArgs', node, tensorMap, context);\n            const leakyreluAlpha = getParamValue('leakyreluAlpha', node, tensorMap, context);\n            if (isBiasAdd) {\n                if (isPrelu && numArgs !== 2) {\n                    throw new Error('Fused MatMul with BiasAdd and Prelu must have two ' +\n                        'extra arguments: bias and alpha.');\n                }\n                if (!isPrelu && numArgs !== 1) {\n                    throw new Error('Fused MatMul with BiasAdd must have one extra argument: bias.');\n                }\n            }\n            const [biasArg, preluArg] = getParamValue('args', node, tensorMap, context);\n            return [ops.fused.matMul({\n                    a: getParamValue('a', node, tensorMap, context),\n                    b: getParamValue('b', node, tensorMap, context),\n                    transposeA: getParamValue('transposeA', node, tensorMap, context),\n                    transposeB: getParamValue('transposeB', node, tensorMap, context),\n                    bias: biasArg,\n                    activation: activationFunc,\n                    preluActivationWeights: preluArg,\n                    leakyreluAlpha\n                })];\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'matrices';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF0cmljZXNfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvbWF0cmljZXNfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQ3RDLE9BQXlCLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ25ELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssYUFBYSxDQUFDO1FBQ25CLEtBQUssZUFBZSxDQUFDO1FBQ3JCLEtBQUssUUFBUTtZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUNkLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsRUFDeEQsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxFQUN4RCxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLEVBQ2hFLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBRXBCLEtBQUssUUFBUTtZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUNkLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDN0QsR0FBRyxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUN4QyxDQUFDLENBQUMsQ0FBQztRQUVyQixLQUFLLFdBQVc7WUFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDakIsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUMsQ0FBQyxDQUFDO1FBRXBFLEtBQUssY0FBYztZQUNqQixNQUFNLENBQUMsT0FBTyxFQUFFLGNBQWMsQ0FBQyxHQUMxQixhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFjLENBQUM7WUFFdEUsTUFBTSxTQUFTLEdBQUcsT0FBTyxLQUFLLFNBQVMsQ0FBQztZQUN4QyxNQUFNLE9BQU8sR0FBRyxjQUFjLEtBQUssT0FBTyxDQUFDO1lBRTNDLE1BQU0sT0FBTyxHQUNSLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVksQ0FBQztZQUNuRSxNQUFNLGNBQWMsR0FDaEIsYUFBYSxDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUNsRCxDQUFDO1lBRVgsSUFBSSxTQUFTLEVBQUU7Z0JBQ2IsSUFBSSxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtvQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FDWCxvREFBb0Q7d0JBQ3BELGtDQUFrQyxDQUFDLENBQUM7aUJBQ3pDO2dCQUNELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLENBQUMsRUFBRTtvQkFDN0IsTUFBTSxJQUFJLEtBQUssQ0FDWCwrREFBK0QsQ0FBQyxDQUFDO2lCQUN0RTthQUNGO1lBQ0QsTUFBTSxDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsR0FDckIsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxDQUFDO1lBQ2hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztvQkFDdkIsQ0FBQyxFQUFFLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWE7b0JBQzNELENBQUMsRUFBRSxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhO29CQUMzRCxVQUFVLEVBQUUsYUFBYSxDQUFDLFlBQVksRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDckQ7b0JBQ1gsVUFBVSxFQUFFLGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3JEO29CQUNYLElBQUksRUFBRSxPQUFPO29CQUNiLFVBQVUsRUFBRSxjQUF3QztvQkFDcEQsc0JBQXNCLEVBQUUsUUFBUTtvQkFDaEMsY0FBYztpQkFDZixDQUFDLENBQUMsQ0FBQztRQUVOO1lBQ0UsTUFBTSxTQUFTLENBQUMsYUFBYSxJQUFJLENBQUMsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO0tBQzlEO0FBQ0gsQ0FBQyxDQUFDO0FBRU4sTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjJEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnQmF0Y2hNYXRNdWwnOlxuICAgICAgICBjYXNlICdCYXRjaE1hdE11bFYyJzpcbiAgICAgICAgY2FzZSAnTWF0TXVsJzpcbiAgICAgICAgICByZXR1cm4gW29wcy5tYXRNdWwoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2EnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjJELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IyRCxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndHJhbnNwb3NlQScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYm9vbGVhbixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndHJhbnNwb3NlQicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIGJvb2xlYW4pXTtcblxuICAgICAgICBjYXNlICdFaW5zdW0nOlxuICAgICAgICAgIHJldHVybiBbb3BzLmVpbnN1bShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXF1YXRpb24nLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgLi4uZ2V0UGFyYW1WYWx1ZSgndGVuc29ycycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIFRlbnNvcltdKV07XG5cbiAgICAgICAgY2FzZSAnVHJhbnNwb3NlJzpcbiAgICAgICAgICByZXR1cm4gW29wcy50cmFuc3Bvc2UoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncGVybScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10pXTtcblxuICAgICAgICBjYXNlICdfRnVzZWRNYXRNdWwnOlxuICAgICAgICAgIGNvbnN0IFtleHRyYU9wLCBhY3RpdmF0aW9uRnVuY10gPVxuICAgICAgICAgICAgICAoZ2V0UGFyYW1WYWx1ZSgnZnVzZWRPcHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZ1tdKTtcblxuICAgICAgICAgIGNvbnN0IGlzQmlhc0FkZCA9IGV4dHJhT3AgPT09ICdiaWFzYWRkJztcbiAgICAgICAgICBjb25zdCBpc1ByZWx1ID0gYWN0aXZhdGlvbkZ1bmMgPT09ICdwcmVsdSc7XG5cbiAgICAgICAgICBjb25zdCBudW1BcmdzID1cbiAgICAgICAgICAgICAgKGdldFBhcmFtVmFsdWUoJ251bUFyZ3MnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcik7XG4gICAgICAgICAgY29uc3QgbGVha3lyZWx1QWxwaGEgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdsZWFreXJlbHVBbHBoYScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgbnVtYmVyO1xuXG4gICAgICAgICAgaWYgKGlzQmlhc0FkZCkge1xuICAgICAgICAgICAgaWYgKGlzUHJlbHUgJiYgbnVtQXJncyAhPT0gMikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICAgICAnRnVzZWQgTWF0TXVsIHdpdGggQmlhc0FkZCBhbmQgUHJlbHUgbXVzdCBoYXZlIHR3byAnICtcbiAgICAgICAgICAgICAgICAgICdleHRyYSBhcmd1bWVudHM6IGJpYXMgYW5kIGFscGhhLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCFpc1ByZWx1ICYmIG51bUFyZ3MgIT09IDEpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgJ0Z1c2VkIE1hdE11bCB3aXRoIEJpYXNBZGQgbXVzdCBoYXZlIG9uZSBleHRyYSBhcmd1bWVudDogYmlhcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgW2JpYXNBcmcsIHByZWx1QXJnXSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2FyZ3MnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcltdO1xuICAgICAgICAgIHJldHVybiBbb3BzLmZ1c2VkLm1hdE11bCh7XG4gICAgICAgICAgICBhOiBnZXRQYXJhbVZhbHVlKCdhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IyRCxcbiAgICAgICAgICAgIGI6IGdldFBhcmFtVmFsdWUoJ2InLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjJELFxuICAgICAgICAgICAgdHJhbnNwb3NlQTogZ2V0UGFyYW1WYWx1ZSgndHJhbnNwb3NlQScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgICAgdHJhbnNwb3NlQjogZ2V0UGFyYW1WYWx1ZSgndHJhbnNwb3NlQicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICBib29sZWFuLFxuICAgICAgICAgICAgYmlhczogYmlhc0FyZyxcbiAgICAgICAgICAgIGFjdGl2YXRpb246IGFjdGl2YXRpb25GdW5jIGFzIHRmT3BzLmZ1c2VkLkFjdGl2YXRpb24sXG4gICAgICAgICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzOiBwcmVsdUFyZyxcbiAgICAgICAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgICAgICAgfSldO1xuXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAnbWF0cmljZXMnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'EuclideanNorm':\n            return [ops.euclideanNorm(getParamValue('x', node, tensorMap, context), getParamValue('axis', node, tensorMap, context), getParamValue('keepDims', node, tensorMap, context))];\n        case 'FusedBatchNorm':\n        case 'FusedBatchNormV2': {\n            return [ops.batchNorm(getParamValue('x', node, tensorMap, context), getParamValue('mean', node, tensorMap, context), getParamValue('variance', node, tensorMap, context), getParamValue('offset', node, tensorMap, context), getParamValue('scale', node, tensorMap, context), getParamValue('epsilon', node, tensorMap, context))];\n        }\n        case 'FusedBatchNormV3': {\n            return [ops.batchNorm(getParamValue('x', node, tensorMap, context), getParamValue('mean', node, tensorMap, context), getParamValue('variance', node, tensorMap, context), getParamValue('offset', node, tensorMap, context), getParamValue('scale', node, tensorMap, context), getParamValue('epsilon', node, tensorMap, context))];\n        }\n        case 'LRN': {\n            return [ops.localResponseNormalization(getParamValue('x', node, tensorMap, context), getParamValue('radius', node, tensorMap, context), getParamValue('bias', node, tensorMap, context), getParamValue('alpha', node, tensorMap, context), getParamValue('beta', node, tensorMap, context))];\n        }\n        case 'Softmax': {\n            return [ops.softmax(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'LogSoftmax': {\n            return [ops.logSoftmax(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'SparseToDense': {\n            return [ops.sparseToDense(getParamValue('sparseIndices', node, tensorMap, context), getParamValue('outputShape', node, tensorMap, context), getParamValue('sparseValues', node, tensorMap, context), getParamValue('defaultValue', node, tensorMap, context))];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'normalization';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9ybWFsaXphdGlvbl9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9ub3JtYWxpemF0aW9uX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUN0QyxPQUF5QixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQVksRUFBRTtJQUNuRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixLQUFLLGVBQWU7WUFDbEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQ3JCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDdEQsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBYSxFQUMzRCxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLEtBQUssZ0JBQWdCLENBQUM7UUFDdEIsS0FBSyxrQkFBa0IsQ0FBQyxDQUFDO1lBQ3ZCLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUNqQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDekQsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUM3RCxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzNELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDMUQsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUNwRTtRQUNELEtBQUssa0JBQWtCLENBQUMsQ0FBQztZQUN2QixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FDakIsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN0RCxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3pELGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDN0QsYUFBYSxDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUMzRCxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzFELGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFDRCxLQUFLLEtBQUssQ0FBQyxDQUFDO1lBQ1YsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FDbEMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDL0IsRUFDWixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzNELGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDekQsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUMxRCxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ2pFO1FBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNkLE9BQU8sQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUNmLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLFlBQVksQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUNsQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxlQUFlLENBQUMsQ0FBQztZQUNwQixPQUFPLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FDckIsYUFBYSxDQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDN0MsRUFDVixhQUFhLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ2hFLGFBQWEsQ0FBQyxjQUFjLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQzFDLEVBQ1osYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDNUMsQ0FBQyxDQUFDLENBQUM7U0FDbEI7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFRlbnNvcjNELCBUZW5zb3I0RH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgICAgIGNhc2UgJ0V1Y2xpZGVhbk5vcm0nOlxuICAgICAgICAgIHJldHVybiBbb3BzLmV1Y2xpZGVhbk5vcm0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlZXBEaW1zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuKV07XG4gICAgICAgIGNhc2UgJ0Z1c2VkQmF0Y2hOb3JtJzpcbiAgICAgICAgY2FzZSAnRnVzZWRCYXRjaE5vcm1WMic6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5iYXRjaE5vcm0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbWVhbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd2YXJpYW5jZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdvZmZzZXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2NhbGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXBzaWxvbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnRnVzZWRCYXRjaE5vcm1WMyc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5iYXRjaE5vcm0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbWVhbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd2YXJpYW5jZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdvZmZzZXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2NhbGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXBzaWxvbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTFJOJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxvY2FsUmVzcG9uc2VOb3JtYWxpemF0aW9uKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IzRCB8XG4gICAgICAgICAgICAgICAgICBUZW5zb3I0RCxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncmFkaXVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXIsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2JpYXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYWxwaGEnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYmV0YScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU29mdG1heCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5zb2Z0bWF4KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdMb2dTb2Z0bWF4Jzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmxvZ1NvZnRtYXgoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NwYXJzZVRvRGVuc2UnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc3BhcnNlVG9EZW5zZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3BhcnNlSW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnb3V0cHV0U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3BhcnNlVmFsdWVzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgbnVtYmVyW10sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RlZmF1bHRWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIFNjYWxhcildO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAnbm9ybWFsaXphdGlvbic7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'Max': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const keepDims = getParamValue('keepDims', node, tensorMap, context);\n            return [ops.max(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n        }\n        case 'Mean': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const keepDims = getParamValue('keepDims', node, tensorMap, context);\n            return [ops.mean(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n        }\n        case 'Min': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const keepDims = getParamValue('keepDims', node, tensorMap, context);\n            return [ops.min(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n        }\n        case 'Sum': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const keepDims = getParamValue('keepDims', node, tensorMap, context);\n            return [ops.sum(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n        }\n        case 'All': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const keepDims = getParamValue('keepDims', node, tensorMap, context);\n            return [ops.all(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n        }\n        case 'Any': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const keepDims = getParamValue('keepDims', node, tensorMap, context);\n            return [ops.any(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n        }\n        case 'ArgMax': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            return [ops.argMax(getParamValue('x', node, tensorMap, context), axis)];\n        }\n        case 'ArgMin': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            return [ops.argMin(getParamValue('x', node, tensorMap, context), axis)];\n        }\n        case 'Prod': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const keepDims = getParamValue('keepDims', node, tensorMap, context);\n            return [ops.prod(getParamValue('x', node, tensorMap, context), axis, keepDims)];\n        }\n        case 'Cumprod': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const exclusive = getParamValue('exclusive', node, tensorMap, context);\n            const reverse = getParamValue('reverse', node, tensorMap, context);\n            return [ops.cumprod(getParamValue('x', node, tensorMap, context), axis, exclusive, reverse)];\n        }\n        case 'Cumsum': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const exclusive = getParamValue('exclusive', node, tensorMap, context);\n            const reverse = getParamValue('reverse', node, tensorMap, context);\n            return [ops.cumsum(getParamValue('x', node, tensorMap, context), axis, exclusive, reverse)];\n        }\n        case 'Bincount':\n            const x = getParamValue('x', node, tensorMap, context);\n            const weights = getParamValue('weights', node, tensorMap, context);\n            const size = getParamValue('size', node, tensorMap, context);\n            return [ops.bincount(x, weights, size)];\n        case 'DenseBincount': {\n            const x = getParamValue('x', node, tensorMap, context);\n            const weights = getParamValue('weights', node, tensorMap, context);\n            const size = getParamValue('size', node, tensorMap, context);\n            const binaryOutput = getParamValue('binaryOutput', node, tensorMap, context);\n            return [ops.denseBincount(x, weights, size, binaryOutput)];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'reduction';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWN0aW9uX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvZXhlY3V0b3JzL3JlZHVjdGlvbl9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxpREFBaUQ7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxrREFBa0QsQ0FBQztBQU0xRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxLQUFLLENBQUMsQ0FBQztZQUNWLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQztZQUNoRSxNQUFNLFFBQVEsR0FDVixhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFZLENBQUM7WUFDbkUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQ1gsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUFFLElBQUksRUFDNUQsUUFBUSxDQUFDLENBQUMsQ0FBQztTQUNoQjtRQUNELEtBQUssTUFBTSxDQUFDLENBQUM7WUFDWCxNQUFNLElBQUksR0FDTixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUM7WUFDaEUsTUFBTSxRQUFRLEdBQ1YsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFD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NUQ7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29yLCBUZW5zb3IxRCwgVGVuc29yMkR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyB0Zk9wcyBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUvZGlzdC9vcHMvb3BzX2Zvcl9jb252ZXJ0ZXInO1xuXG5pbXBvcnQge05hbWVkVGVuc29yc01hcH0gZnJvbSAnLi4vLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge0V4ZWN1dGlvbkNvbnRleHR9IGZyb20gJy4uLy4uL2V4ZWN1dG9yL2V4ZWN1dGlvbl9jb250ZXh0JztcbmltcG9ydCB7SW50ZXJuYWxPcEV4ZWN1dG9yLCBOb2RlfSBmcm9tICcuLi90eXBlcyc7XG5cbmltcG9ydCB7Z2V0UGFyYW1WYWx1ZX0gZnJvbSAnLi91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBleGVjdXRlT3A6IEludGVybmFsT3BFeGVjdXRvciA9XG4gICAgKG5vZGU6IE5vZGUsIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgICBjb250ZXh0OiBFeGVjdXRpb25Db250ZXh0LCBvcHMgPSB0Zk9wcyk6IFRlbnNvcltdID0+IHtcbiAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICBjYXNlICdNYXgnOiB7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IGtlZXBEaW1zID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2VlcERpbXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIGJvb2xlYW47XG4gICAgICAgICAgcmV0dXJuIFtvcHMubWF4KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMsXG4gICAgICAgICAgICAgIGtlZXBEaW1zKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWVhbic6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3Qga2VlcERpbXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdrZWVwRGltcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYm9vbGVhbjtcbiAgICAgICAgICByZXR1cm4gW29wcy5tZWFuKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMsXG4gICAgICAgICAgICAgIGtlZXBEaW1zKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTWluJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBrZWVwRGltcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlZXBEaW1zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLm1pbihcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCBheGlzLFxuICAgICAgICAgICAgICBrZWVwRGltcyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1N1bSc6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3Qga2VlcERpbXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdrZWVwRGltcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYm9vbGVhbjtcbiAgICAgICAgICByZXR1cm4gW29wcy5zdW0oXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciwgYXhpcyxcbiAgICAgICAgICAgICAga2VlcERpbXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdBbGwnOiB7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IGtlZXBEaW1zID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgna2VlcERpbXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIGJvb2xlYW47XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYWxsKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMsXG4gICAgICAgICAgICAgIGtlZXBEaW1zKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQW55Jzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBrZWVwRGltcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlZXBEaW1zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLmFueShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCBheGlzLFxuICAgICAgICAgICAgICBrZWVwRGltcyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0FyZ01heCc6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIHJldHVybiBbb3BzLmFyZ01heChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCBheGlzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQXJnTWluJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYXJnTWluKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdQcm9kJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBrZWVwRGltcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2tlZXBEaW1zJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLnByb2QoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciwgYXhpcyxcbiAgICAgICAgICAgICAga2VlcERpbXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdDdW1wcm9kJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgZXhjbHVzaXZlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXhjbHVzaXZlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIGNvbnN0IHJldmVyc2UgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdyZXZlcnNlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLmN1bXByb2QoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciwgYXhpcyxcbiAgICAgICAgICAgICAgZXhjbHVzaXZlLCByZXZlcnNlKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQ3Vtc3VtJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgZXhjbHVzaXZlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZXhjbHVzaXZlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIGNvbnN0IHJldmVyc2UgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdyZXZlcnNlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuO1xuICAgICAgICAgIHJldHVybiBbb3BzLmN1bXN1bShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCBheGlzLFxuICAgICAgICAgICAgICBleGNsdXNpdmUsIHJldmVyc2UpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCaW5jb3VudCc6XG4gICAgICAgICAgY29uc3QgeCA9IGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFEO1xuICAgICAgICAgIGNvbnN0IHdlaWdodHMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd3ZWlnaHRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IxRDtcbiAgICAgICAgICBjb25zdCBzaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2l6ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuXG4gICAgICAgICAgcmV0dXJuIFtvcHMuYmluY291bnQoeCwgd2VpZ2h0cywgc2l6ZSldO1xuICAgICAgICBjYXNlICdEZW5zZUJpbmNvdW50Jzoge1xuICAgICAgICAgIGNvbnN0IHggPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IxRCB8XG4gICAgICAgICAgICAgIFRlbnNvcjJEO1xuICAgICAgICAgIGNvbnN0IHdlaWdodHMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd3ZWlnaHRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IxRCB8XG4gICAgICAgICAgICAgIFRlbnNvcjJEO1xuICAgICAgICAgIGNvbnN0IHNpemUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG5cbiAgICAgICAgICBjb25zdCBiaW5hcnlPdXRwdXQgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiaW5hcnlPdXRwdXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIGJvb2xlYW47XG5cbiAgICAgICAgICByZXR1cm4gW29wcy5kZW5zZUJpbmNvdW50KHgsIHdlaWdodHMsIHNpemUsIGJpbmFyeU91dHB1dCldO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgIH1cbiAgICB9O1xuXG5leHBvcnQgY29uc3QgQ0FURUdPUlkgPSAncmVkdWN0aW9uJztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { tidy, util } from '@tensorflow/tfjs-core';\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'ConcatV2':\n        case 'Concat': {\n            const n = getParamValue('n', node, tensorMap, context);\n            const axis = getParamValue('axis', node, tensorMap, context);\n            let inputs = getParamValue('tensors', node, tensorMap, context);\n            inputs = inputs.slice(0, n);\n            return [ops.concat(inputs, axis)];\n        }\n        case 'Gather': {\n            const input = getParamValue('x', node, tensorMap, context);\n            const indices = getParamValue('indices', node, tensorMap, context);\n            return [ops.gather(input, ops.cast(indices, 'int32'), 0)];\n        }\n        case 'GatherV2': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const batchDims = getParamValue('batchDims', node, tensorMap, context);\n            const input = getParamValue('x', node, tensorMap, context);\n            const indices = getParamValue('indices', node, tensorMap, context);\n            return [ops.gather(input, ops.cast(indices, 'int32'), axis, batchDims)];\n        }\n        case 'Reverse': {\n            const dims = getParamValue('dims', node, tensorMap, context);\n            const axis = [];\n            for (let i = 0; i < dims.length; i++) {\n                if (dims[i]) {\n                    axis.push(i);\n                }\n            }\n            const input = getParamValue('x', node, tensorMap, context);\n            return [ops.reverse(input, axis)];\n        }\n        case 'ReverseV2': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const input = getParamValue('x', node, tensorMap, context);\n            return [ops.reverse(input, axis)];\n        }\n        case 'Slice': {\n            // tslint:disable-next-line:no-any\n            const begin = getParamValue('begin', node, tensorMap, context);\n            // tslint:disable-next-line:no-any\n            const size = getParamValue('size', node, tensorMap, context);\n            return [ops.slice(getParamValue('x', node, tensorMap, context), begin, size)];\n        }\n        case 'StridedSlice': {\n            const begin = getParamValue('begin', node, tensorMap, context);\n            const end = getParamValue('end', node, tensorMap, context);\n            const strides = getParamValue('strides', node, tensorMap, context);\n            const beginMask = getParamValue('beginMask', node, tensorMap, context);\n            const endMask = getParamValue('endMask', node, tensorMap, context);\n            const ellipsisMask = getParamValue('ellipsisMask', node, tensorMap, context);\n            const newAxisMask = getParamValue('newAxisMask', node, tensorMap, context);\n            const shrinkAxisMask = getParamValue('shrinkAxisMask', node, tensorMap, context);\n            const tensor = getParamValue('x', node, tensorMap, context);\n            return [ops.stridedSlice(tensor, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask)];\n        }\n        case 'Pack': {\n            return tidy(() => {\n                const axis = getParamValue('axis', node, tensorMap, context);\n                const tensors = getParamValue('tensors', node, tensorMap, context);\n                // Reshape the tensors to the first tensor's shape if they don't\n                // match.\n                const shape = tensors[0].shape;\n                const squeezedShape = ops.squeeze(tensors[0]).shape;\n                const mapped = tensors.map(tensor => {\n                    const sameShape = util.arraysEqual(tensor.shape, shape);\n                    if (!sameShape &&\n                        !util.arraysEqual(ops.squeeze(tensor).shape, squeezedShape)) {\n                        throw new Error('the input tensors shape does not match');\n                    }\n                    return sameShape ? tensor : ops.reshape(tensor, shape);\n                });\n                return [ops.stack(mapped, axis)];\n            });\n        }\n        case 'Unpack': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const tensor = getParamValue('tensor', node, tensorMap, context);\n            return ops.unstack(tensor, axis);\n        }\n        case 'Tile': {\n            const reps = getParamValue('reps', node, tensorMap, context);\n            return [ops.tile(getParamValue('x', node, tensorMap, context), reps)];\n        }\n        case 'Split':\n        case 'SplitV': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            const numOrSizeSplits = getParamValue('numOrSizeSplits', node, tensorMap, context);\n            const tensor = getParamValue('x', node, tensorMap, context);\n            return ops.split(tensor, numOrSizeSplits, axis);\n        }\n        case 'ScatterNd': {\n            const indices = getParamValue('indices', node, tensorMap, context);\n            const values = getParamValue('values', node, tensorMap, context);\n            const shape = getParamValue('shape', node, tensorMap, context);\n            return [ops.scatterND(indices, values, shape)];\n        }\n        case 'GatherNd': {\n            const x = getParamValue('x', node, tensorMap, context);\n            const indices = getParamValue('indices', node, tensorMap, context);\n            return [ops.gatherND(x, indices)];\n        }\n        case 'SparseToDense': {\n            const indices = getParamValue('sparseIndices', node, tensorMap, context);\n            const shape = getParamValue('outputShape', node, tensorMap, context);\n            const sparseValues = getParamValue('sparseValues', node, tensorMap, context);\n            const defaultValue = getParamValue('defaultValue', node, tensorMap, context);\n            return [ops.sparseToDense(indices, sparseValues, shape, sparseValues.dtype === defaultValue.dtype ?\n                    defaultValue :\n                    ops.cast(defaultValue, sparseValues.dtype))];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'slice_join';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2Vfam9pbl9leGVjdXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9vcGVyYXRpb25zL2V4ZWN1dG9ycy9zbGljZV9qb2luX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzNFLGlEQUFpRDtBQUNqRCxPQUFPLEtBQUssS0FBSyxNQUFNLGtEQUFrRCxDQUFDO0FBTTFFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFdEMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixDQUFDLElBQVUsRUFBRSxTQUEwQixFQUN0QyxPQUF5QixFQUFFLEdBQUcsR0FBRyxLQUFLLEVBQVksRUFBRTtJQUNuRCxRQUFRLElBQUksQ0FBQyxFQUFFLEVBQUU7UUFDZixLQUFLLFVBQVUsQ0FBQztRQUNoQixLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDO1lBQ2pFLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQztZQUM5RCxJQUFJLE1BQU0sR0FDTixhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLENBQUM7WUFDbkUsTUFBTSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzVCLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBQ0QsS0FBSyxRQUFRLENB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QUMsQ0FBQyxDQUFDO1NBQ3REO1FBQ0Q7WUFDRSxNQUFNLFNBQVMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDOUQ7QUFDSCxDQUFDLENBQUM7QUFFTixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1NjYWxhciwgVGVuc29yLCBUZW5zb3IxRCwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgICAgIGNhc2UgJ0NvbmNhdFYyJzpcbiAgICAgICAgY2FzZSAnQ29uY2F0Jzoge1xuICAgICAgICAgIGNvbnN0IG4gPSBnZXRQYXJhbVZhbHVlKCduJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBsZXQgaW5wdXRzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29ycycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yW107XG4gICAgICAgICAgaW5wdXRzID0gaW5wdXRzLnNsaWNlKDAsIG4pO1xuICAgICAgICAgIHJldHVybiBbb3BzLmNvbmNhdChpbnB1dHMsIGF4aXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdHYXRoZXInOiB7XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgY29uc3QgaW5kaWNlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFEO1xuICAgICAgICAgIHJldHVybiBbb3BzLmdhdGhlcihpbnB1dCwgb3BzLmNhc3QoaW5kaWNlcywgJ2ludDMyJyksIDApXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdHYXRoZXJWMic6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IGJhdGNoRGltcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2JhdGNoRGltcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IGlucHV0ID0gZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IGluZGljZXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbmRpY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IxRDtcbiAgICAgICAgICByZXR1cm4gW29wcy5nYXRoZXIoXG4gICAgICAgICAgICAgIGlucHV0LCBvcHMuY2FzdChpbmRpY2VzLCAnaW50MzInKSwgYXhpcywgYmF0Y2hEaW1zKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUmV2ZXJzZSc6IHtcbiAgICAgICAgICBjb25zdCBkaW1zID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGltcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgYm9vbGVhbltdO1xuICAgICAgICAgIGNvbnN0IGF4aXMgPSBbXTtcbiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGlmIChkaW1zW2ldKSB7XG4gICAgICAgICAgICAgIGF4aXMucHVzaChpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmV2ZXJzZShpbnB1dCwgYXhpcyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1JldmVyc2VWMic6IHtcbiAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYXhpcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmV2ZXJzZShpbnB1dCwgYXhpcyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NsaWNlJzoge1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICAgICAgICBjb25zdCBiZWdpbiA9IGdldFBhcmFtVmFsdWUoJ2JlZ2luJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBhbnk7XG4gICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgICAgICAgIGNvbnN0IHNpemUgPSBnZXRQYXJhbVZhbHVlKCdzaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBhbnk7XG4gICAgICAgICAgcmV0dXJuIFtvcHMuc2xpY2UoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvciwgYmVnaW4sXG4gICAgICAgICAgICAgIHNpemUpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTdHJpZGVkU2xpY2UnOiB7XG4gICAgICAgICAgY29uc3QgYmVnaW4gPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdiZWdpbicsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgZW5kID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZW5kJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBzdHJpZGVzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3RyaWRlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgY29uc3QgYmVnaW5NYXNrID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYmVnaW5NYXNrJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgZW5kTWFzayA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2VuZE1hc2snLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBlbGxpcHNpc01hc2sgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdlbGxpcHNpc01hc2snLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBuZXdBeGlzTWFzayA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ25ld0F4aXNNYXNrJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3Qgc2hyaW5rQXhpc01hc2sgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaHJpbmtBeGlzTWFzaycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgbnVtYmVyO1xuICAgICAgICAgIGNvbnN0IHRlbnNvciA9IGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcblxuICAgICAgICAgIHJldHVybiBbb3BzLnN0cmlkZWRTbGljZShcbiAgICAgICAgICAgICAgdGVuc29yLCBiZWdpbiwgZW5kLCBzdHJpZGVzLCBiZWdpbk1hc2ssIGVuZE1hc2ssIGVsbGlwc2lzTWFzayxcbiAgICAgICAgICAgICAgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUGFjayc6IHtcbiAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBheGlzID1cbiAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgICBjb25zdCB0ZW5zb3JzID1cbiAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd0ZW5zb3JzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3JbXTtcbiAgICAgICAgICAgIC8vIFJlc2hhcGUgdGhlIHRlbnNvcnMgdG8gdGhlIGZpcnN0IHRlbnNvcidzIHNoYXBlIGlmIHRoZXkgZG9uJ3RcbiAgICAgICAgICAgIC8vIG1hdGNoLlxuICAgICAgICAgICAgY29uc3Qgc2hhcGUgPSB0ZW5zb3JzWzBdLnNoYXBlO1xuICAgICAgICAgICAgY29uc3Qgc3F1ZWV6ZWRTaGFwZSA9IG9wcy5zcXVlZXplKHRlbnNvcnNbMF0pLnNoYXBlO1xuICAgICAgICAgICAgY29uc3QgbWFwcGVkID0gdGVuc29ycy5tYXAodGVuc29yID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc2FtZVNoYXBlID0gdXRpbC5hcnJheXNFcXVhbCh0ZW5zb3Iuc2hhcGUsIHNoYXBlKTtcbiAgICAgICAgICAgICAgaWYgKCFzYW1lU2hhcGUgJiZcbiAgICAgICAgICAgICAgICAgICF1dGlsLmFycmF5c0VxdWFsKFxuICAgICAgICAgICAgICAgICAgICAgIG9wcy5zcXVlZXplKHRlbnNvcikuc2hhcGUsIHNxdWVlemVkU2hhcGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd0aGUgaW5wdXQgdGVuc29ycyBzaGFwZSBkb2VzIG5vdCBtYXRjaCcpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBzYW1lU2hhcGUgPyB0ZW5zb3IgOiBvcHMucmVzaGFwZSh0ZW5zb3IsIHNoYXBlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFtvcHMuc3RhY2sobWFwcGVkLCBheGlzKV07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnVW5wYWNrJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgdGVuc29yID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgndGVuc29yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgcmV0dXJuIG9wcy51bnN0YWNrKHRlbnNvciwgYXhpcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnVGlsZSc6IHtcbiAgICAgICAgICBjb25zdCByZXBzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncmVwcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW107XG4gICAgICAgICAgcmV0dXJuIFtvcHMudGlsZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLCByZXBzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3BsaXQnOlxuICAgICAgICBjYXNlICdTcGxpdFYnOiB7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBudW1PclNpemVTcGxpdHMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdudW1PclNpemVTcGxpdHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgICAgICBudW1iZXIgfFxuICAgICAgICAgICAgICBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCB0ZW5zb3IgPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG5cbiAgICAgICAgICByZXR1cm4gb3BzLnNwbGl0KHRlbnNvciwgbnVtT3JTaXplU3BsaXRzLCBheGlzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTY2F0dGVyTmQnOiB7XG4gICAgICAgICAgY29uc3QgaW5kaWNlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCB2YWx1ZXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd2YWx1ZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICBjb25zdCBzaGFwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICByZXR1cm4gW29wcy5zY2F0dGVyTkQoaW5kaWNlcywgdmFsdWVzLCBzaGFwZSldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0dhdGhlck5kJzoge1xuICAgICAgICAgIGNvbnN0IHggPSBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3I7XG4gICAgICAgICAgY29uc3QgaW5kaWNlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjtcbiAgICAgICAgICByZXR1cm4gW29wcy5nYXRoZXJORCh4LCBpbmRpY2VzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3BhcnNlVG9EZW5zZSc6IHtcbiAgICAgICAgICBjb25zdCBpbmRpY2VzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc3BhcnNlSW5kaWNlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IHNoYXBlID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnb3V0cHV0U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IHNwYXJzZVZhbHVlcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3NwYXJzZVZhbHVlcycsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yO1xuICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RlZmF1bHRWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgU2NhbGFyO1xuICAgICAgICAgIHJldHVybiBbb3BzLnNwYXJzZVRvRGVuc2UoXG4gICAgICAgICAgICAgIGluZGljZXMsIHNwYXJzZVZhbHVlcywgc2hhcGUsXG4gICAgICAgICAgICAgIHNwYXJzZVZhbHVlcy5kdHlwZSA9PT0gZGVmYXVsdFZhbHVlLmR0eXBlID9cbiAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA6XG4gICAgICAgICAgICAgICAgICBvcHMuY2FzdChkZWZhdWx0VmFsdWUsIHNwYXJzZVZhbHVlcy5kdHlwZSkpXTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ3NsaWNlX2pvaW4nO1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'SparseFillEmptyRows': {\n            const { outputIndices, outputValues, emptyRowIndicator, reverseIndexMap } = ops.sparse.sparseFillEmptyRows(getParamValue('indices', node, tensorMap, context), getParamValue('values', node, tensorMap, context), getParamValue('denseShape', node, tensorMap, context), getParamValue('defaultValue', node, tensorMap, context));\n            return [\n                outputIndices, outputValues, emptyRowIndicator, reverseIndexMap\n            ];\n        }\n        case 'SparseReshape': {\n            const { outputIndices, outputShape } = ops.sparse.sparseReshape(getParamValue('inputIndices', node, tensorMap, context), getParamValue('inputShape', node, tensorMap, context), getParamValue('newShape', node, tensorMap, context));\n            return [outputIndices, outputShape];\n        }\n        case 'SparseSegmentMean': {\n            const outputData = ops.sparse.sparseSegmentMean(getParamValue('data', node, tensorMap, context), getParamValue('indices', node, tensorMap, context), getParamValue('segmentIds', node, tensorMap, context));\n            return [outputData];\n        }\n        case 'SparseSegmentSum': {\n            const outputData = ops.sparse.sparseSegmentSum(getParamValue('data', node, tensorMap, context), getParamValue('indices', node, tensorMap, context), getParamValue('segmentIds', node, tensorMap, context));\n            return [outputData];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'sparse';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BhcnNlX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvZXhlY3V0b3JzL3NwYXJzZV9leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxpREFBaUQ7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxrREFBa0QsQ0FBQztBQU0xRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxxQkFBcUIsQ0FBQyxDQUFDO1lBQzFCLE1BQU0sRUFDSixhQUFhLEVBQ2IsWUFBWSxFQUNaLGlCQUFpQixFQUNqQixlQUFlLEVBQ2hCLEdBQ0csR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDMUIsYUFBYSxDQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDckMsRUFDWixhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzdELGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3hDLEVBQ1osYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDNUMsQ0FBQyxDQUFDO1lBQ3BCLE9BQU87Z0JBQ0wsYUFBYSxFQUFFLFlBQVksRUFBRSxpQkFBaUIsRUFBRSxlQUFlO2FBQ2hFLENBQUM7U0FDSDtRQUNELEtBQUssZUFBZSxDQUFDLENBQUM7WUFDcEIsTUFBTSxFQUFDLGFBQWEsRUFBRSxXQUFXLEVBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FDekQsYUFBYSxDQUFDLGNBQWMsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDMUMsRUFDWixhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQ2pFLGFBQWEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sQ0FBQyxhQUFhLEVBQUUsV0FBVyxDQUFDLENBQUM7U0FDckM7UUFDRCxLQUFLLG1CQUFtQixDQUFDLENBQUM7WUFDeEIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FDM0MsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN6RCxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzlELGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3hDLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckI7UUFDRCxLQUFLLGtCQUFrQixDQUFDLENBQUM7WUFDdkIsTUFBTSxVQUFVLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FDMUMsYUFBYSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUN6RCxhQUFhLENBQUMsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzlELGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3hDLENBQUMsQ0FBQztZQUNsQixPQUFPLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDckI7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFRlbnNvcjFELCBUZW5zb3IyRH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgc3dpdGNoIChub2RlLm9wKSB7XG4gICAgICAgIGNhc2UgJ1NwYXJzZUZpbGxFbXB0eVJvd3MnOiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgb3V0cHV0SW5kaWNlcyxcbiAgICAgICAgICAgIG91dHB1dFZhbHVlcyxcbiAgICAgICAgICAgIGVtcHR5Um93SW5kaWNhdG9yLFxuICAgICAgICAgICAgcmV2ZXJzZUluZGV4TWFwXG4gICAgICAgICAgfSA9XG4gICAgICAgICAgICAgIG9wcy5zcGFyc2Uuc3BhcnNlRmlsbEVtcHR5Um93cyhcbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgICAgICAgICAgVGVuc29yMkQsXG4gICAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd2YWx1ZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGVuc2VTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgICAgICBUZW5zb3IxRCxcbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RlZmF1bHRWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgICAgICBTY2FsYXIpO1xuICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICBvdXRwdXRJbmRpY2VzLCBvdXRwdXRWYWx1ZXMsIGVtcHR5Um93SW5kaWNhdG9yLCByZXZlcnNlSW5kZXhNYXBcbiAgICAgICAgICBdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NwYXJzZVJlc2hhcGUnOiB7XG4gICAgICAgICAgY29uc3Qge291dHB1dEluZGljZXMsIG91dHB1dFNoYXBlfSA9IG9wcy5zcGFyc2Uuc3BhcnNlUmVzaGFwZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5wdXRJbmRpY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yMkQsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2lucHV0U2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCduZXdTaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yMUQpO1xuICAgICAgICAgIHJldHVybiBbb3V0cHV0SW5kaWNlcywgb3V0cHV0U2hhcGVdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NwYXJzZVNlZ21lbnRNZWFuJzoge1xuICAgICAgICAgIGNvbnN0IG91dHB1dERhdGEgPSBvcHMuc3BhcnNlLnNwYXJzZVNlZ21lbnRNZWFuKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkYXRhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzZWdtZW50SWRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yMUQpO1xuICAgICAgICAgIHJldHVybiBbb3V0cHV0RGF0YV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3BhcnNlU2VnbWVudFN1bSc6IHtcbiAgICAgICAgICBjb25zdCBvdXRwdXREYXRhID0gb3BzLnNwYXJzZS5zcGFyc2VTZWdtZW50U3VtKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkYXRhJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2luZGljZXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzZWdtZW50SWRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgVGVuc29yMUQpO1xuICAgICAgICAgIHJldHVybiBbb3V0cHV0RGF0YV07XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYE5vZGUgdHlwZSAke25vZGUub3B9IGlzIG5vdCBpbXBsZW1lbnRlZGApO1xuICAgICAgfVxuICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdzcGFyc2UnO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'FFT': {\n            return [ops.fft(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'IFFT': {\n            return [ops.ifft(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'RFFT': {\n            return [ops.rfft(getParamValue('x', node, tensorMap, context))];\n        }\n        case 'IRFFT': {\n            return [ops.irfft(getParamValue('x', node, tensorMap, context))];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'spectral';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3BlY3RyYWxfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvc3BlY3RyYWxfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQUUsT0FBeUIsRUFDakUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ3BCLFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssS0FBSyxDQUFDLENBQUM7WUFDVixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FDWCxhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0QsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNYLE9BQU8sQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUNaLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7UUFDRCxLQUFLLE1BQU0sQ0FBQyxDQUFDO1lBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQ1osYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxDQUFDLENBQUMsQ0FBQztTQUM5RDtRQUNELEtBQUssT0FBTyxDQUFDLENBQUM7WUFDWixPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FDYixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQyxDQUFDO1NBQzlEO1FBQ0Q7WUFDRSxNQUFNLFNBQVMsQ0FBQyxhQUFhLElBQUksQ0FBQyxFQUFFLHFCQUFxQixDQUFDLENBQUM7S0FDOUQ7QUFDSCxDQUFDLENBQUM7QUFFVixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8taW1wb3J0cy1mcm9tLWRpc3RcbmltcG9ydCAqIGFzIHRmT3BzIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZS9kaXN0L29wcy9vcHNfZm9yX2NvbnZlcnRlcic7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi8uLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7RXhlY3V0aW9uQ29udGV4dH0gZnJvbSAnLi4vLi4vZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQnO1xuaW1wb3J0IHtJbnRlcm5hbE9wRXhlY3V0b3IsIE5vZGV9IGZyb20gJy4uL3R5cGVzJztcblxuaW1wb3J0IHtnZXRQYXJhbVZhbHVlfSBmcm9tICcuL3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGV4ZWN1dGVPcDogSW50ZXJuYWxPcEV4ZWN1dG9yID1cbiAgICAobm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgIG9wcyA9IHRmT3BzKTogVGVuc29yW10gPT4ge1xuICAgICAgICAgIHN3aXRjaCAobm9kZS5vcCkge1xuICAgICAgICAgICAgY2FzZSAnRkZUJzoge1xuICAgICAgICAgICAgICByZXR1cm4gW29wcy5mZnQoXG4gICAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ0lGRlQnOiB7XG4gICAgICAgICAgICAgIHJldHVybiBbb3BzLmlmZnQoXG4gICAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ1JGRlQnOiB7XG4gICAgICAgICAgICAgIHJldHVybiBbb3BzLnJmZnQoXG4gICAgICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgJ0lSRkZUJzoge1xuICAgICAgICAgICAgICByZXR1cm4gW29wcy5pcmZmdChcbiAgICAgICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcildO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgVHlwZUVycm9yKGBOb2RlIHR5cGUgJHtub2RlLm9wfSBpcyBub3QgaW1wbGVtZW50ZWRgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbmV4cG9ydCBjb25zdCBDQVRFR09SWSA9ICdzcGVjdHJhbCc7XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'StringNGrams': {\n            const { nGrams, nGramsSplits } = ops.string.stringNGrams(getParamValue('data', node, tensorMap, context), getParamValue('dataSplits', node, tensorMap, context), getParamValue('separator', node, tensorMap, context), getParamValue('nGramWidths', node, tensorMap, context), getParamValue('leftPad', node, tensorMap, context), getParamValue('rightPad', node, tensorMap, context), getParamValue('padWidth', node, tensorMap, context), getParamValue('preserveShortSequences', node, tensorMap, context));\n            return [nGrams, nGramsSplits];\n        }\n        case 'StringSplit': {\n            const { indices, values, shape } = ops.string.stringSplit(getParamValue('input', node, tensorMap, context), getParamValue('delimiter', node, tensorMap, context), getParamValue('skipEmpty', node, tensorMap, context));\n            return [indices, values, shape];\n        }\n        case 'StringToHashBucketFast': {\n            const output = ops.string.stringToHashBucketFast(getParamValue('input', node, tensorMap, context), getParamValue('numBuckets', node, tensorMap, context));\n            return [output];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'string';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvZXhlY3V0b3JzL3N0cmluZ19leGVjdXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxpREFBaUQ7QUFDakQsT0FBTyxLQUFLLEtBQUssTUFBTSxrREFBa0QsQ0FBQztBQU0xRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FDbEIsQ0FBQyxJQUFVLEVBQUUsU0FBMEIsRUFDdEMsT0FBeUIsRUFBRSxHQUFHLEdBQUcsS0FBSyxFQUFZLEVBQUU7SUFDbkQsUUFBUSxJQUFJLENBQUMsRUFBRSxFQUFFO1FBQ2YsS0FBSyxjQUFjLENBQUMsQ0FBQztZQUNuQixNQUFNLEVBQUMsTUFBTSxFQUFFLFlBQVksRUFBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUNsRCxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzNELGFBQWEsQ0FBQyxZQUFZLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDL0QsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUM5RCxhQUFhLENBQUMsYUFBYSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUN6QyxFQUNaLGFBQWEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDNUQsYUFBYSxDQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUM3RCxhQUFhLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQzdELGFBQWEsQ0FDVCx3QkFBd0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FDM0MsQ0FBQyxDQUFDO1lBQ2pCLE9BQU8sQ0FBQyxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7U0FDL0I7UUFDRCxLQUFLLGFBQWEsQ0FBQyxDQUFDO1lBQ2xCLE1BQU0sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUNuRCxhQUFhLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFhLEVBQzVELGFBQWEsQ0FBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFDOUQsYUFBYSxDQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBWSxDQUFDLENBQUM7WUFDckUsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDakM7UUFDRCxLQUFLLHdCQUF3QixDQUFDLENBQUM7WUFDN0IsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsQ0FDNUMsYUFBYSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBVyxFQUMxRCxhQUFhLENBQUMsWUFBWSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUMsQ0FBQztZQUNyRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakI7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7U2NhbGFyLCBUZW5zb3IsIFRlbnNvcjFEfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnU3RyaW5nTkdyYW1zJzoge1xuICAgICAgICAgIGNvbnN0IHtuR3JhbXMsIG5HcmFtc1NwbGl0c30gPSBvcHMuc3RyaW5nLnN0cmluZ05HcmFtcyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnZGF0YScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yMUQsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2RhdGFTcGxpdHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2VwYXJhdG9yJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBzdHJpbmcsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ25HcmFtV2lkdGhzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgbnVtYmVyW10sXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2xlZnRQYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncmlnaHRQYWQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIHN0cmluZyxcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgncGFkV2lkdGgnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZShcbiAgICAgICAgICAgICAgICAgICdwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgICAgYm9vbGVhbik7XG4gICAgICAgICAgcmV0dXJuIFtuR3JhbXMsIG5HcmFtc1NwbGl0c107XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnU3RyaW5nU3BsaXQnOiB7XG4gICAgICAgICAgY29uc3Qge2luZGljZXMsIHZhbHVlcywgc2hhcGV9ID0gb3BzLnN0cmluZy5zdHJpbmdTcGxpdChcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaW5wdXQnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjFELFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdkZWxpbWl0ZXInLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFNjYWxhcixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnc2tpcEVtcHR5Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBib29sZWFuKTtcbiAgICAgICAgICByZXR1cm4gW2luZGljZXMsIHZhbHVlcywgc2hhcGVdO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3QnOiB7XG4gICAgICAgICAgY29uc3Qgb3V0cHV0ID0gb3BzLnN0cmluZy5zdHJpbmdUb0hhc2hCdWNrZXRGYXN0KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdpbnB1dCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdudW1CdWNrZXRzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXIpO1xuICAgICAgICAgIHJldHVybiBbb3V0cHV0XTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ3N0cmluZyc7XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// tslint:disable-next-line: no-imports-from-dist\nimport * as tfOps from '@tensorflow/tfjs-core/dist/ops/ops_for_converter';\nimport { getParamValue } from './utils';\nexport const executeOp = (node, tensorMap, context, ops = tfOps) => {\n    switch (node.op) {\n        case 'Cast': {\n            return [ops.cast(getParamValue('x', node, tensorMap, context), getParamValue('dtype', node, tensorMap, context))];\n        }\n        case 'ExpandDims': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            return [ops.expandDims(getParamValue('x', node, tensorMap, context), axis)];\n        }\n        case 'Squeeze': {\n            const axis = getParamValue('axis', node, tensorMap, context);\n            return [ops.squeeze(getParamValue('x', node, tensorMap, context), axis)];\n        }\n        case 'Reshape': {\n            return [ops.reshape(getParamValue('x', node, tensorMap, context), getParamValue('shape', node, tensorMap, context))];\n        }\n        case 'MirrorPad': {\n            return [ops.mirrorPad(getParamValue('x', node, tensorMap, context), getParamValue('padding', node, tensorMap, context), getParamValue('mode', node, tensorMap, context))];\n        }\n        case 'PadV2':\n        case 'Pad': {\n            return [ops.pad(getParamValue('x', node, tensorMap, context), getParamValue('padding', node, tensorMap, context), getParamValue('constantValue', node, tensorMap, context))];\n        }\n        case 'SpaceToBatchND': {\n            const blockShape = getParamValue('blockShape', node, tensorMap, context);\n            const paddings = getParamValue('paddings', node, tensorMap, context);\n            return [ops.spaceToBatchND(getParamValue('x', node, tensorMap, context), blockShape, paddings)];\n        }\n        case 'BatchToSpaceND': {\n            const blockShape = getParamValue('blockShape', node, tensorMap, context);\n            const crops = getParamValue('crops', node, tensorMap, context);\n            return [ops.batchToSpaceND(getParamValue('x', node, tensorMap, context), blockShape, crops)];\n        }\n        case 'DepthToSpace': {\n            const blockSize = getParamValue('blockSize', node, tensorMap, context);\n            const dataFormat = getParamValue('dataFormat', node, tensorMap, context).toUpperCase();\n            return [ops.depthToSpace(getParamValue('x', node, tensorMap, context), blockSize, dataFormat)];\n        }\n        case 'BroadcastTo': {\n            return [ops.broadcastTo(getParamValue('x', node, tensorMap, context), getParamValue('shape', node, tensorMap, context))];\n        }\n        case 'BroadcastArgs': {\n            return [ops.broadcastArgs(getParamValue('s0', node, tensorMap, context), getParamValue('s1', node, tensorMap, context))];\n        }\n        default:\n            throw TypeError(`Node type ${node.op} is not implemented`);\n    }\n};\nexport const CATEGORY = 'transformation';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtYXRpb25fZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvb3BlcmF0aW9ucy9leGVjdXRvcnMvdHJhbnNmb3JtYXRpb25fZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0sa0RBQWtELENBQUM7QUFNMUUsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLENBQUMsSUFBVSxFQUFFLFNBQTBCLEVBQ3RDLE9BQXlCLEVBQUUsR0FBRyxHQUFHLEtBQUssRUFBWSxFQUFFO0lBQ25ELFFBQVEsSUFBSSxDQUFDLEVBQUUsRUFBRTtRQUNmLEtBQUssTUFBTSxDQUFDLENBQUM7WUFDWCxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FDWixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQ3pCLENBQUMsQ0FBQyxDQUFDO1NBQzlCO1FBQ0QsS0FBSyxZQUFZLENBQUMsQ0FBQztZQUNqQixNQUFNLElBQUksR0FDTixhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLENBQUM7WUFDOUQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQ2xCLGFBQWEsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3BFO1FBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNkLE1BQU0sSUFBSSxHQUNOLGFBQWEsQ0FBQyxNQUFNLEVB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LGFBQWEsQ0FBQyxDQUFDO1lBQ2xCLE9BQU8sQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUNuQixhQUFhLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3RELGFBQWEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQWEsQ0FBQyxDQUFDLENBQUM7U0FDcEU7UUFDRCxLQUFLLGVBQWUsQ0FBQyxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUNyQixhQUFhLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFXLEVBQ3ZELGFBQWEsQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQVcsQ0FBQyxDQUFDLENBQUM7U0FDL0Q7UUFDRDtZQUNFLE1BQU0sU0FBUyxDQUFDLGFBQWEsSUFBSSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3IsIFRlbnNvcjREfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0ICogYXMgdGZPcHMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlL2Rpc3Qvb3BzL29wc19mb3JfY29udmVydGVyJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uLy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi8uLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge0ludGVybmFsT3BFeGVjdXRvciwgTm9kZX0gZnJvbSAnLi4vdHlwZXMnO1xuXG5pbXBvcnQge2dldFBhcmFtVmFsdWV9IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhlY3V0ZU9wOiBJbnRlcm5hbE9wRXhlY3V0b3IgPVxuICAgIChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCwgb3BzID0gdGZPcHMpOiBUZW5zb3JbXSA9PiB7XG4gICAgICBzd2l0Y2ggKG5vZGUub3ApIHtcbiAgICAgICAgY2FzZSAnQ2FzdCc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5jYXN0KFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2R0eXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyAnaW50MzInIHxcbiAgICAgICAgICAgICAgICAgICdmbG9hdDMyJyB8ICdib29sJyldO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0V4cGFuZERpbXMnOiB7XG4gICAgICAgICAgY29uc3QgYXhpcyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2F4aXMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcjtcbiAgICAgICAgICByZXR1cm4gW29wcy5leHBhbmREaW1zKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdTcXVlZXplJzoge1xuICAgICAgICAgIGNvbnN0IGF4aXMgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdheGlzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICByZXR1cm4gW29wcy5zcXVlZXplKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsIGF4aXMpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ1Jlc2hhcGUnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucmVzaGFwZShcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10pXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdNaXJyb3JQYWQnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMubWlycm9yUGFkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3BhZGRpbmcnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgICAgICBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnbW9kZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgJ3JlZmxlY3QnIHxcbiAgICAgICAgICAgICAgICAgICdzeW1tZXRyaWMnKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnUGFkVjInOlxuICAgICAgICBjYXNlICdQYWQnOiB7XG4gICAgICAgICAgcmV0dXJuIFtvcHMucGFkKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3BhZGRpbmcnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzXG4gICAgICAgICAgICAgICAgICBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY29uc3RhbnRWYWx1ZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXNcbiAgICAgICAgICAgICAgICAgIG51bWJlcildO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ1NwYWNlVG9CYXRjaE5EJzoge1xuICAgICAgICAgIGNvbnN0IGJsb2NrU2hhcGUgPVxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdibG9ja1NoYXBlJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXTtcbiAgICAgICAgICBjb25zdCBwYWRkaW5ncyA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3BhZGRpbmdzJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXJbXVtdO1xuICAgICAgICAgIHJldHVybiBbb3BzLnNwYWNlVG9CYXRjaE5EKFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCd4Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGJsb2NrU2hhcGUsIHBhZGRpbmdzKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQmF0Y2hUb1NwYWNlTkQnOiB7XG4gICAgICAgICAgY29uc3QgYmxvY2tTaGFwZSA9XG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ2Jsb2NrU2hhcGUnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdO1xuICAgICAgICAgIGNvbnN0IGNyb3BzID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnY3JvcHMnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIG51bWJlcltdW107XG4gICAgICAgICAgcmV0dXJuIFtvcHMuYmF0Y2hUb1NwYWNlTkQoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcixcbiAgICAgICAgICAgICAgYmxvY2tTaGFwZSwgY3JvcHMpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdEZXB0aFRvU3BhY2UnOiB7XG4gICAgICAgICAgY29uc3QgYmxvY2tTaXplID1cbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnYmxvY2tTaXplJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgZGF0YUZvcm1hdCA9XG4gICAgICAgICAgICAgIChnZXRQYXJhbVZhbHVlKCdkYXRhRm9ybWF0Jywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhc1xuICAgICAgICAgICAgICAgc3RyaW5nKS50b1VwcGVyQ2FzZSgpIGFzICdOSFdDJyB8XG4gICAgICAgICAgICAgICdOQ0hXJztcbiAgICAgICAgICByZXR1cm4gW29wcy5kZXB0aFRvU3BhY2UoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3gnLCBub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpIGFzIFRlbnNvcjRELFxuICAgICAgICAgICAgICBibG9ja1NpemUsIGRhdGFGb3JtYXQpXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCcm9hZGNhc3RUbyc6IHtcbiAgICAgICAgICByZXR1cm4gW29wcy5icm9hZGNhc3RUbyhcbiAgICAgICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgneCcsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgVGVuc29yLFxuICAgICAgICAgICAgICBnZXRQYXJhbVZhbHVlKCdzaGFwZScsIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkgYXMgbnVtYmVyW10pXTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdCcm9hZGNhc3RBcmdzJzoge1xuICAgICAgICAgIHJldHVybiBbb3BzLmJyb2FkY2FzdEFyZ3MoXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3MwJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IsXG4gICAgICAgICAgICAgIGdldFBhcmFtVmFsdWUoJ3MxJywgbm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSBhcyBUZW5zb3IpXTtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IFR5cGVFcnJvcihgTm9kZSB0eXBlICR7bm9kZS5vcH0gaXMgbm90IGltcGxlbWVudGVkYCk7XG4gICAgICB9XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IENBVEVHT1JZID0gJ3RyYW5zZm9ybWF0aW9uJztcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as tfc from '@tensorflow/tfjs-core';\nimport { NodeValueImpl } from './custom_op/node_value_impl';\nimport { getRegisteredOp } from './custom_op/register';\nimport * as arithmetic from './executors/arithmetic_executor';\nimport * as basicMath from './executors/basic_math_executor';\nimport * as control from './executors/control_executor';\nimport * as convolution from './executors/convolution_executor';\nimport * as creation from './executors/creation_executor';\nimport * as dynamic from './executors/dynamic_executor';\nimport * as evaluation from './executors/evaluation_executor';\nimport * as graph from './executors/graph_executor';\nimport * as hashTable from './executors/hash_table_executor';\nimport * as image from './executors/image_executor';\nimport * as logical from './executors/logical_executor';\nimport * as matrices from './executors/matrices_executor';\nimport * as normalization from './executors/normalization_executor';\nimport * as reduction from './executors/reduction_executor';\nimport * as sliceJoin from './executors/slice_join_executor';\nimport * as sparse from './executors/sparse_executor';\nimport * as spectral from './executors/spectral_executor';\nimport * as string from './executors/string_executor';\nimport * as transformation from './executors/transformation_executor';\n/**\n * Executes the op defined by the node object.\n * @param node\n * @param tensorMap contains tensors for executed nodes and weights\n * @param context contains tensors and information for running the current node.\n * @param resourceManager Optional. Contains global resources of the model.\n */\nexport function executeOp(node, tensorMap, context, resourceManager, tidy = tfc.tidy) {\n    const value = ((node, tensorMap, context) => {\n        switch (node.category) {\n            case 'arithmetic':\n                return tidy(() => arithmetic.executeOp(node, tensorMap, context));\n            case 'basic_math':\n                return tidy(() => basicMath.executeOp(node, tensorMap, context));\n            case 'control':\n                return control.executeOp(node, tensorMap, context);\n            case 'convolution':\n                return tidy(() => convolution.executeOp(node, tensorMap, context));\n            case 'creation':\n                return tidy(() => creation.executeOp(node, tensorMap, context));\n            case 'dynamic':\n                return dynamic.executeOp(node, tensorMap, context);\n            case 'evaluation':\n                return tidy(() => evaluation.executeOp(node, tensorMap, context));\n            case 'image':\n                return tidy(() => image.executeOp(node, tensorMap, context));\n            case 'graph':\n                return tidy(() => graph.executeOp(node, tensorMap, context));\n            case 'logical':\n                return tidy(() => logical.executeOp(node, tensorMap, context));\n            case 'matrices':\n                return tidy(() => matrices.executeOp(node, tensorMap, context));\n            case 'normalization':\n                return tidy(() => normalization.executeOp(node, tensorMap, context));\n            case 'reduction':\n                return tidy(() => reduction.executeOp(node, tensorMap, context));\n            case 'slice_join':\n                return tidy(() => sliceJoin.executeOp(node, tensorMap, context));\n            case 'sparse':\n                return tidy(() => sparse.executeOp(node, tensorMap, context));\n            case 'spectral':\n                return tidy(() => spectral.executeOp(node, tensorMap, context));\n            case 'string':\n                return tidy(() => string.executeOp(node, tensorMap, context));\n            case 'transformation':\n                return tidy(() => transformation.executeOp(node, tensorMap, context));\n            case 'hash_table':\n                return hashTable.executeOp(node, tensorMap, context, resourceManager);\n            case 'custom':\n                const opMapper = getRegisteredOp(node.op);\n                if (opMapper && opMapper.customExecutor) {\n                    return opMapper.customExecutor(new NodeValueImpl(node, tensorMap, context));\n                }\n                else {\n                    throw TypeError(`Custom op ${node.op} is not registered.`);\n                }\n            default:\n                throw TypeError(`Unknown op '${node.op}'. File an issue at ` +\n                    `https://github.com/tensorflow/tfjs/issues so we can add it` +\n                    `, or register a custom execution with tf.registerOp()`);\n        }\n    })(node, tensorMap, context);\n    if (tfc.util.isPromise(value)) {\n        return value.then((data) => [].concat(data));\n    }\n    return [].concat(value);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BlcmF0aW9uX2V4ZWN1dG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1jb252ZXJ0ZXIvc3JjL29wZXJhdGlvbnMvb3BlcmF0aW9uX2V4ZWN1dG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sS0FBSyxHQUFHLE1BQU0sdUJBQXVCLENBQUM7QUFNN0MsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sS0FBSyxTQUFTLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxLQUFLLE9BQU8sTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLGtDQUFrQyxDQUFDO0FBQ2hFLE9BQU8sS0FBSyxRQUFRLE1BQU0sK0JBQStCLENBQUM7QUFDMUQsT0FBTyxLQUFLLE9BQU8sTUFBTSw4QkFBOEIsQ0FBQztBQUN4RCxPQUFPLEtBQUssVUFBVSxNQUFNLGlDQUFpQyxDQUFDO0FBQzlELE9BQU8sS0FBSyxLQUFLLE1BQU0sNEJBQTRCLENBQUM7QUFDcEQsT0FBTyxLQUFLLFNBQVMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEtBQUssS0FBSyxNQUFNLDRCQUE0QixDQUFDO0FBQ3BELE9BQU8sS0FBSyxPQUFPLE1BQU0sOEJBQThCLENBQUM7QUFDeEQsT0FBTyxLQUFLLFFBQVEsTUFBTSwrQkFBK0IsQ0FBQztBQUMxRCxPQUFPLEtBQUssYUFBYSxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sS0FBSyxTQUFTLE1BQU0sZ0NBQWdDLENBQUM7QUFDNUQsT0FBTyxLQUFLLFNBQVMsTUFBTSxpQ0FBaUMsQ0FBQztBQUM3RCxPQUFPLEtBQUss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LENBQ1gsZUFBZSxJQUFJLENBQUMsRUFBRSxzQkFBc0I7b0JBQzVDLDREQUE0RDtvQkFDNUQsdURBQXVELENBQUMsQ0FBQztTQUNoRTtJQUNILENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDakMsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUM3QixPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUNELE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQgKiBhcyB0ZmMgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtOYW1lZFRlbnNvcnNNYXB9IGZyb20gJy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0fSBmcm9tICcuLi9leGVjdXRvci9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge1Jlc291cmNlTWFuYWdlcn0gZnJvbSAnLi4vZXhlY3V0b3IvcmVzb3VyY2VfbWFuYWdlcic7XG5cbmltcG9ydCB7Tm9kZVZhbHVlSW1wbH0gZnJvbSAnLi9jdXN0b21fb3Avbm9kZV92YWx1ZV9pbXBsJztcbmltcG9ydCB7Z2V0UmVnaXN0ZXJlZE9wfSBmcm9tICcuL2N1c3RvbV9vcC9yZWdpc3Rlcic7XG5pbXBvcnQgKiBhcyBhcml0aG1ldGljIGZyb20gJy4vZXhlY3V0b3JzL2FyaXRobWV0aWNfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgYmFzaWNNYXRoIGZyb20gJy4vZXhlY3V0b3JzL2Jhc2ljX21hdGhfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgY29udHJvbCBmcm9tICcuL2V4ZWN1dG9ycy9jb250cm9sX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIGNvbnZvbHV0aW9uIGZyb20gJy4vZXhlY3V0b3JzL2NvbnZvbHV0aW9uX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIGNyZWF0aW9uIGZyb20gJy4vZXhlY3V0b3JzL2NyZWF0aW9uX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIGR5bmFtaWMgZnJvbSAnLi9leGVjdXRvcnMvZHluYW1pY19leGVjdXRvcic7XG5pbXBvcnQgKiBhcyBldmFsdWF0aW9uIGZyb20gJy4vZXhlY3V0b3JzL2V2YWx1YXRpb25fZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgZ3JhcGggZnJvbSAnLi9leGVjdXRvcnMvZ3JhcGhfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgaGFzaFRhYmxlIGZyb20gJy4vZXhlY3V0b3JzL2hhc2hfdGFibGVfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgaW1hZ2UgZnJvbSAnLi9leGVjdXRvcnMvaW1hZ2VfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgbG9naWNhbCBmcm9tICcuL2V4ZWN1dG9ycy9sb2dpY2FsX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIG1hdHJpY2VzIGZyb20gJy4vZXhlY3V0b3JzL21hdHJpY2VzX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIG5vcm1hbGl6YXRpb24gZnJvbSAnLi9leGVjdXRvcnMvbm9ybWFsaXphdGlvbl9leGVjdXRvcic7XG5pbXBvcnQgKiBhcyByZWR1Y3Rpb24gZnJvbSAnLi9leGVjdXRvcnMvcmVkdWN0aW9uX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIHNsaWNlSm9pbiBmcm9tICcuL2V4ZWN1dG9ycy9zbGljZV9qb2luX2V4ZWN1dG9yJztcbmltcG9ydCAqIGFzIHNwYXJzZSBmcm9tICcuL2V4ZWN1dG9ycy9zcGFyc2VfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgc3BlY3RyYWwgZnJvbSAnLi9leGVjdXRvcnMvc3BlY3RyYWxfZXhlY3V0b3InO1xuaW1wb3J0ICogYXMgc3RyaW5nIGZyb20gJy4vZXhlY3V0b3JzL3N0cmluZ19leGVjdXRvcic7XG5pbXBvcnQgKiBhcyB0cmFuc2Zvcm1hdGlvbiBmcm9tICcuL2V4ZWN1dG9ycy90cmFuc2Zvcm1hdGlvbl9leGVjdXRvcic7XG5pbXBvcnQge05vZGV9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIEV4ZWN1dGVzIHRoZSBvcCBkZWZpbmVkIGJ5IHRoZSBub2RlIG9iamVjdC5cbiAqIEBwYXJhbSBub2RlXG4gKiBAcGFyYW0gdGVuc29yTWFwIGNvbnRhaW5zIHRlbnNvcnMgZm9yIGV4ZWN1dGVkIG5vZGVzIGFuZCB3ZWlnaHRzXG4gKiBAcGFyYW0gY29udGV4dCBjb250YWlucyB0ZW5zb3JzIGFuZCBpbmZvcm1hdGlvbiBmb3IgcnVubmluZyB0aGUgY3VycmVudCBub2RlLlxuICogQHBhcmFtIHJlc291cmNlTWFuYWdlciBPcHRpb25hbC4gQ29udGFpbnMgZ2xvYmFsIHJlc291cmNlcyBvZiB0aGUgbW9kZWwuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBleGVjdXRlT3AoXG4gICAgbm9kZTogTm9kZSwgdGVuc29yTWFwOiBOYW1lZFRlbnNvcnNNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgcmVzb3VyY2VNYW5hZ2VyPzogUmVzb3VyY2VNYW5hZ2VyLCB0aWR5ID0gdGZjLnRpZHkpOiB0ZmMuVGVuc29yW118XG4gICAgUHJvbWlzZTx0ZmMuVGVuc29yW10+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgICAgKChub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCwgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCkgPT4ge1xuICAgICAgICBzd2l0Y2ggKG5vZGUuY2F0ZWdvcnkpIHtcbiAgICAgICAgICBjYXNlICdhcml0aG1ldGljJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IGFyaXRobWV0aWMuZXhlY3V0ZU9wKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkpO1xuICAgICAgICAgIGNhc2UgJ2Jhc2ljX21hdGgnOlxuICAgICAgICAgICAgcmV0dXJuIHRpZHkoKCkgPT4gYmFzaWNNYXRoLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdjb250cm9sJzpcbiAgICAgICAgICAgIHJldHVybiBjb250cm9sLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpO1xuICAgICAgICAgIGNhc2UgJ2NvbnZvbHV0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IGNvbnZvbHV0aW9uLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdjcmVhdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBjcmVhdGlvbi5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnZHluYW1pYyc6XG4gICAgICAgICAgICByZXR1cm4gZHluYW1pYy5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KTtcbiAgICAgICAgICBjYXNlICdldmFsdWF0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IGV2YWx1YXRpb24uZXhlY3V0ZU9wKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkpO1xuICAgICAgICAgIGNhc2UgJ2ltYWdlJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IGltYWdlLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdncmFwaCc6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBncmFwaC5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnbG9naWNhbCc6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBsb2dpY2FsLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdtYXRyaWNlcyc6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBtYXRyaWNlcy5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnbm9ybWFsaXphdGlvbic6XG4gICAgICAgICAgICByZXR1cm4gdGlkeShcbiAgICAgICAgICAgICAgICAoKSA9PiBub3JtYWxpemF0aW9uLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdyZWR1Y3Rpb24nOlxuICAgICAgICAgICAgcmV0dXJuIHRpZHkoKCkgPT4gcmVkdWN0aW9uLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdzbGljZV9qb2luJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IHNsaWNlSm9pbi5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnc3BhcnNlJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KCgpID0+IHNwYXJzZS5leGVjdXRlT3Aobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgY2FzZSAnc3BlY3RyYWwnOlxuICAgICAgICAgICAgcmV0dXJuIHRpZHkoKCkgPT4gc3BlY3RyYWwuZXhlY3V0ZU9wKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkpO1xuICAgICAgICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgICAgICAgICByZXR1cm4gdGlkeSgoKSA9PiBzdHJpbmcuZXhlY3V0ZU9wKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCkpO1xuICAgICAgICAgIGNhc2UgJ3RyYW5zZm9ybWF0aW9uJzpcbiAgICAgICAgICAgIHJldHVybiB0aWR5KFxuICAgICAgICAgICAgICAgICgpID0+IHRyYW5zZm9ybWF0aW9uLmV4ZWN1dGVPcChub2RlLCB0ZW5zb3JNYXAsIGNvbnRleHQpKTtcbiAgICAgICAgICBjYXNlICdoYXNoX3RhYmxlJzpcbiAgICAgICAgICAgIHJldHVybiBoYXNoVGFibGUuZXhlY3V0ZU9wKFxuICAgICAgICAgICAgICAgIG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCwgcmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgICBjYXNlICdjdXN0b20nOlxuICAgICAgICAgICAgY29uc3Qgb3BNYXBwZXIgPSBnZXRSZWdpc3RlcmVkT3Aobm9kZS5vcCk7XG4gICAgICAgICAgICBpZiAob3BNYXBwZXIgJiYgb3BNYXBwZXIuY3VzdG9tRXhlY3V0b3IpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG9wTWFwcGVyLmN1c3RvbUV4ZWN1dG9yKFxuICAgICAgICAgICAgICAgICAgbmV3IE5vZGVWYWx1ZUltcGwobm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoYEN1c3RvbSBvcCAke25vZGUub3B9IGlzIG5vdCByZWdpc3RlcmVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAgICAgICAgICAgYFVua25vd24gb3AgJyR7bm9kZS5vcH0nLiBGaWxlIGFuIGlzc3VlIGF0IGAgK1xuICAgICAgICAgICAgICAgIGBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3VlcyBzbyB3ZSBjYW4gYWRkIGl0YCArXG4gICAgICAgICAgICAgICAgYCwgb3IgcmVnaXN0ZXIgYSBjdXN0b20gZXhlY3V0aW9uIHdpdGggdGYucmVnaXN0ZXJPcCgpYCk7XG4gICAgICAgIH1cbiAgICAgIH0pKG5vZGUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gIGlmICh0ZmMudXRpbC5pc1Byb21pc2UodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlLnRoZW4oKGRhdGEpID0+IFtdLmNvbmNhdChkYXRhKSk7XG4gIH1cbiAgcmV0dXJuIFtdLmNvbmNhdCh2YWx1ZSk7XG59XG4iXX0=","/**\n * ExecutionContext captures the runtime environment of the node. It keeps\n * track of the current frame and iteration for the control flow ops.\n *\n * For example, typical Dynamic RNN model may contain loops, for which\n * TensorFlow will generate graphs with Enter/Exit nodes to control the\n * current execution frame, and NextIteration Nodes for iteration id increment.\n * For model with branch logic, TensorFLow will generate Switch/Merge ops.\n */\nexport class ExecutionContext {\n    constructor(weightMap = {}, tensorArrayMap = {}, tensorListMap = {}, functionMap = {}) {\n        this.weightMap = weightMap;\n        this.tensorArrayMap = tensorArrayMap;\n        this.tensorListMap = tensorListMap;\n        this.functionMap = functionMap;\n        this.rootContext = { id: 0, frameName: '', iterationId: 0 };\n        this.contexts = [this.rootContext];\n        this.lastId = 0;\n        this.generateCurrentContextIds();\n    }\n    newFrame(id, frameName) {\n        return { id, frameName, iterationId: 0 };\n    }\n    /**\n     * Set the current context\n     * @param contexts: ExecutionContextInfo[] the current path of execution\n     * frames\n     */\n    set currentContext(contexts) {\n        if (this.contexts !== contexts) {\n            this.contexts = contexts;\n            this.generateCurrentContextIds();\n        }\n    }\n    get currentContext() {\n        return this.contexts;\n    }\n    /**\n     * Returns the current context in string format.\n     */\n    get currentContextId() {\n        return this._currentContextIds[0];\n    }\n    /**\n     * Returns the current context and all parent contexts in string format.\n     * This allow access to the nodes in the current and parent frames.\n     */\n    get currentContextIds() {\n        return this._currentContextIds;\n    }\n    generateCurrentContextIds() {\n        const names = [];\n        for (let i = 0; i < this.contexts.length - 1; i++) {\n            const contexts = this.contexts.slice(0, this.contexts.length - i);\n            names.push(this.contextIdforContexts(contexts));\n        }\n        names.push('');\n        this._currentContextIds = names;\n    }\n    contextIdforContexts(contexts) {\n        return contexts ?\n            contexts\n                .map(context => (context.id === 0 && context.iterationId === 0) ?\n                '' :\n                `${context.frameName}-${context.iterationId}`)\n                .join('/') :\n            '';\n    }\n    /**\n     * Enter a new frame, a new context is pushed on the current context list.\n     * @param frameId new frame id\n     */\n    enterFrame(frameId) {\n        if (this.contexts) {\n            this.lastId++;\n            this.contexts = this.contexts.slice();\n            this.contexts.push(this.newFrame(this.lastId, frameId));\n            this._currentContextIds.unshift(this.contextIdforContexts(this.contexts));\n        }\n    }\n    /**\n     * Exit the current frame, the last context is removed from the current\n     * context list.\n     */\n    exitFrame() {\n        if (this.contexts && this.contexts.length > 1) {\n            this.contexts = this.contexts.slice();\n            this.contexts.splice(-1);\n            this.currentContextIds.shift();\n        }\n        else {\n            throw new Error('Cannot exit frame, the context is empty');\n        }\n    }\n    /**\n     * Enter the next iteration of a loop, the iteration id of last context is\n     * increased.\n     */\n    nextIteration() {\n        if (this.contexts && this.contexts.length > 0) {\n            this.contexts = this.contexts.slice();\n            this.lastId++;\n            const context = Object.assign({}, this.contexts[this.contexts.length - 1]);\n            context.iterationId += 1;\n            context.id = this.lastId;\n            this.contexts.splice(-1, 1, context);\n            this._currentContextIds.splice(0, 1, this.contextIdforContexts(this.contexts));\n        }\n        else {\n            throw new Error('Cannot increase frame iteration, the context is empty');\n        }\n    }\n    getWeight(name) {\n        return this.weightMap[name];\n    }\n    addTensorArray(tensorArray) {\n        this.tensorArrayMap[tensorArray.id] = tensorArray;\n    }\n    getTensorArray(id) {\n        return this.tensorArrayMap[id];\n    }\n    addTensorList(tensorList) {\n        this.tensorListMap[tensorList.id] = tensorList;\n    }\n    getTensorList(id) {\n        return this.tensorListMap[id];\n    }\n    dispose(keepIds) {\n        for (const key in this.tensorArrayMap) {\n            this.tensorArrayMap[key].clearAndClose(keepIds);\n        }\n        for (const key in this.tensorListMap) {\n            this.tensorListMap[key].clearAndClose(keepIds);\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uX2NvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvZXhlY3V0aW9uX2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBK0JBOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQU0zQixZQUNhLFlBQTZCLEVBQUUsRUFDL0IsaUJBQWlDLEVBQUUsRUFDbkMsZ0JBQStCLEVBQUUsRUFDakMsY0FBaUQsRUFBRTtRQUhuRCxjQUFTLEdBQVQsU0FBUyxDQUFzQjtRQUMvQixtQkFBYyxHQUFkLGNBQWMsQ0FBcUI7UUFDbkMsa0JBQWEsR0FBYixhQUFhLENBQW9CO1FBQ2pDLGdCQUFXLEdBQVgsV0FBVyxDQUF3QztRQVR4RCxnQkFBVyxHQUFHLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLEVBQUMsQ0FBQztRQUNyRCxhQUFRLEdBQTJCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQ3RELFdBQU0sR0FBRyxDQUFDLENBQUM7UUFRakIsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDbkMsQ0FBQztJQUVPLFFBQVEsQ0FBQyxFQUFVLEVBQUUsU0FBaUI7UUFDNUMsT0FBTyxFQUFDLEVBQUUsRUFBRSxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUMsRUFBQyxDQUFDO0lBQ3pDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsSUFBSSxjQUFjLENBQUMsUUFBZ0M7UUFDakQsSUFBSSxJQUFJLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRTtZQUM5QixJQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztZQUN6QixJQUFJLENBQUMseUJBQXlCLEVBQUUsQ0FBQztTQUNsQztJQUNILENBQUM7SUFFRCxJQUFJLGNBQWM7UUFDaEIsT0FBTyxJQUFJLENBQUMsUUFB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QUFFO1lBQ3JDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2pEO1FBRUQsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFO1lBQ3BDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1NBQ2hEO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtUZW5zb3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwLCBUZW5zb3JBcnJheU1hcCwgVGVuc29yTGlzdE1hcH0gZnJvbSAnLi4vZGF0YS90eXBlcyc7XG5cbmltcG9ydCB7VGVuc29yQXJyYXl9IGZyb20gJy4vdGVuc29yX2FycmF5JztcbmltcG9ydCB7VGVuc29yTGlzdH0gZnJvbSAnLi90ZW5zb3JfbGlzdCc7XG5pbXBvcnQge0Z1bmN0aW9uRXhlY3V0b3J9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIEV4ZWN1dGlvbkNvbnRleHRJbmZvIHtcbiAgaWQ6IG51bWJlcjsgICAgICAgICAgIC8vIHRoZSB1bmlxdWUgaWQgb2YgdGhlIGNvbnRleHQgaW5mb1xuICBmcmFtZU5hbWU6IHN0cmluZzsgICAgLy8gVGhlIGZyYW1lIG5hbWUgb2YgdGhlIGxvb3AsIHRoaXMgY29tZXMgZnJvbVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFRlbnNvckZsb3cgTm9kZURlZi5cbiAgaXRlcmF0aW9uSWQ6IG51bWJlcjsgIC8vIFRoZSBpdGVyYXRpb24gaWQgb2YgdGhlIGxvb3Bcbn1cblxuLyoqXG4gKiBFeGVjdXRpb25Db250ZXh0IGNhcHR1cmVzIHRoZSBydW50aW1lIGVudmlyb25tZW50IG9mIHRoZSBub2RlLiBJdCBrZWVwc1xuICogdHJhY2sgb2YgdGhlIGN1cnJlbnQgZnJhbWUgYW5kIGl0ZXJhdGlvbiBmb3IgdGhlIGNvbnRyb2wgZmxvdyBvcHMuXG4gKlxuICogRm9yIGV4YW1wbGUsIHR5cGljYWwgRHluYW1pYyBSTk4gbW9kZWwgbWF5IGNvbnRhaW4gbG9vcHMsIGZvciB3aGljaFxuICogVGVuc29yRmxvdyB3aWxsIGdlbmVyYXRlIGdyYXBocyB3aXRoIEVudGVyL0V4aXQgbm9kZXMgdG8gY29udHJvbCB0aGVcbiAqIGN1cnJlbnQgZXhlY3V0aW9uIGZyYW1lLCBhbmQgTmV4dEl0ZXJhdGlvbiBOb2RlcyBmb3IgaXRlcmF0aW9uIGlkIGluY3JlbWVudC5cbiAqIEZvciBtb2RlbCB3aXRoIGJyYW5jaCBsb2dpYywgVGVuc29yRkxvdyB3aWxsIGdlbmVyYXRlIFN3aXRjaC9NZXJnZSBvcHMuXG4gKi9cbmV4cG9ydCBjbGFzcyBFeGVjdXRpb25Db250ZXh0IHtcbiAgcHJpdmF0ZSByb290Q29udGV4dCA9IHtpZDogMCwgZnJhbWVOYW1lOiAnJywgaXRlcmF0aW9uSWQ6IDB9O1xuICBwcml2YXRlIGNvbnRleHRzOiBFeGVjdXRpb25Db250ZXh0SW5mb1tdID0gW3RoaXMucm9vdENvbnRleHRdO1xuICBwcml2YXRlIGxhc3RJZCA9IDA7XG4gIHByaXZhdGUgX2N1cnJlbnRDb250ZXh0SWRzOiBzdHJpbmdbXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlYWRvbmx5IHdlaWdodE1hcDogTmFtZWRUZW5zb3JzTWFwID0ge30sXG4gICAgICByZWFkb25seSB0ZW5zb3JBcnJheU1hcDogVGVuc29yQXJyYXlNYXAgPSB7fSxcbiAgICAgIHJlYWRvbmx5IHRlbnNvckxpc3RNYXA6IFRlbnNvckxpc3RNYXAgPSB7fSxcbiAgICAgIHJlYWRvbmx5IGZ1bmN0aW9uTWFwOiB7W2tleTogc3RyaW5nXTogRnVuY3Rpb25FeGVjdXRvcn0gPSB7fSkge1xuICAgIHRoaXMuZ2VuZXJhdGVDdXJyZW50Q29udGV4dElkcygpO1xuICB9XG5cbiAgcHJpdmF0ZSBuZXdGcmFtZShpZDogbnVtYmVyLCBmcmFtZU5hbWU6IHN0cmluZykge1xuICAgIHJldHVybiB7aWQsIGZyYW1lTmFtZSwgaXRlcmF0aW9uSWQ6IDB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqIEBwYXJhbSBjb250ZXh0czogRXhlY3V0aW9uQ29udGV4dEluZm9bXSB0aGUgY3VycmVudCBwYXRoIG9mIGV4ZWN1dGlvblxuICAgKiBmcmFtZXNcbiAgICovXG4gIHNldCBjdXJyZW50Q29udGV4dChjb250ZXh0czogRXhlY3V0aW9uQ29udGV4dEluZm9bXSkge1xuICAgIGlmICh0aGlzLmNvbnRleHRzICE9PSBjb250ZXh0cykge1xuICAgICAgdGhpcy5jb250ZXh0cyA9IGNvbnRleHRzO1xuICAgICAgdGhpcy5nZW5lcmF0ZUN1cnJlbnRDb250ZXh0SWRzKCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGN1cnJlbnRDb250ZXh0KCk6IEV4ZWN1dGlvbkNvbnRleHRJbmZvW10ge1xuICAgIHJldHVybiB0aGlzLmNvbnRleHRzO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHVybnMgdGhlIGN1cnJlbnQgY29udGV4dCBpbiBzdHJpbmcgZm9ybWF0LlxuICAgKi9cbiAgZ2V0IGN1cnJlbnRDb250ZXh0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5fY3VycmVudENvbnRleHRJZHNbMF07XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyB0aGUgY3VycmVudCBjb250ZXh0IGFuZCBhbGwgcGFyZW50IGNvbnRleHRzIGluIHN0cmluZyBmb3JtYXQuXG4gICAqIFRoaXMgYWxsb3cgYWNjZXNzIHRvIHRoZSBub2RlcyBpbiB0aGUgY3VycmVudCBhbmQgcGFyZW50IGZyYW1lcy5cbiAgICovXG4gIGdldCBjdXJyZW50Q29udGV4dElkcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuX2N1cnJlbnRDb250ZXh0SWRzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZW5lcmF0ZUN1cnJlbnRDb250ZXh0SWRzKCkge1xuICAgIGNvbnN0IG5hbWVzID0gW107XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbnRleHRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgY29uc3QgY29udGV4dHMgPSB0aGlzLmNvbnRleHRzLnNsaWNlKDAsIHRoaXMuY29udGV4dHMubGVuZ3RoIC0gaSk7XG4gICAgICBuYW1lcy5wdXNoKHRoaXMuY29udGV4dElkZm9yQ29udGV4dHMoY29udGV4dHMpKTtcbiAgICB9XG4gICAgbmFtZXMucHVzaCgnJyk7XG4gICAgdGhpcy5fY3VycmVudENvbnRleHRJZHMgPSBuYW1lcztcbiAgfVxuXG4gIHByaXZhdGUgY29udGV4dElkZm9yQ29udGV4dHMoY29udGV4dHM6IEV4ZWN1dGlvbkNvbnRleHRJbmZvW10pIHtcbiAgICByZXR1cm4gY29udGV4dHMgP1xuICAgICAgICBjb250ZXh0c1xuICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICBjb250ZXh0ID0+IChjb250ZXh0LmlkID09PSAwICYmIGNvbnRleHQuaXRlcmF0aW9uSWQgPT09IDApID9cbiAgICAgICAgICAgICAgICAgICAgJycgOlxuICAgICAgICAgICAgICAgICAgICBgJHtjb250ZXh0LmZyYW1lTmFtZX0tJHtjb250ZXh0Lml0ZXJhdGlvbklkfWApXG4gICAgICAgICAgICAuam9pbignLycpIDpcbiAgICAgICAgJyc7XG4gIH1cblxuICAvKipcbiAgICogRW50ZXIgYSBuZXcgZnJhbWUsIGEgbmV3IGNvbnRleHQgaXMgcHVzaGVkIG9uIHRoZSBjdXJyZW50IGNvbnRleHQgbGlzdC5cbiAgICogQHBhcmFtIGZyYW1lSWQgbmV3IGZyYW1lIGlkXG4gICAqL1xuICBlbnRlckZyYW1lKGZyYW1lSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRleHRzKSB7XG4gICAgICB0aGlzLmxhc3RJZCsrO1xuICAgICAgdGhpcy5jb250ZXh0cyA9IHRoaXMuY29udGV4dHMuc2xpY2UoKTtcbiAgICAgIHRoaXMuY29udGV4dHMucHVzaCh0aGlzLm5ld0ZyYW1lKHRoaXMubGFzdElkLCBmcmFtZUlkKSk7XG4gICAgICB0aGlzLl9jdXJyZW50Q29udGV4dElkcy51bnNoaWZ0KHRoaXMuY29udGV4dElkZm9yQ29udGV4dHModGhpcy5jb250ZXh0cykpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFeGl0IHRoZSBjdXJyZW50IGZyYW1lLCB0aGUgbGFzdCBjb250ZXh0IGlzIHJlbW92ZWQgZnJvbSB0aGUgY3VycmVudFxuICAgKiBjb250ZXh0IGxpc3QuXG4gICAqL1xuICBleGl0RnJhbWUoKSB7XG4gICAgaWYgKHRoaXMuY29udGV4dHMgJiYgdGhpcy5jb250ZXh0cy5sZW5ndGggPiAxKSB7XG4gICAgICB0aGlzLmNvbnRleHRzID0gdGhpcy5jb250ZXh0cy5zbGljZSgpO1xuICAgICAgdGhpcy5jb250ZXh0cy5zcGxpY2UoLTEpO1xuICAgICAgdGhpcy5jdXJyZW50Q29udGV4dElkcy5zaGlmdCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBleGl0IGZyYW1lLCB0aGUgY29udGV4dCBpcyBlbXB0eScpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBFbnRlciB0aGUgbmV4dCBpdGVyYXRpb24gb2YgYSBsb29wLCB0aGUgaXRlcmF0aW9uIGlkIG9mIGxhc3QgY29udGV4dCBpc1xuICAgKiBpbmNyZWFzZWQuXG4gICAqL1xuICBuZXh0SXRlcmF0aW9uKCkge1xuICAgIGlmICh0aGlzLmNvbnRleHRzICYmIHRoaXMuY29udGV4dHMubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5jb250ZXh0cyA9IHRoaXMuY29udGV4dHMuc2xpY2UoKTtcbiAgICAgIHRoaXMubGFzdElkKys7XG4gICAgICBjb25zdCBjb250ZXh0ID1cbiAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmNvbnRleHRzW3RoaXMuY29udGV4dHMubGVuZ3RoIC0gMV0pO1xuICAgICAgY29udGV4dC5pdGVyYXRpb25JZCArPSAxO1xuICAgICAgY29udGV4dC5pZCA9IHRoaXMubGFzdElkO1xuICAgICAgdGhpcy5jb250ZXh0cy5zcGxpY2UoLTEsIDEsIGNvbnRleHQpO1xuICAgICAgdGhpcy5fY3VycmVudENvbnRleHRJZHMuc3BsaWNlKFxuICAgICAgICAgIDAsIDEsIHRoaXMuY29udGV4dElkZm9yQ29udGV4dHModGhpcy5jb250ZXh0cykpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBpbmNyZWFzZSBmcmFtZSBpdGVyYXRpb24sIHRoZSBjb250ZXh0IGlzIGVtcHR5Jyk7XG4gICAgfVxuICB9XG5cbiAgZ2V0V2VpZ2h0KG5hbWU6IHN0cmluZyk6IFRlbnNvcltdIHtcbiAgICByZXR1cm4gdGhpcy53ZWlnaHRNYXBbbmFtZV07XG4gIH1cblxuICBhZGRUZW5zb3JBcnJheSh0ZW5zb3JBcnJheTogVGVuc29yQXJyYXkpIHtcbiAgICB0aGlzLnRlbnNvckFycmF5TWFwW3RlbnNvckFycmF5LmlkXSA9IHRlbnNvckFycmF5O1xuICB9XG5cbiAgZ2V0VGVuc29yQXJyYXkoaWQ6IG51bWJlcik6IFRlbnNvckFycmF5IHtcbiAgICByZXR1cm4gdGhpcy50ZW5zb3JBcnJheU1hcFtpZF07XG4gIH1cblxuICBhZGRUZW5zb3JMaXN0KHRlbnNvckxpc3Q6IFRlbnNvckxpc3QpIHtcbiAgICB0aGlzLnRlbnNvckxpc3RNYXBbdGVuc29yTGlzdC5pZF0gPSB0ZW5zb3JMaXN0O1xuICB9XG5cbiAgZ2V0VGVuc29yTGlzdChpZDogbnVtYmVyKTogVGVuc29yTGlzdCB7XG4gICAgcmV0dXJuIHRoaXMudGVuc29yTGlzdE1hcFtpZF07XG4gIH1cblxuICBkaXNwb3NlKGtlZXBJZHM6IFNldDxudW1iZXI+KSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy50ZW5zb3JBcnJheU1hcCkge1xuICAgICAgdGhpcy50ZW5zb3JBcnJheU1hcFtrZXldLmNsZWFyQW5kQ2xvc2Uoa2VlcElkcyk7XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy50ZW5zb3JMaXN0TWFwKSB7XG4gICAgICB0aGlzLnRlbnNvckxpc3RNYXBba2V5XS5jbGVhckFuZENsb3NlKGtlZXBJZHMpO1xuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { parseNodeName } from '../operations/executors/utils';\n/**\n * Given graph inputs and desired outputs, find the minimal set of nodes\n * to execute in order to compute the outputs. In addition return other useful\n * info such:\n * - Missing inputs needed to compute the output.\n * - Whether the subgraph contains dynamic ops (control flow, dynamic shape).\n * - Alternative inputs in order to avoid async (dynamic op) execution.\n */\nexport function getExecutionSubgraph(inputs, outputs, weightMap, initNodes) {\n    const usedNodes = new Set();\n    const missingInputs = [];\n    let dynamicNode = null;\n    let syncInputs = null;\n    // Start with the outputs, going backwards and find all the nodes that are\n    // needed to compute those outputs.\n    const seen = new Set();\n    const inputNodeNames = Object.keys(inputs).map(name => parseNodeName(name)[0]);\n    let initNodeNames = [];\n    if (initNodes != null) {\n        initNodeNames = initNodes.map(node => parseNodeName(node.name)[0]);\n    }\n    const frontier = [...outputs];\n    while (frontier.length > 0) {\n        const node = frontier.pop();\n        if (isControlFlow(node) || isDynamicShape(node) || isHashTable(node)) {\n            if (dynamicNode == null) {\n                dynamicNode = node;\n                syncInputs = dynamicNode.children.map(child => child.name)\n                    .filter(name => usedNodes.has(name));\n            }\n        }\n        usedNodes.add(node.name);\n        // Weights are dead end since we already have their values.\n        if (weightMap[node.name] != null) {\n            continue;\n        }\n        // This node is a dead end since it's one of the user-provided inputs.\n        if (inputNodeNames.indexOf(node.name) !== -1) {\n            continue;\n        }\n        // This node is a dead end since it doesn't have any inputs.\n        if (initNodeNames.indexOf(node.name) !== -1) {\n            continue;\n        }\n        if (node.inputs.length === 0) {\n            missingInputs.push(node.name);\n            continue;\n        }\n        node.inputs.forEach(input => {\n            // Don't add to the frontier if it is already there.\n            if (seen.has(input.name)) {\n                return;\n            }\n            seen.add(input.name);\n            frontier.push(input);\n        });\n    }\n    return { inputs, outputs, usedNodes, missingInputs, dynamicNode, syncInputs };\n}\n/**\n * Given the execution info, return a list of nodes in topological order that\n * need to be executed to compute the output.\n */\nexport function getNodesInTopologicalOrder(graph, weightMap, executionInfo) {\n    const { usedNodes, inputs } = executionInfo;\n    const frontier = [];\n    const inputNodes = Object.keys(inputs)\n        .map(name => parseNodeName(name)[0])\n        .map(name => graph.nodes[name]);\n    const initNodes = graph.initNodes;\n    inputNodes.forEach(input => {\n        if (usedNodes.has(input.name)) {\n            frontier.push(input);\n        }\n    });\n    graph.weights.forEach(weight => {\n        if (usedNodes.has(weight.name)) {\n            frontier.push(weight);\n        }\n    });\n    if (initNodes != null) {\n        initNodes.forEach(node => {\n            if (usedNodes.has(node.name)) {\n                frontier.push(node);\n            }\n        });\n    }\n    const seen = new Set();\n    const orderedNodes = [];\n    while (frontier.length > 0) {\n        const node = frontier.pop();\n        seen.add(node.name);\n        if (!weightMap[node.name]) {\n            orderedNodes.push(node);\n        }\n        node.children.forEach(child => {\n            if (!seen.has(child.name) && usedNodes.has(child.name) &&\n                child.inputs.every(input => seen.has(input.name))) {\n                frontier.push(child);\n            }\n        });\n    }\n    return orderedNodes;\n}\nconst CONTROL_FLOW_OPS = [\n    'Switch', 'Merge', 'Enter', 'Exit', 'NextIteration', 'StatelessIf',\n    'StatelessWhile', 'if', 'While'\n];\nconst DYNAMIC_SHAPE_OPS = [\n    'NonMaxSuppressionV2', 'NonMaxSuppressionV3', 'NonMaxSuppressionV5', 'Where'\n];\nconst HASH_TABLE_OPS = [\n    'HashTable', 'HashTableV2', 'LookupTableImport', 'LookupTableImportV2',\n    'LookupTableFind', 'LookupTableFindV2', 'LookupTableSize', 'LookupTableSizeV2'\n];\nexport function isControlFlow(node) {\n    return CONTROL_FLOW_OPS.indexOf(node.op) >= 0;\n}\nexport function isDynamicShape(node) {\n    return DYNAMIC_SHAPE_OPS.indexOf(node.op) >= 0;\n}\nexport function isHashTable(node) {\n    return HASH_TABLE_OPS.indexOf(node.op) >= 0;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9kZWxfYW5hbHlzaXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvbW9kZWxfYW5hbHlzaXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBWTVEOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLE1BQXNCLEVBQUUsT0FBZSxFQUFFLFNBQTBCLEVBQ25FLFNBQWtCO0lBQ3BCLE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7SUFDcEMsTUFBTSxhQUFhLEdBQWEsRUFBRSxDQUFDO0lBQ25DLElBQUksV0FBVyxHQUFTLElBQUksQ0FBQztJQUM3QixJQUFJLFVBQVUsR0FBYSxJQUFJLENBQUM7SUFFaEMsMEVBQTBFO0lBQzFFLG1DQUFtQztJQUNuQyxNQUFNLElBQUksR0FBRyxJQUFJLEdBQUcsRUFBVSxDQUFDO0lBQy9CLE1BQU0sY0FBYyxHQUNoQixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTVELElBQUksYUFBYSxHQUFhLEVBQUUsQ0FBQztJQUNqQyxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7UUFDckIsYUFBYSxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDcEU7SUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUM7SUFDOUIsT0FBTyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMs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O2FBQ3RCO1FBQ0gsQ0FBQyxDQUFDLENBQUM7S0FDSjtJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUM7QUFFRCxNQUFNLGdCQUFnQixHQUFHO0lBQ3ZCLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxlQUFlLEVBQUUsYUFBYTtJQUNsRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsT0FBTztDQUNoQyxDQUFDO0FBQ0YsTUFBTSxpQkFBaUIsR0FBRztJQUN4QixxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxxQkFBcUIsRUFBRSxPQUFPO0NBQzdFLENBQUM7QUFDRixNQUFNLGNBQWMsR0FBRztJQUNyQixXQUFXLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQjtJQUN0RSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUI7Q0FDL0UsQ0FBQztBQUVGLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBVTtJQUN0QyxPQUFPLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQ2hELENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLElBQVU7SUFDdkMsT0FBTyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDO0FBRUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUFVO0lBQ3BDLE9BQU8sY0FBYyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7TmFtZWRUZW5zb3JNYXB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TmFtZWRUZW5zb3JzTWFwfSBmcm9tICcuLi9kYXRhL3R5cGVzJztcbmltcG9ydCB7cGFyc2VOb2RlTmFtZX0gZnJvbSAnLi4vb3BlcmF0aW9ucy9leGVjdXRvcnMvdXRpbHMnO1xuaW1wb3J0IHtHcmFwaCwgTm9kZX0gZnJvbSAnLi4vb3BlcmF0aW9ucy90eXBlcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXhlY3V0aW9uSW5mbyB7XG4gIGlucHV0czogTmFtZWRUZW5zb3JNYXA7XG4gIG91dHB1dHM6IE5vZGVbXTtcbiAgdXNlZE5vZGVzOiBTZXQ8c3RyaW5nPjtcbiAgbWlzc2luZ0lucHV0czogc3RyaW5nW107XG4gIGR5bmFtaWNOb2RlOiBOb2RlO1xuICBzeW5jSW5wdXRzOiBzdHJpbmdbXTtcbn1cblxuLyoqXG4gKiBHaXZlbiBncmFwaCBpbnB1dHMgYW5kIGRlc2lyZWQgb3V0cHV0cywgZmluZCB0aGUgbWluaW1hbCBzZXQgb2Ygbm9kZXNcbiAqIHRvIGV4ZWN1dGUgaW4gb3JkZXIgdG8gY29tcHV0ZSB0aGUgb3V0cHV0cy4gSW4gYWRkaXRpb24gcmV0dXJuIG90aGVyIHVzZWZ1bFxuICogaW5mbyBzdWNoOlxuICogLSBNaXNzaW5nIGlucHV0cyBuZWVkZWQgdG8gY29tcHV0ZSB0aGUgb3V0cHV0LlxuICogLSBXaGV0aGVyIHRoZSBzdWJncmFwaCBjb250YWlucyBkeW5hbWljIG9wcyAoY29udHJvbCBmbG93LCBkeW5hbWljIHNoYXBlKS5cbiAqIC0gQWx0ZXJuYXRpdmUgaW5wdXRzIGluIG9yZGVyIHRvIGF2b2lkIGFzeW5jIChkeW5hbWljIG9wKSBleGVjdXRpb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRFeGVjdXRpb25TdWJncmFwaChcbiAgICBpbnB1dHM6IE5hbWVkVGVuc29yTWFwLCBvdXRwdXRzOiBOb2RlW10sIHdlaWdodE1hcDogTmFtZWRUZW5zb3JzTWFwLFxuICAgIGluaXROb2Rlcz86IE5vZGVbXSk6IEV4ZWN1dGlvbkluZm8ge1xuICBjb25zdCB1c2VkTm9kZXMgPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3QgbWlzc2luZ0lucHV0czogc3RyaW5nW10gPSBbXTtcbiAgbGV0IGR5bmFtaWNOb2RlOiBOb2RlID0gbnVsbDtcbiAgbGV0IHN5bmNJbnB1dHM6IHN0cmluZ1tdID0gbnVsbDtcblxuICAvLyBTdGFydCB3aXRoIHRoZSBvdXRwdXRzLCBnb2luZyBiYWNrd2FyZHMgYW5kIGZpbmQgYWxsIHRoZSBub2RlcyB0aGF0IGFyZVxuICAvLyBuZWVkZWQgdG8gY29tcHV0ZSB0aG9zZSBvdXRwdXRzLlxuICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gIGNvbnN0IGlucHV0Tm9kZU5hbWVzID1cbiAgICAgIE9iamVjdC5rZXlzKGlucHV0cykubWFwKG5hbWUgPT4gcGFyc2VOb2RlTmFtZShuYW1lKVswXSk7XG5cbiAgbGV0IGluaXROb2RlTmFtZXM6IHN0cmluZ1tdID0gW107XG4gIGlmIChpbml0Tm9kZXMgIT0gbnVsbCkge1xuICAgIGluaXROb2RlTmFtZXMgPSBpbml0Tm9kZXMubWFwKG5vZGUgPT4gcGFyc2VOb2RlTmFtZShub2RlLm5hbWUpWzBdKTtcbiAgfVxuXG4gIGNvbnN0IGZyb250aWVyID0gWy4uLm91dHB1dHNdO1xuICB3aGlsZSAoZnJvbnRpZXIubGVuZ3RoID4gMCkge1xuICAgIGNvbnN0IG5vZGUgPSBmcm9udGllci5wb3AoKTtcbiAgICBpZiAoaXNDb250cm9sRmxvdyhub2RlKSB8fCBpc0R5bmFtaWNTaGFwZShub2RlKSB8fCBpc0hhc2hUYWJsZShub2RlKSkge1xuICAgICAgaWYgKGR5bmFtaWNOb2RlID09IG51bGwpIHtcbiAgICAgICAgZHluYW1pY05vZGUgPSBub2RlO1xuICAgICAgICBzeW5jSW5wdXRzID0gZHluYW1pY05vZGUuY2hpbGRyZW4ubWFwKGNoaWxkID0+IGNoaWxkLm5hbWUpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihuYW1lID0+IHVzZWROb2Rlcy5oYXMobmFtZSkpO1xuICAgICAgfVxuICAgIH1cbiAgICB1c2VkTm9kZXMuYWRkKG5vZGUubmFtZSk7XG5cbiAgICAvLyBXZWlnaHRzIGFyZSBkZWFkIGVuZCBzaW5jZSB3ZSBhbHJlYWR5IGhhdmUgdGhlaXIgdmFsdWVzLlxuICAgIGlmICh3ZWlnaHRNYXBbbm9kZS5uYW1lXSAhPSBudWxsKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gVGhpcyBub2RlIGlzIGEgZGVhZCBlbmQgc2luY2UgaXQncyBvbmUgb2YgdGhlIHVzZXItcHJvdmlkZWQgaW5wdXRzLlxuICAgIGlmIChpbnB1dE5vZGVOYW1lcy5pbmRleE9mKG5vZGUubmFtZSkgIT09IC0xKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgLy8gVGhpcyBub2RlIGlzIGEgZGVhZCBlbmQgc2luY2UgaXQgZG9lc24ndCBoYXZlIGFueSBpbnB1dHMuXG4gICAgaWYgKGluaXROb2RlTmFtZXMuaW5kZXhPZihub2RlLm5hbWUpICE9PSAtMSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIGlmIChub2RlLmlucHV0cy5sZW5ndGggPT09IDApIHtcbiAgICAgIG1pc3NpbmdJbnB1dHMucHVzaChub2RlLm5hbWUpO1xuICAgICAgY29udGludWU7XG4gICAgfVxuICAgIG5vZGUuaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgLy8gRG9uJ3QgYWRkIHRvIHRoZSBmcm9udGllciBpZiBpdCBpcyBhbHJlYWR5IHRoZXJlLlxuICAgICAgaWYgKHNlZW4uaGFzKGlucHV0Lm5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGlucHV0Lm5hbWUpO1xuICAgICAgZnJvbnRpZXIucHVzaChpbnB1dCk7XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIHtpbnB1dHMsIG91dHB1dHMsIHVzZWROb2RlcywgbWlzc2luZ0lucHV0cywgZHluYW1pY05vZGUsIHN5bmNJbnB1dHN9O1xufVxuXG4vKipcbiAqIEdpdmVuIHRoZSBleGVjdXRpb24gaW5mbywgcmV0dXJuIGEgbGlzdCBvZiBub2RlcyBpbiB0b3BvbG9naWNhbCBvcmRlciB0aGF0XG4gKiBuZWVkIHRvIGJlIGV4ZWN1dGVkIHRvIGNvbXB1dGUgdGhlIG91dHB1dC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldE5vZGVzSW5Ub3BvbG9naWNhbE9yZGVyKFxuICAgIGdyYXBoOiBHcmFwaCwgd2VpZ2h0TWFwOiBOYW1lZFRlbnNvcnNNYXAsXG4gICAgZXhlY3V0aW9uSW5mbzogRXhlY3V0aW9uSW5mbyk6IE5vZGVbXSB7XG4gIGNvbnN0IHt1c2VkTm9kZXMsIGlucHV0c30gPSBleGVjdXRpb25JbmZvO1xuICBjb25zdCBmcm9udGllcjogTm9kZVtdID0gW107XG4gIGNvbnN0IGlucHV0Tm9kZXMgPSBPYmplY3Qua2V5cyhpbnB1dHMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IHBhcnNlTm9kZU5hbWUobmFtZSlbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IGdyYXBoLm5vZGVzW25hbWVdKTtcbiAgY29uc3QgaW5pdE5vZGVzID0gZ3JhcGguaW5pdE5vZGVzO1xuXG4gIGlucHV0Tm9kZXMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgaWYgKHVzZWROb2Rlcy5oYXMoaW5wdXQubmFtZSkpIHtcbiAgICAgIGZyb250aWVyLnB1c2goaW5wdXQpO1xuICAgIH1cbiAgfSk7XG4gIGdyYXBoLndlaWdodHMuZm9yRWFjaCh3ZWlnaHQgPT4ge1xuICAgIGlmICh1c2VkTm9kZXMuaGFzKHdlaWdodC5uYW1lKSkge1xuICAgICAgZnJvbnRpZXIucHVzaCh3ZWlnaHQpO1xuICAgIH1cbiAgfSk7XG4gIGlmIChpbml0Tm9kZXMgIT0gbnVsbCkge1xuICAgIGluaXROb2Rlcy5mb3JFYWNoKG5vZGUgPT4ge1xuICAgICAgaWYgKHVzZWROb2Rlcy5oYXMobm9kZS5uYW1lKSkge1xuICAgICAgICBmcm9udGllci5wdXNoKG5vZGUpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGNvbnN0IHNlZW4gPSBuZXcgU2V0PHN0cmluZz4oKTtcbiAgY29uc3Qgb3JkZXJlZE5vZGVzOiBOb2RlW10gPSBbXTtcbiAgd2hpbGUgKGZyb250aWVyLmxlbmd0aCA+IDApIHtcbiAgICBjb25zdCBub2RlID0gZnJvbnRpZXIucG9wKCk7XG4gICAgc2Vlbi5hZGQobm9kZS5uYW1lKTtcbiAgICBpZiAoIXdlaWdodE1hcFtub2RlLm5hbWVdKSB7XG4gICAgICBvcmRlcmVkTm9kZXMucHVzaChub2RlKTtcbiAgICB9XG4gICAgbm9kZS5jaGlsZHJlbi5mb3JFYWNoKGNoaWxkID0+IHtcbiAgICAgIGlmICghc2Vlbi5oYXMoY2hpbGQubmFtZSkgJiYgdXNlZE5vZGVzLmhhcyhjaGlsZC5uYW1lKSAmJlxuICAgICAgICAgIGNoaWxkLmlucHV0cy5ldmVyeShpbnB1dCA9PiBzZWVuLmhhcyhpbnB1dC5uYW1lKSkpIHtcbiAgICAgICAgZnJvbnRpZXIucHVzaChjaGlsZCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIG9yZGVyZWROb2Rlcztcbn1cblxuY29uc3QgQ09OVFJPTF9GTE9XX09QUyA9IFtcbiAgJ1N3aXRjaCcsICdNZXJnZScsICdFbnRlcicsICdFeGl0JywgJ05leHRJdGVyYXRpb24nLCAnU3RhdGVsZXNzSWYnLFxuICAnU3RhdGVsZXNzV2hpbGUnLCAnaWYnLCAnV2hpbGUnXG5dO1xuY29uc3QgRFlOQU1JQ19TSEFQRV9PUFMgPSBbXG4gICdOb25NYXhTdXBwcmVzc2lvblYyJywgJ05vbk1heFN1cHByZXNzaW9uVjMnLCAnTm9uTWF4U3VwcHJlc3Npb25WNScsICdXaGVyZSdcbl07XG5jb25zdCBIQVNIX1RBQkxFX09QUyA9IFtcbiAgJ0hhc2hUYWJsZScsICdIYXNoVGFibGVWMicsICdMb29rdXBUYWJsZUltcG9ydCcsICdMb29rdXBUYWJsZUltcG9ydFYyJyxcbiAgJ0xvb2t1cFRhYmxlRmluZCcsICdMb29rdXBUYWJsZUZpbmRWMicsICdMb29rdXBUYWJsZVNpemUnLCAnTG9va3VwVGFibGVTaXplVjInXG5dO1xuXG5leHBvcnQgZnVuY3Rpb24gaXNDb250cm9sRmxvdyhub2RlOiBOb2RlKSB7XG4gIHJldHVybiBDT05UUk9MX0ZMT1dfT1BTLmluZGV4T2Yobm9kZS5vcCkgPj0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzRHluYW1pY1NoYXBlKG5vZGU6IE5vZGUpIHtcbiAgcmV0dXJuIERZTkFNSUNfU0hBUEVfT1BTLmluZGV4T2Yobm9kZS5vcCkgPj0gMDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGlzSGFzaFRhYmxlKG5vZGU6IE5vZGUpIHtcbiAgcmV0dXJuIEhBU0hfVEFCTEVfT1BTLmluZGV4T2Yobm9kZS5vcCkgPj0gMDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, tidy, util } from '@tensorflow/tfjs-core';\nimport { getNodeNameAndIndex, getParamValue, getTensor, getTensorsForCurrentContenxt, parseNodeName } from '../operations/executors/utils';\nimport { executeOp } from '../operations/operation_executor';\nimport { ExecutionContext } from './execution_context';\nimport { getExecutionSubgraph, getNodesInTopologicalOrder, isControlFlow } from './model_analysis';\nexport class GraphExecutor {\n    /**\n     *\n     * @param graph Graph the model or function graph to be executed.\n     * @param parent When building function exector you need to set the parent\n     * executor. Since the weights and function executor maps are set at parant\n     * level, that function executor can access the function maps and weight maps\n     * through the parent.\n     */\n    constructor(graph, parent) {\n        this.graph = graph;\n        this.parent = parent;\n        this.compiledMap = new Map();\n        this._weightMap = {};\n        this.SEPERATOR = ',';\n        this._functions = {};\n        this._functionExecutorMap = {};\n        this.intermediateTensors = {};\n        this.keepTensorForDebug = false;\n        this._outputs = graph.outputs;\n        this._inputs = graph.inputs;\n        this._initNodes = graph.initNodes;\n        this._signature = graph.signature;\n        this._functions = graph.functions;\n        // create sub-graph executors\n        if (graph.functions != null) {\n            Object.keys(graph.functions).forEach(name => {\n                this._functionExecutorMap[name] =\n                    new GraphExecutor(graph.functions[name], this);\n            });\n        }\n    }\n    get weightIds() {\n        return this.parent ? this.parent.weightIds : this._weightIds;\n    }\n    get functionExecutorMap() {\n        return this.parent ? this.parent.functionExecutorMap :\n            this._functionExecutorMap;\n    }\n    get weightMap() {\n        return this.parent ? this.parent.weightMap : this._weightMap;\n    }\n    set weightMap(weightMap) {\n        const weightIds = Object.keys(weightMap).map(key => weightMap[key].map(tensor => tensor.id));\n        this._weightIds = [].concat(...weightIds);\n        this._weightMap = weightMap;\n    }\n    /**\n     * Set `ResourceManager` shared by executors of a model.\n     * @param resourceManager: `ResourceManager` of the `GraphModel`.\n     */\n    set resourceManager(resourceManager) {\n        this._resourceManager = resourceManager;\n    }\n    get inputs() {\n        return this._inputs.map(node => {\n            return {\n                name: node.name,\n                shape: node.attrParams['shape'] ?\n                    node.attrParams['shape'].value :\n                    undefined,\n                dtype: node.attrParams['dtype'] ?\n                    node.attrParams['dtype'].value :\n                    undefined\n            };\n        });\n    }\n    get outputs() {\n        return this._outputs.map(node => {\n            return {\n                name: node.name,\n                shape: node.attrParams['shape'] ?\n                    node.attrParams['shape'].value :\n                    undefined,\n                dtype: node.attrParams['dtype'] ?\n                    node.attrParams['dtype'].value :\n                    undefined\n            };\n        });\n    }\n    get inputNodes() {\n        return this._inputs.map(node => node.signatureKey || node.name);\n    }\n    get outputNodes() {\n        return this._outputs.map((node) => {\n            const name = node.signatureKey || node.name;\n            return node.defaultOutput ? (`${name}:${node.defaultOutput}`) : name;\n        });\n    }\n    get functions() {\n        return Object.keys(this._functions).reduce((map, key) => {\n            map[key] = this._functions[key].signature;\n            return map;\n        }, {});\n    }\n    getCompilationKey(inputs, outputs) {\n        const sortedInputs = inputs.map(node => node.name).sort();\n        const sortedOutputs = outputs.map(node => node.name).sort();\n        return sortedInputs.join(this.SEPERATOR) + '--' +\n            sortedOutputs.join(this.SEPERATOR);\n    }\n    /**\n     * Compiles the inference graph and returns the minimal set of nodes that are\n     * required for execution, in the correct execution order.\n     */\n    compile(inputs, outputs) {\n        const executionInfo = getExecutionSubgraph(inputs, outputs, this.weightMap, this._initNodes);\n        const { missingInputs, dynamicNode, syncInputs } = executionInfo;\n        if (dynamicNode != null) {\n            throw new Error(`This execution contains the node '${dynamicNode.name}', which has ` +\n                `the dynamic op '${dynamicNode.op}'. Please use ` +\n                `model.executeAsync() instead. Alternatively, to avoid the ` +\n                `dynamic ops, specify the inputs [${syncInputs}]`);\n        }\n        if (missingInputs.length > 0) {\n            const outNames = outputs.map(n => n.name);\n            const inNames = Object.keys(inputs);\n            throw new Error(`Cannot compute the outputs [${outNames}] from the provided inputs ` +\n                `[${inNames}]. Missing the following inputs: [${missingInputs}]`);\n        }\n        return getNodesInTopologicalOrder(this.graph, this.weightMap, executionInfo);\n    }\n    /**\n     * Executes the inference for given input tensors.\n     * @param inputs Tensor map for the model inputs, keyed by the input node\n     * names.\n     * @param outputs Optional. output node name from the Tensorflow model, if\n     * no outputs are specified, the default outputs of the model would be used.\n     * You can inspect intermediate nodes of the model by adding them to the\n     * outputs array.\n     */\n    execute(inputs, outputs) {\n        inputs = this.mapInputs(inputs);\n        const names = Object.keys(inputs).sort();\n        this.checkInputs(inputs);\n        this.checkInputShapeAndType(inputs);\n        outputs = this.mapOutputs(outputs);\n        this.checkOutputs(outputs);\n        const inputNodes = names.map(name => this.graph.nodes[parseNodeName(name)[0]]);\n        const outputNodeNames = outputs.map(name => parseNodeName(name)[0]);\n        let outputNodes = outputNodeNames.map(name => this.graph.nodes[name]);\n        this.resetIntermediateTensors();\n        // If no outputs are specified, then use the default outputs of the model.\n        if (outputNodes.length === 0) {\n            outputNodes = this._outputs;\n        }\n        const compilationKey = this.getCompilationKey(inputNodes, outputNodes);\n        // Do nothing if the compiled graph cache contains the input.\n        let orderedNodes = this.compiledMap.get(compilationKey);\n        if (orderedNodes == null) {\n            orderedNodes = this.compile(inputs, outputNodes);\n            this.compiledMap.set(compilationKey, orderedNodes);\n        }\n        const tensorArrayMap = {};\n        const tensorListMap = {};\n        return tidy(() => {\n            const context = new ExecutionContext(this.weightMap, tensorArrayMap, tensorListMap, this.functionExecutorMap);\n            const tensorsMap = Object.assign({}, this.weightMap);\n            Object.keys(inputs).forEach(name => {\n                const [nodeName, index] = parseNodeName(name);\n                const tensors = [];\n                tensors[index] = inputs[name];\n                tensorsMap[nodeName] = tensors;\n            });\n            const tensorsToKeep = this.getFrozenTensorIds(tensorsMap);\n            const intermediateTensorConsumerCount = {};\n            for (let i = 0; i < orderedNodes.length; i++) {\n                const node = orderedNodes[i];\n                if (!tensorsMap[node.name]) {\n                    const tensors = executeOp(node, tensorsMap, context, this._resourceManager);\n                    if (util.isPromise(tensors)) {\n                        throw new Error(`The execution of the op '${node.op}' returned a promise. ` +\n                            `Please use model.executeAsync() instead.`);\n                    }\n                    tensorsMap[node.name] = tensors;\n                    this.checkTensorForDisposal(node.name, node, tensorsMap, context, tensorsToKeep, outputNodeNames, intermediateTensorConsumerCount);\n                }\n            }\n            // dispose the context for the root executor\n            if (this.parent == null) {\n                context.dispose(tensorsToKeep);\n            }\n            return outputs.map(name => getTensor(name, tensorsMap, context));\n        });\n    }\n    getFrozenTensorIds(tensorMap) {\n        const ids = [].concat.apply([], Object.keys(tensorMap)\n            .map(key => tensorMap[key])\n            .map(tensors => tensors.map(tensor => tensor.id)));\n        return new Set(ids);\n    }\n    checkTensorForDisposal(nodeName, node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount) {\n        // Skip output nodes and any control flow nodes, since its dependency is\n        // tricky to track correctly.\n        if (node.category === 'control' || outputNames.indexOf(nodeName) !== -1) {\n            return;\n        }\n        tensorMap[nodeName].forEach(tensor => {\n            if (tensor != null) {\n                intermediateTensorConsumerCount[tensor.id] =\n                    (intermediateTensorConsumerCount[tensor.id] || 0) +\n                        node.children.length;\n            }\n        });\n        node.inputs.forEach(input => {\n            // Skip any control flow nodes, since its dependency is tricky to track\n            // correctly.\n            if (input.category !== 'control') {\n                const tensors = getTensorsForCurrentContenxt(input.name, tensorMap, context);\n                if (tensors != null) {\n                    tensors.forEach(tensor => {\n                        if (tensor && !tensor.kept && !tensorsToKeep.has(tensor.id)) {\n                            const count = intermediateTensorConsumerCount[tensor.id];\n                            if (count === 1) {\n                                if (!this.keepTensorForDebug) {\n                                    tensor.dispose();\n                                }\n                                else {\n                                    const [nodeName, index] = getNodeNameAndIndex(node.name, context);\n                                    if (this.intermediateTensors[nodeName]) {\n                                        this.intermediateTensors[nodeName][index] = tensor;\n                                    }\n                                    else {\n                                        this.intermediateTensors[nodeName] = [];\n                                        this.intermediateTensors[nodeName][index] = tensor;\n                                    }\n                                }\n                                delete intermediateTensorConsumerCount[tensor.id];\n                            }\n                            else if (count != null) {\n                                // only intermediate nodes has count set, inputs and weights are\n                                // not.\n                                intermediateTensorConsumerCount[tensor.id]--;\n                            }\n                        }\n                    });\n                }\n            }\n        });\n    }\n    /**\n     * Executes the inference for given input tensors in Async fashion.\n     * @param inputs Tensor map for the model inputs, keyed by the input node\n     * names.\n     * @param outputs output node name from the Tensorflow model, if no outputs\n     * are specified, the default outputs of the model would be used. You can\n     * inspect intermediate nodes of the model by adding them to the outputs\n     * array.\n     */\n    async executeAsync(inputs, outputs) {\n        return this._executeAsync(inputs, outputs);\n    }\n    disposeIntermediateTensors() {\n        if (!this.intermediateTensors) {\n            return;\n        }\n        Object.keys(this.intermediateTensors)\n            .forEach(key => this.intermediateTensors[key].forEach(tensor => tensor.dispose()));\n        this.disposeTensorsMap();\n    }\n    disposeTensorsMap() {\n        if (!this.tensorsMap) {\n            return;\n        }\n        Object.keys(this.tensorsMap).forEach(key => {\n            const tensorArray = this.tensorsMap[key];\n            tensorArray.forEach(tensor => {\n                if (tensor && !tensor.kept && !tensor.isDisposed &&\n                    !this.keepIds.has(tensor.id)) {\n                    tensor.dispose();\n                }\n            });\n        });\n    }\n    getIntermediateTensors() {\n        return this.tensorsMap;\n    }\n    resetIntermediateTensors() {\n        for (const key in this.intermediateTensors) {\n            this.intermediateTensors[key].forEach(tensor => tensor.dispose());\n            delete this.intermediateTensors[key];\n        }\n    }\n    /**\n     * Executes the inference for given input tensors in Async fashion.\n     * @param inputs Tensor map for the model inputs, keyed by the input node\n     * names.\n     * @param outputs Optional. output node name from the Tensorflow model,\n     * if no outputs are specified, the default outputs of the model would be\n     * used. You can inspect intermediate nodes of the model by adding them to the\n     * outputs array.\n     * @param isFunctionExecution Optional. Flag for executing a function.\n     * @param tensorArrayMap Optional, global TensorArray map by id. Used for\n     * function execution.\n     * @param tensorArrayMap Optinal global TensorList map by id. Used for\n     * function execution.\n     */\n    async _executeAsync(inputs, outputs, isFunctionExecution = false, tensorArrayMap = {}, tensorListMap = {}) {\n        if (!isFunctionExecution) {\n            inputs = this.mapInputs(inputs);\n            this.checkInputs(inputs);\n            this.checkInputShapeAndType(inputs);\n            outputs = this.mapOutputs(outputs);\n            this.checkOutputs(outputs);\n        }\n        // For model debug.\n        try {\n            this.keepTensorForDebug = env().getBool('KEEP_INTERMEDIATE_TENSORS');\n        }\n        catch (e) {\n            console.warn(e.message);\n        }\n        this.resetIntermediateTensors();\n        const context = new ExecutionContext(this.weightMap, tensorArrayMap, tensorListMap, this.functionExecutorMap);\n        // Graph with control flow op requires runtime evaluation of the execution\n        // order, while without control flow the execution order is pre-determined\n        // in the compile method.\n        this.tensorsMap = await this.executeWithControlFlow(inputs, context, outputs, isFunctionExecution);\n        const results = outputs.map(name => getTensor(name, this.tensorsMap, context));\n        // dispose all the intermediate tensors\n        const outputIds = results.map(t => t.id);\n        const inputIds = Object.keys(inputs).map(name => inputs[name].id);\n        this.keepIds =\n            new Set([...outputIds, ...inputIds, ...this.weightIds]);\n        if (!this.keepTensorForDebug) {\n            this.disposeTensorsMap();\n        }\n        // dispose the context for the root executor\n        if (this.parent == null) {\n            context.dispose(this.keepIds);\n        }\n        return results;\n    }\n    async executeFunctionAsync(inputs, tensorArrayMap, tensorListMap) {\n        const mappedInputs = inputs.reduce((map, tensor, index) => {\n            map[this.inputs[index].name] = tensor;\n            return map;\n        }, {});\n        return this._executeAsync(mappedInputs, this.outputNodes, true, tensorArrayMap, tensorListMap);\n    }\n    /**\n     * When there are control flow nodes in the graph, the graph execution use\n     * ExecutionContext to keep track of the frames and loop iterators.\n     * @param inputs placeholder tensors for the graph.\n     * @param context the execution context object for current execution.\n     * @param outputNames Optional. output node name from the Tensorflow model,\n     * if no outputs are specified, the default outputs of the model would be\n     * used. You can inspect intermediate nodes of the model by adding them to the\n     * outputs array.\n     * @param isFunctionExecution Flag for executing a function.\n     */\n    async executeWithControlFlow(inputs, context, outputNames, isFunctionExecution) {\n        const names = Object.keys(inputs);\n        const inputNodes = names.map(name => this.graph.nodes[parseNodeName(name)[0]]);\n        const outputNodeNames = outputNames.map(name => parseNodeName(name)[0]);\n        let outputNodes = outputNodeNames.map(name => this.graph.nodes[name]);\n        // If no outputs are specified, then use the default outputs of the model.\n        if (outputNodes.length === 0) {\n            outputNodes = this._outputs;\n        }\n        const { usedNodes, missingInputs, dynamicNode, syncInputs } = getExecutionSubgraph(inputs, outputNodes, this.weightMap, this._initNodes);\n        // First nodes to execute include inputNodes, weights, and initNodes.\n        const stack = [\n            ...inputNodes, ...this.graph.weights, ...(this._initNodes || [])\n        ].map(node => {\n            return { node, contexts: context.currentContext };\n        });\n        const tensorsMap = Object.assign({}, this.weightMap);\n        Object.keys(inputs).forEach(name => {\n            const [nodeName, index] = parseNodeName(name);\n            const tensors = [];\n            tensors[index] = inputs[name];\n            tensorsMap[nodeName] = tensors;\n        });\n        const intermediateTensorConsumerCount = {};\n        const tensorsToKeep = this.getFrozenTensorIds(tensorsMap);\n        const added = {};\n        while (stack.length > 0) {\n            const promises = this.processStack(inputNodes, stack, context, tensorsMap, added, tensorsToKeep, outputNodeNames, intermediateTensorConsumerCount, usedNodes);\n            await Promise.all(promises);\n        }\n        if (dynamicNode == null && !isFunctionExecution) {\n            console.warn(`This model execution did not contain any nodes with control flow ` +\n                `or dynamic output shapes. You can use model.execute() instead.`);\n        }\n        const missingOutputs = outputNodes\n            .filter(node => !isControlFlow(node) &&\n            !getTensor(node.name, tensorsMap, context))\n            .map(node => node.name);\n        if (missingOutputs.length > 0) {\n            let alternativeMsg = '';\n            if (dynamicNode != null) {\n                alternativeMsg =\n                    `Alternatively, to avoid the dynamic ops, use model.execute() ` +\n                        `and specify the inputs [${syncInputs}]`;\n            }\n            throw new Error(`Cannot compute the outputs [${missingOutputs}] from the provided ` +\n                `inputs [${names}]. Consider providing the following inputs: ` +\n                `[${missingInputs}]. ${alternativeMsg}`);\n        }\n        return tensorsMap;\n    }\n    processStack(inputNodes, stack, context, tensorMap, added, tensorsToKeep, outputNames, intermediateTensorConsumerCount, usedNodes) {\n        const promises = [];\n        while (stack.length > 0) {\n            const item = stack.pop();\n            context.currentContext = item.contexts;\n            let nodeName = '';\n            // The tensor of the Enter op with isConstant set should be set\n            // in the parent scope, so it will be available as constant for the\n            // whole loop.\n            if (item.node.op === 'Enter' &&\n                getParamValue('isConstant', item.node, tensorMap, context)) {\n                [nodeName] = getNodeNameAndIndex(item.node.name, context);\n            }\n            // only process nodes that are not in the tensorMap yet, this include\n            // inputNodes and internal initNodes.\n            if (tensorMap[item.node.name] == null) {\n                const tensors = executeOp(item.node, tensorMap, context, this._resourceManager);\n                if (!nodeName) {\n                    [nodeName] = getNodeNameAndIndex(item.node.name, context);\n                }\n                const currentContext = context.currentContext;\n                if (util.isPromise(tensors)) {\n                    promises.push(tensors.then(t => {\n                        tensorMap[nodeName] = t;\n                        context.currentContext = currentContext;\n                        this.checkTensorForDisposal(nodeName, item.node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount);\n                        this.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n                        return t;\n                    }));\n                }\n                else {\n                    tensorMap[nodeName] = tensors;\n                    this.checkTensorForDisposal(nodeName, item.node, tensorMap, context, tensorsToKeep, outputNames, intermediateTensorConsumerCount);\n                    this.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n                }\n            }\n            else {\n                this.processChildNodes(item.node, stack, context, tensorMap, added, usedNodes);\n            }\n        }\n        return promises;\n    }\n    processChildNodes(node, stack, context, tensorMap, added, usedNodes) {\n        node.children.forEach((childNode) => {\n            const [nodeName,] = getNodeNameAndIndex(childNode.name, context);\n            if (added[nodeName] || !usedNodes.has(childNode.name)) {\n                return;\n            }\n            // Merge op can be pushed if any of its inputs has value.\n            if (childNode.op === 'Merge') {\n                if (childNode.inputNames.some(name => {\n                    return !!getTensor(name, tensorMap, context);\n                })) {\n                    added[nodeName] = true;\n                    stack.push({ contexts: context.currentContext, node: childNode });\n                }\n            }\n            else // Otherwise all inputs must to have value.\n             if (childNode.inputNames.every(name => {\n                return !!getTensor(name, tensorMap, context);\n            })) {\n                added[nodeName] = true;\n                stack.push({ contexts: context.currentContext, node: childNode });\n            }\n        });\n    }\n    /**\n     * Releases the memory used by the weight tensors.\n     */\n    dispose() {\n        Object.keys(this.weightMap)\n            .forEach(key => this.weightMap[key].forEach(tensor => tensor.dispose()));\n    }\n    checkInputShapeAndType(inputs) {\n        Object.keys(inputs).forEach(name => {\n            const input = inputs[name];\n            const [nodeName,] = parseNodeName(name);\n            const node = this.graph.nodes[nodeName];\n            if (node.attrParams['shape'] && node.attrParams['shape'].value) {\n                const shape = node.attrParams['shape'].value;\n                const match = shape.length === input.shape.length &&\n                    input.shape.every((dim, index) => shape[index] === -1 || shape[index] === dim);\n                util.assert(match, () => `The shape of dict['${node.name}'] provided in ` +\n                    `model.execute(dict) must be [${shape}], but was ` +\n                    `[${input.shape}]`);\n            }\n            if (node.attrParams['dtype'] && node.attrParams['dtype'].value) {\n                util.assert(input.dtype === node.attrParams['dtype'].value, () => `The dtype of dict['${node.name}'] provided in ` +\n                    `model.execute(dict) must be ` +\n                    `${node.attrParams['dtype'].value}, but was ${input.dtype}`);\n            }\n        });\n    }\n    mapInputs(inputs) {\n        const result = {};\n        for (const inputName in inputs) {\n            if (this._signature != null && this._signature.inputs != null &&\n                this._signature.inputs[inputName] != null) {\n                const tensor = this._signature.inputs[inputName];\n                result[tensor.name] = inputs[inputName];\n            }\n            else {\n                result[inputName] = inputs[inputName];\n            }\n        }\n        return result;\n    }\n    checkInputs(inputs) {\n        const notInGraph = Object.keys(inputs).filter(name => {\n            const [nodeName] = parseNodeName(name);\n            return this.graph.nodes[nodeName] == null;\n        });\n        if (notInGraph.length > 0) {\n            throw new Error(`The dict provided in model.execute(dict) has ` +\n                `keys: [${notInGraph}] that are not part of graph`);\n        }\n    }\n    mapOutputs(outputs) {\n        return outputs.map(name => {\n            if (this._signature != null && this._signature.outputs != null &&\n                this._signature.outputs[name] != null) {\n                const tensor = this._signature.outputs[name];\n                return tensor.name;\n            }\n            return name;\n        }, {});\n    }\n    checkOutputs(outputs) {\n        outputs.forEach(name => {\n            const [normalizedName] = parseNodeName(name);\n            if (!this.graph.nodes[normalizedName]) {\n                throw new Error(`The output '${name}' is not found in the graph`);\n            }\n        });\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhfZXhlY3V0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvZ3JhcGhfZXhlY3V0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFXLEdBQUcsRUFBMEIsSUFBSSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSXhGLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLDRCQUE0QixFQUFFLGFBQWEsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBQ3pJLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxrQ0FBa0MsQ0FBQztBQUczRCxPQUFPLEVBQUMsZ0JBQWdCLEVBQXVCLE1BQU0scUJBQXFCLENBQUM7QUFDM0UsT0FBTyxFQUFDLG9CQUFvQixFQUFFLDBCQUEwQixFQUFFLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBU2pHLE1BQU0sT0FBTyxhQUFhO0lBMkZ4Qjs7Ozs7OztPQU9HO0lBQ0gsWUFBb0IsS0FBWSxFQUFVLE1BQXNCO1FBQTVDLFVBQUssR0FBTCxLQUFLLENBQU87UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFnQjtRQWxHeEQsZ0JBQVcsR0FBd0IsSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUM3QyxlQUFVLEdBQW9CLEVBQUUsQ0FBQztRQU1qQyxjQUFTLEdBQUcsR0FBRyxDQUFDO1FBQ2hCLGVBQVUsR0FBMkIsRUFBRSxDQUFDO1FBQ3hDLHlCQUFvQixHQUFzQyxFQUFFLENBQUM7UUFFN0Qsd0JBQW1CLEdBQW9CLEVBQUUsQ0FBQztRQUcxQyx1QkFBa0IsR0FBRyxLQUFLLENBQUM7UUFxRmpDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQztRQUM5QixJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQyxNQUFNLENB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QUM7Z0JBQzdDLE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQzthQUNwQjtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ1QsQ0FBQztJQUVPLFlBQVksQ0FBQyxPQUFpQjtRQUNwQyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxjQUFjLENBQUMsR0FBRyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDN0MsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxFQUFFO2dCQUNyQyxNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsSUFBSSw2QkFBNkIsQ0FBQyxDQUFDO2FBQ25FO1FBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIGVudiwgTmFtZWRUZW5zb3JNYXAsIFRlbnNvciwgdGlkeSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtJU2lnbmF0dXJlRGVmfSBmcm9tICcuLi9kYXRhL2NvbXBpbGVkX2FwaSc7XG5pbXBvcnQge05hbWVkVGVuc29yc01hcCwgVGVuc29yQXJyYXlNYXAsIFRlbnNvckluZm8sIFRlbnNvckxpc3RNYXB9IGZyb20gJy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtnZXROb2RlTmFtZUFuZEluZGV4LCBnZXRQYXJhbVZhbHVlLCBnZXRUZW5zb3IsIGdldFRlbnNvcnNGb3JDdXJyZW50Q29udGVueHQsIHBhcnNlTm9kZU5hbWV9IGZyb20gJy4uL29wZXJhdGlvbnMvZXhlY3V0b3JzL3V0aWxzJztcbmltcG9ydCB7ZXhlY3V0ZU9wfSBmcm9tICcuLi9vcGVyYXRpb25zL29wZXJhdGlvbl9leGVjdXRvcic7XG5pbXBvcnQge0dyYXBoLCBOb2RlfSBmcm9tICcuLi9vcGVyYXRpb25zL3R5cGVzJztcblxuaW1wb3J0IHtFeGVjdXRpb25Db250ZXh0LCBFeGVjdXRpb25Db250ZXh0SW5mb30gZnJvbSAnLi9leGVjdXRpb25fY29udGV4dCc7XG5pbXBvcnQge2dldEV4ZWN1dGlvblN1YmdyYXBoLCBnZXROb2Rlc0luVG9wb2xvZ2ljYWxPcmRlciwgaXNDb250cm9sRmxvd30gZnJvbSAnLi9tb2RlbF9hbmFseXNpcyc7XG5pbXBvcnQge1Jlc291cmNlTWFuYWdlcn0gZnJvbSAnLi9yZXNvdXJjZV9tYW5hZ2VyJztcbmltcG9ydCB7RnVuY3Rpb25FeGVjdXRvcn0gZnJvbSAnLi90eXBlcyc7XG5cbmludGVyZmFjZSBOb2RlV2l0aENvbnRleHRzIHtcbiAgY29udGV4dHM6IEV4ZWN1dGlvbkNvbnRleHRJbmZvW107XG4gIG5vZGU6IE5vZGU7XG59XG5cbmV4cG9ydCBjbGFzcyBHcmFwaEV4ZWN1dG9yIGltcGxlbWVudHMgRnVuY3Rpb25FeGVjdXRvciB7XG4gIHByaXZhdGUgY29tcGlsZWRNYXA6IE1hcDxzdHJpbmcsIE5vZGVbXT4gPSBuZXcgTWFwKCk7XG4gIHByaXZhdGUgX3dlaWdodE1hcDogTmFtZWRUZW5zb3JzTWFwID0ge307XG4gIHByaXZhdGUgX3dlaWdodElkczogbnVtYmVyW107XG4gIHByaXZhdGUgX3NpZ25hdHVyZTogSVNpZ25hdHVyZURlZjtcbiAgcHJpdmF0ZSBfaW5wdXRzOiBOb2RlW107XG4gIHByaXZhdGUgX291dHB1dHM6IE5vZGVbXTtcbiAgcHJpdmF0ZSBfaW5pdE5vZGVzOiBOb2RlW107ICAvLyBJbnRlcm5hbCBpbml0IG5vZGVzIHRvIHN0YXJ0IGluaXRpYWxpemF0aW9uLlxuICBwcml2YXRlIFNFUEVSQVRPUiA9ICcsJztcbiAgcHJpdmF0ZSBfZnVuY3Rpb25zOiB7W2tleTogc3RyaW5nXTogR3JhcGh9ID0ge307XG4gIHByaXZhdGUgX2Z1bmN0aW9uRXhlY3V0b3JNYXA6IHtba2V5OiBzdHJpbmddOiBGdW5jdGlvbkV4ZWN1dG9yfSA9IHt9O1xuICBwcml2YXRlIF9yZXNvdXJjZU1hbmFnZXI6IFJlc291cmNlTWFuYWdlcjtcbiAgcHJpdmF0ZSBpbnRlcm1lZGlhdGVUZW5zb3JzOiBOYW1lZFRlbnNvcnNNYXAgPSB7fTtcbiAgcHJpdmF0ZSBrZWVwSWRzOiBTZXQ8bnVtYmVyPjtcbiAgcHJpdmF0ZSB0ZW5zb3JzTWFwOiBOYW1lZFRlbnNvcnNNYXA7XG4gIHByaXZhdGUga2VlcFRlbnNvckZvckRlYnVnID0gZmFsc2U7XG5cbiAgZ2V0IHdlaWdodElkcygpOiBudW1iZXJbXSB7XG4gICAgcmV0dXJuIHRoaXMucGFyZW50ID8gdGhpcy5wYXJlbnQud2VpZ2h0SWRzIDogdGhpcy5fd2VpZ2h0SWRzO1xuICB9XG5cbiAgZ2V0IGZ1bmN0aW9uRXhlY3V0b3JNYXAoKToge1trZXk6IHN0cmluZ106IEZ1bmN0aW9uRXhlY3V0b3J9IHtcbiAgICByZXR1cm4gdGhpcy5wYXJlbnQgPyB0aGlzLnBhcmVudC5mdW5jdGlvbkV4ZWN1dG9yTWFwIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9mdW5jdGlvbkV4ZWN1dG9yTWFwO1xuICB9XG5cbiAgZ2V0IHdlaWdodE1hcCgpOiBOYW1lZFRlbnNvcnNNYXAge1xuICAgIHJldHVybiB0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LndlaWdodE1hcCA6IHRoaXMuX3dlaWdodE1hcDtcbiAgfVxuXG4gIHNldCB3ZWlnaHRNYXAod2VpZ2h0TWFwOiBOYW1lZFRlbnNvcnNNYXApIHtcbiAgICBjb25zdCB3ZWlnaHRJZHMgPSBPYmplY3Qua2V5cyh3ZWlnaHRNYXApLm1hcChcbiAgICAgICAga2V5ID0+IHdlaWdodE1hcFtrZXldLm1hcCh0ZW5zb3IgPT4gdGVuc29yLmlkKSk7XG4gICAgdGhpcy5fd2VpZ2h0SWRzID0gW10uY29uY2F0KC4uLndlaWdodElkcyk7XG4gICAgdGhpcy5fd2VpZ2h0TWFwID0gd2VpZ2h0TWFwO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldCBgUmVzb3VyY2VNYW5hZ2VyYCBzaGFyZWQgYnkgZXhlY3V0b3JzIG9mIGEgbW9kZWwuXG4gICAqIEBwYXJhbSByZXNvdXJjZU1hbmFnZXI6IGBSZXNvdXJjZU1hbmFnZXJgIG9mIHRoZSBgR3JhcGhNb2RlbGAuXG4gICAqL1xuICBzZXQgcmVzb3VyY2VNYW5hZ2VyKHJlc291cmNlTWFuYWdlcjogUmVzb3VyY2VNYW5hZ2VyKSB7XG4gICAgdGhpcy5fcmVzb3VyY2VNYW5hZ2VyID0gcmVzb3VyY2VNYW5hZ2VyO1xuICB9XG5cbiAgZ2V0IGlucHV0cygpOiBUZW5zb3JJbmZvW10ge1xuICAgIHJldHVybiB0aGlzLl9pbnB1dHMubWFwKG5vZGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbm9kZS5uYW1lLFxuICAgICAgICBzaGFwZTogbm9kZS5hdHRyUGFyYW1zWydzaGFwZSddID9cbiAgICAgICAgICAgIG5vZGUuYXR0clBhcmFtc1snc2hhcGUnXS52YWx1ZSBhcyBudW1iZXJbXSA6XG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGR0eXBlOiBub2RlLmF0dHJQYXJhbXNbJ2R0eXBlJ10gP1xuICAgICAgICAgICAgbm9kZS5hdHRyUGFyYW1zWydkdHlwZSddLnZhbHVlIGFzIERhdGFUeXBlIDpcbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBvdXRwdXRzKCk6IFRlbnNvckluZm9bXSB7XG4gICAgcmV0dXJuIHRoaXMuX291dHB1dHMubWFwKG5vZGUgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogbm9kZS5uYW1lLFxuICAgICAgICBzaGFwZTogbm9kZS5hdHRyUGFyYW1zWydzaGFwZSddID9cbiAgICAgICAgICAgIG5vZGUuYXR0clBhcmFtc1snc2hhcGUnXS52YWx1ZSBhcyBudW1iZXJbXSA6XG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIGR0eXBlOiBub2RlLmF0dHJQYXJhbXNbJ2R0eXBlJ10gP1xuICAgICAgICAgICAgbm9kZS5hdHRyUGFyYW1zWydkdHlwZSddLnZhbHVlIGFzIERhdGFUeXBlIDpcbiAgICAgICAgICAgIHVuZGVmaW5lZFxuICAgICAgfTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBpbnB1dE5vZGVzKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5faW5wdXRzLm1hcChub2RlID0+IG5vZGUuc2lnbmF0dXJlS2V5IHx8IG5vZGUubmFtZSk7XG4gIH1cblxuICBnZXQgb3V0cHV0Tm9kZXMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLl9vdXRwdXRzLm1hcCgobm9kZSkgPT4ge1xuICAgICAgY29uc3QgbmFtZSA9IG5vZGUuc2lnbmF0dXJlS2V5IHx8IG5vZGUubmFtZTtcbiAgICAgIHJldHVybiBub2RlLmRlZmF1bHRPdXRwdXQgPyAoYCR7bmFtZX06JHtub2RlLmRlZmF1bHRPdXRwdXR9YCkgOiBuYW1lO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0IGZ1bmN0aW9ucygpOiB7W2tleTogc3RyaW5nXTogSVNpZ25hdHVyZURlZn0ge1xuICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl9mdW5jdGlvbnMpLnJlZHVjZSgobWFwLCBrZXkpID0+IHtcbiAgICAgIG1hcFtrZXldID0gdGhpcy5fZnVuY3Rpb25zW2tleV0uc2lnbmF0dXJlO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCB7fSBhcyB7W2tleTogc3RyaW5nXTogSVNpZ25hdHVyZURlZn0pO1xuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSBncmFwaCBHcmFwaCB0aGUgbW9kZWwgb3IgZnVuY3Rpb24gZ3JhcGggdG8gYmUgZXhlY3V0ZWQuXG4gICAqIEBwYXJhbSBwYXJlbnQgV2hlbiBidWlsZGluZyBmdW5jdGlvbiBleGVjdG9yIHlvdSBuZWVkIHRvIHNldCB0aGUgcGFyZW50XG4gICAqIGV4ZWN1dG9yLiBTaW5jZSB0aGUgd2VpZ2h0cyBhbmQgZnVuY3Rpb24gZXhlY3V0b3IgbWFwcyBhcmUgc2V0IGF0IHBhcmFudFxuICAgKiBsZXZlbCwgdGhhdCBmdW5jdGlvbiBleGVjdXRvciBjYW4gYWNjZXNzIHRoZSBmdW5jdGlvbiBtYXBzIGFuZCB3ZWlnaHQgbWFwc1xuICAgKiB0aHJvdWdoIHRoZSBwYXJlbnQuXG4gICAqL1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGdyYXBoOiBHcmFwaCwgcHJpdmF0ZSBwYXJlbnQ/OiBHcmFwaEV4ZWN1dG9yKSB7XG4gICAgdGhpcy5fb3V0cHV0cyA9IGdyYXBoLm91dHB1dHM7XG4gICAgdGhpcy5faW5wdXRzID0gZ3JhcGguaW5wdXRzO1xuICAgIHRoaXMuX2luaXROb2RlcyA9IGdyYXBoLmluaXROb2RlcztcbiAgICB0aGlzLl9zaWduYXR1cmUgPSBncmFwaC5zaWduYXR1cmU7XG4gICAgdGhpcy5fZnVuY3Rpb25zID0gZ3JhcGguZnVuY3Rpb25zO1xuICAgIC8vIGNyZWF0ZSBzdWItZ3JhcGggZXhlY3V0b3JzXG4gICAgaWYgKGdyYXBoLmZ1bmN0aW9ucyAhPSBudWxsKSB7XG4gICAgICBPYmplY3Qua2V5cyhncmFwaC5mdW5jdGlvbnMpLmZvckVhY2gobmFtZSA9PiB7XG4gICAgICAgIHRoaXMuX2Z1bmN0aW9uRXhlY3V0b3JNYXBbbmFtZV0gPVxuICAgICAgICAgICAgbmV3IEdyYXBoRXhlY3V0b3IoZ3JhcGguZnVuY3Rpb25zW25hbWVdLCB0aGlzKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29tcGlsYXRpb25LZXkoaW5wdXRzOiBOb2RlW10sIG91dHB1dHM6IE5vZGVbXSk6IHN0cmluZyB7XG4gICAgY29uc3Qgc29ydGVkSW5wdXRzID0gaW5wdXRzLm1hcChub2RlID0+IG5vZGUubmFtZSkuc29ydCgpO1xuICAgIGNvbnN0IHNvcnRlZE91dHB1dHMgPSBvdXRwdXRzLm1hcChub2RlID0+IG5vZGUubmFtZSkuc29ydCgpO1xuICAgIHJldHVybiBzb3J0ZWRJbnB1dHMuam9pbih0aGlzLlNFUEVSQVRPUikgKyAnLS0nICtcbiAgICAgICAgc29ydGVkT3V0cHV0cy5qb2luKHRoaXMuU0VQRVJBVE9SKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb21waWxlcyB0aGUgaW5mZXJlbmNlIGdyYXBoIGFuZCByZXR1cm5zIHRoZSBtaW5pbWFsIHNldCBvZiBub2RlcyB0aGF0IGFyZVxuICAgKiByZXF1aXJlZCBmb3IgZXhlY3V0aW9uLCBpbiB0aGUgY29ycmVjdCBleGVjdXRpb24gb3JkZXIuXG4gICAqL1xuICBwcml2YXRlIGNvbXBpbGUoaW5wdXRzOiBOYW1lZFRlbnNvck1hcCwgb3V0cHV0czogTm9kZVtdKTogTm9kZVtdIHtcbiAgICBjb25zdCBleGVjdXRpb25JbmZvID1cbiAgICAgICAgZ2V0RXhlY3V0aW9uU3ViZ3JhcGgoaW5wdXRzLCBvdXRwdXRzLCB0aGlzLndlaWdodE1hcCwgdGhpcy5faW5pdE5vZGVzKTtcbiAgICBjb25zdCB7bWlzc2luZ0lucHV0cywgZHluYW1pY05vZGUsIHN5bmNJbnB1dHN9ID0gZXhlY3V0aW9uSW5mbztcbiAgICBpZiAoZHluYW1pY05vZGUgIT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGlzIGV4ZWN1dGlvbiBjb250YWlucyB0aGUgbm9kZSAnJHtkeW5hbWljTm9kZS5uYW1lfScsIHdoaWNoIGhhcyBgICtcbiAgICAgICAgICBgdGhlIGR5bmFtaWMgb3AgJyR7ZHluYW1pY05vZGUub3B9Jy4gUGxlYXNlIHVzZSBgICtcbiAgICAgICAgICBgbW9kZWwuZXhlY3V0ZUFzeW5jKCkgaW5zdGVhZC4gQWx0ZXJuYXRpdmVseSwgdG8gYXZvaWQgdGhlIGAgK1xuICAgICAgICAgIGBkeW5hbWljIG9wcywgc3BlY2lmeSB0aGUgaW5wdXRzIFske3N5bmNJbnB1dHN9XWApO1xuICAgIH1cblxuICAgIGlmIChtaXNzaW5nSW5wdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IG91dE5hbWVzID0gb3V0cHV0cy5tYXAobiA9PiBuLm5hbWUpO1xuICAgICAgY29uc3QgaW5OYW1lcyA9IE9iamVjdC5rZXlzKGlucHV0cyk7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBjb21wdXRlIHRoZSBvdXRwdXRzIFske291dE5hbWVzfV0gZnJvbSB0aGUgcHJvdmlkZWQgaW5wdXRzIGAgK1xuICAgICAgICAgIGBbJHtpbk5hbWVzfV0uIE1pc3NpbmcgdGhlIGZvbGxvd2luZyBpbnB1dHM6IFske21pc3NpbmdJbnB1dHN9XWApO1xuICAgIH1cblxuICAgIHJldHVybiBnZXROb2Rlc0luVG9wb2xvZ2ljYWxPcmRlcihcbiAgICAgICAgdGhpcy5ncmFwaCwgdGhpcy53ZWlnaHRNYXAsIGV4ZWN1dGlvbkluZm8pO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIHRoZSBpbmZlcmVuY2UgZm9yIGdpdmVuIGlucHV0IHRlbnNvcnMuXG4gICAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIG1hcCBmb3IgdGhlIG1vZGVsIGlucHV0cywga2V5ZWQgYnkgdGhlIGlucHV0IG5vZGVcbiAgICogbmFtZXMuXG4gICAqIEBwYXJhbSBvdXRwdXRzIE9wdGlvbmFsLiBvdXRwdXQgbm9kZSBuYW1lIGZyb20gdGhlIFRlbnNvcmZsb3cgbW9kZWwsIGlmXG4gICAqIG5vIG91dHB1dHMgYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgb3V0cHV0cyBvZiB0aGUgbW9kZWwgd291bGQgYmUgdXNlZC5cbiAgICogWW91IGNhbiBpbnNwZWN0IGludGVybWVkaWF0ZSBub2RlcyBvZiB0aGUgbW9kZWwgYnkgYWRkaW5nIHRoZW0gdG8gdGhlXG4gICAqIG91dHB1dHMgYXJyYXkuXG4gICAqL1xuICBleGVjdXRlKGlucHV0czogTmFtZWRUZW5zb3JNYXAsIG91dHB1dHM/OiBzdHJpbmdbXSk6IFRlbnNvcltdIHtcbiAgICBpbnB1dHMgPSB0aGlzLm1hcElucHV0cyhpbnB1dHMpO1xuICAgIGNvbnN0IG5hbWVzID0gT2JqZWN0LmtleXMoaW5wdXRzKS5zb3J0KCk7XG4gICAgdGhpcy5jaGVja0lucHV0cyhpbnB1dHMpO1xuICAgIHRoaXMuY2hlY2tJbnB1dFNoYXBlQW5kVHlwZShpbnB1dHMpO1xuICAgIG91dHB1dHMgPSB0aGlzLm1hcE91dHB1dHMob3V0cHV0cyk7XG4gICAgdGhpcy5jaGVja091dHB1dHMob3V0cHV0cyk7XG4gICAgY29uc3QgaW5wdXROb2RlcyA9XG4gICAgICAgIG5hbWVzLm1hcChuYW1lID0+IHRoaXMuZ3JhcGgubm9kZXNbcGFyc2VOb2RlTmFtZShuYW1lKVswXV0pO1xuICAgIGNvbnN0IG91dHB1dE5vZGVOYW1lcyA9IG91dHB1dHMubWFwKG5hbWUgPT4gcGFyc2VOb2RlTmFtZShuYW1lKVswXSk7XG4gICAgbGV0IG91dHB1dE5vZGVzID0gb3V0cHV0Tm9kZU5hbWVzLm1hcChuYW1lID0+IHRoaXMuZ3JhcGgubm9kZXNbbmFtZV0pO1xuICAgIHRoaXMucmVzZXRJbnRlcm1lZGlhdGVUZW5zb3JzKCk7XG4gICAgLy8gSWYgbm8gb3V0cHV0cyBhcmUgc3BlY2lmaWVkLCB0aGVuIHVzZSB0aGUgZGVmYXVsdCBvdXRwdXRzIG9mIHRoZSBtb2RlbC5cbiAgICBpZiAob3V0cHV0Tm9kZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBvdXRwdXROb2RlcyA9IHRoaXMuX291dHB1dHM7XG4gICAgfVxuXG4gICAgY29uc3QgY29tcGlsYXRpb25LZXkgPSB0aGlzLmdldENvbXBpbGF0aW9uS2V5KGlucHV0Tm9kZXMsIG91dHB1dE5vZGVzKTtcblxuICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIGNvbXBpbGVkIGdyYXBoIGNhY2hlIGNvbnRhaW5zIHRoZSBpbnB1dC5cbiAgICBsZXQgb3JkZXJlZE5vZGVzID0gdGhpcy5jb21waWxlZE1hcC5nZXQoY29tcGlsYXRpb25LZXkpO1xuICAgIGlmIChvcmRlcmVkTm9kZXMgPT0gbnVsbCkge1xuICAgICAgb3JkZXJlZE5vZGVzID0gdGhpcy5jb21waWxlKGlucHV0cywgb3V0cHV0Tm9kZXMpO1xuICAgICAgdGhpcy5jb21waWxlZE1hcC5zZXQoY29tcGlsYXRpb25LZXksIG9yZGVyZWROb2Rlcyk7XG4gICAgfVxuXG4gICAgY29uc3QgdGVuc29yQXJyYXlNYXA6IFRlbnNvckFycmF5TWFwID0ge307XG4gICAgY29uc3QgdGVuc29yTGlzdE1hcDogVGVuc29yTGlzdE1hcCA9IHt9O1xuXG4gICAgcmV0dXJuIHRpZHkoKCkgPT4ge1xuICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBFeGVjdXRpb25Db250ZXh0KFxuICAgICAgICAgIHRoaXMud2VpZ2h0TWFwLCB0ZW5zb3JBcnJheU1hcCwgdGVuc29yTGlzdE1hcCxcbiAgICAgICAgICB0aGlzLmZ1bmN0aW9uRXhlY3V0b3JNYXApO1xuICAgICAgY29uc3QgdGVuc29yc01hcDogTmFtZWRUZW5zb3JzTWFwID0gey4uLnRoaXMud2VpZ2h0TWFwfTtcblxuICAgICAgT2JqZWN0LmtleXMoaW5wdXRzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICBjb25zdCBbbm9kZU5hbWUsIGluZGV4XSA9IHBhcnNlTm9kZU5hbWUobmFtZSk7XG4gICAgICAgIGNvbnN0IHRlbnNvcnM6IFRlbnNvcltdID0gW107XG4gICAgICAgIHRlbnNvcnNbaW5kZXhdID0gaW5wdXRzW25hbWVdO1xuICAgICAgICB0ZW5zb3JzTWFwW25vZGVOYW1lXSA9IHRlbnNvcnM7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgdGVuc29yc1RvS2VlcCA9IHRoaXMuZ2V0RnJvemVuVGVuc29ySWRzKHRlbnNvcnNNYXApO1xuICAgICAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudDoge1trZXk6IG51bWJlcl06IG51bWJlcn0gPSB7fTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXJlZE5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IG5vZGUgPSBvcmRlcmVkTm9kZXNbaV07XG4gICAgICAgIGlmICghdGVuc29yc01hcFtub2RlLm5hbWVdKSB7XG4gICAgICAgICAgY29uc3QgdGVuc29ycyA9XG4gICAgICAgICAgICAgIGV4ZWN1dGVPcChub2RlLCB0ZW5zb3JzTWFwLCBjb250ZXh0LCB0aGlzLl9yZXNvdXJjZU1hbmFnZXIpIGFzXG4gICAgICAgICAgICAgIFRlbnNvcltdO1xuICAgICAgICAgIGlmICh1dGlsLmlzUHJvbWlzZSh0ZW5zb3JzKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgIGBUaGUgZXhlY3V0aW9uIG9mIHRoZSBvcCAnJHtub2RlLm9wfScgcmV0dXJuZWQgYSBwcm9taXNlLiBgICtcbiAgICAgICAgICAgICAgICBgUGxlYXNlIHVzZSBtb2RlbC5leGVjdXRlQXN5bmMoKSBpbnN0ZWFkLmApO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0ZW5zb3JzTWFwW25vZGUubmFtZV0gPSB0ZW5zb3JzO1xuICAgICAgICAgIHRoaXMuY2hlY2tUZW5zb3JGb3JEaXNwb3NhbChcbiAgICAgICAgICAgICAgbm9kZS5uYW1lLCBub2RlLCB0ZW5zb3JzTWFwLCBjb250ZXh0LCB0ZW5zb3JzVG9LZWVwLFxuICAgICAgICAgICAgICBvdXRwdXROb2RlTmFtZXMsIGludGVybWVkaWF0ZVRlbnNvckNvbnN1bWVyQ291bnQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBkaXNwb3NlIHRoZSBjb250ZXh0IGZvciB0aGUgcm9vdCBleGVjdXRvclxuICAgICAgaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHtcbiAgICAgICAgY29udGV4dC5kaXNwb3NlKHRlbnNvcnNUb0tlZXApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIG91dHB1dHMubWFwKG5hbWUgPT4gZ2V0VGVuc29yKG5hbWUsIHRlbnNvcnNNYXAsIGNvbnRleHQpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0RnJvemVuVGVuc29ySWRzKHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwKTogU2V0PG51bWJlcj4ge1xuICAgIGNvbnN0IGlkcyA9IFtdLmNvbmNhdC5hcHBseShcbiAgICAgICAgW10sXG4gICAgICAgIE9iamVjdC5rZXlzKHRlbnNvck1hcClcbiAgICAgICAgICAgIC5tYXAoa2V5ID0+IHRlbnNvck1hcFtrZXldKVxuICAgICAgICAgICAgLm1hcCh0ZW5zb3JzID0+IHRlbnNvcnMubWFwKHRlbnNvciA9PiB0ZW5zb3IuaWQpKSk7XG4gICAgcmV0dXJuIG5ldyBTZXQoaWRzKTtcbiAgfVxuICBwcml2YXRlIGNoZWNrVGVuc29yRm9yRGlzcG9zYWwoXG4gICAgICBub2RlTmFtZTogc3RyaW5nLCBub2RlOiBOb2RlLCB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCxcbiAgICAgIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIHRlbnNvcnNUb0tlZXA6IFNldDxudW1iZXI+LFxuICAgICAgb3V0cHV0TmFtZXM6IHN0cmluZ1tdLFxuICAgICAgaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudDoge1trZXk6IHN0cmluZ106IG51bWJlcn0pIHtcbiAgICAvLyBTa2lwIG91dHB1dCBub2RlcyBhbmQgYW55IGNvbnRyb2wgZmxvdyBub2Rlcywgc2luY2UgaXRzIGRlcGVuZGVuY3kgaXNcbiAgICAvLyB0cmlja3kgdG8gdHJhY2sgY29ycmVjdGx5LlxuICAgIGlmIChub2RlLmNhdGVnb3J5ID09PSAnY29udHJvbCcgfHwgb3V0cHV0TmFtZXMuaW5kZXhPZihub2RlTmFtZSkgIT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGVuc29yTWFwW25vZGVOYW1lXS5mb3JFYWNoKHRlbnNvciA9PiB7XG4gICAgICBpZiAodGVuc29yICE9IG51bGwpIHtcbiAgICAgICAgaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudFt0ZW5zb3IuaWRdID1cbiAgICAgICAgICAgIChpbnRlcm1lZGlhdGVUZW5zb3JDb25zdW1lckNvdW50W3RlbnNvci5pZF0gfHwgMCkgK1xuICAgICAgICAgICAgbm9kZS5jaGlsZHJlbi5sZW5ndGg7XG4gICAgICB9XG4gICAgfSk7XG4gICAgbm9kZS5pbnB1dHMuZm9yRWFjaChpbnB1dCA9PiB7XG4gICAgICAvLyBTa2lwIGFueSBjb250cm9sIGZsb3cgbm9kZXMsIHNpbmNlIGl0cyBkZXBlbmRlbmN5IGlzIHRyaWNreSB0byB0cmFja1xuICAgICAgLy8gY29ycmVjdGx5LlxuICAgICAgaWYgKGlucHV0LmNhdGVnb3J5ICE9PSAnY29udHJvbCcpIHtcbiAgICAgICAgY29uc3QgdGVuc29ycyA9XG4gICAgICAgICAgICBnZXRUZW5zb3JzRm9yQ3VycmVudENvbnRlbnh0KGlucHV0Lm5hbWUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgIGlmICh0ZW5zb3JzICE9IG51bGwpIHtcbiAgICAgICAgICB0ZW5zb3JzLmZvckVhY2godGVuc29yID0+IHtcbiAgICAgICAgICAgIGlmICh0ZW5zb3IgJiYgIXRlbnNvci5rZXB0ICYmICF0ZW5zb3JzVG9LZWVwLmhhcyh0ZW5zb3IuaWQpKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudFt0ZW5zb3IuaWRdO1xuICAgICAgICAgICAgICBpZiAoY291bnQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMua2VlcFRlbnNvckZvckRlYnVnKSB7XG4gICAgICAgICAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBbbm9kZU5hbWUsIGluZGV4XSA9XG4gICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9kZU5hbWVBbmRJbmRleChub2RlLm5hbWUsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaW50ZXJtZWRpYXRlVGVuc29yc1tub2RlTmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnRlcm1lZGlhdGVUZW5zb3JzW25vZGVOYW1lXVtpbmRleF0gPSB0ZW5zb3I7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmludGVybWVkaWF0ZVRlbnNvcnNbbm9kZU5hbWVdID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJtZWRpYXRlVGVuc29yc1tub2RlTmFtZV1baW5kZXhdID0gdGVuc29yO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkZWxldGUgaW50ZXJtZWRpYXRlVGVuc29yQ29uc3VtZXJDb3VudFt0ZW5zb3IuaWRdO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBvbmx5IGludGVybWVkaWF0ZSBub2RlcyBoYXMgY291bnQgc2V0LCBpbnB1dHMgYW5kIHdlaWdodHMgYXJlXG4gICAgICAgICAgICAgICAgLy8gbm90LlxuICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZVRlbnNvckNvbnN1bWVyQ291bnRbdGVuc29yLmlkXS0tO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyB0aGUgaW5mZXJlbmNlIGZvciBnaXZlbiBpbnB1dCB0ZW5zb3JzIGluIEFzeW5jIGZhc2hpb24uXG4gICAqIEBwYXJhbSBpbnB1dHMgVGVuc29yIG1hcCBmb3IgdGhlIG1vZGVsIGlucHV0cywga2V5ZWQgYnkgdGhlIGlucHV0IG5vZGVcbiAgICogbmFtZXMuXG4gICAqIEBwYXJhbSBvdXRwdXRzIG91dHB1dCBub2RlIG5hbWUgZnJvbSB0aGUgVGVuc29yZmxvdyBtb2RlbCwgaWYgbm8gb3V0cHV0c1xuICAgKiBhcmUgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBvdXRwdXRzIG9mIHRoZSBtb2RlbCB3b3VsZCBiZSB1c2VkLiBZb3UgY2FuXG4gICAqIGluc3BlY3QgaW50ZXJtZWRpYXRlIG5vZGVzIG9mIHRoZSBtb2RlbCBieSBhZGRpbmcgdGhlbSB0byB0aGUgb3V0cHV0c1xuICAgKiBhcnJheS5cbiAgICovXG4gIGFzeW5jIGV4ZWN1dGVBc3luYyhpbnB1dHM6IE5hbWVkVGVuc29yTWFwLCBvdXRwdXRzPzogc3RyaW5nW10pOlxuICAgICAgUHJvbWlzZTxUZW5zb3JbXT4ge1xuICAgIHJldHVybiB0aGlzLl9leGVjdXRlQXN5bmMoaW5wdXRzLCBvdXRwdXRzKTtcbiAgfVxuXG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JzKCkge1xuICAgIGlmICghdGhpcy5pbnRlcm1lZGlhdGVUZW5zb3JzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIE9iamVjdC5rZXlzKHRoaXMuaW50ZXJtZWRpYXRlVGVuc29ycylcbiAgICAgICAgLmZvckVhY2goXG4gICAgICAgICAgICBrZXkgPT4gdGhpcy5pbnRlcm1lZGlhdGVUZW5zb3JzW2tleV0uZm9yRWFjaChcbiAgICAgICAgICAgICAgICB0ZW5zb3IgPT4gdGVuc29yLmRpc3Bvc2UoKSkpO1xuICAgIHRoaXMuZGlzcG9zZVRlbnNvcnNNYXAoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGlzcG9zZVRlbnNvcnNNYXAoKSB7XG4gICAgaWYgKCF0aGlzLnRlbnNvcnNNYXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgT2JqZWN0LmtleXModGhpcy50ZW5zb3JzTWFwKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICBjb25zdCB0ZW5zb3JBcnJheSA9IHRoaXMudGVuc29yc01hcFtrZXldO1xuICAgICAgdGVuc29yQXJyYXkuZm9yRWFjaCh0ZW5zb3IgPT4ge1xuICAgICAgICBpZiAodGVuc29yICYmICF0ZW5zb3Iua2VwdCAmJiAhdGVuc29yLmlzRGlzcG9zZWQgJiZcbiAgICAgICAgICAgICF0aGlzLmtlZXBJZHMuaGFzKHRlbnNvci5pZCkpIHtcbiAgICAgICAgICB0ZW5zb3IuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdldEludGVybWVkaWF0ZVRlbnNvcnMoKTogTmFtZWRUZW5zb3JzTWFwIHtcbiAgICByZXR1cm4gdGhpcy50ZW5zb3JzTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNldEludGVybWVkaWF0ZVRlbnNvcnMoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5pbnRlcm1lZGlhdGVUZW5zb3JzKSB7XG4gICAgICB0aGlzLmludGVybWVkaWF0ZVRlbnNvcnNba2V5XS5mb3JFYWNoKHRlbnNvciA9PiB0ZW5zb3IuZGlzcG9zZSgpKTtcbiAgICAgIGRlbGV0ZSB0aGlzLmludGVybWVkaWF0ZVRlbnNvcnNba2V5XTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZXMgdGhlIGluZmVyZW5jZSBmb3IgZ2l2ZW4gaW5wdXQgdGVuc29ycyBpbiBBc3luYyBmYXNoaW9uLlxuICAgKiBAcGFyYW0gaW5wdXRzIFRlbnNvciBtYXAgZm9yIHRoZSBtb2RlbCBpbnB1dHMsIGtleWVkIGJ5IHRoZSBpbnB1dCBub2RlXG4gICAqIG5hbWVzLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBPcHRpb25hbC4gb3V0cHV0IG5vZGUgbmFtZSBmcm9tIHRoZSBUZW5zb3JmbG93IG1vZGVsLFxuICAgKiBpZiBubyBvdXRwdXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG91dHB1dHMgb2YgdGhlIG1vZGVsIHdvdWxkIGJlXG4gICAqIHVzZWQuIFlvdSBjYW4gaW5zcGVjdCBpbnRlcm1lZGlhdGUgbm9kZXMgb2YgdGhlIG1vZGVsIGJ5IGFkZGluZyB0aGVtIHRvIHRoZVxuICAgKiBvdXRwdXRzIGFycmF5LlxuICAgKiBAcGFyYW0gaXNGdW5jdGlvbkV4ZWN1dGlvbiBPcHRpb25hbC4gRmxhZyBmb3IgZXhlY3V0aW5nIGEgZnVuY3Rpb24uXG4gICAqIEBwYXJhbSB0ZW5zb3JBcnJheU1hcCBPcHRpb25hbCwgZ2xvYmFsIFRlbnNvckFycmF5IG1hcCBieSBpZC4gVXNlZCBmb3JcbiAgICogZnVuY3Rpb24gZXhlY3V0aW9uLlxuICAgKiBAcGFyYW0gdGVuc29yQXJyYXlNYXAgT3B0aW5hbCBnbG9iYWwgVGVuc29yTGlzdCBtYXAgYnkgaWQuIFVzZWQgZm9yXG4gICAqIGZ1bmN0aW9uIGV4ZWN1dGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgX2V4ZWN1dGVBc3luYyhcbiAgICAgIGlucHV0czogTmFtZWRUZW5zb3JNYXAsIG91dHB1dHM/OiBzdHJpbmdbXSwgaXNGdW5jdGlvbkV4ZWN1dGlvbiA9IGZhbHNlLFxuICAgICAgdGVuc29yQXJyYXlNYXA6IFRlbnNvckFycmF5TWFwID0ge30sXG4gICAgICB0ZW5zb3JMaXN0TWFwOiBUZW5zb3JMaXN0TWFwID0ge30pOiBQcm9taXNlPFRlbnNvcltdPiB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uRXhlY3V0aW9uKSB7XG4gICAgICBpbnB1dHMgPSB0aGlzLm1hcElucHV0cyhpbnB1dHMpO1xuICAgICAgdGhpcy5jaGVja0lucHV0cyhpbnB1dHMpO1xuICAgICAgdGhpcy5jaGVja0lucHV0U2hhcGVBbmRUeXBlKGlucHV0cyk7XG4gICAgICBvdXRwdXRzID0gdGhpcy5tYXBPdXRwdXRzKG91dHB1dHMpO1xuICAgICAgdGhpcy5jaGVja091dHB1dHMob3V0cHV0cyk7XG4gICAgfVxuXG4gICAgLy8gRm9yIG1vZGVsIGRlYnVnLlxuICAgIHRyeSB7XG4gICAgICB0aGlzLmtlZXBUZW5zb3JGb3JEZWJ1ZyA9IGVudigpLmdldEJvb2woJ0tFRVBfSU5URVJNRURJQVRFX1RFTlNPUlMnKTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLndhcm4oZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgdGhpcy5yZXNldEludGVybWVkaWF0ZVRlbnNvcnMoKTtcblxuICAgIGNvbnN0IGNvbnRleHQgPSBuZXcgRXhlY3V0aW9uQ29udGV4dChcbiAgICAgICAgdGhpcy53ZWlnaHRNYXAsIHRlbnNvckFycmF5TWFwLCB0ZW5zb3JMaXN0TWFwLFxuICAgICAgICB0aGlzLmZ1bmN0aW9uRXhlY3V0b3JNYXApO1xuXG4gICAgLy8gR3JhcGggd2l0aCBjb250cm9sIGZsb3cgb3AgcmVxdWlyZXMgcnVudGltZSBldmFsdWF0aW9uIG9mIHRoZSBleGVjdXRpb25cbiAgICAvLyBvcmRlciwgd2hpbGUgd2l0aG91dCBjb250cm9sIGZsb3cgdGhlIGV4ZWN1dGlvbiBvcmRlciBpcyBwcmUtZGV0ZXJtaW5lZFxuICAgIC8vIGluIHRoZSBjb21waWxlIG1ldGhvZC5cbiAgICB0aGlzLnRlbnNvcnNNYXAgPSBhd2FpdCB0aGlzLmV4ZWN1dGVXaXRoQ29udHJvbEZsb3coXG4gICAgICAgIGlucHV0cywgY29udGV4dCwgb3V0cHV0cywgaXNGdW5jdGlvbkV4ZWN1dGlvbik7XG4gICAgY29uc3QgcmVzdWx0cyA9XG4gICAgICAgIG91dHB1dHMubWFwKG5hbWUgPT4gZ2V0VGVuc29yKG5hbWUsIHRoaXMudGVuc29yc01hcCwgY29udGV4dCkpO1xuXG4gICAgLy8gZGlzcG9zZSBhbGwgdGhlIGludGVybWVkaWF0ZSB0ZW5zb3JzXG4gICAgY29uc3Qgb3V0cHV0SWRzID0gcmVzdWx0cy5tYXAodCA9PiB0LmlkKTtcbiAgICBjb25zdCBpbnB1dElkcyA9IE9iamVjdC5rZXlzKGlucHV0cykubWFwKG5hbWUgPT4gaW5wdXRzW25hbWVdLmlkKTtcbiAgICB0aGlzLmtlZXBJZHMgPVxuICAgICAgICBuZXcgU2V0PG51bWJlcj4oWy4uLm91dHB1dElkcywgLi4uaW5wdXRJZHMsIC4uLnRoaXMud2VpZ2h0SWRzXSk7XG4gICAgaWYgKCF0aGlzLmtlZXBUZW5zb3JGb3JEZWJ1Zykge1xuICAgICAgdGhpcy5kaXNwb3NlVGVuc29yc01hcCgpO1xuICAgIH1cblxuICAgIC8vIGRpc3Bvc2UgdGhlIGNvbnRleHQgZm9yIHRoZSByb290IGV4ZWN1dG9yXG4gICAgaWYgKHRoaXMucGFyZW50ID09IG51bGwpIHtcbiAgICAgIGNvbnRleHQuZGlzcG9zZSh0aGlzLmtlZXBJZHMpO1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHRzO1xuICB9XG5cbiAgYXN5bmMgZXhlY3V0ZUZ1bmN0aW9uQXN5bmMoXG4gICAgICBpbnB1dHM6IFRlbnNvcltdLCB0ZW5zb3JBcnJheU1hcDogVGVuc29yQXJyYXlNYXAsXG4gICAgICB0ZW5zb3JMaXN0TWFwOiBUZW5zb3JMaXN0TWFwKTogUHJvbWlzZTxUZW5zb3JbXT4ge1xuICAgIGNvbnN0IG1hcHBlZElucHV0cyA9IGlucHV0cy5yZWR1Y2UoKG1hcCwgdGVuc29yLCBpbmRleCkgPT4ge1xuICAgICAgbWFwW3RoaXMuaW5wdXRzW2luZGV4XS5uYW1lXSA9IHRlbnNvcjtcbiAgICAgIHJldHVybiBtYXA7XG4gICAgfSwge30gYXMgTmFtZWRUZW5zb3JNYXApO1xuXG4gICAgcmV0dXJuIHRoaXMuX2V4ZWN1dGVBc3luYyhcbiAgICAgICAgbWFwcGVkSW5wdXRzLCB0aGlzLm91dHB1dE5vZGVzLCB0cnVlLCB0ZW5zb3JBcnJheU1hcCwgdGVuc29yTGlzdE1hcCk7XG4gIH1cblxuICAvKipcbiAgICogV2hlbiB0aGVyZSBhcmUgY29udHJvbCBmbG93IG5vZGVzIGluIHRoZSBncmFwaCwgdGhlIGdyYXBoIGV4ZWN1dGlvbiB1c2VcbiAgICogRXhlY3V0aW9uQ29udGV4dCB0byBrZWVwIHRyYWNrIG9mIHRoZSBmcmFtZXMgYW5kIGxvb3AgaXRlcmF0b3JzLlxuICAgKiBAcGFyYW0gaW5wdXRzIHBsYWNlaG9sZGVyIHRlbnNvcnMgZm9yIHRoZSBncmFwaC5cbiAgICogQHBhcmFtIGNvbnRleHQgdGhlIGV4ZWN1dGlvbiBjb250ZXh0IG9iamVjdCBmb3IgY3VycmVudCBleGVjdXRpb24uXG4gICAqIEBwYXJhbSBvdXRwdXROYW1lcyBPcHRpb25hbC4gb3V0cHV0IG5vZGUgbmFtZSBmcm9tIHRoZSBUZW5zb3JmbG93IG1vZGVsLFxuICAgKiBpZiBubyBvdXRwdXRzIGFyZSBzcGVjaWZpZWQsIHRoZSBkZWZhdWx0IG91dHB1dHMgb2YgdGhlIG1vZGVsIHdvdWxkIGJlXG4gICAqIHVzZWQuIFlvdSBjYW4gaW5zcGVjdCBpbnRlcm1lZGlhdGUgbm9kZXMgb2YgdGhlIG1vZGVsIGJ5IGFkZGluZyB0aGVtIHRvIHRoZVxuICAgKiBvdXRwdXRzIGFycmF5LlxuICAgKiBAcGFyYW0gaXNGdW5jdGlvbkV4ZWN1dGlvbiBGbGFnIGZvciBleGVjdXRpbmcgYSBmdW5jdGlvbi5cbiAgICovXG4gIHByaXZhdGUgYXN5bmMgZXhlY3V0ZVdpdGhDb250cm9sRmxvdyhcbiAgICAgIGlucHV0czogTmFtZWRUZW5zb3JNYXAsIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsIG91dHB1dE5hbWVzPzogc3RyaW5nW10sXG4gICAgICBpc0Z1bmN0aW9uRXhlY3V0aW9uPzogYm9vbGVhbik6IFByb21pc2U8TmFtZWRUZW5zb3JzTWFwPiB7XG4gICAgY29uc3QgbmFtZXMgPSBPYmplY3Qua2V5cyhpbnB1dHMpO1xuICAgIGNvbnN0IGlucHV0Tm9kZXMgPVxuICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiB0aGlzLmdyYXBoLm5vZGVzW3BhcnNlTm9kZU5hbWUobmFtZSlbMF1dKTtcbiAgICBjb25zdCBvdXRwdXROb2RlTmFtZXMgPSBvdXRwdXROYW1lcy5tYXAobmFtZSA9PiBwYXJzZU5vZGVOYW1lKG5hbWUpWzBdKTtcbiAgICBsZXQgb3V0cHV0Tm9kZXMgPSBvdXRwdXROb2RlTmFtZXMubWFwKG5hbWUgPT4gdGhpcy5ncmFwaC5ub2Rlc1tuYW1lXSk7XG5cbiAgICAvLyBJZiBubyBvdXRwdXRzIGFyZSBzcGVjaWZpZWQsIHRoZW4gdXNlIHRoZSBkZWZhdWx0IG91dHB1dHMgb2YgdGhlIG1vZGVsLlxuICAgIGlmIChvdXRwdXROb2Rlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIG91dHB1dE5vZGVzID0gdGhpcy5fb3V0cHV0cztcbiAgICB9XG5cbiAgICBjb25zdCB7dXNlZE5vZGVzLCBtaXNzaW5nSW5wdXRzLCBkeW5hbWljTm9kZSwgc3luY0lucHV0c30gPVxuICAgICAgICBnZXRFeGVjdXRpb25TdWJncmFwaChcbiAgICAgICAgICAgIGlucHV0cywgb3V0cHV0Tm9kZXMsIHRoaXMud2VpZ2h0TWFwLCB0aGlzLl9pbml0Tm9kZXMpO1xuXG4gICAgLy8gRmlyc3Qgbm9kZXMgdG8gZXhlY3V0ZSBpbmNsdWRlIGlucHV0Tm9kZXMsIHdlaWdodHMsIGFuZCBpbml0Tm9kZXMuXG4gICAgY29uc3Qgc3RhY2s6IE5vZGVXaXRoQ29udGV4dHNbXSA9IFtcbiAgICAgIC4uLmlucHV0Tm9kZXMsIC4uLnRoaXMuZ3JhcGgud2VpZ2h0cywgLi4uKHRoaXMuX2luaXROb2RlcyB8fCBbXSlcbiAgICBdLm1hcChub2RlID0+IHtcbiAgICAgIHJldHVybiB7bm9kZSwgY29udGV4dHM6IGNvbnRleHQuY3VycmVudENvbnRleHR9O1xuICAgIH0pO1xuICAgIGNvbnN0IHRlbnNvcnNNYXA6IE5hbWVkVGVuc29yc01hcCA9IHsuLi50aGlzLndlaWdodE1hcH07XG4gICAgT2JqZWN0LmtleXMoaW5wdXRzKS5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgY29uc3QgW25vZGVOYW1lLCBpbmRleF0gPSBwYXJzZU5vZGVOYW1lKG5hbWUpO1xuICAgICAgY29uc3QgdGVuc29yczogVGVuc29yW10gPSBbXTtcbiAgICAgIHRlbnNvcnNbaW5kZXhdID0gaW5wdXRzW25hbWVdO1xuICAgICAgdGVuc29yc01hcFtub2RlTmFtZV0gPSB0ZW5zb3JzO1xuICAgIH0pO1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckNvbnN1bWVyQ291bnQ6IHtba2V5OiBudW1iZXJdOiBudW1iZXJ9ID0ge307XG4gICAgY29uc3QgdGVuc29yc1RvS2VlcCA9IHRoaXMuZ2V0RnJvemVuVGVuc29ySWRzKHRlbnNvcnNNYXApO1xuICAgIGNvbnN0IGFkZGVkOiB7W2tleTogc3RyaW5nXTogYm9vbGVhbn0gPSB7fTtcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgcHJvbWlzZXMgPSB0aGlzLnByb2Nlc3NTdGFjayhcbiAgICAgICAgICBpbnB1dE5vZGVzLCBzdGFjaywgY29udGV4dCwgdGVuc29yc01hcCwgYWRkZWQsIHRlbnNvcnNUb0tlZXAsXG4gICAgICAgICAgb3V0cHV0Tm9kZU5hbWVzLCBpbnRlcm1lZGlhdGVUZW5zb3JDb25zdW1lckNvdW50LCB1c2VkTm9kZXMpO1xuICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocHJvbWlzZXMpO1xuICAgIH1cbiAgICBpZiAoZHluYW1pY05vZGUgPT0gbnVsbCAmJiAhaXNGdW5jdGlvbkV4ZWN1dGlvbikge1xuICAgICAgY29uc29sZS53YXJuKFxuICAgICAgICAgIGBUaGlzIG1vZGVsIGV4ZWN1dGlvbiBkaWQgbm90IGNvbnRhaW4gYW55IG5vZGVzIHdpdGggY29udHJvbCBmbG93IGAgK1xuICAgICAgICAgIGBvciBkeW5hbWljIG91dHB1dCBzaGFwZXMuIFlvdSBjYW4gdXNlIG1vZGVsLmV4ZWN1dGUoKSBpbnN0ZWFkLmApO1xuICAgIH1cbiAgICBjb25zdCBtaXNzaW5nT3V0cHV0cyA9XG4gICAgICAgIG91dHB1dE5vZGVzXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAgIG5vZGUgPT4gIWlzQ29udHJvbEZsb3cobm9kZSkgJiZcbiAgICAgICAgICAgICAgICAgICAgIWdldFRlbnNvcihub2RlLm5hbWUsIHRlbnNvcnNNYXAsIGNvbnRleHQpKVxuICAgICAgICAgICAgLm1hcChub2RlID0+IG5vZGUubmFtZSk7XG4gICAgaWYgKG1pc3NpbmdPdXRwdXRzLmxlbmd0aCA+IDApIHtcbiAgICAgIGxldCBhbHRlcm5hdGl2ZU1zZyA9ICcnO1xuICAgICAgaWYgKGR5bmFtaWNOb2RlICE9IG51bGwpIHtcbiAgICAgICAgYWx0ZXJuYXRpdmVNc2cgPVxuICAgICAgICAgICAgYEFsdGVybmF0aXZlbHksIHRvIGF2b2lkIHRoZSBkeW5hbWljIG9wcywgdXNlIG1vZGVsLmV4ZWN1dGUoKSBgICtcbiAgICAgICAgICAgIGBhbmQgc3BlY2lmeSB0aGUgaW5wdXRzIFske3N5bmNJbnB1dHN9XWA7XG4gICAgICB9XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYENhbm5vdCBjb21wdXRlIHRoZSBvdXRwdXRzIFske21pc3NpbmdPdXRwdXRzfV0gZnJvbSB0aGUgcHJvdmlkZWQgYCArXG4gICAgICAgICAgYGlucHV0cyBbJHtuYW1lc31dLiBDb25zaWRlciBwcm92aWRpbmcgdGhlIGZvbGxvd2luZyBpbnB1dHM6IGAgK1xuICAgICAgICAgIGBbJHttaXNzaW5nSW5wdXRzfV0uICR7YWx0ZXJuYXRpdmVNc2d9YCk7XG4gICAgfVxuICAgIHJldHVybiB0ZW5zb3JzTWFwO1xuICB9XG5cbiAgcHJpdmF0ZSBwcm9jZXNzU3RhY2soXG4gICAgICBpbnB1dE5vZGVzOiBOb2RlW10sIHN0YWNrOiBOb2RlV2l0aENvbnRleHRzW10sIGNvbnRleHQ6IEV4ZWN1dGlvbkNvbnRleHQsXG4gICAgICB0ZW5zb3JNYXA6IE5hbWVkVGVuc29yc01hcCwgYWRkZWQ6IHtba2V5OiBzdHJpbmddOiBib29sZWFufSxcbiAgICAgIHRlbnNvcnNUb0tlZXA6IFNldDxudW1iZXI+LCBvdXRwdXROYW1lczogc3RyaW5nW10sXG4gICAgICBpbnRlcm1lZGlhdGVUZW5zb3JDb25zdW1lckNvdW50OiB7W2tleTogbnVtYmVyXTogbnVtYmVyfSxcbiAgICAgIHVzZWROb2RlczogU2V0PHN0cmluZz4pIHtcbiAgICBjb25zdCBwcm9taXNlczogQXJyYXk8UHJvbWlzZTxUZW5zb3JbXT4+ID0gW107XG4gICAgd2hpbGUgKHN0YWNrLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBzdGFjay5wb3AoKTtcbiAgICAgIGNvbnRleHQuY3VycmVudENvbnRleHQgPSBpdGVtLmNvbnRleHRzO1xuICAgICAgbGV0IG5vZGVOYW1lID0gJyc7XG4gICAgICAvLyBUaGUgdGVuc29yIG9mIHRoZSBFbnRlciBvcCB3aXRoIGlzQ29uc3RhbnQgc2V0IHNob3VsZCBiZSBzZXRcbiAgICAgIC8vIGluIHRoZSBwYXJlbnQgc2NvcGUsIHNvIGl0IHdpbGwgYmUgYXZhaWxhYmxlIGFzIGNvbnN0YW50IGZvciB0aGVcbiAgICAgIC8vIHdob2xlIGxvb3AuXG4gICAgICBpZiAoaXRlbS5ub2RlLm9wID09PSAnRW50ZXInICYmXG4gICAgICAgICAgZ2V0UGFyYW1WYWx1ZSgnaXNDb25zdGFudCcsIGl0ZW0ubm9kZSwgdGVuc29yTWFwLCBjb250ZXh0KSkge1xuICAgICAgICBbbm9kZU5hbWVdID0gZ2V0Tm9kZU5hbWVBbmRJbmRleChpdGVtLm5vZGUubmFtZSwgY29udGV4dCk7XG4gICAgICB9XG5cbiAgICAgIC8vIG9ubHkgcHJvY2VzcyBub2RlcyB0aGF0IGFyZSBub3QgaW4gdGhlIHRlbnNvck1hcCB5ZXQsIHRoaXMgaW5jbHVkZVxuICAgICAgLy8gaW5wdXROb2RlcyBhbmQgaW50ZXJuYWwgaW5pdE5vZGVzLlxuICAgICAgaWYgKHRlbnNvck1hcFtpdGVtLm5vZGUubmFtZV0gPT0gbnVsbCkge1xuICAgICAgICBjb25zdCB0ZW5zb3JzID1cbiAgICAgICAgICAgIGV4ZWN1dGVPcChpdGVtLm5vZGUsIHRlbnNvck1hcCwgY29udGV4dCwgdGhpcy5fcmVzb3VyY2VNYW5hZ2VyKTtcbiAgICAgICAgaWYgKCFub2RlTmFtZSkge1xuICAgICAgICAgIFtub2RlTmFtZV0gPSBnZXROb2RlTmFtZUFuZEluZGV4KGl0ZW0ubm9kZS5uYW1lLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjdXJyZW50Q29udGV4dCA9IGNvbnRleHQuY3VycmVudENvbnRleHQ7XG4gICAgICAgIGlmICh1dGlsLmlzUHJvbWlzZSh0ZW5zb3JzKSkge1xuICAgICAgICAgIHByb21pc2VzLnB1c2godGVuc29ycy50aGVuKHQgPT4ge1xuICAgICAgICAgICAgdGVuc29yTWFwW25vZGVOYW1lXSA9IHQ7XG4gICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRDb250ZXh0ID0gY3VycmVudENvbnRleHQ7XG4gICAgICAgICAgICB0aGlzLmNoZWNrVGVuc29yRm9yRGlzcG9zYWwoXG4gICAgICAgICAgICAgICAgbm9kZU5hbWUsIGl0ZW0ubm9kZSwgdGVuc29yTWFwLCBjb250ZXh0LCB0ZW5zb3JzVG9LZWVwLFxuICAgICAgICAgICAgICAgIG91dHB1dE5hbWVzLCBpbnRlcm1lZGlhdGVUZW5zb3JDb25zdW1lckNvdW50KTtcbiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NoaWxkTm9kZXMoXG4gICAgICAgICAgICAgICAgaXRlbS5ub2RlLCBzdGFjaywgY29udGV4dCwgdGVuc29yTWFwLCBhZGRlZCwgdXNlZE5vZGVzKTtcbiAgICAgICAgICAgIHJldHVybiB0O1xuICAgICAgICAgIH0pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0ZW5zb3JNYXBbbm9kZU5hbWVdID0gdGVuc29ycztcbiAgICAgICAgICB0aGlzLmNoZWNrVGVuc29yRm9yRGlzcG9zYWwoXG4gICAgICAgICAgICAgIG5vZGVOYW1lLCBpdGVtLm5vZGUsIHRlbnNvck1hcCwgY29udGV4dCwgdGVuc29yc1RvS2VlcCxcbiAgICAgICAgICAgICAgb3V0cHV0TmFtZXMsIGludGVybWVkaWF0ZVRlbnNvckNvbnN1bWVyQ291bnQpO1xuICAgICAgICAgIHRoaXMucHJvY2Vzc0NoaWxkTm9kZXMoXG4gICAgICAgICAgICAgIGl0ZW0ubm9kZSwgc3RhY2ssIGNvbnRleHQsIHRlbnNvck1hcCwgYWRkZWQsIHVzZWROb2Rlcyk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0NoaWxkTm9kZXMoXG4gICAgICAgICAgICBpdGVtLm5vZGUsIHN0YWNrLCBjb250ZXh0LCB0ZW5zb3JNYXAsIGFkZGVkLCB1c2VkTm9kZXMpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcHJvbWlzZXM7XG4gIH1cblxuICBwcml2YXRlIHByb2Nlc3NDaGlsZE5vZGVzKFxuICAgICAgbm9kZTogTm9kZSwgc3RhY2s6IE5vZGVXaXRoQ29udGV4dHNbXSwgY29udGV4dDogRXhlY3V0aW9uQ29udGV4dCxcbiAgICAgIHRlbnNvck1hcDogTmFtZWRUZW5zb3JzTWFwLCBhZGRlZDoge1trZXk6IHN0cmluZ106IGJvb2xlYW59LFxuICAgICAgdXNlZE5vZGVzOiBTZXQ8c3RyaW5nPikge1xuICAgIG5vZGUuY2hpbGRyZW4uZm9yRWFjaCgoY2hpbGROb2RlKSA9PiB7XG4gICAgICBjb25zdCBbbm9kZU5hbWUsIF0gPSBnZXROb2RlTmFtZUFuZEluZGV4KGNoaWxkTm9kZS5uYW1lLCBjb250ZXh0KTtcbiAgICAgIGlmIChhZGRlZFtub2RlTmFtZV0gfHwgIXVzZWROb2Rlcy5oYXMoY2hpbGROb2RlLm5hbWUpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIE1lcmdlIG9wIGNhbiBiZSBwdXNoZWQgaWYgYW55IG9mIGl0cyBpbnB1dHMgaGFzIHZhbHVlLlxuICAgICAgaWYgKGNoaWxkTm9kZS5vcCA9PT0gJ01lcmdlJykge1xuICAgICAgICBpZiAoY2hpbGROb2RlLmlucHV0TmFtZXMuc29tZShuYW1lID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuICEhZ2V0VGVuc29yKG5hbWUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgICAgICB9KSkge1xuICAgICAgICAgIGFkZGVkW25vZGVOYW1lXSA9IHRydWU7XG4gICAgICAgICAgc3RhY2sucHVzaCh7Y29udGV4dHM6IGNvbnRleHQuY3VycmVudENvbnRleHQsIG5vZGU6IGNoaWxkTm9kZX0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgIC8vIE90aGVyd2lzZSBhbGwgaW5wdXRzIG11c3QgdG8gaGF2ZSB2YWx1ZS5cbiAgICAgICAgICBpZiAoY2hpbGROb2RlLmlucHV0TmFtZXMuZXZlcnkobmFtZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICEhZ2V0VGVuc29yKG5hbWUsIHRlbnNvck1hcCwgY29udGV4dCk7XG4gICAgICAgICAgICAgIH0pKSB7XG4gICAgICAgIGFkZGVkW25vZGVOYW1lXSA9IHRydWU7XG4gICAgICAgIHN0YWNrLnB1c2goe2NvbnRleHRzOiBjb250ZXh0LmN1cnJlbnRDb250ZXh0LCBub2RlOiBjaGlsZE5vZGV9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIHdlaWdodCB0ZW5zb3JzLlxuICAgKi9cbiAgZGlzcG9zZSgpIHtcbiAgICBPYmplY3Qua2V5cyh0aGlzLndlaWdodE1hcClcbiAgICAgICAgLmZvckVhY2goXG4gICAgICAgICAgICBrZXkgPT4gdGhpcy53ZWlnaHRNYXBba2V5XS5mb3JFYWNoKHRlbnNvciA9PiB0ZW5zb3IuZGlzcG9zZSgpKSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW5wdXRTaGFwZUFuZFR5cGUoaW5wdXRzOiBOYW1lZFRlbnNvck1hcCkge1xuICAgIE9iamVjdC5rZXlzKGlucHV0cykuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IGlucHV0ID0gaW5wdXRzW25hbWVdO1xuICAgICAgY29uc3QgW25vZGVOYW1lLCBdID0gcGFyc2VOb2RlTmFtZShuYW1lKTtcbiAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmdyYXBoLm5vZGVzW25vZGVOYW1lXTtcbiAgICAgIGlmIChub2RlLmF0dHJQYXJhbXNbJ3NoYXBlJ10gJiYgbm9kZS5hdHRyUGFyYW1zWydzaGFwZSddLnZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHNoYXBlID0gbm9kZS5hdHRyUGFyYW1zWydzaGFwZSddLnZhbHVlIGFzIG51bWJlcltdO1xuICAgICAgICBjb25zdCBtYXRjaCA9IHNoYXBlLmxlbmd0aCA9PT0gaW5wdXQuc2hhcGUubGVuZ3RoICYmXG4gICAgICAgICAgICBpbnB1dC5zaGFwZS5ldmVyeShcbiAgICAgICAgICAgICAgICAoZGltLCBpbmRleCkgPT4gc2hhcGVbaW5kZXhdID09PSAtMSB8fCBzaGFwZVtpbmRleF0gPT09IGRpbSk7XG4gICAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgICAgbWF0Y2gsXG4gICAgICAgICAgICAoKSA9PiBgVGhlIHNoYXBlIG9mIGRpY3RbJyR7bm9kZS5uYW1lfSddIHByb3ZpZGVkIGluIGAgK1xuICAgICAgICAgICAgICAgIGBtb2RlbC5leGVjdXRlKGRpY3QpIG11c3QgYmUgWyR7c2hhcGV9XSwgYnV0IHdhcyBgICtcbiAgICAgICAgICAgICAgICBgWyR7aW5wdXQuc2hhcGV9XWApO1xuICAgICAgfVxuICAgICAgaWYgKG5vZGUuYXR0clBhcmFtc1snZHR5cGUnXSAmJiBub2RlLmF0dHJQYXJhbXNbJ2R0eXBlJ10udmFsdWUpIHtcbiAgICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgICBpbnB1dC5kdHlwZSA9PT0gbm9kZS5hdHRyUGFyYW1zWydkdHlwZSddLnZhbHVlIGFzIHN0cmluZyxcbiAgICAgICAgICAgICgpID0+IGBUaGUgZHR5cGUgb2YgZGljdFsnJHtub2RlLm5hbWV9J10gcHJvdmlkZWQgaW4gYCArXG4gICAgICAgICAgICAgICAgYG1vZGVsLmV4ZWN1dGUoZGljdCkgbXVzdCBiZSBgICtcbiAgICAgICAgICAgICAgICBgJHtub2RlLmF0dHJQYXJhbXNbJ2R0eXBlJ10udmFsdWV9LCBidXQgd2FzICR7aW5wdXQuZHR5cGV9YCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIG1hcElucHV0cyhpbnB1dHM6IE5hbWVkVGVuc29yTWFwKSB7XG4gICAgY29uc3QgcmVzdWx0OiBOYW1lZFRlbnNvck1hcCA9IHt9O1xuICAgIGZvciAoY29uc3QgaW5wdXROYW1lIGluIGlucHV0cykge1xuICAgICAgaWYgKHRoaXMuX3NpZ25hdHVyZSAhPSBudWxsICYmIHRoaXMuX3NpZ25hdHVyZS5pbnB1dHMgIT0gbnVsbCAmJlxuICAgICAgICAgIHRoaXMuX3NpZ25hdHVyZS5pbnB1dHNbaW5wdXROYW1lXSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRlbnNvciA9IHRoaXMuX3NpZ25hdHVyZS5pbnB1dHNbaW5wdXROYW1lXTtcbiAgICAgICAgcmVzdWx0W3RlbnNvci5uYW1lXSA9IGlucHV0c1tpbnB1dE5hbWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0W2lucHV0TmFtZV0gPSBpbnB1dHNbaW5wdXROYW1lXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tJbnB1dHMoaW5wdXRzOiBOYW1lZFRlbnNvck1hcCkge1xuICAgIGNvbnN0IG5vdEluR3JhcGggPSBPYmplY3Qua2V5cyhpbnB1dHMpLmZpbHRlcihuYW1lID0+IHtcbiAgICAgIGNvbnN0IFtub2RlTmFtZV0gPSBwYXJzZU5vZGVOYW1lKG5hbWUpO1xuICAgICAgcmV0dXJuIHRoaXMuZ3JhcGgubm9kZXNbbm9kZU5hbWVdID09IG51bGw7XG4gICAgfSk7XG4gICAgaWYgKG5vdEluR3JhcGgubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgZGljdCBwcm92aWRlZCBpbiBtb2RlbC5leGVjdXRlKGRpY3QpIGhhcyBgICtcbiAgICAgICAgICBga2V5czogWyR7bm90SW5HcmFwaH1dIHRoYXQgYXJlIG5vdCBwYXJ0IG9mIGdyYXBoYCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBtYXBPdXRwdXRzKG91dHB1dHM6IHN0cmluZ1tdKSB7XG4gICAgcmV0dXJuIG91dHB1dHMubWFwKG5hbWUgPT4ge1xuICAgICAgaWYgKHRoaXMuX3NpZ25hdHVyZSAhPSBudWxsICYmIHRoaXMuX3NpZ25hdHVyZS5vdXRwdXRzICE9IG51bGwgJiZcbiAgICAgICAgICB0aGlzLl9zaWduYXR1cmUub3V0cHV0c1tuYW1lXSAhPSBudWxsKSB7XG4gICAgICAgIGNvbnN0IHRlbnNvciA9IHRoaXMuX3NpZ25hdHVyZS5vdXRwdXRzW25hbWVdO1xuICAgICAgICByZXR1cm4gdGVuc29yLm5hbWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LCB7fSk7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrT3V0cHV0cyhvdXRwdXRzOiBzdHJpbmdbXSk6IHZvaWQge1xuICAgIG91dHB1dHMuZm9yRWFjaChuYW1lID0+IHtcbiAgICAgIGNvbnN0IFtub3JtYWxpemVkTmFtZV0gPSBwYXJzZU5vZGVOYW1lKG5hbWUpO1xuICAgICAgaWYgKCF0aGlzLmdyYXBoLm5vZGVzW25vcm1hbGl6ZWROYW1lXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBvdXRwdXQgJyR7bmFtZX0nIGlzIG5vdCBmb3VuZCBpbiB0aGUgZ3JhcGhgKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxufVxuIl19","/**\n * Contains global resources of a model.\n */\nexport class ResourceManager {\n    constructor(hashTableNameToHandle = {}, hashTableMap = {}) {\n        this.hashTableNameToHandle = hashTableNameToHandle;\n        this.hashTableMap = hashTableMap;\n    }\n    /**\n     * Register a `HashTable` in the resource manager.\n     *\n     * The `HashTable` can be retrieved by `resourceManager.getHashTableById`,\n     * where id is the table handle tensor's id.\n     *\n     * @param name Op node name that creates the `HashTable`.\n     * @param hashTable The `HashTable` to be added to resource manager.\n     */\n    addHashTable(name, hashTable) {\n        this.hashTableNameToHandle[name] = hashTable.handle;\n        this.hashTableMap[hashTable.id] = hashTable;\n    }\n    /**\n     * Get the table handle by node name.\n     * @param name Op node name that creates the `HashTable`. This name is also\n     *     used in the inputs list of lookup and import `HashTable` ops.\n     */\n    getHashTableHandleByName(name) {\n        return this.hashTableNameToHandle[name];\n    }\n    /**\n     * Get the actual `HashTable` by its handle tensor's id.\n     * @param id The id of the handle tensor.\n     */\n    getHashTableById(id) {\n        return this.hashTableMap[id];\n    }\n    /**\n     * Dispose `ResourceManager`, including its hashTables and tensors in them.\n     */\n    dispose() {\n        for (const key in this.hashTableMap) {\n            this.hashTableMap[key].clearAndClose();\n            delete this.hashTableMap[key];\n        }\n        for (const name in this.hashTableNameToHandle) {\n            this.hashTableNameToHandle[name].dispose();\n            delete this.hashTableNameToHandle[name];\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2VfbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtY29udmVydGVyL3NyYy9leGVjdXRvci9yZXNvdXJjZV9tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQW1CQTs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBQzFCLFlBQ2Esd0JBQXdDLEVBQUUsRUFDMUMsZUFBNkIsRUFBRTtRQUQvQiwwQkFBcUIsR0FBckIscUJBQXFCLENBQXFCO1FBQzFDLGlCQUFZLEdBQVosWUFBWSxDQUFtQjtJQUFHLENBQUM7SUFFaEQ7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLENBQUMsSUFBWSxFQUFFLFNBQW9CO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ3BELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILHdCQUF3QixDQUFDLElBQVk7UUFDbkMsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNILGdCQUFnQixDQUFDLEVBQVU7UUFDekIsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNILE9BQU87UUFDTCxLQUFLLE1BQU0sR0FBRyxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDbkMsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QyxPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDL0I7UUFFRCxLQUFLLE1BQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxxQkFBcUIsRUFBRTtZQUM3QyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDM0MsT0FBTyxJQUFJLENBQUMscUJBQXFCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDekM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0hhc2hUYWJsZU1hcCwgTmFtZWRUZW5zb3JNYXB9IGZyb20gJy4uL2RhdGEvdHlwZXMnO1xuaW1wb3J0IHtIYXNoVGFibGV9IGZyb20gJy4vaGFzaF90YWJsZSc7XG5cbi8qKlxuICogQ29udGFpbnMgZ2xvYmFsIHJlc291cmNlcyBvZiBhIG1vZGVsLlxuICovXG5leHBvcnQgY2xhc3MgUmVzb3VyY2VNYW5hZ2VyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgICByZWFkb25seSBoYXNoVGFibGVOYW1lVG9IYW5kbGU6IE5hbWVkVGVuc29yTWFwID0ge30sXG4gICAgICByZWFkb25seSBoYXNoVGFibGVNYXA6IEhhc2hUYWJsZU1hcCA9IHt9KSB7fVxuXG4gIC8qKlxuICAgKiBSZWdpc3RlciBhIGBIYXNoVGFibGVgIGluIHRoZSByZXNvdXJjZSBtYW5hZ2VyLlxuICAgKlxuICAgKiBUaGUgYEhhc2hUYWJsZWAgY2FuIGJlIHJldHJpZXZlZCBieSBgcmVzb3VyY2VNYW5hZ2VyLmdldEhhc2hUYWJsZUJ5SWRgLFxuICAgKiB3aGVyZSBpZCBpcyB0aGUgdGFibGUgaGFuZGxlIHRlbnNvcidzIGlkLlxuICAgKlxuICAgKiBAcGFyYW0gbmFtZSBPcCBub2RlIG5hbWUgdGhhdCBjcmVhdGVzIHRoZSBgSGFzaFRhYmxlYC5cbiAgICogQHBhcmFtIGhhc2hUYWJsZSBUaGUgYEhhc2hUYWJsZWAgdG8gYmUgYWRkZWQgdG8gcmVzb3VyY2UgbWFuYWdlci5cbiAgICovXG4gIGFkZEhhc2hUYWJsZShuYW1lOiBzdHJpbmcsIGhhc2hUYWJsZTogSGFzaFRhYmxlKSB7XG4gICAgdGhpcy5oYXNoVGFibGVOYW1lVG9IYW5kbGVbbmFtZV0gPSBoYXNoVGFibGUuaGFuZGxlO1xuICAgIHRoaXMuaGFzaFRhYmxlTWFwW2hhc2hUYWJsZS5pZF0gPSBoYXNoVGFibGU7XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSB0YWJsZSBoYW5kbGUgYnkgbm9kZSBuYW1lLlxuICAgKiBAcGFyYW0gbmFtZSBPcCBub2RlIG5hbWUgdGhhdCBjcmVhdGVzIHRoZSBgSGFzaFRhYmxlYC4gVGhpcyBuYW1lIGlzIGFsc29cbiAgICogICAgIHVzZWQgaW4gdGhlIGlucHV0cyBsaXN0IG9mIGxvb2t1cCBhbmQgaW1wb3J0IGBIYXNoVGFibGVgIG9wcy5cbiAgICovXG4gIGdldEhhc2hUYWJsZUhhbmRsZUJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gdGhpcy5oYXNoVGFibGVOYW1lVG9IYW5kbGVbbmFtZV07XG4gIH1cblxuICAvKipcbiAgICogR2V0IHRoZSBhY3R1YWwgYEhhc2hUYWJsZWAgYnkgaXRzIGhhbmRsZSB0ZW5zb3IncyBpZC5cbiAgICogQHBhcmFtIGlkIFRoZSBpZCBvZiB0aGUgaGFuZGxlIHRlbnNvci5cbiAgICovXG4gIGdldEhhc2hUYWJsZUJ5SWQoaWQ6IG51bWJlcik6IEhhc2hUYWJsZSB7XG4gICAgcmV0dXJuIHRoaXMuaGFzaFRhYmxlTWFwW2lkXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIGBSZXNvdXJjZU1hbmFnZXJgLCBpbmNsdWRpbmcgaXRzIGhhc2hUYWJsZXMgYW5kIHRlbnNvcnMgaW4gdGhlbS5cbiAgICovXG4gIGRpc3Bvc2UoKSB7XG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5oYXNoVGFibGVNYXApIHtcbiAgICAgIHRoaXMuaGFzaFRhYmxlTWFwW2tleV0uY2xlYXJBbmRDbG9zZSgpO1xuICAgICAgZGVsZXRlIHRoaXMuaGFzaFRhYmxlTWFwW2tleV07XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBuYW1lIGluIHRoaXMuaGFzaFRhYmxlTmFtZVRvSGFuZGxlKSB7XG4gICAgICB0aGlzLmhhc2hUYWJsZU5hbWVUb0hhbmRsZVtuYW1lXS5kaXNwb3NlKCk7XG4gICAgICBkZWxldGUgdGhpcy5oYXNoVGFibGVOYW1lVG9IYW5kbGVbbmFtZV07XG4gICAgfVxuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { io, Tensor, util } from '@tensorflow/tfjs-core';\nimport { OperationMapper } from '../operations/operation_mapper';\nimport { GraphExecutor } from './graph_executor';\nimport { ResourceManager } from './resource_manager';\nexport const TFHUB_SEARCH_PARAM = '?tfjs-format=file';\nexport const DEFAULT_MODEL_NAME = 'model.json';\n/**\n * A `tf.GraphModel` is a directed, acyclic graph built from a\n * SavedModel GraphDef and allows inference execution.\n *\n * A `tf.GraphModel` can only be created by loading from a model converted from\n * a [TensorFlow SavedModel](https://www.tensorflow.org/guide/saved_model) using\n * the command line converter tool and loaded via `tf.loadGraphModel`.\n *\n * @doc {heading: 'Models', subheading: 'Classes'}\n */\nexport class GraphModel {\n    /**\n     * @param modelUrl url for the model, or an `io.IOHandler`.\n     * @param weightManifestUrl url for the weight file generated by\n     * scripts/convert.py script.\n     * @param requestOption options for Request, which allows to send credentials\n     * and custom headers.\n     * @param onProgress Optional, progress callback function, fired periodically\n     * before the load is completed.\n     */\n    constructor(modelUrl, loadOptions = {}, tfio = io) {\n        this.modelUrl = modelUrl;\n        this.loadOptions = loadOptions;\n        this.version = 'n/a';\n        this.io = tfio;\n        if (loadOptions == null) {\n            this.loadOptions = {};\n        }\n        this.resourceManager = new ResourceManager();\n    }\n    // Returns the version information for the tensorflow model GraphDef.\n    get modelVersion() {\n        return this.version;\n    }\n    get inputNodes() {\n        return this.executor.inputNodes;\n    }\n    get outputNodes() {\n        return this.executor.outputNodes;\n    }\n    get inputs() {\n        return this.executor.inputs;\n    }\n    get outputs() {\n        return this.executor.outputs;\n    }\n    get weights() {\n        return this.executor.weightMap;\n    }\n    get metadata() {\n        return this.artifacts.userDefinedMetadata;\n    }\n    get modelSignature() {\n        return this.signature;\n    }\n    get modelStructuredOutputKeys() {\n        return this.structuredOutputKeys;\n    }\n    findIOHandler() {\n        const path = this.modelUrl;\n        if (path.load != null) {\n            // Path is an IO Handler.\n            this.handler = path;\n        }\n        else if (this.loadOptions.requestInit != null) {\n            this.handler = this.io.browserHTTPRequest(path, this.loadOptions);\n        }\n        else {\n            const handlers = this.io.getLoadHandlers(path, this.loadOptions);\n            if (handlers.length === 0) {\n                // For backward compatibility: if no load handler can be found,\n                // assume it is a relative http path.\n                handlers.push(this.io.browserHTTPRequest(path, this.loadOptions));\n            }\n            else if (handlers.length > 1) {\n                throw new Error(`Found more than one (${handlers.length}) load handlers for ` +\n                    `URL '${[path]}'`);\n            }\n            this.handler = handlers[0];\n        }\n    }\n    /**\n     * Loads the model and weight files, construct the in memory weight map and\n     * compile the inference graph.\n     */\n    load() {\n        this.findIOHandler();\n        if (this.handler.load == null) {\n            throw new Error('Cannot proceed with model loading because the IOHandler provided ' +\n                'does not have the `load` method implemented.');\n        }\n        const loadResult = this.handler.load();\n        if (util.isPromise(loadResult)) {\n            return loadResult.then(artifacts => this.loadSync(artifacts));\n        }\n        return this.loadSync(loadResult);\n    }\n    /**\n     * Synchronously construct the in memory weight map and\n     * compile the inference graph. Also initialize hashtable if any.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n     */\n    loadSync(artifacts) {\n        this.artifacts = artifacts;\n        const graph = this.artifacts.modelTopology;\n        let signature = this.artifacts.signature;\n        if (this.artifacts.userDefinedMetadata != null) {\n            const metadata = this.artifacts.userDefinedMetadata;\n            if (metadata.signature != null) {\n                signature = metadata.signature;\n            }\n            if (metadata.structuredOutputKeys != null) {\n                this.structuredOutputKeys = metadata.structuredOutputKeys;\n            }\n        }\n        this.signature = signature;\n        this.version = `${graph.versions.producer}.${graph.versions.minConsumer}`;\n        const weightMap = this.io.decodeWeights(this.artifacts.weightData, this.artifacts.weightSpecs);\n        this.executor = new GraphExecutor(OperationMapper.Instance.transformGraph(graph, this.signature));\n        this.executor.weightMap = this.convertTensorMapToTensorsMap(weightMap);\n        // Attach a model-level resourceManager to each executor to share resources,\n        // such as `HashTable`.\n        this.executor.resourceManager = this.resourceManager;\n        if (artifacts.modelInitializer != null &&\n            artifacts.modelInitializer.node != null) {\n            const initializer = OperationMapper.Instance.transformGraph(artifacts.modelInitializer);\n            this.initializer = new GraphExecutor(initializer);\n            this.initializer.weightMap = this.executor.weightMap;\n            // Attach a model-level resourceManager to the initializer, the\n            // hashTables created from when executing the initializer will be stored\n            // in the resourceManager.\n            this.initializer.resourceManager = this.resourceManager;\n            this.initializer.executeAsync({}, []);\n        }\n        return true;\n    }\n    /**\n     * Save the configuration and/or weights of the GraphModel.\n     *\n     * An `IOHandler` is an object that has a `save` method of the proper\n     * signature defined. The `save` method manages the storing or\n     * transmission of serialized data (\"artifacts\") that represent the\n     * model's topology and weights onto or via a specific medium, such as\n     * file downloads, local storage, IndexedDB in the web browser and HTTP\n     * requests to a server. TensorFlow.js provides `IOHandler`\n     * implementations for a number of frequently used saving mediums, such as\n     * `tf.io.browserDownloads` and `tf.io.browserLocalStorage`. See `tf.io`\n     * for more details.\n     *\n     * This method also allows you to refer to certain types of `IOHandler`s\n     * as URL-like string shortcuts, such as 'localstorage://' and\n     * 'indexeddb://'.\n     *\n     * Example 1: Save `model`'s topology and weights to browser [local\n     * storage](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage);\n     * then load it back.\n     *\n     * ```js\n     * const modelUrl =\n     *    'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json';\n     * const model = await tf.loadGraphModel(modelUrl);\n     * const zeros = tf.zeros([1, 224, 224, 3]);\n     * model.predict(zeros).print();\n     *\n     * const saveResults = await model.save('localstorage://my-model-1');\n     *\n     * const loadedModel = await tf.loadGraphModel('localstorage://my-model-1');\n     * console.log('Prediction from loaded model:');\n     * model.predict(zeros).print();\n     * ```\n     *\n     * @param handlerOrURL An instance of `IOHandler` or a URL-like,\n     * scheme-based string shortcut for `IOHandler`.\n     * @param config Options for saving the model.\n     * @returns A `Promise` of `SaveResult`, which summarizes the result of\n     * the saving, such as byte sizes of the saved artifacts for the model's\n     *   topology and weight values.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes', ignoreCI: true}\n     */\n    async save(handlerOrURL, config) {\n        if (typeof handlerOrURL === 'string') {\n            const handlers = this.io.getSaveHandlers(handlerOrURL);\n            if (handlers.length === 0) {\n                throw new Error(`Cannot find any save handlers for URL '${handlerOrURL}'`);\n            }\n            else if (handlers.length > 1) {\n                throw new Error(`Found more than one (${handlers.length}) save handlers for ` +\n                    `URL '${handlerOrURL}'`);\n            }\n            handlerOrURL = handlers[0];\n        }\n        if (handlerOrURL.save == null) {\n            throw new Error('GraphModel.save() cannot proceed because the IOHandler ' +\n                'provided does not have the `save` attribute defined.');\n        }\n        return handlerOrURL.save(this.artifacts);\n    }\n    /**\n     * Execute the inference for the input tensors.\n     *\n     * @param input The input tensors, when there is single input for the model,\n     * inputs param should be a `tf.Tensor`. For models with mutliple inputs,\n     * inputs params should be in either `tf.Tensor`[] if the input order is\n     * fixed, or otherwise NamedTensorMap format.\n     *\n     * For model with multiple inputs, we recommend you use NamedTensorMap as the\n     * input type, if you use `tf.Tensor`[], the order of the array needs to\n     * follow the\n     * order of inputNodes array. @see {@link GraphModel.inputNodes}\n     *\n     * You can also feed any intermediate nodes using the NamedTensorMap as the\n     * input type. For example, given the graph\n     *    InputNode => Intermediate => OutputNode,\n     * you can execute the subgraph Intermediate => OutputNode by calling\n     *    model.execute('IntermediateNode' : tf.tensor(...));\n     *\n     * This is useful for models that uses tf.dynamic_rnn, where the intermediate\n     * state needs to be fed manually.\n     *\n     * For batch inference execution, the tensors for each input need to be\n     * concatenated together. For example with mobilenet, the required input shape\n     * is [1, 244, 244, 3], which represents the [batch, height, width, channel].\n     * If we are provide a batched data of 100 images, the input tensor should be\n     * in the shape of [100, 244, 244, 3].\n     *\n     * @param config Prediction configuration for specifying the batch size.\n     * Currently the batch size option is ignored for graph model.\n     *\n     * @returns Inference result tensors. If the model is converted and it\n     * originally had structured_outputs in tensorflow, then a NamedTensorMap\n     * will be returned matching the structured_outputs. If no structured_outputs\n     * are present, the output will be single `tf.Tensor` if the model has single\n     * output node, otherwise Tensor[].\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    predict(inputs, config) {\n        const outputTensors = this.execute(inputs, this.outputNodes);\n        if (this.structuredOutputKeys) {\n            const outputTensorsArray = outputTensors instanceof Tensor ? [outputTensors] : outputTensors;\n            const outputTensorMap = {};\n            outputTensorsArray.forEach((outputTensor, i) => outputTensorMap[this.structuredOutputKeys[i]] =\n                outputTensor);\n            return outputTensorMap;\n        }\n        return outputTensors;\n    }\n    normalizeInputs(inputs) {\n        if (!(inputs instanceof Tensor) && !Array.isArray(inputs)) {\n            // The input is already a NamedTensorMap.\n            return inputs;\n        }\n        inputs = Array.isArray(inputs) ? inputs : [inputs];\n        if (inputs.length !== this.inputNodes.length) {\n            throw new Error('Input tensor count mismatch,' +\n                `the graph model has ${this.inputNodes.length} placeholders, ` +\n                `while there are ${inputs.length} input tensors.`);\n        }\n        return this.inputNodes.reduce((map, inputName, i) => {\n            map[inputName] = inputs[i];\n            return map;\n        }, {});\n    }\n    normalizeOutputs(outputs) {\n        outputs = outputs || this.outputNodes;\n        return !Array.isArray(outputs) ? [outputs] : outputs;\n    }\n    /**\n     * Executes inference for the model for given input tensors.\n     * @param inputs tensor, tensor array or tensor map of the inputs for the\n     * model, keyed by the input node names.\n     * @param outputs output node name from the TensorFlow model, if no\n     * outputs are specified, the default outputs of the model would be used.\n     * You can inspect intermediate nodes of the model by adding them to the\n     * outputs array.\n     *\n     * @returns A single tensor if provided with a single output or no outputs\n     * are provided and there is only one default output, otherwise return a\n     * tensor array. The order of the tensor array is the same as the outputs\n     * if provided, otherwise the order of outputNodes attribute of the model.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    execute(inputs, outputs) {\n        inputs = this.normalizeInputs(inputs);\n        outputs = this.normalizeOutputs(outputs);\n        const result = this.executor.execute(inputs, outputs);\n        return result.length > 1 ? result : result[0];\n    }\n    /**\n     * Executes inference for the model for given input tensors in async\n     * fashion, use this method when your model contains control flow ops.\n     * @param inputs tensor, tensor array or tensor map of the inputs for the\n     * model, keyed by the input node names.\n     * @param outputs output node name from the TensorFlow model, if no outputs\n     * are specified, the default outputs of the model would be used. You can\n     * inspect intermediate nodes of the model by adding them to the outputs\n     * array.\n     *\n     * @returns A Promise of single tensor if provided with a single output or\n     * no outputs are provided and there is only one default output, otherwise\n     * return a tensor map.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    async executeAsync(inputs, outputs) {\n        inputs = this.normalizeInputs(inputs);\n        outputs = this.normalizeOutputs(outputs);\n        const result = await this.executor.executeAsync(inputs, outputs);\n        return result.length > 1 ? result : result[0];\n    }\n    /**\n     * Get intermediate tensors for model debugging mode (flag\n     * KEEP_INTERMEDIATE_TENSORS is true).\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    getIntermediateTensors() {\n        return this.executor.getIntermediateTensors();\n    }\n    /**\n     * Dispose intermediate tensors for model debugging mode (flag\n     * KEEP_INTERMEDIATE_TENSORS is true).\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    disposeIntermediateTensors() {\n        this.executor.disposeIntermediateTensors();\n    }\n    convertTensorMapToTensorsMap(map) {\n        return Object.keys(map).reduce((newMap, key) => {\n            newMap[key] = [map[key]];\n            return newMap;\n        }, {});\n    }\n    /**\n     * Releases the memory used by the weight tensors and resourceManager.\n     *\n     * @doc {heading: 'Models', subheading: 'Classes'}\n     */\n    dispose() {\n        this.executor.dispose();\n        if (this.initializer) {\n            this.initializer.dispose();\n        }\n        this.resourceManager.dispose();\n    }\n}\n/**\n * Load a graph model given a URL to the model definition.\n *\n * Example of loading MobileNetV2 from a URL and making a prediction with a\n * zeros input:\n *\n * ```js\n * const modelUrl =\n *    'https://storage.googleapis.com/tfjs-models/savedmodel/mobilenet_v2_1.0_224/model.json';\n * const model = await tf.loadGraphModel(modelUrl);\n * const zeros = tf.zeros([1, 224, 224, 3]);\n * model.predict(zeros).print();\n * ```\n *\n * Example of loading MobileNetV2 from a TF Hub URL and making a prediction\n * with a zeros input:\n *\n * ```js\n * const modelUrl =\n *    'https://tfhub.dev/google/imagenet/mobilenet_v2_140_224/classification/2';\n * const model = await tf.loadGraphModel(modelUrl, {fromTFHub: true});\n * const zeros = tf.zeros([1, 224, 224, 3]);\n * model.predict(zeros).print();\n * ```\n * @param modelUrl The url or an `io.IOHandler` that loads the model.\n * @param options Options for the HTTP request, which allows to send\n *     credentials\n *    and custom headers.\n *\n * @doc {heading: 'Models', subheading: 'Loading'}\n */\nexport async function loadGraphModel(modelUrl, options = {}, tfio = io) {\n    if (modelUrl == null) {\n        throw new Error('modelUrl in loadGraphModel() cannot be null. Please provide a url ' +\n            'or an IOHandler that loads the model');\n    }\n    if (options == null) {\n        options = {};\n    }\n    if (options.fromTFHub && typeof modelUrl === 'string') {\n        modelUrl = getTFHubUrl(modelUrl);\n    }\n    const model = new GraphModel(modelUrl, options, tfio);\n    await model.load();\n    return model;\n}\n/**\n * Load a graph model given a synchronous IO handler with a 'load' method.\n *\n * @param modelSource The `io.IOHandlerSync` that loads the model, or the\n *     `io.ModelArtifacts` that encode the model, or a tuple of\n *     `[io.ModelJSON, ArrayBuffer]` of which the first element encodes the\n *      model and the second contains the weights.\n *\n * @doc {heading: 'Models', subheading: 'Loading'}\n */\nexport function loadGraphModelSync(modelSource) {\n    if (modelSource == null) {\n        throw new Error('modelUrl in loadGraphModelSync() cannot be null. Please provide ' +\n            'model artifacts or an IOHandler that loads the model');\n    }\n    let ioHandler;\n    if (modelSource instanceof Array) {\n        const [modelJSON, weights] = modelSource;\n        if (!modelJSON) {\n            throw new Error('modelJSON must be the first element of the array');\n        }\n        if (!weights || !(weights instanceof ArrayBuffer)) {\n            throw new Error('An ArrayBuffer of weights must be the second element of'\n                + ' the array');\n        }\n        if (!('modelTopology' in modelJSON)) {\n            throw new Error('Model JSON is missing \\'modelTopology\\'');\n        }\n        if (!('weightsManifest' in modelJSON)) {\n            throw new Error('Model JSON is missing \\'weightsManifest\\'');\n        }\n        const weightSpecs = io.getWeightSpecs(modelJSON.weightsManifest);\n        const modelArtifacts = io.getModelArtifactsForJSONSync(modelJSON, weightSpecs, weights);\n        ioHandler = io.fromMemorySync(modelArtifacts);\n    }\n    else if ('load' in modelSource) {\n        // Then modelSource is already an IOHandlerSync.\n        ioHandler = modelSource;\n    }\n    else if ('modelTopology' in modelSource && 'weightSpecs' in modelSource\n        && 'weightData' in modelSource) {\n        // modelSource is of type ModelArtifacts.\n        ioHandler = io.fromMemorySync(modelSource);\n    }\n    else {\n        throw new Error('Unknown model format');\n    }\n    const model = new GraphModel(ioHandler);\n    model.load();\n    return model;\n}\nfunction getTFHubUrl(modelUrl) {\n    if (!modelUrl.endsWith('/')) {\n        modelUrl = (modelUrl) + '/';\n    }\n    return `${modelUrl}${DEFAULT_MODEL_NAME}${TFHUB_SEARCH_PARAM}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGhfbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWNvbnZlcnRlci9zcmMvZXhlY3V0b3IvZ3JhcGhfbW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFpQixFQUFFLEVBQXNDLE1BQU0sRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkzRyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFL0QsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQy9DLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxtQkFBbUIsQ0FBQztBQUN0RCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRyxZQUFZLENBQUM7QUFJL0M7Ozs7Ozs7OztHQVNHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFpRHJCOzs7Ozs7OztPQVFHO0lBQ0gsWUFDWSxRQUFrQixFQUFVLGNBQThCLEVBQUUsRUFDcEUsSUFBSSxHQUFHLEVBQUU7UUFERCxhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQVUsZ0JBQVcsR0FBWCxXQUFXLENBQXFCO1FBeERoRSxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBMER0QixJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQztRQUNmLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtZQUN2QixJQUFJLENBQUMsV0FBVyxHQUFHLEVBQUUsQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztJQUMvQyxDQUFDO0lBdERELHFFQUFxRTtJQUNyRSxJQUFJLFlBQVk7UUFDZCxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDdEIsQ0FBQztJQUVELElBQUksVUFBVTtRQUNa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LENBQUMsSUFBSSxFQUFFLENBQUM7SUFDYixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxRQUFnQjtJQUNuQyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsRUFBRTtRQUMzQixRQUFRLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDN0I7SUFDRCxPQUFPLEdBQUcsUUFBUSxHQUFHLGtCQUFrQixHQUFHLGtCQUFrQixFQUFFLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJbmZlcmVuY2VNb2RlbCwgaW8sIE1vZGVsUHJlZGljdENvbmZpZywgTmFtZWRUZW5zb3JNYXAsIFRlbnNvciwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0ICogYXMgdGVuc29yZmxvdyBmcm9tICcuLi9kYXRhL2NvbXBpbGVkX2FwaSc7XG5pbXBvcnQge05hbWVkVGVuc29yc01hcCwgVGVuc29ySW5mb30gZnJvbSAnLi4vZGF0YS90eXBlcyc7XG5pbXBvcnQge09wZXJhdGlvbk1hcHBlcn0gZnJvbSAnLi4vb3BlcmF0aW9ucy9vcGVyYXRpb25fbWFwcGVyJztcblxuaW1wb3J0IHtHcmFwaEV4ZWN1dG9yfSBmcm9tICcuL2dyYXBoX2V4ZWN1dG9yJztcbmltcG9ydCB7UmVzb3VyY2VNYW5hZ2VyfSBmcm9tICcuL3Jlc291cmNlX21hbmFnZXInO1xuXG5leHBvcnQgY29uc3QgVEZIVUJfU0VBUkNIX1BBUkFNID0gJz90ZmpzLWZvcm1hdD1maWxlJztcbmV4cG9ydCBjb25zdCBERUZBVUxUX01PREVMX05BTUUgPSAnbW9kZWwuanNvbic7XG50eXBlIFVybCA9IHN0cmluZ3xpby5JT0hhbmRsZXJ8aW8uSU9IYW5kbGVyU3luYztcbnR5cGUgVXJsSU9IYW5kbGVyPFQgZXh0ZW5kcyBVcmw+ID0gVCBleHRlbmRzIHN0cmluZyA/IGlvLklPSGFuZGxlciA6IFQ7XG5cbi8qKlxuICogQSBgdGYuR3JhcGhNb2RlbGAgaXMgYSBkaXJlY3RlZCwgYWN5Y2xpYyBncmFwaCBidWlsdCBmcm9tIGFcbiAqIFNhdmVkTW9kZWwgR3JhcGhEZWYgYW5kIGFsbG93cyBpbmZlcmVuY2UgZXhlY3V0aW9uLlxuICpcbiAqIEEgYHRmLkdyYXBoTW9kZWxgIGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgbG9hZGluZyBmcm9tIGEgbW9kZWwgY29udmVydGVkIGZyb21cbiAqIGEgW1RlbnNvckZsb3cgU2F2ZWRNb2RlbF0oaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ3VpZGUvc2F2ZWRfbW9kZWwpIHVzaW5nXG4gKiB0aGUgY29tbWFuZCBsaW5lIGNvbnZlcnRlciB0b29sIGFuZCBsb2FkZWQgdmlhIGB0Zi5sb2FkR3JhcGhNb2RlbGAuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAqL1xuZXhwb3J0IGNsYXNzIEdyYXBoTW9kZWw8TW9kZWxVUkwgZXh0ZW5kcyBVcmwgPSBzdHJpbmcgfCBpby5JT0hhbmRsZXI+IGltcGxlbWVudHNcbiAgICBJbmZlcmVuY2VNb2RlbCB7XG4gIHByaXZhdGUgZXhlY3V0b3I6IEdyYXBoRXhlY3V0b3I7XG4gIHByaXZhdGUgdmVyc2lvbiA9ICduL2EnO1xuICBwcml2YXRlIGhhbmRsZXI6IFVybElPSGFuZGxlcjxNb2RlbFVSTD47XG4gIHByaXZhdGUgYXJ0aWZhY3RzOiBpby5Nb2RlbEFydGlmYWN0cztcbiAgcHJpdmF0ZSBpbml0aWFsaXplcjogR3JhcGhFeGVjdXRvcjtcbiAgcHJpdmF0ZSByZXNvdXJjZU1hbmFnZXI6IFJlc291cmNlTWFuYWdlcjtcbiAgcHJpdmF0ZSBzaWduYXR1cmU6IHRlbnNvcmZsb3cuSVNpZ25hdHVyZURlZjtcbiAgcHJpdmF0ZSBzdHJ1Y3R1cmVkT3V0cHV0S2V5czogc3RyaW5nW107XG4gIHByaXZhdGUgcmVhZG9ubHkgaW86IHR5cGVvZiBpbztcblxuICAvLyBSZXR1cm5zIHRoZSB2ZXJzaW9uIGluZm9ybWF0aW9uIGZvciB0aGUgdGVuc29yZmxvdyBtb2RlbCBHcmFwaERlZi5cbiAgZ2V0IG1vZGVsVmVyc2lvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnZlcnNpb247XG4gIH1cblxuICBnZXQgaW5wdXROb2RlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0b3IuaW5wdXROb2RlcztcbiAgfVxuXG4gIGdldCBvdXRwdXROb2RlcygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0b3Iub3V0cHV0Tm9kZXM7XG4gIH1cblxuICBnZXQgaW5wdXRzKCk6IFRlbnNvckluZm9bXSB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0b3IuaW5wdXRzO1xuICB9XG5cbiAgZ2V0IG91dHB1dHMoKTogVGVuc29ySW5mb1tdIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRvci5vdXRwdXRzO1xuICB9XG5cbiAgZ2V0IHdlaWdodHMoKTogTmFtZWRUZW5zb3JzTWFwIHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRvci53ZWlnaHRNYXA7XG4gIH1cblxuICBnZXQgbWV0YWRhdGEoKToge30ge1xuICAgIHJldHVybiB0aGlzLmFydGlmYWN0cy51c2VyRGVmaW5lZE1ldGFkYXRhO1xuICB9XG5cbiAgZ2V0IG1vZGVsU2lnbmF0dXJlKCk6IHt9IHtcbiAgICByZXR1cm4gdGhpcy5zaWduYXR1cmU7XG4gIH1cblxuICBnZXQgbW9kZWxTdHJ1Y3R1cmVkT3V0cHV0S2V5cygpOiB7fSB7XG4gICAgcmV0dXJuIHRoaXMuc3RydWN0dXJlZE91dHB1dEtleXM7XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIG1vZGVsVXJsIHVybCBmb3IgdGhlIG1vZGVsLCBvciBhbiBgaW8uSU9IYW5kbGVyYC5cbiAgICogQHBhcmFtIHdlaWdodE1hbmlmZXN0VXJsIHVybCBmb3IgdGhlIHdlaWdodCBmaWxlIGdlbmVyYXRlZCBieVxuICAgKiBzY3JpcHRzL2NvbnZlcnQucHkgc2NyaXB0LlxuICAgKiBAcGFyYW0gcmVxdWVzdE9wdGlvbiBvcHRpb25zIGZvciBSZXF1ZXN0LCB3aGljaCBhbGxvd3MgdG8gc2VuZCBjcmVkZW50aWFsc1xuICAgKiBhbmQgY3VzdG9tIGhlYWRlcnMuXG4gICAqIEBwYXJhbSBvblByb2dyZXNzIE9wdGlvbmFsLCBwcm9ncmVzcyBjYWxsYmFjayBmdW5jdGlvbiwgZmlyZWQgcGVyaW9kaWNhbGx5XG4gICAqIGJlZm9yZSB0aGUgbG9hZCBpcyBjb21wbGV0ZWQuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByaXZhdGUgbW9kZWxVcmw6IE1vZGVsVVJMLCBwcml2YXRlIGxvYWRPcHRpb25zOiBpby5Mb2FkT3B0aW9ucyA9IHt9LFxuICAgICAgdGZpbyA9IGlvKSB7XG4gICAgdGhpcy5pbyA9IHRmaW87XG4gICAgaWYgKGxvYWRPcHRpb25zID09IG51bGwpIHtcbiAgICAgIHRoaXMubG9hZE9wdGlvbnMgPSB7fTtcbiAgICB9XG4gICAgdGhpcy5yZXNvdXJjZU1hbmFnZXIgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyKCk7XG4gIH1cblxuICBwcml2YXRlIGZpbmRJT0hhbmRsZXIoKSB7XG4gICAgdHlwZSBJT0hhbmRsZXIgPSBVcmxJT0hhbmRsZXI8TW9kZWxVUkw+O1xuICAgIGNvbnN0IHBhdGggPSB0aGlzLm1vZGVsVXJsO1xuICAgIGlmICgocGF0aCBhcyBpby5JT0hhbmRsZXIpLmxvYWQgIT0gbnVsbCkge1xuICAgICAgLy8gUGF0aCBpcyBhbiBJTyBIYW5kbGVyLlxuICAgICAgdGhpcy5oYW5kbGVyID0gcGF0aCBhcyBJT0hhbmRsZXI7XG4gICAgfSBlbHNlIGlmICh0aGlzLmxvYWRPcHRpb25zLnJlcXVlc3RJbml0ICE9IG51bGwpIHtcbiAgICAgIHRoaXMuaGFuZGxlciA9IHRoaXMuaW8uYnJvd3NlckhUVFBSZXF1ZXN0KFxuICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGggYXMgc3RyaW5nLCB0aGlzLmxvYWRPcHRpb25zKSBhcyBJT0hhbmRsZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID1cbiAgICAgICAgICB0aGlzLmlvLmdldExvYWRIYW5kbGVycyhwYXRoIGFzIHN0cmluZywgdGhpcy5sb2FkT3B0aW9ucyk7XG4gICAgICBpZiAoaGFuZGxlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5OiBpZiBubyBsb2FkIGhhbmRsZXIgY2FuIGJlIGZvdW5kLFxuICAgICAgICAvLyBhc3N1bWUgaXQgaXMgYSByZWxhdGl2ZSBodHRwIHBhdGguXG4gICAgICAgIGhhbmRsZXJzLnB1c2goXG4gICAgICAgICAgICB0aGlzLmlvLmJyb3dzZXJIVFRQUmVxdWVzdChwYXRoIGFzIHN0cmluZywgdGhpcy5sb2FkT3B0aW9ucykpO1xuICAgICAgfSBlbHNlIGlmIChoYW5kbGVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBGb3VuZCBtb3JlIHRoYW4gb25lICgke2hhbmRsZXJzLmxlbmd0aH0pIGxvYWQgaGFuZGxlcnMgZm9yIGAgK1xuICAgICAgICAgICAgYFVSTCAnJHtbcGF0aF19J2ApO1xuICAgICAgfVxuICAgICAgdGhpcy5oYW5kbGVyID0gaGFuZGxlcnNbMF0gYXMgSU9IYW5kbGVyO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkcyB0aGUgbW9kZWwgYW5kIHdlaWdodCBmaWxlcywgY29uc3RydWN0IHRoZSBpbiBtZW1vcnkgd2VpZ2h0IG1hcCBhbmRcbiAgICogY29tcGlsZSB0aGUgaW5mZXJlbmNlIGdyYXBoLlxuICAgKi9cbiAgbG9hZCgpOiBVcmxJT0hhbmRsZXI8TW9kZWxVUkw+IGV4dGVuZHMgaW8uSU9IYW5kbGVyU3luYz8gYm9vbGVhbjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHR5cGUgSU9IYW5kbGVyID0gVXJsSU9IYW5kbGVyPE1vZGVsVVJMPjtcbiAgICB0aGlzLmZpbmRJT0hhbmRsZXIoKTtcbiAgICBpZiAodGhpcy5oYW5kbGVyLmxvYWQgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdDYW5ub3QgcHJvY2VlZCB3aXRoIG1vZGVsIGxvYWRpbmcgYmVjYXVzZSB0aGUgSU9IYW5kbGVyIHByb3ZpZGVkICcgK1xuICAgICAgICAgICdkb2VzIG5vdCBoYXZlIHRoZSBgbG9hZGAgbWV0aG9kIGltcGxlbWVudGVkLicpO1xuICAgIH1cblxuICAgIHR5cGUgUmVzdWx0ID1cbiAgICAgICAgSU9IYW5kbGVyIGV4dGVuZHMgaW8uSU9IYW5kbGVyU3luYyA/IGJvb2xlYW4gOiBQcm9taXNlPGJvb2xlYW4+O1xuXG4gICAgY29uc3QgbG9hZFJlc3VsdCA9IHRoaXMuaGFuZGxlci5sb2FkKCkgYXMgUmV0dXJuVHlwZTxJT0hhbmRsZXJbJ2xvYWQnXT47XG4gICAgaWYgKHV0aWwuaXNQcm9taXNlKGxvYWRSZXN1bHQpKSB7XG4gICAgICByZXR1cm4gbG9hZFJlc3VsdC50aGVuKGFydGlmYWN0cyA9PiB0aGlzLmxvYWRTeW5jKGFydGlmYWN0cykpIGFzIFJlc3VsdDtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5sb2FkU3luYyhsb2FkUmVzdWx0KSBhcyBSZXN1bHQ7XG4gIH1cblxuICAvKipcbiAgICogU3luY2hyb25vdXNseSBjb25zdHJ1Y3QgdGhlIGluIG1lbW9yeSB3ZWlnaHQgbWFwIGFuZFxuICAgKiBjb21waWxlIHRoZSBpbmZlcmVuY2UgZ3JhcGguIEFsc28gaW5pdGlhbGl6ZSBoYXNodGFibGUgaWYgYW55LlxuICAgKlxuICAgKiBAZG9jIHtoZWFkaW5nOiAnTW9kZWxzJywgc3ViaGVhZGluZzogJ0NsYXNzZXMnLCBpZ25vcmVDSTogdHJ1ZX1cbiAgICovXG4gIGxvYWRTeW5jKGFydGlmYWN0czogaW8uTW9kZWxBcnRpZmFjdHMpIHtcbiAgICB0aGlzLmFydGlmYWN0cyA9IGFydGlmYWN0cztcbiAgICBjb25zdCBncmFwaCA9IHRoaXMuYXJ0aWZhY3RzLm1vZGVsVG9wb2xvZ3kgYXMgdGVuc29yZmxvdy5JR3JhcGhEZWY7XG5cbiAgICBsZXQgc2lnbmF0dXJlID0gdGhpcy5hcnRpZmFjdHMuc2lnbmF0dXJlO1xuICAgIGlmICh0aGlzLmFydGlmYWN0cy51c2VyRGVmaW5lZE1ldGFkYXRhICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IG1ldGFkYXRhID0gdGhpcy5hcnRpZmFjdHMudXNlckRlZmluZWRNZXRhZGF0YTtcbiAgICAgIGlmIChtZXRhZGF0YS5zaWduYXR1cmUgIT0gbnVsbCkge1xuICAgICAgICBzaWduYXR1cmUgPSBtZXRhZGF0YS5zaWduYXR1cmU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRhZGF0YS5zdHJ1Y3R1cmVkT3V0cHV0S2V5cyAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc3RydWN0dXJlZE91dHB1dEtleXMgPSBtZXRhZGF0YS5zdHJ1Y3R1cmVkT3V0cHV0S2V5cyBhcyBzdHJpbmdbXTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5zaWduYXR1cmUgPSBzaWduYXR1cmU7XG5cbiAgICB0aGlzLnZlcnNpb24gPSBgJHtncmFwaC52ZXJzaW9ucy5wcm9kdWNlcn0uJHtncmFwaC52ZXJzaW9ucy5taW5Db25zdW1lcn1gO1xuICAgIGNvbnN0IHdlaWdodE1hcCA9IHRoaXMuaW8uZGVjb2RlV2VpZ2h0cyhcbiAgICAgICAgdGhpcy5hcnRpZmFjdHMud2VpZ2h0RGF0YSwgdGhpcy5hcnRpZmFjdHMud2VpZ2h0U3BlY3MpO1xuICAgIHRoaXMuZXhlY3V0b3IgPSBuZXcgR3JhcGhFeGVjdXRvcihcbiAgICAgICAgT3BlcmF0aW9uTWFwcGVyLkluc3RhbmNlLnRyYW5zZm9ybUdyYXBoKGdyYXBoLCB0aGlzLnNpZ25hdHVyZSkpO1xuICAgIHRoaXMuZXhlY3V0b3Iud2VpZ2h0TWFwID0gdGhpcy5jb252ZXJ0VGVuc29yTWFwVG9UZW5zb3JzTWFwKHdlaWdodE1hcCk7XG4gICAgLy8gQXR0YWNoIGEgbW9kZWwtbGV2ZWwgcmVzb3VyY2VNYW5hZ2VyIHRvIGVhY2ggZXhlY3V0b3IgdG8gc2hhcmUgcmVzb3VyY2VzLFxuICAgIC8vIHN1Y2ggYXMgYEhhc2hUYWJsZWAuXG4gICAgdGhpcy5leGVjdXRvci5yZXNvdXJjZU1hbmFnZXIgPSB0aGlzLnJlc291cmNlTWFuYWdlcjtcblxuICAgIGlmIChhcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciAhPSBudWxsICYmXG4gICAgICAgIChhcnRpZmFjdHMubW9kZWxJbml0aWFsaXplciBhcyB0ZW5zb3JmbG93LklHcmFwaERlZikubm9kZSAhPSBudWxsKSB7XG4gICAgICBjb25zdCBpbml0aWFsaXplciA9XG4gICAgICAgICAgT3BlcmF0aW9uTWFwcGVyLkluc3RhbmNlLnRyYW5zZm9ybUdyYXBoKGFydGlmYWN0cy5tb2RlbEluaXRpYWxpemVyKTtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZXIgPSBuZXcgR3JhcGhFeGVjdXRvcihpbml0aWFsaXplcik7XG4gICAgICB0aGlzLmluaXRpYWxpemVyLndlaWdodE1hcCA9IHRoaXMuZXhlY3V0b3Iud2VpZ2h0TWFwO1xuICAgICAgLy8gQXR0YWNoIGEgbW9kZWwtbGV2ZWwgcmVzb3VyY2VNYW5hZ2VyIHRvIHRoZSBpbml0aWFsaXplciwgdGhlXG4gICAgICAvLyBoYXNoVGFibGVzIGNyZWF0ZWQgZnJvbSB3aGVuIGV4ZWN1dGluZyB0aGUgaW5pdGlhbGl6ZXIgd2lsbCBiZSBzdG9yZWRcbiAgICAgIC8vIGluIHRoZSByZXNvdXJjZU1hbmFnZXIuXG4gICAgICB0aGlzLmluaXRpYWxpemVyLnJlc291cmNlTWFuYWdlciA9IHRoaXMucmVzb3VyY2VNYW5hZ2VyO1xuICAgICAgdGhpcy5pbml0aWFsaXplci5leGVjdXRlQXN5bmMoe30sIFtdKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlIHRoZSBjb25maWd1cmF0aW9uIGFuZC9vciB3ZWlnaHRzIG9mIHRoZSBHcmFwaE1vZGVsLlxuICAgKlxuICAgKiBBbiBgSU9IYW5kbGVyYCBpcyBhbiBvYmplY3QgdGhhdCBoYXMgYSBgc2F2ZWAgbWV0aG9kIG9mIHRoZSBwcm9wZXJcbiAgICogc2lnbmF0dXJlIGRlZmluZWQuIFRoZSBgc2F2ZWAgbWV0aG9kIG1hbmFnZXMgdGhlIHN0b3Jpbmcgb3JcbiAgICogdHJhbnNtaXNzaW9uIG9mIHNlcmlhbGl6ZWQgZGF0YSAoXCJhcnRpZmFjdHNcIikgdGhhdCByZXByZXNlbnQgdGhlXG4gICAqIG1vZGVsJ3MgdG9wb2xvZ3kgYW5kIHdlaWdodHMgb250byBvciB2aWEgYSBzcGVjaWZpYyBtZWRpdW0sIHN1Y2ggYXNcbiAgICogZmlsZSBkb3dubG9hZHMsIGxvY2FsIHN0b3JhZ2UsIEluZGV4ZWREQiBpbiB0aGUgd2ViIGJyb3dzZXIgYW5kIEhUVFBcbiAgICogcmVxdWVzdHMgdG8gYSBzZXJ2ZXIuIFRlbnNvckZsb3cuanMgcHJvdmlkZXMgYElPSGFuZGxlcmBcbiAgICogaW1wbGVtZW50YXRpb25zIGZvciBhIG51bWJlciBvZiBmcmVxdWVudGx5IHVzZWQgc2F2aW5nIG1lZGl1bXMsIHN1Y2ggYXNcbiAgICogYHRmLmlvLmJyb3dzZXJEb3dubG9hZHNgIGFuZCBgdGYuaW8uYnJvd3NlckxvY2FsU3RvcmFnZWAuIFNlZSBgdGYuaW9gXG4gICAqIGZvciBtb3JlIGRldGFpbHMuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGFsc28gYWxsb3dzIHlvdSB0byByZWZlciB0byBjZXJ0YWluIHR5cGVzIG9mIGBJT0hhbmRsZXJgc1xuICAgKiBhcyBVUkwtbGlrZSBzdHJpbmcgc2hvcnRjdXRzLCBzdWNoIGFzICdsb2NhbHN0b3JhZ2U6Ly8nIGFuZFxuICAgKiAnaW5kZXhlZGRiOi8vJy5cbiAgICpcbiAgICogRXhhbXBsZSAxOiBTYXZlIGBtb2RlbGAncyB0b3BvbG9neSBhbmQgd2VpZ2h0cyB0byBicm93c2VyIFtsb2NhbFxuICAgKiBzdG9yYWdlXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2luZG93L2xvY2FsU3RvcmFnZSk7XG4gICAqIHRoZW4gbG9hZCBpdCBiYWNrLlxuICAgKlxuICAgKiBgYGBqc1xuICAgKiBjb25zdCBtb2RlbFVybCA9XG4gICAqICAgICdodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vdGZqcy1tb2RlbHMvc2F2ZWRtb2RlbC9tb2JpbGVuZXRfdjJfMS4wXzIyNC9tb2RlbC5qc29uJztcbiAgICogY29uc3QgbW9kZWwgPSBhd2FpdCB0Zi5sb2FkR3JhcGhNb2RlbChtb2RlbFVybCk7XG4gICAqIGNvbnN0IHplcm9zID0gdGYuemVyb3MoWzEsIDIyNCwgMjI0LCAzXSk7XG4gICAqIG1vZGVsLnByZWRpY3QoemVyb3MpLnByaW50KCk7XG4gICAqXG4gICAqIGNvbnN0IHNhdmVSZXN1bHRzID0gYXdhaXQgbW9kZWwuc2F2ZSgnbG9jYWxzdG9yYWdlOi8vbXktbW9kZWwtMScpO1xuICAgKlxuICAgKiBjb25zdCBsb2FkZWRNb2RlbCA9IGF3YWl0IHRmLmxvYWRHcmFwaE1vZGVsKCdsb2NhbHN0b3JhZ2U6Ly9teS1tb2RlbC0xJyk7XG4gICAqIGNvbnNvbGUubG9nKCdQcmVkaWN0aW9uIGZyb20gbG9hZGVkIG1vZGVsOicpO1xuICAgKiBtb2RlbC5wcmVkaWN0KHplcm9zKS5wcmludCgpO1xuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIGhhbmRsZXJPclVSTCBBbiBpbnN0YW5jZSBvZiBgSU9IYW5kbGVyYCBvciBhIFVSTC1saWtlLFxuICAgKiBzY2hlbWUtYmFzZWQgc3RyaW5nIHNob3J0Y3V0IGZvciBgSU9IYW5kbGVyYC5cbiAgICogQHBhcmFtIGNvbmZpZyBPcHRpb25zIGZvciBzYXZpbmcgdGhlIG1vZGVsLlxuICAgKiBAcmV0dXJucyBBIGBQcm9taXNlYCBvZiBgU2F2ZVJlc3VsdGAsIHdoaWNoIHN1bW1hcml6ZXMgdGhlIHJlc3VsdCBvZlxuICAgKiB0aGUgc2F2aW5nLCBzdWNoIGFzIGJ5dGUgc2l6ZXMgb2YgdGhlIHNhdmVkIGFydGlmYWN0cyBmb3IgdGhlIG1vZGVsJ3NcbiAgICogICB0b3BvbG9neSBhbmQgd2VpZ2h0IHZhbHVlcy5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJywgaWdub3JlQ0k6IHRydWV9XG4gICAqL1xuICBhc3luYyBzYXZlKGhhbmRsZXJPclVSTDogaW8uSU9IYW5kbGVyfHN0cmluZywgY29uZmlnPzogaW8uU2F2ZUNvbmZpZyk6XG4gICAgICBQcm9taXNlPGlvLlNhdmVSZXN1bHQ+IHtcbiAgICBpZiAodHlwZW9mIGhhbmRsZXJPclVSTCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGNvbnN0IGhhbmRsZXJzID0gdGhpcy5pby5nZXRTYXZlSGFuZGxlcnMoaGFuZGxlck9yVVJMKTtcbiAgICAgIGlmIChoYW5kbGVycy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBmaW5kIGFueSBzYXZlIGhhbmRsZXJzIGZvciBVUkwgJyR7aGFuZGxlck9yVVJMfSdgKTtcbiAgICAgIH0gZWxzZSBpZiAoaGFuZGxlcnMubGVuZ3RoID4gMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgRm91bmQgbW9yZSB0aGFuIG9uZSAoJHtoYW5kbGVycy5sZW5ndGh9KSBzYXZlIGhhbmRsZXJzIGZvciBgICtcbiAgICAgICAgICAgIGBVUkwgJyR7aGFuZGxlck9yVVJMfSdgKTtcbiAgICAgIH1cbiAgICAgIGhhbmRsZXJPclVSTCA9IGhhbmRsZXJzWzBdO1xuICAgIH1cbiAgICBpZiAoaGFuZGxlck9yVVJMLnNhdmUgPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdHcmFwaE1vZGVsLnNhdmUoKSBjYW5ub3QgcHJvY2VlZCBiZWNhdXNlIHRoZSBJT0hhbmRsZXIgJyArXG4gICAgICAgICAgJ3Byb3ZpZGVkIGRvZXMgbm90IGhhdmUgdGhlIGBzYXZlYCBhdHRyaWJ1dGUgZGVmaW5lZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaGFuZGxlck9yVVJMLnNhdmUodGhpcy5hcnRpZmFjdHMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgdGhlIGluZmVyZW5jZSBmb3IgdGhlIGlucHV0IHRlbnNvcnMuXG4gICAqXG4gICAqIEBwYXJhbSBpbnB1dCBUaGUgaW5wdXQgdGVuc29ycywgd2hlbiB0aGVyZSBpcyBzaW5nbGUgaW5wdXQgZm9yIHRoZSBtb2RlbCxcbiAgICogaW5wdXRzIHBhcmFtIHNob3VsZCBiZSBhIGB0Zi5UZW5zb3JgLiBGb3IgbW9kZWxzIHdpdGggbXV0bGlwbGUgaW5wdXRzLFxuICAgKiBpbnB1dHMgcGFyYW1zIHNob3VsZCBiZSBpbiBlaXRoZXIgYHRmLlRlbnNvcmBbXSBpZiB0aGUgaW5wdXQgb3JkZXIgaXNcbiAgICogZml4ZWQsIG9yIG90aGVyd2lzZSBOYW1lZFRlbnNvck1hcCBmb3JtYXQuXG4gICAqXG4gICAqIEZvciBtb2RlbCB3aXRoIG11bHRpcGxlIGlucHV0cywgd2UgcmVjb21tZW5kIHlvdSB1c2UgTmFtZWRUZW5zb3JNYXAgYXMgdGhlXG4gICAqIGlucHV0IHR5cGUsIGlmIHlvdSB1c2UgYHRmLlRlbnNvcmBbXSwgdGhlIG9yZGVyIG9mIHRoZSBhcnJheSBuZWVkcyB0b1xuICAgKiBmb2xsb3cgdGhlXG4gICAqIG9yZGVyIG9mIGlucHV0Tm9kZXMgYXJyYXkuIEBzZWUge0BsaW5rIEdyYXBoTW9kZWwuaW5wdXROb2Rlc31cbiAgICpcbiAgICogWW91IGNhbiBhbHNvIGZlZWQgYW55IGludGVybWVkaWF0ZSBub2RlcyB1c2luZyB0aGUgTmFtZWRUZW5zb3JNYXAgYXMgdGhlXG4gICAqIGlucHV0IHR5cGUuIEZvciBleGFtcGxlLCBnaXZlbiB0aGUgZ3JhcGhcbiAgICogICAgSW5wdXROb2RlID0+IEludGVybWVkaWF0ZSA9PiBPdXRwdXROb2RlLFxuICAgKiB5b3UgY2FuIGV4ZWN1dGUgdGhlIHN1YmdyYXBoIEludGVybWVkaWF0ZSA9PiBPdXRwdXROb2RlIGJ5IGNhbGxpbmdcbiAgICogICAgbW9kZWwuZXhlY3V0ZSgnSW50ZXJtZWRpYXRlTm9kZScgOiB0Zi50ZW5zb3IoLi4uKSk7XG4gICAqXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RlbHMgdGhhdCB1c2VzIHRmLmR5bmFtaWNfcm5uLCB3aGVyZSB0aGUgaW50ZXJtZWRpYXRlXG4gICAqIHN0YXRlIG5lZWRzIHRvIGJlIGZlZCBtYW51YWxseS5cbiAgICpcbiAgICogRm9yIGJhdGNoIGluZmVyZW5jZSBleGVjdXRpb24sIHRoZSB0ZW5zb3JzIGZvciBlYWNoIGlucHV0IG5lZWQgdG8gYmVcbiAgICogY29uY2F0ZW5hdGVkIHRvZ2V0aGVyLiBGb3IgZXhhbXBsZSB3aXRoIG1vYmlsZW5ldCwgdGhlIHJlcXVpcmVkIGlucHV0IHNoYXBlXG4gICAqIGlzIFsxLCAyNDQsIDI0NCwgM10sIHdoaWNoIHJlcHJlc2VudHMgdGhlIFtiYXRjaCwgaGVpZ2h0LCB3aWR0aCwgY2hhbm5lbF0uXG4gICAqIElmIHdlIGFyZSBwcm92aWRlIGEgYmF0Y2hlZCBkYXRhIG9mIDEwMCBpbWFnZXMsIHRoZSBpbnB1dCB0ZW5zb3Igc2hvdWxkIGJlXG4gICAqIGluIHRoZSBzaGFwZSBvZiBbMTAwLCAyNDQsIDI0NCwgM10uXG4gICAqXG4gICAqIEBwYXJhbSBjb25maWcgUHJlZGljdGlvbiBjb25maWd1cmF0aW9uIGZvciBzcGVjaWZ5aW5nIHRoZSBiYXRjaCBzaXplLlxuICAgKiBDdXJyZW50bHkgdGhlIGJhdGNoIHNpemUgb3B0aW9uIGlzIGlnbm9yZWQgZm9yIGdyYXBoIG1vZGVsLlxuICAgKlxuICAgKiBAcmV0dXJucyBJbmZlcmVuY2UgcmVzdWx0IHRlbnNvcnMuIElmIHRoZSBtb2RlbCBpcyBjb252ZXJ0ZWQgYW5kIGl0XG4gICAqIG9yaWdpbmFsbHkgaGFkIHN0cnVjdHVyZWRfb3V0cHV0cyBpbiB0ZW5zb3JmbG93LCB0aGVuIGEgTmFtZWRUZW5zb3JNYXBcbiAgICogd2lsbCBiZSByZXR1cm5lZCBtYXRjaGluZyB0aGUgc3RydWN0dXJlZF9vdXRwdXRzLiBJZiBubyBzdHJ1Y3R1cmVkX291dHB1dHNcbiAgICogYXJlIHByZXNlbnQsIHRoZSBvdXRwdXQgd2lsbCBiZSBzaW5nbGUgYHRmLlRlbnNvcmAgaWYgdGhlIG1vZGVsIGhhcyBzaW5nbGVcbiAgICogb3V0cHV0IG5vZGUsIG90aGVyd2lzZSBUZW5zb3JbXS5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIHByZWRpY3QoaW5wdXRzOiBUZW5zb3J8VGVuc29yW118TmFtZWRUZW5zb3JNYXAsIGNvbmZpZz86IE1vZGVsUHJlZGljdENvbmZpZyk6XG4gICAgICBUZW5zb3J8VGVuc29yW118TmFtZWRUZW5zb3JNYXAge1xuICAgIGNvbnN0IG91dHB1dFRlbnNvcnMgPSB0aGlzLmV4ZWN1dGUoaW5wdXRzLCB0aGlzLm91dHB1dE5vZGVzKTtcbiAgICBpZiAodGhpcy5zdHJ1Y3R1cmVkT3V0cHV0S2V5cykge1xuICAgICAgY29uc3Qgb3V0cHV0VGVuc29yc0FycmF5ID1cbiAgICAgICAgICBvdXRwdXRUZW5zb3JzIGluc3RhbmNlb2YgVGVuc29yID8gW291dHB1dFRlbnNvcnNdIDogb3V0cHV0VGVuc29ycztcbiAgICAgIGNvbnN0IG91dHB1dFRlbnNvck1hcDogTmFtZWRUZW5zb3JNYXAgPSB7fTtcblxuICAgICAgb3V0cHV0VGVuc29yc0FycmF5LmZvckVhY2goXG4gICAgICAgICAgKG91dHB1dFRlbnNvciwgaSkgPT4gb3V0cHV0VGVuc29yTWFwW3RoaXMuc3RydWN0dXJlZE91dHB1dEtleXNbaV1dID1cbiAgICAgICAgICAgICAgb3V0cHV0VGVuc29yKTtcblxuICAgICAgcmV0dXJuIG91dHB1dFRlbnNvck1hcDtcbiAgICB9XG4gICAgcmV0dXJuIG91dHB1dFRlbnNvcnM7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZUlucHV0cyhpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRUZW5zb3JNYXApOiBOYW1lZFRlbnNvck1hcCB7XG4gICAgaWYgKCEoaW5wdXRzIGluc3RhbmNlb2YgVGVuc29yKSAmJiAhQXJyYXkuaXNBcnJheShpbnB1dHMpKSB7XG4gICAgICAvLyBUaGUgaW5wdXQgaXMgYWxyZWFkeSBhIE5hbWVkVGVuc29yTWFwLlxuICAgICAgcmV0dXJuIGlucHV0cztcbiAgICB9XG4gICAgaW5wdXRzID0gQXJyYXkuaXNBcnJheShpbnB1dHMpID8gaW5wdXRzIDogW2lucHV0c107XG4gICAgaWYgKGlucHV0cy5sZW5ndGggIT09IHRoaXMuaW5wdXROb2Rlcy5sZW5ndGgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnSW5wdXQgdGVuc29yIGNvdW50IG1pc21hdGNoLCcgK1xuICAgICAgICAgIGB0aGUgZ3JhcGggbW9kZWwgaGFzICR7dGhpcy5pbnB1dE5vZGVzLmxlbmd0aH0gcGxhY2Vob2xkZXJzLCBgICtcbiAgICAgICAgICBgd2hpbGUgdGhlcmUgYXJlICR7aW5wdXRzLmxlbmd0aH0gaW5wdXQgdGVuc29ycy5gKTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuaW5wdXROb2Rlcy5yZWR1Y2UoKG1hcCwgaW5wdXROYW1lLCBpKSA9PiB7XG4gICAgICBtYXBbaW5wdXROYW1lXSA9IChpbnB1dHMgYXMgVGVuc29yW10pW2ldO1xuICAgICAgcmV0dXJuIG1hcDtcbiAgICB9LCB7fSBhcyBOYW1lZFRlbnNvck1hcCk7XG4gIH1cblxuICBwcml2YXRlIG5vcm1hbGl6ZU91dHB1dHMob3V0cHV0czogc3RyaW5nfHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIG91dHB1dHMgPSBvdXRwdXRzIHx8IHRoaXMub3V0cHV0Tm9kZXM7XG4gICAgcmV0dXJuICFBcnJheS5pc0FycmF5KG91dHB1dHMpID8gW291dHB1dHNdIDogb3V0cHV0cztcbiAgfVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlcyBpbmZlcmVuY2UgZm9yIHRoZSBtb2RlbCBmb3IgZ2l2ZW4gaW5wdXQgdGVuc29ycy5cbiAgICogQHBhcmFtIGlucHV0cyB0ZW5zb3IsIHRlbnNvciBhcnJheSBvciB0ZW5zb3IgbWFwIG9mIHRoZSBpbnB1dHMgZm9yIHRoZVxuICAgKiBtb2RlbCwga2V5ZWQgYnkgdGhlIGlucHV0IG5vZGUgbmFtZXMuXG4gICAqIEBwYXJhbSBvdXRwdXRzIG91dHB1dCBub2RlIG5hbWUgZnJvbSB0aGUgVGVuc29yRmxvdyBtb2RlbCwgaWYgbm9cbiAgICogb3V0cHV0cyBhcmUgc3BlY2lmaWVkLCB0aGUgZGVmYXVsdCBvdXRwdXRzIG9mIHRoZSBtb2RlbCB3b3VsZCBiZSB1c2VkLlxuICAgKiBZb3UgY2FuIGluc3BlY3QgaW50ZXJtZWRpYXRlIG5vZGVzIG9mIHRoZSBtb2RlbCBieSBhZGRpbmcgdGhlbSB0byB0aGVcbiAgICogb3V0cHV0cyBhcnJheS5cbiAgICpcbiAgICogQHJldHVybnMgQSBzaW5nbGUgdGVuc29yIGlmIHByb3ZpZGVkIHdpdGggYSBzaW5nbGUgb3V0cHV0IG9yIG5vIG91dHB1dHNcbiAgICogYXJlIHByb3ZpZGVkIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBkZWZhdWx0IG91dHB1dCwgb3RoZXJ3aXNlIHJldHVybiBhXG4gICAqIHRlbnNvciBhcnJheS4gVGhlIG9yZGVyIG9mIHRoZSB0ZW5zb3IgYXJyYXkgaXMgdGhlIHNhbWUgYXMgdGhlIG91dHB1dHNcbiAgICogaWYgcHJvdmlkZWQsIG90aGVyd2lzZSB0aGUgb3JkZXIgb2Ygb3V0cHV0Tm9kZXMgYXR0cmlidXRlIG9mIHRoZSBtb2RlbC5cbiAgICpcbiAgICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdDbGFzc2VzJ31cbiAgICovXG4gIGV4ZWN1dGUoaW5wdXRzOiBUZW5zb3J8VGVuc29yW118TmFtZWRUZW5zb3JNYXAsIG91dHB1dHM/OiBzdHJpbmd8c3RyaW5nW10pOlxuICAgICAgVGVuc29yfFRlbnNvcltdIHtcbiAgICBpbnB1dHMgPSB0aGlzLm5vcm1hbGl6ZUlucHV0cyhpbnB1dHMpO1xuICAgIG91dHB1dHMgPSB0aGlzLm5vcm1hbGl6ZU91dHB1dHMob3V0cHV0cyk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5leGVjdXRvci5leGVjdXRlKGlucHV0cywgb3V0cHV0cyk7XG4gICAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPiAxID8gcmVzdWx0IDogcmVzdWx0WzBdO1xuICB9XG4gIC8qKlxuICAgKiBFeGVjdXRlcyBpbmZlcmVuY2UgZm9yIHRoZSBtb2RlbCBmb3IgZ2l2ZW4gaW5wdXQgdGVuc29ycyBpbiBhc3luY1xuICAgKiBmYXNoaW9uLCB1c2UgdGhpcyBtZXRob2Qgd2hlbiB5b3VyIG1vZGVsIGNvbnRhaW5zIGNvbnRyb2wgZmxvdyBvcHMuXG4gICAqIEBwYXJhbSBpbnB1dHMgdGVuc29yLCB0ZW5zb3IgYXJyYXkgb3IgdGVuc29yIG1hcCBvZiB0aGUgaW5wdXRzIGZvciB0aGVcbiAgICogbW9kZWwsIGtleWVkIGJ5IHRoZSBpbnB1dCBub2RlIG5hbWVzLlxuICAgKiBAcGFyYW0gb3V0cHV0cyBvdXRwdXQgbm9kZSBuYW1lIGZyb20gdGhlIFRlbnNvckZsb3cgbW9kZWwsIGlmIG5vIG91dHB1dHNcbiAgICogYXJlIHNwZWNpZmllZCwgdGhlIGRlZmF1bHQgb3V0cHV0cyBvZiB0aGUgbW9kZWwgd291bGQgYmUgdXNlZC4gWW91IGNhblxuICAgKiBpbnNwZWN0IGludGVybWVkaWF0ZSBub2RlcyBvZiB0aGUgbW9kZWwgYnkgYWRkaW5nIHRoZW0gdG8gdGhlIG91dHB1dHNcbiAgICogYXJyYXkuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgUHJvbWlzZSBvZiBzaW5nbGUgdGVuc29yIGlmIHByb3ZpZGVkIHdpdGggYSBzaW5nbGUgb3V0cHV0IG9yXG4gICAqIG5vIG91dHB1dHMgYXJlIHByb3ZpZGVkIGFuZCB0aGVyZSBpcyBvbmx5IG9uZSBkZWZhdWx0IG91dHB1dCwgb3RoZXJ3aXNlXG4gICAqIHJldHVybiBhIHRlbnNvciBtYXAuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBhc3luYyBleGVjdXRlQXN5bmMoXG4gICAgICBpbnB1dHM6IFRlbnNvcnxUZW5zb3JbXXxOYW1lZFRlbnNvck1hcCxcbiAgICAgIG91dHB1dHM/OiBzdHJpbmd8c3RyaW5nW10pOiBQcm9taXNlPFRlbnNvcnxUZW5zb3JbXT4ge1xuICAgIGlucHV0cyA9IHRoaXMubm9ybWFsaXplSW5wdXRzKGlucHV0cyk7XG4gICAgb3V0cHV0cyA9IHRoaXMubm9ybWFsaXplT3V0cHV0cyhvdXRwdXRzKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmV4ZWN1dG9yLmV4ZWN1dGVBc3luYyhpbnB1dHMsIG91dHB1dHMpO1xuICAgIHJldHVybiByZXN1bHQubGVuZ3RoID4gMSA/IHJlc3VsdCA6IHJlc3VsdFswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgaW50ZXJtZWRpYXRlIHRlbnNvcnMgZm9yIG1vZGVsIGRlYnVnZ2luZyBtb2RlIChmbGFnXG4gICAqIEtFRVBfSU5URVJNRURJQVRFX1RFTlNPUlMgaXMgdHJ1ZSkuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBnZXRJbnRlcm1lZGlhdGVUZW5zb3JzKCk6IE5hbWVkVGVuc29yc01hcCB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0b3IuZ2V0SW50ZXJtZWRpYXRlVGVuc29ycygpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgaW50ZXJtZWRpYXRlIHRlbnNvcnMgZm9yIG1vZGVsIGRlYnVnZ2luZyBtb2RlIChmbGFnXG4gICAqIEtFRVBfSU5URVJNRURJQVRFX1RFTlNPUlMgaXMgdHJ1ZSkuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ycygpIHtcbiAgICB0aGlzLmV4ZWN1dG9yLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JzKCk7XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRUZW5zb3JNYXBUb1RlbnNvcnNNYXAobWFwOiBOYW1lZFRlbnNvck1hcCk6IE5hbWVkVGVuc29yc01hcCB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG1hcCkucmVkdWNlKChuZXdNYXA6IE5hbWVkVGVuc29yc01hcCwga2V5KSA9PiB7XG4gICAgICBuZXdNYXBba2V5XSA9IFttYXBba2V5XV07XG4gICAgICByZXR1cm4gbmV3TWFwO1xuICAgIH0sIHt9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyB0aGUgbWVtb3J5IHVzZWQgYnkgdGhlIHdlaWdodCB0ZW5zb3JzIGFuZCByZXNvdXJjZU1hbmFnZXIuXG4gICAqXG4gICAqIEBkb2Mge2hlYWRpbmc6ICdNb2RlbHMnLCBzdWJoZWFkaW5nOiAnQ2xhc3Nlcyd9XG4gICAqL1xuICBkaXNwb3NlKCkge1xuICAgIHRoaXMuZXhlY3V0b3IuZGlzcG9zZSgpO1xuXG4gICAgaWYgKHRoaXMuaW5pdGlhbGl6ZXIpIHtcbiAgICAgIHRoaXMuaW5pdGlhbGl6ZXIuZGlzcG9zZSgpO1xuICAgIH1cblxuICAgIHRoaXMucmVzb3VyY2VNYW5hZ2VyLmRpc3Bvc2UoKTtcbiAgfVxufVxuXG4vKipcbiAqIExvYWQgYSBncmFwaCBtb2RlbCBnaXZlbiBhIFVSTCB0byB0aGUgbW9kZWwgZGVmaW5pdGlvbi5cbiAqXG4gKiBFeGFtcGxlIG9mIGxvYWRpbmcgTW9iaWxlTmV0VjIgZnJvbSBhIFVSTCBhbmQgbWFraW5nIGEgcHJlZGljdGlvbiB3aXRoIGFcbiAqIHplcm9zIGlucHV0OlxuICpcbiAqIGBgYGpzXG4gKiBjb25zdCBtb2RlbFVybCA9XG4gKiAgICAnaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL3RmanMtbW9kZWxzL3NhdmVkbW9kZWwvbW9iaWxlbmV0X3YyXzEuMF8yMjQvbW9kZWwuanNvbic7XG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRHcmFwaE1vZGVsKG1vZGVsVXJsKTtcbiAqIGNvbnN0IHplcm9zID0gdGYuemVyb3MoWzEsIDIyNCwgMjI0LCAzXSk7XG4gKiBtb2RlbC5wcmVkaWN0KHplcm9zKS5wcmludCgpO1xuICogYGBgXG4gKlxuICogRXhhbXBsZSBvZiBsb2FkaW5nIE1vYmlsZU5ldFYyIGZyb20gYSBURiBIdWIgVVJMIGFuZCBtYWtpbmcgYSBwcmVkaWN0aW9uXG4gKiB3aXRoIGEgemVyb3MgaW5wdXQ6XG4gKlxuICogYGBganNcbiAqIGNvbnN0IG1vZGVsVXJsID1cbiAqICAgICdodHRwczovL3RmaHViLmRldi9nb29nbGUvaW1hZ2VuZXQvbW9iaWxlbmV0X3YyXzE0MF8yMjQvY2xhc3NpZmljYXRpb24vMic7XG4gKiBjb25zdCBtb2RlbCA9IGF3YWl0IHRmLmxvYWRHcmFwaE1vZGVsKG1vZGVsVXJsLCB7ZnJvbVRGSHViOiB0cnVlfSk7XG4gKiBjb25zdCB6ZXJvcyA9IHRmLnplcm9zKFsxLCAyMjQsIDIyNCwgM10pO1xuICogbW9kZWwucHJlZGljdCh6ZXJvcykucHJpbnQoKTtcbiAqIGBgYFxuICogQHBhcmFtIG1vZGVsVXJsIFRoZSB1cmwgb3IgYW4gYGlvLklPSGFuZGxlcmAgdGhhdCBsb2FkcyB0aGUgbW9kZWwuXG4gKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIGZvciB0aGUgSFRUUCByZXF1ZXN0LCB3aGljaCBhbGxvd3MgdG8gc2VuZFxuICogICAgIGNyZWRlbnRpYWxzXG4gKiAgICBhbmQgY3VzdG9tIGhlYWRlcnMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdMb2FkaW5nJ31cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGxvYWRHcmFwaE1vZGVsKFxuICAgIG1vZGVsVXJsOiBzdHJpbmd8aW8uSU9IYW5kbGVyLCBvcHRpb25zOiBpby5Mb2FkT3B0aW9ucyA9IHt9LFxuICAgIHRmaW8gPSBpbyk6IFByb21pc2U8R3JhcGhNb2RlbD4ge1xuICBpZiAobW9kZWxVcmwgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ21vZGVsVXJsIGluIGxvYWRHcmFwaE1vZGVsKCkgY2Fubm90IGJlIG51bGwuIFBsZWFzZSBwcm92aWRlIGEgdXJsICcgK1xuICAgICAgICAnb3IgYW4gSU9IYW5kbGVyIHRoYXQgbG9hZHMgdGhlIG1vZGVsJyk7XG4gIH1cbiAgaWYgKG9wdGlvbnMgPT0gbnVsbCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIGlmIChvcHRpb25zLmZyb21URkh1YiAmJiB0eXBlb2YgbW9kZWxVcmwgPT09ICdzdHJpbmcnKSB7XG4gICAgbW9kZWxVcmwgPSBnZXRURkh1YlVybChtb2RlbFVybCk7XG4gIH1cbiAgY29uc3QgbW9kZWwgPSBuZXcgR3JhcGhNb2RlbChtb2RlbFVybCwgb3B0aW9ucywgdGZpbyk7XG4gIGF3YWl0IG1vZGVsLmxvYWQoKTtcbiAgcmV0dXJuIG1vZGVsO1xufVxuXG4vKipcbiAqIExvYWQgYSBncmFwaCBtb2RlbCBnaXZlbiBhIHN5bmNocm9ub3VzIElPIGhhbmRsZXIgd2l0aCBhICdsb2FkJyBtZXRob2QuXG4gKlxuICogQHBhcmFtIG1vZGVsU291cmNlIFRoZSBgaW8uSU9IYW5kbGVyU3luY2AgdGhhdCBsb2FkcyB0aGUgbW9kZWwsIG9yIHRoZVxuICogICAgIGBpby5Nb2RlbEFydGlmYWN0c2AgdGhhdCBlbmNvZGUgdGhlIG1vZGVsLCBvciBhIHR1cGxlIG9mXG4gKiAgICAgYFtpby5Nb2RlbEpTT04sIEFycmF5QnVmZmVyXWAgb2Ygd2hpY2ggdGhlIGZpcnN0IGVsZW1lbnQgZW5jb2RlcyB0aGVcbiAqICAgICAgbW9kZWwgYW5kIHRoZSBzZWNvbmQgY29udGFpbnMgdGhlIHdlaWdodHMuXG4gKlxuICogQGRvYyB7aGVhZGluZzogJ01vZGVscycsIHN1YmhlYWRpbmc6ICdMb2FkaW5nJ31cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvYWRHcmFwaE1vZGVsU3luYyhtb2RlbFNvdXJjZTogaW8uSU9IYW5kbGVyU3luY1xuICB8IGlvLk1vZGVsQXJ0aWZhY3RzIHwgW2lvLk1vZGVsSlNPTiwgLyogV2VpZ2h0cyAqLyBBcnJheUJ1ZmZlcl0pOlxuICBHcmFwaE1vZGVsPGlvLklPSGFuZGxlclN5bmM+IHtcblxuICBpZiAobW9kZWxTb3VyY2UgPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ21vZGVsVXJsIGluIGxvYWRHcmFwaE1vZGVsU3luYygpIGNhbm5vdCBiZSBudWxsLiBQbGVhc2UgcHJvdmlkZSAnICtcbiAgICAgICAgJ21vZGVsIGFydGlmYWN0cyBvciBhbiBJT0hhbmRsZXIgdGhhdCBsb2FkcyB0aGUgbW9kZWwnKTtcbiAgfVxuXG4gIGxldCBpb0hhbmRsZXI6IGlvLklPSGFuZGxlclN5bmM7XG4gIGlmIChtb2RlbFNvdXJjZSBpbnN0YW5jZW9mIEFycmF5KSB7XG4gICAgY29uc3QgW21vZGVsSlNPTiwgd2VpZ2h0c10gPSBtb2RlbFNvdXJjZTtcbiAgICBpZiAoIW1vZGVsSlNPTikge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdtb2RlbEpTT04gbXVzdCBiZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCF3ZWlnaHRzIHx8ICEod2VpZ2h0cyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBbiBBcnJheUJ1ZmZlciBvZiB3ZWlnaHRzIG11c3QgYmUgdGhlIHNlY29uZCBlbGVtZW50IG9mJ1xuICAgICAgICAgICAgICAgICAgICAgICsgJyB0aGUgYXJyYXknKTtcbiAgICB9XG4gICAgaWYgKCEoJ21vZGVsVG9wb2xvZ3knIGluIG1vZGVsSlNPTikpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTW9kZWwgSlNPTiBpcyBtaXNzaW5nIFxcJ21vZGVsVG9wb2xvZ3lcXCcnKTtcbiAgICB9XG4gICAgaWYgKCEoJ3dlaWdodHNNYW5pZmVzdCcgaW4gbW9kZWxKU09OKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNb2RlbCBKU09OIGlzIG1pc3NpbmcgXFwnd2VpZ2h0c01hbmlmZXN0XFwnJyk7XG4gICAgfVxuXG4gICAgY29uc3Qgd2VpZ2h0U3BlY3MgPSBpby5nZXRXZWlnaHRTcGVjcyhtb2RlbEpTT04ud2VpZ2h0c01hbmlmZXN0KTtcbiAgICBjb25zdCBtb2RlbEFydGlmYWN0cyA9IGlvLmdldE1vZGVsQXJ0aWZhY3RzRm9ySlNPTlN5bmMobW9kZWxKU09OLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWlnaHRTcGVjcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VpZ2h0cyk7XG4gICAgaW9IYW5kbGVyID0gaW8uZnJvbU1lbW9yeVN5bmMobW9kZWxBcnRpZmFjdHMpO1xuICB9IGVsc2UgaWYgKCdsb2FkJyBpbiBtb2RlbFNvdXJjZSkge1xuICAgIC8vIFRoZW4gbW9kZWxTb3VyY2UgaXMgYWxyZWFkeSBhbiBJT0hhbmRsZXJTeW5jLlxuICAgIGlvSGFuZGxlciA9IG1vZGVsU291cmNlO1xuICB9IGVsc2UgaWYgKCdtb2RlbFRvcG9sb2d5JyBpbiBtb2RlbFNvdXJjZSAmJiAnd2VpZ2h0U3BlY3MnIGluIG1vZGVsU291cmNlXG4gICAgICAmJiAnd2VpZ2h0RGF0YScgaW4gbW9kZWxTb3VyY2UpIHtcbiAgICAvLyBtb2RlbFNvdXJjZSBpcyBvZiB0eXBlIE1vZGVsQXJ0aWZhY3RzLlxuICAgIGlvSGFuZGxlciA9IGlvLmZyb21NZW1vcnlTeW5jKG1vZGVsU291cmNlKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gbW9kZWwgZm9ybWF0Jyk7XG4gIH1cblxuICBjb25zdCBtb2RlbCA9IG5ldyBHcmFwaE1vZGVsKGlvSGFuZGxlcik7XG4gIG1vZGVsLmxvYWQoKTtcbiAgcmV0dXJuIG1vZGVsO1xufVxuXG5mdW5jdGlvbiBnZXRURkh1YlVybChtb2RlbFVybDogc3RyaW5nKTogc3RyaW5nIHtcbiAgaWYgKCFtb2RlbFVybC5lbmRzV2l0aCgnLycpKSB7XG4gICAgbW9kZWxVcmwgPSAobW9kZWxVcmwpICsgJy8nO1xuICB9XG4gIHJldHVybiBgJHttb2RlbFVybH0ke0RFRkFVTFRfTU9ERUxfTkFNRX0ke1RGSFVCX1NFQVJDSF9QQVJBTX1gO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * =============================================================================\n */\nimport * as tf from '@tensorflow/tfjs-core';\nimport * as seedrandom from 'seedrandom';\nimport { deepClone } from '../util/deep_clone';\nimport { deepMapAndAwaitAll, deepZip, zipToList } from '../util/deep_map';\nimport { GrowingRingBuffer } from '../util/growing_ring_buffer';\nimport { RingBuffer } from '../util/ring_buffer';\n// Here we implement a simple asynchronous iterator.\n// This lets us avoid using either third-party stream libraries or\n// recent TypeScript language support requiring polyfills.\n/**\n * Create a `LazyIterator` from an array of items.\n */\nexport function iteratorFromItems(items) {\n    return new ArrayIterator(items);\n}\n/**\n * Create a `LazyIterator` of incrementing integers.\n */\nexport function iteratorFromIncrementing(start) {\n    let i = start;\n    return iteratorFromFunction(() => ({ value: i++, done: false }));\n}\n/**\n * Create a `LazyIterator` from a function.\n *\n * ```js\n * let i = -1;\n * const func = () =>\n *    ++i < 5 ? {value: i, done: false} : {value: null, done: true};\n * const iter = tf.data.iteratorFromFunction(func);\n * await iter.forEachAsync(e => console.log(e));\n * ```\n *\n * @param func A function that produces data on each call.\n */\nexport function iteratorFromFunction(func) {\n    return new FunctionCallIterator(func);\n}\n/**\n * Create a `LazyIterator` by concatenating underlying streams, which are\n * themselves provided as a stream.\n *\n * This can also be thought of as a \"stream flatten\" operation.\n *\n * @param baseIterators A stream of streams to be concatenated.\n * @param baseErrorHandler An optional function that can intercept `Error`s\n *   raised during a `next()` call on the base stream.  This function can decide\n *   whether the error should be propagated, whether the error should be\n *   ignored, or whether the base stream should be terminated.\n */\nexport function iteratorFromConcatenated(baseIterators, baseErrorHandler) {\n    return new ChainedIterator(baseIterators, baseErrorHandler);\n}\n/**\n * Create a `LazyIterator` by concatenating streams produced by calling a\n * stream-generating function a given number of times.\n *\n * Since a `LazyIterator` is read-once, it cannot be repeated, but this\n * function can be used to achieve a similar effect:\n *\n *   LazyIterator.ofConcatenatedFunction(() => new MyIterator(), 6);\n *\n * @param iteratorFunc: A function that produces a new stream on each call.\n * @param count: The number of times to call the function.\n * @param baseErrorHandler An optional function that can intercept `Error`s\n *   raised during a `next()` call on the base stream.  This function can decide\n *   whether the error should be propagated, whether the error should be\n *   ignored, or whether the base stream should be terminated.\n */\nexport function iteratorFromConcatenatedFunction(iteratorFunc, count, baseErrorHandler) {\n    return iteratorFromConcatenated(iteratorFromFunction(iteratorFunc).take(count), baseErrorHandler);\n}\n/**\n * Create a `LazyIterator` by zipping together an array, dict, or nested\n * structure of `LazyIterator`s (and perhaps additional constants).\n *\n * The underlying streams must provide elements in a consistent order such\n * that they correspond.\n *\n * Typically, the underlying streams should have the same number of\n * elements. If they do not, the behavior is determined by the\n * `mismatchMode` argument.\n *\n * The nested structure of the `iterators` argument determines the\n * structure of elements in the resulting iterator.\n *\n * @param iterators: An array or object containing LazyIterators at the\n * leaves.\n * @param mismatchMode: Determines what to do when one underlying iterator\n * is exhausted before the others.  `ZipMismatchMode.FAIL` (the default)\n * causes an error to be thrown in this case.  `ZipMismatchMode.SHORTEST`\n * causes the zipped iterator to terminate with the furst underlying\n * streams, so elements remaining on the longer streams are ignored.\n * `ZipMismatchMode.LONGEST` causes the zipped stream to continue, filling\n * in nulls for the exhausted streams, until all streams are exhausted.\n */\nexport function iteratorFromZipped(iterators, mismatchMode = ZipMismatchMode.FAIL) {\n    return new ZipIterator(iterators, mismatchMode);\n}\n/**\n * An asynchronous iterator, providing lazy access to a potentially\n * unbounded stream of elements.\n *\n * Iterator can be obtained from a dataset:\n * `const iter = await dataset.iterator();`\n */\nexport class LazyIterator {\n    /**\n     * Collect all remaining elements of a bounded stream into an array.\n     * Obviously this will succeed only for small streams that fit in memory.\n     * Useful for testing.\n     *\n     * @returns A Promise for an array of stream elements, which will resolve\n     *   when the stream is exhausted.\n     */\n    async toArray() {\n        const result = [];\n        let x = await this.next();\n        while (!x.done) {\n            result.push(x.value);\n            x = await this.next();\n        }\n        return result;\n    }\n    /**\n     * Collect all elements of this dataset into an array with prefetching 100\n     * elements. This is useful for testing, because the prefetch changes the\n     * order in which the Promises are resolved along the processing pipeline.\n     * This may help expose bugs where results are dependent on the order of\n     * Promise resolution rather than on the logical order of the stream (i.e.,\n     * due to hidden mutable state).\n     *\n     * @returns A Promise for an array of stream elements, which will resolve\n     *   when the stream is exhausted.\n     */\n    async toArrayForTest() {\n        const stream = this.prefetch(100);\n        const result = [];\n        let x = await stream.next();\n        while (!x.done) {\n            result.push(x.value);\n            x = await stream.next();\n        }\n        return result;\n    }\n    /**\n     * Draw items from the stream until it is exhausted.\n     *\n     * This can be useful when the stream has side effects but no output.  In\n     * that case, calling this function guarantees that the stream will be\n     * fully processed.\n     */\n    async resolveFully() {\n        let x = await this.next();\n        while (!x.done) {\n            x = await this.next();\n        }\n    }\n    /**\n     * Draw items from the stream until it is exhausted, or a predicate fails.\n     *\n     * This can be useful when the stream has side effects but no output.  In\n     * that case, calling this function guarantees that the stream will be\n     * fully processed.\n     */\n    async resolveWhile(predicate) {\n        let x = await this.next();\n        let shouldContinue = predicate(x.value);\n        while ((!x.done) && shouldContinue) {\n            x = await this.next();\n            shouldContinue = predicate(x.value);\n        }\n    }\n    /**\n     * Handles errors thrown on this stream using a provided handler function.\n     *\n     * @param handler A function that handles any `Error` thrown during a `next()`\n     *   call and returns true if the stream should continue (dropping the failed\n     *   call) or false if the stream should quietly terminate.  If the handler\n     *   itself throws (or rethrows) an `Error`, that will be propagated.\n     *\n     * @returns A `LazyIterator` of elements passed through from upstream,\n     *   possibly filtering or terminating on upstream `next()` calls that\n     *   throw an `Error`.\n     */\n    handleErrors(handler) {\n        return new ErrorHandlingLazyIterator(this, handler);\n    }\n    // TODO(soergel): Implement reduce() etc.\n    /**\n     * Filters this stream according to `predicate`.\n     *\n     * @param predicate A function mapping a stream element to a boolean or a\n     * `Promise` for one.\n     *\n     * @returns A `LazyIterator` of elements for which the predicate was true.\n     */\n    filter(predicate) {\n        return new FilterIterator(this, predicate);\n    }\n    /**\n     * Maps this stream through a 1-to-1 transform.\n     *\n     * @param transform A function mapping a stream element to a transformed\n     *   element.\n     *\n     * @returns A `LazyIterator` of transformed elements.\n     */\n    map(transform) {\n        return new MapIterator(this, transform);\n    }\n    /**\n     * Maps this stream through an async 1-to-1 transform.\n     *\n     * @param transform A function mapping a stream element to a `Promise` for a\n     *   transformed stream element.\n     *\n     * @returns A `LazyIterator` of transformed elements.\n     */\n    mapAsync(transform) {\n        return new AsyncMapIterator(this, transform);\n    }\n    /**\n     * Maps this stream through a 1-to-1 transform, forcing serial execution.\n     *\n     * @param transform A function mapping a stream element to a transformed\n     *   element.\n     *\n     * @returns A `LazyIterator` of transformed elements.\n     */\n    serialMapAsync(transform) {\n        return new AsyncMapIterator(this, transform).serial();\n    }\n    /**\n     * Maps this stream through a 1-to-many transform.\n     *\n     * @param transform A function mapping a stream element to an array of\n     *   transformed elements.\n     *\n     * @returns A `DataStream` of transformed elements.\n     */\n    flatmap(transform) {\n        return new FlatmapIterator(this, transform);\n    }\n    /**\n     * Apply a function to every element of the stream.\n     *\n     * @param f A function to apply to each stream element.\n     */\n    async forEachAsync(f) {\n        return this.map(f).resolveFully();\n    }\n    /**\n     * Apply a function to every element of the stream, forcing serial execution.\n     *\n     * @param f A function to apply to each stream element.  Should return 'true'\n     *   to indicate that the stream should continue, or 'false' to cause it to\n     *   terminate.\n     */\n    async serialForEach(f) {\n        return this.serialMapAsync(f).resolveWhile(x => (x === true));\n    }\n    /**\n     * Groups elements into batches, represented as arrays of elements.\n     *\n     * We can think of the elements of this iterator as 'rows' (even if they are\n     * nested structures).  By the same token, consecutive values for a given\n     * key within the elements form a 'column'.  This matches the usual sense of\n     * 'row' and 'column' when processing tabular data (e.g., parsing a CSV).\n     *\n     * Thus, \"Row-major\" means that the resulting batch is simply a collection of\n     * rows: `[row1, row2, row3, ...]`.  This is contrast to the column-major\n     * form, which is needed for vectorized computation.\n     *\n     * @param batchSize The number of elements desired per batch.\n     * @param smallLastBatch Whether to emit the final batch when it has fewer\n     *   than batchSize elements. Default true.\n     * @returns A `LazyIterator` of batches of elements, represented as arrays\n     *   of the original element type.\n     */\n    rowMajorBatch(batchSize, smallLastBatch = true) {\n        return new RowMajorBatchIterator(this, batchSize, smallLastBatch);\n    }\n    /**\n     * Groups elements into batches, represented in column-major form.\n     *\n     * We can think of the elements of this iterator as 'rows' (even if they are\n     * nested structures).  By the same token, consecutive values for a given\n     * key within the elements form a 'column'.  This matches the usual sense of\n     * 'row' and 'column' when processing tabular data (e.g., parsing a CSV).\n     *\n     * Thus, \"column-major\" means that the resulting batch is a (potentially\n     * nested) structure representing the columns.  Each column entry, then,\n     * contains a collection of the values found in that column for a range of\n     * input elements.  This representation allows for vectorized computation, in\n     * contrast to the row-major form.\n     *\n     * The inputs should all have the same nested structure (i.e., of arrays and\n     * dicts).  The result is a single object with the same nested structure,\n     * where the leaves are arrays collecting the values of the inputs at that\n     * location (or, optionally, the result of a custom function applied to those\n     * arrays).\n     *\n     * @param batchSize The number of elements desired per batch.\n     * @param smallLastBatch Whether to emit the final batch when it has fewer\n     *   than batchSize elements. Default true.\n     * @param zipFn: (optional) A function that expects an array of elements at a\n     *   single node of the object tree, and returns a `DeepMapResult`.  The\n     *   `DeepMapResult` either provides a result value for that node (i.e.,\n     *   representing the subtree), or indicates that the node should be processed\n     *   recursively.  The default zipFn recurses as far as possible and places\n     *   arrays at the leaves.\n     * @returns A `LazyIterator` of batches of elements, represented as an object\n     *   with collections at the leaves.\n     */\n    columnMajorBatch(batchSize, smallLastBatch = true, \n    // tslint:disable-next-line:no-any\n    zipFn = zipToList) {\n        // First collect the desired number of input elements as a row-major batch.\n        const rowBatches = this.rowMajorBatch(batchSize, smallLastBatch);\n        // Now 'rotate' or 'pivot' the data, collecting all values from each column\n        // in the batch (i.e., for each key within the elements) into an array.\n        return rowBatches.map(x => deepZip(x, zipFn));\n    }\n    /**\n     * Concatenate this `LazyIterator` with another.\n     *\n     * @param iterator A `LazyIterator` to be concatenated onto this one.\n     * @param baseErrorHandler An optional function that can intercept `Error`s\n     *   raised during a `next()` call on the base stream.  This function can\n     *   decide whether the error should be propagated, whether the error should\n     *   be ignored, or whether the base stream should be terminated.\n     * @returns A `LazyIterator`.\n     */\n    concatenate(iterator, baseErrorHandler) {\n        return new ChainedIterator(iteratorFromItems([this, iterator]), baseErrorHandler);\n    }\n    /**\n     * Limits this stream to return at most `count` items.\n     *\n     * @param count The maximum number of items to provide from the stream. If\n     * a negative or undefined value is given, the entire stream is returned\n     *   unaltered.\n     */\n    take(count) {\n        if (count < 0 || count == null) {\n            return this;\n        }\n        return new TakeIterator(this, count);\n    }\n    /**\n     * Skips the first `count` items in this stream.\n     *\n     * @param count The number of items to skip.  If a negative or undefined\n     * value is given, the entire stream is returned unaltered.\n     */\n    skip(count) {\n        if (count < 0 || count == null) {\n            return this;\n        }\n        return new SkipIterator(this, count);\n    }\n    /**\n     * Prefetch the first `bufferSize` items in this stream.\n     *\n     * Note this prefetches Promises, but makes no guarantees about when those\n     * Promises resolve.\n     *\n     * @param bufferSize: An integer specifying the number of elements to be\n     *   prefetched.\n     */\n    prefetch(bufferSize) {\n        return new PrefetchIterator(this, bufferSize);\n    }\n    // TODO(soergel): deep sharded shuffle, where supported\n    /**\n     * Randomly shuffles the elements of this stream.\n     *\n     * @param bufferSize: An integer specifying the number of elements from\n     * this stream from which the new stream will sample.\n     * @param seed: (Optional.) An integer specifying the random seed that\n     * will be used to create the distribution.\n     */\n    shuffle(windowSize, seed) {\n        return new ShuffleIterator(this, windowSize, seed);\n    }\n    /**\n     * Force an iterator to execute serially: each next() call will await the\n     * prior one, so that they cannot execute concurrently.\n     */\n    serial() {\n        return new SerialIterator(this);\n    }\n}\n// ============================================================================\n// The following private classes serve to implement the chainable methods\n// on LazyIterator.  Unfortunately they can't be placed in separate files,\n// due to resulting trouble with circular imports.\n// ============================================================================\n// Iterators that just extend LazyIterator directly\n// ============================================================================\nclass ArrayIterator extends LazyIterator {\n    constructor(items) {\n        super();\n        this.items = items;\n        this.trav = 0;\n    }\n    summary() {\n        return `Array of ${this.items.length} items`;\n    }\n    async next() {\n        if (this.trav >= this.items.length) {\n            return { value: null, done: true };\n        }\n        const item = this.items[this.trav];\n        this.trav++;\n        return { value: deepClone(item), done: false };\n    }\n}\nclass FunctionCallIterator extends LazyIterator {\n    constructor(nextFn) {\n        super();\n        this.nextFn = nextFn;\n    }\n    summary() {\n        return `Function call`;\n    }\n    async next() {\n        try {\n            return this.nextFn();\n        }\n        catch (e) {\n            // Modify the error message but leave the stack trace intact\n            e.message =\n                `Error thrown while iterating through a dataset: ${e.message}`;\n            throw e;\n        }\n    }\n}\nclass SerialIterator extends LazyIterator {\n    constructor(upstream) {\n        super();\n        this.upstream = upstream;\n        this.lastRead = Promise.resolve({ value: null, done: false });\n    }\n    summary() {\n        return `${this.upstream.summary()} -> Serial`;\n    }\n    async next() {\n        // This sets this.lastRead to a new Promise right away, as opposed to\n        // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n        // would not work because this.nextRead would be updated only after the\n        // promise resolves.\n        this.lastRead = this.lastRead.then(() => this.serialNext());\n        return this.lastRead;\n    }\n    async serialNext() {\n        return this.upstream.next();\n    }\n}\nclass SkipIterator extends LazyIterator {\n    constructor(upstream, maxCount) {\n        super();\n        this.upstream = upstream;\n        this.maxCount = maxCount;\n        // Local state that should not be clobbered by out-of-order execution.\n        this.count = 0;\n        this.lastRead = Promise.resolve({ value: null, done: false });\n    }\n    summary() {\n        return `${this.upstream.summary()} -> Skip`;\n    }\n    async next() {\n        // This sets this.lastRead to a new Promise right away, as opposed to\n        // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n        // would not work because this.nextRead would be updated only after the\n        // promise resolves.\n        this.lastRead = this.lastRead.then(() => this.serialNext());\n        return this.lastRead;\n    }\n    async serialNext() {\n        // TODO(soergel): consider tradeoffs of reading in parallel, eg.\n        // collecting next() promises in an Array and then waiting for\n        // Promise.all() of those. Benefit: pseudo-parallel execution.  Drawback:\n        // maybe delayed GC.\n        while (this.count++ < this.maxCount) {\n            const skipped = await this.upstream.next();\n            // short-circuit if upstream is already empty\n            if (skipped.done) {\n                return skipped;\n            }\n            tf.dispose(skipped.value);\n        }\n        return this.upstream.next();\n    }\n}\nclass TakeIterator extends LazyIterator {\n    constructor(upstream, maxCount) {\n        super();\n        this.upstream = upstream;\n        this.maxCount = maxCount;\n        this.count = 0;\n    }\n    summary() {\n        return `${this.upstream.summary()} -> Take`;\n    }\n    async next() {\n        if (this.count++ >= this.maxCount) {\n            return { value: null, done: true };\n        }\n        return this.upstream.next();\n    }\n}\n// Note this batch just groups items into row-wise element arrays.\n// Rotating these to a column-wise representation happens only at the dataset\n// level.\nclass RowMajorBatchIterator extends LazyIterator {\n    constructor(upstream, batchSize, enableSmallLastBatch = true) {\n        super();\n        this.upstream = upstream;\n        this.batchSize = batchSize;\n        this.enableSmallLastBatch = enableSmallLastBatch;\n        this.lastRead = Promise.resolve({ value: null, done: false });\n    }\n    summary() {\n        return `${this.upstream.summary()} -> RowMajorBatch`;\n    }\n    async next() {\n        // This sets this.lastRead to a new Promise right away, as opposed to\n        // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n        // would not work because this.nextRead would be updated only after the\n        // promise resolves.\n        this.lastRead = this.lastRead.then(() => this.serialNext());\n        return this.lastRead;\n    }\n    async serialNext() {\n        const batch = [];\n        while (batch.length < this.batchSize) {\n            const item = await this.upstream.next();\n            if (item.done) {\n                if (this.enableSmallLastBatch && batch.length > 0) {\n                    return { value: batch, done: false };\n                }\n                return { value: null, done: true };\n            }\n            batch.push(item.value);\n        }\n        return { value: batch, done: false };\n    }\n}\nclass FilterIterator extends LazyIterator {\n    constructor(upstream, predicate) {\n        super();\n        this.upstream = upstream;\n        this.predicate = predicate;\n        this.lastRead = Promise.resolve({ value: null, done: false });\n    }\n    summary() {\n        return `${this.upstream.summary()} -> Filter`;\n    }\n    async next() {\n        // This sets this.lastRead to a new Promise right away, as opposed to\n        // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n        // would not work because this.nextRead would be updated only after the\n        // promise resolves.\n        this.lastRead = this.lastRead.then(() => this.serialNext());\n        return this.lastRead;\n    }\n    async serialNext() {\n        while (true) {\n            const item = await this.upstream.next();\n            if (item.done || this.predicate(item.value)) {\n                return item;\n            }\n            tf.dispose(item.value);\n        }\n    }\n}\nclass MapIterator extends LazyIterator {\n    constructor(upstream, transform) {\n        super();\n        this.upstream = upstream;\n        this.transform = transform;\n    }\n    summary() {\n        return `${this.upstream.summary()} -> Map`;\n    }\n    async next() {\n        const item = await this.upstream.next();\n        if (item.done) {\n            return { value: null, done: true };\n        }\n        const inputTensors = tf.tensor_util.getTensorsInContainer(item.value);\n        // Careful: the transform may mutate the item in place.\n        // That's why we have to remember the input Tensors above, and then\n        // below dispose only those that were not passed through to the output.\n        // Note too that the transform function is responsible for tidying\n        // any intermediate Tensors.  Here we are concerned only about the\n        // inputs.\n        const mapped = this.transform(item.value);\n        const outputTensors = tf.tensor_util.getTensorsInContainer(mapped);\n        // TODO(soergel) faster intersection\n        // TODO(soergel) move to tf.disposeExcept(in, out)?\n        for (const t of inputTensors) {\n            if (!tf.tensor_util.isTensorInList(t, outputTensors)) {\n                t.dispose();\n            }\n        }\n        return { value: mapped, done: false };\n    }\n}\nclass ErrorHandlingLazyIterator extends LazyIterator {\n    constructor(upstream, handler) {\n        super();\n        this.upstream = upstream;\n        this.handler = handler;\n        this.count = 0;\n        this.lastRead = Promise.resolve({ value: null, done: false });\n    }\n    summary() {\n        return `${this.upstream.summary()} -> handleErrors`;\n    }\n    async next() {\n        // This sets this.lastRead to a new Promise right away, as opposed to\n        // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n        // would not work because this.nextRead would be updated only after the\n        // promise resolves.\n        this.lastRead = this.lastRead.then(() => this.serialNext());\n        return this.lastRead;\n    }\n    async serialNext() {\n        while (true) {\n            try {\n                return await this.upstream.next();\n            }\n            catch (e) {\n                if (!this.handler(e)) {\n                    return { value: null, done: true };\n                }\n                // If the handler returns true, loop and fetch the next upstream item.\n                // If the upstream iterator throws an endless stream of errors, and if\n                // the handler says to ignore them, then we loop forever here.  That is\n                // the correct behavior-- it's up to the handler to decide when to stop.\n            }\n        }\n    }\n}\nclass AsyncMapIterator extends LazyIterator {\n    constructor(upstream, transform) {\n        super();\n        this.upstream = upstream;\n        this.transform = transform;\n    }\n    summary() {\n        return `${this.upstream.summary()} -> AsyncMap`;\n    }\n    async next() {\n        const item = await this.upstream.next();\n        if (item.done) {\n            return { value: null, done: true };\n        }\n        const inputTensors = tf.tensor_util.getTensorsInContainer(item.value);\n        // Careful: the transform may mutate the item in place.\n        // That's why we have to remember the input Tensors above, and then\n        // below dispose only those that were not passed through to the output.\n        // Note too that the transform function is responsible for tidying\n        // any intermediate Tensors.  Here we are concerned only about the\n        // inputs.\n        const mapped = await this.transform(item.value);\n        const outputTensors = tf.tensor_util.getTensorsInContainer(mapped);\n        // TODO(soergel) faster intersection\n        // TODO(soergel) move to tf.disposeExcept(in, out)?\n        for (const t of inputTensors) {\n            if (!tf.tensor_util.isTensorInList(t, outputTensors)) {\n                t.dispose();\n            }\n        }\n        return { value: mapped, done: false };\n    }\n}\n// Iterators that maintain a queue of pending items\n// ============================================================================\n/**\n * A base class for transforming streams that operate by maintaining an\n * output queue of elements that are ready to return via next().  This is\n * commonly required when the transformation is 1-to-many:  A call to next()\n * may trigger a call to the underlying stream, which will produce many\n * mapped elements of this stream-- of which we need to return only one, so\n * we have to queue the rest.\n */\nexport class OneToManyIterator extends LazyIterator {\n    constructor() {\n        super();\n        this.outputQueue = new GrowingRingBuffer();\n        this.lastRead = Promise.resolve({ value: null, done: false });\n    }\n    async next() {\n        // This sets this.lastRead to a new Promise right away, as opposed to\n        // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n        // would not work because this.nextRead would be updated only after the\n        // promise resolves.\n        this.lastRead = this.lastRead.then(() => this.serialNext());\n        return this.lastRead;\n    }\n    async serialNext() {\n        // Fetch so that the queue contains at least one item if possible.\n        // If the upstream source is exhausted, AND there are no items left in\n        // the output queue, then this stream is also exhausted.\n        while (this.outputQueue.length() === 0) {\n            // TODO(soergel): consider parallel reads.\n            if (!await this.pump()) {\n                return { value: null, done: true };\n            }\n        }\n        return { value: this.outputQueue.shift(), done: false };\n    }\n}\nclass FlatmapIterator extends OneToManyIterator {\n    constructor(upstream, transform) {\n        super();\n        this.upstream = upstream;\n        this.transform = transform;\n    }\n    summary() {\n        return `${this.upstream.summary()} -> Flatmap`;\n    }\n    async pump() {\n        const item = await this.upstream.next();\n        if (item.done) {\n            return false;\n        }\n        const inputTensors = tf.tensor_util.getTensorsInContainer(item.value);\n        // Careful: the transform may mutate the item in place.\n        // that's why we have to remember the input Tensors above, and then\n        // below dispose only those that were not passed through to the output.\n        // Note too that the transform function is responsible for tidying any\n        // intermediate Tensors.  Here we are concerned only about the inputs.\n        const mappedArray = this.transform(item.value);\n        const outputTensors = tf.tensor_util.getTensorsInContainer(mappedArray);\n        this.outputQueue.pushAll(mappedArray);\n        // TODO(soergel) faster intersection, and deduplicate outputTensors\n        // TODO(soergel) move to tf.disposeExcept(in, out)?\n        for (const t of inputTensors) {\n            if (!tf.tensor_util.isTensorInList(t, outputTensors)) {\n                t.dispose();\n            }\n        }\n        return true;\n    }\n}\n/**\n * Provides a `LazyIterator` that concatenates a stream of underlying\n * streams.\n *\n * Doing this in a concurrency-safe way requires some trickery.  In\n * particular, we want this stream to return the elements from the\n * underlying streams in the correct order according to when next() was\n * called, even if the resulting Promises resolve in a different order.\n */\nexport class ChainedIterator extends LazyIterator {\n    constructor(iterators, baseErrorHandler) {\n        super();\n        this.baseErrorHandler = baseErrorHandler;\n        // Strict Promise execution order:\n        // a next() call may not even begin until the previous one completes.\n        this.lastRead = null;\n        // Local state that should not be clobbered by out-of-order execution.\n        this.iterator = null;\n        this.moreIterators = iterators;\n    }\n    summary() {\n        const upstreamSummaries = 'TODO: fill in upstream of chained summaries';\n        return `${upstreamSummaries} -> Chained`;\n    }\n    async next() {\n        this.lastRead = this.readFromChain(this.lastRead);\n        return this.lastRead;\n    }\n    async readFromChain(lastRead) {\n        // Must await on the previous read since the previous read may have advanced\n        // the stream of streams, from which we need to read.\n        // This is unfortunate since we can't parallelize reads. Which means\n        // prefetching of chained streams is a no-op.\n        // One solution is to prefetch immediately upstream of this.\n        await lastRead;\n        if (this.iterator == null) {\n            const iteratorResult = await this.moreIterators.next();\n            if (iteratorResult.done) {\n                // No more streams to stream from.\n                return { value: null, done: true };\n            }\n            this.iterator = iteratorResult.value;\n            if (this.baseErrorHandler != null) {\n                this.iterator = this.iterator.handleErrors(this.baseErrorHandler);\n            }\n        }\n        const itemResult = await this.iterator.next();\n        if (itemResult.done) {\n            this.iterator = null;\n            return this.readFromChain(lastRead);\n        }\n        return itemResult;\n    }\n}\nexport var ZipMismatchMode;\n(function (ZipMismatchMode) {\n    ZipMismatchMode[ZipMismatchMode[\"FAIL\"] = 0] = \"FAIL\";\n    ZipMismatchMode[ZipMismatchMode[\"SHORTEST\"] = 1] = \"SHORTEST\";\n    ZipMismatchMode[ZipMismatchMode[\"LONGEST\"] = 2] = \"LONGEST\"; // use nulls for exhausted streams; use up the longest stream.\n})(ZipMismatchMode || (ZipMismatchMode = {}));\n/**\n * Provides a `LazyIterator` that zips together an array, dict, or nested\n * structure of `LazyIterator`s (and perhaps additional constants).\n *\n * The underlying streams must provide elements in a consistent order such\n * that they correspond.\n *\n * Typically, the underlying streams should have the same number of\n * elements. If they do not, the behavior is determined by the\n * `mismatchMode` argument.\n *\n * The nested structure of the `iterators` argument determines the\n * structure of elements in the resulting iterator.\n *\n * Doing this in a concurrency-safe way requires some trickery.  In\n * particular, we want this stream to return the elements from the\n * underlying streams in the correct order according to when next() was\n * called, even if the resulting Promises resolve in a different order.\n *\n * @param iterators: An array or object containing LazyIterators at the\n * leaves.\n * @param mismatchMode: Determines what to do when one underlying iterator\n * is exhausted before the others.  `ZipMismatchMode.FAIL` (the default)\n * causes an error to be thrown in this case.  `ZipMismatchMode.SHORTEST`\n * causes the zipped iterator to terminate with the furst underlying\n * streams, so elements remaining on the longer streams are ignored.\n * `ZipMismatchMode.LONGEST` causes the zipped stream to continue, filling\n * in nulls for the exhausted streams, until all streams are exhausted.\n */\nclass ZipIterator extends LazyIterator {\n    constructor(iterators, mismatchMode = ZipMismatchMode.FAIL) {\n        super();\n        this.iterators = iterators;\n        this.mismatchMode = mismatchMode;\n        this.count = 0;\n        this.currentPromise = null;\n    }\n    summary() {\n        const upstreamSummaries = 'TODO: fill in upstream of zip summaries';\n        return `{${upstreamSummaries}} -> Zip`;\n    }\n    async nextState(afterState) {\n        // This chaining ensures that the underlying next() are not even called\n        // before the previous ones have resolved.\n        await afterState;\n        // Collect underlying iterator \"done\" signals as a side effect in\n        // getNext()\n        let numIterators = 0;\n        let iteratorsDone = 0;\n        function getNext(container) {\n            if (container instanceof LazyIterator) {\n                const result = container.next();\n                return {\n                    value: result.then(x => {\n                        numIterators++;\n                        if (x.done) {\n                            iteratorsDone++;\n                        }\n                        return x.value;\n                    }),\n                    recurse: false\n                };\n            }\n            else {\n                return { value: null, recurse: true };\n            }\n        }\n        const mapped = await deepMapAndAwaitAll(this.iterators, getNext);\n        if (numIterators === iteratorsDone) {\n            // The streams have all ended.\n            return { value: null, done: true };\n        }\n        if (iteratorsDone > 0) {\n            switch (this.mismatchMode) {\n                case ZipMismatchMode.FAIL:\n                    throw new Error('Zipped streams should have the same length. ' +\n                        `Mismatched at element ${this.count}.`);\n                case ZipMismatchMode.SHORTEST:\n                    return { value: null, done: true };\n                case ZipMismatchMode.LONGEST:\n                default:\n                // Continue.  The exhausted streams already produced value: null.\n            }\n        }\n        this.count++;\n        return { value: mapped, done: false };\n    }\n    async next() {\n        this.currentPromise = this.nextState(this.currentPromise);\n        return this.currentPromise;\n    }\n}\n// Iterators that maintain a ring buffer of pending promises\n// ============================================================================\n/**\n * A stream that prefetches a given number of items from an upstream source,\n * returning them in FIFO order.\n *\n * Note this prefetches Promises, but makes no guarantees about when those\n * Promises resolve.\n */\nexport class PrefetchIterator extends LazyIterator {\n    constructor(upstream, bufferSize) {\n        super();\n        this.upstream = upstream;\n        this.bufferSize = bufferSize;\n        this.buffer = new RingBuffer(bufferSize);\n    }\n    summary() {\n        return `${this.upstream.summary()} -> Prefetch`;\n    }\n    /**\n     * Refill the prefetch buffer.  Returns only after the buffer is full, or\n     * the upstream source is exhausted.\n     */\n    refill() {\n        while (!this.buffer.isFull()) {\n            const v = this.upstream.next();\n            this.buffer.push(v);\n        }\n    }\n    next() {\n        this.refill();\n        // This shift will never throw an error because the buffer is always\n        // full after a refill. If the stream is exhausted, the buffer will be\n        // full of Promises that will resolve to the end-of-stream signal.\n        return this.buffer.shift();\n    }\n}\n/**\n * A stream that performs a sliding-window random shuffle on an upstream\n * source. This is like a `PrefetchIterator` except that the items are\n * returned in randomized order.  Mixing naturally improves as the buffer\n * size increases.\n */\nexport class ShuffleIterator extends PrefetchIterator {\n    constructor(upstream, windowSize, seed) {\n        super(upstream, windowSize);\n        this.upstream = upstream;\n        this.windowSize = windowSize;\n        // Local state that should not be clobbered by out-of-order execution.\n        this.upstreamExhausted = false;\n        this.random = seedrandom.alea(seed || tf.util.now().toString());\n        this.lastRead = Promise.resolve({ value: null, done: false });\n    }\n    async next() {\n        // This sets this.lastRead to a new Promise right away, as opposed to\n        // saying `await this.lastRead; this.lastRead = this.serialNext();` which\n        // would not work because this.nextRead would be updated only after the\n        // promise resolves.\n        this.lastRead = this.lastRead.then(() => this.serialNext());\n        return this.lastRead;\n    }\n    randomInt(max) {\n        return Math.floor(this.random() * max);\n    }\n    chooseIndex() {\n        return this.randomInt(this.buffer.length());\n    }\n    async serialNext() {\n        // TODO(soergel): consider performance\n        if (!this.upstreamExhausted) {\n            this.refill();\n        }\n        while (!this.buffer.isEmpty()) {\n            const chosenIndex = this.chooseIndex();\n            const result = await this.buffer.shuffleExcise(chosenIndex);\n            if (result.done) {\n                this.upstreamExhausted = true;\n            }\n            else {\n                this.refill();\n                return result;\n            }\n        }\n        return { value: null, done: true };\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF6eV9pdGVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtZGF0YS9zcmMvaXRlcmF0b3JzL2xhenlfaXRlcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQkc7QUFFSCxPQUFPLEtBQUssRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVDLE9BQU8sS0FBSyxVQUFVLE1BQU0sWUFBWSxDQUFDO0FBR3pDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsa0JBQWtCLEVBQXFDLE9BQU8sRUFBRSxTQUFTLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFPL0Msb0RBQW9EO0FBQ3BELGtFQUFrRTtBQUNsRSwwREFBMEQ7QUFFMUQ7O0dBRUc7QUFDSCxNQUFNLFVBQVUsaUJBQWlCLENBQUksS0FBVTtJQUM3QyxPQUFPLElBQUksYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ2xDLENBQUM7QUFFRDs7R0FFRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxLQUFhO0lBQ3BELElBQUksQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNkLE9BQU8sb0JBQW9CLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxNQUFNLFVBQVUsb0JBQW9CLENBQ2hDLElBQ2lEO0lBQ25ELE9BQU8sSUFBSSxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7O0dB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QUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzthQUMvQjtpQkFBTTtnQkFDTCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2QsT0FBTyxNQUFNLENBQUM7YUFDZjtTQUNGO1FBQ0QsT0FBTyxFQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBQyxDQUFDO0lBQ25DLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCAqIGFzIHRmIGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBzZWVkcmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuXG5pbXBvcnQge0NvbnRhaW5lcn0gZnJvbSAnLi4vdHlwZXMnO1xuaW1wb3J0IHtkZWVwQ2xvbmV9IGZyb20gJy4uL3V0aWwvZGVlcF9jbG9uZSc7XG5pbXBvcnQge2RlZXBNYXBBbmRBd2FpdEFsbCwgRGVlcE1hcEFzeW5jUmVzdWx0LCBEZWVwTWFwUmVzdWx0LCBkZWVwWmlwLCB6aXBUb0xpc3R9IGZyb20gJy4uL3V0aWwvZGVlcF9tYXAnO1xuaW1wb3J0IHtHcm93aW5nUmluZ0J1ZmZlcn0gZnJvbSAnLi4vdXRpbC9ncm93aW5nX3JpbmdfYnVmZmVyJztcbmltcG9ydCB7UmluZ0J1ZmZlcn0gZnJvbSAnLi4vdXRpbC9yaW5nX2J1ZmZlcic7XG5cbi8qKlxuICogQSBuZXN0ZWQgc3RydWN0dXJlIG9mIExhenlJdGVyYXRvcnMsIHVzZWQgYXMgdGhlIGlucHV0IHRvIHppcCgpLlxuICovXG5leHBvcnQgdHlwZSBJdGVyYXRvckNvbnRhaW5lciA9IENvbnRhaW5lcjxMYXp5SXRlcmF0b3I8dGYuVGVuc29yQ29udGFpbmVyPj47XG5cbi8vIEhlcmUgd2UgaW1wbGVtZW50IGEgc2ltcGxlIGFzeW5jaHJvbm91cyBpdGVyYXRvci5cbi8vIFRoaXMgbGV0cyB1cyBhdm9pZCB1c2luZyBlaXRoZXIgdGhpcmQtcGFydHkgc3RyZWFtIGxpYnJhcmllcyBvclxuLy8gcmVjZW50IFR5cGVTY3JpcHQgbGFuZ3VhZ2Ugc3VwcG9ydCByZXF1aXJpbmcgcG9seWZpbGxzLlxuXG4vKipcbiAqIENyZWF0ZSBhIGBMYXp5SXRlcmF0b3JgIGZyb20gYW4gYXJyYXkgb2YgaXRlbXMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRvckZyb21JdGVtczxUPihpdGVtczogVFtdKTogTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgcmV0dXJuIG5ldyBBcnJheUl0ZXJhdG9yKGl0ZW1zKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgTGF6eUl0ZXJhdG9yYCBvZiBpbmNyZW1lbnRpbmcgaW50ZWdlcnMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRvckZyb21JbmNyZW1lbnRpbmcoc3RhcnQ6IG51bWJlcik6IExhenlJdGVyYXRvcjxudW1iZXI+IHtcbiAgbGV0IGkgPSBzdGFydDtcbiAgcmV0dXJuIGl0ZXJhdG9yRnJvbUZ1bmN0aW9uKCgpID0+ICh7dmFsdWU6IGkrKywgZG9uZTogZmFsc2V9KSk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYExhenlJdGVyYXRvcmAgZnJvbSBhIGZ1bmN0aW9uLlxuICpcbiAqIGBgYGpzXG4gKiBsZXQgaSA9IC0xO1xuICogY29uc3QgZnVuYyA9ICgpID0+XG4gKiAgICArK2kgPCA1ID8ge3ZhbHVlOiBpLCBkb25lOiBmYWxzZX0gOiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICogY29uc3QgaXRlciA9IHRmLmRhdGEuaXRlcmF0b3JGcm9tRnVuY3Rpb24oZnVuYyk7XG4gKiBhd2FpdCBpdGVyLmZvckVhY2hBc3luYyhlID0+IGNvbnNvbGUubG9nKGUpKTtcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSBmdW5jIEEgZnVuY3Rpb24gdGhhdCBwcm9kdWNlcyBkYXRhIG9uIGVhY2ggY2FsbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGl0ZXJhdG9yRnJvbUZ1bmN0aW9uPFQ+KFxuICAgIGZ1bmM6ICgpID0+XG4gICAgICAgIEl0ZXJhdG9yUmVzdWx0PFQ+fCBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+Pik6IExhenlJdGVyYXRvcjxUPiB7XG4gIHJldHVybiBuZXcgRnVuY3Rpb25DYWxsSXRlcmF0b3IoZnVuYyk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgYExhenlJdGVyYXRvcmAgYnkgY29uY2F0ZW5hdGluZyB1bmRlcmx5aW5nIHN0cmVhbXMsIHdoaWNoIGFyZVxuICogdGhlbXNlbHZlcyBwcm92aWRlZCBhcyBhIHN0cmVhbS5cbiAqXG4gKiBUaGlzIGNhbiBhbHNvIGJlIHRob3VnaHQgb2YgYXMgYSBcInN0cmVhbSBmbGF0dGVuXCIgb3BlcmF0aW9uLlxuICpcbiAqIEBwYXJhbSBiYXNlSXRlcmF0b3JzIEEgc3RyZWFtIG9mIHN0cmVhbXMgdG8gYmUgY29uY2F0ZW5hdGVkLlxuICogQHBhcmFtIGJhc2VFcnJvckhhbmRsZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdGhhdCBjYW4gaW50ZXJjZXB0IGBFcnJvcmBzXG4gKiAgIHJhaXNlZCBkdXJpbmcgYSBgbmV4dCgpYCBjYWxsIG9uIHRoZSBiYXNlIHN0cmVhbS4gIFRoaXMgZnVuY3Rpb24gY2FuIGRlY2lkZVxuICogICB3aGV0aGVyIHRoZSBlcnJvciBzaG91bGQgYmUgcHJvcGFnYXRlZCwgd2hldGhlciB0aGUgZXJyb3Igc2hvdWxkIGJlXG4gKiAgIGlnbm9yZWQsIG9yIHdoZXRoZXIgdGhlIGJhc2Ugc3RyZWFtIHNob3VsZCBiZSB0ZXJtaW5hdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXRlcmF0b3JGcm9tQ29uY2F0ZW5hdGVkPFQ+KFxuICAgIGJhc2VJdGVyYXRvcnM6IExhenlJdGVyYXRvcjxMYXp5SXRlcmF0b3I8VD4+LFxuICAgIGJhc2VFcnJvckhhbmRsZXI/OiAoZTogRXJyb3IpID0+IGJvb2xlYW4pOiBMYXp5SXRlcmF0b3I8VD4ge1xuICByZXR1cm4gbmV3IENoYWluZWRJdGVyYXRvcihiYXNlSXRlcmF0b3JzLCBiYXNlRXJyb3JIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgTGF6eUl0ZXJhdG9yYCBieSBjb25jYXRlbmF0aW5nIHN0cmVhbXMgcHJvZHVjZWQgYnkgY2FsbGluZyBhXG4gKiBzdHJlYW0tZ2VuZXJhdGluZyBmdW5jdGlvbiBhIGdpdmVuIG51bWJlciBvZiB0aW1lcy5cbiAqXG4gKiBTaW5jZSBhIGBMYXp5SXRlcmF0b3JgIGlzIHJlYWQtb25jZSwgaXQgY2Fubm90IGJlIHJlcGVhdGVkLCBidXQgdGhpc1xuICogZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gYWNoaWV2ZSBhIHNpbWlsYXIgZWZmZWN0OlxuICpcbiAqICAgTGF6eUl0ZXJhdG9yLm9mQ29uY2F0ZW5hdGVkRnVuY3Rpb24oKCkgPT4gbmV3IE15SXRlcmF0b3IoKSwgNik7XG4gKlxuICogQHBhcmFtIGl0ZXJhdG9yRnVuYzogQSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIGEgbmV3IHN0cmVhbSBvbiBlYWNoIGNhbGwuXG4gKiBAcGFyYW0gY291bnQ6IFRoZSBudW1iZXIgb2YgdGltZXMgdG8gY2FsbCB0aGUgZnVuY3Rpb24uXG4gKiBAcGFyYW0gYmFzZUVycm9ySGFuZGxlciBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGNhbiBpbnRlcmNlcHQgYEVycm9yYHNcbiAqICAgcmFpc2VkIGR1cmluZyBhIGBuZXh0KClgIGNhbGwgb24gdGhlIGJhc2Ugc3RyZWFtLiAgVGhpcyBmdW5jdGlvbiBjYW4gZGVjaWRlXG4gKiAgIHdoZXRoZXIgdGhlIGVycm9yIHNob3VsZCBiZSBwcm9wYWdhdGVkLCB3aGV0aGVyIHRoZSBlcnJvciBzaG91bGQgYmVcbiAqICAgaWdub3JlZCwgb3Igd2hldGhlciB0aGUgYmFzZSBzdHJlYW0gc2hvdWxkIGJlIHRlcm1pbmF0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRvckZyb21Db25jYXRlbmF0ZWRGdW5jdGlvbjxUPihcbiAgICBpdGVyYXRvckZ1bmM6ICgpID0+IEl0ZXJhdG9yUmVzdWx0PExhenlJdGVyYXRvcjxUPj4sIGNvdW50OiBudW1iZXIsXG4gICAgYmFzZUVycm9ySGFuZGxlcj86IChlOiBFcnJvcikgPT4gYm9vbGVhbik6IExhenlJdGVyYXRvcjxUPiB7XG4gIHJldHVybiBpdGVyYXRvckZyb21Db25jYXRlbmF0ZWQoXG4gICAgICBpdGVyYXRvckZyb21GdW5jdGlvbihpdGVyYXRvckZ1bmMpLnRha2UoY291bnQpLCBiYXNlRXJyb3JIYW5kbGVyKTtcbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBgTGF6eUl0ZXJhdG9yYCBieSB6aXBwaW5nIHRvZ2V0aGVyIGFuIGFycmF5LCBkaWN0LCBvciBuZXN0ZWRcbiAqIHN0cnVjdHVyZSBvZiBgTGF6eUl0ZXJhdG9yYHMgKGFuZCBwZXJoYXBzIGFkZGl0aW9uYWwgY29uc3RhbnRzKS5cbiAqXG4gKiBUaGUgdW5kZXJseWluZyBzdHJlYW1zIG11c3QgcHJvdmlkZSBlbGVtZW50cyBpbiBhIGNvbnNpc3RlbnQgb3JkZXIgc3VjaFxuICogdGhhdCB0aGV5IGNvcnJlc3BvbmQuXG4gKlxuICogVHlwaWNhbGx5LCB0aGUgdW5kZXJseWluZyBzdHJlYW1zIHNob3VsZCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZlxuICogZWxlbWVudHMuIElmIHRoZXkgZG8gbm90LCB0aGUgYmVoYXZpb3IgaXMgZGV0ZXJtaW5lZCBieSB0aGVcbiAqIGBtaXNtYXRjaE1vZGVgIGFyZ3VtZW50LlxuICpcbiAqIFRoZSBuZXN0ZWQgc3RydWN0dXJlIG9mIHRoZSBgaXRlcmF0b3JzYCBhcmd1bWVudCBkZXRlcm1pbmVzIHRoZVxuICogc3RydWN0dXJlIG9mIGVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgaXRlcmF0b3IuXG4gKlxuICogQHBhcmFtIGl0ZXJhdG9yczogQW4gYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5pbmcgTGF6eUl0ZXJhdG9ycyBhdCB0aGVcbiAqIGxlYXZlcy5cbiAqIEBwYXJhbSBtaXNtYXRjaE1vZGU6IERldGVybWluZXMgd2hhdCB0byBkbyB3aGVuIG9uZSB1bmRlcmx5aW5nIGl0ZXJhdG9yXG4gKiBpcyBleGhhdXN0ZWQgYmVmb3JlIHRoZSBvdGhlcnMuICBgWmlwTWlzbWF0Y2hNb2RlLkZBSUxgICh0aGUgZGVmYXVsdClcbiAqIGNhdXNlcyBhbiBlcnJvciB0byBiZSB0aHJvd24gaW4gdGhpcyBjYXNlLiAgYFppcE1pc21hdGNoTW9kZS5TSE9SVEVTVGBcbiAqIGNhdXNlcyB0aGUgemlwcGVkIGl0ZXJhdG9yIHRvIHRlcm1pbmF0ZSB3aXRoIHRoZSBmdXJzdCB1bmRlcmx5aW5nXG4gKiBzdHJlYW1zLCBzbyBlbGVtZW50cyByZW1haW5pbmcgb24gdGhlIGxvbmdlciBzdHJlYW1zIGFyZSBpZ25vcmVkLlxuICogYFppcE1pc21hdGNoTW9kZS5MT05HRVNUYCBjYXVzZXMgdGhlIHppcHBlZCBzdHJlYW0gdG8gY29udGludWUsIGZpbGxpbmdcbiAqIGluIG51bGxzIGZvciB0aGUgZXhoYXVzdGVkIHN0cmVhbXMsIHVudGlsIGFsbCBzdHJlYW1zIGFyZSBleGhhdXN0ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRvckZyb21aaXBwZWQ8TyBleHRlbmRzIHRmLlRlbnNvckNvbnRhaW5lcj4oXG4gICAgaXRlcmF0b3JzOiBJdGVyYXRvckNvbnRhaW5lcixcbiAgICBtaXNtYXRjaE1vZGU6IFppcE1pc21hdGNoTW9kZSA9IFppcE1pc21hdGNoTW9kZS5GQUlMKTogTGF6eUl0ZXJhdG9yPE8+IHtcbiAgcmV0dXJuIG5ldyBaaXBJdGVyYXRvcjxPPihpdGVyYXRvcnMsIG1pc21hdGNoTW9kZSk7XG59XG5cbi8qKlxuICogQW4gYXN5bmNocm9ub3VzIGl0ZXJhdG9yLCBwcm92aWRpbmcgbGF6eSBhY2Nlc3MgdG8gYSBwb3RlbnRpYWxseVxuICogdW5ib3VuZGVkIHN0cmVhbSBvZiBlbGVtZW50cy5cbiAqXG4gKiBJdGVyYXRvciBjYW4gYmUgb2J0YWluZWQgZnJvbSBhIGRhdGFzZXQ6XG4gKiBgY29uc3QgaXRlciA9IGF3YWl0IGRhdGFzZXQuaXRlcmF0b3IoKTtgXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBMYXp5SXRlcmF0b3I8VD4ge1xuICAvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgQXN5bmNJdGVyYXRvcjxUPiwgYnV0IHdlIGhhdmUgbm90IHlldCBzZXQgdGhlXG4gIC8vIFR5cGVTY3JpcHQgLS1kb3dubGV2ZWxJdGVyYXRpb24gZmxhZyB0byBlbmFibGUgdGhhdC5cblxuICBhYnN0cmFjdCBzdW1tYXJ5KCk6IHN0cmluZztcblxuICAvKipcbiAgICogUmV0dXJucyBhIGBQcm9taXNlYCBmb3IgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3RyZWFtLlxuICAgKlxuICAgKiBXaGVuIGFuIGl0ZW0gY2FuIGJlIHByb3ZpZGVkIHN1Y2Nlc3NmdWxseSwgdGhlIHJldHVybiB2YWx1ZSBpc1xuICAgKiBge3ZhbHVlOlQsIGRvbmU6ZmFsc2V9YC5cbiAgICpcbiAgICogQ2FsbGluZyBuZXh0KCkgb24gYSBjbG9zZWQgc3RyZWFtIHJldHVybnMgYHt2YWx1ZTpudWxsLCBkb25lOnRydWV9YC5cbiAgICovXG4gIGFic3RyYWN0IGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj47XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgYWxsIHJlbWFpbmluZyBlbGVtZW50cyBvZiBhIGJvdW5kZWQgc3RyZWFtIGludG8gYW4gYXJyYXkuXG4gICAqIE9idmlvdXNseSB0aGlzIHdpbGwgc3VjY2VlZCBvbmx5IGZvciBzbWFsbCBzdHJlYW1zIHRoYXQgZml0IGluIG1lbW9yeS5cbiAgICogVXNlZnVsIGZvciB0ZXN0aW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIGFuIGFycmF5IG9mIHN0cmVhbSBlbGVtZW50cywgd2hpY2ggd2lsbCByZXNvbHZlXG4gICAqICAgd2hlbiB0aGUgc3RyZWFtIGlzIGV4aGF1c3RlZC5cbiAgICovXG4gIGFzeW5jIHRvQXJyYXkoKTogUHJvbWlzZTxUW10+IHtcbiAgICBjb25zdCByZXN1bHQ6IFRbXSA9IFtdO1xuICAgIGxldCB4ID0gYXdhaXQgdGhpcy5uZXh0KCk7XG4gICAgd2hpbGUgKCF4LmRvbmUpIHtcbiAgICAgIHJlc3VsdC5wdXNoKHgudmFsdWUpO1xuICAgICAgeCA9IGF3YWl0IHRoaXMubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIENvbGxlY3QgYWxsIGVsZW1lbnRzIG9mIHRoaXMgZGF0YXNldCBpbnRvIGFuIGFycmF5IHdpdGggcHJlZmV0Y2hpbmcgMTAwXG4gICAqIGVsZW1lbnRzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZywgYmVjYXVzZSB0aGUgcHJlZmV0Y2ggY2hhbmdlcyB0aGVcbiAgICogb3JkZXIgaW4gd2hpY2ggdGhlIFByb21pc2VzIGFyZSByZXNvbHZlZCBhbG9uZyB0aGUgcHJvY2Vzc2luZyBwaXBlbGluZS5cbiAgICogVGhpcyBtYXkgaGVscCBleHBvc2UgYnVncyB3aGVyZSByZXN1bHRzIGFyZSBkZXBlbmRlbnQgb24gdGhlIG9yZGVyIG9mXG4gICAqIFByb21pc2UgcmVzb2x1dGlvbiByYXRoZXIgdGhhbiBvbiB0aGUgbG9naWNhbCBvcmRlciBvZiB0aGUgc3RyZWFtIChpLmUuLFxuICAgKiBkdWUgdG8gaGlkZGVuIG11dGFibGUgc3RhdGUpLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIFByb21pc2UgZm9yIGFuIGFycmF5IG9mIHN0cmVhbSBlbGVtZW50cywgd2hpY2ggd2lsbCByZXNvbHZlXG4gICAqICAgd2hlbiB0aGUgc3RyZWFtIGlzIGV4aGF1c3RlZC5cbiAgICovXG4gIGFzeW5jIHRvQXJyYXlGb3JUZXN0KCk6IFByb21pc2U8VFtdPiB7XG4gICAgY29uc3Qgc3RyZWFtID0gdGhpcy5wcmVmZXRjaCgxMDApO1xuICAgIGNvbnN0IHJlc3VsdDogVFtdID0gW107XG4gICAgbGV0IHggPSBhd2FpdCBzdHJlYW0ubmV4dCgpO1xuICAgIHdoaWxlICgheC5kb25lKSB7XG4gICAgICByZXN1bHQucHVzaCh4LnZhbHVlKTtcbiAgICAgIHggPSBhd2FpdCBzdHJlYW0ubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgaXRlbXMgZnJvbSB0aGUgc3RyZWFtIHVudGlsIGl0IGlzIGV4aGF1c3RlZC5cbiAgICpcbiAgICogVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gdGhlIHN0cmVhbSBoYXMgc2lkZSBlZmZlY3RzIGJ1dCBubyBvdXRwdXQuICBJblxuICAgKiB0aGF0IGNhc2UsIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlIHN0cmVhbSB3aWxsIGJlXG4gICAqIGZ1bGx5IHByb2Nlc3NlZC5cbiAgICovXG4gIGFzeW5jIHJlc29sdmVGdWxseSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBsZXQgeCA9IGF3YWl0IHRoaXMubmV4dCgpO1xuICAgIHdoaWxlICgheC5kb25lKSB7XG4gICAgICB4ID0gYXdhaXQgdGhpcy5uZXh0KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIERyYXcgaXRlbXMgZnJvbSB0aGUgc3RyZWFtIHVudGlsIGl0IGlzIGV4aGF1c3RlZCwgb3IgYSBwcmVkaWNhdGUgZmFpbHMuXG4gICAqXG4gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHRoZSBzdHJlYW0gaGFzIHNpZGUgZWZmZWN0cyBidXQgbm8gb3V0cHV0LiAgSW5cbiAgICogdGhhdCBjYXNlLCBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyB0aGF0IHRoZSBzdHJlYW0gd2lsbCBiZVxuICAgKiBmdWxseSBwcm9jZXNzZWQuXG4gICAqL1xuICBhc3luYyByZXNvbHZlV2hpbGUocHJlZGljYXRlOiAocjogVCkgPT4gYm9vbGVhbik6IFByb21pc2U8dm9pZD4ge1xuICAgIGxldCB4ID0gYXdhaXQgdGhpcy5uZXh0KCk7XG4gICAgbGV0IHNob3VsZENvbnRpbnVlID0gcHJlZGljYXRlKHgudmFsdWUpO1xuICAgIHdoaWxlICgoIXguZG9uZSkgJiYgc2hvdWxkQ29udGludWUpIHtcbiAgICAgIHggPSBhd2FpdCB0aGlzLm5leHQoKTtcbiAgICAgIHNob3VsZENvbnRpbnVlID0gcHJlZGljYXRlKHgudmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGVzIGVycm9ycyB0aHJvd24gb24gdGhpcyBzdHJlYW0gdXNpbmcgYSBwcm92aWRlZCBoYW5kbGVyIGZ1bmN0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gaGFuZGxlciBBIGZ1bmN0aW9uIHRoYXQgaGFuZGxlcyBhbnkgYEVycm9yYCB0aHJvd24gZHVyaW5nIGEgYG5leHQoKWBcbiAgICogICBjYWxsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBzaG91bGQgY29udGludWUgKGRyb3BwaW5nIHRoZSBmYWlsZWRcbiAgICogICBjYWxsKSBvciBmYWxzZSBpZiB0aGUgc3RyZWFtIHNob3VsZCBxdWlldGx5IHRlcm1pbmF0ZS4gIElmIHRoZSBoYW5kbGVyXG4gICAqICAgaXRzZWxmIHRocm93cyAob3IgcmV0aHJvd3MpIGFuIGBFcnJvcmAsIHRoYXQgd2lsbCBiZSBwcm9wYWdhdGVkLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBMYXp5SXRlcmF0b3JgIG9mIGVsZW1lbnRzIHBhc3NlZCB0aHJvdWdoIGZyb20gdXBzdHJlYW0sXG4gICAqICAgcG9zc2libHkgZmlsdGVyaW5nIG9yIHRlcm1pbmF0aW5nIG9uIHVwc3RyZWFtIGBuZXh0KClgIGNhbGxzIHRoYXRcbiAgICogICB0aHJvdyBhbiBgRXJyb3JgLlxuICAgKi9cbiAgaGFuZGxlRXJyb3JzKGhhbmRsZXI6IChlcnJvcjogRXJyb3IpID0+IGJvb2xlYW4pOiBMYXp5SXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBuZXcgRXJyb3JIYW5kbGluZ0xhenlJdGVyYXRvcih0aGlzLCBoYW5kbGVyKTtcbiAgfVxuXG4gIC8vIFRPRE8oc29lcmdlbCk6IEltcGxlbWVudCByZWR1Y2UoKSBldGMuXG5cbiAgLyoqXG4gICAqIEZpbHRlcnMgdGhpcyBzdHJlYW0gYWNjb3JkaW5nIHRvIGBwcmVkaWNhdGVgLlxuICAgKlxuICAgKiBAcGFyYW0gcHJlZGljYXRlIEEgZnVuY3Rpb24gbWFwcGluZyBhIHN0cmVhbSBlbGVtZW50IHRvIGEgYm9vbGVhbiBvciBhXG4gICAqIGBQcm9taXNlYCBmb3Igb25lLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBMYXp5SXRlcmF0b3JgIG9mIGVsZW1lbnRzIGZvciB3aGljaCB0aGUgcHJlZGljYXRlIHdhcyB0cnVlLlxuICAgKi9cbiAgZmlsdGVyKHByZWRpY2F0ZTogKHZhbHVlOiBUKSA9PiBib29sZWFuKTogTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gbmV3IEZpbHRlckl0ZXJhdG9yKHRoaXMsIHByZWRpY2F0ZSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyB0aGlzIHN0cmVhbSB0aHJvdWdoIGEgMS10by0xIHRyYW5zZm9ybS5cbiAgICpcbiAgICogQHBhcmFtIHRyYW5zZm9ybSBBIGZ1bmN0aW9uIG1hcHBpbmcgYSBzdHJlYW0gZWxlbWVudCB0byBhIHRyYW5zZm9ybWVkXG4gICAqICAgZWxlbWVudC5cbiAgICpcbiAgICogQHJldHVybnMgQSBgTGF6eUl0ZXJhdG9yYCBvZiB0cmFuc2Zvcm1lZCBlbGVtZW50cy5cbiAgICovXG4gIG1hcDxPPih0cmFuc2Zvcm06ICh2YWx1ZTogVCkgPT4gTyk6IExhenlJdGVyYXRvcjxPPiB7XG4gICAgcmV0dXJuIG5ldyBNYXBJdGVyYXRvcih0aGlzLCB0cmFuc2Zvcm0pO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgdGhpcyBzdHJlYW0gdGhyb3VnaCBhbiBhc3luYyAxLXRvLTEgdHJhbnNmb3JtLlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtIEEgZnVuY3Rpb24gbWFwcGluZyBhIHN0cmVhbSBlbGVtZW50IHRvIGEgYFByb21pc2VgIGZvciBhXG4gICAqICAgdHJhbnNmb3JtZWQgc3RyZWFtIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIEEgYExhenlJdGVyYXRvcmAgb2YgdHJhbnNmb3JtZWQgZWxlbWVudHMuXG4gICAqL1xuICBtYXBBc3luYzxPPih0cmFuc2Zvcm06ICh2YWx1ZTogVCkgPT4gUHJvbWlzZTxPPik6IExhenlJdGVyYXRvcjxPPiB7XG4gICAgcmV0dXJuIG5ldyBBc3luY01hcEl0ZXJhdG9yKHRoaXMsIHRyYW5zZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogTWFwcyB0aGlzIHN0cmVhbSB0aHJvdWdoIGEgMS10by0xIHRyYW5zZm9ybSwgZm9yY2luZyBzZXJpYWwgZXhlY3V0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gdHJhbnNmb3JtIEEgZnVuY3Rpb24gbWFwcGluZyBhIHN0cmVhbSBlbGVtZW50IHRvIGEgdHJhbnNmb3JtZWRcbiAgICogICBlbGVtZW50LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIGBMYXp5SXRlcmF0b3JgIG9mIHRyYW5zZm9ybWVkIGVsZW1lbnRzLlxuICAgKi9cbiAgc2VyaWFsTWFwQXN5bmM8Tz4odHJhbnNmb3JtOiAodmFsdWU6IFQpID0+IFByb21pc2U8Tz4pOiBMYXp5SXRlcmF0b3I8Tz4ge1xuICAgIHJldHVybiBuZXcgQXN5bmNNYXBJdGVyYXRvcih0aGlzLCB0cmFuc2Zvcm0pLnNlcmlhbCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIE1hcHMgdGhpcyBzdHJlYW0gdGhyb3VnaCBhIDEtdG8tbWFueSB0cmFuc2Zvcm0uXG4gICAqXG4gICAqIEBwYXJhbSB0cmFuc2Zvcm0gQSBmdW5jdGlvbiBtYXBwaW5nIGEgc3RyZWFtIGVsZW1lbnQgdG8gYW4gYXJyYXkgb2ZcbiAgICogICB0cmFuc2Zvcm1lZCBlbGVtZW50cy5cbiAgICpcbiAgICogQHJldHVybnMgQSBgRGF0YVN0cmVhbWAgb2YgdHJhbnNmb3JtZWQgZWxlbWVudHMuXG4gICAqL1xuICBmbGF0bWFwPE8+KHRyYW5zZm9ybTogKHZhbHVlOiBUKSA9PiBPW10pOiBMYXp5SXRlcmF0b3I8Tz4ge1xuICAgIHJldHVybiBuZXcgRmxhdG1hcEl0ZXJhdG9yKHRoaXMsIHRyYW5zZm9ybSk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBmdW5jdGlvbiB0byBldmVyeSBlbGVtZW50IG9mIHRoZSBzdHJlYW0uXG4gICAqXG4gICAqIEBwYXJhbSBmIEEgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBzdHJlYW0gZWxlbWVudC5cbiAgICovXG4gIGFzeW5jIGZvckVhY2hBc3luYyhmOiAodmFsdWU6IFQpID0+IHZvaWQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5tYXAoZikucmVzb2x2ZUZ1bGx5KCk7XG4gIH1cblxuICAvKipcbiAgICogQXBwbHkgYSBmdW5jdGlvbiB0byBldmVyeSBlbGVtZW50IG9mIHRoZSBzdHJlYW0sIGZvcmNpbmcgc2VyaWFsIGV4ZWN1dGlvbi5cbiAgICpcbiAgICogQHBhcmFtIGYgQSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIHN0cmVhbSBlbGVtZW50LiAgU2hvdWxkIHJldHVybiAndHJ1ZSdcbiAgICogICB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzdHJlYW0gc2hvdWxkIGNvbnRpbnVlLCBvciAnZmFsc2UnIHRvIGNhdXNlIGl0IHRvXG4gICAqICAgdGVybWluYXRlLlxuICAgKi9cbiAgYXN5bmMgc2VyaWFsRm9yRWFjaChmOiAodmFsdWU6IFQpID0+IFByb21pc2U8Ym9vbGVhbj4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5zZXJpYWxNYXBBc3luYyhmKS5yZXNvbHZlV2hpbGUoeCA9PiAoeCA9PT0gdHJ1ZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwcyBlbGVtZW50cyBpbnRvIGJhdGNoZXMsIHJlcHJlc2VudGVkIGFzIGFycmF5cyBvZiBlbGVtZW50cy5cbiAgICpcbiAgICogV2UgY2FuIHRoaW5rIG9mIHRoZSBlbGVtZW50cyBvZiB0aGlzIGl0ZXJhdG9yIGFzICdyb3dzJyAoZXZlbiBpZiB0aGV5IGFyZVxuICAgKiBuZXN0ZWQgc3RydWN0dXJlcykuICBCeSB0aGUgc2FtZSB0b2tlbiwgY29uc2VjdXRpdmUgdmFsdWVzIGZvciBhIGdpdmVuXG4gICAqIGtleSB3aXRoaW4gdGhlIGVsZW1lbnRzIGZvcm0gYSAnY29sdW1uJy4gIFRoaXMgbWF0Y2hlcyB0aGUgdXN1YWwgc2Vuc2Ugb2ZcbiAgICogJ3JvdycgYW5kICdjb2x1bW4nIHdoZW4gcHJvY2Vzc2luZyB0YWJ1bGFyIGRhdGEgKGUuZy4sIHBhcnNpbmcgYSBDU1YpLlxuICAgKlxuICAgKiBUaHVzLCBcIlJvdy1tYWpvclwiIG1lYW5zIHRoYXQgdGhlIHJlc3VsdGluZyBiYXRjaCBpcyBzaW1wbHkgYSBjb2xsZWN0aW9uIG9mXG4gICAqIHJvd3M6IGBbcm93MSwgcm93Miwgcm93MywgLi4uXWAuICBUaGlzIGlzIGNvbnRyYXN0IHRvIHRoZSBjb2x1bW4tbWFqb3JcbiAgICogZm9ybSwgd2hpY2ggaXMgbmVlZGVkIGZvciB2ZWN0b3JpemVkIGNvbXB1dGF0aW9uLlxuICAgKlxuICAgKiBAcGFyYW0gYmF0Y2hTaXplIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZGVzaXJlZCBwZXIgYmF0Y2guXG4gICAqIEBwYXJhbSBzbWFsbExhc3RCYXRjaCBXaGV0aGVyIHRvIGVtaXQgdGhlIGZpbmFsIGJhdGNoIHdoZW4gaXQgaGFzIGZld2VyXG4gICAqICAgdGhhbiBiYXRjaFNpemUgZWxlbWVudHMuIERlZmF1bHQgdHJ1ZS5cbiAgICogQHJldHVybnMgQSBgTGF6eUl0ZXJhdG9yYCBvZiBiYXRjaGVzIG9mIGVsZW1lbnRzLCByZXByZXNlbnRlZCBhcyBhcnJheXNcbiAgICogICBvZiB0aGUgb3JpZ2luYWwgZWxlbWVudCB0eXBlLlxuICAgKi9cbiAgcm93TWFqb3JCYXRjaChiYXRjaFNpemU6IG51bWJlciwgc21hbGxMYXN0QmF0Y2ggPSB0cnVlKTogTGF6eUl0ZXJhdG9yPFRbXT4ge1xuICAgIHJldHVybiBuZXcgUm93TWFqb3JCYXRjaEl0ZXJhdG9yKHRoaXMsIGJhdGNoU2l6ZSwgc21hbGxMYXN0QmF0Y2gpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdyb3VwcyBlbGVtZW50cyBpbnRvIGJhdGNoZXMsIHJlcHJlc2VudGVkIGluIGNvbHVtbi1tYWpvciBmb3JtLlxuICAgKlxuICAgKiBXZSBjYW4gdGhpbmsgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgaXRlcmF0b3IgYXMgJ3Jvd3MnIChldmVuIGlmIHRoZXkgYXJlXG4gICAqIG5lc3RlZCBzdHJ1Y3R1cmVzKS4gIEJ5IHRoZSBzYW1lIHRva2VuLCBjb25zZWN1dGl2ZSB2YWx1ZXMgZm9yIGEgZ2l2ZW5cbiAgICoga2V5IHdpdGhpbiB0aGUgZWxlbWVudHMgZm9ybSBhICdjb2x1bW4nLiAgVGhpcyBtYXRjaGVzIHRoZSB1c3VhbCBzZW5zZSBvZlxuICAgKiAncm93JyBhbmQgJ2NvbHVtbicgd2hlbiBwcm9jZXNzaW5nIHRhYnVsYXIgZGF0YSAoZS5nLiwgcGFyc2luZyBhIENTVikuXG4gICAqXG4gICAqIFRodXMsIFwiY29sdW1uLW1ham9yXCIgbWVhbnMgdGhhdCB0aGUgcmVzdWx0aW5nIGJhdGNoIGlzIGEgKHBvdGVudGlhbGx5XG4gICAqIG5lc3RlZCkgc3RydWN0dXJlIHJlcHJlc2VudGluZyB0aGUgY29sdW1ucy4gIEVhY2ggY29sdW1uIGVudHJ5LCB0aGVuLFxuICAgKiBjb250YWlucyBhIGNvbGxlY3Rpb24gb2YgdGhlIHZhbHVlcyBmb3VuZCBpbiB0aGF0IGNvbHVtbiBmb3IgYSByYW5nZSBvZlxuICAgKiBpbnB1dCBlbGVtZW50cy4gIFRoaXMgcmVwcmVzZW50YXRpb24gYWxsb3dzIGZvciB2ZWN0b3JpemVkIGNvbXB1dGF0aW9uLCBpblxuICAgKiBjb250cmFzdCB0byB0aGUgcm93LW1ham9yIGZvcm0uXG4gICAqXG4gICAqIFRoZSBpbnB1dHMgc2hvdWxkIGFsbCBoYXZlIHRoZSBzYW1lIG5lc3RlZCBzdHJ1Y3R1cmUgKGkuZS4sIG9mIGFycmF5cyBhbmRcbiAgICogZGljdHMpLiAgVGhlIHJlc3VsdCBpcyBhIHNpbmdsZSBvYmplY3Qgd2l0aCB0aGUgc2FtZSBuZXN0ZWQgc3RydWN0dXJlLFxuICAgKiB3aGVyZSB0aGUgbGVhdmVzIGFyZSBhcnJheXMgY29sbGVjdGluZyB0aGUgdmFsdWVzIG9mIHRoZSBpbnB1dHMgYXQgdGhhdFxuICAgKiBsb2NhdGlvbiAob3IsIG9wdGlvbmFsbHksIHRoZSByZXN1bHQgb2YgYSBjdXN0b20gZnVuY3Rpb24gYXBwbGllZCB0byB0aG9zZVxuICAgKiBhcnJheXMpLlxuICAgKlxuICAgKiBAcGFyYW0gYmF0Y2hTaXplIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgZGVzaXJlZCBwZXIgYmF0Y2guXG4gICAqIEBwYXJhbSBzbWFsbExhc3RCYXRjaCBXaGV0aGVyIHRvIGVtaXQgdGhlIGZpbmFsIGJhdGNoIHdoZW4gaXQgaGFzIGZld2VyXG4gICAqICAgdGhhbiBiYXRjaFNpemUgZWxlbWVudHMuIERlZmF1bHQgdHJ1ZS5cbiAgICogQHBhcmFtIHppcEZuOiAob3B0aW9uYWwpIEEgZnVuY3Rpb24gdGhhdCBleHBlY3RzIGFuIGFycmF5IG9mIGVsZW1lbnRzIGF0IGFcbiAgICogICBzaW5nbGUgbm9kZSBvZiB0aGUgb2JqZWN0IHRyZWUsIGFuZCByZXR1cm5zIGEgYERlZXBNYXBSZXN1bHRgLiAgVGhlXG4gICAqICAgYERlZXBNYXBSZXN1bHRgIGVpdGhlciBwcm92aWRlcyBhIHJlc3VsdCB2YWx1ZSBmb3IgdGhhdCBub2RlIChpLmUuLFxuICAgKiAgIHJlcHJlc2VudGluZyB0aGUgc3VidHJlZSksIG9yIGluZGljYXRlcyB0aGF0IHRoZSBub2RlIHNob3VsZCBiZSBwcm9jZXNzZWRcbiAgICogICByZWN1cnNpdmVseS4gIFRoZSBkZWZhdWx0IHppcEZuIHJlY3Vyc2VzIGFzIGZhciBhcyBwb3NzaWJsZSBhbmQgcGxhY2VzXG4gICAqICAgYXJyYXlzIGF0IHRoZSBsZWF2ZXMuXG4gICAqIEByZXR1cm5zIEEgYExhenlJdGVyYXRvcmAgb2YgYmF0Y2hlcyBvZiBlbGVtZW50cywgcmVwcmVzZW50ZWQgYXMgYW4gb2JqZWN0XG4gICAqICAgd2l0aCBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzLlxuICAgKi9cbiAgY29sdW1uTWFqb3JCYXRjaChcbiAgICAgIGJhdGNoU2l6ZTogbnVtYmVyLCBzbWFsbExhc3RCYXRjaCA9IHRydWUsXG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gICAgICB6aXBGbjogKHhzOiBhbnlbXSkgPT4gRGVlcE1hcFJlc3VsdCA9IHppcFRvTGlzdCk6XG4gICAgICBMYXp5SXRlcmF0b3I8dGYuVGVuc29yQ29udGFpbmVyPiB7XG4gICAgLy8gRmlyc3QgY29sbGVjdCB0aGUgZGVzaXJlZCBudW1iZXIgb2YgaW5wdXQgZWxlbWVudHMgYXMgYSByb3ctbWFqb3IgYmF0Y2guXG4gICAgY29uc3Qgcm93QmF0Y2hlcyA9IHRoaXMucm93TWFqb3JCYXRjaChiYXRjaFNpemUsIHNtYWxsTGFzdEJhdGNoKTtcbiAgICAvLyBOb3cgJ3JvdGF0ZScgb3IgJ3Bpdm90JyB0aGUgZGF0YSwgY29sbGVjdGluZyBhbGwgdmFsdWVzIGZyb20gZWFjaCBjb2x1bW5cbiAgICAvLyBpbiB0aGUgYmF0Y2ggKGkuZS4sIGZvciBlYWNoIGtleSB3aXRoaW4gdGhlIGVsZW1lbnRzKSBpbnRvIGFuIGFycmF5LlxuICAgIHJldHVybiByb3dCYXRjaGVzLm1hcCh4ID0+IGRlZXBaaXAoeCwgemlwRm4pKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25jYXRlbmF0ZSB0aGlzIGBMYXp5SXRlcmF0b3JgIHdpdGggYW5vdGhlci5cbiAgICpcbiAgICogQHBhcmFtIGl0ZXJhdG9yIEEgYExhenlJdGVyYXRvcmAgdG8gYmUgY29uY2F0ZW5hdGVkIG9udG8gdGhpcyBvbmUuXG4gICAqIEBwYXJhbSBiYXNlRXJyb3JIYW5kbGVyIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVyY2VwdCBgRXJyb3Jgc1xuICAgKiAgIHJhaXNlZCBkdXJpbmcgYSBgbmV4dCgpYCBjYWxsIG9uIHRoZSBiYXNlIHN0cmVhbS4gIFRoaXMgZnVuY3Rpb24gY2FuXG4gICAqICAgZGVjaWRlIHdoZXRoZXIgdGhlIGVycm9yIHNob3VsZCBiZSBwcm9wYWdhdGVkLCB3aGV0aGVyIHRoZSBlcnJvciBzaG91bGRcbiAgICogICBiZSBpZ25vcmVkLCBvciB3aGV0aGVyIHRoZSBiYXNlIHN0cmVhbSBzaG91bGQgYmUgdGVybWluYXRlZC5cbiAgICogQHJldHVybnMgQSBgTGF6eUl0ZXJhdG9yYC5cbiAgICovXG4gIGNvbmNhdGVuYXRlKFxuICAgICAgaXRlcmF0b3I6IExhenlJdGVyYXRvcjxUPixcbiAgICAgIGJhc2VFcnJvckhhbmRsZXI/OiAoZTogRXJyb3IpID0+IGJvb2xlYW4pOiBMYXp5SXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBuZXcgQ2hhaW5lZEl0ZXJhdG9yKFxuICAgICAgICBpdGVyYXRvckZyb21JdGVtcyhbdGhpcywgaXRlcmF0b3JdKSwgYmFzZUVycm9ySGFuZGxlcik7XG4gIH1cblxuICAvKipcbiAgICogTGltaXRzIHRoaXMgc3RyZWFtIHRvIHJldHVybiBhdCBtb3N0IGBjb3VudGAgaXRlbXMuXG4gICAqXG4gICAqIEBwYXJhbSBjb3VudCBUaGUgbWF4aW11bSBudW1iZXIgb2YgaXRlbXMgdG8gcHJvdmlkZSBmcm9tIHRoZSBzdHJlYW0uIElmXG4gICAqIGEgbmVnYXRpdmUgb3IgdW5kZWZpbmVkIHZhbHVlIGlzIGdpdmVuLCB0aGUgZW50aXJlIHN0cmVhbSBpcyByZXR1cm5lZFxuICAgKiAgIHVuYWx0ZXJlZC5cbiAgICovXG4gIHRha2UoY291bnQ6IG51bWJlcik6IExhenlJdGVyYXRvcjxUPiB7XG4gICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBUYWtlSXRlcmF0b3IodGhpcywgY291bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNraXBzIHRoZSBmaXJzdCBgY291bnRgIGl0ZW1zIGluIHRoaXMgc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0gY291bnQgVGhlIG51bWJlciBvZiBpdGVtcyB0byBza2lwLiAgSWYgYSBuZWdhdGl2ZSBvciB1bmRlZmluZWRcbiAgICogdmFsdWUgaXMgZ2l2ZW4sIHRoZSBlbnRpcmUgc3RyZWFtIGlzIHJldHVybmVkIHVuYWx0ZXJlZC5cbiAgICovXG4gIHNraXAoY291bnQ6IG51bWJlcik6IExhenlJdGVyYXRvcjxUPiB7XG4gICAgaWYgKGNvdW50IDwgMCB8fCBjb3VudCA9PSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTa2lwSXRlcmF0b3IodGhpcywgY291bnQpO1xuICB9XG5cbiAgLyoqXG4gICAqIFByZWZldGNoIHRoZSBmaXJzdCBgYnVmZmVyU2l6ZWAgaXRlbXMgaW4gdGhpcyBzdHJlYW0uXG4gICAqXG4gICAqIE5vdGUgdGhpcyBwcmVmZXRjaGVzIFByb21pc2VzLCBidXQgbWFrZXMgbm8gZ3VhcmFudGVlcyBhYm91dCB3aGVuIHRob3NlXG4gICAqIFByb21pc2VzIHJlc29sdmUuXG4gICAqXG4gICAqIEBwYXJhbSBidWZmZXJTaXplOiBBbiBpbnRlZ2VyIHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBiZVxuICAgKiAgIHByZWZldGNoZWQuXG4gICAqL1xuICBwcmVmZXRjaChidWZmZXJTaXplOiBudW1iZXIpOiBMYXp5SXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBuZXcgUHJlZmV0Y2hJdGVyYXRvcih0aGlzLCBidWZmZXJTaXplKTtcbiAgfVxuXG4gIC8vIFRPRE8oc29lcmdlbCk6IGRlZXAgc2hhcmRlZCBzaHVmZmxlLCB3aGVyZSBzdXBwb3J0ZWRcblxuICAvKipcbiAgICogUmFuZG9tbHkgc2h1ZmZsZXMgdGhlIGVsZW1lbnRzIG9mIHRoaXMgc3RyZWFtLlxuICAgKlxuICAgKiBAcGFyYW0gYnVmZmVyU2l6ZTogQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgZnJvbVxuICAgKiB0aGlzIHN0cmVhbSBmcm9tIHdoaWNoIHRoZSBuZXcgc3RyZWFtIHdpbGwgc2FtcGxlLlxuICAgKiBAcGFyYW0gc2VlZDogKE9wdGlvbmFsLikgQW4gaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSByYW5kb20gc2VlZCB0aGF0XG4gICAqIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgdGhlIGRpc3RyaWJ1dGlvbi5cbiAgICovXG4gIHNodWZmbGUod2luZG93U2l6ZTogbnVtYmVyLCBzZWVkPzogc3RyaW5nKTogTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgICByZXR1cm4gbmV3IFNodWZmbGVJdGVyYXRvcih0aGlzLCB3aW5kb3dTaXplLCBzZWVkKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGb3JjZSBhbiBpdGVyYXRvciB0byBleGVjdXRlIHNlcmlhbGx5OiBlYWNoIG5leHQoKSBjYWxsIHdpbGwgYXdhaXQgdGhlXG4gICAqIHByaW9yIG9uZSwgc28gdGhhdCB0aGV5IGNhbm5vdCBleGVjdXRlIGNvbmN1cnJlbnRseS5cbiAgICovXG4gIHNlcmlhbCgpOiBMYXp5SXRlcmF0b3I8VD4ge1xuICAgIHJldHVybiBuZXcgU2VyaWFsSXRlcmF0b3IodGhpcyk7XG4gIH1cbn1cblxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuLy8gVGhlIGZvbGxvd2luZyBwcml2YXRlIGNsYXNzZXMgc2VydmUgdG8gaW1wbGVtZW50IHRoZSBjaGFpbmFibGUgbWV0aG9kc1xuLy8gb24gTGF6eUl0ZXJhdG9yLiAgVW5mb3J0dW5hdGVseSB0aGV5IGNhbid0IGJlIHBsYWNlZCBpbiBzZXBhcmF0ZSBmaWxlcyxcbi8vIGR1ZSB0byByZXN1bHRpbmcgdHJvdWJsZSB3aXRoIGNpcmN1bGFyIGltcG9ydHMuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8vIEl0ZXJhdG9ycyB0aGF0IGp1c3QgZXh0ZW5kIExhenlJdGVyYXRvciBkaXJlY3RseVxuLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG5jbGFzcyBBcnJheUl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgcHJpdmF0ZSB0cmF2ID0gMDtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGl0ZW1zOiBUW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYEFycmF5IG9mICR7dGhpcy5pdGVtcy5sZW5ndGh9IGl0ZW1zYDtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIGlmICh0aGlzLnRyYXYgPj0gdGhpcy5pdGVtcy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgIH1cbiAgICBjb25zdCBpdGVtID0gdGhpcy5pdGVtc1t0aGlzLnRyYXZdO1xuICAgIHRoaXMudHJhdisrO1xuICAgIHJldHVybiB7dmFsdWU6IGRlZXBDbG9uZShpdGVtKSwgZG9uZTogZmFsc2V9O1xuICB9XG59XG5cbmNsYXNzIEZ1bmN0aW9uQ2FsbEl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgbmV4dEZuOiAoKSA9PiBJdGVyYXRvclJlc3VsdDxUPnwgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYEZ1bmN0aW9uIGNhbGxgO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiB0aGlzLm5leHRGbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE1vZGlmeSB0aGUgZXJyb3IgbWVzc2FnZSBidXQgbGVhdmUgdGhlIHN0YWNrIHRyYWNlIGludGFjdFxuICAgICAgZS5tZXNzYWdlID1cbiAgICAgICAgICBgRXJyb3IgdGhyb3duIHdoaWxlIGl0ZXJhdGluZyB0aHJvdWdoIGEgZGF0YXNldDogJHtlLm1lc3NhZ2V9YDtcbiAgICAgIHRocm93IGU7XG4gICAgfVxuICB9XG59XG5cbmNsYXNzIFNlcmlhbEl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgLy8gU3RyaWN0IFByb21pc2UgZXhlY3V0aW9uIG9yZGVyOlxuICAvLyBhIG5leHQoKSBjYWxsIG1heSBub3QgZXZlbiBiZWdpbiB1bnRpbCB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cbiAgcHJpdmF0ZSBsYXN0UmVhZDogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj47XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VD4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubGFzdFJlYWQgPSBQcm9taXNlLnJlc29sdmUoe3ZhbHVlOiBudWxsLCBkb25lOiBmYWxzZX0pO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IFNlcmlhbGA7XG4gIH1cblxuICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICAvLyBUaGlzIHNldHMgdGhpcy5sYXN0UmVhZCB0byBhIG5ldyBQcm9taXNlIHJpZ2h0IGF3YXksIGFzIG9wcG9zZWQgdG9cbiAgICAvLyBzYXlpbmcgYGF3YWl0IHRoaXMubGFzdFJlYWQ7IHRoaXMubGFzdFJlYWQgPSB0aGlzLnNlcmlhbE5leHQoKTtgIHdoaWNoXG4gICAgLy8gd291bGQgbm90IHdvcmsgYmVjYXVzZSB0aGlzLm5leHRSZWFkIHdvdWxkIGJlIHVwZGF0ZWQgb25seSBhZnRlciB0aGVcbiAgICAvLyBwcm9taXNlIHJlc29sdmVzLlxuICAgIHRoaXMubGFzdFJlYWQgPSB0aGlzLmxhc3RSZWFkLnRoZW4oKCkgPT4gdGhpcy5zZXJpYWxOZXh0KCkpO1xuICAgIHJldHVybiB0aGlzLmxhc3RSZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXJpYWxOZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICByZXR1cm4gdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gIH1cbn1cblxuY2xhc3MgU2tpcEl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgLy8gU3RyaWN0IFByb21pc2UgZXhlY3V0aW9uIG9yZGVyOlxuICAvLyBhIG5leHQoKSBjYWxsIG1heSBub3QgZXZlbiBiZWdpbiB1bnRpbCB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cbiAgcHJpdmF0ZSBsYXN0UmVhZDogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj47XG5cbiAgLy8gTG9jYWwgc3RhdGUgdGhhdCBzaG91bGQgbm90IGJlIGNsb2JiZXJlZCBieSBvdXQtb2Ytb3JkZXIgZXhlY3V0aW9uLlxuICBjb3VudCA9IDA7XG5cbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VD4sIHByb3RlY3RlZCBtYXhDb3VudDogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmxhc3RSZWFkID0gUHJvbWlzZS5yZXNvbHZlKHt2YWx1ZTogbnVsbCwgZG9uZTogZmFsc2V9KTtcbiAgfVxuXG4gIHN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudXBzdHJlYW0uc3VtbWFyeSgpfSAtPiBTa2lwYDtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRoaXMgc2V0cyB0aGlzLmxhc3RSZWFkIHRvIGEgbmV3IFByb21pc2UgcmlnaHQgYXdheSwgYXMgb3Bwb3NlZCB0b1xuICAgIC8vIHNheWluZyBgYXdhaXQgdGhpcy5sYXN0UmVhZDsgdGhpcy5sYXN0UmVhZCA9IHRoaXMuc2VyaWFsTmV4dCgpO2Agd2hpY2hcbiAgICAvLyB3b3VsZCBub3Qgd29yayBiZWNhdXNlIHRoaXMubmV4dFJlYWQgd291bGQgYmUgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZVxuICAgIC8vIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgdGhpcy5sYXN0UmVhZCA9IHRoaXMubGFzdFJlYWQudGhlbigoKSA9PiB0aGlzLnNlcmlhbE5leHQoKSk7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlYWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlcmlhbE5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRPRE8oc29lcmdlbCk6IGNvbnNpZGVyIHRyYWRlb2ZmcyBvZiByZWFkaW5nIGluIHBhcmFsbGVsLCBlZy5cbiAgICAvLyBjb2xsZWN0aW5nIG5leHQoKSBwcm9taXNlcyBpbiBhbiBBcnJheSBhbmQgdGhlbiB3YWl0aW5nIGZvclxuICAgIC8vIFByb21pc2UuYWxsKCkgb2YgdGhvc2UuIEJlbmVmaXQ6IHBzZXVkby1wYXJhbGxlbCBleGVjdXRpb24uICBEcmF3YmFjazpcbiAgICAvLyBtYXliZSBkZWxheWVkIEdDLlxuICAgIHdoaWxlICh0aGlzLmNvdW50KysgPCB0aGlzLm1heENvdW50KSB7XG4gICAgICBjb25zdCBza2lwcGVkID0gYXdhaXQgdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gICAgICAvLyBzaG9ydC1jaXJjdWl0IGlmIHVwc3RyZWFtIGlzIGFscmVhZHkgZW1wdHlcbiAgICAgIGlmIChza2lwcGVkLmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHNraXBwZWQ7XG4gICAgICB9XG4gICAgICB0Zi5kaXNwb3NlKHNraXBwZWQudmFsdWUgYXMge30pO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gIH1cbn1cblxuY2xhc3MgVGFrZUl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgY291bnQgPSAwO1xuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgdXBzdHJlYW06IExhenlJdGVyYXRvcjxUPiwgcHJvdGVjdGVkIG1heENvdW50OiBudW1iZXIpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IFRha2VgO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgaWYgKHRoaXMuY291bnQrKyA+PSB0aGlzLm1heENvdW50KSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMudXBzdHJlYW0ubmV4dCgpO1xuICB9XG59XG5cbi8vIE5vdGUgdGhpcyBiYXRjaCBqdXN0IGdyb3VwcyBpdGVtcyBpbnRvIHJvdy13aXNlIGVsZW1lbnQgYXJyYXlzLlxuLy8gUm90YXRpbmcgdGhlc2UgdG8gYSBjb2x1bW4td2lzZSByZXByZXNlbnRhdGlvbiBoYXBwZW5zIG9ubHkgYXQgdGhlIGRhdGFzZXRcbi8vIGxldmVsLlxuY2xhc3MgUm93TWFqb3JCYXRjaEl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFRbXT4ge1xuICAvLyBTdHJpY3QgUHJvbWlzZSBleGVjdXRpb24gb3JkZXI6XG4gIC8vIGEgbmV4dCgpIGNhbGwgbWF5IG5vdCBldmVuIGJlZ2luIHVudGlsIHRoZSBwcmV2aW91cyBvbmUgY29tcGxldGVzLlxuICBwcml2YXRlIGxhc3RSZWFkOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRbXT4+O1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VD4sIHByb3RlY3RlZCBiYXRjaFNpemU6IG51bWJlcixcbiAgICAgIHByb3RlY3RlZCBlbmFibGVTbWFsbExhc3RCYXRjaCA9IHRydWUpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubGFzdFJlYWQgPSBQcm9taXNlLnJlc29sdmUoe3ZhbHVlOiBudWxsLCBkb25lOiBmYWxzZX0pO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IFJvd01ham9yQmF0Y2hgO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRbXT4+IHtcbiAgICAvLyBUaGlzIHNldHMgdGhpcy5sYXN0UmVhZCB0byBhIG5ldyBQcm9taXNlIHJpZ2h0IGF3YXksIGFzIG9wcG9zZWQgdG9cbiAgICAvLyBzYXlpbmcgYGF3YWl0IHRoaXMubGFzdFJlYWQ7IHRoaXMubGFzdFJlYWQgPSB0aGlzLnNlcmlhbE5leHQoKTtgIHdoaWNoXG4gICAgLy8gd291bGQgbm90IHdvcmsgYmVjYXVzZSB0aGlzLm5leHRSZWFkIHdvdWxkIGJlIHVwZGF0ZWQgb25seSBhZnRlciB0aGVcbiAgICAvLyBwcm9taXNlIHJlc29sdmVzLlxuICAgIHRoaXMubGFzdFJlYWQgPSB0aGlzLmxhc3RSZWFkLnRoZW4oKCkgPT4gdGhpcy5zZXJpYWxOZXh0KCkpO1xuICAgIHJldHVybiB0aGlzLmxhc3RSZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBzZXJpYWxOZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFtdPj4ge1xuICAgIGNvbnN0IGJhdGNoOiBUW10gPSBbXTtcbiAgICB3aGlsZSAoYmF0Y2gubGVuZ3RoIDwgdGhpcy5iYXRjaFNpemUpIHtcbiAgICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCB0aGlzLnVwc3RyZWFtLm5leHQoKTtcbiAgICAgIGlmIChpdGVtLmRvbmUpIHtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlU21hbGxMYXN0QmF0Y2ggJiYgYmF0Y2gubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHJldHVybiB7dmFsdWU6IGJhdGNoLCBkb25lOiBmYWxzZX07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZX07XG4gICAgICB9XG4gICAgICBiYXRjaC5wdXNoKGl0ZW0udmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlOiBiYXRjaCwgZG9uZTogZmFsc2V9O1xuICB9XG59XG5cbmNsYXNzIEZpbHRlckl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgLy8gU3RyaWN0IFByb21pc2UgZXhlY3V0aW9uIG9yZGVyOlxuICAvLyBhIG5leHQoKSBjYWxsIG1heSBub3QgZXZlbiBiZWdpbiB1bnRpbCB0aGUgcHJldmlvdXMgb25lIGNvbXBsZXRlcy5cbiAgcHJpdmF0ZSBsYXN0UmVhZDogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwcm90ZWN0ZWQgdXBzdHJlYW06IExhenlJdGVyYXRvcjxUPixcbiAgICAgIHByb3RlY3RlZCBwcmVkaWNhdGU6ICh2YWx1ZTogVCkgPT4gYm9vbGVhbikge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5sYXN0UmVhZCA9IFByb21pc2UucmVzb2x2ZSh7dmFsdWU6IG51bGwsIGRvbmU6IGZhbHNlfSk7XG4gIH1cblxuICBzdW1tYXJ5KCkge1xuICAgIHJldHVybiBgJHt0aGlzLnVwc3RyZWFtLnN1bW1hcnkoKX0gLT4gRmlsdGVyYDtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRoaXMgc2V0cyB0aGlzLmxhc3RSZWFkIHRvIGEgbmV3IFByb21pc2UgcmlnaHQgYXdheSwgYXMgb3Bwb3NlZCB0b1xuICAgIC8vIHNheWluZyBgYXdhaXQgdGhpcy5sYXN0UmVhZDsgdGhpcy5sYXN0UmVhZCA9IHRoaXMuc2VyaWFsTmV4dCgpO2Agd2hpY2hcbiAgICAvLyB3b3VsZCBub3Qgd29yayBiZWNhdXNlIHRoaXMubmV4dFJlYWQgd291bGQgYmUgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZVxuICAgIC8vIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgdGhpcy5sYXN0UmVhZCA9IHRoaXMubGFzdFJlYWQudGhlbigoKSA9PiB0aGlzLnNlcmlhbE5leHQoKSk7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlYWQ7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHNlcmlhbE5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gICAgICBpZiAoaXRlbS5kb25lIHx8IHRoaXMucHJlZGljYXRlKGl0ZW0udmFsdWUpKSB7XG4gICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgfVxuICAgICAgdGYuZGlzcG9zZShpdGVtLnZhbHVlIGFzIHt9KTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgTWFwSXRlcmF0b3I8SSwgTz4gZXh0ZW5kcyBMYXp5SXRlcmF0b3I8Tz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPEk+LFxuICAgICAgcHJvdGVjdGVkIHRyYW5zZm9ybTogKHZhbHVlOiBJKSA9PiBPKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG4gIHN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudXBzdHJlYW0uc3VtbWFyeSgpfSAtPiBNYXBgO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PE8+PiB7XG4gICAgY29uc3QgaXRlbSA9IGF3YWl0IHRoaXMudXBzdHJlYW0ubmV4dCgpO1xuICAgIGlmIChpdGVtLmRvbmUpIHtcbiAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFRlbnNvcnMgPSB0Zi50ZW5zb3JfdXRpbC5nZXRUZW5zb3JzSW5Db250YWluZXIoaXRlbS52YWx1ZSBhcyB7fSk7XG4gICAgLy8gQ2FyZWZ1bDogdGhlIHRyYW5zZm9ybSBtYXkgbXV0YXRlIHRoZSBpdGVtIGluIHBsYWNlLlxuICAgIC8vIFRoYXQncyB3aHkgd2UgaGF2ZSB0byByZW1lbWJlciB0aGUgaW5wdXQgVGVuc29ycyBhYm92ZSwgYW5kIHRoZW5cbiAgICAvLyBiZWxvdyBkaXNwb3NlIG9ubHkgdGhvc2UgdGhhdCB3ZXJlIG5vdCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgb3V0cHV0LlxuICAgIC8vIE5vdGUgdG9vIHRoYXQgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdGlkeWluZ1xuICAgIC8vIGFueSBpbnRlcm1lZGlhdGUgVGVuc29ycy4gIEhlcmUgd2UgYXJlIGNvbmNlcm5lZCBvbmx5IGFib3V0IHRoZVxuICAgIC8vIGlucHV0cy5cbiAgICBjb25zdCBtYXBwZWQgPSB0aGlzLnRyYW5zZm9ybShpdGVtLnZhbHVlKTtcbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzID0gdGYudGVuc29yX3V0aWwuZ2V0VGVuc29yc0luQ29udGFpbmVyKG1hcHBlZCBhcyB7fSk7XG5cbiAgICAvLyBUT0RPKHNvZXJnZWwpIGZhc3RlciBpbnRlcnNlY3Rpb25cbiAgICAvLyBUT0RPKHNvZXJnZWwpIG1vdmUgdG8gdGYuZGlzcG9zZUV4Y2VwdChpbiwgb3V0KT9cbiAgICBmb3IgKGNvbnN0IHQgb2YgaW5wdXRUZW5zb3JzKSB7XG4gICAgICBpZiAoIXRmLnRlbnNvcl91dGlsLmlzVGVuc29ySW5MaXN0KHQsIG91dHB1dFRlbnNvcnMpKSB7XG4gICAgICAgIHQuZGlzcG9zZSgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlOiBtYXBwZWQsIGRvbmU6IGZhbHNlfTtcbiAgfVxufVxuXG5jbGFzcyBFcnJvckhhbmRsaW5nTGF6eUl0ZXJhdG9yPFQ+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPFQ+IHtcbiAgY291bnQgPSAwO1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPFQ+LFxuICAgICAgcHJvdGVjdGVkIGhhbmRsZXI6IChlcnJvcjogRXJyb3IpID0+IGJvb2xlYW4pIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubGFzdFJlYWQgPSBQcm9taXNlLnJlc29sdmUoe3ZhbHVlOiBudWxsLCBkb25lOiBmYWxzZX0pO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IGhhbmRsZUVycm9yc2A7XG4gIH1cblxuICAvLyBTdHJpY3QgUHJvbWlzZSBleGVjdXRpb24gb3JkZXI6XG4gIC8vIGEgbmV4dCgpIGNhbGwgbWF5IG5vdCBldmVuIGJlZ2luIHVudGlsIHRoZSBwcmV2aW91cyBvbmUgY29tcGxldGVzLlxuICBwcml2YXRlIGxhc3RSZWFkOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PjtcblxuICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICAvLyBUaGlzIHNldHMgdGhpcy5sYXN0UmVhZCB0byBhIG5ldyBQcm9taXNlIHJpZ2h0IGF3YXksIGFzIG9wcG9zZWQgdG9cbiAgICAvLyBzYXlpbmcgYGF3YWl0IHRoaXMubGFzdFJlYWQ7IHRoaXMubGFzdFJlYWQgPSB0aGlzLnNlcmlhbE5leHQoKTtgIHdoaWNoXG4gICAgLy8gd291bGQgbm90IHdvcmsgYmVjYXVzZSB0aGlzLm5leHRSZWFkIHdvdWxkIGJlIHVwZGF0ZWQgb25seSBhZnRlciB0aGVcbiAgICAvLyBwcm9taXNlIHJlc29sdmVzLlxuICAgIHRoaXMubGFzdFJlYWQgPSB0aGlzLmxhc3RSZWFkLnRoZW4oKCkgPT4gdGhpcy5zZXJpYWxOZXh0KCkpO1xuICAgIHJldHVybiB0aGlzLmxhc3RSZWFkO1xuICB9XG5cbiAgYXN5bmMgc2VyaWFsTmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgd2hpbGUgKHRydWUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCB0aGlzLnVwc3RyZWFtLm5leHQoKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhbmRsZXIoZSkpIHtcbiAgICAgICAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAgICAgICAgfVxuICAgICAgICAvLyBJZiB0aGUgaGFuZGxlciByZXR1cm5zIHRydWUsIGxvb3AgYW5kIGZldGNoIHRoZSBuZXh0IHVwc3RyZWFtIGl0ZW0uXG5cbiAgICAgICAgLy8gSWYgdGhlIHVwc3RyZWFtIGl0ZXJhdG9yIHRocm93cyBhbiBlbmRsZXNzIHN0cmVhbSBvZiBlcnJvcnMsIGFuZCBpZlxuICAgICAgICAvLyB0aGUgaGFuZGxlciBzYXlzIHRvIGlnbm9yZSB0aGVtLCB0aGVuIHdlIGxvb3AgZm9yZXZlciBoZXJlLiAgVGhhdCBpc1xuICAgICAgICAvLyB0aGUgY29ycmVjdCBiZWhhdmlvci0tIGl0J3MgdXAgdG8gdGhlIGhhbmRsZXIgdG8gZGVjaWRlIHdoZW4gdG8gc3RvcC5cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgQXN5bmNNYXBJdGVyYXRvcjxJLCBPPiBleHRlbmRzIExhenlJdGVyYXRvcjxPPiB7XG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8ST4sXG4gICAgICBwcm90ZWN0ZWQgdHJhbnNmb3JtOiAodmFsdWU6IEkpID0+IFByb21pc2U8Tz4pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IEFzeW5jTWFwYDtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxPPj4ge1xuICAgIGNvbnN0IGl0ZW0gPSBhd2FpdCB0aGlzLnVwc3RyZWFtLm5leHQoKTtcbiAgICBpZiAoaXRlbS5kb25lKSB7XG4gICAgICByZXR1cm4ge3ZhbHVlOiBudWxsLCBkb25lOiB0cnVlfTtcbiAgICB9XG4gICAgY29uc3QgaW5wdXRUZW5zb3JzID0gdGYudGVuc29yX3V0aWwuZ2V0VGVuc29yc0luQ29udGFpbmVyKGl0ZW0udmFsdWUgYXMge30pO1xuICAgIC8vIENhcmVmdWw6IHRoZSB0cmFuc2Zvcm0gbWF5IG11dGF0ZSB0aGUgaXRlbSBpbiBwbGFjZS5cbiAgICAvLyBUaGF0J3Mgd2h5IHdlIGhhdmUgdG8gcmVtZW1iZXIgdGhlIGlucHV0IFRlbnNvcnMgYWJvdmUsIGFuZCB0aGVuXG4gICAgLy8gYmVsb3cgZGlzcG9zZSBvbmx5IHRob3NlIHRoYXQgd2VyZSBub3QgcGFzc2VkIHRocm91Z2ggdG8gdGhlIG91dHB1dC5cbiAgICAvLyBOb3RlIHRvbyB0aGF0IHRoZSB0cmFuc2Zvcm0gZnVuY3Rpb24gaXMgcmVzcG9uc2libGUgZm9yIHRpZHlpbmdcbiAgICAvLyBhbnkgaW50ZXJtZWRpYXRlIFRlbnNvcnMuICBIZXJlIHdlIGFyZSBjb25jZXJuZWQgb25seSBhYm91dCB0aGVcbiAgICAvLyBpbnB1dHMuXG4gICAgY29uc3QgbWFwcGVkID0gYXdhaXQgdGhpcy50cmFuc2Zvcm0oaXRlbS52YWx1ZSk7XG4gICAgY29uc3Qgb3V0cHV0VGVuc29ycyA9IHRmLnRlbnNvcl91dGlsLmdldFRlbnNvcnNJbkNvbnRhaW5lcihtYXBwZWQgYXMge30pO1xuXG4gICAgLy8gVE9ETyhzb2VyZ2VsKSBmYXN0ZXIgaW50ZXJzZWN0aW9uXG4gICAgLy8gVE9ETyhzb2VyZ2VsKSBtb3ZlIHRvIHRmLmRpc3Bvc2VFeGNlcHQoaW4sIG91dCk/XG4gICAgZm9yIChjb25zdCB0IG9mIGlucHV0VGVuc29ycykge1xuICAgICAgaWYgKCF0Zi50ZW5zb3JfdXRpbC5pc1RlbnNvckluTGlzdCh0LCBvdXRwdXRUZW5zb3JzKSkge1xuICAgICAgICB0LmRpc3Bvc2UoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHt2YWx1ZTogbWFwcGVkLCBkb25lOiBmYWxzZX07XG4gIH1cbn1cblxuLy8gSXRlcmF0b3JzIHRoYXQgbWFpbnRhaW4gYSBxdWV1ZSBvZiBwZW5kaW5nIGl0ZW1zXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQSBiYXNlIGNsYXNzIGZvciB0cmFuc2Zvcm1pbmcgc3RyZWFtcyB0aGF0IG9wZXJhdGUgYnkgbWFpbnRhaW5pbmcgYW5cbiAqIG91dHB1dCBxdWV1ZSBvZiBlbGVtZW50cyB0aGF0IGFyZSByZWFkeSB0byByZXR1cm4gdmlhIG5leHQoKS4gIFRoaXMgaXNcbiAqIGNvbW1vbmx5IHJlcXVpcmVkIHdoZW4gdGhlIHRyYW5zZm9ybWF0aW9uIGlzIDEtdG8tbWFueTogIEEgY2FsbCB0byBuZXh0KClcbiAqIG1heSB0cmlnZ2VyIGEgY2FsbCB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0sIHdoaWNoIHdpbGwgcHJvZHVjZSBtYW55XG4gKiBtYXBwZWQgZWxlbWVudHMgb2YgdGhpcyBzdHJlYW0tLSBvZiB3aGljaCB3ZSBuZWVkIHRvIHJldHVybiBvbmx5IG9uZSwgc29cbiAqIHdlIGhhdmUgdG8gcXVldWUgdGhlIHJlc3QuXG4gKi9cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBPbmVUb01hbnlJdGVyYXRvcjxUPiBleHRlbmRzIExhenlJdGVyYXRvcjxUPiB7XG4gIC8vIFN0cmljdCBQcm9taXNlIGV4ZWN1dGlvbiBvcmRlcjpcbiAgLy8gYSBuZXh0KCkgY2FsbCBtYXkgbm90IGV2ZW4gYmVnaW4gdW50aWwgdGhlIHByZXZpb3VzIG9uZSBjb21wbGV0ZXMuXG4gIHByaXZhdGUgbGFzdFJlYWQ6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+O1xuXG4gIC8vIExvY2FsIHN0YXRlIHRoYXQgc2hvdWxkIG5vdCBiZSBjbG9iYmVyZWQgYnkgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbi5cbiAgcHJvdGVjdGVkIG91dHB1dFF1ZXVlOiBSaW5nQnVmZmVyPFQ+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5vdXRwdXRRdWV1ZSA9IG5ldyBHcm93aW5nUmluZ0J1ZmZlcjxUPigpO1xuICAgIHRoaXMubGFzdFJlYWQgPSBQcm9taXNlLnJlc29sdmUoe3ZhbHVlOiBudWxsLCBkb25lOiBmYWxzZX0pO1xuICB9XG5cbiAgYXN5bmMgbmV4dCgpOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgLy8gVGhpcyBzZXRzIHRoaXMubGFzdFJlYWQgdG8gYSBuZXcgUHJvbWlzZSByaWdodCBhd2F5LCBhcyBvcHBvc2VkIHRvXG4gICAgLy8gc2F5aW5nIGBhd2FpdCB0aGlzLmxhc3RSZWFkOyB0aGlzLmxhc3RSZWFkID0gdGhpcy5zZXJpYWxOZXh0KCk7YCB3aGljaFxuICAgIC8vIHdvdWxkIG5vdCB3b3JrIGJlY2F1c2UgdGhpcy5uZXh0UmVhZCB3b3VsZCBiZSB1cGRhdGVkIG9ubHkgYWZ0ZXIgdGhlXG4gICAgLy8gcHJvbWlzZSByZXNvbHZlcy5cbiAgICB0aGlzLmxhc3RSZWFkID0gdGhpcy5sYXN0UmVhZC50aGVuKCgpID0+IHRoaXMuc2VyaWFsTmV4dCgpKTtcbiAgICByZXR1cm4gdGhpcy5sYXN0UmVhZDtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIG9uZSBvciBtb3JlIGNodW5rcyBmcm9tIHVwc3RyZWFtIGFuZCBwcm9jZXNzIHRoZW0sIHBvc3NpYmx5XG4gICAqIHJlYWRpbmcgb3Igd3JpdGluZyBhIGNhcnJ5b3ZlciwgYW5kIGFkZGluZyBwcm9jZXNzZWQgaXRlbXMgdG8gdGhlXG4gICAqIG91dHB1dCBxdWV1ZS4gIE5vdGUgaXQncyBwb3NzaWJsZSB0aGF0IG5vIGl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWVcbiAgICogb24gYSBnaXZlbiBwdW1wKCkgY2FsbCwgZXZlbiBpZiB0aGUgdXBzdHJlYW0gc3RyZWFtIGlzIG5vdCBjbG9zZWRcbiAgICogKGUuZy4sIGJlY2F1c2UgaXRlbXMgYXJlIGZpbHRlcmVkKS5cbiAgICpcbiAgICogQHJldHVybiBgdHJ1ZWAgaWYgYW55IGFjdGlvbiB3YXMgdGFrZW4sIGkuZS4gZmV0Y2hpbmcgaXRlbXMgZnJvbSB0aGVcbiAgICogICB1cHN0cmVhbSBzb3VyY2UgT1IgYWRkaW5nIGl0ZW1zIHRvIHRoZSBvdXRwdXQgcXVldWUuICBgZmFsc2VgIGlmIHRoZVxuICAgKiAgIHVwc3RyZWFtIHNvdXJjZSBpcyBleGhhdXN0ZWQgQU5EIG5vdGhpbmcgd2FzIGFkZGVkIHRvIHRoZSBxdWV1ZVxuICAgKiAoaS5lLiwgYW55IHJlbWFpbmluZyBjYXJyeW92ZXIpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGFic3RyYWN0IGFzeW5jIHB1bXAoKTogUHJvbWlzZTxib29sZWFuPjtcblxuICBhc3luYyBzZXJpYWxOZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICAvLyBGZXRjaCBzbyB0aGF0IHRoZSBxdWV1ZSBjb250YWlucyBhdCBsZWFzdCBvbmUgaXRlbSBpZiBwb3NzaWJsZS5cbiAgICAvLyBJZiB0aGUgdXBzdHJlYW0gc291cmNlIGlzIGV4aGF1c3RlZCwgQU5EIHRoZXJlIGFyZSBubyBpdGVtcyBsZWZ0IGluXG4gICAgLy8gdGhlIG91dHB1dCBxdWV1ZSwgdGhlbiB0aGlzIHN0cmVhbSBpcyBhbHNvIGV4aGF1c3RlZC5cbiAgICB3aGlsZSAodGhpcy5vdXRwdXRRdWV1ZS5sZW5ndGgoKSA9PT0gMCkge1xuICAgICAgLy8gVE9ETyhzb2VyZ2VsKTogY29uc2lkZXIgcGFyYWxsZWwgcmVhZHMuXG4gICAgICBpZiAoIWF3YWl0IHRoaXMucHVtcCgpKSB7XG4gICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3ZhbHVlOiB0aGlzLm91dHB1dFF1ZXVlLnNoaWZ0KCksIGRvbmU6IGZhbHNlfTtcbiAgfVxufVxuY2xhc3MgRmxhdG1hcEl0ZXJhdG9yPEksIE8+IGV4dGVuZHMgT25lVG9NYW55SXRlcmF0b3I8Tz4ge1xuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPEk+LFxuICAgICAgcHJvdGVjdGVkIHRyYW5zZm9ybTogKHZhbHVlOiBJKSA9PiBPW10pIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICByZXR1cm4gYCR7dGhpcy51cHN0cmVhbS5zdW1tYXJ5KCl9IC0+IEZsYXRtYXBgO1xuICB9XG5cbiAgYXN5bmMgcHVtcCgpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCBpdGVtID0gYXdhaXQgdGhpcy51cHN0cmVhbS5uZXh0KCk7XG4gICAgaWYgKGl0ZW0uZG9uZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBpbnB1dFRlbnNvcnMgPSB0Zi50ZW5zb3JfdXRpbC5nZXRUZW5zb3JzSW5Db250YWluZXIoaXRlbS52YWx1ZSBhcyB7fSk7XG4gICAgLy8gQ2FyZWZ1bDogdGhlIHRyYW5zZm9ybSBtYXkgbXV0YXRlIHRoZSBpdGVtIGluIHBsYWNlLlxuICAgIC8vIHRoYXQncyB3aHkgd2UgaGF2ZSB0byByZW1lbWJlciB0aGUgaW5wdXQgVGVuc29ycyBhYm92ZSwgYW5kIHRoZW5cbiAgICAvLyBiZWxvdyBkaXNwb3NlIG9ubHkgdGhvc2UgdGhhdCB3ZXJlIG5vdCBwYXNzZWQgdGhyb3VnaCB0byB0aGUgb3V0cHV0LlxuICAgIC8vIE5vdGUgdG9vIHRoYXQgdGhlIHRyYW5zZm9ybSBmdW5jdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgdGlkeWluZyBhbnlcbiAgICAvLyBpbnRlcm1lZGlhdGUgVGVuc29ycy4gIEhlcmUgd2UgYXJlIGNvbmNlcm5lZCBvbmx5IGFib3V0IHRoZSBpbnB1dHMuXG4gICAgY29uc3QgbWFwcGVkQXJyYXkgPSB0aGlzLnRyYW5zZm9ybShpdGVtLnZhbHVlKTtcbiAgICBjb25zdCBvdXRwdXRUZW5zb3JzID1cbiAgICAgICAgdGYudGVuc29yX3V0aWwuZ2V0VGVuc29yc0luQ29udGFpbmVyKG1hcHBlZEFycmF5IGFzIHt9KTtcbiAgICB0aGlzLm91dHB1dFF1ZXVlLnB1c2hBbGwobWFwcGVkQXJyYXkpO1xuXG4gICAgLy8gVE9ETyhzb2VyZ2VsKSBmYXN0ZXIgaW50ZXJzZWN0aW9uLCBhbmQgZGVkdXBsaWNhdGUgb3V0cHV0VGVuc29yc1xuICAgIC8vIFRPRE8oc29lcmdlbCkgbW92ZSB0byB0Zi5kaXNwb3NlRXhjZXB0KGluLCBvdXQpP1xuICAgIGZvciAoY29uc3QgdCBvZiBpbnB1dFRlbnNvcnMpIHtcbiAgICAgIGlmICghdGYudGVuc29yX3V0aWwuaXNUZW5zb3JJbkxpc3QodCwgb3V0cHV0VGVuc29ycykpIHtcbiAgICAgICAgdC5kaXNwb3NlKCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIGBMYXp5SXRlcmF0b3JgIHRoYXQgY29uY2F0ZW5hdGVzIGEgc3RyZWFtIG9mIHVuZGVybHlpbmdcbiAqIHN0cmVhbXMuXG4gKlxuICogRG9pbmcgdGhpcyBpbiBhIGNvbmN1cnJlbmN5LXNhZmUgd2F5IHJlcXVpcmVzIHNvbWUgdHJpY2tlcnkuICBJblxuICogcGFydGljdWxhciwgd2Ugd2FudCB0aGlzIHN0cmVhbSB0byByZXR1cm4gdGhlIGVsZW1lbnRzIGZyb20gdGhlXG4gKiB1bmRlcmx5aW5nIHN0cmVhbXMgaW4gdGhlIGNvcnJlY3Qgb3JkZXIgYWNjb3JkaW5nIHRvIHdoZW4gbmV4dCgpIHdhc1xuICogY2FsbGVkLCBldmVuIGlmIHRoZSByZXN1bHRpbmcgUHJvbWlzZXMgcmVzb2x2ZSBpbiBhIGRpZmZlcmVudCBvcmRlci5cbiAqL1xuZXhwb3J0IGNsYXNzIENoYWluZWRJdGVyYXRvcjxUPiBleHRlbmRzIExhenlJdGVyYXRvcjxUPiB7XG4gIC8vIFN0cmljdCBQcm9taXNlIGV4ZWN1dGlvbiBvcmRlcjpcbiAgLy8gYSBuZXh0KCkgY2FsbCBtYXkgbm90IGV2ZW4gYmVnaW4gdW50aWwgdGhlIHByZXZpb3VzIG9uZSBjb21wbGV0ZXMuXG4gIHByaXZhdGUgbGFzdFJlYWQ6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+ID0gbnVsbDtcblxuICAvLyBMb2NhbCBzdGF0ZSB0aGF0IHNob3VsZCBub3QgYmUgY2xvYmJlcmVkIGJ5IG91dC1vZi1vcmRlciBleGVjdXRpb24uXG4gIHByaXZhdGUgaXRlcmF0b3I6IExhenlJdGVyYXRvcjxUPiA9IG51bGw7XG4gIHByaXZhdGUgbW9yZUl0ZXJhdG9yczogTGF6eUl0ZXJhdG9yPExhenlJdGVyYXRvcjxUPj47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpdGVyYXRvcnM6IExhenlJdGVyYXRvcjxMYXp5SXRlcmF0b3I8VD4+LFxuICAgICAgcHJpdmF0ZSByZWFkb25seSBiYXNlRXJyb3JIYW5kbGVyPzogKGU6IEVycm9yKSA9PiBib29sZWFuKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLm1vcmVJdGVyYXRvcnMgPSBpdGVyYXRvcnM7XG4gIH1cblxuICBzdW1tYXJ5KCkge1xuICAgIGNvbnN0IHVwc3RyZWFtU3VtbWFyaWVzID0gJ1RPRE86IGZpbGwgaW4gdXBzdHJlYW0gb2YgY2hhaW5lZCBzdW1tYXJpZXMnO1xuICAgIHJldHVybiBgJHt1cHN0cmVhbVN1bW1hcmllc30gLT4gQ2hhaW5lZGA7XG4gIH1cblxuICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICB0aGlzLmxhc3RSZWFkID0gdGhpcy5yZWFkRnJvbUNoYWluKHRoaXMubGFzdFJlYWQpO1xuICAgIHJldHVybiB0aGlzLmxhc3RSZWFkO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyByZWFkRnJvbUNoYWluKGxhc3RSZWFkOiBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+Pik6XG4gICAgICBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQ+PiB7XG4gICAgLy8gTXVzdCBhd2FpdCBvbiB0aGUgcHJldmlvdXMgcmVhZCBzaW5jZSB0aGUgcHJldmlvdXMgcmVhZCBtYXkgaGF2ZSBhZHZhbmNlZFxuICAgIC8vIHRoZSBzdHJlYW0gb2Ygc3RyZWFtcywgZnJvbSB3aGljaCB3ZSBuZWVkIHRvIHJlYWQuXG4gICAgLy8gVGhpcyBpcyB1bmZvcnR1bmF0ZSBzaW5jZSB3ZSBjYW4ndCBwYXJhbGxlbGl6ZSByZWFkcy4gV2hpY2ggbWVhbnNcbiAgICAvLyBwcmVmZXRjaGluZyBvZiBjaGFpbmVkIHN0cmVhbXMgaXMgYSBuby1vcC5cbiAgICAvLyBPbmUgc29sdXRpb24gaXMgdG8gcHJlZmV0Y2ggaW1tZWRpYXRlbHkgdXBzdHJlYW0gb2YgdGhpcy5cbiAgICBhd2FpdCBsYXN0UmVhZDtcbiAgICBpZiAodGhpcy5pdGVyYXRvciA9PSBudWxsKSB7XG4gICAgICBjb25zdCBpdGVyYXRvclJlc3VsdCA9IGF3YWl0IHRoaXMubW9yZUl0ZXJhdG9ycy5uZXh0KCk7XG4gICAgICBpZiAoaXRlcmF0b3JSZXN1bHQuZG9uZSkge1xuICAgICAgICAvLyBObyBtb3JlIHN0cmVhbXMgdG8gc3RyZWFtIGZyb20uXG4gICAgICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICAgICAgfVxuICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yUmVzdWx0LnZhbHVlO1xuICAgICAgaWYgKHRoaXMuYmFzZUVycm9ySGFuZGxlciAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMuaXRlcmF0b3IgPSB0aGlzLml0ZXJhdG9yLmhhbmRsZUVycm9ycyh0aGlzLmJhc2VFcnJvckhhbmRsZXIpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBpdGVtUmVzdWx0ID0gYXdhaXQgdGhpcy5pdGVyYXRvci5uZXh0KCk7XG4gICAgaWYgKGl0ZW1SZXN1bHQuZG9uZSkge1xuICAgICAgdGhpcy5pdGVyYXRvciA9IG51bGw7XG4gICAgICByZXR1cm4gdGhpcy5yZWFkRnJvbUNoYWluKGxhc3RSZWFkKTtcbiAgICB9XG4gICAgcmV0dXJuIGl0ZW1SZXN1bHQ7XG4gIH1cbn1cblxuZXhwb3J0IGVudW0gWmlwTWlzbWF0Y2hNb2RlIHtcbiAgRkFJTCwgICAgICAvLyByZXF1aXJlIHppcHBlZCBzdHJlYW1zIHRvIGhhdmUgdGhlIHNhbWUgbGVuZ3RoXG4gIFNIT1JURVNULCAgLy8gdGVybWluYXRlIHppcCB3aGVuIHRoZSBmaXJzdCBzdHJlYW0gaXMgZXhoYXVzdGVkXG4gIExPTkdFU1QgICAgLy8gdXNlIG51bGxzIGZvciBleGhhdXN0ZWQgc3RyZWFtczsgdXNlIHVwIHRoZSBsb25nZXN0IHN0cmVhbS5cbn1cblxuLyoqXG4gKiBQcm92aWRlcyBhIGBMYXp5SXRlcmF0b3JgIHRoYXQgemlwcyB0b2dldGhlciBhbiBhcnJheSwgZGljdCwgb3IgbmVzdGVkXG4gKiBzdHJ1Y3R1cmUgb2YgYExhenlJdGVyYXRvcmBzIChhbmQgcGVyaGFwcyBhZGRpdGlvbmFsIGNvbnN0YW50cykuXG4gKlxuICogVGhlIHVuZGVybHlpbmcgc3RyZWFtcyBtdXN0IHByb3ZpZGUgZWxlbWVudHMgaW4gYSBjb25zaXN0ZW50IG9yZGVyIHN1Y2hcbiAqIHRoYXQgdGhleSBjb3JyZXNwb25kLlxuICpcbiAqIFR5cGljYWxseSwgdGhlIHVuZGVybHlpbmcgc3RyZWFtcyBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2ZcbiAqIGVsZW1lbnRzLiBJZiB0aGV5IGRvIG5vdCwgdGhlIGJlaGF2aW9yIGlzIGRldGVybWluZWQgYnkgdGhlXG4gKiBgbWlzbWF0Y2hNb2RlYCBhcmd1bWVudC5cbiAqXG4gKiBUaGUgbmVzdGVkIHN0cnVjdHVyZSBvZiB0aGUgYGl0ZXJhdG9yc2AgYXJndW1lbnQgZGV0ZXJtaW5lcyB0aGVcbiAqIHN0cnVjdHVyZSBvZiBlbGVtZW50cyBpbiB0aGUgcmVzdWx0aW5nIGl0ZXJhdG9yLlxuICpcbiAqIERvaW5nIHRoaXMgaW4gYSBjb25jdXJyZW5jeS1zYWZlIHdheSByZXF1aXJlcyBzb21lIHRyaWNrZXJ5LiAgSW5cbiAqIHBhcnRpY3VsYXIsIHdlIHdhbnQgdGhpcyBzdHJlYW0gdG8gcmV0dXJuIHRoZSBlbGVtZW50cyBmcm9tIHRoZVxuICogdW5kZXJseWluZyBzdHJlYW1zIGluIHRoZSBjb3JyZWN0IG9yZGVyIGFjY29yZGluZyB0byB3aGVuIG5leHQoKSB3YXNcbiAqIGNhbGxlZCwgZXZlbiBpZiB0aGUgcmVzdWx0aW5nIFByb21pc2VzIHJlc29sdmUgaW4gYSBkaWZmZXJlbnQgb3JkZXIuXG4gKlxuICogQHBhcmFtIGl0ZXJhdG9yczogQW4gYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5pbmcgTGF6eUl0ZXJhdG9ycyBhdCB0aGVcbiAqIGxlYXZlcy5cbiAqIEBwYXJhbSBtaXNtYXRjaE1vZGU6IERldGVybWluZXMgd2hhdCB0byBkbyB3aGVuIG9uZSB1bmRlcmx5aW5nIGl0ZXJhdG9yXG4gKiBpcyBleGhhdXN0ZWQgYmVmb3JlIHRoZSBvdGhlcnMuICBgWmlwTWlzbWF0Y2hNb2RlLkZBSUxgICh0aGUgZGVmYXVsdClcbiAqIGNhdXNlcyBhbiBlcnJvciB0byBiZSB0aHJvd24gaW4gdGhpcyBjYXNlLiAgYFppcE1pc21hdGNoTW9kZS5TSE9SVEVTVGBcbiAqIGNhdXNlcyB0aGUgemlwcGVkIGl0ZXJhdG9yIHRvIHRlcm1pbmF0ZSB3aXRoIHRoZSBmdXJzdCB1bmRlcmx5aW5nXG4gKiBzdHJlYW1zLCBzbyBlbGVtZW50cyByZW1haW5pbmcgb24gdGhlIGxvbmdlciBzdHJlYW1zIGFyZSBpZ25vcmVkLlxuICogYFppcE1pc21hdGNoTW9kZS5MT05HRVNUYCBjYXVzZXMgdGhlIHppcHBlZCBzdHJlYW0gdG8gY29udGludWUsIGZpbGxpbmdcbiAqIGluIG51bGxzIGZvciB0aGUgZXhoYXVzdGVkIHN0cmVhbXMsIHVudGlsIGFsbCBzdHJlYW1zIGFyZSBleGhhdXN0ZWQuXG4gKi9cbmNsYXNzIFppcEl0ZXJhdG9yPE8gZXh0ZW5kcyB0Zi5UZW5zb3JDb250YWluZXI+IGV4dGVuZHMgTGF6eUl0ZXJhdG9yPE8+IHtcbiAgcHJpdmF0ZSBjb3VudCA9IDA7XG4gIHByaXZhdGUgY3VycmVudFByb21pc2U6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8Tz4+ID0gbnVsbDtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCByZWFkb25seSBpdGVyYXRvcnM6IEl0ZXJhdG9yQ29udGFpbmVyLFxuICAgICAgcHJvdGVjdGVkIHJlYWRvbmx5IG1pc21hdGNoTW9kZTogWmlwTWlzbWF0Y2hNb2RlID0gWmlwTWlzbWF0Y2hNb2RlLkZBSUwpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbiAgc3VtbWFyeSgpIHtcbiAgICBjb25zdCB1cHN0cmVhbVN1bW1hcmllcyA9ICdUT0RPOiBmaWxsIGluIHVwc3RyZWFtIG9mIHppcCBzdW1tYXJpZXMnO1xuICAgIHJldHVybiBgeyR7dXBzdHJlYW1TdW1tYXJpZXN9fSAtPiBaaXBgO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBuZXh0U3RhdGUoYWZ0ZXJTdGF0ZTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxPPj4pOlxuICAgICAgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxPPj4ge1xuICAgIC8vIFRoaXMgY2hhaW5pbmcgZW5zdXJlcyB0aGF0IHRoZSB1bmRlcmx5aW5nIG5leHQoKSBhcmUgbm90IGV2ZW4gY2FsbGVkXG4gICAgLy8gYmVmb3JlIHRoZSBwcmV2aW91cyBvbmVzIGhhdmUgcmVzb2x2ZWQuXG4gICAgYXdhaXQgYWZ0ZXJTdGF0ZTtcblxuICAgIC8vIENvbGxlY3QgdW5kZXJseWluZyBpdGVyYXRvciBcImRvbmVcIiBzaWduYWxzIGFzIGEgc2lkZSBlZmZlY3QgaW5cbiAgICAvLyBnZXROZXh0KClcbiAgICBsZXQgbnVtSXRlcmF0b3JzID0gMDtcbiAgICBsZXQgaXRlcmF0b3JzRG9uZSA9IDA7XG5cbiAgICBmdW5jdGlvbiBnZXROZXh0KGNvbnRhaW5lcjogSXRlcmF0b3JDb250YWluZXIpOiBEZWVwTWFwQXN5bmNSZXN1bHQge1xuICAgICAgaWYgKGNvbnRhaW5lciBpbnN0YW5jZW9mIExhenlJdGVyYXRvcikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjb250YWluZXIubmV4dCgpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHZhbHVlOiByZXN1bHQudGhlbih4ID0+IHtcbiAgICAgICAgICAgIG51bUl0ZXJhdG9ycysrO1xuICAgICAgICAgICAgaWYgKHguZG9uZSkge1xuICAgICAgICAgICAgICBpdGVyYXRvcnNEb25lKys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4geC52YWx1ZTtcbiAgICAgICAgICB9KSxcbiAgICAgICAgICByZWN1cnNlOiBmYWxzZVxuICAgICAgICB9O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgcmVjdXJzZTogdHJ1ZX07XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbWFwcGVkOiBPID0gYXdhaXQgZGVlcE1hcEFuZEF3YWl0QWxsKHRoaXMuaXRlcmF0b3JzLCBnZXROZXh0KTtcblxuICAgIGlmIChudW1JdGVyYXRvcnMgPT09IGl0ZXJhdG9yc0RvbmUpIHtcbiAgICAgIC8vIFRoZSBzdHJlYW1zIGhhdmUgYWxsIGVuZGVkLlxuICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZX07XG4gICAgfVxuICAgIGlmIChpdGVyYXRvcnNEb25lID4gMCkge1xuICAgICAgc3dpdGNoICh0aGlzLm1pc21hdGNoTW9kZSkge1xuICAgICAgICBjYXNlIFppcE1pc21hdGNoTW9kZS5GQUlMOlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ1ppcHBlZCBzdHJlYW1zIHNob3VsZCBoYXZlIHRoZSBzYW1lIGxlbmd0aC4gJyArXG4gICAgICAgICAgICAgIGBNaXNtYXRjaGVkIGF0IGVsZW1lbnQgJHt0aGlzLmNvdW50fS5gKTtcbiAgICAgICAgY2FzZSBaaXBNaXNtYXRjaE1vZGUuU0hPUlRFU1Q6XG4gICAgICAgICAgcmV0dXJuIHt2YWx1ZTogbnVsbCwgZG9uZTogdHJ1ZX07XG4gICAgICAgIGNhc2UgWmlwTWlzbWF0Y2hNb2RlLkxPTkdFU1Q6XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgLy8gQ29udGludWUuICBUaGUgZXhoYXVzdGVkIHN0cmVhbXMgYWxyZWFkeSBwcm9kdWNlZCB2YWx1ZTogbnVsbC5cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmNvdW50Kys7XG4gICAgcmV0dXJuIHt2YWx1ZTogbWFwcGVkLCBkb25lOiBmYWxzZX07XG4gIH1cblxuICBhc3luYyBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8Tz4+IHtcbiAgICB0aGlzLmN1cnJlbnRQcm9taXNlID0gdGhpcy5uZXh0U3RhdGUodGhpcy5jdXJyZW50UHJvbWlzZSk7XG4gICAgcmV0dXJuIHRoaXMuY3VycmVudFByb21pc2U7XG4gIH1cbn1cblxuLy8gSXRlcmF0b3JzIHRoYXQgbWFpbnRhaW4gYSByaW5nIGJ1ZmZlciBvZiBwZW5kaW5nIHByb21pc2VzXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICogQSBzdHJlYW0gdGhhdCBwcmVmZXRjaGVzIGEgZ2l2ZW4gbnVtYmVyIG9mIGl0ZW1zIGZyb20gYW4gdXBzdHJlYW0gc291cmNlLFxuICogcmV0dXJuaW5nIHRoZW0gaW4gRklGTyBvcmRlci5cbiAqXG4gKiBOb3RlIHRoaXMgcHJlZmV0Y2hlcyBQcm9taXNlcywgYnV0IG1ha2VzIG5vIGd1YXJhbnRlZXMgYWJvdXQgd2hlbiB0aG9zZVxuICogUHJvbWlzZXMgcmVzb2x2ZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFByZWZldGNoSXRlcmF0b3I8VD4gZXh0ZW5kcyBMYXp5SXRlcmF0b3I8VD4ge1xuICBwcm90ZWN0ZWQgYnVmZmVyOiBSaW5nQnVmZmVyPFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHByb3RlY3RlZCB1cHN0cmVhbTogTGF6eUl0ZXJhdG9yPFQ+LCBwcm90ZWN0ZWQgYnVmZmVyU2l6ZTogbnVtYmVyKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmJ1ZmZlciA9IG5ldyBSaW5nQnVmZmVyPFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+PihidWZmZXJTaXplKTtcbiAgfVxuXG4gIHN1bW1hcnkoKSB7XG4gICAgcmV0dXJuIGAke3RoaXMudXBzdHJlYW0uc3VtbWFyeSgpfSAtPiBQcmVmZXRjaGA7XG4gIH1cblxuICAvKipcbiAgICogUmVmaWxsIHRoZSBwcmVmZXRjaCBidWZmZXIuICBSZXR1cm5zIG9ubHkgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyBmdWxsLCBvclxuICAgKiB0aGUgdXBzdHJlYW0gc291cmNlIGlzIGV4aGF1c3RlZC5cbiAgICovXG4gIHByb3RlY3RlZCByZWZpbGwoKSB7XG4gICAgd2hpbGUgKCF0aGlzLmJ1ZmZlci5pc0Z1bGwoKSkge1xuICAgICAgY29uc3QgdiA9IHRoaXMudXBzdHJlYW0ubmV4dCgpO1xuICAgICAgdGhpcy5idWZmZXIucHVzaCh2KTtcbiAgICB9XG4gIH1cblxuICBuZXh0KCk6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+IHtcbiAgICB0aGlzLnJlZmlsbCgpO1xuICAgIC8vIFRoaXMgc2hpZnQgd2lsbCBuZXZlciB0aHJvdyBhbiBlcnJvciBiZWNhdXNlIHRoZSBidWZmZXIgaXMgYWx3YXlzXG4gICAgLy8gZnVsbCBhZnRlciBhIHJlZmlsbC4gSWYgdGhlIHN0cmVhbSBpcyBleGhhdXN0ZWQsIHRoZSBidWZmZXIgd2lsbCBiZVxuICAgIC8vIGZ1bGwgb2YgUHJvbWlzZXMgdGhhdCB3aWxsIHJlc29sdmUgdG8gdGhlIGVuZC1vZi1zdHJlYW0gc2lnbmFsLlxuICAgIHJldHVybiB0aGlzLmJ1ZmZlci5zaGlmdCgpO1xuICB9XG59XG5cbi8qKlxuICogQSBzdHJlYW0gdGhhdCBwZXJmb3JtcyBhIHNsaWRpbmctd2luZG93IHJhbmRvbSBzaHVmZmxlIG9uIGFuIHVwc3RyZWFtXG4gKiBzb3VyY2UuIFRoaXMgaXMgbGlrZSBhIGBQcmVmZXRjaEl0ZXJhdG9yYCBleGNlcHQgdGhhdCB0aGUgaXRlbXMgYXJlXG4gKiByZXR1cm5lZCBpbiByYW5kb21pemVkIG9yZGVyLiAgTWl4aW5nIG5hdHVyYWxseSBpbXByb3ZlcyBhcyB0aGUgYnVmZmVyXG4gKiBzaXplIGluY3JlYXNlcy5cbiAqL1xuZXhwb3J0IGNsYXNzIFNodWZmbGVJdGVyYXRvcjxUPiBleHRlbmRzIFByZWZldGNoSXRlcmF0b3I8VD4ge1xuICBwcml2YXRlIHJlYWRvbmx5IHJhbmRvbTogc2VlZHJhbmRvbS5wcm5nO1xuXG4gIC8vIFN0cmljdCBQcm9taXNlIGV4ZWN1dGlvbiBvcmRlcjpcbiAgLy8gYSBuZXh0KCkgY2FsbCBtYXkgbm90IGV2ZW4gYmVnaW4gdW50aWwgdGhlIHByZXZpb3VzIG9uZSBjb21wbGV0ZXMuXG4gIHByaXZhdGUgbGFzdFJlYWQ6IFByb21pc2U8SXRlcmF0b3JSZXN1bHQ8VD4+O1xuXG4gIC8vIExvY2FsIHN0YXRlIHRoYXQgc2hvdWxkIG5vdCBiZSBjbG9iYmVyZWQgYnkgb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbi5cbiAgcHJpdmF0ZSB1cHN0cmVhbUV4aGF1c3RlZCA9IGZhbHNlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcHJvdGVjdGVkIHVwc3RyZWFtOiBMYXp5SXRlcmF0b3I8VD4sIHByb3RlY3RlZCB3aW5kb3dTaXplOiBudW1iZXIsXG4gICAgICBzZWVkPzogc3RyaW5nKSB7XG4gICAgc3VwZXIodXBzdHJlYW0sIHdpbmRvd1NpemUpO1xuICAgIHRoaXMucmFuZG9tID0gc2VlZHJhbmRvbS5hbGVhKHNlZWQgfHwgdGYudXRpbC5ub3coKS50b1N0cmluZygpKTtcbiAgICB0aGlzLmxhc3RSZWFkID0gUHJvbWlzZS5yZXNvbHZlKHt2YWx1ZTogbnVsbCwgZG9uZTogZmFsc2V9KTtcbiAgfVxuXG4gIGFzeW5jIG5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRoaXMgc2V0cyB0aGlzLmxhc3RSZWFkIHRvIGEgbmV3IFByb21pc2UgcmlnaHQgYXdheSwgYXMgb3Bwb3NlZCB0b1xuICAgIC8vIHNheWluZyBgYXdhaXQgdGhpcy5sYXN0UmVhZDsgdGhpcy5sYXN0UmVhZCA9IHRoaXMuc2VyaWFsTmV4dCgpO2Agd2hpY2hcbiAgICAvLyB3b3VsZCBub3Qgd29yayBiZWNhdXNlIHRoaXMubmV4dFJlYWQgd291bGQgYmUgdXBkYXRlZCBvbmx5IGFmdGVyIHRoZVxuICAgIC8vIHByb21pc2UgcmVzb2x2ZXMuXG4gICAgdGhpcy5sYXN0UmVhZCA9IHRoaXMubGFzdFJlYWQudGhlbigoKSA9PiB0aGlzLnNlcmlhbE5leHQoKSk7XG4gICAgcmV0dXJuIHRoaXMubGFzdFJlYWQ7XG4gIH1cblxuICBwcml2YXRlIHJhbmRvbUludChtYXg6IG51bWJlcikge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMucmFuZG9tKCkgKiBtYXgpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGNob29zZUluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMucmFuZG9tSW50KHRoaXMuYnVmZmVyLmxlbmd0aCgpKTtcbiAgfVxuXG4gIGFzeW5jIHNlcmlhbE5leHQoKTogUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj4ge1xuICAgIC8vIFRPRE8oc29lcmdlbCk6IGNvbnNpZGVyIHBlcmZvcm1hbmNlXG4gICAgaWYgKCF0aGlzLnVwc3RyZWFtRXhoYXVzdGVkKSB7XG4gICAgICB0aGlzLnJlZmlsbCgpO1xuICAgIH1cbiAgICB3aGlsZSAoIXRoaXMuYnVmZmVyLmlzRW1wdHkoKSkge1xuICAgICAgY29uc3QgY2hvc2VuSW5kZXggPSB0aGlzLmNob29zZUluZGV4KCk7XG4gICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLmJ1ZmZlci5zaHVmZmxlRXhjaXNlKGNob3NlbkluZGV4KTtcbiAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICB0aGlzLnVwc3RyZWFtRXhoYXVzdGVkID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMucmVmaWxsKCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7dmFsdWU6IG51bGwsIGRvbmU6IHRydWV9O1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function assertNotComplex(tensor, opName) {\n    if (!Array.isArray(tensor)) {\n        tensor = [tensor];\n    }\n    tensor.forEach(t => {\n        if (t != null) {\n            util.assert(t.dtype !== 'complex64', () => `${opName} does not support complex64 tensors in the CPU backend.`);\n        }\n    });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3B1X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9jcHVfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixNQUErQixFQUFFLE1BQWM7SUFDakQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDMUIsTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkI7SUFDRCxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRTtZQUNiLElBQUksQ0FBQyxNQUFNLENBQ1AsQ0FBQyxDQUFDLEtBQUssS0FBSyxXQUFXLEVBQ3ZCLEdBQUcsRUFBRSxDQUFDLEdBQ0YsTUFBTSx5REFBeUQsQ0FBQyxDQUFDO1NBQzFFO0lBQ0gsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnROb3RDb21wbGV4KFxuICAgIHRlbnNvcjogVGVuc29ySW5mb3xUZW5zb3JJbmZvW10sIG9wTmFtZTogc3RyaW5nKTogdm9pZCB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh0ZW5zb3IpKSB7XG4gICAgdGVuc29yID0gW3RlbnNvcl07XG4gIH1cbiAgdGVuc29yLmZvckVhY2godCA9PiB7XG4gICAgaWYgKHQgIT0gbnVsbCkge1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgICAgdC5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcsXG4gICAgICAgICAgKCkgPT4gYCR7XG4gICAgICAgICAgICAgIG9wTmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgdGVuc29ycyBpbiB0aGUgQ1BVIGJhY2tlbmQuYCk7XG4gICAgfVxuICB9KTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, buffer, DataStorage, engine, env, kernel_impls, KernelBackend, util } from '@tensorflow/tfjs-core';\nconst whereImpl = kernel_impls.whereImpl;\nimport { assertNotComplex } from './cpu_util';\nexport class MathBackendCPU extends KernelBackend {\n    constructor() {\n        super();\n        this.blockSize = 48;\n        this.firstUse = true;\n        this.data = new DataStorage(this, engine());\n    }\n    nextDataId() {\n        return MathBackendCPU.nextDataId++;\n    }\n    write(values, shape, dtype) {\n        if (this.firstUse) {\n            this.firstUse = false;\n            if (env().get('IS_NODE')) {\n                backend_util.warn('\\n============================\\n' +\n                    'Hi, looks like you are running TensorFlow.js in ' +\n                    'Node.js. To speed things up dramatically, install our node ' +\n                    'backend, visit https://github.com/tensorflow/tfjs-node for more details. ' +\n                    '\\n============================');\n            }\n        }\n        const dataId = { id: this.nextDataId() };\n        this.data.set(dataId, { values, dtype, refCount: 1 });\n        return dataId;\n    }\n    /**\n     * Create a data bucket in cpu backend.\n     * @param shape Shape of the `TensorInfo`.\n     * @param dtype DType of the `TensorInfo`.\n     * @param values The value of the `TensorInfo` stored as a flattened array.\n     */\n    makeTensorInfo(shape, dtype, values) {\n        let outId;\n        if (dtype === 'string' && values != null && values.length > 0 &&\n            util.isString(values[0])) {\n            const encodedValues = values.map(d => util.encodeString(d));\n            outId = this.write(encodedValues, shape, dtype);\n        }\n        else {\n            outId = this.write(values, shape, dtype);\n        }\n        return { dataId: outId, shape, dtype };\n    }\n    /** Return refCount of a `TensorData`. */\n    refCount(dataId) {\n        if (this.data.has(dataId)) {\n            const tensorData = this.data.get(dataId);\n            return tensorData.refCount;\n        }\n        return 0;\n    }\n    /** Increase refCount of a `TensorData`. */\n    incRef(dataId) {\n        const tensorData = this.data.get(dataId);\n        tensorData.refCount++;\n    }\n    /** Decrease refCount of a `TensorData`. */\n    decRef(dataId) {\n        if (this.data.has(dataId)) {\n            const tensorData = this.data.get(dataId);\n            tensorData.refCount--;\n        }\n    }\n    move(dataId, values, shape, dtype, refCount) {\n        this.data.set(dataId, { values, dtype, refCount });\n    }\n    numDataIds() {\n        return this.data.numDataIds();\n    }\n    async read(dataId) {\n        return this.readSync(dataId);\n    }\n    readSync(dataId) {\n        const { dtype, complexTensorInfos } = this.data.get(dataId);\n        if (dtype === 'complex64') {\n            const realValues = this.readSync(complexTensorInfos.real.dataId);\n            const imagValues = this.readSync(complexTensorInfos.imag.dataId);\n            return backend_util.mergeRealAndImagArrays(realValues, imagValues);\n        }\n        return this.data.get(dataId).values;\n    }\n    bufferSync(t) {\n        const data = this.readSync(t.dataId);\n        if (t.dtype === 'string') {\n            try {\n                // Decode the bytes into string.\n                const strings = data.map(d => util.decodeString(d));\n                return buffer(t.shape, t.dtype, strings);\n            }\n            catch (_a) {\n                throw new Error('Failed to decode encoded string bytes into utf-8');\n            }\n        }\n        return buffer(t.shape, t.dtype, data);\n    }\n    makeOutput(values, shape, dtype) {\n        return engine().makeTensorFromTensorInfo(this.makeTensorInfo(shape, dtype, values), this);\n    }\n    /**\n     * Dispose the memory if the dataId has 0 refCount. Return true if the memory\n     * is released or memory is not managed in this backend, false if memory is\n     * not cleared.\n     * @param dataId\n     * @oaram force Optional, remove the data regardless of refCount\n     */\n    disposeData(dataId, force = false) {\n        if (this.data.has(dataId)) {\n            this.data.get(dataId).refCount--;\n            if (!force && this.data.get(dataId).refCount > 0) {\n                return false;\n            }\n            const { complexTensorInfos } = this.data.get(dataId);\n            if (complexTensorInfos != null) {\n                this.disposeData(complexTensorInfos.real.dataId, true);\n                this.disposeData(complexTensorInfos.imag.dataId, true);\n            }\n            this.data.delete(dataId);\n        }\n        return true;\n    }\n    disposeIntermediateTensorInfo(tensorInfo) {\n        this.disposeData(tensorInfo.dataId);\n    }\n    async time(f) {\n        const start = util.now();\n        f();\n        const kernelMs = util.now() - start;\n        return { kernelMs };\n    }\n    memory() {\n        return {\n            // Unreliable due to automatic gc. The numbers above are cumulative.\n            unreliable: true,\n            reasons: ['The reported memory is an upper bound. Due to automatic garbage ' +\n                    'collection, the true allocated memory may be less.']\n        };\n    }\n    where(condition) {\n        assertNotComplex([condition], 'where');\n        const condVals = this.readSync(condition.dataId);\n        return whereImpl(condition.shape, condVals);\n    }\n    dispose() { }\n    floatPrecision() {\n        return 32;\n    }\n    /** Returns the smallest representable number.  */\n    epsilon() {\n        return super.epsilon();\n    }\n}\nMathBackendCPU.nextDataId = 0;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZF9jcHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9iYWNrZW5kX2NwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFxQixNQUFNLEVBQUUsV0FBVyxFQUFZLE1BQU0sRUFBRSxHQUFHLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBMEUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFN04sTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FBQztBQUN6QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFnQjVDLE1BQU0sT0FBTyxjQUFlLFNBQVEsYUFBYTtJQVUvQztRQUNFLEtBQUssRUFBRSxDQUFDO1FBVkgsY0FBUyxHQUFHLEVBQUUsQ0FBQztRQUdkLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFRdEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLFdBQVcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBUE8sVUFBVTtRQUNoQixPQUFPLGNBQWMsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBT0QsS0FBSyxDQUFDLE1BQWtDLEVBQUUsS0FBZSxFQUFFLEtBQWU7UUFFeEUsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1lBQ3RCLElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFO2dCQUN4QixZQUFZLENBQUMsSUFBSSxDQUNiLGtDQUFrQztvQkFDbEMsa0RBQWtEO29CQUNsRCw2REFBNkQ7b0JBQzdELDJFQUEyRTtvQkFDM0UsZ0NBQWdDLENBQUMsQ0FBQzthQUN2QztTQUNGO1FBQ0QsTUFBTSxNQUFNLEdBQUcs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Q0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTTtRQUNKLE9BQU87WUFDTCxvRUFBb0U7WUFDcEUsVUFBVSxFQUFFLElBQUk7WUFDaEIsT0FBTyxFQUNILENBQUMsa0VBQWtFO29CQUNsRSxvREFBb0QsQ0FBQztTQUMzRCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxTQUFpQjtRQUNyQixnQkFBZ0IsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXZDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBZSxDQUFDO1FBQy9ELE9BQU8sU0FBUyxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUVELE9BQU8sS0FBSSxDQUFDO0lBRVosY0FBYztRQUNaLE9BQU8sRUFBRSxDQUFDO0lBQ1osQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxPQUFPO1FBQ0wsT0FBTyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQzs7QUE3TGMseUJBQVUsR0FBRyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBCYWNrZW5kVGltaW5nSW5mbywgYnVmZmVyLCBEYXRhU3RvcmFnZSwgRGF0YVR5cGUsIGVuZ2luZSwgZW52LCBrZXJuZWxfaW1wbHMsIEtlcm5lbEJhY2tlbmQsIFJhbmssIFNoYXBlTWFwLCBUZW5zb3IsIFRlbnNvcjJELCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4vY3B1X3V0aWwnO1xuXG5pbnRlcmZhY2UgRGF0YUlkIHt9XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGVuc29yRGF0YTxEIGV4dGVuZHMgRGF0YVR5cGU+IHtcbiAgdmFsdWVzPzogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXM7XG4gIGR0eXBlOiBEO1xuICAvLyBGb3IgY29tcGxleCBudW1iZXJzLCB0aGUgcmVhbCBhbmQgaW1hZ2luYXJ5IHBhcnRzIGFyZSBzdG9yZWQgYXMgdGhlaXIgb3duXG4gIC8vIGluZGl2aWR1YWwgdGVuc29ycywgd2l0aCBhIHBhcmVudCBqb2luaW5nIHRoZSB0d28gd2l0aCB0aGVcbiAgLy8gY29tcGxleFRlbnNvckluZm9zIGZpZWxkLlxuICBjb21wbGV4VGVuc29ySW5mb3M/OiB7cmVhbDogVGVuc29ySW5mbywgaW1hZzogVGVuc29ySW5mb307XG4gIC8vIHJlZkNvdW50IGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRlbnNvcnMgcmVmZXJlbmNlIGl0LiBVc2VkIGZvciBtZW1vcnlcbiAgLy8gbWFuYWdlbWVudC5cbiAgcmVmQ291bnQ6IG51bWJlcjtcbn1cblxuZXhwb3J0IGNsYXNzIE1hdGhCYWNrZW5kQ1BVIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gIHB1YmxpYyBibG9ja1NpemUgPSA0ODtcblxuICBkYXRhOiBEYXRhU3RvcmFnZTxUZW5zb3JEYXRhPERhdGFUeXBlPj47XG4gIHByaXZhdGUgZmlyc3RVc2UgPSB0cnVlO1xuICBwcml2YXRlIHN0YXRpYyBuZXh0RGF0YUlkID0gMDtcbiAgcHJpdmF0ZSBuZXh0RGF0YUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGhCYWNrZW5kQ1BVLm5leHREYXRhSWQrKztcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5kYXRhID0gbmV3IERhdGFTdG9yYWdlKHRoaXMsIGVuZ2luZSgpKTtcbiAgfVxuXG4gIHdyaXRlKHZhbHVlczogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlKTpcbiAgICAgIERhdGFJZCB7XG4gICAgaWYgKHRoaXMuZmlyc3RVc2UpIHtcbiAgICAgIHRoaXMuZmlyc3RVc2UgPSBmYWxzZTtcbiAgICAgIGlmIChlbnYoKS5nZXQoJ0lTX05PREUnKSkge1xuICAgICAgICBiYWNrZW5kX3V0aWwud2FybihcbiAgICAgICAgICAgICdcXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09XFxuJyArXG4gICAgICAgICAgICAnSGksIGxvb2tzIGxpa2UgeW91IGFyZSBydW5uaW5nIFRlbnNvckZsb3cuanMgaW4gJyArXG4gICAgICAgICAgICAnTm9kZS5qcy4gVG8gc3BlZWQgdGhpbmdzIHVwIGRyYW1hdGljYWxseSwgaW5zdGFsbCBvdXIgbm9kZSAnICtcbiAgICAgICAgICAgICdiYWNrZW5kLCB2aXNpdCBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzLW5vZGUgZm9yIG1vcmUgZGV0YWlscy4gJyArXG4gICAgICAgICAgICAnXFxuPT09PT09PT09PT09PT09PT09PT09PT09PT09PScpO1xuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBkYXRhSWQgPSB7aWQ6IHRoaXMubmV4dERhdGFJZCgpfTtcblxuICAgIHRoaXMuZGF0YS5zZXQoZGF0YUlkLCB7dmFsdWVzLCBkdHlwZSwgcmVmQ291bnQ6IDF9KTtcblxuICAgIHJldHVybiBkYXRhSWQ7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGF0YSBidWNrZXQgaW4gY3B1IGJhY2tlbmQuXG4gICAqIEBwYXJhbSBzaGFwZSBTaGFwZSBvZiB0aGUgYFRlbnNvckluZm9gLlxuICAgKiBAcGFyYW0gZHR5cGUgRFR5cGUgb2YgdGhlIGBUZW5zb3JJbmZvYC5cbiAgICogQHBhcmFtIHZhbHVlcyBUaGUgdmFsdWUgb2YgdGhlIGBUZW5zb3JJbmZvYCBzdG9yZWQgYXMgYSBmbGF0dGVuZWQgYXJyYXkuXG4gICAqL1xuICBtYWtlVGVuc29ySW5mbyhcbiAgICAgIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgICAgdmFsdWVzPzogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXN8c3RyaW5nW10pOiBUZW5zb3JJbmZvIHtcbiAgICBsZXQgb3V0SWQ7XG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJyAmJiB2YWx1ZXMgIT0gbnVsbCAmJiB2YWx1ZXMubGVuZ3RoID4gMCAmJlxuICAgICAgICB1dGlsLmlzU3RyaW5nKHZhbHVlc1swXSkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRWYWx1ZXMgPVxuICAgICAgICAgICh2YWx1ZXMgYXMge30gYXMgc3RyaW5nW10pLm1hcChkID0+IHV0aWwuZW5jb2RlU3RyaW5nKGQpKTtcblxuICAgICAgb3V0SWQgPSB0aGlzLndyaXRlKGVuY29kZWRWYWx1ZXMsIHNoYXBlLCBkdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dElkID0gdGhpcy53cml0ZSh2YWx1ZXMgYXMgVHlwZWRBcnJheSwgc2hhcGUsIGR0eXBlKTtcbiAgICB9XG5cbiAgICByZXR1cm4ge2RhdGFJZDogb3V0SWQsIHNoYXBlLCBkdHlwZX07XG4gIH1cblxuICAvKiogUmV0dXJuIHJlZkNvdW50IG9mIGEgYFRlbnNvckRhdGFgLiAqL1xuICByZWZDb3VudChkYXRhSWQ6IERhdGFJZCk6IG51bWJlciB7XG4gICAgaWYgKHRoaXMuZGF0YS5oYXMoZGF0YUlkKSkge1xuICAgICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICAgIHJldHVybiB0ZW5zb3JEYXRhLnJlZkNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIC8qKiBJbmNyZWFzZSByZWZDb3VudCBvZiBhIGBUZW5zb3JEYXRhYC4gKi9cbiAgaW5jUmVmKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGVuc29yRGF0YSA9IHRoaXMuZGF0YS5nZXQoZGF0YUlkKTtcbiAgICB0ZW5zb3JEYXRhLnJlZkNvdW50Kys7XG4gIH1cblxuICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gIGRlY1JlZihkYXRhSWQ6IERhdGFJZCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IHRlbnNvckRhdGEgPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG4gICAgICB0ZW5zb3JEYXRhLnJlZkNvdW50LS07XG4gICAgfVxuICB9XG5cbiAgbW92ZShcbiAgICAgIGRhdGFJZDogRGF0YUlkLCB2YWx1ZXM6IGJhY2tlbmRfdXRpbC5CYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sXG4gICAgICBkdHlwZTogRGF0YVR5cGUsIHJlZkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGEuc2V0KGRhdGFJZCwge3ZhbHVlcywgZHR5cGUsIHJlZkNvdW50fSk7XG4gIH1cblxuICBudW1EYXRhSWRzKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5udW1EYXRhSWRzKCk7XG4gIH1cblxuICBhc3luYyByZWFkKGRhdGFJZDogRGF0YUlkKTogUHJvbWlzZTxiYWNrZW5kX3V0aWwuQmFja2VuZFZhbHVlcz4ge1xuICAgIHJldHVybiB0aGlzLnJlYWRTeW5jKGRhdGFJZCk7XG4gIH1cbiAgcmVhZFN5bmMoZGF0YUlkOiBEYXRhSWQpOiBiYWNrZW5kX3V0aWwuQmFja2VuZFZhbHVlcyB7XG4gICAgY29uc3Qge2R0eXBlLCBjb21wbGV4VGVuc29ySW5mb3N9ID0gdGhpcy5kYXRhLmdldChkYXRhSWQpO1xuXG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgY29uc3QgcmVhbFZhbHVlcyA9XG4gICAgICAgICAgdGhpcy5yZWFkU3luYyhjb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQpIGFzIEZsb2F0MzJBcnJheTtcbiAgICAgIGNvbnN0IGltYWdWYWx1ZXMgPVxuICAgICAgICAgIHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICByZXR1cm4gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHVlcywgaW1hZ1ZhbHVlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuZGF0YS5nZXQoZGF0YUlkKS52YWx1ZXM7XG4gIH1cblxuICBidWZmZXJTeW5jPFIgZXh0ZW5kcyBSYW5rLCBEIGV4dGVuZHMgRGF0YVR5cGU+KHQ6IFRlbnNvckluZm8pOlxuICAgICAgVGVuc29yQnVmZmVyPFIsIEQ+IHtcbiAgICBjb25zdCBkYXRhID0gdGhpcy5yZWFkU3luYyh0LmRhdGFJZCk7XG4gICAgaWYgKHQuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICAvLyBEZWNvZGUgdGhlIGJ5dGVzIGludG8gc3RyaW5nLlxuICAgICAgICBjb25zdCBzdHJpbmdzID0gKGRhdGEgYXMgVWludDhBcnJheVtdKS5tYXAoZCA9PiB1dGlsLmRlY29kZVN0cmluZyhkKSk7XG4gICAgICAgIHJldHVybiBidWZmZXIodC5zaGFwZSBhcyBTaGFwZU1hcFtSXSwgdC5kdHlwZSwgc3RyaW5ncykgYXNcbiAgICAgICAgICAgIFRlbnNvckJ1ZmZlcjxSLCBEPjtcbiAgICAgIH0gY2F0Y2gge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZhaWxlZCB0byBkZWNvZGUgZW5jb2RlZCBzdHJpbmcgYnl0ZXMgaW50byB1dGYtOCcpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUgYXMgU2hhcGVNYXBbUl0sIHQuZHR5cGUsIGRhdGEgYXMgVHlwZWRBcnJheSkgYXNcbiAgICAgICAgVGVuc29yQnVmZmVyPFIsIEQ+O1xuICB9XG5cbiAgbWFrZU91dHB1dDxUIGV4dGVuZHMgVGVuc29yPihcbiAgICAgIHZhbHVlczogYmFja2VuZF91dGlsLkJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlKTogVCB7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tVGVuc29ySW5mbyhcbiAgICAgICAgICAgICAgIHRoaXMubWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpLCB0aGlzKSBhcyBUO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIG1lbW9yeSBpZiB0aGUgZGF0YUlkIGhhcyAwIHJlZkNvdW50LiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVtb3J5XG4gICAqIGlzIHJlbGVhc2VkIG9yIG1lbW9yeSBpcyBub3QgbWFuYWdlZCBpbiB0aGlzIGJhY2tlbmQsIGZhbHNlIGlmIG1lbW9yeSBpc1xuICAgKiBub3QgY2xlYXJlZC5cbiAgICogQHBhcmFtIGRhdGFJZFxuICAgKiBAb2FyYW0gZm9yY2UgT3B0aW9uYWwsIHJlbW92ZSB0aGUgZGF0YSByZWdhcmRsZXNzIG9mIHJlZkNvdW50XG4gICAqL1xuICBkaXNwb3NlRGF0YShkYXRhSWQ6IERhdGFJZCwgZm9yY2UgPSBmYWxzZSk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmRhdGEuaGFzKGRhdGFJZCkpIHtcbiAgICAgIHRoaXMuZGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudC0tO1xuICAgICAgaWYgKCFmb3JjZSAmJiB0aGlzLmRhdGEuZ2V0KGRhdGFJZCkucmVmQ291bnQgPiAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qge2NvbXBsZXhUZW5zb3JJbmZvc30gPSB0aGlzLmRhdGEuZ2V0KGRhdGFJZCk7XG5cbiAgICAgIGlmIChjb21wbGV4VGVuc29ySW5mb3MgIT0gbnVsbCkge1xuICAgICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCwgdHJ1ZSk7XG4gICAgICAgIHRoaXMuZGlzcG9zZURhdGEoY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLCB0cnVlKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5kYXRhLmRlbGV0ZShkYXRhSWQpO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm86IFRlbnNvckluZm8pOiB2b2lkIHtcbiAgICB0aGlzLmRpc3Bvc2VEYXRhKHRlbnNvckluZm8uZGF0YUlkKTtcbiAgfVxuXG4gIGFzeW5jIHRpbWUoZjogKCkgPT4gdm9pZCk6IFByb21pc2U8QmFja2VuZFRpbWluZ0luZm8+IHtcbiAgICBjb25zdCBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgZigpO1xuICAgIGNvbnN0IGtlcm5lbE1zID0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgIHJldHVybiB7a2VybmVsTXN9O1xuICB9XG5cbiAgbWVtb3J5KCkge1xuICAgIHJldHVybiB7XG4gICAgICAvLyBVbnJlbGlhYmxlIGR1ZSB0byBhdXRvbWF0aWMgZ2MuIFRoZSBudW1iZXJzIGFib3ZlIGFyZSBjdW11bGF0aXZlLlxuICAgICAgdW5yZWxpYWJsZTogdHJ1ZSxcbiAgICAgIHJlYXNvbnM6XG4gICAgICAgICAgWydUaGUgcmVwb3J0ZWQgbWVtb3J5IGlzIGFuIHVwcGVyIGJvdW5kLiBEdWUgdG8gYXV0b21hdGljIGdhcmJhZ2UgJyArXG4gICAgICAgICAgICdjb2xsZWN0aW9uLCB0aGUgdHJ1ZSBhbGxvY2F0ZWQgbWVtb3J5IG1heSBiZSBsZXNzLiddXG4gICAgfTtcbiAgfVxuXG4gIHdoZXJlKGNvbmRpdGlvbjogVGVuc29yKTogVGVuc29yMkQge1xuICAgIGFzc2VydE5vdENvbXBsZXgoW2NvbmRpdGlvbl0sICd3aGVyZScpO1xuXG4gICAgY29uc3QgY29uZFZhbHMgPSB0aGlzLnJlYWRTeW5jKGNvbmRpdGlvbi5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gICAgcmV0dXJuIHdoZXJlSW1wbChjb25kaXRpb24uc2hhcGUsIGNvbmRWYWxzKTtcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7fVxuXG4gIGZsb2F0UHJlY2lzaW9uKCk6IDE2fDMyIHtcbiAgICByZXR1cm4gMzI7XG4gIH1cblxuICAvKiogUmV0dXJucyB0aGUgc21hbGxlc3QgcmVwcmVzZW50YWJsZSBudW1iZXIuICAqL1xuICBlcHNpbG9uKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHN1cGVyLmVwc2lsb24oKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Abs, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function simpleAbsImpl(vals) {\n    const resultValues = new Float32Array(vals.length);\n    for (let i = 0; i < vals.length; ++i) {\n        resultValues[i] = Math.abs(vals[i]);\n    }\n    return resultValues;\n}\nexport const abs = (args) => {\n    const { x } = args.inputs;\n    const cpuBackend = args.backend;\n    assertNotComplex(x, 'abs');\n    let resultValues = new Float32Array(util.sizeFromShape(x.shape));\n    const values = cpuBackend.data.get(x.dataId).values;\n    resultValues = simpleAbsImpl(values);\n    return cpuBackend.makeOutput(resultValues, x.shape, x.dtype);\n};\nexport const absConfig = {\n    kernelName: Abs,\n    backendName: 'cpu',\n    kernelFunc: abs,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BYnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBbUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFBZ0I7SUFDNUMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ3JDO0lBQ0QsT0FBTyxZQUFZLENBQUM7QUFDdEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLElBQWtELEVBQUUsRUFBRTtJQUN4RSxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUN4QixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBRWhDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUzQixJQUFJLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2xFLFlBQVksR0FBRyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFckMsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvRCxDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FicywgQWJzSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2ltcGxlQWJzSW1wbCh2YWxzOiBUeXBlZEFycmF5KTogRmxvYXQzMkFycmF5IHtcbiAgY29uc3QgcmVzdWx0VmFsdWVzID0gbmV3IEZsb2F0MzJBcnJheSh2YWxzLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgIHJlc3VsdFZhbHVlc1tpXSA9IE1hdGguYWJzKHZhbHNbaV0pO1xuICB9XG4gIHJldHVybiByZXN1bHRWYWx1ZXM7XG59XG5cbmV4cG9ydCBjb25zdCBhYnMgPSAoYXJnczoge2lucHV0czogQWJzSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVX0pID0+IHtcbiAgY29uc3Qge3h9ID0gYXJncy5pbnB1dHM7XG4gIGNvbnN0IGNwdUJhY2tlbmQgPSBhcmdzLmJhY2tlbmQ7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYWJzJyk7XG5cbiAgbGV0IHJlc3VsdFZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpKTtcbiAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIHJlc3VsdFZhbHVlcyA9IHNpbXBsZUFic0ltcGwodmFsdWVzKTtcblxuICByZXR1cm4gY3B1QmFja2VuZC5tYWtlT3V0cHV0KHJlc3VsdFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSk7XG59O1xuXG5leHBvcnQgY29uc3QgYWJzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFicyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhYnMgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\n/**\n * Template that creates implementation for binary ops. Supports broadcast.\n */\nexport function createSimpleBinaryKernelImpl(op) {\n    return (aShape, bShape, aVals, bVals, dtype) => {\n        const newShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n        const resultRank = newShape.length;\n        const resultStrides = util.computeStrides(newShape);\n        const resultSize = util.sizeFromShape(newShape);\n        const result = util.getTypedArrayFromDType(dtype, resultSize);\n        const aRank = aShape.length;\n        const bRank = bShape.length;\n        const aStrides = util.computeStrides(aShape);\n        const bStrides = util.computeStrides(bShape);\n        const aBroadcastDims = backend_util.getBroadcastDims(aShape, newShape);\n        const bBroadcastDims = backend_util.getBroadcastDims(bShape, newShape);\n        if (aBroadcastDims.length + bBroadcastDims.length === 0) {\n            for (let i = 0; i < result.length; ++i) {\n                result[i] = op(aVals[i % aVals.length], bVals[i % bVals.length]);\n            }\n        }\n        else {\n            for (let i = 0; i < result.length; ++i) {\n                const loc = util.indexToLoc(i, resultRank, resultStrides);\n                const aLoc = loc.slice(-aRank);\n                aBroadcastDims.forEach(d => aLoc[d] = 0);\n                const aIndex = util.locToIndex(aLoc, aRank, aStrides);\n                const bLoc = loc.slice(-bRank);\n                bBroadcastDims.forEach(d => bLoc[d] = 0);\n                const bIndex = util.locToIndex(bLoc, bRank, bStrides);\n                result[i] = op(aVals[aIndex], bVals[bIndex]);\n            }\n        }\n        return [result, newShape];\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy91dGlscy9iaW5hcnlfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFxRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUk1Rzs7R0FFRztBQUNILE1BQU0sVUFBVSw0QkFBNEIsQ0FBQyxFQUF5QjtJQUVwRSxPQUFPLENBQUMsTUFBZ0IsRUFBRSxNQUFnQixFQUFFLEtBQWlCLEVBQ3JELEtBQWlCLEVBQUUsS0FBZSxFQUEwQixFQUFFO1FBQ3BFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFekUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUNuQyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFaEQsTUFBTSxNQUFNLEdBQ1IsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQXdCLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFFdEUsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUM1QixNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBRTVCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3ZFLE1BQU0sY0FBYyxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFdkUsSUFBSSxjQUFjLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1lBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDbEU7U0FDRjthQUFNO1lBQ0wsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7Z0JBQ3RDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztnQkFFMUQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUMvQixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7Z0JBRXRELE1BQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDL0IsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUV0RCxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQzthQUM5QztTQUNGO1FBRUQsT0FBTyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUM1QixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGF0YVR5cGUsIERhdGFWYWx1ZXMsIE51bWVyaWNEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtTaW1wbGVCaW5hcnlLZXJuZWxJbXBsLCBTaW1wbGVCaW5hcnlPcGVyYXRpb259IGZyb20gJy4vYmluYXJ5X3R5cGVzJztcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgaW1wbGVtZW50YXRpb24gZm9yIGJpbmFyeSBvcHMuIFN1cHBvcnRzIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwob3A6IFNpbXBsZUJpbmFyeU9wZXJhdGlvbik6XG4gICAgU2ltcGxlQmluYXJ5S2VybmVsSW1wbCB7XG4gIHJldHVybiAoYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSwgYVZhbHM6IERhdGFWYWx1ZXMsXG4gICAgICAgICAgYlZhbHM6IERhdGFWYWx1ZXMsIGR0eXBlOiBEYXRhVHlwZSk6IFtUeXBlZEFycmF5LCBudW1iZXJbXV0gPT4ge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcblxuICAgIGNvbnN0IHJlc3VsdFJhbmsgPSBuZXdTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMobmV3U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUobmV3U2hhcGUpO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKGR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgcmVzdWx0U2l6ZSk7XG5cbiAgICBjb25zdCBhUmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYlJhbmsgPSBiU2hhcGUubGVuZ3RoO1xuXG4gICAgY29uc3QgYVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGFTaGFwZSk7XG4gICAgY29uc3QgYlN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGJTaGFwZSk7XG5cbiAgICBjb25zdCBhQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGFTaGFwZSwgbmV3U2hhcGUpO1xuICAgIGNvbnN0IGJCcm9hZGNhc3REaW1zID0gYmFja2VuZF91dGlsLmdldEJyb2FkY2FzdERpbXMoYlNoYXBlLCBuZXdTaGFwZSk7XG5cbiAgICBpZiAoYUJyb2FkY2FzdERpbXMubGVuZ3RoICsgYkJyb2FkY2FzdERpbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICByZXN1bHRbaV0gPSBvcChhVmFsc1tpICUgYVZhbHMubGVuZ3RoXSwgYlZhbHNbaSAlIGJWYWxzLmxlbmd0aF0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdC5sZW5ndGg7ICsraSkge1xuICAgICAgICBjb25zdCBsb2MgPSB1dGlsLmluZGV4VG9Mb2MoaSwgcmVzdWx0UmFuaywgcmVzdWx0U3RyaWRlcyk7XG5cbiAgICAgICAgY29uc3QgYUxvYyA9IGxvYy5zbGljZSgtYVJhbmspO1xuICAgICAgICBhQnJvYWRjYXN0RGltcy5mb3JFYWNoKGQgPT4gYUxvY1tkXSA9IDApO1xuICAgICAgICBjb25zdCBhSW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoYUxvYywgYVJhbmssIGFTdHJpZGVzKTtcblxuICAgICAgICBjb25zdCBiTG9jID0gbG9jLnNsaWNlKC1iUmFuayk7XG4gICAgICAgIGJCcm9hZGNhc3REaW1zLmZvckVhY2goZCA9PiBiTG9jW2RdID0gMCk7XG4gICAgICAgIGNvbnN0IGJJbmRleCA9IHV0aWwubG9jVG9JbmRleChiTG9jLCBiUmFuaywgYlN0cmlkZXMpO1xuXG4gICAgICAgIHJlc3VsdFtpXSA9IG9wKGFWYWxzW2FJbmRleF0sIGJWYWxzW2JJbmRleF0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbcmVzdWx0LCBuZXdTaGFwZV07XG4gIH07XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Complex } from '@tensorflow/tfjs-core';\nexport function complex(args) {\n    const { inputs, backend } = args;\n    const { real, imag } = inputs;\n    const realVals = backend.data.get(real.dataId).values;\n    const imagVals = backend.data.get(imag.dataId).values;\n    const complexInfo = backend.makeTensorInfo(real.shape, 'complex64');\n    const complex = backend.data.get(complexInfo.dataId);\n    // The complex tensor owns the underlying real and imag tensorInfos, only the\n    // complex tensor tracks refCount, when complexData is disposed the\n    // underlying tensorData will be disposed.\n    complex.complexTensorInfos = {\n        real: backend.makeTensorInfo(real.shape, 'float32', realVals),\n        imag: backend.makeTensorInfo(imag.shape, 'float32', imagVals)\n    };\n    return complexInfo;\n}\nexport const complexConfig = {\n    kernelName: Complex,\n    backendName: 'cpu',\n    kernelFunc: complex\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29tcGxleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFrRSxNQUFNLHVCQUF1QixDQUFDO0FBSS9HLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFBc0Q7SUFFNUUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFNUIsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFcEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXBFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVyRCw2RUFBNkU7SUFDN0UsbUVBQW1FO0lBQ25FLDBDQUEwQztJQUMxQyxPQUFPLENBQUMsa0JBQWtCLEdBQUc7UUFDM0IsSUFBSSxFQUFFLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxDQUFDO1FBQzdELElBQUksRUFBRSxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsQ0FBQztLQUM5RCxDQUFDO0lBRUYsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q29tcGxleCwgQ29tcGxleElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4KGFyZ3M6IHtpbnB1dHM6IENvbXBsZXhJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3JlYWwsIGltYWd9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHJlYWxWYWxzID0gYmFja2VuZC5kYXRhLmdldChyZWFsLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGltYWdWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbWFnLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgY29tcGxleEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlYWwuc2hhcGUsICdjb21wbGV4NjQnKTtcblxuICBjb25zdCBjb21wbGV4ID0gYmFja2VuZC5kYXRhLmdldChjb21wbGV4SW5mby5kYXRhSWQpO1xuXG4gIC8vIFRoZSBjb21wbGV4IHRlbnNvciBvd25zIHRoZSB1bmRlcmx5aW5nIHJlYWwgYW5kIGltYWcgdGVuc29ySW5mb3MsIG9ubHkgdGhlXG4gIC8vIGNvbXBsZXggdGVuc29yIHRyYWNrcyByZWZDb3VudCwgd2hlbiBjb21wbGV4RGF0YSBpcyBkaXNwb3NlZCB0aGVcbiAgLy8gdW5kZXJseWluZyB0ZW5zb3JEYXRhIHdpbGwgYmUgZGlzcG9zZWQuXG4gIGNvbXBsZXguY29tcGxleFRlbnNvckluZm9zID0ge1xuICAgIHJlYWw6IGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgJ2Zsb2F0MzInLCByZWFsVmFscyksXG4gICAgaW1hZzogYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbWFnLnNoYXBlLCAnZmxvYXQzMicsIGltYWdWYWxzKVxuICB9O1xuXG4gIHJldHVybiBjb21wbGV4SW5mbztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBsZXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29tcGxleCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb21wbGV4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { complex } from '../kernels/Complex';\n/**\n * Generates a tensorInfo with all zeros value.\n * @param backend cpu backend.\n * @param shape Shape for the zeros tensor.\n * @param dtype Optional. If set, the result has this dtype.\n */\nexport function zeros(backend, shape, dtype = 'float32') {\n    if (dtype === 'complex64') {\n        const real = zeros(backend, shape, 'float32');\n        const imag = zeros(backend, shape, 'float32');\n        return complex({ inputs: { real, imag }, backend });\n    }\n    const values = util.makeZerosTypedArray(util.sizeFromShape(shape), dtype);\n    return backend.makeTensorInfo(shape, dtype, values);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiemVyb3NfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL3V0aWxzL3plcm9zX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0M7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsS0FBSyxDQUNqQixPQUF1QixFQUFFLEtBQWUsRUFDeEMsUUFBa0IsU0FBUztJQUM3QixJQUFJLEtBQUssS0FBSyxXQUFXLEVBQUU7UUFDekIsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDOUMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFOUMsT0FBTyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUNqRDtJQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTFFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4uL2tlcm5lbHMvQ29tcGxleCc7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgdGVuc29ySW5mbyB3aXRoIGFsbCB6ZXJvcyB2YWx1ZS5cbiAqIEBwYXJhbSBiYWNrZW5kIGNwdSBiYWNrZW5kLlxuICogQHBhcmFtIHNoYXBlIFNoYXBlIGZvciB0aGUgemVyb3MgdGVuc29yLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvcyhcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgc2hhcGU6IG51bWJlcltdLFxuICAgIGR0eXBlOiBEYXRhVHlwZSA9ICdmbG9hdDMyJyk6IFRlbnNvckluZm8ge1xuICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgcmVhbCA9IHplcm9zKGJhY2tlbmQsIHNoYXBlLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IGltYWcgPSB6ZXJvcyhiYWNrZW5kLCBzaGFwZSwgJ2Zsb2F0MzInKTtcblxuICAgIHJldHVybiBjb21wbGV4KHtpbnB1dHM6IHtyZWFsLCBpbWFnfSwgYmFja2VuZH0pO1xuICB9XG5cbiAgY29uc3QgdmFsdWVzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSksIGR0eXBlKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcyk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Identity } from '@tensorflow/tfjs-core';\nexport function identity(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    backend.incRef(x.dataId);\n    return { dataId: x.dataId, shape: x.shape, dtype: x.dtype };\n}\nexport const identityConfig = {\n    kernelName: Identity,\n    backendName: 'cpu',\n    kernelFunc: identity\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0lkZW50aXR5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQXVELE1BQU0sdUJBQXVCLENBQUM7QUFJckcsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsSUFBdUQ7SUFDekQsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUVuQixPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV6QixPQUFPLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztBQUM1RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsUUFBNEI7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJZGVudGl0eSwgSWRlbnRpdHlJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoXG4gICAgYXJnczoge2lucHV0czogSWRlbnRpdHlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcblxuICBiYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGV9O1xufVxuXG5leHBvcnQgY29uc3QgaWRlbnRpdHlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSWRlbnRpdHksXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogaWRlbnRpdHkgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Real } from '@tensorflow/tfjs-core';\nexport function real(args) {\n    const { inputs, backend } = args;\n    const { input } = inputs;\n    const real = backend.data.get(input.dataId).complexTensorInfos.real;\n    const realVal = backend.data.get(real.dataId).values;\n    // When complex tensor is disposed, its underlying parts will be disposed too.\n    // Make new tensor out of the real value of the complex. This makes sure the\n    // value is still accessible even if complex tensor is disposed.\n    return backend.makeTensorInfo(real.shape, real.dtype, realVal);\n}\nexport const realConfig = {\n    kernelName: Real,\n    backendName: 'cpu',\n    kernelFunc: real\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLElBQUksRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUk3RixNQUFNLFVBQVUsSUFBSSxDQUFDLElBQW1EO0lBRXRFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDO0lBRXJELDhFQUE4RTtJQUM5RSw0RUFBNEU7SUFDNUUsZ0VBQWdFO0lBQ2hFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDakUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZWFsLCBSZWFsSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZWFsKGFyZ3M6IHtpbnB1dHM6IFJlYWxJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICBjb25zdCByZWFsID0gYmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICBjb25zdCByZWFsVmFsID0gYmFja2VuZC5kYXRhLmdldChyZWFsLmRhdGFJZCkudmFsdWVzO1xuXG4gIC8vIFdoZW4gY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQsIGl0cyB1bmRlcmx5aW5nIHBhcnRzIHdpbGwgYmUgZGlzcG9zZWQgdG9vLlxuICAvLyBNYWtlIG5ldyB0ZW5zb3Igb3V0IG9mIHRoZSByZWFsIHZhbHVlIG9mIHRoZSBjb21wbGV4LiBUaGlzIG1ha2VzIHN1cmUgdGhlXG4gIC8vIHZhbHVlIGlzIHN0aWxsIGFjY2Vzc2libGUgZXZlbiBpZiBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZC5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgcmVhbC5kdHlwZSwgcmVhbFZhbCk7XG59XG5cbmV4cG9ydCBjb25zdCByZWFsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlYWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cast, util } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { zeros } from '../utils/zeros_impl';\nimport { complex } from './Complex';\nimport { identity } from './Identity';\nimport { real } from './Real';\nexport function castImpl(values, shape, inputType, dtype) {\n    if (dtype === 'int32') {\n        const resultValues = Int32Array.from(values);\n        return [shape, 'int32', resultValues];\n    }\n    if (dtype === 'bool') {\n        // This is essentially the result of notEqual(x, 0). We avoid using\n        // kernel notEqual to avoid circular dependency, i.e. binary_utils ->\n        // cast -> notEqual -> binary_utils.\n        const zero = util.toTypedArray([0], inputType);\n        const [resultData, resultShape] = createSimpleBinaryKernelImpl((a, b) => (a !== b) ? 1 : 0)(shape, [], values, zero, 'bool');\n        return [resultShape, 'bool', resultData];\n    }\n    throw new Error(`Error in Cast: failed to cast ${inputType} to ${dtype}`);\n}\nexport function cast(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { dtype } = attrs;\n    // Casting to complex64.\n    if (dtype === 'complex64') {\n        if (x.dtype === 'complex64') {\n            return identity({ inputs: { x }, backend });\n        }\n        const zerosTensorInfo = zeros(backend, x.shape, x.dtype);\n        const floatX = cast({ inputs: { x }, backend, attrs: { dtype: 'float32' } });\n        const result = complex({ inputs: { real: floatX, imag: zerosTensorInfo }, backend });\n        backend.disposeIntermediateTensorInfo(zerosTensorInfo);\n        backend.disposeIntermediateTensorInfo(floatX);\n        return result;\n    }\n    // Casting from complex64\n    if (x.dtype === 'complex64') {\n        const realPart = real({ inputs: { input: x }, backend });\n        const result = cast({ inputs: { x: realPart }, backend, attrs: { dtype } });\n        backend.disposeIntermediateTensorInfo(realPart);\n        return result;\n    }\n    if (!util.hasEncodingLoss(x.dtype, dtype)) {\n        // We don't change the underlying data, since we cast to higher\n        // precision.\n        const result = identity({ inputs: { x }, backend });\n        return { dataId: result.dataId, shape: result.shape, dtype };\n    }\n    const values = backend.data.get(x.dataId).values;\n    const [resultShape, resultType, resultData] = castImpl(values, x.shape, x.dtype, dtype);\n    return backend.makeTensorInfo(resultShape, resultType, resultData);\n}\nexport const castConfig = {\n    kernelName: Cast,\n    backendName: 'cpu',\n    kernelFunc: cast\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ2FzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsSUFBSSxFQUFxRixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdwSSxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFMUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsTUFBa0IsRUFBRSxLQUFlLEVBQUUsU0FBbUIsRUFDeEQsS0FBZTtJQUNqQixJQUFJLEtBQUssS0FBSyxPQUFPLEVBQUU7UUFDckIsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztLQUN2QztJQUVELElBQUksS0FBSyxLQUFLLE1BQU0sRUFBRTtRQUNwQixtRUFBbUU7UUFDbkUscUVBQXFFO1FBQ3JFLG9DQUFvQztRQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFFL0MsTUFBTSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRyw0QkFBNEIsQ0FDMUQsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxD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QUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsVUFBVSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtDYXN0LCBDYXN0QXR0cnMsIENhc3RJbnB1dHMsIERhdGFUeXBlLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHt6ZXJvc30gZnJvbSAnLi4vdXRpbHMvemVyb3NfaW1wbCc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHtyZWFsfSBmcm9tICcuL1JlYWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FzdEltcGwoXG4gICAgdmFsdWVzOiBUeXBlZEFycmF5LCBzaGFwZTogbnVtYmVyW10sIGlucHV0VHlwZTogRGF0YVR5cGUsXG4gICAgZHR5cGU6IERhdGFUeXBlKTogW251bWJlcltdLCBEYXRhVHlwZSwgVHlwZWRBcnJheV0ge1xuICBpZiAoZHR5cGUgPT09ICdpbnQzMicpIHtcbiAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBJbnQzMkFycmF5LmZyb20odmFsdWVzKTtcbiAgICByZXR1cm4gW3NoYXBlLCAnaW50MzInLCByZXN1bHRWYWx1ZXNdO1xuICB9XG5cbiAgaWYgKGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSByZXN1bHQgb2Ygbm90RXF1YWwoeCwgMCkuIFdlIGF2b2lkIHVzaW5nXG4gICAgLy8ga2VybmVsIG5vdEVxdWFsIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3ksIGkuZS4gYmluYXJ5X3V0aWxzIC0+XG4gICAgLy8gY2FzdCAtPiBub3RFcXVhbCAtPiBiaW5hcnlfdXRpbHMuXG4gICAgY29uc3QgemVybyA9IHV0aWwudG9UeXBlZEFycmF5KFswXSwgaW5wdXRUeXBlKTtcblxuICAgIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKFxuICAgICAgICAoYSwgYikgPT4gKGEgIT09IGIpID8gMSA6IDApKHNoYXBlLCBbXSwgdmFsdWVzLCB6ZXJvLCAnYm9vbCcpO1xuXG4gICAgcmV0dXJuIFtyZXN1bHRTaGFwZSwgJ2Jvb2wnLCByZXN1bHREYXRhXTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIENhc3Q6IGZhaWxlZCB0byBjYXN0ICR7aW5wdXRUeXBlfSB0byAke2R0eXBlfWApO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY2FzdChcbiAgICBhcmdzOiB7aW5wdXRzOiBDYXN0SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IENhc3RBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtkdHlwZX0gPSBhdHRycztcblxuICAvLyBDYXN0aW5nIHRvIGNvbXBsZXg2NC5cbiAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICAgIH1cblxuICAgIGNvbnN0IHplcm9zVGVuc29ySW5mbyA9IHplcm9zKGJhY2tlbmQsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IGZsb2F0WCA9IGNhc3Qoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2R0eXBlOiAnZmxvYXQzMid9fSk7XG5cbiAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjb21wbGV4KHtpbnB1dHM6IHtyZWFsOiBmbG9hdFgsIGltYWc6IHplcm9zVGVuc29ySW5mb30sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oemVyb3NUZW5zb3JJbmZvKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsb2F0WCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQ2FzdGluZyBmcm9tIGNvbXBsZXg2NFxuICBpZiAoeC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCByZWFsUGFydCA9IHJlYWwoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGNhc3Qoe2lucHV0czoge3g6IHJlYWxQYXJ0fSwgYmFja2VuZCwgYXR0cnM6IHtkdHlwZX19KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmICghdXRpbC5oYXNFbmNvZGluZ0xvc3MoeC5kdHlwZSwgZHR5cGUpKSB7XG4gICAgLy8gV2UgZG9uJ3QgY2hhbmdlIHRoZSB1bmRlcmx5aW5nIGRhdGEsIHNpbmNlIHdlIGNhc3QgdG8gaGlnaGVyXG4gICAgLy8gcHJlY2lzaW9uLlxuICAgIGNvbnN0IHJlc3VsdCA9IGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICAgIHJldHVybiB7ZGF0YUlkOiByZXN1bHQuZGF0YUlkLCBzaGFwZTogcmVzdWx0LnNoYXBlLCBkdHlwZX07XG4gIH1cblxuICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgW3Jlc3VsdFNoYXBlLCByZXN1bHRUeXBlLCByZXN1bHREYXRhXSA9XG4gICAgICBjYXN0SW1wbCh2YWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIGR0eXBlKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHJlc3VsdFR5cGUsIHJlc3VsdERhdGEpO1xufVxuXG5leHBvcnQgY29uc3QgY2FzdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDYXN0LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGNhc3QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { cast } from '../kernels/Cast';\nimport { complex } from '../kernels/Complex';\n/**\n * Template that creates a `KernelFunc` for binary ops.\n * @param name Kernel name.\n * @param binaryKernelImpl A `SimpleBinaryKernelImpl` for the kernel.\n * @param binaryKernelComplexImpl Optional. If exists, represents a\n *     `ComplexBinaryKernelImpl` for the kernel, will be used when input dtype\n *     is `complex64`.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n *     result has the same dtype as the first input. This is mainly used in\n *     comparison kernels, such as Equal, Less, Greater, etc.\n */\nexport function binaryKernelFunc(name, simpleImpl, complexImpl, dtype) {\n    if (complexImpl == null) {\n        return ({ inputs, backend }) => {\n            const { a, b } = inputs;\n            const cpuBackend = backend;\n            assertNotComplex([a, b], name);\n            const aVals = cpuBackend.data.get(a.dataId).values;\n            const bVals = cpuBackend.data.get(b.dataId).values;\n            const decodedAVals = a.dtype === 'string' ?\n                // tslint:disable-next-line: no-any\n                backend_util.fromUint8ToStringArray(aVals) :\n                aVals;\n            const decodedBVals = a.dtype === 'string' ?\n                // tslint:disable-next-line: no-any\n                backend_util.fromUint8ToStringArray(bVals) :\n                bVals;\n            const $dtype = dtype || a.dtype;\n            const [resultData, resultShape] = simpleImpl(a.shape, b.shape, decodedAVals, decodedBVals, $dtype);\n            return cpuBackend.makeTensorInfo(resultShape, $dtype, resultData);\n        };\n    }\n    return ({ inputs, backend }) => {\n        const { a, b } = inputs;\n        const cpuBackend = backend;\n        if (a.dtype === 'complex64' || b.dtype === 'complex64') {\n            const $aComplex = cast({ inputs: { x: a }, backend: cpuBackend, attrs: { dtype: 'complex64' } });\n            const $aComplexVals = cpuBackend.data.get($aComplex.dataId);\n            const aReal = $aComplexVals.complexTensorInfos.real;\n            const aImag = $aComplexVals.complexTensorInfos.imag;\n            const aRealVals = cpuBackend.data.get(aReal.dataId).values;\n            const aImagVals = cpuBackend.data.get(aImag.dataId).values;\n            const $bComplex = cast({ inputs: { x: b }, backend: cpuBackend, attrs: { dtype: 'complex64' } });\n            const $bComplexVals = cpuBackend.data.get($bComplex.dataId);\n            const bReal = $bComplexVals.complexTensorInfos.real;\n            const bImag = $bComplexVals.complexTensorInfos.imag;\n            const bRealVals = cpuBackend.data.get(bReal.dataId).values;\n            const bImagVals = cpuBackend.data.get(bImag.dataId).values;\n            const [resultRealData, resultImagData, resultShape] = complexImpl(a.shape, b.shape, aRealVals, aImagVals, bRealVals, bImagVals);\n            const resultReal = cpuBackend.makeTensorInfo(resultShape, 'float32', resultRealData);\n            const resultImag = cpuBackend.makeTensorInfo(resultShape, 'float32', resultImagData);\n            const result = complex({ inputs: { real: resultReal, imag: resultImag }, backend: cpuBackend });\n            cpuBackend.disposeIntermediateTensorInfo($aComplex);\n            cpuBackend.disposeIntermediateTensorInfo($bComplex);\n            cpuBackend.disposeIntermediateTensorInfo(resultReal);\n            cpuBackend.disposeIntermediateTensorInfo(resultImag);\n            return result;\n        }\n        else {\n            const aVals = cpuBackend.data.get(a.dataId).values;\n            const bVals = cpuBackend.data.get(b.dataId).values;\n            const $dtype = dtype || a.dtype;\n            const [resultData, resultShape] = simpleImpl(a.shape, b.shape, aVals, bVals, $dtype);\n            return cpuBackend.makeTensorInfo(resultShape, $dtype, resultData);\n        }\n    };\n}\n/**\n * Template that creates the complex type implementation for binary ops.\n * Supports broadcast.\n */\nexport function createComplexBinaryKernelImpl(op) {\n    return (aShape, bShape, aRealVals, aImagVals, bRealVals, bImagVals) => {\n        const resultShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n        const resultSize = util.sizeFromShape(resultShape);\n        const resultRank = resultShape.length;\n        const resultStrides = util.computeStrides(resultShape);\n        const resultRealVals = util.getTypedArrayFromDType('float32', resultSize);\n        const resultImagVals = util.getTypedArrayFromDType('float32', resultSize);\n        const aBroadcastDims = backend_util.getBroadcastDims(aShape, resultShape);\n        const bBroadcastDims = backend_util.getBroadcastDims(bShape, resultShape);\n        const aVals = backend_util.mergeRealAndImagArrays(aRealVals, aImagVals);\n        const bVals = backend_util.mergeRealAndImagArrays(bRealVals, bImagVals);\n        const aRank = aShape.length;\n        const aStrides = util.computeStrides(aShape);\n        const bRank = bShape.length;\n        const bStrides = util.computeStrides(bShape);\n        if (aBroadcastDims.length + bBroadcastDims.length === 0) {\n            for (let i = 0; i < resultRealVals.length; i++) {\n                const aIdx = i % aVals.length;\n                const bIdx = i % bVals.length;\n                const result = op(aVals[aIdx * 2], aVals[aIdx * 2 + 1], bVals[bIdx * 2], bVals[bIdx * 2 + 1]);\n                resultRealVals[i] = result.real;\n                resultImagVals[i] = result.imag;\n            }\n        }\n        else {\n            for (let i = 0; i < resultRealVals.length; i++) {\n                const loc = util.indexToLoc(i, resultRank, resultStrides);\n                const aLoc = loc.slice(-aRank);\n                aBroadcastDims.forEach(d => aLoc[d] = 0);\n                const aIndex = util.locToIndex(aLoc, aRank, aStrides);\n                const bLoc = loc.slice(-bRank);\n                bBroadcastDims.forEach(d => bLoc[d] = 0);\n                const bIndex = util.locToIndex(bLoc, bRank, bStrides);\n                const opResult = op(aVals[aIndex * 2], aVals[aIndex * 2 + 1], bVals[bIndex * 2], bVals[bIndex * 2 + 1]);\n                resultRealVals[i] = opResult.real;\n                resultImagVals[i] = opResult.imag;\n            }\n        }\n        return [resultRealVals, resultImagVals, resultShape];\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5X3V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMvdXRpbHMvYmluYXJ5X3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWtELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pHLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBSTNDOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLElBQVksRUFBRSxVQUFrQyxFQUNoRCxXQUFxQyxFQUFFLEtBQWdCO0lBQ3pELElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRTtZQUMzQixNQUFNLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQXNCLENBQUM7WUFDdEMsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztZQUU3QyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUUvQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztZQUNqRSxNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztZQUVqRSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxD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QUFLLENBQUMsQ0FBQztnQkFDL0IsY0FBYyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO2dCQUV0RCxNQUFNLElBQUksR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQy9CLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQ3pDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFdEQsTUFBTSxRQUFRLEdBQ1YsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsRUFDM0QsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFOUIsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxJQUFJLENBQUM7Z0JBQ2xDLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDO2FBQ25DO1NBQ0Y7UUFDRCxPQUFPLENBQUMsY0FBYyxFQUFFLGNBQWMsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQmluYXJ5SW5wdXRzLCBEYXRhVHlwZSwgS2VybmVsRnVuYywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4uL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4uL2tlcm5lbHMvQ29tcGxleCc7XG5cbmltcG9ydCB7Q29tcGxleEJpbmFyeUtlcm5lbEltcGwsIENvbXBsZXhCaW5hcnlPcGVyYXRpb24sIFNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4vYmluYXJ5X3R5cGVzJztcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgYSBgS2VybmVsRnVuY2AgZm9yIGJpbmFyeSBvcHMuXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSBiaW5hcnlLZXJuZWxJbXBsIEEgYFNpbXBsZUJpbmFyeUtlcm5lbEltcGxgIGZvciB0aGUga2VybmVsLlxuICogQHBhcmFtIGJpbmFyeUtlcm5lbENvbXBsZXhJbXBsIE9wdGlvbmFsLiBJZiBleGlzdHMsIHJlcHJlc2VudHMgYVxuICogICAgIGBDb21wbGV4QmluYXJ5S2VybmVsSW1wbGAgZm9yIHRoZSBrZXJuZWwsIHdpbGwgYmUgdXNlZCB3aGVuIGlucHV0IGR0eXBlXG4gKiAgICAgaXMgYGNvbXBsZXg2NGAuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBmaXJzdCBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpblxuICogICAgIGNvbXBhcmlzb24ga2VybmVscywgc3VjaCBhcyBFcXVhbCwgTGVzcywgR3JlYXRlciwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluYXJ5S2VybmVsRnVuYyhcbiAgICBuYW1lOiBzdHJpbmcsIHNpbXBsZUltcGw6IFNpbXBsZUJpbmFyeUtlcm5lbEltcGwsXG4gICAgY29tcGxleEltcGw/OiBDb21wbGV4QmluYXJ5S2VybmVsSW1wbCwgZHR5cGU/OiBEYXRhVHlwZSk6IEtlcm5lbEZ1bmMge1xuICBpZiAoY29tcGxleEltcGwgPT0gbnVsbCkge1xuICAgIHJldHVybiAoe2lucHV0cywgYmFja2VuZH0pID0+IHtcbiAgICAgIGNvbnN0IHthLCBifSA9IGlucHV0cyBhcyBCaW5hcnlJbnB1dHM7XG4gICAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcblxuICAgICAgYXNzZXJ0Tm90Q29tcGxleChbYSwgYl0sIG5hbWUpO1xuXG4gICAgICBjb25zdCBhVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgICAgY29uc3QgYlZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGIuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgICAgY29uc3QgZGVjb2RlZEFWYWxzID0gYS5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoYVZhbHMgYXMgYW55IGFzIFVpbnQ4QXJyYXlbXSkgOlxuICAgICAgICAgIGFWYWxzO1xuICAgICAgY29uc3QgZGVjb2RlZEJWYWxzID0gYS5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tYW55XG4gICAgICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkoYlZhbHMgYXMgYW55IGFzIFVpbnQ4QXJyYXlbXSkgOlxuICAgICAgICAgIGJWYWxzO1xuICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgYS5kdHlwZTtcblxuICAgICAgY29uc3QgW3Jlc3VsdERhdGEsIHJlc3VsdFNoYXBlXSA9XG4gICAgICAgICAgc2ltcGxlSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBkZWNvZGVkQVZhbHMsIGRlY29kZWRCVmFscywgJGR0eXBlKTtcblxuICAgICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICRkdHlwZSwgcmVzdWx0RGF0YSk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiAoe2lucHV0cywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7YSwgYn0gPSBpbnB1dHMgYXMgQmluYXJ5SW5wdXRzO1xuICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kQ1BVO1xuXG4gICAgaWYgKGEuZHR5cGUgPT09ICdjb21wbGV4NjQnIHx8IGIuZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBjb25zdCAkYUNvbXBsZXggPSBjYXN0KFxuICAgICAgICAgIHtpbnB1dHM6IHt4OiBhfSwgYmFja2VuZDogY3B1QmFja2VuZCwgYXR0cnM6IHtkdHlwZTogJ2NvbXBsZXg2NCd9fSk7XG5cbiAgICAgIGNvbnN0ICRhQ29tcGxleFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRhQ29tcGxleC5kYXRhSWQpO1xuXG4gICAgICBjb25zdCBhUmVhbCA9ICRhQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgICBjb25zdCBhSW1hZyA9ICRhQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG5cbiAgICAgIGNvbnN0IGFSZWFsVmFscyA9XG4gICAgICAgICAgY3B1QmFja2VuZC5kYXRhLmdldChhUmVhbC5kYXRhSWQpLnZhbHVlcyBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBhSW1hZ1ZhbHMgPVxuICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoYUltYWcuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuXG4gICAgICBjb25zdCAkYkNvbXBsZXggPSBjYXN0KFxuICAgICAgICAgIHtpbnB1dHM6IHt4OiBifSwgYmFja2VuZDogY3B1QmFja2VuZCwgYXR0cnM6IHtkdHlwZTogJ2NvbXBsZXg2NCd9fSk7XG5cbiAgICAgIGNvbnN0ICRiQ29tcGxleFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KCRiQ29tcGxleC5kYXRhSWQpO1xuXG4gICAgICBjb25zdCBiUmVhbCA9ICRiQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgICBjb25zdCBiSW1hZyA9ICRiQ29tcGxleFZhbHMuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG5cbiAgICAgIGNvbnN0IGJSZWFsVmFscyA9XG4gICAgICAgICAgY3B1QmFja2VuZC5kYXRhLmdldChiUmVhbC5kYXRhSWQpLnZhbHVlcyBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBiSW1hZ1ZhbHMgPVxuICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoYkltYWcuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuXG4gICAgICBjb25zdCBbcmVzdWx0UmVhbERhdGEsIHJlc3VsdEltYWdEYXRhLCByZXN1bHRTaGFwZV0gPSBjb21wbGV4SW1wbChcbiAgICAgICAgICBhLnNoYXBlLCBiLnNoYXBlLCBhUmVhbFZhbHMsIGFJbWFnVmFscywgYlJlYWxWYWxzLCBiSW1hZ1ZhbHMpO1xuXG4gICAgICBjb25zdCByZXN1bHRSZWFsID1cbiAgICAgICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdFJlYWxEYXRhKTtcblxuICAgICAgY29uc3QgcmVzdWx0SW1hZyA9XG4gICAgICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRJbWFnRGF0YSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoXG4gICAgICAgICAge2lucHV0czoge3JlYWw6IHJlc3VsdFJlYWwsIGltYWc6IHJlc3VsdEltYWd9LCBiYWNrZW5kOiBjcHVCYWNrZW5kfSk7XG5cbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGFDb21wbGV4KTtcbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGJDb21wbGV4KTtcbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0UmVhbCk7XG4gICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdEltYWcpO1xuXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBhVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoYS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgICAgY29uc3QgYlZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGIuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgICAgY29uc3QgJGR0eXBlID0gZHR5cGUgfHwgYS5kdHlwZTtcblxuICAgICAgY29uc3QgW3Jlc3VsdERhdGEsIHJlc3VsdFNoYXBlXSA9XG4gICAgICAgICAgc2ltcGxlSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBhVmFscywgYlZhbHMsICRkdHlwZSk7XG5cbiAgICAgIHJldHVybiBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAkZHR5cGUsIHJlc3VsdERhdGEpO1xuICAgIH1cbiAgfTtcbn1cblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgdGhlIGNvbXBsZXggdHlwZSBpbXBsZW1lbnRhdGlvbiBmb3IgYmluYXJ5IG9wcy5cbiAqIFN1cHBvcnRzIGJyb2FkY2FzdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsKG9wOiBDb21wbGV4QmluYXJ5T3BlcmF0aW9uKTpcbiAgICBDb21wbGV4QmluYXJ5S2VybmVsSW1wbCB7XG4gIHJldHVybiAoYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSwgYVJlYWxWYWxzOiBGbG9hdDMyQXJyYXksXG4gICAgICAgICAgYUltYWdWYWxzOiBGbG9hdDMyQXJyYXksIGJSZWFsVmFsczogRmxvYXQzMkFycmF5LFxuICAgICAgICAgIGJJbWFnVmFsczogRmxvYXQzMkFycmF5KTogW1R5cGVkQXJyYXksIFR5cGVkQXJyYXksIG51bWJlcltdXSA9PiB7XG4gICAgY29uc3QgcmVzdWx0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVzdWx0U2hhcGUpO1xuICAgIGNvbnN0IHJlc3VsdFJhbmsgPSByZXN1bHRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMocmVzdWx0U2hhcGUpO1xuXG4gICAgY29uc3QgcmVzdWx0UmVhbFZhbHMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Zsb2F0MzInLCByZXN1bHRTaXplKTtcbiAgICBjb25zdCByZXN1bHRJbWFnVmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuXG4gICAgY29uc3QgYUJyb2FkY2FzdERpbXMgPSBiYWNrZW5kX3V0aWwuZ2V0QnJvYWRjYXN0RGltcyhhU2hhcGUsIHJlc3VsdFNoYXBlKTtcbiAgICBjb25zdCBiQnJvYWRjYXN0RGltcyA9IGJhY2tlbmRfdXRpbC5nZXRCcm9hZGNhc3REaW1zKGJTaGFwZSwgcmVzdWx0U2hhcGUpO1xuXG4gICAgY29uc3QgYVZhbHMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhhUmVhbFZhbHMsIGFJbWFnVmFscyk7XG4gICAgY29uc3QgYlZhbHMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhiUmVhbFZhbHMsIGJJbWFnVmFscyk7XG5cbiAgICBjb25zdCBhUmFuayA9IGFTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGFTaGFwZSk7XG5cbiAgICBjb25zdCBiUmFuayA9IGJTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgYlN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGJTaGFwZSk7XG5cbiAgICBpZiAoYUJyb2FkY2FzdERpbXMubGVuZ3RoICsgYkJyb2FkY2FzdERpbXMubGVuZ3RoID09PSAwKSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdFJlYWxWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGFJZHggPSBpICUgYVZhbHMubGVuZ3RoO1xuICAgICAgICBjb25zdCBiSWR4ID0gaSAlIGJWYWxzLmxlbmd0aDtcblxuICAgICAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICAgICAgb3AoYVZhbHNbYUlkeCAqIDJdLCBhVmFsc1thSWR4ICogMiArIDFdLCBiVmFsc1tiSWR4ICogMl0sXG4gICAgICAgICAgICAgICBiVmFsc1tiSWR4ICogMiArIDFdKTtcblxuICAgICAgICByZXN1bHRSZWFsVmFsc1tpXSA9IHJlc3VsdC5yZWFsO1xuICAgICAgICByZXN1bHRJbWFnVmFsc1tpXSA9IHJlc3VsdC5pbWFnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlc3VsdFJlYWxWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvbnN0IGxvYyA9IHV0aWwuaW5kZXhUb0xvYyhpLCByZXN1bHRSYW5rLCByZXN1bHRTdHJpZGVzKTtcblxuICAgICAgICBjb25zdCBhTG9jID0gbG9jLnNsaWNlKC1hUmFuayk7XG4gICAgICAgIGFCcm9hZGNhc3REaW1zLmZvckVhY2goZCA9PiBhTG9jW2RdID0gMCk7XG4gICAgICAgIGNvbnN0IGFJbmRleCA9IHV0aWwubG9jVG9JbmRleChhTG9jLCBhUmFuaywgYVN0cmlkZXMpO1xuXG4gICAgICAgIGNvbnN0IGJMb2MgPSBsb2Muc2xpY2UoLWJSYW5rKTtcbiAgICAgICAgYkJyb2FkY2FzdERpbXMuZm9yRWFjaChkID0+IGJMb2NbZF0gPSAwKTtcbiAgICAgICAgY29uc3QgYkluZGV4ID0gdXRpbC5sb2NUb0luZGV4KGJMb2MsIGJSYW5rLCBiU3RyaWRlcyk7XG5cbiAgICAgICAgY29uc3Qgb3BSZXN1bHQgPVxuICAgICAgICAgICAgb3AoYVZhbHNbYUluZGV4ICogMl0sIGFWYWxzW2FJbmRleCAqIDIgKyAxXSwgYlZhbHNbYkluZGV4ICogMl0sXG4gICAgICAgICAgICAgICBiVmFsc1tiSW5kZXggKiAyICsgMV0pO1xuXG4gICAgICAgIHJlc3VsdFJlYWxWYWxzW2ldID0gb3BSZXN1bHQucmVhbDtcbiAgICAgICAgcmVzdWx0SW1hZ1ZhbHNbaV0gPSBvcFJlc3VsdC5pbWFnO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW3Jlc3VsdFJlYWxWYWxzLCByZXN1bHRJbWFnVmFscywgcmVzdWx0U2hhcGVdO1xuICB9O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Add } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc, createComplexBinaryKernelImpl } from '../utils/binary_utils';\nexport const addImpl = createSimpleBinaryKernelImpl(((a, b) => a + b));\nexport const addComplexImpl = createComplexBinaryKernelImpl(((aReal, aImag, bReal, bImag) => {\n    return { real: aReal + bReal, imag: aImag + bImag };\n}));\nexport const add = binaryKernelFunc(Add, addImpl, addComplexImpl);\nexport const addConfig = {\n    kernelName: Add,\n    backendName: 'cpu',\n    kernelFunc: add\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BZGQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSw2QkFBNkIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ3BFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FDdkIsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQzVELE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFUixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBZGQsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgYWRkSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhICsgYikpO1xuZXhwb3J0IGNvbnN0IGFkZENvbXBsZXhJbXBsID1cbiAgICBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgICByZXR1cm4ge3JlYWw6IGFSZWFsICsgYlJlYWwsIGltYWc6IGFJbWFnICsgYkltYWd9O1xuICAgIH0pKTtcblxuZXhwb3J0IGNvbnN0IGFkZCA9IGJpbmFyeUtlcm5lbEZ1bmMoQWRkLCBhZGRJbXBsLCBhZGRDb21wbGV4SW1wbCk7XG5cbmV4cG9ydCBjb25zdCBhZGRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWRkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGFkZFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, util } from '@tensorflow/tfjs-core';\nexport function bincountImpl(xVals, weightsVals, weightsDtype, weightsShape, size) {\n    const weightsSize = util.sizeFromShape(weightsShape);\n    const outVals = util.makeZerosTypedArray(size, weightsDtype);\n    for (let i = 0; i < xVals.length; i++) {\n        const value = xVals[i];\n        if (value < 0) {\n            throw new Error('Input x must be non-negative!');\n        }\n        if (value >= size) {\n            continue;\n        }\n        if (weightsSize > 0) {\n            outVals[value] += weightsVals[i];\n        }\n        else {\n            outVals[value] += 1;\n        }\n    }\n    return outVals;\n}\nexport function bincountReduceImpl(xBuf, weightsBuf, size, binaryOutput = false) {\n    const numRows = xBuf.shape[0];\n    const numCols = xBuf.shape[1];\n    const outBuf = buffer([numRows, size], weightsBuf.dtype);\n    for (let i = 0; i < numRows; i++) {\n        for (let j = 0; j < numCols; j++) {\n            const value = xBuf.get(i, j);\n            if (value < 0) {\n                throw new Error('Input x must be non-negative!');\n            }\n            if (value >= size) {\n                continue;\n            }\n            if (binaryOutput) {\n                outBuf.set(1, i, value);\n            }\n            else {\n                if (weightsBuf.size > 0) {\n                    outBuf.set(outBuf.get(i, value) + weightsBuf.get(i, j), i, value);\n                }\n                else {\n                    outBuf.set(outBuf.get(i, value) + 1, i, value);\n                }\n            }\n        }\n    }\n    return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluY291bnRfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQmluY291bnRfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUE0QyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RixNQUFNLFVBQVUsWUFBWSxDQUN4QixLQUFpQixFQUFFLFdBQXVCLEVBQUUsWUFBc0IsRUFDbEUsWUFBc0IsRUFBRSxJQUFZO0lBQ3RDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksRUFBRSxZQUFZLENBQWUsQ0FBQztJQUUzRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdkIsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO1lBQ2IsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1NBQ2xEO1FBRUQsSUFBSSxLQUFLLElBQUksSUFBSSxFQUFFO1lBQ2pCLFNBQVM7U0FDVjtRQUVELElBQUksV0FBVyxHQUFHLENBQUMsRUFBRTtZQUNuQixPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO2FBQU07WUFDTCxPQUFPLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JCO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQztBQUNqQixDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUM5QixJQUFxQixFQUFFLFVBQTJCLEVBQUUsSUFBWSxFQUNoRSxZQUFZLEdBQUcsS0FBSztJQUN0QixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxFQUFFLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2hDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDaEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFO2dCQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsK0JBQStCLENBQUMsQ0FBQzthQUNsRDtZQUVELElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtnQkFDakIsU0FBUzthQUNWO1lBRUQsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQzthQUN6QjtpQkFBTTtnQkFDTCxJQUFJLFVBQVUsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxFQUFFO29CQUN2QixNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztpQkFDbkU7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO2lCQUNoRDthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sTUFBeUIsQ0FBQztBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgRGF0YVR5cGUsIFJhbmssIFRlbnNvckJ1ZmZlciwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmNvdW50SW1wbChcbiAgICB4VmFsczogVHlwZWRBcnJheSwgd2VpZ2h0c1ZhbHM6IFR5cGVkQXJyYXksIHdlaWdodHNEdHlwZTogRGF0YVR5cGUsXG4gICAgd2VpZ2h0c1NoYXBlOiBudW1iZXJbXSwgc2l6ZTogbnVtYmVyKTogVHlwZWRBcnJheSB7XG4gIGNvbnN0IHdlaWdodHNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHdlaWdodHNTaGFwZSk7XG4gIGNvbnN0IG91dFZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkoc2l6ZSwgd2VpZ2h0c0R0eXBlKSBhcyBUeXBlZEFycmF5O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCB2YWx1ZSA9IHhWYWxzW2ldO1xuICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgeCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSEnKTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUgPj0gc2l6ZSkge1xuICAgICAgY29udGludWU7XG4gICAgfVxuXG4gICAgaWYgKHdlaWdodHNTaXplID4gMCkge1xuICAgICAgb3V0VmFsc1t2YWx1ZV0gKz0gd2VpZ2h0c1ZhbHNbaV07XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dFZhbHNbdmFsdWVdICs9IDE7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG91dFZhbHM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudFJlZHVjZUltcGw8UiBleHRlbmRzIFJhbms+KFxuICAgIHhCdWY6IFRlbnNvckJ1ZmZlcjxSPiwgd2VpZ2h0c0J1ZjogVGVuc29yQnVmZmVyPFI+LCBzaXplOiBudW1iZXIsXG4gICAgYmluYXJ5T3V0cHV0ID0gZmFsc2UpOiBUZW5zb3JCdWZmZXI8Uj4ge1xuICBjb25zdCBudW1Sb3dzID0geEJ1Zi5zaGFwZVswXTtcbiAgY29uc3QgbnVtQ29scyA9IHhCdWYuc2hhcGVbMV07XG5cbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKFtudW1Sb3dzLCBzaXplXSwgd2VpZ2h0c0J1Zi5kdHlwZSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1Sb3dzOyBpKyspIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbHM7IGorKykge1xuICAgICAgY29uc3QgdmFsdWUgPSB4QnVmLmdldChpLCBqKTtcbiAgICAgIGlmICh2YWx1ZSA8IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCB4IG11c3QgYmUgbm9uLW5lZ2F0aXZlIScpO1xuICAgICAgfVxuXG4gICAgICBpZiAodmFsdWUgPj0gc2l6ZSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKGJpbmFyeU91dHB1dCkge1xuICAgICAgICBvdXRCdWYuc2V0KDEsIGksIHZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh3ZWlnaHRzQnVmLnNpemUgPiAwKSB7XG4gICAgICAgICAgb3V0QnVmLnNldChvdXRCdWYuZ2V0KGksIHZhbHVlKSArIHdlaWdodHNCdWYuZ2V0KGksIGopLCBpLCB2YWx1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgb3V0QnVmLnNldChvdXRCdWYuZ2V0KGksIHZhbHVlKSArIDEsIGksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRCdWYgYXMgVGVuc29yQnVmZmVyPFI+O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\n/**\n * Template that creates implementation for unary op.\n */\nexport function createSimpleUnaryImpl(op) {\n    return (values, dtype, attrs) => {\n        const newValues = util.getTypedArrayFromDType(dtype, values.length);\n        for (let i = 0; i < values.length; ++i) {\n            newValues[i] = op(values[i], attrs);\n        }\n        return newValues;\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5hcnlfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL3V0aWxzL3VuYXJ5X2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFrQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUk1RDs7R0FFRztBQUNILE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxFQUF3QjtJQUU1RCxPQUFPLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsRUFBRTtRQUM5QixNQUFNLFNBQVMsR0FDWCxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBd0IsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDekUsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge051bWVyaWNEYXRhVHlwZSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtTaW1wbGVVbmFyeUltcGwsIFNpbXBsZVVuYXJ5T3BlcmF0aW9ufSBmcm9tICcuL3VuYXJ5X3R5cGVzJztcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgaW1wbGVtZW50YXRpb24gZm9yIHVuYXJ5IG9wLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKG9wOiBTaW1wbGVVbmFyeU9wZXJhdGlvbik6XG4gICAgU2ltcGxlVW5hcnlJbXBsIHtcbiAgcmV0dXJuICh2YWx1ZXMsIGR0eXBlLCBhdHRycykgPT4ge1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9XG4gICAgICAgIHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShkdHlwZSBhcyBOdW1lcmljRGF0YVR5cGUsIHZhbHVlcy5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgICBuZXdWYWx1ZXNbaV0gPSBvcCh2YWx1ZXNbaV0sIGF0dHJzKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1ZhbHVlcztcbiAgfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\n/**\n * Template that creates a `KernelFunc` for unary ops.\n * @param name Kernel name.\n * @param op A `SimpleUnaryOperation` for the kernel.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n *     result has the same dtype as the input. This is mainly used in certain\n *     kernels that return bool type, such as isFinite, isInf, etc.\n */\nexport function unaryKernelFunc(name, op, dtype) {\n    return ({ inputs, attrs, backend }) => {\n        const { x } = inputs;\n        assertNotComplex(x, name);\n        if (x.dtype === 'string' || dtype === 'string') {\n            throw new Error('unaryKernelFunc does not support string input/output');\n        }\n        const cpuBackend = backend;\n        const values = cpuBackend.data.get(x.dataId).values;\n        const xSize = util.sizeFromShape(x.shape);\n        const $dtype = dtype || x.dtype;\n        const newValues = util.getArrayFromDType($dtype, xSize);\n        for (let i = 0; i < xSize; ++i) {\n            newValues[i] = op(values[i], attrs);\n        }\n        return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues);\n    };\n}\n/**\n * Template that creates a `KernelFunc` for unary ops from the given\n * `SimpleUnaryImpl`..\n * @param name Kernel name.\n * @param unaryImpl A `SimpleUnaryImpl` that implements the op.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n *     result has the same dtype as the input. This is mainly used in certain\n *     kernels that return bool type, such as isFinite, isInf, etc.\n */\nexport function unaryKernelFuncFromImpl(name, unaryImpl, dtype) {\n    return ({ inputs, attrs, backend }) => {\n        const { x } = inputs;\n        assertNotComplex(x, name);\n        if (x.dtype === 'string' || dtype === 'string') {\n            throw new Error('unaryKernelFunc does not support string input/output');\n        }\n        const cpuBackend = backend;\n        const values = cpuBackend.data.get(x.dataId).values;\n        const $dtype = dtype || x.dtype;\n        const newValues = unaryImpl(values, $dtype, attrs);\n        return cpuBackend.makeTensorInfo(x.shape, $dtype, newValues);\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5hcnlfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy91dGlscy91bmFyeV91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWdELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzFGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUk3Qzs7Ozs7OztHQU9HO0FBQ0gsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsSUFBWSxFQUFFLEVBQXdCLEVBQUUsS0FBZ0I7SUFDMUQsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFxQixDQUFDO1FBQ2xDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDOUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzREFBc0QsQ0FBQyxDQUFDO1NBQ3pFO1FBRUQsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztRQUM3QyxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztRQUNsRSxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMxQyxNQUFNLE1BQU0sR0FBRyxLQUFLLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUNoQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3hELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDOUIsU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7U0FDckM7UUFDRCxPQUFPLFVBQVUsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0QsQ0FBQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNuQyxJQUFZLEVBQUUsU0FBMEIsRUFBRSxLQUFnQjtJQUM1RCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQXFCLENBQUM7UUFDbEMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLElBQUksS0FBSyxLQUFLLFFBQVEsRUFBRTtZQUM5QyxNQUFNLElBQUksS0FBSyxDQUFDLHNEQUFzRCxDQUFDLENBQUM7U0FDekU7UUFFRCxNQUFNLFVBQVUsR0FBRyxPQUF5QixDQUFDO1FBQzdDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO1FBQ2xFLE1BQU0sTUFBTSxHQUFHLEtBQUssSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDO1FBQ2hDLE1BQU0sU0FBUyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ25ELE9BQU8sVUFBVSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMvRCxDQUFDLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RhdGFUeXBlLCBLZXJuZWxGdW5jLCBUeXBlZEFycmF5LCBVbmFyeUlucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmltcG9ydCB7U2ltcGxlVW5hcnlJbXBsLCBTaW1wbGVVbmFyeU9wZXJhdGlvbn0gZnJvbSAnLi91bmFyeV90eXBlcyc7XG5cbi8qKlxuICogVGVtcGxhdGUgdGhhdCBjcmVhdGVzIGEgYEtlcm5lbEZ1bmNgIGZvciB1bmFyeSBvcHMuXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSBvcCBBIGBTaW1wbGVVbmFyeU9wZXJhdGlvbmAgZm9yIHRoZSBrZXJuZWwuXG4gKiBAcGFyYW0gZHR5cGUgT3B0aW9uYWwuIElmIHNldCwgdGhlIHJlc3VsdCBoYXMgdGhpcyBkdHlwZS4gT3RoZXJ3aXNlLCB0aGVcbiAqICAgICByZXN1bHQgaGFzIHRoZSBzYW1lIGR0eXBlIGFzIHRoZSBpbnB1dC4gVGhpcyBpcyBtYWlubHkgdXNlZCBpbiBjZXJ0YWluXG4gKiAgICAga2VybmVscyB0aGF0IHJldHVybiBib29sIHR5cGUsIHN1Y2ggYXMgaXNGaW5pdGUsIGlzSW5mLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmFyeUtlcm5lbEZ1bmMoXG4gICAgbmFtZTogc3RyaW5nLCBvcDogU2ltcGxlVW5hcnlPcGVyYXRpb24sIGR0eXBlPzogRGF0YVR5cGUpOiBLZXJuZWxGdW5jIHtcbiAgcmV0dXJuICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7eH0gPSBpbnB1dHMgYXMgVW5hcnlJbnB1dHM7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCBuYW1lKTtcbiAgICBpZiAoeC5kdHlwZSA9PT0gJ3N0cmluZycgfHwgZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3VuYXJ5S2VybmVsRnVuYyBkb2VzIG5vdCBzdXBwb3J0IHN0cmluZyBpbnB1dC9vdXRwdXQnKTtcbiAgICB9XG5cbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcbiAgICBjb25zdCB2YWx1ZXMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB4LmR0eXBlO1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJGR0eXBlLCB4U2l6ZSk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgKytpKSB7XG4gICAgICBuZXdWYWx1ZXNbaV0gPSBvcCh2YWx1ZXNbaV0sIGF0dHJzKTtcbiAgICB9XG4gICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBuZXdWYWx1ZXMpO1xuICB9O1xufVxuXG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgdW5hcnkgb3BzIGZyb20gdGhlIGdpdmVuXG4gKiBgU2ltcGxlVW5hcnlJbXBsYC4uXG4gKiBAcGFyYW0gbmFtZSBLZXJuZWwgbmFtZS5cbiAqIEBwYXJhbSB1bmFyeUltcGwgQSBgU2ltcGxlVW5hcnlJbXBsYCB0aGF0IGltcGxlbWVudHMgdGhlIG9wLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW4gY2VydGFpblxuICogICAgIGtlcm5lbHMgdGhhdCByZXR1cm4gYm9vbCB0eXBlLCBzdWNoIGFzIGlzRmluaXRlLCBpc0luZiwgZXRjLlxuICovXG5leHBvcnQgZnVuY3Rpb24gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoXG4gICAgbmFtZTogc3RyaW5nLCB1bmFyeUltcGw6IFNpbXBsZVVuYXJ5SW1wbCwgZHR5cGU/OiBEYXRhVHlwZSk6IEtlcm5lbEZ1bmMge1xuICByZXR1cm4gKHtpbnB1dHMsIGF0dHJzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHt4fSA9IGlucHV0cyBhcyBVbmFyeUlucHV0cztcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsIG5hbWUpO1xuICAgIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJyB8fCBkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcigndW5hcnlLZXJuZWxGdW5jIGRvZXMgbm90IHN1cHBvcnQgc3RyaW5nIGlucHV0L291dHB1dCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kQ1BVO1xuICAgIGNvbnN0IHZhbHVlcyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0ICRkdHlwZSA9IGR0eXBlIHx8IHguZHR5cGU7XG4gICAgY29uc3QgbmV3VmFsdWVzID0gdW5hcnlJbXBsKHZhbHVlcywgJGR0eXBlLCBhdHRycyk7XG4gICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJGR0eXBlLCBuZXdWYWx1ZXMpO1xuICB9O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Ceil } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const ceilImpl = createSimpleUnaryImpl((xi) => Math.ceil(xi));\nexport const ceil = unaryKernelFuncFromImpl(Ceil, ceilImpl);\nexport const ceilConfig = {\n    kernelName: Ceil,\n    backendName: 'cpu',\n    kernelFunc: ceil,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2VpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ2VpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFN0QsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUFHLHFCQUFxQixDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDckUsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLHVCQUF1QixDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NlaWwsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVVbmFyeUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgY2VpbEltcGwgPSBjcmVhdGVTaW1wbGVVbmFyeUltcGwoKHhpKSA9PiBNYXRoLmNlaWwoeGkpKTtcbmV4cG9ydCBjb25zdCBjZWlsID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoQ2VpbCwgY2VpbEltcGwpO1xuXG5leHBvcnQgY29uc3QgY2VpbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDZWlsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGNlaWwsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nexport function concatImpl(inputs, outShape, dtype, simplyConcat) {\n    const outVals = util.getArrayFromDType(dtype, util.sizeFromShape(outShape));\n    if (simplyConcat && dtype !== 'string') {\n        // Use built-in TypedArray.set() method for speed.\n        let offset = 0;\n        inputs.forEach(input => {\n            const size = util.sizeFromShape(input.shape);\n            outVals.set(input.vals, offset);\n            offset += size;\n        });\n    }\n    else {\n        let colOffset = 0;\n        inputs.forEach(input => {\n            const decodedData = dtype === 'string' ?\n                backend_util.fromUint8ToStringArray(input.vals) :\n                input.vals;\n            let tIdx = 0;\n            for (let row = 0; row < input.shape[0]; ++row) {\n                const resIdx = row * outShape[1] + colOffset;\n                for (let col = 0; col < input.shape[1]; ++col) {\n                    outVals[resIdx + col] = decodedData[tIdx++];\n                }\n            }\n            colOffset += input.shape[1];\n        });\n    }\n    return outVals;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0NvbmNhdF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQXVDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTlGLE1BQU0sVUFBVSxVQUFVLENBQ3RCLE1BQXFELEVBQUUsUUFBa0IsRUFDekUsS0FBZSxFQUFFLFlBQXFCO0lBQ3hDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRTVFLElBQUksWUFBWSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEMsa0RBQWtEO1FBQ2xELElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNmLE1BQU0sQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDckIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFNUMsT0FBc0IsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLElBQWtCLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUQsTUFBTSxJQUFJLElBQUksQ0FBQztRQUNqQixDQUFDLENBQUMsQ0FBQztLQUNKO1NBQU07UUFDTCxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7UUFFbEIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsRUFBRTtZQUNyQixNQUFNLFdBQVcsR0FBRyxLQUFLLEtBQUssUUFBUSxDQUFDLENBQUM7Z0JBQ3BDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxLQUFLLENBQUMsSUFBb0IsQ0FBQyxDQUFDLENBQUM7Z0JBQ2pFLEtBQUssQ0FBQyxJQUFrQixDQUFDO1lBRTdCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztZQUViLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsR0FBRyxFQUFFO2dCQUM3QyxNQUFNLE1BQU0sR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQztnQkFDN0MsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxHQUFHLEVBQUU7b0JBQzdDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7aUJBQzdDO2FBQ0Y7WUFFRCxTQUFTLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQztLQUNKO0lBRUQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhY2tlbmRWYWx1ZXMsIERhdGFUeXBlLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0SW1wbChcbiAgICBpbnB1dHM6IEFycmF5PHt2YWxzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW119Piwgb3V0U2hhcGU6IG51bWJlcltdLFxuICAgIGR0eXBlOiBEYXRhVHlwZSwgc2ltcGx5Q29uY2F0OiBib29sZWFuKTogVHlwZWRBcnJheXxzdHJpbmdbXSB7XG4gIGNvbnN0IG91dFZhbHMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGR0eXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcblxuICBpZiAoc2ltcGx5Q29uY2F0ICYmIGR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIC8vIFVzZSBidWlsdC1pbiBUeXBlZEFycmF5LnNldCgpIG1ldGhvZCBmb3Igc3BlZWQuXG4gICAgbGV0IG9mZnNldCA9IDA7XG4gICAgaW5wdXRzLmZvckVhY2goaW5wdXQgPT4ge1xuICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSk7XG5cbiAgICAgIChvdXRWYWxzIGFzIFR5cGVkQXJyYXkpLnNldChpbnB1dC52YWxzIGFzIFR5cGVkQXJyYXksIG9mZnNldCk7XG4gICAgICBvZmZzZXQgKz0gc2l6ZTtcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICBsZXQgY29sT2Zmc2V0ID0gMDtcblxuICAgIGlucHV0cy5mb3JFYWNoKGlucHV0ID0+IHtcbiAgICAgIGNvbnN0IGRlY29kZWREYXRhID0gZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZnJvbVVpbnQ4VG9TdHJpbmdBcnJheShpbnB1dC52YWxzIGFzIFVpbnQ4QXJyYXlbXSkgOlxuICAgICAgICAgIGlucHV0LnZhbHMgYXMgVHlwZWRBcnJheTtcblxuICAgICAgbGV0IHRJZHggPSAwO1xuXG4gICAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBpbnB1dC5zaGFwZVswXTsgKytyb3cpIHtcbiAgICAgICAgY29uc3QgcmVzSWR4ID0gcm93ICogb3V0U2hhcGVbMV0gKyBjb2xPZmZzZXQ7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGlucHV0LnNoYXBlWzFdOyArK2NvbCkge1xuICAgICAgICAgIG91dFZhbHNbcmVzSWR4ICsgY29sXSA9IGRlY29kZWREYXRhW3RJZHgrK107XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29sT2Zmc2V0ICs9IGlucHV0LnNoYXBlWzFdO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIG91dFZhbHM7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Equal } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const equalImpl = createSimpleBinaryKernelImpl((a, b) => (a === b) ? 1 : 0);\nexport const equal = binaryKernelFunc(Equal, equalImpl, null /* complexImpl */, 'bool');\nexport const equalConfig = {\n    kernelName: Equal,\n    backendName: 'cpu',\n    kernelFunc: equal\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0VxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLDRCQUE0QixDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDOUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGdCQUFnQixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFcXVhbCwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGVxdWFsSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IChhID09PSBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBlcXVhbCA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyhFcXVhbCwgZXF1YWxJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZXF1YWxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Exp } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const expImpl = createSimpleUnaryImpl((xi) => Math.exp(xi));\nexport const exp = unaryKernelFuncFromImpl(Exp, expImpl, 'float32');\nexport const expConfig = {\n    kernelName: Exp,\n    backendName: 'cpu',\n    kernelFunc: exp,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9FeHAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTdELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFeHAsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVVbmFyeUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhwSW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGguZXhwKHhpKSk7XG5leHBvcnQgY29uc3QgZXhwID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRXhwLCBleHBJbXBsLCAnZmxvYXQzMicpO1xuXG5leHBvcnQgY29uc3QgZXhwQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEV4cCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBleHAsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Expm1 } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const expm1Impl = createSimpleUnaryImpl((xi) => Math.expm1(xi));\nexport const expm1 = unaryKernelFuncFromImpl(Expm1, expm1Impl);\nexport const expm1Config = {\n    kernelName: Expm1,\n    backendName: 'cpu',\n    kernelFunc: expm1,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwbTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0V4cG0xLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RXhwbTEsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVVbmFyeUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZXhwbTFJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5leHBtMSh4aSkpO1xuZXhwb3J0IGNvbnN0IGV4cG0xID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRXhwbTEsIGV4cG0xSW1wbCk7XG5cbmV4cG9ydCBjb25zdCBleHBtMUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHBtMSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBleHBtMSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Floor } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const floorImpl = createSimpleUnaryImpl((xi) => Math.floor(xi));\nexport const floor = unaryKernelFuncFromImpl(Floor, floorImpl);\nexport const floorConfig = {\n    kernelName: Floor,\n    backendName: 'cpu',\n    kernelFunc: floor,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Zsb29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUN2RSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsdUJBQXVCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Rmxvb3IsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVVbmFyeUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X2ltcGwnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgZmxvb3JJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5mbG9vcih4aSkpO1xuZXhwb3J0IGNvbnN0IGZsb29yID0gdW5hcnlLZXJuZWxGdW5jRnJvbUltcGwoRmxvb3IsIGZsb29ySW1wbCk7XG5cbmV4cG9ydCBjb25zdCBmbG9vckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbG9vcixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBmbG9vcixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function gatherNdImpl(indicesData, paramsBuf, dtype, numSlices, sliceRank, sliceSize, strides, paramsShape, paramsSize) {\n    const outBuf = buffer([numSlices, sliceSize], dtype);\n    for (let i = 0; i < numSlices; i++) {\n        const index = [];\n        let flattenIndex = 0;\n        for (let j = 0; j < sliceRank; j++) {\n            const dim = indicesData[i * sliceRank + j];\n            flattenIndex += dim * strides[j];\n            index.push(dim);\n        }\n        if (flattenIndex < 0 || flattenIndex >= paramsSize / sliceSize) {\n            throw new Error(`Invalid indices: ${index} does not index into ${paramsShape}`);\n        }\n        for (let k = 0; k < sliceSize; k++) {\n            outBuf.values[i * sliceSize + k] =\n                paramsBuf.get(...paramsBuf.indexToLoc(flattenIndex * sliceSize + k));\n        }\n    }\n    return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyTmRfSW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvR2F0aGVyTmRfSW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUEyQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZGLE1BQU0sVUFBVSxZQUFZLENBQ3hCLFdBQXVCLEVBQUUsU0FBMEIsRUFBRSxLQUFlLEVBQ3BFLFNBQWlCLEVBQUUsU0FBaUIsRUFBRSxTQUFpQixFQUFFLE9BQWlCLEVBQzFFLFdBQXFCLEVBQUUsVUFBa0I7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXJELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2pCLElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztRQUNyQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLE1BQU0sR0FBRyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzNDLFlBQVksSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2pDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDakI7UUFDRCxJQUFJLFlBQVksR0FBRyxDQUFDLElBQUksWUFBWSxJQUFJLFVBQVUsR0FBRyxTQUFTLEVBQUU7WUFDOUQsTUFBTSxJQUFJLEtBQUssQ0FDWCxvQkFBb0IsS0FBSyx3QkFBd0IsV0FBVyxFQUFFLENBQUMsQ0FBQztTQUNyRTtRQUVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztnQkFDNUIsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUMsWUFBWSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFFO0tBQ0Y7SUFFRCxPQUFPLE1BQXlCLENBQUM7QUFDbkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtidWZmZXIsIERhdGFUeXBlLCBSYW5rLCBUZW5zb3JCdWZmZXIsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJOZEltcGw8UiBleHRlbmRzIFJhbms+KFxuICAgIGluZGljZXNEYXRhOiBUeXBlZEFycmF5LCBwYXJhbXNCdWY6IFRlbnNvckJ1ZmZlcjxSPiwgZHR5cGU6IERhdGFUeXBlLFxuICAgIG51bVNsaWNlczogbnVtYmVyLCBzbGljZVJhbms6IG51bWJlciwgc2xpY2VTaXplOiBudW1iZXIsIHN0cmlkZXM6IG51bWJlcltdLFxuICAgIHBhcmFtc1NoYXBlOiBudW1iZXJbXSwgcGFyYW1zU2l6ZTogbnVtYmVyKTogVGVuc29yQnVmZmVyPFI+IHtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKFtudW1TbGljZXMsIHNsaWNlU2l6ZV0sIGR0eXBlKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bVNsaWNlczsgaSsrKSB7XG4gICAgY29uc3QgaW5kZXggPSBbXTtcbiAgICBsZXQgZmxhdHRlbkluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsaWNlUmFuazsgaisrKSB7XG4gICAgICBjb25zdCBkaW0gPSBpbmRpY2VzRGF0YVtpICogc2xpY2VSYW5rICsgal07XG4gICAgICBmbGF0dGVuSW5kZXggKz0gZGltICogc3RyaWRlc1tqXTtcbiAgICAgIGluZGV4LnB1c2goZGltKTtcbiAgICB9XG4gICAgaWYgKGZsYXR0ZW5JbmRleCA8IDAgfHwgZmxhdHRlbkluZGV4ID49IHBhcmFtc1NpemUgLyBzbGljZVNpemUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgSW52YWxpZCBpbmRpY2VzOiAke2luZGV4fSBkb2VzIG5vdCBpbmRleCBpbnRvICR7cGFyYW1zU2hhcGV9YCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCBzbGljZVNpemU7IGsrKykge1xuICAgICAgb3V0QnVmLnZhbHVlc1tpICogc2xpY2VTaXplICsga10gPVxuICAgICAgICAgIHBhcmFtc0J1Zi5nZXQoLi4ucGFyYW1zQnVmLmluZGV4VG9Mb2MoZmxhdHRlbkluZGV4ICogc2xpY2VTaXplICsgaykpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvdXRCdWYgYXMgVGVuc29yQnVmZmVyPFI+O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function gatherV2Impl(xBuf, indicesBuf, flattenOutputShape) {\n    const outBuf = buffer(flattenOutputShape, xBuf.dtype);\n    for (let i = 0; i < outBuf.size; ++i) {\n        const newLoc = outBuf.indexToLoc(i);\n        const originalLoc = newLoc.slice();\n        const batchIdx = originalLoc[0];\n        const indicesIdx = originalLoc[2];\n        const indicesIndex = indicesBuf.locToIndex([batchIdx, indicesIdx]);\n        originalLoc[2] = indicesBuf.values[indicesIndex];\n        const originalIndex = xBuf.locToIndex(originalLoc);\n        if (0 <= originalIndex && originalIndex < xBuf.values.length) {\n            outBuf.values[i] = xBuf.values[originalIndex];\n        } // Else, index is out of bounds, so leave the default zero val in outBuf.\n    }\n    return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyVjJfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvR2F0aGVyVjJfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUErQixNQUFNLHVCQUF1QixDQUFDO0FBRTNFLE1BQU0sVUFBVSxZQUFZLENBQ3hCLElBQXdCLEVBQUUsVUFBOEIsRUFDeEQsa0JBQTRCO0lBQzlCLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwQyxNQUFNLFdBQVcsR0FBYSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDN0MsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLE1BQU0sVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNsQyxNQUFNLFlBQVksR0FBRyxVQUFVLENBQUMsVUFBVSxDQUFDLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDbkUsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFXLENBQUM7UUFFM0QsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsSUFBSSxhQUFhLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFO1lBQzVELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUMsQ0FBQztTQUMvQyxDQUFDLHlFQUF5RTtLQUM1RTtJQUVELE9BQU8sTUFBNEIsQ0FBQztBQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgRGF0YVR5cGUsIFJhbmssIFRlbnNvckJ1ZmZlcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGdhdGhlclYySW1wbDxSIGV4dGVuZHMgUmFuaywgRCBleHRlbmRzIERhdGFUeXBlPihcbiAgICB4QnVmOiBUZW5zb3JCdWZmZXI8UiwgRD4sIGluZGljZXNCdWY6IFRlbnNvckJ1ZmZlcjxSLCBEPixcbiAgICBmbGF0dGVuT3V0cHV0U2hhcGU6IG51bWJlcltdKTogVGVuc29yQnVmZmVyPFIsIEQ+IHtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKGZsYXR0ZW5PdXRwdXRTaGFwZSwgeEJ1Zi5kdHlwZSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7ICsraSkge1xuICAgIGNvbnN0IG5ld0xvYyA9IG91dEJ1Zi5pbmRleFRvTG9jKGkpO1xuXG4gICAgY29uc3Qgb3JpZ2luYWxMb2M6IG51bWJlcltdID0gbmV3TG9jLnNsaWNlKCk7XG4gICAgY29uc3QgYmF0Y2hJZHggPSBvcmlnaW5hbExvY1swXTtcbiAgICBjb25zdCBpbmRpY2VzSWR4ID0gb3JpZ2luYWxMb2NbMl07XG4gICAgY29uc3QgaW5kaWNlc0luZGV4ID0gaW5kaWNlc0J1Zi5sb2NUb0luZGV4KFtiYXRjaElkeCwgaW5kaWNlc0lkeF0pO1xuICAgIG9yaWdpbmFsTG9jWzJdID0gaW5kaWNlc0J1Zi52YWx1ZXNbaW5kaWNlc0luZGV4XSBhcyBudW1iZXI7XG5cbiAgICBjb25zdCBvcmlnaW5hbEluZGV4ID0geEJ1Zi5sb2NUb0luZGV4KG9yaWdpbmFsTG9jKTtcblxuICAgIGlmICgwIDw9IG9yaWdpbmFsSW5kZXggJiYgb3JpZ2luYWxJbmRleCA8IHhCdWYudmFsdWVzLmxlbmd0aCkge1xuICAgICAgb3V0QnVmLnZhbHVlc1tpXSA9IHhCdWYudmFsdWVzW29yaWdpbmFsSW5kZXhdO1xuICAgIH0gLy8gRWxzZSwgaW5kZXggaXMgb3V0IG9mIGJvdW5kcywgc28gbGVhdmUgdGhlIGRlZmF1bHQgemVybyB2YWwgaW4gb3V0QnVmLlxuICB9XG5cbiAgcmV0dXJuIG91dEJ1ZiBhcyBUZW5zb3JCdWZmZXI8UiwgRD47XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Greater } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const greaterImpl = createSimpleBinaryKernelImpl((a, b) => (a > b) ? 1 : 0);\nexport const greater = binaryKernelFunc(Greater, greaterImpl, null /* complexImpl */, 'bool');\nexport const greaterConfig = {\n    kernelName: Greater,\n    backendName: 'cpu',\n    kernelFunc: greater\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvR3JlYXRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUNwQiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsT0FBTztDQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dyZWF0ZXIsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVySW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IChhID4gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgZ3JlYXRlciA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyhHcmVhdGVyLCBncmVhdGVySW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlcixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBncmVhdGVyXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { GreaterEqual } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const greaterEqualImpl = createSimpleBinaryKernelImpl((a, b) => (a >= b) ? 1 : 0);\nexport const greaterEqual = binaryKernelFunc(GreaterEqual, greaterEqualImpl, null /* complexImpl */, 'bool');\nexport const greaterEqualConfig = {\n    kernelName: GreaterEqual,\n    backendName: 'cpu',\n    kernelFunc: greaterEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlckVxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9HcmVhdGVyRXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRWpFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUN6Qiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdFLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxnQkFBZ0IsQ0FDeEMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFlBQVk7Q0FDekIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHcmVhdGVyRXF1YWwsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxJbXBsID1cbiAgICBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gKGEgPj0gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgZ3JlYXRlckVxdWFsID0gYmluYXJ5S2VybmVsRnVuYyhcbiAgICBHcmVhdGVyRXF1YWwsIGdyZWF0ZXJFcXVhbEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR3JlYXRlckVxdWFsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGdyZWF0ZXJFcXVhbFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Less } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const lessImpl = createSimpleBinaryKernelImpl((a, b) => (a < b) ? 1 : 0);\nexport const less = binaryKernelFunc(Less, lessImpl, null /* complexImpl */, 'bool');\nexport const lessConfig = {\n    kernelName: Less,\n    backendName: 'cpu',\n    kernelFunc: less\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTGVzcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUNqQiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzVFLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FDYixnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUVyRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBMZXNzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGxlc3NJbXBsID1cbiAgICBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gKGEgPCBiKSA/IDEgOiAwKTtcbmV4cG9ydCBjb25zdCBsZXNzID1cbiAgICBiaW5hcnlLZXJuZWxGdW5jKExlc3MsIGxlc3NJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnYm9vbCcpO1xuXG5leHBvcnQgY29uc3QgbGVzc0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZXNzLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGxlc3Ncbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LessEqual } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const lessEqualImpl = createSimpleBinaryKernelImpl((a, b) => (a <= b) ? 1 : 0);\nexport const lessEqual = binaryKernelFunc(LessEqual, lessEqualImpl, null /* complexImpl */, 'bool');\nexport const lessEqualConfig = {\n    kernelName: LessEqual,\n    backendName: 'cpu',\n    kernelFunc: lessEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVzc0VxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9MZXNzRXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTlELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FDdEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3RSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQ2xCLGdCQUFnQixDQUFDLFNBQVMsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRS9FLE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUI7SUFDM0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFNBQVM7Q0FDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIExlc3NFcXVhbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWxJbXBsID1cbiAgICBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4gKGEgPD0gYikgPyAxIDogMCk7XG5leHBvcnQgY29uc3QgbGVzc0VxdWFsID1cbiAgICBiaW5hcnlLZXJuZWxGdW5jKExlc3NFcXVhbCwgbGVzc0VxdWFsSW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGxlc3NFcXVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZXNzRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbGVzc0VxdWFsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function linSpaceImpl(start, stop, num) {\n    const step = (stop - start) / (num - 1);\n    const values = util.makeZerosTypedArray(num, 'float32');\n    values[0] = start;\n    for (let i = 1; i < values.length; i++) {\n        values[i] = values[i - 1] + step;\n    }\n    return values;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluU3BhY2VfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTGluU3BhY2VfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxVQUFVLFlBQVksQ0FDeEIsS0FBYSxFQUFFLElBQVksRUFBRSxHQUFXO0lBQzFDLE1BQU0sSUFBSSxHQUFHLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEQsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNsQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7S0FDbEM7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1R5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaW5TcGFjZUltcGwoXG4gICAgc3RhcnQ6IG51bWJlciwgc3RvcDogbnVtYmVyLCBudW06IG51bWJlcik6IFR5cGVkQXJyYXkge1xuICBjb25zdCBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyAobnVtIC0gMSk7XG5cbiAgY29uc3QgdmFsdWVzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KG51bSwgJ2Zsb2F0MzInKTtcbiAgdmFsdWVzWzBdID0gc3RhcnQ7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsdWVzW2ldID0gdmFsdWVzW2kgLSAxXSArIHN0ZXA7XG4gIH1cblxuICByZXR1cm4gdmFsdWVzO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const logImpl = createSimpleUnaryImpl((xi) => Math.log(xi));\nexport const log = unaryKernelFuncFromImpl(Log, logImpl);\nexport const logConfig = {\n    kernelName: Log,\n    backendName: 'cpu',\n    kernelFunc: log,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Mb2cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzFELE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTdELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ25FLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUFHO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZVVuYXJ5SW1wbH0gZnJvbSAnLi4vdXRpbHMvdW5hcnlfaW1wbCc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY0Zyb21JbXBsfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBsb2dJbXBsID0gY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gTWF0aC5sb2coeGkpKTtcbmV4cG9ydCBjb25zdCBsb2cgPSB1bmFyeUtlcm5lbEZ1bmNGcm9tSW1wbChMb2csIGxvZ0ltcGwpO1xuXG5leHBvcnQgY29uc3QgbG9nQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBsb2csXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function maxImpl(aVals, reduceSize, outShape, dtype) {\n    const vals = util.getTypedArrayFromDType(dtype, util.sizeFromShape(outShape));\n    for (let i = 0; i < vals.length; ++i) {\n        const offset = i * reduceSize;\n        let max = aVals[offset];\n        for (let j = 0; j < reduceSize; ++j) {\n            const value = aVals[offset + j];\n            if (Number.isNaN(value) ||\n                value > max) { // comparison with NaN always return false\n                max = value;\n            }\n        }\n        vals[i] = max;\n    }\n    return vals;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL01heF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBd0MsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsTUFBTSxVQUFVLE9BQU8sQ0FDbkIsS0FBaUIsRUFBRSxVQUFrQixFQUFFLFFBQWtCLEVBQ3pELEtBQWU7SUFDakIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUNwQyxLQUF3QixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUU1RCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ25DLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQztnQkFDbkIsS0FBSyxHQUFHLEdBQUcsRUFBRSxFQUFHLDBDQUEwQztnQkFDNUQsR0FBRyxHQUFHLEtBQUssQ0FBQzthQUNiO1NBQ0Y7UUFDRCxJQUFJLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDO0tBQ2Y7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGF0YVR5cGUsIE51bWVyaWNEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heEltcGwoXG4gICAgYVZhbHM6IFR5cGVkQXJyYXksIHJlZHVjZVNpemU6IG51bWJlciwgb3V0U2hhcGU6IG51bWJlcltdLFxuICAgIGR0eXBlOiBEYXRhVHlwZSk6IFR5cGVkQXJyYXkge1xuICBjb25zdCB2YWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKFxuICAgICAgZHR5cGUgYXMgTnVtZXJpY0RhdGFUeXBlLCB1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICBsZXQgbWF4ID0gYVZhbHNbb2Zmc2V0XTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJlZHVjZVNpemU7ICsraikge1xuICAgICAgY29uc3QgdmFsdWUgPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICAgIGlmIChOdW1iZXIuaXNOYU4odmFsdWUpIHx8XG4gICAgICAgICAgdmFsdWUgPiBtYXgpIHsgIC8vIGNvbXBhcmlzb24gd2l0aCBOYU4gYWx3YXlzIHJldHVybiBmYWxzZVxuICAgICAgICBtYXggPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsc1tpXSA9IG1heDtcbiAgfVxuICByZXR1cm4gdmFscztcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Maximum } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const maximumImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => Math.max(aValue, bValue)));\nexport const maximum = binaryKernelFunc(Maximum, maximumImpl);\nexport const maximumConfig = {\n    kernelName: Maximum,\n    backendName: 'cpu',\n    kernelFunc: maximum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4aW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWF4aW11bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUNuRCxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFnQixFQUFFLE1BQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxPQUFPO0NBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBNYXhpbXVtfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IG1heGltdW1JbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbChcbiAgICAoKGFWYWx1ZSwgYlZhbHVlKSA9PiBNYXRoLm1heChhVmFsdWUgYXMgbnVtYmVyLCBiVmFsdWUgYXMgbnVtYmVyKSkpO1xuZXhwb3J0IGNvbnN0IG1heGltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKE1heGltdW0sIG1heGltdW1JbXBsKTtcblxuZXhwb3J0IGNvbnN0IG1heGltdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4aW11bSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtYXhpbXVtXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Minimum } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const minimumImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => Math.min(aValue, bValue)));\nexport const minimum = binaryKernelFunc(Minimum, minimumImpl);\nexport const minimumConfig = {\n    kernelName: Minimum,\n    backendName: 'cpu',\n    kernelFunc: minimum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWluaW11bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFHLDRCQUE0QixDQUNuRCxDQUFDLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFnQixFQUFFLE1BQWdCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDeEUsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUU5RCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxPQUFPO0NBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBNaW5pbXVtfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IG1pbmltdW1JbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbChcbiAgICAoKGFWYWx1ZSwgYlZhbHVlKSA9PiBNYXRoLm1pbihhVmFsdWUgYXMgbnVtYmVyLCBiVmFsdWUgYXMgbnVtYmVyKSkpO1xuZXhwb3J0IGNvbnN0IG1pbmltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKE1pbmltdW0sIG1pbmltdW1JbXBsKTtcblxuZXhwb3J0IGNvbnN0IG1pbmltdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWluaW11bSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtaW5pbXVtXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Multiply } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc, createComplexBinaryKernelImpl } from '../utils/binary_utils';\nexport const multiplyImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => aValue * bValue));\nexport const multiplyComplexImpl = createComplexBinaryKernelImpl(((aReal, aImag, bReal, bImag) => {\n    return {\n        real: aReal * bReal - aImag * bImag,\n        imag: aReal * bImag + aImag * bReal\n    };\n}));\nexport const multiply = binaryKernelFunc(Multiply, multiplyImpl, multiplyComplexImpl);\nexport const multiplyConfig = {\n    kernelName: Multiply,\n    backendName: 'cpu',\n    kernelFunc: multiply\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlwbHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL011bHRpcGx5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUUsNkJBQTZCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsNEJBQTRCLENBQ3BELENBQUMsQ0FBQyxNQUFjLEVBQUUsTUFBYyxFQUFFLEVBQUUsQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQztBQUMzRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FDNUIsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQzVELE9BQU87UUFDTCxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztRQUNuQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssR0FBRyxLQUFLLEdBQUcsS0FBSztLQUNwQyxDQUFDO0FBQ0osQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVSLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FDakIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBRWxFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFFBQVE7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIE11bHRpcGx5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgbXVsdGlwbHlJbXBsID0gY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbChcbiAgICAoKGFWYWx1ZTogbnVtYmVyLCBiVmFsdWU6IG51bWJlcikgPT4gYVZhbHVlICogYlZhbHVlKSk7XG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb21wbGV4SW1wbCA9XG4gICAgY3JlYXRlQ29tcGxleEJpbmFyeUtlcm5lbEltcGwoKChhUmVhbCwgYUltYWcsIGJSZWFsLCBiSW1hZykgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgcmVhbDogYVJlYWwgKiBiUmVhbCAtIGFJbWFnICogYkltYWcsXG4gICAgICAgIGltYWc6IGFSZWFsICogYkltYWcgKyBhSW1hZyAqIGJSZWFsXG4gICAgICB9O1xuICAgIH0pKTtcblxuZXhwb3J0IGNvbnN0IG11bHRpcGx5ID1cbiAgICBiaW5hcnlLZXJuZWxGdW5jKE11bHRpcGx5LCBtdWx0aXBseUltcGwsIG11bHRpcGx5Q29tcGxleEltcGwpO1xuXG5leHBvcnQgY29uc3QgbXVsdGlwbHlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTXVsdGlwbHksXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbXVsdGlwbHlcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Neg, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { multiplyImpl } from './Multiply';\nexport function negImpl(xVals, xShape, xDtype) {\n    const minusOne = util.createScalarValue(-1, xDtype);\n    return multiplyImpl([], xShape, minusOne, xVals, xDtype);\n}\nexport function neg(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    assertNotComplex(x, 'neg');\n    const xVals = backend.data.get(x.dataId).values;\n    const [res, newShape] = negImpl(xVals, x.shape, x.dtype);\n    return backend.makeTensorInfo(newShape, x.dtype, res);\n}\nexport const negConfig = {\n    kernelName: Neg,\n    backendName: 'cpu',\n    kernelFunc: neg\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9OZWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFxQyxHQUFHLEVBQXVDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE1BQU0sVUFBVSxPQUFPLENBQUMsS0FBaUIsRUFBRSxNQUFnQixFQUFFLE1BQWdCO0lBRTNFLE1BQU0sUUFBUSxHQUNWLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLENBQW9CLEVBQUUsTUFBTSxDQUFlLENBQUM7SUFDeEUsT0FBTyxZQUFZLENBQUMsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxNQUFNLFVBQVUsR0FBRyxDQUFDLElBQW9EO0lBRXRFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbkIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzlELE1BQU0sQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6RCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBOZWcsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIFVuYXJ5SW5wdXRzLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7bXVsdGlwbHlJbXBsfSBmcm9tICcuL011bHRpcGx5JztcblxuZXhwb3J0IGZ1bmN0aW9uIG5lZ0ltcGwoeFZhbHM6IFR5cGVkQXJyYXksIHhTaGFwZTogbnVtYmVyW10sIHhEdHlwZTogRGF0YVR5cGUpOlxuICAgIFtUeXBlZEFycmF5LCBudW1iZXJbXV0ge1xuICBjb25zdCBtaW51c09uZSA9XG4gICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKC0xIGFzIHt9IGFzICdmbG9hdDMyJywgeER0eXBlKSBhcyBUeXBlZEFycmF5O1xuICByZXR1cm4gbXVsdGlwbHlJbXBsKFtdLCB4U2hhcGUsIG1pbnVzT25lLCB4VmFscywgeER0eXBlKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG5lZyhhcmdzOiB7aW5wdXRzOiBVbmFyeUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbmVnJyk7XG5cbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgW3JlcywgbmV3U2hhcGVdID0gbmVnSW1wbCh4VmFscywgeC5zaGFwZSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUsIHJlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBuZWdDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTmVnLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IG5lZyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { NotEqual } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const notEqualImpl = createSimpleBinaryKernelImpl(((a, b) => (a !== b) ? 1 : 0));\nexport const notEqual = binaryKernelFunc(NotEqual, notEqualImpl, null /* complexOp */, 'bool');\nexport const notEqualConfig = {\n    kernelName: NotEqual,\n    backendName: 'cpu',\n    kernelFunc: notEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90RXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL05vdEVxdWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQ3JCLDRCQUE0QixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FDakIsZ0JBQWdCLENBQUMsUUFBUSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFFBQVE7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIE5vdEVxdWFsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGEsIGIpID0+IChhICE9PSBiKSA/IDEgOiAwKSk7XG5leHBvcnQgY29uc3Qgbm90RXF1YWwgPVxuICAgIGJpbmFyeUtlcm5lbEZ1bmMoTm90RXF1YWwsIG5vdEVxdWFsSW1wbCwgbnVsbCAvKiBjb21wbGV4T3AgKi8sICdib29sJyk7XG5cbmV4cG9ydCBjb25zdCBub3RFcXVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBOb3RFcXVhbCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBub3RFcXVhbFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function transposeImpl(xVals, xShape, dtype, perm, newShape) {\n    const xRank = xShape.length;\n    const xSize = util.sizeFromShape(xShape);\n    const xStrides = util.computeStrides(xShape);\n    const newStrides = util.computeStrides(newShape);\n    const result = util.getTypedArrayFromDType(dtype, util.sizeFromShape(newShape));\n    for (let i = 0; i < xSize; ++i) {\n        const loc = util.indexToLoc(i, xRank, xStrides);\n        // Permute location.\n        const newLoc = new Array(loc.length);\n        for (let i = 0; i < newLoc.length; i++) {\n            newLoc[i] = loc[perm[i]];\n        }\n        const newIndex = util.locToIndex(newLoc, xRank, newStrides);\n        result[newIndex] = xVals[i];\n    }\n    return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1RyYW5zcG9zZV9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzQyxNQUFNLFVBQVUsYUFBYSxDQUN6QixLQUFpQixFQUFFLE1BQWdCLEVBQUUsS0FBZSxFQUFFLElBQWMsRUFDcEUsUUFBa0I7SUFDcEIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM1QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVqRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ3RDLEtBQXdCLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRTVELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDOUIsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRWhELG9CQUFvQjtRQUNwQixNQUFNLE1BQU0sR0FBYSxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDL0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMxQjtRQUVELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM1RCxNQUFNLENBQUMsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgTnVtZXJpY0RhdGFUeXBlLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gdHJhbnNwb3NlSW1wbChcbiAgICB4VmFsczogVHlwZWRBcnJheSwgeFNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLCBwZXJtOiBudW1iZXJbXSxcbiAgICBuZXdTaGFwZTogbnVtYmVyW10pOiBUeXBlZEFycmF5IHtcbiAgY29uc3QgeFJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4U2hhcGUpO1xuICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeFNoYXBlKTtcbiAgY29uc3QgbmV3U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMobmV3U2hhcGUpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShcbiAgICAgIGR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG5ld1NoYXBlKSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgKytpKSB7XG4gICAgY29uc3QgbG9jID0gdXRpbC5pbmRleFRvTG9jKGksIHhSYW5rLCB4U3RyaWRlcyk7XG5cbiAgICAvLyBQZXJtdXRlIGxvY2F0aW9uLlxuICAgIGNvbnN0IG5ld0xvYzogbnVtYmVyW10gPSBuZXcgQXJyYXkobG9jLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdMb2MubGVuZ3RoOyBpKyspIHtcbiAgICAgIG5ld0xvY1tpXSA9IGxvY1twZXJtW2ldXTtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdJbmRleCA9IHV0aWwubG9jVG9JbmRleChuZXdMb2MsIHhSYW5rLCBuZXdTdHJpZGVzKTtcbiAgICByZXN1bHRbbmV3SW5kZXhdID0geFZhbHNbaV07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transpose } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transposeImpl } from './Transpose_impl';\nexport function transpose(args) {\n    const { inputs, attrs, backend } = args;\n    const { x } = inputs;\n    const { perm } = attrs;\n    assertNotComplex(x, 'transpose');\n    const xRank = x.shape.length;\n    const newShape = new Array(xRank);\n    for (let i = 0; i < newShape.length; i++) {\n        newShape[i] = x.shape[perm[i]];\n    }\n    const values = backend.data.get(x.dataId).values;\n    const result = transposeImpl(values, x.shape, x.dtype, perm, newShape);\n    const dataId = backend.write(result, newShape, x.dtype);\n    return { dataId, shape: newShape, dtype: x.dtype };\n}\nexport const transposeConfig = {\n    kernelName: Transpose,\n    backendName: 'cpu',\n    kernelFunc: transpose\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9UcmFuc3Bvc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxTQUFTLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHbkksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxRQUFRLEdBQWEsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDeEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEM7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUMvRCxNQUFNLE1BQU0sR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFdkUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxPQUFPLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztBQUNuRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFRyYW5zcG9zZSwgVHJhbnNwb3NlQXR0cnMsIFRyYW5zcG9zZUlucHV0cywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmltcG9ydCB7dHJhbnNwb3NlSW1wbH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2UoYXJnczoge1xuICBpbnB1dHM6IFRyYW5zcG9zZUlucHV0cyxcbiAgYXR0cnM6IFRyYW5zcG9zZUF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVVxufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtwZXJtfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ3RyYW5zcG9zZScpO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgbmV3U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtW2ldXTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCByZXN1bHQgPSB0cmFuc3Bvc2VJbXBsKHZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgcGVybSwgbmV3U2hhcGUpO1xuXG4gIGNvbnN0IGRhdGFJZCA9IGJhY2tlbmQud3JpdGUocmVzdWx0LCBuZXdTaGFwZSwgeC5kdHlwZSk7XG4gIHJldHVybiB7ZGF0YUlkLCBzaGFwZTogbmV3U2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zcG9zZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUcmFuc3Bvc2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogdHJhbnNwb3NlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Prod, upcastType, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function prodImpl(xShape, xDtype, xVals, reductionAxes) {\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(xShape, reductionAxes);\n    const outDtype = upcastType(xDtype, 'int32');\n    const outVals = util.makeZerosTypedArray(util.sizeFromShape(outShape), outDtype);\n    const reduceSize = util.sizeFromShape(reduceShape);\n    for (let i = 0; i < outVals.length; ++i) {\n        const offset = i * reduceSize;\n        let prod = 1;\n        for (let j = 0; j < reduceSize; ++j) {\n            prod *= xVals[offset + j];\n        }\n        outVals[i] = prod;\n    }\n    return { outVals, outShape, outDtype };\n}\nexport function prod(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    assertNotComplex(x, 'prod');\n    const xRank = x.shape.length;\n    const axes = util.parseAxisParam(axis, x.shape);\n    const permutation = backend_util.getAxesPermutation(axes, xRank);\n    let reductionAxes = axes;\n    let permutedX = x;\n    const intermediateTensorInfos = [];\n    if (permutation != null) {\n        permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n        intermediateTensorInfos.push(permutedX);\n        reductionAxes = backend_util.getInnerMostAxes(reductionAxes.length, xRank);\n    }\n    const xVals = backend.data.get(permutedX.dataId).values;\n    const { outVals, outShape, outDtype } = prodImpl(permutedX.shape, permutedX.dtype, xVals, reductionAxes);\n    let resultShape = outShape;\n    if (keepDims) {\n        resultShape = backend_util.expandShapeToKeepDim(outShape, axes);\n    }\n    intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return backend.makeTensorInfo(resultShape, outDtype, outVals);\n}\nexport const prodConfig = {\n    kernelName: Prod,\n    backendName: 'cpu',\n    kernelFunc: prod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUHJvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFzQyxJQUFJLEVBQWlELFVBQVUsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsUUFBUSxDQUNwQixNQUFnQixFQUFFLE1BQWdCLEVBQUUsS0FBaUIsRUFDckQsYUFBdUI7SUFFekIsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FDekIsWUFBWSxDQUFDLHlCQUF5QixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNsRSxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQzdDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FDcEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsRUFBRSxRQUFRLENBQWUsQ0FBQztJQUMxRSxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRW5ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztTQUMzQjtRQUNELE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7S0FDbkI7SUFFRCxPQUFPLEVBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUMsQ0FBQztBQUN2QyxDQUFDO0FBRUQsTUFBTSxVQUFVLElBQUksQ0FDaEIsSUFBcUU7SUFFdkUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTVCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRCxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQztJQUN6QixJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFDbEIsTUFBTSx1QkFBdUIsR0FBRyxFQUFFLENBQUM7SUFDbkMsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ3ZCLFNBQVMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBQyxFQUFDLENBQUMsQ0FBQztRQUMxRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsYUFBYSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzVFO0lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdEUsTUFBTSxFQUFDLE9BQU8sRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLEdBQy9CLFFBQVEsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBRXJFLElBQUksV0FBVyxHQUFHLFFBQVEsQ0FBQztJQUMzQixJQUFJLFFBQVEsRUFBRTtRQUNaLFdBQVcsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQ2pFO0lBRUQsdUJBQXVCLENBQUMsT0FBTyxDQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGF0YVR5cGUsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUHJvZCwgUHJvZEF0dHJzLCBQcm9kSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1cGNhc3RUeXBlLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcm9kSW1wbChcbiAgICB4U2hhcGU6IG51bWJlcltdLCB4RHR5cGU6IERhdGFUeXBlLCB4VmFsczogVHlwZWRBcnJheSxcbiAgICByZWR1Y3Rpb25BeGVzOiBudW1iZXJbXSk6XG4gICAge291dFZhbHM6IFR5cGVkQXJyYXksIG91dFNoYXBlOiBudW1iZXJbXSwgb3V0RHR5cGU6IERhdGFUeXBlfSB7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHhTaGFwZSwgcmVkdWN0aW9uQXhlcyk7XG4gIGNvbnN0IG91dER0eXBlID0gdXBjYXN0VHlwZSh4RHR5cGUsICdpbnQzMicpO1xuICBjb25zdCBvdXRWYWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KFxuICAgICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksIG91dER0eXBlKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG91dFZhbHMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBpICogcmVkdWNlU2l6ZTtcbiAgICBsZXQgcHJvZCA9IDE7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIHByb2QgKj0geFZhbHNbb2Zmc2V0ICsgal07XG4gICAgfVxuICAgIG91dFZhbHNbaV0gPSBwcm9kO1xuICB9XG5cbiAgcmV0dXJuIHtvdXRWYWxzLCBvdXRTaGFwZSwgb3V0RHR5cGV9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcHJvZChcbiAgICBhcmdzOiB7aW5wdXRzOiBQcm9kSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFByb2RBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICdwcm9kJyk7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG5cbiAgY29uc3QgcGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgbGV0IHJlZHVjdGlvbkF4ZXMgPSBheGVzO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGF0aW9ufX0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2gocGVybXV0ZWRYKTtcbiAgICByZWR1Y3Rpb25BeGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMocmVkdWN0aW9uQXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgfVxuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldChwZXJtdXRlZFguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qge291dFZhbHMsIG91dFNoYXBlLCBvdXREdHlwZX0gPVxuICAgICAgcHJvZEltcGwocGVybXV0ZWRYLnNoYXBlLCBwZXJtdXRlZFguZHR5cGUsIHhWYWxzLCByZWR1Y3Rpb25BeGVzKTtcblxuICBsZXQgcmVzdWx0U2hhcGUgPSBvdXRTaGFwZTtcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgcmVzdWx0U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ob3V0U2hhcGUsIGF4ZXMpO1xuICB9XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIG91dER0eXBlLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHByb2RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUHJvZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBwcm9kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nfunction validateIndices(indices, indicesShape, numParams) {\n    indices.forEach((index, i) => {\n        if (index < 0 || index >= numParams) {\n            const locString = util.indexToLoc(i, indicesShape.length, util.computeStrides(indicesShape))\n                .join(',');\n            throw new Error(`indices[${locString}] = ${index} is not in [0, ${numParams})`);\n        }\n    });\n}\nfunction validateSplits(paramsNestedSplits, numParamsDenseValues) {\n    // Validate\n    for (let dim = 0; dim < paramsNestedSplits.length; ++dim) {\n        const splits = paramsNestedSplits[dim];\n        const lastSplit = (dim === paramsNestedSplits.length - 1) ?\n            numParamsDenseValues :\n            paramsNestedSplits[dim + 1].length;\n        if (splits.length === 0) {\n            throw new Error('Ragged splits may not be empty');\n        }\n        if (splits[0] < 0) {\n            throw new Error('Ragged splits must be non-negative');\n        }\n        if (splits[splits.length - 1] > lastSplit) {\n            throw new Error('Ragged splits must not point past values');\n        }\n        for (let i = 1; i < splits.length; ++i) {\n            if (splits[i - 1] > splits[i]) {\n                throw new Error('Ragged splits must be sorted in ascending order');\n            }\n        }\n    }\n}\n// Construct the `splits` output tensors, encoded using a nested vector.\n// Also find the slices of values that need to be copied, and store them\n// in `valueSlices`.  The total number of values that will be copied (which\n// we need for allocating the output values tensor) is stored in `numValues`.\nfunction makeSplits(indices, indicesShape, paramsNestedSplits, numParamsDenseValues) {\n    const valueSlices = [];\n    let numValues = 0;\n    const numSplits = indicesShape.length - 1 + paramsNestedSplits.length;\n    const outSplits = new Array(numSplits).fill(null).map(() => [0]);\n    validateSplits(paramsNestedSplits, numParamsDenseValues);\n    // Add `splits` that come from all but the last dimension of the dense\n    // Tensor `indices`.  In particular, for each dimension D, we add a\n    // splits tensor whose values are:\n    //   range(reduceProd(splits.shape[:D]) + 1) * splits.shape[D+1]\n    // E.g., if indices.shape=[2, 3, 4] then we will add splits tensors:\n    //   [0, 3, 6]                    # length=2+1, stride=3\n    //   [0, 4, 8, 12, 16, 20, 24]    # length=2*3+1, stride=4\n    let nrows = 1;\n    for (let dim = 0; dim < indicesShape.length - 1; ++dim) {\n        nrows *= indicesShape[dim];\n        const rowLength = indicesShape[dim + 1];\n        for (let i = 1; i < nrows + 1; ++i) {\n            outSplits[dim].push(i * rowLength);\n        }\n    }\n    // Add `splits` that come from `paramsNestedSplits`.  Starting with the\n    // outermost ragged dimension (i.e., the first `splits` tensor), we work\n    // our way in, finding the range of values that should be copied.  As we\n    // go, we update the output `splits` for each dimension with the appropriate\n    // values.  In particular, the *lengths* of the slices from `param_splits`\n    // should be copied to generate corresponding slice lengths in the output\n    // splits.  E.g., if we are copying a ragged row with length 4, then we\n    // should add a new split point to outSplits that is 4 greater than the\n    // previous split point in outSplits.\n    for (let i = 0; i < indices.length; ++i) {\n        let start = indices[i];\n        let limit = indices[i] + 1;\n        // Copy splits.\n        for (let dim = 0; dim < paramsNestedSplits.length; ++dim) {\n            const splits = paramsNestedSplits[dim];\n            const outDim = dim + indicesShape.length - 1;\n            if (outDim >= 0) {\n                const outSplitsOutDim = outSplits[outDim];\n                const delta = outSplitsOutDim[outSplitsOutDim.length - 1] - splits[start];\n                for (let j = start; j < limit; ++j) {\n                    outSplits[outDim].push(splits[j + 1] + delta);\n                }\n            }\n            start = splits[start];\n            limit = splits[limit];\n        }\n        if (limit !== start) {\n            valueSlices.push([start, limit]);\n            numValues += limit - start;\n        }\n    }\n    return { outSplits, valueSlices, numValues };\n}\nfunction getSplits(outSplits) {\n    const splitsOut = [];\n    for (let i = 0; i < outSplits.length; ++i) {\n        const numSplits = outSplits[i].length;\n        const splits = util.getArrayFromDType('int32', numSplits);\n        splitsOut.push(splits);\n        outSplits[i].forEach((value, j) => splits[j] = value);\n    }\n    return splitsOut;\n}\nfunction computeFlatOuterDims(orig, numOutDims) {\n    const outDims = orig.slice(0, numOutDims);\n    while (outDims.length < numOutDims) {\n        outDims.push(1);\n    }\n    for (let inDim = numOutDims; inDim < orig.length; inDim++) {\n        outDims[numOutDims - 1] *= orig[inDim];\n    }\n    return outDims;\n}\n// For each slice in `(start, limit)` in `valueSlices`, append\n// `paramsDenseValues[start,...,limit] to `values`.  `valueSize` indicates\n// the number of scalars contained in each value paramsDenseValues[i].\nfunction writeValueSlices(paramsDenseValues, paramsDenseValuesShape, valueSlices, valueSize, values, valuesShape) {\n    const denseM = computeFlatOuterDims(paramsDenseValuesShape, 2)[1];\n    const valuesM = computeFlatOuterDims(valuesShape, 2)[1];\n    let outPos = 0;\n    for (const slice of valueSlices) {\n        for (let i = slice[0]; i < slice[1]; ++i) {\n            for (let j = 0; j < valueSize; ++j) {\n                values[outPos * valuesM + j] = paramsDenseValues[i * denseM + j];\n            }\n            ++outPos;\n        }\n    }\n}\nfunction getValues(paramsDenseValues, paramsDenseValuesShape, paramsDenseValuesDType, valueSlices, numValues) {\n    const valuesShape = paramsDenseValuesShape.slice();\n    valuesShape[0] = numValues;\n    const valuesOut = util.getArrayFromDType(paramsDenseValuesDType, util.sizeFromShape(valuesShape));\n    const numElements = paramsDenseValues.length;\n    const valueSize = numElements === 0 ? 0 : (numElements / paramsDenseValuesShape[0]);\n    writeValueSlices(paramsDenseValues, paramsDenseValuesShape, valueSlices, valueSize, valuesOut, valuesShape);\n    return [valuesOut, valuesShape];\n}\nexport function raggedGatherImpl(paramsNestedSplits, paramsNestedSplitsShapes, paramsDenseValues, paramsDenseValuesShape, paramsDenseValuesDType, indices, indicesShape, outputRaggedRank) {\n    if (paramsNestedSplits.length === 0) {\n        throw new Error('paramsNestedSplits must be non empty');\n    }\n    if (paramsNestedSplitsShapes[0].length === 0) {\n        throw new Error('Split tensors must not be scalars');\n    }\n    const numParams = paramsNestedSplitsShapes[0][0] - 1;\n    validateIndices(indices, indicesShape, numParams);\n    if (paramsDenseValuesShape.length === 0) {\n        throw new Error('params.rank must be nonzero');\n    }\n    const numParamsDenseValues = paramsDenseValuesShape[0];\n    // Calculate the `splits`, and store the value slices that we need to\n    // copy in `valueSlices`.\n    const { outSplits, valueSlices, numValues } = makeSplits(indices, indicesShape, paramsNestedSplits, numParamsDenseValues);\n    // Write the output tensors.\n    const outputNestedSplits = getSplits(outSplits);\n    const outputDenseValues = getValues(paramsDenseValues, paramsDenseValuesShape, paramsDenseValuesDType, valueSlices, numValues);\n    return [outputNestedSplits, outputDenseValues[0], outputDenseValues[1]];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkR2F0aGVyX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JhZ2dlZEdhdGhlcl9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBdUIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFakUsU0FBUyxlQUFlLENBQ3BCLE9BQW1CLEVBQUUsWUFBc0IsRUFBRSxTQUFpQjtJQUNoRSxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsS0FBYSxFQUFFLENBQVMsRUFBRSxFQUFFO1FBQzNDLElBQUksS0FBSyxHQUFHLENBQUMsSUFBSSxLQUFLLElBQUksU0FBUyxFQUFFO1lBQ25DLE1BQU0sU0FBUyxHQUNYLElBQUksQ0FBQyxVQUFVLENBQ1AsQ0FBQyxFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLENBQUMsQ0FBQztpQkFDN0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQ1gsV0FBVyxTQUFTLE9BQU8sS0FBSyxrQkFBa0IsU0FBUyxHQUFHLENBQUMsQ0FBQztTQUNyRTtJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsY0FBYyxDQUNuQixrQkFBZ0MsRUFBRSxvQkFBNEI7SUFDaEUsV0FBVztJQUNYLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsR0FBRyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsRUFBRSxHQUFHLEVBQUU7UUFDeEQsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdkMsTUFBTSxTQUFTLEdBQUcsQ0FBQyxHQUFHLEtBQUssa0JBQWtCLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQs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TUFBTSxrQkFBa0IsR0FBRyxTQUFTLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDaEQsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQy9CLGlCQUFpQixFQUFFLHNCQUFzQixFQUFFLHNCQUFzQixFQUNqRSxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFNUIsT0FBTyxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDMUUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZnVuY3Rpb24gdmFsaWRhdGVJbmRpY2VzKFxuICAgIGluZGljZXM6IFR5cGVkQXJyYXksIGluZGljZXNTaGFwZTogbnVtYmVyW10sIG51bVBhcmFtczogbnVtYmVyKSB7XG4gIGluZGljZXMuZm9yRWFjaCgoaW5kZXg6IG51bWJlciwgaTogbnVtYmVyKSA9PiB7XG4gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBudW1QYXJhbXMpIHtcbiAgICAgIGNvbnN0IGxvY1N0cmluZyA9XG4gICAgICAgICAgdXRpbC5pbmRleFRvTG9jKFxuICAgICAgICAgICAgICAgICAgaSwgaW5kaWNlc1NoYXBlLmxlbmd0aCwgdXRpbC5jb21wdXRlU3RyaWRlcyhpbmRpY2VzU2hhcGUpKVxuICAgICAgICAgICAgICAuam9pbignLCcpO1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBpbmRpY2VzWyR7bG9jU3RyaW5nfV0gPSAke2luZGV4fSBpcyBub3QgaW4gWzAsICR7bnVtUGFyYW1zfSlgKTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZVNwbGl0cyhcbiAgICBwYXJhbXNOZXN0ZWRTcGxpdHM6IFR5cGVkQXJyYXlbXSwgbnVtUGFyYW1zRGVuc2VWYWx1ZXM6IG51bWJlcikge1xuICAvLyBWYWxpZGF0ZVxuICBmb3IgKGxldCBkaW0gPSAwOyBkaW0gPCBwYXJhbXNOZXN0ZWRTcGxpdHMubGVuZ3RoOyArK2RpbSkge1xuICAgIGNvbnN0IHNwbGl0cyA9IHBhcmFtc05lc3RlZFNwbGl0c1tkaW1dO1xuICAgIGNvbnN0IGxhc3RTcGxpdCA9IChkaW0gPT09IHBhcmFtc05lc3RlZFNwbGl0cy5sZW5ndGggLSAxKSA/XG4gICAgICAgIG51bVBhcmFtc0RlbnNlVmFsdWVzIDpcbiAgICAgICAgcGFyYW1zTmVzdGVkU3BsaXRzW2RpbSArIDFdLmxlbmd0aDtcbiAgICBpZiAoc3BsaXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYWdnZWQgc3BsaXRzIG1heSBub3QgYmUgZW1wdHknKTtcbiAgICB9XG4gICAgaWYgKHNwbGl0c1swXSA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUmFnZ2VkIHNwbGl0cyBtdXN0IGJlIG5vbi1uZWdhdGl2ZScpO1xuICAgIH1cbiAgICBpZiAoc3BsaXRzW3NwbGl0cy5sZW5ndGggLSAxXSA+IGxhc3RTcGxpdCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdSYWdnZWQgc3BsaXRzIG11c3Qgbm90IHBvaW50IHBhc3QgdmFsdWVzJyk7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgc3BsaXRzLmxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoc3BsaXRzW2kgLSAxXSA+IHNwbGl0c1tpXSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JhZ2dlZCBzcGxpdHMgbXVzdCBiZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8vIENvbnN0cnVjdCB0aGUgYHNwbGl0c2Agb3V0cHV0IHRlbnNvcnMsIGVuY29kZWQgdXNpbmcgYSBuZXN0ZWQgdmVjdG9yLlxuLy8gQWxzbyBmaW5kIHRoZSBzbGljZXMgb2YgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSBjb3BpZWQsIGFuZCBzdG9yZSB0aGVtXG4vLyBpbiBgdmFsdWVTbGljZXNgLiAgVGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZXMgdGhhdCB3aWxsIGJlIGNvcGllZCAod2hpY2hcbi8vIHdlIG5lZWQgZm9yIGFsbG9jYXRpbmcgdGhlIG91dHB1dCB2YWx1ZXMgdGVuc29yKSBpcyBzdG9yZWQgaW4gYG51bVZhbHVlc2AuXG5mdW5jdGlvbiBtYWtlU3BsaXRzKFxuICAgIGluZGljZXM6IFR5cGVkQXJyYXksIGluZGljZXNTaGFwZTogbnVtYmVyW10sXG4gICAgcGFyYW1zTmVzdGVkU3BsaXRzOiBUeXBlZEFycmF5W10sIG51bVBhcmFtc0RlbnNlVmFsdWVzOiBudW1iZXIpIHtcbiAgY29uc3QgdmFsdWVTbGljZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW107XG4gIGxldCBudW1WYWx1ZXMgPSAwO1xuXG4gIGNvbnN0IG51bVNwbGl0cyA9IGluZGljZXNTaGFwZS5sZW5ndGggLSAxICsgcGFyYW1zTmVzdGVkU3BsaXRzLmxlbmd0aDtcbiAgY29uc3Qgb3V0U3BsaXRzID0gbmV3IEFycmF5KG51bVNwbGl0cykuZmlsbChudWxsKS5tYXAoKCkgPT4gWzBdKTtcblxuICB2YWxpZGF0ZVNwbGl0cyhwYXJhbXNOZXN0ZWRTcGxpdHMsIG51bVBhcmFtc0RlbnNlVmFsdWVzKTtcblxuICAvLyBBZGQgYHNwbGl0c2AgdGhhdCBjb21lIGZyb20gYWxsIGJ1dCB0aGUgbGFzdCBkaW1lbnNpb24gb2YgdGhlIGRlbnNlXG4gIC8vIFRlbnNvciBgaW5kaWNlc2AuICBJbiBwYXJ0aWN1bGFyLCBmb3IgZWFjaCBkaW1lbnNpb24gRCwgd2UgYWRkIGFcbiAgLy8gc3BsaXRzIHRlbnNvciB3aG9zZSB2YWx1ZXMgYXJlOlxuICAvLyAgIHJhbmdlKHJlZHVjZVByb2Qoc3BsaXRzLnNoYXBlWzpEXSkgKyAxKSAqIHNwbGl0cy5zaGFwZVtEKzFdXG4gIC8vIEUuZy4sIGlmIGluZGljZXMuc2hhcGU9WzIsIDMsIDRdIHRoZW4gd2Ugd2lsbCBhZGQgc3BsaXRzIHRlbnNvcnM6XG4gIC8vICAgWzAsIDMsIDZdICAgICAgICAgICAgICAgICAgICAjIGxlbmd0aD0yKzEsIHN0cmlkZT0zXG4gIC8vICAgWzAsIDQsIDgsIDEyLCAxNiwgMjAsIDI0XSAgICAjIGxlbmd0aD0yKjMrMSwgc3RyaWRlPTRcbiAgbGV0IG5yb3dzID0gMTtcbiAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDE7ICsrZGltKSB7XG4gICAgbnJvd3MgKj0gaW5kaWNlc1NoYXBlW2RpbV07XG4gICAgY29uc3Qgcm93TGVuZ3RoID0gaW5kaWNlc1NoYXBlW2RpbSArIDFdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgbnJvd3MgKyAxOyArK2kpIHtcbiAgICAgIG91dFNwbGl0c1tkaW1dLnB1c2goaSAqIHJvd0xlbmd0aCk7XG4gICAgfVxuICB9XG5cbiAgLy8gQWRkIGBzcGxpdHNgIHRoYXQgY29tZSBmcm9tIGBwYXJhbXNOZXN0ZWRTcGxpdHNgLiAgU3RhcnRpbmcgd2l0aCB0aGVcbiAgLy8gb3V0ZXJtb3N0IHJhZ2dlZCBkaW1lbnNpb24gKGkuZS4sIHRoZSBmaXJzdCBgc3BsaXRzYCB0ZW5zb3IpLCB3ZSB3b3JrXG4gIC8vIG91ciB3YXkgaW4sIGZpbmRpbmcgdGhlIHJhbmdlIG9mIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBjb3BpZWQuICBBcyB3ZVxuICAvLyBnbywgd2UgdXBkYXRlIHRoZSBvdXRwdXQgYHNwbGl0c2AgZm9yIGVhY2ggZGltZW5zaW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlXG4gIC8vIHZhbHVlcy4gIEluIHBhcnRpY3VsYXIsIHRoZSAqbGVuZ3Rocyogb2YgdGhlIHNsaWNlcyBmcm9tIGBwYXJhbV9zcGxpdHNgXG4gIC8vIHNob3VsZCBiZSBjb3BpZWQgdG8gZ2VuZXJhdGUgY29ycmVzcG9uZGluZyBzbGljZSBsZW5ndGhzIGluIHRoZSBvdXRwdXRcbiAgLy8gc3BsaXRzLiAgRS5nLiwgaWYgd2UgYXJlIGNvcHlpbmcgYSByYWdnZWQgcm93IHdpdGggbGVuZ3RoIDQsIHRoZW4gd2VcbiAgLy8gc2hvdWxkIGFkZCBhIG5ldyBzcGxpdCBwb2ludCB0byBvdXRTcGxpdHMgdGhhdCBpcyA0IGdyZWF0ZXIgdGhhbiB0aGVcbiAgLy8gcHJldmlvdXMgc3BsaXQgcG9pbnQgaW4gb3V0U3BsaXRzLlxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyArK2kpIHtcbiAgICBsZXQgc3RhcnQgPSBpbmRpY2VzW2ldO1xuICAgIGxldCBsaW1pdCA9IGluZGljZXNbaV0gKyAxO1xuXG4gICAgLy8gQ29weSBzcGxpdHMuXG4gICAgZm9yIChsZXQgZGltID0gMDsgZGltIDwgcGFyYW1zTmVzdGVkU3BsaXRzLmxlbmd0aDsgKytkaW0pIHtcbiAgICAgIGNvbnN0IHNwbGl0cyA9IHBhcmFtc05lc3RlZFNwbGl0c1tkaW1dO1xuICAgICAgY29uc3Qgb3V0RGltID0gZGltICsgaW5kaWNlc1NoYXBlLmxlbmd0aCAtIDE7XG4gICAgICBpZiAob3V0RGltID49IDApIHtcbiAgICAgICAgY29uc3Qgb3V0U3BsaXRzT3V0RGltID0gb3V0U3BsaXRzW291dERpbV07XG4gICAgICAgIGNvbnN0IGRlbHRhID1cbiAgICAgICAgICAgIG91dFNwbGl0c091dERpbVtvdXRTcGxpdHNPdXREaW0ubGVuZ3RoIC0gMV0gLSBzcGxpdHNbc3RhcnRdO1xuICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBsaW1pdDsgKytqKSB7XG4gICAgICAgICAgb3V0U3BsaXRzW291dERpbV0ucHVzaChzcGxpdHNbaiArIDFdICsgZGVsdGEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBzdGFydCA9IHNwbGl0c1tzdGFydF07XG4gICAgICBsaW1pdCA9IHNwbGl0c1tsaW1pdF07XG4gICAgfVxuICAgIGlmIChsaW1pdCAhPT0gc3RhcnQpIHtcbiAgICAgIHZhbHVlU2xpY2VzLnB1c2goW3N0YXJ0LCBsaW1pdF0pO1xuICAgICAgbnVtVmFsdWVzICs9IGxpbWl0IC0gc3RhcnQ7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHtvdXRTcGxpdHMsIHZhbHVlU2xpY2VzLCBudW1WYWx1ZXN9O1xufVxuXG5mdW5jdGlvbiBnZXRTcGxpdHMob3V0U3BsaXRzOiBudW1iZXJbXVtdKSB7XG4gIGNvbnN0IHNwbGl0c091dDogVHlwZWRBcnJheVtdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0U3BsaXRzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgbnVtU3BsaXRzID0gb3V0U3BsaXRzW2ldLmxlbmd0aDtcbiAgICBjb25zdCBzcGxpdHMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIG51bVNwbGl0cykgYXMgVHlwZWRBcnJheTtcbiAgICBzcGxpdHNPdXQucHVzaChzcGxpdHMpO1xuXG4gICAgb3V0U3BsaXRzW2ldLmZvckVhY2goKHZhbHVlLCBqOiBudW1iZXIpID0+IHNwbGl0c1tqXSA9IHZhbHVlKTtcbiAgfVxuXG4gIHJldHVybiBzcGxpdHNPdXQ7XG59XG5cbmZ1bmN0aW9uIGNvbXB1dGVGbGF0T3V0ZXJEaW1zKG9yaWc6IG51bWJlcltdLCBudW1PdXREaW1zOiBudW1iZXIpIHtcbiAgY29uc3Qgb3V0RGltcyA9IG9yaWcuc2xpY2UoMCwgbnVtT3V0RGltcyk7XG4gIHdoaWxlIChvdXREaW1zLmxlbmd0aCA8IG51bU91dERpbXMpIHtcbiAgICBvdXREaW1zLnB1c2goMSk7XG4gIH1cblxuICBmb3IgKGxldCBpbkRpbSA9IG51bU91dERpbXM7IGluRGltIDwgb3JpZy5sZW5ndGg7IGluRGltKyspIHtcbiAgICBvdXREaW1zW251bU91dERpbXMgLSAxXSAqPSBvcmlnW2luRGltXTtcbiAgfVxuXG4gIHJldHVybiBvdXREaW1zO1xufVxuLy8gRm9yIGVhY2ggc2xpY2UgaW4gYChzdGFydCwgbGltaXQpYCBpbiBgdmFsdWVTbGljZXNgLCBhcHBlbmRcbi8vIGBwYXJhbXNEZW5zZVZhbHVlc1tzdGFydCwuLi4sbGltaXRdIHRvIGB2YWx1ZXNgLiAgYHZhbHVlU2l6ZWAgaW5kaWNhdGVzXG4vLyB0aGUgbnVtYmVyIG9mIHNjYWxhcnMgY29udGFpbmVkIGluIGVhY2ggdmFsdWUgcGFyYW1zRGVuc2VWYWx1ZXNbaV0uXG5mdW5jdGlvbiB3cml0ZVZhbHVlU2xpY2VzKFxuICAgIHBhcmFtc0RlbnNlVmFsdWVzOiBUeXBlZEFycmF5LCBwYXJhbXNEZW5zZVZhbHVlc1NoYXBlOiBudW1iZXJbXSxcbiAgICB2YWx1ZVNsaWNlczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sIHZhbHVlU2l6ZTogbnVtYmVyLCB2YWx1ZXM6IFR5cGVkQXJyYXksXG4gICAgdmFsdWVzU2hhcGU6IG51bWJlcltdKSB7XG4gIGNvbnN0IGRlbnNlTSA9IGNvbXB1dGVGbGF0T3V0ZXJEaW1zKHBhcmFtc0RlbnNlVmFsdWVzU2hhcGUsIDIpWzFdO1xuICBjb25zdCB2YWx1ZXNNID0gY29tcHV0ZUZsYXRPdXRlckRpbXModmFsdWVzU2hhcGUsIDIpWzFdO1xuXG4gIGxldCBvdXRQb3MgPSAwO1xuICBmb3IgKGNvbnN0IHNsaWNlIG9mIHZhbHVlU2xpY2VzKSB7XG4gICAgZm9yIChsZXQgaSA9IHNsaWNlWzBdOyBpIDwgc2xpY2VbMV07ICsraSkge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZVNpemU7ICsraikge1xuICAgICAgICB2YWx1ZXNbb3V0UG9zICogdmFsdWVzTSArIGpdID0gcGFyYW1zRGVuc2VWYWx1ZXNbaSAqIGRlbnNlTSArIGpdO1xuICAgICAgfVxuICAgICAgKytvdXRQb3M7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGdldFZhbHVlcyhcbiAgICBwYXJhbXNEZW5zZVZhbHVlczogVHlwZWRBcnJheSwgcGFyYW1zRGVuc2VWYWx1ZXNTaGFwZTogbnVtYmVyW10sXG4gICAgcGFyYW1zRGVuc2VWYWx1ZXNEVHlwZTogRGF0YVR5cGUsIHZhbHVlU2xpY2VzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICBudW1WYWx1ZXM6IG51bWJlcik6IFtUeXBlZEFycmF5LCBudW1iZXJbXV0ge1xuICBjb25zdCB2YWx1ZXNTaGFwZSA9IHBhcmFtc0RlbnNlVmFsdWVzU2hhcGUuc2xpY2UoKTtcbiAgdmFsdWVzU2hhcGVbMF0gPSBudW1WYWx1ZXM7XG5cbiAgY29uc3QgdmFsdWVzT3V0ID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtc0RlbnNlVmFsdWVzRFR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB1dGlsLnNpemVGcm9tU2hhcGUodmFsdWVzU2hhcGUpKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IG51bUVsZW1lbnRzID0gcGFyYW1zRGVuc2VWYWx1ZXMubGVuZ3RoO1xuICBjb25zdCB2YWx1ZVNpemUgPVxuICAgICAgbnVtRWxlbWVudHMgPT09IDAgPyAwIDogKG51bUVsZW1lbnRzIC8gcGFyYW1zRGVuc2VWYWx1ZXNTaGFwZVswXSk7XG4gIHdyaXRlVmFsdWVTbGljZXMoXG4gICAgICBwYXJhbXNEZW5zZVZhbHVlcywgcGFyYW1zRGVuc2VWYWx1ZXNTaGFwZSwgdmFsdWVTbGljZXMsIHZhbHVlU2l6ZSxcbiAgICAgIHZhbHVlc091dCwgdmFsdWVzU2hhcGUpO1xuXG4gIHJldHVybiBbdmFsdWVzT3V0LCB2YWx1ZXNTaGFwZV07XG59XG5leHBvcnQgZnVuY3Rpb24gcmFnZ2VkR2F0aGVySW1wbChcbiAgICBwYXJhbXNOZXN0ZWRTcGxpdHM6IFR5cGVkQXJyYXlbXSwgcGFyYW1zTmVzdGVkU3BsaXRzU2hhcGVzOiBudW1iZXJbXVtdLFxuICAgIHBhcmFtc0RlbnNlVmFsdWVzOiBUeXBlZEFycmF5LCBwYXJhbXNEZW5zZVZhbHVlc1NoYXBlOiBudW1iZXJbXSxcbiAgICBwYXJhbXNEZW5zZVZhbHVlc0RUeXBlOiBEYXRhVHlwZSwgaW5kaWNlczogVHlwZWRBcnJheSxcbiAgICBpbmRpY2VzU2hhcGU6IG51bWJlcltdLFxuICAgIG91dHB1dFJhZ2dlZFJhbms6IG51bWJlcik6IFtUeXBlZEFycmF5W10sIFR5cGVkQXJyYXksIG51bWJlcltdXSB7XG4gIGlmIChwYXJhbXNOZXN0ZWRTcGxpdHMubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwYXJhbXNOZXN0ZWRTcGxpdHMgbXVzdCBiZSBub24gZW1wdHknKTtcbiAgfVxuXG4gIGlmIChwYXJhbXNOZXN0ZWRTcGxpdHNTaGFwZXNbMF0ubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdTcGxpdCB0ZW5zb3JzIG11c3Qgbm90IGJlIHNjYWxhcnMnKTtcbiAgfVxuICBjb25zdCBudW1QYXJhbXMgPSBwYXJhbXNOZXN0ZWRTcGxpdHNTaGFwZXNbMF1bMF0gLSAxO1xuICB2YWxpZGF0ZUluZGljZXMoaW5kaWNlcywgaW5kaWNlc1NoYXBlLCBudW1QYXJhbXMpO1xuXG4gIGlmIChwYXJhbXNEZW5zZVZhbHVlc1NoYXBlLmxlbmd0aCA9PT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcigncGFyYW1zLnJhbmsgbXVzdCBiZSBub256ZXJvJyk7XG4gIH1cbiAgY29uc3QgbnVtUGFyYW1zRGVuc2VWYWx1ZXMgPSBwYXJhbXNEZW5zZVZhbHVlc1NoYXBlWzBdO1xuXG4gIC8vIENhbGN1bGF0ZSB0aGUgYHNwbGl0c2AsIGFuZCBzdG9yZSB0aGUgdmFsdWUgc2xpY2VzIHRoYXQgd2UgbmVlZCB0b1xuICAvLyBjb3B5IGluIGB2YWx1ZVNsaWNlc2AuXG4gIGNvbnN0IHtvdXRTcGxpdHMsIHZhbHVlU2xpY2VzLCBudW1WYWx1ZXN9ID0gbWFrZVNwbGl0cyhcbiAgICAgIGluZGljZXMsIGluZGljZXNTaGFwZSwgcGFyYW1zTmVzdGVkU3BsaXRzLCBudW1QYXJhbXNEZW5zZVZhbHVlcyk7XG5cbiAgLy8gV3JpdGUgdGhlIG91dHB1dCB0ZW5zb3JzLlxuICBjb25zdCBvdXRwdXROZXN0ZWRTcGxpdHMgPSBnZXRTcGxpdHMob3V0U3BsaXRzKTtcbiAgY29uc3Qgb3V0cHV0RGVuc2VWYWx1ZXMgPSBnZXRWYWx1ZXMoXG4gICAgICBwYXJhbXNEZW5zZVZhbHVlcywgcGFyYW1zRGVuc2VWYWx1ZXNTaGFwZSwgcGFyYW1zRGVuc2VWYWx1ZXNEVHlwZSxcbiAgICAgIHZhbHVlU2xpY2VzLCBudW1WYWx1ZXMpO1xuXG4gIHJldHVybiBbb3V0cHV0TmVzdGVkU3BsaXRzLCBvdXRwdXREZW5zZVZhbHVlc1swXSwgb3V0cHV0RGVuc2VWYWx1ZXNbMV1dO1xufVxuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, broadcastTo, reshape, tidy, util } from '@tensorflow/tfjs-core';\nvar RowPartitionType = backend_util.RowPartitionType;\n// Based on\n// https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/ragged_tensor_to_tensor_op.cc\nclass RaggedTensorToTensorOp {\n    constructor(shape, shapeShape, values, valuesShape, valuesDType, defaultValue, defaultValueShape, rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypeStrings) {\n        this.shape = shape;\n        this.shapeShape = shapeShape;\n        this.values = values;\n        this.valuesShape = valuesShape;\n        this.valuesDType = valuesDType;\n        this.defaultValue = defaultValue;\n        this.defaultValueShape = defaultValueShape;\n        this.rowPartitionValues = rowPartitionValues;\n        this.rowPartitionValuesShapes = rowPartitionValuesShapes;\n        this.rowPartitionTypes =\n            backend_util.getRowPartitionTypesHelper(rowPartitionTypeStrings);\n        this.raggedRank = backend_util.getRaggedRank(this.rowPartitionTypes);\n    }\n    getRowPartitionTypeByDimension(dimension) {\n        if (this.rowPartitionTypes[0] === RowPartitionType.FIRST_DIM_SIZE) {\n            return this.rowPartitionTypes[dimension + 1];\n        }\n        else {\n            return this.rowPartitionTypes[dimension];\n        }\n    }\n    // Returns the relationship between dimension and dimension + 1.\n    getRowPartitionTensor(dimension) {\n        if (this.rowPartitionTypes[0] === RowPartitionType.FIRST_DIM_SIZE) {\n            return this.rowPartitionValues[dimension + 1];\n        }\n        else {\n            return this.rowPartitionValues[dimension];\n        }\n    }\n    getMaxWidth(dimension) {\n        const rowPartitionTensor = this.getRowPartitionTensor(dimension - 1);\n        switch (this.getRowPartitionTypeByDimension(dimension - 1)) {\n            case RowPartitionType.VALUE_ROWIDS:\n                return RaggedTensorToTensorOp.getMaxWidthValueRowID(rowPartitionTensor);\n            case RowPartitionType.ROW_SPLITS:\n                return RaggedTensorToTensorOp.getMaxWidthRowSplit(rowPartitionTensor);\n            default:\n                throw new Error(`Cannot handle partition type ${RowPartitionType[this.getRowPartitionTypeByDimension(dimension - 1)]}`);\n        }\n    }\n    static getMaxWidthRowSplit(rowSplit) {\n        const tensorLength = rowSplit.length;\n        if (tensorLength === 0 || tensorLength === 1) {\n            return 0;\n        }\n        let maxWidth = 0;\n        for (let i = 0; i < tensorLength - 1; ++i) {\n            const currentWidth = rowSplit[i + 1] - rowSplit[i];\n            if (currentWidth > maxWidth) {\n                maxWidth = currentWidth;\n            }\n        }\n        return maxWidth;\n    }\n    static getMaxWidthValueRowID(valueRowIds) {\n        const indexLength = valueRowIds.length;\n        if (indexLength === 0) {\n            return 0;\n        }\n        let firstEqualIndex = 0;\n        let firstEqualIndexValue = valueRowIds[0];\n        let maxWidth = 0;\n        for (let i = 1; i < indexLength; ++i) {\n            const value = valueRowIds[i];\n            if (value !== firstEqualIndexValue) {\n                firstEqualIndexValue = value;\n                maxWidth = Math.max(i - firstEqualIndex, maxWidth);\n                firstEqualIndex = i;\n            }\n        }\n        return Math.max(indexLength - firstEqualIndex, maxWidth);\n    }\n    tensorShapeFromTensor(t, tShape, isPartial = true) {\n        if (tShape.length === 0) {\n            if (t[0] === -1) {\n                return [];\n            }\n            throw new Error(`The only valid scalar shape tensor is the fully unknown shape specified as -1.`);\n        }\n        // MakePartialShape/MakeShapeHelper.\n        return makeShape(t, isPartial);\n    }\n    calculateOutputSize(firstDim) {\n        const valueShape = this.valuesShape;\n        const defaultValueShape = this.defaultValueShape;\n        backend_util.validateDefaultValueShape(defaultValueShape, valueShape);\n        const shape = this.tensorShapeFromTensor(this.shape, this.shapeShape);\n        const outputShape = backend_util.combineRaggedTensorToTensorShapes(this.raggedRank, shape, valueShape);\n        const result = outputShape;\n        if (result[0] < 0) {\n            result[0] = firstDim;\n        }\n        for (let i = 1; i <= this.raggedRank; ++i) {\n            if (result[i] < 0) {\n                result[i] = this.getMaxWidth(i);\n            }\n        }\n        return result;\n    }\n    /**\n     * The outputIndex represents the index in the output tensor\n     * where the first element of a particular dimension would be written.\n     * If it is -1, it indicates that the index is out of scope.\n     * Example, given firstDimension = 10, firstDimensionOutput = 6,\n     * and outputIndexMultiplier = 100:\n     * result = [0 100 200 300 400 500 -1 -1 -1 -1]\n     * If firstDimensionOutput = 11 instead, then:\n     * result = [0 100 200 300 400 500 600 700 800 900]\n     */\n    calculateFirstParentOutputIndex(firstDimension, outputIndexMultiplier, firstDimensionOutput) {\n        const minDimension = Math.min(firstDimension, firstDimensionOutput);\n        const result = [];\n        let currentOutputIndex = 0;\n        for (let i = 0; i < minDimension; ++i, currentOutputIndex += outputIndexMultiplier) {\n            result.push(currentOutputIndex);\n        }\n        for (let i = minDimension; i < firstDimension; ++i) {\n            result.push(-1);\n        }\n        util.assert(result.length === firstDimension, () => 'Final length of result must be equal to firstDimension.');\n        return result;\n    }\n    calculateOutputIndexRowSplit(rowSplit, parentOutputIndex, outputIndexMultiplier, outputSize) {\n        const rowSplitSize = rowSplit.length;\n        const result = [];\n        for (let i = 0; i < rowSplitSize - 1; ++i) {\n            const rowLength = rowSplit[i + 1] - rowSplit[i];\n            let realLength = Math.min(outputSize, rowLength);\n            let parentOutputIndexCurrent = parentOutputIndex[i];\n            if (parentOutputIndexCurrent === -1) {\n                realLength = 0;\n            }\n            for (let j = 0; j < realLength; ++j) {\n                result.push(parentOutputIndexCurrent);\n                parentOutputIndexCurrent += outputIndexMultiplier;\n            }\n            for (let j = 0; j < rowLength - realLength; ++j) {\n                result.push(-1);\n            }\n        }\n        if (rowSplitSize > 0 && result.length !== rowSplit[rowSplitSize - 1]) {\n            throw new Error('Invalid row split size.');\n        }\n        return result;\n    }\n    // Calculate the output index of the first element of a list.\n    // The parentOutputIndex is the same computation for the previous list.\n    // -1 indicates an element or list that is out of range.\n    // The outputIndexMultiplier is the number of output indices one moves\n    // forward for each column.\n    // E.g., given:\n    // valueRowIds:[0 1 2 2 2 3 5 5 6]\n    // parentOutputIndex:[1000 1100 2000 2100 -1 3000 4000]\n    // outputIndexMultiplier: 10\n    // outputSize: 2\n    // You get:\n    // result = [1000 1100 2000 2010 -1 2100 -1 -1 3000]\n    // result[0] = parentOutputIndex[valueRowIds[0]]\n    // result[1] = parentOutputIndex[valueRowIds[1]]\n    // result[2] = parentOutputIndex[valueRowIds[2]]\n    // result[3] = parentOutputIndex[valueRowIds[2] + 10]\n    // result[4] = -1 because it is the third element the size is 2.\n    // result[5] = parentOutputIndex[valueRowIds[3]]\n    // result[6] = -1 because parentOutputIndex[valueRowIds[6]] == -1\n    // result[7] = -1 because parentOutputIndex[valueRowIds[6]] == -1\n    // result[8] = parentOutputIndex[valueRowIds[7]]\n    calculateOutputIndexValueRowID(valueRowIds, parentOutputIndex, outputIndexMultiplier, outputSize) {\n        const indexSize = valueRowIds.length;\n        const result = [];\n        if (indexSize === 0) {\n            return [];\n        }\n        let currentOutputColumn = 0;\n        let currentValueRowId = valueRowIds[0];\n        if (currentValueRowId >= parentOutputIndex.length) {\n            throw new Error(`Got currentValueRowId=${currentValueRowId}, which is not less than ${parentOutputIndex.length}`);\n        }\n        let currentOutputIndex = parentOutputIndex[currentValueRowId];\n        result.push(currentOutputIndex);\n        for (let i = 1; i < indexSize; ++i) {\n            const nextValueRowId = valueRowIds[i];\n            if (nextValueRowId === currentValueRowId) {\n                if (currentOutputIndex >= 0) {\n                    ++currentOutputColumn;\n                    if (currentOutputColumn < outputSize) {\n                        currentOutputIndex += outputIndexMultiplier;\n                    }\n                    else {\n                        currentOutputIndex = -1;\n                    }\n                }\n            }\n            else {\n                currentOutputColumn = 0;\n                currentValueRowId = nextValueRowId;\n                if (nextValueRowId >= parentOutputIndex.length) {\n                    throw new Error(`Got nextValueRowId=${nextValueRowId} which is not less than ${parentOutputIndex.length}`);\n                }\n                currentOutputIndex = parentOutputIndex[nextValueRowId];\n            }\n            result.push(currentOutputIndex);\n        }\n        if (result.length !== valueRowIds.length) {\n            throw new Error('Invalid row ids.');\n        }\n        return result;\n    }\n    calculateOutputIndex(dimension, parentOutputIndex, outputIndexMultiplier, outputSize) {\n        const rowPartitionTensor = this.getRowPartitionTensor(dimension);\n        const partitionType = this.getRowPartitionTypeByDimension(dimension);\n        switch (partitionType) {\n            case RowPartitionType.VALUE_ROWIDS:\n                return this.calculateOutputIndexValueRowID(rowPartitionTensor, parentOutputIndex, outputIndexMultiplier, outputSize);\n            case RowPartitionType.ROW_SPLITS:\n                if (rowPartitionTensor.length - 1 > parentOutputIndex.length) {\n                    throw new Error(`Row partition size is greater than output size: ${rowPartitionTensor.length - 1} > ${parentOutputIndex.length}`);\n                }\n                return this.calculateOutputIndexRowSplit(rowPartitionTensor, parentOutputIndex, outputIndexMultiplier, outputSize);\n            default:\n                throw new Error(`Unsupported partition type: ${RowPartitionType[partitionType]}`);\n        }\n    }\n    getFirstDimensionSize() {\n        const firstPartitionTensor = this.rowPartitionValues[0];\n        if (this.rowPartitionTypes.length === 0) {\n            throw new Error('No row_partition_types given.');\n        }\n        const firstPartitionType = this.rowPartitionTypes[0];\n        switch (firstPartitionType) {\n            case RowPartitionType.FIRST_DIM_SIZE:\n                return firstPartitionTensor[0];\n            case RowPartitionType.VALUE_ROWIDS:\n                throw new Error('Cannot handle VALUE_ROWIDS in first dimension.');\n            case RowPartitionType.ROW_SPLITS:\n                return this.rowPartitionValuesShapes[0][0] - 1;\n            default:\n                throw new Error(`Cannot handle type ${RowPartitionType[firstPartitionType]}`);\n        }\n    }\n    compute() {\n        const firstPartitionTensor = this.rowPartitionValues[0];\n        if (firstPartitionTensor.length <= 0) {\n            throw new Error('Invalid first partition input. ' +\n                'Tensor requires at least one element.');\n        }\n        const firstDimension = this.getFirstDimensionSize();\n        const outputSize = this.calculateOutputSize(firstDimension);\n        const multiplier = new Array(this.raggedRank + 1);\n        multiplier[multiplier.length - 1] = 1;\n        for (let i = multiplier.length - 2; i >= 0; --i) {\n            multiplier[i] = multiplier[i + 1] * outputSize[i + 1];\n        }\n        // Full size of the tensor.\n        const outputShape = makeShape(outputSize, false);\n        const outputTensor = util.getArrayFromDType(this.valuesDType, util.sizeFromShape(outputShape));\n        const fullSize = multiplier[0] * outputSize[0];\n        if (fullSize > 0) {\n            let outputIndex = this.calculateFirstParentOutputIndex(firstDimension, multiplier[0], outputSize[0]);\n            for (let i = 1; i <= this.raggedRank; ++i) {\n                const newOutputIndex = this.calculateOutputIndex(i - 1, outputIndex, multiplier[i], outputSize[i]);\n                outputIndex = newOutputIndex;\n            }\n            this.setOutput(this.raggedRank, outputIndex, outputTensor, outputShape);\n        }\n        return [outputShape, outputTensor];\n    }\n    setOutput(raggedRank, outputIndex, outputTensor, outputShape) {\n        if (outputTensor.length === 0) {\n            return;\n        }\n        const valuesBase = this.values;\n        const outputBase = outputTensor;\n        let elementShape = outputShape.slice();\n        elementShape = elementShape.slice(raggedRank + 1);\n        const valueElementSize = util.sizeFromShape(elementShape);\n        const outputIndexSize = outputIndex.length;\n        // Broadcast the default value to value_element_size.  (We can skip this\n        // if defaultValueTensor.size == 1, since we use fill when that's true.)\n        let defaultValue = this.defaultValue;\n        if (defaultValue.length !== valueElementSize && defaultValue.length !== 1) {\n            const srcShape = this.defaultValueShape;\n            tidy(() => {\n                const defaultValueTensor = reshape(defaultValue, srcShape);\n                const bCastDefault = broadcastTo(defaultValueTensor, elementShape);\n                defaultValue = bCastDefault.dataSync();\n            });\n        }\n        // Loop through the outputIndex array, finding contiguous regions that\n        // should be copied.  Once we find the end of a contiguous region, copy it\n        // and add any necessary padding (with defaultValue).\n        let srcStart = 0; // Start of contiguous region (in values)\n        let dstStart = 0; // Destination for contiguous region (in output)\n        let dstEnd = 0; // Destination for contiguous region (in output)\n        for (let srcI = 0; srcI <= outputIndexSize; ++srcI) {\n            // dstI is the destination where the value at srcI should be copied.\n            let dstI = srcI < outputIndexSize ? outputIndex[srcI] : -1;\n            // If we're still in a contiguous region, then update dstEnd go to the\n            // next srcI.\n            if (dstI === dstEnd) {\n                ++dstEnd;\n                continue;\n            }\n            // We found the end of contiguous region.  This can be because we found\n            // a gap (dstI > dstEnd), or a source value that shouldn't be copied\n            // because it's out-of-bounds (dstI == -1), or the end of the tensor\n            // (dstI === -1).\n            if (dstStart < dstEnd) {\n                // Copy the contiguous region.\n                const src = valuesBase.subarray(srcStart * valueElementSize);\n                const dst = outputBase.subarray(dstStart * valueElementSize);\n                const nVals = (dstEnd - dstStart) * valueElementSize;\n                copyArray(dst, src, nVals);\n            }\n            // Add any necessary padding (w/ defaultValue).\n            if (srcI >= outputIndexSize) {\n                // We reached the end of values: pad to the end of output.\n                const outputSize = outputTensor.length;\n                dstI = Math.floor(outputSize / valueElementSize);\n            }\n            if (dstI > dstEnd) {\n                if (this.defaultValue.length === 1) {\n                    outputBase\n                        .subarray(dstEnd * valueElementSize, dstI * valueElementSize)\n                        .fill(this.defaultValue[0]);\n                    dstEnd = dstI;\n                }\n                else {\n                    while (dstI > dstEnd) {\n                        const dst = outputBase.slice(dstEnd * valueElementSize);\n                        copyArray(dst, defaultValue, valueElementSize);\n                        ++dstEnd;\n                    }\n                }\n            }\n            // Update indices.\n            if (dstI < 0) {\n                // srcI should be skipped -- leave it out of the contiguous region.\n                srcStart = srcI + 1;\n                dstStart = dstEnd;\n            }\n            else {\n                // srcI should be copied -- include it in the contiguous region.\n                srcStart = srcI;\n                dstStart = dstEnd;\n                dstEnd = dstStart + 1;\n            }\n        }\n    }\n}\nfunction copyArray(dst, src, size) {\n    for (let i = 0; i < size; i++) {\n        dst[i] = src[i];\n    }\n}\nfunction makeShape(shape, isPartial) {\n    const out = [];\n    for (let dim of shape) {\n        if (dim < 0) {\n            if (!isPartial) {\n                throw new Error(`Dimension ${dim} must be >= 0`);\n            }\n            if (dim < -1) {\n                throw new Error(`Dimension ${dim} must be >= -1`);\n            }\n            dim = -1;\n        }\n        out.push(dim);\n    }\n    return out;\n}\nexport function raggedTensorToTensorImpl(shape, shapesShape, values, valuesShape, valuesDType, defaultValue, defaultValueShape, rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypes) {\n    return new RaggedTensorToTensorOp(shape, shapesShape, values, valuesShape, valuesDType, defaultValue, defaultValueShape, rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypes)\n        .compute();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkVGVuc29yVG9UZW5zb3JfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmFnZ2VkVGVuc29yVG9UZW5zb3JfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBWSxPQUFPLEVBQUUsSUFBSSxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTNHLElBQU8sZ0JBQWdCLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDO0FBQ3hELFdBQVc7QUFDWCw2R0FBNkc7QUFDN0csTUFBTSxzQkFBc0I7SUFHMUIsWUFDWSxLQUFpQixFQUFVLFVBQW9CLEVBQy9DLE1BQWtCLEVBQVUsV0FBcUIsRUFDakQsV0FBcUIsRUFBVSxZQUF3QixFQUN2RCxpQkFBMkIsRUFDbEIsa0JBQWdDLEVBQ2hDLHdCQUFvQyxFQUNyRCx1QkFBaUM7UUFOekIsVUFBSyxHQUFMLEtBQUssQ0FBWTtRQUFVLGVBQVUsR0FBVixVQUFVLENBQVU7UUFDL0MsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUFVLGdCQUFXLEdBQVgsV0FBVyxDQUFVO1FBQ2pELGdCQUFXLEdBQVgsV0FBVyxDQUFVO1FBQVUsaUJBQVksR0FBWixZQUFZLENBQVk7UUFDdkQsc0JBQWlCLEdBQWpCLGlCQUFpQixDQUFVO1FBQ2xCLHVCQUFrQixHQUFsQixrQkFBa0IsQ0FBYztRQUNoQyw2QkFBd0IsR0FBeEIsd0JBQXdCLENBQVk7UUFFdkQsSUFBSSxDQUFDLGlCQUFpQjtZQUNsQixZQUFZLENBQUMsMEJBQTBCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7SUFDdkUsQ0FBQztJ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QUVELE1BQU0sVUFBVSx3QkFBd0IsQ0FDcEMsS0FBaUIsRUFBRSxXQUFxQixFQUFFLE1BQWtCLEVBQzVELFdBQXFCLEVBQUUsV0FBcUIsRUFBRSxZQUF3QixFQUN0RSxpQkFBMkIsRUFBRSxrQkFBZ0MsRUFDN0Qsd0JBQW9DLEVBQ3BDLGlCQUEyQjtJQUM3QixPQUFPLElBQUksc0JBQXNCLENBQ3RCLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUNsRSxpQkFBaUIsRUFBRSxrQkFBa0IsRUFBRSx3QkFBd0IsRUFDL0QsaUJBQWlCLENBQUM7U0FDeEIsT0FBTyxFQUFFLENBQUM7QUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGJyb2FkY2FzdFRvLCBEYXRhVHlwZSwgcmVzaGFwZSwgdGlkeSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IFJvd1BhcnRpdGlvblR5cGUgPSBiYWNrZW5kX3V0aWwuUm93UGFydGl0aW9uVHlwZTtcbi8vIEJhc2VkIG9uXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvbWFzdGVyL3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL3JhZ2dlZF90ZW5zb3JfdG9fdGVuc29yX29wLmNjXG5jbGFzcyBSYWdnZWRUZW5zb3JUb1RlbnNvck9wIHtcbiAgcHJpdmF0ZSByZWFkb25seSByb3dQYXJ0aXRpb25UeXBlczogUm93UGFydGl0aW9uVHlwZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IHJhZ2dlZFJhbms6IG51bWJlcjtcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHNoYXBlOiBUeXBlZEFycmF5LCBwcml2YXRlIHNoYXBlU2hhcGU6IG51bWJlcltdLFxuICAgICAgcHJpdmF0ZSB2YWx1ZXM6IFR5cGVkQXJyYXksIHByaXZhdGUgdmFsdWVzU2hhcGU6IG51bWJlcltdLFxuICAgICAgcHJpdmF0ZSB2YWx1ZXNEVHlwZTogRGF0YVR5cGUsIHByaXZhdGUgZGVmYXVsdFZhbHVlOiBUeXBlZEFycmF5LFxuICAgICAgcHJpdmF0ZSBkZWZhdWx0VmFsdWVTaGFwZTogbnVtYmVyW10sXG4gICAgICBwcml2YXRlIHJlYWRvbmx5IHJvd1BhcnRpdGlvblZhbHVlczogVHlwZWRBcnJheVtdLFxuICAgICAgcHJpdmF0ZSByZWFkb25seSByb3dQYXJ0aXRpb25WYWx1ZXNTaGFwZXM6IG51bWJlcltdW10sXG4gICAgICByb3dQYXJ0aXRpb25UeXBlU3RyaW5nczogc3RyaW5nW10pIHtcbiAgICB0aGlzLnJvd1BhcnRpdGlvblR5cGVzID1cbiAgICAgICAgYmFja2VuZF91dGlsLmdldFJvd1BhcnRpdGlvblR5cGVzSGVscGVyKHJvd1BhcnRpdGlvblR5cGVTdHJpbmdzKTtcbiAgICB0aGlzLnJhZ2dlZFJhbmsgPSBiYWNrZW5kX3V0aWwuZ2V0UmFnZ2VkUmFuayh0aGlzLnJvd1BhcnRpdGlvblR5cGVzKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Um93UGFydGl0aW9uVHlwZUJ5RGltZW5zaW9uKGRpbWVuc2lvbjogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMucm93UGFydGl0aW9uVHlwZXNbMF0gPT09IFJvd1BhcnRpdGlvblR5cGUuRklSU1RfRElNX1NJWkUpIHtcbiAgICAgIHJldHVybiB0aGlzLnJvd1BhcnRpdGlvblR5cGVzW2RpbWVuc2lvbiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3dQYXJ0aXRpb25UeXBlc1tkaW1lbnNpb25dO1xuICAgIH1cbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGRpbWVuc2lvbiBhbmQgZGltZW5zaW9uICsgMS5cbiAgcHJpdmF0ZSBnZXRSb3dQYXJ0aXRpb25UZW5zb3IoZGltZW5zaW9uOiBudW1iZXIpIHtcbiAgICBpZiAodGhpcy5yb3dQYXJ0aXRpb25UeXBlc1swXSA9PT0gUm93UGFydGl0aW9uVHlwZS5GSVJTVF9ESU1fU0laRSkge1xuICAgICAgcmV0dXJuIHRoaXMucm93UGFydGl0aW9uVmFsdWVzW2RpbWVuc2lvbiArIDFdO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gdGhpcy5yb3dQYXJ0aXRpb25WYWx1ZXNbZGltZW5zaW9uXTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE1heFdpZHRoKGRpbWVuc2lvbjogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93UGFydGl0aW9uVGVuc29yID0gdGhpcy5nZXRSb3dQYXJ0aXRpb25UZW5zb3IoZGltZW5zaW9uIC0gMSk7XG4gICAgc3dpdGNoICh0aGlzLmdldFJvd1BhcnRpdGlvblR5cGVCeURpbWVuc2lvbihkaW1lbnNpb24gLSAxKSkge1xuICAgICAgY2FzZSBSb3dQYXJ0aXRpb25UeXBlLlZBTFVFX1JPV0lEUzpcbiAgICAgICAgcmV0dXJuIFJhZ2dlZFRlbnNvclRvVGVuc29yT3AuZ2V0TWF4V2lkdGhWYWx1ZVJvd0lEKHJvd1BhcnRpdGlvblRlbnNvcik7XG4gICAgICBjYXNlIFJvd1BhcnRpdGlvblR5cGUuUk9XX1NQTElUUzpcbiAgICAgICAgcmV0dXJuIFJhZ2dlZFRlbnNvclRvVGVuc29yT3AuZ2V0TWF4V2lkdGhSb3dTcGxpdChyb3dQYXJ0aXRpb25UZW5zb3IpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgaGFuZGxlIHBhcnRpdGlvbiB0eXBlICR7XG4gICAgICAgICAgICBSb3dQYXJ0aXRpb25UeXBlW3RoaXMuZ2V0Um93UGFydGl0aW9uVHlwZUJ5RGltZW5zaW9uKFxuICAgICAgICAgICAgICAgIGRpbWVuc2lvbiAtIDEpXX1gKTtcbiAgICB9XG4gIH1cblxuICBzdGF0aWMgZ2V0TWF4V2lkdGhSb3dTcGxpdChyb3dTcGxpdDogVHlwZWRBcnJheSkge1xuICAgIGNvbnN0IHRlbnNvckxlbmd0aCA9IHJvd1NwbGl0Lmxlbmd0aDtcbiAgICBpZiAodGVuc29yTGVuZ3RoID09PSAwIHx8IHRlbnNvckxlbmd0aCA9PT0gMSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGxldCBtYXhXaWR0aCA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZW5zb3JMZW5ndGggLSAxOyArK2kpIHtcbiAgICAgIGNvbnN0IGN1cnJlbnRXaWR0aCA9IHJvd1NwbGl0W2kgKyAxXSAtIHJvd1NwbGl0W2ldO1xuICAgICAgaWYgKGN1cnJlbnRXaWR0aCA+IG1heFdpZHRoKSB7XG4gICAgICAgIG1heFdpZHRoID0gY3VycmVudFdpZHRoO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbWF4V2lkdGg7XG4gIH1cblxuICBzdGF0aWMgZ2V0TWF4V2lkdGhWYWx1ZVJvd0lEKHZhbHVlUm93SWRzOiBUeXBlZEFycmF5KSB7XG4gICAgY29uc3QgaW5kZXhMZW5ndGggPSB2YWx1ZVJvd0lkcy5sZW5ndGg7XG4gICAgaWYgKGluZGV4TGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgbGV0IGZpcnN0RXF1YWxJbmRleCA9IDA7XG4gICAgbGV0IGZpcnN0RXF1YWxJbmRleFZhbHVlID0gdmFsdWVSb3dJZHNbMF07XG4gICAgbGV0IG1heFdpZHRoID0gMDtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGluZGV4TGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVSb3dJZHNbaV07XG4gICAgICBpZiAodmFsdWUgIT09IGZpcnN0RXF1YWxJbmRleFZhbHVlKSB7XG4gICAgICAgIGZpcnN0RXF1YWxJbmRleFZhbHVlID0gdmFsdWU7XG4gICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgoaSAtIGZpcnN0RXF1YWxJbmRleCwgbWF4V2lkdGgpO1xuICAgICAgICBmaXJzdEVxdWFsSW5kZXggPSBpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gTWF0aC5tYXgoaW5kZXhMZW5ndGggLSBmaXJzdEVxdWFsSW5kZXgsIG1heFdpZHRoKTtcbiAgfVxuXG4gIHByaXZhdGUgdGVuc29yU2hhcGVGcm9tVGVuc29yKFxuICAgICAgdDogVHlwZWRBcnJheSwgdFNoYXBlOiBudW1iZXJbXSwgaXNQYXJ0aWFsID0gdHJ1ZSkge1xuICAgIGlmICh0U2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAodFswXSA9PT0gLTEpIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBUaGUgb25seSB2YWxpZCBzY2FsYXIgc2hhcGUgdGVuc29yIGlzIHRoZSBmdWxseSB1bmtub3duIHNoYXBlIHNwZWNpZmllZCBhcyAtMS5gKTtcbiAgICB9XG4gICAgLy8gTWFrZVBhcnRpYWxTaGFwZS9NYWtlU2hhcGVIZWxwZXIuXG4gICAgcmV0dXJuIG1ha2VTaGFwZSh0LCBpc1BhcnRpYWwpO1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVPdXRwdXRTaXplKGZpcnN0RGltOiBudW1iZXIpIHtcbiAgICBjb25zdCB2YWx1ZVNoYXBlID0gdGhpcy52YWx1ZXNTaGFwZTtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWVTaGFwZSA9IHRoaXMuZGVmYXVsdFZhbHVlU2hhcGU7XG5cbiAgICBiYWNrZW5kX3V0aWwudmFsaWRhdGVEZWZhdWx0VmFsdWVTaGFwZShkZWZhdWx0VmFsdWVTaGFwZSwgdmFsdWVTaGFwZSk7XG5cbiAgICBjb25zdCBzaGFwZSA9IHRoaXMudGVuc29yU2hhcGVGcm9tVGVuc29yKHRoaXMuc2hhcGUsIHRoaXMuc2hhcGVTaGFwZSk7XG4gICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tYmluZVJhZ2dlZFRlbnNvclRvVGVuc29yU2hhcGVzKFxuICAgICAgICB0aGlzLnJhZ2dlZFJhbmssIHNoYXBlLCB2YWx1ZVNoYXBlKTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG91dHB1dFNoYXBlO1xuXG4gICAgaWYgKHJlc3VsdFswXSA8IDApIHtcbiAgICAgIHJlc3VsdFswXSA9IGZpcnN0RGltO1xuICAgIH1cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSB0aGlzLnJhZ2dlZFJhbms7ICsraSkge1xuICAgICAgaWYgKHJlc3VsdFtpXSA8IDApIHtcbiAgICAgICAgcmVzdWx0W2ldID0gdGhpcy5nZXRNYXhXaWR0aChpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLyoqXG4gICAqIFRoZSBvdXRwdXRJbmRleCByZXByZXNlbnRzIHRoZSBpbmRleCBpbiB0aGUgb3V0cHV0IHRlbnNvclxuICAgKiB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBvZiBhIHBhcnRpY3VsYXIgZGltZW5zaW9uIHdvdWxkIGJlIHdyaXR0ZW4uXG4gICAqIElmIGl0IGlzIC0xLCBpdCBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5kZXggaXMgb3V0IG9mIHNjb3BlLlxuICAgKiBFeGFtcGxlLCBnaXZlbiBmaXJzdERpbWVuc2lvbiA9IDEwLCBmaXJzdERpbWVuc2lvbk91dHB1dCA9IDYsXG4gICAqIGFuZCBvdXRwdXRJbmRleE11bHRpcGxpZXIgPSAxMDA6XG4gICAqIHJlc3VsdCA9IFswIDEwMCAyMDAgMzAwIDQwMCA1MDAgLTEgLTEgLTEgLTFdXG4gICAqIElmIGZpcnN0RGltZW5zaW9uT3V0cHV0ID0gMTEgaW5zdGVhZCwgdGhlbjpcbiAgICogcmVzdWx0ID0gWzAgMTAwIDIwMCAzMDAgNDAwIDUwMCA2MDAgNzAwIDgwMCA5MDBdXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUZpcnN0UGFyZW50T3V0cHV0SW5kZXgoXG4gICAgICBmaXJzdERpbWVuc2lvbjogbnVtYmVyLCBvdXRwdXRJbmRleE11bHRpcGxpZXI6IG51bWJlcixcbiAgICAgIGZpcnN0RGltZW5zaW9uT3V0cHV0OiBudW1iZXIpIHtcbiAgICBjb25zdCBtaW5EaW1lbnNpb24gPSBNYXRoLm1pbihmaXJzdERpbWVuc2lvbiwgZmlyc3REaW1lbnNpb25PdXRwdXQpO1xuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICBsZXQgY3VycmVudE91dHB1dEluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1pbkRpbWVuc2lvbjtcbiAgICAgICAgICsraSwgY3VycmVudE91dHB1dEluZGV4ICs9IG91dHB1dEluZGV4TXVsdGlwbGllcikge1xuICAgICAgcmVzdWx0LnB1c2goY3VycmVudE91dHB1dEluZGV4KTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IG1pbkRpbWVuc2lvbjsgaSA8IGZpcnN0RGltZW5zaW9uOyArK2kpIHtcbiAgICAgIHJlc3VsdC5wdXNoKC0xKTtcbiAgICB9XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHJlc3VsdC5sZW5ndGggPT09IGZpcnN0RGltZW5zaW9uLFxuICAgICAgICAoKSA9PiAnRmluYWwgbGVuZ3RoIG9mIHJlc3VsdCBtdXN0IGJlIGVxdWFsIHRvIGZpcnN0RGltZW5zaW9uLicpO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgY2FsY3VsYXRlT3V0cHV0SW5kZXhSb3dTcGxpdChcbiAgICAgIHJvd1NwbGl0OiBUeXBlZEFycmF5LCBwYXJlbnRPdXRwdXRJbmRleDogbnVtYmVyW10sXG4gICAgICBvdXRwdXRJbmRleE11bHRpcGxpZXI6IG51bWJlciwgb3V0cHV0U2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93U3BsaXRTaXplID0gcm93U3BsaXQubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd1NwbGl0U2l6ZSAtIDE7ICsraSkge1xuICAgICAgY29uc3Qgcm93TGVuZ3RoID0gcm93U3BsaXRbaSArIDFdIC0gcm93U3BsaXRbaV07XG4gICAgICBsZXQgcmVhbExlbmd0aCA9IE1hdGgubWluKG91dHB1dFNpemUsIHJvd0xlbmd0aCk7XG4gICAgICBsZXQgcGFyZW50T3V0cHV0SW5kZXhDdXJyZW50ID0gcGFyZW50T3V0cHV0SW5kZXhbaV07XG5cbiAgICAgIGlmIChwYXJlbnRPdXRwdXRJbmRleEN1cnJlbnQgPT09IC0xKSB7XG4gICAgICAgIHJlYWxMZW5ndGggPSAwO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWFsTGVuZ3RoOyArK2opIHtcbiAgICAgICAgcmVzdWx0LnB1c2gocGFyZW50T3V0cHV0SW5kZXhDdXJyZW50KTtcbiAgICAgICAgcGFyZW50T3V0cHV0SW5kZXhDdXJyZW50ICs9IG91dHB1dEluZGV4TXVsdGlwbGllcjtcbiAgICAgIH1cbiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcm93TGVuZ3RoIC0gcmVhbExlbmd0aDsgKytqKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKC0xKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHJvd1NwbGl0U2l6ZSA+IDAgJiYgcmVzdWx0Lmxlbmd0aCAhPT0gcm93U3BsaXRbcm93U3BsaXRTaXplIC0gMV0pIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByb3cgc3BsaXQgc2l6ZS4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBvdXRwdXQgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYSBsaXN0LlxuICAvLyBUaGUgcGFyZW50T3V0cHV0SW5kZXggaXMgdGhlIHNhbWUgY29tcHV0YXRpb24gZm9yIHRoZSBwcmV2aW91cyBsaXN0LlxuICAvLyAtMSBpbmRpY2F0ZXMgYW4gZWxlbWVudCBvciBsaXN0IHRoYXQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyBUaGUgb3V0cHV0SW5kZXhNdWx0aXBsaWVyIGlzIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGluZGljZXMgb25lIG1vdmVzXG4gIC8vIGZvcndhcmQgZm9yIGVhY2ggY29sdW1uLlxuICAvLyBFLmcuLCBnaXZlbjpcbiAgLy8gdmFsdWVSb3dJZHM6WzAgMSAyIDIgMiAzIDUgNSA2XVxuICAvLyBwYXJlbnRPdXRwdXRJbmRleDpbMTAwMCAxMTAwIDIwMDAgMjEwMCAtMSAzMDAwIDQwMDBdXG4gIC8vIG91dHB1dEluZGV4TXVsdGlwbGllcjogMTBcbiAgLy8gb3V0cHV0U2l6ZTogMlxuICAvLyBZb3UgZ2V0OlxuICAvLyByZXN1bHQgPSBbMTAwMCAxMTAwIDIwMDAgMjAxMCAtMSAyMTAwIC0xIC0xIDMwMDBdXG4gIC8vIHJlc3VsdFswXSA9IHBhcmVudE91dHB1dEluZGV4W3ZhbHVlUm93SWRzWzBdXVxuICAvLyByZXN1bHRbMV0gPSBwYXJlbnRPdXRwdXRJbmRleFt2YWx1ZVJvd0lkc1sxXV1cbiAgLy8gcmVzdWx0WzJdID0gcGFyZW50T3V0cHV0SW5kZXhbdmFsdWVSb3dJZHNbMl1dXG4gIC8vIHJlc3VsdFszXSA9IHBhcmVudE91dHB1dEluZGV4W3ZhbHVlUm93SWRzWzJdICsgMTBdXG4gIC8vIHJlc3VsdFs0XSA9IC0xIGJlY2F1c2UgaXQgaXMgdGhlIHRoaXJkIGVsZW1lbnQgdGhlIHNpemUgaXMgMi5cbiAgLy8gcmVzdWx0WzVdID0gcGFyZW50T3V0cHV0SW5kZXhbdmFsdWVSb3dJZHNbM11dXG4gIC8vIHJlc3VsdFs2XSA9IC0xIGJlY2F1c2UgcGFyZW50T3V0cHV0SW5kZXhbdmFsdWVSb3dJZHNbNl1dID09IC0xXG4gIC8vIHJlc3VsdFs3XSA9IC0xIGJlY2F1c2UgcGFyZW50T3V0cHV0SW5kZXhbdmFsdWVSb3dJZHNbNl1dID09IC0xXG4gIC8vIHJlc3VsdFs4XSA9IHBhcmVudE91dHB1dEluZGV4W3ZhbHVlUm93SWRzWzddXVxuICBwcml2YXRlIGNhbGN1bGF0ZU91dHB1dEluZGV4VmFsdWVSb3dJRChcbiAgICAgIHZhbHVlUm93SWRzOiBUeXBlZEFycmF5LCBwYXJlbnRPdXRwdXRJbmRleDogbnVtYmVyW10sXG4gICAgICBvdXRwdXRJbmRleE11bHRpcGxpZXI6IG51bWJlciwgb3V0cHV0U2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3QgaW5kZXhTaXplID0gdmFsdWVSb3dJZHMubGVuZ3RoO1xuICAgIGNvbnN0IHJlc3VsdDogbnVtYmVyW10gPSBbXTtcbiAgICBpZiAoaW5kZXhTaXplID09PSAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnRPdXRwdXRDb2x1bW4gPSAwO1xuICAgIGxldCBjdXJyZW50VmFsdWVSb3dJZCA9IHZhbHVlUm93SWRzWzBdO1xuXG4gICAgaWYgKGN1cnJlbnRWYWx1ZVJvd0lkID49IHBhcmVudE91dHB1dEluZGV4Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBHb3QgY3VycmVudFZhbHVlUm93SWQ9JHtjdXJyZW50VmFsdWVSb3dJZH0sIHdoaWNoIGlzIG5vdCBsZXNzIHRoYW4gJHtcbiAgICAgICAgICAgICAgcGFyZW50T3V0cHV0SW5kZXgubGVuZ3RofWApO1xuICAgIH1cblxuICAgIGxldCBjdXJyZW50T3V0cHV0SW5kZXggPSBwYXJlbnRPdXRwdXRJbmRleFtjdXJyZW50VmFsdWVSb3dJZF07XG4gICAgcmVzdWx0LnB1c2goY3VycmVudE91dHB1dEluZGV4KTtcbiAgICBmb3IgKGxldCBpID0gMTsgaSA8IGluZGV4U2l6ZTsgKytpKSB7XG4gICAgICBjb25zdCBuZXh0VmFsdWVSb3dJZCA9IHZhbHVlUm93SWRzW2ldO1xuICAgICAgaWYgKG5leHRWYWx1ZVJvd0lkID09PSBjdXJyZW50VmFsdWVSb3dJZCkge1xuICAgICAgICBpZiAoY3VycmVudE91dHB1dEluZGV4ID49IDApIHtcbiAgICAgICAgICArK2N1cnJlbnRPdXRwdXRDb2x1bW47XG4gICAgICAgICAgaWYgKGN1cnJlbnRPdXRwdXRDb2x1bW4gPCBvdXRwdXRTaXplKSB7XG4gICAgICAgICAgICBjdXJyZW50T3V0cHV0SW5kZXggKz0gb3V0cHV0SW5kZXhNdWx0aXBsaWVyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjdXJyZW50T3V0cHV0SW5kZXggPSAtMTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGN1cnJlbnRPdXRwdXRDb2x1bW4gPSAwO1xuICAgICAgICBjdXJyZW50VmFsdWVSb3dJZCA9IG5leHRWYWx1ZVJvd0lkO1xuXG4gICAgICAgIGlmIChuZXh0VmFsdWVSb3dJZCA+PSBwYXJlbnRPdXRwdXRJbmRleC5sZW5ndGgpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgIGBHb3QgbmV4dFZhbHVlUm93SWQ9JHtuZXh0VmFsdWVSb3dJZH0gd2hpY2ggaXMgbm90IGxlc3MgdGhhbiAke1xuICAgICAgICAgICAgICAgICAgcGFyZW50T3V0cHV0SW5kZXgubGVuZ3RofWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY3VycmVudE91dHB1dEluZGV4ID0gcGFyZW50T3V0cHV0SW5kZXhbbmV4dFZhbHVlUm93SWRdO1xuICAgICAgfVxuICAgICAgcmVzdWx0LnB1c2goY3VycmVudE91dHB1dEluZGV4KTtcbiAgICB9XG5cbiAgICBpZiAocmVzdWx0Lmxlbmd0aCAhPT0gdmFsdWVSb3dJZHMubGVuZ3RoKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgcm93IGlkcy4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHJpdmF0ZSBjYWxjdWxhdGVPdXRwdXRJbmRleChcbiAgICAgIGRpbWVuc2lvbjogbnVtYmVyLCBwYXJlbnRPdXRwdXRJbmRleDogbnVtYmVyW10sXG4gICAgICBvdXRwdXRJbmRleE11bHRpcGxpZXI6IG51bWJlciwgb3V0cHV0U2l6ZTogbnVtYmVyKSB7XG4gICAgY29uc3Qgcm93UGFydGl0aW9uVGVuc29yID0gdGhpcy5nZXRSb3dQYXJ0aXRpb25UZW5zb3IoZGltZW5zaW9uKTtcbiAgICBjb25zdCBwYXJ0aXRpb25UeXBlID0gdGhpcy5nZXRSb3dQYXJ0aXRpb25UeXBlQnlEaW1lbnNpb24oZGltZW5zaW9uKTtcbiAgICBzd2l0Y2ggKHBhcnRpdGlvblR5cGUpIHtcbiAgICAgIGNhc2UgUm93UGFydGl0aW9uVHlwZS5WQUxVRV9ST1dJRFM6XG4gICAgICAgIHJldHVybiB0aGlzLmNhbGN1bGF0ZU91dHB1dEluZGV4VmFsdWVSb3dJRChcbiAgICAgICAgICAgIHJvd1BhcnRpdGlvblRlbnNvciwgcGFyZW50T3V0cHV0SW5kZXgsIG91dHB1dEluZGV4TXVsdGlwbGllcixcbiAgICAgICAgICAgIG91dHB1dFNpemUpO1xuICAgICAgY2FzZSBSb3dQYXJ0aXRpb25UeXBlLlJPV19TUExJVFM6XG4gICAgICAgIGlmIChyb3dQYXJ0aXRpb25UZW5zb3IubGVuZ3RoIC0gMSA+IHBhcmVudE91dHB1dEluZGV4Lmxlbmd0aCkge1xuICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUm93IHBhcnRpdGlvbiBzaXplIGlzIGdyZWF0ZXIgdGhhbiBvdXRwdXQgc2l6ZTogJHtcbiAgICAgICAgICAgICAgcm93UGFydGl0aW9uVGVuc29yLmxlbmd0aCAtIDF9ID4gJHtwYXJlbnRPdXRwdXRJbmRleC5sZW5ndGh9YCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuY2FsY3VsYXRlT3V0cHV0SW5kZXhSb3dTcGxpdChcbiAgICAgICAgICAgIHJvd1BhcnRpdGlvblRlbnNvciwgcGFyZW50T3V0cHV0SW5kZXgsIG91dHB1dEluZGV4TXVsdGlwbGllcixcbiAgICAgICAgICAgIG91dHB1dFNpemUpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYFVuc3VwcG9ydGVkIHBhcnRpdGlvbiB0eXBlOiAke1Jvd1BhcnRpdGlvblR5cGVbcGFydGl0aW9uVHlwZV19YCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRGaXJzdERpbWVuc2lvblNpemUoKSB7XG4gICAgY29uc3QgZmlyc3RQYXJ0aXRpb25UZW5zb3IgPSB0aGlzLnJvd1BhcnRpdGlvblZhbHVlc1swXTtcbiAgICBpZiAodGhpcy5yb3dQYXJ0aXRpb25UeXBlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignTm8gcm93X3BhcnRpdGlvbl90eXBlcyBnaXZlbi4nKTtcbiAgICB9XG4gICAgY29uc3QgZmlyc3RQYXJ0aXRpb25UeXBlID0gdGhpcy5yb3dQYXJ0aXRpb25UeXBlc1swXTtcbiAgICBzd2l0Y2ggKGZpcnN0UGFydGl0aW9uVHlwZSkge1xuICAgICAgY2FzZSBSb3dQYXJ0aXRpb25UeXBlLkZJUlNUX0RJTV9TSVpFOlxuICAgICAgICByZXR1cm4gZmlyc3RQYXJ0aXRpb25UZW5zb3JbMF07XG4gICAgICBjYXNlIFJvd1BhcnRpdGlvblR5cGUuVkFMVUVfUk9XSURTOlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBoYW5kbGUgVkFMVUVfUk9XSURTIGluIGZpcnN0IGRpbWVuc2lvbi4nKTtcbiAgICAgIGNhc2UgUm93UGFydGl0aW9uVHlwZS5ST1dfU1BMSVRTOlxuICAgICAgICByZXR1cm4gdGhpcy5yb3dQYXJ0aXRpb25WYWx1ZXNTaGFwZXNbMF1bMF0gLSAxO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBoYW5kbGUgdHlwZSAke1Jvd1BhcnRpdGlvblR5cGVbZmlyc3RQYXJ0aXRpb25UeXBlXX1gKTtcbiAgICB9XG4gIH1cblxuICBjb21wdXRlKCk6IFtudW1iZXJbXSwgVHlwZWRBcnJheV0ge1xuICAgIGNvbnN0IGZpcnN0UGFydGl0aW9uVGVuc29yID0gdGhpcy5yb3dQYXJ0aXRpb25WYWx1ZXNbMF07XG4gICAgaWYgKGZpcnN0UGFydGl0aW9uVGVuc29yLmxlbmd0aCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgJ0ludmFsaWQgZmlyc3QgcGFydGl0aW9uIGlucHV0LiAnICtcbiAgICAgICAgICAnVGVuc29yIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBlbGVtZW50LicpO1xuICAgIH1cbiAgICBjb25zdCBmaXJzdERpbWVuc2lvbiA9IHRoaXMuZ2V0Rmlyc3REaW1lbnNpb25TaXplKCk7XG4gICAgY29uc3Qgb3V0cHV0U2l6ZSA9IHRoaXMuY2FsY3VsYXRlT3V0cHV0U2l6ZShmaXJzdERpbWVuc2lvbik7XG4gICAgY29uc3QgbXVsdGlwbGllcjogbnVtYmVyW10gPSBuZXcgQXJyYXkodGhpcy5yYWdnZWRSYW5rICsgMSk7XG5cbiAgICBtdWx0aXBsaWVyW211bHRpcGxpZXIubGVuZ3RoIC0gMV0gPSAxO1xuICAgIGZvciAobGV0IGkgPSBtdWx0aXBsaWVyLmxlbmd0aCAtIDI7IGkgPj0gMDsgLS1pKSB7XG4gICAgICBtdWx0aXBsaWVyW2ldID0gbXVsdGlwbGllcltpICsgMV0gKiBvdXRwdXRTaXplW2kgKyAxXTtcbiAgICB9XG4gICAgLy8gRnVsbCBzaXplIG9mIHRoZSB0ZW5zb3IuXG4gICAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gbWFrZVNoYXBlKG91dHB1dFNpemUsIGZhbHNlKTtcbiAgICBjb25zdCBvdXRwdXRUZW5zb3IgPVxuICAgICAgICB1dGlsLmdldEFycmF5RnJvbURUeXBlKFxuICAgICAgICAgICAgdGhpcy52YWx1ZXNEVHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG91dHB1dFNoYXBlKSkgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IGZ1bGxTaXplID0gbXVsdGlwbGllclswXSAqIG91dHB1dFNpemVbMF07XG4gICAgaWYgKGZ1bGxTaXplID4gMCkge1xuICAgICAgbGV0IG91dHB1dEluZGV4ID0gdGhpcy5jYWxjdWxhdGVGaXJzdFBhcmVudE91dHB1dEluZGV4KFxuICAgICAgICAgIGZpcnN0RGltZW5zaW9uLCBtdWx0aXBsaWVyWzBdLCBvdXRwdXRTaXplWzBdKTtcbiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IHRoaXMucmFnZ2VkUmFuazsgKytpKSB7XG4gICAgICAgIGNvbnN0IG5ld091dHB1dEluZGV4ID0gdGhpcy5jYWxjdWxhdGVPdXRwdXRJbmRleChcbiAgICAgICAgICAgIGkgLSAxLCBvdXRwdXRJbmRleCwgbXVsdGlwbGllcltpXSwgb3V0cHV0U2l6ZVtpXSk7XG4gICAgICAgIG91dHB1dEluZGV4ID0gbmV3T3V0cHV0SW5kZXg7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc2V0T3V0cHV0KHRoaXMucmFnZ2VkUmFuaywgb3V0cHV0SW5kZXgsIG91dHB1dFRlbnNvciwgb3V0cHV0U2hhcGUpO1xuICAgIH1cblxuICAgIHJldHVybiBbb3V0cHV0U2hhcGUsIG91dHB1dFRlbnNvcl07XG4gIH1cbiAgc2V0T3V0cHV0KFxuICAgICAgcmFnZ2VkUmFuazogbnVtYmVyLCBvdXRwdXRJbmRleDogbnVtYmVyW10sIG91dHB1dFRlbnNvcjogVHlwZWRBcnJheSxcbiAgICAgIG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGlmIChvdXRwdXRUZW5zb3IubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdmFsdWVzQmFzZSA9IHRoaXMudmFsdWVzO1xuICAgIGNvbnN0IG91dHB1dEJhc2UgPSBvdXRwdXRUZW5zb3I7XG5cbiAgICBsZXQgZWxlbWVudFNoYXBlID0gb3V0cHV0U2hhcGUuc2xpY2UoKTtcbiAgICBlbGVtZW50U2hhcGUgPSBlbGVtZW50U2hhcGUuc2xpY2UocmFnZ2VkUmFuayArIDEpO1xuICAgIGNvbnN0IHZhbHVlRWxlbWVudFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoZWxlbWVudFNoYXBlKTtcbiAgICBjb25zdCBvdXRwdXRJbmRleFNpemUgPSBvdXRwdXRJbmRleC5sZW5ndGg7XG5cbiAgICAvLyBCcm9hZGNhc3QgdGhlIGRlZmF1bHQgdmFsdWUgdG8gdmFsdWVfZWxlbWVudF9zaXplLiAgKFdlIGNhbiBza2lwIHRoaXNcbiAgICAvLyBpZiBkZWZhdWx0VmFsdWVUZW5zb3Iuc2l6ZSA9PSAxLCBzaW5jZSB3ZSB1c2UgZmlsbCB3aGVuIHRoYXQncyB0cnVlLilcbiAgICBsZXQgZGVmYXVsdFZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWU7XG4gICAgaWYgKGRlZmF1bHRWYWx1ZS5sZW5ndGggIT09IHZhbHVlRWxlbWVudFNpemUgJiYgZGVmYXVsdFZhbHVlLmxlbmd0aCAhPT0gMSkge1xuICAgICAgY29uc3Qgc3JjU2hhcGUgPSB0aGlzLmRlZmF1bHRWYWx1ZVNoYXBlO1xuICAgICAgdGlkeSgoKSA9PiB7XG4gICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZVRlbnNvciA9IHJlc2hhcGUoZGVmYXVsdFZhbHVlLCBzcmNTaGFwZSk7XG4gICAgICAgIGNvbnN0IGJDYXN0RGVmYXVsdCA9IGJyb2FkY2FzdFRvKGRlZmF1bHRWYWx1ZVRlbnNvciwgZWxlbWVudFNoYXBlKTtcbiAgICAgICAgZGVmYXVsdFZhbHVlID0gYkNhc3REZWZhdWx0LmRhdGFTeW5jKCk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggdGhlIG91dHB1dEluZGV4IGFycmF5LCBmaW5kaW5nIGNvbnRpZ3VvdXMgcmVnaW9ucyB0aGF0XG4gICAgLy8gc2hvdWxkIGJlIGNvcGllZC4gIE9uY2Ugd2UgZmluZCB0aGUgZW5kIG9mIGEgY29udGlndW91cyByZWdpb24sIGNvcHkgaXRcbiAgICAvLyBhbmQgYWRkIGFueSBuZWNlc3NhcnkgcGFkZGluZyAod2l0aCBkZWZhdWx0VmFsdWUpLlxuICAgIGxldCBzcmNTdGFydCA9IDA7ICAvLyBTdGFydCBvZiBjb250aWd1b3VzIHJlZ2lvbiAoaW4gdmFsdWVzKVxuICAgIGxldCBkc3RTdGFydCA9IDA7ICAvLyBEZXN0aW5hdGlvbiBmb3IgY29udGlndW91cyByZWdpb24gKGluIG91dHB1dClcbiAgICBsZXQgZHN0RW5kID0gMDsgICAgLy8gRGVzdGluYXRpb24gZm9yIGNvbnRpZ3VvdXMgcmVnaW9uIChpbiBvdXRwdXQpXG4gICAgZm9yIChsZXQgc3JjSSA9IDA7IHNyY0kgPD0gb3V0cHV0SW5kZXhTaXplOyArK3NyY0kpIHtcbiAgICAgIC8vIGRzdEkgaXMgdGhlIGRlc3RpbmF0aW9uIHdoZXJlIHRoZSB2YWx1ZSBhdCBzcmNJIHNob3VsZCBiZSBjb3BpZWQuXG4gICAgICBsZXQgZHN0SSA9IHNyY0kgPCBvdXRwdXRJbmRleFNpemUgPyBvdXRwdXRJbmRleFtzcmNJXSA6IC0xO1xuXG4gICAgICAvLyBJZiB3ZSdyZSBzdGlsbCBpbiBhIGNvbnRpZ3VvdXMgcmVnaW9uLCB0aGVuIHVwZGF0ZSBkc3RFbmQgZ28gdG8gdGhlXG4gICAgICAvLyBuZXh0IHNyY0kuXG4gICAgICBpZiAoZHN0SSA9PT0gZHN0RW5kKSB7XG4gICAgICAgICsrZHN0RW5kO1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgLy8gV2UgZm91bmQgdGhlIGVuZCBvZiBjb250aWd1b3VzIHJlZ2lvbi4gIFRoaXMgY2FuIGJlIGJlY2F1c2Ugd2UgZm91bmRcbiAgICAgIC8vIGEgZ2FwIChkc3RJID4gZHN0RW5kKSwgb3IgYSBzb3VyY2UgdmFsdWUgdGhhdCBzaG91bGRuJ3QgYmUgY29waWVkXG4gICAgICAvLyBiZWNhdXNlIGl0J3Mgb3V0LW9mLWJvdW5kcyAoZHN0SSA9PSAtMSksIG9yIHRoZSBlbmQgb2YgdGhlIHRlbnNvclxuICAgICAgLy8gKGRzdEkgPT09IC0xKS5cbiAgICAgIGlmIChkc3RTdGFydCA8IGRzdEVuZCkge1xuICAgICAgICAvLyBDb3B5IHRoZSBjb250aWd1b3VzIHJlZ2lvbi5cbiAgICAgICAgY29uc3Qgc3JjID0gdmFsdWVzQmFzZS5zdWJhcnJheShzcmNTdGFydCAqIHZhbHVlRWxlbWVudFNpemUpO1xuICAgICAgICBjb25zdCBkc3QgPSBvdXRwdXRCYXNlLnN1YmFycmF5KGRzdFN0YXJ0ICogdmFsdWVFbGVtZW50U2l6ZSk7XG4gICAgICAgIGNvbnN0IG5WYWxzID0gKGRzdEVuZCAtIGRzdFN0YXJ0KSAqIHZhbHVlRWxlbWVudFNpemU7XG4gICAgICAgIGNvcHlBcnJheShkc3QsIHNyYywgblZhbHMpO1xuICAgICAgfVxuXG4gICAgICAvLyBBZGQgYW55IG5lY2Vzc2FyeSBwYWRkaW5nICh3LyBkZWZhdWx0VmFsdWUpLlxuICAgICAgaWYgKHNyY0kgPj0gb3V0cHV0SW5kZXhTaXplKSB7XG4gICAgICAgIC8vIFdlIHJlYWNoZWQgdGhlIGVuZCBvZiB2YWx1ZXM6IHBhZCB0byB0aGUgZW5kIG9mIG91dHB1dC5cbiAgICAgICAgY29uc3Qgb3V0cHV0U2l6ZSA9IG91dHB1dFRlbnNvci5sZW5ndGg7XG4gICAgICAgIGRzdEkgPSBNYXRoLmZsb29yKG91dHB1dFNpemUgLyB2YWx1ZUVsZW1lbnRTaXplKTtcbiAgICAgIH1cbiAgICAgIGlmIChkc3RJID4gZHN0RW5kKSB7XG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBvdXRwdXRCYXNlXG4gICAgICAgICAgICAgIC5zdWJhcnJheShkc3RFbmQgKiB2YWx1ZUVsZW1lbnRTaXplLCBkc3RJICogdmFsdWVFbGVtZW50U2l6ZSlcbiAgICAgICAgICAgICAgLmZpbGwodGhpcy5kZWZhdWx0VmFsdWVbMF0pO1xuICAgICAgICAgIGRzdEVuZCA9IGRzdEk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgd2hpbGUgKGRzdEkgPiBkc3RFbmQpIHtcbiAgICAgICAgICAgIGNvbnN0IGRzdCA9IG91dHB1dEJhc2Uuc2xpY2UoZHN0RW5kICogdmFsdWVFbGVtZW50U2l6ZSk7XG4gICAgICAgICAgICBjb3B5QXJyYXkoZHN0LCBkZWZhdWx0VmFsdWUsIHZhbHVlRWxlbWVudFNpemUpO1xuICAgICAgICAgICAgKytkc3RFbmQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFVwZGF0ZSBpbmRpY2VzLlxuICAgICAgaWYgKGRzdEkgPCAwKSB7XG4gICAgICAgIC8vIHNyY0kgc2hvdWxkIGJlIHNraXBwZWQgLS0gbGVhdmUgaXQgb3V0IG9mIHRoZSBjb250aWd1b3VzIHJlZ2lvbi5cbiAgICAgICAgc3JjU3RhcnQgPSBzcmNJICsgMTtcbiAgICAgICAgZHN0U3RhcnQgPSBkc3RFbmQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzcmNJIHNob3VsZCBiZSBjb3BpZWQgLS0gaW5jbHVkZSBpdCBpbiB0aGUgY29udGlndW91cyByZWdpb24uXG4gICAgICAgIHNyY1N0YXJ0ID0gc3JjSTtcbiAgICAgICAgZHN0U3RhcnQgPSBkc3RFbmQ7XG4gICAgICAgIGRzdEVuZCA9IGRzdFN0YXJ0ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gY29weUFycmF5KGRzdDogVHlwZWRBcnJheSwgc3JjOiBUeXBlZEFycmF5LCBzaXplOiBudW1iZXIpIHtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHtcbiAgICBkc3RbaV0gPSBzcmNbaV07XG4gIH1cbn1cblxuZnVuY3Rpb24gbWFrZVNoYXBlKHNoYXBlOiBudW1iZXJbXXxUeXBlZEFycmF5LCBpc1BhcnRpYWw6IGJvb2xlYW4pIHtcbiAgY29uc3Qgb3V0OiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBkaW0gb2Ygc2hhcGUpIHtcbiAgICBpZiAoZGltIDwgMCkge1xuICAgICAgaWYgKCFpc1BhcnRpYWwpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEaW1lbnNpb24gJHtkaW19IG11c3QgYmUgPj0gMGApO1xuICAgICAgfVxuICAgICAgaWYgKGRpbSA8IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgRGltZW5zaW9uICR7ZGltfSBtdXN0IGJlID49IC0xYCk7XG4gICAgICB9XG4gICAgICBkaW0gPSAtMTtcbiAgICB9XG4gICAgb3V0LnB1c2goZGltKTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiByYWdnZWRUZW5zb3JUb1RlbnNvckltcGwoXG4gICAgc2hhcGU6IFR5cGVkQXJyYXksIHNoYXBlc1NoYXBlOiBudW1iZXJbXSwgdmFsdWVzOiBUeXBlZEFycmF5LFxuICAgIHZhbHVlc1NoYXBlOiBudW1iZXJbXSwgdmFsdWVzRFR5cGU6IERhdGFUeXBlLCBkZWZhdWx0VmFsdWU6IFR5cGVkQXJyYXksXG4gICAgZGVmYXVsdFZhbHVlU2hhcGU6IG51bWJlcltdLCByb3dQYXJ0aXRpb25WYWx1ZXM6IFR5cGVkQXJyYXlbXSxcbiAgICByb3dQYXJ0aXRpb25WYWx1ZXNTaGFwZXM6IG51bWJlcltdW10sXG4gICAgcm93UGFydGl0aW9uVHlwZXM6IHN0cmluZ1tdKTogW251bWJlcltdLCBUeXBlZEFycmF5XSB7XG4gIHJldHVybiBuZXcgUmFnZ2VkVGVuc29yVG9UZW5zb3JPcChcbiAgICAgICAgICAgICBzaGFwZSwgc2hhcGVzU2hhcGUsIHZhbHVlcywgdmFsdWVzU2hhcGUsIHZhbHVlc0RUeXBlLCBkZWZhdWx0VmFsdWUsXG4gICAgICAgICAgICAgZGVmYXVsdFZhbHVlU2hhcGUsIHJvd1BhcnRpdGlvblZhbHVlcywgcm93UGFydGl0aW9uVmFsdWVzU2hhcGVzLFxuICAgICAgICAgICAgIHJvd1BhcnRpdGlvblR5cGVzKVxuICAgICAgLmNvbXB1dGUoKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function rangeImpl(start, stop, step, dtype) {\n    const sameStartStop = start === stop;\n    const increasingRangeNegativeStep = start < stop && step < 0;\n    const decreasingRangePositiveStep = stop < start && step > 1;\n    if (sameStartStop || increasingRangeNegativeStep ||\n        decreasingRangePositiveStep) {\n        return util.makeZerosTypedArray(0, dtype);\n    }\n    const numElements = Math.abs(Math.ceil((stop - start) / step));\n    const values = util.makeZerosTypedArray(numElements, dtype);\n    if (stop < start && step === 1) {\n        // Auto adjust the step's sign if it hasn't been set\n        // (or was set to 1)\n        step = -1;\n    }\n    values[0] = start;\n    for (let i = 1; i < values.length; i++) {\n        values[i] = values[i - 1] + step;\n    }\n    return values;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFuZ2VfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmFuZ2VfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsTUFBTSxVQUFVLFNBQVMsQ0FDckIsS0FBYSxFQUFFLElBQVksRUFBRSxJQUFZLEVBQ3pDLEtBQXdCO0lBQzFCLE1BQU0sYUFBYSxHQUFHLEtBQUssS0FBSyxJQUFJLENBQUM7SUFDckMsTUFBTSwyQkFBMkIsR0FBRyxLQUFLLEdBQUcsSUFBSSxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDN0QsTUFBTSwyQkFBMkIsR0FBRyxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFFN0QsSUFBSSxhQUFhLElBQUksMkJBQTJCO1FBQzVDLDJCQUEyQixFQUFFO1FBQy9CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztLQUMzQztJQUVELE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFNUQsSUFBSSxJQUFJLEdBQUcsS0FBSyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDOUIsb0RBQW9EO1FBQ3BELG9CQUFvQjtRQUNwQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDWDtJQUVELE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0tBQ2xDO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZU1hcCwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJhbmdlSW1wbChcbiAgICBzdGFydDogbnVtYmVyLCBzdG9wOiBudW1iZXIsIHN0ZXA6IG51bWJlcixcbiAgICBkdHlwZTogJ2Zsb2F0MzInfCdpbnQzMicpOiBEYXRhVHlwZU1hcFsnZmxvYXQzMicgfCAnaW50MzInXSB7XG4gIGNvbnN0IHNhbWVTdGFydFN0b3AgPSBzdGFydCA9PT0gc3RvcDtcbiAgY29uc3QgaW5jcmVhc2luZ1JhbmdlTmVnYXRpdmVTdGVwID0gc3RhcnQgPCBzdG9wICYmIHN0ZXAgPCAwO1xuICBjb25zdCBkZWNyZWFzaW5nUmFuZ2VQb3NpdGl2ZVN0ZXAgPSBzdG9wIDwgc3RhcnQgJiYgc3RlcCA+IDE7XG5cbiAgaWYgKHNhbWVTdGFydFN0b3AgfHwgaW5jcmVhc2luZ1JhbmdlTmVnYXRpdmVTdGVwIHx8XG4gICAgICBkZWNyZWFzaW5nUmFuZ2VQb3NpdGl2ZVN0ZXApIHtcbiAgICByZXR1cm4gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KDAsIGR0eXBlKTtcbiAgfVxuXG4gIGNvbnN0IG51bUVsZW1lbnRzID0gTWF0aC5hYnMoTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCkpO1xuICBjb25zdCB2YWx1ZXMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkobnVtRWxlbWVudHMsIGR0eXBlKTtcblxuICBpZiAoc3RvcCA8IHN0YXJ0ICYmIHN0ZXAgPT09IDEpIHtcbiAgICAvLyBBdXRvIGFkanVzdCB0aGUgc3RlcCdzIHNpZ24gaWYgaXQgaGFzbid0IGJlZW4gc2V0XG4gICAgLy8gKG9yIHdhcyBzZXQgdG8gMSlcbiAgICBzdGVwID0gLTE7XG4gIH1cblxuICB2YWx1ZXNbMF0gPSBzdGFydDtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICB2YWx1ZXNbaV0gPSB2YWx1ZXNbaSAtIDFdICsgc3RlcDtcbiAgfVxuICByZXR1cm4gdmFsdWVzO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Rsqrt } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFuncFromImpl } from '../utils/unary_utils';\nexport const rsqrtImpl = createSimpleUnaryImpl((xi) => 1 / Math.sqrt(xi));\nexport const rsqrt = unaryKernelFuncFromImpl(Rsqrt, rsqrtImpl);\nexport const rsqrtConfig = {\n    kernelName: Rsqrt,\n    backendName: 'cpu',\n    kernelFunc: rsqrt,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnNxcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JzcXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDMUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLHVCQUF1QixDQUFDLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUnNxcnR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlVW5hcnlJbXBsfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jRnJvbUltcGx9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHJzcXJ0SW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IDEgLyBNYXRoLnNxcnQoeGkpKTtcbmV4cG9ydCBjb25zdCByc3FydCA9IHVuYXJ5S2VybmVsRnVuY0Zyb21JbXBsKFJzcXJ0LCByc3FydEltcGwpO1xuXG5leHBvcnQgY29uc3QgcnNxcnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUnNxcnQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcnNxcnQsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function scatterImpl(indices, updates, shape, outputSize, sliceSize, numUpdates, sliceRank, strides, defaultValue, sumDupeIndices) {\n    const flattenShape = [outputSize / sliceSize, sliceSize];\n    const indicesData = indices.values;\n    const updatesData = updates.values;\n    if (outputSize === 0) {\n        return buffer(shape, updates.dtype);\n    }\n    const outBuf = buffer(flattenShape, updates.dtype);\n    if (typeof defaultValue === 'string') {\n        outBuf.values.fill(defaultValue);\n    }\n    else if (typeof defaultValue === 'number') {\n        outBuf.values.fill(defaultValue);\n    }\n    else if (typeof defaultValue === 'boolean') {\n        outBuf.values.fill(+defaultValue);\n    }\n    for (let i = 0; i < numUpdates; i++) {\n        const index = [];\n        let flattenIndex = 0;\n        for (let j = 0; j < sliceRank; j++) {\n            const dim = indicesData[i * sliceRank + j];\n            index.push(dim);\n            flattenIndex += dim * strides[j];\n        }\n        if (flattenIndex < 0 || flattenIndex >= outputSize / sliceSize) {\n            throw new Error(`Invalid indices: ${index} does not index into ${shape}`);\n        }\n        for (let k = 0; k < sliceSize; k++) {\n            if (sumDupeIndices) {\n                outBuf.values[flattenIndex * sliceSize + k] +=\n                    updatesData[i * sliceSize + k];\n            }\n            else {\n                outBuf.values[flattenIndex * sliceSize + k] = updates.rank === 0 ?\n                    updatesData[0] :\n                    updatesData[i * sliceSize + k];\n            }\n        }\n    }\n    return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NhdHRlcl9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TY2F0dGVyX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLE1BQU0sRUFBMkMsTUFBTSx1QkFBdUIsQ0FBQztBQVN2RixNQUFNLFVBQ04sV0FBVyxDQUNQLE9BQWlDLEVBQUUsT0FBMkIsRUFDOUQsS0FBZSxFQUFFLFVBQWtCLEVBQUUsU0FBaUIsRUFBRSxVQUFrQixFQUMxRSxTQUFpQixFQUFFLE9BQWlCLEVBQUUsWUFBb0MsRUFDMUUsY0FBdUI7SUFDekIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxVQUFVLEdBQUcsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXpELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFvQixDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFFbkMsSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLEtBQW9CLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3BEO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7UUFDbkMsTUFBTSxDQUFDLE1BQW1CLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ2hEO1NBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxRQUFRLEVBQUU7UUFDMUMsTUFBTSxDQUFDLE1BQXFCLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ2xEO1NBQU0sSUFBSSxPQUFPLFlBQVksS0FBSyxTQUFTLEVBQUU7UUFDM0MsTUFBTSxDQUFDLE1BQXFCLENBQUMsSUFBSSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUM7S0FDbkQ7SUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7UUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNsQyxNQUFNLEdBQUcsR0FBRyxXQUFXLENBQUMsQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMzQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2hCLFlBQVksSUFBSSxHQUFHLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ2xDO1FBRUQsSUFBSSxZQUFZLEdBQUcsQ0FBQyxJQUFJLFlBQVksSUFBSSxVQUFVLEdBQUcsU0FBUyxFQUFFO1lBQzlELE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEtBQUssd0JBQXdCLEtBQUssRUFBRSxDQUFDLENBQUM7U0FDM0U7UUFFRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ2xDLElBQUksY0FBYyxFQUFFO2dCQUNqQixNQUFNLENBQUMsTUFBcUIsQ0FBQyxZQUFZLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQztvQkFDdEQsV0FBMEIsQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO2FBQ3BEO2lCQUFNO2dCQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDO29CQUM5RCxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDaEIsV0FBVyxDQUFDLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7YUFDcEM7U0FDRjtLQUNGO0lBRUQsT0FBTyxNQUE0QixDQUFDO0FBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2J1ZmZlciwgUmFuaywgU2hhcGVNYXAsIFRlbnNvckJ1ZmZlciwgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW50ZXJmYWNlIERlZmF1bHRWYWx1ZVR5cGVNYXAge1xuICBib29sOiBib29sZWFuO1xuICBpbnQzMjogbnVtYmVyO1xuICBmbG9hdDMyOiBudW1iZXI7XG4gIHN0cmluZzogc3RyaW5nO1xufVxuXG5leHBvcnQgZnVuY3Rpb25cbnNjYXR0ZXJJbXBsPFIgZXh0ZW5kcyBSYW5rLCBEIGV4dGVuZHMgJ2Zsb2F0MzInfCdpbnQzMid8J2Jvb2wnfCdzdHJpbmcnPihcbiAgICBpbmRpY2VzOiBUZW5zb3JCdWZmZXI8UiwgJ2ludDMyJz4sIHVwZGF0ZXM6IFRlbnNvckJ1ZmZlcjxSLCBEPixcbiAgICBzaGFwZTogbnVtYmVyW10sIG91dHB1dFNpemU6IG51bWJlciwgc2xpY2VTaXplOiBudW1iZXIsIG51bVVwZGF0ZXM6IG51bWJlcixcbiAgICBzbGljZVJhbms6IG51bWJlciwgc3RyaWRlczogbnVtYmVyW10sIGRlZmF1bHRWYWx1ZTogRGVmYXVsdFZhbHVlVHlwZU1hcFtEXSxcbiAgICBzdW1EdXBlSW5kaWNlczogYm9vbGVhbik6IFRlbnNvckJ1ZmZlcjxSLCBEPiB7XG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IFtvdXRwdXRTaXplIC8gc2xpY2VTaXplLCBzbGljZVNpemVdO1xuXG4gIGNvbnN0IGluZGljZXNEYXRhID0gaW5kaWNlcy52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgdXBkYXRlc0RhdGEgPSB1cGRhdGVzLnZhbHVlcztcblxuICBpZiAob3V0cHV0U2l6ZSA9PT0gMCkge1xuICAgIHJldHVybiBidWZmZXIoc2hhcGUgYXMgU2hhcGVNYXBbUl0sIHVwZGF0ZXMuZHR5cGUpO1xuICB9XG5cbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKGZsYXR0ZW5TaGFwZSwgdXBkYXRlcy5kdHlwZSk7XG4gIGlmICh0eXBlb2YgZGVmYXVsdFZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIChvdXRCdWYudmFsdWVzIGFzIHN0cmluZ1tdKS5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAob3V0QnVmLnZhbHVlcyBhcyBUeXBlZEFycmF5KS5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRlZmF1bHRWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgKG91dEJ1Zi52YWx1ZXMgYXMgVHlwZWRBcnJheSkuZmlsbCgrZGVmYXVsdFZhbHVlKTtcbiAgfVxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtVXBkYXRlczsgaSsrKSB7XG4gICAgY29uc3QgaW5kZXggPSBbXTtcbiAgICBsZXQgZmxhdHRlbkluZGV4ID0gMDtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHNsaWNlUmFuazsgaisrKSB7XG4gICAgICBjb25zdCBkaW0gPSBpbmRpY2VzRGF0YVtpICogc2xpY2VSYW5rICsgal07XG4gICAgICBpbmRleC5wdXNoKGRpbSk7XG4gICAgICBmbGF0dGVuSW5kZXggKz0gZGltICogc3RyaWRlc1tqXTtcbiAgICB9XG5cbiAgICBpZiAoZmxhdHRlbkluZGV4IDwgMCB8fCBmbGF0dGVuSW5kZXggPj0gb3V0cHV0U2l6ZSAvIHNsaWNlU2l6ZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIGluZGljZXM6ICR7aW5kZXh9IGRvZXMgbm90IGluZGV4IGludG8gJHtzaGFwZX1gKTtcbiAgICB9XG5cbiAgICBmb3IgKGxldCBrID0gMDsgayA8IHNsaWNlU2l6ZTsgaysrKSB7XG4gICAgICBpZiAoc3VtRHVwZUluZGljZXMpIHtcbiAgICAgICAgKG91dEJ1Zi52YWx1ZXMgYXMgVHlwZWRBcnJheSlbZmxhdHRlbkluZGV4ICogc2xpY2VTaXplICsga10gKz1cbiAgICAgICAgICAgICh1cGRhdGVzRGF0YSBhcyBUeXBlZEFycmF5KVtpICogc2xpY2VTaXplICsga107XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRCdWYudmFsdWVzW2ZsYXR0ZW5JbmRleCAqIHNsaWNlU2l6ZSArIGtdID0gdXBkYXRlcy5yYW5rID09PSAwID9cbiAgICAgICAgICAgIHVwZGF0ZXNEYXRhWzBdIDpcbiAgICAgICAgICAgIHVwZGF0ZXNEYXRhW2kgKiBzbGljZVNpemUgKyBrXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0QnVmIGFzIFRlbnNvckJ1ZmZlcjxSLCBEPjtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sigmoid } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sigmoidImpl = createSimpleUnaryImpl((xi) => 1 / (1 + Math.exp(-xi)));\nexport const sigmoid = unaryKernelFunc(Sigmoid, (xi) => 1 / (1 + Math.exp(-xi)));\nexport const sigmoidConfig = {\n    kernelName: Sigmoid,\n    backendName: 'cpu',\n    kernelFunc: sigmoid,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbW9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU2lnbW9pZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FDcEIscUJBQXFCLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFFOUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsT0FBTztDQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpZ21vaWR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlVW5hcnlJbXBsfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBzaWdtb2lkSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlVW5hcnlJbXBsKCh4aSkgPT4gMSAvICgxICsgTWF0aC5leHAoLXhpKSkpO1xuZXhwb3J0IGNvbnN0IHNpZ21vaWQgPVxuICAgIHVuYXJ5S2VybmVsRnVuYyhTaWdtb2lkLCAoeGkpID0+IDEgLyAoMSArIE1hdGguZXhwKC14aSkpKTtcblxuZXhwb3J0IGNvbnN0IHNpZ21vaWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2lnbW9pZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzaWdtb2lkLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, buffer, Slice, slice_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function sliceImpl(vals, begin, size, shape, dtype) {\n    const isContinous = slice_util.isSliceContinous(shape, begin, size);\n    const length = util.sizeFromShape(size);\n    const xStrides = util.computeStrides(shape);\n    if (isContinous) {\n        const flatOffset = slice_util.computeFlatOffset(begin, xStrides);\n        if (dtype === 'string') {\n            return vals.slice(flatOffset, flatOffset + length);\n        }\n        return vals.subarray(flatOffset, flatOffset + length);\n    }\n    const decodedData = dtype === 'string' ?\n        backend_util.fromUint8ToStringArray(vals) :\n        vals;\n    const inBuf = buffer(shape, dtype, decodedData);\n    const outBuf = buffer(size, dtype);\n    for (let i = 0; i < outBuf.size; ++i) {\n        const outLoc = outBuf.indexToLoc(i);\n        const inLoc = outLoc.map((idx, j) => idx + begin[j]);\n        outBuf.set(inBuf.get(...inLoc), ...outLoc);\n    }\n    if (dtype === 'string') {\n        return backend_util.fromStringArrayToUint8(outBuf.values);\n    }\n    return outBuf.values;\n}\nexport function slice(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { begin, size } = attrs;\n    assertNotComplex(x, 'slice');\n    const [$begin, $size] = slice_util.parseSliceParams(x, begin, size);\n    slice_util.assertParamsValid(x, $begin, $size);\n    const vals = backend.data.get(x.dataId).values;\n    const outVals = sliceImpl(vals, $begin, $size, x.shape, x.dtype);\n    return backend.makeTensorInfo($size, x.dtype, outVals);\n}\nexport const sliceConfig = {\n    kernelName: Slice,\n    backendName: 'cpu',\n    kernelFunc: slice\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NsaWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWlCLE1BQU0sRUFBc0MsS0FBSyxFQUFFLFVBQVUsRUFBbUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEwsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxTQUFTLENBQ3JCLElBQW1CLEVBQUUsS0FBZSxFQUFFLElBQWMsRUFBRSxLQUFlLEVBQ3JFLEtBQWU7SUFDakIsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN4QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTVDLElBQUksV0FBVyxFQUFFO1FBQ2YsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztRQUVqRSxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7WUFDdEIsT0FBUSxJQUFxQixDQUFDLEtBQUssQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDO1NBQ3RFO1FBRUQsT0FBUSxJQUFtQixDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0tBQ3ZFO0lBRUQsTUFBTSxXQUFXLEdBQUcsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO1FBQ3BDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFvQixDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFrQixDQUFDO0lBRXZCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ2hELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDcEMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxFQUFFLEdBQUcsTUFBTSxDQUFDLENBQUM7S0FDNUM7SUFFRCxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsT0FBTyxZQUFZLENBQUMsc0JBQXNCLENBQUMsTUFBTSxDQUFDLE1BQWtCLENBQUMsQ0FBQztLQUN2RTtJQUNELE9BQU8sTUFBTSxDQUFDLE1BQW9CLENBQUM7QUFDckMsQ0FBQztBQUVELE1BQU0sVUFBVSxLQUFLLENBQ2pCLElBQXVFO0lBRXpFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTVCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU3QixNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRS9DLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFDL0MsTUFBTSxPQUFPLEdBQUcsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsS0FBeUI7Q0FDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhY2tlbmRWYWx1ZXMsIGJ1ZmZlciwgRGF0YVR5cGUsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2xpY2UsIHNsaWNlX3V0aWwsIFNsaWNlQXR0cnMsIFNsaWNlSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlSW1wbChcbiAgICB2YWxzOiBCYWNrZW5kVmFsdWVzLCBiZWdpbjogbnVtYmVyW10sIHNpemU6IG51bWJlcltdLCBzaGFwZTogbnVtYmVyW10sXG4gICAgZHR5cGU6IERhdGFUeXBlKTogQmFja2VuZFZhbHVlcyB7XG4gIGNvbnN0IGlzQ29udGlub3VzID0gc2xpY2VfdXRpbC5pc1NsaWNlQ29udGlub3VzKHNoYXBlLCBiZWdpbiwgc2l6ZSk7XG4gIGNvbnN0IGxlbmd0aCA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaXplKTtcbiAgY29uc3QgeFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHNoYXBlKTtcblxuICBpZiAoaXNDb250aW5vdXMpIHtcbiAgICBjb25zdCBmbGF0T2Zmc2V0ID0gc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbiwgeFN0cmlkZXMpO1xuXG4gICAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuICh2YWxzIGFzIFVpbnQ4QXJyYXlbXSkuc2xpY2UoZmxhdE9mZnNldCwgZmxhdE9mZnNldCArIGxlbmd0aCk7XG4gICAgfVxuXG4gICAgcmV0dXJuICh2YWxzIGFzIFR5cGVkQXJyYXkpLnN1YmFycmF5KGZsYXRPZmZzZXQsIGZsYXRPZmZzZXQgKyBsZW5ndGgpO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlZERhdGEgPSBkdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgYmFja2VuZF91dGlsLmZyb21VaW50OFRvU3RyaW5nQXJyYXkodmFscyBhcyBVaW50OEFycmF5W10pIDpcbiAgICAgIHZhbHMgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCBpbkJ1ZiA9IGJ1ZmZlcihzaGFwZSwgZHR5cGUsIGRlY29kZWREYXRhKTtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKHNpemUsIGR0eXBlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRCdWYuc2l6ZTsgKytpKSB7XG4gICAgY29uc3Qgb3V0TG9jID0gb3V0QnVmLmluZGV4VG9Mb2MoaSk7XG4gICAgY29uc3QgaW5Mb2MgPSBvdXRMb2MubWFwKChpZHg6IG51bWJlciwgaikgPT4gaWR4ICsgYmVnaW5bal0pO1xuICAgIG91dEJ1Zi5zZXQoaW5CdWYuZ2V0KC4uLmluTG9jKSwgLi4ub3V0TG9jKTtcbiAgfVxuXG4gIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gYmFja2VuZF91dGlsLmZyb21TdHJpbmdBcnJheVRvVWludDgob3V0QnVmLnZhbHVlcyBhcyBzdHJpbmdbXSk7XG4gIH1cbiAgcmV0dXJuIG91dEJ1Zi52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHNsaWNlKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNsaWNlSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFNsaWNlQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YmVnaW4sIHNpemV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnc2xpY2UnKTtcblxuICBjb25zdCBbJGJlZ2luLCAkc2l6ZV0gPSBzbGljZV91dGlsLnBhcnNlU2xpY2VQYXJhbXMoeCwgYmVnaW4sIHNpemUpO1xuICBzbGljZV91dGlsLmFzc2VydFBhcmFtc1ZhbGlkKHgsICRiZWdpbiwgJHNpemUpO1xuXG4gIGNvbnN0IHZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gIGNvbnN0IG91dFZhbHMgPSBzbGljZUltcGwodmFscywgJGJlZ2luLCAkc2l6ZSwgeC5zaGFwZSwgeC5kdHlwZSk7XG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCRzaXplLCB4LmR0eXBlLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNsaWNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNsaWNlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nexport function sparseFillEmptyRowsImpl(indices, indicesShape, indicesDType, values, valuesDType, denseShape, defaultValue) {\n    const indicesCount = indicesShape[0];\n    const denseRows = denseShape[0];\n    const emptyRowIndicator = new Array(denseRows);\n    const reverseIndexMap = new Array(indicesCount);\n    const rank = indicesShape[1];\n    if (denseRows === 0) {\n        if (indicesCount !== 0) {\n            throw new Error(backend_util.getSparseFillEmptyRowsIndicesDenseShapeMismatch(indicesCount));\n        }\n        const outputIndices = util.getArrayFromDType(indicesDType, 0);\n        const outputValues = util.getArrayFromDType(valuesDType, 0);\n        return [\n            outputIndices, [0, rank], outputValues, emptyRowIndicator, reverseIndexMap\n        ];\n    }\n    let rowsAreOrdered = true;\n    let lastIndicesRow = 0;\n    const csrOffset = new Array(denseRows).fill(0);\n    for (let i = 0; i < indicesCount; ++i) {\n        // indices is a 2d tensor with shape of [N, rank]\n        const row = indices[i * rank];\n        if (row < 0) {\n            throw new Error(backend_util.getSparseFillEmptyRowsNegativeIndexErrorMessage(i, row));\n        }\n        if (row >= denseRows) {\n            throw new Error(backend_util.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage(i, row, denseRows));\n        }\n        ++csrOffset[row];\n        rowsAreOrdered = rowsAreOrdered && (row >= lastIndicesRow);\n        lastIndicesRow = row;\n    }\n    let allRowsFull = true;\n    for (let row = 0; row < denseRows; ++row) {\n        // csrOffset here describes the number of elements in this dense row\n        const rowEmpty = (csrOffset[row] === 0);\n        emptyRowIndicator[row] = rowEmpty;\n        allRowsFull = allRowsFull && !rowEmpty;\n        // In filled version, each row has at least one element.\n        csrOffset[row] = Math.max(csrOffset[row], 1);\n        // Update csrOffset to represent the number of elements up to and\n        // including denseRows + 1:\n        //  csrOffset[0] == #{elements of row 0}\n        //  csrOffset[1] == #{elements of row 1} + #{elements of row 0}\n        //  ..\n        //  csrOffset[i] == starting index for elements in row i + 1.\n        if (row > 0) {\n            csrOffset[row] += csrOffset[row - 1];\n        }\n    }\n    if (allRowsFull && rowsAreOrdered) {\n        const outputIndices = indices;\n        const outputValues = values;\n        for (let i = 0; i < indicesCount; ++i) {\n            reverseIndexMap[i] = i;\n        }\n        return [\n            outputIndices, [indicesCount, rank], outputValues, emptyRowIndicator,\n            reverseIndexMap\n        ];\n    }\n    else {\n        const fullIndicesCount = csrOffset[denseRows - 1];\n        const outputIndices = util.getArrayFromDType(indicesDType, fullIndicesCount * rank);\n        const outputValues = util.getArrayFromDType(valuesDType, fullIndicesCount);\n        const filledCount = new Array(denseRows).fill(0);\n        // Fill in values for rows that are not missing\n        for (let i = 0; i < indicesCount; ++i) {\n            // indices is a 2d tensor with shape of [N, rank]\n            const row = indices[i * rank];\n            const offset = filledCount[row];\n            const outputI = ((row === 0) ? 0 : csrOffset[row - 1]) + offset;\n            filledCount[row]++; // Increment the filled count for this row.\n            for (let j = 0; j < rank; ++j) {\n                // indices and outputIndices are 2d tensors with shape of [N, rank]\n                outputIndices[outputI * rank + j] = indices[i * rank + j];\n            }\n            outputValues[outputI] = values[i];\n            // We'll need this reverse index map to backprop correctly.\n            reverseIndexMap[i] = outputI;\n        }\n        // Fill in values for rows that are missing\n        for (let row = 0; row < denseRows; ++row) {\n            const rowCount = filledCount[row];\n            if (rowCount === 0) { // We haven't filled this row\n                const startingIndex = (row === 0) ? 0 : csrOffset[row - 1];\n                // Remaining index values were set to zero already.\n                // Just need to set the row index in the right location.\n                // outputIndices is a 2d tensor with shape of [N, rank]\n                outputIndices[startingIndex * rank + 0] = row;\n                for (let col = 1; col < rank; ++col) {\n                    outputIndices[startingIndex * rank + col] = 0;\n                }\n                outputValues[startingIndex] = defaultValue;\n            }\n        }\n        return [\n            outputIndices, [fullIndicesCount, rank], outputValues, emptyRowIndicator,\n            reverseIndexMap\n        ];\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBd0IsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0UsTUFBTSxVQUFVLHVCQUF1QixDQUNuQyxPQUFtQixFQUFFLFlBQXNCLEVBQUUsWUFBc0IsRUFDbkUsTUFBa0IsRUFBRSxXQUFxQixFQUFFLFVBQXNCLEVBQ2pFLFlBQW9CO0lBRXRCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyQyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFaEMsTUFBTSxpQkFBaUIsR0FBYyxJQUFJLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUMxRCxNQUFNLGVBQWUsR0FBYSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUUxRCxNQUFNLElBQUksR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFN0IsSUFBSSxTQUFTLEtBQUssQ0FBQyxFQUFFO1FBQ25CLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtZQUN0QixNQUFNLElBQUksS0FBSyxDQUNYLFlBQVksQ0FBQywrQ0FBK0MsQ0FDeEQsWUFBWSxDQUFDLENBQUMsQ0FBQztTQUN4QjtRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFlLENBQUM7UUFDNUUsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFdBQVcsRUFBRSxDQUFDLENBQWUsQ0FBQztRQUMxRSxPQUFPO1lBQ0wsYUFBYSxFQUFFLENB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QUUsRUFBRyw2QkFBNkI7Z0JBQ2xELE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7Z0JBQzNELG1EQUFtRDtnQkFDbkQsd0RBQXdEO2dCQUN4RCx1REFBdUQ7Z0JBQ3ZELGFBQWEsQ0FBQyxhQUFhLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztnQkFDOUMsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLElBQUksRUFBRSxFQUFFLEdBQUcsRUFBRTtvQkFDbkMsYUFBYSxDQUFDLGFBQWEsR0FBRyxJQUFJLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUMvQztnQkFDRCxZQUFZLENBQUMsYUFBYSxDQUFDLEdBQUcsWUFBWSxDQUFDO2FBQzVDO1NBQ0Y7UUFDRCxPQUFPO1lBQ0wsYUFBYSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsSUFBSSxDQUFDLEVBQUUsWUFBWSxFQUFFLGlCQUFpQjtZQUN4RSxlQUFlO1NBQ2hCLENBQUM7S0FDSDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsKFxuICAgIGluZGljZXM6IFR5cGVkQXJyYXksIGluZGljZXNTaGFwZTogbnVtYmVyW10sIGluZGljZXNEVHlwZTogRGF0YVR5cGUsXG4gICAgdmFsdWVzOiBUeXBlZEFycmF5LCB2YWx1ZXNEVHlwZTogRGF0YVR5cGUsIGRlbnNlU2hhcGU6IFR5cGVkQXJyYXksXG4gICAgZGVmYXVsdFZhbHVlOiBudW1iZXIpOlxuICAgIFtUeXBlZEFycmF5LCBudW1iZXJbXSwgVHlwZWRBcnJheSwgYm9vbGVhbltdLCBudW1iZXJbXV0ge1xuICBjb25zdCBpbmRpY2VzQ291bnQgPSBpbmRpY2VzU2hhcGVbMF07XG4gIGNvbnN0IGRlbnNlUm93cyA9IGRlbnNlU2hhcGVbMF07XG5cbiAgY29uc3QgZW1wdHlSb3dJbmRpY2F0b3I6IGJvb2xlYW5bXSA9IG5ldyBBcnJheShkZW5zZVJvd3MpO1xuICBjb25zdCByZXZlcnNlSW5kZXhNYXA6IG51bWJlcltdID0gbmV3IEFycmF5KGluZGljZXNDb3VudCk7XG5cbiAgY29uc3QgcmFuayA9IGluZGljZXNTaGFwZVsxXTtcblxuICBpZiAoZGVuc2VSb3dzID09PSAwKSB7XG4gICAgaWYgKGluZGljZXNDb3VudCAhPT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VGaWxsRW1wdHlSb3dzSW5kaWNlc0RlbnNlU2hhcGVNaXNtYXRjaChcbiAgICAgICAgICAgICAgaW5kaWNlc0NvdW50KSk7XG4gICAgfVxuICAgIGNvbnN0IG91dHB1dEluZGljZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKGluZGljZXNEVHlwZSwgMCkgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBvdXRwdXRWYWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKHZhbHVlc0RUeXBlLCAwKSBhcyBUeXBlZEFycmF5O1xuICAgIHJldHVybiBbXG4gICAgICBvdXRwdXRJbmRpY2VzLCBbMCwgcmFua10sIG91dHB1dFZhbHVlcywgZW1wdHlSb3dJbmRpY2F0b3IsIHJldmVyc2VJbmRleE1hcFxuICAgIF07XG4gIH1cblxuICBsZXQgcm93c0FyZU9yZGVyZWQgPSB0cnVlO1xuICBsZXQgbGFzdEluZGljZXNSb3cgPSAwO1xuICBjb25zdCBjc3JPZmZzZXQ6IG51bWJlcltdID0gbmV3IEFycmF5KGRlbnNlUm93cykuZmlsbCgwKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNDb3VudDsgKytpKSB7XG4gICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgIGNvbnN0IHJvdyA9IGluZGljZXNbaSAqIHJhbmtdO1xuICAgIGlmIChyb3cgPCAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldFNwYXJzZUZpbGxFbXB0eVJvd3NOZWdhdGl2ZUluZGV4RXJyb3JNZXNzYWdlKGksIHJvdykpO1xuICAgIH1cbiAgICBpZiAocm93ID49IGRlbnNlUm93cykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VGaWxsRW1wdHlSb3dzT3V0T2ZSYW5nZUluZGV4RXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICBpLCByb3csIGRlbnNlUm93cykpO1xuICAgIH1cbiAgICArK2Nzck9mZnNldFtyb3ddO1xuICAgIHJvd3NBcmVPcmRlcmVkID0gcm93c0FyZU9yZGVyZWQgJiYgKHJvdyA+PSBsYXN0SW5kaWNlc1Jvdyk7XG4gICAgbGFzdEluZGljZXNSb3cgPSByb3c7XG4gIH1cblxuICBsZXQgYWxsUm93c0Z1bGwgPSB0cnVlO1xuICBmb3IgKGxldCByb3cgPSAwOyByb3cgPCBkZW5zZVJvd3M7ICsrcm93KSB7XG4gICAgLy8gY3NyT2Zmc2V0IGhlcmUgZGVzY3JpYmVzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkZW5zZSByb3dcbiAgICBjb25zdCByb3dFbXB0eSA9IChjc3JPZmZzZXRbcm93XSA9PT0gMCk7XG4gICAgZW1wdHlSb3dJbmRpY2F0b3Jbcm93XSA9IHJvd0VtcHR5O1xuICAgIGFsbFJvd3NGdWxsID0gYWxsUm93c0Z1bGwgJiYgIXJvd0VtcHR5O1xuICAgIC8vIEluIGZpbGxlZCB2ZXJzaW9uLCBlYWNoIHJvdyBoYXMgYXQgbGVhc3Qgb25lIGVsZW1lbnQuXG4gICAgY3NyT2Zmc2V0W3Jvd10gPSBNYXRoLm1heChjc3JPZmZzZXRbcm93XSwgMSk7XG4gICAgLy8gVXBkYXRlIGNzck9mZnNldCB0byByZXByZXNlbnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyB1cCB0byBhbmRcbiAgICAvLyBpbmNsdWRpbmcgZGVuc2VSb3dzICsgMTpcbiAgICAvLyAgY3NyT2Zmc2V0WzBdID09ICN7ZWxlbWVudHMgb2Ygcm93IDB9XG4gICAgLy8gIGNzck9mZnNldFsxXSA9PSAje2VsZW1lbnRzIG9mIHJvdyAxfSArICN7ZWxlbWVudHMgb2Ygcm93IDB9XG4gICAgLy8gIC4uXG4gICAgLy8gIGNzck9mZnNldFtpXSA9PSBzdGFydGluZyBpbmRleCBmb3IgZWxlbWVudHMgaW4gcm93IGkgKyAxLlxuICAgIGlmIChyb3cgPiAwKSB7XG4gICAgICBjc3JPZmZzZXRbcm93XSArPSBjc3JPZmZzZXRbcm93IC0gMV07XG4gICAgfVxuICB9XG5cbiAgaWYgKGFsbFJvd3NGdWxsICYmIHJvd3NBcmVPcmRlcmVkKSB7XG4gICAgY29uc3Qgb3V0cHV0SW5kaWNlczogVHlwZWRBcnJheSA9IGluZGljZXM7XG4gICAgY29uc3Qgb3V0cHV0VmFsdWVzOiBUeXBlZEFycmF5ID0gdmFsdWVzO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlc0NvdW50OyArK2kpIHtcbiAgICAgIHJldmVyc2VJbmRleE1hcFtpXSA9IGk7XG4gICAgfVxuICAgIHJldHVybiBbXG4gICAgICBvdXRwdXRJbmRpY2VzLCBbaW5kaWNlc0NvdW50LCByYW5rXSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvcixcbiAgICAgIHJldmVyc2VJbmRleE1hcFxuICAgIF07XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZnVsbEluZGljZXNDb3VudCA9IGNzck9mZnNldFtkZW5zZVJvd3MgLSAxXTtcbiAgICBjb25zdCBvdXRwdXRJbmRpY2VzID1cbiAgICAgICAgdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbmRpY2VzRFR5cGUsIGZ1bGxJbmRpY2VzQ291bnQgKiByYW5rKSBhc1xuICAgICAgICBUeXBlZEFycmF5O1xuICAgIGNvbnN0IG91dHB1dFZhbHVlcyA9XG4gICAgICAgIHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUodmFsdWVzRFR5cGUsIGZ1bGxJbmRpY2VzQ291bnQpIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgZmlsbGVkQ291bnQ6IG51bWJlcltdID0gbmV3IEFycmF5KGRlbnNlUm93cykuZmlsbCgwKTtcblxuICAgIC8vIEZpbGwgaW4gdmFsdWVzIGZvciByb3dzIHRoYXQgYXJlIG5vdCBtaXNzaW5nXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbmRpY2VzQ291bnQ7ICsraSkge1xuICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgY29uc3Qgcm93ID0gaW5kaWNlc1tpICogcmFua107XG4gICAgICBjb25zdCBvZmZzZXQgPSBmaWxsZWRDb3VudFtyb3ddO1xuICAgICAgY29uc3Qgb3V0cHV0SSA9ICgocm93ID09PSAwKSA/IDAgOiBjc3JPZmZzZXRbcm93IC0gMV0pICsgb2Zmc2V0O1xuICAgICAgZmlsbGVkQ291bnRbcm93XSsrOyAgLy8gSW5jcmVtZW50IHRoZSBmaWxsZWQgY291bnQgZm9yIHRoaXMgcm93LlxuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByYW5rOyArK2opIHtcbiAgICAgICAgLy8gaW5kaWNlcyBhbmQgb3V0cHV0SW5kaWNlcyBhcmUgMmQgdGVuc29ycyB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICBvdXRwdXRJbmRpY2VzW291dHB1dEkgKiByYW5rICsgal0gPSBpbmRpY2VzW2kgKiByYW5rICsgal07XG4gICAgICB9XG4gICAgICBvdXRwdXRWYWx1ZXNbb3V0cHV0SV0gPSB2YWx1ZXNbaV07XG4gICAgICAvLyBXZSdsbCBuZWVkIHRoaXMgcmV2ZXJzZSBpbmRleCBtYXAgdG8gYmFja3Byb3AgY29ycmVjdGx5LlxuICAgICAgcmV2ZXJzZUluZGV4TWFwW2ldID0gb3V0cHV0STtcbiAgICB9XG5cbiAgICAvLyBGaWxsIGluIHZhbHVlcyBmb3Igcm93cyB0aGF0IGFyZSBtaXNzaW5nXG4gICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgZGVuc2VSb3dzOyArK3Jvdykge1xuICAgICAgY29uc3Qgcm93Q291bnQgPSBmaWxsZWRDb3VudFtyb3ddO1xuICAgICAgaWYgKHJvd0NvdW50ID09PSAwKSB7ICAvLyBXZSBoYXZlbid0IGZpbGxlZCB0aGlzIHJvd1xuICAgICAgICBjb25zdCBzdGFydGluZ0luZGV4ID0gKHJvdyA9PT0gMCkgPyAwIDogY3NyT2Zmc2V0W3JvdyAtIDFdO1xuICAgICAgICAvLyBSZW1haW5pbmcgaW5kZXggdmFsdWVzIHdlcmUgc2V0IHRvIHplcm8gYWxyZWFkeS5cbiAgICAgICAgLy8gSnVzdCBuZWVkIHRvIHNldCB0aGUgcm93IGluZGV4IGluIHRoZSByaWdodCBsb2NhdGlvbi5cbiAgICAgICAgLy8gb3V0cHV0SW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtOLCByYW5rXVxuICAgICAgICBvdXRwdXRJbmRpY2VzW3N0YXJ0aW5nSW5kZXggKiByYW5rICsgMF0gPSByb3c7XG4gICAgICAgIGZvciAobGV0IGNvbCA9IDE7IGNvbCA8IHJhbms7ICsrY29sKSB7XG4gICAgICAgICAgb3V0cHV0SW5kaWNlc1tzdGFydGluZ0luZGV4ICogcmFuayArIGNvbF0gPSAwO1xuICAgICAgICB9XG4gICAgICAgIG91dHB1dFZhbHVlc1tzdGFydGluZ0luZGV4XSA9IGRlZmF1bHRWYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtcbiAgICAgIG91dHB1dEluZGljZXMsIFtmdWxsSW5kaWNlc0NvdW50LCByYW5rXSwgb3V0cHV0VmFsdWVzLCBlbXB0eVJvd0luZGljYXRvcixcbiAgICAgIHJldmVyc2VJbmRleE1hcFxuICAgIF07XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nexport function sparseReshapeImpl(inputIndices, inputIndicesShape, inputDType, inputShape, targetShape) {\n    const denseSize = util.sizeFromShape(inputShape);\n    const nnz = inputIndicesShape[0];\n    const outputRank = targetShape.length;\n    // Compute the output shape. Determine product of specified dimensions, and\n    // find the index of the unspecified one.\n    const outputShape = [];\n    let product = 1;\n    let unknownIndex = -1;\n    for (let d = 0; d < outputRank; ++d) {\n        const size = targetShape[d];\n        if (size === -1) {\n            if (unknownIndex !== -1) {\n                throw new Error(backend_util\n                    .getSparseReshapeMultipleNegativeOneOutputDimErrorMessage(unknownIndex, d));\n            }\n            unknownIndex = d;\n            outputShape.push(1);\n        }\n        else {\n            if (size < 0) {\n                throw new Error(backend_util.getSparseReshapeNegativeOutputDimErrorMessage(d, size));\n            }\n            product *= size;\n            outputShape.push(size);\n        }\n    }\n    if (unknownIndex !== -1) {\n        if (product <= 0) {\n            throw new Error(backend_util.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage());\n        }\n        const missing = Math.trunc(denseSize / product);\n        if (product * missing !== denseSize) {\n            throw new Error(backend_util.getSparseReshapeInputOutputMultipleErrorMessage(inputShape, outputShape));\n        }\n        outputShape[unknownIndex] = missing;\n    }\n    const outputSize = util.sizeFromShape(outputShape);\n    if (outputSize !== denseSize) {\n        throw new Error(backend_util.getSparseReshapeInputOutputMismatchErrorMessage(inputShape, outputShape));\n    }\n    const inputRank = inputShape.length;\n    const inputStrides = [];\n    if (inputRank > 0) {\n        inputStrides[inputRank - 1] = 1;\n        for (let d = inputRank - 2; d >= 0; --d) {\n            inputStrides[d] = inputStrides[d + 1] * inputShape[d + 1];\n        }\n    }\n    const outputStrides = [];\n    if (outputRank > 0) {\n        outputStrides[outputRank - 1] = 1;\n        for (let d = outputRank - 2; d >= 0; --d) {\n            outputStrides[d] = outputStrides[d + 1] * outputShape[d + 1];\n        }\n    }\n    const newIndices = util.getArrayFromDType(inputDType, nnz * outputRank);\n    for (let i = 0; i < nnz; ++i) {\n        let id = 0;\n        for (let j = 0; j < inputRank; ++j) {\n            // inputIndices is a 2d tensor with shape of [nnz, inputRank]\n            id += inputIndices[i * inputRank + j] * inputStrides[j];\n        }\n        for (let j = 0; j < outputRank; ++j) {\n            // newIndices is a 2d tensor with shape of [nnz, outputRank]\n            newIndices[i * outputRank + j] = Math.trunc(id / outputStrides[j]);\n            id %= outputStrides[j];\n        }\n    }\n    return [newIndices, [nnz, outputRank], outputShape];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlUmVzaGFwZV9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcGFyc2VSZXNoYXBlX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBd0IsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0UsTUFBTSxVQUFVLGlCQUFpQixDQUM3QixZQUF3QixFQUFFLGlCQUEyQixFQUFFLFVBQW9CLEVBQzNFLFVBQW9CLEVBQ3BCLFdBQXFCO0lBQ3ZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDakQsTUFBTSxHQUFHLEdBQUcsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakMsTUFBTSxVQUFVLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQztJQUV0QywyRUFBMkU7SUFDM0UseUNBQXlDO0lBQ3pDLE1BQU0sV0FBVyxHQUFhLEVBQUUsQ0FBQztJQUNqQyxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUM7SUFDaEIsSUFBSSxZQUFZLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDdEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNuQyxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDNUIsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZixJQUFJLFlBQVksS0FBSyxDQUFDLENBQUMsRUFBRTtnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZO3FCQUNQLHdEQUF3RCxDQUNyRCxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUMvQjtZQUNELFlBQVksR0FBRyxDQUFDLENBQUM7WUFDakIsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNyQjthQUFNO1lBQ0wsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO2dCQUNaLE1BQU0sSUFBSSxLQUFLLENBQ1gsWUFBWSxDQUFDLDZDQUE2QyxDQUN0RCxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQzthQUNuQjtZQUNELE9BQU8sSUFBSSxJQUFJLENBQUM7WUFDaEIsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN4QjtLQUNGO0lBQ0QsSUFBSSxZQUFZLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDdkIsSUFBSSxPQUFPLElBQUksQ0FBQyxFQUFFO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQ1gsWUFBWSxDQUFDLG9EQUFvRCxFQUFFLENBQUMsQ0FBQztTQUMxRTtRQUNELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELElBQUksT0FBTyxHQUFHLE9BQU8sS0FBSyxTQUFTLEVBQUU7WUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZLENBQUMsK0NBQStDLENBQ3hELFVBQVUsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1NBQ25DO1FBRUQsV0FBVyxDQUFDLFlBQVksQ0FBQyxHQUFHLE9BQU8sQ0FBQztLQUNyQztJQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQ1gsWUFBWSxDQUFDLCtDQUErQyxDQUN4RCxVQUFVLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQztLQUNuQztJQUVELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUM7SUFDcEMsTUFBTSxZQUFZLEdBQWEsRUFBRSxDQUFDO0lBQ2xDLElBQUksU0FBUyxHQUFHLENBQUMsRUFBRTtRQUNqQixZQUFZLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUN2QyxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQzNEO0tBQ0Y7SUFFRCxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7SUFDbkMsSUFBSSxVQUFVLEdBQUcsQ0FBQyxFQUFFO1FBQ2xCLGFBQWEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3hDLGFBQWEsQ0FBQyxDQUFDLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDOUQ7S0FDRjtJQUVELE1BQU0sVUFBVSxHQUNaLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxVQUFVLEVBQUUsR0FBRyxHQUFHLFVBQVUsQ0FBZSxDQUFDO0lBQ3ZFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDNUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ1gsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNsQyw2REFBNkQ7WUFDN0QsRUFBRSxJQUFJLFlBQVksQ0FBQyxDQUFDLEdBQUcsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN6RDtRQUNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsNERBQTREO1lBQzVELFVBQVUsQ0FBQyxDQUFDLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25FLEVBQUUsSUFBSSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDeEI7S0FDRjtJQUNELE9BQU8sQ0FBQyxVQUFVLEVBQUUsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7QUFDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERhdGFUeXBlLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlUmVzaGFwZUltcGwoXG4gICAgaW5wdXRJbmRpY2VzOiBUeXBlZEFycmF5LCBpbnB1dEluZGljZXNTaGFwZTogbnVtYmVyW10sIGlucHV0RFR5cGU6IERhdGFUeXBlLFxuICAgIGlucHV0U2hhcGU6IG51bWJlcltdLFxuICAgIHRhcmdldFNoYXBlOiBudW1iZXJbXSk6IFtUeXBlZEFycmF5LCBudW1iZXJbXSwgbnVtYmVyW11dIHtcbiAgY29uc3QgZGVuc2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0U2hhcGUpO1xuICBjb25zdCBubnogPSBpbnB1dEluZGljZXNTaGFwZVswXTtcbiAgY29uc3Qgb3V0cHV0UmFuayA9IHRhcmdldFNoYXBlLmxlbmd0aDtcblxuICAvLyBDb21wdXRlIHRoZSBvdXRwdXQgc2hhcGUuIERldGVybWluZSBwcm9kdWN0IG9mIHNwZWNpZmllZCBkaW1lbnNpb25zLCBhbmRcbiAgLy8gZmluZCB0aGUgaW5kZXggb2YgdGhlIHVuc3BlY2lmaWVkIG9uZS5cbiAgY29uc3Qgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIGxldCBwcm9kdWN0ID0gMTtcbiAgbGV0IHVua25vd25JbmRleCA9IC0xO1xuICBmb3IgKGxldCBkID0gMDsgZCA8IG91dHB1dFJhbms7ICsrZCkge1xuICAgIGNvbnN0IHNpemUgPSB0YXJnZXRTaGFwZVtkXTtcbiAgICBpZiAoc2l6ZSA9PT0gLTEpIHtcbiAgICAgIGlmICh1bmtub3duSW5kZXggIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbFxuICAgICAgICAgICAgICAgIC5nZXRTcGFyc2VSZXNoYXBlTXVsdGlwbGVOZWdhdGl2ZU9uZU91dHB1dERpbUVycm9yTWVzc2FnZShcbiAgICAgICAgICAgICAgICAgICAgdW5rbm93bkluZGV4LCBkKSk7XG4gICAgICB9XG4gICAgICB1bmtub3duSW5kZXggPSBkO1xuICAgICAgb3V0cHV0U2hhcGUucHVzaCgxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKHNpemUgPCAwKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VSZXNoYXBlTmVnYXRpdmVPdXRwdXREaW1FcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgZCwgc2l6ZSkpO1xuICAgICAgfVxuICAgICAgcHJvZHVjdCAqPSBzaXplO1xuICAgICAgb3V0cHV0U2hhcGUucHVzaChzaXplKTtcbiAgICB9XG4gIH1cbiAgaWYgKHVua25vd25JbmRleCAhPT0gLTEpIHtcbiAgICBpZiAocHJvZHVjdCA8PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldFNwYXJzZVJlc2hhcGVFbXB0eVRlbnNvclplcm9PdXRwdXREaW1FcnJvck1lc3NhZ2UoKSk7XG4gICAgfVxuICAgIGNvbnN0IG1pc3NpbmcgPSBNYXRoLnRydW5jKGRlbnNlU2l6ZSAvIHByb2R1Y3QpO1xuICAgIGlmIChwcm9kdWN0ICogbWlzc2luZyAhPT0gZGVuc2VTaXplKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldFNwYXJzZVJlc2hhcGVJbnB1dE91dHB1dE11bHRpcGxlRXJyb3JNZXNzYWdlKFxuICAgICAgICAgICAgICBpbnB1dFNoYXBlLCBvdXRwdXRTaGFwZSkpO1xuICAgIH1cblxuICAgIG91dHB1dFNoYXBlW3Vua25vd25JbmRleF0gPSBtaXNzaW5nO1xuICB9XG4gIGNvbnN0IG91dHB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0cHV0U2hhcGUpO1xuICBpZiAob3V0cHV0U2l6ZSAhPT0gZGVuc2VTaXplKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0U3BhcnNlUmVzaGFwZUlucHV0T3V0cHV0TWlzbWF0Y2hFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICBpbnB1dFNoYXBlLCBvdXRwdXRTaGFwZSkpO1xuICB9XG5cbiAgY29uc3QgaW5wdXRSYW5rID0gaW5wdXRTaGFwZS5sZW5ndGg7XG4gIGNvbnN0IGlucHV0U3RyaWRlczogbnVtYmVyW10gPSBbXTtcbiAgaWYgKGlucHV0UmFuayA+IDApIHtcbiAgICBpbnB1dFN0cmlkZXNbaW5wdXRSYW5rIC0gMV0gPSAxO1xuICAgIGZvciAobGV0IGQgPSBpbnB1dFJhbmsgLSAyOyBkID49IDA7IC0tZCkge1xuICAgICAgaW5wdXRTdHJpZGVzW2RdID0gaW5wdXRTdHJpZGVzW2QgKyAxXSAqIGlucHV0U2hhcGVbZCArIDFdO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IG91dHB1dFN0cmlkZXM6IG51bWJlcltdID0gW107XG4gIGlmIChvdXRwdXRSYW5rID4gMCkge1xuICAgIG91dHB1dFN0cmlkZXNbb3V0cHV0UmFuayAtIDFdID0gMTtcbiAgICBmb3IgKGxldCBkID0gb3V0cHV0UmFuayAtIDI7IGQgPj0gMDsgLS1kKSB7XG4gICAgICBvdXRwdXRTdHJpZGVzW2RdID0gb3V0cHV0U3RyaWRlc1tkICsgMV0gKiBvdXRwdXRTaGFwZVtkICsgMV07XG4gICAgfVxuICB9XG5cbiAgY29uc3QgbmV3SW5kaWNlcyA9XG4gICAgICB1dGlsLmdldEFycmF5RnJvbURUeXBlKGlucHV0RFR5cGUsIG5ueiAqIG91dHB1dFJhbmspIGFzIFR5cGVkQXJyYXk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbm56OyArK2kpIHtcbiAgICBsZXQgaWQgPSAwO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgaW5wdXRSYW5rOyArK2opIHtcbiAgICAgIC8vIGlucHV0SW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtubnosIGlucHV0UmFua11cbiAgICAgIGlkICs9IGlucHV0SW5kaWNlc1tpICogaW5wdXRSYW5rICsgal0gKiBpbnB1dFN0cmlkZXNbal07XG4gICAgfVxuICAgIGZvciAobGV0IGogPSAwOyBqIDwgb3V0cHV0UmFuazsgKytqKSB7XG4gICAgICAvLyBuZXdJbmRpY2VzIGlzIGEgMmQgdGVuc29yIHdpdGggc2hhcGUgb2YgW25ueiwgb3V0cHV0UmFua11cbiAgICAgIG5ld0luZGljZXNbaSAqIG91dHB1dFJhbmsgKyBqXSA9IE1hdGgudHJ1bmMoaWQgLyBvdXRwdXRTdHJpZGVzW2pdKTtcbiAgICAgIGlkICU9IG91dHB1dFN0cmlkZXNbal07XG4gICAgfVxuICB9XG4gIHJldHVybiBbbmV3SW5kaWNlcywgW25ueiwgb3V0cHV0UmFua10sIG91dHB1dFNoYXBlXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nexport function sparseSegmentReductionImpl(input, inputShape, inputDType, indices, segmentIds, isMean = false, defaultValue = 0) {\n    const numIndices = indices.length;\n    // Flatten the array to two dimensions\n    const inputFlat = [inputShape[0], input.length / inputShape[0]];\n    const numCol = inputFlat[1];\n    // Note that the current implementation assumes that segmentIds values are\n    // sorted.\n    const lastSegmentIdPlusOne = numIndices > 0 ? segmentIds[numIndices - 1] + 1 : 0;\n    const outputRows = lastSegmentIdPlusOne;\n    if (outputRows < 0) {\n        throw new Error(backend_util.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());\n    }\n    const outputShape = inputShape.slice();\n    outputShape[0] = outputRows;\n    const outputLength = outputShape.reduce((product, value) => product * value, 1);\n    // Output array is initialized with the value 0 by default.\n    const output = util.getArrayFromDType(inputDType, outputLength);\n    // Note that we do not initialize the output buffer with a default value, so\n    // we need to explicitly set missing indices to the default value.\n    if (numIndices === 0) {\n        if (outputRows > 0) {\n            output.fill(defaultValue);\n        }\n        return [output, outputShape];\n    }\n    if (outputRows <= 0) {\n        throw new Error(backend_util.getSparseSegmentReductionNegativeSegmentIdsErrorMessage());\n    }\n    let start = 0, end = 1;\n    // Index from which the output is not initialized.\n    let uninitializedIndex = 0;\n    let outIndex = segmentIds[start];\n    while (true) {\n        // We initialize nextIndex to 0 to avoid may be uninitialized warning\n        let nextIndex = 0;\n        if (end < numIndices) {\n            nextIndex = segmentIds[end];\n            if (outIndex === nextIndex) {\n                ++end;\n                continue;\n            }\n            // We have a new segment here.  Verify that the segment ids are growing.\n            if (outIndex >= nextIndex) {\n                throw new Error(backend_util\n                    .getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage());\n            }\n        }\n        if (outIndex < 0 || outIndex >= outputRows) {\n            throw new Error(backend_util.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage(outIndex, outputRows));\n        }\n        // If there is a gap between two indices, we need to set that gap to the\n        // default value.\n        if (outIndex > uninitializedIndex) {\n            output.fill(defaultValue, uninitializedIndex * numCol, outIndex * numCol);\n        }\n        for (let i = start; i < end; ++i) {\n            const index = indices[i];\n            if (index < 0 || index >= inputFlat[0]) {\n                throw new Error(backend_util.getSparseSegmentReductionIndicesOutOfRangeErrorMessage(i, indices[i], inputFlat[0]));\n            }\n            for (let j = 0; j < numCol; j++) {\n                output[outIndex * numCol + j] += input[index * numCol + j];\n            }\n        }\n        if (isMean) {\n            for (let j = 0; j < numCol; j++) {\n                output[outIndex * numCol + j] /= end - start;\n            }\n        }\n        start = end;\n        ++end;\n        uninitializedIndex = outIndex + 1;\n        outIndex = nextIndex;\n        if (end > numIndices) {\n            break;\n        }\n    }\n    // Fill the gap at the end with the default value.\n    if (uninitializedIndex < outputRows) {\n        output.fill(defaultValue, uninitializedIndex * numCol, outputRows * numCol);\n    }\n    return [output, outputShape];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudFJlZHVjdGlvbl9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBd0IsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0UsTUFBTSxVQUFVLDBCQUEwQixDQUN0QyxLQUFpQixFQUFFLFVBQW9CLEVBQUUsVUFBb0IsRUFDN0QsT0FBbUIsRUFBRSxVQUFzQixFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQzNELFlBQVksR0FBRyxDQUFDO0lBQ2xCLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUM7SUFFbEMsc0NBQXNDO0lBQ3RDLE1BQU0sU0FBUyxHQUFhLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxNQUFNLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUUsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzVCLDBFQUEwRTtJQUMxRSxVQUFVO0lBQ1YsTUFBTSxvQkFBb0IsR0FDdEIsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4RCxNQUFNLFVBQVUsR0FBRyxvQkFBb0IsQ0FBQztJQUV4QyxJQUFJLFVBQVUsR0FBRyxDQUFDLEVBQUU7UUFDbEIsTUFBTSxJQUFJLEtBQUssQ0FDWCxZQUFZLENBQUMsdURBQXVELEVBQUUsQ0FBQyxDQUFDO0tBQzdFO0lBRUQsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0lB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LE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDL0IsTUFBTSxDQUFDLFFBQVEsR0FBRyxNQUFNLEdBQUcsQ0FBQyxDQUFDLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQzthQUM5QztTQUNGO1FBRUQsS0FBSyxHQUFHLEdBQUcsQ0FBQztRQUNaLEVBQUUsR0FBRyxDQUFDO1FBQ04sa0JBQWtCLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQ3JCLElBQUksR0FBRyxHQUFHLFVBQVUsRUFBRTtZQUNwQixNQUFNO1NBQ1A7S0FDRjtJQUVELGtEQUFrRDtJQUNsRCxJQUFJLGtCQUFrQixHQUFHLFVBQVUsRUFBRTtRQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxrQkFBa0IsR0FBRyxNQUFNLEVBQUUsVUFBVSxHQUFHLE1BQU0sQ0FBQyxDQUFDO0tBQzdFO0lBRUQsT0FBTyxDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGF0YVR5cGUsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbChcbiAgICBpbnB1dDogVHlwZWRBcnJheSwgaW5wdXRTaGFwZTogbnVtYmVyW10sIGlucHV0RFR5cGU6IERhdGFUeXBlLFxuICAgIGluZGljZXM6IFR5cGVkQXJyYXksIHNlZ21lbnRJZHM6IFR5cGVkQXJyYXksIGlzTWVhbiA9IGZhbHNlLFxuICAgIGRlZmF1bHRWYWx1ZSA9IDApOiBbVHlwZWRBcnJheSwgbnVtYmVyW11dIHtcbiAgY29uc3QgbnVtSW5kaWNlcyA9IGluZGljZXMubGVuZ3RoO1xuXG4gIC8vIEZsYXR0ZW4gdGhlIGFycmF5IHRvIHR3byBkaW1lbnNpb25zXG4gIGNvbnN0IGlucHV0RmxhdDogbnVtYmVyW10gPSBbaW5wdXRTaGFwZVswXSwgaW5wdXQubGVuZ3RoIC8gaW5wdXRTaGFwZVswXV07XG4gIGNvbnN0IG51bUNvbCA9IGlucHV0RmxhdFsxXTtcbiAgLy8gTm90ZSB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIGFzc3VtZXMgdGhhdCBzZWdtZW50SWRzIHZhbHVlcyBhcmVcbiAgLy8gc29ydGVkLlxuICBjb25zdCBsYXN0U2VnbWVudElkUGx1c09uZSA9XG4gICAgICBudW1JbmRpY2VzID4gMCA/IHNlZ21lbnRJZHNbbnVtSW5kaWNlcyAtIDFdICsgMSA6IDA7XG4gIGNvbnN0IG91dHB1dFJvd3MgPSBsYXN0U2VnbWVudElkUGx1c09uZTtcblxuICBpZiAob3V0cHV0Um93cyA8IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uTmVnYXRpdmVTZWdtZW50SWRzRXJyb3JNZXNzYWdlKCkpO1xuICB9XG5cbiAgY29uc3Qgb3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlLnNsaWNlKCk7XG4gIG91dHB1dFNoYXBlWzBdID0gb3V0cHV0Um93cztcblxuICBjb25zdCBvdXRwdXRMZW5ndGggPVxuICAgICAgb3V0cHV0U2hhcGUucmVkdWNlKChwcm9kdWN0LCB2YWx1ZSkgPT4gcHJvZHVjdCAqIHZhbHVlLCAxKTtcbiAgLy8gT3V0cHV0IGFycmF5IGlzIGluaXRpYWxpemVkIHdpdGggdGhlIHZhbHVlIDAgYnkgZGVmYXVsdC5cbiAgY29uc3Qgb3V0cHV0ID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZShpbnB1dERUeXBlLCBvdXRwdXRMZW5ndGgpIGFzIFR5cGVkQXJyYXk7XG5cbiAgLy8gTm90ZSB0aGF0IHdlIGRvIG5vdCBpbml0aWFsaXplIHRoZSBvdXRwdXQgYnVmZmVyIHdpdGggYSBkZWZhdWx0IHZhbHVlLCBzb1xuICAvLyB3ZSBuZWVkIHRvIGV4cGxpY2l0bHkgc2V0IG1pc3NpbmcgaW5kaWNlcyB0byB0aGUgZGVmYXVsdCB2YWx1ZS5cbiAgaWYgKG51bUluZGljZXMgPT09IDApIHtcbiAgICBpZiAob3V0cHV0Um93cyA+IDApIHtcbiAgICAgIG91dHB1dC5maWxsKGRlZmF1bHRWYWx1ZSk7XG4gICAgfVxuICAgIHJldHVybiBbb3V0cHV0LCBvdXRwdXRTaGFwZV07XG4gIH1cblxuICBpZiAob3V0cHV0Um93cyA8PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0U3BhcnNlU2VnbWVudFJlZHVjdGlvbk5lZ2F0aXZlU2VnbWVudElkc0Vycm9yTWVzc2FnZSgpKTtcbiAgfVxuXG4gIGxldCBzdGFydCA9IDAsIGVuZCA9IDE7XG4gIC8vIEluZGV4IGZyb20gd2hpY2ggdGhlIG91dHB1dCBpcyBub3QgaW5pdGlhbGl6ZWQuXG4gIGxldCB1bmluaXRpYWxpemVkSW5kZXggPSAwO1xuICBsZXQgb3V0SW5kZXggPSBzZWdtZW50SWRzW3N0YXJ0XTtcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIC8vIFdlIGluaXRpYWxpemUgbmV4dEluZGV4IHRvIDAgdG8gYXZvaWQgbWF5IGJlIHVuaW5pdGlhbGl6ZWQgd2FybmluZ1xuICAgIGxldCBuZXh0SW5kZXggPSAwO1xuICAgIGlmIChlbmQgPCBudW1JbmRpY2VzKSB7XG4gICAgICBuZXh0SW5kZXggPSBzZWdtZW50SWRzW2VuZF07XG4gICAgICBpZiAob3V0SW5kZXggPT09IG5leHRJbmRleCkge1xuICAgICAgICArK2VuZDtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICAvLyBXZSBoYXZlIGEgbmV3IHNlZ21lbnQgaGVyZS4gIFZlcmlmeSB0aGF0IHRoZSBzZWdtZW50IGlkcyBhcmUgZ3Jvd2luZy5cbiAgICAgIGlmIChvdXRJbmRleCA+PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGJhY2tlbmRfdXRpbFxuICAgICAgICAgICAgLmdldFNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25Ob25JbmNyZWFzaW5nU2VnbWVudElkc0Vycm9yTWVzc2FnZSgpKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAob3V0SW5kZXggPCAwIHx8IG91dEluZGV4ID49IG91dHB1dFJvd3MpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0U3BhcnNlU2VnbWVudFJlZHVjdGlvblNlZ21lbnRJZE91dE9mUmFuZ2VFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgIG91dEluZGV4LCBvdXRwdXRSb3dzKSk7XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlcmUgaXMgYSBnYXAgYmV0d2VlbiB0d28gaW5kaWNlcywgd2UgbmVlZCB0byBzZXQgdGhhdCBnYXAgdG8gdGhlXG4gICAgLy8gZGVmYXVsdCB2YWx1ZS5cbiAgICBpZiAob3V0SW5kZXggPiB1bmluaXRpYWxpemVkSW5kZXgpIHtcbiAgICAgIG91dHB1dC5maWxsKGRlZmF1bHRWYWx1ZSwgdW5pbml0aWFsaXplZEluZGV4ICogbnVtQ29sLCBvdXRJbmRleCAqIG51bUNvbCk7XG4gICAgfVxuXG4gICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIGNvbnN0IGluZGV4ID0gaW5kaWNlc1tpXTtcbiAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gaW5wdXRGbGF0WzBdKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRTcGFyc2VTZWdtZW50UmVkdWN0aW9uSW5kaWNlc091dE9mUmFuZ2VFcnJvck1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgaSwgaW5kaWNlc1tpXSwgaW5wdXRGbGF0WzBdKSk7XG4gICAgICB9XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUNvbDsgaisrKSB7XG4gICAgICAgIG91dHB1dFtvdXRJbmRleCAqIG51bUNvbCArIGpdICs9IGlucHV0W2luZGV4ICogbnVtQ29sICsgal07XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGlzTWVhbikge1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBudW1Db2w7IGorKykge1xuICAgICAgICBvdXRwdXRbb3V0SW5kZXggKiBudW1Db2wgKyBqXSAvPSBlbmQgLSBzdGFydDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFydCA9IGVuZDtcbiAgICArK2VuZDtcbiAgICB1bmluaXRpYWxpemVkSW5kZXggPSBvdXRJbmRleCArIDE7XG4gICAgb3V0SW5kZXggPSBuZXh0SW5kZXg7XG4gICAgaWYgKGVuZCA+IG51bUluZGljZXMpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbGwgdGhlIGdhcCBhdCB0aGUgZW5kIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUuXG4gIGlmICh1bmluaXRpYWxpemVkSW5kZXggPCBvdXRwdXRSb3dzKSB7XG4gICAgb3V0cHV0LmZpbGwoZGVmYXVsdFZhbHVlLCB1bmluaXRpYWxpemVkSW5kZXggKiBudW1Db2wsIG91dHB1dFJvd3MgKiBudW1Db2wpO1xuICB9XG5cbiAgcmV0dXJuIFtvdXRwdXQsIG91dHB1dFNoYXBlXTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sqrt } from '@tensorflow/tfjs-core';\nimport { createSimpleUnaryImpl } from '../utils/unary_impl';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sqrtImpl = createSimpleUnaryImpl((xi) => Math.sqrt(xi));\nexport const sqrt = unaryKernelFunc(Sqrt, (xi) => Math.sqrt(xi));\nexport const sqrtConfig = {\n    kernelName: Sqrt,\n    backendName: 'cpu',\n    kernelFunc: sqrt,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3FydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDMUQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxxQkFBcUIsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNxcnR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlVW5hcnlJbXBsfSBmcm9tICcuLi91dGlscy91bmFyeV9pbXBsJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBzcXJ0SW1wbCA9IGNyZWF0ZVNpbXBsZVVuYXJ5SW1wbCgoeGkpID0+IE1hdGguc3FydCh4aSkpO1xuZXhwb3J0IGNvbnN0IHNxcnQgPSB1bmFyeUtlcm5lbEZ1bmMoU3FydCwgKHhpKSA9PiBNYXRoLnNxcnQoeGkpKTtcblxuZXhwb3J0IGNvbnN0IHNxcnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3FydCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzcXJ0LFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SquaredDifference } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const squaredDifferenceImpl = createSimpleBinaryKernelImpl(((a, b) => {\n    const diff = a - b;\n    return diff * diff;\n}));\nexport const squaredDifference = binaryKernelFunc(SquaredDifference, squaredDifferenceImpl);\nexport const squaredDifferenceConfig = {\n    kernelName: SquaredDifference,\n    backendName: 'cpu',\n    kernelFunc: squaredDifference\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlZERpZmZlcmVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NxdWFyZWREaWZmZXJlbmNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxpQkFBaUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUM5Qiw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFO0lBQ3JELE1BQU0sSUFBSSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDbkIsT0FBTyxJQUFJLEdBQUcsSUFBSSxDQUFDO0FBQ3JCLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FDMUIsZ0JBQWdCLENBQUMsaUJBQWlCLEVBQUUscUJBQXFCLENBQUMsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUI7SUFDbkQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsaUJBQWlCO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcXVhcmVkRGlmZmVyZW5jZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZUltcGwgPVxuICAgIGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKChhOiBudW1iZXIsIGI6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgZGlmZiA9IGEgLSBiO1xuICAgICAgcmV0dXJuIGRpZmYgKiBkaWZmO1xuICAgIH0pKTtcbmV4cG9ydCBjb25zdCBzcXVhcmVkRGlmZmVyZW5jZSA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyhTcXVhcmVkRGlmZmVyZW5jZSwgc3F1YXJlZERpZmZlcmVuY2VJbXBsKTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxdWFyZWREaWZmZXJlbmNlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNxdWFyZWREaWZmZXJlbmNlXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function stridedSliceImpl(outShape, xBuf, strides, begin) {\n    const outBuf = buffer(outShape, xBuf.dtype);\n    for (let i = 0; i < outBuf.size; i++) {\n        const loc = outBuf.indexToLoc(i);\n        const newLoc = new Array(loc.length);\n        for (let j = 0; j < newLoc.length; j++) {\n            newLoc[j] = loc[j] * strides[j] + begin[j];\n        }\n        outBuf.set(xBuf.get(...newLoc), ...loc);\n    }\n    return outBuf;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaWRlZFNsaWNlX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1N0cmlkZWRTbGljZV9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQXFCLE1BQU0sdUJBQXVCLENBQUM7QUFFakUsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixRQUFrQixFQUFFLElBQXFCLEVBQUUsT0FBaUIsRUFDNUQsS0FBZTtJQUNqQixNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUU1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNwQyxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRWpDLE1BQU0sTUFBTSxHQUFhLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFDRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsRUFBRSxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQ3pDO0lBRUQsT0FBTyxNQUF5QixDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YnVmZmVyLCBSYW5rLCBUZW5zb3JCdWZmZXJ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2VJbXBsPFIgZXh0ZW5kcyBSYW5rPihcbiAgICBvdXRTaGFwZTogbnVtYmVyW10sIHhCdWY6IFRlbnNvckJ1ZmZlcjxSPiwgc3RyaWRlczogbnVtYmVyW10sXG4gICAgYmVnaW46IG51bWJlcltdKTogVGVuc29yQnVmZmVyPFI+IHtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKG91dFNoYXBlLCB4QnVmLmR0eXBlKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG91dEJ1Zi5zaXplOyBpKyspIHtcbiAgICBjb25zdCBsb2MgPSBvdXRCdWYuaW5kZXhUb0xvYyhpKTtcblxuICAgIGNvbnN0IG5ld0xvYzogbnVtYmVyW10gPSBuZXcgQXJyYXkobG9jLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBuZXdMb2MubGVuZ3RoOyBqKyspIHtcbiAgICAgIG5ld0xvY1tqXSA9IGxvY1tqXSAqIHN0cmlkZXNbal0gKyBiZWdpbltqXTtcbiAgICB9XG4gICAgb3V0QnVmLnNldCh4QnVmLmdldCguLi5uZXdMb2MpLCAuLi5sb2MpO1xuICB9XG5cbiAgcmV0dXJuIG91dEJ1ZiBhcyBUZW5zb3JCdWZmZXI8Uj47XG59XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\n/**\n * The StringNGramsOp class creates ngrams from ragged string data.\n * The constructor contains all attributes related to the operation such as\n * padding widths and strings, and the compute function can be used to\n * compute the ngrams for different ragged tensor inputs.\n */\nclass StringNGramsOp {\n    constructor(separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences) {\n        this.separator = util.encodeString(separator);\n        this.nGramWidths = nGramWidths;\n        this.leftPad = util.encodeString(leftPad);\n        this.rightPad = util.encodeString(rightPad);\n        this.padWidth = padWidth;\n        this.preserveShort = preserveShortSequences;\n    }\n    getPadWidth(nGramWidth) {\n        // Ngrams can be padded with either a fixed pad width or a dynamic pad\n        // width depending on the 'padWidth' arg, but in no case should the padding\n        // ever be wider than 'nGramWidth' - 1.\n        return Math.min(this.padWidth < 0 ? nGramWidth - 1 : this.padWidth, nGramWidth - 1);\n    }\n    getNumNGrams(length, nGramWidth) {\n        const padWidth = this.getPadWidth(nGramWidth);\n        return Math.max(0, ((length + 2 * padWidth) - nGramWidth) + 1);\n    }\n    createNGrams(data, splitIndex, output, outputStartIndex, numNGrams, nGramWidth) {\n        for (let nGramIndex = 0; nGramIndex < numNGrams; ++nGramIndex) {\n            const padWidth = this.getPadWidth(nGramWidth);\n            const leftPadding = Math.max(0, padWidth - nGramIndex);\n            const rightPadding = Math.max(0, padWidth - (numNGrams - (nGramIndex + 1)));\n            const numTokens = nGramWidth - (leftPadding + rightPadding);\n            const dataStartIndex = splitIndex + (leftPadding > 0 ? 0 : nGramIndex - padWidth);\n            // Calculate the total expected size of the nGram so we can reserve the\n            // correct amount of space in the string.\n            let nGramSize = 0;\n            // Size of the left padding.\n            nGramSize += leftPadding * this.leftPad.length;\n            // Size of the tokens.\n            for (let n = 0; n < numTokens; ++n) {\n                nGramSize += data[dataStartIndex + n].length;\n            }\n            // Size of the right padding.\n            nGramSize += rightPadding * this.rightPad.length;\n            // Size of the separators.\n            const numSeparators = leftPadding + rightPadding + numTokens - 1;\n            nGramSize += numSeparators * this.separator.length;\n            // Build the nGram.\n            output[outputStartIndex + nGramIndex] = new Uint8Array(nGramSize);\n            const nGram = output[outputStartIndex + nGramIndex];\n            let nextNGramIndex = 0;\n            const appendToNGram = (str) => str.forEach((value) => nGram[nextNGramIndex++] = value);\n            for (let n = 0; n < leftPadding; ++n) {\n                appendToNGram(this.leftPad);\n                appendToNGram(this.separator);\n            }\n            // Only output first numTokens - 1 pairs of data and separator\n            for (let n = 0; n < numTokens - 1; ++n) {\n                appendToNGram(data[dataStartIndex + n]);\n                appendToNGram(this.separator);\n            }\n            // Handle case when there are no tokens or no right padding as these\n            // can result in consecutive separators.\n            if (numTokens > 0) {\n                // If we have tokens, then output last and then pair each separator\n                // with the right padding that follows, to ensure nGram ends either with\n                // the token or with the right pad.\n                appendToNGram(data[dataStartIndex + numTokens - 1]);\n                for (let n = 0; n < rightPadding; ++n) {\n                    appendToNGram(this.separator);\n                    appendToNGram(this.rightPad);\n                }\n            }\n            else {\n                // If we don't have tokens, then the last item inserted into the nGram\n                // has been the separator from the left padding loop above. Hence,\n                // output right pad and separator and make sure to finish with a\n                // padding, not a separator.\n                for (let n = 0; n < rightPadding - 1; ++n) {\n                    appendToNGram(this.rightPad);\n                    appendToNGram(this.separator);\n                }\n                appendToNGram(this.rightPad);\n            }\n        }\n    }\n    // Data and splits together form the definition of the ragged tensor,\n    // where data is 1 dimensional and contains the values of the tensor\n    // and splits denotes the indices at which each row starts.\n    compute(data, splits) {\n        // Validate that the splits are valid indices into data, only if there are\n        // splits specified.\n        const inputDataSize = data.length;\n        const splitsSize = splits.length;\n        if (splitsSize > 0) {\n            let prevSplit = splits[0];\n            if (prevSplit !== 0) {\n                throw new Error(`First split value must be 0, got ${prevSplit}`);\n            }\n            for (let i = 1; i < splitsSize; ++i) {\n                let validSplits = splits[i] >= prevSplit;\n                validSplits = validSplits && (splits[i] <= inputDataSize);\n                if (!validSplits) {\n                    throw new Error(`Invalid split value ${splits[i]}, must be in [${prevSplit}, ${inputDataSize}]`);\n                }\n                prevSplit = splits[i];\n            }\n            if (prevSplit !== inputDataSize) {\n                throw new Error(`Last split value must be data size. Expected ${inputDataSize}, got ${prevSplit}`);\n            }\n        }\n        const numBatchItems = splitsSize - 1;\n        const nGramsSplits = util.getArrayFromDType('int32', splitsSize);\n        // If there is no data or size, return an empty ragged tensor.\n        if (inputDataSize === 0 || splitsSize === 0) {\n            const empty = new Array(inputDataSize);\n            for (let i = 0; i <= numBatchItems; ++i) {\n                nGramsSplits[i] = 0;\n            }\n            return [empty, nGramsSplits];\n        }\n        nGramsSplits[0] = 0;\n        for (let i = 1; i <= numBatchItems; ++i) {\n            const length = splits[i] - splits[i - 1];\n            let numNGrams = 0;\n            this.nGramWidths.forEach((nGramWidth) => {\n                numNGrams += this.getNumNGrams(length, nGramWidth);\n            });\n            if (this.preserveShort && length > 0 && numNGrams === 0) {\n                numNGrams = 1;\n            }\n            nGramsSplits[i] = nGramsSplits[i - 1] + numNGrams;\n        }\n        const nGrams = new Array(nGramsSplits[numBatchItems]);\n        for (let i = 0; i < numBatchItems; ++i) {\n            const splitIndex = splits[i];\n            let outputStartIdx = nGramsSplits[i];\n            this.nGramWidths.forEach((nGramWidth) => {\n                const length = splits[i + 1] - splits[i];\n                const numNGrams = this.getNumNGrams(length, nGramWidth);\n                this.createNGrams(data, splitIndex, nGrams, outputStartIdx, numNGrams, nGramWidth);\n                outputStartIdx += numNGrams;\n            });\n            // If we're preserving short sequences, check to see if no sequence was\n            // generated by comparing the current output start idx to the original\n            // one (nGramSplitsdata). If no ngrams were generated, then they will\n            // be equal (since we increment outputStartIdx by numNGrams every\n            // time we create a set of ngrams.)\n            if (this.preserveShort && outputStartIdx === nGramsSplits[i]) {\n                const dataLength = splits[i + 1] - splits[i];\n                // One legitimate reason to not have any ngrams when this.preserveShort\n                // is true is if the sequence itself is empty. In that case, move on.\n                if (dataLength === 0) {\n                    continue;\n                }\n                // We don't have to worry about dynamic padding sizes here: if padding\n                // was dynamic, every sequence would have had sufficient padding to\n                // generate at least one nGram.\n                const nGramWidth = dataLength + 2 * this.padWidth;\n                const numNGrams = 1;\n                this.createNGrams(data, splitIndex, nGrams, outputStartIdx, numNGrams, nGramWidth);\n            }\n        }\n        return [nGrams, nGramsSplits];\n    }\n}\nexport function stringNGramsImpl(data, dataSplits, separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences) {\n    return new StringNGramsOp(separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences)\n        .compute(data, dataSplits);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nTkdyYW1zX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1N0cmluZ05HcmFtc19pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzQzs7Ozs7R0FLRztBQUNILE1BQU0sY0FBYztJQVFsQixZQUNJLFNBQWlCLEVBQUUsV0FBcUIsRUFBRSxPQUFlLEVBQ3pELFFBQWdCLEVBQUUsUUFBZ0IsRUFBRSxzQkFBK0I7UUFDckUsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxRQUFRLENBQUM7UUFDekIsSUFBSSxDQUFDLGFBQWEsR0FBRyxzQkFBc0IsQ0FBQztJQUM5QyxDQUFDO0lBRU8sV0FBVyxDQUFDLFVBQWtCO1FBQ3BDLHNFQUFzRTtRQUN0RSwyRUFBMkU7UUFDM0UsdUNBQXVDO1FBQ3ZDLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FDWCxJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUVPLFlBQVksQ0FBQyxNQUFjLEVBQUUsVUFBa0I7UUFDckQsTUFBTSxRQUFR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QVksQ0FBQyxDQUFDO0lBQ2hDLENBQUM7Q0FDRjtBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FDNUIsSUFBa0IsRUFBRSxVQUFzQixFQUFFLFNBQWlCLEVBQzdELFdBQXFCLEVBQUUsT0FBZSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0IsRUFDMUUsc0JBQStCO0lBQ2pDLE9BQU8sSUFBSSxjQUFjLENBQ2QsU0FBUyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFDbkQsc0JBQXNCLENBQUM7U0FDN0IsT0FBTyxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsQ0FBQztBQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbi8qKlxuICogVGhlIFN0cmluZ05HcmFtc09wIGNsYXNzIGNyZWF0ZXMgbmdyYW1zIGZyb20gcmFnZ2VkIHN0cmluZyBkYXRhLlxuICogVGhlIGNvbnN0cnVjdG9yIGNvbnRhaW5zIGFsbCBhdHRyaWJ1dGVzIHJlbGF0ZWQgdG8gdGhlIG9wZXJhdGlvbiBzdWNoIGFzXG4gKiBwYWRkaW5nIHdpZHRocyBhbmQgc3RyaW5ncywgYW5kIHRoZSBjb21wdXRlIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvXG4gKiBjb21wdXRlIHRoZSBuZ3JhbXMgZm9yIGRpZmZlcmVudCByYWdnZWQgdGVuc29yIGlucHV0cy5cbiAqL1xuY2xhc3MgU3RyaW5nTkdyYW1zT3Age1xuICBwcml2YXRlIHNlcGFyYXRvcjogVWludDhBcnJheTtcbiAgcHJpdmF0ZSBuR3JhbVdpZHRoczogbnVtYmVyW107XG4gIHByaXZhdGUgcGFkV2lkdGg6IG51bWJlcjtcbiAgcHJpdmF0ZSBsZWZ0UGFkOiBVaW50OEFycmF5O1xuICBwcml2YXRlIHJpZ2h0UGFkOiBVaW50OEFycmF5O1xuICBwcml2YXRlIHByZXNlcnZlU2hvcnQ6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBzZXBhcmF0b3I6IHN0cmluZywgbkdyYW1XaWR0aHM6IG51bWJlcltdLCBsZWZ0UGFkOiBzdHJpbmcsXG4gICAgICByaWdodFBhZDogc3RyaW5nLCBwYWRXaWR0aDogbnVtYmVyLCBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzOiBib29sZWFuKSB7XG4gICAgdGhpcy5zZXBhcmF0b3IgPSB1dGlsLmVuY29kZVN0cmluZyhzZXBhcmF0b3IpO1xuICAgIHRoaXMubkdyYW1XaWR0aHMgPSBuR3JhbVdpZHRocztcbiAgICB0aGlzLmxlZnRQYWQgPSB1dGlsLmVuY29kZVN0cmluZyhsZWZ0UGFkKTtcbiAgICB0aGlzLnJpZ2h0UGFkID0gdXRpbC5lbmNvZGVTdHJpbmcocmlnaHRQYWQpO1xuICAgIHRoaXMucGFkV2lkdGggPSBwYWRXaWR0aDtcbiAgICB0aGlzLnByZXNlcnZlU2hvcnQgPSBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQYWRXaWR0aChuR3JhbVdpZHRoOiBudW1iZXIpIHtcbiAgICAvLyBOZ3JhbXMgY2FuIGJlIHBhZGRlZCB3aXRoIGVpdGhlciBhIGZpeGVkIHBhZCB3aWR0aCBvciBhIGR5bmFtaWMgcGFkXG4gICAgLy8gd2lkdGggZGVwZW5kaW5nIG9uIHRoZSAncGFkV2lkdGgnIGFyZywgYnV0IGluIG5vIGNhc2Ugc2hvdWxkIHRoZSBwYWRkaW5nXG4gICAgLy8gZXZlciBiZSB3aWRlciB0aGFuICduR3JhbVdpZHRoJyAtIDEuXG4gICAgcmV0dXJuIE1hdGgubWluKFxuICAgICAgICB0aGlzLnBhZFdpZHRoIDwgMCA/IG5HcmFtV2lkdGggLSAxIDogdGhpcy5wYWRXaWR0aCwgbkdyYW1XaWR0aCAtIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROdW1OR3JhbXMobGVuZ3RoOiBudW1iZXIsIG5HcmFtV2lkdGg6IG51bWJlcikge1xuICAgIGNvbnN0IHBhZFdpZHRoID0gdGhpcy5nZXRQYWRXaWR0aChuR3JhbVdpZHRoKTtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgKChsZW5ndGggKyAyICogcGFkV2lkdGgpIC0gbkdyYW1XaWR0aCkgKyAxKTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlTkdyYW1zKFxuICAgICAgZGF0YTogVWludDhBcnJheVtdLCBzcGxpdEluZGV4OiBudW1iZXIsIG91dHB1dDogVWludDhBcnJheVtdLFxuICAgICAgb3V0cHV0U3RhcnRJbmRleDogbnVtYmVyLCBudW1OR3JhbXM6IG51bWJlciwgbkdyYW1XaWR0aDogbnVtYmVyKSB7XG4gICAgZm9yIChsZXQgbkdyYW1JbmRleCA9IDA7IG5HcmFtSW5kZXggPCBudW1OR3JhbXM7ICsrbkdyYW1JbmRleCkge1xuICAgICAgY29uc3QgcGFkV2lkdGggPSB0aGlzLmdldFBhZFdpZHRoKG5HcmFtV2lkdGgpO1xuICAgICAgY29uc3QgbGVmdFBhZGRpbmcgPSBNYXRoLm1heCgwLCBwYWRXaWR0aCAtIG5HcmFtSW5kZXgpO1xuICAgICAgY29uc3QgcmlnaHRQYWRkaW5nID1cbiAgICAgICAgICBNYXRoLm1heCgwLCBwYWRXaWR0aCAtIChudW1OR3JhbXMgLSAobkdyYW1JbmRleCArIDEpKSk7XG4gICAgICBjb25zdCBudW1Ub2tlbnMgPSBuR3JhbVdpZHRoIC0gKGxlZnRQYWRkaW5nICsgcmlnaHRQYWRkaW5nKTtcbiAgICAgIGNvbnN0IGRhdGFTdGFydEluZGV4ID1cbiAgICAgICAgICBzcGxpdEluZGV4ICsgKGxlZnRQYWRkaW5nID4gMCA/IDAgOiBuR3JhbUluZGV4IC0gcGFkV2lkdGgpO1xuXG4gICAgICAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIGV4cGVjdGVkIHNpemUgb2YgdGhlIG5HcmFtIHNvIHdlIGNhbiByZXNlcnZlIHRoZVxuICAgICAgLy8gY29ycmVjdCBhbW91bnQgb2Ygc3BhY2UgaW4gdGhlIHN0cmluZy5cbiAgICAgIGxldCBuR3JhbVNpemUgPSAwO1xuICAgICAgLy8gU2l6ZSBvZiB0aGUgbGVmdCBwYWRkaW5nLlxuICAgICAgbkdyYW1TaXplICs9IGxlZnRQYWRkaW5nICogdGhpcy5sZWZ0UGFkLmxlbmd0aDtcbiAgICAgIC8vIFNpemUgb2YgdGhlIHRva2Vucy5cbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbnVtVG9rZW5zOyArK24pIHtcbiAgICAgICAgbkdyYW1TaXplICs9IGRhdGFbZGF0YVN0YXJ0SW5kZXggKyBuXS5sZW5ndGg7XG4gICAgICB9XG4gICAgICAvLyBTaXplIG9mIHRoZSByaWdodCBwYWRkaW5nLlxuICAgICAgbkdyYW1TaXplICs9IHJpZ2h0UGFkZGluZyAqIHRoaXMucmlnaHRQYWQubGVuZ3RoO1xuICAgICAgLy8gU2l6ZSBvZiB0aGUgc2VwYXJhdG9ycy5cbiAgICAgIGNvbnN0IG51bVNlcGFyYXRvcnMgPSBsZWZ0UGFkZGluZyArIHJpZ2h0UGFkZGluZyArIG51bVRva2VucyAtIDE7XG4gICAgICBuR3JhbVNpemUgKz0gbnVtU2VwYXJhdG9ycyAqIHRoaXMuc2VwYXJhdG9yLmxlbmd0aDtcblxuICAgICAgLy8gQnVpbGQgdGhlIG5HcmFtLlxuICAgICAgb3V0cHV0W291dHB1dFN0YXJ0SW5kZXggKyBuR3JhbUluZGV4XSA9IG5ldyBVaW50OEFycmF5KG5HcmFtU2l6ZSk7XG4gICAgICBjb25zdCBuR3JhbSA9IG91dHB1dFtvdXRwdXRTdGFydEluZGV4ICsgbkdyYW1JbmRleF07XG5cbiAgICAgIGxldCBuZXh0TkdyYW1JbmRleCA9IDA7XG4gICAgICBjb25zdCBhcHBlbmRUb05HcmFtID0gKHN0cjogVWludDhBcnJheSkgPT5cbiAgICAgICAgICBzdHIuZm9yRWFjaCgodmFsdWUpID0+IG5HcmFtW25leHROR3JhbUluZGV4KytdID0gdmFsdWUpO1xuXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IGxlZnRQYWRkaW5nOyArK24pIHtcbiAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLmxlZnRQYWQpO1xuICAgICAgICBhcHBlbmRUb05HcmFtKHRoaXMuc2VwYXJhdG9yKTtcbiAgICAgIH1cbiAgICAgIC8vIE9ubHkgb3V0cHV0IGZpcnN0IG51bVRva2VucyAtIDEgcGFpcnMgb2YgZGF0YSBhbmQgc2VwYXJhdG9yXG4gICAgICBmb3IgKGxldCBuID0gMDsgbiA8IG51bVRva2VucyAtIDE7ICsrbikge1xuICAgICAgICBhcHBlbmRUb05HcmFtKGRhdGFbZGF0YVN0YXJ0SW5kZXggKyBuXSk7XG4gICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgfVxuICAgICAgLy8gSGFuZGxlIGNhc2Ugd2hlbiB0aGVyZSBhcmUgbm8gdG9rZW5zIG9yIG5vIHJpZ2h0IHBhZGRpbmcgYXMgdGhlc2VcbiAgICAgIC8vIGNhbiByZXN1bHQgaW4gY29uc2VjdXRpdmUgc2VwYXJhdG9ycy5cbiAgICAgIGlmIChudW1Ub2tlbnMgPiAwKSB7XG4gICAgICAgIC8vIElmIHdlIGhhdmUgdG9rZW5zLCB0aGVuIG91dHB1dCBsYXN0IGFuZCB0aGVuIHBhaXIgZWFjaCBzZXBhcmF0b3JcbiAgICAgICAgLy8gd2l0aCB0aGUgcmlnaHQgcGFkZGluZyB0aGF0IGZvbGxvd3MsIHRvIGVuc3VyZSBuR3JhbSBlbmRzIGVpdGhlciB3aXRoXG4gICAgICAgIC8vIHRoZSB0b2tlbiBvciB3aXRoIHRoZSByaWdodCBwYWQuXG4gICAgICAgIGFwcGVuZFRvTkdyYW0oZGF0YVtkYXRhU3RhcnRJbmRleCArIG51bVRva2VucyAtIDFdKTtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCByaWdodFBhZGRpbmc7ICsrbikge1xuICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5zZXBhcmF0b3IpO1xuICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdG9rZW5zLCB0aGVuIHRoZSBsYXN0IGl0ZW0gaW5zZXJ0ZWQgaW50byB0aGUgbkdyYW1cbiAgICAgICAgLy8gaGFzIGJlZW4gdGhlIHNlcGFyYXRvciBmcm9tIHRoZSBsZWZ0IHBhZGRpbmcgbG9vcCBhYm92ZS4gSGVuY2UsXG4gICAgICAgIC8vIG91dHB1dCByaWdodCBwYWQgYW5kIHNlcGFyYXRvciBhbmQgbWFrZSBzdXJlIHRvIGZpbmlzaCB3aXRoIGFcbiAgICAgICAgLy8gcGFkZGluZywgbm90IGEgc2VwYXJhdG9yLlxuICAgICAgICBmb3IgKGxldCBuID0gMDsgbiA8IHJpZ2h0UGFkZGluZyAtIDE7ICsrbikge1xuICAgICAgICAgIGFwcGVuZFRvTkdyYW0odGhpcy5yaWdodFBhZCk7XG4gICAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnNlcGFyYXRvcik7XG4gICAgICAgIH1cbiAgICAgICAgYXBwZW5kVG9OR3JhbSh0aGlzLnJpZ2h0UGFkKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBEYXRhIGFuZCBzcGxpdHMgdG9nZXRoZXIgZm9ybSB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgcmFnZ2VkIHRlbnNvcixcbiAgLy8gd2hlcmUgZGF0YSBpcyAxIGRpbWVuc2lvbmFsIGFuZCBjb250YWlucyB0aGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3JcbiAgLy8gYW5kIHNwbGl0cyBkZW5vdGVzIHRoZSBpbmRpY2VzIGF0IHdoaWNoIGVhY2ggcm93IHN0YXJ0cy5cbiAgcHVibGljIGNvbXB1dGUoZGF0YTogVWludDhBcnJheVtdLCBzcGxpdHM6IEludDMyQXJyYXkpOlxuICAgICAgW1VpbnQ4QXJyYXlbXSwgSW50MzJBcnJheV0ge1xuICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIHNwbGl0cyBhcmUgdmFsaWQgaW5kaWNlcyBpbnRvIGRhdGEsIG9ubHkgaWYgdGhlcmUgYXJlXG4gICAgLy8gc3BsaXRzIHNwZWNpZmllZC5cbiAgICBjb25zdCBpbnB1dERhdGFTaXplID0gZGF0YS5sZW5ndGg7XG4gICAgY29uc3Qgc3BsaXRzU2l6ZSA9IHNwbGl0cy5sZW5ndGg7XG4gICAgaWYgKHNwbGl0c1NpemUgPiAwKSB7XG4gICAgICBsZXQgcHJldlNwbGl0ID0gc3BsaXRzWzBdO1xuICAgICAgaWYgKHByZXZTcGxpdCAhPT0gMCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZpcnN0IHNwbGl0IHZhbHVlIG11c3QgYmUgMCwgZ290ICR7cHJldlNwbGl0fWApO1xuICAgICAgfVxuICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdHNTaXplOyArK2kpIHtcbiAgICAgICAgbGV0IHZhbGlkU3BsaXRzID0gc3BsaXRzW2ldID49IHByZXZTcGxpdDtcbiAgICAgICAgdmFsaWRTcGxpdHMgPSB2YWxpZFNwbGl0cyAmJiAoc3BsaXRzW2ldIDw9IGlucHV0RGF0YVNpemUpO1xuICAgICAgICBpZiAoIXZhbGlkU3BsaXRzKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNwbGl0IHZhbHVlICR7c3BsaXRzW2ldfSwgbXVzdCBiZSBpbiBbJHtcbiAgICAgICAgICAgICAgcHJldlNwbGl0fSwgJHtpbnB1dERhdGFTaXplfV1gKTtcbiAgICAgICAgfVxuICAgICAgICBwcmV2U3BsaXQgPSBzcGxpdHNbaV07XG4gICAgICB9XG4gICAgICBpZiAocHJldlNwbGl0ICE9PSBpbnB1dERhdGFTaXplKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgTGFzdCBzcGxpdCB2YWx1ZSBtdXN0IGJlIGRhdGEgc2l6ZS4gRXhwZWN0ZWQgJHtcbiAgICAgICAgICAgIGlucHV0RGF0YVNpemV9LCBnb3QgJHtwcmV2U3BsaXR9YCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgbnVtQmF0Y2hJdGVtcyA9IHNwbGl0c1NpemUgLSAxO1xuICAgIGNvbnN0IG5HcmFtc1NwbGl0cyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgc3BsaXRzU2l6ZSk7XG4gICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBvciBzaXplLCByZXR1cm4gYW4gZW1wdHkgcmFnZ2VkIHRlbnNvci5cbiAgICBpZiAoaW5wdXREYXRhU2l6ZSA9PT0gMCB8fCBzcGxpdHNTaXplID09PSAwKSB7XG4gICAgICBjb25zdCBlbXB0eTogVWludDhBcnJheVtdID0gbmV3IEFycmF5KGlucHV0RGF0YVNpemUpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICAgIG5HcmFtc1NwbGl0c1tpXSA9IDA7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2VtcHR5LCBuR3JhbXNTcGxpdHNdO1xuICAgIH1cblxuICAgIG5HcmFtc1NwbGl0c1swXSA9IDA7XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBzcGxpdHNbaV0gLSBzcGxpdHNbaSAtIDFdO1xuICAgICAgbGV0IG51bU5HcmFtcyA9IDA7XG4gICAgICB0aGlzLm5HcmFtV2lkdGhzLmZvckVhY2goKG5HcmFtV2lkdGgpID0+IHtcbiAgICAgICAgbnVtTkdyYW1zICs9IHRoaXMuZ2V0TnVtTkdyYW1zKGxlbmd0aCwgbkdyYW1XaWR0aCk7XG4gICAgICB9KTtcbiAgICAgIGlmICh0aGlzLnByZXNlcnZlU2hvcnQgJiYgbGVuZ3RoID4gMCAmJiBudW1OR3JhbXMgPT09IDApIHtcbiAgICAgICAgbnVtTkdyYW1zID0gMTtcbiAgICAgIH1cbiAgICAgIG5HcmFtc1NwbGl0c1tpXSA9IG5HcmFtc1NwbGl0c1tpIC0gMV0gKyBudW1OR3JhbXM7XG4gICAgfVxuXG4gICAgY29uc3QgbkdyYW1zOiBVaW50OEFycmF5W10gPSBuZXcgQXJyYXkobkdyYW1zU3BsaXRzW251bUJhdGNoSXRlbXNdKTtcblxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtQmF0Y2hJdGVtczsgKytpKSB7XG4gICAgICBjb25zdCBzcGxpdEluZGV4ID0gc3BsaXRzW2ldO1xuICAgICAgbGV0IG91dHB1dFN0YXJ0SWR4ID0gbkdyYW1zU3BsaXRzW2ldO1xuICAgICAgdGhpcy5uR3JhbVdpZHRocy5mb3JFYWNoKChuR3JhbVdpZHRoKSA9PiB7XG4gICAgICAgIGNvbnN0IGxlbmd0aCA9IHNwbGl0c1tpICsgMV0gLSBzcGxpdHNbaV07XG4gICAgICAgIGNvbnN0IG51bU5HcmFtcyA9IHRoaXMuZ2V0TnVtTkdyYW1zKGxlbmd0aCwgbkdyYW1XaWR0aCk7XG4gICAgICAgIHRoaXMuY3JlYXRlTkdyYW1zKFxuICAgICAgICAgICAgZGF0YSwgc3BsaXRJbmRleCwgbkdyYW1zLCBvdXRwdXRTdGFydElkeCwgbnVtTkdyYW1zLCBuR3JhbVdpZHRoKTtcbiAgICAgICAgb3V0cHV0U3RhcnRJZHggKz0gbnVtTkdyYW1zO1xuICAgICAgfSk7XG4gICAgICAvLyBJZiB3ZSdyZSBwcmVzZXJ2aW5nIHNob3J0IHNlcXVlbmNlcywgY2hlY2sgdG8gc2VlIGlmIG5vIHNlcXVlbmNlIHdhc1xuICAgICAgLy8gZ2VuZXJhdGVkIGJ5IGNvbXBhcmluZyB0aGUgY3VycmVudCBvdXRwdXQgc3RhcnQgaWR4IHRvIHRoZSBvcmlnaW5hbFxuICAgICAgLy8gb25lIChuR3JhbVNwbGl0c2RhdGEpLiBJZiBubyBuZ3JhbXMgd2VyZSBnZW5lcmF0ZWQsIHRoZW4gdGhleSB3aWxsXG4gICAgICAvLyBiZSBlcXVhbCAoc2luY2Ugd2UgaW5jcmVtZW50IG91dHB1dFN0YXJ0SWR4IGJ5IG51bU5HcmFtcyBldmVyeVxuICAgICAgLy8gdGltZSB3ZSBjcmVhdGUgYSBzZXQgb2YgbmdyYW1zLilcbiAgICAgIGlmICh0aGlzLnByZXNlcnZlU2hvcnQgJiYgb3V0cHV0U3RhcnRJZHggPT09IG5HcmFtc1NwbGl0c1tpXSkge1xuICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gc3BsaXRzW2kgKyAxXSAtIHNwbGl0c1tpXTtcbiAgICAgICAgLy8gT25lIGxlZ2l0aW1hdGUgcmVhc29uIHRvIG5vdCBoYXZlIGFueSBuZ3JhbXMgd2hlbiB0aGlzLnByZXNlcnZlU2hvcnRcbiAgICAgICAgLy8gaXMgdHJ1ZSBpcyBpZiB0aGUgc2VxdWVuY2UgaXRzZWxmIGlzIGVtcHR5LiBJbiB0aGF0IGNhc2UsIG1vdmUgb24uXG4gICAgICAgIGlmIChkYXRhTGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBkeW5hbWljIHBhZGRpbmcgc2l6ZXMgaGVyZTogaWYgcGFkZGluZ1xuICAgICAgICAvLyB3YXMgZHluYW1pYywgZXZlcnkgc2VxdWVuY2Ugd291bGQgaGF2ZSBoYWQgc3VmZmljaWVudCBwYWRkaW5nIHRvXG4gICAgICAgIC8vIGdlbmVyYXRlIGF0IGxlYXN0IG9uZSBuR3JhbS5cbiAgICAgICAgY29uc3QgbkdyYW1XaWR0aCA9IGRhdGFMZW5ndGggKyAyICogdGhpcy5wYWRXaWR0aDtcbiAgICAgICAgY29uc3QgbnVtTkdyYW1zID0gMTtcbiAgICAgICAgdGhpcy5jcmVhdGVOR3JhbXMoXG4gICAgICAgICAgICBkYXRhLCBzcGxpdEluZGV4LCBuR3JhbXMsIG91dHB1dFN0YXJ0SWR4LCBudW1OR3JhbXMsIG5HcmFtV2lkdGgpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW25HcmFtcywgbkdyYW1zU3BsaXRzXTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zSW1wbChcbiAgICBkYXRhOiBVaW50OEFycmF5W10sIGRhdGFTcGxpdHM6IEludDMyQXJyYXksIHNlcGFyYXRvcjogc3RyaW5nLFxuICAgIG5HcmFtV2lkdGhzOiBudW1iZXJbXSwgbGVmdFBhZDogc3RyaW5nLCByaWdodFBhZDogc3RyaW5nLCBwYWRXaWR0aDogbnVtYmVyLFxuICAgIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXM6IGJvb2xlYW4pOiBbVWludDhBcnJheVtdLCBJbnQzMkFycmF5XSB7XG4gIHJldHVybiBuZXcgU3RyaW5nTkdyYW1zT3AoXG4gICAgICAgICAgICAgc2VwYXJhdG9yLCBuR3JhbVdpZHRocywgbGVmdFBhZCwgcmlnaHRQYWQsIHBhZFdpZHRoLFxuICAgICAgICAgICAgIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpXG4gICAgICAuY29tcHV0ZShkYXRhLCBkYXRhU3BsaXRzKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nfunction split(str, delimiters, skipEmpty, result) {\n    if (!str.length) {\n        return;\n    }\n    // When the delimiter is empty, the input is split into individual characters.\n    if (delimiters.length === 0) {\n        for (let i = 0; i < str.length; ++i) {\n            result.push(str.subarray(i, i + 1));\n        }\n        return;\n    }\n    // When there is one delimiter, the input is split only at that delimiter.\n    if (delimiters.length === 1) {\n        const delimiter = delimiters[0];\n        let f = str.indexOf(delimiter);\n        while (f !== -1) {\n            const token = str.subarray(0, f);\n            if (!skipEmpty || token.length !== 0) {\n                result.push(token);\n            }\n            str = str.subarray(f + 1);\n            f = str.indexOf(delimiter);\n        }\n        if (!skipEmpty || str.length !== 0) {\n            result.push(str);\n        }\n        return;\n    }\n    // When there are multiple delimiters, the input is split at every instance\n    // one of the delimiters appears.\n    let tokenStart = 0;\n    for (let i = 0; i < str.length + 1; i++) {\n        if ((i === str.length) || (delimiters.indexOf(str[i]) !== -1)) {\n            const token = str.subarray(tokenStart, i);\n            if (!skipEmpty || token.length !== 0) {\n                result.push(token);\n            }\n            tokenStart = i + 1;\n        }\n    }\n}\nexport function stringSplitImpl(input, delimiter, skipEmpty) {\n    const batchSize = input.length;\n    // Empty delimiter means split the input character by character.\n    const tokens = [];\n    let outputSize = 0;\n    let maxNumEntries = 0;\n    const numIndices = new Array(batchSize);\n    for (let i = 0; i < batchSize; ++i) {\n        const prevTokensLength = tokens.length;\n        split(input[i], delimiter, skipEmpty, tokens);\n        const nEntries = tokens.length - prevTokensLength;\n        numIndices[i] = nEntries;\n        outputSize += nEntries;\n        maxNumEntries = Math.max(maxNumEntries, nEntries);\n    }\n    const indices = util.getArrayFromDType('int32', outputSize * 2);\n    const values = new Array(outputSize);\n    const shape = [batchSize, maxNumEntries];\n    let c = 0;\n    for (let i = 0; i < batchSize; ++i) {\n        for (let j = 0; j < numIndices[i]; ++j) {\n            // indices is a 2d tensor with shape of [outputSize, 2]\n            indices[c * 2] = i;\n            indices[c * 2 + 1] = j;\n            values[c] = tokens[c];\n            ++c;\n        }\n    }\n    return [indices, values, shape];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nU3BsaXRfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3RyaW5nU3BsaXRfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsU0FBUyxLQUFLLENBQ1YsR0FBZSxFQUFFLFVBQXNCLEVBQUUsU0FBa0IsRUFDM0QsTUFBb0I7SUFDdEIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUU7UUFDZixPQUFPO0tBQ1I7SUFDRCw4RUFBOEU7SUFDOUUsSUFBSSxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsT0FBTztLQUNSO0lBQ0QsMEVBQTBFO0lBQzFFLElBQUksVUFBVSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDM0IsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDL0IsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUU7WUFDZixNQUFNLEtBQUssR0FBRyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUNqQyxJQUFJLENBQUMsU0FBUyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNwQyxN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LENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbkIsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsRUFBRSxDQUFDLENBQUM7U0FDTDtLQUNGO0lBRUQsT0FBTyxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDbEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5mdW5jdGlvbiBzcGxpdChcbiAgICBzdHI6IFVpbnQ4QXJyYXksIGRlbGltaXRlcnM6IFVpbnQ4QXJyYXksIHNraXBFbXB0eTogYm9vbGVhbixcbiAgICByZXN1bHQ6IFVpbnQ4QXJyYXlbXSk6IHZvaWQge1xuICBpZiAoIXN0ci5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gV2hlbiB0aGUgZGVsaW1pdGVyIGlzIGVtcHR5LCB0aGUgaW5wdXQgaXMgc3BsaXQgaW50byBpbmRpdmlkdWFsIGNoYXJhY3RlcnMuXG4gIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCA9PT0gMCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgICByZXN1bHQucHVzaChzdHIuc3ViYXJyYXkoaSwgaSArIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIC8vIFdoZW4gdGhlcmUgaXMgb25lIGRlbGltaXRlciwgdGhlIGlucHV0IGlzIHNwbGl0IG9ubHkgYXQgdGhhdCBkZWxpbWl0ZXIuXG4gIGlmIChkZWxpbWl0ZXJzLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IGRlbGltaXRlciA9IGRlbGltaXRlcnNbMF07XG4gICAgbGV0IGYgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgIHdoaWxlIChmICE9PSAtMSkge1xuICAgICAgY29uc3QgdG9rZW4gPSBzdHIuc3ViYXJyYXkoMCwgZik7XG4gICAgICBpZiAoIXNraXBFbXB0eSB8fCB0b2tlbi5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVzdWx0LnB1c2godG9rZW4pO1xuICAgICAgfVxuICAgICAgc3RyID0gc3RyLnN1YmFycmF5KGYgKyAxKTtcbiAgICAgIGYgPSBzdHIuaW5kZXhPZihkZWxpbWl0ZXIpO1xuICAgIH1cbiAgICBpZiAoIXNraXBFbXB0eSB8fCBzdHIubGVuZ3RoICE9PSAwKSB7XG4gICAgICByZXN1bHQucHVzaChzdHIpO1xuICAgIH1cbiAgICByZXR1cm47XG4gIH1cbiAgLy8gV2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUgZGVsaW1pdGVycywgdGhlIGlucHV0IGlzIHNwbGl0IGF0IGV2ZXJ5IGluc3RhbmNlXG4gIC8vIG9uZSBvZiB0aGUgZGVsaW1pdGVycyBhcHBlYXJzLlxuICBsZXQgdG9rZW5TdGFydCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCArIDE7IGkrKykge1xuICAgIGlmICgoaSA9PT0gc3RyLmxlbmd0aCkgfHwgKGRlbGltaXRlcnMuaW5kZXhPZihzdHJbaV0pICE9PSAtMSkpIHtcbiAgICAgIGNvbnN0IHRva2VuID0gc3RyLnN1YmFycmF5KHRva2VuU3RhcnQsIGkpO1xuICAgICAgaWYgKCFza2lwRW1wdHkgfHwgdG9rZW4ubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKHRva2VuKTtcbiAgICAgIH1cbiAgICAgIHRva2VuU3RhcnQgPSBpICsgMTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0SW1wbChcbiAgICBpbnB1dDogVWludDhBcnJheVtdLCBkZWxpbWl0ZXI6IFVpbnQ4QXJyYXksXG4gICAgc2tpcEVtcHR5OiBib29sZWFuKTogW1R5cGVkQXJyYXksIFVpbnQ4QXJyYXlbXSwgW251bWJlciwgbnVtYmVyXV0ge1xuICBjb25zdCBiYXRjaFNpemUgPSBpbnB1dC5sZW5ndGg7XG5cbiAgLy8gRW1wdHkgZGVsaW1pdGVyIG1lYW5zIHNwbGl0IHRoZSBpbnB1dCBjaGFyYWN0ZXIgYnkgY2hhcmFjdGVyLlxuICBjb25zdCB0b2tlbnM6IFVpbnQ4QXJyYXlbXSA9IFtdO1xuXG4gIGxldCBvdXRwdXRTaXplID0gMDtcbiAgbGV0IG1heE51bUVudHJpZXMgPSAwO1xuICBjb25zdCBudW1JbmRpY2VzOiBudW1iZXJbXSA9IG5ldyBBcnJheShiYXRjaFNpemUpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGJhdGNoU2l6ZTsgKytpKSB7XG4gICAgY29uc3QgcHJldlRva2Vuc0xlbmd0aCA9IHRva2Vucy5sZW5ndGg7XG4gICAgc3BsaXQoaW5wdXRbaV0sIGRlbGltaXRlciwgc2tpcEVtcHR5LCB0b2tlbnMpO1xuICAgIGNvbnN0IG5FbnRyaWVzID0gdG9rZW5zLmxlbmd0aCAtIHByZXZUb2tlbnNMZW5ndGg7XG4gICAgbnVtSW5kaWNlc1tpXSA9IG5FbnRyaWVzO1xuICAgIG91dHB1dFNpemUgKz0gbkVudHJpZXM7XG4gICAgbWF4TnVtRW50cmllcyA9IE1hdGgubWF4KG1heE51bUVudHJpZXMsIG5FbnRyaWVzKTtcbiAgfVxuXG4gIGNvbnN0IGluZGljZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIG91dHB1dFNpemUgKiAyKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB2YWx1ZXM6IFVpbnQ4QXJyYXlbXSA9IG5ldyBBcnJheShvdXRwdXRTaXplKTtcbiAgY29uc3Qgc2hhcGU6IFtudW1iZXIsIG51bWJlcl0gPSBbYmF0Y2hTaXplLCBtYXhOdW1FbnRyaWVzXTtcblxuICBsZXQgYyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyArK2kpIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG51bUluZGljZXNbaV07ICsraikge1xuICAgICAgLy8gaW5kaWNlcyBpcyBhIDJkIHRlbnNvciB3aXRoIHNoYXBlIG9mIFtvdXRwdXRTaXplLCAyXVxuICAgICAgaW5kaWNlc1tjICogMl0gPSBpO1xuICAgICAgaW5kaWNlc1tjICogMiArIDFdID0gajtcbiAgICAgIHZhbHVlc1tjXSA9IHRva2Vuc1tjXTtcbiAgICAgICsrYztcbiAgICB9XG4gIH1cblxuICByZXR1cm4gW2luZGljZXMsIHZhbHVlcywgc2hhcGVdO1xufVxuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport function stringToHashBucketFastImpl(input, numBuckets) {\n    const output = util.getArrayFromDType('int32', input.length);\n    for (let i = 0; i < input.length; ++i) {\n        output[i] =\n            util.fingerPrint64(input[i]).modulo(numBuckets).getLowBitsUnsigned();\n    }\n    return output;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nVG9IYXNoQnVja2V0RmFzdF9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0X2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFhLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sVUFBVSwwQkFBMEIsQ0FDdEMsS0FBbUIsRUFBRSxVQUFrQjtJQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUUzRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNyQyxNQUFNLENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztLQUMxRTtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsKFxuICAgIGlucHV0OiBVaW50OEFycmF5W10sIG51bUJ1Y2tldHM6IG51bWJlcik6IFR5cGVkQXJyYXkge1xuICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIGlucHV0Lmxlbmd0aCkgYXMgVHlwZWRBcnJheTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGlucHV0Lmxlbmd0aDsgKytpKSB7XG4gICAgb3V0cHV0W2ldID1cbiAgICAgICAgdXRpbC5maW5nZXJQcmludDY0KGlucHV0W2ldKS5tb2R1bG8obnVtQnVja2V0cykuZ2V0TG93Qml0c1Vuc2lnbmVkKCk7XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sub } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc, createComplexBinaryKernelImpl } from '../utils/binary_utils';\nexport const subImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => aValue - bValue));\nexport const subComplexImpl = createComplexBinaryKernelImpl(((aReal, aImag, bReal, bImag) => {\n    return { real: aReal - bReal, imag: aImag - bImag };\n}));\nexport const sub = binaryKernelFunc(Sub, subImpl, subComplexImpl);\nexport const subConfig = {\n    kernelName: Sub,\n    backendName: 'cpu',\n    kernelFunc: sub\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdWIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSw2QkFBNkIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXRGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyw0QkFBNEIsQ0FDL0MsQ0FBQyxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0FBQzNELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FDdkIsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQzVELE9BQU8sRUFBQyxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxHQUFHLEtBQUssRUFBQyxDQUFDO0FBQ3BELENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDUixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsQ0FBQztBQUVsRSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFN1Yn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmMsIGNyZWF0ZUNvbXBsZXhCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3Qgc3ViSW1wbCA9IGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoXG4gICAgKChhVmFsdWU6IG51bWJlciwgYlZhbHVlOiBudW1iZXIpID0+IGFWYWx1ZSAtIGJWYWx1ZSkpO1xuZXhwb3J0IGNvbnN0IHN1YkNvbXBsZXhJbXBsID1cbiAgICBjcmVhdGVDb21wbGV4QmluYXJ5S2VybmVsSW1wbCgoKGFSZWFsLCBhSW1hZywgYlJlYWwsIGJJbWFnKSA9PiB7XG4gICAgICByZXR1cm4ge3JlYWw6IGFSZWFsIC0gYlJlYWwsIGltYWc6IGFJbWFnIC0gYkltYWd9O1xuICAgIH0pKTtcbmV4cG9ydCBjb25zdCBzdWIgPSBiaW5hcnlLZXJuZWxGdW5jKFN1Yiwgc3ViSW1wbCwgc3ViQ29tcGxleEltcGwpO1xuXG5leHBvcnQgY29uc3Qgc3ViQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1YixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdWJcbn07XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\n/**\n * An implementation of the tile kernel shared between webgl and cpu for string\n * tensors only.\n */\nexport function tileImpl(xBuf, reps) {\n    const newShape = new Array(xBuf.rank);\n    for (let i = 0; i < newShape.length; i++) {\n        newShape[i] = xBuf.shape[i] * reps[i];\n    }\n    const result = buffer(newShape, xBuf.dtype);\n    for (let i = 0; i < result.values.length; ++i) {\n        const newLoc = result.indexToLoc(i);\n        const originalLoc = new Array(xBuf.rank);\n        for (let j = 0; j < originalLoc.length; j++) {\n            originalLoc[j] = newLoc[j] % xBuf.shape[j];\n        }\n        const originalIndex = xBuf.locToIndex(originalLoc);\n        result.values[i] = xBuf.values[originalIndex];\n    }\n    return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlsZV9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9UaWxlX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBK0IsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRTs7O0dBR0c7QUFFSCxNQUFNLFVBQVUsUUFBUSxDQUNwQixJQUErQixFQUMvQixJQUFjO0lBQ2hCLE1BQU0sUUFBUSxHQUFhLElBQUksS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDdkM7SUFDRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDN0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVwQyxNQUFNLFdBQVcsR0FBYSxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVDO1FBRUQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuRCxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsYUFBYSxDQUFDLENBQUM7S0FDL0M7SUFDRCxPQUFPLE1BQW1DLENBQUM7QUFDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtidWZmZXIsIERhdGFUeXBlLCBSYW5rLCBUZW5zb3JCdWZmZXJ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbi8qKlxuICogQW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIHRpbGUga2VybmVsIHNoYXJlZCBiZXR3ZWVuIHdlYmdsIGFuZCBjcHUgZm9yIHN0cmluZ1xuICogdGVuc29ycyBvbmx5LlxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlSW1wbDxSIGV4dGVuZHMgUmFuaz4oXG4gICAgeEJ1ZjogVGVuc29yQnVmZmVyPFIsIERhdGFUeXBlPixcbiAgICByZXBzOiBudW1iZXJbXSk6IFRlbnNvckJ1ZmZlcjxSLCBEYXRhVHlwZT4ge1xuICBjb25zdCBuZXdTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoeEJ1Zi5yYW5rKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld1NoYXBlW2ldID0geEJ1Zi5zaGFwZVtpXSAqIHJlcHNbaV07XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYnVmZmVyKG5ld1NoYXBlLCB4QnVmLmR0eXBlKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQudmFsdWVzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgbmV3TG9jID0gcmVzdWx0LmluZGV4VG9Mb2MoaSk7XG5cbiAgICBjb25zdCBvcmlnaW5hbExvYzogbnVtYmVyW10gPSBuZXcgQXJyYXkoeEJ1Zi5yYW5rKTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9yaWdpbmFsTG9jLmxlbmd0aDsgaisrKSB7XG4gICAgICBvcmlnaW5hbExvY1tqXSA9IG5ld0xvY1tqXSAlIHhCdWYuc2hhcGVbal07XG4gICAgfVxuXG4gICAgY29uc3Qgb3JpZ2luYWxJbmRleCA9IHhCdWYubG9jVG9JbmRleChvcmlnaW5hbExvYyk7XG5cbiAgICByZXN1bHQudmFsdWVzW2ldID0geEJ1Zi52YWx1ZXNbb3JpZ2luYWxJbmRleF07XG4gIH1cbiAgcmV0dXJuIHJlc3VsdCBhcyBUZW5zb3JCdWZmZXI8UiwgRGF0YVR5cGU+O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/** An implementation of the TopK kernel shared between webgl and cpu. */\nimport { buffer, util } from '@tensorflow/tfjs-core';\nconst comparePair = (a, b) => {\n    const valueDiff = b.value - a.value;\n    return valueDiff === 0 ? a.index - b.index : valueDiff;\n};\n/**\n * Partitions array where all elements smaller than the (k+1) smallest element\n * are found to the left of it, and all larger to the right of it.\n * Based on the Floyd-Rivest Algorithm, ref:\n * https://en.wikipedia.org/wiki/Floyd%E2%80%93Rivest_algorithm\n * @param array: Array to partition\n * @param left: Left index for the interval\n * @param right: Right index for the interval\n * @param k: Desired index value, where array[k] is the (k+1)th smallest element\n *           when left = 0\n */\nfunction select(array, k, left = 0, right = array.length - 1) {\n    while (right > left) {\n        // Use select recursively to sample a smaller set of size s\n        // the arbitrary constants 600 and 0.5 are used in the original\n        // version to minimize execution time.\n        if (right - left > 600) {\n            const n = right - left + 1;\n            const i = k - left + 1;\n            const z = Math.log(n);\n            const s = 0.5 * Math.exp(2 * z / 3);\n            const sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * Math.sign(i - n / 2);\n            const newLeft = Math.max(left, Math.floor(k - i * s / n + sd));\n            const newRight = Math.min(right, Math.floor(k + (n - i) * s / n + sd));\n            select(array, k, newLeft, newRight);\n        }\n        // partition the elements between left and right around t\n        const t = array[k];\n        let i = left;\n        let j = right;\n        util.swap(array, left, k);\n        if (comparePair(array[right], t) > 0) {\n            util.swap(array, left, right);\n        }\n        while (i < j) {\n            util.swap(array, i, j);\n            i++;\n            j--;\n            while (comparePair(array[i], t) < 0) {\n                i = i + 1;\n            }\n            while (comparePair(array[j], t) > 0) {\n                j = j - 1;\n            }\n        }\n        if (comparePair(array[left], t) === 0) {\n            util.swap(array, left, j);\n        }\n        else {\n            j = j + 1;\n            util.swap(array, j, right);\n        }\n        // Adjust left and right towards the boundaries of the subset\n        // containing the (k - left + 1)th smallest element.\n        if (j <= k) {\n            left = j + 1;\n        }\n        if (k <= j) {\n            right = j - 1;\n        }\n    }\n}\nexport function topKImpl(x, xShape, xDtype, k, sorted) {\n    // Reshape into a 2d tensor [batch, lastDim] and compute topk along lastDim.\n    const lastDim = xShape[xShape.length - 1];\n    const [batch, size] = [x.length / lastDim, lastDim];\n    const allTopKVals = util.getTypedArrayFromDType(xDtype, batch * k);\n    const allTopKIndices = util.getTypedArrayFromDType('int32', batch * k);\n    for (let b = 0; b < batch; b++) {\n        const offset = b * size;\n        const vals = x.subarray(offset, offset + size);\n        let valAndInd = new Array(vals.length);\n        vals.forEach((value, index) => valAndInd[index] = { value, index });\n        if (k < valAndInd.length) {\n            select(valAndInd, k);\n            valAndInd = valAndInd.slice(0, k);\n        }\n        if (sorted) {\n            valAndInd.sort(comparePair);\n        }\n        const outOffset = b * k;\n        const topKVals = allTopKVals.subarray(outOffset, outOffset + k);\n        const topKIndices = allTopKIndices.subarray(outOffset, outOffset + k);\n        for (let i = 0; i < k; i++) {\n            topKVals[i] = valAndInd[i].value;\n            topKIndices[i] = valAndInd[i].index;\n        }\n    }\n    // Reshape back to the original input shape, except that the last\n    // dimension is k.\n    const outputShape = xShape.slice();\n    outputShape[outputShape.length - 1] = k;\n    return [\n        buffer(outputShape, xDtype, allTopKVals),\n        buffer(outputShape, 'int32', allTopKIndices)\n    ];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wS19pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Ub3BLX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgseUVBQXlFO0FBRXpFLE9BQU8sRUFBQyxNQUFNLEVBQXFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBT3RILE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBTyxFQUFFLENBQU8sRUFBRSxFQUFFO0lBQ3ZDLE1BQU0sU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUNwQyxPQUFPLFNBQVMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQ3pELENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7O0dBVUc7QUFDSCxTQUFTLE1BQU0sQ0FBQyxLQUFhLEVBQUUsQ0FBUyxFQUFFLElBQUksR0FBRyxDQUFDLEVBQUUsS0FBSyxHQUFHLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztJQUMxRSxPQUFPLEtBQUssR0FBRyxJQUFJLEVBQUU7UUFDbkIsMkRBQTJEO1FBQzNELCtEQUErRDtRQUMvRCxzQ0FBc0M7UUFDdEMsSUFBSSxLQUFLLEdBQUcsSUFBSSxHQUFHLEdBQUcsRUFBRTtZQUN0QixNQUFNLENBQUMsR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUMzQixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN2QixNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFD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QUcsV0FBVyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFCLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ2pDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1NBQ3JDO0tBQ0Y7SUFDRCxpRUFBaUU7SUFDakUsa0JBQWtCO0lBQ2xCLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNuQyxXQUFXLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFeEMsT0FBTztRQUNMLE1BQU0sQ0FBQyxXQUEwQixFQUFFLE1BQU0sRUFBRSxXQUFXLENBQUM7UUFDdkQsTUFBTSxDQUFDLFdBQTBCLEVBQUUsT0FBTyxFQUFFLGNBQWMsQ0FBQztLQUM1RCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLyoqIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBUb3BLIGtlcm5lbCBzaGFyZWQgYmV0d2VlbiB3ZWJnbCBhbmQgY3B1LiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgTnVtZXJpY0RhdGFUeXBlLCBSYW5rLCBTaGFwZU1hcCwgVGVuc29yLCBUZW5zb3JCdWZmZXIsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbnR5cGUgUGFpciA9IHtcbiAgdmFsdWU6IG51bWJlcixcbiAgaW5kZXg6IG51bWJlclxufTtcblxuY29uc3QgY29tcGFyZVBhaXIgPSAoYTogUGFpciwgYjogUGFpcikgPT4ge1xuICBjb25zdCB2YWx1ZURpZmYgPSBiLnZhbHVlIC0gYS52YWx1ZTtcbiAgcmV0dXJuIHZhbHVlRGlmZiA9PT0gMCA/IGEuaW5kZXggLSBiLmluZGV4IDogdmFsdWVEaWZmO1xufTtcblxuLyoqXG4gKiBQYXJ0aXRpb25zIGFycmF5IHdoZXJlIGFsbCBlbGVtZW50cyBzbWFsbGVyIHRoYW4gdGhlIChrKzEpIHNtYWxsZXN0IGVsZW1lbnRcbiAqIGFyZSBmb3VuZCB0byB0aGUgbGVmdCBvZiBpdCwgYW5kIGFsbCBsYXJnZXIgdG8gdGhlIHJpZ2h0IG9mIGl0LlxuICogQmFzZWQgb24gdGhlIEZsb3lkLVJpdmVzdCBBbGdvcml0aG0sIHJlZjpcbiAqIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zsb3lkJUUyJTgwJTkzUml2ZXN0X2FsZ29yaXRobVxuICogQHBhcmFtIGFycmF5OiBBcnJheSB0byBwYXJ0aXRpb25cbiAqIEBwYXJhbSBsZWZ0OiBMZWZ0IGluZGV4IGZvciB0aGUgaW50ZXJ2YWxcbiAqIEBwYXJhbSByaWdodDogUmlnaHQgaW5kZXggZm9yIHRoZSBpbnRlcnZhbFxuICogQHBhcmFtIGs6IERlc2lyZWQgaW5kZXggdmFsdWUsIHdoZXJlIGFycmF5W2tdIGlzIHRoZSAoaysxKXRoIHNtYWxsZXN0IGVsZW1lbnRcbiAqICAgICAgICAgICB3aGVuIGxlZnQgPSAwXG4gKi9cbmZ1bmN0aW9uIHNlbGVjdChhcnJheTogUGFpcltdLCBrOiBudW1iZXIsIGxlZnQgPSAwLCByaWdodCA9IGFycmF5Lmxlbmd0aCAtIDEpIHtcbiAgd2hpbGUgKHJpZ2h0ID4gbGVmdCkge1xuICAgIC8vIFVzZSBzZWxlY3QgcmVjdXJzaXZlbHkgdG8gc2FtcGxlIGEgc21hbGxlciBzZXQgb2Ygc2l6ZSBzXG4gICAgLy8gdGhlIGFyYml0cmFyeSBjb25zdGFudHMgNjAwIGFuZCAwLjUgYXJlIHVzZWQgaW4gdGhlIG9yaWdpbmFsXG4gICAgLy8gdmVyc2lvbiB0byBtaW5pbWl6ZSBleGVjdXRpb24gdGltZS5cbiAgICBpZiAocmlnaHQgLSBsZWZ0ID4gNjAwKSB7XG4gICAgICBjb25zdCBuID0gcmlnaHQgLSBsZWZ0ICsgMTtcbiAgICAgIGNvbnN0IGkgPSBrIC0gbGVmdCArIDE7XG4gICAgICBjb25zdCB6ID0gTWF0aC5sb2cobik7XG4gICAgICBjb25zdCBzID0gMC41ICogTWF0aC5leHAoMiAqIHogLyAzKTtcbiAgICAgIGNvbnN0IHNkID0gMC41ICogTWF0aC5zcXJ0KHogKiBzICogKG4gLSBzKSAvIG4pICogTWF0aC5zaWduKGkgLSBuIC8gMik7XG4gICAgICBjb25zdCBuZXdMZWZ0ID0gTWF0aC5tYXgobGVmdCwgTWF0aC5mbG9vcihrIC0gaSAqIHMgLyBuICsgc2QpKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0ID0gTWF0aC5taW4ocmlnaHQsIE1hdGguZmxvb3IoayArIChuIC0gaSkgKiBzIC8gbiArIHNkKSk7XG4gICAgICBzZWxlY3QoYXJyYXksIGssIG5ld0xlZnQsIG5ld1JpZ2h0KTtcbiAgICB9XG4gICAgLy8gcGFydGl0aW9uIHRoZSBlbGVtZW50cyBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IGFyb3VuZCB0XG4gICAgY29uc3QgdCA9IGFycmF5W2tdO1xuICAgIGxldCBpID0gbGVmdDtcbiAgICBsZXQgaiA9IHJpZ2h0O1xuXG4gICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCBrKTtcblxuICAgIGlmIChjb21wYXJlUGFpcihhcnJheVtyaWdodF0sIHQpID4gMCkge1xuICAgICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCByaWdodCk7XG4gICAgfVxuICAgIHdoaWxlIChpIDwgaikge1xuICAgICAgdXRpbC5zd2FwKGFycmF5LCBpLCBqKTtcbiAgICAgIGkrKztcbiAgICAgIGotLTtcbiAgICAgIHdoaWxlIChjb21wYXJlUGFpcihhcnJheVtpXSwgdCkgPCAwKSB7XG4gICAgICAgIGkgPSBpICsgMTtcbiAgICAgIH1cbiAgICAgIHdoaWxlIChjb21wYXJlUGFpcihhcnJheVtqXSwgdCkgPiAwKSB7XG4gICAgICAgIGogPSBqIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGNvbXBhcmVQYWlyKGFycmF5W2xlZnRdLCB0KSA9PT0gMCkge1xuICAgICAgdXRpbC5zd2FwKGFycmF5LCBsZWZ0LCBqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaiA9IGogKyAxO1xuICAgICAgdXRpbC5zd2FwKGFycmF5LCBqLCByaWdodCk7XG4gICAgfVxuICAgIC8vIEFkanVzdCBsZWZ0IGFuZCByaWdodCB0b3dhcmRzIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBzdWJzZXRcbiAgICAvLyBjb250YWluaW5nIHRoZSAoayAtIGxlZnQgKyAxKXRoIHNtYWxsZXN0IGVsZW1lbnQuXG4gICAgaWYgKGogPD0gaykge1xuICAgICAgbGVmdCA9IGogKyAxO1xuICAgIH1cbiAgICBpZiAoayA8PSBqKSB7XG4gICAgICByaWdodCA9IGogLSAxO1xuICAgIH1cbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9wS0ltcGw8VCBleHRlbmRzIFRlbnNvciwgUiBleHRlbmRzIFJhbms+KFxuICAgIHg6IFR5cGVkQXJyYXksIHhTaGFwZTogbnVtYmVyW10sIHhEdHlwZTogTnVtZXJpY0RhdGFUeXBlLCBrOiBudW1iZXIsXG4gICAgc29ydGVkOiBib29sZWFuKTpcbiAgICBbVGVuc29yQnVmZmVyPFIsIE51bWVyaWNEYXRhVHlwZT4sIFRlbnNvckJ1ZmZlcjxSLCAnaW50MzInPl0ge1xuICAvLyBSZXNoYXBlIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXSBhbmQgY29tcHV0ZSB0b3BrIGFsb25nIGxhc3REaW0uXG4gIGNvbnN0IGxhc3REaW0gPSB4U2hhcGVbeFNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCBbYmF0Y2gsIHNpemVdID0gW3gubGVuZ3RoIC8gbGFzdERpbSwgbGFzdERpbV07XG4gIGNvbnN0IGFsbFRvcEtWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKHhEdHlwZSwgYmF0Y2ggKiBrKTtcbiAgY29uc3QgYWxsVG9wS0luZGljZXMgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2ludDMyJywgYmF0Y2ggKiBrKTtcblxuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICBjb25zdCBvZmZzZXQgPSBiICogc2l6ZTtcbiAgICBjb25zdCB2YWxzID0geC5zdWJhcnJheShvZmZzZXQsIG9mZnNldCArIHNpemUpO1xuXG4gICAgbGV0IHZhbEFuZEluZDogUGFpcltdID0gbmV3IEFycmF5KHZhbHMubGVuZ3RoKTtcbiAgICB2YWxzLmZvckVhY2goXG4gICAgICAgICh2YWx1ZTogbnVtYmVyLCBpbmRleDogbnVtYmVyKSA9PiB2YWxBbmRJbmRbaW5kZXhdID0ge3ZhbHVlLCBpbmRleH0pO1xuXG4gICAgaWYgKGsgPCB2YWxBbmRJbmQubGVuZ3RoKSB7XG4gICAgICBzZWxlY3QodmFsQW5kSW5kLCBrKTtcbiAgICAgIHZhbEFuZEluZCA9IHZhbEFuZEluZC5zbGljZSgwLCBrKTtcbiAgICB9XG5cbiAgICBpZiAoc29ydGVkKSB7XG4gICAgICB2YWxBbmRJbmQuc29ydChjb21wYXJlUGFpcik7XG4gICAgfVxuICAgIFxuICAgIGNvbnN0IG91dE9mZnNldCA9IGIgKiBrO1xuICAgIGNvbnN0IHRvcEtWYWxzID0gYWxsVG9wS1ZhbHMuc3ViYXJyYXkob3V0T2Zmc2V0LCBvdXRPZmZzZXQgKyBrKTtcbiAgICBjb25zdCB0b3BLSW5kaWNlcyA9IGFsbFRvcEtJbmRpY2VzLnN1YmFycmF5KG91dE9mZnNldCwgb3V0T2Zmc2V0ICsgayk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrOyBpKyspIHtcbiAgICAgIHRvcEtWYWxzW2ldID0gdmFsQW5kSW5kW2ldLnZhbHVlO1xuICAgICAgdG9wS0luZGljZXNbaV0gPSB2YWxBbmRJbmRbaV0uaW5kZXg7XG4gICAgfVxuICB9XG4gIC8vIFJlc2hhcGUgYmFjayB0byB0aGUgb3JpZ2luYWwgaW5wdXQgc2hhcGUsIGV4Y2VwdCB0aGF0IHRoZSBsYXN0XG4gIC8vIGRpbWVuc2lvbiBpcyBrLlxuICBjb25zdCBvdXRwdXRTaGFwZSA9IHhTaGFwZS5zbGljZSgpO1xuICBvdXRwdXRTaGFwZVtvdXRwdXRTaGFwZS5sZW5ndGggLSAxXSA9IGs7XG5cbiAgcmV0dXJuIFtcbiAgICBidWZmZXIob3V0cHV0U2hhcGUgYXMgU2hhcGVNYXBbUl0sIHhEdHlwZSwgYWxsVG9wS1ZhbHMpLFxuICAgIGJ1ZmZlcihvdXRwdXRTaGFwZSBhcyBTaGFwZU1hcFtSXSwgJ2ludDMyJywgYWxsVG9wS0luZGljZXMpXG4gIF07XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { TensorBuffer, util } from '@tensorflow/tfjs-core';\nexport function uniqueImpl(values, axis, shape, dtype) {\n    // Normalize and validate axis.\n    const $axis = util.parseAxisParam(axis, shape)[0];\n    // Calculate the new shape that is suitable for extracting data along the\n    // given axis.\n    //\n    // The rank is 3.\n    // The size of the 1st dimension is the size of all the axes < the given axis.\n    // The size of the 2nd dimension is the same as the size of the given axis.\n    // The size of the 3rd dimension is the size of all the axes > the given axis.\n    //\n    // For example, for a 4D tensor with shape=[2, 3, 5, 4] and axis=2, the\n    // newShape would be: [2*3, 5, 4].\n    //\n    // Note that this is not the final output shape. This will be the shape for an\n    // intermediate TensorBuffer (see inputBuffer below) to allow us to extract\n    // values along the given axis. To demonstrate how it works, consider the\n    // following example:\n    //\n    // Input: a 3D tensor, with shape [1, 2, 3]\n    // [\n    //   [\n    //      [1,2,3],\n    //      [4,5,6]\n    //   ]\n    // ]\n    // Axis: 2 (the last axis).\n    // Along axis 2, we expect to extract 3 tensors: [1,4], [2,5], [3,6].\n    //\n    // For this example, newShape would be: [2, 3, 1], where 2 is calculated from\n    // 1*2. The re-shaped data would look like:\n    //\n    // [\n    //   [\n    //     [1], [2], [3]\n    //   ],\n    //   [\n    //     [4], [5], [6]\n    //   ]\n    // ]\n    //\n    // Then, we can construct a 3-level nested loop by the following dimension\n    // order to extract the values along the axis (dimension1):\n    // i: dimension1       // 0,1,2 (newShape[1])\n    //   m: dimension0     // 0,1   (newShape[0])\n    //     n: dimension2   // 0     (newShape[2])\n    //\n    //                       m, i, n\n    //                      ---------\n    // Iteration 0: data at [0, 0, 0] => \"1\"\n    // Iteration 1: data at [1, 0, 0] => \"4\"\n    // We got [1,4].\n    // Iteration 2: data at [0, 1, 0] => \"2\"\n    // Iteration 3: data at [1, 1, 0] => \"5\"\n    // We got [2,5].\n    // Iteration 4: data at [0, 2, 0] => \"3\"\n    // Iteration 5: data at [1, 2, 0] => \"6\"\n    // We got [3,6].\n    const newShape = [1, shape[0], 1];\n    for (let i = 0; i < $axis; i++) {\n        newShape[0] *= shape[i];\n    }\n    newShape[1] = shape[$axis];\n    for (let i = $axis + 1; i < shape.length; i++) {\n        newShape[2] *= shape[i];\n    }\n    // A map from unique elements (their string representations) to their values\n    // in \"indices\" (below).\n    const uniqueElements = {};\n    // The indices of each unique element in the original tensor along the given\n    // axis. It is 1D and has the same size as the given axis.\n    const indices = new Int32Array(shape[$axis]);\n    // Create a buffer so we can easily extract value at a given location.\n    const inputBuffer = new TensorBuffer(newShape, dtype, values);\n    // The indices along the given axis that have unique elements. This is a\n    // de-duped version of \"indices\" above.\n    const uniqueIndices = [];\n    const is1DTensor = newShape[0] === 1 && newShape[2] === 1;\n    for (let i = 0; i < shape[$axis]; i++) {\n        // Extract values along the axis.\n        let element;\n        if (is1DTensor) {\n            // Fast path for 1D tensor input.\n            element = values[i].toString();\n        }\n        else {\n            const axisValues = [];\n            for (let m = 0; m < newShape[0]; m++) {\n                for (let n = 0; n < newShape[2]; n++) {\n                    axisValues.push(inputBuffer.get(m, i, n));\n                }\n            }\n            element = axisValues.join(',');\n        }\n        // Dedup and update various indices.\n        if (uniqueElements[element] !== undefined) {\n            indices[i] = uniqueElements[element];\n        }\n        else {\n            const uniqueIndex = Object.keys(uniqueElements).length;\n            uniqueElements[element] = uniqueIndex;\n            indices[i] = uniqueIndex;\n            uniqueIndices.push(i);\n        }\n    }\n    // Now we know where each of the unique elements are located along the axis\n    // (uniqueIndices). Extract them from input buffer and store them in the\n    // output buffer.\n    const outputTmpShape = newShape.slice();\n    outputTmpShape[1] = Object.keys(uniqueElements).length;\n    const outputBuffer = new TensorBuffer(outputTmpShape, dtype);\n    uniqueIndices.forEach((uniqueElementIndex, i) => {\n        for (let m = 0; m < newShape[0]; m++) {\n            for (let n = 0; n < newShape[2]; n++) {\n                outputBuffer.set(inputBuffer.get(m, uniqueElementIndex, n), m, i, n);\n            }\n        }\n    });\n    // The output shape can be calculated from the input shape with the size of\n    // the given axis replaced by the number of unique elements along that axis.\n    const outputShape = shape.slice();\n    outputShape[$axis] = outputTmpShape[1];\n    return {\n        outputValues: outputBuffer.values,\n        outputShape,\n        indices,\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pcXVlX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1VuaXF1ZV9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMEIsWUFBWSxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTlGLE1BQU0sVUFBVSxVQUFVLENBQ3RCLE1BQXFCLEVBQUUsSUFBWSxFQUFFLEtBQWUsRUFBRSxLQUFlO0lBS3ZFLCtCQUErQjtJQUMvQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVsRCx5RUFBeUU7SUFDekUsY0FBYztJQUNkLEVBQUU7SUFDRixpQkFBaUI7SUFDakIsOEVBQThFO0lBQzlFLDJFQUEyRTtJQUMzRSw4RUFBOEU7SUFDOUUsRUFBRTtJQUNGLHVFQUF1RTtJQUN2RSxrQ0FBa0M7SUFDbEMsRUFBRTtJQUNGLDhFQUE4RTtJQUM5RSwyRUFBMkU7SUFDM0UseUVBQXlFO0lBQ3pFLHFCQUFxQjtJQUNyQixFQUFFO0lBQ0YsMkNBQTJDO0lBQzNDLElBQUk7SUFDSixNQUFNO0lBQ04sZ0JBQWdCO0lBQ2hCLGVBQWU7SUFDZixNQUFNO0lBQ04sSUFBSTtJQUNKLDJCQUEyQjtJQUMzQixxRUFBcUU7SUFDckUsRUFBRTtJQUNGLDZFQUE2RTtJQUM3RSwyQ0FBMkM7SUFDM0MsRUFBRTtJQUNGLElBQUk7SUFDSixNQUFNO0lBQ04sb0JBQW9CO0lBQ3BCLE9BQU87SUFDUCxNQUFNO0lBQ04sb0JBQW9CO0lBQ3BCLE1BQU07SUFDTixJQUFJO0lBQ0osRUFBRTtJQUNGLDBFQUEwRTtJQUMxRSwyREFBMkQ7SUFDM0QsNkNBQTZDO0lBQzdDLDZDQUE2QztJQUM3Qyw2Q0FBNkM7SUFDN0MsRUFBRTtJQUNGLGdDQUFnQztJQUNoQyxpQ0FBaUM7SUFDakMsd0NBQXdDO0lBQ3hDLHdDQUF3QztJQUN4QyxnQkFBZ0I7SUFDaEIsd0NBQXdDO0lBQ3hDLHdDQUF3QztJQUN4QyxnQkFBZ0I7SUFDaEIsd0NBQXdDO0lBQ3hDLHdDQUF3QztJQUN4QyxnQkFBZ0I7SUFDaEIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2xDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6QjtJQUNELFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsS0FBSyxJQUFJLENBQUMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDekI7SUFFRCw0RUFBNEU7SUFDNUUsd0JBQXdCO0lBQ3hCLE1BQU0sY0FBYyxHQUE0QixFQUFFLENBQUM7SUFDbkQsNEVBQTRFO0lBQzVFLDBEQUEwRDtJQUMxRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM3QyxzRUFBc0U7SUFDdEUsTUFBTSxXQUFXLEdBQUcsSUFBSSxZQUFZLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFvQixDQUFDLENBQUM7SUFDNUUsd0VBQXdFO0lBQ3hFLHVDQUF1QztJQUN2QyxNQUFNLGFBQWEsR0FBYSxFQUFFLENBQUM7SUFDbkMsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsaUNBQWlDO1FBQ2pDLElBQUksT0FBZSxDQUFDO1FBQ3BCLElBQUksVUFBVSxFQUFFO1lBQ2QsaUNBQWlDO1lBQ2pDLE9BQU8sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDaEM7YUFBTTtZQUNMLE1BQU0sVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUN0QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNwQyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2lCQUMzQzthQUNGO1lBQ0QsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7U0FDaEM7UUFFRCxvQ0FBb0M7UUFDcEMsSUFBSSxjQUFjLENBQUMsT0FBTyxDQUFDLEtBQUssU0FBUyxFQUFFO1lBQ3pDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7U0FDdEM7YUFBTTtZQUNMLE1BQU0sV0FBVyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDO1lBQ3ZELGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUM7WUFDdEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQztZQUN6QixhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZCO0tBQ0Y7SUFFRCwyRUFBMkU7SUFDM0Usd0VBQXdFO0lBQ3hFLGlCQUFpQjtJQUNqQixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDeEMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQ3ZELE1BQU0sWUFBWSxHQUFHLElBQUksWUFBWSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM3RCxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNwQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGtCQUFrQixFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDdEU7U0FDRjtJQUNILENBQUMsQ0FBQyxDQUFDO0lBRUgsMkVBQTJFO0lBQzNFLDRFQUE0RTtJQUM1RSxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDbEMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV2QyxPQUFPO1FBQ0wsWUFBWSxFQUFFLFlBQVksQ0FBQyxNQUF1QjtRQUNsRCxXQUFXO1FBQ1gsT0FBTztLQUNSLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0JhY2tlbmRWYWx1ZXMsIERhdGFUeXBlLCBUZW5zb3JCdWZmZXIsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmlxdWVJbXBsKFxuICAgIHZhbHVlczogQmFja2VuZFZhbHVlcywgYXhpczogbnVtYmVyLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSk6IHtcbiAgb3V0cHV0VmFsdWVzOiBCYWNrZW5kVmFsdWVzLFxuICBvdXRwdXRTaGFwZTogbnVtYmVyW10sXG4gIGluZGljZXM6IEJhY2tlbmRWYWx1ZXNcbn0ge1xuICAvLyBOb3JtYWxpemUgYW5kIHZhbGlkYXRlIGF4aXMuXG4gIGNvbnN0ICRheGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCBzaGFwZSlbMF07XG5cbiAgLy8gQ2FsY3VsYXRlIHRoZSBuZXcgc2hhcGUgdGhhdCBpcyBzdWl0YWJsZSBmb3IgZXh0cmFjdGluZyBkYXRhIGFsb25nIHRoZVxuICAvLyBnaXZlbiBheGlzLlxuICAvL1xuICAvLyBUaGUgcmFuayBpcyAzLlxuICAvLyBUaGUgc2l6ZSBvZiB0aGUgMXN0IGRpbWVuc2lvbiBpcyB0aGUgc2l6ZSBvZiBhbGwgdGhlIGF4ZXMgPCB0aGUgZ2l2ZW4gYXhpcy5cbiAgLy8gVGhlIHNpemUgb2YgdGhlIDJuZCBkaW1lbnNpb24gaXMgdGhlIHNhbWUgYXMgdGhlIHNpemUgb2YgdGhlIGdpdmVuIGF4aXMuXG4gIC8vIFRoZSBzaXplIG9mIHRoZSAzcmQgZGltZW5zaW9uIGlzIHRoZSBzaXplIG9mIGFsbCB0aGUgYXhlcyA+IHRoZSBnaXZlbiBheGlzLlxuICAvL1xuICAvLyBGb3IgZXhhbXBsZSwgZm9yIGEgNEQgdGVuc29yIHdpdGggc2hhcGU9WzIsIDMsIDUsIDRdIGFuZCBheGlzPTIsIHRoZVxuICAvLyBuZXdTaGFwZSB3b3VsZCBiZTogWzIqMywgNSwgNF0uXG4gIC8vXG4gIC8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCB0aGUgZmluYWwgb3V0cHV0IHNoYXBlLiBUaGlzIHdpbGwgYmUgdGhlIHNoYXBlIGZvciBhblxuICAvLyBpbnRlcm1lZGlhdGUgVGVuc29yQnVmZmVyIChzZWUgaW5wdXRCdWZmZXIgYmVsb3cpIHRvIGFsbG93IHVzIHRvIGV4dHJhY3RcbiAgLy8gdmFsdWVzIGFsb25nIHRoZSBnaXZlbiBheGlzLiBUbyBkZW1vbnN0cmF0ZSBob3cgaXQgd29ya3MsIGNvbnNpZGVyIHRoZVxuICAvLyBmb2xsb3dpbmcgZXhhbXBsZTpcbiAgLy9cbiAgLy8gSW5wdXQ6IGEgM0QgdGVuc29yLCB3aXRoIHNoYXBlIFsxLCAyLCAzXVxuICAvLyBbXG4gIC8vICAgW1xuICAvLyAgICAgIFsxLDIsM10sXG4gIC8vICAgICAgWzQsNSw2XVxuICAvLyAgIF1cbiAgLy8gXVxuICAvLyBBeGlzOiAyICh0aGUgbGFzdCBheGlzKS5cbiAgLy8gQWxvbmcgYXhpcyAyLCB3ZSBleHBlY3QgdG8gZXh0cmFjdCAzIHRlbnNvcnM6IFsxLDRdLCBbMiw1XSwgWzMsNl0uXG4gIC8vXG4gIC8vIEZvciB0aGlzIGV4YW1wbGUsIG5ld1NoYXBlIHdvdWxkIGJlOiBbMiwgMywgMV0sIHdoZXJlIDIgaXMgY2FsY3VsYXRlZCBmcm9tXG4gIC8vIDEqMi4gVGhlIHJlLXNoYXBlZCBkYXRhIHdvdWxkIGxvb2sgbGlrZTpcbiAgLy9cbiAgLy8gW1xuICAvLyAgIFtcbiAgLy8gICAgIFsxXSwgWzJdLCBbM11cbiAgLy8gICBdLFxuICAvLyAgIFtcbiAgLy8gICAgIFs0XSwgWzVdLCBbNl1cbiAgLy8gICBdXG4gIC8vIF1cbiAgLy9cbiAgLy8gVGhlbiwgd2UgY2FuIGNvbnN0cnVjdCBhIDMtbGV2ZWwgbmVzdGVkIGxvb3AgYnkgdGhlIGZvbGxvd2luZyBkaW1lbnNpb25cbiAgLy8gb3JkZXIgdG8gZXh0cmFjdCB0aGUgdmFsdWVzIGFsb25nIHRoZSBheGlzIChkaW1lbnNpb24xKTpcbiAgLy8gaTogZGltZW5zaW9uMSAgICAgICAvLyAwLDEsMiAobmV3U2hhcGVbMV0pXG4gIC8vICAgbTogZGltZW5zaW9uMCAgICAgLy8gMCwxICAgKG5ld1NoYXBlWzBdKVxuICAvLyAgICAgbjogZGltZW5zaW9uMiAgIC8vIDAgICAgIChuZXdTaGFwZVsyXSlcbiAgLy9cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgIG0sIGksIG5cbiAgLy8gICAgICAgICAgICAgICAgICAgICAgLS0tLS0tLS0tXG4gIC8vIEl0ZXJhdGlvbiAwOiBkYXRhIGF0IFswLCAwLCAwXSA9PiBcIjFcIlxuICAvLyBJdGVyYXRpb24gMTogZGF0YSBhdCBbMSwgMCwgMF0gPT4gXCI0XCJcbiAgLy8gV2UgZ290IFsxLDRdLlxuICAvLyBJdGVyYXRpb24gMjogZGF0YSBhdCBbMCwgMSwgMF0gPT4gXCIyXCJcbiAgLy8gSXRlcmF0aW9uIDM6IGRhdGEgYXQgWzEsIDEsIDBdID0+IFwiNVwiXG4gIC8vIFdlIGdvdCBbMiw1XS5cbiAgLy8gSXRlcmF0aW9uIDQ6IGRhdGEgYXQgWzAsIDIsIDBdID0+IFwiM1wiXG4gIC8vIEl0ZXJhdGlvbiA1OiBkYXRhIGF0IFsxLCAyLCAwXSA9PiBcIjZcIlxuICAvLyBXZSBnb3QgWzMsNl0uXG4gIGNvbnN0IG5ld1NoYXBlID0gWzEsIHNoYXBlWzBdLCAxXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCAkYXhpczsgaSsrKSB7XG4gICAgbmV3U2hhcGVbMF0gKj0gc2hhcGVbaV07XG4gIH1cbiAgbmV3U2hhcGVbMV0gPSBzaGFwZVskYXhpc107XG4gIGZvciAobGV0IGkgPSAkYXhpcyArIDE7IGkgPCBzaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIG5ld1NoYXBlWzJdICo9IHNoYXBlW2ldO1xuICB9XG5cbiAgLy8gQSBtYXAgZnJvbSB1bmlxdWUgZWxlbWVudHMgKHRoZWlyIHN0cmluZyByZXByZXNlbnRhdGlvbnMpIHRvIHRoZWlyIHZhbHVlc1xuICAvLyBpbiBcImluZGljZXNcIiAoYmVsb3cpLlxuICBjb25zdCB1bmlxdWVFbGVtZW50czoge1trZXk6IHN0cmluZ106IG51bWJlcn0gPSB7fTtcbiAgLy8gVGhlIGluZGljZXMgb2YgZWFjaCB1bmlxdWUgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgdGVuc29yIGFsb25nIHRoZSBnaXZlblxuICAvLyBheGlzLiBJdCBpcyAxRCBhbmQgaGFzIHRoZSBzYW1lIHNpemUgYXMgdGhlIGdpdmVuIGF4aXMuXG4gIGNvbnN0IGluZGljZXMgPSBuZXcgSW50MzJBcnJheShzaGFwZVskYXhpc10pO1xuICAvLyBDcmVhdGUgYSBidWZmZXIgc28gd2UgY2FuIGVhc2lseSBleHRyYWN0IHZhbHVlIGF0IGEgZ2l2ZW4gbG9jYXRpb24uXG4gIGNvbnN0IGlucHV0QnVmZmVyID0gbmV3IFRlbnNvckJ1ZmZlcihuZXdTaGFwZSwgZHR5cGUsIHZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgLy8gVGhlIGluZGljZXMgYWxvbmcgdGhlIGdpdmVuIGF4aXMgdGhhdCBoYXZlIHVuaXF1ZSBlbGVtZW50cy4gVGhpcyBpcyBhXG4gIC8vIGRlLWR1cGVkIHZlcnNpb24gb2YgXCJpbmRpY2VzXCIgYWJvdmUuXG4gIGNvbnN0IHVuaXF1ZUluZGljZXM6IG51bWJlcltdID0gW107XG4gIGNvbnN0IGlzMURUZW5zb3IgPSBuZXdTaGFwZVswXSA9PT0gMSAmJiBuZXdTaGFwZVsyXSA9PT0gMTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzaGFwZVskYXhpc107IGkrKykge1xuICAgIC8vIEV4dHJhY3QgdmFsdWVzIGFsb25nIHRoZSBheGlzLlxuICAgIGxldCBlbGVtZW50OiBzdHJpbmc7XG4gICAgaWYgKGlzMURUZW5zb3IpIHtcbiAgICAgIC8vIEZhc3QgcGF0aCBmb3IgMUQgdGVuc29yIGlucHV0LlxuICAgICAgZWxlbWVudCA9IHZhbHVlc1tpXS50b1N0cmluZygpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBheGlzVmFsdWVzID0gW107XG4gICAgICBmb3IgKGxldCBtID0gMDsgbSA8IG5ld1NoYXBlWzBdOyBtKyspIHtcbiAgICAgICAgZm9yIChsZXQgbiA9IDA7IG4gPCBuZXdTaGFwZVsyXTsgbisrKSB7XG4gICAgICAgICAgYXhpc1ZhbHVlcy5wdXNoKGlucHV0QnVmZmVyLmdldChtLCBpLCBuKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGVsZW1lbnQgPSBheGlzVmFsdWVzLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICAvLyBEZWR1cCBhbmQgdXBkYXRlIHZhcmlvdXMgaW5kaWNlcy5cbiAgICBpZiAodW5pcXVlRWxlbWVudHNbZWxlbWVudF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgaW5kaWNlc1tpXSA9IHVuaXF1ZUVsZW1lbnRzW2VsZW1lbnRdO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB1bmlxdWVJbmRleCA9IE9iamVjdC5rZXlzKHVuaXF1ZUVsZW1lbnRzKS5sZW5ndGg7XG4gICAgICB1bmlxdWVFbGVtZW50c1tlbGVtZW50XSA9IHVuaXF1ZUluZGV4O1xuICAgICAgaW5kaWNlc1tpXSA9IHVuaXF1ZUluZGV4O1xuICAgICAgdW5pcXVlSW5kaWNlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vdyB3ZSBrbm93IHdoZXJlIGVhY2ggb2YgdGhlIHVuaXF1ZSBlbGVtZW50cyBhcmUgbG9jYXRlZCBhbG9uZyB0aGUgYXhpc1xuICAvLyAodW5pcXVlSW5kaWNlcykuIEV4dHJhY3QgdGhlbSBmcm9tIGlucHV0IGJ1ZmZlciBhbmQgc3RvcmUgdGhlbSBpbiB0aGVcbiAgLy8gb3V0cHV0IGJ1ZmZlci5cbiAgY29uc3Qgb3V0cHV0VG1wU2hhcGUgPSBuZXdTaGFwZS5zbGljZSgpO1xuICBvdXRwdXRUbXBTaGFwZVsxXSA9IE9iamVjdC5rZXlzKHVuaXF1ZUVsZW1lbnRzKS5sZW5ndGg7XG4gIGNvbnN0IG91dHB1dEJ1ZmZlciA9IG5ldyBUZW5zb3JCdWZmZXIob3V0cHV0VG1wU2hhcGUsIGR0eXBlKTtcbiAgdW5pcXVlSW5kaWNlcy5mb3JFYWNoKCh1bmlxdWVFbGVtZW50SW5kZXgsIGkpID0+IHtcbiAgICBmb3IgKGxldCBtID0gMDsgbSA8IG5ld1NoYXBlWzBdOyBtKyspIHtcbiAgICAgIGZvciAobGV0IG4gPSAwOyBuIDwgbmV3U2hhcGVbMl07IG4rKykge1xuICAgICAgICBvdXRwdXRCdWZmZXIuc2V0KGlucHV0QnVmZmVyLmdldChtLCB1bmlxdWVFbGVtZW50SW5kZXgsIG4pLCBtLCBpLCBuKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xuXG4gIC8vIFRoZSBvdXRwdXQgc2hhcGUgY2FuIGJlIGNhbGN1bGF0ZWQgZnJvbSB0aGUgaW5wdXQgc2hhcGUgd2l0aCB0aGUgc2l6ZSBvZlxuICAvLyB0aGUgZ2l2ZW4gYXhpcyByZXBsYWNlZCBieSB0aGUgbnVtYmVyIG9mIHVuaXF1ZSBlbGVtZW50cyBhbG9uZyB0aGF0IGF4aXMuXG4gIGNvbnN0IG91dHB1dFNoYXBlID0gc2hhcGUuc2xpY2UoKTtcbiAgb3V0cHV0U2hhcGVbJGF4aXNdID0gb3V0cHV0VG1wU2hhcGVbMV07XG5cbiAgcmV0dXJuIHtcbiAgICBvdXRwdXRWYWx1ZXM6IG91dHB1dEJ1ZmZlci52YWx1ZXMgYXMgQmFja2VuZFZhbHVlcyxcbiAgICBvdXRwdXRTaGFwZSxcbiAgICBpbmRpY2VzLFxuICB9O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Shared functionality among backends.\nexport { simpleAbsImpl } from './kernels/Abs';\nexport { addImpl } from './kernels/Add';\nexport { bincountImpl, bincountReduceImpl } from './kernels/Bincount_impl';\nexport { castImpl } from './kernels/Cast';\nexport { ceilImpl } from './kernels/Ceil';\nexport { concatImpl } from './kernels/Concat_impl';\nexport { equalImpl } from './kernels/Equal';\nexport { expImpl } from './kernels/Exp';\nexport { expm1Impl } from './kernels/Expm1';\nexport { floorImpl } from './kernels/Floor';\nexport { gatherNdImpl } from './kernels/GatherNd_Impl';\nexport { gatherV2Impl } from './kernels/GatherV2_impl';\nexport { greaterImpl } from './kernels/Greater';\nexport { greaterEqualImpl } from './kernels/GreaterEqual';\nexport { lessImpl } from './kernels/Less';\nexport { lessEqualImpl } from './kernels/LessEqual';\nexport { linSpaceImpl } from './kernels/LinSpace_impl';\nexport { logImpl } from './kernels/Log';\nexport { maxImpl } from './kernels/Max_impl';\nexport { maximumImpl } from './kernels/Maximum';\nexport { minimumImpl } from './kernels/Minimum';\nexport { multiplyImpl } from './kernels/Multiply';\nexport { negImpl } from './kernels/Neg';\nexport { notEqualImpl } from './kernels/NotEqual';\nexport { prodImpl } from './kernels/Prod';\nexport { raggedGatherImpl } from './kernels/RaggedGather_impl';\nexport { raggedTensorToTensorImpl } from './kernels/RaggedTensorToTensor_impl';\nexport { rangeImpl } from './kernels/Range_impl';\nexport { rsqrtImpl } from './kernels/Rsqrt';\nexport { scatterImpl } from './kernels/Scatter_impl';\nexport { sigmoidImpl } from './kernels/Sigmoid';\nexport { sliceImpl } from './kernels/Slice';\nexport { sparseFillEmptyRowsImpl } from './kernels/SparseFillEmptyRows_impl';\nexport { sparseReshapeImpl } from './kernels/SparseReshape_impl';\nexport { sparseSegmentReductionImpl } from './kernels/SparseSegmentReduction_impl';\nexport { sqrtImpl } from './kernels/Sqrt';\nexport { squaredDifferenceImpl } from './kernels/SquaredDifference';\nexport { stridedSliceImpl } from './kernels/StridedSlice_impl';\nexport { stringNGramsImpl } from './kernels/StringNGrams_impl';\nexport { stringSplitImpl } from './kernels/StringSplit_impl';\nexport { stringToHashBucketFastImpl } from './kernels/StringToHashBucketFast_impl';\nexport { subImpl } from './kernels/Sub';\nexport { tileImpl } from './kernels/Tile_impl';\nexport { topKImpl } from './kernels/TopK_impl';\nexport { transposeImpl } from './kernels/Transpose_impl';\nexport { uniqueImpl } from './kernels/Unique_impl';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMvc2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILHVDQUF1QztBQUN2QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEMsT0FBTyxFQUFDLFlBQVksRUFBRSxrQkFBa0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3pFLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUMxQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQ3JELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUNyRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDOUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDckQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN0QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHFDQUFxQyxDQUFDO0FBQzdFLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDMUMsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDM0UsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDL0QsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sdUNBQXVDLENBQUM7QUFDakYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ3hDLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLDZCQUE2QixDQUFDO0FBQzdELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNqRixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDN0MsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuLy8gU2hhcmVkIGZ1bmN0aW9uYWxpdHkgYW1vbmcgYmFja2VuZHMuXG5leHBvcnQge3NpbXBsZUFic0ltcGx9IGZyb20gJy4va2VybmVscy9BYnMnO1xuZXhwb3J0IHthZGRJbXBsfSBmcm9tICcuL2tlcm5lbHMvQWRkJztcbmV4cG9ydCB7YmluY291bnRJbXBsLCBiaW5jb3VudFJlZHVjZUltcGx9IGZyb20gJy4va2VybmVscy9CaW5jb3VudF9pbXBsJztcbmV4cG9ydCB7Y2FzdEltcGx9IGZyb20gJy4va2VybmVscy9DYXN0JztcbmV4cG9ydCB7Y2VpbEltcGx9IGZyb20gJy4va2VybmVscy9DZWlsJztcbmV4cG9ydCB7Y29uY2F0SW1wbH0gZnJvbSAnLi9rZXJuZWxzL0NvbmNhdF9pbXBsJztcbmV4cG9ydCB7ZXF1YWxJbXBsfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuZXhwb3J0IHtleHBJbXBsfSBmcm9tICcuL2tlcm5lbHMvRXhwJztcbmV4cG9ydCB7ZXhwbTFJbXBsfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuZXhwb3J0IHtmbG9vckltcGx9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5leHBvcnQge2dhdGhlck5kSW1wbH0gZnJvbSAnLi9rZXJuZWxzL0dhdGhlck5kX0ltcGwnO1xuZXhwb3J0IHtnYXRoZXJWMkltcGx9IGZyb20gJy4va2VybmVscy9HYXRoZXJWMl9pbXBsJztcbmV4cG9ydCB7Z3JlYXRlckltcGx9IGZyb20gJy4va2VybmVscy9HcmVhdGVyJztcbmV4cG9ydCB7Z3JlYXRlckVxdWFsSW1wbH0gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5leHBvcnQge2xlc3NJbXBsfSBmcm9tICcuL2tlcm5lbHMvTGVzcyc7XG5leHBvcnQge2xlc3NFcXVhbEltcGx9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuZXhwb3J0IHtsaW5TcGFjZUltcGx9IGZyb20gJy4va2VybmVscy9MaW5TcGFjZV9pbXBsJztcbmV4cG9ydCB7bG9nSW1wbH0gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5leHBvcnQge21heEltcGx9IGZyb20gJy4va2VybmVscy9NYXhfaW1wbCc7XG5leHBvcnQge21heGltdW1JbXBsfSBmcm9tICcuL2tlcm5lbHMvTWF4aW11bSc7XG5leHBvcnQge21pbmltdW1JbXBsfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5leHBvcnQge211bHRpcGx5SW1wbH0gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmV4cG9ydCB7bmVnSW1wbH0gZnJvbSAnLi9rZXJuZWxzL05lZyc7XG5leHBvcnQge25vdEVxdWFsSW1wbH0gZnJvbSAnLi9rZXJuZWxzL05vdEVxdWFsJztcbmV4cG9ydCB7cHJvZEltcGx9IGZyb20gJy4va2VybmVscy9Qcm9kJztcbmV4cG9ydCB7cmFnZ2VkR2F0aGVySW1wbH0gZnJvbSAnLi9rZXJuZWxzL1JhZ2dlZEdhdGhlcl9pbXBsJztcbmV4cG9ydCB7cmFnZ2VkVGVuc29yVG9UZW5zb3JJbXBsfSBmcm9tICcuL2tlcm5lbHMvUmFnZ2VkVGVuc29yVG9UZW5zb3JfaW1wbCc7XG5leHBvcnQge3JhbmdlSW1wbH0gZnJvbSAnLi9rZXJuZWxzL1JhbmdlX2ltcGwnO1xuZXhwb3J0IHtyc3FydEltcGx9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5leHBvcnQge3NjYXR0ZXJJbXBsfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlcl9pbXBsJztcbmV4cG9ydCB7c2lnbW9pZEltcGx9IGZyb20gJy4va2VybmVscy9TaWdtb2lkJztcbmV4cG9ydCB7c2xpY2VJbXBsfSBmcm9tICcuL2tlcm5lbHMvU2xpY2UnO1xuZXhwb3J0IHtzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbH0gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZUZpbGxFbXB0eVJvd3NfaW1wbCc7XG5leHBvcnQge3NwYXJzZVJlc2hhcGVJbXBsfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlUmVzaGFwZV9pbXBsJztcbmV4cG9ydCB7c3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGx9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwnO1xuZXhwb3J0IHtzcXJ0SW1wbH0gZnJvbSAnLi9rZXJuZWxzL1NxcnQnO1xuZXhwb3J0IHtzcXVhcmVkRGlmZmVyZW5jZUltcGx9IGZyb20gJy4va2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZSc7XG5leHBvcnQge3N0cmlkZWRTbGljZUltcGx9IGZyb20gJy4va2VybmVscy9TdHJpZGVkU2xpY2VfaW1wbCc7XG5leHBvcnQge3N0cmluZ05HcmFtc0ltcGx9IGZyb20gJy4va2VybmVscy9TdHJpbmdOR3JhbXNfaW1wbCc7XG5leHBvcnQge3N0cmluZ1NwbGl0SW1wbH0gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1NwbGl0X2ltcGwnO1xuZXhwb3J0IHtzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbH0gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RfaW1wbCc7XG5leHBvcnQge3N1YkltcGx9IGZyb20gJy4va2VybmVscy9TdWInO1xuZXhwb3J0IHt0aWxlSW1wbH0gZnJvbSAnLi9rZXJuZWxzL1RpbGVfaW1wbCc7XG5leHBvcnQge3RvcEtJbXBsfSBmcm9tICcuL2tlcm5lbHMvVG9wS19pbXBsJztcbmV4cG9ydCB7dHJhbnNwb3NlSW1wbH0gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZV9pbXBsJztcbmV4cG9ydCB7dW5pcXVlSW1wbH0gZnJvbSAnLi9rZXJuZWxzL1VuaXF1ZV9pbXBsJztcbmV4cG9ydCB7Q29tcGxleEJpbmFyeUtlcm5lbEltcGwsIFNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4vdXRpbHMvYmluYXJ5X3R5cGVzJztcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n/*\n * base.ts contains all the exports from tfjs-backend-cpu\n * without auto-kernel registration\n */\nimport { registerBackend } from '@tensorflow/tfjs-core';\nimport { MathBackendCPU } from './backend_cpu';\nimport * as shared from './shared';\nexport { MathBackendCPU } from './backend_cpu';\nexport { version as version_cpu } from './version';\nexport { shared };\n// Side effects for default initialization of MathBackendCPU\nregisterBackend('cpu', () => new MathBackendCPU(), 1 /* priority */);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2Jhc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUg7OztHQUdHO0FBQ0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDN0MsT0FBTyxLQUFLLE1BQU0sTUFBTSxVQUFVLENBQUM7QUFFbkMsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUMsT0FBTyxJQUFJLFdBQVcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNqRCxPQUFPLEVBQUMsTUFBTSxFQUFDLENBQUM7QUFFaEIsNERBQTREO0FBQzVELGVBQWUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSSxjQUFjLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8qXG4gKiBiYXNlLnRzIGNvbnRhaW5zIGFsbCB0aGUgZXhwb3J0cyBmcm9tIHRmanMtYmFja2VuZC1jcHVcbiAqIHdpdGhvdXQgYXV0by1rZXJuZWwgcmVnaXN0cmF0aW9uXG4gKi9cbmltcG9ydCB7cmVnaXN0ZXJCYWNrZW5kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnLi9zaGFyZWQnO1xuXG5leHBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuL2JhY2tlbmRfY3B1JztcbmV4cG9ydCB7dmVyc2lvbiBhcyB2ZXJzaW9uX2NwdX0gZnJvbSAnLi92ZXJzaW9uJztcbmV4cG9ydCB7c2hhcmVkfTtcblxuLy8gU2lkZSBlZmZlY3RzIGZvciBkZWZhdWx0IGluaXRpYWxpemF0aW9uIG9mIE1hdGhCYWNrZW5kQ1BVXG5yZWdpc3RlckJhY2tlbmQoJ2NwdScsICgpID0+IG5ldyBNYXRoQmFja2VuZENQVSgpLCAxIC8qIHByaW9yaXR5ICovKTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Elu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const elu = unaryKernelFunc(Elu, (xi) => xi >= 0 ? xi : (Math.exp(xi) - 1));\nexport const eluConfig = {\n    kernelName: Elu,\n    backendName: 'cpu',\n    kernelFunc: elu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9FbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQ1osZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RWx1LCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBlbHUgPVxuICAgIHVuYXJ5S2VybmVsRnVuYyhFbHUsICh4aSkgPT4geGkgPj0gMCA/IHhpIDogKE1hdGguZXhwKHhpKSAtIDEpKTtcblxuZXhwb3J0IGNvbnN0IGVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZWx1LFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LeakyRelu, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function leakyRelu(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { alpha } = attrs;\n    assertNotComplex([x], 'leakyRelu');\n    const xSize = util.sizeFromShape(x.shape);\n    const xVals = backend.data.get(x.dataId).values;\n    const outVals = util.getTypedArrayFromDType('float32', xSize);\n    for (let i = 0; i < xVals.length; i++) {\n        outVals[i] = xVals[i] < 0 ? alpha * xVals[i] : xVals[i];\n    }\n    return backend.makeTensorInfo(x.shape, 'float32', outVals);\n}\nexport const leakyReluConfig = {\n    kernelName: LeakyRelu,\n    backendName: 'cpu',\n    kernelFunc: leakyRelu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVha3lSZWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9MZWFreVJlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixTQUFTLEVBQTJELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pJLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0QixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRW5DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzlELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDckMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUN6RDtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUM3RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExlYWt5UmVsdSwgTGVha3lSZWx1QXR0cnMsIExlYWt5UmVsdUlucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsZWFreVJlbHUoYXJnczoge1xuICBpbnB1dHM6IExlYWt5UmVsdUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBMZWFreVJlbHVBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHthbHBoYX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFt4XSwgJ2xlYWt5UmVsdScpO1xuXG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBvdXRWYWxzID0gdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdmbG9hdDMyJywgeFNpemUpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgeFZhbHMubGVuZ3RoOyBpKyspIHtcbiAgICBvdXRWYWxzW2ldID0geFZhbHNbaV0gPCAwID8gYWxwaGEgKiB4VmFsc1tpXSA6IHhWYWxzW2ldO1xuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgJ2Zsb2F0MzInLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxlYWt5UmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMZWFreVJlbHUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbGVha3lSZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Prelu } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nconst preluImpl = createSimpleBinaryKernelImpl((xValue, aValue) => xValue < 0 ? aValue * xValue : xValue);\nexport function prelu(args) {\n    const { inputs, backend } = args;\n    const { x, alpha } = inputs;\n    assertNotComplex([x, alpha], 'prelu');\n    const aVals = backend.data.get(x.dataId).values;\n    const bVals = backend.data.get(alpha.dataId).values;\n    const [resultData, resultShape] = preluImpl(x.shape, alpha.shape, aVals, bVals, 'float32');\n    return backend.makeTensorInfo(resultShape, 'float32', resultData);\n}\nexport const preluConfig = {\n    kernelName: Prelu,\n    backendName: 'cpu',\n    kernelFunc: prelu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlbHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1ByZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQXNDLE1BQU0sdUJBQXVCLENBQUM7QUFHL0YsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRWxFLE1BQU0sU0FBUyxHQUFHLDRCQUE0QixDQUMxQyxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBRS9FLE1BQU0sVUFBVSxLQUFLLENBQUMsSUFBb0Q7SUFFeEUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFMUIsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFbEUsTUFBTSxDQUFDLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FDM0IsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTdELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUHJlbHUsIFByZWx1SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuXG5jb25zdCBwcmVsdUltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKFxuICAgICh4VmFsdWU6IG51bWJlciwgYVZhbHVlOiBudW1iZXIpID0+IHhWYWx1ZSA8IDAgPyBhVmFsdWUgKiB4VmFsdWUgOiB4VmFsdWUpO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJlbHUoYXJnczoge2lucHV0czogUHJlbHVJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3gsIGFscGhhfSA9IGlucHV0cztcblxuICBhc3NlcnROb3RDb21wbGV4KFt4LCBhbHBoYV0sICdwcmVsdScpO1xuXG4gIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGJWYWxzID0gYmFja2VuZC5kYXRhLmdldChhbHBoYS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtyZXN1bHREYXRhLCByZXN1bHRTaGFwZV0gPVxuICAgICAgcHJlbHVJbXBsKHguc2hhcGUsIGFscGhhLnNoYXBlLCBhVmFscywgYlZhbHMsICdmbG9hdDMyJyk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0RGF0YSk7XG59XG5cbmV4cG9ydCBjb25zdCBwcmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQcmVsdSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBwcmVsdSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const relu = unaryKernelFunc(Relu, (xi) => Math.max(0, xi));\nexport const reluConfig = {\n    kernelName: Relu,\n    backendName: 'cpu',\n    kernelFunc: relu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBSZWx1fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgcmVsdSA9IHVuYXJ5S2VybmVsRnVuYyhSZWx1LCAoeGkpID0+IE1hdGgubWF4KDAsIHhpKSk7XG5cbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlbHUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVsdSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu6 } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const relu6 = unaryKernelFunc(Relu6, (xi) => Math.min(Math.max(0, xi), 6));\nexport const relu6Config = {\n    kernelName: Relu6,\n    backendName: 'cpu',\n    kernelFunc: relu6,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JlbHU2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVqRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUmVsdTZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCByZWx1NiA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKFJlbHU2LCAoeGkpID0+IE1hdGgubWluKE1hdGgubWF4KDAsIHhpKSwgNikpO1xuXG5leHBvcnQgY29uc3QgcmVsdTZDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVsdTYsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVsdTYsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { elu } from '../kernels/Elu';\nimport { identity } from '../kernels/Identity';\nimport { leakyRelu } from '../kernels/LeakyRelu';\nimport { prelu } from '../kernels/Prelu';\nimport { relu } from '../kernels/Relu';\nimport { relu6 } from '../kernels/Relu6';\nimport { sigmoid } from '../kernels/Sigmoid';\nexport function applyActivation(backend, x, activation, preluActivationWeights, leakyreluAlpha) {\n    if (activation === 'linear') {\n        return identity({ inputs: { x }, backend });\n    }\n    else if (activation === 'relu') {\n        return relu({ inputs: { x }, backend });\n    }\n    else if (activation === 'elu') {\n        return elu({ inputs: { x }, backend });\n    }\n    else if (activation === 'relu6') {\n        return relu6({ inputs: { x }, backend });\n    }\n    else if (activation === 'prelu') {\n        return prelu({ inputs: { x, alpha: preluActivationWeights }, backend });\n    }\n    else if (activation === 'leakyrelu') {\n        return leakyRelu({ inputs: { x }, backend, attrs: { alpha: leakyreluAlpha } });\n    }\n    else if (activation === 'sigmoid') {\n        return sigmoid({ inputs: { x }, backend });\n    }\n    throw new Error(`Activation ${activation} has not been implemented for the CPU backend.`);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnVzZWRfdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy91dGlscy9mdXNlZF91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUMvQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDdkMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ3JDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUN2QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsT0FBdUIsRUFBRSxDQUFhLEVBQUUsVUFBbUMsRUFDM0Usc0JBQW1DLEVBQUUsY0FBdUI7SUFDOUQsSUFBSSxVQUFVLEtBQUssUUFBUSxFQUFFO1FBQzNCLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUN6QztTQUFNLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtRQUNoQyxPQUFPLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFlLENBQUM7S0FDbkQ7U0FBTSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7UUFDL0IsT0FBTyxHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBZSxDQUFDO0tBQ2xEO1NBQU0sSUFBSSxVQUFVLEtBQUssT0FBTyxFQUFFO1FBQ2pDLE9BQU8sS0FBSyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztLQUNwRDtTQUFNLElBQUksVUFBVSxLQUFLLE9BQU8sRUFBRTtRQUNqQyxPQUFPLEtBQUssQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3JFO1NBQU0sSUFBSSxVQUFVLEtBQUssV0FBVyxFQUFFO1FBQ3JDLE9BQU8sU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxjQUFjLEVBQUMsRUFBQyxDQUFDLENBQUM7S0FDMUU7U0FBTSxJQUFJLFVBQVUsS0FBSyxTQUFTLEVBQUU7UUFDbkMsT0FBTyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBZSxDQUFDO0tBQ3REO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FDWCxjQUFjLFVBQVUsZ0RBQWdELENBQUMsQ0FBQztBQUNoRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge19GdXNlZE1hdE11bCwgX0Z1c2VkTWF0TXVsQXR0cnMsIF9GdXNlZE1hdE11bElucHV0cywgYmFja2VuZF91dGlsLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2VsdX0gZnJvbSAnLi4va2VybmVscy9FbHUnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi4va2VybmVscy9JZGVudGl0eSc7XG5pbXBvcnQge2xlYWt5UmVsdX0gZnJvbSAnLi4va2VybmVscy9MZWFreVJlbHUnO1xuaW1wb3J0IHtwcmVsdX0gZnJvbSAnLi4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQge3JlbHV9IGZyb20gJy4uL2tlcm5lbHMvUmVsdSc7XG5pbXBvcnQge3JlbHU2fSBmcm9tICcuLi9rZXJuZWxzL1JlbHU2JztcbmltcG9ydCB7c2lnbW9pZH0gZnJvbSAnLi4va2VybmVscy9TaWdtb2lkJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFwcGx5QWN0aXZhdGlvbihcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgeDogVGVuc29ySW5mbywgYWN0aXZhdGlvbjogYmFja2VuZF91dGlsLkFjdGl2YXRpb24sXG4gICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvckluZm8sIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyKTogVGVuc29ySW5mbyB7XG4gIGlmIChhY3RpdmF0aW9uID09PSAnbGluZWFyJykge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncmVsdScpIHtcbiAgICByZXR1cm4gcmVsdSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdlbHUnKSB7XG4gICAgcmV0dXJuIGVsdSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1NicpIHtcbiAgICByZXR1cm4gcmVsdTYoe2lucHV0czoge3h9LCBiYWNrZW5kfSkgYXMgVGVuc29ySW5mbztcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAncHJlbHUnKSB7XG4gICAgcmV0dXJuIHByZWx1KHtpbnB1dHM6IHt4LCBhbHBoYTogcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30sIGJhY2tlbmR9KTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1Jykge1xuICAgIHJldHVybiBsZWFreVJlbHUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2FscGhhOiBsZWFreXJlbHVBbHBoYX19KTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnc2lnbW9pZCcpIHtcbiAgICByZXR1cm4gc2lnbW9pZCh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBBY3RpdmF0aW9uICR7YWN0aXZhdGlvbn0gaGFzIG5vdCBiZWVuIGltcGxlbWVudGVkIGZvciB0aGUgQ1BVIGJhY2tlbmQuYCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reshape, util } from '@tensorflow/tfjs-core';\nexport function reshape(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { shape } = attrs;\n    const xSize = util.sizeFromShape(x.shape);\n    const $shape = util.inferFromImplicitShape(shape, xSize);\n    const $xSize = util.sizeFromShape($shape);\n    util.assert(xSize === $xSize, () => `The new shape (${$shape}) has ${$xSize} elements and the old ` +\n        `shape (${x.shape}) has ${xSize} elements. The new shape and old ` +\n        `shape must have the same number of elements.`);\n    backend.incRef(x.dataId);\n    const xData = backend.data.get(x.dataId);\n    if (xData.complexTensorInfos != null) {\n        const real = xData.complexTensorInfos.real;\n        const imag = xData.complexTensorInfos.imag;\n        real.shape = $shape;\n        imag.shape = $shape;\n    }\n    return { dataId: x.dataId, shape: $shape, dtype: x.dtype };\n}\nexport const reshapeConfig = {\n    kernelName: Reshape,\n    backendName: 'cpu',\n    kernelFunc: reshape\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVzaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE9BQU8sRUFBMkMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJdkgsTUFBTSxVQUFVLE9BQU8sQ0FDbkIsSUFDeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUMsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLEtBQUssTUFBTSxFQUNoQixHQUFHLEVBQUUsQ0FBQyxrQkFBa0IsTUFBTSxTQUFTLE1BQU0sd0JBQXdCO1FBQ2pFLFVBQVUsQ0FBQyxDQUFDLEtBQUssU0FBUyxLQUFLLG1DQUFtQztRQUNsRSw4Q0FBOEMsQ0FBQyxDQUFDO0lBRXhELE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUV6QyxJQUFJLEtBQUssQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLEVBQUU7UUFDcEMsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUMzQyxNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO1FBRTNDLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEdBQUcsTUFBTSxDQUFDO0tBQ3JCO0lBRUQsT0FBTyxFQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2hhcGUsIFJlc2hhcGVBdHRycywgUmVzaGFwZUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZShcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBSZXNoYXBlSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFJlc2hhcGVBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaGFwZX0gPSBhdHRycztcblxuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgY29uc3QgJHNoYXBlID0gdXRpbC5pbmZlckZyb21JbXBsaWNpdFNoYXBlKHNoYXBlLCB4U2l6ZSk7XG4gIGNvbnN0ICR4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSgkc2hhcGUpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeFNpemUgPT09ICR4U2l6ZSxcbiAgICAgICgpID0+IGBUaGUgbmV3IHNoYXBlICgkeyRzaGFwZX0pIGhhcyAkeyR4U2l6ZX0gZWxlbWVudHMgYW5kIHRoZSBvbGQgYCArXG4gICAgICAgICAgYHNoYXBlICgke3guc2hhcGV9KSBoYXMgJHt4U2l6ZX0gZWxlbWVudHMuIFRoZSBuZXcgc2hhcGUgYW5kIG9sZCBgICtcbiAgICAgICAgICBgc2hhcGUgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy5gKTtcblxuICBiYWNrZW5kLmluY1JlZih4LmRhdGFJZCk7XG5cbiAgY29uc3QgeERhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKTtcblxuICBpZiAoeERhdGEuY29tcGxleFRlbnNvckluZm9zICE9IG51bGwpIHtcbiAgICBjb25zdCByZWFsID0geERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWw7XG4gICAgY29uc3QgaW1hZyA9IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuXG4gICAgcmVhbC5zaGFwZSA9ICRzaGFwZTtcbiAgICBpbWFnLnNoYXBlID0gJHNoYXBlO1xuICB9XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IHguZGF0YUlkLCBzaGFwZTogJHNoYXBlLCBkdHlwZTogeC5kdHlwZX07XG59XG5cbmV4cG9ydCBjb25zdCByZXNoYXBlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2hhcGUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVzaGFwZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BatchMatMul, broadcast_util, buffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nexport function batchMatMul(args) {\n    const { inputs, backend, attrs } = args;\n    const { a, b } = inputs;\n    const { transposeA, transposeB } = attrs;\n    assertNotComplex([a, b], 'matMul');\n    const aRank = a.shape.length;\n    const bRank = b.shape.length;\n    const innerShapeA = transposeA ? a.shape[aRank - 2] : a.shape[aRank - 1];\n    const innerShapeB = transposeB ? b.shape[bRank - 1] : b.shape[bRank - 2];\n    const outerShapeA = transposeA ? a.shape[aRank - 1] : a.shape[aRank - 2];\n    const outerShapeB = transposeB ? b.shape[bRank - 2] : b.shape[bRank - 1];\n    const outerDimsA = a.shape.slice(0, -2);\n    const outerDimsB = b.shape.slice(0, -2);\n    const batchDimA = util.sizeFromShape(outerDimsA);\n    const batchDimB = util.sizeFromShape(outerDimsB);\n    const outShapeOuterDims = broadcast_util.assertAndGetBroadcastShape(a.shape.slice(0, -2), b.shape.slice(0, -2));\n    const outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]);\n    util.assert(innerShapeA === innerShapeB, () => `Error in matMul: inner shapes (${innerShapeA}) and (` +\n        `${innerShapeB}) of Tensors with shapes ${a.shape} and ` +\n        `${b.shape} and transposeA=${transposeA}` +\n        ` and transposeB=${transposeB} must match.`);\n    const a3dShape = transposeA ? [batchDimA, innerShapeA, outerShapeA] :\n        [batchDimA, outerShapeA, innerShapeA];\n    const b3dShape = transposeB ? [batchDimB, outerShapeB, innerShapeB] :\n        [batchDimB, innerShapeB, outerShapeB];\n    // The rest of the implementation is designed to operate on rank-3 tensors\n    const a3d = reshape({ inputs: { x: a }, backend, attrs: { shape: a3dShape } });\n    const b3d = reshape({ inputs: { x: b }, backend, attrs: { shape: b3dShape } });\n    const sharedDim = transposeA ? a3d.shape[1] : a3d.shape[2];\n    const leftDim = transposeA ? a3d.shape[2] : a3d.shape[1];\n    const rightDim = transposeB ? b3d.shape[1] : b3d.shape[2];\n    const batchDim = Math.max(batchDimA, batchDimB);\n    const a3dValues = backend.data.get(a3d.dataId).values;\n    const b3dValues = backend.data.get(b3d.dataId).values;\n    const a3dStrides = util.computeStrides(a3d.shape);\n    const b3dStrides = util.computeStrides(b3d.shape);\n    const [aBatch, aOuterStep, aInnerStep] = transposeA ?\n        [a3dStrides[0], 1, a3dStrides[1]] :\n        [a3dStrides[0], a3dStrides[1], 1];\n    const [bInnerStep, bOuterStep, bBatch] = transposeB ?\n        [1, b3dStrides[1], b3dStrides[0]] :\n        [b3dStrides[1], 1, b3dStrides[0]];\n    const size = leftDim * rightDim;\n    const result = buffer([batchDim, leftDim, rightDim], a3d.dtype);\n    const resVals = result.values;\n    const blockSize = backend.blockSize;\n    for (let bi = 0; bi < batchDim; bi++) {\n        for (let i0 = 0; i0 < leftDim; i0 += blockSize) {\n            for (let j0 = 0; j0 < rightDim; j0 += blockSize) {\n                for (let k0 = 0; k0 < sharedDim; k0 += blockSize) {\n                    // for when blockSize doesn't evenly divide the input\n                    const iBlock = Math.min(i0 + blockSize, leftDim);\n                    const jBlock = Math.min(j0 + blockSize, rightDim);\n                    const kBlock = Math.min(k0 + blockSize, sharedDim);\n                    for (let i = i0; i < iBlock; i++) {\n                        for (let j = j0; j < jBlock; j++) {\n                            let sum = 0.0;\n                            for (let k = k0; k < kBlock; k++) {\n                                const batchOffsetA = Math.min(bi, batchDimA - 1) * aBatch;\n                                const batchOffsetB = Math.min(bi, batchDimB - 1) * bBatch;\n                                const aVal = a3dValues[batchOffsetA + i * aOuterStep + k * aInnerStep];\n                                const bVal = b3dValues[k * bInnerStep + j * bOuterStep + batchOffsetB];\n                                sum += aVal * bVal;\n                            }\n                            resVals[bi * size + (i * rightDim + j)] += sum;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    backend.disposeIntermediateTensorInfo(a3d);\n    backend.disposeIntermediateTensorInfo(b3d);\n    // set correct shape on output.\n    return backend.makeTensorInfo(outShape, result.dtype, result.values);\n}\nexport const batchMatMulConfig = {\n    kernelName: BatchMatMul,\n    backendName: 'cpu',\n    kernelFunc: batchMatMul,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hNYXRNdWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0JhdGNoTWF0TXVsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQXVDLGNBQWMsRUFBRSxNQUFNLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzNKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdEIsTUFBTSxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdkMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFbkMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDekUsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUss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TSxDQUFDLE1BQW9CLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWlCO0lBQzdDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxXQUErQjtDQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCYXRjaE1hdE11bCwgQmF0Y2hNYXRNdWxBdHRycywgQmF0Y2hNYXRNdWxJbnB1dHMsIGJyb2FkY2FzdF91dGlsLCBidWZmZXIsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaE1hdE11bElucHV0cyxcbiAgYXR0cnM6IEJhdGNoTWF0TXVsQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHthLCBifSA9IGlucHV0cztcbiAgY29uc3Qge3RyYW5zcG9zZUEsIHRyYW5zcG9zZUJ9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbYSwgYl0sICdtYXRNdWwnKTtcblxuICBjb25zdCBhUmFuayA9IGEuc2hhcGUubGVuZ3RoO1xuICBjb25zdCBiUmFuayA9IGIuc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IGlubmVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAyXSA6IGEuc2hhcGVbYVJhbmsgLSAxXTtcbiAgY29uc3QgaW5uZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDFdIDogYi5zaGFwZVtiUmFuayAtIDJdO1xuXG4gIGNvbnN0IG91dGVyU2hhcGVBID0gdHJhbnNwb3NlQSA/IGEuc2hhcGVbYVJhbmsgLSAxXSA6IGEuc2hhcGVbYVJhbmsgLSAyXTtcbiAgY29uc3Qgb3V0ZXJTaGFwZUIgPSB0cmFuc3Bvc2VCID8gYi5zaGFwZVtiUmFuayAtIDJdIDogYi5zaGFwZVtiUmFuayAtIDFdO1xuXG4gIGNvbnN0IG91dGVyRGltc0EgPSBhLnNoYXBlLnNsaWNlKDAsIC0yKTtcbiAgY29uc3Qgb3V0ZXJEaW1zQiA9IGIuc2hhcGUuc2xpY2UoMCwgLTIpO1xuXG4gIGNvbnN0IGJhdGNoRGltQSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNBKTtcbiAgY29uc3QgYmF0Y2hEaW1CID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dGVyRGltc0IpO1xuXG4gIGNvbnN0IG91dFNoYXBlT3V0ZXJEaW1zID0gYnJvYWRjYXN0X3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoXG4gICAgICBhLnNoYXBlLnNsaWNlKDAsIC0yKSwgYi5zaGFwZS5zbGljZSgwLCAtMikpO1xuICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlT3V0ZXJEaW1zLmNvbmNhdChbb3V0ZXJTaGFwZUEsIG91dGVyU2hhcGVCXSk7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBpbm5lclNoYXBlQSA9PT0gaW5uZXJTaGFwZUIsXG4gICAgICAoKSA9PiBgRXJyb3IgaW4gbWF0TXVsOiBpbm5lciBzaGFwZXMgKCR7aW5uZXJTaGFwZUF9KSBhbmQgKGAgK1xuICAgICAgICAgIGAke2lubmVyU2hhcGVCfSkgb2YgVGVuc29ycyB3aXRoIHNoYXBlcyAke2Euc2hhcGV9IGFuZCBgICtcbiAgICAgICAgICBgJHtiLnNoYXBlfSBhbmQgdHJhbnNwb3NlQT0ke3RyYW5zcG9zZUF9YCArXG4gICAgICAgICAgYCBhbmQgdHJhbnNwb3NlQj0ke3RyYW5zcG9zZUJ9IG11c3QgbWF0Y2guYCk7XG5cbiAgY29uc3QgYTNkU2hhcGUgPSB0cmFuc3Bvc2VBID8gW2JhdGNoRGltQSwgaW5uZXJTaGFwZUEsIG91dGVyU2hhcGVBXSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtiYXRjaERpbUEsIG91dGVyU2hhcGVBLCBpbm5lclNoYXBlQV07XG4gIGNvbnN0IGIzZFNoYXBlID0gdHJhbnNwb3NlQiA/IFtiYXRjaERpbUIsIG91dGVyU2hhcGVCLCBpbm5lclNoYXBlQl0gOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdO1xuXG4gIC8vIFRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIHJhbmstMyB0ZW5zb3JzXG4gIGNvbnN0IGEzZCA9IHJlc2hhcGUoe2lucHV0czoge3g6IGF9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBhM2RTaGFwZX19KTtcbiAgY29uc3QgYjNkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogYn0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGIzZFNoYXBlfX0pO1xuXG4gIGNvbnN0IHNoYXJlZERpbSA9IHRyYW5zcG9zZUEgPyBhM2Quc2hhcGVbMV0gOiBhM2Quc2hhcGVbMl07XG4gIGNvbnN0IGxlZnREaW0gPSB0cmFuc3Bvc2VBID8gYTNkLnNoYXBlWzJdIDogYTNkLnNoYXBlWzFdO1xuICBjb25zdCByaWdodERpbSA9IHRyYW5zcG9zZUIgPyBiM2Quc2hhcGVbMV0gOiBiM2Quc2hhcGVbMl07XG4gIGNvbnN0IGJhdGNoRGltID0gTWF0aC5tYXgoYmF0Y2hEaW1BLCBiYXRjaERpbUIpO1xuXG4gIGNvbnN0IGEzZFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoYTNkLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGIzZFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoYjNkLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgYTNkU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYTNkLnNoYXBlKTtcbiAgY29uc3QgYjNkU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoYjNkLnNoYXBlKTtcblxuICBjb25zdCBbYUJhdGNoLCBhT3V0ZXJTdGVwLCBhSW5uZXJTdGVwXSA9IHRyYW5zcG9zZUEgP1xuICAgICAgW2EzZFN0cmlkZXNbMF0sIDEsIGEzZFN0cmlkZXNbMV1dIDpcbiAgICAgIFthM2RTdHJpZGVzWzBdLCBhM2RTdHJpZGVzWzFdLCAxXTtcbiAgY29uc3QgW2JJbm5lclN0ZXAsIGJPdXRlclN0ZXAsIGJCYXRjaF0gPSB0cmFuc3Bvc2VCID9cbiAgICAgIFsxLCBiM2RTdHJpZGVzWzFdLCBiM2RTdHJpZGVzWzBdXSA6XG4gICAgICBbYjNkU3RyaWRlc1sxXSwgMSwgYjNkU3RyaWRlc1swXV07XG5cbiAgY29uc3Qgc2l6ZSA9IGxlZnREaW0gKiByaWdodERpbTtcbiAgY29uc3QgcmVzdWx0ID0gYnVmZmVyKFtiYXRjaERpbSwgbGVmdERpbSwgcmlnaHREaW1dLCBhM2QuZHR5cGUpO1xuXG4gIGNvbnN0IHJlc1ZhbHMgPSByZXN1bHQudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGJsb2NrU2l6ZSA9IGJhY2tlbmQuYmxvY2tTaXplO1xuXG4gIGZvciAobGV0IGJpID0gMDsgYmkgPCBiYXRjaERpbTsgYmkrKykge1xuICAgIGZvciAobGV0IGkwID0gMDsgaTAgPCBsZWZ0RGltOyBpMCArPSBibG9ja1NpemUpIHtcbiAgICAgIGZvciAobGV0IGowID0gMDsgajAgPCByaWdodERpbTsgajAgKz0gYmxvY2tTaXplKSB7XG4gICAgICAgIGZvciAobGV0IGswID0gMDsgazAgPCBzaGFyZWREaW07IGswICs9IGJsb2NrU2l6ZSkge1xuICAgICAgICAgIC8vIGZvciB3aGVuIGJsb2NrU2l6ZSBkb2Vzbid0IGV2ZW5seSBkaXZpZGUgdGhlIGlucHV0XG4gICAgICAgICAgY29uc3QgaUJsb2NrID0gTWF0aC5taW4oaTAgKyBibG9ja1NpemUsIGxlZnREaW0pO1xuICAgICAgICAgIGNvbnN0IGpCbG9jayA9IE1hdGgubWluKGowICsgYmxvY2tTaXplLCByaWdodERpbSk7XG4gICAgICAgICAgY29uc3Qga0Jsb2NrID0gTWF0aC5taW4oazAgKyBibG9ja1NpemUsIHNoYXJlZERpbSk7XG5cbiAgICAgICAgICBmb3IgKGxldCBpID0gaTA7IGkgPCBpQmxvY2s7IGkrKykge1xuICAgICAgICAgICAgZm9yIChsZXQgaiA9IGowOyBqIDwgakJsb2NrOyBqKyspIHtcbiAgICAgICAgICAgICAgbGV0IHN1bSA9IDAuMDtcblxuICAgICAgICAgICAgICBmb3IgKGxldCBrID0gazA7IGsgPCBrQmxvY2s7IGsrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0QSA9IE1hdGgubWluKGJpLCBiYXRjaERpbUEgLSAxKSAqIGFCYXRjaDtcbiAgICAgICAgICAgICAgICBjb25zdCBiYXRjaE9mZnNldEIgPSBNYXRoLm1pbihiaSwgYmF0Y2hEaW1CIC0gMSkgKiBiQmF0Y2g7XG4gICAgICAgICAgICAgICAgY29uc3QgYVZhbCA9XG4gICAgICAgICAgICAgICAgICAgIGEzZFZhbHVlc1tiYXRjaE9mZnNldEEgKyBpICogYU91dGVyU3RlcCArIGsgKiBhSW5uZXJTdGVwXTtcbiAgICAgICAgICAgICAgICBjb25zdCBiVmFsID1cbiAgICAgICAgICAgICAgICAgICAgYjNkVmFsdWVzW2sgKiBiSW5uZXJTdGVwICsgaiAqIGJPdXRlclN0ZXAgKyBiYXRjaE9mZnNldEJdO1xuICAgICAgICAgICAgICAgIHN1bSArPSBhVmFsICogYlZhbDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXNWYWxzW2JpICogc2l6ZSArIChpICogcmlnaHREaW0gKyBqKV0gKz0gc3VtO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTNkKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhiM2QpO1xuXG4gIC8vIHNldCBjb3JyZWN0IHNoYXBlIG9uIG91dHB1dC5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICBvdXRTaGFwZSwgcmVzdWx0LmR0eXBlLCByZXN1bHQudmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xufVxuXG5leHBvcnQgY29uc3QgYmF0Y2hNYXRNdWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQmF0Y2hNYXRNdWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYmF0Y2hNYXRNdWwgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { _FusedMatMul } from '@tensorflow/tfjs-core';\nimport { applyActivation } from '../utils/fused_utils';\nimport { add } from './Add';\nimport { batchMatMul } from './BatchMatMul';\nexport function _fusedMatMul(args) {\n    const { inputs, backend, attrs } = args;\n    const { a, b, bias, preluActivationWeights } = inputs;\n    const { transposeA, transposeB, activation, leakyreluAlpha } = attrs;\n    let current;\n    let addRes;\n    let activationRes;\n    const intermediates = [];\n    const matMulRes = batchMatMul({ inputs: { a, b }, attrs: { transposeA, transposeB }, backend });\n    current = matMulRes;\n    if (bias) {\n        addRes = add({ inputs: { a: current, b: bias }, backend });\n        intermediates.push(current);\n        current = addRes;\n    }\n    if (activation) {\n        activationRes = applyActivation(backend, current, activation, preluActivationWeights, leakyreluAlpha);\n        intermediates.push(current);\n        current = activationRes;\n    }\n    for (const i of intermediates) {\n        backend.disposeIntermediateTensorInfo(i);\n    }\n    return current;\n}\nexport const _fusedMatMulConfig = {\n    kernelName: _FusedMatMul,\n    backendName: 'cpu',\n    kernelFunc: _fusedMatMul,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX0Z1c2VkTWF0TXVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9fRnVzZWRNYXRNdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRTFDLE1BQU0sVUFBVSxZQUFZLENBQUMsSUFJNUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3BELE1BQU0sRUFBQyxVQUFVLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxjQUFjLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbkUsSUFBSSxPQUFPLENBQUM7SUFDWixJQUFJLE1BQU0sQ0FBQztJQUNYLElBQUksYUFBYSxDQUFDO0lBRWxCLE1BQU0sYUFBYSxHQUFpQixFQUFFLENBQUM7SUFFdkMsTUFBTSxTQUFTLEdBQ1gsV0FBVyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLFVBQVUsRUFBRSxVQUFVLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0lBQzVFLE9BQU8sR0FBRyxTQUFTLENBQUM7SUFFcEIsSUFBSSxJQUFJLEVBQUU7UUFDUixNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztRQUNyRSxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzVCLE9BQU8sR0FBRyxNQUFNLENBQUM7S0FDbEI7SUFDRCxJQUFJLFVBQVUsRUFBRTtRQUNkLGFBQWEsR0FBRyxlQUFlLENBQzNCLE9BQU8sRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDNUIsT0FBTyxHQUFHLGFBQWEsQ0FBQztLQUN6QjtJQUVELEtBQUssTUFBTSxDQUFDLElBQUksYUFBYSxFQUFFO1FBQzdCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUMxQztJQUVELE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFlBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge19GdXNlZE1hdE11bCwgX0Z1c2VkTWF0TXVsQXR0cnMsIF9GdXNlZE1hdE11bElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2FwcGx5QWN0aXZhdGlvbn0gZnJvbSAnLi4vdXRpbHMvZnVzZWRfdXRpbHMnO1xuXG5pbXBvcnQge2FkZH0gZnJvbSAnLi9BZGQnO1xuaW1wb3J0IHtiYXRjaE1hdE11bH0gZnJvbSAnLi9CYXRjaE1hdE11bCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfZnVzZWRNYXRNdWwoYXJnczoge1xuICBpbnB1dHM6IF9GdXNlZE1hdE11bElucHV0cyxcbiAgYXR0cnM6IF9GdXNlZE1hdE11bEF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVVxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YSwgYiwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHt0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYX0gPSBhdHRycztcblxuICBsZXQgY3VycmVudDtcbiAgbGV0IGFkZFJlcztcbiAgbGV0IGFjdGl2YXRpb25SZXM7XG5cbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgY29uc3QgbWF0TXVsUmVzID1cbiAgICAgIGJhdGNoTWF0TXVsKHtpbnB1dHM6IHthLCBifSwgYXR0cnM6IHt0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCfSwgYmFja2VuZH0pO1xuICBjdXJyZW50ID0gbWF0TXVsUmVzO1xuXG4gIGlmIChiaWFzKSB7XG4gICAgYWRkUmVzID0gYWRkKHtpbnB1dHM6IHthOiBjdXJyZW50LCBiOiBiaWFzfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBhZGRSZXM7XG4gIH1cbiAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICBhY3RpdmF0aW9uUmVzID0gYXBwbHlBY3RpdmF0aW9uKFxuICAgICAgICBiYWNrZW5kLCBjdXJyZW50LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKGN1cnJlbnQpO1xuICAgIGN1cnJlbnQgPSBhY3RpdmF0aW9uUmVzO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIG9mIGludGVybWVkaWF0ZXMpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICB9XG5cbiAgcmV0dXJuIGN1cnJlbnQ7XG59XG5cbmV4cG9ydCBjb25zdCBfZnVzZWRNYXRNdWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogX0Z1c2VkTWF0TXVsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IF9mdXNlZE1hdE11bCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acos } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const acos = unaryKernelFunc(Acos, (xi) => Math.acos(xi));\nexport const acosConfig = {\n    kernelName: Acos,\n    backendName: 'cpu',\n    kernelFunc: acos,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQWNvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBY29zLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhY29zID0gdW5hcnlLZXJuZWxGdW5jKEFjb3MsICh4aSkgPT4gTWF0aC5hY29zKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhY29zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFjb3MsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYWNvcyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acosh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const acosh = unaryKernelFunc(Acosh, (xi) => Math.acosh(xi));\nexport const acoshConfig = {\n    kernelName: Acosh,\n    backendName: 'cpu',\n    kernelFunc: acosh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Fjb3NoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Fjb3NoLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhY29zaCA9IHVuYXJ5S2VybmVsRnVuYyhBY29zaCwgKHhpKSA9PiBNYXRoLmFjb3NoKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhY29zaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBY29zaCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhY29zaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AddN, buffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function addN(args) {\n    const { inputs, backend } = args;\n    const tensors = inputs;\n    assertNotComplex(inputs, 'addN');\n    const vals = tensors.map(t => backend.data.get(t.dataId).values);\n    const outBuf = buffer(tensors[0].shape, tensors[0].dtype);\n    const outVals = outBuf.values;\n    for (let i = 0; i < tensors.length; i++) {\n        const currVals = vals[i];\n        for (let j = 0; j < outVals.length; j++) {\n            outVals[j] += currVals[j];\n        }\n    }\n    return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n}\nexport const addNConfig = {\n    kernelName: AddN,\n    backendName: 'cpu',\n    kernelFunc: addN\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkTi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQWRkTi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFjLE1BQU0sRUFBMkQsTUFBTSx1QkFBdUIsQ0FBQztBQUd6SCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFtRDtJQUV0RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLE9BQU8sR0FBRyxNQUFrQixDQUFDO0lBRW5DLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVqQyxNQUFNLElBQUksR0FDTixPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBa0IsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDOUIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FkZE4sIEFkZE5JbnB1dHMsIGJ1ZmZlciwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3IsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWRkTihhcmdzOiB7aW5wdXRzOiBBZGROSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVX0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHMgYXMgVGVuc29yW107XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChpbnB1dHMsICdhZGROJyk7XG5cbiAgY29uc3QgdmFscyA9XG4gICAgICB0ZW5zb3JzLm1hcCh0ID0+IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3Qgb3V0QnVmID0gYnVmZmVyKHRlbnNvcnNbMF0uc2hhcGUsIHRlbnNvcnNbMF0uZHR5cGUgYXMgJ2Zsb2F0MzInKTtcbiAgY29uc3Qgb3V0VmFscyA9IG91dEJ1Zi52YWx1ZXM7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGVuc29ycy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGN1cnJWYWxzID0gdmFsc1tpXTtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IG91dFZhbHMubGVuZ3RoOyBqKyspIHtcbiAgICAgIG91dFZhbHNbal0gKz0gY3VyclZhbHNbal07XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGROLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGFkZE4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { All, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function all(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    assertNotComplex(x, 'all');\n    const origAxes = util.parseAxisParam(axis, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n    let $x = x;\n    if (permutedAxes != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        axes = backend_util.getInnerMostAxes(axes.length, x.shape.length);\n    }\n    backend_util.assertAxesAreInnerMostDims('all', axes, $x.shape.length);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n    const reduceSize = util.sizeFromShape(reduceShape);\n    const vals = util.makeZerosTypedArray(util.sizeFromShape(outShape), $x.dtype);\n    const aVals = backend.data.get($x.dataId).values;\n    for (let i = 0; i < vals.length; ++i) {\n        const offset = i * reduceSize;\n        let all = aVals[offset];\n        for (let j = 0; j < reduceSize; ++j) {\n            const value = aVals[offset + j];\n            all = all && value;\n        }\n        vals[i] = all;\n    }\n    if (permutedAxes != null) {\n        backend.disposeIntermediateTensorInfo($x);\n    }\n    const result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n    if (keepDims) {\n        const expandedShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n        const reshapedResult = reshape({ inputs: { x: result }, backend, attrs: { shape: expandedShape } });\n        backend.disposeIntermediateTensorInfo(result);\n        return reshapedResult;\n    }\n    return result;\n}\nexport const allConfig = {\n    kernelName: All,\n    backendName: 'cpu',\n    kernelFunc: all\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BbGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBdUIsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBbUU7SUFFckUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkU7SUFFRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQ3pCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxHQUFHLEdBQUcsR0FBRyxJQUFJLEtBQUssQ0FBQztTQUNwQjtRQUNELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDZjtJQUVELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDM0M7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWhFLElBQUksUUFBUSxFQUFFO1FBQ1osTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QyxPQUFPLGNBQWMsQ0FBQztLQUN2QjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWxsLCBBbGxBdHRycywgQWxsSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsKFxuICAgIGFyZ3M6IHtpbnB1dHM6IEFsbElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBBbGxBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICdhbGwnKTtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICBsZXQgJHggPSB4O1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAkeCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeC5zaGFwZS5sZW5ndGgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbGwnLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICBjb25zdCB2YWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksICR4LmR0eXBlKTtcblxuICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgbGV0IGFsbCA9IGFWYWxzW29mZnNldF07XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICBhbGwgPSBhbGwgJiYgdmFsdWU7XG4gICAgfVxuICAgIHZhbHNbaV0gPSBhbGw7XG4gIH1cblxuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCR4KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICR4LmR0eXBlLCB2YWxzKTtcblxuICBpZiAoa2VlcERpbXMpIHtcbiAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPVxuICAgICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBleHBhbmRlZFNoYXBlfX0pO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGFsbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBbGwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYWxsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Any, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function any(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    assertNotComplex(x, 'any');\n    const origAxes = util.parseAxisParam(axis, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n    let $x = x;\n    if (permutedAxes != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        axes = backend_util.getInnerMostAxes(axes.length, x.shape.length);\n    }\n    backend_util.assertAxesAreInnerMostDims('any', axes, $x.shape.length);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n    const reduceSize = util.sizeFromShape(reduceShape);\n    const vals = util.makeZerosTypedArray(util.sizeFromShape(outShape), $x.dtype);\n    const aVals = backend.data.get($x.dataId).values;\n    for (let i = 0; i < vals.length; ++i) {\n        const offset = i * reduceSize;\n        let anyVal = aVals[offset];\n        for (let j = 0; j < reduceSize; ++j) {\n            const value = aVals[offset + j];\n            anyVal = anyVal || value;\n        }\n        vals[i] = anyVal;\n    }\n    if (permutedAxes != null) {\n        backend.disposeIntermediateTensorInfo($x);\n    }\n    const result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n    if (keepDims) {\n        const expandedShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n        const reshapedResult = reshape({ inputs: { x: result }, backend, attrs: { shape: expandedShape } });\n        backend.disposeIntermediateTensorInfo(result);\n        return reshapedResult;\n    }\n    return result;\n}\nexport const anyConfig = {\n    kernelName: Any,\n    backendName: 'cpu',\n    kernelFunc: any\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BbnkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBdUIsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBbUU7SUFFckUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkU7SUFFRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQ3pCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxNQUFNLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxNQUFNLEdBQUcsTUFBTSxJQUFJLEtBQUssQ0FBQztTQUMxQjtRQUNELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUM7S0FDbEI7SUFFRCxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDeEIsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQzNDO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUVoRSxJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sYUFBYSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDNUUsTUFBTSxjQUFjLEdBQ2hCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLGFBQWEsRUFBQyxFQUFDLENBQUMsQ0FBQztRQUUzRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFOUMsT0FBTyxjQUFjLENBQUM7S0FDdkI7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FueSwgQW55QXR0cnMsIEFueUlucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFueShcbiAgICBhcmdzOiB7aW5wdXRzOiBBbnlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogQW55QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYW55Jyk7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHguc2hhcGUubGVuZ3RoKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYW55JywgYXhlcywgJHguc2hhcGUubGVuZ3RoKTtcbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoJHguc2hhcGUsIGF4ZXMpO1xuICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheSh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpLCAkeC5kdHlwZSk7XG5cbiAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgIGxldCBhbnlWYWwgPSBhVmFsc1tvZmZzZXRdO1xuICAgIGZvciAobGV0IGogPSAwOyBqIDwgcmVkdWNlU2l6ZTsgKytqKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IGFWYWxzW29mZnNldCArIGpdO1xuICAgICAgYW55VmFsID0gYW55VmFsIHx8IHZhbHVlO1xuICAgIH1cbiAgICB2YWxzW2ldID0gYW55VmFsO1xuICB9XG5cbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkeC5kdHlwZSwgdmFscyk7XG5cbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgY29uc3QgZXhwYW5kZWRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIGNvbnN0IHJlc2hhcGVkUmVzdWx0ID1cbiAgICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcblxuICAgIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBhbnlDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQW55LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGFueSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMax, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function argMax(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis } = attrs;\n    assertNotComplex(x, 'argMax');\n    let axes = util.parseAxisParam(axis, x.shape);\n    const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n    let $x = x;\n    const intermediateTensorInfos = [];\n    if (permutedAxes != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        intermediateTensorInfos.push($x);\n        axes = backend_util.getInnerMostAxes(axes.length, $x.shape.length);\n    }\n    axes = [axes[0]];\n    backend_util.assertAxesAreInnerMostDims('argMax', axes, $x.shape.length);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n    const outSize = util.sizeFromShape(outShape);\n    const vals = util.makeZerosTypedArray(outSize, 'int32');\n    const reduceSize = util.sizeFromShape(reduceShape);\n    const aVals = backend.data.get($x.dataId).values;\n    for (let i = 0; i < vals.length; ++i) {\n        const offset = i * reduceSize;\n        let max = aVals[offset];\n        let maxIndex = 0;\n        for (let j = 0; j < reduceSize; ++j) {\n            const value = aVals[offset + j];\n            if (value > max) {\n                max = value;\n                maxIndex = j;\n            }\n        }\n        vals[i] = maxIndex;\n    }\n    intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return backend.makeTensorInfo(outShape, 'int32', vals);\n}\nexport const argMaxConfig = {\n    kernelName: ArgMax,\n    backendName: 'cpu',\n    kernelFunc: argMax\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BcmdNYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBNkIsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5SSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQ25DLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3BFO0lBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsWUFBWSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUN6QixZQUFZLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUUzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUMvRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDZixHQUFHLEdBQUcsS0FBSyxDQUFDO2dCQUNaLFFBQVEsR0FBRyxDQUFDLENBQUM7YUFDZDtTQUNGO1FBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztLQUNwQjtJQUVELHVCQUF1QixDQUFDLE9BQU8sQ0FDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBcmdNYXgsIEFyZ01heEF0dHJzLCBBcmdNYXhJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmdNYXgoXG4gICAgYXJnczoge2lucHV0czogQXJnTWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IEFyZ01heEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXJnTWF4Jyk7XG5cbiAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBheGVzID0gW2F4ZXNbMF1dO1xuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01heCcsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKCR4LnNoYXBlLCBheGVzKTtcblxuICBjb25zdCBvdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRTaXplLCAnaW50MzInKTtcbiAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG5cbiAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgIGxldCBtYXggPSBhVmFsc1tvZmZzZXRdO1xuICAgIGxldCBtYXhJbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICBpZiAodmFsdWUgPiBtYXgpIHtcbiAgICAgICAgbWF4ID0gdmFsdWU7XG4gICAgICAgIG1heEluZGV4ID0gajtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsc1tpXSA9IG1heEluZGV4O1xuICB9XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICdpbnQzMicsIHZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgYXJnTWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFyZ01heCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhcmdNYXggYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMin, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function argMin(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis } = attrs;\n    assertNotComplex(x, 'argMin');\n    let axes = util.parseAxisParam(axis, x.shape);\n    const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n    let $x = x;\n    const intermediateTensorInfos = [];\n    if (permutedAxes != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        intermediateTensorInfos.push($x);\n        axes = backend_util.getInnerMostAxes(axes.length, $x.shape.length);\n    }\n    axes = [axes[0]];\n    backend_util.assertAxesAreInnerMostDims('argMin', axes, $x.shape.length);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n    const outSize = util.sizeFromShape(outShape);\n    const vals = util.makeZerosTypedArray(outSize, 'int32');\n    const reduceSize = util.sizeFromShape(reduceShape);\n    const aVals = backend.data.get($x.dataId).values;\n    for (let i = 0; i < vals.length; ++i) {\n        const offset = i * reduceSize;\n        let min = aVals[offset];\n        let minIndex = 0;\n        for (let j = 0; j < reduceSize; ++j) {\n            const value = aVals[offset + j];\n            if (value < min) {\n                min = value;\n                minIndex = j;\n            }\n        }\n        vals[i] = minIndex;\n    }\n    intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return backend.makeTensorInfo(outShape, 'int32', vals);\n}\nexport const argMinConfig = {\n    kernelName: ArgMin,\n    backendName: 'cpu',\n    kernelFunc: argMin\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BcmdNaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBNkIsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5SSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUU5QixJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0lBQ25DLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsdUJBQXVCLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3BFO0lBRUQsSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakIsWUFBWSxDQUFDLDBCQUEwQixDQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN6RSxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUN6QixZQUFZLENBQUMseUJBQXlCLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUUzRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUMvRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNwQyxNQUFNLE1BQU0sR0FBRyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzlCLElBQUksR0FBRyxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7UUFDakIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFVBQVUsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNuQyxNQUFNLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQ2hDLElBQUksS0FBSyxHQUFHLEdBQUcsRUFBRTtnQkFDZixHQUFHLEdBQUcsS0FBSyxDQUFDO2dCQUNaLFFBQVEsR0FBRyxDQUFDLENBQUM7YUFDZDtTQUNGO1FBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztLQUNwQjtJQUVELHVCQUF1QixDQUFDLE9BQU8sQ0FDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVuRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBcmdNaW4sIEFyZ01pbkF0dHJzLCBBcmdNaW5JbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmdNaW4oXG4gICAgYXJnczoge2lucHV0czogQXJnTWluSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IEFyZ01pbkF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXJnTWluJyk7XG5cbiAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBheGVzID0gW2F4ZXNbMF1dO1xuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01pbicsIGF4ZXMsICR4LnNoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKCR4LnNoYXBlLCBheGVzKTtcblxuICBjb25zdCBvdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgY29uc3QgdmFscyA9IHV0aWwubWFrZVplcm9zVHlwZWRBcnJheShvdXRTaXplLCAnaW50MzInKTtcbiAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG5cbiAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFscy5sZW5ndGg7ICsraSkge1xuICAgIGNvbnN0IG9mZnNldCA9IGkgKiByZWR1Y2VTaXplO1xuICAgIGxldCBtaW4gPSBhVmFsc1tvZmZzZXRdO1xuICAgIGxldCBtaW5JbmRleCA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICBpZiAodmFsdWUgPCBtaW4pIHtcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICAgIG1pbkluZGV4ID0gajtcbiAgICAgIH1cbiAgICB9XG4gICAgdmFsc1tpXSA9IG1pbkluZGV4O1xuICB9XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICdpbnQzMicsIHZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgYXJnTWluQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFyZ01pbixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhcmdNaW4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asin } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const asin = unaryKernelFunc(Asin, (xi) => Math.asin(xi));\nexport const asinConfig = {\n    kernelName: Asin,\n    backendName: 'cpu',\n    kernelFunc: asin,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQXNpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBc2luLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhc2luID0gdW5hcnlLZXJuZWxGdW5jKEFzaW4sICh4aSkgPT4gTWF0aC5hc2luKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhc2luQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFzaW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYXNpbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asinh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const asinh = unaryKernelFunc(Asinh, (xi) => Math.asinh(xi));\nexport const asinhConfig = {\n    kernelName: Asinh,\n    backendName: 'cpu',\n    kernelFunc: asinh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0FzaW5oLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhc2luaCA9IHVuYXJ5S2VybmVsRnVuYyhBc2luaCwgKHhpKSA9PiBNYXRoLmFzaW5oKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhc2luaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhc2luaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const atan = unaryKernelFunc(Atan, (xi) => Math.atan(xi));\nexport const atanConfig = {\n    kernelName: Atan,\n    backendName: 'cpu',\n    kernelFunc: atan,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQXRhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFuLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhdGFuID0gdW5hcnlLZXJuZWxGdW5jKEF0YW4sICh4aSkgPT4gTWF0aC5hdGFuKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhdGFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF0YW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYXRhbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan2 } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const atan2Impl = createSimpleBinaryKernelImpl((aValue, bValue) => Math.atan2(aValue, bValue));\nexport const atan2 = binaryKernelFunc(Atan2, atan2Impl);\nexport const atan2Config = {\n    kernelName: Atan2,\n    backendName: 'cpu',\n    kernelFunc: atan2,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0F0YW4yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUMxRCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsNEJBQTRCLENBQ2pELENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFnQixFQUFFLE1BQWdCLENBQUMsQ0FBQyxDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFFeEQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFuMiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhdGFuMkltcGwgPSBjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsKFxuICAgIChhVmFsdWUsIGJWYWx1ZSkgPT4gTWF0aC5hdGFuMihhVmFsdWUgYXMgbnVtYmVyLCBiVmFsdWUgYXMgbnVtYmVyKSk7XG5cbmV4cG9ydCBjb25zdCBhdGFuMiA9IGJpbmFyeUtlcm5lbEZ1bmMoQXRhbjIsIGF0YW4ySW1wbCk7XG5cbmV4cG9ydCBjb25zdCBhdGFuMkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuMixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhdGFuMixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atanh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const atanh = unaryKernelFunc(Atanh, (xi) => Math.atanh(xi));\nexport const atanhConfig = {\n    kernelName: Atanh,\n    backendName: 'cpu',\n    kernelFunc: atanh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0F0YW5oLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBhdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyhBdGFuaCwgKHhpKSA9PiBNYXRoLmF0YW5oKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBhdGFuaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuaCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhdGFuaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer } from '@tensorflow/tfjs-core';\nexport function pool(xValues, xShape, dtype, strides, convInfo, poolType) {\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n    const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n    const padTop = convInfo.padInfo.top;\n    const padLeft = convInfo.padInfo.left;\n    const initialValue = (poolType === 'max' ? Number.NEGATIVE_INFINITY :\n        Number.POSITIVE_INFINITY);\n    const output = buffer(convInfo.outShape, dtype);\n    const outputVals = output.values;\n    const outputBatchStrides = convInfo.outShape[1] * convInfo.outShape[2] * convInfo.outShape[3];\n    const outputRowStrides = convInfo.outShape[2] * convInfo.outShape[3];\n    const outputColStrides = convInfo.outShape[3];\n    for (let b = 0; b < convInfo.batchSize; ++b) {\n        const outputBatchOffset = b * outputBatchStrides;\n        const inputBatchOffset = b * strides[0];\n        for (let d = 0; d < convInfo.inChannels; ++d) {\n            for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n                const xRCorner = yR * strideHeight - padTop;\n                const xRMin = Math.max(0, xRCorner);\n                const xRMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRCorner);\n                const outputRowOffset = outputBatchOffset + yR * outputRowStrides;\n                for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n                    const xCCorner = yC * strideWidth - padLeft;\n                    const xCMin = Math.max(0, xCCorner);\n                    const xCMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xCCorner);\n                    let minMaxValue = initialValue;\n                    let avgValue = 0;\n                    let count = 0;\n                    for (let xR = xRMin; xR < xRMax; xR += dilationHeight) {\n                        const xROffset = inputBatchOffset + xR * strides[1];\n                        for (let xC = xCMin; xC < xCMax; xC += dilationWidth) {\n                            const xCOffset = xROffset + xC * strides[2];\n                            const pixel = xValues[xCOffset + d];\n                            if ((poolType === 'max' && pixel > minMaxValue)) {\n                                minMaxValue = pixel;\n                            }\n                            else if (poolType === 'avg') {\n                                avgValue += pixel;\n                                count++;\n                            }\n                        }\n                        if (isNaN(minMaxValue)) {\n                            break;\n                        }\n                    }\n                    const outputOffset = outputRowOffset + yC * outputColStrides + d;\n                    outputVals[outputOffset] =\n                        poolType === 'avg' ? avgValue / count : minMaxValue;\n                }\n            }\n        }\n    }\n    return output;\n}\nexport function maxPoolPositions(xValues, xShape, dtype, convInfo, flattenPositions = false, includeBatchInIndex = false) {\n    const maxPositions = buffer(convInfo.outShape, 'int32');\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n    const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n    const padTop = convInfo.padInfo.top;\n    const padLeft = convInfo.padInfo.left;\n    const xBuf = buffer(xShape, dtype, xValues);\n    for (let b = 0; b < convInfo.batchSize; ++b) {\n        for (let d = 0; d < convInfo.inChannels; ++d) {\n            for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n                const xRCorner = yR * strideHeight - padTop;\n                let xRMin = xRCorner;\n                while (xRMin < 0) {\n                    xRMin += dilationHeight;\n                }\n                // const xRMin = Math.max(0, xRCorner);\n                const xRMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRCorner);\n                for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n                    const xCCorner = yC * strideWidth - padLeft;\n                    let xCMin = xCCorner;\n                    while (xCMin < 0) {\n                        xCMin += dilationWidth;\n                    }\n                    const xCMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xCCorner);\n                    let maxValue = Number.NEGATIVE_INFINITY;\n                    let maxPosition = -1;\n                    for (let xR = xRMin; xR < xRMax; xR += dilationHeight) {\n                        const wR = xR - xRCorner;\n                        for (let xC = xCMin; xC < xCMax; xC += dilationWidth) {\n                            const wC = xC - xCCorner;\n                            const pixel = xBuf.get(b, xR, xC, d);\n                            if (pixel > maxValue) {\n                                maxValue = pixel;\n                                if (flattenPositions) {\n                                    maxPosition = includeBatchInIndex ?\n                                        ((b * convInfo.inHeight + xR) * convInfo.inWidth + xC) *\n                                            convInfo.inChannels +\n                                            d :\n                                        (xR * convInfo.inWidth + xC) * convInfo.inChannels + d;\n                                }\n                                else {\n                                    maxPosition = wR * effectiveFilterWidth + wC;\n                                }\n                            }\n                        }\n                    }\n                    maxPositions.set(maxPosition, b, yR, yC, d);\n                }\n            }\n        }\n    }\n    return maxPositions;\n}\nexport function pool3d(xValues, xShape, dtype, strides, convInfo, poolType) {\n    const strideDepth = convInfo.strideDepth;\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const dilationDepth = convInfo.dilationDepth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n    const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n    const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n    const padFront = convInfo.padInfo.front;\n    const padTop = convInfo.padInfo.top;\n    const padLeft = convInfo.padInfo.left;\n    const initialValue = (poolType === 'max' ? Number.NEGATIVE_INFINITY :\n        Number.POSITIVE_INFINITY);\n    const output = buffer(convInfo.outShape, dtype);\n    const outputVals = output.values;\n    const outputBatchStrides = convInfo.outShape[1] * convInfo.outShape[2] *\n        convInfo.outShape[3] * convInfo.outShape[4];\n    const outputDepthStrides = convInfo.outShape[2] * convInfo.outShape[3] * convInfo.outShape[4];\n    const outputRowStrides = convInfo.outShape[3] * convInfo.outShape[4];\n    const outputColStrides = convInfo.outShape[4];\n    for (let batch = 0; batch < convInfo.batchSize; ++batch) {\n        const outputBatchOffset = batch * outputBatchStrides;\n        const inputBatchOffset = batch * strides[0];\n        for (let channel = 0; channel < convInfo.inChannels; ++channel) {\n            for (let yDepth = 0; yDepth < convInfo.outDepth; ++yDepth) {\n                const xDepthCorner = yDepth * strideDepth - padFront;\n                let xDepthMin = xDepthCorner;\n                while (xDepthMin < 0) {\n                    xDepthMin += dilationDepth;\n                }\n                const xDepthMax = Math.min(convInfo.inDepth, effectiveFilterDepth + xDepthCorner);\n                const outputDepthOffset = outputBatchOffset + yDepth * outputDepthStrides;\n                for (let yRow = 0; yRow < convInfo.outHeight; ++yRow) {\n                    const xRowCorner = yRow * strideHeight - padTop;\n                    let xRowMin = xRowCorner;\n                    while (xRowMin < 0) {\n                        xRowMin += dilationHeight;\n                    }\n                    const xRowMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRowCorner);\n                    const outputRowOffset = outputDepthOffset + yRow * outputRowStrides;\n                    for (let yCol = 0; yCol < convInfo.outWidth; ++yCol) {\n                        const xColCorner = yCol * strideWidth - padLeft;\n                        let xColMin = xColCorner;\n                        while (xColMin < 0) {\n                            xColMin += dilationWidth;\n                        }\n                        const xColMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xColCorner);\n                        // Shader code begins\n                        const outputColOffset = outputRowOffset + yCol * outputColStrides;\n                        let minMaxValue = initialValue;\n                        let avgValue = 0;\n                        let count = 0;\n                        for (let xDepth = xDepthMin; xDepth < xDepthMax; xDepth += dilationDepth) {\n                            const xDepthOffset = inputBatchOffset + xDepth * strides[1];\n                            for (let xRow = xRowMin; xRow < xRowMax; xRow += dilationHeight) {\n                                const xRowOffset = xDepthOffset + xRow * strides[2];\n                                for (let xCol = xColMin; xCol < xColMax; xCol += dilationWidth) {\n                                    const xColOffset = xRowOffset + xCol * strides[3];\n                                    const pixel = xValues[xColOffset + channel];\n                                    if ((poolType === 'max' && pixel > minMaxValue)) {\n                                        minMaxValue = pixel;\n                                    }\n                                    else if (poolType === 'avg') {\n                                        avgValue += pixel;\n                                        count++;\n                                    }\n                                    if (isNaN(minMaxValue)) {\n                                        break;\n                                    }\n                                }\n                                if (isNaN(minMaxValue)) {\n                                    break;\n                                }\n                            }\n                            if (isNaN(minMaxValue)) {\n                                break;\n                            }\n                        }\n                        const outputOffset = outputColOffset + channel;\n                        outputVals[outputOffset] =\n                            poolType === 'avg' ? avgValue / count : minMaxValue;\n                    }\n                }\n            }\n        }\n    }\n    return output;\n}\nexport function maxPool3dPositions(xBuf, convInfo) {\n    const maxPositions = buffer(convInfo.outShape, 'int32');\n    const strideDepth = convInfo.strideDepth;\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const dilationDepth = convInfo.dilationDepth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n    const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n    const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n    const padFront = convInfo.padInfo.front;\n    const padTop = convInfo.padInfo.top;\n    const padLeft = convInfo.padInfo.left;\n    for (let batch = 0; batch < convInfo.batchSize; ++batch) {\n        for (let channel = 0; channel < convInfo.inChannels; ++channel) {\n            for (let yDepth = 0; yDepth < convInfo.outDepth; ++yDepth) {\n                const xDepthCorner = yDepth * strideDepth - padFront;\n                let xDepthMin = xDepthCorner;\n                while (xDepthMin < 0) {\n                    xDepthMin += dilationDepth;\n                }\n                const xDepthMax = Math.min(convInfo.inDepth, effectiveFilterDepth + xDepthCorner);\n                for (let yRow = 0; yRow < convInfo.outHeight; ++yRow) {\n                    const xRowCorner = yRow * strideHeight - padTop;\n                    let xRowMin = xRowCorner;\n                    while (xRowMin < 0) {\n                        xRowMin += dilationHeight;\n                    }\n                    const xRowMax = Math.min(convInfo.inHeight, effectiveFilterHeight + xRowCorner);\n                    for (let yCol = 0; yCol < convInfo.outWidth; ++yCol) {\n                        const xColCorner = yCol * strideWidth - padLeft;\n                        let xColMin = xColCorner;\n                        while (xColMin < 0) {\n                            xColMin += dilationWidth;\n                        }\n                        const xColMax = Math.min(convInfo.inWidth, effectiveFilterWidth + xColCorner);\n                        // Shader code begins\n                        let maxValue = Number.NEGATIVE_INFINITY;\n                        let maxPosition = -1;\n                        for (let xDepth = xDepthMin; xDepth < xDepthMax; xDepth += dilationDepth) {\n                            const wDepth = xDepth - xDepthCorner;\n                            for (let xRow = xRowMin; xRow < xRowMax; xRow += dilationHeight) {\n                                const wRow = xRow - xRowCorner;\n                                for (let xCol = xColMin; xCol < xColMax; xCol += dilationWidth) {\n                                    const wCol = xCol - xColCorner;\n                                    const pixel = xBuf.get(batch, xDepth, xRow, xCol, channel);\n                                    if (pixel >= maxValue) {\n                                        maxValue = pixel;\n                                        maxPosition =\n                                            wDepth * effectiveFilterHeight * effectiveFilterWidth +\n                                                wRow * effectiveFilterHeight + wCol;\n                                    }\n                                }\n                            }\n                        }\n                        maxPositions.set(maxPosition, batch, yDepth, yRow, yCol, channel);\n                    }\n                }\n            }\n        }\n    }\n    return maxPositions;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbF91dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL3V0aWxzL3Bvb2xfdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLE1BQU0sRUFBMkMsTUFBTSx1QkFBdUIsQ0FBQztBQUVyRyxNQUFNLFVBQVUsSUFBSSxDQUNoQixPQUFtQixFQUFFLE1BQWdCLEVBQUUsS0FBZSxFQUFFLE9BQWlCLEVBQ3pFLFFBQWlDLEVBQ2pDLFFBQXFCO0lBQ3ZCLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO0lBQy9DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDN0MsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7SUFDN0QsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUM7SUFDM0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFDcEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFFdEMsTUFBTSxZQUFZLEdBQ2QsQ0FBQyxRQUFRLEtBQUssS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUMxQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBRWpDLE1BQU0sa0JBQWtC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WSxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO3FCQUNuRTtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBidWZmZXIsIERhdGFUeXBlLCBSYW5rLCBUZW5zb3JCdWZmZXIsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBwb29sKFxuICAgIHhWYWx1ZXM6IFR5cGVkQXJyYXksIHhTaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSwgc3RyaWRlczogbnVtYmVyW10sXG4gICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLFxuICAgIHBvb2xUeXBlOiAnbWF4J3wnYXZnJyk6IFRlbnNvckJ1ZmZlcjxSYW5rLCBEYXRhVHlwZT4ge1xuICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZSA9XG4gICAgICAocG9vbFR5cGUgPT09ICdtYXgnID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXG4gIGNvbnN0IG91dHB1dCA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgZHR5cGUpO1xuICBjb25zdCBvdXRwdXRWYWxzID0gb3V0cHV0LnZhbHVlcztcblxuICBjb25zdCBvdXRwdXRCYXRjaFN0cmlkZXMgPVxuICAgICAgY29udkluZm8ub3V0U2hhcGVbMV0gKiBjb252SW5mby5vdXRTaGFwZVsyXSAqIGNvbnZJbmZvLm91dFNoYXBlWzNdO1xuICBjb25zdCBvdXRwdXRSb3dTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbMl0gKiBjb252SW5mby5vdXRTaGFwZVszXTtcbiAgY29uc3Qgb3V0cHV0Q29sU3RyaWRlcyA9IGNvbnZJbmZvLm91dFNoYXBlWzNdO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICBjb25zdCBvdXRwdXRCYXRjaE9mZnNldCA9IGIgKiBvdXRwdXRCYXRjaFN0cmlkZXM7XG4gICAgY29uc3QgaW5wdXRCYXRjaE9mZnNldCA9IGIgKiBzdHJpZGVzWzBdO1xuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkKSB7XG4gICAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICAgIGNvbnN0IHhSQ29ybmVyID0geVIgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgeFJDb3JuZXIpO1xuICAgICAgICBjb25zdCB4Uk1heCA9XG4gICAgICAgICAgICBNYXRoLm1pbihjb252SW5mby5pbkhlaWdodCwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpO1xuICAgICAgICBjb25zdCBvdXRwdXRSb3dPZmZzZXQgPSBvdXRwdXRCYXRjaE9mZnNldCArIHlSICogb3V0cHV0Um93U3RyaWRlcztcbiAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB5QyAqIHN0cmlkZVdpZHRoIC0gcGFkTGVmdDtcbiAgICAgICAgICBjb25zdCB4Q01pbiA9IE1hdGgubWF4KDAsIHhDQ29ybmVyKTtcbiAgICAgICAgICBjb25zdCB4Q01heCA9XG4gICAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENDb3JuZXIpO1xuICAgICAgICAgIGxldCBtaW5NYXhWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICBsZXQgYXZnVmFsdWUgPSAwO1xuICAgICAgICAgIGxldCBjb3VudCA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgeFIgPSB4Uk1pbjsgeFIgPCB4Uk1heDsgeFIgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgIGNvbnN0IHhST2Zmc2V0ID0gaW5wdXRCYXRjaE9mZnNldCArIHhSICogc3RyaWRlc1sxXTtcbiAgICAgICAgICAgIGZvciAobGV0IHhDID0geENNaW47IHhDIDwgeENNYXg7IHhDICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgeENPZmZzZXQgPSB4Uk9mZnNldCArIHhDICogc3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4VmFsdWVzW3hDT2Zmc2V0ICsgZF07XG4gICAgICAgICAgICAgIGlmICgocG9vbFR5cGUgPT09ICdtYXgnICYmIHBpeGVsID4gbWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgbWluTWF4VmFsdWUgPSBwaXhlbDtcbiAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycpIHtcbiAgICAgICAgICAgICAgICBhdmdWYWx1ZSArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICBjb3VudCsrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNOYU4obWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvdXRwdXRPZmZzZXQgPSBvdXRwdXRSb3dPZmZzZXQgKyB5QyAqIG91dHB1dENvbFN0cmlkZXMgKyBkO1xuICAgICAgICAgIG91dHB1dFZhbHNbb3V0cHV0T2Zmc2V0XSA9XG4gICAgICAgICAgICAgIHBvb2xUeXBlID09PSAnYXZnJyA/IGF2Z1ZhbHVlIC8gY291bnQgOiBtaW5NYXhWYWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbFBvc2l0aW9ucyhcbiAgICB4VmFsdWVzOiBUeXBlZEFycmF5LCB4U2hhcGU6IG51bWJlcltdLCBkdHlwZTogRGF0YVR5cGUsXG4gICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLCBmbGF0dGVuUG9zaXRpb25zID0gZmFsc2UsXG4gICAgaW5jbHVkZUJhdGNoSW5JbmRleCA9IGZhbHNlKTogVGVuc29yQnVmZmVyPFJhbmssICdpbnQzMic+IHtcbiAgY29uc3QgbWF4UG9zaXRpb25zID0gYnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCAnaW50MzInKTtcbiAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICBjb25zdCB4QnVmID0gYnVmZmVyKHhTaGFwZSwgZHR5cGUsIHhWYWx1ZXMpO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgZm9yIChsZXQgZCA9IDA7IGQgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIHN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgbGV0IHhSTWluID0geFJDb3JuZXI7XG4gICAgICAgIHdoaWxlICh4Uk1pbiA8IDApIHtcbiAgICAgICAgICB4Uk1pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgfVxuICAgICAgICAvLyBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIHhSQ29ybmVyKTtcbiAgICAgICAgY29uc3QgeFJNYXggPVxuICAgICAgICAgICAgTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSQ29ybmVyKTtcbiAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB5QyAqIHN0cmlkZVdpZHRoIC0gcGFkTGVmdDtcbiAgICAgICAgICBsZXQgeENNaW4gPSB4Q0Nvcm5lcjtcbiAgICAgICAgICB3aGlsZSAoeENNaW4gPCAwKSB7XG4gICAgICAgICAgICB4Q01pbiArPSBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB4Q01heCA9XG4gICAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENDb3JuZXIpO1xuICAgICAgICAgIGxldCBtYXhWYWx1ZSA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTtcbiAgICAgICAgICBsZXQgbWF4UG9zaXRpb24gPSAtMTtcblxuICAgICAgICAgIGZvciAobGV0IHhSID0geFJNaW47IHhSIDwgeFJNYXg7IHhSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCB3UiA9IHhSIC0geFJDb3JuZXI7XG4gICAgICAgICAgICBmb3IgKGxldCB4QyA9IHhDTWluOyB4QyA8IHhDTWF4OyB4QyArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdDID0geEMgLSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4QnVmLmdldChiLCB4UiwgeEMsIGQpO1xuICAgICAgICAgICAgICBpZiAocGl4ZWwgPiBtYXhWYWx1ZSkge1xuICAgICAgICAgICAgICAgIG1heFZhbHVlID0gcGl4ZWwgYXMgbnVtYmVyO1xuICAgICAgICAgICAgICAgIGlmIChmbGF0dGVuUG9zaXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICBtYXhQb3NpdGlvbiA9IGluY2x1ZGVCYXRjaEluSW5kZXggP1xuICAgICAgICAgICAgICAgICAgICAgICgoYiAqIGNvbnZJbmZvLmluSGVpZ2h0ICsgeFIpICogY29udkluZm8uaW5XaWR0aCArIHhDKSAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252SW5mby5pbkNoYW5uZWxzICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZCA6XG4gICAgICAgICAgICAgICAgICAgICAgKHhSICogY29udkluZm8uaW5XaWR0aCArIHhDKSAqIGNvbnZJbmZvLmluQ2hhbm5lbHMgKyBkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBtYXhQb3NpdGlvbiA9IHdSICogZWZmZWN0aXZlRmlsdGVyV2lkdGggKyB3QztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgbWF4UG9zaXRpb25zLnNldChtYXhQb3NpdGlvbiwgYiwgeVIsIHlDLCBkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gbWF4UG9zaXRpb25zO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcG9vbDNkKFxuICAgIHhWYWx1ZXM6IFR5cGVkQXJyYXksIHhTaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSwgc3RyaWRlczogbnVtYmVyW10sXG4gICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvLFxuICAgIHBvb2xUeXBlOiAnbWF4J3wnYXZnJyk6IFRlbnNvckJ1ZmZlcjxSYW5rLCBEYXRhVHlwZT4ge1xuICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRGcm9udCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gIGNvbnN0IGluaXRpYWxWYWx1ZSA9XG4gICAgICAocG9vbFR5cGUgPT09ICdtYXgnID8gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpO1xuXG4gIGNvbnN0IG91dHB1dCA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgZHR5cGUpO1xuICBjb25zdCBvdXRwdXRWYWxzID0gb3V0cHV0LnZhbHVlcztcblxuICBjb25zdCBvdXRwdXRCYXRjaFN0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVsxXSAqIGNvbnZJbmZvLm91dFNoYXBlWzJdICpcbiAgICAgIGNvbnZJbmZvLm91dFNoYXBlWzNdICogY29udkluZm8ub3V0U2hhcGVbNF07XG4gIGNvbnN0IG91dHB1dERlcHRoU3RyaWRlcyA9XG4gICAgICBjb252SW5mby5vdXRTaGFwZVsyXSAqIGNvbnZJbmZvLm91dFNoYXBlWzNdICogY29udkluZm8ub3V0U2hhcGVbNF07XG4gIGNvbnN0IG91dHB1dFJvd1N0cmlkZXMgPSBjb252SW5mby5vdXRTaGFwZVszXSAqIGNvbnZJbmZvLm91dFNoYXBlWzRdO1xuICBjb25zdCBvdXRwdXRDb2xTdHJpZGVzID0gY29udkluZm8ub3V0U2hhcGVbNF07XG5cbiAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgIGNvbnN0IG91dHB1dEJhdGNoT2Zmc2V0ID0gYmF0Y2ggKiBvdXRwdXRCYXRjaFN0cmlkZXM7XG4gICAgY29uc3QgaW5wdXRCYXRjaE9mZnNldCA9IGJhdGNoICogc3RyaWRlc1swXTtcbiAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrY2hhbm5lbCkge1xuICAgICAgZm9yIChsZXQgeURlcHRoID0gMDsgeURlcHRoIDwgY29udkluZm8ub3V0RGVwdGg7ICsreURlcHRoKSB7XG4gICAgICAgIGNvbnN0IHhEZXB0aENvcm5lciA9IHlEZXB0aCAqIHN0cmlkZURlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICAgIGxldCB4RGVwdGhNaW4gPSB4RGVwdGhDb3JuZXI7XG4gICAgICAgIHdoaWxlICh4RGVwdGhNaW4gPCAwKSB7XG4gICAgICAgICAgeERlcHRoTWluICs9IGRpbGF0aW9uRGVwdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeERlcHRoTWF4ID1cbiAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluRGVwdGgsIGVmZmVjdGl2ZUZpbHRlckRlcHRoICsgeERlcHRoQ29ybmVyKTtcbiAgICAgICAgY29uc3Qgb3V0cHV0RGVwdGhPZmZzZXQgPVxuICAgICAgICAgICAgb3V0cHV0QmF0Y2hPZmZzZXQgKyB5RGVwdGggKiBvdXRwdXREZXB0aFN0cmlkZXM7XG4gICAgICAgIGZvciAobGV0IHlSb3cgPSAwOyB5Um93IDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSb3cpIHtcbiAgICAgICAgICBjb25zdCB4Um93Q29ybmVyID0geVJvdyAqIHN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICBsZXQgeFJvd01pbiA9IHhSb3dDb3JuZXI7XG4gICAgICAgICAgd2hpbGUgKHhSb3dNaW4gPCAwKSB7XG4gICAgICAgICAgICB4Um93TWluICs9IGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCB4Um93TWF4ID1cbiAgICAgICAgICAgICAgTWF0aC5taW4oY29udkluZm8uaW5IZWlnaHQsIGVmZmVjdGl2ZUZpbHRlckhlaWdodCArIHhSb3dDb3JuZXIpO1xuICAgICAgICAgIGNvbnN0IG91dHB1dFJvd09mZnNldCA9IG91dHB1dERlcHRoT2Zmc2V0ICsgeVJvdyAqIG91dHB1dFJvd1N0cmlkZXM7XG4gICAgICAgICAgZm9yIChsZXQgeUNvbCA9IDA7IHlDb2wgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Q29sKSB7XG4gICAgICAgICAgICBjb25zdCB4Q29sQ29ybmVyID0geUNvbCAqIHN0cmlkZVdpZHRoIC0gcGFkTGVmdDtcbiAgICAgICAgICAgIGxldCB4Q29sTWluID0geENvbENvcm5lcjtcbiAgICAgICAgICAgIHdoaWxlICh4Q29sTWluIDwgMCkge1xuICAgICAgICAgICAgICB4Q29sTWluICs9IGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB4Q29sTWF4ID1cbiAgICAgICAgICAgICAgICBNYXRoLm1pbihjb252SW5mby5pbldpZHRoLCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHhDb2xDb3JuZXIpO1xuICAgICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zXG4gICAgICAgICAgICBjb25zdCBvdXRwdXRDb2xPZmZzZXQgPSBvdXRwdXRSb3dPZmZzZXQgKyB5Q29sICogb3V0cHV0Q29sU3RyaWRlcztcbiAgICAgICAgICAgIGxldCBtaW5NYXhWYWx1ZSA9IGluaXRpYWxWYWx1ZTtcbiAgICAgICAgICAgIGxldCBhdmdWYWx1ZSA9IDA7XG4gICAgICAgICAgICBsZXQgY291bnQgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgeERlcHRoID0geERlcHRoTWluOyB4RGVwdGggPCB4RGVwdGhNYXg7XG4gICAgICAgICAgICAgICAgIHhEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhEZXB0aE9mZnNldCA9IGlucHV0QmF0Y2hPZmZzZXQgKyB4RGVwdGggKiBzdHJpZGVzWzFdO1xuICAgICAgICAgICAgICBmb3IgKGxldCB4Um93ID0geFJvd01pbjsgeFJvdyA8IHhSb3dNYXg7IHhSb3cgKz0gZGlsYXRpb25IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB4Um93T2Zmc2V0ID0geERlcHRoT2Zmc2V0ICsgeFJvdyAqIHN0cmlkZXNbMl07XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgeENvbCA9IHhDb2xNaW47IHhDb2wgPCB4Q29sTWF4O1xuICAgICAgICAgICAgICAgICAgICAgeENvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB4Q29sT2Zmc2V0ID0geFJvd09mZnNldCArIHhDb2wgKiBzdHJpZGVzWzNdO1xuICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSB4VmFsdWVzW3hDb2xPZmZzZXQgKyBjaGFubmVsXTtcbiAgICAgICAgICAgICAgICAgIGlmICgocG9vbFR5cGUgPT09ICdtYXgnICYmIHBpeGVsID4gbWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlID0gcGl4ZWw7XG4gICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvb2xUeXBlID09PSAnYXZnJykge1xuICAgICAgICAgICAgICAgICAgICBhdmdWYWx1ZSArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICAgICAgY291bnQrKztcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChpc05hTihtaW5NYXhWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoaXNOYU4obWluTWF4VmFsdWUpKSB7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG91dHB1dE9mZnNldCA9IG91dHB1dENvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICBvdXRwdXRWYWxzW291dHB1dE9mZnNldF0gPVxuICAgICAgICAgICAgICAgIHBvb2xUeXBlID09PSAnYXZnJyA/IGF2Z1ZhbHVlIC8gY291bnQgOiBtaW5NYXhWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNkUG9zaXRpb25zKFxuICAgIHhCdWY6IFRlbnNvckJ1ZmZlcjxSYW5rLCBEYXRhVHlwZT4sXG4gICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvKTogVGVuc29yQnVmZmVyPFJhbmssIERhdGFUeXBlPiB7XG4gIGNvbnN0IG1heFBvc2l0aW9ucyA9IGJ1ZmZlcihjb252SW5mby5vdXRTaGFwZSwgJ2ludDMyJyk7XG4gIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gIGNvbnN0IHBhZEZyb250ID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICBmb3IgKGxldCB5RGVwdGggPSAwOyB5RGVwdGggPCBjb252SW5mby5vdXREZXB0aDsgKyt5RGVwdGgpIHtcbiAgICAgICAgY29uc3QgeERlcHRoQ29ybmVyID0geURlcHRoICogc3RyaWRlRGVwdGggLSBwYWRGcm9udDtcbiAgICAgICAgbGV0IHhEZXB0aE1pbiA9IHhEZXB0aENvcm5lcjtcbiAgICAgICAgd2hpbGUgKHhEZXB0aE1pbiA8IDApIHtcbiAgICAgICAgICB4RGVwdGhNaW4gKz0gZGlsYXRpb25EZXB0aDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB4RGVwdGhNYXggPVxuICAgICAgICAgICAgTWF0aC5taW4oY29udkluZm8uaW5EZXB0aCwgZWZmZWN0aXZlRmlsdGVyRGVwdGggKyB4RGVwdGhDb3JuZXIpO1xuICAgICAgICBmb3IgKGxldCB5Um93ID0gMDsgeVJvdyA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Um93KSB7XG4gICAgICAgICAgY29uc3QgeFJvd0Nvcm5lciA9IHlSb3cgKiBzdHJpZGVIZWlnaHQgLSBwYWRUb3A7XG4gICAgICAgICAgbGV0IHhSb3dNaW4gPSB4Um93Q29ybmVyO1xuICAgICAgICAgIHdoaWxlICh4Um93TWluIDwgMCkge1xuICAgICAgICAgICAgeFJvd01pbiArPSBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgeFJvd01heCA9XG4gICAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluSGVpZ2h0LCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKyB4Um93Q29ybmVyKTtcbiAgICAgICAgICBmb3IgKGxldCB5Q29sID0gMDsgeUNvbCA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDb2wpIHtcbiAgICAgICAgICAgIGNvbnN0IHhDb2xDb3JuZXIgPSB5Q29sICogc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgICAgbGV0IHhDb2xNaW4gPSB4Q29sQ29ybmVyO1xuICAgICAgICAgICAgd2hpbGUgKHhDb2xNaW4gPCAwKSB7XG4gICAgICAgICAgICAgIHhDb2xNaW4gKz0gZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHhDb2xNYXggPVxuICAgICAgICAgICAgICAgIE1hdGgubWluKGNvbnZJbmZvLmluV2lkdGgsIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgeENvbENvcm5lcik7XG5cbiAgICAgICAgICAgIC8vIFNoYWRlciBjb2RlIGJlZ2luc1xuICAgICAgICAgICAgbGV0IG1heFZhbHVlID0gTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuICAgICAgICAgICAgbGV0IG1heFBvc2l0aW9uID0gLTE7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHhEZXB0aCA9IHhEZXB0aE1pbjsgeERlcHRoIDwgeERlcHRoTWF4O1xuICAgICAgICAgICAgICAgICB4RGVwdGggKz0gZGlsYXRpb25EZXB0aCkge1xuICAgICAgICAgICAgICBjb25zdCB3RGVwdGggPSB4RGVwdGggLSB4RGVwdGhDb3JuZXI7XG4gICAgICAgICAgICAgIGZvciAobGV0IHhSb3cgPSB4Um93TWluOyB4Um93IDwgeFJvd01heDsgeFJvdyArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdSb3cgPSB4Um93IC0geFJvd0Nvcm5lcjtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB4Q29sID0geENvbE1pbjsgeENvbCA8IHhDb2xNYXg7XG4gICAgICAgICAgICAgICAgICAgICB4Q29sICs9IGRpbGF0aW9uV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdDb2wgPSB4Q29sIC0geENvbENvcm5lcjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0geEJ1Zi5nZXQoYmF0Y2gsIHhEZXB0aCwgeFJvdywgeENvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICBpZiAocGl4ZWwgPj0gbWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWUgPSBwaXhlbCBhcyBudW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIG1heFBvc2l0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHdEZXB0aCAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdSb3cgKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKyB3Q29sO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBtYXhQb3NpdGlvbnMuc2V0KG1heFBvc2l0aW9uLCBiYXRjaCwgeURlcHRoLCB5Um93LCB5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbWF4UG9zaXRpb25zO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { pool } from '../utils/pool_utils';\nimport { identity } from './Identity';\nexport function avgPool(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    assertNotComplex(x, 'avgPool');\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    const dilations = 1;\n    util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n    let res;\n    if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 &&\n        util.arraysEqual(convInfo.inShape, convInfo.outShape)) {\n        res = identity({ inputs: { x }, backend });\n    }\n    else {\n        const xValues = backend.data.get(x.dataId).values;\n        const strides = util.computeStrides(x.shape);\n        const buffer = pool(xValues, x.shape, x.dtype, strides, convInfo, 'avg');\n        res = backend.makeTensorInfo(convInfo.outShape, x.dtype, buffer.values);\n    }\n    return res;\n}\nexport const avgPoolConfig = {\n    kernelName: AvgPool,\n    backendName: 'cpu',\n    kernelFunc: avgPool\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQXZnUG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsT0FBTyxFQUErQixZQUFZLEVBQW9ELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsT0FBTyxDQUNuQixJQUN5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0IsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUMxRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUMvRCxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsZUFBZSxPQUFPLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNyQyxJQUFJLEdBQWUsQ0FBQztJQUVwQixJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUssQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3pELEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3hDO1NBQU07UUFDTCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLEdBQUcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUN4QixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQW9CLENBQUMsQ0FBQztLQUM5RDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0F2Z1Bvb2wsIEF2Z1Bvb2xBdHRycywgQXZnUG9vbElucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtwb29sfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBBdmdQb29sSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IEF2Z1Bvb2xBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ2F2Z1Bvb2wnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYmFja2VuZF91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGF2Z1Bvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgbGV0IHJlczogVGVuc29ySW5mbztcblxuICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgIHJlcyA9IGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBidWZmZXIgPSBwb29sKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnYXZnJyk7XG4gICAgcmVzID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUsIGJ1ZmZlci52YWx1ZXMgYXMgVHlwZWRBcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2xDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3D, backend_util, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { pool3d } from '../utils/pool_utils';\nexport function avgPool3D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { filterSize, strides, pad, dimRoundingMode, dataFormat } = attrs;\n    assertNotComplex(x, 'avgPool3d');\n    const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode, dataFormat);\n    const xValues = backend.data.get(x.dataId).values;\n    const outBuf = pool3d(xValues, x.shape, x.dtype, util.computeStrides(x.shape), convInfo, 'avg');\n    return backend.makeTensorInfo(outBuf.shape, 'float32', outBuf.values);\n}\nexport const avgPool3DConfig = {\n    kernelName: AvgPool3D,\n    backendName: 'cpu',\n    kernelFunc: avgPool3D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9BdmdQb29sM0QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFNBQVMsRUFBbUMsWUFBWSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd2SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTNDLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0RSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUN4RSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUNqQixPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU5RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F2Z1Bvb2wzRCwgQXZnUG9vbDNEQXR0cnMsIEF2Z1Bvb2wzRElucHV0cywgYmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtwb29sM2R9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNEKGFyZ3M6IHtcbiAgaW5wdXRzOiBBdmdQb29sM0RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogQXZnUG9vbDNEQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXR9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnYXZnUG9vbDNkJyk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgb3V0QnVmID0gcG9vbDNkKFxuICAgICAgeFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSwgY29udkluZm8sICdhdmcnKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsICdmbG9hdDMyJywgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sM0RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbDNELFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzRCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3DGrad, backend_util, buffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function avgPool3DGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, input } = inputs;\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    assertNotComplex([dy, input], 'avgPool3DGrad');\n    const convInfo = backend_util.computePool3DInfo(input.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode);\n    const strideDepth = convInfo.strideDepth;\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const filterDepth = convInfo.filterDepth;\n    const filterHeight = convInfo.filterHeight;\n    const filterWidth = convInfo.filterWidth;\n    const dilationDepth = convInfo.dilationDepth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n    const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n    const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n    const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n    const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n    const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n    const dx = buffer(input.shape, 'float32');\n    const avgMultiplier = 1 / (filterDepth * filterHeight * filterWidth);\n    const dyBuf = backend.bufferSync(dy);\n    for (let batch = 0; batch < convInfo.batchSize; ++batch) {\n        for (let channel = 0; channel < convInfo.inChannels; ++channel) {\n            for (let dxDepth = 0; dxDepth < convInfo.inDepth; ++dxDepth) {\n                for (let dxRow = 0; dxRow < convInfo.inHeight; ++dxRow) {\n                    for (let dxCol = 0; dxCol < convInfo.inWidth; ++dxCol) {\n                        // Shader code begins.\n                        const dyDepthCorner = dxDepth - padFront;\n                        const dyRowCorner = dxRow - padTop;\n                        const dyColCorner = dxCol - padLeft;\n                        let dotProd = 0;\n                        for (let wDepth = 0; wDepth < effectiveFilterDepth; wDepth += dilationDepth) {\n                            const dyDepth = (dyDepthCorner + wDepth) / strideDepth;\n                            if (dyDepth < 0 || dyDepth >= convInfo.outDepth ||\n                                Math.floor(dyDepth) !== dyDepth) {\n                                continue;\n                            }\n                            for (let wRow = 0; wRow < effectiveFilterHeight; wRow += dilationHeight) {\n                                const dyRow = (dyRowCorner + wRow) / strideHeight;\n                                if (dyRow < 0 || dyRow >= convInfo.outHeight ||\n                                    Math.floor(dyRow) !== dyRow) {\n                                    continue;\n                                }\n                                for (let wCol = 0; wCol < effectiveFilterWidth; wCol += dilationWidth) {\n                                    const dyCol = (dyColCorner + wCol) / strideWidth;\n                                    if (dyCol < 0 || dyCol >= convInfo.outWidth ||\n                                        Math.floor(dyCol) !== dyCol) {\n                                        continue;\n                                    }\n                                    const pixel = dyBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n                                    dotProd += pixel;\n                                }\n                            }\n                        }\n                        dx.set(dotProd * avgMultiplier, batch, dxDepth, dxRow, dxCol, channel);\n                    }\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const avgPool3DGradConfig = {\n    kernelName: AvgPool3DGrad,\n    backendName: 'cpu',\n    kernelFunc: avgPool3DGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNER3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQXZnUG9vbDNER3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsYUFBYSxFQUEyQyxZQUFZLEVBQUUsTUFBTSxFQUE2QyxNQUFNLHVCQUF1QixDQUFDO0FBRy9KLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFMUQsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFL0MsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxLQUFLLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQ25FLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUV0RCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7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S0FBSyxFQUFFO29DQUMvQixTQUFTO2lDQUNWO2dDQUNELEtBQUssSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFLElBQUksR0FBRyxvQkFBb0IsRUFDekMsSUFBSSxJQUFJLGFBQWEsRUFBRTtvQ0FDMUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLEdBQUcsV0FBVyxDQUFDO29DQUNqRCxJQUFJLEtBQUssR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLFFBQVEsQ0FBQyxRQUFRO3dDQUN2QyxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEtBQUssRUFBRTt3Q0FDL0IsU0FBUztxQ0FDVjtvQ0FFRCxNQUFNLEtBQUssR0FDUCxLQUFLLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztvQ0FDckQsT0FBTyxJQUFJLEtBQUssQ0FBQztpQ0FDbEI7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsRUFBRSxDQUFDLEdBQUcsQ0FDRixPQUFPLEdBQUcsYUFBYSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztxQkFDckU7aUJBQ0Y7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F2Z1Bvb2wzREdyYWQsIEF2Z1Bvb2wzREdyYWRBdHRycywgQXZnUG9vbDNER3JhZElucHV0cywgYmFja2VuZF91dGlsLCBidWZmZXIsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFuaywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0RHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBBdmdQb29sM0RHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IEF2Z1Bvb2wzREdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdhdmdQb29sM0RHcmFkJyk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICBpbnB1dC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLFxuICAgICAgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcblxuICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG4gIGNvbnN0IHBhZEZyb250ID0gZWZmZWN0aXZlRmlsdGVyRGVwdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCBkeCA9IGJ1ZmZlcihpbnB1dC5zaGFwZSwgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJEZXB0aCAqIGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcblxuICBjb25zdCBkeUJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KGR5KTtcblxuICBmb3IgKGxldCBiYXRjaCA9IDA7IGJhdGNoIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2JhdGNoKSB7XG4gICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2NoYW5uZWwpIHtcbiAgICAgIGZvciAobGV0IGR4RGVwdGggPSAwOyBkeERlcHRoIDwgY29udkluZm8uaW5EZXB0aDsgKytkeERlcHRoKSB7XG4gICAgICAgIGZvciAobGV0IGR4Um93ID0gMDsgZHhSb3cgPCBjb252SW5mby5pbkhlaWdodDsgKytkeFJvdykge1xuICAgICAgICAgIGZvciAobGV0IGR4Q29sID0gMDsgZHhDb2wgPCBjb252SW5mby5pbldpZHRoOyArK2R4Q29sKSB7XG4gICAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnMuXG4gICAgICAgICAgICBjb25zdCBkeURlcHRoQ29ybmVyID0gZHhEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgY29uc3QgZHlSb3dDb3JuZXIgPSBkeFJvdyAtIHBhZFRvcDtcbiAgICAgICAgICAgIGNvbnN0IGR5Q29sQ29ybmVyID0gZHhDb2wgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgd0RlcHRoID0gMDsgd0RlcHRoIDwgZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgICAgICAgICAgICAgIHdEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR5RGVwdGggPSAoZHlEZXB0aENvcm5lciArIHdEZXB0aCkgLyBzdHJpZGVEZXB0aDtcbiAgICAgICAgICAgICAgaWYgKGR5RGVwdGggPCAwIHx8IGR5RGVwdGggPj0gY29udkluZm8ub3V0RGVwdGggfHxcbiAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlEZXB0aCkgIT09IGR5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGxldCB3Um93ID0gMDsgd1JvdyA8IGVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICAgICAgICAgICAgICAgICB3Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHlSb3cgPSAoZHlSb3dDb3JuZXIgKyB3Um93KSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoZHlSb3cgPCAwIHx8IGR5Um93ID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5Um93KSAhPT0gZHlSb3cpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3Q29sID0gMDsgd0NvbCA8IGVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgd0NvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkeUNvbCA9IChkeUNvbENvcm5lciArIHdDb2wpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICBpZiAoZHlDb2wgPCAwIHx8IGR5Q29sID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUNvbCkgIT09IGR5Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9XG4gICAgICAgICAgICAgICAgICAgICAgZHlCdWYuZ2V0KGJhdGNoLCBkeURlcHRoLCBkeVJvdywgZHlDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGR4LnNldChcbiAgICAgICAgICAgICAgICBkb3RQcm9kICogYXZnTXVsdGlwbGllciwgYmF0Y2gsIGR4RGVwdGgsIGR4Um93LCBkeENvbCwgY2hhbm5lbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbDNER3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGF2Z1Bvb2wzREdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPoolGrad, backend_util, buffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function avgPoolGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, input } = inputs;\n    const x = input;\n    assertNotComplex([dy, input], 'avgPoolGrad');\n    const { filterSize, strides, pad } = attrs;\n    const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad);\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const filterHeight = convInfo.filterHeight;\n    const filterWidth = convInfo.filterWidth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n    const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n    const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n    const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n    const dx = buffer(x.shape, 'float32');\n    const avgMultiplier = 1 / (filterHeight * filterWidth);\n    const dyData = backend.data.get(dy.dataId).values;\n    const dyBuf = buffer(dy.shape, 'float32', dyData);\n    for (let b = 0; b < convInfo.batchSize; ++b) {\n        for (let d = 0; d < convInfo.inChannels; ++d) {\n            for (let dxR = 0; dxR < convInfo.inHeight; ++dxR) {\n                for (let dxC = 0; dxC < convInfo.inWidth; ++dxC) {\n                    // Shader code begins.\n                    const dyRCorner = dxR - padTop;\n                    const dyCCorner = dxC - padLeft;\n                    let dotProd = 0;\n                    for (let wR = 0; wR < effectiveFilterHeight; wR += dilationHeight) {\n                        const dyR = (dyRCorner + wR) / strideHeight;\n                        if (dyR < 0 || dyR >= convInfo.outHeight ||\n                            Math.floor(dyR) !== dyR) {\n                            continue;\n                        }\n                        for (let wC = 0; wC < effectiveFilterWidth; wC += dilationWidth) {\n                            const dyC = (dyCCorner + wC) / strideWidth;\n                            if (dyC < 0 || dyC >= convInfo.outWidth ||\n                                Math.floor(dyC) !== dyC) {\n                                continue;\n                            }\n                            const pixel = dyBuf.get(b, dyR, dyC, d);\n                            dotProd += pixel;\n                        }\n                    }\n                    dx.set(dotProd * avgMultiplier, b, dxR, dxC, d);\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const avgPoolGradConfig = {\n    kernelName: AvgPoolGrad,\n    backendName: 'cpu',\n    kernelFunc: avgPoolGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbEdyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0F2Z1Bvb2xHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxXQUFXLEVBQXVDLFlBQVksRUFBRSxNQUFNLEVBQTZDLE1BQU0sdUJBQXVCLENBQUM7QUFHekosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0IsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQzdDLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV6QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUF5QyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ2hFLENBQUMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDNUIsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FB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O0tBQ0Y7SUFDRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWlCO0lBQzdDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxXQUErQjtDQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtBdmdQb29sR3JhZCwgQXZnUG9vbEdyYWRBdHRycywgQXZnUG9vbEdyYWRJbnB1dHMsIGJhY2tlbmRfdXRpbCwgYnVmZmVyLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhbmssIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbEdyYWQoYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2xHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IEF2Z1Bvb2xHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IHggPSBpbnB1dDtcbiAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ2F2Z1Bvb2xHcmFkJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnM7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG4gIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGR4ID1cbiAgICAgIGJ1ZmZlcjxSYW5rLlI0Pih4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGF2Z011bHRpcGxpZXIgPSAxIC8gKGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcblxuICBjb25zdCBkeURhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIEZsb2F0MzJBcnJheTtcbiAgY29uc3QgZHlCdWYgPSBidWZmZXI8UmFuay5SND4oXG4gICAgICBkeS5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgJ2Zsb2F0MzInLCBkeURhdGEpO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICBmb3IgKGxldCBkID0gMDsgZCA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgZm9yIChsZXQgZHhSID0gMDsgZHhSIDwgY29udkluZm8uaW5IZWlnaHQ7ICsrZHhSKSB7XG4gICAgICAgIGZvciAobGV0IGR4QyA9IDA7IGR4QyA8IGNvbnZJbmZvLmluV2lkdGg7ICsrZHhDKSB7XG4gICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zLlxuICAgICAgICAgIGNvbnN0IGR5UkNvcm5lciA9IGR4UiAtIHBhZFRvcDtcbiAgICAgICAgICBjb25zdCBkeUNDb3JuZXIgPSBkeEMgLSBwYWRMZWZ0O1xuICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZWZmZWN0aXZlRmlsdGVySGVpZ2h0OyB3UiArPSBkaWxhdGlvbkhlaWdodCkge1xuICAgICAgICAgICAgY29uc3QgZHlSID0gKGR5UkNvcm5lciArIHdSKSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgIGlmIChkeVIgPCAwIHx8IGR5UiA+PSBjb252SW5mby5vdXRIZWlnaHQgfHxcbiAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5UikgIT09IGR5Uikge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBlZmZlY3RpdmVGaWx0ZXJXaWR0aDsgd0MgKz0gZGlsYXRpb25XaWR0aCkge1xuICAgICAgICAgICAgICBjb25zdCBkeUMgPSAoZHlDQ29ybmVyICsgd0MpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSBjb252SW5mby5vdXRXaWR0aCB8fFxuICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUMpICE9PSBkeUMpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNvbnN0IHBpeGVsID0gZHlCdWYuZ2V0KGIsIGR5UiwgZHlDLCBkKTtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZHguc2V0KGRvdFByb2QgKiBhdmdNdWx0aXBsaWVyLCBiLCBkeFIsIGR4QywgZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbEdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbEdyYWQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYXZnUG9vbEdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FusedBatchNorm, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function batchNorm(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, scale, offset, mean, variance } = inputs;\n    util.assert(mean.shape.length === variance.shape.length, () => 'Batch normalization gradient requires mean and variance to have ' +\n        'equal ranks.');\n    util.assert(offset == null || mean.shape.length === offset.shape.length, () => 'Batch normalization gradient requires mean and offset to have ' +\n        'equal ranks.');\n    util.assert(scale == null || mean.shape.length === scale.shape.length, () => 'Batch normalization gradient requires mean and scale to have ' +\n        'equal ranks.');\n    assertNotComplex([x, mean, variance, scale, offset], 'batchNorm');\n    let { varianceEpsilon } = attrs;\n    if (varianceEpsilon == null) {\n        varianceEpsilon = 0.001;\n    }\n    const xVals = backend.data.get(x.dataId).values;\n    const mVals = backend.data.get(mean.dataId).values;\n    const varVals = backend.data.get(variance.dataId).values;\n    const sVals = scale ? backend.data.get(scale.dataId).values :\n        new Float32Array([1]);\n    const offVals = offset ?\n        backend.data.get(offset.dataId).values :\n        new Float32Array([0]);\n    const outVals = new Float32Array(xVals.length);\n    const offValsLength = offVals.length;\n    const sValsLength = sVals.length;\n    const varValsLength = varVals.length;\n    const mValsLength = mVals.length;\n    let offi = 0;\n    let mi = 0;\n    let si = 0;\n    let vi = 0;\n    for (let i = 0; i < xVals.length; ++i) {\n        outVals[i] = offVals[offi++] +\n            (xVals[i] - mVals[mi++]) * sVals[si++] /\n                Math.sqrt(varVals[vi++] + varianceEpsilon);\n        if (offi >= offValsLength) {\n            offi = 0;\n        }\n        if (mi >= mValsLength) {\n            mi = 0;\n        }\n        if (si >= sValsLength) {\n            si = 0;\n        }\n        if (vi >= varValsLength) {\n            vi = 0;\n        }\n    }\n    return backend.makeTensorInfo(x.shape, x.dtype, outVals);\n}\nexport const batchNormConfig = {\n    kernelName: FusedBatchNorm,\n    backendName: 'cpu',\n    kernelFunc: batchNorm,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hOb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9CYXRjaE5vcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGNBQWMsRUFBK0YsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDM0MsR0FBRyxFQUFFLENBQUMsa0VBQWtFO1FBQ3BFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDM0QsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDekQsR0FBRyxFQUFFLENBQUMsK0RBQStEO1FBQ2pFLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxF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QUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGdXNlZEJhdGNoTm9ybSwgRnVzZWRCYXRjaE5vcm1BdHRycywgRnVzZWRCYXRjaE5vcm1JbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBiYXRjaE5vcm0oYXJnczoge1xuICBpbnB1dHM6IEZ1c2VkQmF0Y2hOb3JtSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IEZ1c2VkQmF0Y2hOb3JtQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHNjYWxlLCBvZmZzZXQsIG1lYW4sIHZhcmlhbmNlfSA9IGlucHV0cztcblxuICB1dGlsLmFzc2VydChcbiAgICAgIG1lYW4uc2hhcGUubGVuZ3RoID09PSB2YXJpYW5jZS5zaGFwZS5sZW5ndGgsXG4gICAgICAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCB2YXJpYW5jZSB0byBoYXZlICcgK1xuICAgICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBvZmZzZXQgPT0gbnVsbCB8fCBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gb2Zmc2V0LnNoYXBlLmxlbmd0aCxcbiAgICAgICgpID0+ICdCYXRjaCBub3JtYWxpemF0aW9uIGdyYWRpZW50IHJlcXVpcmVzIG1lYW4gYW5kIG9mZnNldCB0byBoYXZlICcgK1xuICAgICAgICAgICdlcXVhbCByYW5rcy4nKTtcbiAgdXRpbC5hc3NlcnQoXG4gICAgICBzY2FsZSA9PSBudWxsIHx8IG1lYW4uc2hhcGUubGVuZ3RoID09PSBzY2FsZS5zaGFwZS5sZW5ndGgsXG4gICAgICAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBzY2FsZSB0byBoYXZlICcgK1xuICAgICAgICAgICdlcXVhbCByYW5rcy4nKTtcblxuICBhc3NlcnROb3RDb21wbGV4KFt4LCBtZWFuLCB2YXJpYW5jZSwgc2NhbGUsIG9mZnNldF0sICdiYXRjaE5vcm0nKTtcblxuICBsZXQge3ZhcmlhbmNlRXBzaWxvbn0gPSBhdHRycztcbiAgaWYgKHZhcmlhbmNlRXBzaWxvbiA9PSBudWxsKSB7XG4gICAgdmFyaWFuY2VFcHNpbG9uID0gMC4wMDE7XG4gIH1cblxuICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBtVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQobWVhbi5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB2YXJWYWxzID0gYmFja2VuZC5kYXRhLmdldCh2YXJpYW5jZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBzVmFscyA9IHNjYWxlID8gYmFja2VuZC5kYXRhLmdldChzY2FsZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5IDpcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzFdKTtcbiAgY29uc3Qgb2ZmVmFscyA9IG9mZnNldCA/XG4gICAgICBiYWNrZW5kLmRhdGEuZ2V0KG9mZnNldC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5IDpcbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkoWzBdKTtcbiAgY29uc3Qgb3V0VmFscyA9IG5ldyBGbG9hdDMyQXJyYXkoeFZhbHMubGVuZ3RoKTtcblxuICBjb25zdCBvZmZWYWxzTGVuZ3RoID0gb2ZmVmFscy5sZW5ndGg7XG4gIGNvbnN0IHNWYWxzTGVuZ3RoID0gc1ZhbHMubGVuZ3RoO1xuICBjb25zdCB2YXJWYWxzTGVuZ3RoID0gdmFyVmFscy5sZW5ndGg7XG4gIGNvbnN0IG1WYWxzTGVuZ3RoID0gbVZhbHMubGVuZ3RoO1xuXG4gIGxldCBvZmZpID0gMDtcbiAgbGV0IG1pID0gMDtcbiAgbGV0IHNpID0gMDtcbiAgbGV0IHZpID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4VmFscy5sZW5ndGg7ICsraSkge1xuICAgIG91dFZhbHNbaV0gPSBvZmZWYWxzW29mZmkrK10gK1xuICAgICAgICAoeFZhbHNbaV0gLSBtVmFsc1ttaSsrXSkgKiBzVmFsc1tzaSsrXSAvXG4gICAgICAgICAgICBNYXRoLnNxcnQodmFyVmFsc1t2aSsrXSArIHZhcmlhbmNlRXBzaWxvbik7XG4gICAgaWYgKG9mZmkgPj0gb2ZmVmFsc0xlbmd0aCkge1xuICAgICAgb2ZmaSA9IDA7XG4gICAgfVxuICAgIGlmIChtaSA+PSBtVmFsc0xlbmd0aCkge1xuICAgICAgbWkgPSAwO1xuICAgIH1cbiAgICBpZiAoc2kgPj0gc1ZhbHNMZW5ndGgpIHtcbiAgICAgIHNpID0gMDtcbiAgICB9XG4gICAgaWYgKHZpID49IHZhclZhbHNMZW5ndGgpIHtcbiAgICAgIHZpID0gMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgeC5kdHlwZSwgb3V0VmFscyk7XG59XG5cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRnVzZWRCYXRjaE5vcm0sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYmF0Y2hOb3JtIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, BatchToSpaceND } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nimport { transpose } from './Transpose';\nexport function batchToSpaceND(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { blockShape, crops } = attrs;\n    assertNotComplex([x], 'batchToSpaceND');\n    const prod = blockShape.reduce((a, b) => a * b);\n    const reshaped = backend_util.getReshaped(x.shape, blockShape, prod);\n    const permuted = backend_util.getPermuted(reshaped.length, blockShape.length);\n    const reshapedPermuted = backend_util.getReshapedPermuted(x.shape, blockShape, prod);\n    const sliceBeginCoords = backend_util.getSliceBeginCoords(crops, blockShape.length);\n    const sliceSize = backend_util.getSliceSize(reshapedPermuted, crops, blockShape.length);\n    const xReshaped = reshape({ inputs: { x }, backend, attrs: { shape: reshaped } });\n    const xTransposed = transpose({ inputs: { x: xReshaped }, backend, attrs: { perm: permuted } });\n    const xTransposedReshaped = reshape({ inputs: { x: xTransposed }, backend, attrs: { shape: reshapedPermuted } });\n    const result = slice({\n        inputs: { x: xTransposedReshaped },\n        backend,\n        attrs: { begin: sliceBeginCoords, size: sliceSize }\n    });\n    backend.disposeIntermediateTensorInfo(xReshaped);\n    backend.disposeIntermediateTensorInfo(xTransposed);\n    backend.disposeIntermediateTensorInfo(xTransposedReshaped);\n    return result;\n}\nexport const batchToSpaceNDConfig = {\n    kernelName: BatchToSpaceND,\n    backendName: 'cpu',\n    kernelFunc: batchToSpaceND\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hUb1NwYWNlTkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0JhdGNoVG9TcGFjZU5ELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFrRixNQUFNLHVCQUF1QixDQUFDO0FBR3BKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsY0FBYyxDQUFDLElBSTlCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFVBQVUsRUFBRSxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbEMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXhDLE1BQU0sSUFBSSxHQUFHLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFFaEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLE1BQU0sZ0JBQWdCLEdBQ2xCLFlBQVksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxNQUFNLGdCQUFnQixHQUNsQixZQUFZLENBQUMsbUJBQW1CLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvRCxNQUFNLFNBQVMsR0FDWCxZQUFZLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFMUUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxXQUFXLEdBQ2IsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFNBQVMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzFFLE1BQU0sbUJBQW1CLEdBQUcsT0FBTyxDQUMvQixFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxXQUFXLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLGdCQUFnQixFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsbUJBQW1CLEVBQUM7UUFDaEMsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFDO0tBQ2xELENBQUMsQ0FBQztJQUVILE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUNqRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFFM0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFpQjtJQUNoRCxVQUFVLEVBQUUsY0FBYztJQUMxQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsY0FBa0M7Q0FDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhdGNoVG9TcGFjZU5ELCBCYXRjaFRvU3BhY2VOREF0dHJzLCBCYXRjaFRvU3BhY2VORElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoVG9TcGFjZU5EKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaFRvU3BhY2VORElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBCYXRjaFRvU3BhY2VOREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2Jsb2NrU2hhcGUsIGNyb3BzfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW3hdLCAnYmF0Y2hUb1NwYWNlTkQnKTtcblxuICBjb25zdCBwcm9kID0gYmxvY2tTaGFwZS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiKTtcblxuICBjb25zdCByZXNoYXBlZCA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgY29uc3QgcGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWQubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPVxuICAgICAgYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPVxuICAgICAgYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgY29uc3Qgc2xpY2VTaXplID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRTbGljZVNpemUocmVzaGFwZWRQZXJtdXRlZCwgY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcblxuICBjb25zdCB4UmVzaGFwZWQgPSByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogcmVzaGFwZWR9fSk7XG4gIGNvbnN0IHhUcmFuc3Bvc2VkID1cbiAgICAgIHRyYW5zcG9zZSh7aW5wdXRzOiB7eDogeFJlc2hhcGVkfSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZH19KTtcbiAgY29uc3QgeFRyYW5zcG9zZWRSZXNoYXBlZCA9IHJlc2hhcGUoXG4gICAgICB7aW5wdXRzOiB7eDogeFRyYW5zcG9zZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiByZXNoYXBlZFBlcm11dGVkfX0pO1xuICBjb25zdCByZXN1bHQgPSBzbGljZSh7XG4gICAgaW5wdXRzOiB7eDogeFRyYW5zcG9zZWRSZXNoYXBlZH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge2JlZ2luOiBzbGljZUJlZ2luQ29vcmRzLCBzaXplOiBzbGljZVNpemV9XG4gIH0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oeFJlc2hhcGVkKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh4VHJhbnNwb3NlZCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oeFRyYW5zcG9zZWRSZXNoYXBlZCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJhdGNoVG9TcGFjZU5ELFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGJhdGNoVG9TcGFjZU5EIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Bincount } from '@tensorflow/tfjs-core';\nimport { bincountImpl } from './Bincount_impl';\nexport function bincount(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, weights } = inputs;\n    const { size } = attrs;\n    const xVals = backend.data.get(x.dataId).values;\n    const weightsVals = backend.data.get(weights.dataId).values;\n    const outVals = bincountImpl(xVals, weightsVals, weights.dtype, weights.shape, size);\n    return backend.makeTensorInfo([size], weights.dtype, outVals);\n}\nexport const bincountConfig = {\n    kernelName: Bincount,\n    backendName: 'cpu',\n    kernelFunc: bincount\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0JpbmNvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQWtGLE1BQU0sdUJBQXVCLENBQUM7QUFHaEksT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRTdDLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFJeEI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUM5RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUUxRSxNQUFNLE9BQU8sR0FDVCxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFekUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsUUFBNEI7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtCaW5jb3VudCwgQmluY291bnRBdHRycywgQmluY291bnRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHtiaW5jb3VudEltcGx9IGZyb20gJy4vQmluY291bnRfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5jb3VudChhcmdzOiB7XG4gIGlucHV0czogQmluY291bnRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogQmluY291bnRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgd2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHdlaWdodHNWYWxzID0gYmFja2VuZC5kYXRhLmdldCh3ZWlnaHRzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3Qgb3V0VmFscyA9XG4gICAgICBiaW5jb3VudEltcGwoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgYmluY291bnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQmluY291bnQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogYmluY291bnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, BroadcastArgs } from '@tensorflow/tfjs-core';\nexport function broadcastArgs(args) {\n    const { inputs, backend } = args;\n    const { s0, s1 } = inputs;\n    const s0Vals = backend.data.get(s0.dataId).values;\n    const s1Vals = backend.data.get(s1.dataId).values;\n    const broadcastShape = backend_util.assertAndGetBroadcastShape(Array.from(s0Vals), Array.from(s1Vals));\n    return backend.makeTensorInfo([broadcastShape.length], 'int32', Int32Array.from(broadcastShape));\n}\nexport const broadcastArgsConfig = {\n    kernelName: BroadcastArgs,\n    backendName: 'cpu',\n    kernelFunc: broadcastArgs\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJvYWRjYXN0QXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQnJvYWRjYXN0QXJncy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLGFBQWEsRUFBNEQsTUFBTSx1QkFBdUIsQ0FBQztBQUk3SCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBRzdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFeEIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFaEUsTUFBTSxjQUFjLEdBQUcsWUFBWSxDQUFDLDBCQUEwQixDQUMxRCxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUU1QyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQ3pCLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFpQjtJQUMvQyxVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsYUFBYTtDQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQnJvYWRjYXN0QXJncywgQnJvYWRjYXN0QXJnc0lucHV0cywgS2VybmVsQ29uZmlnLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBicm9hZGNhc3RBcmdzKGFyZ3M6IHtcbiAgaW5wdXRzOiBCcm9hZGNhc3RBcmdzSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7czAsIHMxfSA9IGlucHV0cztcblxuICBjb25zdCBzMFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHMwLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHMxVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoczEuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCBicm9hZGNhc3RTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShcbiAgICAgIEFycmF5LmZyb20oczBWYWxzKSwgQXJyYXkuZnJvbShzMVZhbHMpKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFticm9hZGNhc3RTaGFwZS5sZW5ndGhdLCAnaW50MzInLCBJbnQzMkFycmF5LmZyb20oYnJvYWRjYXN0U2hhcGUpKTtcbn1cblxuZXhwb3J0IGNvbnN0IGJyb2FkY2FzdEFyZ3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQnJvYWRjYXN0QXJncyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBicm9hZGNhc3RBcmdzXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ClipByValue } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const clipByValue = unaryKernelFunc(ClipByValue, (xi, attrs) => {\n    const clipAttrs = attrs;\n    if (xi > clipAttrs.clipValueMax) {\n        return clipAttrs.clipValueMax;\n    }\n    return xi < clipAttrs.clipValueMin ? clipAttrs.clipValueMin : xi;\n});\nexport const clipByValueConfig = {\n    kernelName: ClipByValue,\n    backendName: 'cpu',\n    kernelFunc: clipByValue,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpcEJ5VmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0NsaXBCeVZhbHVlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQWlDLE1BQU0sdUJBQXVCLENBQUM7QUFFbEYsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxlQUFlLENBQUMsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQ3BFLE1BQU0sU0FBUyxHQUFHLEtBQStCLENBQUM7SUFDbEQsSUFBSSxFQUFFLEdBQUcsU0FBUyxDQUFDLFlBQVksRUFBRTtRQUMvQixPQUFPLFNBQVMsQ0FBQyxZQUFZLENBQUM7S0FDL0I7SUFDRCxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDbkUsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQVc7Q0FDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q2xpcEJ5VmFsdWUsIENsaXBCeVZhbHVlQXR0cnMsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGNsaXBCeVZhbHVlID0gdW5hcnlLZXJuZWxGdW5jKENsaXBCeVZhbHVlLCAoeGksIGF0dHJzKSA9PiB7XG4gIGNvbnN0IGNsaXBBdHRycyA9IGF0dHJzIGFzIHt9IGFzIENsaXBCeVZhbHVlQXR0cnM7XG4gIGlmICh4aSA+IGNsaXBBdHRycy5jbGlwVmFsdWVNYXgpIHtcbiAgICByZXR1cm4gY2xpcEF0dHJzLmNsaXBWYWx1ZU1heDtcbiAgfVxuICByZXR1cm4geGkgPCBjbGlwQXR0cnMuY2xpcFZhbHVlTWluID8gY2xpcEF0dHJzLmNsaXBWYWx1ZU1pbiA6IHhpO1xufSk7XG5cbmV4cG9ydCBjb25zdCBjbGlwQnlWYWx1ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjbGlwQnlWYWx1ZSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ComplexAbs, util } from '@tensorflow/tfjs-core';\nexport const complexAbs = (args) => {\n    const { x } = args.inputs;\n    const cpuBackend = args.backend;\n    const resultValues = new Float32Array(util.sizeFromShape(x.shape));\n    const complexVals = cpuBackend.data.get(x.dataId);\n    const real = complexVals.complexTensorInfos.real;\n    const imag = complexVals.complexTensorInfos.imag;\n    const realVals = cpuBackend.data.get(real.dataId).values;\n    const imagVals = cpuBackend.data.get(imag.dataId).values;\n    for (let i = 0; i < realVals.length; i++) {\n        const real = realVals[i];\n        const imag = imagVals[i];\n        resultValues[i] = Math.hypot(real, imag);\n    }\n    return cpuBackend.makeOutput(resultValues, x.shape, 'float32');\n};\nexport const complexAbsConfig = {\n    kernelName: ComplexAbs,\n    backendName: 'cpu',\n    kernelFunc: complexAbs,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleEFicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29tcGxleEFicy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUE4QyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUluRyxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQ25CLENBQUMsSUFBeUQsRUFBRSxFQUFFO0lBQzVELE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDaEMsTUFBTSxZQUFZLEdBQUcsSUFBSSxZQUFZLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUNuRSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDbEQsTUFBTSxJQUFJLEdBQUcsV0FBVyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztJQUNqRCxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO0lBQ2pELE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFzQixDQUFDO0lBQ3pFLE1BQU0sUUFBUSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFzQixDQUFDO0lBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QixNQUFNLElBQUksR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekIsWUFBWSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0tBQzFDO0lBRUQsT0FBTyxVQUFVLENBQUMsVUFBVSxDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pFLENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsVUFBOEI7Q0FDM0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q29tcGxleEFicywgQ29tcGxleEFic0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBjb25zdCBjb21wbGV4QWJzID1cbiAgICAoYXJnczoge2lucHV0czogQ29tcGxleEFic0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KSA9PiB7XG4gICAgICBjb25zdCB7eH0gPSBhcmdzLmlucHV0cztcbiAgICAgIGNvbnN0IGNwdUJhY2tlbmQgPSBhcmdzLmJhY2tlbmQ7XG4gICAgICBjb25zdCByZXN1bHRWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKSk7XG4gICAgICBjb25zdCBjb21wbGV4VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgICAgY29uc3QgcmVhbCA9IGNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsO1xuICAgICAgY29uc3QgaW1hZyA9IGNvbXBsZXhWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuICAgICAgY29uc3QgcmVhbFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHJlYWwuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgY29uc3QgaW1hZ1ZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWFsVmFscy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCByZWFsID0gcmVhbFZhbHNbaV07XG4gICAgICAgIGNvbnN0IGltYWcgPSBpbWFnVmFsc1tpXTtcbiAgICAgICAgcmVzdWx0VmFsdWVzW2ldID0gTWF0aC5oeXBvdChyZWFsLCBpbWFnKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGNwdUJhY2tlbmQubWFrZU91dHB1dChyZXN1bHRWYWx1ZXMsIHguc2hhcGUsICdmbG9hdDMyJyk7XG4gICAgfTtcblxuZXhwb3J0IGNvbnN0IGNvbXBsZXhBYnNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29tcGxleEFicyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb21wbGV4QWJzIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Imag } from '@tensorflow/tfjs-core';\nexport function imag(args) {\n    const { inputs, backend } = args;\n    const { input } = inputs;\n    const imag = backend.data.get(input.dataId).complexTensorInfos.imag;\n    const imagVal = backend.data.get(imag.dataId).values;\n    // When complex tensor is disposed, its underlying parts will be disposed too.\n    // Make new tensor out of the imag value of the complex. This makes sure the\n    // value is still accessible even if complex tensor is disposed.\n    return backend.makeTensorInfo(imag.shape, imag.dtype, imagVal);\n}\nexport const imagConfig = {\n    kernelName: Imag,\n    backendName: 'cpu',\n    kernelFunc: imag\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvSW1hZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFtRCxNQUFNLHVCQUF1QixDQUFDO0FBSTdGLE1BQU0sVUFBVSxJQUFJLENBQUMsSUFBbUQ7SUFFdEUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDO0lBQ3BFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUM7SUFFckQsOEVBQThFO0lBQzlFLDRFQUE0RTtJQUM1RSxnRUFBZ0U7SUFDaEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJbWFnLCBJbWFnSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGltYWcoYXJnczoge2lucHV0czogSW1hZ0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IGltYWcgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkuY29tcGxleFRlbnNvckluZm9zLmltYWc7XG4gIGNvbnN0IGltYWdWYWwgPSBiYWNrZW5kLmRhdGEuZ2V0KGltYWcuZGF0YUlkKS52YWx1ZXM7XG5cbiAgLy8gV2hlbiBjb21wbGV4IHRlbnNvciBpcyBkaXNwb3NlZCwgaXRzIHVuZGVybHlpbmcgcGFydHMgd2lsbCBiZSBkaXNwb3NlZCB0b28uXG4gIC8vIE1ha2UgbmV3IHRlbnNvciBvdXQgb2YgdGhlIGltYWcgdmFsdWUgb2YgdGhlIGNvbXBsZXguIFRoaXMgbWFrZXMgc3VyZSB0aGVcbiAgLy8gdmFsdWUgaXMgc3RpbGwgYWNjZXNzaWJsZSBldmVuIGlmIGNvbXBsZXggdGVuc29yIGlzIGRpc3Bvc2VkLlxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbWFnLnNoYXBlLCBpbWFnLmR0eXBlLCBpbWFnVmFsKTtcbn1cblxuZXhwb3J0IGNvbnN0IGltYWdDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSW1hZyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBpbWFnIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Concat, util } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { concatImpl } from './Concat_impl';\nimport { identity } from './Identity';\nimport { imag } from './Imag';\nimport { real } from './Real';\nimport { reshape } from './Reshape';\nexport function concat(args) {\n    const { inputs, backend, attrs } = args;\n    const { axis } = attrs;\n    const $axis = util.parseAxisParam(axis, inputs[0].shape)[0];\n    const shapes = inputs.map(t => t.shape);\n    backend_util.assertParamsConsistent(shapes, $axis);\n    let outShape = backend_util.computeOutShape(inputs.map(t => t.shape), $axis);\n    if (util.sizeFromShape(outShape) === 0) {\n        return backend.makeTensorInfo(outShape, inputs[0].dtype, []);\n    }\n    // Keep only non-empty tensors (ignore tensors with 0 in their shape).\n    const $inputs = inputs.filter(t => util.sizeFromShape(t.shape) > 0);\n    if ($inputs.length === 1) {\n        return identity({ inputs: { x: $inputs[0] }, backend });\n    }\n    if ($inputs[0].dtype === 'complex64') {\n        const reals = $inputs.map((t) => real({ inputs: { input: t }, backend }));\n        const imags = $inputs.map((t) => imag({ inputs: { input: t }, backend }));\n        const realConcated = concat({ inputs: reals, backend, attrs: { axis: $axis } });\n        const imagConcated = concat({ inputs: imags, backend, attrs: { axis: $axis } });\n        const result = complex({ inputs: { real: realConcated, imag: imagConcated }, backend });\n        reals.forEach(r => backend.disposeIntermediateTensorInfo(r));\n        imags.forEach(i => backend.disposeIntermediateTensorInfo(i));\n        backend.disposeIntermediateTensorInfo(realConcated);\n        backend.disposeIntermediateTensorInfo(imagConcated);\n        return result;\n    }\n    // Any concat of n-dimensional tensors across any axis can be reduced to\n    // a concatenation of two-dimensional tensors across the axis 1 by first\n    // partitioning the axes of the original tensors into those less than the\n    // axis to be concatenated and the rest. Then reshape the tensors\n    // into a two-dimensional tensor by collapsing these two sets of axes and\n    // concatenate the resulting matrices across the axis 1, finally reshaping\n    // the result to have the proper shape.\n    const inputs2D = $inputs.map(t => {\n        const innerSize = util.sizeFromShape(t.shape.slice($axis));\n        const shape = [-1, innerSize];\n        return reshape({ inputs: { x: t }, backend, attrs: { shape } });\n    });\n    const inputsValShapes = inputs2D.map(t => {\n        return { vals: backend.data.get(t.dataId).values, shape: t.shape };\n    });\n    // Concats 2d tensors along axis=1.\n    outShape =\n        backend_util.computeOutShape(inputs2D.map(t => t.shape), 1 /* axis */);\n    const simplyConcat = inputs2D[0].shape[0] === 1;\n    const outVals = concatImpl(inputsValShapes, outShape, inputs[0].dtype, simplyConcat);\n    const finalOutShape = backend_util.computeOutShape($inputs.map(t => t.shape), $axis);\n    const outInfo = backend.makeTensorInfo(finalOutShape, inputs[0].dtype, outVals);\n    inputs2D.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return outInfo;\n}\nexport const concatConfig = {\n    kernelName: Concat,\n    backendName: 'cpu',\n    kernelFunc: concat\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db25jYXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQW1FLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSWxJLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbkQsSUFBSSxRQUFRLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTdFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlEO0lBRUQsc0VBQXNFO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDckQ7SUFFRCxJQUFJLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ3BDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztRQUV0RSxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsRUFBQyxNQUFNLEVB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QUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhFLE9BQU8sT0FBTyxDQUFDO0FBQ2pCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29uY2F0LCBDb25jYXRBdHRycywgQ29uY2F0SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHtjb25jYXRJbXBsfSBmcm9tICcuL0NvbmNhdF9pbXBsJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuaW1wb3J0IHtpbWFnfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHtyZWFsfSBmcm9tICcuL1JlYWwnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29uY2F0KFxuICAgIGFyZ3M6IHtpbnB1dHM6IENvbmNhdElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBDb25jYXRBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgaW5wdXRzWzBdLnNoYXBlKVswXTtcblxuICBjb25zdCBzaGFwZXMgPSBpbnB1dHMubWFwKHQgPT4gdC5zaGFwZSk7XG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRQYXJhbXNDb25zaXN0ZW50KHNoYXBlcywgJGF4aXMpO1xuXG4gIGxldCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCAkYXhpcyk7XG5cbiAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSkgPT09IDApIHtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgaW5wdXRzWzBdLmR0eXBlLCBbXSk7XG4gIH1cblxuICAvLyBLZWVwIG9ubHkgbm9uLWVtcHR5IHRlbnNvcnMgKGlnbm9yZSB0ZW5zb3JzIHdpdGggMCBpbiB0aGVpciBzaGFwZSkuXG4gIGNvbnN0ICRpbnB1dHMgPSBpbnB1dHMuZmlsdGVyKHQgPT4gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUpID4gMCk7XG4gIGlmICgkaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogJGlucHV0c1swXX0sIGJhY2tlbmR9KTtcbiAgfVxuXG4gIGlmICgkaW5wdXRzWzBdLmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxzID0gJGlucHV0cy5tYXAoKHQpID0+IHJlYWwoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcbiAgICBjb25zdCBpbWFncyA9ICRpbnB1dHMubWFwKCh0KSA9PiBpbWFnKHtpbnB1dHM6IHtpbnB1dDogdH0sIGJhY2tlbmR9KSk7XG5cbiAgICBjb25zdCByZWFsQ29uY2F0ZWQgPSBjb25jYXQoe2lucHV0czogcmVhbHMsIGJhY2tlbmQsIGF0dHJzOiB7YXhpczogJGF4aXN9fSk7XG4gICAgY29uc3QgaW1hZ0NvbmNhdGVkID0gY29uY2F0KHtpbnB1dHM6IGltYWdzLCBiYWNrZW5kLCBhdHRyczoge2F4aXM6ICRheGlzfX0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbENvbmNhdGVkLCBpbWFnOiBpbWFnQ29uY2F0ZWR9LCBiYWNrZW5kfSk7XG5cbiAgICByZWFscy5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbENvbmNhdGVkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdDb25jYXRlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQW55IGNvbmNhdCBvZiBuLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIGFueSBheGlzIGNhbiBiZSByZWR1Y2VkIHRvXG4gIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAvLyBwYXJ0aXRpb25pbmcgdGhlIGF4ZXMgb2YgdGhlIG9yaWdpbmFsIHRlbnNvcnMgaW50byB0aG9zZSBsZXNzIHRoYW4gdGhlXG4gIC8vIGF4aXMgdG8gYmUgY29uY2F0ZW5hdGVkIGFuZCB0aGUgcmVzdC4gVGhlbiByZXNoYXBlIHRoZSB0ZW5zb3JzXG4gIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgLy8gY29uY2F0ZW5hdGUgdGhlIHJlc3VsdGluZyBtYXRyaWNlcyBhY3Jvc3MgdGhlIGF4aXMgMSwgZmluYWxseSByZXNoYXBpbmdcbiAgLy8gdGhlIHJlc3VsdCB0byBoYXZlIHRoZSBwcm9wZXIgc2hhcGUuXG4gIGNvbnN0IGlucHV0czJEID0gJGlucHV0cy5tYXAodCA9PiB7XG4gICAgY29uc3QgaW5uZXJTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoJGF4aXMpKTtcbiAgICBjb25zdCBzaGFwZSA9IFstMSwgaW5uZXJTaXplXTtcbiAgICByZXR1cm4gcmVzaGFwZSh7aW5wdXRzOiB7eDogdH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGV9fSk7XG4gIH0pO1xuXG4gIGNvbnN0IGlucHV0c1ZhbFNoYXBlcyA9IGlucHV0czJELm1hcCh0ID0+IHtcbiAgICByZXR1cm4ge3ZhbHM6IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcywgc2hhcGU6IHQuc2hhcGV9O1xuICB9KTtcblxuICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLlxuICBvdXRTaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKGlucHV0czJELm1hcCh0ID0+IHQuc2hhcGUpLCAxIC8qIGF4aXMgKi8pO1xuICBjb25zdCBzaW1wbHlDb25jYXQgPSBpbnB1dHMyRFswXS5zaGFwZVswXSA9PT0gMTtcbiAgY29uc3Qgb3V0VmFscyA9XG4gICAgICBjb25jYXRJbXBsKGlucHV0c1ZhbFNoYXBlcywgb3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgc2ltcGx5Q29uY2F0KTtcblxuICBjb25zdCBmaW5hbE91dFNoYXBlID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoJGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgJGF4aXMpO1xuXG4gIGNvbnN0IG91dEluZm8gPVxuICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhmaW5hbE91dFNoYXBlLCBpbnB1dHNbMF0uZHR5cGUsIG91dFZhbHMpO1xuXG4gIGlucHV0czJELmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICByZXR1cm4gb3V0SW5mbztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbmNhdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb25jYXQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogY29uY2F0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2D, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv2D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter } = inputs;\n    const { strides, pad, dataFormat, dilations, dimRoundingMode } = attrs;\n    assertNotComplex([x, filter], 'conv2d');\n    const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n    const filterHeight = convInfo.filterHeight;\n    const filterWidth = convInfo.filterWidth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const padLeft = convInfo.padInfo.left;\n    const padTop = convInfo.padInfo.top;\n    const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n    const y = new TensorBuffer(convInfo.outShape, x.dtype);\n    const xStrides = util.computeStrides(x.shape);\n    const filterStrides = util.computeStrides(filter.shape);\n    const xBatchStride = xStrides[0];\n    const xRowStride = isChannelsLast ? xStrides[1] : xStrides[2];\n    const xColStride = isChannelsLast ? xStrides[2] : 1;\n    const xChannelStride = isChannelsLast ? 1 : xStrides[1];\n    const yBatchStride = y.strides[0];\n    const yRowStride = isChannelsLast ? y.strides[1] : y.strides[2];\n    const yColStride = isChannelsLast ? y.strides[2] : 1;\n    const yChannelStride = isChannelsLast ? 1 : y.strides[1];\n    const xVals = backend.data.get(x.dataId).values;\n    const wVals = backend.data.get(filter.dataId).values;\n    const yVals = y.values;\n    for (let b = 0; b < convInfo.batchSize; ++b) {\n        const xOffset1 = b * xBatchStride;\n        const yOffset1 = b * yBatchStride;\n        for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n            const yOffset2 = yOffset1 + yR * yRowStride;\n            const xRCorner = yR * convInfo.strideHeight - padTop;\n            for (let wR = 0; wR < filterHeight; ++wR) {\n                const xR = xRCorner + wR * dilationHeight;\n                if (xR < 0 || xR >= convInfo.inHeight) {\n                    continue;\n                }\n                const wOffset1 = wR * filterStrides[0];\n                const xOffset2 = xOffset1 + xR * xRowStride;\n                for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n                    const yOffset3 = yOffset2 + yC * yColStride;\n                    const xCCorner = yC * convInfo.strideWidth - padLeft;\n                    for (let wC = 0; wC < filterWidth; ++wC) {\n                        const xC = xCCorner + wC * dilationWidth;\n                        if (xC < 0 || xC >= convInfo.inWidth) {\n                            continue;\n                        }\n                        const wOffset2 = wOffset1 + wC * filterStrides[1];\n                        const xOffset3 = xOffset2 + xC * xColStride;\n                        let wOffset3 = wOffset2;\n                        for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n                            const xVal = xVals[xOffset3 + d1 * xChannelStride];\n                            for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n                                yVals[yOffset3 + d2 * yChannelStride] +=\n                                    xVal * wVals[wOffset3 + d2];\n                            }\n                            wOffset3 += convInfo.outChannels;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(y.shape, y.dtype, yVals);\n}\nexport const conv2DConfig = {\n    kernelName: Conv2D,\n    backendName: 'cpu',\n    kernelFunc: conv2D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db252MkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQXVELFlBQVksRUFBMEIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHNUosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUV4QyxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFDM0MsTUFBTSxDQUFDLEtBQXlDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQ3pFLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRXpELE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7SUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztJQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFR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S0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0NBQ2hELEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxHQUFHLGNBQWMsQ0FBQztvQ0FDakMsSUFBSSxHQUFHLEtBQUssQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLENBQUM7NkJBQ2pDOzRCQUNELFFBQVEsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDO3lCQUNsQztxQkFDRjtpQkFDRjthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDekQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252MkQsIENvbnYyREF0dHJzLCBDb252MkRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29yQnVmZmVyLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyRChcbiAgICBhcmdzOiB7aW5wdXRzOiBDb252MkRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogQ29udjJEQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW3gsIGZpbHRlcl0sICdjb252MmQnKTtcblxuICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLCBkaWxhdGlvbnMsIHBhZCxcbiAgICAgIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLCAkZGF0YUZvcm1hdCk7XG5cbiAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgY29uc3QgeSA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUgYXMgJ2Zsb2F0MzInKTtcblxuICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG5cbiAgY29uc3QgeEJhdGNoU3RyaWRlID0geFN0cmlkZXNbMF07XG4gIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHhTdHJpZGVzWzFdIDogeFN0cmlkZXNbMl07XG4gIGNvbnN0IHhDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHhTdHJpZGVzWzJdIDogMTtcbiAgY29uc3QgeENoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiB4U3RyaWRlc1sxXTtcbiAgY29uc3QgeUJhdGNoU3RyaWRlID0geS5zdHJpZGVzWzBdO1xuICBjb25zdCB5Um93U3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyB5LnN0cmlkZXNbMV0gOiB5LnN0cmlkZXNbMl07XG4gIGNvbnN0IHlDb2xTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IHkuc3RyaWRlc1syXSA6IDE7XG4gIGNvbnN0IHlDaGFubmVsU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyAxIDogeS5zdHJpZGVzWzFdO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHdWYWxzID0gYmFja2VuZC5kYXRhLmdldChmaWx0ZXIuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgeVZhbHMgPSB5LnZhbHVlcztcblxuICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgY29uc3QgeE9mZnNldDEgPSBiICogeEJhdGNoU3RyaWRlO1xuICAgIGNvbnN0IHlPZmZzZXQxID0gYiAqIHlCYXRjaFN0cmlkZTtcbiAgICBmb3IgKGxldCB5UiA9IDA7IHlSIDwgY29udkluZm8ub3V0SGVpZ2h0OyArK3lSKSB7XG4gICAgICBjb25zdCB5T2Zmc2V0MiA9IHlPZmZzZXQxICsgeVIgKiB5Um93U3RyaWRlO1xuICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgY29uc3QgeFIgPSB4UkNvcm5lciArIHdSICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdSICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgY29uc3QgeE9mZnNldDIgPSB4T2Zmc2V0MSArIHhSICogeFJvd1N0cmlkZTtcbiAgICAgICAgZm9yIChsZXQgeUMgPSAwOyB5QyA8IGNvbnZJbmZvLm91dFdpZHRoOyArK3lDKSB7XG4gICAgICAgICAgY29uc3QgeU9mZnNldDMgPSB5T2Zmc2V0MiArIHlDICogeUNvbFN0cmlkZTtcbiAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgY29uc3QgeEMgPSB4Q0Nvcm5lciArIHdDICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3QyAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeEMgKiB4Q29sU3RyaWRlO1xuICAgICAgICAgICAgbGV0IHdPZmZzZXQzID0gd09mZnNldDI7XG4gICAgICAgICAgICBmb3IgKGxldCBkMSA9IDA7IGQxIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkMSkge1xuICAgICAgICAgICAgICBjb25zdCB4VmFsID0geFZhbHNbeE9mZnNldDMgKyBkMSAqIHhDaGFubmVsU3RyaWRlXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgeVZhbHNbeU9mZnNldDMgKyBkMiAqIHlDaGFubmVsU3RyaWRlXSArPVxuICAgICAgICAgICAgICAgICAgICB4VmFsICogd1ZhbHNbd09mZnNldDMgKyBkMl07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgd09mZnNldDMgKz0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeVZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyRCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb252MkQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2DBackpropFilter, TensorBuffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv2DBackpropFilter(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, dy } = inputs;\n    const { strides, pad, dataFormat, dimRoundingMode, filterShape } = attrs;\n    assertNotComplex([x, dy], 'conv2dBackpropFilter');\n    const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n    const { strideHeight, strideWidth, filterHeight, filterWidth } = convInfo;\n    const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n    const dW = new TensorBuffer(convInfo.filterShape, 'float32');\n    const leftPad = convInfo.padInfo.left;\n    const topPad = convInfo.padInfo.top;\n    const xVals = backend.data.get(x.dataId).values;\n    const dyVals = backend.data.get(dy.dataId).values;\n    const xBuf = new TensorBuffer(x.shape, x.dtype, xVals);\n    const dyBuf = new TensorBuffer(dy.shape, dy.dtype, dyVals);\n    for (let wR = 0; wR < filterHeight; ++wR) {\n        const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n        const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n        for (let wC = 0; wC < filterWidth; ++wC) {\n            const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n            const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n            for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n                for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n                    let dotProd = 0;\n                    for (let b = 0; b < convInfo.batchSize; ++b) {\n                        for (let yR = yRMin; yR < yRMax; ++yR) {\n                            const xR = wR + yR * strideHeight - topPad;\n                            for (let yC = yCMin; yC < yCMax; ++yC) {\n                                const xC = wC + yC * strideWidth - leftPad;\n                                if (isChannelsLast) {\n                                    dotProd += xBuf.get(b, xR, xC, d1) *\n                                        dyBuf.get(b, yR, yC, d2);\n                                }\n                                else {\n                                    dotProd += xBuf.get(b, d1, xR, xC) *\n                                        dyBuf.get(b, d2, yR, yC);\n                                }\n                            }\n                        }\n                    }\n                    dW.set(dotProd, wR, wC, d1, d2);\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dW.shape, dW.dtype, dW.values);\n}\nexport const conv2DBackpropFilterConfig = {\n    kernelName: Conv2DBackpropFilter,\n    backendName: 'cpu',\n    kernelFunc: conv2DBackpropFilter\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BGaWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQW1GLFlBQVksRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUdoTSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG9CQUFvQixDQUFDLElBSXBDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXZFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFFbEQsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFDakUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQzlELFdBQVcsQ0FBQyxDQUFDO0lBRWpCLE1BQU0sRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLEVBQUMsR0FBRyxRQUFRLENBQUM7SUFDeEUsTUFBTSxjQUFj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RyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBWTt3Q0FDekMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQVksQ0FBQztpQ0FDMUM7cUNBQU07b0NBQ0wsT0FBTyxJQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFZO3dDQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBWSxDQUFDO2lDQUMxQzs2QkFDRjt5QkFDRjtxQkFDRjtvQkFDRCxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztpQkFDakM7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlCO0lBQ3RELFVBQVUsRUFBRSxvQkFBb0I7SUFDaEMsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLG9CQUF3QztDQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BGaWx0ZXIsIENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsIENvbnYyREJhY2twcm9wRmlsdGVySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcEZpbHRlcihhcmdzOiB7XG4gIGlucHV0czogQ29udjJEQmFja3Byb3BGaWx0ZXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogQ29udjJEQmFja3Byb3BGaWx0ZXJBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBkYXRhRm9ybWF0LCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW3gsIGR5XSwgJ2NvbnYyZEJhY2twcm9wRmlsdGVyJyk7XG5cbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLyxcbiAgICAgICRkYXRhRm9ybWF0KTtcblxuICBjb25zdCB7c3RyaWRlSGVpZ2h0LCBzdHJpZGVXaWR0aCwgZmlsdGVySGVpZ2h0LCBmaWx0ZXJXaWR0aH0gPSBjb252SW5mbztcbiAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBjb252SW5mby5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcbiAgY29uc3QgZFcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGxlZnRQYWQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gIGNvbnN0IHRvcFBhZCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCB4VmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBkeVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgeEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgeFZhbHMpO1xuICBjb25zdCBkeUJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoZHkuc2hhcGUsIGR5LmR0eXBlLCBkeVZhbHMpO1xuXG4gIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihcbiAgICAgICAgY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuXG4gICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGZpbHRlcldpZHRoOyArK3dDKSB7XG4gICAgICBjb25zdCB5Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKFxuICAgICAgICAgIGNvbnZJbmZvLm91dFdpZHRoLCAoY29udkluZm8uaW5XaWR0aCArIGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCk7XG5cbiAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBjb252SW5mby5vdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5UiA9IHlSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhSID0gd1IgKyB5UiAqIHN0cmlkZUhlaWdodCAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgZm9yIChsZXQgeUMgPSB5Q01pbjsgeUMgPCB5Q01heDsgKyt5Qykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhDID0gd0MgKyB5QyAqIHN0cmlkZVdpZHRoIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgICBpZiAoaXNDaGFubmVsc0xhc3QpIHtcbiAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gKHhCdWYuZ2V0KGIsIHhSLCB4QywgZDEpIGFzIG51bWJlcikgKlxuICAgICAgICAgICAgICAgICAgICAgIChkeUJ1Zi5nZXQoYiwgeVIsIHlDLCBkMikgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSAoeEJ1Zi5nZXQoYiwgZDEsIHhSLCB4QykgYXMgbnVtYmVyKSAqXG4gICAgICAgICAgICAgICAgICAgICAgKGR5QnVmLmdldChiLCBkMiwgeVIsIHlDKSBhcyBudW1iZXIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBkVy5zZXQoZG90UHJvZCwgd1IsIHdDLCBkMSwgZDIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZFcuc2hhcGUsIGRXLmR0eXBlLCBkVy52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BGaWx0ZXIsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogY29udjJEQmFja3Byb3BGaWx0ZXIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2DBackpropInput, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv2DBackpropInput(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, filter } = inputs;\n    const { inputShape, strides, pad, dataFormat, dimRoundingMode } = attrs;\n    assertNotComplex([dy, filter], 'conv2dBackpropInput');\n    const filterStrides = util.computeStrides(filter.shape);\n    const dyStrides = util.computeStrides(dy.shape);\n    let $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n    const convInfo = backend_util.computeConv2DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad, dimRoundingMode, false, $dataFormat);\n    const dx = new TensorBuffer(convInfo.inShape, 'float32');\n    const dxValues = dx.values;\n    const dyValues = backend.data.get(dy.dataId).values;\n    const fltValues = backend.data.get(filter.dataId).values;\n    const [fltS0, fltS1, fltS2] = filterStrides;\n    const { batchSize, filterHeight, filterWidth, inChannels, inHeight, inWidth, outChannels, outHeight, outWidth, strideHeight, strideWidth } = convInfo;\n    $dataFormat = convInfo.dataFormat;\n    const topPad = filterHeight - 1 - convInfo.padInfo.top;\n    const leftPad = filterWidth - 1 - convInfo.padInfo.left;\n    const isChannelsLast = $dataFormat === 'channelsLast';\n    const xBatchStride = dx.strides[0];\n    const xRowStride = isChannelsLast ? dx.strides[1] : dx.strides[2];\n    const xColStride = isChannelsLast ? dx.strides[2] : 1;\n    const xChannelStride = isChannelsLast ? 1 : dx.strides[1];\n    const yBatchStride = dyStrides[0];\n    const yRowStride = isChannelsLast ? dyStrides[1] : dyStrides[2];\n    const yColStride = isChannelsLast ? dyStrides[2] : 1;\n    const yChannelStride = isChannelsLast ? 1 : dyStrides[1];\n    for (let b = 0; b < batchSize; ++b) {\n        for (let d1 = 0; d1 < inChannels; ++d1) {\n            for (let xR = 0; xR < inHeight; ++xR) {\n                const xRCorner = xR - topPad;\n                const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n                const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight);\n                for (let xC = 0; xC < inWidth; ++xC) {\n                    const xCCorner = xC - leftPad;\n                    const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n                    const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n                    let dotProd = 0;\n                    for (let yR = xRMin; yR < yRMax; ++yR) {\n                        const wR = yR * strideHeight - xRCorner;\n                        for (let yC = xCMin; yC < yCMax; ++yC) {\n                            const wC = yC * strideWidth - xCCorner;\n                            const dyOffset = yBatchStride * b + yRowStride * yR + yColStride * yC;\n                            const fltOffset = fltS0 * (filterHeight - 1 - wR) +\n                                fltS1 * (filterWidth - 1 - wC) + fltS2 * d1;\n                            for (let d2 = 0; d2 < outChannels; ++d2) {\n                                const pixel = dyValues[dyOffset + yChannelStride * d2];\n                                const weight = fltValues[fltOffset + d2];\n                                dotProd += pixel * weight;\n                            }\n                        }\n                    }\n                    const dxOffset = xBatchStride * b + xRowStride * xR +\n                        xColStride * xC + xChannelStride * d1;\n                    dxValues[dxOffset] = dotProd;\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const conv2DBackpropInputConfig = {\n    kernelName: Conv2DBackpropInput,\n    backendName: 'cpu',\n    kernelFunc: conv2DBackpropInput\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29udjJEQmFja3Byb3BJbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLG1CQUFtQixFQUFpRixZQUFZLEVBQTBCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR25NLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFJbkM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUscUJBQXFCLENBQUMsQ0FBQztJQUV0RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVoRCxJQUFJLFdBQVcsR0FBRyxZQUFZLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQXlDLEVBQUUsT0FBTyxFQUNyRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdB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RUFBRSxDQUFDOzRCQUVoRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsV0FBVyxFQUFFLEVBQUUsRUFBRSxFQUFFO2dDQUN2QyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsUUFBUSxHQUFHLGNBQWMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQ0FDdkQsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQ0FDekMsT0FBTyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUM7NkJBQzNCO3lCQUNGO3FCQUNGO29CQUNELE1BQU0sUUFBUSxHQUFHLFlBQVksR0FBRyxDQUFDLEdBQUcsVUFBVSxHQUFHLEVBQUU7d0JBQy9DLFVBQVUsR0FBRyxFQUFFLEdBQUcsY0FBYyxHQUFHLEVBQUUsQ0FBQztvQkFDMUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sQ0FBQztpQkFDOUI7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCO0lBQ3JELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLG1CQUF1QztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BJbnB1dCwgQ29udjJEQmFja3Byb3BJbnB1dEF0dHJzLCBDb252MkRCYWNrcHJvcElucHV0SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0KGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252MkRCYWNrcHJvcElucHV0SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IENvbnYyREJhY2twcm9wSW5wdXRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtpbnB1dFNoYXBlLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFtkeSwgZmlsdGVyXSwgJ2NvbnYyZEJhY2twcm9wSW5wdXQnKTtcblxuICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcblxuICBsZXQgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlLCBmYWxzZSwgJGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IGR4ID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5pblNoYXBlLCAnZmxvYXQzMicpO1xuICBjb25zdCBkeFZhbHVlcyA9IGR4LnZhbHVlcztcbiAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyXSA9IGZpbHRlclN0cmlkZXM7XG4gIGNvbnN0IHtcbiAgICBiYXRjaFNpemUsXG4gICAgZmlsdGVySGVpZ2h0LFxuICAgIGZpbHRlcldpZHRoLFxuICAgIGluQ2hhbm5lbHMsXG4gICAgaW5IZWlnaHQsXG4gICAgaW5XaWR0aCxcbiAgICBvdXRDaGFubmVscyxcbiAgICBvdXRIZWlnaHQsXG4gICAgb3V0V2lkdGgsXG4gICAgc3RyaWRlSGVpZ2h0LFxuICAgIHN0cmlkZVdpZHRoXG4gIH0gPSBjb252SW5mbztcbiAgJGRhdGFGb3JtYXQgPSBjb252SW5mby5kYXRhRm9ybWF0O1xuICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGxlZnRQYWQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSAkZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG4gIGNvbnN0IHhCYXRjaFN0cmlkZSA9IGR4LnN0cmlkZXNbMF07XG4gIGNvbnN0IHhSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR4LnN0cmlkZXNbMV0gOiBkeC5zdHJpZGVzWzJdO1xuICBjb25zdCB4Q29sU3RyaWRlID0gaXNDaGFubmVsc0xhc3QgPyBkeC5zdHJpZGVzWzJdIDogMTtcbiAgY29uc3QgeENoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeC5zdHJpZGVzWzFdO1xuICBjb25zdCB5QmF0Y2hTdHJpZGUgPSBkeVN0cmlkZXNbMF07XG4gIGNvbnN0IHlSb3dTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IGR5U3RyaWRlc1sxXSA6IGR5U3RyaWRlc1syXTtcbiAgY29uc3QgeUNvbFN0cmlkZSA9IGlzQ2hhbm5lbHNMYXN0ID8gZHlTdHJpZGVzWzJdIDogMTtcbiAgY29uc3QgeUNoYW5uZWxTdHJpZGUgPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiBkeVN0cmlkZXNbMV07XG5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICBmb3IgKGxldCB4UiA9IDA7IHhSIDwgaW5IZWlnaHQ7ICsreFIpIHtcbiAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB4UiAtIHRvcFBhZDtcbiAgICAgICAgY29uc3QgeFJNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeFJDb3JuZXIgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgICAgY29uc3QgeVJNYXggPVxuICAgICAgICAgICAgTWF0aC5taW4ob3V0SGVpZ2h0LCAoZmlsdGVySGVpZ2h0ICsgeFJDb3JuZXIpIC8gc3RyaWRlSGVpZ2h0KTtcblxuICAgICAgICBmb3IgKGxldCB4QyA9IDA7IHhDIDwgaW5XaWR0aDsgKyt4Qykge1xuICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geEMgLSBsZWZ0UGFkO1xuICAgICAgICAgIGNvbnN0IHhDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhDQ29ybmVyIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICBjb25zdCB5Q01heCA9XG4gICAgICAgICAgICAgIE1hdGgubWluKG91dFdpZHRoLCAoZmlsdGVyV2lkdGggKyB4Q0Nvcm5lcikgLyBzdHJpZGVXaWR0aCk7XG5cbiAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgZm9yIChsZXQgeVIgPSB4Uk1pbjsgeVIgPCB5Uk1heDsgKyt5Uikge1xuICAgICAgICAgICAgY29uc3Qgd1IgPSB5UiAqIHN0cmlkZUhlaWdodCAtIHhSQ29ybmVyO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB5QyA9IHhDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdDID0geUMgKiBzdHJpZGVXaWR0aCAtIHhDQ29ybmVyO1xuICAgICAgICAgICAgICBjb25zdCBkeU9mZnNldCA9XG4gICAgICAgICAgICAgICAgICB5QmF0Y2hTdHJpZGUgKiBiICsgeVJvd1N0cmlkZSAqIHlSICsgeUNvbFN0cmlkZSAqIHlDO1xuICAgICAgICAgICAgICBjb25zdCBmbHRPZmZzZXQgPSBmbHRTMCAqIChmaWx0ZXJIZWlnaHQgLSAxIC0gd1IpICtcbiAgICAgICAgICAgICAgICAgIGZsdFMxICogKGZpbHRlcldpZHRoIC0gMSAtIHdDKSArIGZsdFMyICogZDE7XG5cbiAgICAgICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IG91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeVZhbHVlc1tkeU9mZnNldCArIHlDaGFubmVsU3RyaWRlICogZDJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IGZsdFZhbHVlc1tmbHRPZmZzZXQgKyBkMl07XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbCAqIHdlaWdodDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBkeE9mZnNldCA9IHhCYXRjaFN0cmlkZSAqIGIgKyB4Um93U3RyaWRlICogeFIgK1xuICAgICAgICAgICAgICB4Q29sU3RyaWRlICogeEMgKyB4Q2hhbm5lbFN0cmlkZSAqIGQxO1xuICAgICAgICAgIGR4VmFsdWVzW2R4T2Zmc2V0XSA9IGRvdFByb2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogY29udjJEQmFja3Byb3BJbnB1dCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3D, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv3D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter } = inputs;\n    const { strides, pad, dilations } = attrs;\n    assertNotComplex([x, filter], 'conv3d');\n    const convInfo = backend_util.computeConv3DInfo(x.shape, filter.shape, strides, dilations, pad);\n    const { filterDepth, filterHeight, filterWidth, dilationDepth, dilationHeight, dilationWidth, padInfo } = convInfo;\n    const padFront = padInfo.front;\n    const padLeft = padInfo.left;\n    const padTop = padInfo.top;\n    const y = new TensorBuffer(convInfo.outShape, x.dtype);\n    const xVals = backend.data.get(x.dataId).values;\n    const wVals = backend.data.get(filter.dataId).values;\n    const yVals = y.values;\n    const xStrides = util.computeStrides(x.shape);\n    const filterStrides = util.computeStrides(filter.shape);\n    for (let b = 0; b < convInfo.batchSize; ++b) {\n        const xOffset1 = b * xStrides[0];\n        const yOffset1 = b * y.strides[0];\n        for (let yF = 0; yF < convInfo.outDepth; ++yF) {\n            const yOffset2 = yOffset1 + yF * y.strides[1];\n            const xFCorner = yF * convInfo.strideDepth - padFront;\n            for (let wF = 0; wF < filterDepth; ++wF) {\n                const xF = xFCorner + wF * dilationDepth;\n                if (xF < 0 || xF >= convInfo.inDepth) {\n                    continue;\n                }\n                const wOffset1 = wF * filterStrides[0];\n                const xOffset2 = xOffset1 + xF * xStrides[1];\n                for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n                    const yOffset3 = yOffset2 + yR * y.strides[2];\n                    const xRCorner = yR * convInfo.strideHeight - padTop;\n                    for (let wR = 0; wR < filterHeight; ++wR) {\n                        const xR = xRCorner + wR * dilationHeight;\n                        if (xR < 0 || xR >= convInfo.inHeight) {\n                            continue;\n                        }\n                        const wOffset2 = wOffset1 + wR * filterStrides[1];\n                        const xOffset3 = xOffset2 + xR * xStrides[2];\n                        for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n                            const yOffset4 = yOffset3 + yC * convInfo.outChannels;\n                            const xCCorner = yC * convInfo.strideWidth - padLeft;\n                            for (let wC = 0; wC < filterWidth; ++wC) {\n                                const xC = xCCorner + wC * dilationWidth;\n                                if (xC < 0 || xC >= convInfo.inWidth) {\n                                    continue;\n                                }\n                                const wOffset3 = wOffset2 + wC * filterStrides[2];\n                                const xOffset4 = xOffset3 + xC * convInfo.inChannels;\n                                let wOffset4 = wOffset3;\n                                for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n                                    const xVal = xVals[xOffset4 + d1];\n                                    for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n                                        yVals[yOffset4 + d2] += xVal * wVals[wOffset4 + d2];\n                                    }\n                                    wOffset4 += convInfo.outChannels;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(y.shape, y.dtype, y.values);\n}\nexport const conv3DConfig = {\n    kernelName: Conv3D,\n    backendName: 'cpu',\n    kernelFunc: conv3D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db252M0QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQXVELFlBQVksRUFBMEIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHNUosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFeEMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFeEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFDbkQsTUFBTSxDQUFDLEtBQWlELEVBQUUsT0FBTyxFQUNqRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFcEIsTUFBTSxFQUNKLFdBQVcsRUFDWCxZQUFZLEVBQ1osV0FBVyxFQUNYLGFBQWEsRUFDYixjQUFjLEVBQ2QsYUFBYSxFQUNiLE9BQU8sRUFDUixHQUFHLFFBQVEsQ0FBQztJQUNiLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDL0IsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQztJQUM3QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDO0lB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QUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjNELCBDb252M0RBdHRycywgQ29udjNESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252M0QoXG4gICAgYXJnczoge2lucHV0czogQ29udjNESW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IENvbnYzREF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBkaWxhdGlvbnN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZmlsdGVyXSwgJ2NvbnYzZCcpO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCk7XG5cbiAgY29uc3Qge1xuICAgIGZpbHRlckRlcHRoLFxuICAgIGZpbHRlckhlaWdodCxcbiAgICBmaWx0ZXJXaWR0aCxcbiAgICBkaWxhdGlvbkRlcHRoLFxuICAgIGRpbGF0aW9uSGVpZ2h0LFxuICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgcGFkSW5mb1xuICB9ID0gY29udkluZm87XG4gIGNvbnN0IHBhZEZyb250ID0gcGFkSW5mby5mcm9udDtcbiAgY29uc3QgcGFkTGVmdCA9IHBhZEluZm8ubGVmdDtcbiAgY29uc3QgcGFkVG9wID0gcGFkSW5mby50b3A7XG4gIGNvbnN0IHkgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlIGFzICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuXG4gIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcblxuICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgY29uc3QgeE9mZnNldDEgPSBiICogeFN0cmlkZXNbMF07XG4gICAgY29uc3QgeU9mZnNldDEgPSBiICogeS5zdHJpZGVzWzBdO1xuICAgIGZvciAobGV0IHlGID0gMDsgeUYgPCBjb252SW5mby5vdXREZXB0aDsgKyt5Rikge1xuICAgICAgY29uc3QgeU9mZnNldDIgPSB5T2Zmc2V0MSArIHlGICogeS5zdHJpZGVzWzFdO1xuICAgICAgY29uc3QgeEZDb3JuZXIgPSB5RiAqIGNvbnZJbmZvLnN0cmlkZURlcHRoIC0gcGFkRnJvbnQ7XG4gICAgICBmb3IgKGxldCB3RiA9IDA7IHdGIDwgZmlsdGVyRGVwdGg7ICsrd0YpIHtcbiAgICAgICAgY29uc3QgeEYgPSB4RkNvcm5lciArIHdGICogZGlsYXRpb25EZXB0aDtcbiAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSBjb252SW5mby5pbkRlcHRoKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgd09mZnNldDEgPSB3RiAqIGZpbHRlclN0cmlkZXNbMF07XG4gICAgICAgIGNvbnN0IHhPZmZzZXQyID0geE9mZnNldDEgKyB4RiAqIHhTdHJpZGVzWzFdO1xuXG4gICAgICAgIGZvciAobGV0IHlSID0gMDsgeVIgPCBjb252SW5mby5vdXRIZWlnaHQ7ICsreVIpIHtcbiAgICAgICAgICBjb25zdCB5T2Zmc2V0MyA9IHlPZmZzZXQyICsgeVIgKiB5LnN0cmlkZXNbMl07XG4gICAgICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgICAgICBmb3IgKGxldCB3UiA9IDA7IHdSIDwgZmlsdGVySGVpZ2h0OyArK3dSKSB7XG4gICAgICAgICAgICBjb25zdCB4UiA9IHhSQ29ybmVyICsgd1IgKiBkaWxhdGlvbkhlaWdodDtcbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB3T2Zmc2V0MiA9IHdPZmZzZXQxICsgd1IgKiBmaWx0ZXJTdHJpZGVzWzFdO1xuICAgICAgICAgICAgY29uc3QgeE9mZnNldDMgPSB4T2Zmc2V0MiArIHhSICogeFN0cmlkZXNbMl07XG4gICAgICAgICAgICBmb3IgKGxldCB5QyA9IDA7IHlDIDwgY29udkluZm8ub3V0V2lkdGg7ICsreUMpIHtcbiAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDQgPSB5T2Zmc2V0MyArIHlDICogY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICAgIGNvbnN0IHhDQ29ybmVyID0geUMgKiBjb252SW5mby5zdHJpZGVXaWR0aCAtIHBhZExlZnQ7XG4gICAgICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uV2lkdGg7XG4gICAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSBjb252SW5mby5pbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3Qgd09mZnNldDMgPSB3T2Zmc2V0MiArIHdDICogZmlsdGVyU3RyaWRlc1syXTtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0NCA9IHhPZmZzZXQzICsgeEMgKiBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICAgICAgICAgIGxldCB3T2Zmc2V0NCA9IHdPZmZzZXQzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB4VmFsID0geFZhbHNbeE9mZnNldDQgKyBkMV07XG4gICAgICAgICAgICAgICAgICBmb3IgKGxldCBkMiA9IDA7IGQyIDwgY29udkluZm8ub3V0Q2hhbm5lbHM7ICsrZDIpIHtcbiAgICAgICAgICAgICAgICAgICAgeVZhbHNbeU9mZnNldDQgKyBkMl0gKz0geFZhbCAqIHdWYWxzW3dPZmZzZXQ0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgd09mZnNldDQgKz0gY29udkluZm8ub3V0Q2hhbm5lbHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeS52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYzRCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb252M0QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3DBackpropFilterV2, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv3DBackpropFilterV2(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, dy } = inputs;\n    const { strides, pad, filterShape } = attrs;\n    assertNotComplex([x, dy], 'conv3dBackpropFilterV2');\n    const xStrides = util.computeStrides(x.shape);\n    const dyStrides = util.computeStrides(dy.shape);\n    const convInfo = backend_util.computeConv3DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad);\n    const strideDepth = convInfo.strideDepth;\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const filterDepth = convInfo.filterDepth;\n    const filterHeight = convInfo.filterHeight;\n    const filterWidth = convInfo.filterWidth;\n    const dw = new TensorBuffer(convInfo.filterShape, 'float32');\n    const dwValues = dw.values;\n    const [dwS0, dwS1, dwS2, dwS3] = dw.strides;\n    const dyValues = backend.data.get(dy.dataId).values;\n    const [dyS0, dyS1, dyS2, dyS3] = dyStrides;\n    const xValues = backend.data.get(x.dataId).values;\n    const [xS0, xS1, xS2, xS3] = xStrides;\n    const frontPad = convInfo.padInfo.front;\n    const leftPad = convInfo.padInfo.left;\n    const topPad = convInfo.padInfo.top;\n    for (let wF = 0; wF < filterDepth; ++wF) {\n        const yFMin = Math.max(0, Math.ceil((frontPad - wF) / strideDepth));\n        const yFMax = Math.min(convInfo.outDepth, (convInfo.inDepth + frontPad - wF) / strideDepth);\n        const wOffset1 = wF * dwS0;\n        for (let wR = 0; wR < filterHeight; ++wR) {\n            const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n            const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n            const wOffset2 = wR * dwS1 + wOffset1;\n            for (let wC = 0; wC < filterWidth; ++wC) {\n                const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n                const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n                const wOffset3 = wC * dwS2 + wOffset2;\n                for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n                    const wOffset4 = d1 * dwS3 + wOffset3;\n                    for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n                        let dotProd = 0;\n                        for (let b = 0; b < convInfo.batchSize; ++b) {\n                            const xOffset1 = b * xS0;\n                            const yOffset1 = b * dyS0;\n                            for (let yF = yFMin; yF < yFMax; ++yF) {\n                                const xF = wF + yF * strideDepth - frontPad;\n                                const xOffset2 = xF * xS1 + xOffset1;\n                                const yOffset2 = yF * dyS1 + yOffset1;\n                                for (let yR = yRMin; yR < yRMax; ++yR) {\n                                    const xR = wR + yR * strideHeight - topPad;\n                                    const xOffset3 = xR * xS2 + xOffset2;\n                                    const yOffset3 = yR * dyS2 + yOffset2;\n                                    for (let yC = yCMin; yC < yCMax; ++yC) {\n                                        const xC = wC + yC * strideWidth - leftPad;\n                                        const xOffset4 = xC * xS3 + xOffset3;\n                                        const yOffset4 = yC * dyS3 + yOffset3;\n                                        dotProd += xValues[xOffset4 + d1] * dyValues[yOffset4 + d2];\n                                    }\n                                }\n                            }\n                        }\n                        dwValues[wOffset4 + d2] = dotProd;\n                    }\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dw.shape, dw.dtype, dw.values);\n}\nexport const conv3DBackpropFilterV2Config = {\n    kernelName: Conv3DBackpropFilterV2,\n    backendName: 'cpu',\n    kernelFunc: conv3DBackpropFilterV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEQmFja3Byb3BGaWx0ZXJWMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29udjNEQmFja3Byb3BGaWx0ZXJWMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLHNCQUFzQixFQUF1RixZQUFZLEVBQTBCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzVNLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsc0JBQXNCLENBQUMsSUFJdEM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsTUFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLHdCQUF3QixDQUFDLENBQUM7SUFFcEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDOUMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFaEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUN6RSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRTVCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7SUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBRXpDLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDN0QsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQztJQUMzQixNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUM1QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNsRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsU0FBUyxDQUFDO0lBQzNDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2hFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUM7SUFFdEMsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7SUFDeEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7SUFDdEMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7SUFFcEMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsUUFBUSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQ3pFLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7UUFFM0IsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksRUFBRSxFQUFFLEVBQUUsRUFBRTtZQUN4QyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7WUFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsUUFBUSxDQUFDLFNBQVMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEdBQUcsTUFBTSxHQUFHLEVBQUUsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO1lBQzFFLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDO1lBRXRDLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxXQUFXLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQ3ZDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxPQUFPLEdBQUcsRUFBRSxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQztnQkFDbkUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDbEIsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEdBQUcsT0FBTyxHQUFHLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDO2dCQUN4RSxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQztnQkFFdEMsS0FBSyxJQUFJLEVBQUUsR0FBRyxDQUFDLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0JBQy9DLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDO29CQUV0QyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsUUFBUSxDQUFDLFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRTt3QkFDaEQsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO3dCQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTs0QkFDM0MsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQzs0QkFDekIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQzs0QkFFMUIsS0FBSyxJQUFJLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTtnQ0FDckMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxXQUFXLEdBQUcsUUFBUSxDQUFDO2dDQUM1QyxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQztnQ0FDckMsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUM7Z0NBRXRDLEtBQUssSUFBSSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxFQUFFLEVBQUU7b0NBQ3JDLE1BQU0sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsWUFBWSxHQUFHLE1BQU0sQ0FBQztvQ0FDM0MsTUFBTSxRQUFRLEdBQUcsRUFBRSxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUM7b0NBQ3JDLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDO29DQUV0QyxLQUFLLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO3dDQUNyQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLFdBQVcsR0FBRyxPQUFPLENBQUM7d0NBQzNDLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDO3dDQUNyQyxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQzt3Q0FFdEMsT0FBTyxJQUFJLE9BQU8sQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQztxQ0FDN0Q7aUNBQ0Y7NkJBQ0Y7eUJBQ0Y7d0JBQ0QsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUM7cUJBQ25DO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDRCQUE0QixHQUFpQjtJQUN4RCxVQUFVLEVBQUUsc0JBQXNCO0lBQ2xDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxzQkFBMEM7Q0FDdkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wRmlsdGVyVjIsIENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycywgQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzOiB7XG4gIGlucHV0czogQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBDb252M0RCYWNrcHJvcEZpbHRlclYyQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZmlsdGVyU2hhcGV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZHldLCAnY29udjNkQmFja3Byb3BGaWx0ZXJWMicpO1xuXG4gIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgY29uc3QgZHlTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhkeS5zaGFwZSk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNoYXBlLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG5cbiAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICBjb25zdCBmaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmZpbHRlckRlcHRoO1xuICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG5cbiAgY29uc3QgZHcgPSBuZXcgVGVuc29yQnVmZmVyKGNvbnZJbmZvLmZpbHRlclNoYXBlLCAnZmxvYXQzMicpO1xuICBjb25zdCBkd1ZhbHVlcyA9IGR3LnZhbHVlcztcbiAgY29uc3QgW2R3UzAsIGR3UzEsIGR3UzIsIGR3UzNdID0gZHcuc3RyaWRlcztcbiAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IFtkeVMwLCBkeVMxLCBkeVMyLCBkeVMzXSA9IGR5U3RyaWRlcztcbiAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBbeFMwLCB4UzEsIHhTMiwgeFMzXSA9IHhTdHJpZGVzO1xuXG4gIGNvbnN0IGZyb250UGFkID0gY29udkluZm8ucGFkSW5mby5mcm9udDtcbiAgY29uc3QgbGVmdFBhZCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgY29uc3QgdG9wUGFkID0gY29udkluZm8ucGFkSW5mby50b3A7XG5cbiAgZm9yIChsZXQgd0YgPSAwOyB3RiA8IGZpbHRlckRlcHRoOyArK3dGKSB7XG4gICAgY29uc3QgeUZNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKGZyb250UGFkIC0gd0YpIC8gc3RyaWRlRGVwdGgpKTtcbiAgICBjb25zdCB5Rk1heCA9IE1hdGgubWluKFxuICAgICAgICBjb252SW5mby5vdXREZXB0aCwgKGNvbnZJbmZvLmluRGVwdGggKyBmcm9udFBhZCAtIHdGKSAvIHN0cmlkZURlcHRoKTtcbiAgICBjb25zdCB3T2Zmc2V0MSA9IHdGICogZHdTMDtcblxuICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgIGNvbnN0IHlSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKCh0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpKTtcbiAgICAgIGNvbnN0IHlSTWF4ID0gTWF0aC5taW4oXG4gICAgICAgICAgY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgY29uc3Qgd09mZnNldDIgPSB3UiAqIGR3UzEgKyB3T2Zmc2V0MTtcblxuICAgICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGZpbHRlcldpZHRoOyArK3dDKSB7XG4gICAgICAgIGNvbnN0IHlDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChsZWZ0UGFkIC0gd0MpIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgY29uc3QgeUNNYXggPSBNYXRoLm1pbihcbiAgICAgICAgICAgIGNvbnZJbmZvLm91dFdpZHRoLCAoY29udkluZm8uaW5XaWR0aCArIGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCk7XG4gICAgICAgIGNvbnN0IHdPZmZzZXQzID0gd0MgKiBkd1MyICsgd09mZnNldDI7XG5cbiAgICAgICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGNvbnZJbmZvLmluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgICAgICBjb25zdCB3T2Zmc2V0NCA9IGQxICogZHdTMyArIHdPZmZzZXQzO1xuXG4gICAgICAgICAgZm9yIChsZXQgZDIgPSAwOyBkMiA8IGNvbnZJbmZvLm91dENoYW5uZWxzOyArK2QyKSB7XG4gICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCBiID0gMDsgYiA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQxID0gYiAqIHhTMDtcbiAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDEgPSBiICogZHlTMDtcblxuICAgICAgICAgICAgICBmb3IgKGxldCB5RiA9IHlGTWluOyB5RiA8IHlGTWF4OyArK3lGKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgeEYgPSB3RiArIHlGICogc3RyaWRlRGVwdGggLSBmcm9udFBhZDtcbiAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0MiA9IHhGICogeFMxICsgeE9mZnNldDE7XG4gICAgICAgICAgICAgICAgY29uc3QgeU9mZnNldDIgPSB5RiAqIGR5UzEgKyB5T2Zmc2V0MTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHlSID0geVJNaW47IHlSIDwgeVJNYXg7ICsreVIpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHhSID0gd1IgKyB5UiAqIHN0cmlkZUhlaWdodCAtIHRvcFBhZDtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHhPZmZzZXQzID0geFIgKiB4UzIgKyB4T2Zmc2V0MjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geVIgKiBkeVMyICsgeU9mZnNldDI7XG5cbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IHlDID0geUNNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeEMgPSB3QyArIHlDICogc3RyaWRlV2lkdGggLSBsZWZ0UGFkO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB4T2Zmc2V0NCA9IHhDICogeFMzICsgeE9mZnNldDM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHlPZmZzZXQ0ID0geUMgKiBkeVMzICsgeU9mZnNldDM7XG5cbiAgICAgICAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWVzW3hPZmZzZXQ0ICsgZDFdICogZHlWYWx1ZXNbeU9mZnNldDQgKyBkMl07XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkd1ZhbHVlc1t3T2Zmc2V0NCArIGQyXSA9IGRvdFByb2Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHcuc2hhcGUsIGR3LmR0eXBlLCBkdy52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb252M0RCYWNrcHJvcEZpbHRlclYyLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wRmlsdGVyVjIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3DBackpropInputV2, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function conv3DBackpropInputV2(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, filter } = inputs;\n    const { pad, strides, inputShape } = attrs;\n    assertNotComplex([dy], 'conv3dBackpropInputV2');\n    const dyStrides = util.computeStrides(dy.shape);\n    const filterStrides = util.computeStrides(filter.shape);\n    const convInfo = backend_util.computeConv3DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad);\n    const dx = new TensorBuffer(convInfo.inShape, 'float32');\n    const dxValues = dx.values;\n    const [dxS0, dxS1, dxS2, dxS3] = dx.strides;\n    const dyValues = backend.data.get(dy.dataId).values;\n    const [dyS0, dyS1, dyS2, dyS3] = dyStrides;\n    const fltValues = backend.data.get(filter.dataId).values;\n    const [fltS0, fltS1, fltS2, fltS3] = filterStrides;\n    const { batchSize, filterDepth, filterHeight, filterWidth, inChannels, inDepth, inHeight, inWidth, outChannels, outDepth, outHeight, outWidth, strideDepth, strideHeight, strideWidth } = convInfo;\n    const frontPad = filterDepth - 1 - convInfo.padInfo.front;\n    const topPad = filterHeight - 1 - convInfo.padInfo.top;\n    const leftPad = filterWidth - 1 - convInfo.padInfo.left;\n    for (let b = 0; b < batchSize; ++b) {\n        for (let d1 = 0; d1 < inChannels; ++d1) {\n            // Frames of depth\n            for (let xF = 0; xF < inDepth; ++xF) {\n                const xFCorner = xF - frontPad;\n                const xFMin = Math.max(0, Math.ceil(xFCorner / strideDepth));\n                const yFMax = Math.min(outDepth, (filterDepth + xFCorner) / strideDepth);\n                // Rows as per standard 2d matrix notation\n                for (let xR = 0; xR < inHeight; ++xR) {\n                    const xRCorner = xR - topPad;\n                    const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n                    const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight);\n                    // Columns as per standard 2d matrix notation\n                    for (let xC = 0; xC < inWidth; ++xC) {\n                        const xCCorner = xC - leftPad;\n                        const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n                        const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n                        let dotProd = 0;\n                        for (let yF = xFMin; yF < yFMax; ++yF) {\n                            const wF = yF * strideDepth - xFCorner;\n                            for (let yR = xRMin; yR < yRMax; ++yR) {\n                                const wR = yR * strideHeight - xRCorner;\n                                for (let yC = xCMin; yC < yCMax; ++yC) {\n                                    const wC = yC * strideWidth - xCCorner;\n                                    const dyOffset = dyS0 * b + dyS1 * yF + dyS2 * yR + dyS3 * yC;\n                                    const fltOffset = fltS0 * (filterDepth - 1 - wF) +\n                                        fltS1 * (filterHeight - 1 - wR) +\n                                        fltS2 * (filterWidth - 1 - wC) + fltS3 * d1;\n                                    for (let d2 = 0; d2 < outChannels; ++d2) {\n                                        const pixel = dyValues[dyOffset + d2];\n                                        const weight = fltValues[fltOffset + d2];\n                                        dotProd += pixel * weight;\n                                    }\n                                }\n                            }\n                        }\n                        dxValues[dxS0 * b + dxS1 * xF + dxS2 * xR + dxS3 * xC + d1] =\n                            dotProd;\n                    }\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const conv3DBackpropInputV2Config = {\n    kernelName: Conv3DBackpropInputV2,\n    backendName: 'cpu',\n    kernelFunc: conv3DBackpropInputV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEQmFja3Byb3BJbnB1dFYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBcUYsWUFBWSxFQUEwQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6TSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBSXJDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV6QyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLHVCQUF1QixDQUFDLENBQUM7SUFFaEQsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQWlELEVBQ3BFLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLE1BQU0sRUFBRSxHQUFHLElBQUksWUFBWSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7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LFdBQVcsRUFBRSxFQUFFLEVBQUUsRUFBRTt3Q0FDdkMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQzt3Q0FDdEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQzt3Q0FDekMsT0FBTyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUM7cUNBQzNCO2lDQUNGOzZCQUNGO3lCQUNGO3dCQUNELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQzs0QkFDdkQsT0FBTyxDQUFDO3FCQUNiO2lCQUNGO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFpQjtJQUN2RCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxxQkFBeUM7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYzREJhY2twcm9wSW5wdXRWMiwgQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMsIENvbnYzREJhY2twcm9wSW5wdXRWMklucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dFYyKGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252M0RCYWNrcHJvcElucHV0VjJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7cGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5XSwgJ2NvbnYzZEJhY2twcm9wSW5wdXRWMicpO1xuXG4gIGNvbnN0IGR5U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZHkuc2hhcGUpO1xuICBjb25zdCBmaWx0ZXJTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhmaWx0ZXIuc2hhcGUpO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcblxuICBjb25zdCBkeCA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8uaW5TaGFwZSwgJ2Zsb2F0MzInKTtcbiAgY29uc3QgZHhWYWx1ZXMgPSBkeC52YWx1ZXM7XG4gIGNvbnN0IFtkeFMwLCBkeFMxLCBkeFMyLCBkeFMzXSA9IGR4LnN0cmlkZXM7XG4gIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBbZHlTMCwgZHlTMSwgZHlTMiwgZHlTM10gPSBkeVN0cmlkZXM7XG4gIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyLCBmbHRTM10gPSBmaWx0ZXJTdHJpZGVzO1xuICBjb25zdCB7XG4gICAgYmF0Y2hTaXplLFxuICAgIGZpbHRlckRlcHRoLFxuICAgIGZpbHRlckhlaWdodCxcbiAgICBmaWx0ZXJXaWR0aCxcbiAgICBpbkNoYW5uZWxzLFxuICAgIGluRGVwdGgsXG4gICAgaW5IZWlnaHQsXG4gICAgaW5XaWR0aCxcbiAgICBvdXRDaGFubmVscyxcbiAgICBvdXREZXB0aCxcbiAgICBvdXRIZWlnaHQsXG4gICAgb3V0V2lkdGgsXG4gICAgc3RyaWRlRGVwdGgsXG4gICAgc3RyaWRlSGVpZ2h0LFxuICAgIHN0cmlkZVdpZHRoXG4gIH0gPSBjb252SW5mbztcbiAgY29uc3QgZnJvbnRQYWQgPSBmaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICBjb25zdCB0b3BQYWQgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGxlZnRQYWQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBpbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAvLyBGcmFtZXMgb2YgZGVwdGhcbiAgICAgIGZvciAobGV0IHhGID0gMDsgeEYgPCBpbkRlcHRoOyArK3hGKSB7XG4gICAgICAgIGNvbnN0IHhGQ29ybmVyID0geEYgLSBmcm9udFBhZDtcbiAgICAgICAgY29uc3QgeEZNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeEZDb3JuZXIgLyBzdHJpZGVEZXB0aCkpO1xuICAgICAgICBjb25zdCB5Rk1heCA9XG4gICAgICAgICAgICBNYXRoLm1pbihvdXREZXB0aCwgKGZpbHRlckRlcHRoICsgeEZDb3JuZXIpIC8gc3RyaWRlRGVwdGgpO1xuXG4gICAgICAgIC8vIFJvd3MgYXMgcGVyIHN0YW5kYXJkIDJkIG1hdHJpeCBub3RhdGlvblxuICAgICAgICBmb3IgKGxldCB4UiA9IDA7IHhSIDwgaW5IZWlnaHQ7ICsreFIpIHtcbiAgICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICAgIGNvbnN0IHhSTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhSQ29ybmVyIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgICAgICAgY29uc3QgeVJNYXggPVxuICAgICAgICAgICAgICBNYXRoLm1pbihvdXRIZWlnaHQsIChmaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcikgLyBzdHJpZGVIZWlnaHQpO1xuICAgICAgICAgIC8vIENvbHVtbnMgYXMgcGVyIHN0YW5kYXJkIDJkIG1hdHJpeCBub3RhdGlvblxuICAgICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHhDIC0gbGVmdFBhZDtcbiAgICAgICAgICAgIGNvbnN0IHhDTWluID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKHhDQ29ybmVyIC8gc3RyaWRlV2lkdGgpKTtcbiAgICAgICAgICAgIGNvbnN0IHlDTWF4ID1cbiAgICAgICAgICAgICAgICBNYXRoLm1pbihvdXRXaWR0aCwgKGZpbHRlcldpZHRoICsgeENDb3JuZXIpIC8gc3RyaWRlV2lkdGgpO1xuXG4gICAgICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgICAgICBmb3IgKGxldCB5RiA9IHhGTWluOyB5RiA8IHlGTWF4OyArK3lGKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHdGID0geUYgKiBzdHJpZGVEZXB0aCAtIHhGQ29ybmVyO1xuXG4gICAgICAgICAgICAgIGZvciAobGV0IHlSID0geFJNaW47IHlSIDwgeVJNYXg7ICsreVIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB5QyA9IHhDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCB3QyA9IHlDICogc3RyaWRlV2lkdGggLSB4Q0Nvcm5lcjtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGR5T2Zmc2V0ID0gZHlTMCAqIGIgKyBkeVMxICogeUYgKyBkeVMyICogeVIgKyBkeVMzICogeUM7XG4gICAgICAgICAgICAgICAgICBjb25zdCBmbHRPZmZzZXQgPSBmbHRTMCAqIChmaWx0ZXJEZXB0aCAtIDEgLSB3RikgK1xuICAgICAgICAgICAgICAgICAgICAgIGZsdFMxICogKGZpbHRlckhlaWdodCAtIDEgLSB3UikgK1xuICAgICAgICAgICAgICAgICAgICAgIGZsdFMyICogKGZpbHRlcldpZHRoIC0gMSAtIHdDKSArIGZsdFMzICogZDE7XG5cbiAgICAgICAgICAgICAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBvdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5VmFsdWVzW2R5T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3ZWlnaHQgPSBmbHRWYWx1ZXNbZmx0T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogd2VpZ2h0O1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHhWYWx1ZXNbZHhTMCAqIGIgKyBkeFMxICogeEYgKyBkeFMyICogeFIgKyBkeFMzICogeEMgKyBkMV0gPVxuICAgICAgICAgICAgICAgIGRvdFByb2Q7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZHguc2hhcGUsIGR4LmR0eXBlLCBkeC52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYzREJhY2twcm9wSW5wdXRWMixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb252M0RCYWNrcHJvcElucHV0VjIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cos } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const cos = unaryKernelFunc(Cos, (xi) => Math.cos(xi));\nexport const cosConfig = {\n    kernelName: Cos,\n    backendName: 'cpu',\n    kernelFunc: cos,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Db3MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvcywgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgY29zID0gdW5hcnlLZXJuZWxGdW5jKENvcywgKHhpKSA9PiBNYXRoLmNvcyh4aSkpO1xuXG5leHBvcnQgY29uc3QgY29zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvcyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjb3MsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cosh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const cosh = unaryKernelFunc(Cosh, (xi) => Math.cosh(xi));\nexport const coshConfig = {\n    kernelName: Cosh,\n    backendName: 'cpu',\n    kernelFunc: cosh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ29zaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDb3NoLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBjb3NoID0gdW5hcnlLZXJuZWxGdW5jKENvc2gsICh4aSkgPT4gTWF0aC5jb3NoKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBjb3NoQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvc2gsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogY29zaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, CropAndResize, util } from '@tensorflow/tfjs-core';\nexport function cropAndResize(args) {\n    const { inputs, backend, attrs } = args;\n    const { image, boxes, boxInd } = inputs;\n    const { cropSize, method, extrapolationValue } = attrs;\n    const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n    const numBoxes = boxes.shape[0];\n    const [cropHeight, cropWidth] = cropSize;\n    const output = buffer([numBoxes, cropHeight, cropWidth, numChannels], 'float32');\n    const boxVals = backend.data.get(boxes.dataId).values;\n    const boxIndVals = backend.data.get(boxInd.dataId).values;\n    const imageVals = backend.data.get(image.dataId).values;\n    const inStride = util.computeStrides(image.shape); // to calculate flat indexes into image\n    const outStride = util.computeStrides(output.shape); // to calculate flat indexes into output\n    // Reference implementation\n    // tslint:disable-next-line:max-line-length\n    // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/crop_and_resize_op.cc\n    for (let b = 0; b < numBoxes; b++) {\n        const startInd = b * 4;\n        const y1 = boxVals[startInd];\n        const x1 = boxVals[startInd + 1];\n        const y2 = boxVals[startInd + 2];\n        const x2 = boxVals[startInd + 3];\n        const bInd = boxIndVals[b];\n        if (bInd >= batch) {\n            continue;\n        }\n        const heightScale = (cropHeight > 1) ? (y2 - y1) * (imageHeight - 1) / (cropHeight - 1) : 0;\n        const widthScale = (cropWidth > 1) ? (x2 - x1) * (imageWidth - 1) / (cropWidth - 1) : 0;\n        for (let y = 0; y < cropHeight; y++) {\n            const yInd = (cropHeight > 1) ?\n                y1 * (imageHeight - 1) + y * (heightScale) :\n                0.5 * (y1 + y2) * (imageHeight - 1);\n            if (yInd < 0 || yInd > imageHeight - 1) {\n                for (let x = 0; x < cropWidth; x++) {\n                    for (let c = 0; c < numChannels; c++) {\n                        const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n                        output.values[ind] = extrapolationValue;\n                    }\n                }\n                continue;\n            }\n            if (method === 'bilinear') {\n                const topInd = Math.floor(yInd);\n                const bottomInd = Math.ceil(yInd);\n                const yLerp = yInd - topInd;\n                for (let x = 0; x < cropWidth; x++) {\n                    const xInd = (cropWidth > 1) ?\n                        x1 * (imageWidth - 1) + x * widthScale :\n                        0.5 * (x1 + x2) * (imageWidth - 1);\n                    if (xInd < 0 || xInd > imageWidth - 1) {\n                        for (let c = 0; c < numChannels; c++) {\n                            const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n                            output.values[ind] = extrapolationValue;\n                        }\n                        continue;\n                    }\n                    const leftInd = Math.floor(xInd);\n                    const rightInd = Math.ceil(xInd);\n                    const xLerp = xInd - leftInd;\n                    for (let c = 0; c < numChannels; c++) {\n                        let ind = c + leftInd * inStride[2] + topInd * inStride[1] +\n                            bInd * inStride[0];\n                        const topLeft = imageVals[ind];\n                        ind = c + rightInd * inStride[2] + topInd * inStride[1] +\n                            bInd * inStride[0];\n                        const topRight = imageVals[ind];\n                        ind = c + leftInd * inStride[2] + bottomInd * inStride[1] +\n                            bInd * inStride[0];\n                        const bottomLeft = imageVals[ind];\n                        ind = c + rightInd * inStride[2] + bottomInd * inStride[1] +\n                            bInd * inStride[0];\n                        const bottomRight = imageVals[ind];\n                        const top = topLeft + (topRight - topLeft) * xLerp;\n                        const bottom = bottomLeft + (bottomRight - bottomLeft) * xLerp;\n                        ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n                        output.values[ind] = top + ((bottom - top) * yLerp);\n                    }\n                }\n            }\n            else { // method == \"nearest\"\n                for (let x = 0; x < cropWidth; ++x) {\n                    const xInd = (cropWidth > 1) ?\n                        x1 * (imageWidth - 1) + x * widthScale :\n                        0.5 * (x1 + x2) * (imageWidth - 1);\n                    if (xInd < 0 || xInd > imageWidth - 1) {\n                        for (let c = 0; c < numChannels; c++) {\n                            const ind = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n                            output.values[ind] = extrapolationValue;\n                        }\n                        continue;\n                    }\n                    const closestX = Math.round(xInd);\n                    const closestY = Math.round(yInd);\n                    for (let c = 0; c < numChannels; c++) {\n                        const inInd = c + closestX * inStride[2] + closestY * inStride[1] +\n                            bInd * inStride[0];\n                        const outInd = c + x * outStride[2] + y * outStride[1] + b * outStride[0];\n                        output.values[outInd] = imageVals[inInd];\n                    }\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(output.shape, output.dtype, output.values);\n}\nexport const cropAndResizeConfig = {\n    kernelName: CropAndResize,\n    backendName: 'cpu',\n    kernelFunc: cropAndResize\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JvcEFuZFJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ3JvcEFuZFJlc2l6ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFFLGFBQWEsRUFBNkYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJN0osTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUk3QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdEMsTUFBTSxFQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckQsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDbEUsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVoQyxNQUFNLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FDUixNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV0RSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNwRSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFD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dCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtidWZmZXIsIENyb3BBbmRSZXNpemUsIENyb3BBbmRSZXNpemVBdHRycywgQ3JvcEFuZFJlc2l6ZUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcm9wQW5kUmVzaXplKGFyZ3M6IHtcbiAgaW5wdXRzOiBDcm9wQW5kUmVzaXplSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IENyb3BBbmRSZXNpemVBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2UsIGJveGVzLCBib3hJbmR9ID0gaW5wdXRzO1xuICBjb25zdCB7Y3JvcFNpemUsIG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICBjb25zdCBudW1Cb3hlcyA9IGJveGVzLnNoYXBlWzBdO1xuXG4gIGNvbnN0IFtjcm9wSGVpZ2h0LCBjcm9wV2lkdGhdID0gY3JvcFNpemU7XG4gIGNvbnN0IG91dHB1dCA9XG4gICAgICBidWZmZXIoW251bUJveGVzLCBjcm9wSGVpZ2h0LCBjcm9wV2lkdGgsIG51bUNoYW5uZWxzXSwgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBib3hWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBib3hJbmRWYWxzID0gYmFja2VuZC5kYXRhLmdldChib3hJbmQuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgaW1hZ2VWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IGluU3RyaWRlID1cbiAgICAgIHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2Uuc2hhcGUpOyAgLy8gdG8gY2FsY3VsYXRlIGZsYXQgaW5kZXhlcyBpbnRvIGltYWdlXG4gIGNvbnN0IG91dFN0cmlkZSA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoXG4gICAgICBvdXRwdXQuc2hhcGUpOyAgLy8gdG8gY2FsY3VsYXRlIGZsYXQgaW5kZXhlcyBpbnRvIG91dHB1dFxuXG4gIC8vIFJlZmVyZW5jZSBpbXBsZW1lbnRhdGlvblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvY3JvcF9hbmRfcmVzaXplX29wLmNjXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgbnVtQm94ZXM7IGIrKykge1xuICAgIGNvbnN0IHN0YXJ0SW5kID0gYiAqIDQ7XG4gICAgY29uc3QgeTEgPSBib3hWYWxzW3N0YXJ0SW5kXTtcbiAgICBjb25zdCB4MSA9IGJveFZhbHNbc3RhcnRJbmQgKyAxXTtcbiAgICBjb25zdCB5MiA9IGJveFZhbHNbc3RhcnRJbmQgKyAyXTtcbiAgICBjb25zdCB4MiA9IGJveFZhbHNbc3RhcnRJbmQgKyAzXTtcblxuICAgIGNvbnN0IGJJbmQ6IG51bWJlciA9IGJveEluZFZhbHNbYl07XG4gICAgaWYgKGJJbmQgPj0gYmF0Y2gpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIGNvbnN0IGhlaWdodFNjYWxlID1cbiAgICAgICAgKGNyb3BIZWlnaHQgPiAxKSA/ICh5MiAtIHkxKSAqIChpbWFnZUhlaWdodCAtIDEpIC8gKGNyb3BIZWlnaHQgLSAxKSA6IDA7XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9XG4gICAgICAgIChjcm9wV2lkdGggPiAxKSA/ICh4MiAtIHgxKSAqIChpbWFnZVdpZHRoIC0gMSkgLyAoY3JvcFdpZHRoIC0gMSkgOiAwO1xuXG4gICAgZm9yIChsZXQgeSA9IDA7IHkgPCBjcm9wSGVpZ2h0OyB5KyspIHtcbiAgICAgIGNvbnN0IHlJbmQ6IG51bWJlciA9IChjcm9wSGVpZ2h0ID4gMSkgP1xuICAgICAgICAgIHkxICogKGltYWdlSGVpZ2h0IC0gMSkgKyB5ICogKGhlaWdodFNjYWxlKSA6XG4gICAgICAgICAgMC41ICogKHkxICsgeTIpICogKGltYWdlSGVpZ2h0IC0gMSk7XG5cbiAgICAgIGlmICh5SW5kIDwgMCB8fCB5SW5kID4gaW1hZ2VIZWlnaHQgLSAxKSB7XG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyB4KyspIHtcbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGluZCA9XG4gICAgICAgICAgICAgICAgYyArIHggKiBvdXRTdHJpZGVbMl0gKyB5ICogb3V0U3RyaWRlWzFdICsgYiAqIG91dFN0cmlkZVswXTtcbiAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbaW5kXSA9IGV4dHJhcG9sYXRpb25WYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChtZXRob2QgPT09ICdiaWxpbmVhcicpIHtcbiAgICAgICAgY29uc3QgdG9wSW5kID0gTWF0aC5mbG9vcih5SW5kKTtcbiAgICAgICAgY29uc3QgYm90dG9tSW5kID0gTWF0aC5jZWlsKHlJbmQpO1xuICAgICAgICBjb25zdCB5TGVycCA9IHlJbmQgLSB0b3BJbmQ7XG5cbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBjcm9wV2lkdGg7IHgrKykge1xuICAgICAgICAgIGNvbnN0IHhJbmQgPSAoY3JvcFdpZHRoID4gMSkgP1xuICAgICAgICAgICAgICB4MSAqIChpbWFnZVdpZHRoIC0gMSkgKyB4ICogd2lkdGhTY2FsZSA6XG4gICAgICAgICAgICAgIDAuNSAqICh4MSArIHgyKSAqIChpbWFnZVdpZHRoIC0gMSk7XG5cbiAgICAgICAgICBpZiAoeEluZCA8IDAgfHwgeEluZCA+IGltYWdlV2lkdGggLSAxKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgICAgY29uc3QgaW5kID1cbiAgICAgICAgICAgICAgICAgIGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbaW5kXSA9IGV4dHJhcG9sYXRpb25WYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGxlZnRJbmQgPSBNYXRoLmZsb29yKHhJbmQpO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0SW5kID0gTWF0aC5jZWlsKHhJbmQpO1xuICAgICAgICAgIGNvbnN0IHhMZXJwID0geEluZCAtIGxlZnRJbmQ7XG5cbiAgICAgICAgICBmb3IgKGxldCBjID0gMDsgYyA8IG51bUNoYW5uZWxzOyBjKyspIHtcbiAgICAgICAgICAgIGxldCBpbmQgPSBjICsgbGVmdEluZCAqIGluU3RyaWRlWzJdICsgdG9wSW5kICogaW5TdHJpZGVbMV0gK1xuICAgICAgICAgICAgICAgIGJJbmQgKiBpblN0cmlkZVswXTtcbiAgICAgICAgICAgIGNvbnN0IHRvcExlZnQgPSBpbWFnZVZhbHNbaW5kXTtcblxuICAgICAgICAgICAgaW5kID0gYyArIHJpZ2h0SW5kICogaW5TdHJpZGVbMl0gKyB0b3BJbmQgKiBpblN0cmlkZVsxXSArXG4gICAgICAgICAgICAgICAgYkluZCAqIGluU3RyaWRlWzBdO1xuICAgICAgICAgICAgY29uc3QgdG9wUmlnaHQgPSBpbWFnZVZhbHNbaW5kXTtcblxuICAgICAgICAgICAgaW5kID0gYyArIGxlZnRJbmQgKiBpblN0cmlkZVsyXSArIGJvdHRvbUluZCAqIGluU3RyaWRlWzFdICtcbiAgICAgICAgICAgICAgICBiSW5kICogaW5TdHJpZGVbMF07XG4gICAgICAgICAgICBjb25zdCBib3R0b21MZWZ0ID0gaW1hZ2VWYWxzW2luZF07XG5cbiAgICAgICAgICAgIGluZCA9IGMgKyByaWdodEluZCAqIGluU3RyaWRlWzJdICsgYm90dG9tSW5kICogaW5TdHJpZGVbMV0gK1xuICAgICAgICAgICAgICAgIGJJbmQgKiBpblN0cmlkZVswXTtcbiAgICAgICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0ID0gaW1hZ2VWYWxzW2luZF07XG5cbiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHRvcExlZnQgKyAodG9wUmlnaHQgLSB0b3BMZWZ0KSAqIHhMZXJwO1xuICAgICAgICAgICAgY29uc3QgYm90dG9tID0gYm90dG9tTGVmdCArIChib3R0b21SaWdodCAtIGJvdHRvbUxlZnQpICogeExlcnA7XG5cbiAgICAgICAgICAgIGluZCA9IGMgKyB4ICogb3V0U3RyaWRlWzJdICsgeSAqIG91dFN0cmlkZVsxXSArIGIgKiBvdXRTdHJpZGVbMF07XG4gICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSB0b3AgKyAoKGJvdHRvbSAtIHRvcCkgKiB5TGVycCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAgLy8gbWV0aG9kID09IFwibmVhcmVzdFwiXG4gICAgICAgIGZvciAobGV0IHggPSAwOyB4IDwgY3JvcFdpZHRoOyArK3gpIHtcbiAgICAgICAgICBjb25zdCB4SW5kID0gKGNyb3BXaWR0aCA+IDEpID9cbiAgICAgICAgICAgICAgeDEgKiAoaW1hZ2VXaWR0aCAtIDEpICsgeCAqIHdpZHRoU2NhbGUgOlxuICAgICAgICAgICAgICAwLjUgKiAoeDEgKyB4MikgKiAoaW1hZ2VXaWR0aCAtIDEpO1xuXG4gICAgICAgICAgaWYgKHhJbmQgPCAwIHx8IHhJbmQgPiBpbWFnZVdpZHRoIC0gMSkge1xuICAgICAgICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCBudW1DaGFubmVsczsgYysrKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGluZCA9XG4gICAgICAgICAgICAgICAgICBjICsgeCAqIG91dFN0cmlkZVsyXSArIHkgKiBvdXRTdHJpZGVbMV0gKyBiICogb3V0U3RyaWRlWzBdO1xuICAgICAgICAgICAgICBvdXRwdXQudmFsdWVzW2luZF0gPSBleHRyYXBvbGF0aW9uVmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBjbG9zZXN0WCA9IE1hdGgucm91bmQoeEluZCk7XG4gICAgICAgICAgY29uc3QgY2xvc2VzdFkgPSBNYXRoLnJvdW5kKHlJbmQpO1xuICAgICAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbnVtQ2hhbm5lbHM7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgaW5JbmQgPSBjICsgY2xvc2VzdFggKiBpblN0cmlkZVsyXSArIGNsb3Nlc3RZICogaW5TdHJpZGVbMV0gK1xuICAgICAgICAgICAgICAgIGJJbmQgKiBpblN0cmlkZVswXTtcbiAgICAgICAgICAgIGNvbnN0IG91dEluZCA9XG4gICAgICAgICAgICAgICAgYyArIHggKiBvdXRTdHJpZGVbMl0gKyB5ICogb3V0U3RyaWRlWzFdICsgYiAqIG91dFN0cmlkZVswXTtcbiAgICAgICAgICAgIG91dHB1dC52YWx1ZXNbb3V0SW5kXSA9IGltYWdlVmFsc1tpbkluZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0LnNoYXBlLCBvdXRwdXQuZHR5cGUsIG91dHB1dC52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDcm9wQW5kUmVzaXplLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGNyb3BBbmRSZXNpemUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Cumprod, upcastType, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function cumprod(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, exclusive, reverse } = attrs;\n    assertNotComplex(x, 'cumprod');\n    const permutation = backend_util.getAxesPermutation([axis], x.shape.length);\n    let $x = x;\n    if (permutation != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n    }\n    const permutedAxis = backend_util.getInnerMostAxes(1, x.shape.length)[0];\n    if (permutedAxis !== $x.shape.length - 1) {\n        throw new Error(`backend.cumprod in CPU expects an inner-most ` +\n            `axis=${$x.shape.length - 1} but got axis=${permutedAxis}`);\n    }\n    const resultDtype = upcastType($x.dtype, 'int32');\n    const vals = util.makeOnesTypedArray(util.sizeFromShape($x.shape), resultDtype);\n    const aVals = backend.data.get($x.dataId).values;\n    const finalDim = $x.shape[$x.shape.length - 1];\n    const indexAdjuster = reverse ?\n        (i, j) => i + finalDim - j - 1 :\n        (i, j) => i + j;\n    for (let i = 0; i < aVals.length; i += finalDim) {\n        for (let j = 0; j < finalDim; j++) {\n            const idx = indexAdjuster(i, j);\n            if (j === 0) {\n                vals[idx] = exclusive ? 1 : aVals[idx];\n            }\n            else {\n                const prevIdx = indexAdjuster(i, j - 1);\n                vals[idx] = exclusive ? aVals[prevIdx] * vals[prevIdx] :\n                    aVals[idx] * vals[prevIdx];\n            }\n        }\n    }\n    const result = backend.makeTensorInfo($x.shape, resultDtype, vals);\n    if (permutation != null) {\n        const reversePermutation = backend_util.getUndoAxesPermutation(permutation);\n        const reverseTransposedResult = transpose({ inputs: { x: result }, backend, attrs: { perm: reversePermutation } });\n        backend.disposeIntermediateTensorInfo(result);\n        backend.disposeIntermediateTensorInfo($x);\n        return reverseTransposedResult;\n    }\n    return result;\n}\nexport const cumprodConfig = {\n    kernelName: Cumprod,\n    backendName: 'cpu',\n    kernelFunc: cumprod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VtcHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvQ3VtcHJvZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE9BQU8sRUFBaUYsVUFBVSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzdKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQzJCO0lBQzdCLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV6QyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFL0IsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7UUFDdkIsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQ3BFO0lBQ0QsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLENBQUMsRUFB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QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDdW1wcm9kLCBDdW1wcm9kQXR0cnMsIEN1bXByb2RJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXBjYXN0VHlwZSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3VtcHJvZChcbiAgICBhcmdzOiB7aW5wdXRzOiBDdW1wcm9kSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgICAgICAgICAgYXR0cnM6IEN1bXByb2RBdHRyc30pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywgZXhjbHVzaXZlLCByZXZlcnNlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ2N1bXByb2QnKTtcblxuICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4LnNoYXBlLmxlbmd0aCk7XG4gIGxldCAkeCA9IHg7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGF0aW9ufX0pO1xuICB9XG4gIGNvbnN0IHBlcm11dGVkQXhpcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKDEsIHguc2hhcGUubGVuZ3RoKVswXTtcblxuICBpZiAocGVybXV0ZWRBeGlzICE9PSAkeC5zaGFwZS5sZW5ndGggLSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgYmFja2VuZC5jdW1wcm9kIGluIENQVSBleHBlY3RzIGFuIGlubmVyLW1vc3QgYCArXG4gICAgICAgIGBheGlzPSR7JHguc2hhcGUubGVuZ3RoIC0gMX0gYnV0IGdvdCBheGlzPSR7cGVybXV0ZWRBeGlzfWApO1xuICB9XG5cbiAgY29uc3QgcmVzdWx0RHR5cGUgPSB1cGNhc3RUeXBlKCR4LmR0eXBlLCAnaW50MzInKTtcbiAgY29uc3QgdmFscyA9IHV0aWwubWFrZU9uZXNUeXBlZEFycmF5KFxuICAgICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZSgkeC5zaGFwZSksIHJlc3VsdER0eXBlKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldCgkeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBmaW5hbERpbSA9ICR4LnNoYXBlWyR4LnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCBpbmRleEFkanVzdGVyID0gcmV2ZXJzZSA/XG4gICAgICAoaTogbnVtYmVyLCBqOiBudW1iZXIpID0+IGkgKyBmaW5hbERpbSAtIGogLSAxIDpcbiAgICAgIChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gaSArIGo7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYVZhbHMubGVuZ3RoOyBpICs9IGZpbmFsRGltKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBmaW5hbERpbTsgaisrKSB7XG4gICAgICBjb25zdCBpZHggPSBpbmRleEFkanVzdGVyKGksIGopO1xuICAgICAgaWYgKGogPT09IDApIHtcbiAgICAgICAgdmFsc1tpZHhdID0gZXhjbHVzaXZlID8gMSA6IGFWYWxzW2lkeF07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBwcmV2SWR4ID0gaW5kZXhBZGp1c3RlcihpLCBqIC0gMSk7XG4gICAgICAgIHZhbHNbaWR4XSA9IGV4Y2x1c2l2ZSA/IGFWYWxzW3ByZXZJZHhdICogdmFsc1twcmV2SWR4XSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFWYWxzW2lkeF0gKiB2YWxzW3ByZXZJZHhdO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oJHguc2hhcGUsIHJlc3VsdER0eXBlLCB2YWxzKTtcblxuICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgIGNvbnN0IHJldmVyc2VQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRVbmRvQXhlc1Blcm11dGF0aW9uKHBlcm11dGF0aW9uKTtcbiAgICBjb25zdCByZXZlcnNlVHJhbnNwb3NlZFJlc3VsdCA9IHRyYW5zcG9zZShcbiAgICAgICAge2lucHV0czoge3g6IHJlc3VsdH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcmV2ZXJzZVBlcm11dGF0aW9ufX0pO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuXG4gICAgcmV0dXJuIHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGN1bXByb2RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ3VtcHJvZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjdW1wcm9kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Cumsum, upcastType, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { transpose } from './Transpose';\nexport function cumsum(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, exclusive, reverse } = attrs;\n    assertNotComplex(x, 'cumsum');\n    const permutation = backend_util.getAxesPermutation([axis], x.shape.length);\n    let $x = x;\n    if (permutation != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n    }\n    const permutedAxis = backend_util.getInnerMostAxes(1, x.shape.length)[0];\n    if (permutedAxis !== $x.shape.length - 1) {\n        throw new Error(`backend.cumsum in CPU expects an inner-most ` +\n            `axis=${$x.shape.length - 1} but got axis=${permutedAxis}`);\n    }\n    const resultDtype = upcastType($x.dtype, 'int32');\n    const vals = util.makeZerosTypedArray(util.sizeFromShape($x.shape), resultDtype);\n    const aVals = backend.data.get($x.dataId).values;\n    const finalDim = $x.shape[$x.shape.length - 1];\n    const indexAdjuster = reverse ?\n        (i, j) => i + finalDim - j - 1 :\n        (i, j) => i + j;\n    for (let i = 0; i < aVals.length; i += finalDim) {\n        for (let j = 0; j < finalDim; j++) {\n            const idx = indexAdjuster(i, j);\n            if (j === 0) {\n                vals[idx] = exclusive ? 0 : aVals[idx];\n            }\n            else {\n                const prevIdx = indexAdjuster(i, j - 1);\n                vals[idx] = exclusive ? aVals[prevIdx] + vals[prevIdx] :\n                    aVals[idx] + vals[prevIdx];\n            }\n        }\n    }\n    const result = backend.makeTensorInfo($x.shape, resultDtype, vals);\n    if (permutation != null) {\n        const reversePermutation = backend_util.getUndoAxesPermutation(permutation);\n        const reverseTransposedResult = transpose({ inputs: { x: result }, backend, attrs: { perm: reversePermutation } });\n        backend.disposeIntermediateTensorInfo(result);\n        backend.disposeIntermediateTensorInfo($x);\n        return reverseTransposedResult;\n    }\n    return result;\n}\nexport const cumsumConfig = {\n    kernelName: Cumsum,\n    backendName: 'cpu',\n    kernelFunc: cumsum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3Vtc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9DdW1zdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQStFLFVBQVUsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUcxSixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTlCLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ1gsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ3ZCLEVBQUUsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUNwRTtJQUNELE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUs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Q2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ3Vtc3VtLCBDdW1zdW1BdHRycywgQ3Vtc3VtSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHVwY2FzdFR5cGUsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGN1bXN1bShcbiAgICBhcmdzOiB7aW5wdXRzOiBDdW1zdW1JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogQ3Vtc3VtQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywgZXhjbHVzaXZlLCByZXZlcnNlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ2N1bXN1bScpO1xuXG4gIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihbYXhpc10sIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICAkeCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0YXRpb259fSk7XG4gIH1cbiAgY29uc3QgcGVybXV0ZWRBeGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeC5zaGFwZS5sZW5ndGgpWzBdO1xuXG4gIGlmIChwZXJtdXRlZEF4aXMgIT09ICR4LnNoYXBlLmxlbmd0aCAtIDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBiYWNrZW5kLmN1bXN1bSBpbiBDUFUgZXhwZWN0cyBhbiBpbm5lci1tb3N0IGAgK1xuICAgICAgICBgYXhpcz0keyR4LnNoYXBlLmxlbmd0aCAtIDF9IGJ1dCBnb3QgYXhpcz0ke3Blcm11dGVkQXhpc31gKTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdER0eXBlID0gdXBjYXN0VHlwZSgkeC5kdHlwZSwgJ2ludDMyJyk7XG4gIGNvbnN0IHZhbHMgPSB1dGlsLm1ha2VaZXJvc1R5cGVkQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKCR4LnNoYXBlKSwgcmVzdWx0RHR5cGUpIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgYVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KCR4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGZpbmFsRGltID0gJHguc2hhcGVbJHguc2hhcGUubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGluZGV4QWRqdXN0ZXIgPSByZXZlcnNlID9cbiAgICAgIChpOiBudW1iZXIsIGo6IG51bWJlcikgPT4gaSArIGZpbmFsRGltIC0gaiAtIDEgOlxuICAgICAgKGk6IG51bWJlciwgajogbnVtYmVyKSA9PiBpICsgajtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhVmFscy5sZW5ndGg7IGkgKz0gZmluYWxEaW0pIHtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IGZpbmFsRGltOyBqKyspIHtcbiAgICAgIGNvbnN0IGlkeCA9IGluZGV4QWRqdXN0ZXIoaSwgaik7XG4gICAgICBpZiAoaiA9PT0gMCkge1xuICAgICAgICB2YWxzW2lkeF0gPSBleGNsdXNpdmUgPyAwIDogYVZhbHNbaWR4XTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHByZXZJZHggPSBpbmRleEFkanVzdGVyKGksIGogLSAxKTtcbiAgICAgICAgdmFsc1tpZHhdID0gZXhjbHVzaXZlID8gYVZhbHNbcHJldklkeF0gKyB2YWxzW3ByZXZJZHhdIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYVZhbHNbaWR4XSArIHZhbHNbcHJldklkeF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY29uc3QgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkeC5zaGFwZSwgcmVzdWx0RHR5cGUsIHZhbHMpO1xuXG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgY29uc3QgcmV2ZXJzZVBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgIGNvbnN0IHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0ID0gdHJhbnNwb3NlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiByZXZlcnNlUGVybXV0YXRpb259fSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkeCk7XG5cbiAgICByZXR1cm4gcmV2ZXJzZVRyYW5zcG9zZWRSZXN1bHQ7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgY3Vtc3VtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEN1bXN1bSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBjdW1zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DenseBincount } from '@tensorflow/tfjs-core';\nimport { bincountImpl, bincountReduceImpl } from './Bincount_impl';\nexport function denseBincount(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, weights } = inputs;\n    const { size, binaryOutput } = attrs;\n    if (x.shape.length === 1) {\n        const xVals = backend.data.get(x.dataId).values;\n        const weightsVals = backend.data.get(weights.dataId).values;\n        const outVals = bincountImpl(xVals, weightsVals, weights.dtype, weights.shape, size);\n        return backend.makeTensorInfo([size], weights.dtype, outVals);\n    }\n    else if (x.shape.length === 2) {\n        const xBuf = backend.bufferSync(x);\n        const weightsBuf = backend.bufferSync(weights);\n        const outBuf = bincountReduceImpl(xBuf, weightsBuf, size, binaryOutput);\n        return backend.makeTensorInfo(outBuf.shape, weights.dtype, outBuf.values);\n    }\n    throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank` +\n        `${x.shape.length}.`);\n}\nexport const denseBincountConfig = {\n    kernelName: DenseBincount,\n    backendName: 'cpu',\n    kernelFunc: denseBincount\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVuc2VCaW5jb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRGVuc2VCaW5jb3VudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsYUFBYSxFQUFrRyxNQUFNLHVCQUF1QixDQUFDO0FBR3JKLE9BQU8sRUFBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUVqRSxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRW5DLElBQUksQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO1FBQzlELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO1FBRTFFLE1BQU0sT0FBTyxHQUNULFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztRQUV6RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0tBQy9EO1NBQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDL0IsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBa0IsQ0FBQyxDQUFDLENBQUM7UUFDcEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBa0IsT0FBTyxDQUFDLENBQUM7UUFFaEUsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFFeEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDM0U7SUFFRCxNQUFNLElBQUksS0FBSyxDQUNYLG9FQUFvRTtRQUNwRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RlbnNlQmluY291bnQsIERlbnNlQmluY291bnRBdHRycywgRGVuc2VCaW5jb3VudElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2JpbmNvdW50SW1wbCwgYmluY291bnRSZWR1Y2VJbXBsfSBmcm9tICcuL0JpbmNvdW50X2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVuc2VCaW5jb3VudChhcmdzOiB7XG4gIGlucHV0czogRGVuc2VCaW5jb3VudElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBEZW5zZUJpbmNvdW50QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHdlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7c2l6ZSwgYmluYXJ5T3V0cHV0fSA9IGF0dHJzO1xuXG4gIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3Qgd2VpZ2h0c1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHdlaWdodHMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IG91dFZhbHMgPVxuICAgICAgICBiaW5jb3VudEltcGwoeFZhbHMsIHdlaWdodHNWYWxzLCB3ZWlnaHRzLmR0eXBlLCB3ZWlnaHRzLnNoYXBlLCBzaXplKTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzaXplXSwgd2VpZ2h0cy5kdHlwZSwgb3V0VmFscyk7XG4gIH0gZWxzZSBpZiAoeC5zaGFwZS5sZW5ndGggPT09IDIpIHtcbiAgICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdmbG9hdDMyJz4oeCk7XG4gICAgY29uc3Qgd2VpZ2h0c0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KHdlaWdodHMpO1xuXG4gICAgY29uc3Qgb3V0QnVmID0gYmluY291bnRSZWR1Y2VJbXBsKHhCdWYsIHdlaWdodHNCdWYsIHNpemUsIGJpbmFyeU91dHB1dCk7XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIHdlaWdodHMuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICB9XG5cbiAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgYEVycm9yIGluIGRlbnNlQmluY291bnQ6IGlucHV0IG11c3QgYmUgYXQgbW9zdCByYW5rIDIsIGJ1dCBnb3QgcmFua2AgK1xuICAgICAgYCR7eC5zaGFwZS5sZW5ndGh9LmApO1xufVxuXG5leHBvcnQgY29uc3QgZGVuc2VCaW5jb3VudENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZW5zZUJpbmNvdW50LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGRlbnNlQmluY291bnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DepthToSpace, util } from '@tensorflow/tfjs-core';\nexport function depthToSpace(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { blockSize, dataFormat } = attrs;\n    util.assert(dataFormat === 'NHWC', () => `Only NHWC dataFormat supported on CPU for depthToSpace. Got ${dataFormat}`);\n    const batchSize = x.shape[0];\n    const inputHeight = x.shape[1];\n    const inputWidth = x.shape[2];\n    const inputDepth = x.shape[3];\n    const outputHeight = inputHeight * blockSize;\n    const outputWidth = inputWidth * blockSize;\n    const outputDepth = inputDepth / (blockSize * blockSize);\n    const xValues = backend.data.get(x.dataId).values;\n    const result = new Float32Array(batchSize * outputHeight * outputWidth * outputDepth);\n    let outputIdx = 0;\n    for (let b = 0; b < batchSize; ++b) {\n        for (let h = 0; h < outputHeight; ++h) {\n            const inH = Math.floor(h / blockSize);\n            const offsetH = (h % blockSize);\n            for (let w = 0; w < outputWidth; ++w) {\n                const inW = Math.floor(w / blockSize);\n                const offsetW = (w % blockSize);\n                const offsetD = (offsetH * blockSize + offsetW) * outputDepth;\n                for (let d = 0; d < outputDepth; ++d) {\n                    const inD = d + offsetD;\n                    const inputIdx = inD + inputDepth * (inW + inputWidth * (inH + inputHeight * b));\n                    result[outputIdx++] = xValues[inputIdx];\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo([batchSize, outputHeight, outputWidth, outputDepth], x.dtype, result);\n}\nexport const depthToSpaceConfig = {\n    kernelName: DepthToSpace,\n    backendName: 'cpu',\n    kernelFunc: depthToSpace\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGhUb1NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9EZXB0aFRvU3BhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBMkYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJbEosTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRDLElBQUksQ0FBQyxNQUFNLENBQ1AsVUFBVSxLQUFLLE1BQU0sRUFDckIsR0FBRyxFQUFFLENBQUMsK0RBQ0YsVUFBVSxFQUFFLENBQUMsQ0FBQztJQUV0QixNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sV0FBVyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRTlCLE1BQU0sWUFBWSxHQUFHLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDN0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxVQUFVLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQ1IsSUFBSSxZQUFZLENBQUMsU0FBUyxHQUFHLFlBQVksR0FBRyxXQUFXLEdBQUcsV0FBVyxDQUFDLENBQUM7SUFFM0UsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDbEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFlBQVksRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNyQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUN0QyxNQUFNLE9BQU8sR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztZQUNoQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLEVBQUUsQ0FBQyxFQUFFO2dCQUNwQyxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQztnQkFDdEMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEdBQUcsU0FBUyxDQUFDLENBQUM7Z0JBQ2hDLE1BQU0sT0FBTyxHQUFHLENBQUMsT0FBTyxHQUFHLFNBQVMsR0FBRyxPQUFPLENBQUMsR0FBRyxXQUFXLENBQUM7Z0JBQzlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLEVBQUUsRUFBRSxDQUFDLEVBQUU7b0JBQ3BDLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7b0JBQ3hCLE1BQU0sUUFBUSxHQUNWLEdBQUcsR0FBRyxVQUFVLEdBQUcsQ0FBQyxHQUFHLEdBQUcsVUFBVSxHQUFHLENBQUMsR0FBRyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUNwRSxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ3pDO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUN6QixDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEZXB0aFRvU3BhY2UsIERlcHRoVG9TcGFjZUF0dHJzLCBEZXB0aFRvU3BhY2VJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGhUb1NwYWNlKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aFRvU3BhY2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogRGVwdGhUb1NwYWNlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YmxvY2tTaXplLCBkYXRhRm9ybWF0fSA9IGF0dHJzO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgZGF0YUZvcm1hdCA9PT0gJ05IV0MnLFxuICAgICAgKCkgPT4gYE9ubHkgTkhXQyBkYXRhRm9ybWF0IHN1cHBvcnRlZCBvbiBDUFUgZm9yIGRlcHRoVG9TcGFjZS4gR290ICR7XG4gICAgICAgICAgZGF0YUZvcm1hdH1gKTtcblxuICBjb25zdCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICBjb25zdCBpbnB1dEhlaWdodCA9IHguc2hhcGVbMV07XG4gIGNvbnN0IGlucHV0V2lkdGggPSB4LnNoYXBlWzJdO1xuICBjb25zdCBpbnB1dERlcHRoID0geC5zaGFwZVszXTtcblxuICBjb25zdCBvdXRwdXRIZWlnaHQgPSBpbnB1dEhlaWdodCAqIGJsb2NrU2l6ZTtcbiAgY29uc3Qgb3V0cHV0V2lkdGggPSBpbnB1dFdpZHRoICogYmxvY2tTaXplO1xuICBjb25zdCBvdXRwdXREZXB0aCA9IGlucHV0RGVwdGggLyAoYmxvY2tTaXplICogYmxvY2tTaXplKTtcblxuICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgICBuZXcgRmxvYXQzMkFycmF5KGJhdGNoU2l6ZSAqIG91dHB1dEhlaWdodCAqIG91dHB1dFdpZHRoICogb3V0cHV0RGVwdGgpO1xuXG4gIGxldCBvdXRwdXRJZHggPSAwO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgZm9yIChsZXQgaCA9IDA7IGggPCBvdXRwdXRIZWlnaHQ7ICsraCkge1xuICAgICAgY29uc3QgaW5IID0gTWF0aC5mbG9vcihoIC8gYmxvY2tTaXplKTtcbiAgICAgIGNvbnN0IG9mZnNldEggPSAoaCAlIGJsb2NrU2l6ZSk7XG4gICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IG91dHB1dFdpZHRoOyArK3cpIHtcbiAgICAgICAgY29uc3QgaW5XID0gTWF0aC5mbG9vcih3IC8gYmxvY2tTaXplKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0VyA9ICh3ICUgYmxvY2tTaXplKTtcbiAgICAgICAgY29uc3Qgb2Zmc2V0RCA9IChvZmZzZXRIICogYmxvY2tTaXplICsgb2Zmc2V0VykgKiBvdXRwdXREZXB0aDtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBvdXRwdXREZXB0aDsgKytkKSB7XG4gICAgICAgICAgY29uc3QgaW5EID0gZCArIG9mZnNldEQ7XG4gICAgICAgICAgY29uc3QgaW5wdXRJZHggPVxuICAgICAgICAgICAgICBpbkQgKyBpbnB1dERlcHRoICogKGluVyArIGlucHV0V2lkdGggKiAoaW5IICsgaW5wdXRIZWlnaHQgKiBiKSk7XG4gICAgICAgICAgcmVzdWx0W291dHB1dElkeCsrXSA9IHhWYWx1ZXNbaW5wdXRJZHhdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICBbYmF0Y2hTaXplLCBvdXRwdXRIZWlnaHQsIG91dHB1dFdpZHRoLCBvdXRwdXREZXB0aF0sIHguZHR5cGUsIHJlc3VsdCk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGRlcHRoVG9TcGFjZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNative, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function depthwiseConv2dNative(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter } = inputs;\n    const { strides, pad, dilations, dimRoundingMode } = attrs;\n    assertNotComplex([x, filter], 'depthwiseConv2DNative');\n    const xStrides = util.computeStrides(x.shape);\n    const filterStrides = util.computeStrides(filter.shape);\n    let $dilations = dilations;\n    if ($dilations == null) {\n        $dilations = [1, 1];\n    }\n    util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in depthwiseConv2d: Either strides or dilations must be ' +\n        `1. Got strides ${strides} and dilations '${$dilations}'`);\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true /* depthwise */);\n    const { filterHeight, filterWidth, dilationHeight, dilationWidth, padInfo } = convInfo;\n    const padLeft = padInfo.left;\n    const padTop = padInfo.top;\n    const chMul = convInfo.outChannels / convInfo.inChannels;\n    const y = new TensorBuffer(convInfo.outShape, x.dtype);\n    const xVals = backend.data.get(x.dataId).values;\n    const wVals = backend.data.get(filter.dataId).values;\n    const yVals = y.values;\n    for (let b = 0; b < convInfo.batchSize; ++b) {\n        const xOffset1 = b * xStrides[0];\n        const yOffset1 = b * y.strides[0];\n        for (let yR = 0; yR < convInfo.outHeight; ++yR) {\n            const yOffset2 = yOffset1 + yR * y.strides[1];\n            const xRCorner = yR * convInfo.strideHeight - padTop;\n            for (let wR = 0; wR < filterHeight; ++wR) {\n                const xR = xRCorner + wR * dilationHeight;\n                if (xR < 0 || xR >= convInfo.inHeight) {\n                    continue;\n                }\n                const wOffset1 = wR * filterStrides[0];\n                const xOffset2 = xOffset1 + xR * xStrides[1];\n                for (let yC = 0; yC < convInfo.outWidth; ++yC) {\n                    const yOffset3 = yOffset2 + yC * y.strides[2];\n                    const xCCorner = yC * convInfo.strideWidth - padLeft;\n                    for (let wC = 0; wC < filterWidth; ++wC) {\n                        const xC = xCCorner + wC * dilationWidth;\n                        if (xC < 0 || xC >= convInfo.inWidth) {\n                            continue;\n                        }\n                        const wOffset2 = wOffset1 + wC * filterStrides[1];\n                        const xOffset3 = xOffset2 + xC * convInfo.inChannels;\n                        let yOffset4 = yOffset3;\n                        let wOffset3 = wOffset2;\n                        for (let d1 = 0; d1 < convInfo.inChannels; ++d1) {\n                            const xVal = xVals[xOffset3 + d1];\n                            for (let q = 0; q < chMul; ++q) {\n                                yVals[yOffset4 + q] += xVal * wVals[wOffset3 + q];\n                            }\n                            yOffset4 += chMul;\n                            wOffset3 += chMul;\n                        }\n                    }\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(y.shape, y.dtype, y.values);\n}\nexport const depthwiseConv2dNativeConfig = {\n    kernelName: DepthwiseConv2dNative,\n    backendName: 'cpu',\n    kernelFunc: depthwiseConv2dNative\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxxQkFBcUIsRUFBcUYsWUFBWSxFQUEwQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6TSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLHFCQUFxQixDQUFDLElBSXJDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekQsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsdUJBQXVCLENBQUMsQ0FBQztJQUV2RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QyxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4RCxJQUFJLFVBQVUsR0FBRyxTQUFTLENBQUM7SUFDM0IsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1FBQ3RCLFVBQVUsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUNyQjtJQUVELElBQUksQ0FBQyxNQUFNLENBQ1AsWUFBWSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxV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LFVBQVUsRUFBRSxxQkFBeUM7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnMsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW3gsIGZpbHRlcl0sICdkZXB0aHdpc2VDb252MkROYXRpdmUnKTtcblxuICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG4gIGNvbnN0IGZpbHRlclN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGZpbHRlci5zaGFwZSk7XG5cbiAgbGV0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnM7XG4gIGlmICgkZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAkZGlsYXRpb25zID0gWzEsIDFdO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsICRkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGRlcHRod2lzZUNvbnYyZDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgJyArXG4gICAgICAgICAgYDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHskZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsICRkaWxhdGlvbnMsXG4gICAgICBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGNvbnN0IHtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkaWxhdGlvbkhlaWdodCwgZGlsYXRpb25XaWR0aCwgcGFkSW5mb30gPVxuICAgICAgY29udkluZm87XG4gIGNvbnN0IHBhZExlZnQgPSBwYWRJbmZvLmxlZnQ7XG4gIGNvbnN0IHBhZFRvcCA9IHBhZEluZm8udG9wO1xuICBjb25zdCBjaE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcbiAgY29uc3QgeSA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUgYXMgJ2Zsb2F0MzInKTtcbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgd1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB5VmFscyA9IHkudmFsdWVzO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICBjb25zdCB4T2Zmc2V0MSA9IGIgKiB4U3RyaWRlc1swXTtcbiAgICBjb25zdCB5T2Zmc2V0MSA9IGIgKiB5LnN0cmlkZXNbMF07XG4gICAgZm9yIChsZXQgeVIgPSAwOyB5UiA8IGNvbnZJbmZvLm91dEhlaWdodDsgKyt5Uikge1xuICAgICAgY29uc3QgeU9mZnNldDIgPSB5T2Zmc2V0MSArIHlSICogeS5zdHJpZGVzWzFdO1xuICAgICAgY29uc3QgeFJDb3JuZXIgPSB5UiAqIGNvbnZJbmZvLnN0cmlkZUhlaWdodCAtIHBhZFRvcDtcbiAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICAgICAgY29uc3QgeFIgPSB4UkNvcm5lciArIHdSICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gY29udkluZm8uaW5IZWlnaHQpIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB3T2Zmc2V0MSA9IHdSICogZmlsdGVyU3RyaWRlc1swXTtcbiAgICAgICAgY29uc3QgeE9mZnNldDIgPSB4T2Zmc2V0MSArIHhSICogeFN0cmlkZXNbMV07XG4gICAgICAgIGZvciAobGV0IHlDID0gMDsgeUMgPCBjb252SW5mby5vdXRXaWR0aDsgKyt5Qykge1xuICAgICAgICAgIGNvbnN0IHlPZmZzZXQzID0geU9mZnNldDIgKyB5QyAqIHkuc3RyaWRlc1syXTtcbiAgICAgICAgICBjb25zdCB4Q0Nvcm5lciA9IHlDICogY29udkluZm8uc3RyaWRlV2lkdGggLSBwYWRMZWZ0O1xuICAgICAgICAgIGZvciAobGV0IHdDID0gMDsgd0MgPCBmaWx0ZXJXaWR0aDsgKyt3Qykge1xuICAgICAgICAgICAgY29uc3QgeEMgPSB4Q0Nvcm5lciArIHdDICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gY29udkluZm8uaW5XaWR0aCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHdPZmZzZXQyID0gd09mZnNldDEgKyB3QyAqIGZpbHRlclN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCB4T2Zmc2V0MyA9IHhPZmZzZXQyICsgeEMgKiBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgICAgICAgICAgbGV0IHlPZmZzZXQ0ID0geU9mZnNldDM7XG4gICAgICAgICAgICBsZXQgd09mZnNldDMgPSB3T2Zmc2V0MjtcbiAgICAgICAgICAgIGZvciAobGV0IGQxID0gMDsgZDEgPCBjb252SW5mby5pbkNoYW5uZWxzOyArK2QxKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhWYWwgPSB4VmFsc1t4T2Zmc2V0MyArIGQxXTtcbiAgICAgICAgICAgICAgZm9yIChsZXQgcSA9IDA7IHEgPCBjaE11bDsgKytxKSB7XG4gICAgICAgICAgICAgICAgeVZhbHNbeU9mZnNldDQgKyBxXSArPSB4VmFsICogd1ZhbHNbd09mZnNldDMgKyBxXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB5T2Zmc2V0NCArPSBjaE11bDtcbiAgICAgICAgICAgICAgd09mZnNldDMgKz0gY2hNdWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgeS5kdHlwZSwgeS52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNativeBackpropFilter, TensorBuffer } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function depthwiseConv2dNativeBackpropFilter(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, dy } = inputs;\n    const { strides, dilations, pad, dimRoundingMode, filterShape } = attrs;\n    assertNotComplex([x, dy], 'depthwiseConv2dNativeBackpropFilter');\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filterShape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n    const { strideHeight, strideWidth, filterHeight, filterWidth } = convInfo;\n    const dW = new TensorBuffer(convInfo.filterShape, 'float32');\n    const leftPad = convInfo.padInfo.left;\n    const topPad = convInfo.padInfo.top;\n    const chMul = convInfo.outChannels / convInfo.inChannels;\n    const xVals = backend.data.get(x.dataId).values;\n    const xBuf = new TensorBuffer(x.shape, x.dtype, xVals);\n    const dyVals = backend.data.get(dy.dataId).values;\n    const dyBuf = new TensorBuffer(dy.shape, dy.dtype, dyVals);\n    for (let wR = 0; wR < filterHeight; ++wR) {\n        const yRMin = Math.max(0, Math.ceil((topPad - wR) / strideHeight));\n        const yRMax = Math.min(convInfo.outHeight, (convInfo.inHeight + topPad - wR) / strideHeight);\n        for (let wC = 0; wC < filterWidth; ++wC) {\n            const yCMin = Math.max(0, Math.ceil((leftPad - wC) / strideWidth));\n            const yCMax = Math.min(convInfo.outWidth, (convInfo.inWidth + leftPad - wC) / strideWidth);\n            for (let d2 = 0; d2 < convInfo.outChannels; ++d2) {\n                const d1 = Math.trunc(d2 / chMul);\n                const dm = d2 % chMul;\n                let dotProd = 0;\n                for (let b = 0; b < convInfo.batchSize; ++b) {\n                    for (let yR = yRMin; yR < yRMax; ++yR) {\n                        const xR = wR + yR * strideHeight - topPad;\n                        for (let yC = yCMin; yC < yCMax; ++yC) {\n                            const xC = wC + yC * strideWidth - leftPad;\n                            dotProd += xBuf.get(b, xR, xC, d1) *\n                                dyBuf.get(b, yR, yC, d2);\n                        }\n                    }\n                }\n                dW.set(dotProd, wR, wC, d1, dm);\n            }\n        }\n    }\n    return backend.makeTensorInfo(dW.shape, dW.dtype, dW.values);\n}\nexport const depthwiseConv2dNativeBackpropFilterConfig = {\n    kernelName: DepthwiseConv2dNativeBackpropFilter,\n    backendName: 'cpu',\n    kernelFunc: depthwiseConv2dNativeBackpropFilter\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsbUNBQW1DLEVBQWlILFlBQVksRUFBeUIsTUFBTSx1QkFBdUIsQ0FBQztBQUc3TyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG1DQUFtQyxDQUFDLElBSW5EO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRFLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLHFDQUFxQyxDQUFDLENBQUM7SUFFakUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUNqRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFM0QsTUFBTSxFQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsWUFBWSxFQUFFLFdBQVcsRUFBQyxHQUFHLFFBQVEsQ0FBQztJQUV4RSxNQUFNLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLFNBQVMsQ0FB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QUUsRUFBRSxDQUFZO2dDQUN6QyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBWSxDQUFDO3lCQUMxQztxQkFDRjtpQkFDRjtnQkFDRCxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNqQztTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUNBQXlDLEdBQWlCO0lBQ3JFLFVBQVUsRUFBRSxtQ0FBbUM7SUFDL0MsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLG1DQUF1RDtDQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQXR0cnMsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcihhcmdzOiB7XG4gIGlucHV0czogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmlsdGVyU2hhcGV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbeCwgZHldLCAnZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNoYXBlLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGNvbnN0IHtzdHJpZGVIZWlnaHQsIHN0cmlkZVdpZHRoLCBmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRofSA9IGNvbnZJbmZvO1xuXG4gIGNvbnN0IGRXID0gbmV3IFRlbnNvckJ1ZmZlcihjb252SW5mby5maWx0ZXJTaGFwZSwgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBsZWZ0UGFkID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICBjb25zdCB0b3BQYWQgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgY29uc3QgY2hNdWwgPSBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHM7XG5cbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgeEJ1ZiA9IG5ldyBUZW5zb3JCdWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgeFZhbHMpO1xuICBjb25zdCBkeVZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGR5QnVmID0gbmV3IFRlbnNvckJ1ZmZlcihkeS5zaGFwZSwgZHkuZHR5cGUsIGR5VmFscyk7XG4gIGZvciAobGV0IHdSID0gMDsgd1IgPCBmaWx0ZXJIZWlnaHQ7ICsrd1IpIHtcbiAgICBjb25zdCB5Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgodG9wUGFkIC0gd1IpIC8gc3RyaWRlSGVpZ2h0KSk7XG4gICAgY29uc3QgeVJNYXggPSBNYXRoLm1pbihcbiAgICAgICAgY29udkluZm8ub3V0SGVpZ2h0LCAoY29udkluZm8uaW5IZWlnaHQgKyB0b3BQYWQgLSB3UikgLyBzdHJpZGVIZWlnaHQpO1xuXG4gICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGZpbHRlcldpZHRoOyArK3dDKSB7XG4gICAgICBjb25zdCB5Q01pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgobGVmdFBhZCAtIHdDKSAvIHN0cmlkZVdpZHRoKSk7XG4gICAgICBjb25zdCB5Q01heCA9IE1hdGgubWluKFxuICAgICAgICAgIGNvbnZJbmZvLm91dFdpZHRoLCAoY29udkluZm8uaW5XaWR0aCArIGxlZnRQYWQgLSB3QykgLyBzdHJpZGVXaWR0aCk7XG5cbiAgICAgIGZvciAobGV0IGQyID0gMDsgZDIgPCBjb252SW5mby5vdXRDaGFubmVsczsgKytkMikge1xuICAgICAgICBjb25zdCBkMSA9IE1hdGgudHJ1bmMoZDIgLyBjaE11bCk7XG4gICAgICAgIGNvbnN0IGRtID0gZDIgJSBjaE11bDtcblxuICAgICAgICBsZXQgZG90UHJvZCA9IDA7XG4gICAgICAgIGZvciAobGV0IGIgPSAwOyBiIDwgY29udkluZm8uYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgICAgICBmb3IgKGxldCB5UiA9IHlSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICBjb25zdCB4UiA9IHdSICsgeVIgKiBzdHJpZGVIZWlnaHQgLSB0b3BQYWQ7XG4gICAgICAgICAgICBmb3IgKGxldCB5QyA9IHlDTWluOyB5QyA8IHlDTWF4OyArK3lDKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHhDID0gd0MgKyB5QyAqIHN0cmlkZVdpZHRoIC0gbGVmdFBhZDtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSAoeEJ1Zi5nZXQoYiwgeFIsIHhDLCBkMSkgYXMgbnVtYmVyKSAqXG4gICAgICAgICAgICAgICAgICAoZHlCdWYuZ2V0KGIsIHlSLCB5QywgZDIpIGFzIG51bWJlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRXLnNldChkb3RQcm9kLCB3Uiwgd0MsIGQxLCBkbSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oZFcuc2hhcGUsIGRXLmR0eXBlLCBkVy52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNativeBackpropInput, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function depthwiseConv2dNativeBackpropInput(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, filter } = inputs;\n    const { strides, dilations, pad, dimRoundingMode, inputShape } = attrs;\n    assertNotComplex([dy, filter], 'depthwiseConv2DNativeBackpropInput');\n    const dyStrides = util.computeStrides(dy.shape);\n    const filterStrides = util.computeStrides(filter.shape);\n    const convInfo = backend_util.computeConv2DInfo(inputShape, filter.shape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n    const dx = new TensorBuffer(convInfo.inShape, 'float32');\n    const dxValues = dx.values;\n    const [dxS0, dxS1, dxS2] = dx.strides;\n    const dyValues = backend.data.get(dy.dataId).values;\n    const [dyS0, dyS1, dyS2] = dyStrides;\n    const fltValues = backend.data.get(filter.dataId).values;\n    const [fltS0, fltS1, fltS2] = filterStrides;\n    const { batchSize, filterHeight, filterWidth, inChannels, inHeight, inWidth, outChannels, outHeight, outWidth, strideHeight, strideWidth } = convInfo;\n    const topPad = filterHeight - 1 - convInfo.padInfo.top;\n    const leftPad = filterWidth - 1 - convInfo.padInfo.left;\n    const chMul = outChannels / inChannels;\n    for (let b = 0; b < batchSize; ++b) {\n        for (let d1 = 0; d1 < inChannels; ++d1) {\n            for (let xR = 0; xR < inHeight; ++xR) {\n                const xRCorner = xR - topPad;\n                const xRMin = Math.max(0, Math.ceil(xRCorner / strideHeight));\n                const yRMax = Math.min(outHeight, (filterHeight + xRCorner) / strideHeight);\n                for (let xC = 0; xC < inWidth; ++xC) {\n                    const xCCorner = xC - leftPad;\n                    const xCMin = Math.max(0, Math.ceil(xCCorner / strideWidth));\n                    const yCMax = Math.min(outWidth, (filterWidth + xCCorner) / strideWidth);\n                    let dotProd = 0;\n                    for (let yR = xRMin; yR < yRMax; ++yR) {\n                        const wR = yR * strideHeight - xRCorner;\n                        for (let yC = xCMin; yC < yCMax; ++yC) {\n                            const wC = yC * strideWidth - xCCorner;\n                            const dyOffset = dyS0 * b + dyS1 * yR + dyS2 * yC;\n                            const fltOffset = fltS0 * (filterHeight - 1 - wR) +\n                                fltS1 * (filterWidth - 1 - wC) + fltS2 * d1;\n                            for (let dm = 0; dm < chMul; ++dm) {\n                                const d2 = d1 * chMul + dm;\n                                const pixel = dyValues[dyOffset + d2];\n                                const weight = fltValues[fltOffset + dm];\n                                dotProd += pixel * weight;\n                            }\n                        }\n                    }\n                    dxValues[dxS0 * b + dxS1 * xR + dxS2 * xC + d1] = dotProd;\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const depthwiseConv2dNativeBackpropInputConfig = {\n    kernelName: DepthwiseConv2dNativeBackpropInput,\n    backendName: 'cpu',\n    kernelFunc: depthwiseConv2dNativeBackpropInput\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLGtDQUFrQyxFQUErRyxZQUFZLEVBQTBCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2hQLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsa0NBQWtDLENBQUMsSUFJbEQ7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckUsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsb0NBQW9DLENBQUMsQ0FBQztJQUVyRSxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBeUMsRUFBRSxPQUFPLEVBQ3JFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUUzRCxNQUFNLEVBQUUsR0FBRyxJQUFJLFlBQVksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sUUFBUSxHQUFHLEVBQUUsQ0FBQyxNQUFNLENBQUM7SUFDM0IsTUFBTSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUN0QyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNsRSxNQUFNLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsR0FBRyxTQUFTLENBQUM7SUFDckMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdkUsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEdBQUcsYUFBYSxDQUFDO0lBQzVDLE1BQU0sRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLFdBQVcsRUFDWCxVQUFVLEVBQ1YsUUFBUSxFQUNSLE9BQU8sRUFDUCxXQUFXLEVBQ1gsU0FBUyxFQUNULFFBQVEsRUFDUixZQUFZLEVBQ1osV0FBVyxFQUNaLEdBQUcsUUFBUSxDQUFDO0lBQ2IsTUFBTSxNQUFNLEdBQUcsWUFBWSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztJQUN2RCxNQUFNLE9BQU8sR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO0lBQ3hELE1BQU0sS0FBSyxHQUFHLFdBQVcsR0FBRyxVQUFVLENBQUM7SUFFdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtRQUNsQyxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsVUFBVSxFQUFFLEVBQUUsRUFBRSxFQUFFO1lBQ3RDLEtBQUssSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFLEVBQUUsR0FBRyxRQUFRLEVBQUUsRUFBRSxFQUFFLEVBQUU7Z0JBQ3BDLE1BQU0sUUFBUSxHQUFHLEVBQUUsR0FBRyxNQUFNLENBQUM7Z0JBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0JBQzlELE1BQU0sS0FBSyxHQUNQLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxFQUFFLENBQUMsWUFBWSxHQUFHLFFBQVEsQ0FBQyxHQUFHLFlBQVksQ0FBQyxDQUFDO2dCQUVsRSxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFO29CQUNuQyxNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDO29CQUM5QixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO29CQUM3RCxNQUFNLEtBQUssR0FDUCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQztvQkFFL0QsSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDO29CQUNoQixLQUFLLElBQUksRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO3dCQUNyQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsWUFBWSxHQUFHLFFBQVEsQ0FBQzt3QkFFeEMsS0FBSyxJQUFJLEVBQUUsR0FBRyxLQUFLLEVBQUUsRUFBRSxHQUFHLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRTs0QkFDckMsTUFBTSxFQUFFLEdBQUcsRUFBRSxHQUFHLFdBQVcsR0FBRyxRQUFRLENBQUM7NEJBQ3ZDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxJQUFJLEdBQUcsRUFBRSxDQUFDOzRCQUNsRCxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsQ0FBQyxZQUFZLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQ0FDN0MsS0FBSyxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxLQUFLLEdBQUcsRUFBRSxDQUFDOzRCQUVoRCxLQUFLLElBQUksRUFBRSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFO2dDQUNqQyxNQUFNLEVBQUUsR0FBRyxFQUFFLEdBQUcsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQ0FDM0IsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLFFBQVEsR0FBRyxFQUFFLENBQUMsQ0FBQztnQ0FDdEMsTUFBTSxNQUFNLEdBQUcsU0FBUyxDQUFDLFNBQVMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQ0FDekMsT0FBTyxJQUFJLEtBQUssR0FBRyxNQUFNLENBQUM7NkJBQzNCO3lCQUNGO3FCQUNGO29CQUNELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxHQUFHLElBQUksR0FBRyxFQUFFLEdBQUcsSUFBSSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUM7aUJBQzNEO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHdDQUF3QyxHQUFpQjtJQUNwRSxVQUFVLEVBQUUsa0NBQWtDO0lBQzlDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxrQ0FBc0Q7Q0FDbkUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dChhcmdzOiB7XG4gIGlucHV0czogRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFtkeSwgZmlsdGVyXSwgJ2RlcHRod2lzZUNvbnYyRE5hdGl2ZUJhY2twcm9wSW5wdXQnKTtcblxuICBjb25zdCBkeVN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGR5LnNoYXBlKTtcbiAgY29uc3QgZmlsdGVyU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcblxuICBjb25zdCBkeCA9IG5ldyBUZW5zb3JCdWZmZXIoY29udkluZm8uaW5TaGFwZSwgJ2Zsb2F0MzInKTtcbiAgY29uc3QgZHhWYWx1ZXMgPSBkeC52YWx1ZXM7XG4gIGNvbnN0IFtkeFMwLCBkeFMxLCBkeFMyXSA9IGR4LnN0cmlkZXM7XG4gIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBbZHlTMCwgZHlTMSwgZHlTMl0gPSBkeVN0cmlkZXM7XG4gIGNvbnN0IGZsdFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IFtmbHRTMCwgZmx0UzEsIGZsdFMyXSA9IGZpbHRlclN0cmlkZXM7XG4gIGNvbnN0IHtcbiAgICBiYXRjaFNpemUsXG4gICAgZmlsdGVySGVpZ2h0LFxuICAgIGZpbHRlcldpZHRoLFxuICAgIGluQ2hhbm5lbHMsXG4gICAgaW5IZWlnaHQsXG4gICAgaW5XaWR0aCxcbiAgICBvdXRDaGFubmVscyxcbiAgICBvdXRIZWlnaHQsXG4gICAgb3V0V2lkdGgsXG4gICAgc3RyaWRlSGVpZ2h0LFxuICAgIHN0cmlkZVdpZHRoXG4gIH0gPSBjb252SW5mbztcbiAgY29uc3QgdG9wUGFkID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICBjb25zdCBsZWZ0UGFkID0gZmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICBjb25zdCBjaE11bCA9IG91dENoYW5uZWxzIC8gaW5DaGFubmVscztcblxuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgZm9yIChsZXQgZDEgPSAwOyBkMSA8IGluQ2hhbm5lbHM7ICsrZDEpIHtcbiAgICAgIGZvciAobGV0IHhSID0gMDsgeFIgPCBpbkhlaWdodDsgKyt4Uikge1xuICAgICAgICBjb25zdCB4UkNvcm5lciA9IHhSIC0gdG9wUGFkO1xuICAgICAgICBjb25zdCB4Uk1pbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCh4UkNvcm5lciAvIHN0cmlkZUhlaWdodCkpO1xuICAgICAgICBjb25zdCB5Uk1heCA9XG4gICAgICAgICAgICBNYXRoLm1pbihvdXRIZWlnaHQsIChmaWx0ZXJIZWlnaHQgKyB4UkNvcm5lcikgLyBzdHJpZGVIZWlnaHQpO1xuXG4gICAgICAgIGZvciAobGV0IHhDID0gMDsgeEMgPCBpbldpZHRoOyArK3hDKSB7XG4gICAgICAgICAgY29uc3QgeENDb3JuZXIgPSB4QyAtIGxlZnRQYWQ7XG4gICAgICAgICAgY29uc3QgeENNaW4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoeENDb3JuZXIgLyBzdHJpZGVXaWR0aCkpO1xuICAgICAgICAgIGNvbnN0IHlDTWF4ID1cbiAgICAgICAgICAgICAgTWF0aC5taW4ob3V0V2lkdGgsIChmaWx0ZXJXaWR0aCArIHhDQ29ybmVyKSAvIHN0cmlkZVdpZHRoKTtcblxuICAgICAgICAgIGxldCBkb3RQcm9kID0gMDtcbiAgICAgICAgICBmb3IgKGxldCB5UiA9IHhSTWluOyB5UiA8IHlSTWF4OyArK3lSKSB7XG4gICAgICAgICAgICBjb25zdCB3UiA9IHlSICogc3RyaWRlSGVpZ2h0IC0geFJDb3JuZXI7XG5cbiAgICAgICAgICAgIGZvciAobGV0IHlDID0geENNaW47IHlDIDwgeUNNYXg7ICsreUMpIHtcbiAgICAgICAgICAgICAgY29uc3Qgd0MgPSB5QyAqIHN0cmlkZVdpZHRoIC0geENDb3JuZXI7XG4gICAgICAgICAgICAgIGNvbnN0IGR5T2Zmc2V0ID0gZHlTMCAqIGIgKyBkeVMxICogeVIgKyBkeVMyICogeUM7XG4gICAgICAgICAgICAgIGNvbnN0IGZsdE9mZnNldCA9IGZsdFMwICogKGZpbHRlckhlaWdodCAtIDEgLSB3UikgK1xuICAgICAgICAgICAgICAgICAgZmx0UzEgKiAoZmlsdGVyV2lkdGggLSAxIC0gd0MpICsgZmx0UzIgKiBkMTtcblxuICAgICAgICAgICAgICBmb3IgKGxldCBkbSA9IDA7IGRtIDwgY2hNdWw7ICsrZG0pIHtcbiAgICAgICAgICAgICAgICBjb25zdCBkMiA9IGQxICogY2hNdWwgKyBkbTtcbiAgICAgICAgICAgICAgICBjb25zdCBwaXhlbCA9IGR5VmFsdWVzW2R5T2Zmc2V0ICsgZDJdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHdlaWdodCA9IGZsdFZhbHVlc1tmbHRPZmZzZXQgKyBkbV07XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBwaXhlbCAqIHdlaWdodDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBkeFZhbHVlc1tkeFMwICogYiArIGR4UzEgKiB4UiArIGR4UzIgKiB4QyArIGQxXSA9IGRvdFByb2Q7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, Diag, util } from '@tensorflow/tfjs-core';\nexport function diag(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    const xSize = util.sizeFromShape(x.shape);\n    const xVals = backend.data.get(x.dataId).values;\n    const outBuf = buffer([xSize, xSize], x.dtype);\n    const vals = outBuf.values;\n    for (let i = 0; i < xVals.length; i++) {\n        vals[i * xSize + i] = xVals[i];\n    }\n    const outShape = [...x.shape, ...x.shape];\n    return backend.makeTensorInfo(outShape, outBuf.dtype, outBuf.values);\n}\nexport const diagConfig = {\n    kernelName: Diag,\n    backendName: 'cpu',\n    kernelFunc: diag\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRGlhZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFFLElBQUksRUFBZ0UsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJdkgsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFtRDtJQUV0RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTFDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzlELE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUMzQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNyQyxJQUFJLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7S0FDaEM7SUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUxQyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgRGlhZywgRGlhZ0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWFnKGFyZ3M6IHtpbnB1dHM6IERpYWdJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IG91dEJ1ZiA9IGJ1ZmZlcihbeFNpemUsIHhTaXplXSwgeC5kdHlwZSk7XG4gIGNvbnN0IHZhbHMgPSBvdXRCdWYudmFsdWVzO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHhWYWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgdmFsc1tpICogeFNpemUgKyBpXSA9IHhWYWxzW2ldO1xuICB9XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBbLi4ueC5zaGFwZSwgLi4ueC5zaGFwZV07XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBkaWFnQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERpYWcsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZGlhZyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Dilation2D, util } from '@tensorflow/tfjs-core';\nexport const dilation2DConfig = {\n    kernelName: Dilation2D,\n    backendName: 'cpu',\n    kernelFunc: ({ inputs, backend, attrs }) => {\n        const { x, filter } = inputs;\n        const { strides, pad, dilations } = attrs;\n        const cpuBackend = backend;\n        const xVals = cpuBackend.data.get(x.dataId).values;\n        const xRank = x.shape.length;\n        const filterVals = cpuBackend.data.get(filter.dataId).values;\n        const filterRank = filter.shape.length;\n        const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = backend_util.computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations);\n        const outSize = util.sizeFromShape(outShape);\n        const outRank = outShape.length;\n        const outputVals = util.getArrayFromDType(x.dtype, outSize);\n        // Upsampling the input by fill in `dilation size - 1` values between each\n        // input value.\n        // This implementation follows the TF c++ implementation:\n        // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n        for (let b = 0; b < batchSize; ++b) {\n            for (let hOut = 0; hOut < outHeight; ++hOut) {\n                const hBeg = hOut * strideHeight - padInfo.top;\n                for (let wOut = 0; wOut < outWidth; ++wOut) {\n                    const wBeg = wOut * strideWidth - padInfo.left;\n                    for (let d = 0; d < inChannels; ++d) {\n                        let curVal = Number.MIN_SAFE_INTEGER;\n                        for (let h = 0; h < filterHeight; ++h) {\n                            const hIn = hBeg + h * dilationHeight;\n                            if (hIn >= 0 && hIn < inHeight) {\n                                for (let w = 0; w < filterWidth; ++w) {\n                                    const wIn = wBeg + w * dilationWidth;\n                                    if (wIn >= 0 && wIn < inWidth) {\n                                        const xIndex = util.locToIndex([b, hIn, wIn, d], xRank, util.computeStrides(x.shape));\n                                        const filterIndex = util.locToIndex([h, w, d], filterRank, util.computeStrides(filter.shape));\n                                        const val = xVals[xIndex] + filterVals[filterIndex];\n                                        if (val > curVal) {\n                                            curVal = val;\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        const outputIndex = util.locToIndex([b, hOut, wOut, d], outRank, util.computeStrides(outShape));\n                        outputVals[outputIndex] = curVal;\n                    }\n                }\n            }\n        }\n        const dataId = cpuBackend.write(util.toTypedArray(outputVals, x.dtype), outShape, x.dtype);\n        return { dataId, shape: outShape, dtype: x.dtype };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yRC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRGlsYXRpb24yRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLFVBQVUsRUFBK0QsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJbEksTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQzVDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBMEIsQ0FBQztRQUMvQyxNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUE4QixDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLE9BQXlCLENBQUM7UUFFN0MsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7UUFDakUsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFN0IsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7UUFDM0UsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7UUFFdkMsTUFBTSxFQUNKLFNBQVMsRUFDVCxRQUFRLEVBQ1IsT0FBTyxFQUNQLFVBQVUsRUFDVixTQUFTLEVBQ1QsUUFBUSxFQUNSLE9BQU8sRUFDUCxZQUFZLEVBQ1osV0FB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LENBQUMsQ0FBQyxDQUFDO3dCQUNoRSxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsTUFBTSxDQUFDO3FCQUNsQztpQkFDRjthQUNGO1NBQ0Y7UUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUvRCxPQUFPLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztJQUNuRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERpbGF0aW9uMkQsIERpbGF0aW9uMkRBdHRycywgRGlsYXRpb24yRElucHV0cywgS2VybmVsQ29uZmlnLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERpbGF0aW9uMkQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogKHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSkgPT4ge1xuICAgIGNvbnN0IHt4LCBmaWx0ZXJ9ID0gaW5wdXRzIGFzIERpbGF0aW9uMkRJbnB1dHM7XG4gICAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGlsYXRpb25zfSA9IGF0dHJzIGFzIHt9IGFzIERpbGF0aW9uMkRBdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcblxuICAgIGNvbnN0IHhWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICAgIGNvbnN0IGZpbHRlclZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IGZpbHRlclJhbmsgPSBmaWx0ZXIuc2hhcGUubGVuZ3RoO1xuXG4gICAgY29uc3Qge1xuICAgICAgYmF0Y2hTaXplLFxuICAgICAgaW5IZWlnaHQsXG4gICAgICBpbldpZHRoLFxuICAgICAgaW5DaGFubmVscyxcbiAgICAgIG91dEhlaWdodCxcbiAgICAgIG91dFdpZHRoLFxuICAgICAgcGFkSW5mbyxcbiAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgIHN0cmlkZVdpZHRoLFxuICAgICAgZmlsdGVySGVpZ2h0LFxuICAgICAgZmlsdGVyV2lkdGgsXG4gICAgICBkaWxhdGlvbkhlaWdodCxcbiAgICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgICBvdXRTaGFwZVxuICAgIH0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZURpbGF0aW9uMkRJbmZvKFxuICAgICAgICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIHBhZCxcbiAgICAgICAgICAgICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuXG4gICAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gICAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBvdXRwdXRWYWxzID0gdXRpbC5nZXRBcnJheUZyb21EVHlwZSh4LmR0eXBlLCBvdXRTaXplKTtcblxuICAgIC8vIFVwc2FtcGxpbmcgdGhlIGlucHV0IGJ5IGZpbGwgaW4gYGRpbGF0aW9uIHNpemUgLSAxYCB2YWx1ZXMgYmV0d2VlbiBlYWNoXG4gICAgLy8gaW5wdXQgdmFsdWUuXG4gICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBmb2xsb3dzIHRoZSBURiBjKysgaW1wbGVtZW50YXRpb246XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL2Q5YTNhODQ5ZWRjMTk4ZTkwMTcyYmM1OGViMjkzZGU0NTdmOWQ5ODYvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvZGlsYXRpb25fb3BzLmNjXG4gICAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgICAgZm9yIChsZXQgaE91dCA9IDA7IGhPdXQgPCBvdXRIZWlnaHQ7ICsraE91dCkge1xuICAgICAgICBjb25zdCBoQmVnID0gaE91dCAqIHN0cmlkZUhlaWdodCAtIHBhZEluZm8udG9wO1xuICAgICAgICBmb3IgKGxldCB3T3V0ID0gMDsgd091dCA8IG91dFdpZHRoOyArK3dPdXQpIHtcbiAgICAgICAgICBjb25zdCB3QmVnID0gd091dCAqIHN0cmlkZVdpZHRoIC0gcGFkSW5mby5sZWZ0O1xuICAgICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgaW5DaGFubmVsczsgKytkKSB7XG4gICAgICAgICAgICBsZXQgY3VyVmFsID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVI7XG4gICAgICAgICAgICBmb3IgKGxldCBoID0gMDsgaCA8IGZpbHRlckhlaWdodDsgKytoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGhJbiA9IGhCZWcgKyBoICogZGlsYXRpb25IZWlnaHQ7XG4gICAgICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCBpbkhlaWdodCkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHcgPSAwOyB3IDwgZmlsdGVyV2lkdGg7ICsrdykge1xuICAgICAgICAgICAgICAgICAgY29uc3Qgd0luID0gd0JlZyArIHcgKiBkaWxhdGlvbldpZHRoO1xuICAgICAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8IGluV2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeEluZGV4ID0gdXRpbC5sb2NUb0luZGV4KFxuICAgICAgICAgICAgICAgICAgICAgICAgW2IsIGhJbiwgd0luLCBkXSwgeFJhbmssIHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSkpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXJJbmRleCA9IHV0aWwubG9jVG9JbmRleChcbiAgICAgICAgICAgICAgICAgICAgICAgIFtoLCB3LCBkXSwgZmlsdGVyUmFuayxcbiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWwuY29tcHV0ZVN0cmlkZXMoZmlsdGVyLnNoYXBlKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHhWYWxzW3hJbmRleF0gKyBmaWx0ZXJWYWxzW2ZpbHRlckluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA+IGN1clZhbCkge1xuICAgICAgICAgICAgICAgICAgICAgIGN1clZhbCA9IHZhbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0SW5kZXggPSB1dGlsLmxvY1RvSW5kZXgoXG4gICAgICAgICAgICAgICAgW2IsIGhPdXQsIHdPdXQsIGRdLCBvdXRSYW5rLCB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKSk7XG4gICAgICAgICAgICBvdXRwdXRWYWxzW291dHB1dEluZGV4XSA9IGN1clZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBkYXRhSWQgPSBjcHVCYWNrZW5kLndyaXRlKFxuICAgICAgICB1dGlsLnRvVHlwZWRBcnJheShvdXRwdXRWYWxzLCB4LmR0eXBlKSwgb3V0U2hhcGUsIHguZHR5cGUpO1xuXG4gICAgcmV0dXJuIHtkYXRhSWQsIHNoYXBlOiBvdXRTaGFwZSwgZHR5cGU6IHguZHR5cGV9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Dilation2DBackpropFilter, util } from '@tensorflow/tfjs-core';\nexport const dilation2DBackpropFilterConfig = {\n    kernelName: Dilation2DBackpropFilter,\n    backendName: 'cpu',\n    kernelFunc: ({ inputs, backend, attrs }) => {\n        const { x, filter, dy } = inputs;\n        const { strides, pad, dilations } = attrs;\n        const cpuBackend = backend;\n        const $x = util.toNestedArray(x.shape, cpuBackend.data.get(x.dataId).values);\n        const $filter = util.toNestedArray(filter.shape, cpuBackend.data.get(filter.dataId).values);\n        const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = backend_util.computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations);\n        util.assert(dy.rank === outShape.length, () => `Error in ${Dilation2DBackpropFilter}, dy ` +\n            `must have the same rank as output ${outShape.length}, but got ` +\n            `${dy.rank}`);\n        const $dy = util.toNestedArray(outShape, cpuBackend.data.get(dy.dataId).values);\n        // The computed filter gradients has the same dimensions as the filter:\n        // [filterHeight, filterWidth, depth]\n        const gradients = util.makeZerosNestedTypedArray(filter.shape, filter.dtype);\n        // In the case of multiple argmax branches, we only back-propagate along the\n        // last branch, i.e., the one with largest value of `h * filter_cols + w`,\n        // similarly to the max-pooling backward routines.\n        // This implementation follows the TF c++ implementation:\n        // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n        for (let b = 0; b < batchSize; ++b) {\n            for (let hOut = 0; hOut < outHeight; ++hOut) {\n                const hBeg = hOut * strideHeight - padInfo.top;\n                for (let wOut = 0; wOut < outWidth; ++wOut) {\n                    const wBeg = wOut * strideWidth - padInfo.left;\n                    for (let d = 0; d < inChannels; ++d) {\n                        let curVal = Number.MIN_SAFE_INTEGER;\n                        let hMax = 0;\n                        let wMax = 0;\n                        for (let h = 0; h < filterHeight; ++h) {\n                            const hIn = hBeg + h * dilationHeight;\n                            if (hIn >= 0 && hIn < inHeight) {\n                                for (let w = 0; w < filterWidth; ++w) {\n                                    const wIn = wBeg + w * dilationWidth;\n                                    if (wIn >= 0 && wIn < inWidth) {\n                                        const val = $x[b][hIn][wIn][d] + $filter[h][w][d];\n                                        if (val > curVal) {\n                                            curVal = val;\n                                            hMax = h;\n                                            wMax = w;\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        gradients[hMax][wMax][d] += $dy[b][hOut][wOut][d];\n                    }\n                }\n            }\n        }\n        const dataId = cpuBackend.write(util.toTypedArray(gradients, x.dtype), filter.shape, filter.dtype);\n        return { dataId, shape: filter.shape, dtype: filter.dtype };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9EaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBbUIsd0JBQXdCLEVBQWtDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBS3BJLE1BQU0sQ0FBQyxNQUFNLDhCQUE4QixHQUFpQjtJQUMxRCxVQUFVLEVBQUUsd0JBQXdCO0lBQ3BDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBQyxHQUNqQixNQUF1RCxDQUFDO1FBQzVELE1BQU0sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBQyxHQUFHLEtBQThCLENBQUM7UUFDakUsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztRQUU3QyxNQUFNLEVBQUUsR0FDSixJQUFJLENBQUMsYUFBYSxDQUNkLENBQUMsQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQ2pELENBQUM7UUFFbkIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FDZCxNQUFNLENBQUMsS0FBSyxFQUNaLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUNyQixDQUFpQixDQUFDO1FBRXBELE1BQU0sRUFDSixTQUFTLEVBQ1QsUUFBUSxFQUNSLE9BQU8sRUFDUCxVQUFVLEVBQ1YsU0FBUyxFQUNU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Q1QsSUFBSSxHQUFHLENBQUMsQ0FBQzt5Q0FDVjtxQ0FDRjtpQ0FDRjs2QkFDRjt5QkFDRjt3QkFDRCxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3FCQUNuRDtpQkFDRjthQUNGO1NBQ0Y7UUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUMzQixJQUFJLENBQUMsWUFBWSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFdkUsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBQyxDQUFDO0lBQzVELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGlsYXRpb24yREF0dHJzLCBEaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXIsIFRlbnNvcjNELCBUZW5zb3I0RCwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBjb25zdCBkaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGlsYXRpb24yREJhY2twcm9wRmlsdGVyLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30pID0+IHtcbiAgICBjb25zdCB7eCwgZmlsdGVyLCBkeX0gPVxuICAgICAgICBpbnB1dHMgYXMge3g6IFRlbnNvcjRELCBmaWx0ZXI6IFRlbnNvcjNELCBkeTogVGVuc29yNER9O1xuICAgIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9uc30gPSBhdHRycyBhcyB7fSBhcyBEaWxhdGlvbjJEQXR0cnM7XG4gICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRDUFU7XG5cbiAgICBjb25zdCAkeCA9XG4gICAgICAgIHV0aWwudG9OZXN0ZWRBcnJheShcbiAgICAgICAgICAgIHguc2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KSBhc1xuICAgICAgICBudW1iZXJbXVtdW11bXTtcblxuICAgIGNvbnN0ICRmaWx0ZXIgPSB1dGlsLnRvTmVzdGVkQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIuc2hhcGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcHVCYWNrZW5kLmRhdGEuZ2V0KGZpbHRlci5kYXRhSWQpLnZhbHVlcyBhc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVkQXJyYXkpIGFzIG51bWJlcltdW11bXTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGJhdGNoU2l6ZSxcbiAgICAgIGluSGVpZ2h0LFxuICAgICAgaW5XaWR0aCxcbiAgICAgIGluQ2hhbm5lbHMsXG4gICAgICBvdXRIZWlnaHQsXG4gICAgICBvdXRXaWR0aCxcbiAgICAgIHBhZEluZm8sXG4gICAgICBzdHJpZGVIZWlnaHQsXG4gICAgICBzdHJpZGVXaWR0aCxcbiAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICBkaWxhdGlvbldpZHRoLFxuICAgICAgb3V0U2hhcGVcbiAgICB9ID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVEaWxhdGlvbjJESW5mbyhcbiAgICAgICAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICAgICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBzdHJpZGVzLCBwYWQsXG4gICAgICAgICAgICAnTkhXQycgLyogZGF0YUZvcm1hdCAqLywgZGlsYXRpb25zKTtcblxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBkeS5yYW5rID09PSBvdXRTaGFwZS5sZW5ndGgsXG4gICAgICAgICgpID0+IGBFcnJvciBpbiAke0RpbGF0aW9uMkRCYWNrcHJvcEZpbHRlcn0sIGR5IGAgK1xuICAgICAgICAgICAgYG11c3QgaGF2ZSB0aGUgc2FtZSByYW5rIGFzIG91dHB1dCAke291dFNoYXBlLmxlbmd0aH0sIGJ1dCBnb3QgYCArXG4gICAgICAgICAgICBgJHtkeS5yYW5rfWApO1xuXG4gICAgY29uc3QgJGR5ID1cbiAgICAgICAgdXRpbC50b05lc3RlZEFycmF5KFxuICAgICAgICAgICAgb3V0U2hhcGUsIGNwdUJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheSkgYXNcbiAgICAgICAgbnVtYmVyW11bXVtdW107XG5cbiAgICAvLyBUaGUgY29tcHV0ZWQgZmlsdGVyIGdyYWRpZW50cyBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgZmlsdGVyOlxuICAgIC8vIFtmaWx0ZXJIZWlnaHQsIGZpbHRlcldpZHRoLCBkZXB0aF1cbiAgICBjb25zdCBncmFkaWVudHMgPSB1dGlsLm1ha2VaZXJvc05lc3RlZFR5cGVkQXJyYXkoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zaGFwZSwgZmlsdGVyLmR0eXBlKSBhcyBudW1iZXJbXVtdW107XG5cbiAgICAvLyBJbiB0aGUgY2FzZSBvZiBtdWx0aXBsZSBhcmdtYXggYnJhbmNoZXMsIHdlIG9ubHkgYmFjay1wcm9wYWdhdGUgYWxvbmcgdGhlXG4gICAgLy8gbGFzdCBicmFuY2gsIGkuZS4sIHRoZSBvbmUgd2l0aCBsYXJnZXN0IHZhbHVlIG9mIGBoICogZmlsdGVyX2NvbHMgKyB3YCxcbiAgICAvLyBzaW1pbGFybHkgdG8gdGhlIG1heC1wb29saW5nIGJhY2t3YXJkIHJvdXRpbmVzLlxuICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gZm9sbG93cyB0aGUgVEYgYysrIGltcGxlbWVudGF0aW9uOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9kOWEzYTg0OWVkYzE5OGU5MDE3MmJjNThlYjI5M2RlNDU3ZjlkOTg2L3RlbnNvcmZsb3cvY29yZS9rZXJuZWxzL2RpbGF0aW9uX29wcy5jY1xuICAgIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICAgIGZvciAobGV0IGhPdXQgPSAwOyBoT3V0IDwgb3V0SGVpZ2h0OyArK2hPdXQpIHtcbiAgICAgICAgY29uc3QgaEJlZyA9IGhPdXQgKiBzdHJpZGVIZWlnaHQgLSBwYWRJbmZvLnRvcDtcbiAgICAgICAgZm9yIChsZXQgd091dCA9IDA7IHdPdXQgPCBvdXRXaWR0aDsgKyt3T3V0KSB7XG4gICAgICAgICAgY29uc3Qgd0JlZyA9IHdPdXQgKiBzdHJpZGVXaWR0aCAtIHBhZEluZm8ubGVmdDtcbiAgICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGluQ2hhbm5lbHM7ICsrZCkge1xuICAgICAgICAgICAgbGV0IGN1clZhbCA9IE51bWJlci5NSU5fU0FGRV9JTlRFR0VSO1xuICAgICAgICAgICAgbGV0IGhNYXggPSAwO1xuICAgICAgICAgICAgbGV0IHdNYXggPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICBjb25zdCBoSW4gPSBoQmVnICsgaCAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICBpZiAoaEluID49IDAgJiYgaEluIDwgaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IGZpbHRlcldpZHRoOyArK3cpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdJbiA9IHdCZWcgKyB3ICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgIGlmICh3SW4gPj0gMCAmJiB3SW4gPCBpbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9ICR4W2JdW2hJbl1bd0luXVtkXSArICRmaWx0ZXJbaF1bd11bZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiBjdXJWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgaE1heCA9IGg7XG4gICAgICAgICAgICAgICAgICAgICAgd01heCA9IHc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGdyYWRpZW50c1toTWF4XVt3TWF4XVtkXSArPSAkZHlbYl1baE91dF1bd091dF1bZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShcbiAgICAgICAgdXRpbC50b1R5cGVkQXJyYXkoZ3JhZGllbnRzLCB4LmR0eXBlKSwgZmlsdGVyLnNoYXBlLCBmaWx0ZXIuZHR5cGUpO1xuXG4gICAgcmV0dXJuIHtkYXRhSWQsIHNoYXBlOiBmaWx0ZXIuc2hhcGUsIGR0eXBlOiBmaWx0ZXIuZHR5cGV9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Dilation2DBackpropInput, util } from '@tensorflow/tfjs-core';\nexport const dilation2DBackpropInputConfig = {\n    kernelName: Dilation2DBackpropInput,\n    backendName: 'cpu',\n    kernelFunc: ({ inputs, backend, attrs }) => {\n        const { x, filter, dy } = inputs;\n        const { strides, pad, dilations } = attrs;\n        const cpuBackend = backend;\n        const $x = util.toNestedArray(x.shape, cpuBackend.data.get(x.dataId).values);\n        const $filter = util.toNestedArray(filter.shape, cpuBackend.data.get(filter.dataId).values);\n        const { batchSize, inHeight, inWidth, inChannels, outHeight, outWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth, outShape } = backend_util.computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations);\n        util.assert(dy.rank === outShape.length, () => `Error in ${Dilation2DBackpropInput}, dy ` +\n            `must have the same rank as output ${outShape.length}, but got ` +\n            `${dy.rank}`);\n        const $dy = util.toNestedArray(outShape, cpuBackend.data.get(dy.dataId).values);\n        // The computed gradients has the same dimensions as the input:\n        // [batch, inputHeight, inputCols, inChannel]\n        const gradients = util.makeZerosNestedTypedArray(x.shape, x.dtype);\n        // In the case of multiple argmax branches, we only back-propagate along the\n        // last branch, i.e., the one with largest value of `h * filter_cols + w`,\n        // similarly to the max-pooling backward routines.\n        // This implementation follows the TF c++ implementation:\n        // https://github.com/tensorflow/tensorflow/blob/d9a3a849edc198e90172bc58eb293de457f9d986/tensorflow/core/kernels/dilation_ops.cc\n        for (let b = 0; b < batchSize; ++b) {\n            for (let hOut = 0; hOut < outHeight; ++hOut) {\n                const hBeg = hOut * strideHeight - padInfo.top;\n                for (let wOut = 0; wOut < outWidth; ++wOut) {\n                    const wBeg = wOut * strideWidth - padInfo.left;\n                    for (let d = 0; d < inChannels; ++d) {\n                        let curVal = Number.MIN_SAFE_INTEGER;\n                        let hInMax = (hBeg < 0) ? 0 : hBeg;\n                        let wInMax = (wBeg < 0) ? 0 : wBeg;\n                        for (let h = 0; h < filterHeight; ++h) {\n                            const hIn = hBeg + h * dilationHeight;\n                            if (hIn >= 0 && hIn < inHeight) {\n                                for (let w = 0; w < filterWidth; ++w) {\n                                    const wIn = wBeg + w * dilationWidth;\n                                    if (wIn >= 0 && wIn < inWidth) {\n                                        const val = $x[b][hIn][wIn][d] + $filter[h][w][d];\n                                        if (val > curVal) {\n                                            curVal = val;\n                                            hInMax = hIn;\n                                            wInMax = wIn;\n                                        }\n                                    }\n                                }\n                            }\n                        }\n                        gradients[b][hInMax][wInMax][d] += $dy[b][hOut][wOut][d];\n                    }\n                }\n            }\n        }\n        const dataId = cpuBackend.write(util.toTypedArray(gradients, x.dtype), x.shape, x.dtype);\n        return { dataId, shape: x.shape, dtype: x.dtype };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yREJhY2twcm9wSW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0RpbGF0aW9uMkRCYWNrcHJvcElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQW1CLHVCQUF1QixFQUFrQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUtuSSxNQUFNLENBQUMsTUFBTSw2QkFBNkIsR0FBaUI7SUFDekQsVUFBVSxFQUFFLHVCQUF1QjtJQUNuQyxXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsR0FDakIsTUFBdUQsQ0FBQztRQUM1RCxNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUE4QixDQUFDO1FBQ2pFLE1BQU0sVUFBVSxHQUFHLE9BQXlCLENBQUM7UUFFN0MsTUFBTSxFQUFFLEdBQ0osSUFBSSxDQUFDLGFBQWEsQ0FDZCxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUNqRCxDQUFDO1FBRW5CLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQ2QsTUFBTSxDQUFDLEtBQUssRUFDWixVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFDckIsQ0FBaUIsQ0FBQztRQUVwRCxNQUFNLEVBQ0osU0FBUyxFQUNULFFBQVEsRUFDUixPQUFPLEVBQ1AsVUFBVSxFQUNWLFNBQVMsRUFDVCxR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LENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO3dDQUNsRCxJQUFJLEdBQUcsR0FBRyxNQUFNLEVBQUU7NENBQ2hCLE1BQU0sR0FBRyxHQUFHLENBQUM7NENBQ2IsTUFBTSxHQUFHLEdBQUcsQ0FBQzs0Q0FDYixNQUFNLEdBQUcsR0FBRyxDQUFDO3lDQUNkO3FDQUNGO2lDQUNGOzZCQUNGO3lCQUNGO3dCQUNELFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7cUJBQzFEO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQzNCLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUU3RCxPQUFPLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFDLENBQUM7SUFDbEQsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEaWxhdGlvbjJEQXR0cnMsIERpbGF0aW9uMkRCYWNrcHJvcElucHV0LCBUZW5zb3IzRCwgVGVuc29yNEQsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0tlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgY29uc3QgZGlsYXRpb24yREJhY2twcm9wSW5wdXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGlsYXRpb24yREJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogKHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSkgPT4ge1xuICAgIGNvbnN0IHt4LCBmaWx0ZXIsIGR5fSA9XG4gICAgICAgIGlucHV0cyBhcyB7eDogVGVuc29yNEQsIGZpbHRlcjogVGVuc29yM0QsIGR5OiBUZW5zb3I0RH07XG4gICAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGlsYXRpb25zfSA9IGF0dHJzIGFzIHt9IGFzIERpbGF0aW9uMkRBdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcblxuICAgIGNvbnN0ICR4ID1cbiAgICAgICAgdXRpbC50b05lc3RlZEFycmF5KFxuICAgICAgICAgICAgeC5zaGFwZSwgY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXkpIGFzXG4gICAgICAgIG51bWJlcltdW11bXVtdO1xuXG4gICAgY29uc3QgJGZpbHRlciA9IHV0aWwudG9OZXN0ZWRBcnJheShcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlci5zaGFwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoZmlsdGVyLmRhdGFJZCkudmFsdWVzIGFzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZWRBcnJheSkgYXMgbnVtYmVyW11bXVtdO1xuXG4gICAgY29uc3Qge1xuICAgICAgYmF0Y2hTaXplLFxuICAgICAgaW5IZWlnaHQsXG4gICAgICBpbldpZHRoLFxuICAgICAgaW5DaGFubmVscyxcbiAgICAgIG91dEhlaWdodCxcbiAgICAgIG91dFdpZHRoLFxuICAgICAgcGFkSW5mbyxcbiAgICAgIHN0cmlkZUhlaWdodCxcbiAgICAgIHN0cmlkZVdpZHRoLFxuICAgICAgZmlsdGVySGVpZ2h0LFxuICAgICAgZmlsdGVyV2lkdGgsXG4gICAgICBkaWxhdGlvbkhlaWdodCxcbiAgICAgIGRpbGF0aW9uV2lkdGgsXG4gICAgICBvdXRTaGFwZVxuICAgIH0gPVxuICAgICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZURpbGF0aW9uMkRJbmZvKFxuICAgICAgICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIHBhZCxcbiAgICAgICAgICAgICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGR5LnJhbmsgPT09IG91dFNoYXBlLmxlbmd0aCxcbiAgICAgICAgKCkgPT4gYEVycm9yIGluICR7RGlsYXRpb24yREJhY2twcm9wSW5wdXR9LCBkeSBgICtcbiAgICAgICAgICAgIGBtdXN0IGhhdmUgdGhlIHNhbWUgcmFuayBhcyBvdXRwdXQgJHtvdXRTaGFwZS5sZW5ndGh9LCBidXQgZ290IGAgK1xuICAgICAgICAgICAgYCR7ZHkucmFua31gKTtcblxuICAgIGNvbnN0ICRkeSA9XG4gICAgICAgIHV0aWwudG9OZXN0ZWRBcnJheShcbiAgICAgICAgICAgIG91dFNoYXBlLCBjcHVCYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXkpIGFzXG4gICAgICAgIG51bWJlcltdW11bXVtdO1xuXG4gICAgLy8gVGhlIGNvbXB1dGVkIGdyYWRpZW50cyBoYXMgdGhlIHNhbWUgZGltZW5zaW9ucyBhcyB0aGUgaW5wdXQ6XG4gICAgLy8gW2JhdGNoLCBpbnB1dEhlaWdodCwgaW5wdXRDb2xzLCBpbkNoYW5uZWxdXG4gICAgY29uc3QgZ3JhZGllbnRzID1cbiAgICAgICAgdXRpbC5tYWtlWmVyb3NOZXN0ZWRUeXBlZEFycmF5KHguc2hhcGUsIHguZHR5cGUpIGFzIG51bWJlcltdW11bXVtdO1xuXG4gICAgLy8gSW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUgYXJnbWF4IGJyYW5jaGVzLCB3ZSBvbmx5IGJhY2stcHJvcGFnYXRlIGFsb25nIHRoZVxuICAgIC8vIGxhc3QgYnJhbmNoLCBpLmUuLCB0aGUgb25lIHdpdGggbGFyZ2VzdCB2YWx1ZSBvZiBgaCAqIGZpbHRlcl9jb2xzICsgd2AsXG4gICAgLy8gc2ltaWxhcmx5IHRvIHRoZSBtYXgtcG9vbGluZyBiYWNrd2FyZCByb3V0aW5lcy5cbiAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGZvbGxvd3MgdGhlIFRGIGMrKyBpbXBsZW1lbnRhdGlvbjpcbiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3JmbG93L2Jsb2IvZDlhM2E4NDllZGMxOThlOTAxNzJiYzU4ZWIyOTNkZTQ1N2Y5ZDk4Ni90ZW5zb3JmbG93L2NvcmUva2VybmVscy9kaWxhdGlvbl9vcHMuY2NcbiAgICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoU2l6ZTsgKytiKSB7XG4gICAgICBmb3IgKGxldCBoT3V0ID0gMDsgaE91dCA8IG91dEhlaWdodDsgKytoT3V0KSB7XG4gICAgICAgIGNvbnN0IGhCZWcgPSBoT3V0ICogc3RyaWRlSGVpZ2h0IC0gcGFkSW5mby50b3A7XG4gICAgICAgIGZvciAobGV0IHdPdXQgPSAwOyB3T3V0IDwgb3V0V2lkdGg7ICsrd091dCkge1xuICAgICAgICAgIGNvbnN0IHdCZWcgPSB3T3V0ICogc3RyaWRlV2lkdGggLSBwYWRJbmZvLmxlZnQ7XG4gICAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBpbkNoYW5uZWxzOyArK2QpIHtcbiAgICAgICAgICAgIGxldCBjdXJWYWwgPSBOdW1iZXIuTUlOX1NBRkVfSU5URUdFUjtcbiAgICAgICAgICAgIGxldCBoSW5NYXggPSAoaEJlZyA8IDApID8gMCA6IGhCZWc7XG4gICAgICAgICAgICBsZXQgd0luTWF4ID0gKHdCZWcgPCAwKSA/IDAgOiB3QmVnO1xuICAgICAgICAgICAgZm9yIChsZXQgaCA9IDA7IGggPCBmaWx0ZXJIZWlnaHQ7ICsraCkge1xuICAgICAgICAgICAgICBjb25zdCBoSW4gPSBoQmVnICsgaCAqIGRpbGF0aW9uSGVpZ2h0O1xuICAgICAgICAgICAgICBpZiAoaEluID49IDAgJiYgaEluIDwgaW5IZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3ID0gMDsgdyA8IGZpbHRlcldpZHRoOyArK3cpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHdJbiA9IHdCZWcgKyB3ICogZGlsYXRpb25XaWR0aDtcbiAgICAgICAgICAgICAgICAgIGlmICh3SW4gPj0gMCAmJiB3SW4gPCBpbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9ICR4W2JdW2hJbl1bd0luXVtkXSArICRmaWx0ZXJbaF1bd11bZF07XG4gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPiBjdXJWYWwpIHtcbiAgICAgICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgICAgICAgaEluTWF4ID0gaEluO1xuICAgICAgICAgICAgICAgICAgICAgIHdJbk1heCA9IHdJbjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZ3JhZGllbnRzW2JdW2hJbk1heF1bd0luTWF4XVtkXSArPSAkZHlbYl1baE91dF1bd091dF1bZF07XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShcbiAgICAgICAgdXRpbC50b1R5cGVkQXJyYXkoZ3JhZGllbnRzLCB4LmR0eXBlKSwgeC5zaGFwZSwgeC5kdHlwZSk7XG5cbiAgICByZXR1cm4ge2RhdGFJZCwgc2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Sum, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { zeros } from '../utils/zeros_impl';\nimport { cast } from './Cast';\nimport { identity } from './Identity';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function sum(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    assertNotComplex(x, 'sum');\n    let $x;\n    if (x.dtype === 'bool') {\n        $x = cast({ inputs: { x }, backend, attrs: { dtype: 'int32' } });\n    }\n    else {\n        $x = identity({ inputs: { x }, backend });\n    }\n    const xRank = $x.shape.length;\n    const axes = util.parseAxisParam(axis, $x.shape);\n    const permutation = backend_util.getAxesPermutation(axes, xRank);\n    let reductionAxes = axes;\n    let permutedX = $x;\n    if (permutation != null) {\n        permutedX =\n            transpose({ inputs: { x: $x }, backend, attrs: { perm: permutation } });\n        reductionAxes = backend_util.getInnerMostAxes(reductionAxes.length, xRank);\n    }\n    backend_util.assertAxesAreInnerMostDims('sum', reductionAxes, permutedX.shape.length);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, reductionAxes);\n    const resultDtype = backend_util.upcastType(permutedX.dtype, 'int32');\n    let result = zeros(backend, outShape, resultDtype);\n    const reduceSize = util.sizeFromShape(reduceShape);\n    const vals = backend.data.get(result.dataId).values;\n    const aVals = backend.data.get(permutedX.dataId).values;\n    for (let i = 0; i < vals.length; ++i) {\n        const offset = i * reduceSize;\n        let sum = 0;\n        for (let j = 0; j < reduceSize; ++j) {\n            sum += aVals[offset + j];\n        }\n        vals[i] = sum;\n    }\n    if (keepDims) {\n        const newShape = backend_util.expandShapeToKeepDim(result.shape, axes);\n        const oldResult = result;\n        result = reshape({ inputs: { x: result }, backend, attrs: { shape: newShape } });\n        backend.disposeIntermediateTensorInfo(oldResult);\n    }\n    backend.disposeIntermediateTensorInfo($x);\n    if (permutation != null) {\n        backend.disposeIntermediateTensorInfo(permutedX);\n    }\n    return result;\n}\nexport const sumConfig = {\n    kernelName: Sum,\n    backendName: 'cpu',\n    kernelFunc: sum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsR0FBRyxFQUErQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFtRTtJQUVyRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFM0IsSUFBSSxFQUFFLENBQUM7SUFDUCxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssTUFBTSxFQUFFO1FBQ3RCLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFDLENBQUMsQ0FBQztLQUM1RDtTQUFNO1FBQ0ws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QyxDQUFDO0lBRTFDLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixPQUFPLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUM7S0FDbEQ7SUFFRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdW0sIFN1bUF0dHJzLCBTdW1JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHt6ZXJvc30gZnJvbSAnLi4vdXRpbHMvemVyb3NfaW1wbCc7XG5pbXBvcnQge2Nhc3R9IGZyb20gJy4vQ2FzdCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW0oXG4gICAgYXJnczoge2lucHV0czogU3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFN1bUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGtlZXBEaW1zfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ3N1bScpO1xuXG4gIGxldCAkeDtcbiAgaWYgKHguZHR5cGUgPT09ICdib29sJykge1xuICAgICR4ID0gY2FzdCh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7ZHR5cGU6ICdpbnQzMid9fSk7XG4gIH0gZWxzZSB7XG4gICAgJHggPSBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgfVxuXG4gIGNvbnN0IHhSYW5rID0gJHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCAkeC5zaGFwZSk7XG4gIGNvbnN0IHBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG5cbiAgbGV0IHJlZHVjdGlvbkF4ZXMgPSBheGVzO1xuICBsZXQgcGVybXV0ZWRYID0gJHg7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID1cbiAgICAgICAgdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiAkeH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0YXRpb259fSk7XG4gICAgcmVkdWN0aW9uQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKHJlZHVjdGlvbkF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXG4gICAgICAnc3VtJywgcmVkdWN0aW9uQXhlcywgcGVybXV0ZWRYLnNoYXBlLmxlbmd0aCk7XG5cbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMocGVybXV0ZWRYLnNoYXBlLCByZWR1Y3Rpb25BeGVzKTtcbiAgY29uc3QgcmVzdWx0RHR5cGUgPSBiYWNrZW5kX3V0aWwudXBjYXN0VHlwZShwZXJtdXRlZFguZHR5cGUsICdpbnQzMicpO1xuICBsZXQgcmVzdWx0ID0gemVyb3MoYmFja2VuZCwgb3V0U2hhcGUsIHJlc3VsdER0eXBlKTtcbiAgY29uc3QgcmVkdWNlU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gIGNvbnN0IHZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHJlc3VsdC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IGFWYWxzID0gYmFja2VuZC5kYXRhLmdldChwZXJtdXRlZFguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIHN1bSArPSBhVmFsc1tvZmZzZXQgKyBqXTtcbiAgICB9XG4gICAgdmFsc1tpXSA9IHN1bTtcbiAgfVxuXG4gIGlmIChrZWVwRGltcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKHJlc3VsdC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgIHJlc3VsdCA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlc3VsdH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2xkUmVzdWx0KTtcbiAgfVxuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJHgpO1xuXG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdW0sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3VtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Einsum, util } from '@tensorflow/tfjs-core';\nimport { multiply } from './Multiply';\nimport { reshape } from './Reshape';\nimport { sum } from './Sum';\nimport { transpose } from './Transpose';\nexport function einsum(args) {\n    const { inputs, backend, attrs } = args;\n    const { equation } = attrs;\n    const tensors = inputs;\n    const { allDims, summedDims, idDims } = backend_util.decodeEinsumEquation(equation, tensors.length);\n    backend_util.checkEinsumDimSizes(allDims.length, idDims, tensors);\n    const { path, steps } = backend_util.getEinsumComputePath(summedDims, idDims);\n    const nSteps = steps.length;\n    let out = null;\n    let numDimsRemaining = allDims.length;\n    const tensorsToDispose = [];\n    for (let i = 0; i < nSteps; ++i) {\n        for (const idTerm of steps[i]) {\n            const { permutationIndices: perm, expandDims: dimsToExpand } = backend_util.getEinsumPermutation(numDimsRemaining, idDims[idTerm]);\n            let x;\n            if (backend_util.isIdentityPermutation(perm)) {\n                x = tensors[idTerm];\n            }\n            else {\n                x = transpose({ inputs: { x: tensors[idTerm] }, backend, attrs: { perm } });\n                tensorsToDispose.push(x);\n            }\n            const targetShape = x.shape.slice();\n            for (let k = 0; k < dimsToExpand.length; ++k) {\n                targetShape.splice(dimsToExpand[k], 0, 1);\n            }\n            if (!util.arraysEqual(x.shape, targetShape)) {\n                x = reshape({ inputs: { x }, backend, attrs: { shape: targetShape } });\n                tensorsToDispose.push(x);\n            }\n            if (out === null) {\n                out = x;\n            }\n            else {\n                // tslint:disable-next-line: no-unnecessary-type-assertion\n                out = multiply({ inputs: { a: x, b: out }, backend });\n                tensorsToDispose.push(out);\n            }\n        }\n        if (i < nSteps - 1) {\n            if (path[i] >= 0) {\n                out = sum({\n                    inputs: { x: out },\n                    backend,\n                    attrs: {\n                        axis: path[i] - (allDims.length - numDimsRemaining),\n                        keepDims: false\n                    }\n                });\n                tensorsToDispose.push(out);\n            }\n            numDimsRemaining--;\n        }\n    }\n    // Clean up intermediate tensors.\n    for (const tensorInfo of tensorsToDispose) {\n        if (tensorInfo === out) {\n            continue;\n        }\n        backend.disposeIntermediateTensorInfo(tensorInfo);\n    }\n    return out;\n}\nexport const einsumConfig = {\n    kernelName: Einsum,\n    backendName: 'cpu',\n    kernelFunc: einsum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWluc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9FaW5zdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxNQUFNLEVBQTJFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSTFJLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsSUFBeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDekIsTUFBTSxPQUFPLEdBQUcsTUFBa0IsQ0FBQztJQUVuQyxNQUFNLEVBQUMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUMsR0FDL0IsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDaEUsWUFBWSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFDLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUU1RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzVCLElBQUksR0FBRyxHQUFvQixJQUFJLENB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LEtBQUssR0FBRyxFQUFFO1lBQ3RCLFNBQVM7U0FDVjtRQUNELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztLQUNuRDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBFaW5zdW0sIEVpbnN1bUF0dHJzLCBFaW5zdW1JbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29yLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmltcG9ydCB7bXVsdGlwbHl9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vU3VtJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlaW5zdW0oXG4gICAgYXJnczoge2lucHV0czogRWluc3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IEVpbnN1bUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtlcXVhdGlvbn0gPSBhdHRycztcbiAgY29uc3QgdGVuc29ycyA9IGlucHV0cyBhcyBUZW5zb3JbXTtcblxuICBjb25zdCB7YWxsRGltcywgc3VtbWVkRGltcywgaWREaW1zfSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZGVjb2RlRWluc3VtRXF1YXRpb24oZXF1YXRpb24sIHRlbnNvcnMubGVuZ3RoKTtcbiAgYmFja2VuZF91dGlsLmNoZWNrRWluc3VtRGltU2l6ZXMoYWxsRGltcy5sZW5ndGgsIGlkRGltcywgdGVuc29ycyk7XG4gIGNvbnN0IHtwYXRoLCBzdGVwc30gPSBiYWNrZW5kX3V0aWwuZ2V0RWluc3VtQ29tcHV0ZVBhdGgoc3VtbWVkRGltcywgaWREaW1zKTtcblxuICBjb25zdCBuU3RlcHMgPSBzdGVwcy5sZW5ndGg7XG4gIGxldCBvdXQ6IFRlbnNvckluZm98bnVsbCA9IG51bGw7XG4gIGxldCBudW1EaW1zUmVtYWluaW5nID0gYWxsRGltcy5sZW5ndGg7XG4gIGNvbnN0IHRlbnNvcnNUb0Rpc3Bvc2U6IFRlbnNvckluZm9bXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5TdGVwczsgKytpKSB7XG4gICAgZm9yIChjb25zdCBpZFRlcm0gb2Ygc3RlcHNbaV0pIHtcbiAgICAgIGNvbnN0IHtwZXJtdXRhdGlvbkluZGljZXM6IHBlcm0sIGV4cGFuZERpbXM6IGRpbXNUb0V4cGFuZH0gPVxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1QZXJtdXRhdGlvbihudW1EaW1zUmVtYWluaW5nLCBpZERpbXNbaWRUZXJtXSk7XG4gICAgICBsZXQgeDogVGVuc29ySW5mbztcbiAgICAgIGlmIChiYWNrZW5kX3V0aWwuaXNJZGVudGl0eVBlcm11dGF0aW9uKHBlcm0pKSB7XG4gICAgICAgIHggPSB0ZW5zb3JzW2lkVGVybV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB4ID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiB0ZW5zb3JzW2lkVGVybV19LCBiYWNrZW5kLCBhdHRyczoge3Blcm19fSk7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh4KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldFNoYXBlOiBudW1iZXJbXSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgZGltc1RvRXhwYW5kLmxlbmd0aDsgKytrKSB7XG4gICAgICAgIHRhcmdldFNoYXBlLnNwbGljZShkaW1zVG9FeHBhbmRba10sIDAsIDEpO1xuICAgICAgfVxuXG4gICAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwoeC5zaGFwZSwgdGFyZ2V0U2hhcGUpKSB7XG4gICAgICAgIHggPSByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogdGFyZ2V0U2hhcGV9fSk7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaCh4KTtcbiAgICAgIH1cbiAgICAgIGlmIChvdXQgPT09IG51bGwpIHtcbiAgICAgICAgb3V0ID0geDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb25cbiAgICAgICAgb3V0ID0gbXVsdGlwbHkoe2lucHV0czoge2E6IHgsIGI6IG91dH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2gob3V0KTtcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGkgPCBuU3RlcHMgLSAxKSB7XG4gICAgICBpZiAocGF0aFtpXSA+PSAwKSB7XG4gICAgICAgIG91dCA9IHN1bSh7XG4gICAgICAgICAgaW5wdXRzOiB7eDogb3V0fSxcbiAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgIGF0dHJzOiB7XG4gICAgICAgICAgICBheGlzOiBwYXRoW2ldIC0gKGFsbERpbXMubGVuZ3RoIC0gbnVtRGltc1JlbWFpbmluZyksXG4gICAgICAgICAgICBrZWVwRGltczogZmFsc2VcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0ZW5zb3JzVG9EaXNwb3NlLnB1c2gob3V0KTtcbiAgICAgIH1cbiAgICAgIG51bURpbXNSZW1haW5pbmctLTtcbiAgICB9XG4gIH1cblxuICAvLyBDbGVhbiB1cCBpbnRlcm1lZGlhdGUgdGVuc29ycy5cbiAgZm9yIChjb25zdCB0ZW5zb3JJbmZvIG9mIHRlbnNvcnNUb0Rpc3Bvc2UpIHtcbiAgICBpZiAodGVuc29ySW5mbyA9PT0gb3V0KSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvKTtcbiAgfVxuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCBlaW5zdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRWluc3VtLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGVpbnN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { EluGrad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function eluGrad(args) {\n    const { inputs, backend } = args;\n    const { dy, y } = inputs;\n    assertNotComplex([dy, y], 'eluGrad');\n    const resultValues = new Float32Array(util.sizeFromShape(y.shape));\n    const values = backend.data.get(y.dataId).values;\n    const dyValues = backend.data.get(dy.dataId).values;\n    for (let i = 0; i < values.length; ++i) {\n        const v = values[i];\n        if (v >= 1) {\n            resultValues[i] = dyValues[i];\n        }\n        else {\n            resultValues[i] = dyValues[i] * (v + 1);\n        }\n    }\n    return backend.makeTensorInfo(y.shape, 'float32', resultValues);\n}\nexport const eluGradConfig = {\n    kernelName: EluGrad,\n    backendName: 'cpu',\n    kernelFunc: eluGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1R3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRWx1R3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsT0FBTyxFQUFtRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUFzRDtJQUU1RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVyQyxNQUFNLFlBQVksR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ25FLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2xFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3RDLE1BQU0sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDVixZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQy9CO2FBQU07WUFDTCxZQUFZLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1NBQ3pDO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDbEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RWx1R3JhZCwgRWx1R3JhZElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGVsdUdyYWQoYXJnczoge2lucHV0czogRWx1R3JhZElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZHksIHl9ID0gaW5wdXRzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5LCB5XSwgJ2VsdUdyYWQnKTtcblxuICBjb25zdCByZXN1bHRWYWx1ZXMgPSBuZXcgRmxvYXQzMkFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZSh5LnNoYXBlKSk7XG4gIGNvbnN0IHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCB2ID0gdmFsdWVzW2ldO1xuICAgIGlmICh2ID49IDEpIHtcbiAgICAgIHJlc3VsdFZhbHVlc1tpXSA9IGR5VmFsdWVzW2ldO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRWYWx1ZXNbaV0gPSBkeVZhbHVlc1tpXSAqICh2ICsgMSk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeS5zaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRWYWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZWx1R3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHVHcmFkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGVsdUdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Erf } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nconst p = backend_util.ERF_P;\nconst a1 = backend_util.ERF_A1;\nconst a2 = backend_util.ERF_A2;\nconst a3 = backend_util.ERF_A3;\nconst a4 = backend_util.ERF_A4;\nconst a5 = backend_util.ERF_A5;\nexport const erf = unaryKernelFunc(Erf, (xi) => {\n    const sign = Math.sign(xi);\n    const v = Math.abs(xi);\n    const t = 1.0 / (1.0 + p * v);\n    return sign *\n        (1.0 -\n            (((((a5 * t + a4) * t) + a3) * t + a2) * t + a1) * t *\n                Math.exp(-v * v));\n});\nexport const erfConfig = {\n    kernelName: Erf,\n    backendName: 'cpu',\n    kernelFunc: erf,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9FcmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUV0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLEdBQUcsWUFBWSxDQUFDLEtBQUssQ0FBQztBQUM3QixNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0FBQy9CLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7QUFDL0IsTUFBTSxFQUFFLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztBQUMvQixNQUFNLEVBQUUsR0FBRyxZQUFZLENBQUMsTUFBTSxDQUFDO0FBQy9CLE1BQU0sRUFBRSxHQUFHLFlBQVksQ0FBQyxNQUFNLENBQUM7QUFFL0IsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FDOUIsR0FBRyxFQUNILENBQUMsRUFBRSxFQUFFLEVBQUU7SUFDTCxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDdkIsTUFBTSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUM5QixPQUFPLElBQUk7UUFDUCxDQUFDLEdBQUc7WUFDSCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7Z0JBQ2hELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM3QixDQUFDLENBQ0osQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEVyZiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5jb25zdCBwID0gYmFja2VuZF91dGlsLkVSRl9QO1xuY29uc3QgYTEgPSBiYWNrZW5kX3V0aWwuRVJGX0ExO1xuY29uc3QgYTIgPSBiYWNrZW5kX3V0aWwuRVJGX0EyO1xuY29uc3QgYTMgPSBiYWNrZW5kX3V0aWwuRVJGX0EzO1xuY29uc3QgYTQgPSBiYWNrZW5kX3V0aWwuRVJGX0E0O1xuY29uc3QgYTUgPSBiYWNrZW5kX3V0aWwuRVJGX0E1O1xuXG5leHBvcnQgY29uc3QgZXJmID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIEVyZixcbiAgICAoeGkpID0+IHtcbiAgICAgIGNvbnN0IHNpZ24gPSBNYXRoLnNpZ24oeGkpO1xuICAgICAgY29uc3QgdiA9IE1hdGguYWJzKHhpKTtcbiAgICAgIGNvbnN0IHQgPSAxLjAgLyAoMS4wICsgcCAqIHYpO1xuICAgICAgcmV0dXJuIHNpZ24gKlxuICAgICAgICAgICgxLjAgLVxuICAgICAgICAgICAoKCgoKGE1ICogdCArIGE0KSAqIHQpICsgYTMpICogdCArIGEyKSAqIHQgKyBhMSkgKiB0ICpcbiAgICAgICAgICAgICAgIE1hdGguZXhwKC12ICogdikpO1xuICAgIH0sXG4pO1xuXG5leHBvcnQgY29uc3QgZXJmQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEVyZixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBlcmYsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ExpandDims, util } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nexport function expandDims(args) {\n    const { inputs, backend, attrs } = args;\n    const { input } = inputs;\n    const { dim } = attrs;\n    const inputRank = input.shape.length;\n    const newShape = input.shape.slice();\n    let $dim = dim;\n    if (dim < 0) {\n        // Negative value is counted from the tail of rank.\n        util.assert(-(inputRank + 1) <= dim, () => `Axis must be in the interval [${-(inputRank + 1)}, ${inputRank}]`);\n        $dim = inputRank + dim + 1;\n    }\n    newShape.splice($dim, 0, 1);\n    return reshape({ inputs: { x: input }, backend, attrs: { shape: newShape } });\n}\nexport const expandDimsConfig = {\n    kernelName: ExpandDims,\n    backendName: 'cpu',\n    kernelFunc: expandDims\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwYW5kRGltcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRXhwYW5kRGltcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsVUFBVSxFQUEyRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxVQUFVLENBQUMsSUFJMUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN2QixNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXBCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3JDLE1BQU0sUUFBUSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFO1FBQ1gsbURBQW1EO1FBQ25ELElBQUksQ0FBQyxNQUFNLENBQ1AsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsSUFBSSxHQUFHLEVBQ3ZCLEdBQUcsRUFBRSxDQUFDLGlDQUFpQyxDQUFFLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxLQUNwRCxTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksR0FBRyxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQztLQUM1QjtJQUNELFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUU1QixPQUFPLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQzVDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxVQUE4QjtDQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0V4cGFuZERpbXMsIEV4cGFuZERpbXNBdHRycywgRXhwYW5kRGltc0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBleHBhbmREaW1zKGFyZ3M6IHtcbiAgaW5wdXRzOiBFeHBhbmREaW1zSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IEV4cGFuZERpbXNBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGltfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICBsZXQgJGRpbSA9IGRpbTtcbiAgaWYgKGRpbSA8IDApIHtcbiAgICAvLyBOZWdhdGl2ZSB2YWx1ZSBpcyBjb3VudGVkIGZyb20gdGhlIHRhaWwgb2YgcmFuay5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgLShpbnB1dFJhbmsgKyAxKSA8PSBkaW0sXG4gICAgICAgICgpID0+IGBBeGlzIG11c3QgYmUgaW4gdGhlIGludGVydmFsIFskey0gKGlucHV0UmFuayArIDEpfSwgJHtcbiAgICAgICAgICAgIGlucHV0UmFua31dYCk7XG4gICAgJGRpbSA9IGlucHV0UmFuayArIGRpbSArIDE7XG4gIH1cbiAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuXG4gIHJldHVybiByZXNoYXBlKHtpbnB1dHM6IHt4OiBpbnB1dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xufVxuXG5leHBvcnQgY29uc3QgZXhwYW5kRGltc0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHBhbmREaW1zLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGV4cGFuZERpbXMgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RealDiv } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const realDivImpl = createSimpleBinaryKernelImpl((a, b) => a / b);\nexport const div = binaryKernelFunc(RealDiv, realDivImpl);\nexport const realDivConfig = {\n    kernelName: RealDiv,\n    backendName: 'cpu',\n    kernelFunc: div\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbERpdi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVhbERpdi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFNUQsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUNwQiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsRSxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBRTFELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFJlYWxEaXZ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgcmVhbERpdkltcGwgPVxuICAgIGNyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGwoKGE6IG51bWJlciwgYjogbnVtYmVyKSA9PiBhIC8gYik7XG5leHBvcnQgY29uc3QgZGl2ID0gYmluYXJ5S2VybmVsRnVuYyhSZWFsRGl2LCByZWFsRGl2SW1wbCk7XG5cbmV4cG9ydCBjb25zdCByZWFsRGl2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlYWxEaXYsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZGl2XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { add } from '../kernels/Add';\nimport { complex } from '../kernels/Complex';\nimport { concat } from '../kernels/Concat';\nimport { identity } from '../kernels/Identity';\nimport { imag } from '../kernels/Imag';\nimport { multiply } from '../kernels/Multiply';\nimport { real } from '../kernels/Real';\nimport { realDivConfig } from '../kernels/RealDiv';\nimport { slice } from '../kernels/Slice';\nimport { sub } from '../kernels/Sub';\n/**\n * Calculate FFT of inner most elements of batch tensor.\n */\nexport function fftBatch(input, inverse, cpuBackend) {\n    const inputShape = input.shape;\n    const batch = inputShape[0];\n    const innerDim = inputShape[1];\n    const inputVals = cpuBackend.data.get(input.dataId);\n    const real2D = inputVals.complexTensorInfos.real;\n    const imag2D = inputVals.complexTensorInfos.imag;\n    // Collects real and imaginary values separately.\n    const resultShape = [batch, innerDim];\n    const resultSize = util.sizeFromShape(resultShape);\n    const resultReal = util.getTypedArrayFromDType('float32', resultSize);\n    const resultImag = util.getTypedArrayFromDType('float32', resultSize);\n    for (let b = 0; b < batch; b++) {\n        // TODO: Support slice ops for complex type.\n        const r = slice({\n            inputs: { x: real2D },\n            backend: cpuBackend,\n            attrs: { begin: [b, 0], size: [1, innerDim] }\n        });\n        const i = slice({\n            inputs: { x: imag2D },\n            backend: cpuBackend,\n            attrs: { begin: [b, 0], size: [1, innerDim] }\n        });\n        const input = complex({ inputs: { real: r, imag: i }, backend: cpuBackend });\n        // Run FFT by batch element.\n        const { real, imag } = fftImpl(input, inverse, cpuBackend);\n        const res = backend_util.mergeRealAndImagArrays(real, imag);\n        for (let d = 0; d < innerDim; d++) {\n            const c = backend_util.getComplexWithIndex(res, d);\n            resultReal[b * innerDim + d] = c.real;\n            resultImag[b * innerDim + d] = c.imag;\n        }\n        cpuBackend.disposeIntermediateTensorInfo(r);\n        cpuBackend.disposeIntermediateTensorInfo(i);\n        cpuBackend.disposeIntermediateTensorInfo(input);\n    }\n    const $realInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', resultReal);\n    const $imagInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', resultImag);\n    const result = complex({ inputs: { real: $realInfo, imag: $imagInfo }, backend: cpuBackend });\n    cpuBackend.disposeIntermediateTensorInfo($realInfo);\n    cpuBackend.disposeIntermediateTensorInfo($imagInfo);\n    return result;\n}\nexport function fftImpl(input, inverse, cpuBackend) {\n    const inputSize = util.sizeFromShape(input.shape);\n    const inputVals = cpuBackend.data.get(input.dataId);\n    const realVals = cpuBackend.data.get(inputVals.complexTensorInfos.real.dataId).values;\n    const imagVals = cpuBackend.data.get(inputVals.complexTensorInfos.imag.dataId).values;\n    if (isExponentOf2(inputSize)) {\n        const result = fftRadix2(realVals, imagVals, inputSize, inverse, cpuBackend);\n        const resultShape = [input.shape[0], input.shape[1]];\n        if (inverse) {\n            const realInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', result.real);\n            const imagInfo = cpuBackend.makeTensorInfo(resultShape, 'float32', result.imag);\n            const sizeInfo = cpuBackend.makeTensorInfo([], 'float32', util.createScalarValue(inputSize, 'float32'));\n            const sizeInfoCopy = identity({ inputs: { x: sizeInfo }, backend: cpuBackend });\n            const divRealInfo = realDivConfig.kernelFunc({ inputs: { a: realInfo, b: sizeInfo }, backend: cpuBackend });\n            const divImagInfo = realDivConfig.kernelFunc({ inputs: { a: imagInfo, b: sizeInfoCopy }, backend: cpuBackend });\n            const divRealVals = cpuBackend.data.get(divRealInfo.dataId).values;\n            const divImagVals = cpuBackend.data.get(divImagInfo.dataId).values;\n            cpuBackend.disposeIntermediateTensorInfo(realInfo);\n            cpuBackend.disposeIntermediateTensorInfo(imagInfo);\n            cpuBackend.disposeIntermediateTensorInfo(sizeInfo);\n            cpuBackend.disposeIntermediateTensorInfo(sizeInfoCopy);\n            cpuBackend.disposeIntermediateTensorInfo(divRealInfo);\n            cpuBackend.disposeIntermediateTensorInfo(divImagInfo);\n            return { real: divRealVals, imag: divImagVals };\n        }\n        return result;\n    }\n    else {\n        const data = backend_util.mergeRealAndImagArrays(realVals, imagVals);\n        const rawOutput = fourierTransformByMatmul(data, inputSize, inverse);\n        return backend_util.splitRealAndImagArrays(rawOutput);\n    }\n}\nfunction isExponentOf2(size) {\n    return (size & size - 1) === 0;\n}\n// FFT using Cooley-Tukey algorithm on radix 2 dimensional input.\nfunction fftRadix2(realVals, imagVals, size, inverse, cpuBackend) {\n    if (size === 1) {\n        return { real: realVals, imag: imagVals };\n    }\n    const data = backend_util.mergeRealAndImagArrays(realVals, imagVals);\n    const half = size / 2;\n    const evenComplex = backend_util.complexWithEvenIndex(data);\n    const evenRealVals = evenComplex.real;\n    const evenImagVals = evenComplex.imag;\n    const evenShape = [evenRealVals.length];\n    const evenRealInfo = cpuBackend.makeTensorInfo(evenShape, 'float32', evenRealVals);\n    const evenImagInfo = cpuBackend.makeTensorInfo(evenShape, 'float32', evenImagVals);\n    const evenTensorInfo = complex({ inputs: { real: evenRealInfo, imag: evenImagInfo }, backend: cpuBackend });\n    const oddComplex = backend_util.complexWithOddIndex(data);\n    const oddRealVals = oddComplex.real;\n    const oddImagVals = oddComplex.imag;\n    const oddShape = [oddRealVals.length];\n    const oddRealInfo = cpuBackend.makeTensorInfo(oddShape, 'float32', oddRealVals);\n    const oddImagInfo = cpuBackend.makeTensorInfo(oddShape, 'float32', oddImagVals);\n    const oddTensorInfo = complex({ inputs: { real: oddRealInfo, imag: oddImagInfo }, backend: cpuBackend });\n    // Recursive call for half part of original input.\n    const $evenComplex = fftRadix2(evenRealVals, evenImagVals, half, inverse, cpuBackend);\n    const $evenRealVals = $evenComplex.real;\n    const $evenImagVals = $evenComplex.imag;\n    const $evenShape = [$evenRealVals.length];\n    const $evenRealInfo = cpuBackend.makeTensorInfo($evenShape, 'float32', $evenRealVals);\n    const $evenImagInfo = cpuBackend.makeTensorInfo($evenShape, 'float32', $evenImagVals);\n    const $evenTensorInfo = complex({\n        inputs: { real: $evenRealInfo, imag: $evenImagInfo },\n        backend: cpuBackend\n    });\n    const $oddComplex = fftRadix2(oddRealVals, oddImagVals, half, inverse, cpuBackend);\n    const $oddRealVals = $oddComplex.real;\n    const $oddImagVals = $oddComplex.imag;\n    const $oddShape = [$oddRealVals.length];\n    const $oddRealInfo = cpuBackend.makeTensorInfo($oddShape, 'float32', $oddRealVals);\n    const $oddImagInfo = cpuBackend.makeTensorInfo($oddShape, 'float32', $oddImagVals);\n    const $oddTensorInfo = complex({ inputs: { real: $oddRealInfo, imag: $oddImagInfo }, backend: cpuBackend });\n    const e = backend_util.exponents(size, inverse);\n    const eShape = [e.real.length];\n    const eRealInfo = cpuBackend.makeTensorInfo(eShape, 'float32', e.real);\n    const eImagInfo = cpuBackend.makeTensorInfo(eShape, 'float32', e.imag);\n    const complexInfo = complex({ inputs: { real: eRealInfo, imag: eImagInfo }, backend: cpuBackend });\n    const exponentInfo = multiply({ inputs: { a: complexInfo, b: $oddTensorInfo }, backend: cpuBackend });\n    const addPart = add({\n        inputs: { a: $evenTensorInfo, b: exponentInfo },\n        backend: cpuBackend\n    });\n    const subPart = sub({\n        inputs: { a: $evenTensorInfo, b: exponentInfo },\n        backend: cpuBackend\n    });\n    const addPartReal = real({ inputs: { input: addPart }, backend: cpuBackend });\n    const subPartReal = real({ inputs: { input: subPart }, backend: cpuBackend });\n    const addPartImag = imag({ inputs: { input: addPart }, backend: cpuBackend });\n    const subPartImag = imag({ inputs: { input: subPart }, backend: cpuBackend });\n    const $real = concat({\n        inputs: [addPartReal, subPartReal],\n        backend: cpuBackend,\n        attrs: { axis: 0 }\n    });\n    const $imag = concat({\n        inputs: [addPartImag, subPartImag],\n        backend: cpuBackend,\n        attrs: { axis: 0 }\n    });\n    const $realVals = cpuBackend.data.get($real.dataId).values;\n    const $imagVals = cpuBackend.data.get($imag.dataId).values;\n    cpuBackend.disposeIntermediateTensorInfo(evenRealInfo);\n    cpuBackend.disposeIntermediateTensorInfo(evenImagInfo);\n    cpuBackend.disposeIntermediateTensorInfo(evenTensorInfo);\n    cpuBackend.disposeIntermediateTensorInfo(oddRealInfo);\n    cpuBackend.disposeIntermediateTensorInfo(oddImagInfo);\n    cpuBackend.disposeIntermediateTensorInfo(oddTensorInfo);\n    cpuBackend.disposeIntermediateTensorInfo($evenRealInfo);\n    cpuBackend.disposeIntermediateTensorInfo($evenImagInfo);\n    cpuBackend.disposeIntermediateTensorInfo($evenTensorInfo);\n    cpuBackend.disposeIntermediateTensorInfo($oddRealInfo);\n    cpuBackend.disposeIntermediateTensorInfo($oddImagInfo);\n    cpuBackend.disposeIntermediateTensorInfo($oddTensorInfo);\n    cpuBackend.disposeIntermediateTensorInfo(eRealInfo);\n    cpuBackend.disposeIntermediateTensorInfo(eImagInfo);\n    cpuBackend.disposeIntermediateTensorInfo(complexInfo);\n    cpuBackend.disposeIntermediateTensorInfo(exponentInfo);\n    cpuBackend.disposeIntermediateTensorInfo(addPart);\n    cpuBackend.disposeIntermediateTensorInfo(subPart);\n    cpuBackend.disposeIntermediateTensorInfo(addPartReal);\n    cpuBackend.disposeIntermediateTensorInfo(addPartImag);\n    cpuBackend.disposeIntermediateTensorInfo(subPartReal);\n    cpuBackend.disposeIntermediateTensorInfo(subPartImag);\n    cpuBackend.disposeIntermediateTensorInfo($real);\n    cpuBackend.disposeIntermediateTensorInfo($imag);\n    return { real: $realVals, imag: $imagVals };\n}\n// Calculate fourier transform by multplying sinusoid matrix.\nfunction fourierTransformByMatmul(data, size, inverse) {\n    const ret = new Float32Array(size * 2);\n    // TODO: Use matmul instead once it supports complex64 type.\n    for (let r = 0; r < size; r++) {\n        let real = 0.0;\n        let imag = 0.0;\n        for (let c = 0; c < size; c++) {\n            const e = backend_util.exponent(r * c, size, inverse);\n            const term = backend_util.getComplexWithIndex(data, c);\n            real += term.real * e.real - term.imag * e.imag;\n            imag += term.real * e.imag + term.imag * e.real;\n        }\n        if (inverse) {\n            real /= size;\n            imag /= size;\n        }\n        backend_util.assignToTypedArray(ret, real, imag, r);\n    }\n    return ret;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZ0X3V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMvdXRpbHMvZmZ0X3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWtDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pGLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNuQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDM0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ3pDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDckMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNyQyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDakQsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVuQzs7R0FFRztBQUNILE1BQU0sVUFBVSxRQUFRLENBQ3BCLEtBQWlCLEVBQUUsT0FBZ0IsRUFDbkMsVUFBMEI7SUFDNUIsTUFBTSxVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUMvQixNQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRS9CLE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxD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SUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLElBQUksSUFBSSxDQUFDO1lBQ2IsSUFBSSxJQUFJLElBQUksQ0FBQztTQUNkO1FBQ0QsWUFBWSxDQUFDLGtCQUFrQixDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgVGVuc29yLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi4va2VybmVscy9BZGQnO1xuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHtjb25jYXR9IGZyb20gJy4uL2tlcm5lbHMvQ29uY2F0JztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4uL2tlcm5lbHMvSWRlbnRpdHknO1xuaW1wb3J0IHtpbWFnfSBmcm9tICcuLi9rZXJuZWxzL0ltYWcnO1xuaW1wb3J0IHttdWx0aXBseX0gZnJvbSAnLi4va2VybmVscy9NdWx0aXBseSc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4uL2tlcm5lbHMvUmVhbCc7XG5pbXBvcnQge3JlYWxEaXZDb25maWd9IGZyb20gJy4uL2tlcm5lbHMvUmVhbERpdic7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7c3VifSBmcm9tICcuLi9rZXJuZWxzL1N1Yic7XG5cbi8qKlxuICogQ2FsY3VsYXRlIEZGVCBvZiBpbm5lciBtb3N0IGVsZW1lbnRzIG9mIGJhdGNoIHRlbnNvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZmdEJhdGNoKFxuICAgIGlucHV0OiBUZW5zb3JJbmZvLCBpbnZlcnNlOiBib29sZWFuLFxuICAgIGNwdUJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGlucHV0U2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgY29uc3QgYmF0Y2ggPSBpbnB1dFNoYXBlWzBdO1xuICBjb25zdCBpbm5lckRpbSA9IGlucHV0U2hhcGVbMV07XG5cbiAgY29uc3QgaW5wdXRWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuXG4gIGNvbnN0IHJlYWwyRCA9IGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbDtcbiAgY29uc3QgaW1hZzJEID0gaW5wdXRWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnO1xuXG4gIC8vIENvbGxlY3RzIHJlYWwgYW5kIGltYWdpbmFyeSB2YWx1ZXMgc2VwYXJhdGVseS5cbiAgY29uc3QgcmVzdWx0U2hhcGUgPSBbYmF0Y2gsIGlubmVyRGltXTtcbiAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZXN1bHRTaGFwZSk7XG4gIGNvbnN0IHJlc3VsdFJlYWwgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoJ2Zsb2F0MzInLCByZXN1bHRTaXplKTtcbiAgY29uc3QgcmVzdWx0SW1hZyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSgnZmxvYXQzMicsIHJlc3VsdFNpemUpO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2g7IGIrKykge1xuICAgIC8vIFRPRE86IFN1cHBvcnQgc2xpY2Ugb3BzIGZvciBjb21wbGV4IHR5cGUuXG4gICAgY29uc3QgciA9IHNsaWNlKHtcbiAgICAgIGlucHV0czoge3g6IHJlYWwyRH0sXG4gICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgICAgYXR0cnM6IHtiZWdpbjogW2IsIDBdLCBzaXplOiBbMSwgaW5uZXJEaW1dfVxuICAgIH0pO1xuICAgIGNvbnN0IGkgPSBzbGljZSh7XG4gICAgICBpbnB1dHM6IHt4OiBpbWFnMkR9LFxuICAgICAgYmFja2VuZDogY3B1QmFja2VuZCxcbiAgICAgIGF0dHJzOiB7YmVnaW46IFtiLCAwXSwgc2l6ZTogWzEsIGlubmVyRGltXX1cbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcblxuICAgIC8vIFJ1biBGRlQgYnkgYmF0Y2ggZWxlbWVudC5cbiAgICBjb25zdCB7cmVhbCwgaW1hZ30gPSBmZnRJbXBsKGlucHV0LCBpbnZlcnNlLCBjcHVCYWNrZW5kKTtcbiAgICBjb25zdCByZXMgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsLCBpbWFnKTtcblxuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgaW5uZXJEaW07IGQrKykge1xuICAgICAgY29uc3QgYyA9IGJhY2tlbmRfdXRpbC5nZXRDb21wbGV4V2l0aEluZGV4KHJlcywgZCk7XG4gICAgICByZXN1bHRSZWFsW2IgKiBpbm5lckRpbSArIGRdID0gYy5yZWFsO1xuICAgICAgcmVzdWx0SW1hZ1tiICogaW5uZXJEaW0gKyBkXSA9IGMuaW1hZztcbiAgICB9XG5cbiAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dCk7XG4gIH1cblxuICBjb25zdCAkcmVhbEluZm86IFRlbnNvckluZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgJ2Zsb2F0MzInLCByZXN1bHRSZWFsKTtcbiAgY29uc3QgJGltYWdJbmZvOiBUZW5zb3JJbmZvID1cbiAgICAgIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsICdmbG9hdDMyJywgcmVzdWx0SW1hZyk7XG5cbiAgY29uc3QgcmVzdWx0ID0gY29tcGxleChcbiAgICAgIHtpbnB1dHM6IHtyZWFsOiAkcmVhbEluZm8sIGltYWc6ICRpbWFnSW5mb30sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcblxuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRyZWFsSW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGltYWdJbmZvKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZmZ0SW1wbChcbiAgICBpbnB1dDogVGVuc29ySW5mbywgaW52ZXJzZTogYm9vbGVhbixcbiAgICBjcHVCYWNrZW5kOiBNYXRoQmFja2VuZENQVSk6IHtyZWFsOiBGbG9hdDMyQXJyYXksIGltYWc6IEZsb2F0MzJBcnJheX0ge1xuICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuXG4gIGNvbnN0IGlucHV0VmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICBjb25zdCByZWFsVmFscyA9XG4gICAgICBjcHVCYWNrZW5kLmRhdGEuZ2V0KGlucHV0VmFscy5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQpLnZhbHVlcyBhc1xuICAgICAgRmxvYXQzMkFycmF5O1xuXG4gIGNvbnN0IGltYWdWYWxzID1cbiAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoaW5wdXRWYWxzLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCkudmFsdWVzIGFzXG4gICAgICBGbG9hdDMyQXJyYXk7XG5cbiAgaWYgKGlzRXhwb25lbnRPZjIoaW5wdXRTaXplKSkge1xuICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIGZmdFJhZGl4MihyZWFsVmFscywgaW1hZ1ZhbHMsIGlucHV0U2l6ZSwgaW52ZXJzZSwgY3B1QmFja2VuZCk7XG5cbiAgICBjb25zdCByZXN1bHRTaGFwZSA9IFtpbnB1dC5zaGFwZVswXSwgaW5wdXQuc2hhcGVbMV1dO1xuXG4gICAgaWYgKGludmVyc2UpIHtcbiAgICAgIGNvbnN0IHJlYWxJbmZvOiBUZW5zb3JJbmZvID1cbiAgICAgICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdC5yZWFsKTtcbiAgICAgIGNvbnN0IGltYWdJbmZvOiBUZW5zb3JJbmZvID1cbiAgICAgICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCAnZmxvYXQzMicsIHJlc3VsdC5pbWFnKTtcblxuICAgICAgY29uc3Qgc2l6ZUluZm86IFRlbnNvckluZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICAgICAgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShpbnB1dFNpemUgYXMge30gYXMgJ2Zsb2F0MzInLCAnZmxvYXQzMicpKTtcbiAgICAgIGNvbnN0IHNpemVJbmZvQ29weSA9XG4gICAgICAgICAgaWRlbnRpdHkoe2lucHV0czoge3g6IHNpemVJbmZvfSwgYmFja2VuZDogY3B1QmFja2VuZH0pO1xuXG4gICAgICBjb25zdCBkaXZSZWFsSW5mbyA9XG4gICAgICAgICAgcmVhbERpdkNvbmZpZy5rZXJuZWxGdW5jKFxuICAgICAgICAgICAgICB7aW5wdXRzOiB7YTogcmVhbEluZm8sIGI6IHNpemVJbmZvfSwgYmFja2VuZDogY3B1QmFja2VuZH0pIGFzXG4gICAgICAgICAgVGVuc29ySW5mbztcbiAgICAgIGNvbnN0IGRpdkltYWdJbmZvID1cbiAgICAgICAgICByZWFsRGl2Q29uZmlnLmtlcm5lbEZ1bmMoXG4gICAgICAgICAgICAgIHtpbnB1dHM6IHthOiBpbWFnSW5mbywgYjogc2l6ZUluZm9Db3B5fSwgYmFja2VuZDogY3B1QmFja2VuZH0pIGFzXG4gICAgICAgICAgVGVuc29ySW5mbztcblxuICAgICAgY29uc3QgZGl2UmVhbFZhbHMgPVxuICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoZGl2UmVhbEluZm8uZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgY29uc3QgZGl2SW1hZ1ZhbHMgPVxuICAgICAgICAgIGNwdUJhY2tlbmQuZGF0YS5nZXQoZGl2SW1hZ0luZm8uZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuXG4gICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxJbmZvKTtcbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ0luZm8pO1xuICAgICAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzaXplSW5mbyk7XG4gICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNpemVJbmZvQ29weSk7XG4gICAgICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGRpdlJlYWxJbmZvKTtcbiAgICAgIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZGl2SW1hZ0luZm8pO1xuXG4gICAgICByZXR1cm4ge3JlYWw6IGRpdlJlYWxWYWxzLCBpbWFnOiBkaXZJbWFnVmFsc307XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBkYXRhID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHMsIGltYWdWYWxzKTtcblxuICAgIGNvbnN0IHJhd091dHB1dCA9XG4gICAgICAgIGZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bChkYXRhLCBpbnB1dFNpemUsIGludmVyc2UpIGFzIEZsb2F0MzJBcnJheTtcblxuICAgIHJldHVybiBiYWNrZW5kX3V0aWwuc3BsaXRSZWFsQW5kSW1hZ0FycmF5cyhyYXdPdXRwdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGlzRXhwb25lbnRPZjIoc2l6ZTogbnVtYmVyKTogYm9vbGVhbiB7XG4gIHJldHVybiAoc2l6ZSAmIHNpemUgLSAxKSA9PT0gMDtcbn1cblxuLy8gRkZUIHVzaW5nIENvb2xleS1UdWtleSBhbGdvcml0aG0gb24gcmFkaXggMiBkaW1lbnNpb25hbCBpbnB1dC5cbmZ1bmN0aW9uIGZmdFJhZGl4MihcbiAgICByZWFsVmFsczogRmxvYXQzMkFycmF5LCBpbWFnVmFsczogRmxvYXQzMkFycmF5LCBzaXplOiBudW1iZXIsXG4gICAgaW52ZXJzZTogYm9vbGVhbixcbiAgICBjcHVCYWNrZW5kOiBNYXRoQmFja2VuZENQVSk6IHtyZWFsOiBGbG9hdDMyQXJyYXksIGltYWc6IEZsb2F0MzJBcnJheX0ge1xuICBpZiAoc2l6ZSA9PT0gMSkge1xuICAgIHJldHVybiB7cmVhbDogcmVhbFZhbHMsIGltYWc6IGltYWdWYWxzfTtcbiAgfVxuXG4gIGNvbnN0IGRhdGEgPSBiYWNrZW5kX3V0aWwubWVyZ2VSZWFsQW5kSW1hZ0FycmF5cyhyZWFsVmFscywgaW1hZ1ZhbHMpO1xuXG4gIGNvbnN0IGhhbGYgPSBzaXplIC8gMjtcblxuICBjb25zdCBldmVuQ29tcGxleCA9IGJhY2tlbmRfdXRpbC5jb21wbGV4V2l0aEV2ZW5JbmRleChkYXRhKTtcblxuICBjb25zdCBldmVuUmVhbFZhbHMgPSBldmVuQ29tcGxleC5yZWFsO1xuICBjb25zdCBldmVuSW1hZ1ZhbHMgPSBldmVuQ29tcGxleC5pbWFnO1xuXG4gIGNvbnN0IGV2ZW5TaGFwZSA9IFtldmVuUmVhbFZhbHMubGVuZ3RoXTtcblxuICBjb25zdCBldmVuUmVhbEluZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhldmVuU2hhcGUsICdmbG9hdDMyJywgZXZlblJlYWxWYWxzKTtcbiAgY29uc3QgZXZlbkltYWdJbmZvID1cbiAgICAgIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oZXZlblNoYXBlLCAnZmxvYXQzMicsIGV2ZW5JbWFnVmFscyk7XG5cbiAgY29uc3QgZXZlblRlbnNvckluZm8gPSBjb21wbGV4KFxuICAgICAge2lucHV0czoge3JlYWw6IGV2ZW5SZWFsSW5mbywgaW1hZzogZXZlbkltYWdJbmZvfSwgYmFja2VuZDogY3B1QmFja2VuZH0pO1xuXG4gIGNvbnN0IG9kZENvbXBsZXggPSBiYWNrZW5kX3V0aWwuY29tcGxleFdpdGhPZGRJbmRleChkYXRhKTtcblxuICBjb25zdCBvZGRSZWFsVmFscyA9IG9kZENvbXBsZXgucmVhbDtcbiAgY29uc3Qgb2RkSW1hZ1ZhbHMgPSBvZGRDb21wbGV4LmltYWc7XG5cbiAgY29uc3Qgb2RkU2hhcGUgPSBbb2RkUmVhbFZhbHMubGVuZ3RoXTtcblxuICBjb25zdCBvZGRSZWFsSW5mbyA9XG4gICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG9kZFNoYXBlLCAnZmxvYXQzMicsIG9kZFJlYWxWYWxzKTtcbiAgY29uc3Qgb2RkSW1hZ0luZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbyhvZGRTaGFwZSwgJ2Zsb2F0MzInLCBvZGRJbWFnVmFscyk7XG5cbiAgY29uc3Qgb2RkVGVuc29ySW5mbyA9IGNvbXBsZXgoXG4gICAgICB7aW5wdXRzOiB7cmVhbDogb2RkUmVhbEluZm8sIGltYWc6IG9kZEltYWdJbmZvfSwgYmFja2VuZDogY3B1QmFja2VuZH0pO1xuXG4gIC8vIFJlY3Vyc2l2ZSBjYWxsIGZvciBoYWxmIHBhcnQgb2Ygb3JpZ2luYWwgaW5wdXQuXG4gIGNvbnN0ICRldmVuQ29tcGxleCA9XG4gICAgICBmZnRSYWRpeDIoZXZlblJlYWxWYWxzLCBldmVuSW1hZ1ZhbHMsIGhhbGYsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuXG4gIGNvbnN0ICRldmVuUmVhbFZhbHMgPSAkZXZlbkNvbXBsZXgucmVhbDtcbiAgY29uc3QgJGV2ZW5JbWFnVmFscyA9ICRldmVuQ29tcGxleC5pbWFnO1xuXG4gIGNvbnN0ICRldmVuU2hhcGUgPSBbJGV2ZW5SZWFsVmFscy5sZW5ndGhdO1xuXG4gIGNvbnN0ICRldmVuUmVhbEluZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkZXZlblNoYXBlLCAnZmxvYXQzMicsICRldmVuUmVhbFZhbHMpO1xuICBjb25zdCAkZXZlbkltYWdJbmZvID1cbiAgICAgIGNwdUJhY2tlbmQubWFrZVRlbnNvckluZm8oJGV2ZW5TaGFwZSwgJ2Zsb2F0MzInLCAkZXZlbkltYWdWYWxzKTtcblxuICBjb25zdCAkZXZlblRlbnNvckluZm8gPSBjb21wbGV4KHtcbiAgICBpbnB1dHM6IHtyZWFsOiAkZXZlblJlYWxJbmZvLCBpbWFnOiAkZXZlbkltYWdJbmZvfSxcbiAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gIH0pO1xuXG4gIGNvbnN0ICRvZGRDb21wbGV4ID1cbiAgICAgIGZmdFJhZGl4MihvZGRSZWFsVmFscywgb2RkSW1hZ1ZhbHMsIGhhbGYsIGludmVyc2UsIGNwdUJhY2tlbmQpO1xuXG4gIGNvbnN0ICRvZGRSZWFsVmFscyA9ICRvZGRDb21wbGV4LnJlYWw7XG4gIGNvbnN0ICRvZGRJbWFnVmFscyA9ICRvZGRDb21wbGV4LmltYWc7XG5cbiAgY29uc3QgJG9kZFNoYXBlID0gWyRvZGRSZWFsVmFscy5sZW5ndGhdO1xuXG4gIGNvbnN0ICRvZGRSZWFsSW5mbyA9XG4gICAgICBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKCRvZGRTaGFwZSwgJ2Zsb2F0MzInLCAkb2RkUmVhbFZhbHMpO1xuICBjb25zdCAkb2RkSW1hZ0luZm8gPVxuICAgICAgY3B1QmFja2VuZC5tYWtlVGVuc29ySW5mbygkb2RkU2hhcGUsICdmbG9hdDMyJywgJG9kZEltYWdWYWxzKTtcblxuICBjb25zdCAkb2RkVGVuc29ySW5mbyA9IGNvbXBsZXgoXG4gICAgICB7aW5wdXRzOiB7cmVhbDogJG9kZFJlYWxJbmZvLCBpbWFnOiAkb2RkSW1hZ0luZm99LCBiYWNrZW5kOiBjcHVCYWNrZW5kfSk7XG5cbiAgY29uc3QgZSA9IGJhY2tlbmRfdXRpbC5leHBvbmVudHMoc2l6ZSwgaW52ZXJzZSk7XG4gIGNvbnN0IGVTaGFwZSA9IFtlLnJlYWwubGVuZ3RoXTtcblxuICBjb25zdCBlUmVhbEluZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGVTaGFwZSwgJ2Zsb2F0MzInLCBlLnJlYWwpO1xuICBjb25zdCBlSW1hZ0luZm8gPSBjcHVCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGVTaGFwZSwgJ2Zsb2F0MzInLCBlLmltYWcpO1xuXG4gIGNvbnN0IGNvbXBsZXhJbmZvID0gY29tcGxleChcbiAgICAgIHtpbnB1dHM6IHtyZWFsOiBlUmVhbEluZm8sIGltYWc6IGVJbWFnSW5mb30sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcblxuICBjb25zdCBleHBvbmVudEluZm8gPVxuICAgICAgbXVsdGlwbHkoXG4gICAgICAgICAge2lucHV0czoge2E6IGNvbXBsZXhJbmZvLCBiOiAkb2RkVGVuc29ySW5mb30sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KSBhc1xuICAgICAgVGVuc29ySW5mbztcblxuICBjb25zdCBhZGRQYXJ0ID0gYWRkKHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiB7YTogJGV2ZW5UZW5zb3JJbmZvLCBiOiBleHBvbmVudEluZm99LFxuICAgICAgICAgICAgICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JJbmZvO1xuICBjb25zdCBzdWJQYXJ0ID0gc3ViKHtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRzOiB7YTogJGV2ZW5UZW5zb3JJbmZvLCBiOiBleHBvbmVudEluZm99LFxuICAgICAgICAgICAgICAgICAgICBiYWNrZW5kOiBjcHVCYWNrZW5kXG4gICAgICAgICAgICAgICAgICB9KSBhcyBUZW5zb3JJbmZvO1xuXG4gIGNvbnN0IGFkZFBhcnRSZWFsID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IGFkZFBhcnR9LCBiYWNrZW5kOiBjcHVCYWNrZW5kfSk7XG4gIGNvbnN0IHN1YlBhcnRSZWFsID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHN1YlBhcnR9LCBiYWNrZW5kOiBjcHVCYWNrZW5kfSk7XG5cbiAgY29uc3QgYWRkUGFydEltYWcgPSBpbWFnKHtpbnB1dHM6IHtpbnB1dDogYWRkUGFydH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcbiAgY29uc3Qgc3ViUGFydEltYWcgPSBpbWFnKHtpbnB1dHM6IHtpbnB1dDogc3ViUGFydH0sIGJhY2tlbmQ6IGNwdUJhY2tlbmR9KTtcblxuICBjb25zdCAkcmVhbCA9IGNvbmNhdCh7XG4gICAgaW5wdXRzOiBbYWRkUGFydFJlYWwgYXMgVGVuc29yLCBzdWJQYXJ0UmVhbCBhcyBUZW5zb3JdLFxuICAgIGJhY2tlbmQ6IGNwdUJhY2tlbmQsXG4gICAgYXR0cnM6IHtheGlzOiAwfVxuICB9KTtcbiAgY29uc3QgJGltYWcgPSBjb25jYXQoe1xuICAgIGlucHV0czogW2FkZFBhcnRJbWFnIGFzIFRlbnNvciwgc3ViUGFydEltYWcgYXMgVGVuc29yXSxcbiAgICBiYWNrZW5kOiBjcHVCYWNrZW5kLFxuICAgIGF0dHJzOiB7YXhpczogMH1cbiAgfSk7XG5cbiAgY29uc3QgJHJlYWxWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldCgkcmVhbC5kYXRhSWQpLnZhbHVlcyBhcyBGbG9hdDMyQXJyYXk7XG4gIGNvbnN0ICRpbWFnVmFscyA9IGNwdUJhY2tlbmQuZGF0YS5nZXQoJGltYWcuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuXG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZXZlblJlYWxJbmZvKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhldmVuSW1hZ0luZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGV2ZW5UZW5zb3JJbmZvKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvZGRSZWFsSW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ob2RkSW1hZ0luZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG9kZFRlbnNvckluZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuUmVhbEluZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuSW1hZ0luZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRldmVuVGVuc29ySW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJG9kZFJlYWxJbmZvKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkb2RkSW1hZ0luZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRvZGRUZW5zb3JJbmZvKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhlUmVhbEluZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGVJbWFnSW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oY29tcGxleEluZm8pO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGV4cG9uZW50SW5mbyk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYWRkUGFydCk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3ViUGFydCk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYWRkUGFydFJlYWwpO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGFkZFBhcnRJbWFnKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdWJQYXJ0UmVhbCk7XG4gIGNwdUJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3ViUGFydEltYWcpO1xuICBjcHVCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCRyZWFsKTtcbiAgY3B1QmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbygkaW1hZyk7XG5cbiAgcmV0dXJuIHtyZWFsOiAkcmVhbFZhbHMsIGltYWc6ICRpbWFnVmFsc307XG59XG5cbi8vIENhbGN1bGF0ZSBmb3VyaWVyIHRyYW5zZm9ybSBieSBtdWx0cGx5aW5nIHNpbnVzb2lkIG1hdHJpeC5cbmZ1bmN0aW9uIGZvdXJpZXJUcmFuc2Zvcm1CeU1hdG11bChcbiAgICBkYXRhOiBUeXBlZEFycmF5LCBzaXplOiBudW1iZXIsIGludmVyc2U6IGJvb2xlYW4pOiBUeXBlZEFycmF5IHtcbiAgY29uc3QgcmV0ID0gbmV3IEZsb2F0MzJBcnJheShzaXplICogMik7XG4gIC8vIFRPRE86IFVzZSBtYXRtdWwgaW5zdGVhZCBvbmNlIGl0IHN1cHBvcnRzIGNvbXBsZXg2NCB0eXBlLlxuICBmb3IgKGxldCByID0gMDsgciA8IHNpemU7IHIrKykge1xuICAgIGxldCByZWFsID0gMC4wO1xuICAgIGxldCBpbWFnID0gMC4wO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgc2l6ZTsgYysrKSB7XG4gICAgICBjb25zdCBlID0gYmFja2VuZF91dGlsLmV4cG9uZW50KHIgKiBjLCBzaXplLCBpbnZlcnNlKTtcbiAgICAgIGNvbnN0IHRlcm0gPSBiYWNrZW5kX3V0aWwuZ2V0Q29tcGxleFdpdGhJbmRleChkYXRhIGFzIEZsb2F0MzJBcnJheSwgYyk7XG4gICAgICByZWFsICs9IHRlcm0ucmVhbCAqIGUucmVhbCAtIHRlcm0uaW1hZyAqIGUuaW1hZztcbiAgICAgIGltYWcgKz0gdGVybS5yZWFsICogZS5pbWFnICsgdGVybS5pbWFnICogZS5yZWFsO1xuICAgIH1cbiAgICBpZiAoaW52ZXJzZSkge1xuICAgICAgcmVhbCAvPSBzaXplO1xuICAgICAgaW1hZyAvPSBzaXplO1xuICAgIH1cbiAgICBiYWNrZW5kX3V0aWwuYXNzaWduVG9UeXBlZEFycmF5KHJldCwgcmVhbCwgaW1hZywgcik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FFT, util } from '@tensorflow/tfjs-core';\nimport { fftBatch } from '../utils/fft_utils';\nimport { reshape } from './Reshape';\nexport function fft(args) {\n    const { inputs, backend } = args;\n    const { input } = inputs;\n    const inputSize = util.sizeFromShape(input.shape);\n    // Collapse all outer dimensions to a single batch dimension.\n    const innerDimensionSize = input.shape[input.shape.length - 1];\n    const batch = inputSize / innerDimensionSize;\n    const input2D = reshape({\n        inputs: { x: input },\n        backend,\n        attrs: { shape: [batch, innerDimensionSize] }\n    });\n    const result = fftBatch(input2D, false, backend);\n    const resultReshaped = reshape({ inputs: { x: result }, backend, attrs: { shape: input.shape } });\n    backend.disposeIntermediateTensorInfo(input2D);\n    backend.disposeIntermediateTensorInfo(result);\n    return resultReshaped;\n}\nexport const fftConfig = {\n    kernelName: FFT,\n    backendName: 'cpu',\n    kernelFunc: fft\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZULmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9GRlQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBbUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakcsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFrRDtJQUVwRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRXZCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWxELDZEQUE2RDtJQUM3RCxNQUFNLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxHQUFHLGtCQUFrQixDQUFDO0lBRTdDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN0QixNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsS0FBSyxFQUFDO1FBQ2xCLE9BQU87UUFDUCxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxLQUFLLEVBQUUsa0JBQWtCLENBQUMsRUFBQztLQUM1QyxDQUFDLENBQUM7SUFFSCxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVqRCxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBQyxFQUFDLENBQUMsQ0FBQztJQUV6RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0MsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RkZULCBGRlRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHtmZnRCYXRjaH0gZnJvbSAnLi4vdXRpbHMvZmZ0X3V0aWxzJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZmdChhcmdzOiB7aW5wdXRzOiBGRlRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcblxuICBjb25zdCBpbnB1dFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpO1xuXG4gIC8vIENvbGxhcHNlIGFsbCBvdXRlciBkaW1lbnNpb25zIHRvIGEgc2luZ2xlIGJhdGNoIGRpbWVuc2lvbi5cbiAgY29uc3QgaW5uZXJEaW1lbnNpb25TaXplID0gaW5wdXQuc2hhcGVbaW5wdXQuc2hhcGUubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGJhdGNoID0gaW5wdXRTaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuXG4gIGNvbnN0IGlucHV0MkQgPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4OiBpbnB1dH0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV19XG4gIH0pO1xuXG4gIGNvbnN0IHJlc3VsdCA9IGZmdEJhdGNoKGlucHV0MkQsIGZhbHNlLCBiYWNrZW5kKTtcblxuICBjb25zdCByZXN1bHRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBpbnB1dC5zaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGlucHV0MkQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdFJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZmZ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZGVCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBmZnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Fill, util } from '@tensorflow/tfjs-core';\nexport function fill(args) {\n    const { backend, attrs } = args;\n    const { shape, value, dtype } = attrs;\n    const $dtype = dtype || util.inferDtype(value);\n    const values = util.getArrayFromDType($dtype, util.sizeFromShape(shape));\n    fillValues(values, value, $dtype);\n    return backend.makeTensorInfo(shape, $dtype, values);\n}\nexport const fillConfig = {\n    kernelName: Fill,\n    backendName: 'cpu',\n    kernelFunc: fill\n};\nfunction fillValues(values, value, dtype) {\n    if (dtype === 'string') {\n        values.fill(value);\n    }\n    else {\n        values.fill(value);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRmlsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVCLElBQUksRUFBK0QsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJcEksTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFpRDtJQUVwRSxNQUFNLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUM5QixNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFcEMsTUFBTSxNQUFNLEdBQUcsS0FBSyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDekUsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFbEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDdkQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUM7QUFFRixTQUFTLFVBQVUsQ0FDZixNQUFrQixFQUFFLEtBQW9CLEVBQUUsS0FBZTtJQUMzRCxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDckIsTUFBbUIsQ0FBQyxJQUFJLENBQUMsS0FBZSxDQUFDLENBQUM7S0FDNUM7U0FBTTtRQUNKLE1BQXFCLENBQUMsSUFBSSxDQUFDLEtBQWUsQ0FBQyxDQUFDO0tBQzlDO0FBQ0gsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtEYXRhVHlwZSwgRGF0YVZhbHVlcywgRmlsbCwgRmlsbEF0dHJzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogRmlsbEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2hhcGUsIHZhbHVlLCBkdHlwZX0gPSBhdHRycztcblxuICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB1dGlsLmluZmVyRHR5cGUodmFsdWUpO1xuICBjb25zdCB2YWx1ZXMgPSB1dGlsLmdldEFycmF5RnJvbURUeXBlKCRkdHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKSk7XG4gIGZpbGxWYWx1ZXModmFsdWVzLCB2YWx1ZSwgJGR0eXBlKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhzaGFwZSwgJGR0eXBlLCB2YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZmlsbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGaWxsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGZpbGwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcblxuZnVuY3Rpb24gZmlsbFZhbHVlcyhcbiAgICB2YWx1ZXM6IERhdGFWYWx1ZXMsIHZhbHVlOiBzdHJpbmd8bnVtYmVyLCBkdHlwZTogRGF0YVR5cGUpOiB2b2lkIHtcbiAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICh2YWx1ZXMgYXMgc3RyaW5nW10pLmZpbGwodmFsdWUgYXMgc3RyaW5nKTtcbiAgfSBlbHNlIHtcbiAgICAodmFsdWVzIGFzIFR5cGVkQXJyYXkpLmZpbGwodmFsdWUgYXMgbnVtYmVyKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FlipLeftRight, util } from '@tensorflow/tfjs-core';\nexport const flipLeftRightConfig = {\n    kernelName: FlipLeftRight,\n    backendName: 'cpu',\n    kernelFunc: ({ inputs, attrs, backend }) => {\n        const { image } = inputs;\n        const cpuBackend = backend;\n        const output = util.getTypedArrayFromDType(image.dtype, util.sizeFromShape(image.shape));\n        const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n        const imageVals = cpuBackend.data.get(image.dataId).values;\n        for (let batchIdx = 0; batchIdx < batch; batchIdx++) {\n            const batchOffset = batchIdx * imageWidth * imageHeight * numChannels;\n            for (let row = 0; row < imageHeight; row++) {\n                const rowOffset = row * (imageWidth * numChannels);\n                for (let col = 0; col < imageWidth; col++) {\n                    const colOffset = col * numChannels;\n                    for (let channel = 0; channel < numChannels; channel++) {\n                        const coordX = Math.round(imageWidth - col - 1);\n                        const outIdx = batchOffset + rowOffset + colOffset + channel;\n                        let outputValue = imageVals[outIdx];\n                        // If the coordinate position falls within the image boundaries...\n                        if (coordX >= 0 && coordX < imageWidth) {\n                            // set the output to the image value at the coordinate position.\n                            const rotatedColOffset = coordX * numChannels;\n                            const imageIdx = batchOffset + rowOffset + rotatedColOffset + channel;\n                            outputValue = imageVals[imageIdx];\n                        }\n                        output[outIdx] = outputValue;\n                    }\n                }\n            }\n        }\n        const dataId = cpuBackend.write(output, image.shape, image.dtype);\n        return { dataId, shape: image.shape, dtype: image.dtype };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxpcExlZnRSaWdodC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvRmxpcExlZnRSaWdodC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsYUFBYSxFQUF1QixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkvRSxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBaUI7SUFDL0MsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQTZCLENBQUM7UUFDOUMsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztRQUU3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsc0JBQXNCLENBQ3RDLEtBQUssQ0FBQyxLQUF3QixFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7UUFFbEUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7UUFFekUsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLEtBQUssRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUNuRCxNQUFNLFdBQVcsR0FBRyxRQUFRLEdBQUcsVUFBVSxHQUFHLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFFdEUsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxHQUFHLFdBQVcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDMUMsTUFBTSxTQUFTLEdBQUcsR0FBRyxHQUFHLENBQUMsVUFBVSxHQUFHLFdBQVcsQ0FBQyxDQUFDO2dCQUVuRCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLEdBQUcsVUFBVSxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUN6QyxNQUFNLFNBQVMsR0FBRyxHQUFHLEdBQUcsV0FBVyxDQUFDO29CQUVwQyxLQUFLLElBQUksT0FBTyxHQUFHLENBQUMsRUFBRSxPQUFPLEdBQUcsV0FBVyxFQUFFLE9BQU8sRUFBRSxFQUFFO3dCQUN0RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUM7d0JBQ2hELE1BQU0sTUFBTSxHQUFHLFdBQVcsR0FBRyxTQUFTLEdBQUcsU0FBUyxHQUFHLE9BQU8sQ0FBQzt3QkFFN0QsSUFBSSxXQUFXLEdBQUcsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO3dCQUNwQyxrRUFBa0U7d0JBQ2xFLElBQUksTUFBTSxJQUFJLENBQUMsSUFBSSxNQUFNLEdBQUcsVUFBVSxFQUFFOzRCQUN0QyxnRUFBZ0U7NEJBQ2hFLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxHQUFHLFdBQVcsQ0FBQzs0QkFDOUMsTUFBTSxRQUFRLEdBQ1YsV0FBVyxHQUFHLFNBQVMsR0FBRyxnQkFBZ0IsR0FBRyxPQUFPLENBQUM7NEJBQ3pELFdBQVcsR0FBRyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ25DO3dCQUNELE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxXQUFXLENBQUM7cUJBQzlCO2lCQUNGO2FBQ0Y7U0FDRjtRQUVELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2xFLE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLEVBQUMsQ0FBQztJQUMxRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIE51bWVyaWNEYXRhVHlwZSwgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RmxpcExlZnRSaWdodCwgRmxpcExlZnRSaWdodElucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbGlwTGVmdFJpZ2h0LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7aW1hZ2V9ID0gaW5wdXRzIGFzIEZsaXBMZWZ0UmlnaHRJbnB1dHM7XG4gICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRDUFU7XG5cbiAgICBjb25zdCBvdXRwdXQgPSB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoXG4gICAgICAgIGltYWdlLmR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKGltYWdlLnNoYXBlKSk7XG4gICAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG5cbiAgICBjb25zdCBpbWFnZVZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KGltYWdlLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgICBmb3IgKGxldCBiYXRjaElkeCA9IDA7IGJhdGNoSWR4IDwgYmF0Y2g7IGJhdGNoSWR4KyspIHtcbiAgICAgIGNvbnN0IGJhdGNoT2Zmc2V0ID0gYmF0Y2hJZHggKiBpbWFnZVdpZHRoICogaW1hZ2VIZWlnaHQgKiBudW1DaGFubmVscztcblxuICAgICAgZm9yIChsZXQgcm93ID0gMDsgcm93IDwgaW1hZ2VIZWlnaHQ7IHJvdysrKSB7XG4gICAgICAgIGNvbnN0IHJvd09mZnNldCA9IHJvdyAqIChpbWFnZVdpZHRoICogbnVtQ2hhbm5lbHMpO1xuXG4gICAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8IGltYWdlV2lkdGg7IGNvbCsrKSB7XG4gICAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gY29sICogbnVtQ2hhbm5lbHM7XG5cbiAgICAgICAgICBmb3IgKGxldCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IG51bUNoYW5uZWxzOyBjaGFubmVsKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvb3JkWCA9IE1hdGgucm91bmQoaW1hZ2VXaWR0aCAtIGNvbCAtIDEpO1xuICAgICAgICAgICAgY29uc3Qgb3V0SWR4ID0gYmF0Y2hPZmZzZXQgKyByb3dPZmZzZXQgKyBjb2xPZmZzZXQgKyBjaGFubmVsO1xuXG4gICAgICAgICAgICBsZXQgb3V0cHV0VmFsdWUgPSBpbWFnZVZhbHNbb3V0SWR4XTtcbiAgICAgICAgICAgIC8vIElmIHRoZSBjb29yZGluYXRlIHBvc2l0aW9uIGZhbGxzIHdpdGhpbiB0aGUgaW1hZ2UgYm91bmRhcmllcy4uLlxuICAgICAgICAgICAgaWYgKGNvb3JkWCA+PSAwICYmIGNvb3JkWCA8IGltYWdlV2lkdGgpIHtcbiAgICAgICAgICAgICAgLy8gc2V0IHRoZSBvdXRwdXQgdG8gdGhlIGltYWdlIHZhbHVlIGF0IHRoZSBjb29yZGluYXRlIHBvc2l0aW9uLlxuICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQ29sT2Zmc2V0ID0gY29vcmRYICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlSWR4ID1cbiAgICAgICAgICAgICAgICAgIGJhdGNoT2Zmc2V0ICsgcm93T2Zmc2V0ICsgcm90YXRlZENvbE9mZnNldCArIGNoYW5uZWw7XG4gICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gaW1hZ2VWYWxzW2ltYWdlSWR4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG91dHB1dFtvdXRJZHhdID0gb3V0cHV0VmFsdWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShvdXRwdXQsIGltYWdlLnNoYXBlLCBpbWFnZS5kdHlwZSk7XG4gICAgcmV0dXJuIHtkYXRhSWQsIHNoYXBlOiBpbWFnZS5zaGFwZSwgZHR5cGU6IGltYWdlLmR0eXBlfTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FloorDiv } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const floorDivImpl = createSimpleBinaryKernelImpl((a, b) => Math.floor(a / b));\nexport const floorDiv = binaryKernelFunc(FloorDiv, floorDivImpl, null /* complexImpl */, 'int32');\nexport const floorDivConfig = {\n    kernelName: FloorDiv,\n    backendName: 'cpu',\n    kernelFunc: floorDiv\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3JEaXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Zsb29yRGl2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQ3JCLDRCQUE0QixDQUFDLENBQUMsQ0FBUyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUM5RSxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQ2pCLGdCQUFnQixDQUFDLFFBQVEsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBRTlFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFFBQVE7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vckRpdiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2NyZWF0ZVNpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV9pbXBsJztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGZsb29yRGl2SW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IE1hdGguZmxvb3IoYSAvIGIpKTtcbmV4cG9ydCBjb25zdCBmbG9vckRpdiA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyhGbG9vckRpdiwgZmxvb3JEaXZJbXBsLCBudWxsIC8qIGNvbXBsZXhJbXBsICovLCAnaW50MzInKTtcblxuZXhwb3J0IGNvbnN0IGZsb29yRGl2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZsb29yRGl2LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGZsb29yRGl2XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FusedConv2D } from '@tensorflow/tfjs-core';\nimport { applyActivation } from '../utils/fused_utils';\nimport { add } from './Add';\nimport { conv2D } from './Conv2D';\nimport { reshape } from './Reshape';\nexport function fusedConv2D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter, bias, preluActivationWeights } = inputs;\n    const { strides, pad, dataFormat, dilations, dimRoundingMode, activation, leakyreluAlpha } = attrs;\n    let result = conv2D({\n        inputs: { x, filter },\n        backend,\n        attrs: { strides, pad, dataFormat, dilations, dimRoundingMode }\n    });\n    if (bias) {\n        const resultOld = result;\n        // For NCHW format, if bias is a 1-D tensor, it is supposed to be aligned\n        // to the channel of the conv2d's result; if the bias is a scalar, the\n        // bias_add is computed as if the bias was broadcasted to the shape of the\n        // conv2d's result.\n        if (dataFormat === 'NCHW' && bias.shape.length === 1 &&\n            bias.shape[0] !== 1) {\n            const reshapedBias = reshape({ inputs: { x: bias }, backend, attrs: { shape: [bias.shape[0], 1, 1] } });\n            result =\n                add({ inputs: { a: result, b: reshapedBias }, backend });\n            backend.disposeIntermediateTensorInfo(reshapedBias);\n        }\n        else {\n            // This condition handles NHWC and NCHW (scalar case). The only other case\n            // for NCHW (1D case) is handled above.\n            result = add({ inputs: { a: result, b: bias }, backend });\n        }\n        backend.disposeIntermediateTensorInfo(resultOld);\n    }\n    if (activation) {\n        const resultOld = result;\n        // For NCHW format, if PReLu activation weights is a 1-D tensor, it is\n        // supposed to be aligned with the channel of the conv2d's result. For other\n        // cases, whether NCHW or NHWC data format, the conv2d result is\n        // already aligned with the activation weights.\n        if (dataFormat === 'NCHW' && activation === 'prelu' &&\n            preluActivationWeights.shape.length === 1 &&\n            preluActivationWeights.shape[0] !== 1) {\n            const reshapedAlpha = reshape({\n                inputs: { x: preluActivationWeights },\n                backend,\n                attrs: { shape: [preluActivationWeights.shape[0], 1, 1] }\n            });\n            result = applyActivation(backend, result, activation, reshapedAlpha, leakyreluAlpha);\n            backend.disposeIntermediateTensorInfo(reshapedAlpha);\n        }\n        else {\n            result = applyActivation(backend, result, activation, preluActivationWeights, leakyreluAlpha);\n        }\n        backend.disposeIntermediateTensorInfo(resultOld);\n    }\n    return result;\n}\nexport const fusedConv2DConfig = {\n    kernelName: FusedConv2D,\n    backendName: 'cpu',\n    kernelFunc: fusedConv2D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWRDb252MkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Z1c2VkQ29udjJELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQTRFLE1BQU0sdUJBQXVCLENBQUM7QUFHN0gsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3JELE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3pELE1BQU0sRUFDSixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsRUFDVixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixjQUFjLEVBQ2YsR0FBRyxLQUFLLENBQUM7SUFFVixJQUFJLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDbEIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQztRQUNuQixPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQztLQUM5RCxDQUFDLENBQUM7SUFFSCxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQztRQUN6Qix5RUFBeUU7UUFDekUsc0VBQXNFO1FBQ3RFLDBFQUEwRTtRQUMxRSxtQkFBbUI7UUFDbkIsSUFBSSxVQUFVLEtBQUssTUFBTSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFDaEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDdkIsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUN4QixFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7WUFDekUsTUFBTTtnQkFDRixHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxZQUFZLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBZSxDQUFDO1lBQ3ZFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUNyRDthQUFNO1lBQ0wsMEVBQTBFO1lBQzFFLHVDQUF1QztZQUN2QyxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztTQUNyRTtRQUNELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELElBQUksVUFBVSxFQUFFO1FBQ2QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLHNFQUFzRTtRQUN0RSw0RUFBNEU7UUFDNUUsZ0VBQWdFO1FBQ2hFLCtDQUErQztRQUMvQyxJQUFJLFVBQVUsS0FBSyxNQUFNLElBQUksVUFBVSxLQUFLLE9BQU87WUFDL0Msc0JBQXNCLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQ3pDLHNCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUU7WUFDekMsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDO2dCQUM1QixNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUM7Z0JBQ25DLE9BQU87Z0JBQ1AsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsc0JBQXNCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsRUFBQzthQUN4RCxDQUFDLENBQUM7WUFDSCxNQUFNLEdBQUcsZUFBZSxDQUNwQixPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDaEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDO1NBQ3REO2FBQU07WUFDTCxNQUFNLEdBQUcsZUFBZSxDQUNwQixPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxzQkFBc0IsRUFBRSxjQUFjLENBQUMsQ0FBQztTQUMxRTtRQUNELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RnVzZWRDb252MkQsIEZ1c2VkQ29udjJEQXR0cnMsIEZ1c2VkQ29udjJESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXBwbHlBY3RpdmF0aW9ufSBmcm9tICcuLi91dGlscy9mdXNlZF91dGlscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi9BZGQnO1xuaW1wb3J0IHtjb252MkR9IGZyb20gJy4vQ29udjJEJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkQ29udjJEKGFyZ3M6IHtcbiAgaW5wdXRzOiBGdXNlZENvbnYyRElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBGdXNlZENvbnYyREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7XG4gICAgc3RyaWRlcyxcbiAgICBwYWQsXG4gICAgZGF0YUZvcm1hdCxcbiAgICBkaWxhdGlvbnMsXG4gICAgZGltUm91bmRpbmdNb2RlLFxuICAgIGFjdGl2YXRpb24sXG4gICAgbGVha3lyZWx1QWxwaGFcbiAgfSA9IGF0dHJzO1xuXG4gIGxldCByZXN1bHQgPSBjb252MkQoe1xuICAgIGlucHV0czoge3gsIGZpbHRlcn0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGV9XG4gIH0pO1xuXG4gIGlmIChiaWFzKSB7XG4gICAgY29uc3QgcmVzdWx0T2xkID0gcmVzdWx0O1xuICAgIC8vIEZvciBOQ0hXIGZvcm1hdCwgaWYgYmlhcyBpcyBhIDEtRCB0ZW5zb3IsIGl0IGlzIHN1cHBvc2VkIHRvIGJlIGFsaWduZWRcbiAgICAvLyB0byB0aGUgY2hhbm5lbCBvZiB0aGUgY29udjJkJ3MgcmVzdWx0OyBpZiB0aGUgYmlhcyBpcyBhIHNjYWxhciwgdGhlXG4gICAgLy8gYmlhc19hZGQgaXMgY29tcHV0ZWQgYXMgaWYgdGhlIGJpYXMgd2FzIGJyb2FkY2FzdGVkIHRvIHRoZSBzaGFwZSBvZiB0aGVcbiAgICAvLyBjb252MmQncyByZXN1bHQuXG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0hXJyAmJiBiaWFzLnNoYXBlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBiaWFzLnNoYXBlWzBdICE9PSAxKSB7XG4gICAgICBjb25zdCByZXNoYXBlZEJpYXMgPSByZXNoYXBlKFxuICAgICAgICAgIHtpbnB1dHM6IHt4OiBiaWFzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogW2JpYXMuc2hhcGVbMF0sIDEsIDFdfX0pO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgICBhZGQoe2lucHV0czoge2E6IHJlc3VsdCwgYjogcmVzaGFwZWRCaWFzfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc2hhcGVkQmlhcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFRoaXMgY29uZGl0aW9uIGhhbmRsZXMgTkhXQyBhbmQgTkNIVyAoc2NhbGFyIGNhc2UpLiBUaGUgb25seSBvdGhlciBjYXNlXG4gICAgICAvLyBmb3IgTkNIVyAoMUQgY2FzZSkgaXMgaGFuZGxlZCBhYm92ZS5cbiAgICAgIHJlc3VsdCA9IGFkZCh7aW5wdXRzOiB7YTogcmVzdWx0LCBiOiBiaWFzfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgfVxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0T2xkKTtcbiAgfVxuXG4gIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgY29uc3QgcmVzdWx0T2xkID0gcmVzdWx0O1xuICAgIC8vIEZvciBOQ0hXIGZvcm1hdCwgaWYgUFJlTHUgYWN0aXZhdGlvbiB3ZWlnaHRzIGlzIGEgMS1EIHRlbnNvciwgaXQgaXNcbiAgICAvLyBzdXBwb3NlZCB0byBiZSBhbGlnbmVkIHdpdGggdGhlIGNoYW5uZWwgb2YgdGhlIGNvbnYyZCdzIHJlc3VsdC4gRm9yIG90aGVyXG4gICAgLy8gY2FzZXMsIHdoZXRoZXIgTkNIVyBvciBOSFdDIGRhdGEgZm9ybWF0LCB0aGUgY29udjJkIHJlc3VsdCBpc1xuICAgIC8vIGFscmVhZHkgYWxpZ25lZCB3aXRoIHRoZSBhY3RpdmF0aW9uIHdlaWdodHMuXG4gICAgaWYgKGRhdGFGb3JtYXQgPT09ICdOQ0hXJyAmJiBhY3RpdmF0aW9uID09PSAncHJlbHUnICYmXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMuc2hhcGUubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMuc2hhcGVbMF0gIT09IDEpIHtcbiAgICAgIGNvbnN0IHJlc2hhcGVkQWxwaGEgPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7eDogcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7c2hhcGU6IFtwcmVsdUFjdGl2YXRpb25XZWlnaHRzLnNoYXBlWzBdLCAxLCAxXX1cbiAgICAgIH0pO1xuICAgICAgcmVzdWx0ID0gYXBwbHlBY3RpdmF0aW9uKFxuICAgICAgICAgIGJhY2tlbmQsIHJlc3VsdCwgYWN0aXZhdGlvbiwgcmVzaGFwZWRBbHBoYSwgbGVha3lyZWx1QWxwaGEpO1xuICAgICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZEFscGhhKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gYXBwbHlBY3RpdmF0aW9uKFxuICAgICAgICAgIGJhY2tlbmQsIHJlc3VsdCwgYWN0aXZhdGlvbiwgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cywgbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdE9sZCk7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgZnVzZWRDb252MkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRnVzZWRDb252MkQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogZnVzZWRDb252MkQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FusedDepthwiseConv2D } from '@tensorflow/tfjs-core';\nimport { applyActivation } from '../utils/fused_utils';\nimport { add } from './Add';\nimport { depthwiseConv2dNative } from './DepthwiseConv2dNative';\nexport function fusedDepthwiseConv2D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter, bias, preluActivationWeights } = inputs;\n    const { strides, pad, dataFormat, dilations, dimRoundingMode, activation, leakyreluAlpha } = attrs;\n    let result = depthwiseConv2dNative({\n        inputs: { x, filter },\n        backend,\n        attrs: { strides, pad, dataFormat, dilations, dimRoundingMode }\n    });\n    if (bias) {\n        const oldResult = result;\n        result = add({ inputs: { a: result, b: bias }, backend });\n        backend.disposeIntermediateTensorInfo(oldResult);\n    }\n    if (activation) {\n        const oldResult = result;\n        result = applyActivation(backend, result, activation, preluActivationWeights, leakyreluAlpha);\n        backend.disposeIntermediateTensorInfo(oldResult);\n    }\n    return result;\n}\nexport const fusedDepthwiseConv2DConfig = {\n    kernelName: FusedDepthwiseConv2D,\n    backendName: 'cpu',\n    kernelFunc: fusedDepthwiseConv2D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxvQkFBb0IsRUFBOEYsTUFBTSx1QkFBdUIsQ0FBQztBQUd4SixPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDckQsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUU5RCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFJcEM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLHNCQUFzQixFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3pELE1BQU0sRUFDSixPQUFPLEVBQ1AsR0FBRyxFQUNILFVBQVUsRUFDVixTQUFTLEVBQ1QsZUFBZSxFQUNmLFVBQVUsRUFDVixjQUFjLEVBQ2YsR0FBRyxLQUFLLENBQUM7SUFFVixJQUFJLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQztRQUNqQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDO1FBQ25CLE9BQU87UUFDUCxLQUFLLEVBQUUsRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFDO0tBQzlELENBQUMsQ0FBQztJQUVILElBQUksSUFBSSxFQUFFO1FBQ1IsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBZSxDQUFDO1FBQ3BFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUNELElBQUksVUFBVSxFQUFFO1FBQ2QsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDO1FBQ3pCLE1BQU0sR0FBRyxlQUFlLENBQ3BCLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLHNCQUFzQixFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQ3pFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwwQkFBMEIsR0FBaUI7SUFDdEQsVUFBVSxFQUFFLG9CQUFvQjtJQUNoQyxXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsb0JBQXdDO0NBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RnVzZWREZXB0aHdpc2VDb252MkQsIEZ1c2VkRGVwdGh3aXNlQ29udjJEQXR0cnMsIEZ1c2VkRGVwdGh3aXNlQ29udjJESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXBwbHlBY3RpdmF0aW9ufSBmcm9tICcuLi91dGlscy9mdXNlZF91dGlscyc7XG5pbXBvcnQge2FkZH0gZnJvbSAnLi9BZGQnO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmROYXRpdmV9IGZyb20gJy4vRGVwdGh3aXNlQ29udjJkTmF0aXZlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJEKGFyZ3M6IHtcbiAgaW5wdXRzOiBGdXNlZERlcHRod2lzZUNvbnYyRElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBGdXNlZERlcHRod2lzZUNvbnYyREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXIsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7XG4gICAgc3RyaWRlcyxcbiAgICBwYWQsXG4gICAgZGF0YUZvcm1hdCxcbiAgICBkaWxhdGlvbnMsXG4gICAgZGltUm91bmRpbmdNb2RlLFxuICAgIGFjdGl2YXRpb24sXG4gICAgbGVha3lyZWx1QWxwaGFcbiAgfSA9IGF0dHJzO1xuXG4gIGxldCByZXN1bHQgPSBkZXB0aHdpc2VDb252MmROYXRpdmUoe1xuICAgIGlucHV0czoge3gsIGZpbHRlcn0sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGV9XG4gIH0pO1xuXG4gIGlmIChiaWFzKSB7XG4gICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgIHJlc3VsdCA9IGFkZCh7aW5wdXRzOiB7YTogcmVzdWx0LCBiOiBiaWFzfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvbGRSZXN1bHQpO1xuICB9XG4gIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgY29uc3Qgb2xkUmVzdWx0ID0gcmVzdWx0O1xuICAgIHJlc3VsdCA9IGFwcGx5QWN0aXZhdGlvbihcbiAgICAgICAgYmFja2VuZCwgcmVzdWx0LCBhY3RpdmF0aW9uLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLCBsZWFreXJlbHVBbHBoYSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvbGRSZXN1bHQpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IGZ1c2VkRGVwdGh3aXNlQ29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZ1c2VkRGVwdGh3aXNlQ29udjJELFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGZ1c2VkRGVwdGh3aXNlQ29udjJEIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, GatherNd, util } from '@tensorflow/tfjs-core';\nimport { gatherNdImpl } from './GatherNd_Impl';\nexport function gatherNd(args) {\n    const { inputs, backend } = args;\n    const { params, indices } = inputs;\n    const paramsSize = util.sizeFromShape(params.shape);\n    const indicesShape = indices.shape;\n    const sliceRank = indicesShape[indicesShape.length - 1];\n    const [resultShape, numSlices, sliceSize, strides] = backend_util.prepareAndValidate(params, indices);\n    if (numSlices === 0) {\n        return backend.makeTensorInfo(resultShape, params.dtype, []);\n    }\n    const indicesData = backend.data.get(indices.dataId).values;\n    const paramsBuf = backend.bufferSync(params);\n    const outBuf = gatherNdImpl(indicesData, paramsBuf, params.dtype, numSlices, sliceRank, sliceSize, strides, params.shape, paramsSize);\n    return backend.makeTensorInfo(resultShape, params.dtype, outBuf.values);\n}\nexport const gatherNdConfig = {\n    kernelName: GatherNd,\n    backendName: 'cpu',\n    kernelFunc: gatherNd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyTmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0dhdGhlck5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsUUFBUSxFQUEwRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkzSSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFFN0MsTUFBTSxVQUFVLFFBQVEsQ0FDcEIsSUFBdUQ7SUFDekQsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFakMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFcEQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQztJQUNuQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsWUFBWSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV4RCxNQUFNLENBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLEdBQzlDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDckQsSUFBSSxTQUFTLEtBQUssQ0FBQyxFQUFFO1FBQ25CLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztLQUM5RDtJQUVELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzFFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWtCLE1BQU0sQ0FBQyxDQUFDO0lBQzlELE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FDdkIsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUNyRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztJQUV2QyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgR2F0aGVyTmQsIEdhdGhlck5kSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhbmssIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtnYXRoZXJOZEltcGx9IGZyb20gJy4vR2F0aGVyTmRfSW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJOZChcbiAgICBhcmdzOiB7aW5wdXRzOiBHYXRoZXJOZElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtcywgaW5kaWNlc30gPSBpbnB1dHM7XG5cbiAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuXG4gIGNvbnN0IGluZGljZXNTaGFwZSA9IGluZGljZXMuc2hhcGU7XG4gIGNvbnN0IHNsaWNlUmFuayA9IGluZGljZXNTaGFwZVtpbmRpY2VzU2hhcGUubGVuZ3RoIC0gMV07XG5cbiAgY29uc3QgW3Jlc3VsdFNoYXBlLCBudW1TbGljZXMsIHNsaWNlU2l6ZSwgc3RyaWRlc10gPVxuICAgICAgYmFja2VuZF91dGlsLnByZXBhcmVBbmRWYWxpZGF0ZShwYXJhbXMsIGluZGljZXMpO1xuICBpZiAobnVtU2xpY2VzID09PSAwKSB7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHBhcmFtcy5kdHlwZSwgW10pO1xuICB9XG5cbiAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGluZGljZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgcGFyYW1zQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdmbG9hdDMyJz4ocGFyYW1zKTtcbiAgY29uc3Qgb3V0QnVmID0gZ2F0aGVyTmRJbXBsKFxuICAgICAgaW5kaWNlc0RhdGEsIHBhcmFtc0J1ZiwgcGFyYW1zLmR0eXBlLCBudW1TbGljZXMsIHNsaWNlUmFuaywgc2xpY2VTaXplLFxuICAgICAgc3RyaWRlcywgcGFyYW1zLnNoYXBlLCBwYXJhbXNTaXplKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhyZXN1bHRTaGFwZSwgcGFyYW1zLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdhdGhlck5kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEdhdGhlck5kLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGdhdGhlck5kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, GatherV2, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { gatherV2Impl } from './GatherV2_impl';\nimport { reshape } from './Reshape';\nexport function gatherV2(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, indices } = inputs;\n    const { axis, batchDims } = attrs;\n    assertNotComplex([x, indices], 'gatherV2');\n    // Throw error when any index is out of bound.\n    const parsedAxis = util.parseAxisParam(axis, x.shape)[0];\n    const indicesVals = backend.data.get(indices.dataId).values;\n    const axisDim = x.shape[parsedAxis];\n    for (let i = 0; i < indicesVals.length; ++i) {\n        const index = indicesVals[i];\n        util.assert(index <= axisDim - 1 && index >= 0, () => `GatherV2: the index value ${index} is not in [0, ${axisDim - 1}]`);\n    }\n    let $batchDims = batchDims;\n    if (batchDims == null) {\n        $batchDims = 0;\n    }\n    const indicesSize = util.sizeFromShape(indices.shape);\n    const shapeInfo = backend_util.segment_util.collectGatherOpShapeInfo(x, indices, parsedAxis, $batchDims);\n    const flattenX = reshape({\n        inputs: { x },\n        backend,\n        attrs: {\n            shape: [\n                shapeInfo.batchSize, shapeInfo.outerSize, shapeInfo.dimSize,\n                shapeInfo.sliceSize\n            ]\n        }\n    });\n    const flattenIndex = reshape({\n        inputs: { x: indices },\n        backend,\n        attrs: { shape: [shapeInfo.batchSize, indicesSize / shapeInfo.batchSize] }\n    });\n    const flattenOutputShape = [\n        shapeInfo.batchSize, shapeInfo.outerSize, indicesSize / shapeInfo.batchSize,\n        shapeInfo.sliceSize\n    ];\n    const indicesBuf = backend.bufferSync(flattenIndex);\n    const xBuf = backend.bufferSync(flattenX);\n    const outBuf = gatherV2Impl(xBuf, indicesBuf, flattenOutputShape);\n    backend.disposeIntermediateTensorInfo(flattenX);\n    backend.disposeIntermediateTensorInfo(flattenIndex);\n    return backend.makeTensorInfo(shapeInfo.outputShape, outBuf.dtype, outBuf.values);\n}\nexport const gatherV2Config = {\n    kernelName: GatherV2,\n    backendName: 'cpu',\n    kernelFunc: gatherV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0dhdGhlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsUUFBUSxFQUFtRixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdwSixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUl4QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVoQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUUzQyw4Q0FBOEM7SUFDOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzFFLE1BQU0sT0FBTyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDcEMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDM0MsTUFBTSxLQUFLLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxJQUFJLE9BQU8sR0FBRyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsRUFDbEMsR0FBRyxFQUFFLENBQ0QsNkJBQTZCLEtBQUssa0JBQWtCLE9BQU8sR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0tBQzdFO0lBRUQsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBRTNCLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtRQUNyQixVQUFVLEdBQUcsQ0FBQyxDQUFDO0tBQ2hCO0lBRUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFdEQsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FDaEUsQ0FBQyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFeEMsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQztRQUNYLE9BQU87UUFDUCxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUU7Z0JBQ0wsU0FBUyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxPQUFPO2dCQUMzRCxTQUFTLENBQUMsU0FBUzthQUNwQjtTQUNGO0tBQ0YsQ0FBQyxDQUFDO0lBRUgsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDO1FBQzNCLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUM7UUFDcEIsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsV0FBVyxHQUFHLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBQztLQUN6RSxDQUFDLENBQUM7SUFFSCxNQUFNLGtCQUFrQixHQUFHO1FBQ3pCLFNBQVMsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVMsRUFBRSxXQUFXLEdBQUcsU0FBUyxDQUFDLFNBQVM7UUFDM0UsU0FBUyxDQUFDLFNBQVM7S0FDcEIsQ0FBQztJQUVGLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEQsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRWxFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFcEQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUN6QixTQUFTLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgR2F0aGVyVjIsIEdhdGhlclYyQXR0cnMsIEdhdGhlclYySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtnYXRoZXJWMkltcGx9IGZyb20gJy4vR2F0aGVyVjJfaW1wbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJWMihhcmdzOiB7XG4gIGlucHV0czogR2F0aGVyVjJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogR2F0aGVyVjJBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgaW5kaWNlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBiYXRjaERpbXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbeCwgaW5kaWNlc10sICdnYXRoZXJWMicpO1xuXG4gIC8vIFRocm93IGVycm9yIHdoZW4gYW55IGluZGV4IGlzIG91dCBvZiBib3VuZC5cbiAgY29uc3QgcGFyc2VkQXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gIGNvbnN0IGluZGljZXNWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGF4aXNEaW0gPSB4LnNoYXBlW3BhcnNlZEF4aXNdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNWYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3QgaW5kZXggPSBpbmRpY2VzVmFsc1tpXTtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgaW5kZXggPD0gYXhpc0RpbSAtIDEgJiYgaW5kZXggPj0gMCxcbiAgICAgICAgKCkgPT5cbiAgICAgICAgICAgIGBHYXRoZXJWMjogdGhlIGluZGV4IHZhbHVlICR7aW5kZXh9IGlzIG5vdCBpbiBbMCwgJHtheGlzRGltIC0gMX1dYCk7XG4gIH1cblxuICBsZXQgJGJhdGNoRGltcyA9IGJhdGNoRGltcztcblxuICBpZiAoYmF0Y2hEaW1zID09IG51bGwpIHtcbiAgICAkYmF0Y2hEaW1zID0gMDtcbiAgfVxuXG4gIGNvbnN0IGluZGljZXNTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGluZGljZXMuc2hhcGUpO1xuXG4gIGNvbnN0IHNoYXBlSW5mbyA9IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuY29sbGVjdEdhdGhlck9wU2hhcGVJbmZvKFxuICAgICAgeCwgaW5kaWNlcywgcGFyc2VkQXhpcywgJGJhdGNoRGltcyk7XG5cbiAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4fSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7XG4gICAgICBzaGFwZTogW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBzaGFwZUluZm8uZGltU2l6ZSxcbiAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgXVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogaW5kaWNlc30sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXX1cbiAgfSk7XG5cbiAgY29uc3QgZmxhdHRlbk91dHB1dFNoYXBlID0gW1xuICAgIHNoYXBlSW5mby5iYXRjaFNpemUsIHNoYXBlSW5mby5vdXRlclNpemUsIGluZGljZXNTaXplIC8gc2hhcGVJbmZvLmJhdGNoU2l6ZSxcbiAgICBzaGFwZUluZm8uc2xpY2VTaXplXG4gIF07XG5cbiAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhmbGF0dGVuSW5kZXgpO1xuICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKGZsYXR0ZW5YKTtcbiAgY29uc3Qgb3V0QnVmID0gZ2F0aGVyVjJJbXBsKHhCdWYsIGluZGljZXNCdWYsIGZsYXR0ZW5PdXRwdXRTaGFwZSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxhdHRlbkluZGV4KTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIHNoYXBlSW5mby5vdXRwdXRTaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGdhdGhlclYyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEdhdGhlclYyLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGdhdGhlclYyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IFFT, util } from '@tensorflow/tfjs-core';\nimport { fftBatch } from '../utils/fft_utils';\nimport { reshape } from './Reshape';\nexport function ifft(args) {\n    const { inputs, backend } = args;\n    const { input } = inputs;\n    const inputSize = util.sizeFromShape(input.shape);\n    // Collapse all outer dimensions to a single batch dimension.\n    const innerDimensionSize = input.shape[input.shape.length - 1];\n    const batch = inputSize / innerDimensionSize;\n    const input2D = reshape({\n        inputs: { x: input },\n        backend,\n        attrs: { shape: [batch, innerDimensionSize] }\n    });\n    const result = fftBatch(input2D, true, backend);\n    const resultReshaped = reshape({ inputs: { x: result }, backend, attrs: { shape: input.shape } });\n    backend.disposeIntermediateTensorInfo(input2D);\n    backend.disposeIntermediateTensorInfo(result);\n    return resultReshaped;\n}\nexport const ifftConfig = {\n    kernelName: IFFT,\n    backendName: 'cpu',\n    kernelFunc: ifft\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUZGVC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvSUZGVC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsSUFBSSxFQUFvRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDNUMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQW1EO0lBRXRFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFbEQsNkRBQTZEO0lBQzdELE1BQU0sa0JBQWtCLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztJQUMvRCxNQUFNLEtBQUssR0FBRyxTQUFTLEdBQUcsa0JBQWtCLENBQUM7SUFFN0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUM7UUFDbEIsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxFQUFDO0tBQzVDLENBQUMsQ0FBQztJQUVILE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRWhELE1BQU0sY0FBYyxHQUNoQixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXpFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFOUMsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SUZGVCwgSUZGVElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2ZmdEJhdGNofSBmcm9tICcuLi91dGlscy9mZnRfdXRpbHMnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gaWZmdChhcmdzOiB7aW5wdXRzOiBJRkZUSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVX0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG5cbiAgY29uc3QgaW5wdXRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0LnNoYXBlKTtcblxuICAvLyBDb2xsYXBzZSBhbGwgb3V0ZXIgZGltZW5zaW9ucyB0byBhIHNpbmdsZSBiYXRjaCBkaW1lbnNpb24uXG4gIGNvbnN0IGlubmVyRGltZW5zaW9uU2l6ZSA9IGlucHV0LnNoYXBlW2lucHV0LnNoYXBlLmxlbmd0aCAtIDFdO1xuICBjb25zdCBiYXRjaCA9IGlucHV0U2l6ZSAvIGlubmVyRGltZW5zaW9uU2l6ZTtcblxuICBjb25zdCBpbnB1dDJEID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogaW5wdXR9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtzaGFwZTogW2JhdGNoLCBpbm5lckRpbWVuc2lvblNpemVdfVxuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSBmZnRCYXRjaChpbnB1dDJELCB0cnVlLCBiYWNrZW5kKTtcblxuICBjb25zdCByZXN1bHRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBpbnB1dC5zaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGlucHV0MkQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG5cbiAgcmV0dXJuIHJlc3VsdFJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgaWZmdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJRkZULFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGlmZnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsFinite } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const isFinite = unaryKernelFunc(IsFinite, (xi) => Number.isFinite(xi) ? 1 : 0, 'bool');\nexport const isFiniteConfig = {\n    kernelName: IsFinite,\n    backendName: 'cpu',\n    kernelFunc: isFinite,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNGaW5pdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0lzRmluaXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxRQUFRLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sUUFBUSxHQUNqQixlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzRmluaXRlLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpc0Zpbml0ZSA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKElzRmluaXRlLCAoeGkpID0+IE51bWJlci5pc0Zpbml0ZSh4aSkgPyAxIDogMCwgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGlzRmluaXRlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzRmluaXRlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGlzRmluaXRlLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsInf } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const isInf = unaryKernelFunc(IsInf, (xi) => Math.abs(xi) === Infinity ? 1 : 0, 'bool');\nexport const isInfConfig = {\n    kernelName: IsInf,\n    backendName: 'cpu',\n    kernelFunc: isInf,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNJbmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0lzSW5mLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUU5RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lzSW5mLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBpc0luZiA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKElzSW5mLCAoeGkpID0+IE1hdGguYWJzKHhpKSA9PT0gSW5maW5pdHkgPyAxIDogMCwgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGlzSW5mQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IElzSW5mLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IGlzSW5mLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsNan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const isNaN = unaryKernelFunc(IsNan, (xi) => Number.isNaN(xi) ? 1 : 0, 'bool');\nexport const isNaNConfig = {\n    kernelName: IsNan,\n    backendName: 'cpu',\n    kernelFunc: isNaN,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNOYU4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0lzTmFOLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxLQUFLLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNOYW4sIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IGlzTmFOID1cbiAgICB1bmFyeUtlcm5lbEZ1bmMoSXNOYW4sICh4aSkgPT4gTnVtYmVyLmlzTmFOKHhpKSA/IDEgOiAwLCAnYm9vbCcpO1xuXG5leHBvcnQgY29uc3QgaXNOYU5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSXNOYW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogaXNOYU4sXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LinSpace } from '@tensorflow/tfjs-core';\nimport { linSpaceImpl } from './LinSpace_impl';\nexport function linSpace(args) {\n    const { backend, attrs } = args;\n    const { start, stop, num } = attrs;\n    const outVals = linSpaceImpl(start, stop, num);\n    return backend.makeTensorInfo([outVals.length], 'float32', outVals);\n}\nexport const linSpaceConfig = {\n    kernelName: LinSpace,\n    backendName: 'cpu',\n    kernelFunc: linSpace\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluU3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0xpblNwYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsUUFBUSxFQUE0QixNQUFNLHVCQUF1QixDQUFDO0FBR3BHLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUU3QyxNQUFNLFVBQVUsUUFBUSxDQUFDLElBQXFEO0lBRTVFLE1BQU0sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzlCLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVqQyxNQUFNLE9BQU8sR0FBRyxZQUFZLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUUvQyxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTGluU3BhY2UsIExpblNwYWNlQXR0cnMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7bGluU3BhY2VJbXBsfSBmcm9tICcuL0xpblNwYWNlX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluU3BhY2UoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogTGluU3BhY2VBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7YmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3N0YXJ0LCBzdG9wLCBudW19ID0gYXR0cnM7XG5cbiAgY29uc3Qgb3V0VmFscyA9IGxpblNwYWNlSW1wbChzdGFydCwgc3RvcCwgbnVtKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0VmFscy5sZW5ndGhdLCAnZmxvYXQzMicsIG91dFZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgbGluU3BhY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTGluU3BhY2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbGluU3BhY2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log1p } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const log1p = unaryKernelFunc(Log1p, (xi) => Math.log1p(xi));\nexport const log1pConfig = {\n    kernelName: Log1p,\n    backendName: 'cpu',\n    kernelFunc: log1p,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nMXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL0xvZzFwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVwRSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9nMXB9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBsb2cxcCA9IHVuYXJ5S2VybmVsRnVuYyhMb2cxcCwgKHhpKSA9PiBNYXRoLmxvZzFwKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBsb2cxcENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2cxcCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBsb2cxcCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalAnd } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const logicalAndImpl = createSimpleBinaryKernelImpl((a, b) => a && b);\nexport const logicalAnd = binaryKernelFunc(LogicalAnd, logicalAndImpl, null /* complexImpl */, 'bool');\nexport const logicalAndConfig = {\n    kernelName: LogicalAnd,\n    backendName: 'cpu',\n    kernelFunc: logicalAnd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbEFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTG9naWNhbEFuZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUFDLDRCQUE0QixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDbEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUN2Qiw0QkFBNEIsQ0FBQyxDQUFDLENBQVMsRUFBRSxDQUFTLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztBQUNuRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQUcsZ0JBQWdCLENBQ3RDLFVBQVUsRUFBRSxjQUFjLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRWhFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsVUFBVTtDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9naWNhbEFuZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtjcmVhdGVTaW1wbGVCaW5hcnlLZXJuZWxJbXBsfSBmcm9tICcuLi91dGlscy9iaW5hcnlfaW1wbCc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL2JpbmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IGEgJiYgYik7XG5leHBvcnQgY29uc3QgbG9naWNhbEFuZCA9IGJpbmFyeUtlcm5lbEZ1bmMoXG4gICAgTG9naWNhbEFuZCwgbG9naWNhbEFuZEltcGwsIG51bGwgLyogY29tcGxleEltcGwgKi8sICdib29sJyk7XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZ2ljYWxBbmQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbG9naWNhbEFuZFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalNot } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const logicalNot = unaryKernelFunc(LogicalNot, (xi) => xi ? 0 : 1, 'bool');\nexport const logicalNotConfig = {\n    kernelName: LogicalNot,\n    backendName: 'cpu',\n    kernelFunc: logicalNot,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbE5vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTG9naWNhbE5vdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FDbkIsZUFBZSxDQUFDLFVBQVUsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUI7SUFDNUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFVBQVU7Q0FDdkIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBMb2dpY2FsTm90fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdCA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKExvZ2ljYWxOb3QsICh4aSkgPT4geGkgPyAwIDogMSwgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxOb3RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTG9naWNhbE5vdCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBsb2dpY2FsTm90LFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalOr } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const logicalOrImpl = createSimpleBinaryKernelImpl((a, b) => a || b);\nexport const logicalOr = binaryKernelFunc(LogicalOr, logicalOrImpl, null /* complexImpl */, 'bool');\nexport const logicalOrConfig = {\n    kernelName: LogicalOr,\n    backendName: 'cpu',\n    kernelFunc: logicalOr\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbE9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Mb2dpY2FsT3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTlELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FDdEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7QUFDbkUsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUNsQixnQkFBZ0IsQ0FBQyxTQUFTLEVBQUUsYUFBYSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUFTO0NBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBMb2dpY2FsT3J9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE9ySW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IGEgfHwgYik7XG5leHBvcnQgY29uc3QgbG9naWNhbE9yID1cbiAgICBiaW5hcnlLZXJuZWxGdW5jKExvZ2ljYWxPciwgbG9naWNhbE9ySW1wbCwgbnVsbCAvKiBjb21wbGV4SW1wbCAqLywgJ2Jvb2wnKTtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsT3IsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbG9naWNhbE9yXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LRN, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function lRN(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { depthRadius, bias, alpha, beta } = attrs;\n    assertNotComplex(x, 'LRN');\n    const channels = x.shape[3];\n    const maxD = channels - 1;\n    const xValues = backend.data.get(x.dataId).values;\n    const size = util.sizeFromShape(x.shape);\n    const result = new Float32Array(size);\n    function sumAcrossChannels(offset) {\n        const currentChannel = offset % channels;\n        let beginSumOffset = offset - currentChannel + Math.max(0, currentChannel - depthRadius);\n        const endSumOffset = offset - currentChannel + Math.min(currentChannel + depthRadius, maxD);\n        let sum = 0.0;\n        for (; beginSumOffset <= endSumOffset; beginSumOffset++) {\n            const z = xValues[beginSumOffset];\n            sum += z * z;\n        }\n        return sum;\n    }\n    for (let offset = 0; offset < size; offset++) {\n        const sum = sumAcrossChannels(offset);\n        const val = xValues[offset] * Math.pow(bias + alpha * sum, -beta);\n        result[offset] = val;\n    }\n    return backend.makeTensorInfo(x.shape, x.dtype, result);\n}\n// tslint:disable-next-line: variable-name\nexport const LRNConfig = {\n    kernelName: LRN,\n    backendName: 'cpu',\n    kernelFunc: lRN\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9MUk4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixHQUFHLEVBQStDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3ZILE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsR0FBRyxDQUNmLElBQW1FO0lBRXJFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0MsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDNUIsTUFBTSxJQUFJLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUMxQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNoRSxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUV0QyxTQUFTLGlCQUFpQixDQUFDLE1BQWM7UUFDdkMsTUFBTSxjQUFjLEdBQUcsTUFBTSxHQUFHLFFBQVEsQ0FBQztRQUN6QyxJQUFJLGNBQWMsR0FDZCxNQUFNLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGNBQWMsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUN4RSxNQUFNLFlBQVksR0FDZCxNQUFNLEdBQUcsY0FBYyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUUzRSxJQUFJLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZCxPQUFPLGNBQWMsSUFBSSxZQUFZLEVBQUUsY0FBYyxFQUFFLEVBQUU7WUFDdkQsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ2xDLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ2Q7UUFDRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7SUFFRCxLQUFLLElBQUksTUFBTSxHQUFHLENBQUMsRUFBRSxNQUFNLEdBQUcsSUFBSSxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzVDLE1BQU0sR0FBRyxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbEUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEdBQUcsQ0FBQztLQUN0QjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELDBDQUEwQztBQUMxQyxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk4sIExSTkF0dHJzLCBMUk5JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbFJOKFxuICAgIGFyZ3M6IHtpbnB1dHM6IExSTklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBMUk5BdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtkZXB0aFJhZGl1cywgYmlhcywgYWxwaGEsIGJldGF9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnTFJOJyk7XG5cbiAgY29uc3QgY2hhbm5lbHMgPSB4LnNoYXBlWzNdO1xuICBjb25zdCBtYXhEID0gY2hhbm5lbHMgLSAxO1xuICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoc2l6ZSk7XG5cbiAgZnVuY3Rpb24gc3VtQWNyb3NzQ2hhbm5lbHMob2Zmc2V0OiBudW1iZXIpIHtcbiAgICBjb25zdCBjdXJyZW50Q2hhbm5lbCA9IG9mZnNldCAlIGNoYW5uZWxzO1xuICAgIGxldCBiZWdpblN1bU9mZnNldCA9XG4gICAgICAgIG9mZnNldCAtIGN1cnJlbnRDaGFubmVsICsgTWF0aC5tYXgoMCwgY3VycmVudENoYW5uZWwgLSBkZXB0aFJhZGl1cyk7XG4gICAgY29uc3QgZW5kU3VtT2Zmc2V0ID1cbiAgICAgICAgb2Zmc2V0IC0gY3VycmVudENoYW5uZWwgKyBNYXRoLm1pbihjdXJyZW50Q2hhbm5lbCArIGRlcHRoUmFkaXVzLCBtYXhEKTtcblxuICAgIGxldCBzdW0gPSAwLjA7XG4gICAgZm9yICg7IGJlZ2luU3VtT2Zmc2V0IDw9IGVuZFN1bU9mZnNldDsgYmVnaW5TdW1PZmZzZXQrKykge1xuICAgICAgY29uc3QgeiA9IHhWYWx1ZXNbYmVnaW5TdW1PZmZzZXRdO1xuICAgICAgc3VtICs9IHogKiB6O1xuICAgIH1cbiAgICByZXR1cm4gc3VtO1xuICB9XG5cbiAgZm9yIChsZXQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgc2l6ZTsgb2Zmc2V0KyspIHtcbiAgICBjb25zdCBzdW0gPSBzdW1BY3Jvc3NDaGFubmVscyhvZmZzZXQpO1xuICAgIGNvbnN0IHZhbCA9IHhWYWx1ZXNbb2Zmc2V0XSAqIE1hdGgucG93KGJpYXMgKyBhbHBoYSAqIHN1bSwgLWJldGEpO1xuICAgIHJlc3VsdFtvZmZzZXRdID0gdmFsO1xuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeC5zaGFwZSwgeC5kdHlwZSwgcmVzdWx0KTtcbn1cblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG5leHBvcnQgY29uc3QgTFJOQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExSTixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBsUk4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LRNGrad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function lRNGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, y, dy } = inputs;\n    const { depthRadius, bias, alpha, beta } = attrs;\n    assertNotComplex(dy, 'LRNGrad');\n    const dySize = util.sizeFromShape(dy.shape);\n    const channels = dy.shape[3];\n    const dyValues = backend.data.get(dy.dataId).values;\n    const xValues = backend.data.get(x.dataId).values;\n    const yValues = backend.data.get(y.dataId).values;\n    const result = new Float32Array(dySize);\n    const size = dySize;\n    for (let offset = 0; offset < size; offset++) {\n        const currentChannel = offset % channels;\n        const depthBegin = (offset - currentChannel) + Math.max(0, currentChannel - depthRadius);\n        const depthEnd = (offset - currentChannel) +\n            Math.min(channels, currentChannel + depthRadius + 1);\n        let norm = 0;\n        for (let k = depthBegin; k < depthEnd; k++) {\n            norm += Math.pow(xValues[k], 2);\n        }\n        norm = alpha * norm + bias;\n        for (let k = depthBegin; k < depthEnd; k++) {\n            let dyi = -2 * alpha * beta * xValues[k] * yValues[offset] / norm;\n            if (offset === k) {\n                dyi += Math.pow(norm, -beta);\n            }\n            dyi *= dyValues[offset];\n            result[k] += dyi;\n        }\n    }\n    return backend.makeTensorInfo(dy.shape, x.dtype, result);\n}\n// tslint:disable-next-line: variable-name\nexport const LRNGradConfig = {\n    kernelName: LRNGrad,\n    backendName: 'cpu',\n    kernelFunc: lRNGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOR3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTFJOR3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE9BQU8sRUFBdUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbkksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDMUIsTUFBTSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQyxnQkFBZ0IsQ0FBQyxFQUFFLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFaEMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFNUMsTUFBTSxRQUFRLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM3QixNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNsRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNoRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNoRSxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUM7SUFFcEIsS0FBSyxJQUFJLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLElBQUksRUFBRSxNQUFNLEVBQUUsRUFBRTtRQUM1QyxNQUFNLGNBQWMsR0FBRyxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3pDLE1BQU0sVUFBVSxHQUNaLENBQUMsTUFBTSxHQUFHLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLGNBQWMsR0FBRyxXQUFXLENBQUMsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxDQUFDLE1BQU0sR0FBRyxjQUFjLENBQUM7WUFDdEMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEVBQUUsY0FBYyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUV6RCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7UUFDYixLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztTQUNqQztRQUNELElBQUksR0FBRyxLQUFLLEdBQUcsSUFBSSxHQUFHLElBQUksQ0FBQztRQUUzQixLQUFLLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzFDLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssR0FBRyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDbEUsSUFBSSxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNoQixHQUFHLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQzthQUM5QjtZQUNELEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7WUFDeEIsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQztTQUNsQjtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBRUQsMENBQTBDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk5HcmFkLCBMUk5HcmFkQXR0cnMsIExSTkdyYWRJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbFJOR3JhZChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBMUk5HcmFkSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IExSTkdyYWRBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgeSwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoZHksICdMUk5HcmFkJyk7XG5cbiAgY29uc3QgZHlTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGR5LnNoYXBlKTtcblxuICBjb25zdCBjaGFubmVscyA9IGR5LnNoYXBlWzNdO1xuICBjb25zdCBkeVZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoZHlTaXplKTtcbiAgY29uc3Qgc2l6ZSA9IGR5U2l6ZTtcblxuICBmb3IgKGxldCBvZmZzZXQgPSAwOyBvZmZzZXQgPCBzaXplOyBvZmZzZXQrKykge1xuICAgIGNvbnN0IGN1cnJlbnRDaGFubmVsID0gb2Zmc2V0ICUgY2hhbm5lbHM7XG4gICAgY29uc3QgZGVwdGhCZWdpbiA9XG4gICAgICAgIChvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCkgKyBNYXRoLm1heCgwLCBjdXJyZW50Q2hhbm5lbCAtIGRlcHRoUmFkaXVzKTtcbiAgICBjb25zdCBkZXB0aEVuZCA9IChvZmZzZXQgLSBjdXJyZW50Q2hhbm5lbCkgK1xuICAgICAgICBNYXRoLm1pbihjaGFubmVscywgY3VycmVudENoYW5uZWwgKyBkZXB0aFJhZGl1cyArIDEpO1xuXG4gICAgbGV0IG5vcm0gPSAwO1xuICAgIGZvciAobGV0IGsgPSBkZXB0aEJlZ2luOyBrIDwgZGVwdGhFbmQ7IGsrKykge1xuICAgICAgbm9ybSArPSBNYXRoLnBvdyh4VmFsdWVzW2tdLCAyKTtcbiAgICB9XG4gICAgbm9ybSA9IGFscGhhICogbm9ybSArIGJpYXM7XG5cbiAgICBmb3IgKGxldCBrID0gZGVwdGhCZWdpbjsgayA8IGRlcHRoRW5kOyBrKyspIHtcbiAgICAgIGxldCBkeWkgPSAtMiAqIGFscGhhICogYmV0YSAqIHhWYWx1ZXNba10gKiB5VmFsdWVzW29mZnNldF0gLyBub3JtO1xuICAgICAgaWYgKG9mZnNldCA9PT0gaykge1xuICAgICAgICBkeWkgKz0gTWF0aC5wb3cobm9ybSwgLWJldGEpO1xuICAgICAgfVxuICAgICAgZHlpICo9IGR5VmFsdWVzW29mZnNldF07XG4gICAgICByZXN1bHRba10gKz0gZHlpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR5LnNoYXBlLCB4LmR0eXBlLCByZXN1bHQpO1xufVxuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IHZhcmlhYmxlLW5hbWVcbmV4cG9ydCBjb25zdCBMUk5HcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExSTkdyYWQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbFJOR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Max } from '@tensorflow/tfjs-core';\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { maxImpl } from './Max_impl';\nimport { transposeImpl } from './Transpose_impl';\nexport function max(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { reductionIndices, keepDims } = attrs;\n    const cpuBackend = backend;\n    let xShape = x.shape;\n    const xRank = xShape.length;\n    const origAxes = util.parseAxisParam(reductionIndices, xShape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n    let xVals = cpuBackend.data.get(x.dataId).values;\n    if (permutedAxes != null) {\n        const newShape = new Array(xRank);\n        for (let i = 0; i < newShape.length; i++) {\n            newShape[i] = xShape[permutedAxes[i]];\n        }\n        xVals = transposeImpl(xVals, xShape, x.dtype, permutedAxes, newShape);\n        axes = backend_util.getInnerMostAxes(axes.length, xRank);\n        xShape = newShape;\n    }\n    assertNotComplex(x, 'max');\n    backend_util.assertAxesAreInnerMostDims('max', axes, xRank);\n    const [maxOutShape, reduceShape] = backend_util.computeOutAndReduceShapes(xShape, axes);\n    const reduceSize = util.sizeFromShape(reduceShape);\n    const result = maxImpl(xVals, reduceSize, maxOutShape, x.dtype);\n    const dataId = cpuBackend.write(result, maxOutShape, x.dtype);\n    let outShape = maxOutShape;\n    if (keepDims) {\n        // reshape\n        const newShape = backend_util.expandShapeToKeepDim(maxOutShape, origAxes);\n        outShape = newShape;\n    }\n    return { dataId, shape: outShape, dtype: x.dtype };\n}\nexport const maxConfig = {\n    kernelName: Max,\n    backendName: 'cpu',\n    kernelFunc: max\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9NYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFhLEdBQUcsRUFBa0MsTUFBTSx1QkFBdUIsQ0FBQztBQUN2RixPQUFPLEVBQUMsWUFBWSxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFDakUsT0FBTyxFQUFhLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3ZELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUUvQyxNQUFNLFVBQVUsR0FBRyxDQUNmLElBQW1FO0lBRXJFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDM0MsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDO0lBQzNCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDckIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUU1QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQy9ELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLElBQUksS0FBSyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQ3ZDO1FBRUQsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3RFLElBQUksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV6RCxNQUFNLEdBQUcsUUFBUSxDQUFDO0tBQ25CO0lBRUQsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzNCLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzVELE1BQU0sQ0FBQyxXQUFXLEVBQUUsV0FBVyxDQUFDLEdBQzVCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVuRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUQsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDO0lBQzNCLElBQUksUUFBUSxFQUFFO1FBQ1osVUFBVTtRQUNWLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDMUUsUUFBUSxHQUFHLFFBQVEsQ0FBQztLQUNyQjtJQUVELE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQ25ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsRnVuYywgTWF4LCBNYXhBdHRycywgTWF4SW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7VHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmltcG9ydCB7bWF4SW1wbH0gZnJvbSAnLi9NYXhfaW1wbCc7XG5pbXBvcnQge3RyYW5zcG9zZUltcGx9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4KFxuICAgIGFyZ3M6IHtpbnB1dHM6IE1heElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBNYXhBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtyZWR1Y3Rpb25JbmRpY2VzLCBrZWVwRGltc30gPSBhdHRycztcbiAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQ7XG4gIGxldCB4U2hhcGUgPSB4LnNoYXBlO1xuICBjb25zdCB4UmFuayA9IHhTaGFwZS5sZW5ndGg7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKHJlZHVjdGlvbkluZGljZXMsIHhTaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgeFZhbHMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgY29uc3QgbmV3U2hhcGU6IG51bWJlcltdID0gbmV3IEFycmF5KHhSYW5rKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBuZXdTaGFwZVtpXSA9IHhTaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgIH1cblxuICAgIHhWYWxzID0gdHJhbnNwb3NlSW1wbCh4VmFscywgeFNoYXBlLCB4LmR0eXBlLCBwZXJtdXRlZEF4ZXMsIG5ld1NoYXBlKTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcblxuICAgIHhTaGFwZSA9IG5ld1NoYXBlO1xuICB9XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWF4Jyk7XG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnbWF4JywgYXhlcywgeFJhbmspO1xuICBjb25zdCBbbWF4T3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyh4U2hhcGUsIGF4ZXMpO1xuXG4gIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IG1heEltcGwoeFZhbHMsIHJlZHVjZVNpemUsIG1heE91dFNoYXBlLCB4LmR0eXBlKTtcbiAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShyZXN1bHQsIG1heE91dFNoYXBlLCB4LmR0eXBlKTtcblxuICBsZXQgb3V0U2hhcGUgPSBtYXhPdXRTaGFwZTtcbiAgaWYgKGtlZXBEaW1zKSB7XG4gICAgLy8gcmVzaGFwZVxuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1heE91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgb3V0U2hhcGUgPSBuZXdTaGFwZTtcbiAgfVxuXG4gIHJldHVybiB7ZGF0YUlkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IG1heENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXgsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbWF4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { pool } from '../utils/pool_utils';\nimport { identity } from './Identity';\nexport function maxPool(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    assertNotComplex(x, 'maxPool');\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    const dilations = 1;\n    util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n    let res;\n    if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 &&\n        util.arraysEqual(convInfo.inShape, convInfo.outShape)) {\n        res = identity({ inputs: { x }, backend });\n    }\n    else {\n        const xValues = backend.data.get(x.dataId).values;\n        const strides = util.computeStrides(x.shape);\n        const buffer = pool(xValues, x.shape, x.dtype, strides, convInfo, 'max');\n        res = backend.makeTensorInfo(convInfo.outShape, x.dtype, buffer.values);\n    }\n    return res;\n}\nexport const maxPoolConfig = {\n    kernelName: MaxPool,\n    backendName: 'cpu',\n    kernelFunc: maxPool\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWF4UG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixPQUFPLEVBQXVELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDekMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsT0FBTyxDQUNuQixJQUN5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDL0IsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUMxRCxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUM7SUFFcEIsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUMvRCxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7UUFDN0QsZUFBZSxPQUFPLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNyQyxJQUFJLEdBQWUsQ0FBQztJQUVwQixJQUFJLFFBQVEsQ0FBQyxXQUFXLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxZQUFZLEtBQUssQ0FBQztRQUN6RCxJQUFJLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1FBQ3pELEdBQUcsR0FBRyxRQUFRLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3hDO1NBQU07UUFDTCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3pFLEdBQUcsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUN4QixRQUFRLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQW9CLENBQUMsQ0FBQztLQUM5RDtJQUNELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sLCBNYXhQb29sQXR0cnMsIE1heFBvb2xJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtwb29sfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBNYXhQb29sSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IE1heFBvb2xBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ21heFBvb2wnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYmFja2VuZF91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIG1heFBvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgbGV0IHJlczogVGVuc29ySW5mbztcblxuICBpZiAoY29udkluZm8uZmlsdGVyV2lkdGggPT09IDEgJiYgY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKGNvbnZJbmZvLmluU2hhcGUsIGNvbnZJbmZvLm91dFNoYXBlKSkge1xuICAgIHJlcyA9IGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcbiAgICBjb25zdCBidWZmZXIgPSBwb29sKHhWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUsIHN0cmlkZXMsIGNvbnZJbmZvLCAnbWF4Jyk7XG4gICAgcmVzID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgY29udkluZm8ub3V0U2hhcGUsIHguZHR5cGUsIGJ1ZmZlci52YWx1ZXMgYXMgVHlwZWRBcnJheSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2xDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool3D, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { pool3d } from '../utils/pool_utils';\nexport function maxPool3D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { filterSize, strides, pad, dimRoundingMode, dataFormat } = attrs;\n    assertNotComplex(x, 'maxPool3d');\n    const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode, dataFormat);\n    const xValues = backend.data.get(x.dataId).values;\n    const outBuf = pool3d(xValues, x.shape, x.dtype, util.computeStrides(x.shape), convInfo, 'max');\n    return backend.makeTensorInfo(outBuf.shape, 'float32', outBuf.values);\n}\nexport const maxPool3DConfig = {\n    kernelName: MaxPool3D,\n    backendName: 'cpu',\n    kernelFunc: maxPool3D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9NYXhQb29sM0QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsU0FBUyxFQUEyRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd2SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRTNDLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0RSxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUN4RSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFekQsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUNqQixPQUFPLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU5RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sM0QsIE1heFBvb2wzREF0dHJzLCBNYXhQb29sM0RJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtwb29sM2R9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNEKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sM0RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogTWF4UG9vbDNEQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXR9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWF4UG9vbDNkJyk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHhWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgb3V0QnVmID0gcG9vbDNkKFxuICAgICAgeFZhbHVlcywgeC5zaGFwZSwgeC5kdHlwZSwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSwgY29udkluZm8sICdtYXgnKTtcblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsICdmbG9hdDMyJywgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sM0RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbDNELFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2wzRCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, buffer, MaxPool3DGrad } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { maxPool3dPositions } from '../utils/pool_utils';\nexport function maxPool3DGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, input } = inputs;\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    assertNotComplex([dy, input], 'maxPool3DGrad');\n    const convInfo = backend_util.computePool3DInfo(input.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode);\n    const inputBuf = backend.bufferSync(input);\n    const maxPosBuf = maxPool3dPositions(inputBuf, convInfo);\n    const strideDepth = convInfo.strideDepth;\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const dilationDepth = convInfo.dilationDepth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n    const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n    const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n    const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n    const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n    const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n    const dx = buffer(input.shape, 'float32');\n    const dyBuf = backend.bufferSync(dy);\n    for (let batch = 0; batch < convInfo.batchSize; ++batch) {\n        for (let channel = 0; channel < convInfo.inChannels; ++channel) {\n            for (let dxDepth = 0; dxDepth < convInfo.inDepth; ++dxDepth) {\n                for (let dxRow = 0; dxRow < convInfo.inHeight; ++dxRow) {\n                    for (let dxCol = 0; dxCol < convInfo.inWidth; ++dxCol) {\n                        // Shader code begins\n                        const dyDepthCorner = dxDepth - padFront;\n                        const dyRowCorner = dxRow - padTop;\n                        const dyColCorner = dxCol - padLeft;\n                        let dotProd = 0;\n                        for (let wDepth = 0; wDepth < effectiveFilterDepth; wDepth += dilationDepth) {\n                            const dyDepth = (dyDepthCorner + wDepth) / strideDepth;\n                            if (dyDepth < 0 || dyDepth >= convInfo.outDepth ||\n                                Math.floor(dyDepth) !== dyDepth) {\n                                continue;\n                            }\n                            for (let wRow = 0; wRow < effectiveFilterHeight; wRow += dilationHeight) {\n                                const dyRow = (dyRowCorner + wRow) / strideHeight;\n                                if (dyRow < 0 || dyRow >= convInfo.outHeight ||\n                                    Math.floor(dyRow) !== dyRow) {\n                                    continue;\n                                }\n                                for (let wCol = 0; wCol < effectiveFilterWidth; wCol += dilationWidth) {\n                                    const dyCol = (dyColCorner + wCol) / strideWidth;\n                                    if (dyCol < 0 || dyCol >= convInfo.outWidth ||\n                                        Math.floor(dyCol) !== dyCol) {\n                                        continue;\n                                    }\n                                    const maxPos = effectiveFilterDepth * effectiveFilterHeight *\n                                        effectiveFilterWidth -\n                                        1 -\n                                        maxPosBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n                                    const curPos = wDepth * effectiveFilterHeight * effectiveFilterWidth +\n                                        wRow * effectiveFilterWidth + wCol;\n                                    const mask = maxPos === curPos ? 1 : 0;\n                                    if (mask === 0) {\n                                        continue;\n                                    }\n                                    const pixel = dyBuf.get(batch, dyDepth, dyRow, dyCol, channel);\n                                    dotProd += pixel * mask;\n                                }\n                            }\n                        }\n                        dx.set(dotProd, batch, dxDepth, dxRow, dxCol, channel);\n                    }\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const maxPool3DGradConfig = {\n    kernelName: MaxPool3DGrad,\n    backendName: 'cpu',\n    kernelFunc: maxPool3DGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNER3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWF4UG9vbDNER3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBNEIsYUFBYSxFQUE0RCxNQUFNLHVCQUF1QixDQUFDO0FBRy9KLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUV2RCxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFMUQsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFL0MsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxLQUFLLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQ25FLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLE1BQU0sU0FBUyxHQUFHLGtCQUFrQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUN6RCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO0lBQ3pD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SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgYnVmZmVyLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2wzREdyYWQsIE1heFBvb2wzREdyYWRBdHRycywgTWF4UG9vbDNER3JhZElucHV0cywgUmFuaywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge21heFBvb2wzZFBvc2l0aW9uc30gZnJvbSAnLi4vdXRpbHMvcG9vbF91dGlscyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sM0RHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sM0RHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IE1heFBvb2wzREdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbnB1dF0sICdtYXhQb29sM0RHcmFkJyk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICBpbnB1dC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLFxuICAgICAgc3RyaWRlcywgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcblxuICBjb25zdCBpbnB1dEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhpbnB1dCk7XG4gIGNvbnN0IG1heFBvc0J1ZiA9IG1heFBvb2wzZFBvc2l0aW9ucyhpbnB1dEJ1ZiwgY29udkluZm8pO1xuICBjb25zdCBzdHJpZGVEZXB0aCA9IGNvbnZJbmZvLnN0cmlkZURlcHRoO1xuICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gIGNvbnN0IGRpbGF0aW9uRGVwdGggPSBjb252SW5mby5kaWxhdGlvbkRlcHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVyRGVwdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJEZXB0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgY29uc3QgZHggPSBidWZmZXIoaW5wdXQuc2hhcGUsICdmbG9hdDMyJyk7XG5cbiAgY29uc3QgZHlCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmM8UmFuaywgJ2Zsb2F0MzInPihkeSk7XG5cbiAgZm9yIChsZXQgYmF0Y2ggPSAwOyBiYXRjaCA8IGNvbnZJbmZvLmJhdGNoU2l6ZTsgKytiYXRjaCkge1xuICAgIGZvciAobGV0IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY29udkluZm8uaW5DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICBmb3IgKGxldCBkeERlcHRoID0gMDsgZHhEZXB0aCA8IGNvbnZJbmZvLmluRGVwdGg7ICsrZHhEZXB0aCkge1xuICAgICAgICBmb3IgKGxldCBkeFJvdyA9IDA7IGR4Um93IDwgY29udkluZm8uaW5IZWlnaHQ7ICsrZHhSb3cpIHtcbiAgICAgICAgICBmb3IgKGxldCBkeENvbCA9IDA7IGR4Q29sIDwgY29udkluZm8uaW5XaWR0aDsgKytkeENvbCkge1xuICAgICAgICAgICAgLy8gU2hhZGVyIGNvZGUgYmVnaW5zXG4gICAgICAgICAgICBjb25zdCBkeURlcHRoQ29ybmVyID0gZHhEZXB0aCAtIHBhZEZyb250O1xuICAgICAgICAgICAgY29uc3QgZHlSb3dDb3JuZXIgPSBkeFJvdyAtIHBhZFRvcDtcbiAgICAgICAgICAgIGNvbnN0IGR5Q29sQ29ybmVyID0gZHhDb2wgLSBwYWRMZWZ0O1xuICAgICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgICAgZm9yIChsZXQgd0RlcHRoID0gMDsgd0RlcHRoIDwgZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgICAgICAgICAgICAgIHdEZXB0aCArPSBkaWxhdGlvbkRlcHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR5RGVwdGggPSAoZHlEZXB0aENvcm5lciArIHdEZXB0aCkgLyBzdHJpZGVEZXB0aDtcbiAgICAgICAgICAgICAgaWYgKGR5RGVwdGggPCAwIHx8IGR5RGVwdGggPj0gY29udkluZm8ub3V0RGVwdGggfHxcbiAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlEZXB0aCkgIT09IGR5RGVwdGgpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBmb3IgKGxldCB3Um93ID0gMDsgd1JvdyA8IGVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICAgICAgICAgICAgICAgICB3Um93ICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZHlSb3cgPSAoZHlSb3dDb3JuZXIgKyB3Um93KSAvIHN0cmlkZUhlaWdodDtcbiAgICAgICAgICAgICAgICBpZiAoZHlSb3cgPCAwIHx8IGR5Um93ID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5Um93KSAhPT0gZHlSb3cpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCB3Q29sID0gMDsgd0NvbCA8IGVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgd0NvbCArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBkeUNvbCA9IChkeUNvbENvcm5lciArIHdDb2wpIC8gc3RyaWRlV2lkdGg7XG4gICAgICAgICAgICAgICAgICBpZiAoZHlDb2wgPCAwIHx8IGR5Q29sID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihkeUNvbCkgIT09IGR5Q29sKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAqIGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC1cbiAgICAgICAgICAgICAgICAgICAgICAxIC1cbiAgICAgICAgICAgICAgICAgICAgICAobWF4UG9zQnVmLmdldChiYXRjaCwgZHlEZXB0aCwgZHlSb3csIGR5Q29sLCBjaGFubmVsKSBhc1xuICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgY3VyUG9zID1cbiAgICAgICAgICAgICAgICAgICAgICB3RGVwdGggKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArXG4gICAgICAgICAgICAgICAgICAgICAgd1JvdyAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoICsgd0NvbDtcblxuICAgICAgICAgICAgICAgICAgY29uc3QgbWFzayA9IG1heFBvcyA9PT0gY3VyUG9zID8gMSA6IDA7XG4gICAgICAgICAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPVxuICAgICAgICAgICAgICAgICAgICAgIGR5QnVmLmdldChiYXRjaCwgZHlEZXB0aCwgZHlSb3csIGR5Q29sLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gcGl4ZWwgKiBtYXNrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHguc2V0KGRvdFByb2QsIGJhdGNoLCBkeERlcHRoLCBkeFJvdywgZHhDb2wsIGNoYW5uZWwpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGR4LnNoYXBlLCBkeC5kdHlwZSwgZHgudmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2wzREdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbDNER3JhZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sM0RHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, buffer, MaxPoolGrad } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { maxPoolPositions } from '../utils/pool_utils';\nexport function maxPoolGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, input, output } = inputs;\n    const x = input;\n    assertNotComplex([input, output], 'maxPoolGrad');\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode);\n    const xValues = backend.data.get(x.dataId).values;\n    const maxPosBuf = buffer(convInfo.outShape, x.dtype, maxPoolPositions(xValues, x.shape, x.dtype, convInfo).values);\n    const strideHeight = convInfo.strideHeight;\n    const strideWidth = convInfo.strideWidth;\n    const dilationHeight = convInfo.dilationHeight;\n    const dilationWidth = convInfo.dilationWidth;\n    const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n    const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n    const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n    const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n    const dx = buffer(x.shape, 'float32');\n    const dyData = backend.data.get(dy.dataId).values;\n    const dyBuf = buffer(dy.shape, 'float32', dyData);\n    for (let b = 0; b < convInfo.batchSize; ++b) {\n        for (let d = 0; d < convInfo.inChannels; ++d) {\n            for (let dxR = 0; dxR < convInfo.inHeight; ++dxR) {\n                for (let dxC = 0; dxC < convInfo.inWidth; ++dxC) {\n                    // Shader code begins.\n                    const dyRCorner = dxR - padTop;\n                    const dyCCorner = dxC - padLeft;\n                    let dotProd = 0;\n                    for (let wR = 0; wR < effectiveFilterHeight; wR += dilationHeight) {\n                        const dyR = (dyRCorner + wR) / strideHeight;\n                        if (dyR < 0 || dyR >= convInfo.outHeight ||\n                            Math.floor(dyR) !== dyR) {\n                            continue;\n                        }\n                        for (let wC = 0; wC < effectiveFilterWidth; wC += dilationWidth) {\n                            const dyC = (dyCCorner + wC) / strideWidth;\n                            if (dyC < 0 || dyC >= convInfo.outWidth ||\n                                Math.floor(dyC) !== dyC) {\n                                continue;\n                            }\n                            const maxPos = effectiveFilterHeight * effectiveFilterWidth - 1 -\n                                maxPosBuf.get(b, dyR, dyC, d);\n                            const curPos = wR * effectiveFilterWidth + wC;\n                            const mask = maxPos === curPos ? 1 : 0;\n                            if (mask === 0) {\n                                continue;\n                            }\n                            const pixel = dyBuf.get(b, dyR, dyC, d);\n                            dotProd += pixel * mask;\n                        }\n                    }\n                    dx.set(dotProd, b, dxR, dxC, d);\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(dx.shape, dx.dtype, dx.values);\n}\nexport const maxPoolGradConfig = {\n    kernelName: MaxPoolGrad,\n    backendName: 'cpu',\n    kernelFunc: maxPoolGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbEdyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL01heFBvb2xHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQUUsTUFBTSxFQUE0QixXQUFXLEVBQW9FLE1BQU0sdUJBQXVCLENBQUM7QUFHckssT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoQixnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTFELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0MsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDaEUsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUNwQixRQUFR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O2dDQUMxRCxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBWSxDQUFDOzRCQUM5QyxNQUFNLE1BQU0sR0FBRyxFQUFFLEdBQUcsb0JBQW9CLEdBQUcsRUFBRSxDQUFDOzRCQUU5QyxNQUFNLElBQUksR0FBRyxNQUFNLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzs0QkFDdkMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO2dDQUNkLFNBQVM7NkJBQ1Y7NEJBRUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FBQzs0QkFDeEMsT0FBTyxJQUFJLEtBQUssR0FBRyxJQUFJLENBQUM7eUJBQ3pCO3FCQUNGO29CQUNELEVBQUUsQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7S0FDRjtJQUNELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgYnVmZmVyLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2xHcmFkLCBNYXhQb29sR3JhZEF0dHJzLCBNYXhQb29sR3JhZElucHV0cywgUmFuaywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge21heFBvb2xQb3NpdGlvbnN9IGZyb20gJy4uL3V0aWxzL3Bvb2xfdXRpbHMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbEdyYWQoYXJnczoge1xuICBpbnB1dHM6IE1heFBvb2xHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IE1heFBvb2xHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dCwgb3V0cHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBhc3NlcnROb3RDb21wbGV4KFtpbnB1dCwgb3V0cHV0XSwgJ21heFBvb2xHcmFkJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IG1heFBvc0J1ZiA9IGJ1ZmZlcihcbiAgICAgIGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlLFxuICAgICAgbWF4UG9vbFBvc2l0aW9ucyh4VmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBjb252SW5mbykudmFsdWVzKTtcbiAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gIGNvbnN0IGR4ID1cbiAgICAgIGJ1ZmZlcjxSYW5rLlI0Pih4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGR5RGF0YSA9IGJhY2tlbmQuZGF0YS5nZXQoZHkuZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICBjb25zdCBkeUJ1ZiA9IGJ1ZmZlcjxSYW5rLlI0PihcbiAgICAgIGR5LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCAnZmxvYXQzMicsIGR5RGF0YSk7XG5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBjb252SW5mby5iYXRjaFNpemU7ICsrYikge1xuICAgIGZvciAobGV0IGQgPSAwOyBkIDwgY29udkluZm8uaW5DaGFubmVsczsgKytkKSB7XG4gICAgICBmb3IgKGxldCBkeFIgPSAwOyBkeFIgPCBjb252SW5mby5pbkhlaWdodDsgKytkeFIpIHtcbiAgICAgICAgZm9yIChsZXQgZHhDID0gMDsgZHhDIDwgY29udkluZm8uaW5XaWR0aDsgKytkeEMpIHtcbiAgICAgICAgICAvLyBTaGFkZXIgY29kZSBiZWdpbnMuXG4gICAgICAgICAgY29uc3QgZHlSQ29ybmVyID0gZHhSIC0gcGFkVG9wO1xuICAgICAgICAgIGNvbnN0IGR5Q0Nvcm5lciA9IGR4QyAtIHBhZExlZnQ7XG4gICAgICAgICAgbGV0IGRvdFByb2QgPSAwO1xuICAgICAgICAgIGZvciAobGV0IHdSID0gMDsgd1IgPCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7IHdSICs9IGRpbGF0aW9uSGVpZ2h0KSB7XG4gICAgICAgICAgICBjb25zdCBkeVIgPSAoZHlSQ29ybmVyICsgd1IpIC8gc3RyaWRlSGVpZ2h0O1xuICAgICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49IGNvbnZJbmZvLm91dEhlaWdodCB8fFxuICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoZHlSKSAhPT0gZHlSKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChsZXQgd0MgPSAwOyB3QyA8IGVmZmVjdGl2ZUZpbHRlcldpZHRoOyB3QyArPSBkaWxhdGlvbldpZHRoKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGR5QyA9IChkeUNDb3JuZXIgKyB3QykgLyBzdHJpZGVXaWR0aDtcbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IGNvbnZJbmZvLm91dFdpZHRoIHx8XG4gICAgICAgICAgICAgICAgICBNYXRoLmZsb29yKGR5QykgIT09IGR5Qykge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtXG4gICAgICAgICAgICAgICAgICAobWF4UG9zQnVmLmdldChiLCBkeVIsIGR5QywgZCkgYXMgbnVtYmVyKTtcbiAgICAgICAgICAgICAgY29uc3QgY3VyUG9zID0gd1IgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCArIHdDO1xuXG4gICAgICAgICAgICAgIGNvbnN0IG1hc2sgPSBtYXhQb3MgPT09IGN1clBvcyA/IDEgOiAwO1xuICAgICAgICAgICAgICBpZiAobWFzayA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgcGl4ZWwgPSBkeUJ1Zi5nZXQoYiwgZHlSLCBkeUMsIGQpO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9IHBpeGVsICogbWFzaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZHguc2V0KGRvdFByb2QsIGIsIGR4UiwgZHhDLCBkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkeC5zaGFwZSwgZHguZHR5cGUsIGR4LnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sR3JhZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBtYXhQb29sR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { maxPoolPositions, pool } from '../utils/pool_utils';\nexport function maxPoolWithArgmaxImpl(xValues, xShape, dtype, includeBatchInIndex, convInfo) {\n    const strides = util.computeStrides(xShape);\n    const maxPools = pool(xValues, xShape, dtype, strides, convInfo, 'max');\n    const maxPositions = maxPoolPositions(xValues, xShape, dtype, convInfo, true, includeBatchInIndex);\n    return [maxPools.values, maxPositions.values];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQXFDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRS9FLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUMzRCxNQUFNLFVBQVUscUJBQXFCLENBQ2pDLE9BQW1CLEVBQUUsTUFBZ0IsRUFBRSxLQUFlLEVBQ3RELG1CQUE0QixFQUFFLFFBQWlDO0lBQ2pFLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDNUMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEUsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQ2pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUVqRSxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDaEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhVHlwZSwgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHttYXhQb29sUG9zaXRpb25zLCBwb29sfSBmcm9tICcuLi91dGlscy9wb29sX3V0aWxzJztcbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sV2l0aEFyZ21heEltcGwoXG4gICAgeFZhbHVlczogVHlwZWRBcnJheSwgeFNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlLFxuICAgIGluY2x1ZGVCYXRjaEluSW5kZXg6IGJvb2xlYW4sIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICBjb25zdCBzdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4U2hhcGUpO1xuICBjb25zdCBtYXhQb29scyA9IHBvb2woeFZhbHVlcywgeFNoYXBlLCBkdHlwZSwgc3RyaWRlcywgY29udkluZm8sICdtYXgnKTtcbiAgY29uc3QgbWF4UG9zaXRpb25zID0gbWF4UG9vbFBvc2l0aW9ucyhcbiAgICAgIHhWYWx1ZXMsIHhTaGFwZSwgZHR5cGUsIGNvbnZJbmZvLCB0cnVlLCBpbmNsdWRlQmF0Y2hJbkluZGV4KTtcblxuICByZXR1cm4gW21heFBvb2xzLnZhbHVlcywgbWF4UG9zaXRpb25zLnZhbHVlc107XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MaxPoolWithArgmax } from '@tensorflow/tfjs-core';\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { maxPoolWithArgmaxImpl } from './MaxPoolWithArgmax_impl';\nexport const maxPoolWithArgmaxConfig = {\n    kernelName: MaxPoolWithArgmax,\n    backendName: 'cpu',\n    kernelFunc: ({ inputs, attrs, backend }) => {\n        const { x } = inputs;\n        const { filterSize, strides, pad, includeBatchInIndex } = attrs;\n        const cpuBackend = backend;\n        assertNotComplex(x, 'MaxPoolWithArgmax');\n        const values = cpuBackend.data.get(x.dataId).values;\n        const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, [1, 1], pad);\n        const [pooled, indexes] = maxPoolWithArgmaxImpl(values, x.shape, x.dtype, includeBatchInIndex, convInfo);\n        const pooledDataId = cpuBackend.write(pooled, convInfo.outShape, x.dtype);\n        const indexesDataId = cpuBackend.write(indexes, convInfo.outShape, x.dtype);\n        return [\n            { dataId: pooledDataId, shape: convInfo.outShape, dtype: x.dtype },\n            { dataId: indexesDataId, shape: convInfo.outShape, dtype: 'int32' }\n        ];\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbFdpdGhBcmdtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxpQkFBaUIsRUFBa0QsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RyxPQUFPLEVBQUMsWUFBWSxFQUEyQixNQUFNLHVCQUF1QixDQUFDO0FBRTdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUUvRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUI7SUFDbkQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBaUMsQ0FBQztRQUM5QyxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsbUJBQW1CLEVBQUMsR0FDakQsS0FBcUMsQ0FBQztRQUMxQyxNQUFNLFVBQVUsR0FBRyxPQUF5QixDQUFDO1FBQzdDLGdCQUFnQixDQUFDLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO1FBRXpDLE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO1FBQ2xFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakIsTUFBTSxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsR0FBRyxxQkFBcUIsQ0FDM0MsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUU3RCxNQUFNLFlBQVksR0FDZCxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQXNCLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDekUsTUFBTSxhQUFhLEdBQ2YsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFxQixFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hFLE9BQU87WUFDTCxFQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUM7WUFDaEUsRUFBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUM7U0FDbEUsQ0FBQztJQUNKLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge01heFBvb2xXaXRoQXJnbWF4LCBNYXhQb29sV2l0aEFyZ21heEF0dHJzLCBNYXhQb29sV2l0aEFyZ21heElucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuaW1wb3J0IHttYXhQb29sV2l0aEFyZ21heEltcGx9IGZyb20gJy4vTWF4UG9vbFdpdGhBcmdtYXhfaW1wbCc7XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sV2l0aEFyZ21heENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sV2l0aEFyZ21heCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiAoe2lucHV0cywgYXR0cnMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge3h9ID0gaW5wdXRzIGFzIE1heFBvb2xXaXRoQXJnbWF4SW5wdXRzO1xuICAgIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGluY2x1ZGVCYXRjaEluSW5kZXh9ID1cbiAgICAgICAgYXR0cnMgYXMge30gYXMgTWF4UG9vbFdpdGhBcmdtYXhBdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcbiAgICBhc3NlcnROb3RDb21wbGV4KHgsICdNYXhQb29sV2l0aEFyZ21heCcpO1xuXG4gICAgY29uc3QgdmFsdWVzID0gY3B1QmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICAgIFsxLCAxXSwgcGFkKTtcbiAgICBjb25zdCBbcG9vbGVkLCBpbmRleGVzXSA9IG1heFBvb2xXaXRoQXJnbWF4SW1wbChcbiAgICAgICAgdmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBpbmNsdWRlQmF0Y2hJbkluZGV4LCBjb252SW5mbyk7XG5cbiAgICBjb25zdCBwb29sZWREYXRhSWQgPVxuICAgICAgICBjcHVCYWNrZW5kLndyaXRlKHBvb2xlZCBhcyBGbG9hdDMyQXJyYXksIGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBpbmRleGVzRGF0YUlkID1cbiAgICAgICAgY3B1QmFja2VuZC53cml0ZShpbmRleGVzIGFzIEludDMyQXJyYXksIGNvbnZJbmZvLm91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gW1xuICAgICAge2RhdGFJZDogcG9vbGVkRGF0YUlkLCBzaGFwZTogY29udkluZm8ub3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlfSxcbiAgICAgIHtkYXRhSWQ6IGluZGV4ZXNEYXRhSWQsIHNoYXBlOiBjb252SW5mby5vdXRTaGFwZSwgZHR5cGU6ICdpbnQzMid9XG4gICAgXTtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Mean, util } from '@tensorflow/tfjs-core';\nimport { cast } from './Cast';\nimport { div } from './RealDiv';\nimport { sum } from './Sum';\nexport function mean(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    const axes = util.parseAxisParam(axis, x.shape);\n    const shapes = backend_util.computeOutAndReduceShapes(x.shape, axes);\n    const reduceShape = shapes[1];\n    const reduceSize = util.sizeFromShape(reduceShape);\n    const toDispose = [];\n    const reduceSizeScalar = backend.makeTensorInfo([], 'float32', new Float32Array([reduceSize]));\n    toDispose.push(reduceSizeScalar);\n    const $x = cast({ inputs: { x }, backend, attrs: { dtype: 'float32' } });\n    toDispose.push($x);\n    const res = div({ inputs: { a: $x, b: reduceSizeScalar }, backend });\n    toDispose.push(res);\n    const result = sum({ inputs: { x: res }, backend, attrs: { axis, keepDims } });\n    toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return result;\n}\nexport const meanConfig = {\n    kernelName: Mean,\n    backendName: 'cpu',\n    kernelFunc: mean\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTWVhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixJQUFJLEVBQXFDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUM5QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE1BQU0sVUFBVSxJQUFJLENBQ2hCLElBQXFFO0lBRXZFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRS9CLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLE1BQU0sR0FBRyxZQUFZLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNyRSxNQUFNLFdBQVcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDOUIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFDckIsTUFBTSxnQkFBZ0IsR0FDbEIsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksWUFBWSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVqQyxNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFNBQVMsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUNuRSxTQUFTLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBRW5CLE1BQU0sR0FBRyxHQUNMLEdBQUcsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUN2RSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUV6RSxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1lYW4sIE1lYW5BdHRycywgTWVhbklucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHtjYXN0fSBmcm9tICcuL0Nhc3QnO1xuaW1wb3J0IHtkaXZ9IGZyb20gJy4vUmVhbERpdic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9TdW0nO1xuXG5leHBvcnQgZnVuY3Rpb24gbWVhbihcbiAgICBhcmdzOiB7aW5wdXRzOiBNZWFuSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IE1lYW5BdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgY29uc3Qgc2hhcGVzID0gYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMoeC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IHJlZHVjZVNoYXBlID0gc2hhcGVzWzFdO1xuICBjb25zdCByZWR1Y2VTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG4gIGNvbnN0IHJlZHVjZVNpemVTY2FsYXIgPVxuICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2Zsb2F0MzInLCBuZXcgRmxvYXQzMkFycmF5KFtyZWR1Y2VTaXplXSkpO1xuICB0b0Rpc3Bvc2UucHVzaChyZWR1Y2VTaXplU2NhbGFyKTtcblxuICBjb25zdCAkeCA9IGNhc3Qoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2R0eXBlOiAnZmxvYXQzMid9fSk7XG4gIHRvRGlzcG9zZS5wdXNoKCR4KTtcblxuICBjb25zdCByZXMgPVxuICAgICAgZGl2KHtpbnB1dHM6IHthOiAkeCwgYjogcmVkdWNlU2l6ZVNjYWxhcn0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICB0b0Rpc3Bvc2UucHVzaChyZXMpO1xuXG4gIGNvbnN0IHJlc3VsdCA9IHN1bSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtheGlzLCBrZWVwRGltc319KTtcblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBtZWFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1lYW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbWVhbiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Min, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function min(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    assertNotComplex(x, 'min');\n    const origAxes = util.parseAxisParam(axis, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n    let $x = x;\n    if (permutedAxes != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        axes = backend_util.getInnerMostAxes(axes.length, x.shape.length);\n    }\n    backend_util.assertAxesAreInnerMostDims('min', axes, $x.shape.length);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes($x.shape, axes);\n    const reduceSize = util.sizeFromShape(reduceShape);\n    const vals = util.makeZerosTypedArray(util.sizeFromShape(outShape), $x.dtype);\n    const aVals = backend.data.get($x.dataId).values;\n    for (let i = 0; i < vals.length; ++i) {\n        const offset = i * reduceSize;\n        let min = aVals[offset];\n        for (let j = 0; j < reduceSize; ++j) {\n            const value = aVals[offset + j];\n            if (Number.isNaN(value) ||\n                value < min) { // comparison with NaN always return false\n                min = value;\n            }\n        }\n        vals[i] = min;\n    }\n    if (permutedAxes != null) {\n        backend.disposeIntermediateTensorInfo($x);\n    }\n    const result = backend.makeTensorInfo(outShape, $x.dtype, vals);\n    if (keepDims) {\n        const expandedShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n        const reshapedResult = reshape({ inputs: { x: result }, backend, attrs: { shape: expandedShape } });\n        backend.disposeIntermediateTensorInfo(result);\n        return reshapedResult;\n    }\n    return result;\n}\nexport const minConfig = {\n    kernelName: Min,\n    backendName: 'cpu',\n    kernelFunc: min\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9NaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsR0FBRyxFQUErQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBbUU7SUFFckUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNwRCxJQUFJLElBQUksR0FBRyxRQUFRLENBQUM7SUFDcEIsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzNFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNYLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixFQUFFLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDcEUsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkU7SUFFRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLEdBQ3pCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDbkQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlFLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQy9ELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDOUIsSUFBSSxHQUFHLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDbkMsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNoQyxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO2dCQUNuQixLQUFLLEdBQUcsR0FBRyxFQUFFLEVBQUcsMENBQTBDO2dCQUM1RCxHQUFHLEdBQUcsS0FBSyxDQUFDO2FBQ2I7U0FDRjtRQUNELElBQUksQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7S0FDZjtJQUVELElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRSxDQUFDLENBQUM7S0FDM0M7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBRWhFLElBQUksUUFBUSxFQUFFO1FBQ1osTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBRTNFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QyxPQUFPLGNBQWMsQ0FBQztLQUN2QjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLEdBQXVCO0NBQ3BDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1pbiwgTWluQXR0cnMsIE1pbklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWluKFxuICAgIGFyZ3M6IHtpbnB1dHM6IE1pbklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBNaW5BdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICdtaW4nKTtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICBsZXQgJHggPSB4O1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAkeCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeC5zaGFwZS5sZW5ndGgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdtaW4nLCBheGVzLCAkeC5zaGFwZS5sZW5ndGgpO1xuICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcygkeC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IHJlZHVjZVNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuICBjb25zdCB2YWxzID0gdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSksICR4LmR0eXBlKTtcblxuICBjb25zdCBhVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoJHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWxzLmxlbmd0aDsgKytpKSB7XG4gICAgY29uc3Qgb2Zmc2V0ID0gaSAqIHJlZHVjZVNpemU7XG4gICAgbGV0IG1pbiA9IGFWYWxzW29mZnNldF07XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCByZWR1Y2VTaXplOyArK2opIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gYVZhbHNbb2Zmc2V0ICsgal07XG4gICAgICBpZiAoTnVtYmVyLmlzTmFOKHZhbHVlKSB8fFxuICAgICAgICAgIHZhbHVlIDwgbWluKSB7ICAvLyBjb21wYXJpc29uIHdpdGggTmFOIGFsd2F5cyByZXR1cm4gZmFsc2VcbiAgICAgICAgbWluID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHZhbHNbaV0gPSBtaW47XG4gIH1cblxuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKCR4KTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsICR4LmR0eXBlLCB2YWxzKTtcblxuICBpZiAoa2VlcERpbXMpIHtcbiAgICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgY29uc3QgcmVzaGFwZWRSZXN1bHQgPVxuICAgICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBleHBhbmRlZFNoYXBlfX0pO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuXG4gICAgcmV0dXJuIHJlc2hhcGVkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IG1pbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbWluIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MirrorPad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function mirrorPad(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { paddings, mode } = attrs;\n    assertNotComplex(x, 'mirrorPad');\n    const outShape = paddings.map((p, i) => p[0] /* beforePad */ + x.shape[i] + p[1] /* afterPad */);\n    const start = paddings.map(p => p[0]);\n    const end = paddings.map((p, i) => p[0] + x.shape[i]);\n    const offset = mode === 'reflect' ? 0 : 1;\n    const xVals = backend.data.get(x.dataId).values;\n    const xRank = x.shape.length;\n    const xStrides = util.computeStrides(x.shape);\n    const resultSize = util.sizeFromShape(outShape);\n    const resultRank = outShape.length;\n    const resultStrides = util.computeStrides(outShape);\n    const resVals = util.getTypedArrayFromDType(x.dtype, resultSize);\n    for (let i = 0; i < resultSize; i++) {\n        let coords = util.indexToLoc(i, resultRank, resultStrides);\n        for (let i = 0; i < resultRank; i++) {\n            if (coords[i] < start[i]) {\n                coords[i] = start[i] * 2 - coords[i] - offset;\n            }\n            else if (coords[i] >= end[i]) {\n                coords[i] = (end[i] - 1) * 2 - coords[i] + offset;\n            }\n        }\n        coords = coords.map((c, i) => c - start[i]);\n        const inIndex = util.locToIndex(coords, xRank, xStrides);\n        resVals[i] = xVals[inIndex];\n    }\n    const outId = backend.write(resVals, outShape, x.dtype);\n    return { dataId: outId, shape: outShape, dtype: x.dtype };\n}\nexport const mirrorPadConfig = {\n    kernelName: MirrorPad,\n    backendName: 'cpu',\n    kernelFunc: mirrorPad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlycm9yUGFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9NaXJyb3JQYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixTQUFTLEVBQTRFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzFKLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFFBQVEsRUFBRSxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRWpDLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV2RSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEMsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFMUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsTUFBTSxPQUFPLEdBQ1QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUF3QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRXhFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsVUFBVSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBQzNELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxVQUFVLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbkMsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUN4QixNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQy9DO2lCQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtnQkFDOUIsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDO2FBQ25EO1NBQ0Y7UUFDRCxNQUFNLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFekQsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztLQUM3QjtJQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWlycm9yUGFkLCBNaXJyb3JQYWRBdHRycywgTWlycm9yUGFkSW5wdXRzLCBOdW1lcmljRGF0YVR5cGUsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWlycm9yUGFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNaXJyb3JQYWRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogTWlycm9yUGFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7cGFkZGluZ3MsIG1vZGV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnbWlycm9yUGFkJyk7XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4LnNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG5cbiAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKTtcbiAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeC5zaGFwZVtpXSk7XG4gIGNvbnN0IG9mZnNldCA9IG1vZGUgPT09ICdyZWZsZWN0JyA/IDAgOiAxO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHhTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKTtcblxuICBjb25zdCByZXN1bHRTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKTtcbiAgY29uc3QgcmVzdWx0UmFuayA9IG91dFNoYXBlLmxlbmd0aDtcbiAgY29uc3QgcmVzdWx0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpO1xuICBjb25zdCByZXNWYWxzID1cbiAgICAgIHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZSh4LmR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgcmVzdWx0U2l6ZSk7XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHRTaXplOyBpKyspIHtcbiAgICBsZXQgY29vcmRzID0gdXRpbC5pbmRleFRvTG9jKGksIHJlc3VsdFJhbmssIHJlc3VsdFN0cmlkZXMpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0UmFuazsgaSsrKSB7XG4gICAgICBpZiAoY29vcmRzW2ldIDwgc3RhcnRbaV0pIHtcbiAgICAgICAgY29vcmRzW2ldID0gc3RhcnRbaV0gKiAyIC0gY29vcmRzW2ldIC0gb2Zmc2V0O1xuICAgICAgfSBlbHNlIGlmIChjb29yZHNbaV0gPj0gZW5kW2ldKSB7XG4gICAgICAgIGNvb3Jkc1tpXSA9IChlbmRbaV0gLSAxKSAqIDIgLSBjb29yZHNbaV0gKyBvZmZzZXQ7XG4gICAgICB9XG4gICAgfVxuICAgIGNvb3JkcyA9IGNvb3Jkcy5tYXAoKGMsIGkpID0+IGMgLSBzdGFydFtpXSk7XG5cbiAgICBjb25zdCBpbkluZGV4ID0gdXRpbC5sb2NUb0luZGV4KGNvb3JkcywgeFJhbmssIHhTdHJpZGVzKTtcblxuICAgIHJlc1ZhbHNbaV0gPSB4VmFsc1tpbkluZGV4XTtcbiAgfVxuXG4gIGNvbnN0IG91dElkID0gYmFja2VuZC53cml0ZShyZXNWYWxzLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IG91dElkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IG1pcnJvclBhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNaXJyb3JQYWQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbWlycm9yUGFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Mod } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const modImpl = createSimpleBinaryKernelImpl(((aValue, bValue) => {\n    const rem = aValue % bValue;\n    if ((aValue < 0 && bValue < 0) || (aValue >= 0 && bValue >= 0)) {\n        return rem;\n    }\n    else {\n        return (rem + bValue) % bValue;\n    }\n}));\nexport const mod = binaryKernelFunc(Mod, modImpl);\nexport const modConfig = {\n    kernelName: Mod,\n    backendName: 'cpu',\n    kernelFunc: mod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Nb2QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFDLE1BQWMsRUFBRSxNQUFjLEVBQUUsRUFBRTtJQUMvRCxNQUFNLEdBQUcsR0FBRyxNQUFNLEdBQUcsTUFBTSxDQUFDO0lBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxFQUFFO1FBQzlELE9BQU8sR0FBRyxDQUFDO0tBQ1o7U0FBTTtRQUNMLE9BQU8sQ0FBQyxHQUFHLEdBQUcsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDO0tBQ2hDO0FBQ0gsQ0FBQyxDQUFDLENBQUMsQ0FBQztBQUVSLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUFHO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBNb2R9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgbW9kSW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoKGFWYWx1ZTogbnVtYmVyLCBiVmFsdWU6IG51bWJlcikgPT4ge1xuICAgICAgY29uc3QgcmVtID0gYVZhbHVlICUgYlZhbHVlO1xuICAgICAgaWYgKChhVmFsdWUgPCAwICYmIGJWYWx1ZSA8IDApIHx8IChhVmFsdWUgPj0gMCAmJiBiVmFsdWUgPj0gMCkpIHtcbiAgICAgICAgcmV0dXJuIHJlbTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAocmVtICsgYlZhbHVlKSAlIGJWYWx1ZTtcbiAgICAgIH1cbiAgICB9KSk7XG5cbmV4cG9ydCBjb25zdCBtb2QgPSBiaW5hcnlLZXJuZWxGdW5jKE1vZCwgbW9kSW1wbCk7XG5cbmV4cG9ydCBjb25zdCBtb2RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTW9kLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IG1vZFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Softmax, util } from '@tensorflow/tfjs-core';\nimport { exp } from './Exp';\nimport { max } from './Max';\nimport { div } from './RealDiv';\nimport { reshape } from './Reshape';\nimport { sub } from './Sub';\nimport { sum } from './Sum';\nexport function softmax(args) {\n    const { inputs, backend, attrs } = args;\n    const { logits } = inputs;\n    const { dim } = attrs;\n    const logitsRank = logits.shape.length;\n    let $dim = dim;\n    if ($dim === -1) {\n        $dim = logitsRank - 1;\n    }\n    if ($dim !== logitsRank - 1) {\n        throw Error('Softmax along a non-last dimension is not yet supported. ' +\n            `Logits was rank ${logitsRank} and dim was ${$dim}`);\n    }\n    const axes = util.parseAxisParam([$dim], logits.shape);\n    const maxLogit = max({\n        inputs: { x: logits },\n        backend,\n        attrs: { reductionIndices: axes, keepDims: false }\n    });\n    const expandedShape = backend_util.expandShapeToKeepDim(maxLogit.shape, axes);\n    const maxLogitReshaped = reshape({ inputs: { x: maxLogit }, backend, attrs: { shape: expandedShape } });\n    const a = sub({ inputs: { a: logits, b: maxLogitReshaped }, backend });\n    const b = exp({ inputs: { x: a }, backend });\n    const sumExp = sum({ inputs: { x: b }, backend, attrs: { axis: axes, keepDims: false } });\n    const sumReshaped = reshape({ inputs: { x: sumExp }, backend, attrs: { shape: expandedShape } });\n    const result = div({ inputs: { a: b, b: sumReshaped }, backend });\n    backend.disposeIntermediateTensorInfo(maxLogit);\n    backend.disposeIntermediateTensorInfo(maxLogitReshaped);\n    backend.disposeIntermediateTensorInfo(a);\n    backend.disposeIntermediateTensorInfo(b);\n    backend.disposeIntermediateTensorInfo(sumExp);\n    backend.disposeIntermediateTensorInfo(sumReshaped);\n    return result;\n}\nexport const softmaxConfig = {\n    kernelName: Softmax,\n    backendName: 'cpu',\n    kernelFunc: softmax\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdG1heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU29mdG1heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixPQUFPLEVBQTJDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSXJJLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sRUFBQyxHQUFHLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFcEIsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFdkMsSUFBSSxJQUFJLEdBQUcsR0FBRyxDQUFDO0lBQ2YsSUFBSSxJQUFJLEtBQUssQ0FBQyxDQUFDLEVBQUU7UUFDZixJQUFJLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztLQUN2QjtJQUNELElBQUksSUFBSSxLQUFLLFVBQVUsR0FBRyxDQUFDLEVBQUU7UUFDM0IsTUFBTSxLQUFLLENBQ1AsMkRBQTJEO1lBQzNELG1CQUFtQixVQUFVLGdCQUFnQixJQUFJLEVBQUUsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN2RCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDbkIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQztRQUNuQixPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7S0FDakQsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFOUUsTUFBTSxnQkFBZ0IsR0FDbEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxHQUNILEdBQUcsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLGdCQUFnQixFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUMzRSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FDUixHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQyxFQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLFdBQVcsR0FDYixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxhQUFhLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFM0UsTUFBTSxNQUFNLEdBQUcsR0FBRyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsV0FBVyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUU1RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDOUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTb2Z0bWF4LCBTb2Z0bWF4QXR0cnMsIFNvZnRtYXhJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtleHB9IGZyb20gJy4vRXhwJztcbmltcG9ydCB7bWF4fSBmcm9tICcuL01heCc7XG5pbXBvcnQge2Rpdn0gZnJvbSAnLi9SZWFsRGl2JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c3VifSBmcm9tICcuL1N1Yic7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9TdW0nO1xuXG5leHBvcnQgZnVuY3Rpb24gc29mdG1heChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBTb2Z0bWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFNvZnRtYXhBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7bG9naXRzfSA9IGlucHV0cztcbiAgY29uc3Qge2RpbX0gPSBhdHRycztcblxuICBjb25zdCBsb2dpdHNSYW5rID0gbG9naXRzLnNoYXBlLmxlbmd0aDtcblxuICBsZXQgJGRpbSA9IGRpbTtcbiAgaWYgKCRkaW0gPT09IC0xKSB7XG4gICAgJGRpbSA9IGxvZ2l0c1JhbmsgLSAxO1xuICB9XG4gIGlmICgkZGltICE9PSBsb2dpdHNSYW5rIC0gMSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgICAnU29mdG1heCBhbG9uZyBhIG5vbi1sYXN0IGRpbWVuc2lvbiBpcyBub3QgeWV0IHN1cHBvcnRlZC4gJyArXG4gICAgICAgIGBMb2dpdHMgd2FzIHJhbmsgJHtsb2dpdHNSYW5rfSBhbmQgZGltIHdhcyAkeyRkaW19YCk7XG4gIH1cblxuICBjb25zdCBheGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShbJGRpbV0sIGxvZ2l0cy5zaGFwZSk7XG4gIGNvbnN0IG1heExvZ2l0ID0gbWF4KHtcbiAgICBpbnB1dHM6IHt4OiBsb2dpdHN9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtyZWR1Y3Rpb25JbmRpY2VzOiBheGVzLCBrZWVwRGltczogZmFsc2V9XG4gIH0pO1xuICBjb25zdCBleHBhbmRlZFNoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG1heExvZ2l0LnNoYXBlLCBheGVzKTtcblxuICBjb25zdCBtYXhMb2dpdFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG1heExvZ2l0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcbiAgY29uc3QgYSA9XG4gICAgICBzdWIoe2lucHV0czoge2E6IGxvZ2l0cywgYjogbWF4TG9naXRSZXNoYXBlZH0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICBjb25zdCBiID0gZXhwKHtpbnB1dHM6IHt4OiBhfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gIGNvbnN0IHN1bUV4cCA9XG4gICAgICBzdW0oe2lucHV0czoge3g6IGJ9LCBiYWNrZW5kLCBhdHRyczoge2F4aXM6IGF4ZXMsIGtlZXBEaW1zOiBmYWxzZX19KTtcbiAgY29uc3Qgc3VtUmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc3VtRXhwfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcblxuICBjb25zdCByZXN1bHQgPSBkaXYoe2lucHV0czoge2E6IGIsIGI6IHN1bVJlc2hhcGVkfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4TG9naXRSZXNoYXBlZCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYik7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdW1SZXNoYXBlZCk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHNvZnRtYXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU29mdG1heCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzb2Z0bWF4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Multinomial, util } from '@tensorflow/tfjs-core';\nimport * as seedrandom from 'seedrandom';\nimport { assertNotComplex } from '../cpu_util';\nimport { softmax } from './Softmax';\nexport function multinomial(args) {\n    const { inputs, backend, attrs } = args;\n    const { logits } = inputs;\n    const { numSamples, seed, normalized } = attrs;\n    assertNotComplex(logits, 'multinomial');\n    const probabilities = normalized ?\n        logits :\n        softmax({ inputs: { logits }, backend, attrs: { dim: -1 } });\n    const batchSize = probabilities.shape[0];\n    const numEvents = probabilities.shape[1];\n    const probVals = backend.data.get(probabilities.dataId).values;\n    const resShape = [batchSize, numSamples];\n    const resVals = util.makeZerosTypedArray(util.sizeFromShape(resShape), 'int32');\n    for (let b = 0; b < batchSize; ++b) {\n        const offset = b * numEvents;\n        // The cdf won't include the last event. It will be implicit if no other\n        // event happened.\n        const cdf = new Float32Array(numEvents - 1);\n        cdf[0] = probVals[offset];\n        for (let event = 1; event < cdf.length; ++event) {\n            cdf[event] = cdf[event - 1] + probVals[offset + event];\n        }\n        const random = seedrandom.alea(seed.toString());\n        const outOffset = b * numSamples;\n        for (let sampleId = 0; sampleId < numSamples; ++sampleId) {\n            const r = random();\n            // Assume last event happened by default.\n            resVals[outOffset + sampleId] = cdf.length;\n            for (let event = 0; event < cdf.length; event++) {\n                if (r < cdf[event]) {\n                    resVals[outOffset + sampleId] = event;\n                    break;\n                }\n            }\n        }\n    }\n    if (!normalized) {\n        backend.disposeIntermediateTensorInfo(probabilities);\n    }\n    return backend.makeTensorInfo(resShape, 'int32', resVals);\n}\nexport const multinomialConfig = {\n    kernelName: Multinomial,\n    backendName: 'cpu',\n    kernelFunc: multinomial\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlub21pYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL011bHRpbm9taWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsV0FBVyxFQUErRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvSSxPQUFPLEtBQUssVUFBVSxNQUFNLFlBQVksQ0FBQztBQUd6QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDeEIsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTdDLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztJQUV4QyxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUM5QixNQUFNLENBQUMsQ0FBQztRQUNSLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFM0QsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxNQUFNLFNBQVMsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQzdFLE1BQU0sUUFBUSxHQUFHLENBQUMsU0FBUyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3pDLE1BQU0sT0FBTyxHQUNULElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLFFBQVEsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBRXBFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDbEMsTUFBTSxNQUFNLEdBQUcsQ0FBQyxHQUFHLFNBQVMsQ0FBQztRQUM3Qix3RUFBd0U7UUFDeEUsa0JBQWtCO1FBQ2xCLE1BQU0sR0FBRyxHQUFHLElBQUksWUFBWSxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM1QyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsS0FBSyxFQUFFO1lBQy9DLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7U0FDeEQ7UUFFRCxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDakMsS0FBSyxJQUFJLFFBQVEsR0FBRyxDQUFDLEVBQUUsUUFBUSxHQUFHLFVBQVUsRUFBRSxFQUFFLFFBQVEsRUFBRTtZQUN4RCxNQUFNLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQztZQUVuQix5Q0FBeUM7WUFDekMsT0FBTyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxDQUFDO1lBRTNDLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFO2dCQUMvQyxJQUFJLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7b0JBQ2xCLE9BQU8sQ0FBQyxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsS0FBSyxDQUFDO29CQUN0QyxNQUFNO2lCQUNQO2FBQ0Y7U0FDRjtLQUNGO0lBRUQsSUFBSSxDQUFDLFVBQVUsRUFBRTtRQUNmLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztLQUN0RDtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNdWx0aW5vbWlhbCwgTXVsdGlub21pYWxBdHRycywgTXVsdGlub21pYWxJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQgKiBhcyBzZWVkcmFuZG9tIGZyb20gJ3NlZWRyYW5kb20nO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuaW1wb3J0IHtzb2Z0bWF4fSBmcm9tICcuL1NvZnRtYXgnO1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlub21pYWwoYXJnczoge1xuICBpbnB1dHM6IE11bHRpbm9taWFsSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IE11bHRpbm9taWFsQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2xvZ2l0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtudW1TYW1wbGVzLCBzZWVkLCBub3JtYWxpemVkfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgobG9naXRzLCAnbXVsdGlub21pYWwnKTtcblxuICBjb25zdCBwcm9iYWJpbGl0aWVzID0gbm9ybWFsaXplZCA/XG4gICAgICBsb2dpdHMgOlxuICAgICAgc29mdG1heCh7aW5wdXRzOiB7bG9naXRzfSwgYmFja2VuZCwgYXR0cnM6IHtkaW06IC0xfX0pO1xuXG4gIGNvbnN0IGJhdGNoU2l6ZSA9IHByb2JhYmlsaXRpZXMuc2hhcGVbMF07XG4gIGNvbnN0IG51bUV2ZW50cyA9IHByb2JhYmlsaXRpZXMuc2hhcGVbMV07XG4gIGNvbnN0IHByb2JWYWxzID0gYmFja2VuZC5kYXRhLmdldChwcm9iYWJpbGl0aWVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHJlc1NoYXBlID0gW2JhdGNoU2l6ZSwgbnVtU2FtcGxlc107XG4gIGNvbnN0IHJlc1ZhbHMgPVxuICAgICAgdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZShyZXNTaGFwZSksICdpbnQzMicpO1xuXG4gIGZvciAobGV0IGIgPSAwOyBiIDwgYmF0Y2hTaXplOyArK2IpIHtcbiAgICBjb25zdCBvZmZzZXQgPSBiICogbnVtRXZlbnRzO1xuICAgIC8vIFRoZSBjZGYgd29uJ3QgaW5jbHVkZSB0aGUgbGFzdCBldmVudC4gSXQgd2lsbCBiZSBpbXBsaWNpdCBpZiBubyBvdGhlclxuICAgIC8vIGV2ZW50IGhhcHBlbmVkLlxuICAgIGNvbnN0IGNkZiA9IG5ldyBGbG9hdDMyQXJyYXkobnVtRXZlbnRzIC0gMSk7XG4gICAgY2RmWzBdID0gcHJvYlZhbHNbb2Zmc2V0XTtcbiAgICBmb3IgKGxldCBldmVudCA9IDE7IGV2ZW50IDwgY2RmLmxlbmd0aDsgKytldmVudCkge1xuICAgICAgY2RmW2V2ZW50XSA9IGNkZltldmVudCAtIDFdICsgcHJvYlZhbHNbb2Zmc2V0ICsgZXZlbnRdO1xuICAgIH1cblxuICAgIGNvbnN0IHJhbmRvbSA9IHNlZWRyYW5kb20uYWxlYShzZWVkLnRvU3RyaW5nKCkpO1xuICAgIGNvbnN0IG91dE9mZnNldCA9IGIgKiBudW1TYW1wbGVzO1xuICAgIGZvciAobGV0IHNhbXBsZUlkID0gMDsgc2FtcGxlSWQgPCBudW1TYW1wbGVzOyArK3NhbXBsZUlkKSB7XG4gICAgICBjb25zdCByID0gcmFuZG9tKCk7XG5cbiAgICAgIC8vIEFzc3VtZSBsYXN0IGV2ZW50IGhhcHBlbmVkIGJ5IGRlZmF1bHQuXG4gICAgICByZXNWYWxzW291dE9mZnNldCArIHNhbXBsZUlkXSA9IGNkZi5sZW5ndGg7XG5cbiAgICAgIGZvciAobGV0IGV2ZW50ID0gMDsgZXZlbnQgPCBjZGYubGVuZ3RoOyBldmVudCsrKSB7XG4gICAgICAgIGlmIChyIDwgY2RmW2V2ZW50XSkge1xuICAgICAgICAgIHJlc1ZhbHNbb3V0T2Zmc2V0ICsgc2FtcGxlSWRdID0gZXZlbnQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByb2JhYmlsaXRpZXMpO1xuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzU2hhcGUsICdpbnQzMicsIHJlc1ZhbHMpO1xufVxuXG5leHBvcnQgY29uc3QgbXVsdGlub21pYWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTXVsdGlub21pYWwsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbXVsdGlub21pYWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { kernel_impls, NonMaxSuppressionV3 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV3Impl = kernel_impls.nonMaxSuppressionV3Impl;\nimport { assertNotComplex } from '../cpu_util';\nexport function nonMaxSuppressionV3(args) {\n    const { inputs, backend, attrs } = args;\n    const { boxes, scores } = inputs;\n    const { maxOutputSize, iouThreshold, scoreThreshold } = attrs;\n    assertNotComplex(boxes, 'NonMaxSuppression');\n    const boxesVals = backend.data.get(boxes.dataId).values;\n    const scoresVals = backend.data.get(scores.dataId).values;\n    const { selectedIndices } = nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold);\n    return backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices));\n}\nexport const nonMaxSuppressionV3Config = {\n    kernelName: NonMaxSuppressionV3,\n    backendName: 'cpu',\n    kernelFunc: nonMaxSuppressionV3\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WMy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WMy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvSyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUdyRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBSW5DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUU1RCxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUU3QyxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUN0RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUV4RSxNQUFNLEVBQUMsZUFBZSxFQUFDLEdBQUcsdUJBQXVCLENBQzdDLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLENBQUMsQ0FBQztJQUV4RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQ3pCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7a2VybmVsX2ltcGxzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE5vbk1heFN1cHByZXNzaW9uVjMsIE5vbk1heFN1cHByZXNzaW9uVjNBdHRycywgTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WM0ltcGw7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WMyhhcmdzOiB7XG4gIGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBOb25NYXhTdXBwcmVzc2lvblYzQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZH0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KGJveGVzLCAnTm9uTWF4U3VwcHJlc3Npb24nKTtcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KGJveGVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHNjb3Jlc1ZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHNjb3Jlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IHtzZWxlY3RlZEluZGljZXN9ID0gbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WMyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblYzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { kernel_impls, NonMaxSuppressionV4 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV4Impl = kernel_impls.nonMaxSuppressionV4Impl;\nimport { assertNotComplex } from '../cpu_util';\nexport function nonMaxSuppressionV4(args) {\n    const { inputs, backend, attrs } = args;\n    const { boxes, scores } = inputs;\n    const { maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize } = attrs;\n    assertNotComplex(boxes, 'NonMaxSuppressionPadded');\n    const boxesVals = backend.data.get(boxes.dataId).values;\n    const scoresVals = backend.data.get(scores.dataId).values;\n    const { selectedIndices, validOutputs } = nonMaxSuppressionV4Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize);\n    return [\n        backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)),\n        backend.makeTensorInfo([], 'int32', new Int32Array([validOutputs]))\n    ];\n}\nexport const nonMaxSuppressionV4Config = {\n    kernelName: NonMaxSuppressionV4,\n    backendName: 'cpu',\n    kernelFunc: nonMaxSuppressionV4\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvSyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUVyRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBSW5DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxrQkFBa0IsRUFBQyxHQUNuRSxLQUFLLENBQUM7SUFFVixnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUseUJBQXlCLENBQUMsQ0FBQztJQUVuRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUN0RSxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUV4RSxNQUFNLEVBQUMsZUFBZSxFQUFFLFlBQVksRUFBQyxHQUFHLHVCQUF1QixDQUMzRCxTQUFTLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxFQUNsRSxrQkFBa0IsQ0FBQyxDQUFDO0lBRXhCLE9BQU87UUFDTCxPQUFPLENBQUMsY0FBYyxDQUNsQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLGNBQWMsQ0FBQyxFQUFFLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztLQUNwRSxDQUFDO0FBQ0osQ0FBQztBQUNELE1BQU0sQ0FBQyxNQUFNLHlCQUF5QixHQUFpQjtJQUNyRCxVQUFVLEVBQUUsbUJBQW1CO0lBQy9CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxtQkFBdUM7Q0FDcEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtrZXJuZWxfaW1wbHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTm9uTWF4U3VwcHJlc3Npb25WNCwgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5jb25zdCBub25NYXhTdXBwcmVzc2lvblY0SW1wbCA9IGtlcm5lbF9pbXBscy5ub25NYXhTdXBwcmVzc2lvblY0SW1wbDtcbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNChhcmdzOiB7XG4gIGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WNElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBOb25NYXhTdXBwcmVzc2lvblY0QXR0cnNcbn0pOiBbVGVuc29ySW5mbywgVGVuc29ySW5mb10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7Ym94ZXMsIHNjb3Jlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHttYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLCBwYWRUb01heE91dHB1dFNpemV9ID1cbiAgICAgIGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoYm94ZXMsICdOb25NYXhTdXBwcmVzc2lvblBhZGRlZCcpO1xuXG4gIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94ZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoc2NvcmVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3Qge3NlbGVjdGVkSW5kaWNlcywgdmFsaWRPdXRwdXRzfSA9IG5vbk1heFN1cHByZXNzaW9uVjRJbXBsKFxuICAgICAgYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkLFxuICAgICAgcGFkVG9NYXhPdXRwdXRTaXplKTtcblxuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoW3ZhbGlkT3V0cHV0c10pKVxuICBdO1xufVxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { kernel_impls, NonMaxSuppressionV5 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV5Impl = kernel_impls.nonMaxSuppressionV5Impl;\nimport { assertNotComplex } from '../cpu_util';\nexport function nonMaxSuppressionV5(args) {\n    const { inputs, backend, attrs } = args;\n    const { boxes, scores } = inputs;\n    const { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma } = attrs;\n    assertNotComplex(boxes, 'NonMaxSuppressionWithScore');\n    const boxesVals = backend.data.get(boxes.dataId).values;\n    const scoresVals = backend.data.get(scores.dataId).values;\n    const maxOutputSizeVal = maxOutputSize;\n    const iouThresholdVal = iouThreshold;\n    const scoreThresholdVal = scoreThreshold;\n    const softNmsSigmaVal = softNmsSigma;\n    const { selectedIndices, selectedScores } = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal, softNmsSigmaVal);\n    return [\n        backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)),\n        backend.makeTensorInfo([selectedScores.length], 'float32', new Float32Array(selectedScores))\n    ];\n}\nexport const nonMaxSuppressionV5Config = {\n    kernelName: NonMaxSuppressionV5,\n    backendName: 'cpu',\n    kernelFunc: nonMaxSuppressionV5\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WNS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUUvSyxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUVyRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBSW5DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFBRSxZQUFZLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFMUUsZ0JBQWdCLENBQUMsS0FBSyxFQUFFLDRCQUE0QixDQUFDLENBQUM7SUFFdEQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdEUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFeEUsTUFBTSxnQkFBZ0IsR0FBRyxhQUFhLENBQUM7SUFDdkMsTUFBTSxlQUFlLEdBQUcsWUFBWSxDQUFDO0lBQ3JDLE1BQU0saUJBQWlCLEdBQUcsY0FBYyxDQUFDO0lBQ3pDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztJQUVyQyxNQUFNLEVBQUMsZUFBZSxFQUFFLGNBQWMsRUFBQyxHQUFHLHVCQUF1QixDQUM3RCxTQUFTLEVBQUUsVUFBVSxFQUFFLGdCQUFnQixFQUFFLGVBQWUsRUFDeEQsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFeEMsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQ2xCLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUN2RSxPQUFPLENBQUMsY0FBYyxDQUNsQixDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsSUFBSSxZQUFZLENBQUMsY0FBYyxDQUFDLENBQUM7S0FDMUUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7a2VybmVsX2ltcGxzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE5vbk1heFN1cHByZXNzaW9uVjUsIE5vbk1heFN1cHByZXNzaW9uVjVBdHRycywgTm9uTWF4U3VwcHJlc3Npb25WNUlucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNUltcGw7XG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIG5vbk1heFN1cHByZXNzaW9uVjUoYXJnczoge1xuICBpbnB1dHM6IE5vbk1heFN1cHByZXNzaW9uVjVJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNUF0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgc29mdE5tc1NpZ21hfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoYm94ZXMsICdOb25NYXhTdXBwcmVzc2lvbldpdGhTY29yZScpO1xuXG4gIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoYm94ZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQuZGF0YS5nZXQoc2NvcmVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgbWF4T3V0cHV0U2l6ZVZhbCA9IG1heE91dHB1dFNpemU7XG4gIGNvbnN0IGlvdVRocmVzaG9sZFZhbCA9IGlvdVRocmVzaG9sZDtcbiAgY29uc3Qgc2NvcmVUaHJlc2hvbGRWYWwgPSBzY29yZVRocmVzaG9sZDtcbiAgY29uc3Qgc29mdE5tc1NpZ21hVmFsID0gc29mdE5tc1NpZ21hO1xuXG4gIGNvbnN0IHtzZWxlY3RlZEluZGljZXMsIHNlbGVjdGVkU2NvcmVzfSA9IG5vbk1heFN1cHByZXNzaW9uVjVJbXBsKFxuICAgICAgYm94ZXNWYWxzLCBzY29yZXNWYWxzLCBtYXhPdXRwdXRTaXplVmFsLCBpb3VUaHJlc2hvbGRWYWwsXG4gICAgICBzY29yZVRocmVzaG9sZFZhbCwgc29mdE5tc1NpZ21hVmFsKTtcblxuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtzZWxlY3RlZEluZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgbmV3IEludDMyQXJyYXkoc2VsZWN0ZWRJbmRpY2VzKSksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3NlbGVjdGVkU2NvcmVzLmxlbmd0aF0sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShzZWxlY3RlZFNjb3JlcykpXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjUsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogbm9uTWF4U3VwcHJlc3Npb25WNSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OneHot, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function oneHot(args) {\n    const { inputs, backend, attrs } = args;\n    const { indices } = inputs;\n    const { dtype, depth, onValue, offValue } = attrs;\n    assertNotComplex(indices, 'oneHot');\n    const indicesSize = util.sizeFromShape(indices.shape);\n    const res = new Float32Array(indicesSize * depth);\n    res.fill(offValue);\n    const indicesVal = backend.data.get(indices.dataId).values;\n    for (let event = 0; event < indicesSize; ++event) {\n        if (indicesVal[event] >= 0 && indicesVal[event] < depth) {\n            res[event * depth + indicesVal[event]] = onValue;\n        }\n    }\n    return backend.makeTensorInfo([...indices.shape, depth], dtype, res);\n}\nexport const oneHotConfig = {\n    kernelName: OneHot,\n    backendName: 'cpu',\n    kernelFunc: oneHot\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lSG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9PbmVIb3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixNQUFNLEVBQXFELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2hJLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN6QixNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRWhELGdCQUFnQixDQUFDLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztJQUVwQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0RCxNQUFNLEdBQUcsR0FBRyxJQUFJLFlBQVksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDbEQsR0FBRyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNuQixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUV6RSxLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsV0FBVyxFQUFFLEVBQUUsS0FBSyxFQUFFO1FBQ2hELElBQUksVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLEdBQUcsS0FBSyxFQUFFO1lBQ3ZELEdBQUcsQ0FBQyxLQUFLLEdBQUcsS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztTQUNsRDtLQUNGO0lBRUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxFQUFFLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztBQUN2RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE9uZUhvdCwgT25lSG90QXR0cnMsIE9uZUhvdElucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmVIb3QoXG4gICAgYXJnczoge2lucHV0czogT25lSG90SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IE9uZUhvdEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbmRpY2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2R0eXBlLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChpbmRpY2VzLCAnb25lSG90Jyk7XG5cbiAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG5cbiAgY29uc3QgcmVzID0gbmV3IEZsb2F0MzJBcnJheShpbmRpY2VzU2l6ZSAqIGRlcHRoKTtcbiAgcmVzLmZpbGwob2ZmVmFsdWUpO1xuICBjb25zdCBpbmRpY2VzVmFsID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgZm9yIChsZXQgZXZlbnQgPSAwOyBldmVudCA8IGluZGljZXNTaXplOyArK2V2ZW50KSB7XG4gICAgaWYgKGluZGljZXNWYWxbZXZlbnRdID49IDAgJiYgaW5kaWNlc1ZhbFtldmVudF0gPCBkZXB0aCkge1xuICAgICAgcmVzW2V2ZW50ICogZGVwdGggKyBpbmRpY2VzVmFsW2V2ZW50XV0gPSBvblZhbHVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFsuLi5pbmRpY2VzLnNoYXBlLCBkZXB0aF0sIGR0eXBlLCByZXMpO1xufVxuXG5leHBvcnQgY29uc3Qgb25lSG90Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE9uZUhvdCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBvbmVIb3QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ZerosLike } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { fill } from './Fill';\nimport { imag } from './Imag';\nimport { real } from './Real';\nexport function zerosLike(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    if (x.dtype === 'string') {\n        throw new Error('zerosLike is not supported for string tensors');\n    }\n    else if (x.dtype === 'complex64') {\n        const realPart = real({ inputs: { input: x }, backend });\n        const r = zerosLike({ inputs: { x: realPart }, backend });\n        const imagPart = imag({ inputs: { input: x }, backend });\n        const i = zerosLike({ inputs: { x: imagPart }, backend });\n        const result = complex({ inputs: { real: r, imag: i }, backend });\n        backend.disposeIntermediateTensorInfo(realPart);\n        backend.disposeIntermediateTensorInfo(r);\n        backend.disposeIntermediateTensorInfo(imagPart);\n        backend.disposeIntermediateTensorInfo(i);\n        return result;\n    }\n    else {\n        return fill({ backend, attrs: { shape: x.shape, value: 0, dtype: x.dtype } });\n    }\n}\nexport const zerosLikeConfig = {\n    kernelName: ZerosLike,\n    backendName: 'cpu',\n    kernelFunc: zerosLike\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmVyb3NMaWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9aZXJvc0xpa2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxTQUFTLEVBQWtCLE1BQU0sdUJBQXVCLENBQUM7QUFJdkcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUU1QixNQUFNLFVBQVUsU0FBUyxDQUNyQixJQUF3RDtJQUMxRCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0tBQ2xFO1NBQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQzNFO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUI7SUFDM0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFNBQTZCO0NBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBaZXJvc0xpa2UsIFplcm9zTGlrZUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB6ZXJvc0xpa2UoXG4gICAgYXJnczoge2lucHV0czogWmVyb3NMaWtlSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVX0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd6ZXJvc0xpa2UgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyaW5nIHRlbnNvcnMnKTtcbiAgfSBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IHplcm9zTGlrZSh7aW5wdXRzOiB7eDogcmVhbFBhcnR9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgaW1hZ1BhcnQgPSBpbWFnKHtpbnB1dHM6IHtpbnB1dDogeH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpID0gemVyb3NMaWtlKHtpbnB1dHM6IHt4OiBpbWFnUGFydH0sIGJhY2tlbmR9KTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBsZXgoe2lucHV0czoge3JlYWw6IHIsIGltYWc6IGl9LCBiYWNrZW5kfSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlYWxQYXJ0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHIpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZ1BhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmaWxsKHtiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB4LnNoYXBlLCB2YWx1ZTogMCwgZHR5cGU6IHguZHR5cGV9fSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHplcm9zTGlrZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBaZXJvc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogemVyb3NMaWtlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OnesLike } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { fill } from './Fill';\nimport { imag } from './Imag';\nimport { real } from './Real';\nimport { zerosLike } from './ZerosLike';\nexport function onesLike(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    if (x.dtype === 'string') {\n        throw new Error('onesLike is not supported for string tensors');\n    }\n    else if (x.dtype === 'complex64') {\n        const realPart = real({ inputs: { input: x }, backend });\n        const r = onesLike({ inputs: { x: realPart }, backend });\n        const imagPart = imag({ inputs: { input: x }, backend });\n        const i = zerosLike({ inputs: { x: imagPart }, backend });\n        const result = complex({ inputs: { real: r, imag: i }, backend });\n        backend.disposeIntermediateTensorInfo(realPart);\n        backend.disposeIntermediateTensorInfo(r);\n        backend.disposeIntermediateTensorInfo(imagPart);\n        backend.disposeIntermediateTensorInfo(i);\n        return result;\n    }\n    else {\n        return fill({ backend, attrs: { shape: x.shape, value: 1, dtype: x.dtype } });\n    }\n}\nexport const onesLikeConfig = {\n    kernelName: OnesLike,\n    backendName: 'cpu',\n    kernelFunc: onesLike\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lc0xpa2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL09uZXNMaWtlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsUUFBUSxFQUE2QixNQUFNLHVCQUF1QixDQUFDO0FBR3JHLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsUUFBUSxDQUNwQixJQUF1RDtJQUN6RCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLElBQUksQ0FBQyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO0tBQ2pFO1NBQU0sSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUNsQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxRQUFRLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQyxFQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQzNFO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFFBQTRCO0NBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBPbmVzTGlrZSwgT25lc0xpa2VJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7aW1hZ30gZnJvbSAnLi9JbWFnJztcbmltcG9ydCB7cmVhbH0gZnJvbSAnLi9SZWFsJztcbmltcG9ydCB7emVyb3NMaWtlfSBmcm9tICcuL1plcm9zTGlrZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBvbmVzTGlrZShcbiAgICBhcmdzOiB7aW5wdXRzOiBPbmVzTGlrZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignb25lc0xpa2UgaXMgbm90IHN1cHBvcnRlZCBmb3Igc3RyaW5nIHRlbnNvcnMnKTtcbiAgfSBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IG9uZXNMaWtlKHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2Uoe2lucHV0czoge3g6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbGwoe2JhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHguc2hhcGUsIHZhbHVlOiAxLCBkdHlwZTogeC5kdHlwZX19KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogb25lc0xpa2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pack, util } from '@tensorflow/tfjs-core';\nimport { concat } from './Concat';\nimport { expandDims } from './ExpandDims';\nexport function pack(args) {\n    const { inputs, backend, attrs } = args;\n    const { axis } = attrs;\n    if (inputs.length === 1) {\n        return expandDims({ inputs: { input: inputs[0] }, backend, attrs: { dim: axis } });\n    }\n    const shape = inputs[0].shape;\n    const dtype = inputs[0].dtype;\n    inputs.forEach(t => {\n        util.assertShapesMatch(shape, t.shape, 'All tensors passed to stack must have matching shapes');\n        util.assert(dtype === t.dtype, () => 'All tensors passed to stack must have matching dtypes');\n    });\n    const intermediateTensorInfos = [];\n    const expandedTensors = inputs.map(t => {\n        const expandedT = expandDims({ inputs: { input: t }, backend, attrs: { dim: axis } });\n        intermediateTensorInfos.push(expandedT);\n        return expandedT;\n    });\n    const result = concat({ inputs: expandedTensors, backend, attrs: { axis } });\n    intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return result;\n}\nexport const packConfig = {\n    kernelName: Pack,\n    backendName: 'cpu',\n    kernelFunc: pack\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLElBQUksRUFBcUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHOUcsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUNoQyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRXhDLE1BQU0sVUFBVSxJQUFJLENBQ2hCLElBQXFFO0lBRXZFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDdkIsT0FBTyxVQUFVLENBQ2IsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUM7S0FDaEU7SUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO0lBQzlCLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFFOUIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNqQixJQUFJLENBQUMsaUJBQWlCLENBQ2xCLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUNkLHVEQUF1RCxDQUFDLENBQUM7UUFDN0QsSUFBSSxDQUFDLE1BQU0sQ0FDUCxLQUFLLEtBQUssQ0FBQyxDQUFDLEtBQUssRUFDakIsR0FBRyxFQUFFLENBQUMsdURBQXVELENBQUMsQ0FBQztJQUNyRSxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sdUJBQXVCLEdBQWlCLEVBQUUsQ0FBQztJQUNqRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3JDLE1BQU0sU0FBUyxHQUNYLFVBQVUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztRQUNsRSx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDeEMsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQyxDQUFDLENBQUM7SUFFSCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsRUFBQyxNQUFNLEVBQUUsZUFBZSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFekUsdUJBQXVCLENBQUMsT0FBTyxDQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5ELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUGFjaywgUGFja0F0dHJzLCBQYWNrSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9Db25jYXQnO1xuaW1wb3J0IHtleHBhbmREaW1zfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFjayhcbiAgICBhcmdzOiB7aW5wdXRzOiBQYWNrSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFBhY2tBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBpZiAoaW5wdXRzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBleHBhbmREaW1zKFxuICAgICAgICB7aW5wdXRzOiB7aW5wdXQ6IGlucHV0c1swXX0sIGJhY2tlbmQsIGF0dHJzOiB7ZGltOiBheGlzfX0pO1xuICB9XG5cbiAgY29uc3Qgc2hhcGUgPSBpbnB1dHNbMF0uc2hhcGU7XG4gIGNvbnN0IGR0eXBlID0gaW5wdXRzWzBdLmR0eXBlO1xuXG4gIGlucHV0cy5mb3JFYWNoKHQgPT4ge1xuICAgIHV0aWwuYXNzZXJ0U2hhcGVzTWF0Y2goXG4gICAgICAgIHNoYXBlLCB0LnNoYXBlLFxuICAgICAgICAnQWxsIHRlbnNvcnMgcGFzc2VkIHRvIHN0YWNrIG11c3QgaGF2ZSBtYXRjaGluZyBzaGFwZXMnKTtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgZHR5cGUgPT09IHQuZHR5cGUsXG4gICAgICAgICgpID0+ICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIGR0eXBlcycpO1xuICB9KTtcblxuICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvczogVGVuc29ySW5mb1tdID0gW107XG4gIGNvbnN0IGV4cGFuZGVkVGVuc29ycyA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgY29uc3QgZXhwYW5kZWRUID1cbiAgICAgICAgZXhwYW5kRGltcyh7aW5wdXRzOiB7aW5wdXQ6IHR9LCBiYWNrZW5kLCBhdHRyczoge2RpbTogYXhpc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKGV4cGFuZGVkVCk7XG4gICAgcmV0dXJuIGV4cGFuZGVkVDtcbiAgfSk7XG5cbiAgY29uc3QgcmVzdWx0ID0gY29uY2F0KHtpbnB1dHM6IGV4cGFuZGVkVGVuc29ycywgYmFja2VuZCwgYXR0cnM6IHtheGlzfX0pO1xuXG4gIGludGVybWVkaWF0ZVRlbnNvckluZm9zLmZvckVhY2goXG4gICAgICB0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBwYWNrQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBhY2ssXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcGFjayBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { PadV2, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function padV2(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { paddings, constantValue } = attrs;\n    assertNotComplex(x, 'pad');\n    const outShape = paddings.map((p, i) => p[0] /* beforePad */ + x.shape[i] + p[1] /* afterPad */);\n    const start = paddings.map(p => p[0]);\n    const xVals = backend.data.get(x.dataId).values;\n    const xSize = util.sizeFromShape(x.shape);\n    const xRank = x.shape.length;\n    const xStrides = util.computeStrides(x.shape);\n    const resultSize = util.sizeFromShape(outShape);\n    const resultRank = outShape.length;\n    const resultStrides = util.computeStrides(outShape);\n    const resVals = util.getTypedArrayFromDType(x.dtype, resultSize);\n    if (constantValue !== 0) {\n        resVals.fill(constantValue);\n    }\n    for (let i = 0; i < xSize; i++) {\n        const coords = util.indexToLoc(i, xRank, xStrides);\n        const outCoords = coords.map((c, i) => c + start[i]);\n        const outIndex = util.locToIndex(outCoords, resultRank, resultStrides);\n        resVals[outIndex] = xVals[i];\n    }\n    const outId = backend.write(resVals, outShape, x.dtype);\n    return { dataId: outId, shape: outShape, dtype: x.dtype };\n}\nexport const padV2Config = {\n    kernelName: PadV2,\n    backendName: 'cpu',\n    kernelFunc: padV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFkVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1BhZFYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBNEMsS0FBSyxFQUFtRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5SSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLEtBQUssQ0FDakIsSUFBdUU7SUFFekUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFFBQVEsRUFBRSxhQUFhLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFeEMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNCLE1BQU0sUUFBUSxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQ3pCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV2RSxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDOUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO0lBQ25DLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsTUFBTSxPQUFPLEdBQ1QsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUF3QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBRXhFLElBQUksYUFBYSxLQUFLLENBQUMsRUFBRTtRQUN2QixPQUFPLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO0tBQzdCO0lBRUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM5QixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDbkQsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsYUFBYSxDQUFDLENBQUM7UUFFdkUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5QjtJQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTnVtZXJpY0RhdGFUeXBlLCBQYWRWMiwgUGFkVjJBdHRycywgUGFkVjJJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFkVjIoXG4gICAgYXJnczoge2lucHV0czogUGFkVjJJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogUGFkVjJBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtwYWRkaW5ncywgY29uc3RhbnRWYWx1ZX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICdwYWQnKTtcblxuICBjb25zdCBvdXRTaGFwZSA9IHBhZGRpbmdzLm1hcChcbiAgICAgIChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHguc2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcblxuICBjb25zdCBzdGFydCA9IHBhZGRpbmdzLm1hcChwID0+IHBbMF0pO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5kYXRhLmdldCh4LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCB4U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoeC5zaGFwZSk7XG5cbiAgY29uc3QgcmVzdWx0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZSk7XG4gIGNvbnN0IHJlc3VsdFJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHJlc3VsdFN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dFNoYXBlKTtcbiAgY29uc3QgcmVzVmFscyA9XG4gICAgICB1dGlsLmdldFR5cGVkQXJyYXlGcm9tRFR5cGUoeC5kdHlwZSBhcyBOdW1lcmljRGF0YVR5cGUsIHJlc3VsdFNpemUpO1xuXG4gIGlmIChjb25zdGFudFZhbHVlICE9PSAwKSB7XG4gICAgcmVzVmFscy5maWxsKGNvbnN0YW50VmFsdWUpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4U2l6ZTsgaSsrKSB7XG4gICAgY29uc3QgY29vcmRzID0gdXRpbC5pbmRleFRvTG9jKGksIHhSYW5rLCB4U3RyaWRlcyk7XG4gICAgY29uc3Qgb3V0Q29vcmRzID0gY29vcmRzLm1hcCgoYywgaSkgPT4gYyArIHN0YXJ0W2ldKTtcbiAgICBjb25zdCBvdXRJbmRleCA9IHV0aWwubG9jVG9JbmRleChvdXRDb29yZHMsIHJlc3VsdFJhbmssIHJlc3VsdFN0cmlkZXMpO1xuXG4gICAgcmVzVmFsc1tvdXRJbmRleF0gPSB4VmFsc1tpXTtcbiAgfVxuXG4gIGNvbnN0IG91dElkID0gYmFja2VuZC53cml0ZShyZXNWYWxzLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG5cbiAgcmV0dXJuIHtkYXRhSWQ6IG91dElkLCBzaGFwZTogb3V0U2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IHBhZFYyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBhZFYyLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHBhZFYyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pow } from '@tensorflow/tfjs-core';\nimport { createSimpleBinaryKernelImpl } from '../utils/binary_impl';\nimport { binaryKernelFunc } from '../utils/binary_utils';\nexport const powImpl = createSimpleBinaryKernelImpl((a, b) => Math.pow(a, b));\nexport const pow = binaryKernelFunc(Pow, powImpl);\nexport const powConfig = {\n    kernelName: Pow,\n    backendName: 'cpu',\n    kernelFunc: pow\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9Qb3cudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FDaEIsNEJBQTRCLENBQUMsQ0FBQyxDQUFTLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzNFLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxHQUFHO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBQb3d9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Y3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbH0gZnJvbSAnLi4vdXRpbHMvYmluYXJ5X2ltcGwnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy9iaW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3QgcG93SW1wbCA9XG4gICAgY3JlYXRlU2ltcGxlQmluYXJ5S2VybmVsSW1wbCgoYTogbnVtYmVyLCBiOiBudW1iZXIpID0+IE1hdGgucG93KGEsIGIpKTtcbmV4cG9ydCBjb25zdCBwb3cgPSBiaW5hcnlLZXJuZWxGdW5jKFBvdywgcG93SW1wbCk7XG5cbmV4cG9ydCBjb25zdCBwb3dDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUG93LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHBvd1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RaggedGather } from '@tensorflow/tfjs-core';\nimport { raggedGatherImpl } from './RaggedGather_impl';\nexport function raggedGather(args) {\n    const { inputs, backend, attrs } = args;\n    const { paramsNestedSplits, paramsDenseValues, indices } = inputs;\n    const { outputRaggedRank } = attrs;\n    const $paramsNestedSplits = paramsNestedSplits.map(t => backend.data.get(t.dataId).values);\n    const $paramsNestedSplitsShapes = paramsNestedSplits.map(t => t.shape);\n    const $paramsDenseValues = backend.data.get(paramsDenseValues.dataId).values;\n    const $indices = backend.data.get(indices.dataId).values;\n    const [outputNestedSplits, outputDenseValues, outputDenseValuesShape] = raggedGatherImpl($paramsNestedSplits, $paramsNestedSplitsShapes, $paramsDenseValues, paramsDenseValues.shape, paramsDenseValues.dtype, $indices, indices.shape, outputRaggedRank);\n    const outputNestedSplitsTensors = outputNestedSplits.map((splits) => backend.makeTensorInfo([splits.length], 'int32', splits));\n    const outputDenseValuesTensor = backend.makeTensorInfo(outputDenseValuesShape, paramsDenseValues.dtype, outputDenseValues);\n    return outputNestedSplitsTensors.concat([outputDenseValuesTensor]);\n}\nexport const raggedGatherConfig = {\n    kernelName: RaggedGather,\n    backendName: 'cpu',\n    kernelFunc: raggedGather,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkR2F0aGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9SYWdnZWRHYXRoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixZQUFZLEVBQWdFLE1BQU0sdUJBQXVCLENBQUM7QUFJNUksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2hFLE1BQU0sRUFBQyxnQkFBZ0IsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVqQyxNQUFNLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FDOUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQyxDQUFDO0lBQzFELE1BQU0seUJBQXlCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sa0JBQWtCLEdBQ3BCLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDcEUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFdkUsTUFBTSxDQUFDLGtCQUFrQixFQUFFLGlCQUFpQixFQUFFLHNCQUFzQixDQUFDLEdBQ2pFLGdCQUFnQixDQUNaLG1CQUFtQixFQUFFLHlCQUF5QixFQUFFLGtCQUFrQixFQUNsRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFDMUQsT0FBTyxDQUFDLEtBQUssRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXpDLE1BQU0seUJBQXlCLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUNwRCxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUUxRSxNQUFNLHVCQUF1QixHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQ2xELHNCQUFzQixFQUFFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBRXhFLE9BQU8seUJBQXlCLENBQUMsTUFBTSxDQUFDLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFlBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYWdnZWRHYXRoZXIsIFJhZ2dlZEdhdGhlckF0dHJzLCBSYWdnZWRHYXRoZXJJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtyYWdnZWRHYXRoZXJJbXBsfSBmcm9tICcuL1JhZ2dlZEdhdGhlcl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJhZ2dlZEdhdGhlcihhcmdzOiB7XG4gIGlucHV0czogUmFnZ2VkR2F0aGVySW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IFJhZ2dlZEdhdGhlckF0dHJzXG59KTogVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtc05lc3RlZFNwbGl0cywgcGFyYW1zRGVuc2VWYWx1ZXMsIGluZGljZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7b3V0cHV0UmFnZ2VkUmFua30gPSBhdHRycztcblxuICBjb25zdCAkcGFyYW1zTmVzdGVkU3BsaXRzID0gcGFyYW1zTmVzdGVkU3BsaXRzLm1hcChcbiAgICAgIHQgPT4gYmFja2VuZC5kYXRhLmdldCh0LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xuICBjb25zdCAkcGFyYW1zTmVzdGVkU3BsaXRzU2hhcGVzID0gcGFyYW1zTmVzdGVkU3BsaXRzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICBjb25zdCAkcGFyYW1zRGVuc2VWYWx1ZXMgPVxuICAgICAgYmFja2VuZC5kYXRhLmdldChwYXJhbXNEZW5zZVZhbHVlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW5kaWNlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtvdXRwdXROZXN0ZWRTcGxpdHMsIG91dHB1dERlbnNlVmFsdWVzLCBvdXRwdXREZW5zZVZhbHVlc1NoYXBlXSA9XG4gICAgICByYWdnZWRHYXRoZXJJbXBsKFxuICAgICAgICAgICRwYXJhbXNOZXN0ZWRTcGxpdHMsICRwYXJhbXNOZXN0ZWRTcGxpdHNTaGFwZXMsICRwYXJhbXNEZW5zZVZhbHVlcyxcbiAgICAgICAgICBwYXJhbXNEZW5zZVZhbHVlcy5zaGFwZSwgcGFyYW1zRGVuc2VWYWx1ZXMuZHR5cGUsICRpbmRpY2VzLFxuICAgICAgICAgIGluZGljZXMuc2hhcGUsIG91dHB1dFJhZ2dlZFJhbmspO1xuXG4gIGNvbnN0IG91dHB1dE5lc3RlZFNwbGl0c1RlbnNvcnMgPSBvdXRwdXROZXN0ZWRTcGxpdHMubWFwKFxuICAgICAgKHNwbGl0cykgPT4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc3BsaXRzLmxlbmd0aF0sICdpbnQzMicsIHNwbGl0cykpO1xuXG4gIGNvbnN0IG91dHB1dERlbnNlVmFsdWVzVGVuc29yID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIG91dHB1dERlbnNlVmFsdWVzU2hhcGUsIHBhcmFtc0RlbnNlVmFsdWVzLmR0eXBlLCBvdXRwdXREZW5zZVZhbHVlcyk7XG5cbiAgcmV0dXJuIG91dHB1dE5lc3RlZFNwbGl0c1RlbnNvcnMuY29uY2F0KFtvdXRwdXREZW5zZVZhbHVlc1RlbnNvcl0pO1xufVxuXG5leHBvcnQgY29uc3QgcmFnZ2VkR2F0aGVyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJhZ2dlZEdhdGhlcixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiByYWdnZWRHYXRoZXIgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RaggedTensorToTensor } from '@tensorflow/tfjs-core';\nimport { raggedTensorToTensorImpl } from './RaggedTensorToTensor_impl';\nexport function raggedTensorToTensor(args) {\n    const { inputs, backend, attrs } = args;\n    const { shape, values, defaultValue, rowPartitionTensors } = inputs;\n    const { rowPartitionTypes } = attrs;\n    const $shape = backend.data.get(shape.dataId).values;\n    const $values = backend.data.get(values.dataId).values;\n    const $defaultValue = backend.data.get(defaultValue.dataId).values;\n    const $rowPartitionValues = rowPartitionTensors.map(t => backend.data.get(t.dataId).values);\n    const rowPartitionValuesShapes = rowPartitionTensors.map(t => t.shape);\n    const [outputShape, output] = raggedTensorToTensorImpl($shape, shape.shape, $values, values.shape, values.dtype, $defaultValue, defaultValue.shape, $rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypes);\n    return backend.makeTensorInfo(outputShape, values.dtype, output);\n}\nexport const raggedTensorToTensorConfig = {\n    kernelName: RaggedTensorToTensor,\n    backendName: 'cpu',\n    kernelFunc: raggedTensorToTensor,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkVGVuc29yVG9UZW5zb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JhZ2dlZFRlbnNvclRvVGVuc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsb0JBQW9CLEVBQWdGLE1BQU0sdUJBQXVCLENBQUM7QUFJcEssT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFFckUsTUFBTSxVQUFVLG9CQUFvQixDQUFDLElBSXBDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxtQkFBbUIsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNsRSxNQUFNLEVBQUMsaUJBQWlCLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDbkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDckUsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDL0QsTUFBTSxtQkFBbUIsR0FBRyxtQkFBbUIsQ0FBQyxHQUFHLENBQy9DLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUMsQ0FBQztJQUMxRCxNQUFNLHdCQUF3QixHQUFHLG1CQUFtQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2RSxNQUFNLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxHQUFHLHdCQUF3QixDQUNsRCxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLGFBQWEsRUFDdkUsWUFBWSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSx3QkFBd0IsRUFDakUsaUJBQWlCLENBQUMsQ0FBQztJQUN2QixPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDbkUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFpQjtJQUN0RCxVQUFVLEVBQUUsb0JBQW9CO0lBQ2hDLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxvQkFBd0M7Q0FDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhZ2dlZFRlbnNvclRvVGVuc29yLCBSYWdnZWRUZW5zb3JUb1RlbnNvckF0dHJzLCBSYWdnZWRUZW5zb3JUb1RlbnNvcklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5pbXBvcnQge3JhZ2dlZFRlbnNvclRvVGVuc29ySW1wbH0gZnJvbSAnLi9SYWdnZWRUZW5zb3JUb1RlbnNvcl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJhZ2dlZFRlbnNvclRvVGVuc29yKGFyZ3M6IHtcbiAgaW5wdXRzOiBSYWdnZWRUZW5zb3JUb1RlbnNvcklucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBSYWdnZWRUZW5zb3JUb1RlbnNvckF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzaGFwZSwgdmFsdWVzLCBkZWZhdWx0VmFsdWUsIHJvd1BhcnRpdGlvblRlbnNvcnN9ID0gaW5wdXRzO1xuICBjb25zdCB7cm93UGFydGl0aW9uVHlwZXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgJHNoYXBlID0gYmFja2VuZC5kYXRhLmdldChzaGFwZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkdmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh2YWx1ZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9XG4gICAgICBiYWNrZW5kLmRhdGEuZ2V0KGRlZmF1bHRWYWx1ZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkcm93UGFydGl0aW9uVmFsdWVzID0gcm93UGFydGl0aW9uVGVuc29ycy5tYXAoXG4gICAgICB0ID0+IGJhY2tlbmQuZGF0YS5nZXQodC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3Qgcm93UGFydGl0aW9uVmFsdWVzU2hhcGVzID0gcm93UGFydGl0aW9uVGVuc29ycy5tYXAodCA9PiB0LnNoYXBlKTtcblxuICBjb25zdCBbb3V0cHV0U2hhcGUsIG91dHB1dF0gPSByYWdnZWRUZW5zb3JUb1RlbnNvckltcGwoXG4gICAgICAkc2hhcGUsIHNoYXBlLnNoYXBlLCAkdmFsdWVzLCB2YWx1ZXMuc2hhcGUsIHZhbHVlcy5kdHlwZSwgJGRlZmF1bHRWYWx1ZSxcbiAgICAgIGRlZmF1bHRWYWx1ZS5zaGFwZSwgJHJvd1BhcnRpdGlvblZhbHVlcywgcm93UGFydGl0aW9uVmFsdWVzU2hhcGVzLFxuICAgICAgcm93UGFydGl0aW9uVHlwZXMpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRTaGFwZSwgdmFsdWVzLmR0eXBlLCBvdXRwdXQpO1xufVxuXG5leHBvcnQgY29uc3QgcmFnZ2VkVGVuc29yVG9UZW5zb3JDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmFnZ2VkVGVuc29yVG9UZW5zb3IsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmFnZ2VkVGVuc29yVG9UZW5zb3IgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Range } from '@tensorflow/tfjs-core';\nimport { rangeImpl } from './Range_impl';\nexport function range(args) {\n    const { backend, attrs } = args;\n    const { start, stop, dtype, step } = attrs;\n    const values = rangeImpl(start, stop, step, dtype);\n    return backend.makeTensorInfo([values.length], dtype, values);\n}\nexport const rangeConfig = {\n    kernelName: Range,\n    backendName: 'cpu',\n    kernelFunc: range\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JhbmdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsS0FBSyxFQUF5QixNQUFNLHVCQUF1QixDQUFDO0FBRzlGLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFdkMsTUFBTSxVQUFVLEtBQUssQ0FBQyxJQUFrRDtJQUV0RSxNQUFNLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUM5QixNQUFNLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXpDLE1BQU0sTUFBTSxHQUFHLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNuRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFuZ2UsIFJhbmdlQXR0cnMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7cmFuZ2VJbXBsfSBmcm9tICcuL1JhbmdlX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmFuZ2UoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogUmFuZ2VBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7YmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3N0YXJ0LCBzdG9wLCBkdHlwZSwgc3RlcH0gPSBhdHRycztcblxuICBjb25zdCB2YWx1ZXMgPSByYW5nZUltcGwoc3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3ZhbHVlcy5sZW5ndGhdLCBkdHlwZSwgdmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJhbmdlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJhbmdlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJhbmdlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reciprocal } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const reciprocal = unaryKernelFunc(Reciprocal, (xi) => 1 / xi);\nexport const reciprocalConfig = {\n    kernelName: Reciprocal,\n    backendName: 'cpu',\n    kernelFunc: reciprocal,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjaXByb2NhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVjaXByb2NhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFL0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyxlQUFlLENBQUMsVUFBVSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7QUFFdEUsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQzVDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxVQUFVO0NBQ3ZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUmVjaXByb2NhbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHJlY2lwcm9jYWwgPSB1bmFyeUtlcm5lbEZ1bmMoUmVjaXByb2NhbCwgKHhpKSA9PiAxIC8geGkpO1xuXG5leHBvcnQgY29uc3QgcmVjaXByb2NhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWNpcHJvY2FsLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJlY2lwcm9jYWwsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeBilinear, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function resizeBilinear(args) {\n    const { inputs, backend, attrs } = args;\n    const { images } = inputs;\n    const { alignCorners, halfPixelCenters, size } = attrs;\n    assertNotComplex(images, 'resizeBilinear');\n    const imagesStrides = util.computeStrides(images.shape);\n    const [newHeight, newWidth] = size;\n    const [batch, oldHeight, oldWidth, numChannels] = images.shape;\n    const xValues = backend.data.get(images.dataId).values;\n    const result = new Float32Array(util.sizeFromShape([batch, newHeight, newWidth, numChannels]));\n    const effectiveInputSize = [\n        (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n        (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n    ];\n    const effectiveOutputSize = [\n        (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n        (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n    ];\n    let outputIdx = 0;\n    const effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0];\n    const effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1];\n    for (let b = 0; b < batch; b++) {\n        for (let r = 0; r < newHeight; r++) {\n            let sourceFracRow;\n            if (halfPixelCenters) {\n                sourceFracRow = effectiveRowSizeRatio * (r + 0.5) - 0.5;\n            }\n            else {\n                sourceFracRow = effectiveRowSizeRatio * r;\n            }\n            const sourceRowFloor = Math.max(0, Math.floor(sourceFracRow));\n            const rowFrac = sourceFracRow - sourceRowFloor;\n            const sourceRowCeil = Math.min(oldHeight - 1, Math.ceil(sourceFracRow));\n            const topRowOffset = b * imagesStrides[0] + sourceRowFloor * imagesStrides[1];\n            const botRowOffset = b * imagesStrides[0] + sourceRowCeil * imagesStrides[1];\n            for (let c = 0; c < newWidth; c++) {\n                let sourceFracCol;\n                if (halfPixelCenters) {\n                    sourceFracCol = effectiveColSizeRatio * (c + 0.5) - 0.5;\n                }\n                else {\n                    sourceFracCol = effectiveColSizeRatio * c;\n                }\n                const sourceColFloor = Math.max(0, Math.floor(sourceFracCol));\n                const colFrac = sourceFracCol - sourceColFloor;\n                const sourceColCeil = Math.min(oldWidth - 1, Math.ceil(sourceFracCol));\n                const topLeftOffest = topRowOffset + sourceColFloor * imagesStrides[2];\n                const botLeftOffset = botRowOffset + sourceColFloor * imagesStrides[2];\n                const topRightOffset = topRowOffset + sourceColCeil * imagesStrides[2];\n                const botRightOffest = botRowOffset + sourceColCeil * imagesStrides[2];\n                for (let d = 0; d < numChannels; d++) {\n                    // Begin shader.\n                    // Compute the fractional index of the source.\n                    const topLeft = xValues[topLeftOffest + d];\n                    const bottomLeft = xValues[botLeftOffset + d];\n                    const topRight = xValues[topRightOffset + d];\n                    const bottomRight = xValues[botRightOffest + d];\n                    const top = topLeft + (topRight - topLeft) * colFrac;\n                    const bottom = bottomLeft + (bottomRight - bottomLeft) * colFrac;\n                    const newValue = top + (bottom - top) * rowFrac;\n                    result[outputIdx++] = newValue;\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo([batch, newHeight, newWidth, numChannels], 'float32', result);\n}\nexport const resizeBilinearConfig = {\n    kernelName: ResizeBilinear,\n    backendName: 'cpu',\n    kernelFunc: resizeBilinear\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsY0FBYyxFQUFxRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd4SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUk5QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJELGdCQUFnQixDQUFDLE1BQU0sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO0lBRTNDLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRW5DLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQy9ELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUMzQixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FB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QUFDO2lCQUNoQzthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FDekIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFpQjtJQUNoRCxVQUFVLEVBQUUsY0FBYztJQUMxQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsY0FBa0M7Q0FDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZUJpbGluZWFyLCBSZXNpemVCaWxpbmVhckF0dHJzLCBSZXNpemVCaWxpbmVhcklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogUmVzaXplQmlsaW5lYXJBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZX0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KGltYWdlcywgJ3Jlc2l6ZUJpbGluZWFyJyk7XG5cbiAgY29uc3QgaW1hZ2VzU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2VzLnNoYXBlKTtcbiAgY29uc3QgW25ld0hlaWdodCwgbmV3V2lkdGhdID0gc2l6ZTtcblxuICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlcy5zaGFwZTtcbiAgY29uc3QgeFZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQoaW1hZ2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IHJlc3VsdCA9IG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICB1dGlsLnNpemVGcm9tU2hhcGUoW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBudW1DaGFubmVsc10pKTtcblxuICBjb25zdCBlZmZlY3RpdmVJbnB1dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gb2xkV2lkdGggLSAxIDogb2xkV2lkdGhcbiAgXTtcblxuICBjb25zdCBlZmZlY3RpdmVPdXRwdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3SGVpZ2h0ID4gMSkgPyBuZXdIZWlnaHQgLSAxIDogbmV3SGVpZ2h0LFxuICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gIF07XG4gIGxldCBvdXRwdXRJZHggPSAwO1xuICBjb25zdCBlZmZlY3RpdmVSb3dTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMF0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzBdO1xuICBjb25zdCBlZmZlY3RpdmVDb2xTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMV0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzFdO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IG5ld0hlaWdodDsgcisrKSB7XG4gICAgICBsZXQgc291cmNlRnJhY1JvdzogbnVtYmVyO1xuICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgc291cmNlRnJhY1JvdyA9IGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIChyICsgMC41KSAtIDAuNTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHNvdXJjZUZyYWNSb3cgPSBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiByO1xuICAgICAgfVxuXG4gICAgICBjb25zdCBzb3VyY2VSb3dGbG9vciA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3Ioc291cmNlRnJhY1JvdykpO1xuICAgICAgY29uc3Qgcm93RnJhYyA9IHNvdXJjZUZyYWNSb3cgLSBzb3VyY2VSb3dGbG9vcjtcbiAgICAgIGNvbnN0IHNvdXJjZVJvd0NlaWwgPSBNYXRoLm1pbihvbGRIZWlnaHQgLSAxLCBNYXRoLmNlaWwoc291cmNlRnJhY1JvdykpO1xuICAgICAgY29uc3QgdG9wUm93T2Zmc2V0ID1cbiAgICAgICAgICBiICogaW1hZ2VzU3RyaWRlc1swXSArIHNvdXJjZVJvd0Zsb29yICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgIGNvbnN0IGJvdFJvd09mZnNldCA9XG4gICAgICAgICAgYiAqIGltYWdlc1N0cmlkZXNbMF0gKyBzb3VyY2VSb3dDZWlsICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbmV3V2lkdGg7IGMrKykge1xuICAgICAgICBsZXQgc291cmNlRnJhY0NvbDogbnVtYmVyO1xuICAgICAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgICAgIHNvdXJjZUZyYWNDb2wgPSBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiAoYyArIDAuNSkgLSAwLjU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc291cmNlRnJhY0NvbCA9IGVmZmVjdGl2ZUNvbFNpemVSYXRpbyAqIGM7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc291cmNlQ29sRmxvb3IgPSBNYXRoLm1heCgwLCBNYXRoLmZsb29yKHNvdXJjZUZyYWNDb2wpKTtcbiAgICAgICAgY29uc3QgY29sRnJhYyA9IHNvdXJjZUZyYWNDb2wgLSBzb3VyY2VDb2xGbG9vcjtcbiAgICAgICAgY29uc3Qgc291cmNlQ29sQ2VpbCA9IE1hdGgubWluKG9sZFdpZHRoIC0gMSwgTWF0aC5jZWlsKHNvdXJjZUZyYWNDb2wpKTtcbiAgICAgICAgY29uc3QgdG9wTGVmdE9mZmVzdCA9IHRvcFJvd09mZnNldCArIHNvdXJjZUNvbEZsb29yICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgYm90TGVmdE9mZnNldCA9IGJvdFJvd09mZnNldCArIHNvdXJjZUNvbEZsb29yICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgdG9wUmlnaHRPZmZzZXQgPSB0b3BSb3dPZmZzZXQgKyBzb3VyY2VDb2xDZWlsICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgYm90UmlnaHRPZmZlc3QgPSBib3RSb3dPZmZzZXQgKyBzb3VyY2VDb2xDZWlsICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgZm9yIChsZXQgZCA9IDA7IGQgPCBudW1DaGFubmVsczsgZCsrKSB7XG4gICAgICAgICAgLy8gQmVnaW4gc2hhZGVyLlxuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCBpbmRleCBvZiB0aGUgc291cmNlLlxuICAgICAgICAgIGNvbnN0IHRvcExlZnQgPSB4VmFsdWVzW3RvcExlZnRPZmZlc3QgKyBkXTtcbiAgICAgICAgICBjb25zdCBib3R0b21MZWZ0ID0geFZhbHVlc1tib3RMZWZ0T2Zmc2V0ICsgZF07XG4gICAgICAgICAgY29uc3QgdG9wUmlnaHQgPSB4VmFsdWVzW3RvcFJpZ2h0T2Zmc2V0ICsgZF07XG4gICAgICAgICAgY29uc3QgYm90dG9tUmlnaHQgPSB4VmFsdWVzW2JvdFJpZ2h0T2ZmZXN0ICsgZF07XG5cbiAgICAgICAgICBjb25zdCB0b3AgPSB0b3BMZWZ0ICsgKHRvcFJpZ2h0IC0gdG9wTGVmdCkgKiBjb2xGcmFjO1xuICAgICAgICAgIGNvbnN0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGNvbEZyYWM7XG4gICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0b3AgKyAoYm90dG9tIC0gdG9wKSAqIHJvd0ZyYWM7XG5cbiAgICAgICAgICByZXN1bHRbb3V0cHV0SWR4KytdID0gbmV3VmFsdWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgbnVtQ2hhbm5lbHNdLCAnZmxvYXQzMicsIHJlc3VsdCk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVCaWxpbmVhcixcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeBilinearGrad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function resizeBilinearGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { images, dy } = inputs;\n    const { alignCorners } = attrs;\n    assertNotComplex([dy, images], 'resizeBilinearGrad');\n    const imagesStrides = util.computeStrides(images.shape);\n    const [batch, xHeight, xWidth, depth] = images.shape;\n    const [, yHeight, yWidth] = dy.shape;\n    const output = new Float32Array(batch * xHeight * xWidth * depth);\n    // In the backwards pass, we want to find the pixels that were generated\n    // for each pixel in the input image the forward pass and add the\n    // corresponding coefficient from dy to the gradient (with some\n    // interpolation).\n    const effectiveXSize = [\n        (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight,\n        (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth\n    ];\n    const effectiveYSize = [\n        (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight,\n        (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth\n    ];\n    const heightScale = effectiveXSize[0] / effectiveYSize[0];\n    const widthScale = effectiveXSize[1] / effectiveYSize[1];\n    // Reference implementation\n    // tslint:disable-next-line:max-line-length\n    // https://github.com/tensorflow/tensorflow/blob/3039375c86a5bbc9610c7725dcaa95d635f87ba2/tensorflow/core/kernels/resize_bilinear_op.cc#L275\n    const dyValues = backend.data.get(dy.dataId).values;\n    let offset = 0;\n    for (let b = 0; b < batch; b++) {\n        const bOffset = b * imagesStrides[0];\n        for (let r = 0; r < yHeight; r++) {\n            const dxR = r * heightScale;\n            const topDxRIndex = Math.floor(dxR);\n            const bottomDxRIndex = Math.min(Math.ceil(dxR), xHeight - 1);\n            const topDxROffset = bOffset + topDxRIndex * imagesStrides[1];\n            const bottomDxROffset = bOffset + bottomDxRIndex * imagesStrides[1];\n            const dxRLerp = dxR - topDxRIndex;\n            const inverseDxRLerp = 1.0 - dxRLerp;\n            for (let c = 0; c < yWidth; c++) {\n                const dxC = c * widthScale;\n                const leftDxCIndex = Math.floor(dxC);\n                const rightDxCIndex = Math.min(Math.ceil(dxC), xWidth - 1);\n                const dxCLerp = dxC - leftDxCIndex;\n                const inverseDxCLerp = 1.0 - dxCLerp;\n                const topLeftRCOffset = topDxROffset + leftDxCIndex * imagesStrides[2];\n                const topRightRCOffset = topDxROffset + rightDxCIndex * imagesStrides[2];\n                const bottomLeftRCOffset = bottomDxROffset + leftDxCIndex * imagesStrides[2];\n                const bottomRightRCOffset = bottomDxROffset + rightDxCIndex * imagesStrides[2];\n                const inverseDxRLerpTimesInverseDxCLerp = inverseDxRLerp * inverseDxCLerp;\n                const inverseDxRLerpTimesDxCLerp = inverseDxRLerp * dxCLerp;\n                const dxRLerpTimesInverseDxCLerp = dxRLerp * inverseDxCLerp;\n                const dxRLerpTimesDxCLerp = dxRLerp * dxCLerp;\n                for (let d = 0; d < depth; d++) {\n                    const dyVal = dyValues[offset++];\n                    output[topLeftRCOffset + d] +=\n                        dyVal * inverseDxRLerpTimesInverseDxCLerp;\n                    output[topRightRCOffset + d] += dyVal * inverseDxRLerpTimesDxCLerp;\n                    output[bottomLeftRCOffset + d] += dyVal * dxRLerpTimesInverseDxCLerp;\n                    output[bottomRightRCOffset + d] += dyVal * dxRLerpTimesDxCLerp;\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo([batch, xWidth, xHeight, depth], 'float32', output);\n}\nexport const resizeBilinearGradConfig = {\n    kernelName: ResizeBilinearGrad,\n    backendName: 'cpu',\n    kernelFunc: resizeBilinearGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXJHcmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixrQkFBa0IsRUFBNkUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHcEssT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUlsQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTdCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFFckQsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDckQsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUM7SUFFckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxHQUFHLE9BQU8sR0FBRyxNQUFNLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFFbEUsd0VBQXdFO0lBQ3hFLGlFQUFpRTtJQUNqRSwrREFBK0Q7SUFDL0Qsa0JBQWtCO0lBRWxCLE1BQU0sY0FB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QVUsRUFBRSxrQkFBa0I7SUFDOUIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLGtCQUFzQztDQUNuRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaXplQmlsaW5lYXJHcmFkLCBSZXNpemVCaWxpbmVhckdyYWRBdHRycywgUmVzaXplQmlsaW5lYXJHcmFkSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyR3JhZChhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IFJlc2l6ZUJpbGluZWFyR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXMsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVyc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFtkeSwgaW1hZ2VzXSwgJ3Jlc2l6ZUJpbGluZWFyR3JhZCcpO1xuXG4gIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG5cbiAgY29uc3QgW2JhdGNoLCB4SGVpZ2h0LCB4V2lkdGgsIGRlcHRoXSA9IGltYWdlcy5zaGFwZTtcbiAgY29uc3QgWywgeUhlaWdodCwgeVdpZHRoXSA9IGR5LnNoYXBlO1xuXG4gIGNvbnN0IG91dHB1dCA9IG5ldyBGbG9hdDMyQXJyYXkoYmF0Y2ggKiB4SGVpZ2h0ICogeFdpZHRoICogZGVwdGgpO1xuXG4gIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZFxuICAvLyBmb3IgZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzcyBhbmQgYWRkIHRoZVxuICAvLyBjb3JyZXNwb25kaW5nIGNvZWZmaWNpZW50IGZyb20gZHkgdG8gdGhlIGdyYWRpZW50ICh3aXRoIHNvbWVcbiAgLy8gaW50ZXJwb2xhdGlvbikuXG5cbiAgY29uc3QgZWZmZWN0aXZlWFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB4SGVpZ2h0IC0gMSA6IHhIZWlnaHQsXG4gICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHhXaWR0aCAtIDEgOiB4V2lkdGhcbiAgXTtcblxuICBjb25zdCBlZmZlY3RpdmVZU2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFtcbiAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHlIZWlnaHQgLSAxIDogeUhlaWdodCxcbiAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICBdO1xuXG4gIGNvbnN0IGhlaWdodFNjYWxlID0gZWZmZWN0aXZlWFNpemVbMF0gLyBlZmZlY3RpdmVZU2l6ZVswXTtcbiAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG5cbiAgLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iLzMwMzkzNzVjODZhNWJiYzk2MTBjNzcyNWRjYWE5NWQ2MzVmODdiYTIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvcmVzaXplX2JpbGluZWFyX29wLmNjI0wyNzVcbiAgY29uc3QgZHlWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGR5LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGxldCBvZmZzZXQgPSAwO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICBjb25zdCBiT2Zmc2V0ID0gYiAqIGltYWdlc1N0cmlkZXNbMF07XG4gICAgZm9yIChsZXQgciA9IDA7IHIgPCB5SGVpZ2h0OyByKyspIHtcbiAgICAgIGNvbnN0IGR4UiA9IHIgKiBoZWlnaHRTY2FsZTtcbiAgICAgIGNvbnN0IHRvcER4UkluZGV4ID0gTWF0aC5mbG9vcihkeFIpO1xuICAgICAgY29uc3QgYm90dG9tRHhSSW5kZXggPSBNYXRoLm1pbihNYXRoLmNlaWwoZHhSKSwgeEhlaWdodCAtIDEpO1xuXG4gICAgICBjb25zdCB0b3BEeFJPZmZzZXQgPSBiT2Zmc2V0ICsgdG9wRHhSSW5kZXggKiBpbWFnZXNTdHJpZGVzWzFdO1xuICAgICAgY29uc3QgYm90dG9tRHhST2Zmc2V0ID0gYk9mZnNldCArIGJvdHRvbUR4UkluZGV4ICogaW1hZ2VzU3RyaWRlc1sxXTtcblxuICAgICAgY29uc3QgZHhSTGVycCA9IGR4UiAtIHRvcER4UkluZGV4O1xuICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnAgPSAxLjAgLSBkeFJMZXJwO1xuICAgICAgZm9yIChsZXQgYyA9IDA7IGMgPCB5V2lkdGg7IGMrKykge1xuICAgICAgICBjb25zdCBkeEMgPSBjICogd2lkdGhTY2FsZTtcbiAgICAgICAgY29uc3QgbGVmdER4Q0luZGV4ID0gTWF0aC5mbG9vcihkeEMpO1xuICAgICAgICBjb25zdCByaWdodER4Q0luZGV4ID0gTWF0aC5taW4oTWF0aC5jZWlsKGR4QyksIHhXaWR0aCAtIDEpO1xuICAgICAgICBjb25zdCBkeENMZXJwID0gZHhDIC0gbGVmdER4Q0luZGV4O1xuICAgICAgICBjb25zdCBpbnZlcnNlRHhDTGVycCA9IDEuMCAtIGR4Q0xlcnA7XG5cbiAgICAgICAgY29uc3QgdG9wTGVmdFJDT2Zmc2V0ID0gdG9wRHhST2Zmc2V0ICsgbGVmdER4Q0luZGV4ICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgdG9wUmlnaHRSQ09mZnNldCA9XG4gICAgICAgICAgICB0b3BEeFJPZmZzZXQgKyByaWdodER4Q0luZGV4ICogaW1hZ2VzU3RyaWRlc1syXTtcbiAgICAgICAgY29uc3QgYm90dG9tTGVmdFJDT2Zmc2V0ID1cbiAgICAgICAgICAgIGJvdHRvbUR4Uk9mZnNldCArIGxlZnREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG4gICAgICAgIGNvbnN0IGJvdHRvbVJpZ2h0UkNPZmZzZXQgPVxuICAgICAgICAgICAgYm90dG9tRHhST2Zmc2V0ICsgcmlnaHREeENJbmRleCAqIGltYWdlc1N0cmlkZXNbMl07XG5cbiAgICAgICAgY29uc3QgaW52ZXJzZUR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwID1cbiAgICAgICAgICAgIGludmVyc2VEeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgIGNvbnN0IGludmVyc2VEeFJMZXJwVGltZXNEeENMZXJwID0gaW52ZXJzZUR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICBjb25zdCBkeFJMZXJwVGltZXNJbnZlcnNlRHhDTGVycCA9IGR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgY29uc3QgZHhSTGVycFRpbWVzRHhDTGVycCA9IGR4UkxlcnAgKiBkeENMZXJwO1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IGRlcHRoOyBkKyspIHtcbiAgICAgICAgICBjb25zdCBkeVZhbCA9IGR5VmFsdWVzW29mZnNldCsrXTtcbiAgICAgICAgICBvdXRwdXRbdG9wTGVmdFJDT2Zmc2V0ICsgZF0gKz1cbiAgICAgICAgICAgICAgZHlWYWwgKiBpbnZlcnNlRHhSTGVycFRpbWVzSW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgb3V0cHV0W3RvcFJpZ2h0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGludmVyc2VEeFJMZXJwVGltZXNEeENMZXJwO1xuICAgICAgICAgIG91dHB1dFtib3R0b21MZWZ0UkNPZmZzZXQgKyBkXSArPSBkeVZhbCAqIGR4UkxlcnBUaW1lc0ludmVyc2VEeENMZXJwO1xuICAgICAgICAgIG91dHB1dFtib3R0b21SaWdodFJDT2Zmc2V0ICsgZF0gKz0gZHlWYWwgKiBkeFJMZXJwVGltZXNEeENMZXJwO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICBbYmF0Y2gsIHhXaWR0aCwgeEhlaWdodCwgZGVwdGhdLCAnZmxvYXQzMicsIG91dHB1dCk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNpemVCaWxpbmVhckdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXJHcmFkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeNearestNeighbor, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function resizeNearestNeighbor(args) {\n    const { inputs, backend, attrs } = args;\n    const { images } = inputs;\n    const { alignCorners, halfPixelCenters, size } = attrs;\n    assertNotComplex(images, 'resizeNearestNeighbor');\n    const imagesStrides = util.computeStrides(images.shape);\n    const [newHeight, newWidth] = size;\n    const [batch, oldHeight, oldWidth, numChannels] = images.shape;\n    const xValues = backend.data.get(images.dataId).values;\n    const output = new Float32Array(batch * newHeight * newWidth * numChannels);\n    const effectiveInputSize = [\n        (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n        (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n    ];\n    const effectiveOutputSize = [\n        (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n        (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n    ];\n    const effectiveRowSizeRatio = effectiveInputSize[0] / effectiveOutputSize[0];\n    const effectiveColSizeRatio = effectiveInputSize[1] / effectiveOutputSize[1];\n    let outputOffset = 0;\n    for (let b = 0; b < batch; b++) {\n        const batchOffset = b * imagesStrides[0];\n        for (let r = 0; r < newHeight; r++) {\n            const sourceFracRow = halfPixelCenters ?\n                effectiveRowSizeRatio * (r + 0.5) :\n                effectiveRowSizeRatio * r;\n            let sourceNearestRow = Math.min(oldHeight - 1, alignCorners ? Math.round(sourceFracRow) : Math.floor(sourceFracRow));\n            if (halfPixelCenters) {\n                sourceNearestRow = Math.max(0, sourceNearestRow);\n            }\n            const rowOffset = batchOffset + sourceNearestRow * imagesStrides[1];\n            for (let c = 0; c < newWidth; c++) {\n                const sourceFracCol = halfPixelCenters ?\n                    effectiveColSizeRatio * (c + 0.5) :\n                    effectiveColSizeRatio * c;\n                let sourceNearestCol = Math.min(oldWidth - 1, alignCorners ? Math.round(sourceFracCol) :\n                    Math.floor(sourceFracCol));\n                if (halfPixelCenters) {\n                    sourceNearestCol = Math.max(0, sourceNearestCol);\n                }\n                const colOffset = rowOffset + sourceNearestCol * imagesStrides[2];\n                for (let d = 0; d < numChannels; d++) {\n                    // Begin shader.\n                    // Compute the fractional index of the source.\n                    const newVal = xValues[colOffset + d];\n                    output[outputOffset++] = newVal;\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo([batch, newHeight, newWidth, numChannels], images.dtype, output);\n}\nexport const resizeNearestNeighborConfig = {\n    kernelName: ResizeNearestNeighbor,\n    backendName: 'cpu',\n    kernelFunc: resizeNearestNeighbor\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixxQkFBcUIsRUFBbUYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHN0ssT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUlyQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sRUFBQyxZQUFZLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJELGdCQUFnQixDQUFDLE1BQU0sRUFBRSx1QkFBdUIsQ0FBQyxDQUFDO0lBRWxELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hELE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQUcsSUFBSSxDQUFDO0lBRW5DLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDO0lBQy9ELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ3JFLE1BQU0sTUFBTSxHQUFHLElBQUksWUFBWSxDQUFDLEtBQUssR0FBRyxTQUFTLEdBQUcsUUFBUSxHQUFHLFdBQVcsQ0FBQyxDQUFDO0lBRTVFLE1BQU0sa0JBQWtCLEdBQXFCO1FBQzNDLENBQUMsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMzRCxDQUFDLFlBQVksSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7S0FDekQsQ0FBQztJQUVGLE1BQU0sbUJBQW1CLEdBQXFCO1FBQzVDLENBQUMsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztRQUMzRCxDQUFDLFlBQVksSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7S0FDekQsQ0FBQztJQUVGLE1BQU0scUJBQXFCLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxxQkFBcUIsR0FBRyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU3RSxJQUFJLFlBQVksR0FBRyxDQUFDLENBQUM7SUFDckIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM5QixNQUFNLFdBQVcsR0FBRyxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3pDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEMsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQztnQkFDcEMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztnQkFDbkMscUJBQXFCLEdBQUcsQ0FBQyxDQUFDO1lBQzlCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDM0IsU0FBUyxHQUFHLENBQUMsRUFDYixZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztZQUMxRSxJQUFJLGdCQUFnQixFQUFFO2dCQUNwQixnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2FBQ2xEO1lBQ0QsTUFBTSxTQUFTLEdBQUcsV0FBVyxHQUFHLGdCQUFnQixHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNwRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNqQyxNQUFNLGFBQWEsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDO29CQUNwQyxxQkFBcUIsR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDO29CQUNuQyxxQkFBcUIsR0FBRyxDQUFDLENBQUM7Z0JBQzlCLElBQUksZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FDM0IsUUFBUSxHQUFHLENBQUMsRUFDWixZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztvQkFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO2dCQUM5QyxJQUFJLGdCQUFnQixFQUFFO29CQUNwQixnQkFBZ0IsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO2lCQUNsRDtnQkFDRCxNQUFNLFNBQVMsR0FBRyxTQUFTLEdBQUcsZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNsRSxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsV0FBVyxFQUFFLENBQUMsRUFBRSxFQUFFO29CQUNwQyxnQkFBZ0I7b0JBQ2hCLDhDQUE4QztvQkFDOUMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQztvQkFDdEMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDO2lCQUNqQzthQUNGO1NBQ0Y7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FDekIsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxXQUFXLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBaUI7SUFDdkQsVUFBVSxFQUFFLHFCQUFxQjtJQUNqQyxXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUscUJBQXlDO0NBQ3RELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXNpemVOZWFyZXN0TmVpZ2hib3IsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckF0dHJzLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yKGFyZ3M6IHtcbiAgaW5wdXRzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogUmVzaXplTmVhcmVzdE5laWdoYm9yQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHthbGlnbkNvcm5lcnMsIGhhbGZQaXhlbENlbnRlcnMsIHNpemV9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChpbWFnZXMsICdyZXNpemVOZWFyZXN0TmVpZ2hib3InKTtcblxuICBjb25zdCBpbWFnZXNTdHJpZGVzID0gdXRpbC5jb21wdXRlU3RyaWRlcyhpbWFnZXMuc2hhcGUpO1xuICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuXG4gIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2VzLnNoYXBlO1xuICBjb25zdCB4VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIG5ld0hlaWdodCAqIG5ld1dpZHRoICogbnVtQ2hhbm5lbHMpO1xuXG4gIGNvbnN0IGVmZmVjdGl2ZUlucHV0U2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFtcbiAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICBdO1xuXG4gIGNvbnN0IGVmZmVjdGl2ZU91dHB1dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgKGFsaWduQ29ybmVycyAmJiBuZXdXaWR0aCA+IDEpID8gbmV3V2lkdGggLSAxIDogbmV3V2lkdGhcbiAgXTtcblxuICBjb25zdCBlZmZlY3RpdmVSb3dTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMF0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzBdO1xuICBjb25zdCBlZmZlY3RpdmVDb2xTaXplUmF0aW8gPSBlZmZlY3RpdmVJbnB1dFNpemVbMV0gLyBlZmZlY3RpdmVPdXRwdXRTaXplWzFdO1xuXG4gIGxldCBvdXRwdXRPZmZzZXQgPSAwO1xuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyBiKyspIHtcbiAgICBjb25zdCBiYXRjaE9mZnNldCA9IGIgKiBpbWFnZXNTdHJpZGVzWzBdO1xuICAgIGZvciAobGV0IHIgPSAwOyByIDwgbmV3SGVpZ2h0OyByKyspIHtcbiAgICAgIGNvbnN0IHNvdXJjZUZyYWNSb3cgPSBoYWxmUGl4ZWxDZW50ZXJzID9cbiAgICAgICAgICBlZmZlY3RpdmVSb3dTaXplUmF0aW8gKiAociArIDAuNSkgOlxuICAgICAgICAgIGVmZmVjdGl2ZVJvd1NpemVSYXRpbyAqIHI7XG4gICAgICBsZXQgc291cmNlTmVhcmVzdFJvdyA9IE1hdGgubWluKFxuICAgICAgICAgIG9sZEhlaWdodCAtIDEsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjUm93KSA6IE1hdGguZmxvb3Ioc291cmNlRnJhY1JvdykpO1xuICAgICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgICAgc291cmNlTmVhcmVzdFJvdyA9IE1hdGgubWF4KDAsIHNvdXJjZU5lYXJlc3RSb3cpO1xuICAgICAgfVxuICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyBzb3VyY2VOZWFyZXN0Um93ICogaW1hZ2VzU3RyaWRlc1sxXTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgbmV3V2lkdGg7IGMrKykge1xuICAgICAgICBjb25zdCBzb3VyY2VGcmFjQ29sID0gaGFsZlBpeGVsQ2VudGVycyA/XG4gICAgICAgICAgICBlZmZlY3RpdmVDb2xTaXplUmF0aW8gKiAoYyArIDAuNSkgOlxuICAgICAgICAgICAgZWZmZWN0aXZlQ29sU2l6ZVJhdGlvICogYztcbiAgICAgICAgbGV0IHNvdXJjZU5lYXJlc3RDb2wgPSBNYXRoLm1pbihcbiAgICAgICAgICAgIG9sZFdpZHRoIC0gMSxcbiAgICAgICAgICAgIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY0NvbCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG4gICAgICAgIGlmIChoYWxmUGl4ZWxDZW50ZXJzKSB7XG4gICAgICAgICAgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWF4KDAsIHNvdXJjZU5lYXJlc3RDb2wpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGNvbE9mZnNldCA9IHJvd09mZnNldCArIHNvdXJjZU5lYXJlc3RDb2wgKiBpbWFnZXNTdHJpZGVzWzJdO1xuICAgICAgICBmb3IgKGxldCBkID0gMDsgZCA8IG51bUNoYW5uZWxzOyBkKyspIHtcbiAgICAgICAgICAvLyBCZWdpbiBzaGFkZXIuXG4gICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZnJhY3Rpb25hbCBpbmRleCBvZiB0aGUgc291cmNlLlxuICAgICAgICAgIGNvbnN0IG5ld1ZhbCA9IHhWYWx1ZXNbY29sT2Zmc2V0ICsgZF07XG4gICAgICAgICAgb3V0cHV0W291dHB1dE9mZnNldCsrXSA9IG5ld1ZhbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBudW1DaGFubmVsc10sIGltYWdlcy5kdHlwZSwgb3V0cHV0KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVOZWFyZXN0TmVpZ2hib3IsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmVzaXplTmVhcmVzdE5laWdoYm9yIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeNearestNeighborGrad, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function resizeNearestNeighborGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { images, dy } = inputs;\n    const { alignCorners } = attrs;\n    assertNotComplex([dy, images], 'resizeNearestNeighborGrad');\n    const imagesStrides = util.computeStrides(images.shape);\n    const dyStrides = util.computeStrides(dy.shape);\n    const [batch, xHeight, xWidth, depth] = images.shape;\n    const [, yHeight, yWidth] = dy.shape;\n    const output = new Float32Array(batch * xHeight * xWidth * depth);\n    const dyValues = backend.data.get(dy.dataId).values;\n    // In the backwards pass, we want to find the pixels that were generated\n    // for each pixel in the input image the forward pass\n    const effectiveXSize = [\n        (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight,\n        (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth\n    ];\n    const effectiveYSize = [\n        (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight,\n        (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth\n    ];\n    const heightScale = effectiveXSize[0] / effectiveYSize[0];\n    const widthScale = effectiveXSize[1] / effectiveYSize[1];\n    const invHeightScale = 1 / heightScale;\n    const invWidthScale = 1 / widthScale;\n    // This defines the size of the window of values around a particular\n    // index in dy that we want to search for contributions to dx.\n    const winHeight = (Math.ceil(invHeightScale) * 2) + 2;\n    const winWidth = (Math.ceil(invWidthScale) * 2) + 2;\n    // Loop over the output space.\n    for (let b = 0; b < batch; b++) {\n        const batchOffset = b * imagesStrides[0];\n        for (let r = 0; r < xHeight; r++) {\n            const rowOffset = batchOffset + r * imagesStrides[1];\n            // Compute bounds for where in dy we will look\n            const startRLerp = Math.floor(r * invHeightScale);\n            const startDyR = Math.floor(startRLerp - (winHeight / 2));\n            for (let c = 0; c < xWidth; c++) {\n                const colOffset = rowOffset + c * imagesStrides[2];\n                // Compute bounds for where in dy we will look\n                const startCLerp = Math.floor(c * invWidthScale);\n                const startDyC = Math.floor(startCLerp - (winWidth / 2));\n                for (let d = 0; d < depth; d++) {\n                    let accum = 0;\n                    // loop over dy\n                    for (let dyRIndex = 0; dyRIndex < winHeight; dyRIndex++) {\n                        const dyR = dyRIndex + startDyR;\n                        // Guard against the window exceeding the bounds of dy\n                        if (dyR < 0 || dyR >= yHeight) {\n                            continue;\n                        }\n                        const dyROffset = batchOffset + dyR * dyStrides[1];\n                        const sourceFracRow = dyR * heightScale;\n                        const sourceNearestRow = Math.min(xHeight - 1, alignCorners ? Math.round(sourceFracRow) :\n                            Math.floor(sourceFracRow));\n                        if (r !== sourceNearestRow) {\n                            continue;\n                        }\n                        for (let dyCIndex = 0; dyCIndex < winWidth; dyCIndex++) {\n                            const dyC = dyCIndex + startDyC;\n                            // Guard against the window exceeding the bounds of dy\n                            if (dyC < 0 || dyC >= yWidth) {\n                                continue;\n                            }\n                            const dyCOffset = dyROffset + dyC * dyStrides[2];\n                            const sourceFracCol = dyC * widthScale;\n                            const sourceNearestCol = Math.min(xWidth - 1, alignCorners ? Math.round(sourceFracCol) :\n                                Math.floor(sourceFracCol));\n                            if (c === sourceNearestCol) {\n                                accum += dyValues[dyCOffset + d];\n                            }\n                        }\n                    }\n                    output[colOffset + d] = accum;\n                }\n            }\n        }\n    }\n    return backend.makeTensorInfo(images.shape, images.dtype, output);\n}\nexport const resizeNearestNeighborGradConfig = {\n    kernelName: ResizeNearestNeighborGrad,\n    backendName: 'cpu',\n    kernelFunc: resizeNearestNeighborGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLHlCQUF5QixFQUEyRixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6TCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLHlCQUF5QixDQUFDLElBSXpDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxZQUFZLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFN0IsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLEVBQUUsMkJBQTJCLENBQUMsQ0FBQztJQUU1RCxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN4RCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNoRCxNQUFNLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztJQUNyRCxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQztJQUVyQyxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLEdBQUcsT0FBTyxHQUFHLE1BQU0sR0FBRyxL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QUksQ0FBQyxHQUFHLENBQzdCLE1BQU0sR0FBRyxDQUFDLEVBQ1YsWUFBWSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7Z0NBQzNCLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQzs0QkFFOUMsSUFBSSxDQUFDLEtBQUssZ0JBQWdCLEVBQUU7Z0NBQzFCLEtBQUssSUFBSSxRQUFRLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDOzZCQUNsQzt5QkFDRjtxQkFDRjtvQkFDRCxNQUFNLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQztpQkFDL0I7YUFDRjtTQUNGO0tBQ0Y7SUFFRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSwrQkFBK0IsR0FBaUI7SUFDM0QsVUFBVSxFQUFFLHlCQUF5QjtJQUNyQyxXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUseUJBQTZDO0NBQzFELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQXR0cnMsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZChhcmdzOiB7XG4gIGlucHV0czogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlcywgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxpZ25Db3JuZXJzfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoW2R5LCBpbWFnZXNdLCAncmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCcpO1xuXG4gIGNvbnN0IGltYWdlc1N0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKGltYWdlcy5zaGFwZSk7XG4gIGNvbnN0IGR5U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoZHkuc2hhcGUpO1xuICBjb25zdCBbYmF0Y2gsIHhIZWlnaHQsIHhXaWR0aCwgZGVwdGhdID0gaW1hZ2VzLnNoYXBlO1xuICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHkuc2hhcGU7XG5cbiAgY29uc3Qgb3V0cHV0ID0gbmV3IEZsb2F0MzJBcnJheShiYXRjaCAqIHhIZWlnaHQgKiB4V2lkdGggKiBkZXB0aCk7XG4gIGNvbnN0IGR5VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldChkeS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZFxuICAvLyBmb3IgZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzc1xuXG4gIGNvbnN0IGVmZmVjdGl2ZVhTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgIChhbGlnbkNvcm5lcnMgJiYgeUhlaWdodCA+IDEpID8geEhlaWdodCAtIDEgOiB4SGVpZ2h0LFxuICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gIF07XG5cbiAgY29uc3QgZWZmZWN0aXZlWVNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHlXaWR0aCAtIDEgOiB5V2lkdGhcbiAgXTtcblxuICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuXG4gIGNvbnN0IGludkhlaWdodFNjYWxlID0gMSAvIGhlaWdodFNjYWxlO1xuICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG5cbiAgLy8gVGhpcyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgb2YgdmFsdWVzIGFyb3VuZCBhIHBhcnRpY3VsYXJcbiAgLy8gaW5kZXggaW4gZHkgdGhhdCB3ZSB3YW50IHRvIHNlYXJjaCBmb3IgY29udHJpYnV0aW9ucyB0byBkeC5cbiAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gIGNvbnN0IHdpbldpZHRoID0gKE1hdGguY2VpbChpbnZXaWR0aFNjYWxlKSAqIDIpICsgMjtcblxuICAvLyBMb29wIG92ZXIgdGhlIG91dHB1dCBzcGFjZS5cbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaDsgYisrKSB7XG4gICAgY29uc3QgYmF0Y2hPZmZzZXQgPSBiICogaW1hZ2VzU3RyaWRlc1swXTtcbiAgICBmb3IgKGxldCByID0gMDsgciA8IHhIZWlnaHQ7IHIrKykge1xuICAgICAgY29uc3Qgcm93T2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyByICogaW1hZ2VzU3RyaWRlc1sxXTtcblxuICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgY29uc3Qgc3RhcnRSTGVycCA9IE1hdGguZmxvb3IociAqIGludkhlaWdodFNjYWxlKTtcbiAgICAgIGNvbnN0IHN0YXJ0RHlSID0gTWF0aC5mbG9vcihzdGFydFJMZXJwIC0gKHdpbkhlaWdodCAvIDIpKTtcbiAgICAgIGZvciAobGV0IGMgPSAwOyBjIDwgeFdpZHRoOyBjKyspIHtcbiAgICAgICAgY29uc3QgY29sT2Zmc2V0ID0gcm93T2Zmc2V0ICsgYyAqIGltYWdlc1N0cmlkZXNbMl07XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICBjb25zdCBzdGFydENMZXJwID0gTWF0aC5mbG9vcihjICogaW52V2lkdGhTY2FsZSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0RHlDID0gTWF0aC5mbG9vcihzdGFydENMZXJwIC0gKHdpbldpZHRoIC8gMikpO1xuXG4gICAgICAgIGZvciAobGV0IGQgPSAwOyBkIDwgZGVwdGg7IGQrKykge1xuICAgICAgICAgIGxldCBhY2N1bSA9IDA7XG4gICAgICAgICAgLy8gbG9vcCBvdmVyIGR5XG5cbiAgICAgICAgICBmb3IgKGxldCBkeVJJbmRleCA9IDA7IGR5UkluZGV4IDwgd2luSGVpZ2h0OyBkeVJJbmRleCsrKSB7XG4gICAgICAgICAgICBjb25zdCBkeVIgPSBkeVJJbmRleCArIHN0YXJ0RHlSO1xuICAgICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgICBpZiAoZHlSIDwgMCB8fCBkeVIgPj0geUhlaWdodCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgZHlST2Zmc2V0ID0gYmF0Y2hPZmZzZXQgKyBkeVIgKiBkeVN0cmlkZXNbMV07XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VGcmFjUm93ID0gZHlSICogaGVpZ2h0U2NhbGU7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2VOZWFyZXN0Um93ID0gTWF0aC5taW4oXG4gICAgICAgICAgICAgICAgeEhlaWdodCAtIDEsXG4gICAgICAgICAgICAgICAgYWxpZ25Db3JuZXJzID8gTWF0aC5yb3VuZChzb3VyY2VGcmFjUm93KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjUm93KSk7XG4gICAgICAgICAgICBpZiAociAhPT0gc291cmNlTmVhcmVzdFJvdykge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGR5Q0luZGV4ID0gMDsgZHlDSW5kZXggPCB3aW5XaWR0aDsgZHlDSW5kZXgrKykge1xuICAgICAgICAgICAgICBjb25zdCBkeUMgPSBkeUNJbmRleCArIHN0YXJ0RHlDO1xuICAgICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAgfHwgZHlDID49IHlXaWR0aCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY29uc3QgZHlDT2Zmc2V0ID0gZHlST2Zmc2V0ICsgZHlDICogZHlTdHJpZGVzWzJdO1xuICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGcmFjQ29sID0gZHlDICogd2lkdGhTY2FsZTtcbiAgICAgICAgICAgICAgY29uc3Qgc291cmNlTmVhcmVzdENvbCA9IE1hdGgubWluKFxuICAgICAgICAgICAgICAgICAgeFdpZHRoIC0gMSxcbiAgICAgICAgICAgICAgICAgIGFsaWduQ29ybmVycyA/IE1hdGgucm91bmQoc291cmNlRnJhY0NvbCkgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihzb3VyY2VGcmFjQ29sKSk7XG5cbiAgICAgICAgICAgICAgaWYgKGMgPT09IHNvdXJjZU5lYXJlc3RDb2wpIHtcbiAgICAgICAgICAgICAgICBhY2N1bSArPSBkeVZhbHVlc1tkeUNPZmZzZXQgKyBkXTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBvdXRwdXRbY29sT2Zmc2V0ICsgZF0gPSBhY2N1bTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGltYWdlcy5zaGFwZSwgaW1hZ2VzLmR0eXBlLCBvdXRwdXQpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reverse, TensorBuffer, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { identity } from './Identity';\nexport function reverse(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { dims } = attrs;\n    assertNotComplex(x, 'reverse');\n    const xRank = x.shape.length;\n    const $dims = util.parseAxisParam(dims, x.shape);\n    if (xRank === 0) {\n        return identity({ inputs: { x }, backend });\n    }\n    const outBuf = new TensorBuffer(x.shape, x.dtype);\n    const xBuf = backend.bufferSync(x);\n    for (let i = 0; i < outBuf.size; i++) {\n        const outLoc = outBuf.indexToLoc(i);\n        const inLoc = outLoc.slice();\n        $dims.forEach(d => inLoc[d] = x.shape[d] - 1 - inLoc[d]);\n        outBuf.set(xBuf.get(...inLoc), ...outLoc);\n    }\n    return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n}\nexport const reverseConfig = {\n    kernelName: Reverse,\n    backendName: 'cpu',\n    kernelFunc: reverse\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUmV2ZXJzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE9BQU8sRUFBK0IsWUFBWSxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3JJLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUM3QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRS9CLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTdCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRCxJQUFJLEtBQUssS0FBSyxDQUFDLEVBQUU7UUFDZixPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDekM7SUFFRCxNQUFNLE1BQU0sR0FBRyxJQUFJLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRW5DLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3BDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzdCLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxDQUFDLEVBQUUsR0FBRyxNQUFNLENBQUMsQ0FBQztLQUMzQztJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmV2ZXJzZSwgUmV2ZXJzZUF0dHJzLCBSZXZlcnNlSW5wdXRzLCBUZW5zb3JCdWZmZXIsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXZlcnNlKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IFJldmVyc2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogUmV2ZXJzZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2RpbXN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAncmV2ZXJzZScpO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgJGRpbXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGRpbXMsIHguc2hhcGUpO1xuICBpZiAoeFJhbmsgPT09IDApIHtcbiAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3h9LCBiYWNrZW5kfSk7XG4gIH1cblxuICBjb25zdCBvdXRCdWYgPSBuZXcgVGVuc29yQnVmZmVyKHguc2hhcGUsIHguZHR5cGUpO1xuICBjb25zdCB4QnVmID0gYmFja2VuZC5idWZmZXJTeW5jKHgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgb3V0QnVmLnNpemU7IGkrKykge1xuICAgIGNvbnN0IG91dExvYyA9IG91dEJ1Zi5pbmRleFRvTG9jKGkpO1xuICAgIGNvbnN0IGluTG9jID0gb3V0TG9jLnNsaWNlKCk7XG4gICAgJGRpbXMuZm9yRWFjaChkID0+IGluTG9jW2RdID0geC5zaGFwZVtkXSAtIDEgLSBpbkxvY1tkXSk7XG4gICAgb3V0QnVmLnNldCh4QnVmLmdldCguLi5pbkxvYyksIC4uLm91dExvYyk7XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRCdWYuc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCByZXZlcnNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJldmVyc2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogcmV2ZXJzZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, RotateWithOffset, util } from '@tensorflow/tfjs-core';\nexport const rotateWithOffsetConfig = {\n    kernelName: RotateWithOffset,\n    backendName: 'cpu',\n    kernelFunc: ({ inputs, attrs, backend }) => {\n        const { image } = inputs;\n        const { radians, fillValue, center } = attrs;\n        const cpuBackend = backend;\n        const output = util.getTypedArrayFromDType(image.dtype, util.sizeFromShape(image.shape));\n        const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n        const [centerX, centerY] = backend_util.getImageCenter(center, imageHeight, imageWidth);\n        const fullOpacityValue = 255;\n        const sinFactor = Math.sin(radians);\n        const cosFactor = Math.cos(radians);\n        const imageVals = cpuBackend.data.get(image.dataId).values;\n        for (let batchIdx = 0; batchIdx < batch; batchIdx++) {\n            const batchOffset = batchIdx * imageWidth * imageHeight * numChannels;\n            for (let row = 0; row < imageHeight; row++) {\n                const rowOffset = row * (imageWidth * numChannels);\n                for (let col = 0; col < imageWidth; col++) {\n                    const colOffset = col * numChannels;\n                    for (let channel = 0; channel < numChannels; channel++) {\n                        const coords = [batch, row, col, channel];\n                        const x = coords[2];\n                        const y = coords[1];\n                        // coordX/coordY are the result of rotating and translating x/y.\n                        let coordX = (x - centerX) * cosFactor - (y - centerY) * sinFactor;\n                        let coordY = (x - centerX) * sinFactor + (y - centerY) * cosFactor;\n                        coordX = Math.round(coordX + centerX);\n                        coordY = Math.round(coordY + centerY);\n                        let outputValue = fillValue;\n                        if (typeof fillValue !== 'number') {\n                            if (channel === 3) {\n                                outputValue = fullOpacityValue;\n                            }\n                            else {\n                                outputValue = fillValue[channel];\n                            }\n                        }\n                        // If the coordinate position falls within the image boundaries...\n                        if (coordX >= 0 && coordX < imageWidth && coordY >= 0 &&\n                            coordY < imageHeight) {\n                            // set the output to the image value at the coordinate position.\n                            const rotatedRowOffset = coordY * (imageWidth * numChannels);\n                            const rotatedColOffset = coordX * numChannels;\n                            const imageIdx = batchOffset + rotatedRowOffset + rotatedColOffset + channel;\n                            outputValue = imageVals[imageIdx];\n                        }\n                        const outIdx = batchOffset + rowOffset + colOffset + channel;\n                        output[outIdx] = outputValue;\n                    }\n                }\n            }\n        }\n        const dataId = cpuBackend.write(output, image.shape, image.dtype);\n        return { dataId, shape: image.shape, dtype: image.dtype };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm90YXRlV2l0aE9mZnNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFpRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkxSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBaUI7SUFDbEQsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBZ0MsQ0FBQztRQUNqRCxNQUFNLEVBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUMsR0FBRyxLQUFvQyxDQUFDO1FBQzFFLE1BQU0sVUFBVSxHQUFHLE9BQXlCLENBQUM7UUFFN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUN0QyxLQUFLLENBQUMsS0FBd0IsRUFBRSxJQUFJLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxXQUFXLENBQUMsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBRWxFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQ3BCLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUNqRSxNQUFNLGdCQUFnQixHQUFHLEdBQUcsQ0FBQztRQUU3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLE9B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QUcsVUFBVSxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEUsT0FBTyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBQyxDQUFDO0lBQzFELENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTnVtZXJpY0RhdGFUeXBlLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIFJvdGF0ZVdpdGhPZmZzZXQsIFJvdGF0ZVdpdGhPZmZzZXRBdHRycywgUm90YXRlV2l0aE9mZnNldElucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5leHBvcnQgY29uc3Qgcm90YXRlV2l0aE9mZnNldENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSb3RhdGVXaXRoT2Zmc2V0LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBhdHRycywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7aW1hZ2V9ID0gaW5wdXRzIGFzIFJvdGF0ZVdpdGhPZmZzZXRJbnB1dHM7XG4gICAgY29uc3Qge3JhZGlhbnMsIGZpbGxWYWx1ZSwgY2VudGVyfSA9IGF0dHJzIGFzIHt9IGFzIFJvdGF0ZVdpdGhPZmZzZXRBdHRycztcbiAgICBjb25zdCBjcHVCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZENQVTtcblxuICAgIGNvbnN0IG91dHB1dCA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShcbiAgICAgICAgaW1hZ2UuZHR5cGUgYXMgTnVtZXJpY0RhdGFUeXBlLCB1dGlsLnNpemVGcm9tU2hhcGUoaW1hZ2Uuc2hhcGUpKTtcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBudW1DaGFubmVsc10gPSBpbWFnZS5zaGFwZTtcblxuICAgIGNvbnN0IFtjZW50ZXJYLCBjZW50ZXJZXSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5nZXRJbWFnZUNlbnRlcihjZW50ZXIsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoKTtcbiAgICBjb25zdCBmdWxsT3BhY2l0eVZhbHVlID0gMjU1O1xuXG4gICAgY29uc3Qgc2luRmFjdG9yID0gTWF0aC5zaW4ocmFkaWFucyk7XG4gICAgY29uc3QgY29zRmFjdG9yID0gTWF0aC5jb3MocmFkaWFucyk7XG4gICAgY29uc3QgaW1hZ2VWYWxzID0gY3B1QmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gICAgZm9yIChsZXQgYmF0Y2hJZHggPSAwOyBiYXRjaElkeCA8IGJhdGNoOyBiYXRjaElkeCsrKSB7XG4gICAgICBjb25zdCBiYXRjaE9mZnNldCA9IGJhdGNoSWR4ICogaW1hZ2VXaWR0aCAqIGltYWdlSGVpZ2h0ICogbnVtQ2hhbm5lbHM7XG5cbiAgICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8IGltYWdlSGVpZ2h0OyByb3crKykge1xuICAgICAgICBjb25zdCByb3dPZmZzZXQgPSByb3cgKiAoaW1hZ2VXaWR0aCAqIG51bUNoYW5uZWxzKTtcblxuICAgICAgICBmb3IgKGxldCBjb2wgPSAwOyBjb2wgPCBpbWFnZVdpZHRoOyBjb2wrKykge1xuICAgICAgICAgIGNvbnN0IGNvbE9mZnNldCA9IGNvbCAqIG51bUNoYW5uZWxzO1xuXG4gICAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1DaGFubmVsczsgY2hhbm5lbCsrKSB7XG4gICAgICAgICAgICBjb25zdCBjb29yZHMgPSBbYmF0Y2gsIHJvdywgY29sLCBjaGFubmVsXTtcblxuICAgICAgICAgICAgY29uc3QgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgICAgIGNvbnN0IHkgPSBjb29yZHNbMV07XG5cbiAgICAgICAgICAgIC8vIGNvb3JkWC9jb29yZFkgYXJlIHRoZSByZXN1bHQgb2Ygcm90YXRpbmcgYW5kIHRyYW5zbGF0aW5nIHgveS5cbiAgICAgICAgICAgIGxldCBjb29yZFggPSAoeCAtIGNlbnRlclgpICogY29zRmFjdG9yIC0gKHkgLSBjZW50ZXJZKSAqIHNpbkZhY3RvcjtcbiAgICAgICAgICAgIGxldCBjb29yZFkgPSAoeCAtIGNlbnRlclgpICogc2luRmFjdG9yICsgKHkgLSBjZW50ZXJZKSAqIGNvc0ZhY3RvcjtcbiAgICAgICAgICAgIGNvb3JkWCA9IE1hdGgucm91bmQoY29vcmRYICsgY2VudGVyWCk7XG4gICAgICAgICAgICBjb29yZFkgPSBNYXRoLnJvdW5kKGNvb3JkWSArIGNlbnRlclkpO1xuXG4gICAgICAgICAgICBsZXQgb3V0cHV0VmFsdWUgPSBmaWxsVmFsdWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGZpbGxWYWx1ZSAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgaWYgKGNoYW5uZWwgPT09IDMpIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGZ1bGxPcGFjaXR5VmFsdWU7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBmaWxsVmFsdWVbY2hhbm5lbF07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgdGhlIGNvb3JkaW5hdGUgcG9zaXRpb24gZmFsbHMgd2l0aGluIHRoZSBpbWFnZSBib3VuZGFyaWVzLi4uXG4gICAgICAgICAgICBpZiAoY29vcmRYID49IDAgJiYgY29vcmRYIDwgaW1hZ2VXaWR0aCAmJiBjb29yZFkgPj0gMCAmJlxuICAgICAgICAgICAgICAgIGNvb3JkWSA8IGltYWdlSGVpZ2h0KSB7XG4gICAgICAgICAgICAgIC8vIHNldCB0aGUgb3V0cHV0IHRvIHRoZSBpbWFnZSB2YWx1ZSBhdCB0aGUgY29vcmRpbmF0ZSBwb3NpdGlvbi5cbiAgICAgICAgICAgICAgY29uc3Qgcm90YXRlZFJvd09mZnNldCA9IGNvb3JkWSAqIChpbWFnZVdpZHRoICogbnVtQ2hhbm5lbHMpO1xuICAgICAgICAgICAgICBjb25zdCByb3RhdGVkQ29sT2Zmc2V0ID0gY29vcmRYICogbnVtQ2hhbm5lbHM7XG4gICAgICAgICAgICAgIGNvbnN0IGltYWdlSWR4ID1cbiAgICAgICAgICAgICAgICAgIGJhdGNoT2Zmc2V0ICsgcm90YXRlZFJvd09mZnNldCArIHJvdGF0ZWRDb2xPZmZzZXQgKyBjaGFubmVsO1xuICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGltYWdlVmFsc1tpbWFnZUlkeF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGNvbnN0IG91dElkeCA9IGJhdGNoT2Zmc2V0ICsgcm93T2Zmc2V0ICsgY29sT2Zmc2V0ICsgY2hhbm5lbDtcbiAgICAgICAgICAgIG91dHB1dFtvdXRJZHhdID0gb3V0cHV0VmFsdWUgYXMgbnVtYmVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGRhdGFJZCA9IGNwdUJhY2tlbmQud3JpdGUob3V0cHV0LCBpbWFnZS5zaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICAgIHJldHVybiB7ZGF0YUlkLCBzaGFwZTogaW1hZ2Uuc2hhcGUsIGR0eXBlOiBpbWFnZS5kdHlwZX07XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Round } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const round = unaryKernelFunc(Round, (xi) => {\n    // The algorithm is based on banker's rounding.\n    const base = Math.floor(xi);\n    if (xi - base < 0.5) {\n        return Math.floor(xi);\n    }\n    else if (xi - base > 0.5) {\n        return Math.ceil(xi);\n    }\n    else {\n        if (base % 2.0 === 0.0) {\n            return base;\n        }\n        else {\n            return base + 1.0;\n        }\n    }\n});\nexport const roundConfig = {\n    kernelName: Round,\n    backendName: 'cpu',\n    kernelFunc: round,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1JvdW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUUsRUFBRTtJQUNqRCwrQ0FBK0M7SUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1QixJQUFJLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUN2QjtTQUFNLElBQUksRUFBRSxHQUFHLElBQUksR0FBRyxHQUFHLEVBQUU7UUFDMUIsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQ3RCO1NBQU07UUFDTCxJQUFJLElBQUksR0FBRyxHQUFHLEtBQUssR0FBRyxFQUFFO1lBQ3RCLE9BQU8sSUFBSSxDQUFDO1NBQ2I7YUFBTTtZQUNMLE9BQU8sSUFBSSxHQUFHLEdBQUcsQ0FBQztTQUNuQjtLQUNGO0FBQ0gsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUm91bmR9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCByb3VuZCA9IHVuYXJ5S2VybmVsRnVuYyhSb3VuZCwgKHhpKSA9PiB7XG4gIC8vIFRoZSBhbGdvcml0aG0gaXMgYmFzZWQgb24gYmFua2VyJ3Mgcm91bmRpbmcuXG4gIGNvbnN0IGJhc2UgPSBNYXRoLmZsb29yKHhpKTtcbiAgaWYgKHhpIC0gYmFzZSA8IDAuNSkge1xuICAgIHJldHVybiBNYXRoLmZsb29yKHhpKTtcbiAgfSBlbHNlIGlmICh4aSAtIGJhc2UgPiAwLjUpIHtcbiAgICByZXR1cm4gTWF0aC5jZWlsKHhpKTtcbiAgfSBlbHNlIHtcbiAgICBpZiAoYmFzZSAlIDIuMCA9PT0gMC4wKSB7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJhc2UgKyAxLjA7XG4gICAgfVxuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IHJvdW5kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJvdW5kLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHJvdW5kLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, ScatterNd } from '@tensorflow/tfjs-core';\nimport { scatterImpl } from './Scatter_impl';\nexport function scatterNd(args) {\n    const { inputs, backend, attrs } = args;\n    const { indices, updates } = inputs;\n    const { shape } = attrs;\n    const { sliceRank, numUpdates, sliceSize, strides, outputSize } = backend_util.calculateShapes(updates, indices, shape);\n    const sumDupeIndices = true;\n    const indicesBuf = backend.bufferSync(indices);\n    const updatesBuf = backend.bufferSync(updates);\n    const outBuf = scatterImpl(indicesBuf, updatesBuf, shape, outputSize, sliceSize, numUpdates, sliceRank, strides, 0 /* defaultValue */, sumDupeIndices);\n    return backend.makeTensorInfo(shape, outBuf.dtype, outBuf.values);\n}\nexport const scatterNdConfig = {\n    kernelName: ScatterNd,\n    backendName: 'cpu',\n    kernelFunc: scatterNd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NhdHRlck5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TY2F0dGVyTmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBa0MsU0FBUyxFQUE4QyxNQUFNLHVCQUF1QixDQUFDO0FBRzNJLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxPQUFPLEVBQUUsT0FBTyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2xDLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEIsTUFBTSxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FDekQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQzFELE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQztJQUU1QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFnQixPQUFPLENBQUMsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUEwQixPQUFPLENBQUMsQ0FBQztJQUV4RSxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQ3RCLFVBQVUsRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUNoRSxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsQ0FBQyxrQkFBa0IsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUU5RCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3BFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBTY2F0dGVyTmQsIFNjYXR0ZXJOZEF0dHJzLCBTY2F0dGVyTmRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7c2NhdHRlckltcGx9IGZyb20gJy4vU2NhdHRlcl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNjYXR0ZXJOZChhcmdzOiB7XG4gIGlucHV0czogU2NhdHRlck5kSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IFNjYXR0ZXJOZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbmRpY2VzLCB1cGRhdGVzfSA9IGlucHV0cztcbiAgY29uc3Qge3NoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHtzbGljZVJhbmssIG51bVVwZGF0ZXMsIHNsaWNlU2l6ZSwgc3RyaWRlcywgb3V0cHV0U2l6ZX0gPVxuICAgICAgYmFja2VuZF91dGlsLmNhbGN1bGF0ZVNoYXBlcyh1cGRhdGVzLCBpbmRpY2VzLCBzaGFwZSk7XG4gIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gdHJ1ZTtcblxuICBjb25zdCBpbmRpY2VzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdpbnQzMic+KGluZGljZXMpO1xuICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdpbnQzMid8J2Zsb2F0MzInPih1cGRhdGVzKTtcblxuICBjb25zdCBvdXRCdWYgPSBzY2F0dGVySW1wbChcbiAgICAgIGluZGljZXNCdWYsIHVwZGF0ZXNCdWYsIHNoYXBlLCBvdXRwdXRTaXplLCBzbGljZVNpemUsIG51bVVwZGF0ZXMsXG4gICAgICBzbGljZVJhbmssIHN0cmlkZXMsIDAgLyogZGVmYXVsdFZhbHVlICovLCBzdW1EdXBlSW5kaWNlcyk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBzY2F0dGVyTmRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2NhdHRlck5kLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNjYXR0ZXJOZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nfunction lowerBound(array, value) {\n    let left = 0;\n    let right = array.length;\n    let mid = 0;\n    while (left < right) {\n        mid = Math.floor((left + right) / 2);\n        if (array[mid] < value) {\n            left = mid + 1;\n        }\n        else {\n            right = mid;\n        }\n    }\n    return right;\n}\nfunction upperBound(array, value) {\n    let left = 0;\n    let right = array.length;\n    let mid = 0;\n    while (left < right) {\n        mid = Math.floor((left + right) / 2);\n        if (array[mid] <= value) {\n            left = mid + 1;\n        }\n        else {\n            right = mid;\n        }\n    }\n    return right;\n}\nexport function searchSortedImpl(sortedInputs, values, batchSize, numInputs, numValues, side) {\n    const output = util.getArrayFromDType('int32', batchSize * numValues);\n    for (let b = 0; b < batchSize; ++b) {\n        const sortedInputsSlice = sortedInputs.slice(b * numInputs, (b + 1) * numInputs);\n        const outputOffset = b * numValues;\n        for (let i = 0; i < numValues; ++i) {\n            output[outputOffset + i] = side === 'left' ?\n                lowerBound(sortedInputsSlice, values[i + outputOffset]) :\n                upperBound(sortedInputsSlice, values[i + outputOffset]);\n        }\n    }\n    return output;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoU29ydGVkX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NlYXJjaFNvcnRlZF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBYSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RCxTQUFTLFVBQVUsQ0FBQyxLQUFpQixFQUFFLEtBQWE7SUFDbEQsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsSUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUN6QixJQUFJLEdBQUcsR0FBRyxDQUFDLENBQUM7SUFDWixPQUFPLElBQUksR0FBRyxLQUFLLEVBQUU7UUFDbkIsR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsS0FBSyxFQUFFO1lBQ3RCLElBQUksR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO1NBQ2hCO2FBQU07WUFDTCxLQUFLLEdBQUcsR0FBRyxDQUFDO1NBQ2I7S0FDRjtJQUNELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLEtBQWlCLEVBQUUsS0FBYTtJQUNsRCxJQUFJLElBQUksR0FBRyxDQUFDLENBQUM7SUFDYixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQ3pCLElBQUksR0FBRyxHQUFHLENBQUMsQ0FBQztJQUNaLE9BQU8sSUFBSSxHQUFHLEtBQUssRUFBRTtRQUNuQixHQUFHLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyQyxJQUFJLEtBQUssQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLEVBQUU7WUFDdkIsSUFBSSxHQUFHLEdBQUcsR0FBRyxDQUFDLENBQUM7U0FDaEI7YUFBTTtZQUNMLEtBQUssR0FBRyxHQUFHLENBQUM7U0FDYjtLQUNGO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixZQUF3QixFQUFFLE1BQWtCLEVBQUUsU0FBaUIsRUFDL0QsU0FBaUIsRUFBRSxTQUFpQixFQUFFLElBQW9CO0lBQzVELE1BQU0sTUFBTSxHQUNSLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLEVBQUUsU0FBUyxHQUFHLFNBQVMsQ0FBZSxDQUFDO0lBQ3pFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsRUFBRSxDQUFDLEVBQUU7UUFDbEMsTUFBTSxpQkFBaUIsR0FDbkIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDLEdBQUcsU0FBUyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDO1FBQzNELE1BQU0sWUFBWSxHQUFHLENBQUMsR0FBRyxTQUFTLENBQUM7UUFDbkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFNBQVMsRUFBRSxFQUFFLENBQUMsRUFBRTtZQUNsQyxNQUFNLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxHQUFHLElBQUksS0FBSyxNQUFNLENBQUMsQ0FBQztnQkFDeEMsVUFBVSxDQUFDLGlCQUFpQixFQUFFLE1BQU0sQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxVQUFVLENBQUMsaUJBQWlCLEVBQUUsTUFBTSxDQUFDLENBQUMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDO1NBQzdEO0tBQ0Y7SUFDRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1R5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmZ1bmN0aW9uIGxvd2VyQm91bmQoYXJyYXk6IFR5cGVkQXJyYXksIHZhbHVlOiBudW1iZXIpIHtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBhcnJheS5sZW5ndGg7XG4gIGxldCBtaWQgPSAwO1xuICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgbWlkID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGlmIChhcnJheVttaWRdIDwgdmFsdWUpIHtcbiAgICAgIGxlZnQgPSBtaWQgKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICByaWdodCA9IG1pZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJpZ2h0O1xufVxuXG5mdW5jdGlvbiB1cHBlckJvdW5kKGFycmF5OiBUeXBlZEFycmF5LCB2YWx1ZTogbnVtYmVyKSB7XG4gIGxldCBsZWZ0ID0gMDtcbiAgbGV0IHJpZ2h0ID0gYXJyYXkubGVuZ3RoO1xuICBsZXQgbWlkID0gMDtcbiAgd2hpbGUgKGxlZnQgPCByaWdodCkge1xuICAgIG1pZCA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcbiAgICBpZiAoYXJyYXlbbWlkXSA8PSB2YWx1ZSkge1xuICAgICAgbGVmdCA9IG1pZCArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJpZ2h0ID0gbWlkO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmlnaHQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hTb3J0ZWRJbXBsKFxuICAgIHNvcnRlZElucHV0czogVHlwZWRBcnJheSwgdmFsdWVzOiBUeXBlZEFycmF5LCBiYXRjaFNpemU6IG51bWJlcixcbiAgICBudW1JbnB1dHM6IG51bWJlciwgbnVtVmFsdWVzOiBudW1iZXIsIHNpZGU6ICdsZWZ0J3wncmlnaHQnKTogVHlwZWRBcnJheSB7XG4gIGNvbnN0IG91dHB1dCA9XG4gICAgICB1dGlsLmdldEFycmF5RnJvbURUeXBlKCdpbnQzMicsIGJhdGNoU2l6ZSAqIG51bVZhbHVlcykgYXMgVHlwZWRBcnJheTtcbiAgZm9yIChsZXQgYiA9IDA7IGIgPCBiYXRjaFNpemU7ICsrYikge1xuICAgIGNvbnN0IHNvcnRlZElucHV0c1NsaWNlID1cbiAgICAgICAgc29ydGVkSW5wdXRzLnNsaWNlKGIgKiBudW1JbnB1dHMsIChiICsgMSkgKiBudW1JbnB1dHMpO1xuICAgIGNvbnN0IG91dHB1dE9mZnNldCA9IGIgKiBudW1WYWx1ZXM7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1WYWx1ZXM7ICsraSkge1xuICAgICAgb3V0cHV0W291dHB1dE9mZnNldCArIGldID0gc2lkZSA9PT0gJ2xlZnQnID9cbiAgICAgICAgICBsb3dlckJvdW5kKHNvcnRlZElucHV0c1NsaWNlLCB2YWx1ZXNbaSArIG91dHB1dE9mZnNldF0pIDpcbiAgICAgICAgICB1cHBlckJvdW5kKHNvcnRlZElucHV0c1NsaWNlLCB2YWx1ZXNbaSArIG91dHB1dE9mZnNldF0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SearchSorted } from '@tensorflow/tfjs-core';\nimport { searchSortedImpl } from './SearchSorted_impl';\nexport function searchSorted(args) {\n    const { inputs, backend, attrs } = args;\n    const { sortedSequence, values } = inputs;\n    const { side } = attrs;\n    const $sortedSequence = backend.data.get(sortedSequence.dataId).values;\n    const $values = backend.data.get(values.dataId).values;\n    const output = searchSortedImpl($sortedSequence, $values, sortedSequence.shape[0], sortedSequence.shape[1], values.shape[1], side);\n    return backend.makeTensorInfo(values.shape, 'int32', output);\n}\nexport const searchSortedConfig = {\n    kernelName: SearchSorted,\n    backendName: 'cpu',\n    kernelFunc: searchSorted,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoU29ydGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TZWFyY2hTb3J0ZWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixZQUFZLEVBQWdFLE1BQU0sdUJBQXVCLENBQUM7QUFJNUksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsY0FBYyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN4QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLE1BQU0sZUFBZSxHQUNqQixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNqRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUVyRSxNQUFNLE1BQU0sR0FBRyxnQkFBZ0IsQ0FDM0IsZUFBZSxFQUFFLE9BQU8sRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUNqRCxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDcEQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFlBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTZWFyY2hTb3J0ZWQsIFNlYXJjaFNvcnRlZEF0dHJzLCBTZWFyY2hTb3J0ZWRJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtzZWFyY2hTb3J0ZWRJbXBsfSBmcm9tICcuL1NlYXJjaFNvcnRlZF9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNlYXJjaFNvcnRlZChhcmdzOiB7XG4gIGlucHV0czogU2VhcmNoU29ydGVkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSxcbiAgYXR0cnM6IFNlYXJjaFNvcnRlZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzb3J0ZWRTZXF1ZW5jZSwgdmFsdWVzfSA9IGlucHV0cztcbiAgY29uc3Qge3NpZGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgJHNvcnRlZFNlcXVlbmNlID1cbiAgICAgIGJhY2tlbmQuZGF0YS5nZXQoc29ydGVkU2VxdWVuY2UuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHZhbHVlcyA9IGJhY2tlbmQuZGF0YS5nZXQodmFsdWVzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3Qgb3V0cHV0ID0gc2VhcmNoU29ydGVkSW1wbChcbiAgICAgICRzb3J0ZWRTZXF1ZW5jZSwgJHZhbHVlcywgc29ydGVkU2VxdWVuY2Uuc2hhcGVbMF0sXG4gICAgICBzb3J0ZWRTZXF1ZW5jZS5zaGFwZVsxXSwgdmFsdWVzLnNoYXBlWzFdLCBzaWRlKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8odmFsdWVzLnNoYXBlLCAnaW50MzInLCBvdXRwdXQpO1xufVxuXG5leHBvcnQgY29uc3Qgc2VhcmNoU29ydGVkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNlYXJjaFNvcnRlZCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzZWFyY2hTb3J0ZWQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Select, upcastType, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport function select(args) {\n    const { inputs, backend } = args;\n    const { condition, t, e } = inputs;\n    assertNotComplex([condition, t, e], 'select');\n    const conditionRank = condition.shape.length;\n    const values = backend.data.get(condition.dataId).values;\n    const tValues = backend.data.get(t.dataId).values;\n    const eValues = backend.data.get(e.dataId).values;\n    const resultDtype = upcastType(t.dtype, e.dtype);\n    const newValues = util.makeZerosTypedArray(util.sizeFromShape(t.shape), resultDtype);\n    let index = 0;\n    const offset = conditionRank === 0 || conditionRank > 1 || t.shape.length === 1 ?\n        1 :\n        util.sizeFromShape(t.shape.slice(1));\n    for (let i = 0; i < values.length; i++) {\n        for (let j = 0; j < offset; j++) {\n            if (values[i] === 1) {\n                newValues[index++] = tValues[i];\n            }\n            else {\n                newValues[index++] = eValues[i];\n            }\n        }\n    }\n    return backend.makeTensorInfo(t.shape, resultDtype, newValues);\n}\nexport const selectConfig = {\n    kernelName: Select,\n    backendName: 'cpu',\n    kernelFunc: select\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TZWxlY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixNQUFNLEVBQXdDLFVBQVUsRUFBRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUcvSCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFN0MsTUFBTSxVQUFVLE1BQU0sQ0FBQyxJQUFxRDtJQUUxRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsU0FBUyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFakMsZ0JBQWdCLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQzlDLE1BQU0sYUFBYSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTdDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ3ZFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2hFLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDO0lBQ2hFLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNqRCxNQUFNLFNBQVMsR0FDWCxJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFdkUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDO0lBQ2QsTUFBTSxNQUFNLEdBQ1IsYUFBYSxLQUFLLENBQUMsSUFBSSxhQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ2xFLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXpDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3RDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDL0IsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO2dCQUNuQixTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7YUFDakM7aUJBQU07Z0JBQ0wsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ2pDO1NBQ0Y7S0FDRjtJQUVELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNlbGVjdCwgU2VsZWN0SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5LCB1cGNhc3RUeXBlLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNlbGVjdChhcmdzOiB7aW5wdXRzOiBTZWxlY3RJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2NvbmRpdGlvbiwgdCwgZX0gPSBpbnB1dHM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleChbY29uZGl0aW9uLCB0LCBlXSwgJ3NlbGVjdCcpO1xuICBjb25zdCBjb25kaXRpb25SYW5rID0gY29uZGl0aW9uLnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGNvbmRpdGlvbi5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB0VmFsdWVzID0gYmFja2VuZC5kYXRhLmdldCh0LmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0IGVWYWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KGUuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgcmVzdWx0RHR5cGUgPSB1cGNhc3RUeXBlKHQuZHR5cGUsIGUuZHR5cGUpO1xuICBjb25zdCBuZXdWYWx1ZXMgPVxuICAgICAgdXRpbC5tYWtlWmVyb3NUeXBlZEFycmF5KHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlKSwgcmVzdWx0RHR5cGUpO1xuXG4gIGxldCBpbmRleCA9IDA7XG4gIGNvbnN0IG9mZnNldCA9XG4gICAgICBjb25kaXRpb25SYW5rID09PSAwIHx8IGNvbmRpdGlvblJhbmsgPiAxIHx8IHQuc2hhcGUubGVuZ3RoID09PSAxID9cbiAgICAgIDEgOlxuICAgICAgdXRpbC5zaXplRnJvbVNoYXBlKHQuc2hhcGUuc2xpY2UoMSkpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBvZmZzZXQ7IGorKykge1xuICAgICAgaWYgKHZhbHVlc1tpXSA9PT0gMSkge1xuICAgICAgICBuZXdWYWx1ZXNbaW5kZXgrK10gPSB0VmFsdWVzW2ldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3VmFsdWVzW2luZGV4KytdID0gZVZhbHVlc1tpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyh0LnNoYXBlLCByZXN1bHREdHlwZSwgbmV3VmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNlbGVjdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTZWxlY3QsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc2VsZWN0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Selu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nconst scaleAlpha = backend_util.SELU_SCALEALPHA;\nconst scale = backend_util.SELU_SCALE;\nexport const selu = unaryKernelFunc(Selu, (xi) => {\n    if (xi >= 0) {\n        return scale * xi;\n    }\n    else {\n        return scaleAlpha * (Math.exp(xi) - 1);\n    }\n});\nexport const seluConfig = {\n    kernelName: Selu,\n    backendName: 'cpu',\n    kernelFunc: selu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU2VsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFnQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQztBQUNoRCxNQUFNLEtBQUssR0FBRyxZQUFZLENBQUMsVUFBVSxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7SUFDL0MsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFO1FBQ1gsT0FBTyxLQUFLLEdBQUcsRUFBRSxDQUFDO0tBQ25CO1NBQU07UUFDTCxPQUFPLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7S0FDeEM7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIFNlbHV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmNvbnN0IHNjYWxlQWxwaGEgPSBiYWNrZW5kX3V0aWwuU0VMVV9TQ0FMRUFMUEhBO1xuY29uc3Qgc2NhbGUgPSBiYWNrZW5kX3V0aWwuU0VMVV9TQ0FMRTtcblxuZXhwb3J0IGNvbnN0IHNlbHUgPSB1bmFyeUtlcm5lbEZ1bmMoU2VsdSwgKHhpKSA9PiB7XG4gIGlmICh4aSA+PSAwKSB7XG4gICAgcmV0dXJuIHNjYWxlICogeGk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHNjYWxlQWxwaGEgKiAoTWF0aC5leHAoeGkpIC0gMSk7XG4gIH1cbn0pO1xuXG5leHBvcnQgY29uc3Qgc2VsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTZWx1LFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNlbHUsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sign } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sign = unaryKernelFunc(Sign, (xi) => {\n    if (xi < 0) {\n        return -1;\n    }\n    else if (xi > 0) {\n        return 1;\n    }\n    else {\n        return 0;\n    }\n});\nexport const signConfig = {\n    kernelName: Sign,\n    backendName: 'cpu',\n    kernelFunc: sign,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU2lnbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7SUFDL0MsSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ1YsT0FBTyxDQUFDLENBQUMsQ0FBQztLQUNYO1NBQU0sSUFBSSxFQUFFLEdBQUcsQ0FBQyxFQUFFO1FBQ2pCLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7U0FBTTtRQUNMLE9BQU8sQ0FBQyxDQUFDO0tBQ1Y7QUFDSCxDQUFDLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTaWdufSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4vdXRpbHMvdW5hcnlfdXRpbHMnO1xuXG5leHBvcnQgY29uc3Qgc2lnbiA9IHVuYXJ5S2VybmVsRnVuYyhTaWduLCAoeGkpID0+IHtcbiAgaWYgKHhpIDwgMCkge1xuICAgIHJldHVybiAtMTtcbiAgfSBlbHNlIGlmICh4aSA+IDApIHtcbiAgICByZXR1cm4gMTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gMDtcbiAgfVxufSk7XG5cbmV4cG9ydCBjb25zdCBzaWduQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpZ24sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc2lnbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sin } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sin = unaryKernelFunc(Sin, (xi) => Math.sin(xi));\nexport const sinConfig = {\n    kernelName: Sin,\n    backendName: 'cpu',\n    kernelFunc: sin,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHNpbiA9IHVuYXJ5S2VybmVsRnVuYyhTaW4sICh4aSkgPT4gTWF0aC5zaW4oeGkpKTtcblxuZXhwb3J0IGNvbnN0IHNpbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTaW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc2luLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sinh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const sinh = unaryKernelFunc(Sinh, (xi) => Math.sinh(xi));\nexport const sinhConfig = {\n    kernelName: Sinh,\n    backendName: 'cpu',\n    kernelFunc: sinh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU2luaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpbmh9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCBzaW5oID0gdW5hcnlLZXJuZWxGdW5jKFNpbmgsICh4aSkgPT4gTWF0aC5zaW5oKHhpKSk7XG5cbmV4cG9ydCBjb25zdCBzaW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpbmgsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc2luaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Softplus } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\n// mirrors the implementation of tf.nn.softplus: https://goo.gl/vkcvwX\n// epsilon is the difference between 1.0 and the next representable float.\n// For a single precision 32 bit float this should be 2^-23, see:\n// https://math.byu.edu/~schow/work/IEEEFloatingPoint.htm\nconst epsilon = 1.1920928955078125e-7;\nconst threshold = Math.log(epsilon) + 2.0;\nexport const softplus = unaryKernelFunc(Softplus, (xi) => {\n    // Value above which exp(x) may overflow, but softplus(x) == x\n    // is within machine epsilon.\n    const tooLarge = xi > -threshold;\n    // Value below which exp(x) may underflow, but softplus(x) == exp(x)\n    // is within machine epsilon.\n    const tooSmall = xi < threshold;\n    const expX = Math.exp(xi);\n    let result;\n    if (tooSmall) {\n        result = expX;\n    }\n    else if (tooLarge) {\n        result = xi;\n    }\n    else {\n        result = Math.log(1.0 + expX);\n    }\n    return result;\n});\nexport const softplusConfig = {\n    kernelName: Softplus,\n    backendName: 'cpu',\n    kernelFunc: softplus,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHBsdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NvZnRwbHVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxRQUFRLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU3RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFckQsc0VBQXNFO0FBRXRFLDBFQUEwRTtBQUMxRSxpRUFBaUU7QUFDakUseURBQXlEO0FBQ3pELE1BQU0sT0FBTyxHQUFHLHFCQUFxQixDQUFDO0FBQ3RDLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBRTFDLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsUUFBUSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUU7SUFDdkQsOERBQThEO0lBQzlELDZCQUE2QjtJQUM3QixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsQ0FBQyxTQUFTLENBQUM7SUFFakMsb0VBQW9FO0lBQ3BFLDZCQUE2QjtJQUM3QixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsU0FBUyxDQUFDO0lBRWhDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDMUIsSUFBSSxNQUFNLENBQUM7SUFFWCxJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sR0FBRyxJQUFJLENBQUM7S0FDZjtTQUFNLElBQUksUUFBUSxFQUFFO1FBQ25CLE1BQU0sR0FBRyxFQUFFLENBQUM7S0FDYjtTQUFNO1FBQ0wsTUFBTSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxDQUFDO0tBQy9CO0lBQ0QsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU29mdHBsdXN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbi8vIG1pcnJvcnMgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRmLm5uLnNvZnRwbHVzOiBodHRwczovL2dvby5nbC92a2N2d1hcblxuLy8gZXBzaWxvbiBpcyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEuMCBhbmQgdGhlIG5leHQgcmVwcmVzZW50YWJsZSBmbG9hdC5cbi8vIEZvciBhIHNpbmdsZSBwcmVjaXNpb24gMzIgYml0IGZsb2F0IHRoaXMgc2hvdWxkIGJlIDJeLTIzLCBzZWU6XG4vLyBodHRwczovL21hdGguYnl1LmVkdS9+c2Nob3cvd29yay9JRUVFRmxvYXRpbmdQb2ludC5odG1cbmNvbnN0IGVwc2lsb24gPSAxLjE5MjA5Mjg5NTUwNzgxMjVlLTc7XG5jb25zdCB0aHJlc2hvbGQgPSBNYXRoLmxvZyhlcHNpbG9uKSArIDIuMDtcblxuZXhwb3J0IGNvbnN0IHNvZnRwbHVzID0gdW5hcnlLZXJuZWxGdW5jKFNvZnRwbHVzLCAoeGkpID0+IHtcbiAgLy8gVmFsdWUgYWJvdmUgd2hpY2ggZXhwKHgpIG1heSBvdmVyZmxvdywgYnV0IHNvZnRwbHVzKHgpID09IHhcbiAgLy8gaXMgd2l0aGluIG1hY2hpbmUgZXBzaWxvbi5cbiAgY29uc3QgdG9vTGFyZ2UgPSB4aSA+IC10aHJlc2hvbGQ7XG5cbiAgLy8gVmFsdWUgYmVsb3cgd2hpY2ggZXhwKHgpIG1heSB1bmRlcmZsb3csIGJ1dCBzb2Z0cGx1cyh4KSA9PSBleHAoeClcbiAgLy8gaXMgd2l0aGluIG1hY2hpbmUgZXBzaWxvbi5cbiAgY29uc3QgdG9vU21hbGwgPSB4aSA8IHRocmVzaG9sZDtcblxuICBjb25zdCBleHBYID0gTWF0aC5leHAoeGkpO1xuICBsZXQgcmVzdWx0O1xuXG4gIGlmICh0b29TbWFsbCkge1xuICAgIHJlc3VsdCA9IGV4cFg7XG4gIH0gZWxzZSBpZiAodG9vTGFyZ2UpIHtcbiAgICByZXN1bHQgPSB4aTtcbiAgfSBlbHNlIHtcbiAgICByZXN1bHQgPSBNYXRoLmxvZygxLjAgKyBleHBYKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufSk7XG5cbmV4cG9ydCBjb25zdCBzb2Z0cGx1c0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTb2Z0cGx1cyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzb2Z0cGx1cyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SpaceToBatchND, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { padV2Config } from './PadV2';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function spaceToBatchND(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { blockShape, paddings } = attrs;\n    assertNotComplex([x], 'spaceToBatchND');\n    const prod = util.sizeFromShape(blockShape);\n    const completePaddings = [[0, 0]];\n    completePaddings.push(...paddings);\n    for (let i = 1 + blockShape.length; i < x.shape.length; ++i) {\n        completePaddings.push([0, 0]);\n    }\n    const paddedX = padV2Config.kernelFunc({\n        inputs: { x },\n        backend,\n        attrs: { paddings: completePaddings, constantValue: 0 }\n    });\n    const reshapedPaddedShape = backend_util.getReshaped(paddedX.shape, blockShape, prod, false);\n    const permutedReshapedPaddedPermutation = backend_util.getPermuted(reshapedPaddedShape.length, blockShape.length, false);\n    const flattenShape = backend_util.getReshapedPermuted(paddedX.shape, blockShape, prod, false);\n    const reshapeInputs = { x: paddedX };\n    const reshapeAttrs = { shape: reshapedPaddedShape };\n    const paddedXReshaped = reshape({ inputs: reshapeInputs, backend, attrs: reshapeAttrs });\n    const transposeInputs = { x: paddedXReshaped };\n    const transposeAttrs = { perm: permutedReshapedPaddedPermutation };\n    const paddedXT = transpose({ inputs: transposeInputs, backend, attrs: transposeAttrs });\n    const resultReshapeInputs = { x: paddedXT };\n    const resultReshapeAttrs = { shape: flattenShape };\n    const result = reshape({ inputs: resultReshapeInputs, backend, attrs: resultReshapeAttrs });\n    backend.disposeIntermediateTensorInfo(paddedX);\n    backend.disposeIntermediateTensorInfo(paddedXReshaped);\n    backend.disposeIntermediateTensorInfo(paddedXT);\n    return result;\n}\nexport const spaceToBatchNDConfig = {\n    kernelName: SpaceToBatchND,\n    backendName: 'cpu',\n    kernelFunc: spaceToBatchND\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhY2VUb0JhdGNoTkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NwYWNlVG9CYXRjaE5ELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQXlELGNBQWMsRUFBMEYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeE4sT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDcEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFJOUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFeEMsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUU1QyxNQUFNLGdCQUFnQixHQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUksUUFBb0MsQ0FBQyxDQUFDO0lBRWhFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzNELGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9CO0lBRUQsTUFBTSxPQUFPLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztRQUNyQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUM7UUFDWCxPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUM7S0FDdEQsQ0FBZSxDQUFDO0lBRWpCLE1BQU0sbUJBQW1CLEdBQ3JCLFlBQVksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXJFLE1BQU0saUNBQWlDLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FDOUQsbUJBQW1CLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFMUQsTUFBTSxZQUFZLEdBQ2QsWUFBWSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU3RSxNQUFNLGFBQWEsR0FBa0IsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLENBQUM7SUFDbEQsTUFBTSxZQUFZLEdBQWlCLEVBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFDLENBQUM7SUFDaEUsTUFBTSxlQUFlLEdBQ2pCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0lBRW5FLE1BQU0sZUFBZSxHQUFvQixFQUFDLENBQUMsRUFBRSxlQUFlLEVBQUMsQ0FBQztJQUM5RCxNQUFNLGNBQWMsR0FDQyxFQUFDLElBQUksRUFBRSxpQ0FBaUMsRUFBQyxDQUFDO0lBQy9ELE1BQU0sUUFBUSxHQUNWLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxjQUFjLEVBQUMsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sbUJBQW1CLEdBQWtCLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBQyxDQUFDO0lBQ3pELE1BQU0sa0JBQWtCLEdBQWlCLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBQyxDQUFDO0lBQy9ELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FDbEIsRUFBQyxNQUFNLEVBQUUsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBQyxDQUFDLENBQUM7SUFFdkUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUN2RCxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFFaEQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFpQjtJQUNoRCxVQUFVLEVBQUUsY0FBYztJQUMxQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsY0FBa0M7Q0FDL0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaGFwZUF0dHJzLCBSZXNoYXBlSW5wdXRzLCBTcGFjZVRvQmF0Y2hORCwgU3BhY2VUb0JhdGNoTkRBdHRycywgU3BhY2VUb0JhdGNoTkRJbnB1dHMsIFRlbnNvckluZm8sIFRyYW5zcG9zZUF0dHJzLCBUcmFuc3Bvc2VJbnB1dHMsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuXG5pbXBvcnQge3BhZFYyQ29uZmlnfSBmcm9tICcuL1BhZFYyJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFjZVRvQmF0Y2hORChhcmdzOiB7XG4gIGlucHV0czogU3BhY2VUb0JhdGNoTkRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3BhY2VUb0JhdGNoTkRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtibG9ja1NoYXBlLCBwYWRkaW5nc30gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KFt4XSwgJ3NwYWNlVG9CYXRjaE5EJyk7XG5cbiAgY29uc3QgcHJvZCA9IHV0aWwuc2l6ZUZyb21TaGFwZShibG9ja1NoYXBlKTtcblxuICBjb25zdCBjb21wbGV0ZVBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiA9IFtbMCwgMF1dO1xuICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goLi4uKHBhZGRpbmdzIGFzIEFycmF5PFtudW1iZXIsIG51bWJlcl0+KSk7XG5cbiAgZm9yIChsZXQgaSA9IDEgKyBibG9ja1NoYXBlLmxlbmd0aDsgaSA8IHguc2hhcGUubGVuZ3RoOyArK2kpIHtcbiAgICBjb21wbGV0ZVBhZGRpbmdzLnB1c2goWzAsIDBdKTtcbiAgfVxuXG4gIGNvbnN0IHBhZGRlZFggPSBwYWRWMkNvbmZpZy5rZXJuZWxGdW5jKHtcbiAgICBpbnB1dHM6IHt4fSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7cGFkZGluZ3M6IGNvbXBsZXRlUGFkZGluZ3MsIGNvbnN0YW50VmFsdWU6IDB9XG4gIH0pIGFzIFRlbnNvckluZm87XG5cbiAgY29uc3QgcmVzaGFwZWRQYWRkZWRTaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuXG4gIGNvbnN0IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChcbiAgICAgIHJlc2hhcGVkUGFkZGVkU2hhcGUubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCwgZmFsc2UpO1xuXG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG5cbiAgY29uc3QgcmVzaGFwZUlucHV0czogUmVzaGFwZUlucHV0cyA9IHt4OiBwYWRkZWRYfTtcbiAgY29uc3QgcmVzaGFwZUF0dHJzOiBSZXNoYXBlQXR0cnMgPSB7c2hhcGU6IHJlc2hhcGVkUGFkZGVkU2hhcGV9O1xuICBjb25zdCBwYWRkZWRYUmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiByZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzaGFwZUF0dHJzfSk7XG5cbiAgY29uc3QgdHJhbnNwb3NlSW5wdXRzOiBUcmFuc3Bvc2VJbnB1dHMgPSB7eDogcGFkZGVkWFJlc2hhcGVkfTtcbiAgY29uc3QgdHJhbnNwb3NlQXR0cnM6XG4gICAgICBUcmFuc3Bvc2VBdHRycyA9IHtwZXJtOiBwZXJtdXRlZFJlc2hhcGVkUGFkZGVkUGVybXV0YXRpb259O1xuICBjb25zdCBwYWRkZWRYVCA9XG4gICAgICB0cmFuc3Bvc2Uoe2lucHV0czogdHJhbnNwb3NlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogdHJhbnNwb3NlQXR0cnN9KTtcblxuICBjb25zdCByZXN1bHRSZXNoYXBlSW5wdXRzOiBSZXNoYXBlSW5wdXRzID0ge3g6IHBhZGRlZFhUfTtcbiAgY29uc3QgcmVzdWx0UmVzaGFwZUF0dHJzOiBSZXNoYXBlQXR0cnMgPSB7c2hhcGU6IGZsYXR0ZW5TaGFwZX07XG4gIGNvbnN0IHJlc3VsdCA9IHJlc2hhcGUoXG4gICAgICB7aW5wdXRzOiByZXN1bHRSZXNoYXBlSW5wdXRzLCBiYWNrZW5kLCBhdHRyczogcmVzdWx0UmVzaGFwZUF0dHJzfSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwYWRkZWRYUmVzaGFwZWQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBhZGRlZFhUKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhY2VUb0JhdGNoTkQsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3BhY2VUb0JhdGNoTkQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseFillEmptyRows } from '@tensorflow/tfjs-core';\nimport { sparseFillEmptyRowsImpl } from './SparseFillEmptyRows_impl';\nexport function sparseFillEmptyRows(args) {\n    const { inputs, backend } = args;\n    const { indices, values, denseShape, defaultValue } = inputs;\n    if (denseShape.shape.length !== 1) {\n        throw new Error(`Dense shape must be a vector, saw:\n        ${denseShape.shape}`);\n    }\n    if (indices.shape.length !== 2) {\n        throw new Error(`Indices must be a matrix, saw:\n        ${indices.shape}`);\n    }\n    if (values.shape.length !== 1) {\n        throw new Error(`Values must be a vector, saw:\n        ${values.shape}`);\n    }\n    if (defaultValue.shape.length !== 0) {\n        throw new Error(`Default value must be a scalar, saw:\n        ${defaultValue.shape}`);\n    }\n    const $indices = backend.data.get(indices.dataId).values;\n    const $values = backend.data.get(values.dataId).values;\n    const $denseShape = backend.data.get(denseShape.dataId).values;\n    const $defaultValue = backend.data.get(defaultValue.dataId).values[0];\n    const [outputIndices, outputIndicesShape, outputValues, emptyRowIndicator, reverseIndexMap] = sparseFillEmptyRowsImpl($indices, indices.shape, indices.dtype, $values, values.dtype, $denseShape, $defaultValue);\n    return [\n        backend.makeTensorInfo(outputIndicesShape, indices.dtype, outputIndices),\n        backend.makeTensorInfo([outputIndicesShape[0]], values.dtype, outputValues),\n        backend.makeTensorInfo([emptyRowIndicator.length], 'bool', new Uint8Array(emptyRowIndicator.map((value) => Number(value)))),\n        backend.makeTensorInfo([reverseIndexMap.length], indices.dtype, new Int32Array(reverseIndexMap)),\n    ];\n}\nexport const sparseFillEmptyRowsConfig = {\n    kernelName: SparseFillEmptyRows,\n    backendName: 'cpu',\n    kernelFunc: sparseFillEmptyRows,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlRmlsbEVtcHR5Um93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLG1CQUFtQixFQUFvRCxNQUFNLHVCQUF1QixDQUFDO0FBSXZJLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDRCQUE0QixDQUFDO0FBRW5FLE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUduQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQztVQUNWLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzNCO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQztVQUNWLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDN0IsTUFBTSxJQUFJLEtBQUssQ0FBQztVQUNWLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3ZCO0lBQ0QsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDbkMsTUFBTSxJQUFJLEtBQUssQ0FBQztVQUNWLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdCO0lBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdkUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDckUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDN0UsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQVcsQ0FBQztJQUU5RCxNQUFNLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFDL0MsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEdBQ3RDLHVCQUF1QixDQUNuQixRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUM3RCxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDcEMsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7UUFDeEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQ3hELE9BQU8sQ0FBQyxjQUFjLENBQ2xCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNsQyxJQUFJLFVBQVUsQ0FDVixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFDdkMsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDckMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VGaWxsRW1wdHlSb3dzLCBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmltcG9ydCB7c3BhcnNlRmlsbEVtcHR5Um93c0ltcGx9IGZyb20gJy4vU3BhcnNlRmlsbEVtcHR5Um93c19pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZUZpbGxFbXB0eVJvd3MoYXJnczoge1xuICBpbnB1dHM6IFNwYXJzZUZpbGxFbXB0eVJvd3NJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWV9ID0gaW5wdXRzO1xuICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlbnNlIHNoYXBlIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgJHtkZW5zZVNoYXBlLnNoYXBlfWApO1xuICB9XG4gIGlmIChpbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW5kaWNlcyBtdXN0IGJlIGEgbWF0cml4LCBzYXc6XG4gICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAodmFsdWVzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgVmFsdWVzIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgJHt2YWx1ZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmF1bHQgdmFsdWUgbXVzdCBiZSBhIHNjYWxhciwgc2F3OlxuICAgICAgICAke2RlZmF1bHRWYWx1ZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICR2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHZhbHVlcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVuc2VTaGFwZSA9IGJhY2tlbmQuZGF0YS5nZXQoZGVuc2VTaGFwZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVmYXVsdFZhbHVlID1cbiAgICAgIGJhY2tlbmQuZGF0YS5nZXQoZGVmYXVsdFZhbHVlLmRhdGFJZCkudmFsdWVzWzBdIGFzIG51bWJlcjtcblxuICBjb25zdCBbb3V0cHV0SW5kaWNlcywgb3V0cHV0SW5kaWNlc1NoYXBlLCBvdXRwdXRWYWx1ZXMsXG4gICAgICAgICBlbXB0eVJvd0luZGljYXRvciwgcmV2ZXJzZUluZGV4TWFwXSA9XG4gICAgICBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbChcbiAgICAgICAgICAkaW5kaWNlcywgaW5kaWNlcy5zaGFwZSwgaW5kaWNlcy5kdHlwZSwgJHZhbHVlcywgdmFsdWVzLmR0eXBlLFxuICAgICAgICAgICRkZW5zZVNoYXBlLCAkZGVmYXVsdFZhbHVlKTtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dEluZGljZXNTaGFwZSwgaW5kaWNlcy5kdHlwZSwgb3V0cHV0SW5kaWNlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW291dHB1dEluZGljZXNTaGFwZVswXV0sIHZhbHVlcy5kdHlwZSwgb3V0cHV0VmFsdWVzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbZW1wdHlSb3dJbmRpY2F0b3IubGVuZ3RoXSwgJ2Jvb2wnLFxuICAgICAgICBuZXcgVWludDhBcnJheShcbiAgICAgICAgICAgIGVtcHR5Um93SW5kaWNhdG9yLm1hcCgodmFsdWU6IGJvb2xlYW4pID0+IE51bWJlcih2YWx1ZSkpKSksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3JldmVyc2VJbmRleE1hcC5sZW5ndGhdLCBpbmRpY2VzLmR0eXBlLFxuICAgICAgICBuZXcgSW50MzJBcnJheShyZXZlcnNlSW5kZXhNYXApKSxcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlRmlsbEVtcHR5Um93cyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VGaWxsRW1wdHlSb3dzIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseReshape } from '@tensorflow/tfjs-core';\nimport { sparseReshapeImpl } from './SparseReshape_impl';\nexport function sparseReshape(args) {\n    const { inputs, backend } = args;\n    const { inputIndices, inputShape, newShape } = inputs;\n    if (inputIndices.shape.length !== 2) {\n        throw new Error(`Input indices should be a matrix but received shape\n        ${inputIndices.shape}`);\n    }\n    if (inputShape.shape.length !== 1) {\n        throw new Error(`Input shape should be a vector but received shape\n        ${inputShape.shape}`);\n    }\n    if (newShape.shape.length !== 1) {\n        throw new Error(`Target shape should be a vector but received shape ${newShape.shape}`);\n    }\n    const $inputShape = Array.from(backend.data.get(inputShape.dataId).values);\n    const $inputIndices = backend.data.get(inputIndices.dataId).values;\n    const targetShape = Array.from(backend.data.get(newShape.dataId).values);\n    const [newIndices, indicesShape, outputShape] = sparseReshapeImpl($inputIndices, inputIndices.shape, inputIndices.dtype, $inputShape, targetShape);\n    return [\n        backend.makeTensorInfo(indicesShape, inputIndices.dtype, newIndices),\n        backend.makeTensorInfo([outputShape.length], newShape.dtype, new Int32Array(outputShape)),\n    ];\n}\nexport const sparseReshapeConfig = {\n    kernelName: SparseReshape,\n    backendName: 'cpu',\n    kernelFunc: sparseReshape,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlUmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3BhcnNlUmVzaGFwZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsYUFBYSxFQUE4QyxNQUFNLHVCQUF1QixDQUFDO0FBSS9HLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXZELE1BQU0sVUFBVSxhQUFhLENBQ3pCLElBQTREO0lBRTlELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNwRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDO1VBQ1YsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0I7SUFDRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDO1VBQ1YsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDM0I7SUFFRCxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQixNQUFNLElBQUksS0FBSyxDQUNYLHNEQUFzRCxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUM3RTtJQUVELE1BQU0sV0FBVyxHQUNiLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUMsQ0FBQztJQUN6RSxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUMvRCxNQUFNLFdBQVcsR0FDYixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFvQixDQUFDLENBQUM7SUFFdkUsTUFBTSxDQUFDLFVBQVUsRUFBRSxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQUcsaUJBQWlCLENBQzdELGFBQWEsRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUNsRSxXQUFXLENBQUMsQ0FBQztJQUNqQixPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxVQUFVLENBQUM7UUFDcEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxJQUFJLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztLQUN2RSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFpQjtJQUMvQyxVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsYUFBYTtDQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU3BhcnNlUmVzaGFwZSwgU3BhcnNlUmVzaGFwZUlucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5pbXBvcnQge3NwYXJzZVJlc2hhcGVJbXBsfSBmcm9tICcuL1NwYXJzZVJlc2hhcGVfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VSZXNoYXBlKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwYXJzZVJlc2hhcGVJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5wdXRJbmRpY2VzLCBpbnB1dFNoYXBlLCBuZXdTaGFwZX0gPSBpbnB1dHM7XG4gIGlmIChpbnB1dEluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBpbmRpY2VzIHNob3VsZCBiZSBhIG1hdHJpeCBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgJHtpbnB1dEluZGljZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGlucHV0U2hhcGUuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBzaGFwZSBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICR7aW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGlmIChuZXdTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYXJnZXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZSAke25ld1NoYXBlLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgJGlucHV0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLmRhdGEuZ2V0KGlucHV0U2hhcGUuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheSk7XG4gIGNvbnN0ICRpbnB1dEluZGljZXMgPVxuICAgICAgYmFja2VuZC5kYXRhLmdldChpbnB1dEluZGljZXMuZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgdGFyZ2V0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLmRhdGEuZ2V0KG5ld1NoYXBlLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xuXG4gIGNvbnN0IFtuZXdJbmRpY2VzLCBpbmRpY2VzU2hhcGUsIG91dHB1dFNoYXBlXSA9IHNwYXJzZVJlc2hhcGVJbXBsKFxuICAgICAgJGlucHV0SW5kaWNlcywgaW5wdXRJbmRpY2VzLnNoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsICRpbnB1dFNoYXBlLFxuICAgICAgdGFyZ2V0U2hhcGUpO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oaW5kaWNlc1NoYXBlLCBpbnB1dEluZGljZXMuZHR5cGUsIG5ld0luZGljZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtvdXRwdXRTaGFwZS5sZW5ndGhdLCBuZXdTaGFwZS5kdHlwZSwgbmV3IEludDMyQXJyYXkob3V0cHV0U2hhcGUpKSxcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVJlc2hhcGVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlUmVzaGFwZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VSZXNoYXBlLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseSegmentMean } from '@tensorflow/tfjs-core';\nimport { sparseSegmentReductionImpl } from './SparseSegmentReduction_impl';\nexport function sparseSegmentMean(args) {\n    const { inputs, backend } = args;\n    const { data, indices, segmentIds } = inputs;\n    if (data.shape.length < 1) {\n        throw new Error(`Data should be at least 1 dimensional but received scalar`);\n    }\n    if (indices.shape.length !== 1) {\n        throw new Error(`Indices should be a vector but received shape\n          ${indices.shape}`);\n    }\n    if (segmentIds.shape.length !== 1) {\n        throw new Error(`Segment ids should be a vector but received shape\n          ${segmentIds.shape}`);\n    }\n    if (indices.shape[0] !== segmentIds.shape[0]) {\n        throw new Error(`segmentIds and indices should have same size.`);\n    }\n    const $data = backend.data.get(data.dataId).values;\n    const $indices = backend.data.get(indices.dataId).values;\n    const $segmentIds = backend.data.get(segmentIds.dataId).values;\n    const [outputData, outputDataShape] = sparseSegmentReductionImpl($data, data.shape, data.dtype, $indices, $segmentIds, true);\n    return backend.makeTensorInfo(outputDataShape, data.dtype, outputData);\n}\nexport const sparseSegmentMeanConfig = {\n    kernelName: SparseSegmentMean,\n    backendName: 'cpu',\n    kernelFunc: sparseSegmentMean,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudE1lYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxpQkFBaUIsRUFBa0QsTUFBTSx1QkFBdUIsQ0FBQztBQUl2SCxPQUFPLEVBQUMsMEJBQTBCLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQUV6RSxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLElBQWdFO0lBRWxFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRCxDQUFDLENBQUM7S0FDbEU7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDO1lBQ1IsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDMUI7SUFDRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDO1lBQ1IsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0I7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLCtDQUErQyxDQUFDLENBQUM7S0FDbEU7SUFFRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUNqRSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUN2RSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUU3RSxNQUFNLENBQUMsVUFBVSxFQUFFLGVBQWUsQ0FBQyxHQUFHLDBCQUEwQixDQUM1RCxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUI7SUFDbkQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsaUJBQWlCO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcGFyc2VTZWdtZW50TWVhbiwgU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbH0gZnJvbSAnLi9TcGFyc2VTZWdtZW50UmVkdWN0aW9uX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlU2VnbWVudE1lYW4oXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2RhdGEsIGluZGljZXMsIHNlZ21lbnRJZHN9ID0gaW5wdXRzO1xuICBpZiAoZGF0YS5zaGFwZS5sZW5ndGggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgRGF0YSBzaG91bGQgYmUgYXQgbGVhc3QgMSBkaW1lbnNpb25hbCBidXQgcmVjZWl2ZWQgc2NhbGFyYCk7XG4gIH1cbiAgaWYgKGluZGljZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbmRpY2VzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAke2luZGljZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICB9XG4gIGlmIChpbmRpY2VzLnNoYXBlWzBdICE9PSBzZWdtZW50SWRzLnNoYXBlWzBdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50SWRzIGFuZCBpbmRpY2VzIHNob3VsZCBoYXZlIHNhbWUgc2l6ZS5gKTtcbiAgfVxuXG4gIGNvbnN0ICRkYXRhID0gYmFja2VuZC5kYXRhLmdldChkYXRhLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRzZWdtZW50SWRzID0gYmFja2VuZC5kYXRhLmdldChzZWdtZW50SWRzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgW291dHB1dERhdGEsIG91dHB1dERhdGFTaGFwZV0gPSBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbChcbiAgICAgICRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMsIHRydWUpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXREYXRhU2hhcGUsIGRhdGEuZHR5cGUsIG91dHB1dERhdGEpO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudE1lYW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3BhcnNlU2VnbWVudE1lYW4sXG59O1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseSegmentSum } from '@tensorflow/tfjs-core';\nimport { sparseSegmentReductionImpl } from './SparseSegmentReduction_impl';\nexport function sparseSegmentSum(args) {\n    const { inputs, backend } = args;\n    const { data, indices, segmentIds } = inputs;\n    if (data.shape.length < 1) {\n        throw new Error(`Data should be at least 1 dimensional but received scalar`);\n    }\n    if (indices.shape.length !== 1) {\n        throw new Error(`Indices should be a vector but received shape\n         ${indices.shape}`);\n    }\n    if (segmentIds.shape.length !== 1) {\n        throw new Error(`Segment ids should be a vector but received shape\n         ${segmentIds.shape}`);\n    }\n    if (indices.shape[0] !== segmentIds.shape[0]) {\n        throw new Error(`segmentIds and indices should have same size.`);\n    }\n    const $data = backend.data.get(data.dataId).values;\n    const $indices = backend.data.get(indices.dataId).values;\n    const $segmentIds = backend.data.get(segmentIds.dataId).values;\n    const [outputData, outputDataShape] = sparseSegmentReductionImpl($data, data.shape, data.dtype, $indices, $segmentIds);\n    return backend.makeTensorInfo(outputDataShape, data.dtype, outputData);\n}\nexport const sparseSegmentSumConfig = {\n    kernelName: SparseSegmentSum,\n    backendName: 'cpu',\n    kernelFunc: sparseSegmentSum,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudFN1bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3BhcnNlU2VnbWVudFN1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsZ0JBQWdCLEVBQWlELE1BQU0sdUJBQXVCLENBQUM7QUFJckgsT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFFekUsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixJQUErRDtJQUVqRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQztXQUNULE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3pCO0lBQ0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQztXQUNULFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0tBQ2xFO0lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDakUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDdkUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFFN0UsTUFBTSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsR0FBRywwQkFBMEIsQ0FDNUQsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBaUI7SUFDbEQsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsZ0JBQWdCO0NBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcGFyc2VTZWdtZW50U3VtLCBTcGFyc2VTZWdtZW50U3VtSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmltcG9ydCB7c3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGx9IGZyb20gJy4vU3BhcnNlU2VnbWVudFJlZHVjdGlvbl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVNlZ21lbnRTdW0oXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlU2VnbWVudFN1bUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGF0YSwgaW5kaWNlcywgc2VnbWVudElkc30gPSBpbnB1dHM7XG4gIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmIChzZWdtZW50SWRzLnNoYXBlLmxlbmd0aCAhPT0gMSkge1xuICAgIHRocm93IG5ldyBFcnJvcihgU2VnbWVudCBpZHMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgJHtzZWdtZW50SWRzLnNoYXBlfWApO1xuICB9XG4gIGlmIChpbmRpY2VzLnNoYXBlWzBdICE9PSBzZWdtZW50SWRzLnNoYXBlWzBdKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBzZWdtZW50SWRzIGFuZCBpbmRpY2VzIHNob3VsZCBoYXZlIHNhbWUgc2l6ZS5gKTtcbiAgfVxuXG4gIGNvbnN0ICRkYXRhID0gYmFja2VuZC5kYXRhLmdldChkYXRhLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5kYXRhLmdldChpbmRpY2VzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRzZWdtZW50SWRzID0gYmFja2VuZC5kYXRhLmdldChzZWdtZW50SWRzLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgW291dHB1dERhdGEsIG91dHB1dERhdGFTaGFwZV0gPSBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbChcbiAgICAgICRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXREYXRhU2hhcGUsIGRhdGEuZHR5cGUsIG91dHB1dERhdGEpO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudFN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VTZWdtZW50U3VtLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0sXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SparseToDense, util } from '@tensorflow/tfjs-core';\nimport { scatterImpl } from './Scatter_impl';\nexport function sparseToDense(args) {\n    const { inputs, backend, attrs } = args;\n    const { sparseIndices, sparseValues, defaultValue } = inputs;\n    const { outputShape } = attrs;\n    const { sliceRank, numUpdates, sliceSize, strides, outputSize } = backend_util.calculateShapes(sparseValues, sparseIndices, outputShape);\n    const sumDupeIndices = false;\n    const indicesBuf = backend.bufferSync(sparseIndices);\n    let outBuf;\n    switch (sparseValues.dtype) {\n        case 'bool': {\n            const updatesBuf = backend.bufferSync(sparseValues);\n            const $defaultValue = Boolean(backend.data.get(defaultValue.dataId).values[0]);\n            outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n            break;\n        }\n        case 'float32': {\n            const updatesBuf = backend.bufferSync(sparseValues);\n            const $defaultValue = backend.data.get(defaultValue.dataId).values[0];\n            outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n            break;\n        }\n        case 'int32': {\n            const updatesBuf = backend.bufferSync(sparseValues);\n            const $defaultValue = backend.data.get(defaultValue.dataId).values[0];\n            outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n            break;\n        }\n        case 'string': {\n            const updatesBuf = backend.bufferSync(sparseValues);\n            const $defaultValue = util.decodeString(backend.data.get(defaultValue.dataId).values[0]);\n            outBuf = scatterImpl(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n            break;\n        }\n        default:\n            throw new Error(`Unsupported type ${sparseValues.dtype}`);\n    }\n    return backend.makeTensorInfo(outputShape, outBuf.dtype, outBuf.values);\n}\nexport const sparseToDenseConfig = {\n    kernelName: SparseToDense,\n    backendName: 'cpu',\n    kernelFunc: sparseToDense\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlVG9EZW5zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3BhcnNlVG9EZW5zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFrQyxhQUFhLEVBQXVELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzdKLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxhQUFhLEVBQUUsWUFBWSxFQUFFLFlBQVksRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzRCxNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTVCLE1BQU0sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFDLEdBQ3pELFlBQVksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMzRSxNQUFNLGNBQWMsR0FBRyxLQUFLLENBQUM7SUFFN0IsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBZ0IsYUFBYSxDQUFDLENBQUM7SUFFcEUsSUFBSSxNQUFNLENBQUM7SUFDWCxRQUFRLFlBQVksQ0FBQyxLQUFLLEVBQUU7UUFDMUIsS0FBSyxNQUFNLENBQUMsQ0FBQztZQUNYLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWUsWUFBWSxDQUFDLENBQUM7WUFDbEUsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUM3RCxNQUFNLEdBQUcsV0FBVyxDQUNoQixVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUMxRCxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7WUFDbkUsTUFBTTtTQUNQO1FBQ0QsS0FBSyxTQUFTLENBQUMsQ0FBQztZQUNkLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWtCLFlBQVksQ0FBQyxDQUFDO1lBQ3JFLE1BQU0sYUFBYSxHQUNmLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFXLENBQUM7WUFDOUQsTUFBTSxHQUFHLFdBQVcsQ0FDaEIsVUFBVSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFDMUQsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ25FLE1BQU07U0FDUDtRQUNELEtBQUssT0FBTyxDQUFDLENBQUM7WUFDWixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFnQixZQUFZLENBQUMsQ0FBQztZQUNuRSxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBVyxDQUFDO1lBQzlELE1BQU0sR0FBRyxXQUFXLENBQ2hCLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNuRSxNQUFNO1NBQ1A7UUFDRCxLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBaUIsWUFBWSxDQUFDLENBQUM7WUFDcEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FDbkMsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWUsQ0FBQyxDQUFDO1lBQ25FLE1BQU0sR0FBRyxXQUFXLENBQ2hCLFVBQVUsRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQzFELFVBQVUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLGFBQWEsRUFBRSxjQUFjLENBQUMsQ0FBQztZQUNuRSxNQUFNO1NBQ1A7UUFDRDtZQUNFLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdEO0lBQ0QsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBTcGFyc2VUb0RlbnNlLCBTcGFyc2VUb0RlbnNlQXR0cnMsIFNwYXJzZVRvRGVuc2VJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7c2NhdHRlckltcGx9IGZyb20gJy4vU2NhdHRlcl9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVRvRGVuc2UoYXJnczoge1xuICBpbnB1dHM6IFNwYXJzZVRvRGVuc2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3BhcnNlVG9EZW5zZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzcGFyc2VJbmRpY2VzLCBzcGFyc2VWYWx1ZXMsIGRlZmF1bHRWYWx1ZX0gPSBpbnB1dHM7XG4gIGNvbnN0IHtvdXRwdXRTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCB7c2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemV9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXMoc3BhcnNlVmFsdWVzLCBzcGFyc2VJbmRpY2VzLCBvdXRwdXRTaGFwZSk7XG4gIGNvbnN0IHN1bUR1cGVJbmRpY2VzID0gZmFsc2U7XG5cbiAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnaW50MzInPihzcGFyc2VJbmRpY2VzKTtcblxuICBsZXQgb3V0QnVmO1xuICBzd2l0Y2ggKHNwYXJzZVZhbHVlcy5kdHlwZSkge1xuICAgIGNhc2UgJ2Jvb2wnOiB7XG4gICAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdib29sJz4oc3BhcnNlVmFsdWVzKTtcbiAgICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPVxuICAgICAgICAgIEJvb2xlYW4oYmFja2VuZC5kYXRhLmdldChkZWZhdWx0VmFsdWUuZGF0YUlkKS52YWx1ZXNbMF0pO1xuICAgICAgb3V0QnVmID0gc2NhdHRlckltcGwoXG4gICAgICAgICAgaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgb3V0cHV0U2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSxcbiAgICAgICAgICBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsICRkZWZhdWx0VmFsdWUsIHN1bUR1cGVJbmRpY2VzKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdmbG9hdDMyJzoge1xuICAgICAgY29uc3QgdXBkYXRlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KHNwYXJzZVZhbHVlcyk7XG4gICAgICBjb25zdCAkZGVmYXVsdFZhbHVlID1cbiAgICAgICAgICBiYWNrZW5kLmRhdGEuZ2V0KGRlZmF1bHRWYWx1ZS5kYXRhSWQpLnZhbHVlc1swXSBhcyBudW1iZXI7XG4gICAgICBvdXRCdWYgPSBzY2F0dGVySW1wbChcbiAgICAgICAgICBpbmRpY2VzQnVmLCB1cGRhdGVzQnVmLCBvdXRwdXRTaGFwZSwgb3V0cHV0U2l6ZSwgc2xpY2VTaXplLFxuICAgICAgICAgIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3RyaWRlcywgJGRlZmF1bHRWYWx1ZSwgc3VtRHVwZUluZGljZXMpO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ2ludDMyJzoge1xuICAgICAgY29uc3QgdXBkYXRlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnaW50MzInPihzcGFyc2VWYWx1ZXMpO1xuICAgICAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9XG4gICAgICAgICAgYmFja2VuZC5kYXRhLmdldChkZWZhdWx0VmFsdWUuZGF0YUlkKS52YWx1ZXNbMF0gYXMgbnVtYmVyO1xuICAgICAgb3V0QnVmID0gc2NhdHRlckltcGwoXG4gICAgICAgICAgaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgb3V0cHV0U2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSxcbiAgICAgICAgICBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsICRkZWZhdWx0VmFsdWUsIHN1bUR1cGVJbmRpY2VzKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdzdHJpbmcnPihzcGFyc2VWYWx1ZXMpO1xuICAgICAgY29uc3QgJGRlZmF1bHRWYWx1ZSA9IHV0aWwuZGVjb2RlU3RyaW5nKFxuICAgICAgICAgIGJhY2tlbmQuZGF0YS5nZXQoZGVmYXVsdFZhbHVlLmRhdGFJZCkudmFsdWVzWzBdIGFzIFVpbnQ4QXJyYXkpO1xuICAgICAgb3V0QnVmID0gc2NhdHRlckltcGwoXG4gICAgICAgICAgaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgb3V0cHV0U2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSxcbiAgICAgICAgICBudW1VcGRhdGVzLCBzbGljZVJhbmssIHN0cmlkZXMsICRkZWZhdWx0VmFsdWUsIHN1bUR1cGVJbmRpY2VzKTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnN1cHBvcnRlZCB0eXBlICR7c3BhcnNlVmFsdWVzLmR0eXBlfWApO1xuICB9XG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlVG9EZW5zZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VUb0RlbnNlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHNwYXJzZVRvRGVuc2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { SplitV, util } from '@tensorflow/tfjs-core';\nimport { slice } from './Slice';\nexport function splitV(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { numOrSizeSplits, axis } = attrs;\n    const $axis = util.parseAxisParam(axis, x.shape)[0];\n    const splitSizes = backend_util.prepareSplitSize(x, numOrSizeSplits, $axis);\n    const begin = new Array(x.shape.length).fill(0);\n    const size = x.shape.slice();\n    return splitSizes.map(s => {\n        const sliceSize = [...size];\n        sliceSize[$axis] = s;\n        const sliceT = slice({ inputs: { x }, backend, attrs: { begin, size: sliceSize } });\n        begin[$axis] += s;\n        return sliceT;\n    });\n}\nexport const splitVConfig = {\n    kernelName: SplitV,\n    backendName: 'cpu',\n    kernelFunc: splitV\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BsaXRWLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcGxpdFYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RSxPQUFPLEVBQTJCLE1BQU0sRUFBYyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6RixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxlQUFlLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNwRCxNQUFNLFVBQVUsR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUU1RSxNQUFNLEtBQUssR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNoRCxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4QixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FDUixLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgU3BsaXRWQXR0cnMsIFNwbGl0VklucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGxpdFYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRWKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwbGl0VklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsIGF0dHJzOiBTcGxpdFZBdHRyc30pOlxuICAgIFRlbnNvckluZm9bXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge251bU9yU2l6ZVNwbGl0cywgYXhpc30gPSBhdHRycztcblxuICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcblxuICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4LnNoYXBlLmxlbmd0aCkuZmlsbCgwKTtcbiAgY29uc3Qgc2l6ZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgcmV0dXJuIHNwbGl0U2l6ZXMubWFwKHMgPT4ge1xuICAgIGNvbnN0IHNsaWNlU2l6ZSA9IFsuLi5zaXplXTtcbiAgICBzbGljZVNpemVbJGF4aXNdID0gcztcbiAgICBjb25zdCBzbGljZVQgPVxuICAgICAgICBzbGljZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7YmVnaW4sIHNpemU6IHNsaWNlU2l6ZX19KTtcbiAgICBiZWdpblskYXhpc10gKz0gcztcbiAgICByZXR1cm4gc2xpY2VUO1xuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwbGl0VkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGxpdFYsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3BsaXRWIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Square } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nexport const squareConfig = {\n    kernelName: Square,\n    backendName: 'cpu',\n    kernelFunc: ({ inputs, backend }) => {\n        const { x } = inputs;\n        const cpuBackend = backend;\n        assertNotComplex(x, 'square');\n        const values = cpuBackend.data.get(x.dataId).values;\n        const newValues = new Float32Array(values.length);\n        for (let i = 0; i < values.length; ++i) {\n            const value = values[i];\n            newValues[i] = value * value;\n        }\n        const dataId = cpuBackend.write(newValues, x.shape, x.dtype);\n        return { dataId, shape: x.shape, dtype: x.dtype };\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TcXVhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLE1BQU0sRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRzNELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDaEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQXNCLENBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsT0FBeUIsQ0FBQztRQUM3QyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFOUIsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQXNCLENBQUM7UUFDcEUsTUFBTSxTQUFTLEdBQUcsSUFBSSxZQUFZLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1lBQ3RDLE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN4QixTQUFTLENBQUMsQ0FBQyxDQUFDLEdBQUcsS0FBSyxHQUFHLEtBQUssQ0FBQztTQUM5QjtRQUNELE1BQU0sTUFBTSxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzdELE9BQU8sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztJQUNsRCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtTcXVhcmUsIFNxdWFyZUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5cbmV4cG9ydCBjb25zdCBzcXVhcmVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3F1YXJlLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6ICh7aW5wdXRzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHt4fSA9IGlucHV0cyBhcyBTcXVhcmVJbnB1dHM7XG4gICAgY29uc3QgY3B1QmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRDUFU7XG4gICAgYXNzZXJ0Tm90Q29tcGxleCh4LCAnc3F1YXJlJyk7XG5cbiAgICBjb25zdCB2YWx1ZXMgPSBjcHVCYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgRmxvYXQzMkFycmF5O1xuICAgIGNvbnN0IG5ld1ZhbHVlcyA9IG5ldyBGbG9hdDMyQXJyYXkodmFsdWVzLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gdmFsdWVzW2ldO1xuICAgICAgbmV3VmFsdWVzW2ldID0gdmFsdWUgKiB2YWx1ZTtcbiAgICB9XG4gICAgY29uc3QgZGF0YUlkID0gY3B1QmFja2VuZC53cml0ZShuZXdWYWx1ZXMsIHguc2hhcGUsIHguZHR5cGUpO1xuICAgIHJldHVybiB7ZGF0YUlkLCBzaGFwZTogeC5zaGFwZSwgZHR5cGU6IHguZHR5cGV9O1xuICB9XG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Step } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const step = unaryKernelFunc(Step, (xi, attrs) => {\n    const stepAttrs = attrs;\n    if (isNaN(xi)) {\n        return NaN;\n    }\n    else {\n        return xi > 0 ? 1 : stepAttrs.alpha;\n    }\n});\nexport const stepConfig = {\n    kernelName: Step,\n    backendName: 'cpu',\n    kernelFunc: step,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3RlcC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFZLE1BQU0sdUJBQXVCLENBQUM7QUFFcEUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFO0lBQ3RELE1BQU0sU0FBUyxHQUFHLEtBQXdCLENBQUM7SUFDM0MsSUFBSSxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDYixPQUFPLEdBQUcsQ0FBQztLQUNaO1NBQU07UUFDTCxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQztLQUNyQztBQUNILENBQUMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFN0ZXAsIFN0ZXBBdHRyc30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHN0ZXAgPSB1bmFyeUtlcm5lbEZ1bmMoU3RlcCwgKHhpLCBhdHRycykgPT4ge1xuICBjb25zdCBzdGVwQXR0cnMgPSBhdHRycyBhcyB7fSBhcyBTdGVwQXR0cnM7XG4gIGlmIChpc05hTih4aSkpIHtcbiAgICByZXR1cm4gTmFOO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB4aSA+IDAgPyAxIDogc3RlcEF0dHJzLmFscGhhO1xuICB9XG59KTtcblxuZXhwb3J0IGNvbnN0IHN0ZXBDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RlcCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdGVwLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { slice_util, StridedSlice, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nimport { stridedSliceImpl } from './StridedSlice_impl';\nexport function stridedSlice(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask } = attrs;\n    assertNotComplex(x, 'stridedSlice');\n    const { finalShapeSparse, finalShape, isIdentity, sliceDim0, isSimpleSlice, begin: $begin, end: $end, strides: $strides } = slice_util.sliceInfo(x.shape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask);\n    let result;\n    // ref:\n    // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/strided_slice_op.cc\n    if (isIdentity) {\n        // Optimization #1, slice is a no-op plus reshape\n        result = reshape({ inputs: { x }, backend, attrs: { shape: finalShape } });\n    }\n    else if (sliceDim0 || isSimpleSlice) {\n        // Optimization #2, slice is memory contiguous (only occurs in dim 0)\n        util.assert(x.shape.length >= 1, () => `Input must have rank at least 1, got: ${x.shape.length}`);\n        const size = slice_util.computeOutShape($begin, $end, $strides);\n        // To tolerate begin[0] > end[0] (a 0-output slice), we min(begin, end).\n        const sliced = slice({ inputs: { x }, backend, attrs: { begin: $begin, size } });\n        result =\n            reshape({ inputs: { x: sliced }, backend, attrs: { shape: finalShape } });\n        backend.disposeIntermediateTensorInfo(sliced);\n    }\n    else {\n        const xBuf = backend.bufferSync(x);\n        const outBuf = stridedSliceImpl(finalShapeSparse, xBuf, $strides, $begin);\n        result = backend.makeTensorInfo(finalShape, outBuf.dtype, outBuf.values);\n    }\n    return result;\n}\nexport const stridedSliceConfig = {\n    kernelName: StridedSlice,\n    backendName: 'cpu',\n    kernelFunc: stridedSlice\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaWRlZFNsaWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdHJpZGVkU2xpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFpQyxVQUFVLEVBQUUsWUFBWSxFQUFxRCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd4SixPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXJELE1BQU0sVUFBVSxZQUFZLENBQUMsSUFJNUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQ0osS0FBSyxFQUNMLEdBQUcsRUFDSCxPQUFPLEVBQ1AsU0FBUyxFQUNULE9BQU8sRUFDUCxZQUFZLEVBQ1osV0FBVyxFQUNYLGNBQWMsRUFDZixHQUFHLEtBQUssQ0FBQztJQUVWLGdCQUFnQixDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsQ0FBQztJQUVwQyxNQUFNLEVBQ0osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixVQUFVLEVBQ1YsU0FBUyxFQUNULGFBQWEsRUFDYixLQUFLLEVBQUUsTUFBTSxFQUNiLEdBQUcsRUFBRSxJQUFJLEVBQ1QsT0FBTyxFQUFFLFFBQVEsRUFDbEIsR0FDRyxVQUFVLENBQUMsU0FBUyxDQUNoQixDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUM5RCxXQUFXLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFckMsSUFBSSxNQUFNLENBQUM7SUFFWCxPQUFPO0lBQ1AsbUdBQW1HO0lBQ25HLElBQUksVUFBVSxFQUFFO1FBQ2QsaURBQWlEO1FBQ2pELE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUN0RTtTQUFNLElBQUksU0FBUyxJQUFJLGFBQWEsRUFBRTtRQUNyQyxxRUFBcUU7UUFDckUsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sSUFBSSxDQUFDLEVBQ25CLEdBQUcsRUFBRSxDQUFDLHlDQUF5QyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFckUsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2hFLHdFQUF3RTtRQUN4RSxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDM0UsTUFBTTtZQUNGLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFVBQVUsRUFBQyxFQUFDLENBQUMsQ0FBQztRQUN4RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDL0M7U0FBTTtRQUNMLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWtCLENBQUMsQ0FBQyxDQUFDO1FBQ3BELE1BQU0sTUFBTSxHQUFHLGdCQUFnQixDQUFDLGdCQUFnQixFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFFMUUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFFO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhbmssIHNsaWNlX3V0aWwsIFN0cmlkZWRTbGljZSwgU3RyaWRlZFNsaWNlQXR0cnMsIFN0cmlkZWRTbGljZUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuL1NsaWNlJztcbmltcG9ydCB7c3RyaWRlZFNsaWNlSW1wbH0gZnJvbSAnLi9TdHJpZGVkU2xpY2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJnczoge1xuICBpbnB1dHM6IFN0cmlkZWRTbGljZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRDUFUsXG4gIGF0dHJzOiBTdHJpZGVkU2xpY2VBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtcbiAgICBiZWdpbixcbiAgICBlbmQsXG4gICAgc3RyaWRlcyxcbiAgICBiZWdpbk1hc2ssXG4gICAgZW5kTWFzayxcbiAgICBlbGxpcHNpc01hc2ssXG4gICAgbmV3QXhpc01hc2ssXG4gICAgc2hyaW5rQXhpc01hc2tcbiAgfSA9IGF0dHJzO1xuXG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ3N0cmlkZWRTbGljZScpO1xuXG4gIGNvbnN0IHtcbiAgICBmaW5hbFNoYXBlU3BhcnNlLFxuICAgIGZpbmFsU2hhcGUsXG4gICAgaXNJZGVudGl0eSxcbiAgICBzbGljZURpbTAsXG4gICAgaXNTaW1wbGVTbGljZSxcbiAgICBiZWdpbjogJGJlZ2luLFxuICAgIGVuZDogJGVuZCxcbiAgICBzdHJpZGVzOiAkc3RyaWRlc1xuICB9ID1cbiAgICAgIHNsaWNlX3V0aWwuc2xpY2VJbmZvKFxuICAgICAgICAgIHguc2hhcGUsIGJlZ2luLCBlbmQsIHN0cmlkZXMsIGJlZ2luTWFzaywgZW5kTWFzaywgZWxsaXBzaXNNYXNrLFxuICAgICAgICAgIG5ld0F4aXNNYXNrLCBzaHJpbmtBeGlzTWFzayk7XG5cbiAgbGV0IHJlc3VsdDtcblxuICAvLyByZWY6XG4gIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvc3RyaWRlZF9zbGljZV9vcC5jY1xuICBpZiAoaXNJZGVudGl0eSkge1xuICAgIC8vIE9wdGltaXphdGlvbiAjMSwgc2xpY2UgaXMgYSBuby1vcCBwbHVzIHJlc2hhcGVcbiAgICByZXN1bHQgPSByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZmluYWxTaGFwZX19KTtcbiAgfSBlbHNlIGlmIChzbGljZURpbTAgfHwgaXNTaW1wbGVTbGljZSkge1xuICAgIC8vIE9wdGltaXphdGlvbiAjMiwgc2xpY2UgaXMgbWVtb3J5IGNvbnRpZ3VvdXMgKG9ubHkgb2NjdXJzIGluIGRpbSAwKVxuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICB4LnNoYXBlLmxlbmd0aCA+PSAxLFxuICAgICAgICAoKSA9PiBgSW5wdXQgbXVzdCBoYXZlIHJhbmsgYXQgbGVhc3QgMSwgZ290OiAke3guc2hhcGUubGVuZ3RofWApO1xuXG4gICAgY29uc3Qgc2l6ZSA9IHNsaWNlX3V0aWwuY29tcHV0ZU91dFNoYXBlKCRiZWdpbiwgJGVuZCwgJHN0cmlkZXMpO1xuICAgIC8vIFRvIHRvbGVyYXRlIGJlZ2luWzBdID4gZW5kWzBdIChhIDAtb3V0cHV0IHNsaWNlKSwgd2UgbWluKGJlZ2luLCBlbmQpLlxuICAgIGNvbnN0IHNsaWNlZCA9IHNsaWNlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtiZWdpbjogJGJlZ2luLCBzaXplfX0pO1xuICAgIHJlc3VsdCA9XG4gICAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHNsaWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGZpbmFsU2hhcGV9fSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzbGljZWQpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmM8UmFuaywgJ2Zsb2F0MzInPih4KTtcbiAgICBjb25zdCBvdXRCdWYgPSBzdHJpZGVkU2xpY2VJbXBsKGZpbmFsU2hhcGVTcGFyc2UsIHhCdWYsICRzdHJpZGVzLCAkYmVnaW4pO1xuXG4gICAgcmVzdWx0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhmaW5hbFNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmlkZWRTbGljZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdHJpZGVkU2xpY2UsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringNGrams } from '@tensorflow/tfjs-core';\nimport { stringNGramsImpl } from './StringNGrams_impl';\nexport function stringNGrams(args) {\n    const { inputs, backend, attrs } = args;\n    const { separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences } = attrs;\n    const { data, dataSplits } = inputs;\n    const $data = backend.data.get(data.dataId).values;\n    const $dataSplits = backend.data.get(dataSplits.dataId).values;\n    const [nGrams, nGramsSplits] = stringNGramsImpl($data, $dataSplits, separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences);\n    return [\n        backend.makeTensorInfo([nGrams.length], 'string', nGrams),\n        backend.makeTensorInfo(dataSplits.shape, 'int32', nGramsSplits),\n    ];\n}\nexport const stringNGramsConfig = {\n    kernelName: StringNGrams,\n    backendName: 'cpu',\n    kernelFunc: stringNGrams,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nTkdyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9TdHJpbmdOR3JhbXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixZQUFZLEVBQW9ELE1BQU0sdUJBQXVCLENBQUM7QUFJaEksT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFckQsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQ0osU0FBUyxFQUNULFdBQVcsRUFDWCxPQUFPLEVBQ1AsUUFBUSxFQUNSLFFBQVEsRUFDUixzQkFBc0IsRUFDdkIsR0FBRyxLQUFLLENBQUM7SUFDVixNQUFNLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBc0IsQ0FBQztJQUNuRSxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBb0IsQ0FBQztJQUU3RSxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLGdCQUFnQixDQUMzQyxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3ZFLHNCQUFzQixDQUFDLENBQUM7SUFDNUIsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUN6RCxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQztLQUNoRSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN0cmluZ05HcmFtcywgU3RyaW5nTkdyYW1zQXR0cnMsIFN0cmluZ05HcmFtc0lucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuXG5pbXBvcnQge3N0cmluZ05HcmFtc0ltcGx9IGZyb20gJy4vU3RyaW5nTkdyYW1zX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5nTkdyYW1zKGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdOR3JhbXNJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3RyaW5nTkdyYW1zQXR0cnNcbn0pOiBbVGVuc29ySW5mbywgVGVuc29ySW5mb10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7XG4gICAgc2VwYXJhdG9yLFxuICAgIG5HcmFtV2lkdGhzLFxuICAgIGxlZnRQYWQsXG4gICAgcmlnaHRQYWQsXG4gICAgcGFkV2lkdGgsXG4gICAgcHJlc2VydmVTaG9ydFNlcXVlbmNlc1xuICB9ID0gYXR0cnM7XG4gIGNvbnN0IHtkYXRhLCBkYXRhU3BsaXRzfSA9IGlucHV0cztcbiAgY29uc3QgJGRhdGEgPSBiYWNrZW5kLmRhdGEuZ2V0KGRhdGEuZGF0YUlkKS52YWx1ZXMgYXMgVWludDhBcnJheVtdO1xuICBjb25zdCAkZGF0YVNwbGl0cyA9IGJhY2tlbmQuZGF0YS5nZXQoZGF0YVNwbGl0cy5kYXRhSWQpLnZhbHVlcyBhcyBJbnQzMkFycmF5O1xuXG4gIGNvbnN0IFtuR3JhbXMsIG5HcmFtc1NwbGl0c10gPSBzdHJpbmdOR3JhbXNJbXBsKFxuICAgICAgJGRhdGEsICRkYXRhU3BsaXRzLCBzZXBhcmF0b3IsIG5HcmFtV2lkdGhzLCBsZWZ0UGFkLCByaWdodFBhZCwgcGFkV2lkdGgsXG4gICAgICBwcmVzZXJ2ZVNob3J0U2VxdWVuY2VzKTtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtuR3JhbXMubGVuZ3RoXSwgJ3N0cmluZycsIG5HcmFtcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhkYXRhU3BsaXRzLnNoYXBlLCAnaW50MzInLCBuR3JhbXNTcGxpdHMpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nTkdyYW1zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ05HcmFtcyxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdHJpbmdOR3JhbXMgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringSplit } from '@tensorflow/tfjs-core';\nimport { stringSplitImpl } from './StringSplit_impl';\nexport function stringSplit(args) {\n    const { inputs, backend, attrs } = args;\n    const { skipEmpty } = attrs;\n    const { input, delimiter } = inputs;\n    if (input.dtype !== 'string') {\n        throw new Error('Input must be of datatype string');\n    }\n    if (input.shape.length !== 1) {\n        throw new Error(`Input must be a vector, got shape: ${input.shape}`);\n    }\n    if (delimiter.shape.length !== 0) {\n        throw new Error(`Delimiter must be a scalar, got shape: ${delimiter.shape}`);\n    }\n    const $input = backend.data.get(input.dataId).values;\n    const $delimiter = backend.data.get(delimiter.dataId).values[0];\n    const [indices, values, shape] = stringSplitImpl($input, $delimiter, skipEmpty);\n    const outputSize = values.length;\n    return [\n        backend.makeTensorInfo([outputSize, 2], 'int32', indices),\n        backend.makeTensorInfo([outputSize], 'string', values),\n        backend.makeTensorInfo([2], 'int32', new Int32Array(shape))\n    ];\n}\nexport const stringSplitConfig = {\n    kernelName: StringSplit,\n    backendName: 'cpu',\n    kernelFunc: stringSplit,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nU3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9rZXJuZWxzL1N0cmluZ1NwbGl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsV0FBVyxFQUFrRCxNQUFNLHVCQUF1QixDQUFDO0FBSTdILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUIsTUFBTSxFQUFDLEtBQUssRUFBRSxTQUFTLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbEMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7S0FDckQ7SUFDRCxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUN0RTtJQUNELElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ1gsMENBQTBDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ2xFO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQXNCLENBQUM7SUFDckUsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQWUsQ0FBQztJQUU5RSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FDMUIsZUFBZSxDQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNqQyxPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO1FBQ3pELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxVQUFVLENBQUMsRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDO1FBQ3RELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDNUQsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdHJpbmdTcGxpdCwgU3RyaW5nU3BsaXRBdHRycywgU3RyaW5nU3BsaXRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcblxuaW1wb3J0IHtzdHJpbmdTcGxpdEltcGx9IGZyb20gJy4vU3RyaW5nU3BsaXRfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdTcGxpdChhcmdzOiB7XG4gIGlucHV0czogU3RyaW5nU3BsaXRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3RyaW5nU3BsaXRBdHRyc1xufSk6IFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtza2lwRW1wdHl9ID0gYXR0cnM7XG4gIGNvbnN0IHtpbnB1dCwgZGVsaW1pdGVyfSA9IGlucHV0cztcblxuICBpZiAoaW5wdXQuZHR5cGUgIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnB1dCBtdXN0IGJlIG9mIGRhdGF0eXBlIHN0cmluZycpO1xuICB9XG4gIGlmIChpbnB1dC5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IG11c3QgYmUgYSB2ZWN0b3IsIGdvdCBzaGFwZTogJHtpbnB1dC5zaGFwZX1gKTtcbiAgfVxuICBpZiAoZGVsaW1pdGVyLnNoYXBlLmxlbmd0aCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYERlbGltaXRlciBtdXN0IGJlIGEgc2NhbGFyLCBnb3Qgc2hhcGU6ICR7ZGVsaW1pdGVyLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgJGlucHV0ID0gYmFja2VuZC5kYXRhLmdldChpbnB1dC5kYXRhSWQpLnZhbHVlcyBhcyBVaW50OEFycmF5W107XG4gIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLmRhdGEuZ2V0KGRlbGltaXRlci5kYXRhSWQpLnZhbHVlc1swXSBhcyBVaW50OEFycmF5O1xuXG4gIGNvbnN0IFtpbmRpY2VzLCB2YWx1ZXMsIHNoYXBlXSA9XG4gICAgICBzdHJpbmdTcGxpdEltcGwoJGlucHV0LCAkZGVsaW1pdGVyLCBza2lwRW1wdHkpO1xuICBjb25zdCBvdXRwdXRTaXplID0gdmFsdWVzLmxlbmd0aDtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplLCAyXSwgJ2ludDMyJywgaW5kaWNlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbb3V0cHV0U2l6ZV0sICdzdHJpbmcnLCB2YWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oWzJdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzaGFwZSkpXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdTcGxpdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdHJpbmdTcGxpdCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdHJpbmdTcGxpdCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringToHashBucketFast } from '@tensorflow/tfjs-core';\nimport { stringToHashBucketFastImpl } from './StringToHashBucketFast_impl';\nexport function stringToHashBucketFast(args) {\n    const { inputs, backend, attrs } = args;\n    const { numBuckets } = attrs;\n    const { input } = inputs;\n    if (input.dtype !== 'string') {\n        throw new Error('Input must be of datatype string');\n    }\n    if (numBuckets <= 0) {\n        throw new Error(`Number of buckets must be at least 1`);\n    }\n    const $input = backend.data.get(input.dataId).values;\n    const output = stringToHashBucketFastImpl($input, numBuckets);\n    return backend.makeTensorInfo(input.shape, 'int32', output);\n}\nexport const stringToHashBucketFastConfig = {\n    kernelName: StringToHashBucketFast,\n    backendName: 'cpu',\n    kernelFunc: stringToHashBucketFast,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nVG9IYXNoQnVja2V0RmFzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvU3RyaW5nVG9IYXNoQnVja2V0RmFzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLHNCQUFzQixFQUF3RSxNQUFNLHVCQUF1QixDQUFDO0FBSTlKLE9BQU8sRUFBQywwQkFBMEIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRXpFLE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxJQUl0QztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzNCLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7S0FDckQ7SUFDRCxJQUFJLFVBQVUsSUFBSSxDQUFDLEVBQUU7UUFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsQ0FBQyxDQUFDO0tBQ3pEO0lBRUQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQXNCLENBQUM7SUFFckUsTUFBTSxNQUFNLEdBQUcsMEJBQTBCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQzlELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWlCO0lBQ3hELFVBQVUsRUFBRSxzQkFBc0I7SUFDbEMsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLHNCQUEwQztDQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCwgU3RyaW5nVG9IYXNoQnVja2V0RmFzdEF0dHJzLCBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmltcG9ydCB7c3RyaW5nVG9IYXNoQnVja2V0RmFzdEltcGx9IGZyb20gJy4vU3RyaW5nVG9IYXNoQnVja2V0RmFzdF9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3QoYXJnczoge1xuICBpbnB1dHM6IFN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogU3RyaW5nVG9IYXNoQnVja2V0RmFzdEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtudW1CdWNrZXRzfSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgb2YgZGF0YXR5cGUgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKG51bUJ1Y2tldHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gIH1cblxuICBjb25zdCAkaW5wdXQgPSBiYWNrZW5kLmRhdGEuZ2V0KGlucHV0LmRhdGFJZCkudmFsdWVzIGFzIFVpbnQ4QXJyYXlbXTtcblxuICBjb25zdCBvdXRwdXQgPSBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbCgkaW5wdXQsIG51bUJ1Y2tldHMpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbnB1dC5zaGFwZSwgJ2ludDMyJywgb3V0cHV0KTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RyaW5nVG9IYXNoQnVja2V0RmFzdCxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0IGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const tan = unaryKernelFunc(Tan, (xi) => Math.tan(xi));\nexport const tanConfig = {\n    kernelName: Tan,\n    backendName: 'cpu',\n    kernelFunc: tan,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9UYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXhELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBRTlELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFRhbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL3V0aWxzL3VuYXJ5X3V0aWxzJztcblxuZXhwb3J0IGNvbnN0IHRhbiA9IHVuYXJ5S2VybmVsRnVuYyhUYW4sICh4aSkgPT4gTWF0aC50YW4oeGkpKTtcblxuZXhwb3J0IGNvbnN0IHRhbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUYW4sXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogdGFuLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tanh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../utils/unary_utils';\nexport const tanh = unaryKernelFunc(Tanh, (xi) => Math.tanh(xi));\nexport const tanhConfig = {\n    kernelName: Tanh,\n    backendName: 'cpu',\n    kernelFunc: tanh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvVGFuaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBMaWNlbnNlKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIEFTIElTIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFRhbmh9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi91dGlscy91bmFyeV91dGlscyc7XG5cbmV4cG9ydCBjb25zdCB0YW5oID0gdW5hcnlLZXJuZWxGdW5jKFRhbmgsICh4aSkgPT4gTWF0aC50YW5oKHhpKSk7XG5cbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRhbmgsXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogdGFuaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tile } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { tileImpl } from './Tile_impl';\nexport function tile(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { reps } = attrs;\n    assertNotComplex(x, 'tile');\n    const outBuf = tileImpl(backend.bufferSync(x), reps);\n    return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n}\nexport const tileConfig = {\n    kernelName: Tile,\n    backendName: 'cpu',\n    kernelFunc: tile\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvVGlsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLElBQUksRUFBd0IsTUFBTSx1QkFBdUIsQ0FBQztBQUd4RyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLFVBQVUsSUFBSSxDQUNoQixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUM1QixNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUVyRCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFRpbGUsIFRpbGVBdHRycywgVGlsZUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi9jcHVfdXRpbCc7XG5pbXBvcnQge3RpbGVJbXBsfSBmcm9tICcuL1RpbGVfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0aWxlKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFRpbGVJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLCBhdHRyczogVGlsZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge3JlcHN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndGlsZScpO1xuICBjb25zdCBvdXRCdWYgPSB0aWxlSW1wbChiYWNrZW5kLmJ1ZmZlclN5bmMoeCksIHJlcHMpO1xuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dEJ1Zi5zaGFwZSwgb3V0QnVmLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRpbGVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVGlsZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiB0aWxlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { TopK } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { topKImpl } from './TopK_impl';\nexport function topK(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { k, sorted } = attrs;\n    assertNotComplex(x, 'topk');\n    const xVals = backend.data.get(x.dataId).values;\n    const [allTopKVals, allTopKIndices] = topKImpl(xVals, x.shape, x.dtype, k, sorted);\n    return [\n        backend.makeTensorInfo(allTopKVals.shape, allTopKVals.dtype, allTopKVals.values),\n        backend.makeTensorInfo(allTopKIndices.shape, allTopKIndices.dtype, allTopKIndices.values)\n    ];\n}\nexport const topKConfig = {\n    kernelName: TopK,\n    backendName: 'cpu',\n    kernelFunc: topK\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wSy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC1jcHUvc3JjL2tlcm5lbHMvVG9wSy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXdELElBQUksRUFBb0MsTUFBTSx1QkFBdUIsQ0FBQztBQUdySSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUVyQyxNQUFNLFVBQVUsSUFBSSxDQUNoQixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUxQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFFNUIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQW9CLENBQUM7SUFDOUQsTUFBTSxDQUFDLFdBQVcsRUFBRSxjQUFjLENBQUMsR0FDL0IsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUF3QixFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVwRSxPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxFQUFFLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDN0QsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsY0FBYyxDQUFDLEtBQUssRUFBRSxjQUFjLENBQUMsS0FBSyxFQUFFLGNBQWMsQ0FBQyxNQUFNLENBQUM7S0FDdkUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxLQUFLO0lBQ2xCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTnVtZXJpY0RhdGFUeXBlLCBUZW5zb3JJbmZvLCBUb3BLLCBUb3BLQXR0cnMsIFRvcEtJbnB1dHMsIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRDUFV9IGZyb20gJy4uL2JhY2tlbmRfY3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vY3B1X3V0aWwnO1xuaW1wb3J0IHt0b3BLSW1wbH0gZnJvbSAnLi9Ub3BLX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gdG9wSyhcbiAgICBhcmdzOiB7aW5wdXRzOiBUb3BLSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFRvcEtBdHRyc30pOlxuICAgIFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2ssIHNvcnRlZH0gPSBhdHRycztcblxuICBhc3NlcnROb3RDb21wbGV4KHgsICd0b3BrJyk7XG5cbiAgY29uc3QgeFZhbHMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgW2FsbFRvcEtWYWxzLCBhbGxUb3BLSW5kaWNlc10gPVxuICAgICAgdG9wS0ltcGwoeFZhbHMsIHguc2hhcGUsIHguZHR5cGUgYXMgTnVtZXJpY0RhdGFUeXBlLCBrLCBzb3J0ZWQpO1xuXG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgYWxsVG9wS1ZhbHMuc2hhcGUsIGFsbFRvcEtWYWxzLmR0eXBlLCBhbGxUb3BLVmFscy52YWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIGFsbFRvcEtJbmRpY2VzLnNoYXBlLCBhbGxUb3BLSW5kaWNlcy5kdHlwZSwgYWxsVG9wS0luZGljZXMudmFsdWVzKVxuICBdO1xufVxuXG5leHBvcnQgY29uc3QgdG9wS0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUb3BLLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHRvcEsgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transform, util } from '@tensorflow/tfjs-core';\nexport function transform(args) {\n    const { inputs, attrs, backend } = args;\n    const { image, transforms } = inputs;\n    const { interpolation, fillMode, fillValue, outputShape } = attrs;\n    const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n    const [outHeight, outWidth] = outputShape != null ? outputShape : [imageHeight, imageWidth];\n    const outShape = [batch, outHeight, outWidth, numChannels];\n    const inStrides = util.computeStrides(image.shape);\n    const batchInStride = inStrides[0];\n    const rowInStride = inStrides[1];\n    const colInStride = inStrides[2];\n    const outStrides = util.computeStrides(outShape);\n    const batchOutStride = outStrides[0];\n    const rowOutStride = outStrides[1];\n    const colOutStride = outStrides[2];\n    const outVals = util.getTypedArrayFromDType(image.dtype, util.sizeFromShape(outShape));\n    outVals.fill(fillValue);\n    const imageVals = backend.data.get(image.dataId).values;\n    const transformVals = backend.data.get(transforms.dataId).values;\n    // Ref TF implementation:\n    // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/image/image_ops.h\n    for (let b = 0; b < batch; ++b) {\n        const transform = transforms.shape[0] === 1 ?\n            transformVals :\n            transformVals.subarray(b * 8, b * 8 + 8);\n        for (let outY = 0; outY < outHeight; ++outY) {\n            for (let outX = 0; outX < outWidth; ++outX) {\n                for (let channel = 0; channel < numChannels; ++channel) {\n                    let val;\n                    const projection = transform[6] * outX + transform[7] * outY + 1;\n                    if (projection === 0) {\n                        // Return the fill value for infinite coordinates,\n                        // which are outside the input image\n                        continue;\n                    }\n                    const inX = (transform[0] * outX + transform[1] * outY + transform[2]) /\n                        projection;\n                    const inY = (transform[3] * outX + transform[4] * outY + transform[5]) /\n                        projection;\n                    const x = mapCoord(inX, imageWidth, fillMode);\n                    const y = mapCoord(inY, imageHeight, fillMode);\n                    switch (interpolation) {\n                        case 'nearest':\n                            val = nearestInterpolation(imageVals, imageHeight, imageWidth, batchInStride, rowInStride, colInStride, b, y, x, channel, fillValue);\n                            break;\n                        case 'bilinear':\n                            val = bilinearInterpolation(imageVals, imageHeight, imageWidth, batchInStride, rowInStride, colInStride, b, y, x, channel, fillValue);\n                            break;\n                        default:\n                            throw new Error(`Error in Transform: Expect 'nearest' or ` +\n                                `'bilinear', but got ${interpolation}`);\n                    }\n                    const ind = b * batchOutStride + outY * rowOutStride +\n                        outX * colOutStride + channel;\n                    outVals[ind] = val;\n                }\n            }\n        }\n        return backend.makeTensorInfo(outShape, image.dtype, outVals);\n    }\n    const dataId = backend.write(outVals, outShape, image.dtype);\n    return { dataId, shape: image.shape, dtype: image.dtype };\n}\nexport const transformConfig = {\n    kernelName: Transform,\n    backendName: 'cpu',\n    kernelFunc: transform\n};\nfunction mapCoord(outCoord, len, mode) {\n    switch (mode) {\n        case 'reflect':\n            return mapCoordReflect(outCoord, len);\n        case 'wrap':\n            return mapCoordWrap(outCoord, len);\n        case 'nearest':\n            return mapCoordNearest(outCoord, len);\n        case 'constant':\n        default:\n            return mapCoordConstant(outCoord, len);\n    }\n}\nfunction mapCoordReflect(outCoord, len) {\n    // Reflect [abcd] to [dcba|abcd|dcba].\n    let inCoord = outCoord;\n    if (inCoord < 0) {\n        if (len <= 1) {\n            inCoord = 0;\n        }\n        else {\n            const sz2 = 2 * len;\n            if (inCoord < sz2) {\n                inCoord = sz2 * Math.trunc(-inCoord / sz2) + inCoord;\n            }\n            inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1;\n        }\n    }\n    else if (inCoord > len - 1) {\n        if (len <= 1) {\n            inCoord = 0;\n        }\n        else {\n            const sz2 = 2 * len;\n            inCoord -= sz2 * Math.trunc(inCoord / sz2);\n            if (inCoord >= len) {\n                inCoord = sz2 - inCoord - 1;\n            }\n        }\n    }\n    // clamp is necessary because when outCoord = 3.5 and len = 4,\n    // inCoord = 3.5 and will be rounded to 4 in nearest interpolation.\n    return util.clamp(0, inCoord, len - 1);\n}\nfunction mapCoordWrap(outCoord, len) {\n    // Wrap [abcd] to [abcd|abcd|abcd].\n    let inCoord = outCoord;\n    if (inCoord < 0) {\n        if (len <= 1) {\n            inCoord = 0;\n        }\n        else {\n            const sz = len - 1;\n            inCoord += len * (Math.trunc(-inCoord / sz) + 1);\n        }\n    }\n    else if (inCoord > len - 1) {\n        if (len <= 1) {\n            inCoord = 0;\n        }\n        else {\n            const sz = len - 1;\n            inCoord -= len * Math.trunc(inCoord / sz);\n        }\n    }\n    // clamp is necessary because when outCoord = -0.5 and len = 4,\n    // inCoord = 3.5 and will be rounded to 4 in nearest interpolation.\n    return util.clamp(0, inCoord, len - 1);\n}\nfunction mapCoordConstant(outCoord, len) {\n    return outCoord;\n}\nfunction mapCoordNearest(outCoord, len) {\n    return util.clamp(0, outCoord, len - 1);\n}\nfunction readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, y, x, channel, fillValue) {\n    const ind = batch * batchStride + y * rowStride + x * colStride + channel;\n    if (0 <= y && y < imageHeight && 0 <= x && x < imageWidth) {\n        return imageVals[ind];\n    }\n    else {\n        return fillValue;\n    }\n}\nfunction nearestInterpolation(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, y, x, channel, fillValue) {\n    const $y = Math.round(y);\n    const $x = Math.round(x);\n    return readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, $y, $x, channel, fillValue);\n}\nfunction bilinearInterpolation(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, y, x, channel, fillValue) {\n    const yFloor = Math.floor(y);\n    const xFloor = Math.floor(x);\n    const yCeil = yFloor + 1;\n    const xCeil = xFloor + 1;\n    // f(x, yFloor) = (xCeil - x) / (xCeil - xFloor) * f(xFloor, yFloor)\n    //               + (x - xFloor) / (xCeil - xFloor) * f(xCeil, yFloor)\n    const valueYFloor = (xCeil - x) *\n        readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, yFloor, xFloor, channel, fillValue) +\n        (x - xFloor) *\n            readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, yFloor, xCeil, channel, fillValue);\n    // f(x, yCeil) = (xCeil - x) / (xCeil - xFloor) * f(xFloor, yCeil)\n    //             + (x - xFloor) / (xCeil - xFloor) * f(xCeil, yCeil)\n    const valueYCeil = (xCeil - x) *\n        readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, yCeil, xFloor, channel, fillValue) +\n        (x - xFloor) *\n            readWithFillValue(imageVals, imageHeight, imageWidth, batchStride, rowStride, colStride, batch, yCeil, xCeil, channel, fillValue);\n    // f(x, y) = (yCeil - y) / (yCeil - yFloor) * f(x, yFloor)\n    //         + (y - yFloor) / (yCeil - yFloor) * f(x, yCeil)\n    return (yCeil - y) * valueYFloor + (y - yFloor) * valueYCeil;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9UcmFuc2Zvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF3RCxTQUFTLEVBQStDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSTFKLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEtBQUssRUFBRSxVQUFVLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkMsTUFBTSxFQUFDLGFBQWEsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVoRSxNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztJQUNsRSxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUN2QixXQUFXLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFM0QsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbkQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENB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RSxTQUFTLEVBQzFELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDO1FBQzVELENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQztZQUNSLGlCQUFpQixDQUNiLFNBQVMsRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQzFELFNBQVMsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDaEUsMERBQTBEO0lBQzFELDBEQUEwRDtJQUMxRCxPQUFPLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsR0FBRyxVQUFVLENBQUM7QUFDL0QsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE51bWVyaWNEYXRhVHlwZSwgVGVuc29ySW5mbywgVHJhbnNmb3JtLCBUcmFuc2Zvcm1BdHRycywgVHJhbnNmb3JtSW5wdXRzLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc2Zvcm0oYXJnczoge1xuICBpbnB1dHM6IFRyYW5zZm9ybUlucHV0cyxcbiAgYXR0cnM6IFRyYW5zZm9ybUF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZENQVVxufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2UsIHRyYW5zZm9ybXN9ID0gaW5wdXRzO1xuICBjb25zdCB7aW50ZXJwb2xhdGlvbiwgZmlsbE1vZGUsIGZpbGxWYWx1ZSwgb3V0cHV0U2hhcGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgW2JhdGNoLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgbnVtQ2hhbm5lbHNdID0gaW1hZ2Uuc2hhcGU7XG4gIGNvbnN0IFtvdXRIZWlnaHQsIG91dFdpZHRoXSA9XG4gICAgICBvdXRwdXRTaGFwZSAhPSBudWxsID8gb3V0cHV0U2hhcGUgOiBbaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGhdO1xuICBjb25zdCBvdXRTaGFwZSA9IFtiYXRjaCwgb3V0SGVpZ2h0LCBvdXRXaWR0aCwgbnVtQ2hhbm5lbHNdO1xuXG4gIGNvbnN0IGluU3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoaW1hZ2Uuc2hhcGUpO1xuICBjb25zdCBiYXRjaEluU3RyaWRlID0gaW5TdHJpZGVzWzBdO1xuICBjb25zdCByb3dJblN0cmlkZSA9IGluU3RyaWRlc1sxXTtcbiAgY29uc3QgY29sSW5TdHJpZGUgPSBpblN0cmlkZXNbMl07XG5cbiAgY29uc3Qgb3V0U3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMob3V0U2hhcGUpO1xuICBjb25zdCBiYXRjaE91dFN0cmlkZSA9IG91dFN0cmlkZXNbMF07XG4gIGNvbnN0IHJvd091dFN0cmlkZSA9IG91dFN0cmlkZXNbMV07XG4gIGNvbnN0IGNvbE91dFN0cmlkZSA9IG91dFN0cmlkZXNbMl07XG5cbiAgY29uc3Qgb3V0VmFscyA9IHV0aWwuZ2V0VHlwZWRBcnJheUZyb21EVHlwZShcbiAgICAgIGltYWdlLmR0eXBlIGFzIE51bWVyaWNEYXRhVHlwZSwgdXRpbC5zaXplRnJvbVNoYXBlKG91dFNoYXBlKSk7XG5cbiAgb3V0VmFscy5maWxsKGZpbGxWYWx1ZSk7XG5cbiAgY29uc3QgaW1hZ2VWYWxzID0gYmFja2VuZC5kYXRhLmdldChpbWFnZS5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuICBjb25zdCB0cmFuc2Zvcm1WYWxzID1cbiAgICAgIGJhY2tlbmQuZGF0YS5nZXQodHJhbnNmb3Jtcy5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5O1xuXG4gIC8vIFJlZiBURiBpbXBsZW1lbnRhdGlvbjpcbiAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUva2VybmVscy9pbWFnZS9pbWFnZV9vcHMuaFxuICBmb3IgKGxldCBiID0gMDsgYiA8IGJhdGNoOyArK2IpIHtcbiAgICBjb25zdCB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1zLnNoYXBlWzBdID09PSAxID9cbiAgICAgICAgdHJhbnNmb3JtVmFscyA6XG4gICAgICAgIHRyYW5zZm9ybVZhbHMuc3ViYXJyYXkoYiAqIDgsIGIgKiA4ICsgOCk7XG5cbiAgICBmb3IgKGxldCBvdXRZID0gMDsgb3V0WSA8IG91dEhlaWdodDsgKytvdXRZKSB7XG4gICAgICBmb3IgKGxldCBvdXRYID0gMDsgb3V0WCA8IG91dFdpZHRoOyArK291dFgpIHtcbiAgICAgICAgZm9yIChsZXQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBudW1DaGFubmVsczsgKytjaGFubmVsKSB7XG4gICAgICAgICAgbGV0IHZhbDtcblxuICAgICAgICAgIGNvbnN0IHByb2plY3Rpb24gPSB0cmFuc2Zvcm1bNl0gKiBvdXRYICsgdHJhbnNmb3JtWzddICogb3V0WSArIDE7XG5cbiAgICAgICAgICBpZiAocHJvamVjdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBmaWxsIHZhbHVlIGZvciBpbmZpbml0ZSBjb29yZGluYXRlcyxcbiAgICAgICAgICAgIC8vIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBpbnB1dCBpbWFnZVxuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgaW5YID1cbiAgICAgICAgICAgICAgKHRyYW5zZm9ybVswXSAqIG91dFggKyB0cmFuc2Zvcm1bMV0gKiBvdXRZICsgdHJhbnNmb3JtWzJdKSAvXG4gICAgICAgICAgICAgIHByb2plY3Rpb247XG4gICAgICAgICAgY29uc3QgaW5ZID1cbiAgICAgICAgICAgICAgKHRyYW5zZm9ybVszXSAqIG91dFggKyB0cmFuc2Zvcm1bNF0gKiBvdXRZICsgdHJhbnNmb3JtWzVdKSAvXG4gICAgICAgICAgICAgIHByb2plY3Rpb247XG5cbiAgICAgICAgICBjb25zdCB4ID0gbWFwQ29vcmQoaW5YLCBpbWFnZVdpZHRoLCBmaWxsTW9kZSk7XG4gICAgICAgICAgY29uc3QgeSA9IG1hcENvb3JkKGluWSwgaW1hZ2VIZWlnaHQsIGZpbGxNb2RlKTtcblxuICAgICAgICAgIHN3aXRjaCAoaW50ZXJwb2xhdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnbmVhcmVzdCc6XG4gICAgICAgICAgICAgIHZhbCA9IG5lYXJlc3RJbnRlcnBvbGF0aW9uKFxuICAgICAgICAgICAgICAgICAgaW1hZ2VWYWxzLCBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgYmF0Y2hJblN0cmlkZSxcbiAgICAgICAgICAgICAgICAgIHJvd0luU3RyaWRlLCBjb2xJblN0cmlkZSwgYiwgeSwgeCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdiaWxpbmVhcic6XG4gICAgICAgICAgICAgIHZhbCA9IGJpbGluZWFySW50ZXJwb2xhdGlvbihcbiAgICAgICAgICAgICAgICAgIGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoSW5TdHJpZGUsXG4gICAgICAgICAgICAgICAgICByb3dJblN0cmlkZSwgY29sSW5TdHJpZGUsIGIsIHksIHgsIGNoYW5uZWwsIGZpbGxWYWx1ZSk7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgICAgICAgYEVycm9yIGluIFRyYW5zZm9ybTogRXhwZWN0ICduZWFyZXN0JyBvciBgICtcbiAgICAgICAgICAgICAgICAgIGAnYmlsaW5lYXInLCBidXQgZ290ICR7aW50ZXJwb2xhdGlvbn1gKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbmQgPVxuICAgICAgICAgICAgICBiICogYmF0Y2hPdXRTdHJpZGUgKyBvdXRZICogcm93T3V0U3RyaWRlICtcbiAgICAgICAgICAgICAgb3V0WCAqIGNvbE91dFN0cmlkZSArIGNoYW5uZWw7XG5cbiAgICAgICAgICBvdXRWYWxzW2luZF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgaW1hZ2UuZHR5cGUsIG91dFZhbHMpO1xuICB9XG5cbiAgY29uc3QgZGF0YUlkID0gYmFja2VuZC53cml0ZShvdXRWYWxzLCBvdXRTaGFwZSwgaW1hZ2UuZHR5cGUpO1xuICByZXR1cm4ge2RhdGFJZCwgc2hhcGU6IGltYWdlLnNoYXBlLCBkdHlwZTogaW1hZ2UuZHR5cGV9O1xufVxuXG5leHBvcnQgY29uc3QgdHJhbnNmb3JtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRyYW5zZm9ybSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcblxuZnVuY3Rpb24gbWFwQ29vcmQoXG4gICAgb3V0Q29vcmQ6IG51bWJlciwgbGVuOiBudW1iZXIsXG4gICAgbW9kZTogJ2NvbnN0YW50J3wncmVmbGVjdCd8J3dyYXAnfCduZWFyZXN0Jykge1xuICBzd2l0Y2ggKG1vZGUpIHtcbiAgICBjYXNlICdyZWZsZWN0JzpcbiAgICAgIHJldHVybiBtYXBDb29yZFJlZmxlY3Qob3V0Q29vcmQsIGxlbik7XG4gICAgY2FzZSAnd3JhcCc6XG4gICAgICByZXR1cm4gbWFwQ29vcmRXcmFwKG91dENvb3JkLCBsZW4pO1xuICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgcmV0dXJuIG1hcENvb3JkTmVhcmVzdChvdXRDb29yZCwgbGVuKTtcbiAgICBjYXNlICdjb25zdGFudCc6XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBtYXBDb29yZENvbnN0YW50KG91dENvb3JkLCBsZW4pO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1hcENvb3JkUmVmbGVjdChvdXRDb29yZDogbnVtYmVyLCBsZW46IG51bWJlcik6IG51bWJlciB7XG4gIC8vIFJlZmxlY3QgW2FiY2RdIHRvIFtkY2JhfGFiY2R8ZGNiYV0uXG4gIGxldCBpbkNvb3JkID0gb3V0Q29vcmQ7XG4gIGlmIChpbkNvb3JkIDwgMCkge1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgaW5Db29yZCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN6MiA9IDIgKiBsZW47XG4gICAgICBpZiAoaW5Db29yZCA8IHN6Mikge1xuICAgICAgICBpbkNvb3JkID0gc3oyICogTWF0aC50cnVuYygtaW5Db29yZCAvIHN6MikgKyBpbkNvb3JkO1xuICAgICAgfVxuICAgICAgaW5Db29yZCA9IGluQ29vcmQgPCAtbGVuID8gaW5Db29yZCArIHN6MiA6IC1pbkNvb3JkIC0gMTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoaW5Db29yZCA+IGxlbiAtIDEpIHtcbiAgICBpZiAobGVuIDw9IDEpIHtcbiAgICAgIGluQ29vcmQgPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzejIgPSAyICogbGVuO1xuICAgICAgaW5Db29yZCAtPSBzejIgKiBNYXRoLnRydW5jKGluQ29vcmQgLyBzejIpO1xuICAgICAgaWYgKGluQ29vcmQgPj0gbGVuKSB7XG4gICAgICAgIGluQ29vcmQgPSBzejIgLSBpbkNvb3JkIC0gMTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgLy8gY2xhbXAgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2hlbiBvdXRDb29yZCA9IDMuNSBhbmQgbGVuID0gNCxcbiAgLy8gaW5Db29yZCA9IDMuNSBhbmQgd2lsbCBiZSByb3VuZGVkIHRvIDQgaW4gbmVhcmVzdCBpbnRlcnBvbGF0aW9uLlxuICByZXR1cm4gdXRpbC5jbGFtcCgwLCBpbkNvb3JkLCBsZW4gLSAxKTtcbn1cblxuZnVuY3Rpb24gbWFwQ29vcmRXcmFwKG91dENvb3JkOiBudW1iZXIsIGxlbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gV3JhcCBbYWJjZF0gdG8gW2FiY2R8YWJjZHxhYmNkXS5cbiAgbGV0IGluQ29vcmQgPSBvdXRDb29yZDtcbiAgaWYgKGluQ29vcmQgPCAwKSB7XG4gICAgaWYgKGxlbiA8PSAxKSB7XG4gICAgICBpbkNvb3JkID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ogPSBsZW4gLSAxO1xuICAgICAgaW5Db29yZCArPSBsZW4gKiAoTWF0aC50cnVuYygtaW5Db29yZCAvIHN6KSArIDEpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMSkge1xuICAgIGlmIChsZW4gPD0gMSkge1xuICAgICAgaW5Db29yZCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN6ID0gbGVuIC0gMTtcbiAgICAgIGluQ29vcmQgLT0gbGVuICogTWF0aC50cnVuYyhpbkNvb3JkIC8gc3opO1xuICAgIH1cbiAgfVxuICAvLyBjbGFtcCBpcyBuZWNlc3NhcnkgYmVjYXVzZSB3aGVuIG91dENvb3JkID0gLTAuNSBhbmQgbGVuID0gNCxcbiAgLy8gaW5Db29yZCA9IDMuNSBhbmQgd2lsbCBiZSByb3VuZGVkIHRvIDQgaW4gbmVhcmVzdCBpbnRlcnBvbGF0aW9uLlxuICByZXR1cm4gdXRpbC5jbGFtcCgwLCBpbkNvb3JkLCBsZW4gLSAxKTtcbn1cblxuZnVuY3Rpb24gbWFwQ29vcmRDb25zdGFudChvdXRDb29yZDogbnVtYmVyLCBsZW46IG51bWJlcik6IG51bWJlciB7XG4gIHJldHVybiBvdXRDb29yZDtcbn1cblxuZnVuY3Rpb24gbWFwQ29vcmROZWFyZXN0KG91dENvb3JkOiBudW1iZXIsIGxlbjogbnVtYmVyKTogbnVtYmVyIHtcbiAgcmV0dXJuIHV0aWwuY2xhbXAoMCwgb3V0Q29vcmQsIGxlbiAtIDEpO1xufVxuXG5mdW5jdGlvbiByZWFkV2l0aEZpbGxWYWx1ZShcbiAgICBpbWFnZVZhbHM6IFR5cGVkQXJyYXksIGltYWdlSGVpZ2h0OiBudW1iZXIsIGltYWdlV2lkdGg6IG51bWJlcixcbiAgICBiYXRjaFN0cmlkZTogbnVtYmVyLCByb3dTdHJpZGU6IG51bWJlciwgY29sU3RyaWRlOiBudW1iZXIsIGJhdGNoOiBudW1iZXIsXG4gICAgeTogbnVtYmVyLCB4OiBudW1iZXIsIGNoYW5uZWw6IG51bWJlciwgZmlsbFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCBpbmQgPSBiYXRjaCAqIGJhdGNoU3RyaWRlICsgeSAqIHJvd1N0cmlkZSArIHggKiBjb2xTdHJpZGUgKyBjaGFubmVsO1xuICBpZiAoMCA8PSB5ICYmIHkgPCBpbWFnZUhlaWdodCAmJiAwIDw9IHggJiYgeCA8IGltYWdlV2lkdGgpIHtcbiAgICByZXR1cm4gaW1hZ2VWYWxzW2luZF07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbGxWYWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBuZWFyZXN0SW50ZXJwb2xhdGlvbihcbiAgICBpbWFnZVZhbHM6IFR5cGVkQXJyYXksIGltYWdlSGVpZ2h0OiBudW1iZXIsIGltYWdlV2lkdGg6IG51bWJlcixcbiAgICBiYXRjaFN0cmlkZTogbnVtYmVyLCByb3dTdHJpZGU6IG51bWJlciwgY29sU3RyaWRlOiBudW1iZXIsIGJhdGNoOiBudW1iZXIsXG4gICAgeTogbnVtYmVyLCB4OiBudW1iZXIsIGNoYW5uZWw6IG51bWJlciwgZmlsbFZhbHVlOiBudW1iZXIpOiBudW1iZXIge1xuICBjb25zdCAkeSA9IE1hdGgucm91bmQoeSk7XG4gIGNvbnN0ICR4ID0gTWF0aC5yb3VuZCh4KTtcblxuICByZXR1cm4gcmVhZFdpdGhGaWxsVmFsdWUoXG4gICAgICBpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLCBjb2xTdHJpZGUsXG4gICAgICBiYXRjaCwgJHksICR4LCBjaGFubmVsLCBmaWxsVmFsdWUpO1xufVxuXG5mdW5jdGlvbiBiaWxpbmVhckludGVycG9sYXRpb24oXG4gICAgaW1hZ2VWYWxzOiBUeXBlZEFycmF5LCBpbWFnZUhlaWdodDogbnVtYmVyLCBpbWFnZVdpZHRoOiBudW1iZXIsXG4gICAgYmF0Y2hTdHJpZGU6IG51bWJlciwgcm93U3RyaWRlOiBudW1iZXIsIGNvbFN0cmlkZTogbnVtYmVyLCBiYXRjaDogbnVtYmVyLFxuICAgIHk6IG51bWJlciwgeDogbnVtYmVyLCBjaGFubmVsOiBudW1iZXIsIGZpbGxWYWx1ZTogbnVtYmVyKSB7XG4gIGNvbnN0IHlGbG9vciA9IE1hdGguZmxvb3IoeSk7XG4gIGNvbnN0IHhGbG9vciA9IE1hdGguZmxvb3IoeCk7XG4gIGNvbnN0IHlDZWlsID0geUZsb29yICsgMTtcbiAgY29uc3QgeENlaWwgPSB4Rmxvb3IgKyAxO1xuICAvLyBmKHgsIHlGbG9vcikgPSAoeENlaWwgLSB4KSAvICh4Q2VpbCAtIHhGbG9vcikgKiBmKHhGbG9vciwgeUZsb29yKVxuICAvLyAgICAgICAgICAgICAgICsgKHggLSB4Rmxvb3IpIC8gKHhDZWlsIC0geEZsb29yKSAqIGYoeENlaWwsIHlGbG9vcilcbiAgY29uc3QgdmFsdWVZRmxvb3IgPVxuICAgICAgKHhDZWlsIC0geCkgKlxuICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKFxuICAgICAgICAgICAgICBpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLFxuICAgICAgICAgICAgICBjb2xTdHJpZGUsIGJhdGNoLCB5Rmxvb3IsIHhGbG9vciwgY2hhbm5lbCwgZmlsbFZhbHVlKSArXG4gICAgICAoeCAtIHhGbG9vcikgKlxuICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKFxuICAgICAgICAgICAgICBpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLFxuICAgICAgICAgICAgICBjb2xTdHJpZGUsIGJhdGNoLCB5Rmxvb3IsIHhDZWlsLCBjaGFubmVsLCBmaWxsVmFsdWUpO1xuICAvLyBmKHgsIHlDZWlsKSA9ICh4Q2VpbCAtIHgpIC8gKHhDZWlsIC0geEZsb29yKSAqIGYoeEZsb29yLCB5Q2VpbClcbiAgLy8gICAgICAgICAgICAgKyAoeCAtIHhGbG9vcikgLyAoeENlaWwgLSB4Rmxvb3IpICogZih4Q2VpbCwgeUNlaWwpXG4gIGNvbnN0IHZhbHVlWUNlaWwgPVxuICAgICAgKHhDZWlsIC0geCkgKlxuICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKFxuICAgICAgICAgICAgICBpbWFnZVZhbHMsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBiYXRjaFN0cmlkZSwgcm93U3RyaWRlLFxuICAgICAgICAgICAgICBjb2xTdHJpZGUsIGJhdGNoLCB5Q2VpbCwgeEZsb29yLCBjaGFubmVsLCBmaWxsVmFsdWUpICtcbiAgICAgICh4IC0geEZsb29yKSAqXG4gICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoXG4gICAgICAgICAgICAgIGltYWdlVmFscywgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIGJhdGNoU3RyaWRlLCByb3dTdHJpZGUsXG4gICAgICAgICAgICAgIGNvbFN0cmlkZSwgYmF0Y2gsIHlDZWlsLCB4Q2VpbCwgY2hhbm5lbCwgZmlsbFZhbHVlKTtcbiAgLy8gZih4LCB5KSA9ICh5Q2VpbCAtIHkpIC8gKHlDZWlsIC0geUZsb29yKSAqIGYoeCwgeUZsb29yKVxuICAvLyAgICAgICAgICsgKHkgLSB5Rmxvb3IpIC8gKHlDZWlsIC0geUZsb29yKSAqIGYoeCwgeUNlaWwpXG4gIHJldHVybiAoeUNlaWwgLSB5KSAqIHZhbHVlWUZsb29yICsgKHkgLSB5Rmxvb3IpICogdmFsdWVZQ2VpbDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unique } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { uniqueImpl } from './Unique_impl';\nexport function unique(args) {\n    const { inputs, attrs, backend } = args;\n    const { axis } = attrs;\n    const { x } = inputs;\n    assertNotComplex(x, 'unique');\n    const values = backend.data.get(x.dataId).values;\n    const { outputValues, outputShape, indices } = uniqueImpl(values, axis, x.shape, x.dtype);\n    return [\n        backend.makeTensorInfo(outputShape, x.dtype, outputValues),\n        backend.makeTensorInfo([indices.length], 'int32', indices),\n    ];\n}\nexport const uniqueConfig = {\n    kernelName: Unique,\n    backendName: 'cpu',\n    kernelFunc: unique,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9VbmlxdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxNQUFNLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFHOUcsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTdDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsSUFBeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDckIsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFOUIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUNqRCxNQUFNLEVBQUMsWUFBWSxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUMsR0FDdEMsVUFBVSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDL0MsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQzFELE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQztLQUMzRCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLEtBQUs7SUFDbEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVW5pcXVlLCBVbmlxdWVBdHRycywgVW5pcXVlSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcblxuaW1wb3J0IHt1bmlxdWVJbXBsfSBmcm9tICcuL1VuaXF1ZV9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZShcbiAgICBhcmdzOiB7aW5wdXRzOiBVbmlxdWVJbnB1dHMsIGF0dHJzOiBVbmlxdWVBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRDUFV9KTpcbiAgICBUZW5zb3JJbmZvW10ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBhc3NlcnROb3RDb21wbGV4KHgsICd1bmlxdWUnKTtcblxuICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLmRhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXM7XG4gIGNvbnN0IHtvdXRwdXRWYWx1ZXMsIG91dHB1dFNoYXBlLCBpbmRpY2VzfSA9XG4gICAgICB1bmlxdWVJbXBsKHZhbHVlcywgYXhpcywgeC5zaGFwZSwgeC5kdHlwZSk7XG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXRTaGFwZSwgeC5kdHlwZSwgb3V0cHV0VmFsdWVzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtpbmRpY2VzLmxlbmd0aF0sICdpbnQzMicsIGluZGljZXMpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3QgdW5pcXVlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFVuaXF1ZSxcbiAgYmFja2VuZE5hbWU6ICdjcHUnLFxuICBrZXJuZWxGdW5jOiB1bmlxdWUgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unpack } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nexport function unpack(args) {\n    const { inputs, backend, attrs } = args;\n    const { value } = inputs;\n    let { axis } = attrs;\n    if (axis < 0) {\n        axis += value.shape.length;\n    }\n    const valueRank = value.shape.length;\n    const num = value.shape[axis];\n    const outShape = new Array(valueRank - 1);\n    let outIndex = 0;\n    for (let i = 0; i < valueRank; i++) {\n        if (i !== axis) {\n            outShape[outIndex++] = value.shape[i];\n        }\n    }\n    const begin = new Array(valueRank).fill(0);\n    const size = value.shape.slice();\n    size[axis] = 1;\n    const res = new Array(num);\n    for (let i = 0; i < res.length; i++) {\n        begin[axis] = i;\n        const tempRes = slice({ inputs: { x: value }, backend, attrs: { begin, size } });\n        res[i] = reshape({ inputs: { x: tempRes }, backend, attrs: { shape: outShape } });\n        backend.disposeIntermediateTensorInfo(tempRes);\n    }\n    return res;\n}\nexport const unpackConfig = {\n    kernelName: Unpack,\n    backendName: 'cpu',\n    kernelFunc: unpack\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5wYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9VbnBhY2sudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxNQUFNLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFHOUcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBRTlCLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQXlFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLElBQUksRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbkIsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ1osSUFBSSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0tBQzVCO0lBRUQsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFckMsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDcEQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbEMsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2QsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUN2QztLQUNGO0lBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNDLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUNmLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEIsTUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQzNFLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDNUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0tBQ2hEO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsS0FBSztJQUNsQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFVucGFjaywgVW5wYWNrQXR0cnMsIFVucGFja0lucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZENQVX0gZnJvbSAnLi4vYmFja2VuZF9jcHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnBhY2soXG4gICAgYXJnczoge2lucHV0czogVW5wYWNrSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZENQVSwgYXR0cnM6IFVucGFja0F0dHJzfSk6XG4gICAgVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3ZhbHVlfSA9IGlucHV0cztcbiAgbGV0IHtheGlzfSA9IGF0dHJzO1xuXG4gIGlmIChheGlzIDwgMCkge1xuICAgIGF4aXMgKz0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuICB9XG5cbiAgY29uc3QgdmFsdWVSYW5rID0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IG51bSA9IHZhbHVlLnNoYXBlW2F4aXNdO1xuICBjb25zdCBvdXRTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkodmFsdWVSYW5rIC0gMSk7XG4gIGxldCBvdXRJbmRleCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdmFsdWVSYW5rOyBpKyspIHtcbiAgICBpZiAoaSAhPT0gYXhpcykge1xuICAgICAgb3V0U2hhcGVbb3V0SW5kZXgrK10gPSB2YWx1ZS5zaGFwZVtpXTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh2YWx1ZVJhbmspLmZpbGwoMCk7XG4gIGNvbnN0IHNpemUgPSB2YWx1ZS5zaGFwZS5zbGljZSgpO1xuICBzaXplW2F4aXNdID0gMTtcbiAgY29uc3QgcmVzID0gbmV3IEFycmF5KG51bSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYmVnaW5bYXhpc10gPSBpO1xuICAgIGNvbnN0IHRlbXBSZXMgPSBzbGljZSh7aW5wdXRzOiB7eDogdmFsdWV9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luLCBzaXplfX0pO1xuICAgIHJlc1tpXSA9IHJlc2hhcGUoe2lucHV0czoge3g6IHRlbXBSZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbXBSZXMpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IHVucGFja0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBVbnBhY2ssXG4gIGJhY2tlbmROYW1lOiAnY3B1JyxcbiAga2VybmVsRnVuYzogdW5wYWNrIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { UnsortedSegmentSum, util } from '@tensorflow/tfjs-core';\nimport { assertNotComplex } from '../cpu_util';\nimport { cast } from './Cast';\nimport { equal } from './Equal';\nimport { expandDims } from './ExpandDims';\nimport { multiply } from './Multiply';\nimport { pack } from './Pack';\nimport { sum } from './Sum';\nexport function unsortedSegmentSum(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, segmentIds } = inputs;\n    const { numSegments } = attrs;\n    assertNotComplex(x, 'unsortedSegmentSum');\n    const xRank = x.shape.length;\n    const segmentIdsRank = segmentIds.shape.length;\n    const res = [];\n    const intermediates = [];\n    // Reshape the segment id's so that they can be broadcast with\n    // x. The new shape should be [segmentIds.shape, 1, ..., 1]\n    const numIters = xRank - segmentIdsRank;\n    let $segmentIds = segmentIds;\n    for (let i = 0; i < numIters; ++i) {\n        const expanded = expandDims({ inputs: { input: $segmentIds }, backend, attrs: { dim: i + 1 } });\n        $segmentIds = expanded;\n        intermediates.push(expanded);\n    }\n    for (let i = 0; i < numSegments; ++i) {\n        const scalarValue = util.createScalarValue(i, 'int32');\n        const segmentId = backend.makeTensorInfo([], 'int32', scalarValue);\n        const mask = equal({ inputs: { a: segmentId, b: $segmentIds }, backend });\n        const maskCasted = cast({ inputs: { x: mask }, backend, attrs: { dtype: 'float32' } });\n        const mul = multiply({ inputs: { a: maskCasted, b: x }, backend });\n        const sumTensorInfo = sum({ inputs: { x: mul }, backend, attrs: { axis: 0, keepDims: false } });\n        res.push(sumTensorInfo);\n        intermediates.push(segmentId);\n        intermediates.push(mask);\n        intermediates.push(maskCasted);\n        intermediates.push(mul);\n        intermediates.push(sumTensorInfo);\n    }\n    const result = pack({ inputs: res, backend, attrs: { axis: 0 } });\n    intermediates.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return result;\n}\nexport const unsortedSegmentSumConfig = {\n    kernelName: UnsortedSegmentSum,\n    backendName: 'cpu',\n    kernelFunc: unsortedSegmentSum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zb3J0ZWRTZWdtZW50U3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLWNwdS9zcmMva2VybmVscy9VbnNvcnRlZFNlZ21lbnRTdW0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUF1QyxrQkFBa0IsRUFBcUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzdDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBRTFCLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUlsQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLFVBQVUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUMsV0FBVyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTVCLGdCQUFnQixDQUFDLENBQUMsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0lBRTFDLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sY0FBYyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztJ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eXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVW5zb3J0ZWRTZWdtZW50U3VtLCBVbnNvcnRlZFNlZ21lbnRTdW1BdHRycywgVW5zb3J0ZWRTZWdtZW50U3VtSW5wdXRzLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kQ1BVfSBmcm9tICcuLi9iYWNrZW5kX2NwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL2NwdV91dGlsJztcbmltcG9ydCB7Y2FzdH0gZnJvbSAnLi9DYXN0JztcbmltcG9ydCB7ZXF1YWx9IGZyb20gJy4vRXF1YWwnO1xuaW1wb3J0IHtleHBhbmREaW1zfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuaW1wb3J0IHttdWx0aXBseX0gZnJvbSAnLi9NdWx0aXBseSc7XG5pbXBvcnQge3BhY2t9IGZyb20gJy4vUGFjayc7XG5pbXBvcnQge3N1bX0gZnJvbSAnLi9TdW0nO1xuXG5leHBvcnQgZnVuY3Rpb24gdW5zb3J0ZWRTZWdtZW50U3VtKGFyZ3M6IHtcbiAgaW5wdXRzOiBVbnNvcnRlZFNlZ21lbnRTdW1JbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kQ1BVLFxuICBhdHRyczogVW5zb3J0ZWRTZWdtZW50U3VtQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHNlZ21lbnRJZHN9ID0gaW5wdXRzO1xuICBjb25zdCB7bnVtU2VnbWVudHN9ID0gYXR0cnM7XG5cbiAgYXNzZXJ0Tm90Q29tcGxleCh4LCAndW5zb3J0ZWRTZWdtZW50U3VtJyk7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgc2VnbWVudElkc1JhbmsgPSBzZWdtZW50SWRzLnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgcmVzID0gW107XG4gIGNvbnN0IGludGVybWVkaWF0ZXM6IFRlbnNvckluZm9bXSA9IFtdO1xuXG4gIC8vIFJlc2hhcGUgdGhlIHNlZ21lbnQgaWQncyBzbyB0aGF0IHRoZXkgY2FuIGJlIGJyb2FkY2FzdCB3aXRoXG4gIC8vIHguIFRoZSBuZXcgc2hhcGUgc2hvdWxkIGJlIFtzZWdtZW50SWRzLnNoYXBlLCAxLCAuLi4sIDFdXG4gIGNvbnN0IG51bUl0ZXJzID0geFJhbmsgLSBzZWdtZW50SWRzUmFuaztcbiAgbGV0ICRzZWdtZW50SWRzID0gc2VnbWVudElkcztcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUl0ZXJzOyArK2kpIHtcbiAgICBjb25zdCBleHBhbmRlZCA9IGV4cGFuZERpbXMoXG4gICAgICAgIHtpbnB1dHM6IHtpbnB1dDogJHNlZ21lbnRJZHN9LCBiYWNrZW5kLCBhdHRyczoge2RpbTogaSArIDF9fSk7XG4gICAgJHNlZ21lbnRJZHMgPSBleHBhbmRlZDtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goZXhwYW5kZWQpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBudW1TZWdtZW50czsgKytpKSB7XG4gICAgY29uc3Qgc2NhbGFyVmFsdWUgPSB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGkgYXMge30gYXMgJ2ludDMyJywgJ2ludDMyJyk7XG4gICAgY29uc3Qgc2VnbWVudElkID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbXSwgJ2ludDMyJywgc2NhbGFyVmFsdWUpO1xuICAgIGNvbnN0IG1hc2sgPVxuICAgICAgICBlcXVhbCh7aW5wdXRzOiB7YTogc2VnbWVudElkLCBiOiAkc2VnbWVudElkc30sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICAgIGNvbnN0IG1hc2tDYXN0ZWQgPVxuICAgICAgICBjYXN0KHtpbnB1dHM6IHt4OiBtYXNrfSwgYmFja2VuZCwgYXR0cnM6IHtkdHlwZTogJ2Zsb2F0MzInfX0pO1xuICAgIGNvbnN0IG11bCA9XG4gICAgICAgIG11bHRpcGx5KHtpbnB1dHM6IHthOiBtYXNrQ2FzdGVkLCBiOiB4fSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgY29uc3Qgc3VtVGVuc29ySW5mbyA9XG4gICAgICAgIHN1bSh7aW5wdXRzOiB7eDogbXVsfSwgYmFja2VuZCwgYXR0cnM6IHtheGlzOiAwLCBrZWVwRGltczogZmFsc2V9fSk7XG4gICAgcmVzLnB1c2goc3VtVGVuc29ySW5mbyk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKHNlZ21lbnRJZCk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKG1hc2spO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChtYXNrQ2FzdGVkKTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2gobXVsKTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goc3VtVGVuc29ySW5mbyk7XG4gIH1cblxuICBjb25zdCByZXN1bHQgPSBwYWNrKHtpbnB1dHM6IHJlcywgYmFja2VuZCwgYXR0cnM6IHtheGlzOiAwfX0pO1xuXG4gIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVW5zb3J0ZWRTZWdtZW50U3VtLFxuICBiYWNrZW5kTmFtZTogJ2NwdScsXG4gIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// We explicitly import the modular kernels so they get registered in the\n// global registry when we compile the library. A modular build would replace\n// the contents of this file and import only the kernels that are needed.\nimport { registerKernel } from '@tensorflow/tfjs-core';\nimport { _fusedMatMulConfig } from './kernels/_FusedMatMul';\nimport { absConfig } from './kernels/Abs';\nimport { acosConfig } from './kernels/Acos';\nimport { acoshConfig } from './kernels/Acosh';\nimport { addConfig } from './kernels/Add';\nimport { addNConfig } from './kernels/AddN';\nimport { allConfig } from './kernels/All';\nimport { anyConfig } from './kernels/Any';\nimport { argMaxConfig } from './kernels/ArgMax';\nimport { argMinConfig } from './kernels/ArgMin';\nimport { asinConfig } from './kernels/Asin';\nimport { asinhConfig } from './kernels/Asinh';\nimport { atanConfig } from './kernels/Atan';\nimport { atan2Config } from './kernels/Atan2';\nimport { atanhConfig } from './kernels/Atanh';\nimport { avgPoolConfig } from './kernels/AvgPool';\nimport { avgPool3DConfig } from './kernels/AvgPool3D';\nimport { avgPool3DGradConfig } from './kernels/AvgPool3DGrad';\nimport { avgPoolGradConfig } from './kernels/AvgPoolGrad';\nimport { batchMatMulConfig } from './kernels/BatchMatMul';\nimport { batchNormConfig } from './kernels/BatchNorm';\nimport { batchToSpaceNDConfig } from './kernels/BatchToSpaceND';\nimport { bincountConfig } from './kernels/Bincount';\nimport { broadcastArgsConfig } from './kernels/BroadcastArgs';\nimport { castConfig } from './kernels/Cast';\nimport { ceilConfig } from './kernels/Ceil';\nimport { clipByValueConfig } from './kernels/ClipByValue';\nimport { complexConfig } from './kernels/Complex';\nimport { complexAbsConfig } from './kernels/ComplexAbs';\nimport { concatConfig } from './kernels/Concat';\nimport { conv2DConfig } from './kernels/Conv2D';\nimport { conv2DBackpropFilterConfig } from './kernels/Conv2DBackpropFilter';\nimport { conv2DBackpropInputConfig } from './kernels/Conv2DBackpropInput';\nimport { conv3DConfig } from './kernels/Conv3D';\nimport { conv3DBackpropFilterV2Config } from './kernels/Conv3DBackpropFilterV2';\nimport { conv3DBackpropInputV2Config } from './kernels/Conv3DBackpropInputV2';\nimport { cosConfig } from './kernels/Cos';\nimport { coshConfig } from './kernels/Cosh';\nimport { cropAndResizeConfig } from './kernels/CropAndResize';\nimport { cumprodConfig } from './kernels/Cumprod';\nimport { cumsumConfig } from './kernels/Cumsum';\nimport { denseBincountConfig } from './kernels/DenseBincount';\nimport { depthToSpaceConfig } from './kernels/DepthToSpace';\nimport { depthwiseConv2dNativeConfig } from './kernels/DepthwiseConv2dNative';\nimport { depthwiseConv2dNativeBackpropFilterConfig } from './kernels/DepthwiseConv2dNativeBackpropFilter';\nimport { depthwiseConv2dNativeBackpropInputConfig } from './kernels/DepthwiseConv2dNativeBackpropInput';\nimport { diagConfig } from './kernels/Diag';\nimport { dilation2DConfig } from './kernels/Dilation2D';\nimport { dilation2DBackpropFilterConfig } from './kernels/Dilation2DBackpropFilter';\nimport { dilation2DBackpropInputConfig } from './kernels/Dilation2DBackpropInput';\nimport { einsumConfig } from './kernels/Einsum';\nimport { eluConfig } from './kernels/Elu';\nimport { eluGradConfig } from './kernels/EluGrad';\nimport { equalConfig } from './kernels/Equal';\nimport { erfConfig } from './kernels/Erf';\nimport { expConfig } from './kernels/Exp';\nimport { expandDimsConfig } from './kernels/ExpandDims';\nimport { expm1Config } from './kernels/Expm1';\nimport { fftConfig } from './kernels/FFT';\nimport { fillConfig } from './kernels/Fill';\nimport { flipLeftRightConfig } from './kernels/FlipLeftRight';\nimport { floorConfig } from './kernels/Floor';\nimport { floorDivConfig } from './kernels/FloorDiv';\nimport { fusedConv2DConfig } from './kernels/FusedConv2D';\nimport { fusedDepthwiseConv2DConfig } from './kernels/FusedDepthwiseConv2D';\nimport { gatherNdConfig } from './kernels/GatherNd';\nimport { gatherV2Config } from './kernels/GatherV2';\nimport { greaterConfig } from './kernels/Greater';\nimport { greaterEqualConfig } from './kernels/GreaterEqual';\nimport { identityConfig } from './kernels/Identity';\nimport { ifftConfig } from './kernels/IFFT';\nimport { imagConfig } from './kernels/Imag';\nimport { isFiniteConfig } from './kernels/IsFinite';\nimport { isInfConfig } from './kernels/IsInf';\nimport { isNaNConfig } from './kernels/IsNaN';\nimport { leakyReluConfig } from './kernels/LeakyRelu';\nimport { lessConfig } from './kernels/Less';\nimport { lessEqualConfig } from './kernels/LessEqual';\nimport { linSpaceConfig } from './kernels/LinSpace';\nimport { logConfig } from './kernels/Log';\nimport { log1pConfig } from './kernels/Log1p';\nimport { logicalAndConfig } from './kernels/LogicalAnd';\nimport { logicalNotConfig } from './kernels/LogicalNot';\nimport { logicalOrConfig } from './kernels/LogicalOr';\nimport { LRNConfig } from './kernels/LRN';\nimport { LRNGradConfig } from './kernels/LRNGrad';\nimport { maxConfig } from './kernels/Max';\nimport { maximumConfig } from './kernels/Maximum';\nimport { maxPoolConfig } from './kernels/MaxPool';\nimport { maxPool3DConfig } from './kernels/MaxPool3D';\nimport { maxPool3DGradConfig } from './kernels/MaxPool3DGrad';\nimport { maxPoolGradConfig } from './kernels/MaxPoolGrad';\nimport { maxPoolWithArgmaxConfig } from './kernels/MaxPoolWithArgmax';\nimport { meanConfig } from './kernels/Mean';\nimport { minConfig } from './kernels/Min';\nimport { minimumConfig } from './kernels/Minimum';\nimport { mirrorPadConfig } from './kernels/MirrorPad';\nimport { modConfig } from './kernels/Mod';\nimport { multinomialConfig } from './kernels/Multinomial';\nimport { multiplyConfig } from './kernels/Multiply';\nimport { negConfig } from './kernels/Neg';\nimport { nonMaxSuppressionV3Config } from './kernels/NonMaxSuppressionV3';\nimport { nonMaxSuppressionV4Config } from './kernels/NonMaxSuppressionV4';\nimport { nonMaxSuppressionV5Config } from './kernels/NonMaxSuppressionV5';\nimport { notEqualConfig } from './kernels/NotEqual';\nimport { oneHotConfig } from './kernels/OneHot';\nimport { onesLikeConfig } from './kernels/OnesLike';\nimport { packConfig } from './kernels/Pack';\nimport { padV2Config } from './kernels/PadV2';\nimport { powConfig } from './kernels/Pow';\nimport { preluConfig } from './kernels/Prelu';\nimport { prodConfig } from './kernels/Prod';\nimport { raggedGatherConfig } from './kernels/RaggedGather';\nimport { raggedTensorToTensorConfig } from './kernels/RaggedTensorToTensor';\nimport { rangeConfig } from './kernels/Range';\nimport { realConfig } from './kernels/Real';\nimport { realDivConfig } from './kernels/RealDiv';\nimport { reciprocalConfig } from './kernels/Reciprocal';\nimport { reluConfig } from './kernels/Relu';\nimport { relu6Config } from './kernels/Relu6';\nimport { reshapeConfig } from './kernels/Reshape';\nimport { resizeBilinearConfig } from './kernels/ResizeBilinear';\nimport { resizeBilinearGradConfig } from './kernels/ResizeBilinearGrad';\nimport { resizeNearestNeighborConfig } from './kernels/ResizeNearestNeighbor';\nimport { resizeNearestNeighborGradConfig } from './kernels/ResizeNearestNeighborGrad';\nimport { reverseConfig } from './kernels/Reverse';\nimport { rotateWithOffsetConfig } from './kernels/RotateWithOffset';\nimport { roundConfig } from './kernels/Round';\nimport { rsqrtConfig } from './kernels/Rsqrt';\nimport { scatterNdConfig } from './kernels/ScatterNd';\nimport { searchSortedConfig } from './kernels/SearchSorted';\nimport { selectConfig } from './kernels/Select';\nimport { seluConfig } from './kernels/Selu';\nimport { sigmoidConfig } from './kernels/Sigmoid';\nimport { signConfig } from './kernels/Sign';\nimport { sinConfig } from './kernels/Sin';\nimport { sinhConfig } from './kernels/Sinh';\nimport { sliceConfig } from './kernels/Slice';\nimport { softmaxConfig } from './kernels/Softmax';\nimport { softplusConfig } from './kernels/Softplus';\nimport { spaceToBatchNDConfig } from './kernels/SpaceToBatchND';\nimport { sparseFillEmptyRowsConfig } from './kernels/SparseFillEmptyRows';\nimport { sparseReshapeConfig } from './kernels/SparseReshape';\nimport { sparseSegmentMeanConfig } from './kernels/SparseSegmentMean';\nimport { sparseSegmentSumConfig } from './kernels/SparseSegmentSum';\nimport { sparseToDenseConfig } from './kernels/SparseToDense';\nimport { splitVConfig } from './kernels/SplitV';\nimport { sqrtConfig } from './kernels/Sqrt';\nimport { squareConfig } from './kernels/Square';\nimport { squaredDifferenceConfig } from './kernels/SquaredDifference';\nimport { stepConfig } from './kernels/Step';\nimport { stridedSliceConfig } from './kernels/StridedSlice';\nimport { stringNGramsConfig } from './kernels/StringNGrams';\nimport { stringSplitConfig } from './kernels/StringSplit';\nimport { stringToHashBucketFastConfig } from './kernels/StringToHashBucketFast';\nimport { subConfig } from './kernels/Sub';\nimport { sumConfig } from './kernels/Sum';\nimport { tanConfig } from './kernels/Tan';\nimport { tanhConfig } from './kernels/Tanh';\nimport { tileConfig } from './kernels/Tile';\nimport { topKConfig } from './kernels/TopK';\nimport { transformConfig } from './kernels/Transform';\nimport { transposeConfig } from './kernels/Transpose';\nimport { uniqueConfig } from './kernels/Unique';\nimport { unpackConfig } from './kernels/Unpack';\nimport { unsortedSegmentSumConfig } from './kernels/UnsortedSegmentSum';\nimport { zerosLikeConfig } from './kernels/ZerosLike';\n// List all kernel configs here\nconst kernelConfigs = [\n    _fusedMatMulConfig,\n    absConfig,\n    acosConfig,\n    acoshConfig,\n    addConfig,\n    addNConfig,\n    allConfig,\n    anyConfig,\n    argMaxConfig,\n    argMinConfig,\n    asinConfig,\n    asinhConfig,\n    atanConfig,\n    atan2Config,\n    atanhConfig,\n    avgPoolConfig,\n    avgPool3DConfig,\n    avgPool3DGradConfig,\n    avgPoolGradConfig,\n    batchMatMulConfig,\n    batchNormConfig,\n    batchToSpaceNDConfig,\n    bincountConfig,\n    broadcastArgsConfig,\n    castConfig,\n    ceilConfig,\n    clipByValueConfig,\n    complexConfig,\n    complexAbsConfig,\n    concatConfig,\n    conv2DConfig,\n    conv2DBackpropFilterConfig,\n    conv2DBackpropInputConfig,\n    conv3DConfig,\n    conv3DBackpropFilterV2Config,\n    conv3DBackpropInputV2Config,\n    cosConfig,\n    coshConfig,\n    cropAndResizeConfig,\n    cumprodConfig,\n    cumsumConfig,\n    denseBincountConfig,\n    depthToSpaceConfig,\n    depthwiseConv2dNativeConfig,\n    depthwiseConv2dNativeBackpropFilterConfig,\n    depthwiseConv2dNativeBackpropInputConfig,\n    diagConfig,\n    dilation2DConfig,\n    dilation2DBackpropFilterConfig,\n    dilation2DBackpropInputConfig,\n    einsumConfig,\n    eluConfig,\n    eluGradConfig,\n    equalConfig,\n    erfConfig,\n    expConfig,\n    expandDimsConfig,\n    expm1Config,\n    fftConfig,\n    fillConfig,\n    flipLeftRightConfig,\n    floorConfig,\n    floorDivConfig,\n    fusedConv2DConfig,\n    fusedDepthwiseConv2DConfig,\n    gatherNdConfig,\n    gatherV2Config,\n    greaterConfig,\n    greaterEqualConfig,\n    identityConfig,\n    ifftConfig,\n    imagConfig,\n    isFiniteConfig,\n    isInfConfig,\n    isNaNConfig,\n    leakyReluConfig,\n    lessConfig,\n    lessEqualConfig,\n    linSpaceConfig,\n    logConfig,\n    log1pConfig,\n    logicalAndConfig,\n    logicalNotConfig,\n    logicalOrConfig,\n    LRNConfig,\n    LRNGradConfig,\n    maxConfig,\n    maximumConfig,\n    maxPoolConfig,\n    maxPool3DConfig,\n    maxPool3DGradConfig,\n    maxPoolGradConfig,\n    maxPoolWithArgmaxConfig,\n    meanConfig,\n    minConfig,\n    minimumConfig,\n    mirrorPadConfig,\n    modConfig,\n    multinomialConfig,\n    multiplyConfig,\n    negConfig,\n    nonMaxSuppressionV3Config,\n    nonMaxSuppressionV4Config,\n    nonMaxSuppressionV5Config,\n    notEqualConfig,\n    oneHotConfig,\n    onesLikeConfig,\n    packConfig,\n    padV2Config,\n    powConfig,\n    preluConfig,\n    prodConfig,\n    raggedGatherConfig,\n    raggedTensorToTensorConfig,\n    rangeConfig,\n    realConfig,\n    realDivConfig,\n    reciprocalConfig,\n    reluConfig,\n    relu6Config,\n    reshapeConfig,\n    resizeBilinearConfig,\n    resizeBilinearGradConfig,\n    resizeNearestNeighborConfig,\n    resizeNearestNeighborGradConfig,\n    reverseConfig,\n    rotateWithOffsetConfig,\n    roundConfig,\n    rsqrtConfig,\n    scatterNdConfig,\n    searchSortedConfig,\n    selectConfig,\n    seluConfig,\n    sigmoidConfig,\n    signConfig,\n    sinConfig,\n    sinhConfig,\n    sliceConfig,\n    softmaxConfig,\n    softplusConfig,\n    spaceToBatchNDConfig,\n    sparseFillEmptyRowsConfig,\n    sparseReshapeConfig,\n    sparseSegmentMeanConfig,\n    sparseSegmentSumConfig,\n    sparseToDenseConfig,\n    splitVConfig,\n    sqrtConfig,\n    squareConfig,\n    squaredDifferenceConfig,\n    stepConfig,\n    stridedSliceConfig,\n    stringNGramsConfig,\n    stringSplitConfig,\n    stringToHashBucketFastConfig,\n    subConfig,\n    sumConfig,\n    tanConfig,\n    tanhConfig,\n    tileConfig,\n    topKConfig,\n    transformConfig,\n    transposeConfig,\n    uniqueConfig,\n    unpackConfig,\n    unsortedSegmentSumConfig,\n    zerosLikeConfig\n];\nfor (const kernelConfig of kernelConfigs) {\n    registerKernel(kernelConfig);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtY3B1L3NyYy9yZWdpc3Rlcl9hbGxfa2VybmVscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCx5RUFBeUU7QUFDekUsNkVBQTZFO0FBQzdFLHlFQUF5RTtBQUN6RSxPQUFPLEVBQWUsY0FBYyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFbkUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDeEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENB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WUFBWTtJQUNaLFVBQVU7SUFDVixhQUFhO0lBQ2IsVUFBVTtJQUNWLFNBQVM7SUFDVCxVQUFVO0lBQ1YsV0FBVztJQUNYLGFBQWE7SUFDYixjQUFjO0lBQ2Qsb0JBQW9CO0lBQ3BCLHlCQUF5QjtJQUN6QixtQkFBbUI7SUFDbkIsdUJBQXVCO0lBQ3ZCLHNCQUFzQjtJQUN0QixtQkFBbUI7SUFDbkIsWUFBWTtJQUNaLFVBQVU7SUFDVixZQUFZO0lBQ1osdUJBQXVCO0lBQ3ZCLFVBQVU7SUFDVixrQkFBa0I7SUFDbEIsa0JBQWtCO0lBQ2xCLGlCQUFpQjtJQUNqQiw0QkFBNEI7SUFDNUIsU0FBUztJQUNULFNBQVM7SUFDVCxTQUFTO0lBQ1QsVUFBVTtJQUNWLFVBQVU7SUFDVixVQUFVO0lBQ1YsZUFBZTtJQUNmLGVBQWU7SUFDZixZQUFZO0lBQ1osWUFBWTtJQUNaLHdCQUF3QjtJQUN4QixlQUFlO0NBQ2hCLENBQUM7QUFFRixLQUFLLE1BQU0sWUFBWSxJQUFJLGFBQWEsRUFBRTtJQUN4QyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7Q0FDOUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG4vLyBXZSBleHBsaWNpdGx5IGltcG9ydCB0aGUgbW9kdWxhciBrZXJuZWxzIHNvIHRoZXkgZ2V0IHJlZ2lzdGVyZWQgaW4gdGhlXG4vLyBnbG9iYWwgcmVnaXN0cnkgd2hlbiB3ZSBjb21waWxlIHRoZSBsaWJyYXJ5LiBBIG1vZHVsYXIgYnVpbGQgd291bGQgcmVwbGFjZVxuLy8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgZmlsZSBhbmQgaW1wb3J0IG9ubHkgdGhlIGtlcm5lbHMgdGhhdCBhcmUgbmVlZGVkLlxuaW1wb3J0IHtLZXJuZWxDb25maWcsIHJlZ2lzdGVyS2VybmVsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge19mdXNlZE1hdE11bENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL19GdXNlZE1hdE11bCc7XG5pbXBvcnQge2Fic0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Ficyc7XG5pbXBvcnQge2Fjb3NDb25maWd9IGZyb20gJy4va2VybmVscy9BY29zJztcbmltcG9ydCB7YWNvc2hDb25maWd9IGZyb20gJy4va2VybmVscy9BY29zaCc7XG5pbXBvcnQge2FkZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FkZCc7XG5pbXBvcnQge2FkZE5Db25maWd9IGZyb20gJy4va2VybmVscy9BZGROJztcbmltcG9ydCB7YWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7YW55Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQW55JztcbmltcG9ydCB7YXJnTWF4Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXJnTWF4JztcbmltcG9ydCB7YXJnTWluQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXJnTWluJztcbmltcG9ydCB7YXNpbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FzaW4nO1xuaW1wb3J0IHthc2luaENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FzaW5oJztcbmltcG9ydCB7YXRhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F0YW4nO1xuaW1wb3J0IHthdGFuMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F0YW4yJztcbmltcG9ydCB7YXRhbmhDb25maWd9IGZyb20gJy4va2VybmVscy9BdGFuaCc7XG5pbXBvcnQge2F2Z1Bvb2xDb25maWd9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7YXZnUG9vbDNEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXZnUG9vbDNEJztcbmltcG9ydCB7YXZnUG9vbDNER3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzREdyYWQnO1xuaW1wb3J0IHthdmdQb29sR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2xHcmFkJztcbmltcG9ydCB7YmF0Y2hNYXRNdWxDb25maWd9IGZyb20gJy4va2VybmVscy9CYXRjaE1hdE11bCc7XG5pbXBvcnQge2JhdGNoTm9ybUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTm9ybSc7XG5pbXBvcnQge2JhdGNoVG9TcGFjZU5EQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHtiaW5jb3VudENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JpbmNvdW50JztcbmltcG9ydCB7YnJvYWRjYXN0QXJnc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Jyb2FkY2FzdEFyZ3MnO1xuaW1wb3J0IHtjYXN0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQge2NlaWxDb25maWd9IGZyb20gJy4va2VybmVscy9DZWlsJztcbmltcG9ydCB7Y2xpcEJ5VmFsdWVDb25maWd9IGZyb20gJy4va2VybmVscy9DbGlwQnlWYWx1ZSc7XG5pbXBvcnQge2NvbXBsZXhDb25maWd9IGZyb20gJy4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7Y29tcGxleEFic0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXhBYnMnO1xuaW1wb3J0IHtjb25jYXRDb25maWd9IGZyb20gJy4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHtjb252MkRDb25maWd9IGZyb20gJy4va2VybmVscy9Db252MkQnO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyJztcbmltcG9ydCB7Y29udjJEQmFja3Byb3BJbnB1dENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHtjb252M0RDb25maWd9IGZyb20gJy4va2VybmVscy9Db252M0QnO1xuaW1wb3J0IHtjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29udjNEQmFja3Byb3BGaWx0ZXJWMic7XG5pbXBvcnQge2NvbnYzREJhY2twcm9wSW5wdXRWMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMic7XG5pbXBvcnQge2Nvc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Nvcyc7XG5pbXBvcnQge2Nvc2hDb25maWd9IGZyb20gJy4va2VybmVscy9Db3NoJztcbmltcG9ydCB7Y3JvcEFuZFJlc2l6ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Nyb3BBbmRSZXNpemUnO1xuaW1wb3J0IHtjdW1wcm9kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ3VtcHJvZCc7XG5pbXBvcnQge2N1bXN1bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0N1bXN1bSc7XG5pbXBvcnQge2RlbnNlQmluY291bnRDb25maWd9IGZyb20gJy4va2VybmVscy9EZW5zZUJpbmNvdW50JztcbmltcG9ydCB7ZGVwdGhUb1NwYWNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGhUb1NwYWNlJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlJztcbmltcG9ydCB7ZGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJDb25maWd9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRDb25maWd9IGZyb20gJy4va2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0JztcbmltcG9ydCB7ZGlhZ0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RpYWcnO1xuaW1wb3J0IHtkaWxhdGlvbjJEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yRCc7XG5pbXBvcnQge2RpbGF0aW9uMkRCYWNrcHJvcEZpbHRlckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RpbGF0aW9uMkRCYWNrcHJvcEZpbHRlcic7XG5pbXBvcnQge2RpbGF0aW9uMkRCYWNrcHJvcElucHV0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGlsYXRpb24yREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHtlaW5zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9FaW5zdW0nO1xuaW1wb3J0IHtlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9FbHUnO1xuaW1wb3J0IHtlbHVHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRWx1R3JhZCc7XG5pbXBvcnQge2VxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHtlcmZDb25maWd9IGZyb20gJy4va2VybmVscy9FcmYnO1xuaW1wb3J0IHtleHBDb25maWd9IGZyb20gJy4va2VybmVscy9FeHAnO1xuaW1wb3J0IHtleHBhbmREaW1zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQge2V4cG0xQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuaW1wb3J0IHtmZnRDb25maWd9IGZyb20gJy4va2VybmVscy9GRlQnO1xuaW1wb3J0IHtmaWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmlsbCc7XG5pbXBvcnQge2ZsaXBMZWZ0UmlnaHRDb25maWd9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7Zmxvb3JDb25maWd9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQge2Zsb29yRGl2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmxvb3JEaXYnO1xuaW1wb3J0IHtmdXNlZENvbnYyRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkQ29udjJEJztcbmltcG9ydCB7ZnVzZWREZXB0aHdpc2VDb252MkRDb25maWd9IGZyb20gJy4va2VybmVscy9GdXNlZERlcHRod2lzZUNvbnYyRCc7XG5pbXBvcnQge2dhdGhlck5kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyTmQnO1xuaW1wb3J0IHtnYXRoZXJWMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0dhdGhlclYyJztcbmltcG9ydCB7Z3JlYXRlckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXInO1xuaW1wb3J0IHtncmVhdGVyRXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9HcmVhdGVyRXF1YWwnO1xuaW1wb3J0IHtpZGVudGl0eUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lkZW50aXR5JztcbmltcG9ydCB7aWZmdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lGRlQnO1xuaW1wb3J0IHtpbWFnQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSW1hZyc7XG5pbXBvcnQge2lzRmluaXRlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSXNGaW5pdGUnO1xuaW1wb3J0IHtpc0luZkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lzSW5mJztcbmltcG9ydCB7aXNOYU5Db25maWd9IGZyb20gJy4va2VybmVscy9Jc05hTic7XG5pbXBvcnQge2xlYWt5UmVsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xlYWt5UmVsdSc7XG5pbXBvcnQge2xlc3NDb25maWd9IGZyb20gJy4va2VybmVscy9MZXNzJztcbmltcG9ydCB7bGVzc0VxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTGVzc0VxdWFsJztcbmltcG9ydCB7bGluU3BhY2VDb25maWd9IGZyb20gJy4va2VybmVscy9MaW5TcGFjZSc7XG5pbXBvcnQge2xvZ0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xvZyc7XG5pbXBvcnQge2xvZzFwQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9nMXAnO1xuaW1wb3J0IHtsb2dpY2FsQW5kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9naWNhbEFuZCc7XG5pbXBvcnQge2xvZ2ljYWxOb3RDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsTm90JztcbmltcG9ydCB7bG9naWNhbE9yQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9naWNhbE9yJztcbmltcG9ydCB7TFJOQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTFJOJztcbmltcG9ydCB7TFJOR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xSTkdyYWQnO1xuaW1wb3J0IHttYXhDb25maWd9IGZyb20gJy4va2VybmVscy9NYXgnO1xuaW1wb3J0IHttYXhpbXVtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4aW11bSc7XG5pbXBvcnQge21heFBvb2xDb25maWd9IGZyb20gJy4va2VybmVscy9NYXhQb29sJztcbmltcG9ydCB7bWF4UG9vbDNEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNEJztcbmltcG9ydCB7bWF4UG9vbDNER3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2wzREdyYWQnO1xuaW1wb3J0IHttYXhQb29sR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xHcmFkJztcbmltcG9ydCB7bWF4UG9vbFdpdGhBcmdtYXhDb25maWd9IGZyb20gJy4va2VybmVscy9NYXhQb29sV2l0aEFyZ21heCc7XG5pbXBvcnQge21lYW5Db25maWd9IGZyb20gJy4va2VybmVscy9NZWFuJztcbmltcG9ydCB7bWluQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWluJztcbmltcG9ydCB7bWluaW11bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01pbmltdW0nO1xuaW1wb3J0IHttaXJyb3JQYWRDb25maWd9IGZyb20gJy4va2VybmVscy9NaXJyb3JQYWQnO1xuaW1wb3J0IHttb2RDb25maWd9IGZyb20gJy4va2VybmVscy9Nb2QnO1xuaW1wb3J0IHttdWx0aW5vbWlhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL011bHRpbm9taWFsJztcbmltcG9ydCB7bXVsdGlwbHlDb25maWd9IGZyb20gJy4va2VybmVscy9NdWx0aXBseSc7XG5pbXBvcnQge25lZ0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL05lZyc7XG5pbXBvcnQge25vbk1heFN1cHByZXNzaW9uVjNDb25maWd9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjQnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNSc7XG5pbXBvcnQge25vdEVxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTm90RXF1YWwnO1xuaW1wb3J0IHtvbmVIb3RDb25maWd9IGZyb20gJy4va2VybmVscy9PbmVIb3QnO1xuaW1wb3J0IHtvbmVzTGlrZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL09uZXNMaWtlJztcbmltcG9ydCB7cGFja0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1BhY2snO1xuaW1wb3J0IHtwYWRWMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1BhZFYyJztcbmltcG9ydCB7cG93Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUG93JztcbmltcG9ydCB7cHJlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQge3Byb2RDb25maWd9IGZyb20gJy4va2VybmVscy9Qcm9kJztcbmltcG9ydCB7cmFnZ2VkR2F0aGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmFnZ2VkR2F0aGVyJztcbmltcG9ydCB7cmFnZ2VkVGVuc29yVG9UZW5zb3JDb25maWd9IGZyb20gJy4va2VybmVscy9SYWdnZWRUZW5zb3JUb1RlbnNvcic7XG5pbXBvcnQge3JhbmdlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmFuZ2UnO1xuaW1wb3J0IHtyZWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVhbCc7XG5pbXBvcnQge3JlYWxEaXZDb25maWd9IGZyb20gJy4va2VybmVscy9SZWFsRGl2JztcbmltcG9ydCB7cmVjaXByb2NhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlY2lwcm9jYWwnO1xuaW1wb3J0IHtyZWx1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVsdSc7XG5pbXBvcnQge3JlbHU2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVsdTYnO1xuaW1wb3J0IHtyZXNoYXBlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaGFwZSc7XG5pbXBvcnQge3Jlc2l6ZUJpbGluZWFyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplQmlsaW5lYXInO1xuaW1wb3J0IHtyZXNpemVCaWxpbmVhckdyYWRDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhckdyYWQnO1xuaW1wb3J0IHtyZXNpemVOZWFyZXN0TmVpZ2hib3JDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3InO1xuaW1wb3J0IHtyZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCc7XG5pbXBvcnQge3JldmVyc2VDb25maWd9IGZyb20gJy4va2VybmVscy9SZXZlcnNlJztcbmltcG9ydCB7cm90YXRlV2l0aE9mZnNldENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JvdGF0ZVdpdGhPZmZzZXQnO1xuaW1wb3J0IHtyb3VuZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JvdW5kJztcbmltcG9ydCB7cnNxcnRDb25maWd9IGZyb20gJy4va2VybmVscy9Sc3FydCc7XG5pbXBvcnQge3NjYXR0ZXJOZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NjYXR0ZXJOZCc7XG5pbXBvcnQge3NlYXJjaFNvcnRlZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NlYXJjaFNvcnRlZCc7XG5pbXBvcnQge3NlbGVjdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NlbGVjdCc7XG5pbXBvcnQge3NlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9TZWx1JztcbmltcG9ydCB7c2lnbW9pZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NpZ21vaWQnO1xuaW1wb3J0IHtzaWduQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2lnbic7XG5pbXBvcnQge3NpbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Npbic7XG5pbXBvcnQge3NpbmhDb25maWd9IGZyb20gJy4va2VybmVscy9TaW5oJztcbmltcG9ydCB7c2xpY2VDb25maWd9IGZyb20gJy4va2VybmVscy9TbGljZSc7XG5pbXBvcnQge3NvZnRtYXhDb25maWd9IGZyb20gJy4va2VybmVscy9Tb2Z0bWF4JztcbmltcG9ydCB7c29mdHBsdXNDb25maWd9IGZyb20gJy4va2VybmVscy9Tb2Z0cGx1cyc7XG5pbXBvcnQge3NwYWNlVG9CYXRjaE5EQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhY2VUb0JhdGNoTkQnO1xuaW1wb3J0IHtzcGFyc2VGaWxsRW1wdHlSb3dzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlRmlsbEVtcHR5Um93cyc7XG5pbXBvcnQge3NwYXJzZVJlc2hhcGVDb25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VSZXNoYXBlJztcbmltcG9ydCB7c3BhcnNlU2VnbWVudE1lYW5Db25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50TWVhbic7XG5pbXBvcnQge3NwYXJzZVNlZ21lbnRTdW1Db25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VTZWdtZW50U3VtJztcbmltcG9ydCB7c3BhcnNlVG9EZW5zZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVRvRGVuc2UnO1xuaW1wb3J0IHtzcGxpdFZDb25maWd9IGZyb20gJy4va2VybmVscy9TcGxpdFYnO1xuaW1wb3J0IHtzcXJ0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3FydCc7XG5pbXBvcnQge3NxdWFyZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NxdWFyZSc7XG5pbXBvcnQge3NxdWFyZWREaWZmZXJlbmNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlZERpZmZlcmVuY2UnO1xuaW1wb3J0IHtzdGVwQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RlcCc7XG5pbXBvcnQge3N0cmlkZWRTbGljZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0cmlkZWRTbGljZSc7XG5pbXBvcnQge3N0cmluZ05HcmFtc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N0cmluZ05HcmFtcyc7XG5pbXBvcnQge3N0cmluZ1NwbGl0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nU3BsaXQnO1xuaW1wb3J0IHtzdHJpbmdUb0hhc2hCdWNrZXRGYXN0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nVG9IYXNoQnVja2V0RmFzdCc7XG5pbXBvcnQge3N1YkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N1Yic7XG5pbXBvcnQge3N1bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1N1bSc7XG5pbXBvcnQge3RhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Rhbic7XG5pbXBvcnQge3RhbmhDb25maWd9IGZyb20gJy4va2VybmVscy9UYW5oJztcbmltcG9ydCB7dGlsZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RpbGUnO1xuaW1wb3J0IHt0b3BLQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVG9wSyc7XG5pbXBvcnQge3RyYW5zZm9ybUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RyYW5zZm9ybSc7XG5pbXBvcnQge3RyYW5zcG9zZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RyYW5zcG9zZSc7XG5pbXBvcnQge3VuaXF1ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1VuaXF1ZSc7XG5pbXBvcnQge3VucGFja0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1VucGFjayc7XG5pbXBvcnQge3Vuc29ydGVkU2VnbWVudFN1bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Vuc29ydGVkU2VnbWVudFN1bSc7XG5pbXBvcnQge3plcm9zTGlrZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1plcm9zTGlrZSc7XG5cbi8vIExpc3QgYWxsIGtlcm5lbCBjb25maWdzIGhlcmVcbmNvbnN0IGtlcm5lbENvbmZpZ3M6IEtlcm5lbENvbmZpZ1tdID0gW1xuICBfZnVzZWRNYXRNdWxDb25maWcsXG4gIGFic0NvbmZpZyxcbiAgYWNvc0NvbmZpZyxcbiAgYWNvc2hDb25maWcsXG4gIGFkZENvbmZpZyxcbiAgYWRkTkNvbmZpZyxcbiAgYWxsQ29uZmlnLFxuICBhbnlDb25maWcsXG4gIGFyZ01heENvbmZpZyxcbiAgYXJnTWluQ29uZmlnLFxuICBhc2luQ29uZmlnLFxuICBhc2luaENvbmZpZyxcbiAgYXRhbkNvbmZpZyxcbiAgYXRhbjJDb25maWcsXG4gIGF0YW5oQ29uZmlnLFxuICBhdmdQb29sQ29uZmlnLFxuICBhdmdQb29sM0RDb25maWcsXG4gIGF2Z1Bvb2wzREdyYWRDb25maWcsXG4gIGF2Z1Bvb2xHcmFkQ29uZmlnLFxuICBiYXRjaE1hdE11bENvbmZpZyxcbiAgYmF0Y2hOb3JtQ29uZmlnLFxuICBiYXRjaFRvU3BhY2VORENvbmZpZyxcbiAgYmluY291bnRDb25maWcsXG4gIGJyb2FkY2FzdEFyZ3NDb25maWcsXG4gIGNhc3RDb25maWcsXG4gIGNlaWxDb25maWcsXG4gIGNsaXBCeVZhbHVlQ29uZmlnLFxuICBjb21wbGV4Q29uZmlnLFxuICBjb21wbGV4QWJzQ29uZmlnLFxuICBjb25jYXRDb25maWcsXG4gIGNvbnYyRENvbmZpZyxcbiAgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gIGNvbnYyREJhY2twcm9wSW5wdXRDb25maWcsXG4gIGNvbnYzRENvbmZpZyxcbiAgY29udjNEQmFja3Byb3BGaWx0ZXJWMkNvbmZpZyxcbiAgY29udjNEQmFja3Byb3BJbnB1dFYyQ29uZmlnLFxuICBjb3NDb25maWcsXG4gIGNvc2hDb25maWcsXG4gIGNyb3BBbmRSZXNpemVDb25maWcsXG4gIGN1bXByb2RDb25maWcsXG4gIGN1bXN1bUNvbmZpZyxcbiAgZGVuc2VCaW5jb3VudENvbmZpZyxcbiAgZGVwdGhUb1NwYWNlQ29uZmlnLFxuICBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnLFxuICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnLFxuICBkaWFnQ29uZmlnLFxuICBkaWxhdGlvbjJEQ29uZmlnLFxuICBkaWxhdGlvbjJEQmFja3Byb3BGaWx0ZXJDb25maWcsXG4gIGRpbGF0aW9uMkRCYWNrcHJvcElucHV0Q29uZmlnLFxuICBlaW5zdW1Db25maWcsXG4gIGVsdUNvbmZpZyxcbiAgZWx1R3JhZENvbmZpZyxcbiAgZXF1YWxDb25maWcsXG4gIGVyZkNvbmZpZyxcbiAgZXhwQ29uZmlnLFxuICBleHBhbmREaW1zQ29uZmlnLFxuICBleHBtMUNvbmZpZyxcbiAgZmZ0Q29uZmlnLFxuICBmaWxsQ29uZmlnLFxuICBmbGlwTGVmdFJpZ2h0Q29uZmlnLFxuICBmbG9vckNvbmZpZyxcbiAgZmxvb3JEaXZDb25maWcsXG4gIGZ1c2VkQ29udjJEQ29uZmlnLFxuICBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyxcbiAgZ2F0aGVyTmRDb25maWcsXG4gIGdhdGhlclYyQ29uZmlnLFxuICBncmVhdGVyQ29uZmlnLFxuICBncmVhdGVyRXF1YWxDb25maWcsXG4gIGlkZW50aXR5Q29uZmlnLFxuICBpZmZ0Q29uZmlnLFxuICBpbWFnQ29uZmlnLFxuICBpc0Zpbml0ZUNvbmZpZyxcbiAgaXNJbmZDb25maWcsXG4gIGlzTmFOQ29uZmlnLFxuICBsZWFreVJlbHVDb25maWcsXG4gIGxlc3NDb25maWcsXG4gIGxlc3NFcXVhbENvbmZpZyxcbiAgbGluU3BhY2VDb25maWcsXG4gIGxvZ0NvbmZpZyxcbiAgbG9nMXBDb25maWcsXG4gIGxvZ2ljYWxBbmRDb25maWcsXG4gIGxvZ2ljYWxOb3RDb25maWcsXG4gIGxvZ2ljYWxPckNvbmZpZyxcbiAgTFJOQ29uZmlnLFxuICBMUk5HcmFkQ29uZmlnLFxuICBtYXhDb25maWcsXG4gIG1heGltdW1Db25maWcsXG4gIG1heFBvb2xDb25maWcsXG4gIG1heFBvb2wzRENvbmZpZyxcbiAgbWF4UG9vbDNER3JhZENvbmZpZyxcbiAgbWF4UG9vbEdyYWRDb25maWcsXG4gIG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnLFxuICBtZWFuQ29uZmlnLFxuICBtaW5Db25maWcsXG4gIG1pbmltdW1Db25maWcsXG4gIG1pcnJvclBhZENvbmZpZyxcbiAgbW9kQ29uZmlnLFxuICBtdWx0aW5vbWlhbENvbmZpZyxcbiAgbXVsdGlwbHlDb25maWcsXG4gIG5lZ0NvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyxcbiAgbm90RXF1YWxDb25maWcsXG4gIG9uZUhvdENvbmZpZyxcbiAgb25lc0xpa2VDb25maWcsXG4gIHBhY2tDb25maWcsXG4gIHBhZFYyQ29uZmlnLFxuICBwb3dDb25maWcsXG4gIHByZWx1Q29uZmlnLFxuICBwcm9kQ29uZmlnLFxuICByYWdnZWRHYXRoZXJDb25maWcsXG4gIHJhZ2dlZFRlbnNvclRvVGVuc29yQ29uZmlnLFxuICByYW5nZUNvbmZpZyxcbiAgcmVhbENvbmZpZyxcbiAgcmVhbERpdkNvbmZpZyxcbiAgcmVjaXByb2NhbENvbmZpZyxcbiAgcmVsdUNvbmZpZyxcbiAgcmVsdTZDb25maWcsXG4gIHJlc2hhcGVDb25maWcsXG4gIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICByZXNpemVCaWxpbmVhckdyYWRDb25maWcsXG4gIHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZyxcbiAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgcmV2ZXJzZUNvbmZpZyxcbiAgcm90YXRlV2l0aE9mZnNldENvbmZpZyxcbiAgcm91bmRDb25maWcsXG4gIHJzcXJ0Q29uZmlnLFxuICBzY2F0dGVyTmRDb25maWcsXG4gIHNlYXJjaFNvcnRlZENvbmZpZyxcbiAgc2VsZWN0Q29uZmlnLFxuICBzZWx1Q29uZmlnLFxuICBzaWdtb2lkQ29uZmlnLFxuICBzaWduQ29uZmlnLFxuICBzaW5Db25maWcsXG4gIHNpbmhDb25maWcsXG4gIHNsaWNlQ29uZmlnLFxuICBzb2Z0bWF4Q29uZmlnLFxuICBzb2Z0cGx1c0NvbmZpZyxcbiAgc3BhY2VUb0JhdGNoTkRDb25maWcsXG4gIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gIHNwYXJzZVJlc2hhcGVDb25maWcsXG4gIHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnLFxuICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICBzcGFyc2VUb0RlbnNlQ29uZmlnLFxuICBzcGxpdFZDb25maWcsXG4gIHNxcnRDb25maWcsXG4gIHNxdWFyZUNvbmZpZyxcbiAgc3F1YXJlZERpZmZlcmVuY2VDb25maWcsXG4gIHN0ZXBDb25maWcsXG4gIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgc3RyaW5nTkdyYW1zQ29uZmlnLFxuICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyxcbiAgc3ViQ29uZmlnLFxuICBzdW1Db25maWcsXG4gIHRhbkNvbmZpZyxcbiAgdGFuaENvbmZpZyxcbiAgdGlsZUNvbmZpZyxcbiAgdG9wS0NvbmZpZyxcbiAgdHJhbnNmb3JtQ29uZmlnLFxuICB0cmFuc3Bvc2VDb25maWcsXG4gIHVuaXF1ZUNvbmZpZyxcbiAgdW5wYWNrQ29uZmlnLFxuICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gIHplcm9zTGlrZUNvbmZpZ1xuXTtcblxuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nconst contexts = {};\nconst WEBGL_ATTRIBUTES = {\n    alpha: false,\n    antialias: false,\n    premultipliedAlpha: false,\n    preserveDrawingBuffer: false,\n    depth: false,\n    stencil: false,\n    failIfMajorPerformanceCaveat: true\n};\nexport function clearWebGLContext(webGLVersion) {\n    delete contexts[webGLVersion];\n}\nexport function setWebGLContext(webGLVersion, gl) {\n    contexts[webGLVersion] = gl;\n}\nexport function getWebGLContext(webGLVersion, customCanvas) {\n    if (!(webGLVersion in contexts) || customCanvas != null) {\n        const newCtx = getWebGLRenderingContext(webGLVersion, customCanvas);\n        if (newCtx !== null) {\n            contexts[webGLVersion] = newCtx;\n        }\n        else {\n            console.log('Could not get context for WebGL version', webGLVersion);\n            return null;\n        }\n    }\n    const gl = contexts[webGLVersion];\n    if (gl == null || gl.isContextLost()) {\n        delete contexts[webGLVersion];\n        return getWebGLContext(webGLVersion);\n    }\n    gl.disable(gl.DEPTH_TEST);\n    gl.disable(gl.STENCIL_TEST);\n    gl.disable(gl.BLEND);\n    gl.disable(gl.DITHER);\n    gl.disable(gl.POLYGON_OFFSET_FILL);\n    gl.disable(gl.SAMPLE_COVERAGE);\n    gl.enable(gl.SCISSOR_TEST);\n    gl.enable(gl.CULL_FACE);\n    gl.cullFace(gl.BACK);\n    return contexts[webGLVersion];\n}\nfunction createCanvas(webGLVersion) {\n    if (typeof OffscreenCanvas !== 'undefined' && webGLVersion === 2) {\n        return new OffscreenCanvas(300, 150);\n    }\n    else if (typeof document !== 'undefined') {\n        return document.createElement('canvas');\n    }\n    else {\n        throw new Error('Cannot create a canvas in this context');\n    }\n}\nfunction getWebGLRenderingContext(webGLVersion, customCanvas) {\n    if (webGLVersion !== 1 && webGLVersion !== 2) {\n        throw new Error('Cannot get WebGL rendering context, WebGL is disabled.');\n    }\n    const canvas = customCanvas == null ? createCanvas(webGLVersion) : customCanvas;\n    canvas.addEventListener('webglcontextlost', (ev) => {\n        ev.preventDefault();\n        delete contexts[webGLVersion];\n    }, false);\n    if (env().getBool('SOFTWARE_WEBGL_ENABLED')) {\n        WEBGL_ATTRIBUTES.failIfMajorPerformanceCaveat = false;\n    }\n    if (webGLVersion === 1) {\n        return (canvas.getContext('webgl', WEBGL_ATTRIBUTES) ||\n            canvas.getContext('experimental-webgl', WEBGL_ATTRIBUTES));\n    }\n    return canvas.getContext('webgl2', WEBGL_ATTRIBUTES);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FudmFzX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NhbnZhc191dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxQyxNQUFNLFFBQVEsR0FBMkMsRUFBRSxDQUFDO0FBRTVELE1BQU0sZ0JBQWdCLEdBQTJCO0lBQy9DLEtBQUssRUFBRSxLQUFLO0lBQ1osU0FBUyxFQUFFLEtBQUs7SUFDaEIsa0JBQWtCLEVBQUUsS0FBSztJQUN6QixxQkFBcUIsRUFBRSxLQUFLO0lBQzVCLEtBQUssRUFBRSxLQUFLO0lBQ1osT0FBTyxFQUFFLEtBQUs7SUFDZCw0QkFBNEIsRUFBRSxJQUFJO0NBQ25DLENBQUM7QUFFRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsWUFBb0I7SUFDcEQsT0FBTyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDaEMsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQzNCLFlBQW9CLEVBQUUsRUFBeUI7SUFDakQsUUFBUSxDQUFDLFlBQVksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUM5QixDQUFDO0FBRUQsTUFBTSxVQUFVLGVBQWUsQ0FDM0IsWUFBb0IsRUFDcEIsWUFBZ0Q7SUFDbEQsSUFBSSxDQUFDLENBQUMsWUFBWSxJQUFJLFFBQVEsQ0FBQyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDdkQsTUFBTSxNQUFNLEdBQUcsd0JBQXdCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLElBQUksTUFBTSxLQUFLLElBQUksRUFBRTtZQUNuQixRQUFRLENBQUMsWUFBWSxDQUFDLEdBQUcsTUFBTSxDQUFDO1NBQ2pDO2FBQU07WUFDTCxPQUFPLENBQUMsR0FBRyxDQUFDLHlDQUF5QyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ3JFLE9BQU8sSUFBSSxDQUFDO1NBQ2I7S0FDRjtJQUNELE1BQU0sRUFBRSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNsQyxJQUFJLEVBQUUsSUFBSSxJQUFJLElBQUksRUFBRSxDQUFDLGFBQWEsRUFBRSxFQUFFO1FBQ3BDLE9BQU8sUUFBUSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzlCLE9BQU8sZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO0tBQ3RDO0lBRUQsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDMUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDNUIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdEIsRUFBRSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNuQyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUMvQixFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUMzQixFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUN4QixFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUVyQixPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztBQUNoQyxDQUFDO0FBRUQsU0FBUyxZQUFZLENBQUMsWUFBb0I7SUFDeEMsSUFBSSxPQUFPLGVBQWUsS0FBSyxXQUFXLElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtRQUNoRSxPQUFPLElBQUksZUFBZSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztLQUN0QztTQUFNLElBQUksT0FBTyxRQUFRLEtBQUssV0FBVyxFQUFFO1FBQzFDLE9BQU8sUUFBUSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUN6QztTQUFNO1FBQ0wsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO0tBQzNEO0FBQ0gsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQzdCLFlBQW9CLEVBQ3BCLFlBQWdEO0lBQ2xELElBQUksWUFBWSxLQUFLLENBQUMsSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFO1FBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsd0RBQXdELENBQUMsQ0FBQztLQUMzRTtJQUNELE1BQU0sTUFBTSxHQUNSLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDO0lBRXJFLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLEVBQVMsRUFBRSxFQUFFO1FBQ3hELEVBQUUsQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUNwQixPQUFPLFFBQVEsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNoQyxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFVixJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyx3QkFBd0IsQ0FBQyxFQUFFO1FBQzNDLGdCQUFnQixDQUFDLDRCQUE0QixHQUFHLEtBQUssQ0FBQztLQUN2RDtJQUVELElBQUksWUFBWSxLQUFLLENBQUMsRUFBRTtRQUN0QixPQUFPLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUM7WUFDNUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxvQkFBb0IsRUFBRSxnQkFBZ0IsQ0FBQyxDQUN4QyxDQUFDO0tBQzNCO0lBQ0QsT0FBTyxNQUFNLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxnQkFBZ0IsQ0FBMEIsQ0FBQztBQUNoRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3QgY29udGV4dHM6IHtba2V5OiBzdHJpbmddOiBXZWJHTFJlbmRlcmluZ0NvbnRleHR9ID0ge307XG5cbmNvbnN0IFdFQkdMX0FUVFJJQlVURVM6IFdlYkdMQ29udGV4dEF0dHJpYnV0ZXMgPSB7XG4gIGFscGhhOiBmYWxzZSxcbiAgYW50aWFsaWFzOiBmYWxzZSxcbiAgcHJlbXVsdGlwbGllZEFscGhhOiBmYWxzZSxcbiAgcHJlc2VydmVEcmF3aW5nQnVmZmVyOiBmYWxzZSxcbiAgZGVwdGg6IGZhbHNlLFxuICBzdGVuY2lsOiBmYWxzZSxcbiAgZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdDogdHJ1ZVxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGNsZWFyV2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbjogbnVtYmVyKSB7XG4gIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2V0V2ViR0xDb250ZXh0KFxuICAgIHdlYkdMVmVyc2lvbjogbnVtYmVyLCBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KSB7XG4gIGNvbnRleHRzW3dlYkdMVmVyc2lvbl0gPSBnbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMQ29udGV4dChcbiAgICB3ZWJHTFZlcnNpb246IG51bWJlcixcbiAgICBjdXN0b21DYW52YXM/OiBIVE1MQ2FudmFzRWxlbWVudHxPZmZzY3JlZW5DYW52YXMpOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQge1xuICBpZiAoISh3ZWJHTFZlcnNpb24gaW4gY29udGV4dHMpIHx8IGN1c3RvbUNhbnZhcyAhPSBudWxsKSB7XG4gICAgY29uc3QgbmV3Q3R4ID0gZ2V0V2ViR0xSZW5kZXJpbmdDb250ZXh0KHdlYkdMVmVyc2lvbiwgY3VzdG9tQ2FudmFzKTtcbiAgICBpZiAobmV3Q3R4ICE9PSBudWxsKSB7XG4gICAgICBjb250ZXh0c1t3ZWJHTFZlcnNpb25dID0gbmV3Q3R4O1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZygnQ291bGQgbm90IGdldCBjb250ZXh0IGZvciBXZWJHTCB2ZXJzaW9uJywgd2ViR0xWZXJzaW9uKTtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuICBjb25zdCBnbCA9IGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG4gIGlmIChnbCA9PSBudWxsIHx8IGdsLmlzQ29udGV4dExvc3QoKSkge1xuICAgIGRlbGV0ZSBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xuICAgIHJldHVybiBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgfVxuXG4gIGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gIGdsLmRpc2FibGUoZ2wuU1RFTkNJTF9URVNUKTtcbiAgZ2wuZGlzYWJsZShnbC5CTEVORCk7XG4gIGdsLmRpc2FibGUoZ2wuRElUSEVSKTtcbiAgZ2wuZGlzYWJsZShnbC5QT0xZR09OX09GRlNFVF9GSUxMKTtcbiAgZ2wuZGlzYWJsZShnbC5TQU1QTEVfQ09WRVJBR0UpO1xuICBnbC5lbmFibGUoZ2wuU0NJU1NPUl9URVNUKTtcbiAgZ2wuZW5hYmxlKGdsLkNVTExfRkFDRSk7XG4gIGdsLmN1bGxGYWNlKGdsLkJBQ0spO1xuXG4gIHJldHVybiBjb250ZXh0c1t3ZWJHTFZlcnNpb25dO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVDYW52YXMod2ViR0xWZXJzaW9uOiBudW1iZXIpIHtcbiAgaWYgKHR5cGVvZiBPZmZzY3JlZW5DYW52YXMgIT09ICd1bmRlZmluZWQnICYmIHdlYkdMVmVyc2lvbiA9PT0gMikge1xuICAgIHJldHVybiBuZXcgT2Zmc2NyZWVuQ2FudmFzKDMwMCwgMTUwKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGNyZWF0ZSBhIGNhbnZhcyBpbiB0aGlzIGNvbnRleHQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRXZWJHTFJlbmRlcmluZ0NvbnRleHQoXG4gICAgd2ViR0xWZXJzaW9uOiBudW1iZXIsXG4gICAgY3VzdG9tQ2FudmFzPzogSFRNTENhbnZhc0VsZW1lbnR8T2Zmc2NyZWVuQ2FudmFzKTogV2ViR0xSZW5kZXJpbmdDb250ZXh0IHtcbiAgaWYgKHdlYkdMVmVyc2lvbiAhPT0gMSAmJiB3ZWJHTFZlcnNpb24gIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBnZXQgV2ViR0wgcmVuZGVyaW5nIGNvbnRleHQsIFdlYkdMIGlzIGRpc2FibGVkLicpO1xuICB9XG4gIGNvbnN0IGNhbnZhcyA9XG4gICAgICBjdXN0b21DYW52YXMgPT0gbnVsbCA/IGNyZWF0ZUNhbnZhcyh3ZWJHTFZlcnNpb24pIDogY3VzdG9tQ2FudmFzO1xuXG4gIGNhbnZhcy5hZGRFdmVudExpc3RlbmVyKCd3ZWJnbGNvbnRleHRsb3N0JywgKGV2OiBFdmVudCkgPT4ge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgZGVsZXRlIGNvbnRleHRzW3dlYkdMVmVyc2lvbl07XG4gIH0sIGZhbHNlKTtcblxuICBpZiAoZW52KCkuZ2V0Qm9vbCgnU09GVFdBUkVfV0VCR0xfRU5BQkxFRCcpKSB7XG4gICAgV0VCR0xfQVRUUklCVVRFUy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gZmFsc2U7XG4gIH1cblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAxKSB7XG4gICAgcmV0dXJuIChjYW52YXMuZ2V0Q29udGV4dCgnd2ViZ2wnLCBXRUJHTF9BVFRSSUJVVEVTKSB8fFxuICAgICAgICAgICAgY2FudmFzLmdldENvbnRleHQoJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIFdFQkdMX0FUVFJJQlVURVMpKSBhc1xuICAgICAgICBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gIH1cbiAgcmV0dXJuIGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbDInLCBXRUJHTF9BVFRSSUJVVEVTKSBhcyBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, util } from '@tensorflow/tfjs-core';\nexport var PackingScheme;\n(function (PackingScheme) {\n    /**\n     * All values in a single texel are densely packed without any constraints.\n     *\n     * This is how the shader encodes a tensor with shape = [2, 3, 4]\n     * (indices are [batch, row, col]).\n     *\n     * 000|001   010|011   020|021\n     * -------   -------   -------\n     * 002|003   012|013   022|023\n     *\n     * 100|101   110|111   120|121\n     * -------   -------   -------\n     * 102|103   112|113   122|123\n     *\n     */\n    PackingScheme[PackingScheme[\"DENSE\"] = 0] = \"DENSE\";\n    /**\n     * Single texels contain only values from the same batch, and from adjacent\n     * rows and columns.\n     *\n     * This is how the shader encodes a tensor with shape = [2, 3, 5]\n     * (indices are [batch, row, col]).\n     *\n     * 000|001   002|003   004|xxx   020|021   022|023   024|xxx\n     * -------   -------   -------   -------   -------   -------\n     * 010|011   012|013   014|xxx   xxx|xxx   xxx|xxx   xxx|xxx\n     *\n     * 100|101   102|103   104|xxx   120|121   122|123   124|xxx\n     * -------   -------   -------   -------   -------   -------\n     * 110|111   112|113   114|xxx   xxx|xxx   xxx|xxx   xxx|xxx\n     *\n     */\n    PackingScheme[PackingScheme[\"SHARED_BATCH\"] = 1] = \"SHARED_BATCH\";\n})(PackingScheme || (PackingScheme = {}));\nexport var TextureUsage;\n(function (TextureUsage) {\n    TextureUsage[TextureUsage[\"RENDER\"] = 0] = \"RENDER\";\n    TextureUsage[TextureUsage[\"UPLOAD\"] = 1] = \"UPLOAD\";\n    TextureUsage[TextureUsage[\"PIXELS\"] = 2] = \"PIXELS\";\n    TextureUsage[TextureUsage[\"DOWNLOAD\"] = 3] = \"DOWNLOAD\";\n})(TextureUsage || (TextureUsage = {}));\nexport var PhysicalTextureType;\n(function (PhysicalTextureType) {\n    PhysicalTextureType[PhysicalTextureType[\"UNPACKED_FLOAT16\"] = 0] = \"UNPACKED_FLOAT16\";\n    PhysicalTextureType[PhysicalTextureType[\"UNPACKED_FLOAT32\"] = 1] = \"UNPACKED_FLOAT32\";\n    PhysicalTextureType[PhysicalTextureType[\"PACKED_4X1_UNSIGNED_BYTE\"] = 2] = \"PACKED_4X1_UNSIGNED_BYTE\";\n    PhysicalTextureType[PhysicalTextureType[\"PACKED_2X2_FLOAT32\"] = 3] = \"PACKED_2X2_FLOAT32\";\n    PhysicalTextureType[PhysicalTextureType[\"PACKED_2X2_FLOAT16\"] = 4] = \"PACKED_2X2_FLOAT16\";\n})(PhysicalTextureType || (PhysicalTextureType = {}));\nexport function getUnpackedMatrixTextureShapeWidthHeight(rows, columns) {\n    return [columns, rows];\n}\nexport function getUnpackedArraySizeFromMatrixSize(matrixSize, channelsPerTexture) {\n    return matrixSize * channelsPerTexture;\n}\nexport function getColorMatrixTextureShapeWidthHeight(rows, columns) {\n    return [columns * 4, rows];\n}\n/**\n * Get shape for densely packed RGBA texture.\n */\nexport function getDenseTexShape(shape) {\n    const size = util.sizeFromShape(shape);\n    const texelsNeeded = Math.ceil(size / 4);\n    return util.sizeToSquarishShape(texelsNeeded);\n}\nexport function getMatrixSizeFromUnpackedArraySize(unpackedSize, channelsPerTexture) {\n    if (unpackedSize % channelsPerTexture !== 0) {\n        throw new Error(`unpackedSize (${unpackedSize}) must be a multiple of ` +\n            `${channelsPerTexture}`);\n    }\n    return unpackedSize / channelsPerTexture;\n}\nexport function decodeMatrixFromUnpackedColorRGBAArray(unpackedArray, matrix, channels) {\n    const requiredSize = unpackedArray.length * channels / 4;\n    if (matrix.length < requiredSize) {\n        throw new Error(`matrix length (${matrix.length}) must be >= ${requiredSize}`);\n    }\n    let dst = 0;\n    for (let src = 0; src < unpackedArray.length; src += 4) {\n        for (let c = 0; c < channels; c++) {\n            matrix[dst++] = unpackedArray[src + c];\n        }\n    }\n}\nexport function getPackedMatrixTextureShapeWidthHeight(rows, columns) {\n    return [\n        Math.max(1, Math.ceil(columns / 2)), Math.max(1, Math.ceil(rows / 2))\n    ];\n}\nexport function getPackedRGBAArraySizeFromMatrixShape(rows, columns) {\n    const [w, h] = getPackedMatrixTextureShapeWidthHeight(rows, columns);\n    return w * h * 4;\n}\nexport function getTextureConfig(\n// tslint:disable-next-line:no-any\ngl, textureHalfFloatExtension) {\n    // tslint:disable-next-line:no-any\n    const glany = gl;\n    let internalFormatFloat;\n    let internalFormatHalfFloat;\n    let internalFormatPackedHalfFloat;\n    let internalFormatPackedFloat;\n    let textureFormatFloat;\n    let downloadTextureFormat;\n    let downloadUnpackNumChannels;\n    let defaultNumChannels;\n    let textureTypeHalfFloat;\n    let textureTypeFloat;\n    if (env().getNumber('WEBGL_VERSION') === 2) {\n        internalFormatFloat = glany.R32F;\n        internalFormatHalfFloat = glany.R16F;\n        internalFormatPackedHalfFloat = glany.RGBA16F;\n        internalFormatPackedFloat = glany.RGBA32F;\n        textureFormatFloat = glany.RED;\n        downloadUnpackNumChannels = 4;\n        defaultNumChannels = 1;\n        textureTypeHalfFloat = glany.HALF_FLOAT;\n        textureTypeFloat = glany.FLOAT;\n        downloadTextureFormat = glany.RGBA8;\n    }\n    else {\n        internalFormatFloat = gl.RGBA;\n        internalFormatHalfFloat = gl.RGBA;\n        internalFormatPackedHalfFloat = gl.RGBA;\n        internalFormatPackedFloat = glany.RGBA;\n        textureFormatFloat = gl.RGBA;\n        downloadUnpackNumChannels = 4;\n        defaultNumChannels = 4;\n        textureTypeHalfFloat = textureHalfFloatExtension != null ?\n            textureHalfFloatExtension.HALF_FLOAT_OES :\n            null;\n        textureTypeFloat = gl.FLOAT;\n        downloadTextureFormat = gl.RGBA;\n    }\n    return {\n        internalFormatFloat,\n        internalFormatHalfFloat,\n        internalFormatPackedHalfFloat,\n        internalFormatPackedFloat,\n        textureFormatFloat,\n        downloadTextureFormat,\n        downloadUnpackNumChannels,\n        defaultNumChannels,\n        textureTypeHalfFloat,\n        textureTypeFloat\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4X3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3RleF91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBaUMsR0FBRyxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTVGLE1BQU0sQ0FBTixJQUFZLGFBbUNYO0FBbkNELFdBQVksYUFBYTtJQUN2Qjs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNILG1EQUFLLENBQUE7SUFFTDs7Ozs7Ozs7Ozs7Ozs7O09BZUc7SUFDSCxpRUFBWSxDQUFBO0FBQ2QsQ0FBQyxFQW5DVyxhQUFhLEtBQWIsYUFBYSxRQW1DeEI7QUFFRCxNQUFNLENBQU4sSUFBWSxZQUtYO0FBTEQsV0FBWSxZQUFZO0lBQ3RCLG1EQUFNLENBQUE7SUFDTixtREFBTSxDQUFBO0lBQ04sbURBQU0sQ0FBQTtJQUNOLHVEQUFRLENBQUE7QUFDVixDQUFDLEVBTFcsWUFBWSxLQUFaLFlBQVksUUFLdkI7QUFFRCxNQUFNLENBQU4sSUFBWSxtQkFNWDtBQU5ELFdBQVksbUJBQW1CO0lBQzdCLHFGQUFnQixDQUFBO0lBQ2hCLHFGQUFnQixDQUFBO0lBQ2hCLHFHQUF3QixDQUFBO0lBQ3hCLHlGQUFrQixDQUFBO0lBQ2xCLHlGQUFrQixDQUFBO0FBQ3BCLENBQUMsRUFOVyxtQkFBbUIsS0FBbkIsbUJBQW1CLFFBTTlCO0FBa0NELE1BQU0sVUFBVSx3Q0FBd0MsQ0FDcEQsSUFBWSxFQUFFLE9BQWU7SUFDL0IsT0FBTyxDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN6QixDQUFDO0FBRUQsTUFBTSxVQUFVLGtDQUFrQyxDQUM5QyxVQUFrQixFQUFFLGtCQUEwQjtJQUNoRCxPQUFPLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQztBQUN6QyxDQUFDO0FBRUQsTUFBTSxVQUFVLHFDQUFxQyxD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a0JBQWtCO1FBQ2xCLHFCQUFxQjtRQUNyQix5QkFBeUI7UUFDekIsa0JBQWtCO1FBQ2xCLG9CQUFvQjtRQUNwQixnQkFBZ0I7S0FDakIsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhSWQsIERhdGFUeXBlLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmV4cG9ydCBlbnVtIFBhY2tpbmdTY2hlbWUge1xuICAvKipcbiAgICogQWxsIHZhbHVlcyBpbiBhIHNpbmdsZSB0ZXhlbCBhcmUgZGVuc2VseSBwYWNrZWQgd2l0aG91dCBhbnkgY29uc3RyYWludHMuXG4gICAqXG4gICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDRdXG4gICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAqXG4gICAqIDAwMHwwMDEgICAwMTB8MDExICAgMDIwfDAyMVxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMDAyfDAwMyAgIDAxMnwwMTMgICAwMjJ8MDIzXG4gICAqXG4gICAqIDEwMHwxMDEgICAxMTB8MTExICAgMTIwfDEyMVxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMTAyfDEwMyAgIDExMnwxMTMgICAxMjJ8MTIzXG4gICAqXG4gICAqL1xuICBERU5TRSxcblxuICAvKipcbiAgICogU2luZ2xlIHRleGVscyBjb250YWluIG9ubHkgdmFsdWVzIGZyb20gdGhlIHNhbWUgYmF0Y2gsIGFuZCBmcm9tIGFkamFjZW50XG4gICAqIHJvd3MgYW5kIGNvbHVtbnMuXG4gICAqXG4gICAqIFRoaXMgaXMgaG93IHRoZSBzaGFkZXIgZW5jb2RlcyBhIHRlbnNvciB3aXRoIHNoYXBlID0gWzIsIDMsIDVdXG4gICAqIChpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG4gICAqXG4gICAqIDAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMDEwfDAxMSAgIDAxMnwwMTMgICAwMTR8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4XG4gICAqXG4gICAqIDEwMHwxMDEgICAxMDJ8MTAzICAgMTA0fHh4eCAgIDEyMHwxMjEgICAxMjJ8MTIzICAgMTI0fHh4eFxuICAgKiAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbiAgICogMTEwfDExMSAgIDExMnwxMTMgICAxMTR8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4XG4gICAqXG4gICAqL1xuICBTSEFSRURfQkFUQ0hcbn1cblxuZXhwb3J0IGVudW0gVGV4dHVyZVVzYWdlIHtcbiAgUkVOREVSLFxuICBVUExPQUQsXG4gIFBJWEVMUyxcbiAgRE9XTkxPQURcbn1cblxuZXhwb3J0IGVudW0gUGh5c2ljYWxUZXh0dXJlVHlwZSB7XG4gIFVOUEFDS0VEX0ZMT0FUMTYsXG4gIFVOUEFDS0VEX0ZMT0FUMzIsXG4gIFBBQ0tFRF80WDFfVU5TSUdORURfQllURSxcbiAgUEFDS0VEXzJYMl9GTE9BVDMyLFxuICBQQUNLRURfMlgyX0ZMT0FUMTZcbn1cblxuZXhwb3J0IGludGVyZmFjZSBUZXh0dXJlIHtcbiAgdGV4dHVyZTogV2ViR0xUZXh0dXJlO1xuICB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgVGV4dHVyZURhdGEge1xuICAvLyBSZXF1aXJlZC5cbiAgc2hhcGU6IG51bWJlcltdO1xuICBkdHlwZTogRGF0YVR5cGU7XG5cbiAgLy8gT3B0aW9uYWwuXG4gIHZhbHVlcz86IGJhY2tlbmRfdXRpbC5CYWNrZW5kVmFsdWVzO1xuICB0ZXh0dXJlPzogVGV4dHVyZTtcbiAgLy8gRm9yIGNvbXBsZXggbnVtYmVycywgdGhlIHJlYWwgYW5kIGltYWdpbmFyeSBwYXJ0cyBhcmUgc3RvcmVkIGFzIHRoZWlyIG93blxuICAvLyBpbmRpdmlkdWFsIHRlbnNvckluZm9zLCB3aXRoIGEgcGFyZW50IGpvaW5pbmcgdGhlIHR3byB3aXRoIHRoZVxuICAvLyBjb21wbGV4VGVuc29ycyBmaWVsZC4gV2hlbiB0aGlzIGlzIGRlZmluZWQsIHRleHR1cmUgd2lsbCBiZSBudWxsLlxuICBjb21wbGV4VGVuc29ySW5mb3M/OiB7cmVhbDogVGVuc29ySW5mbywgaW1hZzogVGVuc29ySW5mb307XG4gIC8qKiBbcm93cywgY29sdW1uc10gc2hhcGUgb2YgdGhlIHRleHR1cmUuICovXG4gIHRleFNoYXBlPzogW251bWJlciwgbnVtYmVyXTtcbiAgdXNhZ2U/OiBUZXh0dXJlVXNhZ2U7XG4gIGlzUGFja2VkPzogYm9vbGVhbjtcblxuICByZWZDb3VudDogbnVtYmVyO1xuXG4gIC8vIEF2YWlsYWJsZSB3aGVuIHRoZSB0ZW5zb3IgaGFzIGJlZW4gc2xpY2VkLlxuICBzbGljZT86IHtcbiAgICAvLyBPZmZzZXQgaW4gdGhlICdmbGF0IGluZGV4JyBzcGFjZS5cbiAgICBmbGF0T2Zmc2V0OiBudW1iZXI7XG4gICAgLy8gVXNlZCBmb3IgY291bnRpbmcgaG93IG1hbnkgc2xpY2VkIHRlbnNvcnMgcG9pbnQgdG8gdGhlIHNhbWUgdGV4dHVyZS5cbiAgICBvcmlnRGF0YUlkOiBEYXRhSWQ7XG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbnBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KFxuICAgIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogW251bWJlciwgbnVtYmVyXSB7XG4gIHJldHVybiBbY29sdW1ucywgcm93c107XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRVbnBhY2tlZEFycmF5U2l6ZUZyb21NYXRyaXhTaXplKFxuICAgIG1hdHJpeFNpemU6IG51bWJlciwgY2hhbm5lbHNQZXJUZXh0dXJlOiBudW1iZXIpOiBudW1iZXIge1xuICByZXR1cm4gbWF0cml4U2l6ZSAqIGNoYW5uZWxzUGVyVGV4dHVyZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldENvbG9yTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoXG4gICAgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBbbnVtYmVyLCBudW1iZXJdIHtcbiAgcmV0dXJuIFtjb2x1bW5zICogNCwgcm93c107XG59XG5cbi8qKlxuICogR2V0IHNoYXBlIGZvciBkZW5zZWx5IHBhY2tlZCBSR0JBIHRleHR1cmUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXREZW5zZVRleFNoYXBlKHNoYXBlOiBudW1iZXJbXSk6IFtudW1iZXIsIG51bWJlcl0ge1xuICBjb25zdCBzaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgY29uc3QgdGV4ZWxzTmVlZGVkID0gTWF0aC5jZWlsKHNpemUgLyA0KTtcbiAgcmV0dXJuIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZSh0ZXhlbHNOZWVkZWQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0TWF0cml4U2l6ZUZyb21VbnBhY2tlZEFycmF5U2l6ZShcbiAgICB1bnBhY2tlZFNpemU6IG51bWJlciwgY2hhbm5lbHNQZXJUZXh0dXJlOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAodW5wYWNrZWRTaXplICUgY2hhbm5lbHNQZXJUZXh0dXJlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgdW5wYWNrZWRTaXplICgke3VucGFja2VkU2l6ZX0pIG11c3QgYmUgYSBtdWx0aXBsZSBvZiBgICtcbiAgICAgICAgYCR7Y2hhbm5lbHNQZXJUZXh0dXJlfWApO1xuICB9XG4gIHJldHVybiB1bnBhY2tlZFNpemUgLyBjaGFubmVsc1BlclRleHR1cmU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkZWNvZGVNYXRyaXhGcm9tVW5wYWNrZWRDb2xvclJHQkFBcnJheShcbiAgICB1bnBhY2tlZEFycmF5OiBGbG9hdDMyQXJyYXksIG1hdHJpeDogRmxvYXQzMkFycmF5LCBjaGFubmVsczogbnVtYmVyKSB7XG4gIGNvbnN0IHJlcXVpcmVkU2l6ZSA9IHVucGFja2VkQXJyYXkubGVuZ3RoICogY2hhbm5lbHMgLyA0O1xuICBpZiAobWF0cml4Lmxlbmd0aCA8IHJlcXVpcmVkU2l6ZSkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYG1hdHJpeCBsZW5ndGggKCR7bWF0cml4Lmxlbmd0aH0pIG11c3QgYmUgPj0gJHtyZXF1aXJlZFNpemV9YCk7XG4gIH1cbiAgbGV0IGRzdCA9IDA7XG4gIGZvciAobGV0IHNyYyA9IDA7IHNyYyA8IHVucGFja2VkQXJyYXkubGVuZ3RoOyBzcmMgKz0gNCkge1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgY2hhbm5lbHM7IGMrKykge1xuICAgICAgbWF0cml4W2RzdCsrXSA9IHVucGFja2VkQXJyYXlbc3JjICsgY107XG4gICAgfVxuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IFtudW1iZXIsIG51bWJlcl0ge1xuICByZXR1cm4gW1xuICAgIE1hdGgubWF4KDEsIE1hdGguY2VpbChjb2x1bW5zIC8gMikpLCBNYXRoLm1heCgxLCBNYXRoLmNlaWwocm93cyAvIDIpKVxuICBdO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZShcbiAgICByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IG51bWJlciB7XG4gIGNvbnN0IFt3LCBoXSA9IGdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gdyAqIGggKiA0O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRleHR1cmVDb25maWcge1xuICBpbnRlcm5hbEZvcm1hdEZsb2F0OiBudW1iZXI7XG4gIHRleHR1cmVGb3JtYXRGbG9hdDogbnVtYmVyO1xuICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdDogbnVtYmVyO1xuICBpbnRlcm5hbEZvcm1hdEhhbGZGbG9hdDogbnVtYmVyO1xuICBpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0OiBudW1iZXI7XG5cbiAgLy8gVGhlIGZvcm1hdCB0byB1c2UgZHVyaW5nIGEgZ2wucmVhZFBpeGVscyBjYWxsLlxuICBkb3dubG9hZFRleHR1cmVGb3JtYXQ6IG51bWJlcjtcbiAgLy8gSG93IG1hbnkgY2hhbm5lbHMgbmVlZCB0byBiZSB1bnBhY2tlZCBhZnRlciBhIGdsLnJlYWRQaXhlbHMgY2FsbC5cbiAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVsczogbnVtYmVyO1xuXG4gIGRlZmF1bHROdW1DaGFubmVsczogbnVtYmVyO1xuICB0ZXh0dXJlVHlwZUhhbGZGbG9hdDogbnVtYmVyO1xuICB0ZXh0dXJlVHlwZUZsb2F0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRUZXh0dXJlQ29uZmlnKFxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uPzogYW55KTogVGV4dHVyZUNvbmZpZyB7XG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnlcbiAgY29uc3QgZ2xhbnkgPSBnbCBhcyBhbnk7XG5cbiAgbGV0IGludGVybmFsRm9ybWF0RmxvYXQ6IG51bWJlcjtcbiAgbGV0IGludGVybmFsRm9ybWF0SGFsZkZsb2F0OiBudW1iZXI7XG4gIGxldCBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdDogbnVtYmVyO1xuICBsZXQgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDogbnVtYmVyO1xuICBsZXQgdGV4dHVyZUZvcm1hdEZsb2F0OiBudW1iZXI7XG5cbiAgbGV0IGRvd25sb2FkVGV4dHVyZUZvcm1hdDogbnVtYmVyO1xuICBsZXQgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVsczogbnVtYmVyO1xuXG4gIGxldCBkZWZhdWx0TnVtQ2hhbm5lbHM6IG51bWJlcjtcbiAgbGV0IHRleHR1cmVUeXBlSGFsZkZsb2F0OiBudW1iZXI7XG4gIGxldCB0ZXh0dXJlVHlwZUZsb2F0OiBudW1iZXI7XG5cbiAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgaW50ZXJuYWxGb3JtYXRGbG9hdCA9IGdsYW55LlIzMkY7XG4gICAgaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQgPSBnbGFueS5SMTZGO1xuICAgIGludGVybmFsRm9ybWF0UGFja2VkSGFsZkZsb2F0ID0gZ2xhbnkuUkdCQTE2RjtcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEZsb2F0ID0gZ2xhbnkuUkdCQTMyRjtcbiAgICB0ZXh0dXJlRm9ybWF0RmxvYXQgPSBnbGFueS5SRUQ7XG4gICAgZG93bmxvYWRVbnBhY2tOdW1DaGFubmVscyA9IDQ7XG4gICAgZGVmYXVsdE51bUNoYW5uZWxzID0gMTtcbiAgICB0ZXh0dXJlVHlwZUhhbGZGbG9hdCA9IGdsYW55LkhBTEZfRkxPQVQ7XG4gICAgdGV4dHVyZVR5cGVGbG9hdCA9IGdsYW55LkZMT0FUO1xuICAgIGRvd25sb2FkVGV4dHVyZUZvcm1hdCA9IGdsYW55LlJHQkE4O1xuICB9IGVsc2Uge1xuICAgIGludGVybmFsRm9ybWF0RmxvYXQgPSBnbC5SR0JBO1xuICAgIGludGVybmFsRm9ybWF0SGFsZkZsb2F0ID0gZ2wuUkdCQTtcbiAgICBpbnRlcm5hbEZvcm1hdFBhY2tlZEhhbGZGbG9hdCA9IGdsLlJHQkE7XG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCA9IGdsYW55LlJHQkE7XG4gICAgdGV4dHVyZUZvcm1hdEZsb2F0ID0gZ2wuUkdCQTtcbiAgICBkb3dubG9hZFVucGFja051bUNoYW5uZWxzID0gNDtcbiAgICBkZWZhdWx0TnVtQ2hhbm5lbHMgPSA0O1xuICAgIHRleHR1cmVUeXBlSGFsZkZsb2F0ID0gdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbiAhPSBudWxsID9cbiAgICAgICAgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbi5IQUxGX0ZMT0FUX09FUyA6XG4gICAgICAgIG51bGw7XG4gICAgdGV4dHVyZVR5cGVGbG9hdCA9IGdsLkZMT0FUO1xuICAgIGRvd25sb2FkVGV4dHVyZUZvcm1hdCA9IGdsLlJHQkE7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGludGVybmFsRm9ybWF0RmxvYXQsXG4gICAgaW50ZXJuYWxGb3JtYXRIYWxmRmxvYXQsXG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQsXG4gICAgaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdCxcbiAgICB0ZXh0dXJlRm9ybWF0RmxvYXQsXG4gICAgZG93bmxvYWRUZXh0dXJlRm9ybWF0LFxuICAgIGRvd25sb2FkVW5wYWNrTnVtQ2hhbm5lbHMsXG4gICAgZGVmYXVsdE51bUNoYW5uZWxzLFxuICAgIHRleHR1cmVUeXBlSGFsZkZsb2F0LFxuICAgIHRleHR1cmVUeXBlRmxvYXRcbiAgfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, util } from '@tensorflow/tfjs-core';\nimport { getWebGLContext } from './canvas_util';\nimport { getTextureConfig } from './tex_util';\nexport function callAndCheck(gl, func) {\n    const returnValue = func();\n    if (env().getBool('DEBUG')) {\n        checkWebGLError(gl);\n    }\n    return returnValue;\n}\nfunction checkWebGLError(gl) {\n    const error = gl.getError();\n    if (error !== gl.NO_ERROR) {\n        throw new Error('WebGL Error: ' + getWebGLErrorMessage(gl, error));\n    }\n}\n// https://en.wikipedia.org/wiki/Half-precision_floating-point_format\nconst MIN_FLOAT16 = 5.96e-8;\nconst MAX_FLOAT16 = 65504;\nexport function canBeRepresented(num) {\n    if (env().getBool('WEBGL_RENDER_FLOAT32_ENABLED') || num === 0 ||\n        (MIN_FLOAT16 < Math.abs(num) && Math.abs(num) < MAX_FLOAT16)) {\n        return true;\n    }\n    return false;\n}\nexport function getWebGLErrorMessage(gl, status) {\n    switch (status) {\n        case gl.NO_ERROR:\n            return 'NO_ERROR';\n        case gl.INVALID_ENUM:\n            return 'INVALID_ENUM';\n        case gl.INVALID_VALUE:\n            return 'INVALID_VALUE';\n        case gl.INVALID_OPERATION:\n            return 'INVALID_OPERATION';\n        case gl.INVALID_FRAMEBUFFER_OPERATION:\n            return 'INVALID_FRAMEBUFFER_OPERATION';\n        case gl.OUT_OF_MEMORY:\n            return 'OUT_OF_MEMORY';\n        case gl.CONTEXT_LOST_WEBGL:\n            return 'CONTEXT_LOST_WEBGL';\n        default:\n            return `Unknown error code ${status}`;\n    }\n}\nexport function getExtensionOrThrow(gl, extensionName) {\n    return throwIfNull(gl, () => gl.getExtension(extensionName), 'Extension \"' + extensionName + '\" not supported on this browser.');\n}\nexport function createVertexShader(gl, vertexShaderSource) {\n    const vertexShader = throwIfNull(gl, () => gl.createShader(gl.VERTEX_SHADER), 'Unable to create vertex WebGLShader.');\n    callAndCheck(gl, () => gl.shaderSource(vertexShader, vertexShaderSource));\n    callAndCheck(gl, () => gl.compileShader(vertexShader));\n    if (gl.getShaderParameter(vertexShader, gl.COMPILE_STATUS) === false) {\n        console.log(gl.getShaderInfoLog(vertexShader));\n        throw new Error('Failed to compile vertex shader.');\n    }\n    return vertexShader;\n}\nexport function createFragmentShader(gl, fragmentShaderSource) {\n    const fragmentShader = throwIfNull(gl, () => gl.createShader(gl.FRAGMENT_SHADER), 'Unable to create fragment WebGLShader.');\n    callAndCheck(gl, () => gl.shaderSource(fragmentShader, fragmentShaderSource));\n    callAndCheck(gl, () => gl.compileShader(fragmentShader));\n    if (env().get('ENGINE_COMPILE_ONLY')) {\n        return fragmentShader;\n    }\n    if (gl.getShaderParameter(fragmentShader, gl.COMPILE_STATUS) === false) {\n        logShaderSourceAndInfoLog(fragmentShaderSource, gl.getShaderInfoLog(fragmentShader));\n        throw new Error('Failed to compile fragment shader.');\n    }\n    return fragmentShader;\n}\nconst lineNumberRegex = /ERROR: [0-9]+:([0-9]+):/g;\nexport function logShaderSourceAndInfoLog(shaderSource, shaderInfoLog) {\n    const lineNumberRegexResult = lineNumberRegex.exec(shaderInfoLog);\n    if (lineNumberRegexResult == null) {\n        console.log(`Couldn't parse line number in error: ${shaderInfoLog}`);\n        console.log(shaderSource);\n        return;\n    }\n    const lineNumber = +lineNumberRegexResult[1];\n    const shaderLines = shaderSource.split('\\n');\n    const pad = shaderLines.length.toString().length + 2;\n    const linesWithLineNumbers = shaderLines.map((line, lineNumber) => util.rightPad((lineNumber + 1).toString(), pad) + line);\n    let maxLineLength = 0;\n    for (let i = 0; i < linesWithLineNumbers.length; i++) {\n        maxLineLength = Math.max(linesWithLineNumbers[i].length, maxLineLength);\n    }\n    const beforeErrorLines = linesWithLineNumbers.slice(0, lineNumber - 1);\n    const errorLine = linesWithLineNumbers.slice(lineNumber - 1, lineNumber);\n    const afterErrorLines = linesWithLineNumbers.slice(lineNumber);\n    console.log(beforeErrorLines.join('\\n'));\n    console.log(shaderInfoLog.split('\\n')[0]);\n    console.log(`%c ${util.rightPad(errorLine[0], maxLineLength)}`, 'border:1px solid red; background-color:#e3d2d2; color:#a61717');\n    console.log(afterErrorLines.join('\\n'));\n}\nexport function createProgram(gl) {\n    return throwIfNull(gl, () => gl.createProgram(), 'Unable to create WebGLProgram.');\n}\nexport function linkProgram(gl, program) {\n    callAndCheck(gl, () => gl.linkProgram(program));\n    if (env().get('ENGINE_COMPILE_ONLY')) {\n        return;\n    }\n    if (gl.getProgramParameter(program, gl.LINK_STATUS) === false) {\n        console.log(gl.getProgramInfoLog(program));\n        throw new Error('Failed to link vertex and fragment shaders.');\n    }\n}\nexport function validateProgram(gl, program) {\n    callAndCheck(gl, () => gl.validateProgram(program));\n    if (gl.getProgramParameter(program, gl.VALIDATE_STATUS) === false) {\n        console.log(gl.getProgramInfoLog(program));\n        throw new Error('Shader program validation failed.');\n    }\n}\nexport function createStaticVertexBuffer(gl, data) {\n    const buffer = throwIfNull(gl, () => gl.createBuffer(), 'Unable to create WebGLBuffer');\n    callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, buffer));\n    callAndCheck(gl, () => gl.bufferData(gl.ARRAY_BUFFER, data, gl.STATIC_DRAW));\n    return buffer;\n}\nexport function createStaticIndexBuffer(gl, data) {\n    const buffer = throwIfNull(gl, () => gl.createBuffer(), 'Unable to create WebGLBuffer');\n    callAndCheck(gl, () => gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, buffer));\n    callAndCheck(gl, () => gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, data, gl.STATIC_DRAW));\n    return buffer;\n}\nexport function getNumChannels() {\n    if (env().getNumber('WEBGL_VERSION') === 2) {\n        return 1;\n    }\n    return 4;\n}\nexport function createTexture(gl) {\n    return throwIfNull(gl, () => gl.createTexture(), 'Unable to create WebGLTexture.');\n}\nexport function validateTextureSize(width, height) {\n    const maxTextureSize = env().getNumber('WEBGL_MAX_TEXTURE_SIZE');\n    if ((width <= 0) || (height <= 0)) {\n        const requested = `[${width}x${height}]`;\n        throw new Error('Requested texture size ' + requested + ' is invalid.');\n    }\n    if ((width > maxTextureSize) || (height > maxTextureSize)) {\n        const requested = `[${width}x${height}]`;\n        const max = `[${maxTextureSize}x${maxTextureSize}]`;\n        throw new Error('Requested texture size ' + requested +\n            ' greater than WebGL maximum on this browser / GPU ' + max + '.');\n    }\n}\nexport function createFramebuffer(gl) {\n    return throwIfNull(gl, () => gl.createFramebuffer(), 'Unable to create WebGLFramebuffer.');\n}\nexport function bindVertexBufferToProgramAttribute(gl, program, attribute, buffer, arrayEntriesPerItem, itemStrideInBytes, itemOffsetInBytes) {\n    const loc = gl.getAttribLocation(program, attribute);\n    if (loc === -1) {\n        // The GPU compiler decided to strip out this attribute because it's unused,\n        // thus no need to bind.\n        return false;\n    }\n    callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, buffer));\n    callAndCheck(gl, () => gl.vertexAttribPointer(loc, arrayEntriesPerItem, gl.FLOAT, false, itemStrideInBytes, itemOffsetInBytes));\n    callAndCheck(gl, () => gl.enableVertexAttribArray(loc));\n    return true;\n}\nexport function bindTextureUnit(gl, texture, textureUnit) {\n    validateTextureUnit(gl, textureUnit);\n    callAndCheck(gl, () => gl.activeTexture(gl.TEXTURE0 + textureUnit));\n    callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, texture));\n}\nexport function unbindTextureUnit(gl, textureUnit) {\n    validateTextureUnit(gl, textureUnit);\n    callAndCheck(gl, () => gl.activeTexture(gl.TEXTURE0 + textureUnit));\n    callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null));\n}\nexport function getProgramUniformLocationOrThrow(gl, program, uniformName) {\n    return throwIfNull(gl, () => gl.getUniformLocation(program, uniformName), 'uniform \"' + uniformName + '\" not present in program.');\n}\nexport function getProgramUniformLocation(gl, program, uniformName) {\n    return gl.getUniformLocation(program, uniformName);\n}\nexport function bindTextureToProgramUniformSampler(gl, texture, uniformSamplerLocation, textureUnit) {\n    callAndCheck(gl, () => bindTextureUnit(gl, texture, textureUnit));\n    callAndCheck(gl, () => gl.uniform1i(uniformSamplerLocation, textureUnit));\n}\nexport function bindCanvasToFramebuffer(gl) {\n    callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, null));\n    callAndCheck(gl, () => gl.viewport(0, 0, gl.canvas.width, gl.canvas.height));\n    callAndCheck(gl, () => gl.scissor(0, 0, gl.canvas.width, gl.canvas.height));\n}\nexport function bindColorTextureToFramebuffer(gl, texture, framebuffer) {\n    callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer));\n    callAndCheck(gl, () => gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0));\n}\nexport function unbindColorTextureFromFramebuffer(gl, framebuffer) {\n    callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, framebuffer));\n    callAndCheck(gl, () => gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, null, 0));\n}\nexport function validateFramebuffer(gl) {\n    const status = gl.checkFramebufferStatus(gl.FRAMEBUFFER);\n    if (status !== gl.FRAMEBUFFER_COMPLETE) {\n        throw new Error('Error binding framebuffer: ' + getFramebufferErrorMessage(gl, status));\n    }\n}\nexport function getFramebufferErrorMessage(gl, status) {\n    switch (status) {\n        case gl.FRAMEBUFFER_INCOMPLETE_ATTACHMENT:\n            return 'FRAMEBUFFER_INCOMPLETE_ATTACHMENT';\n        case gl.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:\n            return 'FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT';\n        case gl.FRAMEBUFFER_INCOMPLETE_DIMENSIONS:\n            return 'FRAMEBUFFER_INCOMPLETE_DIMENSIONS';\n        case gl.FRAMEBUFFER_UNSUPPORTED:\n            return 'FRAMEBUFFER_UNSUPPORTED';\n        default:\n            return `unknown error ${status}`;\n    }\n}\nfunction throwIfNull(gl, returnTOrNull, failureMessage) {\n    const tOrNull = callAndCheck(gl, () => returnTOrNull());\n    if (tOrNull == null) {\n        throw new Error(failureMessage);\n    }\n    return tOrNull;\n}\nfunction validateTextureUnit(gl, textureUnit) {\n    const maxTextureUnit = gl.MAX_COMBINED_TEXTURE_IMAGE_UNITS - 1;\n    const glTextureUnit = textureUnit + gl.TEXTURE0;\n    if (glTextureUnit < gl.TEXTURE0 || glTextureUnit > maxTextureUnit) {\n        const textureUnitRange = `[gl.TEXTURE0, gl.TEXTURE${maxTextureUnit}]`;\n        throw new Error(`textureUnit must be in ${textureUnitRange}.`);\n    }\n}\nexport function getBatchDim(shape, dimsToSkip = 2) {\n    return util.sizeFromShape(shape.slice(0, shape.length - dimsToSkip));\n}\nexport function getRowsCols(shape) {\n    if (shape.length === 0) {\n        throw Error('Cannot get rows and columns of an empty shape array.');\n    }\n    return [\n        shape.length > 1 ? shape[shape.length - 2] : 1, shape[shape.length - 1]\n    ];\n}\nexport function getShapeAs3D(shape) {\n    let shapeAs3D = [1, 1, 1];\n    const isScalar = shape.length === 0 || (shape.length === 1 && shape[0] === 1);\n    if (!isScalar) {\n        shapeAs3D =\n            [getBatchDim(shape), ...getRowsCols(shape)];\n    }\n    return shapeAs3D;\n}\nexport function getTextureShapeFromLogicalShape(logShape, isPacked = false) {\n    let maxTexSize = env().getNumber('WEBGL_MAX_TEXTURE_SIZE');\n    let maxSizeForNarrowTex = env().getNumber('WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE');\n    if (maxSizeForNarrowTex === Infinity &&\n        env().getBool('WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE')) {\n        maxSizeForNarrowTex = maxTexSize / 2;\n    }\n    if (isPacked) {\n        maxTexSize = maxTexSize * 2;\n        maxSizeForNarrowTex = maxSizeForNarrowTex * 2;\n        // This logic ensures we accurately count the number of packed texels needed\n        // to accommodate the tensor. We can only pack values in the same texel if\n        // they are from adjacent pairs of rows/cols within the same batch. So if a\n        // tensor has 3 rows, we pretend it has 4 rows in order to account for the\n        // fact that the texels containing the third row are half empty.\n        logShape = logShape.map((d, i) => i >= logShape.length - 2 ?\n            util.nearestLargerEven(logShape[i]) :\n            logShape[i]);\n        // Packed texture height is at least 2 (the channel height of a single\n        // texel).\n        if (logShape.length === 1) {\n            logShape = [2, logShape[0]];\n        }\n    }\n    // If logical shape is 2, we don't squeeze, since we want to match physical.\n    if (logShape.length !== 2) {\n        const squeezeResult = util.squeezeShape(logShape);\n        logShape = squeezeResult.newShape;\n    }\n    let size = util.sizeFromShape(logShape);\n    let textureShape = null;\n    if (logShape.length <= 1 && size <= maxTexSize) {\n        textureShape = [1, size];\n    }\n    else if (logShape.length === 2 && logShape[0] <= maxTexSize &&\n        logShape[1] <= maxTexSize) {\n        textureShape = logShape;\n    }\n    else if (logShape.length === 3 && logShape[0] * logShape[1] <= maxTexSize &&\n        logShape[2] <= maxTexSize) {\n        textureShape = [logShape[0] * logShape[1], logShape[2]];\n    }\n    else if (logShape.length === 3 && logShape[0] <= maxTexSize &&\n        logShape[1] * logShape[2] <= maxTexSize) {\n        textureShape = [logShape[0], logShape[1] * logShape[2]];\n    }\n    else if (logShape.length === 4 &&\n        logShape[0] * logShape[1] * logShape[2] <= maxTexSize &&\n        logShape[3] <= maxTexSize) {\n        textureShape = [logShape[0] * logShape[1] * logShape[2], logShape[3]];\n    }\n    else if (logShape.length === 4 && logShape[0] <= maxTexSize &&\n        logShape[1] * logShape[2] * logShape[3] <= maxTexSize) {\n        textureShape = [logShape[0], logShape[1] * logShape[2] * logShape[3]];\n    }\n    // true if one edge length is 1 (1 or 2, if packed), while another edge\n    // length exceeds maxSizeForNarrowTex.\n    const isLongNarrowTex = textureShape != null &&\n        Math.max(...textureShape) > maxSizeForNarrowTex &&\n        Math.min(...textureShape) <= (isPacked ? 2 : 1) &&\n        Math.min(...textureShape) > 0;\n    if (textureShape == null || isLongNarrowTex) {\n        if (isPacked) {\n            // For packed textures size equals the number of channels required to\n            // accommodate the texture data. However in order to squarify such that\n            // inner dimensions stay even, we rewrite size to equal the number of\n            // texels. Then in the return statement we rehydrate the squarified\n            // dimensions to channel units.\n            const batchDim = getBatchDim(logShape);\n            let rows = 2, cols = 2;\n            if (logShape.length) {\n                [rows, cols] = getRowsCols(logShape);\n            }\n            size = batchDim * (rows / 2) * (cols / 2);\n            textureShape =\n                util.sizeToSquarishShape(size).map(d => d * 2);\n        }\n        else {\n            textureShape = util.sizeToSquarishShape(size);\n        }\n    }\n    return textureShape;\n}\nfunction isEven(n) {\n    return n % 2 === 0;\n}\n/**\n * This determines whether reshaping a packed texture requires rearranging\n * the data within the texture, assuming 2x2 packing.\n */\nexport function isReshapeFree(shape1, shape2) {\n    shape1 = shape1.slice(-2);\n    shape2 = shape2.slice(-2);\n    if (util.arraysEqual(shape1, shape2)) {\n        return true;\n    }\n    if (!shape1.length || !shape2.length) { // One of the shapes is a scalar.\n        return true;\n    }\n    if (shape1[0] === 0 || shape1[1] === 0 || shape2[0] === 0 ||\n        shape2[1] === 0) {\n        return true;\n    }\n    if (shape1.length !== shape2.length) { // One of the shapes is a vector.\n        const shape1Cols = shape1.slice(-1)[0];\n        const shape2Cols = shape2.slice(-1)[0];\n        if (shape1Cols === shape2Cols) {\n            return true;\n        }\n        if (isEven(shape1Cols) && isEven(shape2Cols) &&\n            (shape1[0] === 1 || shape2[0] === 1)) {\n            return true;\n        }\n    }\n    return shape1[1] === shape2[1] && isEven(shape1[0]) && isEven(shape2[0]);\n}\n// We cache webgl params because the environment gets reset between\n// unit tests and we don't want to constantly query the WebGLContext for\n// MAX_TEXTURE_SIZE.\nlet MAX_TEXTURE_SIZE;\nlet MAX_TEXTURES_IN_SHADER;\nexport function getWebGLMaxTextureSize(webGLVersion) {\n    if (MAX_TEXTURE_SIZE == null) {\n        const gl = getWebGLContext(webGLVersion);\n        MAX_TEXTURE_SIZE = gl.getParameter(gl.MAX_TEXTURE_SIZE);\n    }\n    return MAX_TEXTURE_SIZE;\n}\nexport function resetMaxTextureSize() {\n    MAX_TEXTURE_SIZE = null;\n}\nexport function resetMaxTexturesInShader() {\n    MAX_TEXTURES_IN_SHADER = null;\n}\nexport function getMaxTexturesInShader(webGLVersion) {\n    if (MAX_TEXTURES_IN_SHADER == null) {\n        const gl = getWebGLContext(webGLVersion);\n        MAX_TEXTURES_IN_SHADER = gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS);\n    }\n    // We cap at 16 to avoid spurious runtime \"memory exhausted\" error.\n    return Math.min(16, MAX_TEXTURES_IN_SHADER);\n}\nexport function getWebGLDisjointQueryTimerVersion(webGLVersion) {\n    if (webGLVersion === 0) {\n        return 0;\n    }\n    let queryTimerVersion;\n    const gl = getWebGLContext(webGLVersion);\n    if (hasExtension(gl, 'EXT_disjoint_timer_query_webgl2') &&\n        webGLVersion === 2) {\n        queryTimerVersion = 2;\n    }\n    else if (hasExtension(gl, 'EXT_disjoint_timer_query')) {\n        queryTimerVersion = 1;\n    }\n    else {\n        queryTimerVersion = 0;\n    }\n    return queryTimerVersion;\n}\nexport function hasExtension(gl, extensionName) {\n    const ext = gl.getExtension(extensionName);\n    return ext != null;\n}\nexport function isWebGLVersionEnabled(webGLVersion) {\n    try {\n        const gl = getWebGLContext(webGLVersion);\n        if (gl != null) {\n            return true;\n        }\n    }\n    catch (e) {\n        console.log('Error when getting WebGL context: ', e);\n        return false;\n    }\n    return false;\n}\nexport function isCapableOfRenderingToFloatTexture(webGLVersion) {\n    if (webGLVersion === 0) {\n        return false;\n    }\n    const gl = getWebGLContext(webGLVersion);\n    if (webGLVersion === 1) {\n        if (!hasExtension(gl, 'OES_texture_float')) {\n            return false;\n        }\n    }\n    else {\n        if (!hasExtension(gl, 'EXT_color_buffer_float')) {\n            return false;\n        }\n    }\n    const isFrameBufferComplete = createFloatTextureAndBindToFramebuffer(gl);\n    return isFrameBufferComplete;\n}\n/**\n * Check if we can download values from a float/half-float texture.\n *\n * Note that for performance reasons we use binding a texture to a framebuffer\n * as a proxy for ability to download float values later using readPixels. The\n * texture params of this texture will not match those in readPixels exactly\n * but if we are unable to bind some kind of float texture to the frameBuffer\n * then we definitely will not be able to read float values from it.\n */\nexport function isDownloadFloatTextureEnabled(webGLVersion) {\n    if (webGLVersion === 0) {\n        return false;\n    }\n    const gl = getWebGLContext(webGLVersion);\n    if (webGLVersion === 1) {\n        if (!hasExtension(gl, 'OES_texture_float')) {\n            return false;\n        }\n        if (!hasExtension(gl, 'WEBGL_color_buffer_float')) {\n            return false;\n        }\n    }\n    else {\n        if (hasExtension(gl, 'EXT_color_buffer_float')) {\n            return createFloatTextureAndBindToFramebuffer(gl);\n        }\n        const COLOR_BUFFER_HALF_FLOAT = 'EXT_color_buffer_half_float';\n        if (hasExtension(gl, COLOR_BUFFER_HALF_FLOAT)) {\n            const textureHalfFloatExtension = gl.getExtension(COLOR_BUFFER_HALF_FLOAT);\n            return createHalfFloatTextureAndBindToFramebuffer(gl, textureHalfFloatExtension);\n        }\n        return false;\n    }\n    const isFrameBufferComplete = createFloatTextureAndBindToFramebuffer(gl);\n    return isFrameBufferComplete;\n}\nfunction createFloatTextureAndBindToFramebuffer(gl) {\n    const texConfig = getTextureConfig(gl);\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    const width = 1;\n    const height = 1;\n    gl.texImage2D(gl.TEXTURE_2D, 0, texConfig.internalFormatFloat, width, height, 0, texConfig.textureFormatFloat, texConfig.textureTypeFloat, null);\n    const frameBuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n    const isFrameBufferComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    gl.deleteTexture(texture);\n    gl.deleteFramebuffer(frameBuffer);\n    return isFrameBufferComplete;\n}\nfunction createHalfFloatTextureAndBindToFramebuffer(\n// tslint:disable-next-line:no-any\ngl, textureHalfFloatExtension) {\n    const texConfig = getTextureConfig(gl, textureHalfFloatExtension);\n    const texture = gl.createTexture();\n    gl.bindTexture(gl.TEXTURE_2D, texture);\n    const width = 1;\n    const height = 1;\n    gl.texImage2D(gl.TEXTURE_2D, 0, texConfig.internalFormatHalfFloat, width, height, 0, texConfig.textureFormatFloat, texConfig.textureTypeHalfFloat, null);\n    const frameBuffer = gl.createFramebuffer();\n    gl.bindFramebuffer(gl.FRAMEBUFFER, frameBuffer);\n    gl.framebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, texture, 0);\n    const isFrameBufferComplete = gl.checkFramebufferStatus(gl.FRAMEBUFFER) === gl.FRAMEBUFFER_COMPLETE;\n    gl.bindTexture(gl.TEXTURE_2D, null);\n    gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n    gl.deleteTexture(texture);\n    gl.deleteFramebuffer(frameBuffer);\n    return isFrameBufferComplete;\n}\nexport function isWebGLFenceEnabled(webGLVersion) {\n    if (webGLVersion !== 2) {\n        return false;\n    }\n    const gl = getWebGLContext(webGLVersion);\n    // tslint:disable-next-line:no-any\n    const isEnabled = gl.fenceSync != null;\n    return isEnabled;\n}\nexport function assertNotComplex(tensor, opName) {\n    if (!Array.isArray(tensor)) {\n        tensor = [tensor];\n    }\n    tensor.forEach(t => {\n        if (t != null) {\n            util.assert(t.dtype !== 'complex64', () => `${opName} does not support complex64 tensors ` +\n                'in the WebGL backend.');\n        }\n    });\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2ViZ2xfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvd2ViZ2xfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTVELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRTVDLE1BQU0sVUFBVSxZQUFZLENBQUksRUFBeUIsRUFBRSxJQUFhO0lBQ3RFLE1BQU0sV0FBVyxHQUFHLElBQUksRUFBRSxDQUFDO0lBQzNCLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQzFCLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQztLQUNyQjtJQUNELE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxTQUFTLGVBQWUsQ0FBQyxFQUF5QjtJQUNoRCxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDNUIsSUFBSSxLQUFLLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLGVBQWUsR0FBRyxvQkFBb0IsQ0FBQyxFQUFFLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQztLQUNwRTtBQUNILENBQUM7QUFFRCxxRUFBcUU7QUFDckUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDO0FBQzVCLE1BQU0sV0FBVyxHQUFHLEtBQUssQ0FBQztBQUUxQixNQUFNLFVBQVUsZ0JBQWdCLENBQUMsR0FBVztJQUMxQyxJQUFJLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDO1FBQzFELENBQUMsV0FBVyxHQUFH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QUMsVUFBVSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BDLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxFQUFFLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQzFCLEVBQUUsQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUVsQyxPQUFPLHFCQUFxQixDQUFDO0FBQy9CLENBQUM7QUFFRCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsWUFBb0I7SUFDdEQsSUFBSSxZQUFZLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFDRCxNQUFNLEVBQUUsR0FBRyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7SUFFekMsa0NBQWtDO0lBQ2xDLE1BQU0sU0FBUyxHQUFJLEVBQVUsQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDO0lBQ2hELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLE1BQStCLEVBQUUsTUFBYztJQUNqRCxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtRQUMxQixNQUFNLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNuQjtJQUNELE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDakIsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQ2IsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFDdkIsR0FBRyxFQUFFLENBQUMsR0FBRyxNQUFNLHNDQUFzQztnQkFDakQsdUJBQXVCLENBQUMsQ0FBQztTQUNsQztJQUNILENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0V2ViR0xDb250ZXh0fSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCB7Z2V0VGV4dHVyZUNvbmZpZ30gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjYWxsQW5kQ2hlY2s8VD4oZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZnVuYzogKCkgPT4gVCk6IFQge1xuICBjb25zdCByZXR1cm5WYWx1ZSA9IGZ1bmMoKTtcbiAgaWYgKGVudigpLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICBjaGVja1dlYkdMRXJyb3IoZ2wpO1xuICB9XG4gIHJldHVybiByZXR1cm5WYWx1ZTtcbn1cblxuZnVuY3Rpb24gY2hlY2tXZWJHTEVycm9yKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgY29uc3QgZXJyb3IgPSBnbC5nZXRFcnJvcigpO1xuICBpZiAoZXJyb3IgIT09IGdsLk5PX0VSUk9SKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdXZWJHTCBFcnJvcjogJyArIGdldFdlYkdMRXJyb3JNZXNzYWdlKGdsLCBlcnJvcikpO1xuICB9XG59XG5cbi8vIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0hhbGYtcHJlY2lzaW9uX2Zsb2F0aW5nLXBvaW50X2Zvcm1hdFxuY29uc3QgTUlOX0ZMT0FUMTYgPSA1Ljk2ZS04O1xuY29uc3QgTUFYX0ZMT0FUMTYgPSA2NTUwNDtcblxuZXhwb3J0IGZ1bmN0aW9uIGNhbkJlUmVwcmVzZW50ZWQobnVtOiBudW1iZXIpOiBib29sZWFuIHtcbiAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnKSB8fCBudW0gPT09IDAgfHxcbiAgICAgIChNSU5fRkxPQVQxNiA8IE1hdGguYWJzKG51bSkgJiYgTWF0aC5hYnMobnVtKSA8IE1BWF9GTE9BVDE2KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMRXJyb3JNZXNzYWdlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHN0YXR1czogbnVtYmVyKTogc3RyaW5nIHtcbiAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICBjYXNlIGdsLk5PX0VSUk9SOlxuICAgICAgcmV0dXJuICdOT19FUlJPUic7XG4gICAgY2FzZSBnbC5JTlZBTElEX0VOVU06XG4gICAgICByZXR1cm4gJ0lOVkFMSURfRU5VTSc7XG4gICAgY2FzZSBnbC5JTlZBTElEX1ZBTFVFOlxuICAgICAgcmV0dXJuICdJTlZBTElEX1ZBTFVFJztcbiAgICBjYXNlIGdsLklOVkFMSURfT1BFUkFUSU9OOlxuICAgICAgcmV0dXJuICdJTlZBTElEX09QRVJBVElPTic7XG4gICAgY2FzZSBnbC5JTlZBTElEX0ZSQU1FQlVGRkVSX09QRVJBVElPTjpcbiAgICAgIHJldHVybiAnSU5WQUxJRF9GUkFNRUJVRkZFUl9PUEVSQVRJT04nO1xuICAgIGNhc2UgZ2wuT1VUX09GX01FTU9SWTpcbiAgICAgIHJldHVybiAnT1VUX09GX01FTU9SWSc7XG4gICAgY2FzZSBnbC5DT05URVhUX0xPU1RfV0VCR0w6XG4gICAgICByZXR1cm4gJ0NPTlRFWFRfTE9TVF9XRUJHTCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgVW5rbm93biBlcnJvciBjb2RlICR7c3RhdHVzfWA7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEV4dGVuc2lvbk9yVGhyb3coXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZXh0ZW5zaW9uTmFtZTogc3RyaW5nKToge30ge1xuICByZXR1cm4gdGhyb3dJZk51bGw8e30+KFxuICAgICAgZ2wsICgpID0+IGdsLmdldEV4dGVuc2lvbihleHRlbnNpb25OYW1lKSxcbiAgICAgICdFeHRlbnNpb24gXCInICsgZXh0ZW5zaW9uTmFtZSArICdcIiBub3Qgc3VwcG9ydGVkIG9uIHRoaXMgYnJvd3Nlci4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZlcnRleFNoYWRlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB2ZXJ0ZXhTaGFkZXJTb3VyY2U6IHN0cmluZyk6IFdlYkdMU2hhZGVyIHtcbiAgY29uc3QgdmVydGV4U2hhZGVyOiBXZWJHTFNoYWRlciA9IHRocm93SWZOdWxsPFdlYkdMU2hhZGVyPihcbiAgICAgIGdsLCAoKSA9PiBnbC5jcmVhdGVTaGFkZXIoZ2wuVkVSVEVYX1NIQURFUiksXG4gICAgICAnVW5hYmxlIHRvIGNyZWF0ZSB2ZXJ0ZXggV2ViR0xTaGFkZXIuJyk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2hhZGVyU291cmNlKHZlcnRleFNoYWRlciwgdmVydGV4U2hhZGVyU291cmNlKSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuY29tcGlsZVNoYWRlcih2ZXJ0ZXhTaGFkZXIpKTtcbiAgaWYgKGdsLmdldFNoYWRlclBhcmFtZXRlcih2ZXJ0ZXhTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICBjb25zb2xlLmxvZyhnbC5nZXRTaGFkZXJJbmZvTG9nKHZlcnRleFNoYWRlcikpO1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvbXBpbGUgdmVydGV4IHNoYWRlci4nKTtcbiAgfVxuICByZXR1cm4gdmVydGV4U2hhZGVyO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRnJhZ21lbnRTaGFkZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZnJhZ21lbnRTaGFkZXJTb3VyY2U6IHN0cmluZyk6IFdlYkdMU2hhZGVyIHtcbiAgY29uc3QgZnJhZ21lbnRTaGFkZXI6IFdlYkdMU2hhZGVyID0gdGhyb3dJZk51bGw8V2ViR0xTaGFkZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZVNoYWRlcihnbC5GUkFHTUVOVF9TSEFERVIpLFxuICAgICAgJ1VuYWJsZSB0byBjcmVhdGUgZnJhZ21lbnQgV2ViR0xTaGFkZXIuJyk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuc2hhZGVyU291cmNlKGZyYWdtZW50U2hhZGVyLCBmcmFnbWVudFNoYWRlclNvdXJjZSkpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmNvbXBpbGVTaGFkZXIoZnJhZ21lbnRTaGFkZXIpKTtcbiAgaWYgKGVudigpLmdldCgnRU5HSU5FX0NPTVBJTEVfT05MWScpKSB7XG4gICAgcmV0dXJuIGZyYWdtZW50U2hhZGVyO1xuICB9XG4gIGlmIChnbC5nZXRTaGFkZXJQYXJhbWV0ZXIoZnJhZ21lbnRTaGFkZXIsIGdsLkNPTVBJTEVfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICBsb2dTaGFkZXJTb3VyY2VBbmRJbmZvTG9nKFxuICAgICAgICBmcmFnbWVudFNoYWRlclNvdXJjZSwgZ2wuZ2V0U2hhZGVySW5mb0xvZyhmcmFnbWVudFNoYWRlcikpO1xuICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvbXBpbGUgZnJhZ21lbnQgc2hhZGVyLicpO1xuICB9XG4gIHJldHVybiBmcmFnbWVudFNoYWRlcjtcbn1cblxuY29uc3QgbGluZU51bWJlclJlZ2V4ID0gL0VSUk9SOiBbMC05XSs6KFswLTldKyk6L2c7XG5leHBvcnQgZnVuY3Rpb24gbG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhcbiAgICBzaGFkZXJTb3VyY2U6IHN0cmluZywgc2hhZGVySW5mb0xvZzogc3RyaW5nKSB7XG4gIGNvbnN0IGxpbmVOdW1iZXJSZWdleFJlc3VsdCA9IGxpbmVOdW1iZXJSZWdleC5leGVjKHNoYWRlckluZm9Mb2cpO1xuICBpZiAobGluZU51bWJlclJlZ2V4UmVzdWx0ID09IG51bGwpIHtcbiAgICBjb25zb2xlLmxvZyhgQ291bGRuJ3QgcGFyc2UgbGluZSBudW1iZXIgaW4gZXJyb3I6ICR7c2hhZGVySW5mb0xvZ31gKTtcbiAgICBjb25zb2xlLmxvZyhzaGFkZXJTb3VyY2UpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGNvbnN0IGxpbmVOdW1iZXIgPSArbGluZU51bWJlclJlZ2V4UmVzdWx0WzFdO1xuXG4gIGNvbnN0IHNoYWRlckxpbmVzID0gc2hhZGVyU291cmNlLnNwbGl0KCdcXG4nKTtcbiAgY29uc3QgcGFkID0gc2hhZGVyTGluZXMubGVuZ3RoLnRvU3RyaW5nKCkubGVuZ3RoICsgMjtcbiAgY29uc3QgbGluZXNXaXRoTGluZU51bWJlcnMgPSBzaGFkZXJMaW5lcy5tYXAoXG4gICAgICAobGluZSwgbGluZU51bWJlcikgPT5cbiAgICAgICAgICB1dGlsLnJpZ2h0UGFkKChsaW5lTnVtYmVyICsgMSkudG9TdHJpbmcoKSwgcGFkKSArIGxpbmUpO1xuICBsZXQgbWF4TGluZUxlbmd0aCA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXNXaXRoTGluZU51bWJlcnMubGVuZ3RoOyBpKyspIHtcbiAgICBtYXhMaW5lTGVuZ3RoID0gTWF0aC5tYXgobGluZXNXaXRoTGluZU51bWJlcnNbaV0ubGVuZ3RoLCBtYXhMaW5lTGVuZ3RoKTtcbiAgfVxuXG4gIGNvbnN0IGJlZm9yZUVycm9yTGluZXMgPSBsaW5lc1dpdGhMaW5lTnVtYmVycy5zbGljZSgwLCBsaW5lTnVtYmVyIC0gMSk7XG4gIGNvbnN0IGVycm9yTGluZSA9IGxpbmVzV2l0aExpbmVOdW1iZXJzLnNsaWNlKGxpbmVOdW1iZXIgLSAxLCBsaW5lTnVtYmVyKTtcbiAgY29uc3QgYWZ0ZXJFcnJvckxpbmVzID0gbGluZXNXaXRoTGluZU51bWJlcnMuc2xpY2UobGluZU51bWJlcik7XG5cbiAgY29uc29sZS5sb2coYmVmb3JlRXJyb3JMaW5lcy5qb2luKCdcXG4nKSk7XG4gIGNvbnNvbGUubG9nKHNoYWRlckluZm9Mb2cuc3BsaXQoJ1xcbicpWzBdKTtcbiAgY29uc29sZS5sb2coXG4gICAgICBgJWMgJHt1dGlsLnJpZ2h0UGFkKGVycm9yTGluZVswXSwgbWF4TGluZUxlbmd0aCl9YCxcbiAgICAgICdib3JkZXI6MXB4IHNvbGlkIHJlZDsgYmFja2dyb3VuZC1jb2xvcjojZTNkMmQyOyBjb2xvcjojYTYxNzE3Jyk7XG4gIGNvbnNvbGUubG9nKGFmdGVyRXJyb3JMaW5lcy5qb2luKCdcXG4nKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTFByb2dyYW0ge1xuICByZXR1cm4gdGhyb3dJZk51bGw8V2ViR0xQcm9ncmFtPihcbiAgICAgIGdsLCAoKSA9PiBnbC5jcmVhdGVQcm9ncmFtKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMUHJvZ3JhbS4nKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGxpbmtQcm9ncmFtKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSkge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pKTtcbiAgaWYgKGVudigpLmdldCgnRU5HSU5FX0NPTVBJTEVfT05MWScpKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlmIChnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSA9PT0gZmFsc2UpIHtcbiAgICBjb25zb2xlLmxvZyhnbC5nZXRQcm9ncmFtSW5mb0xvZyhwcm9ncmFtKSk7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbGluayB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHZhbGlkYXRlUHJvZ3JhbShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBXZWJHTFByb2dyYW0pIHtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC52YWxpZGF0ZVByb2dyYW0ocHJvZ3JhbSkpO1xuICBpZiAoZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihwcm9ncmFtLCBnbC5WQUxJREFURV9TVEFUVVMpID09PSBmYWxzZSkge1xuICAgIGNvbnNvbGUubG9nKGdsLmdldFByb2dyYW1JbmZvTG9nKHByb2dyYW0pKTtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRlciBwcm9ncmFtIHZhbGlkYXRpb24gZmFpbGVkLicpO1xuICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTdGF0aWNWZXJ0ZXhCdWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZGF0YTogRmxvYXQzMkFycmF5KTogV2ViR0xCdWZmZXIge1xuICBjb25zdCBidWZmZXI6IFdlYkdMQnVmZmVyID0gdGhyb3dJZk51bGw8V2ViR0xCdWZmZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZUJ1ZmZlcigpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEJ1ZmZlcicpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuQVJSQVlfQlVGRkVSLCBidWZmZXIpKTtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5idWZmZXJEYXRhKGdsLkFSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpKTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIGRhdGE6IFVpbnQxNkFycmF5KTogV2ViR0xCdWZmZXIge1xuICBjb25zdCBidWZmZXI6IFdlYkdMQnVmZmVyID0gdGhyb3dJZk51bGw8V2ViR0xCdWZmZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZUJ1ZmZlcigpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTEJ1ZmZlcicpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRCdWZmZXIoZ2wuRUxFTUVOVF9BUlJBWV9CVUZGRVIsIGJ1ZmZlcikpO1xuICBjYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wuYnVmZmVyRGF0YShnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgZGF0YSwgZ2wuU1RBVElDX0RSQVcpKTtcbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE51bUNoYW5uZWxzKCk6IG51bWJlciB7XG4gIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSA9PT0gMikge1xuICAgIHJldHVybiAxO1xuICB9XG4gIHJldHVybiA0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVGV4dHVyZShnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTogV2ViR0xUZXh0dXJlIHtcbiAgcmV0dXJuIHRocm93SWZOdWxsPFdlYkdMVGV4dHVyZT4oXG4gICAgICBnbCwgKCkgPT4gZ2wuY3JlYXRlVGV4dHVyZSgpLCAnVW5hYmxlIHRvIGNyZWF0ZSBXZWJHTFRleHR1cmUuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZVRleHR1cmVTaXplKHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyKSB7XG4gIGNvbnN0IG1heFRleHR1cmVTaXplID0gZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9NQVhfVEVYVFVSRV9TSVpFJyk7XG4gIGlmICgod2lkdGggPD0gMCkgfHwgKGhlaWdodCA8PSAwKSkge1xuICAgIGNvbnN0IHJlcXVlc3RlZCA9IGBbJHt3aWR0aH14JHtoZWlnaHR9XWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdSZXF1ZXN0ZWQgdGV4dHVyZSBzaXplICcgKyByZXF1ZXN0ZWQgKyAnIGlzIGludmFsaWQuJyk7XG4gIH1cbiAgaWYgKCh3aWR0aCA+IG1heFRleHR1cmVTaXplKSB8fCAoaGVpZ2h0ID4gbWF4VGV4dHVyZVNpemUpKSB7XG4gICAgY29uc3QgcmVxdWVzdGVkID0gYFske3dpZHRofXgke2hlaWdodH1dYDtcbiAgICBjb25zdCBtYXggPSBgWyR7bWF4VGV4dHVyZVNpemV9eCR7bWF4VGV4dHVyZVNpemV9XWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmVxdWVzdGVkIHRleHR1cmUgc2l6ZSAnICsgcmVxdWVzdGVkICtcbiAgICAgICAgJyBncmVhdGVyIHRoYW4gV2ViR0wgbWF4aW11bSBvbiB0aGlzIGJyb3dzZXIgLyBHUFUgJyArIG1heCArICcuJyk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUZyYW1lYnVmZmVyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpOiBXZWJHTEZyYW1lYnVmZmVyIHtcbiAgcmV0dXJuIHRocm93SWZOdWxsPFdlYkdMRnJhbWVidWZmZXI+KFxuICAgICAgZ2wsICgpID0+IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCksICdVbmFibGUgdG8gY3JlYXRlIFdlYkdMRnJhbWVidWZmZXIuJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSwgYXR0cmlidXRlOiBzdHJpbmcsXG4gICAgYnVmZmVyOiBXZWJHTEJ1ZmZlciwgYXJyYXlFbnRyaWVzUGVySXRlbTogbnVtYmVyLCBpdGVtU3RyaWRlSW5CeXRlczogbnVtYmVyLFxuICAgIGl0ZW1PZmZzZXRJbkJ5dGVzOiBudW1iZXIpOiBib29sZWFuIHtcbiAgY29uc3QgbG9jID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24ocHJvZ3JhbSwgYXR0cmlidXRlKTtcbiAgaWYgKGxvYyA9PT0gLTEpIHtcbiAgICAvLyBUaGUgR1BVIGNvbXBpbGVyIGRlY2lkZWQgdG8gc3RyaXAgb3V0IHRoaXMgYXR0cmlidXRlIGJlY2F1c2UgaXQncyB1bnVzZWQsXG4gICAgLy8gdGh1cyBubyBuZWVkIHRvIGJpbmQuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIGJ1ZmZlcikpO1xuICBjYWxsQW5kQ2hlY2soXG4gICAgICBnbCxcbiAgICAgICgpID0+IGdsLnZlcnRleEF0dHJpYlBvaW50ZXIoXG4gICAgICAgICAgbG9jLCBhcnJheUVudHJpZXNQZXJJdGVtLCBnbC5GTE9BVCwgZmFsc2UsIGl0ZW1TdHJpZGVJbkJ5dGVzLFxuICAgICAgICAgIGl0ZW1PZmZzZXRJbkJ5dGVzKSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZW5hYmxlVmVydGV4QXR0cmliQXJyYXkobG9jKSk7XG4gIHJldHVybiB0cnVlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZFRleHR1cmVVbml0KFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgdGV4dHVyZVVuaXQ6IG51bWJlcikge1xuICB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIHRleHR1cmVVbml0KSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdW5iaW5kVGV4dHVyZVVuaXQoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZVVuaXQ6IG51bWJlcikge1xuICB2YWxpZGF0ZVRleHR1cmVVbml0KGdsLCB0ZXh0dXJlVW5pdCk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYWN0aXZlVGV4dHVyZShnbC5URVhUVVJFMCArIHRleHR1cmVVbml0KSk7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbk9yVGhyb3coXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcHJvZ3JhbTogV2ViR0xQcm9ncmFtLFxuICAgIHVuaWZvcm1OYW1lOiBzdHJpbmcpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XG4gIHJldHVybiB0aHJvd0lmTnVsbDxXZWJHTFVuaWZvcm1Mb2NhdGlvbj4oXG4gICAgICBnbCwgKCkgPT4gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lKSxcbiAgICAgICd1bmlmb3JtIFwiJyArIHVuaWZvcm1OYW1lICsgJ1wiIG5vdCBwcmVzZW50IGluIHByb2dyYW0uJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcm9ncmFtVW5pZm9ybUxvY2F0aW9uKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHByb2dyYW06IFdlYkdMUHJvZ3JhbSxcbiAgICB1bmlmb3JtTmFtZTogc3RyaW5nKTogV2ViR0xVbmlmb3JtTG9jYXRpb24ge1xuICByZXR1cm4gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRUZXh0dXJlVG9Qcm9ncmFtVW5pZm9ybVNhbXBsZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgdGV4dHVyZTogV2ViR0xUZXh0dXJlLFxuICAgIHVuaWZvcm1TYW1wbGVyTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uLCB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gIGNhbGxBbmRDaGVjayhnbCwgKCkgPT4gYmluZFRleHR1cmVVbml0KGdsLCB0ZXh0dXJlLCB0ZXh0dXJlVW5pdCkpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnVuaWZvcm0xaSh1bmlmb3JtU2FtcGxlckxvY2F0aW9uLCB0ZXh0dXJlVW5pdCkpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYmluZENhbnZhc1RvRnJhbWVidWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCkge1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCkpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnZpZXdwb3J0KDAsIDAsIGdsLmNhbnZhcy53aWR0aCwgZ2wuY2FudmFzLmhlaWdodCkpO1xuICBjYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLnNjaXNzb3IoMCwgMCwgZ2wuY2FudmFzLndpZHRoLCBnbC5jYW52YXMuaGVpZ2h0KSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBiaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgZnJhbWVidWZmZXI6IFdlYkdMRnJhbWVidWZmZXIpIHtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyKSk7XG4gIGNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICAgICAgZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCB0ZXh0dXJlLCAwKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1bmJpbmRDb2xvclRleHR1cmVGcm9tRnJhbWVidWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZnJhbWVidWZmZXI6IFdlYkdMRnJhbWVidWZmZXIpIHtcbiAgY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyKSk7XG4gIGNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICAgICAgZ2wuRlJBTUVCVUZGRVIsIGdsLkNPTE9SX0FUVEFDSE1FTlQwLCBnbC5URVhUVVJFXzJELCBudWxsLCAwKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUZyYW1lYnVmZmVyKGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgY29uc3Qgc3RhdHVzID0gZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyhnbC5GUkFNRUJVRkZFUik7XG4gIGlmIChzdGF0dXMgIT09IGdsLkZSQU1FQlVGRkVSX0NPTVBMRVRFKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnRXJyb3IgYmluZGluZyBmcmFtZWJ1ZmZlcjogJyArIGdldEZyYW1lYnVmZmVyRXJyb3JNZXNzYWdlKGdsLCBzdGF0dXMpKTtcbiAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RnJhbWVidWZmZXJFcnJvck1lc3NhZ2UoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgc3RhdHVzOiBudW1iZXIpOiBzdHJpbmcge1xuICBzd2l0Y2ggKHN0YXR1cykge1xuICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9BVFRBQ0hNRU5UOlxuICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9JTkNPTVBMRVRFX0FUVEFDSE1FTlQnO1xuICAgIGNhc2UgZ2wuRlJBTUVCVUZGRVJfSU5DT01QTEVURV9NSVNTSU5HX0FUVEFDSE1FTlQ6XG4gICAgICByZXR1cm4gJ0ZSQU1FQlVGRkVSX0lOQ09NUExFVEVfTUlTU0lOR19BVFRBQ0hNRU5UJztcbiAgICBjYXNlIGdsLkZSQU1FQlVGRkVSX0lOQ09NUExFVEVfRElNRU5TSU9OUzpcbiAgICAgIHJldHVybiAnRlJBTUVCVUZGRVJfSU5DT01QTEVURV9ESU1FTlNJT05TJztcbiAgICBjYXNlIGdsLkZSQU1FQlVGRkVSX1VOU1VQUE9SVEVEOlxuICAgICAgcmV0dXJuICdGUkFNRUJVRkZFUl9VTlNVUFBPUlRFRCc7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBgdW5rbm93biBlcnJvciAke3N0YXR1c31gO1xuICB9XG59XG5cbmZ1bmN0aW9uIHRocm93SWZOdWxsPFQ+KFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHJldHVyblRPck51bGw6ICgpID0+IFQgfCBudWxsLFxuICAgIGZhaWx1cmVNZXNzYWdlOiBzdHJpbmcpOiBUIHtcbiAgY29uc3QgdE9yTnVsbDogVHxudWxsID0gY2FsbEFuZENoZWNrKGdsLCAoKSA9PiByZXR1cm5UT3JOdWxsKCkpO1xuICBpZiAodE9yTnVsbCA9PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGZhaWx1cmVNZXNzYWdlKTtcbiAgfVxuICByZXR1cm4gdE9yTnVsbDtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVUZXh0dXJlVW5pdChnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlVW5pdDogbnVtYmVyKSB7XG4gIGNvbnN0IG1heFRleHR1cmVVbml0ID0gZ2wuTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFMgLSAxO1xuICBjb25zdCBnbFRleHR1cmVVbml0ID0gdGV4dHVyZVVuaXQgKyBnbC5URVhUVVJFMDtcbiAgaWYgKGdsVGV4dHVyZVVuaXQgPCBnbC5URVhUVVJFMCB8fCBnbFRleHR1cmVVbml0ID4gbWF4VGV4dHVyZVVuaXQpIHtcbiAgICBjb25zdCB0ZXh0dXJlVW5pdFJhbmdlID0gYFtnbC5URVhUVVJFMCwgZ2wuVEVYVFVSRSR7bWF4VGV4dHVyZVVuaXR9XWA7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB0ZXh0dXJlVW5pdCBtdXN0IGJlIGluICR7dGV4dHVyZVVuaXRSYW5nZX0uYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEJhdGNoRGltKHNoYXBlOiBudW1iZXJbXSwgZGltc1RvU2tpcCA9IDIpOiBudW1iZXIge1xuICByZXR1cm4gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlLnNsaWNlKDAsIHNoYXBlLmxlbmd0aCAtIGRpbXNUb1NraXApKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFJvd3NDb2xzKHNoYXBlOiBudW1iZXJbXSk6IFtudW1iZXIsIG51bWJlcl0ge1xuICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBnZXQgcm93cyBhbmQgY29sdW1ucyBvZiBhbiBlbXB0eSBzaGFwZSBhcnJheS4nKTtcbiAgfVxuXG4gIHJldHVybiBbXG4gICAgc2hhcGUubGVuZ3RoID4gMSA/IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdIDogMSwgc2hhcGVbc2hhcGUubGVuZ3RoIC0gMV1cbiAgXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNoYXBlQXMzRChzaGFwZTogbnVtYmVyW10pOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0ge1xuICBsZXQgc2hhcGVBczNEOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMSwgMV07XG4gIGNvbnN0IGlzU2NhbGFyID0gc2hhcGUubGVuZ3RoID09PSAwIHx8IChzaGFwZS5sZW5ndGggPT09IDEgJiYgc2hhcGVbMF0gPT09IDEpO1xuICBpZiAoIWlzU2NhbGFyKSB7XG4gICAgc2hhcGVBczNEID1cbiAgICAgICAgW2dldEJhdGNoRGltKHNoYXBlKSwgLi4uZ2V0Um93c0NvbHMoc2hhcGUpXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIH1cbiAgcmV0dXJuIHNoYXBlQXMzRDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUoXG4gICAgbG9nU2hhcGU6IG51bWJlcltdLCBpc1BhY2tlZCA9IGZhbHNlKTogW251bWJlciwgbnVtYmVyXSB7XG4gIGxldCBtYXhUZXhTaXplID0gZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9NQVhfVEVYVFVSRV9TSVpFJyk7XG4gIGxldCBtYXhTaXplRm9yTmFycm93VGV4ID1cbiAgICAgIGVudigpLmdldE51bWJlcignV0VCR0xfTUFYX1NJWkVfRk9SX05BUlJPV19URVhUVVJFJyk7XG4gIGlmIChtYXhTaXplRm9yTmFycm93VGV4ID09PSBJbmZpbml0eSAmJlxuICAgICAgZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQVVUT19TUVVBUklGWV9OQVJST1dfVEVYVFVSRV9TSEFQRScpKSB7XG4gICAgbWF4U2l6ZUZvck5hcnJvd1RleCA9IG1heFRleFNpemUgLyAyO1xuICB9XG5cbiAgaWYgKGlzUGFja2VkKSB7XG4gICAgbWF4VGV4U2l6ZSA9IG1heFRleFNpemUgKiAyO1xuICAgIG1heFNpemVGb3JOYXJyb3dUZXggPSBtYXhTaXplRm9yTmFycm93VGV4ICogMjtcblxuICAgIC8vIFRoaXMgbG9naWMgZW5zdXJlcyB3ZSBhY2N1cmF0ZWx5IGNvdW50IHRoZSBudW1iZXIgb2YgcGFja2VkIHRleGVscyBuZWVkZWRcbiAgICAvLyB0byBhY2NvbW1vZGF0ZSB0aGUgdGVuc29yLiBXZSBjYW4gb25seSBwYWNrIHZhbHVlcyBpbiB0aGUgc2FtZSB0ZXhlbCBpZlxuICAgIC8vIHRoZXkgYXJlIGZyb20gYWRqYWNlbnQgcGFpcnMgb2Ygcm93cy9jb2xzIHdpdGhpbiB0aGUgc2FtZSBiYXRjaC4gU28gaWYgYVxuICAgIC8vIHRlbnNvciBoYXMgMyByb3dzLCB3ZSBwcmV0ZW5kIGl0IGhhcyA0IHJvd3MgaW4gb3JkZXIgdG8gYWNjb3VudCBmb3IgdGhlXG4gICAgLy8gZmFjdCB0aGF0IHRoZSB0ZXhlbHMgY29udGFpbmluZyB0aGUgdGhpcmQgcm93IGFyZSBoYWxmIGVtcHR5LlxuICAgIGxvZ1NoYXBlID0gbG9nU2hhcGUubWFwKFxuICAgICAgICAoZCwgaSkgPT4gaSA+PSBsb2dTaGFwZS5sZW5ndGggLSAyID9cbiAgICAgICAgICAgIHV0aWwubmVhcmVzdExhcmdlckV2ZW4obG9nU2hhcGVbaV0pIDpcbiAgICAgICAgICAgIGxvZ1NoYXBlW2ldKTtcblxuICAgIC8vIFBhY2tlZCB0ZXh0dXJlIGhlaWdodCBpcyBhdCBsZWFzdCAyICh0aGUgY2hhbm5lbCBoZWlnaHQgb2YgYSBzaW5nbGVcbiAgICAvLyB0ZXhlbCkuXG4gICAgaWYgKGxvZ1NoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgICAgbG9nU2hhcGUgPSBbMiwgbG9nU2hhcGVbMF1dO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIGxvZ2ljYWwgc2hhcGUgaXMgMiwgd2UgZG9uJ3Qgc3F1ZWV6ZSwgc2luY2Ugd2Ugd2FudCB0byBtYXRjaCBwaHlzaWNhbC5cbiAgaWYgKGxvZ1NoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgIGNvbnN0IHNxdWVlemVSZXN1bHQgPSB1dGlsLnNxdWVlemVTaGFwZShsb2dTaGFwZSk7XG4gICAgbG9nU2hhcGUgPSBzcXVlZXplUmVzdWx0Lm5ld1NoYXBlO1xuICB9XG5cbiAgbGV0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUobG9nU2hhcGUpO1xuICBsZXQgdGV4dHVyZVNoYXBlOiBbbnVtYmVyLCBudW1iZXJdID0gbnVsbDtcbiAgaWYgKGxvZ1NoYXBlLmxlbmd0aCA8PSAxICYmIHNpemUgPD0gbWF4VGV4U2l6ZSkge1xuICAgIHRleHR1cmVTaGFwZSA9IFsxLCBzaXplXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gMiAmJiBsb2dTaGFwZVswXSA8PSBtYXhUZXhTaXplICYmXG4gICAgICBsb2dTaGFwZVsxXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgdGV4dHVyZVNoYXBlID0gbG9nU2hhcGUgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgfSBlbHNlIGlmIChcbiAgICAgIGxvZ1NoYXBlLmxlbmd0aCA9PT0gMyAmJiBsb2dTaGFwZVswXSAqIGxvZ1NoYXBlWzFdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzJdIDw9IG1heFRleFNpemUpIHtcbiAgICB0ZXh0dXJlU2hhcGUgPSBbbG9nU2hhcGVbMF0gKiBsb2dTaGFwZVsxXSwgbG9nU2hhcGVbMl1dO1xuICB9IGVsc2UgaWYgKFxuICAgICAgbG9nU2hhcGUubGVuZ3RoID09PSAzICYmIGxvZ1NoYXBlWzBdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gPD0gbWF4VGV4U2l6ZSkge1xuICAgIHRleHR1cmVTaGFwZSA9IFtsb2dTaGFwZVswXSwgbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXV07XG4gIH0gZWxzZSBpZiAoXG4gICAgICBsb2dTaGFwZS5sZW5ndGggPT09IDQgJiZcbiAgICAgIGxvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXSA8PSBtYXhUZXhTaXplICYmXG4gICAgICBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgdGV4dHVyZVNoYXBlID0gW2xvZ1NoYXBlWzBdICogbG9nU2hhcGVbMV0gKiBsb2dTaGFwZVsyXSwgbG9nU2hhcGVbM11dO1xuICB9IGVsc2UgaWYgKFxuICAgICAgbG9nU2hhcGUubGVuZ3RoID09PSA0ICYmIGxvZ1NoYXBlWzBdIDw9IG1heFRleFNpemUgJiZcbiAgICAgIGxvZ1NoYXBlWzFdICogbG9nU2hhcGVbMl0gKiBsb2dTaGFwZVszXSA8PSBtYXhUZXhTaXplKSB7XG4gICAgdGV4dHVyZVNoYXBlID0gW2xvZ1NoYXBlWzBdLCBsb2dTaGFwZVsxXSAqIGxvZ1NoYXBlWzJdICogbG9nU2hhcGVbM11dO1xuICB9XG5cbiAgLy8gdHJ1ZSBpZiBvbmUgZWRnZSBsZW5ndGggaXMgMSAoMSBvciAyLCBpZiBwYWNrZWQpLCB3aGlsZSBhbm90aGVyIGVkZ2VcbiAgLy8gbGVuZ3RoIGV4Y2VlZHMgbWF4U2l6ZUZvck5hcnJvd1RleC5cbiAgY29uc3QgaXNMb25nTmFycm93VGV4ID0gdGV4dHVyZVNoYXBlICE9IG51bGwgJiZcbiAgICAgIE1hdGgubWF4KC4uLnRleHR1cmVTaGFwZSkgPiBtYXhTaXplRm9yTmFycm93VGV4ICYmXG4gICAgICBNYXRoLm1pbiguLi50ZXh0dXJlU2hhcGUpIDw9IChpc1BhY2tlZCA/IDIgOiAxKSAmJlxuICAgICAgTWF0aC5taW4oLi4udGV4dHVyZVNoYXBlKSA+IDA7XG5cbiAgaWYgKHRleHR1cmVTaGFwZSA9PSBudWxsIHx8IGlzTG9uZ05hcnJvd1RleCkge1xuICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgLy8gRm9yIHBhY2tlZCB0ZXh0dXJlcyBzaXplIGVxdWFscyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIHRvXG4gICAgICAvLyBhY2NvbW1vZGF0ZSB0aGUgdGV4dHVyZSBkYXRhLiBIb3dldmVyIGluIG9yZGVyIHRvIHNxdWFyaWZ5IHN1Y2ggdGhhdFxuICAgICAgLy8gaW5uZXIgZGltZW5zaW9ucyBzdGF5IGV2ZW4sIHdlIHJld3JpdGUgc2l6ZSB0byBlcXVhbCB0aGUgbnVtYmVyIG9mXG4gICAgICAvLyB0ZXhlbHMuIFRoZW4gaW4gdGhlIHJldHVybiBzdGF0ZW1lbnQgd2UgcmVoeWRyYXRlIHRoZSBzcXVhcmlmaWVkXG4gICAgICAvLyBkaW1lbnNpb25zIHRvIGNoYW5uZWwgdW5pdHMuXG5cbiAgICAgIGNvbnN0IGJhdGNoRGltID0gZ2V0QmF0Y2hEaW0obG9nU2hhcGUpO1xuICAgICAgbGV0IHJvd3MgPSAyLCBjb2xzID0gMjtcbiAgICAgIGlmIChsb2dTaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgW3Jvd3MsIGNvbHNdID0gZ2V0Um93c0NvbHMobG9nU2hhcGUpO1xuICAgICAgfVxuICAgICAgc2l6ZSA9IGJhdGNoRGltICogKHJvd3MgLyAyKSAqIChjb2xzIC8gMik7XG4gICAgICB0ZXh0dXJlU2hhcGUgPVxuICAgICAgICAgIHV0aWwuc2l6ZVRvU3F1YXJpc2hTaGFwZShzaXplKS5tYXAoZCA9PiBkICogMikgYXMgW251bWJlciwgbnVtYmVyXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGV4dHVyZVNoYXBlID0gdXRpbC5zaXplVG9TcXVhcmlzaFNoYXBlKHNpemUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0ZXh0dXJlU2hhcGU7XG59XG5cbmZ1bmN0aW9uIGlzRXZlbihuOiBudW1iZXIpOiBib29sZWFuIHtcbiAgcmV0dXJuIG4gJSAyID09PSAwO1xufVxuXG4vKipcbiAqIFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIHJlc2hhcGluZyBhIHBhY2tlZCB0ZXh0dXJlIHJlcXVpcmVzIHJlYXJyYW5naW5nXG4gKiB0aGUgZGF0YSB3aXRoaW4gdGhlIHRleHR1cmUsIGFzc3VtaW5nIDJ4MiBwYWNraW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNSZXNoYXBlRnJlZShzaGFwZTE6IG51bWJlcltdLCBzaGFwZTI6IG51bWJlcltdKTogYm9vbGVhbiB7XG4gIHNoYXBlMSA9IHNoYXBlMS5zbGljZSgtMik7XG4gIHNoYXBlMiA9IHNoYXBlMi5zbGljZSgtMik7XG5cbiAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUxLCBzaGFwZTIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBpZiAoIXNoYXBlMS5sZW5ndGggfHwgIXNoYXBlMi5sZW5ndGgpIHsgIC8vIE9uZSBvZiB0aGUgc2hhcGVzIGlzIGEgc2NhbGFyLlxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgaWYgKHNoYXBlMVswXSA9PT0gMCB8fCBzaGFwZTFbMV0gPT09IDAgfHwgc2hhcGUyWzBdID09PSAwIHx8XG4gICAgICBzaGFwZTJbMV0gPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGlmIChzaGFwZTEubGVuZ3RoICE9PSBzaGFwZTIubGVuZ3RoKSB7ICAvLyBPbmUgb2YgdGhlIHNoYXBlcyBpcyBhIHZlY3Rvci5cbiAgICBjb25zdCBzaGFwZTFDb2xzID0gc2hhcGUxLnNsaWNlKC0xKVswXTtcbiAgICBjb25zdCBzaGFwZTJDb2xzID0gc2hhcGUyLnNsaWNlKC0xKVswXTtcbiAgICBpZiAoc2hhcGUxQ29scyA9PT0gc2hhcGUyQ29scykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgaWYgKGlzRXZlbihzaGFwZTFDb2xzKSAmJiBpc0V2ZW4oc2hhcGUyQ29scykgJiZcbiAgICAgICAgKHNoYXBlMVswXSA9PT0gMSB8fCBzaGFwZTJbMF0gPT09IDEpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNoYXBlMVsxXSA9PT0gc2hhcGUyWzFdICYmIGlzRXZlbihzaGFwZTFbMF0pICYmIGlzRXZlbihzaGFwZTJbMF0pO1xufVxuXG4vLyBXZSBjYWNoZSB3ZWJnbCBwYXJhbXMgYmVjYXVzZSB0aGUgZW52aXJvbm1lbnQgZ2V0cyByZXNldCBiZXR3ZWVuXG4vLyB1bml0IHRlc3RzIGFuZCB3ZSBkb24ndCB3YW50IHRvIGNvbnN0YW50bHkgcXVlcnkgdGhlIFdlYkdMQ29udGV4dCBmb3Jcbi8vIE1BWF9URVhUVVJFX1NJWkUuXG5sZXQgTUFYX1RFWFRVUkVfU0laRTogbnVtYmVyO1xubGV0IE1BWF9URVhUVVJFU19JTl9TSEFERVI6IG51bWJlcjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMTWF4VGV4dHVyZVNpemUod2ViR0xWZXJzaW9uOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoTUFYX1RFWFRVUkVfU0laRSA9PSBudWxsKSB7XG4gICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBNQVhfVEVYVFVSRV9TSVpFID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX1NJWkUpO1xuICB9XG4gIHJldHVybiBNQVhfVEVYVFVSRV9TSVpFO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVzZXRNYXhUZXh0dXJlU2l6ZSgpIHtcbiAgTUFYX1RFWFRVUkVfU0laRSA9IG51bGw7XG59XG5leHBvcnQgZnVuY3Rpb24gcmVzZXRNYXhUZXh0dXJlc0luU2hhZGVyKCkge1xuICBNQVhfVEVYVFVSRVNfSU5fU0hBREVSID0gbnVsbDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldE1heFRleHR1cmVzSW5TaGFkZXIod2ViR0xWZXJzaW9uOiBudW1iZXIpOiBudW1iZXIge1xuICBpZiAoTUFYX1RFWFRVUkVTX0lOX1NIQURFUiA9PSBudWxsKSB7XG4gICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBNQVhfVEVYVFVSRVNfSU5fU0hBREVSID0gZ2wuZ2V0UGFyYW1ldGVyKGdsLk1BWF9URVhUVVJFX0lNQUdFX1VOSVRTKTtcbiAgfVxuICAvLyBXZSBjYXAgYXQgMTYgdG8gYXZvaWQgc3B1cmlvdXMgcnVudGltZSBcIm1lbW9yeSBleGhhdXN0ZWRcIiBlcnJvci5cbiAgcmV0dXJuIE1hdGgubWluKDE2LCBNQVhfVEVYVFVSRVNfSU5fU0hBREVSKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbih3ZWJHTFZlcnNpb246IG51bWJlcik6XG4gICAgbnVtYmVyIHtcbiAgaWYgKHdlYkdMVmVyc2lvbiA9PT0gMCkge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgbGV0IHF1ZXJ5VGltZXJWZXJzaW9uOiBudW1iZXI7XG4gIGNvbnN0IGdsID0gZ2V0V2ViR0xDb250ZXh0KHdlYkdMVmVyc2lvbik7XG5cbiAgaWYgKGhhc0V4dGVuc2lvbihnbCwgJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeV93ZWJnbDInKSAmJlxuICAgICAgd2ViR0xWZXJzaW9uID09PSAyKSB7XG4gICAgcXVlcnlUaW1lclZlcnNpb24gPSAyO1xuICB9IGVsc2UgaWYgKGhhc0V4dGVuc2lvbihnbCwgJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeScpKSB7XG4gICAgcXVlcnlUaW1lclZlcnNpb24gPSAxO1xuICB9IGVsc2Uge1xuICAgIHF1ZXJ5VGltZXJWZXJzaW9uID0gMDtcbiAgfVxuICByZXR1cm4gcXVlcnlUaW1lclZlcnNpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBoYXNFeHRlbnNpb24oZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgZXh0ZW5zaW9uTmFtZTogc3RyaW5nKSB7XG4gIGNvbnN0IGV4dCA9IGdsLmdldEV4dGVuc2lvbihleHRlbnNpb25OYW1lKTtcbiAgcmV0dXJuIGV4dCAhPSBudWxsO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNXZWJHTFZlcnNpb25FbmFibGVkKHdlYkdMVmVyc2lvbjogMXwyKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcbiAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICB9IGNhdGNoIChlKSB7XG4gICAgY29uc29sZS5sb2coJ0Vycm9yIHdoZW4gZ2V0dGluZyBXZWJHTCBjb250ZXh0OiAnLCBlKTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSh3ZWJHTFZlcnNpb246IG51bWJlcik6XG4gICAgYm9vbGVhbiB7XG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuXG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDEpIHtcbiAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ09FU190ZXh0dXJlX2Zsb2F0JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFoYXNFeHRlbnNpb24oZ2wsICdFWFRfY29sb3JfYnVmZmVyX2Zsb2F0JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBpc0ZyYW1lQnVmZmVyQ29tcGxldGUgPSBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihnbCk7XG4gIHJldHVybiBpc0ZyYW1lQnVmZmVyQ29tcGxldGU7XG59XG5cbi8qKlxuICogQ2hlY2sgaWYgd2UgY2FuIGRvd25sb2FkIHZhbHVlcyBmcm9tIGEgZmxvYXQvaGFsZi1mbG9hdCB0ZXh0dXJlLlxuICpcbiAqIE5vdGUgdGhhdCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSB1c2UgYmluZGluZyBhIHRleHR1cmUgdG8gYSBmcmFtZWJ1ZmZlclxuICogYXMgYSBwcm94eSBmb3IgYWJpbGl0eSB0byBkb3dubG9hZCBmbG9hdCB2YWx1ZXMgbGF0ZXIgdXNpbmcgcmVhZFBpeGVscy4gVGhlXG4gKiB0ZXh0dXJlIHBhcmFtcyBvZiB0aGlzIHRleHR1cmUgd2lsbCBub3QgbWF0Y2ggdGhvc2UgaW4gcmVhZFBpeGVscyBleGFjdGx5XG4gKiBidXQgaWYgd2UgYXJlIHVuYWJsZSB0byBiaW5kIHNvbWUga2luZCBvZiBmbG9hdCB0ZXh0dXJlIHRvIHRoZSBmcmFtZUJ1ZmZlclxuICogdGhlbiB3ZSBkZWZpbml0ZWx5IHdpbGwgbm90IGJlIGFibGUgdG8gcmVhZCBmbG9hdCB2YWx1ZXMgZnJvbSBpdC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRG93bmxvYWRGbG9hdFRleHR1cmVFbmFibGVkKHdlYkdMVmVyc2lvbjogbnVtYmVyKTogYm9vbGVhbiB7XG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBjb25zdCBnbCA9IGdldFdlYkdMQ29udGV4dCh3ZWJHTFZlcnNpb24pO1xuXG4gIGlmICh3ZWJHTFZlcnNpb24gPT09IDEpIHtcbiAgICBpZiAoIWhhc0V4dGVuc2lvbihnbCwgJ09FU190ZXh0dXJlX2Zsb2F0JykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKCFoYXNFeHRlbnNpb24oZ2wsICdXRUJHTF9jb2xvcl9idWZmZXJfZmxvYXQnKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoaGFzRXh0ZW5zaW9uKGdsLCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcpKSB7XG4gICAgICByZXR1cm4gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wpO1xuICAgIH1cblxuICAgIGNvbnN0IENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUID0gJ0VYVF9jb2xvcl9idWZmZXJfaGFsZl9mbG9hdCc7XG4gICAgaWYgKGhhc0V4dGVuc2lvbihnbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpKSB7XG4gICAgICBjb25zdCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICBnbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpO1xuICAgICAgcmV0dXJuIGNyZWF0ZUhhbGZGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihcbiAgICAgICAgICBnbCwgdGV4dHVyZUhhbGZGbG9hdEV4dGVuc2lvbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID0gY3JlYXRlRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoZ2wpO1xuICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVGbG9hdFRleHR1cmVBbmRCaW5kVG9GcmFtZWJ1ZmZlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTpcbiAgICBib29sZWFuIHtcbiAgY29uc3QgdGV4Q29uZmlnID0gZ2V0VGV4dHVyZUNvbmZpZyhnbCk7XG5cbiAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG5cbiAgY29uc3Qgd2lkdGggPSAxO1xuICBjb25zdCBoZWlnaHQgPSAxO1xuICBnbC50ZXhJbWFnZTJEKFxuICAgICAgZ2wuVEVYVFVSRV8yRCwgMCwgdGV4Q29uZmlnLmludGVybmFsRm9ybWF0RmxvYXQsIHdpZHRoLCBoZWlnaHQsIDAsXG4gICAgICB0ZXhDb25maWcudGV4dHVyZUZvcm1hdEZsb2F0LCB0ZXhDb25maWcudGV4dHVyZVR5cGVGbG9hdCwgbnVsbCk7XG5cbiAgY29uc3QgZnJhbWVCdWZmZXIgPSBnbC5jcmVhdGVGcmFtZWJ1ZmZlcigpO1xuICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIGZyYW1lQnVmZmVyKTtcbiAgZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoXG4gICAgICBnbC5GUkFNRUJVRkZFUiwgZ2wuQ09MT1JfQVRUQUNITUVOVDAsIGdsLlRFWFRVUkVfMkQsIHRleHR1cmUsIDApO1xuXG4gIGNvbnN0IGlzRnJhbWVCdWZmZXJDb21wbGV0ZSA9XG4gICAgICBnbC5jaGVja0ZyYW1lYnVmZmVyU3RhdHVzKGdsLkZSQU1FQlVGRkVSKSA9PT0gZ2wuRlJBTUVCVUZGRVJfQ09NUExFVEU7XG5cbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgbnVsbCk7XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG4gIGdsLmRlbGV0ZVRleHR1cmUodGV4dHVyZSk7XG4gIGdsLmRlbGV0ZUZyYW1lYnVmZmVyKGZyYW1lQnVmZmVyKTtcblxuICByZXR1cm4gaXNGcmFtZUJ1ZmZlckNvbXBsZXRlO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVIYWxmRmxvYXRUZXh0dXJlQW5kQmluZFRvRnJhbWVidWZmZXIoXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb246IGFueSk6IGJvb2xlYW4ge1xuICBjb25zdCB0ZXhDb25maWcgPSBnZXRUZXh0dXJlQ29uZmlnKGdsLCB0ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKTtcbiAgY29uc3QgdGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSk7XG5cbiAgY29uc3Qgd2lkdGggPSAxO1xuICBjb25zdCBoZWlnaHQgPSAxO1xuICBnbC50ZXhJbWFnZTJEKFxuICAgICAgZ2wuVEVYVFVSRV8yRCwgMCwgdGV4Q29uZmlnLmludGVybmFsRm9ybWF0SGFsZkZsb2F0LCB3aWR0aCwgaGVpZ2h0LCAwLFxuICAgICAgdGV4Q29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgdGV4Q29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0LCBudWxsKTtcblxuICBjb25zdCBmcmFtZUJ1ZmZlciA9IGdsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7XG4gIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgZnJhbWVCdWZmZXIpO1xuICBnbC5mcmFtZWJ1ZmZlclRleHR1cmUyRChcbiAgICAgIGdsLkZSQU1FQlVGRkVSLCBnbC5DT0xPUl9BVFRBQ0hNRU5UMCwgZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSwgMCk7XG5cbiAgY29uc3QgaXNGcmFtZUJ1ZmZlckNvbXBsZXRlID1cbiAgICAgIGdsLmNoZWNrRnJhbWVidWZmZXJTdGF0dXMoZ2wuRlJBTUVCVUZGRVIpID09PSBnbC5GUkFNRUJVRkZFUl9DT01QTEVURTtcblxuICBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKTtcbiAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgZ2wuZGVsZXRlVGV4dHVyZSh0ZXh0dXJlKTtcbiAgZ2wuZGVsZXRlRnJhbWVidWZmZXIoZnJhbWVCdWZmZXIpO1xuXG4gIHJldHVybiBpc0ZyYW1lQnVmZmVyQ29tcGxldGU7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1dlYkdMRmVuY2VFbmFibGVkKHdlYkdMVmVyc2lvbjogbnVtYmVyKSB7XG4gIGlmICh3ZWJHTFZlcnNpb24gIT09IDIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQod2ViR0xWZXJzaW9uKTtcblxuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55XG4gIGNvbnN0IGlzRW5hYmxlZCA9IChnbCBhcyBhbnkpLmZlbmNlU3luYyAhPSBudWxsO1xuICByZXR1cm4gaXNFbmFibGVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm90Q29tcGxleChcbiAgICB0ZW5zb3I6IFRlbnNvckluZm98VGVuc29ySW5mb1tdLCBvcE5hbWU6IHN0cmluZyk6IHZvaWQge1xuICBpZiAoIUFycmF5LmlzQXJyYXkodGVuc29yKSkge1xuICAgIHRlbnNvciA9IFt0ZW5zb3JdO1xuICB9XG4gIHRlbnNvci5mb3JFYWNoKHQgPT4ge1xuICAgIGlmICh0ICE9IG51bGwpIHtcbiAgICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICAgIHQuZHR5cGUgIT09ICdjb21wbGV4NjQnLFxuICAgICAgICAgICgpID0+IGAke29wTmFtZX0gZG9lcyBub3Qgc3VwcG9ydCBjb21wbGV4NjQgdGVuc29ycyBgICtcbiAgICAgICAgICAgICAgJ2luIHRoZSBXZWJHTCBiYWNrZW5kLicpO1xuICAgIH1cbiAgfSk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { device_util, env } from '@tensorflow/tfjs-core';\nimport { getMaxTexturesInShader, getWebGLDisjointQueryTimerVersion, getWebGLMaxTextureSize, isCapableOfRenderingToFloatTexture, isDownloadFloatTextureEnabled, isWebGLFenceEnabled, isWebGLVersionEnabled } from './webgl_util';\nconst ENV = env();\n/**\n * This file contains WebGL-specific flag registrations.\n */\n/**\n * True if WebGL is supported.\n */\nENV.registerFlag('HAS_WEBGL', () => ENV.getNumber('WEBGL_VERSION') > 0);\n/** 0: No WebGL, 1: WebGL 1.0, 2: WebGL 2.0. */\nENV.registerFlag('WEBGL_VERSION', () => {\n    if (isWebGLVersionEnabled(2)) {\n        return 2;\n    }\n    else if (isWebGLVersionEnabled(1)) {\n        return 1;\n    }\n    return 0;\n});\n/** Whether to check for numerical representation problems. */\nENV.registerFlag('WEBGL_CHECK_NUMERICAL_PROBLEMS', () => false);\nENV.registerFlag('WEBGL_BUFFER_SUPPORTED', () => ENV.get('WEBGL_VERSION') === 2);\n/** Whether the WebGL backend will sometimes forward ops to the CPU. */\nENV.registerFlag('WEBGL_CPU_FORWARD', () => true);\n/** Whether the WebGL backend will always use f16 textures for rendering. */\nENV.registerFlag('WEBGL_FORCE_F16_TEXTURES', () => false);\n/** Whether to turn all packing related flags on. */\nENV.registerFlag('WEBGL_PACK', () => ENV.getBool('HAS_WEBGL'));\n/** Whether we will pack the batchnormalization op. */\nENV.registerFlag('WEBGL_PACK_NORMALIZATION', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack the clip op. */\nENV.registerFlag('WEBGL_PACK_CLIP', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack the depthwise conv op. */\nENV.registerFlag('WEBGL_PACK_DEPTHWISECONV', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack binary ops. */\nENV.registerFlag('WEBGL_PACK_BINARY_OPERATIONS', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack unary ops. */\nENV.registerFlag('WEBGL_PACK_UNARY_OPERATIONS', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack array ops. */\nENV.registerFlag('WEBGL_PACK_ARRAY_OPERATIONS', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack image ops. */\nENV.registerFlag('WEBGL_PACK_IMAGE_OPERATIONS', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will pack reduce ops. */\nENV.registerFlag('WEBGL_PACK_REDUCE', () => ENV.getBool('WEBGL_PACK'));\n/** Whether packed WebGL kernels lazily unpack their outputs. */\nENV.registerFlag('WEBGL_LAZILY_UNPACK', () => ENV.getBool('WEBGL_PACK'));\n/** Whether we will use the im2col algorithm to speed up convolutions. */\nENV.registerFlag('WEBGL_CONV_IM2COL', () => ENV.getBool('WEBGL_PACK'));\n/** The maximum texture dimension. */\nENV.registerFlag('WEBGL_MAX_TEXTURE_SIZE', () => getWebGLMaxTextureSize(ENV.getNumber('WEBGL_VERSION')));\n/** The maximum texture dimension. */\nENV.registerFlag('WEBGL_MAX_TEXTURES_IN_SHADER', () => getMaxTexturesInShader(ENV.getNumber('WEBGL_VERSION')));\n/**\n * The disjoint_query_timer extension version.\n * 0: disabled, 1: EXT_disjoint_timer_query, 2:\n * EXT_disjoint_timer_query_webgl2.\n * In Firefox with WebGL 2.0,\n * EXT_disjoint_timer_query_webgl2 is not available, so we must use the\n * WebGL 1.0 extension.\n */\nENV.registerFlag('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION', () => {\n    const webGLVersion = ENV.getNumber('WEBGL_VERSION');\n    if (webGLVersion === 0) {\n        return 0;\n    }\n    return getWebGLDisjointQueryTimerVersion(webGLVersion);\n});\n/**\n * Whether the timer object from the disjoint_query_timer extension gives\n * timing information that is reliable.\n */\nENV.registerFlag('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE', () => ENV.getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0 &&\n    !device_util.isMobile());\n/**\n * Whether the device is physically capable of rendering to float32 textures.\n */\nENV.registerFlag('WEBGL_RENDER_FLOAT32_CAPABLE', () => isCapableOfRenderingToFloatTexture(ENV.getNumber('WEBGL_VERSION')));\n/**\n * Whether rendering to float32 textures is enabled. If disabled, renders to\n * float16 textures.\n */\nENV.registerFlag('WEBGL_RENDER_FLOAT32_ENABLED', () => {\n    return ENV.getBool('WEBGL_FORCE_F16_TEXTURES') ?\n        false :\n        ENV.getBool('WEBGL_RENDER_FLOAT32_CAPABLE');\n});\n/**\n * Whether downloading float textures is enabled (16 or 32 bit). If disabled,\n * uses IEEE 754 encoding of the float32 values to 4 uint8 when downloading.\n */\nENV.registerFlag('WEBGL_DOWNLOAD_FLOAT_ENABLED', () => isDownloadFloatTextureEnabled(ENV.getNumber('WEBGL_VERSION')));\n/** Whether the fence API is available. */\nENV.registerFlag('WEBGL_FENCE_API_ENABLED', () => isWebGLFenceEnabled(ENV.getNumber('WEBGL_VERSION')));\n/**\n * Tensors with size <= than this will be uploaded as uniforms, not textures.\n */\nENV.registerFlag('WEBGL_SIZE_UPLOAD_UNIFORM', () => {\n    // Use uniform uploads only when 32bit floats are supported. In\n    // 16bit\n    // environments there are problems with comparing a 16bit texture value\n    // with a 32bit uniform value.\n    const useUniforms = ENV.getBool('WEBGL_RENDER_FLOAT32_ENABLED');\n    return useUniforms ? 4 : 0;\n});\n/**\n * If the total number of bytes allocated on the GPU is greater than this\n * number, we will aggressively delete textures upon disposal with\n * gl.deleteMatrixTexture, rather than making them available for reuse.\n *\n * Default value -1 indicates that we will never aggressively delete textures.\n */\nENV.registerFlag('WEBGL_DELETE_TEXTURE_THRESHOLD', () => {\n    return -1;\n}, threshold => {\n    if (threshold < 0 && threshold !== -1) {\n        throw new Error(`WEBGL_DELETE_TEXTURE_THRESHOLD must be -1 (indicating never ` +\n            `delete) or at least 0, but got ${threshold}.`);\n    }\n});\n/**\n * Trigger a manual GL command flush if the threshold of time has passed since\n * previous Kernel execution. This can be useful for Andorid device where GL\n * command flush are delayed un til the end of javascript task. This value is\n * measured in millisecond. Typically you want to set this value to close to 1.\n *\n * Default value 1 for mobile chrome, and -1 for rest cases. -1 indicates that\n * we will not enforce manual flush and depend on system default flush schedule.\n */\nENV.registerFlag('WEBGL_FLUSH_THRESHOLD', () => {\n    return device_util.isMobile() ? 1 : -1;\n}, threshold => {\n    if (threshold < 0 && threshold !== -1) {\n        throw new Error(`WEBGL_FLUSH_THRESHOLD must be -1 (indicating never ` +\n            `manual flush) or at least 0, but got ${threshold}.`);\n    }\n});\n/**\n * Threshold for input tensor size that determines whether WebGL backend will\n * delegate computation to CPU.\n *\n * Default value is 128.\n */\nENV.registerFlag('CPU_HANDOFF_SIZE_THRESHOLD', () => 128);\n/** Whether we will use shapes uniforms. */\nENV.registerFlag('WEBGL_USE_SHAPES_UNIFORMS', () => false);\n/**\n * Threshold for last dimension of input tensor that determines whether\n * WebGL backend for the Top K op will delegate computation to CPU. If input\n * is smaller than threshold then CPU will be used\n *\n * Default value is 100000.\n */\nENV.registerFlag('TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD', () => 100000);\n/**\n * Threshold for K that determines whether\n * WebGL backend for the Top K op will delegate computation to CPU. If k\n * is larger than threshold then CPU will be used\n *\n * Default value is 128.\n */\nENV.registerFlag('TOPK_K_CPU_HANDOFF_THRESHOLD', () => 128);\n/** Whether we will use the experimental conv op. */\nENV.registerFlag('WEBGL_EXP_CONV', () => false);\n/**\n * If the device performance is low or if no hardware GPU is available, whether\n * software WebGL will be used.\n */\nENV.registerFlag('SOFTWARE_WEBGL_ENABLED', () => ENV.getBool('IS_TEST'));\n/**\n * For narrow texture (physical height or physical width is 1), if the length of\n * any texture edges exceed the threshold, the texture will be reshaped to be\n * more squarish.\n *\n * This flag is used to help some GPUs that could not provide correct\n * interpolations for long skinny triangles. We found Mali GPU probably has this\n * problem: https://github.com/tensorflow/tfjs/issues/6775.\n */\nENV.registerFlag('WEBGL_MAX_SIZE_FOR_NARROW_TEXTURE', () => Infinity);\n/**\n * If the flag is set to true, the max size of the narrow texture will be auto\n * computed and it will be considerred as a threshold to reshape the narrow\n * texture to be more squarish.\n *\n * This flag is used to help some GPUs that could not provide correct\n * interpolations for long skinny triangles. We found Mali GPU probably has this\n * problem: https://github.com/tensorflow/tfjs/issues/6775.\n */\nENV.registerFlag('WEBGL_AUTO_SQUARIFY_NARROW_TEXTURE_SHAPE', () => false);\n/**\n * Whether to use the customized isnan. It's only useful for webgl2 since webgl1\n * doesn't have the builtin isnan.\n */\nENV.registerFlag('WEBGL2_ISNAN_CUSTOM', () => false);\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxhZ3Nfd2ViZ2wuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2ZsYWdzX3dlYmdsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxXQUFXLEVBQUUsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQsT0FBTyxFQUFDLHNCQUFzQixFQUFFLGlDQUFpQyxFQUFFLHNCQUFzQixFQUFFLGtDQUFrQyxFQUFFLDZCQUE2QixFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTlOLE1BQU0sR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDO0FBRWxCOztHQUVHO0FBRUg7O0dBRUc7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUFDLFdBQVcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0FBRXhFLCtDQUErQztBQUMvQyxHQUFHLENBQUMsWUFBWSxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUU7SUFDckMsSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUM1QixPQUFPLENBQUMsQ0FBQztLQUNWO1NBQU0sSUFBSSxxQkFBcUIsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUNuQyxPQUFPLENBQUMsQ0FBQztLQUNWO0lBQ0QsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUMsQ0FBQztBQUVILDhEQUE4RDtBQUM5RCxHQUFHLENBQUMsWUFBWSxDQUFDLGdDQUFnQyxFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRWhFLEdBQUcsQ0FBQyxZQUFZLENBQ1osd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FB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Q0FBQztBQUUzRTs7Ozs7O0dBTUc7QUFDSCxHQUFHLENBQUMsWUFBWSxDQUFDLDhCQUE4QixFQUFFLEdBQUcsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBRTVELG9EQUFvRDtBQUNwRCxHQUFHLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEdBQUcsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBRWhEOzs7R0FHRztBQUNILEdBQUcsQ0FBQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0FBRXpFOzs7Ozs7OztHQVFHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQyxtQ0FBbUMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUV0RTs7Ozs7Ozs7R0FRRztBQUNILEdBQUcsQ0FBQyxZQUFZLENBQUMsMENBQTBDLEVBQUUsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFFMUU7OztHQUdHO0FBQ0gsR0FBRyxDQUFDLFlBQVksQ0FBQyxxQkFBcUIsRUFBRSxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtkZXZpY2VfdXRpbCwgZW52fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2dldE1heFRleHR1cmVzSW5TaGFkZXIsIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbiwgZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZSwgaXNDYXBhYmxlT2ZSZW5kZXJpbmdUb0Zsb2F0VGV4dHVyZSwgaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQsIGlzV2ViR0xGZW5jZUVuYWJsZWQsIGlzV2ViR0xWZXJzaW9uRW5hYmxlZH0gZnJvbSAnLi93ZWJnbF91dGlsJztcblxuY29uc3QgRU5WID0gZW52KCk7XG5cbi8qKlxuICogVGhpcyBmaWxlIGNvbnRhaW5zIFdlYkdMLXNwZWNpZmljIGZsYWcgcmVnaXN0cmF0aW9ucy5cbiAqL1xuXG4vKipcbiAqIFRydWUgaWYgV2ViR0wgaXMgc3VwcG9ydGVkLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdIQVNfV0VCR0wnLCAoKSA9PiBFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPiAwKTtcblxuLyoqIDA6IE5vIFdlYkdMLCAxOiBXZWJHTCAxLjAsIDI6IFdlYkdMIDIuMC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1ZFUlNJT04nLCAoKSA9PiB7XG4gIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMikpIHtcbiAgICByZXR1cm4gMjtcbiAgfSBlbHNlIGlmIChpc1dlYkdMVmVyc2lvbkVuYWJsZWQoMSkpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn0pO1xuXG4vKiogV2hldGhlciB0byBjaGVjayBmb3IgbnVtZXJpY2FsIHJlcHJlc2VudGF0aW9uIHByb2JsZW1zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQ0hFQ0tfTlVNRVJJQ0FMX1BST0JMRU1TJywgKCkgPT4gZmFsc2UpO1xuXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJywgKCkgPT4gRU5WLmdldCgnV0VCR0xfVkVSU0lPTicpID09PSAyKTtcblxuLyoqIFdoZXRoZXIgdGhlIFdlYkdMIGJhY2tlbmQgd2lsbCBzb21ldGltZXMgZm9yd2FyZCBvcHMgdG8gdGhlIENQVS4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0NQVV9GT1JXQVJEJywgKCkgPT4gdHJ1ZSk7XG5cbi8qKiBXaGV0aGVyIHRoZSBXZWJHTCBiYWNrZW5kIHdpbGwgYWx3YXlzIHVzZSBmMTYgdGV4dHVyZXMgZm9yIHJlbmRlcmluZy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycsICgpID0+IGZhbHNlKTtcblxuLyoqIFdoZXRoZXIgdG8gdHVybiBhbGwgcGFja2luZyByZWxhdGVkIGZsYWdzIG9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDSycsICgpID0+IEVOVi5nZXRCb29sKCdIQVNfV0VCR0wnKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB0aGUgYmF0Y2hub3JtYWxpemF0aW9uIG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19OT1JNQUxJWkFUSU9OJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayB0aGUgY2xpcCBvcC4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfQ0xJUCcsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdGhlIGRlcHRod2lzZSBjb252IG9wLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBiaW5hcnkgb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgdW5hcnkgb3BzLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgcGFjayBhcnJheSBvcHMuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCBwYWNrIGltYWdlIG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX1BBQ0tfSU1BR0VfT1BFUkFUSU9OUycsICgpID0+IEVOVi5nZXRCb29sKCdXRUJHTF9QQUNLJykpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHBhY2sgcmVkdWNlIG9wcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1BBQ0tfUkVEVUNFJywgKCkgPT4gRU5WLmdldEJvb2woJ1dFQkdMX1BBQ0snKSk7XG5cbi8qKiBXaGV0aGVyIHBhY2tlZCBXZWJHTCBrZXJuZWxzIGxhemlseSB1bnBhY2sgdGhlaXIgb3V0cHV0cy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX0xBWklMWV9VTlBBQ0snLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFdoZXRoZXIgd2Ugd2lsbCB1c2UgdGhlIGltMmNvbCBhbGdvcml0aG0gdG8gc3BlZWQgdXAgY29udm9sdXRpb25zLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQ09OVl9JTTJDT0wnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpKTtcblxuLyoqIFRoZSBtYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfTUFYX1RFWFRVUkVfU0laRScsXG4gICAgKCkgPT4gZ2V0V2ViR0xNYXhUZXh0dXJlU2l6ZShFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcblxuLyoqIFRoZSBtYXhpbXVtIHRleHR1cmUgZGltZW5zaW9uLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfTUFYX1RFWFRVUkVTX0lOX1NIQURFUicsXG4gICAgKCkgPT4gZ2V0TWF4VGV4dHVyZXNJblNoYWRlcihFTlYuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpKTtcblxuLyoqXG4gKiBUaGUgZGlzam9pbnRfcXVlcnlfdGltZXIgZXh0ZW5zaW9uIHZlcnNpb24uXG4gKiAwOiBkaXNhYmxlZCwgMTogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5LCAyOlxuICogRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMi5cbiAqIEluIEZpcmVmb3ggd2l0aCBXZWJHTCAyLjAsXG4gKiBFWFRfZGlzam9pbnRfdGltZXJfcXVlcnlfd2ViZ2wyIGlzIG5vdCBhdmFpbGFibGUsIHNvIHdlIG11c3QgdXNlIHRoZVxuICogV2ViR0wgMS4wIGV4dGVuc2lvbi5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nLCAoKSA9PiB7XG4gIGNvbnN0IHdlYkdMVmVyc2lvbiA9IEVOVi5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKTtcblxuICBpZiAod2ViR0xWZXJzaW9uID09PSAwKSB7XG4gICAgcmV0dXJuIDA7XG4gIH1cbiAgcmV0dXJuIGdldFdlYkdMRGlzam9pbnRRdWVyeVRpbWVyVmVyc2lvbih3ZWJHTFZlcnNpb24pO1xufSk7XG5cbi8qKlxuICogV2hldGhlciB0aGUgdGltZXIgb2JqZWN0IGZyb20gdGhlIGRpc2pvaW50X3F1ZXJ5X3RpbWVyIGV4dGVuc2lvbiBnaXZlc1xuICogdGltaW5nIGluZm9ybWF0aW9uIHRoYXQgaXMgcmVsaWFibGUuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScsXG4gICAgKCkgPT4gRU5WLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA+IDAgJiZcbiAgICAgICAgIWRldmljZV91dGlsLmlzTW9iaWxlKCkpO1xuXG4vKipcbiAqIFdoZXRoZXIgdGhlIGRldmljZSBpcyBwaHlzaWNhbGx5IGNhcGFibGUgb2YgcmVuZGVyaW5nIHRvIGZsb2F0MzIgdGV4dHVyZXMuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0NBUEFCTEUnLFxuICAgICgpID0+IGlzQ2FwYWJsZU9mUmVuZGVyaW5nVG9GbG9hdFRleHR1cmUoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKlxuICogV2hldGhlciByZW5kZXJpbmcgdG8gZmxvYXQzMiB0ZXh0dXJlcyBpcyBlbmFibGVkLiBJZiBkaXNhYmxlZCwgcmVuZGVycyB0b1xuICogZmxvYXQxNiB0ZXh0dXJlcy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcsICgpID0+IHtcbiAgcmV0dXJuIEVOVi5nZXRCb29sKCdXRUJHTF9GT1JDRV9GMTZfVEVYVFVSRVMnKSA/XG4gICAgICBmYWxzZSA6XG4gICAgICBFTlYuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfQ0FQQUJMRScpO1xufSk7XG5cbi8qKlxuICogV2hldGhlciBkb3dubG9hZGluZyBmbG9hdCB0ZXh0dXJlcyBpcyBlbmFibGVkICgxNiBvciAzMiBiaXQpLiBJZiBkaXNhYmxlZCxcbiAqIHVzZXMgSUVFRSA3NTQgZW5jb2Rpbmcgb2YgdGhlIGZsb2F0MzIgdmFsdWVzIHRvIDQgdWludDggd2hlbiBkb3dubG9hZGluZy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcsXG4gICAgKCkgPT4gaXNEb3dubG9hZEZsb2F0VGV4dHVyZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKiBXaGV0aGVyIHRoZSBmZW5jZSBBUEkgaXMgYXZhaWxhYmxlLiAqL1xuRU5WLnJlZ2lzdGVyRmxhZyhcbiAgICAnV0VCR0xfRkVOQ0VfQVBJX0VOQUJMRUQnLFxuICAgICgpID0+IGlzV2ViR0xGZW5jZUVuYWJsZWQoRU5WLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpKSk7XG5cbi8qKlxuICogVGVuc29ycyB3aXRoIHNpemUgPD0gdGhhbiB0aGlzIHdpbGwgYmUgdXBsb2FkZWQgYXMgdW5pZm9ybXMsIG5vdCB0ZXh0dXJlcy5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfU0laRV9VUExPQURfVU5JRk9STScsICgpID0+IHtcbiAgLy8gVXNlIHVuaWZvcm0gdXBsb2FkcyBvbmx5IHdoZW4gMzJiaXQgZmxvYXRzIGFyZSBzdXBwb3J0ZWQuIEluXG4gIC8vIDE2Yml0XG4gIC8vIGVudmlyb25tZW50cyB0aGVyZSBhcmUgcHJvYmxlbXMgd2l0aCBjb21wYXJpbmcgYSAxNmJpdCB0ZXh0dXJlIHZhbHVlXG4gIC8vIHdpdGggYSAzMmJpdCB1bmlmb3JtIHZhbHVlLlxuICBjb25zdCB1c2VVbmlmb3JtcyA9IEVOVi5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJyk7XG4gIHJldHVybiB1c2VVbmlmb3JtcyA/IDQgOiAwO1xufSk7XG5cbi8qKlxuICogSWYgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgb24gdGhlIEdQVSBpcyBncmVhdGVyIHRoYW4gdGhpc1xuICogbnVtYmVyLCB3ZSB3aWxsIGFnZ3Jlc3NpdmVseSBkZWxldGUgdGV4dHVyZXMgdXBvbiBkaXNwb3NhbCB3aXRoXG4gKiBnbC5kZWxldGVNYXRyaXhUZXh0dXJlLCByYXRoZXIgdGhhbiBtYWtpbmcgdGhlbSBhdmFpbGFibGUgZm9yIHJldXNlLlxuICpcbiAqIERlZmF1bHQgdmFsdWUgLTEgaW5kaWNhdGVzIHRoYXQgd2Ugd2lsbCBuZXZlciBhZ2dyZXNzaXZlbHkgZGVsZXRlIHRleHR1cmVzLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKFxuICAgICdXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQnLFxuICAgICgpID0+IHtcbiAgICAgIHJldHVybiAtMTtcbiAgICB9LFxuICAgIHRocmVzaG9sZCA9PiB7XG4gICAgICBpZiAodGhyZXNob2xkIDwgMCAmJiB0aHJlc2hvbGQgIT09IC0xKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQgbXVzdCBiZSAtMSAoaW5kaWNhdGluZyBuZXZlciBgICtcbiAgICAgICAgICAgIGBkZWxldGUpIG9yIGF0IGxlYXN0IDAsIGJ1dCBnb3QgJHt0aHJlc2hvbGR9LmApO1xuICAgICAgfVxuICAgIH0pO1xuXG4vKipcbiAqIFRyaWdnZXIgYSBtYW51YWwgR0wgY29tbWFuZCBmbHVzaCBpZiB0aGUgdGhyZXNob2xkIG9mIHRpbWUgaGFzIHBhc3NlZCBzaW5jZVxuICogcHJldmlvdXMgS2VybmVsIGV4ZWN1dGlvbi4gVGhpcyBjYW4gYmUgdXNlZnVsIGZvciBBbmRvcmlkIGRldmljZSB3aGVyZSBHTFxuICogY29tbWFuZCBmbHVzaCBhcmUgZGVsYXllZCB1biB0aWwgdGhlIGVuZCBvZiBqYXZhc2NyaXB0IHRhc2suIFRoaXMgdmFsdWUgaXNcbiAqIG1lYXN1cmVkIGluIG1pbGxpc2Vjb25kLiBUeXBpY2FsbHkgeW91IHdhbnQgdG8gc2V0IHRoaXMgdmFsdWUgdG8gY2xvc2UgdG8gMS5cbiAqXG4gKiBEZWZhdWx0IHZhbHVlIDEgZm9yIG1vYmlsZSBjaHJvbWUsIGFuZCAtMSBmb3IgcmVzdCBjYXNlcy4gLTEgaW5kaWNhdGVzIHRoYXRcbiAqIHdlIHdpbGwgbm90IGVuZm9yY2UgbWFudWFsIGZsdXNoIGFuZCBkZXBlbmQgb24gc3lzdGVtIGRlZmF1bHQgZmx1c2ggc2NoZWR1bGUuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoXG4gICAgJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcsXG4gICAgKCkgPT4ge1xuICAgICAgcmV0dXJuIGRldmljZV91dGlsLmlzTW9iaWxlKCkgPyAxIDogLTE7XG4gICAgfSxcbiAgICB0aHJlc2hvbGQgPT4ge1xuICAgICAgaWYgKHRocmVzaG9sZCA8IDAgJiYgdGhyZXNob2xkICE9PSAtMSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgV0VCR0xfRkxVU0hfVEhSRVNIT0xEIG11c3QgYmUgLTEgKGluZGljYXRpbmcgbmV2ZXIgYCArXG4gICAgICAgICAgICBgbWFudWFsIGZsdXNoKSBvciBhdCBsZWFzdCAwLCBidXQgZ290ICR7dGhyZXNob2xkfS5gKTtcbiAgICAgIH1cbiAgICB9KTtcblxuLyoqXG4gKiBUaHJlc2hvbGQgZm9yIGlucHV0IHRlbnNvciBzaXplIHRoYXQgZGV0ZXJtaW5lcyB3aGV0aGVyIFdlYkdMIGJhY2tlbmQgd2lsbFxuICogZGVsZWdhdGUgY29tcHV0YXRpb24gdG8gQ1BVLlxuICpcbiAqIERlZmF1bHQgdmFsdWUgaXMgMTI4LlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdDUFVfSEFORE9GRl9TSVpFX1RIUkVTSE9MRCcsICgpID0+IDEyOCk7XG5cbi8qKiBXaGV0aGVyIHdlIHdpbGwgdXNlIHNoYXBlcyB1bmlmb3Jtcy4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1dFQkdMX1VTRV9TSEFQRVNfVU5JRk9STVMnLCAoKSA9PiBmYWxzZSk7XG5cbi8qKlxuICogVGhyZXNob2xkIGZvciBsYXN0IGRpbWVuc2lvbiBvZiBpbnB1dCB0ZW5zb3IgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXJcbiAqIFdlYkdMIGJhY2tlbmQgZm9yIHRoZSBUb3AgSyBvcCB3aWxsIGRlbGVnYXRlIGNvbXB1dGF0aW9uIHRvIENQVS4gSWYgaW5wdXRcbiAqIGlzIHNtYWxsZXIgdGhhbiB0aHJlc2hvbGQgdGhlbiBDUFUgd2lsbCBiZSB1c2VkXG4gKlxuICogRGVmYXVsdCB2YWx1ZSBpcyAxMDAwMDAuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RPUEtfTEFTVF9ESU1fQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQnLCAoKSA9PiAxMDAwMDApO1xuXG4vKipcbiAqIFRocmVzaG9sZCBmb3IgSyB0aGF0IGRldGVybWluZXMgd2hldGhlclxuICogV2ViR0wgYmFja2VuZCBmb3IgdGhlIFRvcCBLIG9wIHdpbGwgZGVsZWdhdGUgY29tcHV0YXRpb24gdG8gQ1BVLiBJZiBrXG4gKiBpcyBsYXJnZXIgdGhhbiB0aHJlc2hvbGQgdGhlbiBDUFUgd2lsbCBiZSB1c2VkXG4gKlxuICogRGVmYXVsdCB2YWx1ZSBpcyAxMjguXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1RPUEtfS19DUFVfSEFORE9GRl9USFJFU0hPTEQnLCAoKSA9PiAxMjgpO1xuXG4vKiogV2hldGhlciB3ZSB3aWxsIHVzZSB0aGUgZXhwZXJpbWVudGFsIGNvbnYgb3AuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTF9FWFBfQ09OVicsICgpID0+IGZhbHNlKTtcblxuLyoqXG4gKiBJZiB0aGUgZGV2aWNlIHBlcmZvcm1hbmNlIGlzIGxvdyBvciBpZiBubyBoYXJkd2FyZSBHUFUgaXMgYXZhaWxhYmxlLCB3aGV0aGVyXG4gKiBzb2Z0d2FyZSBXZWJHTCB3aWxsIGJlIHVzZWQuXG4gKi9cbkVOVi5yZWdpc3RlckZsYWcoJ1NPRlRXQVJFX1dFQkdMX0VOQUJMRUQnLCAoKSA9PiBFTlYuZ2V0Qm9vbCgnSVNfVEVTVCcpKTtcblxuLyoqXG4gKiBGb3IgbmFycm93IHRleHR1cmUgKHBoeXNpY2FsIGhlaWdodCBvciBwaHlzaWNhbCB3aWR0aCBpcyAxKSwgaWYgdGhlIGxlbmd0aCBvZlxuICogYW55IHRleHR1cmUgZWRnZXMgZXhjZWVkIHRoZSB0aHJlc2hvbGQsIHRoZSB0ZXh0dXJlIHdpbGwgYmUgcmVzaGFwZWQgdG8gYmVcbiAqIG1vcmUgc3F1YXJpc2guXG4gKlxuICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gaGVscCBzb21lIEdQVXMgdGhhdCBjb3VsZCBub3QgcHJvdmlkZSBjb3JyZWN0XG4gKiBpbnRlcnBvbGF0aW9ucyBmb3IgbG9uZyBza2lubnkgdHJpYW5nbGVzLiBXZSBmb3VuZCBNYWxpIEdQVSBwcm9iYWJseSBoYXMgdGhpc1xuICogcHJvYmxlbTogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNjc3NS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfTUFYX1NJWkVfRk9SX05BUlJPV19URVhUVVJFJywgKCkgPT4gSW5maW5pdHkpO1xuXG4vKipcbiAqIElmIHRoZSBmbGFnIGlzIHNldCB0byB0cnVlLCB0aGUgbWF4IHNpemUgb2YgdGhlIG5hcnJvdyB0ZXh0dXJlIHdpbGwgYmUgYXV0b1xuICogY29tcHV0ZWQgYW5kIGl0IHdpbGwgYmUgY29uc2lkZXJyZWQgYXMgYSB0aHJlc2hvbGQgdG8gcmVzaGFwZSB0aGUgbmFycm93XG4gKiB0ZXh0dXJlIHRvIGJlIG1vcmUgc3F1YXJpc2guXG4gKlxuICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gaGVscCBzb21lIEdQVXMgdGhhdCBjb3VsZCBub3QgcHJvdmlkZSBjb3JyZWN0XG4gKiBpbnRlcnBvbGF0aW9ucyBmb3IgbG9uZyBza2lubnkgdHJpYW5nbGVzLiBXZSBmb3VuZCBNYWxpIEdQVSBwcm9iYWJseSBoYXMgdGhpc1xuICogcHJvYmxlbTogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNjc3NS5cbiAqL1xuRU5WLnJlZ2lzdGVyRmxhZygnV0VCR0xfQVVUT19TUVVBUklGWV9OQVJST1dfVEVYVFVSRV9TSEFQRScsICgpID0+IGZhbHNlKTtcblxuLyoqXG4gKiBXaGV0aGVyIHRvIHVzZSB0aGUgY3VzdG9taXplZCBpc25hbi4gSXQncyBvbmx5IHVzZWZ1bCBmb3Igd2ViZ2wyIHNpbmNlIHdlYmdsMVxuICogZG9lc24ndCBoYXZlIHRoZSBidWlsdGluIGlzbmFuLlxuICovXG5FTlYucmVnaXN0ZXJGbGFnKCdXRUJHTDJfSVNOQU5fQ1VTVE9NJywgKCkgPT4gZmFsc2UpO1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nexport function getGlslDifferences() {\n    let version;\n    let attribute;\n    let varyingVs;\n    let varyingFs;\n    let texture2D;\n    let output;\n    let defineOutput;\n    let defineSpecialNaN;\n    let defineSpecialInf;\n    let defineRound;\n    if (env().getNumber('WEBGL_VERSION') === 2) {\n        version = '#version 300 es';\n        attribute = 'in';\n        varyingVs = 'out';\n        varyingFs = 'in';\n        texture2D = 'texture';\n        output = 'outputColor';\n        defineOutput = 'out vec4 outputColor;';\n        // Use custom isnan definition to work across differences between\n        // implementations on various platforms. While this should happen in ANGLE\n        // we still see differences between android and windows (on chrome) when\n        // using isnan directly. Since WebGL2 supports uint type and\n        // floatBitsToUinT built-in function, we could implment isnan following\n        // IEEE 754 rules.\n        // NaN defination in IEEE 754-1985 is :\n        //   - sign = either 0 or 1.\n        //   - biased exponent = all 1 bits.\n        //   - fraction = anything except all 0 bits (since all 0 bits represents\n        //   infinity).\n        // https://en.wikipedia.org/wiki/IEEE_754-1985#Representation_of_non-numbers\n        defineSpecialNaN = env().getBool('WEBGL2_ISNAN_CUSTOM') ? `\n      bool isnan_custom(float val) {\n        uint floatToUint = floatBitsToUint(val);\n        return (floatToUint & 0x7fffffffu) > 0x7f800000u;\n      }\n\n      bvec4 isnan_custom(vec4 val) {\n        return bvec4(isnan_custom(val.x),\n          isnan_custom(val.y), isnan_custom(val.z), isnan_custom(val.w));\n      }\n\n      #define isnan(value) isnan_custom(value)\n    ` :\n            '';\n        // In webgl 2 we do not need to specify a custom isinf so there is no\n        // need for a special INFINITY constant.\n        defineSpecialInf = ``;\n        defineRound = `\n      #define round(value) newRound(value)\n      int newRound(float value) {\n        return int(floor(value + 0.5));\n      }\n\n      ivec4 newRound(vec4 value) {\n        return ivec4(floor(value + vec4(0.5)));\n      }\n    `;\n    }\n    else {\n        version = '';\n        attribute = 'attribute';\n        varyingVs = 'varying';\n        varyingFs = 'varying';\n        texture2D = 'texture2D';\n        output = 'gl_FragColor';\n        defineOutput = '';\n        // WebGL1 has no built in isnan so we define one here.\n        defineSpecialNaN = `\n      #define isnan(value) isnan_custom(value)\n      bool isnan_custom(float val) {\n        return (val > 0. || val < 1. || val == 0.) ? false : true;\n      }\n      bvec4 isnan_custom(vec4 val) {\n        return bvec4(isnan(val.x), isnan(val.y), isnan(val.z), isnan(val.w));\n      }\n    `;\n        defineSpecialInf = `\n      uniform float INFINITY;\n\n      bool isinf(float val) {\n        return abs(val) == INFINITY;\n      }\n      bvec4 isinf(vec4 val) {\n        return equal(abs(val), vec4(INFINITY));\n      }\n    `;\n        defineRound = `\n      int round(float value) {\n        return int(floor(value + 0.5));\n      }\n\n      ivec4 round(vec4 value) {\n        return ivec4(floor(value + vec4(0.5)));\n      }\n    `;\n    }\n    return {\n        version,\n        attribute,\n        varyingVs,\n        varyingFs,\n        texture2D,\n        output,\n        defineOutput,\n        defineSpecialNaN,\n        defineSpecialInf,\n        defineRound\n    };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xzbF92ZXJzaW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9nbHNsX3ZlcnNpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBZTFDLE1BQU0sVUFBVSxrQkFBa0I7SUFDaEMsSUFBSSxPQUFlLENBQUM7SUFDcEIsSUFBSSxTQUFpQixDQUFDO0lBQ3RCLElBQUksU0FBaUIsQ0FBQztJQUN0QixJQUFJLFNBQWlCLENBQUM7SUFDdEIsSUFBSSxTQUFpQixDQUFDO0lBQ3RCLElBQUksTUFBYyxDQUFDO0lBQ25CLElBQUksWUFBb0IsQ0FBQztJQUN6QixJQUFJLGdCQUF3QixDQUFDO0lBQzdCLElBQUksZ0JBQXdCLENBQUM7SUFDN0IsSUFBSSxXQUFtQixDQUFDO0lBRXhCLElBQUksR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUMxQyxPQUFPLEdBQUcsaUJBQWlCLENBQUM7UUFDNUIsU0FBUyxHQUFHLElBQUksQ0FBQztRQUNqQixTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLFNBQVMsR0FBRyxJQUFJLENBQUM7UUFDakIsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUN0QixNQUFNLEdBQUcsYUFBYSxDQUFDO1FBQ3ZCLFlBQVksR0FBRyx1QkFBdUIsQ0FBQztRQUV2QyxpRUFBaUU7UUFDakUsMEVBQTBFO1FBQzFFLHdFQUF3RTtRQUN4RSw0REFBNEQ7UUFDNUQsdUVBQXVFO1FBQ3ZFLGtCQUFrQjtRQUNsQix1Q0FBdUM7UUFDdkMsNEJBQTRCO1FBQzVCLG9DQUFvQztRQUNwQyx5RUFBeUU7UUFDekUsZUFBZTtRQUNmLDRFQUE0RTtRQUM1RSxnQkFBZ0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7OztLQVl6RCxDQUFDLENBQUM7WUFDdUQsRUFBRSxDQUFDO1FBQzdELHFFQUFxRTtRQUNyRSx3Q0FBd0M7UUFDeEMsZ0JBQWdCLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLFdBQVcsR0FBRzs7Ozs7Ozs7O0tBU2IsQ0FBQztLQUNIO1NBQU07UUFDTCxPQUFPLEdBQUcsRUFBRSxDQUFDO1FBQ2IsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQ3RCLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDdEIsU0FBUyxHQUFHLFdBQVcsQ0FBQztRQUN4QixNQUFNLEdBQUcsY0FBYyxDQUFDO1FBQ3hCLFlBQVksR0FBRyxFQUFFLENBQUM7UUFDbEIsc0RBQXNEO1FBQ3RELGdCQUFnQixHQUFHOzs7Ozs7OztLQVFsQixDQUFDO1FBQ0YsZ0JBQWdCLEdBQUc7Ozs7Ozs7OztLQVNsQixDQUFDO1FBQ0YsV0FBVyxHQUFHOzs7Ozs7OztLQVFiLENBQUM7S0FDSDtJQUVELE9BQU87UUFDTCxPQUFPO1FBQ1AsU0FBUztRQUNULFNBQVM7UUFDVCxTQUFTO1FBQ1QsU0FBUztRQUNULE1BQU07UUFDTixZQUFZO1FBQ1osZ0JBQWdCO1FBQ2hCLGdCQUFnQjtRQUNoQixXQUFXO0tBQ1osQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2Vudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuZXhwb3J0IHR5cGUgR0xTTCA9IHtcbiAgdmVyc2lvbjogc3RyaW5nLFxuICBhdHRyaWJ1dGU6IHN0cmluZyxcbiAgdmFyeWluZ1ZzOiBzdHJpbmcsXG4gIHZhcnlpbmdGczogc3RyaW5nLFxuICB0ZXh0dXJlMkQ6IHN0cmluZyxcbiAgb3V0cHV0OiBzdHJpbmcsXG4gIGRlZmluZU91dHB1dDogc3RyaW5nLFxuICBkZWZpbmVTcGVjaWFsTmFOOiBzdHJpbmcsXG4gIGRlZmluZVNwZWNpYWxJbmY6IHN0cmluZyxcbiAgZGVmaW5lUm91bmQ6IHN0cmluZ1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldEdsc2xEaWZmZXJlbmNlcygpOiBHTFNMIHtcbiAgbGV0IHZlcnNpb246IHN0cmluZztcbiAgbGV0IGF0dHJpYnV0ZTogc3RyaW5nO1xuICBsZXQgdmFyeWluZ1ZzOiBzdHJpbmc7XG4gIGxldCB2YXJ5aW5nRnM6IHN0cmluZztcbiAgbGV0IHRleHR1cmUyRDogc3RyaW5nO1xuICBsZXQgb3V0cHV0OiBzdHJpbmc7XG4gIGxldCBkZWZpbmVPdXRwdXQ6IHN0cmluZztcbiAgbGV0IGRlZmluZVNwZWNpYWxOYU46IHN0cmluZztcbiAgbGV0IGRlZmluZVNwZWNpYWxJbmY6IHN0cmluZztcbiAgbGV0IGRlZmluZVJvdW5kOiBzdHJpbmc7XG5cbiAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgdmVyc2lvbiA9ICcjdmVyc2lvbiAzMDAgZXMnO1xuICAgIGF0dHJpYnV0ZSA9ICdpbic7XG4gICAgdmFyeWluZ1ZzID0gJ291dCc7XG4gICAgdmFyeWluZ0ZzID0gJ2luJztcbiAgICB0ZXh0dXJlMkQgPSAndGV4dHVyZSc7XG4gICAgb3V0cHV0ID0gJ291dHB1dENvbG9yJztcbiAgICBkZWZpbmVPdXRwdXQgPSAnb3V0IHZlYzQgb3V0cHV0Q29sb3I7JztcblxuICAgIC8vIFVzZSBjdXN0b20gaXNuYW4gZGVmaW5pdGlvbiB0byB3b3JrIGFjcm9zcyBkaWZmZXJlbmNlcyBiZXR3ZWVuXG4gICAgLy8gaW1wbGVtZW50YXRpb25zIG9uIHZhcmlvdXMgcGxhdGZvcm1zLiBXaGlsZSB0aGlzIHNob3VsZCBoYXBwZW4gaW4gQU5HTEVcbiAgICAvLyB3ZSBzdGlsbCBzZWUgZGlmZmVyZW5jZXMgYmV0d2VlbiBhbmRyb2lkIGFuZCB3aW5kb3dzIChvbiBjaHJvbWUpIHdoZW5cbiAgICAvLyB1c2luZyBpc25hbiBkaXJlY3RseS4gU2luY2UgV2ViR0wyIHN1cHBvcnRzIHVpbnQgdHlwZSBhbmRcbiAgICAvLyBmbG9hdEJpdHNUb1VpblQgYnVpbHQtaW4gZnVuY3Rpb24sIHdlIGNvdWxkIGltcGxtZW50IGlzbmFuIGZvbGxvd2luZ1xuICAgIC8vIElFRUUgNzU0IHJ1bGVzLlxuICAgIC8vIE5hTiBkZWZpbmF0aW9uIGluIElFRUUgNzU0LTE5ODUgaXMgOlxuICAgIC8vICAgLSBzaWduID0gZWl0aGVyIDAgb3IgMS5cbiAgICAvLyAgIC0gYmlhc2VkIGV4cG9uZW50ID0gYWxsIDEgYml0cy5cbiAgICAvLyAgIC0gZnJhY3Rpb24gPSBhbnl0aGluZyBleGNlcHQgYWxsIDAgYml0cyAoc2luY2UgYWxsIDAgYml0cyByZXByZXNlbnRzXG4gICAgLy8gICBpbmZpbml0eSkuXG4gICAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSUVFRV83NTQtMTk4NSNSZXByZXNlbnRhdGlvbl9vZl9ub24tbnVtYmVyc1xuICAgIGRlZmluZVNwZWNpYWxOYU4gPSBlbnYoKS5nZXRCb29sKCdXRUJHTDJfSVNOQU5fQ1VTVE9NJykgPyBgXG4gICAgICBib29sIGlzbmFuX2N1c3RvbShmbG9hdCB2YWwpIHtcbiAgICAgICAgdWludCBmbG9hdFRvVWludCA9IGZsb2F0Qml0c1RvVWludCh2YWwpO1xuICAgICAgICByZXR1cm4gKGZsb2F0VG9VaW50ICYgMHg3ZmZmZmZmZnUpID4gMHg3ZjgwMDAwMHU7XG4gICAgICB9XG5cbiAgICAgIGJ2ZWM0IGlzbmFuX2N1c3RvbSh2ZWM0IHZhbCkge1xuICAgICAgICByZXR1cm4gYnZlYzQoaXNuYW5fY3VzdG9tKHZhbC54KSxcbiAgICAgICAgICBpc25hbl9jdXN0b20odmFsLnkpLCBpc25hbl9jdXN0b20odmFsLnopLCBpc25hbl9jdXN0b20odmFsLncpKTtcbiAgICAgIH1cblxuICAgICAgI2RlZmluZSBpc25hbih2YWx1ZSkgaXNuYW5fY3VzdG9tKHZhbHVlKVxuICAgIGAgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJztcbiAgICAvLyBJbiB3ZWJnbCAyIHdlIGRvIG5vdCBuZWVkIHRvIHNwZWNpZnkgYSBjdXN0b20gaXNpbmYgc28gdGhlcmUgaXMgbm9cbiAgICAvLyBuZWVkIGZvciBhIHNwZWNpYWwgSU5GSU5JVFkgY29uc3RhbnQuXG4gICAgZGVmaW5lU3BlY2lhbEluZiA9IGBgO1xuICAgIGRlZmluZVJvdW5kID0gYFxuICAgICAgI2RlZmluZSByb3VuZCh2YWx1ZSkgbmV3Um91bmQodmFsdWUpXG4gICAgICBpbnQgbmV3Um91bmQoZmxvYXQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGludChmbG9vcih2YWx1ZSArIDAuNSkpO1xuICAgICAgfVxuXG4gICAgICBpdmVjNCBuZXdSb3VuZCh2ZWM0IHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBpdmVjNChmbG9vcih2YWx1ZSArIHZlYzQoMC41KSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH0gZWxzZSB7XG4gICAgdmVyc2lvbiA9ICcnO1xuICAgIGF0dHJpYnV0ZSA9ICdhdHRyaWJ1dGUnO1xuICAgIHZhcnlpbmdWcyA9ICd2YXJ5aW5nJztcbiAgICB2YXJ5aW5nRnMgPSAndmFyeWluZyc7XG4gICAgdGV4dHVyZTJEID0gJ3RleHR1cmUyRCc7XG4gICAgb3V0cHV0ID0gJ2dsX0ZyYWdDb2xvcic7XG4gICAgZGVmaW5lT3V0cHV0ID0gJyc7XG4gICAgLy8gV2ViR0wxIGhhcyBubyBidWlsdCBpbiBpc25hbiBzbyB3ZSBkZWZpbmUgb25lIGhlcmUuXG4gICAgZGVmaW5lU3BlY2lhbE5hTiA9IGBcbiAgICAgICNkZWZpbmUgaXNuYW4odmFsdWUpIGlzbmFuX2N1c3RvbSh2YWx1ZSlcbiAgICAgIGJvb2wgaXNuYW5fY3VzdG9tKGZsb2F0IHZhbCkge1xuICAgICAgICByZXR1cm4gKHZhbCA+IDAuIHx8IHZhbCA8IDEuIHx8IHZhbCA9PSAwLikgPyBmYWxzZSA6IHRydWU7XG4gICAgICB9XG4gICAgICBidmVjNCBpc25hbl9jdXN0b20odmVjNCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGJ2ZWM0KGlzbmFuKHZhbC54KSwgaXNuYW4odmFsLnkpLCBpc25hbih2YWwueiksIGlzbmFuKHZhbC53KSk7XG4gICAgICB9XG4gICAgYDtcbiAgICBkZWZpbmVTcGVjaWFsSW5mID0gYFxuICAgICAgdW5pZm9ybSBmbG9hdCBJTkZJTklUWTtcblxuICAgICAgYm9vbCBpc2luZihmbG9hdCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGFicyh2YWwpID09IElORklOSVRZO1xuICAgICAgfVxuICAgICAgYnZlYzQgaXNpbmYodmVjNCB2YWwpIHtcbiAgICAgICAgcmV0dXJuIGVxdWFsKGFicyh2YWwpLCB2ZWM0KElORklOSVRZKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICBkZWZpbmVSb3VuZCA9IGBcbiAgICAgIGludCByb3VuZChmbG9hdCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gaW50KGZsb29yKHZhbHVlICsgMC41KSk7XG4gICAgICB9XG5cbiAgICAgIGl2ZWM0IHJvdW5kKHZlYzQgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWM0KGZsb29yKHZhbHVlICsgdmVjNCgwLjUpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgdmVyc2lvbixcbiAgICBhdHRyaWJ1dGUsXG4gICAgdmFyeWluZ1ZzLFxuICAgIHZhcnlpbmdGcyxcbiAgICB0ZXh0dXJlMkQsXG4gICAgb3V0cHV0LFxuICAgIGRlZmluZU91dHB1dCxcbiAgICBkZWZpbmVTcGVjaWFsTmFOLFxuICAgIGRlZmluZVNwZWNpYWxJbmYsXG4gICAgZGVmaW5lUm91bmRcbiAgfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\n/**\n * Produces GLSL code that derives logical coordinates from a flat\n * index. The code performs integer division with each stride and decrements\n * the index until the index equals the final dimension coordinate.\n */\nexport function getLogicalCoordinatesFromFlatIndex(coords, shape, index = 'index') {\n    const strides = util.computeStrides(shape);\n    return strides\n        .map((stride, i) => {\n        const line1 = `int ${coords[i]} = ${index} / ${stride}`;\n        const line2 = i === strides.length - 1 ?\n            `int ${coords[i + 1]} = ${index} - ${coords[i]} * ${stride}` :\n            `index -= ${coords[i]} * ${stride}`;\n        return `${line1}; ${line2};`;\n    })\n        .join('');\n}\nexport function getOutputLogicalCoordinatesFromFlatIndexByUniform(coords, shape, index = 'index') {\n    const strides = util.computeStrides(shape);\n    return strides\n        .map((_, i) => {\n        const line1 = `int ${coords[i]} = ${index} / outShapeStrides[${i}]`;\n        const line2 = i === strides.length - 1 ?\n            `int ${coords[i + 1]} = ${index} - ${coords[i]} * outShapeStrides[${i}]` :\n            `index -= ${coords[i]} * outShapeStrides[${i}]`;\n        return `${line1}; ${line2};`;\n    })\n        .join('');\n}\n// Produces GLSL code that computes strides.\nfunction symbolicallyComputeStrides(indicesArr, variableName) {\n    const numCoords = indicesArr.length;\n    const shape = indicesArr.map(d => `${variableName}[${d}]`);\n    const strides = new Array(numCoords - 1);\n    strides[numCoords - 2] = shape[numCoords - 1];\n    for (let i = numCoords - 3; i >= 0; --i) {\n        strides[i] = `(${strides[i + 1]} * ${shape[i + 1]})`;\n    }\n    return strides;\n}\nexport function getLogicalCoordinatesFromFlatIndexByUniform(coords, variableName, index = 'index') {\n    const indicesArray = coords.map((_, i) => i);\n    const strides = symbolicallyComputeStrides(indicesArray, variableName);\n    return strides\n        .map((_, i) => {\n        const line1 = `int ${coords[i]} = ${index} / ${strides[i]}`;\n        const line2 = i === strides.length - 1 ?\n            `int ${coords[i + 1]} = ${index} - ${coords[i]} * ${strides[i]}` :\n            `index -= ${coords[i]} * ${strides[i]}`;\n        return `${line1}; ${line2};`;\n    })\n        .join('');\n}\nfunction buildVec(x) {\n    if (x.length === 1) {\n        return `${x[0]}`;\n    }\n    return `vec${x.length}(${x.join(',')})`;\n}\n/**\n * Produces GLSL code that computes the dot product of the input x and y\n * vectors. Handles splitting inputs into increments of vec4s when necessary.\n */\nexport function dotify(x, y) {\n    if (x.length !== y.length) {\n        throw new Error(`Vectors to be dotted must be of the same length -` +\n            `got ${x.length} and ${y.length}`);\n    }\n    const slices = [];\n    const nearestVec4 = Math.floor(x.length / 4);\n    const nearestVec4Remainder = x.length % 4;\n    for (let i = 0; i < nearestVec4; i++) {\n        const xSlice = x.slice(i * 4, i * 4 + 4);\n        const ySlice = y.slice(i * 4, i * 4 + 4);\n        slices.push(`${buildVec(xSlice)}, ${buildVec(ySlice)}`);\n    }\n    if (nearestVec4Remainder !== 0) {\n        let xSlice = x.slice(nearestVec4 * 4);\n        let ySlice = y.slice(nearestVec4 * 4);\n        if (xSlice.length === 1) {\n            xSlice = xSlice.map(d => `float(${d})`);\n            ySlice = ySlice.map(d => `float(${d})`);\n        }\n        slices.push(`${buildVec(xSlice)}, ${buildVec(ySlice)}`);\n    }\n    return slices.map((d, i) => `dot(${d})`).join('+');\n}\n/**\n * Produces GLSL that computes the flat index from 3D coordinates.\n */\nexport function getFlatIndexFrom3D(shape) {\n    const strides = util.computeStrides(shape).map(d => d.toString());\n    return `\n  int getFlatIndex(ivec3 coords) {\n    return coords.x * ${strides[0]} + coords.y * ${strides[1]} + coords.z;\n  }\n`;\n}\nexport function getFlatIndexFrom3DOutput() {\n    return `\n  int getFlatIndex(ivec3 coords) {\n    return coords.x * outShapeStrides[0] + coords.y * outShapeStrides[1] + coords.z;\n  }\n`;\n}\nexport const ENCODE_FLOAT_SNIPPET = `\n  const float FLOAT_MAX = 1.70141184e38;\n  const float FLOAT_MIN = 1.17549435e-38;\n\n  lowp vec4 encode_float(highp float v) {\n    if (isnan(v)) {\n      return vec4(255, 255, 255, 255);\n    }\n\n    highp float av = abs(v);\n\n    if(av < FLOAT_MIN) {\n      return vec4(0.0, 0.0, 0.0, 0.0);\n    } else if(v > FLOAT_MAX) {\n      return vec4(0.0, 0.0, 128.0, 127.0) / 255.0;\n    } else if(v < -FLOAT_MAX) {\n      return vec4(0.0, 0.0,  128.0, 255.0) / 255.0;\n    }\n\n    highp vec4 c = vec4(0,0,0,0);\n\n    highp float e = floor(log2(av));\n    highp float m = exp2(fract(log2(av))) - 1.0;\n\n    c[2] = floor(128.0 * m);\n    m -= c[2] / 128.0;\n    c[1] = floor(32768.0 * m);\n    m -= c[1] / 32768.0;\n    c[0] = floor(8388608.0 * m);\n\n    highp float ebias = e + 127.0;\n    c[3] = floor(ebias / 2.0);\n    ebias -= c[3] * 2.0;\n    c[2] += floor(ebias) * 128.0;\n\n    c[3] += 128.0 * step(0.0, -v);\n\n    return c / 255.0;\n  }\n`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZGVyX2NvbXBpbGVyX3V0aWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3NoYWRlcl9jb21waWxlcl91dGlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzQzs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGtDQUFrQyxDQUM5QyxNQUFnQixFQUFFLEtBQWUsRUFBRSxLQUFLLEdBQUcsT0FBTztJQUNwRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzNDLE9BQU8sT0FBTztTQUNULEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUNqQixNQUFNLEtBQUssR0FBRyxPQUFPLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLE1BQU0sTUFBTSxFQUFFLENBQUM7UUFDeEQsTUFBTSxLQUFLLEdBQUcsQ0FBQyxLQUFLLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDcEMsT0FBTyxNQUFNLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEtBQUssTUFBTSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxFQUFFLENBQUMsQ0FBQztZQUM5RCxZQUFZLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxNQUFNLEVBQUUsQ0FBQztRQUN4QyxPQUFPLEdBQUcsS0FBSyxLQUFLLEtBQUssR0FBRyxDQUFDO0lBQy9CLENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxVQUFVLGlEQUFpRCxDQUM3RCxNQUFnQixFQUFFLEtBQWUsRUFBRSxLQUFLLEdBQUcsT0FBTztJQUNwRCxNQUFNLE9BQU8sR0FBRyxJ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TSxvQkFBb0IsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBdUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbi8qKlxuICogUHJvZHVjZXMgR0xTTCBjb2RlIHRoYXQgZGVyaXZlcyBsb2dpY2FsIGNvb3JkaW5hdGVzIGZyb20gYSBmbGF0XG4gKiBpbmRleC4gVGhlIGNvZGUgcGVyZm9ybXMgaW50ZWdlciBkaXZpc2lvbiB3aXRoIGVhY2ggc3RyaWRlIGFuZCBkZWNyZW1lbnRzXG4gKiB0aGUgaW5kZXggdW50aWwgdGhlIGluZGV4IGVxdWFscyB0aGUgZmluYWwgZGltZW5zaW9uIGNvb3JkaW5hdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgIGNvb3Jkczogc3RyaW5nW10sIHNoYXBlOiBudW1iZXJbXSwgaW5kZXggPSAnaW5kZXgnKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpO1xuICByZXR1cm4gc3RyaWRlc1xuICAgICAgLm1hcCgoc3RyaWRlLCBpKSA9PiB7XG4gICAgICAgIGNvbnN0IGxpbmUxID0gYGludCAke2Nvb3Jkc1tpXX0gPSAke2luZGV4fSAvICR7c3RyaWRlfWA7XG4gICAgICAgIGNvbnN0IGxpbmUyID0gaSA9PT0gc3RyaWRlcy5sZW5ndGggLSAxID9cbiAgICAgICAgICAgIGBpbnQgJHtjb29yZHNbaSArIDFdfSA9ICR7aW5kZXh9IC0gJHtjb29yZHNbaV19ICogJHtzdHJpZGV9YCA6XG4gICAgICAgICAgICBgaW5kZXggLT0gJHtjb29yZHNbaV19ICogJHtzdHJpZGV9YDtcbiAgICAgICAgcmV0dXJuIGAke2xpbmUxfTsgJHtsaW5lMn07YDtcbiAgICAgIH0pXG4gICAgICAuam9pbignJyk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRPdXRwdXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgIGNvb3Jkczogc3RyaW5nW10sIHNoYXBlOiBudW1iZXJbXSwgaW5kZXggPSAnaW5kZXgnKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpO1xuICByZXR1cm4gc3RyaWRlc1xuICAgICAgLm1hcCgoXywgaSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5lMSA9IGBpbnQgJHtjb29yZHNbaV19ID0gJHtpbmRleH0gLyBvdXRTaGFwZVN0cmlkZXNbJHtpfV1gO1xuICAgICAgICBjb25zdCBsaW5lMiA9IGkgPT09IHN0cmlkZXMubGVuZ3RoIC0gMSA/XG4gICAgICAgICAgICBgaW50ICR7Y29vcmRzW2kgKyAxXX0gPSAke2luZGV4fSAtICR7Y29vcmRzW2ldfSAqIG91dFNoYXBlU3RyaWRlc1ske1xuICAgICAgICAgICAgICAgIGl9XWAgOlxuICAgICAgICAgICAgYGluZGV4IC09ICR7Y29vcmRzW2ldfSAqIG91dFNoYXBlU3RyaWRlc1ske2l9XWA7XG4gICAgICAgIHJldHVybiBgJHtsaW5lMX07ICR7bGluZTJ9O2A7XG4gICAgICB9KVxuICAgICAgLmpvaW4oJycpO1xufVxuXG4vLyBQcm9kdWNlcyBHTFNMIGNvZGUgdGhhdCBjb21wdXRlcyBzdHJpZGVzLlxuZnVuY3Rpb24gc3ltYm9saWNhbGx5Q29tcHV0ZVN0cmlkZXMoXG4gICAgaW5kaWNlc0FycjogbnVtYmVyW10sIHZhcmlhYmxlTmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuICBjb25zdCBudW1Db29yZHMgPSBpbmRpY2VzQXJyLmxlbmd0aDtcbiAgY29uc3Qgc2hhcGUgPSBpbmRpY2VzQXJyLm1hcChkID0+IGAke3ZhcmlhYmxlTmFtZX1bJHtkfV1gKTtcbiAgY29uc3Qgc3RyaWRlcyA9IG5ldyBBcnJheShudW1Db29yZHMgLSAxKTtcbiAgc3RyaWRlc1tudW1Db29yZHMgLSAyXSA9IHNoYXBlW251bUNvb3JkcyAtIDFdO1xuICBmb3IgKGxldCBpID0gbnVtQ29vcmRzIC0gMzsgaSA+PSAwOyAtLWkpIHtcbiAgICBzdHJpZGVzW2ldID0gYCgke3N0cmlkZXNbaSArIDFdfSAqICR7c2hhcGVbaSArIDFdfSlgO1xuICB9XG5cbiAgcmV0dXJuIHN0cmlkZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgIGNvb3Jkczogc3RyaW5nW10sIHZhcmlhYmxlTmFtZTogc3RyaW5nLCBpbmRleCA9ICdpbmRleCcpOiBzdHJpbmcge1xuICBjb25zdCBpbmRpY2VzQXJyYXkgPSBjb29yZHMubWFwKChfLCBpKSA9PiBpKTtcbiAgY29uc3Qgc3RyaWRlcyA9IHN5bWJvbGljYWxseUNvbXB1dGVTdHJpZGVzKGluZGljZXNBcnJheSwgdmFyaWFibGVOYW1lKTtcbiAgcmV0dXJuIHN0cmlkZXNcbiAgICAgIC5tYXAoKF8sIGkpID0+IHtcbiAgICAgICAgY29uc3QgbGluZTEgPSBgaW50ICR7Y29vcmRzW2ldfSA9ICR7aW5kZXh9IC8gJHtzdHJpZGVzW2ldfWA7XG4gICAgICAgIGNvbnN0IGxpbmUyID0gaSA9PT0gc3RyaWRlcy5sZW5ndGggLSAxID9cbiAgICAgICAgICAgIGBpbnQgJHtjb29yZHNbaSArIDFdfSA9ICR7aW5kZXh9IC0gJHtjb29yZHNbaV19ICogJHtzdHJpZGVzW2ldfWAgOlxuICAgICAgICAgICAgYGluZGV4IC09ICR7Y29vcmRzW2ldfSAqICR7c3RyaWRlc1tpXX1gO1xuICAgICAgICByZXR1cm4gYCR7bGluZTF9OyAke2xpbmUyfTtgO1xuICAgICAgfSlcbiAgICAgIC5qb2luKCcnKTtcbn1cblxuZnVuY3Rpb24gYnVpbGRWZWMoeDogc3RyaW5nW10pOiBzdHJpbmcge1xuICBpZiAoeC5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gYCR7eFswXX1gO1xuICB9XG4gIHJldHVybiBgdmVjJHt4Lmxlbmd0aH0oJHt4LmpvaW4oJywnKX0pYDtcbn1cblxuLyoqXG4gKiBQcm9kdWNlcyBHTFNMIGNvZGUgdGhhdCBjb21wdXRlcyB0aGUgZG90IHByb2R1Y3Qgb2YgdGhlIGlucHV0IHggYW5kIHlcbiAqIHZlY3RvcnMuIEhhbmRsZXMgc3BsaXR0aW5nIGlucHV0cyBpbnRvIGluY3JlbWVudHMgb2YgdmVjNHMgd2hlbiBuZWNlc3NhcnkuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBkb3RpZnkoeDogc3RyaW5nW10sIHk6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHgubGVuZ3RoICE9PSB5Lmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgYFZlY3RvcnMgdG8gYmUgZG90dGVkIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoIC1gICtcbiAgICAgICAgYGdvdCAke3gubGVuZ3RofSBhbmQgJHt5Lmxlbmd0aH1gKTtcbiAgfVxuXG4gIGNvbnN0IHNsaWNlczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgbmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKHgubGVuZ3RoIC8gNCk7XG4gIGNvbnN0IG5lYXJlc3RWZWM0UmVtYWluZGVyID0geC5sZW5ndGggJSA0O1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbmVhcmVzdFZlYzQ7IGkrKykge1xuICAgIGNvbnN0IHhTbGljZSA9IHguc2xpY2UoaSAqIDQsIGkgKiA0ICsgNCk7XG4gICAgY29uc3QgeVNsaWNlID0geS5zbGljZShpICogNCwgaSAqIDQgKyA0KTtcbiAgICBzbGljZXMucHVzaChgJHtidWlsZFZlYyh4U2xpY2UpfSwgJHtidWlsZFZlYyh5U2xpY2UpfWApO1xuICB9XG5cbiAgaWYgKG5lYXJlc3RWZWM0UmVtYWluZGVyICE9PSAwKSB7XG4gICAgbGV0IHhTbGljZSA9IHguc2xpY2UobmVhcmVzdFZlYzQgKiA0KTtcbiAgICBsZXQgeVNsaWNlID0geS5zbGljZShuZWFyZXN0VmVjNCAqIDQpO1xuICAgIGlmICh4U2xpY2UubGVuZ3RoID09PSAxKSB7XG4gICAgICB4U2xpY2UgPSB4U2xpY2UubWFwKGQgPT4gYGZsb2F0KCR7ZH0pYCk7XG4gICAgICB5U2xpY2UgPSB5U2xpY2UubWFwKGQgPT4gYGZsb2F0KCR7ZH0pYCk7XG4gICAgfVxuICAgIHNsaWNlcy5wdXNoKGAke2J1aWxkVmVjKHhTbGljZSl9LCAke2J1aWxkVmVjKHlTbGljZSl9YCk7XG4gIH1cblxuICByZXR1cm4gc2xpY2VzLm1hcCgoZCwgaSkgPT4gYGRvdCgke2R9KWApLmpvaW4oJysnKTtcbn1cblxuLyoqXG4gKiBQcm9kdWNlcyBHTFNMIHRoYXQgY29tcHV0ZXMgdGhlIGZsYXQgaW5kZXggZnJvbSAzRCBjb29yZGluYXRlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEZsYXRJbmRleEZyb20zRChzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdKTogc3RyaW5nIHtcbiAgY29uc3Qgc3RyaWRlcyA9IHV0aWwuY29tcHV0ZVN0cmlkZXMoc2hhcGUpLm1hcChkID0+IGQudG9TdHJpbmcoKSk7XG5cbiAgcmV0dXJuIGBcbiAgaW50IGdldEZsYXRJbmRleChpdmVjMyBjb29yZHMpIHtcbiAgICByZXR1cm4gY29vcmRzLnggKiAke3N0cmlkZXNbMF19ICsgY29vcmRzLnkgKiAke3N0cmlkZXNbMV19ICsgY29vcmRzLno7XG4gIH1cbmA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRGbGF0SW5kZXhGcm9tM0RPdXRwdXQoKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgaW50IGdldEZsYXRJbmRleChpdmVjMyBjb29yZHMpIHtcbiAgICByZXR1cm4gY29vcmRzLnggKiBvdXRTaGFwZVN0cmlkZXNbMF0gKyBjb29yZHMueSAqIG91dFNoYXBlU3RyaWRlc1sxXSArIGNvb3Jkcy56O1xuICB9XG5gO1xufVxuXG5leHBvcnQgY29uc3QgRU5DT0RFX0ZMT0FUX1NOSVBQRVQgPSBgXG4gIGNvbnN0IGZsb2F0IEZMT0FUX01BWCA9IDEuNzAxNDExODRlMzg7XG4gIGNvbnN0IGZsb2F0IEZMT0FUX01JTiA9IDEuMTc1NDk0MzVlLTM4O1xuXG4gIGxvd3AgdmVjNCBlbmNvZGVfZmxvYXQoaGlnaHAgZmxvYXQgdikge1xuICAgIGlmIChpc25hbih2KSkge1xuICAgICAgcmV0dXJuIHZlYzQoMjU1LCAyNTUsIDI1NSwgMjU1KTtcbiAgICB9XG5cbiAgICBoaWdocCBmbG9hdCBhdiA9IGFicyh2KTtcblxuICAgIGlmKGF2IDwgRkxPQVRfTUlOKSB7XG4gICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMC4wLCAwLjApO1xuICAgIH0gZWxzZSBpZih2ID4gRkxPQVRfTUFYKSB7XG4gICAgICByZXR1cm4gdmVjNCgwLjAsIDAuMCwgMTI4LjAsIDEyNy4wKSAvIDI1NS4wO1xuICAgIH0gZWxzZSBpZih2IDwgLUZMT0FUX01BWCkge1xuICAgICAgcmV0dXJuIHZlYzQoMC4wLCAwLjAsICAxMjguMCwgMjU1LjApIC8gMjU1LjA7XG4gICAgfVxuXG4gICAgaGlnaHAgdmVjNCBjID0gdmVjNCgwLDAsMCwwKTtcblxuICAgIGhpZ2hwIGZsb2F0IGUgPSBmbG9vcihsb2cyKGF2KSk7XG4gICAgaGlnaHAgZmxvYXQgbSA9IGV4cDIoZnJhY3QobG9nMihhdikpKSAtIDEuMDtcblxuICAgIGNbMl0gPSBmbG9vcigxMjguMCAqIG0pO1xuICAgIG0gLT0gY1syXSAvIDEyOC4wO1xuICAgIGNbMV0gPSBmbG9vcigzMjc2OC4wICogbSk7XG4gICAgbSAtPSBjWzFdIC8gMzI3NjguMDtcbiAgICBjWzBdID0gZmxvb3IoODM4ODYwOC4wICogbSk7XG5cbiAgICBoaWdocCBmbG9hdCBlYmlhcyA9IGUgKyAxMjcuMDtcbiAgICBjWzNdID0gZmxvb3IoZWJpYXMgLyAyLjApO1xuICAgIGViaWFzIC09IGNbM10gKiAyLjA7XG4gICAgY1syXSArPSBmbG9vcihlYmlhcykgKiAxMjguMDtcblxuICAgIGNbM10gKz0gMTI4LjAgKiBzdGVwKDAuMCwgLXYpO1xuXG4gICAgcmV0dXJuIGMgLyAyNTUuMDtcbiAgfVxuYDtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Please make sure the shaker key in makeShaderKey in gpgpu_math.ts is well\n// mapped if any shader source code is changed in this file.\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nconst { getBroadcastDims } = backend_util;\nimport { getGlslDifferences } from './glsl_version';\nimport * as shader_util from './shader_compiler_util';\nexport function makeShader(inputsInfo, outputShape, program) {\n    const prefixSnippets = [];\n    inputsInfo.forEach(x => {\n        const size = util.sizeFromShape(x.shapeInfo.logicalShape);\n        // Snippet when we decided to upload the values as uniform.\n        if (x.shapeInfo.isUniform) {\n            prefixSnippets.push(`uniform float ${x.name}${size > 1 ? `[${size}]` : ''};`);\n        }\n        else {\n            prefixSnippets.push(`uniform sampler2D ${x.name};`);\n            prefixSnippets.push(`uniform int offset${x.name};`);\n        }\n        if (program.enableShapeUniforms) {\n            const { uniformShape } = getUniformInfoFromShape(program.packedInputs, x.shapeInfo.logicalShape, x.shapeInfo.texShape);\n            switch (uniformShape.length) {\n                case 1:\n                    prefixSnippets.push(`uniform int ${x.name}Shape;`);\n                    break;\n                case 2:\n                    prefixSnippets.push(`uniform ivec2 ${x.name}Shape;`);\n                    break;\n                case 3:\n                    prefixSnippets.push(`uniform ivec3 ${x.name}Shape;`);\n                    break;\n                case 4:\n                    prefixSnippets.push(`uniform ivec4 ${x.name}Shape;`);\n                    break;\n                default:\n                    break;\n            }\n            prefixSnippets.push(`uniform ivec2 ${x.name}TexShape;`);\n        }\n    });\n    if (program.enableShapeUniforms) {\n        switch (outputShape.logicalShape.length) {\n            case 1:\n                prefixSnippets.push(`uniform int outShape;`);\n                break;\n            case 2:\n                prefixSnippets.push(`uniform ivec2 outShape;`);\n                prefixSnippets.push(`uniform int outShapeStrides;`);\n                break;\n            case 3:\n                prefixSnippets.push(`uniform ivec3 outShape;`);\n                prefixSnippets.push(`uniform ivec2 outShapeStrides;`);\n                break;\n            case 4:\n                prefixSnippets.push(`uniform ivec4 outShape;`);\n                prefixSnippets.push(`uniform ivec3 outShapeStrides;`);\n                break;\n            default:\n                break;\n        }\n        prefixSnippets.push(`uniform ivec2 outTexShape;`);\n    }\n    if (program.customUniforms) {\n        program.customUniforms.forEach((d) => {\n            prefixSnippets.push(`uniform ${d.type} ${d.name}${d.arrayIndex ? `[${d.arrayIndex}]` : ''};`);\n        });\n    }\n    const inputPrefixSnippet = prefixSnippets.join('\\n');\n    const inputSamplingSnippet = inputsInfo\n        .map(x => getInputSamplingSnippet(x, outputShape, program.packedInputs, program.enableShapeUniforms))\n        .join('\\n');\n    const outTexShape = outputShape.texShape;\n    const glsl = getGlslDifferences();\n    const floatTextureSampleSnippet = getFloatTextureSampleSnippet(glsl);\n    let outputSamplingSnippet;\n    let floatTextureSetOutputSnippet;\n    let shaderPrefix = getShaderPrefix(glsl);\n    if (outputShape.isPacked) {\n        outputSamplingSnippet = getPackedOutputSamplingSnippet(outputShape.logicalShape, outTexShape, program.enableShapeUniforms);\n        floatTextureSetOutputSnippet = getFloatTextureSetRGBASnippet(glsl);\n    }\n    else {\n        outputSamplingSnippet = getOutputSamplingSnippet(outputShape.logicalShape, outTexShape, program.enableShapeUniforms);\n        floatTextureSetOutputSnippet = getFloatTextureSetRSnippet(glsl);\n    }\n    if (program.packedInputs) {\n        shaderPrefix += SHADER_PACKED_PREFIX;\n    }\n    const source = [\n        shaderPrefix, floatTextureSampleSnippet, floatTextureSetOutputSnippet,\n        inputPrefixSnippet, outputSamplingSnippet, inputSamplingSnippet,\n        program.userCode\n    ].join('\\n');\n    return source;\n}\nfunction getSamplerFromInInfo(inInfo, enableShapeUniforms = false) {\n    const shape = inInfo.shapeInfo.logicalShape;\n    switch (shape.length) {\n        case 0:\n            return getSamplerScalar(inInfo, enableShapeUniforms);\n        case 1:\n            return getSampler1D(inInfo, enableShapeUniforms);\n        case 2:\n            return getSampler2D(inInfo, enableShapeUniforms);\n        case 3:\n            return getSampler3D(inInfo, enableShapeUniforms);\n        case 4:\n            return getSampler4D(inInfo, enableShapeUniforms);\n        case 5:\n            return getSampler5D(inInfo);\n        case 6:\n            return getSampler6D(inInfo);\n        default:\n            throw new Error(`${shape.length}-D input sampling` +\n                ` is not yet supported`);\n    }\n}\nfunction getPackedSamplerFromInInfo(inInfo, enableShapeUniforms) {\n    const shape = inInfo.shapeInfo.logicalShape;\n    switch (shape.length) {\n        case 0:\n            return getPackedSamplerScalar(inInfo);\n        case 1:\n            return getPackedSampler1D(inInfo, enableShapeUniforms);\n        case 2:\n            return getPackedSampler2D(inInfo, enableShapeUniforms);\n        case 3:\n            return getPackedSampler3D(inInfo, enableShapeUniforms);\n        default:\n            return getPackedSamplerND(inInfo, enableShapeUniforms);\n    }\n}\nfunction getInputSamplingSnippet(inInfo, outShapeInfo, usesPackedTextures = false, enableShapeUniforms) {\n    let res = '';\n    if (usesPackedTextures) {\n        res += getPackedSamplerFromInInfo(inInfo, enableShapeUniforms);\n    }\n    else {\n        res += getSamplerFromInInfo(inInfo, enableShapeUniforms);\n    }\n    const inShape = inInfo.shapeInfo.logicalShape;\n    const outShape = outShapeInfo.logicalShape;\n    if (inShape.length <= outShape.length) {\n        if (usesPackedTextures) {\n            res += getPackedSamplerAtOutputCoords(inInfo, outShapeInfo);\n        }\n        else {\n            res += getSamplerAtOutputCoords(inInfo, outShapeInfo);\n        }\n    }\n    return res;\n}\nfunction getPackedOutputSamplingSnippet(outShape, outTexShape, enableShapeUniforms) {\n    switch (outShape.length) {\n        case 0:\n            return getOutputScalarCoords();\n        case 1:\n            return getOutputPacked1DCoords(outShape, outTexShape, enableShapeUniforms);\n        case 2:\n            return getOutputPacked2DCoords(outShape, outTexShape, enableShapeUniforms);\n        case 3:\n            return getOutputPacked3DCoords(outShape, outTexShape, enableShapeUniforms);\n        default:\n            return getOutputPackedNDCoords(outShape, outTexShape, enableShapeUniforms);\n    }\n}\nfunction getOutputSamplingSnippet(outShape, outTexShape, enableShapeUniforms) {\n    switch (outShape.length) {\n        case 0:\n            return getOutputScalarCoords();\n        case 1:\n            return getOutput1DCoords(outShape, outTexShape, enableShapeUniforms);\n        case 2:\n            return getOutput2DCoords(outShape, outTexShape, enableShapeUniforms);\n        case 3:\n            return getOutput3DCoords(outShape, outTexShape, enableShapeUniforms);\n        case 4:\n            return getOutput4DCoords(outShape, outTexShape, enableShapeUniforms);\n        case 5:\n            return getOutput5DCoords(outShape, outTexShape);\n        case 6:\n            return getOutput6DCoords(outShape, outTexShape);\n        default:\n            throw new Error(`${outShape.length}-D output sampling is not yet supported`);\n    }\n}\nfunction getFloatTextureSampleSnippet(glsl) {\n    return `\n    float sampleTexture(sampler2D textureSampler, vec2 uv) {\n      return ${glsl.texture2D}(textureSampler, uv).r;\n    }\n  `;\n}\nfunction getFloatTextureSetRSnippet(glsl) {\n    return `\n    void setOutput(float val) {\n      ${glsl.output} = vec4(val, 0, 0, 0);\n    }\n  `;\n}\nfunction getFloatTextureSetRGBASnippet(glsl) {\n    return `\n    void setOutput(vec4 val) {\n      ${glsl.output} = val;\n    }\n  `;\n}\nfunction getShaderPrefix(glsl) {\n    const SHADER_PREFIX = `${glsl.version}\n    precision highp float;\n    precision highp int;\n    precision highp sampler2D;\n    ${glsl.varyingFs} vec2 resultUV;\n    ${glsl.defineOutput}\n    const vec2 halfCR = vec2(0.5, 0.5);\n\n    struct ivec5\n    {\n      int x;\n      int y;\n      int z;\n      int w;\n      int u;\n    };\n\n    struct ivec6\n    {\n      int x;\n      int y;\n      int z;\n      int w;\n      int u;\n      int v;\n    };\n\n    uniform float NAN;\n    ${glsl.defineSpecialNaN}\n    ${glsl.defineSpecialInf}\n    ${glsl.defineRound}\n\n    int imod(int x, int y) {\n      return x - y * (x / y);\n    }\n\n    int idiv(int a, int b, float sign) {\n      int res = a / b;\n      int mod = imod(a, b);\n      if (sign < 0. && mod != 0) {\n        res -= 1;\n      }\n      return res;\n    }\n\n    //Based on the work of Dave Hoskins\n    //https://www.shadertoy.com/view/4djSRW\n    #define HASHSCALE1 443.8975\n    float random(float seed){\n      vec2 p = resultUV * seed;\n      vec3 p3  = fract(vec3(p.xyx) * HASHSCALE1);\n      p3 += dot(p3, p3.yzx + 19.19);\n      return fract((p3.x + p3.y) * p3.z);\n    }\n\n    ${SAMPLE_1D_SNIPPET}\n    ${SAMPLE_2D_SNIPPET}\n    ${SAMPLE_3D_SNIPPET}\n  `;\n    return SHADER_PREFIX;\n}\nconst SAMPLE_1D_SNIPPET = `\nvec2 uvFromFlat(int texNumR, int texNumC, int index) {\n  int texR = index / texNumC;\n  int texC = index - texR * texNumC;\n  return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\nvec2 packedUVfrom1D(int texNumR, int texNumC, int index) {\n  int texelIndex = index / 2;\n  int texR = texelIndex / texNumC;\n  int texC = texelIndex - texR * texNumC;\n  return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`;\nconst SAMPLE_2D_SNIPPET = `\nvec2 packedUVfrom2D(int texelsInLogicalRow, int texNumR,\n  int texNumC, int row, int col) {\n  int texelIndex = (row / 2) * texelsInLogicalRow + (col / 2);\n  int texR = texelIndex / texNumC;\n  int texC = texelIndex - texR * texNumC;\n  return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`;\nconst SAMPLE_3D_SNIPPET = `\nvec2 packedUVfrom3D(int texNumR, int texNumC,\n    int texelsInBatch, int texelsInLogicalRow, int b,\n    int row, int col) {\n  int index = b * texelsInBatch + (row / 2) * texelsInLogicalRow + (col / 2);\n  int texR = index / texNumC;\n  int texC = index - texR * texNumC;\n  return (vec2(texC, texR) + halfCR) / vec2(texNumC, texNumR);\n}\n`;\nconst SHADER_PACKED_PREFIX = `\n  float getChannel(vec4 frag, vec2 innerDims) {\n    vec2 modCoord = mod(innerDims, 2.);\n    return modCoord.x == 0. ?\n      (modCoord.y == 0. ? frag.r : frag.g) :\n      (modCoord.y == 0. ? frag.b : frag.a);\n  }\n  float getChannel(vec4 frag, int dim) {\n    float modCoord = mod(float(dim), 2.);\n    return modCoord == 0. ? frag.r : frag.g;\n  }\n`;\nfunction getOutputScalarCoords() {\n    return `\n    int getOutputCoords() {\n      return 0;\n    }\n  `;\n}\nfunction getOutputPacked1DCoords(shape, texShape, enableShapeUniforms) {\n    const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n    if (packedTexShape[0] === 1) {\n        if (enableShapeUniforms) {\n            return `\n      int getOutputCoords() {\n        return 2 * int(resultUV.x * ceil(float(outTexShape[1]) / 2.0));\n      }\n    `;\n        }\n        return `\n      int getOutputCoords() {\n        return 2 * int(resultUV.x * ${packedTexShape[1]}.0);\n      }\n    `;\n    }\n    if (packedTexShape[1] === 1) {\n        if (enableShapeUniforms) {\n            return `\n      int getOutputCoords() {\n        return 2 * int(resultUV.y * ceil(float(outTexShape[0]) / 2.0));\n      }\n    `;\n        }\n        return `\n      int getOutputCoords() {\n        return 2 * int(resultUV.y * ${packedTexShape[0]}.0);\n      }\n    `;\n    }\n    if (enableShapeUniforms) {\n        return `\n    int getOutputCoords() {\n      ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(packedTexShape[0], packedTexShape[1]));\n      return 2 * (resTexRC.x * packedTexShape[1] + resTexRC.y);\n    }\n  `;\n    }\n    return `\n    int getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n      return 2 * (resTexRC.x * ${packedTexShape[1]} + resTexRC.y);\n    }\n  `;\n}\nfunction getOutput1DCoords(shape, texShape, enableShapeUniforms) {\n    if (texShape[0] === 1) {\n        if (enableShapeUniforms) {\n            return `\n      int getOutputCoords() {\n        return int(resultUV.x * float(outTexShape[1]));\n      }\n    `;\n        }\n        return `\n      int getOutputCoords() {\n        return int(resultUV.x * ${texShape[1]}.0);\n      }\n    `;\n    }\n    if (texShape[1] === 1) {\n        if (enableShapeUniforms) {\n            return `\n      int getOutputCoords() {\n        return int(resultUV.y * float(outTexShape[0]));\n      }\n    `;\n        }\n        return `\n      int getOutputCoords() {\n        return int(resultUV.y * ${texShape[0]}.0);\n      }\n    `;\n    }\n    if (enableShapeUniforms) {\n        return `\n    int getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(outTexShape[0], outTexShape[1]));\n      return resTexRC.x * outTexShape[1] + resTexRC.y;\n    }\n  `;\n    }\n    return `\n    int getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(${texShape[0]}, ${texShape[1]}));\n      return resTexRC.x * ${texShape[1]} + resTexRC.y;\n    }\n  `;\n}\nfunction getOutputPacked3DCoords(shape, texShape, enableShapeUniforms) {\n    if (enableShapeUniforms) {\n        return `\n    ivec3 getOutputCoords() {\n      ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n      int texelsInLogicalRow = int(ceil(float(outShape[2]) / 2.0));\n      int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[1]) / 2.0));\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(packedTexShape[0], packedTexShape[1]));\n      int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n      int b = index / texelsInBatch;\n      index -= b * texelsInBatch;\n\n      int r = 2 * (index / texelsInLogicalRow);\n      int c = imod(index, texelsInLogicalRow) * 2;\n\n      return ivec3(b, r, c);\n    }\n  `;\n    }\n    const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n    const texelsInLogicalRow = Math.ceil(shape[2] / 2);\n    const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[1] / 2);\n    return `\n    ivec3 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n      int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y;\n\n      int b = index / ${texelsInBatch};\n      index -= b * ${texelsInBatch};\n\n      int r = 2 * (index / ${texelsInLogicalRow});\n      int c = imod(index, ${texelsInLogicalRow}) * 2;\n\n      return ivec3(b, r, c);\n    }\n  `;\n}\nfunction getOutput3DCoords(shape, texShape, enableShapeUniforms) {\n    if (enableShapeUniforms) {\n        const coordsFromIndexSnippet = shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd'], shape);\n        return `\n  ivec3 getOutputCoords() {\n    ivec2 resTexRC = ivec2(resultUV.yx *\n                           vec2(outTexShape[0], outTexShape[1]));\n    int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n    ${coordsFromIndexSnippet}\n    return ivec3(r, c, d);\n  }\n`;\n    }\n    const coordsFromIndexSnippet = shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], shape);\n    return `\n    ivec3 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(${texShape[0]}, ${texShape[1]}));\n      int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n      ${coordsFromIndexSnippet}\n      return ivec3(r, c, d);\n    }\n  `;\n}\nfunction getOutputPackedNDCoords(shape, texShape, enableShapeUniforms) {\n    if (enableShapeUniforms) {\n        // TODO: support 5d and 6d\n        return `\n    ivec4 getOutputCoords() {\n      ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(packedTexShape[0], packedTexShape[1]));\n      int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n\n      int texelsInLogicalRow = int(ceil(float(outShape[3]) / 2.0));\n      int texelsInBatch = texelsInLogicalRow * int(ceil(float(outShape[2]) / 2.0));\n      int texelsInBatchN = texelsInBatch * outShape[1];\n\n      int b2 = index / texelsInBatchN;\n      index -= b2 * texelsInBatchN;\n\n      int b = index / texelsInBatch;\n      index -= b * texelsInBatch;\n\n      int r = 2 * (index / texelsInLogicalRow);\n      int c = imod(index, texelsInLogicalRow) * 2;\n\n      return ivec4(b2, b, r, c);\n    }\n  `;\n    }\n    const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n    const texelsInLogicalRow = Math.ceil(shape[shape.length - 1] / 2);\n    const texelsInBatch = texelsInLogicalRow * Math.ceil(shape[shape.length - 2] / 2);\n    let texelsInBatchN = texelsInBatch;\n    let batches = ``;\n    let coords = 'b, r, c';\n    for (let b = 2; b < shape.length - 1; b++) {\n        texelsInBatchN *= shape[shape.length - b - 1];\n        batches = `\n      int b${b} = index / ${texelsInBatchN};\n      index -= b${b} * ${texelsInBatchN};\n    ` + batches;\n        coords = `b${b}, ` + coords;\n    }\n    return `\n    ivec${shape.length} getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n      int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y;\n\n      ${batches}\n\n      int b = index / ${texelsInBatch};\n      index -= b * ${texelsInBatch};\n\n      int r = 2 * (index / ${texelsInLogicalRow});\n      int c = imod(index, ${texelsInLogicalRow}) * 2;\n\n      return ivec${shape.length}(${coords});\n    }\n  `;\n}\nfunction getOutput4DCoords(shape, texShape, enableShapeUniforms) {\n    if (enableShapeUniforms) {\n        const coordsFromIndexSnippet = shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd', 'd2'], shape);\n        return `\n    ivec4 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n        vec2(outTexShape[0], outTexShape[1]));\n      int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n      ${coordsFromIndexSnippet}\n      return ivec4(r, c, d, d2);\n    }\n  `;\n    }\n    const coordsFromIndexSnippet = shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2'], shape);\n    return `\n    ivec4 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n        vec2(${texShape[0]}, ${texShape[1]}));\n      int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n      ${coordsFromIndexSnippet}\n      return ivec4(r, c, d, d2);\n    }\n  `;\n}\nfunction getOutput5DCoords(shape, texShape) {\n    const coordsFromIndexSnippet = shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2', 'd3'], shape);\n    return `\n    ivec5 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx * vec2(${texShape[0]},\n                             ${texShape[1]}));\n\n      int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n\n      ${coordsFromIndexSnippet}\n\n      ivec5 outShape = ivec5(r, c, d, d2, d3);\n      return outShape;\n    }\n  `;\n}\nfunction getOutput6DCoords(shape, texShape) {\n    const coordsFromIndexSnippet = shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd', 'd2', 'd3', 'd4'], shape);\n    return `\n    ivec6 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n        vec2(${texShape[0]}, ${texShape[1]}));\n      int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n\n      ${coordsFromIndexSnippet}\n\n      ivec6 result = ivec6(r, c, d, d2, d3, d4);\n      return result;\n    }\n  `;\n}\nfunction getOutputPacked2DCoords(shape, texShape, enableShapeUniforms) {\n    const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n    if (util.arraysEqual(shape, texShape)) {\n        if (enableShapeUniforms) {\n            return `\n      ivec2 getOutputCoords() {\n        ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n        return 2 * ivec2(resultUV.yx * vec2(packedTexShape[0], packedTexShape[1]));\n      }\n    `;\n        }\n        return `\n      ivec2 getOutputCoords() {\n        return 2 * ivec2(resultUV.yx * vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n      }\n    `;\n    }\n    // texels needed to accommodate a logical row\n    const texelsInLogicalRow = Math.ceil(shape[1] / 2);\n    /**\n     * getOutputCoords\n     *\n     * resTexRC: The rows and columns of the texels. If you move over one\n     * texel to the right in the packed texture, you are moving over one column\n     * (not two).\n     *\n     * index: The texel index\n     */\n    if (enableShapeUniforms) {\n        return `\n    ivec2 getOutputCoords() {\n      ivec2 packedTexShape = ivec2(ceil(float(outTexShape[0]) / 2.0), ceil(float(outTexShape[1]) / 2.0));\n      int texelsInLogicalRow = int(ceil(float(outShape[1]) / 2.0));\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(packedTexShape[0], packedTexShape[1]));\n\n      int index = resTexRC.x * packedTexShape[1] + resTexRC.y;\n      int r = 2 * (index / texelsInLogicalRow);\n      int c = imod(index, texelsInLogicalRow) * 2;\n\n      return ivec2(r, c);\n    }\n  `;\n    }\n    return `\n    ivec2 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(${packedTexShape[0]}, ${packedTexShape[1]}));\n\n      int index = resTexRC.x * ${packedTexShape[1]} + resTexRC.y;\n      int r = 2 * (index / ${texelsInLogicalRow});\n      int c = imod(index, ${texelsInLogicalRow}) * 2;\n\n      return ivec2(r, c);\n    }\n  `;\n}\nfunction getOutput2DCoords(shape, texShape, enableShapeUniforms) {\n    if (util.arraysEqual(shape, texShape)) {\n        if (enableShapeUniforms) {\n            return `\n      ivec2 getOutputCoords() {\n        return ivec2(resultUV.yx * vec2(outTexShape[0], outTexShape[1]));\n      }\n    `;\n        }\n        return `\n      ivec2 getOutputCoords() {\n        return ivec2(resultUV.yx * vec2(${texShape[0]}, ${texShape[1]}));\n      }\n    `;\n    }\n    if (shape[1] === 1) {\n        if (enableShapeUniforms) {\n            return `\n      ivec2 getOutputCoords() {\n        ivec2 resTexRC = ivec2(resultUV.yx *\n                               vec2(outTexShape[0], outTexShape[1]));\n        int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n        return ivec2(index, 0);\n      }\n    `;\n        }\n        return `\n      ivec2 getOutputCoords() {\n        ivec2 resTexRC = ivec2(resultUV.yx *\n                               vec2(${texShape[0]}, ${texShape[1]}));\n        int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n        return ivec2(index, 0);\n      }\n    `;\n    }\n    if (shape[0] === 1) {\n        if (enableShapeUniforms) {\n            return `\n      ivec2 getOutputCoords() {\n        ivec2 resTexRC = ivec2(resultUV.yx *\n                               vec2(outTexShape[0], outTexShape[1]));\n        int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n        return ivec2(0, index);\n      }\n    `;\n        }\n        return `\n      ivec2 getOutputCoords() {\n        ivec2 resTexRC = ivec2(resultUV.yx *\n                               vec2(${texShape[0]}, ${texShape[1]}));\n        int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n        return ivec2(0, index);\n      }\n    `;\n    }\n    if (enableShapeUniforms) {\n        return `\n    ivec2 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(outTexShape[0], outTexShape[1]));\n      int index = resTexRC.x * outTexShape[1] + resTexRC.y;\n      int r = index / outShape[1];\n      int c = index - r * outShape[1];\n      return ivec2(r, c);\n    }\n  `;\n    }\n    return `\n    ivec2 getOutputCoords() {\n      ivec2 resTexRC = ivec2(resultUV.yx *\n                             vec2(${texShape[0]}, ${texShape[1]}));\n      int index = resTexRC.x * ${texShape[1]} + resTexRC.y;\n      int r = index / ${shape[1]};\n      int c = index - r * ${shape[1]};\n      return ivec2(r, c);\n    }\n  `;\n}\nfunction getFlatOffsetUniformName(texName) {\n    return `offset${texName}`;\n}\nfunction getPackedSamplerScalar(inputInfo) {\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const glsl = getGlslDifferences();\n    return `\n    vec4 ${funcName}() {\n      return ${glsl.texture2D}(${texName}, halfCR);\n    }\n  `;\n}\nfunction getSamplerScalar(inputInfo, enableShapeUniforms) {\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    if (inputInfo.shapeInfo.isUniform) {\n        return `float ${funcName}() {return ${texName};}`;\n    }\n    const [texNumR, texNumC] = inputInfo.shapeInfo.texShape;\n    if (texNumR === 1 && texNumC === 1) {\n        return `\n      float ${funcName}() {\n        return sampleTexture(${texName}, halfCR);\n      }\n    `;\n    }\n    const offset = getFlatOffsetUniformName(texName);\n    if (enableShapeUniforms) {\n        return `\n    float ${funcName}() {\n      vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], ${offset});\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n    }\n    const [tNumR, tNumC] = inputInfo.shapeInfo.texShape;\n    return `\n    float ${funcName}() {\n      vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, ${offset});\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n}\nfunction getPackedSampler1D(inputInfo, enableShapeUniforms) {\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const texShape = inputInfo.shapeInfo.texShape;\n    const glsl = getGlslDifferences();\n    if (enableShapeUniforms) {\n        return `\n    vec4 ${funcName}(int index) {\n      ivec2 packedTexShape = ivec2(ceil(float(${texName}TexShape[0]) / 2.0), ceil(float(${texName}TexShape[1]) / 2.0));\n      vec2 uv = packedUVfrom1D(\n        packedTexShape[0], packedTexShape[1], index);\n      return ${glsl.texture2D}(${texName}, uv);\n    }\n  `;\n    }\n    const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n    return `\n    vec4 ${funcName}(int index) {\n      vec2 uv = packedUVfrom1D(\n        ${packedTexShape[0]}, ${packedTexShape[1]}, index);\n      return ${glsl.texture2D}(${texName}, uv);\n    }\n  `;\n}\nfunction getSampler1D(inputInfo, enableShapeUniforms) {\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    if (inputInfo.shapeInfo.isUniform) {\n        // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n        return `\n      float ${funcName}(int index) {\n        ${getUniformSampler(inputInfo)}\n      }\n    `;\n    }\n    const texShape = inputInfo.shapeInfo.texShape;\n    const tNumR = texShape[0];\n    const tNumC = texShape[1];\n    if (tNumC === 1 && tNumR === 1) {\n        return `\n      float ${funcName}(int index) {\n        return sampleTexture(${texName}, halfCR);\n      }\n    `;\n    }\n    const offset = getFlatOffsetUniformName(texName);\n    if (tNumC === 1) {\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int index) {\n        vec2 uv = vec2(0.5, (float(index + ${offset}) + 0.5) / float(${texName}TexShape[0]));\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        return `\n      float ${funcName}(int index) {\n        vec2 uv = vec2(0.5, (float(index + ${offset}) + 0.5) / ${tNumR}.0);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    if (tNumR === 1) {\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int index) {\n        vec2 uv = vec2((float(index + ${offset}) + 0.5) / float(${texName}TexShape[1]), 0.5);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        return `\n      float ${funcName}(int index) {\n        vec2 uv = vec2((float(index + ${offset}) + 0.5) / ${tNumC}.0, 0.5);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    if (enableShapeUniforms) {\n        return `\n    float ${funcName}(int index) {\n      vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], index + ${offset});\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n    }\n    return `\n    float ${funcName}(int index) {\n      vec2 uv = uvFromFlat(${tNumR}, ${tNumC}, index + ${offset});\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n}\nfunction getPackedSampler2D(inputInfo, enableShapeUniforms) {\n    const shape = inputInfo.shapeInfo.logicalShape;\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const texShape = inputInfo.shapeInfo.texShape;\n    const texNumR = texShape[0];\n    const texNumC = texShape[1];\n    const glsl = getGlslDifferences();\n    if (texShape != null && util.arraysEqual(shape, texShape)) {\n        if (enableShapeUniforms) {\n            return `\n      vec4 ${funcName}(int row, int col) {\n        vec2 uv = (vec2(col, row) + halfCR) / vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n\n        return ${glsl.texture2D}(${texName}, uv);\n      }\n    `;\n        }\n        return `\n      vec4 ${funcName}(int row, int col) {\n        vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n\n        return ${glsl.texture2D}(${texName}, uv);\n      }\n    `;\n    }\n    if (enableShapeUniforms) {\n        return `\n    vec4 ${funcName}(int row, int col) {\n      ivec2 packedTexShape = ivec2(ceil(float(${texName}TexShape[0]) / 2.0), ceil(float(${texName}TexShape[1]) / 2.0));\n      int valuesPerRow = int(ceil(float(${texName}Shape[1]) / 2.0));\n      vec2 uv = packedUVfrom2D(valuesPerRow, packedTexShape[0], packedTexShape[1], row, col);\n      return ${glsl.texture2D}(${texName}, uv);\n    }\n  `;\n    }\n    const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n    const valuesPerRow = Math.ceil(shape[1] / 2);\n    return `\n    vec4 ${funcName}(int row, int col) {\n      vec2 uv = packedUVfrom2D(${valuesPerRow}, ${packedTexShape[0]}, ${packedTexShape[1]}, row, col);\n      return ${glsl.texture2D}(${texName}, uv);\n    }\n  `;\n}\nfunction getSampler2D(inputInfo, enableShapeUniforms) {\n    const shape = inputInfo.shapeInfo.logicalShape;\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const texShape = inputInfo.shapeInfo.texShape;\n    if (texShape != null && util.arraysEqual(shape, texShape)) {\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int row, int col) {\n        vec2 uv = (vec2(col, row) + halfCR) / vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        const texNumR = texShape[0];\n        const texNumC = texShape[1];\n        return `\n    float ${funcName}(int row, int col) {\n      vec2 uv = (vec2(col, row) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n    }\n    const { newShape, keptDims } = util.squeezeShape(shape);\n    const squeezedShape = newShape;\n    if (squeezedShape.length < shape.length) {\n        const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n        const params = ['row', 'col'];\n        return `\n      ${getSamplerFromInInfo(newInputInfo, enableShapeUniforms)}\n      float ${funcName}(int row, int col) {\n        return ${funcName}(${getSqueezedParams(params, keptDims)});\n      }\n    `;\n    }\n    if (inputInfo.shapeInfo.isUniform) {\n        // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col) {\n        int index = round(dot(vec2(row, col), vec2(${shape[1]}, 1)));\n        ${getUniformSampler(inputInfo)}\n      }\n    `;\n    }\n    const texNumR = texShape[0];\n    const texNumC = texShape[1];\n    const offset = getFlatOffsetUniformName(texName);\n    if (texNumC === 1) {\n        // index is used directly as physical (no risk of float16 overflow).\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int row, int col) {\n        float index = dot(vec3(row, col, ${offset}), vec3(${texName}Shape[1], 1, 1));\n        vec2 uv = vec2(0.5, (index + 0.5) / float(${texName}TexShape[0]));\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        return `\n    float ${funcName}(int row, int col) {\n      float index = dot(vec3(row, col, ${offset}), vec3(${shape[1]}, 1, 1));\n      vec2 uv = vec2(0.5, (index + 0.5) / ${texNumR}.0);\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n    }\n    if (texNumR === 1) {\n        // index is used directly as physical (no risk of float16 overflow).\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int row, int col) {\n        float index = dot(vec3(row, col, ${offset}), vec3(${texName}Shape[1], 1, 1));\n        vec2 uv = vec2((index + 0.5) / float(${texName}TexShape[1]), 0.5);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        return `\n    float ${funcName}(int row, int col) {\n      float index = dot(vec3(row, col, ${offset}), vec3(${shape[1]}, 1, 1));\n      vec2 uv = vec2((index + 0.5) / ${texNumC}.0, 0.5);\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n    }\n    if (enableShapeUniforms) {\n        return `\n      float ${funcName}(int row, int col) {\n        // Explicitly use integer operations as dot() only works on floats.\n        int index = row * ${texName}Shape[1] + col + ${offset};\n        vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], index);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    return `\n  float ${funcName}(int row, int col) {\n    // Explicitly use integer operations as dot() only works on floats.\n    int index = row * ${shape[1]} + col + ${offset};\n    vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n    return sampleTexture(${texName}, uv);\n  }\n`;\n}\nfunction getPackedSampler3D(inputInfo, enableShapeUniforms) {\n    const shape = inputInfo.shapeInfo.logicalShape;\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const texShape = inputInfo.shapeInfo.texShape;\n    const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n    if (shape[0] === 1) {\n        const squeezedShape = shape.slice(1);\n        const keptDims = [1, 2];\n        const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n        const params = ['b', 'row', 'col'];\n        return `\n        ${getPackedSamplerFromInInfo(newInputInfo, enableShapeUniforms)}\n        vec4 ${funcName}(int b, int row, int col) {\n          return ${funcName}(${getSqueezedParams(params, keptDims)});\n        }\n      `;\n    }\n    const glsl = getGlslDifferences();\n    if (enableShapeUniforms) {\n        return `\n    vec4 ${funcName}(int b, int row, int col) {\n      ivec2 packedTexShape = ivec2(ceil(float(${texName}TexShape[0]) / 2.0), ceil(float(${texName}TexShape[1]) / 2.0));\n      int valuesPerRow = int(ceil(float(${texName}Shape[2]) / 2.0));\n      int texelsInBatch = valuesPerRow * int(ceil(float(${texName}Shape[1]) / 2.0));\n      vec2 uv = packedUVfrom3D(\n        packedTexShape[0], packedTexShape[1], texelsInBatch, valuesPerRow, b, row, col);\n      return ${glsl.texture2D}(${texName}, uv);\n    }\n  `;\n    }\n    const texNumR = packedTexShape[0];\n    const texNumC = packedTexShape[1];\n    const valuesPerRow = Math.ceil(shape[2] / 2);\n    const texelsInBatch = valuesPerRow * Math.ceil(shape[1] / 2);\n    return `\n    vec4 ${funcName}(int b, int row, int col) {\n      vec2 uv = packedUVfrom3D(\n        ${texNumR}, ${texNumC}, ${texelsInBatch}, ${valuesPerRow}, b, row, col);\n      return ${glsl.texture2D}(${texName}, uv);\n    }\n  `;\n}\nfunction getSampler3D(inputInfo, enableShapeUniforms) {\n    const shape = inputInfo.shapeInfo.logicalShape;\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const stride0 = shape[1] * shape[2];\n    const stride1 = shape[2];\n    const { newShape, keptDims } = util.squeezeShape(shape);\n    const squeezedShape = newShape;\n    if (squeezedShape.length < shape.length) {\n        const newInputInfo = squeezeInputInfo(inputInfo, squeezedShape);\n        const params = ['row', 'col', 'depth'];\n        return `\n        ${getSamplerFromInInfo(newInputInfo, enableShapeUniforms)}\n        float ${funcName}(int row, int col, int depth) {\n          return ${funcName}(${getSqueezedParams(params, keptDims)});\n        }\n      `;\n    }\n    if (inputInfo.shapeInfo.isUniform) {\n        // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col, int depth) {\n        int index = round(dot(vec3(row, col, depth),\n                          vec3(${stride0}, ${stride1}, 1)));\n        ${getUniformSampler(inputInfo)}\n      }\n    `;\n    }\n    const texShape = inputInfo.shapeInfo.texShape;\n    const texNumR = texShape[0];\n    const texNumC = texShape[1];\n    const flatOffset = inputInfo.shapeInfo.flatOffset;\n    if (texNumC === stride0 && flatOffset == null) {\n        // texC is used directly as physical (no risk of float16 overflow).\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int row, int col, int depth) {\n        int stride1 = ${texName}Shape[2];\n        float texR = float(row);\n        float texC = dot(vec2(col, depth), vec2(stride1, 1));\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                   vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        return `\n        float ${funcName}(int row, int col, int depth) {\n          float texR = float(row);\n          float texC = dot(vec2(col, depth), vec2(${stride1}, 1));\n          vec2 uv = (vec2(texC, texR) + halfCR) /\n                     vec2(${texNumC}.0, ${texNumR}.0);\n          return sampleTexture(${texName}, uv);\n        }\n      `;\n    }\n    if (texNumC === stride1 && flatOffset == null) {\n        // texR is used directly as physical (no risk of float16 overflow).\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int row, int col, int depth) {\n        float texR = dot(vec2(row, col), vec2(${texName}Shape[1], 1));\n        float texC = float(depth);\n        vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        return `\n    float ${funcName}(int row, int col, int depth) {\n      float texR = dot(vec2(row, col), vec2(${shape[1]}, 1));\n      float texC = float(depth);\n      vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}.0, ${texNumR}.0);\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n    }\n    const offset = getFlatOffsetUniformName(texName);\n    if (enableShapeUniforms) {\n        return `\n    float ${funcName}(int row, int col, int depth) {\n      // Explicitly use integer operations as dot() only works on floats.\n      int stride0 = ${texName}Shape[1] * ${texName}Shape[2];\n      int stride1 = ${texName}Shape[2];\n      int index = row * stride0 + col * stride1 + depth + ${offset};\n      vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], index);\n      return sampleTexture(${texName}, uv);\n    }\n    `;\n    }\n    return `\n      float ${funcName}(int row, int col, int depth) {\n        // Explicitly use integer operations as dot() only works on floats.\n        int index = row * ${stride0} + col * ${stride1} + depth + ${offset};\n        vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n        return sampleTexture(${texName}, uv);\n      }\n  `;\n}\nfunction getPackedSamplerND(inputInfo, enableShapeUniforms) {\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const glsl = getGlslDifferences();\n    if (enableShapeUniforms) {\n        // TODO: support 5d and 6d\n        return `\n    vec4 ${funcName}(int b2, int b, int row, int col) {\n      int valuesPerRow = int(ceil(float(${texName}Shape[3]) / 2.0));\n      int texelsInBatch = valuesPerRow * int(ceil(float(${texName}Shape[2]) / 2.0));\n      int index = b * texelsInBatch + (row / 2) * valuesPerRow + (col / 2);\n      texelsInBatch *= ${texName}Shape[1];\n      index = b2 * texelsInBatch + index;\n      ivec2 packedTexShape = ivec2(ceil(float(${texName}TexShape[0]) / 2.0), ceil(float(${texName}TexShape[1]) / 2.0));\n      int texR = index / packedTexShape[1];\n      int texC = index - texR * packedTexShape[1];\n      vec2 uv = (vec2(texC, texR) + halfCR) / vec2(packedTexShape[1], packedTexShape[0]); return ${glsl.texture2D}(${texName}, uv);\n    }\n  `;\n    }\n    const shape = inputInfo.shapeInfo.logicalShape;\n    const rank = shape.length;\n    const texShape = inputInfo.shapeInfo.texShape;\n    const packedTexShape = [Math.ceil(texShape[0] / 2), Math.ceil(texShape[1] / 2)];\n    const texNumR = packedTexShape[0];\n    const texNumC = packedTexShape[1];\n    const valuesPerRow = Math.ceil(shape[rank - 1] / 2);\n    let texelsInBatch = valuesPerRow * Math.ceil(shape[rank - 2] / 2);\n    let params = `int b, int row, int col`;\n    let index = `b * ${texelsInBatch} + (row / 2) * ${valuesPerRow} + (col / 2)`;\n    for (let b = 2; b < rank - 1; b++) {\n        params = `int b${b}, ` + params;\n        texelsInBatch *= shape[rank - b - 1];\n        index = `b${b} * ${texelsInBatch} + ` + index;\n    }\n    return `\n    vec4 ${funcName}(${params}) {\n      int index = ${index};\n      int texR = index / ${texNumC};\n      int texC = index - texR * ${texNumC};\n      vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${texNumC}, ${texNumR});\n      return ${glsl.texture2D}(${texName}, uv);\n    }\n  `;\n}\nfunction getSampler4D(inputInfo, enableShapeUniforms) {\n    const shape = inputInfo.shapeInfo.logicalShape;\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const stride2 = shape[3];\n    const stride1 = shape[2] * stride2;\n    const stride0 = shape[1] * stride1;\n    const { newShape, keptDims } = util.squeezeShape(shape);\n    if (newShape.length < shape.length) {\n        const newInputInfo = squeezeInputInfo(inputInfo, newShape);\n        const params = ['row', 'col', 'depth', 'depth2'];\n        return `\n      ${getSamplerFromInInfo(newInputInfo, enableShapeUniforms)}\n      float ${funcName}(int row, int col, int depth, int depth2) {\n        return ${funcName}(${getSqueezedParams(params, keptDims)});\n      }\n    `;\n    }\n    if (inputInfo.shapeInfo.isUniform) {\n        // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col, int depth, int depth2) {\n        int index = round(dot(vec4(row, col, depth, depth2),\n                          vec4(${stride0}, ${stride1}, ${stride2}, 1)));\n        ${getUniformSampler(inputInfo)}\n      }\n    `;\n    }\n    const flatOffset = inputInfo.shapeInfo.flatOffset;\n    const texShape = inputInfo.shapeInfo.texShape;\n    const texNumR = texShape[0];\n    const texNumC = texShape[1];\n    const stride2Str = `int stride2 = ${texName}Shape[3];`;\n    const stride1Str = `int stride1 = ${texName}Shape[2] * stride2;`;\n    const stride0Str = `int stride0 = ${texName}Shape[1] * stride1;`;\n    if (texNumC === stride0 && flatOffset == null) {\n        // texC is used directly as physical (no risk of float16 overflow).\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int row, int col, int depth, int depth2) {\n        ${stride2Str}\n        ${stride1Str}\n        float texR = float(row);\n        float texC =\n            dot(vec3(col, depth, depth2),\n                vec3(stride1, stride2, 1));\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                   vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        return `\n      float ${funcName}(int row, int col, int depth, int depth2) {\n        float texR = float(row);\n        float texC =\n            dot(vec3(col, depth, depth2),\n                vec3(${stride1}, ${stride2}, 1));\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                   vec2(${texNumC}.0, ${texNumR}.0);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    if (texNumC === stride2 && flatOffset == null) {\n        // texR is used directly as physical (no risk of float16 overflow).\n        if (enableShapeUniforms) {\n            return `\n      float ${funcName}(int row, int col, int depth, int depth2) {\n        float texR = dot(vec3(row, col, depth),\n                         vec3(${texName}Shape[1] * ${texName}Shape[2], ${texName}Shape[2], 1));\n        float texC = float(depth2);\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                  vec2(${texName}TexShape[1], ${texName}TexShape[0]);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n        }\n        return `\n      float ${funcName}(int row, int col, int depth, int depth2) {\n        float texR = dot(vec3(row, col, depth),\n                         vec3(${shape[1] * shape[2]}, ${shape[2]}, 1));\n        float texC = float(depth2);\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                  vec2(${texNumC}.0, ${texNumR}.0);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    const offset = getFlatOffsetUniformName(texName);\n    if (enableShapeUniforms) {\n        return `\n    float ${funcName}(int row, int col, int depth, int depth2) {\n      // Explicitly use integer operations as dot() only works on floats.\n      ${stride2Str}\n      ${stride1Str}\n      ${stride0Str}\n      int index = row * stride0 + col * stride1 +\n          depth * stride2 + depth2;\n      vec2 uv = uvFromFlat(${texName}TexShape[0], ${texName}TexShape[1], index + ${offset});\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n    }\n    return `\n    float ${funcName}(int row, int col, int depth, int depth2) {\n      // Explicitly use integer operations as dot() only works on floats.\n      int index = row * ${stride0} + col * ${stride1} +\n          depth * ${stride2} + depth2;\n      vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index + ${offset});\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n}\nfunction getSampler5D(inputInfo) {\n    const shape = inputInfo.shapeInfo.logicalShape;\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const stride3 = shape[4];\n    const stride2 = shape[3] * stride3;\n    const stride1 = shape[2] * stride2;\n    const stride0 = shape[1] * stride1;\n    const { newShape, keptDims } = util.squeezeShape(shape);\n    if (newShape.length < shape.length) {\n        const newInputInfo = squeezeInputInfo(inputInfo, newShape);\n        const params = ['row', 'col', 'depth', 'depth2', 'depth3'];\n        return `\n      ${getSamplerFromInInfo(newInputInfo)}\n      float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n        return ${funcName}(${getSqueezedParams(params, keptDims)});\n      }\n    `;\n    }\n    if (inputInfo.shapeInfo.isUniform) {\n        // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n        float index = dot(\n          vec4(row, col, depth, depth2),\n          vec4(${stride0}, ${stride1}, ${stride2}, ${stride3})) +\n          depth3;\n        ${getUniformSampler(inputInfo)}\n      }\n    `;\n    }\n    const flatOffset = inputInfo.shapeInfo.flatOffset;\n    const texShape = inputInfo.shapeInfo.texShape;\n    const texNumR = texShape[0];\n    const texNumC = texShape[1];\n    if (texNumC === stride0 && flatOffset == null) {\n        // texC is used directly as physical (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n        int texR = row;\n        float texC = dot(vec4(col, depth, depth2, depth3),\n                         vec4(${stride1}, ${stride2}, ${stride3}, 1));\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                   vec2(${texNumC}.0, ${texNumR}.0);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    if (texNumC === stride3 && flatOffset == null) {\n        // texR is used directly as physical (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n        float texR = dot(\n          vec4(row, col, depth, depth2),\n          vec4(${shape[1] * shape[2] * shape[3]},\n               ${shape[2] * shape[3]}, ${shape[3]}, 1));\n        int texC = depth3;\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                  vec2(${texNumC}.0, ${texNumR}.0);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    const offset = getFlatOffsetUniformName(texName);\n    return `\n    float ${funcName}(int row, int col, int depth, int depth2, int depth3) {\n      // Explicitly use integer operations as dot() only works on floats.\n      int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n          depth2 * ${stride3} + depth3 + ${offset};\n      vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n}\nfunction getSampler6D(inputInfo) {\n    const shape = inputInfo.shapeInfo.logicalShape;\n    const texName = inputInfo.name;\n    const funcName = 'get' + texName.charAt(0).toUpperCase() + texName.slice(1);\n    const { newShape, keptDims } = util.squeezeShape(shape);\n    if (newShape.length < shape.length) {\n        const newInputInfo = squeezeInputInfo(inputInfo, newShape);\n        const params = ['row', 'col', 'depth', 'depth2', 'depth3', 'depth4'];\n        return `\n      ${getSamplerFromInInfo(newInputInfo)}\n      float ${funcName}(int row, int col, int depth,\n                    int depth2, int depth3, int depth4) {\n        return ${funcName}(${getSqueezedParams(params, keptDims)});\n      }\n    `;\n    }\n    const stride4 = shape[5];\n    const stride3 = shape[4] * stride4;\n    const stride2 = shape[3] * stride3;\n    const stride1 = shape[2] * stride2;\n    const stride0 = shape[1] * stride1;\n    if (inputInfo.shapeInfo.isUniform) {\n        // Uniform arrays will be less than 65505 (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col, int depth,\n                  int depth2, int depth3, int depth4) {\n        int index = round(dot(\n          vec4(row, col, depth, depth2),\n          vec4(${stride0}, ${stride1}, ${stride2}, ${stride3})) +\n          dot(\n            vec2(depth3, depth4),\n            vec2(${stride4}, 1)));\n        ${getUniformSampler(inputInfo)}\n      }\n    `;\n    }\n    const flatOffset = inputInfo.shapeInfo.flatOffset;\n    const texShape = inputInfo.shapeInfo.texShape;\n    const texNumR = texShape[0];\n    const texNumC = texShape[1];\n    if (texNumC === stride0 && flatOffset == null) {\n        // texC is used directly as physical (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col, int depth,\n                    int depth2, int depth3, int depth4) {\n        int texR = row;\n        float texC = dot(vec4(col, depth, depth2, depth3),\n          vec4(${stride1}, ${stride2}, ${stride3}, ${stride4})) +\n               float(depth4);\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                   vec2(${texNumC}.0, ${texNumR}.0);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    if (texNumC === stride4 && flatOffset == null) {\n        // texR is used directly as physical (no risk of float16 overflow).\n        return `\n      float ${funcName}(int row, int col, int depth,\n                    int depth2, int depth3, int depth4) {\n        float texR = dot(vec4(row, col, depth, depth2),\n          vec4(${shape[1] * shape[2] * shape[3] * shape[4]},\n               ${shape[2] * shape[3] * shape[4]},\n               ${shape[3] * shape[4]},\n               ${shape[4]})) + float(depth3);\n        int texC = depth4;\n        vec2 uv = (vec2(texC, texR) + halfCR) /\n                  vec2(${texNumC}.0, ${texNumR}.0);\n        return sampleTexture(${texName}, uv);\n      }\n    `;\n    }\n    const offset = getFlatOffsetUniformName(texName);\n    return `\n    float ${funcName}(int row, int col, int depth,\n                  int depth2, int depth3, int depth4) {\n      // Explicitly use integer operations as dot() only works on floats.\n      int index = row * ${stride0} + col * ${stride1} + depth * ${stride2} +\n          depth2 * ${stride3} + depth3 * ${stride4} + depth4 + ${offset};\n      vec2 uv = uvFromFlat(${texNumR}, ${texNumC}, index);\n      return sampleTexture(${texName}, uv);\n    }\n  `;\n}\nfunction getUniformSampler(inputInfo) {\n    const texName = inputInfo.name;\n    const inSize = util.sizeFromShape(inputInfo.shapeInfo.logicalShape);\n    if (inSize < 2) {\n        return `return ${texName};`;\n    }\n    return `\n    for (int i = 0; i < ${inSize}; i++) {\n      if (i == index) {\n        return ${texName}[i];\n      }\n    }\n  `;\n}\nfunction getPackedSamplerAtOutputCoords(inputInfo, outShapeInfo) {\n    const texName = inputInfo.name;\n    const texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1);\n    const funcName = 'get' + texFuncSnippet + 'AtOutCoords';\n    const inRank = inputInfo.shapeInfo.logicalShape.length;\n    const outRank = outShapeInfo.logicalShape.length;\n    const broadcastDims = getBroadcastDims(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape);\n    const type = getCoordsDataType(outRank);\n    const rankDiff = outRank - inRank;\n    let coordsSnippet;\n    const fields = ['x', 'y', 'z', 'w', 'u', 'v'];\n    if (inRank === 0) {\n        coordsSnippet = '';\n    }\n    else if (outRank < 2 && broadcastDims.length >= 1) {\n        coordsSnippet = 'coords = 0;';\n    }\n    else {\n        coordsSnippet =\n            broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`)\n                .join('\\n');\n    }\n    let unpackedCoordsSnippet = '';\n    if (outRank < 2 && inRank > 0) {\n        unpackedCoordsSnippet = 'coords';\n    }\n    else {\n        unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape\n            .map((s, i) => `coords.${fields[i + rankDiff]}`)\n            .join(', ');\n    }\n    let output = `return outputValue;`;\n    const inSize = util.sizeFromShape(inputInfo.shapeInfo.logicalShape);\n    const isInputScalar = inSize === 1;\n    const outSize = util.sizeFromShape(outShapeInfo.logicalShape);\n    const isOutputScalar = outSize === 1;\n    if (inRank === 1 && !isInputScalar && !isOutputScalar) {\n        output = `\n      return vec4(outputValue.xy, outputValue.xy);\n    `;\n    }\n    else if (isInputScalar && !isOutputScalar) {\n        if (outRank === 1) {\n            output = `\n        return vec4(outputValue.x, outputValue.x, 0., 0.);\n      `;\n        }\n        else {\n            output = `\n        return vec4(outputValue.x);\n      `;\n        }\n    }\n    else if (broadcastDims.length) {\n        const rows = inRank - 2;\n        const cols = inRank - 1;\n        if (broadcastDims.indexOf(rows) > -1 && broadcastDims.indexOf(cols) > -1) {\n            output = `return vec4(outputValue.x);`;\n        }\n        else if (broadcastDims.indexOf(rows) > -1) {\n            output = `return vec4(outputValue.x, outputValue.y, ` +\n                `outputValue.x, outputValue.y);`;\n        }\n        else if (broadcastDims.indexOf(cols) > -1) {\n            output = `return vec4(outputValue.xx, outputValue.zz);`;\n        }\n    }\n    return `\n    vec4 ${funcName}() {\n      ${type} coords = getOutputCoords();\n      ${coordsSnippet}\n      vec4 outputValue = get${texFuncSnippet}(${unpackedCoordsSnippet});\n      ${output}\n    }\n  `;\n}\nfunction getSamplerAtOutputCoords(inputInfo, outShapeInfo) {\n    const texName = inputInfo.name;\n    const texFuncSnippet = texName.charAt(0).toUpperCase() + texName.slice(1);\n    const funcName = 'get' + texFuncSnippet + 'AtOutCoords';\n    const outTexShape = outShapeInfo.texShape;\n    const inTexShape = inputInfo.shapeInfo.texShape;\n    const inRank = inputInfo.shapeInfo.logicalShape.length;\n    const outRank = outShapeInfo.logicalShape.length;\n    if (!inputInfo.shapeInfo.isUniform && inRank === outRank &&\n        inputInfo.shapeInfo.flatOffset == null &&\n        util.arraysEqual(inTexShape, outTexShape)) {\n        return `\n      float ${funcName}() {\n        return sampleTexture(${texName}, resultUV);\n      }\n    `;\n    }\n    const type = getCoordsDataType(outRank);\n    const broadcastDims = getBroadcastDims(inputInfo.shapeInfo.logicalShape, outShapeInfo.logicalShape);\n    const rankDiff = outRank - inRank;\n    let coordsSnippet;\n    const fields = ['x', 'y', 'z', 'w', 'u', 'v'];\n    if (inRank === 0) {\n        coordsSnippet = '';\n    }\n    else if (outRank < 2 && broadcastDims.length >= 1) {\n        coordsSnippet = 'coords = 0;';\n    }\n    else {\n        coordsSnippet =\n            broadcastDims.map(d => `coords.${fields[d + rankDiff]} = 0;`)\n                .join('\\n');\n    }\n    let unpackedCoordsSnippet = '';\n    if (outRank < 2 && inRank > 0) {\n        unpackedCoordsSnippet = 'coords';\n    }\n    else {\n        unpackedCoordsSnippet = inputInfo.shapeInfo.logicalShape\n            .map((s, i) => `coords.${fields[i + rankDiff]}`)\n            .join(', ');\n    }\n    return `\n    float ${funcName}() {\n      ${type} coords = getOutputCoords();\n      ${coordsSnippet}\n      return get${texFuncSnippet}(${unpackedCoordsSnippet});\n    }\n  `;\n}\nexport function getCoordsDataType(rank) {\n    if (rank <= 1) {\n        return 'int';\n    }\n    else if (rank === 2) {\n        return 'ivec2';\n    }\n    else if (rank === 3) {\n        return 'ivec3';\n    }\n    else if (rank === 4) {\n        return 'ivec4';\n    }\n    else if (rank === 5) {\n        return 'ivec5';\n    }\n    else if (rank === 6) {\n        return 'ivec6';\n    }\n    else {\n        throw Error(`GPU for rank ${rank} is not yet supported`);\n    }\n}\nexport function getUniformInfoFromShape(isPacked, shape, texShape) {\n    const { newShape, keptDims } = util.squeezeShape(shape);\n    const rank = shape.length;\n    const useSqueezePackedShape = isPacked && rank === 3 && shape[0] === 1;\n    const squeezeShape = useSqueezePackedShape ? shape.slice(1) : newShape;\n    const useSqueezeShape = (!isPacked && rank > 1 && !util.arraysEqual(shape, texShape) &&\n        newShape.length < rank) ||\n        useSqueezePackedShape;\n    const uniformShape = useSqueezeShape ? squeezeShape : shape;\n    return { useSqueezeShape, uniformShape, keptDims };\n}\n/** Returns a new input info (a copy) that has a squeezed logical shape. */\nexport function squeezeInputInfo(inInfo, squeezedShape) {\n    // Deep copy.\n    const newInputInfo = JSON.parse(JSON.stringify(inInfo));\n    newInputInfo.shapeInfo.logicalShape = squeezedShape;\n    return newInputInfo;\n}\nfunction getSqueezedParams(params, keptDims) {\n    return keptDims.map(d => params[d]).join(', ');\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhZGVyX2NvbXBpbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9zaGFkZXJfY29tcGlsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsNEVBQTRFO0FBQzVFLDREQUE0RDtBQUU1RCxPQUFPLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE1BQU0sRUFBQyxnQkFBZ0IsRUFBQyxHQUFHLFlBQVksQ0FBQztBQUN4QyxPQUFPLEVBQUMsa0JBQWtCLEVBQU8sTUFBTSxnQkFBZ0IsQ0FBQztBQUN4RCxPQUFPLEtBQUssV0FBVyxNQUFNLHdCQUF3QixDQUFDO0FBMEJ0RCxNQUFNLFVBQVUsVUFBVSxDQUN0QixVQUF1QixFQUFFLFdBQXNCLEVBQy9DLE9BQXNCO0lBQ3hCLE1BQU0sY0FBYyxHQUFhLEVBQUUsQ0FBQztJQUNwQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ3JCLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUUxRCwyREFBMkQ7UUFDM0QsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRTtZQUN6QixjQUFjLENBQUMsSUFBSSxDQUNmLGlCQUFpQixDQUFDLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7U0FDL0Q7YUFBTTtZQUNMLGNBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ3BELGNBQWMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxJQUFJLEdBQUcsQ0FB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QUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDO1FBQzNELFFBQVEsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLHFCQUFxQixDQUFDO0lBQzFCLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDNUQsT0FBTyxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUUsUUFBUSxFQUFDLENBQUM7QUFDbkQsQ0FBQztBQUVELDJFQUEyRTtBQUMzRSxNQUFNLFVBQVUsZ0JBQWdCLENBQzVCLE1BQWlCLEVBQUUsYUFBdUI7SUFDNUMsYUFBYTtJQUNiLE1BQU0sWUFBWSxHQUFjLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25FLFlBQVksQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLGFBQWEsQ0FBQztJQUNwRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFnQixFQUFFLFFBQWtCO0lBQzdELE9BQU8sUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBQbGVhc2UgbWFrZSBzdXJlIHRoZSBzaGFrZXIga2V5IGluIG1ha2VTaGFkZXJLZXkgaW4gZ3BncHVfbWF0aC50cyBpcyB3ZWxsXG4vLyBtYXBwZWQgaWYgYW55IHNoYWRlciBzb3VyY2UgY29kZSBpcyBjaGFuZ2VkIGluIHRoaXMgZmlsZS5cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5jb25zdCB7Z2V0QnJvYWRjYXN0RGltc30gPSBiYWNrZW5kX3V0aWw7XG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlcywgR0xTTH0gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5cbmV4cG9ydCB0eXBlIFNoYXBlSW5mbyA9IHtcbiAgbG9naWNhbFNoYXBlOiBudW1iZXJbXSxcbiAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gIGlzVW5pZm9ybTogYm9vbGVhbixcbiAgaXNQYWNrZWQ6IGJvb2xlYW4sXG4gIGZsYXRPZmZzZXQ6IG51bWJlclxufTtcblxuZXhwb3J0IHR5cGUgSW5wdXRJbmZvID0ge1xuICBuYW1lOiBzdHJpbmcsXG4gIHNoYXBlSW5mbzogU2hhcGVJbmZvXG59O1xuXG5leHBvcnQgdHlwZSBVbmlmb3JtVHlwZSA9XG4gICAgJ2Zsb2F0J3wndmVjMid8J3ZlYzMnfCd2ZWM0J3wnaW50J3wnaXZlYzInfCdpdmVjMyd8J2l2ZWM0JztcblxuaW50ZXJmYWNlIFByb2dyYW1QYXJhbXMge1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zPzogYm9vbGVhbjtcbiAgcGFja2VkSW5wdXRzPzogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXM/OlxuICAgICAgQXJyYXk8e25hbWU6IHN0cmluZzsgYXJyYXlJbmRleD86IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlU2hhZGVyKFxuICAgIGlucHV0c0luZm86IElucHV0SW5mb1tdLCBvdXRwdXRTaGFwZTogU2hhcGVJbmZvLFxuICAgIHByb2dyYW06IFByb2dyYW1QYXJhbXMpOiBzdHJpbmcge1xuICBjb25zdCBwcmVmaXhTbmlwcGV0czogc3RyaW5nW10gPSBbXTtcbiAgaW5wdXRzSW5mby5mb3JFYWNoKHggPT4ge1xuICAgIGNvbnN0IHNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcblxuICAgIC8vIFNuaXBwZXQgd2hlbiB3ZSBkZWNpZGVkIHRvIHVwbG9hZCB0aGUgdmFsdWVzIGFzIHVuaWZvcm0uXG4gICAgaWYgKHguc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgICAgcHJlZml4U25pcHBldHMucHVzaChcbiAgICAgICAgICBgdW5pZm9ybSBmbG9hdCAke3gubmFtZX0ke3NpemUgPiAxID8gYFske3NpemV9XWAgOiAnJ307YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gc2FtcGxlcjJEICR7eC5uYW1lfTtgKTtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaW50IG9mZnNldCR7eC5uYW1lfTtgKTtcbiAgICB9XG5cbiAgICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICBjb25zdCB7dW5pZm9ybVNoYXBlfSA9IGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKFxuICAgICAgICAgIHByb2dyYW0ucGFja2VkSW5wdXRzLCB4LnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIHguc2hhcGVJbmZvLnRleFNoYXBlKTtcbiAgICAgIHN3aXRjaCAodW5pZm9ybVNoYXBlLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpbnQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyICR7eC5uYW1lfVNoYXBlO2ApO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyAke3gubmFtZX1TaGFwZTtgKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzQgJHt4Lm5hbWV9U2hhcGU7YCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGl2ZWMyICR7eC5uYW1lfVRleFNoYXBlO2ApO1xuICAgIH1cbiAgfSk7XG5cbiAgaWYgKHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHN3aXRjaCAob3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBwcmVmaXhTbmlwcGV0cy5wdXNoKGB1bmlmb3JtIGludCBvdXRTaGFwZTtgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0U2hhcGU7YCk7XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaW50IG91dFNoYXBlU3RyaWRlcztgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzMgb3V0U2hhcGU7YCk7XG4gICAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0U2hhcGVTdHJpZGVzO2ApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgNDpcbiAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjNCBvdXRTaGFwZTtgKTtcbiAgICAgICAgcHJlZml4U25pcHBldHMucHVzaChgdW5pZm9ybSBpdmVjMyBvdXRTaGFwZVN0cmlkZXM7YCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gaXZlYzIgb3V0VGV4U2hhcGU7YCk7XG4gIH1cbiAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQpID0+IHtcbiAgICAgIHByZWZpeFNuaXBwZXRzLnB1c2goYHVuaWZvcm0gJHtkLnR5cGV9ICR7ZC5uYW1lfSR7XG4gICAgICAgICAgZC5hcnJheUluZGV4ID8gYFske2QuYXJyYXlJbmRleH1dYCA6ICcnfTtgKTtcbiAgICB9KTtcbiAgfVxuICBjb25zdCBpbnB1dFByZWZpeFNuaXBwZXQgPSBwcmVmaXhTbmlwcGV0cy5qb2luKCdcXG4nKTtcblxuICBjb25zdCBpbnB1dFNhbXBsaW5nU25pcHBldCA9IGlucHV0c0luZm9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPT4gZ2V0SW5wdXRTYW1wbGluZ1NuaXBwZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeCwgb3V0cHV0U2hhcGUsIHByb2dyYW0ucGFja2VkSW5wdXRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyYW0uZW5hYmxlU2hhcGVVbmlmb3JtcykpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgY29uc3Qgb3V0VGV4U2hhcGUgPSBvdXRwdXRTaGFwZS50ZXhTaGFwZTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBjb25zdCBmbG9hdFRleHR1cmVTYW1wbGVTbmlwcGV0ID0gZ2V0RmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldChnbHNsKTtcbiAgbGV0IG91dHB1dFNhbXBsaW5nU25pcHBldDogc3RyaW5nO1xuICBsZXQgZmxvYXRUZXh0dXJlU2V0T3V0cHV0U25pcHBldDogc3RyaW5nO1xuICBsZXQgc2hhZGVyUHJlZml4ID0gZ2V0U2hhZGVyUHJlZml4KGdsc2wpO1xuXG4gIGlmIChvdXRwdXRTaGFwZS5pc1BhY2tlZCkge1xuICAgIG91dHB1dFNhbXBsaW5nU25pcHBldCA9IGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChcbiAgICAgICAgb3V0cHV0U2hhcGUubG9naWNhbFNoYXBlLCBvdXRUZXhTaGFwZSwgcHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBmbG9hdFRleHR1cmVTZXRPdXRwdXRTbmlwcGV0ID0gZ2V0RmxvYXRUZXh0dXJlU2V0UkdCQVNuaXBwZXQoZ2xzbCk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0U2FtcGxpbmdTbmlwcGV0ID0gZ2V0T3V0cHV0U2FtcGxpbmdTbmlwcGV0KFxuICAgICAgICBvdXRwdXRTaGFwZS5sb2dpY2FsU2hhcGUsIG91dFRleFNoYXBlLCBwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQgPSBnZXRGbG9hdFRleHR1cmVTZXRSU25pcHBldChnbHNsKTtcbiAgfVxuXG4gIGlmIChwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgIHNoYWRlclByZWZpeCArPSBTSEFERVJfUEFDS0VEX1BSRUZJWDtcbiAgfVxuXG4gIGNvbnN0IHNvdXJjZSA9IFtcbiAgICBzaGFkZXJQcmVmaXgsIGZsb2F0VGV4dHVyZVNhbXBsZVNuaXBwZXQsIGZsb2F0VGV4dHVyZVNldE91dHB1dFNuaXBwZXQsXG4gICAgaW5wdXRQcmVmaXhTbmlwcGV0LCBvdXRwdXRTYW1wbGluZ1NuaXBwZXQsIGlucHV0U2FtcGxpbmdTbmlwcGV0LFxuICAgIHByb2dyYW0udXNlckNvZGVcbiAgXS5qb2luKCdcXG4nKTtcbiAgcmV0dXJuIHNvdXJjZTtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlckZyb21JbkluZm8oXG4gICAgaW5JbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMgPSBmYWxzZSk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5JbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXJTY2FsYXIoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0U2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRTYW1wbGVyM0QoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZ2V0U2FtcGxlcjREKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSA1OlxuICAgICAgcmV0dXJuIGdldFNhbXBsZXI1RChpbkluZm8pO1xuICAgIGNhc2UgNjpcbiAgICAgIHJldHVybiBnZXRTYW1wbGVyNkQoaW5JbmZvKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGAke3NoYXBlLmxlbmd0aH0tRCBpbnB1dCBzYW1wbGluZ2AgK1xuICAgICAgICAgIGAgaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhcbiAgICBpbkluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5JbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIHN3aXRjaCAoc2hhcGUubGVuZ3RoKSB7XG4gICAgY2FzZSAwOlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5JbmZvKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0UGFja2VkU2FtcGxlcjFEKGluSW5mbywgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXIyRChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRQYWNrZWRTYW1wbGVyM0QoaW5JbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGdldFBhY2tlZFNhbXBsZXJORChpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldElucHV0U2FtcGxpbmdTbmlwcGV0KFxuICAgIGluSW5mbzogSW5wdXRJbmZvLCBvdXRTaGFwZUluZm86IFNoYXBlSW5mbywgdXNlc1BhY2tlZFRleHR1cmVzID0gZmFsc2UsXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGxldCByZXMgPSAnJztcbiAgaWYgKHVzZXNQYWNrZWRUZXh0dXJlcykge1xuICAgIHJlcyArPSBnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9IGVsc2Uge1xuICAgIHJlcyArPSBnZXRTYW1wbGVyRnJvbUluSW5mbyhpbkluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICB9XG5cbiAgY29uc3QgaW5TaGFwZSA9IGluSW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCBvdXRTaGFwZSA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGlmIChpblNoYXBlLmxlbmd0aCA8PSBvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICBpZiAodXNlc1BhY2tlZFRleHR1cmVzKSB7XG4gICAgICByZXMgKz0gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKGluSW5mbywgb3V0U2hhcGVJbmZvKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzICs9IGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhpbkluZm8sIG91dFNoYXBlSW5mbyk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZE91dHB1dFNhbXBsaW5nU25pcHBldChcbiAgICBvdXRTaGFwZTogbnVtYmVyW10sIG91dFRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBzd2l0Y2ggKG91dFNoYXBlLmxlbmd0aCkge1xuICAgIGNhc2UgMDpcbiAgICAgIHJldHVybiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKTtcbiAgICBjYXNlIDE6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlcl0sIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDI6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSwgb3V0VGV4U2hhcGUsIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgMzpcbiAgICAgIHJldHVybiBnZXRPdXRwdXRQYWNrZWQzRENvb3JkcyhcbiAgICAgICAgICBvdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLFxuICAgICAgICAgIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGRlZmF1bHQ6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUsIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXRTYW1wbGluZ1NuaXBwZXQoXG4gICAgb3V0U2hhcGU6IG51bWJlcltdLCBvdXRUZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgc3dpdGNoIChvdXRTaGFwZS5sZW5ndGgpIHtcbiAgICBjYXNlIDA6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0U2NhbGFyQ29vcmRzKCk7XG4gICAgY2FzZSAxOlxuICAgICAgcmV0dXJuIGdldE91dHB1dDFEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXJdLCBvdXRUZXhTaGFwZSwgZW5hYmxlU2hhcGVVbmlmb3Jtcyk7XG4gICAgY2FzZSAyOlxuICAgICAgcmV0dXJuIGdldE91dHB1dDJEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLCBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDM6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0M0RDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBvdXRUZXhTaGFwZSxcbiAgICAgICAgICBlbmFibGVTaGFwZVVuaWZvcm1zKTtcbiAgICBjYXNlIDQ6XG4gICAgICByZXR1cm4gZ2V0T3V0cHV0NERDb29yZHMoXG4gICAgICAgICAgb3V0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG91dFRleFNoYXBlLFxuICAgICAgICAgIGVuYWJsZVNoYXBlVW5pZm9ybXMpO1xuICAgIGNhc2UgNTpcbiAgICAgIHJldHVybiBnZXRPdXRwdXQ1RENvb3JkcyhcbiAgICAgICAgICBvdXRTaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBvdXRUZXhTaGFwZSk7XG4gICAgY2FzZSA2OlxuICAgICAgcmV0dXJuIGdldE91dHB1dDZEQ29vcmRzKFxuICAgICAgICAgIG91dFNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgICAgICBvdXRUZXhTaGFwZSk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgJHtvdXRTaGFwZS5sZW5ndGh9LUQgb3V0cHV0IHNhbXBsaW5nIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0RmxvYXRUZXh0dXJlU2FtcGxlU25pcHBldChnbHNsOiBHTFNMKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICBmbG9hdCBzYW1wbGVUZXh0dXJlKHNhbXBsZXIyRCB0ZXh0dXJlU2FtcGxlciwgdmVjMiB1dikge1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KHRleHR1cmVTYW1wbGVyLCB1dikucjtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldEZsb2F0VGV4dHVyZVNldFJTbmlwcGV0KGdsc2w6IEdMU0wpOiBzdHJpbmcge1xuICByZXR1cm4gYFxuICAgIHZvaWQgc2V0T3V0cHV0KGZsb2F0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2ZWM0KHZhbCwgMCwgMCwgMCk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRGbG9hdFRleHR1cmVTZXRSR0JBU25pcHBldChnbHNsOiBHTFNMKTogc3RyaW5nIHtcbiAgcmV0dXJuIGBcbiAgICB2b2lkIHNldE91dHB1dCh2ZWM0IHZhbCkge1xuICAgICAgJHtnbHNsLm91dHB1dH0gPSB2YWw7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRTaGFkZXJQcmVmaXgoZ2xzbDogR0xTTCk6IHN0cmluZyB7XG4gIGNvbnN0IFNIQURFUl9QUkVGSVggPSBgJHtnbHNsLnZlcnNpb259XG4gICAgcHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xuICAgIHByZWNpc2lvbiBoaWdocCBpbnQ7XG4gICAgcHJlY2lzaW9uIGhpZ2hwIHNhbXBsZXIyRDtcbiAgICAke2dsc2wudmFyeWluZ0ZzfSB2ZWMyIHJlc3VsdFVWO1xuICAgICR7Z2xzbC5kZWZpbmVPdXRwdXR9XG4gICAgY29uc3QgdmVjMiBoYWxmQ1IgPSB2ZWMyKDAuNSwgMC41KTtcblxuICAgIHN0cnVjdCBpdmVjNVxuICAgIHtcbiAgICAgIGludCB4O1xuICAgICAgaW50IHk7XG4gICAgICBpbnQgejtcbiAgICAgIGludCB3O1xuICAgICAgaW50IHU7XG4gICAgfTtcblxuICAgIHN0cnVjdCBpdmVjNlxuICAgIHtcbiAgICAgIGludCB4O1xuICAgICAgaW50IHk7XG4gICAgICBpbnQgejtcbiAgICAgIGludCB3O1xuICAgICAgaW50IHU7XG4gICAgICBpbnQgdjtcbiAgICB9O1xuXG4gICAgdW5pZm9ybSBmbG9hdCBOQU47XG4gICAgJHtnbHNsLmRlZmluZVNwZWNpYWxOYU59XG4gICAgJHtnbHNsLmRlZmluZVNwZWNpYWxJbmZ9XG4gICAgJHtnbHNsLmRlZmluZVJvdW5kfVxuXG4gICAgaW50IGltb2QoaW50IHgsIGludCB5KSB7XG4gICAgICByZXR1cm4geCAtIHkgKiAoeCAvIHkpO1xuICAgIH1cblxuICAgIGludCBpZGl2KGludCBhLCBpbnQgYiwgZmxvYXQgc2lnbikge1xuICAgICAgaW50IHJlcyA9IGEgLyBiO1xuICAgICAgaW50IG1vZCA9IGltb2QoYSwgYik7XG4gICAgICBpZiAoc2lnbiA8IDAuICYmIG1vZCAhPSAwKSB7XG4gICAgICAgIHJlcyAtPSAxO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlcztcbiAgICB9XG5cbiAgICAvL0Jhc2VkIG9uIHRoZSB3b3JrIG9mIERhdmUgSG9za2luc1xuICAgIC8vaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS92aWV3LzRkalNSV1xuICAgICNkZWZpbmUgSEFTSFNDQUxFMSA0NDMuODk3NVxuICAgIGZsb2F0IHJhbmRvbShmbG9hdCBzZWVkKXtcbiAgICAgIHZlYzIgcCA9IHJlc3VsdFVWICogc2VlZDtcbiAgICAgIHZlYzMgcDMgID0gZnJhY3QodmVjMyhwLnh5eCkgKiBIQVNIU0NBTEUxKTtcbiAgICAgIHAzICs9IGRvdChwMywgcDMueXp4ICsgMTkuMTkpO1xuICAgICAgcmV0dXJuIGZyYWN0KChwMy54ICsgcDMueSkgKiBwMy56KTtcbiAgICB9XG5cbiAgICAke1NBTVBMRV8xRF9TTklQUEVUfVxuICAgICR7U0FNUExFXzJEX1NOSVBQRVR9XG4gICAgJHtTQU1QTEVfM0RfU05JUFBFVH1cbiAgYDtcblxuICByZXR1cm4gU0hBREVSX1BSRUZJWDtcbn1cblxuY29uc3QgU0FNUExFXzFEX1NOSVBQRVQgPSBgXG52ZWMyIHV2RnJvbUZsYXQoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLCBpbnQgaW5kZXgpIHtcbiAgaW50IHRleFIgPSBpbmRleCAvIHRleE51bUM7XG4gIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG52ZWMyIHBhY2tlZFVWZnJvbTFEKGludCB0ZXhOdW1SLCBpbnQgdGV4TnVtQywgaW50IGluZGV4KSB7XG4gIGludCB0ZXhlbEluZGV4ID0gaW5kZXggLyAyO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfMkRfU05JUFBFVCA9IGBcbnZlYzIgcGFja2VkVVZmcm9tMkQoaW50IHRleGVsc0luTG9naWNhbFJvdywgaW50IHRleE51bVIsXG4gIGludCB0ZXhOdW1DLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gIGludCB0ZXhlbEluZGV4ID0gKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICBpbnQgdGV4UiA9IHRleGVsSW5kZXggLyB0ZXhOdW1DO1xuICBpbnQgdGV4QyA9IHRleGVsSW5kZXggLSB0ZXhSICogdGV4TnVtQztcbiAgcmV0dXJuICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIodGV4TnVtQywgdGV4TnVtUik7XG59XG5gO1xuXG5jb25zdCBTQU1QTEVfM0RfU05JUFBFVCA9IGBcbnZlYzIgcGFja2VkVVZmcm9tM0QoaW50IHRleE51bVIsIGludCB0ZXhOdW1DLFxuICAgIGludCB0ZXhlbHNJbkJhdGNoLCBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93LCBpbnQgYixcbiAgICBpbnQgcm93LCBpbnQgY29sKSB7XG4gIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdGV4ZWxzSW5Mb2dpY2FsUm93ICsgKGNvbCAvIDIpO1xuICBpbnQgdGV4UiA9IGluZGV4IC8gdGV4TnVtQztcbiAgaW50IHRleEMgPSBpbmRleCAtIHRleFIgKiB0ZXhOdW1DO1xuICByZXR1cm4gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhOdW1DLCB0ZXhOdW1SKTtcbn1cbmA7XG5cbmNvbnN0IFNIQURFUl9QQUNLRURfUFJFRklYID0gYFxuICBmbG9hdCBnZXRDaGFubmVsKHZlYzQgZnJhZywgdmVjMiBpbm5lckRpbXMpIHtcbiAgICB2ZWMyIG1vZENvb3JkID0gbW9kKGlubmVyRGltcywgMi4pO1xuICAgIHJldHVybiBtb2RDb29yZC54ID09IDAuID9cbiAgICAgIChtb2RDb29yZC55ID09IDAuID8gZnJhZy5yIDogZnJhZy5nKSA6XG4gICAgICAobW9kQ29vcmQueSA9PSAwLiA/IGZyYWcuYiA6IGZyYWcuYSk7XG4gIH1cbiAgZmxvYXQgZ2V0Q2hhbm5lbCh2ZWM0IGZyYWcsIGludCBkaW0pIHtcbiAgICBmbG9hdCBtb2RDb29yZCA9IG1vZChmbG9hdChkaW0pLCAyLik7XG4gICAgcmV0dXJuIG1vZENvb3JkID09IDAuID8gZnJhZy5yIDogZnJhZy5nO1xuICB9XG5gO1xuXG5mdW5jdGlvbiBnZXRPdXRwdXRTY2FsYXJDb29yZHMoKSB7XG4gIHJldHVybiBgXG4gICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXJdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGlmIChwYWNrZWRUZXhTaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIDIgKiBpbnQocmVzdWx0VVYueCAqICR7cGFja2VkVGV4U2hhcGVbMV19LjApO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBpZiAocGFja2VkVGV4U2hhcGVbMV0gPT09IDEpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiBjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCkpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiAyICogaW50KHJlc3VsdFVWLnkgKiAke3BhY2tlZFRleFNoYXBlWzBdfS4wKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSkpO1xuICAgICAgcmV0dXJuIDIgKiAocmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueSk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBpbnQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICByZXR1cm4gMiAqIChyZXNUZXhSQy54ICogJHtwYWNrZWRUZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldE91dHB1dDFEQ29vcmRzKFxuICAgIHNoYXBlOiBbbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh0ZXhTaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogZmxvYXQob3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgaW50IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGludChyZXN1bHRVVi54ICogJHt0ZXhTaGFwZVsxXX0uMCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4U2hhcGVbMV0gPT09IDEpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueSAqIGZsb2F0KG91dFRleFNoYXBlWzBdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIHJldHVybiBpbnQocmVzdWx0VVYueSAqICR7dGV4U2hhcGVbMF19LjApO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbiAgfVxuICByZXR1cm4gYFxuICAgIGludCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIHJldHVybiByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkM0RDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBwYWNrZWRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCBiID0gaW5kZXggLyB0ZXhlbHNJbkJhdGNoO1xuICAgICAgaW5kZXggLT0gYiAqIHRleGVsc0luQmF0Y2g7XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHRleGVsc0luTG9naWNhbFJvdyA9IE1hdGguY2VpbChzaGFwZVsyXSAvIDIpO1xuICBjb25zdCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlWzFdIC8gMik7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjMyBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCBiID0gaW5kZXggLyAke3RleGVsc0luQmF0Y2h9O1xuICAgICAgaW5kZXggLT0gYiAqICR7dGV4ZWxzSW5CYXRjaH07XG5cbiAgICAgIGludCByID0gMiAqIChpbmRleCAvICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSkgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzMoYiwgciwgYyk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQzRENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID1cbiAgICAgICAgc2hhZGVyX3V0aWwuZ2V0T3V0cHV0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleEJ5VW5pZm9ybShcbiAgICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gICAgcmV0dXJuIGBcbiAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cbiAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gIH1cbmA7XG4gIH1cbiAgY29uc3QgY29vcmRzRnJvbUluZGV4U25pcHBldCA9XG4gICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzMgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogJHt0ZXhTaGFwZVsxXX0gKyByZXNUZXhSQy55O1xuICAgICAgJHtjb29yZHNGcm9tSW5kZXhTbmlwcGV0fVxuICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkTkRDb29yZHMoXG4gICAgc2hhcGU6IG51bWJlcltdLCB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAvLyBUT0RPOiBzdXBwb3J0IDVkIGFuZCA2ZFxuICAgIHJldHVybiBgXG4gICAgaXZlYzQgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBwYWNrZWRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG5cbiAgICAgIGludCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBpbnQoY2VpbChmbG9hdChvdXRTaGFwZVszXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdGV4ZWxzSW5Mb2dpY2FsUm93ICogaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMl0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5CYXRjaE4gPSB0ZXhlbHNJbkJhdGNoICogb3V0U2hhcGVbMV07XG5cbiAgICAgIGludCBiMiA9IGluZGV4IC8gdGV4ZWxzSW5CYXRjaE47XG4gICAgICBpbmRleCAtPSBiMiAqIHRleGVsc0luQmF0Y2hOO1xuXG4gICAgICBpbnQgYiA9IGluZGV4IC8gdGV4ZWxzSW5CYXRjaDtcbiAgICAgIGluZGV4IC09IGIgKiB0ZXhlbHNJbkJhdGNoO1xuXG4gICAgICBpbnQgciA9IDIgKiAoaW5kZXggLyB0ZXhlbHNJbkxvZ2ljYWxSb3cpO1xuICAgICAgaW50IGMgPSBpbW9kKGluZGV4LCB0ZXhlbHNJbkxvZ2ljYWxSb3cpICogMjtcblxuICAgICAgcmV0dXJuIGl2ZWM0KGIyLCBiLCByLCBjKTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG5cbiAgY29uc3QgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdIC8gMik7XG4gIGNvbnN0IHRleGVsc0luQmF0Y2ggPVxuICAgICAgdGV4ZWxzSW5Mb2dpY2FsUm93ICogTWF0aC5jZWlsKHNoYXBlW3NoYXBlLmxlbmd0aCAtIDJdIC8gMik7XG4gIGxldCB0ZXhlbHNJbkJhdGNoTiA9IHRleGVsc0luQmF0Y2g7XG4gIGxldCBiYXRjaGVzID0gYGA7XG4gIGxldCBjb29yZHMgPSAnYiwgciwgYyc7XG5cbiAgZm9yIChsZXQgYiA9IDI7IGIgPCBzaGFwZS5sZW5ndGggLSAxOyBiKyspIHtcbiAgICB0ZXhlbHNJbkJhdGNoTiAqPSBzaGFwZVtzaGFwZS5sZW5ndGggLSBiIC0gMV07XG4gICAgYmF0Y2hlcyA9IGBcbiAgICAgIGludCBiJHtifSA9IGluZGV4IC8gJHt0ZXhlbHNJbkJhdGNoTn07XG4gICAgICBpbmRleCAtPSBiJHtifSAqICR7dGV4ZWxzSW5CYXRjaE59O1xuICAgIGAgKyBiYXRjaGVzO1xuICAgIGNvb3JkcyA9IGBiJHtifSwgYCArIGNvb3JkcztcbiAgfVxuXG4gIHJldHVybiBgXG4gICAgaXZlYyR7c2hhcGUubGVuZ3RofSBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3BhY2tlZFRleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7YmF0Y2hlc31cblxuICAgICAgaW50IGIgPSBpbmRleCAvICR7dGV4ZWxzSW5CYXRjaH07XG4gICAgICBpbmRleCAtPSBiICogJHt0ZXhlbHNJbkJhdGNofTtcblxuICAgICAgaW50IHIgPSAyICogKGluZGV4IC8gJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KTtcbiAgICAgIGludCBjID0gaW1vZChpbmRleCwgJHt0ZXhlbHNJbkxvZ2ljYWxSb3d9KSAqIDI7XG5cbiAgICAgIHJldHVybiBpdmVjJHtzaGFwZS5sZW5ndGh9KCR7Y29vcmRzfSk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQ0RENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPVxuICAgICAgICBzaGFkZXJfdXRpbC5nZXRPdXRwdXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgICAgICAgICAgWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG5cbiAgICByZXR1cm4gYFxuICAgIGl2ZWM0IGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIG91dFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cbiAgICAgIHJldHVybiBpdmVjNChyLCBjLCBkLCBkMik7XG4gICAgfVxuICBgO1xuICB9XG4gIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgWydyJywgJ2MnLCAnZCcsICdkMiddLCBzaGFwZSk7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjNCBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzQociwgYywgZCwgZDIpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0NURDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0pOiBzdHJpbmcge1xuICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID0gc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICAgIFsncicsICdjJywgJ2QnLCAnZDInLCAnZDMnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzUgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIoJHt0ZXhTaGFwZVswXX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4U2hhcGVbMV19KSk7XG5cbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzUgb3V0U2hhcGUgPSBpdmVjNShyLCBjLCBkLCBkMiwgZDMpO1xuICAgICAgcmV0dXJuIG91dFNoYXBlO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0NkRDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICB0ZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSk6IHN0cmluZyB7XG4gIGNvbnN0IGNvb3Jkc0Zyb21JbmRleFNuaXBwZXQgPSBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFxuICAgICAgWydyJywgJ2MnLCAnZCcsICdkMicsICdkMycsICdkNCddLCBzaGFwZSk7XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjNiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG5cbiAgICAgICR7Y29vcmRzRnJvbUluZGV4U25pcHBldH1cblxuICAgICAgaXZlYzYgcmVzdWx0ID0gaXZlYzYociwgYywgZCwgZDIsIGQzLCBkNCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0T3V0cHV0UGFja2VkMkRDb29yZHMoXG4gICAgc2hhcGU6IFtudW1iZXIsIG51bWJlcl0sIHRleFNoYXBlOiBbbnVtYmVyLCBudW1iZXJdLFxuICAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcbiAgaWYgKHV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiBwYWNrZWRUZXhTaGFwZSA9IGl2ZWMyKGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdChvdXRUZXhTaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgICAgcmV0dXJuIDIgKiBpdmVjMihyZXN1bHRVVi55eCAqIHZlYzIocGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gMiAqIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtcbiAgICAgICAgcGFja2VkVGV4U2hhcGVbMV19KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIC8vIHRleGVscyBuZWVkZWQgdG8gYWNjb21tb2RhdGUgYSBsb2dpY2FsIHJvd1xuICBjb25zdCB0ZXhlbHNJbkxvZ2ljYWxSb3cgPSBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcblxuICAvKipcbiAgICogZ2V0T3V0cHV0Q29vcmRzXG4gICAqXG4gICAqIHJlc1RleFJDOiBUaGUgcm93cyBhbmQgY29sdW1ucyBvZiB0aGUgdGV4ZWxzLiBJZiB5b3UgbW92ZSBvdmVyIG9uZVxuICAgKiB0ZXhlbCB0byB0aGUgcmlnaHQgaW4gdGhlIHBhY2tlZCB0ZXh0dXJlLCB5b3UgYXJlIG1vdmluZyBvdmVyIG9uZSBjb2x1bW5cbiAgICogKG5vdCB0d28pLlxuICAgKlxuICAgKiBpbmRleDogVGhlIHRleGVsIGluZGV4XG4gICAqL1xuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KG91dFRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQob3V0VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4ZWxzSW5Mb2dpY2FsUm93ID0gaW50KGNlaWwoZmxvYXQob3V0U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMihwYWNrZWRUZXhTaGFwZVswXSwgcGFja2VkVGV4U2hhcGVbMV0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqIHBhY2tlZFRleFNoYXBlWzFdICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvIHRleGVsc0luTG9naWNhbFJvdyk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsIHRleGVsc0luTG9naWNhbFJvdykgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtwYWNrZWRUZXhTaGFwZVsxXX0pKTtcblxuICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7cGFja2VkVGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICAgIGludCByID0gMiAqIChpbmRleCAvICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSk7XG4gICAgICBpbnQgYyA9IGltb2QoaW5kZXgsICR7dGV4ZWxzSW5Mb2dpY2FsUm93fSkgKiAyO1xuXG4gICAgICByZXR1cm4gaXZlYzIociwgYyk7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRPdXRwdXQyRENvb3JkcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyXSwgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGlmICh1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMihvdXRUZXhTaGFwZVswXSwgb3V0VGV4U2hhcGVbMV0pKTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICByZXR1cm4gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKCR7dGV4U2hhcGVbMF19LCAke3RleFNoYXBlWzFdfSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgaWYgKHNoYXBlWzFdID09PSAxKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiBvdXRUZXhTaGFwZVsxXSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMihpbmRleCwgMCk7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIGl2ZWMyIGdldE91dHB1dENvb3JkcygpIHtcbiAgICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgICAgaW50IGluZGV4ID0gcmVzVGV4UkMueCAqICR7dGV4U2hhcGVbMV19ICsgcmVzVGV4UkMueTtcbiAgICAgICAgcmV0dXJuIGl2ZWMyKGluZGV4LCAwKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG4gIGlmIChzaGFwZVswXSA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKG91dFRleFNoYXBlWzBdLCBvdXRUZXhTaGFwZVsxXSkpO1xuICAgICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICAgICByZXR1cm4gaXZlYzIoMCwgaW5kZXgpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhTaGFwZVswXX0sICR7dGV4U2hhcGVbMV19KSk7XG4gICAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICAgIHJldHVybiBpdmVjMigwLCBpbmRleCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgaXZlYzIgZ2V0T3V0cHV0Q29vcmRzKCkge1xuICAgICAgaXZlYzIgcmVzVGV4UkMgPSBpdmVjMihyZXN1bHRVVi55eCAqXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlYzIob3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKSk7XG4gICAgICBpbnQgaW5kZXggPSByZXNUZXhSQy54ICogb3V0VGV4U2hhcGVbMV0gKyByZXNUZXhSQy55O1xuICAgICAgaW50IHIgPSBpbmRleCAvIG91dFNoYXBlWzFdO1xuICAgICAgaW50IGMgPSBpbmRleCAtIHIgKiBvdXRTaGFwZVsxXTtcbiAgICAgIHJldHVybiBpdmVjMihyLCBjKTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICBpdmVjMiBnZXRPdXRwdXRDb29yZHMoKSB7XG4gICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3RleFNoYXBlWzBdfSwgJHt0ZXhTaGFwZVsxXX0pKTtcbiAgICAgIGludCBpbmRleCA9IHJlc1RleFJDLnggKiAke3RleFNoYXBlWzFdfSArIHJlc1RleFJDLnk7XG4gICAgICBpbnQgciA9IGluZGV4IC8gJHtzaGFwZVsxXX07XG4gICAgICBpbnQgYyA9IGluZGV4IC0gciAqICR7c2hhcGVbMV19O1xuICAgICAgcmV0dXJuIGl2ZWMyKHIsIGMpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0RmxhdE9mZnNldFVuaWZvcm1OYW1lKHRleE5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gIHJldHVybiBgb2Zmc2V0JHt0ZXhOYW1lfWA7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJTY2FsYXIoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgaGFsZkNSKTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXJTY2FsYXIoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgcmV0dXJuIGBmbG9hdCAke2Z1bmNOYW1lfSgpIHtyZXR1cm4gJHt0ZXhOYW1lfTt9YDtcbiAgfVxuICBjb25zdCBbdGV4TnVtUiwgdGV4TnVtQ10gPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBpZiAodGV4TnVtUiA9PT0gMSAmJiB0ZXhOdW1DID09PSAxKSB7XG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KCkge1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCBoYWxmQ1IpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TmFtZX1UZXhTaGFwZVswXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke1xuICAgICAgICBvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBjb25zdCBbdE51bVIsIHROdW1DXSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3ROdW1SfSwgJHt0TnVtQ30sICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyMUQoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMUQoXG4gICAgICAgIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgaW5kZXgpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20xRChcbiAgICAgICAgJHtwYWNrZWRUZXhTaGFwZVswXX0sICR7cGFja2VkVGV4U2hhcGVbMV19LCBpbmRleCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlcjFEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG5cbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgLy8gVW5pZm9ybSBhcnJheXMgd2lsbCBiZSBsZXNzIHRoYW4gNjU1MDUgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgY29uc3QgdE51bUMgPSB0ZXhTaGFwZVsxXTtcblxuICBpZiAodE51bUMgPT09IDEgJiYgdE51bVIgPT09IDEpIHtcbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIGhhbGZDUik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmICh0TnVtQyA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKDAuNSwgKGZsb2F0KGluZGV4ICsgJHtvZmZzZXR9KSArIDAuNSkgLyBmbG9hdCgke1xuICAgICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gJHt0TnVtUn0uMCk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG4gIGlmICh0TnVtUiA9PT0gMSkge1xuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IGluZGV4KSB7XG4gICAgICAgIHZlYzIgdXYgPSB2ZWMyKChmbG9hdChpbmRleCArICR7b2Zmc2V0fSkgKyAwLjUpIC8gZmxvYXQoJHtcbiAgICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoZmxvYXQoaW5kZXggKyAke29mZnNldH0pICsgMC41KSAvICR7dE51bUN9LjAsIDAuNSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCBpbmRleCkge1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzFdLCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgaW5kZXgpIHtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dE51bVJ9LCAke3ROdW1DfSwgaW5kZXggKyAke29mZnNldH0pO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlcjJEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcblxuICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcbiAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICBpZiAodGV4U2hhcGUgIT0gbnVsbCAmJiB1dGlsLmFycmF5c0VxdWFsKHNoYXBlLCB0ZXhTaGFwZSkpIHtcbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke1xuICAgICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuXG4gICAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20yRCh2YWx1ZXNQZXJSb3csIHBhY2tlZFRleFNoYXBlWzBdLCBwYWNrZWRUZXhTaGFwZVsxXSwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHZhbHVlc1BlclJvdyA9IE1hdGguY2VpbChzaGFwZVsxXSAvIDIpO1xuXG4gIHJldHVybiBgXG4gICAgdmVjNCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICB2ZWMyIHV2ID0gcGFja2VkVVZmcm9tMkQoJHt2YWx1ZXNQZXJSb3d9LCAke3BhY2tlZFRleFNoYXBlWzBdfSwgJHtcbiAgICAgIHBhY2tlZFRleFNoYXBlWzFdfSwgcm93LCBjb2wpO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXIyRChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCB0ZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG5cbiAgaWYgKHRleFNoYXBlICE9IG51bGwgJiYgdXRpbC5hcnJheXNFcXVhbChzaGFwZSwgdGV4U2hhcGUpKSB7XG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMihjb2wsIHJvdykgKyBoYWxmQ1IpIC8gdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7XG4gICAgICAgICAgdGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cblxuICAgIGNvbnN0IHRleE51bVIgPSB0ZXhTaGFwZVswXTtcbiAgICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICB2ZWMyIHV2ID0gKHZlYzIoY29sLCByb3cpICsgaGFsZkNSKSAvIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbiAgfVxuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBjb25zdCBzcXVlZXplZFNoYXBlID0gbmV3U2hhcGU7XG4gIGlmIChzcXVlZXplZFNoYXBlLmxlbmd0aCA8IHNoYXBlLmxlbmd0aCkge1xuICAgIGNvbnN0IG5ld0lucHV0SW5mbyA9IHNxdWVlemVJbnB1dEluZm8oaW5wdXRJbmZvLCBzcXVlZXplZFNoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICByZXR1cm4gJHtmdW5jTmFtZX0oJHtnZXRTcXVlZXplZFBhcmFtcyhwYXJhbXMsIGtlcHREaW1zKX0pO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBpZiAoaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0pIHtcbiAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChkb3QodmVjMihyb3csIGNvbCksIHZlYzIoJHtzaGFwZVsxXX0sIDEpKSk7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGNvbnN0IG9mZnNldCA9IGdldEZsYXRPZmZzZXRVbmlmb3JtTmFtZSh0ZXhOYW1lKTtcbiAgaWYgKHRleE51bUMgPT09IDEpIHtcbiAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCAke29mZnNldH0pLCB2ZWMzKCR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSwgMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigwLjUsIChpbmRleCArIDAuNSkgLyBmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMF0pKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoMC41LCAoaW5kZXggKyAwLjUpIC8gJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgaWYgKHRleE51bVIgPT09IDEpIHtcbiAgICAvLyBpbmRleCBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdCh2ZWMzKHJvdywgY29sLCAke29mZnNldH0pLCB2ZWMzKCR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSwgMSwgMSkpO1xuICAgICAgICB2ZWMyIHV2ID0gdmVjMigoaW5kZXggKyAwLjUpIC8gZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSwgMC41KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgZmxvYXQgaW5kZXggPSBkb3QodmVjMyhyb3csIGNvbCwgJHtvZmZzZXR9KSwgdmVjMygke3NoYXBlWzFdfSwgMSwgMSkpO1xuICAgICAgdmVjMiB1diA9IHZlYzIoKGluZGV4ICsgMC41KSAvICR7dGV4TnVtQ30uMCwgMC41KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHt0ZXhOYW1lfVNoYXBlWzFdICsgY29sICsgJHtvZmZzZXR9O1xuICAgICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4KTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCkge1xuICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICBpbnQgaW5kZXggPSByb3cgKiAke3NoYXBlWzFdfSArIGNvbCArICR7b2Zmc2V0fTtcbiAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCk7XG4gICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICB9XG5gO1xufVxuXG5mdW5jdGlvbiBnZXRQYWNrZWRTYW1wbGVyM0QoXG4gICAgaW5wdXRJbmZvOiBJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICBbTWF0aC5jZWlsKHRleFNoYXBlWzBdIC8gMiksIE1hdGguY2VpbCh0ZXhTaGFwZVsxXSAvIDIpXTtcblxuICBpZiAoc2hhcGVbMF0gPT09IDEpIHtcbiAgICBjb25zdCBzcXVlZXplZFNoYXBlID0gc2hhcGUuc2xpY2UoMSk7XG4gICAgY29uc3Qga2VwdERpbXMgPSBbMSwgMl07XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsnYicsICdyb3cnLCAnY29sJ107XG4gICAgcmV0dXJuIGBcbiAgICAgICAgJHtnZXRQYWNrZWRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgICB2ZWM0ICR7ZnVuY05hbWV9KGludCBiLCBpbnQgcm93LCBpbnQgY29sKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIGl2ZWMyIHBhY2tlZFRleFNoYXBlID0gaXZlYzIoY2VpbChmbG9hdCgke1xuICAgICAgICB0ZXhOYW1lfVRleFNoYXBlWzBdKSAvIDIuMCksIGNlaWwoZmxvYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzFdKSAvIDIuMCkpO1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHtcbiAgICAgICAgdGV4TmFtZX1TaGFwZVsxXSkgLyAyLjApKTtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRChcbiAgICAgICAgcGFja2VkVGV4U2hhcGVbMF0sIHBhY2tlZFRleFNoYXBlWzFdLCB0ZXhlbHNJbkJhdGNoLCB2YWx1ZXNQZXJSb3csIGIsIHJvdywgY29sKTtcbiAgICAgIHJldHVybiAke2dsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG5cbiAgY29uc3QgdGV4TnVtUiA9IHBhY2tlZFRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gcGFja2VkVGV4U2hhcGVbMV07XG5cbiAgY29uc3QgdmFsdWVzUGVyUm93ID0gTWF0aC5jZWlsKHNoYXBlWzJdIC8gMik7XG4gIGNvbnN0IHRleGVsc0luQmF0Y2ggPSB2YWx1ZXNQZXJSb3cgKiBNYXRoLmNlaWwoc2hhcGVbMV0gLyAyKTtcblxuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIsIGludCByb3csIGludCBjb2wpIHtcbiAgICAgIHZlYzIgdXYgPSBwYWNrZWRVVmZyb20zRChcbiAgICAgICAgJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgJHt0ZXhlbHNJbkJhdGNofSwgJHt2YWx1ZXNQZXJSb3d9LCBiLCByb3csIGNvbCk7XG4gICAgICByZXR1cm4gJHtnbHNsLnRleHR1cmUyRH0oJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0U2FtcGxlcjNEKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZTtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IHN0cmlkZTAgPSBzaGFwZVsxXSAqIHNoYXBlWzJdO1xuICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl07XG5cbiAgY29uc3Qge25ld1NoYXBlLCBrZXB0RGltc30gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gIGNvbnN0IHNxdWVlemVkU2hhcGUgPSBuZXdTaGFwZTtcbiAgaWYgKHNxdWVlemVkU2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIHNxdWVlemVkU2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCcsICdkZXB0aCddO1xuICAgIHJldHVybiBgXG4gICAgICAgICR7Z2V0U2FtcGxlckZyb21JbkluZm8obmV3SW5wdXRJbmZvLCBlbmFibGVTaGFwZVVuaWZvcm1zKX1cbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzMocm93LCBjb2wsIGRlcHRoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgICBpbnQgc3RyaWRlMSA9ICR7dGV4TmFtZX1TaGFwZVsyXTtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgIGZsb2F0IHRleEMgPSBkb3QodmVjMihjb2wsIGRlcHRoKSwgdmVjMihzdHJpZGUxLCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOYW1lfVRleFNoYXBlWzFdLCAke3RleE5hbWV9VGV4U2hhcGVbMF0pO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuIGBcbiAgICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgICAgZmxvYXQgdGV4QyA9IGRvdCh2ZWMyKGNvbCwgZGVwdGgpLCB2ZWMyKCR7c3RyaWRlMX0sIDEpKTtcbiAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxuXG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUxICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzIocm93LCBjb2wpLCB2ZWMyKCR7dGV4TmFtZX1TaGFwZVsxXSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgpO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7XG4gICAgICAgICAgdGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCkge1xuICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMyKHJvdywgY29sKSwgdmVjMigke3NoYXBlWzFdfSwgMSkpO1xuICAgICAgZmxvYXQgdGV4QyA9IGZsb2F0KGRlcHRoKTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBzdHJpZGUwID0gJHt0ZXhOYW1lfVNoYXBlWzFdICogJHt0ZXhOYW1lfVNoYXBlWzJdO1xuICAgICAgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl07XG4gICAgICBpbnQgaW5kZXggPSByb3cgKiBzdHJpZGUwICsgY29sICogc3RyaWRlMSArIGRlcHRoICsgJHtvZmZzZXR9O1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOYW1lfVRleFNoYXBlWzBdLCAke3RleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gICAgYDtcbiAgfVxuICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoKSB7XG4gICAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCArICR7b2Zmc2V0fTtcbiAgICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFBhY2tlZFNhbXBsZXJORChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgLy8gVE9ETzogc3VwcG9ydCA1ZCBhbmQgNmRcbiAgICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oaW50IGIyLCBpbnQgYiwgaW50IHJvdywgaW50IGNvbCkge1xuICAgICAgaW50IHZhbHVlc1BlclJvdyA9IGludChjZWlsKGZsb2F0KCR7dGV4TmFtZX1TaGFwZVszXSkgLyAyLjApKTtcbiAgICAgIGludCB0ZXhlbHNJbkJhdGNoID0gdmFsdWVzUGVyUm93ICogaW50KGNlaWwoZmxvYXQoJHtcbiAgICAgICAgdGV4TmFtZX1TaGFwZVsyXSkgLyAyLjApKTtcbiAgICAgIGludCBpbmRleCA9IGIgKiB0ZXhlbHNJbkJhdGNoICsgKHJvdyAvIDIpICogdmFsdWVzUGVyUm93ICsgKGNvbCAvIDIpO1xuICAgICAgdGV4ZWxzSW5CYXRjaCAqPSAke3RleE5hbWV9U2hhcGVbMV07XG4gICAgICBpbmRleCA9IGIyICogdGV4ZWxzSW5CYXRjaCArIGluZGV4O1xuICAgICAgaXZlYzIgcGFja2VkVGV4U2hhcGUgPSBpdmVjMihjZWlsKGZsb2F0KCR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMF0pIC8gMi4wKSwgY2VpbChmbG9hdCgke3RleE5hbWV9VGV4U2hhcGVbMV0pIC8gMi4wKSk7XG4gICAgICBpbnQgdGV4UiA9IGluZGV4IC8gcGFja2VkVGV4U2hhcGVbMV07XG4gICAgICBpbnQgdGV4QyA9IGluZGV4IC0gdGV4UiAqIHBhY2tlZFRleFNoYXBlWzFdO1xuICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvIHZlYzIocGFja2VkVGV4U2hhcGVbMV0sIHBhY2tlZFRleFNoYXBlWzBdKTsgcmV0dXJuICR7XG4gICAgICAgIGdsc2wudGV4dHVyZTJEfSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xuICB9XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHJhbmsgPSBzaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgcGFja2VkVGV4U2hhcGUgPVxuICAgICAgW01hdGguY2VpbCh0ZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwodGV4U2hhcGVbMV0gLyAyKV07XG4gIGNvbnN0IHRleE51bVIgPSBwYWNrZWRUZXhTaGFwZVswXTtcbiAgY29uc3QgdGV4TnVtQyA9IHBhY2tlZFRleFNoYXBlWzFdO1xuXG4gIGNvbnN0IHZhbHVlc1BlclJvdyA9IE1hdGguY2VpbChzaGFwZVtyYW5rIC0gMV0gLyAyKTtcbiAgbGV0IHRleGVsc0luQmF0Y2ggPSB2YWx1ZXNQZXJSb3cgKiBNYXRoLmNlaWwoc2hhcGVbcmFuayAtIDJdIC8gMik7XG4gIGxldCBwYXJhbXMgPSBgaW50IGIsIGludCByb3csIGludCBjb2xgO1xuICBsZXQgaW5kZXggPSBgYiAqICR7dGV4ZWxzSW5CYXRjaH0gKyAocm93IC8gMikgKiAke3ZhbHVlc1BlclJvd30gKyAoY29sIC8gMilgO1xuICBmb3IgKGxldCBiID0gMjsgYiA8IHJhbmsgLSAxOyBiKyspIHtcbiAgICBwYXJhbXMgPSBgaW50IGIke2J9LCBgICsgcGFyYW1zO1xuICAgIHRleGVsc0luQmF0Y2ggKj0gc2hhcGVbcmFuayAtIGIgLSAxXTtcbiAgICBpbmRleCA9IGBiJHtifSAqICR7dGV4ZWxzSW5CYXRjaH0gKyBgICsgaW5kZXg7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICB2ZWM0ICR7ZnVuY05hbWV9KCR7cGFyYW1zfSkge1xuICAgICAgaW50IGluZGV4ID0gJHtpbmRleH07XG4gICAgICBpbnQgdGV4UiA9IGluZGV4IC8gJHt0ZXhOdW1DfTtcbiAgICAgIGludCB0ZXhDID0gaW5kZXggLSB0ZXhSICogJHt0ZXhOdW1DfTtcbiAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgLyB2ZWMyKCR7dGV4TnVtQ30sICR7dGV4TnVtUn0pO1xuICAgICAgcmV0dXJuICR7Z2xzbC50ZXh0dXJlMkR9KCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXI0RChcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbik6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM107XG4gIGNvbnN0IHN0cmlkZTEgPSBzaGFwZVsyXSAqIHN0cmlkZTI7XG4gIGNvbnN0IHN0cmlkZTAgPSBzaGFwZVsxXSAqIHN0cmlkZTE7XG5cbiAgY29uc3Qge25ld1NoYXBlLCBrZXB0RGltc30gPSB1dGlsLnNxdWVlemVTaGFwZShzaGFwZSk7XG4gIGlmIChuZXdTaGFwZS5sZW5ndGggPCBzaGFwZS5sZW5ndGgpIHtcbiAgICBjb25zdCBuZXdJbnB1dEluZm8gPSBzcXVlZXplSW5wdXRJbmZvKGlucHV0SW5mbywgbmV3U2hhcGUpO1xuICAgIGNvbnN0IHBhcmFtcyA9IFsncm93JywgJ2NvbCcsICdkZXB0aCcsICdkZXB0aDInXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8sIGVuYWJsZVNoYXBlVW5pZm9ybXMpfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmIChpbnB1dEluZm8uc2hhcGVJbmZvLmlzVW5pZm9ybSkge1xuICAgIC8vIFVuaWZvcm0gYXJyYXlzIHdpbGwgYmUgbGVzcyB0aGFuIDY1NTA1IChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgaW50IGluZGV4ID0gcm91bmQoZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sIDEpKSk7XG4gICAgICAgICR7Z2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgZmxhdE9mZnNldCA9IGlucHV0SW5mby5zaGFwZUluZm8uZmxhdE9mZnNldDtcbiAgY29uc3QgdGV4U2hhcGUgPSBpbnB1dEluZm8uc2hhcGVJbmZvLnRleFNoYXBlO1xuICBjb25zdCB0ZXhOdW1SID0gdGV4U2hhcGVbMF07XG4gIGNvbnN0IHRleE51bUMgPSB0ZXhTaGFwZVsxXTtcblxuICBjb25zdCBzdHJpZGUyU3RyID0gYGludCBzdHJpZGUyID0gJHt0ZXhOYW1lfVNoYXBlWzNdO2A7XG4gIGNvbnN0IHN0cmlkZTFTdHIgPSBgaW50IHN0cmlkZTEgPSAke3RleE5hbWV9U2hhcGVbMl0gKiBzdHJpZGUyO2A7XG4gIGNvbnN0IHN0cmlkZTBTdHIgPSBgaW50IHN0cmlkZTAgPSAke3RleE5hbWV9U2hhcGVbMV0gKiBzdHJpZGUxO2A7XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICBpZiAoZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMikge1xuICAgICAgICAke3N0cmlkZTJTdHJ9XG4gICAgICAgICR7c3RyaWRlMVN0cn1cbiAgICAgICAgZmxvYXQgdGV4UiA9IGZsb2F0KHJvdyk7XG4gICAgICAgIGZsb2F0IHRleEMgPVxuICAgICAgICAgICAgZG90KHZlYzMoY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICAgICAgICB2ZWMzKHN0cmlkZTEsIHN0cmlkZTIsIDEpKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICAgdmVjMigke3RleE5hbWV9VGV4U2hhcGVbMV0sICR7dGV4TmFtZX1UZXhTaGFwZVswXSk7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICAgIH1cbiAgICBgO1xuICAgIH1cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBmbG9hdChyb3cpO1xuICAgICAgICBmbG9hdCB0ZXhDID1cbiAgICAgICAgICAgIGRvdCh2ZWMzKGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgICAgICAgdmVjMygke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlMiAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgaWYgKGVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3RleE5hbWV9U2hhcGVbMV0gKiAke3RleE5hbWV9U2hhcGVbMl0sICR7XG4gICAgICAgICAgdGV4TmFtZX1TaGFwZVsyXSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TmFtZX1UZXhTaGFwZVsxXSwgJHt0ZXhOYW1lfVRleFNoYXBlWzBdKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gICAgfVxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgICAgZmxvYXQgdGV4UiA9IGRvdCh2ZWMzKHJvdywgY29sLCBkZXB0aCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjMygke3NoYXBlWzFdICogc2hhcGVbMl19LCAke3NoYXBlWzJdfSwgMSkpO1xuICAgICAgICBmbG9hdCB0ZXhDID0gZmxvYXQoZGVwdGgyKTtcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIGlmIChlbmFibGVTaGFwZVVuaWZvcm1zKSB7XG4gICAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgICR7c3RyaWRlMlN0cn1cbiAgICAgICR7c3RyaWRlMVN0cn1cbiAgICAgICR7c3RyaWRlMFN0cn1cbiAgICAgIGludCBpbmRleCA9IHJvdyAqIHN0cmlkZTAgKyBjb2wgKiBzdHJpZGUxICtcbiAgICAgICAgICBkZXB0aCAqIHN0cmlkZTIgKyBkZXB0aDI7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE5hbWV9VGV4U2hhcGVbMF0sICR7XG4gICAgICAgIHRleE5hbWV9VGV4U2hhcGVbMV0sIGluZGV4ICsgJHtvZmZzZXR9KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG4gIH1cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIpIHtcbiAgICAgIC8vIEV4cGxpY2l0bHkgdXNlIGludGVnZXIgb3BlcmF0aW9ucyBhcyBkb3QoKSBvbmx5IHdvcmtzIG9uIGZsb2F0cy5cbiAgICAgIGludCBpbmRleCA9IHJvdyAqICR7c3RyaWRlMH0gKyBjb2wgKiAke3N0cmlkZTF9ICtcbiAgICAgICAgICBkZXB0aCAqICR7c3RyaWRlMn0gKyBkZXB0aDI7XG4gICAgICB2ZWMyIHV2ID0gdXZGcm9tRmxhdCgke3RleE51bVJ9LCAke3RleE51bUN9LCBpbmRleCArICR7b2Zmc2V0fSk7XG4gICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgfVxuICBgO1xufVxuXG5mdW5jdGlvbiBnZXRTYW1wbGVyNUQoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCBzaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlO1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhOYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdGV4TmFtZS5zbGljZSgxKTtcbiAgY29uc3Qgc3RyaWRlMyA9IHNoYXBlWzRdO1xuICBjb25zdCBzdHJpZGUyID0gc2hhcGVbM10gKiBzdHJpZGUzO1xuICBjb25zdCBzdHJpZGUxID0gc2hhcGVbMl0gKiBzdHJpZGUyO1xuICBjb25zdCBzdHJpZGUwID0gc2hhcGVbMV0gKiBzdHJpZGUxO1xuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBpZiAobmV3U2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMyddO1xuICAgIHJldHVybiBgXG4gICAgICAke2dldFNhbXBsZXJGcm9tSW5JbmZvKG5ld0lucHV0SW5mbyl9XG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgcmV0dXJuICR7ZnVuY05hbWV9KCR7Z2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zLCBrZXB0RGltcyl9KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgaWYgKGlucHV0SW5mby5zaGFwZUluZm8uaXNVbmlmb3JtKSB7XG4gICAgLy8gVW5pZm9ybSBhcnJheXMgd2lsbCBiZSBsZXNzIHRoYW4gNjU1MDUgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCwgaW50IGRlcHRoMiwgaW50IGRlcHRoMykge1xuICAgICAgICBmbG9hdCBpbmRleCA9IGRvdChcbiAgICAgICAgICB2ZWM0KHJvdywgY29sLCBkZXB0aCwgZGVwdGgyKSxcbiAgICAgICAgICB2ZWM0KCR7c3RyaWRlMH0sICR7c3RyaWRlMX0sICR7c3RyaWRlMn0sICR7c3RyaWRlM30pKSArXG4gICAgICAgICAgZGVwdGgzO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG5cbiAgaWYgKHRleE51bUMgPT09IHN0cmlkZTAgJiYgZmxhdE9mZnNldCA9PSBudWxsKSB7XG4gICAgLy8gdGV4QyBpcyB1c2VkIGRpcmVjdGx5IGFzIHBoeXNpY2FsIChubyByaXNrIG9mIGZsb2F0MTYgb3ZlcmZsb3cpLlxuICAgIHJldHVybiBgXG4gICAgICBmbG9hdCAke2Z1bmNOYW1lfShpbnQgcm93LCBpbnQgY29sLCBpbnQgZGVwdGgsIGludCBkZXB0aDIsIGludCBkZXB0aDMpIHtcbiAgICAgICAgaW50IHRleFIgPSByb3c7XG4gICAgICAgIGZsb2F0IHRleEMgPSBkb3QodmVjNChjb2wsIGRlcHRoLCBkZXB0aDIsIGRlcHRoMyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgdmVjNCgke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAke3N0cmlkZTN9LCAxKSk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUzICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleFIgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAgIGZsb2F0IHRleFIgPSBkb3QoXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgdmVjNCgke3NoYXBlWzFdICogc2hhcGVbMl0gKiBzaGFwZVszXX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzJdICogc2hhcGVbM119LCAke3NoYXBlWzNdfSwgMSkpO1xuICAgICAgICBpbnQgdGV4QyA9IGRlcHRoMztcbiAgICAgICAgdmVjMiB1diA9ICh2ZWMyKHRleEMsIHRleFIpICsgaGFsZkNSKSAvXG4gICAgICAgICAgICAgICAgICB2ZWMyKCR7dGV4TnVtQ30uMCwgJHt0ZXhOdW1SfS4wKTtcbiAgICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cblxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLCBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzKSB7XG4gICAgICAvLyBFeHBsaWNpdGx5IHVzZSBpbnRlZ2VyIG9wZXJhdGlvbnMgYXMgZG90KCkgb25seSB3b3JrcyBvbiBmbG9hdHMuXG4gICAgICBpbnQgaW5kZXggPSByb3cgKiAke3N0cmlkZTB9ICsgY29sICogJHtzdHJpZGUxfSArIGRlcHRoICogJHtzdHJpZGUyfSArXG4gICAgICAgICAgZGVwdGgyICogJHtzdHJpZGUzfSArIGRlcHRoMyArICR7b2Zmc2V0fTtcbiAgICAgIHZlYzIgdXYgPSB1dkZyb21GbGF0KCR7dGV4TnVtUn0sICR7dGV4TnVtQ30sIGluZGV4KTtcbiAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHV2KTtcbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXI2RChpbnB1dEluZm86IElucHV0SW5mbyk6IHN0cmluZyB7XG4gIGNvbnN0IHNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGU7XG4gIGNvbnN0IHRleE5hbWUgPSBpbnB1dEluZm8ubmFtZTtcbiAgY29uc3QgZnVuY05hbWUgPSAnZ2V0JyArIHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuXG4gIGNvbnN0IHtuZXdTaGFwZSwga2VwdERpbXN9ID0gdXRpbC5zcXVlZXplU2hhcGUoc2hhcGUpO1xuICBpZiAobmV3U2hhcGUubGVuZ3RoIDwgc2hhcGUubGVuZ3RoKSB7XG4gICAgY29uc3QgbmV3SW5wdXRJbmZvID0gc3F1ZWV6ZUlucHV0SW5mbyhpbnB1dEluZm8sIG5ld1NoYXBlKTtcbiAgICBjb25zdCBwYXJhbXMgPSBbJ3JvdycsICdjb2wnLCAnZGVwdGgnLCAnZGVwdGgyJywgJ2RlcHRoMycsICdkZXB0aDQnXTtcbiAgICByZXR1cm4gYFxuICAgICAgJHtnZXRTYW1wbGVyRnJvbUluSW5mbyhuZXdJbnB1dEluZm8pfVxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgIHJldHVybiAke2Z1bmNOYW1lfSgke2dldFNxdWVlemVkUGFyYW1zKHBhcmFtcywga2VwdERpbXMpfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IHN0cmlkZTQgPSBzaGFwZVs1XTtcbiAgY29uc3Qgc3RyaWRlMyA9IHNoYXBlWzRdICogc3RyaWRlNDtcbiAgY29uc3Qgc3RyaWRlMiA9IHNoYXBlWzNdICogc3RyaWRlMztcbiAgY29uc3Qgc3RyaWRlMSA9IHNoYXBlWzJdICogc3RyaWRlMjtcbiAgY29uc3Qgc3RyaWRlMCA9IHNoYXBlWzFdICogc3RyaWRlMTtcblxuICBpZiAoaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0pIHtcbiAgICAvLyBVbmlmb3JtIGFycmF5cyB3aWxsIGJlIGxlc3MgdGhhbiA2NTUwNSAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBpbnQgaW5kZXggPSByb3VuZChkb3QoXG4gICAgICAgICAgdmVjNChyb3csIGNvbCwgZGVwdGgsIGRlcHRoMiksXG4gICAgICAgICAgdmVjNCgke3N0cmlkZTB9LCAke3N0cmlkZTF9LCAke3N0cmlkZTJ9LCAke3N0cmlkZTN9KSkgK1xuICAgICAgICAgIGRvdChcbiAgICAgICAgICAgIHZlYzIoZGVwdGgzLCBkZXB0aDQpLFxuICAgICAgICAgICAgdmVjMigke3N0cmlkZTR9LCAxKSkpO1xuICAgICAgICAke2dldFVuaWZvcm1TYW1wbGVyKGlucHV0SW5mbyl9XG4gICAgICB9XG4gICAgYDtcbiAgfVxuXG4gIGNvbnN0IGZsYXRPZmZzZXQgPSBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQ7XG4gIGNvbnN0IHRleFNoYXBlID0gaW5wdXRJbmZvLnNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgdGV4TnVtUiA9IHRleFNoYXBlWzBdO1xuICBjb25zdCB0ZXhOdW1DID0gdGV4U2hhcGVbMV07XG4gIGlmICh0ZXhOdW1DID09PSBzdHJpZGUwICYmIGZsYXRPZmZzZXQgPT0gbnVsbCkge1xuICAgIC8vIHRleEMgaXMgdXNlZCBkaXJlY3RseSBhcyBwaHlzaWNhbCAobm8gcmlzayBvZiBmbG9hdDE2IG92ZXJmbG93KS5cbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgyLCBpbnQgZGVwdGgzLCBpbnQgZGVwdGg0KSB7XG4gICAgICAgIGludCB0ZXhSID0gcm93O1xuICAgICAgICBmbG9hdCB0ZXhDID0gZG90KHZlYzQoY29sLCBkZXB0aCwgZGVwdGgyLCBkZXB0aDMpLFxuICAgICAgICAgIHZlYzQoJHtzdHJpZGUxfSwgJHtzdHJpZGUyfSwgJHtzdHJpZGUzfSwgJHtzdHJpZGU0fSkpICtcbiAgICAgICAgICAgICAgIGZsb2F0KGRlcHRoNCk7XG4gICAgICAgIHZlYzIgdXYgPSAodmVjMih0ZXhDLCB0ZXhSKSArIGhhbGZDUikgL1xuICAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBpZiAodGV4TnVtQyA9PT0gc3RyaWRlNCAmJiBmbGF0T2Zmc2V0ID09IG51bGwpIHtcbiAgICAvLyB0ZXhSIGlzIHVzZWQgZGlyZWN0bHkgYXMgcGh5c2ljYWwgKG5vIHJpc2sgb2YgZmxvYXQxNiBvdmVyZmxvdykuXG4gICAgcmV0dXJuIGBcbiAgICAgIGZsb2F0ICR7ZnVuY05hbWV9KGludCByb3csIGludCBjb2wsIGludCBkZXB0aCxcbiAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgICBmbG9hdCB0ZXhSID0gZG90KHZlYzQocm93LCBjb2wsIGRlcHRoLCBkZXB0aDIpLFxuICAgICAgICAgIHZlYzQoJHtzaGFwZVsxXSAqIHNoYXBlWzJdICogc2hhcGVbM10gKiBzaGFwZVs0XX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzJdICogc2hhcGVbM10gKiBzaGFwZVs0XX0sXG4gICAgICAgICAgICAgICAke3NoYXBlWzNdICogc2hhcGVbNF19LFxuICAgICAgICAgICAgICAgJHtzaGFwZVs0XX0pKSArIGZsb2F0KGRlcHRoMyk7XG4gICAgICAgIGludCB0ZXhDID0gZGVwdGg0O1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgIHZlYzIoJHt0ZXhOdW1DfS4wLCAke3RleE51bVJ9LjApO1xuICAgICAgICByZXR1cm4gc2FtcGxlVGV4dHVyZSgke3RleE5hbWV9LCB1dik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxuICBjb25zdCBvZmZzZXQgPSBnZXRGbGF0T2Zmc2V0VW5pZm9ybU5hbWUodGV4TmFtZSk7XG4gIHJldHVybiBgXG4gICAgZmxvYXQgJHtmdW5jTmFtZX0oaW50IHJvdywgaW50IGNvbCwgaW50IGRlcHRoLFxuICAgICAgICAgICAgICAgICAgaW50IGRlcHRoMiwgaW50IGRlcHRoMywgaW50IGRlcHRoNCkge1xuICAgICAgLy8gRXhwbGljaXRseSB1c2UgaW50ZWdlciBvcGVyYXRpb25zIGFzIGRvdCgpIG9ubHkgd29ya3Mgb24gZmxvYXRzLlxuICAgICAgaW50IGluZGV4ID0gcm93ICogJHtzdHJpZGUwfSArIGNvbCAqICR7c3RyaWRlMX0gKyBkZXB0aCAqICR7c3RyaWRlMn0gK1xuICAgICAgICAgIGRlcHRoMiAqICR7c3RyaWRlM30gKyBkZXB0aDMgKiAke3N0cmlkZTR9ICsgZGVwdGg0ICsgJHtvZmZzZXR9O1xuICAgICAgdmVjMiB1diA9IHV2RnJvbUZsYXQoJHt0ZXhOdW1SfSwgJHt0ZXhOdW1DfSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIHNhbXBsZVRleHR1cmUoJHt0ZXhOYW1lfSwgdXYpO1xuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0VW5pZm9ybVNhbXBsZXIoaW5wdXRJbmZvOiBJbnB1dEluZm8pOiBzdHJpbmcge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dEluZm8uc2hhcGVJbmZvLmxvZ2ljYWxTaGFwZSk7XG5cbiAgaWYgKGluU2l6ZSA8IDIpIHtcbiAgICByZXR1cm4gYHJldHVybiAke3RleE5hbWV9O2A7XG4gIH1cblxuICByZXR1cm4gYFxuICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtpblNpemV9OyBpKyspIHtcbiAgICAgIGlmIChpID09IGluZGV4KSB7XG4gICAgICAgIHJldHVybiAke3RleE5hbWV9W2ldO1xuICAgICAgfVxuICAgIH1cbiAgYDtcbn1cblxuZnVuY3Rpb24gZ2V0UGFja2VkU2FtcGxlckF0T3V0cHV0Q29vcmRzKFxuICAgIGlucHV0SW5mbzogSW5wdXRJbmZvLCBvdXRTaGFwZUluZm86IFNoYXBlSW5mbykge1xuICBjb25zdCB0ZXhOYW1lID0gaW5wdXRJbmZvLm5hbWU7XG4gIGNvbnN0IHRleEZ1bmNTbmlwcGV0ID0gdGV4TmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleE5hbWUuc2xpY2UoMSk7XG4gIGNvbnN0IGZ1bmNOYW1lID0gJ2dldCcgKyB0ZXhGdW5jU25pcHBldCArICdBdE91dENvb3Jkcyc7XG4gIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IGJyb2FkY2FzdERpbXMgPSBnZXRCcm9hZGNhc3REaW1zKFxuICAgICAgaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGUsIG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUpO1xuXG4gIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShvdXRSYW5rKTtcbiAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICBsZXQgY29vcmRzU25pcHBldDogc3RyaW5nO1xuICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbiAgaWYgKGluUmFuayA9PT0gMCkge1xuICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgfSBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgY29vcmRzU25pcHBldCA9ICdjb29yZHMgPSAwOyc7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgIGJyb2FkY2FzdERpbXMubWFwKGQgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tkICsgcmFua0RpZmZdfSA9IDA7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gIH0gZWxzZSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgbGV0IG91dHB1dCA9IGByZXR1cm4gb3V0cHV0VmFsdWU7YDtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgaXNJbnB1dFNjYWxhciA9IGluU2l6ZSA9PT0gMTtcbiAgY29uc3Qgb3V0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgaXNPdXRwdXRTY2FsYXIgPSBvdXRTaXplID09PSAxO1xuXG4gIGlmIChpblJhbmsgPT09IDEgJiYgIWlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgb3V0cHV0ID0gYFxuICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueHksIG91dHB1dFZhbHVlLnh5KTtcbiAgICBgO1xuICB9IGVsc2UgaWYgKGlzSW5wdXRTY2FsYXIgJiYgIWlzT3V0cHV0U2NhbGFyKSB7XG4gICAgaWYgKG91dFJhbmsgPT09IDEpIHtcbiAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueCwgMC4sIDAuKTtcbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dCA9IGBcbiAgICAgICAgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7XG4gICAgICBgO1xuICAgIH1cbiAgfSBlbHNlIGlmIChicm9hZGNhc3REaW1zLmxlbmd0aCkge1xuICAgIGNvbnN0IHJvd3MgPSBpblJhbmsgLSAyO1xuICAgIGNvbnN0IGNvbHMgPSBpblJhbmsgLSAxO1xuXG4gICAgaWYgKGJyb2FkY2FzdERpbXMuaW5kZXhPZihyb3dzKSA+IC0xICYmIGJyb2FkY2FzdERpbXMuaW5kZXhPZihjb2xzKSA+IC0xKSB7XG4gICAgICBvdXRwdXQgPSBgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCk7YDtcbiAgICB9IGVsc2UgaWYgKGJyb2FkY2FzdERpbXMuaW5kZXhPZihyb3dzKSA+IC0xKSB7XG4gICAgICBvdXRwdXQgPSBgcmV0dXJuIHZlYzQob3V0cHV0VmFsdWUueCwgb3V0cHV0VmFsdWUueSwgYCArXG4gICAgICAgICAgYG91dHB1dFZhbHVlLngsIG91dHB1dFZhbHVlLnkpO2A7XG4gICAgfSBlbHNlIGlmIChicm9hZGNhc3REaW1zLmluZGV4T2YoY29scykgPiAtMSkge1xuICAgICAgb3V0cHV0ID0gYHJldHVybiB2ZWM0KG91dHB1dFZhbHVlLnh4LCBvdXRwdXRWYWx1ZS56eik7YDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYFxuICAgIHZlYzQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAke3R5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgJHtjb29yZHNTbmlwcGV0fVxuICAgICAgdmVjNCBvdXRwdXRWYWx1ZSA9IGdldCR7dGV4RnVuY1NuaXBwZXR9KCR7dW5wYWNrZWRDb29yZHNTbmlwcGV0fSk7XG4gICAgICAke291dHB1dH1cbiAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGdldFNhbXBsZXJBdE91dHB1dENvb3JkcyhcbiAgICBpbnB1dEluZm86IElucHV0SW5mbywgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm8pIHtcbiAgY29uc3QgdGV4TmFtZSA9IGlucHV0SW5mby5uYW1lO1xuICBjb25zdCB0ZXhGdW5jU25pcHBldCA9IHRleE5hbWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB0ZXhOYW1lLnNsaWNlKDEpO1xuICBjb25zdCBmdW5jTmFtZSA9ICdnZXQnICsgdGV4RnVuY1NuaXBwZXQgKyAnQXRPdXRDb29yZHMnO1xuICBjb25zdCBvdXRUZXhTaGFwZSA9IG91dFNoYXBlSW5mby50ZXhTaGFwZTtcbiAgY29uc3QgaW5UZXhTaGFwZSA9IGlucHV0SW5mby5zaGFwZUluZm8udGV4U2hhcGU7XG4gIGNvbnN0IGluUmFuayA9IGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLmxlbmd0aDtcbiAgY29uc3Qgb3V0UmFuayA9IG91dFNoYXBlSW5mby5sb2dpY2FsU2hhcGUubGVuZ3RoO1xuXG4gIGlmICghaW5wdXRJbmZvLnNoYXBlSW5mby5pc1VuaWZvcm0gJiYgaW5SYW5rID09PSBvdXRSYW5rICYmXG4gICAgICBpbnB1dEluZm8uc2hhcGVJbmZvLmZsYXRPZmZzZXQgPT0gbnVsbCAmJlxuICAgICAgdXRpbC5hcnJheXNFcXVhbChpblRleFNoYXBlLCBvdXRUZXhTaGFwZSkpIHtcbiAgICByZXR1cm4gYFxuICAgICAgZmxvYXQgJHtmdW5jTmFtZX0oKSB7XG4gICAgICAgIHJldHVybiBzYW1wbGVUZXh0dXJlKCR7dGV4TmFtZX0sIHJlc3VsdFVWKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG5cbiAgY29uc3QgdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKG91dFJhbmspO1xuICBjb25zdCBicm9hZGNhc3REaW1zID0gZ2V0QnJvYWRjYXN0RGltcyhcbiAgICAgIGlucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlLCBvdXRTaGFwZUluZm8ubG9naWNhbFNoYXBlKTtcbiAgY29uc3QgcmFua0RpZmYgPSBvdXRSYW5rIC0gaW5SYW5rO1xuICBsZXQgY29vcmRzU25pcHBldDogc3RyaW5nO1xuICBjb25zdCBmaWVsZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbiAgaWYgKGluUmFuayA9PT0gMCkge1xuICAgIGNvb3Jkc1NuaXBwZXQgPSAnJztcbiAgfSBlbHNlIGlmIChvdXRSYW5rIDwgMiAmJiBicm9hZGNhc3REaW1zLmxlbmd0aCA+PSAxKSB7XG4gICAgY29vcmRzU25pcHBldCA9ICdjb29yZHMgPSAwOyc7XG4gIH0gZWxzZSB7XG4gICAgY29vcmRzU25pcHBldCA9XG4gICAgICAgIGJyb2FkY2FzdERpbXMubWFwKGQgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tkICsgcmFua0RpZmZdfSA9IDA7YClcbiAgICAgICAgICAgIC5qb2luKCdcXG4nKTtcbiAgfVxuICBsZXQgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJyc7XG4gIGlmIChvdXRSYW5rIDwgMiAmJiBpblJhbmsgPiAwKSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gJ2Nvb3Jkcyc7XG4gIH0gZWxzZSB7XG4gICAgdW5wYWNrZWRDb29yZHNTbmlwcGV0ID0gaW5wdXRJbmZvLnNoYXBlSW5mby5sb2dpY2FsU2hhcGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgocywgaSkgPT4gYGNvb3Jkcy4ke2ZpZWxkc1tpICsgcmFua0RpZmZdfWApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcsICcpO1xuICB9XG5cbiAgcmV0dXJuIGBcbiAgICBmbG9hdCAke2Z1bmNOYW1lfSgpIHtcbiAgICAgICR7dHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAke2Nvb3Jkc1NuaXBwZXR9XG4gICAgICByZXR1cm4gZ2V0JHt0ZXhGdW5jU25pcHBldH0oJHt1bnBhY2tlZENvb3Jkc1NuaXBwZXR9KTtcbiAgICB9XG4gIGA7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29yZHNEYXRhVHlwZShyYW5rOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmFuayA8PSAxKSB7XG4gICAgcmV0dXJuICdpbnQnO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDIpIHtcbiAgICByZXR1cm4gJ2l2ZWMyJztcbiAgfSBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgcmV0dXJuICdpdmVjMyc7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgIHJldHVybiAnaXZlYzQnO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDUpIHtcbiAgICByZXR1cm4gJ2l2ZWM1JztcbiAgfSBlbHNlIGlmIChyYW5rID09PSA2KSB7XG4gICAgcmV0dXJuICdpdmVjNic7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRXJyb3IoYEdQVSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1JbmZvRnJvbVNoYXBlKFxuICAgIGlzUGFja2VkOiBib29sZWFuLCBzaGFwZTogbnVtYmVyW10sIHRleFNoYXBlOiBudW1iZXJbXSkge1xuICBjb25zdCB7bmV3U2hhcGUsIGtlcHREaW1zfSA9IHV0aWwuc3F1ZWV6ZVNoYXBlKHNoYXBlKTtcbiAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgY29uc3QgdXNlU3F1ZWV6ZVBhY2tlZFNoYXBlID0gaXNQYWNrZWQgJiYgcmFuayA9PT0gMyAmJiBzaGFwZVswXSA9PT0gMTtcbiAgY29uc3Qgc3F1ZWV6ZVNoYXBlID0gdXNlU3F1ZWV6ZVBhY2tlZFNoYXBlID8gc2hhcGUuc2xpY2UoMSkgOiBuZXdTaGFwZTtcbiAgY29uc3QgdXNlU3F1ZWV6ZVNoYXBlID1cbiAgICAgICghaXNQYWNrZWQgJiYgcmFuayA+IDEgJiYgIXV0aWwuYXJyYXlzRXF1YWwoc2hhcGUsIHRleFNoYXBlKSAmJlxuICAgICAgIG5ld1NoYXBlLmxlbmd0aCA8IHJhbmspIHx8XG4gICAgICB1c2VTcXVlZXplUGFja2VkU2hhcGU7XG4gIGNvbnN0IHVuaWZvcm1TaGFwZSA9IHVzZVNxdWVlemVTaGFwZSA/IHNxdWVlemVTaGFwZSA6IHNoYXBlO1xuICByZXR1cm4ge3VzZVNxdWVlemVTaGFwZSwgdW5pZm9ybVNoYXBlLCBrZXB0RGltc307XG59XG5cbi8qKiBSZXR1cm5zIGEgbmV3IGlucHV0IGluZm8gKGEgY29weSkgdGhhdCBoYXMgYSBzcXVlZXplZCBsb2dpY2FsIHNoYXBlLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNxdWVlemVJbnB1dEluZm8oXG4gICAgaW5JbmZvOiBJbnB1dEluZm8sIHNxdWVlemVkU2hhcGU6IG51bWJlcltdKTogSW5wdXRJbmZvIHtcbiAgLy8gRGVlcCBjb3B5LlxuICBjb25zdCBuZXdJbnB1dEluZm86IElucHV0SW5mbyA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoaW5JbmZvKSk7XG4gIG5ld0lucHV0SW5mby5zaGFwZUluZm8ubG9naWNhbFNoYXBlID0gc3F1ZWV6ZWRTaGFwZTtcbiAgcmV0dXJuIG5ld0lucHV0SW5mbztcbn1cblxuZnVuY3Rpb24gZ2V0U3F1ZWV6ZWRQYXJhbXMocGFyYW1zOiBzdHJpbmdbXSwga2VwdERpbXM6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgcmV0dXJuIGtlcHREaW1zLm1hcChkID0+IHBhcmFtc1tkXSkuam9pbignLCAnKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, util } from '@tensorflow/tfjs-core';\nimport * as shader_compiler from './shader_compiler';\nimport { createFragmentShader } from './webgl_util';\nexport function compileProgram(gpgpu, program, inputs, output) {\n    const inputInfos = inputs.map((input, i) => {\n        const shapeInfo = {\n            logicalShape: input.shape,\n            texShape: input.isUniform ? null : input.texData.texShape,\n            isUniform: input.isUniform,\n            isPacked: input.isUniform ? false : input.texData.isPacked,\n            flatOffset: null\n        };\n        if (input.texData != null && input.texData.slice != null &&\n            input.texData.slice.flatOffset > 0) {\n            shapeInfo.flatOffset = input.texData.slice.flatOffset;\n        }\n        return { name: program.variableNames[i], shapeInfo };\n    });\n    const inShapeInfos = inputInfos.map(x => x.shapeInfo);\n    const outShapeInfo = {\n        logicalShape: output.shape,\n        texShape: output.texData.texShape,\n        isUniform: false,\n        isPacked: output.texData.isPacked,\n        flatOffset: null\n    };\n    const source = shader_compiler.makeShader(inputInfos, outShapeInfo, program);\n    const fragmentShader = createFragmentShader(gpgpu.gl, source);\n    const webGLProgram = gpgpu.createProgram(fragmentShader);\n    if (!env().get('ENGINE_COMPILE_ONLY')) {\n        return Object.assign({ program,\n            fragmentShader,\n            source,\n            webGLProgram,\n            inShapeInfos,\n            outShapeInfo }, getUniformLocations(gpgpu, program, webGLProgram));\n    }\n    else {\n        return {\n            program,\n            fragmentShader,\n            source,\n            webGLProgram,\n            inShapeInfos,\n            outShapeInfo,\n            uniformLocations: null,\n            customUniformLocations: null,\n            infLoc: null,\n            nanLoc: null,\n            inShapesLocations: null,\n            inTexShapesLocations: null,\n            outShapeLocation: null,\n            outShapeStridesLocation: null,\n            outTexShapeLocation: null\n        };\n    }\n}\nexport function getUniformLocations(gpgpu, program, webGLProgram) {\n    const uniformLocations = {};\n    const inShapesLocations = {};\n    const inTexShapesLocations = {};\n    const customUniformLocations = [];\n    let outShapeLocation;\n    let outTexShapeLocation;\n    let outShapeStridesLocation;\n    let infLoc = null;\n    let nanLoc = null;\n    // Add special uniforms (NAN, INFINITY)\n    nanLoc = gpgpu.getUniformLocation(webGLProgram, 'NAN', false);\n    if (env().getNumber('WEBGL_VERSION') === 1) {\n        infLoc = gpgpu.getUniformLocation(webGLProgram, 'INFINITY', false);\n    }\n    // Add user-defined uniforms\n    const shouldThrow = false;\n    for (let i = 0; i < program.variableNames.length; i++) {\n        const varName = program.variableNames[i];\n        uniformLocations[varName] =\n            gpgpu.getUniformLocation(webGLProgram, varName, shouldThrow);\n        uniformLocations[`offset${varName}`] =\n            gpgpu.getUniformLocation(webGLProgram, `offset${varName}`, shouldThrow);\n        if (program.enableShapeUniforms) {\n            inShapesLocations[`${varName}Shape`] = gpgpu.getUniformLocation(webGLProgram, `${varName}Shape`, shouldThrow);\n            inTexShapesLocations[`${varName}TexShape`] = gpgpu.getUniformLocation(webGLProgram, `${varName}TexShape`, shouldThrow);\n        }\n    }\n    if (program.enableShapeUniforms) {\n        outShapeLocation =\n            gpgpu.getUniformLocation(webGLProgram, 'outShape', shouldThrow);\n        outShapeStridesLocation =\n            gpgpu.getUniformLocation(webGLProgram, 'outShapeStrides', shouldThrow);\n        outTexShapeLocation =\n            gpgpu.getUniformLocation(webGLProgram, 'outTexShape', shouldThrow);\n    }\n    if (program.customUniforms) {\n        program.customUniforms.forEach((d, i) => {\n            customUniformLocations[i] =\n                gpgpu.getUniformLocation(webGLProgram, d.name, shouldThrow);\n        });\n    }\n    return {\n        uniformLocations,\n        customUniformLocations,\n        infLoc,\n        nanLoc,\n        inShapesLocations,\n        inTexShapesLocations,\n        outShapeLocation,\n        outShapeStridesLocation,\n        outTexShapeLocation\n    };\n}\nfunction validateBinaryAndProgram(shapeInfos, inputs) {\n    if (shapeInfos.length !== inputs.length) {\n        throw Error(`Binary was compiled with ${shapeInfos.length} inputs, but ` +\n            `was executed with ${inputs.length} inputs`);\n    }\n    shapeInfos.forEach((s, i) => {\n        const shapeA = s.logicalShape;\n        const input = inputs[i];\n        const shapeB = input.shape;\n        if (!util.arraysEqual(shapeA, shapeB)) {\n            throw Error(`Binary was compiled with different shapes than ` +\n                `the current args. Shapes ${shapeA} and ${shapeB} must match`);\n        }\n        // The input is uploaded as uniform.\n        if (s.isUniform && input.isUniform) {\n            return;\n        }\n        const texShapeA = s.texShape;\n        const texShapeB = input.isUniform ? null : input.texData.texShape;\n        if (!util.arraysEqual(texShapeA, texShapeB)) {\n            throw Error(`Binary was compiled with different texture shapes than the` +\n                ` current args. Shape ${texShapeA} and ${texShapeB} must match`);\n        }\n    });\n}\nexport function runProgram(gpgpu, binary, inputs, output, customUniformValues) {\n    if (!binary.program.enableShapeUniforms) {\n        validateBinaryAndProgram(binary.inShapeInfos, inputs);\n        validateBinaryAndProgram([binary.outShapeInfo], [output]);\n    }\n    const outTex = output.texData.texture;\n    const outTexShape = output.texData.texShape;\n    if (output.texData.isPacked) {\n        gpgpu.setOutputPackedMatrixTexture(outTex.texture, outTexShape[0], outTexShape[1]);\n    }\n    else {\n        gpgpu.setOutputMatrixTexture(outTex.texture, outTexShape[0], outTexShape[1]);\n    }\n    gpgpu.setProgram(binary.webGLProgram);\n    // Set special uniforms (NAN, INFINITY)\n    if (env().getNumber('WEBGL_VERSION') === 1) {\n        if (binary.infLoc !== null) {\n            gpgpu.gl.uniform1f(binary.infLoc, Infinity);\n        }\n    }\n    if (binary.nanLoc !== null) {\n        gpgpu.gl.uniform1f(binary.nanLoc, NaN);\n    }\n    // Set user-defined inputs\n    inputs.forEach((input, i) => {\n        const varName = binary.program.variableNames[i];\n        const varLoc = binary.uniformLocations[varName];\n        const varOffsetLoc = binary.uniformLocations[`offset${varName}`];\n        const varShapeLoc = binary.inShapesLocations[`${varName}Shape`];\n        const varTexShapeLoc = binary.inTexShapesLocations[`${varName}TexShape`];\n        if (varShapeLoc) {\n            const { uniformShape } = shader_compiler.getUniformInfoFromShape(binary.program.packedInputs, input.shape, input.texData.texShape);\n            switch (uniformShape.length) {\n                case 1:\n                    gpgpu.gl.uniform1iv(varShapeLoc, new Int32Array(uniformShape));\n                    break;\n                case 2:\n                    gpgpu.gl.uniform2iv(varShapeLoc, new Int32Array(uniformShape));\n                    break;\n                case 3:\n                    gpgpu.gl.uniform3iv(varShapeLoc, new Int32Array(uniformShape));\n                    break;\n                case 4:\n                    gpgpu.gl.uniform4iv(varShapeLoc, new Int32Array(uniformShape));\n                    break;\n                default:\n                    break;\n            }\n        }\n        if (varTexShapeLoc) {\n            gpgpu.gl.uniform2i(varTexShapeLoc, input.texData.texShape[0], input.texData.texShape[1]);\n        }\n        if (varLoc == null) {\n            // The compiler inferred that this variable is not used in this shader.\n            return;\n        }\n        if (input.isUniform) {\n            // Upload the values of the tensor as uniform.\n            if (util.sizeFromShape(input.shape) < 2) {\n                gpgpu.gl.uniform1f(varLoc, input.uniformValues[0]);\n            }\n            else {\n                let vals = input.uniformValues;\n                if (!(vals instanceof Float32Array)) {\n                    vals = new Float32Array(vals);\n                }\n                gpgpu.gl.uniform1fv(varLoc, vals);\n            }\n            return;\n        }\n        // If the input was sliced, upload the flat offset index.\n        if (input.texData.slice != null && varOffsetLoc != null) {\n            gpgpu.gl.uniform1i(varOffsetLoc, input.texData.slice.flatOffset);\n        }\n        gpgpu.setInputMatrixTexture(input.texData.texture.texture, varLoc, i);\n    });\n    const outShapeLoc = binary.outShapeLocation;\n    if (outShapeLoc) {\n        switch (output.shape.length) {\n            case 1:\n                gpgpu.gl.uniform1iv(outShapeLoc, new Int32Array(output.shape));\n                break;\n            case 2:\n                gpgpu.gl.uniform2iv(outShapeLoc, new Int32Array(output.shape));\n                break;\n            case 3:\n                gpgpu.gl.uniform3iv(outShapeLoc, new Int32Array(output.shape));\n                break;\n            case 4:\n                gpgpu.gl.uniform4iv(outShapeLoc, new Int32Array(output.shape));\n                break;\n            default:\n                break;\n        }\n    }\n    if (binary.outShapeStridesLocation) {\n        const strides = util.computeStrides(output.shape);\n        switch (output.shape.length) {\n            case 2:\n                gpgpu.gl.uniform1iv(binary.outShapeStridesLocation, new Int32Array(strides));\n                break;\n            case 3:\n                gpgpu.gl.uniform2iv(binary.outShapeStridesLocation, new Int32Array(strides));\n                break;\n            case 4:\n                gpgpu.gl.uniform3iv(binary.outShapeStridesLocation, new Int32Array(strides));\n                break;\n            default:\n                break;\n        }\n    }\n    if (binary.outTexShapeLocation) {\n        gpgpu.gl.uniform2i(binary.outTexShapeLocation, output.texData.texShape[0], output.texData.texShape[1]);\n    }\n    if (binary.program.customUniforms && customUniformValues) {\n        binary.program.customUniforms.forEach((d, i) => {\n            const customLoc = binary.customUniformLocations[i];\n            const customValue = customUniformValues[i];\n            if (d.type === 'float') {\n                gpgpu.gl.uniform1fv(customLoc, customValue);\n            }\n            else if (d.type === 'vec2') {\n                gpgpu.gl.uniform2fv(customLoc, customValue);\n            }\n            else if (d.type === 'vec3') {\n                gpgpu.gl.uniform3fv(customLoc, customValue);\n            }\n            else if (d.type === 'vec4') {\n                gpgpu.gl.uniform4fv(customLoc, customValue);\n            }\n            else if (d.type === 'int') {\n                gpgpu.gl.uniform1iv(customLoc, customValue);\n            }\n            else if (d.type === 'ivec2') {\n                gpgpu.gl.uniform2iv(customLoc, customValue);\n            }\n            else if (d.type === 'ivec3') {\n                gpgpu.gl.uniform3iv(customLoc, customValue);\n            }\n            else if (d.type === 'ivec4') {\n                gpgpu.gl.uniform4iv(customLoc, customValue);\n            }\n            else {\n                throw Error(`uniform type ${d.type} is not supported yet.`);\n            }\n        });\n    }\n    gpgpu.executeProgram();\n}\nexport function makeShaderKey(program, inputs, output) {\n    let keyInputs = '';\n    inputs.concat(output).forEach(x => {\n        const hasOffset = x.texData != null && x.texData.slice != null &&\n            x.texData.slice.flatOffset > 0;\n        // TODO: Remove the condition of !x.isUniform.\n        if (program.enableShapeUniforms && !x.isUniform) {\n            const xTexShape = x.texData.texShape;\n            const { useSqueezeShape, uniformShape, keptDims } = shader_compiler.getUniformInfoFromShape(program.packedInputs, x.shape, xTexShape);\n            let rank1 = '', rank2 = '', rank34 = '';\n            if (uniformShape.length === 1 && program.packedInputs) {\n                const packedTexShape = [Math.ceil(xTexShape[0] / 2), Math.ceil(xTexShape[1] / 2)];\n                rank1 = `${packedTexShape[0] > 1}_${packedTexShape[1] > 1}`;\n            }\n            else if (uniformShape.length === 2 && !program.packedInputs) {\n                rank2 = `${uniformShape[0] > 1}_${uniformShape[1] > 1}`;\n            }\n            else if (uniformShape.length > 2 && !program.packedInputs) {\n                const strides = util.computeStrides(uniformShape);\n                rank34 = `${strides[0] === xTexShape[1]}_${strides[strides.length - 1] === xTexShape[1]}`;\n            }\n            const xRank = x.shape.length;\n            const isLogicalShapTexShapeEqual = uniformShape.length === 2 && util.arraysEqual(x.shape, xTexShape);\n            const isScalar = util.sizeFromShape(x.shape) === 1;\n            const broadcastDims = backend_util.getBroadcastDims(x.shape, output.shape);\n            const isInOutTexShapeEqual = !program.packedInputs &&\n                xRank === output.shape.length &&\n                util.arraysEqual(xTexShape, output.texData.texShape);\n            const isTexShapeGreaterThanOne = program.packedInputs || uniformShape.length > 2 ?\n                '' :\n                `${xTexShape[0] > 1}_${xTexShape[1] > 1}`;\n            // These key components are needed due to shader_compiler is embedding\n            // them in the shader.\n            // |xRank| is used to determine the coords length. See\n            // get[Packed]SamplerAtOutputCoords.\n            // |isInOutTexShapeEqual| is used to determine whether going to an\n            // optimization path in getSamplerAtOutputCoords.\n            // |useSqueezeShape| is extracted from squeezeInputInfo of\n            // getSampler[2|3|4]D/getPackedSampler3D.\n            // |isScalar| is extracted from isInputScalar/isOutputScalar in\n            // getPackedSamplerAtOutputCoords.\n            // |broadcastDims| is extracted from get[Packed]SamplerAtOutputCoords.\n            // |isLogicalShapTexShapeEqual| is used in\n            // getOutput[Packed]2DCoords/get[Packed]Sampler2D.\n            // |rank1| is used in getOutputPacked1DCoords.\n            // |rank2| is used in getOutput2DCoords.\n            // |rank34| is used in getSampler3D/getSampler4D.\n            // |isTexShapeGreaterThanOne| are used in\n            // getSampler[Scalar|1D|2D]/getOutput1DCoords.\n            keyInputs += `${xRank}_${isInOutTexShapeEqual}_${useSqueezeShape ? keptDims : ''}_${uniformShape.length}_${isScalar}_${broadcastDims}_${isLogicalShapTexShapeEqual}_${rank1}_${rank2}_${rank34}_${isTexShapeGreaterThanOne}_${hasOffset}`;\n        }\n        else {\n            const texShape = x.isUniform ? 'uniform' : x.texData.texShape;\n            keyInputs += `${x.shape}_${texShape}_${hasOffset}`;\n        }\n    });\n    const keyUserCode = program.userCode;\n    let key = program.constructor.name;\n    // Fast string concat. See https://jsperf.com/string-concatenation/14.\n    key += '_' + keyInputs + '_' + keyUserCode +\n        `${env().getNumber('WEBGL_VERSION')}`;\n    return key;\n}\nexport function useShapeUniforms(rank) {\n    // TODO: Remove the limitaion of rank <= 4.\n    return env().getBool('WEBGL_USE_SHAPES_UNIFORMS') && rank <= 4;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3BncHVfbWF0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ3BncHVfbWF0aC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBc0IsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbEYsT0FBTyxLQUFLLGVBQWUsTUFBTSxtQkFBbUIsQ0FBQztBQUdyRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxjQUFjLENBQUM7QUErRGxELE1BQU0sVUFBVSxjQUFjLENBQzFCLEtBQW1CLEVBQUUsT0FBcUIsRUFBRSxNQUFvQixFQUNoRSxNQUFrQjtJQUNwQixNQUFNLFVBQVUsR0FBZ0IsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0RCxNQUFNLFNBQVMsR0FBYztZQUMzQixZQUFZLEVBQUUsS0FBSyxDQUFDLEtBQUs7WUFDekIsUUFBUSxFQUFFLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQ3pELFNBQVMsRUFBRSxLQUFLLENBQUMsU0FBUztZQUMxQixRQUFRLEVBQUUsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVE7WUFDMUQsVUFBVSxFQUFFLElBQUk7U0FDakIsQ0FBQztRQUNGLElBQUksS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksSUFBSTtZQUNwRCxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQ3RDLFNBQVMsQ0FBQyxVQUFVLEdB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QUFJLG9CQUFvQixJQUN6QyxlQUFlLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLFlBQVksQ0FBQyxNQUFNLElBQUksUUFBUSxJQUNsRSxhQUFhLElBQUksMEJBQTBCLElBQUksS0FBSyxJQUFJLEtBQUssSUFDN0QsTUFBTSxJQUFJLHdCQUF3QixJQUFJLFNBQVMsRUFBRSxDQUFDO1NBQ3ZEO2FBQU07WUFDTCxNQUFNLFFBQVEsR0FBRyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBQzlELFNBQVMsSUFBSSxHQUFHLENBQUMsQ0FBQyxLQUFLLElBQUksUUFBUSxJQUFJLFNBQVMsRUFBRSxDQUFDO1NBQ3BEO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO0lBQ3JDLElBQUksR0FBRyxHQUFHLE9BQU8sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO0lBQ25DLHNFQUFzRTtJQUN0RSxHQUFHLElBQUksR0FBRyxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsV0FBVztRQUN0QyxHQUFHLEdBQUcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxlQUFlLENBQUMsRUFBRSxDQUFDO0lBQzFDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQyxJQUFZO0lBQzNDLDJDQUEyQztJQUMzQyxPQUFPLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDLENBQUM7QUFDakUsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGVudiwgVGVuc29yLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVQ29udGV4dH0gZnJvbSAnLi9ncGdwdV9jb250ZXh0JztcbmltcG9ydCAqIGFzIHNoYWRlcl9jb21waWxlciBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5pbXBvcnQge0lucHV0SW5mbywgU2hhcGVJbmZvLCBVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuaW1wb3J0IHtQYWNraW5nU2NoZW1lLCBUZXh0dXJlRGF0YSwgVGV4dHVyZVVzYWdlfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7Y3JlYXRlRnJhZ21lbnRTaGFkZXJ9IGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3Jtcz86IGJvb2xlYW47XG4gIC8qKiBJZiB0cnVlLCB0aGlzIHByb2dyYW0gZXhwZWN0cyBwYWNrZWQgaW5wdXQgdGV4dHVyZXMuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwYWNrZWRJbnB1dHM/OiBib29sZWFuO1xuICAvKiogSWYgdHJ1ZSwgdGhpcyBwcm9ncmFtIHByb2R1Y2VzIGEgcGFja2VkIHRleHR1cmUuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBwYWNrZWRPdXRwdXQ/OiBib29sZWFuO1xuICAvKipcbiAgICogQWZmZWN0cyB3aGF0IHR5cGUgb2YgdGV4dHVyZSB3ZSBhbGxvY2F0ZSBmb3IgdGhlIG91dHB1dC4gRGVmYXVsdHMgdG9cbiAgICogYFRleHR1cmVVc2FnZS5SRU5ERVJgLlxuICAgKi9cbiAgb3V0VGV4VXNhZ2U/OiBUZXh0dXJlVXNhZ2U7XG4gIC8qKlxuICAgKiBUaGUgdHlwZSBvZiBzY2hlbWUgdG8gdXNlIHdoZW4gcGFja2luZyB0ZXhlbHMgZm9yIHRoZSBvdXRwdXQgdmFsdWVzLlxuICAgKiBTZWUgYFBhY2tpbmdTY2hlbWVgIGZvciBkZXRhaWxzLiBEZWZhdWx0cyB0byBgUGFja2luZ1NjaGVtZS5TSEFSRURfQkFUQ0hgLlxuICAgKi9cbiAgb3V0UGFja2luZ1NjaGVtZT86IFBhY2tpbmdTY2hlbWU7XG4gIGN1c3RvbVVuaWZvcm1zPzpcbiAgICAgIEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg/OiBudW1iZXI7IHR5cGU6IFVuaWZvcm1UeXBlO30+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdQR1BVQmluYXJ5IHtcbiAgd2ViR0xQcm9ncmFtOiBXZWJHTFByb2dyYW07XG4gIHByb2dyYW06IEdQR1BVUHJvZ3JhbTtcbiAgdW5pZm9ybUxvY2F0aW9uczoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbltdO1xuICBzb3VyY2U6IHN0cmluZztcbiAgZnJhZ21lbnRTaGFkZXI6IFdlYkdMU2hhZGVyO1xuICBpblNoYXBlSW5mb3M6IFNoYXBlSW5mb1tdO1xuICBvdXRTaGFwZUluZm86IFNoYXBlSW5mbztcbiAgaW5mTG9jOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgbmFuTG9jOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgaW5TaGFwZXNMb2NhdGlvbnM/OiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufTtcbiAgaW5UZXhTaGFwZXNMb2NhdGlvbnM/OiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufTtcbiAgb3V0U2hhcGVMb2NhdGlvbj86IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbj86IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBvdXRUZXhTaGFwZUxvY2F0aW9uPzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR1BHUFVCaW5hcnlMb2NhdGlvbnMge1xuICB1bmlmb3JtTG9jYXRpb25zOiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufTtcbiAgY3VzdG9tVW5pZm9ybUxvY2F0aW9ucz86IFdlYkdMVW5pZm9ybUxvY2F0aW9uW107XG4gIGluZkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIG5hbkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIGluU2hhcGVzTG9jYXRpb25zPzoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIGluVGV4U2hhcGVzTG9jYXRpb25zPzoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn07XG4gIG91dFNoYXBlTG9jYXRpb24/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb24/OiBXZWJHTFVuaWZvcm1Mb2NhdGlvbjtcbiAgb3V0VGV4U2hhcGVMb2NhdGlvbj86IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRlbnNvckRhdGEge1xuICBzaGFwZTogbnVtYmVyW107XG4gIHRleERhdGE6IFRleHR1cmVEYXRhO1xuICBpc1VuaWZvcm06IGJvb2xlYW47XG4gIC8vIEF2YWlsYWJsZSB3aGVuIHdlIGRlY2lkZSB0byB1cGxvYWQgYXMgdW5pZm9ybSBpbnN0ZWFkIG9mIHRleHR1cmUuXG4gIHVuaWZvcm1WYWx1ZXM/OiBUeXBlZEFycmF5O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZVByb2dyYW08VCBleHRlbmRzIFRlbnNvciwgSyBleHRlbmRzIFRlbnNvcj4oXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckRhdGFbXSxcbiAgICBvdXRwdXQ6IFRlbnNvckRhdGEpOiBHUEdQVUJpbmFyeSB7XG4gIGNvbnN0IGlucHV0SW5mb3M6IElucHV0SW5mb1tdID0gaW5wdXRzLm1hcCgoaW5wdXQsIGkpID0+IHtcbiAgICBjb25zdCBzaGFwZUluZm86IFNoYXBlSW5mbyA9IHtcbiAgICAgIGxvZ2ljYWxTaGFwZTogaW5wdXQuc2hhcGUsXG4gICAgICB0ZXhTaGFwZTogaW5wdXQuaXNVbmlmb3JtID8gbnVsbCA6IGlucHV0LnRleERhdGEudGV4U2hhcGUsXG4gICAgICBpc1VuaWZvcm06IGlucHV0LmlzVW5pZm9ybSxcbiAgICAgIGlzUGFja2VkOiBpbnB1dC5pc1VuaWZvcm0gPyBmYWxzZSA6IGlucHV0LnRleERhdGEuaXNQYWNrZWQsXG4gICAgICBmbGF0T2Zmc2V0OiBudWxsXG4gICAgfTtcbiAgICBpZiAoaW5wdXQudGV4RGF0YSAhPSBudWxsICYmIGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJlxuICAgICAgICBpbnB1dC50ZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQgPiAwKSB7XG4gICAgICBzaGFwZUluZm8uZmxhdE9mZnNldCA9IGlucHV0LnRleERhdGEuc2xpY2UuZmxhdE9mZnNldDtcbiAgICB9XG4gICAgcmV0dXJuIHtuYW1lOiBwcm9ncmFtLnZhcmlhYmxlTmFtZXNbaV0sIHNoYXBlSW5mb307XG4gIH0pO1xuICBjb25zdCBpblNoYXBlSW5mb3MgPSBpbnB1dEluZm9zLm1hcCh4ID0+IHguc2hhcGVJbmZvKTtcbiAgY29uc3Qgb3V0U2hhcGVJbmZvOiBTaGFwZUluZm8gPSB7XG4gICAgbG9naWNhbFNoYXBlOiBvdXRwdXQuc2hhcGUsXG4gICAgdGV4U2hhcGU6IG91dHB1dC50ZXhEYXRhLnRleFNoYXBlLFxuICAgIGlzVW5pZm9ybTogZmFsc2UsXG4gICAgaXNQYWNrZWQ6IG91dHB1dC50ZXhEYXRhLmlzUGFja2VkLFxuICAgIGZsYXRPZmZzZXQ6IG51bGxcbiAgfTtcbiAgY29uc3Qgc291cmNlID0gc2hhZGVyX2NvbXBpbGVyLm1ha2VTaGFkZXIoaW5wdXRJbmZvcywgb3V0U2hhcGVJbmZvLCBwcm9ncmFtKTtcbiAgY29uc3QgZnJhZ21lbnRTaGFkZXIgPSBjcmVhdGVGcmFnbWVudFNoYWRlcihncGdwdS5nbCwgc291cmNlKTtcbiAgY29uc3Qgd2ViR0xQcm9ncmFtID0gZ3BncHUuY3JlYXRlUHJvZ3JhbShmcmFnbWVudFNoYWRlcik7XG5cbiAgaWYgKCFlbnYoKS5nZXQoJ0VOR0lORV9DT01QSUxFX09OTFknKSkge1xuICAgIHJldHVybiB7XG4gICAgICBwcm9ncmFtLFxuICAgICAgZnJhZ21lbnRTaGFkZXIsXG4gICAgICBzb3VyY2UsXG4gICAgICB3ZWJHTFByb2dyYW0sXG4gICAgICBpblNoYXBlSW5mb3MsXG4gICAgICBvdXRTaGFwZUluZm8sXG4gICAgICAuLi5nZXRVbmlmb3JtTG9jYXRpb25zKGdwZ3B1LCBwcm9ncmFtLCB3ZWJHTFByb2dyYW0pXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4ge1xuICAgICAgcHJvZ3JhbSxcbiAgICAgIGZyYWdtZW50U2hhZGVyLFxuICAgICAgc291cmNlLFxuICAgICAgd2ViR0xQcm9ncmFtLFxuICAgICAgaW5TaGFwZUluZm9zLFxuICAgICAgb3V0U2hhcGVJbmZvLFxuICAgICAgdW5pZm9ybUxvY2F0aW9uczogbnVsbCxcbiAgICAgIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM6IG51bGwsXG4gICAgICBpbmZMb2M6IG51bGwsXG4gICAgICBuYW5Mb2M6IG51bGwsXG4gICAgICBpblNoYXBlc0xvY2F0aW9uczogbnVsbCxcbiAgICAgIGluVGV4U2hhcGVzTG9jYXRpb25zOiBudWxsLFxuICAgICAgb3V0U2hhcGVMb2NhdGlvbjogbnVsbCxcbiAgICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uOiBudWxsLFxuICAgICAgb3V0VGV4U2hhcGVMb2NhdGlvbjogbnVsbFxuICAgIH07XG4gIH1cbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFVuaWZvcm1Mb2NhdGlvbnMoXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLFxuICAgIHdlYkdMUHJvZ3JhbTogV2ViR0xQcm9ncmFtKTogR1BHUFVCaW5hcnlMb2NhdGlvbnMge1xuICBjb25zdCB1bmlmb3JtTG9jYXRpb25zOiB7W25hbWU6IHN0cmluZ106IFdlYkdMVW5pZm9ybUxvY2F0aW9ufSA9IHt9O1xuICBjb25zdCBpblNoYXBlc0xvY2F0aW9uczoge1tuYW1lOiBzdHJpbmddOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbn0gPSB7fTtcbiAgY29uc3QgaW5UZXhTaGFwZXNMb2NhdGlvbnM6IHtbbmFtZTogc3RyaW5nXTogV2ViR0xVbmlmb3JtTG9jYXRpb259ID0ge307XG4gIGNvbnN0IGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnM6IFdlYkdMVW5pZm9ybUxvY2F0aW9uW10gPSBbXTtcbiAgbGV0IG91dFNoYXBlTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uO1xuICBsZXQgb3V0VGV4U2hhcGVMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIGxldCBvdXRTaGFwZVN0cmlkZXNMb2NhdGlvbjogV2ViR0xVbmlmb3JtTG9jYXRpb247XG4gIGxldCBpbmZMb2M6IFdlYkdMVW5pZm9ybUxvY2F0aW9uID0gbnVsbDtcbiAgbGV0IG5hbkxvYzogV2ViR0xVbmlmb3JtTG9jYXRpb24gPSBudWxsO1xuXG4gIC8vIEFkZCBzcGVjaWFsIHVuaWZvcm1zIChOQU4sIElORklOSVRZKVxuICBuYW5Mb2MgPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnTkFOJywgZmFsc2UpO1xuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICBpbmZMb2MgPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24od2ViR0xQcm9ncmFtLCAnSU5GSU5JVFknLCBmYWxzZSk7XG4gIH1cblxuICAvLyBBZGQgdXNlci1kZWZpbmVkIHVuaWZvcm1zXG4gIGNvbnN0IHNob3VsZFRocm93ID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvZ3JhbS52YXJpYWJsZU5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgdmFyTmFtZSA9IHByb2dyYW0udmFyaWFibGVOYW1lc1tpXTtcbiAgICB1bmlmb3JtTG9jYXRpb25zW3Zhck5hbWVdID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgdmFyTmFtZSwgc2hvdWxkVGhyb3cpO1xuICAgIHVuaWZvcm1Mb2NhdGlvbnNbYG9mZnNldCR7dmFyTmFtZX1gXSA9XG4gICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGBvZmZzZXQke3Zhck5hbWV9YCwgc2hvdWxkVGhyb3cpO1xuICAgIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICAgIGluU2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9U2hhcGVgXSA9IGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgICB3ZWJHTFByb2dyYW0sIGAke3Zhck5hbWV9U2hhcGVgLCBzaG91bGRUaHJvdyk7XG4gICAgICBpblRleFNoYXBlc0xvY2F0aW9uc1tgJHt2YXJOYW1lfVRleFNoYXBlYF0gPSBncGdwdS5nZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICAgICAgd2ViR0xQcm9ncmFtLCBgJHt2YXJOYW1lfVRleFNoYXBlYCwgc2hvdWxkVGhyb3cpO1xuICAgIH1cbiAgfVxuXG4gIGlmIChwcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICBvdXRTaGFwZUxvY2F0aW9uID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ291dFNoYXBlJywgc2hvdWxkVGhyb3cpO1xuICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ291dFNoYXBlU3RyaWRlcycsIHNob3VsZFRocm93KTtcbiAgICBvdXRUZXhTaGFwZUxvY2F0aW9uID1cbiAgICAgICAgZ3BncHUuZ2V0VW5pZm9ybUxvY2F0aW9uKHdlYkdMUHJvZ3JhbSwgJ291dFRleFNoYXBlJywgc2hvdWxkVGhyb3cpO1xuICB9XG5cbiAgaWYgKHByb2dyYW0uY3VzdG9tVW5pZm9ybXMpIHtcbiAgICBwcm9ncmFtLmN1c3RvbVVuaWZvcm1zLmZvckVhY2goKGQsIGkpID0+IHtcbiAgICAgIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnNbaV0gPVxuICAgICAgICAgIGdwZ3B1LmdldFVuaWZvcm1Mb2NhdGlvbih3ZWJHTFByb2dyYW0sIGQubmFtZSwgc2hvdWxkVGhyb3cpO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB1bmlmb3JtTG9jYXRpb25zLFxuICAgIGN1c3RvbVVuaWZvcm1Mb2NhdGlvbnMsXG4gICAgaW5mTG9jLFxuICAgIG5hbkxvYyxcbiAgICBpblNoYXBlc0xvY2F0aW9ucyxcbiAgICBpblRleFNoYXBlc0xvY2F0aW9ucyxcbiAgICBvdXRTaGFwZUxvY2F0aW9uLFxuICAgIG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uLFxuICAgIG91dFRleFNoYXBlTG9jYXRpb25cbiAgfTtcbn1cblxuZnVuY3Rpb24gdmFsaWRhdGVCaW5hcnlBbmRQcm9ncmFtKFxuICAgIHNoYXBlSW5mb3M6IFNoYXBlSW5mb1tdLCBpbnB1dHM6IFRlbnNvckRhdGFbXSkge1xuICBpZiAoc2hhcGVJbmZvcy5sZW5ndGggIT09IGlucHV0cy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEJpbmFyeSB3YXMgY29tcGlsZWQgd2l0aCAke3NoYXBlSW5mb3MubGVuZ3RofSBpbnB1dHMsIGJ1dCBgICtcbiAgICAgICAgYHdhcyBleGVjdXRlZCB3aXRoICR7aW5wdXRzLmxlbmd0aH0gaW5wdXRzYCk7XG4gIH1cblxuICBzaGFwZUluZm9zLmZvckVhY2goKHMsIGkpID0+IHtcbiAgICBjb25zdCBzaGFwZUEgPSBzLmxvZ2ljYWxTaGFwZTtcbiAgICBjb25zdCBpbnB1dCA9IGlucHV0c1tpXTtcbiAgICBjb25zdCBzaGFwZUIgPSBpbnB1dC5zaGFwZTtcblxuICAgIGlmICghdXRpbC5hcnJheXNFcXVhbChzaGFwZUEsIHNoYXBlQikpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBCaW5hcnkgd2FzIGNvbXBpbGVkIHdpdGggZGlmZmVyZW50IHNoYXBlcyB0aGFuIGAgK1xuICAgICAgICAgIGB0aGUgY3VycmVudCBhcmdzLiBTaGFwZXMgJHtzaGFwZUF9IGFuZCAke3NoYXBlQn0gbXVzdCBtYXRjaGApO1xuICAgIH1cbiAgICAvLyBUaGUgaW5wdXQgaXMgdXBsb2FkZWQgYXMgdW5pZm9ybS5cbiAgICBpZiAocy5pc1VuaWZvcm0gJiYgaW5wdXQuaXNVbmlmb3JtKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgdGV4U2hhcGVBID0gcy50ZXhTaGFwZTtcbiAgICBjb25zdCB0ZXhTaGFwZUIgPSBpbnB1dC5pc1VuaWZvcm0gPyBudWxsIDogaW5wdXQudGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAoIXV0aWwuYXJyYXlzRXF1YWwodGV4U2hhcGVBLCB0ZXhTaGFwZUIpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQmluYXJ5IHdhcyBjb21waWxlZCB3aXRoIGRpZmZlcmVudCB0ZXh0dXJlIHNoYXBlcyB0aGFuIHRoZWAgK1xuICAgICAgICAgIGAgY3VycmVudCBhcmdzLiBTaGFwZSAke3RleFNoYXBlQX0gYW5kICR7dGV4U2hhcGVCfSBtdXN0IG1hdGNoYCk7XG4gICAgfVxuICB9KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJ1blByb2dyYW08VCBleHRlbmRzIFRlbnNvciwgSyBleHRlbmRzIFRlbnNvcj4oXG4gICAgZ3BncHU6IEdQR1BVQ29udGV4dCwgYmluYXJ5OiBHUEdQVUJpbmFyeSwgaW5wdXRzOiBUZW5zb3JEYXRhW10sXG4gICAgb3V0cHV0OiBUZW5zb3JEYXRhLCBjdXN0b21Vbmlmb3JtVmFsdWVzPzogbnVtYmVyW11bXSk6IHZvaWQge1xuICBpZiAoIWJpbmFyeS5wcm9ncmFtLmVuYWJsZVNoYXBlVW5pZm9ybXMpIHtcbiAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oYmluYXJ5LmluU2hhcGVJbmZvcywgaW5wdXRzKTtcbiAgICB2YWxpZGF0ZUJpbmFyeUFuZFByb2dyYW0oW2JpbmFyeS5vdXRTaGFwZUluZm9dLCBbb3V0cHV0XSk7XG4gIH1cblxuICBjb25zdCBvdXRUZXggPSBvdXRwdXQudGV4RGF0YS50ZXh0dXJlO1xuICBjb25zdCBvdXRUZXhTaGFwZSA9IG91dHB1dC50ZXhEYXRhLnRleFNoYXBlO1xuICBpZiAob3V0cHV0LnRleERhdGEuaXNQYWNrZWQpIHtcbiAgICBncGdwdS5zZXRPdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgICAgICBvdXRUZXgudGV4dHVyZSwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgfSBlbHNlIHtcbiAgICBncGdwdS5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlKFxuICAgICAgICBvdXRUZXgudGV4dHVyZSwgb3V0VGV4U2hhcGVbMF0sIG91dFRleFNoYXBlWzFdKTtcbiAgfVxuICBncGdwdS5zZXRQcm9ncmFtKGJpbmFyeS53ZWJHTFByb2dyYW0pO1xuXG4gIC8vIFNldCBzcGVjaWFsIHVuaWZvcm1zIChOQU4sIElORklOSVRZKVxuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICBpZiAoYmluYXJ5LmluZkxvYyAhPT0gbnVsbCkge1xuICAgICAgZ3BncHUuZ2wudW5pZm9ybTFmKGJpbmFyeS5pbmZMb2MsIEluZmluaXR5KTtcbiAgICB9XG4gIH1cbiAgaWYgKGJpbmFyeS5uYW5Mb2MgIT09IG51bGwpIHtcbiAgICBncGdwdS5nbC51bmlmb3JtMWYoYmluYXJ5Lm5hbkxvYywgTmFOKTtcbiAgfVxuXG4gIC8vIFNldCB1c2VyLWRlZmluZWQgaW5wdXRzXG4gIGlucHV0cy5mb3JFYWNoKChpbnB1dCwgaSkgPT4ge1xuICAgIGNvbnN0IHZhck5hbWUgPSBiaW5hcnkucHJvZ3JhbS52YXJpYWJsZU5hbWVzW2ldO1xuICAgIGNvbnN0IHZhckxvYyA9IGJpbmFyeS51bmlmb3JtTG9jYXRpb25zW3Zhck5hbWVdO1xuICAgIGNvbnN0IHZhck9mZnNldExvYyA9IGJpbmFyeS51bmlmb3JtTG9jYXRpb25zW2BvZmZzZXQke3Zhck5hbWV9YF07XG4gICAgY29uc3QgdmFyU2hhcGVMb2MgPSBiaW5hcnkuaW5TaGFwZXNMb2NhdGlvbnNbYCR7dmFyTmFtZX1TaGFwZWBdO1xuICAgIGNvbnN0IHZhclRleFNoYXBlTG9jID0gYmluYXJ5LmluVGV4U2hhcGVzTG9jYXRpb25zW2Ake3Zhck5hbWV9VGV4U2hhcGVgXTtcblxuICAgIGlmICh2YXJTaGFwZUxvYykge1xuICAgICAgY29uc3Qge3VuaWZvcm1TaGFwZX0gPSBzaGFkZXJfY29tcGlsZXIuZ2V0VW5pZm9ybUluZm9Gcm9tU2hhcGUoXG4gICAgICAgICAgYmluYXJ5LnByb2dyYW0ucGFja2VkSW5wdXRzLCBpbnB1dC5zaGFwZSwgaW5wdXQudGV4RGF0YS50ZXhTaGFwZSk7XG4gICAgICBzd2l0Y2ggKHVuaWZvcm1TaGFwZS5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYodmFyU2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KHVuaWZvcm1TaGFwZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTJpdih2YXJTaGFwZUxvYywgbmV3IEludDMyQXJyYXkodW5pZm9ybVNoYXBlKSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KHZhclNoYXBlTG9jLCBuZXcgSW50MzJBcnJheSh1bmlmb3JtU2hhcGUpKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00aXYodmFyU2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KHVuaWZvcm1TaGFwZSkpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAodmFyVGV4U2hhcGVMb2MpIHtcbiAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaShcbiAgICAgICAgICB2YXJUZXhTaGFwZUxvYywgaW5wdXQudGV4RGF0YS50ZXhTaGFwZVswXSwgaW5wdXQudGV4RGF0YS50ZXhTaGFwZVsxXSk7XG4gICAgfVxuXG4gICAgaWYgKHZhckxvYyA9PSBudWxsKSB7XG4gICAgICAvLyBUaGUgY29tcGlsZXIgaW5mZXJyZWQgdGhhdCB0aGlzIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGluIHRoaXMgc2hhZGVyLlxuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChpbnB1dC5pc1VuaWZvcm0pIHtcbiAgICAgIC8vIFVwbG9hZCB0aGUgdmFsdWVzIG9mIHRoZSB0ZW5zb3IgYXMgdW5pZm9ybS5cbiAgICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpIDwgMikge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWYodmFyTG9jLCBpbnB1dC51bmlmb3JtVmFsdWVzWzBdKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCB2YWxzID0gaW5wdXQudW5pZm9ybVZhbHVlcztcbiAgICAgICAgaWYgKCEodmFscyBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSkpIHtcbiAgICAgICAgICB2YWxzID0gbmV3IEZsb2F0MzJBcnJheSh2YWxzKTtcbiAgICAgICAgfVxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWZ2KHZhckxvYywgdmFscyk7XG4gICAgICB9XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gSWYgdGhlIGlucHV0IHdhcyBzbGljZWQsIHVwbG9hZCB0aGUgZmxhdCBvZmZzZXQgaW5kZXguXG4gICAgaWYgKGlucHV0LnRleERhdGEuc2xpY2UgIT0gbnVsbCAmJiB2YXJPZmZzZXRMb2MgIT0gbnVsbCkge1xuICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpKHZhck9mZnNldExvYywgaW5wdXQudGV4RGF0YS5zbGljZS5mbGF0T2Zmc2V0KTtcbiAgICB9XG5cbiAgICBncGdwdS5zZXRJbnB1dE1hdHJpeFRleHR1cmUoaW5wdXQudGV4RGF0YS50ZXh0dXJlLnRleHR1cmUsIHZhckxvYywgaSk7XG4gIH0pO1xuXG4gIGNvbnN0IG91dFNoYXBlTG9jID0gYmluYXJ5Lm91dFNoYXBlTG9jYXRpb247XG4gIGlmIChvdXRTaGFwZUxvYykge1xuICAgIHN3aXRjaCAob3V0cHV0LnNoYXBlLmxlbmd0aCkge1xuICAgICAgY2FzZSAxOlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtMWl2KG91dFNoYXBlTG9jLCBuZXcgSW50MzJBcnJheShvdXRwdXQuc2hhcGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaXYob3V0U2hhcGVMb2MsIG5ldyBJbnQzMkFycmF5KG91dHB1dC5zaGFwZSkpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTNpdihvdXRTaGFwZUxvYywgbmV3IEludDMyQXJyYXkob3V0cHV0LnNoYXBlKSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSA0OlxuICAgICAgICBncGdwdS5nbC51bmlmb3JtNGl2KG91dFNoYXBlTG9jLCBuZXcgSW50MzJBcnJheShvdXRwdXQuc2hhcGUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGJpbmFyeS5vdXRTaGFwZVN0cmlkZXNMb2NhdGlvbikge1xuICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKG91dHB1dC5zaGFwZSk7XG4gICAgc3dpdGNoIChvdXRwdXQuc2hhcGUubGVuZ3RoKSB7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xaXYoXG4gICAgICAgICAgICBiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sIG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaXYoXG4gICAgICAgICAgICBiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sIG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDQ6XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0zaXYoXG4gICAgICAgICAgICBiaW5hcnkub3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sIG5ldyBJbnQzMkFycmF5KHN0cmlkZXMpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgaWYgKGJpbmFyeS5vdXRUZXhTaGFwZUxvY2F0aW9uKSB7XG4gICAgZ3BncHUuZ2wudW5pZm9ybTJpKFxuICAgICAgICBiaW5hcnkub3V0VGV4U2hhcGVMb2NhdGlvbiwgb3V0cHV0LnRleERhdGEudGV4U2hhcGVbMF0sXG4gICAgICAgIG91dHB1dC50ZXhEYXRhLnRleFNoYXBlWzFdKTtcbiAgfVxuXG4gIGlmIChiaW5hcnkucHJvZ3JhbS5jdXN0b21Vbmlmb3JtcyAmJiBjdXN0b21Vbmlmb3JtVmFsdWVzKSB7XG4gICAgYmluYXJ5LnByb2dyYW0uY3VzdG9tVW5pZm9ybXMuZm9yRWFjaCgoZCwgaSkgPT4ge1xuICAgICAgY29uc3QgY3VzdG9tTG9jID0gYmluYXJ5LmN1c3RvbVVuaWZvcm1Mb2NhdGlvbnNbaV07XG4gICAgICBjb25zdCBjdXN0b21WYWx1ZSA9IGN1c3RvbVVuaWZvcm1WYWx1ZXNbaV07XG4gICAgICBpZiAoZC50eXBlID09PSAnZmxvYXQnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0xZnYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3ZlYzInKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yZnYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3ZlYzMnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0zZnYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ3ZlYzQnKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm00ZnYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ2ludCcpIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTFpdihjdXN0b21Mb2MsIGN1c3RvbVZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoZC50eXBlID09PSAnaXZlYzInKSB7XG4gICAgICAgIGdwZ3B1LmdsLnVuaWZvcm0yaXYoY3VzdG9tTG9jLCBjdXN0b21WYWx1ZSk7XG4gICAgICB9IGVsc2UgaWYgKGQudHlwZSA9PT0gJ2l2ZWMzJykge1xuICAgICAgICBncGdwdS5nbC51bmlmb3JtM2l2KGN1c3RvbUxvYywgY3VzdG9tVmFsdWUpO1xuICAgICAgfSBlbHNlIGlmIChkLnR5cGUgPT09ICdpdmVjNCcpIHtcbiAgICAgICAgZ3BncHUuZ2wudW5pZm9ybTRpdihjdXN0b21Mb2MsIGN1c3RvbVZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IEVycm9yKGB1bmlmb3JtIHR5cGUgJHtkLnR5cGV9IGlzIG5vdCBzdXBwb3J0ZWQgeWV0LmApO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdwZ3B1LmV4ZWN1dGVQcm9ncmFtKCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYWtlU2hhZGVyS2V5KFxuICAgIHByb2dyYW06IEdQR1BVUHJvZ3JhbSwgaW5wdXRzOiBUZW5zb3JEYXRhW10sIG91dHB1dDogVGVuc29yRGF0YSk6IHN0cmluZyB7XG4gIGxldCBrZXlJbnB1dHMgPSAnJztcbiAgaW5wdXRzLmNvbmNhdChvdXRwdXQpLmZvckVhY2goeCA9PiB7XG4gICAgY29uc3QgaGFzT2Zmc2V0ID0geC50ZXhEYXRhICE9IG51bGwgJiYgeC50ZXhEYXRhLnNsaWNlICE9IG51bGwgJiZcbiAgICAgICAgeC50ZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQgPiAwO1xuICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgY29uZGl0aW9uIG9mICF4LmlzVW5pZm9ybS5cbiAgICBpZiAocHJvZ3JhbS5lbmFibGVTaGFwZVVuaWZvcm1zICYmICF4LmlzVW5pZm9ybSkge1xuICAgICAgY29uc3QgeFRleFNoYXBlID0geC50ZXhEYXRhLnRleFNoYXBlO1xuICAgICAgY29uc3Qge3VzZVNxdWVlemVTaGFwZSwgdW5pZm9ybVNoYXBlLCBrZXB0RGltc30gPVxuICAgICAgICAgIHNoYWRlcl9jb21waWxlci5nZXRVbmlmb3JtSW5mb0Zyb21TaGFwZShcbiAgICAgICAgICAgICAgcHJvZ3JhbS5wYWNrZWRJbnB1dHMsIHguc2hhcGUsIHhUZXhTaGFwZSk7XG4gICAgICBsZXQgcmFuazEgPSAnJywgcmFuazIgPSAnJywgcmFuazM0ID0gJyc7XG4gICAgICBpZiAodW5pZm9ybVNoYXBlLmxlbmd0aCA9PT0gMSAmJiBwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICBjb25zdCBwYWNrZWRUZXhTaGFwZSA9XG4gICAgICAgICAgICBbTWF0aC5jZWlsKHhUZXhTaGFwZVswXSAvIDIpLCBNYXRoLmNlaWwoeFRleFNoYXBlWzFdIC8gMildO1xuICAgICAgICByYW5rMSA9IGAke3BhY2tlZFRleFNoYXBlWzBdID4gMX1fJHtwYWNrZWRUZXhTaGFwZVsxXSA+IDF9YDtcbiAgICAgIH0gZWxzZSBpZiAodW5pZm9ybVNoYXBlLmxlbmd0aCA9PT0gMiAmJiAhcHJvZ3JhbS5wYWNrZWRJbnB1dHMpIHtcbiAgICAgICAgcmFuazIgPSBgJHt1bmlmb3JtU2hhcGVbMF0gPiAxfV8ke3VuaWZvcm1TaGFwZVsxXSA+IDF9YDtcbiAgICAgIH0gZWxzZSBpZiAodW5pZm9ybVNoYXBlLmxlbmd0aCA+IDIgJiYgIXByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIGNvbnN0IHN0cmlkZXMgPSB1dGlsLmNvbXB1dGVTdHJpZGVzKHVuaWZvcm1TaGFwZSk7XG4gICAgICAgIHJhbmszNCA9IGAke3N0cmlkZXNbMF0gPT09IHhUZXhTaGFwZVsxXX1fJHtcbiAgICAgICAgICAgIHN0cmlkZXNbc3RyaWRlcy5sZW5ndGggLSAxXSA9PT0geFRleFNoYXBlWzFdfWA7XG4gICAgICB9XG4gICAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgICAgY29uc3QgaXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWwgPVxuICAgICAgICAgIHVuaWZvcm1TaGFwZS5sZW5ndGggPT09IDIgJiYgdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB4VGV4U2hhcGUpO1xuICAgICAgY29uc3QgaXNTY2FsYXIgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDE7XG4gICAgICBjb25zdCBicm9hZGNhc3REaW1zID1cbiAgICAgICAgICBiYWNrZW5kX3V0aWwuZ2V0QnJvYWRjYXN0RGltcyh4LnNoYXBlLCBvdXRwdXQuc2hhcGUpO1xuICAgICAgY29uc3QgaXNJbk91dFRleFNoYXBlRXF1YWwgPSAhcHJvZ3JhbS5wYWNrZWRJbnB1dHMgJiZcbiAgICAgICAgICB4UmFuayA9PT0gb3V0cHV0LnNoYXBlLmxlbmd0aCAmJlxuICAgICAgICAgIHV0aWwuYXJyYXlzRXF1YWwoeFRleFNoYXBlLCBvdXRwdXQudGV4RGF0YS50ZXhTaGFwZSk7XG4gICAgICBjb25zdCBpc1RleFNoYXBlR3JlYXRlclRoYW5PbmUgPVxuICAgICAgICAgIHByb2dyYW0ucGFja2VkSW5wdXRzIHx8IHVuaWZvcm1TaGFwZS5sZW5ndGggPiAyID9cbiAgICAgICAgICAnJyA6XG4gICAgICAgICAgYCR7eFRleFNoYXBlWzBdID4gMX1fJHt4VGV4U2hhcGVbMV0gPiAxfWA7XG4gICAgICAvLyBUaGVzZSBrZXkgY29tcG9uZW50cyBhcmUgbmVlZGVkIGR1ZSB0byBzaGFkZXJfY29tcGlsZXIgaXMgZW1iZWRkaW5nXG4gICAgICAvLyB0aGVtIGluIHRoZSBzaGFkZXIuXG4gICAgICAvLyB8eFJhbmt8IGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBjb29yZHMgbGVuZ3RoLiBTZWVcbiAgICAgIC8vIGdldFtQYWNrZWRdU2FtcGxlckF0T3V0cHV0Q29vcmRzLlxuICAgICAgLy8gfGlzSW5PdXRUZXhTaGFwZUVxdWFsfCBpcyB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIGdvaW5nIHRvIGFuXG4gICAgICAvLyBvcHRpbWl6YXRpb24gcGF0aCBpbiBnZXRTYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAvLyB8dXNlU3F1ZWV6ZVNoYXBlfCBpcyBleHRyYWN0ZWQgZnJvbSBzcXVlZXplSW5wdXRJbmZvIG9mXG4gICAgICAvLyBnZXRTYW1wbGVyWzJ8M3w0XUQvZ2V0UGFja2VkU2FtcGxlcjNELlxuICAgICAgLy8gfGlzU2NhbGFyfCBpcyBleHRyYWN0ZWQgZnJvbSBpc0lucHV0U2NhbGFyL2lzT3V0cHV0U2NhbGFyIGluXG4gICAgICAvLyBnZXRQYWNrZWRTYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAvLyB8YnJvYWRjYXN0RGltc3wgaXMgZXh0cmFjdGVkIGZyb20gZ2V0W1BhY2tlZF1TYW1wbGVyQXRPdXRwdXRDb29yZHMuXG4gICAgICAvLyB8aXNMb2dpY2FsU2hhcFRleFNoYXBlRXF1YWx8IGlzIHVzZWQgaW5cbiAgICAgIC8vIGdldE91dHB1dFtQYWNrZWRdMkRDb29yZHMvZ2V0W1BhY2tlZF1TYW1wbGVyMkQuXG4gICAgICAvLyB8cmFuazF8IGlzIHVzZWQgaW4gZ2V0T3V0cHV0UGFja2VkMURDb29yZHMuXG4gICAgICAvLyB8cmFuazJ8IGlzIHVzZWQgaW4gZ2V0T3V0cHV0MkRDb29yZHMuXG4gICAgICAvLyB8cmFuazM0fCBpcyB1c2VkIGluIGdldFNhbXBsZXIzRC9nZXRTYW1wbGVyNEQuXG4gICAgICAvLyB8aXNUZXhTaGFwZUdyZWF0ZXJUaGFuT25lfCBhcmUgdXNlZCBpblxuICAgICAgLy8gZ2V0U2FtcGxlcltTY2FsYXJ8MUR8MkRdL2dldE91dHB1dDFEQ29vcmRzLlxuICAgICAga2V5SW5wdXRzICs9IGAke3hSYW5rfV8ke2lzSW5PdXRUZXhTaGFwZUVxdWFsfV8ke1xuICAgICAgICAgIHVzZVNxdWVlemVTaGFwZSA/IGtlcHREaW1zIDogJyd9XyR7dW5pZm9ybVNoYXBlLmxlbmd0aH1fJHtpc1NjYWxhcn1fJHtcbiAgICAgICAgICBicm9hZGNhc3REaW1zfV8ke2lzTG9naWNhbFNoYXBUZXhTaGFwZUVxdWFsfV8ke3JhbmsxfV8ke3JhbmsyfV8ke1xuICAgICAgICAgIHJhbmszNH1fJHtpc1RleFNoYXBlR3JlYXRlclRoYW5PbmV9XyR7aGFzT2Zmc2V0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHRleFNoYXBlID0geC5pc1VuaWZvcm0gPyAndW5pZm9ybScgOiB4LnRleERhdGEudGV4U2hhcGU7XG4gICAgICBrZXlJbnB1dHMgKz0gYCR7eC5zaGFwZX1fJHt0ZXhTaGFwZX1fJHtoYXNPZmZzZXR9YDtcbiAgICB9XG4gIH0pO1xuICBjb25zdCBrZXlVc2VyQ29kZSA9IHByb2dyYW0udXNlckNvZGU7XG4gIGxldCBrZXkgPSBwcm9ncmFtLmNvbnN0cnVjdG9yLm5hbWU7XG4gIC8vIEZhc3Qgc3RyaW5nIGNvbmNhdC4gU2VlIGh0dHBzOi8vanNwZXJmLmNvbS9zdHJpbmctY29uY2F0ZW5hdGlvbi8xNC5cbiAga2V5ICs9ICdfJyArIGtleUlucHV0cyArICdfJyArIGtleVVzZXJDb2RlICtcbiAgICAgIGAke2VudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpfWA7XG4gIHJldHVybiBrZXk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB1c2VTaGFwZVVuaWZvcm1zKHJhbms6IG51bWJlcikge1xuICAvLyBUT0RPOiBSZW1vdmUgdGhlIGxpbWl0YWlvbiBvZiByYW5rIDw9IDQuXG4gIHJldHVybiBlbnYoKS5nZXRCb29sKCdXRUJHTF9VU0VfU0hBUEVTX1VOSUZPUk1TJykgJiYgcmFuayA8PSA0O1xufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\nimport { PackingScheme } from './tex_util';\nexport class DecodeMatrixProgram {\n    constructor(outputShape) {\n        this.variableNames = ['A'];\n        this.packedInputs = false;\n        this.packedOutput = true;\n        this.outPackingScheme = PackingScheme.DENSE;\n        this.customUniforms = [{ name: 'texShape', type: 'ivec2' }];\n        const glsl = getGlslDifferences();\n        this.outputShape = outputShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        this.userCode = `\n      ivec3 outCoordsFromFlatIndex(int index) {\n        ${this.enableShapeUniforms ?\n            shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd'], outputShape) :\n            shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], outputShape)}\n        return ivec3(r, c, d);\n      }\n\n      void main() {\n        ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n        int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n        vec4 result = vec4(0.);\n\n        for (int i=0; i<4; i++) {\n          int flatIndex = index + i;\n          ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n          result[i] = getA(rc.x, rc.y, rc.z);\n        }\n\n        ${glsl.output} = result;\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2RlX21hdHJpeF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2RlY29kZV9tYXRyaXhfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEtBQUssV0FBVyxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFekMsTUFBTSxPQUFPLG1CQUFtQjtJQVU5QixZQUFZLFdBQXFDO1FBVGpELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixxQkFBZ0IsR0FBRyxhQUFhLENBQUMsS0FBSyxDQUFDO1FBRXZDLG1CQUFjLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUUsQ0FBQyxDQUFDO1FBRzdELE1BQU0sSUFBSSxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFHWixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztZQUN0QixXQUFXLENBQUMsaURBQWlELENBQ3pELENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO1lBQ25DLFdBQVcsQ0FBQyxrQ0FBa0MsQ0FDMUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztVQWdCbkMsSUFBSSxDQUFDLE1BQU07O0tBRWhCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCAqIGFzIHNoYWRlcl91dGlsIGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuaW1wb3J0IHtQYWNraW5nU2NoZW1lfSBmcm9tICcuL3RleF91dGlsJztcblxuZXhwb3J0IGNsYXNzIERlY29kZU1hdHJpeFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl07XG4gIHBhY2tlZElucHV0cyA9IGZhbHNlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRQYWNraW5nU2NoZW1lID0gUGFja2luZ1NjaGVtZS5ERU5TRTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd0ZXhTaGFwZScsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfV07XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgaXZlYzMgb3V0Q29vcmRzRnJvbUZsYXRJbmRleChpbnQgaW5kZXgpIHtcbiAgICAgICAgJHtcbiAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID9cbiAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldE91dHB1dExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXhCeVVuaWZvcm0oXG4gICAgICAgICAgICAgICAgWydyJywgJ2MnLCAnZCddLCBvdXRwdXRTaGFwZSkgOlxuICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0TG9naWNhbENvb3JkaW5hdGVzRnJvbUZsYXRJbmRleChcbiAgICAgICAgICAgICAgICBbJ3InLCAnYycsICdkJ10sIG91dHB1dFNoYXBlKX1cbiAgICAgICAgcmV0dXJuIGl2ZWMzKHIsIGMsIGQpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIHJlc1RleFJDID0gaXZlYzIocmVzdWx0VVYueXggKiB2ZWMyKHRleFNoYXBlWzBdLCB0ZXhTaGFwZVsxXSkpO1xuICAgICAgICBpbnQgaW5kZXggPSA0ICogKHJlc1RleFJDLnggKiB0ZXhTaGFwZVsxXSArIHJlc1RleFJDLnkpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG5cbiAgICAgICAgZm9yIChpbnQgaT0wOyBpPDQ7IGkrKykge1xuICAgICAgICAgIGludCBmbGF0SW5kZXggPSBpbmRleCArIGk7XG4gICAgICAgICAgaXZlYzMgcmMgPSBvdXRDb29yZHNGcm9tRmxhdEluZGV4KGZsYXRJbmRleCk7XG4gICAgICAgICAgcmVzdWx0W2ldID0gZ2V0QShyYy54LCByYy55LCByYy56KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\nimport { PackingScheme } from './tex_util';\nexport class DecodeMatrixPackedProgram {\n    constructor(outputShape) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outPackingScheme = PackingScheme.DENSE;\n        this.customUniforms = [{ name: 'texShape', type: 'ivec2' }];\n        const glsl = getGlslDifferences();\n        this.outputShape = outputShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        this.userCode = `\n      ivec3 outCoordsFromFlatIndex(int index) {\n        ${this.enableShapeUniforms ?\n            shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd'], outputShape) :\n            shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], outputShape)}\n        return ivec3(r, c, d);\n      }\n\n      void main() {\n        ivec2 resTexRC = ivec2(resultUV.yx * vec2(texShape[0], texShape[1]));\n        int index = 4 * (resTexRC.x * texShape[1] + resTexRC.y);\n\n        vec4 result = vec4(0.);\n\n        for (int i=0; i<4; i++) {\n          int flatIndex = index + i;\n          ivec3 rc = outCoordsFromFlatIndex(flatIndex);\n          result[i] = getChannel(getA(rc.x, rc.y, rc.z), vec2(rc.y, rc.z));\n        }\n\n        ${glsl.output} = result;\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjb2RlX21hdHJpeF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9kZWNvZGVfbWF0cml4X3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0JBQXdCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV6QyxNQUFNLE9BQU8seUJBQXlCO0lBVXBDLFlBQVksV0FBcUM7UUFUakQsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXBCLHFCQUFnQixHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUM7UUFFdkMsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRSxDQUFDLENBQUM7UUFHN0QsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUVyRSxJQUFJLENBQUMsUUFBUSxHQUFHOztVQUdaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3RCLFdBQVcsQ0FBQyxpREFBaUQsQ0FDekQsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7WUFDbkMsV0FBVyxDQUFDLGtDQUFrQyxDQUMxQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7O1VBZ0JuQyxJQUFJLENBQUMsTUFBTTs7S0FFaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQge1BhY2tpbmdTY2hlbWV9IGZyb20gJy4vdGV4X3V0aWwnO1xuXG5leHBvcnQgY2xhc3MgRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgb3V0UGFja2luZ1NjaGVtZSA9IFBhY2tpbmdTY2hlbWUuREVOU0U7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndGV4U2hhcGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGl2ZWMzIG91dENvb3Jkc0Zyb21GbGF0SW5kZXgoaW50IGluZGV4KSB7XG4gICAgICAgICR7XG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/XG4gICAgICAgICAgICBzaGFkZXJfdXRpbC5nZXRPdXRwdXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgICAgICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgb3V0cHV0U2hhcGUpIDpcbiAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldExvZ2ljYWxDb29yZGluYXRlc0Zyb21GbGF0SW5kZXgoXG4gICAgICAgICAgICAgICAgWydyJywgJ2MnLCAnZCddLCBvdXRwdXRTaGFwZSl9XG4gICAgICAgIHJldHVybiBpdmVjMyhyLCBjLCBkKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiByZXNUZXhSQyA9IGl2ZWMyKHJlc3VsdFVWLnl4ICogdmVjMih0ZXhTaGFwZVswXSwgdGV4U2hhcGVbMV0pKTtcbiAgICAgICAgaW50IGluZGV4ID0gNCAqIChyZXNUZXhSQy54ICogdGV4U2hhcGVbMV0gKyByZXNUZXhSQy55KTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuXG4gICAgICAgIGZvciAoaW50IGk9MDsgaTw0OyBpKyspIHtcbiAgICAgICAgICBpbnQgZmxhdEluZGV4ID0gaW5kZXggKyBpO1xuICAgICAgICAgIGl2ZWMzIHJjID0gb3V0Q29vcmRzRnJvbUZsYXRJbmRleChmbGF0SW5kZXgpO1xuICAgICAgICAgIHJlc3VsdFtpXSA9IGdldENoYW5uZWwoZ2V0QShyYy54LCByYy55LCByYy56KSwgdmVjMihyYy55LCByYy56KSk7XG4gICAgICAgIH1cblxuICAgICAgICAke2dsc2wub3V0cHV0fSA9IHJlc3VsdDtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { ENCODE_FLOAT_SNIPPET } from './shader_compiler_util';\nimport { TextureUsage } from './tex_util';\nexport class EncodeFloatProgram {\n    constructor(outputShape) {\n        this.variableNames = ['A'];\n        this.outTexUsage = TextureUsage.DOWNLOAD;\n        const glsl = getGlslDifferences();\n        this.outputShape = outputShape;\n        this.userCode = `\n      ${ENCODE_FLOAT_SNIPPET}\n\n      void main() {\n        float x = getAAtOutCoords();\n        ${glsl.output} = encode_float(x);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlX2Zsb2F0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZW5jb2RlX2Zsb2F0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVsRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXhDLE1BQU0sT0FBTyxrQkFBa0I7SUFNN0IsWUFBWSxXQUFxQjtRQUxqQyxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFHdEIsZ0JBQVcsR0FBRyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBR2xDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUNaLG9CQUFvQjs7OztVQUlsQixJQUFJLENBQUMsTUFBTTs7S0FFaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtFTkNPREVfRkxPQVRfU05JUFBFVH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQge1RleHR1cmVVc2FnZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVGbG9hdFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgb3V0VGV4VXNhZ2UgPSBUZXh0dXJlVXNhZ2UuRE9XTkxPQUQ7XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IG51bWJlcltdKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtFTkNPREVfRkxPQVRfU05JUFBFVH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBmbG9hdCB4ID0gZ2V0QUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gZW5jb2RlX2Zsb2F0KHgpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { ENCODE_FLOAT_SNIPPET } from './shader_compiler_util';\nimport { TextureUsage } from './tex_util';\nexport class EncodeFloatPackedProgram {\n    constructor(outputShape) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = false;\n        this.outTexUsage = TextureUsage.DOWNLOAD;\n        const glsl = getGlslDifferences();\n        this.outputShape = outputShape;\n        this.userCode = `\n      ${ENCODE_FLOAT_SNIPPET}\n\n      void main() {\n        ivec3 coords = getOutputCoords();\n        float x = getChannel(getAAtOutCoords(), vec2(coords.y, coords.z));\n        ${glsl.output} = encode_float(x);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2VuY29kZV9mbG9hdF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWxELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFeEMsTUFBTSxPQUFPLHdCQUF3QjtJQVFuQyxZQUFZLFdBQXFDO1FBUGpELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixnQkFBVyxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUM7UUFHbEMsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHO1FBQ1osb0JBQW9COzs7OztVQUtsQixJQUFJLENBQUMsTUFBTTs7S0FFaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtFTkNPREVfRkxPQVRfU05JUFBFVH0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5pbXBvcnQge1RleHR1cmVVc2FnZX0gZnJvbSAnLi90ZXhfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gZmFsc2U7XG4gIG91dFRleFVzYWdlID0gVGV4dHVyZVVzYWdlLkRPV05MT0FEO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke0VOQ09ERV9GTE9BVF9TTklQUEVUfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMzIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBmbG9hdCB4ID0gZ2V0Q2hhbm5lbChnZXRBQXRPdXRDb29yZHMoKSwgdmVjMihjb29yZHMueSwgY29vcmRzLnopKTtcbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSBlbmNvZGVfZmxvYXQoeCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\nexport class EncodeMatrixProgram {\n    constructor(outputShape, inputIsUnsignedByte = false) {\n        this.variableNames = ['A'];\n        this.customUniforms = [{ name: 'texShape', type: 'ivec2' }];\n        const glsl = getGlslDifferences();\n        this.outputShape = outputShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        let output = `result`;\n        if (inputIsUnsignedByte) {\n            output = `floor(result * 255. + 0.5)`;\n        }\n        this.userCode = `\n      ${this.enableShapeUniforms ? shader_util.getFlatIndexFrom3DOutput() :\n            shader_util.getFlatIndexFrom3D(outputShape)}\n\n      void main() {\n        ivec3 coords = getOutputCoords();\n\n        int flatIndex = getFlatIndex(coords);\n        int offset = imod(flatIndex, 4);\n\n        flatIndex = idiv(flatIndex, 4, 1.);\n\n        int r = flatIndex / texShape[1];\n        int c = imod(flatIndex, texShape[1]);\n        vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]);\n        vec4 values = ${glsl.texture2D}(A, uv);\n\n        float result;\n\n        if(offset == 0) {\n          result = values[0];\n        } else if(offset == 1) {\n          result = values[1];\n        } else if(offset == 2) {\n          result = values[2];\n        } else {\n          result = values[3];\n        }\n\n        ${glsl.output} = vec4(${output}, 0., 0., 0.);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlX21hdHJpeF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2VuY29kZV9tYXRyaXhfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEtBQUssV0FBVyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxtQkFBbUI7SUFPOUIsWUFDSSxXQUFxQyxFQUFFLG1CQUFtQixHQUFHLEtBQUs7UUFQdEUsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSXRCLG1CQUFjLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUUsQ0FBQyxDQUFDO1FBSTdELE1BQU0sSUFBSSxHQUFHLGtCQUFrQixFQUFFLENBQUM7UUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO1FBQ3RCLElBQUksbUJBQW1CLEVBQUU7WUFDdkIsTUFBTSxHQUFHLDRCQUE0QixDQUFDO1NBQ3ZDO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUVaLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLHdCQUF3QixFQUFFLENBQUMsQ0FBQztZQUN4QyxXQUFXLENBQUMsa0JBQWtCLENBQUMsV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7O3dCQWF0RCxJQUFJLENBQUMsU0FBUzs7Ozs7Ozs7Ozs7Ozs7VUFjNUIsSUFBSSxDQUFDLE1BQU0sV0FBVyxNQUFNOztLQUVqQyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlc30gZnJvbSAnLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQgKiBhcyBzaGFkZXJfdXRpbCBmcm9tICcuL3NoYWRlcl9jb21waWxlcl91dGlsJztcblxuZXhwb3J0IGNsYXNzIEVuY29kZU1hdHJpeFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd0ZXhTaGFwZScsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfV07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCBpbnB1dElzVW5zaWduZWRCeXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuXG4gICAgbGV0IG91dHB1dCA9IGByZXN1bHRgO1xuICAgIGlmIChpbnB1dElzVW5zaWduZWRCeXRlKSB7XG4gICAgICBvdXRwdXQgPSBgZmxvb3IocmVzdWx0ICogMjU1LiArIDAuNSlgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyBzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0RPdXRwdXQoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRChvdXRwdXRTaGFwZSl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgaW50IGZsYXRJbmRleCA9IGdldEZsYXRJbmRleChjb29yZHMpO1xuICAgICAgICBpbnQgb2Zmc2V0ID0gaW1vZChmbGF0SW5kZXgsIDQpO1xuXG4gICAgICAgIGZsYXRJbmRleCA9IGlkaXYoZmxhdEluZGV4LCA0LCAxLik7XG5cbiAgICAgICAgaW50IHIgPSBmbGF0SW5kZXggLyB0ZXhTaGFwZVsxXTtcbiAgICAgICAgaW50IGMgPSBpbW9kKGZsYXRJbmRleCwgdGV4U2hhcGVbMV0pO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIoYywgcikgKyBoYWxmQ1IpIC8gdmVjMih0ZXhTaGFwZVsxXSwgdGV4U2hhcGVbMF0pO1xuICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcblxuICAgICAgICBmbG9hdCByZXN1bHQ7XG5cbiAgICAgICAgaWYob2Zmc2V0ID09IDApIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZXNbMF07XG4gICAgICAgIH0gZWxzZSBpZihvZmZzZXQgPT0gMSkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1sxXTtcbiAgICAgICAgfSBlbHNlIGlmKG9mZnNldCA9PSAyKSB7XG4gICAgICAgICAgcmVzdWx0ID0gdmFsdWVzWzJdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlc1szXTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gdmVjNCgke291dHB1dH0sIDAuLCAwLiwgMC4pO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\n/*\nThis is how the shader encodes a tensor with shape = [2, 3, 5]\n(indices are [batch, row, col]).\n\n000|001   002|003   004|xxx   020|021   022|023   024|xxx\n-------   -------   -------   -------   -------   -------\n010|011   012|013   014|xxx   xxx|xxx   xxx|xxx   xxx|xxx\n\n100|101   102|103   104|xxx   120|121   122|123   124|xxx\n-------   -------   -------   -------   -------   -------\n110|111   112|113   114|xxx   xxx|xxx   xxx|xxx   xxx|xxx\n\nSingle texels contain only values from the same batch, and from adjacent rows\nand columns.\n */\nexport class EncodeMatrixPackedProgram {\n    constructor(outputShape, inputIsUnsignedByte = false) {\n        this.variableNames = ['A'];\n        this.packedInputs = false;\n        this.packedOutput = true;\n        this.customUniforms = [{ name: 'texShape', type: 'ivec2' }];\n        const glsl = getGlslDifferences();\n        this.outputShape = outputShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        let mainLoop = '';\n        let output = 'result';\n        if (inputIsUnsignedByte) {\n            output = 'floor(result * 255. + 0.5)';\n        }\n        for (let row = 0; row <= 1; row++) {\n            for (let col = 0; col <= 1; col++) {\n                const channel = row * 2 + col;\n                mainLoop += `\n          localCoords = coords;\n          if(localCoords[2] + ${col} < ${this.enableShapeUniforms ? 'outShape[2]' : `${outputShape[2]}`}) {\n          localCoords[2] += ${col};\n          if (localCoords[1] + ${row} < ${this.enableShapeUniforms ? 'outShape[1]' : `${outputShape[1]}`}) {\n            localCoords[1] += ${row};\n\n            flatIndex = getFlatIndex(localCoords);\n            offset = imod(flatIndex, 4);\n\n            flatIndex = idiv(flatIndex, 4, 1.);\n\n            int r = flatIndex / texShape[1];\n            int c = imod(flatIndex, texShape[1]);\n            vec2 uv = (vec2(c, r) + halfCR) / vec2(texShape[1], texShape[0]);\n            values = ${glsl.texture2D}(A, uv);\n\n            if (offset == 0) {\n              result[${channel}] = values[0];\n            } else if (offset == 1) {\n              result[${channel}] = values[1];\n            } else if (offset == 2) {\n              result[${channel}] = values[2];\n            } else {\n              result[${channel}] = values[3];\n            }\n          }\n        }\n        `;\n            }\n        }\n        this.userCode = `\n        ${this.enableShapeUniforms ? shader_util.getFlatIndexFrom3DOutput() :\n            shader_util.getFlatIndexFrom3D(outputShape)}\n\n        void main() {\n          ivec3 coords = getOutputCoords();\n\n          vec4 result = vec4(0.);\n          int flatIndex, r, c, offset;\n          ivec3 localCoords;\n          vec2 uv;\n          vec4 values;\n\n          ${mainLoop}\n\n          ${glsl.output} = ${output};\n        }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jb2RlX21hdHJpeF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDbEQsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQ7Ozs7Ozs7Ozs7Ozs7O0dBY0c7QUFFSCxNQUFNLE9BQU8seUJBQXlCO0lBU3BDLFlBQ0ksV0FBcUMsRUFBRSxtQkFBbUIsR0FBRyxLQUFLO1FBVHRFLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUVwQixtQkFBYyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFLENBQUMsQ0FBQztRQUk3RCxNQUFNLElBQUksR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQ2xDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXJFLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLE1BQU0sR0FBRyxRQUFRLENBQUM7UUFDdEIsSUFBSSxtQkFBbUIsRUFBRTtZQUN2QixNQUFNLEdBQUcsNEJBQTRCLENBQUM7U0FDdkM7UUFFRCxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1lBQ2pDLEtBQUssSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLEVBQUU7Z0JBQ2pDLE1BQU0sT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO2dCQUU5QixRQUFRLElBQUk7O2dDQUVZLEdBQUcsTUFDdkIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFOzhCQUM1QyxHQUFHO2lDQUNBLEdBQUcsTUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dDQUMxQyxHQUFHOzs7Ozs7Ozs7O3VCQVVaLElBQUksQ0FBQyxTQUFTOzs7dUJBR2QsT0FBTzs7dUJBRVAsT0FBTzs7dUJBRVAsT0FBTzs7dUJBRVAsT0FBTzs7OztTQUlyQixDQUFDO2FBQ0g7U0FDRjtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7VUFFWixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7WUFDeEMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQzs7Ozs7Ozs7Ozs7WUFXbEUsUUFBUTs7WUFFUixJQUFJLENBQUMsTUFBTSxNQUFNLE1BQU07O0tBRTlCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCAqIGFzIHNoYWRlcl91dGlsIGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyX3V0aWwnO1xuXG4vKlxuVGhpcyBpcyBob3cgdGhlIHNoYWRlciBlbmNvZGVzIGEgdGVuc29yIHdpdGggc2hhcGUgPSBbMiwgMywgNV1cbihpbmRpY2VzIGFyZSBbYmF0Y2gsIHJvdywgY29sXSkuXG5cbjAwMHwwMDEgICAwMDJ8MDAzICAgMDA0fHh4eCAgIDAyMHwwMjEgICAwMjJ8MDIzICAgMDI0fHh4eFxuLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tXG4wMTB8MDExICAgMDEyfDAxMyAgIDAxNHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eCAgIHh4eHx4eHhcblxuMTAwfDEwMSAgIDEwMnwxMDMgICAxMDR8eHh4ICAgMTIwfDEyMSAgIDEyMnwxMjMgICAxMjR8eHh4XG4tLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS0gICAtLS0tLS0tICAgLS0tLS0tLSAgIC0tLS0tLS1cbjExMHwxMTEgICAxMTJ8MTEzICAgMTE0fHh4eCAgIHh4eHx4eHggICB4eHh8eHh4ICAgeHh4fHh4eFxuXG5TaW5nbGUgdGV4ZWxzIGNvbnRhaW4gb25seSB2YWx1ZXMgZnJvbSB0aGUgc2FtZSBiYXRjaCwgYW5kIGZyb20gYWRqYWNlbnQgcm93c1xuYW5kIGNvbHVtbnMuXG4gKi9cblxuZXhwb3J0IGNsYXNzIEVuY29kZU1hdHJpeFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gZmFsc2U7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndGV4U2hhcGUnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3V0cHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgaW5wdXRJc1Vuc2lnbmVkQnl0ZSA9IGZhbHNlKSB7XG4gICAgY29uc3QgZ2xzbCA9IGdldEdsc2xEaWZmZXJlbmNlcygpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcblxuICAgIGxldCBtYWluTG9vcCA9ICcnO1xuICAgIGxldCBvdXRwdXQgPSAncmVzdWx0JztcbiAgICBpZiAoaW5wdXRJc1Vuc2lnbmVkQnl0ZSkge1xuICAgICAgb3V0cHV0ID0gJ2Zsb29yKHJlc3VsdCAqIDI1NS4gKyAwLjUpJztcbiAgICB9XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPD0gMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8PSAxOyBjb2wrKykge1xuICAgICAgICBjb25zdCBjaGFubmVsID0gcm93ICogMiArIGNvbDtcblxuICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgbG9jYWxDb29yZHMgPSBjb29yZHM7XG4gICAgICAgICAgaWYobG9jYWxDb29yZHNbMl0gKyAke2NvbH0gPCAke1xuICAgICAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gJ291dFNoYXBlWzJdJyA6IGAke291dHB1dFNoYXBlWzJdfWB9KSB7XG4gICAgICAgICAgbG9jYWxDb29yZHNbMl0gKz0gJHtjb2x9O1xuICAgICAgICAgIGlmIChsb2NhbENvb3Jkc1sxXSArICR7cm93fSA8ICR7XG4gICAgICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyAnb3V0U2hhcGVbMV0nIDogYCR7b3V0cHV0U2hhcGVbMV19YH0pIHtcbiAgICAgICAgICAgIGxvY2FsQ29vcmRzWzFdICs9ICR7cm93fTtcblxuICAgICAgICAgICAgZmxhdEluZGV4ID0gZ2V0RmxhdEluZGV4KGxvY2FsQ29vcmRzKTtcbiAgICAgICAgICAgIG9mZnNldCA9IGltb2QoZmxhdEluZGV4LCA0KTtcblxuICAgICAgICAgICAgZmxhdEluZGV4ID0gaWRpdihmbGF0SW5kZXgsIDQsIDEuKTtcblxuICAgICAgICAgICAgaW50IHIgPSBmbGF0SW5kZXggLyB0ZXhTaGFwZVsxXTtcbiAgICAgICAgICAgIGludCBjID0gaW1vZChmbGF0SW5kZXgsIHRleFNoYXBlWzFdKTtcbiAgICAgICAgICAgIHZlYzIgdXYgPSAodmVjMihjLCByKSArIGhhbGZDUikgLyB2ZWMyKHRleFNoYXBlWzFdLCB0ZXhTaGFwZVswXSk7XG4gICAgICAgICAgICB2YWx1ZXMgPSAke2dsc2wudGV4dHVyZTJEfShBLCB1dik7XG5cbiAgICAgICAgICAgIGlmIChvZmZzZXQgPT0gMCkge1xuICAgICAgICAgICAgICByZXN1bHRbJHtjaGFubmVsfV0gPSB2YWx1ZXNbMF07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9mZnNldCA9PSAxKSB7XG4gICAgICAgICAgICAgIHJlc3VsdFske2NoYW5uZWx9XSA9IHZhbHVlc1sxXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDIpIHtcbiAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzJdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzdWx0WyR7Y2hhbm5lbH1dID0gdmFsdWVzWzNdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICR7XG4gICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/IHNoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRE91dHB1dCgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhZGVyX3V0aWwuZ2V0RmxhdEluZGV4RnJvbTNEKG91dHB1dFNoYXBlKX1cblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG5cbiAgICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgICAgIGludCBmbGF0SW5kZXgsIHIsIGMsIG9mZnNldDtcbiAgICAgICAgICBpdmVjMyBsb2NhbENvb3JkcztcbiAgICAgICAgICB2ZWMyIHV2O1xuICAgICAgICAgIHZlYzQgdmFsdWVzO1xuXG4gICAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gJHtvdXRwdXR9O1xuICAgICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { getGlslDifferences } from './glsl_version';\nimport * as tex_util from './tex_util';\nimport * as webgl_util from './webgl_util';\nexport function createVertexShader(gl) {\n    const glsl = getGlslDifferences();\n    const vertexShaderSource = `${glsl.version}\n    precision highp float;\n    ${glsl.attribute} vec3 clipSpacePos;\n    ${glsl.attribute} vec2 uv;\n    ${glsl.varyingVs} vec2 resultUV;\n\n    void main() {\n      gl_Position = vec4(clipSpacePos, 1);\n      resultUV = uv;\n    }`;\n    return webgl_util.createVertexShader(gl, vertexShaderSource);\n}\nexport function createVertexBuffer(gl) {\n    // [x y z u v] * [upper-left, lower-left, upper-right, lower-right]\n    const vertexArray = new Float32Array([-1, 1, 0, 0, 1, -1, -1, 0, 0, 0, 1, 1, 0, 1, 1, 1, -1, 0, 1, 0]);\n    return webgl_util.createStaticVertexBuffer(gl, vertexArray);\n}\nexport function createIndexBuffer(gl) {\n    // OpenGL (and WebGL) have \"CCW == front\" winding\n    const triangleVertexIndices = new Uint16Array([0, 1, 2, 2, 1, 3]);\n    return webgl_util.createStaticIndexBuffer(gl, triangleVertexIndices);\n}\nfunction createAndConfigureTexture(gl, width, height, internalFormat, textureFormat, textureType) {\n    webgl_util.validateTextureSize(width, height);\n    const texture = webgl_util.createTexture(gl);\n    const tex2d = gl.TEXTURE_2D;\n    webgl_util.callAndCheck(gl, () => gl.bindTexture(tex2d, texture));\n    webgl_util.callAndCheck(gl, () => gl.texParameteri(tex2d, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE));\n    webgl_util.callAndCheck(gl, () => gl.texParameteri(tex2d, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE));\n    webgl_util.callAndCheck(gl, () => gl.texParameteri(tex2d, gl.TEXTURE_MIN_FILTER, gl.NEAREST));\n    webgl_util.callAndCheck(gl, () => gl.texParameteri(tex2d, gl.TEXTURE_MAG_FILTER, gl.NEAREST));\n    if (env().getNumber('WEBGL_VERSION') === 1) {\n        webgl_util.callAndCheck(gl, () => gl.texImage2D(tex2d, 0, internalFormat, width, height, 0, textureFormat, textureType, null));\n    }\n    else {\n        webgl_util.callAndCheck(gl, () => gl\n            .texStorage2D(tex2d, 1, internalFormat, width, height));\n    }\n    webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null));\n    return { texture, texShape: [height, width] };\n}\nexport function getInternalFormatForFloat32MatrixTexture(textureConfig) {\n    return textureConfig.internalFormatFloat;\n}\nexport function createFloat32MatrixTexture(gl, rows, columns, textureConfig) {\n    const [width, height] = tex_util.getUnpackedMatrixTextureShapeWidthHeight(rows, columns);\n    return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat32MatrixTexture(textureConfig), textureConfig.textureFormatFloat, gl.FLOAT);\n}\nexport function getInternalFormatForFloat16MatrixTexture(textureConfig) {\n    return textureConfig.internalFormatHalfFloat;\n}\nexport function createFloat16MatrixTexture(gl, rows, columns, textureConfig) {\n    const [width, height] = tex_util.getUnpackedMatrixTextureShapeWidthHeight(rows, columns);\n    return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat16MatrixTexture(textureConfig), textureConfig.textureFormatFloat, textureConfig.textureTypeHalfFloat);\n}\nexport function getInternalFormatForUnsignedBytesMatrixTexture(textureConfig) {\n    return textureConfig.downloadTextureFormat;\n}\nexport function createUnsignedBytesMatrixTexture(gl, rows, columns, textureConfig) {\n    const [width, height] = tex_util.getUnpackedMatrixTextureShapeWidthHeight(rows, columns);\n    return createAndConfigureTexture(gl, width, height, getInternalFormatForUnsignedBytesMatrixTexture(textureConfig), gl.RGBA, gl.UNSIGNED_BYTE);\n}\nexport function getInternalFormatForPackedMatrixTexture(textureConfig) {\n    return textureConfig.internalFormatPackedFloat;\n}\nexport function createPackedMatrixTexture(gl, rows, columns, textureConfig) {\n    const [width, height] = tex_util.getPackedMatrixTextureShapeWidthHeight(rows, columns);\n    return createAndConfigureTexture(gl, width, height, getInternalFormatForPackedMatrixTexture(textureConfig), gl.RGBA, gl.FLOAT);\n}\nexport function getInternalFormatForFloat16PackedMatrixTexture(textureConfig) {\n    return textureConfig.internalFormatPackedHalfFloat;\n}\nexport function createFloat16PackedMatrixTexture(gl, rows, columns, textureConfig) {\n    const [width, height] = tex_util.getPackedMatrixTextureShapeWidthHeight(rows, columns);\n    return createAndConfigureTexture(gl, width, height, getInternalFormatForFloat16PackedMatrixTexture(textureConfig), gl.RGBA, textureConfig.textureTypeHalfFloat);\n}\nexport function bindVertexProgramAttributeStreams(gl, program, vertexBuffer) {\n    const posOffset = 0; // x is the first buffer element\n    const uvOffset = 3 * 4; // uv comes after [x y z]\n    const stride = (3 * 4) + (2 * 4); // xyz + uv, each entry is 4-byte float.\n    webgl_util.callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, vertexBuffer));\n    const success = webgl_util.bindVertexBufferToProgramAttribute(gl, program, 'clipSpacePos', vertexBuffer, 3, stride, posOffset);\n    return success &&\n        webgl_util.bindVertexBufferToProgramAttribute(gl, program, 'uv', vertexBuffer, 2, stride, uvOffset);\n}\nexport function uploadDenseMatrixToTexture(gl, texture, width, height, data, textureConfig) {\n    webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, texture));\n    let dataForUpload, texelDataType, internalFormat;\n    if (data instanceof Uint8Array) {\n        dataForUpload = new Uint8Array(width * height * 4);\n        texelDataType = gl.UNSIGNED_BYTE;\n        internalFormat = gl.RGBA;\n    }\n    else {\n        dataForUpload = new Float32Array(width * height * 4);\n        texelDataType = gl.FLOAT;\n        internalFormat = textureConfig.internalFormatPackedFloat;\n    }\n    dataForUpload.set(data);\n    if (env().getNumber('WEBGL_VERSION') === 2) {\n        webgl_util.callAndCheck(gl, () => gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, width, height, gl.RGBA, texelDataType, dataForUpload));\n    }\n    else {\n        webgl_util.callAndCheck(gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, internalFormat, width, height, 0, gl.RGBA, texelDataType, dataForUpload));\n    }\n    webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null));\n}\nexport function uploadPixelDataToTexture(gl, texture, pixels) {\n    webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, texture));\n    if (pixels.data instanceof Uint8Array) {\n        if (env().getNumber('WEBGL_VERSION') === 2) {\n            webgl_util.callAndCheck(gl, () => gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, pixels.width, pixels.height, gl.RGBA, gl.UNSIGNED_BYTE, pixels.data));\n        }\n        else {\n            webgl_util.callAndCheck(gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, pixels.width, pixels.height, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels.data));\n        }\n    }\n    else {\n        if (env().getNumber('WEBGL_VERSION') === 2) {\n            webgl_util.callAndCheck(gl, () => gl.texSubImage2D(gl.TEXTURE_2D, 0, 0, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels));\n        }\n        else {\n            webgl_util.callAndCheck(gl, () => gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, pixels));\n        }\n    }\n    webgl_util.callAndCheck(gl, () => gl.bindTexture(gl.TEXTURE_2D, null));\n}\nexport function createBufferFromOutputTexture(gl2, rows, columns, textureConfig) {\n    // Create and bind the buffer.\n    const buffer = gl2.createBuffer();\n    webgl_util.callAndCheck(gl2, () => gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer));\n    // Initialize the buffer to the size of the texture in bytes.\n    const bytesPerFloat = 4;\n    const valuesPerTexel = 4;\n    const bufferSizeBytes = bytesPerFloat * valuesPerTexel * rows * columns;\n    webgl_util.callAndCheck(gl2, () => gl2.bufferData(gl2.PIXEL_PACK_BUFFER, bufferSizeBytes, gl2.STREAM_READ));\n    // Enqueue a command on the GPU command queue to copy of texture into the\n    // buffer.\n    webgl_util.callAndCheck(gl2, () => gl2.readPixels(0, 0, columns, rows, gl2.RGBA, gl2.FLOAT, 0));\n    webgl_util.callAndCheck(gl2, () => gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null));\n    return buffer;\n}\nexport function downloadFloat32MatrixFromBuffer(gl, buffer, size) {\n    const gl2 = gl;\n    const downloadTarget = new Float32Array(size);\n    gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer);\n    gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget);\n    gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null);\n    return downloadTarget;\n}\nexport function downloadByteEncodedFloatMatrixFromOutputTexture(gl, rows, columns, textureConfig) {\n    const [w, h] = tex_util.getUnpackedMatrixTextureShapeWidthHeight(rows, columns);\n    const numChannels = 4;\n    const downloadTarget = new Uint8Array(tex_util.getUnpackedArraySizeFromMatrixSize(rows * columns, numChannels));\n    webgl_util.callAndCheck(gl, () => gl.readPixels(0, 0, w, h, textureConfig.downloadTextureFormat, gl.UNSIGNED_BYTE, downloadTarget));\n    // By wrapping the buffer in a Float32Array, we use native browser IEEE 754\n    // decoding of the 4 bytes that back each 32 bit float.\n    return new Float32Array(downloadTarget.buffer);\n}\nexport function downloadPackedMatrixFromBuffer(gl, buffer, batch, rows, cols, physicalRows, physicalCols, textureConfig) {\n    const gl2 = gl;\n    const downloadTarget = new Float32Array(tex_util.getPackedRGBAArraySizeFromMatrixShape(physicalRows, physicalCols));\n    gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, buffer);\n    gl2.getBufferSubData(gl2.PIXEL_PACK_BUFFER, 0, downloadTarget);\n    gl2.bindBuffer(gl2.PIXEL_PACK_BUFFER, null);\n    return downloadTarget;\n}\nexport function downloadMatrixFromPackedOutputTexture(gl, physicalRows, physicalCols) {\n    const packedRGBA = new Float32Array(physicalRows * physicalCols * 4);\n    webgl_util.callAndCheck(gl, () => gl.readPixels(0, 0, physicalCols, physicalRows, gl.RGBA, gl.FLOAT, packedRGBA));\n    return packedRGBA;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3BncHVfdXRpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ3BncHVfdXRpbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUF3QixNQUFNLHVCQUF1QixDQUFDO0FBRWpFLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sS0FBSyxRQUFRLE1BQU0sWUFBWSxDQUFDO0FBRXZDLE9BQU8sS0FBSyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBRTNDLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxFQUF5QjtJQUMxRCxNQUFNLElBQUksR0FBRyxrQkFBa0IsRUFBRSxDQUFDO0lBQ2xDLE1BQU0sa0JBQWtCLEdBQUcsR0FBRyxJQUFJLENBQUMsT0FBTzs7TUFFdEMsSUFBSSxDQUFDLFNBQVM7TUFDZCxJQUFJLENBQUMsU0FBUztNQUNkLElBQUksQ0FBQyxTQUFTOzs7OztNQUtkLENBQUM7SUFDTCxPQUFPLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQyxFQUFFLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxVQUFVLGtCQUFrQixDQUFDLEVBQXlCO0lBQzFELG1FQUFtRTtJQUNuRSxNQUFNLFdBQVcsR0FBRyxJQUFJLFlBQVksQ0FDaEMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxD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QUFNLFVBQVUscUNBQXFDLENBQ2pELEVBQXlCLEVBQUUsWUFBb0IsRUFDL0MsWUFBb0I7SUFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxZQUFZLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNyRSxVQUFVLENBQUMsWUFBWSxDQUNuQixFQUFFLEVBQ0YsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FDZixDQUFDLEVBQUUsQ0FBQyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFFMUUsT0FBTyxVQUFVLENBQUM7QUFDcEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIFBpeGVsRGF0YSwgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtnZXRHbHNsRGlmZmVyZW5jZXN9IGZyb20gJy4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCAqIGFzIHRleF91dGlsIGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlLCBUZXh0dXJlQ29uZmlnfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVZlcnRleFNoYWRlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTogV2ViR0xTaGFkZXIge1xuICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gIGNvbnN0IHZlcnRleFNoYWRlclNvdXJjZSA9IGAke2dsc2wudmVyc2lvbn1cbiAgICBwcmVjaXNpb24gaGlnaHAgZmxvYXQ7XG4gICAgJHtnbHNsLmF0dHJpYnV0ZX0gdmVjMyBjbGlwU3BhY2VQb3M7XG4gICAgJHtnbHNsLmF0dHJpYnV0ZX0gdmVjMiB1djtcbiAgICAke2dsc2wudmFyeWluZ1ZzfSB2ZWMyIHJlc3VsdFVWO1xuXG4gICAgdm9pZCBtYWluKCkge1xuICAgICAgZ2xfUG9zaXRpb24gPSB2ZWM0KGNsaXBTcGFjZVBvcywgMSk7XG4gICAgICByZXN1bHRVViA9IHV2O1xuICAgIH1gO1xuICByZXR1cm4gd2ViZ2xfdXRpbC5jcmVhdGVWZXJ0ZXhTaGFkZXIoZ2wsIHZlcnRleFNoYWRlclNvdXJjZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVWZXJ0ZXhCdWZmZXIoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IFdlYkdMQnVmZmVyIHtcbiAgLy8gW3ggeSB6IHUgdl0gKiBbdXBwZXItbGVmdCwgbG93ZXItbGVmdCwgdXBwZXItcmlnaHQsIGxvd2VyLXJpZ2h0XVxuICBjb25zdCB2ZXJ0ZXhBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoXG4gICAgICBbLTEsIDEsIDAsIDAsIDEsIC0xLCAtMSwgMCwgMCwgMCwgMSwgMSwgMCwgMSwgMSwgMSwgLTEsIDAsIDEsIDBdKTtcbiAgcmV0dXJuIHdlYmdsX3V0aWwuY3JlYXRlU3RhdGljVmVydGV4QnVmZmVyKGdsLCB2ZXJ0ZXhBcnJheSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVJbmRleEJ1ZmZlcihnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0KTogV2ViR0xCdWZmZXIge1xuICAvLyBPcGVuR0wgKGFuZCBXZWJHTCkgaGF2ZSBcIkNDVyA9PSBmcm9udFwiIHdpbmRpbmdcbiAgY29uc3QgdHJpYW5nbGVWZXJ0ZXhJbmRpY2VzID0gbmV3IFVpbnQxNkFycmF5KFswLCAxLCAyLCAyLCAxLCAzXSk7XG4gIHJldHVybiB3ZWJnbF91dGlsLmNyZWF0ZVN0YXRpY0luZGV4QnVmZmVyKGdsLCB0cmlhbmdsZVZlcnRleEluZGljZXMpO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVBbmRDb25maWd1cmVUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHdpZHRoOiBudW1iZXIsIGhlaWdodDogbnVtYmVyLFxuICAgIGludGVybmFsRm9ybWF0OiBudW1iZXIsIHRleHR1cmVGb3JtYXQ6IG51bWJlcixcbiAgICB0ZXh0dXJlVHlwZTogbnVtYmVyKTogVGV4dHVyZSB7XG4gIHdlYmdsX3V0aWwudmFsaWRhdGVUZXh0dXJlU2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgY29uc3QgdGV4dHVyZSA9IHdlYmdsX3V0aWwuY3JlYXRlVGV4dHVyZShnbCk7XG5cbiAgY29uc3QgdGV4MmQgPSBnbC5URVhUVVJFXzJEO1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUodGV4MmQsIHRleHR1cmUpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9XUkFQX1MsIGdsLkNMQU1QX1RPX0VER0UpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9XUkFQX1QsIGdsLkNMQU1QX1RPX0VER0UpKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wudGV4UGFyYW1ldGVyaSh0ZXgyZCwgZ2wuVEVYVFVSRV9NSU5fRklMVEVSLCBnbC5ORUFSRVNUKSk7XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgZ2wsICgpID0+IGdsLnRleFBhcmFtZXRlcmkodGV4MmQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTkVBUkVTVCkpO1xuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgZ2wsXG4gICAgICAgICgpID0+IGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgICB0ZXgyZCwgMCwgaW50ZXJuYWxGb3JtYXQsIHdpZHRoLCBoZWlnaHQsIDAsIHRleHR1cmVGb3JtYXQsXG4gICAgICAgICAgICB0ZXh0dXJlVHlwZSwgbnVsbCkpO1xuICB9IGVsc2Uge1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCxcbiAgICAgICAgKCkgPT4gKGdsIGFzIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQpXG4gICAgICAgICAgICAgICAgICAudGV4U3RvcmFnZTJEKHRleDJkLCAxLCBpbnRlcm5hbEZvcm1hdCwgd2lkdGgsIGhlaWdodCkpO1xuICB9XG4gIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kVGV4dHVyZShnbC5URVhUVVJFXzJELCBudWxsKSk7XG5cbiAgcmV0dXJuIHt0ZXh0dXJlLCB0ZXhTaGFwZTogW2hlaWdodCwgd2lkdGhdfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUoXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZykge1xuICByZXR1cm4gdGV4dHVyZUNvbmZpZy5pbnRlcm5hbEZvcm1hdEZsb2F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFRleHR1cmUge1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQzMk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICB0ZXh0dXJlQ29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgZ2wuRkxPQVQpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZShcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIHJldHVybiB0ZXh0dXJlQ29uZmlnLmludGVybmFsRm9ybWF0SGFsZkZsb2F0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFRleHR1cmUge1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNk1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICB0ZXh0dXJlQ29uZmlnLnRleHR1cmVGb3JtYXRGbG9hdCwgdGV4dHVyZUNvbmZpZy50ZXh0dXJlVHlwZUhhbGZGbG9hdCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgcmV0dXJuIHRleHR1cmVDb25maWcuZG93bmxvYWRUZXh0dXJlRm9ybWF0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFRleHR1cmUge1xuICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksIGdsLlJHQkEsXG4gICAgICBnbC5VTlNJR05FRF9CWVRFKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldEludGVybmFsRm9ybWF0Rm9yUGFja2VkTWF0cml4VGV4dHVyZShcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKSB7XG4gIHJldHVybiB0ZXh0dXJlQ29uZmlnLmludGVybmFsRm9ybWF0UGFja2VkRmxvYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBUZXh0dXJlIHtcbiAgY29uc3QgW3dpZHRoLCBoZWlnaHRdID1cbiAgICAgIHRleF91dGlsLmdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHJvd3MsIGNvbHVtbnMpO1xuICByZXR1cm4gY3JlYXRlQW5kQ29uZmlndXJlVGV4dHVyZShcbiAgICAgIGdsLCB3aWR0aCwgaGVpZ2h0LCBnZXRJbnRlcm5hbEZvcm1hdEZvclBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksXG4gICAgICBnbC5SR0JBLCBnbC5GTE9BVCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgcmV0dXJuIHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRQYWNrZWRIYWxmRmxvYXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCByb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcixcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogVGV4dHVyZSB7XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9XG4gICAgICB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgcmV0dXJuIGNyZWF0ZUFuZENvbmZpZ3VyZVRleHR1cmUoXG4gICAgICBnbCwgd2lkdGgsIGhlaWdodCxcbiAgICAgIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyksIGdsLlJHQkEsXG4gICAgICB0ZXh0dXJlQ29uZmlnLnRleHR1cmVUeXBlSGFsZkZsb2F0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJpbmRWZXJ0ZXhQcm9ncmFtQXR0cmlidXRlU3RyZWFtcyhcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwcm9ncmFtOiBXZWJHTFByb2dyYW0sXG4gICAgdmVydGV4QnVmZmVyOiBXZWJHTEJ1ZmZlcik6IGJvb2xlYW4ge1xuICBjb25zdCBwb3NPZmZzZXQgPSAwOyAgICAgICAgICAgICAgIC8vIHggaXMgdGhlIGZpcnN0IGJ1ZmZlciBlbGVtZW50XG4gIGNvbnN0IHV2T2Zmc2V0ID0gMyAqIDQ7ICAgICAgICAgICAgLy8gdXYgY29tZXMgYWZ0ZXIgW3ggeSB6XVxuICBjb25zdCBzdHJpZGUgPSAoMyAqIDQpICsgKDIgKiA0KTsgIC8vIHh5eiArIHV2LCBlYWNoIGVudHJ5IGlzIDQtYnl0ZSBmbG9hdC5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5BUlJBWV9CVUZGRVIsIHZlcnRleEJ1ZmZlcikpO1xuICBjb25zdCBzdWNjZXNzID0gd2ViZ2xfdXRpbC5iaW5kVmVydGV4QnVmZmVyVG9Qcm9ncmFtQXR0cmlidXRlKFxuICAgICAgZ2wsIHByb2dyYW0sICdjbGlwU3BhY2VQb3MnLCB2ZXJ0ZXhCdWZmZXIsIDMsIHN0cmlkZSwgcG9zT2Zmc2V0KTtcbiAgcmV0dXJuIHN1Y2Nlc3MgJiZcbiAgICAgIHdlYmdsX3V0aWwuYmluZFZlcnRleEJ1ZmZlclRvUHJvZ3JhbUF0dHJpYnV0ZShcbiAgICAgICAgICBnbCwgcHJvZ3JhbSwgJ3V2JywgdmVydGV4QnVmZmVyLCAyLCBzdHJpZGUsIHV2T2Zmc2V0KTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgd2lkdGg6IG51bWJlcixcbiAgICBoZWlnaHQ6IG51bWJlciwgZGF0YTogVHlwZWRBcnJheSwgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZykge1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSkpO1xuXG4gIGxldCBkYXRhRm9yVXBsb2FkOiBUeXBlZEFycmF5LCB0ZXhlbERhdGFUeXBlOiBudW1iZXIsIGludGVybmFsRm9ybWF0OiBudW1iZXI7XG4gIGlmIChkYXRhIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgIGRhdGFGb3JVcGxvYWQgPSBuZXcgVWludDhBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICAgIHRleGVsRGF0YVR5cGUgPSBnbC5VTlNJR05FRF9CWVRFO1xuICAgIGludGVybmFsRm9ybWF0ID0gZ2wuUkdCQTtcbiAgfSBlbHNlIHtcbiAgICBkYXRhRm9yVXBsb2FkID0gbmV3IEZsb2F0MzJBcnJheSh3aWR0aCAqIGhlaWdodCAqIDQpO1xuICAgIHRleGVsRGF0YVR5cGUgPSBnbC5GTE9BVDtcbiAgICBpbnRlcm5hbEZvcm1hdCA9IHRleHR1cmVDb25maWcuaW50ZXJuYWxGb3JtYXRQYWNrZWRGbG9hdDtcbiAgfVxuXG4gIGRhdGFGb3JVcGxvYWQuc2V0KGRhdGEpO1xuICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDIpIHtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgZ2wsXG4gICAgICAgICgpID0+IGdsLnRleFN1YkltYWdlMkQoXG4gICAgICAgICAgICBnbC5URVhUVVJFXzJELCAwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0LCBnbC5SR0JBLCB0ZXhlbERhdGFUeXBlLFxuICAgICAgICAgICAgZGF0YUZvclVwbG9hZCkpO1xuICB9IGVsc2Uge1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCxcbiAgICAgICAgKCkgPT4gZ2wudGV4SW1hZ2UyRChcbiAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIGludGVybmFsRm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCAwLCBnbC5SR0JBLFxuICAgICAgICAgICAgdGV4ZWxEYXRhVHlwZSwgZGF0YUZvclVwbG9hZCkpO1xuICB9XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgcGl4ZWxzOiBQaXhlbERhdGF8SW1hZ2VEYXRhfEhUTUxJbWFnZUVsZW1lbnR8SFRNTENhbnZhc0VsZW1lbnR8XG4gICAgSFRNTFZpZGVvRWxlbWVudHxJbWFnZUJpdG1hcCkge1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYmluZFRleHR1cmUoZ2wuVEVYVFVSRV8yRCwgdGV4dHVyZSkpO1xuICBpZiAoKHBpeGVscyBhcyBQaXhlbERhdGEpLmRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgICBnbCxcbiAgICAgICAgICAoKSA9PiBnbC50ZXhTdWJJbWFnZTJEKFxuICAgICAgICAgICAgICBnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBwaXhlbHMud2lkdGgsIHBpeGVscy5oZWlnaHQsIGdsLlJHQkEsXG4gICAgICAgICAgICAgIGdsLlVOU0lHTkVEX0JZVEUsIChwaXhlbHMgYXMgUGl4ZWxEYXRhKS5kYXRhKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICAgIGdsLFxuICAgICAgICAgICgpID0+IGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIHBpeGVscy53aWR0aCwgcGl4ZWxzLmhlaWdodCwgMCxcbiAgICAgICAgICAgICAgZ2wuUkdCQSwgZ2wuVU5TSUdORURfQllURSwgKHBpeGVscyBhcyBQaXhlbERhdGEpLmRhdGEpKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyKSB7XG4gICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgICBnbCxcbiAgICAgICAgICAoKSA9PiBnbC50ZXhTdWJJbWFnZTJEKFxuICAgICAgICAgICAgICBnbC5URVhUVVJFXzJELCAwLCAwLCAwLCBnbC5SR0JBLCBnbC5VTlNJR05FRF9CWVRFLFxuICAgICAgICAgICAgICAocGl4ZWxzIGFzIEltYWdlRGF0YSB8IEhUTUxJbWFnZUVsZW1lbnQgfCBIVE1MQ2FudmFzRWxlbWVudCB8XG4gICAgICAgICAgICAgICBIVE1MVmlkZW9FbGVtZW50IHwgSW1hZ2VCaXRtYXApKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICAgIGdsLFxuICAgICAgICAgICgpID0+IGdsLnRleEltYWdlMkQoXG4gICAgICAgICAgICAgIGdsLlRFWFRVUkVfMkQsIDAsIGdsLlJHQkEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsXG4gICAgICAgICAgICAgIHBpeGVscyBhcyBJbWFnZURhdGEgfCBIVE1MSW1hZ2VFbGVtZW50IHwgSFRNTENhbnZhc0VsZW1lbnQgfFxuICAgICAgICAgICAgICAgICAgSFRNTFZpZGVvRWxlbWVudCB8IEltYWdlQml0bWFwKSk7XG4gICAgfVxuICB9XG5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soZ2wsICgpID0+IGdsLmJpbmRUZXh0dXJlKGdsLlRFWFRVUkVfMkQsIG51bGwpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlckZyb21PdXRwdXRUZXh0dXJlKFxuICAgIGdsMjogV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgdGV4dHVyZUNvbmZpZzogVGV4dHVyZUNvbmZpZyk6IFdlYkdMQnVmZmVyIHtcbiAgLy8gQ3JlYXRlIGFuZCBiaW5kIHRoZSBidWZmZXIuXG4gIGNvbnN0IGJ1ZmZlciA9IGdsMi5jcmVhdGVCdWZmZXIoKTtcbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbDIsICgpID0+IGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyKSk7XG5cbiAgLy8gSW5pdGlhbGl6ZSB0aGUgYnVmZmVyIHRvIHRoZSBzaXplIG9mIHRoZSB0ZXh0dXJlIGluIGJ5dGVzLlxuICBjb25zdCBieXRlc1BlckZsb2F0ID0gNDtcbiAgY29uc3QgdmFsdWVzUGVyVGV4ZWwgPSA0O1xuICBjb25zdCBidWZmZXJTaXplQnl0ZXMgPSBieXRlc1BlckZsb2F0ICogdmFsdWVzUGVyVGV4ZWwgKiByb3dzICogY29sdW1ucztcblxuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsMixcbiAgICAgICgpID0+IGdsMi5idWZmZXJEYXRhKFxuICAgICAgICAgIGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyU2l6ZUJ5dGVzLCBnbDIuU1RSRUFNX1JFQUQpKTtcblxuICAvLyBFbnF1ZXVlIGEgY29tbWFuZCBvbiB0aGUgR1BVIGNvbW1hbmQgcXVldWUgdG8gY29weSBvZiB0ZXh0dXJlIGludG8gdGhlXG4gIC8vIGJ1ZmZlci5cbiAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICBnbDIsICgpID0+IGdsMi5yZWFkUGl4ZWxzKDAsIDAsIGNvbHVtbnMsIHJvd3MsIGdsMi5SR0JBLCBnbDIuRkxPQVQsIDApKTtcblxuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsMiwgKCkgPT4gZ2wyLmJpbmRCdWZmZXIoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCBudWxsKSk7XG5cbiAgcmV0dXJuIGJ1ZmZlcjtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkRmxvYXQzMk1hdHJpeEZyb21CdWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgYnVmZmVyOiBXZWJHTEJ1ZmZlcixcbiAgICBzaXplOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBnbDIgPSBnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gIGNvbnN0IGRvd25sb2FkVGFyZ2V0ID0gbmV3IEZsb2F0MzJBcnJheShzaXplKTtcblxuICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIGJ1ZmZlcik7XG4gIGdsMi5nZXRCdWZmZXJTdWJEYXRhKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgMCwgZG93bmxvYWRUYXJnZXQpO1xuICBnbDIuYmluZEJ1ZmZlcihnbDIuUElYRUxfUEFDS19CVUZGRVIsIG51bGwpO1xuXG4gIHJldHVybiBkb3dubG9hZFRhcmdldDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpIHtcbiAgY29uc3QgW3csIGhdID1cbiAgICAgIHRleF91dGlsLmdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQocm93cywgY29sdW1ucyk7XG5cbiAgY29uc3QgbnVtQ2hhbm5lbHMgPSA0O1xuICBjb25zdCBkb3dubG9hZFRhcmdldCA9IG5ldyBVaW50OEFycmF5KFxuICAgICAgdGV4X3V0aWwuZ2V0VW5wYWNrZWRBcnJheVNpemVGcm9tTWF0cml4U2l6ZShyb3dzICogY29sdW1ucywgbnVtQ2hhbm5lbHMpKTtcblxuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wucmVhZFBpeGVscyhcbiAgICAgICAgICAwLCAwLCB3LCBoLCB0ZXh0dXJlQ29uZmlnLmRvd25sb2FkVGV4dHVyZUZvcm1hdCwgZ2wuVU5TSUdORURfQllURSxcbiAgICAgICAgICBkb3dubG9hZFRhcmdldCkpO1xuXG4gIC8vIEJ5IHdyYXBwaW5nIHRoZSBidWZmZXIgaW4gYSBGbG9hdDMyQXJyYXksIHdlIHVzZSBuYXRpdmUgYnJvd3NlciBJRUVFIDc1NFxuICAvLyBkZWNvZGluZyBvZiB0aGUgNCBieXRlcyB0aGF0IGJhY2sgZWFjaCAzMiBiaXQgZmxvYXQuXG4gIHJldHVybiBuZXcgRmxvYXQzMkFycmF5KGRvd25sb2FkVGFyZ2V0LmJ1ZmZlcik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkb3dubG9hZFBhY2tlZE1hdHJpeEZyb21CdWZmZXIoXG4gICAgZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCwgYnVmZmVyOiBXZWJHTEJ1ZmZlciwgYmF0Y2g6IG51bWJlciwgcm93czogbnVtYmVyLFxuICAgIGNvbHM6IG51bWJlciwgcGh5c2ljYWxSb3dzOiBudW1iZXIsIHBoeXNpY2FsQ29sczogbnVtYmVyLFxuICAgIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcpOiBGbG9hdDMyQXJyYXkge1xuICBjb25zdCBnbDIgPSBnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gIGNvbnN0IGRvd25sb2FkVGFyZ2V0ID1cbiAgICAgIG5ldyBGbG9hdDMyQXJyYXkodGV4X3V0aWwuZ2V0UGFja2VkUkdCQUFycmF5U2l6ZUZyb21NYXRyaXhTaGFwZShcbiAgICAgICAgICBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuXG4gIGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgYnVmZmVyKTtcbiAgZ2wyLmdldEJ1ZmZlclN1YkRhdGEoZ2wyLlBJWEVMX1BBQ0tfQlVGRkVSLCAwLCBkb3dubG9hZFRhcmdldCk7XG4gIGdsMi5iaW5kQnVmZmVyKGdsMi5QSVhFTF9QQUNLX0JVRkZFUiwgbnVsbCk7XG5cbiAgcmV0dXJuIGRvd25sb2FkVGFyZ2V0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZG93bmxvYWRNYXRyaXhGcm9tUGFja2VkT3V0cHV0VGV4dHVyZShcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBwaHlzaWNhbFJvd3M6IG51bWJlcixcbiAgICBwaHlzaWNhbENvbHM6IG51bWJlcik6IEZsb2F0MzJBcnJheSB7XG4gIGNvbnN0IHBhY2tlZFJHQkEgPSBuZXcgRmxvYXQzMkFycmF5KHBoeXNpY2FsUm93cyAqIHBoeXNpY2FsQ29scyAqIDQpO1xuICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgIGdsLFxuICAgICAgKCkgPT4gZ2wucmVhZFBpeGVscyhcbiAgICAgICAgICAwLCAwLCBwaHlzaWNhbENvbHMsIHBoeXNpY2FsUm93cywgZ2wuUkdCQSwgZ2wuRkxPQVQsIHBhY2tlZFJHQkEpKTtcblxuICByZXR1cm4gcGFja2VkUkdCQTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, util } from '@tensorflow/tfjs-core';\nimport { getWebGLContext, setWebGLContext } from './canvas_util';\nimport * as gpgpu_util from './gpgpu_util';\nimport * as tex_util from './tex_util';\nimport * as webgl_util from './webgl_util';\nexport class GPGPUContext {\n    constructor(gl) {\n        this.outputTexture = null;\n        this.program = null;\n        this.disposed = false;\n        this.vertexAttrsAreBound = false;\n        this.itemsToPoll = [];\n        const glVersion = env().getNumber('WEBGL_VERSION');\n        if (gl != null) {\n            this.gl = gl;\n            setWebGLContext(glVersion, gl);\n        }\n        else {\n            this.gl = getWebGLContext(glVersion);\n        }\n        // WebGL 2.0 enables texture floats without an extension.\n        let COLOR_BUFFER_FLOAT = 'WEBGL_color_buffer_float';\n        const COLOR_BUFFER_HALF_FLOAT = 'EXT_color_buffer_half_float';\n        this.parallelCompilationExtension =\n            this.gl.getExtension('KHR_parallel_shader_compile');\n        if (env().getNumber('WEBGL_VERSION') === 1) {\n            const TEXTURE_FLOAT = 'OES_texture_float';\n            const TEXTURE_HALF_FLOAT = 'OES_texture_half_float';\n            this.textureFloatExtension =\n                webgl_util.getExtensionOrThrow(this.gl, TEXTURE_FLOAT);\n            if (webgl_util.hasExtension(this.gl, TEXTURE_HALF_FLOAT)) {\n                this.textureHalfFloatExtension =\n                    webgl_util.getExtensionOrThrow(this.gl, TEXTURE_HALF_FLOAT);\n            }\n            else if (env().get('WEBGL_FORCE_F16_TEXTURES')) {\n                throw new Error('GL context does not support half float textures, yet the ' +\n                    'environment flag WEBGL_FORCE_F16_TEXTURES is set to true.');\n            }\n            this.colorBufferFloatExtension = this.gl.getExtension(COLOR_BUFFER_FLOAT);\n            if (webgl_util.hasExtension(this.gl, COLOR_BUFFER_HALF_FLOAT)) {\n                this.colorBufferHalfFloatExtension =\n                    webgl_util.getExtensionOrThrow(this.gl, COLOR_BUFFER_HALF_FLOAT);\n            }\n            else if (env().get('WEBGL_FORCE_F16_TEXTURES')) {\n                throw new Error('GL context does not support color renderable half floats, yet ' +\n                    'the environment flag WEBGL_FORCE_F16_TEXTURES is set to true.');\n            }\n        }\n        else {\n            COLOR_BUFFER_FLOAT = 'EXT_color_buffer_float';\n            if (webgl_util.hasExtension(this.gl, COLOR_BUFFER_FLOAT)) {\n                this.colorBufferFloatExtension =\n                    this.gl.getExtension(COLOR_BUFFER_FLOAT);\n            }\n            else if (webgl_util.hasExtension(this.gl, COLOR_BUFFER_HALF_FLOAT)) {\n                this.colorBufferHalfFloatExtension =\n                    this.gl.getExtension(COLOR_BUFFER_HALF_FLOAT);\n            }\n            else {\n                throw new Error('GL context does not support color renderable floats');\n            }\n        }\n        this.vertexBuffer = gpgpu_util.createVertexBuffer(this.gl);\n        this.indexBuffer = gpgpu_util.createIndexBuffer(this.gl);\n        this.framebuffer = webgl_util.createFramebuffer(this.gl);\n        this.textureConfig =\n            tex_util.getTextureConfig(this.gl, this.textureHalfFloatExtension);\n    }\n    get debug() {\n        return env().getBool('DEBUG');\n    }\n    dispose() {\n        if (this.disposed) {\n            return;\n        }\n        if (this.program != null) {\n            console.warn('Disposing a GPGPUContext that still has a bound WebGLProgram.' +\n                ' This is probably a resource leak, delete the program with ' +\n                'GPGPUContext.deleteProgram before disposing.');\n        }\n        if (this.outputTexture != null) {\n            console.warn('Disposing a GPGPUContext that still has a bound output matrix ' +\n                'texture.  This is probably a resource leak, delete the output ' +\n                'matrix texture with GPGPUContext.deleteMatrixTexture before ' +\n                'disposing.');\n        }\n        const gl = this.gl;\n        webgl_util.callAndCheck(gl, () => gl.finish());\n        webgl_util.callAndCheck(gl, () => gl.bindFramebuffer(gl.FRAMEBUFFER, null));\n        webgl_util.callAndCheck(gl, () => gl.deleteFramebuffer(this.framebuffer));\n        webgl_util.callAndCheck(gl, () => gl.bindBuffer(gl.ARRAY_BUFFER, null));\n        webgl_util.callAndCheck(gl, () => gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null));\n        webgl_util.callAndCheck(gl, () => gl.deleteBuffer(this.indexBuffer));\n        this.disposed = true;\n    }\n    createFloat32MatrixTexture(rows, columns) {\n        this.throwIfDisposed();\n        return gpgpu_util.createFloat32MatrixTexture(this.gl, rows, columns, this.textureConfig);\n    }\n    createFloat16MatrixTexture(rows, columns) {\n        this.throwIfDisposed();\n        return gpgpu_util.createFloat16MatrixTexture(this.gl, rows, columns, this.textureConfig);\n    }\n    createUnsignedBytesMatrixTexture(rows, columns) {\n        this.throwIfDisposed();\n        return gpgpu_util.createUnsignedBytesMatrixTexture(this.gl, rows, columns, this.textureConfig);\n    }\n    uploadPixelDataToTexture(texture, pixels) {\n        this.throwIfDisposed();\n        gpgpu_util.uploadPixelDataToTexture(this.gl, texture, pixels);\n    }\n    uploadDenseMatrixToTexture(texture, width, height, data) {\n        this.throwIfDisposed();\n        gpgpu_util.uploadDenseMatrixToTexture(this.gl, texture, width, height, data, this.textureConfig);\n    }\n    createFloat16PackedMatrixTexture(rows, columns) {\n        this.throwIfDisposed();\n        return gpgpu_util.createFloat16PackedMatrixTexture(this.gl, rows, columns, this.textureConfig);\n    }\n    createPackedMatrixTexture(rows, columns) {\n        this.throwIfDisposed();\n        return gpgpu_util.createPackedMatrixTexture(this.gl, rows, columns, this.textureConfig);\n    }\n    deleteMatrixTexture(texture) {\n        this.throwIfDisposed();\n        if (this.outputTexture === texture) {\n            webgl_util.unbindColorTextureFromFramebuffer(this.gl, this.framebuffer);\n            this.outputTexture = null;\n        }\n        webgl_util.callAndCheck(this.gl, () => this.gl.deleteTexture(texture));\n    }\n    downloadByteEncodedFloatMatrixFromOutputTexture(texture, rows, columns) {\n        return this.downloadMatrixDriver(texture, () => gpgpu_util.downloadByteEncodedFloatMatrixFromOutputTexture(this.gl, rows, columns, this.textureConfig));\n    }\n    downloadPackedMatrixFromBuffer(buffer, batch, rows, columns, physicalRows, physicalCols) {\n        return gpgpu_util.downloadPackedMatrixFromBuffer(this.gl, buffer, batch, rows, columns, physicalRows, physicalCols, this.textureConfig);\n    }\n    downloadFloat32MatrixFromBuffer(buffer, size) {\n        return gpgpu_util.downloadFloat32MatrixFromBuffer(this.gl, buffer, size);\n    }\n    createBufferFromTexture(texture, rows, columns) {\n        this.bindTextureToFrameBuffer(texture);\n        const result = gpgpu_util.createBufferFromOutputTexture(this.gl, rows, columns, this.textureConfig);\n        this.unbindTextureToFrameBuffer();\n        return result;\n    }\n    createAndWaitForFence() {\n        const fenceContext = this.createFence(this.gl);\n        return this.pollFence(fenceContext);\n    }\n    createFence(gl) {\n        let query;\n        let isFencePassed;\n        if (env().getBool('WEBGL_FENCE_API_ENABLED')) {\n            const gl2 = gl;\n            const sync = gl2.fenceSync(gl2.SYNC_GPU_COMMANDS_COMPLETE, 0);\n            gl.flush();\n            isFencePassed = () => {\n                const status = gl2.clientWaitSync(sync, 0, 0);\n                return status === gl2.ALREADY_SIGNALED ||\n                    status === gl2.CONDITION_SATISFIED;\n            };\n            query = sync;\n        }\n        else if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') > 0) {\n            query = this.beginQuery();\n            this.endQuery();\n            isFencePassed = () => this.isQueryAvailable(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION'));\n        }\n        else {\n            // If we have no way to fence, return true immediately. This will fire in\n            // WebGL 1.0 when there is no disjoint query timer. In this case, because\n            // the fence passes immediately, we'll immediately ask for a download of\n            // the texture, which will cause the UI thread to hang.\n            isFencePassed = () => true;\n        }\n        return { query, isFencePassed };\n    }\n    downloadMatrixFromPackedTexture(texture, physicalRows, physicalCols) {\n        return this.downloadMatrixDriver(texture, () => gpgpu_util.downloadMatrixFromPackedOutputTexture(this.gl, physicalRows, physicalCols));\n    }\n    createProgram(fragmentShader) {\n        this.throwIfDisposed();\n        const gl = this.gl;\n        if (this.vertexShader == null) {\n            this.vertexShader = gpgpu_util.createVertexShader(gl);\n        }\n        const program = webgl_util.createProgram(gl);\n        webgl_util.callAndCheck(gl, () => gl.attachShader(program, this.vertexShader));\n        webgl_util.callAndCheck(gl, () => gl.attachShader(program, fragmentShader));\n        webgl_util.linkProgram(gl, program);\n        if (this.debug) {\n            webgl_util.validateProgram(gl, program);\n        }\n        if (!this.vertexAttrsAreBound) {\n            this.setProgram(program);\n            this.vertexAttrsAreBound = gpgpu_util.bindVertexProgramAttributeStreams(gl, this.program, this.vertexBuffer);\n        }\n        return program;\n    }\n    deleteProgram(program) {\n        this.throwIfDisposed();\n        if (program === this.program) {\n            this.program = null;\n        }\n        if (program != null) {\n            webgl_util.callAndCheck(this.gl, () => this.gl.deleteProgram(program));\n        }\n    }\n    setProgram(program) {\n        this.throwIfDisposed();\n        this.program = program;\n        if ((this.program != null) && this.debug) {\n            webgl_util.validateProgram(this.gl, this.program);\n        }\n        webgl_util.callAndCheck(this.gl, () => this.gl.useProgram(program));\n    }\n    getUniformLocation(program, uniformName, shouldThrow = true) {\n        this.throwIfDisposed();\n        if (shouldThrow) {\n            return webgl_util.getProgramUniformLocationOrThrow(this.gl, program, uniformName);\n        }\n        else {\n            return webgl_util.getProgramUniformLocation(this.gl, program, uniformName);\n        }\n    }\n    getAttributeLocation(program, attribute) {\n        this.throwIfDisposed();\n        return webgl_util.callAndCheck(this.gl, () => this.gl.getAttribLocation(program, attribute));\n    }\n    getUniformLocationNoThrow(program, uniformName) {\n        this.throwIfDisposed();\n        return this.gl.getUniformLocation(program, uniformName);\n    }\n    setInputMatrixTexture(inputMatrixTexture, uniformLocation, textureUnit) {\n        this.throwIfDisposed();\n        this.throwIfNoProgram();\n        webgl_util.bindTextureToProgramUniformSampler(this.gl, inputMatrixTexture, uniformLocation, textureUnit);\n    }\n    setOutputMatrixTexture(outputMatrixTexture, rows, columns) {\n        this.setOutputMatrixTextureDriver(outputMatrixTexture, columns, rows);\n    }\n    setOutputPackedMatrixTexture(outputPackedMatrixTexture, rows, columns) {\n        this.throwIfDisposed();\n        const [width, height] = tex_util.getPackedMatrixTextureShapeWidthHeight(rows, columns);\n        this.setOutputMatrixTextureDriver(outputPackedMatrixTexture, width, height);\n    }\n    setOutputMatrixWriteRegion(startRow, numRows, startColumn, numColumns) {\n        this.setOutputMatrixWriteRegionDriver(startColumn, startRow, numColumns, numRows);\n    }\n    setOutputPackedMatrixWriteRegion(startRow, numRows, startColumn, numColumns) {\n        throw new Error('setOutputPackedMatrixWriteRegion not implemented.');\n    }\n    debugValidate() {\n        if (this.program != null) {\n            webgl_util.validateProgram(this.gl, this.program);\n        }\n        webgl_util.validateFramebuffer(this.gl);\n    }\n    executeProgram() {\n        this.throwIfDisposed();\n        this.throwIfNoProgram();\n        const gl = this.gl;\n        if (this.debug) {\n            this.debugValidate();\n        }\n        webgl_util.callAndCheck(gl, () => gl.drawElements(gl.TRIANGLES, 6, gl.UNSIGNED_SHORT, 0));\n    }\n    blockUntilAllProgramsCompleted() {\n        this.throwIfDisposed();\n        webgl_util.callAndCheck(this.gl, () => this.gl.finish());\n    }\n    getQueryTimerExtension() {\n        if (this.disjointQueryTimerExtension == null) {\n            this.disjointQueryTimerExtension =\n                webgl_util.getExtensionOrThrow(this.gl, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2 ?\n                    'EXT_disjoint_timer_query_webgl2' :\n                    'EXT_disjoint_timer_query');\n        }\n        return this.disjointQueryTimerExtension;\n    }\n    getQueryTimerExtensionWebGL2() {\n        return this.getQueryTimerExtension();\n    }\n    getQueryTimerExtensionWebGL1() {\n        return this.getQueryTimerExtension();\n    }\n    beginQuery() {\n        if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) {\n            const gl2 = this.gl;\n            const ext = this.getQueryTimerExtensionWebGL2();\n            const query = gl2.createQuery();\n            gl2.beginQuery(ext.TIME_ELAPSED_EXT, query);\n            return query;\n        }\n        const ext = this.getQueryTimerExtensionWebGL1();\n        const query = ext.createQueryEXT();\n        ext.beginQueryEXT(ext.TIME_ELAPSED_EXT, query);\n        return query;\n    }\n    endQuery() {\n        if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION') === 2) {\n            const gl2 = this.gl;\n            const ext = this.getQueryTimerExtensionWebGL2();\n            gl2.endQuery(ext.TIME_ELAPSED_EXT);\n            return;\n        }\n        const ext = this.getQueryTimerExtensionWebGL1();\n        ext.endQueryEXT(ext.TIME_ELAPSED_EXT);\n    }\n    async waitForQueryAndGetTime(query) {\n        await util.repeatedTry(() => this.disposed || // while testing contexts are created / disposed\n            // in rapid succession, so without this check we\n            // may poll for the query timer indefinitely\n            this.isQueryAvailable(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION')));\n        return this.getQueryTime(query, env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_VERSION'));\n    }\n    getQueryTime(query, queryTimerVersion) {\n        if (queryTimerVersion === 0) {\n            return null;\n        }\n        if (queryTimerVersion === 2) {\n            const gl2 = this.gl;\n            const timeElapsedNanos = gl2.getQueryParameter(query, gl2.QUERY_RESULT);\n            // Return milliseconds.\n            return timeElapsedNanos / 1000000;\n        }\n        else {\n            const ext = this.getQueryTimerExtensionWebGL1();\n            const timeElapsedNanos = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_EXT);\n            // Return milliseconds.\n            return timeElapsedNanos / 1000000;\n        }\n    }\n    isQueryAvailable(query, queryTimerVersion) {\n        if (queryTimerVersion === 0) {\n            return true;\n        }\n        if (queryTimerVersion === 2) {\n            const gl2 = this.gl;\n            const ext = this.getQueryTimerExtensionWebGL2();\n            const available = gl2.getQueryParameter(query, gl2.QUERY_RESULT_AVAILABLE);\n            if (this.disjoint == null) {\n                this.disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT);\n            }\n            return available && !this.disjoint;\n        }\n        else {\n            const ext = this.getQueryTimerExtensionWebGL1();\n            const available = ext.getQueryObjectEXT(query, ext.QUERY_RESULT_AVAILABLE_EXT);\n            if (this.disjoint == null) {\n                this.disjoint = this.gl.getParameter(ext.GPU_DISJOINT_EXT);\n            }\n            return available && !this.disjoint;\n        }\n    }\n    pollFence(fenceContext) {\n        return new Promise(resolve => {\n            this.addItemToPoll(() => fenceContext.isFencePassed(), () => resolve());\n        });\n    }\n    pollItems() {\n        // Find the last query that has finished.\n        const index = linearSearchLastTrue(this.itemsToPoll.map(x => x.isDoneFn));\n        for (let i = 0; i <= index; ++i) {\n            const { resolveFn } = this.itemsToPoll[i];\n            resolveFn();\n        }\n        this.itemsToPoll = this.itemsToPoll.slice(index + 1);\n    }\n    addItemToPoll(isDoneFn, resolveFn) {\n        this.itemsToPoll.push({ isDoneFn, resolveFn });\n        if (this.itemsToPoll.length > 1) {\n            // We already have a running loop that polls.\n            return;\n        }\n        // Start a new loop that polls.\n        let scheduleFn = undefined;\n        if ('setTimeoutCustom' in env().platform) {\n            scheduleFn = env().platform.setTimeoutCustom.bind(env().platform);\n        }\n        util.repeatedTry(() => {\n            this.pollItems();\n            // End the loop if no more items to poll.\n            return this.itemsToPoll.length === 0;\n        }, () => 0, null, scheduleFn);\n    }\n    bindTextureToFrameBuffer(texture) {\n        this.throwIfDisposed();\n        webgl_util.bindColorTextureToFramebuffer(this.gl, texture, this.framebuffer);\n        if (this.debug) {\n            webgl_util.validateFramebuffer(this.gl);\n        }\n    }\n    unbindTextureToFrameBuffer() {\n        if (this.outputTexture != null) {\n            webgl_util.bindColorTextureToFramebuffer(this.gl, this.outputTexture, this.framebuffer);\n            if (this.debug) {\n                webgl_util.validateFramebuffer(this.gl);\n            }\n        }\n        else {\n            webgl_util.unbindColorTextureFromFramebuffer(this.gl, this.framebuffer);\n        }\n    }\n    downloadMatrixDriver(texture, downloadAndDecode) {\n        this.bindTextureToFrameBuffer(texture);\n        const result = downloadAndDecode();\n        this.unbindTextureToFrameBuffer();\n        return result;\n    }\n    setOutputMatrixTextureDriver(outputMatrixTextureMaybePacked, width, height) {\n        this.throwIfDisposed();\n        const gl = this.gl;\n        webgl_util.bindColorTextureToFramebuffer(gl, outputMatrixTextureMaybePacked, this.framebuffer);\n        if (this.debug) {\n            webgl_util.validateFramebuffer(gl);\n        }\n        this.outputTexture = outputMatrixTextureMaybePacked;\n        webgl_util.callAndCheck(gl, () => gl.viewport(0, 0, width, height));\n        webgl_util.callAndCheck(gl, () => gl.scissor(0, 0, width, height));\n    }\n    setOutputMatrixWriteRegionDriver(x, y, width, height) {\n        this.throwIfDisposed();\n        webgl_util.callAndCheck(this.gl, () => this.gl.scissor(x, y, width, height));\n    }\n    throwIfDisposed() {\n        if (this.disposed) {\n            throw new Error('Attempted to use disposed GPGPUContext.');\n        }\n    }\n    throwIfNoProgram() {\n        if (this.program == null) {\n            throw new Error('No GPU program is currently set.');\n        }\n    }\n}\n/**\n * Finds the index of the last true element using linear search.\n * Note: We can't do binary search because Chrome expects us to explicitly\n * test all fences before download:\n * https://github.com/tensorflow/tfjs/issues/1145\n */\nexport function linearSearchLastTrue(arr) {\n    let i = 0;\n    for (; i < arr.length; ++i) {\n        const isDone = arr[i]();\n        if (!isDone) {\n            break;\n        }\n    }\n    return i - 1;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3BncHVfY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ3BncHVfY29udGV4dC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUF5QixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RSxPQUFPLEVBQUMsZUFBZSxFQUFFLGVBQWUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEtBQUssVUFBVSxNQUFNLGNBQWMsQ0FBQztBQUMzQyxPQUFPLEtBQUssUUFBUSxNQUFNLFlBQVksQ0FBQztBQUd2QyxPQUFPLEtBQUssVUFBVSxNQUFNLGNBQWMsQ0FBQztBQU8zQyxNQUFNLE9BQU8sWUFBWTtJQW1CdkIsWUFBWSxFQUEwQjtRQVB0QyxrQkFBYSxHQUFzQixJQUFJLENBQUM7UUFDeEMsWUFBTyxHQUFzQixJQUFJLENBQUM7UUFDMUIsYUFBUSxHQUFHLEtBQUssQ0FBQztRQXNPakIsd0JBQW1CLEdBQUcsS0FBSyxDQUFDO1FBdVA1QixnQkFBVyxHQUFlLEVBQUUsQ0FBQztRQXZkbkMsTUFBTSxTQUFTLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ25ELElBQUksRUFBRSxJQUFJLElBQUksRUFBRTtZQUNkLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQ2IsZUFBZSxDQUFDLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNoQzthQUFNO1lBQ0wsSUFBSSxDQUFDLEVBQUUsR0FBRyxlQUFlLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDdEM7UUFDRCx5REFBeUQ7UUFDekQsSUFBSSxrQkFBa0IsR0FBRywwQkFBMEIsQ0FBQztRQUNwRCxNQUFNLHVCQUF1QixHQUFHLDZCQUE2QixDQUFDO1FBQzlELElBQUksQ0FBQyw0QkFBNEI7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QUFFLEtBQWEsRUFBRSxNQUFjO1FBQ3JELElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN2QixVQUFVLENBQUMsWUFBWSxDQUNuQixJQUFJLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVPLGVBQWU7UUFDckIsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFO1lBQ2pCLE1BQU0sSUFBSSxLQUFLLENBQUMseUNBQXlDLENBQUMsQ0FBQztTQUM1RDtJQUNILENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksRUFBRTtZQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLGtDQUFrQyxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDO0NBQ0Y7QUFPRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxHQUF5QjtJQUM1RCxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDVixPQUFPLENBQUMsR0FBRyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzFCLE1BQU0sTUFBTSxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDWCxNQUFNO1NBQ1A7S0FDRjtJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBQaXhlbERhdGEsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Z2V0V2ViR0xDb250ZXh0LCBzZXRXZWJHTENvbnRleHR9IGZyb20gJy4vY2FudmFzX3V0aWwnO1xuaW1wb3J0ICogYXMgZ3BncHVfdXRpbCBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0ICogYXMgdGV4X3V0aWwgZnJvbSAnLi90ZXhfdXRpbCc7XG5pbXBvcnQge1RleHR1cmUsIFRleHR1cmVDb25maWd9IGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtXZWJHTDFEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb24sIFdlYkdMMkRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiwgV2ViR0xQYXJhbGxlbENvbXBpbGF0aW9uRXh0ZW5zaW9ufSBmcm9tICcuL3dlYmdsX3R5cGVzJztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGludGVyZmFjZSBGZW5jZUNvbnRleHQge1xuICBxdWVyeTogV2ViR0xRdWVyeXxXZWJHTFN5bmM7XG4gIGlzRmVuY2VQYXNzZWQoKTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGNsYXNzIEdQR1BVQ29udGV4dCB7XG4gIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQ7XG4gIHRleHR1cmVGbG9hdEV4dGVuc2lvbjoge307XG4gIHRleHR1cmVIYWxmRmxvYXRFeHRlbnNpb246IHt9O1xuICBjb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uOiB7fTtcbiAgY29sb3JCdWZmZXJIYWxmRmxvYXRFeHRlbnNpb246IHt9O1xuICBkaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb246IFdlYkdMMkRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbnxcbiAgICAgIFdlYkdMMURpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbjtcbiAgcGFyYWxsZWxDb21waWxhdGlvbkV4dGVuc2lvbjogV2ViR0xQYXJhbGxlbENvbXBpbGF0aW9uRXh0ZW5zaW9uO1xuICB2ZXJ0ZXhCdWZmZXI6IFdlYkdMQnVmZmVyO1xuICBpbmRleEJ1ZmZlcjogV2ViR0xCdWZmZXI7XG4gIGZyYW1lYnVmZmVyOiBXZWJHTEZyYW1lYnVmZmVyO1xuICBvdXRwdXRUZXh0dXJlOiBXZWJHTFRleHR1cmV8bnVsbCA9IG51bGw7XG4gIHByb2dyYW06IFdlYkdMUHJvZ3JhbXxudWxsID0gbnVsbDtcbiAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIGRpc2pvaW50OiBib29sZWFuO1xuICBwcml2YXRlIHZlcnRleFNoYWRlcjogV2ViR0xTaGFkZXI7XG4gIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWc7XG5cbiAgY29uc3RydWN0b3IoZ2w/OiBXZWJHTFJlbmRlcmluZ0NvbnRleHQpIHtcbiAgICBjb25zdCBnbFZlcnNpb24gPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKTtcbiAgICBpZiAoZ2wgIT0gbnVsbCkge1xuICAgICAgdGhpcy5nbCA9IGdsO1xuICAgICAgc2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbiwgZ2wpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmdsID0gZ2V0V2ViR0xDb250ZXh0KGdsVmVyc2lvbik7XG4gICAgfVxuICAgIC8vIFdlYkdMIDIuMCBlbmFibGVzIHRleHR1cmUgZmxvYXRzIHdpdGhvdXQgYW4gZXh0ZW5zaW9uLlxuICAgIGxldCBDT0xPUl9CVUZGRVJfRkxPQVQgPSAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JztcbiAgICBjb25zdCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCA9ICdFWFRfY29sb3JfYnVmZmVyX2hhbGZfZmxvYXQnO1xuICAgIHRoaXMucGFyYWxsZWxDb21waWxhdGlvbkV4dGVuc2lvbiA9XG4gICAgICAgIHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKCdLSFJfcGFyYWxsZWxfc2hhZGVyX2NvbXBpbGUnKTtcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDEpIHtcbiAgICAgIGNvbnN0IFRFWFRVUkVfRkxPQVQgPSAnT0VTX3RleHR1cmVfZmxvYXQnO1xuICAgICAgY29uc3QgVEVYVFVSRV9IQUxGX0ZMT0FUID0gJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnO1xuXG4gICAgICB0aGlzLnRleHR1cmVGbG9hdEV4dGVuc2lvbiA9XG4gICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KHRoaXMuZ2wsIFRFWFRVUkVfRkxPQVQpO1xuICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIFRFWFRVUkVfSEFMRl9GTE9BVCkpIHtcbiAgICAgICAgdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIHdlYmdsX3V0aWwuZ2V0RXh0ZW5zaW9uT3JUaHJvdyh0aGlzLmdsLCBURVhUVVJFX0hBTEZfRkxPQVQpO1xuICAgICAgfSBlbHNlIGlmIChlbnYoKS5nZXQoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdHTCBjb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgaGFsZiBmbG9hdCB0ZXh0dXJlcywgeWV0IHRoZSAnICtcbiAgICAgICAgICAgICdlbnZpcm9ubWVudCBmbGFnIFdFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUyBpcyBzZXQgdG8gdHJ1ZS4nKTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uID0gdGhpcy5nbC5nZXRFeHRlbnNpb24oQ09MT1JfQlVGRkVSX0ZMT0FUKTtcbiAgICAgIGlmICh3ZWJnbF91dGlsLmhhc0V4dGVuc2lvbih0aGlzLmdsLCBDT0xPUl9CVUZGRVJfSEFMRl9GTE9BVCkpIHtcbiAgICAgICAgdGhpcy5jb2xvckJ1ZmZlckhhbGZGbG9hdEV4dGVuc2lvbiA9XG4gICAgICAgICAgICB3ZWJnbF91dGlsLmdldEV4dGVuc2lvbk9yVGhyb3codGhpcy5nbCwgQ09MT1JfQlVGRkVSX0hBTEZfRkxPQVQpO1xuICAgICAgfSBlbHNlIGlmIChlbnYoKS5nZXQoJ1dFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUycpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICdHTCBjb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgY29sb3IgcmVuZGVyYWJsZSBoYWxmIGZsb2F0cywgeWV0ICcgK1xuICAgICAgICAgICAgJ3RoZSBlbnZpcm9ubWVudCBmbGFnIFdFQkdMX0ZPUkNFX0YxNl9URVhUVVJFUyBpcyBzZXQgdG8gdHJ1ZS4nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgQ09MT1JfQlVGRkVSX0ZMT0FUID0gJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnO1xuICAgICAgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9GTE9BVCkpIHtcbiAgICAgICAgdGhpcy5jb2xvckJ1ZmZlckZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKENPTE9SX0JVRkZFUl9GTE9BVCk7XG4gICAgICB9IGVsc2UgaWYgKHdlYmdsX3V0aWwuaGFzRXh0ZW5zaW9uKHRoaXMuZ2wsIENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKSkge1xuICAgICAgICB0aGlzLmNvbG9yQnVmZmVySGFsZkZsb2F0RXh0ZW5zaW9uID1cbiAgICAgICAgICAgIHRoaXMuZ2wuZ2V0RXh0ZW5zaW9uKENPTE9SX0JVRkZFUl9IQUxGX0ZMT0FUKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignR0wgY29udGV4dCBkb2VzIG5vdCBzdXBwb3J0IGNvbG9yIHJlbmRlcmFibGUgZmxvYXRzJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy52ZXJ0ZXhCdWZmZXIgPSBncGdwdV91dGlsLmNyZWF0ZVZlcnRleEJ1ZmZlcih0aGlzLmdsKTtcbiAgICB0aGlzLmluZGV4QnVmZmVyID0gZ3BncHVfdXRpbC5jcmVhdGVJbmRleEJ1ZmZlcih0aGlzLmdsKTtcbiAgICB0aGlzLmZyYW1lYnVmZmVyID0gd2ViZ2xfdXRpbC5jcmVhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcblxuICAgIHRoaXMudGV4dHVyZUNvbmZpZyA9XG4gICAgICAgIHRleF91dGlsLmdldFRleHR1cmVDb25maWcodGhpcy5nbCwgdGhpcy50ZXh0dXJlSGFsZkZsb2F0RXh0ZW5zaW9uKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IGRlYnVnKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbnYoKS5nZXRCb29sKCdERUJVRycpO1xuICB9XG5cbiAgcHVibGljIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJvZ3JhbSAhPSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ0Rpc3Bvc2luZyBhIEdQR1BVQ29udGV4dCB0aGF0IHN0aWxsIGhhcyBhIGJvdW5kIFdlYkdMUHJvZ3JhbS4nICtcbiAgICAgICAgICAnIFRoaXMgaXMgcHJvYmFibHkgYSByZXNvdXJjZSBsZWFrLCBkZWxldGUgdGhlIHByb2dyYW0gd2l0aCAnICtcbiAgICAgICAgICAnR1BHUFVDb250ZXh0LmRlbGV0ZVByb2dyYW0gYmVmb3JlIGRpc3Bvc2luZy4nKTtcbiAgICB9XG4gICAgaWYgKHRoaXMub3V0cHV0VGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgJ0Rpc3Bvc2luZyBhIEdQR1BVQ29udGV4dCB0aGF0IHN0aWxsIGhhcyBhIGJvdW5kIG91dHB1dCBtYXRyaXggJyArXG4gICAgICAgICAgJ3RleHR1cmUuICBUaGlzIGlzIHByb2JhYmx5IGEgcmVzb3VyY2UgbGVhaywgZGVsZXRlIHRoZSBvdXRwdXQgJyArXG4gICAgICAgICAgJ21hdHJpeCB0ZXh0dXJlIHdpdGggR1BHUFVDb250ZXh0LmRlbGV0ZU1hdHJpeFRleHR1cmUgYmVmb3JlICcgK1xuICAgICAgICAgICdkaXNwb3NpbmcuJyk7XG4gICAgfVxuICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZmluaXNoKCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZGVsZXRlRnJhbWVidWZmZXIodGhpcy5mcmFtZWJ1ZmZlcikpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5iaW5kQnVmZmVyKGdsLkFSUkFZX0JVRkZFUiwgbnVsbCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCwgKCkgPT4gZ2wuYmluZEJ1ZmZlcihnbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgbnVsbCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5kZWxldGVCdWZmZXIodGhpcy5pbmRleEJ1ZmZlcikpO1xuICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZUZsb2F0MzJNYXRyaXhUZXh0dXJlKHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogVGV4dHVyZSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVGbG9hdDMyTWF0cml4VGV4dHVyZShcbiAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShyb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6IFRleHR1cmUge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgcmV0dXJuIGdwZ3B1X3V0aWwuY3JlYXRlRmxvYXQxNk1hdHJpeFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlVW5zaWduZWRCeXRlc01hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOlxuICAgICAgVGV4dHVyZSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5jcmVhdGVVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZShcbiAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyB1cGxvYWRQaXhlbERhdGFUb1RleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgICBwaXhlbHM6IFBpeGVsRGF0YXxJbWFnZURhdGF8SFRNTEltYWdlRWxlbWVudHxIVE1MQ2FudmFzRWxlbWVudHxcbiAgICAgIEltYWdlQml0bWFwKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBncGdwdV91dGlsLnVwbG9hZFBpeGVsRGF0YVRvVGV4dHVyZSh0aGlzLmdsLCB0ZXh0dXJlLCBwaXhlbHMpO1xuICB9XG5cbiAgcHVibGljIHVwbG9hZERlbnNlTWF0cml4VG9UZXh0dXJlKFxuICAgICAgdGV4dHVyZTogV2ViR0xUZXh0dXJlLCB3aWR0aDogbnVtYmVyLCBoZWlnaHQ6IG51bWJlciwgZGF0YTogVHlwZWRBcnJheSkge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgZ3BncHVfdXRpbC51cGxvYWREZW5zZU1hdHJpeFRvVGV4dHVyZShcbiAgICAgICAgdGhpcy5nbCwgdGV4dHVyZSwgd2lkdGgsIGhlaWdodCwgZGF0YSwgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZShyb3dzOiBudW1iZXIsIGNvbHVtbnM6IG51bWJlcik6XG4gICAgICBUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKFxuICAgICAgICB0aGlzLmdsLCByb3dzLCBjb2x1bW5zLCB0aGlzLnRleHR1cmVDb25maWcpO1xuICB9XG5cbiAgcHVibGljIGNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUocm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBUZXh0dXJlIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiBncGdwdV91dGlsLmNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wsIHJvd3MsIGNvbHVtbnMsIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXh0dXJlOiBXZWJHTFRleHR1cmUpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGlmICh0aGlzLm91dHB1dFRleHR1cmUgPT09IHRleHR1cmUpIHtcbiAgICAgIHdlYmdsX3V0aWwudW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgICAgdGhpcy5vdXRwdXRUZXh0dXJlID0gbnVsbDtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5kZWxldGVUZXh0dXJlKHRleHR1cmUpKTtcbiAgfVxuXG4gIHB1YmxpYyBkb3dubG9hZEJ5dGVFbmNvZGVkRmxvYXRNYXRyaXhGcm9tT3V0cHV0VGV4dHVyZShcbiAgICAgIHRleHR1cmU6IFdlYkdMVGV4dHVyZSwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkQnl0ZUVuY29kZWRGbG9hdE1hdHJpeEZyb21PdXRwdXRUZXh0dXJlKFxuICAgICAgICAgICAgdGhpcy5nbCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKSk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRQYWNrZWRNYXRyaXhGcm9tQnVmZmVyKFxuICAgICAgYnVmZmVyOiBXZWJHTEJ1ZmZlciwgYmF0Y2g6IG51bWJlciwgcm93czogbnVtYmVyLCBjb2x1bW5zOiBudW1iZXIsXG4gICAgICBwaHlzaWNhbFJvd3M6IG51bWJlciwgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiBncGdwdV91dGlsLmRvd25sb2FkUGFja2VkTWF0cml4RnJvbUJ1ZmZlcihcbiAgICAgICAgdGhpcy5nbCwgYnVmZmVyLCBiYXRjaCwgcm93cywgY29sdW1ucywgcGh5c2ljYWxSb3dzLCBwaHlzaWNhbENvbHMsXG4gICAgICAgIHRoaXMudGV4dHVyZUNvbmZpZyk7XG4gIH1cblxuICBwdWJsaWMgZG93bmxvYWRGbG9hdDMyTWF0cml4RnJvbUJ1ZmZlcihidWZmZXI6IFdlYkdMQnVmZmVyLCBzaXplOiBudW1iZXIpOlxuICAgICAgRmxvYXQzMkFycmF5IHtcbiAgICByZXR1cm4gZ3BncHVfdXRpbC5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKHRoaXMuZ2wsIGJ1ZmZlciwgc2l6ZSk7XG4gIH1cblxuICBwdWJsaWMgY3JlYXRlQnVmZmVyRnJvbVRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKTogV2ViR0xCdWZmZXIge1xuICAgIHRoaXMuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKHRleHR1cmUpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGdwZ3B1X3V0aWwuY3JlYXRlQnVmZmVyRnJvbU91dHB1dFRleHR1cmUoXG4gICAgICAgIHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCwgcm93cywgY29sdW1ucywgdGhpcy50ZXh0dXJlQ29uZmlnKTtcbiAgICB0aGlzLnVuYmluZFRleHR1cmVUb0ZyYW1lQnVmZmVyKCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBjcmVhdGVBbmRXYWl0Rm9yRmVuY2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgZmVuY2VDb250ZXh0ID0gdGhpcy5jcmVhdGVGZW5jZSh0aGlzLmdsKTtcbiAgICByZXR1cm4gdGhpcy5wb2xsRmVuY2UoZmVuY2VDb250ZXh0KTtcbiAgfVxuXG4gIHByaXZhdGUgY3JlYXRlRmVuY2UoZ2w6IFdlYkdMUmVuZGVyaW5nQ29udGV4dCk6IEZlbmNlQ29udGV4dCB7XG4gICAgbGV0IHF1ZXJ5OiBXZWJHTFF1ZXJ5fFdlYkdMU3luYztcbiAgICBsZXQgaXNGZW5jZVBhc3NlZDogKCkgPT4gYm9vbGVhbjtcblxuICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9GRU5DRV9BUElfRU5BQkxFRCcpKSB7XG4gICAgICBjb25zdCBnbDIgPSBnbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuXG4gICAgICBjb25zdCBzeW5jID0gZ2wyLmZlbmNlU3luYyhnbDIuU1lOQ19HUFVfQ09NTUFORFNfQ09NUExFVEUsIDApO1xuICAgICAgZ2wuZmx1c2goKTtcblxuICAgICAgaXNGZW5jZVBhc3NlZCA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc3RhdHVzID0gZ2wyLmNsaWVudFdhaXRTeW5jKHN5bmMsIDAsIDApO1xuICAgICAgICByZXR1cm4gc3RhdHVzID09PSBnbDIuQUxSRUFEWV9TSUdOQUxFRCB8fFxuICAgICAgICAgICAgc3RhdHVzID09PSBnbDIuQ09ORElUSU9OX1NBVElTRklFRDtcbiAgICAgIH07XG5cbiAgICAgIHF1ZXJ5ID0gc3luYztcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykgPiAwKSB7XG4gICAgICBxdWVyeSA9IHRoaXMuYmVnaW5RdWVyeSgpO1xuICAgICAgdGhpcy5lbmRRdWVyeSgpO1xuICAgICAgaXNGZW5jZVBhc3NlZCA9ICgpID0+IHRoaXMuaXNRdWVyeUF2YWlsYWJsZShcbiAgICAgICAgICBxdWVyeSxcbiAgICAgICAgICBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykpO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB3ZSBoYXZlIG5vIHdheSB0byBmZW5jZSwgcmV0dXJuIHRydWUgaW1tZWRpYXRlbHkuIFRoaXMgd2lsbCBmaXJlIGluXG4gICAgICAvLyBXZWJHTCAxLjAgd2hlbiB0aGVyZSBpcyBubyBkaXNqb2ludCBxdWVyeSB0aW1lci4gSW4gdGhpcyBjYXNlLCBiZWNhdXNlXG4gICAgICAvLyB0aGUgZmVuY2UgcGFzc2VzIGltbWVkaWF0ZWx5LCB3ZSdsbCBpbW1lZGlhdGVseSBhc2sgZm9yIGEgZG93bmxvYWQgb2ZcbiAgICAgIC8vIHRoZSB0ZXh0dXJlLCB3aGljaCB3aWxsIGNhdXNlIHRoZSBVSSB0aHJlYWQgdG8gaGFuZy5cbiAgICAgIGlzRmVuY2VQYXNzZWQgPSAoKSA9PiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiB7cXVlcnksIGlzRmVuY2VQYXNzZWR9O1xuICB9XG5cbiAgcHVibGljIGRvd25sb2FkTWF0cml4RnJvbVBhY2tlZFRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsIHBoeXNpY2FsUm93czogbnVtYmVyLFxuICAgICAgcGh5c2ljYWxDb2xzOiBudW1iZXIpOiBGbG9hdDMyQXJyYXkge1xuICAgIHJldHVybiB0aGlzLmRvd25sb2FkTWF0cml4RHJpdmVyKFxuICAgICAgICB0ZXh0dXJlLFxuICAgICAgICAoKSA9PiBncGdwdV91dGlsLmRvd25sb2FkTWF0cml4RnJvbVBhY2tlZE91dHB1dFRleHR1cmUoXG4gICAgICAgICAgICB0aGlzLmdsLCBwaHlzaWNhbFJvd3MsIHBoeXNpY2FsQ29scykpO1xuICB9XG5cbiAgcHJpdmF0ZSB2ZXJ0ZXhBdHRyc0FyZUJvdW5kID0gZmFsc2U7XG5cbiAgcHVibGljIGNyZWF0ZVByb2dyYW0oZnJhZ21lbnRTaGFkZXI6IFdlYkdMU2hhZGVyKTogV2ViR0xQcm9ncmFtIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICBpZiAodGhpcy52ZXJ0ZXhTaGFkZXIgPT0gbnVsbCkge1xuICAgICAgdGhpcy52ZXJ0ZXhTaGFkZXIgPSBncGdwdV91dGlsLmNyZWF0ZVZlcnRleFNoYWRlcihnbCk7XG4gICAgfVxuICAgIGNvbnN0IHByb2dyYW06IFdlYkdMUHJvZ3JhbSA9IHdlYmdsX3V0aWwuY3JlYXRlUHJvZ3JhbShnbCk7XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2soXG4gICAgICAgIGdsLCAoKSA9PiBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgdGhpcy52ZXJ0ZXhTaGFkZXIpKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuYXR0YWNoU2hhZGVyKHByb2dyYW0sIGZyYWdtZW50U2hhZGVyKSk7XG4gICAgd2ViZ2xfdXRpbC5saW5rUHJvZ3JhbShnbCwgcHJvZ3JhbSk7XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVQcm9ncmFtKGdsLCBwcm9ncmFtKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnZlcnRleEF0dHJzQXJlQm91bmQpIHtcbiAgICAgIHRoaXMuc2V0UHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgIHRoaXMudmVydGV4QXR0cnNBcmVCb3VuZCA9IGdwZ3B1X3V0aWwuYmluZFZlcnRleFByb2dyYW1BdHRyaWJ1dGVTdHJlYW1zKFxuICAgICAgICAgIGdsLCB0aGlzLnByb2dyYW0sIHRoaXMudmVydGV4QnVmZmVyKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb2dyYW07XG4gIH1cblxuICBwdWJsaWMgZGVsZXRlUHJvZ3JhbShwcm9ncmFtOiBXZWJHTFByb2dyYW0pIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIGlmIChwcm9ncmFtID09PSB0aGlzLnByb2dyYW0pIHtcbiAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgfVxuICAgIGlmIChwcm9ncmFtICE9IG51bGwpIHtcbiAgICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKHRoaXMuZ2wsICgpID0+IHRoaXMuZ2wuZGVsZXRlUHJvZ3JhbShwcm9ncmFtKSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNldFByb2dyYW0ocHJvZ3JhbTogV2ViR0xQcm9ncmFtfG51bGwpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHRoaXMucHJvZ3JhbSA9IHByb2dyYW07XG4gICAgaWYgKCh0aGlzLnByb2dyYW0gIT0gbnVsbCkgJiYgdGhpcy5kZWJ1Zykge1xuICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtKTtcbiAgICB9XG4gICAgd2ViZ2xfdXRpbC5jYWxsQW5kQ2hlY2sodGhpcy5nbCwgKCkgPT4gdGhpcy5nbC51c2VQcm9ncmFtKHByb2dyYW0pKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmlmb3JtTG9jYXRpb24oXG4gICAgICBwcm9ncmFtOiBXZWJHTFByb2dyYW0sIHVuaWZvcm1OYW1lOiBzdHJpbmcsXG4gICAgICBzaG91bGRUaHJvdyA9IHRydWUpOiBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBpZiAoc2hvdWxkVGhyb3cpIHtcbiAgICAgIHJldHVybiB3ZWJnbF91dGlsLmdldFByb2dyYW1Vbmlmb3JtTG9jYXRpb25PclRocm93KFxuICAgICAgICAgIHRoaXMuZ2wsIHByb2dyYW0sIHVuaWZvcm1OYW1lKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHdlYmdsX3V0aWwuZ2V0UHJvZ3JhbVVuaWZvcm1Mb2NhdGlvbihcbiAgICAgICAgICB0aGlzLmdsLCBwcm9ncmFtLCB1bmlmb3JtTmFtZSk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldEF0dHJpYnV0ZUxvY2F0aW9uKHByb2dyYW06IFdlYkdMUHJvZ3JhbSwgYXR0cmlidXRlOiBzdHJpbmcpOlxuICAgICAgbnVtYmVyIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHJldHVybiB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhcbiAgICAgICAgdGhpcy5nbCwgKCkgPT4gdGhpcy5nbC5nZXRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCBhdHRyaWJ1dGUpKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRVbmlmb3JtTG9jYXRpb25Ob1Rocm93KHByb2dyYW06IFdlYkdMUHJvZ3JhbSwgdW5pZm9ybU5hbWU6IHN0cmluZyk6XG4gICAgICBXZWJHTFVuaWZvcm1Mb2NhdGlvbiB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICByZXR1cm4gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24ocHJvZ3JhbSwgdW5pZm9ybU5hbWUpO1xuICB9XG5cbiAgcHVibGljIHNldElucHV0TWF0cml4VGV4dHVyZShcbiAgICAgIGlucHV0TWF0cml4VGV4dHVyZTogV2ViR0xUZXh0dXJlLCB1bmlmb3JtTG9jYXRpb246IFdlYkdMVW5pZm9ybUxvY2F0aW9uLFxuICAgICAgdGV4dHVyZVVuaXQ6IG51bWJlcikge1xuICAgIHRoaXMudGhyb3dJZkRpc3Bvc2VkKCk7XG4gICAgdGhpcy50aHJvd0lmTm9Qcm9ncmFtKCk7XG4gICAgd2ViZ2xfdXRpbC5iaW5kVGV4dHVyZVRvUHJvZ3JhbVVuaWZvcm1TYW1wbGVyKFxuICAgICAgICB0aGlzLmdsLCBpbnB1dE1hdHJpeFRleHR1cmUsIHVuaWZvcm1Mb2NhdGlvbiwgdGV4dHVyZVVuaXQpO1xuICB9XG5cbiAgcHVibGljIHNldE91dHB1dE1hdHJpeFRleHR1cmUoXG4gICAgICBvdXRwdXRNYXRyaXhUZXh0dXJlOiBXZWJHTFRleHR1cmUsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKSB7XG4gICAgdGhpcy5zZXRPdXRwdXRNYXRyaXhUZXh0dXJlRHJpdmVyKG91dHB1dE1hdHJpeFRleHR1cmUsIGNvbHVtbnMsIHJvd3MpO1xuICB9XG5cbiAgcHVibGljIHNldE91dHB1dFBhY2tlZE1hdHJpeFRleHR1cmUoXG4gICAgICBvdXRwdXRQYWNrZWRNYXRyaXhUZXh0dXJlOiBXZWJHTFRleHR1cmUsIHJvd3M6IG51bWJlciwgY29sdW1uczogbnVtYmVyKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBbd2lkdGgsIGhlaWdodF0gPVxuICAgICAgICB0ZXhfdXRpbC5nZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodChyb3dzLCBjb2x1bW5zKTtcbiAgICB0aGlzLnNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIob3V0cHV0UGFja2VkTWF0cml4VGV4dHVyZSwgd2lkdGgsIGhlaWdodCk7XG4gIH1cblxuICBwdWJsaWMgc2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb24oXG4gICAgICBzdGFydFJvdzogbnVtYmVyLCBudW1Sb3dzOiBudW1iZXIsIHN0YXJ0Q29sdW1uOiBudW1iZXIsXG4gICAgICBudW1Db2x1bW5zOiBudW1iZXIpIHtcbiAgICB0aGlzLnNldE91dHB1dE1hdHJpeFdyaXRlUmVnaW9uRHJpdmVyKFxuICAgICAgICBzdGFydENvbHVtbiwgc3RhcnRSb3csIG51bUNvbHVtbnMsIG51bVJvd3MpO1xuICB9XG5cbiAgcHVibGljIHNldE91dHB1dFBhY2tlZE1hdHJpeFdyaXRlUmVnaW9uKFxuICAgICAgc3RhcnRSb3c6IG51bWJlciwgbnVtUm93czogbnVtYmVyLCBzdGFydENvbHVtbjogbnVtYmVyLFxuICAgICAgbnVtQ29sdW1uczogbnVtYmVyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRPdXRwdXRQYWNrZWRNYXRyaXhXcml0ZVJlZ2lvbiBub3QgaW1wbGVtZW50ZWQuJyk7XG4gIH1cblxuICBwdWJsaWMgZGVidWdWYWxpZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5wcm9ncmFtICE9IG51bGwpIHtcbiAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVQcm9ncmFtKHRoaXMuZ2wsIHRoaXMucHJvZ3JhbSk7XG4gICAgfVxuICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcih0aGlzLmdsKTtcbiAgfVxuXG4gIHB1YmxpYyBleGVjdXRlUHJvZ3JhbSgpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHRoaXMudGhyb3dJZk5vUHJvZ3JhbSgpO1xuICAgIGNvbnN0IGdsID0gdGhpcy5nbDtcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgdGhpcy5kZWJ1Z1ZhbGlkYXRlKCk7XG4gICAgfVxuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICBnbCwgKCkgPT4gZ2wuZHJhd0VsZW1lbnRzKGdsLlRSSUFOR0xFUywgNiwgZ2wuVU5TSUdORURfU0hPUlQsIDApKTtcbiAgfVxuXG4gIHB1YmxpYyBibG9ja1VudGlsQWxsUHJvZ3JhbXNDb21wbGV0ZWQoKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayh0aGlzLmdsLCAoKSA9PiB0aGlzLmdsLmZpbmlzaCgpKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0UXVlcnlUaW1lckV4dGVuc2lvbigpOiBXZWJHTDFEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb25cbiAgICAgIHxXZWJHTDJEaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb24ge1xuICAgIGlmICh0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiA9PSBudWxsKSB7XG4gICAgICB0aGlzLmRpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiA9XG4gICAgICAgICAgd2ViZ2xfdXRpbC5nZXRFeHRlbnNpb25PclRocm93KFxuICAgICAgICAgICAgICB0aGlzLmdsLFxuICAgICAgICAgICAgICBlbnYoKS5nZXROdW1iZXIoXG4gICAgICAgICAgICAgICAgICAnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSA9PT0gMiA/XG4gICAgICAgICAgICAgICAgICAnRVhUX2Rpc2pvaW50X3RpbWVyX3F1ZXJ5X3dlYmdsMicgOlxuICAgICAgICAgICAgICAgICAgJ0VYVF9kaXNqb2ludF90aW1lcl9xdWVyeScpIGFzXG4gICAgICAgICAgICAgIFdlYkdMMURpc2pvaW50UXVlcnlUaW1lckV4dGVuc2lvbiB8XG4gICAgICAgICAgV2ViR0wyRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5kaXNqb2ludFF1ZXJ5VGltZXJFeHRlbnNpb247XG4gIH1cblxuICBwcml2YXRlIGdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKTogV2ViR0wyRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uKCk7XG4gIH1cblxuICBwcml2YXRlIGdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTogV2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uKCkgYXMgV2ViR0wxRGlzam9pbnRRdWVyeVRpbWVyRXh0ZW5zaW9uO1xuICB9XG5cbiAgYmVnaW5RdWVyeSgpOiBXZWJHTFF1ZXJ5IHtcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fVkVSU0lPTicpID09PSAyKSB7XG4gICAgICBjb25zdCBnbDIgPSB0aGlzLmdsIGFzIFdlYkdMMlJlbmRlcmluZ0NvbnRleHQ7XG4gICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDIoKTtcblxuICAgICAgY29uc3QgcXVlcnkgPSBnbDIuY3JlYXRlUXVlcnkoKTtcbiAgICAgIGdsMi5iZWdpblF1ZXJ5KGV4dC5USU1FX0VMQVBTRURfRVhULCBxdWVyeSk7XG4gICAgICByZXR1cm4gcXVlcnk7XG4gICAgfVxuICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gZXh0LmNyZWF0ZVF1ZXJ5RVhUKCkgYXMgV2ViR0xRdWVyeTtcbiAgICBleHQuYmVnaW5RdWVyeUVYVChleHQuVElNRV9FTEFQU0VEX0VYVCwgcXVlcnkpO1xuICAgIHJldHVybiBxdWVyeTtcbiAgfVxuXG4gIGVuZFF1ZXJ5KCkge1xuICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9WRVJTSU9OJykgPT09IDIpIHtcbiAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMigpO1xuICAgICAgZ2wyLmVuZFF1ZXJ5KGV4dC5USU1FX0VMQVBTRURfRVhUKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wxKCk7XG4gICAgZXh0LmVuZFF1ZXJ5RVhUKGV4dC5USU1FX0VMQVBTRURfRVhUKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyB3YWl0Rm9yUXVlcnlBbmRHZXRUaW1lKHF1ZXJ5OiBXZWJHTFF1ZXJ5KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBhd2FpdCB1dGlsLnJlcGVhdGVkVHJ5KFxuICAgICAgICAoKSA9PiB0aGlzLmRpc3Bvc2VkIHx8ICAvLyB3aGlsZSB0ZXN0aW5nIGNvbnRleHRzIGFyZSBjcmVhdGVkIC8gZGlzcG9zZWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gcmFwaWQgc3VjY2Vzc2lvbiwgc28gd2l0aG91dCB0aGlzIGNoZWNrIHdlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSBwb2xsIGZvciB0aGUgcXVlcnkgdGltZXIgaW5kZWZpbml0ZWx5XG4gICAgICAgICAgICB0aGlzLmlzUXVlcnlBdmFpbGFibGUoXG4gICAgICAgICAgICAgICAgcXVlcnksXG4gICAgICAgICAgICAgICAgZW52KCkuZ2V0TnVtYmVyKFxuICAgICAgICAgICAgICAgICAgICAnV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSkpO1xuICAgIHJldHVybiB0aGlzLmdldFF1ZXJ5VGltZShcbiAgICAgICAgcXVlcnksIGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1ZFUlNJT04nKSk7XG4gIH1cblxuICBwcml2YXRlIGdldFF1ZXJ5VGltZShxdWVyeTogV2ViR0xRdWVyeSwgcXVlcnlUaW1lclZlcnNpb246IG51bWJlcik6IG51bWJlciB7XG4gICAgaWYgKHF1ZXJ5VGltZXJWZXJzaW9uID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDIpIHtcbiAgICAgIGNvbnN0IGdsMiA9IHRoaXMuZ2wgYXMgV2ViR0wyUmVuZGVyaW5nQ29udGV4dDtcblxuICAgICAgY29uc3QgdGltZUVsYXBzZWROYW5vcyA9IGdsMi5nZXRRdWVyeVBhcmFtZXRlcihxdWVyeSwgZ2wyLlFVRVJZX1JFU1VMVCk7XG4gICAgICAvLyBSZXR1cm4gbWlsbGlzZWNvbmRzLlxuICAgICAgcmV0dXJuIHRpbWVFbGFwc2VkTmFub3MgLyAxMDAwMDAwO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBleHQgPSB0aGlzLmdldFF1ZXJ5VGltZXJFeHRlbnNpb25XZWJHTDEoKTtcblxuICAgICAgY29uc3QgdGltZUVsYXBzZWROYW5vcyA9XG4gICAgICAgICAgZXh0LmdldFF1ZXJ5T2JqZWN0RVhUKHF1ZXJ5LCBleHQuUVVFUllfUkVTVUxUX0VYVCk7XG4gICAgICAvLyBSZXR1cm4gbWlsbGlzZWNvbmRzLlxuICAgICAgcmV0dXJuIHRpbWVFbGFwc2VkTmFub3MgLyAxMDAwMDAwO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaXNRdWVyeUF2YWlsYWJsZShxdWVyeTogV2ViR0xRdWVyeSwgcXVlcnlUaW1lclZlcnNpb246IG51bWJlcik6XG4gICAgICBib29sZWFuIHtcbiAgICBpZiAocXVlcnlUaW1lclZlcnNpb24gPT09IDApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGlmIChxdWVyeVRpbWVyVmVyc2lvbiA9PT0gMikge1xuICAgICAgY29uc3QgZ2wyID0gdGhpcy5nbCBhcyBXZWJHTDJSZW5kZXJpbmdDb250ZXh0O1xuICAgICAgY29uc3QgZXh0ID0gdGhpcy5nZXRRdWVyeVRpbWVyRXh0ZW5zaW9uV2ViR0wyKCk7XG5cbiAgICAgIGNvbnN0IGF2YWlsYWJsZSA9XG4gICAgICAgICAgZ2wyLmdldFF1ZXJ5UGFyYW1ldGVyKHF1ZXJ5LCBnbDIuUVVFUllfUkVTVUxUX0FWQUlMQUJMRSk7XG4gICAgICBpZiAodGhpcy5kaXNqb2ludCA9PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZGlzam9pbnQgPSB0aGlzLmdsLmdldFBhcmFtZXRlcihleHQuR1BVX0RJU0pPSU5UX0VYVCk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBhdmFpbGFibGUgJiYgIXRoaXMuZGlzam9pbnQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV4dCA9IHRoaXMuZ2V0UXVlcnlUaW1lckV4dGVuc2lvbldlYkdMMSgpO1xuXG4gICAgICBjb25zdCBhdmFpbGFibGUgPVxuICAgICAgICAgIGV4dC5nZXRRdWVyeU9iamVjdEVYVChxdWVyeSwgZXh0LlFVRVJZX1JFU1VMVF9BVkFJTEFCTEVfRVhUKTtcbiAgICAgIGlmICh0aGlzLmRpc2pvaW50ID09IG51bGwpIHtcbiAgICAgICAgdGhpcy5kaXNqb2ludCA9IHRoaXMuZ2wuZ2V0UGFyYW1ldGVyKGV4dC5HUFVfRElTSk9JTlRfRVhUKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGF2YWlsYWJsZSAmJiAhdGhpcy5kaXNqb2ludDtcbiAgICB9XG4gIH1cblxuICBwb2xsRmVuY2UoZmVuY2VDb250ZXh0OiBGZW5jZUNvbnRleHQpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2U8dm9pZD4ocmVzb2x2ZSA9PiB7XG4gICAgICB0aGlzLmFkZEl0ZW1Ub1BvbGwoKCkgPT4gZmVuY2VDb250ZXh0LmlzRmVuY2VQYXNzZWQoKSwgKCkgPT4gcmVzb2x2ZSgpKTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgaXRlbXNUb1BvbGw6IFBvbGxJdGVtW10gPSBbXTtcblxuICBwb2xsSXRlbXMoKTogdm9pZCB7XG4gICAgLy8gRmluZCB0aGUgbGFzdCBxdWVyeSB0aGF0IGhhcyBmaW5pc2hlZC5cbiAgICBjb25zdCBpbmRleCA9IGxpbmVhclNlYXJjaExhc3RUcnVlKHRoaXMuaXRlbXNUb1BvbGwubWFwKHggPT4geC5pc0RvbmVGbikpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHtcbiAgICAgIGNvbnN0IHtyZXNvbHZlRm59ID0gdGhpcy5pdGVtc1RvUG9sbFtpXTtcbiAgICAgIHJlc29sdmVGbigpO1xuICAgIH1cbiAgICB0aGlzLml0ZW1zVG9Qb2xsID0gdGhpcy5pdGVtc1RvUG9sbC5zbGljZShpbmRleCArIDEpO1xuICB9XG5cbiAgcHJpdmF0ZSBhZGRJdGVtVG9Qb2xsKGlzRG9uZUZuOiAoKSA9PiBib29sZWFuLCByZXNvbHZlRm46ICgpID0+IHZvaWQpIHtcbiAgICB0aGlzLml0ZW1zVG9Qb2xsLnB1c2goe2lzRG9uZUZuLCByZXNvbHZlRm59KTtcbiAgICBpZiAodGhpcy5pdGVtc1RvUG9sbC5sZW5ndGggPiAxKSB7XG4gICAgICAvLyBXZSBhbHJlYWR5IGhhdmUgYSBydW5uaW5nIGxvb3AgdGhhdCBwb2xscy5cbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gU3RhcnQgYSBuZXcgbG9vcCB0aGF0IHBvbGxzLlxuICAgIGxldCBzY2hlZHVsZUZuID0gdW5kZWZpbmVkO1xuICAgIGlmICgnc2V0VGltZW91dEN1c3RvbScgaW4gZW52KCkucGxhdGZvcm0pIHtcbiAgICAgIHNjaGVkdWxlRm4gPSBlbnYoKS5wbGF0Zm9ybS5zZXRUaW1lb3V0Q3VzdG9tLmJpbmQoZW52KCkucGxhdGZvcm0pO1xuICAgIH1cbiAgICB1dGlsLnJlcGVhdGVkVHJ5KCgpID0+IHtcbiAgICAgIHRoaXMucG9sbEl0ZW1zKCk7XG4gICAgICAvLyBFbmQgdGhlIGxvb3AgaWYgbm8gbW9yZSBpdGVtcyB0byBwb2xsLlxuICAgICAgcmV0dXJuIHRoaXMuaXRlbXNUb1BvbGwubGVuZ3RoID09PSAwO1xuICAgIH0sICgpID0+IDAsIG51bGwsIHNjaGVkdWxlRm4pO1xuICB9XG5cbiAgcHJpdmF0ZSBiaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIodGV4dHVyZTogV2ViR0xUZXh0dXJlKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICB3ZWJnbF91dGlsLmJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKFxuICAgICAgICB0aGlzLmdsLCB0ZXh0dXJlLCB0aGlzLmZyYW1lYnVmZmVyKTtcbiAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgd2ViZ2xfdXRpbC52YWxpZGF0ZUZyYW1lYnVmZmVyKHRoaXMuZ2wpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdW5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIoKSB7XG4gICAgaWYgKHRoaXMub3V0cHV0VGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICB3ZWJnbF91dGlsLmJpbmRDb2xvclRleHR1cmVUb0ZyYW1lYnVmZmVyKFxuICAgICAgICAgIHRoaXMuZ2wsIHRoaXMub3V0cHV0VGV4dHVyZSwgdGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgICBpZiAodGhpcy5kZWJ1Zykge1xuICAgICAgICB3ZWJnbF91dGlsLnZhbGlkYXRlRnJhbWVidWZmZXIodGhpcy5nbCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHdlYmdsX3V0aWwudW5iaW5kQ29sb3JUZXh0dXJlRnJvbUZyYW1lYnVmZmVyKHRoaXMuZ2wsIHRoaXMuZnJhbWVidWZmZXIpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZG93bmxvYWRNYXRyaXhEcml2ZXIoXG4gICAgICB0ZXh0dXJlOiBXZWJHTFRleHR1cmUsXG4gICAgICBkb3dubG9hZEFuZERlY29kZTogKCkgPT4gRmxvYXQzMkFycmF5KTogRmxvYXQzMkFycmF5IHtcbiAgICB0aGlzLmJpbmRUZXh0dXJlVG9GcmFtZUJ1ZmZlcih0ZXh0dXJlKTtcbiAgICBjb25zdCByZXN1bHQgPSBkb3dubG9hZEFuZERlY29kZSgpO1xuICAgIHRoaXMudW5iaW5kVGV4dHVyZVRvRnJhbWVCdWZmZXIoKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBwcml2YXRlIHNldE91dHB1dE1hdHJpeFRleHR1cmVEcml2ZXIoXG4gICAgICBvdXRwdXRNYXRyaXhUZXh0dXJlTWF5YmVQYWNrZWQ6IFdlYkdMVGV4dHVyZSwgd2lkdGg6IG51bWJlcixcbiAgICAgIGhlaWdodDogbnVtYmVyKSB7XG4gICAgdGhpcy50aHJvd0lmRGlzcG9zZWQoKTtcbiAgICBjb25zdCBnbCA9IHRoaXMuZ2w7XG4gICAgd2ViZ2xfdXRpbC5iaW5kQ29sb3JUZXh0dXJlVG9GcmFtZWJ1ZmZlcihcbiAgICAgICAgZ2wsIG91dHB1dE1hdHJpeFRleHR1cmVNYXliZVBhY2tlZCwgdGhpcy5mcmFtZWJ1ZmZlcik7XG4gICAgaWYgKHRoaXMuZGVidWcpIHtcbiAgICAgIHdlYmdsX3V0aWwudmFsaWRhdGVGcmFtZWJ1ZmZlcihnbCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0VGV4dHVyZSA9IG91dHB1dE1hdHJpeFRleHR1cmVNYXliZVBhY2tlZDtcbiAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wudmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCkpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKGdsLCAoKSA9PiBnbC5zY2lzc29yKDAsIDAsIHdpZHRoLCBoZWlnaHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0T3V0cHV0TWF0cml4V3JpdGVSZWdpb25Ecml2ZXIoXG4gICAgICB4OiBudW1iZXIsIHk6IG51bWJlciwgd2lkdGg6IG51bWJlciwgaGVpZ2h0OiBudW1iZXIpIHtcbiAgICB0aGlzLnRocm93SWZEaXNwb3NlZCgpO1xuICAgIHdlYmdsX3V0aWwuY2FsbEFuZENoZWNrKFxuICAgICAgICB0aGlzLmdsLCAoKSA9PiB0aGlzLmdsLnNjaXNzb3IoeCwgeSwgd2lkdGgsIGhlaWdodCkpO1xuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0lmRGlzcG9zZWQoKSB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXR0ZW1wdGVkIHRvIHVzZSBkaXNwb3NlZCBHUEdQVUNvbnRleHQuJyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB0aHJvd0lmTm9Qcm9ncmFtKCkge1xuICAgIGlmICh0aGlzLnByb2dyYW0gPT0gbnVsbCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBHUFUgcHJvZ3JhbSBpcyBjdXJyZW50bHkgc2V0LicpO1xuICAgIH1cbiAgfVxufVxuXG50eXBlIFBvbGxJdGVtID0ge1xuICBpc0RvbmVGbjogKCkgPT4gYm9vbGVhbixcbiAgcmVzb2x2ZUZuOiAoKSA9PiB2b2lkXG59O1xuXG4vKipcbiAqIEZpbmRzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB0cnVlIGVsZW1lbnQgdXNpbmcgbGluZWFyIHNlYXJjaC5cbiAqIE5vdGU6IFdlIGNhbid0IGRvIGJpbmFyeSBzZWFyY2ggYmVjYXVzZSBDaHJvbWUgZXhwZWN0cyB1cyB0byBleHBsaWNpdGx5XG4gKiB0ZXN0IGFsbCBmZW5jZXMgYmVmb3JlIGRvd25sb2FkOlxuICogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvMTE0NVxuICovXG5leHBvcnQgZnVuY3Rpb24gbGluZWFyU2VhcmNoTGFzdFRydWUoYXJyOiBBcnJheTwoKSA9PiBib29sZWFuPik6IG51bWJlciB7XG4gIGxldCBpID0gMDtcbiAgZm9yICg7IGkgPCBhcnIubGVuZ3RoOyArK2kpIHtcbiAgICBjb25zdCBpc0RvbmUgPSBhcnJbaV0oKTtcbiAgICBpZiAoIWlzRG9uZSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiBpIC0gMTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Import shared functionality from tfjs-backend-cpu without triggering\n// side effects.\n// tslint:disable-next-line: no-imports-from-dist\nimport * as shared from '@tensorflow/tfjs-backend-cpu/dist/shared';\nconst { addImpl: addImplCPU, bincountImpl: bincountImplCPU, bincountReduceImpl: bincountReduceImplCPU, castImpl: castImplCPU, ceilImpl: ceilImplCPU, concatImpl: concatImplCPU, equalImpl: equalImplCPU, expImpl: expImplCPU, expm1Impl: expm1ImplCPU, floorImpl: floorImplCPU, gatherNdImpl: gatherNdImplCPU, gatherV2Impl: gatherV2ImplCPU, greaterImpl: greaterImplCPU, greaterEqualImpl: greaterEqualImplCPU, lessImpl: lessImplCPU, lessEqualImpl: lessEqualImplCPU, linSpaceImpl: linSpaceImplCPU, logImpl: logImplCPU, maxImpl: maxImplCPU, maximumImpl: maximumImplCPU, minimumImpl: minimumImplCPU, multiplyImpl: multiplyImplCPU, negImpl: negImplCPU, notEqualImpl: notEqualImplCPU, prodImpl: prodImplCPU, raggedGatherImpl: raggedGatherImplCPU, raggedTensorToTensorImpl: raggedTensorToTensorImplCPU, rangeImpl: rangeImplCPU, rsqrtImpl: rsqrtImplCPU, scatterImpl: scatterImplCPU, sigmoidImpl: sigmoidImplCPU, simpleAbsImpl: simpleAbsImplCPU, sliceImpl: sliceImplCPU, sparseFillEmptyRowsImpl: sparseFillEmptyRowsImplCPU, sparseReshapeImpl: sparseReshapeImplCPU, sparseSegmentReductionImpl: sparseSegmentReductionImplCPU, sqrtImpl: sqrtImplCPU, stridedSliceImpl: stridedSliceImplCPU, stringNGramsImpl: stringNGramsImplCPU, stringSplitImpl: stringSplitImplCPU, stringToHashBucketFastImpl: stringToHashBucketFastImplCPU, subImpl: subImplCPU, tileImpl: tileImplCPU, topKImpl: topKImplCPU, transposeImpl: transposeImplCPU, uniqueImpl: uniqueImplCPU, } = shared;\nexport { addImplCPU, bincountImplCPU, bincountReduceImplCPU, castImplCPU, ceilImplCPU, concatImplCPU, equalImplCPU, expImplCPU, expm1ImplCPU, floorImplCPU, gatherNdImplCPU, gatherV2ImplCPU, greaterEqualImplCPU, greaterImplCPU, lessEqualImplCPU, lessImplCPU, linSpaceImplCPU, logImplCPU, maxImplCPU, maximumImplCPU, minimumImplCPU, multiplyImplCPU, negImplCPU, notEqualImplCPU, prodImplCPU, raggedGatherImplCPU, raggedTensorToTensorImplCPU, scatterImplCPU, sigmoidImplCPU, simpleAbsImplCPU, sliceImplCPU, sparseFillEmptyRowsImplCPU, sparseReshapeImplCPU, sparseSegmentReductionImplCPU, sqrtImplCPU, stridedSliceImplCPU, stringNGramsImplCPU, stringSplitImplCPU, stringToHashBucketFastImplCPU, subImplCPU, rangeImplCPU, rsqrtImplCPU, tileImplCPU, topKImplCPU, transposeImplCPU, uniqueImplCPU, };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2hhcmVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxfdXRpbHMvc2hhcmVkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILHVFQUF1RTtBQUN2RSxnQkFBZ0I7QUFDaEIsaURBQWlEO0FBQ2pELE9BQU8sS0FBSyxNQUFNLE1BQU0sMENBQTBDLENBQUM7QUFRbkUsTUFBTSxFQUNKLE9BQU8sRUFBRSxVQUFVLEVBQ25CLFlBQVksRUFBRSxlQUFlLEVBQzdCLGtCQUFrQixFQUFFLHFCQUFxQixFQUN6QyxRQUFRLEVBQUUsV0FBVyxFQUNyQixRQUFRLEVBQUUsV0FBVyxFQUNyQixVQUFVLEVBQUUsYUFBYSxFQUN6QixTQUFTLEVBQUUsWUFBWSxFQUN2QixPQUFPLEVBQUUsVUFBVSxFQUNuQixTQUFTLEVBQUUsWUFBWSxFQUN2QixTQUFTLEVBQUUsWUFBWSxFQUN2QixZQUFZLEVBQUUsZUFBZSxFQUM3QixZQUFZLEVBQUUsZUFBZSxFQUM3QixXQUFXLEVBQUUsY0FBYyxFQUMzQixnQkFBZ0IsRUFBRSxtQkFBbUIsRUFDckMsUUFBUSxFQUFFLFdBQVcsRUFDckIsYUFBYSxFQUFFLGdCQUFnQixFQUMvQixZQUFZLEVBQUUsZUFBZSxFQUM3QixPQUFPLEVBQUUsVUFBVSxFQUNuQixPQUFPLEVBQUUsVUFBVSxFQUNuQixXQUFXLEVBQUUsY0FBYyxFQUMzQixXQUFXLEVBQUUsY0FBYyxFQUMzQixZQUFZLEVBQUUsZUFBZSxFQUM3QixPQUFPLEVBQUUsVUFBVSxFQUNuQixZQUFZLEVBQUUsZUFBZSxFQUM3QixRQUFRLEVBQUUsV0FBVyxFQUNyQixnQkFBZ0IsRUFBRSxtQkFBbUIsRUFDckMsd0JBQXdCLEVBQUUsMkJBQTJCLEVBQ3JELFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLFNBQVMsRUFBRSxZQUFZLEVBQ3ZCLFdBQVcsRUFBRSxjQUFjLEVBQzNCLFdBQVcsRUFBRSxjQUFjLEVBQzNCLGFBQWEsRUFBRSxnQkFBZ0IsRUFDL0IsU0FBUyxFQUFFLFlBQVksRUFDdkIsdUJBQXVCLEVBQUUsMEJBQTBCLEVBQ25ELGlCQUFpQixFQUFFLG9CQUFvQixFQUN2QywwQkFBMEIsRUFBRSw2QkFBNkIsRUFDekQsUUFBUSxFQUFFLFdBQVcsRUFDckIsZ0JBQWdCLEVBQUUsbUJBQW1CLEVBQ3JDLGdCQUFnQixFQUFFLG1CQUFtQixFQUNyQyxlQUFlLEVBQUUsa0JBQWtCLEVBQ25DLDBCQUEwQixFQUFFLDZCQUE2QixFQUN6RCxPQUFPLEVBQUUsVUFBVSxFQUNuQixRQUFRLEVBQUUsV0FBVyxFQUNyQixRQUFRLEVBQUUsV0FBVyxFQUNyQixhQUFhLEVBQUUsZ0JBQWdCLEVBQy9CLFVBQVUsRUFBRSxhQUFhLEdBQzFCLEdBQUcsTUFBTSxDQUFDO0FBRVgsT0FBTyxFQUNMLFVBQVUsRUFDVixlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsYUFBYSxFQUNiLFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixlQUFlLEVBQ2YsZUFBZSxFQUNmLG1CQUFtQixFQUNuQixjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFdBQVcsRUFDWCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFVBQVUsRUFDVixjQUFjLEVBQ2QsY0FBYyxFQUNkLGVBQWUsRUFDZixVQUFVLEVBQ1YsZUFBZSxFQUNmLFdBQVcsRUFDWCxtQkFBbUIsRUFDbkIsMkJBQTJCLEVBQzNCLGNBQWMsRUFDZCxjQUFjLEVBQ2QsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWiwwQkFBMEIsRUFDMUIsb0JBQW9CLEVBQ3BCLDZCQUE2QixFQUM3QixXQUFXLEVBQ1gsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixrQkFBa0IsRUFDbEIsNkJBQTZCLEVBQzdCLFVBQVUsRUFDVixZQUFZLEVBQ1osWUFBWSxFQUNaLFdBQVcsRUFDWCxXQUFXLEVBQ1gsZ0JBQWdCLEVBQ2hCLGFBQWEsR0FDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIEltcG9ydCBzaGFyZWQgZnVuY3Rpb25hbGl0eSBmcm9tIHRmanMtYmFja2VuZC1jcHUgd2l0aG91dCB0cmlnZ2VyaW5nXG4vLyBzaWRlIGVmZmVjdHMuXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQgKiBhcyBzaGFyZWQgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1iYWNrZW5kLWNwdS9kaXN0L3NoYXJlZCc7XG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWltcG9ydHMtZnJvbS1kaXN0XG5pbXBvcnQge1NpbXBsZUJpbmFyeUtlcm5lbEltcGx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC9zaGFyZWQnO1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1pbXBvcnRzLWZyb20tZGlzdFxuaW1wb3J0IHtTaW1wbGVVbmFyeUltcGx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtYmFja2VuZC1jcHUvZGlzdC91dGlscy91bmFyeV90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIFNpbXBsZUJpbmFyeUtlcm5lbEltcGxDUFUgPSBTaW1wbGVCaW5hcnlLZXJuZWxJbXBsO1xuZXhwb3J0IHR5cGUgU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVID0gU2ltcGxlVW5hcnlJbXBsO1xuY29uc3Qge1xuICBhZGRJbXBsOiBhZGRJbXBsQ1BVLFxuICBiaW5jb3VudEltcGw6IGJpbmNvdW50SW1wbENQVSxcbiAgYmluY291bnRSZWR1Y2VJbXBsOiBiaW5jb3VudFJlZHVjZUltcGxDUFUsXG4gIGNhc3RJbXBsOiBjYXN0SW1wbENQVSxcbiAgY2VpbEltcGw6IGNlaWxJbXBsQ1BVLFxuICBjb25jYXRJbXBsOiBjb25jYXRJbXBsQ1BVLFxuICBlcXVhbEltcGw6IGVxdWFsSW1wbENQVSxcbiAgZXhwSW1wbDogZXhwSW1wbENQVSxcbiAgZXhwbTFJbXBsOiBleHBtMUltcGxDUFUsXG4gIGZsb29ySW1wbDogZmxvb3JJbXBsQ1BVLFxuICBnYXRoZXJOZEltcGw6IGdhdGhlck5kSW1wbENQVSxcbiAgZ2F0aGVyVjJJbXBsOiBnYXRoZXJWMkltcGxDUFUsXG4gIGdyZWF0ZXJJbXBsOiBncmVhdGVySW1wbENQVSxcbiAgZ3JlYXRlckVxdWFsSW1wbDogZ3JlYXRlckVxdWFsSW1wbENQVSxcbiAgbGVzc0ltcGw6IGxlc3NJbXBsQ1BVLFxuICBsZXNzRXF1YWxJbXBsOiBsZXNzRXF1YWxJbXBsQ1BVLFxuICBsaW5TcGFjZUltcGw6IGxpblNwYWNlSW1wbENQVSxcbiAgbG9nSW1wbDogbG9nSW1wbENQVSxcbiAgbWF4SW1wbDogbWF4SW1wbENQVSxcbiAgbWF4aW11bUltcGw6IG1heGltdW1JbXBsQ1BVLFxuICBtaW5pbXVtSW1wbDogbWluaW11bUltcGxDUFUsXG4gIG11bHRpcGx5SW1wbDogbXVsdGlwbHlJbXBsQ1BVLFxuICBuZWdJbXBsOiBuZWdJbXBsQ1BVLFxuICBub3RFcXVhbEltcGw6IG5vdEVxdWFsSW1wbENQVSxcbiAgcHJvZEltcGw6IHByb2RJbXBsQ1BVLFxuICByYWdnZWRHYXRoZXJJbXBsOiByYWdnZWRHYXRoZXJJbXBsQ1BVLFxuICByYWdnZWRUZW5zb3JUb1RlbnNvckltcGw6IHJhZ2dlZFRlbnNvclRvVGVuc29ySW1wbENQVSxcbiAgcmFuZ2VJbXBsOiByYW5nZUltcGxDUFUsXG4gIHJzcXJ0SW1wbDogcnNxcnRJbXBsQ1BVLFxuICBzY2F0dGVySW1wbDogc2NhdHRlckltcGxDUFUsXG4gIHNpZ21vaWRJbXBsOiBzaWdtb2lkSW1wbENQVSxcbiAgc2ltcGxlQWJzSW1wbDogc2ltcGxlQWJzSW1wbENQVSxcbiAgc2xpY2VJbXBsOiBzbGljZUltcGxDUFUsXG4gIHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsOiBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSxcbiAgc3BhcnNlUmVzaGFwZUltcGw6IHNwYXJzZVJlc2hhcGVJbXBsQ1BVLFxuICBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbDogc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFUsXG4gIHNxcnRJbXBsOiBzcXJ0SW1wbENQVSxcbiAgc3RyaWRlZFNsaWNlSW1wbDogc3RyaWRlZFNsaWNlSW1wbENQVSxcbiAgc3RyaW5nTkdyYW1zSW1wbDogc3RyaW5nTkdyYW1zSW1wbENQVSxcbiAgc3RyaW5nU3BsaXRJbXBsOiBzdHJpbmdTcGxpdEltcGxDUFUsXG4gIHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsOiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSxcbiAgc3ViSW1wbDogc3ViSW1wbENQVSxcbiAgdGlsZUltcGw6IHRpbGVJbXBsQ1BVLFxuICB0b3BLSW1wbDogdG9wS0ltcGxDUFUsXG4gIHRyYW5zcG9zZUltcGw6IHRyYW5zcG9zZUltcGxDUFUsXG4gIHVuaXF1ZUltcGw6IHVuaXF1ZUltcGxDUFUsXG59ID0gc2hhcmVkO1xuXG5leHBvcnQge1xuICBhZGRJbXBsQ1BVLFxuICBiaW5jb3VudEltcGxDUFUsXG4gIGJpbmNvdW50UmVkdWNlSW1wbENQVSxcbiAgY2FzdEltcGxDUFUsXG4gIGNlaWxJbXBsQ1BVLFxuICBjb25jYXRJbXBsQ1BVLFxuICBlcXVhbEltcGxDUFUsXG4gIGV4cEltcGxDUFUsXG4gIGV4cG0xSW1wbENQVSxcbiAgZmxvb3JJbXBsQ1BVLFxuICBnYXRoZXJOZEltcGxDUFUsXG4gIGdhdGhlclYySW1wbENQVSxcbiAgZ3JlYXRlckVxdWFsSW1wbENQVSxcbiAgZ3JlYXRlckltcGxDUFUsXG4gIGxlc3NFcXVhbEltcGxDUFUsXG4gIGxlc3NJbXBsQ1BVLFxuICBsaW5TcGFjZUltcGxDUFUsXG4gIGxvZ0ltcGxDUFUsXG4gIG1heEltcGxDUFUsXG4gIG1heGltdW1JbXBsQ1BVLFxuICBtaW5pbXVtSW1wbENQVSxcbiAgbXVsdGlwbHlJbXBsQ1BVLFxuICBuZWdJbXBsQ1BVLFxuICBub3RFcXVhbEltcGxDUFUsXG4gIHByb2RJbXBsQ1BVLFxuICByYWdnZWRHYXRoZXJJbXBsQ1BVLFxuICByYWdnZWRUZW5zb3JUb1RlbnNvckltcGxDUFUsXG4gIHNjYXR0ZXJJbXBsQ1BVLFxuICBzaWdtb2lkSW1wbENQVSxcbiAgc2ltcGxlQWJzSW1wbENQVSxcbiAgc2xpY2VJbXBsQ1BVLFxuICBzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVSxcbiAgc3BhcnNlUmVzaGFwZUltcGxDUFUsXG4gIHNwYXJzZVNlZ21lbnRSZWR1Y3Rpb25JbXBsQ1BVLFxuICBzcXJ0SW1wbENQVSxcbiAgc3RyaWRlZFNsaWNlSW1wbENQVSxcbiAgc3RyaW5nTkdyYW1zSW1wbENQVSxcbiAgc3RyaW5nU3BsaXRJbXBsQ1BVLFxuICBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVSxcbiAgc3ViSW1wbENQVSxcbiAgcmFuZ2VJbXBsQ1BVLFxuICByc3FydEltcGxDUFUsXG4gIHRpbGVJbXBsQ1BVLFxuICB0b3BLSW1wbENQVSxcbiAgdHJhbnNwb3NlSW1wbENQVSxcbiAgdW5pcXVlSW1wbENQVSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport function getVecChannels(name, rank) {\n    return ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank).map(d => `${name}.${d}`);\n}\nexport function getChannels(name, rank) {\n    if (rank === 1) {\n        return [name];\n    }\n    return getVecChannels(name, rank);\n}\nexport function getSourceCoords(rank, dims) {\n    if (rank === 1) {\n        return 'rc';\n    }\n    let coords = '';\n    for (let i = 0; i < rank; i++) {\n        coords += dims[i];\n        if (i < rank - 1) {\n            coords += ',';\n        }\n    }\n    return coords;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja2luZ191dGlsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9wYWNraW5nX3V0aWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsTUFBTSxVQUFVLGNBQWMsQ0FBQyxJQUFZLEVBQUUsSUFBWTtJQUN2RCxPQUFPLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sVUFBVSxXQUFXLENBQUMsSUFBWSxFQUFFLElBQVk7SUFDcEQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0tBQ2Y7SUFDRCxPQUFPLGNBQWMsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUVELE1BQU0sVUFBVSxlQUFlLENBQUMsSUFBWSxFQUFFLElBQWM7SUFDMUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxJQUFJLENBQUM7S0FDYjtJQUVELElBQUksTUFBTSxHQUFHLEVBQUUsQ0FBQztJQUNoQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQzdCLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEIsSUFBSSxDQUFDLEdBQUcsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNoQixNQUFNLElBQUksR0FBRyxDQUFDO1NBQ2Y7S0FDRjtJQUNELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRWZWNDaGFubmVscyhuYW1lOiBzdHJpbmcsIHJhbms6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgcmV0dXJuIFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXS5zbGljZSgwLCByYW5rKS5tYXAoZCA9PiBgJHtuYW1lfS4ke2R9YCk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRDaGFubmVscyhuYW1lOiBzdHJpbmcsIHJhbms6IG51bWJlcik6IHN0cmluZ1tdIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gW25hbWVdO1xuICB9XG4gIHJldHVybiBnZXRWZWNDaGFubmVscyhuYW1lLCByYW5rKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldFNvdXJjZUNvb3JkcyhyYW5rOiBudW1iZXIsIGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gJ3JjJztcbiAgfVxuXG4gIGxldCBjb29yZHMgPSAnJztcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5rOyBpKyspIHtcbiAgICBjb29yZHMgKz0gZGltc1tpXTtcbiAgICBpZiAoaSA8IHJhbmsgLSAxKSB7XG4gICAgICBjb29yZHMgKz0gJywnO1xuICAgIH1cbiAgfVxuICByZXR1cm4gY29vcmRzO1xufSJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class PackProgram {\n    constructor(outputShape) {\n        this.variableNames = ['A'];\n        this.packedInputs = false;\n        this.packedOutput = true;\n        // Only input / output 3D tensors.\n        this.outputShape = outputShape;\n        this.rank = outputShape.length;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        if (this.rank === 0) {\n            this.userCode = `\n        void main() {\n          setOutput(vec4(getA(), 0., 0., 0.));\n        }\n      `;\n        }\n        else {\n            const channels = getChannels('rc', this.rank);\n            const dtype = getCoordsDataType(this.rank);\n            const outOfBoundsCondition = this.getOutOfBoundsCondition(channels);\n            const setup = this.getSetup(channels);\n            const output = this.getOutput(channels);\n            this.userCode = `\n        void main() {\n          ${dtype} rc = getOutputCoords();\n\n          if(${outOfBoundsCondition}) {\n            setOutput(vec4(0));\n          } else {\n            ${setup}\n\n            setOutput(vec4(${output}));\n          }\n        }\n      `;\n        }\n    }\n    getSourceCoordsArr(dims) {\n        const coords = [];\n        for (let row = 0; row <= 1; row++) {\n            for (let col = 0; col <= 1; col++) {\n                let coord = `${row === 0 ? 'r' : 'rp1'}, ${col === 0 ? 'c' : 'cp1'}`;\n                for (let d = 2; d < this.rank; d++) {\n                    coord = `${dims[dims.length - 1 - d]},` + coord;\n                }\n                coords.push(coord);\n            }\n        }\n        return coords;\n    }\n    getOutOfBoundsCondition(dims) {\n        if (this.rank === 1) {\n            return `rc > ${this.enableShapeUniforms ? 'outShape' : this.outputShape[0]}`;\n        }\n        let cond = '';\n        for (let i = this.rank - 2; i < this.rank; i++) {\n            cond += `${dims[i]} >= ${this.enableShapeUniforms ? `outShape[${i}]` : this.outputShape[i]}`;\n            if (i < this.rank - 1) {\n                cond += '||';\n            }\n        }\n        return cond;\n    }\n    getSetup(dims) {\n        if (this.rank === 1) {\n            return '';\n        }\n        const innerDims = dims.slice(-2);\n        const col = this.enableShapeUniforms ? `outShape[${this.rank} - 1]` :\n            this.outputShape[this.rank - 1];\n        const row = this.enableShapeUniforms ? `outShape[${this.rank} - 2]` :\n            this.outputShape[this.rank - 2];\n        return `\n      int r = ${innerDims[0]};\n      int c = ${innerDims[1]};\n      int rp1 = r + 1;\n      int cp1 = c + 1;\n\n      bool cEdge = cp1 >= ${col};\n      bool rEdge = rp1 >= ${row};\n    `;\n    }\n    getOutput(dims) {\n        const sourceCoords = this.getSourceCoordsArr(dims);\n        if (this.rank === 1) {\n            const outShape = this.enableShapeUniforms ? 'outShape' : this.outputShape[0];\n            return `getA(rc), (rc + 1 >= ${outShape} ? 0. : getA(rc + 1)), 0, 0`;\n        }\n        return `getA(${sourceCoords[0]}),\n            cEdge ? 0. : getA(${sourceCoords[1]}),\n            rEdge ? 0. : getA(${sourceCoords[2]}),\n            rEdge || cEdge ? 0. : getA(${sourceCoords[3]})`;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFja19ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3BhY2tfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLFdBQVc7SUFTdEIsWUFDSSxXQUNZO1FBVmhCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQU9DLGtDQUFrQztRQUNyRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNuQixJQUFJLENBQUMsUUFBUSxHQUFHOzs7O09BSWYsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM5QyxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDM0MsTUFBTSxvQkFBb0IsR0FBRyxJQUFJLENBQUMsdUJBQXVCLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEUsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FB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Q0FBQztRQUV2RSxPQUFPO2dCQUNLLFNBQVMsQ0FBQyxDQUFDLENBQUM7Z0JBQ1osU0FBUyxDQUFDLENBQUMsQ0FBQzs7Ozs0QkFJQSxHQUFHOzRCQUNILEdBQUc7S0FDMUIsQ0FBQztJQUNKLENBQUM7SUFFTyxTQUFTLENBQUMsSUFBYztRQUM5QixNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDbkQsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNuQixNQUFNLFFBQVEsR0FDVixJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNoRSxPQUFPLHdCQUF3QixRQUFRLDZCQUE2QixDQUFDO1NBQ3RFO1FBRUQsT0FBTyxRQUFRLFlBQVksQ0FBQyxDQUFDLENBQUM7Z0NBQ0YsWUFBWSxDQUFDLENBQUMsQ0FBQztnQ0FDZixZQUFZLENBQUMsQ0FBQyxDQUFDO3lDQUNOLFlBQVksQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQzFELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBQYWNrUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSBmYWxzZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgcmFuazogbnVtYmVyO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgb3V0cHV0U2hhcGU6XG4gICAgICAgICAgbnVtYmVyW10pIHsgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvODkzKTpcbiAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBpbnB1dCAvIG91dHB1dCAzRCB0ZW5zb3JzLlxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICBpZiAodGhpcy5yYW5rID09PSAwKSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZlYzQoZ2V0QSgpLCAwLiwgMC4sIDAuKSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgdGhpcy5yYW5rKTtcbiAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICAgIGNvbnN0IG91dE9mQm91bmRzQ29uZGl0aW9uID0gdGhpcy5nZXRPdXRPZkJvdW5kc0NvbmRpdGlvbihjaGFubmVscyk7XG4gICAgICBjb25zdCBzZXR1cCA9IHRoaXMuZ2V0U2V0dXAoY2hhbm5lbHMpO1xuICAgICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5nZXRPdXRwdXQoY2hhbm5lbHMpO1xuXG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHtkdHlwZX0gcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICAgIGlmKCR7b3V0T2ZCb3VuZHNDb25kaXRpb259KSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQodmVjNCgwKSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR7c2V0dXB9XG5cbiAgICAgICAgICAgIHNldE91dHB1dCh2ZWM0KCR7b3V0cHV0fSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldFNvdXJjZUNvb3Jkc0FycihkaW1zOiBzdHJpbmdbXSk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBjb29yZHMgPSBbXTtcblxuICAgIGZvciAobGV0IHJvdyA9IDA7IHJvdyA8PSAxOyByb3crKykge1xuICAgICAgZm9yIChsZXQgY29sID0gMDsgY29sIDw9IDE7IGNvbCsrKSB7XG4gICAgICAgIGxldCBjb29yZCA9IGAke3JvdyA9PT0gMCA/ICdyJyA6ICdycDEnfSwgJHtjb2wgPT09IDAgPyAnYycgOiAnY3AxJ31gO1xuXG4gICAgICAgIGZvciAobGV0IGQgPSAyOyBkIDwgdGhpcy5yYW5rOyBkKyspIHtcbiAgICAgICAgICBjb29yZCA9IGAke2RpbXNbZGltcy5sZW5ndGggLSAxIC0gZF19LGAgKyBjb29yZDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvb3Jkcy5wdXNoKGNvb3JkKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNvb3JkcztcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3V0T2ZCb3VuZHNDb25kaXRpb24oZGltczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLnJhbmsgPT09IDEpIHtcbiAgICAgIHJldHVybiBgcmMgPiAke1xuICAgICAgICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/ICdvdXRTaGFwZScgOiB0aGlzLm91dHB1dFNoYXBlWzBdfWA7XG4gICAgfVxuXG4gICAgbGV0IGNvbmQgPSAnJztcbiAgICBmb3IgKGxldCBpID0gdGhpcy5yYW5rIC0gMjsgaSA8IHRoaXMucmFuazsgaSsrKSB7XG4gICAgICBjb25kICs9IGAke2RpbXNbaV19ID49ICR7XG4gICAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gYG91dFNoYXBlWyR7aX1dYCA6IHRoaXMub3V0cHV0U2hhcGVbaV19YDtcbiAgICAgIGlmIChpIDwgdGhpcy5yYW5rIC0gMSkge1xuICAgICAgICBjb25kICs9ICd8fCc7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbmQ7XG4gIH1cblxuICBwcml2YXRlIGdldFNldHVwKGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgY29uc3QgaW5uZXJEaW1zID0gZGltcy5zbGljZSgtMik7XG4gICAgY29uc3QgY29sID0gdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gYG91dFNoYXBlWyR7dGhpcy5yYW5rfSAtIDFdYCA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRTaGFwZVt0aGlzLnJhbmsgLSAxXTtcbiAgICBjb25zdCByb3cgPSB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyBgb3V0U2hhcGVbJHt0aGlzLnJhbmt9IC0gMl1gIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm91dHB1dFNoYXBlW3RoaXMucmFuayAtIDJdO1xuXG4gICAgcmV0dXJuIGBcbiAgICAgIGludCByID0gJHtpbm5lckRpbXNbMF19O1xuICAgICAgaW50IGMgPSAke2lubmVyRGltc1sxXX07XG4gICAgICBpbnQgcnAxID0gciArIDE7XG4gICAgICBpbnQgY3AxID0gYyArIDE7XG5cbiAgICAgIGJvb2wgY0VkZ2UgPSBjcDEgPj0gJHtjb2x9O1xuICAgICAgYm9vbCByRWRnZSA9IHJwMSA+PSAke3Jvd307XG4gICAgYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0T3V0cHV0KGRpbXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBjb25zdCBzb3VyY2VDb29yZHMgPSB0aGlzLmdldFNvdXJjZUNvb3Jkc0FycihkaW1zKTtcbiAgICBpZiAodGhpcy5yYW5rID09PSAxKSB7XG4gICAgICBjb25zdCBvdXRTaGFwZSA9XG4gICAgICAgICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID8gJ291dFNoYXBlJyA6IHRoaXMub3V0cHV0U2hhcGVbMF07XG4gICAgICByZXR1cm4gYGdldEEocmMpLCAocmMgKyAxID49ICR7b3V0U2hhcGV9ID8gMC4gOiBnZXRBKHJjICsgMSkpLCAwLCAwYDtcbiAgICB9XG5cbiAgICByZXR1cm4gYGdldEEoJHtzb3VyY2VDb29yZHNbMF19KSxcbiAgICAgICAgICAgIGNFZGdlID8gMC4gOiBnZXRBKCR7c291cmNlQ29vcmRzWzFdfSksXG4gICAgICAgICAgICByRWRnZSA/IDAuIDogZ2V0QSgke3NvdXJjZUNvb3Jkc1syXX0pLFxuICAgICAgICAgICAgckVkZ2UgfHwgY0VkZ2UgPyAwLiA6IGdldEEoJHtzb3VyY2VDb29yZHNbM119KWA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nimport * as shader_util from './shader_compiler_util';\nexport class ReshapePackedProgram {\n    constructor(outputShape, inputShape) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.customUniforms = [{ name: 'inputShape', type: 'ivec3' }];\n        this.outputShape = outputShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        let mainLoop = ``;\n        for (let i = 0; i < 4; i++) {\n            let thisRC = `thisRC = rc;`;\n            if (i % 2 === 1) {\n                thisRC += `thisRC.z += 1;`;\n            }\n            if (i > 1) {\n                thisRC += `thisRC.y += 1;`;\n            }\n            mainLoop += `\n        ${thisRC}\n        ${i > 0 ? `if(thisRC.y < rows && thisRC.z < cols){` : ''}\n          int flatIndex = getFlatIndex(thisRC);\n\n          ivec3 inputRC = inputCoordsFromReshapedOutCoords(flatIndex);\n          vec2 inputRCInnerDims = vec2(float(inputRC.y),float(inputRC.z));\n\n          result[${i}] =\n            getChannel(getA(inputRC.x, inputRC.y, inputRC.z), inputRCInnerDims);\n        ${i > 0 ? '}' : ''}\n      `;\n        }\n        this.userCode = `\n      ${getReshapedInputCoords(inputShape, this.enableShapeUniforms)}\n      ${this.enableShapeUniforms ? shader_util.getFlatIndexFrom3DOutput() :\n            shader_util.getFlatIndexFrom3D(outputShape)}\n\n      void main() {\n        ivec3 rc = getOutputCoords();\n\n        vec4 result = vec4(0.);\n\n        ivec3 thisRC;\n        int rows = ${this.enableShapeUniforms ? 'outShape[1]' : outputShape[1]};\n        int cols = ${this.enableShapeUniforms ? 'outShape[2]' : outputShape[2]};\n\n        ${mainLoop}\n\n        setOutput(result);\n      }\n    `;\n    }\n}\nfunction getReshapedInputCoords(shape, enableShapeUniforms) {\n    const coordsFromIndexSnippet = enableShapeUniforms ?\n        shader_util.getLogicalCoordinatesFromFlatIndexByUniform(['r', 'c', 'd'], 'inputShape') :\n        shader_util.getLogicalCoordinatesFromFlatIndex(['r', 'c', 'd'], shape);\n    return `\n    ivec3 inputCoordsFromReshapedOutCoords(int index) {\n      ${coordsFromIndexSnippet}\n      return ivec3(r, c, d);\n    }\n  `;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZV9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9yZXNoYXBlX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQzVELE9BQU8sS0FBSyxXQUFXLE1BQU0sd0JBQXdCLENBQUM7QUFFdEQsTUFBTSxPQUFPLG9CQUFvQjtJQVMvQixZQUFZLFdBQXFDLEVBQUUsVUFFbEQ7UUFWRCxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFJcEIsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRSxDQUFDLENBQUM7UUFLL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsSUFBSSxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ2xCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDMUIsSUFBSSxNQUFNLEdBQUcsY0FBYyxDQUFDO1lBQzVCLElBQUksQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQ2YsTUFBTSxJQUFJLGdCQUFnQixDQUFDO2FBQzVCO1lBQ0QsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNULE1BQU0sSUFBSSxnQkFBZ0IsQ0FBQzthQUM1QjtZQUVELFFBQVEsSUFBSTtVQUNSLE1BQU07VUFDTixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFDLENBQUMsRUFBRTs7Ozs7O21CQU03QyxDQUFDOztVQUVWLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtPQUNuQixDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHO1FBQ1osc0JBQXNCLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztRQUU1RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyx3QkFBd0IsRUFBRSxDQUFDLENBQUM7WUFDeEMsV0FBVyxDQUFDLGtCQUFrQixDQUFDLFdBQVcsQ0FBQzs7Ozs7Ozs7cUJBUXpELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO3FCQUN6RCxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQzs7VUFFcEUsUUFBUTs7OztLQUliLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxTQUFTLHNCQUFzQixDQUMzQixLQUErQixFQUFFLG1CQUE0QjtJQUMvRCxNQUFNLHNCQUFzQixHQUFHLG1CQUFtQixDQUFDLENBQUM7UUFDaEQsV0FBVyxDQUFDLDJDQUEyQyxDQUNuRCxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQztRQUNwQyxXQUFXLENBQUMsa0NBQWtDLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTNFLE9BQU87O1FBRUQsc0JBQXNCOzs7R0FHM0IsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0ICogYXMgc2hhZGVyX3V0aWwgZnJvbSAnLi9zaGFkZXJfY29tcGlsZXJfdXRpbCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNoYXBlUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ2lucHV0U2hhcGUnLCB0eXBlOiAnaXZlYzMnIGFzIGNvbnN0IH1dO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGlucHV0U2hhcGU6IFtcbiAgICBudW1iZXIsIG51bWJlciwgbnVtYmVyXG4gIF0pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICBsZXQgbWFpbkxvb3AgPSBgYDtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IDQ7IGkrKykge1xuICAgICAgbGV0IHRoaXNSQyA9IGB0aGlzUkMgPSByYztgO1xuICAgICAgaWYgKGkgJSAyID09PSAxKSB7XG4gICAgICAgIHRoaXNSQyArPSBgdGhpc1JDLnogKz0gMTtgO1xuICAgICAgfVxuICAgICAgaWYgKGkgPiAxKSB7XG4gICAgICAgIHRoaXNSQyArPSBgdGhpc1JDLnkgKz0gMTtgO1xuICAgICAgfVxuXG4gICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICR7dGhpc1JDfVxuICAgICAgICAke2kgPiAwID8gYGlmKHRoaXNSQy55IDwgcm93cyAmJiB0aGlzUkMueiA8IGNvbHMpe2AgOiAnJ31cbiAgICAgICAgICBpbnQgZmxhdEluZGV4ID0gZ2V0RmxhdEluZGV4KHRoaXNSQyk7XG5cbiAgICAgICAgICBpdmVjMyBpbnB1dFJDID0gaW5wdXRDb29yZHNGcm9tUmVzaGFwZWRPdXRDb29yZHMoZmxhdEluZGV4KTtcbiAgICAgICAgICB2ZWMyIGlucHV0UkNJbm5lckRpbXMgPSB2ZWMyKGZsb2F0KGlucHV0UkMueSksZmxvYXQoaW5wdXRSQy56KSk7XG5cbiAgICAgICAgICByZXN1bHRbJHtpfV0gPVxuICAgICAgICAgICAgZ2V0Q2hhbm5lbChnZXRBKGlucHV0UkMueCwgaW5wdXRSQy55LCBpbnB1dFJDLnopLCBpbnB1dFJDSW5uZXJEaW1zKTtcbiAgICAgICAgJHtpID4gMCA/ICd9JyA6ICcnfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtnZXRSZXNoYXBlZElucHV0Q29vcmRzKGlucHV0U2hhcGUsIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3Jtcyl9XG4gICAgICAke1xuICAgICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyBzaGFkZXJfdXRpbC5nZXRGbGF0SW5kZXhGcm9tM0RPdXRwdXQoKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl91dGlsLmdldEZsYXRJbmRleEZyb20zRChvdXRwdXRTaGFwZSl9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuXG4gICAgICAgIGl2ZWMzIHRoaXNSQztcbiAgICAgICAgaW50IHJvd3MgPSAke3RoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/ICdvdXRTaGFwZVsxXScgOiBvdXRwdXRTaGFwZVsxXX07XG4gICAgICAgIGludCBjb2xzID0gJHt0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPyAnb3V0U2hhcGVbMl0nIDogb3V0cHV0U2hhcGVbMl19O1xuXG4gICAgICAgICR7bWFpbkxvb3B9XG5cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRSZXNoYXBlZElucHV0Q29vcmRzKFxuICAgIHNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW4pOiBzdHJpbmcge1xuICBjb25zdCBjb29yZHNGcm9tSW5kZXhTbmlwcGV0ID0gZW5hYmxlU2hhcGVVbmlmb3JtcyA/XG4gICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4QnlVbmlmb3JtKFxuICAgICAgICAgIFsncicsICdjJywgJ2QnXSwgJ2lucHV0U2hhcGUnKSA6XG4gICAgICBzaGFkZXJfdXRpbC5nZXRMb2dpY2FsQ29vcmRpbmF0ZXNGcm9tRmxhdEluZGV4KFsncicsICdjJywgJ2QnXSwgc2hhcGUpO1xuXG4gIHJldHVybiBgXG4gICAgaXZlYzMgaW5wdXRDb29yZHNGcm9tUmVzaGFwZWRPdXRDb29yZHMoaW50IGluZGV4KSB7XG4gICAgICAke2Nvb3Jkc0Zyb21JbmRleFNuaXBwZXR9XG4gICAgICByZXR1cm4gaXZlYzMociwgYywgZCk7XG4gICAgfVxuICBgO1xufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { getInternalFormatForFloat16MatrixTexture, getInternalFormatForFloat16PackedMatrixTexture, getInternalFormatForFloat32MatrixTexture, getInternalFormatForPackedMatrixTexture, getInternalFormatForUnsignedBytesMatrixTexture } from './gpgpu_util';\nimport { getPackedMatrixTextureShapeWidthHeight, getUnpackedMatrixTextureShapeWidthHeight, PhysicalTextureType, TextureUsage } from './tex_util';\nexport class TextureManager {\n    constructor(gpgpu) {\n        this.gpgpu = gpgpu;\n        this.numUsedTextures = 0;\n        this.numFreeTextures = 0;\n        this._numBytesAllocated = 0;\n        this._numBytesFree = 0; // How many bytes that have been allocated\n        // are available for reuse.\n        this.freeTextures = {};\n        this.logEnabled = false;\n        this.usedTextures = {};\n    }\n    acquireTexture(shapeRC, usage, isPacked) {\n        const physicalTexType = getPhysicalFromLogicalTextureType(usage, isPacked);\n        const shapeKey = getKeyFromTextureShape(shapeRC, physicalTexType, isPacked);\n        if (!(shapeKey in this.freeTextures)) {\n            this.freeTextures[shapeKey] = [];\n        }\n        if (!(shapeKey in this.usedTextures)) {\n            this.usedTextures[shapeKey] = [];\n        }\n        const texBytes = computeBytes(shapeRC, physicalTexType, this.gpgpu.gl, this.gpgpu.textureConfig, isPacked);\n        if (this.freeTextures[shapeKey].length > 0) {\n            this.numFreeTextures--;\n            this.numUsedTextures++;\n            this._numBytesFree -= texBytes;\n            this.log();\n            const newTexture = this.freeTextures[shapeKey].shift();\n            this.usedTextures[shapeKey].push(newTexture);\n            return newTexture;\n        }\n        let newTexture;\n        if (physicalTexType === PhysicalTextureType.PACKED_2X2_FLOAT32) {\n            newTexture = this.gpgpu.createPackedMatrixTexture(shapeRC[0], shapeRC[1]);\n        }\n        else if (physicalTexType === PhysicalTextureType.PACKED_2X2_FLOAT16) {\n            newTexture =\n                this.gpgpu.createFloat16PackedMatrixTexture(shapeRC[0], shapeRC[1]);\n        }\n        else if (physicalTexType === PhysicalTextureType.UNPACKED_FLOAT32) {\n            newTexture =\n                this.gpgpu.createFloat32MatrixTexture(shapeRC[0], shapeRC[1]);\n        }\n        else if (physicalTexType === PhysicalTextureType.UNPACKED_FLOAT16) {\n            newTexture =\n                this.gpgpu.createFloat16MatrixTexture(shapeRC[0], shapeRC[1]);\n        }\n        else if (physicalTexType === PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE) {\n            newTexture =\n                this.gpgpu.createUnsignedBytesMatrixTexture(shapeRC[0], shapeRC[1]);\n        }\n        this.usedTextures[shapeKey].push(newTexture);\n        this.numUsedTextures++;\n        this._numBytesAllocated += texBytes;\n        this.log();\n        return newTexture;\n    }\n    releaseTexture(texture, shape, logicalTexType, isPacked) {\n        if (this.freeTextures == null) {\n            // Already disposed.\n            return;\n        }\n        const physicalTexType = getPhysicalFromLogicalTextureType(logicalTexType, isPacked);\n        const shapeKey = getKeyFromTextureShape(shape, physicalTexType, isPacked);\n        if (!(shapeKey in this.freeTextures)) {\n            this.freeTextures[shapeKey] = [];\n        }\n        const texBytes = computeBytes(shape, physicalTexType, this.gpgpu.gl, this.gpgpu.textureConfig, isPacked);\n        const deleteTexThreshold = env().get('WEBGL_DELETE_TEXTURE_THRESHOLD');\n        if (deleteTexThreshold !== -1 &&\n            this._numBytesAllocated > deleteTexThreshold) {\n            this.gpgpu.deleteMatrixTexture(texture.texture);\n            this._numBytesAllocated -= texBytes;\n        }\n        else {\n            this.freeTextures[shapeKey].push(texture);\n            this.numFreeTextures++;\n            this._numBytesFree += texBytes;\n        }\n        this.numUsedTextures--;\n        const texList = this.usedTextures[shapeKey];\n        const texIndex = texList.indexOf(texture);\n        if (texIndex < 0) {\n            throw new Error('Cannot release a texture that was never provided by this ' +\n                'texture manager');\n        }\n        texList.splice(texIndex, 1);\n        this.log();\n    }\n    log() {\n        if (!this.logEnabled) {\n            return;\n        }\n        const total = this.numFreeTextures + this.numUsedTextures;\n        console.log('Free/Used', `${this.numFreeTextures} / ${this.numUsedTextures}`, `(${total})`);\n        const freeRatio = this._numBytesFree / this._numBytesAllocated;\n        console.log(`Bytes allocated: ${this._numBytesAllocated}`);\n        console.log(`Bytes unused: ${this._numBytesFree} (${Math.round(100 * freeRatio)}%)`);\n    }\n    get numBytesAllocated() {\n        return this._numBytesAllocated;\n    }\n    get numBytesFree() {\n        return this._numBytesFree;\n    }\n    getNumUsedTextures() {\n        return this.numUsedTextures;\n    }\n    getNumFreeTextures() {\n        return this.numFreeTextures;\n    }\n    dispose() {\n        if (this.freeTextures == null) {\n            // Already disposed.\n            return;\n        }\n        for (const texShape in this.freeTextures) {\n            this.freeTextures[texShape].forEach(tex => {\n                this.gpgpu.deleteMatrixTexture(tex.texture);\n            });\n        }\n        for (const texShape in this.usedTextures) {\n            this.usedTextures[texShape].forEach(tex => {\n                this.gpgpu.deleteMatrixTexture(tex.texture);\n            });\n        }\n        this.freeTextures = null;\n        this.usedTextures = null;\n        this.numUsedTextures = 0;\n        this.numFreeTextures = 0;\n        this._numBytesAllocated = 0;\n        this._numBytesFree = 0;\n    }\n}\nfunction numBytesForInternalFormat(gl, internalFormat) {\n    // tslint:disable-next-line:no-any\n    const glany = gl;\n    if (internalFormat === glany.R32F) {\n        return 4;\n    }\n    else if (internalFormat === glany.R16F) {\n        return 2;\n    }\n    else if (internalFormat === glany.RGBA32F) {\n        return 16;\n    }\n    else if (internalFormat === gl.RGBA) {\n        return 16;\n    }\n    else if (internalFormat === glany.RGBA16F) {\n        return 8;\n    }\n    else if (internalFormat === glany.RGBA8) {\n        return 4;\n    }\n    throw new Error(`Unknown internal format ${internalFormat}`);\n}\nexport function computeBytes(shape, physicalTexType, gl, textureConfig, isPacked) {\n    // It is not possible to infer packed status from the texture type because\n    // depending on the textureConfig, different  texture types may resolve to the\n    // same internal format (e.g. in WebGL1, the internal format for\n    // UNPACKED_FLOAT16 textures is gl.RGBA). Therefore we pass in `isPacked`\n    // explicitly.\n    const internalFormat = internalFormatForPhysicalTexType(physicalTexType, textureConfig);\n    let numElements;\n    if (isPacked) {\n        const [packedWidth, packedHeight] = getPackedMatrixTextureShapeWidthHeight(shape[0], shape[1]);\n        numElements = packedWidth * packedHeight;\n    }\n    else {\n        const [width, height] = getUnpackedMatrixTextureShapeWidthHeight(shape[0], shape[1]);\n        numElements = width * height;\n    }\n    const bytesPerElement = numBytesForInternalFormat(gl, internalFormat);\n    return numElements * bytesPerElement;\n}\nfunction internalFormatForPhysicalTexType(physicalTexType, textureConfig) {\n    switch (physicalTexType) {\n        case PhysicalTextureType.PACKED_2X2_FLOAT32:\n            return getInternalFormatForPackedMatrixTexture(textureConfig);\n        case PhysicalTextureType.PACKED_2X2_FLOAT16:\n            return getInternalFormatForFloat16PackedMatrixTexture(textureConfig);\n        case PhysicalTextureType.UNPACKED_FLOAT32:\n            return getInternalFormatForFloat32MatrixTexture(textureConfig);\n        case PhysicalTextureType.UNPACKED_FLOAT16:\n            return getInternalFormatForFloat16MatrixTexture(textureConfig);\n        case PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE:\n            return getInternalFormatForUnsignedBytesMatrixTexture(textureConfig);\n        default:\n            throw new Error(`Unknown physical texture type ${physicalTexType}`);\n    }\n}\nfunction getPhysicalTextureForRendering(isPacked) {\n    if (env().getBool('WEBGL_RENDER_FLOAT32_ENABLED')) {\n        if (isPacked) {\n            return PhysicalTextureType.PACKED_2X2_FLOAT32;\n        }\n        return PhysicalTextureType.UNPACKED_FLOAT32;\n    }\n    if (isPacked) {\n        return PhysicalTextureType.PACKED_2X2_FLOAT16;\n    }\n    return PhysicalTextureType.UNPACKED_FLOAT16;\n}\nfunction getPhysicalFromLogicalTextureType(logicalTexType, isPacked) {\n    if (logicalTexType === TextureUsage.UPLOAD) {\n        return PhysicalTextureType.PACKED_2X2_FLOAT32;\n    }\n    else if (logicalTexType === TextureUsage.RENDER || logicalTexType == null) {\n        return getPhysicalTextureForRendering(isPacked);\n    }\n    else if (logicalTexType === TextureUsage.DOWNLOAD ||\n        logicalTexType === TextureUsage.PIXELS) {\n        return PhysicalTextureType.PACKED_4X1_UNSIGNED_BYTE;\n    }\n    throw new Error(`Unknown logical texture type ${logicalTexType}`);\n}\nfunction getKeyFromTextureShape(shapeRowsCol, physicalTexType, isPacked) {\n    return `${shapeRowsCol[0]}_${shapeRowsCol[1]}_${physicalTexType}_${isPacked}`;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGV4dHVyZV9tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy90ZXh0dXJlX21hbmFnZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzFDLE9BQU8sRUFBQyx3Q0FBd0MsRUFBRSw4Q0FBOEMsRUFBRSx3Q0FBd0MsRUFBRSx1Q0FBdUMsRUFBRSw4Q0FBOEMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUN6UCxPQUFPLEVBQUMsc0NBQXNDLEVBQUUsd0NBQXdDLEVBQUUsbUJBQW1CLEVBQTBCLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQztBQUV2SyxNQUFNLE9BQU8sY0FBYztJQVV6QixZQUFvQixLQUFtQjtRQUFuQixVQUFLLEdBQUwsS0FBSyxDQUFjO1FBVC9CLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLG9CQUFlLEdBQUcsQ0FBQyxDQUFDO1FBQ3BCLHVCQUFrQixHQUFHLENBQUMsQ0FBQztRQUN2QixrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFFLDBDQUEwQztRQUMxQywyQkFBMkI7UUFDL0MsaUJBQVksR0FBaUMsRUFBRSxDQUFDO1FBQ2hELGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsaUJBQVksR0FBaUMsRUFBRSxDQUFDO0lBRWQsQ0FBQztJQUUzQyxjQUFjLENBQ1YsT0FBeUIsRUFBRSxLQUFtQixFQUM5QyxRQUFpQjtRQUNuQixNQUFNLGVBQWUsR0FBRyxpQ0FBaUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFM0UsTUFBTSxRQUFRLEdBQUcsc0JBQXNCLENBQUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxF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QUU7UUFDMUMsT0FBTyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQztLQUMvQztTQUFNLElBQUksY0FBYyxLQUFLLFlBQVksQ0FBQyxNQUFNLElBQUksY0FBYyxJQUFJLElBQUksRUFBRTtRQUMzRSxPQUFPLDhCQUE4QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2pEO1NBQU0sSUFDSCxjQUFjLEtBQUssWUFBWSxDQUFDLFFBQVE7UUFDeEMsY0FBYyxLQUFLLFlBQVksQ0FBQyxNQUFNLEVBQUU7UUFDMUMsT0FBTyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQztLQUNyRDtJQUNELE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLGNBQWMsRUFBRSxDQUFDLENBQUM7QUFDcEUsQ0FBQztBQUVELFNBQVMsc0JBQXNCLENBQzNCLFlBQThCLEVBQUUsZUFBb0MsRUFDcEUsUUFBaUI7SUFDbkIsT0FBTyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsSUFBSSxZQUFZLENBQUMsQ0FBQyxDQUFDLElBQUksZUFBZSxJQUFJLFFBQVEsRUFBRSxDQUFDO0FBQ2hGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVQ29udGV4dH0gZnJvbSAnLi9ncGdwdV9jb250ZXh0JztcbmltcG9ydCB7Z2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2TWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDE2UGFja2VkTWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDMyTWF0cml4VGV4dHVyZSwgZ2V0SW50ZXJuYWxGb3JtYXRGb3JQYWNrZWRNYXRyaXhUZXh0dXJlLCBnZXRJbnRlcm5hbEZvcm1hdEZvclVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlfSBmcm9tICcuL2dwZ3B1X3V0aWwnO1xuaW1wb3J0IHtnZXRQYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCwgZ2V0VW5wYWNrZWRNYXRyaXhUZXh0dXJlU2hhcGVXaWR0aEhlaWdodCwgUGh5c2ljYWxUZXh0dXJlVHlwZSwgVGV4dHVyZSwgVGV4dHVyZUNvbmZpZywgVGV4dHVyZVVzYWdlfSBmcm9tICcuL3RleF91dGlsJztcblxuZXhwb3J0IGNsYXNzIFRleHR1cmVNYW5hZ2VyIHtcbiAgcHJpdmF0ZSBudW1Vc2VkVGV4dHVyZXMgPSAwO1xuICBwcml2YXRlIG51bUZyZWVUZXh0dXJlcyA9IDA7XG4gIHByaXZhdGUgX251bUJ5dGVzQWxsb2NhdGVkID0gMDtcbiAgcHJpdmF0ZSBfbnVtQnl0ZXNGcmVlID0gMDsgIC8vIEhvdyBtYW55IGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIGF2YWlsYWJsZSBmb3IgcmV1c2UuXG4gIHByaXZhdGUgZnJlZVRleHR1cmVzOiB7W3NoYXBlOiBzdHJpbmddOiBUZXh0dXJlW119ID0ge307XG4gIHByaXZhdGUgbG9nRW5hYmxlZCA9IGZhbHNlO1xuICBwcml2YXRlIHVzZWRUZXh0dXJlczoge1tzaGFwZTogc3RyaW5nXTogVGV4dHVyZVtdfSA9IHt9O1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZ3BncHU6IEdQR1BVQ29udGV4dCkge31cblxuICBhY3F1aXJlVGV4dHVyZShcbiAgICAgIHNoYXBlUkM6IFtudW1iZXIsIG51bWJlcl0sIHVzYWdlOiBUZXh0dXJlVXNhZ2UsXG4gICAgICBpc1BhY2tlZDogYm9vbGVhbik6IFRleHR1cmUge1xuICAgIGNvbnN0IHBoeXNpY2FsVGV4VHlwZSA9IGdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZSh1c2FnZSwgaXNQYWNrZWQpO1xuXG4gICAgY29uc3Qgc2hhcGVLZXkgPSBnZXRLZXlGcm9tVGV4dHVyZVNoYXBlKHNoYXBlUkMsIHBoeXNpY2FsVGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgIGlmICghKHNoYXBlS2V5IGluIHRoaXMuZnJlZVRleHR1cmVzKSkge1xuICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldID0gW107XG4gICAgfVxuICAgIGlmICghKHNoYXBlS2V5IGluIHRoaXMudXNlZFRleHR1cmVzKSkge1xuICAgICAgdGhpcy51c2VkVGV4dHVyZXNbc2hhcGVLZXldID0gW107XG4gICAgfVxuXG4gICAgY29uc3QgdGV4Qnl0ZXMgPSBjb21wdXRlQnl0ZXMoXG4gICAgICAgIHNoYXBlUkMsIHBoeXNpY2FsVGV4VHlwZSwgdGhpcy5ncGdwdS5nbCwgdGhpcy5ncGdwdS50ZXh0dXJlQ29uZmlnLFxuICAgICAgICBpc1BhY2tlZCk7XG5cbiAgICBpZiAodGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMubnVtRnJlZVRleHR1cmVzLS07XG4gICAgICB0aGlzLm51bVVzZWRUZXh0dXJlcysrO1xuICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlIC09IHRleEJ5dGVzO1xuICAgICAgdGhpcy5sb2coKTtcbiAgICAgIGNvbnN0IG5ld1RleHR1cmUgPSB0aGlzLmZyZWVUZXh0dXJlc1tzaGFwZUtleV0uc2hpZnQoKTtcbiAgICAgIHRoaXMudXNlZFRleHR1cmVzW3NoYXBlS2V5XS5wdXNoKG5ld1RleHR1cmUpO1xuICAgICAgcmV0dXJuIG5ld1RleHR1cmU7XG4gICAgfVxuXG4gICAgbGV0IG5ld1RleHR1cmU6IFRleHR1cmU7XG4gICAgaWYgKHBoeXNpY2FsVGV4VHlwZSA9PT0gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzIpIHtcbiAgICAgIG5ld1RleHR1cmUgPSB0aGlzLmdwZ3B1LmNyZWF0ZVBhY2tlZE1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgfSBlbHNlIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2KSB7XG4gICAgICBuZXdUZXh0dXJlID1cbiAgICAgICAgICB0aGlzLmdwZ3B1LmNyZWF0ZUZsb2F0MTZQYWNrZWRNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgIH0gZWxzZSBpZiAocGh5c2ljYWxUZXhUeXBlID09PSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzIpIHtcbiAgICAgIG5ld1RleHR1cmUgPVxuICAgICAgICAgIHRoaXMuZ3BncHUuY3JlYXRlRmxvYXQzMk1hdHJpeFRleHR1cmUoc2hhcGVSQ1swXSwgc2hhcGVSQ1sxXSk7XG4gICAgfSBlbHNlIGlmIChwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNikge1xuICAgICAgbmV3VGV4dHVyZSA9XG4gICAgICAgICAgdGhpcy5ncGdwdS5jcmVhdGVGbG9hdDE2TWF0cml4VGV4dHVyZShzaGFwZVJDWzBdLCBzaGFwZVJDWzFdKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBwaHlzaWNhbFRleFR5cGUgPT09IFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzRYMV9VTlNJR05FRF9CWVRFKSB7XG4gICAgICBuZXdUZXh0dXJlID1cbiAgICAgICAgICB0aGlzLmdwZ3B1LmNyZWF0ZVVuc2lnbmVkQnl0ZXNNYXRyaXhUZXh0dXJlKHNoYXBlUkNbMF0sIHNoYXBlUkNbMV0pO1xuICAgIH1cbiAgICB0aGlzLnVzZWRUZXh0dXJlc1tzaGFwZUtleV0ucHVzaChuZXdUZXh0dXJlKTtcblxuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzKys7XG4gICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgKz0gdGV4Qnl0ZXM7XG4gICAgdGhpcy5sb2coKTtcblxuICAgIHJldHVybiBuZXdUZXh0dXJlO1xuICB9XG5cbiAgcmVsZWFzZVRleHR1cmUoXG4gICAgICB0ZXh0dXJlOiBUZXh0dXJlLCBzaGFwZTogW251bWJlciwgbnVtYmVyXSwgbG9naWNhbFRleFR5cGU6IFRleHR1cmVVc2FnZSxcbiAgICAgIGlzUGFja2VkOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZnJlZVRleHR1cmVzID09IG51bGwpIHtcbiAgICAgIC8vIEFscmVhZHkgZGlzcG9zZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHBoeXNpY2FsVGV4VHlwZSA9XG4gICAgICAgIGdldFBoeXNpY2FsRnJvbUxvZ2ljYWxUZXh0dXJlVHlwZShsb2dpY2FsVGV4VHlwZSwgaXNQYWNrZWQpO1xuICAgIGNvbnN0IHNoYXBlS2V5ID0gZ2V0S2V5RnJvbVRleHR1cmVTaGFwZShzaGFwZSwgcGh5c2ljYWxUZXhUeXBlLCBpc1BhY2tlZCk7XG4gICAgaWYgKCEoc2hhcGVLZXkgaW4gdGhpcy5mcmVlVGV4dHVyZXMpKSB7XG4gICAgICB0aGlzLmZyZWVUZXh0dXJlc1tzaGFwZUtleV0gPSBbXTtcbiAgICB9XG5cbiAgICBjb25zdCB0ZXhCeXRlcyA9IGNvbXB1dGVCeXRlcyhcbiAgICAgICAgc2hhcGUsIHBoeXNpY2FsVGV4VHlwZSwgdGhpcy5ncGdwdS5nbCwgdGhpcy5ncGdwdS50ZXh0dXJlQ29uZmlnLFxuICAgICAgICBpc1BhY2tlZCk7XG4gICAgY29uc3QgZGVsZXRlVGV4VGhyZXNob2xkID0gZW52KCkuZ2V0KCdXRUJHTF9ERUxFVEVfVEVYVFVSRV9USFJFU0hPTEQnKTtcbiAgICBpZiAoZGVsZXRlVGV4VGhyZXNob2xkICE9PSAtMSAmJlxuICAgICAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCA+IGRlbGV0ZVRleFRocmVzaG9sZCkge1xuICAgICAgdGhpcy5ncGdwdS5kZWxldGVNYXRyaXhUZXh0dXJlKHRleHR1cmUudGV4dHVyZSk7XG4gICAgICB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZCAtPSB0ZXhCeXRlcztcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5mcmVlVGV4dHVyZXNbc2hhcGVLZXldLnB1c2godGV4dHVyZSk7XG4gICAgICB0aGlzLm51bUZyZWVUZXh0dXJlcysrO1xuICAgICAgdGhpcy5fbnVtQnl0ZXNGcmVlICs9IHRleEJ5dGVzO1xuICAgIH1cblxuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzLS07XG5cbiAgICBjb25zdCB0ZXhMaXN0ID0gdGhpcy51c2VkVGV4dHVyZXNbc2hhcGVLZXldO1xuICAgIGNvbnN0IHRleEluZGV4ID0gdGV4TGlzdC5pbmRleE9mKHRleHR1cmUpO1xuICAgIGlmICh0ZXhJbmRleCA8IDApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAnQ2Fubm90IHJlbGVhc2UgYSB0ZXh0dXJlIHRoYXQgd2FzIG5ldmVyIHByb3ZpZGVkIGJ5IHRoaXMgJyArXG4gICAgICAgICAgJ3RleHR1cmUgbWFuYWdlcicpO1xuICAgIH1cbiAgICB0ZXhMaXN0LnNwbGljZSh0ZXhJbmRleCwgMSk7XG4gICAgdGhpcy5sb2coKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9nKCkge1xuICAgIGlmICghdGhpcy5sb2dFbmFibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHRvdGFsID0gdGhpcy5udW1GcmVlVGV4dHVyZXMgKyB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJ0ZyZWUvVXNlZCcsIGAke3RoaXMubnVtRnJlZVRleHR1cmVzfSAvICR7dGhpcy5udW1Vc2VkVGV4dHVyZXN9YCxcbiAgICAgICAgYCgke3RvdGFsfSlgKTtcbiAgICBjb25zdCBmcmVlUmF0aW8gPSB0aGlzLl9udW1CeXRlc0ZyZWUgLyB0aGlzLl9udW1CeXRlc0FsbG9jYXRlZDtcbiAgICBjb25zb2xlLmxvZyhgQnl0ZXMgYWxsb2NhdGVkOiAke3RoaXMuX251bUJ5dGVzQWxsb2NhdGVkfWApO1xuICAgIGNvbnNvbGUubG9nKGBCeXRlcyB1bnVzZWQ6ICR7dGhpcy5fbnVtQnl0ZXNGcmVlfSAoJHtcbiAgICAgICAgTWF0aC5yb3VuZCgxMDAgKiBmcmVlUmF0aW8pfSUpYCk7XG4gIH1cblxuICBnZXQgbnVtQnl0ZXNBbGxvY2F0ZWQoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQ7XG4gIH1cblxuICBnZXQgbnVtQnl0ZXNGcmVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuX251bUJ5dGVzRnJlZTtcbiAgfVxuXG4gIGdldE51bVVzZWRUZXh0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm51bVVzZWRUZXh0dXJlcztcbiAgfVxuXG4gIGdldE51bUZyZWVUZXh0dXJlcygpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLm51bUZyZWVUZXh0dXJlcztcbiAgfVxuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZnJlZVRleHR1cmVzID09IG51bGwpIHtcbiAgICAgIC8vIEFscmVhZHkgZGlzcG9zZWQuXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgdGV4U2hhcGUgaW4gdGhpcy5mcmVlVGV4dHVyZXMpIHtcbiAgICAgIHRoaXMuZnJlZVRleHR1cmVzW3RleFNoYXBlXS5mb3JFYWNoKHRleCA9PiB7XG4gICAgICAgIHRoaXMuZ3BncHUuZGVsZXRlTWF0cml4VGV4dHVyZSh0ZXgudGV4dHVyZSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZm9yIChjb25zdCB0ZXhTaGFwZSBpbiB0aGlzLnVzZWRUZXh0dXJlcykge1xuICAgICAgdGhpcy51c2VkVGV4dHVyZXNbdGV4U2hhcGVdLmZvckVhY2godGV4ID0+IHtcbiAgICAgICAgdGhpcy5ncGdwdS5kZWxldGVNYXRyaXhUZXh0dXJlKHRleC50ZXh0dXJlKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmZyZWVUZXh0dXJlcyA9IG51bGw7XG4gICAgdGhpcy51c2VkVGV4dHVyZXMgPSBudWxsO1xuICAgIHRoaXMubnVtVXNlZFRleHR1cmVzID0gMDtcbiAgICB0aGlzLm51bUZyZWVUZXh0dXJlcyA9IDA7XG4gICAgdGhpcy5fbnVtQnl0ZXNBbGxvY2F0ZWQgPSAwO1xuICAgIHRoaXMuX251bUJ5dGVzRnJlZSA9IDA7XG4gIH1cbn1cblxuZnVuY3Rpb24gbnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdChcbiAgICBnbDogV2ViR0xSZW5kZXJpbmdDb250ZXh0LCBpbnRlcm5hbEZvcm1hdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueVxuICBjb25zdCBnbGFueSA9IGdsIGFzIGFueTtcbiAgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SMzJGKSB7XG4gICAgcmV0dXJuIDQ7XG4gIH0gZWxzZSBpZiAoaW50ZXJuYWxGb3JtYXQgPT09IGdsYW55LlIxNkYpIHtcbiAgICByZXR1cm4gMjtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2xhbnkuUkdCQTMyRikge1xuICAgIHJldHVybiAxNjtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2wuUkdCQSkge1xuICAgIHJldHVybiAxNjtcbiAgfSBlbHNlIGlmIChpbnRlcm5hbEZvcm1hdCA9PT0gZ2xhbnkuUkdCQTE2Rikge1xuICAgIHJldHVybiA4O1xuICB9IGVsc2UgaWYgKGludGVybmFsRm9ybWF0ID09PSBnbGFueS5SR0JBOCkge1xuICAgIHJldHVybiA0O1xuICB9XG4gIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBpbnRlcm5hbCBmb3JtYXQgJHtpbnRlcm5hbEZvcm1hdH1gKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVCeXRlcyhcbiAgICBzaGFwZTogW251bWJlciwgbnVtYmVyXSwgcGh5c2ljYWxUZXhUeXBlOiBQaHlzaWNhbFRleHR1cmVUeXBlLFxuICAgIGdsOiBXZWJHTFJlbmRlcmluZ0NvbnRleHQsIHRleHR1cmVDb25maWc6IFRleHR1cmVDb25maWcsXG4gICAgaXNQYWNrZWQ6IGJvb2xlYW4pOiBudW1iZXIge1xuICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gaW5mZXIgcGFja2VkIHN0YXR1cyBmcm9tIHRoZSB0ZXh0dXJlIHR5cGUgYmVjYXVzZVxuICAvLyBkZXBlbmRpbmcgb24gdGhlIHRleHR1cmVDb25maWcsIGRpZmZlcmVudCAgdGV4dHVyZSB0eXBlcyBtYXkgcmVzb2x2ZSB0byB0aGVcbiAgLy8gc2FtZSBpbnRlcm5hbCBmb3JtYXQgKGUuZy4gaW4gV2ViR0wxLCB0aGUgaW50ZXJuYWwgZm9ybWF0IGZvclxuICAvLyBVTlBBQ0tFRF9GTE9BVDE2IHRleHR1cmVzIGlzIGdsLlJHQkEpLiBUaGVyZWZvcmUgd2UgcGFzcyBpbiBgaXNQYWNrZWRgXG4gIC8vIGV4cGxpY2l0bHkuXG4gIGNvbnN0IGludGVybmFsRm9ybWF0ID1cbiAgICAgIGludGVybmFsRm9ybWF0Rm9yUGh5c2ljYWxUZXhUeXBlKHBoeXNpY2FsVGV4VHlwZSwgdGV4dHVyZUNvbmZpZyk7XG5cbiAgbGV0IG51bUVsZW1lbnRzOiBudW1iZXI7XG4gIGlmIChpc1BhY2tlZCkge1xuICAgIGNvbnN0IFtwYWNrZWRXaWR0aCwgcGFja2VkSGVpZ2h0XSA9XG4gICAgICAgIGdldFBhY2tlZE1hdHJpeFRleHR1cmVTaGFwZVdpZHRoSGVpZ2h0KHNoYXBlWzBdLCBzaGFwZVsxXSk7XG4gICAgbnVtRWxlbWVudHMgPSBwYWNrZWRXaWR0aCAqIHBhY2tlZEhlaWdodDtcblxuICB9IGVsc2Uge1xuICAgIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9XG4gICAgICAgIGdldFVucGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoc2hhcGVbMF0sIHNoYXBlWzFdKTtcbiAgICBudW1FbGVtZW50cyA9IHdpZHRoICogaGVpZ2h0O1xuICB9XG5cbiAgY29uc3QgYnl0ZXNQZXJFbGVtZW50ID0gbnVtQnl0ZXNGb3JJbnRlcm5hbEZvcm1hdChnbCwgaW50ZXJuYWxGb3JtYXQpO1xuICByZXR1cm4gbnVtRWxlbWVudHMgKiBieXRlc1BlckVsZW1lbnQ7XG59XG5cbmZ1bmN0aW9uIGludGVybmFsRm9ybWF0Rm9yUGh5c2ljYWxUZXhUeXBlKFxuICAgIHBoeXNpY2FsVGV4VHlwZTogUGh5c2ljYWxUZXh0dXJlVHlwZSxcbiAgICB0ZXh0dXJlQ29uZmlnOiBUZXh0dXJlQ29uZmlnKTogbnVtYmVyIHtcbiAgc3dpdGNoIChwaHlzaWNhbFRleFR5cGUpIHtcbiAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDMyOlxuICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yUGFja2VkTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuUEFDS0VEXzJYMl9GTE9BVDE2OlxuICAgICAgcmV0dXJuIGdldEludGVybmFsRm9ybWF0Rm9yRmxvYXQxNlBhY2tlZE1hdHJpeFRleHR1cmUodGV4dHVyZUNvbmZpZyk7XG4gICAgY2FzZSBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzI6XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JGbG9hdDMyTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICBjYXNlIFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNjpcbiAgICAgIHJldHVybiBnZXRJbnRlcm5hbEZvcm1hdEZvckZsb2F0MTZNYXRyaXhUZXh0dXJlKHRleHR1cmVDb25maWcpO1xuICAgIGNhc2UgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfNFgxX1VOU0lHTkVEX0JZVEU6XG4gICAgICByZXR1cm4gZ2V0SW50ZXJuYWxGb3JtYXRGb3JVbnNpZ25lZEJ5dGVzTWF0cml4VGV4dHVyZSh0ZXh0dXJlQ29uZmlnKTtcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHBoeXNpY2FsIHRleHR1cmUgdHlwZSAke3BoeXNpY2FsVGV4VHlwZX1gKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRQaHlzaWNhbFRleHR1cmVGb3JSZW5kZXJpbmcoaXNQYWNrZWQ6IGJvb2xlYW4pOlxuICAgIFBoeXNpY2FsVGV4dHVyZVR5cGUge1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUkVOREVSX0ZMT0FUMzJfRU5BQkxFRCcpKSB7XG4gICAgaWYgKGlzUGFja2VkKSB7XG4gICAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzI7XG4gICAgfVxuICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlVOUEFDS0VEX0ZMT0FUMzI7XG4gIH1cblxuICBpZiAoaXNQYWNrZWQpIHtcbiAgICByZXR1cm4gUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMTY7XG4gIH1cbiAgcmV0dXJuIFBoeXNpY2FsVGV4dHVyZVR5cGUuVU5QQUNLRURfRkxPQVQxNjtcbn1cblxuZnVuY3Rpb24gZ2V0UGh5c2ljYWxGcm9tTG9naWNhbFRleHR1cmVUeXBlKFxuICAgIGxvZ2ljYWxUZXhUeXBlOiBUZXh0dXJlVXNhZ2UsIGlzUGFja2VkOiBib29sZWFuKTogUGh5c2ljYWxUZXh0dXJlVHlwZSB7XG4gIGlmIChsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLlVQTE9BRCkge1xuICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF8yWDJfRkxPQVQzMjtcbiAgfSBlbHNlIGlmIChsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLlJFTkRFUiB8fCBsb2dpY2FsVGV4VHlwZSA9PSBudWxsKSB7XG4gICAgcmV0dXJuIGdldFBoeXNpY2FsVGV4dHVyZUZvclJlbmRlcmluZyhpc1BhY2tlZCk7XG4gIH0gZWxzZSBpZiAoXG4gICAgICBsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLkRPV05MT0FEIHx8XG4gICAgICBsb2dpY2FsVGV4VHlwZSA9PT0gVGV4dHVyZVVzYWdlLlBJWEVMUykge1xuICAgIHJldHVybiBQaHlzaWNhbFRleHR1cmVUeXBlLlBBQ0tFRF80WDFfVU5TSUdORURfQllURTtcbiAgfVxuICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbG9naWNhbCB0ZXh0dXJlIHR5cGUgJHtsb2dpY2FsVGV4VHlwZX1gKTtcbn1cblxuZnVuY3Rpb24gZ2V0S2V5RnJvbVRleHR1cmVTaGFwZShcbiAgICBzaGFwZVJvd3NDb2w6IFtudW1iZXIsIG51bWJlcl0sIHBoeXNpY2FsVGV4VHlwZTogUGh5c2ljYWxUZXh0dXJlVHlwZSxcbiAgICBpc1BhY2tlZDogYm9vbGVhbik6IHN0cmluZyB7XG4gIHJldHVybiBgJHtzaGFwZVJvd3NDb2xbMF19XyR7c2hhcGVSb3dzQ29sWzFdfV8ke3BoeXNpY2FsVGV4VHlwZX1fJHtpc1BhY2tlZH1gO1xufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nexport class UnaryOpProgram {\n    constructor(aShape, opSnippet) {\n        this.variableNames = ['A'];\n        this.outputShape = aShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        this.userCode = `\n      float unaryOperation(float x) {\n        ${opSnippet}\n      }\n\n      void main() {\n        float x = getAAtOutCoords();\n        float y = unaryOperation(x);\n\n        setOutput(y);\n      }\n    `;\n    }\n}\nexport const CHECK_NAN_SNIPPET = `if (isnan(x)) return x;`;\nexport const LINEAR = `return x;`;\nexport const ABS = `return abs(x);`;\nexport function STEP(alpha = 0.0) {\n    return CHECK_NAN_SNIPPET + `\n    return x > 0.0 ? 1.0 : float(${alpha});\n  `;\n}\nexport const ELU = `return (x >= 0.0) ? x : (exp(x) - 1.0);`;\nexport const RELU = CHECK_NAN_SNIPPET + `\n  return (x < 0.0) ? 0.0 : x;\n`;\nexport const RELU6 = CHECK_NAN_SNIPPET + `\n  return (x < 0.0) ? 0.0 : min(6.0, x);\n`;\nexport const CLONE = 'return x;';\nexport const SIGMOID = `return 1.0 / (1.0 + exp(-1.0 * x));`;\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5hcnlvcF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3VuYXJ5b3BfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLE9BQU8sY0FBYztJQU16QixZQUFZLE1BQWdCLEVBQUUsU0FBaUI7UUFML0Msa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBTXBCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsU0FBUzs7Ozs7Ozs7O0tBU2QsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLHlCQUF5QixDQUFDO0FBRTNELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0FBRXBDLE1BQU0sVUFBVSxJQUFJLENBQUMsS0FBSyxHQUFHLEdBQUc7SUFDOUIsT0FBTyxpQkFBaUIsR0FBRzttQ0FDTSxLQUFLO0dBQ3JDLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLHlDQUF5QyxDQUFDO0FBQzdELE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxpQkFBaUIsR0FBRzs7Q0FFdkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxpQkFBaUIsR0FBRzs7Q0FFeEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxXQUFXLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFVuYXJ5T3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSwgb3BTbmlwcGV0OiBzdHJpbmcpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBmbG9hdCB1bmFyeU9wZXJhdGlvbihmbG9hdCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHggPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgeSA9IHVuYXJ5T3BlcmF0aW9uKHgpO1xuXG4gICAgICAgIHNldE91dHB1dCh5KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVCA9IGBpZiAoaXNuYW4oeCkpIHJldHVybiB4O2A7XG5cbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcblxuZXhwb3J0IGNvbnN0IEFCUyA9IGByZXR1cm4gYWJzKHgpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBTVEVQKGFscGhhID0gMC4wKSB7XG4gIHJldHVybiBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgICByZXR1cm4geCA+IDAuMCA/IDEuMCA6IGZsb2F0KCR7YWxwaGF9KTtcbiAgYDtcbn1cblxuZXhwb3J0IGNvbnN0IEVMVSA9IGByZXR1cm4gKHggPj0gMC4wKSA/IHggOiAoZXhwKHgpIC0gMS4wKTtgO1xuZXhwb3J0IGNvbnN0IFJFTFUgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuICh4IDwgMC4wKSA/IDAuMCA6IHg7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVTYgPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuICh4IDwgMC4wKSA/IDAuMCA6IG1pbig2LjAsIHgpO1xuYDtcblxuZXhwb3J0IGNvbnN0IENMT05FID0gJ3JldHVybiB4Oyc7XG5cbmV4cG9ydCBjb25zdCBTSUdNT0lEID0gYHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7YDtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nexport const LINEAR = `return x;`;\nexport const ELU = `\n  vec4 result;\n\n  result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n  result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n  result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n  result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n  return result;\n`;\nexport const RELU = `\n  vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n  bvec4 isNaN = isnan(x);\n\n  result.r = isNaN.r ? x.r : result.r;\n  result.g = isNaN.g ? x.g : result.g;\n  result.b = isNaN.b ? x.b : result.b;\n  result.a = isNaN.a ? x.a : result.a;\n\n  return result;\n`;\nexport const RELU6 = `\n  vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n  bvec4 isNaN = isnan(x);\n\n  result.r = isNaN.r ? x.r : result.r;\n  result.g = isNaN.g ? x.g : result.g;\n  result.b = isNaN.b ? x.b : result.b;\n  result.a = isNaN.a ? x.a : result.a;\n\n  return result;\n`;\nexport const SIGMOID = `return 1.0 / (1.0 + exp(-1.0 * x));`;\nexport class UnaryOpPackedProgram {\n    constructor(aShape, opSnippet) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = aShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        this.userCode = `\n      vec4 unaryOperation(vec4 x) {\n        ${opSnippet}\n      }\n\n      void main() {\n        vec4 x = getAAtOutCoords();\n        vec4 y = unaryOperation(x);\n\n        setOutput(y);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5hcnlvcF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy91bmFyeW9wX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTVELE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUM7QUFFbEMsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHOzs7Ozs7Ozs7Q0FTbEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRzs7Ozs7Ozs7OztDQVVuQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHOzs7Ozs7Ozs7O0NBVXBCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcscUNBQXFDLENBQUM7QUFFN0QsTUFBTSxPQUFPLG9CQUFvQjtJQVEvQixZQUFZLE1BQWdCLEVBQUUsU0FBaUI7UUFQL0Msa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBSXRCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBR2xCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsU0FBUzs7Ozs7Ozs7O0tBU2QsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjb25zdCBMSU5FQVIgPSBgcmV0dXJuIHg7YDtcblxuZXhwb3J0IGNvbnN0IEVMVSA9IGBcbiAgdmVjNCByZXN1bHQ7XG5cbiAgcmVzdWx0LnIgPSAoeC5yID49IDAuMCkgPyB4LnIgOiAoZXhwKHgucikgLSAxLjApO1xuICByZXN1bHQuZyA9ICh4LmcgPj0gMC4wKSA/IHguZyA6IChleHAoeC5nKSAtIDEuMCk7XG4gIHJlc3VsdC5iID0gKHguYiA+PSAwLjApID8geC5iIDogKGV4cCh4LmIpIC0gMS4wKTtcbiAgcmVzdWx0LmEgPSAoeC5hID49IDAuMCkgPyB4LmEgOiAoZXhwKHguYSkgLSAxLjApO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVSA9IGBcbiAgdmVjNCByZXN1bHQgPSB4ICogdmVjNChncmVhdGVyVGhhbkVxdWFsKHgsIHZlYzQoMC4wKSkpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IHguciA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyB4LmcgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IHguYSA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgUkVMVTYgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IFNJR01PSUQgPSBgcmV0dXJuIDEuMCAvICgxLjAgKyBleHAoLTEuMCAqIHgpKTtgO1xuXG5leHBvcnQgY2xhc3MgVW5hcnlPcFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCBvcFNuaXBwZXQ6IHN0cmluZykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBhU2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZlYzQgdW5hcnlPcGVyYXRpb24odmVjNCB4KSB7XG4gICAgICAgICR7b3BTbmlwcGV0fVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgeCA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHkgPSB1bmFyeU9wZXJhdGlvbih4KTtcblxuICAgICAgICBzZXRPdXRwdXQoeSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nimport { getChannels, getSourceCoords } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class UnpackProgram {\n    constructor(outputShape) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = false;\n        this.outputShape = outputShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        const rank = outputShape.length;\n        const channels = getChannels('rc', rank);\n        const dtype = getCoordsDataType(rank);\n        const sourceCoords = getSourceCoords(rank, channels);\n        const innerDims = channels.slice(-2);\n        const coords = rank <= 1 ? 'rc' : `vec2(${innerDims.join(',')})`;\n        this.userCode = `\n      void main() {\n        ${dtype} rc = getOutputCoords();\n        vec4 packedInput = getA(${sourceCoords});\n\n        setOutput(getChannel(packedInput, ${coords}));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5wYWNrX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvdW5wYWNrX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsZ0JBQWdCLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDNUQsT0FBTyxFQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM1RCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sYUFBYTtJQVF4QixZQUFZLFdBQXFCO1FBUGpDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQU1uQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxNQUFNLElBQUksR0FBRyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBRWhDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDekMsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsZUFBZSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNyRCxNQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDckMsTUFBTSxNQUFNLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxRQUFRLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQztRQUVqRSxJQUFJLENBQUMsUUFBUSxHQUFHOztVQUVWLEtBQUs7a0NBQ21CLFlBQVk7OzRDQUVGLE1BQU07O0tBRTdDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVscywgZ2V0U291cmNlQ29vcmRzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBVbnBhY2tQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSBmYWxzZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBlbmFibGVTaGFwZVVuaWZvcm1zOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCByYW5rID0gb3V0cHV0U2hhcGUubGVuZ3RoO1xuXG4gICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuICAgIGNvbnN0IHNvdXJjZUNvb3JkcyA9IGdldFNvdXJjZUNvb3JkcyhyYW5rLCBjaGFubmVscyk7XG4gICAgY29uc3QgaW5uZXJEaW1zID0gY2hhbm5lbHMuc2xpY2UoLTIpO1xuICAgIGNvbnN0IGNvb3JkcyA9IHJhbmsgPD0gMSA/ICdyYycgOiBgdmVjMigke2lubmVyRGltcy5qb2luKCcsJyl9KWA7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHBhY2tlZElucHV0ID0gZ2V0QSgke3NvdXJjZUNvb3Jkc30pO1xuXG4gICAgICAgIHNldE91dHB1dChnZXRDaGFubmVsKHBhY2tlZElucHV0LCAke2Nvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// Import webgl flags.\nimport './flags_webgl';\nimport { backend_util, buffer, DataStorage, engine, env, kernel_impls, KernelBackend, nextFrame, scalar, tidy, util } from '@tensorflow/tfjs-core';\nimport { getWebGLContext } from './canvas_util';\nimport { DecodeMatrixProgram } from './decode_matrix_gpu';\nimport { DecodeMatrixPackedProgram } from './decode_matrix_packed_gpu';\nimport { EncodeFloatProgram } from './encode_float_gpu';\nimport { EncodeFloatPackedProgram } from './encode_float_packed_gpu';\nimport { EncodeMatrixProgram } from './encode_matrix_gpu';\nimport { EncodeMatrixPackedProgram } from './encode_matrix_packed_gpu';\nimport { GPGPUContext } from './gpgpu_context';\nimport * as gpgpu_math from './gpgpu_math';\nimport { getUniformLocations } from './gpgpu_math';\nimport { simpleAbsImplCPU } from './kernel_utils/shared';\nimport { PackProgram } from './pack_gpu';\nimport { ReshapePackedProgram } from './reshape_packed_gpu';\nimport * as tex_util from './tex_util';\nimport { TextureUsage } from './tex_util';\nimport { TextureManager } from './texture_manager';\nimport * as unary_op from './unaryop_gpu';\nimport { UnaryOpProgram } from './unaryop_gpu';\nimport { UnaryOpPackedProgram } from './unaryop_packed_gpu';\nimport { UnpackProgram } from './unpack_gpu';\nimport * as webgl_util from './webgl_util';\nconst whereImpl = kernel_impls.whereImpl;\nexport const EPSILON_FLOAT32 = 1e-7;\nexport const EPSILON_FLOAT16 = 1e-4;\nconst binaryCaches = {};\nexport function getBinaryCache(webGLVersion) {\n    if (webGLVersion in binaryCaches) {\n        return binaryCaches[webGLVersion];\n    }\n    binaryCaches[webGLVersion] = {};\n    return binaryCaches[webGLVersion];\n}\n// Empirically determined constant used to determine size threshold for handing\n// off execution to the CPU.\nconst CPU_HANDOFF_SIZE_THRESHOLD = env().getNumber('CPU_HANDOFF_SIZE_THRESHOLD');\n// Empirically determined constant used to decide the number of MB on GPU\n// before we warn about high memory use. The MB are this constant * screen area\n// * dpi / 1024 / 1024.\nconst BEFORE_PAGING_CONSTANT = 600;\nfunction numMBBeforeWarning() {\n    if (env().global.screen == null) {\n        return 1024; // 1 GB.\n    }\n    return (env().global.screen.height * env().global.screen.width *\n        window.devicePixelRatio) *\n        BEFORE_PAGING_CONSTANT / 1024 / 1024;\n}\nexport class MathBackendWebGL extends KernelBackend {\n    constructor(gpuResource) {\n        super();\n        // Maps data ids that have a pending read operation, to list of subscribers.\n        this.pendingRead = new WeakMap();\n        // List of data ids that are scheduled for disposal, but are waiting on a\n        // pending read operation.\n        this.pendingDisposal = new WeakSet();\n        // Used to count the number of 'shallow' sliced tensors that point to the\n        // same data id.\n        this.dataRefCount = new WeakMap();\n        this.numBytesInGPU = 0;\n        // Accumulated time spent (including blocking) in uploading data to webgl.\n        this.uploadWaitMs = 0;\n        // Accumulated time spent (including blocking in downloading data from webgl.\n        this.downloadWaitMs = 0;\n        // record the last manual GL Flush time.\n        this.lastGlFlushTime = 0;\n        this.warnedAboutMemory = false;\n        this.pendingDeletes = 0;\n        this.disposed = false;\n        if (!env().getBool('HAS_WEBGL')) {\n            throw new Error('WebGL is not supported on this device');\n        }\n        let newGPGPU;\n        if (gpuResource != null) {\n            if (gpuResource instanceof GPGPUContext) {\n                newGPGPU = gpuResource;\n            }\n            else {\n                const gl = getWebGLContext(env().getNumber('WEBGL_VERSION'), gpuResource);\n                newGPGPU = new GPGPUContext(gl);\n            }\n            this.binaryCache = {};\n            this.gpgpuCreatedLocally = false;\n        }\n        else {\n            const gl = getWebGLContext(env().getNumber('WEBGL_VERSION'));\n            newGPGPU = new GPGPUContext(gl);\n            this.binaryCache = getBinaryCache(env().getNumber('WEBGL_VERSION'));\n            this.gpgpuCreatedLocally = true;\n        }\n        this.gpgpu = newGPGPU;\n        this.canvas = this.gpgpu.gl.canvas;\n        this.textureManager = new TextureManager(this.gpgpu);\n        this.numMBBeforeWarning = numMBBeforeWarning();\n        this.texData = new DataStorage(this, engine());\n    }\n    nextDataId() {\n        return MathBackendWebGL.nextDataId++;\n    }\n    numDataIds() {\n        return this.texData.numDataIds() - this.pendingDeletes;\n    }\n    write(values, shape, dtype) {\n        if (env().getBool('WEBGL_CHECK_NUMERICAL_PROBLEMS') ||\n            env().getBool('DEBUG')) {\n            this.checkNumericalProblems(values);\n        }\n        if (dtype === 'complex64' && values != null) {\n            throw new Error(`Cannot write to a complex64 dtype. ` +\n                `Please use tf.complex(real, imag).`);\n        }\n        const dataId = { id: this.nextDataId() };\n        this.texData.set(dataId, { shape, dtype, values, usage: TextureUsage.UPLOAD, refCount: 1 });\n        return dataId;\n    }\n    /** Return refCount of a `TensorData`. */\n    refCount(dataId) {\n        if (this.texData.has(dataId)) {\n            const tensorData = this.texData.get(dataId);\n            return tensorData.refCount;\n        }\n        return 0;\n    }\n    /** Increase refCount of a `TextureData`. */\n    incRef(dataId) {\n        const texData = this.texData.get(dataId);\n        texData.refCount++;\n    }\n    /** Decrease refCount of a `TextureData`. */\n    decRef(dataId) {\n        if (this.texData.has(dataId)) {\n            const texData = this.texData.get(dataId);\n            texData.refCount--;\n        }\n    }\n    move(dataId, values, shape, dtype, refCount) {\n        if (env().getBool('DEBUG')) {\n            this.checkNumericalProblems(values);\n        }\n        if (dtype === 'complex64') {\n            throw new Error(`Cannot write to a complex64 dtype. ` +\n                `Please use tf.complex(real, imag).`);\n        }\n        this.texData.set(dataId, { shape, dtype, values, usage: TextureUsage.UPLOAD, refCount });\n    }\n    disposeIntermediateTensorInfo(tensorInfo) {\n        this.disposeData(tensorInfo.dataId);\n    }\n    readSync(dataId) {\n        const texData = this.texData.get(dataId);\n        const { values, dtype, complexTensorInfos, slice, shape, isPacked } = texData;\n        // The presence of `slice` indicates this tensor is a shallow slice of a\n        // different tensor, and is using that original tensor's texture. Run\n        // `clone` in order to copy that texture and read from it.\n        if (slice != null) {\n            let program;\n            if (isPacked) {\n                program = new UnaryOpPackedProgram(shape, unary_op.CLONE);\n            }\n            else {\n                program = new UnaryOpProgram(shape, unary_op.CLONE);\n            }\n            const res = this.runWebGLProgram(program, [{ dataId, shape, dtype }], dtype);\n            const data = this.readSync(res.dataId);\n            this.disposeIntermediateTensorInfo(res);\n            return data;\n        }\n        if (values != null) {\n            return this.convertAndCacheOnCPU(dataId);\n        }\n        if (dtype === 'string') {\n            return values;\n        }\n        const shouldTimeProgram = this.activeTimers != null;\n        let start;\n        if (shouldTimeProgram) {\n            start = util.now();\n        }\n        let result;\n        if (dtype === 'complex64') {\n            const realValues = this.readSync(complexTensorInfos.real.dataId);\n            const imagValues = this.readSync(complexTensorInfos.imag.dataId);\n            result = backend_util.mergeRealAndImagArrays(realValues, imagValues);\n        }\n        else {\n            result = this.getValuesFromTexture(dataId);\n        }\n        if (shouldTimeProgram) {\n            this.downloadWaitMs += util.now() - start;\n        }\n        return this.convertAndCacheOnCPU(dataId, result);\n    }\n    async read(dataId) {\n        if (this.pendingRead.has(dataId)) {\n            const subscribers = this.pendingRead.get(dataId);\n            return new Promise(resolve => subscribers.push(resolve));\n        }\n        const texData = this.texData.get(dataId);\n        const { values, shape, slice, dtype, complexTensorInfos, isPacked } = texData;\n        // The presence of `slice` indicates this tensor is a shallow slice of a\n        // different tensor, and is using that original tensor's texture. Run\n        // `clone` in order to copy that texture and read from it.\n        if (slice != null) {\n            let program;\n            if (isPacked) {\n                program = new UnaryOpPackedProgram(shape, unary_op.CLONE);\n            }\n            else {\n                program = new UnaryOpProgram(shape, unary_op.CLONE);\n            }\n            const res = this.runWebGLProgram(program, [{ dataId, shape, dtype }], dtype);\n            const data = this.read(res.dataId);\n            this.disposeIntermediateTensorInfo(res);\n            return data;\n        }\n        if (values != null) {\n            return this.convertAndCacheOnCPU(dataId);\n        }\n        if (env().getBool('DEBUG')) {\n            // getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED') caused a blocking GPU call.\n            // For performance reason, only check it for debugging. In production,\n            // it doesn't handle this use case anyway, so behavior is not changed.\n            if (!env().getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED') &&\n                env().getNumber('WEBGL_VERSION') === 2) {\n                throw new Error(`tensor.data() with WEBGL_DOWNLOAD_FLOAT_ENABLED=false and ` +\n                    `WEBGL_VERSION=2 not yet supported.`);\n            }\n        }\n        let buffer = null;\n        let tmpDownloadTarget;\n        if (dtype !== 'complex64' && env().get('WEBGL_BUFFER_SUPPORTED')) {\n            // Possibly copy the texture into a buffer before inserting a fence.\n            tmpDownloadTarget = this.decode(dataId);\n            const tmpData = this.texData.get(tmpDownloadTarget.dataId);\n            buffer = this.gpgpu.createBufferFromTexture(tmpData.texture.texture, ...tex_util.getDenseTexShape(shape));\n        }\n        this.pendingRead.set(dataId, []);\n        if (dtype !== 'complex64') {\n            // Create a fence and wait for it to resolve.\n            await this.gpgpu.createAndWaitForFence();\n        }\n        // Download the values from the GPU.\n        let vals;\n        if (dtype === 'complex64') {\n            const ps = await Promise.all([\n                this.read(complexTensorInfos.real.dataId),\n                this.read(complexTensorInfos.imag.dataId)\n            ]);\n            const realValues = ps[0];\n            const imagValues = ps[1];\n            vals = backend_util.mergeRealAndImagArrays(realValues, imagValues);\n        }\n        else if (buffer == null) {\n            vals = this.getValuesFromTexture(dataId);\n        }\n        else {\n            const size = util.sizeFromShape(shape);\n            vals = this.gpgpu.downloadFloat32MatrixFromBuffer(buffer, size);\n        }\n        if (tmpDownloadTarget != null) {\n            this.disposeIntermediateTensorInfo(tmpDownloadTarget);\n        }\n        if (buffer != null) {\n            const gl = this.gpgpu.gl;\n            webgl_util.callAndCheck(gl, () => gl.deleteBuffer(buffer));\n        }\n        const dTypeVals = this.convertAndCacheOnCPU(dataId, vals);\n        const subscribers = this.pendingRead.get(dataId);\n        this.pendingRead.delete(dataId);\n        // Notify all pending reads.\n        subscribers.forEach(resolve => resolve(dTypeVals));\n        if (this.pendingDisposal.has(dataId)) {\n            this.pendingDisposal.delete(dataId);\n            if (this.disposeData(dataId)) {\n                engine().removeDataId(dataId, this);\n            }\n            this.pendingDeletes--;\n        }\n        return dTypeVals;\n    }\n    /**\n     * Read tensor to a new texture that is densely packed for ease of use.\n     * @param dataId The source tensor.\n     * @param options\n     *     customTexShape: Optional. If set, will use the user defined texture\n     *     shape to create the texture.\n     */\n    readToGPU(dataId, options = {}) {\n        const texData = this.texData.get(dataId);\n        const { values, shape, slice, dtype, isPacked, texture } = texData;\n        if (dtype === 'complex64') {\n            throw new Error('Does not support reading texture for complex64 dtype.');\n        }\n        // The presence of `slice` indicates this tensor is a shallow slice of a\n        // different tensor, and is using that original tensor's texture. Run\n        // `clone` in order to copy that texture and read from it.\n        if (slice != null) {\n            let program;\n            if (isPacked) {\n                program = new UnaryOpPackedProgram(shape, unary_op.CLONE);\n            }\n            else {\n                program = new UnaryOpProgram(shape, unary_op.CLONE);\n            }\n            const res = this.runWebGLProgram(program, [{ dataId, shape, dtype }], dtype);\n            const gpuResouorce = this.readToGPU(res, options);\n            this.disposeIntermediateTensorInfo(res);\n            return gpuResouorce;\n        }\n        if (texture == null) {\n            if (values != null) {\n                throw new Error('Data is not on GPU but on CPU.');\n            }\n            else {\n                throw new Error('There is no data on GPU or CPU.');\n            }\n        }\n        // Decode the texture so that it is stored densely (using four channels).\n        const tmpTarget = this.decode(dataId, options.customTexShape);\n        // Make engine track this tensor, so that we can dispose it later.\n        const tensorRef = engine().makeTensorFromTensorInfo(tmpTarget);\n        const tmpData = this.texData.get(tmpTarget.dataId);\n        return Object.assign({ tensorRef }, tmpData.texture);\n    }\n    bufferSync(t) {\n        const data = this.readSync(t.dataId);\n        if (t.dtype === 'string') {\n            try {\n                // Decode the bytes into string.\n                const strings = data.map(d => util.decodeString(d));\n                return buffer(t.shape, t.dtype, strings);\n            }\n            catch (_a) {\n                throw new Error('Failed to decode encoded string bytes into utf-8');\n            }\n        }\n        return buffer(t.shape, t.dtype, data);\n    }\n    checkNumericalProblems(values) {\n        if (values == null) {\n            return;\n        }\n        for (let i = 0; i < values.length; i++) {\n            const num = values[i];\n            if (!webgl_util.canBeRepresented(num)) {\n                if (env().getBool('WEBGL_RENDER_FLOAT32_CAPABLE')) {\n                    throw Error(`The value ${num} cannot be represented with your ` +\n                        `current settings. Consider enabling float32 rendering: ` +\n                        `'tf.env().set('WEBGL_RENDER_FLOAT32_ENABLED', true);'`);\n                }\n                throw Error(`The value ${num} cannot be represented on this device.`);\n            }\n        }\n    }\n    getValuesFromTexture(dataId) {\n        const { shape, dtype, isPacked } = this.texData.get(dataId);\n        const size = util.sizeFromShape(shape);\n        if (env().getBool('WEBGL_DOWNLOAD_FLOAT_ENABLED')) {\n            const tmpTarget = this.decode(dataId);\n            const tmpData = this.texData.get(tmpTarget.dataId);\n            const vals = this.gpgpu\n                .downloadMatrixFromPackedTexture(tmpData.texture.texture, ...tex_util.getDenseTexShape(shape))\n                .subarray(0, size);\n            this.disposeIntermediateTensorInfo(tmpTarget);\n            return vals;\n        }\n        const shouldUsePackedProgram = env().getBool('WEBGL_PACK') && isPacked === true;\n        const outputShape = shouldUsePackedProgram ? webgl_util.getShapeAs3D(shape) : shape;\n        const program = shouldUsePackedProgram ?\n            new EncodeFloatPackedProgram(outputShape) :\n            new EncodeFloatProgram(outputShape);\n        const output = this.runWebGLProgram(program, [{ shape: outputShape, dtype, dataId }], 'float32');\n        const tmpData = this.texData.get(output.dataId);\n        const vals = this.gpgpu\n            .downloadByteEncodedFloatMatrixFromOutputTexture(tmpData.texture.texture, tmpData.texShape[0], tmpData.texShape[1])\n            .subarray(0, size);\n        this.disposeIntermediateTensorInfo(output);\n        return vals;\n    }\n    timerAvailable() {\n        return env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0;\n    }\n    time(f) {\n        const oldActiveTimers = this.activeTimers;\n        const newActiveTimers = [];\n        let outerMostTime = false;\n        if (this.programTimersStack == null) {\n            this.programTimersStack = newActiveTimers;\n            outerMostTime = true;\n        }\n        else {\n            this.activeTimers.push(newActiveTimers);\n        }\n        this.activeTimers = newActiveTimers;\n        f();\n        // needing to split these up because util.flatten only accepts certain types\n        const flattenedActiveTimerQueries = util.flatten(this.activeTimers.map((d) => d.query))\n            .filter(d => d != null);\n        const flattenedActiveTimerNames = util.flatten(this.activeTimers.map((d) => d.name))\n            .filter(d => d != null);\n        this.activeTimers = oldActiveTimers;\n        if (outerMostTime) {\n            this.programTimersStack = null;\n        }\n        const res = {\n            uploadWaitMs: this.uploadWaitMs,\n            downloadWaitMs: this.downloadWaitMs,\n            kernelMs: null,\n            wallMs: null // will be filled by the engine\n        };\n        return (async () => {\n            if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') >\n                0) {\n                const kernelMs = await Promise.all(flattenedActiveTimerQueries);\n                res['kernelMs'] = util.sum(kernelMs);\n                res['getExtraProfileInfo'] = () => kernelMs\n                    .map((d, i) => ({ name: flattenedActiveTimerNames[i], ms: d }))\n                    .map(d => `${d.name}: ${d.ms}`)\n                    .join(', ');\n            }\n            else {\n                res['kernelMs'] = {\n                    error: 'WebGL query timers are not supported in this environment.'\n                };\n            }\n            this.uploadWaitMs = 0;\n            this.downloadWaitMs = 0;\n            return res;\n        })();\n    }\n    memory() {\n        return {\n            unreliable: false,\n            numBytesInGPU: this.numBytesInGPU,\n            numBytesInGPUAllocated: this.textureManager.numBytesAllocated,\n            numBytesInGPUFree: this.textureManager.numBytesFree\n        };\n    }\n    startTimer() {\n        if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) {\n            return this.gpgpu.beginQuery();\n        }\n        return { startMs: util.now(), endMs: null };\n    }\n    endTimer(query) {\n        if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) {\n            this.gpgpu.endQuery();\n            return query;\n        }\n        query.endMs = util.now();\n        return query;\n    }\n    async getQueryTime(query) {\n        if (env().getNumber('WEBGL_DISJOINT_QUERY_TIMER_EXTENSION_RELIABLE') > 0) {\n            return this.gpgpu.waitForQueryAndGetTime(query);\n        }\n        const timerQuery = query;\n        return timerQuery.endMs - timerQuery.startMs;\n    }\n    /**\n     * Decrease the RefCount on the dataId and dispose the memory if the dataId\n     * has 0 refCount. If there are pending read on the data, the disposal would\n     * added to the pending delete queue. Return true if the dataId is removed\n     * from backend or the backend does not contain the dataId, false if the\n     * dataId is not removed. Memory may or may not be released even when dataId\n     * is removed, which also depends on dataRefCount, see `releaseGPU`.\n     * @param dataId\n     * @oaram force Optional, remove the data regardless of refCount\n     */\n    disposeData(dataId, force = false) {\n        if (this.pendingDisposal.has(dataId)) {\n            return false;\n        }\n        // No-op if already disposed.\n        if (!this.texData.has(dataId)) {\n            return true;\n        }\n        // if force flag is set, change refCount to 0, this would ensure disposal\n        // when added to the pendingDisposal queue. Memory may or may not be\n        // released, which also depends on dataRefCount, see `releaseGPU`.\n        if (force) {\n            this.texData.get(dataId).refCount = 0;\n        }\n        else {\n            this.texData.get(dataId).refCount--;\n        }\n        if (!force && this.texData.get(dataId).refCount > 0) {\n            return false;\n        }\n        if (this.pendingRead.has(dataId)) {\n            this.pendingDisposal.add(dataId);\n            this.pendingDeletes++;\n            return false;\n        }\n        this.releaseGPUData(dataId);\n        const { complexTensorInfos } = this.texData.get(dataId);\n        if (complexTensorInfos != null) {\n            this.disposeData(complexTensorInfos.real.dataId, force);\n            this.disposeData(complexTensorInfos.imag.dataId, force);\n        }\n        this.texData.delete(dataId);\n        return true;\n    }\n    releaseGPUData(dataId) {\n        const { texture, dtype, texShape, usage, isPacked, slice } = this.texData.get(dataId);\n        const key = slice && slice.origDataId || dataId;\n        const refCount = this.dataRefCount.get(key);\n        if (refCount > 1) {\n            this.dataRefCount.set(key, refCount - 1);\n        }\n        else {\n            this.dataRefCount.delete(key);\n            if (texture != null) {\n                this.numBytesInGPU -= this.computeBytes(texShape, dtype);\n                this.textureManager.releaseTexture(texture, texShape, usage, isPacked);\n            }\n        }\n        const texData = this.texData.get(dataId);\n        texData.texture = null;\n        texData.texShape = null;\n        texData.isPacked = false;\n        texData.slice = null;\n    }\n    getTexture(dataId) {\n        this.uploadToGPU(dataId);\n        return this.texData.get(dataId).texture.texture;\n    }\n    /**\n     * Returns internal information for the specific data bucket. Used in unit\n     * tests.\n     */\n    getDataInfo(dataId) {\n        return this.texData.get(dataId);\n    }\n    /*\n    Tests whether all the inputs to an op are small and on the CPU. This heuristic\n    determines when it would be faster to execute a kernel on the CPU. WebGL\n    kernels opt into running this check and forwarding when appropriate.\n    TODO(https://github.com/tensorflow/tfjs/issues/872): Develop a more\n    sustainable strategy for optimizing backend execution of ops.\n     */\n    shouldExecuteOnCPU(inputs, sizeThreshold = CPU_HANDOFF_SIZE_THRESHOLD) {\n        return env().getBool('WEBGL_CPU_FORWARD') &&\n            inputs.every(input => this.texData.get(input.dataId).texture == null &&\n                util.sizeFromShape(input.shape) < sizeThreshold);\n    }\n    getGPGPUContext() {\n        return this.gpgpu;\n    }\n    where(condition) {\n        backend_util.warn('tf.where() in webgl locks the UI thread. ' +\n            'Call tf.whereAsync() instead');\n        const condVals = condition.dataSync();\n        return whereImpl(condition.shape, condVals);\n    }\n    packedUnaryOp(x, op, dtype) {\n        const program = new UnaryOpPackedProgram(x.shape, op);\n        const outInfo = this.compileAndRun(program, [x], dtype);\n        return engine().makeTensorFromTensorInfo(outInfo);\n    }\n    // TODO(msoulanille) remove this once the backend has been modularized\n    // a copy is needed here to break a circular dependency.\n    // Also remove the op from unary_op.\n    abs(x) {\n        // TODO: handle cases when x is complex.\n        if (this.shouldExecuteOnCPU([x]) && x.dtype !== 'complex64') {\n            const outValues = simpleAbsImplCPU(this.texData.get(x.dataId).values);\n            return this.makeOutput(x.shape, x.dtype, outValues);\n        }\n        if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n            return this.packedUnaryOp(x, unary_op.ABS, x.dtype);\n        }\n        const program = new UnaryOpProgram(x.shape, unary_op.ABS);\n        const outInfo = this.compileAndRun(program, [x]);\n        return engine().makeTensorFromTensorInfo(outInfo);\n    }\n    makeTensorInfo(shape, dtype, values) {\n        let dataId;\n        if (dtype === 'string' && values != null && values.length > 0 &&\n            util.isString(values[0])) {\n            const encodedValues = values.map(d => util.encodeString(d));\n            dataId = this.write(encodedValues, shape, dtype);\n        }\n        else {\n            dataId = this.write(values, shape, dtype);\n        }\n        this.texData.get(dataId).usage = null;\n        return { dataId, shape, dtype };\n    }\n    makeOutput(shape, dtype, values) {\n        return engine().makeTensorFromTensorInfo(this.makeTensorInfo(shape, dtype, values), this);\n    }\n    unpackTensor(input) {\n        const program = new UnpackProgram(input.shape);\n        return this.runWebGLProgram(program, [input], input.dtype);\n    }\n    packTensor(input) {\n        const program = new PackProgram(input.shape);\n        const preventEagerUnpackingOutput = true;\n        return this.runWebGLProgram(program, [input], input.dtype, null /* customUniformValues */, preventEagerUnpackingOutput);\n    }\n    packedReshape(input, afterShape) {\n        const input3DShape = [\n            webgl_util.getBatchDim(input.shape),\n            ...webgl_util.getRowsCols(input.shape)\n        ];\n        const input3D = {\n            dtype: input.dtype,\n            shape: input3DShape,\n            dataId: input.dataId\n        };\n        const afterShapeAs3D = [\n            webgl_util.getBatchDim(afterShape), ...webgl_util.getRowsCols(afterShape)\n        ];\n        const program = new ReshapePackedProgram(afterShapeAs3D, input3DShape);\n        const preventEagerUnpackingOfOutput = true;\n        const customValues = [input3DShape];\n        const output = this.runWebGLProgram(program, [input3D], input.dtype, customValues, preventEagerUnpackingOfOutput);\n        return { dataId: output.dataId, shape: afterShape, dtype: output.dtype };\n    }\n    decode(dataId, customTexShape) {\n        const texData = this.texData.get(dataId);\n        const { isPacked, shape, dtype } = texData;\n        if (customTexShape != null) {\n            const size = util.sizeFromShape(shape);\n            const texSize = customTexShape[0] * customTexShape[1] * 4;\n            util.assert(size <= texSize, () => 'customTexShape is too small. ' +\n                'Row * Column * 4 should be equal or larger than the ' +\n                'size of the tensor data.');\n        }\n        const shapeAs3D = webgl_util.getShapeAs3D(shape);\n        let program;\n        if (isPacked) {\n            program = new DecodeMatrixPackedProgram(shapeAs3D);\n        }\n        else {\n            program = new DecodeMatrixProgram(shapeAs3D);\n        }\n        const preventEagerUnpackingOfOutput = true;\n        const customValues = [customTexShape != null ? customTexShape :\n                tex_util.getDenseTexShape(shapeAs3D)];\n        const out = this.runWebGLProgram(program, [{ shape: shapeAs3D, dtype, dataId }], dtype, customValues, preventEagerUnpackingOfOutput, customTexShape);\n        return { dtype, shape, dataId: out.dataId };\n    }\n    runWebGLProgram(program, inputs, outputDtype, customUniformValues, preventEagerUnpackingOfOutput = false, customTexShape) {\n        const output = this.makeTensorInfo(program.outputShape, outputDtype);\n        const outData = this.texData.get(output.dataId);\n        if (program.packedOutput) {\n            outData.isPacked = true;\n        }\n        if (program.outPackingScheme === tex_util.PackingScheme.DENSE) {\n            const texelShape = customTexShape != null ?\n                customTexShape :\n                tex_util.getDenseTexShape(program.outputShape);\n            // For a densely packed output, we explicitly set texShape\n            // so it doesn't get assigned later according to our typical packing\n            // scheme wherein a single texel can only contain values from adjacent\n            // rows/cols.\n            outData.texShape = texelShape.map(d => d * 2);\n        }\n        if (program.outTexUsage != null) {\n            outData.usage = program.outTexUsage;\n        }\n        if (util.sizeFromShape(output.shape) === 0) {\n            // Short-circuit the computation since the result is empty (has 0 in its\n            // shape).\n            outData.values =\n                util.getTypedArrayFromDType(output.dtype, 0);\n            return output;\n        }\n        const dataToDispose = [];\n        const inputsData = inputs.map(input => {\n            if (input.dtype === 'complex64') {\n                throw new Error(`GPGPUProgram does not support complex64 input. For complex64 ` +\n                    `dtypes, please separate the program into real and imaginary ` +\n                    `parts.`);\n            }\n            let texData = this.texData.get(input.dataId);\n            if (texData.texture == null) {\n                if (!program.packedInputs &&\n                    util.sizeFromShape(input.shape) <=\n                        env().getNumber('WEBGL_SIZE_UPLOAD_UNIFORM')) {\n                    // Upload small tensors that live on the CPU as uniforms, not as\n                    // textures. Do this only when the environment supports 32bit floats\n                    // due to problems when comparing 16bit floats with 32bit floats.\n                    // TODO(https://github.com/tensorflow/tfjs/issues/821): Make it\n                    // possible for packed shaders to sample from uniforms.\n                    return {\n                        shape: input.shape,\n                        texData: null,\n                        isUniform: true,\n                        uniformValues: texData.values\n                    };\n                }\n                // This ensures that if a packed program's inputs have not yet been\n                // uploaded to the GPU, they get uploaded as packed right off the bat.\n                if (program.packedInputs) {\n                    texData.isPacked = true;\n                    texData.shape = input.shape;\n                }\n            }\n            this.uploadToGPU(input.dataId);\n            if (!!texData.isPacked !== !!program.packedInputs) {\n                input = texData.isPacked ? this.unpackTensor(input) :\n                    this.packTensor(input);\n                dataToDispose.push(input);\n                texData = this.texData.get(input.dataId);\n            }\n            else if (texData.isPacked &&\n                !webgl_util.isReshapeFree(texData.shape, input.shape)) {\n                // This is a special case where a texture exists for a tensor\n                // but the shapes are incompatible (due to packing constraints) because\n                // the tensor did not have a chance to go through the packed reshape\n                // shader. This only happens when we reshape the *same* tensor to form\n                // *distinct* inputs to an op, e.g. dotting a vector with itself. This\n                // case will disappear once packed uploading is the default.\n                const savedInput = input;\n                const targetShape = input.shape;\n                input.shape = texData.shape;\n                input = this.packedReshape(input, targetShape);\n                dataToDispose.push(input);\n                texData = this.texData.get(input.dataId);\n                savedInput.shape = targetShape;\n            }\n            return { shape: input.shape, texData, isUniform: false };\n        });\n        this.uploadToGPU(output.dataId);\n        const outputData = { shape: output.shape, texData: outData, isUniform: false };\n        const key = gpgpu_math.makeShaderKey(program, inputsData, outputData);\n        const binary = this.getAndSaveBinary(key, () => {\n            return gpgpu_math.compileProgram(this.gpgpu, program, inputsData, outputData);\n        });\n        const shouldTimeProgram = this.activeTimers != null;\n        let query;\n        if (shouldTimeProgram) {\n            query = this.startTimer();\n        }\n        if (!env().get('ENGINE_COMPILE_ONLY')) {\n            gpgpu_math.runProgram(this.gpgpu, binary, inputsData, outputData, customUniformValues);\n        }\n        dataToDispose.forEach(info => this.disposeIntermediateTensorInfo(info));\n        if (shouldTimeProgram) {\n            query = this.endTimer(query);\n            this.activeTimers.push({ name: program.constructor.name, query: this.getQueryTime(query) });\n        }\n        const glFlushThreshold = env().get('WEBGL_FLUSH_THRESHOLD');\n        // Manually GL flush requested\n        if (glFlushThreshold > 0) {\n            const time = util.now();\n            if ((time - this.lastGlFlushTime) > glFlushThreshold) {\n                this.gpgpu.gl.flush();\n                this.lastGlFlushTime = time;\n            }\n        }\n        if (!env().getBool('WEBGL_LAZILY_UNPACK') && outData.isPacked &&\n            preventEagerUnpackingOfOutput === false) {\n            const unpacked = this.unpackTensor(output);\n            this.disposeIntermediateTensorInfo(output);\n            return unpacked;\n        }\n        return output;\n    }\n    compileAndRun(program, inputs, outputDtype, customUniformValues, preventEagerUnpackingOfOutput = false) {\n        outputDtype = outputDtype || inputs[0].dtype;\n        const outInfo = this.runWebGLProgram(program, inputs, outputDtype, customUniformValues, preventEagerUnpackingOfOutput);\n        return outInfo;\n    }\n    getAndSaveBinary(key, getBinary) {\n        if (!(key in this.binaryCache)) {\n            this.binaryCache[key] = getBinary();\n        }\n        return this.binaryCache[key];\n    }\n    getTextureManager() {\n        return this.textureManager;\n    }\n    dispose() {\n        if (this.disposed) {\n            return;\n        }\n        // Avoid disposing the compiled webgl programs during unit testing because\n        // it slows down test execution.\n        if (!env().getBool('IS_TEST')) {\n            const allKeys = Object.keys(this.binaryCache);\n            allKeys.forEach(key => {\n                this.gpgpu.deleteProgram(this.binaryCache[key].webGLProgram);\n                delete this.binaryCache[key];\n            });\n        }\n        this.textureManager.dispose();\n        if (this.canvas != null &&\n            (typeof (HTMLCanvasElement) !== 'undefined' &&\n                this.canvas instanceof HTMLCanvasElement)) {\n            this.canvas.remove();\n        }\n        else {\n            this.canvas = null;\n        }\n        if (this.gpgpuCreatedLocally) {\n            this.gpgpu.program = null;\n            this.gpgpu.dispose();\n        }\n        this.disposed = true;\n    }\n    floatPrecision() {\n        if (this.floatPrecisionValue == null) {\n            this.floatPrecisionValue = tidy(() => {\n                if (!env().get('WEBGL_RENDER_FLOAT32_ENABLED')) {\n                    // Momentarily switching DEBUG flag to false so we don't throw an\n                    // error trying to upload a small value.\n                    const debugFlag = env().getBool('DEBUG');\n                    env().set('DEBUG', false);\n                    const underflowCheckValue = this.abs(scalar(1e-8)).dataSync()[0];\n                    env().set('DEBUG', debugFlag);\n                    if (underflowCheckValue > 0) {\n                        return 32;\n                    }\n                }\n                return 16;\n            });\n        }\n        return this.floatPrecisionValue;\n    }\n    /** Returns the smallest representable number.  */\n    epsilon() {\n        return this.floatPrecision() === 32 ? EPSILON_FLOAT32 : EPSILON_FLOAT16;\n    }\n    uploadToGPU(dataId) {\n        const texData = this.texData.get(dataId);\n        const { shape, dtype, values, texture, usage, isPacked } = texData;\n        if (texture != null) {\n            // Array is already on GPU. No-op.\n            return;\n        }\n        const shouldTimeProgram = this.activeTimers != null;\n        let start;\n        if (shouldTimeProgram) {\n            start = util.now();\n        }\n        let texShape = texData.texShape;\n        if (texShape == null) {\n            // This texShape may not be the final texture shape. For packed or dense\n            // textures, the texShape will be changed when textures are created.\n            texShape = webgl_util.getTextureShapeFromLogicalShape(shape, isPacked);\n            texData.texShape = texShape;\n        }\n        if (values != null) {\n            const shapeAs3D = webgl_util.getShapeAs3D(shape);\n            let program;\n            let width = texShape[1], height = texShape[0];\n            const isByteArray = values instanceof Uint8Array || values instanceof Uint8ClampedArray;\n            // texture for float array is PhysicalTextureType.PACKED_2X2_FLOAT32, we\n            // need to make sure the upload uses the same packed size\n            if (isPacked || !isByteArray) {\n                [width, height] = tex_util.getPackedMatrixTextureShapeWidthHeight(texShape[0], texShape[1]);\n            }\n            if (isPacked) {\n                program = new EncodeMatrixPackedProgram(shapeAs3D, isByteArray);\n            }\n            else {\n                program = new EncodeMatrixProgram(shapeAs3D, isByteArray);\n            }\n            // TexShape for float array needs to be the original shape, which byte\n            // array needs to be packed size. This allow the data upload shape to be\n            // matched with texture creation logic.\n            const tempDenseInputTexShape = isByteArray ? [height, width] : texShape;\n            const tempDenseInputHandle = this.makeTensorInfo(tempDenseInputTexShape, dtype);\n            const tempDenseInputTexData = this.texData.get(tempDenseInputHandle.dataId);\n            if (isByteArray) {\n                tempDenseInputTexData.usage = TextureUsage.PIXELS;\n            }\n            else {\n                tempDenseInputTexData.usage = TextureUsage.UPLOAD;\n            }\n            tempDenseInputTexData.texShape = tempDenseInputTexShape;\n            this.gpgpu.uploadDenseMatrixToTexture(this.getTexture(tempDenseInputHandle.dataId), width, height, values);\n            const customValues = [[height, width]];\n            // We want the output to remain packed regardless of the value of\n            // WEBGL_PACK.\n            const preventEagerUnpacking = true;\n            const encodedOutputTarget = this.runWebGLProgram(program, [tempDenseInputHandle], dtype, customValues, preventEagerUnpacking);\n            // Have the original texture assume the identity of the encoded output.\n            const outputTexData = this.texData.get(encodedOutputTarget.dataId);\n            texData.texShape = outputTexData.texShape;\n            texData.isPacked = outputTexData.isPacked;\n            texData.usage = outputTexData.usage;\n            if (!env().get('ENGINE_COMPILE_ONLY')) {\n                texData.texture = outputTexData.texture;\n                // Once uploaded, don't store the values on cpu.\n                texData.values = null;\n                this.texData.delete(encodedOutputTarget.dataId);\n            }\n            else {\n                this.disposeData(encodedOutputTarget.dataId);\n            }\n            this.disposeIntermediateTensorInfo(tempDenseInputHandle);\n            if (shouldTimeProgram) {\n                this.uploadWaitMs += util.now() - start;\n            }\n        }\n        else {\n            const newTexture = this.acquireTexture(texShape, usage, dtype, isPacked);\n            texData.texture = newTexture;\n        }\n    }\n    convertAndCacheOnCPU(dataId, float32Values) {\n        const texData = this.texData.get(dataId);\n        const { dtype } = texData;\n        this.releaseGPUData(dataId);\n        if (float32Values != null) {\n            texData.values = float32ToTypedArray(float32Values, dtype);\n        }\n        return texData.values;\n    }\n    acquireTexture(texShape, texType, dtype, isPacked) {\n        this.numBytesInGPU += this.computeBytes(texShape, dtype);\n        if (!this.warnedAboutMemory &&\n            this.numBytesInGPU > this.numMBBeforeWarning * 1024 * 1024) {\n            const mb = (this.numBytesInGPU / 1024 / 1024).toFixed(2);\n            this.warnedAboutMemory = true;\n            console.warn(`High memory usage in GPU: ${mb} MB, ` +\n                `most likely due to a memory leak`);\n        }\n        return this.textureManager.acquireTexture(texShape, texType, isPacked);\n    }\n    computeBytes(shape, dtype) {\n        return shape[0] * shape[1] * util.bytesPerElement(dtype);\n    }\n    checkCompileCompletion() {\n        for (const [, binary] of Object.entries(this.binaryCache)) {\n            this.checkCompletion_(binary);\n        }\n    }\n    async checkCompileCompletionAsync() {\n        const ps = [];\n        if (this.gpgpu.parallelCompilationExtension) {\n            for (const [, binary] of Object.entries(this.binaryCache)) {\n                ps.push(this.checkCompletionAsync_(binary));\n            }\n            return Promise.all(ps);\n        }\n        else {\n            for (const [, binary] of Object.entries(this.binaryCache)) {\n                const p = new Promise((resolve) => {\n                    try {\n                        this.checkCompletion_(binary);\n                        resolve(true);\n                    }\n                    catch (error) {\n                        throw error;\n                    }\n                });\n                ps.push(p);\n            }\n            return Promise.all(ps);\n        }\n    }\n    async checkCompletionAsync_(binary) {\n        if (this.gpgpu.gl.getProgramParameter(binary.webGLProgram, this.gpgpu.parallelCompilationExtension.COMPLETION_STATUS_KHR)) {\n            return this.checkCompletion_(binary);\n        }\n        else {\n            await nextFrame();\n            return this.checkCompletionAsync_(binary);\n        }\n    }\n    checkCompletion_(binary) {\n        if (this.gpgpu.gl.getProgramParameter(binary.webGLProgram, this.gpgpu.gl.LINK_STATUS) === false) {\n            console.log(this.gpgpu.gl.getProgramInfoLog(binary.webGLProgram));\n            if (this.gpgpu.gl.getShaderParameter(binary.fragmentShader, this.gpgpu.gl.COMPILE_STATUS) === false) {\n                webgl_util.logShaderSourceAndInfoLog(binary.source, this.gpgpu.gl.getShaderInfoLog(binary.fragmentShader));\n                throw new Error('Failed to compile fragment shader.');\n            }\n            throw new Error('Failed to link vertex and fragment shaders.');\n        }\n        return true;\n    }\n    getUniformLocations() {\n        for (const [, binary] of Object.entries(this.binaryCache)) {\n            const { uniformLocations, customUniformLocations, infLoc, nanLoc, inShapesLocations, inTexShapesLocations, outShapeLocation, outShapeStridesLocation, outTexShapeLocation } = getUniformLocations(this.gpgpu, binary.program, binary.webGLProgram);\n            binary.uniformLocations = uniformLocations;\n            binary.customUniformLocations = customUniformLocations;\n            binary.infLoc = infLoc;\n            binary.nanLoc = nanLoc;\n            binary.inShapesLocations = inShapesLocations;\n            binary.inTexShapesLocations = inTexShapesLocations;\n            binary.outShapeLocation = outShapeLocation;\n            binary.outShapeStridesLocation = outShapeStridesLocation;\n            binary.outTexShapeLocation = outTexShapeLocation;\n        }\n    }\n}\nMathBackendWebGL.nextDataId = 0;\nfunction float32ToTypedArray(a, dtype) {\n    if (dtype === 'float32' || dtype === 'complex64') {\n        return a;\n    }\n    else if (dtype === 'int32' || dtype === 'bool') {\n        const result = (dtype === 'int32') ? new Int32Array(a.length) :\n            new Uint8Array(a.length);\n        for (let i = 0; i < result.length; ++i) {\n            result[i] = Math.round(a[i]);\n        }\n        return result;\n    }\n    else {\n        throw new Error(`Unknown dtype ${dtype}`);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFja2VuZF93ZWJnbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYmFja2VuZF93ZWJnbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxzQkFBc0I7QUFDdEIsT0FBTyxlQUFlLENBQUM7QUFHdkIsT0FBTyxFQUFDLFlBQVksRUFBaUIsTUFBTSxFQUFVLFdBQVcsRUFBa0MsTUFBTSxFQUFFLEdBQUcsRUFBVyxZQUFZLEVBQUUsYUFBYSxFQUFjLFNBQVMsRUFBeUMsTUFBTSxFQUF3RCxJQUFJLEVBQTBCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQ2xWLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDOUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDdEQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDeEQsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sNEJBQTRCLENBQUM7QUFDckUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sS0FBSyxVQUFVLE1BQU0sY0FBYyxDQUFDO0FBQzNDLE9BQU8sRUFBQyxtQkFBbUIsRUFBd0MsTUFBTSxjQUFjLENBQUM7QUFDeEYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDdkQsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN2QyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMs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UUFDOUQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7WUFDdEMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDOUI7UUFDRCxPQUFPLE1BQTJCLENBQUM7S0FDcEM7U0FBTTtRQUNMLE1BQU0sSUFBSSxLQUFLLENBQUMsaUJBQWlCLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDM0M7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG4vLyBJbXBvcnQgd2ViZ2wgZmxhZ3MuXG5pbXBvcnQgJy4vZmxhZ3Nfd2ViZ2wnO1xuXG5pbXBvcnQgKiBhcyB0ZiBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEJhY2tlbmRWYWx1ZXMsIGJ1ZmZlciwgRGF0YUlkLCBEYXRhU3RvcmFnZSwgRGF0YVRvR1BVV2ViR0xPcHRpb24sIERhdGFUeXBlLCBlbmdpbmUsIGVudiwgR1BVRGF0YSwga2VybmVsX2ltcGxzLCBLZXJuZWxCYWNrZW5kLCBNZW1vcnlJbmZvLCBuZXh0RnJhbWUsIE51bWVyaWNEYXRhVHlwZSwgUmFuaywgUmVjdXJzaXZlQXJyYXksIHNjYWxhciwgU2hhcGVNYXAsIFRlbnNvciwgVGVuc29yMkQsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgdGlkeSwgVGltaW5nSW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7Z2V0V2ViR0xDb250ZXh0fSBmcm9tICcuL2NhbnZhc191dGlsJztcbmltcG9ydCB7RGVjb2RlTWF0cml4UHJvZ3JhbX0gZnJvbSAnLi9kZWNvZGVfbWF0cml4X2dwdSc7XG5pbXBvcnQge0RlY29kZU1hdHJpeFBhY2tlZFByb2dyYW19IGZyb20gJy4vZGVjb2RlX21hdHJpeF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7RW5jb2RlRmxvYXRQcm9ncmFtfSBmcm9tICcuL2VuY29kZV9mbG9hdF9ncHUnO1xuaW1wb3J0IHtFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW19IGZyb20gJy4vZW5jb2RlX2Zsb2F0X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtFbmNvZGVNYXRyaXhQcm9ncmFtfSBmcm9tICcuL2VuY29kZV9tYXRyaXhfZ3B1JztcbmltcG9ydCB7RW5jb2RlTWF0cml4UGFja2VkUHJvZ3JhbX0gZnJvbSAnLi9lbmNvZGVfbWF0cml4X3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtHUEdQVUNvbnRleHR9IGZyb20gJy4vZ3BncHVfY29udGV4dCc7XG5pbXBvcnQgKiBhcyBncGdwdV9tYXRoIGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldFVuaWZvcm1Mb2NhdGlvbnMsIEdQR1BVQmluYXJ5LCBHUEdQVVByb2dyYW0sIFRlbnNvckRhdGF9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge3NpbXBsZUFic0ltcGxDUFV9IGZyb20gJy4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1BhY2tQcm9ncmFtfSBmcm9tICcuL3BhY2tfZ3B1JztcbmltcG9ydCB7UmVzaGFwZVBhY2tlZFByb2dyYW19IGZyb20gJy4vcmVzaGFwZV9wYWNrZWRfZ3B1JztcbmltcG9ydCAqIGFzIHRleF91dGlsIGZyb20gJy4vdGV4X3V0aWwnO1xuaW1wb3J0IHtUZXh0dXJlLCBUZXh0dXJlRGF0YSwgVGV4dHVyZVVzYWdlfSBmcm9tICcuL3RleF91dGlsJztcbmltcG9ydCB7VGV4dHVyZU1hbmFnZXJ9IGZyb20gJy4vdGV4dHVyZV9tYW5hZ2VyJztcbmltcG9ydCAqIGFzIHVuYXJ5X29wIGZyb20gJy4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtVbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQge1VuYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge1VucGFja1Byb2dyYW19IGZyb20gJy4vdW5wYWNrX2dwdSc7XG5pbXBvcnQgKiBhcyB3ZWJnbF91dGlsIGZyb20gJy4vd2ViZ2xfdXRpbCc7XG5cbmNvbnN0IHdoZXJlSW1wbCA9IGtlcm5lbF9pbXBscy53aGVyZUltcGw7XG5cbmV4cG9ydCBjb25zdCBFUFNJTE9OX0ZMT0FUMzIgPSAxZS03O1xuZXhwb3J0IGNvbnN0IEVQU0lMT05fRkxPQVQxNiA9IDFlLTQ7XG5cbnR5cGUgS2VybmVsSW5mbyA9IHtcbiAgbmFtZTogc3RyaW5nOyBxdWVyeTogUHJvbWlzZTxudW1iZXI+O1xufTtcblxuZXhwb3J0IHR5cGUgVGltZXJOb2RlID0gUmVjdXJzaXZlQXJyYXk8S2VybmVsSW5mbz58S2VybmVsSW5mbztcbmV4cG9ydCBpbnRlcmZhY2UgQ1BVVGltZXJRdWVyeSB7XG4gIHN0YXJ0TXM6IG51bWJlcjtcbiAgZW5kTXM/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViR0xNZW1vcnlJbmZvIGV4dGVuZHMgTWVtb3J5SW5mbyB7XG4gIG51bUJ5dGVzSW5HUFU6IG51bWJlcjtcbiAgLy8gVHJhY2tzIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIG9uIHRoZSBHUFUsIGFjY291bnRpbmcgZm9yIHRoZVxuICAvLyBwaHlzaWNhbCB0ZXh0dXJlIHR5cGUuXG4gIG51bUJ5dGVzSW5HUFVBbGxvY2F0ZWQ6IG51bWJlcjtcbiAgLy8gVHJhY2tzIGJ5dGUgc2l6ZSBvZiB0ZXh0dXJlcyB0aGF0IHdlcmUgY3JlYXRlZCBhbmQgdGhlbiBtYWRlIGF2YWlsYWJsZSBmb3JcbiAgLy8gcmV1c2UgKGRpc3Bvc2VkKS5cbiAgbnVtQnl0ZXNJbkdQVUZyZWU6IG51bWJlcjtcbiAgdW5yZWxpYWJsZTogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBXZWJHTFRpbWluZ0luZm8gZXh0ZW5kcyBUaW1pbmdJbmZvIHtcbiAgdXBsb2FkV2FpdE1zOiBudW1iZXI7XG4gIGRvd25sb2FkV2FpdE1zOiBudW1iZXI7XG59XG5cbmNvbnN0IGJpbmFyeUNhY2hlczoge1t3ZWJHTFZlcnNpb246IHN0cmluZ106IHtba2V5OiBzdHJpbmddOiBHUEdQVUJpbmFyeX19ID0ge307XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRCaW5hcnlDYWNoZSh3ZWJHTFZlcnNpb246IG51bWJlcikge1xuICBpZiAod2ViR0xWZXJzaW9uIGluIGJpbmFyeUNhY2hlcykge1xuICAgIHJldHVybiBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXTtcbiAgfVxuICBiaW5hcnlDYWNoZXNbd2ViR0xWZXJzaW9uXSA9IHt9O1xuICByZXR1cm4gYmluYXJ5Q2FjaGVzW3dlYkdMVmVyc2lvbl07XG59XG5cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZXRlcm1pbmUgc2l6ZSB0aHJlc2hvbGQgZm9yIGhhbmRpbmdcbi8vIG9mZiBleGVjdXRpb24gdG8gdGhlIENQVS5cbmNvbnN0IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEID1cbiAgICBlbnYoKS5nZXROdW1iZXIoJ0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJyk7XG5cbi8vIEVtcGlyaWNhbGx5IGRldGVybWluZWQgY29uc3RhbnQgdXNlZCB0byBkZWNpZGUgdGhlIG51bWJlciBvZiBNQiBvbiBHUFVcbi8vIGJlZm9yZSB3ZSB3YXJuIGFib3V0IGhpZ2ggbWVtb3J5IHVzZS4gVGhlIE1CIGFyZSB0aGlzIGNvbnN0YW50ICogc2NyZWVuIGFyZWFcbi8vICogZHBpIC8gMTAyNCAvIDEwMjQuXG5jb25zdCBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UID0gNjAwO1xuZnVuY3Rpb24gbnVtTUJCZWZvcmVXYXJuaW5nKCk6IG51bWJlciB7XG4gIGlmIChlbnYoKS5nbG9iYWwuc2NyZWVuID09IG51bGwpIHtcbiAgICByZXR1cm4gMTAyNDsgIC8vIDEgR0IuXG4gIH1cbiAgcmV0dXJuIChlbnYoKS5nbG9iYWwuc2NyZWVuLmhlaWdodCAqIGVudigpLmdsb2JhbC5zY3JlZW4ud2lkdGggKlxuICAgICAgICAgIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSAqXG4gICAgICBCRUZPUkVfUEFHSU5HX0NPTlNUQU5UIC8gMTAyNCAvIDEwMjQ7XG59XG5cbmV4cG9ydCBjbGFzcyBNYXRoQmFja2VuZFdlYkdMIGV4dGVuZHMgS2VybmVsQmFja2VuZCB7XG4gIHRleERhdGE6IERhdGFTdG9yYWdlPFRleHR1cmVEYXRhPjtcbiAgZ3BncHU6IEdQR1BVQ29udGV4dDtcblxuICBwcml2YXRlIHN0YXRpYyBuZXh0RGF0YUlkID0gMDtcbiAgcHJpdmF0ZSBuZXh0RGF0YUlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGhCYWNrZW5kV2ViR0wubmV4dERhdGFJZCsrO1xuICB9XG4gIC8vIE1hcHMgZGF0YSBpZHMgdGhhdCBoYXZlIGEgcGVuZGluZyByZWFkIG9wZXJhdGlvbiwgdG8gbGlzdCBvZiBzdWJzY3JpYmVycy5cbiAgcHJpdmF0ZSBwZW5kaW5nUmVhZCA9IG5ldyBXZWFrTWFwPERhdGFJZCwgQXJyYXk8KGFycjogVHlwZWRBcnJheSkgPT4gdm9pZD4+KCk7XG4gIC8vIExpc3Qgb2YgZGF0YSBpZHMgdGhhdCBhcmUgc2NoZWR1bGVkIGZvciBkaXNwb3NhbCwgYnV0IGFyZSB3YWl0aW5nIG9uIGFcbiAgLy8gcGVuZGluZyByZWFkIG9wZXJhdGlvbi5cbiAgcHJpdmF0ZSBwZW5kaW5nRGlzcG9zYWwgPSBuZXcgV2Vha1NldDxEYXRhSWQ+KCk7XG5cbiAgLy8gVXNlZCB0byBjb3VudCB0aGUgbnVtYmVyIG9mICdzaGFsbG93JyBzbGljZWQgdGVuc29ycyB0aGF0IHBvaW50IHRvIHRoZVxuICAvLyBzYW1lIGRhdGEgaWQuXG4gIGRhdGFSZWZDb3VudCA9IG5ldyBXZWFrTWFwPERhdGFJZCwgbnVtYmVyPigpO1xuICBwcml2YXRlIG51bUJ5dGVzSW5HUFUgPSAwO1xuXG4gIHByaXZhdGUgY2FudmFzOiBIVE1MQ2FudmFzRWxlbWVudHxPZmZzY3JlZW5DYW52YXM7XG5cbiAgcHJpdmF0ZSBwcm9ncmFtVGltZXJzU3RhY2s6IFRpbWVyTm9kZVtdO1xuICBwcml2YXRlIGFjdGl2ZVRpbWVyczogVGltZXJOb2RlW107XG4gIC8vIEFjY3VtdWxhdGVkIHRpbWUgc3BlbnQgKGluY2x1ZGluZyBibG9ja2luZykgaW4gdXBsb2FkaW5nIGRhdGEgdG8gd2ViZ2wuXG4gIHByaXZhdGUgdXBsb2FkV2FpdE1zID0gMDtcbiAgLy8gQWNjdW11bGF0ZWQgdGltZSBzcGVudCAoaW5jbHVkaW5nIGJsb2NraW5nIGluIGRvd25sb2FkaW5nIGRhdGEgZnJvbSB3ZWJnbC5cbiAgcHJpdmF0ZSBkb3dubG9hZFdhaXRNcyA9IDA7XG5cbiAgLy8gcmVjb3JkIHRoZSBsYXN0IG1hbnVhbCBHTCBGbHVzaCB0aW1lLlxuICBwcml2YXRlIGxhc3RHbEZsdXNoVGltZSA9IDA7XG5cbiAgLy8gTnVtYmVyIG9mIGJpdHMgb2YgcHJlY2lzaW9uIG9mIHRoaXMgYmFja2VuZC5cbiAgcHJpdmF0ZSBmbG9hdFByZWNpc2lvblZhbHVlOiAzMnwxNjtcblxuICBwcml2YXRlIHRleHR1cmVNYW5hZ2VyOiBUZXh0dXJlTWFuYWdlcjtcbiAgcHJpdmF0ZSBiaW5hcnlDYWNoZToge1trZXk6IHN0cmluZ106IEdQR1BVQmluYXJ5fTtcbiAgcHJpdmF0ZSBncGdwdUNyZWF0ZWRMb2NhbGx5OiBib29sZWFuO1xuICBwcml2YXRlIG51bU1CQmVmb3JlV2FybmluZzogbnVtYmVyO1xuICBwcml2YXRlIHdhcm5lZEFib3V0TWVtb3J5ID0gZmFsc2U7XG5cbiAgY29uc3RydWN0b3IoZ3B1UmVzb3VyY2U/OiBHUEdQVUNvbnRleHR8SFRNTENhbnZhc0VsZW1lbnR8T2Zmc2NyZWVuQ2FudmFzKSB7XG4gICAgc3VwZXIoKTtcbiAgICBpZiAoIWVudigpLmdldEJvb2woJ0hBU19XRUJHTCcpKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dlYkdMIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhpcyBkZXZpY2UnKTtcbiAgICB9XG5cbiAgICBsZXQgbmV3R1BHUFU7XG4gICAgaWYgKGdwdVJlc291cmNlICE9IG51bGwpIHtcbiAgICAgIGlmIChncHVSZXNvdXJjZSBpbnN0YW5jZW9mIEdQR1BVQ29udGV4dCkge1xuICAgICAgICBuZXdHUEdQVSA9IGdwdVJlc291cmNlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgZ2wgPVxuICAgICAgICAgICAgZ2V0V2ViR0xDb250ZXh0KGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpLCBncHVSZXNvdXJjZSk7XG4gICAgICAgIG5ld0dQR1BVID0gbmV3IEdQR1BVQ29udGV4dChnbCk7XG4gICAgICB9XG4gICAgICB0aGlzLmJpbmFyeUNhY2hlID0ge307XG4gICAgICB0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgZ2wgPSBnZXRXZWJHTENvbnRleHQoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykpO1xuICAgICAgbmV3R1BHUFUgPSBuZXcgR1BHUFVDb250ZXh0KGdsKTtcbiAgICAgIHRoaXMuYmluYXJ5Q2FjaGUgPSBnZXRCaW5hcnlDYWNoZShlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX1ZFUlNJT04nKSk7XG4gICAgICB0aGlzLmdwZ3B1Q3JlYXRlZExvY2FsbHkgPSB0cnVlO1xuICAgIH1cblxuICAgIHRoaXMuZ3BncHUgPSBuZXdHUEdQVTtcbiAgICB0aGlzLmNhbnZhcyA9IHRoaXMuZ3BncHUuZ2wuY2FudmFzO1xuICAgIHRoaXMudGV4dHVyZU1hbmFnZXIgPSBuZXcgVGV4dHVyZU1hbmFnZXIodGhpcy5ncGdwdSk7XG4gICAgdGhpcy5udW1NQkJlZm9yZVdhcm5pbmcgPSBudW1NQkJlZm9yZVdhcm5pbmcoKTtcbiAgICB0aGlzLnRleERhdGEgPSBuZXcgRGF0YVN0b3JhZ2UodGhpcywgZW5naW5lKCkpO1xuICB9XG5cbiAgbnVtRGF0YUlkcygpIHtcbiAgICByZXR1cm4gdGhpcy50ZXhEYXRhLm51bURhdGFJZHMoKSAtIHRoaXMucGVuZGluZ0RlbGV0ZXM7XG4gIH1cblxuICB3cml0ZSh2YWx1ZXM6IEJhY2tlbmRWYWx1ZXMsIHNoYXBlOiBudW1iZXJbXSwgZHR5cGU6IERhdGFUeXBlKTogRGF0YUlkIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfQ0hFQ0tfTlVNRVJJQ0FMX1BST0JMRU1TJykgfHxcbiAgICAgICAgZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcgJiYgdmFsdWVzICE9IG51bGwpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHdyaXRlIHRvIGEgY29tcGxleDY0IGR0eXBlLiBgICtcbiAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICBjb25zdCBkYXRhSWQgPSB7aWQ6IHRoaXMubmV4dERhdGFJZCgpfTtcbiAgICB0aGlzLnRleERhdGEuc2V0KFxuICAgICAgICBkYXRhSWQsXG4gICAgICAgIHtzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50OiAxfSk7XG4gICAgcmV0dXJuIGRhdGFJZDtcbiAgfVxuXG4gIC8qKiBSZXR1cm4gcmVmQ291bnQgb2YgYSBgVGVuc29yRGF0YWAuICovXG4gIHJlZkNvdW50KGRhdGFJZDogRGF0YUlkKTogbnVtYmVyIHtcbiAgICBpZiAodGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCB0ZW5zb3JEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgICAgcmV0dXJuIHRlbnNvckRhdGEucmVmQ291bnQ7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9XG5cbiAgLyoqIEluY3JlYXNlIHJlZkNvdW50IG9mIGEgYFRleHR1cmVEYXRhYC4gKi9cbiAgaW5jUmVmKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICB0ZXhEYXRhLnJlZkNvdW50Kys7XG4gIH1cblxuICAvKiogRGVjcmVhc2UgcmVmQ291bnQgb2YgYSBgVGV4dHVyZURhdGFgLiAqL1xuICBkZWNSZWYoZGF0YUlkOiBEYXRhSWQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgICAgdGV4RGF0YS5yZWZDb3VudC0tO1xuICAgIH1cbiAgfVxuXG4gIG1vdmUoXG4gICAgICBkYXRhSWQ6IERhdGFJZCwgdmFsdWVzOiBCYWNrZW5kVmFsdWVzLCBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIHJlZkNvdW50OiBudW1iZXIpOiB2b2lkIHtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnREVCVUcnKSkge1xuICAgICAgdGhpcy5jaGVja051bWVyaWNhbFByb2JsZW1zKHZhbHVlcyk7XG4gICAgfVxuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHdyaXRlIHRvIGEgY29tcGxleDY0IGR0eXBlLiBgICtcbiAgICAgICAgICBgUGxlYXNlIHVzZSB0Zi5jb21wbGV4KHJlYWwsIGltYWcpLmApO1xuICAgIH1cbiAgICB0aGlzLnRleERhdGEuc2V0KFxuICAgICAgICBkYXRhSWQsIHtzaGFwZSwgZHR5cGUsIHZhbHVlcywgdXNhZ2U6IFRleHR1cmVVc2FnZS5VUExPQUQsIHJlZkNvdW50fSk7XG4gIH1cblxuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0ZW5zb3JJbmZvOiBUZW5zb3JJbmZvKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwb3NlRGF0YSh0ZW5zb3JJbmZvLmRhdGFJZCk7XG4gIH1cblxuICByZWFkU3luYyhkYXRhSWQ6IERhdGFJZCk6IEJhY2tlbmRWYWx1ZXMge1xuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qge3ZhbHVlcywgZHR5cGUsIGNvbXBsZXhUZW5zb3JJbmZvcywgc2xpY2UsIHNoYXBlLCBpc1BhY2tlZH0gPSB0ZXhEYXRhO1xuXG4gICAgLy8gVGhlIHByZXNlbmNlIG9mIGBzbGljZWAgaW5kaWNhdGVzIHRoaXMgdGVuc29yIGlzIGEgc2hhbGxvdyBzbGljZSBvZiBhXG4gICAgLy8gZGlmZmVyZW50IHRlbnNvciwgYW5kIGlzIHVzaW5nIHRoYXQgb3JpZ2luYWwgdGVuc29yJ3MgdGV4dHVyZS4gUnVuXG4gICAgLy8gYGNsb25lYCBpbiBvcmRlciB0byBjb3B5IHRoYXQgdGV4dHVyZSBhbmQgcmVhZCBmcm9tIGl0LlxuICAgIGlmIChzbGljZSAhPSBudWxsKSB7XG4gICAgICBsZXQgcHJvZ3JhbTtcbiAgICAgIGlmIChpc1BhY2tlZCkge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHNoYXBlLCB1bmFyeV9vcC5DTE9ORSk7XG4gICAgICB9XG4gICAgICBjb25zdCByZXMgPVxuICAgICAgICAgIHRoaXMucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt7ZGF0YUlkLCBzaGFwZSwgZHR5cGV9XSwgZHR5cGUpO1xuICAgICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmMocmVzLmRhdGFJZCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG4gICAgaWYgKHZhbHVlcyAhPSBudWxsKSB7XG4gICAgICByZXR1cm4gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQpO1xuICAgIH1cbiAgICBpZiAoZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gdmFsdWVzO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgfVxuXG4gICAgbGV0IHJlc3VsdDogRmxvYXQzMkFycmF5O1xuICAgIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIGNvbnN0IHJlYWxWYWx1ZXMgPVxuICAgICAgICAgIHRoaXMucmVhZFN5bmMoY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkKSBhcyBGbG9hdDMyQXJyYXk7XG4gICAgICBjb25zdCBpbWFnVmFsdWVzID1cbiAgICAgICAgICB0aGlzLnJlYWRTeW5jKGNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCkgYXMgRmxvYXQzMkFycmF5O1xuICAgICAgcmVzdWx0ID0gYmFja2VuZF91dGlsLm1lcmdlUmVhbEFuZEltYWdBcnJheXMocmVhbFZhbHVlcywgaW1hZ1ZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkKTtcbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkVGltZVByb2dyYW0pIHtcbiAgICAgIHRoaXMuZG93bmxvYWRXYWl0TXMgKz0gdXRpbC5ub3coKSAtIHN0YXJ0O1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5jb252ZXJ0QW5kQ2FjaGVPbkNQVShkYXRhSWQsIHJlc3VsdCk7XG4gIH1cblxuICBhc3luYyByZWFkKGRhdGFJZDogRGF0YUlkKTogUHJvbWlzZTxCYWNrZW5kVmFsdWVzPiB7XG4gICAgaWYgKHRoaXMucGVuZGluZ1JlYWQuaGFzKGRhdGFJZCkpIHtcbiAgICAgIGNvbnN0IHN1YnNjcmliZXJzID0gdGhpcy5wZW5kaW5nUmVhZC5nZXQoZGF0YUlkKTtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxUeXBlZEFycmF5PihyZXNvbHZlID0+IHN1YnNjcmliZXJzLnB1c2gocmVzb2x2ZSkpO1xuICAgIH1cbiAgICBjb25zdCB0ZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICAgIGNvbnN0IHt2YWx1ZXMsIHNoYXBlLCBzbGljZSwgZHR5cGUsIGNvbXBsZXhUZW5zb3JJbmZvcywgaXNQYWNrZWR9ID0gdGV4RGF0YTtcblxuICAgIC8vIFRoZSBwcmVzZW5jZSBvZiBgc2xpY2VgIGluZGljYXRlcyB0aGlzIHRlbnNvciBpcyBhIHNoYWxsb3cgc2xpY2Ugb2YgYVxuICAgIC8vIGRpZmZlcmVudCB0ZW5zb3IsIGFuZCBpcyB1c2luZyB0aGF0IG9yaWdpbmFsIHRlbnNvcidzIHRleHR1cmUuIFJ1blxuICAgIC8vIGBjbG9uZWAgaW4gb3JkZXIgdG8gY29weSB0aGF0IHRleHR1cmUgYW5kIHJlYWQgZnJvbSBpdC5cbiAgICBpZiAoc2xpY2UgIT0gbnVsbCkge1xuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID1cbiAgICAgICAgICB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbe2RhdGFJZCwgc2hhcGUsIGR0eXBlfV0sIGR0eXBlKTtcbiAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLnJlYWQocmVzLmRhdGFJZCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCk7XG4gICAgfVxuXG4gICAgaWYgKGVudigpLmdldEJvb2woJ0RFQlVHJykpIHtcbiAgICAgIC8vIGdldEJvb2woJ1dFQkdMX0RPV05MT0FEX0ZMT0FUX0VOQUJMRUQnKSBjYXVzZWQgYSBibG9ja2luZyBHUFUgY2FsbC5cbiAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSByZWFzb24sIG9ubHkgY2hlY2sgaXQgZm9yIGRlYnVnZ2luZy4gSW4gcHJvZHVjdGlvbixcbiAgICAgIC8vIGl0IGRvZXNuJ3QgaGFuZGxlIHRoaXMgdXNlIGNhc2UgYW55d2F5LCBzbyBiZWhhdmlvciBpcyBub3QgY2hhbmdlZC5cbiAgICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcpICYmXG4gICAgICAgICAgZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9WRVJTSU9OJykgPT09IDIpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYHRlbnNvci5kYXRhKCkgd2l0aCBXRUJHTF9ET1dOTE9BRF9GTE9BVF9FTkFCTEVEPWZhbHNlIGFuZCBgICtcbiAgICAgICAgICAgIGBXRUJHTF9WRVJTSU9OPTIgbm90IHlldCBzdXBwb3J0ZWQuYCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGJ1ZmZlcjogV2ViR0xCdWZmZXIgPSBudWxsO1xuICAgIGxldCB0bXBEb3dubG9hZFRhcmdldDogVGVuc29ySW5mbztcblxuICAgIGlmIChkdHlwZSAhPT0gJ2NvbXBsZXg2NCcgJiYgZW52KCkuZ2V0KCdXRUJHTF9CVUZGRVJfU1VQUE9SVEVEJykpIHtcbiAgICAgIC8vIFBvc3NpYmx5IGNvcHkgdGhlIHRleHR1cmUgaW50byBhIGJ1ZmZlciBiZWZvcmUgaW5zZXJ0aW5nIGEgZmVuY2UuXG4gICAgICB0bXBEb3dubG9hZFRhcmdldCA9IHRoaXMuZGVjb2RlKGRhdGFJZCk7XG4gICAgICBjb25zdCB0bXBEYXRhID0gdGhpcy50ZXhEYXRhLmdldCh0bXBEb3dubG9hZFRhcmdldC5kYXRhSWQpO1xuXG4gICAgICBidWZmZXIgPSB0aGlzLmdwZ3B1LmNyZWF0ZUJ1ZmZlckZyb21UZXh0dXJlKFxuICAgICAgICAgIHRtcERhdGEudGV4dHVyZS50ZXh0dXJlLCAuLi50ZXhfdXRpbC5nZXREZW5zZVRleFNoYXBlKHNoYXBlKSk7XG4gICAgfVxuXG4gICAgdGhpcy5wZW5kaW5nUmVhZC5zZXQoZGF0YUlkLCBbXSk7XG5cbiAgICBpZiAoZHR5cGUgIT09ICdjb21wbGV4NjQnKSB7XG4gICAgICAvLyBDcmVhdGUgYSBmZW5jZSBhbmQgd2FpdCBmb3IgaXQgdG8gcmVzb2x2ZS5cbiAgICAgIGF3YWl0IHRoaXMuZ3BncHUuY3JlYXRlQW5kV2FpdEZvckZlbmNlKCk7XG4gICAgfVxuXG4gICAgLy8gRG93bmxvYWQgdGhlIHZhbHVlcyBmcm9tIHRoZSBHUFUuXG4gICAgbGV0IHZhbHM6IEZsb2F0MzJBcnJheTtcbiAgICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICBjb25zdCBwcyA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgICAgdGhpcy5yZWFkKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCksXG4gICAgICAgIHRoaXMucmVhZChjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQpXG4gICAgICBdKTtcblxuICAgICAgY29uc3QgcmVhbFZhbHVlcyA9IHBzWzBdO1xuICAgICAgY29uc3QgaW1hZ1ZhbHVlcyA9IHBzWzFdO1xuICAgICAgdmFscyA9IGJhY2tlbmRfdXRpbC5tZXJnZVJlYWxBbmRJbWFnQXJyYXlzKFxuICAgICAgICAgIHJlYWxWYWx1ZXMgYXMgRmxvYXQzMkFycmF5LCBpbWFnVmFsdWVzIGFzIEZsb2F0MzJBcnJheSk7XG4gICAgfSBlbHNlIGlmIChidWZmZXIgPT0gbnVsbCkge1xuICAgICAgdmFscyA9IHRoaXMuZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICB2YWxzID0gdGhpcy5ncGdwdS5kb3dubG9hZEZsb2F0MzJNYXRyaXhGcm9tQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7XG4gICAgfVxuICAgIGlmICh0bXBEb3dubG9hZFRhcmdldCAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRtcERvd25sb2FkVGFyZ2V0KTtcbiAgICB9XG4gICAgaWYgKGJ1ZmZlciAhPSBudWxsKSB7XG4gICAgICBjb25zdCBnbCA9IHRoaXMuZ3BncHUuZ2w7XG4gICAgICB3ZWJnbF91dGlsLmNhbGxBbmRDaGVjayhnbCwgKCkgPT4gZ2wuZGVsZXRlQnVmZmVyKGJ1ZmZlcikpO1xuICAgIH1cbiAgICBjb25zdCBkVHlwZVZhbHMgPSB0aGlzLmNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZCwgdmFscyk7XG5cbiAgICBjb25zdCBzdWJzY3JpYmVycyA9IHRoaXMucGVuZGluZ1JlYWQuZ2V0KGRhdGFJZCk7XG4gICAgdGhpcy5wZW5kaW5nUmVhZC5kZWxldGUoZGF0YUlkKTtcblxuICAgIC8vIE5vdGlmeSBhbGwgcGVuZGluZyByZWFkcy5cbiAgICBzdWJzY3JpYmVycy5mb3JFYWNoKHJlc29sdmUgPT4gcmVzb2x2ZShkVHlwZVZhbHMpKTtcbiAgICBpZiAodGhpcy5wZW5kaW5nRGlzcG9zYWwuaGFzKGRhdGFJZCkpIHtcbiAgICAgIHRoaXMucGVuZGluZ0Rpc3Bvc2FsLmRlbGV0ZShkYXRhSWQpO1xuICAgICAgaWYgKHRoaXMuZGlzcG9zZURhdGEoZGF0YUlkKSkge1xuICAgICAgICBlbmdpbmUoKS5yZW1vdmVEYXRhSWQoZGF0YUlkLCB0aGlzKTtcbiAgICAgIH1cbiAgICAgIHRoaXMucGVuZGluZ0RlbGV0ZXMtLTtcbiAgICB9XG4gICAgcmV0dXJuIGRUeXBlVmFscztcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFkIHRlbnNvciB0byBhIG5ldyB0ZXh0dXJlIHRoYXQgaXMgZGVuc2VseSBwYWNrZWQgZm9yIGVhc2Ugb2YgdXNlLlxuICAgKiBAcGFyYW0gZGF0YUlkIFRoZSBzb3VyY2UgdGVuc29yLlxuICAgKiBAcGFyYW0gb3B0aW9uc1xuICAgKiAgICAgY3VzdG9tVGV4U2hhcGU6IE9wdGlvbmFsLiBJZiBzZXQsIHdpbGwgdXNlIHRoZSB1c2VyIGRlZmluZWQgdGV4dHVyZVxuICAgKiAgICAgc2hhcGUgdG8gY3JlYXRlIHRoZSB0ZXh0dXJlLlxuICAgKi9cbiAgcmVhZFRvR1BVKGRhdGFJZDogRGF0YUlkLCBvcHRpb25zOiBEYXRhVG9HUFVXZWJHTE9wdGlvbiA9IHt9KTogR1BVRGF0YSB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCB7dmFsdWVzLCBzaGFwZSwgc2xpY2UsIGR0eXBlLCBpc1BhY2tlZCwgdGV4dHVyZX0gPSB0ZXhEYXRhO1xuXG4gICAgaWYgKGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdEb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgdGV4dHVyZSBmb3IgY29tcGxleDY0IGR0eXBlLicpO1xuICAgIH1cblxuICAgIC8vIFRoZSBwcmVzZW5jZSBvZiBgc2xpY2VgIGluZGljYXRlcyB0aGlzIHRlbnNvciBpcyBhIHNoYWxsb3cgc2xpY2Ugb2YgYVxuICAgIC8vIGRpZmZlcmVudCB0ZW5zb3IsIGFuZCBpcyB1c2luZyB0aGF0IG9yaWdpbmFsIHRlbnNvcidzIHRleHR1cmUuIFJ1blxuICAgIC8vIGBjbG9uZWAgaW4gb3JkZXIgdG8gY29weSB0aGF0IHRleHR1cmUgYW5kIHJlYWQgZnJvbSBpdC5cbiAgICBpZiAoc2xpY2UgIT0gbnVsbCkge1xuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShzaGFwZSwgdW5hcnlfb3AuQ0xPTkUpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmVzID1cbiAgICAgICAgICB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbe2RhdGFJZCwgc2hhcGUsIGR0eXBlfV0sIGR0eXBlKTtcbiAgICAgIGNvbnN0IGdwdVJlc291b3JjZSA9IHRoaXMucmVhZFRvR1BVKHJlcywgb3B0aW9ucyk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlcyk7XG4gICAgICByZXR1cm4gZ3B1UmVzb3VvcmNlO1xuICAgIH1cblxuICAgIGlmICh0ZXh0dXJlID09IG51bGwpIHtcbiAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RhdGEgaXMgbm90IG9uIEdQVSBidXQgb24gQ1BVLicpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGVyZSBpcyBubyBkYXRhIG9uIEdQVSBvciBDUFUuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRGVjb2RlIHRoZSB0ZXh0dXJlIHNvIHRoYXQgaXQgaXMgc3RvcmVkIGRlbnNlbHkgKHVzaW5nIGZvdXIgY2hhbm5lbHMpLlxuICAgIGNvbnN0IHRtcFRhcmdldCA9IHRoaXMuZGVjb2RlKGRhdGFJZCwgb3B0aW9ucy5jdXN0b21UZXhTaGFwZSk7XG5cbiAgICAvLyBNYWtlIGVuZ2luZSB0cmFjayB0aGlzIHRlbnNvciwgc28gdGhhdCB3ZSBjYW4gZGlzcG9zZSBpdCBsYXRlci5cbiAgICBjb25zdCB0ZW5zb3JSZWYgPSBlbmdpbmUoKS5tYWtlVGVuc29yRnJvbVRlbnNvckluZm8odG1wVGFyZ2V0KTtcblxuICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KHRtcFRhcmdldC5kYXRhSWQpO1xuICAgIHJldHVybiB7dGVuc29yUmVmLCAuLi50bXBEYXRhLnRleHR1cmV9O1xuICB9XG5cbiAgYnVmZmVyU3luYzxSIGV4dGVuZHMgUmFuaywgRCBleHRlbmRzIERhdGFUeXBlPih0OiBUZW5zb3JJbmZvKTpcbiAgICAgIFRlbnNvckJ1ZmZlcjxSLCBEPiB7XG4gICAgY29uc3QgZGF0YSA9IHRoaXMucmVhZFN5bmModC5kYXRhSWQpO1xuICAgIGlmICh0LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgLy8gRGVjb2RlIHRoZSBieXRlcyBpbnRvIHN0cmluZy5cbiAgICAgICAgY29uc3Qgc3RyaW5ncyA9IChkYXRhIGFzIFVpbnQ4QXJyYXlbXSkubWFwKGQgPT4gdXRpbC5kZWNvZGVTdHJpbmcoZCkpO1xuICAgICAgICByZXR1cm4gYnVmZmVyKHQuc2hhcGUgYXMgU2hhcGVNYXBbUl0sIHQuZHR5cGUsIHN0cmluZ3MpIGFzXG4gICAgICAgICAgICBUZW5zb3JCdWZmZXI8UiwgRD47XG4gICAgICB9IGNhdGNoIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gZGVjb2RlIGVuY29kZWQgc3RyaW5nIGJ5dGVzIGludG8gdXRmLTgnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGJ1ZmZlcih0LnNoYXBlIGFzIFNoYXBlTWFwW1JdLCB0LmR0eXBlLCBkYXRhIGFzIFR5cGVkQXJyYXkpIGFzXG4gICAgICAgIFRlbnNvckJ1ZmZlcjxSLCBEPjtcbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tOdW1lcmljYWxQcm9ibGVtcyh2YWx1ZXM6IEJhY2tlbmRWYWx1ZXMpOiB2b2lkIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IG51bSA9IHZhbHVlc1tpXSBhcyBudW1iZXI7XG4gICAgICBpZiAoIXdlYmdsX3V0aWwuY2FuQmVSZXByZXNlbnRlZChudW0pKSB7XG4gICAgICAgIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9DQVBBQkxFJykpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgYFRoZSB2YWx1ZSAke251bX0gY2Fubm90IGJlIHJlcHJlc2VudGVkIHdpdGggeW91ciBgICtcbiAgICAgICAgICAgICAgYGN1cnJlbnQgc2V0dGluZ3MuIENvbnNpZGVyIGVuYWJsaW5nIGZsb2F0MzIgcmVuZGVyaW5nOiBgICtcbiAgICAgICAgICAgICAgYCd0Zi5lbnYoKS5zZXQoJ1dFQkdMX1JFTkRFUl9GTE9BVDMyX0VOQUJMRUQnLCB0cnVlKTsnYCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRXJyb3IoYFRoZSB2YWx1ZSAke251bX0gY2Fubm90IGJlIHJlcHJlc2VudGVkIG9uIHRoaXMgZGV2aWNlLmApO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VmFsdWVzRnJvbVRleHR1cmUoZGF0YUlkOiBEYXRhSWQpOiBGbG9hdDMyQXJyYXkge1xuICAgIGNvbnN0IHtzaGFwZSwgZHR5cGUsIGlzUGFja2VkfSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCBzaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHNoYXBlKTtcbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRE9XTkxPQURfRkxPQVRfRU5BQkxFRCcpKSB7XG4gICAgICBjb25zdCB0bXBUYXJnZXQgPSB0aGlzLmRlY29kZShkYXRhSWQpO1xuICAgICAgY29uc3QgdG1wRGF0YSA9IHRoaXMudGV4RGF0YS5nZXQodG1wVGFyZ2V0LmRhdGFJZCk7XG4gICAgICBjb25zdCB2YWxzID1cbiAgICAgICAgICB0aGlzLmdwZ3B1XG4gICAgICAgICAgICAgIC5kb3dubG9hZE1hdHJpeEZyb21QYWNrZWRUZXh0dXJlKFxuICAgICAgICAgICAgICAgICAgdG1wRGF0YS50ZXh0dXJlLnRleHR1cmUsIC4uLnRleF91dGlsLmdldERlbnNlVGV4U2hhcGUoc2hhcGUpKVxuICAgICAgICAgICAgICAuc3ViYXJyYXkoMCwgc2l6ZSk7XG5cbiAgICAgIHRoaXMuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odG1wVGFyZ2V0KTtcblxuICAgICAgcmV0dXJuIHZhbHM7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9XG4gICAgICAgIGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKSAmJiBpc1BhY2tlZCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBvdXRwdXRTaGFwZSA9XG4gICAgICAgIHNob3VsZFVzZVBhY2tlZFByb2dyYW0gPyB3ZWJnbF91dGlsLmdldFNoYXBlQXMzRChzaGFwZSkgOiBzaGFwZTtcbiAgICBjb25zdCBwcm9ncmFtID0gc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA/XG4gICAgICAgIG5ldyBFbmNvZGVGbG9hdFBhY2tlZFByb2dyYW0ob3V0cHV0U2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdKSA6XG4gICAgICAgIG5ldyBFbmNvZGVGbG9hdFByb2dyYW0ob3V0cHV0U2hhcGUpO1xuICAgIGNvbnN0IG91dHB1dCA9IHRoaXMucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgICBwcm9ncmFtLCBbe3NoYXBlOiBvdXRwdXRTaGFwZSwgZHR5cGUsIGRhdGFJZH1dLCAnZmxvYXQzMicpO1xuICAgIGNvbnN0IHRtcERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KG91dHB1dC5kYXRhSWQpO1xuICAgIGNvbnN0IHZhbHMgPSB0aGlzLmdwZ3B1XG4gICAgICAgICAgICAgICAgICAgICAuZG93bmxvYWRCeXRlRW5jb2RlZEZsb2F0TWF0cml4RnJvbU91dHB1dFRleHR1cmUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgdG1wRGF0YS50ZXh0dXJlLnRleHR1cmUsIHRtcERhdGEudGV4U2hhcGVbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgdG1wRGF0YS50ZXhTaGFwZVsxXSlcbiAgICAgICAgICAgICAgICAgICAgIC5zdWJhcnJheSgwLCBzaXplKTtcbiAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG5cbiAgICByZXR1cm4gdmFscztcbiAgfVxuXG4gIHRpbWVyQXZhaWxhYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID4gMDtcbiAgfVxuXG4gIHRpbWUoZjogKCkgPT4gdm9pZCk6IFByb21pc2U8V2ViR0xUaW1pbmdJbmZvPiB7XG4gICAgY29uc3Qgb2xkQWN0aXZlVGltZXJzID0gdGhpcy5hY3RpdmVUaW1lcnM7XG4gICAgY29uc3QgbmV3QWN0aXZlVGltZXJzOiBUaW1lck5vZGVbXSA9IFtdO1xuXG4gICAgbGV0IG91dGVyTW9zdFRpbWUgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5wcm9ncmFtVGltZXJzU3RhY2sgPT0gbnVsbCkge1xuICAgICAgdGhpcy5wcm9ncmFtVGltZXJzU3RhY2sgPSBuZXdBY3RpdmVUaW1lcnM7XG4gICAgICBvdXRlck1vc3RUaW1lID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVUaW1lcnMucHVzaChuZXdBY3RpdmVUaW1lcnMpO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZVRpbWVycyA9IG5ld0FjdGl2ZVRpbWVycztcblxuICAgIGYoKTtcblxuICAgIC8vIG5lZWRpbmcgdG8gc3BsaXQgdGhlc2UgdXAgYmVjYXVzZSB1dGlsLmZsYXR0ZW4gb25seSBhY2NlcHRzIGNlcnRhaW4gdHlwZXNcbiAgICBjb25zdCBmbGF0dGVuZWRBY3RpdmVUaW1lclF1ZXJpZXMgPVxuICAgICAgICB1dGlsLmZsYXR0ZW4odGhpcy5hY3RpdmVUaW1lcnMubWFwKChkOiBLZXJuZWxJbmZvKSA9PiBkLnF1ZXJ5KSlcbiAgICAgICAgICAgIC5maWx0ZXIoZCA9PiBkICE9IG51bGwpO1xuICAgIGNvbnN0IGZsYXR0ZW5lZEFjdGl2ZVRpbWVyTmFtZXMgPVxuICAgICAgICB1dGlsLmZsYXR0ZW4odGhpcy5hY3RpdmVUaW1lcnMubWFwKChkOiBLZXJuZWxJbmZvKSA9PiBkLm5hbWUpKVxuICAgICAgICAgICAgLmZpbHRlcihkID0+IGQgIT0gbnVsbCk7XG5cbiAgICB0aGlzLmFjdGl2ZVRpbWVycyA9IG9sZEFjdGl2ZVRpbWVycztcblxuICAgIGlmIChvdXRlck1vc3RUaW1lKSB7XG4gICAgICB0aGlzLnByb2dyYW1UaW1lcnNTdGFjayA9IG51bGw7XG4gICAgfVxuXG4gICAgY29uc3QgcmVzOiBXZWJHTFRpbWluZ0luZm8gPSB7XG4gICAgICB1cGxvYWRXYWl0TXM6IHRoaXMudXBsb2FkV2FpdE1zLFxuICAgICAgZG93bmxvYWRXYWl0TXM6IHRoaXMuZG93bmxvYWRXYWl0TXMsXG4gICAgICBrZXJuZWxNczogbnVsbCxcbiAgICAgIHdhbGxNczogbnVsbCAgLy8gd2lsbCBiZSBmaWxsZWQgYnkgdGhlIGVuZ2luZVxuICAgIH07XG5cbiAgICByZXR1cm4gKGFzeW5jICgpID0+IHtcbiAgICAgIGlmIChlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX0RJU0pPSU5UX1FVRVJZX1RJTUVSX0VYVEVOU0lPTl9SRUxJQUJMRScpID5cbiAgICAgICAgICAwKSB7XG4gICAgICAgIGNvbnN0IGtlcm5lbE1zID0gYXdhaXQgUHJvbWlzZS5hbGwoZmxhdHRlbmVkQWN0aXZlVGltZXJRdWVyaWVzKTtcblxuICAgICAgICByZXNbJ2tlcm5lbE1zJ10gPSB1dGlsLnN1bShrZXJuZWxNcyk7XG4gICAgICAgIHJlc1snZ2V0RXh0cmFQcm9maWxlSW5mbyddID0gKCkgPT5cbiAgICAgICAgICAgIGtlcm5lbE1zXG4gICAgICAgICAgICAgICAgLm1hcCgoZCwgaSkgPT4gKHtuYW1lOiBmbGF0dGVuZWRBY3RpdmVUaW1lck5hbWVzW2ldLCBtczogZH0pKVxuICAgICAgICAgICAgICAgIC5tYXAoZCA9PiBgJHtkLm5hbWV9OiAke2QubXN9YClcbiAgICAgICAgICAgICAgICAuam9pbignLCAnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc1sna2VybmVsTXMnXSA9IHtcbiAgICAgICAgICBlcnJvcjogJ1dlYkdMIHF1ZXJ5IHRpbWVycyBhcmUgbm90IHN1cHBvcnRlZCBpbiB0aGlzIGVudmlyb25tZW50LidcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhpcy51cGxvYWRXYWl0TXMgPSAwO1xuICAgICAgdGhpcy5kb3dubG9hZFdhaXRNcyA9IDA7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0pKCk7XG4gIH1cbiAgbWVtb3J5KCk6IFdlYkdMTWVtb3J5SW5mbyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHVucmVsaWFibGU6IGZhbHNlLFxuICAgICAgbnVtQnl0ZXNJbkdQVTogdGhpcy5udW1CeXRlc0luR1BVLFxuICAgICAgbnVtQnl0ZXNJbkdQVUFsbG9jYXRlZDogdGhpcy50ZXh0dXJlTWFuYWdlci5udW1CeXRlc0FsbG9jYXRlZCxcbiAgICAgIG51bUJ5dGVzSW5HUFVGcmVlOiB0aGlzLnRleHR1cmVNYW5hZ2VyLm51bUJ5dGVzRnJlZVxuICAgIH0gYXMgV2ViR0xNZW1vcnlJbmZvO1xuICB9XG5cbiAgcHJpdmF0ZSBzdGFydFRpbWVyKCk6IFdlYkdMUXVlcnl8Q1BVVGltZXJRdWVyeSB7XG4gICAgaWYgKGVudigpLmdldE51bWJlcignV0VCR0xfRElTSk9JTlRfUVVFUllfVElNRVJfRVhURU5TSU9OX1JFTElBQkxFJykgPiAwKSB7XG4gICAgICByZXR1cm4gdGhpcy5ncGdwdS5iZWdpblF1ZXJ5KCk7XG4gICAgfVxuICAgIHJldHVybiB7c3RhcnRNczogdXRpbC5ub3coKSwgZW5kTXM6IG51bGx9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbmRUaW1lcihxdWVyeTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5KTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5IHtcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fUkVMSUFCTEUnKSA+IDApIHtcbiAgICAgIHRoaXMuZ3BncHUuZW5kUXVlcnkoKTtcbiAgICAgIHJldHVybiBxdWVyeTtcbiAgICB9XG4gICAgKHF1ZXJ5IGFzIENQVVRpbWVyUXVlcnkpLmVuZE1zID0gdXRpbC5ub3coKTtcbiAgICByZXR1cm4gcXVlcnk7XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGdldFF1ZXJ5VGltZShxdWVyeTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5KTogUHJvbWlzZTxudW1iZXI+IHtcbiAgICBpZiAoZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9ESVNKT0lOVF9RVUVSWV9USU1FUl9FWFRFTlNJT05fUkVMSUFCTEUnKSA+IDApIHtcbiAgICAgIHJldHVybiB0aGlzLmdwZ3B1LndhaXRGb3JRdWVyeUFuZEdldFRpbWUocXVlcnkgYXMgV2ViR0xRdWVyeSk7XG4gICAgfVxuICAgIGNvbnN0IHRpbWVyUXVlcnkgPSBxdWVyeSBhcyBDUFVUaW1lclF1ZXJ5O1xuICAgIHJldHVybiB0aW1lclF1ZXJ5LmVuZE1zIC0gdGltZXJRdWVyeS5zdGFydE1zO1xuICB9XG5cbiAgcHJpdmF0ZSBwZW5kaW5nRGVsZXRlcyA9IDA7XG5cbiAgLyoqXG4gICAqIERlY3JlYXNlIHRoZSBSZWZDb3VudCBvbiB0aGUgZGF0YUlkIGFuZCBkaXNwb3NlIHRoZSBtZW1vcnkgaWYgdGhlIGRhdGFJZFxuICAgKiBoYXMgMCByZWZDb3VudC4gSWYgdGhlcmUgYXJlIHBlbmRpbmcgcmVhZCBvbiB0aGUgZGF0YSwgdGhlIGRpc3Bvc2FsIHdvdWxkXG4gICAqIGFkZGVkIHRvIHRoZSBwZW5kaW5nIGRlbGV0ZSBxdWV1ZS4gUmV0dXJuIHRydWUgaWYgdGhlIGRhdGFJZCBpcyByZW1vdmVkXG4gICAqIGZyb20gYmFja2VuZCBvciB0aGUgYmFja2VuZCBkb2VzIG5vdCBjb250YWluIHRoZSBkYXRhSWQsIGZhbHNlIGlmIHRoZVxuICAgKiBkYXRhSWQgaXMgbm90IHJlbW92ZWQuIE1lbW9yeSBtYXkgb3IgbWF5IG5vdCBiZSByZWxlYXNlZCBldmVuIHdoZW4gZGF0YUlkXG4gICAqIGlzIHJlbW92ZWQsIHdoaWNoIGFsc28gZGVwZW5kcyBvbiBkYXRhUmVmQ291bnQsIHNlZSBgcmVsZWFzZUdQVWAuXG4gICAqIEBwYXJhbSBkYXRhSWRcbiAgICogQG9hcmFtIGZvcmNlIE9wdGlvbmFsLCByZW1vdmUgdGhlIGRhdGEgcmVnYXJkbGVzcyBvZiByZWZDb3VudFxuICAgKi9cbiAgZGlzcG9zZURhdGEoZGF0YUlkOiBEYXRhSWQsIGZvcmNlID0gZmFsc2UpOiBib29sZWFuIHtcbiAgICBpZiAodGhpcy5wZW5kaW5nRGlzcG9zYWwuaGFzKGRhdGFJZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBOby1vcCBpZiBhbHJlYWR5IGRpc3Bvc2VkLlxuICAgIGlmICghdGhpcy50ZXhEYXRhLmhhcyhkYXRhSWQpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBpZiBmb3JjZSBmbGFnIGlzIHNldCwgY2hhbmdlIHJlZkNvdW50IHRvIDAsIHRoaXMgd291bGQgZW5zdXJlIGRpc3Bvc2FsXG4gICAgLy8gd2hlbiBhZGRlZCB0byB0aGUgcGVuZGluZ0Rpc3Bvc2FsIHF1ZXVlLiBNZW1vcnkgbWF5IG9yIG1heSBub3QgYmVcbiAgICAvLyByZWxlYXNlZCwgd2hpY2ggYWxzbyBkZXBlbmRzIG9uIGRhdGFSZWZDb3VudCwgc2VlIGByZWxlYXNlR1BVYC5cbiAgICBpZiAoZm9yY2UpIHtcbiAgICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudCA9IDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS5yZWZDb3VudC0tO1xuICAgIH1cblxuICAgIGlmICghZm9yY2UgJiYgdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpLnJlZkNvdW50ID4gMCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnBlbmRpbmdSZWFkLmhhcyhkYXRhSWQpKSB7XG4gICAgICB0aGlzLnBlbmRpbmdEaXNwb3NhbC5hZGQoZGF0YUlkKTtcbiAgICAgIHRoaXMucGVuZGluZ0RlbGV0ZXMrKztcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnJlbGVhc2VHUFVEYXRhKGRhdGFJZCk7XG4gICAgY29uc3Qge2NvbXBsZXhUZW5zb3JJbmZvc30gPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgaWYgKGNvbXBsZXhUZW5zb3JJbmZvcyAhPSBudWxsKSB7XG4gICAgICB0aGlzLmRpc3Bvc2VEYXRhKGNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmRhdGFJZCwgZm9yY2UpO1xuICAgICAgdGhpcy5kaXNwb3NlRGF0YShjb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsIGZvcmNlKTtcbiAgICB9XG5cbiAgICB0aGlzLnRleERhdGEuZGVsZXRlKGRhdGFJZCk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHByaXZhdGUgcmVsZWFzZUdQVURhdGEoZGF0YUlkOiBEYXRhSWQpOiB2b2lkIHtcbiAgICBjb25zdCB7dGV4dHVyZSwgZHR5cGUsIHRleFNoYXBlLCB1c2FnZSwgaXNQYWNrZWQsIHNsaWNlfSA9XG4gICAgICAgIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCBrZXkgPSBzbGljZSAmJiBzbGljZS5vcmlnRGF0YUlkIHx8IGRhdGFJZDtcbiAgICBjb25zdCByZWZDb3VudCA9IHRoaXMuZGF0YVJlZkNvdW50LmdldChrZXkpO1xuXG4gICAgaWYgKHJlZkNvdW50ID4gMSkge1xuICAgICAgdGhpcy5kYXRhUmVmQ291bnQuc2V0KGtleSwgcmVmQ291bnQgLSAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5kYXRhUmVmQ291bnQuZGVsZXRlKGtleSk7XG4gICAgICBpZiAodGV4dHVyZSAhPSBudWxsKSB7XG4gICAgICAgIHRoaXMubnVtQnl0ZXNJbkdQVSAtPSB0aGlzLmNvbXB1dGVCeXRlcyh0ZXhTaGFwZSwgZHR5cGUpO1xuICAgICAgICB0aGlzLnRleHR1cmVNYW5hZ2VyLnJlbGVhc2VUZXh0dXJlKHRleHR1cmUsIHRleFNoYXBlLCB1c2FnZSwgaXNQYWNrZWQpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgdGV4RGF0YS50ZXh0dXJlID0gbnVsbDtcbiAgICB0ZXhEYXRhLnRleFNoYXBlID0gbnVsbDtcbiAgICB0ZXhEYXRhLmlzUGFja2VkID0gZmFsc2U7XG4gICAgdGV4RGF0YS5zbGljZSA9IG51bGw7XG4gIH1cblxuICBnZXRUZXh0dXJlKGRhdGFJZDogRGF0YUlkKTogV2ViR0xUZXh0dXJlIHtcbiAgICB0aGlzLnVwbG9hZFRvR1BVKGRhdGFJZCk7XG4gICAgcmV0dXJuIHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKS50ZXh0dXJlLnRleHR1cmU7XG4gIH1cblxuICAvKipcbiAgICogUmV0dXJucyBpbnRlcm5hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmljIGRhdGEgYnVja2V0LiBVc2VkIGluIHVuaXRcbiAgICogdGVzdHMuXG4gICAqL1xuICBnZXREYXRhSW5mbyhkYXRhSWQ6IERhdGFJZCk6IFRleHR1cmVEYXRhIHtcbiAgICByZXR1cm4gdGhpcy50ZXhEYXRhLmdldChkYXRhSWQpO1xuICB9XG5cbiAgLypcbiAgVGVzdHMgd2hldGhlciBhbGwgdGhlIGlucHV0cyB0byBhbiBvcCBhcmUgc21hbGwgYW5kIG9uIHRoZSBDUFUuIFRoaXMgaGV1cmlzdGljXG4gIGRldGVybWluZXMgd2hlbiBpdCB3b3VsZCBiZSBmYXN0ZXIgdG8gZXhlY3V0ZSBhIGtlcm5lbCBvbiB0aGUgQ1BVLiBXZWJHTFxuICBrZXJuZWxzIG9wdCBpbnRvIHJ1bm5pbmcgdGhpcyBjaGVjayBhbmQgZm9yd2FyZGluZyB3aGVuIGFwcHJvcHJpYXRlLlxuICBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvaXNzdWVzLzg3Mik6IERldmVsb3AgYSBtb3JlXG4gIHN1c3RhaW5hYmxlIHN0cmF0ZWd5IGZvciBvcHRpbWl6aW5nIGJhY2tlbmQgZXhlY3V0aW9uIG9mIG9wcy5cbiAgICovXG4gIHNob3VsZEV4ZWN1dGVPbkNQVShcbiAgICAgIGlucHV0czogVGVuc29ySW5mb1tdLFxuICAgICAgc2l6ZVRocmVzaG9sZCA9IENQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGVudigpLmdldEJvb2woJ1dFQkdMX0NQVV9GT1JXQVJEJykgJiZcbiAgICAgICAgaW5wdXRzLmV2ZXJ5KFxuICAgICAgICAgICAgaW5wdXQgPT4gdGhpcy50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpLnRleHR1cmUgPT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIHV0aWwuc2l6ZUZyb21TaGFwZShpbnB1dC5zaGFwZSkgPCBzaXplVGhyZXNob2xkKTtcbiAgfVxuXG4gIGdldEdQR1BVQ29udGV4dCgpOiBHUEdQVUNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLmdwZ3B1O1xuICB9XG5cbiAgd2hlcmUoY29uZGl0aW9uOiBUZW5zb3IpOiBUZW5zb3IyRCB7XG4gICAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAgICd0Zi53aGVyZSgpIGluIHdlYmdsIGxvY2tzIHRoZSBVSSB0aHJlYWQuICcgK1xuICAgICAgICAnQ2FsbCB0Zi53aGVyZUFzeW5jKCkgaW5zdGVhZCcpO1xuICAgIGNvbnN0IGNvbmRWYWxzID0gY29uZGl0aW9uLmRhdGFTeW5jKCk7XG4gICAgcmV0dXJuIHdoZXJlSW1wbChjb25kaXRpb24uc2hhcGUsIGNvbmRWYWxzKTtcbiAgfVxuXG4gIHByaXZhdGUgcGFja2VkVW5hcnlPcCh4OiBUZW5zb3JJbmZvLCBvcDogc3RyaW5nLCBkdHlwZTogRGF0YVR5cGUpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQYWNrZWRQcm9ncmFtKHguc2hhcGUsIG9wKTtcbiAgICBjb25zdCBvdXRJbmZvID0gdGhpcy5jb21waWxlQW5kUnVuKHByb2dyYW0sIFt4XSwgZHR5cGUpO1xuICAgIHJldHVybiBlbmdpbmUoKS5tYWtlVGVuc29yRnJvbVRlbnNvckluZm8ob3V0SW5mbyk7XG4gIH1cblxuICAvLyBUT0RPKG1zb3VsYW5pbGxlKSByZW1vdmUgdGhpcyBvbmNlIHRoZSBiYWNrZW5kIGhhcyBiZWVuIG1vZHVsYXJpemVkXG4gIC8vIGEgY29weSBpcyBuZWVkZWQgaGVyZSB0byBicmVhayBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuXG4gIC8vIEFsc28gcmVtb3ZlIHRoZSBvcCBmcm9tIHVuYXJ5X29wLlxuICBhYnM8VCBleHRlbmRzIFRlbnNvcj4oeDogVCk6IFQge1xuICAgIC8vIFRPRE86IGhhbmRsZSBjYXNlcyB3aGVuIHggaXMgY29tcGxleC5cbiAgICBpZiAodGhpcy5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSAmJiB4LmR0eXBlICE9PSAnY29tcGxleDY0Jykge1xuICAgICAgY29uc3Qgb3V0VmFsdWVzID1cbiAgICAgICAgICBzaW1wbGVBYnNJbXBsQ1BVKHRoaXMudGV4RGF0YS5nZXQoeC5kYXRhSWQpLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgICAgIHJldHVybiB0aGlzLm1ha2VPdXRwdXQoeC5zaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgICB9XG5cbiAgICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19VTkFSWV9PUEVSQVRJT05TJykpIHtcbiAgICAgIHJldHVybiB0aGlzLnBhY2tlZFVuYXJ5T3AoeCwgdW5hcnlfb3AuQUJTLCB4LmR0eXBlKSBhcyBUO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgdW5hcnlfb3AuQUJTKTtcbiAgICBjb25zdCBvdXRJbmZvID0gdGhpcy5jb21waWxlQW5kUnVuKHByb2dyYW0sIFt4XSk7XG4gICAgcmV0dXJuIGVuZ2luZSgpLm1ha2VUZW5zb3JGcm9tVGVuc29ySW5mbyhvdXRJbmZvKSBhcyBUO1xuICB9XG5cbiAgbWFrZVRlbnNvckluZm8oXG4gICAgICBzaGFwZTogbnVtYmVyW10sIGR0eXBlOiBEYXRhVHlwZSxcbiAgICAgIHZhbHVlcz86IEJhY2tlbmRWYWx1ZXN8c3RyaW5nW10pOiBUZW5zb3JJbmZvIHtcbiAgICBsZXQgZGF0YUlkO1xuICAgIGlmIChkdHlwZSA9PT0gJ3N0cmluZycgJiYgdmFsdWVzICE9IG51bGwgJiYgdmFsdWVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgdXRpbC5pc1N0cmluZyh2YWx1ZXNbMF0pKSB7XG4gICAgICBjb25zdCBlbmNvZGVkVmFsdWVzID1cbiAgICAgICAgICAodmFsdWVzIGFzIHt9IGFzIHN0cmluZ1tdKS5tYXAoZCA9PiB1dGlsLmVuY29kZVN0cmluZyhkKSk7XG5cbiAgICAgIGRhdGFJZCA9IHRoaXMud3JpdGUoZW5jb2RlZFZhbHVlcywgc2hhcGUsIGR0eXBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGF0YUlkID0gdGhpcy53cml0ZSh2YWx1ZXMgYXMgVHlwZWRBcnJheSwgc2hhcGUsIGR0eXBlKTtcbiAgICB9XG5cbiAgICB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCkudXNhZ2UgPSBudWxsO1xuICAgIHJldHVybiB7ZGF0YUlkLCBzaGFwZSwgZHR5cGV9O1xuICB9XG5cbiAgcHJpdmF0ZSBtYWtlT3V0cHV0PFQgZXh0ZW5kcyBUZW5zb3I+KFxuICAgICAgc2hhcGU6IG51bWJlcltdLCBkdHlwZTogRGF0YVR5cGUsIHZhbHVlcz86IEJhY2tlbmRWYWx1ZXMpOiBUIHtcbiAgICByZXR1cm4gZW5naW5lKCkubWFrZVRlbnNvckZyb21UZW5zb3JJbmZvKFxuICAgICAgICAgICAgICAgdGhpcy5tYWtlVGVuc29ySW5mbyhzaGFwZSwgZHR5cGUsIHZhbHVlcyksIHRoaXMpIGFzIFQ7XG4gIH1cblxuICB1bnBhY2tUZW5zb3IoaW5wdXQ6IFRlbnNvckluZm8pOiBUZW5zb3JJbmZvIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IFVucGFja1Byb2dyYW0oaW5wdXQuc2hhcGUpO1xuICAgIHJldHVybiB0aGlzLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW5wdXRdLCBpbnB1dC5kdHlwZSk7XG4gIH1cblxuICBwYWNrVGVuc29yKGlucHV0OiBUZW5zb3JJbmZvKTogVGVuc29ySW5mbyB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBQYWNrUHJvZ3JhbShpbnB1dC5zaGFwZSk7XG4gICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT3V0cHV0ID0gdHJ1ZTtcbiAgICByZXR1cm4gdGhpcy5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgIHByb2dyYW0sIFtpbnB1dF0sIGlucHV0LmR0eXBlLCBudWxsIC8qIGN1c3RvbVVuaWZvcm1WYWx1ZXMgKi8sXG4gICAgICAgIHByZXZlbnRFYWdlclVucGFja2luZ091dHB1dCk7XG4gIH1cblxuICBwcml2YXRlIHBhY2tlZFJlc2hhcGUoaW5wdXQ6IFRlbnNvckluZm8sIGFmdGVyU2hhcGU6IG51bWJlcltdKTogVGVuc29ySW5mbyB7XG4gICAgY29uc3QgaW5wdXQzRFNoYXBlID0gW1xuICAgICAgd2ViZ2xfdXRpbC5nZXRCYXRjaERpbShpbnB1dC5zaGFwZSksXG4gICAgICAuLi53ZWJnbF91dGlsLmdldFJvd3NDb2xzKGlucHV0LnNoYXBlKVxuICAgIF0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuICAgIGNvbnN0IGlucHV0M0Q6IFRlbnNvckluZm8gPSB7XG4gICAgICBkdHlwZTogaW5wdXQuZHR5cGUsXG4gICAgICBzaGFwZTogaW5wdXQzRFNoYXBlLFxuICAgICAgZGF0YUlkOiBpbnB1dC5kYXRhSWRcbiAgICB9O1xuICAgIGNvbnN0IGFmdGVyU2hhcGVBczNEID0gW1xuICAgICAgd2ViZ2xfdXRpbC5nZXRCYXRjaERpbShhZnRlclNoYXBlKSwgLi4ud2ViZ2xfdXRpbC5nZXRSb3dzQ29scyhhZnRlclNoYXBlKVxuICAgIF0gYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBSZXNoYXBlUGFja2VkUHJvZ3JhbShhZnRlclNoYXBlQXMzRCwgaW5wdXQzRFNoYXBlKTtcbiAgICBjb25zdCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IHRydWU7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW2lucHV0M0RTaGFwZV07XG4gICAgY29uc3Qgb3V0cHV0ID0gdGhpcy5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgIHByb2dyYW0sIFtpbnB1dDNEXSwgaW5wdXQuZHR5cGUsIGN1c3RvbVZhbHVlcyxcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgIHJldHVybiB7ZGF0YUlkOiBvdXRwdXQuZGF0YUlkLCBzaGFwZTogYWZ0ZXJTaGFwZSwgZHR5cGU6IG91dHB1dC5kdHlwZX07XG4gIH1cblxuICBwcml2YXRlIGRlY29kZShkYXRhSWQ6IERhdGFJZCwgY3VzdG9tVGV4U2hhcGU/OiBbbnVtYmVyLCBudW1iZXJdKTpcbiAgICAgIFRlbnNvckluZm8ge1xuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qge2lzUGFja2VkLCBzaGFwZSwgZHR5cGV9ID0gdGV4RGF0YTtcbiAgICBpZiAoY3VzdG9tVGV4U2hhcGUgIT0gbnVsbCkge1xuICAgICAgY29uc3Qgc2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSk7XG4gICAgICBjb25zdCB0ZXhTaXplID0gY3VzdG9tVGV4U2hhcGVbMF0gKiBjdXN0b21UZXhTaGFwZVsxXSAqIDQ7XG4gICAgICB1dGlsLmFzc2VydChcbiAgICAgICAgICBzaXplIDw9IHRleFNpemUsXG4gICAgICAgICAgKCkgPT4gJ2N1c3RvbVRleFNoYXBlIGlzIHRvbyBzbWFsbC4gJyArXG4gICAgICAgICAgICAgICdSb3cgKiBDb2x1bW4gKiA0IHNob3VsZCBiZSBlcXVhbCBvciBsYXJnZXIgdGhhbiB0aGUgJyArXG4gICAgICAgICAgICAgICdzaXplIG9mIHRoZSB0ZW5zb3IgZGF0YS4nKTtcbiAgICB9XG4gICAgY29uc3Qgc2hhcGVBczNEID1cbiAgICAgICAgd2ViZ2xfdXRpbC5nZXRTaGFwZUFzM0Qoc2hhcGUpIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgICBsZXQgcHJvZ3JhbTtcbiAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgIHByb2dyYW0gPSBuZXcgRGVjb2RlTWF0cml4UGFja2VkUHJvZ3JhbShzaGFwZUFzM0QpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtID0gbmV3IERlY29kZU1hdHJpeFByb2dyYW0oc2hhcGVBczNEKTtcbiAgICB9XG4gICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSB0cnVlO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9XG4gICAgICAgIFtjdXN0b21UZXhTaGFwZSAhPSBudWxsID8gY3VzdG9tVGV4U2hhcGUgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleF91dGlsLmdldERlbnNlVGV4U2hhcGUoc2hhcGVBczNEKV07XG4gICAgY29uc3Qgb3V0ID0gdGhpcy5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgIHByb2dyYW0sIFt7c2hhcGU6IHNoYXBlQXMzRCwgZHR5cGUsIGRhdGFJZH1dLCBkdHlwZSwgY3VzdG9tVmFsdWVzLFxuICAgICAgICBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCwgY3VzdG9tVGV4U2hhcGUpO1xuICAgIHJldHVybiB7ZHR5cGUsIHNoYXBlLCBkYXRhSWQ6IG91dC5kYXRhSWR9O1xuICB9XG5cbiAgcnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckluZm9bXSwgb3V0cHV0RHR5cGU6IERhdGFUeXBlLFxuICAgICAgY3VzdG9tVW5pZm9ybVZhbHVlcz86IG51bWJlcltdW10sIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0ID0gZmFsc2UsXG4gICAgICBjdXN0b21UZXhTaGFwZT86IFtudW1iZXIsIG51bWJlcl0pOiBUZW5zb3JJbmZvIHtcbiAgICBjb25zdCBvdXRwdXQgPSB0aGlzLm1ha2VUZW5zb3JJbmZvKHByb2dyYW0ub3V0cHV0U2hhcGUsIG91dHB1dER0eXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gdGhpcy50ZXhEYXRhLmdldChvdXRwdXQuZGF0YUlkKTtcbiAgICBpZiAocHJvZ3JhbS5wYWNrZWRPdXRwdXQpIHtcbiAgICAgIG91dERhdGEuaXNQYWNrZWQgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAocHJvZ3JhbS5vdXRQYWNraW5nU2NoZW1lID09PSB0ZXhfdXRpbC5QYWNraW5nU2NoZW1lLkRFTlNFKSB7XG4gICAgICBjb25zdCB0ZXhlbFNoYXBlID0gY3VzdG9tVGV4U2hhcGUgIT0gbnVsbCA/XG4gICAgICAgICAgY3VzdG9tVGV4U2hhcGUgOlxuICAgICAgICAgIHRleF91dGlsLmdldERlbnNlVGV4U2hhcGUocHJvZ3JhbS5vdXRwdXRTaGFwZSk7XG4gICAgICAvLyBGb3IgYSBkZW5zZWx5IHBhY2tlZCBvdXRwdXQsIHdlIGV4cGxpY2l0bHkgc2V0IHRleFNoYXBlXG4gICAgICAvLyBzbyBpdCBkb2Vzbid0IGdldCBhc3NpZ25lZCBsYXRlciBhY2NvcmRpbmcgdG8gb3VyIHR5cGljYWwgcGFja2luZ1xuICAgICAgLy8gc2NoZW1lIHdoZXJlaW4gYSBzaW5nbGUgdGV4ZWwgY2FuIG9ubHkgY29udGFpbiB2YWx1ZXMgZnJvbSBhZGphY2VudFxuICAgICAgLy8gcm93cy9jb2xzLlxuICAgICAgb3V0RGF0YS50ZXhTaGFwZSA9IHRleGVsU2hhcGUubWFwKGQgPT4gZCAqIDIpIGFzIFtudW1iZXIsIG51bWJlcl07XG4gICAgfVxuICAgIGlmIChwcm9ncmFtLm91dFRleFVzYWdlICE9IG51bGwpIHtcbiAgICAgIG91dERhdGEudXNhZ2UgPSBwcm9ncmFtLm91dFRleFVzYWdlO1xuICAgIH1cblxuICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUob3V0cHV0LnNoYXBlKSA9PT0gMCkge1xuICAgICAgLy8gU2hvcnQtY2lyY3VpdCB0aGUgY29tcHV0YXRpb24gc2luY2UgdGhlIHJlc3VsdCBpcyBlbXB0eSAoaGFzIDAgaW4gaXRzXG4gICAgICAvLyBzaGFwZSkuXG4gICAgICBvdXREYXRhLnZhbHVlcyA9XG4gICAgICAgICAgdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKG91dHB1dC5kdHlwZSBhcyAnZmxvYXQzMicsIDApO1xuICAgICAgcmV0dXJuIG91dHB1dDtcbiAgICB9XG5cbiAgICBjb25zdCBkYXRhVG9EaXNwb3NlOiBUZW5zb3JJbmZvW10gPSBbXTtcbiAgICBjb25zdCBpbnB1dHNEYXRhOiBUZW5zb3JEYXRhW10gPSBpbnB1dHMubWFwKGlucHV0ID0+IHtcbiAgICAgIGlmIChpbnB1dC5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICAgYEdQR1BVUHJvZ3JhbSBkb2VzIG5vdCBzdXBwb3J0IGNvbXBsZXg2NCBpbnB1dC4gRm9yIGNvbXBsZXg2NCBgICtcbiAgICAgICAgICAgIGBkdHlwZXMsIHBsZWFzZSBzZXBhcmF0ZSB0aGUgcHJvZ3JhbSBpbnRvIHJlYWwgYW5kIGltYWdpbmFyeSBgICtcbiAgICAgICAgICAgIGBwYXJ0cy5gKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG5cbiAgICAgIGlmICh0ZXhEYXRhLnRleHR1cmUgPT0gbnVsbCkge1xuICAgICAgICBpZiAoIXByb2dyYW0ucGFja2VkSW5wdXRzICYmXG4gICAgICAgICAgICB1dGlsLnNpemVGcm9tU2hhcGUoaW5wdXQuc2hhcGUpIDw9XG4gICAgICAgICAgICAgICAgZW52KCkuZ2V0TnVtYmVyKCdXRUJHTF9TSVpFX1VQTE9BRF9VTklGT1JNJykpIHtcbiAgICAgICAgICAvLyBVcGxvYWQgc21hbGwgdGVuc29ycyB0aGF0IGxpdmUgb24gdGhlIENQVSBhcyB1bmlmb3Jtcywgbm90IGFzXG4gICAgICAgICAgLy8gdGV4dHVyZXMuIERvIHRoaXMgb25seSB3aGVuIHRoZSBlbnZpcm9ubWVudCBzdXBwb3J0cyAzMmJpdCBmbG9hdHNcbiAgICAgICAgICAvLyBkdWUgdG8gcHJvYmxlbXMgd2hlbiBjb21wYXJpbmcgMTZiaXQgZmxvYXRzIHdpdGggMzJiaXQgZmxvYXRzLlxuICAgICAgICAgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvODIxKTogTWFrZSBpdFxuICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciBwYWNrZWQgc2hhZGVycyB0byBzYW1wbGUgZnJvbSB1bmlmb3Jtcy5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgc2hhcGU6IGlucHV0LnNoYXBlLFxuICAgICAgICAgICAgdGV4RGF0YTogbnVsbCxcbiAgICAgICAgICAgIGlzVW5pZm9ybTogdHJ1ZSxcbiAgICAgICAgICAgIHVuaWZvcm1WYWx1ZXM6IHRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgaWYgYSBwYWNrZWQgcHJvZ3JhbSdzIGlucHV0cyBoYXZlIG5vdCB5ZXQgYmVlblxuICAgICAgICAvLyB1cGxvYWRlZCB0byB0aGUgR1BVLCB0aGV5IGdldCB1cGxvYWRlZCBhcyBwYWNrZWQgcmlnaHQgb2ZmIHRoZSBiYXQuXG4gICAgICAgIGlmIChwcm9ncmFtLnBhY2tlZElucHV0cykge1xuICAgICAgICAgIHRleERhdGEuaXNQYWNrZWQgPSB0cnVlO1xuICAgICAgICAgIHRleERhdGEuc2hhcGUgPSBpbnB1dC5zaGFwZTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICB0aGlzLnVwbG9hZFRvR1BVKGlucHV0LmRhdGFJZCk7XG4gICAgICBpZiAoISF0ZXhEYXRhLmlzUGFja2VkICE9PSAhIXByb2dyYW0ucGFja2VkSW5wdXRzKSB7XG4gICAgICAgIGlucHV0ID0gdGV4RGF0YS5pc1BhY2tlZCA/IHRoaXMudW5wYWNrVGVuc29yKGlucHV0KSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGFja1RlbnNvcihpbnB1dCk7XG4gICAgICAgIGRhdGFUb0Rpc3Bvc2UucHVzaChpbnB1dCk7XG4gICAgICAgIHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGlucHV0LmRhdGFJZCk7XG4gICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgIHRleERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgICAhd2ViZ2xfdXRpbC5pc1Jlc2hhcGVGcmVlKHRleERhdGEuc2hhcGUsIGlucHV0LnNoYXBlKSkge1xuICAgICAgICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHdoZXJlIGEgdGV4dHVyZSBleGlzdHMgZm9yIGEgdGVuc29yXG4gICAgICAgIC8vIGJ1dCB0aGUgc2hhcGVzIGFyZSBpbmNvbXBhdGlibGUgKGR1ZSB0byBwYWNraW5nIGNvbnN0cmFpbnRzKSBiZWNhdXNlXG4gICAgICAgIC8vIHRoZSB0ZW5zb3IgZGlkIG5vdCBoYXZlIGEgY2hhbmNlIHRvIGdvIHRocm91Z2ggdGhlIHBhY2tlZCByZXNoYXBlXG4gICAgICAgIC8vIHNoYWRlci4gVGhpcyBvbmx5IGhhcHBlbnMgd2hlbiB3ZSByZXNoYXBlIHRoZSAqc2FtZSogdGVuc29yIHRvIGZvcm1cbiAgICAgICAgLy8gKmRpc3RpbmN0KiBpbnB1dHMgdG8gYW4gb3AsIGUuZy4gZG90dGluZyBhIHZlY3RvciB3aXRoIGl0c2VsZi4gVGhpc1xuICAgICAgICAvLyBjYXNlIHdpbGwgZGlzYXBwZWFyIG9uY2UgcGFja2VkIHVwbG9hZGluZyBpcyB0aGUgZGVmYXVsdC5cblxuICAgICAgICBjb25zdCBzYXZlZElucHV0ID0gaW5wdXQ7XG4gICAgICAgIGNvbnN0IHRhcmdldFNoYXBlID0gaW5wdXQuc2hhcGU7XG5cbiAgICAgICAgaW5wdXQuc2hhcGUgPSB0ZXhEYXRhLnNoYXBlO1xuICAgICAgICBpbnB1dCA9IHRoaXMucGFja2VkUmVzaGFwZShpbnB1dCBhcyBUZW5zb3IsIHRhcmdldFNoYXBlKTtcbiAgICAgICAgZGF0YVRvRGlzcG9zZS5wdXNoKGlucHV0KTtcbiAgICAgICAgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICAgICAgICBzYXZlZElucHV0LnNoYXBlID0gdGFyZ2V0U2hhcGU7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB7c2hhcGU6IGlucHV0LnNoYXBlLCB0ZXhEYXRhLCBpc1VuaWZvcm06IGZhbHNlfTtcbiAgICB9KTtcblxuICAgIHRoaXMudXBsb2FkVG9HUFUob3V0cHV0LmRhdGFJZCk7XG4gICAgY29uc3Qgb3V0cHV0RGF0YTpcbiAgICAgICAgVGVuc29yRGF0YSA9IHtzaGFwZTogb3V0cHV0LnNoYXBlLCB0ZXhEYXRhOiBvdXREYXRhLCBpc1VuaWZvcm06IGZhbHNlfTtcbiAgICBjb25zdCBrZXkgPSBncGdwdV9tYXRoLm1ha2VTaGFkZXJLZXkocHJvZ3JhbSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSk7XG4gICAgY29uc3QgYmluYXJ5ID0gdGhpcy5nZXRBbmRTYXZlQmluYXJ5KGtleSwgKCkgPT4ge1xuICAgICAgcmV0dXJuIGdwZ3B1X21hdGguY29tcGlsZVByb2dyYW0oXG4gICAgICAgICAgdGhpcy5ncGdwdSwgcHJvZ3JhbSwgaW5wdXRzRGF0YSwgb3V0cHV0RGF0YSk7XG4gICAgfSk7XG4gICAgY29uc3Qgc2hvdWxkVGltZVByb2dyYW0gPSB0aGlzLmFjdGl2ZVRpbWVycyAhPSBudWxsO1xuICAgIGxldCBxdWVyeTogV2ViR0xRdWVyeXxDUFVUaW1lclF1ZXJ5O1xuICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgcXVlcnkgPSB0aGlzLnN0YXJ0VGltZXIoKTtcbiAgICB9XG5cbiAgICBpZiAoIWVudigpLmdldCgnRU5HSU5FX0NPTVBJTEVfT05MWScpKSB7XG4gICAgICBncGdwdV9tYXRoLnJ1blByb2dyYW0oXG4gICAgICAgICAgdGhpcy5ncGdwdSwgYmluYXJ5LCBpbnB1dHNEYXRhLCBvdXRwdXREYXRhLCBjdXN0b21Vbmlmb3JtVmFsdWVzKTtcbiAgICB9XG5cbiAgICBkYXRhVG9EaXNwb3NlLmZvckVhY2goaW5mbyA9PiB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGluZm8pKTtcblxuICAgIGlmIChzaG91bGRUaW1lUHJvZ3JhbSkge1xuICAgICAgcXVlcnkgPSB0aGlzLmVuZFRpbWVyKHF1ZXJ5KTtcbiAgICAgIHRoaXMuYWN0aXZlVGltZXJzLnB1c2goXG4gICAgICAgICAge25hbWU6IHByb2dyYW0uY29uc3RydWN0b3IubmFtZSwgcXVlcnk6IHRoaXMuZ2V0UXVlcnlUaW1lKHF1ZXJ5KX0pO1xuICAgIH1cblxuICAgIGNvbnN0IGdsRmx1c2hUaHJlc2hvbGQgPSBlbnYoKS5nZXQoJ1dFQkdMX0ZMVVNIX1RIUkVTSE9MRCcpO1xuICAgIC8vIE1hbnVhbGx5IEdMIGZsdXNoIHJlcXVlc3RlZFxuICAgIGlmIChnbEZsdXNoVGhyZXNob2xkID4gMCkge1xuICAgICAgY29uc3QgdGltZSA9IHV0aWwubm93KCk7XG4gICAgICBpZiAoKHRpbWUgLSB0aGlzLmxhc3RHbEZsdXNoVGltZSkgPiBnbEZsdXNoVGhyZXNob2xkKSB7XG4gICAgICAgIHRoaXMuZ3BncHUuZ2wuZmx1c2goKTtcbiAgICAgICAgdGhpcy5sYXN0R2xGbHVzaFRpbWUgPSB0aW1lO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnV0VCR0xfTEFaSUxZX1VOUEFDSycpICYmIG91dERhdGEuaXNQYWNrZWQgJiZcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPT09IGZhbHNlKSB7XG4gICAgICBjb25zdCB1bnBhY2tlZCA9IHRoaXMudW5wYWNrVGVuc29yKG91dHB1dCk7XG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gICAgICByZXR1cm4gdW5wYWNrZWQ7XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICBjb21waWxlQW5kUnVuKFxuICAgICAgcHJvZ3JhbTogR1BHUFVQcm9ncmFtLCBpbnB1dHM6IFRlbnNvckluZm9bXSwgb3V0cHV0RHR5cGU/OiBEYXRhVHlwZSxcbiAgICAgIGN1c3RvbVVuaWZvcm1WYWx1ZXM/OiBudW1iZXJbXVtdLFxuICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQgPSBmYWxzZSk6IFRlbnNvckluZm8ge1xuICAgIG91dHB1dER0eXBlID0gb3V0cHV0RHR5cGUgfHwgaW5wdXRzWzBdLmR0eXBlO1xuICAgIGNvbnN0IG91dEluZm8gPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgICAgcHJvZ3JhbSwgaW5wdXRzLCBvdXRwdXREdHlwZSwgY3VzdG9tVW5pZm9ybVZhbHVlcyxcbiAgICAgICAgcHJldmVudEVhZ2VyVW5wYWNraW5nT2ZPdXRwdXQpO1xuICAgIHJldHVybiBvdXRJbmZvO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRBbmRTYXZlQmluYXJ5KGtleTogc3RyaW5nLCBnZXRCaW5hcnk6ICgpID0+IEdQR1BVQmluYXJ5KTpcbiAgICAgIEdQR1BVQmluYXJ5IHtcbiAgICBpZiAoIShrZXkgaW4gdGhpcy5iaW5hcnlDYWNoZSkpIHtcbiAgICAgIHRoaXMuYmluYXJ5Q2FjaGVba2V5XSA9IGdldEJpbmFyeSgpO1xuICAgIH1cbiAgICByZXR1cm4gdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICB9XG5cbiAgZ2V0VGV4dHVyZU1hbmFnZXIoKTogVGV4dHVyZU1hbmFnZXIge1xuICAgIHJldHVybiB0aGlzLnRleHR1cmVNYW5hZ2VyO1xuICB9XG5cbiAgcHJpdmF0ZSBkaXNwb3NlZCA9IGZhbHNlO1xuXG4gIGRpc3Bvc2UoKSB7XG4gICAgaWYgKHRoaXMuZGlzcG9zZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gQXZvaWQgZGlzcG9zaW5nIHRoZSBjb21waWxlZCB3ZWJnbCBwcm9ncmFtcyBkdXJpbmcgdW5pdCB0ZXN0aW5nIGJlY2F1c2VcbiAgICAvLyBpdCBzbG93cyBkb3duIHRlc3QgZXhlY3V0aW9uLlxuICAgIGlmICghZW52KCkuZ2V0Qm9vbCgnSVNfVEVTVCcpKSB7XG4gICAgICBjb25zdCBhbGxLZXlzID0gT2JqZWN0LmtleXModGhpcy5iaW5hcnlDYWNoZSk7XG4gICAgICBhbGxLZXlzLmZvckVhY2goa2V5ID0+IHtcbiAgICAgICAgdGhpcy5ncGdwdS5kZWxldGVQcm9ncmFtKHRoaXMuYmluYXJ5Q2FjaGVba2V5XS53ZWJHTFByb2dyYW0pO1xuICAgICAgICBkZWxldGUgdGhpcy5iaW5hcnlDYWNoZVtrZXldO1xuICAgICAgfSk7XG4gICAgfVxuICAgIHRoaXMudGV4dHVyZU1hbmFnZXIuZGlzcG9zZSgpO1xuICAgIGlmICh0aGlzLmNhbnZhcyAhPSBudWxsICYmXG4gICAgICAgICh0eXBlb2YgKEhUTUxDYW52YXNFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgICAgIHRoaXMuY2FudmFzIGluc3RhbmNlb2YgSFRNTENhbnZhc0VsZW1lbnQpKSB7XG4gICAgICB0aGlzLmNhbnZhcy5yZW1vdmUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYW52YXMgPSBudWxsO1xuICAgIH1cbiAgICBpZiAodGhpcy5ncGdwdUNyZWF0ZWRMb2NhbGx5KSB7XG4gICAgICB0aGlzLmdwZ3B1LnByb2dyYW0gPSBudWxsO1xuICAgICAgdGhpcy5ncGdwdS5kaXNwb3NlKCk7XG4gICAgfVxuICAgIHRoaXMuZGlzcG9zZWQgPSB0cnVlO1xuICB9XG5cbiAgZmxvYXRQcmVjaXNpb24oKTogMTZ8MzIge1xuICAgIGlmICh0aGlzLmZsb2F0UHJlY2lzaW9uVmFsdWUgPT0gbnVsbCkge1xuICAgICAgdGhpcy5mbG9hdFByZWNpc2lvblZhbHVlID0gdGlkeSgoKSA9PiB7XG4gICAgICAgIGlmICghZW52KCkuZ2V0KCdXRUJHTF9SRU5ERVJfRkxPQVQzMl9FTkFCTEVEJykpIHtcbiAgICAgICAgICAvLyBNb21lbnRhcmlseSBzd2l0Y2hpbmcgREVCVUcgZmxhZyB0byBmYWxzZSBzbyB3ZSBkb24ndCB0aHJvdyBhblxuICAgICAgICAgIC8vIGVycm9yIHRyeWluZyB0byB1cGxvYWQgYSBzbWFsbCB2YWx1ZS5cbiAgICAgICAgICBjb25zdCBkZWJ1Z0ZsYWcgPSBlbnYoKS5nZXRCb29sKCdERUJVRycpO1xuICAgICAgICAgIGVudigpLnNldCgnREVCVUcnLCBmYWxzZSk7XG4gICAgICAgICAgY29uc3QgdW5kZXJmbG93Q2hlY2tWYWx1ZSA9IHRoaXMuYWJzKHNjYWxhcigxZS04KSkuZGF0YVN5bmMoKVswXTtcbiAgICAgICAgICBlbnYoKS5zZXQoJ0RFQlVHJywgZGVidWdGbGFnKTtcblxuICAgICAgICAgIGlmICh1bmRlcmZsb3dDaGVja1ZhbHVlID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIDMyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gMTY7XG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmxvYXRQcmVjaXNpb25WYWx1ZTtcbiAgfVxuXG4gIC8qKiBSZXR1cm5zIHRoZSBzbWFsbGVzdCByZXByZXNlbnRhYmxlIG51bWJlci4gICovXG4gIGVwc2lsb24oKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5mbG9hdFByZWNpc2lvbigpID09PSAzMiA/IEVQU0lMT05fRkxPQVQzMiA6IEVQU0lMT05fRkxPQVQxNjtcbiAgfVxuXG4gIHVwbG9hZFRvR1BVKGRhdGFJZDogRGF0YUlkKTogdm9pZCB7XG4gICAgY29uc3QgdGV4RGF0YSA9IHRoaXMudGV4RGF0YS5nZXQoZGF0YUlkKTtcbiAgICBjb25zdCB7c2hhcGUsIGR0eXBlLCB2YWx1ZXMsIHRleHR1cmUsIHVzYWdlLCBpc1BhY2tlZH0gPSB0ZXhEYXRhO1xuXG4gICAgaWYgKHRleHR1cmUgIT0gbnVsbCkge1xuICAgICAgLy8gQXJyYXkgaXMgYWxyZWFkeSBvbiBHUFUuIE5vLW9wLlxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBzaG91bGRUaW1lUHJvZ3JhbSA9IHRoaXMuYWN0aXZlVGltZXJzICE9IG51bGw7XG4gICAgbGV0IHN0YXJ0OiBudW1iZXI7XG4gICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICBzdGFydCA9IHV0aWwubm93KCk7XG4gICAgfVxuXG4gICAgbGV0IHRleFNoYXBlID0gdGV4RGF0YS50ZXhTaGFwZTtcbiAgICBpZiAodGV4U2hhcGUgPT0gbnVsbCkge1xuICAgICAgLy8gVGhpcyB0ZXhTaGFwZSBtYXkgbm90IGJlIHRoZSBmaW5hbCB0ZXh0dXJlIHNoYXBlLiBGb3IgcGFja2VkIG9yIGRlbnNlXG4gICAgICAvLyB0ZXh0dXJlcywgdGhlIHRleFNoYXBlIHdpbGwgYmUgY2hhbmdlZCB3aGVuIHRleHR1cmVzIGFyZSBjcmVhdGVkLlxuICAgICAgdGV4U2hhcGUgPSB3ZWJnbF91dGlsLmdldFRleHR1cmVTaGFwZUZyb21Mb2dpY2FsU2hhcGUoc2hhcGUsIGlzUGFja2VkKTtcbiAgICAgIHRleERhdGEudGV4U2hhcGUgPSB0ZXhTaGFwZTtcbiAgICB9XG5cbiAgICBpZiAodmFsdWVzICE9IG51bGwpIHtcbiAgICAgIGNvbnN0IHNoYXBlQXMzRCA9IHdlYmdsX3V0aWwuZ2V0U2hhcGVBczNEKHNoYXBlKTtcblxuICAgICAgbGV0IHByb2dyYW07XG4gICAgICBsZXQgd2lkdGggPSB0ZXhTaGFwZVsxXSwgaGVpZ2h0ID0gdGV4U2hhcGVbMF07XG4gICAgICBjb25zdCBpc0J5dGVBcnJheSA9XG4gICAgICAgICAgdmFsdWVzIGluc3RhbmNlb2YgVWludDhBcnJheSB8fCB2YWx1ZXMgaW5zdGFuY2VvZiBVaW50OENsYW1wZWRBcnJheTtcblxuICAgICAgLy8gdGV4dHVyZSBmb3IgZmxvYXQgYXJyYXkgaXMgUGh5c2ljYWxUZXh0dXJlVHlwZS5QQUNLRURfMlgyX0ZMT0FUMzIsIHdlXG4gICAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgdXBsb2FkIHVzZXMgdGhlIHNhbWUgcGFja2VkIHNpemVcbiAgICAgIGlmIChpc1BhY2tlZCB8fCAhaXNCeXRlQXJyYXkpIHtcbiAgICAgICAgW3dpZHRoLCBoZWlnaHRdID0gdGV4X3V0aWwuZ2V0UGFja2VkTWF0cml4VGV4dHVyZVNoYXBlV2lkdGhIZWlnaHQoXG4gICAgICAgICAgICB0ZXhTaGFwZVswXSwgdGV4U2hhcGVbMV0pO1xuICAgICAgfVxuXG4gICAgICBpZiAoaXNQYWNrZWQpIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBFbmNvZGVNYXRyaXhQYWNrZWRQcm9ncmFtKHNoYXBlQXMzRCwgaXNCeXRlQXJyYXkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IG5ldyBFbmNvZGVNYXRyaXhQcm9ncmFtKHNoYXBlQXMzRCwgaXNCeXRlQXJyYXkpO1xuICAgICAgfVxuXG4gICAgICAvLyBUZXhTaGFwZSBmb3IgZmxvYXQgYXJyYXkgbmVlZHMgdG8gYmUgdGhlIG9yaWdpbmFsIHNoYXBlLCB3aGljaCBieXRlXG4gICAgICAvLyBhcnJheSBuZWVkcyB0byBiZSBwYWNrZWQgc2l6ZS4gVGhpcyBhbGxvdyB0aGUgZGF0YSB1cGxvYWQgc2hhcGUgdG8gYmVcbiAgICAgIC8vIG1hdGNoZWQgd2l0aCB0ZXh0dXJlIGNyZWF0aW9uIGxvZ2ljLlxuICAgICAgY29uc3QgdGVtcERlbnNlSW5wdXRUZXhTaGFwZTogW251bWJlciwgbnVtYmVyXSA9XG4gICAgICAgICAgaXNCeXRlQXJyYXkgPyBbaGVpZ2h0LCB3aWR0aF0gOiB0ZXhTaGFwZTtcbiAgICAgIGNvbnN0IHRlbXBEZW5zZUlucHV0SGFuZGxlID1cbiAgICAgICAgICB0aGlzLm1ha2VUZW5zb3JJbmZvKHRlbXBEZW5zZUlucHV0VGV4U2hhcGUsIGR0eXBlKTtcbiAgICAgIGNvbnN0IHRlbXBEZW5zZUlucHV0VGV4RGF0YSA9XG4gICAgICAgICAgdGhpcy50ZXhEYXRhLmdldCh0ZW1wRGVuc2VJbnB1dEhhbmRsZS5kYXRhSWQpO1xuICAgICAgaWYgKGlzQnl0ZUFycmF5KSB7XG4gICAgICAgIHRlbXBEZW5zZUlucHV0VGV4RGF0YS51c2FnZSA9IFRleHR1cmVVc2FnZS5QSVhFTFM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0ZW1wRGVuc2VJbnB1dFRleERhdGEudXNhZ2UgPSBUZXh0dXJlVXNhZ2UuVVBMT0FEO1xuICAgICAgfVxuICAgICAgdGVtcERlbnNlSW5wdXRUZXhEYXRhLnRleFNoYXBlID0gdGVtcERlbnNlSW5wdXRUZXhTaGFwZTtcbiAgICAgIHRoaXMuZ3BncHUudXBsb2FkRGVuc2VNYXRyaXhUb1RleHR1cmUoXG4gICAgICAgICAgdGhpcy5nZXRUZXh0dXJlKHRlbXBEZW5zZUlucHV0SGFuZGxlLmRhdGFJZCksIHdpZHRoLCBoZWlnaHQsXG4gICAgICAgICAgdmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xuXG4gICAgICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW2hlaWdodCwgd2lkdGhdXTtcbiAgICAgIC8vIFdlIHdhbnQgdGhlIG91dHB1dCB0byByZW1haW4gcGFja2VkIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mXG4gICAgICAvLyBXRUJHTF9QQUNLLlxuICAgICAgY29uc3QgcHJldmVudEVhZ2VyVW5wYWNraW5nID0gdHJ1ZTtcbiAgICAgIGNvbnN0IGVuY29kZWRPdXRwdXRUYXJnZXQgPSB0aGlzLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgICAgICBwcm9ncmFtLCBbdGVtcERlbnNlSW5wdXRIYW5kbGVdLCBkdHlwZSwgY3VzdG9tVmFsdWVzLFxuICAgICAgICAgIHByZXZlbnRFYWdlclVucGFja2luZyk7XG5cbiAgICAgIC8vIEhhdmUgdGhlIG9yaWdpbmFsIHRleHR1cmUgYXNzdW1lIHRoZSBpZGVudGl0eSBvZiB0aGUgZW5jb2RlZCBvdXRwdXQuXG4gICAgICBjb25zdCBvdXRwdXRUZXhEYXRhID0gdGhpcy50ZXhEYXRhLmdldChlbmNvZGVkT3V0cHV0VGFyZ2V0LmRhdGFJZCk7XG4gICAgICB0ZXhEYXRhLnRleFNoYXBlID0gb3V0cHV0VGV4RGF0YS50ZXhTaGFwZTtcbiAgICAgIHRleERhdGEuaXNQYWNrZWQgPSBvdXRwdXRUZXhEYXRhLmlzUGFja2VkO1xuICAgICAgdGV4RGF0YS51c2FnZSA9IG91dHB1dFRleERhdGEudXNhZ2U7XG5cbiAgICAgIGlmICghZW52KCkuZ2V0KCdFTkdJTkVfQ09NUElMRV9PTkxZJykpIHtcbiAgICAgICAgdGV4RGF0YS50ZXh0dXJlID0gb3V0cHV0VGV4RGF0YS50ZXh0dXJlO1xuICAgICAgICAvLyBPbmNlIHVwbG9hZGVkLCBkb24ndCBzdG9yZSB0aGUgdmFsdWVzIG9uIGNwdS5cbiAgICAgICAgdGV4RGF0YS52YWx1ZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnRleERhdGEuZGVsZXRlKGVuY29kZWRPdXRwdXRUYXJnZXQuZGF0YUlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZGlzcG9zZURhdGEoZW5jb2RlZE91dHB1dFRhcmdldC5kYXRhSWQpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbXBEZW5zZUlucHV0SGFuZGxlKTtcblxuICAgICAgaWYgKHNob3VsZFRpbWVQcm9ncmFtKSB7XG4gICAgICAgIHRoaXMudXBsb2FkV2FpdE1zICs9IHV0aWwubm93KCkgLSBzdGFydDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmV3VGV4dHVyZSA9IHRoaXMuYWNxdWlyZVRleHR1cmUodGV4U2hhcGUsIHVzYWdlLCBkdHlwZSwgaXNQYWNrZWQpO1xuICAgICAgdGV4RGF0YS50ZXh0dXJlID0gbmV3VGV4dHVyZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGNvbnZlcnRBbmRDYWNoZU9uQ1BVKGRhdGFJZDogRGF0YUlkLCBmbG9hdDMyVmFsdWVzPzogRmxvYXQzMkFycmF5KTpcbiAgICAgIFR5cGVkQXJyYXkge1xuICAgIGNvbnN0IHRleERhdGEgPSB0aGlzLnRleERhdGEuZ2V0KGRhdGFJZCk7XG4gICAgY29uc3Qge2R0eXBlfSA9IHRleERhdGE7XG5cbiAgICB0aGlzLnJlbGVhc2VHUFVEYXRhKGRhdGFJZCk7XG5cbiAgICBpZiAoZmxvYXQzMlZhbHVlcyAhPSBudWxsKSB7XG4gICAgICB0ZXhEYXRhLnZhbHVlcyA9IGZsb2F0MzJUb1R5cGVkQXJyYXkoZmxvYXQzMlZhbHVlcywgZHR5cGUgYXMgJ2Zsb2F0MzInKTtcbiAgICB9XG4gICAgcmV0dXJuIHRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gIH1cblxuICBwcml2YXRlIGFjcXVpcmVUZXh0dXJlKFxuICAgICAgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sIHRleFR5cGU6IFRleHR1cmVVc2FnZSwgZHR5cGU6IERhdGFUeXBlLFxuICAgICAgaXNQYWNrZWQ6IGJvb2xlYW4pOiBUZXh0dXJlIHtcbiAgICB0aGlzLm51bUJ5dGVzSW5HUFUgKz0gdGhpcy5jb21wdXRlQnl0ZXModGV4U2hhcGUsIGR0eXBlKTtcbiAgICBpZiAoIXRoaXMud2FybmVkQWJvdXRNZW1vcnkgJiZcbiAgICAgICAgdGhpcy5udW1CeXRlc0luR1BVID4gdGhpcy5udW1NQkJlZm9yZVdhcm5pbmcgKiAxMDI0ICogMTAyNCkge1xuICAgICAgY29uc3QgbWIgPSAodGhpcy5udW1CeXRlc0luR1BVIC8gMTAyNCAvIDEwMjQpLnRvRml4ZWQoMik7XG4gICAgICB0aGlzLndhcm5lZEFib3V0TWVtb3J5ID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgICBgSGlnaCBtZW1vcnkgdXNhZ2UgaW4gR1BVOiAke21ifSBNQiwgYCArXG4gICAgICAgICAgYG1vc3QgbGlrZWx5IGR1ZSB0byBhIG1lbW9yeSBsZWFrYCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLnRleHR1cmVNYW5hZ2VyLmFjcXVpcmVUZXh0dXJlKHRleFNoYXBlLCB0ZXhUeXBlLCBpc1BhY2tlZCk7XG4gIH1cblxuICBwcml2YXRlIGNvbXB1dGVCeXRlcyhzaGFwZTogW251bWJlciwgbnVtYmVyXSwgZHR5cGU6IERhdGFUeXBlKSB7XG4gICAgcmV0dXJuIHNoYXBlWzBdICogc2hhcGVbMV0gKiB1dGlsLmJ5dGVzUGVyRWxlbWVudChkdHlwZSk7XG4gIH1cblxuICBjaGVja0NvbXBpbGVDb21wbGV0aW9uKCkge1xuICAgIGZvciAoY29uc3QgWywgYmluYXJ5XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmJpbmFyeUNhY2hlKSkge1xuICAgICAgdGhpcy5jaGVja0NvbXBsZXRpb25fKGJpbmFyeSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgY2hlY2tDb21waWxlQ29tcGxldGlvbkFzeW5jKCk6IFByb21pc2U8Ym9vbGVhbltdPiB7XG4gICAgY29uc3QgcHMgPSBbXTtcbiAgICBpZiAodGhpcy5ncGdwdS5wYXJhbGxlbENvbXBpbGF0aW9uRXh0ZW5zaW9uKSB7XG4gICAgICBmb3IgKGNvbnN0IFssIGJpbmFyeV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5iaW5hcnlDYWNoZSkpIHtcbiAgICAgICAgcHMucHVzaCh0aGlzLmNoZWNrQ29tcGxldGlvbkFzeW5jXyhiaW5hcnkpKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgWywgYmluYXJ5XSBvZiBPYmplY3QuZW50cmllcyh0aGlzLmJpbmFyeUNhY2hlKSkge1xuICAgICAgICBjb25zdCBwOiBQcm9taXNlPGJvb2xlYW4+ID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5jaGVja0NvbXBsZXRpb25fKGJpbmFyeSk7XG4gICAgICAgICAgICByZXNvbHZlKHRydWUpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBwcy5wdXNoKHApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHBzKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIGNoZWNrQ29tcGxldGlvbkFzeW5jXyhiaW5hcnk6IEdQR1BVQmluYXJ5KTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuZ3BncHUuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihcbiAgICAgICAgICAgIGJpbmFyeS53ZWJHTFByb2dyYW0sXG4gICAgICAgICAgICB0aGlzLmdwZ3B1LnBhcmFsbGVsQ29tcGlsYXRpb25FeHRlbnNpb24uQ09NUExFVElPTl9TVEFUVVNfS0hSKSkge1xuICAgICAgcmV0dXJuIHRoaXMuY2hlY2tDb21wbGV0aW9uXyhiaW5hcnkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhd2FpdCBuZXh0RnJhbWUoKTtcbiAgICAgIHJldHVybiB0aGlzLmNoZWNrQ29tcGxldGlvbkFzeW5jXyhiaW5hcnkpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2hlY2tDb21wbGV0aW9uXyhiaW5hcnk6IEdQR1BVQmluYXJ5KTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuZ3BncHUuZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlcihcbiAgICAgICAgICAgIGJpbmFyeS53ZWJHTFByb2dyYW0sIHRoaXMuZ3BncHUuZ2wuTElOS19TVEFUVVMpID09PSBmYWxzZSkge1xuICAgICAgY29uc29sZS5sb2codGhpcy5ncGdwdS5nbC5nZXRQcm9ncmFtSW5mb0xvZyhiaW5hcnkud2ViR0xQcm9ncmFtKSk7XG4gICAgICBpZiAodGhpcy5ncGdwdS5nbC5nZXRTaGFkZXJQYXJhbWV0ZXIoXG4gICAgICAgICAgICAgIGJpbmFyeS5mcmFnbWVudFNoYWRlciwgdGhpcy5ncGdwdS5nbC5DT01QSUxFX1NUQVRVUykgPT09IGZhbHNlKSB7XG4gICAgICAgIHdlYmdsX3V0aWwubG9nU2hhZGVyU291cmNlQW5kSW5mb0xvZyhcbiAgICAgICAgICAgIGJpbmFyeS5zb3VyY2UsXG4gICAgICAgICAgICB0aGlzLmdwZ3B1LmdsLmdldFNoYWRlckluZm9Mb2coYmluYXJ5LmZyYWdtZW50U2hhZGVyKSk7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRmFpbGVkIHRvIGNvbXBpbGUgZnJhZ21lbnQgc2hhZGVyLicpO1xuICAgICAgfVxuICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gbGluayB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuJyk7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgZ2V0VW5pZm9ybUxvY2F0aW9ucygpIHtcbiAgICBmb3IgKGNvbnN0IFssIGJpbmFyeV0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5iaW5hcnlDYWNoZSkpIHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgdW5pZm9ybUxvY2F0aW9ucyxcbiAgICAgICAgY3VzdG9tVW5pZm9ybUxvY2F0aW9ucyxcbiAgICAgICAgaW5mTG9jLFxuICAgICAgICBuYW5Mb2MsXG4gICAgICAgIGluU2hhcGVzTG9jYXRpb25zLFxuICAgICAgICBpblRleFNoYXBlc0xvY2F0aW9ucyxcbiAgICAgICAgb3V0U2hhcGVMb2NhdGlvbixcbiAgICAgICAgb3V0U2hhcGVTdHJpZGVzTG9jYXRpb24sXG4gICAgICAgIG91dFRleFNoYXBlTG9jYXRpb25cbiAgICAgIH0gPSBnZXRVbmlmb3JtTG9jYXRpb25zKHRoaXMuZ3BncHUsIGJpbmFyeS5wcm9ncmFtLCBiaW5hcnkud2ViR0xQcm9ncmFtKTtcbiAgICAgIGJpbmFyeS51bmlmb3JtTG9jYXRpb25zID0gdW5pZm9ybUxvY2F0aW9ucztcbiAgICAgIGJpbmFyeS5jdXN0b21Vbmlmb3JtTG9jYXRpb25zID0gY3VzdG9tVW5pZm9ybUxvY2F0aW9ucztcbiAgICAgIGJpbmFyeS5pbmZMb2MgPSBpbmZMb2M7XG4gICAgICBiaW5hcnkubmFuTG9jID0gbmFuTG9jO1xuICAgICAgYmluYXJ5LmluU2hhcGVzTG9jYXRpb25zID0gaW5TaGFwZXNMb2NhdGlvbnM7XG4gICAgICBiaW5hcnkuaW5UZXhTaGFwZXNMb2NhdGlvbnMgPSBpblRleFNoYXBlc0xvY2F0aW9ucztcbiAgICAgIGJpbmFyeS5vdXRTaGFwZUxvY2F0aW9uID0gb3V0U2hhcGVMb2NhdGlvbjtcbiAgICAgIGJpbmFyeS5vdXRTaGFwZVN0cmlkZXNMb2NhdGlvbiA9IG91dFNoYXBlU3RyaWRlc0xvY2F0aW9uO1xuICAgICAgYmluYXJ5Lm91dFRleFNoYXBlTG9jYXRpb24gPSBvdXRUZXhTaGFwZUxvY2F0aW9uO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBmbG9hdDMyVG9UeXBlZEFycmF5PEQgZXh0ZW5kcyBOdW1lcmljRGF0YVR5cGU+KFxuICAgIGE6IEZsb2F0MzJBcnJheSwgZHR5cGU6IEQpOiB0Zi5EYXRhVHlwZU1hcFtEXSB7XG4gIGlmIChkdHlwZSA9PT0gJ2Zsb2F0MzInIHx8IGR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIHJldHVybiBhIGFzIHRmLkRhdGFUeXBlTWFwW0RdO1xuICB9IGVsc2UgaWYgKGR0eXBlID09PSAnaW50MzInIHx8IGR0eXBlID09PSAnYm9vbCcpIHtcbiAgICBjb25zdCByZXN1bHQgPSAoZHR5cGUgPT09ICdpbnQzMicpID8gbmV3IEludDMyQXJyYXkoYS5sZW5ndGgpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVpbnQ4QXJyYXkoYS5sZW5ndGgpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgKytpKSB7XG4gICAgICByZXN1bHRbaV0gPSBNYXRoLnJvdW5kKGFbaV0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0IGFzIHRmLkRhdGFUeXBlTWFwW0RdO1xuICB9IGVsc2Uge1xuICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBkdHlwZSAke2R0eXBlfWApO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google Inc. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\n// base.ts is the webgl backend without auto kernel registration.\nimport { device_util, registerBackend } from '@tensorflow/tfjs-core';\nimport { MathBackendWebGL } from './backend_webgl';\nexport { version as version_webgl } from './version';\nif (device_util.isBrowser()) {\n    registerBackend('webgl', () => new MathBackendWebGL(), 2 /* priority */);\n}\n// Export webgl utilities\nexport * from './webgl';\n// Export forceHalfFlost under webgl namespace for the union bundle.\nimport { forceHalfFloat } from './webgl';\nexport const webgl = { forceHalfFloat };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxpRUFBaUU7QUFFakUsT0FBTyxFQUFDLFdBQVcsRUFBRSxlQUFlLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNqRCxPQUFPLEVBQUMsT0FBTyxJQUFJLGFBQWEsRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVuRCxJQUFJLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRTtJQUMzQixlQUFlLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksZ0JBQWdCLEVBQUUsRUFBRSxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7Q0FDMUU7QUFFRCx5QkFBeUI7QUFDekIsY0FBYyxTQUFTLENBQUM7QUFFeEIsb0VBQW9FO0FBQ3BFLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUMsY0FBYyxFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbi8vIGJhc2UudHMgaXMgdGhlIHdlYmdsIGJhY2tlbmQgd2l0aG91dCBhdXRvIGtlcm5lbCByZWdpc3RyYXRpb24uXG5cbmltcG9ydCB7ZGV2aWNlX3V0aWwsIHJlZ2lzdGVyQmFja2VuZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi9iYWNrZW5kX3dlYmdsJztcbmV4cG9ydCB7dmVyc2lvbiBhcyB2ZXJzaW9uX3dlYmdsfSBmcm9tICcuL3ZlcnNpb24nO1xuXG5pZiAoZGV2aWNlX3V0aWwuaXNCcm93c2VyKCkpIHtcbiAgcmVnaXN0ZXJCYWNrZW5kKCd3ZWJnbCcsICgpID0+IG5ldyBNYXRoQmFja2VuZFdlYkdMKCksIDIgLyogcHJpb3JpdHkgKi8pO1xufVxuXG4vLyBFeHBvcnQgd2ViZ2wgdXRpbGl0aWVzXG5leHBvcnQgKiBmcm9tICcuL3dlYmdsJztcblxuLy8gRXhwb3J0IGZvcmNlSGFsZkZsb3N0IHVuZGVyIHdlYmdsIG5hbWVzcGFjZSBmb3IgdGhlIHVuaW9uIGJ1bmRsZS5cbmltcG9ydCB7Zm9yY2VIYWxmRmxvYXR9IGZyb20gJy4vd2ViZ2wnO1xuZXhwb3J0IGNvbnN0IHdlYmdsID0ge2ZvcmNlSGFsZkZsb2F0fTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { useShapeUniforms } from './gpgpu_math';\nexport const CHECK_NAN_SNIPPET = `\n  if (isnan(a)) return a;\n  if (isnan(b)) return b;\n`;\nexport const SQUARED_DIFFERENCE = 'return (a - b) * (a - b);';\nexport class BinaryOpProgram {\n    constructor(op, aShape, bShape) {\n        this.variableNames = ['A', 'B'];\n        this.outputShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        this.userCode = `\n      float binaryOperation(float a, float b) {\n        ${op}\n      }\n\n      void main() {\n        float a = getAAtOutCoords();\n        float b = getBAtOutCoords();\n        setOutput(binaryOperation(a, b));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5b3BfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9iaW5hcnlvcF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRW5ELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRzs7O0NBR2hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUM5RCxNQUFNLE9BQU8sZUFBZTtJQU0xQixZQUFZLEVBQVUsRUFBRSxNQUFnQixFQUFFLE1BQWdCO1FBTDFELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFNekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNFLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsRUFBRTs7Ozs7Ozs7S0FRUCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVCA9IGBcbiAgaWYgKGlzbmFuKGEpKSByZXR1cm4gYTtcbiAgaWYgKGlzbmFuKGIpKSByZXR1cm4gYjtcbmA7XG5cbmV4cG9ydCBjb25zdCBTUVVBUkVEX0RJRkZFUkVOQ0UgPSAncmV0dXJuIChhIC0gYikgKiAoYSAtIGIpOyc7XG5leHBvcnQgY2xhc3MgQmluYXJ5T3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQScsICdCJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihvcDogc3RyaW5nLCBhU2hhcGU6IG51bWJlcltdLCBiU2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZShhU2hhcGUsIGJTaGFwZSk7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wZXJhdGlvbihmbG9hdCBhLCBmbG9hdCBiKSB7XG4gICAgICAgICR7b3B9XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgYSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBiID0gZ2V0QkF0T3V0Q29vcmRzKCk7XG4gICAgICAgIHNldE91dHB1dChiaW5hcnlPcGVyYXRpb24oYSwgYikpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { useShapeUniforms } from './gpgpu_math';\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport const CHECK_NAN_SNIPPET_PACKED = `\n  result.r = isNaN.r ? NAN : result.r;\n  result.g = isNaN.g ? NAN : result.g;\n  result.b = isNaN.b ? NAN : result.b;\n  result.a = isNaN.a ? NAN : result.a;\n`;\nexport const ELU_DER = `\n  vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n  return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n`;\nexport const NOT_EQUAL = `\n  return vec4(notEqual(a, b));\n`;\nexport class BinaryOpPackedProgram {\n    constructor(op, aShape, bShape, checkOutOfBounds = false) {\n        this.variableNames = ['A', 'B'];\n        this.supportsBroadcasting = true;\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n        const rank = this.outputShape.length;\n        this.enableShapeUniforms = useShapeUniforms(rank);\n        let checkOutOfBoundsString = '';\n        if (checkOutOfBounds) {\n            if (rank === 0 || util.sizeFromShape(this.outputShape) === 1) {\n                checkOutOfBoundsString = `\n          result.y = 0.;\n          result.z = 0.;\n          result.w = 0.;\n        `;\n            }\n            else {\n                const dtype = getCoordsDataType(rank);\n                checkOutOfBoundsString = `\n          ${dtype} coords = getOutputCoords();\n        `;\n                if (rank === 1) {\n                    if (this.enableShapeUniforms) {\n                        checkOutOfBoundsString += `\n            result.y = (coords + 1) >= outShape ? 0. : result.y;\n            result.z = 0.;\n            result.w = 0.;\n          `;\n                    }\n                    else {\n                        checkOutOfBoundsString += `\n            result.y = (coords + 1) >= ${this.outputShape[0]} ? 0. : result.y;\n            result.z = 0.;\n            result.w = 0.;\n          `;\n                    }\n                }\n                else {\n                    const channels = getChannels('coords', rank);\n                    if (this.enableShapeUniforms) {\n                        checkOutOfBoundsString += `\n            bool nextRowOutOfBounds =\n              (${channels[rank - 2]} + 1) >= outShape[${rank} - 2];\n            bool nextColOutOfBounds =\n              (${channels[rank - 1]} + 1) >= outShape[${rank} - 1];\n            result.y = nextColOutOfBounds ? 0. : result.y;\n            result.z = nextRowOutOfBounds ? 0. : result.z;\n            result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n          `;\n                    }\n                    else {\n                        checkOutOfBoundsString += `\n            bool nextRowOutOfBounds =\n              (${channels[rank - 2]} + 1) >= ${this.outputShape[rank - 2]};\n            bool nextColOutOfBounds =\n              (${channels[rank - 1]} + 1) >= ${this.outputShape[rank - 1]};\n            result.y = nextColOutOfBounds ? 0. : result.y;\n            result.z = nextRowOutOfBounds ? 0. : result.z;\n            result.w = nextColOutOfBounds || nextRowOutOfBounds ? 0. : result.w;\n          `;\n                    }\n                }\n            }\n        }\n        this.userCode = `\n      vec4 binaryOperation(vec4 a, vec4 b) {\n        ${op}\n      }\n\n      void main() {\n        vec4 a = getAAtOutCoords();\n        vec4 b = getBAtOutCoords();\n\n        vec4 result = binaryOperation(a, b);\n        ${checkOutOfBoundsString}\n\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5b3BfcGFja2VkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYmluYXJ5b3BfcGFja2VkX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXpELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUM1RCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUc7Ozs7O0NBS3ZDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUc7OztDQUd0QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFHOztDQUV4QixDQUFDO0FBRUYsTUFBTSxPQUFPLHFCQUFxQjtJQVNoQyxZQUNJLEVBQVUsRUFBRSxNQUFnQixFQUFFLE1BQWdCLEVBQzlDLGdCQUFnQixHQUFHLEtBQUs7UUFWNUIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUczQix5QkFBb0IsR0FBRyxJQUFJLENBQUM7UUFDNUIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFNbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQzNFLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsRCxJQUFJLHNCQUFzQixHQUFHLEVBQUUsQ0FBQztRQUNoQyxJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLElBQUksSUFBSSxLQUFLLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQUU7Z0JBQzVELHNCQUFzQixHQUFHOzs7O1NBSXhCLENBQUM7YUFDSDtpQkFBTTtnQkFDTCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztnQkFDdEMsc0JBQXNCLEdBQUc7WUFDckIsS0FBSztTQUNSLENBQUM7Z0JBQ0YsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO29CQUNkLElBQUksSUFBSSxDQUFDLG1CQUFtQixFQUFFO3dCQUM1QixzQkFBc0IsSUFBSTs7OztXQUkzQixDQUFDO3FCQUNEO3lCQUFNO3dCQUNMLHNCQUFzQixJQUFJO3lDQUNHLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDOzs7V0FHakQsQ0FBQztxQkFDRDtpQkFDRjtxQkFBTTtvQkFDTCxNQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUM3QyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsRUFBRTt3QkFDNUIsc0JBQXNCLElBQUk7O2lCQUVyQixRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxxQkFBcUIsSUFBSTs7aUJBRTNDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLHFCQUFxQixJQUFJOzs7O1dBSWpELENBQUM7cUJBQ0Q7eUJBQU07d0JBQ0wsc0JBQXNCLElBQUk7O2lCQUVyQixRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxZQUFZLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzs7aUJBRXhELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFlBQVksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOzs7O1dBSTlELENBQUM7cUJBQ0Q7aUJBQ0Y7YUFDRjtTQUNGO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixFQUFFOzs7Ozs7OztVQVFGLHNCQUFzQjs7OztLQUkzQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVF9QQUNLRUQgPSBgXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IE5BTiA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyBOQU4gOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8gTkFOIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IE5BTiA6IHJlc3VsdC5hO1xuYDtcblxuZXhwb3J0IGNvbnN0IEVMVV9ERVIgPSBgXG4gIHZlYzQgYkdURVplcm8gPSB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYiwgdmVjNCgwLikpKTtcbiAgcmV0dXJuIChiR1RFWmVybyAqIGEpICsgKCh2ZWM0KDEuMCkgLSBiR1RFWmVybykgKiAoYSAqIChiICsgdmVjNCgxLjApKSkpO1xuYDtcblxuZXhwb3J0IGNvbnN0IE5PVF9FUVVBTCA9IGBcbiAgcmV0dXJuIHZlYzQobm90RXF1YWwoYSwgYikpO1xuYDtcblxuZXhwb3J0IGNsYXNzIEJpbmFyeU9wUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnLCAnQiddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHN1cHBvcnRzQnJvYWRjYXN0aW5nID0gdHJ1ZTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIG9wOiBzdHJpbmcsIGFTaGFwZTogbnVtYmVyW10sIGJTaGFwZTogbnVtYmVyW10sXG4gICAgICBjaGVja091dE9mQm91bmRzID0gZmFsc2UpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKGFTaGFwZSwgYlNoYXBlKTtcbiAgICBjb25zdCByYW5rID0gdGhpcy5vdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3JtcyhyYW5rKTtcbiAgICBsZXQgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9ICcnO1xuICAgIGlmIChjaGVja091dE9mQm91bmRzKSB7XG4gICAgICBpZiAocmFuayA9PT0gMCB8fCB1dGlsLnNpemVGcm9tU2hhcGUodGhpcy5vdXRwdXRTaGFwZSkgPT09IDEpIHtcbiAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyA9IGBcbiAgICAgICAgICByZXN1bHQueSA9IDAuO1xuICAgICAgICAgIHJlc3VsdC56ID0gMC47XG4gICAgICAgICAgcmVzdWx0LncgPSAwLjtcbiAgICAgICAgYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG4gICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNTdHJpbmcgPSBgXG4gICAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGA7XG4gICAgICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyArPSBgXG4gICAgICAgICAgICByZXN1bHQueSA9IChjb29yZHMgKyAxKSA+PSBvdXRTaGFwZSA/IDAuIDogcmVzdWx0Lnk7XG4gICAgICAgICAgICByZXN1bHQueiA9IDAuO1xuICAgICAgICAgICAgcmVzdWx0LncgPSAwLjtcbiAgICAgICAgICBgO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGVja091dE9mQm91bmRzU3RyaW5nICs9IGBcbiAgICAgICAgICAgIHJlc3VsdC55ID0gKGNvb3JkcyArIDEpID49ICR7dGhpcy5vdXRwdXRTaGFwZVswXX0gPyAwLiA6IHJlc3VsdC55O1xuICAgICAgICAgICAgcmVzdWx0LnogPSAwLjtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gMC47XG4gICAgICAgICAgYDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG4gICAgICAgICAgaWYgKHRoaXMuZW5hYmxlU2hhcGVVbmlmb3Jtcykge1xuICAgICAgICAgICAgY2hlY2tPdXRPZkJvdW5kc1N0cmluZyArPSBgXG4gICAgICAgICAgICBib29sIG5leHRSb3dPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxKSA+PSBvdXRTaGFwZVske3Jhbmt9IC0gMl07XG4gICAgICAgICAgICBib29sIG5leHRDb2xPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAxXX0gKyAxKSA+PSBvdXRTaGFwZVske3Jhbmt9IC0gMV07XG4gICAgICAgICAgICByZXN1bHQueSA9IG5leHRDb2xPdXRPZkJvdW5kcyA/IDAuIDogcmVzdWx0Lnk7XG4gICAgICAgICAgICByZXN1bHQueiA9IG5leHRSb3dPdXRPZkJvdW5kcyA/IDAuIDogcmVzdWx0Lno7XG4gICAgICAgICAgICByZXN1bHQudyA9IG5leHRDb2xPdXRPZkJvdW5kcyB8fCBuZXh0Um93T3V0T2ZCb3VuZHMgPyAwLiA6IHJlc3VsdC53O1xuICAgICAgICAgIGA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNoZWNrT3V0T2ZCb3VuZHNTdHJpbmcgKz0gYFxuICAgICAgICAgICAgYm9vbCBuZXh0Um93T3V0T2ZCb3VuZHMgPVxuICAgICAgICAgICAgICAoJHtjaGFubmVsc1tyYW5rIC0gMl19ICsgMSkgPj0gJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX07XG4gICAgICAgICAgICBib29sIG5leHRDb2xPdXRPZkJvdW5kcyA9XG4gICAgICAgICAgICAgICgke2NoYW5uZWxzW3JhbmsgLSAxXX0gKyAxKSA+PSAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfTtcbiAgICAgICAgICAgIHJlc3VsdC55ID0gbmV4dENvbE91dE9mQm91bmRzID8gMC4gOiByZXN1bHQueTtcbiAgICAgICAgICAgIHJlc3VsdC56ID0gbmV4dFJvd091dE9mQm91bmRzID8gMC4gOiByZXN1bHQuejtcbiAgICAgICAgICAgIHJlc3VsdC53ID0gbmV4dENvbE91dE9mQm91bmRzIHx8IG5leHRSb3dPdXRPZkJvdW5kcyA/IDAuIDogcmVzdWx0Lnc7XG4gICAgICAgICAgYDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdmVjNCBiaW5hcnlPcGVyYXRpb24odmVjNCBhLCB2ZWM0IGIpIHtcbiAgICAgICAgJHtvcH1cbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICB2ZWM0IGEgPSBnZXRBQXRPdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCBiID0gZ2V0QkF0T3V0Q29vcmRzKCk7XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSBiaW5hcnlPcGVyYXRpb24oYSwgYik7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc1N0cmluZ31cblxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Identity } from '@tensorflow/tfjs-core';\nexport function identity(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    backend.incRef(x.dataId);\n    return { dataId: x.dataId, shape: x.shape, dtype: x.dtype };\n}\nexport const identityConfig = {\n    kernelName: Identity,\n    backendName: 'webgl',\n    kernelFunc: identity\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSWRlbnRpdHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvSWRlbnRpdHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBdUQsTUFBTSx1QkFBdUIsQ0FBQztBQUlyRyxNQUFNLFVBQVUsUUFBUSxDQUNwQixJQUF5RDtJQUMzRCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXpCLE9BQU8sRUFBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzVELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0lkZW50aXR5LCBJZGVudGl0eUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gaWRlbnRpdHkoXG4gICAgYXJnczoge2lucHV0czogSWRlbnRpdHlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcblxuICByZXR1cm4ge2RhdGFJZDogeC5kYXRhSWQsIHNoYXBlOiB4LnNoYXBlLCBkdHlwZTogeC5kdHlwZX07XG59XG5cbmV4cG9ydCBjb25zdCBpZGVudGl0eUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJZGVudGl0eSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGlkZW50aXR5IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Complex } from '@tensorflow/tfjs-core';\nimport { identity } from './Identity';\n/**\n * In WebGL data is stored in GPU textures which can't be efficiently copied, so\n * complex tensors share data with their real and imaginary components. Complex\n * tensors' reference to the components is tracked by refCount on the individual\n * component. The refCounts are increased by the identity call.\n *\n * When a complex tensor is disposed, it will reduce the refCount on the\n * components by calling disposeData on each.\n */\nexport function complex(args) {\n    const { inputs, backend } = args;\n    const { real, imag } = inputs;\n    const complexInfo = backend.makeTensorInfo(real.shape, 'complex64');\n    const complex = backend.texData.get(complexInfo.dataId);\n    const realTensorInfo = identity({ inputs: { x: real }, backend });\n    const imagTensorInfo = identity({ inputs: { x: imag }, backend });\n    complex.complexTensorInfos = { real: realTensorInfo, imag: imagTensorInfo };\n    return complexInfo;\n}\nexport const complexConfig = {\n    kernelName: Complex,\n    backendName: 'webgl',\n    kernelFunc: complex\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db21wbGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQXNELE1BQU0sdUJBQXVCLENBQUM7QUFHbkcsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQzs7Ozs7Ozs7R0FRRztBQUNILE1BQU0sVUFBVSxPQUFPLENBQ25CLElBQXdEO0lBQzFELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRTVCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztJQUNwRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFeEQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFFOUQsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLElBQUksRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFFOUQsT0FBTyxDQUFDLGtCQUFrQixHQUFHLEVBQUMsSUFBSSxFQUFFLGNBQWMsRUFBRSxJQUFJLEVBQUUsY0FBYyxFQUFDLENBQUM7SUFFMUUsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q29tcGxleCwgQ29tcGxleElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbi8qKlxuICogSW4gV2ViR0wgZGF0YSBpcyBzdG9yZWQgaW4gR1BVIHRleHR1cmVzIHdoaWNoIGNhbid0IGJlIGVmZmljaWVudGx5IGNvcGllZCwgc29cbiAqIGNvbXBsZXggdGVuc29ycyBzaGFyZSBkYXRhIHdpdGggdGhlaXIgcmVhbCBhbmQgaW1hZ2luYXJ5IGNvbXBvbmVudHMuIENvbXBsZXhcbiAqIHRlbnNvcnMnIHJlZmVyZW5jZSB0byB0aGUgY29tcG9uZW50cyBpcyB0cmFja2VkIGJ5IHJlZkNvdW50IG9uIHRoZSBpbmRpdmlkdWFsXG4gKiBjb21wb25lbnQuIFRoZSByZWZDb3VudHMgYXJlIGluY3JlYXNlZCBieSB0aGUgaWRlbnRpdHkgY2FsbC5cbiAqXG4gKiBXaGVuIGEgY29tcGxleCB0ZW5zb3IgaXMgZGlzcG9zZWQsIGl0IHdpbGwgcmVkdWNlIHRoZSByZWZDb3VudCBvbiB0aGVcbiAqIGNvbXBvbmVudHMgYnkgY2FsbGluZyBkaXNwb3NlRGF0YSBvbiBlYWNoLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY29tcGxleChcbiAgICBhcmdzOiB7aW5wdXRzOiBDb21wbGV4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtyZWFsLCBpbWFnfSA9IGlucHV0cztcblxuICBjb25zdCBjb21wbGV4SW5mbyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVhbC5zaGFwZSwgJ2NvbXBsZXg2NCcpO1xuICBjb25zdCBjb21wbGV4ID0gYmFja2VuZC50ZXhEYXRhLmdldChjb21wbGV4SW5mby5kYXRhSWQpO1xuXG4gIGNvbnN0IHJlYWxUZW5zb3JJbmZvID0gaWRlbnRpdHkoe2lucHV0czoge3g6IHJlYWx9LCBiYWNrZW5kfSk7XG5cbiAgY29uc3QgaW1hZ1RlbnNvckluZm8gPSBpZGVudGl0eSh7aW5wdXRzOiB7eDogaW1hZ30sIGJhY2tlbmR9KTtcblxuICBjb21wbGV4LmNvbXBsZXhUZW5zb3JJbmZvcyA9IHtyZWFsOiByZWFsVGVuc29ySW5mbywgaW1hZzogaW1hZ1RlbnNvckluZm99O1xuXG4gIHJldHVybiBjb21wbGV4SW5mbztcbn1cblxuZXhwb3J0IGNvbnN0IGNvbXBsZXhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29tcGxleCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbXBsZXggYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, LeakyRelu, util } from '@tensorflow/tfjs-core';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nexport const LEAKYRELU = `return (a < 0.) ? b * a : a;`;\nexport const LEAKYRELU_PACKED = `\n  vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n  return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n`;\nexport function leakyRelu(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { alpha } = attrs;\n    const $alpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(alpha, 'float32'));\n    const program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ?\n        new BinaryOpPackedProgram(LEAKYRELU_PACKED, x.shape, $alpha.shape) :\n        new BinaryOpProgram(LEAKYRELU, x.shape, $alpha.shape);\n    const result = backend.runWebGLProgram(program, [x, $alpha], 'float32');\n    backend.disposeIntermediateTensorInfo($alpha);\n    return result;\n}\nexport const leakyReluConfig = {\n    kernelName: LeakyRelu,\n    backendName: 'webgl',\n    kernelFunc: leakyRelu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVha3lSZWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xlYWt5UmVsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixTQUFTLEVBQStDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRWxJLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsOEJBQThCLENBQUM7QUFDeEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7OztDQUcvQixDQUFDO0FBRUYsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUl6QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEIsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDakMsRUFBRSxFQUFFLFNBQVMsRUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsS0FBd0IsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRWpFLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw4QkFBOEIsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxxQkFBcUIsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3BFLElBQUksZUFBZSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUV4RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFOUMsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUI7SUFDM0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFNBQTZCO0NBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExlYWt5UmVsdSwgTGVha3lSZWx1QXR0cnMsIExlYWt5UmVsdUlucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IExFQUtZUkVMVSA9IGByZXR1cm4gKGEgPCAwLikgPyBiICogYSA6IGE7YDtcbmV4cG9ydCBjb25zdCBMRUFLWVJFTFVfUEFDS0VEID0gYFxuICB2ZWM0IGFMZXNzVGhhblplcm8gPSB2ZWM0KGxlc3NUaGFuKGEsIHZlYzQoMC4pKSk7XG4gIHJldHVybiAoYUxlc3NUaGFuWmVybyAqIChiICogYSkpICsgKCh2ZWM0KDEuMCkgLSBhTGVzc1RoYW5aZXJvKSAqIGEpO1xuYDtcblxuZXhwb3J0IGZ1bmN0aW9uIGxlYWt5UmVsdShhcmdzOiB7XG4gIGlucHV0czogTGVha3lSZWx1SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTGVha3lSZWx1QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxwaGF9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKExFQUtZUkVMVV9QQUNLRUQsIHguc2hhcGUsICRhbHBoYS5zaGFwZSkgOlxuICAgICAgbmV3IEJpbmFyeU9wUHJvZ3JhbShMRUFLWVJFTFUsIHguc2hhcGUsICRhbHBoYS5zaGFwZSk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCAkYWxwaGFdLCAnZmxvYXQzMicpO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oJGFscGhhKTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgbGVha3lSZWx1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExlYWt5UmVsdSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxlYWt5UmVsdSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, Prelu } from '@tensorflow/tfjs-core';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nexport const PRELU = `return (a < 0.) ? b * a : a;`;\nexport const PRELU_PACKED = `\n  vec4 aLessThanZero = vec4(lessThan(a, vec4(0.)));\n  return (aLessThanZero * (b * a)) + ((vec4(1.0) - aLessThanZero) * a);\n`;\nexport function prelu(args) {\n    const { inputs, backend } = args;\n    const { x, alpha } = inputs;\n    const program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ?\n        new BinaryOpPackedProgram(PRELU_PACKED, x.shape, alpha.shape) :\n        new BinaryOpProgram(PRELU, x.shape, alpha.shape);\n    return backend.runWebGLProgram(program, [x, alpha], 'float32');\n}\nexport const preluConfig = {\n    kernelName: Prelu,\n    backendName: 'webgl',\n    kernelFunc: prelu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlbHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUHJlbHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBNEIsS0FBSyxFQUEwQixNQUFNLHVCQUF1QixDQUFDO0FBR3BHLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU3RCxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsOEJBQThCLENBQUM7QUFDcEQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHOzs7Q0FHM0IsQ0FBQztBQUVGLE1BQU0sVUFBVSxLQUFLLENBQUMsSUFBc0Q7SUFFMUUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLENBQUMsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFMUIsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDhCQUE4QixDQUFDLENBQUMsQ0FBQztRQUMzRCxJQUFJLHFCQUFxQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksZUFBZSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNyRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQcmVsdSwgUHJlbHVJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGNvbnN0IFBSRUxVID0gYHJldHVybiAoYSA8IDAuKSA/IGIgKiBhIDogYTtgO1xuZXhwb3J0IGNvbnN0IFBSRUxVX1BBQ0tFRCA9IGBcbiAgdmVjNCBhTGVzc1RoYW5aZXJvID0gdmVjNChsZXNzVGhhbihhLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGFMZXNzVGhhblplcm8gKiAoYiAqIGEpKSArICgodmVjNCgxLjApIC0gYUxlc3NUaGFuWmVybykgKiBhKTtcbmA7XG5cbmV4cG9ydCBmdW5jdGlvbiBwcmVsdShhcmdzOiB7aW5wdXRzOiBQcmVsdUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBhbHBoYX0gPSBpbnB1dHM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKFBSRUxVX1BBQ0tFRCwgeC5zaGFwZSwgYWxwaGEuc2hhcGUpIDpcbiAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oUFJFTFUsIHguc2hhcGUsIGFscGhhLnNoYXBlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBhbHBoYV0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBwcmVsdUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQcmVsdSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHByZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, upcastType } from '@tensorflow/tfjs-core';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nimport { complex } from '../kernels/Complex';\nimport { LEAKYRELU, LEAKYRELU_PACKED } from '../kernels/LeakyRelu';\nimport { PRELU, PRELU_PACKED } from '../kernels/Prelu';\nimport * as unary_op from '../unaryop_gpu';\nimport { UnaryOpProgram } from '../unaryop_gpu';\nimport * as unary_packed_op from '../unaryop_packed_gpu';\nimport { UnaryOpPackedProgram } from '../unaryop_packed_gpu';\nexport const CHECK_NAN_SNIPPET_UNARY = `if (isnan(x)) return x;`;\n/**\n * Template that creates a `KernelFunc` for unary ops.\n * @param opSnippet Op snippet to create `UnaryOpProgram`.\n * @param packedOpSnippet Op snippet to create `UnaryOpPackedProgram`.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n *     result has the same dtype as the first input. This is mainly used in\n *     comparison kernels, such as Equal, Less, Greater, etc.\n */\nexport function unaryKernelFunc({ opSnippet, packedOpSnippet, cpuKernelImpl, dtype }) {\n    return ({ inputs, backend }) => {\n        const { x } = inputs;\n        const webglBackend = backend;\n        const $dtype = dtype || x.dtype;\n        if (webglBackend.shouldExecuteOnCPU([x]) && cpuKernelImpl != null) {\n            const xData = webglBackend.texData.get(x.dataId);\n            const outValues = cpuKernelImpl(xData.values, $dtype);\n            return webglBackend.makeTensorInfo(x.shape, $dtype, outValues);\n        }\n        const shouldUsePackedProgram = env().getBool('WEBGL_PACK_UNARY_OPERATIONS') && packedOpSnippet != null;\n        let program;\n        if (shouldUsePackedProgram) {\n            program = new UnaryOpPackedProgram(x.shape, packedOpSnippet);\n        }\n        else {\n            program = new UnaryOpProgram(x.shape, opSnippet);\n        }\n        return webglBackend.runWebGLProgram(program, [x], $dtype);\n    };\n}\n/**\n * Template that creates a `KernelFunc` for binary ops.\n * @param opSnippet Op snippet to create `BinaryOpProgram`.\n * @param packedOpSnippet Op snippet to create `BinaryOpPackedProgram`.\n * @param checkOutOfBoundsForPackedProgram Whether to set checkOutOfBounds=true\n *     when creating BinaryOpPackedProgram.\n * @param dtype Optional. If set, the result has this dtype. Otherwise, the\n *     result has the same dtype as the first input. This is mainly used in\n *     comparison kernels, such as Equal, Less, Greater, etc.\n */\nexport function binaryKernelFunc({ opSnippet, packedOpSnippet, checkOutOfBounds = false, supportsComplex = false, cpuKernelImpl, dtype }) {\n    return ({ inputs, backend }) => {\n        const { a, b } = inputs;\n        const webglBackend = backend;\n        if (supportsComplex && a.dtype === 'complex64') {\n            const aData = webglBackend.texData.get(a.dataId);\n            const bData = webglBackend.texData.get(b.dataId);\n            const [real, imag] = [\n                [aData.complexTensorInfos.real, bData.complexTensorInfos.real],\n                [aData.complexTensorInfos.imag, bData.complexTensorInfos.imag]\n            ].map(complexParts => {\n                const [aPart, bPart] = complexParts;\n                const aHandle = {\n                    dataId: aPart.dataId,\n                    dtype: aPart.dtype,\n                    shape: a.shape\n                };\n                const bHandle = {\n                    dataId: bPart.dataId,\n                    dtype: bPart.dtype,\n                    shape: b.shape\n                };\n                const program = new BinaryOpProgram(opSnippet, a.shape, b.shape);\n                return webglBackend.runWebGLProgram(program, [aHandle, bHandle], upcastType(aPart.dtype, bPart.dtype));\n            });\n            const complexOutput = complex({ inputs: { real, imag }, backend: webglBackend });\n            webglBackend.disposeIntermediateTensorInfo(real);\n            webglBackend.disposeIntermediateTensorInfo(imag);\n            // TODO(annxingyuan): Implement CPU forwarding for complex inputs.\n            return complexOutput;\n        }\n        const $dtype = dtype || upcastType(a.dtype, b.dtype);\n        if ((a.dtype === 'string' || b.dtype === 'string' ||\n            webglBackend.shouldExecuteOnCPU([a, b])) &&\n            cpuKernelImpl != null) {\n            const aVals = webglBackend.texData.get(a.dataId).values;\n            const bVals = webglBackend.texData.get(b.dataId).values;\n            const decodedAVals = a.dtype === 'string' ?\n                // tslint:disable-next-line: no-any\n                backend_util.fromUint8ToStringArray(aVals) :\n                aVals;\n            const decodedBVals = a.dtype === 'string' ?\n                // tslint:disable-next-line: no-any\n                backend_util.fromUint8ToStringArray(bVals) :\n                bVals;\n            const [outValues, outShape] = cpuKernelImpl(a.shape, b.shape, decodedAVals, decodedBVals, $dtype);\n            const out = webglBackend.makeTensorInfo(outShape, $dtype);\n            const outData = webglBackend.texData.get(out.dataId);\n            outData.values = outValues;\n            return out;\n        }\n        const shouldUsePackedProgram = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') &&\n            packedOpSnippet != null;\n        let program;\n        if (shouldUsePackedProgram) {\n            program = new BinaryOpPackedProgram(packedOpSnippet, a.shape, b.shape, checkOutOfBounds);\n        }\n        else {\n            program = new BinaryOpProgram(opSnippet, a.shape, b.shape);\n        }\n        return webglBackend.runWebGLProgram(program, [a, b], $dtype);\n    };\n}\nexport function mapActivationToShaderProgram(activation, packed = false) {\n    if (activation === 'linear') {\n        if (packed) {\n            return unary_packed_op.LINEAR;\n        }\n        return unary_op.LINEAR;\n    }\n    else if (activation === 'relu') {\n        if (packed) {\n            return unary_packed_op.RELU;\n        }\n        return unary_op.RELU;\n    }\n    else if (activation === 'elu') {\n        if (packed) {\n            return unary_packed_op.ELU;\n        }\n        return unary_op.ELU;\n    }\n    else if (activation === 'relu6') {\n        if (packed) {\n            return unary_packed_op.RELU6;\n        }\n        return unary_op.RELU6;\n    }\n    else if (activation === 'prelu') {\n        if (packed) {\n            return PRELU_PACKED;\n        }\n        return PRELU;\n    }\n    else if (activation === 'leakyrelu') {\n        if (packed) {\n            return LEAKYRELU_PACKED;\n        }\n        return LEAKYRELU;\n    }\n    else if (activation === 'sigmoid') {\n        if (packed) {\n            return unary_packed_op.SIGMOID;\n        }\n        return unary_op.SIGMOID;\n    }\n    throw new Error(`Activation ${activation} has not been implemented for the WebGL backend.`);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2VybmVsX2Z1bmNzX3V0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQTBCLEdBQUcsRUFBdUMsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakksT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2hELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsU0FBUyxFQUFFLGdCQUFnQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDakUsT0FBTyxFQUFDLEtBQUssRUFBRSxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNyRCxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEtBQUssZUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQ3pELE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSTNELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFHLHlCQUF5QixDQUFDO0FBU2pFOzs7Ozs7O0dBT0c7QUFDSCxNQUFNLFVBQVUsZUFBZSxDQUMzQixFQUFDLFNBQVMsRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEtBQUssRUFBd0I7SUFFM0UsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDM0IsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQXFCLENBQUM7UUFDbEMsTUFB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LElBQUksTUFBTSxFQUFFO1lBQ1YsT0FBTyxlQUFlLENBQUMsT0FBTyxDQUFDO1NBQ2hDO1FBQ0QsT0FBTyxRQUFRLENBQUMsT0FBTyxDQUFDO0tBQ3pCO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQyxjQUNaLFVBQVUsa0RBQWtELENBQUMsQ0FBQztBQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQmluYXJ5SW5wdXRzLCBEYXRhVHlwZSwgZW52LCBLZXJuZWxGdW5jLCBUeXBlZEFycmF5LCBVbmFyeUlucHV0cywgdXBjYXN0VHlwZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7QmluYXJ5T3BQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtCaW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuLi9rZXJuZWxzL0NvbXBsZXgnO1xuaW1wb3J0IHtMRUFLWVJFTFUsIExFQUtZUkVMVV9QQUNLRUR9IGZyb20gJy4uL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7UFJFTFUsIFBSRUxVX1BBQ0tFRH0gZnJvbSAnLi4va2VybmVscy9QcmVsdSc7XG5pbXBvcnQgKiBhcyB1bmFyeV9vcCBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQge1VuYXJ5T3BQcm9ncmFtfSBmcm9tICcuLi91bmFyeW9wX2dwdSc7XG5pbXBvcnQgKiBhcyB1bmFyeV9wYWNrZWRfb3AgZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7VW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5cbmltcG9ydCB7U2ltcGxlQmluYXJ5S2VybmVsSW1wbENQVSwgU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVfSBmcm9tICcuL3NoYXJlZCc7XG5cbmV4cG9ydCBjb25zdCBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSA9IGBpZiAoaXNuYW4oeCkpIHJldHVybiB4O2A7XG5cbnR5cGUgVW5hcnlLZXJuZWxGdW5jQ29uZmlnID0ge1xuICBvcFNuaXBwZXQ6IHN0cmluZyxcbiAgcGFja2VkT3BTbmlwcGV0Pzogc3RyaW5nLFxuICBjcHVLZXJuZWxJbXBsPzogU2ltcGxlVW5hcnlLZXJuZWxJbXBsQ1BVLFxuICBkdHlwZT86IERhdGFUeXBlXG59O1xuXG4vKipcbiAqIFRlbXBsYXRlIHRoYXQgY3JlYXRlcyBhIGBLZXJuZWxGdW5jYCBmb3IgdW5hcnkgb3BzLlxuICogQHBhcmFtIG9wU25pcHBldCBPcCBzbmlwcGV0IHRvIGNyZWF0ZSBgVW5hcnlPcFByb2dyYW1gLlxuICogQHBhcmFtIHBhY2tlZE9wU25pcHBldCBPcCBzbmlwcGV0IHRvIGNyZWF0ZSBgVW5hcnlPcFBhY2tlZFByb2dyYW1gLlxuICogQHBhcmFtIGR0eXBlIE9wdGlvbmFsLiBJZiBzZXQsIHRoZSByZXN1bHQgaGFzIHRoaXMgZHR5cGUuIE90aGVyd2lzZSwgdGhlXG4gKiAgICAgcmVzdWx0IGhhcyB0aGUgc2FtZSBkdHlwZSBhcyB0aGUgZmlyc3QgaW5wdXQuIFRoaXMgaXMgbWFpbmx5IHVzZWQgaW5cbiAqICAgICBjb21wYXJpc29uIGtlcm5lbHMsIHN1Y2ggYXMgRXF1YWwsIExlc3MsIEdyZWF0ZXIsIGV0Yy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVuYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0LCBwYWNrZWRPcFNuaXBwZXQsIGNwdUtlcm5lbEltcGwsIGR0eXBlfTogVW5hcnlLZXJuZWxGdW5jQ29uZmlnKTpcbiAgICBLZXJuZWxGdW5jIHtcbiAgcmV0dXJuICh7aW5wdXRzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHt4fSA9IGlucHV0cyBhcyBVbmFyeUlucHV0cztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB4LmR0eXBlO1xuICAgIGlmICh3ZWJnbEJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgJiYgY3B1S2VybmVsSW1wbCAhPSBudWxsKSB7XG4gICAgICBjb25zdCB4RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gICAgICBjb25zdCBvdXRWYWx1ZXMgPSBjcHVLZXJuZWxJbXBsKHhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCAkZHR5cGUpO1xuICAgICAgcmV0dXJuIHdlYmdsQmFja2VuZC5tYWtlVGVuc29ySW5mbyh4LnNoYXBlLCAkZHR5cGUsIG91dFZhbHVlcyk7XG4gICAgfVxuXG4gICAgY29uc3Qgc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSA9XG4gICAgICAgIGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfVU5BUllfT1BFUkFUSU9OUycpICYmIHBhY2tlZE9wU25pcHBldCAhPSBudWxsO1xuICAgIGxldCBwcm9ncmFtOiBVbmFyeU9wUHJvZ3JhbXxVbmFyeU9wUGFja2VkUHJvZ3JhbTtcbiAgICBpZiAoc2hvdWxkVXNlUGFja2VkUHJvZ3JhbSkge1xuICAgICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBwYWNrZWRPcFNuaXBwZXQpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIG9wU25pcHBldCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAkZHR5cGUpO1xuICB9O1xufVxuXG50eXBlIEJpbmFyeUtlcm5lbEZ1bmNDb25maWcgPSB7XG4gIG9wU25pcHBldDogc3RyaW5nLFxuICBwYWNrZWRPcFNuaXBwZXQ/OiBzdHJpbmcsXG4gIGNoZWNrT3V0T2ZCb3VuZHM/OiBib29sZWFuLFxuICBzdXBwb3J0c0NvbXBsZXg/OiBib29sZWFuLFxuICBjcHVLZXJuZWxJbXBsPzogU2ltcGxlQmluYXJ5S2VybmVsSW1wbENQVSxcbiAgZHR5cGU/OiBEYXRhVHlwZVxufTtcblxuLyoqXG4gKiBUZW1wbGF0ZSB0aGF0IGNyZWF0ZXMgYSBgS2VybmVsRnVuY2AgZm9yIGJpbmFyeSBvcHMuXG4gKiBAcGFyYW0gb3BTbmlwcGV0IE9wIHNuaXBwZXQgdG8gY3JlYXRlIGBCaW5hcnlPcFByb2dyYW1gLlxuICogQHBhcmFtIHBhY2tlZE9wU25pcHBldCBPcCBzbmlwcGV0IHRvIGNyZWF0ZSBgQmluYXJ5T3BQYWNrZWRQcm9ncmFtYC5cbiAqIEBwYXJhbSBjaGVja091dE9mQm91bmRzRm9yUGFja2VkUHJvZ3JhbSBXaGV0aGVyIHRvIHNldCBjaGVja091dE9mQm91bmRzPXRydWVcbiAqICAgICB3aGVuIGNyZWF0aW5nIEJpbmFyeU9wUGFja2VkUHJvZ3JhbS5cbiAqIEBwYXJhbSBkdHlwZSBPcHRpb25hbC4gSWYgc2V0LCB0aGUgcmVzdWx0IGhhcyB0aGlzIGR0eXBlLiBPdGhlcndpc2UsIHRoZVxuICogICAgIHJlc3VsdCBoYXMgdGhlIHNhbWUgZHR5cGUgYXMgdGhlIGZpcnN0IGlucHV0LiBUaGlzIGlzIG1haW5seSB1c2VkIGluXG4gKiAgICAgY29tcGFyaXNvbiBrZXJuZWxzLCBzdWNoIGFzIEVxdWFsLCBMZXNzLCBHcmVhdGVyLCBldGMuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0LFxuICBwYWNrZWRPcFNuaXBwZXQsXG4gIGNoZWNrT3V0T2ZCb3VuZHMgPSBmYWxzZSxcbiAgc3VwcG9ydHNDb21wbGV4ID0gZmFsc2UsXG4gIGNwdUtlcm5lbEltcGwsXG4gIGR0eXBlXG59OiBCaW5hcnlLZXJuZWxGdW5jQ29uZmlnKTogS2VybmVsRnVuYyB7XG4gIHJldHVybiAoe2lucHV0cywgYmFja2VuZH0pID0+IHtcbiAgICBjb25zdCB7YSwgYn0gPSBpbnB1dHMgYXMgQmluYXJ5SW5wdXRzO1xuICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRXZWJHTDtcblxuICAgIGlmIChzdXBwb3J0c0NvbXBsZXggJiYgYS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICAgIGNvbnN0IGFEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KGEuZGF0YUlkKTtcbiAgICAgIGNvbnN0IGJEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KGIuZGF0YUlkKTtcblxuICAgICAgY29uc3QgW3JlYWwsIGltYWddID0gW1xuICAgICAgICBbYURhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwsIGJEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsXSxcbiAgICAgICAgW2FEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLCBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZ11cbiAgICAgIF0ubWFwKGNvbXBsZXhQYXJ0cyA9PiB7XG4gICAgICAgIGNvbnN0IFthUGFydCwgYlBhcnRdID0gY29tcGxleFBhcnRzO1xuXG4gICAgICAgIGNvbnN0IGFIYW5kbGUgPSB7XG4gICAgICAgICAgZGF0YUlkOiBhUGFydC5kYXRhSWQsXG4gICAgICAgICAgZHR5cGU6IGFQYXJ0LmR0eXBlLFxuICAgICAgICAgIHNoYXBlOiBhLnNoYXBlXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGJIYW5kbGUgPSB7XG4gICAgICAgICAgZGF0YUlkOiBiUGFydC5kYXRhSWQsXG4gICAgICAgICAgZHR5cGU6IGJQYXJ0LmR0eXBlLFxuICAgICAgICAgIHNoYXBlOiBiLnNoYXBlXG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0ob3BTbmlwcGV0LCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgICAgICAgcmV0dXJuIHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgICAgICBwcm9ncmFtLCBbYUhhbmRsZSwgYkhhbmRsZV0sIHVwY2FzdFR5cGUoYVBhcnQuZHR5cGUsIGJQYXJ0LmR0eXBlKSk7XG4gICAgICB9KTtcblxuICAgICAgY29uc3QgY29tcGxleE91dHB1dCA9XG4gICAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbCwgaW1hZ30sIGJhY2tlbmQ6IHdlYmdsQmFja2VuZH0pO1xuXG4gICAgICB3ZWJnbEJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbCk7XG4gICAgICB3ZWJnbEJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaW1hZyk7XG5cbiAgICAgIC8vIFRPRE8oYW5ueGluZ3l1YW4pOiBJbXBsZW1lbnQgQ1BVIGZvcndhcmRpbmcgZm9yIGNvbXBsZXggaW5wdXRzLlxuXG4gICAgICByZXR1cm4gY29tcGxleE91dHB1dDtcbiAgICB9XG5cbiAgICBjb25zdCAkZHR5cGUgPSBkdHlwZSB8fCB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuICAgIGlmICgoYS5kdHlwZSA9PT0gJ3N0cmluZycgfHwgYi5kdHlwZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHdlYmdsQmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW2EsIGJdKSkgJiZcbiAgICAgICAgY3B1S2VybmVsSW1wbCAhPSBudWxsKSB7XG4gICAgICBjb25zdCBhVmFscyA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChhLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgICBjb25zdCBiVmFscyA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgICAgIGNvbnN0IGRlY29kZWRBVmFscyA9IGEuZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KGFWYWxzIGFzIGFueSBhcyBVaW50OEFycmF5W10pIDpcbiAgICAgICAgICBhVmFscztcbiAgICAgIGNvbnN0IGRlY29kZWRCVmFscyA9IGEuZHR5cGUgPT09ICdzdHJpbmcnID9cbiAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLWFueVxuICAgICAgICAgIGJhY2tlbmRfdXRpbC5mcm9tVWludDhUb1N0cmluZ0FycmF5KGJWYWxzIGFzIGFueSBhcyBVaW50OEFycmF5W10pIDpcbiAgICAgICAgICBiVmFscztcbiAgICAgIGNvbnN0IFtvdXRWYWx1ZXMsIG91dFNoYXBlXSA9XG4gICAgICAgICAgY3B1S2VybmVsSW1wbChhLnNoYXBlLCBiLnNoYXBlLCBkZWNvZGVkQVZhbHMsIGRlY29kZWRCVmFscywgJGR0eXBlKTtcblxuICAgICAgY29uc3Qgb3V0ID0gd2ViZ2xCYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCAkZHR5cGUpO1xuICAgICAgY29uc3Qgb3V0RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRVc2VQYWNrZWRQcm9ncmFtID1cbiAgICAgICAgZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpICYmXG4gICAgICAgIHBhY2tlZE9wU25pcHBldCAhPSBudWxsO1xuICAgIGxldCBwcm9ncmFtOiBCaW5hcnlPcFByb2dyYW18QmluYXJ5T3BQYWNrZWRQcm9ncmFtO1xuICAgIGlmIChzaG91bGRVc2VQYWNrZWRQcm9ncmFtKSB7XG4gICAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUGFja2VkUHJvZ3JhbShcbiAgICAgICAgICBwYWNrZWRPcFNuaXBwZXQsIGEuc2hhcGUsIGIuc2hhcGUsIGNoZWNrT3V0T2ZCb3VuZHMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtID0gbmV3IEJpbmFyeU9wUHJvZ3JhbShvcFNuaXBwZXQsIGEuc2hhcGUsIGIuc2hhcGUpO1xuICAgIH1cblxuICAgIHJldHVybiB3ZWJnbEJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFthLCBiXSwgJGR0eXBlKTtcbiAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIG1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0oXG4gICAgYWN0aXZhdGlvbjogYmFja2VuZF91dGlsLkFjdGl2YXRpb24sIHBhY2tlZCA9IGZhbHNlKTogc3RyaW5nIHtcbiAgaWYgKGFjdGl2YXRpb24gPT09ICdsaW5lYXInKSB7XG4gICAgaWYgKHBhY2tlZCkge1xuICAgICAgcmV0dXJuIHVuYXJ5X3BhY2tlZF9vcC5MSU5FQVI7XG4gICAgfVxuICAgIHJldHVybiB1bmFyeV9vcC5MSU5FQVI7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3JlbHUnKSB7XG4gICAgaWYgKHBhY2tlZCkge1xuICAgICAgcmV0dXJuIHVuYXJ5X3BhY2tlZF9vcC5SRUxVO1xuICAgIH1cbiAgICByZXR1cm4gdW5hcnlfb3AuUkVMVTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnZWx1Jykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuRUxVO1xuICAgIH1cbiAgICByZXR1cm4gdW5hcnlfb3AuRUxVO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdyZWx1NicpIHtcbiAgICBpZiAocGFja2VkKSB7XG4gICAgICByZXR1cm4gdW5hcnlfcGFja2VkX29wLlJFTFU2O1xuICAgIH1cbiAgICByZXR1cm4gdW5hcnlfb3AuUkVMVTY7XG4gIH0gZWxzZSBpZiAoYWN0aXZhdGlvbiA9PT0gJ3ByZWx1Jykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiBQUkVMVV9QQUNLRUQ7XG4gICAgfVxuICAgIHJldHVybiBQUkVMVTtcbiAgfSBlbHNlIGlmIChhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1Jykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiBMRUFLWVJFTFVfUEFDS0VEO1xuICAgIH1cbiAgICByZXR1cm4gTEVBS1lSRUxVO1xuICB9IGVsc2UgaWYgKGFjdGl2YXRpb24gPT09ICdzaWdtb2lkJykge1xuICAgIGlmIChwYWNrZWQpIHtcbiAgICAgIHJldHVybiB1bmFyeV9wYWNrZWRfb3AuU0lHTU9JRDtcbiAgICB9XG4gICAgcmV0dXJuIHVuYXJ5X29wLlNJR01PSUQ7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBBY3RpdmF0aW9uICR7XG4gICAgICBhY3RpdmF0aW9ufSBoYXMgbm90IGJlZW4gaW1wbGVtZW50ZWQgZm9yIHRoZSBXZWJHTCBiYWNrZW5kLmApO1xufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nexport class MatMulPackedProgram {\n    constructor(aShape, bShape, outputShape, transposeA = false, transposeB = false, addBias = false, activation = null, hasPreluActivation = false, hasLeakyreluActivation = false) {\n        this.variableNames = ['matrixA', 'matrixB'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = outputShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        const sharedDim = transposeA ? aShape[1] : aShape[2];\n        const sharedDimensionPacked = Math.ceil(sharedDim / 2);\n        const aSample = transposeA ? 'i * 2, rc.y' : 'rc.y, i * 2';\n        const bSample = transposeB ? 'rc.z, i * 2' : 'i * 2, rc.z';\n        const aSwizzle = transposeA ? ['a.xxyy', 'a.zzww'] : ['a.xxzz', 'a.yyww'];\n        const bSwizzle = transposeB ? ['b.xzxz', 'b.ywyw'] : ['b.xyxy', 'b.zwzw'];\n        let activationSnippet = '', applyActivationSnippet = '';\n        if (activation) {\n            if (hasPreluActivation) {\n                activationSnippet = `vec4 activation(vec4 a) {\n          vec4 b = getPreluActivationWeightsAtOutCoords();\n          ${activation}\n        }`;\n            }\n            else if (hasLeakyreluActivation) {\n                activationSnippet = `vec4 activation(vec4 a) {\n          vec4 b = getLeakyreluAlphaAtOutCoords();\n          ${activation}\n        }`;\n            }\n            else {\n                activationSnippet = `vec4 activation(vec4 x) {\n          ${activation}\n        }`;\n            }\n            applyActivationSnippet = `result = activation(result);`;\n        }\n        const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n        if (addBias) {\n            this.variableNames.push('bias');\n        }\n        if (hasPreluActivation) {\n            this.variableNames.push('preluActivationWeights');\n        }\n        if (hasLeakyreluActivation) {\n            this.variableNames.push('leakyreluAlpha');\n        }\n        let batchASnippet = 'rc.x';\n        let batchBSnippet = 'rc.x';\n        if (aShape[0] < bShape[0]) {\n            batchASnippet = `int(min(float(rc.x), ${aShape[0] - 1}.))`;\n        }\n        else if (bShape[0] < aShape[0]) {\n            batchBSnippet = `int(min(float(rc.x), ${bShape[0] - 1}.))`;\n        }\n        this.userCode = `\n      ${activationSnippet}\n      // Don't use uniform for sharedDimensionPacked for performance.\n      const float sharedDimension = ${sharedDimensionPacked}.0;\n\n      vec4 dot2x2ARowBCol(ivec3 rc) {\n        vec4 result = vec4(0);\n        for (int i = 0; i < ${sharedDimensionPacked}; i++) {\n          int batchA = ${batchASnippet};\n          int batchB = ${batchBSnippet};\n          vec4 a = getMatrixA(batchA, ${aSample});\n          vec4 b = getMatrixB(batchB, ${bSample});\n\n          // These swizzled products need to be separately added.\n          // See: https://github.com/tensorflow/tfjs/issues/1735\n          result += (${aSwizzle[0]} * ${bSwizzle[0]});\n          result += (${aSwizzle[1]} * ${bSwizzle[1]});\n        }\n        return result;\n      }\n\n      void main() {\n        ivec3 rc = getOutputCoords();\n        vec4 result = dot2x2ARowBCol(rc);\n\n        ${addBiasSnippet}\n\n        ${applyActivationSnippet}\n\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsbWF0X3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL211bG1hdF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLE9BQU8sbUJBQW1CO0lBUTlCLFlBQ0ksTUFBZ0MsRUFBRSxNQUFnQyxFQUNsRSxXQUFxQyxFQUFFLFVBQVUsR0FBRyxLQUFLLEVBQ3pELFVBQVUsR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLEtBQUssRUFBRSxhQUFxQixJQUFJLEVBQzlELGtCQUFrQixHQUFHLEtBQUssRUFBRSxzQkFBc0IsR0FBRyxLQUFLO1FBWDlELGtCQUFhLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDdkMsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFVbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsTUFBTSxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXZELE1BQU0sT0FBTyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7UUFDM0QsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUMzRCxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUMxRSxNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUUxRSxJQUFJLGlCQUFpQixHQUFHLEVBQUUsRUFBRSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDeEQsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLGtCQUFrQixFQUFFO2dCQUN0QixpQkFBaUIsR0FBRzs7WUFFaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtpQkFBTSxJQUFJLHNCQUFzQixFQUFFO2dCQUNqQyxpQkFBaUIsR0FBRzs7WUFFaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxpQkFBaUIsR0FBRztZQUNoQixVQUFVO1VBQ1osQ0FBQzthQUNKO1lBRUQsc0JBQXNCLEdBQUcsOEJBQThCLENBQUM7U0FDekQ7UUFFRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLGlDQUFpQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDeEUsSUFBSSxPQUFPLEVBQUU7WUFDWCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqQztRQUVELElBQUksa0JBQWtCLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNuRDtRQUVELElBQUksc0JBQXNCLEVBQUU7WUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUMzQztRQUVELElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQztRQUMzQixJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUM7UUFDM0IsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3pCLGFBQWEsR0FBRyx3QkFBd0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1NBQzVEO2FBQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ2hDLGFBQWEsR0FBRyx3QkFBd0IsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDO1NBQzVEO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUNaLGlCQUFpQjs7c0NBRWEscUJBQXFCOzs7OzhCQUk3QixxQkFBcUI7eUJBQzFCLGFBQWE7eUJBQ2IsYUFBYTt3Q0FDRSxPQUFPO3dDQUNQLE9BQU87Ozs7dUJBSXhCLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsQ0FBQyxDQUFDO3VCQUM1QixRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sUUFBUSxDQUFDLENBQUMsQ0FBQzs7Ozs7Ozs7O1VBU3pDLGNBQWM7O1VBRWQsc0JBQXNCOzs7O0tBSTNCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTWF0TXVsUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ21hdHJpeEEnLCAnbWF0cml4QiddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBhU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYlNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBvdXRwdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXJdLCB0cmFuc3Bvc2VBID0gZmFsc2UsXG4gICAgICB0cmFuc3Bvc2VCID0gZmFsc2UsIGFkZEJpYXMgPSBmYWxzZSwgYWN0aXZhdGlvbjogc3RyaW5nID0gbnVsbCxcbiAgICAgIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLCBoYXNMZWFreXJlbHVBY3RpdmF0aW9uID0gZmFsc2UpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5lbmFibGVTaGFwZVVuaWZvcm1zID0gdXNlU2hhcGVVbmlmb3Jtcyh0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCk7XG5cbiAgICBjb25zdCBzaGFyZWREaW0gPSB0cmFuc3Bvc2VBID8gYVNoYXBlWzFdIDogYVNoYXBlWzJdO1xuICAgIGNvbnN0IHNoYXJlZERpbWVuc2lvblBhY2tlZCA9IE1hdGguY2VpbChzaGFyZWREaW0gLyAyKTtcblxuICAgIGNvbnN0IGFTYW1wbGUgPSB0cmFuc3Bvc2VBID8gJ2kgKiAyLCByYy55JyA6ICdyYy55LCBpICogMic7XG4gICAgY29uc3QgYlNhbXBsZSA9IHRyYW5zcG9zZUIgPyAncmMueiwgaSAqIDInIDogJ2kgKiAyLCByYy56JztcbiAgICBjb25zdCBhU3dpenpsZSA9IHRyYW5zcG9zZUEgPyBbJ2EueHh5eScsICdhLnp6d3cnXSA6IFsnYS54eHp6JywgJ2EueXl3dyddO1xuICAgIGNvbnN0IGJTd2l6emxlID0gdHJhbnNwb3NlQiA/IFsnYi54enh6JywgJ2IueXd5dyddIDogWydiLnh5eHknLCAnYi56d3p3J107XG5cbiAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIGlmIChoYXNMZWFreXJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IHgpIHtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfVxuXG4gICAgICBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gYHJlc3VsdCA9IGFjdGl2YXRpb24ocmVzdWx0KTtgO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZEJpYXNTbmlwcGV0ID0gYWRkQmlhcyA/ICdyZXN1bHQgKz0gZ2V0Qmlhc0F0T3V0Q29vcmRzKCk7JyA6ICcnO1xuICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgIH1cblxuICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgfVxuXG4gICAgaWYgKGhhc0xlYWt5cmVsdUFjdGl2YXRpb24pIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdsZWFreXJlbHVBbHBoYScpO1xuICAgIH1cblxuICAgIGxldCBiYXRjaEFTbmlwcGV0ID0gJ3JjLngnO1xuICAgIGxldCBiYXRjaEJTbmlwcGV0ID0gJ3JjLngnO1xuICAgIGlmIChhU2hhcGVbMF0gPCBiU2hhcGVbMF0pIHtcbiAgICAgIGJhdGNoQVNuaXBwZXQgPSBgaW50KG1pbihmbG9hdChyYy54KSwgJHthU2hhcGVbMF0gLSAxfS4pKWA7XG4gICAgfSBlbHNlIGlmIChiU2hhcGVbMF0gPCBhU2hhcGVbMF0pIHtcbiAgICAgIGJhdGNoQlNuaXBwZXQgPSBgaW50KG1pbihmbG9hdChyYy54KSwgJHtiU2hhcGVbMF0gLSAxfS4pKWA7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7YWN0aXZhdGlvblNuaXBwZXR9XG4gICAgICAvLyBEb24ndCB1c2UgdW5pZm9ybSBmb3Igc2hhcmVkRGltZW5zaW9uUGFja2VkIGZvciBwZXJmb3JtYW5jZS5cbiAgICAgIGNvbnN0IGZsb2F0IHNoYXJlZERpbWVuc2lvbiA9ICR7c2hhcmVkRGltZW5zaW9uUGFja2VkfS4wO1xuXG4gICAgICB2ZWM0IGRvdDJ4MkFSb3dCQ29sKGl2ZWMzIHJjKSB7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwKTtcbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3NoYXJlZERpbWVuc2lvblBhY2tlZH07IGkrKykge1xuICAgICAgICAgIGludCBiYXRjaEEgPSAke2JhdGNoQVNuaXBwZXR9O1xuICAgICAgICAgIGludCBiYXRjaEIgPSAke2JhdGNoQlNuaXBwZXR9O1xuICAgICAgICAgIHZlYzQgYSA9IGdldE1hdHJpeEEoYmF0Y2hBLCAke2FTYW1wbGV9KTtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRNYXRyaXhCKGJhdGNoQiwgJHtiU2FtcGxlfSk7XG5cbiAgICAgICAgICAvLyBUaGVzZSBzd2l6emxlZCBwcm9kdWN0cyBuZWVkIHRvIGJlIHNlcGFyYXRlbHkgYWRkZWQuXG4gICAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xNzM1XG4gICAgICAgICAgcmVzdWx0ICs9ICgke2FTd2l6emxlWzBdfSAqICR7YlN3aXp6bGVbMF19KTtcbiAgICAgICAgICByZXN1bHQgKz0gKCR7YVN3aXp6bGVbMV19ICogJHtiU3dpenpsZVsxXX0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgcmMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCByZXN1bHQgPSBkb3QyeDJBUm93QkNvbChyYyk7XG5cbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cblxuICAgICAgICAke2FwcGx5QWN0aXZhdGlvblNuaXBwZXR9XG5cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\n// (Ar + Ai)(Br + Bi) =\n// ArBr + ArBi + AiBr + AiBi = ArBr - AB + ArBi + AiBr\n// Yr = ArBr - AB\n// Yi = ArBi + AiBr\nexport const COMPLEX_MULTIPLY = {\n    REAL: 'return areal * breal - aimag * bimag;',\n    IMAG: 'return areal * bimag + aimag * breal;'\n};\nexport class BinaryOpComplexProgram {\n    constructor(op, aShape, bShape) {\n        this.variableNames = ['AReal', 'AImag', 'BReal', 'BImag'];\n        this.outputShape = backend_util.assertAndGetBroadcastShape(aShape, bShape);\n        this.userCode = `\n      float binaryOpComplex(\n          float areal, float aimag, float breal, float bimag) {\n        ${op}\n      }\n\n      void main() {\n        float areal = getARealAtOutCoords();\n        float aimag = getAImagAtOutCoords();\n        float breal = getBRealAtOutCoords();\n        float bimag = getBImagAtOutCoords();\n        setOutput(binaryOpComplex(areal, aimag, breal, bimag));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmluYXJ5b3BfY29tcGxleF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2JpbmFyeW9wX2NvbXBsZXhfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCx1QkFBdUI7QUFDdkIsc0RBQXNEO0FBQ3RELGlCQUFpQjtBQUNqQixtQkFBbUI7QUFDbkIsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUc7SUFDOUIsSUFBSSxFQUFFLHVDQUF1QztJQUM3QyxJQUFJLEVBQUUsdUNBQXVDO0NBQzlDLENBQUM7QUFFRixNQUFNLE9BQU8sc0JBQXNCO0lBS2pDLFlBQVksRUFBVSxFQUFFLE1BQWdCLEVBQUUsTUFBZ0I7UUFKMUQsa0JBQWEsR0FBRyxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBS25ELElBQUksQ0FBQyxXQUFXLEdBQUcsWUFBWSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUUzRSxJQUFJLENBQUMsUUFBUSxHQUFHOzs7VUFHVixFQUFFOzs7Ozs7Ozs7O0tBVVAsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuLy8gKEFyICsgQWkpKEJyICsgQmkpID1cbi8vIEFyQnIgKyBBckJpICsgQWlCciArIEFpQmkgPSBBckJyIC0gQUIgKyBBckJpICsgQWlCclxuLy8gWXIgPSBBckJyIC0gQUJcbi8vIFlpID0gQXJCaSArIEFpQnJcbmV4cG9ydCBjb25zdCBDT01QTEVYX01VTFRJUExZID0ge1xuICBSRUFMOiAncmV0dXJuIGFyZWFsICogYnJlYWwgLSBhaW1hZyAqIGJpbWFnOycsXG4gIElNQUc6ICdyZXR1cm4gYXJlYWwgKiBiaW1hZyArIGFpbWFnICogYnJlYWw7J1xufTtcblxuZXhwb3J0IGNsYXNzIEJpbmFyeU9wQ29tcGxleFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBUmVhbCcsICdBSW1hZycsICdCUmVhbCcsICdCSW1hZyddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3Iob3A6IHN0cmluZywgYVNoYXBlOiBudW1iZXJbXSwgYlNoYXBlOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoYVNoYXBlLCBiU2hhcGUpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGJpbmFyeU9wQ29tcGxleChcbiAgICAgICAgICBmbG9hdCBhcmVhbCwgZmxvYXQgYWltYWcsIGZsb2F0IGJyZWFsLCBmbG9hdCBiaW1hZykge1xuICAgICAgICAke29wfVxuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IGFyZWFsID0gZ2V0QVJlYWxBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBhaW1hZyA9IGdldEFJbWFnQXRPdXRDb29yZHMoKTtcbiAgICAgICAgZmxvYXQgYnJlYWwgPSBnZXRCUmVhbEF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IGJpbWFnID0gZ2V0QkltYWdBdE91dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoYmluYXJ5T3BDb21wbGV4KGFyZWFsLCBhaW1hZywgYnJlYWwsIGJpbWFnKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, Multiply } from '@tensorflow/tfjs-core';\nimport * as binaryop_complex_gpu from '../binaryop_complex_gpu';\nimport { BinaryOpComplexProgram } from '../binaryop_complex_gpu';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nimport { multiplyImplCPU as cpuMultiply } from '../kernel_utils/shared';\nimport { complex } from './Complex';\nconst MUL = 'return a * b;';\nexport function multiply(args) {\n    const { inputs, backend } = args;\n    const { a, b } = inputs;\n    const dtype = backend_util.upcastType(a.dtype, b.dtype);\n    if (a.dtype === 'complex64') {\n        const aData = backend.texData.get(a.dataId);\n        const bData = backend.texData.get(b.dataId);\n        const realProgram = new BinaryOpComplexProgram(binaryop_complex_gpu.COMPLEX_MULTIPLY.REAL, a.shape, b.shape);\n        const imagProgram = new BinaryOpComplexProgram(binaryop_complex_gpu.COMPLEX_MULTIPLY.IMAG, a.shape, b.shape);\n        const inputs = [\n            {\n                dataId: aData.complexTensorInfos.real.dataId,\n                dtype: aData.complexTensorInfos.real.dtype,\n                shape: a.shape\n            },\n            {\n                dataId: aData.complexTensorInfos.imag.dataId,\n                dtype: aData.complexTensorInfos.imag.dtype,\n                shape: a.shape\n            },\n            {\n                dataId: bData.complexTensorInfos.real.dataId,\n                dtype: bData.complexTensorInfos.real.dtype,\n                shape: b.shape\n            },\n            {\n                dataId: bData.complexTensorInfos.imag.dataId,\n                dtype: bData.complexTensorInfos.imag.dtype,\n                shape: b.shape\n            }\n        ];\n        const realPart = backend.runWebGLProgram(realProgram, inputs, 'float32');\n        const imagPart = backend.runWebGLProgram(imagProgram, inputs, 'float32');\n        const complexOutput = complex({ inputs: { real: realPart, imag: imagPart }, backend });\n        backend.disposeIntermediateTensorInfo(realPart);\n        backend.disposeIntermediateTensorInfo(imagPart);\n        // TODO(annxingyuan): CPU forwarding for complex inputs.\n        return complexOutput;\n    }\n    if (backend.shouldExecuteOnCPU([a, b])) {\n        const aData = backend.texData.get(a.dataId);\n        const bData = backend.texData.get(b.dataId);\n        const [outValues, outShape] = cpuMultiply(a.shape, b.shape, aData.values, bData.values, dtype);\n        const out = backend.makeTensorInfo(outShape, dtype);\n        const outData = backend.texData.get(out.dataId);\n        outData.values = outValues;\n        return out;\n    }\n    let program;\n    if (env().getBool('WEBGL_PACK_BINARY_OPERATIONS')) {\n        program = new BinaryOpPackedProgram(MUL, a.shape, b.shape);\n    }\n    else {\n        program = new BinaryOpProgram(MUL, a.shape, b.shape);\n    }\n    return backend.runWebGLProgram(program, [a, b], dtype);\n}\nexport const multiplyConfig = {\n    kernelName: Multiply,\n    backendName: 'webgl',\n    kernelFunc: multiply\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlwbHkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTXVsdGlwbHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBZ0IsR0FBRyxFQUFnQixRQUFRLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFHdEgsT0FBTyxLQUFLLG9CQUFvQixNQUFNLHlCQUF5QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBQy9ELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNoRCxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBQUMsZUFBZSxJQUFJLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRFLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxHQUFHLEdBQUcsZUFBZSxDQUFDO0FBRTVCLE1BQU0sVUFBVSxRQUFRLENBQ3BCLElBQXVEO0lBQ3pELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3RCLE1BQU0sS0FBSyxHQUFHLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEQsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUMzQixNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDNUMsTUFBTSxLQUFLLEdBQUcsT0FBTyxD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LE1BQU0sQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO1FBQzNCLE9BQU8sR0FBRyxDQUFDO0tBQ1o7SUFFRCxJQUFJLE9BQThDLENBQUM7SUFDbkQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsRUFBRTtRQUNqRCxPQUFPLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDNUQ7U0FBTTtRQUNMLE9BQU8sR0FBRyxJQUFJLGVBQWUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDdEQ7SUFFRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ3pELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBCaW5hcnlJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBNdWx0aXBseSwgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCAqIGFzIGJpbmFyeW9wX2NvbXBsZXhfZ3B1IGZyb20gJy4uL2JpbmFyeW9wX2NvbXBsZXhfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BDb21wbGV4UHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfY29tcGxleF9ncHUnO1xuaW1wb3J0IHtCaW5hcnlPcFByb2dyYW19IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQge0JpbmFyeU9wUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge211bHRpcGx5SW1wbENQVSBhcyBjcHVNdWx0aXBseX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcblxuY29uc3QgTVVMID0gJ3JldHVybiBhICogYjsnO1xuXG5leHBvcnQgZnVuY3Rpb24gbXVsdGlwbHkoXG4gICAgYXJnczoge2lucHV0czogQmluYXJ5SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHthLCBifSA9IGlucHV0cztcbiAgY29uc3QgZHR5cGUgPSBiYWNrZW5kX3V0aWwudXBjYXN0VHlwZShhLmR0eXBlLCBiLmR0eXBlKTtcblxuICBpZiAoYS5kdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCBhRGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpO1xuICAgIGNvbnN0IGJEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCk7XG5cbiAgICBjb25zdCByZWFsUHJvZ3JhbSA9IG5ldyBCaW5hcnlPcENvbXBsZXhQcm9ncmFtKFxuICAgICAgICBiaW5hcnlvcF9jb21wbGV4X2dwdS5DT01QTEVYX01VTFRJUExZLlJFQUwsIGEuc2hhcGUsIGIuc2hhcGUpO1xuICAgIGNvbnN0IGltYWdQcm9ncmFtID0gbmV3IEJpbmFyeU9wQ29tcGxleFByb2dyYW0oXG4gICAgICAgIGJpbmFyeW9wX2NvbXBsZXhfZ3B1LkNPTVBMRVhfTVVMVElQTFkuSU1BRywgYS5zaGFwZSwgYi5zaGFwZSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBbXG4gICAgICB7XG4gICAgICAgIGRhdGFJZDogYURhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkLFxuICAgICAgICBkdHlwZTogYURhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZHR5cGUsXG4gICAgICAgIHNoYXBlOiBhLnNoYXBlXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBkYXRhSWQ6IGFEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmRhdGFJZCxcbiAgICAgICAgZHR5cGU6IGFEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnLmR0eXBlLFxuICAgICAgICBzaGFwZTogYS5zaGFwZVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgZGF0YUlkOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kYXRhSWQsXG4gICAgICAgIGR0eXBlOiBiRGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbC5kdHlwZSxcbiAgICAgICAgc2hhcGU6IGIuc2hhcGVcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGRhdGFJZDogYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZGF0YUlkLFxuICAgICAgICBkdHlwZTogYkRhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICAgIHNoYXBlOiBiLnNoYXBlXG4gICAgICB9XG4gICAgXTtcblxuICAgIGNvbnN0IHJlYWxQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocmVhbFByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGltYWdQcm9ncmFtLCBpbnB1dHMsICdmbG9hdDMyJyk7XG5cbiAgICBjb25zdCBjb21wbGV4T3V0cHV0ID1cbiAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbFBhcnQsIGltYWc6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWFsUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG5cbiAgICAvLyBUT0RPKGFubnhpbmd5dWFuKTogQ1BVIGZvcndhcmRpbmcgZm9yIGNvbXBsZXggaW5wdXRzLlxuICAgIHJldHVybiBjb21wbGV4T3V0cHV0O1xuICB9XG5cbiAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFthLCBiXSkpIHtcbiAgICBjb25zdCBhRGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoYS5kYXRhSWQpO1xuICAgIGNvbnN0IGJEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChiLmRhdGFJZCk7XG4gICAgY29uc3QgW291dFZhbHVlcywgb3V0U2hhcGVdID0gY3B1TXVsdGlwbHkoXG4gICAgICAgIGEuc2hhcGUsIGIuc2hhcGUsIGFEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LFxuICAgICAgICBiRGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheSwgZHR5cGUpO1xuXG4gICAgY29uc3Qgb3V0ID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRTaGFwZSwgZHR5cGUpO1xuICAgIGNvbnN0IG91dERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KG91dC5kYXRhSWQpO1xuICAgIG91dERhdGEudmFsdWVzID0gb3V0VmFsdWVzO1xuICAgIHJldHVybiBvdXQ7XG4gIH1cblxuICBsZXQgcHJvZ3JhbTogQmluYXJ5T3BQcm9ncmFtfEJpbmFyeU9wUGFja2VkUHJvZ3JhbTtcbiAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQklOQVJZX09QRVJBVElPTlMnKSkge1xuICAgIHByb2dyYW0gPSBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKE1VTCwgYS5zaGFwZSwgYi5zaGFwZSk7XG4gIH0gZWxzZSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBCaW5hcnlPcFByb2dyYW0oTVVMLCBhLnNoYXBlLCBiLnNoYXBlKTtcbiAgfVxuXG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbYSwgYl0sIGR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG11bHRpcGx5Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE11bHRpcGx5LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbXVsdGlwbHlcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ReshapePackedProgram } from '../reshape_packed_gpu';\nimport { getBatchDim, getRowsCols } from '../webgl_util';\nexport function packedReshape(input, afterShape, backend) {\n    const input3DShape = [getBatchDim(input.shape),\n        ...getRowsCols(input.shape)];\n    const input3D = {\n        dtype: input.dtype,\n        shape: input3DShape,\n        dataId: input.dataId\n    };\n    const afterShapeAs3D = [getBatchDim(afterShape),\n        ...getRowsCols(afterShape)];\n    const program = new ReshapePackedProgram(afterShapeAs3D, input3DShape);\n    const preventEagerUnpackingOfOutput = true;\n    const customValues = [input3DShape];\n    const output = backend.runWebGLProgram(program, [input3D], input.dtype, customValues, preventEagerUnpackingOfOutput);\n    return { dataId: output.dataId, shape: afterShape, dtype: output.dtype };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVsX3V0aWxzL3Jlc2hhcGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFdkQsTUFBTSxVQUFVLGFBQWEsQ0FDekIsS0FBaUIsRUFBRSxVQUFvQixFQUN2QyxPQUF5QjtJQUMzQixNQUFNLFlBQVksR0FDZCxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEdBQUcsV0FBVyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBNkIsQ0FBQztJQUM5RCxNQUFNLE9BQU8sR0FBZTtRQUMxQixLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUs7UUFDbEIsS0FBSyxFQUFFLFlBQVk7UUFDbkIsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO0tBQ3JCLENBQUM7SUFDRixNQUFNLGNBQWMsR0FDaEIsQ0FBQyxXQUFXLENBQUMsVUFBVSxDQUFDO1FBQ3ZCLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUE2QixDQUFDO0lBRTdELE1BQU0sT0FBTyxHQUFHLElBQUksb0JBQW9CLENBQUMsY0FBYyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sNkJBQTZCLEdBQUcsSUFBSSxDQUFDO0lBQzNDLE1BQU0sWUFBWSxHQUFHLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEMsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FDbEMsT0FBTyxFQUFFLENBQUMsT0FBTyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLEVBQzdDLDZCQUE2QixDQUFDLENBQUM7SUFDbkMsT0FBTyxFQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUMsQ0FBQztBQUN6RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge1RlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Jlc2hhcGVQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXNoYXBlX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtnZXRCYXRjaERpbSwgZ2V0Um93c0NvbHN9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFja2VkUmVzaGFwZShcbiAgICBpbnB1dDogVGVuc29ySW5mbywgYWZ0ZXJTaGFwZTogbnVtYmVyW10sXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCBpbnB1dDNEU2hhcGUgPVxuICAgICAgW2dldEJhdGNoRGltKGlucHV0LnNoYXBlKSxcbiAgICAgICAuLi5nZXRSb3dzQ29scyhpbnB1dC5zaGFwZSldIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcbiAgY29uc3QgaW5wdXQzRDogVGVuc29ySW5mbyA9IHtcbiAgICBkdHlwZTogaW5wdXQuZHR5cGUsXG4gICAgc2hhcGU6IGlucHV0M0RTaGFwZSxcbiAgICBkYXRhSWQ6IGlucHV0LmRhdGFJZFxuICB9O1xuICBjb25zdCBhZnRlclNoYXBlQXMzRCA9XG4gICAgICBbZ2V0QmF0Y2hEaW0oYWZ0ZXJTaGFwZSksXG4gICAgICAgLi4uZ2V0Um93c0NvbHMoYWZ0ZXJTaGFwZSldIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2hhcGVQYWNrZWRQcm9ncmFtKGFmdGVyU2hhcGVBczNELCBpbnB1dDNEU2hhcGUpO1xuICBjb25zdCBwcmV2ZW50RWFnZXJVbnBhY2tpbmdPZk91dHB1dCA9IHRydWU7XG4gIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtpbnB1dDNEU2hhcGVdO1xuICBjb25zdCBvdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtpbnB1dDNEXSwgaW5wdXQuZHR5cGUsIGN1c3RvbVZhbHVlcyxcbiAgICAgIHByZXZlbnRFYWdlclVucGFja2luZ09mT3V0cHV0KTtcbiAgcmV0dXJuIHtkYXRhSWQ6IG91dHB1dC5kYXRhSWQsIHNoYXBlOiBhZnRlclNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reshape, util } from '@tensorflow/tfjs-core';\nimport { packedReshape } from '../kernel_utils/reshape';\nimport { isReshapeFree } from '../webgl_util';\nexport function reshape(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { shape } = attrs;\n    const webglBackend = backend;\n    const xSize = util.sizeFromShape(x.shape);\n    const $shape = util.inferFromImplicitShape(shape, xSize);\n    const $xSize = util.sizeFromShape($shape);\n    util.assert(xSize === $xSize, () => `The new shape (${$shape}) has ${$xSize} elements and the old ` +\n        `shape (${x.shape}) has ${xSize} elements. The new shape and old ` +\n        `shape must have the same number of elements.`);\n    const xTexData = webglBackend.texData.get(x.dataId);\n    if (xTexData.isPacked && !isReshapeFree(x.shape, $shape) &&\n        !(xTexData.texture !== null && isReshapeFree(xTexData.shape, $shape))) {\n        return packedReshape(x, $shape, webglBackend);\n    }\n    webglBackend.incRef(x.dataId);\n    return { dataId: x.dataId, shape: $shape, dtype: x.dtype };\n}\nexport const reshapeConfig = {\n    kernelName: Reshape,\n    backendName: 'webgl',\n    kernelFunc: reshape\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZXNoYXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsT0FBTyxFQUEyQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd2SCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU1QyxNQUFNLFVBQVUsT0FBTyxDQUFDLElBSXZCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztJQUN0QixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUM7SUFFN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFDLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxLQUFLLE1BQU0sRUFDaEIsR0FBRyxFQUFFLENBQUMsa0JBQWtCLE1BQU0sU0FBUyxNQUFNLHdCQUF3QjtRQUNqRSxVQUFVLENBQUMsQ0FBQyxLQUFLLFNBQVMsS0FBSyxtQ0FBbUM7UUFDbEUsOENBQThDLENBQUMsQ0FBQztJQUV4RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDcEQsSUFBSSxRQUFRLENBQUMsUUFBUSxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDO1FBQ3BELENBQUMsQ0FBQyxRQUFRLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxFQUFFO1FBQ3pFLE9BQU8sYUFBYSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDL0M7SUFFRCxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QixPQUFPLEVBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzNELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmVzaGFwZSwgUmVzaGFwZUF0dHJzLCBSZXNoYXBlSW5wdXRzLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtwYWNrZWRSZXNoYXBlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVzaGFwZSc7XG5pbXBvcnQge2lzUmVzaGFwZUZyZWV9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaGFwZShhcmdzOiB7XG4gIGlucHV0czogUmVzaGFwZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFJlc2hhcGVBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaGFwZX0gPSBhdHRycztcbiAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZDtcblxuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgY29uc3QgJHNoYXBlID0gdXRpbC5pbmZlckZyb21JbXBsaWNpdFNoYXBlKHNoYXBlLCB4U2l6ZSk7XG4gIGNvbnN0ICR4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSgkc2hhcGUpO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgeFNpemUgPT09ICR4U2l6ZSxcbiAgICAgICgpID0+IGBUaGUgbmV3IHNoYXBlICgkeyRzaGFwZX0pIGhhcyAkeyR4U2l6ZX0gZWxlbWVudHMgYW5kIHRoZSBvbGQgYCArXG4gICAgICAgICAgYHNoYXBlICgke3guc2hhcGV9KSBoYXMgJHt4U2l6ZX0gZWxlbWVudHMuIFRoZSBuZXcgc2hhcGUgYW5kIG9sZCBgICtcbiAgICAgICAgICBgc2hhcGUgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cy5gKTtcblxuICBjb25zdCB4VGV4RGF0YSA9IHdlYmdsQmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG4gIGlmICh4VGV4RGF0YS5pc1BhY2tlZCAmJiAhaXNSZXNoYXBlRnJlZSh4LnNoYXBlLCAkc2hhcGUpICYmXG4gICAgICAhKHhUZXhEYXRhLnRleHR1cmUgIT09IG51bGwgJiYgaXNSZXNoYXBlRnJlZSh4VGV4RGF0YS5zaGFwZSwgJHNoYXBlKSkpIHtcbiAgICByZXR1cm4gcGFja2VkUmVzaGFwZSh4LCAkc2hhcGUsIHdlYmdsQmFja2VuZCk7XG4gIH1cblxuICB3ZWJnbEJhY2tlbmQuaW5jUmVmKHguZGF0YUlkKTtcblxuICByZXR1cm4ge2RhdGFJZDogeC5kYXRhSWQsIHNoYXBlOiAkc2hhcGUsIGR0eXBlOiB4LmR0eXBlfTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlc2hhcGVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaGFwZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlc2hhcGUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nexport class MeanProgram {\n    constructor(reduceInfo, divisor) {\n        this.variableNames = ['x'];\n        const { windowSize, batchSize, inSize, outSize } = reduceInfo;\n        this.outputShape = [batchSize, outSize];\n        const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n        const windowSizeVec4Remainder = windowSize % 4;\n        let updateSnippet = `sumValue += dot(values, ones);`;\n        if (divisor != null) {\n            const denominator = 1 / divisor;\n            updateSnippet = `sumValue += dot(values * ${util.isInt(denominator) ? denominator.toPrecision(2) :\n                denominator}, ones);`;\n        }\n        let checkOutOfBounds = '';\n        if (inSize % windowSize > 0) {\n            checkOutOfBounds = `\n        if (inIdx < 0 || inIdx >= ${inSize}) {\n          return 0.0;\n        }\n      `;\n        }\n        this.userCode = `\n      const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n      float getValue(int batch, int inIdx) {\n        ${checkOutOfBounds}\n        return getX(batch, inIdx);\n      }\n\n      void main() {\n        ivec2 coords = getOutputCoords();\n        int batch = coords[0];\n        int outIdx = coords[1];\n        int inOffset = outIdx * ${windowSize};\n\n        float sumValue = 0.0;\n\n        for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) {\n          int inIdx = inOffset + i;\n          vec4 values = vec4(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1),\n            getValue(batch, inIdx + 2),\n            getValue(batch, inIdx + 3)\n          );\n\n          ${updateSnippet}\n        }\n\n        int inIdx = inOffset + ${windowSizeNearestVec4};\n        if (${windowSizeVec4Remainder === 1}) {\n          vec4 values = vec4(getValue(batch, inIdx), 0.0, 0.0, 0.0);\n\n          ${updateSnippet}\n        } else if (${windowSizeVec4Remainder === 2}) {\n          vec4 values = vec4(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1), 0.0, 0.0);\n\n          ${updateSnippet}\n        } else if (${windowSizeVec4Remainder === 3}) {\n          vec4 values = vec4(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1),\n            getValue(batch, inIdx + 2), 0.0);\n\n          ${updateSnippet}\n        }\n        setOutput(sumValue);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVhbl9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL21lYW5fZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6RCxNQUFNLE9BQU8sV0FBVztJQUt0QixZQUFZLFVBQW1DLEVBQUUsT0FBZ0I7UUFKakUsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBS3BCLE1BQU0sRUFBQyxVQUFVLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxVQUFVLENBQUM7UUFDNUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUV4QyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLHVCQUF1QixHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFL0MsSUFBSSxhQUFhLEdBQUcsZ0NBQWdDLENBQUM7UUFDckQsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO1lBQ25CLE1BQU0sV0FBVyxHQUFHLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDaEMsYUFBYSxHQUFHLDRCQUNaLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDNUIsV0FBVyxVQUFVLENBQUM7U0FDckQ7UUFFRCxJQUFJLGdCQUFnQixHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLE1BQU0sR0FBRyxVQUFVLEdBQUcsQ0FBQyxFQUFFO1lBQzNCLGdCQUFnQixHQUFHO29DQUNXLE1BQU07OztPQUduQyxDQUFDO1NBQ0g7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7O1VBSVYsZ0JBQWdCOzs7Ozs7OztrQ0FRUSxVQUFVOzs7OzhCQUlkLHFCQUFxQjs7Ozs7Ozs7O1lBU3ZDLGFBQWE7OztpQ0FHUSxxQkFBcUI7Y0FDeEMsdUJBQXVCLEtBQUssQ0FBQzs7O1lBRy9CLGFBQWE7cUJBQ0osdUJBQXVCLEtBQUssQ0FBQzs7Ozs7WUFLdEMsYUFBYTtxQkFDSix1QkFBdUIsS0FBSyxDQUFDOzs7Ozs7WUFNdEMsYUFBYTs7OztLQUlwQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTWVhblByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihyZWR1Y2VJbmZvOiBiYWNrZW5kX3V0aWwuUmVkdWNlSW5mbywgZGl2aXNvcj86IG51bWJlcikge1xuICAgIGNvbnN0IHt3aW5kb3dTaXplLCBiYXRjaFNpemUsIGluU2l6ZSwgb3V0U2l6ZX0gPSByZWR1Y2VJbmZvO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcblxuICAgIGNvbnN0IHdpbmRvd1NpemVOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3Iod2luZG93U2l6ZSAvIDQpICogNDtcbiAgICBjb25zdCB3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9IHdpbmRvd1NpemUgJSA0O1xuXG4gICAgbGV0IHVwZGF0ZVNuaXBwZXQgPSBgc3VtVmFsdWUgKz0gZG90KHZhbHVlcywgb25lcyk7YDtcbiAgICBpZiAoZGl2aXNvciAhPSBudWxsKSB7XG4gICAgICBjb25zdCBkZW5vbWluYXRvciA9IDEgLyBkaXZpc29yO1xuICAgICAgdXBkYXRlU25pcHBldCA9IGBzdW1WYWx1ZSArPSBkb3QodmFsdWVzICogJHtcbiAgICAgICAgICB1dGlsLmlzSW50KGRlbm9taW5hdG9yKSA/IGRlbm9taW5hdG9yLnRvUHJlY2lzaW9uKDIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbm9taW5hdG9yfSwgb25lcyk7YDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tPdXRPZkJvdW5kcyA9ICcnO1xuICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgY2hlY2tPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gMC4wO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9OyBpICs9IDQpIHtcbiAgICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArIGk7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMiksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAzKVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cblxuICAgICAgICBpbnQgaW5JZHggPSBpbk9mZnNldCArICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTtcbiAgICAgICAgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KGdldFZhbHVlKGJhdGNoLCBpbklkeCksIDAuMCwgMC4wLCAwLjApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9IGVsc2UgaWYgKCR7d2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4KSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDEpLCAwLjAsIDAuMCk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH0gZWxzZSBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSwgMC4wKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoc3VtVmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ReduceProgram {\n    constructor(reduceInfo, reduceType) {\n        this.variableNames = ['x'];\n        const { windowSize, batchSize, inSize, outSize } = reduceInfo;\n        this.outputShape = [batchSize, outSize];\n        let initializationValue = '0.0';\n        let compareOp = ``;\n        if (reduceType === 'prod') {\n            initializationValue = '1.0';\n        }\n        else if (reduceType === 'min') {\n            // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n            initializationValue = '1.0 / 1e-20';\n            compareOp = `min`;\n        }\n        else if (reduceType === 'max') {\n            // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n            initializationValue = '-1.0 / 1e-20';\n            compareOp = `max`;\n        }\n        let returnValue = `${reduceType}(${reduceType}(${reduceType}(` +\n            'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n        if (reduceType === 'sum') {\n            returnValue = `sumValue`;\n        }\n        else if (reduceType === 'prod') {\n            returnValue = `prodValue`;\n        }\n        else if (reduceType === 'all') {\n            returnValue = `allValue`;\n        }\n        else if (reduceType === 'any') {\n            returnValue = `anyValue`;\n        }\n        const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n        const windowSizeVec4Remainder = windowSize % 4;\n        let updateSnippet = `\n      if (${reduceType === 'sum'}) {\n        sumValue += dot(values, ones);\n      } else if (${reduceType === 'prod'}) {\n        vec2 tmp = vec2(values[0], values[1]) * vec2(values[2], values[3]);\n        prodValue *= tmp[0] * tmp[1];\n      } else {\n        minMaxValue = ${compareOp}(values, minMaxValue);\n        if (${reduceType === 'min'} || ${reduceType === 'max'}) {\n          minMaxValue = ${compareOp}(values, minMaxValue);\n          bvec4 isNaN = isnan(values);\n          if (isNaN.r || isNaN.g || isNaN.b || isNaN.a) {\n            minMaxValue = vec4(NAN);\n          }\n        }\n      }\n    `;\n        let vecType = `vec4`;\n        if (reduceType === 'all') {\n            initializationValue = '1.0';\n            updateSnippet = `\n        bool reducedAllValue = all(values);\n        float floatedReducedAllValue = float(reducedAllValue);\n        allValue = float(allValue >= 1.0 && floatedReducedAllValue >= 1.0);\n      `;\n            vecType = `bvec4`;\n        }\n        else if (reduceType === 'any') {\n            initializationValue = '0.0';\n            updateSnippet = `\n        bool reducedAnyValue = any(values);\n        float floatedReducedAnyValue = float(reducedAnyValue);\n        anyValue = float(anyValue >= 1.0 || floatedReducedAnyValue >= 1.0);\n      `;\n            vecType = `bvec4`;\n        }\n        let checkOutOfBounds = '';\n        if (inSize % windowSize > 0) {\n            checkOutOfBounds = `\n        if (inIdx < 0 || inIdx >= ${inSize}) {\n          return initializationValue;\n        }\n      `;\n        }\n        this.userCode = `\n      const float initializationValue = ${initializationValue};\n      const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n      float getValue(int batch, int inIdx) {\n        ${checkOutOfBounds}\n        return getX(batch, inIdx);\n      }\n\n      void main() {\n        ivec2 coords = getOutputCoords();\n        int batch = coords[0];\n        int outIdx = coords[1];\n        int inOffset = outIdx * ${windowSize};\n\n        vec4 minMaxValue = vec4(${initializationValue});\n        float prodValue = 1.0;\n        float sumValue = 0.0;\n        float allValue = 1.0;\n        float anyValue = 0.0;\n\n        for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) {\n          int inIdx = inOffset + i;\n          ${vecType} values = ${vecType}(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1),\n            getValue(batch, inIdx + 2),\n            getValue(batch, inIdx + 3)\n          );\n\n          ${updateSnippet}\n        }\n\n        int inIdx = inOffset + ${windowSizeNearestVec4};\n        if (${windowSizeVec4Remainder === 1}) {\n          ${vecType} values = ${vecType}(\n            getValue(batch, inIdx),\n            initializationValue,\n            initializationValue,\n            initializationValue\n          );\n\n          ${updateSnippet}\n        } else if (${windowSizeVec4Remainder === 2}) {\n          ${vecType} values = ${vecType}(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1),\n            initializationValue,\n            initializationValue\n          );\n\n          ${updateSnippet}\n        } else if (${windowSizeVec4Remainder === 3}) {\n          ${vecType} values = ${vecType}(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1),\n            getValue(batch, inIdx + 2),\n            initializationValue\n          );\n\n          ${updateSnippet}\n        }\n        setOutput(${returnValue});\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcmVkdWNlX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUNJLFVBQW1DLEVBQ25DLFVBQWdEO1FBTnBELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQU9wQixNQUFNLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzVELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEMsSUFBSSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDaEMsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBRW5CLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUN6QixtQkFBbUIsR0FBRyxLQUFLLENBQUM7U0FDN0I7YUFBTSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDL0IsMkRBQTJEO1lBQzNELG1CQUFtQixHQUFHLGFBQWEsQ0FBQztZQUNwQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1NBQ25CO2FBQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1lBQy9CLDJEQUEyRDtZQUMzRCxtQkFBbUIsR0FBRyxjQUFjLENBQUM7WUFDckMsU0FBUyxHQUFHLEtBQUssQ0FBQztTQUNuQjtRQUVELElBQUksV0FBVyxHQUFHLEdBQUcsVUFBVSxJQUFJLFVBQVUsSUFBSSxVQUFVLEdBQUc7WUFDMUQsbUVBQW1FLENBQUM7UUFFeEUsSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1lBQ3hCLFdBQVcsR0FBRyxVQUFVLENBQUM7U0FDMUI7YUFBTSxJQUFJLFVBQVUsS0FBSyxNQUFNLEVBQUU7WUFDaEMsV0FBVyxHQUFHLFdBQVcsQ0FBQztTQUMzQjthQUFNLElBQUksVUFBVSxLQUFLLEtBQUssRUFBRTtZQUMvQixXQUFXLEdBQUcsVUFBVSxDQUFDO1NBQzFCO2FBQU0sSUFBSSxVQUFVLEtBQUssS0FBSyxFQUFFO1lBQy9CLFdBQVcsR0FBRyxVQUFVLENBQUM7U0FDMUI7UUFFRCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM3RCxNQUFNLHVCQUF1QixHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7UUFFL0MsSUFBSSxhQUFhLEdBQUc7WUFDWixVQUFVLEtBQUssS0FBSzs7bUJBRWIsVUFBVSxLQUFLLE1BQU07Ozs7d0JBSWhCLFNBQVM7Y0FDbkIsVUFBVSxLQUFLLEtBQUssT0FBTyxVQUFVLEtBQUssS0FBSzswQkFDbkMsU0FBUzs7Ozs7OztLQU85QixDQUFDO1FBRUYsSUFBSSxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBRXJCLElBQUksVUFBVSxLQUFLLEtBQUssRUFBRTtZQUN4QixtQkFBbUIsR0FBRyxLQUFLLENBQUM7WUFDNUIsYUFBYSxHQUFHOzs7O09BSWYsQ0FBQztZQUNGLE9BQU8sR0FBRyxPQUFPLENBQUM7U0FDbkI7YUFBTSxJQUFJLFVBQVUsS0FBSyxLQUFLLEVBQUU7WUFDL0IsbUJBQW1CLEdBQUcsS0FBSyxDQUFDO1lBQzVCLGFBQWEsR0FBRzs7OztPQUlmLENBQUM7WUFDRixPQUFPLEdBQUcsT0FBTyxDQUFDO1NBQ25CO1FBRUQsSUFBSSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDMUIsSUFBSSxNQUFNLEdBQUcsVUFBVSxHQUFHLENBQUMsRUFBRTtZQUMzQixnQkFBZ0IsR0FBRztvQ0FDVyxNQUFNOzs7T0FHbkMsQ0FBQztTQUNIO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRzswQ0FDc0IsbUJBQW1COzs7O1VBSW5ELGdCQUFnQjs7Ozs7Ozs7a0NBUVEsVUFBVTs7a0NBRVYsbUJBQW1COzs7Ozs7OEJBTXZCLHFCQUFxQjs7WUFFdkMsT0FBTyxhQUFhLE9BQU87Ozs7Ozs7WUFPM0IsYUFBYTs7O2lDQUdRLHFCQUFxQjtjQUN4Qyx1QkFBdUIsS0FBSyxDQUFDO1lBQy9CLE9BQU8sYUFBYSxPQUFPOzs7Ozs7O1lBTzNCLGFBQWE7cUJBQ0osdUJBQXVCLEtBQUssQ0FBQztZQUN0QyxPQUFPLGFBQWEsT0FBTzs7Ozs7OztZQU8zQixhQUFhO3FCQUNKLHVCQUF1QixLQUFLLENBQUM7WUFDdEMsT0FBTyxhQUFhLE9BQU87Ozs7Ozs7WUFPM0IsYUFBYTs7b0JBRUwsV0FBVzs7S0FFMUIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFJlZHVjZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHJlZHVjZUluZm86IGJhY2tlbmRfdXRpbC5SZWR1Y2VJbmZvLFxuICAgICAgcmVkdWNlVHlwZTogJ2FsbCd8J2FueSd8J21heCd8J21pbid8J3N1bSd8J3Byb2QnKSB7XG4gICAgY29uc3Qge3dpbmRvd1NpemUsIGJhdGNoU2l6ZSwgaW5TaXplLCBvdXRTaXplfSA9IHJlZHVjZUluZm87XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaFNpemUsIG91dFNpemVdO1xuXG4gICAgbGV0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBsZXQgY29tcGFyZU9wID0gYGA7XG5cbiAgICBpZiAocmVkdWNlVHlwZSA9PT0gJ3Byb2QnKSB7XG4gICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzEuMCc7XG4gICAgfSBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnbWluJykge1xuICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMS4wIC8gMWUtMjAnO1xuICAgICAgY29tcGFyZU9wID0gYG1pbmA7XG4gICAgfSBlbHNlIGlmIChyZWR1Y2VUeXBlID09PSAnbWF4Jykge1xuICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICAgIGNvbXBhcmVPcCA9IGBtYXhgO1xuICAgIH1cblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGAke3JlZHVjZVR5cGV9KCR7cmVkdWNlVHlwZX0oJHtyZWR1Y2VUeXBlfShgICtcbiAgICAgICAgJ21pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pJztcblxuICAgIGlmIChyZWR1Y2VUeXBlID09PSAnc3VtJykge1xuICAgICAgcmV0dXJuVmFsdWUgPSBgc3VtVmFsdWVgO1xuICAgIH0gZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ3Byb2QnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBwcm9kVmFsdWVgO1xuICAgIH0gZWxzZSBpZiAocmVkdWNlVHlwZSA9PT0gJ2FsbCcpIHtcbiAgICAgIHJldHVyblZhbHVlID0gYGFsbFZhbHVlYDtcbiAgICB9IGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdhbnknKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBhbnlWYWx1ZWA7XG4gICAgfVxuXG4gICAgY29uc3Qgd2luZG93U2l6ZU5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcih3aW5kb3dTaXplIC8gNCkgKiA0O1xuICAgIGNvbnN0IHdpbmRvd1NpemVWZWM0UmVtYWluZGVyID0gd2luZG93U2l6ZSAlIDQ7XG5cbiAgICBsZXQgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgIGlmICgke3JlZHVjZVR5cGUgPT09ICdzdW0nfSkge1xuICAgICAgICBzdW1WYWx1ZSArPSBkb3QodmFsdWVzLCBvbmVzKTtcbiAgICAgIH0gZWxzZSBpZiAoJHtyZWR1Y2VUeXBlID09PSAncHJvZCd9KSB7XG4gICAgICAgIHZlYzIgdG1wID0gdmVjMih2YWx1ZXNbMF0sIHZhbHVlc1sxXSkgKiB2ZWMyKHZhbHVlc1syXSwgdmFsdWVzWzNdKTtcbiAgICAgICAgcHJvZFZhbHVlICo9IHRtcFswXSAqIHRtcFsxXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbk1heFZhbHVlID0gJHtjb21wYXJlT3B9KHZhbHVlcywgbWluTWF4VmFsdWUpO1xuICAgICAgICBpZiAoJHtyZWR1Y2VUeXBlID09PSAnbWluJ30gfHwgJHtyZWR1Y2VUeXBlID09PSAnbWF4J30pIHtcbiAgICAgICAgICBtaW5NYXhWYWx1ZSA9ICR7Y29tcGFyZU9wfSh2YWx1ZXMsIG1pbk1heFZhbHVlKTtcbiAgICAgICAgICBidmVjNCBpc05hTiA9IGlzbmFuKHZhbHVlcyk7XG4gICAgICAgICAgaWYgKGlzTmFOLnIgfHwgaXNOYU4uZyB8fCBpc05hTi5iIHx8IGlzTmFOLmEpIHtcbiAgICAgICAgICAgIG1pbk1heFZhbHVlID0gdmVjNChOQU4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIGA7XG5cbiAgICBsZXQgdmVjVHlwZSA9IGB2ZWM0YDtcblxuICAgIGlmIChyZWR1Y2VUeXBlID09PSAnYWxsJykge1xuICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcxLjAnO1xuICAgICAgdXBkYXRlU25pcHBldCA9IGBcbiAgICAgICAgYm9vbCByZWR1Y2VkQWxsVmFsdWUgPSBhbGwodmFsdWVzKTtcbiAgICAgICAgZmxvYXQgZmxvYXRlZFJlZHVjZWRBbGxWYWx1ZSA9IGZsb2F0KHJlZHVjZWRBbGxWYWx1ZSk7XG4gICAgICAgIGFsbFZhbHVlID0gZmxvYXQoYWxsVmFsdWUgPj0gMS4wICYmIGZsb2F0ZWRSZWR1Y2VkQWxsVmFsdWUgPj0gMS4wKTtcbiAgICAgIGA7XG4gICAgICB2ZWNUeXBlID0gYGJ2ZWM0YDtcbiAgICB9IGVsc2UgaWYgKHJlZHVjZVR5cGUgPT09ICdhbnknKSB7XG4gICAgICBpbml0aWFsaXphdGlvblZhbHVlID0gJzAuMCc7XG4gICAgICB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgICBib29sIHJlZHVjZWRBbnlWYWx1ZSA9IGFueSh2YWx1ZXMpO1xuICAgICAgICBmbG9hdCBmbG9hdGVkUmVkdWNlZEFueVZhbHVlID0gZmxvYXQocmVkdWNlZEFueVZhbHVlKTtcbiAgICAgICAgYW55VmFsdWUgPSBmbG9hdChhbnlWYWx1ZSA+PSAxLjAgfHwgZmxvYXRlZFJlZHVjZWRBbnlWYWx1ZSA+PSAxLjApO1xuICAgICAgYDtcbiAgICAgIHZlY1R5cGUgPSBgYnZlYzRgO1xuICAgIH1cblxuICAgIGxldCBjaGVja091dE9mQm91bmRzID0gJyc7XG4gICAgaWYgKGluU2l6ZSAlIHdpbmRvd1NpemUgPiAwKSB7XG4gICAgICBjaGVja091dE9mQm91bmRzID0gYFxuICAgICAgICBpZiAoaW5JZHggPCAwIHx8IGluSWR4ID49ICR7aW5TaXplfSkge1xuICAgICAgICAgIHJldHVybiBpbml0aWFsaXphdGlvblZhbHVlO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG4gICAgICBjb25zdCB2ZWM0IG9uZXMgPSB2ZWM0KDEuMCwgMS4wLCAxLjAsIDEuMCk7XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tPdXRPZkJvdW5kc31cbiAgICAgICAgcmV0dXJuIGdldFgoYmF0Y2gsIGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBvdXRJZHggKiAke3dpbmRvd1NpemV9O1xuXG4gICAgICAgIHZlYzQgbWluTWF4VmFsdWUgPSB2ZWM0KCR7aW5pdGlhbGl6YXRpb25WYWx1ZX0pO1xuICAgICAgICBmbG9hdCBwcm9kVmFsdWUgPSAxLjA7XG4gICAgICAgIGZsb2F0IHN1bVZhbHVlID0gMC4wO1xuICAgICAgICBmbG9hdCBhbGxWYWx1ZSA9IDEuMDtcbiAgICAgICAgZmxvYXQgYW55VmFsdWUgPSAwLjA7XG5cbiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07IGkgKz0gNCkge1xuICAgICAgICAgIGludCBpbklkeCA9IGluT2Zmc2V0ICsgaTtcbiAgICAgICAgICAke3ZlY1R5cGV9IHZhbHVlcyA9ICR7dmVjVHlwZX0oXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMSksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAyKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDMpXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfVxuXG4gICAgICAgIGludCBpbklkeCA9IGluT2Zmc2V0ICsgJHt3aW5kb3dTaXplTmVhcmVzdFZlYzR9O1xuICAgICAgICBpZiAoJHt3aW5kb3dTaXplVmVjNFJlbWFpbmRlciA9PT0gMX0pIHtcbiAgICAgICAgICAke3ZlY1R5cGV9IHZhbHVlcyA9ICR7dmVjVHlwZX0oXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHgpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgICR7dmVjVHlwZX0gdmFsdWVzID0gJHt2ZWNUeXBlfShcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KCR7cmV0dXJuVmFsdWV9KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { MeanProgram } from '../mean_gpu';\nimport { ReduceProgram } from '../reduce_gpu';\n// Returns an array of configuration objects that describe each stage of the\n// reduction.\nfunction getReductionStages(inShape) {\n    const stages = [];\n    while (stages.length === 0 || stages[stages.length - 1].outSize !== 1) {\n        const outSize = stages.length ? stages[stages.length - 1].outSize : inShape[1];\n        const windowSize = backend_util.computeOptimalWindowSize(outSize);\n        stages.push({\n            inSize: outSize,\n            windowSize,\n            outSize: Math.ceil(outSize / windowSize)\n        });\n    }\n    return stages;\n}\nexport function reduce(x, dtype, reductionType, backend) {\n    const reductionStages = getReductionStages(x.shape);\n    let result = x;\n    for (let i = 0; i < reductionStages.length; i++) {\n        const { inSize, windowSize, outSize } = reductionStages[i];\n        let program;\n        let previousResult;\n        if (reductionType === 'mean') {\n            program = i === 0 ?\n                new MeanProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }, inSize) :\n                new MeanProgram({ windowSize, inSize, batchSize: x.shape[0], outSize });\n        }\n        else {\n            program = new ReduceProgram({ windowSize, inSize, batchSize: x.shape[0], outSize }, reductionType);\n        }\n        previousResult = result;\n        result = backend.runWebGLProgram(program, [result], dtype);\n        if (previousResult.dataId !== x.dataId) {\n            backend.disposeIntermediateTensorInfo(previousResult);\n        }\n    }\n    return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkdWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxfdXRpbHMvcmVkdWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQXVCLE1BQU0sdUJBQXVCLENBQUM7QUFHekUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBSTVDLDRFQUE0RTtBQUM1RSxhQUFhO0FBQ2IsU0FBUyxrQkFBa0IsQ0FBQyxPQUFpQjtJQUUzQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7SUFFbEIsT0FBTyxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLEtBQUssQ0FBQyxFQUFFO1FBQ3JFLE1BQU0sT0FBTyxHQUNULE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ25FLE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRSxNQUFNLENBQUMsSUFBSSxDQUFDO1lBQ1YsTUFBTSxFQUFFLE9BQU87WUFDZixVQUFVO1lBQ1YsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQztTQUN6QyxDQUFDLENBQUM7S0FDSjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLFVBQVUsTUFBTSxDQUNsQixDQUFhLEVBQUUsS0FBZSxFQUFFLGFBQTBCLEVBQzFELE9BQXlCO0lBQzNCLE1BQU0sZUFBZSxHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVwRCxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDZixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQyxNQUFNLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekQsSUFBSSxPQUFrQyxDQUFDO1FBQ3ZDLElBQUksY0FBMEIsQ0FBQztRQUMvQixJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUU7WUFDNUIsT0FBTyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztnQkFDZixJQUFJLFdBQVcsQ0FDWCxFQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztnQkFDbkUsSUFBSSxXQUFXLENBQUMsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7U0FDM0U7YUFBTTtZQUNMLE9BQU8sR0FBRyxJQUFJLGFBQWEsQ0FDdkIsRUFBQyxVQUFVLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLGFBQWEsQ0FBQyxDQUFDO1NBQzFFO1FBRUQsY0FBYyxHQUFHLE1BQU0sQ0FBQztRQUN4QixNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUUzRCxJQUFJLGNBQWMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLE1BQU0sRUFBRTtZQUN0QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsY0FBYyxDQUFDLENBQUM7U0FDdkQ7S0FDRjtJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEYXRhVHlwZSwgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TWVhblByb2dyYW19IGZyb20gJy4uL21lYW5fZ3B1JztcbmltcG9ydCB7UmVkdWNlUHJvZ3JhbX0gZnJvbSAnLi4vcmVkdWNlX2dwdSc7XG5cbnR5cGUgUmVkdWNlVHlwZXMgPSAnYWxsJ3wnYW55J3wnbWF4J3wnbWluJ3wnc3VtJ3wncHJvZCd8J21lYW4nO1xuXG4vLyBSZXR1cm5zIGFuIGFycmF5IG9mIGNvbmZpZ3VyYXRpb24gb2JqZWN0cyB0aGF0IGRlc2NyaWJlIGVhY2ggc3RhZ2Ugb2YgdGhlXG4vLyByZWR1Y3Rpb24uXG5mdW5jdGlvbiBnZXRSZWR1Y3Rpb25TdGFnZXMoaW5TaGFwZTogbnVtYmVyW10pOlxuICAgIEFycmF5PHtpblNpemU6IG51bWJlciwgd2luZG93U2l6ZTogbnVtYmVyLCBvdXRTaXplOiBudW1iZXJ9PiB7XG4gIGNvbnN0IHN0YWdlcyA9IFtdO1xuXG4gIHdoaWxlIChzdGFnZXMubGVuZ3RoID09PSAwIHx8IHN0YWdlc1tzdGFnZXMubGVuZ3RoIC0gMV0ub3V0U2l6ZSAhPT0gMSkge1xuICAgIGNvbnN0IG91dFNpemU6IG51bWJlciA9XG4gICAgICAgIHN0YWdlcy5sZW5ndGggPyBzdGFnZXNbc3RhZ2VzLmxlbmd0aCAtIDFdLm91dFNpemUgOiBpblNoYXBlWzFdO1xuICAgIGNvbnN0IHdpbmRvd1NpemUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU9wdGltYWxXaW5kb3dTaXplKG91dFNpemUpO1xuICAgIHN0YWdlcy5wdXNoKHtcbiAgICAgIGluU2l6ZTogb3V0U2l6ZSxcbiAgICAgIHdpbmRvd1NpemUsXG4gICAgICBvdXRTaXplOiBNYXRoLmNlaWwob3V0U2l6ZSAvIHdpbmRvd1NpemUpXG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gc3RhZ2VzO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcmVkdWNlKFxuICAgIHg6IFRlbnNvckluZm8sIGR0eXBlOiBEYXRhVHlwZSwgcmVkdWN0aW9uVHlwZTogUmVkdWNlVHlwZXMsXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCByZWR1Y3Rpb25TdGFnZXMgPSBnZXRSZWR1Y3Rpb25TdGFnZXMoeC5zaGFwZSk7XG5cbiAgbGV0IHJlc3VsdCA9IHg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVkdWN0aW9uU3RhZ2VzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3Qge2luU2l6ZSwgd2luZG93U2l6ZSwgb3V0U2l6ZX0gPSByZWR1Y3Rpb25TdGFnZXNbaV07XG5cbiAgICBsZXQgcHJvZ3JhbTogUmVkdWNlUHJvZ3JhbXxNZWFuUHJvZ3JhbTtcbiAgICBsZXQgcHJldmlvdXNSZXN1bHQ6IFRlbnNvckluZm87XG4gICAgaWYgKHJlZHVjdGlvblR5cGUgPT09ICdtZWFuJykge1xuICAgICAgcHJvZ3JhbSA9IGkgPT09IDAgP1xuICAgICAgICAgIG5ldyBNZWFuUHJvZ3JhbShcbiAgICAgICAgICAgICAge3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplOiB4LnNoYXBlWzBdLCBvdXRTaXplfSwgaW5TaXplKSA6XG4gICAgICAgICAgbmV3IE1lYW5Qcm9ncmFtKHt3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZTogeC5zaGFwZVswXSwgb3V0U2l6ZX0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9ncmFtID0gbmV3IFJlZHVjZVByb2dyYW0oXG4gICAgICAgICAge3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplOiB4LnNoYXBlWzBdLCBvdXRTaXplfSwgcmVkdWN0aW9uVHlwZSk7XG4gICAgfVxuXG4gICAgcHJldmlvdXNSZXN1bHQgPSByZXN1bHQ7XG4gICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Jlc3VsdF0sIGR0eXBlKTtcblxuICAgIGlmIChwcmV2aW91c1Jlc3VsdC5kYXRhSWQgIT09IHguZGF0YUlkKSB7XG4gICAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByZXZpb3VzUmVzdWx0KTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class TransposeProgram {\n    constructor(aShape, newDim) {\n        this.variableNames = ['A'];\n        const outputShape = new Array(aShape.length);\n        for (let i = 0; i < outputShape.length; i++) {\n            outputShape[i] = aShape[newDim[i]];\n        }\n        this.outputShape = outputShape;\n        this.rank = outputShape.length;\n        const dtype = getCoordsDataType(this.rank);\n        const switched = getSwitchedCoords(newDim);\n        this.userCode = `\n    void main() {\n      ${dtype} resRC = getOutputCoords();\n      setOutput(getA(${switched}));\n    }\n    `;\n    }\n}\nfunction getSwitchedCoords(newDim) {\n    const rank = newDim.length;\n    if (rank > 6) {\n        throw Error(`Transpose for rank ${rank} is not yet supported`);\n    }\n    const originalOrder = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w', 'resRC.u', 'resRC.v'];\n    const switchedCoords = new Array(rank);\n    for (let i = 0; i < newDim.length; i++) {\n        switchedCoords[newDim[i]] = originalOrder[i];\n    }\n    return switchedCoords.join();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3NlX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvdHJhbnNwb3NlX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQVksTUFBZ0IsRUFBRSxNQUFnQjtRQUw5QyxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFNcEIsTUFBTSxXQUFXLEdBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRTNDLElBQUksQ0FBQyxRQUFRLEdBQUc7O1FBRVosS0FBSzt1QkFDVSxRQUFROztLQUUxQixDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsU0FBUyxpQkFBaUIsQ0FBQyxNQUFnQjtJQUN6QyxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzNCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtRQUNaLE1BQU0sS0FBSyxDQUFDLHNCQUFzQixJQUFJLHVCQUF1QixDQUFDLENBQUM7S0FDaEU7SUFDRCxNQUFNLGFBQWEsR0FDZixDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDdkUsTUFBTSxjQUFjLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDdkMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUM5QztJQUNELE9BQU8sY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNwb3NlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICByYW5rOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSwgbmV3RGltOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheShhU2hhcGUubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvdXRwdXRTaGFwZVtpXSA9IGFTaGFwZVtuZXdEaW1baV1dO1xuICAgIH1cbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5yYW5rID0gb3V0cHV0U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICBjb25zdCBzd2l0Y2hlZCA9IGdldFN3aXRjaGVkQ29vcmRzKG5ld0RpbSk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICR7ZHR5cGV9IHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICBzZXRPdXRwdXQoZ2V0QSgke3N3aXRjaGVkfSkpO1xuICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFN3aXRjaGVkQ29vcmRzKG5ld0RpbTogbnVtYmVyW10pOiBzdHJpbmcge1xuICBjb25zdCByYW5rID0gbmV3RGltLmxlbmd0aDtcbiAgaWYgKHJhbmsgPiA2KSB7XG4gICAgdGhyb3cgRXJyb3IoYFRyYW5zcG9zZSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbiAgY29uc3Qgb3JpZ2luYWxPcmRlciA9XG4gICAgICBbJ3Jlc1JDLngnLCAncmVzUkMueScsICdyZXNSQy56JywgJ3Jlc1JDLncnLCAncmVzUkMudScsICdyZXNSQy52J107XG4gIGNvbnN0IHN3aXRjaGVkQ29vcmRzID0gbmV3IEFycmF5KHJhbmspO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld0RpbS5sZW5ndGg7IGkrKykge1xuICAgIHN3aXRjaGVkQ29vcmRzW25ld0RpbVtpXV0gPSBvcmlnaW5hbE9yZGVyW2ldO1xuICB9XG4gIHJldHVybiBzd2l0Y2hlZENvb3Jkcy5qb2luKCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getVecChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class TransposePackedProgram {\n    constructor(aShape, newDim) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        const outputShape = new Array(aShape.length);\n        for (let i = 0; i < outputShape.length; i++) {\n            outputShape[i] = aShape[newDim[i]];\n        }\n        this.outputShape = outputShape;\n        this.rank = outputShape.length;\n        if (this.rank > 6) {\n            throw Error(`Packed transpose for rank ${this.rank} is not yet supported.`);\n        }\n        const dtype = getCoordsDataType(this.rank);\n        const outputOrder = getVecChannels('rc', this.rank);\n        const switchedOrder = new Array(this.rank);\n        for (let i = 0; i < newDim.length; i++) {\n            switchedOrder[newDim[i]] = outputOrder[i];\n        }\n        const innerDims = `vec2(${switchedOrder.slice(-2).join()})`;\n        const nextColumn = `++${outputOrder[this.rank - 1]} < ${outputShape[this.rank - 1]}`;\n        const getc = `getChannel(getA(${switchedOrder.join()}), ${innerDims})`;\n        this.userCode = `\n    void main() {\n      ${dtype} rc = getOutputCoords();\n      vec4 result = vec4(0.);\n      result[0] = ${getc};\n      if(${nextColumn}) {\n        result[1] = ${getc};\n      }\n      --${outputOrder[this.rank - 1]};\n      if(++${outputOrder[this.rank - 2]} < ${outputShape[this.rank - 2]}) {\n        result[2] = ${getc};\n        if(${nextColumn}) {\n          result[3] = ${getc};\n        }\n      }\n      setOutput(result);\n    }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNwb3NlX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3RyYW5zcG9zZV9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sc0JBQXNCO0lBUWpDLFlBQVksTUFBZ0IsRUFBRSxNQUFnQjtRQVA5QyxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFJdEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFHbEIsTUFBTSxXQUFXLEdBQWEsSUFBSSxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3ZELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxXQUFXLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNDLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsSUFBSSxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNqQixNQUFNLEtBQUssQ0FDUCw2QkFBNkIsSUFBSSxDQUFDLElBQUksd0JBQXdCLENBQUMsQ0FBQztTQUNyRTtRQUNELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUUzQyxNQUFNLFdBQVcsR0FBRyxjQUFjLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNwRCxNQUFNLGFBQWEsR0FBRyxJQUFJLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDdEMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzQztRQUNELE1BQU0sU0FBUyxHQUFHLFFBQVEsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUM7UUFDNUQsTUFBTSxVQUFVLEdBQ1osS0FBSyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLG1CQUFtQixhQUFhLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUyxHQUFHLENBQUM7UUFFdkUsSUFBSSxDQUFDLFFBQVEsR0FBRzs7UUFFWixLQUFLOztvQkFFTyxJQUFJO1dBQ2IsVUFBVTtzQkFDQyxJQUFJOztVQUVoQixXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7YUFDdkIsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3NCQUNqRCxJQUFJO2FBQ2IsVUFBVTt3QkFDQyxJQUFJOzs7OztLQUt2QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0VmVjQ2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFRyYW5zcG9zZVBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcmFuazogbnVtYmVyO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKGFTaGFwZTogbnVtYmVyW10sIG5ld0RpbTogbnVtYmVyW10pIHtcbiAgICBjb25zdCBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoYVNoYXBlLmxlbmd0aCk7XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdXRwdXRTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgICAgb3V0cHV0U2hhcGVbaV0gPSBhU2hhcGVbbmV3RGltW2ldXTtcbiAgICB9XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMucmFuayA9IG91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICBpZiAodGhpcy5yYW5rID4gNikge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYFBhY2tlZCB0cmFuc3Bvc2UgZm9yIHJhbmsgJHt0aGlzLnJhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkLmApO1xuICAgIH1cbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHRoaXMucmFuayk7XG5cbiAgICBjb25zdCBvdXRwdXRPcmRlciA9IGdldFZlY0NoYW5uZWxzKCdyYycsIHRoaXMucmFuayk7XG4gICAgY29uc3Qgc3dpdGNoZWRPcmRlciA9IG5ldyBBcnJheSh0aGlzLnJhbmspO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbmV3RGltLmxlbmd0aDsgaSsrKSB7XG4gICAgICBzd2l0Y2hlZE9yZGVyW25ld0RpbVtpXV0gPSBvdXRwdXRPcmRlcltpXTtcbiAgICB9XG4gICAgY29uc3QgaW5uZXJEaW1zID0gYHZlYzIoJHtzd2l0Y2hlZE9yZGVyLnNsaWNlKC0yKS5qb2luKCl9KWA7XG4gICAgY29uc3QgbmV4dENvbHVtbiA9XG4gICAgICAgIGArKyR7b3V0cHV0T3JkZXJbdGhpcy5yYW5rIC0gMV19IDwgJHtvdXRwdXRTaGFwZVt0aGlzLnJhbmsgLSAxXX1gO1xuICAgIGNvbnN0IGdldGMgPSBgZ2V0Q2hhbm5lbChnZXRBKCR7c3dpdGNoZWRPcmRlci5qb2luKCl9KSwgJHtpbm5lckRpbXN9KWA7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICR7ZHR5cGV9IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgcmVzdWx0WzBdID0gJHtnZXRjfTtcbiAgICAgIGlmKCR7bmV4dENvbHVtbn0pIHtcbiAgICAgICAgcmVzdWx0WzFdID0gJHtnZXRjfTtcbiAgICAgIH1cbiAgICAgIC0tJHtvdXRwdXRPcmRlclt0aGlzLnJhbmsgLSAxXX07XG4gICAgICBpZigrKyR7b3V0cHV0T3JkZXJbdGhpcy5yYW5rIC0gMl19IDwgJHtvdXRwdXRTaGFwZVt0aGlzLnJhbmsgLSAyXX0pIHtcbiAgICAgICAgcmVzdWx0WzJdID0gJHtnZXRjfTtcbiAgICAgICAgaWYoJHtuZXh0Q29sdW1ufSkge1xuICAgICAgICAgIHJlc3VsdFszXSA9ICR7Z2V0Y307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { transposeImplCPU } from '../kernel_utils/shared';\nimport { TransposeProgram } from '../transpose_gpu';\nimport { TransposePackedProgram } from '../transpose_packed_gpu';\nexport function transposeImpl(x, perm, backend) {\n    const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n        new TransposePackedProgram(x.shape, perm) :\n        new TransposeProgram(x.shape, perm);\n    return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport { transposeImplCPU };\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvVHJhbnNwb3NlX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBYSxNQUFNLHVCQUF1QixDQUFDO0FBR3RELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRS9ELE1BQU0sVUFBVSxhQUFhLENBQ3pCLENBQWEsRUFBRSxJQUFjLEVBQUUsT0FBeUI7SUFDMUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztRQUMxRCxJQUFJLHNCQUFzQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzQyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7VHJhbnNwb3NlUHJvZ3JhbX0gZnJvbSAnLi4vdHJhbnNwb3NlX2dwdSc7XG5pbXBvcnQge1RyYW5zcG9zZVBhY2tlZFByb2dyYW19IGZyb20gJy4uL3RyYW5zcG9zZV9wYWNrZWRfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zcG9zZUltcGwoXG4gICAgeDogVGVuc29ySW5mbywgcGVybTogbnVtYmVyW10sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgIG5ldyBUcmFuc3Bvc2VQYWNrZWRQcm9ncmFtKHguc2hhcGUsIHBlcm0pIDpcbiAgICAgIG5ldyBUcmFuc3Bvc2VQcm9ncmFtKHguc2hhcGUsIHBlcm0pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IHt0cmFuc3Bvc2VJbXBsQ1BVfTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, sumOutType, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from './Reshape';\nimport { transposeImpl } from './Transpose_impl';\nexport function sumImpl(x, axis, keepDims, backend) {\n    const reductionIndices = axis;\n    const xRank = x.shape.length;\n    const origAxes = util.parseAxisParam(reductionIndices, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n    const sumInputIsTransposed = permutedAxes != null;\n    let sumInput = x;\n    if (sumInputIsTransposed) {\n        sumInput = transposeImpl(x, permutedAxes, backend);\n        axes = backend_util.getInnerMostAxes(axes.length, xRank);\n    }\n    backend_util.assertAxesAreInnerMostDims('sum', axes, xRank);\n    const [sumOutShape, reduceShape] = backend_util.computeOutAndReduceShapes(sumInput.shape, axes);\n    let outShape = sumOutShape;\n    if (keepDims) {\n        // rather than reshape at the end, set the target shape here.\n        outShape = backend_util.expandShapeToKeepDim(sumOutShape, origAxes);\n    }\n    const inSize = util.sizeFromShape(reduceShape);\n    const xSize = util.sizeFromShape(x.shape);\n    const batchSize = xSize / inSize;\n    const reshapedInput = reshape({ inputs: { x: sumInput }, attrs: { shape: [batchSize, inSize] }, backend });\n    const outType = sumOutType(x.dtype);\n    const reduced = reduce(reshapedInput, outType, 'sum', backend);\n    const out = reshape({ inputs: { x: reduced }, attrs: { shape: outShape }, backend });\n    backend.disposeIntermediateTensorInfo(reshapedInput);\n    backend.disposeIntermediateTensorInfo(reduced);\n    if (sumInputIsTransposed) {\n        backend.disposeIntermediateTensorInfo(sumInput);\n    }\n    return out;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VtX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3VtX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQWMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakYsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRS9DLE1BQU0sVUFBVSxPQUFPLENBQ25CLENBQWEsRUFBRSxJQUFxQixFQUFFLFFBQWlCLEVBQ3ZELE9BQXlCO0lBQzNCLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO0lBRTlCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBRTdCLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2hFLElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sb0JBQW9CLEdBQUcsWUFBWSxJQUFJLElBQUksQ0FBQztJQUVsRCxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUM7SUFDakIsSUFBSSxvQkFBb0IsRUFBRTtRQUN4QixRQUFRLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFbkQsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzFEO0lBRUQsWUFBWSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsR0FDNUIsWUFBWSxDQUFDLHlCQUF5QixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFakUsSUFBSSxRQUFRLEdBQUcsV0FBVyxDQUFDO0lBQzNCLElBQUksUUFBUSxFQUFFO1FBQ1osNkRBQTZEO1FBQzdELFFBQVEsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0tBQ3JFO0lBRUQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FDekIsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUUzRSxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxhQUFhLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxNQUFNLEdBQUcsR0FDTCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFFdkUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUMvQyxJQUFJLG9CQUFvQixFQUFFO1FBQ3hCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztLQUNqRDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHN1bU91dFR5cGUsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmltcG9ydCB7dHJhbnNwb3NlSW1wbH0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdW1JbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIGF4aXM6IG51bWJlcnxudW1iZXJbXSwga2VlcERpbXM6IGJvb2xlYW4sXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCByZWR1Y3Rpb25JbmRpY2VzID0gYXhpcztcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShyZWR1Y3Rpb25JbmRpY2VzLCB4LnNoYXBlKTtcbiAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gIGNvbnN0IHN1bUlucHV0SXNUcmFuc3Bvc2VkID0gcGVybXV0ZWRBeGVzICE9IG51bGw7XG5cbiAgbGV0IHN1bUlucHV0ID0geDtcbiAgaWYgKHN1bUlucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgc3VtSW5wdXQgPSB0cmFuc3Bvc2VJbXBsKHgsIHBlcm11dGVkQXhlcywgYmFja2VuZCk7XG5cbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgYXhlcywgeFJhbmspO1xuICBjb25zdCBbc3VtT3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhzdW1JbnB1dC5zaGFwZSwgYXhlcyk7XG5cbiAgbGV0IG91dFNoYXBlID0gc3VtT3V0U2hhcGU7XG4gIGlmIChrZWVwRGltcykge1xuICAgIC8vIHJhdGhlciB0aGFuIHJlc2hhcGUgYXQgdGhlIGVuZCwgc2V0IHRoZSB0YXJnZXQgc2hhcGUgaGVyZS5cbiAgICBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShzdW1PdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICB9XG5cbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0IGJhdGNoU2l6ZSA9IHhTaXplIC8gaW5TaXplO1xuICBjb25zdCByZXNoYXBlZElucHV0ID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4OiBzdW1JbnB1dH0sIGF0dHJzOiB7c2hhcGU6IFtiYXRjaFNpemUsIGluU2l6ZV19LCBiYWNrZW5kfSk7XG5cbiAgY29uc3Qgb3V0VHlwZSA9IHN1bU91dFR5cGUoeC5kdHlwZSk7XG5cbiAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShyZXNoYXBlZElucHV0LCBvdXRUeXBlLCAnc3VtJywgYmFja2VuZCk7XG4gIGNvbnN0IG91dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9LCBiYWNrZW5kfSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcbiAgaWYgKHN1bUlucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhzdW1JbnB1dCk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sum } from '@tensorflow/tfjs-core';\nimport { sumImpl } from './Sum_impl';\nexport function sum(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    return sumImpl(x, axis, keepDims, backend);\n}\nexport const sumConfig = {\n    kernelName: Sum,\n    backendName: 'webgl',\n    kernelFunc: sum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1N1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLEdBQUcsRUFBc0IsTUFBTSx1QkFBdUIsQ0FBQztBQUl6RixPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE1BQU0sVUFBVSxHQUFHLENBQ2YsSUFBcUU7SUFDdkUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBRXRDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0IsT0FBTyxPQUFPLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDN0MsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN1bSwgU3VtQXR0cnMsIFN1bUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtzdW1JbXBsfSBmcm9tICcuL1N1bV9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN1bShcbiAgICBhcmdzOiB7aW5wdXRzOiBTdW1JbnB1dHMsIGF0dHJzOiBTdW1BdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcblxuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICByZXR1cm4gc3VtSW1wbCh4LCBheGlzLCBrZWVwRGltcywgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBzdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3VtLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3VtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transpose } from '@tensorflow/tfjs-core';\nimport { transposeImpl } from './Transpose_impl';\nimport { transposeImplCPU as cpuTranspose } from './Transpose_impl';\nexport function transpose(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { perm } = attrs;\n    const webglBackend = backend;\n    const xRank = x.shape.length;\n    const newShape = new Array(xRank);\n    for (let i = 0; i < newShape.length; i++) {\n        newShape[i] = x.shape[perm[i]];\n    }\n    let out;\n    if (webglBackend.shouldExecuteOnCPU([x])) {\n        const xTexData = webglBackend.texData.get(x.dataId);\n        const values = xTexData.values;\n        const outValues = cpuTranspose(values, x.shape, x.dtype, perm, newShape);\n        out = webglBackend.makeTensorInfo(newShape, x.dtype);\n        const outData = webglBackend.texData.get(out.dataId);\n        outData.values = outValues;\n    }\n    else {\n        out = transposeImpl(x, perm, webglBackend);\n    }\n    return out;\n}\nexport const transposeConfig = {\n    kernelName: Transpose,\n    backendName: 'webgl',\n    kernelFunc: transpose\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNwb3NlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1RyYW5zcG9zZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLFNBQVMsRUFBOEMsTUFBTSx1QkFBdUIsQ0FBQztBQUluSSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDL0MsT0FBTyxFQUFDLGdCQUFnQixJQUFJLFlBQVksRUFBQyxNQUFNLGtCQUFrQixDQUFDO0FBRWxFLE1BQU0sVUFBVSxTQUFTLENBQUMsSUFJekI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQztJQUU3QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN4QyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztLQUNoQztJQUVELElBQUksR0FBZSxDQUFDO0lBQ3BCLElBQUksWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4QyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQW9CLENBQUM7UUFDN0MsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRXpFLEdBQUcsR0FBRyxZQUFZLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDckQsTUFBTSxPQUFPLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDO0tBQzVCO1NBQU07UUFDTCxHQUFHLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDNUM7SUFDRCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHJhbnNwb3NlLCBUcmFuc3Bvc2VBdHRycywgVHJhbnNwb3NlSW5wdXRzLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge3RyYW5zcG9zZUltcGx9IGZyb20gJy4vVHJhbnNwb3NlX2ltcGwnO1xuaW1wb3J0IHt0cmFuc3Bvc2VJbXBsQ1BVIGFzIGNwdVRyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiB0cmFuc3Bvc2UoYXJnczoge1xuICBpbnB1dHM6IFRyYW5zcG9zZUlucHV0cyxcbiAgYXR0cnM6IFRyYW5zcG9zZUF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge3Blcm19ID0gYXR0cnM7XG4gIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQ7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBuZXdTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoeFJhbmspO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgbmV3U2hhcGVbaV0gPSB4LnNoYXBlW3Blcm1baV1dO1xuICB9XG5cbiAgbGV0IG91dDogVGVuc29ySW5mbztcbiAgaWYgKHdlYmdsQmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKSkge1xuICAgIGNvbnN0IHhUZXhEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBjcHVUcmFuc3Bvc2UodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtLCBuZXdTaGFwZSk7XG5cbiAgICBvdXQgPSB3ZWJnbEJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUpO1xuICAgIGNvbnN0IG91dERhdGEgPSB3ZWJnbEJhY2tlbmQudGV4RGF0YS5nZXQob3V0LmRhdGFJZCk7XG4gICAgb3V0RGF0YS52YWx1ZXMgPSBvdXRWYWx1ZXM7XG4gIH0gZWxzZSB7XG4gICAgb3V0ID0gdHJhbnNwb3NlSW1wbCh4LCBwZXJtLCB3ZWJnbEJhY2tlbmQpO1xuICB9XG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCB0cmFuc3Bvc2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVHJhbnNwb3NlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdHJhbnNwb3NlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { broadcast_util, upcastType, util } from '@tensorflow/tfjs-core';\nimport { mapActivationToShaderProgram } from '../kernel_utils/kernel_funcs_utils';\nimport { MatMulPackedProgram } from '../mulmat_packed_gpu';\nimport { multiply } from './Multiply';\nimport { reshape } from './Reshape';\nimport { sum } from './Sum';\nimport { transpose } from './Transpose';\n// Empirically determined minimal shared dimension in matmul before we forward\n// to a.mul(b).sum() in order to take advantage of GPU parallelism. See\n// https://github.com/tensorflow/tfjs-core/pull/1379 for benchmarks.\nexport const MATMUL_SHARED_DIM_THRESHOLD = 1000;\nexport function batchMatMulImpl({ a, b, transposeA, transposeB, backend, bias = null, preluActivationWeights = null, leakyreluAlpha = 0, activation = null }) {\n    const aRank = a.shape.length;\n    const bRank = b.shape.length;\n    const innerShapeA = transposeA ? a.shape[aRank - 2] : a.shape[aRank - 1];\n    const innerShapeB = transposeB ? b.shape[bRank - 1] : b.shape[bRank - 2];\n    const outerShapeA = transposeA ? a.shape[aRank - 1] : a.shape[aRank - 2];\n    const outerShapeB = transposeB ? b.shape[bRank - 2] : b.shape[bRank - 1];\n    const outerDimsA = a.shape.slice(0, -2);\n    const outerDimsB = b.shape.slice(0, -2);\n    const batchDimA = util.sizeFromShape(outerDimsA);\n    const batchDimB = util.sizeFromShape(outerDimsB);\n    const outShapeOuterDims = broadcast_util.assertAndGetBroadcastShape(a.shape.slice(0, -2), b.shape.slice(0, -2));\n    const outShape = outShapeOuterDims.concat([outerShapeA, outerShapeB]);\n    util.assert(innerShapeA === innerShapeB, () => `Error in matMul: inner shapes (${innerShapeA}) and (` +\n        `${innerShapeB}) of Tensors with shapes ${a.shape} and ` +\n        `${b.shape} and transposeA=${transposeA}` +\n        ` and transposeB=${transposeB} must match.`);\n    const a3dShape = transposeA ?\n        [batchDimA, innerShapeA, outerShapeA] :\n        [batchDimA, outerShapeA, innerShapeA];\n    const b3dShape = transposeB ?\n        [batchDimB, outerShapeB, innerShapeB] :\n        [batchDimB, innerShapeB, outerShapeB];\n    // The rest of the implementation is designed to operate on rank-3 tensors\n    const a3d = reshape({ inputs: { x: a }, backend, attrs: { shape: a3dShape } });\n    const b3d = reshape({ inputs: { x: b }, backend, attrs: { shape: b3dShape } });\n    const intermediates = [a3d, b3d];\n    const batchDim = Math.max(batchDimA, batchDimB);\n    const sharedDim = transposeA ? a3d.shape[1] : a3d.shape[2];\n    const hasBias = bias != null;\n    const hasPreluActivationWeights = preluActivationWeights != null;\n    const hasLeakyreluAlpha = activation === 'leakyrelu';\n    const fusedActivation = activation != null ?\n        mapActivationToShaderProgram(activation, true) :\n        null;\n    const containsFusedOps = hasBias || hasPreluActivationWeights ||\n        hasLeakyreluAlpha || fusedActivation != null;\n    let out;\n    // Since the matrices are vectors, it is faster to call mul().sum()\n    // because sum() is O(sqrt(N)) due to divide-and-conquer.\n    if ((outerShapeA === 1 || outerShapeB === 1) &&\n        sharedDim > MATMUL_SHARED_DIM_THRESHOLD && containsFusedOps === false) {\n        let aVec = a3d;\n        let bVec = b3d;\n        if (transposeA) {\n            aVec = transpose({ inputs: { x: a3d }, backend, attrs: { perm: [0, 2, 1] } });\n            intermediates.push(aVec);\n        }\n        if (transposeB) {\n            bVec = transpose({ inputs: { x: b3d }, backend, attrs: { perm: [0, 2, 1] } });\n            intermediates.push(bVec);\n        }\n        const shouldReshapeA = outerShapeB !== 1;\n        const shouldReshapeB = outerShapeB === 1;\n        let aVec3d = aVec;\n        if (shouldReshapeA) {\n            aVec3d = reshape({\n                inputs: { x: aVec },\n                backend,\n                attrs: { shape: [batchDim, sharedDim, 1] }\n            });\n            intermediates.push(aVec3d);\n        }\n        const axis = outerShapeB === 1 ? 2 : 1;\n        let bVec3d = bVec;\n        if (shouldReshapeB) {\n            bVec3d = reshape({\n                inputs: { x: bVec },\n                backend,\n                attrs: { shape: [batchDim, 1, sharedDim] }\n            });\n            intermediates.push(bVec3d);\n        }\n        const product = multiply({ inputs: { a: aVec3d, b: bVec3d }, backend });\n        out = sum({ inputs: { x: product }, backend, attrs: { axis, keepDims: true } });\n        intermediates.push(product);\n    }\n    else {\n        const dtype = upcastType(a.dtype, b.dtype);\n        const program = new MatMulPackedProgram(a3dShape, b3dShape, [batchDim, outerShapeA, outerShapeB], transposeA, transposeB, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n        const inputs = [a3d, b3d];\n        if (bias != null) {\n            inputs.push(bias);\n        }\n        if (hasPreluActivationWeights) {\n            inputs.push(preluActivationWeights);\n        }\n        if (hasLeakyreluAlpha) {\n            const $leakyreluAlpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(leakyreluAlpha, 'float32'));\n            inputs.push($leakyreluAlpha);\n            intermediates.push($leakyreluAlpha);\n        }\n        out = backend.runWebGLProgram(program, inputs, dtype);\n    }\n    const outReshaped = reshape({ inputs: { x: out }, backend, attrs: { shape: outShape } });\n    intermediates.push(out);\n    for (const i of intermediates) {\n        backend.disposeIntermediateTensorInfo(i);\n    }\n    return outReshaped;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hNYXRNdWxfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9CYXRjaE1hdE11bF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxjQUFjLEVBQWMsVUFBVSxFQUFFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pHLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ2hGLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRXpELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDcEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsOEVBQThFO0FBQzlFLHVFQUF1RTtBQUN2RSxvRUFBb0U7QUFDcEUsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQUcsSUFBSSxDQUFDO0FBY2hELE1BQU0sVUFBVSxlQUFlLENBQUMsRUFDOUIsQ0FBQyxFQUNELENBQUMsRUFDRCxVQUFVLEVBQ1YsVUFBVSxFQUNWLE9BQU8sRUFDUCxJQUFJLEdBQUcsSUFBSSxFQUNYLHNCQUFzQixHQUFHLElBQUksRUFDN0IsY0FBYyxHQUFHLENBQUMsRUFDbEIsVUFBVSxHQUFHLElBQUksRUFDQztJQUNsQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM3QixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV6RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQztJQUV6RSxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN4QyxNQUFNLFVBQVUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUV4QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7SUFFakQsTUFBTSxpQkFBaUIsR0FBRyxjQUFjLENBQUMsMEJBQTBCLENBQy9ELENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENB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LE9BQU8sQ0FBQyxjQUFjLENBQzFDLEVBQUUsRUFBRSxTQUFTLEVBQ2IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGNBQWlDLEVBQUUsU0FBUyxDQUFDLENBQUMsQ0FBQztZQUMxRSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzdCLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDckM7UUFFRCxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxXQUFXLEdBQ2IsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQ25FLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUU7UUFDN0IsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFDO0lBQ0QsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGJyb2FkY2FzdF91dGlsLCBUZW5zb3JJbmZvLCB1cGNhc3RUeXBlLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHttYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7TWF0TXVsUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vbXVsbWF0X3BhY2tlZF9ncHUnO1xuXG5pbXBvcnQge211bHRpcGx5fSBmcm9tICcuL011bHRpcGx5JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c3VtfSBmcm9tICcuL1N1bSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG4vLyBFbXBpcmljYWxseSBkZXRlcm1pbmVkIG1pbmltYWwgc2hhcmVkIGRpbWVuc2lvbiBpbiBtYXRtdWwgYmVmb3JlIHdlIGZvcndhcmRcbi8vIHRvIGEubXVsKGIpLnN1bSgpIGluIG9yZGVyIHRvIHRha2UgYWR2YW50YWdlIG9mIEdQVSBwYXJhbGxlbGlzbS4gU2VlXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzLWNvcmUvcHVsbC8xMzc5IGZvciBiZW5jaG1hcmtzLlxuZXhwb3J0IGNvbnN0IE1BVE1VTF9TSEFSRURfRElNX1RIUkVTSE9MRCA9IDEwMDA7XG5cbnR5cGUgQmF0Y2hNYXRNdWxDb25maWcgPSB7XG4gIGE6IFRlbnNvckluZm8sXG4gIGI6IFRlbnNvckluZm8sXG4gIHRyYW5zcG9zZUE6IGJvb2xlYW4sXG4gIHRyYW5zcG9zZUI6IGJvb2xlYW4sXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGJpYXM/OiBUZW5zb3JJbmZvLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzPzogVGVuc29ySW5mbyxcbiAgbGVha3lyZWx1QWxwaGE/OiBudW1iZXIsXG4gIGFjdGl2YXRpb24/OiBiYWNrZW5kX3V0aWwuQWN0aXZhdGlvblxufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsSW1wbCh7XG4gIGEsXG4gIGIsXG4gIHRyYW5zcG9zZUEsXG4gIHRyYW5zcG9zZUIsXG4gIGJhY2tlbmQsXG4gIGJpYXMgPSBudWxsLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gbnVsbCxcbiAgbGVha3lyZWx1QWxwaGEgPSAwLFxuICBhY3RpdmF0aW9uID0gbnVsbFxufTogQmF0Y2hNYXRNdWxDb25maWcpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgYVJhbmsgPSBhLnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgYlJhbmsgPSBiLnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBpbm5lclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMl0gOiBhLnNoYXBlW2FSYW5rIC0gMV07XG4gIGNvbnN0IGlubmVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAxXSA6IGIuc2hhcGVbYlJhbmsgLSAyXTtcblxuICBjb25zdCBvdXRlclNoYXBlQSA9IHRyYW5zcG9zZUEgPyBhLnNoYXBlW2FSYW5rIC0gMV0gOiBhLnNoYXBlW2FSYW5rIC0gMl07XG4gIGNvbnN0IG91dGVyU2hhcGVCID0gdHJhbnNwb3NlQiA/IGIuc2hhcGVbYlJhbmsgLSAyXSA6IGIuc2hhcGVbYlJhbmsgLSAxXTtcblxuICBjb25zdCBvdXRlckRpbXNBID0gYS5zaGFwZS5zbGljZSgwLCAtMik7XG4gIGNvbnN0IG91dGVyRGltc0IgPSBiLnNoYXBlLnNsaWNlKDAsIC0yKTtcblxuICBjb25zdCBiYXRjaERpbUEgPSB1dGlsLnNpemVGcm9tU2hhcGUob3V0ZXJEaW1zQSk7XG4gIGNvbnN0IGJhdGNoRGltQiA9IHV0aWwuc2l6ZUZyb21TaGFwZShvdXRlckRpbXNCKTtcblxuICBjb25zdCBvdXRTaGFwZU91dGVyRGltcyA9IGJyb2FkY2FzdF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKFxuICAgICAgYS5zaGFwZS5zbGljZSgwLCAtMiksIGIuc2hhcGUuc2xpY2UoMCwgLTIpKTtcbiAgY29uc3Qgb3V0U2hhcGUgPSBvdXRTaGFwZU91dGVyRGltcy5jb25jYXQoW291dGVyU2hhcGVBLCBvdXRlclNoYXBlQl0pO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgaW5uZXJTaGFwZUEgPT09IGlubmVyU2hhcGVCLFxuICAgICAgKCkgPT4gYEVycm9yIGluIG1hdE11bDogaW5uZXIgc2hhcGVzICgke2lubmVyU2hhcGVBfSkgYW5kIChgICtcbiAgICAgICAgICBgJHtpbm5lclNoYXBlQn0pIG9mIFRlbnNvcnMgd2l0aCBzaGFwZXMgJHthLnNoYXBlfSBhbmQgYCArXG4gICAgICAgICAgYCR7Yi5zaGFwZX0gYW5kIHRyYW5zcG9zZUE9JHt0cmFuc3Bvc2VBfWAgK1xuICAgICAgICAgIGAgYW5kIHRyYW5zcG9zZUI9JHt0cmFuc3Bvc2VCfSBtdXN0IG1hdGNoLmApO1xuXG4gIGNvbnN0IGEzZFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSB0cmFuc3Bvc2VBID9cbiAgICAgIFtiYXRjaERpbUEsIGlubmVyU2hhcGVBLCBvdXRlclNoYXBlQV0gOlxuICAgICAgW2JhdGNoRGltQSwgb3V0ZXJTaGFwZUEsIGlubmVyU2hhcGVBXTtcbiAgY29uc3QgYjNkU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IHRyYW5zcG9zZUIgP1xuICAgICAgW2JhdGNoRGltQiwgb3V0ZXJTaGFwZUIsIGlubmVyU2hhcGVCXSA6XG4gICAgICBbYmF0Y2hEaW1CLCBpbm5lclNoYXBlQiwgb3V0ZXJTaGFwZUJdO1xuXG4gIC8vIFRoZSByZXN0IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIHJhbmstMyB0ZW5zb3JzXG4gIGNvbnN0IGEzZCA9IHJlc2hhcGUoe2lucHV0czoge3g6IGF9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBhM2RTaGFwZX19KTtcbiAgY29uc3QgYjNkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogYn0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGIzZFNoYXBlfX0pO1xuXG4gIGNvbnN0IGludGVybWVkaWF0ZXM6IFRlbnNvckluZm9bXSA9IFthM2QsIGIzZF07XG5cbiAgY29uc3QgYmF0Y2hEaW0gPSBNYXRoLm1heChiYXRjaERpbUEsIGJhdGNoRGltQik7XG4gIGNvbnN0IHNoYXJlZERpbSA9IHRyYW5zcG9zZUEgPyBhM2Quc2hhcGVbMV0gOiBhM2Quc2hhcGVbMl07XG5cbiAgY29uc3QgaGFzQmlhcyA9IGJpYXMgIT0gbnVsbDtcbiAgY29uc3QgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbDtcbiAgY29uc3QgaGFzTGVha3lyZWx1QWxwaGEgPSBhY3RpdmF0aW9uID09PSAnbGVha3lyZWx1JztcbiAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gYWN0aXZhdGlvbiAhPSBudWxsID9cbiAgICAgIG1hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW0oYWN0aXZhdGlvbiwgdHJ1ZSkgOlxuICAgICAgbnVsbDtcbiAgY29uc3QgY29udGFpbnNGdXNlZE9wcyA9IGhhc0JpYXMgfHwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyB8fFxuICAgICAgaGFzTGVha3lyZWx1QWxwaGEgfHwgZnVzZWRBY3RpdmF0aW9uICE9IG51bGw7XG4gIGxldCBvdXQ6IFRlbnNvckluZm87XG5cbiAgLy8gU2luY2UgdGhlIG1hdHJpY2VzIGFyZSB2ZWN0b3JzLCBpdCBpcyBmYXN0ZXIgdG8gY2FsbCBtdWwoKS5zdW0oKVxuICAvLyBiZWNhdXNlIHN1bSgpIGlzIE8oc3FydChOKSkgZHVlIHRvIGRpdmlkZS1hbmQtY29ucXVlci5cbiAgaWYgKChvdXRlclNoYXBlQSA9PT0gMSB8fCBvdXRlclNoYXBlQiA9PT0gMSkgJiZcbiAgICAgIHNoYXJlZERpbSA+IE1BVE1VTF9TSEFSRURfRElNX1RIUkVTSE9MRCAmJiBjb250YWluc0Z1c2VkT3BzID09PSBmYWxzZSkge1xuICAgIGxldCBhVmVjID0gYTNkO1xuICAgIGxldCBiVmVjID0gYjNkO1xuICAgIGlmICh0cmFuc3Bvc2VBKSB7XG4gICAgICBhVmVjID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiBhM2R9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IFswLCAyLCAxXX19KTtcbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChhVmVjKTtcbiAgICB9XG4gICAgaWYgKHRyYW5zcG9zZUIpIHtcbiAgICAgIGJWZWMgPSB0cmFuc3Bvc2Uoe2lucHV0czoge3g6IGIzZH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogWzAsIDIsIDFdfX0pO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGJWZWMpO1xuICAgIH1cblxuICAgIGNvbnN0IHNob3VsZFJlc2hhcGVBID0gb3V0ZXJTaGFwZUIgIT09IDE7XG4gICAgY29uc3Qgc2hvdWxkUmVzaGFwZUIgPSBvdXRlclNoYXBlQiA9PT0gMTtcblxuICAgIGxldCBhVmVjM2QgPSBhVmVjO1xuICAgIGlmIChzaG91bGRSZXNoYXBlQSkge1xuICAgICAgYVZlYzNkID0gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czoge3g6IGFWZWN9LFxuICAgICAgICBiYWNrZW5kLFxuICAgICAgICBhdHRyczoge3NoYXBlOiBbYmF0Y2hEaW0sIHNoYXJlZERpbSwgMV19XG4gICAgICB9KTtcblxuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGFWZWMzZCk7XG4gICAgfVxuXG4gICAgY29uc3QgYXhpcyA9IG91dGVyU2hhcGVCID09PSAxID8gMiA6IDE7XG5cbiAgICBsZXQgYlZlYzNkID0gYlZlYztcbiAgICBpZiAoc2hvdWxkUmVzaGFwZUIpIHtcbiAgICAgIGJWZWMzZCA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHt4OiBiVmVjfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHtzaGFwZTogW2JhdGNoRGltLCAxLCBzaGFyZWREaW1dfVxuICAgICAgfSk7XG5cbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChiVmVjM2QpO1xuICAgIH1cblxuICAgIGNvbnN0IHByb2R1Y3QgPSBtdWx0aXBseSh7aW5wdXRzOiB7YTogYVZlYzNkLCBiOiBiVmVjM2R9LCBiYWNrZW5kfSk7XG4gICAgb3V0ID0gc3VtKHtpbnB1dHM6IHt4OiBwcm9kdWN0fSwgYmFja2VuZCwgYXR0cnM6IHtheGlzLCBrZWVwRGltczogdHJ1ZX19KTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2gocHJvZHVjdCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgZHR5cGUgPSB1cGNhc3RUeXBlKGEuZHR5cGUsIGIuZHR5cGUpO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBNYXRNdWxQYWNrZWRQcm9ncmFtKFxuICAgICAgICBhM2RTaGFwZSwgYjNkU2hhcGUsIFtiYXRjaERpbSwgb3V0ZXJTaGFwZUEsIG91dGVyU2hhcGVCXSwgdHJhbnNwb3NlQSxcbiAgICAgICAgdHJhbnNwb3NlQiwgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBoYXNMZWFreXJlbHVBbHBoYSk7XG5cbiAgICBjb25zdCBpbnB1dHM6IFRlbnNvckluZm9bXSA9IFthM2QsIGIzZF07XG4gICAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgICAgaW5wdXRzLnB1c2goYmlhcyk7XG4gICAgfVxuICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICBpbnB1dHMucHVzaChwcmVsdUFjdGl2YXRpb25XZWlnaHRzKTtcbiAgICB9XG4gICAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgICBjb25zdCAkbGVha3lyZWx1QWxwaGEgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICAgICAgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShsZWFreXJlbHVBbHBoYSBhcyB7fSBhcyAnZmxvYXQzMicsICdmbG9hdDMyJykpO1xuICAgICAgaW5wdXRzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgICAgIGludGVybWVkaWF0ZXMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgIH1cblxuICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgZHR5cGUpO1xuICB9XG5cbiAgY29uc3Qgb3V0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogb3V0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG4gIGludGVybWVkaWF0ZXMucHVzaChvdXQpO1xuICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gIH1cbiAgcmV0dXJuIG91dFJlc2hhcGVkO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { _FusedMatMul } from '@tensorflow/tfjs-core';\nimport { batchMatMulImpl } from './BatchMatMul_impl';\nexport function _fusedMatMul(args) {\n    const { inputs, backend, attrs } = args;\n    const { a, b, bias, preluActivationWeights } = inputs;\n    const { transposeA, transposeB, activation, leakyreluAlpha } = attrs;\n    return batchMatMulImpl({\n        a,\n        b,\n        transposeA,\n        transposeB,\n        backend,\n        bias,\n        preluActivationWeights,\n        leakyreluAlpha,\n        activation\n    });\n}\nexport const _fusedMatMulConfig = {\n    kernelName: _FusedMatMul,\n    backendName: 'webgl',\n    kernelFunc: _fusedMatMul,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiX0Z1c2VkTWF0TXVsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL19GdXNlZE1hdE11bC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFrRSxNQUFNLHVCQUF1QixDQUFDO0FBR3BILE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUVuRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBSTVCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNwRCxNQUFNLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRW5FLE9BQU8sZUFBZSxDQUFDO1FBQ3JCLENBQUM7UUFDRCxDQUFDO1FBQ0QsVUFBVTtRQUNWLFVBQVU7UUFDVixPQUFPO1FBQ1AsSUFBSTtRQUNKLHNCQUFzQjtRQUN0QixjQUFjO1FBQ2QsVUFBVTtLQUNYLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxrQkFBa0IsR0FBaUI7SUFDOUMsVUFBVSxFQUFFLFlBQVk7SUFDeEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFlBQWdDO0NBQzdDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge19GdXNlZE1hdE11bCwgX0Z1c2VkTWF0TXVsQXR0cnMsIF9GdXNlZE1hdE11bElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtiYXRjaE1hdE11bEltcGx9IGZyb20gJy4vQmF0Y2hNYXRNdWxfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBfZnVzZWRNYXRNdWwoYXJnczoge1xuICBpbnB1dHM6IF9GdXNlZE1hdE11bElucHV0cyxcbiAgYXR0cnM6IF9GdXNlZE1hdE11bEF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHthLCBiLCBiaWFzLCBwcmVsdUFjdGl2YXRpb25XZWlnaHRzfSA9IGlucHV0cztcbiAgY29uc3Qge3RyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGFjdGl2YXRpb24sIGxlYWt5cmVsdUFscGhhfSA9IGF0dHJzO1xuXG4gIHJldHVybiBiYXRjaE1hdE11bEltcGwoe1xuICAgIGEsXG4gICAgYixcbiAgICB0cmFuc3Bvc2VBLFxuICAgIHRyYW5zcG9zZUIsXG4gICAgYmFja2VuZCxcbiAgICBiaWFzLFxuICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgbGVha3lyZWx1QWxwaGEsXG4gICAgYWN0aXZhdGlvblxuICB9KTtcbn1cblxuZXhwb3J0IGNvbnN0IF9mdXNlZE1hdE11bENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBfRnVzZWRNYXRNdWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBfZnVzZWRNYXRNdWwgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Abs, env } from '@tensorflow/tfjs-core';\nimport { simpleAbsImplCPU } from '../kernel_utils/shared';\nimport { UnaryOpProgram } from '../unaryop_gpu';\nimport { UnaryOpPackedProgram } from '../unaryop_packed_gpu';\nconst ABS = `return abs(x);`;\nexport function abs(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    // TODO: handle cases when x is complex. Once the cpu implementation\n    // can handle complex values, refactor to use unaryKernelFunc.\n    if (backend.shouldExecuteOnCPU([x]) && x.dtype !== 'complex64') {\n        const xData = backend.texData.get(x.dataId);\n        const outValues = simpleAbsImplCPU(xData.values);\n        return backend.makeTensorInfo(x.shape, x.dtype, outValues);\n    }\n    let program;\n    if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n        program = new UnaryOpPackedProgram(x.shape, ABS);\n    }\n    else {\n        program = new UnaryOpProgram(x.shape, ABS);\n    }\n    return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const absConfig = {\n    kernelName: Abs,\n    backendName: 'webgl',\n    kernelFunc: abs\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWJzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0Ficy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFhLEdBQUcsRUFBbUQsTUFBTSx1QkFBdUIsQ0FBQztBQUc1RyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUN4RCxPQUFPLEVBQUMsY0FBYyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0QsTUFBTSxHQUFHLEdBQUcsZ0JBQWdCLENBQUM7QUFFN0IsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFvRDtJQUV0RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLG9FQUFvRTtJQUNwRSw4REFBOEQ7SUFDOUQsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQzlELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM1QyxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsTUFBb0IsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDNUQ7SUFFRCxJQUFJLE9BQTRDLENBQUM7SUFDakQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRTtRQUNoRCxPQUFPLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO0tBQ2xEO1NBQU07UUFDTCxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM1QztJQUNELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBYnMsIEFic0lucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NpbXBsZUFic0ltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHtVbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuaW1wb3J0IHtVbmFyeU9wUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi4vdW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuY29uc3QgQUJTID0gYHJldHVybiBhYnMoeCk7YDtcblxuZXhwb3J0IGZ1bmN0aW9uIGFicyhhcmdzOiB7aW5wdXRzOiBBYnNJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgLy8gVE9ETzogaGFuZGxlIGNhc2VzIHdoZW4geCBpcyBjb21wbGV4LiBPbmNlIHRoZSBjcHUgaW1wbGVtZW50YXRpb25cbiAgLy8gY2FuIGhhbmRsZSBjb21wbGV4IHZhbHVlcywgcmVmYWN0b3IgdG8gdXNlIHVuYXJ5S2VybmVsRnVuYy5cbiAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgJiYgeC5kdHlwZSAhPT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCB4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICAgIGNvbnN0IG91dFZhbHVlcyA9IHNpbXBsZUFic0ltcGxDUFUoeERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXkpO1xuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHguc2hhcGUsIHguZHR5cGUsIG91dFZhbHVlcyk7XG4gIH1cblxuICBsZXQgcHJvZ3JhbTogVW5hcnlPcFByb2dyYW18VW5hcnlPcFBhY2tlZFByb2dyYW07XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX1VOQVJZX09QRVJBVElPTlMnKSkge1xuICAgIHByb2dyYW0gPSBuZXcgVW5hcnlPcFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgQUJTKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIEFCUyk7XG4gIH1cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBhYnNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQWJzLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWJzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acos } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ACOS = CHECK_NAN_SNIPPET + `\n  if (abs(x) > 1.) {\n    return NAN;\n  }\n  return acos(x);\n`;\nexport const acos = unaryKernelFunc({ opSnippet: ACOS });\nexport const acosConfig = {\n    kernelName: Acos,\n    backendName: 'webgl',\n    kernelFunc: acos,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BY29zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLEdBQUc7Ozs7O0NBS2hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Fjb3MsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBQ09TID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIGlmIChhYnMoeCkgPiAxLikge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgcmV0dXJuIGFjb3MoeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgYWNvcyA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBQ09TfSk7XG5cbmV4cG9ydCBjb25zdCBhY29zQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFjb3MsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhY29zLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Acosh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ACOSH = CHECK_NAN_SNIPPET + `\n  if (x < 1.0) return NAN;\nreturn log(x + sqrt(x * x - 1.0));`;\nexport const acosh = unaryKernelFunc({ opSnippet: ACOSH });\nexport const acoshConfig = {\n    kernelName: Acosh,\n    backendName: 'webgl',\n    kernelFunc: acosh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWNvc2guanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQWNvc2gudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsR0FBRzs7bUNBRUMsQ0FBQztBQUVwQyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWNvc2gsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBQ09TSCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICBpZiAoeCA8IDEuMCkgcmV0dXJuIE5BTjtcbnJldHVybiBsb2coeCArIHNxcnQoeCAqIHggLSAxLjApKTtgO1xuXG5leHBvcnQgY29uc3QgYWNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQUNPU0h9KTtcblxuZXhwb3J0IGNvbnN0IGFjb3NoQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFjb3NoLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWNvc2gsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Add } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { addImplCPU as cpuAdd } from '../kernel_utils/shared';\nconst ADD = 'return a + b;';\nexport const addKernelFunc = binaryKernelFunc({\n    opSnippet: ADD,\n    packedOpSnippet: ADD,\n    supportsComplex: true,\n    cpuKernelImpl: cpuAdd\n});\nexport const addConfig = {\n    kernelName: Add,\n    backendName: 'webgl',\n    kernelFunc: addKernelFunc\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FkZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUM7QUFFNUIsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLGdCQUFnQixDQUFDO0lBQzVDLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZUFBZSxFQUFFLElBQUk7SUFDckIsYUFBYSxFQUFFLE1BQU07Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxhQUFhO0NBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWRkLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2FkZEltcGxDUFUgYXMgY3B1QWRkfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgQUREID0gJ3JldHVybiBhICsgYjsnO1xuXG5leHBvcnQgY29uc3QgYWRkS2VybmVsRnVuYyA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IEFERCxcbiAgcGFja2VkT3BTbmlwcGV0OiBBREQsXG4gIHN1cHBvcnRzQ29tcGxleDogdHJ1ZSxcbiAgY3B1S2VybmVsSW1wbDogY3B1QWRkXG59KTtcblxuZXhwb3J0IGNvbnN0IGFkZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhZGRLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class AddNProgram {\n    constructor(outputShape, shapes) {\n        this.outputShape = [];\n        this.outputShape = outputShape;\n        this.variableNames = shapes.map((_, i) => `T${i}`);\n        const snippets = [];\n        // Get target elements from every input tensor.\n        this.variableNames.forEach(variable => {\n            snippets.push(`float v${variable} = get${variable}AtOutCoords();`);\n        });\n        // Calculate the sum of all elements.\n        const operation = this.variableNames\n            .map(variable => {\n            return `v${variable}`;\n        })\n            .join(' + ');\n        this.userCode = `\n      void main() {\n        ${snippets.join('\\n        ')}\n\n        float result = ${operation};\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkbl9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2FkZG5fZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sT0FBTyxXQUFXO0lBS3RCLFlBQVksV0FBcUIsRUFBRSxNQUFrQjtRQUhyRCxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUl6QixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsYUFBYSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbkQsTUFBTSxRQUFRLEdBQWEsRUFBRSxDQUFDO1FBQzlCLCtDQUErQztRQUMvQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNwQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsUUFBUSxTQUFTLFFBQVEsZ0JBQWdCLENBQUMsQ0FBQztRQUNyRSxDQUFDLENBQUMsQ0FBQztRQUVILHFDQUFxQztRQUNyQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYTthQUNiLEdBQUcsQ0FBQyxRQUFRLENBQUMsRUFBRTtZQUNkLE9BQU8sSUFBSSxRQUFRLEVBQUUsQ0FBQztRQUN4QixDQUFDLENBQUM7YUFDRCxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFbkMsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQzs7eUJBRVosU0FBUzs7O0tBRzdCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQWRkTlByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Iob3V0cHV0U2hhcGU6IG51bWJlcltdLCBzaGFwZXM6IG51bWJlcltdW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gc2hhcGVzLm1hcCgoXywgaSkgPT4gYFQke2l9YCk7XG5cbiAgICBjb25zdCBzbmlwcGV0czogc3RyaW5nW10gPSBbXTtcbiAgICAvLyBHZXQgdGFyZ2V0IGVsZW1lbnRzIGZyb20gZXZlcnkgaW5wdXQgdGVuc29yLlxuICAgIHRoaXMudmFyaWFibGVOYW1lcy5mb3JFYWNoKHZhcmlhYmxlID0+IHtcbiAgICAgIHNuaXBwZXRzLnB1c2goYGZsb2F0IHYke3ZhcmlhYmxlfSA9IGdldCR7dmFyaWFibGV9QXRPdXRDb29yZHMoKTtgKTtcbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50cy5cbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnZhcmlhYmxlTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB2JHt2YXJpYWJsZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICsgJyk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3NuaXBwZXRzLmpvaW4oJ1xcbiAgICAgICAgJyl9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gJHtvcGVyYXRpb259O1xuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class AddNPackedProgram {\n    constructor(outputShape, shapes) {\n        this.outputShape = [];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = outputShape;\n        this.variableNames = shapes.map((_, i) => `T${i}`);\n        const snippets = [];\n        // Get target elements from every input tensor.\n        this.variableNames.forEach(variable => {\n            snippets.push(`vec4 v${variable} = get${variable}AtOutCoords();`);\n        });\n        // Calculate the sum of all elements.\n        const operation = this.variableNames\n            .map(variable => {\n            return `v${variable}`;\n        })\n            .join(' + ');\n        this.userCode = `\n      void main() {\n        ${snippets.join('\\n        ')}\n\n        vec4 result = ${operation};\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkbl9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9hZGRuX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQU81QixZQUFZLFdBQXFCLEVBQUUsTUFBa0I7UUFMckQsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFFM0IsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFHbEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sUUFBUSxHQUFhLEVBQUUsQ0FBQztRQUM5QiwrQ0FBK0M7UUFDL0MsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDcEMsUUFBUSxDQUFDLElBQUksQ0FBQyxTQUFTLFFBQVEsU0FBUyxRQUFRLGdCQUFnQixDQUFDLENBQUM7UUFDcEUsQ0FBQyxDQUFDLENBQUM7UUFFSCxxQ0FBcUM7UUFDckMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLGFBQWE7YUFDYixHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDZCxPQUFPLElBQUksUUFBUSxFQUFFLENBQUM7UUFDeEIsQ0FBQyxDQUFDO2FBQ0QsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRW5DLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUM7O3dCQUViLFNBQVM7OztLQUc1QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEFkZE5QYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSwgc2hhcGVzOiBudW1iZXJbXVtdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMudmFyaWFibGVOYW1lcyA9IHNoYXBlcy5tYXAoKF8sIGkpID0+IGBUJHtpfWApO1xuXG4gICAgY29uc3Qgc25pcHBldHM6IHN0cmluZ1tdID0gW107XG4gICAgLy8gR2V0IHRhcmdldCBlbGVtZW50cyBmcm9tIGV2ZXJ5IGlucHV0IHRlbnNvci5cbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMuZm9yRWFjaCh2YXJpYWJsZSA9PiB7XG4gICAgICBzbmlwcGV0cy5wdXNoKGB2ZWM0IHYke3ZhcmlhYmxlfSA9IGdldCR7dmFyaWFibGV9QXRPdXRDb29yZHMoKTtgKTtcbiAgICB9KTtcblxuICAgIC8vIENhbGN1bGF0ZSB0aGUgc3VtIG9mIGFsbCBlbGVtZW50cy5cbiAgICBjb25zdCBvcGVyYXRpb24gPSB0aGlzLnZhcmlhYmxlTmFtZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCh2YXJpYWJsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB2JHt2YXJpYWJsZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignICsgJyk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3NuaXBwZXRzLmpvaW4oJ1xcbiAgICAgICAgJyl9XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSAke29wZXJhdGlvbn07XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AddN, env, upcastType } from '@tensorflow/tfjs-core';\nimport { AddNProgram } from '../addn_gpu';\nimport { AddNPackedProgram } from '../addn_packed_gpu';\nimport { identity } from './Identity';\nexport function addN(args) {\n    const { inputs, backend } = args;\n    const tensors = inputs;\n    if (tensors.length === 1) {\n        return identity({ inputs: { x: tensors[0] }, backend });\n    }\n    // Limit the number of uploaded textures for optimization.\n    if (tensors.length > env().get('WEBGL_MAX_TEXTURES_IN_SHADER')) {\n        const midIndex = Math.floor(tensors.length / 2);\n        const leftSide = addN({ inputs: tensors.slice(0, midIndex), backend });\n        const rightSide = addN({ inputs: tensors.slice(midIndex), backend });\n        return addN({ inputs: [leftSide, rightSide], backend });\n    }\n    const dtype = tensors.map(t => t.dtype).reduce((d1, d2) => upcastType(d1, d2));\n    const shapes = tensors.map(t => t.shape);\n    // We can make sure shapes are identical in op level.\n    const usePackedOp = env().getBool('WEBGL_PACK');\n    const program = usePackedOp ?\n        new AddNPackedProgram(tensors[0].shape, shapes) :\n        new AddNProgram(tensors[0].shape, shapes);\n    return backend.runWebGLProgram(program, tensors, dtype);\n}\nexport const addNConfig = {\n    kernelName: AddN,\n    backendName: 'webgl',\n    kernelFunc: addN\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWRkTi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BZGROLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWMsR0FBRyxFQUF3QyxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU5RyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBRXJELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFxRDtJQUV4RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUUvQixNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUM7SUFDdkIsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN4QixPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3JEO0lBRUQsMERBQTBEO0lBQzFELElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsRUFBRTtRQUM5RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDaEQsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFDckUsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxDQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNuRSxPQUFPLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0tBQ3ZEO0lBRUQsTUFBTSxLQUFLLEdBQ1AsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDckUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUN6QyxxREFBcUQ7SUFDckQsTUFBTSxXQUFXLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQ2hELE1BQU0sT0FBTyxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBQ3pCLElBQUksaUJBQWlCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO1FBQ2pELElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDOUMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QWRkTiwgQWRkTklucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHVwY2FzdFR5cGV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QWRkTlByb2dyYW19IGZyb20gJy4uL2FkZG5fZ3B1JztcbmltcG9ydCB7QWRkTlBhY2tlZFByb2dyYW19IGZyb20gJy4uL2FkZG5fcGFja2VkX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhZGROKGFyZ3M6IHtpbnB1dHM6IEFkZE5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuXG4gIGNvbnN0IHRlbnNvcnMgPSBpbnB1dHM7XG4gIGlmICh0ZW5zb3JzLmxlbmd0aCA9PT0gMSkge1xuICAgIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogdGVuc29yc1swXX0sIGJhY2tlbmR9KTtcbiAgfVxuXG4gIC8vIExpbWl0IHRoZSBudW1iZXIgb2YgdXBsb2FkZWQgdGV4dHVyZXMgZm9yIG9wdGltaXphdGlvbi5cbiAgaWYgKHRlbnNvcnMubGVuZ3RoID4gZW52KCkuZ2V0KCdXRUJHTF9NQVhfVEVYVFVSRVNfSU5fU0hBREVSJykpIHtcbiAgICBjb25zdCBtaWRJbmRleCA9IE1hdGguZmxvb3IodGVuc29ycy5sZW5ndGggLyAyKTtcbiAgICBjb25zdCBsZWZ0U2lkZSA9IGFkZE4oe2lucHV0czogdGVuc29ycy5zbGljZSgwLCBtaWRJbmRleCksIGJhY2tlbmR9KTtcbiAgICBjb25zdCByaWdodFNpZGUgPSBhZGROKHtpbnB1dHM6IHRlbnNvcnMuc2xpY2UobWlkSW5kZXgpLCBiYWNrZW5kfSk7XG4gICAgcmV0dXJuIGFkZE4oe2lucHV0czogW2xlZnRTaWRlLCByaWdodFNpZGVdLCBiYWNrZW5kfSk7XG4gIH1cblxuICBjb25zdCBkdHlwZSA9XG4gICAgICB0ZW5zb3JzLm1hcCh0ID0+IHQuZHR5cGUpLnJlZHVjZSgoZDEsIGQyKSA9PiB1cGNhc3RUeXBlKGQxLCBkMikpO1xuICBjb25zdCBzaGFwZXMgPSB0ZW5zb3JzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICAvLyBXZSBjYW4gbWFrZSBzdXJlIHNoYXBlcyBhcmUgaWRlbnRpY2FsIGluIG9wIGxldmVsLlxuICBjb25zdCB1c2VQYWNrZWRPcCA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0snKTtcbiAgY29uc3QgcHJvZ3JhbSA9IHVzZVBhY2tlZE9wID9cbiAgICAgIG5ldyBBZGROUGFja2VkUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpIDpcbiAgICAgIG5ldyBBZGROUHJvZ3JhbSh0ZW5zb3JzWzBdLnNoYXBlLCBzaGFwZXMpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgdGVuc29ycywgZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYWRkTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBZGROLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYWRkTiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { All, backend_util, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function all(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    const xRank = x.shape.length;\n    const origAxes = util.parseAxisParam(axis, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n    let permutedX = x;\n    if (permutedAxes != null) {\n        permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        axes = backend_util.getInnerMostAxes(axes.length, xRank);\n    }\n    backend_util.assertAxesAreInnerMostDims('all', axes, xRank);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, axes);\n    const inSize = util.sizeFromShape(reduceShape);\n    const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n    const reduced = reduce(a2D, a2D.dtype, 'all', backend);\n    let res;\n    if (keepDims) {\n        const newShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n        res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: newShape } });\n    }\n    else {\n        res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n    }\n    backend.disposeIntermediateTensorInfo(a2D);\n    backend.disposeIntermediateTensorInfo(reduced);\n    if (permutedAxes != null) {\n        backend.disposeIntermediateTensorInfo(permutedX);\n    }\n    return res;\n}\nexport const allConfig = {\n    kernelName: All,\n    backendName: 'webgl',\n    kernelFunc: all\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQWxsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FsbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUF1QixZQUFZLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzFEO0lBRUQsWUFBWSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FDekIsWUFBWSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUUvQyxNQUFNLEdBQUcsR0FDTCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsU0FBUyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFdkQsSUFBSSxHQUFHLENBQUM7SUFDUixJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUMxRTtTQUFNO1FBQ0wsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUMxRTtJQUVELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFL0MsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBbGwsIEFsbEF0dHJzLCBBbGxJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gYWxsKFxuICAgIGFyZ3M6IHtpbnB1dHM6IEFsbElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IEFsbEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGtlZXBEaW1zfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3Qgb3JpZ0F4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBsZXQgYXhlcyA9IG9yaWdBeGVzO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHhSYW5rKTtcbiAgbGV0IHBlcm11dGVkWCA9IHg7XG4gIGlmIChwZXJtdXRlZEF4ZXMgIT0gbnVsbCkge1xuICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdhbGwnLCBheGVzLCB4UmFuayk7XG4gIGNvbnN0IFtvdXRTaGFwZSwgcmVkdWNlU2hhcGVdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgYXhlcyk7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG5cbiAgY29uc3QgYTJEID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFstMSwgaW5TaXplXX19KTtcbiAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIGEyRC5kdHlwZSwgJ2FsbCcsIGJhY2tlbmQpO1xuXG4gIGxldCByZXM7XG4gIGlmIChrZWVwRGltcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgfVxuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTJEKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcblxuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBlcm11dGVkWCk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgYWxsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFsbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFsbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Any, backend_util, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function any(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    const xRank = x.shape.length;\n    const origAxes = util.parseAxisParam(axis, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n    let permutedX = x;\n    if (permutedAxes != null) {\n        permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        axes = backend_util.getInnerMostAxes(axes.length, xRank);\n    }\n    backend_util.assertAxesAreInnerMostDims('any', axes, xRank);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, axes);\n    const inSize = util.sizeFromShape(reduceShape);\n    const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n    const reduced = reduce(a2D, a2D.dtype, 'any', backend);\n    let res;\n    if (keepDims) {\n        const newShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n        res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: newShape } });\n    }\n    else {\n        res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n    }\n    backend.disposeIntermediateTensorInfo(a2D);\n    backend.disposeIntermediateTensorInfo(reduced);\n    if (permutedAxes != null) {\n        backend.disposeIntermediateTensorInfo(permutedX);\n    }\n    return res;\n}\nexport const anyConfig = {\n    kernelName: Any,\n    backendName: 'webgl',\n    kernelFunc: any\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQW55LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FueS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUF1QixZQUFZLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0tBQzFEO0lBRUQsWUFBWSxDQUFDLDBCQUEwQixDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUQsTUFBTSxDQUFDLFFBQVEsRUFBRSxXQUFXLENBQUMsR0FDekIsWUFBWSxDQUFDLHlCQUF5QixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDbEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUUvQyxNQUFNLEdBQUcsR0FDTCxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsU0FBUyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFFdkQsSUFBSSxHQUFHLENBQUM7SUFDUixJQUFJLFFBQVEsRUFBRTtRQUNaLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxvQkFBb0IsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDdkUsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUMxRTtTQUFNO1FBQ0wsR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztLQUMxRTtJQUVELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFL0MsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxTQUFTLENBQUMsQ0FBQztLQUNsRDtJQUVELE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBbnksIEFueUF0dHJzLCBBbnlJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGFueShcbiAgICBhcmdzOiB7aW5wdXRzOiBBbnlJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBBbnlBdHRyc30pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBrZWVwRGltc30gPSBhdHRycztcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gIGxldCBwZXJtdXRlZFggPSB4O1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYW55JywgYXhlcywgeFJhbmspO1xuICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dEFuZFJlZHVjZVNoYXBlcyhwZXJtdXRlZFguc2hhcGUsIGF4ZXMpO1xuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpO1xuXG4gIGNvbnN0IGEyRCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBwZXJtdXRlZFh9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbLTEsIGluU2l6ZV19fSk7XG4gIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UoYTJELCBhMkQuZHR5cGUsICdhbnknLCBiYWNrZW5kKTtcblxuICBsZXQgcmVzO1xuICBpZiAoa2VlcERpbXMpIHtcbiAgICBjb25zdCBuZXdTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShvdXRTaGFwZSwgb3JpZ0F4ZXMpO1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX19KTtcbiAgfSBlbHNlIHtcbiAgICByZXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG4gIH1cblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGEyRCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG5cbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuICB9XG5cbiAgcmV0dXJuIHJlcztcbn1cblxuZXhwb3J0IGNvbnN0IGFueUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBbnksXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhbnkgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ArgMinMaxProgram {\n    constructor(reduceInfo, op, firstPass) {\n        this.variableNames = ['A'];\n        const { windowSize, batchSize, outSize } = reduceInfo;\n        if (!firstPass) {\n            this.variableNames.push('bestIndicesA');\n        }\n        this.outputShape = [batchSize, outSize];\n        const compOp = (op === 'max') ? '>' : '<';\n        const indexSnippet = firstPass ?\n            'inOffset + i;' :\n            'round(getBestIndicesA(batch, inOffset + i));';\n        this.userCode = `\n      void main() {\n        ivec2 coords = getOutputCoords();\n        int batch = coords[0];\n        int outIdx = coords[1];\n        int inOffset = outIdx * ${windowSize};\n\n        int bestIndex = inOffset;\n        float bestValue = getA(batch, bestIndex);\n\n        for (int i = 0; i < ${windowSize}; i++) {\n          int inIdx = ${indexSnippet};\n          float candidate = getA(batch, inIdx);\n          if (candidate ${compOp} bestValue) {\n            bestValue = candidate;\n            bestIndex = inIdx;\n          }\n        }\n        setOutput(float(bestIndex));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnbWlubWF4X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYXJnbWlubWF4X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLFlBQ0ksVUFBbUMsRUFBRSxFQUFlLEVBQ3BELFNBQWtCO1FBTnRCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQU9wQixNQUFNLEVBQUMsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FBRyxVQUFVLENBQUM7UUFDcEQsSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNkLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1NBQ3pDO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN4QyxNQUFNLE1BQU0sR0FBRyxDQUFDLEVBQUUsS0FBSyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDMUMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLENBQUM7WUFDNUIsZUFBZSxDQUFDLENBQUM7WUFDakIsOENBQThDLENBQUM7UUFFbkQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7a0NBS2MsVUFBVTs7Ozs7OEJBS2QsVUFBVTt3QkFDaEIsWUFBWTs7MEJBRVYsTUFBTTs7Ozs7OztLQU8zQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQXJnTWluTWF4UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgcmVkdWNlSW5mbzogYmFja2VuZF91dGlsLlJlZHVjZUluZm8sIG9wOiAnbWF4J3wnbWluJyxcbiAgICAgIGZpcnN0UGFzczogYm9vbGVhbikge1xuICAgIGNvbnN0IHt3aW5kb3dTaXplLCBiYXRjaFNpemUsIG91dFNpemV9ID0gcmVkdWNlSW5mbztcbiAgICBpZiAoIWZpcnN0UGFzcykge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2Jlc3RJbmRpY2VzQScpO1xuICAgIH1cbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoU2l6ZSwgb3V0U2l6ZV07XG4gICAgY29uc3QgY29tcE9wID0gKG9wID09PSAnbWF4JykgPyAnPicgOiAnPCc7XG4gICAgY29uc3QgaW5kZXhTbmlwcGV0ID0gZmlyc3RQYXNzID9cbiAgICAgICAgJ2luT2Zmc2V0ICsgaTsnIDpcbiAgICAgICAgJ3JvdW5kKGdldEJlc3RJbmRpY2VzQShiYXRjaCwgaW5PZmZzZXQgKyBpKSk7JztcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBvdXRJZHggPSBjb29yZHNbMV07XG4gICAgICAgIGludCBpbk9mZnNldCA9IG91dElkeCAqICR7d2luZG93U2l6ZX07XG5cbiAgICAgICAgaW50IGJlc3RJbmRleCA9IGluT2Zmc2V0O1xuICAgICAgICBmbG9hdCBiZXN0VmFsdWUgPSBnZXRBKGJhdGNoLCBiZXN0SW5kZXgpO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHt3aW5kb3dTaXplfTsgaSsrKSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gJHtpbmRleFNuaXBwZXR9O1xuICAgICAgICAgIGZsb2F0IGNhbmRpZGF0ZSA9IGdldEEoYmF0Y2gsIGluSWR4KTtcbiAgICAgICAgICBpZiAoY2FuZGlkYXRlICR7Y29tcE9wfSBiZXN0VmFsdWUpIHtcbiAgICAgICAgICAgIGJlc3RWYWx1ZSA9IGNhbmRpZGF0ZTtcbiAgICAgICAgICAgIGJlc3RJbmRleCA9IGluSWR4O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZmxvYXQoYmVzdEluZGV4KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class ArgMinMaxPackedProgram {\n    constructor(shape, windowSize, op, firstPass) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        util.assert(shape.length > 2, () => `Packed arg${op.charAt(0).toUpperCase() +\n            op.slice(1)} supports only inputs with rank above 2.`);\n        const inSize = shape[shape.length - 1];\n        const outSize = Math.ceil(inSize / windowSize);\n        this.outputShape = shape.slice(0, -1);\n        if (outSize > 1) {\n            this.outputShape.push(outSize);\n        }\n        if (!firstPass) {\n            this.variableNames.push('bestIndicesA');\n        }\n        const outShape = this.outputShape;\n        const rank = outShape.length;\n        const dtype = getCoordsDataType(rank);\n        const coords = getChannels('coords', rank);\n        let sourceLocSetup;\n        let sourceRank;\n        if (outSize === 1) {\n            sourceRank = rank + 1;\n            const sourceLocDType = getCoordsDataType(sourceRank);\n            sourceLocSetup = `\n        ${sourceLocDType} sourceLocR = ${sourceLocDType}(${coords.join()}, 0);\n        ++${coords[rank - 1]};\n        ${sourceLocDType} sourceLocG = ${sourceLocDType}(${coords.join()}, 0);\n        ++${coords[rank - 2]};\n        ${sourceLocDType} sourceLocA = ${sourceLocDType}(${coords.join()}, 0);\n        --${coords[rank - 1]};\n        ${sourceLocDType} sourceLocB = ${sourceLocDType}(${coords.join()}, 0);\n        --${coords[rank - 2]};`;\n        }\n        else {\n            sourceRank = rank;\n            sourceLocSetup = `\n        ${dtype} sourceLocR = coords;\n        ++${coords[rank - 1]};\n        ${dtype} sourceLocG = coords;\n        ++${coords[rank - 2]};\n        ${dtype} sourceLocA = coords;\n        --${coords[rank - 1]};\n        ${dtype} sourceLocB = coords;\n        --${coords[rank - 2]};`;\n        }\n        const channels = ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, sourceRank);\n        const inChannel = '.' + channels[sourceRank - 1]; // e.g. \".b\" for rank 3.\n        const intChannels = channels.map(x => 'int ' + x);\n        const srcRCoords = getChannels('sourceLocR', sourceRank - 1).concat('inIdx.r');\n        const srcGCoords = getChannels('sourceLocG', sourceRank - 1).concat('inIdx.g');\n        const srcBCoords = getChannels('sourceLocB', sourceRank - 1).concat('inIdx.b');\n        const srcACoords = getChannels('sourceLocA', sourceRank - 1).concat('inIdx.a');\n        const compOp = (op === 'max') ? 'greaterThan' : 'lessThan';\n        const fetchCandidateIdx = firstPass ? '' : `\n          inIdx = round(vec4(getBestIndicesAChannel(${srcRCoords.join()}),\n                             getBestIndicesAChannel(${srcGCoords.join()}),\n                             getBestIndicesAChannel(${srcBCoords.join()}),\n                             getBestIndicesAChannel(${srcACoords.join()})));`;\n        const fetchValue = `vec4(\n            getAChannel(${srcRCoords.join()}),\n            hasNextCol ? getAChannel(${srcGCoords.join()}) : 0.,\n            hasNextRow ? getAChannel(${srcBCoords.join()}) : 0.,\n            hasNextRow && hasNextCol ? getAChannel(${srcACoords.join()}) : 0.)`;\n        const getBestIndicesAChannelSnippet = firstPass ? '' : `\n      float getBestIndicesAChannel(${intChannels.join()}) {\n        return getChannel(getBestIndicesA(${channels.join()}),\n                                          vec2(${channels.slice(-2).join()}));\n      }`;\n        this.userCode = `\n      float getAChannel(${intChannels.join()}) {\n        return getChannel(getA(${channels.join()}),\n                               vec2(${channels.slice(-2).join()}));\n      }\n      ${getBestIndicesAChannelSnippet}\n      void main() {\n        ${dtype} coords = getOutputCoords();\n        bool hasNextCol = ${coords[rank - 1]} < ${outShape[rank - 1] - 1};\n        bool hasNextRow = ${coords[rank - 2]} < ${outShape[rank - 2] - 1};\n        ${sourceLocSetup}\n        ivec4 srcIdx = ivec4(sourceLocR${inChannel}, sourceLocG${inChannel},\n          sourceLocB${inChannel}, sourceLocA${inChannel}) * ${windowSize};\n        ivec4 inIdx = srcIdx;\n        vec4 bestIndex = vec4(inIdx);\n        vec4 bestValue = ${fetchValue};\n\n        for (int i = 0; i < ${windowSize}; i++) {\n          inIdx = srcIdx;\n          ${fetchCandidateIdx}\n          vec4 candidate = ${fetchValue};\n          bvec4 nan = isnan(candidate);\n          bvec4 replace = bvec4(\n            vec4(${compOp}(candidate, bestValue)) * (vec4(1.0) - vec4(nan)));\n\n          bestValue = vec4(replace.x  ? candidate.x : bestValue.x,\n                           replace.y  ? candidate.y : bestValue.y,\n                           replace.z  ? candidate.z : bestValue.z,\n                           replace.w  ? candidate.w : bestValue.w);\n          bestIndex = mix(bestIndex, vec4(inIdx), vec4(replace));\n          srcIdx++;\n        }\n        setOutput(bestIndex);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnbWlubWF4X3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2FyZ21pbm1heF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUczQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLHNCQUFzQjtJQU9qQyxZQUNJLEtBQWUsRUFBRSxVQUFrQixFQUFFLEVBQWUsRUFDcEQsU0FBa0I7UUFSdEIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBS2xCLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQ2hCLEdBQUcsRUFBRSxDQUFDLGFBQ0YsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUU7WUFDMUIsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxVQUFVLENBQUMsQ0FBQztRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsSUFBSSxPQUFPLEdBQUcsQ0FBQyxFQUFFO1lBQ2YsSUFB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UyxPQUFPLFVBQVU7OzsyQkFHN0MsVUFBVTs7OEJBRVAsVUFBVTs7WUFFNUIsaUJBQWlCOzZCQUNBLFVBQVU7OzttQkFHcEIsTUFBTTs7Ozs7Ozs7Ozs7S0FXcEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHt1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIEFyZ01pbk1heFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHNoYXBlOiBudW1iZXJbXSwgd2luZG93U2l6ZTogbnVtYmVyLCBvcDogJ21heCd8J21pbicsXG4gICAgICBmaXJzdFBhc3M6IGJvb2xlYW4pIHtcbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgc2hhcGUubGVuZ3RoID4gMixcbiAgICAgICAgKCkgPT4gYFBhY2tlZCBhcmcke1xuICAgICAgICAgICAgb3AuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgK1xuICAgICAgICAgICAgb3Auc2xpY2UoMSl9IHN1cHBvcnRzIG9ubHkgaW5wdXRzIHdpdGggcmFuayBhYm92ZSAyLmApO1xuICAgIGNvbnN0IGluU2l6ZSA9IHNoYXBlW3NoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGNvbnN0IG91dFNpemUgPSBNYXRoLmNlaWwoaW5TaXplIC8gd2luZG93U2l6ZSk7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlLnNsaWNlKDAsIC0xKTtcbiAgICBpZiAob3V0U2l6ZSA+IDEpIHtcbiAgICAgIHRoaXMub3V0cHV0U2hhcGUucHVzaChvdXRTaXplKTtcbiAgICB9XG4gICAgaWYgKCFmaXJzdFBhc3MpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdiZXN0SW5kaWNlc0EnKTtcbiAgICB9XG4gICAgY29uc3Qgb3V0U2hhcGUgPSB0aGlzLm91dHB1dFNoYXBlO1xuICAgIGNvbnN0IHJhbmsgPSBvdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBjb25zdCBjb29yZHMgPSBnZXRDaGFubmVscygnY29vcmRzJywgcmFuayk7XG5cbiAgICBsZXQgc291cmNlTG9jU2V0dXA7XG4gICAgbGV0IHNvdXJjZVJhbms7XG4gICAgaWYgKG91dFNpemUgPT09IDEpIHtcbiAgICAgIHNvdXJjZVJhbmsgPSByYW5rICsgMTtcbiAgICAgIGNvbnN0IHNvdXJjZUxvY0RUeXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc291cmNlUmFuayk7XG4gICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jUiA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAxXX07XG4gICAgICAgICR7c291cmNlTG9jRFR5cGV9IHNvdXJjZUxvY0cgPSAke3NvdXJjZUxvY0RUeXBlfSgke2Nvb3Jkcy5qb2luKCl9LCAwKTtcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMl19O1xuICAgICAgICAke3NvdXJjZUxvY0RUeXBlfSBzb3VyY2VMb2NBID0gJHtzb3VyY2VMb2NEVHlwZX0oJHtjb29yZHMuam9pbigpfSwgMCk7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtzb3VyY2VMb2NEVHlwZX0gc291cmNlTG9jQiA9ICR7c291cmNlTG9jRFR5cGV9KCR7Y29vcmRzLmpvaW4oKX0sIDApO1xuICAgICAgICAtLSR7Y29vcmRzW3JhbmsgLSAyXX07YDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlUmFuayA9IHJhbms7XG4gICAgICBzb3VyY2VMb2NTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jUiA9IGNvb3JkcztcbiAgICAgICAgKyske2Nvb3Jkc1tyYW5rIC0gMV19O1xuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2NHID0gY29vcmRzO1xuICAgICAgICArKyR7Y29vcmRzW3JhbmsgLSAyXX07XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvY0EgPSBjb29yZHM7XG4gICAgICAgIC0tJHtjb29yZHNbcmFuayAtIDFdfTtcbiAgICAgICAgJHtkdHlwZX0gc291cmNlTG9jQiA9IGNvb3JkcztcbiAgICAgICAgLS0ke2Nvb3Jkc1tyYW5rIC0gMl19O2A7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5uZWxzID0gWyd4JywgJ3knLCAneicsICd3JywgJ3UnLCAndiddLnNsaWNlKDAsIHNvdXJjZVJhbmspO1xuICAgIGNvbnN0IGluQ2hhbm5lbCA9ICcuJyArIGNoYW5uZWxzW3NvdXJjZVJhbmsgLSAxXTsgIC8vIGUuZy4gXCIuYlwiIGZvciByYW5rIDMuXG4gICAgY29uc3QgaW50Q2hhbm5lbHMgPSBjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KTtcbiAgICBjb25zdCBzcmNSQ29vcmRzID1cbiAgICAgICAgZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY1InLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5yJyk7XG4gICAgY29uc3Qgc3JjR0Nvb3JkcyA9XG4gICAgICAgIGdldENoYW5uZWxzKCdzb3VyY2VMb2NHJywgc291cmNlUmFuayAtIDEpLmNvbmNhdCgnaW5JZHguZycpO1xuICAgIGNvbnN0IHNyY0JDb29yZHMgPVxuICAgICAgICBnZXRDaGFubmVscygnc291cmNlTG9jQicsIHNvdXJjZVJhbmsgLSAxKS5jb25jYXQoJ2luSWR4LmInKTtcbiAgICBjb25zdCBzcmNBQ29vcmRzID1cbiAgICAgICAgZ2V0Q2hhbm5lbHMoJ3NvdXJjZUxvY0EnLCBzb3VyY2VSYW5rIC0gMSkuY29uY2F0KCdpbklkeC5hJyk7XG5cbiAgICBjb25zdCBjb21wT3AgPSAob3AgPT09ICdtYXgnKSA/ICdncmVhdGVyVGhhbicgOiAnbGVzc1RoYW4nO1xuICAgIGNvbnN0IGZldGNoQ2FuZGlkYXRlSWR4ID0gZmlyc3RQYXNzID8gJycgOiBgXG4gICAgICAgICAgaW5JZHggPSByb3VuZCh2ZWM0KGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNSQ29vcmRzLmpvaW4oKX0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRCZXN0SW5kaWNlc0FDaGFubmVsKCR7c3JjR0Nvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEJlc3RJbmRpY2VzQUNoYW5uZWwoJHtzcmNBQ29vcmRzLmpvaW4oKX0pKSk7YDtcblxuICAgIGNvbnN0IGZldGNoVmFsdWUgPSBgdmVjNChcbiAgICAgICAgICAgIGdldEFDaGFubmVsKCR7c3JjUkNvb3Jkcy5qb2luKCl9KSxcbiAgICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBQ2hhbm5lbCgke3NyY0dDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBQ2hhbm5lbCgke3NyY0JDb29yZHMuam9pbigpfSkgOiAwLixcbiAgICAgICAgICAgIGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCA/IGdldEFDaGFubmVsKCR7c3JjQUNvb3Jkcy5qb2luKCl9KSA6IDAuKWA7XG5cbiAgICBjb25zdCBnZXRCZXN0SW5kaWNlc0FDaGFubmVsU25pcHBldCA9IGZpcnN0UGFzcyA/ICcnIDogYFxuICAgICAgZmxvYXQgZ2V0QmVzdEluZGljZXNBQ2hhbm5lbCgke2ludENoYW5uZWxzLmpvaW4oKX0pIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QmVzdEluZGljZXNBKCR7Y2hhbm5lbHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWMyKCR7Y2hhbm5lbHMuc2xpY2UoLTIpLmpvaW4oKX0pKTtcbiAgICAgIH1gO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGZsb2F0IGdldEFDaGFubmVsKCR7aW50Q2hhbm5lbHMuam9pbigpfSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChnZXRBKCR7Y2hhbm5lbHMuam9pbigpfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke2NoYW5uZWxzLnNsaWNlKC0yKS5qb2luKCl9KSk7XG4gICAgICB9XG4gICAgICAke2dldEJlc3RJbmRpY2VzQUNoYW5uZWxTbmlwcGV0fVxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gJHtjb29yZHNbcmFuayAtIDFdfSA8ICR7b3V0U2hhcGVbcmFuayAtIDFdIC0gMX07XG4gICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9ICR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke291dFNoYXBlW3JhbmsgLSAyXSAtIDF9O1xuICAgICAgICAke3NvdXJjZUxvY1NldHVwfVxuICAgICAgICBpdmVjNCBzcmNJZHggPSBpdmVjNChzb3VyY2VMb2NSJHtpbkNoYW5uZWx9LCBzb3VyY2VMb2NHJHtpbkNoYW5uZWx9LFxuICAgICAgICAgIHNvdXJjZUxvY0Ike2luQ2hhbm5lbH0sIHNvdXJjZUxvY0Eke2luQ2hhbm5lbH0pICogJHt3aW5kb3dTaXplfTtcbiAgICAgICAgaXZlYzQgaW5JZHggPSBzcmNJZHg7XG4gICAgICAgIHZlYzQgYmVzdEluZGV4ID0gdmVjNChpbklkeCk7XG4gICAgICAgIHZlYzQgYmVzdFZhbHVlID0gJHtmZXRjaFZhbHVlfTtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZX07IGkrKykge1xuICAgICAgICAgIGluSWR4ID0gc3JjSWR4O1xuICAgICAgICAgICR7ZmV0Y2hDYW5kaWRhdGVJZHh9XG4gICAgICAgICAgdmVjNCBjYW5kaWRhdGUgPSAke2ZldGNoVmFsdWV9O1xuICAgICAgICAgIGJ2ZWM0IG5hbiA9IGlzbmFuKGNhbmRpZGF0ZSk7XG4gICAgICAgICAgYnZlYzQgcmVwbGFjZSA9IGJ2ZWM0KFxuICAgICAgICAgICAgdmVjNCgke2NvbXBPcH0oY2FuZGlkYXRlLCBiZXN0VmFsdWUpKSAqICh2ZWM0KDEuMCkgLSB2ZWM0KG5hbikpKTtcblxuICAgICAgICAgIGJlc3RWYWx1ZSA9IHZlYzQocmVwbGFjZS54ICA/IGNhbmRpZGF0ZS54IDogYmVzdFZhbHVlLngsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlLnkgID8gY2FuZGlkYXRlLnkgOiBiZXN0VmFsdWUueSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2UueiAgPyBjYW5kaWRhdGUueiA6IGJlc3RWYWx1ZS56LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZS53ICA/IGNhbmRpZGF0ZS53IDogYmVzdFZhbHVlLncpO1xuICAgICAgICAgIGJlc3RJbmRleCA9IG1peChiZXN0SW5kZXgsIHZlYzQoaW5JZHgpLCB2ZWM0KHJlcGxhY2UpKTtcbiAgICAgICAgICBzcmNJZHgrKztcbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoYmVzdEluZGV4KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, util } from '@tensorflow/tfjs-core';\nimport { ArgMinMaxProgram } from '../argminmax_gpu';\nimport { ArgMinMaxPackedProgram } from '../argminmax_packed_gpu';\nimport { reshape } from '../kernels/Reshape';\nfunction argReduce(backend, x, reduceType, bestIndicesA = null) {\n    let batchSize = x.shape[0];\n    let inSize = x.shape[1];\n    if (bestIndicesA != null) {\n        batchSize = bestIndicesA.shape[0];\n        inSize = bestIndicesA.shape[1];\n    }\n    const windowSize = backend_util.computeOptimalWindowSize(inSize);\n    const reduceInfo = { windowSize, inSize, batchSize, outSize: Math.ceil(inSize / windowSize) };\n    const program = new ArgMinMaxProgram(reduceInfo, reduceType, bestIndicesA == null);\n    const inputs = [x];\n    if (bestIndicesA != null) {\n        inputs.push(bestIndicesA);\n    }\n    const output = backend.runWebGLProgram(program, inputs, 'int32');\n    // No need to run another GPGPU program.\n    if (output.shape[1] === 1) {\n        return output;\n    }\n    const result = argReduce(backend, x, reduceType, output);\n    backend.disposeIntermediateTensorInfo(output);\n    return result;\n}\nfunction argReducePacked(backend, x, reduceType, bestIndicesA = null) {\n    const inShape = bestIndicesA != null ? bestIndicesA.shape : x.shape;\n    const inSize = inShape[inShape.length - 1];\n    const windowSize = backend_util.computeOptimalWindowSize(inSize);\n    const program = new ArgMinMaxPackedProgram(inShape, windowSize, reduceType, bestIndicesA == null);\n    const inputs = bestIndicesA == null ? [x] : [x, bestIndicesA];\n    const output = backend.runWebGLProgram(program, inputs, 'int32');\n    if (output.shape.length === x.shape.length) {\n        const result = argReducePacked(backend, x, reduceType, output);\n        backend.disposeIntermediateTensorInfo(output);\n        return result;\n    }\n    return output;\n}\nexport function argMinMaxReduce(backend, x, axis, reduceType) {\n    const axes = [axis];\n    backend_util.assertAxesAreInnerMostDims('arg' + reduceType.charAt(0).toUpperCase() + reduceType.slice(1), axes, x.shape.length);\n    if (!env().getBool('WEBGL_PACK_REDUCE') || x.shape.length <= 2) {\n        const intermediateTensorInfos = [];\n        // Eagerly unpack x input since it is passed in to all the shaders which\n        // require unpacked inputs.\n        const xtexData = backend.texData.get(x.dataId);\n        const xIsPacked = xtexData !== null && xtexData.isPacked;\n        let xUnPacked = x;\n        if (xIsPacked) {\n            xUnPacked = backend.unpackTensor(x);\n            intermediateTensorInfos.push(xUnPacked);\n        }\n        const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(xUnPacked.shape, axes);\n        const inSize = util.sizeFromShape(reduceShape);\n        const a2D = reshape({ inputs: { x: xUnPacked }, backend, attrs: { shape: [-1, inSize] } });\n        intermediateTensorInfos.push(a2D);\n        const reduced = argReduce(backend, a2D, reduceType);\n        intermediateTensorInfos.push(reduced);\n        const reshaped = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n        intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n        return reshaped;\n    }\n    return argReducePacked(backend, x, reduceType);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJnX21pbl9tYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbF91dGlscy9hcmdfbWluX21heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBYyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNsRCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx5QkFBeUIsQ0FBQztBQUUvRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsU0FBUyxTQUFTLENBQ2QsT0FBeUIsRUFBRSxDQUFhLEVBQUUsVUFBdUIsRUFDakUsZUFBMkIsSUFBSTtJQUNqQyxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNCLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEIsSUFBSSxZQUFZLElBQUksSUFBSSxFQUFFO1FBQ3hCLFNBQVMsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQ2hDO0lBQ0QsTUFBTSxVQUFVLEdBQUcsWUFBWSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sVUFBVSxHQUNaLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxFQUFDLENBQUM7SUFDN0UsTUFBTSxPQUFPLEdBQ1QsSUFBSSxnQkFBZ0Is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LENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkQsT0FBTyxRQUFRLENBQUM7S0FDakI7SUFDRCxPQUFPLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7QXJnTWluTWF4UHJvZ3JhbX0gZnJvbSAnLi4vYXJnbWlubWF4X2dwdSc7XG5pbXBvcnQge0FyZ01pbk1heFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2FyZ21pbm1heF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4uL2tlcm5lbHMvUmVzaGFwZSc7XG5cbmZ1bmN0aW9uIGFyZ1JlZHVjZShcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCB4OiBUZW5zb3JJbmZvLCByZWR1Y2VUeXBlOiAnbWF4J3wnbWluJyxcbiAgICBiZXN0SW5kaWNlc0E6IFRlbnNvckluZm8gPSBudWxsKTogVGVuc29ySW5mbyB7XG4gIGxldCBiYXRjaFNpemUgPSB4LnNoYXBlWzBdO1xuICBsZXQgaW5TaXplID0geC5zaGFwZVsxXTtcbiAgaWYgKGJlc3RJbmRpY2VzQSAhPSBudWxsKSB7XG4gICAgYmF0Y2hTaXplID0gYmVzdEluZGljZXNBLnNoYXBlWzBdO1xuICAgIGluU2l6ZSA9IGJlc3RJbmRpY2VzQS5zaGFwZVsxXTtcbiAgfVxuICBjb25zdCB3aW5kb3dTaXplID0gYmFja2VuZF91dGlsLmNvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShpblNpemUpO1xuICBjb25zdCByZWR1Y2VJbmZvID1cbiAgICAgIHt3aW5kb3dTaXplLCBpblNpemUsIGJhdGNoU2l6ZSwgb3V0U2l6ZTogTWF0aC5jZWlsKGluU2l6ZSAvIHdpbmRvd1NpemUpfTtcbiAgY29uc3QgcHJvZ3JhbSA9XG4gICAgICBuZXcgQXJnTWluTWF4UHJvZ3JhbShyZWR1Y2VJbmZvLCByZWR1Y2VUeXBlLCBiZXN0SW5kaWNlc0EgPT0gbnVsbCk7XG4gIGNvbnN0IGlucHV0cyA9IFt4XTtcbiAgaWYgKGJlc3RJbmRpY2VzQSAhPSBudWxsKSB7XG4gICAgaW5wdXRzLnB1c2goYmVzdEluZGljZXNBKTtcbiAgfVxuICBjb25zdCBvdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBpbnB1dHMsICdpbnQzMicpO1xuICAvLyBObyBuZWVkIHRvIHJ1biBhbm90aGVyIEdQR1BVIHByb2dyYW0uXG4gIGlmIChvdXRwdXQuc2hhcGVbMV0gPT09IDEpIHtcbiAgICByZXR1cm4gb3V0cHV0O1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFyZ1JlZHVjZShiYWNrZW5kLCB4LCByZWR1Y2VUeXBlLCBvdXRwdXQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIGFyZ1JlZHVjZVBhY2tlZChcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCB4OiBUZW5zb3JJbmZvLCByZWR1Y2VUeXBlOiAnbWF4J3wnbWluJyxcbiAgICBiZXN0SW5kaWNlc0E6IFRlbnNvckluZm8gPSBudWxsKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGluU2hhcGUgPSBiZXN0SW5kaWNlc0EgIT0gbnVsbCA/IGJlc3RJbmRpY2VzQS5zaGFwZSA6IHguc2hhcGU7XG4gIGNvbnN0IGluU2l6ZSA9IGluU2hhcGVbaW5TaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3Qgd2luZG93U2l6ZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3B0aW1hbFdpbmRvd1NpemUoaW5TaXplKTtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBBcmdNaW5NYXhQYWNrZWRQcm9ncmFtKFxuICAgICAgaW5TaGFwZSwgd2luZG93U2l6ZSwgcmVkdWNlVHlwZSwgYmVzdEluZGljZXNBID09IG51bGwpO1xuICBjb25zdCBpbnB1dHMgPSBiZXN0SW5kaWNlc0EgPT0gbnVsbCA/IFt4XSA6IFt4LCBiZXN0SW5kaWNlc0FdO1xuICBjb25zdCBvdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBpbnB1dHMsICdpbnQzMicpO1xuICBpZiAob3V0cHV0LnNoYXBlLmxlbmd0aCA9PT0geC5zaGFwZS5sZW5ndGgpIHtcbiAgICBjb25zdCByZXN1bHQgPSBhcmdSZWR1Y2VQYWNrZWQoYmFja2VuZCwgeCwgcmVkdWNlVHlwZSwgb3V0cHV0KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dHB1dCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gYXJnTWluTWF4UmVkdWNlKFxuICAgIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIHg6IFRlbnNvckluZm8sIGF4aXM6IG51bWJlcixcbiAgICByZWR1Y2VUeXBlOiAnbWluJ3wnbWF4Jyk6IFRlbnNvckluZm8ge1xuICBjb25zdCBheGVzID0gW2F4aXNdO1xuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoXG4gICAgICAnYXJnJyArIHJlZHVjZVR5cGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyByZWR1Y2VUeXBlLnNsaWNlKDEpLCBheGVzLFxuICAgICAgeC5zaGFwZS5sZW5ndGgpO1xuICBpZiAoIWVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfUkVEVUNFJykgfHwgeC5zaGFwZS5sZW5ndGggPD0gMikge1xuICAgIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zID0gW107XG4gICAgLy8gRWFnZXJseSB1bnBhY2sgeCBpbnB1dCBzaW5jZSBpdCBpcyBwYXNzZWQgaW4gdG8gYWxsIHRoZSBzaGFkZXJzIHdoaWNoXG4gICAgLy8gcmVxdWlyZSB1bnBhY2tlZCBpbnB1dHMuXG4gICAgY29uc3QgeHRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCB4SXNQYWNrZWQgPSB4dGV4RGF0YSAhPT0gbnVsbCAmJiB4dGV4RGF0YS5pc1BhY2tlZDtcbiAgICBsZXQgeFVuUGFja2VkID0geDtcbiAgICBpZiAoeElzUGFja2VkKSB7XG4gICAgICB4VW5QYWNrZWQgPSBiYWNrZW5kLnVucGFja1RlbnNvcih4KTtcbiAgICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goeFVuUGFja2VkKTtcbiAgICB9XG5cbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHhVblBhY2tlZC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhMkQgPSByZXNoYXBlKFxuICAgICAgICB7aW5wdXRzOiB7eDogeFVuUGFja2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goYTJEKTtcblxuICAgIGNvbnN0IHJlZHVjZWQgPSBhcmdSZWR1Y2UoYmFja2VuZCwgYTJELCByZWR1Y2VUeXBlKTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKHJlZHVjZWQpO1xuICAgIGNvbnN0IHJlc2hhcGVkID1cbiAgICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuXG4gICAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgICAgdCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgICByZXR1cm4gcmVzaGFwZWQ7XG4gIH1cbiAgcmV0dXJuIGFyZ1JlZHVjZVBhY2tlZChiYWNrZW5kLCB4LCByZWR1Y2VUeXBlKTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMax, backend_util, util } from '@tensorflow/tfjs-core';\nimport { argMinMaxReduce } from '../kernel_utils/arg_min_max';\nimport { transpose } from './Transpose';\nexport function argMax(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis } = attrs;\n    let axes = util.parseAxisParam(axis, x.shape);\n    const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n    let $x = x;\n    const intermediateTensorInfos = [];\n    if (permutedAxes != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        intermediateTensorInfos.push($x);\n        axes = backend_util.getInnerMostAxes(axes.length, $x.shape.length);\n    }\n    backend_util.assertAxesAreInnerMostDims('argMax', [axes[0]], $x.shape.length);\n    const out = argMinMaxReduce(backend, $x, axes[0], 'max');\n    intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return out;\n}\nexport const argMaxConfig = {\n    kernelName: ArgMax,\n    backendName: 'webgl',\n    kernelFunc: argMax\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FyZ01heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUE2QixZQUFZLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2xJLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUU1RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztJQUNuQyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDeEIsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3BFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNwRTtJQUVELFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlFLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV6RCx1QkFBdUIsQ0FBQyxPQUFPLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBcmdNYXgsIEFyZ01heEF0dHJzLCBBcmdNYXhJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHthcmdNaW5NYXhSZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9hcmdfbWluX21heCc7XG5cbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhcmdNYXgoXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogQXJnTWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQXJnTWF4QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpc30gPSBhdHRycztcblxuICBsZXQgYXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeC5zaGFwZS5sZW5ndGgpO1xuICBsZXQgJHggPSB4O1xuICBjb25zdCBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcyA9IFtdO1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICAkeCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0ZWRBeGVzfX0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goJHgpO1xuICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgJHguc2hhcGUubGVuZ3RoKTtcbiAgfVxuXG4gIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnYXJnTWF4JywgW2F4ZXNbMF1dLCAkeC5zaGFwZS5sZW5ndGgpO1xuICBjb25zdCBvdXQgPSBhcmdNaW5NYXhSZWR1Y2UoYmFja2VuZCwgJHgsIGF4ZXNbMF0sICdtYXgnKTtcblxuICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKFxuICAgICAgdCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGFyZ01heENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBcmdNYXgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhcmdNYXggYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ArgMin, backend_util, util } from '@tensorflow/tfjs-core';\nimport { argMinMaxReduce } from '../kernel_utils/arg_min_max';\nimport { transpose } from './Transpose';\nexport function argMin(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis } = attrs;\n    let axes = util.parseAxisParam(axis, x.shape);\n    const permutedAxes = backend_util.getAxesPermutation(axes, x.shape.length);\n    let $x = x;\n    const intermediateTensorInfos = [];\n    if (permutedAxes != null) {\n        $x = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        intermediateTensorInfos.push($x);\n        axes = backend_util.getInnerMostAxes(axes.length, $x.shape.length);\n    }\n    backend_util.assertAxesAreInnerMostDims('argMin', [axes[0]], $x.shape.length);\n    const out = argMinMaxReduce(backend, $x, axes[0], 'min');\n    intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return out;\n}\nexport const argMinConfig = {\n    kernelName: ArgMin,\n    backendName: 'webgl',\n    kernelFunc: argMin\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXJnTWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0FyZ01pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUE2QixZQUFZLEVBQXdDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2xJLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsSUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlDLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMzRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWCxNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztJQUNuQyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDeEIsRUFBRSxHQUFHLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3BFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNqQyxJQUFJLEdBQUcsWUFBWSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUNwRTtJQUVELFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlFLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV6RCx1QkFBdUIsQ0FBQyxPQUFPLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBcmdNaW4sIEFyZ01pbkF0dHJzLCBBcmdNaW5JbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHthcmdNaW5NYXhSZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9hcmdfbWluX21heCc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJnTWluKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IEFyZ01pbklucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IEFyZ01pbkF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgbGV0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIHguc2hhcGUpO1xuICBjb25zdCBwZXJtdXRlZEF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKGF4ZXMsIHguc2hhcGUubGVuZ3RoKTtcbiAgbGV0ICR4ID0geDtcbiAgY29uc3QgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MgPSBbXTtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgJHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5wdXNoKCR4KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsICR4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ2FyZ01pbicsIFtheGVzWzBdXSwgJHguc2hhcGUubGVuZ3RoKTtcblxuICBjb25zdCBvdXQgPSBhcmdNaW5NYXhSZWR1Y2UoYmFja2VuZCwgJHgsIGF4ZXNbMF0sICdtaW4nKTtcblxuICBpbnRlcm1lZGlhdGVUZW5zb3JJbmZvcy5mb3JFYWNoKFxuICAgICAgdCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGFyZ01pbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBcmdNaW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhcmdNaW4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asin } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ASIN = CHECK_NAN_SNIPPET + `\n  if (abs(x) > 1.) {\n    return NAN;\n  }\n  return asin(x);\n`;\nexport const asin = unaryKernelFunc({ opSnippet: ASIN });\nexport const asinConfig = {\n    kernelName: Asin,\n    backendName: 'webgl',\n    kernelFunc: asin,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Bc2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLEdBQUc7Ozs7O0NBS2hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW4sIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBU0lOID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIGlmIChhYnMoeCkgPiAxLikge1xuICAgIHJldHVybiBOQU47XG4gIH1cbiAgcmV0dXJuIGFzaW4oeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgYXNpbiA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBU0lOfSk7XG5cbmV4cG9ydCBjb25zdCBhc2luQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEFzaW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhc2luLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Asinh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ASINH = CHECK_NAN_SNIPPET + `return log(x + sqrt(x * x + 1.0));`;\nexport const asinh = unaryKernelFunc({ opSnippet: ASINH });\nexport const asinhConfig = {\n    kernelName: Asinh,\n    backendName: 'webgl',\n    kernelFunc: asinh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXNpbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQXNpbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsR0FBRyxvQ0FBb0MsQ0FBQztBQUV2RSxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0FzaW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVNJTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGByZXR1cm4gbG9nKHggKyBzcXJ0KHggKiB4ICsgMS4wKSk7YDtcblxuZXhwb3J0IGNvbnN0IGFzaW5oID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEFTSU5IfSk7XG5cbmV4cG9ydCBjb25zdCBhc2luaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBc2luaCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGFzaW5oLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ATAN = CHECK_NAN_SNIPPET + `\n  return atan(x);\n`;\nexport const atan = unaryKernelFunc({ opSnippet: ATAN });\nexport const atanConfig = {\n    kernelName: Atan,\n    backendName: 'webgl',\n    kernelFunc: atan,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BdGFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxJQUFJLEdBQUcsaUJBQWlCLEdBQUc7O0NBRWhDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW4sIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBBVEFOID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBhdGFuKHgpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGF0YW4gPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQVRBTn0pO1xuXG5leHBvcnQgY29uc3QgYXRhbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdGFuLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXRhbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atan2 } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET } from '../binaryop_gpu';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst ATAN2 = CHECK_NAN_SNIPPET + `\n  return atan(a, b);\n`;\nconst ATAN2_PACKED = `\n  vec4 result = atan(a, b);\n  bvec4 isNaNA = isnan(a);\n  bvec4 isNaNB = isnan(b);\n  bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n  ` +\n    CHECK_NAN_SNIPPET_PACKED + `\n  return result;\n`;\nexport const atan2 = binaryKernelFunc({ opSnippet: ATAN2, packedOpSnippet: ATAN2_PACKED });\nexport const atan2Config = {\n    kernelName: Atan2,\n    backendName: 'webgl',\n    kernelFunc: atan2,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQXRhbjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTVDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixHQUFHOztDQUVqQyxDQUFDO0FBRUYsTUFBTSxZQUFZLEdBQUc7Ozs7O0dBS2xCO0lBQ0Msd0JBQXdCLEdBQUc7O0NBRTlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQ2QsZ0JBQWdCLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0FBRXhFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQUs7Q0FDbEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtBdGFuMn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IEFUQU4yID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiBhdGFuKGEsIGIpO1xuYDtcblxuY29uc3QgQVRBTjJfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IGF0YW4oYSwgYik7XG4gIGJ2ZWM0IGlzTmFOQSA9IGlzbmFuKGEpO1xuICBidmVjNCBpc05hTkIgPSBpc25hbihiKTtcbiAgYnZlYzQgaXNOYU4gPSBidmVjNChpc05hTkEueCB8fCBpc05hTkIueCwgaXNOYU5BLnkgfHwgaXNOYU5CLnksIGlzTmFOQS56IHx8IGlzTmFOQi56LCBpc05hTkEudyB8fCBpc05hTkIudyk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCBhdGFuMiA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBVEFOMiwgcGFja2VkT3BTbmlwcGV0OiBBVEFOMl9QQUNLRUR9KTtcblxuZXhwb3J0IGNvbnN0IGF0YW4yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF0YW4yLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXRhbjIsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Atanh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst ATANH = CHECK_NAN_SNIPPET + `\n  if ((x < -1.0) || (x > 1.0)) return NAN;\nreturn (log(1.0 + x) - log(1.0 - x)) / 2.0;`;\nexport const atanh = unaryKernelFunc({ opSnippet: ATANH });\nexport const atanhConfig = {\n    kernelName: Atanh,\n    backendName: 'webgl',\n    kernelFunc: atanh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXRhbmguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQXRhbmgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsR0FBRzs7NENBRVUsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBQyxDQUFDLENBQUM7QUFFekQsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0F0YW5oLCBLZXJuZWxDb25maWd9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgQVRBTkggPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgaWYgKCh4IDwgLTEuMCkgfHwgKHggPiAxLjApKSByZXR1cm4gTkFOO1xucmV0dXJuIChsb2coMS4wICsgeCkgLSBsb2coMS4wIC0geCkpIC8gMi4wO2A7XG5cbmV4cG9ydCBjb25zdCBhdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBBVEFOSH0pO1xuXG5leHBvcnQgY29uc3QgYXRhbmhDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXRhbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdGFuaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class Pool2DProgram {\n    constructor(convInfo, poolType, computePositions, flattenPositions = false, includeBatchInIndex = false) {\n        this.variableNames = ['x'];\n        if (poolType === 'avg' && computePositions) {\n            throw new Error('Cannot compute positions for average pool.');\n        }\n        const filterWidth = convInfo.filterWidth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const dilationHeight = convInfo.dilationHeight;\n        const dilationWidth = convInfo.dilationWidth;\n        const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n        const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n        const padTop = convInfo.padInfo.top;\n        const padLeft = convInfo.padInfo.left;\n        this.outputShape = convInfo.outShape;\n        const isAvgPool = poolType === 'avg';\n        const batchFlattenPositionStr = `((batch  * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + d`;\n        const flattenPositionStr = `(xR * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + d`;\n        let initializationValue = '0.0';\n        if (!isAvgPool) {\n            // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n            initializationValue = '-1.0 / 1e-20';\n        }\n        if (computePositions) {\n            const compareOp = '>=';\n            this.userCode = `\n        const ivec2 strides = ivec2(${strideHeight}, ${strideWidth});\n        const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n        void main() {\n          ivec4 coords = getOutputCoords();\n          int batch = coords[0];\n          int d = coords[3];\n\n          ivec2 xRCCorner = coords.yz * strides - pads;\n          int xRCorner = xRCCorner.x;\n          int xCCorner = xRCCorner.y;\n\n          // max/min x(?, ?, d) to get y(yR, yC, d).\n          // ? = to be determined\n          float minMaxValue = 0.0;\n          float minMaxValueFound = 0.0;\n          int minMaxPosition = 0;\n          float avgValue = 0.0;\n\n          for (int wR = 0; wR < ${effectiveFilterHeight};\n              wR += ${dilationHeight}) {\n            int xR = xRCorner + wR;\n\n            if (xR < 0 || xR >= ${convInfo.inHeight}) {\n              continue;\n            }\n\n            for (int wC = 0; wC < ${effectiveFilterWidth};\n                wC += ${dilationWidth}) {\n              int xC = xCCorner + wC;\n\n              if (xC < 0 || xC >= ${convInfo.inWidth}) {\n                continue;\n              }\n\n              float value = getX(batch, xR, xC, d);\n\n              // If a min / max value has already been found, use it. If not,\n              // use the current value.\n              float currMinMaxValue = mix(\n                  value, minMaxValue, minMaxValueFound);\n              if (value ${compareOp} currMinMaxValue) {\n                minMaxValue = value;\n                minMaxValueFound = 1.0;\n                minMaxPosition = ${flattenPositions ? (includeBatchInIndex ? batchFlattenPositionStr :\n                flattenPositionStr) :\n                `wR * ${effectiveFilterWidth} + wC`};\n              }\n            }\n          }\n          setOutput(float(minMaxPosition));\n        }\n      `;\n            return;\n        }\n        const compareOp = 'max';\n        let returnValue = `${poolType}(${poolType}(${poolType}(` +\n            'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n        if (poolType === 'avg') {\n            returnValue = `avgValue / count`;\n        }\n        const filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4;\n        const filterWidthVec4Remainder = filterWidth % 4;\n        const updateSnippet = `\n      if (${isAvgPool}) {\n        avgValue += dot(values, ones);\n      } else {\n        minMaxValue = ${compareOp}(values, minMaxValue);\n      }\n    `;\n        this.userCode = `\n      const ivec2 strides = ivec2(${strideHeight}, ${strideWidth});\n      const ivec2 pads = ivec2(${padTop}, ${padLeft});\n      const float initializationValue = ${initializationValue};\n      const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n      float count = 0.0;\n\n      float getValue(int batch, int xR, int xC, int d) {\n        if (xC < 0 || xC >= ${convInfo.inWidth}) {\n          return initializationValue;\n        }\n        count += 1.0;\n        return getX(batch, xR, xC, d);\n      }\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int batch = coords[0];\n        int d = coords[3];\n\n        ivec2 xRCCorner = coords.yz * strides - pads;\n        int xRCorner = xRCCorner.x;\n        int xCCorner = xRCCorner.y;\n\n        // max/min x(?, ?, d) to get y(yR, yC, d).\n        // ? = to be determined\n        vec4 minMaxValue = vec4(${initializationValue});\n        float avgValue = 0.0;\n        count = 0.0;\n\n        for (int wR = 0; wR < ${effectiveFilterHeight};\n            wR += ${dilationHeight}) {\n          int xR = xRCorner + wR;\n\n          if (xR < 0 || xR >= ${convInfo.inHeight}) {\n            continue;\n          }\n\n          for (int wC = 0; wC < ${filterWidthNearestVec4}; wC += 4) {\n            int xC = xCCorner + wC * ${dilationWidth};\n\n            vec4 values = vec4(\n              getValue(batch, xR, xC, d),\n              getValue(batch, xR, xC + ${dilationWidth}, d),\n              getValue(batch, xR, xC + 2 * ${dilationWidth}, d),\n              getValue(batch, xR, xC + 3 * ${dilationWidth}, d)\n            );\n\n            ${updateSnippet}\n          }\n\n          int xC = xCCorner + ${filterWidthNearestVec4};\n          if (${filterWidthVec4Remainder === 1}) {\n            vec4 values = vec4(\n              getValue(batch, xR, xC, d),\n              initializationValue,\n              initializationValue,\n              initializationValue\n            );\n\n            ${updateSnippet}\n          } else if (${filterWidthVec4Remainder === 2}) {\n            vec4 values = vec4(\n              getValue(batch, xR, xC, d),\n              getValue(batch, xR, xC + ${dilationWidth}, d),\n              initializationValue,\n              initializationValue\n            );\n\n            ${updateSnippet}\n          } else if (${filterWidthVec4Remainder === 3}) {\n            vec4 values = vec4(\n              getValue(batch, xR, xC, d),\n              getValue(batch, xR, xC + ${dilationWidth}, d),\n              getValue(batch, xR, xC + 2 * ${dilationWidth}, d),\n              initializationValue\n            );\n\n            ${updateSnippet}\n          }\n        }\n        setOutput(${returnValue});\n      }\n    `;\n    }\n}\nexport class Pool3DProgram {\n    constructor(convInfo, poolType, computePositions, flattenPositions = false, includeBatchInIndex = false) {\n        this.variableNames = ['x'];\n        if (poolType === 'avg' && computePositions) {\n            throw new Error('Cannot compute positions for average pool.');\n        }\n        const filterWidth = convInfo.filterWidth;\n        const strideDepth = convInfo.strideDepth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const dilationDepth = convInfo.dilationDepth;\n        const dilationHeight = convInfo.dilationHeight;\n        const dilationWidth = convInfo.dilationWidth;\n        const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n        const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n        const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n        const padFront = convInfo.padInfo.front;\n        const padTop = convInfo.padInfo.top;\n        const padLeft = convInfo.padInfo.left;\n        this.outputShape = convInfo.outShape;\n        const isAvgPool = poolType === 'avg';\n        let initializationValue = '0.0';\n        if (!isAvgPool) {\n            // WebGL on Firefox Linux can't compile 1/0 so we do 1/eps.\n            initializationValue = '-1.0 / 1e-20';\n        }\n        if (computePositions) {\n            const compareOp = '>=';\n            this.userCode = `\n        const ivec3 strides =\n            ivec3(${strideDepth}, ${strideHeight}, ${strideWidth});\n        const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n\n        void main() {\n          ivec5 coords = getOutputCoords();\n          int batch = coords.x;\n          int ch = coords.u;\n\n          ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n          int xDCorner = xCorner.x;\n          int xRCorner = xCorner.y;\n          int xCCorner = xCorner.z;\n\n          // max/min x(?, ?, ?, ch) to get y(yD, yR, yC, ch).\n          // ? = to be determined\n          float minMaxValue = 0.0;\n          float minMaxValueFound = 0.0;\n          int minMaxPosition = 0;\n\n          for (int wD = 0; wD < ${effectiveFilterDepth};\n              wD += ${dilationDepth}) {\n            int xD = xDCorner + wD;\n\n            if (xD < 0 || xD >= ${convInfo.inDepth}) {\n              continue;\n            }\n\n            for (int wR = 0; wR < ${effectiveFilterHeight};\n                wR += ${dilationHeight}) {\n              int xR = xRCorner + wR;\n\n              if (xR < 0 || xR >= ${convInfo.inHeight}) {\n                continue;\n              }\n\n              for (int wC = 0; wC < ${effectiveFilterWidth};\n                  wC += ${dilationWidth}) {\n                int xC = xCCorner + wC;\n\n                if (xC < 0 || xC >= ${convInfo.inWidth}) {\n                  continue;\n                }\n\n                float value = getX(batch, xD, xR, xC, ch);\n\n                // If a min / max value has already been found, use it. If not,\n                // use the current value.\n                float currMinMaxValue = mix(\n                    value, minMaxValue, minMaxValueFound);\n                if (value ${compareOp} currMinMaxValue) {\n                  minMaxValue = value;\n                  minMaxValueFound = 1.0;\n                  minMaxPosition = ${flattenPositions ?\n                (includeBatchInIndex ?\n                    `(((batch * ${convInfo.inDepth} + xD) * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + ch` :\n                    `((xD * ${convInfo.inHeight} + xR) * ${convInfo.inWidth} + xC) * ${convInfo.inChannels} + ch`) :\n                `wD * ${effectiveFilterHeight} * ${effectiveFilterWidth} +\n                      wR * ${effectiveFilterWidth} + wC`};\n                }\n              }\n            }\n          }\n          setOutput(float(minMaxPosition));\n        }\n      `;\n            return;\n        }\n        const compareOp = 'max';\n        let returnValue = `${poolType}(${poolType}(${poolType}(` +\n            'minMaxValue[0], minMaxValue[1]), minMaxValue[2]), minMaxValue[3])';\n        if (poolType === 'avg') {\n            returnValue = `avgValue / count`;\n        }\n        const filterWidthNearestVec4 = Math.floor(filterWidth / 4) * 4;\n        const filterWidthVec4Remainder = filterWidth % 4;\n        const updateSnippet = `\n      if (${isAvgPool}) {\n        avgValue += dot(values, ones);\n      } else {\n        minMaxValue = ${compareOp}(values, minMaxValue);\n      }\n    `;\n        this.userCode = `\n      const ivec3 strides =\n        ivec3(${strideDepth}, ${strideHeight}, ${strideWidth});\n      const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n      const float initializationValue = ${initializationValue};\n      const vec4 ones = vec4(1.0, 1.0, 1.0, 1.0);\n\n      float count = 0.0;\n\n      float getValue(int batch, int xD, int xR, int xC, int ch) {\n        if (xC < 0 || xC >= ${convInfo.inWidth}) {\n          return initializationValue;\n        }\n        count += 1.0;\n        return getX(batch, xD, xR, xC, ch);\n      }\n\n      void main() {\n        ivec5 coords = getOutputCoords();\n        int batch = coords.x;\n        int ch = coords.u;\n\n        ivec3 xCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n        int xDCorner = xCorner.x;\n        int xRCorner = xCorner.y;\n        int xCCorner = xCorner.z;\n\n        // max/min x(?, ?, ?, d) to get y(yD, yR, yC, ch).\n        // ? = to be determined\n        vec4 minMaxValue = vec4(${initializationValue});\n        float avgValue = 0.0;\n        count = 0.0;\n\n        for (int wD = 0; wD < ${effectiveFilterDepth};\n            wD += ${dilationDepth}) {\n          int xD = xDCorner + wD;\n\n          if (xD < 0 || xD >= ${convInfo.inDepth}) {\n            continue;\n          }\n\n          for (int wR = 0; wR < ${effectiveFilterHeight};\n            wR += ${dilationHeight}) {\n            int xR = xRCorner + wR;\n\n            if (xR < 0 || xR >= ${convInfo.inHeight}) {\n              continue;\n            }\n\n            for (int wC = 0; wC < ${filterWidthNearestVec4}; wC += 4) {\n              int xC = xCCorner + wC * ${dilationWidth};\n\n              vec4 values = vec4(\n                getValue(batch, xD, xR, xC, ch),\n                getValue(batch, xD, xR, xC + ${dilationWidth}, ch),\n                getValue(batch, xD, xR, xC + 2 * ${dilationWidth}, ch),\n                getValue(batch, xD, xR, xC + 3 * ${dilationWidth}, ch)\n              );\n\n              ${updateSnippet}\n            }\n\n            int xC = xCCorner + ${filterWidthNearestVec4};\n            if (${filterWidthVec4Remainder === 1}) {\n              vec4 values = vec4(\n                getValue(batch, xD, xR, xC, ch),\n                initializationValue,\n                initializationValue,\n                initializationValue\n              );\n\n              ${updateSnippet}\n            } else if (${filterWidthVec4Remainder === 2}) {\n              vec4 values = vec4(\n                getValue(batch, xD, xR, xC, ch),\n                getValue(batch, xD, xR, xC + ${dilationWidth}, ch),\n                initializationValue,\n                initializationValue\n              );\n\n              ${updateSnippet}\n            } else if (${filterWidthVec4Remainder === 3}) {\n              vec4 values = vec4(\n                getValue(batch, xD, xR, xC, ch),\n                getValue(batch, xD, xR, xC + ${dilationWidth}, ch),\n                getValue(batch, xD, xR, xC + 2 * ${dilationWidth}, ch),\n                initializationValue\n              );\n\n              ${updateSnippet}\n            }\n          }\n          setOutput(${returnValue});\n        }\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9vbF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3Bvb2xfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQ0ksUUFBaUMsRUFBRSxRQUFxQixFQUN4RCxnQkFBeUIsRUFBRSxnQkFBZ0IsR0FBRyxLQUFLLEVBQ25ELG1CQUFtQixHQUFHLEtBQUs7UUFQL0Isa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBUXBCLElBQUksUUFBUSxLQUFLLEtBQUssSUFBSSxnQkFBZ0IsRUFBRTtZQUMxQyxNQUFNLElBQUksS0FBSyxDQUFDLDRDQUE0QyxDQUFDLENBQUM7U0FDL0Q7UUFFRCxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7UUFDN0QsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFFM0QsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBRXJDLE1BQU0sU0FBUyxHQUFHLFFBQVEsS0FBSyxLQUFLLENBQUM7UUFDckMsTUFBTSx1QkFBdUIsR0FB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QkFBbUI7Ozs7Ozs4QkFNL0IsUUFBUSxDQUFDLE9BQU87Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7a0NBbUJaLG1CQUFtQjs7OztnQ0FJckIsb0JBQW9CO29CQUNoQyxhQUFhOzs7Z0NBR0QsUUFBUSxDQUFDLE9BQU87Ozs7a0NBSWQscUJBQXFCO29CQUNuQyxjQUFjOzs7a0NBR0EsUUFBUSxDQUFDLFFBQVE7Ozs7b0NBSWYsc0JBQXNCO3lDQUNqQixhQUFhOzs7OytDQUlQLGFBQWE7bURBQ1QsYUFBYTttREFDYixhQUFhOzs7Z0JBR2hELGFBQWE7OztrQ0FHSyxzQkFBc0I7a0JBQ3RDLHdCQUF3QixLQUFLLENBQUM7Ozs7Ozs7O2dCQVFoQyxhQUFhO3lCQUNKLHdCQUF3QixLQUFLLENBQUM7OzsrQ0FHUixhQUFhOzs7OztnQkFLNUMsYUFBYTt5QkFDSix3QkFBd0IsS0FBSyxDQUFDOzs7K0NBR1IsYUFBYTttREFDVCxhQUFhOzs7O2dCQUloRCxhQUFhOzs7c0JBR1AsV0FBVzs7O0tBRzVCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBQb29sMkRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sIHBvb2xUeXBlOiAnbWF4J3wnYXZnJyxcbiAgICAgIGNvbXB1dGVQb3NpdGlvbnM6IGJvb2xlYW4sIGZsYXR0ZW5Qb3NpdGlvbnMgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycgJiYgY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tcHV0ZSBwb3NpdGlvbnMgZm9yIGF2ZXJhZ2UgcG9vbC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBwYWRUb3AgPSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGNvbnN0IGlzQXZnUG9vbCA9IHBvb2xUeXBlID09PSAnYXZnJztcbiAgICBjb25zdCBiYXRjaEZsYXR0ZW5Qb3NpdGlvblN0ciA9IGAoKGJhdGNoICAqICR7Y29udkluZm8uaW5IZWlnaHR9ICsgeFIpICogJHtcbiAgICAgICAgY29udkluZm8uaW5XaWR0aH0gKyB4QykgKiAke2NvbnZJbmZvLmluQ2hhbm5lbHN9ICsgZGA7XG4gICAgY29uc3QgZmxhdHRlblBvc2l0aW9uU3RyID1cbiAgICAgICAgYCh4UiAqICR7Y29udkluZm8uaW5XaWR0aH0gKyB4QykgKiAke2NvbnZJbmZvLmluQ2hhbm5lbHN9ICsgZGA7XG5cbiAgICBsZXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICcwLjAnO1xuICAgIGlmICghaXNBdmdQb29sKSB7XG4gICAgICAvLyBXZWJHTCBvbiBGaXJlZm94IExpbnV4IGNhbid0IGNvbXBpbGUgMS8wIHNvIHdlIGRvIDEvZXBzLlxuICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICctMS4wIC8gMWUtMjAnO1xuICAgIH1cblxuICAgIGlmIChjb21wdXRlUG9zaXRpb25zKSB7XG4gICAgICBjb25zdCBjb21wYXJlT3AgPSAnPj0nO1xuXG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICBjb25zdCBpdmVjMiBzdHJpZGVzID0gaXZlYzIoJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPSBjb29yZHMueXogKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAgIC8vIG1heC9taW4geCg/LCA/LCBkKSB0byBnZXQgeSh5UiwgeUMsIGQpLlxuICAgICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWUgPSAwLjA7XG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWVGb3VuZCA9IDAuMDtcbiAgICAgICAgICBpbnQgbWluTWF4UG9zaXRpb24gPSAwO1xuICAgICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xuXG4gICAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fTtcbiAgICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgd0M7XG5cbiAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmbG9hdCB2YWx1ZSA9IGdldFgoYmF0Y2gsIHhSLCB4QywgZCk7XG5cbiAgICAgICAgICAgICAgLy8gSWYgYSBtaW4gLyBtYXggdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBmb3VuZCwgdXNlIGl0LiBJZiBub3QsXG4gICAgICAgICAgICAgIC8vIHVzZSB0aGUgY3VycmVudCB2YWx1ZS5cbiAgICAgICAgICAgICAgZmxvYXQgY3Vyck1pbk1heFZhbHVlID0gbWl4KFxuICAgICAgICAgICAgICAgICAgdmFsdWUsIG1pbk1heFZhbHVlLCBtaW5NYXhWYWx1ZUZvdW5kKTtcbiAgICAgICAgICAgICAgaWYgKHZhbHVlICR7Y29tcGFyZU9wfSBjdXJyTWluTWF4VmFsdWUpIHtcbiAgICAgICAgICAgICAgICBtaW5NYXhWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIG1pbk1heFZhbHVlRm91bmQgPSAxLjA7XG4gICAgICAgICAgICAgICAgbWluTWF4UG9zaXRpb24gPSAke1xuICAgICAgICAgIGZsYXR0ZW5Qb3NpdGlvbnMgPyAoaW5jbHVkZUJhdGNoSW5JbmRleCA/IGJhdGNoRmxhdHRlblBvc2l0aW9uU3RyIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuUG9zaXRpb25TdHIpIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHdSICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gKyB3Q2B9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChmbG9hdChtaW5NYXhQb3NpdGlvbikpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IGNvbXBhcmVPcCA9ICdtYXgnO1xuXG4gICAgbGV0IHJldHVyblZhbHVlID0gYCR7cG9vbFR5cGV9KCR7cG9vbFR5cGV9KCR7cG9vbFR5cGV9KGAgK1xuICAgICAgICAnbWluTWF4VmFsdWVbMF0sIG1pbk1heFZhbHVlWzFdKSwgbWluTWF4VmFsdWVbMl0pLCBtaW5NYXhWYWx1ZVszXSknO1xuICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycpIHtcbiAgICAgIHJldHVyblZhbHVlID0gYGF2Z1ZhbHVlIC8gY291bnRgO1xuICAgIH1cblxuICAgIGNvbnN0IGZpbHRlcldpZHRoTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKGZpbHRlcldpZHRoIC8gNCkgKiA0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9IGZpbHRlcldpZHRoICUgNDtcblxuICAgIGNvbnN0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICBpZiAoJHtpc0F2Z1Bvb2x9KSB7XG4gICAgICAgIGF2Z1ZhbHVlICs9IGRvdCh2YWx1ZXMsIG9uZXMpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbWluTWF4VmFsdWUgPSAke2NvbXBhcmVPcH0odmFsdWVzLCBtaW5NYXhWYWx1ZSk7XG4gICAgICB9XG4gICAgYDtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBzdHJpZGVzID0gaXZlYzIoJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcbiAgICAgIGNvbnN0IGZsb2F0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAke2luaXRpYWxpemF0aW9uVmFsdWV9O1xuICAgICAgY29uc3QgdmVjNCBvbmVzID0gdmVjNCgxLjAsIDEuMCwgMS4wLCAxLjApO1xuXG4gICAgICBmbG9hdCBjb3VudCA9IDAuMDtcblxuICAgICAgZmxvYXQgZ2V0VmFsdWUoaW50IGJhdGNoLCBpbnQgeFIsIGludCB4QywgaW50IGQpIHtcbiAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgcmV0dXJuIGluaXRpYWxpemF0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQgKz0gMS4wO1xuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgeFIsIHhDLCBkKTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPSBjb29yZHMueXogKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XG4gICAgICAgIGludCB4Q0Nvcm5lciA9IHhSQ0Nvcm5lci55O1xuXG4gICAgICAgIC8vIG1heC9taW4geCg/LCA/LCBkKSB0byBnZXQgeSh5UiwgeUMsIGQpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZFxuICAgICAgICB2ZWM0IG1pbk1heFZhbHVlID0gdmVjNCgke2luaXRpYWxpemF0aW9uVmFsdWV9KTtcbiAgICAgICAgZmxvYXQgYXZnVmFsdWUgPSAwLjA7XG4gICAgICAgIGNvdW50ID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgIGludCB4UiA9IHhSQ29ybmVyICsgd1I7XG5cbiAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0fTsgd0MgKz0gNCkge1xuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QywgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBkKSxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArIDIgKiAke2RpbGF0aW9uV2lkdGh9LCBkKSxcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QyArIDMgKiAke2RpbGF0aW9uV2lkdGh9LCBkKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgIH1cblxuICAgICAgICAgIGludCB4QyA9IHhDQ29ybmVyICsgJHtmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0fTtcbiAgICAgICAgICBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgICAgfSBlbHNlIGlmICgke2ZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9PT0gMn0pIHtcbiAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhSLCB4QywgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBkKSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgIH0gZWxzZSBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMsIGQpLFxuICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeFIsIHhDICsgJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgZCksXG4gICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KCR7cmV0dXJuVmFsdWV9KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQb29sM0RQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYzREluZm8sIHBvb2xUeXBlOiAnbWF4J3wnYXZnJyxcbiAgICAgIGNvbXB1dGVQb3NpdGlvbnM6IGJvb2xlYW4sIGZsYXR0ZW5Qb3NpdGlvbnMgPSBmYWxzZSxcbiAgICAgIGluY2x1ZGVCYXRjaEluSW5kZXggPSBmYWxzZSkge1xuICAgIGlmIChwb29sVHlwZSA9PT0gJ2F2ZycgJiYgY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgY29tcHV0ZSBwb3NpdGlvbnMgZm9yIGF2ZXJhZ2UgcG9vbC4nKTtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgcGFkRnJvbnQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuXG4gICAgY29uc3QgaXNBdmdQb29sID0gcG9vbFR5cGUgPT09ICdhdmcnO1xuXG4gICAgbGV0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBpZiAoIWlzQXZnUG9vbCkge1xuICAgICAgLy8gV2ViR0wgb24gRmlyZWZveCBMaW51eCBjYW4ndCBjb21waWxlIDEvMCBzbyB3ZSBkbyAxL2Vwcy5cbiAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUgPSAnLTEuMCAvIDFlLTIwJztcbiAgICB9XG5cbiAgICBpZiAoY29tcHV0ZVBvc2l0aW9ucykge1xuICAgICAgY29uc3QgY29tcGFyZU9wID0gJz49JztcblxuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgY29uc3QgaXZlYzMgc3RyaWRlcyA9XG4gICAgICAgICAgICBpdmVjMygke3N0cmlkZURlcHRofSwgJHtzdHJpZGVIZWlnaHR9LCAke3N0cmlkZVdpZHRofSk7XG4gICAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgICAgaW50IGNoID0gY29vcmRzLnU7XG5cbiAgICAgICAgICBpdmVjMyB4Q29ybmVyID0gaXZlYzMoY29vcmRzLnksIGNvb3Jkcy56LCBjb29yZHMudykgKiBzdHJpZGVzIC0gcGFkcztcbiAgICAgICAgICBpbnQgeERDb3JuZXIgPSB4Q29ybmVyLng7XG4gICAgICAgICAgaW50IHhSQ29ybmVyID0geENvcm5lci55O1xuICAgICAgICAgIGludCB4Q0Nvcm5lciA9IHhDb3JuZXIuejtcblxuICAgICAgICAgIC8vIG1heC9taW4geCg/LCA/LCA/LCBjaCkgdG8gZ2V0IHkoeUQsIHlSLCB5QywgY2gpLlxuICAgICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkXG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWUgPSAwLjA7XG4gICAgICAgICAgZmxvYXQgbWluTWF4VmFsdWVGb3VuZCA9IDAuMDtcbiAgICAgICAgICBpbnQgbWluTWF4UG9zaXRpb24gPSAwO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0QgPSAwOyB3RCA8ICR7ZWZmZWN0aXZlRmlsdGVyRGVwdGh9O1xuICAgICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgICBpbnQgeEQgPSB4RENvcm5lciArIHdEO1xuXG4gICAgICAgICAgICBpZiAoeEQgPCAwIHx8IHhEID49ICR7Y29udkluZm8uaW5EZXB0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UjtcblxuICAgICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QztcblxuICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUgPSBnZXRYKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCk7XG5cbiAgICAgICAgICAgICAgICAvLyBJZiBhIG1pbiAvIG1heCB2YWx1ZSBoYXMgYWxyZWFkeSBiZWVuIGZvdW5kLCB1c2UgaXQuIElmIG5vdCxcbiAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUuXG4gICAgICAgICAgICAgICAgZmxvYXQgY3Vyck1pbk1heFZhbHVlID0gbWl4KFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgbWluTWF4VmFsdWUsIG1pbk1heFZhbHVlRm91bmQpO1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAke2NvbXBhcmVPcH0gY3Vyck1pbk1heFZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICBtaW5NYXhWYWx1ZSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgICAgbWluTWF4VmFsdWVGb3VuZCA9IDEuMDtcbiAgICAgICAgICAgICAgICAgIG1pbk1heFBvc2l0aW9uID0gJHtcbiAgICAgICAgICBmbGF0dGVuUG9zaXRpb25zID9cbiAgICAgICAgICAgICAgKGluY2x1ZGVCYXRjaEluSW5kZXggP1xuICAgICAgICAgICAgICAgICAgIGAoKChiYXRjaCAqICR7Y29udkluZm8uaW5EZXB0aH0gKyB4RCkgKiAke1xuICAgICAgICAgICAgICAgICAgICAgICBjb252SW5mby5pbkhlaWdodH0gKyB4UikgKiAke2NvbnZJbmZvLmluV2lkdGh9ICsgeEMpICogJHtcbiAgICAgICAgICAgICAgICAgICAgICAgY29udkluZm8uaW5DaGFubmVsc30gKyBjaGAgOlxuICAgICAgICAgICAgICAgICAgIGAoKHhEICogJHtjb252SW5mby5pbkhlaWdodH0gKyB4UikgKiAke1xuICAgICAgICAgICAgICAgICAgICAgICBjb252SW5mby5pbldpZHRofSArIHhDKSAqICR7Y29udkluZm8uaW5DaGFubmVsc30gKyBjaGApIDpcbiAgICAgICAgICAgICAgYHdEICogJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9ICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gK1xuICAgICAgICAgICAgICAgICAgICAgIHdSICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gKyB3Q2B9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQobWluTWF4UG9zaXRpb24pKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJlT3AgPSAnbWF4JztcblxuICAgIGxldCByZXR1cm5WYWx1ZSA9IGAke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfSgke3Bvb2xUeXBlfShgICtcbiAgICAgICAgJ21pbk1heFZhbHVlWzBdLCBtaW5NYXhWYWx1ZVsxXSksIG1pbk1heFZhbHVlWzJdKSwgbWluTWF4VmFsdWVbM10pJztcbiAgICBpZiAocG9vbFR5cGUgPT09ICdhdmcnKSB7XG4gICAgICByZXR1cm5WYWx1ZSA9IGBhdmdWYWx1ZSAvIGNvdW50YDtcbiAgICB9XG5cbiAgICBjb25zdCBmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0ID0gTWF0aC5mbG9vcihmaWx0ZXJXaWR0aCAvIDQpICogNDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPSBmaWx0ZXJXaWR0aCAlIDQ7XG5cbiAgICBjb25zdCB1cGRhdGVTbmlwcGV0ID0gYFxuICAgICAgaWYgKCR7aXNBdmdQb29sfSkge1xuICAgICAgICBhdmdWYWx1ZSArPSBkb3QodmFsdWVzLCBvbmVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1pbk1heFZhbHVlID0gJHtjb21wYXJlT3B9KHZhbHVlcywgbWluTWF4VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzMgc3RyaWRlcyA9XG4gICAgICAgIGl2ZWMzKCR7c3RyaWRlRGVwdGh9LCAke3N0cmlkZUhlaWdodH0sICR7c3RyaWRlV2lkdGh9KTtcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcbiAgICAgIGNvbnN0IGZsb2F0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAke2luaXRpYWxpemF0aW9uVmFsdWV9O1xuICAgICAgY29uc3QgdmVjNCBvbmVzID0gdmVjNCgxLjAsIDEuMCwgMS4wLCAxLjApO1xuXG4gICAgICBmbG9hdCBjb3VudCA9IDAuMDtcblxuICAgICAgZmxvYXQgZ2V0VmFsdWUoaW50IGJhdGNoLCBpbnQgeEQsIGludCB4UiwgaW50IHhDLCBpbnQgY2gpIHtcbiAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgcmV0dXJuIGluaXRpYWxpemF0aW9uVmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgY291bnQgKz0gMS4wO1xuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgeEQsIHhSLCB4QywgY2gpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGNoID0gY29vcmRzLnU7XG5cbiAgICAgICAgaXZlYzMgeENvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCB4RENvcm5lciA9IHhDb3JuZXIueDtcbiAgICAgICAgaW50IHhSQ29ybmVyID0geENvcm5lci55O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4Q29ybmVyLno7XG5cbiAgICAgICAgLy8gbWF4L21pbiB4KD8sID8sID8sIGQpIHRvIGdldCB5KHlELCB5UiwgeUMsIGNoKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWRcbiAgICAgICAgdmVjNCBtaW5NYXhWYWx1ZSA9IHZlYzQoJHtpbml0aWFsaXphdGlvblZhbHVlfSk7XG4gICAgICAgIGZsb2F0IGF2Z1ZhbHVlID0gMC4wO1xuICAgICAgICBjb3VudCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgaW50IHhEID0geERDb3JuZXIgKyB3RDtcblxuICAgICAgICAgIGlmICh4RCA8IDAgfHwgeEQgPj0gJHtjb252SW5mby5pbkRlcHRofSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fTtcbiAgICAgICAgICAgIHdSICs9ICR7ZGlsYXRpb25IZWlnaHR9KSB7XG4gICAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSO1xuXG4gICAgICAgICAgICBpZiAoeFIgPCAwIHx8IHhSID49ICR7Y29udkluZm8uaW5IZWlnaHR9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aE5lYXJlc3RWZWM0fTsgd0MgKz0gNCkge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDICogJHtkaWxhdGlvbldpZHRofTtcblxuICAgICAgICAgICAgICB2ZWM0IHZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMsIGNoKSxcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QyArICR7ZGlsYXRpb25XaWR0aH0sIGNoKSxcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QyArIDIgKiAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAzICogJHtkaWxhdGlvbldpZHRofSwgY2gpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArICR7ZmlsdGVyV2lkdGhOZWFyZXN0VmVjNH07XG4gICAgICAgICAgICBpZiAoJHtmaWx0ZXJXaWR0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgeEQsIHhSLCB4QywgY2gpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfSBlbHNlIGlmICgke2ZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9PT0gMn0pIHtcbiAgICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICAgICAgfSBlbHNlIGlmICgke2ZpbHRlcldpZHRoVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICAgICAgdmVjNCB2YWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCB4RCwgeFIsIHhDLCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAke2RpbGF0aW9uV2lkdGh9LCBjaCksXG4gICAgICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIHhELCB4UiwgeEMgKyAyICogJHtkaWxhdGlvbldpZHRofSwgY2gpLFxuICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAke3VwZGF0ZVNuaXBwZXR9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool, backend_util, util } from '@tensorflow/tfjs-core';\nimport { Pool2DProgram } from '../pool_gpu';\nimport { assertNotComplex } from '../webgl_util';\nimport { identity } from './Identity';\nexport function avgPool(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    assertNotComplex(x, 'avgPool');\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    const dilations = 1;\n    util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in avgPool: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n    if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 &&\n        util.arraysEqual(convInfo.inShape, convInfo.outShape)) {\n        return identity({ inputs: { x }, backend });\n    }\n    const avgPoolProgram = new Pool2DProgram(convInfo, 'avg', false);\n    return backend.runWebGLProgram(avgPoolProgram, [x], 'float32');\n}\nexport const avgPoolConfig = {\n    kernelName: AvgPool,\n    backendName: 'webgl',\n    kernelFunc: avgPool\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BdmdQb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxPQUFPLEVBQStCLFlBQVksRUFBd0MsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsT0FBTyxDQUFDLElBSXZCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLElBQUksQ0FBQyxNQUFNLENBQ1AsWUFBWSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFDL0QsR0FBRyxFQUFFLENBQUMsMkRBQTJEO1FBQzdELGVBQWUsT0FBTyxtQkFBbUIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUUvRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUF5QyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ2hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckMsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN6RCxPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDekM7SUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNqRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QXZnUG9vbCwgQXZnUG9vbEF0dHJzLCBBdmdQb29sSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UG9vbDJEUHJvZ3JhbX0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi93ZWJnbF91dGlsJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbChhcmdzOiB7XG4gIGlucHV0czogQXZnUG9vbElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2xBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ2F2Z1Bvb2wnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnMgPSAxO1xuXG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgYmFja2VuZF91dGlsLmVpdGhlclN0cmlkZXNPckRpbGF0aW9uc0FyZU9uZShzdHJpZGVzLCBkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGF2Z1Bvb2w6IEVpdGhlciBzdHJpZGVzIG9yIGRpbGF0aW9ucyBtdXN0IGJlIDEuICcgK1xuICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlKTtcbiAgaWYgKGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmIGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJlxuICAgICAgdXRpbC5hcnJheXNFcXVhbChjb252SW5mby5pblNoYXBlLCBjb252SW5mby5vdXRTaGFwZSkpIHtcbiAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3h9LCBiYWNrZW5kfSk7XG4gIH1cbiAgY29uc3QgYXZnUG9vbFByb2dyYW0gPSBuZXcgUG9vbDJEUHJvZ3JhbShjb252SW5mbywgJ2F2ZycsIGZhbHNlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xQcm9ncmFtLCBbeF0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBhdmdQb29sQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEF2Z1Bvb2wsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3D, backend_util } from '@tensorflow/tfjs-core';\nimport { Pool3DProgram } from '../pool_gpu';\nexport function avgPool3D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { filterSize, strides, pad, dimRoundingMode, dataFormat } = attrs;\n    const dilations = [1, 1, 1];\n    const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode, dataFormat);\n    const avgPoolProgram = new Pool3DProgram(convInfo, 'avg', false);\n    return backend.runWebGLProgram(avgPoolProgram, [x], 'float32');\n}\nexport const avgPool3DConfig = {\n    kernelName: AvgPool3D,\n    backendName: 'webgl',\n    kernelFunc: avgPool3D\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0F2Z1Bvb2wzRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsU0FBUyxFQUFtQyxZQUFZLEVBQXVDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUxQyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEUsTUFBTSxTQUFTLEdBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUFpRCxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ3hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sY0FBYyxHQUFHLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ2pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtBdmdQb29sM0QsIEF2Z1Bvb2wzREF0dHJzLCBBdmdQb29sM0RJbnB1dHMsIGJhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtQb29sM0RQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBhdmdQb29sM0QoYXJnczoge1xuICBpbnB1dHM6IEF2Z1Bvb2wzRElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2wzREF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0fSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxXTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGRhdGFGb3JtYXQpO1xuICBjb25zdCBhdmdQb29sUHJvZ3JhbSA9IG5ldyBQb29sM0RQcm9ncmFtKGNvbnZJbmZvLCAnYXZnJywgZmFsc2UpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oYXZnUG9vbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGF2Z1Bvb2wzRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sM0QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class AvgPool2DBackpropProgram {\n    constructor(convInfo) {\n        this.variableNames = ['dy'];\n        this.outputShape = convInfo.inShape;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const dilationHeight = convInfo.dilationHeight;\n        const dilationWidth = convInfo.dilationWidth;\n        const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n        const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n        const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n        const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n        const avgMultiplier = 1 / (filterHeight * filterWidth);\n        this.userCode = `\n      const ivec2 pads = ivec2(${padTop}, ${padLeft});\n      const float avgMultiplier = float(${avgMultiplier});\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int d = coords[3];\n\n        ivec2 dyRCCorner = coords.yz - pads;\n        int dyRCorner = dyRCCorner.x;\n        int dyCCorner = dyRCCorner.y;\n\n        // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n        // ? = to be determined. : = across all values in that axis.\n        float dotProd = 0.0;\n        for (int wR = 0; wR < ${effectiveFilterHeight};\n            wR += ${dilationHeight}) {\n          float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n          if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) {\n            continue;\n          }\n          int idyR = int(dyR);\n\n          for (int wC = 0; wC < ${effectiveFilterWidth};\n            wC+= ${dilationWidth}) {\n            float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n            if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n                fract(dyC) > 0.0) {\n              continue;\n            }\n            int idyC = int(dyC);\n\n            float dyValue = getDy(b, idyR, idyC, d);\n\n            dotProd += dyValue * avgMultiplier;\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\nexport class AvgPool3DBackpropProgram {\n    constructor(convInfo) {\n        this.variableNames = ['dy'];\n        this.outputShape = convInfo.inShape;\n        const filterDepth = convInfo.filterDepth;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const strideDepth = convInfo.strideDepth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const dilationDepth = convInfo.dilationDepth;\n        const dilationHeight = convInfo.dilationHeight;\n        const dilationWidth = convInfo.dilationWidth;\n        const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n        const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n        const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n        const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n        const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n        const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n        const avgMultiplier = 1 / (filterDepth * filterHeight * filterWidth);\n        this.userCode = `\n      const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n      const float avgMultiplier = float(${avgMultiplier});\n\n      void main() {\n        ivec5 coords = getOutputCoords();\n        int batch = coords.x;\n        int ch = coords.u;\n\n        ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n        int dyDCorner = dyCorner.x;\n        int dyRCorner = dyCorner.y;\n        int dyCCorner = dyCorner.z;\n\n        // Convolve dy(?, ?, ?, d) with pos mask(:, :, :, ch) to get\n        // dx(xD, xR, xC, ch).\n        // ? = to be determined. : = across all values in that axis.\n        float dotProd = 0.0;\n\n        for (int wD = 0; wD < ${effectiveFilterDepth};\n            wD += ${dilationDepth}) {\n          float dyD = float(dyDCorner + wD) / ${strideDepth}.0;\n\n          if (dyD < 0.0 || dyD >= ${convInfo.outDepth}.0 || fract(dyD) > 0.0) {\n            continue;\n          }\n          int idyD = int(dyD);\n\n          for (int wR = 0; wR < ${effectiveFilterHeight};\n              wR += ${dilationHeight}) {\n            float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n            if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 ||\n                fract(dyR) > 0.0) {\n              continue;\n            }\n            int idyR = int(dyR);\n\n            for (int wC = 0; wC < ${effectiveFilterWidth};\n                wC += ${dilationWidth}) {\n              float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n              if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n                  fract(dyC) > 0.0) {\n                continue;\n              }\n              int idyC = int(dyC);\n\n              float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n\n              dotProd += dyValue * avgMultiplier;\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXZnX3Bvb2xfYmFja3Byb3BfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9hdmdfcG9vbF9iYWNrcHJvcF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLHdCQUF3QjtJQUtuQyxZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUtyQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFDcEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxxQkFBcUIsR0FBRyxRQUFRLENBQUMscUJBQXFCLENBQUM7UUFDN0QsTUFBTSxvQkFBb0IsR0FBRyxRQUFRLENBQUMsb0JBQW9CLENBQUM7UUFFM0QsTUFBTSxNQUFNLEdBQUcscUJBQXFCLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUVqRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxZQUFZLEdBQUcsV0FBVyxDQUFDLENBQUM7UUFFdkQsSUFBSSxDQUFDLFFBQVEsR0FBRztpQ0FDYSxNQUFNLEtBQUssT0FBTzswQ0FDVCxhQUFhOzs7Ozs7Ozs7Ozs7OztnQ0FjdkIscUJBQXFCO29CQUNqQyxjQUFjO2dEQUNjLFlBQVk7O29DQUV4QixRQUFRLENBQUMsU0FBUzs7Ozs7a0NBS3BCLG9CQUFvQjttQkFDbkMsYUFBYTtrREFDa0IsV0FBVzs7c0NBRXZCLFFBQVEsQ0FBQyxRQUFROzs7Ozs7Ozs7Ozs7O0tBYWxELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sd0JBQXdCO0lBS25DLFlBQVksUUFBaUM7UUFKN0Msa0JBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBS3JCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQztRQUNwQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzdDLE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxjQUFjLENBQUM7UUFDL0MsTUFBTSxhQUFhLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUM3QyxNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztRQUMzRCxNQUFNLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxxQkFBcUIsQ0FBQztRQUM3RCxNQUFNLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQztRQUUzRCxNQUFNLFFBQVEsR0FBRyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDbkUsTUFBTSxNQUFNLEdBQUcscUJBQXFCLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ2hFLE1BQU0sT0FBTyxHQUFHLG9CQUFvQixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUVqRSxNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEdBQUcsWUFBWSxHQUFHLFdBQVcsQ0FBQyxDQUFDO1FBRXJFLElBQUksQ0FBQyxRQUFRLEdBQUc7aUNBQ2EsUUFBUSxLQUFLLE1BQU0sS0FBSyxPQUFPOzBDQUN0QixhQUFhOzs7Ozs7Ozs7Ozs7Ozs7OztnQ0FpQnZCLG9CQUFvQjtvQkFDaEMsYUFBYTtnREFDZSxXQUFXOztvQ0FFdkIsUUFBUSxDQUFDLFFBQVE7Ozs7O2tDQUtuQixxQkFBcUI7c0JBQ2pDLGNBQWM7a0RBQ2MsWUFBWTs7c0NBRXhCLFFBQVEsQ0FBQyxTQUFTOzs7Ozs7b0NBTXBCLG9CQUFvQjt3QkFDaEMsYUFBYTtvREFDZSxXQUFXOzt3Q0FFdkIsUUFBUSxDQUFDLFFBQVE7Ozs7Ozs7Ozs7Ozs7O0tBY3BELENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBBdmdQb29sMkRCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVyV2lkdGggPSBjb252SW5mby5lZmZlY3RpdmVGaWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gICAgY29uc3QgYXZnTXVsdGlwbGllciA9IDEgLyAoZmlsdGVySGVpZ2h0ICogZmlsdGVyV2lkdGgpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuICAgICAgY29uc3QgZmxvYXQgYXZnTXVsdGlwbGllciA9IGZsb2F0KCR7YXZnTXVsdGlwbGllcn0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgaXZlYzIgZHlSQ0Nvcm5lciA9IGNvb3Jkcy55eiAtIHBhZHM7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeVJDQ29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeVJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgZHkoPywgPywgZCkgd2l0aCBwb3MgbWFzayg6LCA6LCBkKSB0byBnZXQgZHgoeFIsIHhDLCBkKS5cbiAgICAgICAgLy8gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2VmZmVjdGl2ZUZpbHRlckhlaWdodH07XG4gICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICB3Qys9ICR7ZGlsYXRpb25XaWR0aH0pIHtcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGlkeVIsIGlkeUMsIGQpO1xuXG4gICAgICAgICAgICBkb3RQcm9kICs9IGR5VmFsdWUgKiBhdmdNdWx0aXBsaWVyO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckRlcHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBwYWRGcm9udCA9IGVmZmVjdGl2ZUZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZWZmZWN0aXZlRmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICBjb25zdCBhdmdNdWx0aXBsaWVyID0gMSAvIChmaWx0ZXJEZXB0aCAqIGZpbHRlckhlaWdodCAqIGZpbHRlcldpZHRoKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBwYWRzID0gaXZlYzMoJHtwYWRGcm9udH0sICR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBhdmdNdWx0aXBsaWVyID0gZmxvYXQoJHthdmdNdWx0aXBsaWVyfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzUgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgY2ggPSBjb29yZHMudTtcblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RENvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIDosIGNoKSB0byBnZXRcbiAgICAgICAgLy8gZHgoeEQsIHhSLCB4QywgY2gpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3RCA9IDA7IHdEIDwgJHtlZmZlY3RpdmVGaWx0ZXJEZXB0aH07XG4gICAgICAgICAgICB3RCArPSAke2RpbGF0aW9uRGVwdGh9KSB7XG4gICAgICAgICAgZmxvYXQgZHlEID0gZmxvYXQoZHlEQ29ybmVyICsgd0QpIC8gJHtzdHJpZGVEZXB0aH0uMDtcblxuICAgICAgICAgIGlmIChkeUQgPCAwLjAgfHwgZHlEID49ICR7Y29udkluZm8ub3V0RGVwdGh9LjAgfHwgZnJhY3QoZHlEKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlEID0gaW50KGR5RCk7XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9O1xuICAgICAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeVIgPCAwLjAgfHwgZHlSID49ICR7Y29udkluZm8ub3V0SGVpZ2h0fS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2VmZmVjdGl2ZUZpbHRlcldpZHRofTtcbiAgICAgICAgICAgICAgICB3QyArPSAke2RpbGF0aW9uV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlELCBpZHlSLCBpZHlDLCBjaCk7XG5cbiAgICAgICAgICAgICAgZG90UHJvZCArPSBkeVZhbHVlICogYXZnTXVsdGlwbGllcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPool3DGrad, backend_util } from '@tensorflow/tfjs-core';\nimport { AvgPool3DBackpropProgram } from '../avg_pool_backprop_gpu';\nexport function avgPool3DGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, input } = inputs;\n    const x = input;\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    const dilations = [1, 1, 1];\n    const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n    const avgPoolBackpropProgram = new AvgPool3DBackpropProgram(convInfo);\n    return backend.runWebGLProgram(avgPoolBackpropProgram, [dy], x.dtype);\n}\nexport const avgPool3DGradConfig = {\n    kernelName: AvgPool3DGrad,\n    backendName: 'webgl',\n    kernelFunc: avgPool3DGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbDNER3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9BdmdQb29sM0RHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxhQUFhLEVBQTJDLFlBQVksRUFBdUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVqSixPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUdsRSxNQUFNLFVBQVUsYUFBYSxDQUFDLElBSTdCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoQixNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzFELE1BQU0sU0FBUyxHQUE2QixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFFdEQsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUN4RSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ3JDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFpQjtJQUMvQyxVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsYUFBaUM7Q0FDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QXZnUG9vbDNER3JhZCwgQXZnUG9vbDNER3JhZEF0dHJzLCBBdmdQb29sM0RHcmFkSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBdmdQb29sM0RCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL2F2Z19wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gYXZnUG9vbDNER3JhZChhcmdzOiB7XG4gIGlucHV0czogQXZnUG9vbDNER3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2wzREdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0fSA9IGlucHV0cztcbiAgY29uc3QgeCA9IGlucHV0O1xuICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG4gIGNvbnN0IGRpbGF0aW9uczogW251bWJlciwgbnVtYmVyLCBudW1iZXJdID0gWzEsIDEsIDFdO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sM0RJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgQXZnUG9vbDNEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0sIFtkeV0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbDNER3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBBdmdQb29sM0RHcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYXZnUG9vbDNER3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { AvgPoolGrad, backend_util } from '@tensorflow/tfjs-core';\nimport { AvgPool2DBackpropProgram } from '../avg_pool_backprop_gpu';\nimport { assertNotComplex } from '../webgl_util';\nexport function avgPoolGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, input } = inputs;\n    const x = input;\n    assertNotComplex([dy, input], 'avgPoolGrad');\n    const { filterSize, strides, pad } = attrs;\n    const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad);\n    const avgPoolBackpropProgram = new AvgPool2DBackpropProgram(convInfo);\n    return backend.runWebGLProgram(avgPoolBackpropProgram, [dy], x.dtype);\n}\nexport const avgPoolGradConfig = {\n    kernelName: AvgPoolGrad,\n    backendName: 'webgl',\n    kernelFunc: avgPoolGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXZnUG9vbEdyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQXZnUG9vbEdyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFdBQVcsRUFBdUMsWUFBWSxFQUF1QyxNQUFNLHVCQUF1QixDQUFDO0FBRTNJLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRWxFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUUvQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNCLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoQixnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUM3QyxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFBRSxVQUFVLEVBQUUsT0FBTyxFQUNoRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFpQjtJQUM3QyxVQUFVLEVBQUUsV0FBVztJQUN2QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsV0FBK0I7Q0FDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7QXZnUG9vbEdyYWQsIEF2Z1Bvb2xHcmFkQXR0cnMsIEF2Z1Bvb2xHcmFkSW5wdXRzLCBiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtBdmdQb29sMkRCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL2F2Z19wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGF2Z1Bvb2xHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBBdmdQb29sR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEF2Z1Bvb2xHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IHggPSBpbnB1dDtcbiAgYXNzZXJ0Tm90Q29tcGxleChbZHksIGlucHV0XSwgJ2F2Z1Bvb2xHcmFkJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWR9ID0gYXR0cnM7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgMSAvKiBkaWxhdGlvbnMgKi8sIHBhZCk7XG4gIGNvbnN0IGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0gPSBuZXcgQXZnUG9vbDJEQmFja3Byb3BQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGF2Z1Bvb2xCYWNrcHJvcFByb2dyYW0sIFtkeV0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgYXZnUG9vbEdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQXZnUG9vbEdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBhdmdQb29sR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { BatchMatMul } from '@tensorflow/tfjs-core';\nimport { batchMatMulImpl } from './BatchMatMul_impl';\nexport function batchMatMul(args) {\n    const { inputs, backend, attrs } = args;\n    const { a, b } = inputs;\n    const { transposeA, transposeB } = attrs;\n    return batchMatMulImpl({ a, b, transposeA, transposeB, backend });\n}\nexport const batchMatMulConfig = {\n    kernelName: BatchMatMul,\n    backendName: 'webgl',\n    kernelFunc: batchMatMul,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hNYXRNdWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQmF0Y2hNYXRNdWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBZ0UsTUFBTSx1QkFBdUIsQ0FBQztBQUdqSCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFbkQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUkzQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN0QixNQUFNLEVBQUMsVUFBVSxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV2QyxPQUFPLGVBQWUsQ0FBQyxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0FBQ2xFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7QmF0Y2hNYXRNdWwsIEJhdGNoTWF0TXVsQXR0cnMsIEJhdGNoTWF0TXVsSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2JhdGNoTWF0TXVsSW1wbH0gZnJvbSAnLi9CYXRjaE1hdE11bF9pbXBsJztcblxuZXhwb3J0IGZ1bmN0aW9uIGJhdGNoTWF0TXVsKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaE1hdE11bElucHV0cyxcbiAgYXR0cnM6IEJhdGNoTWF0TXVsQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2EsIGJ9ID0gaW5wdXRzO1xuICBjb25zdCB7dHJhbnNwb3NlQSwgdHJhbnNwb3NlQn0gPSBhdHRycztcblxuICByZXR1cm4gYmF0Y2hNYXRNdWxJbXBsKHthLCBiLCB0cmFuc3Bvc2VBLCB0cmFuc3Bvc2VCLCBiYWNrZW5kfSk7XG59XG5cbmV4cG9ydCBjb25zdCBiYXRjaE1hdE11bENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBCYXRjaE1hdE11bCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGJhdGNoTWF0TXVsIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nexport class BatchNormProgram {\n    constructor(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) {\n        this.outputShape = [];\n        this.variableNames = ['x', 'mean', 'variance'];\n        backend_util.assertAndGetBroadcastShape(xShape, meanShape);\n        backend_util.assertAndGetBroadcastShape(xShape, varianceShape);\n        let offsetSnippet = '0.0';\n        if (offsetShape != null) {\n            backend_util.assertAndGetBroadcastShape(xShape, offsetShape);\n            this.variableNames.push('offset');\n            offsetSnippet = 'getOffsetAtOutCoords()';\n        }\n        let scaleSnippet = '1.0';\n        if (scaleShape != null) {\n            backend_util.assertAndGetBroadcastShape(xShape, scaleShape);\n            this.variableNames.push('scale');\n            scaleSnippet = 'getScaleAtOutCoords()';\n        }\n        this.outputShape = xShape;\n        this.userCode = `\n      void main() {\n        float x = getXAtOutCoords();\n        float mean = getMeanAtOutCoords();\n        float variance = getVarianceAtOutCoords();\n        float offset = ${offsetSnippet};\n        float scale = ${scaleSnippet};\n        float inv = scale * inversesqrt(variance + float(${varianceEpsilon}));\n        setOutput(dot(vec3(x, -mean, offset), vec3(inv, inv, 1)));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvYmF0Y2hub3JtX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbkQsTUFBTSxPQUFPLGdCQUFnQjtJQUszQixZQUNJLE1BQWdCLEVBQUUsU0FBbUIsRUFBRSxhQUF1QixFQUM5RCxXQUEwQixFQUFFLFVBQXlCLEVBQ3JELGVBQXVCO1FBTjNCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBT3pCLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQy9DLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDM0QsWUFBWSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxhQUFhLENBQUMsQ0FBQztRQUUvRCxJQUFJLGFBQWEsR0FBRyxLQUFLLENBQUM7UUFDMUIsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1lBQ3ZCLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsV0FBVyxDQUFDLENBQUM7WUFDN0QsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEMsYUFBYSxHQUFHLHdCQUF3QixDQUFDO1NBQzFDO1FBRUQsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUN0QixZQUFZLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ2pDLFlBQVksR0FBRyx1QkFBdUIsQ0FBQztTQUN4QztRQUVELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7O3lCQUtLLGFBQWE7d0JBQ2QsWUFBWTsyREFDdUIsZUFBZTs7O0tBR3JFLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBCYXRjaE5vcm1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgbWVhblNoYXBlOiBudW1iZXJbXSwgdmFyaWFuY2VTaGFwZTogbnVtYmVyW10sXG4gICAgICBvZmZzZXRTaGFwZTogbnVtYmVyW118bnVsbCwgc2NhbGVTaGFwZTogbnVtYmVyW118bnVsbCxcbiAgICAgIHZhcmlhbmNlRXBzaWxvbjogbnVtYmVyKSB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBtZWFuU2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIHZhcmlhbmNlU2hhcGUpO1xuXG4gICAgbGV0IG9mZnNldFNuaXBwZXQgPSAnMC4wJztcbiAgICBpZiAob2Zmc2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgb2Zmc2V0U2hhcGUpO1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ29mZnNldCcpO1xuICAgICAgb2Zmc2V0U25pcHBldCA9ICdnZXRPZmZzZXRBdE91dENvb3JkcygpJztcbiAgICB9XG5cbiAgICBsZXQgc2NhbGVTbmlwcGV0ID0gJzEuMCc7XG4gICAgaWYgKHNjYWxlU2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgc2NhbGVTaGFwZSk7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnc2NhbGUnKTtcbiAgICAgIHNjYWxlU25pcHBldCA9ICdnZXRTY2FsZUF0T3V0Q29vcmRzKCknO1xuICAgIH1cblxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgZmxvYXQgeCA9IGdldFhBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBtZWFuID0gZ2V0TWVhbkF0T3V0Q29vcmRzKCk7XG4gICAgICAgIGZsb2F0IHZhcmlhbmNlID0gZ2V0VmFyaWFuY2VBdE91dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBvZmZzZXQgPSAke29mZnNldFNuaXBwZXR9O1xuICAgICAgICBmbG9hdCBzY2FsZSA9ICR7c2NhbGVTbmlwcGV0fTtcbiAgICAgICAgZmxvYXQgaW52ID0gc2NhbGUgKiBpbnZlcnNlc3FydCh2YXJpYW5jZSArIGZsb2F0KCR7dmFyaWFuY2VFcHNpbG9ufSkpO1xuICAgICAgICBzZXRPdXRwdXQoZG90KHZlYzMoeCwgLW1lYW4sIG9mZnNldCksIHZlYzMoaW52LCBpbnYsIDEpKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nexport class BatchNormPackedProgram {\n    constructor(xShape, meanShape, varianceShape, offsetShape, scaleShape, varianceEpsilon) {\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.variableNames = ['x', 'mean', 'variance'];\n        backend_util.assertAndGetBroadcastShape(xShape, meanShape);\n        backend_util.assertAndGetBroadcastShape(xShape, varianceShape);\n        let offsetSnippet = 'vec4(0.0)';\n        if (offsetShape != null) {\n            backend_util.assertAndGetBroadcastShape(xShape, offsetShape);\n            this.variableNames.push('offset');\n            offsetSnippet = 'getOffsetAtOutCoords()';\n        }\n        let scaleSnippet = 'vec4(1.0)';\n        if (scaleShape != null) {\n            backend_util.assertAndGetBroadcastShape(xShape, scaleShape);\n            this.variableNames.push('scale');\n            scaleSnippet = 'getScaleAtOutCoords()';\n        }\n        this.outputShape = xShape;\n        this.userCode = `\n      void main() {\n        vec4 offset = ${offsetSnippet};\n        vec4 scale = ${scaleSnippet};\n\n        vec4 x = getXAtOutCoords();\n        vec4 mean = getMeanAtOutCoords();\n        vec4 variance = getVarianceAtOutCoords();\n\n        vec4 inv = scale * inversesqrt(variance + vec4(${varianceEpsilon}));\n\n        setOutput((x - mean) * inv + offset);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmF0Y2hub3JtX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2JhdGNobm9ybV9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxNQUFNLE9BQU8sc0JBQXNCO0lBT2pDLFlBQ0ksTUFBZ0IsRUFBRSxTQUFtQixFQUFFLGFBQXVCLEVBQzlELFdBQTBCLEVBQUUsVUFBeUIsRUFDckQsZUFBdUI7UUFOM0IsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFNbEIsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7UUFDL0MsWUFBWSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztRQUMzRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDO1FBRS9ELElBQUksYUFBYSxHQUFHLFdBQVcsQ0FBQztRQUNoQyxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7WUFDdkIsWUFBWSxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRSxXQUFXLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUNsQyxhQUFhLEdBQUcsd0JBQXdCLENBQUM7U0FDMUM7UUFFRCxJQUFJLFlBQVksR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxVQUFVLElBQUksSUFBSSxFQUFFO1lBQ3RCLFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLENBQUM7WUFDNUQsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7WUFDakMsWUFBWSxHQUFHLHVCQUF1QixDQUFDO1NBQ3hDO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRzs7d0JBRUksYUFBYTt1QkFDZCxZQUFZOzs7Ozs7eURBTXNCLGVBQWU7Ozs7S0FJbkUsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEJhdGNoTm9ybVBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzOiBzdHJpbmdbXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgbWVhblNoYXBlOiBudW1iZXJbXSwgdmFyaWFuY2VTaGFwZTogbnVtYmVyW10sXG4gICAgICBvZmZzZXRTaGFwZTogbnVtYmVyW118bnVsbCwgc2NhbGVTaGFwZTogbnVtYmVyW118bnVsbCxcbiAgICAgIHZhcmlhbmNlRXBzaWxvbjogbnVtYmVyKSB7XG4gICAgdGhpcy52YXJpYWJsZU5hbWVzID0gWyd4JywgJ21lYW4nLCAndmFyaWFuY2UnXTtcbiAgICBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoeFNoYXBlLCBtZWFuU2hhcGUpO1xuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZSh4U2hhcGUsIHZhcmlhbmNlU2hhcGUpO1xuXG4gICAgbGV0IG9mZnNldFNuaXBwZXQgPSAndmVjNCgwLjApJztcbiAgICBpZiAob2Zmc2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgb2Zmc2V0U2hhcGUpO1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ29mZnNldCcpO1xuICAgICAgb2Zmc2V0U25pcHBldCA9ICdnZXRPZmZzZXRBdE91dENvb3JkcygpJztcbiAgICB9XG5cbiAgICBsZXQgc2NhbGVTbmlwcGV0ID0gJ3ZlYzQoMS4wKSc7XG4gICAgaWYgKHNjYWxlU2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmFja2VuZF91dGlsLmFzc2VydEFuZEdldEJyb2FkY2FzdFNoYXBlKHhTaGFwZSwgc2NhbGVTaGFwZSk7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnc2NhbGUnKTtcbiAgICAgIHNjYWxlU25pcHBldCA9ICdnZXRTY2FsZUF0T3V0Q29vcmRzKCknO1xuICAgIH1cblxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgdmVjNCBvZmZzZXQgPSAke29mZnNldFNuaXBwZXR9O1xuICAgICAgICB2ZWM0IHNjYWxlID0gJHtzY2FsZVNuaXBwZXR9O1xuXG4gICAgICAgIHZlYzQgeCA9IGdldFhBdE91dENvb3JkcygpO1xuICAgICAgICB2ZWM0IG1lYW4gPSBnZXRNZWFuQXRPdXRDb29yZHMoKTtcbiAgICAgICAgdmVjNCB2YXJpYW5jZSA9IGdldFZhcmlhbmNlQXRPdXRDb29yZHMoKTtcblxuICAgICAgICB2ZWM0IGludiA9IHNjYWxlICogaW52ZXJzZXNxcnQodmFyaWFuY2UgKyB2ZWM0KCR7dmFyaWFuY2VFcHNpbG9ufSkpO1xuXG4gICAgICAgIHNldE91dHB1dCgoeCAtIG1lYW4pICogaW52ICsgb2Zmc2V0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, FusedBatchNorm, util } from '@tensorflow/tfjs-core';\nimport { BatchNormProgram } from '../batchnorm_gpu';\nimport { BatchNormPackedProgram } from '../batchnorm_packed_gpu';\nexport const batchNorm = ({ inputs, backend, attrs }) => {\n    const { x, mean, variance, offset, scale } = inputs;\n    util.assert(mean.shape.length === variance.shape.length, () => 'Batch normalization gradient requires mean and variance to have ' +\n        'equal ranks.');\n    util.assert(offset == null || mean.shape.length === offset.shape.length, () => 'Batch normalization gradient requires mean and offset to have ' +\n        'equal ranks.');\n    util.assert(scale == null || mean.shape.length === scale.shape.length, () => 'Batch normalization gradient requires mean and scale to have ' +\n        'equal ranks.');\n    let { varianceEpsilon } = attrs;\n    if (varianceEpsilon == null) {\n        varianceEpsilon = 0.001;\n    }\n    const finalInputs = [x, mean, variance];\n    let offsetShape = null;\n    if (offset != null) {\n        offsetShape = offset.shape;\n        finalInputs.push(offset);\n    }\n    let scaleShape = null;\n    if (scale != null) {\n        scaleShape = scale.shape;\n        finalInputs.push(scale);\n    }\n    const program = env().getBool('WEBGL_PACK_NORMALIZATION') ?\n        new BatchNormPackedProgram(x.shape, mean.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon) :\n        new BatchNormProgram(x.shape, mean.shape, variance.shape, offsetShape, scaleShape, varianceEpsilon);\n    const output = backend.runWebGLProgram(program, finalInputs, finalInputs[0].dtype);\n    return output;\n};\nexport const batchNormConfig = {\n    kernelName: FusedBatchNorm,\n    backendName: 'webgl',\n    kernelFunc: batchNorm,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hOb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0JhdGNoTm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFFLGNBQWMsRUFBbUYsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHakosT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDbEQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUlILENBQUMsRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxFQUFFLEVBQUU7SUFDOUMsTUFBTSxFQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbEQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDM0MsR0FBRyxFQUFFLENBQUMsa0VBQWtFO1FBQ3BFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsTUFBTSxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDM0QsR0FBRyxFQUFFLENBQUMsZ0VBQWdFO1FBQ2xFLGNBQWMsQ0FBQyxDQUFDO0lBQ3hCLElBQUksQ0FBQyxNQUFNLENBQ1AsS0FBSyxJQUFJLElBQUksSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDekQsR0FBRyxFQUFFLENBQUMsK0RBQStEO1FBQ2pFLGNBQWMsQ0FBQyxDQUFDO0lBRXhCLElBQUksRUFBQyxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDOUIsSUFBSSxlQUFlLElBQUksSUFBSSxFQUFFO1FBQzNCLGVBQWUsR0FBRyxLQUFLLENBQUM7S0FDekI7SUFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFFeEMsSUFBSSxXQUFXLEdBQUcsSUFBSSxDQUFDO0lBQ3ZCLElBQUksTUFBTSxJQUFJLElBQUksRUFBRTtRQUNsQixXQUFXLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQztRQUMzQixXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQzFCO0lBRUQsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ3RCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtRQUNqQixVQUFVLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztRQUN6QixXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLENBQUMsQ0FBQztRQUN2RCxJQUFJLHNCQUFzQixDQUN0QixDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUM1RCxlQUFlLENBQUMsQ0FBQyxDQUFDO1FBQ3RCLElBQUksZ0JBQWdCLENBQ2hCLENBQUMsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQzVELGVBQWUsQ0FBQyxDQUFDO0lBQ3pCLE1BQU0sTUFBTSxHQUNSLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFeEUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsY0FBYztJQUMxQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgRnVzZWRCYXRjaE5vcm0sIEZ1c2VkQmF0Y2hOb3JtQXR0cnMsIEZ1c2VkQmF0Y2hOb3JtSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JhdGNoTm9ybVByb2dyYW19IGZyb20gJy4uL2JhdGNobm9ybV9ncHUnO1xuaW1wb3J0IHtCYXRjaE5vcm1QYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iYXRjaG5vcm1fcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBiYXRjaE5vcm06IChwYXJhbXM6IHtcbiAgaW5wdXRzOiBGdXNlZEJhdGNoTm9ybUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEZ1c2VkQmF0Y2hOb3JtQXR0cnNcbn0pID0+IFRlbnNvckluZm8gPSAoe2lucHV0cywgYmFja2VuZCwgYXR0cnN9KSA9PiB7XG4gIGNvbnN0IHt4LCBtZWFuLCB2YXJpYW5jZSwgb2Zmc2V0LCBzY2FsZX0gPSBpbnB1dHM7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gdmFyaWFuY2Uuc2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgdmFyaWFuY2UgdG8gaGF2ZSAnICtcbiAgICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgb2Zmc2V0ID09IG51bGwgfHwgbWVhbi5zaGFwZS5sZW5ndGggPT09IG9mZnNldC5zaGFwZS5sZW5ndGgsXG4gICAgICAoKSA9PiAnQmF0Y2ggbm9ybWFsaXphdGlvbiBncmFkaWVudCByZXF1aXJlcyBtZWFuIGFuZCBvZmZzZXQgdG8gaGF2ZSAnICtcbiAgICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG4gIHV0aWwuYXNzZXJ0KFxuICAgICAgc2NhbGUgPT0gbnVsbCB8fCBtZWFuLnNoYXBlLmxlbmd0aCA9PT0gc2NhbGUuc2hhcGUubGVuZ3RoLFxuICAgICAgKCkgPT4gJ0JhdGNoIG5vcm1hbGl6YXRpb24gZ3JhZGllbnQgcmVxdWlyZXMgbWVhbiBhbmQgc2NhbGUgdG8gaGF2ZSAnICtcbiAgICAgICAgICAnZXF1YWwgcmFua3MuJyk7XG5cbiAgbGV0IHt2YXJpYW5jZUVwc2lsb259ID0gYXR0cnM7XG4gIGlmICh2YXJpYW5jZUVwc2lsb24gPT0gbnVsbCkge1xuICAgIHZhcmlhbmNlRXBzaWxvbiA9IDAuMDAxO1xuICB9XG5cbiAgY29uc3QgZmluYWxJbnB1dHMgPSBbeCwgbWVhbiwgdmFyaWFuY2VdO1xuXG4gIGxldCBvZmZzZXRTaGFwZSA9IG51bGw7XG4gIGlmIChvZmZzZXQgIT0gbnVsbCkge1xuICAgIG9mZnNldFNoYXBlID0gb2Zmc2V0LnNoYXBlO1xuICAgIGZpbmFsSW5wdXRzLnB1c2gob2Zmc2V0KTtcbiAgfVxuXG4gIGxldCBzY2FsZVNoYXBlID0gbnVsbDtcbiAgaWYgKHNjYWxlICE9IG51bGwpIHtcbiAgICBzY2FsZVNoYXBlID0gc2NhbGUuc2hhcGU7XG4gICAgZmluYWxJbnB1dHMucHVzaChzY2FsZSk7XG4gIH1cblxuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19OT1JNQUxJWkFUSU9OJykgP1xuICAgICAgbmV3IEJhdGNoTm9ybVBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgeC5zaGFwZSwgbWVhbi5zaGFwZSwgdmFyaWFuY2Uuc2hhcGUsIG9mZnNldFNoYXBlLCBzY2FsZVNoYXBlLFxuICAgICAgICAgIHZhcmlhbmNlRXBzaWxvbikgOlxuICAgICAgbmV3IEJhdGNoTm9ybVByb2dyYW0oXG4gICAgICAgICAgeC5zaGFwZSwgbWVhbi5zaGFwZSwgdmFyaWFuY2Uuc2hhcGUsIG9mZnNldFNoYXBlLCBzY2FsZVNoYXBlLFxuICAgICAgICAgIHZhcmlhbmNlRXBzaWxvbik7XG4gIGNvbnN0IG91dHB1dCA9XG4gICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBmaW5hbElucHV0cywgZmluYWxJbnB1dHNbMF0uZHR5cGUpO1xuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5leHBvcnQgY29uc3QgYmF0Y2hOb3JtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZ1c2VkQmF0Y2hOb3JtLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYmF0Y2hOb3JtIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class SliceProgram {\n    constructor(destSize) {\n        this.variableNames = ['source'];\n        this.outputShape = destSize;\n        this.rank = destSize.length;\n        const dtype = getCoordsDataType(this.rank);\n        this.customUniforms = [{ name: 'start', arrayIndex: this.rank, type: 'int' }];\n        const sourceCoords = getCoords(this.rank);\n        let body;\n        const coordSum = destSize.map((_, i) => {\n            return `sourceLoc.${coords[i]} = start[${i}] + coords.${coords[i]};`;\n        });\n        body = `\n        ${dtype} sourceLoc;\n        ${dtype} coords = getOutputCoords();\n        ${coordSum.join('\\n')}\n      `;\n        this.userCode = `\n      void main() {\n        ${body}\n        setOutput(getSource(${sourceCoords}));\n      }\n    `;\n    }\n}\nconst coords = ['x', 'y', 'z', 'w', 'u', 'v'];\nfunction getCoords(rank) {\n    if (rank === 1) {\n        return 'sourceLoc';\n    }\n    else if (rank <= 6) {\n        return coords.slice(0, rank).map(x => 'sourceLoc.' + x).join(',');\n    }\n    else {\n        throw Error(`Slicing for rank ${rank} is not yet supported`);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9zbGljZV9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLGlCQUFpQixFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFakUsTUFBTSxPQUFPLFlBQVk7SUFPdkIsWUFBWSxRQUFrQjtRQU45QixrQkFBYSxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFPekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDO1FBRTVCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsY0FBYyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUMsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFMUMsSUFBSSxJQUFZLENBQUM7UUFDakIsTUFBTSxRQUFRLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUNyQyxPQUFPLGFBQWEsTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsY0FBYyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUN2RSxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksR0FBRztVQUNELEtBQUs7VUFDTCxLQUFLO1VBQ0wsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7T0FDdEIsQ0FBQztRQUNKLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsSUFBSTs4QkFDZ0IsWUFBWTs7S0FFckMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sTUFBTSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUU5QyxTQUFTLFNBQVMsQ0FBQyxJQUFZO0lBQzdCLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNkLE9BQU8sV0FBVyxDQUFDO0tBQ3BCO1NBQU0sSUFBSSxJQUFJLElBQUksQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztLQUNuRTtTQUFNO1FBQ0wsTUFBTSxLQUFLLENBQUMsb0JBQW9CLElBQUksdUJBQXVCLENBQUMsQ0FBQztLQUM5RDtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNsaWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3NvdXJjZSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcbiAgY3VzdG9tVW5pZm9ybXM6IEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg6IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG5cbiAgY29uc3RydWN0b3IoZGVzdFNpemU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgIHRoaXMucmFuayA9IGRlc3RTaXplLmxlbmd0aDtcblxuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnc3RhcnQnLCBhcnJheUluZGV4OiB0aGlzLnJhbmssIHR5cGU6ICdpbnQnfV07XG4gICAgY29uc3Qgc291cmNlQ29vcmRzID0gZ2V0Q29vcmRzKHRoaXMucmFuayk7XG5cbiAgICBsZXQgYm9keTogc3RyaW5nO1xuICAgIGNvbnN0IGNvb3JkU3VtID0gZGVzdFNpemUubWFwKChfLCBpKSA9PiB7XG4gICAgICByZXR1cm4gYHNvdXJjZUxvYy4ke2Nvb3Jkc1tpXX0gPSBzdGFydFske2l9XSArIGNvb3Jkcy4ke2Nvb3Jkc1tpXX07YDtcbiAgICB9KTtcbiAgICBib2R5ID0gYFxuICAgICAgICAke2R0eXBlfSBzb3VyY2VMb2M7XG4gICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAke2Nvb3JkU3VtLmpvaW4oJ1xcbicpfVxuICAgICAgYDtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2JvZHl9XG4gICAgICAgIHNldE91dHB1dChnZXRTb3VyY2UoJHtzb3VyY2VDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5jb25zdCBjb29yZHMgPSBbJ3gnLCAneScsICd6JywgJ3cnLCAndScsICd2J107XG5cbmZ1bmN0aW9uIGdldENvb3JkcyhyYW5rOiBudW1iZXIpOiBzdHJpbmcge1xuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiAnc291cmNlTG9jJztcbiAgfSBlbHNlIGlmIChyYW5rIDw9IDYpIHtcbiAgICByZXR1cm4gY29vcmRzLnNsaWNlKDAsIHJhbmspLm1hcCh4ID0+ICdzb3VyY2VMb2MuJyArIHgpLmpvaW4oJywnKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBFcnJvcihgU2xpY2luZyBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class SlicePackedProgram {\n    constructor(destSize) {\n        this.variableNames = ['source'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = destSize;\n        this.rank = destSize.length;\n        this.customUniforms = [{ name: 'start', arrayIndex: this.rank, type: 'int' }];\n        const dtype = getCoordsDataType(this.rank);\n        const coords = getChannels('coords', this.rank);\n        const sourceLoc = getChannels('sourceLoc', this.rank);\n        const innerDims = this.rank === 1 ? 'sourceLoc' : `vec2(${sourceLoc.slice(-2).join()})`;\n        const getChannel = `getChannel(getSource(${sourceLoc.join()}), ${innerDims})`;\n        const upperRow = `\n      result.x = ${getChannel};\n      if (++${coords[this.rank - 1]} < ${destSize[this.rank - 1]}) {\n        ++${sourceLoc[this.rank - 1]};\n        result.y = ${getChannel};\n        --${sourceLoc[this.rank - 1]};\n      }\n    `;\n        const lowerRow = this.rank === 1 ? '' : `\n      --${coords[this.rank - 1]};\n      if (++${coords[this.rank - 2]} < ${destSize[this.rank - 2]}) {\n        ++${sourceLoc[this.rank - 2]};\n        result.z = ${getChannel};\n        if (++${coords[this.rank - 1]} < ${destSize[this.rank - 1]}) {\n          ++${sourceLoc[this.rank - 1]};\n          result.w = ${getChannel};\n        }\n      }\n    `;\n        const sourceLocSetup = this.rank <= 4 ?\n            `sourceLoc = coords +\n            ${dtype}(${destSize.map((_, i) => `start[${i}]`).join()});` :\n            destSize.map((_, i) => `${sourceLoc[i]} = ${coords[i]} + start[${i}];`)\n                .join('\\n');\n        this.userCode = `\n      void main() {\n        ${dtype} coords = getOutputCoords();\n        ${dtype} sourceLoc;\n        ${sourceLocSetup}\n        vec4 result = vec4(0.);\n        ${upperRow}\n        ${lowerRow}\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2xpY2VfcGFja2VkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvc2xpY2VfcGFja2VkX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFakUsTUFBTSxPQUFPLGtCQUFrQjtJQVM3QixZQUFZLFFBQWtCO1FBUjlCLGtCQUFhLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMzQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQU9sQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUM1QixJQUFJLENBQUMsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUM7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztRQUM1RSxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDaEQsTUFBTSxTQUFTLEdBQUcsV0FBVyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEQsTUFBTSxTQUFTLEdBQ1gsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsUUFBUSxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUMxRSxNQUFNLFVBQVUsR0FDWix3QkFBd0IsU0FBUyxDQUFDLElBQUksRUFBRSxNQUFNLFNBQVMsR0FBRyxDQUFDO1FBQy9ELE1BQU0sUUFBUSxHQUFHO21CQUNGLFVBQVU7Y0FDZixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7WUFDcEQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3FCQUNmLFVBQVU7WUFDbkIsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDOztLQUUvQixDQUFDO1FBQ0YsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7VUFDbEMsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2NBQ2pCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNwRCxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7cUJBQ2YsVUFBVTtnQkFDZixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Y0FDcEQsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO3VCQUNmLFVBQVU7OztLQUc1QixDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNuQztjQUNNLEtBQUssSUFBSSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNqRSxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsR0FBRyxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sTUFBTSxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDO2lCQUNsRSxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixLQUFLO1VBQ0wsS0FBSztVQUNMLGNBQWM7O1VBRWQsUUFBUTtVQUNSLFFBQVE7OztLQUdiLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDaGFubmVsc30gZnJvbSAnLi9wYWNraW5nX3V0aWwnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNsaWNlUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3NvdXJjZSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcbiAgY3VzdG9tVW5pZm9ybXM6IEFycmF5PHtuYW1lOiBzdHJpbmc7IGFycmF5SW5kZXg6IG51bWJlcjsgdHlwZTogVW5pZm9ybVR5cGU7fT47XG5cbiAgY29uc3RydWN0b3IoZGVzdFNpemU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGRlc3RTaXplO1xuICAgIHRoaXMucmFuayA9IGRlc3RTaXplLmxlbmd0aDtcbiAgICB0aGlzLmN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnc3RhcnQnLCBhcnJheUluZGV4OiB0aGlzLnJhbmssIHR5cGU6ICdpbnQnfV07XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuICAgIGNvbnN0IGNvb3JkcyA9IGdldENoYW5uZWxzKCdjb29yZHMnLCB0aGlzLnJhbmspO1xuICAgIGNvbnN0IHNvdXJjZUxvYyA9IGdldENoYW5uZWxzKCdzb3VyY2VMb2MnLCB0aGlzLnJhbmspO1xuXG4gICAgY29uc3QgaW5uZXJEaW1zID1cbiAgICAgICAgdGhpcy5yYW5rID09PSAxID8gJ3NvdXJjZUxvYycgOiBgdmVjMigke3NvdXJjZUxvYy5zbGljZSgtMikuam9pbigpfSlgO1xuICAgIGNvbnN0IGdldENoYW5uZWwgPVxuICAgICAgICBgZ2V0Q2hhbm5lbChnZXRTb3VyY2UoJHtzb3VyY2VMb2Muam9pbigpfSksICR7aW5uZXJEaW1zfSlgO1xuICAgIGNvbnN0IHVwcGVyUm93ID0gYFxuICAgICAgcmVzdWx0LnggPSAke2dldENoYW5uZWx9O1xuICAgICAgaWYgKCsrJHtjb29yZHNbdGhpcy5yYW5rIC0gMV19IDwgJHtkZXN0U2l6ZVt0aGlzLnJhbmsgLSAxXX0pIHtcbiAgICAgICAgKyske3NvdXJjZUxvY1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICAgIHJlc3VsdC55ID0gJHtnZXRDaGFubmVsfTtcbiAgICAgICAgLS0ke3NvdXJjZUxvY1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICB9XG4gICAgYDtcbiAgICBjb25zdCBsb3dlclJvdyA9IHRoaXMucmFuayA9PT0gMSA/ICcnIDogYFxuICAgICAgLS0ke2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX07XG4gICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAyXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDJdfSkge1xuICAgICAgICArKyR7c291cmNlTG9jW3RoaXMucmFuayAtIDJdfTtcbiAgICAgICAgcmVzdWx0LnogPSAke2dldENoYW5uZWx9O1xuICAgICAgICBpZiAoKyske2Nvb3Jkc1t0aGlzLnJhbmsgLSAxXX0gPCAke2Rlc3RTaXplW3RoaXMucmFuayAtIDFdfSkge1xuICAgICAgICAgICsrJHtzb3VyY2VMb2NbdGhpcy5yYW5rIC0gMV19O1xuICAgICAgICAgIHJlc3VsdC53ID0gJHtnZXRDaGFubmVsfTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIGA7XG5cbiAgICBjb25zdCBzb3VyY2VMb2NTZXR1cCA9IHRoaXMucmFuayA8PSA0ID9cbiAgICAgICAgYHNvdXJjZUxvYyA9IGNvb3JkcyArXG4gICAgICAgICAgICAke2R0eXBlfSgke2Rlc3RTaXplLm1hcCgoXywgaSkgPT4gYHN0YXJ0WyR7aX1dYCkuam9pbigpfSk7YCA6XG4gICAgICAgIGRlc3RTaXplLm1hcCgoXywgaSkgPT4gYCR7c291cmNlTG9jW2ldfSA9ICR7Y29vcmRzW2ldfSArIHN0YXJ0WyR7aX1dO2ApXG4gICAgICAgICAgICAuam9pbignXFxuJyk7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZUxvYztcbiAgICAgICAgJHtzb3VyY2VMb2NTZXR1cH1cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgJHt1cHBlclJvd31cbiAgICAgICAgJHtsb3dlclJvd31cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, Slice, slice_util, util } from '@tensorflow/tfjs-core';\nimport { sliceImplCPU } from '../kernel_utils/shared';\nimport { SliceProgram } from '../slice_gpu';\nimport { SlicePackedProgram } from '../slice_packed_gpu';\nfunction shallowSlice(x, begin, size, backend) {\n    const xTexData = backend.texData.get(x.dataId);\n    const t = backend.makeTensorInfo(size, x.dtype);\n    const newTexData = backend.texData.get(t.dataId);\n    // Copy texture data from the original tensor.\n    Object.assign(newTexData, xTexData);\n    newTexData.refCount = 1;\n    newTexData.shape = size;\n    newTexData.dtype = x.dtype;\n    let flatOffset = slice_util.computeFlatOffset(begin, util.computeStrides(x.shape));\n    if (xTexData.slice) {\n        // We are slicing an already sliced tensor, so we have to accumulate\n        // the offset.\n        flatOffset += xTexData.slice.flatOffset;\n    }\n    newTexData.slice = {\n        flatOffset,\n        // Point to the original dataId, which is used to do ref counting.\n        origDataId: xTexData.slice && xTexData.slice.origDataId || x.dataId\n    };\n    // Increase the ref count for that data bucket.\n    const refCount = backend.dataRefCount.get(newTexData.slice.origDataId) || 1;\n    backend.dataRefCount.set(newTexData.slice.origDataId, refCount + 1);\n    return t;\n}\nexport function slice(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { begin, size } = attrs;\n    const [$begin, $size] = slice_util.parseSliceParams(x, begin, size);\n    slice_util.assertParamsValid(x, $begin, $size);\n    if (util.sizeFromShape($size) === 0) {\n        return backend.makeTensorInfo($size, x.dtype, []);\n    }\n    // Run on cpu if dtype is string. For string, the backend represents it\n    // as Uint8Array[], where each Uint8Array is a character. Given that the\n    // computation is only on the outer array, uploading the whole data onto\n    // gpu is wasteful. Also, currently webgl doesn't have a design to\n    // upload and retrieve Uint8Array[] between cpu and gpu. Therefore, we\n    // just run the kernel on cpu if dtype is string.\n    if (backend.shouldExecuteOnCPU([x]) || x.dtype === 'string') {\n        const xTexData = backend.texData.get(x.dataId);\n        const outValues = sliceImplCPU(xTexData.values, $begin, $size, x.shape, x.dtype);\n        return backend.makeTensorInfo($size, x.dtype, outValues);\n    }\n    const { isPacked } = backend.texData.get(x.dataId);\n    const isContinous = slice_util.isSliceContinous(x.shape, $begin, $size);\n    if (isPacked || !isContinous) {\n        const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n            new SlicePackedProgram($size) :\n            new SliceProgram($size);\n        const customValues = [$begin];\n        return backend.runWebGLProgram(program, [x], x.dtype, customValues);\n    }\n    backend.uploadToGPU(x.dataId);\n    return shallowSlice(x, $begin, $size, backend);\n}\nexport const sliceConfig = {\n    kernelName: Slice,\n    backendName: 'webgl',\n    kernelFunc: slice\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2xpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU2xpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBNEIsS0FBSyxFQUFFLFVBQVUsRUFBbUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHOUksT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3BELE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFDMUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFFdkQsU0FBUyxZQUFZLENBQ2pCLENBQWEsRUFBRSxLQUFlLEVBQUUsSUFBYyxFQUFFLE9BQXlCO0lBQzNFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUMvQyxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ2pELDhDQUE4QztJQUM5QyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNwQyxVQUFVLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztJQUN4QixVQUFVLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQztJQUN4QixVQUFVLENBQUMsS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDM0IsSUFBSSxVQUFVLEdBQ1YsVUFBVSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLElBQUksUUFBUSxDQUFDLEtBQUssRUFBRTtRQUNsQixvRUFBb0U7UUFDcEUsY0FBYztRQUNkLFVBQVUsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQztLQUN6QztJQUNELFVBQVUsQ0FBQyxLQUFLLEdBQUc7UUFDakIsVUFBVTtRQUNWLGtFQUFrRTtRQUNsRSxVQUFVLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBSSxDQUFDLENBQUMsTUFBTTtLQUNwRSxDQUFDO0lBRUYsK0NBQStDO0lBQy9DLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVFLE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsVUFBVSxFQUFFLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRSxPQUFPLENBQUMsQ0FBQztBQUNYLENBQUM7QUFFRCxNQUFNLFVBQVUsS0FBSyxDQUNqQixJQUF5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUU1QixNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3BFLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRS9DLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDbkMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQ25EO0lBRUQsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUsa0VBQWtFO0lBQ2xFLHNFQUFzRTtJQUN0RSxpREFBaUQ7SUFDakQsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzNELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQyxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQzFCLFFBQVEsQ0FBQyxNQUFvQixFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQzFEO0lBRUQsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEUsSUFBSSxRQUFRLElBQUksQ0FBQyxXQUFXLEVBQUU7UUFDNUIsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQztZQUMxRCxJQUFJLGtCQUFrQixDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDL0IsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDNUIsTUFBTSxZQUFZLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QixPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztLQUNyRTtJQUNELE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlCLE9BQU8sWUFBWSxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2pELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTbGljZSwgc2xpY2VfdXRpbCwgU2xpY2VBdHRycywgU2xpY2VJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NsaWNlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1NsaWNlUHJvZ3JhbX0gZnJvbSAnLi4vc2xpY2VfZ3B1JztcbmltcG9ydCB7U2xpY2VQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9zbGljZV9wYWNrZWRfZ3B1JztcblxuZnVuY3Rpb24gc2hhbGxvd1NsaWNlKFxuICAgIHg6IFRlbnNvckluZm8sIGJlZ2luOiBudW1iZXJbXSwgc2l6ZTogbnVtYmVyW10sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpIHtcbiAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2l6ZSwgeC5kdHlwZSk7XG4gIGNvbnN0IG5ld1RleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHQuZGF0YUlkKTtcbiAgLy8gQ29weSB0ZXh0dXJlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgdGVuc29yLlxuICBPYmplY3QuYXNzaWduKG5ld1RleERhdGEsIHhUZXhEYXRhKTtcbiAgbmV3VGV4RGF0YS5yZWZDb3VudCA9IDE7XG4gIG5ld1RleERhdGEuc2hhcGUgPSBzaXplO1xuICBuZXdUZXhEYXRhLmR0eXBlID0geC5kdHlwZTtcbiAgbGV0IGZsYXRPZmZzZXQgPVxuICAgICAgc2xpY2VfdXRpbC5jb21wdXRlRmxhdE9mZnNldChiZWdpbiwgdXRpbC5jb21wdXRlU3RyaWRlcyh4LnNoYXBlKSk7XG4gIGlmICh4VGV4RGF0YS5zbGljZSkge1xuICAgIC8vIFdlIGFyZSBzbGljaW5nIGFuIGFscmVhZHkgc2xpY2VkIHRlbnNvciwgc28gd2UgaGF2ZSB0byBhY2N1bXVsYXRlXG4gICAgLy8gdGhlIG9mZnNldC5cbiAgICBmbGF0T2Zmc2V0ICs9IHhUZXhEYXRhLnNsaWNlLmZsYXRPZmZzZXQ7XG4gIH1cbiAgbmV3VGV4RGF0YS5zbGljZSA9IHtcbiAgICBmbGF0T2Zmc2V0LFxuICAgIC8vIFBvaW50IHRvIHRoZSBvcmlnaW5hbCBkYXRhSWQsIHdoaWNoIGlzIHVzZWQgdG8gZG8gcmVmIGNvdW50aW5nLlxuICAgIG9yaWdEYXRhSWQ6IHhUZXhEYXRhLnNsaWNlICYmIHhUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQgfHwgeC5kYXRhSWRcbiAgfTtcblxuICAvLyBJbmNyZWFzZSB0aGUgcmVmIGNvdW50IGZvciB0aGF0IGRhdGEgYnVja2V0LlxuICBjb25zdCByZWZDb3VudCA9IGJhY2tlbmQuZGF0YVJlZkNvdW50LmdldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQpIHx8IDE7XG4gIGJhY2tlbmQuZGF0YVJlZkNvdW50LnNldChuZXdUZXhEYXRhLnNsaWNlLm9yaWdEYXRhSWQsIHJlZkNvdW50ICsgMSk7XG4gIHJldHVybiB0O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gc2xpY2UoXG4gICAgYXJnczoge2lucHV0czogU2xpY2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBTbGljZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2JlZ2luLCBzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFskYmVnaW4sICRzaXplXSA9IHNsaWNlX3V0aWwucGFyc2VTbGljZVBhcmFtcyh4LCBiZWdpbiwgc2l6ZSk7XG4gIHNsaWNlX3V0aWwuYXNzZXJ0UGFyYW1zVmFsaWQoeCwgJGJlZ2luLCAkc2l6ZSk7XG5cbiAgaWYgKHV0aWwuc2l6ZUZyb21TaGFwZSgkc2l6ZSkgPT09IDApIHtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgW10pO1xuICB9XG5cbiAgLy8gUnVuIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuIEZvciBzdHJpbmcsIHRoZSBiYWNrZW5kIHJlcHJlc2VudHMgaXRcbiAgLy8gYXMgVWludDhBcnJheVtdLCB3aGVyZSBlYWNoIFVpbnQ4QXJyYXkgaXMgYSBjaGFyYWN0ZXIuIEdpdmVuIHRoYXQgdGhlXG4gIC8vIGNvbXB1dGF0aW9uIGlzIG9ubHkgb24gdGhlIG91dGVyIGFycmF5LCB1cGxvYWRpbmcgdGhlIHdob2xlIGRhdGEgb250b1xuICAvLyBncHUgaXMgd2FzdGVmdWwuIEFsc28sIGN1cnJlbnRseSB3ZWJnbCBkb2Vzbid0IGhhdmUgYSBkZXNpZ24gdG9cbiAgLy8gdXBsb2FkIGFuZCByZXRyaWV2ZSBVaW50OEFycmF5W10gYmV0d2VlbiBjcHUgYW5kIGdwdS4gVGhlcmVmb3JlLCB3ZVxuICAvLyBqdXN0IHJ1biB0aGUga2VybmVsIG9uIGNwdSBpZiBkdHlwZSBpcyBzdHJpbmcuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgeFRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBvdXRWYWx1ZXMgPSBzbGljZUltcGxDUFUoXG4gICAgICAgIHhUZXhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCAkYmVnaW4sICRzaXplLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbygkc2l6ZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgfVxuXG4gIGNvbnN0IHtpc1BhY2tlZH0gPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgaXNDb250aW5vdXMgPSBzbGljZV91dGlsLmlzU2xpY2VDb250aW5vdXMoeC5zaGFwZSwgJGJlZ2luLCAkc2l6ZSk7XG4gIGlmIChpc1BhY2tlZCB8fCAhaXNDb250aW5vdXMpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgICBuZXcgU2xpY2VQYWNrZWRQcm9ncmFtKCRzaXplKSA6XG4gICAgICAgIG5ldyBTbGljZVByb2dyYW0oJHNpemUpO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFskYmVnaW5dO1xuICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gIH1cbiAgYmFja2VuZC51cGxvYWRUb0dQVSh4LmRhdGFJZCk7XG4gIHJldHVybiBzaGFsbG93U2xpY2UoeCwgJGJlZ2luLCAkc2l6ZSwgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBzbGljZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTbGljZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, BatchToSpaceND, util } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nimport { transpose } from './Transpose';\nexport const batchToSpaceND = (args) => {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { blockShape, crops } = attrs;\n    util.assert(x.shape.length <= 4, () => 'batchToSpaceND for rank > 4 with a WebGL backend not ' +\n        'implemented yet');\n    const prod = blockShape.reduce((a, b) => a * b);\n    const reshaped = backend_util.getReshaped(x.shape, blockShape, prod);\n    const permuted = backend_util.getPermuted(reshaped.length, blockShape.length);\n    const reshapedPermuted = backend_util.getReshapedPermuted(x.shape, blockShape, prod);\n    const sliceBeginCoords = backend_util.getSliceBeginCoords(crops, blockShape.length);\n    const sliceSize = backend_util.getSliceSize(reshapedPermuted, crops, blockShape.length);\n    const toDispose = [];\n    const reshapedIntermediate = reshape({ inputs: { x }, backend, attrs: { shape: reshaped } });\n    const transposedIntermediate = transpose({ inputs: { x: reshapedIntermediate }, backend, attrs: { perm: permuted } });\n    const reshapedIntermediate2 = reshape({\n        inputs: { x: transposedIntermediate },\n        backend,\n        attrs: { shape: reshapedPermuted }\n    });\n    const sliced = slice({\n        inputs: { x: reshapedIntermediate2 },\n        backend,\n        attrs: { begin: sliceBeginCoords, size: sliceSize }\n    });\n    toDispose.push(reshapedIntermediate);\n    toDispose.push(transposedIntermediate);\n    toDispose.push(reshapedIntermediate2);\n    toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return sliced;\n};\nexport const batchToSpaceNDConfig = {\n    kernelName: BatchToSpaceND,\n    backendName: 'webgl',\n    kernelFunc: batchToSpaceND\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmF0Y2hUb1NwYWNlTkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxjQUFjLEVBQW1GLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSTFKLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLEtBQUssRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUM5QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUFDLElBSTlCLEVBQWMsRUFBRTtJQUNmLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxVQUFVLEVBQUUsS0FBSyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRWxDLElBQUksQ0FBQyxNQUFNLENBQ1AsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUNuQixHQUFHLEVBQUUsQ0FBQyx1REFBdUQ7UUFDekQsaUJBQWlCLENBQUMsQ0FBQztJQUMzQixNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5RSxNQUFNLGdCQUFnQixHQUNsQixZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDaEUsTUFBTSxnQkFBZ0IsR0FDbEIsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEtBQUssRUFBRSxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDL0QsTUFBTSxTQUFTLEdBQ1gsWUFBWSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsRUFBRSxLQUFLLEVBQUUsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTFFLE1BQU0sU0FBUyxHQUFHLEVBQUUsQ0FBQztJQUVyQixNQUFNLG9CQUFvQixHQUN0QixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUM5RCxNQUFNLHNCQUFzQixHQUFHLFNBQVMsQ0FDcEMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsb0JBQW9CLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUMzRSxNQUFNLHFCQUFxQixHQUFHLE9BQU8sQ0FBQztRQUNwQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsc0JBQXNCLEVBQUM7UUFDbkMsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxnQkFBZ0IsRUFBQztLQUNqQyxDQUFDLENBQUM7SUFDSCxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDbkIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLHFCQUFxQixFQUFDO1FBQ2xDLE9BQU87UUFDUCxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBQztLQUNsRCxDQUFDLENBQUM7SUFFSCxTQUFTLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7SUFDckMsU0FBUyxDQUFDLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ3ZDLFNBQVMsQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUV0QyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWlCO0lBQ2hELFVBQVUsRUFBRSxjQUFjO0lBQzFCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxjQUFrQztDQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQmF0Y2hUb1NwYWNlTkQsIEJhdGNoVG9TcGFjZU5EQXR0cnMsIEJhdGNoVG9TcGFjZU5ESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGNvbnN0IGJhdGNoVG9TcGFjZU5EID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBCYXRjaFRvU3BhY2VORElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEJhdGNoVG9TcGFjZU5EQXR0cnNcbn0pOiBUZW5zb3JJbmZvID0+IHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YmxvY2tTaGFwZSwgY3JvcHN9ID0gYXR0cnM7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4LnNoYXBlLmxlbmd0aCA8PSA0LFxuICAgICAgKCkgPT4gJ2JhdGNoVG9TcGFjZU5EIGZvciByYW5rID4gNCB3aXRoIGEgV2ViR0wgYmFja2VuZCBub3QgJyArXG4gICAgICAgICAgJ2ltcGxlbWVudGVkIHlldCcpO1xuICBjb25zdCBwcm9kID0gYmxvY2tTaGFwZS5yZWR1Y2UoKGEsIGIpID0+IGEgKiBiKTtcblxuICBjb25zdCByZXNoYXBlZCA9IGJhY2tlbmRfdXRpbC5nZXRSZXNoYXBlZCh4LnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kKTtcbiAgY29uc3QgcGVybXV0ZWQgPSBiYWNrZW5kX3V0aWwuZ2V0UGVybXV0ZWQocmVzaGFwZWQubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCk7XG4gIGNvbnN0IHJlc2hhcGVkUGVybXV0ZWQgPVxuICAgICAgYmFja2VuZF91dGlsLmdldFJlc2hhcGVkUGVybXV0ZWQoeC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCk7XG4gIGNvbnN0IHNsaWNlQmVnaW5Db29yZHMgPVxuICAgICAgYmFja2VuZF91dGlsLmdldFNsaWNlQmVnaW5Db29yZHMoY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcbiAgY29uc3Qgc2xpY2VTaXplID1cbiAgICAgIGJhY2tlbmRfdXRpbC5nZXRTbGljZVNpemUocmVzaGFwZWRQZXJtdXRlZCwgY3JvcHMsIGJsb2NrU2hhcGUubGVuZ3RoKTtcblxuICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcblxuICBjb25zdCByZXNoYXBlZEludGVybWVkaWF0ZSA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogcmVzaGFwZWR9fSk7XG4gIGNvbnN0IHRyYW5zcG9zZWRJbnRlcm1lZGlhdGUgPSB0cmFuc3Bvc2UoXG4gICAgICB7aW5wdXRzOiB7eDogcmVzaGFwZWRJbnRlcm1lZGlhdGV9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkfX0pO1xuICBjb25zdCByZXNoYXBlZEludGVybWVkaWF0ZTIgPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4OiB0cmFuc3Bvc2VkSW50ZXJtZWRpYXRlfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7c2hhcGU6IHJlc2hhcGVkUGVybXV0ZWR9XG4gIH0pO1xuICBjb25zdCBzbGljZWQgPSBzbGljZSh7XG4gICAgaW5wdXRzOiB7eDogcmVzaGFwZWRJbnRlcm1lZGlhdGUyfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7YmVnaW46IHNsaWNlQmVnaW5Db29yZHMsIHNpemU6IHNsaWNlU2l6ZX1cbiAgfSk7XG5cbiAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWRJbnRlcm1lZGlhdGUpO1xuICB0b0Rpc3Bvc2UucHVzaCh0cmFuc3Bvc2VkSW50ZXJtZWRpYXRlKTtcbiAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWRJbnRlcm1lZGlhdGUyKTtcblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiBzbGljZWQ7XG59O1xuXG5leHBvcnQgY29uc3QgYmF0Y2hUb1NwYWNlTkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQmF0Y2hUb1NwYWNlTkQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBiYXRjaFRvU3BhY2VORCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Bincount } from '@tensorflow/tfjs-core';\nimport { bincountImplCPU } from '../kernel_utils/shared';\nexport function bincount(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, weights } = inputs;\n    const { size } = attrs;\n    const xVals = backend.readSync(x.dataId);\n    const weightsVals = backend.readSync(weights.dataId);\n    const outVals = bincountImplCPU(xVals, weightsVals, weights.dtype, weights.shape, size);\n    return backend.makeTensorInfo([size], weights.dtype, outVals);\n}\nexport const bincountConfig = {\n    kernelName: Bincount,\n    backendName: 'webgl',\n    kernelFunc: bincount\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQmluY291bnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQmluY291bnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBa0YsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsTUFBTSxVQUFVLFFBQVEsQ0FBQyxJQUl4QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQ3ZELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBRW5FLE1BQU0sT0FBTyxHQUNULGVBQWUsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUU1RSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0JpbmNvdW50LCBCaW5jb3VudEF0dHJzLCBCaW5jb3VudElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtiaW5jb3VudEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gYmluY291bnQoYXJnczoge1xuICBpbnB1dHM6IEJpbmNvdW50SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogQmluY291bnRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgd2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhWYWxzID0gYmFja2VuZC5yZWFkU3luYyh4LmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgd2VpZ2h0c1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHdlaWdodHMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IG91dFZhbHMgPVxuICAgICAgYmluY291bnRJbXBsQ1BVKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0cy5kdHlwZSwgd2VpZ2h0cy5zaGFwZSwgc2l6ZSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW3NpemVdLCB3ZWlnaHRzLmR0eXBlLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGJpbmNvdW50Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJpbmNvdW50LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogYmluY291bnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, BroadcastArgs } from '@tensorflow/tfjs-core';\nexport function broadcastArgs(args) {\n    const { inputs, backend } = args;\n    const { s0, s1 } = inputs;\n    const s0Vals = backend.readSync(s0.dataId);\n    const s1Vals = backend.readSync(s1.dataId);\n    const broadcastShape = backend_util.assertAndGetBroadcastShape(Array.from(s0Vals), Array.from(s1Vals));\n    return backend.makeTensorInfo([broadcastShape.length], 'int32', Int32Array.from(broadcastShape));\n}\nexport const broadcastArgsConfig = {\n    kernelName: BroadcastArgs,\n    backendName: 'webgl',\n    kernelFunc: broadcastArgs\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQnJvYWRjYXN0QXJncy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ccm9hZGNhc3RBcmdzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsYUFBYSxFQUE0RCxNQUFNLHVCQUF1QixDQUFDO0FBRzdILE1BQU0sVUFBVSxhQUFhLENBQUMsSUFHN0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsRUFBRSxFQUFFLEVBQUUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV4QixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUN6RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUV6RCxNQUFNLGNBQWMsR0FBRyxZQUFZLENBQUMsMEJBQTBCLENBQzFELEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRTVDLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FDekIsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLFVBQVUsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQztBQUN6RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxhQUFhO0NBQzFCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBCcm9hZGNhc3RBcmdzLCBCcm9hZGNhc3RBcmdzSW5wdXRzLCBLZXJuZWxDb25maWcsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gYnJvYWRjYXN0QXJncyhhcmdzOiB7XG4gIGlucHV0czogQnJvYWRjYXN0QXJnc0lucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7czAsIHMxfSA9IGlucHV0cztcblxuICBjb25zdCBzMFZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKHMwLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgczFWYWxzID0gYmFja2VuZC5yZWFkU3luYyhzMS5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgYnJvYWRjYXN0U2hhcGUgPSBiYWNrZW5kX3V0aWwuYXNzZXJ0QW5kR2V0QnJvYWRjYXN0U2hhcGUoXG4gICAgICBBcnJheS5mcm9tKHMwVmFscyksIEFycmF5LmZyb20oczFWYWxzKSk7XG5cbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICBbYnJvYWRjYXN0U2hhcGUubGVuZ3RoXSwgJ2ludDMyJywgSW50MzJBcnJheS5mcm9tKGJyb2FkY2FzdFNoYXBlKSk7XG59XG5cbmV4cG9ydCBjb25zdCBicm9hZGNhc3RBcmdzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEJyb2FkY2FzdEFyZ3MsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBicm9hZGNhc3RBcmdzXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { NotEqual } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { notEqualImplCPU } from '../kernel_utils/shared';\nconst NOT_EQUAL = `return float(a != b);`;\nexport const notEqual = binaryKernelFunc({ opSnippet: NOT_EQUAL, cpuKernelImpl: notEqualImplCPU, dtype: 'bool' });\nexport const notEqualConfig = {\n    kernelName: NotEqual,\n    backendName: 'webgl',\n    kernelFunc: notEqual,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm90RXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTm90RXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRS9DLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxNQUFNLFNBQVMsR0FBRyx1QkFBdUIsQ0FBQztBQUUxQyxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsZ0JBQWdCLENBQ3BDLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUMsQ0FBQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFFBQVE7Q0FDckIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtOb3RFcXVhbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7bm90RXF1YWxJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgTk9UX0VRVUFMID0gYHJldHVybiBmbG9hdChhICE9IGIpO2A7XG5cbmV4cG9ydCBjb25zdCBub3RFcXVhbCA9IGJpbmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogTk9UX0VRVUFMLCBjcHVLZXJuZWxJbXBsOiBub3RFcXVhbEltcGxDUFUsIGR0eXBlOiAnYm9vbCd9KTtcblxuZXhwb3J0IGNvbnN0IG5vdEVxdWFsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vdEVxdWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbm90RXF1YWwsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Real } from '@tensorflow/tfjs-core';\nimport { identity } from './Identity';\nexport function real(args) {\n    const { inputs, backend } = args;\n    const { input } = inputs;\n    const inputData = backend.texData.get(input.dataId);\n    return identity({ inputs: { x: inputData.complexTensorInfos.real }, backend });\n}\nexport const realConfig = {\n    kernelName: Real,\n    backendName: 'webgl',\n    kernelFunc: real\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZWFsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUF5QixNQUFNLHVCQUF1QixDQUFDO0FBRzdGLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFxRDtJQUV4RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVwRCxPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztBQUM3RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlYWwsIFJlYWxJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlYWwoYXJnczoge2lucHV0czogUmVhbElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IGlucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoaW5wdXQuZGF0YUlkKTtcblxuICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3g6IGlucHV0RGF0YS5jb21wbGV4VGVuc29ySW5mb3MucmVhbH0sIGJhY2tlbmR9KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJlYWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVhbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlYWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { UnaryOpProgram } from '../unaryop_gpu';\nconst TO_INT = `return float(int(x));`;\nexport function int(input, backend) {\n    const program = new UnaryOpProgram(input.shape, TO_INT);\n    const output = backend.runWebGLProgram(program, [input], 'int32');\n    return { dataId: output.dataId, shape: output.shape, dtype: output.dtype };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxfdXRpbHMvaW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxNQUFNLE1BQU0sR0FBRyx1QkFBdUIsQ0FBQztBQUV2QyxNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQWlCLEVBQUUsT0FBeUI7SUFDOUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztJQUN4RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2xFLE9BQU8sRUFBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBQyxDQUFDO0FBQzNFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7VW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuY29uc3QgVE9fSU5UID0gYHJldHVybiBmbG9hdChpbnQoeCkpO2A7XG5cbmV4cG9ydCBmdW5jdGlvbiBpbnQoaW5wdXQ6IFRlbnNvckluZm8sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUHJvZ3JhbShpbnB1dC5zaGFwZSwgVE9fSU5UKTtcbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2lucHV0XSwgJ2ludDMyJyk7XG4gIHJldHVybiB7ZGF0YUlkOiBvdXRwdXQuZGF0YUlkLCBzaGFwZTogb3V0cHV0LnNoYXBlLCBkdHlwZTogb3V0cHV0LmR0eXBlfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport * as tf from '@tensorflow/tfjs-core';\nimport { Cast, util } from '@tensorflow/tfjs-core';\nimport { castImplCPU } from '../kernel_utils/shared';\nimport { complex } from './Complex';\nimport { identity } from './Identity';\nimport { notEqual } from './NotEqual';\nimport { real } from './Real';\nimport { int } from '../kernel_utils/int';\nexport function cast(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { dtype } = attrs;\n    // Casting to complex64.\n    if (dtype === 'complex64') {\n        if (x.dtype === 'complex64') {\n            return identity({ inputs: { x }, backend });\n        }\n        // TODO(annxingyuan): Import kernel function once zeros is modularized.\n        const zerosTensor = tf.zeros(x.shape);\n        const floatX = cast({ inputs: { x }, backend, attrs: { dtype: 'float32' } });\n        const result = complex({ inputs: { real: floatX, imag: zerosTensor }, backend });\n        zerosTensor.dispose();\n        backend.disposeIntermediateTensorInfo(floatX);\n        return result;\n    }\n    // Casting from complex64\n    if (x.dtype === 'complex64') {\n        const realPart = real({ inputs: { input: x }, backend });\n        const result = cast({ inputs: { x: realPart }, backend, attrs: { dtype } });\n        backend.disposeIntermediateTensorInfo(realPart);\n        return result;\n    }\n    if (!util.hasEncodingLoss(x.dtype, dtype)) {\n        // We don't change the underlying data, since we cast to higher\n        // precision.\n        const result = identity({ inputs: { x }, backend });\n        return { dataId: result.dataId, shape: result.shape, dtype };\n    }\n    if (backend.shouldExecuteOnCPU([x])) {\n        const values = backend.texData.get(x.dataId).values;\n        const [resultShape, resultType, resultData] = castImplCPU(values, x.shape, x.dtype, dtype);\n        return backend.makeTensorInfo(resultShape, resultType, resultData);\n    }\n    if (dtype === 'int32') {\n        return int(x, backend);\n    }\n    if (dtype === 'bool') {\n        const zerosTensorInfo = backend.makeTensorInfo([], 'bool', util.getTypedArrayFromDType('bool', 1));\n        const binaryInputs = { a: x, b: zerosTensorInfo };\n        const result = notEqual({ inputs: binaryInputs, backend });\n        backend.disposeIntermediateTensorInfo(zerosTensorInfo);\n        return result;\n    }\n    throw new Error(`Error in Cast: failed to cast ${x.dtype} to ${dtype}`);\n}\nexport const castConfig = {\n    kernelName: Cast,\n    backendName: 'webgl',\n    kernelFunc: cast\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2FzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9DYXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sS0FBSyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDNUMsT0FBTyxFQUFlLElBQUksRUFBMkUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHeEksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBRXhDLE1BQU0sVUFBVSxJQUFJLENBQ2hCLElBQXVFO0lBRXpFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEIsd0JBQXdCO0lBQ3hCLElBQUksS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUN6QixJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1lBQzNCLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztTQUN6QztRQUVELHVFQUF1RTtRQUN2RSxNQUFNLFdBQVcsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFD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Q0FBaUMsQ0FBQyxDQUFDLEtBQUssT0FBTyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0ICogYXMgdGYgZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7QmluYXJ5SW5wdXRzLCBDYXN0LCBDYXN0QXR0cnMsIENhc3RJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Y2FzdEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5pbXBvcnQge25vdEVxdWFsfSBmcm9tICcuL05vdEVxdWFsJztcbmltcG9ydCB7cmVhbH0gZnJvbSAnLi9SZWFsJztcblxuaW1wb3J0IHtpbnR9IGZyb20gJy4uL2tlcm5lbF91dGlscy9pbnQnO1xuXG5leHBvcnQgZnVuY3Rpb24gY2FzdChcbiAgICBhcmdzOiB7aW5wdXRzOiBDYXN0SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogQ2FzdEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2R0eXBlfSA9IGF0dHJzO1xuXG4gIC8vIENhc3RpbmcgdG8gY29tcGxleDY0LlxuICBpZiAoZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3h9LCBiYWNrZW5kfSk7XG4gICAgfVxuXG4gICAgLy8gVE9ETyhhbm54aW5neXVhbik6IEltcG9ydCBrZXJuZWwgZnVuY3Rpb24gb25jZSB6ZXJvcyBpcyBtb2R1bGFyaXplZC5cbiAgICBjb25zdCB6ZXJvc1RlbnNvciA9IHRmLnplcm9zKHguc2hhcGUpO1xuICAgIGNvbnN0IGZsb2F0WCA9IGNhc3Qoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2R0eXBlOiAnZmxvYXQzMid9fSk7XG5cbiAgICBjb25zdCByZXN1bHQgPVxuICAgICAgICBjb21wbGV4KHtpbnB1dHM6IHtyZWFsOiBmbG9hdFgsIGltYWc6IHplcm9zVGVuc29yfSwgYmFja2VuZH0pO1xuXG4gICAgemVyb3NUZW5zb3IuZGlzcG9zZSgpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oZmxvYXRYKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBDYXN0aW5nIGZyb20gY29tcGxleDY0XG4gIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgcmVzdWx0ID0gY2FzdCh7aW5wdXRzOiB7eDogcmVhbFBhcnR9LCBiYWNrZW5kLCBhdHRyczoge2R0eXBlfX0pO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICBpZiAoIXV0aWwuaGFzRW5jb2RpbmdMb3NzKHguZHR5cGUsIGR0eXBlKSkge1xuICAgIC8vIFdlIGRvbid0IGNoYW5nZSB0aGUgdW5kZXJseWluZyBkYXRhLCBzaW5jZSB3ZSBjYXN0IHRvIGhpZ2hlclxuICAgIC8vIHByZWNpc2lvbi5cbiAgICBjb25zdCByZXN1bHQgPSBpZGVudGl0eSh7aW5wdXRzOiB7eH0sIGJhY2tlbmR9KTtcbiAgICByZXR1cm4ge2RhdGFJZDogcmVzdWx0LmRhdGFJZCwgc2hhcGU6IHJlc3VsdC5zaGFwZSwgZHR5cGV9O1xuICB9XG5cbiAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkpIHtcbiAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBbcmVzdWx0U2hhcGUsIHJlc3VsdFR5cGUsIHJlc3VsdERhdGFdID1cbiAgICAgICAgY2FzdEltcGxDUFUodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBkdHlwZSk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ocmVzdWx0U2hhcGUsIHJlc3VsdFR5cGUsIHJlc3VsdERhdGEpO1xuICB9XG5cbiAgaWYgKGR0eXBlID09PSAnaW50MzInKSB7XG4gICAgcmV0dXJuIGludCh4LCBiYWNrZW5kKTtcbiAgfVxuXG4gIGlmIChkdHlwZSA9PT0gJ2Jvb2wnKSB7XG4gICAgY29uc3QgemVyb3NUZW5zb3JJbmZvID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW10sICdib29sJywgdXRpbC5nZXRUeXBlZEFycmF5RnJvbURUeXBlKCdib29sJywgMSkpO1xuXG4gICAgY29uc3QgYmluYXJ5SW5wdXRzOiBCaW5hcnlJbnB1dHMgPSB7YTogeCwgYjogemVyb3NUZW5zb3JJbmZvfTtcblxuICAgIGNvbnN0IHJlc3VsdCA9IG5vdEVxdWFsKHtpbnB1dHM6IGJpbmFyeUlucHV0cywgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh6ZXJvc1RlbnNvckluZm8pO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIGluIENhc3Q6IGZhaWxlZCB0byBjYXN0ICR7eC5kdHlwZX0gdG8gJHtkdHlwZX1gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNhc3RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2FzdCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNhc3QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Ceil } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { ceilImplCPU } from '../kernel_utils/shared';\nconst CEIL = `return ceil(x);`;\nexport const ceil = unaryKernelFunc({ opSnippet: CEIL, packedOpSnippet: CEIL, cpuKernelImpl: ceilImplCPU });\nexport const ceilConfig = {\n    kernelName: Ceil,\n    backendName: 'webgl',\n    kernelFunc: ceil\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2VpbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9DZWlsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUMvQixFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NlaWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Y2VpbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBDRUlMID0gYHJldHVybiBjZWlsKHgpO2A7XG5cbmV4cG9ydCBjb25zdCBjZWlsID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IENFSUwsIHBhY2tlZE9wU25pcHBldDogQ0VJTCwgY3B1S2VybmVsSW1wbDogY2VpbEltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IGNlaWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ2VpbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNlaWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ClipProgram {\n    constructor(aShape) {\n        this.variableNames = ['A'];\n        this.customUniforms = [\n            { name: 'minVal', type: 'float' },\n            { name: 'maxVal', type: 'float' }\n        ];\n        this.outputShape = aShape;\n        this.userCode = `\n\n      void main() {\n        float value = getAAtOutCoords();\n        if (isnan(value)) {\n          setOutput(value);\n          return;\n        }\n\n        setOutput(clamp(value, minVal, maxVal));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NsaXBfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxXQUFXO0lBU3RCLFlBQVksTUFBZ0I7UUFSNUIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLG1CQUFjLEdBQUc7WUFDZixFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQXNCLEVBQUM7WUFDOUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFzQixFQUFDO1NBQy9DLENBQUM7UUFHQSxJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUMxQixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7OztLQVdmLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgQ2xpcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICdtaW5WYWwnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ21heFZhbCcsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XG4gIF07XG5cbiAgY29uc3RydWN0b3IoYVNoYXBlOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBhU2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBmbG9hdCB2YWx1ZSA9IGdldEFBdE91dENvb3JkcygpO1xuICAgICAgICBpZiAoaXNuYW4odmFsdWUpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBzZXRPdXRwdXQoY2xhbXAodmFsdWUsIG1pblZhbCwgbWF4VmFsKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ClipPackedProgram {\n    constructor(aShape) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.customUniforms = [\n            { name: 'minVal', type: 'float' },\n            { name: 'maxVal', type: 'float' }\n        ];\n        this.outputShape = aShape;\n        this.userCode = `\n      void main() {\n        vec4 value = getAAtOutCoords();\n\n        if (any(isnan(value))) {\n          setOutput(value);\n          return;\n        }\n\n        setOutput(clamp(value, vec4(minVal), vec4(maxVal)));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpcF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jbGlwX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLGlCQUFpQjtJQVc1QixZQUFZLE1BQWdCO1FBVjVCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUdwQixtQkFBYyxHQUFHO1lBQ2YsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFzQixFQUFDO1lBQzlDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQztTQUMvQyxDQUFDO1FBR0EsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7S0FXZixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIENsaXBQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIGN1c3RvbVVuaWZvcm1zID0gW1xuICAgIHtuYW1lOiAnbWluVmFsJywgdHlwZTogJ2Zsb2F0JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdtYXhWYWwnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfVxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKGFTaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gYVNoYXBlO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIHZlYzQgdmFsdWUgPSBnZXRBQXRPdXRDb29yZHMoKTtcblxuICAgICAgICBpZiAoYW55KGlzbmFuKHZhbHVlKSkpIHtcbiAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHNldE91dHB1dChjbGFtcCh2YWx1ZSwgdmVjNChtaW5WYWwpLCB2ZWM0KG1heFZhbCkpKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ClipByValue, env } from '@tensorflow/tfjs-core';\nimport { ClipProgram } from '../clip_gpu';\nimport { ClipPackedProgram } from '../clip_packed_gpu';\nexport function clipByValue(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { clipValueMin, clipValueMax } = attrs;\n    let program;\n    if (env().getBool('WEBGL_PACK_CLIP')) {\n        program = new ClipPackedProgram(x.shape);\n    }\n    else {\n        program = new ClipProgram(x.shape);\n    }\n    const customValues = [[clipValueMin], [clipValueMax]];\n    return backend.runWebGLProgram(program, [x], x.dtype, customValues);\n}\nexport const clipByValueConfig = {\n    kernelName: ClipByValue,\n    backendName: 'webgl',\n    kernelFunc: clipByValue\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ2xpcEJ5VmFsdWUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ2xpcEJ5VmFsdWUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFdBQVcsRUFBdUMsR0FBRyxFQUF1QyxNQUFNLHVCQUF1QixDQUFDO0FBR2xJLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFckQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUkzQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTNDLElBQUksT0FBTyxDQUFDO0lBQ1osSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsRUFBRTtRQUNwQyxPQUFPLEdBQUcsSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDMUM7U0FBTTtRQUNMLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7S0FDcEM7SUFDRCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q2xpcEJ5VmFsdWUsIENsaXBCeVZhbHVlQXR0cnMsIENsaXBCeVZhbHVlSW5wdXRzLCBlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q2xpcFByb2dyYW19IGZyb20gJy4uL2NsaXBfZ3B1JztcbmltcG9ydCB7Q2xpcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2NsaXBfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGlwQnlWYWx1ZShhcmdzOiB7XG4gIGlucHV0czogQ2xpcEJ5VmFsdWVJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBDbGlwQnlWYWx1ZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2NsaXBWYWx1ZU1pbiwgY2xpcFZhbHVlTWF4fSA9IGF0dHJzO1xuXG4gIGxldCBwcm9ncmFtO1xuICBpZiAoZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19DTElQJykpIHtcbiAgICBwcm9ncmFtID0gbmV3IENsaXBQYWNrZWRQcm9ncmFtKHguc2hhcGUpO1xuICB9IGVsc2Uge1xuICAgIHByb2dyYW0gPSBuZXcgQ2xpcFByb2dyYW0oeC5zaGFwZSk7XG4gIH1cbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tjbGlwVmFsdWVNaW5dLCBbY2xpcFZhbHVlTWF4XV07XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG59XG5cbmV4cG9ydCBjb25zdCBjbGlwQnlWYWx1ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDbGlwQnlWYWx1ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNsaXBCeVZhbHVlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ComplexAbsProgram {\n    constructor(shape) {\n        this.variableNames = ['real', 'imag'];\n        this.outputShape = shape;\n        this.userCode = `\n      void main() {\n        float re = abs(getRealAtOutCoords());\n        float im = abs(getImagAtOutCoords());\n        float mx = max(re, im);\n\n        // sadly the length function in glsl is not underflow-safe\n        // (at least not on Intel GPUs). So the safe solution is\n        // to ensure underflow-safety in all cases.\n        setOutput(\n          mx == 0.0 ? 0.0 : mx * length(vec2(1, min(re, im)/mx))\n        );\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tcGxleF9hYnNfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jb21wbGV4X2Fic19ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLGlCQUFpQjtJQUs1QixZQUFZLEtBQWU7UUFKM0Isa0JBQWEsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQUsvQixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7Ozs7O0tBYWYsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBDb21wbGV4QWJzUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3JlYWwnLCAnaW1hZyddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG5cbiAgY29uc3RydWN0b3Ioc2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGZsb2F0IHJlID0gYWJzKGdldFJlYWxBdE91dENvb3JkcygpKTtcbiAgICAgICAgZmxvYXQgaW0gPSBhYnMoZ2V0SW1hZ0F0T3V0Q29vcmRzKCkpO1xuICAgICAgICBmbG9hdCBteCA9IG1heChyZSwgaW0pO1xuXG4gICAgICAgIC8vIHNhZGx5IHRoZSBsZW5ndGggZnVuY3Rpb24gaW4gZ2xzbCBpcyBub3QgdW5kZXJmbG93LXNhZmVcbiAgICAgICAgLy8gKGF0IGxlYXN0IG5vdCBvbiBJbnRlbCBHUFVzKS4gU28gdGhlIHNhZmUgc29sdXRpb24gaXNcbiAgICAgICAgLy8gdG8gZW5zdXJlIHVuZGVyZmxvdy1zYWZldHkgaW4gYWxsIGNhc2VzLlxuICAgICAgICBzZXRPdXRwdXQoXG4gICAgICAgICAgbXggPT0gMC4wID8gMC4wIDogbXggKiBsZW5ndGgodmVjMigxLCBtaW4ocmUsIGltKS9teCkpXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ComplexAbs } from '@tensorflow/tfjs-core';\nimport { ComplexAbsProgram } from '../complex_abs_gpu';\n// Returns a TensorInfo with the complex shape and the dataId of the\n// underlying part. We need to do this because a reshaped complex tensor is\n// not reflected in its parts.\nfunction makeComplexComponentTensorInfo(complexTensor, complexPart) {\n    return {\n        dataId: complexPart.dataId,\n        dtype: complexPart.dtype,\n        shape: complexTensor.shape\n    };\n}\nexport function complexAbs(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    const xData = backend.texData.get(x.dataId);\n    const program = new ComplexAbsProgram(x.shape);\n    const programInputs = [\n        makeComplexComponentTensorInfo(x, xData.complexTensorInfos.real),\n        makeComplexComponentTensorInfo(x, xData.complexTensorInfos.imag),\n    ];\n    return backend.runWebGLProgram(program, programInputs, programInputs[0].dtype);\n}\nexport const complexAbsConfig = {\n    kernelName: ComplexAbs,\n    backendName: 'webgl',\n    kernelFunc: complexAbs\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29tcGxleEFicy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db21wbGV4QWJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQXlELE1BQU0sdUJBQXVCLENBQUM7QUFHekcsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFckQsb0VBQW9FO0FBQ3BFLDJFQUEyRTtBQUMzRSw4QkFBOEI7QUFDOUIsU0FBUyw4QkFBOEIsQ0FDbkMsYUFBeUIsRUFBRSxXQUF1QjtJQUNwRCxPQUFPO1FBQ0wsTUFBTSxFQUFFLFdBQVcsQ0FBQyxNQUFNO1FBQzFCLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSztRQUN4QixLQUFLLEVBQUUsYUFBYSxDQUFDLEtBQUs7S0FDM0IsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLFVBQVUsVUFBVSxDQUN0QixJQUEyRDtJQUM3RCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRW5CLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvQyxNQUFNLGFBQWEsR0FBRztRQUNwQiw4QkFBOEIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztRQUNoRSw4QkFBOEIsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztLQUNqRSxDQUFDO0lBRUYsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUMxQixPQUFPLEVBQUUsYUFBYSxFQUFFLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN0RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQWlCO0lBQzVDLFVBQVUsRUFBRSxVQUFVO0lBQ3RCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxVQUE4QjtDQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvbXBsZXhBYnMsIENvbXBsZXhBYnNJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29tcGxleEFic1Byb2dyYW19IGZyb20gJy4uL2NvbXBsZXhfYWJzX2dwdSc7XG5cbi8vIFJldHVybnMgYSBUZW5zb3JJbmZvIHdpdGggdGhlIGNvbXBsZXggc2hhcGUgYW5kIHRoZSBkYXRhSWQgb2YgdGhlXG4vLyB1bmRlcmx5aW5nIHBhcnQuIFdlIG5lZWQgdG8gZG8gdGhpcyBiZWNhdXNlIGEgcmVzaGFwZWQgY29tcGxleCB0ZW5zb3IgaXNcbi8vIG5vdCByZWZsZWN0ZWQgaW4gaXRzIHBhcnRzLlxuZnVuY3Rpb24gbWFrZUNvbXBsZXhDb21wb25lbnRUZW5zb3JJbmZvKFxuICAgIGNvbXBsZXhUZW5zb3I6IFRlbnNvckluZm8sIGNvbXBsZXhQYXJ0OiBUZW5zb3JJbmZvKTogVGVuc29ySW5mbyB7XG4gIHJldHVybiB7XG4gICAgZGF0YUlkOiBjb21wbGV4UGFydC5kYXRhSWQsXG4gICAgZHR5cGU6IGNvbXBsZXhQYXJ0LmR0eXBlLFxuICAgIHNoYXBlOiBjb21wbGV4VGVuc29yLnNoYXBlXG4gIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjb21wbGV4QWJzKFxuICAgIGFyZ3M6IHtpbnB1dHM6IENvbXBsZXhBYnNJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldCh4LmRhdGFJZCk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb21wbGV4QWJzUHJvZ3JhbSh4LnNoYXBlKTtcbiAgY29uc3QgcHJvZ3JhbUlucHV0cyA9IFtcbiAgICBtYWtlQ29tcGxleENvbXBvbmVudFRlbnNvckluZm8oeCwgeERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwpLFxuICAgIG1ha2VDb21wbGV4Q29tcG9uZW50VGVuc29ySW5mbyh4LCB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZyksXG4gIF07XG5cbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgcHJvZ3JhbUlucHV0cywgcHJvZ3JhbUlucHV0c1swXS5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBjb21wbGV4QWJzQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbXBsZXhBYnMsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb21wbGV4QWJzIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nexport class ConcatProgram {\n    // Concats 2d tensors along axis=1. See comments in MathBackendWebGL.concat().\n    constructor(shapes) {\n        this.outputShape = [];\n        this.outputShape = backend_util.computeOutShape(shapes, 1 /* axis */);\n        this.variableNames = shapes.map((_, i) => `T${i}`);\n        const offsets = new Array(shapes.length - 1);\n        offsets[0] = shapes[0][1];\n        for (let i = 1; i < offsets.length; i++) {\n            offsets[i] = offsets[i - 1] + shapes[i][1];\n        }\n        const snippets = [`if (yC < ${offsets[0]}) setOutput(getT0(yR, yC));`];\n        for (let i = 1; i < offsets.length; i++) {\n            const shift = offsets[i - 1];\n            snippets.push(`else if (yC < ${offsets[i]}) ` +\n                `setOutput(getT${i}(yR, yC-${shift}));`);\n        }\n        const lastIndex = offsets.length;\n        const lastShift = offsets[offsets.length - 1];\n        snippets.push(`else setOutput(getT${lastIndex}(yR, yC-${lastShift}));`);\n        this.userCode = `\n      void main() {\n        ivec2 coords = getOutputCoords();\n        int yR = coords.x;\n        int yC = coords.y;\n\n        ${snippets.join('\\n        ')}\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvY29uY2F0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbkQsTUFBTSxPQUFPLGFBQWE7SUFLeEIsOEVBQThFO0lBQzlFLFlBQVksTUFBK0I7UUFKM0MsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFLekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEUsSUFBSSxDQUFDLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBRW5ELE1BQU0sT0FBTyxHQUFhLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDdkQsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN2QyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDNUM7UUFFRCxNQUFNLFFBQVEsR0FBRyxDQUFDLFlBQVksT0FBTyxDQUFDLENBQUMsQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ3ZFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQ3ZDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDN0IsUUFBUSxDQUFDLElBQUksQ0FDVCxpQkFBaUIsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJO2dCQUMvQixpQkFBaUIsQ0FBQyxXQUFXLEtBQUssS0FBSyxDQUFDLENBQUM7U0FDOUM7UUFDRCxNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQ2pDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzlDLFFBQVEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLFNBQVMsV0FBVyxTQUFTLEtBQUssQ0FBQyxDQUFDO1FBRXhFLElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7OztVQU1WLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDOztLQUVoQyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQ29uY2F0UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLiBTZWUgY29tbWVudHMgaW4gTWF0aEJhY2tlbmRXZWJHTC5jb25jYXQoKS5cbiAgY29uc3RydWN0b3Ioc2hhcGVzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKHNoYXBlcywgMSAvKiBheGlzICovKTtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBzaGFwZXMubWFwKChfLCBpKSA9PiBgVCR7aX1gKTtcblxuICAgIGNvbnN0IG9mZnNldHM6IG51bWJlcltdID0gbmV3IEFycmF5KHNoYXBlcy5sZW5ndGggLSAxKTtcbiAgICBvZmZzZXRzWzBdID0gc2hhcGVzWzBdWzFdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2Zmc2V0c1tpXSA9IG9mZnNldHNbaSAtIDFdICsgc2hhcGVzW2ldWzFdO1xuICAgIH1cblxuICAgIGNvbnN0IHNuaXBwZXRzID0gW2BpZiAoeUMgPCAke29mZnNldHNbMF19KSBzZXRPdXRwdXQoZ2V0VDAoeVIsIHlDKSk7YF07XG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPCBvZmZzZXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBzaGlmdCA9IG9mZnNldHNbaSAtIDFdO1xuICAgICAgc25pcHBldHMucHVzaChcbiAgICAgICAgICBgZWxzZSBpZiAoeUMgPCAke29mZnNldHNbaV19KSBgICtcbiAgICAgICAgICBgc2V0T3V0cHV0KGdldFQke2l9KHlSLCB5Qy0ke3NoaWZ0fSkpO2ApO1xuICAgIH1cbiAgICBjb25zdCBsYXN0SW5kZXggPSBvZmZzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBsYXN0U2hpZnQgPSBvZmZzZXRzW29mZnNldHMubGVuZ3RoIC0gMV07XG4gICAgc25pcHBldHMucHVzaChgZWxzZSBzZXRPdXRwdXQoZ2V0VCR7bGFzdEluZGV4fSh5UiwgeUMtJHtsYXN0U2hpZnR9KSk7YCk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHlSID0gY29vcmRzLng7XG4gICAgICAgIGludCB5QyA9IGNvb3Jkcy55O1xuXG4gICAgICAgICR7c25pcHBldHMuam9pbignXFxuICAgICAgICAnKX1cbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class ConcatPackedProgram {\n    constructor(shapes, axis) {\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = [];\n        this.outputShape = backend_util.computeOutShape(shapes, axis);\n        const shape = this.outputShape;\n        const rank = shape.length;\n        const dtype = getCoordsDataType(rank);\n        const coords = getChannels('coords', rank);\n        const channels = ['x', 'y', 'z', 'w', 'u', 'v'].slice(0, rank);\n        this.variableNames = shapes.map((_, i) => `T${i}`);\n        const offsets = new Array(shapes.length - 1);\n        offsets[0] = shapes[0][axis];\n        for (let i = 1; i < offsets.length; i++) {\n            offsets[i] = offsets[i - 1] + shapes[i][axis];\n        }\n        const channel = channels[axis];\n        const lastChannels = channels.slice(-2);\n        const allChannels = channels.join();\n        let getValueSnippet = `if (${channel} < ${offsets[0]}) {\n        return getChannel(\n            getT0(${allChannels}), vec2(${lastChannels.join()}));\n        }`;\n        for (let i = 1; i < offsets.length; i++) {\n            const shift = offsets[i - 1];\n            // Note: the >= comparison below may seem unnecessary given the check\n            // above but is needed to workaround branch execution issues on some\n            // devices. It makes all the conditions exclusive without relying on\n            // execution order.\n            getValueSnippet += `\n        if (${channel} < ${offsets[i]}  && ${channel} >= ${offsets[i - 1]}) {\n          return getChannel(\n            getT${i}(${shiftedChannels(channels, channel, shift)}),\n            vec2(${shiftedChannels(lastChannels, channel, shift)}));\n        }`;\n        }\n        const lastIndex = offsets.length;\n        const shift = offsets[offsets.length - 1];\n        getValueSnippet += `\n        return getChannel(\n          getT${lastIndex}(${shiftedChannels(channels, channel, shift)}),\n          vec2(${shiftedChannels(lastChannels, channel, shift)}));`;\n        this.userCode = `\n      float getValue(${channels.map(x => 'int ' + x)}) {\n        ${getValueSnippet}\n      }\n\n      void main() {\n        ${dtype} coords = getOutputCoords();\n        vec4 result = vec4(getValue(${coords}), 0., 0., 0.);\n\n        ${coords[rank - 1]} = ${coords[rank - 1]} + 1;\n        if (${coords[rank - 1]} < ${shape[rank - 1]}) {\n          result.g = getValue(${coords});\n        }\n\n        ${coords[rank - 2]} = ${coords[rank - 2]} + 1;\n        if (${coords[rank - 2]} < ${shape[rank - 2]}) {\n          result.a = getValue(${coords});\n        }\n\n        ${coords[rank - 1]} = ${coords[rank - 1]} - 1;\n        if (${coords[rank - 2]} < ${shape[rank - 2]} &&\n            ${coords[rank - 1]} < ${shape[rank - 1]}) {\n          result.b = getValue(${coords});\n        }\n        setOutput(result);\n      }\n    `;\n    }\n}\n/**\n * Return an expression for coordinates into a vector where a given channel\n * will be offset by [shift].\n *\n * @param channels the channels to consider\n * @param channel the channel we want shifted\n * @param shift  the amount to subtract from the channel.\n *\n * @returns a string of the form 'x, y-[shift], z' where any one channel can\n * have the shift applied.\n */\nfunction shiftedChannels(channels, channel, shift) {\n    const channelIdx = channels.indexOf(channel);\n    const res = channels.map((c, idx) => {\n        if (idx === channelIdx) {\n            return `${c} - ${shift}`;\n        }\n        else {\n            return c;\n        }\n    });\n    return res.join();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uY2F0X3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NvbmNhdF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUduRCxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLG1CQUFtQjtJQU85QixZQUFZLE1BQWtCLEVBQUUsSUFBWTtRQUw1QyxpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUl6QixJQUFJLENBQUMsV0FBVyxHQUFHLFlBQVksQ0FBQyxlQUFlLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDL0IsTUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMxQixNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxhQUFhLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxD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Q0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Y0FDckMsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztnQ0FDbkIsTUFBTTs7OztLQUlqQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQ7Ozs7Ozs7Ozs7R0FVRztBQUNILFNBQVMsZUFBZSxDQUFDLFFBQWtCLEVBQUUsT0FBZSxFQUFFLEtBQWE7SUFDekUsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QyxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO1FBQ2xDLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRTtZQUN0QixPQUFPLEdBQUcsQ0FBQyxNQUFNLEtBQUssRUFBRSxDQUFDO1NBQzFCO2FBQU07WUFDTCxPQUFPLENBQUMsQ0FBQztTQUNWO0lBQ0gsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge2dldENoYW5uZWxzfSBmcm9tICcuL3BhY2tpbmdfdXRpbCc7XG5pbXBvcnQge2dldENvb3Jkc0RhdGFUeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBDb25jYXRQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lczogc3RyaW5nW107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHNoYXBlczogbnVtYmVyW11bXSwgYXhpczogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoc2hhcGVzLCBheGlzKTtcbiAgICBjb25zdCBzaGFwZSA9IHRoaXMub3V0cHV0U2hhcGU7XG4gICAgY29uc3QgcmFuayA9IHNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuICAgIGNvbnN0IGNvb3JkcyA9IGdldENoYW5uZWxzKCdjb29yZHMnLCByYW5rKTtcbiAgICBjb25zdCBjaGFubmVscyA9IFsneCcsICd5JywgJ3onLCAndycsICd1JywgJ3YnXS5zbGljZSgwLCByYW5rKTtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBzaGFwZXMubWFwKChfLCBpKSA9PiBgVCR7aX1gKTtcblxuICAgIGNvbnN0IG9mZnNldHM6IG51bWJlcltdID0gbmV3IEFycmF5KHNoYXBlcy5sZW5ndGggLSAxKTtcbiAgICBvZmZzZXRzWzBdID0gc2hhcGVzWzBdW2F4aXNdO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2Zmc2V0c1tpXSA9IG9mZnNldHNbaSAtIDFdICsgc2hhcGVzW2ldW2F4aXNdO1xuICAgIH1cblxuICAgIGNvbnN0IGNoYW5uZWwgPSBjaGFubmVsc1theGlzXTtcbiAgICBjb25zdCBsYXN0Q2hhbm5lbHMgPSBjaGFubmVscy5zbGljZSgtMik7XG4gICAgY29uc3QgYWxsQ2hhbm5lbHMgPSBjaGFubmVscy5qb2luKCk7XG5cbiAgICBsZXQgZ2V0VmFsdWVTbmlwcGV0ID0gYGlmICgke2NoYW5uZWx9IDwgJHtvZmZzZXRzWzBdfSkge1xuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgIGdldFQwKCR7YWxsQ2hhbm5lbHN9KSwgdmVjMigke2xhc3RDaGFubmVscy5qb2luKCl9KSk7XG4gICAgICAgIH1gO1xuICAgIGZvciAobGV0IGkgPSAxOyBpIDwgb2Zmc2V0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3Qgc2hpZnQgPSBvZmZzZXRzW2kgLSAxXTtcbiAgICAgIC8vIE5vdGU6IHRoZSA+PSBjb21wYXJpc29uIGJlbG93IG1heSBzZWVtIHVubmVjZXNzYXJ5IGdpdmVuIHRoZSBjaGVja1xuICAgICAgLy8gYWJvdmUgYnV0IGlzIG5lZWRlZCB0byB3b3JrYXJvdW5kIGJyYW5jaCBleGVjdXRpb24gaXNzdWVzIG9uIHNvbWVcbiAgICAgIC8vIGRldmljZXMuIEl0IG1ha2VzIGFsbCB0aGUgY29uZGl0aW9ucyBleGNsdXNpdmUgd2l0aG91dCByZWx5aW5nIG9uXG4gICAgICAvLyBleGVjdXRpb24gb3JkZXIuXG4gICAgICBnZXRWYWx1ZVNuaXBwZXQgKz0gYFxuICAgICAgICBpZiAoJHtjaGFubmVsfSA8ICR7b2Zmc2V0c1tpXX0gICYmICR7Y2hhbm5lbH0gPj0gJHtvZmZzZXRzW2kgLSAxXX0pIHtcbiAgICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgIGdldFQke2l9KCR7c2hpZnRlZENoYW5uZWxzKGNoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSxcbiAgICAgICAgICAgIHZlYzIoJHtzaGlmdGVkQ2hhbm5lbHMobGFzdENoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSk7XG4gICAgICAgIH1gO1xuICAgIH1cbiAgICBjb25zdCBsYXN0SW5kZXggPSBvZmZzZXRzLmxlbmd0aDtcbiAgICBjb25zdCBzaGlmdCA9IG9mZnNldHNbb2Zmc2V0cy5sZW5ndGggLSAxXTtcbiAgICBnZXRWYWx1ZVNuaXBwZXQgKz0gYFxuICAgICAgICByZXR1cm4gZ2V0Q2hhbm5lbChcbiAgICAgICAgICBnZXRUJHtsYXN0SW5kZXh9KCR7c2hpZnRlZENoYW5uZWxzKGNoYW5uZWxzLCBjaGFubmVsLCBzaGlmdCl9KSxcbiAgICAgICAgICB2ZWMyKCR7c2hpZnRlZENoYW5uZWxzKGxhc3RDaGFubmVscywgY2hhbm5lbCwgc2hpZnQpfSkpO2A7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgZmxvYXQgZ2V0VmFsdWUoJHtjaGFubmVscy5tYXAoeCA9PiAnaW50ICcgKyB4KX0pIHtcbiAgICAgICAgJHtnZXRWYWx1ZVNuaXBwZXR9XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNChnZXRWYWx1ZSgke2Nvb3Jkc30pLCAwLiwgMC4sIDAuKTtcblxuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ID0gJHtjb29yZHNbcmFuayAtIDFdfSArIDE7XG4gICAgICAgIGlmICgke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHtzaGFwZVtyYW5rIC0gMV19KSB7XG4gICAgICAgICAgcmVzdWx0LmcgPSBnZXRWYWx1ZSgke2Nvb3Jkc30pO1xuICAgICAgICB9XG5cbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDJdfSA9ICR7Y29vcmRzW3JhbmsgLSAyXX0gKyAxO1xuICAgICAgICBpZiAoJHtjb29yZHNbcmFuayAtIDJdfSA8ICR7c2hhcGVbcmFuayAtIDJdfSkge1xuICAgICAgICAgIHJlc3VsdC5hID0gZ2V0VmFsdWUoJHtjb29yZHN9KTtcbiAgICAgICAgfVxuXG4gICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gPSAke2Nvb3Jkc1tyYW5rIC0gMV19IC0gMTtcbiAgICAgICAgaWYgKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3NoYXBlW3JhbmsgLSAyXX0gJiZcbiAgICAgICAgICAgICR7Y29vcmRzW3JhbmsgLSAxXX0gPCAke3NoYXBlW3JhbmsgLSAxXX0pIHtcbiAgICAgICAgICByZXN1bHQuYiA9IGdldFZhbHVlKCR7Y29vcmRzfSk7XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybiBhbiBleHByZXNzaW9uIGZvciBjb29yZGluYXRlcyBpbnRvIGEgdmVjdG9yIHdoZXJlIGEgZ2l2ZW4gY2hhbm5lbFxuICogd2lsbCBiZSBvZmZzZXQgYnkgW3NoaWZ0XS5cbiAqXG4gKiBAcGFyYW0gY2hhbm5lbHMgdGhlIGNoYW5uZWxzIHRvIGNvbnNpZGVyXG4gKiBAcGFyYW0gY2hhbm5lbCB0aGUgY2hhbm5lbCB3ZSB3YW50IHNoaWZ0ZWRcbiAqIEBwYXJhbSBzaGlmdCAgdGhlIGFtb3VudCB0byBzdWJ0cmFjdCBmcm9tIHRoZSBjaGFubmVsLlxuICpcbiAqIEByZXR1cm5zIGEgc3RyaW5nIG9mIHRoZSBmb3JtICd4LCB5LVtzaGlmdF0sIHonIHdoZXJlIGFueSBvbmUgY2hhbm5lbCBjYW5cbiAqIGhhdmUgdGhlIHNoaWZ0IGFwcGxpZWQuXG4gKi9cbmZ1bmN0aW9uIHNoaWZ0ZWRDaGFubmVscyhjaGFubmVsczogc3RyaW5nW10sIGNoYW5uZWw6IHN0cmluZywgc2hpZnQ6IG51bWJlcikge1xuICBjb25zdCBjaGFubmVsSWR4ID0gY2hhbm5lbHMuaW5kZXhPZihjaGFubmVsKTtcbiAgY29uc3QgcmVzID0gY2hhbm5lbHMubWFwKChjLCBpZHgpID0+IHtcbiAgICBpZiAoaWR4ID09PSBjaGFubmVsSWR4KSB7XG4gICAgICByZXR1cm4gYCR7Y30gLSAke3NoaWZ0fWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiByZXMuam9pbigpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Imag } from '@tensorflow/tfjs-core';\nimport { identity } from './Identity';\nexport function imag(args) {\n    const { inputs, backend } = args;\n    const { input } = inputs;\n    const inputData = backend.texData.get(input.dataId);\n    return identity({ inputs: { x: inputData.complexTensorInfos.imag }, backend });\n}\nexport const imagConfig = {\n    kernelName: Imag,\n    backendName: 'webgl',\n    kernelFunc: imag\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW1hZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9JbWFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQW1ELE1BQU0sdUJBQXVCLENBQUM7QUFHN0YsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXFEO0lBRXhFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRXBELE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0FBQzdFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0ltYWcsIEltYWdJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7aWRlbnRpdHl9IGZyb20gJy4vSWRlbnRpdHknO1xuXG5leHBvcnQgZnVuY3Rpb24gaW1hZyhhcmdzOiB7aW5wdXRzOiBJbWFnSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0fSA9IGlucHV0cztcbiAgY29uc3QgaW5wdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChpbnB1dC5kYXRhSWQpO1xuXG4gIHJldHVybiBpZGVudGl0eSh7aW5wdXRzOiB7eDogaW5wdXREYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5pbWFnfSwgYmFja2VuZH0pO1xufVxuXG5leHBvcnQgY29uc3QgaW1hZ0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJbWFnLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaW1hZyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, util } from '@tensorflow/tfjs-core';\nimport { ConcatProgram } from '../concat_gpu';\nimport { ConcatPackedProgram } from '../concat_packed_gpu';\nimport { concatImplCPU } from '../kernel_utils/shared';\nimport { complex } from './Complex';\nimport { imag } from './Imag';\nimport { real } from './Real';\nimport { reshape } from './Reshape';\nexport function concatImpl(inputs, axis, backend) {\n    const dtype = inputs[0].dtype;\n    if (dtype === 'complex64') {\n        const reals = inputs.map((t) => real({ inputs: { input: t }, backend }));\n        const imags = inputs.map((t) => imag({ inputs: { input: t }, backend }));\n        const realConcated = concatImpl(reals, axis, backend);\n        const imagConcated = concatImpl(imags, axis, backend);\n        const result = complex({ inputs: { real: realConcated, imag: imagConcated }, backend });\n        reals.forEach(r => backend.disposeIntermediateTensorInfo(r));\n        imags.forEach(i => backend.disposeIntermediateTensorInfo(i));\n        backend.disposeIntermediateTensorInfo(realConcated);\n        backend.disposeIntermediateTensorInfo(imagConcated);\n        return result;\n    }\n    let runOnCpu = backend.shouldExecuteOnCPU(inputs);\n    // Run on cpu if dtype is string. For string, the backend represents it\n    // as Uint8Array[], where each Uint8Array is a character. Given that the\n    // computation is only on the outer array, uploading the whole data onto\n    // gpu is wasteful. Also, currently webgl doesn't have a design to\n    // upload and retrieve Uint8Array[] between cpu and gpu. Therefore, we\n    // just run the kernel on cpu if dtype is string.\n    if (dtype === 'string') {\n        runOnCpu = true;\n    }\n    if (runOnCpu) {\n        // Any concat of n-dimensional tensors across any axis can be reduced to\n        // a concatenation of two-dimensional tensors across the axis 1 by first\n        // partitioning the axes of the original tensors into those less than the\n        // axis to be concatenated and the rest. Then reshape the tensors\n        // into a two-dimensional tensor by collapsing these two sets of axes and\n        // concatenate the resulting matrices across the axis 1, finally reshaping\n        // the result to have the proper shape.\n        const tensors2D = inputs.map(t => {\n            const innerSize = util.sizeFromShape(t.shape.slice(axis));\n            const shape = [-1, innerSize];\n            return reshape({ inputs: { x: t }, backend, attrs: { shape } });\n        });\n        const inputsValShapes = tensors2D.map(t => {\n            return { vals: backend.readSync(t.dataId), shape: t.shape };\n        });\n        // Concats 2d tensors along axis=1.\n        const outShape = backend_util.computeOutShape(tensors2D.map(t => t.shape), 1 /* axis */);\n        const simplyConcat = tensors2D[0].shape[0] === 1;\n        const outVals = concatImplCPU(inputsValShapes, outShape, dtype, simplyConcat);\n        const finalOutShape = backend_util.computeOutShape(inputs.map(t => t.shape), axis);\n        const outInfo = backend.makeTensorInfo(finalOutShape, dtype, outVals);\n        tensors2D.forEach(t => backend.disposeIntermediateTensorInfo(t));\n        return outInfo;\n    }\n    const maxTexturesInShader = env().getNumber('WEBGL_MAX_TEXTURES_IN_SHADER');\n    if (inputs.length > maxTexturesInShader) {\n        const reducedInputs = [];\n        for (let i = 0; i < inputs.length; i += maxTexturesInShader) {\n            const subArray = inputs.slice(i, i + maxTexturesInShader);\n            reducedInputs.push(concatImpl(subArray, axis, backend));\n        }\n        const result = concatImpl(reducedInputs, axis, backend);\n        for (const i of reducedInputs) {\n            backend.disposeIntermediateTensorInfo(i);\n        }\n        return result;\n    }\n    if (env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') &&\n        inputs[0].shape.length > 1) {\n        const program = new ConcatPackedProgram(inputs.map(t => t.shape), axis);\n        return backend.runWebGLProgram(program, inputs, dtype);\n    }\n    const { tensors2D, outShape } = computeTensors2D(inputs, axis, backend);\n    const program = new ConcatProgram(tensors2D.map(t => t.shape));\n    const result = backend.runWebGLProgram(program, tensors2D, dtype);\n    tensors2D.forEach(r => backend.disposeIntermediateTensorInfo(r));\n    const reshapedResult = reshape({ inputs: { x: result }, attrs: { shape: outShape }, backend });\n    backend.disposeIntermediateTensorInfo(result);\n    return reshapedResult;\n}\nfunction computeTensors2D(inputs, axis, backend) {\n    // Any concat of n-dimensional tensors across any axis can be reduced to\n    // a concatenation of two-dimensional tensors across the axis 1 by first\n    // partitioning the axes of the original tensors into those less than the\n    // axis to be concatenated and the rest. Then reshape the tensors\n    // into a two-dimensional tensor by collapsing these two sets of axes and\n    // concatenate the resulting matrices across the axis 1, finally reshaping\n    // the result to have the proper shape.\n    const outShape = backend_util.computeOutShape(inputs.map(t => t.shape), axis);\n    const tensors2D = inputs.map(x => reshape({\n        inputs: { x },\n        attrs: { shape: [-1, util.sizeFromShape(x.shape.slice(axis))] },\n        backend\n    }));\n    return { tensors2D, outShape };\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ29uY2F0X2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBZ0IsR0FBRyxFQUFjLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3hGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDNUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXJELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFVBQVUsQ0FDdEIsTUFBb0IsRUFBRSxJQUFZLEVBQUUsT0FBeUI7SUFDL0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUM5QixJQUFJLEtBQUssS0FBSyxXQUFXLEVBQUU7UUFDekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUMsQ0FBQztRQUNyRSxNQUFNLEtBQUssR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXJFLE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sWUFBWSxHQUFHLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXRELE1BQU0sTUFBTSxHQUNSLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFFekUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzdELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUM3RCxPQUFPLENBQUMsNkJBQTZCLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDcEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXBELE9BQU8sTUFBTSxDQUFDO0tBQ2Y7SUFFRCxJQUFJLFFBQVEsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsTUFBTSxDQUFDLENBQUM7SUFFbEQsdUVBQXVFO0lBQ3ZFLHdFQUF3RTtJQUN4RSx3RUFBd0U7SUFDeEUsa0VBQWtFO0lBQ2xFLHNFQUFzRTtJQUN0RSxpREFBaUQ7SUFDakQsSUFBSSxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQ3RCLFFBQVEsR0FBRyxJQUFJLENBQUM7S0FDakI7SUFFRCxJQUFJLFFBQVEsRUFBRTtRQUNaLHdFQUF3RTtRQUN4RSx3RUFBd0U7UUFDeEUseUVBQXlFO1FBQ3pFLGlFQUFpRTtRQUNqRSx5RUFBeUU7UUFDekUsMEVBQTBFO1FBQzFFLHVDQUF1QztRQUN2QyxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9CLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUMxRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLE9BQU8sT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDNUQsQ0FBQyxDQUFDLENBQUM7UUFFSCxNQUFNLGVBQWUsR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hDLE9BQU8sRUFBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsQ0FBQztRQUM1RCxDQUFDLENBQUMsQ0FBQztRQUVILG1DQUFtQztRQUNuQyxNQUFNLFFBQVEsR0FDVixZQUFZLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ2pELE1BQU0sT0FBTyxHQUNULGFBQWEsQ0FBQyxlQUFlLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUVsRSxNQUFNLGFBQWEsR0FDZixZQUFZLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFakUsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxhQUFhLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRXRFLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVqRSxPQUFPLE9BQU8sQ0FBQztLQUNoQjtJQUVELE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLDhCQUE4QixDQUFDLENBQUM7SUFDNUUsSUFBSSxNQUFNLENBQUMsTUFBTSxHQUFHLG1CQUFtQixFQUFFO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLEVBQUUsQ0FBQztRQUN6QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQUksbUJBQW1CLEVBQUU7WUFDM0QsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUM7WUFDMUQsYUFBYSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO1NBQ3pEO1FBQ0QsTUFBTSxNQUFNLEdBQUcsVUFBVSxDQUFDLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEQsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUU7WUFDN0IsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzFDO1FBRUQsT0FBTyxNQUFNLENBQUM7S0FDZjtJQUVELElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDO1FBQzVDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUM5QixNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFtQixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDeEUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7S0FDeEQ7SUFFRCxNQUFNLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxHQUFHLGdCQUFnQixDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdEUsTUFBTSxPQUFPLEdBQ1QsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxLQUF5QixDQUFDLENBQUMsQ0FBQztJQUN2RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sY0FBYyxHQUNoQixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFDdEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRTlDLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxTQUFTLGdCQUFnQixDQUNyQixNQUFvQixFQUFFLElBQVksRUFBRSxPQUF5QjtJQUMvRCx3RUFBd0U7SUFDeEUsd0VBQXdFO0lBQ3hFLHlFQUF5RTtJQUN6RSxpRUFBaUU7SUFDakUseUVBQXlFO0lBQ3pFLDBFQUEwRTtJQUMxRSx1Q0FBdUM7SUFDdkMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzlFLE1BQU0sU0FBUyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQ3hCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDO1FBQ1gsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDO1FBQ1gsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUM7UUFDN0QsT0FBTztLQUNSLENBQUMsQ0FBQyxDQUFDO0lBRVIsT0FBTyxFQUFDLFNBQVMsRUFBRSxRQUFRLEVBQUMsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29uY2F0SW5wdXRzLCBlbnYsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbmNhdFByb2dyYW19IGZyb20gJy4uL2NvbmNhdF9ncHUnO1xuaW1wb3J0IHtDb25jYXRQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9jb25jYXRfcGFja2VkX2dwdSc7XG5pbXBvcnQge2NvbmNhdEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXRJbXBsKFxuICAgIGlucHV0czogQ29uY2F0SW5wdXRzLCBheGlzOiBudW1iZXIsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG4gIGlmIChkdHlwZSA9PT0gJ2NvbXBsZXg2NCcpIHtcbiAgICBjb25zdCByZWFscyA9IGlucHV0cy5tYXAoKHQpID0+IHJlYWwoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcbiAgICBjb25zdCBpbWFncyA9IGlucHV0cy5tYXAoKHQpID0+IGltYWcoe2lucHV0czoge2lucHV0OiB0fSwgYmFja2VuZH0pKTtcblxuICAgIGNvbnN0IHJlYWxDb25jYXRlZCA9IGNvbmNhdEltcGwocmVhbHMsIGF4aXMsIGJhY2tlbmQpO1xuICAgIGNvbnN0IGltYWdDb25jYXRlZCA9IGNvbmNhdEltcGwoaW1hZ3MsIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbENvbmNhdGVkLCBpbWFnOiBpbWFnQ29uY2F0ZWR9LCBiYWNrZW5kfSk7XG5cbiAgICByZWFscy5mb3JFYWNoKHIgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyKSk7XG4gICAgaW1hZ3MuZm9yRWFjaChpID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSkpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbENvbmNhdGVkKTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdDb25jYXRlZCk7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgbGV0IHJ1bk9uQ3B1ID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoaW5wdXRzKTtcblxuICAvLyBSdW4gb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy4gRm9yIHN0cmluZywgdGhlIGJhY2tlbmQgcmVwcmVzZW50cyBpdFxuICAvLyBhcyBVaW50OEFycmF5W10sIHdoZXJlIGVhY2ggVWludDhBcnJheSBpcyBhIGNoYXJhY3Rlci4gR2l2ZW4gdGhhdCB0aGVcbiAgLy8gY29tcHV0YXRpb24gaXMgb25seSBvbiB0aGUgb3V0ZXIgYXJyYXksIHVwbG9hZGluZyB0aGUgd2hvbGUgZGF0YSBvbnRvXG4gIC8vIGdwdSBpcyB3YXN0ZWZ1bC4gQWxzbywgY3VycmVudGx5IHdlYmdsIGRvZXNuJ3QgaGF2ZSBhIGRlc2lnbiB0b1xuICAvLyB1cGxvYWQgYW5kIHJldHJpZXZlIFVpbnQ4QXJyYXlbXSBiZXR3ZWVuIGNwdSBhbmQgZ3B1LiBUaGVyZWZvcmUsIHdlXG4gIC8vIGp1c3QgcnVuIHRoZSBrZXJuZWwgb24gY3B1IGlmIGR0eXBlIGlzIHN0cmluZy5cbiAgaWYgKGR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHJ1bk9uQ3B1ID0gdHJ1ZTtcbiAgfVxuXG4gIGlmIChydW5PbkNwdSkge1xuICAgIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAgIC8vIGEgY29uY2F0ZW5hdGlvbiBvZiB0d28tZGltZW5zaW9uYWwgdGVuc29ycyBhY3Jvc3MgdGhlIGF4aXMgMSBieSBmaXJzdFxuICAgIC8vIHBhcnRpdGlvbmluZyB0aGUgYXhlcyBvZiB0aGUgb3JpZ2luYWwgdGVuc29ycyBpbnRvIHRob3NlIGxlc3MgdGhhbiB0aGVcbiAgICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAgIC8vIGludG8gYSB0d28tZGltZW5zaW9uYWwgdGVuc29yIGJ5IGNvbGxhcHNpbmcgdGhlc2UgdHdvIHNldHMgb2YgYXhlcyBhbmRcbiAgICAvLyBjb25jYXRlbmF0ZSB0aGUgcmVzdWx0aW5nIG1hdHJpY2VzIGFjcm9zcyB0aGUgYXhpcyAxLCBmaW5hbGx5IHJlc2hhcGluZ1xuICAgIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICAgIGNvbnN0IHRlbnNvcnMyRCA9IGlucHV0cy5tYXAodCA9PiB7XG4gICAgICBjb25zdCBpbm5lclNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUodC5zaGFwZS5zbGljZShheGlzKSk7XG4gICAgICBjb25zdCBzaGFwZSA9IFstMSwgaW5uZXJTaXplXTtcbiAgICAgIHJldHVybiByZXNoYXBlKHtpbnB1dHM6IHt4OiB0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZX19KTtcbiAgICB9KTtcblxuICAgIGNvbnN0IGlucHV0c1ZhbFNoYXBlcyA9IHRlbnNvcnMyRC5tYXAodCA9PiB7XG4gICAgICByZXR1cm4ge3ZhbHM6IGJhY2tlbmQucmVhZFN5bmModC5kYXRhSWQpLCBzaGFwZTogdC5zaGFwZX07XG4gICAgfSk7XG5cbiAgICAvLyBDb25jYXRzIDJkIHRlbnNvcnMgYWxvbmcgYXhpcz0xLlxuICAgIGNvbnN0IG91dFNoYXBlID1cbiAgICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRTaGFwZSh0ZW5zb3JzMkQubWFwKHQgPT4gdC5zaGFwZSksIDEgLyogYXhpcyAqLyk7XG4gICAgY29uc3Qgc2ltcGx5Q29uY2F0ID0gdGVuc29yczJEWzBdLnNoYXBlWzBdID09PSAxO1xuICAgIGNvbnN0IG91dFZhbHMgPVxuICAgICAgICBjb25jYXRJbXBsQ1BVKGlucHV0c1ZhbFNoYXBlcywgb3V0U2hhcGUsIGR0eXBlLCBzaW1wbHlDb25jYXQpO1xuXG4gICAgY29uc3QgZmluYWxPdXRTaGFwZSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcblxuICAgIGNvbnN0IG91dEluZm8gPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGZpbmFsT3V0U2hhcGUsIGR0eXBlLCBvdXRWYWxzKTtcblxuICAgIHRlbnNvcnMyRC5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgICByZXR1cm4gb3V0SW5mbztcbiAgfVxuXG4gIGNvbnN0IG1heFRleHR1cmVzSW5TaGFkZXIgPSBlbnYoKS5nZXROdW1iZXIoJ1dFQkdMX01BWF9URVhUVVJFU19JTl9TSEFERVInKTtcbiAgaWYgKGlucHV0cy5sZW5ndGggPiBtYXhUZXh0dXJlc0luU2hhZGVyKSB7XG4gICAgY29uc3QgcmVkdWNlZElucHV0cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5wdXRzLmxlbmd0aDsgaSArPSBtYXhUZXh0dXJlc0luU2hhZGVyKSB7XG4gICAgICBjb25zdCBzdWJBcnJheSA9IGlucHV0cy5zbGljZShpLCBpICsgbWF4VGV4dHVyZXNJblNoYWRlcik7XG4gICAgICByZWR1Y2VkSW5wdXRzLnB1c2goY29uY2F0SW1wbChzdWJBcnJheSwgYXhpcywgYmFja2VuZCkpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBjb25jYXRJbXBsKHJlZHVjZWRJbnB1dHMsIGF4aXMsIGJhY2tlbmQpO1xuXG4gICAgZm9yIChjb25zdCBpIG9mIHJlZHVjZWRJbnB1dHMpIHtcbiAgICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0FSUkFZX09QRVJBVElPTlMnKSAmJlxuICAgICAgaW5wdXRzWzBdLnNoYXBlLmxlbmd0aCA+IDEpIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbmNhdFBhY2tlZFByb2dyYW0oaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCBkdHlwZSk7XG4gIH1cblxuICBjb25zdCB7dGVuc29yczJELCBvdXRTaGFwZX0gPSBjb21wdXRlVGVuc29yczJEKGlucHV0cywgYXhpcywgYmFja2VuZCk7XG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IENvbmNhdFByb2dyYW0odGVuc29yczJELm1hcCh0ID0+IHQuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyXSkpO1xuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCB0ZW5zb3JzMkQsIGR0eXBlKTtcblxuICB0ZW5zb3JzMkQuZm9yRWFjaChyID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocikpO1xuICBjb25zdCByZXNoYXBlZFJlc3VsdCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX0sIGJhY2tlbmR9KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuXG4gIHJldHVybiByZXNoYXBlZFJlc3VsdDtcbn1cblxuZnVuY3Rpb24gY29tcHV0ZVRlbnNvcnMyRChcbiAgICBpbnB1dHM6IENvbmNhdElucHV0cywgYXhpczogbnVtYmVyLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKSB7XG4gIC8vIEFueSBjb25jYXQgb2Ygbi1kaW1lbnNpb25hbCB0ZW5zb3JzIGFjcm9zcyBhbnkgYXhpcyBjYW4gYmUgcmVkdWNlZCB0b1xuICAvLyBhIGNvbmNhdGVuYXRpb24gb2YgdHdvLWRpbWVuc2lvbmFsIHRlbnNvcnMgYWNyb3NzIHRoZSBheGlzIDEgYnkgZmlyc3RcbiAgLy8gcGFydGl0aW9uaW5nIHRoZSBheGVzIG9mIHRoZSBvcmlnaW5hbCB0ZW5zb3JzIGludG8gdGhvc2UgbGVzcyB0aGFuIHRoZVxuICAvLyBheGlzIHRvIGJlIGNvbmNhdGVuYXRlZCBhbmQgdGhlIHJlc3QuIFRoZW4gcmVzaGFwZSB0aGUgdGVuc29yc1xuICAvLyBpbnRvIGEgdHdvLWRpbWVuc2lvbmFsIHRlbnNvciBieSBjb2xsYXBzaW5nIHRoZXNlIHR3byBzZXRzIG9mIGF4ZXMgYW5kXG4gIC8vIGNvbmNhdGVuYXRlIHRoZSByZXN1bHRpbmcgbWF0cmljZXMgYWNyb3NzIHRoZSBheGlzIDEsIGZpbmFsbHkgcmVzaGFwaW5nXG4gIC8vIHRoZSByZXN1bHQgdG8gaGF2ZSB0aGUgcHJvcGVyIHNoYXBlLlxuICBjb25zdCBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0U2hhcGUoaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpLCBheGlzKTtcbiAgY29uc3QgdGVuc29yczJEID0gaW5wdXRzLm1hcChcbiAgICAgIHggPT4gcmVzaGFwZSh7XG4gICAgICAgIGlucHV0czoge3h9LFxuICAgICAgICBhdHRyczoge3NoYXBlOiBbLTEsIHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlLnNsaWNlKGF4aXMpKV19LFxuICAgICAgICBiYWNrZW5kXG4gICAgICB9KSk7XG5cbiAgcmV0dXJuIHt0ZW5zb3JzMkQsIG91dFNoYXBlfTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Concat, util } from '@tensorflow/tfjs-core';\nimport { concatImpl } from './Concat_impl';\nimport { identity } from './Identity';\nexport function concat(args) {\n    const { inputs, backend, attrs } = args;\n    const { axis } = attrs;\n    const $axis = util.parseAxisParam(axis, inputs[0].shape)[0];\n    const shapes = inputs.map(t => t.shape);\n    backend_util.assertParamsConsistent(shapes, $axis);\n    const outShape = backend_util.computeOutShape(inputs.map(t => t.shape), $axis);\n    if (util.sizeFromShape(outShape) === 0) {\n        return backend.makeTensorInfo(outShape, inputs[0].dtype, []);\n    }\n    // Keep only non-empty tensors (ignore tensors with 0 in their shape).\n    const $inputs = inputs.filter(t => util.sizeFromShape(t.shape) > 0);\n    if ($inputs.length === 1) {\n        return identity({ inputs: { x: $inputs[0] }, backend });\n    }\n    return concatImpl($inputs, $axis, backend);\n}\nexport const concatConfig = {\n    kernelName: Concat,\n    backendName: 'webgl',\n    kernelFunc: concat\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29uY2F0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0NvbmNhdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBbUUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbEksT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRXBDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUU1RCxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3hDLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFbkQsTUFBTSxRQUFRLEdBQ1YsWUFBWSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRWxFLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDdEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFFBQVEsRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0tBQzlEO0lBRUQsc0VBQXNFO0lBQ3RFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUNwRSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hCLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDckQ7SUFFRCxPQUFPLFVBQVUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQzdDLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29uY2F0LCBDb25jYXRBdHRycywgQ29uY2F0SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2NvbmNhdEltcGx9IGZyb20gJy4vQ29uY2F0X2ltcGwnO1xuaW1wb3J0IHtpZGVudGl0eX0gZnJvbSAnLi9JZGVudGl0eSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb25jYXQoXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogQ29uY2F0SW5wdXRzLCBhdHRyczogQ29uY2F0QXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2F4aXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGF4aXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKGF4aXMsIGlucHV0c1swXS5zaGFwZSlbMF07XG5cbiAgY29uc3Qgc2hhcGVzID0gaW5wdXRzLm1hcCh0ID0+IHQuc2hhcGUpO1xuICBiYWNrZW5kX3V0aWwuYXNzZXJ0UGFyYW1zQ29uc2lzdGVudChzaGFwZXMsICRheGlzKTtcblxuICBjb25zdCBvdXRTaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY29tcHV0ZU91dFNoYXBlKGlucHV0cy5tYXAodCA9PiB0LnNoYXBlKSwgJGF4aXMpO1xuXG4gIGlmICh1dGlsLnNpemVGcm9tU2hhcGUob3V0U2hhcGUpID09PSAwKSB7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIGlucHV0c1swXS5kdHlwZSwgW10pO1xuICB9XG5cbiAgLy8gS2VlcCBvbmx5IG5vbi1lbXB0eSB0ZW5zb3JzIChpZ25vcmUgdGVuc29ycyB3aXRoIDAgaW4gdGhlaXIgc2hhcGUpLlxuICBjb25zdCAkaW5wdXRzID0gaW5wdXRzLmZpbHRlcih0ID0+IHV0aWwuc2l6ZUZyb21TaGFwZSh0LnNoYXBlKSA+IDApO1xuICBpZiAoJGlucHV0cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gaWRlbnRpdHkoe2lucHV0czoge3g6ICRpbnB1dHNbMF19LCBiYWNrZW5kfSk7XG4gIH1cblxuICByZXR1cm4gY29uY2F0SW1wbCgkaW5wdXRzLCAkYXhpcywgYmFja2VuZCk7XG59XG5cbmV4cG9ydCBjb25zdCBjb25jYXRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29uY2F0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29uY2F0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class Conv2DProgram {\n    constructor(convInfo, addBias = false, activation = null, hasPreluActivationWeights = false, hasLeakyreluAlpha = false) {\n        this.variableNames = ['x', 'W'];\n        this.outputShape = convInfo.outShape;\n        const padTop = convInfo.padInfo.top;\n        const padLeft = convInfo.padInfo.left;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const dilationHeight = convInfo.dilationHeight;\n        const dilationWidth = convInfo.dilationWidth;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4;\n        const inputDepthVec4Remainder = convInfo.inChannels % 4;\n        const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n        const rowDim = isChannelsLast ? 1 : 2;\n        const colDim = isChannelsLast ? 2 : 3;\n        const channelDim = isChannelsLast ? 3 : 1;\n        let activationSnippet = '', applyActivationSnippet = '';\n        if (activation) {\n            if (hasPreluActivationWeights) {\n                activationSnippet = `float activation(float a) {\n          float b = getPreluActivationWeightsAtOutCoords();\n          ${activation}\n        }`;\n            }\n            else if (hasLeakyreluAlpha) {\n                activationSnippet = `float activation(float a) {\n          float b = getLeakyreluAlphaAtOutCoords();\n          ${activation}\n        }`;\n            }\n            else {\n                activationSnippet = `\n          float activation(float x) {\n            ${activation}\n          }\n        `;\n            }\n            applyActivationSnippet = `result = activation(result);`;\n        }\n        const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n        if (addBias) {\n            this.variableNames.push('bias');\n        }\n        if (hasPreluActivationWeights) {\n            this.variableNames.push('preluActivationWeights');\n        }\n        if (hasLeakyreluAlpha) {\n            this.variableNames.push('leakyreluAlpha');\n        }\n        this.userCode = `\n      ${activationSnippet}\n\n      const ivec2 strides = ivec2(${strideHeight}, ${strideWidth});\n      const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int batch = coords[0];\n        int d2 = coords[${channelDim}];\n\n        ivec2 xRCCorner =\n            ivec2(coords[${rowDim}], coords[${colDim}]) * strides - pads;\n        int xRCorner = xRCCorner.x;\n        int xCCorner = xRCCorner.y;\n\n        // Convolve x(?, ?, d1) with w(:, :, d1, d2) to get y(yR, yC, d2).\n        // ? = to be determined. : = across all values in that axis.\n        float dotProd = 0.0;\n        for (int wR = 0; wR < ${filterHeight}; wR++) {\n          int xR = xRCorner + wR * ${dilationHeight};\n\n          if (xR < 0 || xR >= ${convInfo.inHeight}) {\n            continue;\n          }\n\n          for (int wC = 0; wC < ${filterWidth}; wC++) {\n            int xC = xCCorner + wC * ${dilationWidth};\n\n            if (xC < 0 || xC >= ${convInfo.inWidth}) {\n              continue;\n            }\n\n            for (int d1 = 0; d1 < ${inputDepthNearestVec4}; d1 += 4) {\n              vec4 wValues = vec4(\n                getW(wR, wC, d1, d2),\n                getW(wR, wC, d1 + 1, d2),\n                getW(wR, wC, d1 + 2, d2),\n                getW(wR, wC, d1 + 3, d2)\n              );\n\n              if (${isChannelsLast}) {\n                vec4 xValues = vec4(\n                  getX(batch, xR, xC, d1),\n                  getX(batch, xR, xC, d1 + 1),\n                  getX(batch, xR, xC, d1 + 2),\n                  getX(batch, xR, xC, d1 + 3)\n                );\n                dotProd += dot(xValues, wValues);\n              } else {\n                vec4 xValues = vec4(\n                  getX(batch, d1, xR, xC),\n                  getX(batch, d1 + 1, xR, xC),\n                  getX(batch, d1 + 2, xR, xC),\n                  getX(batch, d1 + 3, xR, xC)\n                );\n                dotProd += dot(xValues, wValues);\n              }\n            }\n\n            if (${inputDepthVec4Remainder === 1}) {\n\n              if (${isChannelsLast}) {\n                dotProd +=\n                    getX(batch, xR, xC, ${inputDepthNearestVec4}) *\n                    getW(wR, wC, ${inputDepthNearestVec4}, d2);\n              } else {\n                dotProd +=\n                    getX(batch, ${inputDepthNearestVec4}, xR, xC) *\n                    getW(wR, wC, ${inputDepthNearestVec4}, d2);\n              }\n\n            } else if (${inputDepthVec4Remainder === 2}) {\n              vec2 wValues = vec2(\n                getW(wR, wC, ${inputDepthNearestVec4}, d2),\n                getW(wR, wC, ${inputDepthNearestVec4} + 1, d2)\n              );\n\n              if (${isChannelsLast}) {\n                vec2 xValues = vec2(\n                  getX(batch, xR, xC, ${inputDepthNearestVec4}),\n                  getX(batch, xR, xC, ${inputDepthNearestVec4} + 1)\n                );\n                dotProd += dot(xValues, wValues);\n              } else {\n                vec2 xValues = vec2(\n                  getX(batch, ${inputDepthNearestVec4}, xR, xC),\n                  getX(batch, ${inputDepthNearestVec4} + 1, xR, xC)\n                );\n                dotProd += dot(xValues, wValues);\n              }\n\n            } else if (${inputDepthVec4Remainder === 3}) {\n              vec3 wValues = vec3(\n                getW(wR, wC, ${inputDepthNearestVec4}, d2),\n                getW(wR, wC, ${inputDepthNearestVec4} + 1, d2),\n                getW(wR, wC, ${inputDepthNearestVec4} + 2, d2)\n              );\n\n              if (${isChannelsLast}) {\n                vec3 xValues = vec3(\n                  getX(batch, xR, xC, ${inputDepthNearestVec4}),\n                  getX(batch, xR, xC, ${inputDepthNearestVec4} + 1),\n                  getX(batch, xR, xC, ${inputDepthNearestVec4} + 2)\n                );\n                dotProd += dot(xValues, wValues);\n              } else {\n                vec3 xValues = vec3(\n                  getX(batch, ${inputDepthNearestVec4}, xR, xC),\n                  getX(batch, ${inputDepthNearestVec4} + 1, xR, xC),\n                  getX(batch, ${inputDepthNearestVec4} + 2, xR, xC)\n                );\n                dotProd += dot(xValues, wValues);\n              }\n\n            }\n          }\n        }\n\n        float result = dotProd;\n        ${addBiasSnippet}\n        ${applyActivationSnippet}\n        setOutput(result);\n      }\n    `;\n    }\n}\nexport class Conv3DProgram {\n    constructor(convInfo) {\n        this.variableNames = ['x', 'W'];\n        this.outputShape = convInfo.outShape;\n        const padFront = convInfo.padInfo.front;\n        const padTop = convInfo.padInfo.top;\n        const padLeft = convInfo.padInfo.left;\n        const strideDepth = convInfo.strideDepth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const dilationDepth = convInfo.dilationDepth;\n        const dilationHeight = convInfo.dilationHeight;\n        const dilationWidth = convInfo.dilationWidth;\n        const filterDepth = convInfo.filterDepth;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const inputDepthNearestVec4 = Math.floor(convInfo.inChannels / 4) * 4;\n        const inputDepthVec4Remainder = convInfo.inChannels % 4;\n        this.userCode = `\n      const ivec3 strides = ivec3(${strideDepth}, ${strideHeight}, ${strideWidth});\n      const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n\n      void main() {\n        ivec5 coords = getOutputCoords();\n        int batch = coords.x;\n        int d2 = coords.u;\n\n        ivec3 xFRCCorner = ivec3(coords.y, coords.z, coords.w) * strides - pads;\n        int xFCorner = xFRCCorner.x;\n        int xRCorner = xFRCCorner.y;\n        int xCCorner = xFRCCorner.z;\n\n        // Convolve x(?, ?, ?, d1) with w(:, :, :, d1, d2) to get\n        // y(yF, yR, yC, d2). ? = to be determined. : = across all\n        // values in that axis.\n        float dotProd = 0.0;\n        for (int wF = 0; wF < ${filterDepth}; wF++) {\n          int xF = xFCorner + wF * ${dilationDepth};\n\n          if (xF < 0 || xF >= ${convInfo.inDepth}) {\n            continue;\n          }\n\n          for (int wR = 0; wR < ${filterHeight}; wR++) {\n            int xR = xRCorner + wR * ${dilationHeight};\n\n            if (xR < 0 || xR >= ${convInfo.inHeight}) {\n              continue;\n            }\n\n            for (int wC = 0; wC < ${filterWidth}; wC++) {\n              int xC = xCCorner + wC * ${dilationWidth};\n\n              if (xC < 0 || xC >= ${convInfo.inWidth}) {\n                continue;\n              }\n\n              for (int d1 = 0; d1 < ${inputDepthNearestVec4}; d1 += 4) {\n                vec4 xValues = vec4(\n                  getX(batch, xF, xR, xC, d1),\n                  getX(batch, xF, xR, xC, d1 + 1),\n                  getX(batch, xF, xR, xC, d1 + 2),\n                  getX(batch, xF, xR, xC, d1 + 3)\n                );\n                vec4 wValues = vec4(\n                  getW(wF, wR, wC, d1, d2),\n                  getW(wF, wR, wC, d1 + 1, d2),\n                  getW(wF, wR, wC, d1 + 2, d2),\n                  getW(wF, wR, wC, d1 + 3, d2)\n                );\n\n                dotProd += dot(xValues, wValues);\n              }\n\n              if (${inputDepthVec4Remainder === 1}) {\n                dotProd +=\n                  getX(batch, xF, xR, xC, ${inputDepthNearestVec4}) *\n                  getW(wF, wR, wC, ${inputDepthNearestVec4}, d2);\n              } else if (${inputDepthVec4Remainder === 2}) {\n                vec2 xValues = vec2(\n                  getX(batch, xF, xR, xC, ${inputDepthNearestVec4}),\n                  getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 1)\n                );\n                vec2 wValues = vec2(\n                  getW(wF, wR, wC, ${inputDepthNearestVec4}, d2),\n                  getW(wF, wR, wC, ${inputDepthNearestVec4} + 1, d2)\n                );\n                dotProd += dot(xValues, wValues);\n              } else if (${inputDepthVec4Remainder === 3}) {\n                vec3 xValues = vec3(\n                  getX(batch, xF, xR, xC, ${inputDepthNearestVec4}),\n                  getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 1),\n                  getX(batch, xF, xR, xC, ${inputDepthNearestVec4} + 2)\n                );\n                vec3 wValues = vec3(\n                  getW(wF, wR, wC, ${inputDepthNearestVec4}, d2),\n                  getW(wF, wR, wC, ${inputDepthNearestVec4} + 1, d2),\n                  getW(wF, wR, wC, ${inputDepthNearestVec4} + 2, d2)\n                );\n                dotProd += dot(xValues, wValues);\n              }\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NvbnZfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxhQUFhO0lBS3hCLFlBQ0ksUUFBaUMsRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUNsRCxhQUFxQixJQUFJLEVBQUUseUJBQXlCLEdBQUcsS0FBSyxFQUM1RCxpQkFBaUIsR0FBRyxLQUFLO1FBUDdCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFRekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3JDLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3BDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBQ3RDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBRXpDLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0RSxNQUFNLHVCQUF1QixHQUFHLFFBQVEsQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDO1FBQ3hELE1BQU0sY0FBYyxHQUFHLFFBQVEsQ0FBQyxVQUFVLEtB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dUJBQXVCLEtBQUssQ0FBQzs7NENBRVoscUJBQXFCOzRDQUNyQixxQkFBcUI7OztxQ0FHNUIscUJBQXFCO3FDQUNyQixxQkFBcUI7OzsyQkFHL0IsdUJBQXVCLEtBQUssQ0FBQzs7NENBRVoscUJBQXFCOzRDQUNyQixxQkFBcUI7NENBQ3JCLHFCQUFxQjs7O3FDQUc1QixxQkFBcUI7cUNBQ3JCLHFCQUFxQjtxQ0FDckIscUJBQXFCOzs7Ozs7Ozs7S0FTckQsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIENvbnYyRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLCBhZGRCaWFzID0gZmFsc2UsXG4gICAgICBhY3RpdmF0aW9uOiBzdHJpbmcgPSBudWxsLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gZmFsc2UsXG4gICAgICBoYXNMZWFreXJlbHVBbHBoYSA9IGZhbHNlKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcblxuICAgIGNvbnN0IGlucHV0RGVwdGhOZWFyZXN0VmVjNCA9IE1hdGguZmxvb3IoY29udkluZm8uaW5DaGFubmVscyAvIDQpICogNDtcbiAgICBjb25zdCBpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9IGNvbnZJbmZvLmluQ2hhbm5lbHMgJSA0O1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgICBjb25zdCByb3dEaW0gPSBpc0NoYW5uZWxzTGFzdCA/IDEgOiAyO1xuICAgIGNvbnN0IGNvbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMiA6IDM7XG4gICAgY29uc3QgY2hhbm5lbERpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMyA6IDE7XG5cbiAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cykge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGBmbG9hdCBhY3RpdmF0aW9uKGZsb2F0IGEpIHtcbiAgICAgICAgICBmbG9hdCBiID0gZ2V0UHJlbHVBY3RpdmF0aW9uV2VpZ2h0c0F0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH0gZWxzZSBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCBhKSB7XG4gICAgICAgICAgZmxvYXQgYiA9IGdldExlYWt5cmVsdUFscGhhQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgXG4gICAgICAgICAgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCB4KSB7XG4gICAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgICAgfVxuICAgICAgICBgO1xuICAgICAgfVxuXG4gICAgICBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gYHJlc3VsdCA9IGFjdGl2YXRpb24ocmVzdWx0KTtgO1xuICAgIH1cblxuICAgIGNvbnN0IGFkZEJpYXNTbmlwcGV0ID0gYWRkQmlhcyA/ICdyZXN1bHQgKz0gZ2V0Qmlhc0F0T3V0Q29vcmRzKCk7JyA6ICcnO1xuICAgIGlmIChhZGRCaWFzKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgIH1cblxuICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgncHJlbHVBY3RpdmF0aW9uV2VpZ2h0cycpO1xuICAgIH1cblxuICAgIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICR7YWN0aXZhdGlvblNuaXBwZXR9XG5cbiAgICAgIGNvbnN0IGl2ZWMyIHN0cmlkZXMgPSBpdmVjMigke3N0cmlkZUhlaWdodH0sICR7c3RyaWRlV2lkdGh9KTtcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkMiA9IGNvb3Jkc1ske2NoYW5uZWxEaW19XTtcblxuICAgICAgICBpdmVjMiB4UkNDb3JuZXIgPVxuICAgICAgICAgICAgaXZlYzIoY29vcmRzWyR7cm93RGltfV0sIGNvb3Jkc1ske2NvbERpbX1dKSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeFJDb3JuZXIgPSB4UkNDb3JuZXIueDtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgLy8gQ29udm9sdmUgeCg/LCA/LCBkMSkgd2l0aCB3KDosIDosIGQxLCBkMikgdG8gZ2V0IHkoeVIsIHlDLCBkMikuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgaW50IHhSID0geFJDb3JuZXIgKyB3UiAqICR7ZGlsYXRpb25IZWlnaHR9O1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDICogJHtkaWxhdGlvbldpZHRofTtcblxuICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCBkMSA9IDA7IGQxIDwgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9OyBkMSArPSA0KSB7XG4gICAgICAgICAgICAgIHZlYzQgd1ZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsIGQxICsgMSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCBkMSArIDIsIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgZDEgKyAzLCBkMilcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICB2ZWM0IHhWYWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMiksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxICsgMylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzQgeFZhbHVlcyA9IHZlYzQoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCBkMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMiwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIGQxICsgMywgeFIsIHhDKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSkgKlxuICAgICAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIHhSLCB4QykgKlxuICAgICAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMik7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSBlbHNlIGlmICgke2lucHV0RGVwdGhWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgICAgICB2ZWMyIHdWYWx1ZXMgPSB2ZWMyKFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIGQyKSxcbiAgICAgICAgICAgICAgICBnZXRXKHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSwgZDIpXG4gICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgdmVjMiB4VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHZlYzIgeFZhbHVlcyA9IHZlYzIoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0sIHhSLCB4QyksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDN9KSB7XG4gICAgICAgICAgICAgIHZlYzMgd1ZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgIGdldFcod1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgZ2V0Vyh3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIsIGQyKVxuICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgIHZlYzMgeFZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdmVjMyB4VmFsdWVzID0gdmVjMyhcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgeFIsIHhDKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIHhSLCB4QyksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAyLCB4UiwgeEMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IGRvdCh4VmFsdWVzLCB3VmFsdWVzKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gZG90UHJvZDtcbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgJHthcHBseUFjdGl2YXRpb25TbmlwcGV0fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252M0RQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdXJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYzREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG4gICAgY29uc3QgcGFkRnJvbnQgPSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbkRlcHRoID0gY29udkluZm8uZGlsYXRpb25EZXB0aDtcbiAgICBjb25zdCBkaWxhdGlvbkhlaWdodCA9IGNvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0O1xuICAgIGNvbnN0IGRpbGF0aW9uV2lkdGggPSBjb252SW5mby5kaWxhdGlvbldpZHRoO1xuICAgIGNvbnN0IGZpbHRlckRlcHRoID0gY29udkluZm8uZmlsdGVyRGVwdGg7XG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBpbnB1dERlcHRoTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKGNvbnZJbmZvLmluQ2hhbm5lbHMgLyA0KSAqIDQ7XG4gICAgY29uc3QgaW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPSBjb252SW5mby5pbkNoYW5uZWxzICUgNDtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMyBzdHJpZGVzID0gaXZlYzMoJHtzdHJpZGVEZXB0aH0sICR7c3RyaWRlSGVpZ2h0fSwgJHtcbiAgICAgICAgc3RyaWRlV2lkdGh9KTtcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBkMiA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGl2ZWMzIHhGUkNDb3JuZXIgPSBpdmVjMyhjb29yZHMueSwgY29vcmRzLnosIGNvb3Jkcy53KSAqIHN0cmlkZXMgLSBwYWRzO1xuICAgICAgICBpbnQgeEZDb3JuZXIgPSB4RlJDQ29ybmVyLng7XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhGUkNDb3JuZXIueTtcbiAgICAgICAgaW50IHhDQ29ybmVyID0geEZSQ0Nvcm5lci56O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIHgoPywgPywgPywgZDEpIHdpdGggdyg6LCA6LCA6LCBkMSwgZDIpIHRvIGdldFxuICAgICAgICAvLyB5KHlGLCB5UiwgeUMsIGQyKS4gPyA9IHRvIGJlIGRldGVybWluZWQuIDogPSBhY3Jvc3MgYWxsXG4gICAgICAgIC8vIHZhbHVlcyBpbiB0aGF0IGF4aXMuXG4gICAgICAgIGZsb2F0IGRvdFByb2QgPSAwLjA7XG4gICAgICAgIGZvciAoaW50IHdGID0gMDsgd0YgPCAke2ZpbHRlckRlcHRofTsgd0YrKykge1xuICAgICAgICAgIGludCB4RiA9IHhGQ29ybmVyICsgd0YgKiAke2RpbGF0aW9uRGVwdGh9O1xuXG4gICAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSICogJHtkaWxhdGlvbkhlaWdodH07XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB4Q0Nvcm5lciArIHdDICogJHtkaWxhdGlvbldpZHRofTtcblxuICAgICAgICAgICAgICBpZiAoeEMgPCAwIHx8IHhDID49ICR7Y29udkluZm8uaW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGZvciAoaW50IGQxID0gMDsgZDEgPCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH07IGQxICs9IDQpIHtcbiAgICAgICAgICAgICAgICB2ZWM0IHhWYWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgZDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgZDEgKyAxKSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsIGQxICsgMiksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCBkMSArIDMpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB2ZWM0IHdWYWx1ZXMgPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCBkMSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCBkMSArIDEsIGQyKSxcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgZDEgKyAyLCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsIGQxICsgMywgZDIpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0gZG90KHhWYWx1ZXMsIHdWYWx1ZXMpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDF9KSB7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPVxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSAqXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7aW5wdXREZXB0aFZlYzRSZW1haW5kZXIgPT09IDJ9KSB7XG4gICAgICAgICAgICAgICAgdmVjMiB4VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSksXG4gICAgICAgICAgICAgICAgICBnZXRYKGJhdGNoLCB4RiwgeFIsIHhDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdmVjMiB3VmFsdWVzID0gdmVjMihcbiAgICAgICAgICAgICAgICAgIGdldFcod0YsIHdSLCB3QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9LCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEsIGQyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoJHtpbnB1dERlcHRoVmVjNFJlbWFpbmRlciA9PT0gM30pIHtcbiAgICAgICAgICAgICAgICB2ZWMzIHhWYWx1ZXMgPSB2ZWMzKFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9KSxcbiAgICAgICAgICAgICAgICAgIGdldFgoYmF0Y2gsIHhGLCB4UiwgeEMsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDEpLFxuICAgICAgICAgICAgICAgICAgZ2V0WChiYXRjaCwgeEYsIHhSLCB4QywgJHtpbnB1dERlcHRoTmVhcmVzdFZlYzR9ICsgMilcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZlYzMgd1ZhbHVlcyA9IHZlYzMoXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSwgZDIpLFxuICAgICAgICAgICAgICAgICAgZ2V0Vyh3Riwgd1IsIHdDLCAke2lucHV0RGVwdGhOZWFyZXN0VmVjNH0gKyAxLCBkMiksXG4gICAgICAgICAgICAgICAgICBnZXRXKHdGLCB3Uiwgd0MsICR7aW5wdXREZXB0aE5lYXJlc3RWZWM0fSArIDIsIGQyKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZG90UHJvZCArPSBkb3QoeFZhbHVlcywgd1ZhbHVlcyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { useShapeUniforms } from './gpgpu_math';\nexport class Conv2DPackedProgram {\n    constructor(convInfo, addBias = false, activation = null, hasPreluActivation = false, hasLeakyReluAlpha = false) {\n        this.variableNames = ['x', 'W'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.customUniforms = [\n            { name: 'pads', type: 'ivec2' },\n            { name: 'strides', type: 'ivec2' },\n            { name: 'dilations', type: 'ivec2' },\n            { name: 'inDims', type: 'ivec2' },\n        ];\n        this.outputShape = convInfo.outShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        const padLeft = convInfo.padInfo.left;\n        const strideWidth = convInfo.strideWidth;\n        const dilationWidth = convInfo.dilationWidth;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const texelsAcross = filterWidth;\n        let mainLoop = `\n       int xR; int xC; int xCOffset;\n       vec4 wTexel; vec4 previous; vec4 final;`;\n        for (let c = 0; c < filterWidth; c++) {\n            mainLoop += `\n           vec4 xTexelC${c * 2};\n           int xTexelC${c * 2}Ready;\n           vec4 xTexelC${c * 2 + 1};\n           int xTexelC${c * 2 + 1}Ready;\n           vec4 xC${c};`;\n        }\n        /**\n         * This vectorized implementation works by gathering the values needed for\n         * each output channel's dot product into vec4's and then multiplying them\n         * all together (this happens in the final double for-loop below). Most of\n         * the main loop consists of constructing these vec4's with the minimum\n         * number of texture2D calls, which means making use of all four returned\n         * values from a texture2D call at once.\n         */\n        mainLoop += `\n     for (int r = 0; r < ${filterHeight}; r++) {\n      for (int d1 = 0; d1 < ${convInfo.inChannels}; d1 += 2) {\n       `;\n        for (let c = 0; c < filterWidth; c++) {\n            mainLoop += `\n           xTexelC${c * 2} = vec4(0.0);\n           xTexelC${c * 2}Ready = 0;\n           xTexelC${c * 2 + 1} = vec4(0.0);\n           xTexelC${c * 2 + 1}Ready = 0;\n           xC${c} = vec4(0.0);`;\n        }\n        mainLoop += `\n         xR = xRCorner + r * dilations[0];\n         if (xR >=0 && xR < inDims[0]) {\n       `;\n        for (let texelC = 0; texelC < (texelsAcross + 1) / 2; texelC++) {\n            const colIndex = texelC * 2;\n            mainLoop += `\n           xC = xCCorner + ${colIndex * dilationWidth};\n           `;\n            if (strideWidth === 1) {\n                if (colIndex < filterWidth) {\n                    // If padding is odd, the outer texels have to be composed.\n                    if (padLeft % 2 === 1) {\n                        // TODO: Ensure vec4 previous does not result in redundant sample,\n                        // and avoid setting xTexelRC's that exceed the boundary in the\n                        // first place rather than resetting them to vec4(0)).\n                        // To compute xCOffset:\n                        // - If padding is odd, we must add 1 to ensure we ask for an\n                        // even-numbered row.\n                        // - We subtract 2 to access the previous texel.\n                        mainLoop += `\n                 xCOffset = xC + 1;\n                 if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex}Ready == 0) {\n                   xTexelC${colIndex} = getX(batch, xR, xCOffset, d1);\n\n                   // Need to manually clear unused channels in case\n                   // we're reading from recycled texture.\n                   if (xCOffset + 1 >= inDims[1]) {\n                     xTexelC${colIndex}.zw = vec2(0.0);\n                   }\n                   xTexelC${colIndex}Ready = 1;\n                 }\n               `;\n                        // This texel has been read in previous iteration if the dilation\n                        // is 1.\n                        if (dilationWidth === 1 && colIndex > 0) {\n                            mainLoop += `\n                 xC${colIndex} = vec4(xTexelC${colIndex - 2}.zw, xTexelC${colIndex}.xy);\n                 `;\n                        }\n                        else {\n                            mainLoop += `\n                   xCOffset = xC + 1 - 2;\n\n                   if (xCOffset >= 0 && xCOffset < inDims[1]) {\n                     previous = getX(batch, xR, xCOffset, d1);\n\n                     // Need to manually clear unused channels in case\n                     // we're reading from recycled texture.\n                     if (xCOffset + 1 >= inDims[1]) {\n                       previous.zw = vec2(0.0);\n                     }\n\n                     xC${colIndex} = vec4(previous.zw, xTexelC${colIndex}.xy);\n                   } else {\n                     xC${colIndex} = vec4(0.0, 0.0, xTexelC${colIndex}.xy);\n                   }\n                   `;\n                        }\n                    }\n                    else {\n                        // Padding is even, so xRC corresponds to a single texel.\n                        mainLoop += `\n                 if (xC >= 0 && xC < inDims[1] && xTexelC${colIndex}Ready == 0) {\n                   xTexelC${colIndex} = getX(batch, xR, xC, d1);\n                   if (xC + 1 >= inDims[1]) {\n                     xTexelC${colIndex}.zw = vec2(0.0);\n                   }\n                   xTexelC${colIndex}Ready = 1;\n                 }\n\n                 xC${colIndex} = xTexelC${colIndex};\n                 `;\n                    }\n                    if (colIndex + 1 < filterWidth) {\n                        // If dilation is even, the second entry should match the first\n                        // (either both are composed or both are single samples). But if\n                        // dilation is odd, then the second entry should be the opposite\n                        // of the first (if the first is composed, the second is a single\n                        // sample, and vice versa.)\n                        const nextTexelOffset = padLeft % 2 === 0 ?\n                            util.nearestLargerEven(dilationWidth) :\n                            dilationWidth;\n                        if ((dilationWidth % 2 === 0 && padLeft % 2 === 1) ||\n                            (dilationWidth % 2 !== 0 && padLeft % 2 !== 1)) {\n                            mainLoop += `\n                   xCOffset = xC + imod(pads[1], 2) + ${nextTexelOffset};\n\n                   if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n                     xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n\n                     // Need to manually clear unused channels in case\n                     // we're reading from recycled texture.\n                     if (xCOffset + 1 >= inDims[1]) {\n                       xTexelC${colIndex + 1}.zw = vec2(0.0);\n                     }\n                     xTexelC${colIndex + 1}Ready = 1;\n                   }\n                   `;\n                            // If dilation > 1 then the xRC's will not be able to share any\n                            // values, so each xRC will require two unique calls to getX.\n                            if (dilationWidth > 1) {\n                                mainLoop += `\n                     xCOffset -= 2;\n                     if (xCOffset >= 0 && xCOffset < inDims[1]) {\n                      previous = getX(batch, xR, xCOffset, d1);\n                      xC${colIndex + 1} = vec4(previous.zw, xTexelC${colIndex + 1}.xy);\n                     } else {\n                      xC${colIndex + 1} = vec4(0.0, 0.0, xTexelC${colIndex + 1}.xy);\n                     }\n                     `;\n                            }\n                            else {\n                                mainLoop += `\n                     xC${colIndex + 1} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.xy);\n                     `;\n                            }\n                        }\n                        else {\n                            // If dilation is 1 and padding is odd, we have already read the\n                            // texel when constructing the previous x value. Here we can\n                            // simply skip the texture read.\n                            if (nextTexelOffset === 1) {\n                                mainLoop += `\n                     xC${colIndex + 1} = xTexelC${colIndex};\n                     `;\n                            }\n                            else {\n                                mainLoop += `\n                     xCOffset = xC + ${nextTexelOffset};\n\n                     if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n                       xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n                       if (xCOffset + 1 >= inDims[1]) {\n                         xTexelC${colIndex + 1}.zw = vec2(0.0);\n                       }\n                       xTexelC${colIndex + 1}Ready = 1;\n                     }\n\n                     xC${colIndex + 1} = xTexelC${colIndex + 1};\n                     `;\n                            }\n                        }\n                    }\n                }\n            }\n            else { // stride === 2\n                if (colIndex < filterWidth) {\n                    // Depending on whether padLeft is even or odd, we want either the\n                    // xy or zw channels from X texels for xC${colIndex}. If padLeft is\n                    // even, xC${colIndex +1} is simply the zw channels of texels we've\n                    // already sampled. But if padLeft is odd, xC{$c + 1}.zw will\n                    // need to come from the xy channels of a new texel, hence the `\n                    // vec4\n                    // final` initialized below.\n                    if (padLeft % 2 === 1) {\n                        mainLoop += `\n                 xCOffset = xC + 1 - strides[1];\n                 if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex}Ready == 0) {\n                   xTexelC${colIndex} = getX(batch, xR, xCOffset, d1);\n                   // Need to manually clear unused channels in case\n                   // we're reading from recycled texture.\n                   if (xCOffset + 1 >= inDims[1]) {\n                     xTexelC${colIndex}.zw = vec2(0.0);\n                   }\n                   xTexelC${colIndex}Ready = 1;\n                 }\n\n                 if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n                   xTexelC${colIndex + 1} = getX(batch, xR, xC + 1, d1);\n                   // Need to manually clear unused channels in case\n                   // we're reading from recycled texture.\n                   if (xC + 2 >= inDims[1]) {\n                     xTexelC${colIndex + 1}.zw = vec2(0.0);\n                   }\n                   xTexelC${colIndex + 1}Ready = 1;\n                 }\n\n                 xC${colIndex} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.zw);\n               `;\n                        if (colIndex + 1 < filterWidth) {\n                            mainLoop += `\n                   final = vec4(0.0);\n                   xCOffset = xC + 1 + strides[1];\n                   if(xCOffset >= 0 && xCOffset < inDims[1]) {\n                     final = getX(batch, xR, xCOffset, d1);\n                   }\n                   xC${colIndex + 1} = vec4(xTexelC${colIndex + 1}.xy, final.xy);\n                 `;\n                        }\n                    }\n                    else {\n                        mainLoop += `\n                 if(xC >= 0 && xC < inDims[1] && xTexelC${colIndex}Ready == 0) {\n                   xTexelC${colIndex} = getX(batch, xR, xC, d1);\n                   if (xC + 1 >= inDims[1]) {\n                     xTexelC${colIndex}.zw = vec2(0.0);\n                   }\n                   xTexelC${colIndex}Ready = 1;\n                 }\n\n                 xCOffset = xC + strides[1];\n                 if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n                   xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n                   if (xCOffset + 1 >= inDims[1]) {\n                     xTexelC${colIndex + 1}.zw = vec2(0.);\n                   }\n                   xTexelC${colIndex + 1}Ready = 1;\n                 }\n\n                 xC${colIndex} = vec4(\n                   xTexelC${colIndex}.xy, xTexelC${colIndex + 1}.xy);\n               `;\n                        if (colIndex + 1 < filterWidth) {\n                            mainLoop += `\n                   xC${colIndex + 1} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.zw);\n                 `;\n                        }\n                    }\n                }\n            }\n            // localize the dotProd accumulation within the loop, the theory is for\n            // GPU with limited cache, accumulate sum across large amount of\n            // veriables will cause lots of cache misses. (i.e. 5x5 filter will have\n            // 50 variables)\n            if (colIndex < filterWidth) {\n                mainLoop += `\n             wTexel = getW(r, ${colIndex}, d1, d2);\n             dotProd += xC${colIndex}.xxzz * vec4(wTexel.xy, wTexel.xy);\n             if(d1 + 1 < ${convInfo.inChannels}) {\n               dotProd += xC${colIndex}.yyww * vec4(wTexel.zw, wTexel.zw);\n             }\n           `;\n                if (colIndex + 1 < filterWidth) {\n                    mainLoop += `\n               wTexel = getW(r, ${colIndex + 1}, d1, d2);\n               dotProd += xC${colIndex + 1}.xxzz * vec4(wTexel.xy, wTexel.xy);\n               if(d1 + 1 < ${convInfo.inChannels}) {\n                 dotProd += xC${colIndex + 1}.yyww * vec4(wTexel.zw, wTexel.zw);\n               }\n             `;\n                }\n            }\n        }\n        mainLoop += `\n     }\n   `;\n        mainLoop += `\n     }\n   `;\n        mainLoop += `\n     }\n   `;\n        let activationSnippet = '', applyActivationSnippet = '';\n        if (activation) {\n            if (hasPreluActivation) {\n                activationSnippet = `vec4 activation(vec4 a) {\n           vec4 b = getPreluActivationWeightsAtOutCoords();\n           ${activation}\n         }`;\n            }\n            else if (hasLeakyReluAlpha) {\n                activationSnippet = `vec4 activation(vec4 a) {\n           vec4 b = getLeakyreluAlphaAtOutCoords();\n           ${activation}\n         }`;\n            }\n            else {\n                activationSnippet = `vec4 activation(vec4 x) {\n           ${activation}\n         }`;\n            }\n            applyActivationSnippet = `result = activation(result);`;\n        }\n        const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n        if (addBias) {\n            this.variableNames.push('bias');\n        }\n        if (hasPreluActivation) {\n            this.variableNames.push('preluActivationWeights');\n        }\n        if (hasLeakyReluAlpha) {\n            this.variableNames.push('leakyreluAlpha');\n        }\n        this.userCode = `\n       ${activationSnippet}\n\n       void main() {\n         ivec4 coords = getOutputCoords();\n         int batch = coords.x;\n         ivec2 xRCCorner = coords.yz * strides - pads;\n         int d2 = coords.w;\n         int xRCorner = xRCCorner.x;\n         int xCCorner = xRCCorner.y;\n\n         //intialize dotProd with a small epsilon seems to reduce GPU accuracy loss.\n         vec4 dotProd = vec4(0.000000000000001);\n\n         ${mainLoop}\n\n         vec4 result = dotProd - vec4(0.000000000000001);\n         ${addBiasSnippet}\n         ${applyActivationSnippet}\n         setOutput(result);\n       }\n     `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jb252X3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUYsT0FBTyxFQUFlLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXpELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLE9BQU8sbUJBQW1CO0lBYzlCLFlBQ0ksUUFBaUMsRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUNsRCxhQUFxQixJQUFJLEVBQUUsa0JBQWtCLEdBQUcsS0FBSyxFQUNyRCxpQkFBaUIsR0FBRyxLQUFLO1FBaEI3QixrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBSXBCLG1CQUFjLEdBQUc7WUFDZixFQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7WUFDdkMsRUFBQyxJQUFJLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQzFDLEVBQUMsSUFBSSxFQUFFLFdBQVcsRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtZQUM1QyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7U0FDMUMsQ0FBQztRQU1BLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFFBQVEsQ0FBQztRQUNyQyxJQUFJLENBQUMsbUJBQW1CLEdBQUcsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNyRSxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN0QyxNQUFN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LElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqQztRQUVELElBQUksa0JBQWtCLEVBQUU7WUFDdEIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsd0JBQXdCLENBQUMsQ0FBQztTQUNuRDtRQUNELElBQUksaUJBQWlCLEVBQUU7WUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztTQUMzQztRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7U0FDWixpQkFBaUI7Ozs7Ozs7Ozs7Ozs7V0FhZixRQUFROzs7V0FHUixjQUFjO1dBQ2Qsc0JBQXNCOzs7TUFHM0IsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuIGltcG9ydCB7YmFja2VuZF91dGlsLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG4gaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbiBleHBvcnQgY2xhc3MgQ29udjJEUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgIHBhY2tlZElucHV0cyA9IHRydWU7XG4gICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICAgdXNlckNvZGU6IHN0cmluZztcbiAgIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICAge25hbWU6ICdwYWRzJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgICB7bmFtZTogJ3N0cmlkZXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAgIHtuYW1lOiAnZGlsYXRpb25zJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgICB7bmFtZTogJ2luRGltcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgIF07XG5cbiAgIGNvbnN0cnVjdG9yKFxuICAgICAgIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbywgYWRkQmlhcyA9IGZhbHNlLFxuICAgICAgIGFjdGl2YXRpb246IHN0cmluZyA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLFxuICAgICAgIGhhc0xlYWt5UmVsdUFscGhhID0gZmFsc2UpIHtcbiAgICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcbiAgICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICAgY29uc3QgZGlsYXRpb25XaWR0aCA9IGNvbnZJbmZvLmRpbGF0aW9uV2lkdGg7XG4gICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICAgY29uc3QgdGV4ZWxzQWNyb3NzID0gZmlsdGVyV2lkdGg7XG5cbiAgICAgbGV0IG1haW5Mb29wID0gYFxuICAgICAgIGludCB4UjsgaW50IHhDOyBpbnQgeENPZmZzZXQ7XG4gICAgICAgdmVjNCB3VGV4ZWw7IHZlYzQgcHJldmlvdXM7IHZlYzQgZmluYWw7YDtcblxuICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGZpbHRlcldpZHRoOyBjKyspIHtcbiAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDJ9O1xuICAgICAgICAgICBpbnQgeFRleGVsQyR7YyAqIDJ9UmVhZHk7XG4gICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDIgKyAxfTtcbiAgICAgICAgICAgaW50IHhUZXhlbEMke2MgKiAyICsgMX1SZWFkeTtcbiAgICAgICAgICAgdmVjNCB4QyR7Y307YDtcbiAgICAgfVxuXG4gICAgIC8qKlxuICAgICAgKiBUaGlzIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24gd29ya3MgYnkgZ2F0aGVyaW5nIHRoZSB2YWx1ZXMgbmVlZGVkIGZvclxuICAgICAgKiBlYWNoIG91dHB1dCBjaGFubmVsJ3MgZG90IHByb2R1Y3QgaW50byB2ZWM0J3MgYW5kIHRoZW4gbXVsdGlwbHlpbmcgdGhlbVxuICAgICAgKiBhbGwgdG9nZXRoZXIgKHRoaXMgaGFwcGVucyBpbiB0aGUgZmluYWwgZG91YmxlIGZvci1sb29wIGJlbG93KS4gTW9zdCBvZlxuICAgICAgKiB0aGUgbWFpbiBsb29wIGNvbnNpc3RzIG9mIGNvbnN0cnVjdGluZyB0aGVzZSB2ZWM0J3Mgd2l0aCB0aGUgbWluaW11bVxuICAgICAgKiBudW1iZXIgb2YgdGV4dHVyZTJEIGNhbGxzLCB3aGljaCBtZWFucyBtYWtpbmcgdXNlIG9mIGFsbCBmb3VyIHJldHVybmVkXG4gICAgICAqIHZhbHVlcyBmcm9tIGEgdGV4dHVyZTJEIGNhbGwgYXQgb25jZS5cbiAgICAgICovXG4gICAgIG1haW5Mb29wICs9IGBcbiAgICAgZm9yIChpbnQgciA9IDA7IHIgPCAke2ZpbHRlckhlaWdodH07IHIrKykge1xuICAgICAgZm9yIChpbnQgZDEgPSAwOyBkMSA8ICR7Y29udkluZm8uaW5DaGFubmVsc307IGQxICs9IDIpIHtcbiAgICAgICBgO1xuICAgICBmb3IgKGxldCBjID0gMDsgYyA8IGZpbHRlcldpZHRoOyBjKyspIHtcbiAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgIHhUZXhlbEMke2MgKiAyfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICAgeFRleGVsQyR7YyAqIDJ9UmVhZHkgPSAwO1xuICAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9ID0gdmVjNCgwLjApO1xuICAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9UmVhZHkgPSAwO1xuICAgICAgICAgICB4QyR7Y30gPSB2ZWM0KDAuMCk7YDtcbiAgICAgfVxuICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICB4UiA9IHhSQ29ybmVyICsgciAqIGRpbGF0aW9uc1swXTtcbiAgICAgICAgIGlmICh4UiA+PTAgJiYgeFIgPCBpbkRpbXNbMF0pIHtcbiAgICAgICBgO1xuXG4gICAgIGZvciAobGV0IHRleGVsQyA9IDA7IHRleGVsQyA8ICh0ZXhlbHNBY3Jvc3MgKyAxKSAvIDI7IHRleGVsQysrKSB7XG4gICAgICAgY29uc3QgY29sSW5kZXggPSB0ZXhlbEMgKiAyO1xuXG4gICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICB4QyA9IHhDQ29ybmVyICsgJHtjb2xJbmRleCAqIGRpbGF0aW9uV2lkdGh9O1xuICAgICAgICAgICBgO1xuXG4gICAgICAgaWYgKHN0cmlkZVdpZHRoID09PSAxKSB7XG4gICAgICAgICBpZiAoY29sSW5kZXggPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAvLyBJZiBwYWRkaW5nIGlzIG9kZCwgdGhlIG91dGVyIHRleGVscyBoYXZlIHRvIGJlIGNvbXBvc2VkLlxuICAgICAgICAgICBpZiAocGFkTGVmdCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgICAvLyBUT0RPOiBFbnN1cmUgdmVjNCBwcmV2aW91cyBkb2VzIG5vdCByZXN1bHQgaW4gcmVkdW5kYW50IHNhbXBsZSxcbiAgICAgICAgICAgICAvLyBhbmQgYXZvaWQgc2V0dGluZyB4VGV4ZWxSQydzIHRoYXQgZXhjZWVkIHRoZSBib3VuZGFyeSBpbiB0aGVcbiAgICAgICAgICAgICAvLyBmaXJzdCBwbGFjZSByYXRoZXIgdGhhbiByZXNldHRpbmcgdGhlbSB0byB2ZWM0KDApKS5cblxuICAgICAgICAgICAgIC8vIFRvIGNvbXB1dGUgeENPZmZzZXQ6XG4gICAgICAgICAgICAgLy8gLSBJZiBwYWRkaW5nIGlzIG9kZCwgd2UgbXVzdCBhZGQgMSB0byBlbnN1cmUgd2UgYXNrIGZvciBhblxuICAgICAgICAgICAgIC8vIGV2ZW4tbnVtYmVyZWQgcm93LlxuICAgICAgICAgICAgIC8vIC0gV2Ugc3VidHJhY3QgMiB0byBhY2Nlc3MgdGhlIHByZXZpb3VzIHRleGVsLlxuXG4gICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMTtcbiAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgIGNvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcblxuICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgLy8gVGhpcyB0ZXhlbCBoYXMgYmVlbiByZWFkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiB0aGUgZGlsYXRpb25cbiAgICAgICAgICAgICAvLyBpcyAxLlxuICAgICAgICAgICAgIGlmIChkaWxhdGlvbldpZHRoID09PSAxICYmIGNvbEluZGV4ID4gMCkge1xuICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleCAtIDJ9Lnp3LCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICBjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDEgLSAyO1xuXG4gICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIHJlYWRpbmcgZnJvbSByZWN5Y2xlZCB0ZXh0dXJlLlxuICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMuencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHByZXZpb3VzLnp3LCB4VGV4ZWxDJHtjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNCgwLjAsIDAuMCwgeFRleGVsQyR7Y29sSW5kZXh9Lnh5KTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgLy8gUGFkZGluZyBpcyBldmVuLCBzbyB4UkMgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgdGV4ZWwuXG4gICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICBpZiAoeEMgPj0gMCAmJiB4QyA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHhUZXhlbEMke2NvbEluZGV4fTtcbiAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgfVxuXG4gICAgICAgICAgIGlmIChjb2xJbmRleCArIDEgPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgIC8vIElmIGRpbGF0aW9uIGlzIGV2ZW4sIHRoZSBzZWNvbmQgZW50cnkgc2hvdWxkIG1hdGNoIHRoZSBmaXJzdFxuICAgICAgICAgICAgIC8vIChlaXRoZXIgYm90aCBhcmUgY29tcG9zZWQgb3IgYm90aCBhcmUgc2luZ2xlIHNhbXBsZXMpLiBCdXQgaWZcbiAgICAgICAgICAgICAvLyBkaWxhdGlvbiBpcyBvZGQsIHRoZW4gdGhlIHNlY29uZCBlbnRyeSBzaG91bGQgYmUgdGhlIG9wcG9zaXRlXG4gICAgICAgICAgICAgLy8gb2YgdGhlIGZpcnN0IChpZiB0aGUgZmlyc3QgaXMgY29tcG9zZWQsIHRoZSBzZWNvbmQgaXMgYSBzaW5nbGVcbiAgICAgICAgICAgICAvLyBzYW1wbGUsIGFuZCB2aWNlIHZlcnNhLilcblxuICAgICAgICAgICAgIGNvbnN0IG5leHRUZXhlbE9mZnNldCA9IHBhZExlZnQgJSAyID09PSAwID9cbiAgICAgICAgICAgICAgICAgdXRpbC5uZWFyZXN0TGFyZ2VyRXZlbihkaWxhdGlvbldpZHRoKSA6XG4gICAgICAgICAgICAgICAgIGRpbGF0aW9uV2lkdGg7XG5cbiAgICAgICAgICAgICBpZiAoKGRpbGF0aW9uV2lkdGggJSAyID09PSAwICYmIHBhZExlZnQgJSAyID09PSAxKSB8fFxuICAgICAgICAgICAgICAgICAoZGlsYXRpb25XaWR0aCAlIDIgIT09IDAgJiYgcGFkTGVmdCAlIDIgIT09IDEpKSB7XG4gICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIGltb2QocGFkc1sxXSwgMikgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiA+IDEgdGhlbiB0aGUgeFJDJ3Mgd2lsbCBub3QgYmUgYWJsZSB0byBzaGFyZSBhbnlcbiAgICAgICAgICAgICAgIC8vIHZhbHVlcywgc28gZWFjaCB4UkMgd2lsbCByZXF1aXJlIHR3byB1bmlxdWUgY2FsbHMgdG8gZ2V0WC5cbiAgICAgICAgICAgICAgIGlmIChkaWxhdGlvbldpZHRoID4gMSkge1xuICAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgICB4Q09mZnNldCAtPSAyO1xuICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNChwcmV2aW91cy56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9Lnh5KTtcbiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KDAuMCwgMC4wLCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX0ueHkpO1xuICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleH0uencsIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS54eSk7XG4gICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgIC8vIElmIGRpbGF0aW9uIGlzIDEgYW5kIHBhZGRpbmcgaXMgb2RkLCB3ZSBoYXZlIGFscmVhZHkgcmVhZCB0aGVcbiAgICAgICAgICAgICAgIC8vIHRleGVsIHdoZW4gY29uc3RydWN0aW5nIHRoZSBwcmV2aW91cyB4IHZhbHVlLiBIZXJlIHdlIGNhblxuICAgICAgICAgICAgICAgLy8gc2ltcGx5IHNraXAgdGhlIHRleHR1cmUgcmVhZC5cbiAgICAgICAgICAgICAgIGlmIChuZXh0VGV4ZWxPZmZzZXQgPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB4VGV4ZWxDJHtjb2xJbmRleH07XG4gICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArICR7bmV4dFRleGVsT2Zmc2V0fTtcblxuICAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHhUZXhlbEMke2NvbEluZGV4ICsgMX07XG4gICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgIH1cbiAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgIH0gZWxzZSB7ICAvLyBzdHJpZGUgPT09IDJcbiAgICAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB3aGV0aGVyIHBhZExlZnQgaXMgZXZlbiBvciBvZGQsIHdlIHdhbnQgZWl0aGVyIHRoZVxuICAgICAgICAgICAvLyB4eSBvciB6dyBjaGFubmVscyBmcm9tIFggdGV4ZWxzIGZvciB4QyR7Y29sSW5kZXh9LiBJZiBwYWRMZWZ0IGlzXG4gICAgICAgICAgIC8vIGV2ZW4sIHhDJHtjb2xJbmRleCArMX0gaXMgc2ltcGx5IHRoZSB6dyBjaGFubmVscyBvZiB0ZXhlbHMgd2UndmVcbiAgICAgICAgICAgLy8gYWxyZWFkeSBzYW1wbGVkLiBCdXQgaWYgcGFkTGVmdCBpcyBvZGQsIHhDeyRjICsgMX0uencgd2lsbFxuICAgICAgICAgICAvLyBuZWVkIHRvIGNvbWUgZnJvbSB0aGUgeHkgY2hhbm5lbHMgb2YgYSBuZXcgdGV4ZWwsIGhlbmNlIHRoZSBgXG4gICAgICAgICAgIC8vIHZlYzRcbiAgICAgICAgICAgLy8gZmluYWxgIGluaXRpYWxpemVkIGJlbG93LlxuICAgICAgICAgICBpZiAocGFkTGVmdCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxIC0gc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgY29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICBpZih4QyArIDEgPj0gMCAmJiB4QyArIDEgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4QyArIDEsIGQxKTtcbiAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICAgaWYgKHhDICsgMiA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleH0uencsIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9Lnp3KTtcbiAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICBpZiAoY29sSW5kZXggKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgICBmaW5hbCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMSArIHN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgZmluYWwgPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4ICsgMX0ueHksIGZpbmFsLnh5KTtcbiAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICB9XG4gICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICBpZih4QyA+PSAwICYmIHhDIDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuKTtcbiAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KFxuICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS54eSwgeFRleGVsQyR7Y29sSW5kZXggKyAxfS54eSk7XG4gICAgICAgICAgICAgICBgO1xuXG4gICAgICAgICAgICAgaWYgKGNvbEluZGV4ICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS56dyk7XG4gICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICB9XG4gICAgICAgICB9XG4gICAgICAgfVxuXG4gICAgICAgLy8gbG9jYWxpemUgdGhlIGRvdFByb2QgYWNjdW11bGF0aW9uIHdpdGhpbiB0aGUgbG9vcCwgdGhlIHRoZW9yeSBpcyBmb3JcbiAgICAgICAvLyBHUFUgd2l0aCBsaW1pdGVkIGNhY2hlLCBhY2N1bXVsYXRlIHN1bSBhY3Jvc3MgbGFyZ2UgYW1vdW50IG9mXG4gICAgICAgLy8gdmVyaWFibGVzIHdpbGwgY2F1c2UgbG90cyBvZiBjYWNoZSBtaXNzZXMuIChpLmUuIDV4NSBmaWx0ZXIgd2lsbCBoYXZlXG4gICAgICAgLy8gNTAgdmFyaWFibGVzKVxuICAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgd1RleGVsID0gZ2V0VyhyLCAke2NvbEluZGV4fSwgZDEsIGQyKTtcbiAgICAgICAgICAgICBkb3RQcm9kICs9IHhDJHtjb2xJbmRleH0ueHh6eiAqIHZlYzQod1RleGVsLnh5LCB3VGV4ZWwueHkpO1xuICAgICAgICAgICAgIGlmKGQxICsgMSA8ICR7Y29udkluZm8uaW5DaGFubmVsc30pIHtcbiAgICAgICAgICAgICAgIGRvdFByb2QgKz0geEMke2NvbEluZGV4fS55eXd3ICogdmVjNCh3VGV4ZWwuencsIHdUZXhlbC56dyk7XG4gICAgICAgICAgICAgfVxuICAgICAgICAgICBgO1xuXG4gICAgICAgICBpZiAoY29sSW5kZXggKyAxIDwgZmlsdGVyV2lkdGgpIHtcbiAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgd1RleGVsID0gZ2V0VyhyLCAke2NvbEluZGV4ICsgMX0sIGQxLCBkMik7XG4gICAgICAgICAgICAgICBkb3RQcm9kICs9IHhDJHtjb2xJbmRleCArIDF9Lnh4enogKiB2ZWM0KHdUZXhlbC54eSwgd1RleGVsLnh5KTtcbiAgICAgICAgICAgICAgIGlmKGQxICsgMSA8ICR7Y29udkluZm8uaW5DaGFubmVsc30pIHtcbiAgICAgICAgICAgICAgICAgZG90UHJvZCArPSB4QyR7Y29sSW5kZXggKyAxfS55eXd3ICogdmVjNCh3VGV4ZWwuencsIHdUZXhlbC56dyk7XG4gICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgYDtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIH1cbiAgICAgbWFpbkxvb3AgKz0gYFxuICAgICB9XG4gICBgO1xuICAgbWFpbkxvb3AgKz0gYFxuICAgICB9XG4gICBgO1xuICAgbWFpbkxvb3AgKz0gYFxuICAgICB9XG4gICBgO1xuXG4gICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICAgfWA7XG4gICAgICAgfSBlbHNlIGlmIChoYXNMZWFreVJlbHVBbHBoYSkge1xuICAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgdmVjNCBhY3RpdmF0aW9uKHZlYzQgYSkge1xuICAgICAgICAgICB2ZWM0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgIH1gO1xuICAgICAgIH0gZWxzZSB7XG4gICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCB4KSB7XG4gICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgIH1gO1xuICAgICAgIH1cblxuICAgICAgIGFwcGx5QWN0aXZhdGlvblNuaXBwZXQgPSBgcmVzdWx0ID0gYWN0aXZhdGlvbihyZXN1bHQpO2A7XG4gICAgIH1cblxuICAgICBjb25zdCBhZGRCaWFzU25pcHBldCA9IGFkZEJpYXMgPyAncmVzdWx0ICs9IGdldEJpYXNBdE91dENvb3JkcygpOycgOiAnJztcbiAgICAgaWYgKGFkZEJpYXMpIHtcbiAgICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgnYmlhcycpO1xuICAgICB9XG5cbiAgICAgaWYgKGhhc1ByZWx1QWN0aXZhdGlvbikge1xuICAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdwcmVsdUFjdGl2YXRpb25XZWlnaHRzJyk7XG4gICAgIH1cbiAgICAgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2xlYWt5cmVsdUFscGhhJyk7XG4gICAgIH1cblxuICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICR7YWN0aXZhdGlvblNuaXBwZXR9XG5cbiAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkcy54O1xuICAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcbiAgICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICAgaW50IHhDQ29ybmVyID0geFJDQ29ybmVyLnk7XG5cbiAgICAgICAgIC8vaW50aWFsaXplIGRvdFByb2Qgd2l0aCBhIHNtYWxsIGVwc2lsb24gc2VlbXMgdG8gcmVkdWNlIEdQVSBhY2N1cmFjeSBsb3NzLlxuICAgICAgICAgdmVjNCBkb3RQcm9kID0gdmVjNCgwLjAwMDAwMDAwMDAwMDAwMSk7XG5cbiAgICAgICAgICR7bWFpbkxvb3B9XG5cbiAgICAgICAgIHZlYzQgcmVzdWx0ID0gZG90UHJvZCAtIHZlYzQoMC4wMDAwMDAwMDAwMDAwMDEpO1xuICAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgICR7YXBwbHlBY3RpdmF0aW9uU25pcHBldH1cbiAgICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgIH1cbiAgICAgYDtcbiAgIH1cbiB9XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from './glsl_version';\nimport { useShapeUniforms } from './gpgpu_math';\nexport class Im2ColPackedProgram {\n    constructor(outputShape, convInfo) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.customUniforms = [\n            { name: 'inputShape', type: 'ivec4' },\n            { name: 'pad', type: 'ivec2' },\n            { name: 'stride', type: 'ivec2' },\n            { name: 'dilation', type: 'ivec2' },\n            { name: 'inChannels', type: 'int' },\n            { name: 'itemsPerBlockRow', type: 'int' },\n            { name: 'outWidth', type: 'int' },\n        ];\n        this.outputShape = outputShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        const { dataFormat } = convInfo;\n        const glsl = getGlslDifferences();\n        const isChannelsLast = dataFormat === 'channelsLast';\n        const rowDim = isChannelsLast ? 1 : 2;\n        const colDim = isChannelsLast ? 2 : 3;\n        const boundsCheckingSnippet = this.enableShapeUniforms ?\n            'if(blockIndex < outShape[2] && pos < outShape[1]) {' :\n            `if(blockIndex < ${outputShape[2]} && pos < ${outputShape[1]}) {`;\n        let unrolled = ``;\n        for (let row = 0; row <= 1; row++) {\n            for (let col = 0; col <= 1; col++) {\n                unrolled += `\n          blockIndex = rc.z + ${col};\n          pos = rc.y + ${row};\n\n          ${boundsCheckingSnippet}\n            offsetY = int(blockIndex / outWidth) * stride[0] - pad[0];\n            d0 = offsetY + dilation[0] * (pos / itemsPerBlockRow);\n\n            if(d0 < inputShape[${rowDim}] && d0 >= 0) {\n              // Use custom imod instead mod. On Intel GPU, mod may generate\n              // unexpected value.\n              // https://github.com/tensorflow/tfjs/issues/5447\n              offsetX = imod(blockIndex, outWidth) * stride[1] - pad[1];\n              d1 = offsetX + dilation[1] * (imod(pos, itemsPerBlockRow) /\n                  inChannels);\n\n              if(d1 < inputShape[${colDim}] && d1 >= 0) {\n\n                ch = imod(pos, inChannels);\n\n                if (${isChannelsLast}) {\n                  innerDims = vec2(d1, ch);\n                  result[${row * 2 + col}] = getChannel(\n                    getA(rc.x, d0, int(innerDims.x),\n                    int(innerDims.y)), innerDims);\n                } else {\n                  innerDims = vec2(d0, d1);\n                  result[${row * 2 + col}] = getChannel(\n                    getA(rc.x, ch, int(innerDims.x),\n                    int(innerDims.y)), innerDims);\n                }\n              }\n            }\n          }\n        `;\n            }\n        }\n        this.userCode = `\n      void main() {\n        ivec3 rc = getOutputCoords();\n\n        vec4 result = vec4(0);\n\n        int blockIndex, pos, offsetY, d0, offsetX, d1, ch;\n        vec2 innerDims;\n\n        ${unrolled}\n\n        ${glsl.output} = result;\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW0yY29sX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2ltMmNvbF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQ2xELE9BQU8sRUFBZSxnQkFBZ0IsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUU1RCxNQUFNLE9BQU8sbUJBQW1CO0lBaUI5QixZQUFZLFdBQXFCLEVBQUUsUUFBaUM7UUFoQnBFLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUlwQixtQkFBYyxHQUFHO1lBQ2YsRUFBQyxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQzdDLEVBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtZQUN0QyxFQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7WUFDekMsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQzNDLEVBQUMsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsS0FBYyxFQUFFO1lBQzNDLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFFLElBQUksRUFBRSxLQUFjLEVBQUU7WUFDakQsRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxLQUFjLEVBQUU7U0FDMUMsQ0FBQztRQUdBLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBRyxRQUFRLENBQUM7UUFDOUIsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxNQUFNLGNBQWMsR0FBRyxVQUFVLEtBQUssY0FBYyxDQUFDO1FBQ3JELE1BQU0sTUFBTSxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEMsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV0QyxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1lBQ3BELHFEQUFxRCxDQUFDLENBQUM7WUFDdkQsbUJBQW1CLFdBQVcsQ0FBQyxDQUFDLENBQUMsYUFBYSxXQUFXLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN0RSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFFbEIsS0FBSyxJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsRUFBRSxHQUFHLEVBQUUsRUFBRTtZQUNqQyxLQUFLLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxFQUFFLEdBQUcsRUFBRSxFQUFFO2dCQUNqQyxRQUFRLElBQUk7Z0NBQ1ksR0FBRzt5QkFDVixHQUFHOztZQUVoQixxQkFBcUI7Ozs7aUNBSUEsTUFBTTs7Ozs7Ozs7bUNBUUosTUFBTTs7OztzQkFJbkIsY0FBYzs7MkJBRVQsR0FBRyxHQUFHLENBQUMsR0FBRyxHQUFHOzs7OzsyQkFLYixHQUFHLEdBQUcsQ0FBQyxHQUFHLEdBQUc7Ozs7Ozs7U0FPL0IsQ0FBQzthQUNIO1NBQ0Y7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7VUFTVixRQUFROztVQUVSLElBQUksQ0FBQyxNQUFNOztLQUVoQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuL2dsc2xfdmVyc2lvbic7XG5pbXBvcnQge0dQR1BVUHJvZ3JhbSwgdXNlU2hhcGVVbmlmb3Jtc30gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEltMkNvbFBhY2tlZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICdpbnB1dFNoYXBlJywgdHlwZTogJ2l2ZWM0JyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAncGFkJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnc3RyaWRlJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnZGlsYXRpb24nLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdpbkNoYW5uZWxzJywgdHlwZTogJ2ludCcgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ2l0ZW1zUGVyQmxvY2tSb3cnLCB0eXBlOiAnaW50JyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnb3V0V2lkdGgnLCB0eXBlOiAnaW50JyBhcyBjb25zdCB9LFxuICBdO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSwgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuICAgIGNvbnN0IHtkYXRhRm9ybWF0fSA9IGNvbnZJbmZvO1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICAgIGNvbnN0IHJvd0RpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IDI7XG4gICAgY29uc3QgY29sRGltID0gaXNDaGFubmVsc0xhc3QgPyAyIDogMztcblxuICAgIGNvbnN0IGJvdW5kc0NoZWNraW5nU25pcHBldCA9IHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA/XG4gICAgICAgICdpZihibG9ja0luZGV4IDwgb3V0U2hhcGVbMl0gJiYgcG9zIDwgb3V0U2hhcGVbMV0pIHsnIDpcbiAgICAgICAgYGlmKGJsb2NrSW5kZXggPCAke291dHB1dFNoYXBlWzJdfSAmJiBwb3MgPCAke291dHB1dFNoYXBlWzFdfSkge2A7XG4gICAgbGV0IHVucm9sbGVkID0gYGA7XG5cbiAgICBmb3IgKGxldCByb3cgPSAwOyByb3cgPD0gMTsgcm93KyspIHtcbiAgICAgIGZvciAobGV0IGNvbCA9IDA7IGNvbCA8PSAxOyBjb2wrKykge1xuICAgICAgICB1bnJvbGxlZCArPSBgXG4gICAgICAgICAgYmxvY2tJbmRleCA9IHJjLnogKyAke2NvbH07XG4gICAgICAgICAgcG9zID0gcmMueSArICR7cm93fTtcblxuICAgICAgICAgICR7Ym91bmRzQ2hlY2tpbmdTbmlwcGV0fVxuICAgICAgICAgICAgb2Zmc2V0WSA9IGludChibG9ja0luZGV4IC8gb3V0V2lkdGgpICogc3RyaWRlWzBdIC0gcGFkWzBdO1xuICAgICAgICAgICAgZDAgPSBvZmZzZXRZICsgZGlsYXRpb25bMF0gKiAocG9zIC8gaXRlbXNQZXJCbG9ja1Jvdyk7XG5cbiAgICAgICAgICAgIGlmKGQwIDwgaW5wdXRTaGFwZVske3Jvd0RpbX1dICYmIGQwID49IDApIHtcbiAgICAgICAgICAgICAgLy8gVXNlIGN1c3RvbSBpbW9kIGluc3RlYWQgbW9kLiBPbiBJbnRlbCBHUFUsIG1vZCBtYXkgZ2VuZXJhdGVcbiAgICAgICAgICAgICAgLy8gdW5leHBlY3RlZCB2YWx1ZS5cbiAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGZqcy9pc3N1ZXMvNTQ0N1xuICAgICAgICAgICAgICBvZmZzZXRYID0gaW1vZChibG9ja0luZGV4LCBvdXRXaWR0aCkgKiBzdHJpZGVbMV0gLSBwYWRbMV07XG4gICAgICAgICAgICAgIGQxID0gb2Zmc2V0WCArIGRpbGF0aW9uWzFdICogKGltb2QocG9zLCBpdGVtc1BlckJsb2NrUm93KSAvXG4gICAgICAgICAgICAgICAgICBpbkNoYW5uZWxzKTtcblxuICAgICAgICAgICAgICBpZihkMSA8IGlucHV0U2hhcGVbJHtjb2xEaW19XSAmJiBkMSA+PSAwKSB7XG5cbiAgICAgICAgICAgICAgICBjaCA9IGltb2QocG9zLCBpbkNoYW5uZWxzKTtcblxuICAgICAgICAgICAgICAgIGlmICgke2lzQ2hhbm5lbHNMYXN0fSkge1xuICAgICAgICAgICAgICAgICAgaW5uZXJEaW1zID0gdmVjMihkMSwgY2gpO1xuICAgICAgICAgICAgICAgICAgcmVzdWx0WyR7cm93ICogMiArIGNvbH1dID0gZ2V0Q2hhbm5lbChcbiAgICAgICAgICAgICAgICAgICAgZ2V0QShyYy54LCBkMCwgaW50KGlubmVyRGltcy54KSxcbiAgICAgICAgICAgICAgICAgICAgaW50KGlubmVyRGltcy55KSksIGlubmVyRGltcyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGlubmVyRGltcyA9IHZlYzIoZDAsIGQxKTtcbiAgICAgICAgICAgICAgICAgIHJlc3VsdFske3JvdyAqIDIgKyBjb2x9XSA9IGdldENoYW5uZWwoXG4gICAgICAgICAgICAgICAgICAgIGdldEEocmMueCwgY2gsIGludChpbm5lckRpbXMueCksXG4gICAgICAgICAgICAgICAgICAgIGludChpbm5lckRpbXMueSkpLCBpbm5lckRpbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyByYyA9IGdldE91dHB1dENvb3JkcygpO1xuXG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwKTtcblxuICAgICAgICBpbnQgYmxvY2tJbmRleCwgcG9zLCBvZmZzZXRZLCBkMCwgb2Zmc2V0WCwgZDEsIGNoO1xuICAgICAgICB2ZWMyIGlubmVyRGltcztcblxuICAgICAgICAke3Vucm9sbGVkfVxuXG4gICAgICAgICR7Z2xzbC5vdXRwdXR9ID0gcmVzdWx0O1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { Im2ColPackedProgram } from '../im2col_packed_gpu';\nimport { mapActivationToShaderProgram } from '../kernel_utils/kernel_funcs_utils';\nimport { MatMulPackedProgram } from '../mulmat_packed_gpu';\nimport * as webgl_util from '../webgl_util';\nimport { batchMatMulImpl, MATMUL_SHARED_DIM_THRESHOLD } from './BatchMatMul_impl';\nimport { identity } from './Identity';\nimport { reshape } from './Reshape';\n// Both conv2dByMatMul and conv2dWithIm2Row fuse height and width into one\n// dimension to compute batchMatMul, so bias and activation weights are also\n// supposed to fuse the two dimensions into one.\n//\n// This function computes the target shape for fusing height and width\n// dimensions. Returning null means the shape is already compatible.\n//\n// Even though the bias is not supposed to be a 3-D or a 4-D (including\n// batch) tensor and PReLU activiation weights is not supposed to be a 4-D\n// tensor, we still need to support them, because we haven't disabled\n// them for NHWC format.\n// https://github.com/tensorflow/tfjs/blob/b53bd47e880367ae57493f0ea628abaf08db2d5d/tfjs-core/src/ops/fused/conv2d.ts#L181-L196\nfunction getShapeForBatchMatMul(shape, isChannelsLast) {\n    const length = shape.length;\n    if (length >= 3) {\n        return isChannelsLast ?\n            [\n                ...shape.slice(0, -3) /* batch */,\n                shape[length - 3] * shape[length - 2] /* height * width */,\n                shape[length - 1] /* channel */\n            ] :\n            [\n                ...shape.slice(0, -3) /* batch */, shape[length - 3] /* channel */,\n                shape[length - 2] * shape[length - 1] /* height * width */\n            ];\n    }\n    else if (!isChannelsLast && length === 1 && shape[0] > 1) {\n        return [shape[0], 1];\n    }\n    else {\n        return null;\n    }\n}\n// For 1x1 kernels that iterate through every point in the input, convolution\n// can be expressed as matrix multiplication (without need for memory\n// remapping).\nexport function conv2dByMatMul({ x, filter, convInfo, backend, bias = null, preluActivationWeights = null, leakyreluAlpha = 0, activation = null }) {\n    // Reshapes conv2D input to 2D tensors, uses matMul and then reshape the\n    // result from 2D to 4D.\n    const xShape = x.shape;\n    const xTexData = backend.texData.get(x.dataId);\n    const sharedMatMulDim = convInfo.inChannels;\n    const outerShapeX = xShape[0] * xShape[1] * xShape[2];\n    const outerShapeFilter = convInfo.outChannels;\n    const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n    const transposeA = false;\n    const transposeB = false;\n    let out;\n    const intermediates = [];\n    if (preluActivationWeights != null) {\n        const targetShape = getShapeForBatchMatMul(preluActivationWeights.shape, isChannelsLast);\n        if (targetShape != null) {\n            preluActivationWeights = reshape({\n                inputs: { x: preluActivationWeights },\n                backend,\n                attrs: { shape: targetShape }\n            });\n            intermediates.push(preluActivationWeights);\n        }\n    }\n    if (bias != null) {\n        const targetShape = getShapeForBatchMatMul(bias.shape, isChannelsLast);\n        if (targetShape != null) {\n            bias = reshape({ inputs: { x: bias }, backend, attrs: { shape: targetShape } });\n            intermediates.push(bias);\n        }\n    }\n    // TODO: Once reduction ops are packed, batchMatMul will always be packed\n    // and we can remove this condition.\n    const batchMatMulWillBeUnpacked = (outerShapeX === 1 || outerShapeFilter === 1) &&\n        sharedMatMulDim > MATMUL_SHARED_DIM_THRESHOLD;\n    // The algorithm in the if condition assumes (1) the output will be packed,\n    // (2) x is packed, (3) x isChannelsLast, (4)  x's packed texture is already\n    // on GPU, (5) col is odd, (6) the width, height and inChannels are the same\n    // for xTexData.shape and xShape.\n    const canOptimize = !batchMatMulWillBeUnpacked && xTexData.isPacked &&\n        isChannelsLast && xTexData.texture != null && xShape[2] % 2 !== 0 &&\n        util.arraysEqual(xTexData.shape.slice(-3), xShape.slice(-3));\n    if (canOptimize) {\n        // We avoid expensive packed 2x2 reshape by padding col count to next,\n        // even number. When col is odd, the result of packed batchMatMul is\n        // the same (has the same texture layout and and values in the texture) as\n        // it is for next even col. We make the odd-cols tensor to look like\n        // even-cols tensor before the operation and, after the batchMatMul,\n        // fix the even-cols result to have odd number of cols.\n        const targetShape = xShape[0] * xShape[1] * (xShape[2] + 1);\n        const xReshaped = {\n            dataId: x.dataId,\n            shape: [1, targetShape, convInfo.inChannels],\n            dtype: x.dtype\n        };\n        // xTexData.shape gets referenced from GPGPUBinary.inShapeInfos.\n        // Decrementing col count, after batchMatMul->...->compileProgram leads to\n        // invalid col count within the reference in GPGPUBinary.inShapeInfos.\n        // Alternative fix would be to provide a copy to GPGPUBinary.inShapeInfos\n        // in compileProgram method, but that would affect compilation of all\n        // programs - instead, provide a copy here, with even col count, before\n        // calling batchMatMul->...->compileProgram and after that, the original\n        // xTexData.shape is restored.\n        const originalXTexDataShape = xTexData.shape;\n        xTexData.shape = xTexData.shape.slice();\n        xTexData.shape[xTexData.shape.length - 2]++;\n        util.assert(webgl_util.isReshapeFree(xTexData.shape, xReshaped.shape), () => `packed reshape ${xTexData.shape} to ${xReshaped.shape} isn't free`);\n        const filterReshaped = reshape({\n            inputs: { x: filter },\n            backend,\n            attrs: { shape: [1, convInfo.inChannels, convInfo.outChannels] }\n        });\n        intermediates.push(filterReshaped);\n        const pointwiseConv = batchMatMulImpl({\n            a: xReshaped,\n            b: filterReshaped,\n            backend,\n            transposeA,\n            transposeB,\n            bias,\n            activation,\n            preluActivationWeights,\n            leakyreluAlpha\n        });\n        const pointwiseConvTexData = backend.texData.get(pointwiseConv.dataId);\n        util.assert(pointwiseConvTexData.isPacked, () => 'batchMatMul result is expected to be packed');\n        // Restore the input shape to original.\n        xTexData.shape = originalXTexDataShape;\n        // Set the output shape - there is no need for expensive reshape as data\n        // layout is already correct.\n        pointwiseConvTexData.shape = convInfo.outShape;\n        out = identity({ inputs: { x: pointwiseConv }, backend });\n        out.shape = convInfo.outShape;\n        intermediates.push(pointwiseConv);\n    }\n    else {\n        const numCols = convInfo.outHeight * convInfo.outWidth;\n        const xReshaped = reshape({\n            inputs: { x },\n            backend,\n            attrs: {\n                shape: isChannelsLast ?\n                    [convInfo.batchSize, numCols, convInfo.inChannels] :\n                    [convInfo.batchSize, convInfo.inChannels, numCols]\n            }\n        });\n        const filterReshaped = reshape({\n            inputs: { x: filter },\n            backend,\n            attrs: { shape: [1, convInfo.inChannels, convInfo.outChannels] }\n        });\n        const result = batchMatMulImpl({\n            a: isChannelsLast ? xReshaped : filterReshaped,\n            b: isChannelsLast ? filterReshaped : xReshaped,\n            transposeA: !isChannelsLast,\n            transposeB,\n            backend,\n            bias,\n            activation,\n            preluActivationWeights,\n            leakyreluAlpha\n        });\n        out = reshape({ inputs: { x: result }, backend, attrs: { shape: convInfo.outShape } });\n        intermediates.push(xReshaped);\n        intermediates.push(filterReshaped);\n        intermediates.push(result);\n    }\n    for (const i of intermediates) {\n        backend.disposeIntermediateTensorInfo(i);\n    }\n    return out;\n}\n// Implements the im2row algorithm as outlined in \"High Performance\n// Convolutional Neural Networks for Document Processing\" (Suvisoft, 2006)\nexport function conv2dWithIm2Row({ x, filter, convInfo, backend, bias = null, preluActivationWeights = null, leakyreluAlpha = 0, activation = null }) {\n    // Rearranges conv2d input so each block to be convolved over forms the\n    // column of a new matrix with shape [filterWidth * filterHeight *\n    // inChannels, outHeight * outWidth]. The filter is also rearranged so each\n    // output channel forms a row of a new matrix with shape [outChannels,\n    // filterWidth * filterHeight * inChannels]. The convolution is then\n    // computed by multiplying these matrices and reshaping the result.\n    const { filterWidth, filterHeight, inChannels, outWidth, outHeight, dataFormat } = convInfo;\n    const isChannelsLast = dataFormat === 'channelsLast';\n    const sharedDim = filterWidth * filterHeight * inChannels;\n    const numCols = outHeight * outWidth;\n    const x2ColShape = [convInfo.batchSize, sharedDim, numCols];\n    const transposeA = true;\n    const transposeB = false;\n    const intermediates = [];\n    if (preluActivationWeights != null) {\n        const targetShape = getShapeForBatchMatMul(preluActivationWeights.shape, isChannelsLast);\n        if (targetShape != null) {\n            preluActivationWeights = reshape({\n                inputs: { x: preluActivationWeights },\n                backend,\n                attrs: { shape: targetShape }\n            });\n            intermediates.push(preluActivationWeights);\n        }\n    }\n    if (bias != null) {\n        const targetShape = getShapeForBatchMatMul(bias.shape, isChannelsLast);\n        if (targetShape != null) {\n            bias = reshape({ inputs: { x: bias }, backend, attrs: { shape: targetShape } });\n            intermediates.push(bias);\n        }\n    }\n    const w2Row = reshape({\n        inputs: { x: filter },\n        backend,\n        attrs: { shape: [1, sharedDim, util.sizeFromShape(filter.shape) / sharedDim] }\n    });\n    intermediates.push(w2Row);\n    const im2ColProgram = new Im2ColPackedProgram(x2ColShape, convInfo);\n    const customValues = [\n        x.shape, [convInfo.padInfo.top, convInfo.padInfo.left],\n        [convInfo.strideHeight, convInfo.strideWidth],\n        [convInfo.dilationHeight, convInfo.dilationWidth], [convInfo.inChannels],\n        [convInfo.filterWidth * convInfo.inChannels], [convInfo.outWidth]\n    ];\n    const im2Col = backend.runWebGLProgram(im2ColProgram, [x], 'float32', customValues);\n    const im2ColReshaped = reshape({ inputs: { x: im2Col }, backend, attrs: { shape: x2ColShape } });\n    intermediates.push(im2Col);\n    intermediates.push(im2ColReshaped);\n    const hasBias = bias != null;\n    const hasPreluActivationWeights = preluActivationWeights != null;\n    const hasLeakyreluAlpha = activation === 'leakyrelu';\n    const fusedActivation = activation ? mapActivationToShaderProgram(activation, true) : null;\n    const matmulProgram = new MatMulPackedProgram(isChannelsLast ? im2ColReshaped.shape :\n        w2Row.shape, isChannelsLast ? w2Row.shape :\n        im2ColReshaped.shape, isChannelsLast ? [convInfo.batchSize, numCols, convInfo.outChannels] :\n        [convInfo.batchSize, convInfo.outChannels, numCols], transposeA, transposeB, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n    const inputs = isChannelsLast ? [im2ColReshaped, w2Row] : [w2Row, im2ColReshaped];\n    if (bias) {\n        inputs.push(bias);\n    }\n    if (hasPreluActivationWeights) {\n        inputs.push(preluActivationWeights);\n    }\n    if (hasLeakyreluAlpha) {\n        const $leakyreluAlpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(leakyreluAlpha, 'float32'));\n        inputs.push($leakyreluAlpha);\n        intermediates.push($leakyreluAlpha);\n    }\n    const product = backend.runWebGLProgram(matmulProgram, inputs, 'float32');\n    const out = reshape({ inputs: { x: product }, backend, attrs: { shape: convInfo.outShape } });\n    intermediates.push(product);\n    for (const i of intermediates) {\n        backend.disposeIntermediateTensorInfo(i);\n    }\n    return out;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ29udjJEX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUtyRSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNoRixPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUN6RCxPQUFPLEtBQUssVUFBVSxNQUFNLGVBQWUsQ0FBQztBQUU1QyxPQUFPLEVBQUMsZUFBZSxFQUFFLDJCQUEyQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDaEYsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBYWxDLDBFQUEwRTtBQUMxRSw0RUFBNEU7QUFDNUUsZ0RBQWdEO0FBQ2hELEVBQUU7QUFDRixzRUFBc0U7QUFDdEUsb0VBQW9FO0FBQ3BFLEVBQUU7QUFDRix1RUFBdUU7QUFDdkUsMEVBQTBFO0FBQzFFLHFFQUFxRTtBQUNyRSx3QkFBd0I7QUFDeEIsK0hBQStIO0FBQy9ILFNBQVMsc0JBQXNCLENBQzNCLEtBQWUsRUFBRSxjQUF1QjtJQUMxQyxNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzVCLElBQUksTUFBTSxJQUFJLENBQUMsRUFBRTtRQUNmLE9BQU8sY0FBYyxDQUFDLENBQUM7WUFDbkI7Z0JBQ0UsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVc7Z0JBQ2pDLEtBQUss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QUFDLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztJQUN2RSxJQUFJLElBQUksRUFBRTtRQUNSLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDbkI7SUFDRCxJQUFJLHlCQUF5QixFQUFFO1FBQzdCLE1BQU0sQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztLQUNyQztJQUNELElBQUksaUJBQWlCLEVBQUU7UUFDckIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDMUMsRUFBRSxFQUFFLFNBQVMsRUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBaUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDN0IsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUNyQztJQUNELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRSxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQ2YsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXhFLGFBQWEsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDNUIsS0FBSyxNQUFNLENBQUMsSUFBSSxhQUFhLEVBQUU7UUFDN0IsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQzFDO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuLy8gaW1wb3J0IHthc3NlcnRBbmRHZXRCcm9hZGNhc3RTaGFwZX0gZnJvbVxuLy8gJy4uLy4uLy4uL3RmanMtY29yZS9zcmMvb3BzL2Jyb2FkY2FzdF91dGlsJztcbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0ltMkNvbFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2ltMmNvbF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7bWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge01hdE11bFBhY2tlZFByb2dyYW19IGZyb20gJy4uL211bG1hdF9wYWNrZWRfZ3B1JztcbmltcG9ydCAqIGFzIHdlYmdsX3V0aWwgZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5cbmltcG9ydCB7YmF0Y2hNYXRNdWxJbXBsLCBNQVRNVUxfU0hBUkVEX0RJTV9USFJFU0hPTER9IGZyb20gJy4vQmF0Y2hNYXRNdWxfaW1wbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxudHlwZSBDb252MkRDb25maWcgPSB7XG4gIHg6IFRlbnNvckluZm8sXG4gIGZpbHRlcjogVGVuc29ySW5mbyxcbiAgY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBiaWFzPzogVGVuc29ySW5mbyxcbiAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cz86IFRlbnNvckluZm8sXG4gIGxlYWt5cmVsdUFscGhhPzogbnVtYmVyLFxuICBhY3RpdmF0aW9uPzogYmFja2VuZF91dGlsLkFjdGl2YXRpb25cbn07XG5cbi8vIEJvdGggY29udjJkQnlNYXRNdWwgYW5kIGNvbnYyZFdpdGhJbTJSb3cgZnVzZSBoZWlnaHQgYW5kIHdpZHRoIGludG8gb25lXG4vLyBkaW1lbnNpb24gdG8gY29tcHV0ZSBiYXRjaE1hdE11bCwgc28gYmlhcyBhbmQgYWN0aXZhdGlvbiB3ZWlnaHRzIGFyZSBhbHNvXG4vLyBzdXBwb3NlZCB0byBmdXNlIHRoZSB0d28gZGltZW5zaW9ucyBpbnRvIG9uZS5cbi8vXG4vLyBUaGlzIGZ1bmN0aW9uIGNvbXB1dGVzIHRoZSB0YXJnZXQgc2hhcGUgZm9yIGZ1c2luZyBoZWlnaHQgYW5kIHdpZHRoXG4vLyBkaW1lbnNpb25zLiBSZXR1cm5pbmcgbnVsbCBtZWFucyB0aGUgc2hhcGUgaXMgYWxyZWFkeSBjb21wYXRpYmxlLlxuLy9cbi8vIEV2ZW4gdGhvdWdoIHRoZSBiaWFzIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBhIDMtRCBvciBhIDQtRCAoaW5jbHVkaW5nXG4vLyBiYXRjaCkgdGVuc29yIGFuZCBQUmVMVSBhY3RpdmlhdGlvbiB3ZWlnaHRzIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBhIDQtRFxuLy8gdGVuc29yLCB3ZSBzdGlsbCBuZWVkIHRvIHN1cHBvcnQgdGhlbSwgYmVjYXVzZSB3ZSBoYXZlbid0IGRpc2FibGVkXG4vLyB0aGVtIGZvciBOSFdDIGZvcm1hdC5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RmanMvYmxvYi9iNTNiZDQ3ZTg4MDM2N2FlNTc0OTNmMGVhNjI4YWJhZjA4ZGIyZDVkL3RmanMtY29yZS9zcmMvb3BzL2Z1c2VkL2NvbnYyZC50cyNMMTgxLUwxOTZcbmZ1bmN0aW9uIGdldFNoYXBlRm9yQmF0Y2hNYXRNdWwoXG4gICAgc2hhcGU6IG51bWJlcltdLCBpc0NoYW5uZWxzTGFzdDogYm9vbGVhbik6IG51bWJlcltdIHtcbiAgY29uc3QgbGVuZ3RoID0gc2hhcGUubGVuZ3RoO1xuICBpZiAobGVuZ3RoID49IDMpIHtcbiAgICByZXR1cm4gaXNDaGFubmVsc0xhc3QgP1xuICAgICAgICBbXG4gICAgICAgICAgLi4uc2hhcGUuc2xpY2UoMCwgLTMpIC8qIGJhdGNoICovLFxuICAgICAgICAgIHNoYXBlW2xlbmd0aCAtIDNdICogc2hhcGVbbGVuZ3RoIC0gMl0gLyogaGVpZ2h0ICogd2lkdGggKi8sXG4gICAgICAgICAgc2hhcGVbbGVuZ3RoIC0gMV0gLyogY2hhbm5lbCAqL1xuICAgICAgICBdIDpcbiAgICAgICAgW1xuICAgICAgICAgIC4uLnNoYXBlLnNsaWNlKDAsIC0zKSAvKiBiYXRjaCAqLywgc2hhcGVbbGVuZ3RoIC0gM10gLyogY2hhbm5lbCAqLyxcbiAgICAgICAgICBzaGFwZVtsZW5ndGggLSAyXSAqIHNoYXBlW2xlbmd0aCAtIDFdIC8qIGhlaWdodCAqIHdpZHRoICovXG4gICAgICAgIF07XG4gIH0gZWxzZSBpZiAoIWlzQ2hhbm5lbHNMYXN0ICYmIGxlbmd0aCA9PT0gMSAmJiBzaGFwZVswXSA+IDEpIHtcbiAgICByZXR1cm4gW3NoYXBlWzBdLCAxXTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vLyBGb3IgMXgxIGtlcm5lbHMgdGhhdCBpdGVyYXRlIHRocm91Z2ggZXZlcnkgcG9pbnQgaW4gdGhlIGlucHV0LCBjb252b2x1dGlvblxuLy8gY2FuIGJlIGV4cHJlc3NlZCBhcyBtYXRyaXggbXVsdGlwbGljYXRpb24gKHdpdGhvdXQgbmVlZCBmb3IgbWVtb3J5XG4vLyByZW1hcHBpbmcpLlxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZEJ5TWF0TXVsKHtcbiAgeCxcbiAgZmlsdGVyLFxuICBjb252SW5mbyxcbiAgYmFja2VuZCxcbiAgYmlhcyA9IG51bGwsXG4gIHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBudWxsLFxuICBsZWFreXJlbHVBbHBoYSA9IDAsXG4gIGFjdGl2YXRpb24gPSBudWxsXG59OiBDb252MkRDb25maWcpIHtcbiAgLy8gUmVzaGFwZXMgY29udjJEIGlucHV0IHRvIDJEIHRlbnNvcnMsIHVzZXMgbWF0TXVsIGFuZCB0aGVuIHJlc2hhcGUgdGhlXG4gIC8vIHJlc3VsdCBmcm9tIDJEIHRvIDRELlxuICBjb25zdCB4U2hhcGUgPSB4LnNoYXBlO1xuICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuICBjb25zdCBzaGFyZWRNYXRNdWxEaW0gPSBjb252SW5mby5pbkNoYW5uZWxzO1xuICBjb25zdCBvdXRlclNoYXBlWCA9IHhTaGFwZVswXSAqIHhTaGFwZVsxXSAqIHhTaGFwZVsyXTtcbiAgY29uc3Qgb3V0ZXJTaGFwZUZpbHRlciA9IGNvbnZJbmZvLm91dENoYW5uZWxzO1xuICBjb25zdCBpc0NoYW5uZWxzTGFzdCA9IGNvbnZJbmZvLmRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnO1xuICBjb25zdCB0cmFuc3Bvc2VBID0gZmFsc2U7XG4gIGNvbnN0IHRyYW5zcG9zZUIgPSBmYWxzZTtcblxuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICBpZiAocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsKSB7XG4gICAgY29uc3QgdGFyZ2V0U2hhcGUgPVxuICAgICAgICBnZXRTaGFwZUZvckJhdGNoTWF0TXVsKHByZWx1QWN0aXZhdGlvbldlaWdodHMuc2hhcGUsIGlzQ2hhbm5lbHNMYXN0KTtcbiAgICBpZiAodGFyZ2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyA9IHJlc2hhcGUoe1xuICAgICAgICBpbnB1dHM6IHt4OiBwcmVsdUFjdGl2YXRpb25XZWlnaHRzfSxcbiAgICAgICAgYmFja2VuZCxcbiAgICAgICAgYXR0cnM6IHtzaGFwZTogdGFyZ2V0U2hhcGV9XG4gICAgICB9KTtcbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChwcmVsdUFjdGl2YXRpb25XZWlnaHRzKTtcbiAgICB9XG4gIH1cblxuICBpZiAoYmlhcyAhPSBudWxsKSB7XG4gICAgY29uc3QgdGFyZ2V0U2hhcGUgPSBnZXRTaGFwZUZvckJhdGNoTWF0TXVsKGJpYXMuc2hhcGUsIGlzQ2hhbm5lbHNMYXN0KTtcbiAgICBpZiAodGFyZ2V0U2hhcGUgIT0gbnVsbCkge1xuICAgICAgYmlhcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IGJpYXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB0YXJnZXRTaGFwZX19KTtcbiAgICAgIGludGVybWVkaWF0ZXMucHVzaChiaWFzKTtcbiAgICB9XG4gIH1cblxuICAvLyBUT0RPOiBPbmNlIHJlZHVjdGlvbiBvcHMgYXJlIHBhY2tlZCwgYmF0Y2hNYXRNdWwgd2lsbCBhbHdheXMgYmUgcGFja2VkXG4gIC8vIGFuZCB3ZSBjYW4gcmVtb3ZlIHRoaXMgY29uZGl0aW9uLlxuICBjb25zdCBiYXRjaE1hdE11bFdpbGxCZVVucGFja2VkID1cbiAgICAgIChvdXRlclNoYXBlWCA9PT0gMSB8fCBvdXRlclNoYXBlRmlsdGVyID09PSAxKSAmJlxuICAgICAgc2hhcmVkTWF0TXVsRGltID4gTUFUTVVMX1NIQVJFRF9ESU1fVEhSRVNIT0xEO1xuXG4gIC8vIFRoZSBhbGdvcml0aG0gaW4gdGhlIGlmIGNvbmRpdGlvbiBhc3N1bWVzICgxKSB0aGUgb3V0cHV0IHdpbGwgYmUgcGFja2VkLFxuICAvLyAoMikgeCBpcyBwYWNrZWQsICgzKSB4IGlzQ2hhbm5lbHNMYXN0LCAoNCkgIHgncyBwYWNrZWQgdGV4dHVyZSBpcyBhbHJlYWR5XG4gIC8vIG9uIEdQVSwgKDUpIGNvbCBpcyBvZGQsICg2KSB0aGUgd2lkdGgsIGhlaWdodCBhbmQgaW5DaGFubmVscyBhcmUgdGhlIHNhbWVcbiAgLy8gZm9yIHhUZXhEYXRhLnNoYXBlIGFuZCB4U2hhcGUuXG4gIGNvbnN0IGNhbk9wdGltaXplID0gIWJhdGNoTWF0TXVsV2lsbEJlVW5wYWNrZWQgJiYgeFRleERhdGEuaXNQYWNrZWQgJiZcbiAgICAgIGlzQ2hhbm5lbHNMYXN0ICYmIHhUZXhEYXRhLnRleHR1cmUgIT0gbnVsbCAmJiB4U2hhcGVbMl0gJSAyICE9PSAwICYmXG4gICAgICB1dGlsLmFycmF5c0VxdWFsKHhUZXhEYXRhLnNoYXBlLnNsaWNlKC0zKSwgeFNoYXBlLnNsaWNlKC0zKSk7XG5cbiAgaWYgKGNhbk9wdGltaXplKSB7XG4gICAgLy8gV2UgYXZvaWQgZXhwZW5zaXZlIHBhY2tlZCAyeDIgcmVzaGFwZSBieSBwYWRkaW5nIGNvbCBjb3VudCB0byBuZXh0LFxuICAgIC8vIGV2ZW4gbnVtYmVyLiBXaGVuIGNvbCBpcyBvZGQsIHRoZSByZXN1bHQgb2YgcGFja2VkIGJhdGNoTWF0TXVsIGlzXG4gICAgLy8gdGhlIHNhbWUgKGhhcyB0aGUgc2FtZSB0ZXh0dXJlIGxheW91dCBhbmQgYW5kIHZhbHVlcyBpbiB0aGUgdGV4dHVyZSkgYXNcbiAgICAvLyBpdCBpcyBmb3IgbmV4dCBldmVuIGNvbC4gV2UgbWFrZSB0aGUgb2RkLWNvbHMgdGVuc29yIHRvIGxvb2sgbGlrZVxuICAgIC8vIGV2ZW4tY29scyB0ZW5zb3IgYmVmb3JlIHRoZSBvcGVyYXRpb24gYW5kLCBhZnRlciB0aGUgYmF0Y2hNYXRNdWwsXG4gICAgLy8gZml4IHRoZSBldmVuLWNvbHMgcmVzdWx0IHRvIGhhdmUgb2RkIG51bWJlciBvZiBjb2xzLlxuICAgIGNvbnN0IHRhcmdldFNoYXBlID0geFNoYXBlWzBdICogeFNoYXBlWzFdICogKHhTaGFwZVsyXSArIDEpO1xuICAgIGNvbnN0IHhSZXNoYXBlZDogVGVuc29ySW5mbyA9IHtcbiAgICAgIGRhdGFJZDogeC5kYXRhSWQsXG4gICAgICBzaGFwZTogWzEsIHRhcmdldFNoYXBlLCBjb252SW5mby5pbkNoYW5uZWxzXSxcbiAgICAgIGR0eXBlOiB4LmR0eXBlXG4gICAgfTtcbiAgICAvLyB4VGV4RGF0YS5zaGFwZSBnZXRzIHJlZmVyZW5jZWQgZnJvbSBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgLy8gRGVjcmVtZW50aW5nIGNvbCBjb3VudCwgYWZ0ZXIgYmF0Y2hNYXRNdWwtPi4uLi0+Y29tcGlsZVByb2dyYW0gbGVhZHMgdG9cbiAgICAvLyBpbnZhbGlkIGNvbCBjb3VudCB3aXRoaW4gdGhlIHJlZmVyZW5jZSBpbiBHUEdQVUJpbmFyeS5pblNoYXBlSW5mb3MuXG4gICAgLy8gQWx0ZXJuYXRpdmUgZml4IHdvdWxkIGJlIHRvIHByb3ZpZGUgYSBjb3B5IHRvIEdQR1BVQmluYXJ5LmluU2hhcGVJbmZvc1xuICAgIC8vIGluIGNvbXBpbGVQcm9ncmFtIG1ldGhvZCwgYnV0IHRoYXQgd291bGQgYWZmZWN0IGNvbXBpbGF0aW9uIG9mIGFsbFxuICAgIC8vIHByb2dyYW1zIC0gaW5zdGVhZCwgcHJvdmlkZSBhIGNvcHkgaGVyZSwgd2l0aCBldmVuIGNvbCBjb3VudCwgYmVmb3JlXG4gICAgLy8gY2FsbGluZyBiYXRjaE1hdE11bC0+Li4uLT5jb21waWxlUHJvZ3JhbSBhbmQgYWZ0ZXIgdGhhdCwgdGhlIG9yaWdpbmFsXG4gICAgLy8geFRleERhdGEuc2hhcGUgaXMgcmVzdG9yZWQuXG4gICAgY29uc3Qgb3JpZ2luYWxYVGV4RGF0YVNoYXBlID0geFRleERhdGEuc2hhcGU7XG4gICAgeFRleERhdGEuc2hhcGUgPSB4VGV4RGF0YS5zaGFwZS5zbGljZSgpO1xuICAgIHhUZXhEYXRhLnNoYXBlW3hUZXhEYXRhLnNoYXBlLmxlbmd0aCAtIDJdKys7XG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHdlYmdsX3V0aWwuaXNSZXNoYXBlRnJlZSh4VGV4RGF0YS5zaGFwZSwgeFJlc2hhcGVkLnNoYXBlKSxcbiAgICAgICAgKCkgPT4gYHBhY2tlZCByZXNoYXBlICR7eFRleERhdGEuc2hhcGV9IHRvICR7XG4gICAgICAgICAgICB4UmVzaGFwZWQuc2hhcGV9IGlzbid0IGZyZWVgKTtcbiAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge3NoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdfVxuICAgIH0pO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChmaWx0ZXJSZXNoYXBlZCk7XG4gICAgY29uc3QgcG9pbnR3aXNlQ29udiA9IGJhdGNoTWF0TXVsSW1wbCh7XG4gICAgICBhOiB4UmVzaGFwZWQsXG4gICAgICBiOiBmaWx0ZXJSZXNoYXBlZCxcbiAgICAgIGJhY2tlbmQsXG4gICAgICB0cmFuc3Bvc2VBLFxuICAgICAgdHJhbnNwb3NlQixcbiAgICAgIGJpYXMsXG4gICAgICBhY3RpdmF0aW9uLFxuICAgICAgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGxlYWt5cmVsdUFscGhhXG4gICAgfSk7XG5cbiAgICBjb25zdCBwb2ludHdpc2VDb252VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQocG9pbnR3aXNlQ29udi5kYXRhSWQpO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBwb2ludHdpc2VDb252VGV4RGF0YS5pc1BhY2tlZCxcbiAgICAgICAgKCkgPT4gJ2JhdGNoTWF0TXVsIHJlc3VsdCBpcyBleHBlY3RlZCB0byBiZSBwYWNrZWQnKTtcbiAgICAvLyBSZXN0b3JlIHRoZSBpbnB1dCBzaGFwZSB0byBvcmlnaW5hbC5cbiAgICB4VGV4RGF0YS5zaGFwZSA9IG9yaWdpbmFsWFRleERhdGFTaGFwZTtcbiAgICAvLyBTZXQgdGhlIG91dHB1dCBzaGFwZSAtIHRoZXJlIGlzIG5vIG5lZWQgZm9yIGV4cGVuc2l2ZSByZXNoYXBlIGFzIGRhdGFcbiAgICAvLyBsYXlvdXQgaXMgYWxyZWFkeSBjb3JyZWN0LlxuICAgIHBvaW50d2lzZUNvbnZUZXhEYXRhLnNoYXBlID0gY29udkluZm8ub3V0U2hhcGU7XG5cbiAgICBvdXQgPSBpZGVudGl0eSh7aW5wdXRzOiB7eDogcG9pbnR3aXNlQ29udn0sIGJhY2tlbmR9KTtcbiAgICBvdXQuc2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGludGVybWVkaWF0ZXMucHVzaChwb2ludHdpc2VDb252KTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBudW1Db2xzID0gY29udkluZm8ub3V0SGVpZ2h0ICogY29udkluZm8ub3V0V2lkdGg7XG4gICAgY29uc3QgeFJlc2hhcGVkID0gcmVzaGFwZSh7XG4gICAgICBpbnB1dHM6IHt4fSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge1xuICAgICAgICBzaGFwZTogaXNDaGFubmVsc0xhc3QgP1xuICAgICAgICAgICAgW2NvbnZJbmZvLmJhdGNoU2l6ZSwgbnVtQ29scywgY29udkluZm8uaW5DaGFubmVsc10gOlxuICAgICAgICAgICAgW2NvbnZJbmZvLmJhdGNoU2l6ZSwgY29udkluZm8uaW5DaGFubmVscywgbnVtQ29sc11cbiAgICAgIH1cbiAgICB9KTtcbiAgICBjb25zdCBmaWx0ZXJSZXNoYXBlZCA9IHJlc2hhcGUoe1xuICAgICAgaW5wdXRzOiB7eDogZmlsdGVyfSxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBhdHRyczoge3NoYXBlOiBbMSwgY29udkluZm8uaW5DaGFubmVscywgY29udkluZm8ub3V0Q2hhbm5lbHNdfVxuICAgIH0pO1xuICAgIGNvbnN0IHJlc3VsdCA9IGJhdGNoTWF0TXVsSW1wbCh7XG4gICAgICBhOiBpc0NoYW5uZWxzTGFzdCA/IHhSZXNoYXBlZCA6IGZpbHRlclJlc2hhcGVkLFxuICAgICAgYjogaXNDaGFubmVsc0xhc3QgPyBmaWx0ZXJSZXNoYXBlZCA6IHhSZXNoYXBlZCxcbiAgICAgIHRyYW5zcG9zZUE6ICFpc0NoYW5uZWxzTGFzdCxcbiAgICAgIHRyYW5zcG9zZUIsXG4gICAgICBiYWNrZW5kLFxuICAgICAgYmlhcyxcbiAgICAgIGFjdGl2YXRpb24sXG4gICAgICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgbGVha3lyZWx1QWxwaGFcbiAgICB9KTtcblxuICAgIG91dCA9IHJlc2hhcGUoXG4gICAgICAgIHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBjb252SW5mby5vdXRTaGFwZX19KTtcblxuICAgIGludGVybWVkaWF0ZXMucHVzaCh4UmVzaGFwZWQpO1xuICAgIGludGVybWVkaWF0ZXMucHVzaChmaWx0ZXJSZXNoYXBlZCk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKHJlc3VsdCk7XG4gIH1cblxuICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG4vLyBJbXBsZW1lbnRzIHRoZSBpbTJyb3cgYWxnb3JpdGhtIGFzIG91dGxpbmVkIGluIFwiSGlnaCBQZXJmb3JtYW5jZVxuLy8gQ29udm9sdXRpb25hbCBOZXVyYWwgTmV0d29ya3MgZm9yIERvY3VtZW50IFByb2Nlc3NpbmdcIiAoU3V2aXNvZnQsIDIwMDYpXG5leHBvcnQgZnVuY3Rpb24gY29udjJkV2l0aEltMlJvdyh7XG4gIHgsXG4gIGZpbHRlcixcbiAgY29udkluZm8sXG4gIGJhY2tlbmQsXG4gIGJpYXMgPSBudWxsLFxuICBwcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gbnVsbCxcbiAgbGVha3lyZWx1QWxwaGEgPSAwLFxuICBhY3RpdmF0aW9uID0gbnVsbFxufTogQ29udjJEQ29uZmlnKSB7XG4gIC8vIFJlYXJyYW5nZXMgY29udjJkIGlucHV0IHNvIGVhY2ggYmxvY2sgdG8gYmUgY29udm9sdmVkIG92ZXIgZm9ybXMgdGhlXG4gIC8vIGNvbHVtbiBvZiBhIG5ldyBtYXRyaXggd2l0aCBzaGFwZSBbZmlsdGVyV2lkdGggKiBmaWx0ZXJIZWlnaHQgKlxuICAvLyBpbkNoYW5uZWxzLCBvdXRIZWlnaHQgKiBvdXRXaWR0aF0uIFRoZSBmaWx0ZXIgaXMgYWxzbyByZWFycmFuZ2VkIHNvIGVhY2hcbiAgLy8gb3V0cHV0IGNoYW5uZWwgZm9ybXMgYSByb3cgb2YgYSBuZXcgbWF0cml4IHdpdGggc2hhcGUgW291dENoYW5uZWxzLFxuICAvLyBmaWx0ZXJXaWR0aCAqIGZpbHRlckhlaWdodCAqIGluQ2hhbm5lbHNdLiBUaGUgY29udm9sdXRpb24gaXMgdGhlblxuICAvLyBjb21wdXRlZCBieSBtdWx0aXBseWluZyB0aGVzZSBtYXRyaWNlcyBhbmQgcmVzaGFwaW5nIHRoZSByZXN1bHQuXG4gIGNvbnN0IHtcbiAgICBmaWx0ZXJXaWR0aCxcbiAgICBmaWx0ZXJIZWlnaHQsXG4gICAgaW5DaGFubmVscyxcbiAgICBvdXRXaWR0aCxcbiAgICBvdXRIZWlnaHQsXG4gICAgZGF0YUZvcm1hdFxuICB9ID0gY29udkluZm87XG5cbiAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcblxuICBjb25zdCBzaGFyZWREaW0gPSBmaWx0ZXJXaWR0aCAqIGZpbHRlckhlaWdodCAqIGluQ2hhbm5lbHM7XG4gIGNvbnN0IG51bUNvbHMgPSBvdXRIZWlnaHQgKiBvdXRXaWR0aDtcbiAgY29uc3QgeDJDb2xTaGFwZSA9IFtjb252SW5mby5iYXRjaFNpemUsIHNoYXJlZERpbSwgbnVtQ29sc107XG4gIGNvbnN0IHRyYW5zcG9zZUEgPSB0cnVlO1xuICBjb25zdCB0cmFuc3Bvc2VCID0gZmFsc2U7XG5cbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgaWYgKHByZWx1QWN0aXZhdGlvbldlaWdodHMgIT0gbnVsbCkge1xuICAgIGNvbnN0IHRhcmdldFNoYXBlID1cbiAgICAgICAgZ2V0U2hhcGVGb3JCYXRjaE1hdE11bChwcmVsdUFjdGl2YXRpb25XZWlnaHRzLnNoYXBlLCBpc0NoYW5uZWxzTGFzdCk7XG4gICAgaWYgKHRhcmdldFNoYXBlICE9IG51bGwpIHtcbiAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMgPSByZXNoYXBlKHtcbiAgICAgICAgaW5wdXRzOiB7eDogcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30sXG4gICAgICAgIGJhY2tlbmQsXG4gICAgICAgIGF0dHJzOiB7c2hhcGU6IHRhcmdldFNoYXBlfVxuICAgICAgfSk7XG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2gocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKGJpYXMgIT0gbnVsbCkge1xuICAgIGNvbnN0IHRhcmdldFNoYXBlID0gZ2V0U2hhcGVGb3JCYXRjaE1hdE11bChiaWFzLnNoYXBlLCBpc0NoYW5uZWxzTGFzdCk7XG4gICAgaWYgKHRhcmdldFNoYXBlICE9IG51bGwpIHtcbiAgICAgIGJpYXMgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiBiaWFzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogdGFyZ2V0U2hhcGV9fSk7XG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2goYmlhcyk7XG4gICAgfVxuICB9XG5cbiAgY29uc3QgdzJSb3cgPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4OiBmaWx0ZXJ9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtzaGFwZTogWzEsIHNoYXJlZERpbSwgdXRpbC5zaXplRnJvbVNoYXBlKGZpbHRlci5zaGFwZSkgLyBzaGFyZWREaW1dfVxuICB9KTtcbiAgaW50ZXJtZWRpYXRlcy5wdXNoKHcyUm93KTtcblxuICBjb25zdCBpbTJDb2xQcm9ncmFtID0gbmV3IEltMkNvbFBhY2tlZFByb2dyYW0oeDJDb2xTaGFwZSwgY29udkluZm8pO1xuICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbXG4gICAgeC5zaGFwZSwgW2NvbnZJbmZvLnBhZEluZm8udG9wLCBjb252SW5mby5wYWRJbmZvLmxlZnRdLFxuICAgIFtjb252SW5mby5zdHJpZGVIZWlnaHQsIGNvbnZJbmZvLnN0cmlkZVdpZHRoXSxcbiAgICBbY29udkluZm8uZGlsYXRpb25IZWlnaHQsIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGhdLCBbY29udkluZm8uaW5DaGFubmVsc10sXG4gICAgW2NvbnZJbmZvLmZpbHRlcldpZHRoICogY29udkluZm8uaW5DaGFubmVsc10sIFtjb252SW5mby5vdXRXaWR0aF1cbiAgXTtcbiAgY29uc3QgaW0yQ29sID1cbiAgICAgIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKGltMkNvbFByb2dyYW0sIFt4XSwgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuICBjb25zdCBpbTJDb2xSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBpbTJDb2x9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB4MkNvbFNoYXBlfX0pO1xuXG4gIGludGVybWVkaWF0ZXMucHVzaChpbTJDb2wpO1xuICBpbnRlcm1lZGlhdGVzLnB1c2goaW0yQ29sUmVzaGFwZWQpO1xuXG4gIGNvbnN0IGhhc0JpYXMgPSBiaWFzICE9IG51bGw7XG4gIGNvbnN0IGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMgPSBwcmVsdUFjdGl2YXRpb25XZWlnaHRzICE9IG51bGw7XG4gIGNvbnN0IGhhc0xlYWt5cmVsdUFscGhhID0gYWN0aXZhdGlvbiA9PT0gJ2xlYWt5cmVsdSc7XG4gIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9XG4gICAgICBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6IG51bGw7XG4gIGNvbnN0IG1hdG11bFByb2dyYW0gPSBuZXcgTWF0TXVsUGFja2VkUHJvZ3JhbShcbiAgICAgIGlzQ2hhbm5lbHNMYXN0ID8gaW0yQ29sUmVzaGFwZWQuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdIDpcbiAgICAgICAgICAgICAgICAgICAgICAgdzJSb3cuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgaXNDaGFubmVsc0xhc3QgPyB3MlJvdy5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gOlxuICAgICAgICAgICAgICAgICAgICAgICBpbTJDb2xSZXNoYXBlZC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpc0NoYW5uZWxzTGFzdCA/IFtjb252SW5mby5iYXRjaFNpemUsIG51bUNvbHMsIGNvbnZJbmZvLm91dENoYW5uZWxzXSA6XG4gICAgICAgICAgICAgICAgICAgICAgIFtjb252SW5mby5iYXRjaFNpemUsIGNvbnZJbmZvLm91dENoYW5uZWxzLCBudW1Db2xzXSxcbiAgICAgIHRyYW5zcG9zZUEsIHRyYW5zcG9zZUIsIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbixcbiAgICAgIGhhc1ByZWx1QWN0aXZhdGlvbldlaWdodHMsIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgY29uc3QgaW5wdXRzOiBUZW5zb3JJbmZvW10gPVxuICAgICAgaXNDaGFubmVsc0xhc3QgPyBbaW0yQ29sUmVzaGFwZWQsIHcyUm93XSA6IFt3MlJvdywgaW0yQ29sUmVzaGFwZWRdO1xuICBpZiAoYmlhcykge1xuICAgIGlucHV0cy5wdXNoKGJpYXMpO1xuICB9XG4gIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgaW5wdXRzLnB1c2gocHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyk7XG4gIH1cbiAgaWYgKGhhc0xlYWt5cmVsdUFscGhhKSB7XG4gICAgY29uc3QgJGxlYWt5cmVsdUFscGhhID0gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgdXRpbC5jcmVhdGVTY2FsYXJWYWx1ZShsZWFreXJlbHVBbHBoYSBhcyB7fSBhcyAnZmxvYXQzMicsICdmbG9hdDMyJykpO1xuICAgIGlucHV0cy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gIH1cbiAgY29uc3QgcHJvZHVjdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKG1hdG11bFByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgY29uc3Qgb3V0ID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4OiBwcm9kdWN0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogY29udkluZm8ub3V0U2hhcGV9fSk7XG5cbiAgaW50ZXJtZWRpYXRlcy5wdXNoKHByb2R1Y3QpO1xuICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oaSk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2D, env } from '@tensorflow/tfjs-core';\nimport { Conv2DProgram } from '../conv_gpu';\nimport { Conv2DPackedProgram } from '../conv_packed_gpu';\nimport { conv2dByMatMul, conv2dWithIm2Row } from './Conv2D_impl';\nimport { reshape } from './Reshape';\nexport function conv2d(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter } = inputs;\n    const { strides, pad, dataFormat, dilations, dimRoundingMode } = attrs;\n    const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n    let out;\n    if (convInfo.filterHeight === 1 && convInfo.filterWidth === 1 &&\n        convInfo.dilationHeight === 1 && convInfo.dilationWidth === 1 &&\n        convInfo.strideHeight === 1 && convInfo.strideWidth === 1 &&\n        (convInfo.padInfo.type === 'SAME' || convInfo.padInfo.type === 'VALID')) {\n        out = conv2dByMatMul({ x, filter, convInfo, backend });\n    }\n    else if (convInfo.strideWidth <= 2 && $dataFormat === 'channelsLast'\n        && env().getBool('WEBGL_EXP_CONV')) {\n        const program = new Conv2DPackedProgram(convInfo);\n        const customValues = [\n            [convInfo.padInfo.top, convInfo.padInfo.left],\n            [convInfo.strideHeight, convInfo.strideWidth],\n            [convInfo.dilationHeight, convInfo.dilationWidth],\n            [convInfo.inHeight, convInfo.inWidth]\n        ];\n        out =\n            backend.runWebGLProgram(program, [x, filter], 'float32', customValues);\n    }\n    else if (env().getBool('WEBGL_CONV_IM2COL')) {\n        out = conv2dWithIm2Row({ x, filter, convInfo, backend });\n    }\n    else {\n        const program = new Conv2DProgram(convInfo);\n        out = backend.runWebGLProgram(program, [x, filter], 'float32');\n    }\n    const outReshaped = reshape({ inputs: { x: out }, backend, attrs: { shape: convInfo.outShape } });\n    backend.disposeIntermediateTensorInfo(out);\n    return outReshaped;\n}\nexport const conv2DConfig = {\n    kernelName: Conv2D,\n    backendName: 'webgl',\n    kernelFunc: conv2d,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0NvbnYyRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBNkIsR0FBRyxFQUF1QyxNQUFNLHVCQUF1QixDQUFDO0FBR2pJLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFDLG1CQUFtQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFDdkQsT0FBTyxFQUFDLGNBQWMsRUFBRSxnQkFBZ0IsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUMvRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBQzNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRSxNQUFNLFdBQVcsR0FBRyxZQUFZLENBQUMsdUJBQXVCLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFDM0MsTUFBTSxDQUFDLEtBQXlDLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQ3pFLGVBQWUsRUFBRSxLQUFLLENBQUMsZUFBZSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQ3pELElBQUksR0FBZSxDQUFDO0lBRXBCLElBQUksUUFBUSxDQUFDLFlBQVksS0FBSyxDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsS0FBSyxDQUFDO1FBQ3pELFFBQVEsQ0FBQyxjQUFjLEtBQUssQ0FBQyxJQUFJLFFBQVEsQ0FBQyxhQUFhLEtBQUssQ0FBQztRQUM3RCxRQUFRLENBQUMsWUFBWSxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLENBQUM7UUFDekQsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksS0FBSyxNQUFNLElBQUksUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEtBQUssT0FBTyxDQUFDLEVBQUU7UUFDM0UsR0FBRyxHQUFHLGNBQWMsQ0FBQyxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDdEQ7U0FBTSxJQUFJLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxJQUFJLFdBQVcsS0FBSyxjQUFjO1dBQ2pFLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxnQkFBZ0IsQ0FBQyxFQUNoQztRQUNGLE1BQU0sT0FBTyxHQUFHLElBQUksbUJBQW1CLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUc7WUFDbkIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztZQUM3QyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQztZQUM3QyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQztZQUNqRCxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztTQUN0QyxDQUFDO1FBQ0YsR0FBRztZQUNDLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztLQUM1RTtTQUFNLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQUU7UUFDN0MsR0FBRyxHQUFHLGdCQUFnQixDQUFDLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUN4RDtTQUFNO1FBQ0wsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDNUMsR0FBRyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0tBQ2hFO0lBRUQsTUFBTSxXQUFXLEdBQ2IsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUM1RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFM0MsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252MkQsIENvbnYyREF0dHJzLCBDb252MkRJbnB1dHMsIGVudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252MkRQcm9ncmFtfSBmcm9tICcuLi9jb252X2dwdSc7XG5pbXBvcnQge0NvbnYyRFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdSc7XG5pbXBvcnQge2NvbnYyZEJ5TWF0TXVsLCBjb252MmRXaXRoSW0yUm93fSBmcm9tICcuL0NvbnYyRF9pbXBsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyZChcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBDb252MkRJbnB1dHMsIGF0dHJzOiBDb252MkRBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlcn0gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIGRpbGF0aW9ucywgcGFkLFxuICAgICAgZGltUm91bmRpbmdNb2RlLCBmYWxzZSAvKiBkZXB0aHdpc2UgKi8sICRkYXRhRm9ybWF0KTtcbiAgbGV0IG91dDogVGVuc29ySW5mbztcblxuICBpZiAoY29udkluZm8uZmlsdGVySGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLmZpbHRlcldpZHRoID09PSAxICYmXG4gICAgICBjb252SW5mby5kaWxhdGlvbkhlaWdodCA9PT0gMSAmJiBjb252SW5mby5kaWxhdGlvbldpZHRoID09PSAxICYmXG4gICAgICBjb252SW5mby5zdHJpZGVIZWlnaHQgPT09IDEgJiYgY29udkluZm8uc3RyaWRlV2lkdGggPT09IDEgJiZcbiAgICAgIChjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdTQU1FJyB8fCBjb252SW5mby5wYWRJbmZvLnR5cGUgPT09ICdWQUxJRCcpKSB7XG4gICAgb3V0ID0gY29udjJkQnlNYXRNdWwoe3gsIGZpbHRlciwgY29udkluZm8sIGJhY2tlbmR9KTtcbiAgfSBlbHNlIGlmIChjb252SW5mby5zdHJpZGVXaWR0aCA8PSAyICYmICRkYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0J1xuICAgICYmIGVudigpLmdldEJvb2woJ1dFQkdMX0VYUF9DT05WJylcbiAgICApIHtcbiAgICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRFBhY2tlZFByb2dyYW0oY29udkluZm8pO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtcbiAgICAgIFtjb252SW5mby5wYWRJbmZvLnRvcCwgY29udkluZm8ucGFkSW5mby5sZWZ0XSxcbiAgICAgIFtjb252SW5mby5zdHJpZGVIZWlnaHQsIGNvbnZJbmZvLnN0cmlkZVdpZHRoXSxcbiAgICAgIFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF0sXG4gICAgICBbY29udkluZm8uaW5IZWlnaHQsIGNvbnZJbmZvLmluV2lkdGhdXG4gICAgXTtcbiAgICBvdXQgPVxuICAgICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuICB9IGVsc2UgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0NPTlZfSU0yQ09MJykpIHtcbiAgICBvdXQgPSBjb252MmRXaXRoSW0yUm93KHt4LCBmaWx0ZXIsIGNvbnZJbmZvLCBiYWNrZW5kfSk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252MkRQcm9ncmFtKGNvbnZJbmZvKTtcbiAgICBvdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcbiAgfVxuXG4gIGNvbnN0IG91dFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG91dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGNvbnZJbmZvLm91dFNoYXBlfX0pO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKG91dCk7XG5cbiAgcmV0dXJuIG91dFJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYyZCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class Conv2DDerFilterProgram {\n    constructor(convInfo) {\n        this.variableNames = ['x', 'dy'];\n        this.outputShape = convInfo.filterShape;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const padTop = convInfo.padInfo.top;\n        const padLeft = convInfo.padInfo.left;\n        const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n        this.userCode = `\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int wR = coords.x;\n        int wC = coords.y;\n        int d1 = coords.z;\n        int d2 = coords.w;\n\n        // Convolve x(?, ?, d1) with dy(:, :, d2) to get dw(wR, wC, d1, d2).\n        // ? = to be determined. : = across all values in that axis.\n        float dotProd = 0.0;\n\n        for (int b = 0; b < ${convInfo.batchSize}; b++) {\n          for (int yR = 0; yR < ${convInfo.outHeight}; yR++) {\n            int xR = wR + yR * ${strideHeight} - ${padTop};\n\n            if (xR < 0 || xR >= ${convInfo.inHeight}) {\n              continue;\n            }\n\n            for (int yC = 0; yC < ${convInfo.outWidth}; yC++) {\n              int xC = wC + yC * ${strideWidth} - ${padLeft};\n\n              if (xC < 0 || xC >= ${convInfo.inWidth}) {\n                continue;\n              }\n\n              if (${isChannelsLast}) {\n                float dyValue = getDy(b, yR, yC, d2);\n                float xValue = getX(b, xR, xC, d1);\n                dotProd += (xValue * dyValue);\n              } else {\n                float dyValue = getDy(b, d2, yR, yC);\n                float xValue = getX(b, d1, xR, xC);\n                dotProd += (xValue * dyValue);\n              }\n\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\nexport class Conv2DDerInputProgram {\n    constructor(convInfo) {\n        this.variableNames = ['dy', 'W'];\n        this.outputShape = convInfo.inShape;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const isChannelsLast = convInfo.dataFormat === 'channelsLast';\n        const padTop = filterHeight - 1 - convInfo.padInfo.top;\n        const padLeft = filterWidth - 1 - convInfo.padInfo.left;\n        const rowDim = isChannelsLast ? 1 : 2;\n        const colDim = isChannelsLast ? 2 : 3;\n        const channelDim = isChannelsLast ? 3 : 1;\n        this.userCode = `\n      const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int batch = coords[0];\n        int d1 = coords[${channelDim}];\n\n        ivec2 dyCorner = ivec2(coords[${rowDim}], coords[${colDim}]) - pads;\n        int dyRCorner = dyCorner.x;\n        int dyCCorner = dyCorner.y;\n\n        // Convolve dy(?, ?, d2) with w(:, :, d1, d2) to compute dx(xR, xC, d1).\n        // ? = to be determined. : = across all values in that axis.\n        float dotProd = 0.0;\n        for (int wR = 0; wR < ${filterHeight}; wR++) {\n          float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n          if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) {\n            continue;\n          }\n          int idyR = int(dyR);\n\n          int wRPerm = ${filterHeight} - 1 - wR;\n\n          for (int wC = 0; wC < ${filterWidth}; wC++) {\n            float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n            if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n                fract(dyC) > 0.0) {\n              continue;\n            }\n            int idyC = int(dyC);\n\n            int wCPerm = ${filterWidth} - 1 - wC;\n\n            for (int d2 = 0; d2 < ${convInfo.outChannels}; d2++) {\n\n              if (${isChannelsLast}) {\n                float xValue = getDy(batch, idyR, idyC, d2);\n                float wValue = getW(wRPerm, wCPerm, d1, d2);\n                dotProd += xValue * wValue;\n              } else {\n                float xValue = getDy(batch, d2, idyR, idyC);\n                float wValue = getW(wRPerm, wCPerm, d1, d2);\n                dotProd += xValue * wValue;\n              }\n\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\nexport class Conv3DDerFilterProgram {\n    constructor(convInfo) {\n        this.variableNames = ['x', 'dy'];\n        this.outputShape = convInfo.filterShape;\n        const strideDepth = convInfo.strideDepth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const padFront = convInfo.padInfo.front;\n        const padTop = convInfo.padInfo.top;\n        const padLeft = convInfo.padInfo.left;\n        this.userCode = `\n      void main() {\n        ivec5 coords = getOutputCoords();\n        int wF = coords.x;\n        int wR = coords.y;\n        int wC = coords.z;\n        int d1 = coords.w;\n        int d2 = coords.u;\n\n        float dotProd = 0.0;\n\n        for (int b = 0; b < ${convInfo.batchSize}; b++) {\n          for (int yF = 0; yF < ${convInfo.outDepth}; yF++) {\n            int xF = wF + yF * ${strideDepth} - ${padFront};\n\n            if (xF < 0 || xF >= ${convInfo.inDepth}) {\n              continue;\n            }\n\n            for (int yR = 0; yR < ${convInfo.outHeight}; yR++) {\n              int xR = wR + yR * ${strideHeight} - ${padTop};\n\n              if (xR < 0 || xR >= ${convInfo.inHeight}) {\n                continue;\n              }\n\n              for (int yC = 0; yC < ${convInfo.outWidth}; yC++) {\n                int xC = wC + yC * ${strideWidth} - ${padLeft};\n\n                if (xC < 0 || xC >= ${convInfo.inWidth}) {\n                  continue;\n                }\n\n                float dyValue = getDy(b, yF, yR, yC, d2);\n                float xValue = getX(b, xF, xR, xC, d1);\n                dotProd += (xValue * dyValue);\n              }\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\nexport class Conv3DDerInputProgram {\n    constructor(convInfo) {\n        this.variableNames = ['dy', 'W'];\n        this.outputShape = convInfo.inShape;\n        const filterDepth = convInfo.filterDepth;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const strideDepth = convInfo.strideDepth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const padFront = filterDepth - 1 - convInfo.padInfo.front;\n        const padTop = filterHeight - 1 - convInfo.padInfo.top;\n        const padLeft = filterWidth - 1 - convInfo.padInfo.left;\n        this.userCode = `\n      const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n\n      void main() {\n        ivec5 coords = getOutputCoords();\n        int batch = coords.x;\n        int d1 = coords.u;\n\n\n        ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n        int dyFCorner = dyCorner.x;\n        int dyRCorner = dyCorner.y;\n        int dyCCorner = dyCorner.z;\n\n        float dotProd = 0.0;\n        for (int wF = 0; wF < ${filterDepth}; wF++) {\n          float dyF = float(dyFCorner + wF) / ${strideDepth}.0;\n\n          if (dyF < 0.0 || dyF >= ${convInfo.outDepth}.0 || fract(dyF) > 0.0) {\n            continue;\n          }\n          int idyF = int(dyF);\n\n          int wFPerm = ${filterDepth} - 1 - wF;\n\n          for (int wR = 0; wR < ${filterHeight}; wR++) {\n            float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n            if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 ||\n              fract(dyR) > 0.0) {\n              continue;\n            }\n            int idyR = int(dyR);\n\n            int wRPerm = ${filterHeight} - 1 - wR;\n\n            for (int wC = 0; wC < ${filterWidth}; wC++) {\n              float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n              if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n                  fract(dyC) > 0.0) {\n                continue;\n              }\n              int idyC = int(dyC);\n\n              int wCPerm = ${filterWidth} - 1 - wC;\n\n              for (int d2 = 0; d2 < ${convInfo.outChannels}; d2++) {\n                float xValue = getDy(batch, idyF, idyR, idyC, d2);\n                float wValue = getW(wFPerm, wRPerm, wCPerm, d1, d2);\n                dotProd += xValue * wValue;\n              }\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9iYWNrcHJvcF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2NvbnZfYmFja3Byb3BfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxzQkFBc0I7SUFLakMsWUFBWSxRQUFpQztRQUo3QyxrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBSzFCLElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUV4QyxNQUFNLFlBQVksR0FBRyxRQUFRLENBQUMsWUFBWSxDQUFDO1FBQzNDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDcEMsTUFBTSxPQUFPLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDdEMsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLFVBQVUsS0FBSyxjQUFjLENBQUM7UUFFOUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7OzhCQVlVLFFBQVEsQ0FBQyxTQUFTO2tDQUNkLFFBQVEsQ0FBQyxTQUFTO2lDQUNuQixZQUFZLE1BQU0sTUFBTTs7a0NBRXZCLFFBQVEsQ0FBQyxRQUFROzs7O29DQUlmLFFBQVEsQ0FBQyxRQUFRO21DQUNsQixXQUFXLE1BQU0sT0FBTzs7b0NBRXZCLFFBQVEsQ0FBQyxPQUFPOzs7O29CQUloQyxjQUFjOzs7Ozs7Ozs7Ozs7Ozs7S0FlN0IsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELE1BQU0sT0FBTyxxQkFBcUI7SUFLaEMsWUFBWSxRQUFpQztRQUo3QyxrQkFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBSzFCLElBQUksQ0FBQyxXQUFX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QVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBRXpDLE1BQU0sUUFBUSxHQUFHLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUM7UUFDMUQsTUFBTSxNQUFNLEdBQUcsWUFBWSxHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUN2RCxNQUFNLE9BQU8sR0FBRyxXQUFXLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRXhELElBQUksQ0FBQyxRQUFRLEdBQUc7aUNBQ2EsUUFBUSxLQUFLLE1BQU0sS0FBSyxPQUFPOzs7Ozs7Ozs7Ozs7OztnQ0FjaEMsV0FBVztnREFDSyxXQUFXOztvQ0FFdkIsUUFBUSxDQUFDLFFBQVE7Ozs7O3lCQUs1QixXQUFXOztrQ0FFRixZQUFZO2tEQUNJLFlBQVk7O3NDQUV4QixRQUFRLENBQUMsU0FBUzs7Ozs7OzJCQU03QixZQUFZOztvQ0FFSCxXQUFXO29EQUNLLFdBQVc7O3dDQUV2QixRQUFRLENBQUMsUUFBUTs7Ozs7OzZCQU01QixXQUFXOztzQ0FFRixRQUFRLENBQUMsV0FBVzs7Ozs7Ozs7OztLQVVyRCxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgQ29udjJERGVyRmlsdGVyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnZHknXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5maWx0ZXJTaGFwZTtcblxuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IHBhZFRvcCA9IGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3QgaXNDaGFubmVsc0xhc3QgPSBjb252SW5mby5kYXRhRm9ybWF0ID09PSAnY2hhbm5lbHNMYXN0JztcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd1IgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdDID0gY29vcmRzLnk7XG4gICAgICAgIGludCBkMSA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZDIgPSBjb29yZHMudztcblxuICAgICAgICAvLyBDb252b2x2ZSB4KD8sID8sIGQxKSB3aXRoIGR5KDosIDosIGQyKSB0byBnZXQgZHcod1IsIHdDLCBkMSwgZDIpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8ICR7Y29udkluZm8uYmF0Y2hTaXplfTsgYisrKSB7XG4gICAgICAgICAgZm9yIChpbnQgeVIgPSAwOyB5UiA8ICR7Y29udkluZm8ub3V0SGVpZ2h0fTsgeVIrKykge1xuICAgICAgICAgICAgaW50IHhSID0gd1IgKyB5UiAqICR7c3RyaWRlSGVpZ2h0fSAtICR7cGFkVG9wfTtcblxuICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yIChpbnQgeUMgPSAwOyB5QyA8ICR7Y29udkluZm8ub3V0V2lkdGh9OyB5QysrKSB7XG4gICAgICAgICAgICAgIGludCB4QyA9IHdDICsgeUMgKiAke3N0cmlkZVdpZHRofSAtICR7cGFkTGVmdH07XG5cbiAgICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSAke2NvbnZJbmZvLmluV2lkdGh9KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBpZiAoJHtpc0NoYW5uZWxzTGFzdH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgeVIsIHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBkeVZhbHVlID0gZ2V0RHkoYiwgZDIsIHlSLCB5Qyk7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0WChiLCBkMSwgeFIsIHhDKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252MkREZXJJbnB1dFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeScsICdXJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3Rvcihjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gY29udkluZm8uaW5TaGFwZTtcblxuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGlzQ2hhbm5lbHNMYXN0ID0gY29udkluZm8uZGF0YUZvcm1hdCA9PT0gJ2NoYW5uZWxzTGFzdCc7XG5cbiAgICBjb25zdCBwYWRUb3AgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICAgIGNvbnN0IHJvd0RpbSA9IGlzQ2hhbm5lbHNMYXN0ID8gMSA6IDI7XG4gICAgY29uc3QgY29sRGltID0gaXNDaGFubmVsc0xhc3QgPyAyIDogMztcbiAgICBjb25zdCBjaGFubmVsRGltID0gaXNDaGFubmVsc0xhc3QgPyAzIDogMTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBpdmVjMiBwYWRzID0gaXZlYzIoJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZDEgPSBjb29yZHNbJHtjaGFubmVsRGltfV07XG5cbiAgICAgICAgaXZlYzIgZHlDb3JuZXIgPSBpdmVjMihjb29yZHNbJHtyb3dEaW19XSwgY29vcmRzWyR7Y29sRGltfV0pIC0gcGFkcztcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci55O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sIGQyKSB3aXRoIHcoOiwgOiwgZDEsIGQyKSB0byBjb21wdXRlIGR4KHhSLCB4QywgZDEpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZmlsdGVySGVpZ2h0fTsgd1IrKykge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBpbnQgd1JQZXJtID0gJHtmaWx0ZXJIZWlnaHR9IC0gMSAtIHdSO1xuXG4gICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlDIDwgMC4wIHx8IGR5QyA+PSAke2NvbnZJbmZvLm91dFdpZHRofS4wIHx8XG4gICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgIGludCB3Q1Blcm0gPSAke2ZpbHRlcldpZHRofSAtIDEgLSB3QztcblxuICAgICAgICAgICAgZm9yIChpbnQgZDIgPSAwOyBkMiA8ICR7Y29udkluZm8ub3V0Q2hhbm5lbHN9OyBkMisrKSB7XG5cbiAgICAgICAgICAgICAgaWYgKCR7aXNDaGFubmVsc0xhc3R9KSB7XG4gICAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0RHkoYmF0Y2gsIGlkeVIsIGlkeUMsIGQyKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsdWUgPSBnZXRXKHdSUGVybSwgd0NQZXJtLCBkMSwgZDIpO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlICogd1ZhbHVlO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBkMiwgaWR5UiwgaWR5Qyk7XG4gICAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3UlBlcm0sIHdDUGVybSwgZDEsIGQyKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9IHhWYWx1ZSAqIHdWYWx1ZTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBDb252M0REZXJGaWx0ZXJQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmZpbHRlclNoYXBlO1xuXG4gICAgY29uc3Qgc3RyaWRlRGVwdGggPSBjb252SW5mby5zdHJpZGVEZXB0aDtcbiAgICBjb25zdCBzdHJpZGVIZWlnaHQgPSBjb252SW5mby5zdHJpZGVIZWlnaHQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBwYWRGcm9udCA9IGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgd0YgPSBjb29yZHMueDtcbiAgICAgICAgaW50IHdSID0gY29vcmRzLnk7XG4gICAgICAgIGludCB3QyA9IGNvb3Jkcy56O1xuICAgICAgICBpbnQgZDEgPSBjb29yZHMudztcbiAgICAgICAgaW50IGQyID0gY29vcmRzLnU7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBiID0gMDsgYiA8ICR7Y29udkluZm8uYmF0Y2hTaXplfTsgYisrKSB7XG4gICAgICAgICAgZm9yIChpbnQgeUYgPSAwOyB5RiA8ICR7Y29udkluZm8ub3V0RGVwdGh9OyB5RisrKSB7XG4gICAgICAgICAgICBpbnQgeEYgPSB3RiArIHlGICogJHtzdHJpZGVEZXB0aH0gLSAke3BhZEZyb250fTtcblxuICAgICAgICAgICAgaWYgKHhGIDwgMCB8fCB4RiA+PSAke2NvbnZJbmZvLmluRGVwdGh9KSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKGludCB5UiA9IDA7IHlSIDwgJHtjb252SW5mby5vdXRIZWlnaHR9OyB5UisrKSB7XG4gICAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSAke2NvbnZJbmZvLmluSGVpZ2h0fSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZm9yIChpbnQgeUMgPSAwOyB5QyA8ICR7Y29udkluZm8ub3V0V2lkdGh9OyB5QysrKSB7XG4gICAgICAgICAgICAgICAgaW50IHhDID0gd0MgKyB5QyAqICR7c3RyaWRlV2lkdGh9IC0gJHtwYWRMZWZ0fTtcblxuICAgICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlGLCB5UiwgeUMsIGQyKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXRYKGIsIHhGLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQoZG90UHJvZCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ29udjNERGVySW5wdXRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnZHknLCAnVyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252M0RJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmluU2hhcGU7XG5cbiAgICBjb25zdCBmaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmZpbHRlckhlaWdodDtcbiAgICBjb25zdCBmaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmZpbHRlcldpZHRoO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG5cbiAgICBjb25zdCBwYWRGcm9udCA9IGZpbHRlckRlcHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8uZnJvbnQ7XG4gICAgY29uc3QgcGFkVG9wID0gZmlsdGVySGVpZ2h0IC0gMSAtIGNvbnZJbmZvLnBhZEluZm8udG9wO1xuICAgIGNvbnN0IHBhZExlZnQgPSBmaWx0ZXJXaWR0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzMgcGFkcyA9IGl2ZWMzKCR7cGFkRnJvbnR9LCAke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM1IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnU7XG5cblxuICAgICAgICBpdmVjMyBkeUNvcm5lciA9IGl2ZWMzKGNvb3Jkcy55LCBjb29yZHMueiwgY29vcmRzLncpIC0gcGFkcztcbiAgICAgICAgaW50IGR5RkNvcm5lciA9IGR5Q29ybmVyLng7XG4gICAgICAgIGludCBkeVJDb3JuZXIgPSBkeUNvcm5lci55O1xuICAgICAgICBpbnQgZHlDQ29ybmVyID0gZHlDb3JuZXIuejtcblxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICBmb3IgKGludCB3RiA9IDA7IHdGIDwgJHtmaWx0ZXJEZXB0aH07IHdGKyspIHtcbiAgICAgICAgICBmbG9hdCBkeUYgPSBmbG9hdChkeUZDb3JuZXIgKyB3RikgLyAke3N0cmlkZURlcHRofS4wO1xuXG4gICAgICAgICAgaWYgKGR5RiA8IDAuMCB8fCBkeUYgPj0gJHtjb252SW5mby5vdXREZXB0aH0uMCB8fCBmcmFjdChkeUYpID4gMC4wKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW50IGlkeUYgPSBpbnQoZHlGKTtcblxuICAgICAgICAgIGludCB3RlBlcm0gPSAke2ZpbHRlckRlcHRofSAtIDEgLSB3RjtcblxuICAgICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlSIDwgMC4wIHx8IGR5UiA+PSAke2NvbnZJbmZvLm91dEhlaWdodH0uMCB8fFxuICAgICAgICAgICAgICBmcmFjdChkeVIpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeVIgPSBpbnQoZHlSKTtcblxuICAgICAgICAgICAgaW50IHdSUGVybSA9ICR7ZmlsdGVySGVpZ2h0fSAtIDEgLSB3UjtcblxuICAgICAgICAgICAgZm9yIChpbnQgd0MgPSAwOyB3QyA8ICR7ZmlsdGVyV2lkdGh9OyB3QysrKSB7XG4gICAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgICAgaWYgKGR5QyA8IDAuMCB8fCBkeUMgPj0gJHtjb252SW5mby5vdXRXaWR0aH0uMCB8fFxuICAgICAgICAgICAgICAgICAgZnJhY3QoZHlDKSA+IDAuMCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGludCBpZHlDID0gaW50KGR5Qyk7XG5cbiAgICAgICAgICAgICAgaW50IHdDUGVybSA9ICR7ZmlsdGVyV2lkdGh9IC0gMSAtIHdDO1xuXG4gICAgICAgICAgICAgIGZvciAoaW50IGQyID0gMDsgZDIgPCAke2NvbnZJbmZvLm91dENoYW5uZWxzfTsgZDIrKykge1xuICAgICAgICAgICAgICAgIGZsb2F0IHhWYWx1ZSA9IGdldER5KGJhdGNoLCBpZHlGLCBpZHlSLCBpZHlDLCBkMik7XG4gICAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3RlBlcm0sIHdSUGVybSwgd0NQZXJtLCBkMSwgZDIpO1xuICAgICAgICAgICAgICAgIGRvdFByb2QgKz0geFZhbHVlICogd1ZhbHVlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2DBackpropFilter } from '@tensorflow/tfjs-core';\nimport { Conv2DDerFilterProgram } from '../conv_backprop_gpu';\nexport function conv2DBackpropFilter(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, dy } = inputs;\n    const { strides, pad, dataFormat, dimRoundingMode, filterShape } = attrs;\n    const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n    const program = new Conv2DDerFilterProgram(convInfo);\n    return backend.runWebGLProgram(program, [x, dy], 'float32');\n}\nexport const conv2DBackpropFilterConfig = {\n    kernelName: Conv2DBackpropFilter,\n    backendName: 'webgl',\n    kernelFunc: conv2DBackpropFilter,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BGaWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ29udjJEQmFja3Byb3BGaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxvQkFBb0IsRUFBa0YsTUFBTSx1QkFBdUIsQ0FBQztBQUcxSixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUU1RCxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFJcEM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsTUFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsVUFBVSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdkUsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFDakUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxlQUFlLEVBQzlELFdBQVcsQ0FBQyxDQUFDO0lBRWpCLE1BQU0sT0FBTyxHQUFHLElBQUksc0JBQXNCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlCO0lBQ3RELFVBQVUsRUFBRSxvQkFBb0I7SUFDaEMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG9CQUF3QztDQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjJEQmFja3Byb3BGaWx0ZXIsIENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsIENvbnYyREJhY2twcm9wRmlsdGVySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYyRERlckZpbHRlclByb2dyYW19IGZyb20gJy4uL2NvbnZfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGNvbnYyREJhY2twcm9wRmlsdGVyKGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252MkRCYWNrcHJvcEZpbHRlcklucHV0cyxcbiAgYXR0cnM6IENvbnYyREJhY2twcm9wRmlsdGVyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlLCBmaWx0ZXJTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCAkZGF0YUZvcm1hdCA9IGJhY2tlbmRfdXRpbC5jb252ZXJ0Q29udjJERGF0YUZvcm1hdChkYXRhRm9ybWF0KTtcbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaGFwZSwgc3RyaWRlcyxcbiAgICAgIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UgLyogZGVwdGh3aXNlICovLFxuICAgICAgJGRhdGFGb3JtYXQpO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ29udjJERGVyRmlsdGVyUHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZHldLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgY29udjJEQmFja3Byb3BGaWx0ZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjJEQmFja3Byb3BGaWx0ZXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcEZpbHRlciBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv2DBackpropInput } from '@tensorflow/tfjs-core';\nimport { Conv2DDerInputProgram } from '../conv_backprop_gpu';\nexport function conv2DBackpropInput(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, filter } = inputs;\n    const { inputShape, strides, pad, dataFormat, dimRoundingMode } = attrs;\n    const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n    const convInfo = backend_util.computeConv2DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad, dimRoundingMode, false, $dataFormat);\n    const program = new Conv2DDerInputProgram(convInfo);\n    return backend.runWebGLProgram(program, [dy, filter], 'float32');\n}\nexport const conv2DBackpropInputConfig = {\n    kernelName: Conv2DBackpropInput,\n    backendName: 'webgl',\n    kernelFunc: conv2DBackpropInput,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjJEQmFja3Byb3BJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db252MkRCYWNrcHJvcElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsbUJBQW1CLEVBQWdGLE1BQU0sdUJBQXVCLENBQUM7QUFHdkosT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFM0QsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBSW5DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRFLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNyRSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLFVBQVUsRUFBRSxNQUFNLENBQUMsS0FBeUMsRUFBRSxPQUFPLEVBQ3JFLENBQUMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFakUsTUFBTSxPQUFPLEdBQUcsSUFBSSxxQkFBcUIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNwRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252MkRCYWNrcHJvcElucHV0LCBDb252MkRCYWNrcHJvcElucHV0QXR0cnMsIENvbnYyREJhY2twcm9wSW5wdXRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29udjJERGVySW5wdXRQcm9ncmFtfSBmcm9tICcuLi9jb252X2JhY2twcm9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252MkRCYWNrcHJvcElucHV0KGFyZ3M6IHtcbiAgaW5wdXRzOiBDb252MkRCYWNrcHJvcElucHV0SW5wdXRzLFxuICBhdHRyczogQ29udjJEQmFja3Byb3BJbnB1dEF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtkeSwgZmlsdGVyfSA9IGlucHV0cztcbiAgY29uc3Qge2lucHV0U2hhcGUsIHN0cmlkZXMsIHBhZCwgZGF0YUZvcm1hdCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRkYXRhRm9ybWF0ID0gYmFja2VuZF91dGlsLmNvbnZlcnRDb252MkREYXRhRm9ybWF0KGRhdGFGb3JtYXQpO1xuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcyxcbiAgICAgIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgZmFsc2UsICRkYXRhRm9ybWF0KTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYyRERlcklucHV0UHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHksIGZpbHRlcl0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb252MkRCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYyREJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjb252MkRCYWNrcHJvcElucHV0IGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3D } from '@tensorflow/tfjs-core';\nimport { Conv3DProgram } from '../conv_gpu';\nexport function conv3D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter } = inputs;\n    const { strides, pad, dilations } = attrs;\n    const convInfo = backend_util.computeConv3DInfo(x.shape, filter.shape, strides, dilations, pad);\n    const program = new Conv3DProgram(convInfo);\n    return backend.runWebGLProgram(program, [x, filter], 'float32');\n}\nexport const conv3DConfig = {\n    kernelName: Conv3D,\n    backendName: 'webgl',\n    kernelFunc: conv3D,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0NvbnYzRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBc0QsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBQzNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFeEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBaUQsRUFDbkQsTUFBTSxDQUFDLEtBQWlELEVBQUUsT0FBTyxFQUNqRSxTQUFTLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFcEIsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIENvbnYzRCwgQ29udjNEQXR0cnMsIENvbnYzRElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252M0RQcm9ncmFtfSBmcm9tICcuLi9jb252X2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjb252M0QoXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogQ29udjNESW5wdXRzLCBhdHRyczogQ29udjNEQXR0cnMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBkaWxhdGlvbnN9ID0gYXR0cnM7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZUNvbnYzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRFByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGZpbHRlcl0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb252M0RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjNELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29udjNEIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3DBackpropFilterV2 } from '@tensorflow/tfjs-core';\nimport { Conv3DDerFilterProgram } from '../conv_backprop_gpu';\nexport function conv3DBackpropFilterV2(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, dy } = inputs;\n    const { strides, pad, filterShape } = attrs;\n    const convInfo = backend_util.computeConv3DInfo(x.shape, filterShape, strides, 1 /* dilations */, pad);\n    const program = new Conv3DDerFilterProgram(convInfo);\n    return backend.runWebGLProgram(program, [x, dy], 'float32');\n}\nexport const conv3DBackpropFilterV2Config = {\n    kernelName: Conv3DBackpropFilterV2,\n    backendName: 'webgl',\n    kernelFunc: conv3DBackpropFilterV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEQmFja3Byb3BGaWx0ZXJWMi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db252M0RCYWNrcHJvcEZpbHRlclYyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsc0JBQXNCLEVBQXNGLE1BQU0sdUJBQXVCLENBQUM7QUFHaEssT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sc0JBQXNCLENBQUM7QUFFNUQsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBSXRDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3ZCLE1BQU0sRUFBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUxQyxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUFpRCxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQ3pFLENBQUMsQ0FBQyxlQUFlLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFFNUIsTUFBTSxPQUFPLEdBQUcsSUFBSSxzQkFBc0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSw0QkFBNEIsR0FBaUI7SUFDeEQsVUFBVSxFQUFFLHNCQUFzQjtJQUNsQyxXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsc0JBQTBDO0NBQ3ZELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBDb252M0RCYWNrcHJvcEZpbHRlclYyLCBDb252M0RCYWNrcHJvcEZpbHRlclYyQXR0cnMsIENvbnYzREJhY2twcm9wRmlsdGVyVjJJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q29udjNERGVyRmlsdGVyUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BGaWx0ZXJWMihhcmdzOiB7XG4gIGlucHV0czogQ29udjNEQmFja3Byb3BGaWx0ZXJWMklucHV0cyxcbiAgYXR0cnM6IENvbnYzREJhY2twcm9wRmlsdGVyVjJBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBmaWx0ZXJTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRERlckZpbHRlclByb2dyYW0oY29udkluZm8pO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3gsIGR5XSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IGNvbnYzREJhY2twcm9wRmlsdGVyVjJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29udjNEQmFja3Byb3BGaWx0ZXJWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wRmlsdGVyVjIgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Conv3DBackpropInputV2 } from '@tensorflow/tfjs-core';\nimport { Conv3DDerInputProgram } from '../conv_backprop_gpu';\nexport function conv3DBackpropInput(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, filter } = inputs;\n    const { pad, strides, inputShape } = attrs;\n    const convInfo = backend_util.computeConv3DInfo(inputShape, filter.shape, strides, 1 /* dilations */, pad);\n    const program = new Conv3DDerInputProgram(convInfo);\n    return backend.runWebGLProgram(program, [dy, filter], 'float32');\n}\nexport const conv3DBackpropInputConfig = {\n    kernelName: Conv3DBackpropInputV2,\n    backendName: 'webgl',\n    kernelFunc: conv3DBackpropInput,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29udjNEQmFja3Byb3BJbnB1dFYyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0NvbnYzREJhY2twcm9wSW5wdXRWMi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLHFCQUFxQixFQUFvRixNQUFNLHVCQUF1QixDQUFDO0FBRzdKLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBRTNELE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxJQUluQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsRUFBRSxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsR0FBRyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQWlELEVBQ3BFLE9BQU8sRUFBRSxDQUFDLENBQUMsZUFBZSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBRXJDLE1BQU0sT0FBTyxHQUFHLElBQUkscUJBQXFCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEQsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCO0lBQ3JELFVBQVUsRUFBRSxxQkFBcUI7SUFDakMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG1CQUF1QztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgQ29udjNEQmFja3Byb3BJbnB1dFYyLCBDb252M0RCYWNrcHJvcElucHV0VjJBdHRycywgQ29udjNEQmFja3Byb3BJbnB1dFYySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0NvbnYzRERlcklucHV0UHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gY29udjNEQmFja3Byb3BJbnB1dChhcmdzOiB7XG4gIGlucHV0czogQ29udjNEQmFja3Byb3BJbnB1dFYySW5wdXRzLFxuICBhdHRyczogQ29udjNEQmFja3Byb3BJbnB1dFYyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7cGFkLCBzdHJpZGVzLCBpbnB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252M0RJbmZvKFxuICAgICAgaW5wdXRTaGFwZSwgZmlsdGVyLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBzdHJpZGVzLCAxIC8qIGRpbGF0aW9ucyAqLywgcGFkKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IENvbnYzRERlcklucHV0UHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHksIGZpbHRlcl0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBjb252M0RCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IENvbnYzREJhY2twcm9wSW5wdXRWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNvbnYzREJhY2twcm9wSW5wdXQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cos } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst COS = CHECK_NAN_SNIPPET_UNARY + `\n  return cos(x);\n`;\nexport const cos = unaryKernelFunc({ opSnippet: COS });\nexport const cosConfig = {\n    kernelName: Cos,\n    backendName: 'webgl',\n    kernelFunc: cos,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0Nvcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFlLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixHQUFHOztDQUVyQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0NvcywgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1VOQVJZLCB1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBDT1MgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGNvcyh4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBjb3MgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQ09TfSk7XG5cbmV4cG9ydCBjb25zdCBjb3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ29zLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29zLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cosh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst COSH = `\n  float e2x = exp(-x);\n  return (e2x + 1.0 / e2x) / 2.0;\n`;\nexport const cosh = unaryKernelFunc({ opSnippet: COSH });\nexport const coshConfig = {\n    kernelName: Cosh,\n    backendName: 'webgl',\n    kernelFunc: cosh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ29zaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Db3NoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQWUsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxJQUFJLEdBQUc7OztDQUdaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0Nvc2gsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgQ09TSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKC14KTtcbiAgcmV0dXJuIChlMnggKyAxLjAgLyBlMngpIC8gMi4wO1xuYDtcblxuZXhwb3J0IGNvbnN0IGNvc2ggPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogQ09TSH0pO1xuXG5leHBvcnQgY29uc3QgY29zaENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDb3NoLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogY29zaCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class CropAndResizeProgram {\n    constructor(imageShape, boxShape, cropSize, method, extrapolationValue) {\n        this.variableNames = ['Image', 'Boxes', 'BoxInd'];\n        this.outputShape = [];\n        const [batch, imageHeight, imageWidth, depth] = imageShape;\n        const [numBoxes,] = boxShape;\n        const [cropHeight, cropWidth] = cropSize;\n        this.outputShape = [numBoxes, cropHeight, cropWidth, depth];\n        const methodId = method === 'bilinear' ? 1 : 0;\n        const [inputHeightFloat, inputWidthFloat] = [`${imageHeight - 1}.0`, `${imageWidth - 1}.0`];\n        const [heightRatio, heightScale, inY] = cropHeight > 1 ?\n            [\n                `${(imageHeight - 1) / (cropHeight - 1)}`,\n                '(y2-y1) * height_ratio',\n                `y1*${inputHeightFloat} + float(y)*(height_scale)`,\n            ] :\n            [\n                '0.0',\n                '0.0',\n                `0.5 * (y1+y2) * ${inputHeightFloat}`,\n            ];\n        const [widthRatio, widthScale, inX] = cropWidth > 1 ?\n            [\n                `${(imageWidth - 1) / (cropWidth - 1)}`,\n                '(x2-x1) * width_ratio',\n                `x1*${inputWidthFloat} + float(x)*(width_scale)`,\n            ] :\n            [\n                '0.0',\n                '0.0',\n                `0.5 * (x1+x2) * ${inputWidthFloat}`,\n            ];\n        // Reference implementation\n        // tslint:disable-next-line:max-line-length\n        // https://github.com/tensorflow/tensorflow/blob/master/tensorflow/core/kernels/crop_and_resize_op_gpu.cu.cc\n        this.userCode = `\n      const float height_ratio = float(${heightRatio});\n      const float width_ratio = float(${widthRatio});\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int y = coords[1];\n        int x = coords[2];\n        int d = coords[3];\n\n        // get box vals\n        float y1 = getBoxes(b,0);\n        float x1 = getBoxes(b,1);\n        float y2 = getBoxes(b,2);\n        float x2 = getBoxes(b,3);\n\n        // get image in batch index\n        int bInd = round(getBoxInd(b));\n        if(bInd < 0 || bInd >= ${batch}) {\n          return;\n        }\n\n        float height_scale = ${heightScale};\n        float width_scale = ${widthScale};\n\n        float in_y = ${inY};\n        if( in_y < 0.0 || in_y > ${inputHeightFloat} ) {\n          setOutput(float(${extrapolationValue}));\n          return;\n        }\n        float in_x = ${inX};\n        if( in_x < 0.0 || in_x > ${inputWidthFloat} ) {\n          setOutput(float(${extrapolationValue}));\n          return;\n        }\n\n        vec2 sourceFracIndexCR = vec2(in_x,in_y);\n        if(${methodId} == 1) {\n          // Compute the four integer indices.\n          ivec2 sourceFloorCR = ivec2(sourceFracIndexCR);\n          ivec2 sourceCeilCR = ivec2(ceil(sourceFracIndexCR));\n\n          float topLeft = getImage(b, sourceFloorCR.y, sourceFloorCR.x, d);\n          float bottomLeft = getImage(b, sourceCeilCR.y, sourceFloorCR.x, d);\n          float topRight = getImage(b, sourceFloorCR.y, sourceCeilCR.x, d);\n          float bottomRight = getImage(b, sourceCeilCR.y, sourceCeilCR.x, d);\n\n          vec2 fracCR = sourceFracIndexCR - vec2(sourceFloorCR);\n\n          float top = topLeft + (topRight - topLeft) * fracCR.x;\n          float bottom = bottomLeft + (bottomRight - bottomLeft) * fracCR.x;\n          float newValue = top + (bottom - top) * fracCR.y;\n          setOutput(newValue);\n        } else {\n          // Compute the coordinators of nearest neighbor point.\n          ivec2 sourceNearestCR = ivec2(floor(\n            sourceFracIndexCR + vec2(0.5,0.5)));\n          float newValue = getImage(b, sourceNearestCR.y, sourceNearestCR.x, d);\n          setOutput(newValue);\n        }\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JvcF9hbmRfcmVzaXplX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvY3JvcF9hbmRfcmVzaXplX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBSy9CLFlBQ0ksVUFBNEMsRUFBRSxRQUEwQixFQUN4RSxRQUEwQixFQUFFLE1BQTRCLEVBQ3hELGtCQUEwQjtRQVA5QixrQkFBYSxHQUFHLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxRQUFRLENBQUMsQ0FBQztRQUM3QyxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQU96QixNQUFNLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQzNELE1BQU0sQ0FBQyxRQUFRLEVBQUcsR0FBRyxRQUFRLENBQUM7UUFDOUIsTUFBTSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsR0FBRyxRQUFRLENBQUM7UUFDekMsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFFBQVEsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRS9DLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxlQUFlLENBQUMsR0FDckMsQ0FBQyxHQUFHLFdBQVcsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXBELE1BQU0sQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLEdBQUcsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUNwRDtnQkFDRSxHQUFHLENBQUMsV0FBVyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFO2dCQUN6Qyx3QkFBd0I7Z0JBQ3hCLE1BQU0sZ0JBQWdCLDRCQUE0QjthQUNuRCxDQUFDLENBQUM7WUFDSDtnQkFDRSxLQUFLO2dCQUNMLEtBQUs7Z0JBQ0wsbUJBQW1CLGdCQUFnQixFQUFFO2FBQ3RDLENBQUM7UUFDTixNQUFNLENBQUMsVUFBVSxFQUFFLFVBQVUsRUFBRSxHQUFHLENBQUMsR0FBRyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDakQ7Z0JBQ0UsR0FBRyxDQUFDLFVBQVUsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsRUFBRTtnQkFDdkMsdUJBQXVCO2dCQUN2QixNQUFNLGVBQWUsMkJBQTJCO2FBQ2pELENBQUMsQ0FBQztZQUNIO2dCQUNFLEtBQUs7Z0JBQ0wsS0FBSztnQkFDTCxtQkFBbUIsZUFBZSxFQUFFO2FBQ3JDLENBQUM7UUFFTiwyQkFBMkI7UUFDM0IsMkNBQTJDO1FBQzNDLDRHQUE0RztRQUM1RyxJQUFJLENBQUMsUUFBUSxHQUFHO3lDQUNxQixXQUFXO3dDQUNaLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7aUNBZ0JqQixLQUFLOzs7OytCQUlQLFdBQVc7OEJBQ1osVUFBVTs7dUJBRWpCLEdBQUc7bUNBQ1MsZ0JBQWdCOzRCQUN2QixrQkFBa0I7Ozt1QkFHdkIsR0FBRzttQ0FDUyxlQUFlOzRCQUN0QixrQkFBa0I7Ozs7O2FBS2pDLFFBQVE7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQXdCaEIsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBDcm9wQW5kUmVzaXplUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0ltYWdlJywgJ0JveGVzJywgJ0JveEluZCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGltYWdlU2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBib3hTaGFwZTogW251bWJlciwgbnVtYmVyXSxcbiAgICAgIGNyb3BTaXplOiBbbnVtYmVyLCBudW1iZXJdLCBtZXRob2Q6ICdiaWxpbmVhcid8J25lYXJlc3QnLFxuICAgICAgZXh0cmFwb2xhdGlvblZhbHVlOiBudW1iZXIpIHtcbiAgICBjb25zdCBbYmF0Y2gsIGltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoLCBkZXB0aF0gPSBpbWFnZVNoYXBlO1xuICAgIGNvbnN0IFtudW1Cb3hlcywgXSA9IGJveFNoYXBlO1xuICAgIGNvbnN0IFtjcm9wSGVpZ2h0LCBjcm9wV2lkdGhdID0gY3JvcFNpemU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtudW1Cb3hlcywgY3JvcEhlaWdodCwgY3JvcFdpZHRoLCBkZXB0aF07XG4gICAgY29uc3QgbWV0aG9kSWQgPSBtZXRob2QgPT09ICdiaWxpbmVhcicgPyAxIDogMDtcblxuICAgIGNvbnN0IFtpbnB1dEhlaWdodEZsb2F0LCBpbnB1dFdpZHRoRmxvYXRdID1cbiAgICAgICAgW2Ake2ltYWdlSGVpZ2h0IC0gMX0uMGAsIGAke2ltYWdlV2lkdGggLSAxfS4wYF07XG5cbiAgICBjb25zdCBbaGVpZ2h0UmF0aW8sIGhlaWdodFNjYWxlLCBpblldID0gY3JvcEhlaWdodCA+IDEgP1xuICAgICAgICBbXG4gICAgICAgICAgYCR7KGltYWdlSGVpZ2h0IC0gMSkgLyAoY3JvcEhlaWdodCAtIDEpfWAsXG4gICAgICAgICAgJyh5Mi15MSkgKiBoZWlnaHRfcmF0aW8nLFxuICAgICAgICAgIGB5MSoke2lucHV0SGVpZ2h0RmxvYXR9ICsgZmxvYXQoeSkqKGhlaWdodF9zY2FsZSlgLFxuICAgICAgICBdIDpcbiAgICAgICAgW1xuICAgICAgICAgICcwLjAnLFxuICAgICAgICAgICcwLjAnLFxuICAgICAgICAgIGAwLjUgKiAoeTEreTIpICogJHtpbnB1dEhlaWdodEZsb2F0fWAsXG4gICAgICAgIF07XG4gICAgY29uc3QgW3dpZHRoUmF0aW8sIHdpZHRoU2NhbGUsIGluWF0gPSBjcm9wV2lkdGggPiAxID9cbiAgICAgICAgW1xuICAgICAgICAgIGAkeyhpbWFnZVdpZHRoIC0gMSkgLyAoY3JvcFdpZHRoIC0gMSl9YCxcbiAgICAgICAgICAnKHgyLXgxKSAqIHdpZHRoX3JhdGlvJyxcbiAgICAgICAgICBgeDEqJHtpbnB1dFdpZHRoRmxvYXR9ICsgZmxvYXQoeCkqKHdpZHRoX3NjYWxlKWAsXG4gICAgICAgIF0gOlxuICAgICAgICBbXG4gICAgICAgICAgJzAuMCcsXG4gICAgICAgICAgJzAuMCcsXG4gICAgICAgICAgYDAuNSAqICh4MSt4MikgKiAke2lucHV0V2lkdGhGbG9hdH1gLFxuICAgICAgICBdO1xuXG4gICAgLy8gUmVmZXJlbmNlIGltcGxlbWVudGF0aW9uXG4gICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvYmxvYi9tYXN0ZXIvdGVuc29yZmxvdy9jb3JlL2tlcm5lbHMvY3JvcF9hbmRfcmVzaXplX29wX2dwdS5jdS5jY1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCBmbG9hdCBoZWlnaHRfcmF0aW8gPSBmbG9hdCgke2hlaWdodFJhdGlvfSk7XG4gICAgICBjb25zdCBmbG9hdCB3aWR0aF9yYXRpbyA9IGZsb2F0KCR7d2lkdGhSYXRpb30pO1xuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB5ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG5cbiAgICAgICAgLy8gZ2V0IGJveCB2YWxzXG4gICAgICAgIGZsb2F0IHkxID0gZ2V0Qm94ZXMoYiwwKTtcbiAgICAgICAgZmxvYXQgeDEgPSBnZXRCb3hlcyhiLDEpO1xuICAgICAgICBmbG9hdCB5MiA9IGdldEJveGVzKGIsMik7XG4gICAgICAgIGZsb2F0IHgyID0gZ2V0Qm94ZXMoYiwzKTtcblxuICAgICAgICAvLyBnZXQgaW1hZ2UgaW4gYmF0Y2ggaW5kZXhcbiAgICAgICAgaW50IGJJbmQgPSByb3VuZChnZXRCb3hJbmQoYikpO1xuICAgICAgICBpZihiSW5kIDwgMCB8fCBiSW5kID49ICR7YmF0Y2h9KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgaGVpZ2h0X3NjYWxlID0gJHtoZWlnaHRTY2FsZX07XG4gICAgICAgIGZsb2F0IHdpZHRoX3NjYWxlID0gJHt3aWR0aFNjYWxlfTtcblxuICAgICAgICBmbG9hdCBpbl95ID0gJHtpbll9O1xuICAgICAgICBpZiggaW5feSA8IDAuMCB8fCBpbl95ID4gJHtpbnB1dEhlaWdodEZsb2F0fSApIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoJHtleHRyYXBvbGF0aW9uVmFsdWV9KSk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZsb2F0IGluX3ggPSAke2luWH07XG4gICAgICAgIGlmKCBpbl94IDwgMC4wIHx8IGluX3ggPiAke2lucHV0V2lkdGhGbG9hdH0gKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KGZsb2F0KCR7ZXh0cmFwb2xhdGlvblZhbHVlfSkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlYzIgc291cmNlRnJhY0luZGV4Q1IgPSB2ZWMyKGluX3gsaW5feSk7XG4gICAgICAgIGlmKCR7bWV0aG9kSWR9ID09IDEpIHtcbiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBmb3VyIGludGVnZXIgaW5kaWNlcy5cbiAgICAgICAgICBpdmVjMiBzb3VyY2VGbG9vckNSID0gaXZlYzIoc291cmNlRnJhY0luZGV4Q1IpO1xuICAgICAgICAgIGl2ZWMyIHNvdXJjZUNlaWxDUiA9IGl2ZWMyKGNlaWwoc291cmNlRnJhY0luZGV4Q1IpKTtcblxuICAgICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRJbWFnZShiLCBzb3VyY2VGbG9vckNSLnksIHNvdXJjZUZsb29yQ1IueCwgZCk7XG4gICAgICAgICAgZmxvYXQgYm90dG9tTGVmdCA9IGdldEltYWdlKGIsIHNvdXJjZUNlaWxDUi55LCBzb3VyY2VGbG9vckNSLngsIGQpO1xuICAgICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0SW1hZ2UoYiwgc291cmNlRmxvb3JDUi55LCBzb3VyY2VDZWlsQ1IueCwgZCk7XG4gICAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRJbWFnZShiLCBzb3VyY2VDZWlsQ1IueSwgc291cmNlQ2VpbENSLngsIGQpO1xuXG4gICAgICAgICAgdmVjMiBmcmFjQ1IgPSBzb3VyY2VGcmFjSW5kZXhDUiAtIHZlYzIoc291cmNlRmxvb3JDUik7XG5cbiAgICAgICAgICBmbG9hdCB0b3AgPSB0b3BMZWZ0ICsgKHRvcFJpZ2h0IC0gdG9wTGVmdCkgKiBmcmFjQ1IueDtcbiAgICAgICAgICBmbG9hdCBib3R0b20gPSBib3R0b21MZWZ0ICsgKGJvdHRvbVJpZ2h0IC0gYm90dG9tTGVmdCkgKiBmcmFjQ1IueDtcbiAgICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY0NSLnk7XG4gICAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBjb29yZGluYXRvcnMgb2YgbmVhcmVzdCBuZWlnaGJvciBwb2ludC5cbiAgICAgICAgICBpdmVjMiBzb3VyY2VOZWFyZXN0Q1IgPSBpdmVjMihmbG9vcihcbiAgICAgICAgICAgIHNvdXJjZUZyYWNJbmRleENSICsgdmVjMigwLjUsMC41KSkpO1xuICAgICAgICAgIGZsb2F0IG5ld1ZhbHVlID0gZ2V0SW1hZ2UoYiwgc291cmNlTmVhcmVzdENSLnksIHNvdXJjZU5lYXJlc3RDUi54LCBkKTtcbiAgICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { CropAndResize } from '@tensorflow/tfjs-core';\nimport { CropAndResizeProgram } from '../crop_and_resize_gpu';\nexport const cropAndResize = (args) => {\n    const { inputs, backend, attrs } = args;\n    const { image, boxes, boxInd } = inputs;\n    const { cropSize, method, extrapolationValue } = attrs;\n    const program = new CropAndResizeProgram(image.shape, boxes.shape, cropSize, method, extrapolationValue);\n    return backend.runWebGLProgram(program, [image, boxes, boxInd], 'float32');\n};\nexport const cropAndResizeConfig = {\n    kernelName: CropAndResize,\n    backendName: 'webgl',\n    kernelFunc: cropAndResize\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3JvcEFuZFJlc2l6ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Dcm9wQW5kUmVzaXplLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxhQUFhLEVBQWdGLE1BQU0sdUJBQXVCLENBQUM7QUFHbkksT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFHLENBQUMsSUFJN0IsRUFBYyxFQUFFO0lBQ2YsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN0QyxNQUFNLEVBQUMsUUFBUSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRCxNQUFNLE9BQU8sR0FBRyxJQUFJLG9CQUFvQixDQUNwQyxLQUFLLENBQUMsS0FBeUMsRUFDL0MsS0FBSyxDQUFDLEtBQXlCLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzNFLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzdFLENBQUMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLG1CQUFtQixHQUFpQjtJQUMvQyxVQUFVLEVBQUUsYUFBYTtJQUN6QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsYUFBaUM7Q0FDOUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtDcm9wQW5kUmVzaXplLCBDcm9wQW5kUmVzaXplQXR0cnMsIENyb3BBbmRSZXNpemVJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Q3JvcEFuZFJlc2l6ZVByb2dyYW19IGZyb20gJy4uL2Nyb3BfYW5kX3Jlc2l6ZV9ncHUnO1xuXG5leHBvcnQgY29uc3QgY3JvcEFuZFJlc2l6ZSA9IChhcmdzOiB7XG4gIGlucHV0czogQ3JvcEFuZFJlc2l6ZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IENyb3BBbmRSZXNpemVBdHRyc1xufSk6IFRlbnNvckluZm8gPT4ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2UsIGJveGVzLCBib3hJbmR9ID0gaW5wdXRzO1xuICBjb25zdCB7Y3JvcFNpemUsIG1ldGhvZCwgZXh0cmFwb2xhdGlvblZhbHVlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgQ3JvcEFuZFJlc2l6ZVByb2dyYW0oXG4gICAgICBpbWFnZS5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGJveGVzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlcl0sIGNyb3BTaXplLCBtZXRob2QsIGV4dHJhcG9sYXRpb25WYWx1ZSk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2UsIGJveGVzLCBib3hJbmRdLCAnZmxvYXQzMicpO1xufTtcblxuZXhwb3J0IGNvbnN0IGNyb3BBbmRSZXNpemVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogQ3JvcEFuZFJlc2l6ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGNyb3BBbmRSZXNpemUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","import { getCoordsDataType } from './shader_compiler';\nexport var CumOpType;\n(function (CumOpType) {\n    CumOpType[\"Prod\"] = \"*\";\n    CumOpType[\"Sum\"] = \"+\";\n})(CumOpType || (CumOpType = {}));\nexport class CumProgram {\n    constructor(op, outputShape, exclusive, reverse) {\n        this.op = op;\n        this.outputShape = outputShape;\n        this.variableNames = ['x'];\n        this.customUniforms = [{ name: 'index', type: 'float' }];\n        const rank = this.outputShape.length;\n        const initVal = this.op === CumOpType.Prod ? '1.0' : '0.0';\n        const val = exclusive ? initVal : `getX(${getCoords(rank, 'coords', this.op)})`;\n        const length = this.outputShape[this.outputShape.length - 1];\n        let condition = '';\n        let idxString = '';\n        // When exclusive is set, the cum op becomes roll op that copies the\n        // value from the previous index based on the direction specified by the\n        // reverse flag.\n        if (exclusive) {\n            condition = reverse ? `end != ${length - 1}` : 'end != 0';\n            idxString = reverse ? 'end + 1' : 'end - 1';\n        }\n        else {\n            condition = reverse ? `end + pow2 < ${length}` : 'end >= pow2';\n            idxString = (reverse ? 'end + pow2' : 'end - pow2');\n        }\n        this.userCode = `\n      void main() {\n        ${getCoordsDataType(rank)} coords = getOutputCoords();\n        int end = ${getFinalCoord(rank, 'coords', this.op)};\n        float val = ${val};\n        int pow2 = int(pow(2.0, index));\n        if (${condition}) {\n          int idx = ${idxString};\n          ${getFinalCoord(rank, 'coords', this.op)} = idx;\n          val ${this.op}= getX(${getCoords(rank, 'coords', this.op)});\n        }\n        setOutput(val);\n      }\n    `;\n    }\n}\nfunction getCoords(rank, name, op) {\n    if (rank === 1) {\n        return `${name}`;\n    }\n    else if (rank === 2) {\n        return `${name}.x, ${name}.y`;\n    }\n    else if (rank === 3) {\n        return `${name}.x, ${name}.y, ${name}.z`;\n    }\n    else if (rank === 4) {\n        return `${name}.x, ${name}.y, ${name}.z, ${name}.w`;\n    }\n    else {\n        throw new Error(`Cumulative ${op} for rank ${rank} is not yet supported`);\n    }\n}\nfunction getFinalCoord(rank, name, op) {\n    if (rank === 1) {\n        return `${name}`;\n    }\n    else if (rank === 2) {\n        return `${name}.y`;\n    }\n    else if (rank === 3) {\n        return `${name}.z`;\n    }\n    else if (rank === 4) {\n        return `${name}.w`;\n    }\n    else {\n        throw new Error(`Cumulative ${op} for rank ${rank} is not yet supported`);\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3VtX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvY3VtX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGlCQUFpQixFQUFjLE1BQU0sbUJBQW1CLENBQUM7QUFFakUsTUFBTSxDQUFOLElBQVksU0FHWDtBQUhELFdBQVksU0FBUztJQUNuQix1QkFBVSxDQUFBO0lBQ1Ysc0JBQVMsQ0FBQTtBQUNYLENBQUMsRUFIVyxTQUFTLEtBQVQsU0FBUyxRQUdwQjtBQUVELE1BQU0sT0FBTyxVQUFVO0lBS3JCLFlBQ1csRUFBYSxFQUFTLFdBQXFCLEVBQUUsU0FBa0IsRUFDdEUsT0FBZ0I7UUFEVCxPQUFFLEdBQUYsRUFBRSxDQUFXO1FBQVMsZ0JBQVcsR0FBWCxXQUFXLENBQVU7UUFMdEQsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRXRCLG1CQUFjLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQXNCLEVBQUMsQ0FBQyxDQUFDO1FBSy9ELE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDO1FBQ3JDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxFQUFFLEtBQUssU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDM0QsTUFBTSxHQUFHLEdBQ0wsU0FBUyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLFFBQVEsU0FBUyxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDeEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3RCxJQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7UUFDbkIsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLG9FQUFvRTtRQUNwRSx3RUFBd0U7UUFDeEUsZ0JBQWdCO1FBQ2hCLElBQUksU0FBUyxFQUFFO1lBQ2IsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsVUFBVSxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztZQUMxRCxTQUFTLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQztTQUM3QzthQUFNO1lBQ0wsU0FBUyxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUM7WUFDL0QsU0FBUyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDO1NBQ3JEO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixpQkFBaUIsQ0FBQyxJQUFJLENBQUM7b0JBQ2IsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztzQkFDcEMsR0FBRzs7Y0FFWCxTQUFTO3NCQUNELFNBQVM7WUFDbkIsYUFBYSxDQUFDLElBQUksRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLEVBQUUsVUFBVSxTQUFTLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxDQUFDOzs7O0tBSTlELENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxTQUFTLFNBQVMsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQWE7SUFDMUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO0tBQ2xCO1NBQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sR0FBRyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUM7S0FDL0I7U0FBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxHQUFHLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxJQUFJLENBQUM7S0FDMUM7U0FBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxHQUFHLElBQUksT0FBTyxJQUFJLE9BQU8sSUFBSSxPQUFPLElBQUksSUFBSSxDQUFDO0tBQ3JEO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxhQUFhLElBQUksdUJBQXVCLENBQUMsQ0FBQztLQUMzRTtBQUNILENBQUM7QUFFRCxTQUFTLGFBQWEsQ0FBQyxJQUFZLEVBQUUsSUFBWSxFQUFFLEVBQWE7SUFDOUQsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ2QsT0FBTyxHQUFHLElBQUksRUFBRSxDQUFDO0tBQ2xCO1NBQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1FBQ3JCLE9BQU8sR0FBRyxJQUFJLElBQUksQ0FBQztLQUNwQjtTQUFNLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNyQixPQUFPLEdBQUcsSUFBSSxJQUFJLENBQUM7S0FDcEI7U0FBTSxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7UUFDckIsT0FBTyxHQUFHLElBQUksSUFBSSxDQUFDO0tBQ3BCO1NBQU07UUFDTCxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsRUFBRSxhQUFhLElBQUksdUJBQXVCLENBQUMsQ0FBQztLQUMzRTtBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGUsIFVuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBlbnVtIEN1bU9wVHlwZSB7XG4gIFByb2QgPSAnKicsXG4gIFN1bSA9ICcrJyxcbn1cblxuZXhwb3J0IGNsYXNzIEN1bVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAnaW5kZXgnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBwdWJsaWMgb3A6IEN1bU9wVHlwZSwgcHVibGljIG91dHB1dFNoYXBlOiBudW1iZXJbXSwgZXhjbHVzaXZlOiBib29sZWFuLFxuICAgICAgcmV2ZXJzZTogYm9vbGVhbikge1xuICAgIGNvbnN0IHJhbmsgPSB0aGlzLm91dHB1dFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBpbml0VmFsID0gdGhpcy5vcCA9PT0gQ3VtT3BUeXBlLlByb2QgPyAnMS4wJyA6ICcwLjAnO1xuICAgIGNvbnN0IHZhbCA9XG4gICAgICAgIGV4Y2x1c2l2ZSA/IGluaXRWYWwgOiBgZ2V0WCgke2dldENvb3JkcyhyYW5rLCAnY29vcmRzJywgdGhpcy5vcCl9KWA7XG4gICAgY29uc3QgbGVuZ3RoID0gdGhpcy5vdXRwdXRTaGFwZVt0aGlzLm91dHB1dFNoYXBlLmxlbmd0aCAtIDFdO1xuICAgIGxldCBjb25kaXRpb24gPSAnJztcbiAgICBsZXQgaWR4U3RyaW5nID0gJyc7XG4gICAgLy8gV2hlbiBleGNsdXNpdmUgaXMgc2V0LCB0aGUgY3VtIG9wIGJlY29tZXMgcm9sbCBvcCB0aGF0IGNvcGllcyB0aGVcbiAgICAvLyB2YWx1ZSBmcm9tIHRoZSBwcmV2aW91cyBpbmRleCBiYXNlZCBvbiB0aGUgZGlyZWN0aW9uIHNwZWNpZmllZCBieSB0aGVcbiAgICAvLyByZXZlcnNlIGZsYWcuXG4gICAgaWYgKGV4Y2x1c2l2ZSkge1xuICAgICAgY29uZGl0aW9uID0gcmV2ZXJzZSA/IGBlbmQgIT0gJHtsZW5ndGggLSAxfWAgOiAnZW5kICE9IDAnO1xuICAgICAgaWR4U3RyaW5nID0gcmV2ZXJzZSA/ICdlbmQgKyAxJyA6ICdlbmQgLSAxJztcbiAgICB9IGVsc2Uge1xuICAgICAgY29uZGl0aW9uID0gcmV2ZXJzZSA/IGBlbmQgKyBwb3cyIDwgJHtsZW5ndGh9YCA6ICdlbmQgPj0gcG93Mic7XG4gICAgICBpZHhTdHJpbmcgPSAocmV2ZXJzZSA/ICdlbmQgKyBwb3cyJyA6ICdlbmQgLSBwb3cyJyk7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtnZXRDb29yZHNEYXRhVHlwZShyYW5rKX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBlbmQgPSAke2dldEZpbmFsQ29vcmQocmFuaywgJ2Nvb3JkcycsIHRoaXMub3ApfTtcbiAgICAgICAgZmxvYXQgdmFsID0gJHt2YWx9O1xuICAgICAgICBpbnQgcG93MiA9IGludChwb3coMi4wLCBpbmRleCkpO1xuICAgICAgICBpZiAoJHtjb25kaXRpb259KSB7XG4gICAgICAgICAgaW50IGlkeCA9ICR7aWR4U3RyaW5nfTtcbiAgICAgICAgICAke2dldEZpbmFsQ29vcmQocmFuaywgJ2Nvb3JkcycsIHRoaXMub3ApfSA9IGlkeDtcbiAgICAgICAgICB2YWwgJHt0aGlzLm9wfT0gZ2V0WCgke2dldENvb3JkcyhyYW5rLCAnY29vcmRzJywgdGhpcy5vcCl9KTtcbiAgICAgICAgfVxuICAgICAgICBzZXRPdXRwdXQodmFsKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldENvb3JkcyhyYW5rOiBudW1iZXIsIG5hbWU6IHN0cmluZywgb3A6IEN1bU9wVHlwZSk6IHN0cmluZyB7XG4gIGlmIChyYW5rID09PSAxKSB7XG4gICAgcmV0dXJuIGAke25hbWV9YDtcbiAgfSBlbHNlIGlmIChyYW5rID09PSAyKSB7XG4gICAgcmV0dXJuIGAke25hbWV9LngsICR7bmFtZX0ueWA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMykge1xuICAgIHJldHVybiBgJHtuYW1lfS54LCAke25hbWV9LnksICR7bmFtZX0uemA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gNCkge1xuICAgIHJldHVybiBgJHtuYW1lfS54LCAke25hbWV9LnksICR7bmFtZX0ueiwgJHtuYW1lfS53YDtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEN1bXVsYXRpdmUgJHtvcH0gZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldEZpbmFsQ29vcmQocmFuazogbnVtYmVyLCBuYW1lOiBzdHJpbmcsIG9wOiBDdW1PcFR5cGUpOiBzdHJpbmcge1xuICBpZiAocmFuayA9PT0gMSkge1xuICAgIHJldHVybiBgJHtuYW1lfWA7XG4gIH0gZWxzZSBpZiAocmFuayA9PT0gMikge1xuICAgIHJldHVybiBgJHtuYW1lfS55YDtcbiAgfSBlbHNlIGlmIChyYW5rID09PSAzKSB7XG4gICAgcmV0dXJuIGAke25hbWV9LnpgO1xuICB9IGVsc2UgaWYgKHJhbmsgPT09IDQpIHtcbiAgICByZXR1cm4gYCR7bmFtZX0ud2A7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBDdW11bGF0aXZlICR7b3B9IGZvciByYW5rICR7cmFua30gaXMgbm90IHlldCBzdXBwb3J0ZWRgKTtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { CumProgram } from '../cum_gpu';\nimport { identity } from './Identity';\nimport { transpose } from './Transpose';\nexport function cumImpl(op, x, backend, axis, exclusive, reverse) {\n    const xRank = x.shape.length;\n    const permutation = backend_util.getAxesPermutation([axis], xRank);\n    let permutedX = x;\n    if (permutation != null) {\n        permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n    }\n    const permutedAxis = backend_util.getInnerMostAxes(1, xRank)[0];\n    if (permutedAxis !== xRank - 1) {\n        throw new Error(`WebGL cumprod shader expects an inner-most axis=${x.shape.length - 1} ` +\n            `but got axis=${axis}`);\n    }\n    const size = permutedX.shape[permutedAxis];\n    let result = identity({ inputs: { x: permutedX }, backend });\n    // Use cum parallel algorithm, inspired by:\n    // https://developer.nvidia.com/gpugems/gpugems3/part-vi-gpu-computing/chapter-39-parallel-prefix-sum-scan-cuda\n    // Note: although the algorithm is called sum, it works for any associtative\n    // operator with an identity.\n    for (let i = 0; i <= Math.ceil(Math.log2(size)) - 1; i++) {\n        const program = new CumProgram(op, permutedX.shape, false, reverse);\n        const customValues = [[i]];\n        const prevResult = result;\n        result =\n            backend.runWebGLProgram(program, [result], result.dtype, customValues);\n        backend.disposeIntermediateTensorInfo(prevResult);\n    }\n    // For exclusive cum, shift the end result in the direction of product or sum\n    // and add 1 for product or 0 for sum to the front index.\n    if (exclusive) {\n        const program = new CumProgram(op, permutedX.shape, exclusive, reverse);\n        const prevResult = result;\n        result = backend.runWebGLProgram(program, [result], result.dtype);\n        backend.disposeIntermediateTensorInfo(prevResult);\n    }\n    if (permutation != null) {\n        const reversePermutation = backend_util.getUndoAxesPermutation(permutation);\n        const reverseTransposedResult = transpose({ inputs: { x: result }, backend, attrs: { perm: reversePermutation } });\n        backend.disposeIntermediateTensorInfo(result);\n        backend.disposeIntermediateTensorInfo(permutedX);\n        return reverseTransposedResult;\n    }\n    return result;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VtX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvQ3VtX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBYSxNQUFNLHVCQUF1QixDQUFDO0FBRy9ELE9BQU8sRUFBWSxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFakQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxPQUFPLENBQ25CLEVBQWEsRUFBRSxDQUFhLEVBQUUsT0FBeUIsRUFBRSxJQUFZLEVBQ3JFLFNBQWtCLEVBQUUsT0FBZ0I7SUFDdEMsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDN0IsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUMsRUFBQyxDQUFDLENBQUM7S0FDM0U7SUFDRCxNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWhFLElBQUksWUFBWSxLQUFLLEtBQUssR0FBRyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FDWCxtREFDSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEdBQUc7WUFDekIsZ0JBQWdCLElBQUksRUFBRSxDQUFDLENBQUM7S0FDN0I7SUFDRCxNQUFNLElBQUksR0FBRyxTQUFTLENBQUMsS0FBSyxDQUFDLFlBQVksQ0FBQyxDQUFDO0lBQzNDLElBQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxTQUFTLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0lBQ3pELDJDQUEyQztJQUMzQywrR0FBK0c7SUFDL0csNEVBQTRFO0lBQzVFLDZCQUE2QjtJQUU3QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hELE1BQU0sT0FBTyxHQUFHLElBQUksVUFBVSxDQUFDLEVBQUUsRUFBRSxTQUFTLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNwRSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUM7UUFDMUIsTUFBTTtZQUNGLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUMzRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsVUFBVSxDQUFDLENBQUM7S0FDbkQ7SUFDRCw2RUFBNkU7SUFDN0UseURBQXlEO0lBQ3pELElBQUksU0FBUyxFQUFFO1FBQ2IsTUFBTSxPQUFPLEdBQUcsSUFBSSxVQUFVLENBQUMsRUFBRSxFQUFFLFNBQVMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQztRQUMxQixNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ25EO0lBRUQsSUFBSSxXQUFXLElBQUksSUFBSSxFQUFFO1FBQ3ZCLE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQzVFLE1BQU0sdUJBQXVCLEdBQUcsU0FBUyxDQUNyQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLGtCQUFrQixFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBRXZFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFakQsT0FBTyx1QkFBdUIsQ0FBQztLQUNoQztJQUVELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDdW1PcFR5cGUsIEN1bVByb2dyYW19IGZyb20gJy4uL2N1bV9ncHUnO1xuXG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjdW1JbXBsKFxuICAgIG9wOiBDdW1PcFR5cGUsIHg6IFRlbnNvckluZm8sIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF4aXM6IG51bWJlcixcbiAgICBleGNsdXNpdmU6IGJvb2xlYW4sIHJldmVyc2U6IGJvb2xlYW4pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgcGVybXV0YXRpb24gPSBiYWNrZW5kX3V0aWwuZ2V0QXhlc1Blcm11dGF0aW9uKFtheGlzXSwgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGF0aW9uICE9IG51bGwpIHtcbiAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGF0aW9ufX0pO1xuICB9XG4gIGNvbnN0IHBlcm11dGVkQXhpcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKDEsIHhSYW5rKVswXTtcblxuICBpZiAocGVybXV0ZWRBeGlzICE9PSB4UmFuayAtIDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBXZWJHTCBjdW1wcm9kIHNoYWRlciBleHBlY3RzIGFuIGlubmVyLW1vc3QgYXhpcz0ke1xuICAgICAgICAgICAgeC5zaGFwZS5sZW5ndGggLSAxfSBgICtcbiAgICAgICAgYGJ1dCBnb3QgYXhpcz0ke2F4aXN9YCk7XG4gIH1cbiAgY29uc3Qgc2l6ZSA9IHBlcm11dGVkWC5zaGFwZVtwZXJtdXRlZEF4aXNdO1xuICBsZXQgcmVzdWx0ID0gaWRlbnRpdHkoe2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmR9KTtcbiAgLy8gVXNlIGN1bSBwYXJhbGxlbCBhbGdvcml0aG0sIGluc3BpcmVkIGJ5OlxuICAvLyBodHRwczovL2RldmVsb3Blci5udmlkaWEuY29tL2dwdWdlbXMvZ3B1Z2VtczMvcGFydC12aS1ncHUtY29tcHV0aW5nL2NoYXB0ZXItMzktcGFyYWxsZWwtcHJlZml4LXN1bS1zY2FuLWN1ZGFcbiAgLy8gTm90ZTogYWx0aG91Z2ggdGhlIGFsZ29yaXRobSBpcyBjYWxsZWQgc3VtLCBpdCB3b3JrcyBmb3IgYW55IGFzc29jaXRhdGl2ZVxuICAvLyBvcGVyYXRvciB3aXRoIGFuIGlkZW50aXR5LlxuXG4gIGZvciAobGV0IGkgPSAwOyBpIDw9IE1hdGguY2VpbChNYXRoLmxvZzIoc2l6ZSkpIC0gMTsgaSsrKSB7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDdW1Qcm9ncmFtKG9wLCBwZXJtdXRlZFguc2hhcGUsIGZhbHNlLCByZXZlcnNlKTtcbiAgICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW2ldXTtcbiAgICBjb25zdCBwcmV2UmVzdWx0ID0gcmVzdWx0O1xuICAgIHJlc3VsdCA9XG4gICAgICAgIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtyZXN1bHRdLCByZXN1bHQuZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcmV2UmVzdWx0KTtcbiAgfVxuICAvLyBGb3IgZXhjbHVzaXZlIGN1bSwgc2hpZnQgdGhlIGVuZCByZXN1bHQgaW4gdGhlIGRpcmVjdGlvbiBvZiBwcm9kdWN0IG9yIHN1bVxuICAvLyBhbmQgYWRkIDEgZm9yIHByb2R1Y3Qgb3IgMCBmb3Igc3VtIHRvIHRoZSBmcm9udCBpbmRleC5cbiAgaWYgKGV4Y2x1c2l2ZSkge1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgQ3VtUHJvZ3JhbShvcCwgcGVybXV0ZWRYLnNoYXBlLCBleGNsdXNpdmUsIHJldmVyc2UpO1xuICAgIGNvbnN0IHByZXZSZXN1bHQgPSByZXN1bHQ7XG4gICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3Jlc3VsdF0sIHJlc3VsdC5kdHlwZSk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwcmV2UmVzdWx0KTtcbiAgfVxuXG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgY29uc3QgcmV2ZXJzZVBlcm11dGF0aW9uID0gYmFja2VuZF91dGlsLmdldFVuZG9BeGVzUGVybXV0YXRpb24ocGVybXV0YXRpb24pO1xuICAgIGNvbnN0IHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0ID0gdHJhbnNwb3NlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcmVzdWx0fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiByZXZlcnNlUGVybXV0YXRpb259fSk7XG5cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHJlc3VsdCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhwZXJtdXRlZFgpO1xuXG4gICAgcmV0dXJuIHJldmVyc2VUcmFuc3Bvc2VkUmVzdWx0O1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cumprod } from '@tensorflow/tfjs-core';\nimport { CumOpType } from '../cum_gpu';\nimport { cumImpl } from './Cum_impl';\nexport function cumprod(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, exclusive, reverse } = attrs;\n    return cumImpl(CumOpType.Prod, x, backend, axis, exclusive, reverse);\n}\nexport const cumprodConfig = {\n    kernelName: Cumprod,\n    backendName: 'webgl',\n    kernelFunc: cumprod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3VtcHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9DdW1wcm9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQW9FLE1BQU0sdUJBQXVCLENBQUM7QUFHakgsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNyQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBRW5DLE1BQU0sVUFBVSxPQUFPLENBQUMsSUFJdkI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFekMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdkUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q3VtcHJvZCwgQ3VtcHJvZEF0dHJzLCBDdW1wcm9kSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0N1bU9wVHlwZX0gZnJvbSAnLi4vY3VtX2dwdSc7XG5pbXBvcnQge2N1bUltcGx9IGZyb20gJy4vQ3VtX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3VtcHJvZChhcmdzOiB7XG4gIGlucHV0czogQ3VtcHJvZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IEN1bXByb2RBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtheGlzLCBleGNsdXNpdmUsIHJldmVyc2V9ID0gYXR0cnM7XG5cbiAgcmV0dXJuIGN1bUltcGwoQ3VtT3BUeXBlLlByb2QsIHgsIGJhY2tlbmQsIGF4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZSk7XG59XG5cbmV4cG9ydCBjb25zdCBjdW1wcm9kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEN1bXByb2QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjdW1wcm9kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Cumsum } from '@tensorflow/tfjs-core';\nimport { CumOpType } from '../cum_gpu';\nimport { cumImpl } from './Cum_impl';\nexport function cumsum(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, exclusive, reverse } = attrs;\n    return cumImpl(CumOpType.Sum, x, backend, axis, exclusive, reverse);\n}\nexport const cumsumConfig = {\n    kernelName: Cumsum,\n    backendName: 'webgl',\n    kernelFunc: cumsum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQ3Vtc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0N1bXN1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFrRSxNQUFNLHVCQUF1QixDQUFDO0FBRzlHLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFDckMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVuQyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUN5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDekMsT0FBTyxPQUFPLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDdEUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Q3Vtc3VtLCBDdW1zdW1BdHRycywgQ3Vtc3VtSW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0N1bU9wVHlwZX0gZnJvbSAnLi4vY3VtX2dwdSc7XG5pbXBvcnQge2N1bUltcGx9IGZyb20gJy4vQ3VtX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3Vtc3VtKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IEN1bXN1bUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IEN1bXN1bUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGV4Y2x1c2l2ZSwgcmV2ZXJzZX0gPSBhdHRycztcbiAgcmV0dXJuIGN1bUltcGwoQ3VtT3BUeXBlLlN1bSwgeCwgYmFja2VuZCwgYXhpcywgZXhjbHVzaXZlLCByZXZlcnNlKTtcbn1cblxuZXhwb3J0IGNvbnN0IGN1bXN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBDdW1zdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBjdW1zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DenseBincount } from '@tensorflow/tfjs-core';\nimport { bincountImplCPU, bincountReduceImplCPU } from '../kernel_utils/shared';\nexport function denseBincount(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, weights } = inputs;\n    const { size, binaryOutput } = attrs;\n    if (x.shape.length === 1) {\n        const xVals = backend.readSync(x.dataId);\n        const weightsVals = backend.readSync(weights.dataId);\n        const outVals = bincountImplCPU(xVals, weightsVals, weights.dtype, weights.shape, size);\n        return backend.makeTensorInfo([size], weights.dtype, outVals);\n    }\n    else if (x.shape.length === 2) {\n        const xBuf = backend.bufferSync(x);\n        const weightsBuf = backend.bufferSync(weights);\n        const outBuf = bincountReduceImplCPU(xBuf, weightsBuf, size, binaryOutput);\n        return backend.makeTensorInfo(outBuf.shape, weights.dtype, outBuf.values);\n    }\n    throw new Error(`Error in denseBincount: input must be at most rank 2, but got rank` +\n        `${x.shape.length}.`);\n}\nexport const denseBincountConfig = {\n    kernelName: DenseBincount,\n    backendName: 'webgl',\n    kernelFunc: denseBincount\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVuc2VCaW5jb3VudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9EZW5zZUJpbmNvdW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxhQUFhLEVBQWtHLE1BQU0sdUJBQXVCLENBQUM7QUFHckosT0FBTyxFQUFDLGVBQWUsRUFBRSxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTlFLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFJN0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFbkMsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDeEIsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFlLENBQUM7UUFDdkQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFlLENBQUM7UUFFbkUsTUFBTSxPQUFPLEdBQ1QsZUFBZSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRTVFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLE9BQU8sQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7S0FDL0Q7U0FBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUMvQixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFrQixDQUFDLENBQUMsQ0FBQztRQUNwRCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsVUFBVSxDQUFrQixPQUFPLENBQUMsQ0FBQztRQUVoRSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztRQUUzRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMzRTtJQUVELE1BQU0sSUFBSSxLQUFLLENBQ1gsb0VBQW9FO1FBQ3BFLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0FBQzVCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBaUI7SUFDL0MsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLGFBQWlDO0NBQzlDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGVuc2VCaW5jb3VudCwgRGVuc2VCaW5jb3VudEF0dHJzLCBEZW5zZUJpbmNvdW50SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhbmssIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2JpbmNvdW50SW1wbENQVSwgYmluY291bnRSZWR1Y2VJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlbnNlQmluY291bnQoYXJnczoge1xuICBpbnB1dHM6IERlbnNlQmluY291bnRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBEZW5zZUJpbmNvdW50QXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIHdlaWdodHN9ID0gaW5wdXRzO1xuICBjb25zdCB7c2l6ZSwgYmluYXJ5T3V0cHV0fSA9IGF0dHJzO1xuXG4gIGlmICh4LnNoYXBlLmxlbmd0aCA9PT0gMSkge1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5yZWFkU3luYyh4LmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCB3ZWlnaHRzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMod2VpZ2h0cy5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG5cbiAgICBjb25zdCBvdXRWYWxzID1cbiAgICAgICAgYmluY291bnRJbXBsQ1BVKHhWYWxzLCB3ZWlnaHRzVmFscywgd2VpZ2h0cy5kdHlwZSwgd2VpZ2h0cy5zaGFwZSwgc2l6ZSk7XG5cbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbc2l6ZV0sIHdlaWdodHMuZHR5cGUsIG91dFZhbHMpO1xuICB9IGVsc2UgaWYgKHguc2hhcGUubGVuZ3RoID09PSAyKSB7XG4gICAgY29uc3QgeEJ1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KHgpO1xuICAgIGNvbnN0IHdlaWdodHNCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmM8UmFuaywgJ2Zsb2F0MzInPih3ZWlnaHRzKTtcblxuICAgIGNvbnN0IG91dEJ1ZiA9IGJpbmNvdW50UmVkdWNlSW1wbENQVSh4QnVmLCB3ZWlnaHRzQnVmLCBzaXplLCBiaW5hcnlPdXRwdXQpO1xuXG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCB3ZWlnaHRzLmR0eXBlLCBvdXRCdWYudmFsdWVzKTtcbiAgfVxuXG4gIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBFcnJvciBpbiBkZW5zZUJpbmNvdW50OiBpbnB1dCBtdXN0IGJlIGF0IG1vc3QgcmFuayAyLCBidXQgZ290IHJhbmtgICtcbiAgICAgIGAke3guc2hhcGUubGVuZ3RofS5gKTtcbn1cblxuZXhwb3J0IGNvbnN0IGRlbnNlQmluY291bnRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVuc2VCaW5jb3VudCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlbnNlQmluY291bnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class DepthToSpaceProgram {\n    constructor(outputShape, blockSize, dataFormat) {\n        this.variableNames = ['x'];\n        this.outputShape = [];\n        this.outputShape = outputShape;\n        this.blockSize = blockSize;\n        this.dataFormat = dataFormat;\n        this.userCode = `\n    void main() {\n      ivec4 coords = getOutputCoords();\n      int b = coords[0];\n      int h = ${this.getHeightCoordString()};\n      int w = ${this.getWidthCoordString()};\n      int d = ${this.getDepthCoordString()};\n\n      int in_h = h / ${blockSize};\n      int offset_h = imod(h, ${blockSize});\n      int in_w = w / ${blockSize};\n      int offset_w = imod(w, ${blockSize});\n      int offset_d = (offset_h * ${blockSize} + offset_w) *\n        ${this.getOutputDepthSize()};\n      int in_d = d + offset_d;\n\n      float result = ${this.getInputSamplingString()};\n      setOutput(result);\n    }\n  `;\n    }\n    getHeightCoordString() {\n        if (this.dataFormat === 'NHWC') {\n            return `coords[1]`;\n        }\n        else {\n            return `coords[2]`;\n        }\n    }\n    getWidthCoordString() {\n        if (this.dataFormat === 'NHWC') {\n            return `coords[2]`;\n        }\n        else {\n            return `coords[3]`;\n        }\n    }\n    getDepthCoordString() {\n        if (this.dataFormat === 'NHWC') {\n            return `coords[3]`;\n        }\n        else {\n            return `coords[1]`;\n        }\n    }\n    getOutputDepthSize() {\n        if (this.dataFormat === 'NHWC') {\n            return this.outputShape[3];\n        }\n        else {\n            return this.outputShape[1];\n        }\n    }\n    getInputSamplingString() {\n        if (this.dataFormat === 'NHWC') {\n            return `getX(b, in_h, in_w, in_d)`;\n        }\n        else {\n            return `getX(b, in_d, in_h, in_w)`;\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVwdGhfdG9fc3BhY2VfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9kZXB0aF90b19zcGFjZV9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQU85QixZQUNJLFdBQXFCLEVBQUUsU0FBaUIsRUFBRSxVQUF5QjtRQVB2RSxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFPekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7UUFDN0IsSUFBSSxDQUFDLFFBQVEsR0FBRzs7OztnQkFJSixJQUFJLENBQUMsb0JBQW9CLEVBQUU7Z0JBQzNCLElBQUksQ0FBQyxtQkFBbUIsRUFBRTtnQkFDMUIsSUFBSSxDQUFDLG1CQUFtQixFQUFFOzt1QkFFbkIsU0FBUzsrQkFDRCxTQUFTO3VCQUNqQixTQUFTOytCQUNELFNBQVM7bUNBQ0wsU0FBUztVQUNsQyxJQUFJLENBQUMsa0JBQWtCLEVBQUU7Ozt1QkFHWixJQUFJLENBQUMsc0JBQXNCLEVBQUU7OztHQUdqRCxDQUFDO0lBQ0YsQ0FBQztJQUVPLG9CQUFvQjtRQUMxQixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFO1lBQzlCLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO2FBQU07WUFDTCxPQUFPLFdBQVcsQ0FBQztTQUNwQjtJQUNILENBQUM7SUFFTyxtQkFBbUI7UUFDekIsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUM5QixPQUFPLFdBQVcsQ0FBQztTQUNwQjthQUFNO1lBQ0wsT0FBTyxXQUFXLENBQUM7U0FDcEI7SUFDSCxDQUFDO0lBRU8sbUJBQW1CO1FBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVUsS0FBSyxNQUFNLEVBQUU7WUFDOUIsT0FBTyxXQUFXLENBQUM7U0FDcEI7YUFBTTtZQUNMLE9BQU8sV0FBVyxDQUFDO1NBQ3BCO0lBQ0gsQ0FBQztJQUVPLGtCQUFrQjtRQUN4QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFO1lBQzlCLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUM1QjthQUFNO1lBQ0wsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzVCO0lBQ0gsQ0FBQztJQUVPLHNCQUFzQjtRQUM1QixJQUFJLElBQUksQ0FBQyxVQUFVLEtBQUssTUFBTSxFQUFFO1lBQzlCLE9BQU8sMkJBQTJCLENBQUM7U0FDcEM7YUFBTTtZQUNMLE9BQU8sMkJBQTJCLENBQUM7U0FDcEM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGVwdGhUb1NwYWNlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGJsb2NrU2l6ZTogbnVtYmVyO1xuICBkYXRhRm9ybWF0OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBvdXRwdXRTaGFwZTogbnVtYmVyW10sIGJsb2NrU2l6ZTogbnVtYmVyLCBkYXRhRm9ybWF0OiAnTkhXQyd8J05DSFcnKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMuYmxvY2tTaXplID0gYmxvY2tTaXplO1xuICAgIHRoaXMuZGF0YUZvcm1hdCA9IGRhdGFGb3JtYXQ7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICBpdmVjNCBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgaW50IGggPSAke3RoaXMuZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKX07XG4gICAgICBpbnQgdyA9ICR7dGhpcy5nZXRXaWR0aENvb3JkU3RyaW5nKCl9O1xuICAgICAgaW50IGQgPSAke3RoaXMuZ2V0RGVwdGhDb29yZFN0cmluZygpfTtcblxuICAgICAgaW50IGluX2ggPSBoIC8gJHtibG9ja1NpemV9O1xuICAgICAgaW50IG9mZnNldF9oID0gaW1vZChoLCAke2Jsb2NrU2l6ZX0pO1xuICAgICAgaW50IGluX3cgPSB3IC8gJHtibG9ja1NpemV9O1xuICAgICAgaW50IG9mZnNldF93ID0gaW1vZCh3LCAke2Jsb2NrU2l6ZX0pO1xuICAgICAgaW50IG9mZnNldF9kID0gKG9mZnNldF9oICogJHtibG9ja1NpemV9ICsgb2Zmc2V0X3cpICpcbiAgICAgICAgJHt0aGlzLmdldE91dHB1dERlcHRoU2l6ZSgpfTtcbiAgICAgIGludCBpbl9kID0gZCArIG9mZnNldF9kO1xuXG4gICAgICBmbG9hdCByZXN1bHQgPSAke3RoaXMuZ2V0SW5wdXRTYW1wbGluZ1N0cmluZygpfTtcbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgIH1cbiAgYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0SGVpZ2h0Q29vcmRTdHJpbmcoKTogc3RyaW5nIHtcbiAgICBpZiAodGhpcy5kYXRhRm9ybWF0ID09PSAnTkhXQycpIHtcbiAgICAgIHJldHVybiBgY29vcmRzWzFdYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBjb29yZHNbMl1gO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0V2lkdGhDb29yZFN0cmluZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgcmV0dXJuIGBjb29yZHNbMl1gO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYGNvb3Jkc1szXWA7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXREZXB0aENvb3JkU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSB7XG4gICAgICByZXR1cm4gYGNvb3Jkc1szXWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBgY29vcmRzWzFdYDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE91dHB1dERlcHRoU2l6ZSgpOiBudW1iZXIge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgcmV0dXJuIHRoaXMub3V0cHV0U2hhcGVbM107XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLm91dHB1dFNoYXBlWzFdO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0SW5wdXRTYW1wbGluZ1N0cmluZygpOiBzdHJpbmcge1xuICAgIGlmICh0aGlzLmRhdGFGb3JtYXQgPT09ICdOSFdDJykge1xuICAgICAgcmV0dXJuIGBnZXRYKGIsIGluX2gsIGluX3csIGluX2QpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGBnZXRYKGIsIGluX2QsIGluX2gsIGluX3cpYDtcbiAgICB9XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { DepthToSpace } from '@tensorflow/tfjs-core';\nimport { DepthToSpaceProgram } from '../depth_to_space_gpu';\nexport function depthToSpace(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { blockSize, dataFormat } = attrs;\n    const batchSize = x.shape[0];\n    const inputHeight = (dataFormat === 'NHWC') ? x.shape[1] : x.shape[2];\n    const inputWidth = (dataFormat === 'NHWC') ? x.shape[2] : x.shape[3];\n    const inputDepth = (dataFormat === 'NHWC') ? x.shape[3] : x.shape[1];\n    const outputHeight = inputHeight * blockSize;\n    const outputWidth = inputWidth * blockSize;\n    const outputDepth = inputDepth / (blockSize * blockSize);\n    const outputShape = (dataFormat === 'NHWC') ?\n        [batchSize, outputHeight, outputWidth, outputDepth] :\n        [batchSize, outputDepth, outputHeight, outputWidth];\n    const program = new DepthToSpaceProgram(outputShape, blockSize, dataFormat);\n    return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const depthToSpaceConfig = {\n    kernelName: DepthToSpace,\n    backendName: 'webgl',\n    kernelFunc: depthToSpace\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGhUb1NwYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0RlcHRoVG9TcGFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE4RSxNQUFNLHVCQUF1QixDQUFDO0FBR2hJLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE1BQU0sVUFBVSxZQUFZLENBQUMsSUFJNUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUV0QyxNQUFNLFNBQVMsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzdCLE1BQU0sV0FBVyxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3RFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sVUFBVSxHQUFHLENBQUMsVUFBVSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJFLE1BQU0sWUFBWSxHQUFHLFdBQVcsR0FBRyxTQUFTLENBQUM7SUFDN0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUMzQyxNQUFNLFdBQVcsR0FBRyxVQUFVLEdBQUcsQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDLENBQUM7SUFFekQsTUFBTSxXQUFXLEdBQUcsQ0FBQyxVQUFVLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6QyxDQUFDLFNBQVMsRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDckQsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFlBQVksRUFBRSxXQUFXLENBQUMsQ0FBQztJQUV4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLG1CQUFtQixDQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDNUUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCO0lBQzlDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxZQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0RlcHRoVG9TcGFjZSwgRGVwdGhUb1NwYWNlQXR0cnMsIERlcHRoVG9TcGFjZUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtEZXB0aFRvU3BhY2VQcm9ncmFtfSBmcm9tICcuLi9kZXB0aF90b19zcGFjZV9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGhUb1NwYWNlKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aFRvU3BhY2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBEZXB0aFRvU3BhY2VBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtibG9ja1NpemUsIGRhdGFGb3JtYXR9ID0gYXR0cnM7XG5cbiAgY29uc3QgYmF0Y2hTaXplID0geC5zaGFwZVswXTtcbiAgY29uc3QgaW5wdXRIZWlnaHQgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/IHguc2hhcGVbMV0gOiB4LnNoYXBlWzJdO1xuICBjb25zdCBpbnB1dFdpZHRoID0gKGRhdGFGb3JtYXQgPT09ICdOSFdDJykgPyB4LnNoYXBlWzJdIDogeC5zaGFwZVszXTtcbiAgY29uc3QgaW5wdXREZXB0aCA9IChkYXRhRm9ybWF0ID09PSAnTkhXQycpID8geC5zaGFwZVszXSA6IHguc2hhcGVbMV07XG5cbiAgY29uc3Qgb3V0cHV0SGVpZ2h0ID0gaW5wdXRIZWlnaHQgKiBibG9ja1NpemU7XG4gIGNvbnN0IG91dHB1dFdpZHRoID0gaW5wdXRXaWR0aCAqIGJsb2NrU2l6ZTtcbiAgY29uc3Qgb3V0cHV0RGVwdGggPSBpbnB1dERlcHRoIC8gKGJsb2NrU2l6ZSAqIGJsb2NrU2l6ZSk7XG5cbiAgY29uc3Qgb3V0cHV0U2hhcGUgPSAoZGF0YUZvcm1hdCA9PT0gJ05IV0MnKSA/XG4gICAgICBbYmF0Y2hTaXplLCBvdXRwdXRIZWlnaHQsIG91dHB1dFdpZHRoLCBvdXRwdXREZXB0aF0gOlxuICAgICAgW2JhdGNoU2l6ZSwgb3V0cHV0RGVwdGgsIG91dHB1dEhlaWdodCwgb3V0cHV0V2lkdGhdO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgRGVwdGhUb1NwYWNlUHJvZ3JhbShvdXRwdXRTaGFwZSwgYmxvY2tTaXplLCBkYXRhRm9ybWF0KTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aFRvU3BhY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGVwdGhUb1NwYWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZGVwdGhUb1NwYWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { useShapeUniforms } from './gpgpu_math';\nexport class DepthwiseConv2DProgram {\n    constructor(convInfo, addBias = false, activation = null, hasPreluActivation = false, hasLeakyReluAlpha = false) {\n        this.variableNames = ['x', 'W'];\n        this.customUniforms = [\n            { name: 'pads', type: 'ivec2' },\n            { name: 'strides', type: 'ivec2' },\n            { name: 'dilations', type: 'ivec2' },\n            { name: 'inDims', type: 'ivec2' },\n        ];\n        this.outputShape = convInfo.outShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const channelMul = convInfo.outChannels / convInfo.inChannels;\n        let activationSnippet = '', applyActivationSnippet = '';\n        if (activation) {\n            if (hasPreluActivation) {\n                activationSnippet = `float activation(float a) {\n          float b = getPreluActivationWeightsAtOutCoords();\n          ${activation}\n        }`;\n            }\n            else if (hasLeakyReluAlpha) {\n                activationSnippet = `float activation(float a) {\n          float b = getLeakyreluAlphaAtOutCoords();\n          ${activation}\n        }`;\n            }\n            else {\n                activationSnippet = `\n          float activation(float x) {\n            ${activation}\n          }\n        `;\n            }\n            applyActivationSnippet = `result = activation(result);`;\n        }\n        const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n        if (addBias) {\n            this.variableNames.push('bias');\n        }\n        if (hasPreluActivation) {\n            this.variableNames.push('preluActivationWeights');\n        }\n        if (hasLeakyReluAlpha) {\n            this.variableNames.push('leakyreluAlpha');\n        }\n        this.userCode = `\n      ${activationSnippet}\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int batch = coords.x;\n        ivec2 xRCCorner = coords.yz * strides - pads;\n        int d2 = coords.w;\n        int d1 = d2 / ${channelMul};\n        int q = d2 - d1 * ${channelMul};\n\n        int xRCorner = xRCCorner.x;\n        int xCCorner = xRCCorner.y;\n\n        // Convolve x(?, ?, d1) with w(:, :, d1, q) to get y(yR, yC, d2).\n        // ? = to be determined. : = across all values in that axis.\n        float dotProd = 0.0;\n        // TO DO(dsmilkov): Flatten the two for loops and vec4 the operations.\n        for (int wR = 0; wR < ${filterHeight}; wR++) {\n          int xR = xRCorner + wR * dilations[0];\n\n          if (xR < 0 || xR >= inDims[0]) {\n            continue;\n          }\n\n          for (int wC = 0; wC < ${filterWidth}; wC++) {\n            int xC = xCCorner + wC * dilations[1];\n\n            if (xC < 0 || xC >= inDims[1]) {\n              continue;\n            }\n\n            float xVal = getX(batch, xR, xC, d1);\n            float wVal = getW(wR, wC, d1, q);\n            dotProd += xVal * wVal;\n          }\n        }\n\n        float result = dotProd;\n        ${addBiasSnippet}\n        ${applyActivationSnippet}\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9ncHVfZGVwdGh3aXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jb252X2dwdV9kZXB0aHdpc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTVELE1BQU0sT0FBTyxzQkFBc0I7SUFZakMsWUFDSSxRQUFpQyxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQ2xELGFBQXFCLElBQUksRUFBRSxrQkFBa0IsR0FBRyxLQUFLLEVBQ3JELGlCQUFpQixHQUFHLEtBQUs7UUFkN0Isa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUkzQixtQkFBYyxHQUFHO1lBQ2YsRUFBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQ3ZDLEVBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtZQUMxQyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7WUFDNUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1NBQzFDLENBQUM7UUFNQSxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxRQUFRLENBQUM7UUFDckMsSUFBSSxDQUFDLG1CQUFtQixHQUFHLGdCQUFnQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFckUsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsQ0FBQztRQUU5RCxJQUFJLGlCQUFpQixHQUFHLEVBQUUsRUFBRSxzQkFBc0IsR0FBRyxFQUFFLENBQUM7UUFDeEQsSUFBSSxVQUFVLEVBQUU7WUFDZCxJQUFJLGtCQUFrQixFQUFFO2dCQUN0QixpQkFBaUIsR0FBRzs7WUFFaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtpQkFBTSxJQUFJLGlCQUFpQixFQUFFO2dCQUM1QixpQkFBaUIsR0FBRzs7WUFFaEIsVUFBVTtVQUNaLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxpQkFBaUIsR0FBRzs7Y0FFZCxVQUFVOztTQUVmLENBQUM7YUFDSDtZQUVELHNCQUFzQixHQUFHLDhCQUE4QixDQUFDO1NBQ3pEO1FBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3hFLElBQUksT0FBTyxFQUFFO1lBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7U0FDakM7UUFFRCxJQUFJLGtCQUFrQixFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHO1FBQ1osaUJBQWlCOzs7Ozs7O3dCQU9ELFVBQVU7NEJBQ04sVUFBVTs7Ozs7Ozs7O2dDQVNOLFlBQVk7Ozs7Ozs7a0NBT1YsV0FBVzs7Ozs7Ozs7Ozs7Ozs7VUFjbkMsY0FBYztVQUNkLHNCQUFzQjs7O0tBRzNCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW0sIHVzZVNoYXBlVW5pZm9ybXN9IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEZXB0aHdpc2VDb252MkRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdXJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZW5hYmxlU2hhcGVVbmlmb3JtczogYm9vbGVhbjtcbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICdwYWRzJywgdHlwZTogJ2l2ZWMyJyBhcyBjb25zdCB9LFxuICAgIHtuYW1lOiAnc3RyaWRlcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ2RpbGF0aW9ucycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ2luRGltcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgXTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbywgYWRkQmlhcyA9IGZhbHNlLFxuICAgICAgYWN0aXZhdGlvbjogc3RyaW5nID0gbnVsbCwgaGFzUHJlbHVBY3RpdmF0aW9uID0gZmFsc2UsXG4gICAgICBoYXNMZWFreVJlbHVBbHBoYSA9IGZhbHNlKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLm91dFNoYXBlO1xuICAgIHRoaXMuZW5hYmxlU2hhcGVVbmlmb3JtcyA9IHVzZVNoYXBlVW5pZm9ybXModGhpcy5vdXRwdXRTaGFwZS5sZW5ndGgpO1xuXG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3QgY2hhbm5lbE11bCA9IGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscztcblxuICAgIGxldCBhY3RpdmF0aW9uU25pcHBldCA9ICcnLCBhcHBseUFjdGl2YXRpb25TbmlwcGV0ID0gJyc7XG4gICAgaWYgKGFjdGl2YXRpb24pIHtcbiAgICAgIGlmIChoYXNQcmVsdUFjdGl2YXRpb24pIHtcbiAgICAgICAgYWN0aXZhdGlvblNuaXBwZXQgPSBgZmxvYXQgYWN0aXZhdGlvbihmbG9hdCBhKSB7XG4gICAgICAgICAgZmxvYXQgYiA9IGdldFByZWx1QWN0aXZhdGlvbldlaWdodHNBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2UgaWYgKGhhc0xlYWt5UmVsdUFscGhhKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgYSkge1xuICAgICAgICAgIGZsb2F0IGIgPSBnZXRMZWFreXJlbHVBbHBoYUF0T3V0Q29vcmRzKCk7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYFxuICAgICAgICAgIGZsb2F0IGFjdGl2YXRpb24oZmxvYXQgeCkge1xuICAgICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICAgIH1cbiAgICAgICAgYDtcbiAgICAgIH1cblxuICAgICAgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9IGByZXN1bHQgPSBhY3RpdmF0aW9uKHJlc3VsdCk7YDtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRCaWFzU25pcHBldCA9IGFkZEJpYXMgPyAncmVzdWx0ICs9IGdldEJpYXNBdE91dENvb3JkcygpOycgOiAnJztcbiAgICBpZiAoYWRkQmlhcykge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2JpYXMnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgncHJlbHVBY3RpdmF0aW9uV2VpZ2h0cycpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lSZWx1QWxwaGEpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdsZWFreXJlbHVBbHBoYScpO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2FjdGl2YXRpb25TbmlwcGV0fVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBkMiA9IGNvb3Jkcy53O1xuICAgICAgICBpbnQgZDEgPSBkMiAvICR7Y2hhbm5lbE11bH07XG4gICAgICAgIGludCBxID0gZDIgLSBkMSAqICR7Y2hhbm5lbE11bH07XG5cbiAgICAgICAgaW50IHhSQ29ybmVyID0geFJDQ29ybmVyLng7XG4gICAgICAgIGludCB4Q0Nvcm5lciA9IHhSQ0Nvcm5lci55O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIHgoPywgPywgZDEpIHdpdGggdyg6LCA6LCBkMSwgcSkgdG8gZ2V0IHkoeVIsIHlDLCBkMikuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuICAgICAgICAvLyBUTyBETyhkc21pbGtvdik6IEZsYXR0ZW4gdGhlIHR3byBmb3IgbG9vcHMgYW5kIHZlYzQgdGhlIG9wZXJhdGlvbnMuXG4gICAgICAgIGZvciAoaW50IHdSID0gMDsgd1IgPCAke2ZpbHRlckhlaWdodH07IHdSKyspIHtcbiAgICAgICAgICBpbnQgeFIgPSB4UkNvcm5lciArIHdSICogZGlsYXRpb25zWzBdO1xuXG4gICAgICAgICAgaWYgKHhSIDwgMCB8fCB4UiA+PSBpbkRpbXNbMF0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IHdDID0gMDsgd0MgPCAke2ZpbHRlcldpZHRofTsgd0MrKykge1xuICAgICAgICAgICAgaW50IHhDID0geENDb3JuZXIgKyB3QyAqIGRpbGF0aW9uc1sxXTtcblxuICAgICAgICAgICAgaWYgKHhDIDwgMCB8fCB4QyA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IHhWYWwgPSBnZXRYKGJhdGNoLCB4UiwgeEMsIGQxKTtcbiAgICAgICAgICAgIGZsb2F0IHdWYWwgPSBnZXRXKHdSLCB3QywgZDEsIHEpO1xuICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsICogd1ZhbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmbG9hdCByZXN1bHQgPSBkb3RQcm9kO1xuICAgICAgICAke2FkZEJpYXNTbmlwcGV0fVxuICAgICAgICAke2FwcGx5QWN0aXZhdGlvblNuaXBwZXR9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { useShapeUniforms } from './gpgpu_math';\nexport class DepthwiseConvPacked2DProgram {\n    constructor(convInfo, addBias = false, activation = null, hasPreluActivation = false, hasLeakyReluAlpha = false) {\n        this.variableNames = ['x', 'W'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.customUniforms = [\n            { name: 'pads', type: 'ivec2' },\n            { name: 'strides', type: 'ivec2' },\n            { name: 'dilations', type: 'ivec2' },\n            { name: 'inDims', type: 'ivec2' },\n        ];\n        this.outputShape = convInfo.outShape;\n        this.enableShapeUniforms = useShapeUniforms(this.outputShape.length);\n        const channelMul = convInfo.outChannels / convInfo.inChannels;\n        const padLeft = convInfo.padInfo.left;\n        const strideWidth = convInfo.strideWidth;\n        const dilationWidth = convInfo.dilationWidth;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const texelsAcross = filterWidth;\n        let mainLoop = `\n      int xR; int xC; int xCOffset;\n      vec4 wTexel; vec4 previous; vec4 final;`;\n        for (let c = 0; c < filterWidth; c++) {\n            mainLoop += `\n          vec4 xTexelC${c * 2};\n          int xTexelC${c * 2}Ready;\n          vec4 xTexelC${c * 2 + 1};\n          int xTexelC${c * 2 + 1}Ready;\n          vec4 xC${c};`;\n        }\n        /**\n         * This vectorized implementation works by gathering the values needed for\n         * each output channel's dot product into vec4's and then multiplying them\n         * all together (this happens in the final double for-loop below). Most of\n         * the main loop consists of constructing these vec4's with the minimum\n         * number of texture2D calls, which means making use of all four returned\n         * values from a texture2D call at once.\n         */\n        mainLoop += `\n    for (int r = 0; r < ${filterHeight}; r++) {\n      `;\n        for (let c = 0; c < filterWidth; c++) {\n            mainLoop += `\n          xTexelC${c * 2} = vec4(0.0);\n          xTexelC${c * 2}Ready = 0;\n          xTexelC${c * 2 + 1} = vec4(0.0);\n          xTexelC${c * 2 + 1}Ready = 0;\n          xC${c} = vec4(0.0);`;\n        }\n        mainLoop += `\n        xR = xRCorner + r * dilations[0];\n        if (xR >=0 && xR < inDims[0]) {\n      `;\n        for (let texelC = 0; texelC < (texelsAcross + 1) / 2; texelC++) {\n            const colIndex = texelC * 2;\n            mainLoop += `\n          xC = xCCorner + ${colIndex * dilationWidth};\n          `;\n            if (strideWidth === 1) {\n                if (colIndex < filterWidth) {\n                    // If padding is odd, the outer texels have to be composed.\n                    if (padLeft % 2 === 1) {\n                        // TODO: Ensure vec4 previous does not result in redundant sample,\n                        // and avoid setting xTexelRC's that exceed the boundary in the\n                        // first place rather than resetting them to vec4(0)).\n                        // To compute xCOffset:\n                        // - If padding is odd, we must add 1 to ensure we ask for an\n                        // even-numbered row.\n                        // - We subtract 2 to access the previous texel.\n                        mainLoop += `\n                xCOffset = xC + 1;\n                if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex}Ready == 0) {\n                  xTexelC${colIndex} = getX(batch, xR, xCOffset, d1);\n\n                  // Need to manually clear unused channels in case\n                  // we're reading from recycled texture.\n                  if (xCOffset + 1 >= inDims[1]) {\n                    xTexelC${colIndex}.zw = vec2(0.0);\n                  }\n                  xTexelC${colIndex}Ready = 1;\n                }\n              `;\n                        // This texel has been read in previous iteration if the dilation\n                        // is 1.\n                        if (dilationWidth === 1 && colIndex > 0) {\n                            mainLoop += `\n                xC${colIndex} = vec4(xTexelC${colIndex - 2}.zw, xTexelC${colIndex}.xy);\n                `;\n                        }\n                        else {\n                            mainLoop += `\n                  xCOffset = xC + 1 - 2;\n\n                  if (xCOffset >= 0 && xCOffset < inDims[1]) {\n                    previous = getX(batch, xR, xCOffset, d1);\n\n                    // Need to manually clear unused channels in case\n                    // we're reading from recycled texture.\n                    if (xCOffset + 1 >= inDims[1]) {\n                      previous.zw = vec2(0.0);\n                    }\n\n                    xC${colIndex} = vec4(previous.zw, xTexelC${colIndex}.xy);\n                  } else {\n                    xC${colIndex} = vec4(0.0, 0.0, xTexelC${colIndex}.xy);\n                  }\n                  `;\n                        }\n                    }\n                    else {\n                        // Padding is even, so xRC corresponds to a single texel.\n                        mainLoop += `\n                if (xC >= 0 && xC < inDims[1] && xTexelC${colIndex}Ready == 0) {\n                  xTexelC${colIndex} = getX(batch, xR, xC, d1);\n                  if (xC + 1 >= inDims[1]) {\n                    xTexelC${colIndex}.zw = vec2(0.0);\n                  }\n                  xTexelC${colIndex}Ready = 1;\n                }\n\n                xC${colIndex} = xTexelC${colIndex};\n                `;\n                    }\n                    if (colIndex + 1 < filterWidth) {\n                        // If dilation is even, the second entry should match the first\n                        // (either both are composed or both are single samples). But if\n                        // dilation is odd, then the second entry should be the opposite\n                        // of the first (if the first is composed, the second is a single\n                        // sample, and vice versa.)\n                        const nextTexelOffset = padLeft % 2 === 0 ?\n                            util.nearestLargerEven(dilationWidth) :\n                            dilationWidth;\n                        if ((dilationWidth % 2 === 0 && padLeft % 2 === 1) ||\n                            (dilationWidth % 2 !== 0 && padLeft % 2 !== 1)) {\n                            mainLoop += `\n                  xCOffset = xC + imod(pads[1], 2) + ${nextTexelOffset};\n\n                  if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n                    xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n\n                    // Need to manually clear unused channels in case\n                    // we're reading from recycled texture.\n                    if (xCOffset + 1 >= inDims[1]) {\n                      xTexelC${colIndex + 1}.zw = vec2(0.0);\n                    }\n                    xTexelC${colIndex + 1}Ready = 1;\n                  }\n                  `;\n                            // If dilation > 1 then the xRC's will not be able to share any\n                            // values, so each xRC will require two unique calls to getX.\n                            if (dilationWidth > 1) {\n                                mainLoop += `\n                    xCOffset -= 2;\n                    if (xCOffset >= 0 && xCOffset < inDims[1]) {\n                     previous = getX(batch, xR, xCOffset, d1);\n                     xC${colIndex + 1} = vec4(previous.zw, xTexelC${colIndex + 1}.xy);\n                    } else {\n                     xC${colIndex + 1} = vec4(0.0, 0.0, xTexelC${colIndex + 1}.xy);\n                    }\n                    `;\n                            }\n                            else {\n                                mainLoop += `\n                    xC${colIndex + 1} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.xy);\n                    `;\n                            }\n                        }\n                        else {\n                            // If dilation is 1 and padding is odd, we have already read the\n                            // texel when constructing the previous x value. Here we can\n                            // simply skip the texture read.\n                            if (nextTexelOffset === 1) {\n                                mainLoop += `\n                    xC${colIndex + 1} = xTexelC${colIndex};\n                    `;\n                            }\n                            else {\n                                mainLoop += `\n                    xCOffset = xC + ${nextTexelOffset};\n\n                    if (xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n                      xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n                      if (xCOffset + 1 >= inDims[1]) {\n                        xTexelC${colIndex + 1}.zw = vec2(0.0);\n                      }\n                      xTexelC${colIndex + 1}Ready = 1;\n                    }\n\n                    xC${colIndex + 1} = xTexelC${colIndex + 1};\n                    `;\n                            }\n                        }\n                    }\n                }\n            }\n            else { // stride === 2\n                if (colIndex < filterWidth) {\n                    // Depending on whether padLeft is even or odd, we want either the\n                    // xy or zw channels from X texels for xC${colIndex}. If padLeft is\n                    // even, xC${colIndex +1} is simply the zw channels of texels we've\n                    // already sampled. But if padLeft is odd, xC{$c + 1}.zw will\n                    // need to come from the xy channels of a new texel, hence the `\n                    // vec4\n                    // final` initialized below.\n                    if (padLeft % 2 === 1) {\n                        mainLoop += `\n                xCOffset = xC + 1 - strides[1];\n                if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex}Ready == 0) {\n                  xTexelC${colIndex} = getX(batch, xR, xCOffset, d1);\n                  // Need to manually clear unused channels in case\n                  // we're reading from recycled texture.\n                  if (xCOffset + 1 >= inDims[1]) {\n                    xTexelC${colIndex}.zw = vec2(0.0);\n                  }\n                  xTexelC${colIndex}Ready = 1;\n                }\n\n                if(xC + 1 >= 0 && xC + 1 < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n                  xTexelC${colIndex + 1} = getX(batch, xR, xC + 1, d1);\n                  // Need to manually clear unused channels in case\n                  // we're reading from recycled texture.\n                  if (xC + 2 >= inDims[1]) {\n                    xTexelC${colIndex + 1}.zw = vec2(0.0);\n                  }\n                  xTexelC${colIndex + 1}Ready = 1;\n                }\n\n                xC${colIndex} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.zw);\n              `;\n                        if (colIndex + 1 < filterWidth) {\n                            mainLoop += `\n                  final = vec4(0.0);\n                  xCOffset = xC + 1 + strides[1];\n                  if(xCOffset >= 0 && xCOffset < inDims[1]) {\n                    final = getX(batch, xR, xCOffset, d1);\n                  }\n                  xC${colIndex + 1} = vec4(xTexelC${colIndex + 1}.xy, final.xy);\n                `;\n                        }\n                    }\n                    else {\n                        mainLoop += `\n                if(xC >= 0 && xC < inDims[1] && xTexelC${colIndex}Ready == 0) {\n                  xTexelC${colIndex} = getX(batch, xR, xC, d1);\n                  if (xC + 1 >= inDims[1]) {\n                    xTexelC${colIndex}.zw = vec2(0.0);\n                  }\n                  xTexelC${colIndex}Ready = 1;\n                }\n\n                xCOffset = xC + strides[1];\n                if(xCOffset >= 0 && xCOffset < inDims[1] && xTexelC${colIndex + 1}Ready == 0) {\n                  xTexelC${colIndex + 1} = getX(batch, xR, xCOffset, d1);\n                  if (xCOffset + 1 >= inDims[1]) {\n                    xTexelC${colIndex + 1}.zw = vec2(0.);\n                  }\n                  xTexelC${colIndex + 1}Ready = 1;\n                }\n\n                xC${colIndex} = vec4(\n                  xTexelC${colIndex}.xy, xTexelC${colIndex + 1}.xy);\n              `;\n                        if (colIndex + 1 < filterWidth) {\n                            mainLoop += `\n                  xC${colIndex + 1} = vec4(xTexelC${colIndex}.zw, xTexelC${colIndex + 1}.zw);\n                `;\n                        }\n                    }\n                }\n            }\n            // localize the dotProd accumulation within the loop, the theory is for\n            // GPU with limited cache, accumulate sum across large amount of\n            // veriables will cause lots of cache misses. (i.e. 5x5 filter will have\n            // 50 variables)\n            if (colIndex < filterWidth) {\n                mainLoop += `\n            wTexel = getW(r, ${colIndex}, d1, q);\n            dotProd += xC${colIndex} * vec4(wTexel.xz, wTexel.xz);\n          `;\n                if (colIndex + 1 < filterWidth) {\n                    mainLoop += `\n              wTexel = getW(r, ${colIndex + 1}, d1, q);\n              dotProd += xC${colIndex + 1} * vec4(wTexel.xz, wTexel.xz);\n            `;\n                }\n            }\n        }\n        mainLoop += `\n    }\n  `;\n        mainLoop += `\n      }\n    `;\n        let activationSnippet = '', applyActivationSnippet = '';\n        if (activation) {\n            if (hasPreluActivation) {\n                activationSnippet = `vec4 activation(vec4 a) {\n          vec4 b = getPreluActivationWeightsAtOutCoords();\n          ${activation}\n        }`;\n            }\n            else if (hasLeakyReluAlpha) {\n                activationSnippet = `vec4 activation(vec4 a) {\n          vec4 b = getLeakyreluAlphaAtOutCoords();\n          ${activation}\n        }`;\n            }\n            else {\n                activationSnippet = `vec4 activation(vec4 x) {\n          ${activation}\n        }`;\n            }\n            applyActivationSnippet = `result = activation(result);`;\n        }\n        const addBiasSnippet = addBias ? 'result += getBiasAtOutCoords();' : '';\n        if (addBias) {\n            this.variableNames.push('bias');\n        }\n        if (hasPreluActivation) {\n            this.variableNames.push('preluActivationWeights');\n        }\n        if (hasLeakyReluAlpha) {\n            this.variableNames.push('leakyreluAlpha');\n        }\n        this.userCode = `\n      ${activationSnippet}\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int batch = coords.x;\n        ivec2 xRCCorner = coords.yz * strides - pads;\n        int d2 = coords.w;\n        int d1 = d2 / ${channelMul};\n        int q = d2 - d1 * ${channelMul};\n        int xRCorner = xRCCorner.x;\n        int xCCorner = xRCCorner.y;\n\n        //intialize dotProd with a small epsilon seems to reduce GPU accuracy loss.\n        vec4 dotProd = vec4(0.000000000000001);\n\n        ${mainLoop}\n\n        vec4 result = dotProd - vec4(0.000000000000001);\n        ${addBiasSnippet}\n        ${applyActivationSnippet}\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9wYWNrZWRfZ3B1X2RlcHRod2lzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvY29udl9wYWNrZWRfZ3B1X2RlcHRod2lzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFekQsT0FBTyxFQUFlLGdCQUFnQixFQUFDLE1BQU0sY0FBYyxDQUFDO0FBRTVELE1BQU0sT0FBTyw0QkFBNEI7SUFjdkMsWUFDSSxRQUFpQyxFQUFFLE9BQU8sR0FBRyxLQUFLLEVBQ2xELGFBQXFCLElBQUksRUFBRSxrQkFBa0IsR0FBRyxLQUFLLEVBQ3JELGlCQUFpQixHQUFHLEtBQUs7UUFoQjdCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDM0IsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFJcEIsbUJBQWMsR0FBRztZQUNmLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtZQUN2QyxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE9BQWdCLEVBQUU7WUFDMUMsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxPQUFnQixFQUFFO1lBQzVDLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsT0FBZ0IsRUFBRTtTQUMxQyxDQUFDO1FBTUEsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBQ3JDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3JFLE1BQU0sVUFBVSxHQUFHLFFBQVEsQ0FBQyxXQUFXLEdBQUcs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QixFQUFFO1lBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDbkQ7UUFDRCxJQUFJLGlCQUFpQixFQUFFO1lBQ3JCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7U0FDM0M7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHO1FBQ1osaUJBQWlCOzs7Ozs7O3dCQU9ELFVBQVU7NEJBQ04sVUFBVTs7Ozs7OztVQU81QixRQUFROzs7VUFHUixjQUFjO1VBQ2Qsc0JBQXNCOzs7S0FHM0IsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtLCB1c2VTaGFwZVVuaWZvcm1zfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnVyddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGVuYWJsZVNoYXBlVW5pZm9ybXM6IGJvb2xlYW47XG4gIGN1c3RvbVVuaWZvcm1zID0gW1xuICAgIHtuYW1lOiAncGFkcycsIHR5cGU6ICdpdmVjMicgYXMgY29uc3QgfSxcbiAgICB7bmFtZTogJ3N0cmlkZXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdkaWxhdGlvbnMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gICAge25hbWU6ICdpbkRpbXMnLCB0eXBlOiAnaXZlYzInIGFzIGNvbnN0IH0sXG4gIF07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sIGFkZEJpYXMgPSBmYWxzZSxcbiAgICAgIGFjdGl2YXRpb246IHN0cmluZyA9IG51bGwsIGhhc1ByZWx1QWN0aXZhdGlvbiA9IGZhbHNlLFxuICAgICAgaGFzTGVha3lSZWx1QWxwaGEgPSBmYWxzZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcbiAgICB0aGlzLmVuYWJsZVNoYXBlVW5pZm9ybXMgPSB1c2VTaGFwZVVuaWZvcm1zKHRoaXMub3V0cHV0U2hhcGUubGVuZ3RoKTtcbiAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuICAgIGNvbnN0IHBhZExlZnQgPSBjb252SW5mby5wYWRJbmZvLmxlZnQ7XG4gICAgY29uc3Qgc3RyaWRlV2lkdGggPSBjb252SW5mby5zdHJpZGVXaWR0aDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBmaWx0ZXJIZWlnaHQgPSBjb252SW5mby5maWx0ZXJIZWlnaHQ7XG4gICAgY29uc3QgZmlsdGVyV2lkdGggPSBjb252SW5mby5maWx0ZXJXaWR0aDtcbiAgICBjb25zdCB0ZXhlbHNBY3Jvc3MgPSBmaWx0ZXJXaWR0aDtcblxuICAgIGxldCBtYWluTG9vcCA9IGBcbiAgICAgIGludCB4UjsgaW50IHhDOyBpbnQgeENPZmZzZXQ7XG4gICAgICB2ZWM0IHdUZXhlbDsgdmVjNCBwcmV2aW91czsgdmVjNCBmaW5hbDtgO1xuXG4gICAgZm9yIChsZXQgYyA9IDA7IGMgPCBmaWx0ZXJXaWR0aDsgYysrKSB7XG4gICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgdmVjNCB4VGV4ZWxDJHtjICogMn07XG4gICAgICAgICAgaW50IHhUZXhlbEMke2MgKiAyfVJlYWR5O1xuICAgICAgICAgIHZlYzQgeFRleGVsQyR7YyAqIDIgKyAxfTtcbiAgICAgICAgICBpbnQgeFRleGVsQyR7YyAqIDIgKyAxfVJlYWR5O1xuICAgICAgICAgIHZlYzQgeEMke2N9O2A7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogVGhpcyB2ZWN0b3JpemVkIGltcGxlbWVudGF0aW9uIHdvcmtzIGJ5IGdhdGhlcmluZyB0aGUgdmFsdWVzIG5lZWRlZCBmb3JcbiAgICAgKiBlYWNoIG91dHB1dCBjaGFubmVsJ3MgZG90IHByb2R1Y3QgaW50byB2ZWM0J3MgYW5kIHRoZW4gbXVsdGlwbHlpbmcgdGhlbVxuICAgICAqIGFsbCB0b2dldGhlciAodGhpcyBoYXBwZW5zIGluIHRoZSBmaW5hbCBkb3VibGUgZm9yLWxvb3AgYmVsb3cpLiBNb3N0IG9mXG4gICAgICogdGhlIG1haW4gbG9vcCBjb25zaXN0cyBvZiBjb25zdHJ1Y3RpbmcgdGhlc2UgdmVjNCdzIHdpdGggdGhlIG1pbmltdW1cbiAgICAgKiBudW1iZXIgb2YgdGV4dHVyZTJEIGNhbGxzLCB3aGljaCBtZWFucyBtYWtpbmcgdXNlIG9mIGFsbCBmb3VyIHJldHVybmVkXG4gICAgICogdmFsdWVzIGZyb20gYSB0ZXh0dXJlMkQgY2FsbCBhdCBvbmNlLlxuICAgICAqL1xuICAgIG1haW5Mb29wICs9IGBcbiAgICBmb3IgKGludCByID0gMDsgciA8ICR7ZmlsdGVySGVpZ2h0fTsgcisrKSB7XG4gICAgICBgO1xuICAgIGZvciAobGV0IGMgPSAwOyBjIDwgZmlsdGVyV2lkdGg7IGMrKykge1xuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHhUZXhlbEMke2MgKiAyfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMn1SZWFkeSA9IDA7XG4gICAgICAgICAgeFRleGVsQyR7YyAqIDIgKyAxfSA9IHZlYzQoMC4wKTtcbiAgICAgICAgICB4VGV4ZWxDJHtjICogMiArIDF9UmVhZHkgPSAwO1xuICAgICAgICAgIHhDJHtjfSA9IHZlYzQoMC4wKTtgO1xuICAgIH1cbiAgICBtYWluTG9vcCArPSBgXG4gICAgICAgIHhSID0geFJDb3JuZXIgKyByICogZGlsYXRpb25zWzBdO1xuICAgICAgICBpZiAoeFIgPj0wICYmIHhSIDwgaW5EaW1zWzBdKSB7XG4gICAgICBgO1xuXG4gICAgZm9yIChsZXQgdGV4ZWxDID0gMDsgdGV4ZWxDIDwgKHRleGVsc0Fjcm9zcyArIDEpIC8gMjsgdGV4ZWxDKyspIHtcbiAgICAgIGNvbnN0IGNvbEluZGV4ID0gdGV4ZWxDICogMjtcblxuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIHhDID0geENDb3JuZXIgKyAke2NvbEluZGV4ICogZGlsYXRpb25XaWR0aH07XG4gICAgICAgICAgYDtcblxuICAgICAgaWYgKHN0cmlkZVdpZHRoID09PSAxKSB7XG4gICAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgLy8gSWYgcGFkZGluZyBpcyBvZGQsIHRoZSBvdXRlciB0ZXhlbHMgaGF2ZSB0byBiZSBjb21wb3NlZC5cbiAgICAgICAgICBpZiAocGFkTGVmdCAlIDIgPT09IDEpIHtcbiAgICAgICAgICAgIC8vIFRPRE86IEVuc3VyZSB2ZWM0IHByZXZpb3VzIGRvZXMgbm90IHJlc3VsdCBpbiByZWR1bmRhbnQgc2FtcGxlLFxuICAgICAgICAgICAgLy8gYW5kIGF2b2lkIHNldHRpbmcgeFRleGVsUkMncyB0aGF0IGV4Y2VlZCB0aGUgYm91bmRhcnkgaW4gdGhlXG4gICAgICAgICAgICAvLyBmaXJzdCBwbGFjZSByYXRoZXIgdGhhbiByZXNldHRpbmcgdGhlbSB0byB2ZWM0KDApKS5cblxuICAgICAgICAgICAgLy8gVG8gY29tcHV0ZSB4Q09mZnNldDpcbiAgICAgICAgICAgIC8vIC0gSWYgcGFkZGluZyBpcyBvZGQsIHdlIG11c3QgYWRkIDEgdG8gZW5zdXJlIHdlIGFzayBmb3IgYW5cbiAgICAgICAgICAgIC8vIGV2ZW4tbnVtYmVyZWQgcm93LlxuICAgICAgICAgICAgLy8gLSBXZSBzdWJ0cmFjdCAyIHRvIGFjY2VzcyB0aGUgcHJldmlvdXMgdGV4ZWwuXG5cbiAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICB4Q09mZnNldCA9IHhDICsgMTtcbiAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICBjb2xJbmRleH1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0gPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcblxuICAgICAgICAgICAgICAgICAgLy8gTmVlZCB0byBtYW51YWxseSBjbGVhciB1bnVzZWQgY2hhbm5lbHMgaW4gY2FzZVxuICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgLy8gVGhpcyB0ZXhlbCBoYXMgYmVlbiByZWFkIGluIHByZXZpb3VzIGl0ZXJhdGlvbiBpZiB0aGUgZGlsYXRpb25cbiAgICAgICAgICAgIC8vIGlzIDEuXG4gICAgICAgICAgICBpZiAoZGlsYXRpb25XaWR0aCA9PT0gMSAmJiBjb2xJbmRleCA+IDApIHtcbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4IC0gMn0uencsIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgY29sSW5kZXh9Lnh5KTtcbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDEgLSAyO1xuXG4gICAgICAgICAgICAgICAgICBpZiAoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMuencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNChwcmV2aW91cy56dywgeFRleGVsQyR7Y29sSW5kZXh9Lnh5KTtcbiAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KDAuMCwgMC4wLCB4VGV4ZWxDJHtjb2xJbmRleH0ueHkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUGFkZGluZyBpcyBldmVuLCBzbyB4UkMgY29ycmVzcG9uZHMgdG8gYSBzaW5nbGUgdGV4ZWwuXG4gICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgaWYgKHhDID49IDAgJiYgeEMgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeEMke2NvbEluZGV4fSA9IHhUZXhlbEMke2NvbEluZGV4fTtcbiAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChjb2xJbmRleCArIDEgPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgLy8gSWYgZGlsYXRpb24gaXMgZXZlbiwgdGhlIHNlY29uZCBlbnRyeSBzaG91bGQgbWF0Y2ggdGhlIGZpcnN0XG4gICAgICAgICAgICAvLyAoZWl0aGVyIGJvdGggYXJlIGNvbXBvc2VkIG9yIGJvdGggYXJlIHNpbmdsZSBzYW1wbGVzKS4gQnV0IGlmXG4gICAgICAgICAgICAvLyBkaWxhdGlvbiBpcyBvZGQsIHRoZW4gdGhlIHNlY29uZCBlbnRyeSBzaG91bGQgYmUgdGhlIG9wcG9zaXRlXG4gICAgICAgICAgICAvLyBvZiB0aGUgZmlyc3QgKGlmIHRoZSBmaXJzdCBpcyBjb21wb3NlZCwgdGhlIHNlY29uZCBpcyBhIHNpbmdsZVxuICAgICAgICAgICAgLy8gc2FtcGxlLCBhbmQgdmljZSB2ZXJzYS4pXG5cbiAgICAgICAgICAgIGNvbnN0IG5leHRUZXhlbE9mZnNldCA9IHBhZExlZnQgJSAyID09PSAwID9cbiAgICAgICAgICAgICAgICB1dGlsLm5lYXJlc3RMYXJnZXJFdmVuKGRpbGF0aW9uV2lkdGgpIDpcbiAgICAgICAgICAgICAgICBkaWxhdGlvbldpZHRoO1xuXG4gICAgICAgICAgICBpZiAoKGRpbGF0aW9uV2lkdGggJSAyID09PSAwICYmIHBhZExlZnQgJSAyID09PSAxKSB8fFxuICAgICAgICAgICAgICAgIChkaWxhdGlvbldpZHRoICUgMiAhPT0gMCAmJiBwYWRMZWZ0ICUgMiAhPT0gMSkpIHtcbiAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIGltb2QocGFkc1sxXSwgMikgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgaW5EaW1zWzFdICYmIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gbWFudWFsbHkgY2xlYXIgdW51c2VkIGNoYW5uZWxzIGluIGNhc2VcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgcmVhZGluZyBmcm9tIHJlY3ljbGVkIHRleHR1cmUuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiA+IDEgdGhlbiB0aGUgeFJDJ3Mgd2lsbCBub3QgYmUgYWJsZSB0byBzaGFyZSBhbnlcbiAgICAgICAgICAgICAgLy8gdmFsdWVzLCBzbyBlYWNoIHhSQyB3aWxsIHJlcXVpcmUgdHdvIHVuaXF1ZSBjYWxscyB0byBnZXRYLlxuICAgICAgICAgICAgICBpZiAoZGlsYXRpb25XaWR0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0IC09IDI7XG4gICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCA+PSAwICYmIHhDT2Zmc2V0IDwgaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICBwcmV2aW91cyA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHByZXZpb3VzLnp3LCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS54eSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHZlYzQoMC4wLCAwLjAsIHhUZXhlbEMke1xuICAgICAgICAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9Lnh5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX0ueHkpO1xuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBJZiBkaWxhdGlvbiBpcyAxIGFuZCBwYWRkaW5nIGlzIG9kZCwgd2UgaGF2ZSBhbHJlYWR5IHJlYWQgdGhlXG4gICAgICAgICAgICAgIC8vIHRleGVsIHdoZW4gY29uc3RydWN0aW5nIHRoZSBwcmV2aW91cyB4IHZhbHVlLiBIZXJlIHdlIGNhblxuICAgICAgICAgICAgICAvLyBzaW1wbHkgc2tpcCB0aGUgdGV4dHVyZSByZWFkLlxuICAgICAgICAgICAgICBpZiAobmV4dFRleGVsT2Zmc2V0ID09PSAxKSB7XG4gICAgICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHhUZXhlbEMke2NvbEluZGV4fTtcbiAgICAgICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAke25leHRUZXhlbE9mZnNldH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX1SZWFkeSA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnp3ID0gdmVjMigwLjApO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgeEMke2NvbEluZGV4ICsgMX0gPSB4VGV4ZWxDJHtjb2xJbmRleCArIDF9O1xuICAgICAgICAgICAgICAgICAgICBgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2UgeyAgLy8gc3RyaWRlID09PSAyXG4gICAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgLy8gRGVwZW5kaW5nIG9uIHdoZXRoZXIgcGFkTGVmdCBpcyBldmVuIG9yIG9kZCwgd2Ugd2FudCBlaXRoZXIgdGhlXG4gICAgICAgICAgLy8geHkgb3IgencgY2hhbm5lbHMgZnJvbSBYIHRleGVscyBmb3IgeEMke2NvbEluZGV4fS4gSWYgcGFkTGVmdCBpc1xuICAgICAgICAgIC8vIGV2ZW4sIHhDJHtjb2xJbmRleCArMX0gaXMgc2ltcGx5IHRoZSB6dyBjaGFubmVscyBvZiB0ZXhlbHMgd2UndmVcbiAgICAgICAgICAvLyBhbHJlYWR5IHNhbXBsZWQuIEJ1dCBpZiBwYWRMZWZ0IGlzIG9kZCwgeEN7JGMgKyAxfS56dyB3aWxsXG4gICAgICAgICAgLy8gbmVlZCB0byBjb21lIGZyb20gdGhlIHh5IGNoYW5uZWxzIG9mIGEgbmV3IHRleGVsLCBoZW5jZSB0aGUgYFxuICAgICAgICAgIC8vIHZlYzRcbiAgICAgICAgICAvLyBmaW5hbGAgaW5pdGlhbGl6ZWQgYmVsb3cuXG4gICAgICAgICAgaWYgKHBhZExlZnQgJSAyID09PSAxKSB7XG4gICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIDEgLSBzdHJpZGVzWzFdO1xuICAgICAgICAgICAgICAgIGlmKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgY29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDT2Zmc2V0LCBkMSk7XG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgIGlmICh4Q09mZnNldCArIDEgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS56dyA9IHZlYzIoMC4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZih4QyArIDEgPj0gMCAmJiB4QyArIDEgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfVJlYWR5ID09IDApIHtcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0gPSBnZXRYKGJhdGNoLCB4UiwgeEMgKyAxLCBkMSk7XG4gICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIG1hbnVhbGx5IGNsZWFyIHVudXNlZCBjaGFubmVscyBpbiBjYXNlXG4gICAgICAgICAgICAgICAgICAvLyB3ZSdyZSByZWFkaW5nIGZyb20gcmVjeWNsZWQgdGV4dHVyZS5cbiAgICAgICAgICAgICAgICAgIGlmICh4QyArIDIgPj0gaW5EaW1zWzFdKSB7XG4gICAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4ICsgMX0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleCArIDF9UmVhZHkgPSAxO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleH0gPSB2ZWM0KHhUZXhlbEMke2NvbEluZGV4fS56dywgeFRleGVsQyR7XG4gICAgICAgICAgICAgICAgY29sSW5kZXggKyAxfS56dyk7XG4gICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIGlmIChjb2xJbmRleCArIDEgPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICBmaW5hbCA9IHZlYzQoMC4wKTtcbiAgICAgICAgICAgICAgICAgIHhDT2Zmc2V0ID0geEMgKyAxICsgc3RyaWRlc1sxXTtcbiAgICAgICAgICAgICAgICAgIGlmKHhDT2Zmc2V0ID49IDAgJiYgeENPZmZzZXQgPCBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWwgPSBnZXRYKGJhdGNoLCB4UiwgeENPZmZzZXQsIGQxKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgIHhDJHtjb2xJbmRleCArIDF9ID0gdmVjNCh4VGV4ZWxDJHtjb2xJbmRleCArIDF9Lnh5LCBmaW5hbC54eSk7XG4gICAgICAgICAgICAgICAgYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICAgIGlmKHhDID49IDAgJiYgeEMgPCBpbkRpbXNbMV0gJiYgeFRleGVsQyR7Y29sSW5kZXh9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXh9ID0gZ2V0WChiYXRjaCwgeFIsIHhDLCBkMSk7XG4gICAgICAgICAgICAgICAgICBpZiAoeEMgKyAxID49IGluRGltc1sxXSkge1xuICAgICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH0uencgPSB2ZWMyKDAuMCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB4VGV4ZWxDJHtjb2xJbmRleH1SZWFkeSA9IDE7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgeENPZmZzZXQgPSB4QyArIHN0cmlkZXNbMV07XG4gICAgICAgICAgICAgICAgaWYoeENPZmZzZXQgPj0gMCAmJiB4Q09mZnNldCA8IGluRGltc1sxXSAmJiB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICBjb2xJbmRleCArIDF9UmVhZHkgPT0gMCkge1xuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfSA9IGdldFgoYmF0Y2gsIHhSLCB4Q09mZnNldCwgZDEpO1xuICAgICAgICAgICAgICAgICAgaWYgKHhDT2Zmc2V0ICsgMSA+PSBpbkRpbXNbMV0pIHtcbiAgICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfS56dyA9IHZlYzIoMC4pO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgeFRleGVsQyR7Y29sSW5kZXggKyAxfVJlYWR5ID0gMTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXh9ID0gdmVjNChcbiAgICAgICAgICAgICAgICAgIHhUZXhlbEMke2NvbEluZGV4fS54eSwgeFRleGVsQyR7Y29sSW5kZXggKyAxfS54eSk7XG4gICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgIGlmIChjb2xJbmRleCArIDEgPCBmaWx0ZXJXaWR0aCkge1xuICAgICAgICAgICAgICBtYWluTG9vcCArPSBgXG4gICAgICAgICAgICAgICAgICB4QyR7Y29sSW5kZXggKyAxfSA9IHZlYzQoeFRleGVsQyR7Y29sSW5kZXh9Lnp3LCB4VGV4ZWxDJHtcbiAgICAgICAgICAgICAgICAgIGNvbEluZGV4ICsgMX0uencpO1xuICAgICAgICAgICAgICAgIGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIGxvY2FsaXplIHRoZSBkb3RQcm9kIGFjY3VtdWxhdGlvbiB3aXRoaW4gdGhlIGxvb3AsIHRoZSB0aGVvcnkgaXMgZm9yXG4gICAgICAvLyBHUFUgd2l0aCBsaW1pdGVkIGNhY2hlLCBhY2N1bXVsYXRlIHN1bSBhY3Jvc3MgbGFyZ2UgYW1vdW50IG9mXG4gICAgICAvLyB2ZXJpYWJsZXMgd2lsbCBjYXVzZSBsb3RzIG9mIGNhY2hlIG1pc3Nlcy4gKGkuZS4gNXg1IGZpbHRlciB3aWxsIGhhdmVcbiAgICAgIC8vIDUwIHZhcmlhYmxlcylcbiAgICAgIGlmIChjb2xJbmRleCA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgICAgIHdUZXhlbCA9IGdldFcociwgJHtjb2xJbmRleH0sIGQxLCBxKTtcbiAgICAgICAgICAgIGRvdFByb2QgKz0geEMke2NvbEluZGV4fSAqIHZlYzQod1RleGVsLnh6LCB3VGV4ZWwueHopO1xuICAgICAgICAgIGA7XG5cbiAgICAgICAgaWYgKGNvbEluZGV4ICsgMSA8IGZpbHRlcldpZHRoKSB7XG4gICAgICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgICAgICB3VGV4ZWwgPSBnZXRXKHIsICR7Y29sSW5kZXggKyAxfSwgZDEsIHEpO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9IHhDJHtjb2xJbmRleCArIDF9ICogdmVjNCh3VGV4ZWwueHosIHdUZXhlbC54eik7XG4gICAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIG1haW5Mb29wICs9IGBcbiAgICB9XG4gIGA7XG4gICAgbWFpbkxvb3AgKz0gYFxuICAgICAgfVxuICAgIGA7XG5cbiAgICBsZXQgYWN0aXZhdGlvblNuaXBwZXQgPSAnJywgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9ICcnO1xuICAgIGlmIChhY3RpdmF0aW9uKSB7XG4gICAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICAgIGFjdGl2YXRpb25TbmlwcGV0ID0gYHZlYzQgYWN0aXZhdGlvbih2ZWM0IGEpIHtcbiAgICAgICAgICB2ZWM0IGIgPSBnZXRQcmVsdUFjdGl2YXRpb25XZWlnaHRzQXRPdXRDb29yZHMoKTtcbiAgICAgICAgICAke2FjdGl2YXRpb259XG4gICAgICAgIH1gO1xuICAgICAgfSBlbHNlIGlmIChoYXNMZWFreVJlbHVBbHBoYSkge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCBhKSB7XG4gICAgICAgICAgdmVjNCBiID0gZ2V0TGVha3lyZWx1QWxwaGFBdE91dENvb3JkcygpO1xuICAgICAgICAgICR7YWN0aXZhdGlvbn1cbiAgICAgICAgfWA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBhY3RpdmF0aW9uU25pcHBldCA9IGB2ZWM0IGFjdGl2YXRpb24odmVjNCB4KSB7XG4gICAgICAgICAgJHthY3RpdmF0aW9ufVxuICAgICAgICB9YDtcbiAgICAgIH1cblxuICAgICAgYXBwbHlBY3RpdmF0aW9uU25pcHBldCA9IGByZXN1bHQgPSBhY3RpdmF0aW9uKHJlc3VsdCk7YDtcbiAgICB9XG5cbiAgICBjb25zdCBhZGRCaWFzU25pcHBldCA9IGFkZEJpYXMgPyAncmVzdWx0ICs9IGdldEJpYXNBdE91dENvb3JkcygpOycgOiAnJztcbiAgICBpZiAoYWRkQmlhcykge1xuICAgICAgdGhpcy52YXJpYWJsZU5hbWVzLnB1c2goJ2JpYXMnKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uKSB7XG4gICAgICB0aGlzLnZhcmlhYmxlTmFtZXMucHVzaCgncHJlbHVBY3RpdmF0aW9uV2VpZ2h0cycpO1xuICAgIH1cbiAgICBpZiAoaGFzTGVha3lSZWx1QWxwaGEpIHtcbiAgICAgIHRoaXMudmFyaWFibGVOYW1lcy5wdXNoKCdsZWFreXJlbHVBbHBoYScpO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2FjdGl2YXRpb25TbmlwcGV0fVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaXZlYzIgeFJDQ29ybmVyID0gY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBkMiA9IGNvb3Jkcy53O1xuICAgICAgICBpbnQgZDEgPSBkMiAvICR7Y2hhbm5lbE11bH07XG4gICAgICAgIGludCBxID0gZDIgLSBkMSAqICR7Y2hhbm5lbE11bH07XG4gICAgICAgIGludCB4UkNvcm5lciA9IHhSQ0Nvcm5lci54O1xuICAgICAgICBpbnQgeENDb3JuZXIgPSB4UkNDb3JuZXIueTtcblxuICAgICAgICAvL2ludGlhbGl6ZSBkb3RQcm9kIHdpdGggYSBzbWFsbCBlcHNpbG9uIHNlZW1zIHRvIHJlZHVjZSBHUFUgYWNjdXJhY3kgbG9zcy5cbiAgICAgICAgdmVjNCBkb3RQcm9kID0gdmVjNCgwLjAwMDAwMDAwMDAwMDAwMSk7XG5cbiAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICB2ZWM0IHJlc3VsdCA9IGRvdFByb2QgLSB2ZWM0KDAuMDAwMDAwMDAwMDAwMDAxKTtcbiAgICAgICAgJHthZGRCaWFzU25pcHBldH1cbiAgICAgICAgJHthcHBseUFjdGl2YXRpb25TbmlwcGV0fVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNative, env, util } from '@tensorflow/tfjs-core';\nimport { DepthwiseConv2DProgram } from '../conv_gpu_depthwise';\nimport { DepthwiseConvPacked2DProgram } from '../conv_packed_gpu_depthwise';\nexport function depthwiseConv2dNative(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter } = inputs;\n    const { strides, pad, dilations, dimRoundingMode } = attrs;\n    let $dilations = dilations;\n    if ($dilations == null) {\n        $dilations = [1, 1];\n    }\n    util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in depthwiseConv2d: Either strides or dilations must be ' +\n        `1. Got strides ${strides} and dilations '${$dilations}'`);\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true /* depthwise */);\n    let program;\n    if (env().getBool('WEBGL_PACK_DEPTHWISECONV') && convInfo.strideWidth <= 2 &&\n        convInfo.outChannels / convInfo.inChannels === 1) {\n        program = new DepthwiseConvPacked2DProgram(convInfo);\n    }\n    else {\n        program = new DepthwiseConv2DProgram(convInfo);\n    }\n    const customValues = [\n        [convInfo.padInfo.top, convInfo.padInfo.left],\n        [convInfo.strideHeight, convInfo.strideWidth],\n        [convInfo.dilationHeight, convInfo.dilationWidth],\n        [convInfo.inHeight, convInfo.inWidth]\n    ];\n    return backend.runWebGLProgram(program, [x, filter], 'float32', customValues);\n}\nexport const depthwiseConv2dNativeConfig = {\n    kernelName: DepthwiseConv2dNative,\n    backendName: 'webgl',\n    kernelFunc: depthwiseConv2dNative,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLHFCQUFxQixFQUEyRCxHQUFHLEVBQTRCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3hLLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBRTFFLE1BQU0sVUFBVSxxQkFBcUIsQ0FBQyxJQUlyQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXpELElBQUksVUFBVSxHQUFHLFNBQVMsQ0FBQztJQUMzQixJQUFJLFVBQVUsSUFBSSxJQUFJLEVBQUU7UUFDdEIsVUFBVSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0tBQ3JCO0lBRUQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxFQUNoRSxHQUFHLEVBQUUsQ0FBQyxnRUFBZ0U7UUFDbEUsa0JBQWtCLE9BQU8sbUJBQW1CLFVBQVUsR0FBRyxDQUFDLENBQUM7SUFFbkUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFDM0MsTUFBTSxDQUFDLEtBQXlDLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFDckUsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFaEQsSUFBSSxPQUE0RCxDQUFDO0lBQ2pFLElBQUksR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLDBCQUEwQixDQUFDLElBQUksUUFBUSxDQUFDLFdBQVcsSUFBSSxDQUFDO1FBQ3RFLFFBQVEsQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLFVBQVUsS0FBSyxDQUFDLEVBQUU7UUFDcEQsT0FBTyxHQUFHLElBQUksNEJBQTRCLENBQUMsUUFBUSxDQUFDLENBQUM7S0FDdEQ7U0FBTTtRQUNMLE9BQU8sR0FBRyxJQUFJLHNCQUFzQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0tBQ2hEO0lBQ0QsTUFBTSxZQUFZLEdBQUc7UUFDbkIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM3QyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNqRCxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztLQUN0QyxDQUFDO0lBQ0YsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDJCQUEyQixHQUFpQjtJQUN2RCxVQUFVLEVBQUUscUJBQXFCO0lBQ2pDLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxxQkFBeUM7Q0FDdEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERlcHRod2lzZUNvbnYyZE5hdGl2ZSwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQXR0cnMsIERlcHRod2lzZUNvbnYyZE5hdGl2ZUlucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdV9kZXB0aHdpc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGVwdGh3aXNlQ29udjJkTmF0aXZlKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aHdpc2VDb252MmROYXRpdmVJbnB1dHMsXG4gIGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSkge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgZmlsdGVyfSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIHBhZCwgZGlsYXRpb25zLCBkaW1Sb3VuZGluZ01vZGV9ID0gYXR0cnM7XG5cbiAgbGV0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnM7XG4gIGlmICgkZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAkZGlsYXRpb25zID0gWzEsIDFdO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsICRkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGRlcHRod2lzZUNvbnYyZDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgJyArXG4gICAgICAgICAgYDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHskZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsICRkaWxhdGlvbnMsXG4gICAgICBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGxldCBwcm9ncmFtOiBEZXB0aHdpc2VDb252MkRQcm9ncmFtfERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW07XG4gIGlmIChlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0RFUFRIV0lTRUNPTlYnKSAmJiBjb252SW5mby5zdHJpZGVXaWR0aCA8PSAyICYmXG4gICAgICBjb252SW5mby5vdXRDaGFubmVscyAvIGNvbnZJbmZvLmluQ2hhbm5lbHMgPT09IDEpIHtcbiAgICBwcm9ncmFtID0gbmV3IERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW0oY29udkluZm8pO1xuICB9IGVsc2Uge1xuICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbShjb252SW5mbyk7XG4gIH1cbiAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1xuICAgIFtjb252SW5mby5wYWRJbmZvLnRvcCwgY29udkluZm8ucGFkSW5mby5sZWZ0XSxcbiAgICBbY29udkluZm8uc3RyaWRlSGVpZ2h0LCBjb252SW5mby5zdHJpZGVXaWR0aF0sXG4gICAgW2NvbnZJbmZvLmRpbGF0aW9uSGVpZ2h0LCBjb252SW5mby5kaWxhdGlvbldpZHRoXSxcbiAgICBbY29udkluZm8uaW5IZWlnaHQsIGNvbnZJbmZvLmluV2lkdGhdXG4gIF07XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xufVxuXG5leHBvcnQgY29uc3QgZGVwdGh3aXNlQ29udjJkTmF0aXZlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZSBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class DepthwiseConv2DDerFilterProgram {\n    constructor(convInfo) {\n        this.variableNames = ['x', 'dy'];\n        this.outputShape = convInfo.filterShape;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const padTop = convInfo.padInfo.top;\n        const padLeft = convInfo.padInfo.left;\n        const channelMul = convInfo.outChannels / convInfo.inChannels;\n        this.userCode = `\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int wR = coords.x;\n        int wC = coords.y;\n        int d1 = coords.z;\n        int dm = coords.w;\n        int d2 = d1 * ${channelMul} + dm;\n\n        float dotProd = 0.0;\n\n        // TO DO: Vec4 over the batch size\n        for (int b = 0; b < ${convInfo.batchSize}; b++) {\n          for (int yR = 0; yR < ${convInfo.outHeight}; yR++) {\n            int xR = wR + yR * ${strideHeight} - ${padTop};\n\n            if (xR < 0 || xR >= ${convInfo.inHeight}) {\n              continue;\n            }\n\n            for (int yC = 0; yC < ${convInfo.outWidth}; yC++) {\n              int xC = wC + yC * ${strideWidth} - ${padLeft};\n\n              if (xC < 0 || xC >= ${convInfo.inWidth}) {\n                continue;\n              }\n\n              float dyValue = getDy(b, yR, yC, d2);\n              float xValue = getX(b, xR, xC, d1);\n              dotProd += (xValue * dyValue);\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\nexport class DepthwiseConv2DDerInputProgram {\n    constructor(convInfo) {\n        this.variableNames = ['dy', 'W'];\n        this.outputShape = convInfo.inShape;\n        const filterHeight = convInfo.filterHeight;\n        const filterWidth = convInfo.filterWidth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const padTop = filterHeight - 1 - convInfo.padInfo.top;\n        const padLeft = filterWidth - 1 - convInfo.padInfo.left;\n        const channelMul = convInfo.outChannels / convInfo.inChannels;\n        this.userCode = `\n      const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int batch = coords[0];\n        int d1 = coords[3];\n        ivec2 dyCorner = coords.yz - pads;\n        int dyRCorner = dyCorner.x;\n        int dyCCorner = dyCorner.y;\n\n        float dotProd = 0.0;\n\n        for (int wR = 0; wR < ${filterHeight}; wR++) {\n          float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n          if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) {\n            continue;\n          }\n          int idyR = int(dyR);\n\n          int wRPerm = ${filterHeight} - 1 - wR;\n\n          for (int wC = 0; wC < ${filterWidth}; wC++) {\n            float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n            if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n                fract(dyC) > 0.0) {\n              continue;\n            }\n            int idyC = int(dyC);\n\n            int wCPerm = ${filterWidth} - 1 - wC;\n\n            // TO DO: Vec4 over the channelMul\n            for (int dm = 0; dm < ${channelMul}; dm++) {\n              int d2 = d1 * ${channelMul} + dm;\n              float xValue = getDy(batch, idyR, idyC, d2);\n              float wValue = getW(wRPerm, wCPerm, d1, dm);\n              dotProd += xValue * wValue;\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9jb252X2JhY2twcm9wX2dwdV9kZXB0aHdpc2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLCtCQUErQjtJQUsxQyxZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFLMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBRXhDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLE1BQU0sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNwQyxNQUFNLE9BQU8sR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUN0QyxNQUFNLFVBQVUsR0FBRyxRQUFRLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxVQUFVLENBQUM7UUFFOUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7Ozt3QkFPSSxVQUFVOzs7Ozs4QkFLSixRQUFRLENBQUMsU0FBUztrQ0FDZCxRQUFRLENBQUMsU0FBUztpQ0FDbkIsWUFBWSxNQUFNLE1BQU07O2tDQUV2QixRQUFRLENBQUMsUUFBUTs7OztvQ0FJZixRQUFRLENBQUMsUUFBUTttQ0FDbEIsV0FBVyxNQUFNLE9BQU87O29DQUV2QixRQUFRLENBQUMsT0FBTzs7Ozs7Ozs7Ozs7O0tBWS9DLENBQUM7SUFDSixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sOEJBQThCO0lBS3pDLFlBQVksUUFBaUM7UUFKN0Msa0JBQWEsR0FBRyxDQUFDLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUsxQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUM7UUFFcEMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUV6QyxNQUFNLE1BQU0sR0FBRyxZQUFZLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDO1FBQ3ZELE1BQU0sT0FBTyxHQUFHLFdBQVcsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFDeEQsTUFBTSxVQUFVLEdBQUcsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDO1FBRTlELElBQUksQ0FBQyxRQUFRLEdBQUc7aUNBQ2EsTUFBTSxLQUFLLE9BQU87Ozs7Ozs7Ozs7OztnQ0FZbkIsWUFBWTtnREFDSSxZQUFZOztvQ0FFeEIsUUFBUSxDQUFDLFNBQVM7Ozs7O3lCQUs3QixZQUFZOztrQ0FFSCxXQUFXO2tEQUNLLFdBQVc7O3NDQUV2QixRQUFRLENBQUMsUUFBUTs7Ozs7OzJCQU01QixXQUFXOzs7b0NBR0YsVUFBVTs4QkFDaEIsVUFBVTs7Ozs7Ozs7O0tBU25DLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY29udkluZm86IGJhY2tlbmRfdXRpbC5Db252MkRJbmZvKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGNvbnZJbmZvLmZpbHRlclNoYXBlO1xuXG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgcGFkVG9wID0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCB3UiA9IGNvb3Jkcy54O1xuICAgICAgICBpbnQgd0MgPSBjb29yZHMueTtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLno7XG4gICAgICAgIGludCBkbSA9IGNvb3Jkcy53O1xuICAgICAgICBpbnQgZDIgPSBkMSAqICR7Y2hhbm5lbE11bH0gKyBkbTtcblxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuXG4gICAgICAgIC8vIFRPIERPOiBWZWM0IG92ZXIgdGhlIGJhdGNoIHNpemVcbiAgICAgICAgZm9yIChpbnQgYiA9IDA7IGIgPCAke2NvbnZJbmZvLmJhdGNoU2l6ZX07IGIrKykge1xuICAgICAgICAgIGZvciAoaW50IHlSID0gMDsgeVIgPCAke2NvbnZJbmZvLm91dEhlaWdodH07IHlSKyspIHtcbiAgICAgICAgICAgIGludCB4UiA9IHdSICsgeVIgKiAke3N0cmlkZUhlaWdodH0gLSAke3BhZFRvcH07XG5cbiAgICAgICAgICAgIGlmICh4UiA8IDAgfHwgeFIgPj0gJHtjb252SW5mby5pbkhlaWdodH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoaW50IHlDID0gMDsgeUMgPCAke2NvbnZJbmZvLm91dFdpZHRofTsgeUMrKykge1xuICAgICAgICAgICAgICBpbnQgeEMgPSB3QyArIHlDICogJHtzdHJpZGVXaWR0aH0gLSAke3BhZExlZnR9O1xuXG4gICAgICAgICAgICAgIGlmICh4QyA8IDAgfHwgeEMgPj0gJHtjb252SW5mby5pbldpZHRofSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIHlSLCB5QywgZDIpO1xuICAgICAgICAgICAgICBmbG9hdCB4VmFsdWUgPSBnZXRYKGIsIHhSLCB4QywgZDEpO1xuICAgICAgICAgICAgICBkb3RQcm9kICs9ICh4VmFsdWUgKiBkeVZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgc2V0T3V0cHV0KGRvdFByb2QpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIERlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuXG4gICAgY29uc3QgZmlsdGVySGVpZ2h0ID0gY29udkluZm8uZmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGZpbHRlcldpZHRoID0gY29udkluZm8uZmlsdGVyV2lkdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG5cbiAgICBjb25zdCBwYWRUb3AgPSBmaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcbiAgICBjb25zdCBjaGFubmVsTXVsID0gY29udkluZm8ub3V0Q2hhbm5lbHMgLyBjb252SW5mby5pbkNoYW5uZWxzO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMyIHBhZHMgPSBpdmVjMigke3BhZFRvcH0sICR7cGFkTGVmdH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG4gICAgICAgIGludCBkMSA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgZHlDb3JuZXIgPSBjb29yZHMueXogLSBwYWRzO1xuICAgICAgICBpbnQgZHlSQ29ybmVyID0gZHlDb3JuZXIueDtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5Q29ybmVyLnk7XG5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCB3UiA9IDA7IHdSIDwgJHtmaWx0ZXJIZWlnaHR9OyB3UisrKSB7XG4gICAgICAgICAgZmxvYXQgZHlSID0gZmxvYXQoZHlSQ29ybmVyICsgd1IpIC8gJHtzdHJpZGVIZWlnaHR9LjA7XG5cbiAgICAgICAgICBpZiAoZHlSIDwgMC4wIHx8IGR5UiA+PSAke2NvbnZJbmZvLm91dEhlaWdodH0uMCB8fCBmcmFjdChkeVIpID4gMC4wKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaW50IGlkeVIgPSBpbnQoZHlSKTtcblxuICAgICAgICAgIGludCB3UlBlcm0gPSAke2ZpbHRlckhlaWdodH0gLSAxIC0gd1I7XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtmaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgaW50IHdDUGVybSA9ICR7ZmlsdGVyV2lkdGh9IC0gMSAtIHdDO1xuXG4gICAgICAgICAgICAvLyBUTyBETzogVmVjNCBvdmVyIHRoZSBjaGFubmVsTXVsXG4gICAgICAgICAgICBmb3IgKGludCBkbSA9IDA7IGRtIDwgJHtjaGFubmVsTXVsfTsgZG0rKykge1xuICAgICAgICAgICAgICBpbnQgZDIgPSBkMSAqICR7Y2hhbm5lbE11bH0gKyBkbTtcbiAgICAgICAgICAgICAgZmxvYXQgeFZhbHVlID0gZ2V0RHkoYmF0Y2gsIGlkeVIsIGlkeUMsIGQyKTtcbiAgICAgICAgICAgICAgZmxvYXQgd1ZhbHVlID0gZ2V0Vyh3UlBlcm0sIHdDUGVybSwgZDEsIGRtKTtcbiAgICAgICAgICAgICAgZG90UHJvZCArPSB4VmFsdWUgKiB3VmFsdWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNativeBackpropFilter } from '@tensorflow/tfjs-core';\nimport { DepthwiseConv2DDerFilterProgram } from '../conv_backprop_gpu_depthwise';\nexport function depthwiseConv2dNativeBackpropFilter(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, dy } = inputs;\n    const { strides, dilations, pad, dimRoundingMode, filterShape } = attrs;\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filterShape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n    const program = new DepthwiseConv2DDerFilterProgram(convInfo);\n    return backend.runWebGLProgram(program, [x, dy], 'float32');\n}\nexport const depthwiseConv2dNativeBackpropFilterConfig = {\n    kernelName: DepthwiseConv2dNativeBackpropFilter,\n    backendName: 'webgl',\n    kernelFunc: depthwiseConv2dNativeBackpropFilter\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxtQ0FBbUMsRUFBZ0gsTUFBTSx1QkFBdUIsQ0FBQztBQUd2TSxPQUFPLEVBQUMsK0JBQStCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUUvRSxNQUFNLFVBQVUsbUNBQW1DLENBQUMsSUFJbkQ7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxFQUFFLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsTUFBTSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEUsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLGlCQUFpQixDQUMzQyxDQUFDLENBQUMsS0FBeUMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUNqRSxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFFM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSwrQkFBK0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUM5RCxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzlELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5Q0FBeUMsR0FBaUI7SUFDckUsVUFBVSxFQUFFLG1DQUFtQztJQUMvQyxXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUNBQXVEO0NBQ3BFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlciwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJBdHRycywgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXJJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGVwdGh3aXNlQ29udjJERGVyRmlsdGVyUHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyKGFyZ3M6IHtcbiAgaW5wdXRzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcklucHV0cyxcbiAgYXR0cnM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge3N0cmlkZXMsIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIGZpbHRlclNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2hhcGUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCB0cnVlIC8qIGRlcHRod2lzZSAqLyk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEZXB0aHdpc2VDb252MkREZXJGaWx0ZXJQcm9ncmFtKGNvbnZJbmZvKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCBkeV0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcEZpbHRlcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, DepthwiseConv2dNativeBackpropInput } from '@tensorflow/tfjs-core';\nimport { DepthwiseConv2DDerInputProgram } from '../conv_backprop_gpu_depthwise';\nexport function depthwiseConv2dNativeBackpropInput(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, filter } = inputs;\n    const { strides, dilations, pad, dimRoundingMode, inputShape } = attrs;\n    const convInfo = backend_util.computeConv2DInfo(inputShape, filter.shape, strides, dilations, pad, dimRoundingMode, true /* depthwise */);\n    const program = new DepthwiseConv2DDerInputProgram(convInfo);\n    return backend.runWebGLProgram(program, [dy, filter], 'float32');\n}\nexport const depthwiseConv2dNativeBackpropInputConfig = {\n    kernelName: DepthwiseConv2dNativeBackpropInput,\n    backendName: 'webgl',\n    kernelFunc: depthwiseConv2dNativeBackpropInput\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9EZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsa0NBQWtDLEVBQThHLE1BQU0sdUJBQXVCLENBQUM7QUFHcE0sT0FBTyxFQUFDLDhCQUE4QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFFOUUsTUFBTSxVQUFVLGtDQUFrQyxDQUFDLElBSWxEO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxFQUFFLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXJFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsVUFBVSxFQUFFLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLE9BQU8sRUFDckUsU0FBUyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0lBRTNELE1BQU0sT0FBTyxHQUFHLElBQUksOEJBQThCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0QsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sd0NBQXdDLEdBQWlCO0lBQ3BFLFVBQVUsRUFBRSxrQ0FBa0M7SUFDOUMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLGtDQUFzRDtDQUNuRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCwgRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dEF0dHJzLCBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0SW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbX0gZnJvbSAnLi4vY29udl9iYWNrcHJvcF9ncHVfZGVwdGh3aXNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQoYXJnczoge1xuICBpbnB1dHM6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXRJbnB1dHMsXG4gIGF0dHJzOiBEZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0QXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgaW5wdXRTaGFwZX0gPSBhdHRycztcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIGlucHV0U2hhcGUsIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUsIHRydWUgLyogZGVwdGh3aXNlICovKTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IERlcHRod2lzZUNvbnYyRERlcklucHV0UHJvZ3JhbShjb252SW5mbyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHksIGZpbHRlcl0sICdmbG9hdDMyJyk7XG59XG5cbmV4cG9ydCBjb25zdCBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wSW5wdXQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class DiagProgram {\n    constructor(size) {\n        this.variableNames = ['X'];\n        this.outputShape = [size, size];\n        this.userCode = `\n      void main() {\n          ivec2 coords = getOutputCoords();\n          float val = coords[0] == coords[1] ? getX(coords[0]) : 0.0;\n          setOutput(val);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhZ19ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2RpYWdfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sT0FBTyxXQUFXO0lBS3RCLFlBQVksSUFBWTtRQUp4QixrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFLcEIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoQyxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7S0FNZixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIERpYWdQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnWCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3Ioc2l6ZTogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtzaXplLCBzaXplXTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGZsb2F0IHZhbCA9IGNvb3Jkc1swXSA9PSBjb29yZHNbMV0gPyBnZXRYKGNvb3Jkc1swXSkgOiAwLjA7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Diag, util } from '@tensorflow/tfjs-core';\nimport { DiagProgram } from '../diag_gpu';\nimport { reshape } from './Reshape';\nexport function diag(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    const outShape = [...x.shape, ...x.shape];\n    const xSize = util.sizeFromShape(x.shape);\n    const flat = reshape({ inputs: { x }, backend, attrs: { shape: [xSize] } });\n    const program = new DiagProgram(xSize);\n    const res = backend.runWebGLProgram(program, [flat], flat.dtype);\n    const out = reshape({ inputs: { x: res }, backend, attrs: { shape: outShape } });\n    backend.disposeIntermediateTensorInfo(flat);\n    backend.disposeIntermediateTensorInfo(res);\n    return out;\n}\nexport const diagConfig = {\n    kernelName: Diag,\n    backendName: 'webgl',\n    kernelFunc: diag\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlhZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9EaWFnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQW9ELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR25HLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDeEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXFEO0lBRXhFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbkIsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFMUMsTUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXRFLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3ZDLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRWpFLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUUzRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTNDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RGlhZywgRGlhZ0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtEaWFnUHJvZ3JhbX0gZnJvbSAnLi4vZGlhZ19ncHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZGlhZyhhcmdzOiB7aW5wdXRzOiBEaWFnSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IG91dFNoYXBlID0gWy4uLnguc2hhcGUsIC4uLnguc2hhcGVdO1xuICBjb25zdCB4U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcblxuICBjb25zdCBmbGF0ID0gcmVzaGFwZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFt4U2l6ZV19fSk7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBEaWFnUHJvZ3JhbSh4U2l6ZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtmbGF0XSwgZmxhdC5kdHlwZSk7XG5cbiAgY29uc3Qgb3V0ID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuXG4gIHJldHVybiBvdXQ7XG59XG5cbmV4cG9ydCBjb25zdCBkaWFnQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IERpYWcsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBkaWFnIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class Dilation2DProgram {\n    constructor(convInfo) {\n        this.variableNames = ['x', 'W'];\n        this.outputShape = convInfo.outShape;\n        const { inHeight, inWidth, padInfo, strideHeight, strideWidth, filterHeight, filterWidth, dilationHeight, dilationWidth } = convInfo;\n        const { top: padTop, left: padLeft } = padInfo;\n        this.userCode = `\n      const ivec2 strides = ivec2(${strideHeight}, ${strideWidth});\n      const ivec2 pads = ivec2(${padTop}, ${padLeft});\n      const float neg_infinity = -3.4e38;\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int batch = coords.x;\n        int d1 = coords.w;\n        ivec2 outTopLeftCorner =\n            coords.yz * strides - pads;\n        int hBeg = outTopLeftCorner.x;\n        int wBeg = outTopLeftCorner.y;\n\n        float curVal = neg_infinity;\n        for (int h = 0; h < ${filterHeight}; h++) {\n          int hIn = hBeg + h * ${dilationHeight};\n\n          if (hIn >= 0 && hIn < ${inHeight}) {\n            for (int w = 0; w < ${filterWidth}; w++) {\n              int wIn = wBeg + w * ${dilationWidth};\n\n              if (wIn >= 0 && wIn < ${inWidth}) {\n                float xVal = getX(batch, hIn, wIn, d1);\n                float wVal = getW(h, w, d1);\n\n                float val = xVal + wVal;\n                if (val > curVal) {\n                  curVal = val;\n                }\n              }\n            }\n          }\n        }\n\n        float result = curVal;\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlsYXRpb25fZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9kaWxhdGlvbl9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLGlCQUFpQjtJQUs1QixZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFLekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsUUFBUSxDQUFDO1FBRXJDLE1BQU0sRUFDSixRQUFRLEVBQ1IsT0FBTyxFQUNQLE9BQU8sRUFDUCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixXQUFXLEVBQ1gsY0FBYyxFQUNkLGFBQWEsRUFDZCxHQUFHLFFBQVEsQ0FBQztRQUViLE1BQU0sRUFBQyxHQUFHLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUMsR0FBRyxPQUFPLENBQUM7UUFFN0MsSUFBSSxDQUFDLFFBQVEsR0FBRztvQ0FDZ0IsWUFBWSxLQUFLLFdBQVc7aUNBQy9CLE1BQU0sS0FBSyxPQUFPOzs7Ozs7Ozs7Ozs7OzhCQWFyQixZQUFZO2lDQUNULGNBQWM7O2tDQUViLFFBQVE7a0NBQ1IsV0FBVztxQ0FDUixhQUFhOztzQ0FFWixPQUFPOzs7Ozs7Ozs7Ozs7Ozs7O0tBZ0J4QyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRGlsYXRpb24yRFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4JywgJ1cnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5vdXRTaGFwZTtcblxuICAgIGNvbnN0IHtcbiAgICAgIGluSGVpZ2h0LFxuICAgICAgaW5XaWR0aCxcbiAgICAgIHBhZEluZm8sXG4gICAgICBzdHJpZGVIZWlnaHQsXG4gICAgICBzdHJpZGVXaWR0aCxcbiAgICAgIGZpbHRlckhlaWdodCxcbiAgICAgIGZpbHRlcldpZHRoLFxuICAgICAgZGlsYXRpb25IZWlnaHQsXG4gICAgICBkaWxhdGlvbldpZHRoXG4gICAgfSA9IGNvbnZJbmZvO1xuXG4gICAgY29uc3Qge3RvcDogcGFkVG9wLCBsZWZ0OiBwYWRMZWZ0fSA9IHBhZEluZm87XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgc3RyaWRlcyA9IGl2ZWMyKCR7c3RyaWRlSGVpZ2h0fSwgJHtzdHJpZGVXaWR0aH0pO1xuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG4gICAgICBjb25zdCBmbG9hdCBuZWdfaW5maW5pdHkgPSAtMy40ZTM4O1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHMueDtcbiAgICAgICAgaW50IGQxID0gY29vcmRzLnc7XG4gICAgICAgIGl2ZWMyIG91dFRvcExlZnRDb3JuZXIgPVxuICAgICAgICAgICAgY29vcmRzLnl6ICogc3RyaWRlcyAtIHBhZHM7XG4gICAgICAgIGludCBoQmVnID0gb3V0VG9wTGVmdENvcm5lci54O1xuICAgICAgICBpbnQgd0JlZyA9IG91dFRvcExlZnRDb3JuZXIueTtcblxuICAgICAgICBmbG9hdCBjdXJWYWwgPSBuZWdfaW5maW5pdHk7XG4gICAgICAgIGZvciAoaW50IGggPSAwOyBoIDwgJHtmaWx0ZXJIZWlnaHR9OyBoKyspIHtcbiAgICAgICAgICBpbnQgaEluID0gaEJlZyArIGggKiAke2RpbGF0aW9uSGVpZ2h0fTtcblxuICAgICAgICAgIGlmIChoSW4gPj0gMCAmJiBoSW4gPCAke2luSGVpZ2h0fSkge1xuICAgICAgICAgICAgZm9yIChpbnQgdyA9IDA7IHcgPCAke2ZpbHRlcldpZHRofTsgdysrKSB7XG4gICAgICAgICAgICAgIGludCB3SW4gPSB3QmVnICsgdyAqICR7ZGlsYXRpb25XaWR0aH07XG5cbiAgICAgICAgICAgICAgaWYgKHdJbiA+PSAwICYmIHdJbiA8ICR7aW5XaWR0aH0pIHtcbiAgICAgICAgICAgICAgICBmbG9hdCB4VmFsID0gZ2V0WChiYXRjaCwgaEluLCB3SW4sIGQxKTtcbiAgICAgICAgICAgICAgICBmbG9hdCB3VmFsID0gZ2V0VyhoLCB3LCBkMSk7XG5cbiAgICAgICAgICAgICAgICBmbG9hdCB2YWwgPSB4VmFsICsgd1ZhbDtcbiAgICAgICAgICAgICAgICBpZiAodmFsID4gY3VyVmFsKSB7XG4gICAgICAgICAgICAgICAgICBjdXJWYWwgPSB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gY3VyVmFsO1xuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Dilation2D } from '@tensorflow/tfjs-core';\nimport { Dilation2DProgram } from '../dilation_gpu';\nimport { reshape } from './Reshape';\nexport function dilation2D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter } = inputs;\n    const { strides, pad, dilations } = attrs;\n    const convInfo = backend_util.computeDilation2DInfo(x.shape, filter.shape, strides, pad, 'NHWC' /* dataFormat */, dilations);\n    let out;\n    const program = new Dilation2DProgram(convInfo);\n    out = backend.runWebGLProgram(program, [x, filter], 'float32');\n    const outReshaped = reshape({ inputs: { x: out }, backend, attrs: { shape: convInfo.outShape } });\n    backend.disposeIntermediateTensorInfo(out);\n    return outReshaped;\n}\nexport const dilation2DConfig = {\n    kernelName: Dilation2D,\n    backendName: 'webgl',\n    kernelFunc: dilation2D,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGlsYXRpb24yRC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9EaWxhdGlvbjJELnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsVUFBVSxFQUEwRSxNQUFNLHVCQUF1QixDQUFDO0FBR3hJLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUkxQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQixNQUFNLEVBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFeEMsTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixDQUMvQyxDQUFDLENBQUMsS0FBeUMsRUFDM0MsTUFBTSxDQUFDLEtBQWlDLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFDdEQsTUFBTSxDQUFDLGdCQUFnQixFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQ3hDLElBQUksR0FBZSxDQUFDO0lBRXBCLE1BQU0sT0FBTyxHQUFHLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsR0FBRyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sV0FBVyxHQUNiLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDNUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBRTNDLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUI7SUFDNUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFVBQThCO0NBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBEaWxhdGlvbjJELCBEaWxhdGlvbjJEQXR0cnMsIERpbGF0aW9uMkRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RGlsYXRpb24yRFByb2dyYW19IGZyb20gJy4uL2RpbGF0aW9uX2dwdSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBkaWxhdGlvbjJEKGFyZ3M6IHtcbiAgaW5wdXRzOiBEaWxhdGlvbjJESW5wdXRzLFxuICBhdHRyczogRGlsYXRpb24yREF0dHJzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBmaWx0ZXJ9ID0gaW5wdXRzO1xuICBjb25zdCB7c3RyaWRlcywgcGFkLCBkaWxhdGlvbnN9ID0gYXR0cnM7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZURpbGF0aW9uMkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsIHBhZCxcbiAgICAgICdOSFdDJyAvKiBkYXRhRm9ybWF0ICovLCBkaWxhdGlvbnMpO1xuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgRGlsYXRpb24yRFByb2dyYW0oY29udkluZm8pO1xuICBvdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeCwgZmlsdGVyXSwgJ2Zsb2F0MzInKTtcblxuICBjb25zdCBvdXRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiBvdXR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBjb252SW5mby5vdXRTaGFwZX19KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhvdXQpO1xuXG4gIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cblxuZXhwb3J0IGNvbnN0IGRpbGF0aW9uMkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRGlsYXRpb24yRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGRpbGF0aW9uMkQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Einsum, util } from '@tensorflow/tfjs-core';\nimport { multiply } from './Multiply';\nimport { reshape } from './Reshape';\nimport { sum } from './Sum';\nimport { transpose } from './Transpose';\nexport function einsum(args) {\n    const { inputs, backend, attrs } = args;\n    const { equation } = attrs;\n    const tensors = inputs;\n    const { allDims, summedDims, idDims } = backend_util.decodeEinsumEquation(equation, tensors.length);\n    backend_util.checkEinsumDimSizes(allDims.length, idDims, tensors);\n    const { path, steps } = backend_util.getEinsumComputePath(summedDims, idDims);\n    const nSteps = steps.length;\n    let out = null;\n    let numDimsRemaining = allDims.length;\n    const tensorsToDispose = [];\n    for (let i = 0; i < nSteps; ++i) {\n        for (const idTerm of steps[i]) {\n            const { permutationIndices: perm, expandDims: dimsToExpand } = backend_util.getEinsumPermutation(numDimsRemaining, idDims[idTerm]);\n            let x;\n            if (backend_util.isIdentityPermutation(perm)) {\n                x = tensors[idTerm];\n            }\n            else {\n                x = transpose({ inputs: { x: tensors[idTerm] }, backend, attrs: { perm } });\n                tensorsToDispose.push(x);\n            }\n            const targetShape = x.shape.slice();\n            for (let k = 0; k < dimsToExpand.length; ++k) {\n                targetShape.splice(dimsToExpand[k], 0, 1);\n            }\n            if (!util.arraysEqual(x.shape, targetShape)) {\n                x = reshape({ inputs: { x }, backend, attrs: { shape: targetShape } });\n                tensorsToDispose.push(x);\n            }\n            if (out === null) {\n                out = x;\n            }\n            else {\n                // tslint:disable-next-line: no-unnecessary-type-assertion\n                out = multiply({ inputs: { a: x, b: out }, backend });\n                tensorsToDispose.push(out);\n            }\n        }\n        if (i < nSteps - 1) {\n            if (path[i] >= 0) {\n                out = sum({\n                    inputs: { x: out },\n                    backend,\n                    attrs: {\n                        axis: path[i] - (allDims.length - numDimsRemaining),\n                        keepDims: false\n                    }\n                });\n                tensorsToDispose.push(out);\n            }\n            numDimsRemaining--;\n        }\n    }\n    // Clean up intermediate tensors.\n    for (const tensorInfo of tensorsToDispose) {\n        if (tensorInfo === out) {\n            continue;\n        }\n        backend.disposeIntermediateTensorInfo(tensorInfo);\n    }\n    return out;\n}\nexport const einsumConfig = {\n    kernelName: Einsum,\n    backendName: 'webgl',\n    kernelFunc: einsum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWluc3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0VpbnN1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLE1BQU0sRUFBMkUsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJMUksT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsTUFBTSxDQUNsQixJQUN5RTtJQUUzRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUN6QixNQUFNLE9BQU8sR0FBRyxNQUFrQixDQUFDO0lBRW5DLE1BQU0sRUFBQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBQyxHQUMvQixZQUFZLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNoRSxZQUFZLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUMsR0FBRyxZQUFZLENBQUMsb0JBQW9CLENBQUMsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBRTVFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDNUIsSUFBSSxHQUFHLEdBQW9CLElBQUks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QVUsS0FBSyxHQUFHLEVBQUU7WUFDdEIsU0FBUztTQUNWO1FBQ0QsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ25EO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEVpbnN1bSwgRWluc3VtQXR0cnMsIEVpbnN1bUlucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3IsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7bXVsdGlwbHl9IGZyb20gJy4vTXVsdGlwbHknO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzdW19IGZyb20gJy4vU3VtJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBlaW5zdW0oXG4gICAgYXJnczpcbiAgICAgICAge2lucHV0czogRWluc3VtSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogRWluc3VtQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2VxdWF0aW9ufSA9IGF0dHJzO1xuICBjb25zdCB0ZW5zb3JzID0gaW5wdXRzIGFzIFRlbnNvcltdO1xuXG4gIGNvbnN0IHthbGxEaW1zLCBzdW1tZWREaW1zLCBpZERpbXN9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5kZWNvZGVFaW5zdW1FcXVhdGlvbihlcXVhdGlvbiwgdGVuc29ycy5sZW5ndGgpO1xuICBiYWNrZW5kX3V0aWwuY2hlY2tFaW5zdW1EaW1TaXplcyhhbGxEaW1zLmxlbmd0aCwgaWREaW1zLCB0ZW5zb3JzKTtcbiAgY29uc3Qge3BhdGgsIHN0ZXBzfSA9IGJhY2tlbmRfdXRpbC5nZXRFaW5zdW1Db21wdXRlUGF0aChzdW1tZWREaW1zLCBpZERpbXMpO1xuXG4gIGNvbnN0IG5TdGVwcyA9IHN0ZXBzLmxlbmd0aDtcbiAgbGV0IG91dDogVGVuc29ySW5mb3xudWxsID0gbnVsbDtcbiAgbGV0IG51bURpbXNSZW1haW5pbmcgPSBhbGxEaW1zLmxlbmd0aDtcbiAgY29uc3QgdGVuc29yc1RvRGlzcG9zZTogVGVuc29ySW5mb1tdID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgblN0ZXBzOyArK2kpIHtcbiAgICBmb3IgKGNvbnN0IGlkVGVybSBvZiBzdGVwc1tpXSkge1xuICAgICAgY29uc3Qge3Blcm11dGF0aW9uSW5kaWNlczogcGVybSwgZXhwYW5kRGltczogZGltc1RvRXhwYW5kfSA9XG4gICAgICAgICAgYmFja2VuZF91dGlsLmdldEVpbnN1bVBlcm11dGF0aW9uKG51bURpbXNSZW1haW5pbmcsIGlkRGltc1tpZFRlcm1dKTtcbiAgICAgIGxldCB4OiBUZW5zb3JJbmZvO1xuICAgICAgaWYgKGJhY2tlbmRfdXRpbC5pc0lkZW50aXR5UGVybXV0YXRpb24ocGVybSkpIHtcbiAgICAgICAgeCA9IHRlbnNvcnNbaWRUZXJtXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3g6IHRlbnNvcnNbaWRUZXJtXX0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybX19KTtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgfVxuICAgICAgY29uc3QgdGFyZ2V0U2hhcGU6IG51bWJlcltdID0geC5zaGFwZS5zbGljZSgpO1xuICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBkaW1zVG9FeHBhbmQubGVuZ3RoOyArK2spIHtcbiAgICAgICAgdGFyZ2V0U2hhcGUuc3BsaWNlKGRpbXNUb0V4cGFuZFtrXSwgMCwgMSk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdXRpbC5hcnJheXNFcXVhbCh4LnNoYXBlLCB0YXJnZXRTaGFwZSkpIHtcbiAgICAgICAgeCA9IHJlc2hhcGUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiB0YXJnZXRTaGFwZX19KTtcbiAgICAgICAgdGVuc29yc1RvRGlzcG9zZS5wdXNoKHgpO1xuICAgICAgfVxuICAgICAgaWYgKG91dCA9PT0gbnVsbCkge1xuICAgICAgICBvdXQgPSB4O1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgICBvdXQgPSBtdWx0aXBseSh7aW5wdXRzOiB7YTogeCwgYjogb3V0fSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaSA8IG5TdGVwcyAtIDEpIHtcbiAgICAgIGlmIChwYXRoW2ldID49IDApIHtcbiAgICAgICAgb3V0ID0gc3VtKHtcbiAgICAgICAgICBpbnB1dHM6IHt4OiBvdXR9LFxuICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgYXR0cnM6IHtcbiAgICAgICAgICAgIGF4aXM6IHBhdGhbaV0gLSAoYWxsRGltcy5sZW5ndGggLSBudW1EaW1zUmVtYWluaW5nKSxcbiAgICAgICAgICAgIGtlZXBEaW1zOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHRlbnNvcnNUb0Rpc3Bvc2UucHVzaChvdXQpO1xuICAgICAgfVxuICAgICAgbnVtRGltc1JlbWFpbmluZy0tO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsZWFuIHVwIGludGVybWVkaWF0ZSB0ZW5zb3JzLlxuICBmb3IgKGNvbnN0IHRlbnNvckluZm8gb2YgdGVuc29yc1RvRGlzcG9zZSkge1xuICAgIGlmICh0ZW5zb3JJbmZvID09PSBvdXQpIHtcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICB9XG5cbiAgcmV0dXJuIG91dDtcbn1cblxuZXhwb3J0IGNvbnN0IGVpbnN1bUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFaW5zdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlaW5zdW0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Elu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst ELU = `return (x >= 0.0) ? x : (exp(x) - 1.0);`;\nconst ELU_PACKED = `\n  vec4 result;\n\n  result.r = (x.r >= 0.0) ? x.r : (exp(x.r) - 1.0);\n  result.g = (x.g >= 0.0) ? x.g : (exp(x.g) - 1.0);\n  result.b = (x.b >= 0.0) ? x.b : (exp(x.b) - 1.0);\n  result.a = (x.a >= 0.0) ? x.a : (exp(x.a) - 1.0);\n\n  return result;\n`;\nconst elu = unaryKernelFunc({ opSnippet: ELU, packedOpSnippet: ELU_PACKED });\nexport const eluConfig = {\n    kernelName: Elu,\n    backendName: 'webgl',\n    kernelFunc: elu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0VsdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUEyQixNQUFNLHVCQUF1QixDQUFDO0FBQ3BFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLEdBQUcsR0FBRyx5Q0FBeUMsQ0FBQztBQUV0RCxNQUFNLFVBQVUsR0FBRzs7Ozs7Ozs7O0NBU2xCLENBQUM7QUFFRixNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO0FBRTNFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFbHUsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgRUxVID0gYHJldHVybiAoeCA+PSAwLjApID8geCA6IChleHAoeCkgLSAxLjApO2A7XG5cbmNvbnN0IEVMVV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0O1xuXG4gIHJlc3VsdC5yID0gKHguciA+PSAwLjApID8geC5yIDogKGV4cCh4LnIpIC0gMS4wKTtcbiAgcmVzdWx0LmcgPSAoeC5nID49IDAuMCkgPyB4LmcgOiAoZXhwKHguZykgLSAxLjApO1xuICByZXN1bHQuYiA9ICh4LmIgPj0gMC4wKSA/IHguYiA6IChleHAoeC5iKSAtIDEuMCk7XG4gIHJlc3VsdC5hID0gKHguYSA+PSAwLjApID8geC5hIDogKGV4cCh4LmEpIC0gMS4wKTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuY29uc3QgZWx1ID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IEVMVSwgcGFja2VkT3BTbmlwcGV0OiBFTFVfUEFDS0VEfSk7XG5cbmV4cG9ydCBjb25zdCBlbHVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRWx1LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { EluGrad, env } from '@tensorflow/tfjs-core';\nimport { BinaryOpProgram } from '../binaryop_gpu';\nimport { BinaryOpPackedProgram } from '../binaryop_packed_gpu';\nconst ELU_DER = `return (b >= 1.0) ? a : a * (b + 1.0);`;\nconst ELU_DER_PACKED = `\n  vec4 bGTEZero = vec4(greaterThanEqual(b, vec4(0.)));\n  return (bGTEZero * a) + ((vec4(1.0) - bGTEZero) * (a * (b + vec4(1.0))));\n`;\nexport const eluGrad = (args) => {\n    const { inputs, backend } = args;\n    const { dy, y } = inputs;\n    const program = env().getBool('WEBGL_PACK_BINARY_OPERATIONS') ?\n        new BinaryOpPackedProgram(ELU_DER_PACKED, dy.shape, y.shape) :\n        new BinaryOpProgram(ELU_DER, dy.shape, y.shape);\n    return backend.runWebGLProgram(program, [dy, y], dy.dtype);\n};\nexport const eluGradConfig = {\n    kernelName: EluGrad,\n    backendName: 'webgl',\n    kernelFunc: eluGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRWx1R3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9FbHVHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQWlCLEdBQUcsRUFBdUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd4RyxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFN0QsTUFBTSxPQUFPLEdBQUcsd0NBQXdDLENBQUM7QUFDekQsTUFBTSxjQUFjLEdBQUc7OztDQUd0QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUNoQixDQUFDLElBQXdELEVBQWMsRUFBRTtJQUN2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsRUFBRSxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QixNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsOEJBQThCLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUkscUJBQXFCLENBQUMsY0FBYyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUQsSUFBSSxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzdELENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RWx1R3JhZCwgRWx1R3JhZElucHV0cywgZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0JpbmFyeU9wUHJvZ3JhbX0gZnJvbSAnLi4vYmluYXJ5b3BfZ3B1JztcbmltcG9ydCB7QmluYXJ5T3BQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9iaW5hcnlvcF9wYWNrZWRfZ3B1JztcblxuY29uc3QgRUxVX0RFUiA9IGByZXR1cm4gKGIgPj0gMS4wKSA/IGEgOiBhICogKGIgKyAxLjApO2A7XG5jb25zdCBFTFVfREVSX1BBQ0tFRCA9IGBcbiAgdmVjNCBiR1RFWmVybyA9IHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDAuKSkpO1xuICByZXR1cm4gKGJHVEVaZXJvICogYSkgKyAoKHZlYzQoMS4wKSAtIGJHVEVaZXJvKSAqIChhICogKGIgKyB2ZWM0KDEuMCkpKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgZWx1R3JhZCA9XG4gICAgKGFyZ3M6IHtpbnB1dHM6IEVsdUdyYWRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyA9PiB7XG4gICAgICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gICAgICBjb25zdCB7ZHksIHl9ID0gaW5wdXRzO1xuXG4gICAgICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19CSU5BUllfT1BFUkFUSU9OUycpID9cbiAgICAgICAgICBuZXcgQmluYXJ5T3BQYWNrZWRQcm9ncmFtKEVMVV9ERVJfUEFDS0VELCBkeS5zaGFwZSwgeS5zaGFwZSkgOlxuICAgICAgICAgIG5ldyBCaW5hcnlPcFByb2dyYW0oRUxVX0RFUiwgZHkuc2hhcGUsIHkuc2hhcGUpO1xuICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtkeSwgeV0sIGR5LmR0eXBlKTtcbiAgICB9O1xuXG5leHBvcnQgY29uc3QgZWx1R3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFbHVHcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZWx1R3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Equal } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { equalImplCPU } from '../kernel_utils/shared';\nconst PACKED_EQUAL = `\n  return vec4(equal(a, b));\n`;\nconst EQUAL = `return float(a == b);`;\nexport const equal = binaryKernelFunc({\n    opSnippet: EQUAL,\n    packedOpSnippet: PACKED_EQUAL,\n    dtype: 'bool',\n    cpuKernelImpl: equalImplCPU,\n});\nexport const equalConfig = {\n    kernelName: Equal,\n    backendName: 'webgl',\n    kernelFunc: equal\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXF1YWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRXF1YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBMkIsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNwRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDcEQsTUFBTSxZQUFZLEdBQUc7O0NBRXBCLENBQUM7QUFFRixNQUFNLEtBQUssR0FBRyx1QkFBdUIsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZ0JBQWdCLENBQUM7SUFDcEMsU0FBUyxFQUFFLEtBQUs7SUFDaEIsZUFBZSxFQUFFLFlBQVk7SUFDN0IsS0FBSyxFQUFFLE1BQU07SUFDYixhQUFhLEVBQUUsWUFBWTtDQUM1QixDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUF5QjtDQUN0QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0VxdWFsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtlcXVhbEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuY29uc3QgUEFDS0VEX0VRVUFMID0gYFxuICByZXR1cm4gdmVjNChlcXVhbChhLCBiKSk7XG5gO1xuXG5jb25zdCBFUVVBTCA9IGByZXR1cm4gZmxvYXQoYSA9PSBiKTtgO1xuXG5leHBvcnQgY29uc3QgZXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBFUVVBTCxcbiAgcGFja2VkT3BTbmlwcGV0OiBQQUNLRURfRVFVQUwsXG4gIGR0eXBlOiAnYm9vbCcsXG4gIGNwdUtlcm5lbEltcGw6IGVxdWFsSW1wbENQVSxcbn0pO1xuXG5leHBvcnQgY29uc3QgZXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBlcXVhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Erf } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst ERF = `\n  // Error function is calculated approximately with elementary function.\n  // See \"Handbook of Mathematical Functions with Formulas,\n  // Graphs, and Mathematical Tables\", Abramowitz and Stegun.\n  float p = ${backend_util.ERF_P};\n  float a1 = ${backend_util.ERF_A1};\n  float a2 = ${backend_util.ERF_A2};\n  float a3 = ${backend_util.ERF_A3};\n  float a4 = ${backend_util.ERF_A4};\n  float a5 = ${backend_util.ERF_A5};\n\n  float sign = sign(x);\n  x = abs(x);\n  float t = 1.0 / (1.0 + p * x);\n  return sign * (1.0 - (((((a5*t + a4)*t) + a3)*t + a2)*t + a1)*t*exp(-x*x));\n`;\nexport const erf = unaryKernelFunc({ opSnippet: ERF });\nexport const erfConfig = {\n    kernelName: Erf,\n    backendName: 'webgl',\n    kernelFunc: erf,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXJmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0VyZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFFLEdBQUcsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBRXRFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLEdBQUcsR0FBRzs7OztjQUlFLFlBQVksQ0FBQyxLQUFLO2VBQ2pCLFlBQVksQ0FBQyxNQUFNO2VBQ25CLFlBQVksQ0FBQyxNQUFNO2VBQ25CLFlBQVksQ0FBQyxNQUFNO2VBQ25CLFlBQVksQ0FBQyxNQUFNO2VBQ25CLFlBQVksQ0FBQyxNQUFNOzs7Ozs7Q0FNakMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEVyZiwgS2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IEVSRiA9IGBcbiAgLy8gRXJyb3IgZnVuY3Rpb24gaXMgY2FsY3VsYXRlZCBhcHByb3hpbWF0ZWx5IHdpdGggZWxlbWVudGFyeSBmdW5jdGlvbi5cbiAgLy8gU2VlIFwiSGFuZGJvb2sgb2YgTWF0aGVtYXRpY2FsIEZ1bmN0aW9ucyB3aXRoIEZvcm11bGFzLFxuICAvLyBHcmFwaHMsIGFuZCBNYXRoZW1hdGljYWwgVGFibGVzXCIsIEFicmFtb3dpdHogYW5kIFN0ZWd1bi5cbiAgZmxvYXQgcCA9ICR7YmFja2VuZF91dGlsLkVSRl9QfTtcbiAgZmxvYXQgYTEgPSAke2JhY2tlbmRfdXRpbC5FUkZfQTF9O1xuICBmbG9hdCBhMiA9ICR7YmFja2VuZF91dGlsLkVSRl9BMn07XG4gIGZsb2F0IGEzID0gJHtiYWNrZW5kX3V0aWwuRVJGX0EzfTtcbiAgZmxvYXQgYTQgPSAke2JhY2tlbmRfdXRpbC5FUkZfQTR9O1xuICBmbG9hdCBhNSA9ICR7YmFja2VuZF91dGlsLkVSRl9BNX07XG5cbiAgZmxvYXQgc2lnbiA9IHNpZ24oeCk7XG4gIHggPSBhYnMoeCk7XG4gIGZsb2F0IHQgPSAxLjAgLyAoMS4wICsgcCAqIHgpO1xuICByZXR1cm4gc2lnbiAqICgxLjAgLSAoKCgoKGE1KnQgKyBhNCkqdCkgKyBhMykqdCArIGEyKSp0ICsgYTEpKnQqZXhwKC14KngpKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBlcmYgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogRVJGfSk7XG5cbmV4cG9ydCBjb25zdCBlcmZDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXJmLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZXJmLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Exp } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { expImplCPU } from '../kernel_utils/shared';\nexport const EXP = CHECK_NAN_SNIPPET_UNARY + `\n  return exp(x);\n`;\nconst EXP_PACKED = `\n  vec4 result = exp(x);\n  bvec4 isNaN = isnan(x);\n  result.r = isNaN.r ? x.r : result.r;\n  result.g = isNaN.g ? x.g : result.g;\n  result.b = isNaN.b ? x.b : result.b;\n  result.a = isNaN.a ? x.a : result.a;\n\n  return result;\n`;\nexport const exp = unaryKernelFunc({\n    opSnippet: EXP,\n    packedOpSnippet: EXP_PACKED,\n    cpuKernelImpl: expImplCPU,\n    dtype: 'float32',\n});\nexport const expConfig = {\n    kernelName: Exp,\n    backendName: 'webgl',\n    kernelFunc: exp\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0V4cC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUEyQixNQUFNLHVCQUF1QixDQUFDO0FBRXBFLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixHQUFHOztDQUU1QyxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUc7Ozs7Ozs7OztDQVNsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQztJQUNqQyxTQUFTLEVBQUUsR0FBRztJQUNkLGVBQWUsRUFBRSxVQUFVO0lBQzNCLGFBQWEsRUFBRSxVQUFVO0lBQ3pCLEtBQUssRUFBRSxTQUFTO0NBQ2pCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtFeHAsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7ZXhwSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBjb25zdCBFWFAgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGV4cCh4KTtcbmA7XG5cbmNvbnN0IEVYUF9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gZXhwKHgpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IGV4cCA9IHVuYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogRVhQLFxuICBwYWNrZWRPcFNuaXBwZXQ6IEVYUF9QQUNLRUQsXG4gIGNwdUtlcm5lbEltcGw6IGV4cEltcGxDUFUsXG4gIGR0eXBlOiAnZmxvYXQzMicsXG59KTtcblxuZXhwb3J0IGNvbnN0IGV4cENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHAsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBleHAgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ExpandDims, util } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nexport function expandDims(args) {\n    const { inputs, attrs, backend } = args;\n    const { dim } = attrs;\n    const { input } = inputs;\n    const inputRank = input.shape.length;\n    const newShape = input.shape.slice();\n    let $dim = dim;\n    if (dim < 0) {\n        // Negative value is counted from the tail of rank.\n        util.assert(-(inputRank + 1) <= dim, () => `Axis must be in the interval [${-(inputRank + 1)}, ${inputRank}]`);\n        $dim = inputRank + dim + 1;\n    }\n    newShape.splice($dim, 0, 1);\n    return reshape({ inputs: { x: input }, backend, attrs: { shape: newShape } });\n}\nexport const expandDimsConfig = {\n    kernelName: ExpandDims,\n    backendName: 'webgl',\n    kernelFunc: expandDims,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwYW5kRGltcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9FeHBhbmREaW1zLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxVQUFVLEVBQTJFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2hJLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFVBQVUsQ0FBQyxJQUkxQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsR0FBRyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDckMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNyQyxJQUFJLElBQUksR0FBRyxHQUFHLENBQUM7SUFDZixJQUFJLEdBQUcsR0FBRyxDQUFDLEVBQUU7UUFDWCxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxJQUFJLEdBQUcsRUFDdkIsR0FBRyxFQUFFLENBQUMsaUNBQWlDLENBQUUsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLEtBQ3BELFNBQVMsR0FBRyxDQUFDLENBQUM7UUFDdEIsSUFBSSxHQUFHLFNBQVMsR0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0tBQzVCO0lBQ0QsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRTVCLE9BQU8sT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEtBQUssRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUI7SUFDNUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFVBQThCO0NBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIExpY2Vuc2UpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gQVMgSVMgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0V4cGFuZERpbXMsIEV4cGFuZERpbXNBdHRycywgRXhwYW5kRGltc0lucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZXhwYW5kRGltcyhhcmdzOiB7XG4gIGlucHV0czogRXhwYW5kRGltc0lucHV0cyxcbiAgYXR0cnM6IEV4cGFuZERpbXNBdHRycyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTFxufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBhdHRycywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGltfSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IGlucHV0UmFuayA9IGlucHV0LnNoYXBlLmxlbmd0aDtcbiAgY29uc3QgbmV3U2hhcGUgPSBpbnB1dC5zaGFwZS5zbGljZSgpO1xuICBsZXQgJGRpbSA9IGRpbTtcbiAgaWYgKGRpbSA8IDApIHtcbiAgICAvLyBOZWdhdGl2ZSB2YWx1ZSBpcyBjb3VudGVkIGZyb20gdGhlIHRhaWwgb2YgcmFuay5cbiAgICB1dGlsLmFzc2VydChcbiAgICAgICAgLShpbnB1dFJhbmsgKyAxKSA8PSBkaW0sXG4gICAgICAgICgpID0+IGBBeGlzIG11c3QgYmUgaW4gdGhlIGludGVydmFsIFskey0gKGlucHV0UmFuayArIDEpfSwgJHtcbiAgICAgICAgICAgIGlucHV0UmFua31dYCk7XG4gICAgJGRpbSA9IGlucHV0UmFuayArIGRpbSArIDE7XG4gIH1cbiAgbmV3U2hhcGUuc3BsaWNlKCRkaW0sIDAsIDEpO1xuXG4gIHJldHVybiByZXNoYXBlKHtpbnB1dHM6IHt4OiBpbnB1dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xufVxuXG5leHBvcnQgY29uc3QgZXhwYW5kRGltc0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBFeHBhbmREaW1zLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZXhwYW5kRGltcyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Expm1 } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { expm1ImplCPU } from '../kernel_utils/shared';\nconst EXPM1 = `return exp(x) - 1.0;`;\nexport const expm1 = unaryKernelFunc({ opSnippet: EXPM1, packedOpSnippet: EXPM1, cpuKernelImpl: expm1ImplCPU });\nexport const expm1Config = {\n    kernelName: Expm1,\n    backendName: 'webgl',\n    kernelFunc: expm1\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRXhwbTEuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRXhwbTEudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBMkIsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE1BQU0sS0FBSyxHQUFHLHNCQUFzQixDQUFDO0FBRXJDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQ2hDLEVBQUMsU0FBUyxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0FBRTdFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQXlCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7RXhwbTEsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuY30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7ZXhwbTFJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgRVhQTTEgPSBgcmV0dXJuIGV4cCh4KSAtIDEuMDtgO1xuXG5leHBvcnQgY29uc3QgZXhwbTEgPSB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogRVhQTTEsIHBhY2tlZE9wU25pcHBldDogRVhQTTEsIGNwdUtlcm5lbEltcGw6IGV4cG0xSW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3QgZXhwbTFDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogRXhwbTEsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBleHBtMSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class FFTProgram {\n    constructor(component, inputShape, inverse) {\n        this.variableNames = ['real', 'imag'];\n        const innerDim = inputShape[1];\n        this.outputShape = inputShape;\n        const exponentMultiplierSnippet = inverse ? `2.0 * ${Math.PI}` : `-2.0 * ${Math.PI}`;\n        const resultDenominator = inverse ? `${innerDim}.0` : '1.0';\n        let opString;\n        if (component === 'real') {\n            opString = 'return real * expR - imag * expI;';\n        }\n        else if (component === 'imag') {\n            opString = 'return real * expI + imag * expR;';\n        }\n        else {\n            throw new Error(`FFT component must be either \"real\" or \"imag\", got ${component}.`);\n        }\n        this.userCode = `\n      const float exponentMultiplier = ${exponentMultiplierSnippet};\n\n      float unaryOpComplex(float real, float expR, float imag, float expI) {\n        ${opString}\n      }\n\n      float mulMatDFT(int batch, int index) {\n        float indexRatio = float(index) / float(${innerDim});\n        float exponentMultiplierTimesIndexRatio =\n            exponentMultiplier * indexRatio;\n\n        float result = 0.0;\n\n        for (int i = 0; i < ${innerDim}; i++) {\n          // x = (-2|2 * PI / N) * index * i;\n          float x = exponentMultiplierTimesIndexRatio * float(i);\n          float expR = cos(x);\n          float expI = sin(x);\n          float real = getReal(batch, i);\n          float imag = getImag(batch, i);\n\n          result +=\n              unaryOpComplex(real, expR, imag, expI) / ${resultDenominator};\n        }\n\n        return result;\n      }\n\n      void main() {\n        ivec2 coords = getOutputCoords();\n        setOutput(mulMatDFT(coords[0], coords[1]));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmZ0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZmZ0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sVUFBVTtJQUtyQixZQUNJLFNBQXdCLEVBQUUsVUFBNEIsRUFDdEQsT0FBZ0I7UUFOcEIsa0JBQWEsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQztRQU8vQixNQUFNLFFBQVEsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFFOUIsTUFBTSx5QkFBeUIsR0FDM0IsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsVUFBVSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUM7UUFDdkQsTUFBTSxpQkFBaUIsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsUUFBUSxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUU1RCxJQUFJLFFBQWdCLENBQUM7UUFDckIsSUFBSSxTQUFTLEtBQUssTUFBTSxFQUFFO1lBQ3hCLFFBQVEsR0FBRyxtQ0FBbUMsQ0FBQztTQUNoRDthQUFNLElBQUksU0FBUyxLQUFLLE1BQU0sRUFBRTtZQUMvQixRQUFRLEdBQUcsbUNBQW1DLENBQUM7U0FDaEQ7YUFBTTtZQUNMLE1BQU0sSUFBSSxLQUFLLENBQ1gsc0RBQXNELFNBQVMsR0FBRyxDQUFDLENBQUM7U0FDekU7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHO3lDQUNxQix5QkFBeUI7OztVQUd4RCxRQUFROzs7O2tEQUlnQyxRQUFROzs7Ozs7OEJBTTVCLFFBQVE7Ozs7Ozs7Ozt5REFTbUIsaUJBQWlCOzs7Ozs7Ozs7O0tBVXJFLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRkZUUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3JlYWwnLCAnaW1hZyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBjb21wb25lbnQ6ICdyZWFsJ3wnaW1hZycsIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbnZlcnNlOiBib29sZWFuKSB7XG4gICAgY29uc3QgaW5uZXJEaW0gPSBpbnB1dFNoYXBlWzFdO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlO1xuXG4gICAgY29uc3QgZXhwb25lbnRNdWx0aXBsaWVyU25pcHBldCA9XG4gICAgICAgIGludmVyc2UgPyBgMi4wICogJHtNYXRoLlBJfWAgOiBgLTIuMCAqICR7TWF0aC5QSX1gO1xuICAgIGNvbnN0IHJlc3VsdERlbm9taW5hdG9yID0gaW52ZXJzZSA/IGAke2lubmVyRGltfS4wYCA6ICcxLjAnO1xuXG4gICAgbGV0IG9wU3RyaW5nOiBzdHJpbmc7XG4gICAgaWYgKGNvbXBvbmVudCA9PT0gJ3JlYWwnKSB7XG4gICAgICBvcFN0cmluZyA9ICdyZXR1cm4gcmVhbCAqIGV4cFIgLSBpbWFnICogZXhwSTsnO1xuICAgIH0gZWxzZSBpZiAoY29tcG9uZW50ID09PSAnaW1hZycpIHtcbiAgICAgIG9wU3RyaW5nID0gJ3JldHVybiByZWFsICogZXhwSSArIGltYWcgKiBleHBSOyc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgRkZUIGNvbXBvbmVudCBtdXN0IGJlIGVpdGhlciBcInJlYWxcIiBvciBcImltYWdcIiwgZ290ICR7Y29tcG9uZW50fS5gKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgZXhwb25lbnRNdWx0aXBsaWVyID0gJHtleHBvbmVudE11bHRpcGxpZXJTbmlwcGV0fTtcblxuICAgICAgZmxvYXQgdW5hcnlPcENvbXBsZXgoZmxvYXQgcmVhbCwgZmxvYXQgZXhwUiwgZmxvYXQgaW1hZywgZmxvYXQgZXhwSSkge1xuICAgICAgICAke29wU3RyaW5nfVxuICAgICAgfVxuXG4gICAgICBmbG9hdCBtdWxNYXRERlQoaW50IGJhdGNoLCBpbnQgaW5kZXgpIHtcbiAgICAgICAgZmxvYXQgaW5kZXhSYXRpbyA9IGZsb2F0KGluZGV4KSAvIGZsb2F0KCR7aW5uZXJEaW19KTtcbiAgICAgICAgZmxvYXQgZXhwb25lbnRNdWx0aXBsaWVyVGltZXNJbmRleFJhdGlvID1cbiAgICAgICAgICAgIGV4cG9uZW50TXVsdGlwbGllciAqIGluZGV4UmF0aW87XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtpbm5lckRpbX07IGkrKykge1xuICAgICAgICAgIC8vIHggPSAoLTJ8MiAqIFBJIC8gTikgKiBpbmRleCAqIGk7XG4gICAgICAgICAgZmxvYXQgeCA9IGV4cG9uZW50TXVsdGlwbGllclRpbWVzSW5kZXhSYXRpbyAqIGZsb2F0KGkpO1xuICAgICAgICAgIGZsb2F0IGV4cFIgPSBjb3MoeCk7XG4gICAgICAgICAgZmxvYXQgZXhwSSA9IHNpbih4KTtcbiAgICAgICAgICBmbG9hdCByZWFsID0gZ2V0UmVhbChiYXRjaCwgaSk7XG4gICAgICAgICAgZmxvYXQgaW1hZyA9IGdldEltYWcoYmF0Y2gsIGkpO1xuXG4gICAgICAgICAgcmVzdWx0ICs9XG4gICAgICAgICAgICAgIHVuYXJ5T3BDb21wbGV4KHJlYWwsIGV4cFIsIGltYWcsIGV4cEkpIC8gJHtyZXN1bHREZW5vbWluYXRvcn07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQobXVsTWF0REZUKGNvb3Jkc1swXSwgY29vcmRzWzFdKSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { FFTProgram } from '../fft_gpu';\nimport { complex } from './Complex';\nimport { reshape } from './Reshape';\nexport function fftImpl(x, inverse, backend) {\n    const xData = backend.texData.get(x.dataId);\n    const inputSize = util.sizeFromShape(x.shape);\n    // Collapse all outer dimensions to a single batch dimension.\n    const innerDimensionSize = x.shape[x.shape.length - 1];\n    const batch = inputSize / innerDimensionSize;\n    const input2D = reshape({ inputs: { x }, backend, attrs: { shape: [batch, innerDimensionSize] } });\n    const xShape = input2D.shape;\n    const realProgram = new FFTProgram('real', xShape, inverse);\n    const imagProgram = new FFTProgram('imag', xShape, inverse);\n    const inputs = [\n        {\n            dataId: xData.complexTensorInfos.real.dataId,\n            dtype: xData.complexTensorInfos.real.dtype,\n            shape: xShape\n        },\n        {\n            dataId: xData.complexTensorInfos.imag.dataId,\n            dtype: xData.complexTensorInfos.imag.dtype,\n            shape: xShape\n        }\n    ];\n    const realPart = backend.runWebGLProgram(realProgram, inputs, 'float32');\n    const imagPart = backend.runWebGLProgram(imagProgram, inputs, 'float32');\n    const complexOutput = complex({ inputs: { real: realPart, imag: imagPart }, backend });\n    backend.disposeIntermediateTensorInfo(realPart);\n    backend.disposeIntermediateTensorInfo(imagPart);\n    const complexOutputReshaped = reshape({ inputs: { x: complexOutput }, backend, attrs: { shape: x.shape } });\n    backend.disposeIntermediateTensorInfo(input2D);\n    backend.disposeIntermediateTensorInfo(complexOutput);\n    return complexOutputReshaped;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZUX2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRkZUX2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFhLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3ZELE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFdEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxPQUFPLENBQ25CLENBQWEsRUFBRSxPQUFnQixFQUFFLE9BQXlCO0lBQzVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU1QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5Qyw2REFBNkQ7SUFDN0QsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELE1BQU0sS0FBSyxHQUFHLFNBQVMsR0FBRyxrQkFBa0IsQ0FBQztJQUU3QyxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQ25CLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXpFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxLQUF5QixDQUFDO0lBQ2pELE1BQU0sV0FBVyxHQUFHLElBQUksVUFBVSxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDNUQsTUFBTSxXQUFXLEdBQUcsSUFBSSxVQUFVLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUU1RCxNQUFNLE1BQU0sR0FBRztRQUNiO1lBQ0UsTUFBTSxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTTtZQUM1QyxLQUFLLEVBQUUsS0FBSyxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLO1lBQzFDLEtBQUssRUFBRSxNQUFNO1NBQ2Q7UUFDRDtZQUNFLE1BQU0sRUFBRSxLQUFLLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU07WUFDNUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSztZQUMxQyxLQUFLLEVBQUUsTUFBTTtTQUNkO0tBQ0YsQ0FBQztJQUVGLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN6RSxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLFdBQVcsRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFekUsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUVqRSxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRWhELE1BQU0scUJBQXFCLEdBQ3ZCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxhQUFhLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFNUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9DLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxPQUFPLHFCQUFxQixDQUFDO0FBQy9CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RkZUUHJvZ3JhbX0gZnJvbSAnLi4vZmZ0X2dwdSc7XG5cbmltcG9ydCB7Y29tcGxleH0gZnJvbSAnLi9Db21wbGV4JztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZmdEltcGwoXG4gICAgeDogVGVuc29ySW5mbywgaW52ZXJzZTogYm9vbGVhbiwgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm8ge1xuICBjb25zdCB4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQoeC5kYXRhSWQpO1xuXG4gIGNvbnN0IGlucHV0U2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZSh4LnNoYXBlKTtcbiAgLy8gQ29sbGFwc2UgYWxsIG91dGVyIGRpbWVuc2lvbnMgdG8gYSBzaW5nbGUgYmF0Y2ggZGltZW5zaW9uLlxuICBjb25zdCBpbm5lckRpbWVuc2lvblNpemUgPSB4LnNoYXBlW3guc2hhcGUubGVuZ3RoIC0gMV07XG4gIGNvbnN0IGJhdGNoID0gaW5wdXRTaXplIC8gaW5uZXJEaW1lbnNpb25TaXplO1xuXG4gIGNvbnN0IGlucHV0MkQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbYmF0Y2gsIGlubmVyRGltZW5zaW9uU2l6ZV19fSk7XG5cbiAgY29uc3QgeFNoYXBlID0gaW5wdXQyRC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXJdO1xuICBjb25zdCByZWFsUHJvZ3JhbSA9IG5ldyBGRlRQcm9ncmFtKCdyZWFsJywgeFNoYXBlLCBpbnZlcnNlKTtcbiAgY29uc3QgaW1hZ1Byb2dyYW0gPSBuZXcgRkZUUHJvZ3JhbSgnaW1hZycsIHhTaGFwZSwgaW52ZXJzZSk7XG5cbiAgY29uc3QgaW5wdXRzID0gW1xuICAgIHtcbiAgICAgIGRhdGFJZDogeERhdGEuY29tcGxleFRlbnNvckluZm9zLnJlYWwuZGF0YUlkLFxuICAgICAgZHR5cGU6IHhEYXRhLmNvbXBsZXhUZW5zb3JJbmZvcy5yZWFsLmR0eXBlLFxuICAgICAgc2hhcGU6IHhTaGFwZVxuICAgIH0sXG4gICAge1xuICAgICAgZGF0YUlkOiB4RGF0YS5jb21wbGV4VGVuc29ySW5mb3MuaW1hZy5kYXRhSWQsXG4gICAgICBkdHlwZTogeERhdGEuY29tcGxleFRlbnNvckluZm9zLmltYWcuZHR5cGUsXG4gICAgICBzaGFwZTogeFNoYXBlXG4gICAgfVxuICBdO1xuXG4gIGNvbnN0IHJlYWxQYXJ0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocmVhbFByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInKTtcbiAgY29uc3QgaW1hZ1BhcnQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShpbWFnUHJvZ3JhbSwgaW5wdXRzLCAnZmxvYXQzMicpO1xuXG4gIGNvbnN0IGNvbXBsZXhPdXRwdXQgPVxuICAgICAgY29tcGxleCh7aW5wdXRzOiB7cmVhbDogcmVhbFBhcnQsIGltYWc6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGltYWdQYXJ0KTtcblxuICBjb25zdCBjb21wbGV4T3V0cHV0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogY29tcGxleE91dHB1dH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHguc2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbnB1dDJEKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhjb21wbGV4T3V0cHV0KTtcbiAgcmV0dXJuIGNvbXBsZXhPdXRwdXRSZXNoYXBlZDtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FFT } from '@tensorflow/tfjs-core';\nimport { fftImpl } from './FFT_impl';\nexport function fft(args) {\n    const { inputs, backend } = args;\n    const { input } = inputs;\n    return fftImpl(input, false /* inverse */, backend);\n}\nexport const fftConfig = {\n    kernelName: FFT,\n    backendName: 'webgl',\n    kernelFunc: fft\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRkZULmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0ZGVC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUFzQyxNQUFNLHVCQUF1QixDQUFDO0FBSS9FLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFbkMsTUFBTSxVQUFVLEdBQUcsQ0FBQyxJQUFvRDtJQUV0RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRXZCLE9BQU8sT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsYUFBYSxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ3RELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGRlQsIEZGVElucHV0cywgS2VybmVsQ29uZmlnLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2ZmdEltcGx9IGZyb20gJy4vRkZUX2ltcGwnO1xuXG5leHBvcnQgZnVuY3Rpb24gZmZ0KGFyZ3M6IHtpbnB1dHM6IEZGVElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbnB1dH0gPSBpbnB1dHM7XG5cbiAgcmV0dXJuIGZmdEltcGwoaW5wdXQsIGZhbHNlIC8qIGludmVyc2UgKi8sIGJhY2tlbmQpO1xufVxuXG5leHBvcnQgY29uc3QgZmZ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZGVCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZmdFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class FillProgram {\n    constructor(shape, value) {\n        this.outputShape = [];\n        this.customUniforms = [{ name: 'value', type: 'float' }];\n        this.variableNames = ['x'];\n        this.outputShape = shape;\n        this.userCode = `\n      void main() {\n        // Input can be obtained from uniform value.\n        setOutput(value);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsbF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2ZpbGxfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQVksS0FBZSxFQUFFLEtBQWE7UUFKMUMsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFFM0IsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQyxDQUFDLENBQUM7UUFHL0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBRXpCLElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7O0tBS2YsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBGaWxsUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXM6IHN0cmluZ1tdO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XTtcblxuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10sIHZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLnZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAvLyBJbnB1dCBjYW4gYmUgb2J0YWluZWQgZnJvbSB1bmlmb3JtIHZhbHVlLlxuICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Fill, util } from '@tensorflow/tfjs-core';\nimport { FillProgram } from '../fill_gpu';\nexport function fill(args) {\n    const { backend, attrs } = args;\n    const { shape, value } = attrs;\n    let { dtype } = attrs;\n    dtype = dtype || util.inferDtype(value);\n    if (dtype === 'string') {\n        // String type should be handled in CPU memory.\n        const values = util.getArrayFromDType(dtype, util.sizeFromShape(shape));\n        values.fill(value);\n        return backend.makeTensorInfo(shape, dtype, values);\n    }\n    else {\n        const program = new FillProgram(shape, value);\n        const customValues = [[value]];\n        return backend.runWebGLProgram(program, [], dtype, customValues);\n    }\n}\nexport const fillConfig = {\n    kernelName: Fill,\n    backendName: 'webgl',\n    kernelFunc: fill\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmlsbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9GaWxsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQW1ELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2xHLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFeEMsTUFBTSxVQUFVLElBQUksQ0FBQyxJQUFtRDtJQUV0RSxNQUFNLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUM5QixNQUFNLEVBQUMsS0FBSyxFQUFFLEtBQUssRUFBQyxHQUFHLEtBQUssQ0FBQztJQUM3QixJQUFJLEVBQUMsS0FBSyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXBCLEtBQUssR0FBRyxLQUFLLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV4QyxJQUFJLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDdEIsK0NBQStDO1FBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBZSxDQUFDLENBQUM7UUFDN0IsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7S0FDckQ7U0FBTTtRQUNMLE1BQU0sT0FBTyxHQUFHLElBQUksV0FBVyxDQUFDLEtBQUssRUFBRSxLQUFlLENBQUMsQ0FBQztRQUN4RCxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsS0FBZSxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7S0FDbEU7QUFDSCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGaWxsLCBGaWxsQXR0cnMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RmlsbFByb2dyYW19IGZyb20gJy4uL2ZpbGxfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIGZpbGwoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBGaWxsQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2JhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzaGFwZSwgdmFsdWV9ID0gYXR0cnM7XG4gIGxldCB7ZHR5cGV9ID0gYXR0cnM7XG5cbiAgZHR5cGUgPSBkdHlwZSB8fCB1dGlsLmluZmVyRHR5cGUodmFsdWUpO1xuXG4gIGlmIChkdHlwZSA9PT0gJ3N0cmluZycpIHtcbiAgICAvLyBTdHJpbmcgdHlwZSBzaG91bGQgYmUgaGFuZGxlZCBpbiBDUFUgbWVtb3J5LlxuICAgIGNvbnN0IHZhbHVlcyA9IHV0aWwuZ2V0QXJyYXlGcm9tRFR5cGUoZHR5cGUsIHV0aWwuc2l6ZUZyb21TaGFwZShzaGFwZSkpO1xuICAgIHZhbHVlcy5maWxsKHZhbHVlIGFzIHN0cmluZyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIGR0eXBlLCB2YWx1ZXMpO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgRmlsbFByb2dyYW0oc2hhcGUsIHZhbHVlIGFzIG51bWJlcik7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1t2YWx1ZSBhcyBudW1iZXJdXTtcbiAgICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW10sIGR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBmaWxsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZpbGwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBmaWxsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class FlipLeftRightProgram {\n    constructor(imageShape) {\n        this.variableNames = ['Image'];\n        this.outputShape = [];\n        const imageWidth = imageShape[2];\n        this.outputShape = imageShape;\n        this.userCode = `\n        void main() {\n          ivec4 coords = getOutputCoords();\n          int x = coords[2];\n\n          int coordX = ${imageWidth} - x - 1;\n          float outputValue;\n          if(coordX >= 0 && coordX < ${imageWidth}) {\n            outputValue = getImage(coords[0], coords[1], coordX, coords[3]);\n          } else {\n            outputValue = getImage(coords[0], coords[1], coords[2], coords[3]);\n          }\n          setOutput(outputValue);\n        }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmxpcF9sZWZ0X3JpZ2h0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZmxpcF9sZWZ0X3JpZ2h0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBSy9CLFlBQVksVUFBNEM7UUFKeEQsa0JBQWEsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzFCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBSXpCLE1BQU0sVUFBVSxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNqQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUU5QixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozt5QkFLSyxVQUFVOzt1Q0FFSSxVQUFVOzs7Ozs7O0tBTzVDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRmxpcExlZnRSaWdodFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydJbWFnZSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihpbWFnZVNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIGNvbnN0IGltYWdlV2lkdGggPSBpbWFnZVNoYXBlWzJdO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbWFnZVNoYXBlO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xuXG4gICAgICAgICAgaW50IGNvb3JkWCA9ICR7aW1hZ2VXaWR0aH0gLSB4IC0gMTtcbiAgICAgICAgICBmbG9hdCBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICBpZihjb29yZFggPj0gMCAmJiBjb29yZFggPCAke2ltYWdlV2lkdGh9KSB7XG4gICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGdldEltYWdlKGNvb3Jkc1swXSwgY29vcmRzWzFdLCBjb29yZFgsIGNvb3Jkc1szXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoY29vcmRzWzBdLCBjb29yZHNbMV0sIGNvb3Jkc1syXSwgY29vcmRzWzNdKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KG91dHB1dFZhbHVlKTtcbiAgICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FlipLeftRight } from '@tensorflow/tfjs-core';\nimport { FlipLeftRightProgram } from '../flip_left_right_gpu';\nexport const flipLeftRightConfig = {\n    kernelName: FlipLeftRight,\n    backendName: 'webgl',\n    kernelFunc: ({ inputs, backend }) => {\n        const { image } = inputs;\n        const webglBackend = backend;\n        const program = new FlipLeftRightProgram(image.shape);\n        const output = webglBackend.runWebGLProgram(program, [image], image.dtype);\n        return output;\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxpcExlZnRSaWdodC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9GbGlwTGVmdFJpZ2h0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxhQUFhLEVBQXNCLE1BQU0sdUJBQXVCLENBQUM7QUFHekUsT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDaEMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQTZCLENBQUM7UUFDOUMsTUFBTSxZQUFZLEdBQUcsT0FBMkIsQ0FBQztRQUVqRCxNQUFNLE9BQU8sR0FBRyxJQUFJLG9CQUFvQixDQUFFLEtBQWtCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDcEUsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDM0UsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBUZW5zb3I0RH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7RmxpcExlZnRSaWdodCwgRmxpcExlZnRSaWdodElucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7RmxpcExlZnRSaWdodFByb2dyYW19IGZyb20gJy4uL2ZsaXBfbGVmdF9yaWdodF9ncHUnO1xuXG5leHBvcnQgY29uc3QgZmxpcExlZnRSaWdodENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbGlwTGVmdFJpZ2h0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogKHtpbnB1dHMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge2ltYWdlfSA9IGlucHV0cyBhcyBGbGlwTGVmdFJpZ2h0SW5wdXRzO1xuICAgIGNvbnN0IHdlYmdsQmFja2VuZCA9IGJhY2tlbmQgYXMgTWF0aEJhY2tlbmRXZWJHTDtcblxuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgRmxpcExlZnRSaWdodFByb2dyYW0oKGltYWdlIGFzIFRlbnNvcjREKS5zaGFwZSk7XG4gICAgY29uc3Qgb3V0cHV0ID0gd2ViZ2xCYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbaW1hZ2VdLCBpbWFnZS5kdHlwZSk7XG4gICAgcmV0dXJuIG91dHB1dDtcbiAgfVxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Floor } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { floorImplCPU } from '../kernel_utils/shared';\nconst FLOOR = `return floor(x);`;\nexport const floor = unaryKernelFunc({ opSnippet: FLOOR, packedOpSnippet: FLOOR, cpuKernelImpl: floorImplCPU });\nexport const floorConfig = {\n    kernelName: Floor,\n    backendName: 'webgl',\n    kernelFunc: floor,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRmxvb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0E7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUNuRSxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFcEQsTUFBTSxLQUFLLEdBQUcsa0JBQWtCLENBQUM7QUFFakMsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHLGVBQWUsQ0FDaEMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUM7QUFFN0UsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBSztDQUNsQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiXG4vKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Rmxvb3IsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Zmxvb3JJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgRkxPT1IgPSBgcmV0dXJuIGZsb29yKHgpO2A7XG5cbmV4cG9ydCBjb25zdCBmbG9vciA9IHVuYXJ5S2VybmVsRnVuYyhcbiAgICB7b3BTbmlwcGV0OiBGTE9PUiwgcGFja2VkT3BTbmlwcGV0OiBGTE9PUiwgY3B1S2VybmVsSW1wbDogZmxvb3JJbXBsQ1BVfSk7XG5cbmV4cG9ydCBjb25zdCBmbG9vckNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbG9vcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZsb29yLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { FloorDiv } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\n// We use native integer division to deal with floating point imprecision. Since\n// we implement floor division and glsl implements truncated division, we\n// correct for this by subtracting 1 from result when the result is negative and\n// there is a remainder.\nconst INT_DIV = `\n  float s = sign(a) * sign(b);\n  int ia = round(a);\n  int ib = round(b);\n  if (ib != 0) {\n    // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n    return float(idiv(ia, ib, s));\n  } else {\n    return NAN;\n  }\n`;\nconst INT_DIV_PACKED = `\n  ivec4 ia = round(a);\n  ivec4 ib = round(b);\n  bvec4 cond = notEqual(ib, ivec4(0));\n  ivec4 result = ivec4(0);\n  vec4 s = sign(a) * sign(b);\n\n  // Windows (D3D) wants guaranteed non-zero int division at compile-time.\n  if (cond[0]) {\n    result[0] = idiv(ia[0], ib[0], s[0]);\n  }\n  if (cond[1]) {\n    result[1] = idiv(ia[1], ib[1], s[1]);\n  }\n  if (cond[2]) {\n    result[2] = idiv(ia[2], ib[2], s[2]);\n  }\n  if (cond[3]) {\n    result[3] = idiv(ia[3], ib[3], s[3]);\n  }\n  return vec4(result);\n`;\nexport const floorDiv = binaryKernelFunc({ opSnippet: INT_DIV, packedOpSnippet: INT_DIV_PACKED, dtype: 'int32' });\nexport const floorDivConfig = {\n    kernelName: FloorDiv,\n    backendName: 'webgl',\n    kernelFunc: floorDiv\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRmxvb3JEaXYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRmxvb3JEaXYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBMkIsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RSxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRSxnRkFBZ0Y7QUFDaEYseUVBQXlFO0FBQ3pFLGdGQUFnRjtBQUNoRix3QkFBd0I7QUFDeEIsTUFBTSxPQUFPLEdBQUc7Ozs7Ozs7Ozs7Q0FVZixDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQXFCdEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxnQkFBZ0IsQ0FDcEMsRUFBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSxjQUFjLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7QUFFM0UsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsUUFBNEI7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtGbG9vckRpdiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG4vLyBXZSB1c2UgbmF0aXZlIGludGVnZXIgZGl2aXNpb24gdG8gZGVhbCB3aXRoIGZsb2F0aW5nIHBvaW50IGltcHJlY2lzaW9uLiBTaW5jZVxuLy8gd2UgaW1wbGVtZW50IGZsb29yIGRpdmlzaW9uIGFuZCBnbHNsIGltcGxlbWVudHMgdHJ1bmNhdGVkIGRpdmlzaW9uLCB3ZVxuLy8gY29ycmVjdCBmb3IgdGhpcyBieSBzdWJ0cmFjdGluZyAxIGZyb20gcmVzdWx0IHdoZW4gdGhlIHJlc3VsdCBpcyBuZWdhdGl2ZSBhbmRcbi8vIHRoZXJlIGlzIGEgcmVtYWluZGVyLlxuY29uc3QgSU5UX0RJViA9IGBcbiAgZmxvYXQgcyA9IHNpZ24oYSkgKiBzaWduKGIpO1xuICBpbnQgaWEgPSByb3VuZChhKTtcbiAgaW50IGliID0gcm91bmQoYik7XG4gIGlmIChpYiAhPSAwKSB7XG4gICAgLy8gV2luZG93cyAoRDNEKSB3YW50cyBndWFyYW50ZWVkIG5vbi16ZXJvIGludCBkaXZpc2lvbiBhdCBjb21waWxlLXRpbWUuXG4gICAgcmV0dXJuIGZsb2F0KGlkaXYoaWEsIGliLCBzKSk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuYDtcblxuY29uc3QgSU5UX0RJVl9QQUNLRUQgPSBgXG4gIGl2ZWM0IGlhID0gcm91bmQoYSk7XG4gIGl2ZWM0IGliID0gcm91bmQoYik7XG4gIGJ2ZWM0IGNvbmQgPSBub3RFcXVhbChpYiwgaXZlYzQoMCkpO1xuICBpdmVjNCByZXN1bHQgPSBpdmVjNCgwKTtcbiAgdmVjNCBzID0gc2lnbihhKSAqIHNpZ24oYik7XG5cbiAgLy8gV2luZG93cyAoRDNEKSB3YW50cyBndWFyYW50ZWVkIG5vbi16ZXJvIGludCBkaXZpc2lvbiBhdCBjb21waWxlLXRpbWUuXG4gIGlmIChjb25kWzBdKSB7XG4gICAgcmVzdWx0WzBdID0gaWRpdihpYVswXSwgaWJbMF0sIHNbMF0pO1xuICB9XG4gIGlmIChjb25kWzFdKSB7XG4gICAgcmVzdWx0WzFdID0gaWRpdihpYVsxXSwgaWJbMV0sIHNbMV0pO1xuICB9XG4gIGlmIChjb25kWzJdKSB7XG4gICAgcmVzdWx0WzJdID0gaWRpdihpYVsyXSwgaWJbMl0sIHNbMl0pO1xuICB9XG4gIGlmIChjb25kWzNdKSB7XG4gICAgcmVzdWx0WzNdID0gaWRpdihpYVszXSwgaWJbM10sIHNbM10pO1xuICB9XG4gIHJldHVybiB2ZWM0KHJlc3VsdCk7XG5gO1xuXG5leHBvcnQgY29uc3QgZmxvb3JEaXYgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IElOVF9ESVYsIHBhY2tlZE9wU25pcHBldDogSU5UX0RJVl9QQUNLRUQsIGR0eXBlOiAnaW50MzInfSk7XG5cbmV4cG9ydCBjb25zdCBmbG9vckRpdkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGbG9vckRpdixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZsb29yRGl2IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from '../../glsl_version';\nexport class FromPixelsProgram {\n    constructor(outputShape) {\n        this.variableNames = ['A'];\n        const glsl = getGlslDifferences();\n        const [height, width,] = outputShape;\n        this.outputShape = outputShape;\n        this.userCode = `\n      void main() {\n        ivec3 coords = getOutputCoords();\n        int texR = coords[0];\n        int texC = coords[1];\n        int depth = coords[2];\n        vec2 uv = (vec2(texC, texR) + halfCR) / vec2(${width}.0, ${height}.0);\n\n        vec4 values = ${glsl.texture2D}(A, uv);\n        float value;\n        if (depth == 0) {\n          value = values.r;\n        } else if (depth == 1) {\n          value = values.g;\n        } else if (depth == 2) {\n          value = values.b;\n        } else if (depth == 3) {\n          value = values.a;\n        }\n\n        setOutput(floor(value * 255.0 + 0.5));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbV9waXhlbHNfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0Zyb21QaXhlbHNfdXRpbHMvZnJvbV9waXhlbHNfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBR3RELE1BQU0sT0FBTyxpQkFBaUI7SUFLNUIsWUFBWSxXQUFxQjtRQUpqQyxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFLcEIsTUFBTSxJQUFJLEdBQUcsa0JBQWtCLEVBQUUsQ0FBQztRQUNsQyxNQUFNLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRyxHQUFHLFdBQVcsQ0FBQztRQUN0QyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7dURBTW1DLEtBQUssT0FBTyxNQUFNOzt3QkFFakQsSUFBSSxDQUFDLFNBQVM7Ozs7Ozs7Ozs7Ozs7O0tBY2pDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7Z2V0R2xzbERpZmZlcmVuY2VzfSBmcm9tICcuLi8uLi9nbHNsX3ZlcnNpb24nO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4uLy4uL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgRnJvbVBpeGVsc1Byb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydBJ107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcblxuICBjb25zdHJ1Y3RvcihvdXRwdXRTaGFwZTogbnVtYmVyW10pIHtcbiAgICBjb25zdCBnbHNsID0gZ2V0R2xzbERpZmZlcmVuY2VzKCk7XG4gICAgY29uc3QgW2hlaWdodCwgd2lkdGgsIF0gPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzMgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCB0ZXhSID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgdGV4QyA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGRlcHRoID0gY29vcmRzWzJdO1xuICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC8gdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG5cbiAgICAgICAgdmVjNCB2YWx1ZXMgPSAke2dsc2wudGV4dHVyZTJEfShBLCB1dik7XG4gICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICBpZiAoZGVwdGggPT0gMCkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLnI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmc7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMikge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XG4gICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMykge1xuICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmE7XG4gICAgICAgIH1cblxuICAgICAgICBzZXRPdXRwdXQoZmxvb3IodmFsdWUgKiAyNTUuMCArIDAuNSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getGlslDifferences } from '../../glsl_version';\nexport class FromPixelsPackedProgram {\n    constructor(outputShape) {\n        this.variableNames = ['A'];\n        this.packedInputs = false;\n        this.packedOutput = true;\n        const glsl = getGlslDifferences();\n        const [height, width,] = outputShape;\n        this.outputShape = outputShape;\n        this.userCode = `\n      void main() {\n        ivec3 coords = getOutputCoords();\n        int texR = coords[0];\n        int texC = coords[1];\n        int depth = coords[2];\n\n        vec4 result = vec4(0.);\n\n        for(int row=0; row<=1; row++) {\n          for(int col=0; col<=1; col++) {\n            texC = coords[1] + row;\n            depth = coords[2] + col;\n\n            vec2 uv = (vec2(texC, texR) + halfCR) /\n                       vec2(${width}.0, ${height}.0);\n            vec4 values = ${glsl.texture2D}(A, uv);\n            float value;\n            if (depth == 0) {\n              value = values.r;\n            } else if (depth == 1) {\n              value = values.g;\n            } else if (depth == 2) {\n              value = values.b;\n            } else if (depth == 3) {\n              value = values.a;\n            }\n\n            result[row * 2 + col] = floor(value * 255.0 + 0.5);\n          }\n        }\n\n        ${glsl.output} = result;\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJvbV9waXhlbHNfcGFja2VkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Gcm9tUGl4ZWxzX3V0aWxzL2Zyb21fcGl4ZWxzX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFHdEQsTUFBTSxPQUFPLHVCQUF1QjtJQU9sQyxZQUFZLFdBQXFCO1FBTmpDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUd0QixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNyQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUdsQixNQUFNLElBQUksR0FBRyxrQkFBa0IsRUFBRSxDQUFDO1FBQ2xDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFHLEdBQUcsV0FBVyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs4QkFlVSxLQUFLLE9BQU8sTUFBTTs0QkFDcEIsSUFBSSxDQUFDLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7VUFnQmhDLElBQUksQ0FBQyxNQUFNOztLQUVoQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2dldEdsc2xEaWZmZXJlbmNlc30gZnJvbSAnLi4vLi4vZ2xzbF92ZXJzaW9uJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuLi8uLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIEZyb21QaXhlbHNQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHBhY2tlZElucHV0cyA9IGZhbHNlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuXG4gIGNvbnN0cnVjdG9yKG91dHB1dFNoYXBlOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IGdsc2wgPSBnZXRHbHNsRGlmZmVyZW5jZXMoKTtcbiAgICBjb25zdCBbaGVpZ2h0LCB3aWR0aCwgXSA9IG91dHB1dFNoYXBlO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMyBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IHRleFIgPSBjb29yZHNbMF07XG4gICAgICAgIGludCB0ZXhDID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgZGVwdGggPSBjb29yZHNbMl07XG5cbiAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcblxuICAgICAgICBmb3IoaW50IHJvdz0wOyByb3c8PTE7IHJvdysrKSB7XG4gICAgICAgICAgZm9yKGludCBjb2w9MDsgY29sPD0xOyBjb2wrKykge1xuICAgICAgICAgICAgdGV4QyA9IGNvb3Jkc1sxXSArIHJvdztcbiAgICAgICAgICAgIGRlcHRoID0gY29vcmRzWzJdICsgY29sO1xuXG4gICAgICAgICAgICB2ZWMyIHV2ID0gKHZlYzIodGV4QywgdGV4UikgKyBoYWxmQ1IpIC9cbiAgICAgICAgICAgICAgICAgICAgICAgdmVjMigke3dpZHRofS4wLCAke2hlaWdodH0uMCk7XG4gICAgICAgICAgICB2ZWM0IHZhbHVlcyA9ICR7Z2xzbC50ZXh0dXJlMkR9KEEsIHV2KTtcbiAgICAgICAgICAgIGZsb2F0IHZhbHVlO1xuICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMucjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVwdGggPT0gMSkge1xuICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlcy5nO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkZXB0aCA9PSAyKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gdmFsdWVzLmI7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRlcHRoID09IDMpIHtcbiAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZXMuYTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzdWx0W3JvdyAqIDIgKyBjb2xdID0gZmxvb3IodmFsdWUgKiAyNTUuMCArIDAuNSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgJHtnbHNsLm91dHB1dH0gPSByZXN1bHQ7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nimport { FromPixels } from '@tensorflow/tfjs-core';\nimport { TextureUsage } from '../tex_util';\nimport { FromPixelsProgram } from './FromPixels_utils/from_pixels_gpu';\nimport { FromPixelsPackedProgram } from './FromPixels_utils/from_pixels_packed_gpu';\nexport const fromPixelsConfig = {\n    kernelName: FromPixels,\n    backendName: 'webgl',\n    kernelFunc: fromPixels,\n};\nlet fromPixels2DContext;\nlet willReadFrequently = env().getBool('CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU');\nfunction fromPixels(args) {\n    const { inputs, backend, attrs } = args;\n    let { pixels } = inputs;\n    const { numChannels } = attrs;\n    const isVideo = typeof (HTMLVideoElement) !== 'undefined' &&\n        pixels instanceof HTMLVideoElement;\n    const isImage = typeof (HTMLImageElement) !== 'undefined' &&\n        pixels instanceof HTMLImageElement;\n    const [width, height] = isVideo ?\n        [\n            pixels.videoWidth,\n            pixels.videoHeight\n        ] :\n        [pixels.width, pixels.height];\n    const texShape = [height, width];\n    const outShape = [height, width, numChannels];\n    if (isImage || isVideo) {\n        const newWillReadFrequently = env().getBool('CANVAS2D_WILL_READ_FREQUENTLY_FOR_GPU');\n        if (fromPixels2DContext == null ||\n            newWillReadFrequently !== willReadFrequently) {\n            willReadFrequently = newWillReadFrequently;\n            fromPixels2DContext =\n                document.createElement('canvas').getContext('2d', { willReadFrequently });\n        }\n        fromPixels2DContext.canvas.width = width;\n        fromPixels2DContext.canvas.height = height;\n        fromPixels2DContext.drawImage(pixels, 0, 0, width, height);\n        pixels = fromPixels2DContext.canvas;\n    }\n    const tempPixelHandle = backend.makeTensorInfo(texShape, 'int32');\n    // This is a byte texture with pixels.\n    backend.texData.get(tempPixelHandle.dataId).usage = TextureUsage.PIXELS;\n    backend.gpgpu.uploadPixelDataToTexture(backend.getTexture(tempPixelHandle.dataId), pixels);\n    const program = env().getBool('WEBGL_PACK') ?\n        new FromPixelsPackedProgram(outShape) :\n        new FromPixelsProgram(outShape);\n    const res = backend.runWebGLProgram(program, [tempPixelHandle], 'int32');\n    backend.disposeData(tempPixelHandle.dataId);\n    return res;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnJvbVBpeGVscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Gcm9tUGl4ZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQXVDLE1BQU0sdUJBQXVCLENBQUM7QUFDaEYsT0FBTyxFQUFDLFVBQVUsRUFBb0MsTUFBTSx1QkFBdUIsQ0FBQztBQUdwRixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXpDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3JFLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBRWxGLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsVUFBOEI7Q0FDM0MsQ0FBQztBQUVGLElBQUksbUJBQTZDLENBQUM7QUFDbEQsSUFBSSxrQkFBa0IsR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQUMsQ0FBQztBQUVoRixTQUFTLFVBQVUsQ0FBQyxJQUluQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxJQUFJLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3RCLE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUIsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssV0FBVztRQUNyRCxNQUFNLFlBQVksZ0JBQWdCLENBQUM7SUFDdkMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLEtBQUssV0FBVztRQUNyRCxNQUFNLFlBQVksZ0JBQWdCLENBQUM7SUFDdkMsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsR0FBRyxPQUFPLENBQUMsQ0FBQztRQUM3QjtZQUNHLE1BQTJCLENBQUMsVUFBVTtZQUN0QyxNQUEyQixDQUFDLFdBQVc7U0FDekMsQ0FBQyxDQUFDO1FBQ0gsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVsQyxNQUFNLFFBQVEsR0FBcUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbkQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBRTlDLElBQUksT0FBTyxJQUFJLE9BQU8sRUFBRTtRQUN0QixNQUFNLHFCQUFxQixHQUN2QixHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUNBQXVDLENBQUMsQ0FBQztRQUMzRCxJQUFJLG1CQUFtQixJQUFJLElBQUk7WUFDM0IscUJBQXFCLEtBQUssa0JBQWtCLEVBQUU7WUFDaEQsa0JBQWtCLEdBQUcscUJBQXFCLENBQUM7WUFDM0MsbUJBQW1CO2dCQUNmLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUMsVUFBVSxDQUN2QyxJQUFJLEVBQUUsRUFBQyxrQkFBa0IsRUFBQyxDQUE2QixDQUFDO1NBQ2pFO1FBRUQsbUJBQW1CLENBQUMsTUFBTSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDekMsbUJBQW1CLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDM0MsbUJBQW1CLENBQUMsU0FBUyxDQUN6QixNQUEyRCxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQ2pFLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztRQUNuQixNQUFNLEdBQUcsbUJBQW1CLENBQUMsTUFBTSxDQUFDO0tBQ3JDO0lBRUQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsc0NBQXNDO0lBQ3RDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLE1BQU0sQ0FBQztJQUN4RSxPQUFPLENBQUMsS0FBSyxDQUFDLHdCQUF3QixDQUNsQyxPQUFPLENBQUMsVUFBVSxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFtQixDQUFDLENBQUM7SUFDckUsTUFBTSxPQUFPLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7UUFDekMsSUFBSSx1QkFBdUIsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksaUJBQWlCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDcEMsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUN6RSxPQUFPLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1QyxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge0Zyb21QaXhlbHMsIEZyb21QaXhlbHNBdHRycywgRnJvbVBpeGVsc0lucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7VGV4dHVyZVVzYWdlfSBmcm9tICcuLi90ZXhfdXRpbCc7XG5cbmltcG9ydCB7RnJvbVBpeGVsc1Byb2dyYW19IGZyb20gJy4vRnJvbVBpeGVsc191dGlscy9mcm9tX3BpeGVsc19ncHUnO1xuaW1wb3J0IHtGcm9tUGl4ZWxzUGFja2VkUHJvZ3JhbX0gZnJvbSAnLi9Gcm9tUGl4ZWxzX3V0aWxzL2Zyb21fcGl4ZWxzX3BhY2tlZF9ncHUnO1xuXG5leHBvcnQgY29uc3QgZnJvbVBpeGVsc0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGcm9tUGl4ZWxzLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZnJvbVBpeGVscyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcblxubGV0IGZyb21QaXhlbHMyRENvbnRleHQ6IENhbnZhc1JlbmRlcmluZ0NvbnRleHQyRDtcbmxldCB3aWxsUmVhZEZyZXF1ZW50bHkgPSBlbnYoKS5nZXRCb29sKCdDQU5WQVMyRF9XSUxMX1JFQURfRlJFUVVFTlRMWV9GT1JfR1BVJyk7XG5cbmZ1bmN0aW9uIGZyb21QaXhlbHMoYXJnczoge1xuICBpbnB1dHM6IEZyb21QaXhlbHNJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBGcm9tUGl4ZWxzQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgbGV0IHtwaXhlbHN9ID0gaW5wdXRzO1xuICBjb25zdCB7bnVtQ2hhbm5lbHN9ID0gYXR0cnM7XG5cbiAgY29uc3QgaXNWaWRlbyA9IHR5cGVvZiAoSFRNTFZpZGVvRWxlbWVudCkgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICBwaXhlbHMgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50O1xuICBjb25zdCBpc0ltYWdlID0gdHlwZW9mIChIVE1MSW1hZ2VFbGVtZW50KSAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICAgIHBpeGVscyBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQ7XG4gIGNvbnN0IFt3aWR0aCwgaGVpZ2h0XSA9IGlzVmlkZW8gP1xuICAgICAgW1xuICAgICAgICAocGl4ZWxzIGFzIEhUTUxWaWRlb0VsZW1lbnQpLnZpZGVvV2lkdGgsXG4gICAgICAgIChwaXhlbHMgYXMgSFRNTFZpZGVvRWxlbWVudCkudmlkZW9IZWlnaHRcbiAgICAgIF0gOlxuICAgICAgW3BpeGVscy53aWR0aCwgcGl4ZWxzLmhlaWdodF07XG5cbiAgY29uc3QgdGV4U2hhcGU6IFtudW1iZXIsIG51bWJlcl0gPSBbaGVpZ2h0LCB3aWR0aF07XG4gIGNvbnN0IG91dFNoYXBlID0gW2hlaWdodCwgd2lkdGgsIG51bUNoYW5uZWxzXTtcblxuICBpZiAoaXNJbWFnZSB8fCBpc1ZpZGVvKSB7XG4gICAgY29uc3QgbmV3V2lsbFJlYWRGcmVxdWVudGx5ID1cbiAgICAgICAgZW52KCkuZ2V0Qm9vbCgnQ0FOVkFTMkRfV0lMTF9SRUFEX0ZSRVFVRU5UTFlfRk9SX0dQVScpO1xuICAgIGlmIChmcm9tUGl4ZWxzMkRDb250ZXh0ID09IG51bGwgfHxcbiAgICAgICAgbmV3V2lsbFJlYWRGcmVxdWVudGx5ICE9PSB3aWxsUmVhZEZyZXF1ZW50bHkpIHtcbiAgICAgIHdpbGxSZWFkRnJlcXVlbnRseSA9IG5ld1dpbGxSZWFkRnJlcXVlbnRseTtcbiAgICAgIGZyb21QaXhlbHMyRENvbnRleHQgPVxuICAgICAgICAgIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpLmdldENvbnRleHQoXG4gICAgICAgICAgICAgICcyZCcsIHt3aWxsUmVhZEZyZXF1ZW50bHl9KSBhcyBDYW52YXNSZW5kZXJpbmdDb250ZXh0MkQ7XG4gICAgfVxuXG4gICAgZnJvbVBpeGVsczJEQ29udGV4dC5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcy5oZWlnaHQgPSBoZWlnaHQ7XG4gICAgZnJvbVBpeGVsczJEQ29udGV4dC5kcmF3SW1hZ2UoXG4gICAgICAgIHBpeGVscyBhcyBIVE1MVmlkZW9FbGVtZW50IHwgSFRNTEltYWdlRWxlbWVudCB8IEltYWdlQml0bWFwLCAwLCAwLFxuICAgICAgICB3aWR0aCwgaGVpZ2h0KTtcbiAgICBwaXhlbHMgPSBmcm9tUGl4ZWxzMkRDb250ZXh0LmNhbnZhcztcbiAgfVxuXG4gIGNvbnN0IHRlbXBQaXhlbEhhbmRsZSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8odGV4U2hhcGUsICdpbnQzMicpO1xuICAvLyBUaGlzIGlzIGEgYnl0ZSB0ZXh0dXJlIHdpdGggcGl4ZWxzLlxuICBiYWNrZW5kLnRleERhdGEuZ2V0KHRlbXBQaXhlbEhhbmRsZS5kYXRhSWQpLnVzYWdlID0gVGV4dHVyZVVzYWdlLlBJWEVMUztcbiAgYmFja2VuZC5ncGdwdS51cGxvYWRQaXhlbERhdGFUb1RleHR1cmUoXG4gICAgICBiYWNrZW5kLmdldFRleHR1cmUodGVtcFBpeGVsSGFuZGxlLmRhdGFJZCksIHBpeGVscyBhcyBJbWFnZURhdGEpO1xuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDSycpID9cbiAgICAgIG5ldyBGcm9tUGl4ZWxzUGFja2VkUHJvZ3JhbShvdXRTaGFwZSkgOlxuICAgICAgbmV3IEZyb21QaXhlbHNQcm9ncmFtKG91dFNoYXBlKTtcbiAgY29uc3QgcmVzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3RlbXBQaXhlbEhhbmRsZV0sICdpbnQzMicpO1xuICBiYWNrZW5kLmRpc3Bvc2VEYXRhKHRlbXBQaXhlbEhhbmRsZS5kYXRhSWQpO1xuICByZXR1cm4gcmVzO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, FusedConv2D, util } from '@tensorflow/tfjs-core';\nimport { Conv2DProgram } from '../conv_gpu';\nimport { Conv2DPackedProgram } from '../conv_packed_gpu';\nimport { mapActivationToShaderProgram } from '../kernel_utils/kernel_funcs_utils';\nimport { conv2dByMatMul, conv2dWithIm2Row } from './Conv2D_impl';\nimport { reshape } from './Reshape';\nexport function fusedConv2d(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter, bias, preluActivationWeights } = inputs;\n    const { strides, pad, dataFormat, dilations, dimRoundingMode, activation, leakyreluAlpha } = attrs;\n    const $dataFormat = backend_util.convertConv2DDataFormat(dataFormat);\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, dilations, pad, dimRoundingMode, false /* depthwise */, $dataFormat);\n    let out;\n    const intermediates = [];\n    const hasBias = bias != null;\n    const hasPreluActivationWeights = preluActivationWeights != null;\n    const hasLeakyreluAlpha = activation === 'leakyrelu';\n    const prepareInputs = () => {\n        const inputs = [x, filter];\n        // If the input is a 1-D tensor, align it with the channels.\n        //\n        // For fusedConv2d, the inputs (x, W, bias, preluActivationWeights) are\n        // supposed to be aligned with the dataFormat. The 4-D tensor inputs or\n        // scalar inputs are originally aligned, but the 1-D tensor inputs are\n        // supposed to be aligned with the channels (only bias and PReLU activation\n        // weights could be a 1-D tensor).\n        const alignInputWithDataFormat = (input, dataFormat) => {\n            if (dataFormat === 'NCHW' && input.shape.length === 1 &&\n                input.shape[0] !== 1) {\n                const alignedInput = reshape({\n                    inputs: { x: input },\n                    backend,\n                    attrs: { shape: [input.shape[0], 1, 1] }\n                });\n                intermediates.push(alignedInput);\n                return alignedInput;\n            }\n            return input;\n        };\n        if (hasBias) {\n            inputs.push(alignInputWithDataFormat(bias, dataFormat));\n        }\n        if (hasPreluActivationWeights) {\n            inputs.push(alignInputWithDataFormat(preluActivationWeights, dataFormat));\n        }\n        if (hasLeakyreluAlpha) {\n            const $leakyreluAlpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(leakyreluAlpha, 'float32'));\n            inputs.push($leakyreluAlpha);\n            intermediates.push($leakyreluAlpha);\n        }\n        return inputs;\n    };\n    if (convInfo.filterHeight === 1 && convInfo.filterWidth === 1 &&\n        convInfo.dilationHeight === 1 && convInfo.dilationWidth === 1 &&\n        convInfo.strideHeight === 1 && convInfo.strideWidth === 1 &&\n        (convInfo.padInfo.type === 'SAME' || convInfo.padInfo.type === 'VALID')) {\n        out = conv2dByMatMul({\n            x,\n            filter,\n            convInfo,\n            backend,\n            bias,\n            activation,\n            preluActivationWeights,\n            leakyreluAlpha\n        });\n    }\n    else if (convInfo.strideWidth <= 2 && $dataFormat === 'channelsLast'\n        && env().getBool('WEBGL_EXP_CONV')) {\n        const fusedActivation = activation ? mapActivationToShaderProgram(activation, true) : null;\n        const program = new Conv2DPackedProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n        const customValues = [\n            [convInfo.padInfo.top, convInfo.padInfo.left],\n            [convInfo.strideHeight, convInfo.strideWidth],\n            [convInfo.dilationHeight, convInfo.dilationWidth],\n            [convInfo.inHeight, convInfo.inWidth]\n        ];\n        const inputs = prepareInputs();\n        out = backend.runWebGLProgram(program, inputs, 'float32', customValues);\n    }\n    else if (env().getBool('WEBGL_CONV_IM2COL')) {\n        out = conv2dWithIm2Row({\n            x,\n            filter,\n            convInfo,\n            backend,\n            bias,\n            activation,\n            preluActivationWeights,\n            leakyreluAlpha\n        });\n    }\n    else {\n        const fusedActivation = activation ? mapActivationToShaderProgram(activation, false) : null;\n        const program = new Conv2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n        const inputs = prepareInputs();\n        out = backend.runWebGLProgram(program, inputs, 'float32');\n    }\n    const outReshaped = reshape({ inputs: { x: out }, backend, attrs: { shape: convInfo.outShape } });\n    intermediates.push(out);\n    intermediates.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return outReshaped;\n}\nexport const fusedConv2DConfig = {\n    kernelName: FusedConv2D,\n    backendName: 'webgl',\n    kernelFunc: fusedConv2d,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWRDb252MkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRnVzZWRDb252MkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUE2RSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd0SixPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBQzFDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRWhGLE9BQU8sRUFBQyxjQUFjLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0QsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRSxzQkFBc0IsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN6RCxNQUFNLEVBQ0osT0FBTyxFQUNQLEdBQUcsRUFDSCxVQUFVLEVBQ1YsU0FBUyxFQUNULGVBQWUsRUFDZixVQUFVLEVBQ1YsY0FBYyxFQUNmLEdBQUcsS0FBSyxDQUFDO0lBRVYsTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUFDLHVCQUF1QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQzNDLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLE9BQU8sRUFBRSxTQUFT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QUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDeEUsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQzdCLFFBQVEsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUM3RCxpQkFBaUIsQ0FBQyxDQUFDO1FBRXZCLE1BQU0sTUFBTSxHQUFHLGFBQWEsRUFBRSxDQUFDO1FBQy9CLEdBQUcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDM0Q7SUFFRCxNQUFNLFdBQVcsR0FDYixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRTVFLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDeEIsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXJFLE9BQU8sV0FBVyxDQUFDO0FBQ3JCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBaUI7SUFDN0MsVUFBVSxFQUFFLFdBQVc7SUFDdkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFdBQStCO0NBQzVDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBlbnYsIEZ1c2VkQ29udjJELCBGdXNlZENvbnYyREF0dHJzLCBGdXNlZENvbnYyRElucHV0cywgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDb252MkRQcm9ncmFtfSBmcm9tICcuLi9jb252X2dwdSc7XG5pbXBvcnQge0NvbnYyRFBhY2tlZFByb2dyYW19IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdSc7XG5pbXBvcnQge21hcEFjdGl2YXRpb25Ub1NoYWRlclByb2dyYW19IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5pbXBvcnQge2NvbnYyZEJ5TWF0TXVsLCBjb252MmRXaXRoSW0yUm93fSBmcm9tICcuL0NvbnYyRF9pbXBsJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkQ29udjJkKGFyZ3M6IHtcbiAgaW5wdXRzOiBGdXNlZENvbnYyRElucHV0cyxcbiAgYXR0cnM6IEZ1c2VkQ29udjJEQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtcbiAgICBzdHJpZGVzLFxuICAgIHBhZCxcbiAgICBkYXRhRm9ybWF0LFxuICAgIGRpbGF0aW9ucyxcbiAgICBkaW1Sb3VuZGluZ01vZGUsXG4gICAgYWN0aXZhdGlvbixcbiAgICBsZWFreXJlbHVBbHBoYVxuICB9ID0gYXR0cnM7XG5cbiAgY29uc3QgJGRhdGFGb3JtYXQgPSBiYWNrZW5kX3V0aWwuY29udmVydENvbnYyRERhdGFGb3JtYXQoZGF0YUZvcm1hdCk7XG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVDb252MkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGZpbHRlci5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgc3RyaWRlcywgZGlsYXRpb25zLCBwYWQsXG4gICAgICBkaW1Sb3VuZGluZ01vZGUsIGZhbHNlIC8qIGRlcHRod2lzZSAqLywgJGRhdGFGb3JtYXQpO1xuICBsZXQgb3V0OiBUZW5zb3JJbmZvO1xuICBjb25zdCBpbnRlcm1lZGlhdGVzOiBUZW5zb3JJbmZvW10gPSBbXTtcblxuICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuXG4gIGNvbnN0IHByZXBhcmVJbnB1dHMgPSAoKTogVGVuc29ySW5mb1tdID0+IHtcbiAgICBjb25zdCBpbnB1dHM6IFRlbnNvckluZm9bXSA9IFt4LCBmaWx0ZXJdO1xuXG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgMS1EIHRlbnNvciwgYWxpZ24gaXQgd2l0aCB0aGUgY2hhbm5lbHMuXG4gICAgLy9cbiAgICAvLyBGb3IgZnVzZWRDb252MmQsIHRoZSBpbnB1dHMgKHgsIFcsIGJpYXMsIHByZWx1QWN0aXZhdGlvbldlaWdodHMpIGFyZVxuICAgIC8vIHN1cHBvc2VkIHRvIGJlIGFsaWduZWQgd2l0aCB0aGUgZGF0YUZvcm1hdC4gVGhlIDQtRCB0ZW5zb3IgaW5wdXRzIG9yXG4gICAgLy8gc2NhbGFyIGlucHV0cyBhcmUgb3JpZ2luYWxseSBhbGlnbmVkLCBidXQgdGhlIDEtRCB0ZW5zb3IgaW5wdXRzIGFyZVxuICAgIC8vIHN1cHBvc2VkIHRvIGJlIGFsaWduZWQgd2l0aCB0aGUgY2hhbm5lbHMgKG9ubHkgYmlhcyBhbmQgUFJlTFUgYWN0aXZhdGlvblxuICAgIC8vIHdlaWdodHMgY291bGQgYmUgYSAxLUQgdGVuc29yKS5cbiAgICBjb25zdCBhbGlnbklucHV0V2l0aERhdGFGb3JtYXQgPVxuICAgICAgICAoaW5wdXQ6IFRlbnNvckluZm8sIGRhdGFGb3JtYXQ6ICdOSFdDJ3wnTkNIVycpOiBUZW5zb3JJbmZvID0+IHtcbiAgICAgICAgICBpZiAoZGF0YUZvcm1hdCA9PT0gJ05DSFcnICYmIGlucHV0LnNoYXBlLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgICBpbnB1dC5zaGFwZVswXSAhPT0gMSkge1xuICAgICAgICAgICAgY29uc3QgYWxpZ25lZElucHV0ID0gcmVzaGFwZSh7XG4gICAgICAgICAgICAgIGlucHV0czoge3g6IGlucHV0fSxcbiAgICAgICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICAgICAgYXR0cnM6IHtzaGFwZTogW2lucHV0LnNoYXBlWzBdLCAxLCAxXX1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKGFsaWduZWRJbnB1dCk7XG4gICAgICAgICAgICByZXR1cm4gYWxpZ25lZElucHV0O1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaW5wdXQ7XG4gICAgICAgIH07XG5cbiAgICBpZiAoaGFzQmlhcykge1xuICAgICAgaW5wdXRzLnB1c2goYWxpZ25JbnB1dFdpdGhEYXRhRm9ybWF0KGJpYXMsIGRhdGFGb3JtYXQpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cykge1xuICAgICAgaW5wdXRzLnB1c2goYWxpZ25JbnB1dFdpdGhEYXRhRm9ybWF0KHByZWx1QWN0aXZhdGlvbldlaWdodHMsIGRhdGFGb3JtYXQpKTtcbiAgICB9XG5cbiAgICBpZiAoaGFzTGVha3lyZWx1QWxwaGEpIHtcbiAgICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgW10sICdmbG9hdDMyJyxcbiAgICAgICAgICB1dGlsLmNyZWF0ZVNjYWxhclZhbHVlKGxlYWt5cmVsdUFscGhhIGFzIHt9IGFzICdmbG9hdDMyJywgJ2Zsb2F0MzInKSk7XG4gICAgICBpbnB1dHMucHVzaCgkbGVha3lyZWx1QWxwaGEpO1xuICAgICAgaW50ZXJtZWRpYXRlcy5wdXNoKCRsZWFreXJlbHVBbHBoYSk7XG4gICAgfVxuICAgIHJldHVybiBpbnB1dHM7XG4gIH07XG5cbiAgaWYgKGNvbnZJbmZvLmZpbHRlckhlaWdodCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJlxuICAgICAgY29udkluZm8uZGlsYXRpb25IZWlnaHQgPT09IDEgJiYgY29udkluZm8uZGlsYXRpb25XaWR0aCA9PT0gMSAmJlxuICAgICAgY29udkluZm8uc3RyaWRlSGVpZ2h0ID09PSAxICYmIGNvbnZJbmZvLnN0cmlkZVdpZHRoID09PSAxICYmXG4gICAgICAoY29udkluZm8ucGFkSW5mby50eXBlID09PSAnU0FNRScgfHwgY29udkluZm8ucGFkSW5mby50eXBlID09PSAnVkFMSUQnKSkge1xuICAgIG91dCA9IGNvbnYyZEJ5TWF0TXVsKHtcbiAgICAgIHgsXG4gICAgICBmaWx0ZXIsXG4gICAgICBjb252SW5mbyxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBiaWFzLFxuICAgICAgYWN0aXZhdGlvbixcbiAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH0pO1xuICB9IGVsc2UgaWYgKGNvbnZJbmZvLnN0cmlkZVdpZHRoIDw9IDIgJiYgJGRhdGFGb3JtYXQgPT09ICdjaGFubmVsc0xhc3QnXG4gICAgJiYgZW52KCkuZ2V0Qm9vbCgnV0VCR0xfRVhQX0NPTlYnKVxuICAgICkge1xuICAgICAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID1cbiAgICAgICAgICBhY3RpdmF0aW9uID8gbWFwQWN0aXZhdGlvblRvU2hhZGVyUHJvZ3JhbShhY3RpdmF0aW9uLCB0cnVlKSA6IG51bGw7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252MkRQYWNrZWRQcm9ncmFtKFxuICAgICAgY29udkluZm8sIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgIGhhc0xlYWt5cmVsdUFscGhhKTtcbiAgICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbXG4gICAgICBbY29udkluZm8ucGFkSW5mby50b3AsIGNvbnZJbmZvLnBhZEluZm8ubGVmdF0sXG4gICAgICBbY29udkluZm8uc3RyaWRlSGVpZ2h0LCBjb252SW5mby5zdHJpZGVXaWR0aF0sXG4gICAgICBbY29udkluZm8uZGlsYXRpb25IZWlnaHQsIGNvbnZJbmZvLmRpbGF0aW9uV2lkdGhdLFxuICAgICAgW2NvbnZJbmZvLmluSGVpZ2h0LCBjb252SW5mby5pbldpZHRoXVxuICAgIF07XG4gICAgY29uc3QgaW5wdXRzID0gcHJlcGFyZUlucHV0cygpO1xuICAgIG91dCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIGlucHV0cywgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuICB9IGVsc2UgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX0NPTlZfSU0yQ09MJykpIHtcbiAgICBvdXQgPSBjb252MmRXaXRoSW0yUm93KHtcbiAgICAgIHgsXG4gICAgICBmaWx0ZXIsXG4gICAgICBjb252SW5mbyxcbiAgICAgIGJhY2tlbmQsXG4gICAgICBiaWFzLFxuICAgICAgYWN0aXZhdGlvbixcbiAgICAgIHByZWx1QWN0aXZhdGlvbldlaWdodHMsXG4gICAgICBsZWFreXJlbHVBbHBoYVxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IGZ1c2VkQWN0aXZhdGlvbiA9XG4gICAgICAgIGFjdGl2YXRpb24gPyBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIGZhbHNlKSA6IG51bGw7XG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBDb252MkRQcm9ncmFtKFxuICAgICAgICBjb252SW5mbywgaGFzQmlhcywgZnVzZWRBY3RpdmF0aW9uLCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzLFxuICAgICAgICBoYXNMZWFreXJlbHVBbHBoYSk7XG5cbiAgICBjb25zdCBpbnB1dHMgPSBwcmVwYXJlSW5wdXRzKCk7XG4gICAgb3V0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnZmxvYXQzMicpO1xuICB9XG5cbiAgY29uc3Qgb3V0UmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogb3V0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogY29udkluZm8ub3V0U2hhcGV9fSk7XG5cbiAgaW50ZXJtZWRpYXRlcy5wdXNoKG91dCk7XG4gIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiBvdXRSZXNoYXBlZDtcbn1cblxuZXhwb3J0IGNvbnN0IGZ1c2VkQ29udjJEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEZ1c2VkQ29udjJELFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogZnVzZWRDb252MmQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, env, FusedDepthwiseConv2D, util } from '@tensorflow/tfjs-core';\nimport { DepthwiseConv2DProgram } from '../conv_gpu_depthwise';\nimport { DepthwiseConvPacked2DProgram } from '../conv_packed_gpu_depthwise';\nimport { mapActivationToShaderProgram } from '../kernel_utils/kernel_funcs_utils';\nexport function fusedDepthwiseConv2D(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, filter, bias, preluActivationWeights } = inputs;\n    const { strides, pad, dilations, dimRoundingMode, activation, leakyreluAlpha } = attrs;\n    const intermediates = [];\n    let $dilations = dilations;\n    if ($dilations == null) {\n        $dilations = [1, 1];\n    }\n    util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, $dilations), () => 'Error in depthwiseConv2d: Either strides or dilations must be ' +\n        `1. Got strides ${strides} and dilations '${$dilations}'`);\n    const convInfo = backend_util.computeConv2DInfo(x.shape, filter.shape, strides, $dilations, pad, dimRoundingMode, true /* depthwise */);\n    const shouldPackDepthwiseConv = env().getBool('WEBGL_PACK_DEPTHWISECONV') &&\n        convInfo.strideWidth <= 2 &&\n        convInfo.outChannels / convInfo.inChannels === 1;\n    const fusedActivation = activation ?\n        mapActivationToShaderProgram(activation, shouldPackDepthwiseConv) :\n        null;\n    const programInputs = [x, filter];\n    const hasBias = bias != null;\n    const hasPreluActivationWeights = preluActivationWeights != null;\n    const hasLeakyreluAlpha = activation === 'leakyrelu';\n    if (hasBias) {\n        programInputs.push(bias);\n    }\n    if (hasPreluActivationWeights) {\n        programInputs.push(preluActivationWeights);\n    }\n    if (hasLeakyreluAlpha) {\n        const $leakyreluAlpha = backend.makeTensorInfo([], 'float32', util.createScalarValue(leakyreluAlpha, 'float32'));\n        programInputs.push($leakyreluAlpha);\n        intermediates.push($leakyreluAlpha);\n    }\n    let program;\n    if (shouldPackDepthwiseConv) {\n        program = new DepthwiseConvPacked2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n    }\n    else {\n        program = new DepthwiseConv2DProgram(convInfo, hasBias, fusedActivation, hasPreluActivationWeights, hasLeakyreluAlpha);\n    }\n    const customValues = [\n        [convInfo.padInfo.top, convInfo.padInfo.left],\n        [convInfo.strideHeight, convInfo.strideWidth],\n        [convInfo.dilationHeight, convInfo.dilationWidth],\n        [convInfo.inHeight, convInfo.inWidth]\n    ];\n    const result = backend.runWebGLProgram(program, programInputs, 'float32', customValues);\n    intermediates.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return result;\n}\nexport const fusedDepthwiseConv2DConfig = {\n    kernelName: FusedDepthwiseConv2D,\n    backendName: 'webgl',\n    kernelFunc: fusedDepthwiseConv2D,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRnVzZWREZXB0aHdpc2VDb252MkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvRnVzZWREZXB0aHdpc2VDb252MkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxHQUFHLEVBQUUsb0JBQW9CLEVBQStGLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pMLE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDhCQUE4QixDQUFDO0FBQzFFLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRWhGLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxJQUlwQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsc0JBQXNCLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDekQsTUFBTSxFQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFDLEdBQ3hFLEtBQUssQ0FBQztJQUVWLE1BQU0sYUFBYSxHQUFpQixFQUFFLENBQUM7SUFFdkMsSUFBSSxVQUFVLEdBQUcsU0FBUyxDQUFDO0lBQzNCLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtRQUN0QixVQUFVLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7S0FDckI7SUFFRCxJQUFJLENBQUMsTUFBTSxDQUNQLFlBQVksQ0FBQyw4QkFBOEIsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLEVBQ2hFLEdBQUcsRUFBRSxDQUFDLGdFQUFnRTtRQUNsRSxrQkFBa0IsT0FBTyxtQkFBbUIsVUFBVSxHQUFHLENBQUMsQ0FBQztJQUVuRSxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUF5QyxFQUMzQyxNQUFNLENBQUMsS0FBeUMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUNyRSxHQUFHLEVBQUUsZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUVoRCxNQUFNLHVCQUF1QixHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQywwQkFBMEIsQ0FBQztRQUNyRSxRQUFRLENBQUMsV0FBVyxJQUFJLENBQUM7UUFDekIsUUFBUSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsVUFBVSxLQUFLLENBQUMsQ0FBQztJQUNyRCxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsQ0FBQztRQUNoQyw0QkFBNEIsQ0FBQyxVQUFVLEVBQUUsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQztJQUNULE1BQU0sYUFBYSxHQUFpQixDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUVoRCxNQUFNLE9BQU8sR0FBRyxJQUFJLElBQUksSUFBSSxDQUFDO0lBQzdCLE1BQU0seUJBQXlCLEdBQUcsc0JBQXNCLElBQUksSUFBSSxDQUFDO0lBQ2pFLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxLQUFLLFdBQVcsQ0FBQztJQUVyRCxJQUFJLE9BQU8sRUFBRTtRQUNYLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7S0FDMUI7SUFDRCxJQUFJLHlCQUF5QixFQUFFO1FBQzdCLGFBQWEsQ0FBQyxJQUFJLENBQUMsc0JBQXNCLENBQUMsQ0FBQztLQUM1QztJQUNELElBQUksaUJBQWlCLEVBQUU7UUFDckIsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDMUMsRUFBRSxFQUFFLFNBQVMsRUFDYixJQUFJLENBQUMsaUJBQWlCLENBQUMsY0FBaUMsRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDO1FBQzFFLGFBQWEsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDcEMsYUFBYSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztLQUNyQztJQUVELElBQUksT0FBNEQsQ0FBQztJQUNqRSxJQUFJLHVCQUF1QixFQUFFO1FBQzNCLE9BQU8sR0FBRyxJQUFJLDRCQUE0QixDQUN0QyxRQUFRLEVBQUUsT0FBTyxFQUFFLGVBQWUsRUFBRSx5QkFBeUIsRUFDN0QsaUJBQWlCLENBQUMsQ0FBQztLQUN4QjtTQUFNO1FBQ0wsT0FBTyxHQUFHLElBQUksc0JBQXNCLENBQ2hDLFFBQVEsRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLHlCQUF5QixFQUM3RCxpQkFBaUIsQ0FBQyxDQUFDO0tBQ3hCO0lBQ0QsTUFBTSxZQUFZLEdBQUc7UUFDbkIsQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM3QyxDQUFDLFFBQVEsQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUM3QyxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsUUFBUSxDQUFDLGFBQWEsQ0FBQztRQUNqRCxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQztLQUN0QyxDQUFDO0lBQ0YsTUFBTSxNQUFNLEdBQ1IsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsYUFBYSxFQUFFLFNBQVMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUU3RSxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFckUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLDBCQUEwQixHQUFpQjtJQUN0RCxVQUFVLEVBQUUsb0JBQW9CO0lBQ2hDLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxvQkFBd0M7Q0FDckQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIGVudiwgRnVzZWREZXB0aHdpc2VDb252MkQsIEZ1c2VkRGVwdGh3aXNlQ29udjJEQXR0cnMsIEZ1c2VkRGVwdGh3aXNlQ29udjJESW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnYyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfZ3B1X2RlcHRod2lzZSc7XG5pbXBvcnQge0RlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW19IGZyb20gJy4uL2NvbnZfcGFja2VkX2dwdV9kZXB0aHdpc2UnO1xuaW1wb3J0IHttYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGZ1c2VkRGVwdGh3aXNlQ29udjJEKGFyZ3M6IHtcbiAgaW5wdXRzOiBGdXNlZERlcHRod2lzZUNvbnYyRElucHV0cyxcbiAgYXR0cnM6IEZ1c2VkRGVwdGh3aXNlQ29udjJEQXR0cnMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0xcbn0pIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3gsIGZpbHRlciwgYmlhcywgcHJlbHVBY3RpdmF0aW9uV2VpZ2h0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzdHJpZGVzLCBwYWQsIGRpbGF0aW9ucywgZGltUm91bmRpbmdNb2RlLCBhY3RpdmF0aW9uLCBsZWFreXJlbHVBbHBoYX0gPVxuICAgICAgYXR0cnM7XG5cbiAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgbGV0ICRkaWxhdGlvbnMgPSBkaWxhdGlvbnM7XG4gIGlmICgkZGlsYXRpb25zID09IG51bGwpIHtcbiAgICAkZGlsYXRpb25zID0gWzEsIDFdO1xuICB9XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsICRkaWxhdGlvbnMpLFxuICAgICAgKCkgPT4gJ0Vycm9yIGluIGRlcHRod2lzZUNvbnYyZDogRWl0aGVyIHN0cmlkZXMgb3IgZGlsYXRpb25zIG11c3QgYmUgJyArXG4gICAgICAgICAgYDEuIEdvdCBzdHJpZGVzICR7c3RyaWRlc30gYW5kIGRpbGF0aW9ucyAnJHskZGlsYXRpb25zfSdgKTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlQ29udjJESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWx0ZXIuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIHN0cmlkZXMsICRkaWxhdGlvbnMsXG4gICAgICBwYWQsIGRpbVJvdW5kaW5nTW9kZSwgdHJ1ZSAvKiBkZXB0aHdpc2UgKi8pO1xuXG4gIGNvbnN0IHNob3VsZFBhY2tEZXB0aHdpc2VDb252ID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19ERVBUSFdJU0VDT05WJykgJiZcbiAgICAgIGNvbnZJbmZvLnN0cmlkZVdpZHRoIDw9IDIgJiZcbiAgICAgIGNvbnZJbmZvLm91dENoYW5uZWxzIC8gY29udkluZm8uaW5DaGFubmVscyA9PT0gMTtcbiAgY29uc3QgZnVzZWRBY3RpdmF0aW9uID0gYWN0aXZhdGlvbiA/XG4gICAgICBtYXBBY3RpdmF0aW9uVG9TaGFkZXJQcm9ncmFtKGFjdGl2YXRpb24sIHNob3VsZFBhY2tEZXB0aHdpc2VDb252KSA6XG4gICAgICBudWxsO1xuICBjb25zdCBwcm9ncmFtSW5wdXRzOiBUZW5zb3JJbmZvW10gPSBbeCwgZmlsdGVyXTtcblxuICBjb25zdCBoYXNCaWFzID0gYmlhcyAhPSBudWxsO1xuICBjb25zdCBoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzID0gcHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyAhPSBudWxsO1xuICBjb25zdCBoYXNMZWFreXJlbHVBbHBoYSA9IGFjdGl2YXRpb24gPT09ICdsZWFreXJlbHUnO1xuXG4gIGlmIChoYXNCaWFzKSB7XG4gICAgcHJvZ3JhbUlucHV0cy5wdXNoKGJpYXMpO1xuICB9XG4gIGlmIChoYXNQcmVsdUFjdGl2YXRpb25XZWlnaHRzKSB7XG4gICAgcHJvZ3JhbUlucHV0cy5wdXNoKHByZWx1QWN0aXZhdGlvbldlaWdodHMpO1xuICB9XG4gIGlmIChoYXNMZWFreXJlbHVBbHBoYSkge1xuICAgIGNvbnN0ICRsZWFreXJlbHVBbHBoYSA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtdLCAnZmxvYXQzMicsXG4gICAgICAgIHV0aWwuY3JlYXRlU2NhbGFyVmFsdWUobGVha3lyZWx1QWxwaGEgYXMge30gYXMgJ2Zsb2F0MzInLCAnZmxvYXQzMicpKTtcbiAgICBwcm9ncmFtSW5wdXRzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgICBpbnRlcm1lZGlhdGVzLnB1c2goJGxlYWt5cmVsdUFscGhhKTtcbiAgfVxuXG4gIGxldCBwcm9ncmFtOiBEZXB0aHdpc2VDb252MkRQcm9ncmFtfERlcHRod2lzZUNvbnZQYWNrZWQyRFByb2dyYW07XG4gIGlmIChzaG91bGRQYWNrRGVwdGh3aXNlQ29udikge1xuICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udlBhY2tlZDJEUHJvZ3JhbShcbiAgICAgICAgY29udkluZm8sIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgICAgaGFzTGVha3lyZWx1QWxwaGEpO1xuICB9IGVsc2Uge1xuICAgIHByb2dyYW0gPSBuZXcgRGVwdGh3aXNlQ29udjJEUHJvZ3JhbShcbiAgICAgICAgY29udkluZm8sIGhhc0JpYXMsIGZ1c2VkQWN0aXZhdGlvbiwgaGFzUHJlbHVBY3RpdmF0aW9uV2VpZ2h0cyxcbiAgICAgICAgaGFzTGVha3lyZWx1QWxwaGEpO1xuICB9XG4gIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtcbiAgICBbY29udkluZm8ucGFkSW5mby50b3AsIGNvbnZJbmZvLnBhZEluZm8ubGVmdF0sXG4gICAgW2NvbnZJbmZvLnN0cmlkZUhlaWdodCwgY29udkluZm8uc3RyaWRlV2lkdGhdLFxuICAgIFtjb252SW5mby5kaWxhdGlvbkhlaWdodCwgY29udkluZm8uZGlsYXRpb25XaWR0aF0sXG4gICAgW2NvbnZJbmZvLmluSGVpZ2h0LCBjb252SW5mby5pbldpZHRoXVxuICBdO1xuICBjb25zdCByZXN1bHQgPVxuICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgcHJvZ3JhbUlucHV0cywgJ2Zsb2F0MzInLCBjdXN0b21WYWx1ZXMpO1xuXG4gIGludGVybWVkaWF0ZXMuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBGdXNlZERlcHRod2lzZUNvbnYyRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGZ1c2VkRGVwdGh3aXNlQ29udjJEIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","import { getCoordsDataType } from './shader_compiler';\nexport class GatherNDProgram {\n    constructor(sliceDim, strides, shape, paramsShape) {\n        this.sliceDim = sliceDim;\n        this.strides = strides;\n        this.paramsShape = paramsShape;\n        this.variableNames = ['x', 'indices'];\n        this.outputShape = shape;\n        const dtype = getCoordsDataType(shape.length);\n        let mainLoop = `\n    int index;`;\n        for (let j = 0; j < this.sliceDim; j++) {\n            mainLoop += `\n          index = round(getIndices(coords[0], ${j}));\n          out_of_bounds = out_of_bounds || index < 0;\n          out_of_bounds = out_of_bounds || index >= ${this.paramsShape[j]};\n          flattenIndex += index * ${this.strides[j]};`;\n        }\n        this.userCode = `\n         void main() {\n          ${dtype} coords = getOutputCoords();\n          int flattenIndex = 0;\n          bool out_of_bounds = false;\n\n          ${mainLoop}\n\n          setOutput(out_of_bounds ? 0.0 : getX(flattenIndex, coords[1]));\n        }\n      `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyX25kX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ2F0aGVyX25kX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFpQkEsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFFcEQsTUFBTSxPQUFPLGVBQWU7SUFJMUIsWUFDWSxRQUFnQixFQUFVLE9BQWlCLEVBQUUsS0FBZSxFQUM1RCxXQUFxQjtRQURyQixhQUFRLEdBQVIsUUFBUSxDQUFRO1FBQVUsWUFBTyxHQUFQLE9BQU8sQ0FBVTtRQUMzQyxnQkFBVyxHQUFYLFdBQVcsQ0FBVTtRQUxqQyxrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBTS9CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5QyxJQUFJLFFBQVEsR0FBRztlQUNKLENBQUM7UUFDWixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUN0QyxRQUFRLElBQUk7Z0RBQzhCLENBQUM7O3NEQUVLLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO29DQUNyQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7U0FDbEQ7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOztZQUVSLEtBQUs7Ozs7WUFJTCxRQUFROzs7O09BSWIsQ0FBQztJQUNOLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgR2F0aGVyTkRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCcsICdpbmRpY2VzJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY29uc3RydWN0b3IoXG4gICAgICBwcml2YXRlIHNsaWNlRGltOiBudW1iZXIsIHByaXZhdGUgc3RyaWRlczogbnVtYmVyW10sIHNoYXBlOiBudW1iZXJbXSxcbiAgICAgIHByaXZhdGUgcGFyYW1zU2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2hhcGUubGVuZ3RoKTtcblxuICAgIGxldCBtYWluTG9vcCA9IGBcbiAgICBpbnQgaW5kZXg7YDtcbiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuc2xpY2VEaW07IGorKykge1xuICAgICAgbWFpbkxvb3AgKz0gYFxuICAgICAgICAgIGluZGV4ID0gcm91bmQoZ2V0SW5kaWNlcyhjb29yZHNbMF0sICR7an0pKTtcbiAgICAgICAgICBvdXRfb2ZfYm91bmRzID0gb3V0X29mX2JvdW5kcyB8fCBpbmRleCA8IDA7XG4gICAgICAgICAgb3V0X29mX2JvdW5kcyA9IG91dF9vZl9ib3VuZHMgfHwgaW5kZXggPj0gJHt0aGlzLnBhcmFtc1NoYXBlW2pdfTtcbiAgICAgICAgICBmbGF0dGVuSW5kZXggKz0gaW5kZXggKiAke3RoaXMuc3RyaWRlc1tqXX07YDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgICR7ZHR5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCBmbGF0dGVuSW5kZXggPSAwO1xuICAgICAgICAgIGJvb2wgb3V0X29mX2JvdW5kcyA9IGZhbHNlO1xuXG4gICAgICAgICAgJHttYWluTG9vcH1cblxuICAgICAgICAgIHNldE91dHB1dChvdXRfb2ZfYm91bmRzID8gMC4wIDogZ2V0WChmbGF0dGVuSW5kZXgsIGNvb3Jkc1sxXSkpO1xuICAgICAgICB9XG4gICAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, GatherNd, util } from '@tensorflow/tfjs-core';\nimport { GatherNDProgram } from '../gather_nd_gpu';\nimport { gatherNdImplCPU } from '../kernel_utils/shared';\nimport { reshape } from './Reshape';\nexport function gatherNd(args) {\n    const { inputs, backend } = args;\n    const { params, indices } = inputs;\n    const indicesShape = indices.shape;\n    const sliceRank = indicesShape[indicesShape.length - 1];\n    const paramsSize = util.sizeFromShape(params.shape);\n    const [resultShape, numSlices, sliceSize, strides] = backend_util.prepareAndValidate(params, indices);\n    const flattenIndices = reshape({ inputs: { x: indices }, backend, attrs: { shape: [numSlices, sliceRank] } });\n    const flattenX = reshape({\n        inputs: { x: params },\n        backend,\n        attrs: { shape: [(util.sizeFromShape(params.shape) / sliceSize), sliceSize] }\n    });\n    if (backend.shouldExecuteOnCPU([params, indices]) ||\n        params.dtype === 'string') {\n        const indicesData = backend.readSync(indices.dataId);\n        const paramsBuf = backend.bufferSync(params);\n        const outValue = gatherNdImplCPU(indicesData, paramsBuf, params.dtype, numSlices, sliceRank, sliceSize, strides, params.shape, paramsSize);\n        return backend.makeTensorInfo(resultShape, params.dtype, outValue.values);\n    }\n    const program = new GatherNDProgram(sliceRank, strides, [numSlices, sliceSize], params.shape);\n    const res = backend.runWebGLProgram(program, [flattenX, flattenIndices], flattenX.dtype);\n    const reshaped = reshape({ inputs: { x: res }, backend, attrs: { shape: resultShape } });\n    backend.disposeIntermediateTensorInfo(flattenIndices);\n    backend.disposeIntermediateTensorInfo(flattenX);\n    backend.disposeIntermediateTensorInfo(res);\n    return reshaped;\n}\nexport const gatherNdConfig = {\n    kernelName: GatherNd,\n    backendName: 'webgl',\n    kernelFunc: gatherNd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyTmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvR2F0aGVyTmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxRQUFRLEVBQTBFLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzNJLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNqRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFdkQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsUUFBUSxDQUNwQixJQUF5RDtJQUMzRCxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUVqQyxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDO0lBQ25DLE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQ3hELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXBELE1BQU0sQ0FBQyxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsR0FDOUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUVyRCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQzFCLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxTQUFTLEVBQUUsU0FBUyxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUM7UUFDbkIsT0FBTztRQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsU0FBUyxDQUFDLEVBQUUsU0FBUyxDQUFDLEVBQUM7S0FDNUUsQ0FBQyxDQUFDO0lBRUgsSUFBSSxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDN0IsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFlLENBQUM7UUFDbkUsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBa0IsTUFBTSxDQUFDLENBQUM7UUFDOUQsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUM1QixXQUFXLEVBQUUsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQ3JFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBRXZDLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDM0U7SUFDRCxNQUFNLE9BQU8sR0FDVCxJQUFJLGVBQWUsQ0FBQyxTQUFTLEVBQUUsT0FBTyxFQUFFLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxFQUM1RCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEIsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FDL0IsT0FBTyxFQUFFLENBQUMsUUFBUSxFQUFFLGNBQWMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV6RCxNQUFNLFFBQVEsR0FDVixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsR0FBRyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFdEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQ3RELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFM0MsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBaUI7SUFDMUMsVUFBVSxFQUFFLFFBQVE7SUFDcEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFFBQTRCO0NBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBHYXRoZXJOZCwgR2F0aGVyTmRJbnB1dHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFuaywgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7R2F0aGVyTkRQcm9ncmFtfSBmcm9tICcuLi9nYXRoZXJfbmRfZ3B1JztcbmltcG9ydCB7Z2F0aGVyTmRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2F0aGVyTmQoXG4gICAgYXJnczoge2lucHV0czogR2F0aGVyTmRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtcywgaW5kaWNlc30gPSBpbnB1dHM7XG5cbiAgY29uc3QgaW5kaWNlc1NoYXBlID0gaW5kaWNlcy5zaGFwZTtcbiAgY29uc3Qgc2xpY2VSYW5rID0gaW5kaWNlc1NoYXBlW2luZGljZXNTaGFwZS5sZW5ndGggLSAxXTtcbiAgY29uc3QgcGFyYW1zU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShwYXJhbXMuc2hhcGUpO1xuXG4gIGNvbnN0IFtyZXN1bHRTaGFwZSwgbnVtU2xpY2VzLCBzbGljZVNpemUsIHN0cmlkZXNdID1cbiAgICAgIGJhY2tlbmRfdXRpbC5wcmVwYXJlQW5kVmFsaWRhdGUocGFyYW1zLCBpbmRpY2VzKTtcblxuICBjb25zdCBmbGF0dGVuSW5kaWNlcyA9IHJlc2hhcGUoXG4gICAgICB7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFtudW1TbGljZXMsIHNsaWNlUmFua119fSk7XG4gIGNvbnN0IGZsYXR0ZW5YID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogcGFyYW1zfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7c2hhcGU6IFsodXRpbC5zaXplRnJvbVNoYXBlKHBhcmFtcy5zaGFwZSkgLyBzbGljZVNpemUpLCBzbGljZVNpemVdfVxuICB9KTtcblxuICBpZiAoYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3BhcmFtcywgaW5kaWNlc10pIHx8XG4gICAgICBwYXJhbXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgaW5kaWNlc0RhdGEgPSBiYWNrZW5kLnJlYWRTeW5jKGluZGljZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICAgIGNvbnN0IHBhcmFtc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnZmxvYXQzMic+KHBhcmFtcyk7XG4gICAgY29uc3Qgb3V0VmFsdWUgPSBnYXRoZXJOZEltcGxDUFUoXG4gICAgICAgIGluZGljZXNEYXRhLCBwYXJhbXNCdWYsIHBhcmFtcy5kdHlwZSwgbnVtU2xpY2VzLCBzbGljZVJhbmssIHNsaWNlU2l6ZSxcbiAgICAgICAgc3RyaWRlcywgcGFyYW1zLnNoYXBlLCBwYXJhbXNTaXplKTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKHJlc3VsdFNoYXBlLCBwYXJhbXMuZHR5cGUsIG91dFZhbHVlLnZhbHVlcyk7XG4gIH1cbiAgY29uc3QgcHJvZ3JhbSA9XG4gICAgICBuZXcgR2F0aGVyTkRQcm9ncmFtKHNsaWNlUmFuaywgc3RyaWRlcywgW251bVNsaWNlcywgc2xpY2VTaXplXSwgXG4gICAgICAgIHBhcmFtcy5zaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kaWNlc10sIGZsYXR0ZW5YLmR0eXBlKTtcblxuICBjb25zdCByZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiByZXN1bHRTaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRpY2VzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzKTtcblxuICByZXR1cm4gcmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBnYXRoZXJOZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBHYXRoZXJOZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGdhdGhlck5kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class GatherProgram {\n    constructor(aShape, outputShape) {\n        this.variableNames = ['A', 'indices'];\n        this.outputShape = outputShape;\n        this.rank = outputShape.length;\n        const dtype = getCoordsDataType(this.rank);\n        const sourceCoords = getSourceCoords(aShape, 2);\n        this.userCode = `\n      void main() {\n        ${dtype} resRC = getOutputCoords();\n        int index = int(getIndices(resRC.x, resRC.z));\n        float inBounds = (index >= 0) && (index < ${aShape[2]}) ? 1.0 : 0.0;\n        setOutput(inBounds * getA(${sourceCoords}));\n      }\n    `;\n    }\n}\n// The input and output are always flattened into rank 4 tensors.\nfunction getSourceCoords(aShape, axis) {\n    const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w'];\n    const sourceCoords = [];\n    for (let i = 0; i < aShape.length; i++) {\n        if (i === 2) {\n            sourceCoords.push('index');\n        }\n        else {\n            sourceCoords.push(`${currentCoords[i]}`);\n        }\n    }\n    return sourceCoords.join();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2F0aGVyX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvZ2F0aGVyX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUlwRCxNQUFNLE9BQU8sYUFBYTtJQU14QixZQUFZLE1BQW1CLEVBQUUsV0FBd0I7UUFMekQsa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQU0vQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFaEQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixLQUFLOztvREFFcUMsTUFBTSxDQUFDLENBQUMsQ0FBQztvQ0FDekIsWUFBWTs7S0FFM0MsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELGlFQUFpRTtBQUNqRSxTQUFTLGVBQWUsQ0FBQyxNQUFtQixFQUFFLElBQVk7SUFDeEQsTUFBTSxhQUFhLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVuRSxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7SUFDeEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDdEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1gsWUFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztTQUM1QjthQUFNO1lBQ0wsWUFBWSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7U0FDMUM7S0FDRjtJQUNELE9BQU8sWUFBWSxDQUFDLElBQUksRUFBRSxDQUFDO0FBQzdCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgdHlwZSBHYXRoZXJTaGFwZSA9IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdO1xuXG5leHBvcnQgY2xhc3MgR2F0aGVyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IEdhdGhlclNoYXBlLCBvdXRwdXRTaGFwZTogR2F0aGVyU2hhcGUpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gb3V0cHV0U2hhcGU7XG4gICAgdGhpcy5yYW5rID0gb3V0cHV0U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUodGhpcy5yYW5rKTtcbiAgICBjb25zdCBzb3VyY2VDb29yZHMgPSBnZXRTb3VyY2VDb29yZHMoYVNoYXBlLCAyKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IHJlc1JDID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBpbmRleCA9IGludChnZXRJbmRpY2VzKHJlc1JDLngsIHJlc1JDLnopKTtcbiAgICAgICAgZmxvYXQgaW5Cb3VuZHMgPSAoaW5kZXggPj0gMCkgJiYgKGluZGV4IDwgJHthU2hhcGVbMl19KSA/IDEuMCA6IDAuMDtcbiAgICAgICAgc2V0T3V0cHV0KGluQm91bmRzICogZ2V0QSgke3NvdXJjZUNvb3Jkc30pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbi8vIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGFyZSBhbHdheXMgZmxhdHRlbmVkIGludG8gcmFuayA0IHRlbnNvcnMuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHMoYVNoYXBlOiBHYXRoZXJTaGFwZSwgYXhpczogbnVtYmVyKTogc3RyaW5nIHtcbiAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudyddO1xuXG4gIGNvbnN0IHNvdXJjZUNvb3JkcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IGFTaGFwZS5sZW5ndGg7IGkrKykge1xuICAgIGlmIChpID09PSAyKSB7XG4gICAgICBzb3VyY2VDb29yZHMucHVzaCgnaW5kZXgnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlQ29vcmRzLnB1c2goYCR7Y3VycmVudENvb3Jkc1tpXX1gKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNvdXJjZUNvb3Jkcy5qb2luKCk7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, GatherV2, util, env } from '@tensorflow/tfjs-core';\nimport { GatherProgram } from '../gather_gpu';\nimport { gatherV2ImplCPU } from '../kernel_utils/shared';\nimport { reshape } from './Reshape';\nexport function gatherV2(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, indices } = inputs;\n    const { axis, batchDims } = attrs;\n    const parsedAxis = util.parseAxisParam(axis, x.shape)[0];\n    if (env().get('DEBUG')) {\n        // In debug mode, throw error when any index is out of bound.\n        // Otherwise, just fill out of bounds with zeroes.\n        const indicesVals = backend.readSync(indices.dataId);\n        const axisDim = x.shape[parsedAxis];\n        for (let i = 0; i < indicesVals.length; ++i) {\n            const index = indicesVals[i];\n            util.assert(index <= axisDim - 1 && index >= 0, () => `GatherV2: the index value ${index} is not in [0, ${axisDim - 1}]`);\n        }\n    }\n    const shapeInfo = backend_util.segment_util.collectGatherOpShapeInfo(x, indices, parsedAxis, batchDims);\n    const indicesSize = util.sizeFromShape(indices.shape);\n    const toDispose = [];\n    const flattenX = reshape({\n        inputs: { x },\n        backend,\n        attrs: {\n            shape: [\n                shapeInfo.batchSize, shapeInfo.outerSize, shapeInfo.dimSize,\n                shapeInfo.sliceSize\n            ]\n        }\n    });\n    const flattenIndex = reshape({\n        inputs: { x: indices },\n        backend,\n        attrs: { shape: [shapeInfo.batchSize, indicesSize / shapeInfo.batchSize] }\n    });\n    toDispose.push(flattenX);\n    toDispose.push(flattenIndex);\n    const flattenOutputShape = [\n        shapeInfo.batchSize, shapeInfo.outerSize, indicesSize / shapeInfo.batchSize,\n        shapeInfo.sliceSize\n    ];\n    if (backend.shouldExecuteOnCPU([x, indices]) || x.dtype === 'string') {\n        const indicesBuf = backend.bufferSync(flattenIndex);\n        const xBuf = backend.bufferSync(flattenX);\n        const outBuf = gatherV2ImplCPU(xBuf, indicesBuf, flattenOutputShape);\n        toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n        return backend.makeTensorInfo(shapeInfo.outputShape, outBuf.dtype, outBuf.values);\n    }\n    const program = new GatherProgram(flattenX.shape, flattenOutputShape);\n    const res = backend.runWebGLProgram(program, [flattenX, flattenIndex], flattenX.dtype);\n    toDispose.push(res);\n    const reshaped = reshape({ inputs: { x: res }, backend, attrs: { shape: shapeInfo.outputShape } });\n    toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return reshaped;\n}\nexport const gatherV2Config = {\n    kernelName: GatherV2,\n    backendName: 'webgl',\n    kernelFunc: gatherV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR2F0aGVyVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvR2F0aGVyVjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBRSxRQUFRLEVBQW1GLElBQUksRUFBRSxHQUFHLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd6SixPQUFPLEVBQUMsYUFBYSxFQUFjLE1BQU0sZUFBZSxDQUFDO0FBQ3pELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUV2RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxRQUFRLENBQUMsSUFJeEI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDNUIsTUFBTSxFQUFDLElBQUksRUFBRSxTQUFTLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFaEMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQUksR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ3RCLDZEQUE2RDtRQUM3RCxrREFBa0Q7UUFDbEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFlLENBQUM7UUFDbkUsTUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcs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RSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxXQUFXLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDeEUsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sUUFBUSxDQUFDO0FBQ2xCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgR2F0aGVyVjIsIEdhdGhlclYyQXR0cnMsIEdhdGhlclYySW5wdXRzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWwsIGVudn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7R2F0aGVyUHJvZ3JhbSwgR2F0aGVyU2hhcGV9IGZyb20gJy4uL2dhdGhlcl9ncHUnO1xuaW1wb3J0IHtnYXRoZXJWMkltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBnYXRoZXJWMihhcmdzOiB7XG4gIGlucHV0czogR2F0aGVyVjJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBHYXRoZXJWMkF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBpbmRpY2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGJhdGNoRGltc30gPSBhdHRycztcblxuICBjb25zdCBwYXJzZWRBeGlzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKVswXTtcbiAgaWYgKGVudigpLmdldCgnREVCVUcnKSkge1xuICAgIC8vIEluIGRlYnVnIG1vZGUsIHRocm93IGVycm9yIHdoZW4gYW55IGluZGV4IGlzIG91dCBvZiBib3VuZC5cbiAgICAvLyBPdGhlcndpc2UsIGp1c3QgZmlsbCBvdXQgb2YgYm91bmRzIHdpdGggemVyb2VzLlxuICAgIGNvbnN0IGluZGljZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBheGlzRGltID0geC5zaGFwZVtwYXJzZWRBeGlzXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluZGljZXNWYWxzLmxlbmd0aDsgKytpKSB7XG4gICAgICBjb25zdCBpbmRleCA9IGluZGljZXNWYWxzW2ldO1xuICAgICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIGluZGV4IDw9IGF4aXNEaW0gLSAxICYmIGluZGV4ID49IDAsXG4gICAgICAgICgpID0+XG4gICAgICAgICAgYEdhdGhlclYyOiB0aGUgaW5kZXggdmFsdWUgJHtpbmRleH0gaXMgbm90IGluIFswLCAke2F4aXNEaW0gLSAxfV1gKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzaGFwZUluZm8gPSBiYWNrZW5kX3V0aWwuc2VnbWVudF91dGlsLmNvbGxlY3RHYXRoZXJPcFNoYXBlSW5mbyhcbiAgICAgIHgsIGluZGljZXMsIHBhcnNlZEF4aXMsIGJhdGNoRGltcyk7XG5cbiAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG5cbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG5cbiAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKHtcbiAgICBpbnB1dHM6IHt4fSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7XG4gICAgICBzaGFwZTogW1xuICAgICAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBzaGFwZUluZm8uZGltU2l6ZSxcbiAgICAgICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICAgICAgXVxuICAgIH1cbiAgfSk7XG5cbiAgY29uc3QgZmxhdHRlbkluZGV4ID0gcmVzaGFwZSh7XG4gICAgaW5wdXRzOiB7eDogaW5kaWNlc30sXG4gICAgYmFja2VuZCxcbiAgICBhdHRyczoge3NoYXBlOiBbc2hhcGVJbmZvLmJhdGNoU2l6ZSwgaW5kaWNlc1NpemUgLyBzaGFwZUluZm8uYmF0Y2hTaXplXX1cbiAgfSk7XG5cbiAgdG9EaXNwb3NlLnB1c2goZmxhdHRlblgpO1xuICB0b0Rpc3Bvc2UucHVzaChmbGF0dGVuSW5kZXgpO1xuXG4gIGNvbnN0IGZsYXR0ZW5PdXRwdXRTaGFwZSA9IFtcbiAgICBzaGFwZUluZm8uYmF0Y2hTaXplLCBzaGFwZUluZm8ub3V0ZXJTaXplLCBpbmRpY2VzU2l6ZSAvIHNoYXBlSW5mby5iYXRjaFNpemUsXG4gICAgc2hhcGVJbmZvLnNsaWNlU2l6ZVxuICBdO1xuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeCwgaW5kaWNlc10pIHx8IHguZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYyhmbGF0dGVuSW5kZXgpO1xuICAgIGNvbnN0IHhCdWYgPSBiYWNrZW5kLmJ1ZmZlclN5bmMoZmxhdHRlblgpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IGdhdGhlclYySW1wbENQVSh4QnVmLCBpbmRpY2VzQnVmLCBmbGF0dGVuT3V0cHV0U2hhcGUpO1xuXG4gICAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcblxuICAgIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBzaGFwZUluZm8ub3V0cHV0U2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyBhcyBUeXBlZEFycmF5KTtcbiAgfVxuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgR2F0aGVyUHJvZ3JhbShmbGF0dGVuWC5zaGFwZSBhcyBHYXRoZXJTaGFwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYXR0ZW5PdXRwdXRTaGFwZSBhcyBHYXRoZXJTaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kZXhdLCBmbGF0dGVuWC5kdHlwZSk7XG4gIHRvRGlzcG9zZS5wdXNoKHJlcyk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHJlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IHNoYXBlSW5mby5vdXRwdXRTaGFwZX19KTtcbiAgdG9EaXNwb3NlLmZvckVhY2godCA9PiBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHQpKTtcbiAgcmV0dXJuIHJlc2hhcGVkO1xufVxuXG5leHBvcnQgY29uc3QgZ2F0aGVyVjJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogR2F0aGVyVjIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBnYXRoZXJWMiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Greater } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { greaterImplCPU } from '../kernel_utils/shared';\nconst GREATER = `return float(a > b);`;\nconst GREATER_PACKED = `\n  return vec4(greaterThan(a, b));\n`;\nexport const greater = binaryKernelFunc({\n    opSnippet: GREATER,\n    packedOpSnippet: GREATER_PACKED,\n    cpuKernelImpl: greaterImplCPU,\n    dtype: 'bool'\n});\nexport const greaterConfig = {\n    kernelName: Greater,\n    backendName: 'webgl',\n    kernelFunc: greater\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9HcmVhdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQTJCLE1BQU0sdUJBQXVCLENBQUM7QUFFeEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLHNCQUFzQixDQUFDO0FBQ3ZDLE1BQU0sY0FBYyxHQUFHOztDQUV0QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixDQUFDO0lBQ3RDLFNBQVMsRUFBRSxPQUFPO0lBQ2xCLGVBQWUsRUFBRSxjQUFjO0lBQy9CLGFBQWEsRUFBRSxjQUFjO0lBQzdCLEtBQUssRUFBRSxNQUFNO0NBQ2QsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHcmVhdGVyLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge2dyZWF0ZXJJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgR1JFQVRFUiA9IGByZXR1cm4gZmxvYXQoYSA+IGIpO2A7XG5jb25zdCBHUkVBVEVSX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQoZ3JlYXRlclRoYW4oYSwgYikpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGdyZWF0ZXIgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBHUkVBVEVSLFxuICBwYWNrZWRPcFNuaXBwZXQ6IEdSRUFURVJfUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBncmVhdGVySW1wbENQVSxcbiAgZHR5cGU6ICdib29sJ1xufSk7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IEdyZWF0ZXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBncmVhdGVyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { GreaterEqual } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { greaterEqualImplCPU } from '../kernel_utils/shared';\nconst GREATER_EQUAL = `return float(a >= b);`;\nconst GREATER_EQUAL_PACKED = `\n  return vec4(greaterThanEqual(a, b));\n`;\nexport const greaterEqual = binaryKernelFunc({\n    opSnippet: GREATER_EQUAL,\n    packedOpSnippet: GREATER_EQUAL_PACKED,\n    dtype: 'bool',\n    cpuKernelImpl: greaterEqualImplCPU\n});\nexport const greaterEqualConfig = {\n    kernelName: GreaterEqual,\n    backendName: 'webgl',\n    kernelFunc: greaterEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiR3JlYXRlckVxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0dyZWF0ZXJFcXVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUEyQixNQUFNLHVCQUF1QixDQUFDO0FBQzdFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRTNELE1BQU0sYUFBYSxHQUFHLHVCQUF1QixDQUFDO0FBQzlDLE1BQU0sb0JBQW9CLEdBQUc7O0NBRTVCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsZ0JBQWdCLENBQUM7SUFDM0MsU0FBUyxFQUFFLGFBQWE7SUFDeEIsZUFBZSxFQUFFLG9CQUFvQjtJQUNyQyxLQUFLLEVBQUUsTUFBTTtJQUNiLGFBQWEsRUFBRSxtQkFBbUI7Q0FDbkMsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCO0lBQzlDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxZQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dyZWF0ZXJFcXVhbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7Z3JlYXRlckVxdWFsSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IEdSRUFURVJfRVFVQUwgPSBgcmV0dXJuIGZsb2F0KGEgPj0gYik7YDtcbmNvbnN0IEdSRUFURVJfRVFVQUxfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChncmVhdGVyVGhhbkVxdWFsKGEsIGIpKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBncmVhdGVyRXF1YWwgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBHUkVBVEVSX0VRVUFMLFxuICBwYWNrZWRPcFNuaXBwZXQ6IEdSRUFURVJfRVFVQUxfUEFDS0VELFxuICBkdHlwZTogJ2Jvb2wnLFxuICBjcHVLZXJuZWxJbXBsOiBncmVhdGVyRXF1YWxJbXBsQ1BVXG59KTtcblxuZXhwb3J0IGNvbnN0IGdyZWF0ZXJFcXVhbENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBHcmVhdGVyRXF1YWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBncmVhdGVyRXF1YWwgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IFFT } from '@tensorflow/tfjs-core';\nimport { fftImpl } from './FFT_impl';\nexport function ifft(args) {\n    const { inputs, backend } = args;\n    const { input } = inputs;\n    return fftImpl(input, true /* inverse */, backend);\n}\nexport const ifftConfig = {\n    kernelName: IFFT,\n    backendName: 'webgl',\n    kernelFunc: ifft\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUZGVC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9JRkZULnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxJQUFJLEVBQXVDLE1BQU0sdUJBQXVCLENBQUM7QUFJakYsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVuQyxNQUFNLFVBQVUsSUFBSSxDQUFDLElBQXFEO0lBRXhFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFdkIsT0FBTyxPQUFPLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxhQUFhLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDckQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtJRkZULCBJRkZUSW5wdXRzLCBLZXJuZWxDb25maWcsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7ZmZ0SW1wbH0gZnJvbSAnLi9GRlRfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBpZmZ0KGFyZ3M6IHtpbnB1dHM6IElGRlRJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIHJldHVybiBmZnRJbXBsKGlucHV0LCB0cnVlIC8qIGludmVyc2UgKi8sIGJhY2tlbmQpO1xufVxuXG5leHBvcnQgY29uc3QgaWZmdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJRkZULFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogaWZmdFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsFinite } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst IS_FINITE = `return float(!isnan(x) && !isinf(x));`;\nexport const isFinite = unaryKernelFunc({ opSnippet: IS_FINITE, dtype: 'bool' });\nexport const isFiniteConfig = {\n    kernelName: IsFinite,\n    backendName: 'webgl',\n    kernelFunc: isFinite,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNGaW5pdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvSXNGaW5pdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFFBQVEsRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLFNBQVMsR0FBRyx1Q0FBdUMsQ0FBQztBQUUxRCxNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztBQUUvRSxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUFRO0NBQ3JCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNGaW5pdGUsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgSVNfRklOSVRFID0gYHJldHVybiBmbG9hdCghaXNuYW4oeCkgJiYgIWlzaW5mKHgpKTtgO1xuXG5leHBvcnQgY29uc3QgaXNGaW5pdGUgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogSVNfRklOSVRFLCBkdHlwZTogJ2Jvb2wnfSk7XG5cbmV4cG9ydCBjb25zdCBpc0Zpbml0ZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBJc0Zpbml0ZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGlzRmluaXRlLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsInf } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst IS_INF = `return float(isinf(x));`;\nexport const isInf = unaryKernelFunc({ opSnippet: IS_INF, dtype: 'bool' });\nexport const isInfConfig = {\n    kernelName: IsInf,\n    backendName: 'webgl',\n    kernelFunc: isInf,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNJbmYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvSXNJbmYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNJbmYsIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgSVNfSU5GID0gYHJldHVybiBmbG9hdChpc2luZih4KSk7YDtcblxuZXhwb3J0IGNvbnN0IGlzSW5mID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IElTX0lORiwgZHR5cGU6ICdib29sJ30pO1xuXG5leHBvcnQgY29uc3QgaXNJbmZDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSXNJbmYsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBpc0luZixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { IsNan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst IS_NAN = `return float(isnan(x));`;\nexport const isNaN = unaryKernelFunc({ opSnippet: IS_NAN, dtype: 'bool' });\nexport const isNaNConfig = {\n    kernelName: IsNan,\n    backendName: 'webgl',\n    kernelFunc: isNaN,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNOYU4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvSXNOYU4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEtBQUssRUFBZSxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLE1BQU0sR0FBRyx5QkFBeUIsQ0FBQztBQUV6QyxNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLENBQUMsQ0FBQztBQUV6RSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7SXNOYW4sIEtlcm5lbENvbmZpZ30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgSVNfTkFOID0gYHJldHVybiBmbG9hdChpc25hbih4KSk7YDtcblxuZXhwb3J0IGNvbnN0IGlzTmFOID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IElTX05BTiwgZHR5cGU6ICdib29sJ30pO1xuXG5leHBvcnQgY29uc3QgaXNOYU5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogSXNOYW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBpc05hTixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Less } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { lessImplCPU } from '../kernel_utils/shared';\nconst LESS = `return float(a < b);`;\nconst LESS_PACKED = `\n  return vec4(lessThan(a, b));\n`;\nexport const less = binaryKernelFunc({\n    opSnippet: LESS,\n    packedOpSnippet: LESS_PACKED,\n    cpuKernelImpl: lessImplCPU,\n    dtype: 'bool'\n});\nexport const lessConfig = {\n    kernelName: Less,\n    backendName: 'webgl',\n    kernelFunc: less\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVzcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9MZXNzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRW5ELE1BQU0sSUFBSSxHQUFHLHNCQUFzQixDQUFDO0FBQ3BDLE1BQU0sV0FBVyxHQUFHOztDQUVuQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLGdCQUFnQixDQUFDO0lBQ25DLFNBQVMsRUFBRSxJQUFJO0lBQ2YsZUFBZSxFQUFFLFdBQVc7SUFDNUIsYUFBYSxFQUFFLFdBQVc7SUFDMUIsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTGVzc30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7bGVzc0ltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBMRVNTID0gYHJldHVybiBmbG9hdChhIDwgYik7YDtcbmNvbnN0IExFU1NfUEFDS0VEID0gYFxuICByZXR1cm4gdmVjNChsZXNzVGhhbihhLCBiKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgbGVzcyA9IGJpbmFyeUtlcm5lbEZ1bmMoe1xuICBvcFNuaXBwZXQ6IExFU1MsXG4gIHBhY2tlZE9wU25pcHBldDogTEVTU19QQUNLRUQsXG4gIGNwdUtlcm5lbEltcGw6IGxlc3NJbXBsQ1BVLFxuICBkdHlwZTogJ2Jvb2wnXG59KTtcblxuZXhwb3J0IGNvbnN0IGxlc3NDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTGVzcyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxlc3MgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LessEqual } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { lessEqualImplCPU } from '../kernel_utils/shared';\nexport const LESS_EQUAL = `return float(a <= b);`;\nexport const LESS_EQUAL_PACKED = `\n  return vec4(lessThanEqual(a, b));\n`;\nexport const lessEqual = binaryKernelFunc({\n    opSnippet: LESS_EQUAL,\n    packedOpSnippet: LESS_EQUAL_PACKED,\n    cpuKernelImpl: lessEqualImplCPU,\n    dtype: 'bool'\n});\nexport const lessEqualConfig = {\n    kernelName: LessEqual,\n    backendName: 'webgl',\n    kernelFunc: lessEqual\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGVzc0VxdWFsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xlc3NFcXVhbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ3BFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXhELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQztBQUNsRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRzs7Q0FFaEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBRyxnQkFBZ0IsQ0FBQztJQUN4QyxTQUFTLEVBQUUsVUFBVTtJQUNyQixlQUFlLEVBQUUsaUJBQWlCO0lBQ2xDLGFBQWEsRUFBRSxnQkFBZ0I7SUFDL0IsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTGVzc0VxdWFsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtsZXNzRXF1YWxJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGNvbnN0IExFU1NfRVFVQUwgPSBgcmV0dXJuIGZsb2F0KGEgPD0gYik7YDtcbmV4cG9ydCBjb25zdCBMRVNTX0VRVUFMX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIHZlYzQobGVzc1RoYW5FcXVhbChhLCBiKSk7XG5gO1xuXG5leHBvcnQgY29uc3QgbGVzc0VxdWFsID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogTEVTU19FUVVBTCxcbiAgcGFja2VkT3BTbmlwcGV0OiBMRVNTX0VRVUFMX1BBQ0tFRCxcbiAgY3B1S2VybmVsSW1wbDogbGVzc0VxdWFsSW1wbENQVSxcbiAgZHR5cGU6ICdib29sJ1xufSk7XG5cbmV4cG9ydCBjb25zdCBsZXNzRXF1YWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTGVzc0VxdWFsLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbGVzc0VxdWFsIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LinSpace } from '@tensorflow/tfjs-core';\nimport { linSpaceImplCPU } from '../kernel_utils/shared';\nexport function linSpace(args) {\n    const { backend, attrs } = args;\n    const { start, stop, num } = attrs;\n    // TODO: Use CPU implementation due to the precision problem in Safari.\n    const outVals = linSpaceImplCPU(start, stop, num);\n    return backend.makeTensorInfo([outVals.length], 'float32', outVals);\n}\nexport const linSpaceConfig = {\n    kernelName: LinSpace,\n    backendName: 'webgl',\n    kernelFunc: linSpace\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTGluU3BhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTGluU3BhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixRQUFRLEVBQTRCLE1BQU0sdUJBQXVCLENBQUM7QUFHcEcsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXZELE1BQU0sVUFBVSxRQUFRLENBQ3BCLElBQXVEO0lBQ3pELE1BQU0sRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQzlCLE1BQU0sRUFBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVqQyx1RUFBdUU7SUFDdkUsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDbEQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN0RSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsUUFBNEI7Q0FDekMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExpblNwYWNlLCBMaW5TcGFjZUF0dHJzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtsaW5TcGFjZUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGluU3BhY2UoXG4gICAgYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBMaW5TcGFjZUF0dHJzfSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7YmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3N0YXJ0LCBzdG9wLCBudW19ID0gYXR0cnM7XG5cbiAgLy8gVE9ETzogVXNlIENQVSBpbXBsZW1lbnRhdGlvbiBkdWUgdG8gdGhlIHByZWNpc2lvbiBwcm9ibGVtIGluIFNhZmFyaS5cbiAgY29uc3Qgb3V0VmFscyA9IGxpblNwYWNlSW1wbENQVShzdGFydCwgc3RvcCwgbnVtKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dFZhbHMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBvdXRWYWxzKTtcbn1cblxuZXhwb3J0IGNvbnN0IGxpblNwYWNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExpblNwYWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbGluU3BhY2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { logImplCPU } from '../kernel_utils/shared';\n// Windows chrome return 0 if the input is negative value. We will specifically\n// return NaN if the input is 0 to solve compatiblity issue.\nconst LOG = CHECK_NAN_SNIPPET_UNARY + `\n  return x < 0.0 ? 0./0. : log(x);\n`;\nconst LOG_PACKED = `\n  vec4 result = log(x);\n  bvec4 isNaN = isnan(x);\n  result.r = isNaN.r ? x.r : (x.r < 0.0 ? 0./0. : result.r);\n  result.g = isNaN.g ? x.g : (x.g < 0.0 ? 0./0. : result.g);\n  result.b = isNaN.b ? x.b : (x.b < 0.0 ? 0./0. : result.b);\n  result.a = isNaN.a ? x.a : (x.a < 0.0 ? 0./0. : result.a);\n  return result;\n`;\nexport const log = unaryKernelFunc({ opSnippet: LOG, packedOpSnippet: LOG_PACKED, cpuKernelImpl: logImplCPU });\nexport const logConfig = {\n    kernelName: Log,\n    backendName: 'webgl',\n    kernelFunc: log\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xvZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXBFLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUM1RixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFbEQsK0VBQStFO0FBQy9FLDREQUE0RDtBQUM1RCxNQUFNLEdBQUcsR0FBRyx1QkFBdUIsR0FBRzs7Q0FFckMsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHOzs7Ozs7OztDQVFsQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FDOUIsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsYUFBYSxFQUFFLFVBQVUsRUFBQyxDQUFDLENBQUM7QUFFOUUsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTG9nfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1VOQVJZLCB1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtsb2dJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuLy8gV2luZG93cyBjaHJvbWUgcmV0dXJuIDAgaWYgdGhlIGlucHV0IGlzIG5lZ2F0aXZlIHZhbHVlLiBXZSB3aWxsIHNwZWNpZmljYWxseVxuLy8gcmV0dXJuIE5hTiBpZiB0aGUgaW5wdXQgaXMgMCB0byBzb2x2ZSBjb21wYXRpYmxpdHkgaXNzdWUuXG5jb25zdCBMT0cgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIHggPCAwLjAgPyAwLi8wLiA6IGxvZyh4KTtcbmA7XG5cbmNvbnN0IExPR19QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbG9nKHgpO1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiAoeC5yIDwgMC4wID8gMC4vMC4gOiByZXN1bHQucik7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6ICh4LmcgPCAwLjAgPyAwLi8wLiA6IHJlc3VsdC5nKTtcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogKHguYiA8IDAuMCA/IDAuLzAuIDogcmVzdWx0LmIpO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiAoeC5hIDwgMC4wID8gMC4vMC4gOiByZXN1bHQuYSk7XG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG5leHBvcnQgY29uc3QgbG9nID0gdW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IExPRywgcGFja2VkT3BTbmlwcGV0OiBMT0dfUEFDS0VELCBjcHVLZXJuZWxJbXBsOiBsb2dJbXBsQ1BVfSk7XG5cbmV4cG9ydCBjb25zdCBsb2dDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTG9nLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbG9nIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Log1p } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst LOG1P = CHECK_NAN_SNIPPET_UNARY + `\n  return log(1.0 + x);\n`;\nexport const log1p = unaryKernelFunc({ opSnippet: LOG1P });\nexport const log1pConfig = {\n    kernelName: Log1p,\n    backendName: 'webgl',\n    kernelFunc: log1p,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9nMXAuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTG9nMXAudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFELE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUU1RixNQUFNLEtBQUssR0FBRyx1QkFBdUIsR0FBRzs7Q0FFdkMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztBQUV6RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBMb2cxcH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgTE9HMVAgPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIGxvZygxLjAgKyB4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBsb2cxcCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBMT0cxUH0pO1xuXG5leHBvcnQgY29uc3QgbG9nMXBDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTG9nMXAsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBsb2cxcCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalAnd } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst LOGICAL_AND = `return float(a >= 1.0 && b >= 1.0);`;\nconst LOGICAL_AND_PACKED = `\n  return vec4(\n    vec4(greaterThanEqual(a, vec4(1.0))) *\n    vec4(greaterThanEqual(b, vec4(1.0))));\n`;\nexport const logicalAnd = binaryKernelFunc({\n    opSnippet: LOGICAL_AND,\n    packedOpSnippet: LOGICAL_AND_PACKED,\n    dtype: 'bool'\n});\nexport const logicalAndConfig = {\n    kernelName: LogicalAnd,\n    backendName: 'webgl',\n    kernelFunc: logicalAnd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbEFuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Mb2dpY2FsQW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFcEUsTUFBTSxXQUFXLEdBQUcscUNBQXFDLENBQUM7QUFDMUQsTUFBTSxrQkFBa0IsR0FBRzs7OztDQUkxQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGdCQUFnQixDQUFDO0lBQ3pDLFNBQVMsRUFBRSxXQUFXO0lBQ3RCLGVBQWUsRUFBRSxrQkFBa0I7SUFDbkMsS0FBSyxFQUFFLE1BQU07Q0FDZCxDQUFDLENBQUM7QUFFSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBaUI7SUFDNUMsVUFBVSxFQUFFLFVBQVU7SUFDdEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFVBQThCO0NBQzNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMb2dpY2FsQW5kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBMT0dJQ0FMX0FORCA9IGByZXR1cm4gZmxvYXQoYSA+PSAxLjAgJiYgYiA+PSAxLjApO2A7XG5jb25zdCBMT0dJQ0FMX0FORF9QQUNLRUQgPSBgXG4gIHJldHVybiB2ZWM0KFxuICAgIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChhLCB2ZWM0KDEuMCkpKSAqXG4gICAgdmVjNChncmVhdGVyVGhhbkVxdWFsKGIsIHZlYzQoMS4wKSkpKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBsb2dpY2FsQW5kID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogTE9HSUNBTF9BTkQsXG4gIHBhY2tlZE9wU25pcHBldDogTE9HSUNBTF9BTkRfUEFDS0VELFxuICBkdHlwZTogJ2Jvb2wnXG59KTtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxBbmRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTG9naWNhbEFuZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxvZ2ljYWxBbmQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalNot } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst LOGICAL_NOT = `return float(!(x >= 1.0));`;\nexport const logicalNot = unaryKernelFunc({ opSnippet: LOGICAL_NOT });\nexport const logicalNotConfig = {\n    kernelName: LogicalNot,\n    backendName: 'webgl',\n    kernelFunc: logicalNot,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbE5vdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Mb2dpY2FsTm90LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxXQUFXLEdBQUcsNEJBQTRCLENBQUM7QUFFakQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsVUFBVTtDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgTG9naWNhbE5vdH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgTE9HSUNBTF9OT1QgPSBgcmV0dXJuIGZsb2F0KCEoeCA+PSAxLjApKTtgO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBMT0dJQ0FMX05PVH0pO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE5vdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMb2dpY2FsTm90LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbG9naWNhbE5vdCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LogicalOr } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst LOGICAL_OR = `return float(a >= 1.0 || b >= 1.0);`;\nconst LOGICAL_OR_PACKED = `\n  return min(\n    vec4(greaterThanEqual(a, vec4(1.0))) +\n    vec4(greaterThanEqual(b, vec4(1.0))),\n    vec4(1.0));\n`;\nexport const logicalOr = binaryKernelFunc({ opSnippet: LOGICAL_OR, packedOpSnippet: LOGICAL_OR_PACKED, dtype: 'bool' });\nexport const logicalOrConfig = {\n    kernelName: LogicalOr,\n    backendName: 'webgl',\n    kernelFunc: logicalOr\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTG9naWNhbE9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xvZ2ljYWxPci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFNBQVMsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTFFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sVUFBVSxHQUFHLHFDQUFxQyxDQUFDO0FBQ3pELE1BQU0saUJBQWlCLEdBQUc7Ozs7O0NBS3pCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxTQUFTLEdBQUcsZ0JBQWdCLENBQ3JDLEVBQUMsU0FBUyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7QUFFaEYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIExvZ2ljYWxPcn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgTE9HSUNBTF9PUiA9IGByZXR1cm4gZmxvYXQoYSA+PSAxLjAgfHwgYiA+PSAxLjApO2A7XG5jb25zdCBMT0dJQ0FMX09SX1BBQ0tFRCA9IGBcbiAgcmV0dXJuIG1pbihcbiAgICB2ZWM0KGdyZWF0ZXJUaGFuRXF1YWwoYSwgdmVjNCgxLjApKSkgK1xuICAgIHZlYzQoZ3JlYXRlclRoYW5FcXVhbChiLCB2ZWM0KDEuMCkpKSxcbiAgICB2ZWM0KDEuMCkpO1xuYDtcblxuZXhwb3J0IGNvbnN0IGxvZ2ljYWxPciA9IGJpbmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogTE9HSUNBTF9PUiwgcGFja2VkT3BTbmlwcGV0OiBMT0dJQ0FMX09SX1BBQ0tFRCwgZHR5cGU6ICdib29sJ30pO1xuXG5leHBvcnQgY29uc3QgbG9naWNhbE9yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IExvZ2ljYWxPcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IGxvZ2ljYWxPciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class LRNProgram {\n    constructor(xShape, radius, bias, alpha, beta) {\n        this.variableNames = ['x'];\n        this.outputShape = [];\n        const rad = radius;\n        const maxD = xShape[3] - 1;\n        this.outputShape = xShape;\n        // optimize pow(bias + alpha * sum, -beta)\n        // src: https://github.com/tensorflow/tensorflow/..\n        // blob/26033a1644a9c4a5fbe3170ab2e864b6a4ccd4ca/..\n        // tensorflow/core/kernels/mkl_lrn_op.cc#L320\n        let powOperator;\n        const basis = `float(${bias}) + float(${alpha}) * sum`;\n        if (beta === 0.5) {\n            powOperator = `inversesqrt(${basis})`;\n        }\n        else if (beta === 1.0) {\n            powOperator = `1.0/(${basis})`;\n        }\n        else {\n            powOperator = `exp(log(${basis}) * float(-${beta}));`;\n        }\n        this.userCode = `\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int r = coords[1];\n        int c = coords[2];\n        int d = coords[3];\n        float x = getX(b, r, c, d);\n        float sum = 0.0;\n        for (int j = -${rad}; j <= ${rad}; j++) {\n          int idx = d + j;\n          if (idx >= 0 && idx <=  ${maxD}) {\n            float z = getX(b, r, c, idx);\n            sum += z * z;\n          }\n        }\n        float val = x * ${powOperator};\n        setOutput(val);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJuX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvbHJuX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sVUFBVTtJQUtyQixZQUNJLE1BQWdCLEVBQUUsTUFBYyxFQUFFLElBQVksRUFBRSxLQUFhLEVBQzdELElBQVk7UUFOaEIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBTXpCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQztRQUNuQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBRTFCLDBDQUEwQztRQUMxQyxtREFBbUQ7UUFDbkQsbURBQW1EO1FBQ25ELDZDQUE2QztRQUM3QyxJQUFJLFdBQVcsQ0FBQztRQUNoQixNQUFNLEtBQUssR0FBRyxTQUFTLElBQUksYUFBYSxLQUFLLFNBQVMsQ0FBQztRQUN2RCxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7WUFDaEIsV0FBVyxHQUFHLGVBQWUsS0FBSyxHQUFHLENBQUM7U0FDdkM7YUFBTSxJQUFJLElBQUksS0FBSyxHQUFHLEVBQUU7WUFDdkIsV0FBVyxHQUFHLFFBQVEsS0FBSyxHQUFHLENBQUM7U0FDaEM7YUFBTTtZQUNMLFdBQVcsR0FBRyxXQUFXLEtBQUssY0FBYyxJQUFJLEtBQUssQ0FBQztTQUN2RDtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7Ozs7Ozs7Ozt3QkFTSSxHQUFHLFVBQVUsR0FBRzs7b0NBRUosSUFBSTs7Ozs7MEJBS2QsV0FBVzs7O0tBR2hDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTFJOUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCByYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkID0gcmFkaXVzO1xuICAgIGNvbnN0IG1heEQgPSB4U2hhcGVbM10gLSAxO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICAvLyBvcHRpbWl6ZSBwb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSlcbiAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAvLyBibG9iLzI2MDMzYTE2NDRhOWM0YTVmYmUzMTcwYWIyZTg2NGI2YTRjY2Q0Y2EvLi5cbiAgICAvLyB0ZW5zb3JmbG93L2NvcmUva2VybmVscy9ta2xfbHJuX29wLmNjI0wzMjBcbiAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgY29uc3QgYmFzaXMgPSBgZmxvYXQoJHtiaWFzfSkgKyBmbG9hdCgke2FscGhhfSkgKiBzdW1gO1xuICAgIGlmIChiZXRhID09PSAwLjUpIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYGludmVyc2VzcXJ0KCR7YmFzaXN9KWA7XG4gICAgfSBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG93T3BlcmF0b3IgPSBgZXhwKGxvZygke2Jhc2lzfSkgKiBmbG9hdCgtJHtiZXRhfSkpO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG4gICAgICAgIGludCBkID0gY29vcmRzWzNdO1xuICAgICAgICBmbG9hdCB4ID0gZ2V0WChiLCByLCBjLCBkKTtcbiAgICAgICAgZmxvYXQgc3VtID0gMC4wO1xuICAgICAgICBmb3IgKGludCBqID0gLSR7cmFkfTsgaiA8PSAke3JhZH07IGorKykge1xuICAgICAgICAgIGludCBpZHggPSBkICsgajtcbiAgICAgICAgICBpZiAoaWR4ID49IDAgJiYgaWR4IDw9ICAke21heER9KSB7XG4gICAgICAgICAgICBmbG9hdCB6ID0gZ2V0WChiLCByLCBjLCBpZHgpO1xuICAgICAgICAgICAgc3VtICs9IHogKiB6O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmbG9hdCB2YWwgPSB4ICogJHtwb3dPcGVyYXRvcn07XG4gICAgICAgIHNldE91dHB1dCh2YWwpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class LRNPackedProgram {\n    constructor(xShape, radius, bias, alpha, beta) {\n        this.variableNames = ['x'];\n        this.outputShape = [];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        const rad = radius;\n        const maxD = xShape[3] - 1;\n        this.outputShape = xShape;\n        // optimize pow(bias + alpha * sum, -beta)\n        // src: https://github.com/tensorflow/tensorflow/..\n        // blob/26033a1644a9c4a5fbe3170ab2e864b6a4ccd4ca/..\n        // tensorflow/core/kernels/mkl_lrn_op.cc#L320\n        let powOperator;\n        const basis = `float(${bias}) + float(${alpha}) * sum`;\n        if (beta === 0.5) {\n            powOperator = `inversesqrt(${basis})`;\n        }\n        else if (beta === 1.0) {\n            powOperator = `1.0/(${basis})`;\n        }\n        else {\n            powOperator = `exp(log(${basis}) * float(-${beta}));`;\n        }\n        this.userCode = `\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords.x;\n        int r = coords.y;\n        int c = coords.z;\n        int d = coords.w;\n\n        bool hasNextCol = d < ${this.outputShape[3]};\n        bool hasNextRow = c < ${this.outputShape[2]};\n\n        vec4 sum = vec4(0.);\n        vec4 xFragAtOutputCoords = getX(b, r, c, d);\n\n        vec4 xAtOutputCoords = vec4(\n          getChannel(xFragAtOutputCoords, vec2(c, d)),\n          hasNextCol ?\n            getChannel(xFragAtOutputCoords, vec2(c, d + 1)) : 0.0,\n          hasNextRow ?\n            getChannel(xFragAtOutputCoords , vec2(c + 1, d)) : 0.0,\n          (hasNextRow && hasNextCol) ?\n            getChannel(xFragAtOutputCoords, vec2(c + 1, d + 1)) : 0.0\n        );\n\n        int firstChannel = d - ${rad};\n        vec2 cache = vec2(0.);\n        if(firstChannel >= 0){\n          vec4 firstChannelFrag = getX(b, r, c, firstChannel);\n          cache.x = getChannel(firstChannelFrag, vec2(c, firstChannel));\n            if(hasNextRow){\n              cache.y = getChannel(firstChannelFrag, vec2(c + 1, firstChannel));\n            }\n        }\n\n        ivec2 depth = ivec2(d, d + 1);\n        for (int j = - ${rad}; j <= ${rad}; j++) {\n          ivec2 idx = depth + j;\n          bvec2 aboveLowerBound = greaterThanEqual(idx, ivec2(0));\n          bvec2 belowUpperBound = lessThanEqual(idx, ivec2(${maxD}));\n\n          bool depthInRange = aboveLowerBound.x && belowUpperBound.x;\n          bool depthPlusOneInRange = aboveLowerBound.y && belowUpperBound.y;\n\n          if(depthInRange || depthPlusOneInRange){\n            vec4 z = vec4(0.);\n            vec4 xFragAtCurrentDepth;\n            z.xz = cache.xy;\n            if(depthPlusOneInRange && hasNextCol){\n              xFragAtCurrentDepth = idx.y != d ?\n                getX(b, r, c, idx.y) : xFragAtOutputCoords;\n              z.y = getChannel(xFragAtCurrentDepth, vec2(c, idx.y));\n              if(hasNextRow){\n                z.w = getChannel(xFragAtCurrentDepth, vec2(c + 1, idx.y));\n              }\n            }\n            cache.xy = z.yw;\n            sum += z * z;\n          }\n        }\n        vec4 result = xAtOutputCoords * ${powOperator};\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJuX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2xybl9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sT0FBTyxnQkFBZ0I7SUFPM0IsWUFDSSxNQUFnQixFQUFFLE1BQWMsRUFBRSxJQUFZLEVBQUUsS0FBYSxFQUM3RCxJQUFZO1FBUmhCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUUzQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUtsQixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUM7UUFDbkIsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQztRQUUxQiwwQ0FBMEM7UUFDMUMsbURBQW1EO1FBQ25ELG1EQUFtRDtRQUNuRCw2Q0FBNkM7UUFDN0MsSUFBSSxXQUFXLENBQUM7UUFDaEIsTUFBTSxLQUFLLEdBQUcsU0FBUyxJQUFJLGFBQWEsS0FBSyxTQUFTLENBQUM7UUFDdkQsSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO1lBQ2hCLFdBQVcsR0FBRyxlQUFlLEtBQUssR0FBRyxDQUFDO1NBQ3ZDO2FBQU0sSUFBSSxJQUFJLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLFdBQVcsR0FBRyxRQUFRLEtBQUssR0FBRyxDQUFDO1NBQ2hDO2FBQU07WUFDTCxXQUFXLEdBQUcsV0FBVyxLQUFLLGNBQWMsSUFBSSxLQUFLLENBQUM7U0FDdkQ7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7OztnQ0FRWSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztnQ0FDbkIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7OztpQ0FlbEIsR0FBRzs7Ozs7Ozs7Ozs7eUJBV1gsR0FBRyxVQUFVLEdBQUc7Ozs2REFHb0IsSUFBSTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OzBDQXFCdkIsV0FBVzs7O0tBR2hELENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgTFJOUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCByYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgY29uc3QgcmFkID0gcmFkaXVzO1xuICAgIGNvbnN0IG1heEQgPSB4U2hhcGVbM10gLSAxO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICAvLyBvcHRpbWl6ZSBwb3coYmlhcyArIGFscGhhICogc3VtLCAtYmV0YSlcbiAgICAvLyBzcmM6IGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmZsb3cvLi5cbiAgICAvLyBibG9iLzI2MDMzYTE2NDRhOWM0YTVmYmUzMTcwYWIyZTg2NGI2YTRjY2Q0Y2EvLi5cbiAgICAvLyB0ZW5zb3JmbG93L2NvcmUva2VybmVscy9ta2xfbHJuX29wLmNjI0wzMjBcbiAgICBsZXQgcG93T3BlcmF0b3I7XG4gICAgY29uc3QgYmFzaXMgPSBgZmxvYXQoJHtiaWFzfSkgKyBmbG9hdCgke2FscGhhfSkgKiBzdW1gO1xuICAgIGlmIChiZXRhID09PSAwLjUpIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYGludmVyc2VzcXJ0KCR7YmFzaXN9KWA7XG4gICAgfSBlbHNlIGlmIChiZXRhID09PSAxLjApIHtcbiAgICAgIHBvd09wZXJhdG9yID0gYDEuMC8oJHtiYXNpc30pYDtcbiAgICB9IGVsc2Uge1xuICAgICAgcG93T3BlcmF0b3IgPSBgZXhwKGxvZygke2Jhc2lzfSkgKiBmbG9hdCgtJHtiZXRhfSkpO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzLng7XG4gICAgICAgIGludCByID0gY29vcmRzLnk7XG4gICAgICAgIGludCBjID0gY29vcmRzLno7XG4gICAgICAgIGludCBkID0gY29vcmRzLnc7XG5cbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gZCA8ICR7dGhpcy5vdXRwdXRTaGFwZVszXX07XG4gICAgICAgIGJvb2wgaGFzTmV4dFJvdyA9IGMgPCAke3RoaXMub3V0cHV0U2hhcGVbMl19O1xuXG4gICAgICAgIHZlYzQgc3VtID0gdmVjNCgwLik7XG4gICAgICAgIHZlYzQgeEZyYWdBdE91dHB1dENvb3JkcyA9IGdldFgoYiwgciwgYywgZCk7XG5cbiAgICAgICAgdmVjNCB4QXRPdXRwdXRDb29yZHMgPSB2ZWM0KFxuICAgICAgICAgIGdldENoYW5uZWwoeEZyYWdBdE91dHB1dENvb3JkcywgdmVjMihjLCBkKSksXG4gICAgICAgICAgaGFzTmV4dENvbCA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYywgZCArIDEpKSA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID9cbiAgICAgICAgICAgIGdldENoYW5uZWwoeEZyYWdBdE91dHB1dENvb3JkcyAsIHZlYzIoYyArIDEsIGQpKSA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRDaGFubmVsKHhGcmFnQXRPdXRwdXRDb29yZHMsIHZlYzIoYyArIDEsIGQgKyAxKSkgOiAwLjBcbiAgICAgICAgKTtcblxuICAgICAgICBpbnQgZmlyc3RDaGFubmVsID0gZCAtICR7cmFkfTtcbiAgICAgICAgdmVjMiBjYWNoZSA9IHZlYzIoMC4pO1xuICAgICAgICBpZihmaXJzdENoYW5uZWwgPj0gMCl7XG4gICAgICAgICAgdmVjNCBmaXJzdENoYW5uZWxGcmFnID0gZ2V0WChiLCByLCBjLCBmaXJzdENoYW5uZWwpO1xuICAgICAgICAgIGNhY2hlLnggPSBnZXRDaGFubmVsKGZpcnN0Q2hhbm5lbEZyYWcsIHZlYzIoYywgZmlyc3RDaGFubmVsKSk7XG4gICAgICAgICAgICBpZihoYXNOZXh0Um93KXtcbiAgICAgICAgICAgICAgY2FjaGUueSA9IGdldENoYW5uZWwoZmlyc3RDaGFubmVsRnJhZywgdmVjMihjICsgMSwgZmlyc3RDaGFubmVsKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpdmVjMiBkZXB0aCA9IGl2ZWMyKGQsIGQgKyAxKTtcbiAgICAgICAgZm9yIChpbnQgaiA9IC0gJHtyYWR9OyBqIDw9ICR7cmFkfTsgaisrKSB7XG4gICAgICAgICAgaXZlYzIgaWR4ID0gZGVwdGggKyBqO1xuICAgICAgICAgIGJ2ZWMyIGFib3ZlTG93ZXJCb3VuZCA9IGdyZWF0ZXJUaGFuRXF1YWwoaWR4LCBpdmVjMigwKSk7XG4gICAgICAgICAgYnZlYzIgYmVsb3dVcHBlckJvdW5kID0gbGVzc1RoYW5FcXVhbChpZHgsIGl2ZWMyKCR7bWF4RH0pKTtcblxuICAgICAgICAgIGJvb2wgZGVwdGhJblJhbmdlID0gYWJvdmVMb3dlckJvdW5kLnggJiYgYmVsb3dVcHBlckJvdW5kLng7XG4gICAgICAgICAgYm9vbCBkZXB0aFBsdXNPbmVJblJhbmdlID0gYWJvdmVMb3dlckJvdW5kLnkgJiYgYmVsb3dVcHBlckJvdW5kLnk7XG5cbiAgICAgICAgICBpZihkZXB0aEluUmFuZ2UgfHwgZGVwdGhQbHVzT25lSW5SYW5nZSl7XG4gICAgICAgICAgICB2ZWM0IHogPSB2ZWM0KDAuKTtcbiAgICAgICAgICAgIHZlYzQgeEZyYWdBdEN1cnJlbnREZXB0aDtcbiAgICAgICAgICAgIHoueHogPSBjYWNoZS54eTtcbiAgICAgICAgICAgIGlmKGRlcHRoUGx1c09uZUluUmFuZ2UgJiYgaGFzTmV4dENvbCl7XG4gICAgICAgICAgICAgIHhGcmFnQXRDdXJyZW50RGVwdGggPSBpZHgueSAhPSBkID9cbiAgICAgICAgICAgICAgICBnZXRYKGIsIHIsIGMsIGlkeC55KSA6IHhGcmFnQXRPdXRwdXRDb29yZHM7XG4gICAgICAgICAgICAgIHoueSA9IGdldENoYW5uZWwoeEZyYWdBdEN1cnJlbnREZXB0aCwgdmVjMihjLCBpZHgueSkpO1xuICAgICAgICAgICAgICBpZihoYXNOZXh0Um93KXtcbiAgICAgICAgICAgICAgICB6LncgPSBnZXRDaGFubmVsKHhGcmFnQXRDdXJyZW50RGVwdGgsIHZlYzIoYyArIDEsIGlkeC55KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhY2hlLnh5ID0gei55dztcbiAgICAgICAgICAgIHN1bSArPSB6ICogejtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdmVjNCByZXN1bHQgPSB4QXRPdXRwdXRDb29yZHMgKiAke3Bvd09wZXJhdG9yfTtcbiAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, LRN } from '@tensorflow/tfjs-core';\nimport { LRNProgram } from '../lrn_gpu';\nimport { LRNPackedProgram } from '../lrn_packed_gpu';\nexport const lrn = (args) => {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { depthRadius, bias, alpha, beta } = attrs;\n    const program = env().getBool('WEBGL_PACK_NORMALIZATION') ?\n        new LRNPackedProgram(x.shape, depthRadius, bias, alpha, beta) :\n        new LRNProgram(x.shape, depthRadius, bias, alpha, beta);\n    return backend.runWebGLProgram(program, [x], x.dtype);\n};\n// tslint:disable-next-line: variable-name\nexport const LRNConfig = {\n    kernelName: LRN,\n    backendName: 'webgl',\n    kernelFunc: lrn\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL0xSTi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixHQUFHLEVBQWtDLE1BQU0sdUJBQXVCLENBQUM7QUFHMUcsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUN0QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVuRCxNQUFNLENBQUMsTUFBTSxHQUFHLEdBQ1osQ0FBQyxJQUFxRSxFQUN2RCxFQUFFO0lBQ1gsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFdBQVcsRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsMEJBQTBCLENBQUMsQ0FBQyxDQUFDO1FBQ3ZELElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQy9ELElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUQsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4RCxDQUFDLENBQUM7QUFFViwwQ0FBMEM7QUFDMUMsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk4sIExSTkF0dHJzLCBMUk5JbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0xSTlByb2dyYW19IGZyb20gJy4uL2xybl9ncHUnO1xuaW1wb3J0IHtMUk5QYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9scm5fcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBjb25zdCBscm4gPVxuICAgIChhcmdzOiB7aW5wdXRzOiBMUk5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBMUk5BdHRyc30pOlxuICAgICAgICBUZW5zb3JJbmZvID0+IHtcbiAgICAgICAgICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICAgICAgICAgIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgICAgICAgICBjb25zdCB7ZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhfSA9IGF0dHJzO1xuXG4gICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfTk9STUFMSVpBVElPTicpID9cbiAgICAgICAgICAgICAgbmV3IExSTlBhY2tlZFByb2dyYW0oeC5zaGFwZSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKSA6XG4gICAgICAgICAgICAgIG5ldyBMUk5Qcm9ncmFtKHguc2hhcGUsIGRlcHRoUmFkaXVzLCBiaWFzLCBhbHBoYSwgYmV0YSk7XG4gICAgICAgICAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4XSwgeC5kdHlwZSk7XG4gICAgICAgIH07XG5cbi8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdmFyaWFibGUtbmFtZVxuZXhwb3J0IGNvbnN0IExSTkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMUk4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBscm4gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class LRNGradProgram {\n    constructor(inputShape, depthRadius, bias, alpha, beta) {\n        this.variableNames = ['inputImage', 'outputImage', 'dy'];\n        this.outputShape = [];\n        this.outputShape = inputShape;\n        this.depth = inputShape[3];\n        this.depthRadius = depthRadius;\n        this.bias = bias;\n        this.alpha = alpha;\n        this.beta = beta;\n        this.userCode = `\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int r = coords[1];\n        int c = coords[2];\n\n        float result = 0.0;\n        for (int d = 0; d < ${this.depth}; ++d) {\n          int depthBegin = int(max(0.0, float(d - ${depthRadius})));\n          int depthEnd = int(min(float(${this.depth}),\n              float(d + ${depthRadius} + 1)));\n\n          const int MIN_DEPTH_BEGIN = 0;\n          const int MAX_DEPTH_END = ${this.depth};\n\n          float norm = 0.0;\n          for (int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k) {\n            if (k < depthBegin){\n              continue;\n            }\n            else if (k >= depthBegin && k < depthEnd) {\n              norm += getInputImage(b, r, c, k) * getInputImage(b, r, c, k);\n            }\n            else {\n              break;\n            }\n          }\n\n          norm = float(${alpha}) * norm + float(${bias});\n\n          for(int k = MIN_DEPTH_BEGIN; k < MAX_DEPTH_END; ++k){\n            if (k < depthBegin){\n              continue;\n            }\n            else if (k >= depthBegin && k < depthEnd){\n              float dyi = -2.0 * float(${alpha})\n                * float(${beta})\n                * getInputImage(b ,r ,c, k) * getOutputImage(b, r, c, d)\n                / norm;\n              if (k == d) {\n                dyi += pow(norm, -1.0 * ${beta});\n              }\n              if (k == coords[3]) {\n                dyi *= getDy(b, r, c, d);\n                result += dyi;\n              }\n            }\n            else {\n              break;\n            }\n          }\n      }\n      setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibHJuX2dyYWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9scm5fZ3JhZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLGNBQWM7SUFVekIsWUFDSSxVQUFvQixFQUFFLFdBQW1CLEVBQUUsSUFBWSxFQUFFLEtBQWEsRUFDdEUsSUFBWTtRQVhoQixrQkFBYSxHQUFHLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNwRCxnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQVd6QixJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztRQUM5QixJQUFJLENBQUMsS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztRQUNuQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs4QkFRVSxJQUFJLENBQUMsS0FBSztvREFDWSxXQUFXO3lDQUN0QixJQUFJLENBQUMsS0FBSzswQkFDekIsV0FBVzs7O3NDQUdDLElBQUksQ0FBQyxLQUFLOzs7Ozs7Ozs7Ozs7Ozs7eUJBZXZCLEtBQUssb0JBQW9CLElBQUk7Ozs7Ozs7eUNBT2IsS0FBSzswQkFDcEIsSUFBSTs7OzswQ0FJWSxJQUFJOzs7Ozs7Ozs7Ozs7OztLQWN6QyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIExSTkdyYWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnaW5wdXRJbWFnZScsICdvdXRwdXRJbWFnZScsICdkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgZGVwdGhSYWRpdXM6IG51bWJlcjtcbiAgYmlhczogbnVtYmVyO1xuICBhbHBoYTogbnVtYmVyO1xuICBiZXRhOiBudW1iZXI7XG4gIGRlcHRoOiBudW1iZXI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBudW1iZXJbXSwgZGVwdGhSYWRpdXM6IG51bWJlciwgYmlhczogbnVtYmVyLCBhbHBoYTogbnVtYmVyLFxuICAgICAgYmV0YTogbnVtYmVyKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5kZXB0aCA9IGlucHV0U2hhcGVbM107XG4gICAgdGhpcy5kZXB0aFJhZGl1cyA9IGRlcHRoUmFkaXVzO1xuICAgIHRoaXMuYmlhcyA9IGJpYXM7XG4gICAgdGhpcy5hbHBoYSA9IGFscGhhO1xuICAgIHRoaXMuYmV0YSA9IGJldGE7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgciA9IGNvb3Jkc1sxXTtcbiAgICAgICAgaW50IGMgPSBjb29yZHNbMl07XG5cbiAgICAgICAgZmxvYXQgcmVzdWx0ID0gMC4wO1xuICAgICAgICBmb3IgKGludCBkID0gMDsgZCA8ICR7dGhpcy5kZXB0aH07ICsrZCkge1xuICAgICAgICAgIGludCBkZXB0aEJlZ2luID0gaW50KG1heCgwLjAsIGZsb2F0KGQgLSAke2RlcHRoUmFkaXVzfSkpKTtcbiAgICAgICAgICBpbnQgZGVwdGhFbmQgPSBpbnQobWluKGZsb2F0KCR7dGhpcy5kZXB0aH0pLFxuICAgICAgICAgICAgICBmbG9hdChkICsgJHtkZXB0aFJhZGl1c30gKyAxKSkpO1xuXG4gICAgICAgICAgY29uc3QgaW50IE1JTl9ERVBUSF9CRUdJTiA9IDA7XG4gICAgICAgICAgY29uc3QgaW50IE1BWF9ERVBUSF9FTkQgPSAke3RoaXMuZGVwdGh9O1xuXG4gICAgICAgICAgZmxvYXQgbm9ybSA9IDAuMDtcbiAgICAgICAgICBmb3IgKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKSB7XG4gICAgICAgICAgICBpZiAoayA8IGRlcHRoQmVnaW4pe1xuICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGsgPj0gZGVwdGhCZWdpbiAmJiBrIDwgZGVwdGhFbmQpIHtcbiAgICAgICAgICAgICAgbm9ybSArPSBnZXRJbnB1dEltYWdlKGIsIHIsIGMsIGspICogZ2V0SW5wdXRJbWFnZShiLCByLCBjLCBrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBub3JtID0gZmxvYXQoJHthbHBoYX0pICogbm9ybSArIGZsb2F0KCR7Ymlhc30pO1xuXG4gICAgICAgICAgZm9yKGludCBrID0gTUlOX0RFUFRIX0JFR0lOOyBrIDwgTUFYX0RFUFRIX0VORDsgKytrKXtcbiAgICAgICAgICAgIGlmIChrIDwgZGVwdGhCZWdpbil7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoayA+PSBkZXB0aEJlZ2luICYmIGsgPCBkZXB0aEVuZCl7XG4gICAgICAgICAgICAgIGZsb2F0IGR5aSA9IC0yLjAgKiBmbG9hdCgke2FscGhhfSlcbiAgICAgICAgICAgICAgICAqIGZsb2F0KCR7YmV0YX0pXG4gICAgICAgICAgICAgICAgKiBnZXRJbnB1dEltYWdlKGIgLHIgLGMsIGspICogZ2V0T3V0cHV0SW1hZ2UoYiwgciwgYywgZClcbiAgICAgICAgICAgICAgICAvIG5vcm07XG4gICAgICAgICAgICAgIGlmIChrID09IGQpIHtcbiAgICAgICAgICAgICAgICBkeWkgKz0gcG93KG5vcm0sIC0xLjAgKiAke2JldGF9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoayA9PSBjb29yZHNbM10pIHtcbiAgICAgICAgICAgICAgICBkeWkgKj0gZ2V0RHkoYiwgciwgYywgZCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ICs9IGR5aTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { LRNGrad } from '@tensorflow/tfjs-core';\nimport { LRNGradProgram } from '../lrn_grad_gpu';\nexport const lrnGrad = (args) => {\n    const { inputs, backend, attrs } = args;\n    const { x, y, dy } = inputs;\n    const { depthRadius, bias, alpha, beta } = attrs;\n    const program = new LRNGradProgram(x.shape, depthRadius, bias, alpha, beta);\n    return backend.runWebGLProgram(program, [x, y, dy], x.dtype);\n};\n// tslint:disable-next-line: variable-name\nexport const LRNGradConfig = {\n    kernelName: LRNGrad,\n    backendName: 'webgl',\n    kernelFunc: lrnGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTFJOR3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9MUk5HcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsT0FBTyxFQUEwQyxNQUFNLHVCQUF1QixDQUFDO0FBR2pILE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsQ0FBQyxJQUl2QixFQUFjLEVBQUU7SUFDZixNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzFCLE1BQU0sRUFBQyxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFL0MsTUFBTSxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUM1RSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0QsQ0FBQyxDQUFDO0FBRUYsMENBQTBDO0FBQzFDLE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBMUk5HcmFkLCBMUk5HcmFkQXR0cnMsIExSTkdyYWRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge0xSTkdyYWRQcm9ncmFtfSBmcm9tICcuLi9scm5fZ3JhZF9ncHUnO1xuXG5leHBvcnQgY29uc3QgbHJuR3JhZCA9IChhcmdzOiB7XG4gIGlucHV0czogTFJOR3JhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IExSTkdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8gPT4ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eCwgeSwgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgTFJOR3JhZFByb2dyYW0oeC5zaGFwZSwgZGVwdGhSYWRpdXMsIGJpYXMsIGFscGhhLCBiZXRhKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFt4LCB5LCBkeV0sIHguZHR5cGUpO1xufTtcblxuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiB2YXJpYWJsZS1uYW1lXG5leHBvcnQgY29uc3QgTFJOR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBMUk5HcmFkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogbHJuR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from '../kernels/Reshape';\nexport function maxImpl(x, reduceShape, outShape, backend) {\n    const inSize = util.sizeFromShape(reduceShape);\n    const xSize = util.sizeFromShape(x.shape);\n    const batchSize = xSize / inSize;\n    const reshapedInput = reshape({ inputs: { x }, attrs: { shape: [batchSize, inSize] }, backend });\n    const reduced = reduce(reshapedInput, x.dtype, 'max', backend);\n    const reshapedOutput = reshape({ inputs: { x: reduced }, attrs: { shape: outShape }, backend });\n    backend.disposeIntermediateTensorInfo(reshapedInput);\n    backend.disposeIntermediateTensorInfo(reduced);\n    return reshapedOutput;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4X2ltcGwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTWF4X2ltcGwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFhLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3ZELE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFM0MsTUFBTSxVQUFVLE9BQU8sQ0FDbkIsQ0FBYSxFQUFFLFdBQXFCLEVBQUUsUUFBa0IsRUFDeEQsT0FBeUI7SUFDM0IsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUMvQyxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMxQyxNQUFNLFNBQVMsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDO0lBQ2pDLE1BQU0sYUFBYSxHQUNmLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7SUFFekUsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMvRCxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0lBRXZFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUNyRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFL0MsT0FBTyxjQUFjLENBQUM7QUFDeEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtUZW5zb3JJbmZvLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyZWR1Y2V9IGZyb20gJy4uL2tlcm5lbF91dGlscy9yZWR1Y2UnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuLi9rZXJuZWxzL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4SW1wbChcbiAgICB4OiBUZW5zb3JJbmZvLCByZWR1Y2VTaGFwZTogbnVtYmVyW10sIG91dFNoYXBlOiBudW1iZXJbXSxcbiAgICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMKTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IGluU2l6ZSA9IHV0aWwuc2l6ZUZyb21TaGFwZShyZWR1Y2VTaGFwZSk7XG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHguc2hhcGUpO1xuICBjb25zdCBiYXRjaFNpemUgPSB4U2l6ZSAvIGluU2l6ZTtcbiAgY29uc3QgcmVzaGFwZWRJbnB1dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4fSwgYXR0cnM6IHtzaGFwZTogW2JhdGNoU2l6ZSwgaW5TaXplXX0sIGJhY2tlbmR9KTtcblxuICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKHJlc2hhcGVkSW5wdXQsIHguZHR5cGUsICdtYXgnLCBiYWNrZW5kKTtcbiAgY29uc3QgcmVzaGFwZWRPdXRwdXQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfSwgYmFja2VuZH0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzaGFwZWRJbnB1dCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVkdWNlZCk7XG5cbiAgcmV0dXJuIHJlc2hhcGVkT3V0cHV0O1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Max } from '@tensorflow/tfjs-core';\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { maxImplCPU } from '../kernel_utils/shared';\nimport { maxImpl } from './Max_impl';\nimport { transposeImpl, transposeImplCPU } from './Transpose_impl';\nexport function max(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { reductionIndices, keepDims } = attrs;\n    const xRank = x.shape.length;\n    const origAxes = util.parseAxisParam(reductionIndices, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n    const maxInputIsTransposed = permutedAxes != null;\n    const shouldExecuteOnCPU = backend.shouldExecuteOnCPU([x]);\n    let maxInput = x;\n    if (maxInputIsTransposed) {\n        if (shouldExecuteOnCPU) {\n            const xTexData = backend.texData.get(maxInput.dataId);\n            const values = xTexData.values;\n            const newShape = new Array(xRank);\n            for (let i = 0; i < newShape.length; i++) {\n                newShape[i] = x.shape[permutedAxes[i]];\n            }\n            const maxInputValues = transposeImplCPU(values, x.shape, x.dtype, permutedAxes, newShape);\n            maxInput = backend.makeTensorInfo(newShape, x.dtype);\n            const maxInputData = backend.texData.get(maxInput.dataId);\n            maxInputData.values = maxInputValues;\n        }\n        else {\n            maxInput = transposeImpl(x, permutedAxes, backend);\n        }\n        axes = backend_util.getInnerMostAxes(axes.length, xRank);\n    }\n    backend_util.assertAxesAreInnerMostDims('max', axes, xRank);\n    const [maxOutShape, reduceShape] = backend_util.computeOutAndReduceShapes(maxInput.shape, axes);\n    let outShape = maxOutShape;\n    if (keepDims) {\n        // rather than reshape at the end, set the target shape here.\n        outShape = backend_util.expandShapeToKeepDim(maxOutShape, origAxes);\n    }\n    let out;\n    if (shouldExecuteOnCPU) {\n        const xTexData = backend.texData.get(maxInput.dataId);\n        const values = xTexData.values;\n        const outValues = maxImplCPU(values, util.sizeFromShape(reduceShape), outShape, x.dtype);\n        out = backend.makeTensorInfo(outShape, x.dtype);\n        const outData = backend.texData.get(out.dataId);\n        outData.values = outValues;\n    }\n    else {\n        out = maxImpl(maxInput, reduceShape, outShape, backend);\n    }\n    if (maxInputIsTransposed) {\n        backend.disposeIntermediateTensorInfo(maxInput);\n    }\n    return out;\n}\nexport const maxConfig = {\n    kernelName: Max,\n    backendName: 'webgl',\n    kernelFunc: max\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01heC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsR0FBRyxFQUFrQyxNQUFNLHVCQUF1QixDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxZQUFZLEVBQTRCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR25GLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVsRCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBQyxhQUFhLEVBQUUsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVqRSxNQUFNLFVBQVUsR0FBRyxDQUNmLElBQXFFO0lBRXZFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxnQkFBZ0IsRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFM0MsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDaEUsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDO0lBQ2xELE1BQU0sa0JBQWtCLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFD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QU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxGdW5jLCBNYXgsIE1heEF0dHJzLCBNYXhJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBUeXBlZEFycmF5LCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHttYXhJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuaW1wb3J0IHttYXhJbXBsfSBmcm9tICcuL01heF9pbXBsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbCwgdHJhbnNwb3NlSW1wbENQVX0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXgoXG4gICAgYXJnczoge2lucHV0czogTWF4SW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogTWF4QXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7cmVkdWN0aW9uSW5kaWNlcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0ocmVkdWN0aW9uSW5kaWNlcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBjb25zdCBtYXhJbnB1dElzVHJhbnNwb3NlZCA9IHBlcm11dGVkQXhlcyAhPSBudWxsO1xuICBjb25zdCBzaG91bGRFeGVjdXRlT25DUFUgPSBiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pO1xuXG4gIGxldCBtYXhJbnB1dCA9IHg7XG4gIGlmIChtYXhJbnB1dElzVHJhbnNwb3NlZCkge1xuICAgIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICAgIGNvbnN0IHhUZXhEYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChtYXhJbnB1dC5kYXRhSWQpO1xuICAgICAgY29uc3QgdmFsdWVzID0geFRleERhdGEudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG5cbiAgICAgIGNvbnN0IG5ld1NoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheSh4UmFuayk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIG5ld1NoYXBlW2ldID0geC5zaGFwZVtwZXJtdXRlZEF4ZXNbaV1dO1xuICAgICAgfVxuICAgICAgY29uc3QgbWF4SW5wdXRWYWx1ZXMgPVxuICAgICAgICAgIHRyYW5zcG9zZUltcGxDUFUodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtdXRlZEF4ZXMsIG5ld1NoYXBlKTtcblxuICAgICAgbWF4SW5wdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG5ld1NoYXBlLCB4LmR0eXBlKTtcbiAgICAgIGNvbnN0IG1heElucHV0RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICAgIG1heElucHV0RGF0YS52YWx1ZXMgPSBtYXhJbnB1dFZhbHVlcztcbiAgICB9IGVsc2Uge1xuICAgICAgbWF4SW5wdXQgPSB0cmFuc3Bvc2VJbXBsKHgsIHBlcm11dGVkQXhlcywgYmFja2VuZCk7XG4gICAgfVxuXG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4UmFuayk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21heCcsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW21heE91dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMobWF4SW5wdXQuc2hhcGUsIGF4ZXMpO1xuXG4gIGxldCBvdXRTaGFwZSA9IG1heE91dFNoYXBlO1xuICBpZiAoa2VlcERpbXMpIHtcbiAgICAvLyByYXRoZXIgdGhhbiByZXNoYXBlIGF0IHRoZSBlbmQsIHNldCB0aGUgdGFyZ2V0IHNoYXBlIGhlcmUuXG4gICAgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWF4T3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgfVxuXG4gIGxldCBvdXQ7XG4gIGlmIChzaG91bGRFeGVjdXRlT25DUFUpIHtcbiAgICBjb25zdCB4VGV4RGF0YSA9IGJhY2tlbmQudGV4RGF0YS5nZXQobWF4SW5wdXQuZGF0YUlkKTtcbiAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgIGNvbnN0IG91dFZhbHVlcyA9XG4gICAgICAgIG1heEltcGxDUFUodmFsdWVzLCB1dGlsLnNpemVGcm9tU2hhcGUocmVkdWNlU2hhcGUpLCBvdXRTaGFwZSwgeC5kdHlwZSk7XG5cbiAgICBvdXQgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dFNoYXBlLCB4LmR0eXBlKTtcbiAgICBjb25zdCBvdXREYXRhID0gYmFja2VuZC50ZXhEYXRhLmdldChvdXQuZGF0YUlkKTtcbiAgICBvdXREYXRhLnZhbHVlcyA9IG91dFZhbHVlcztcbiAgfSBlbHNlIHtcbiAgICBvdXQgPSBtYXhJbXBsKG1heElucHV0LCByZWR1Y2VTaGFwZSwgb3V0U2hhcGUsIGJhY2tlbmQpO1xuICB9XG5cbiAgaWYgKG1heElucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhJbnB1dCk7XG4gIH1cblxuICByZXR1cm4gb3V0O1xufVxuXG5leHBvcnQgY29uc3QgbWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Maximum } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET } from '../binaryop_gpu';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { maximumImplCPU } from '../kernel_utils/shared';\nconst MAXIMUM = CHECK_NAN_SNIPPET + `\n  return max(a, b);\n`;\nconst MAXIMUM_PACKED = `\n  vec4 result = vec4(max(a, b));\n  bvec4 isNaNA = isnan(a);\n  bvec4 isNaNB = isnan(b);\n  bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n  ` +\n    CHECK_NAN_SNIPPET_PACKED + `\n  return result;\n`;\nexport const maximum = binaryKernelFunc({\n    opSnippet: MAXIMUM,\n    packedOpSnippet: MAXIMUM_PACKED,\n    cpuKernelImpl: maximumImplCPU\n});\nexport const maximumConfig = {\n    kernelName: Maximum,\n    backendName: 'webgl',\n    kernelFunc: maximum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4aW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NYXhpbXVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixHQUFHOztDQUVuQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7O0dBS3BCO0lBQ0Msd0JBQXdCLEdBQUc7O0NBRTlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7SUFDdEMsU0FBUyxFQUFFLE9BQU87SUFDbEIsZUFBZSxFQUFFLGNBQWM7SUFDL0IsYUFBYSxFQUFFLGNBQWM7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heGltdW19IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1BBQ0tFRH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHttYXhpbXVtSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IE1BWElNVU0gPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuIG1heChhLCBiKTtcbmA7XG5cbmNvbnN0IE1BWElNVU1fUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHZlYzQobWF4KGEsIGIpKTtcbiAgYnZlYzQgaXNOYU5BID0gaXNuYW4oYSk7XG4gIGJ2ZWM0IGlzTmFOQiA9IGlzbmFuKGIpO1xuICBidmVjNCBpc05hTiA9IGJ2ZWM0KGlzTmFOQS54IHx8IGlzTmFOQi54LCBpc05hTkEueSB8fCBpc05hTkIueSwgaXNOYU5BLnogfHwgaXNOYU5CLnosIGlzTmFOQS53IHx8IGlzTmFOQi53KTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IG1heGltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBNQVhJTVVNLFxuICBwYWNrZWRPcFNuaXBwZXQ6IE1BWElNVU1fUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBtYXhpbXVtSW1wbENQVVxufSk7XG5cbmV4cG9ydCBjb25zdCBtYXhpbXVtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heGltdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtYXhpbXVtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool, util } from '@tensorflow/tfjs-core';\nimport { Pool2DProgram } from '../pool_gpu';\nimport { assertNotComplex } from '../webgl_util';\nimport { identity } from './Identity';\nexport function maxPool(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    assertNotComplex(x, 'maxPool');\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    const dilations = 1;\n    util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' +\n        `Got strides ${strides} and dilations '${dilations}'`);\n    const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n    if (convInfo.filterWidth === 1 && convInfo.filterHeight === 1 &&\n        util.arraysEqual(convInfo.inShape, convInfo.outShape)) {\n        return identity({ inputs: { x }, backend });\n    }\n    const maxPoolProgram = new Pool2DProgram(convInfo, 'max', false);\n    return backend.runWebGLProgram(maxPoolProgram, [x], x.dtype);\n}\nexport const maxPoolConfig = {\n    kernelName: MaxPool,\n    backendName: 'webgl',\n    kernelFunc: maxPool\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NYXhQb29sLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQTRCLE9BQU8sRUFBMkMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUMxQyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDL0MsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUVwQyxNQUFNLFVBQVUsT0FBTyxDQUFDLElBSXZCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBQy9CLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBRXBCLElBQUksQ0FBQyxNQUFNLENBQ1AsWUFBWSxDQUFDLDhCQUE4QixDQUFDLE9BQU8sRUFBRSxTQUFTLENBQUMsRUFDL0QsR0FBRyxFQUFFLENBQUMsMkRBQTJEO1FBQzdELGVBQWUsT0FBTyxtQkFBbUIsU0FBUyxHQUFHLENBQUMsQ0FBQztJQUUvRCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUF5QyxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ2hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDckMsSUFBSSxRQUFRLENBQUMsV0FBVyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsWUFBWSxLQUFLLENBQUM7UUFDekQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRTtRQUN6RCxPQUFPLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7S0FDekM7SUFDRCxNQUFNLGNBQWMsR0FBRyxJQUFJLGFBQWEsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDL0QsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBaUI7SUFDekMsVUFBVSxFQUFFLE9BQU87SUFDbkIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE9BQTJCO0NBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNYXhQb29sLCBNYXhQb29sQXR0cnMsIE1heFBvb2xJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Bvb2wyRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcbmltcG9ydCB7YXNzZXJ0Tm90Q29tcGxleH0gZnJvbSAnLi4vd2ViZ2xfdXRpbCc7XG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2woYXJnczoge1xuICBpbnB1dHM6IE1heFBvb2xJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBNYXhQb29sQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBhc3NlcnROb3RDb21wbGV4KHgsICdtYXhQb29sJyk7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcbiAgY29uc3QgZGlsYXRpb25zID0gMTtcblxuICB1dGlsLmFzc2VydChcbiAgICAgIGJhY2tlbmRfdXRpbC5laXRoZXJTdHJpZGVzT3JEaWxhdGlvbnNBcmVPbmUoc3RyaWRlcywgZGlsYXRpb25zKSxcbiAgICAgICgpID0+ICdFcnJvciBpbiBtYXhQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICBgR290IHN0cmlkZXMgJHtzdHJpZGVzfSBhbmQgZGlsYXRpb25zICcke2RpbGF0aW9uc30nYCk7XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wyREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgZGlsYXRpb25zLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGlmIChjb252SW5mby5maWx0ZXJXaWR0aCA9PT0gMSAmJiBjb252SW5mby5maWx0ZXJIZWlnaHQgPT09IDEgJiZcbiAgICAgIHV0aWwuYXJyYXlzRXF1YWwoY29udkluZm8uaW5TaGFwZSwgY29udkluZm8ub3V0U2hhcGUpKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9XG4gIGNvbnN0IG1heFBvb2xQcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdtYXgnLCBmYWxzZSk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2xDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2wgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool3D } from '@tensorflow/tfjs-core';\nimport { Pool3DProgram } from '../pool_gpu';\nexport function maxPool3d(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { filterSize, strides, pad, dataFormat, dimRoundingMode } = attrs;\n    const dilations = [1, 1, 1];\n    const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode, dataFormat);\n    const maxPoolProgram = new Pool3DProgram(convInfo, 'max', false);\n    return backend.runWebGLProgram(maxPoolProgram, [x], x.dtype);\n}\nexport const maxPool3DConfig = {\n    kernelName: MaxPool3D,\n    backendName: 'webgl',\n    kernelFunc: maxPool3d\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNELmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01heFBvb2wzRC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixTQUFTLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUUxQyxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDdEUsTUFBTSxTQUFTLEdBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUFpRCxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ3hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pELE1BQU0sY0FBYyxHQUFHLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUMvRCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2wzRCwgTWF4UG9vbDNEQXR0cnMsIE1heFBvb2wzRElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UG9vbDNEUHJvZ3JhbX0gZnJvbSAnLi4vcG9vbF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbDNkKGFyZ3M6IHtcbiAgaW5wdXRzOiBNYXhQb29sM0RJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBNYXhQb29sM0RBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtmaWx0ZXJTaXplLCBzdHJpZGVzLCBwYWQsIGRhdGFGb3JtYXQsIGRpbVJvdW5kaW5nTW9kZX0gPSBhdHRycztcbiAgY29uc3QgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gPSBbMSwgMSwgMV07XG5cbiAgY29uc3QgY29udkluZm8gPSBiYWNrZW5kX3V0aWwuY29tcHV0ZVBvb2wzREluZm8oXG4gICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGZpbHRlclNpemUsIHN0cmlkZXMsXG4gICAgICBkaWxhdGlvbnMsIHBhZCwgZGltUm91bmRpbmdNb2RlLCBkYXRhRm9ybWF0KTtcbiAgY29uc3QgbWF4UG9vbFByb2dyYW0gPSBuZXcgUG9vbDNEUHJvZ3JhbShjb252SW5mbywgJ21heCcsIGZhbHNlKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKG1heFBvb2xQcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgbWF4UG9vbDNEQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heFBvb2wzRCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2wzZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class MaxPool2DBackpropProgram {\n    constructor(convInfo) {\n        this.variableNames = ['dy', 'maxPos'];\n        this.outputShape = convInfo.inShape;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const dilationHeight = convInfo.dilationHeight;\n        const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n        const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n        const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n        const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n        const lastIndex = effectiveFilterHeight * effectiveFilterWidth - 1;\n        this.userCode = `\n      const ivec2 pads = ivec2(${padTop}, ${padLeft});\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int d = coords[3];\n\n        ivec2 dyRCCorner = coords.yz - pads;\n        int dyRCorner = dyRCCorner.x;\n        int dyCCorner = dyRCCorner.y;\n\n        // Convolve dy(?, ?, d) with pos mask(:, :, d) to get dx(xR, xC, d).\n        // ? = to be determined. : = across all values in that axis.\n        float dotProd = 0.0;\n        for (int wR = 0; wR < ${effectiveFilterHeight};\n          wR += ${dilationHeight}) {\n          float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n          if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 || fract(dyR) > 0.0) {\n            continue;\n          }\n          int idyR = int(dyR);\n\n          for (int wC = 0; wC < ${effectiveFilterWidth}; wC++) {\n            float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n            if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n                fract(dyC) > 0.0) {\n              continue;\n            }\n            int idyC = int(dyC);\n\n            float dyValue = getDy(b, idyR, idyC, d);\n            int maxPosValue = ${lastIndex} - int(getMaxPos(b, idyR, idyC, d));\n\n            // Get the current value, check it against the value from the\n            // position matrix.\n            int curPosValue = wR * ${effectiveFilterWidth} + wC;\n            float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n            dotProd += dyValue * mask;\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\nexport class MaxPool3DBackpropProgram {\n    constructor(convInfo) {\n        this.variableNames = ['dy', 'maxPos'];\n        this.outputShape = convInfo.inShape;\n        const strideDepth = convInfo.strideDepth;\n        const strideHeight = convInfo.strideHeight;\n        const strideWidth = convInfo.strideWidth;\n        const dilationDepth = convInfo.dilationDepth;\n        const dilationHeight = convInfo.dilationHeight;\n        const dilationWidth = convInfo.dilationWidth;\n        const effectiveFilterDepth = convInfo.effectiveFilterDepth;\n        const effectiveFilterHeight = convInfo.effectiveFilterHeight;\n        const effectiveFilterWidth = convInfo.effectiveFilterWidth;\n        const padFront = effectiveFilterDepth - 1 - convInfo.padInfo.front;\n        const padTop = effectiveFilterHeight - 1 - convInfo.padInfo.top;\n        const padLeft = effectiveFilterWidth - 1 - convInfo.padInfo.left;\n        const lastIndex = effectiveFilterDepth * effectiveFilterHeight * effectiveFilterWidth - 1;\n        this.userCode = `\n      const ivec3 pads = ivec3(${padFront}, ${padTop}, ${padLeft});\n\n      void main() {\n        ivec5 coords = getOutputCoords();\n        int batch = coords.x;\n        int ch = coords.u;\n\n        ivec3 dyCorner = ivec3(coords.y, coords.z, coords.w) - pads;\n        int dyDCorner = dyCorner.x;\n        int dyRCorner = dyCorner.y;\n        int dyCCorner = dyCorner.z;\n\n        // Convolve dy(?, ?, ?, ch) with pos mask(:, :, :, d) to get\n        // dx(xD, xR, xC, ch).\n        // ? = to be determined. : = across all values in that axis.\n        float dotProd = 0.0;\n\n        for (int wD = 0; wD < ${effectiveFilterDepth};\n           wD += ${dilationDepth}) {\n          float dyD = float(dyDCorner + wD) / ${strideDepth}.0;\n\n          if (dyD < 0.0 || dyD >= ${convInfo.outDepth}.0 || fract(dyD) > 0.0) {\n            continue;\n          }\n          int idyD = int(dyD);\n\n          for (int wR = 0; wR < ${effectiveFilterHeight};\n              wR += ${dilationHeight}) {\n            float dyR = float(dyRCorner + wR) / ${strideHeight}.0;\n\n            if (dyR < 0.0 || dyR >= ${convInfo.outHeight}.0 ||\n                fract(dyR) > 0.0) {\n              continue;\n            }\n            int idyR = int(dyR);\n\n            for (int wC = 0; wC < ${effectiveFilterWidth};\n                wC += ${dilationWidth}) {\n              float dyC = float(dyCCorner + wC) / ${strideWidth}.0;\n\n              if (dyC < 0.0 || dyC >= ${convInfo.outWidth}.0 ||\n                  fract(dyC) > 0.0) {\n                continue;\n              }\n              int idyC = int(dyC);\n\n              float dyValue = getDy(batch, idyD, idyR, idyC, ch);\n              int maxPosValue = ${lastIndex} -\n                  int(getMaxPos(batch, idyD, idyR, idyC, ch));\n\n              // Get the current value, check it against the value from the\n              // position matrix.\n              int curPosValue =\n                  wD * ${effectiveFilterHeight} * ${effectiveFilterWidth} +\n                  wR * ${effectiveFilterWidth} + wC;\n              float mask = float(maxPosValue == curPosValue ? 1.0 : 0.0);\n\n              dotProd += dyValue * mask;\n            }\n          }\n        }\n        setOutput(dotProd);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWF4X3Bvb2xfYmFja3Byb3BfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9tYXhfcG9vbF9iYWNrcHJvcF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLHdCQUF3QjtJQUtuQyxZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFLL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3BDLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxZQUFZLENBQUM7UUFDM0MsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLFdBQVcsQ0FBQztRQUN6QyxNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsY0FBYyxDQUFDO1FBQy9DLE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1FBQzdELE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBRTNELE1BQU0sTUFBTSxHQUFHLHFCQUFxQixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxvQkFBb0IsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUM7UUFFakUsTUFBTSxTQUFTLEdBQUcscUJBQXFCLEdBQUcsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBQ25FLElBQUksQ0FBQyxRQUFRLEdBQUc7aUNBQ2EsTUFBTSxLQUFLLE9BQU87Ozs7Ozs7Ozs7Ozs7O2dDQWNuQixxQkFBcUI7a0JBQ25DLGNBQWM7Z0RBQ2dCLFlBQVk7O29DQUV4QixRQUFRLENBQUMsU0FBUzs7Ozs7a0NBS3BCLG9CQUFvQjtrREFDSixXQUFXOztzQ0FFdkIsUUFBUSxDQUFDLFFBQVE7Ozs7Ozs7Z0NBT3ZCLFNBQVM7Ozs7cUNBSUosb0JBQW9COzs7Ozs7OztLQVFwRCxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHdCQUF3QjtJQUtuQyxZQUFZLFFBQWlDO1FBSjdDLGtCQUFhLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFLL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDO1FBQ3BDLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLENBQUM7UUFDekMsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLFlBQVksQ0FBQztRQUMzQyxNQUFNLFdBQVcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQ3pDLE1BQU0sYUFBYSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7UUFDN0MsTUFBTSxjQUFjLEdBQUcsUUFBUSxDQUFDLGNBQWMsQ0FBQztRQUMvQyxNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDO1FBQzdDLE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBQzNELE1BQU0scUJBQXFCLEdBQUcsUUFBUSxDQUFDLHFCQUFxQixDQUFDO1FBQzdELE1BQU0sb0JBQW9CLEdBQUcsUUFBUSxDQUFDLG9CQUFvQixDQUFDO1FBRTNELE1BQU0sUUFBUSxHQUFHLG9CQUFvQixHQUFHLENBQUMsR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztRQUNuRSxNQUFNLE1BQU0sR0FBRyxxQkFBcUIsR0FBRyxDQUFDLEdBQUcsUUFBUSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDaEUsTUFBTSxPQUFPLEdBQUcsb0JBQW9CLEdBQUcsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1FBRWpFLE1BQU0sU0FBUyxHQUNYLG9CQUFvQixHQUFHLHFCQUFxQixHQUFHLG9CQUFvQixHQUFHLENBQUMsQ0FBQztRQUM1RSxJQUFJLENBQUMsUUFBUSxHQUFHO2lDQUNhLFFBQVEsS0FBSyxNQUFNLEtBQUssT0FBTzs7Ozs7Ozs7Ozs7Ozs7Ozs7Z0NBaUJoQyxvQkFBb0I7bUJBQ2pDLGFBQWE7Z0RBQ2dCLFdBQVc7O29DQUV2QixRQUFRLENBQUMsUUFBUTs7Ozs7a0NBS25CLHFCQUFxQjtzQkFDakMsY0FBYztrREFDYyxZQUFZOztzQ0FFeEIsUUFBUSxDQUFDLFNBQVM7Ozs7OztvQ0FNcEIsb0JBQW9CO3dCQUNoQyxhQUFhO29EQUNlLFdBQVc7O3dDQUV2QixRQUFRLENBQUMsUUFBUTs7Ozs7OztrQ0FPdkIsU0FBUzs7Ozs7O3lCQU1sQixxQkFBcUIsTUFBTSxvQkFBb0I7eUJBQy9DLG9CQUFvQjs7Ozs7Ozs7O0tBU3hDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBNYXhQb29sMkRCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeScsICdtYXhQb3MnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjJESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgIGNvbnN0IHN0cmlkZUhlaWdodCA9IGNvbnZJbmZvLnN0cmlkZUhlaWdodDtcbiAgICBjb25zdCBzdHJpZGVXaWR0aCA9IGNvbnZJbmZvLnN0cmlkZVdpZHRoO1xuICAgIGNvbnN0IGRpbGF0aW9uSGVpZ2h0ID0gY29udkluZm8uZGlsYXRpb25IZWlnaHQ7XG4gICAgY29uc3QgZWZmZWN0aXZlRmlsdGVySGVpZ2h0ID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVySGVpZ2h0O1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlcldpZHRoID0gY29udkluZm8uZWZmZWN0aXZlRmlsdGVyV2lkdGg7XG5cbiAgICBjb25zdCBwYWRUb3AgPSBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgLSAxIC0gY29udkluZm8ucGFkSW5mby50b3A7XG4gICAgY29uc3QgcGFkTGVmdCA9IGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMSAtIGNvbnZJbmZvLnBhZEluZm8ubGVmdDtcblxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAqIGVmZmVjdGl2ZUZpbHRlcldpZHRoIC0gMTtcbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgaXZlYzIgcGFkcyA9IGl2ZWMyKCR7cGFkVG9wfSwgJHtwYWRMZWZ0fSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcblxuICAgICAgICBpdmVjMiBkeVJDQ29ybmVyID0gY29vcmRzLnl6IC0gcGFkcztcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5UkNDb3JuZXIueDtcbiAgICAgICAgaW50IGR5Q0Nvcm5lciA9IGR5UkNDb3JuZXIueTtcblxuICAgICAgICAvLyBDb252b2x2ZSBkeSg/LCA/LCBkKSB3aXRoIHBvcyBtYXNrKDosIDosIGQpIHRvIGdldCBkeCh4UiwgeEMsIGQpLlxuICAgICAgICAvLyA/ID0gdG8gYmUgZGV0ZXJtaW5lZC4gOiA9IGFjcm9zcyBhbGwgdmFsdWVzIGluIHRoYXQgYXhpcy5cbiAgICAgICAgZmxvYXQgZG90UHJvZCA9IDAuMDtcbiAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fTtcbiAgICAgICAgICB3UiArPSAke2RpbGF0aW9uSGVpZ2h0fSkge1xuICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgaWYgKGR5UiA8IDAuMCB8fCBkeVIgPj0gJHtjb252SW5mby5vdXRIZWlnaHR9LjAgfHwgZnJhY3QoZHlSKSA+IDAuMCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGludCBpZHlSID0gaW50KGR5Uik7XG5cbiAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07IHdDKyspIHtcbiAgICAgICAgICAgIGZsb2F0IGR5QyA9IGZsb2F0KGR5Q0Nvcm5lciArIHdDKSAvICR7c3RyaWRlV2lkdGh9LjA7XG5cbiAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICBmcmFjdChkeUMpID4gMC4wKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaW50IGlkeUMgPSBpbnQoZHlDKTtcblxuICAgICAgICAgICAgZmxvYXQgZHlWYWx1ZSA9IGdldER5KGIsIGlkeVIsIGlkeUMsIGQpO1xuICAgICAgICAgICAgaW50IG1heFBvc1ZhbHVlID0gJHtsYXN0SW5kZXh9IC0gaW50KGdldE1heFBvcyhiLCBpZHlSLCBpZHlDLCBkKSk7XG5cbiAgICAgICAgICAgIC8vIEdldCB0aGUgY3VycmVudCB2YWx1ZSwgY2hlY2sgaXQgYWdhaW5zdCB0aGUgdmFsdWUgZnJvbSB0aGVcbiAgICAgICAgICAgIC8vIHBvc2l0aW9uIG1hdHJpeC5cbiAgICAgICAgICAgIGludCBjdXJQb3NWYWx1ZSA9IHdSICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gKyB3QztcbiAgICAgICAgICAgIGZsb2F0IG1hc2sgPSBmbG9hdChtYXhQb3NWYWx1ZSA9PSBjdXJQb3NWYWx1ZSA/IDEuMCA6IDAuMCk7XG5cbiAgICAgICAgICAgIGRvdFByb2QgKz0gZHlWYWx1ZSAqIG1hc2s7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBNYXhQb29sM0RCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeScsICdtYXhQb3MnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKGNvbnZJbmZvOiBiYWNrZW5kX3V0aWwuQ29udjNESW5mbykge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBjb252SW5mby5pblNoYXBlO1xuICAgIGNvbnN0IHN0cmlkZURlcHRoID0gY29udkluZm8uc3RyaWRlRGVwdGg7XG4gICAgY29uc3Qgc3RyaWRlSGVpZ2h0ID0gY29udkluZm8uc3RyaWRlSGVpZ2h0O1xuICAgIGNvbnN0IHN0cmlkZVdpZHRoID0gY29udkluZm8uc3RyaWRlV2lkdGg7XG4gICAgY29uc3QgZGlsYXRpb25EZXB0aCA9IGNvbnZJbmZvLmRpbGF0aW9uRGVwdGg7XG4gICAgY29uc3QgZGlsYXRpb25IZWlnaHQgPSBjb252SW5mby5kaWxhdGlvbkhlaWdodDtcbiAgICBjb25zdCBkaWxhdGlvbldpZHRoID0gY29udkluZm8uZGlsYXRpb25XaWR0aDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJEZXB0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckRlcHRoO1xuICAgIGNvbnN0IGVmZmVjdGl2ZUZpbHRlckhlaWdodCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlckhlaWdodDtcbiAgICBjb25zdCBlZmZlY3RpdmVGaWx0ZXJXaWR0aCA9IGNvbnZJbmZvLmVmZmVjdGl2ZUZpbHRlcldpZHRoO1xuXG4gICAgY29uc3QgcGFkRnJvbnQgPSBlZmZlY3RpdmVGaWx0ZXJEZXB0aCAtIDEgLSBjb252SW5mby5wYWRJbmZvLmZyb250O1xuICAgIGNvbnN0IHBhZFRvcCA9IGVmZmVjdGl2ZUZpbHRlckhlaWdodCAtIDEgLSBjb252SW5mby5wYWRJbmZvLnRvcDtcbiAgICBjb25zdCBwYWRMZWZ0ID0gZWZmZWN0aXZlRmlsdGVyV2lkdGggLSAxIC0gY29udkluZm8ucGFkSW5mby5sZWZ0O1xuXG4gICAgY29uc3QgbGFzdEluZGV4ID1cbiAgICAgICAgZWZmZWN0aXZlRmlsdGVyRGVwdGggKiBlZmZlY3RpdmVGaWx0ZXJIZWlnaHQgKiBlZmZlY3RpdmVGaWx0ZXJXaWR0aCAtIDE7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IGl2ZWMzIHBhZHMgPSBpdmVjMygke3BhZEZyb250fSwgJHtwYWRUb3B9LCAke3BhZExlZnR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjNSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzLng7XG4gICAgICAgIGludCBjaCA9IGNvb3Jkcy51O1xuXG4gICAgICAgIGl2ZWMzIGR5Q29ybmVyID0gaXZlYzMoY29vcmRzLnksIGNvb3Jkcy56LCBjb29yZHMudykgLSBwYWRzO1xuICAgICAgICBpbnQgZHlEQ29ybmVyID0gZHlDb3JuZXIueDtcbiAgICAgICAgaW50IGR5UkNvcm5lciA9IGR5Q29ybmVyLnk7XG4gICAgICAgIGludCBkeUNDb3JuZXIgPSBkeUNvcm5lci56O1xuXG4gICAgICAgIC8vIENvbnZvbHZlIGR5KD8sID8sID8sIGNoKSB3aXRoIHBvcyBtYXNrKDosIDosIDosIGQpIHRvIGdldFxuICAgICAgICAvLyBkeCh4RCwgeFIsIHhDLCBjaCkuXG4gICAgICAgIC8vID8gPSB0byBiZSBkZXRlcm1pbmVkLiA6ID0gYWNyb3NzIGFsbCB2YWx1ZXMgaW4gdGhhdCBheGlzLlxuICAgICAgICBmbG9hdCBkb3RQcm9kID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IHdEID0gMDsgd0QgPCAke2VmZmVjdGl2ZUZpbHRlckRlcHRofTtcbiAgICAgICAgICAgd0QgKz0gJHtkaWxhdGlvbkRlcHRofSkge1xuICAgICAgICAgIGZsb2F0IGR5RCA9IGZsb2F0KGR5RENvcm5lciArIHdEKSAvICR7c3RyaWRlRGVwdGh9LjA7XG5cbiAgICAgICAgICBpZiAoZHlEIDwgMC4wIHx8IGR5RCA+PSAke2NvbnZJbmZvLm91dERlcHRofS4wIHx8IGZyYWN0KGR5RCkgPiAwLjApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpbnQgaWR5RCA9IGludChkeUQpO1xuXG4gICAgICAgICAgZm9yIChpbnQgd1IgPSAwOyB3UiA8ICR7ZWZmZWN0aXZlRmlsdGVySGVpZ2h0fTtcbiAgICAgICAgICAgICAgd1IgKz0gJHtkaWxhdGlvbkhlaWdodH0pIHtcbiAgICAgICAgICAgIGZsb2F0IGR5UiA9IGZsb2F0KGR5UkNvcm5lciArIHdSKSAvICR7c3RyaWRlSGVpZ2h0fS4wO1xuXG4gICAgICAgICAgICBpZiAoZHlSIDwgMC4wIHx8IGR5UiA+PSAke2NvbnZJbmZvLm91dEhlaWdodH0uMCB8fFxuICAgICAgICAgICAgICAgIGZyYWN0KGR5UikgPiAwLjApIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpbnQgaWR5UiA9IGludChkeVIpO1xuXG4gICAgICAgICAgICBmb3IgKGludCB3QyA9IDA7IHdDIDwgJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH07XG4gICAgICAgICAgICAgICAgd0MgKz0gJHtkaWxhdGlvbldpZHRofSkge1xuICAgICAgICAgICAgICBmbG9hdCBkeUMgPSBmbG9hdChkeUNDb3JuZXIgKyB3QykgLyAke3N0cmlkZVdpZHRofS4wO1xuXG4gICAgICAgICAgICAgIGlmIChkeUMgPCAwLjAgfHwgZHlDID49ICR7Y29udkluZm8ub3V0V2lkdGh9LjAgfHxcbiAgICAgICAgICAgICAgICAgIGZyYWN0KGR5QykgPiAwLjApIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpbnQgaWR5QyA9IGludChkeUMpO1xuXG4gICAgICAgICAgICAgIGZsb2F0IGR5VmFsdWUgPSBnZXREeShiYXRjaCwgaWR5RCwgaWR5UiwgaWR5QywgY2gpO1xuICAgICAgICAgICAgICBpbnQgbWF4UG9zVmFsdWUgPSAke2xhc3RJbmRleH0gLVxuICAgICAgICAgICAgICAgICAgaW50KGdldE1heFBvcyhiYXRjaCwgaWR5RCwgaWR5UiwgaWR5QywgY2gpKTtcblxuICAgICAgICAgICAgICAvLyBHZXQgdGhlIGN1cnJlbnQgdmFsdWUsIGNoZWNrIGl0IGFnYWluc3QgdGhlIHZhbHVlIGZyb20gdGhlXG4gICAgICAgICAgICAgIC8vIHBvc2l0aW9uIG1hdHJpeC5cbiAgICAgICAgICAgICAgaW50IGN1clBvc1ZhbHVlID1cbiAgICAgICAgICAgICAgICAgIHdEICogJHtlZmZlY3RpdmVGaWx0ZXJIZWlnaHR9ICogJHtlZmZlY3RpdmVGaWx0ZXJXaWR0aH0gK1xuICAgICAgICAgICAgICAgICAgd1IgKiAke2VmZmVjdGl2ZUZpbHRlcldpZHRofSArIHdDO1xuICAgICAgICAgICAgICBmbG9hdCBtYXNrID0gZmxvYXQobWF4UG9zVmFsdWUgPT0gY3VyUG9zVmFsdWUgPyAxLjAgOiAwLjApO1xuXG4gICAgICAgICAgICAgIGRvdFByb2QgKz0gZHlWYWx1ZSAqIG1hc2s7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dChkb3RQcm9kKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPool3DGrad } from '@tensorflow/tfjs-core';\nimport { MaxPool3DBackpropProgram } from '../max_pool_backprop_gpu';\nimport { Pool3DProgram } from '../pool_gpu';\nexport function maxPool3DGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, input } = inputs;\n    const x = input;\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    const dilations = [1, 1, 1];\n    const convInfo = backend_util.computePool3DInfo(x.shape, filterSize, strides, dilations, pad, dimRoundingMode);\n    const maxPool3dPositionsProgram = new Pool3DProgram(convInfo, 'max', true /* get positions */);\n    const maxPool3dPositions = backend.runWebGLProgram(maxPool3dPositionsProgram, [x], x.dtype);\n    const maxPoolBackpropProgram = new MaxPool3DBackpropProgram(convInfo);\n    const result = backend.runWebGLProgram(maxPoolBackpropProgram, [dy, maxPool3dPositions], x.dtype);\n    backend.disposeIntermediateTensorInfo(maxPool3dPositions);\n    return result;\n}\nexport const maxPool3DGradConfig = {\n    kernelName: MaxPool3DGrad,\n    backendName: 'webgl',\n    kernelFunc: maxPool3DGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbDNER3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NYXhQb29sM0RHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBQyxZQUFZLEVBQTRCLGFBQWEsRUFBc0QsTUFBTSx1QkFBdUIsQ0FBQztBQUdqSixPQUFPLEVBQUMsd0JBQXdCLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQztBQUNsRSxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRTFDLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFJN0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0IsTUFBTSxDQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ2hCLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxlQUFlLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDMUQsTUFBTSxTQUFTLEdBQTZCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxZQUFZLENBQUMsaUJBQWlCLENBQzNDLENBQUMsQ0FBQyxLQUFpRCxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQ3hFLFNBQVMsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFFckMsTUFBTSx5QkFBeUIsR0FDM0IsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLENBQUMsbUJBQW1CLENBQUMsQ0FBQztJQUNqRSxNQUFNLGtCQUFrQixHQUNwQixPQUFPLENBQUMsZUFBZSxDQUFDLHlCQUF5QixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3JFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUN0RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUNsQyxzQkFBc0IsRUFBRSxDQUFDLEVBQUUsRUFBRSxrQkFBa0IsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUMvRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztJQUMxRCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTWF4UG9vbDNER3JhZCwgTWF4UG9vbDNER3JhZEF0dHJzLCBNYXhQb29sM0RHcmFkSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtNYXhQb29sM0RCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL21heF9wb29sX2JhY2twcm9wX2dwdSc7XG5pbXBvcnQge1Bvb2wzRFByb2dyYW19IGZyb20gJy4uL3Bvb2xfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIG1heFBvb2wzREdyYWQoYXJnczoge1xuICBpbnB1dHM6IE1heFBvb2wzREdyYWRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBNYXhQb29sM0RHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2R5LCBpbnB1dH0gPSBpbnB1dHM7XG4gIGNvbnN0IHggPSBpbnB1dDtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuICBjb25zdCBkaWxhdGlvbnM6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSA9IFsxLCAxLCAxXTtcblxuICBjb25zdCBjb252SW5mbyA9IGJhY2tlbmRfdXRpbC5jb21wdXRlUG9vbDNESW5mbyhcbiAgICAgIHguc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIGRpbGF0aW9ucywgcGFkLCBkaW1Sb3VuZGluZ01vZGUpO1xuXG4gIGNvbnN0IG1heFBvb2wzZFBvc2l0aW9uc1Byb2dyYW0gPVxuICAgICAgbmV3IFBvb2wzRFByb2dyYW0oY29udkluZm8sICdtYXgnLCB0cnVlIC8qIGdldCBwb3NpdGlvbnMgKi8pO1xuICBjb25zdCBtYXhQb29sM2RQb3NpdGlvbnMgPVxuICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWF4UG9vbDNkUG9zaXRpb25zUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgY29uc3QgbWF4UG9vbEJhY2twcm9wUHJvZ3JhbSA9IG5ldyBNYXhQb29sM0RCYWNrcHJvcFByb2dyYW0oY29udkluZm8pO1xuICBjb25zdCByZXN1bHQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIG1heFBvb2xCYWNrcHJvcFByb2dyYW0sIFtkeSwgbWF4UG9vbDNkUG9zaXRpb25zXSwgeC5kdHlwZSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4UG9vbDNkUG9zaXRpb25zKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IG1heFBvb2wzREdyYWRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTWF4UG9vbDNER3JhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2wzREdyYWQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, MaxPoolGrad } from '@tensorflow/tfjs-core';\nimport { MaxPool2DBackpropProgram } from '../max_pool_backprop_gpu';\nimport { Pool2DProgram } from '../pool_gpu';\nimport { assertNotComplex } from '../webgl_util';\nexport function maxPoolGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { dy, input, output } = inputs;\n    const x = input;\n    assertNotComplex([input, output], 'maxPoolGrad');\n    const { filterSize, strides, pad, dimRoundingMode } = attrs;\n    const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, 1 /* dilations */, pad, dimRoundingMode);\n    const getPositions = true;\n    const maxPoolPositionsProgram = new Pool2DProgram(convInfo, 'max', getPositions);\n    const maxPoolPositions = backend.runWebGLProgram(maxPoolPositionsProgram, [x], x.dtype);\n    const maxPoolBackPropProgram = new MaxPool2DBackpropProgram(convInfo);\n    const result = backend.runWebGLProgram(maxPoolBackPropProgram, [dy, maxPoolPositions], x.dtype);\n    backend.disposeIntermediateTensorInfo(maxPoolPositions);\n    return result;\n}\nexport const maxPoolGradConfig = {\n    kernelName: MaxPoolGrad,\n    backendName: 'webgl',\n    kernelFunc: maxPoolGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbEdyYWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTWF4UG9vbEdyYWQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBQ0gsT0FBTyxFQUFDLFlBQVksRUFBNEIsV0FBVyxFQUFrRCxNQUFNLHVCQUF1QixDQUFDO0FBRzNJLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xFLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE1BQU0sVUFBVSxXQUFXLENBQUMsSUFJM0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEVBQUUsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25DLE1BQU0sQ0FBQyxHQUFHLEtBQUssQ0FBQztJQUNoQixnQkFBZ0IsQ0FBQyxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsRUFBRSxhQUFhLENBQUMsQ0FBQztJQUNqRCxNQUFNLEVBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxHQUFHLEVBQUUsZUFBZSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTFELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsQ0FBQyxDQUFDLGVBQWUsRUFBRSxHQUFHLEVBQUUsZUFBZSxDQUFDLENBQUM7SUFDN0MsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDO0lBQzFCLE1BQU0sdUJBQXVCLEdBQ3pCLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDckQsTUFBTSxnQkFBZ0IsR0FDbEIsT0FBTyxDQUFDLGVBQWUsQ0FBQyx1QkFBdUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUVuRSxNQUFNLHNCQUFzQixHQUFHLElBQUksd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDdEUsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FDbEMsc0JBQXNCLEVBQUUsQ0FBQyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFDLDZCQUE2QixDQUFDLGdCQUFnQixDQUFDLENBQUM7SUFDeEQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFpQjtJQUM3QyxVQUFVLEVBQUUsV0FBVztJQUN2QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsV0FBK0I7Q0FDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1heFBvb2xHcmFkLCBNYXhQb29sR3JhZEF0dHJzLCBNYXhQb29sR3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TWF4UG9vbDJEQmFja3Byb3BQcm9ncmFtfSBmcm9tICcuLi9tYXhfcG9vbF9iYWNrcHJvcF9ncHUnO1xuaW1wb3J0IHtQb29sMkRQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5pbXBvcnQge2Fzc2VydE5vdENvbXBsZXh9IGZyb20gJy4uL3dlYmdsX3V0aWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gbWF4UG9vbEdyYWQoYXJnczoge1xuICBpbnB1dHM6IE1heFBvb2xHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTWF4UG9vbEdyYWRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7ZHksIGlucHV0LCBvdXRwdXR9ID0gaW5wdXRzO1xuICBjb25zdCB4ID0gaW5wdXQ7XG4gIGFzc2VydE5vdENvbXBsZXgoW2lucHV0LCBvdXRwdXRdLCAnbWF4UG9vbEdyYWQnKTtcbiAgY29uc3Qge2ZpbHRlclNpemUsIHN0cmlkZXMsIHBhZCwgZGltUm91bmRpbmdNb2RlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgeC5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgZmlsdGVyU2l6ZSwgc3RyaWRlcyxcbiAgICAgIDEgLyogZGlsYXRpb25zICovLCBwYWQsIGRpbVJvdW5kaW5nTW9kZSk7XG4gIGNvbnN0IGdldFBvc2l0aW9ucyA9IHRydWU7XG4gIGNvbnN0IG1heFBvb2xQb3NpdGlvbnNQcm9ncmFtID1cbiAgICAgIG5ldyBQb29sMkRQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgZ2V0UG9zaXRpb25zKTtcbiAgY29uc3QgbWF4UG9vbFBvc2l0aW9uczogVGVuc29ySW5mbyA9XG4gICAgICBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShtYXhQb29sUG9zaXRpb25zUHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcblxuICBjb25zdCBtYXhQb29sQmFja1Byb3BQcm9ncmFtID0gbmV3IE1heFBvb2wyREJhY2twcm9wUHJvZ3JhbShjb252SW5mbyk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgbWF4UG9vbEJhY2tQcm9wUHJvZ3JhbSwgW2R5LCBtYXhQb29sUG9zaXRpb25zXSwgeC5kdHlwZSk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4UG9vbFBvc2l0aW9ucyk7XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmV4cG9ydCBjb25zdCBtYXhQb29sR3JhZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBNYXhQb29sR3JhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1heFBvb2xHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pool2DProgram } from '../pool_gpu';\nexport function maxPoolWithArgmaxImpl(x, includeBatchInIndex, convInfo, backend) {\n    let program = new Pool2DProgram(convInfo, 'max', false);\n    const poolOutput = backend.runWebGLProgram(program, [x], 'float32');\n    program = new Pool2DProgram(convInfo, 'max', true, true, includeBatchInIndex);\n    const indexOutput = backend.runWebGLProgram(program, [x], 'float32');\n    return [poolOutput, indexOutput];\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbFdpdGhBcmdtYXhfaW1wbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NYXhQb29sV2l0aEFyZ21heF9pbXBsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFMUMsTUFBTSxVQUFVLHFCQUFxQixDQUNqQyxDQUFhLEVBQUUsbUJBQTRCLEVBQzNDLFFBQWlDLEVBQ2pDLE9BQXlCO0lBQzNCLElBQUksT0FBTyxHQUFHLElBQUksYUFBYSxDQUFDLFFBQVEsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDeEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUVwRSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLG1CQUFtQixDQUFDLENBQUM7SUFDOUUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUNyRSxPQUFPLENBQUMsVUFBVSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0FBQ25DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtQb29sMkRQcm9ncmFtfSBmcm9tICcuLi9wb29sX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXhQb29sV2l0aEFyZ21heEltcGwoXG4gICAgeDogVGVuc29ySW5mbywgaW5jbHVkZUJhdGNoSW5JbmRleDogYm9vbGVhbixcbiAgICBjb252SW5mbzogYmFja2VuZF91dGlsLkNvbnYyREluZm8sXG4gICAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCk6IFRlbnNvckluZm9bXSB7XG4gIGxldCBwcm9ncmFtID0gbmV3IFBvb2wyRFByb2dyYW0oY29udkluZm8sICdtYXgnLCBmYWxzZSk7XG4gIGNvbnN0IHBvb2xPdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sICdmbG9hdDMyJyk7XG5cbiAgcHJvZ3JhbSA9IG5ldyBQb29sMkRQcm9ncmFtKGNvbnZJbmZvLCAnbWF4JywgdHJ1ZSwgdHJ1ZSwgaW5jbHVkZUJhdGNoSW5JbmRleCk7XG4gIGNvbnN0IGluZGV4T3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCAnZmxvYXQzMicpO1xuICByZXR1cm4gW3Bvb2xPdXRwdXQsIGluZGV4T3V0cHV0XTtcbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { MaxPoolWithArgmax } from '@tensorflow/tfjs-core';\nimport { backend_util, util } from '@tensorflow/tfjs-core';\nimport { maxPoolWithArgmaxImpl } from './MaxPoolWithArgmax_impl';\nexport const maxPoolWithArgmaxConfig = {\n    kernelName: MaxPoolWithArgmax,\n    backendName: 'webgl',\n    kernelFunc: ({ inputs, attrs, backend }) => {\n        const { x } = inputs;\n        const { filterSize, strides, pad, includeBatchInIndex } = attrs;\n        const webglBackend = backend;\n        util.assert(x.shape.length === 4, () => `Error in maxPool: input must be rank 4 but got rank ${x.shape.length}.`);\n        const dilations = [1, 1];\n        util.assert(backend_util.eitherStridesOrDilationsAreOne(strides, dilations), () => 'Error in maxPool: Either strides or dilations must be 1. ' +\n            `Got strides ${strides} and dilations '${dilations}'`);\n        const convInfo = backend_util.computePool2DInfo(x.shape, filterSize, strides, dilations, pad);\n        const [result, indexes] = maxPoolWithArgmaxImpl(x, includeBatchInIndex, convInfo, webglBackend);\n        return [result, indexes];\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWF4UG9vbFdpdGhBcmdtYXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTWF4UG9vbFdpdGhBcmdtYXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLGlCQUFpQixFQUFrRCxNQUFNLHVCQUF1QixDQUFDO0FBQ3pHLE9BQU8sRUFBQyxZQUFZLEVBQWdCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBSXZFLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBRS9ELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFpQjtJQUNuRCxVQUFVLEVBQUUsaUJBQWlCO0lBQzdCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxDQUFDLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUMsRUFBRSxFQUFFO1FBQ3ZDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFpQyxDQUFDO1FBQzlDLE1BQU0sRUFBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLEdBQUcsRUFBRSxtQkFBbUIsRUFBQyxHQUNqRCxLQUFxQyxDQUFDO1FBQzFDLE1BQU0sWUFBWSxHQUFHLE9BQTJCLENBQUM7UUFFakQsSUFBSSxDQUFDLE1BQU0sQ0FDUCxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQ3BCLEdBQUcsRUFBRSxDQUFDLHVEQUNGLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUMzQixNQUFNLFNBQVMsR0FBcUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLE1BQU0sQ0FDUCxZQUFZLENBQUMsOEJBQThCLENBQUMsT0FBTyxFQUFFLFNBQVMsQ0FBQyxFQUMvRCxHQUFHLEVBQUUsQ0FBQywyREFBMkQ7WUFDN0QsZUFBZSxPQUFPLG1CQUFtQixTQUFTLEdBQUcsQ0FBQyxDQUFDO1FBRS9ELE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxpQkFBaUIsQ0FDM0MsQ0FBQyxDQUFDLEtBQXlDLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFDaEUsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBRXBCLE1BQU0sQ0FBQyxNQUFNLEVBQUUsT0FBTyxDQUFDLEdBQ25CLHFCQUFxQixDQUFDLENBQUMsRUFBRSxtQkFBbUIsRUFBRSxRQUFRLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFDMUUsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMzQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtNYXhQb29sV2l0aEFyZ21heCwgTWF4UG9vbFdpdGhBcmdtYXhBdHRycywgTWF4UG9vbFdpdGhBcmdtYXhJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCB1dGlsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge21heFBvb2xXaXRoQXJnbWF4SW1wbH0gZnJvbSAnLi9NYXhQb29sV2l0aEFyZ21heF9pbXBsJztcblxuZXhwb3J0IGNvbnN0IG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1heFBvb2xXaXRoQXJnbWF4LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogKHtpbnB1dHMsIGF0dHJzLCBiYWNrZW5kfSkgPT4ge1xuICAgIGNvbnN0IHt4fSA9IGlucHV0cyBhcyBNYXhQb29sV2l0aEFyZ21heElucHV0cztcbiAgICBjb25zdCB7ZmlsdGVyU2l6ZSwgc3RyaWRlcywgcGFkLCBpbmNsdWRlQmF0Y2hJbkluZGV4fSA9XG4gICAgICAgIGF0dHJzIGFzIHt9IGFzIE1heFBvb2xXaXRoQXJnbWF4QXR0cnM7XG4gICAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZFdlYkdMO1xuXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHguc2hhcGUubGVuZ3RoID09PSA0LFxuICAgICAgICAoKSA9PiBgRXJyb3IgaW4gbWF4UG9vbDogaW5wdXQgbXVzdCBiZSByYW5rIDQgYnV0IGdvdCByYW5rICR7XG4gICAgICAgICAgICB4LnNoYXBlLmxlbmd0aH0uYCk7XG4gICAgY29uc3QgZGlsYXRpb25zOiBbbnVtYmVyLCBudW1iZXJdID0gWzEsIDFdO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBiYWNrZW5kX3V0aWwuZWl0aGVyU3RyaWRlc09yRGlsYXRpb25zQXJlT25lKHN0cmlkZXMsIGRpbGF0aW9ucyksXG4gICAgICAgICgpID0+ICdFcnJvciBpbiBtYXhQb29sOiBFaXRoZXIgc3RyaWRlcyBvciBkaWxhdGlvbnMgbXVzdCBiZSAxLiAnICtcbiAgICAgICAgICAgIGBHb3Qgc3RyaWRlcyAke3N0cmlkZXN9IGFuZCBkaWxhdGlvbnMgJyR7ZGlsYXRpb25zfSdgKTtcblxuICAgIGNvbnN0IGNvbnZJbmZvID0gYmFja2VuZF91dGlsLmNvbXB1dGVQb29sMkRJbmZvKFxuICAgICAgICB4LnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBmaWx0ZXJTaXplLCBzdHJpZGVzLFxuICAgICAgICBkaWxhdGlvbnMsIHBhZCk7XG5cbiAgICBjb25zdCBbcmVzdWx0LCBpbmRleGVzXSA9XG4gICAgICAgIG1heFBvb2xXaXRoQXJnbWF4SW1wbCh4LCBpbmNsdWRlQmF0Y2hJbkluZGV4LCBjb252SW5mbywgd2ViZ2xCYWNrZW5kKTtcbiAgICByZXR1cm4gW3Jlc3VsdCwgaW5kZXhlc107XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from '../kernels/Reshape';\nexport function meanImpl(x, reduceShape, outShape, backend) {\n    const inSize = util.sizeFromShape(reduceShape);\n    const xSize = util.sizeFromShape(x.shape);\n    const batchSize = xSize / inSize;\n    const reshapedInput = reshape({ inputs: { x }, attrs: { shape: [batchSize, inSize] }, backend });\n    const reduced = reduce(reshapedInput, 'float32', 'mean', backend);\n    const reshapedOutput = reshape({ inputs: { x: reduced }, attrs: { shape: outShape }, backend });\n    backend.disposeIntermediateTensorInfo(reshapedInput);\n    backend.disposeIntermediateTensorInfo(reduced);\n    return reshapedOutput;\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVhbl9pbXBsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01lYW5faW1wbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWEsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHdkQsT0FBTyxFQUFDLE1BQU0sRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUUzQyxNQUFNLFVBQVUsUUFBUSxDQUNwQixDQUFhLEVBQUUsV0FBcUIsRUFBRSxRQUFrQixFQUN4RCxPQUF5QjtJQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzFDLE1BQU0sU0FBUyxHQUFHLEtBQUssR0FBRyxNQUFNLENBQUM7SUFDakMsTUFBTSxhQUFhLEdBQ2YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUV6RSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsYUFBYSxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsTUFBTSxjQUFjLEdBQ2hCLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUV2RSxPQUFPLENBQUMsNkJBQTZCLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDckQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBRS9DLE9BQU8sY0FBYyxDQUFDO0FBQ3hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7VGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi4va2VybmVscy9SZXNoYXBlJztcblxuZXhwb3J0IGZ1bmN0aW9uIG1lYW5JbXBsKFxuICAgIHg6IFRlbnNvckluZm8sIHJlZHVjZVNoYXBlOiBudW1iZXJbXSwgb3V0U2hhcGU6IG51bWJlcltdLFxuICAgIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wpOiBUZW5zb3JJbmZvIHtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgeFNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSk7XG4gIGNvbnN0IGJhdGNoU2l6ZSA9IHhTaXplIC8gaW5TaXplO1xuICBjb25zdCByZXNoYXBlZElucHV0ID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3h9LCBhdHRyczoge3NoYXBlOiBbYmF0Y2hTaXplLCBpblNpemVdfSwgYmFja2VuZH0pO1xuXG4gIGNvbnN0IHJlZHVjZWQgPSByZWR1Y2UocmVzaGFwZWRJbnB1dCwgJ2Zsb2F0MzInLCAnbWVhbicsIGJhY2tlbmQpO1xuICBjb25zdCByZXNoYXBlZE91dHB1dCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZWR1Y2VkfSwgYXR0cnM6IHtzaGFwZTogb3V0U2hhcGV9LCBiYWNrZW5kfSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZElucHV0KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcblxuICByZXR1cm4gcmVzaGFwZWRPdXRwdXQ7XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Mean, util } from '@tensorflow/tfjs-core';\nimport { meanImpl } from './Mean_impl';\nimport { transposeImpl, transposeImplCPU } from './Transpose_impl';\nexport const meanConfig = {\n    kernelName: Mean,\n    backendName: 'webgl',\n    kernelFunc: ({ inputs, attrs, backend }) => {\n        const { x } = inputs;\n        const { keepDims, axis } = attrs;\n        const webglBackend = backend;\n        const xRank = x.shape.length;\n        const origAxes = util.parseAxisParam(axis, x.shape);\n        let axes = origAxes;\n        const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n        const meanInputIsTransposed = permutedAxes != null;\n        const shouldExecuteOnCPU = webglBackend.shouldExecuteOnCPU([x]);\n        const intermediates = [];\n        let meanInput = x;\n        if (meanInputIsTransposed) {\n            if (shouldExecuteOnCPU) {\n                const xTexData = webglBackend.texData.get(meanInput.dataId);\n                const values = xTexData.values;\n                const newShape = new Array(xRank);\n                for (let i = 0; i < newShape.length; i++) {\n                    newShape[i] = x.shape[permutedAxes[i]];\n                }\n                const meanInputValues = transposeImplCPU(values, x.shape, x.dtype, permutedAxes, newShape);\n                meanInput = webglBackend.makeTensorInfo(newShape, x.dtype);\n                const meanInputData = webglBackend.texData.get(meanInput.dataId);\n                meanInputData.values = meanInputValues;\n            }\n            else {\n                meanInput = transposeImpl(x, permutedAxes, webglBackend);\n            }\n            intermediates.push(meanInput);\n            axes = backend_util.getInnerMostAxes(axes.length, xRank);\n        }\n        backend_util.assertAxesAreInnerMostDims('sum', axes, xRank);\n        const [meanOutShape, reduceShape] = backend_util.computeOutAndReduceShapes(meanInput.shape, axes);\n        let outShape = meanOutShape;\n        if (keepDims) {\n            // rather than reshape at the end, set the target shape here.\n            outShape = backend_util.expandShapeToKeepDim(meanOutShape, origAxes);\n        }\n        const out = meanImpl(meanInput, reduceShape, outShape, webglBackend);\n        for (const i of intermediates) {\n            webglBackend.disposeIntermediateTensorInfo(i);\n        }\n        return out;\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NZWFuLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWdCLElBQUksRUFBaUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJNUgsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUNyQyxPQUFPLEVBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFFakUsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsQ0FBQyxFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUUsRUFBRTtRQUN2QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBb0IsQ0FBQztRQUNqQyxNQUFNLEVBQUMsUUFBUSxFQUFFLElBQUksRUFBQyxHQUFHLEtBQXdCLENBQUM7UUFDbEQsTUFBTSxZQUFZLEdBQUcsT0FBMkIsQ0FBQztRQUVqRCxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUM3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFcEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO1FBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDbEUsTUFBTSxxQkFBcUIsR0FBRyxZQUFZLElBQUksSUFBSSxDQUFDO1FBQ25ELE1BQU0sa0JBQWtCLEdBQUcsWUFBWSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUVoRSxNQUFNLGFBQWEsR0FBaUIsRUFBRSxDQUFDO1FBRXZDLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLHFCQUFxQixFQUFFO1lBQ3pCLElBQUksa0JBQWtCLEVBQUU7Z0JBQ3RCLE1BQU0sUUFBUSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztnQkFDNUQsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLE1BQW9CLENBQUM7Z0JBRTdDLE1BQU0sUUFBUSxHQUFhLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUM1QyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDeEMsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7aUJBQ3hDO2dCQUNELE1BQU0sZUFBZSxHQUNqQixnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztnQkFFdkUsU0FBUyxHQUFHLFlBQVksQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0QsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUNqRSxhQUFhLENBQUMsTUFBTSxHQUFHLGVBQWUsQ0FBQzthQUN4QztpQkFBTTtnQkFDTCxTQUFTLEdBQUcsYUFBYSxDQUFDLENBQUMsRUFBRSxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7YUFDMUQ7WUFFRCxhQUFhLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLElBQUksR0FBRyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztTQUMxRDtRQUVELFlBQVksQ0FBQywwQkFBMEIsQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVELE1BQU0sQ0FBQyxZQUFZLEVBQUUsV0FBVyxDQUFDLEdBQzdCLFlBQVksQ0FBQyx5QkFBeUIsQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBRWxFLElBQUksUUFBUSxHQUFHLFlBQVksQ0FBQztRQUM1QixJQUFJLFFBQVEsRUFBRTtZQUNaLDZEQUE2RDtZQUM3RCxRQUFRLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsQ0FBQztTQUN0RTtRQUVELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNyRSxLQUFLLE1BQU0sQ0FBQyxJQUFJLGFBQWEsRUFBRTtZQUM3QixZQUFZLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDL0M7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNiLENBQUM7Q0FDRixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBNZWFuLCBNZWFuQXR0cnMsIE1lYW5JbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7bWVhbkltcGx9IGZyb20gJy4vTWVhbl9pbXBsJztcbmltcG9ydCB7dHJhbnNwb3NlSW1wbCwgdHJhbnNwb3NlSW1wbENQVX0gZnJvbSAnLi9UcmFuc3Bvc2VfaW1wbCc7XG5cbmV4cG9ydCBjb25zdCBtZWFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1lYW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiAoe2lucHV0cywgYXR0cnMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge3h9ID0gaW5wdXRzIGFzIE1lYW5JbnB1dHM7XG4gICAgY29uc3Qge2tlZXBEaW1zLCBheGlzfSA9IGF0dHJzIGFzIHt9IGFzIE1lYW5BdHRycztcbiAgICBjb25zdCB3ZWJnbEJhY2tlbmQgPSBiYWNrZW5kIGFzIE1hdGhCYWNrZW5kV2ViR0w7XG5cbiAgICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcblxuICAgIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gICAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gICAgY29uc3QgbWVhbklucHV0SXNUcmFuc3Bvc2VkID0gcGVybXV0ZWRBeGVzICE9IG51bGw7XG4gICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gd2ViZ2xCYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pO1xuXG4gICAgY29uc3QgaW50ZXJtZWRpYXRlczogVGVuc29ySW5mb1tdID0gW107XG5cbiAgICBsZXQgbWVhbklucHV0ID0geDtcbiAgICBpZiAobWVhbklucHV0SXNUcmFuc3Bvc2VkKSB7XG4gICAgICBpZiAoc2hvdWxkRXhlY3V0ZU9uQ1BVKSB7XG4gICAgICAgIGNvbnN0IHhUZXhEYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KG1lYW5JbnB1dC5kYXRhSWQpO1xuICAgICAgICBjb25zdCB2YWx1ZXMgPSB4VGV4RGF0YS52YWx1ZXMgYXMgVHlwZWRBcnJheTtcblxuICAgICAgICBjb25zdCBuZXdTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoeFJhbmspO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5ld1NoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgbmV3U2hhcGVbaV0gPSB4LnNoYXBlW3Blcm11dGVkQXhlc1tpXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbWVhbklucHV0VmFsdWVzID1cbiAgICAgICAgICAgIHRyYW5zcG9zZUltcGxDUFUodmFsdWVzLCB4LnNoYXBlLCB4LmR0eXBlLCBwZXJtdXRlZEF4ZXMsIG5ld1NoYXBlKTtcblxuICAgICAgICBtZWFuSW5wdXQgPSB3ZWJnbEJhY2tlbmQubWFrZVRlbnNvckluZm8obmV3U2hhcGUsIHguZHR5cGUpO1xuICAgICAgICBjb25zdCBtZWFuSW5wdXREYXRhID0gd2ViZ2xCYWNrZW5kLnRleERhdGEuZ2V0KG1lYW5JbnB1dC5kYXRhSWQpO1xuICAgICAgICBtZWFuSW5wdXREYXRhLnZhbHVlcyA9IG1lYW5JbnB1dFZhbHVlcztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG1lYW5JbnB1dCA9IHRyYW5zcG9zZUltcGwoeCwgcGVybXV0ZWRBeGVzLCB3ZWJnbEJhY2tlbmQpO1xuICAgICAgfVxuXG4gICAgICBpbnRlcm1lZGlhdGVzLnB1c2gobWVhbklucHV0KTtcbiAgICAgIGF4ZXMgPSBiYWNrZW5kX3V0aWwuZ2V0SW5uZXJNb3N0QXhlcyhheGVzLmxlbmd0aCwgeFJhbmspO1xuICAgIH1cblxuICAgIGJhY2tlbmRfdXRpbC5hc3NlcnRBeGVzQXJlSW5uZXJNb3N0RGltcygnc3VtJywgYXhlcywgeFJhbmspO1xuICAgIGNvbnN0IFttZWFuT3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKG1lYW5JbnB1dC5zaGFwZSwgYXhlcyk7XG5cbiAgICBsZXQgb3V0U2hhcGUgPSBtZWFuT3V0U2hhcGU7XG4gICAgaWYgKGtlZXBEaW1zKSB7XG4gICAgICAvLyByYXRoZXIgdGhhbiByZXNoYXBlIGF0IHRoZSBlbmQsIHNldCB0aGUgdGFyZ2V0IHNoYXBlIGhlcmUuXG4gICAgICBvdXRTaGFwZSA9IGJhY2tlbmRfdXRpbC5leHBhbmRTaGFwZVRvS2VlcERpbShtZWFuT3V0U2hhcGUsIG9yaWdBeGVzKTtcbiAgICB9XG5cbiAgICBjb25zdCBvdXQgPSBtZWFuSW1wbChtZWFuSW5wdXQsIHJlZHVjZVNoYXBlLCBvdXRTaGFwZSwgd2ViZ2xCYWNrZW5kKTtcbiAgICBmb3IgKGNvbnN0IGkgb2YgaW50ZXJtZWRpYXRlcykge1xuICAgICAgd2ViZ2xCYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGkpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Min, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function min(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    const xRank = x.shape.length;\n    const origAxes = util.parseAxisParam(axis, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n    let permutedX = x;\n    if (permutedAxes != null) {\n        permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        axes = backend_util.getInnerMostAxes(axes.length, x.shape.length);\n    }\n    backend_util.assertAxesAreInnerMostDims('min', axes, xRank);\n    const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, axes);\n    const inSize = util.sizeFromShape(reduceShape);\n    const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n    const reduced = reduce(a2D, a2D.dtype, 'min', backend);\n    let res;\n    if (keepDims) {\n        const newShape = backend_util.expandShapeToKeepDim(outShape, origAxes);\n        res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: newShape } });\n    }\n    else {\n        res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n    }\n    backend.disposeIntermediateTensorInfo(a2D);\n    backend.disposeIntermediateTensorInfo(reduced);\n    if (permutedAxes != null) {\n        backend.disposeIntermediateTensorInfo(permutedX);\n    }\n    return res;\n}\nexport const minConfig = {\n    kernelName: Min,\n    backendName: 'webgl',\n    kernelFunc: min\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01pbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixHQUFHLEVBQW1DLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pILE9BQU8sRUFBQyxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLEdBQUcsQ0FDZixJQUFxRTtJQUV2RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUU3QixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDcEQsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFDO0lBQ3BCLE1BQU0sWUFBWSxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDbEUsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDO0lBQ2xCLElBQUksWUFBWSxJQUFJLElBQUksRUFBRTtRQUN4QixTQUFTLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxZQUFZLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDM0UsSUFBSSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDbkU7SUFFRCxZQUFZLENBQUMsMEJBQTBCLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM1RCxNQUFNLENBQUMsUUFBUSxFQUFFLFdBQVcsQ0FBQyxHQUN6QixZQUFZLENBQUMseUJBQXlCLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNsRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9DLE1BQU0sR0FBRyxHQUNMLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxTQUFTLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUV2RCxJQUFJLEdBQUcsQ0FBQztJQUNSLElBQUksUUFBUSxFQUFFO1FBQ1osTUFBTSxRQUFRLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUN2RSxHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQzFFO1NBQU07UUFDTCxHQUFHLEdBQUcsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQzFFO0lBRUQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUUvQyxJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUU7UUFDeEIsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFNBQVMsQ0FBQyxDQUFDO0tBQ2xEO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBNaW4sIE1pbkF0dHJzLCBNaW5JbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3JlZHVjZX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3JlZHVjZSc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBtaW4oXG4gICAgYXJnczoge2lucHV0czogTWluSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogTWluQXR0cnN9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YXhpcywga2VlcERpbXN9ID0gYXR0cnM7XG5cbiAgY29uc3QgeFJhbmsgPSB4LnNoYXBlLmxlbmd0aDtcblxuICBjb25zdCBvcmlnQXhlcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSk7XG4gIGxldCBheGVzID0gb3JpZ0F4ZXM7XG4gIGNvbnN0IHBlcm11dGVkQXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oYXhlcywgeFJhbmspO1xuICBsZXQgcGVybXV0ZWRYID0geDtcbiAgaWYgKHBlcm11dGVkQXhlcyAhPSBudWxsKSB7XG4gICAgcGVybXV0ZWRYID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtwZXJtOiBwZXJtdXRlZEF4ZXN9fSk7XG4gICAgYXhlcyA9IGJhY2tlbmRfdXRpbC5nZXRJbm5lck1vc3RBeGVzKGF4ZXMubGVuZ3RoLCB4LnNoYXBlLmxlbmd0aCk7XG4gIH1cblxuICBiYWNrZW5kX3V0aWwuYXNzZXJ0QXhlc0FyZUlubmVyTW9zdERpbXMoJ21pbicsIGF4ZXMsIHhSYW5rKTtcbiAgY29uc3QgW291dFNoYXBlLCByZWR1Y2VTaGFwZV0gPVxuICAgICAgYmFja2VuZF91dGlsLmNvbXB1dGVPdXRBbmRSZWR1Y2VTaGFwZXMocGVybXV0ZWRYLnNoYXBlLCBheGVzKTtcbiAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgY29uc3QgYTJEID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHBlcm11dGVkWH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFstMSwgaW5TaXplXX19KTtcbiAgY29uc3QgcmVkdWNlZCA9IHJlZHVjZShhMkQsIGEyRC5kdHlwZSwgJ21pbicsIGJhY2tlbmQpO1xuXG4gIGxldCByZXM7XG4gIGlmIChrZWVwRGltcykge1xuICAgIGNvbnN0IG5ld1NoYXBlID0gYmFja2VuZF91dGlsLmV4cGFuZFNoYXBlVG9LZWVwRGltKG91dFNoYXBlLCBvcmlnQXhlcyk7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfX0pO1xuICB9IGVsc2Uge1xuICAgIHJlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHJlZHVjZWR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgfVxuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oYTJEKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZWR1Y2VkKTtcblxuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHBlcm11dGVkWCk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgbWluQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1pbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1pbiBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Minimum } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET } from '../binaryop_gpu';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { minimumImplCPU } from '../kernel_utils/shared';\nconst MINIMUM = CHECK_NAN_SNIPPET + `\n  return min(a, b);\n`;\nconst MINIMUM_PACKED = `\n  vec4 result = vec4(min(a, b));\n  bvec4 isNaNA = isnan(a);\n  bvec4 isNaNB = isnan(b);\n  bvec4 isNaN = bvec4(isNaNA.x || isNaNB.x, isNaNA.y || isNaNB.y, isNaNA.z || isNaNB.z, isNaNA.w || isNaNB.w);\n  ` +\n    CHECK_NAN_SNIPPET_PACKED + `\n  return result;\n`;\nexport const minimum = binaryKernelFunc({\n    opSnippet: MINIMUM,\n    packedOpSnippet: MINIMUM_PACKED,\n    cpuKernelImpl: minimumImplCPU\n});\nexport const minimumConfig = {\n    kernelName: Minimum,\n    backendName: 'webgl',\n    kernelFunc: minimum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWluaW11bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9NaW5pbXVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsT0FBTyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDbEQsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLGlCQUFpQixHQUFHOztDQUVuQyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7O0dBS3BCO0lBQ0Msd0JBQXdCLEdBQUc7O0NBRTlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLENBQUM7SUFDdEMsU0FBUyxFQUFFLE9BQU87SUFDbEIsZUFBZSxFQUFFLGNBQWM7SUFDL0IsYUFBYSxFQUFFLGNBQWM7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBMkI7Q0FDeEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1pbmltdW19IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7Q0hFQ0tfTkFOX1NOSVBQRVR9IGZyb20gJy4uL2JpbmFyeW9wX2dwdSc7XG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1BBQ0tFRH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHttaW5pbXVtSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IE1JTklNVU0gPSBDSEVDS19OQU5fU05JUFBFVCArIGBcbiAgcmV0dXJuIG1pbihhLCBiKTtcbmA7XG5cbmNvbnN0IE1JTklNVU1fUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IHZlYzQobWluKGEsIGIpKTtcbiAgYnZlYzQgaXNOYU5BID0gaXNuYW4oYSk7XG4gIGJ2ZWM0IGlzTmFOQiA9IGlzbmFuKGIpO1xuICBidmVjNCBpc05hTiA9IGJ2ZWM0KGlzTmFOQS54IHx8IGlzTmFOQi54LCBpc05hTkEueSB8fCBpc05hTkIueSwgaXNOYU5BLnogfHwgaXNOYU5CLnosIGlzTmFOQS53IHx8IGlzTmFOQi53KTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IG1pbmltdW0gPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBNSU5JTVVNLFxuICBwYWNrZWRPcFNuaXBwZXQ6IE1JTklNVU1fUEFDS0VELFxuICBjcHVLZXJuZWxJbXBsOiBtaW5pbXVtSW1wbENQVVxufSk7XG5cbmV4cG9ydCBjb25zdCBtaW5pbXVtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1pbmltdW0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtaW5pbXVtIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class MirrorPadProgram {\n    constructor(xShape, paddings, mode) {\n        this.variableNames = ['x'];\n        this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */);\n        const rank = xShape.length;\n        const dtype = getCoordsDataType(rank);\n        const start = paddings.map(p => p[0]).join(',');\n        const end = paddings.map((p, i) => p[0] + xShape[i]).join(',');\n        const unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank);\n        const offset = mode === 'reflect' ? 0 : 1;\n        if (rank === 1) {\n            this.userCode = `\n        int start = ${start};\n        int end = ${end};\n\n        void main() {\n          int outC = getOutputCoords();\n          if (outC < start) {\n            outC = start * 2 - outC - ${offset};\n          } else if(outC >= end) {\n            outC = (end - 1) * 2 - outC + ${offset};\n          }\n          setOutput(getX(outC - start));\n        }\n      `;\n            return;\n        }\n        this.userCode = `\n      ${dtype} start = ${dtype}(${start});\n      ${dtype} end = ${dtype}(${end});\n\n      void main() {\n        ${dtype} outC = getOutputCoords();\n        for (int i = 0; i < ${rank}; i++) {\n          if (outC[i] < start[i]) {\n            outC[i] = start[i] * 2 - outC[i] - ${offset};\n          } else if(outC[i] >= end[i]) {\n            outC[i] = (end[i] - 1) * 2 - outC[i] + ${offset};\n          }\n        }\n        ${dtype} coords = outC - start;\n        setOutput(getX(${unpackedCoords}));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yX3BhZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL21pcnJvcl9wYWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxnQkFBZ0I7SUFLM0IsWUFDSSxNQUFnQixFQUFFLFFBQWlDLEVBQ25ELElBQTJCO1FBTi9CLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQU9wQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvRCxNQUFNLGNBQWMsR0FDaEIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLEdBQUc7c0JBQ0EsS0FBSztvQkFDUCxHQUFHOzs7Ozt3Q0FLaUIsTUFBTTs7NENBRUYsTUFBTTs7OztPQUkzQyxDQUFDO1lBQ0YsT0FBTztTQUNSO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRztRQUNaLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSztRQUMvQixLQUFLLFVBQVUsS0FBSyxJQUFJLEdBQUc7OztVQUd6QixLQUFLOzhCQUNlLElBQUk7O2lEQUVlLE1BQU07O3FEQUVGLE1BQU07OztVQUdqRCxLQUFLO3lCQUNVLGNBQWM7O0tBRWxDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgTWlycm9yUGFkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgeFNoYXBlOiBudW1iZXJbXSwgcGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LFxuICAgICAgbW9kZTogJ3JlZmxlY3QnfCdzeW1tZXRyaWMnKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHBhZGRpbmdzLm1hcChcbiAgICAgICAgKHAsIGkpID0+IHBbMF0gLyogYmVmb3JlUGFkICovICsgeFNoYXBlW2ldICsgcFsxXSAvKiBhZnRlclBhZCAqLyk7XG4gICAgY29uc3QgcmFuayA9IHhTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSkuam9pbignLCcpO1xuICAgIGNvbnN0IGVuZCA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSArIHhTaGFwZVtpXSkuam9pbignLCcpO1xuICAgIGNvbnN0IHVucGFja2VkQ29vcmRzID1cbiAgICAgICAgWydjb29yZHNbMF0nLCAnY29vcmRzWzFdJywgJ2Nvb3Jkc1syXScsICdjb29yZHNbM10nXS5zbGljZSgwLCByYW5rKTtcbiAgICBjb25zdCBvZmZzZXQgPSBtb2RlID09PSAncmVmbGVjdCcgPyAwIDogMTtcblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICBpbnQgc3RhcnQgPSAke3N0YXJ0fTtcbiAgICAgICAgaW50IGVuZCA9ICR7ZW5kfTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaW50IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBpZiAob3V0QyA8IHN0YXJ0KSB7XG4gICAgICAgICAgICBvdXRDID0gc3RhcnQgKiAyIC0gb3V0QyAtICR7b2Zmc2V0fTtcbiAgICAgICAgICB9IGVsc2UgaWYob3V0QyA+PSBlbmQpIHtcbiAgICAgICAgICAgIG91dEMgPSAoZW5kIC0gMSkgKiAyIC0gb3V0QyArICR7b2Zmc2V0fTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KGdldFgob3V0QyAtIHN0YXJ0KSk7XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke2R0eXBlfSBzdGFydCA9ICR7ZHR5cGV9KCR7c3RhcnR9KTtcbiAgICAgICR7ZHR5cGV9IGVuZCA9ICR7ZHR5cGV9KCR7ZW5kfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gb3V0QyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7cmFua307IGkrKykge1xuICAgICAgICAgIGlmIChvdXRDW2ldIDwgc3RhcnRbaV0pIHtcbiAgICAgICAgICAgIG91dENbaV0gPSBzdGFydFtpXSAqIDIgLSBvdXRDW2ldIC0gJHtvZmZzZXR9O1xuICAgICAgICAgIH0gZWxzZSBpZihvdXRDW2ldID49IGVuZFtpXSkge1xuICAgICAgICAgICAgb3V0Q1tpXSA9IChlbmRbaV0gLSAxKSAqIDIgLSBvdXRDW2ldICsgJHtvZmZzZXR9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBvdXRDIC0gc3RhcnQ7XG4gICAgICAgIHNldE91dHB1dChnZXRYKCR7dW5wYWNrZWRDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\n/**\n * Example shader code for\n * `mirrorPad(tf.tensor1d([1, 2, 3], 'int32'), [[2, 2]], 'reflect')`\n * ```\n *    const int start = int(2);\n *    const int end = int(5);\n *\n *    void main() {\n *       int outputLoc = getOutputCoords();\n *       vec4 result = vec4(0.);\n *\n *       int rc = outputLoc;\n *\n *       int source = rc;\n *       if (source < start) {\n *         source = start * 2 - source - 0;\n *       } else if (source >= end) {\n *         source = (end - 1) * 2 - source + 0;\n *       }\n *       source -= start;\n *\n *       result[0] = getChannel(getX(source), source);\n *       rc += 1;\n *       if(rc < 6) {\n *          int source = rc;\n *          if (source < start) {\n *            source = start * 2 - source - 0;\n *          } else if (source >= end) {\n *            source = (end - 1) * 2 - source + 0;\n *          }\n *          source -= start;\n *\n *         result[1] = getChannel(getX(source), source);\n *       }\n *\n *       setOutput(result);\n *     }\n * ```\n */\nexport class MirrorPadPackedProgram {\n    constructor(xShape, paddings, mode) {\n        this.variableNames = ['x'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */);\n        const rank = xShape.length;\n        const dtype = getCoordsDataType(rank);\n        const start = paddings.map(p => p[0]).join(',');\n        const end = paddings.map((p, i) => p[0] + xShape[i]).join(',');\n        const coords = getChannels('rc', rank);\n        const source = getChannels('source', rank);\n        const cLimit = `${coords[rank - 1]} < ${this.outputShape[rank - 1]}`;\n        const innerDims = rank === 1 ? 'source' : `vec2(${source.slice(-2).join()})`;\n        const offset = mode === 'reflect' ? 0 : 1;\n        let mainLoop = '';\n        if (rank === 1) {\n            const padSetup = `\n        ${dtype} source = rc;\n        if (source < start) {\n          source = start * 2 - source - ${offset};\n        } else if (source >= end) {\n          source = (end - 1) * 2 - source + ${offset};\n        }\n        source -= start;\n      `;\n            mainLoop = `\n        ${dtype} rc = outputLoc;\n        ${padSetup}\n        result[0] = getChannel(getX(${source.join()}), ${innerDims});\n        ${coords[rank - 1]} += 1;\n        if(${cLimit}) {\n          ${padSetup}\n          result[1] = getChannel(getX(${source.join()}), ${innerDims});\n        }\n      `;\n        }\n        else {\n            const padSetup = `\n        ${dtype} source = rc;\n        ${dtype} lt = ${dtype}(lessThan(source, start));\n        ${dtype} gte = ${dtype}(greaterThanEqual(source, end));\n        ${dtype} orig = 1 - (lt + gte);\n        source = orig * source +\n                lt * (start * 2 - source - ${offset}) +\n                gte * ((end - 1) * 2 - source + ${offset});\n        source -= start;\n      `;\n            mainLoop = `\n        ${dtype} rc = outputLoc;\n        ${padSetup}\n        result[0] = getChannel(getX(${source.join()}), ${innerDims});\n        ${coords[rank - 1]} += 1;\n        if(${cLimit}) {\n          ${padSetup}\n          result[1] = getChannel(getX(${source.join()}), ${innerDims});\n        }\n        rc = outputLoc;\n        ${coords[rank - 2]} += 1;\n        if(${coords[rank - 2]} < ${this.outputShape[rank - 2]}) {\n          ${padSetup}\n          result[2] = getChannel(getX(${source.join()}), ${innerDims});\n          ${coords[rank - 1]} += 1;\n          if(${cLimit}) {\n            ${padSetup}\n            result[3] = getChannel(getX(${source.join()}), ${innerDims});\n          }\n        }\n      `;\n        }\n        this.userCode = `\n      const ${dtype} start = ${dtype}(${start});\n      const ${dtype} end = ${dtype}(${end});\n\n      void main() {\n        ${dtype} outputLoc = getOutputCoords();\n        vec4 result = vec4(0.);\n        ${mainLoop}\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlycm9yX3BhZF9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9taXJyb3JfcGFkX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXNDRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFPakMsWUFDSSxNQUFnQixFQUFFLFFBQWlDLEVBQ25ELElBQTJCO1FBUi9CLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQU9sQixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsTUFBTSxLQUFLLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoRCxNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMvRCxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3ZDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDM0MsTUFBTSxNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDckUsTUFBTSxTQUFTLEdBQ1gsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsR0FBRyxDQUFDO1FBQy9ELE1BQU0sTUFBTSxHQUFHLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRTFDLElBQUksUUFBUSxHQUFHLEVBQUUsQ0FBQztRQUNsQixJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDZCxNQUFNLFFBQVEsR0FBRztVQUNiLEtBQUs7OzBDQUUyQixNQUFNOzs4Q0FFRixNQUFNOzs7T0FHN0MsQ0FBQztZQUNGLFFBQVEsR0FBRztVQUNQLEtBQUs7VUFDTCxRQUFRO3NDQUNvQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUztVQUN4RCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQzthQUNiLE1BQU07WUFDUCxRQUFRO3dDQUNvQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUzs7T0FFN0QsQ0FBQztTQUNIO2FBQU07WUFDTCxNQUFNLFFBQVEsR0FBRztVQUNiLEtBQUs7VUFDTCxLQUFLLFNBQVMsS0FBSztVQUNuQixLQUFLLFVBQVUsS0FBSztVQUNwQixLQUFLOzs2Q0FFOEIsTUFBTTtrREFDRCxNQUFNOztPQUVqRCxDQUFDO1lBRUYsUUFBUSxHQUFHO1VBQ1AsS0FBSztVQUNMLFFBQVE7c0NBQ29CLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxTQUFTO1VBQ3hELE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO2FBQ2IsTUFBTTtZQUNQLFFBQVE7d0NBQ29CLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxTQUFTOzs7VUFHMUQsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7YUFDYixNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUNqRCxRQUFRO3dDQUNvQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUztZQUN4RCxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztlQUNiLE1BQU07Y0FDUCxRQUFROzBDQUNvQixNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sU0FBUzs7O09BRy9ELENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7Y0FDTixLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUs7Y0FDL0IsS0FBSyxVQUFVLEtBQUssSUFBSSxHQUFHOzs7VUFHL0IsS0FBSzs7VUFFTCxRQUFROzs7S0FHYixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuLyoqXG4gKiBFeGFtcGxlIHNoYWRlciBjb2RlIGZvclxuICogYG1pcnJvclBhZCh0Zi50ZW5zb3IxZChbMSwgMiwgM10sICdpbnQzMicpLCBbWzIsIDJdXSwgJ3JlZmxlY3QnKWBcbiAqIGBgYFxuICogICAgY29uc3QgaW50IHN0YXJ0ID0gaW50KDIpO1xuICogICAgY29uc3QgaW50IGVuZCA9IGludCg1KTtcbiAqXG4gKiAgICB2b2lkIG1haW4oKSB7XG4gKiAgICAgICBpbnQgb3V0cHV0TG9jID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gKiAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICpcbiAqICAgICAgIGludCByYyA9IG91dHB1dExvYztcbiAqXG4gKiAgICAgICBpbnQgc291cmNlID0gcmM7XG4gKiAgICAgICBpZiAoc291cmNlIDwgc3RhcnQpIHtcbiAqICAgICAgICAgc291cmNlID0gc3RhcnQgKiAyIC0gc291cmNlIC0gMDtcbiAqICAgICAgIH0gZWxzZSBpZiAoc291cmNlID49IGVuZCkge1xuICogICAgICAgICBzb3VyY2UgPSAoZW5kIC0gMSkgKiAyIC0gc291cmNlICsgMDtcbiAqICAgICAgIH1cbiAqICAgICAgIHNvdXJjZSAtPSBzdGFydDtcbiAqXG4gKiAgICAgICByZXN1bHRbMF0gPSBnZXRDaGFubmVsKGdldFgoc291cmNlKSwgc291cmNlKTtcbiAqICAgICAgIHJjICs9IDE7XG4gKiAgICAgICBpZihyYyA8IDYpIHtcbiAqICAgICAgICAgIGludCBzb3VyY2UgPSByYztcbiAqICAgICAgICAgIGlmIChzb3VyY2UgPCBzdGFydCkge1xuICogICAgICAgICAgICBzb3VyY2UgPSBzdGFydCAqIDIgLSBzb3VyY2UgLSAwO1xuICogICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2UgPj0gZW5kKSB7XG4gKiAgICAgICAgICAgIHNvdXJjZSA9IChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAwO1xuICogICAgICAgICAgfVxuICogICAgICAgICAgc291cmNlIC09IHN0YXJ0O1xuICpcbiAqICAgICAgICAgcmVzdWx0WzFdID0gZ2V0Q2hhbm5lbChnZXRYKHNvdXJjZSksIHNvdXJjZSk7XG4gKiAgICAgICB9XG4gKlxuICogICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gKiAgICAgfVxuICogYGBgXG4gKi9cbmV4cG9ydCBjbGFzcyBNaXJyb3JQYWRQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCBwYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgICBtb2RlOiAncmVmbGVjdCd8J3N5bW1ldHJpYycpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gcGFkZGluZ3MubWFwKFxuICAgICAgICAocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4U2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgcmFuayk7XG4gICAgY29uc3Qgc291cmNlID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZScsIHJhbmspO1xuICAgIGNvbnN0IGNMaW1pdCA9IGAke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAxXX1gO1xuICAgIGNvbnN0IGlubmVyRGltcyA9XG4gICAgICAgIHJhbmsgPT09IDEgPyAnc291cmNlJyA6IGB2ZWMyKCR7c291cmNlLnNsaWNlKC0yKS5qb2luKCl9KWA7XG4gICAgY29uc3Qgb2Zmc2V0ID0gbW9kZSA9PT0gJ3JlZmxlY3QnID8gMCA6IDE7XG5cbiAgICBsZXQgbWFpbkxvb3AgPSAnJztcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgY29uc3QgcGFkU2V0dXAgPSBgXG4gICAgICAgICR7ZHR5cGV9IHNvdXJjZSA9IHJjO1xuICAgICAgICBpZiAoc291cmNlIDwgc3RhcnQpIHtcbiAgICAgICAgICBzb3VyY2UgPSBzdGFydCAqIDIgLSBzb3VyY2UgLSAke29mZnNldH07XG4gICAgICAgIH0gZWxzZSBpZiAoc291cmNlID49IGVuZCkge1xuICAgICAgICAgIHNvdXJjZSA9IChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAke29mZnNldH07XG4gICAgICAgIH1cbiAgICAgICAgc291cmNlIC09IHN0YXJ0O1xuICAgICAgYDtcbiAgICAgIG1haW5Mb29wID0gYFxuICAgICAgICAke2R0eXBlfSByYyA9IG91dHB1dExvYztcbiAgICAgICAgJHtwYWRTZXR1cH1cbiAgICAgICAgcmVzdWx0WzBdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgIGlmKCR7Y0xpbWl0fSkge1xuICAgICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgICAgcmVzdWx0WzFdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBwYWRTZXR1cCA9IGBcbiAgICAgICAgJHtkdHlwZX0gc291cmNlID0gcmM7XG4gICAgICAgICR7ZHR5cGV9IGx0ID0gJHtkdHlwZX0obGVzc1RoYW4oc291cmNlLCBzdGFydCkpO1xuICAgICAgICAke2R0eXBlfSBndGUgPSAke2R0eXBlfShncmVhdGVyVGhhbkVxdWFsKHNvdXJjZSwgZW5kKSk7XG4gICAgICAgICR7ZHR5cGV9IG9yaWcgPSAxIC0gKGx0ICsgZ3RlKTtcbiAgICAgICAgc291cmNlID0gb3JpZyAqIHNvdXJjZSArXG4gICAgICAgICAgICAgICAgbHQgKiAoc3RhcnQgKiAyIC0gc291cmNlIC0gJHtvZmZzZXR9KSArXG4gICAgICAgICAgICAgICAgZ3RlICogKChlbmQgLSAxKSAqIDIgLSBzb3VyY2UgKyAke29mZnNldH0pO1xuICAgICAgICBzb3VyY2UgLT0gc3RhcnQ7XG4gICAgICBgO1xuXG4gICAgICBtYWluTG9vcCA9IGBcbiAgICAgICAgJHtkdHlwZX0gcmMgPSBvdXRwdXRMb2M7XG4gICAgICAgICR7cGFkU2V0dXB9XG4gICAgICAgIHJlc3VsdFswXSA9IGdldENoYW5uZWwoZ2V0WCgke3NvdXJjZS5qb2luKCl9KSwgJHtpbm5lckRpbXN9KTtcbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDFdfSArPSAxO1xuICAgICAgICBpZigke2NMaW1pdH0pIHtcbiAgICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICAgIHJlc3VsdFsxXSA9IGdldENoYW5uZWwoZ2V0WCgke3NvdXJjZS5qb2luKCl9KSwgJHtpbm5lckRpbXN9KTtcbiAgICAgICAgfVxuICAgICAgICByYyA9IG91dHB1dExvYztcbiAgICAgICAgJHtjb29yZHNbcmFuayAtIDJdfSArPSAxO1xuICAgICAgICBpZigke2Nvb3Jkc1tyYW5rIC0gMl19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX0pIHtcbiAgICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICAgIHJlc3VsdFsyXSA9IGdldENoYW5uZWwoZ2V0WCgke3NvdXJjZS5qb2luKCl9KSwgJHtpbm5lckRpbXN9KTtcbiAgICAgICAgICAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgICAgaWYoJHtjTGltaXR9KSB7XG4gICAgICAgICAgICAke3BhZFNldHVwfVxuICAgICAgICAgICAgcmVzdWx0WzNdID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgJHtkdHlwZX0gc3RhcnQgPSAke2R0eXBlfSgke3N0YXJ0fSk7XG4gICAgICBjb25zdCAke2R0eXBlfSBlbmQgPSAke2R0eXBlfSgke2VuZH0pO1xuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICR7ZHR5cGV9IG91dHB1dExvYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICB2ZWM0IHJlc3VsdCA9IHZlYzQoMC4pO1xuICAgICAgICAke21haW5Mb29wfVxuICAgICAgICBzZXRPdXRwdXQocmVzdWx0KTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, MirrorPad } from '@tensorflow/tfjs-core';\nimport { MirrorPadProgram } from '../mirror_pad_gpu';\nimport { MirrorPadPackedProgram } from '../mirror_pad_packed_gpu';\nexport const mirrorPadKernelFunc = ({ inputs, backend, attrs }) => {\n    const { x } = inputs;\n    const { paddings, mode } = attrs;\n    const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n        new MirrorPadPackedProgram(x.shape, paddings, mode) :\n        new MirrorPadProgram(x.shape, paddings, mode);\n    const output = backend.runWebGLProgram(program, [x], x.dtype);\n    return output;\n};\nexport const mirrorPadConfig = {\n    kernelName: MirrorPad,\n    backendName: 'webgl',\n    kernelFunc: mirrorPadKernelFunc,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTWlycm9yUGFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01pcnJvclBhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixTQUFTLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHNUgsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDbkQsT0FBTyxFQUFDLHNCQUFzQixFQUFDLE1BQU0sMEJBQTBCLENBQUM7QUFFaEUsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBSWIsQ0FBQyxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEVBQUUsRUFBRTtJQUM5QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxRQUFRLEVBQUUsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRS9CLE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxzQkFBc0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ3JELElBQUksZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFbEQsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE1pcnJvclBhZCwgTWlycm9yUGFkQXR0cnMsIE1pcnJvclBhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7TWlycm9yUGFkUHJvZ3JhbX0gZnJvbSAnLi4vbWlycm9yX3BhZF9ncHUnO1xuaW1wb3J0IHtNaXJyb3JQYWRQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9taXJyb3JfcGFkX3BhY2tlZF9ncHUnO1xuXG5leHBvcnQgY29uc3QgbWlycm9yUGFkS2VybmVsRnVuYzogKHBhcmFtczoge1xuICBpbnB1dHM6IE1pcnJvclBhZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE1pcnJvclBhZEF0dHJzXG59KSA9PiBUZW5zb3JJbmZvID0gKHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSkgPT4ge1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IHtwYWRkaW5ncywgbW9kZX0gPSBhdHRycztcblxuICBjb25zdCBwcm9ncmFtID0gZW52KCkuZ2V0Qm9vbCgnV0VCR0xfUEFDS19BUlJBWV9PUEVSQVRJT05TJykgP1xuICAgICAgbmV3IE1pcnJvclBhZFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIG1vZGUpIDpcbiAgICAgIG5ldyBNaXJyb3JQYWRQcm9ncmFtKHguc2hhcGUsIHBhZGRpbmdzLCBtb2RlKTtcblxuICBjb25zdCBvdXRwdXQgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUpO1xuXG4gIHJldHVybiBvdXRwdXQ7XG59O1xuXG5leHBvcnQgY29uc3QgbWlycm9yUGFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1pcnJvclBhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1pcnJvclBhZEtlcm5lbEZ1bmMgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Mod } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst MOD = `if (b == 0.0) return NAN;\n  return mod(a, b);`;\nconst MOD_PACKED = `\n  vec4 result = mod(a, b);\n  bvec4 isNaN = equal(b, vec4(0.0));\n  ` +\n    CHECK_NAN_SNIPPET_PACKED + `\n  return result;\n`;\nexport const mod = binaryKernelFunc({\n    opSnippet: MOD,\n    packedOpSnippet: MOD_PACKED,\n});\nexport const modConfig = {\n    kernelName: Mod,\n    backendName: 'webgl',\n    kernelFunc: mod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTW9kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL01vZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXBFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sR0FBRyxHQUFHO29CQUNRLENBQUM7QUFFckIsTUFBTSxVQUFVLEdBQUc7OztHQUdoQjtJQUNDLHdCQUF3QixHQUFHOztDQUU5QixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0lBQ2xDLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLFVBQVU7Q0FDNUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUF1QjtDQUNwQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTW9kfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1BBQ0tFRH0gZnJvbSAnLi4vYmluYXJ5b3BfcGFja2VkX2dwdSc7XG5pbXBvcnQge2JpbmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBNT0QgPSBgaWYgKGIgPT0gMC4wKSByZXR1cm4gTkFOO1xuICByZXR1cm4gbW9kKGEsIGIpO2A7XG5cbmNvbnN0IE1PRF9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbW9kKGEsIGIpO1xuICBidmVjNCBpc05hTiA9IGVxdWFsKGIsIHZlYzQoMC4wKSk7XG4gIGAgK1xuICAgIENIRUNLX05BTl9TTklQUEVUX1BBQ0tFRCArIGBcbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5cbmV4cG9ydCBjb25zdCBtb2QgPSBiaW5hcnlLZXJuZWxGdW5jKHtcbiAgb3BTbmlwcGV0OiBNT0QsXG4gIHBhY2tlZE9wU25pcHBldDogTU9EX1BBQ0tFRCxcbn0pO1xuXG5leHBvcnQgY29uc3QgbW9kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE1vZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG1vZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class MultinomialProgram {\n    constructor(batchSize, numOutcomes, numSamples) {\n        this.variableNames = ['probs'];\n        this.customUniforms = [{ name: 'seed', type: 'float' }];\n        this.outputShape = [batchSize, numSamples];\n        this.userCode = `\n      void main() {\n        ivec2 coords = getOutputCoords();\n        int batch = coords[0];\n\n        float r = random(seed);\n        float cdf = 0.0;\n\n        for (int i = 0; i < ${numOutcomes - 1}; i++) {\n          cdf += getProbs(batch, i);\n\n          if (r < cdf) {\n            setOutput(float(i));\n            return;\n          }\n        }\n\n        // If no other event happened, last event happened.\n        setOutput(float(${numOutcomes - 1}));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGlub21pYWxfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9tdWx0aW5vbWlhbF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBS0gsTUFBTSxPQUFPLGtCQUFrQjtJQU03QixZQUFZLFNBQWlCLEVBQUUsV0FBbUIsRUFBRSxVQUFrQjtRQUx0RSxrQkFBYSxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFHMUIsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQyxDQUFDLENBQUM7UUFHOUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFNBQVMsRUFBRSxVQUFVLENBQUMsQ0FBQztRQUUzQyxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs4QkFRVSxXQUFXLEdBQUcsQ0FBQzs7Ozs7Ozs7OzswQkFVbkIsV0FBVyxHQUFHLENBQUM7O0tBRXBDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtVbmlmb3JtVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgTXVsdGlub21pYWxQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsncHJvYnMnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuICBjdXN0b21Vbmlmb3JtcyA9IFt7bmFtZTogJ3NlZWQnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3IoYmF0Y2hTaXplOiBudW1iZXIsIG51bU91dGNvbWVzOiBudW1iZXIsIG51bVNhbXBsZXM6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBudW1TYW1wbGVzXTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYmF0Y2ggPSBjb29yZHNbMF07XG5cbiAgICAgICAgZmxvYXQgciA9IHJhbmRvbShzZWVkKTtcbiAgICAgICAgZmxvYXQgY2RmID0gMC4wO1xuXG4gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgJHtudW1PdXRjb21lcyAtIDF9OyBpKyspIHtcbiAgICAgICAgICBjZGYgKz0gZ2V0UHJvYnMoYmF0Y2gsIGkpO1xuXG4gICAgICAgICAgaWYgKHIgPCBjZGYpIHtcbiAgICAgICAgICAgIHNldE91dHB1dChmbG9hdChpKSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gb3RoZXIgZXZlbnQgaGFwcGVuZWQsIGxhc3QgZXZlbnQgaGFwcGVuZWQuXG4gICAgICAgIHNldE91dHB1dChmbG9hdCgke251bU91dGNvbWVzIC0gMX0pKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RealDiv } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\n// Without the equality check div produces 0.9999 for a = b, which when\n// floored can cause errors.\nconst DIV = `\nif (a == b) {\n  return 1.0;\n};\nreturn a / b;`;\n// We do the same as in ./binaryop_gpu, with vec4 and ivec4.\n// On Linux, the vectorized implementation produces NaNs when a and b are 0.\nconst DIV_PACKED = `\n  // vec4 one = vec4(equal(a, b));\n  // return one + (vec4(1.0) - one) * a / b;\n  vec4 result = a / b;\n  if(a.x == b.x) {\n    result.x = 1.;\n  }\n  if(a.y == b.y) {\n    result.y = 1.;\n  }\n  if(a.z == b.z) {\n    result.z = 1.;\n  }\n  if(a.w == b.w) {\n    result.w = 1.;\n  }\n\n  return result;\n`;\nexport const realDiv = binaryKernelFunc({ opSnippet: DIV, packedOpSnippet: DIV_PACKED, checkOutOfBounds: true });\nexport const realDivConfig = {\n    kernelName: RealDiv,\n    backendName: 'webgl',\n    kernelFunc: realDiv,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVhbERpdi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZWFsRGl2LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU5QyxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVwRSx1RUFBdUU7QUFDdkUsNEJBQTRCO0FBQzVCLE1BQU0sR0FBRyxHQUFHOzs7O2NBSUUsQ0FBQztBQUVmLDREQUE0RDtBQUM1RCw0RUFBNEU7QUFDNUUsTUFBTSxVQUFVLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtCbEIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsQ0FDbkMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsZ0JBQWdCLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztBQUUzRSxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxPQUFPO0NBQ3BCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7UmVhbERpdn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7S2VybmVsQ29uZmlnfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuLy8gV2l0aG91dCB0aGUgZXF1YWxpdHkgY2hlY2sgZGl2IHByb2R1Y2VzIDAuOTk5OSBmb3IgYSA9IGIsIHdoaWNoIHdoZW5cbi8vIGZsb29yZWQgY2FuIGNhdXNlIGVycm9ycy5cbmNvbnN0IERJViA9IGBcbmlmIChhID09IGIpIHtcbiAgcmV0dXJuIDEuMDtcbn07XG5yZXR1cm4gYSAvIGI7YDtcblxuLy8gV2UgZG8gdGhlIHNhbWUgYXMgaW4gLi9iaW5hcnlvcF9ncHUsIHdpdGggdmVjNCBhbmQgaXZlYzQuXG4vLyBPbiBMaW51eCwgdGhlIHZlY3Rvcml6ZWQgaW1wbGVtZW50YXRpb24gcHJvZHVjZXMgTmFOcyB3aGVuIGEgYW5kIGIgYXJlIDAuXG5jb25zdCBESVZfUEFDS0VEID0gYFxuICAvLyB2ZWM0IG9uZSA9IHZlYzQoZXF1YWwoYSwgYikpO1xuICAvLyByZXR1cm4gb25lICsgKHZlYzQoMS4wKSAtIG9uZSkgKiBhIC8gYjtcbiAgdmVjNCByZXN1bHQgPSBhIC8gYjtcbiAgaWYoYS54ID09IGIueCkge1xuICAgIHJlc3VsdC54ID0gMS47XG4gIH1cbiAgaWYoYS55ID09IGIueSkge1xuICAgIHJlc3VsdC55ID0gMS47XG4gIH1cbiAgaWYoYS56ID09IGIueikge1xuICAgIHJlc3VsdC56ID0gMS47XG4gIH1cbiAgaWYoYS53ID09IGIudykge1xuICAgIHJlc3VsdC53ID0gMS47XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHJlYWxEaXYgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IERJViwgcGFja2VkT3BTbmlwcGV0OiBESVZfUEFDS0VELCBjaGVja091dE9mQm91bmRzOiB0cnVlfSk7XG5cbmV4cG9ydCBjb25zdCByZWFsRGl2Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlYWxEaXYsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZWFsRGl2LFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sub } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { subImplCPU as cpuSub } from '../kernel_utils/shared';\nconst SUB = 'return a - b;';\nexport const sub = binaryKernelFunc({\n    opSnippet: SUB,\n    packedOpSnippet: SUB,\n    supportsComplex: true,\n    cpuKernelImpl: cpuSub\n});\nexport const subConfig = {\n    kernelName: Sub,\n    backendName: 'webgl',\n    kernelFunc: sub\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3ViLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1N1Yi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDcEUsT0FBTyxFQUFDLFVBQVUsSUFBSSxNQUFNLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUU1RCxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUM7QUFFNUIsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0lBQ2xDLFNBQVMsRUFBRSxHQUFHO0lBQ2QsZUFBZSxFQUFFLEdBQUc7SUFDcEIsZUFBZSxFQUFFLElBQUk7SUFDckIsYUFBYSxFQUFFLE1BQU07Q0FDdEIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sU0FBUyxHQUFpQjtJQUNyQyxVQUFVLEVBQUUsR0FBRztJQUNmLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxHQUFHO0NBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTdWJ9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7YmluYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5pbXBvcnQge3N1YkltcGxDUFUgYXMgY3B1U3VifSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgU1VCID0gJ3JldHVybiBhIC0gYjsnO1xuXG5leHBvcnQgY29uc3Qgc3ViID0gYmluYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogU1VCLFxuICBwYWNrZWRPcFNuaXBwZXQ6IFNVQixcbiAgc3VwcG9ydHNDb21wbGV4OiB0cnVlLFxuICBjcHVLZXJuZWxJbXBsOiBjcHVTdWJcbn0pO1xuXG5leHBvcnQgY29uc3Qgc3ViQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN1YixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHN1YlxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Softmax, util } from '@tensorflow/tfjs-core';\nimport { exp } from './Exp';\nimport { max } from './Max';\nimport { realDiv } from './RealDiv';\nimport { reshape } from './Reshape';\nimport { sub } from './Sub';\nimport { sum } from './Sum';\nexport function softmax(args) {\n    const { inputs, backend, attrs } = args;\n    const { logits } = inputs;\n    const { dim } = attrs;\n    const axes = util.parseAxisParam([dim], logits.shape);\n    const maxLogit = max({\n        inputs: { x: logits },\n        backend,\n        attrs: { reductionIndices: axes, keepDims: false }\n    });\n    const expandedShape = backend_util.expandShapeToKeepDim(maxLogit.shape, axes);\n    const maxLogitsReshaped = reshape({ inputs: { x: maxLogit }, backend, attrs: { shape: expandedShape } });\n    const a = sub({ inputs: { a: logits, b: maxLogitsReshaped }, backend });\n    const b = exp({ inputs: { x: a }, backend });\n    const sumExp = sum({ inputs: { x: b }, backend, attrs: { axis: axes, keepDims: false } });\n    const sumExpReshaped = reshape({ inputs: { x: sumExp }, backend, attrs: { shape: expandedShape } });\n    const res = realDiv({ inputs: { a: b, b: sumExpReshaped }, backend });\n    backend.disposeIntermediateTensorInfo(maxLogit);\n    backend.disposeIntermediateTensorInfo(maxLogitsReshaped);\n    backend.disposeIntermediateTensorInfo(a);\n    backend.disposeIntermediateTensorInfo(b);\n    backend.disposeIntermediateTensorInfo(sumExp);\n    backend.disposeIntermediateTensorInfo(sumExpReshaped);\n    return res;\n}\nexport const softmaxConfig = {\n    kernelName: Softmax,\n    backendName: 'webgl',\n    kernelFunc: softmax\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdG1heC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Tb2Z0bWF4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQTRCLE9BQU8sRUFBMkMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFJckksT0FBTyxFQUFDLEdBQUcsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsR0FBRyxFQUFDLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSxPQUFPLENBQUM7QUFFMUIsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUl2QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hCLE1BQU0sRUFBQyxHQUFHLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFcEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV0RCxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUM7UUFDbkIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQztRQUNuQixPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsZ0JBQWdCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUM7S0FDakQsQ0FBQyxDQUFDO0lBRUgsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLG9CQUFvQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFFOUUsTUFBTSxpQkFBaUIsR0FDbkIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLFFBQVEsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLE1BQU0sQ0FBQyxHQUNILEdBQUcsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLGlCQUFpQixFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUM1RSxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQWUsQ0FBQztJQUN2RCxNQUFNLE1BQU0sR0FDUixHQUFHLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEtBQUssRUFBQyxFQUFDLENBQUMsQ0FBQztJQUN6RSxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsYUFBYSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRTNFLE1BQU0sR0FBRyxHQUNMLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLGNBQWMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFlLENBQUM7SUFFeEUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3pELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUV0RCxPQUFPLEdBQUcsQ0FBQztBQUNiLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTb2Z0bWF4LCBTb2Z0bWF4QXR0cnMsIFNvZnRtYXhJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7ZXhwfSBmcm9tICcuL0V4cCc7XG5pbXBvcnQge21heH0gZnJvbSAnLi9NYXgnO1xuaW1wb3J0IHtyZWFsRGl2fSBmcm9tICcuL1JlYWxEaXYnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzdWJ9IGZyb20gJy4vU3ViJztcbmltcG9ydCB7c3VtfSBmcm9tICcuL1N1bSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzb2Z0bWF4KGFyZ3M6IHtcbiAgaW5wdXRzOiBTb2Z0bWF4SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogU29mdG1heEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtsb2dpdHN9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGltfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGF4ZXMgPSB1dGlsLnBhcnNlQXhpc1BhcmFtKFtkaW1dLCBsb2dpdHMuc2hhcGUpO1xuXG4gIGNvbnN0IG1heExvZ2l0ID0gbWF4KHtcbiAgICBpbnB1dHM6IHt4OiBsb2dpdHN9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtyZWR1Y3Rpb25JbmRpY2VzOiBheGVzLCBrZWVwRGltczogZmFsc2V9XG4gIH0pO1xuXG4gIGNvbnN0IGV4cGFuZGVkU2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0obWF4TG9naXQuc2hhcGUsIGF4ZXMpO1xuXG4gIGNvbnN0IG1heExvZ2l0c1Jlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IG1heExvZ2l0fSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZXhwYW5kZWRTaGFwZX19KTtcbiAgY29uc3QgYSA9XG4gICAgICBzdWIoe2lucHV0czoge2E6IGxvZ2l0cywgYjogbWF4TG9naXRzUmVzaGFwZWR9LCBiYWNrZW5kfSkgYXMgVGVuc29ySW5mbztcbiAgY29uc3QgYiA9IGV4cCh7aW5wdXRzOiB7eDogYX0sIGJhY2tlbmR9KSBhcyBUZW5zb3JJbmZvO1xuICBjb25zdCBzdW1FeHAgPVxuICAgICAgc3VtKHtpbnB1dHM6IHt4OiBifSwgYmFja2VuZCwgYXR0cnM6IHtheGlzOiBheGVzLCBrZWVwRGltczogZmFsc2V9fSk7XG4gIGNvbnN0IHN1bUV4cFJlc2hhcGVkID1cbiAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHN1bUV4cH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IGV4cGFuZGVkU2hhcGV9fSk7XG5cbiAgY29uc3QgcmVzID1cbiAgICAgIHJlYWxEaXYoe2lucHV0czoge2E6IGIsIGI6IHN1bUV4cFJlc2hhcGVkfSwgYmFja2VuZH0pIGFzIFRlbnNvckluZm87XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhtYXhMb2dpdCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8obWF4TG9naXRzUmVzaGFwZWQpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGEpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGIpO1xuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHN1bUV4cCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8oc3VtRXhwUmVzaGFwZWQpO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBzb2Z0bWF4Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNvZnRtYXgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzb2Z0bWF4IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Multinomial } from '@tensorflow/tfjs-core';\nimport { MultinomialProgram } from '../multinomial_gpu';\nimport { softmax } from './Softmax';\nexport function multinomial(args) {\n    const { inputs, backend, attrs } = args;\n    const { logits } = inputs;\n    const { numSamples, seed, normalized } = attrs;\n    const probs = normalized ?\n        logits :\n        softmax({ inputs: { logits }, backend, attrs: { dim: logits.shape.length - 1 } });\n    const batchSize = probs.shape[0];\n    const numOutcomes = probs.shape[1];\n    const program = new MultinomialProgram(batchSize, numOutcomes, numSamples);\n    const customValues = [[seed]];\n    const res = backend.runWebGLProgram(program, [probs], 'int32', customValues);\n    if (!normalized) {\n        backend.disposeIntermediateTensorInfo(probs);\n    }\n    return res;\n}\nexport const multinomialConfig = {\n    kernelName: Multinomial,\n    backendName: 'webgl',\n    kernelFunc: multinomial\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTXVsdGlub21pYWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvTXVsdGlub21pYWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixXQUFXLEVBQWtELE1BQU0sdUJBQXVCLENBQUM7QUFHN0gsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sb0JBQW9CLENBQUM7QUFFdEQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUVsQyxNQUFNLFVBQVUsV0FBVyxDQUFDLElBSTNCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxNQUFNLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDeEIsTUFBTSxFQUFDLFVBQVUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTdDLE1BQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDO1FBQ1IsT0FBTyxDQUNILEVBQUMsTUFBTSxFQUFFLEVBQUMsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDNUUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNqQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25DLE1BQU0sT0FBTyxHQUFHLElBQUksa0JBQWtCLENBQUMsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUMzRSxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUM5QixNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLEtBQUssQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM3RSxJQUFJLENBQUMsVUFBVSxFQUFFO1FBQ2YsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQzlDO0lBQ0QsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQWlCO0lBQzdDLFVBQVUsRUFBRSxXQUFXO0lBQ3ZCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxXQUErQjtDQUM1QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTXVsdGlub21pYWwsIE11bHRpbm9taWFsQXR0cnMsIE11bHRpbm9taWFsSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtNdWx0aW5vbWlhbFByb2dyYW19IGZyb20gJy4uL211bHRpbm9taWFsX2dwdSc7XG5cbmltcG9ydCB7c29mdG1heH0gZnJvbSAnLi9Tb2Z0bWF4JztcblxuZXhwb3J0IGZ1bmN0aW9uIG11bHRpbm9taWFsKGFyZ3M6IHtcbiAgaW5wdXRzOiBNdWx0aW5vbWlhbElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE11bHRpbm9taWFsQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2xvZ2l0c30gPSBpbnB1dHM7XG4gIGNvbnN0IHtudW1TYW1wbGVzLCBzZWVkLCBub3JtYWxpemVkfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2JzID0gbm9ybWFsaXplZCA/XG4gICAgICBsb2dpdHMgOlxuICAgICAgc29mdG1heChcbiAgICAgICAgICB7aW5wdXRzOiB7bG9naXRzfSwgYmFja2VuZCwgYXR0cnM6IHtkaW06IGxvZ2l0cy5zaGFwZS5sZW5ndGggLSAxfX0pO1xuICBjb25zdCBiYXRjaFNpemUgPSBwcm9icy5zaGFwZVswXTtcbiAgY29uc3QgbnVtT3V0Y29tZXMgPSBwcm9icy5zaGFwZVsxXTtcbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBNdWx0aW5vbWlhbFByb2dyYW0oYmF0Y2hTaXplLCBudW1PdXRjb21lcywgbnVtU2FtcGxlcyk7XG4gIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbc2VlZF1dO1xuICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbcHJvYnNdLCAnaW50MzInLCBjdXN0b21WYWx1ZXMpO1xuICBpZiAoIW5vcm1hbGl6ZWQpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHByb2JzKTtcbiAgfVxuICByZXR1cm4gcmVzO1xufVxuXG5leHBvcnQgY29uc3QgbXVsdGlub21pYWxDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTXVsdGlub21pYWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBtdWx0aW5vbWlhbCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, Neg } from '@tensorflow/tfjs-core';\nimport { negImplCPU } from '../kernel_utils/shared';\nimport { CHECK_NAN_SNIPPET, UnaryOpProgram } from '../unaryop_gpu';\nimport { UnaryOpPackedProgram } from '../unaryop_packed_gpu';\nconst NEG = CHECK_NAN_SNIPPET + `\n  return -x;\n`;\nconst NEG_PACKED = `\n  vec4 result = -x;\n  bvec4 isNaN = isnan(x);\n\n  result.r = isNaN.r ? x.r : result.r;\n  result.g = isNaN.g ? x.g : result.g;\n  result.b = isNaN.b ? x.b : result.b;\n  result.a = isNaN.a ? x.a : result.a;\n\n  return result;\n`;\n// This doesn't use unaryKernelFunc because negImplCPU is not of type\n// SimpleUnaryKernelImplCPU.\nexport function neg(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    if (backend.shouldExecuteOnCPU([x])) {\n        const xData = backend.texData.get(x.dataId);\n        const [outValues, newShape] = negImplCPU(xData.values, x.shape, x.dtype);\n        return backend.makeTensorInfo(newShape, x.dtype, outValues);\n    }\n    let program;\n    if (env().getBool('WEBGL_PACK_UNARY_OPERATIONS')) {\n        program = new UnaryOpPackedProgram(x.shape, NEG_PACKED);\n    }\n    else {\n        program = new UnaryOpProgram(x.shape, NEG);\n    }\n    return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const negConfig = {\n    kernelName: Neg,\n    backendName: 'webgl',\n    kernelFunc: neg\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTmVnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL05lZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixHQUFHLEVBQW9DLE1BQU0sdUJBQXVCLENBQUM7QUFHNUcsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2xELE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNqRSxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUUzRCxNQUFNLEdBQUcsR0FBRyxpQkFBaUIsR0FBRzs7Q0FFL0IsQ0FBQztBQUVGLE1BQU0sVUFBVSxHQUFHOzs7Ozs7Ozs7O0NBVWxCLENBQUM7QUFFRixxRUFBcUU7QUFDckUsNEJBQTRCO0FBQzVCLE1BQU0sVUFBVSxHQUFHLENBQUMsSUFBb0Q7SUFFdEUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUVuQixJQUFJLE9BQU8sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDbkMsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzVDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLEdBQ3ZCLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBb0IsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUM3RCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7S0FDN0Q7SUFFRCxJQUFJLE9BQTRDLENBQUM7SUFDakQsSUFBSSxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsRUFBRTtRQUNoRCxPQUFPLEdBQUcsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0tBQ3pEO1NBQU07UUFDTCxPQUFPLEdBQUcsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztLQUM1QztJQUVELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTmVnLCBOZWdJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge25lZ0ltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVCwgVW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcbmltcG9ydCB7VW5hcnlPcFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfcGFja2VkX2dwdSc7XG5cbmNvbnN0IE5FRyA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gLXg7XG5gO1xuXG5jb25zdCBORUdfUEFDS0VEID0gYFxuICB2ZWM0IHJlc3VsdCA9IC14O1xuICBidmVjNCBpc05hTiA9IGlzbmFuKHgpO1xuXG4gIHJlc3VsdC5yID0gaXNOYU4uciA/IHguciA6IHJlc3VsdC5yO1xuICByZXN1bHQuZyA9IGlzTmFOLmcgPyB4LmcgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc05hTi5iID8geC5iIDogcmVzdWx0LmI7XG4gIHJlc3VsdC5hID0gaXNOYU4uYSA/IHguYSA6IHJlc3VsdC5hO1xuXG4gIHJldHVybiByZXN1bHQ7XG5gO1xuXG4vLyBUaGlzIGRvZXNuJ3QgdXNlIHVuYXJ5S2VybmVsRnVuYyBiZWNhdXNlIG5lZ0ltcGxDUFUgaXMgbm90IG9mIHR5cGVcbi8vIFNpbXBsZVVuYXJ5S2VybmVsSW1wbENQVS5cbmV4cG9ydCBmdW5jdGlvbiBuZWcoYXJnczoge2lucHV0czogTmVnSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbeF0pKSB7XG4gICAgY29uc3QgeERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgICBjb25zdCBbb3V0VmFsdWVzLCBuZXdTaGFwZV0gPVxuICAgICAgICBuZWdJbXBsQ1BVKHhEYXRhLnZhbHVlcyBhcyBUeXBlZEFycmF5LCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhuZXdTaGFwZSwgeC5kdHlwZSwgb3V0VmFsdWVzKTtcbiAgfVxuXG4gIGxldCBwcm9ncmFtOiBVbmFyeU9wUHJvZ3JhbXxVbmFyeU9wUGFja2VkUHJvZ3JhbTtcbiAgaWYgKGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfVU5BUllfT1BFUkFUSU9OUycpKSB7XG4gICAgcHJvZ3JhbSA9IG5ldyBVbmFyeU9wUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCBORUdfUEFDS0VEKTtcbiAgfSBlbHNlIHtcbiAgICBwcm9ncmFtID0gbmV3IFVuYXJ5T3BQcm9ncmFtKHguc2hhcGUsIE5FRyk7XG4gIH1cblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5lZ0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBOZWcsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBuZWcgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, kernel_impls, NonMaxSuppressionV3 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV3Impl = kernel_impls.nonMaxSuppressionV3Impl;\nexport function nonMaxSuppressionV3(args) {\n    backend_util.warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' +\n        'Call tf.nonMaxSuppressionAsync() instead');\n    const { inputs, backend, attrs } = args;\n    const { boxes, scores } = inputs;\n    const { maxOutputSize, iouThreshold, scoreThreshold } = attrs;\n    const boxesVals = backend.readSync(boxes.dataId);\n    const scoresVals = backend.readSync(scores.dataId);\n    const { selectedIndices } = nonMaxSuppressionV3Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold);\n    return backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices));\n}\nexport const nonMaxSuppressionV3Config = {\n    kernelName: NonMaxSuppressionV3,\n    backendName: 'webgl',\n    kernelFunc: nonMaxSuppressionV3\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WMy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblYzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUE0QixtQkFBbUIsRUFBa0UsTUFBTSx1QkFBdUIsQ0FBQztBQUVqTCxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUdyRSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFJbkM7SUFDQyxZQUFZLENBQUMsSUFBSSxDQUNiLHVEQUF1RDtRQUN2RCwwQ0FBMEMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDL0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFlLENBQUM7SUFFakUsTUFBTSxFQUFDLGVBQWUsRUFBQyxHQUFHLHVCQUF1QixDQUM3QyxTQUFTLEVBQUUsVUFBVSxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFeEUsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUN6QixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCO0lBQ3JELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG1CQUF1QztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwga2VybmVsX2ltcGxzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE5vbk1heFN1cHByZXNzaW9uVjMsIE5vbk1heFN1cHByZXNzaW9uVjNBdHRycywgTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WM0ltcGw7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WMyhhcmdzOiB7XG4gIGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WM0lucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE5vbk1heFN1cHByZXNzaW9uVjNBdHRyc1xufSkge1xuICBiYWNrZW5kX3V0aWwud2FybihcbiAgICAgICd0Zi5ub25NYXhTdXBwcmVzc2lvbigpIGluIHdlYmdsIGxvY2tzIHRoZSBVSSB0aHJlYWQuICcgK1xuICAgICAgJ0NhbGwgdGYubm9uTWF4U3VwcHJlc3Npb25Bc3luYygpIGluc3RlYWQnKTtcblxuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7Ym94ZXMsIHNjb3Jlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHttYXhPdXRwdXRTaXplLCBpb3VUaHJlc2hvbGQsIHNjb3JlVGhyZXNob2xkfSA9IGF0dHJzO1xuXG4gIGNvbnN0IGJveGVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoYm94ZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCBzY29yZXNWYWxzID0gYmFja2VuZC5yZWFkU3luYyhzY29yZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IHtzZWxlY3RlZEluZGljZXN9ID0gbm9uTWF4U3VwcHJlc3Npb25WM0ltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQpO1xuXG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WMyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjMgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, kernel_impls, NonMaxSuppressionV4 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV4Impl = kernel_impls.nonMaxSuppressionV4Impl;\nexport function nonMaxSuppressionV4(args) {\n    backend_util.warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' +\n        'Call tf.nonMaxSuppressionAsync() instead');\n    const { inputs, backend, attrs } = args;\n    const { boxes, scores } = inputs;\n    const { maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize } = attrs;\n    const boxesVals = backend.readSync(boxes.dataId);\n    const scoresVals = backend.readSync(scores.dataId);\n    const { selectedIndices, validOutputs } = nonMaxSuppressionV4Impl(boxesVals, scoresVals, maxOutputSize, iouThreshold, scoreThreshold, padToMaxOutputSize);\n    return [\n        backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)),\n        backend.makeTensorInfo([], 'int32', new Int32Array([validOutputs]))\n    ];\n}\nexport const nonMaxSuppressionV4Config = {\n    kernelName: NonMaxSuppressionV4,\n    backendName: 'webgl',\n    kernelFunc: nonMaxSuppressionV4\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WNC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3TCxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUlyRSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFJbkM7SUFDQyxZQUFZLENBQUMsSUFBSSxDQUNiLHVEQUF1RDtRQUN2RCwwQ0FBMEMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsa0JBQWtCLEVBQUMsR0FDbkUsS0FBSyxDQUFDO0lBRVYsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDL0QsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFlLENBQUM7SUFFakUsTUFBTSxFQUFDLGVBQWUsRUFBRSxZQUFZLEVBQUMsR0FBRyx1QkFBdUIsQ0FDM0QsU0FBUyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLGNBQWMsRUFDbEUsa0JBQWtCLENBQUMsQ0FBQztJQUV4QixPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLElBQUksVUFBVSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sQ0FBQyxjQUFjLENBQUMsRUFBRSxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUM7S0FDcEUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBrZXJuZWxfaW1wbHMsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTm9uTWF4U3VwcHJlc3Npb25WNCwgTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzLCBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNEltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNEltcGw7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBub25NYXhTdXBwcmVzc2lvblY0KGFyZ3M6IHtcbiAgaW5wdXRzOiBOb25NYXhTdXBwcmVzc2lvblY0SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogTm9uTWF4U3VwcHJlc3Npb25WNEF0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgYmFja2VuZF91dGlsLndhcm4oXG4gICAgICAndGYubm9uTWF4U3VwcHJlc3Npb24oKSBpbiB3ZWJnbCBsb2NrcyB0aGUgVUkgdGhyZWFkLiAnICtcbiAgICAgICdDYWxsIHRmLm5vbk1heFN1cHByZXNzaW9uQXN5bmMoKSBpbnN0ZWFkJyk7XG5cbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2JveGVzLCBzY29yZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7bWF4T3V0cHV0U2l6ZSwgaW91VGhyZXNob2xkLCBzY29yZVRocmVzaG9sZCwgcGFkVG9NYXhPdXRwdXRTaXplfSA9XG4gICAgICBhdHRycztcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKGJveGVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoc2NvcmVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCB7c2VsZWN0ZWRJbmRpY2VzLCB2YWxpZE91dHB1dHN9ID0gbm9uTWF4U3VwcHJlc3Npb25WNEltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsXG4gICAgICBwYWRUb01heE91dHB1dFNpemUpO1xuXG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShbdmFsaWRPdXRwdXRzXSkpXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IE5vbk1heFN1cHByZXNzaW9uVjQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBub25NYXhTdXBwcmVzc2lvblY0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, kernel_impls, NonMaxSuppressionV5 } from '@tensorflow/tfjs-core';\nconst nonMaxSuppressionV5Impl = kernel_impls.nonMaxSuppressionV5Impl;\nexport function nonMaxSuppressionV5(args) {\n    backend_util.warn('tf.nonMaxSuppression() in webgl locks the UI thread. ' +\n        'Call tf.nonMaxSuppressionAsync() instead');\n    const { inputs, backend, attrs } = args;\n    const { boxes, scores } = inputs;\n    const { maxOutputSize, iouThreshold, scoreThreshold, softNmsSigma } = attrs;\n    const boxesVals = backend.readSync(boxes.dataId);\n    const scoresVals = backend.readSync(scores.dataId);\n    const maxOutputSizeVal = maxOutputSize;\n    const iouThresholdVal = iouThreshold;\n    const scoreThresholdVal = scoreThreshold;\n    const softNmsSigmaVal = softNmsSigma;\n    const { selectedIndices, selectedScores } = nonMaxSuppressionV5Impl(boxesVals, scoresVals, maxOutputSizeVal, iouThresholdVal, scoreThresholdVal, softNmsSigmaVal);\n    return [\n        backend.makeTensorInfo([selectedIndices.length], 'int32', new Int32Array(selectedIndices)),\n        backend.makeTensorInfo([selectedScores.length], 'float32', new Float32Array(selectedScores))\n    ];\n}\nexport const nonMaxSuppressionV5Config = {\n    kernelName: NonMaxSuppressionV5,\n    backendName: 'webgl',\n    kernelFunc: nonMaxSuppressionV5\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTm9uTWF4U3VwcHJlc3Npb25WNS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQUUsWUFBWSxFQUE0QixtQkFBbUIsRUFBOEUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3TCxNQUFNLHVCQUF1QixHQUFHLFlBQVksQ0FBQyx1QkFBdUIsQ0FBQztBQUdyRSxNQUFNLFVBQVUsbUJBQW1CLENBQUMsSUFJbkM7SUFDQyxZQUFZLENBQUMsSUFBSSxDQUNiLHVEQUF1RDtRQUN2RCwwQ0FBMEMsQ0FBQyxDQUFDO0lBRWhELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsS0FBSyxFQUFFLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMvQixNQUFNLEVBQUMsYUFBYSxFQUFFLFlBQVksRUFBRSxjQUFjLEVBQUUsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTFFLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQy9ELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBRWpFLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDO0lBQ3ZDLE1BQU0sZUFBZSxHQUFHLFlBQVksQ0FBQztJQUNyQyxNQUFNLGlCQUFpQixHQUFHLGNBQWMsQ0FBQztJQUN6QyxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUM7SUFFckMsTUFBTSxFQUFDLGVBQWUsRUFBRSxjQUFjLEVBQUMsR0FBRyx1QkFBdUIsQ0FDN0QsU0FBUyxFQUFFLFVBQVUsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQ3hELGlCQUFpQixFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBRXhDLE9BQU87UUFDTCxPQUFPLENBQUMsY0FBYyxDQUNsQixDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7UUFDdkUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0tBQzFFLENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQWlCO0lBQ3JELFVBQVUsRUFBRSxtQkFBbUI7SUFDL0IsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG1CQUF1QztDQUNwRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwga2VybmVsX2ltcGxzLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE5vbk1heFN1cHByZXNzaW9uVjUsIE5vbk1heFN1cHByZXNzaW9uVjVBdHRycywgTm9uTWF4U3VwcHJlc3Npb25WNUlucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuY29uc3Qgbm9uTWF4U3VwcHJlc3Npb25WNUltcGwgPSBrZXJuZWxfaW1wbHMubm9uTWF4U3VwcHJlc3Npb25WNUltcGw7XG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5leHBvcnQgZnVuY3Rpb24gbm9uTWF4U3VwcHJlc3Npb25WNShhcmdzOiB7XG4gIGlucHV0czogTm9uTWF4U3VwcHJlc3Npb25WNUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE5vbk1heFN1cHByZXNzaW9uVjVBdHRyc1xufSk6IFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGJhY2tlbmRfdXRpbC53YXJuKFxuICAgICAgJ3RmLm5vbk1heFN1cHByZXNzaW9uKCkgaW4gd2ViZ2wgbG9ja3MgdGhlIFVJIHRocmVhZC4gJyArXG4gICAgICAnQ2FsbCB0Zi5ub25NYXhTdXBwcmVzc2lvbkFzeW5jKCkgaW5zdGVhZCcpO1xuXG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtib3hlcywgc2NvcmVzfSA9IGlucHV0cztcbiAgY29uc3Qge21heE91dHB1dFNpemUsIGlvdVRocmVzaG9sZCwgc2NvcmVUaHJlc2hvbGQsIHNvZnRObXNTaWdtYX0gPSBhdHRycztcblxuICBjb25zdCBib3hlc1ZhbHMgPSBiYWNrZW5kLnJlYWRTeW5jKGJveGVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3Qgc2NvcmVzVmFscyA9IGJhY2tlbmQucmVhZFN5bmMoc2NvcmVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcblxuICBjb25zdCBtYXhPdXRwdXRTaXplVmFsID0gbWF4T3V0cHV0U2l6ZTtcbiAgY29uc3QgaW91VGhyZXNob2xkVmFsID0gaW91VGhyZXNob2xkO1xuICBjb25zdCBzY29yZVRocmVzaG9sZFZhbCA9IHNjb3JlVGhyZXNob2xkO1xuICBjb25zdCBzb2Z0Tm1zU2lnbWFWYWwgPSBzb2Z0Tm1zU2lnbWE7XG5cbiAgY29uc3Qge3NlbGVjdGVkSW5kaWNlcywgc2VsZWN0ZWRTY29yZXN9ID0gbm9uTWF4U3VwcHJlc3Npb25WNUltcGwoXG4gICAgICBib3hlc1ZhbHMsIHNjb3Jlc1ZhbHMsIG1heE91dHB1dFNpemVWYWwsIGlvdVRocmVzaG9sZFZhbCxcbiAgICAgIHNjb3JlVGhyZXNob2xkVmFsLCBzb2Z0Tm1zU2lnbWFWYWwpO1xuXG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW3NlbGVjdGVkSW5kaWNlcy5sZW5ndGhdLCAnaW50MzInLCBuZXcgSW50MzJBcnJheShzZWxlY3RlZEluZGljZXMpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbc2VsZWN0ZWRTY29yZXMubGVuZ3RoXSwgJ2Zsb2F0MzInLCBuZXcgRmxvYXQzMkFycmF5KHNlbGVjdGVkU2NvcmVzKSlcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IG5vbk1heFN1cHByZXNzaW9uVjVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogTm9uTWF4U3VwcHJlc3Npb25WNSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IG5vbk1heFN1cHByZXNzaW9uVjUgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class OneHotProgram {\n    constructor(numIndices, depth, onValue, offValue) {\n        this.variableNames = ['indices'];\n        this.outputShape = [numIndices, depth];\n        this.userCode = `\n      void main() {\n        ivec2 coords = getOutputCoords();\n        int index = round(getIndices(coords.x));\n        setOutput(mix(float(${offValue}), float(${onValue}),\n                      float(index == coords.y)));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib25laG90X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvb25laG90X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sYUFBYTtJQVF4QixZQUNJLFVBQWtCLEVBQUUsS0FBYSxFQUFFLE9BQWUsRUFBRSxRQUFnQjtRQVJ4RSxrQkFBYSxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUM7UUFTMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLFVBQVUsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2QyxJQUFJLENBQUMsUUFBUSxHQUFHOzs7OzhCQUlVLFFBQVEsWUFBWSxPQUFPOzs7S0FHcEQsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBPbmVIb3RQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgLy8gQ2FjaGluZyB1bmlmb3JtIGxvY2F0aW9uIGZvciBzcGVlZC5cbiAgc2VlZExvYzogV2ViR0xVbmlmb3JtTG9jYXRpb247XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBudW1JbmRpY2VzOiBudW1iZXIsIGRlcHRoOiBudW1iZXIsIG9uVmFsdWU6IG51bWJlciwgb2ZmVmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbbnVtSW5kaWNlcywgZGVwdGhdO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzIgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBpbmRleCA9IHJvdW5kKGdldEluZGljZXMoY29vcmRzLngpKTtcbiAgICAgICAgc2V0T3V0cHV0KG1peChmbG9hdCgke29mZlZhbHVlfSksIGZsb2F0KCR7b25WYWx1ZX0pLFxuICAgICAgICAgICAgICAgICAgICAgIGZsb2F0KGluZGV4ID09IGNvb3Jkcy55KSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OneHot, util } from '@tensorflow/tfjs-core';\nimport { OneHotProgram } from '../onehot_gpu';\nimport { reshape } from './Reshape';\nexport const oneHot = (args) => {\n    const { inputs, backend, attrs } = args;\n    const { indices } = inputs;\n    const { dtype, depth, onValue, offValue } = attrs;\n    const indicesSize = util.sizeFromShape(indices.shape);\n    const program = new OneHotProgram(indicesSize, depth, onValue, offValue);\n    const reshaped = reshape({ inputs: { x: indices }, backend, attrs: { shape: [indicesSize] } });\n    const result = backend.runWebGLProgram(program, [reshaped], dtype);\n    backend.disposeIntermediateTensorInfo(reshaped);\n    const outShape = [...indices.shape, depth];\n    const out = reshape({ inputs: { x: result }, backend, attrs: { shape: outShape } });\n    backend.disposeIntermediateTensorInfo(result);\n    return out;\n};\nexport const oneHotConfig = {\n    kernelName: OneHot,\n    backendName: 'webgl',\n    kernelFunc: oneHot\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lSG90LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL09uZUhvdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE1BQU0sRUFBeUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHcEgsT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sQ0FBQyxNQUFNLE1BQU0sR0FBRyxDQUFDLElBSXRCLEVBQWMsRUFBRTtJQUNmLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsT0FBTyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3pCLE1BQU0sRUFBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxhQUFhLENBQUMsV0FBVyxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDekUsTUFBTSxRQUFRLEdBQ1YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxXQUFXLENBQUMsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUM1RSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUVoRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdBQUcsT0FBTyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUMzQyxNQUFNLEdBQUcsR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFDOUUsT0FBTyxDQUFDLDZCQUE2QixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIE9uZUhvdCwgT25lSG90QXR0cnMsIE9uZUhvdElucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7T25lSG90UHJvZ3JhbX0gZnJvbSAnLi4vb25laG90X2dwdSc7XG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5cbmV4cG9ydCBjb25zdCBvbmVIb3QgPSAoYXJnczoge1xuICBpbnB1dHM6IE9uZUhvdElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IE9uZUhvdEF0dHJzXG59KTogVGVuc29ySW5mbyA9PiB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbmRpY2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2R0eXBlLCBkZXB0aCwgb25WYWx1ZSwgb2ZmVmFsdWV9ID0gYXR0cnM7XG5cbiAgY29uc3QgaW5kaWNlc1NpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoaW5kaWNlcy5zaGFwZSk7XG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgT25lSG90UHJvZ3JhbShpbmRpY2VzU2l6ZSwgZGVwdGgsIG9uVmFsdWUsIG9mZlZhbHVlKTtcbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IFtpbmRpY2VzU2l6ZV19fSk7XG4gIGNvbnN0IHJlc3VsdCA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtyZXNoYXBlZF0sIGR0eXBlKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXNoYXBlZCk7XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBbLi4uaW5kaWNlcy5zaGFwZSwgZGVwdGhdO1xuICBjb25zdCBvdXQgPSByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXN1bHQpO1xuICByZXR1cm4gb3V0O1xufTtcblxuZXhwb3J0IGNvbnN0IG9uZUhvdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBPbmVIb3QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBvbmVIb3QgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ZerosLike } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { fill } from './Fill';\nimport { imag } from './Imag';\nimport { real } from './Real';\nexport function zerosLike(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    if (x.dtype === 'complex64') {\n        const realPart = real({ inputs: { input: x }, backend });\n        const r = zerosLike({ inputs: { x: realPart }, backend });\n        const imagPart = imag({ inputs: { input: x }, backend });\n        const i = zerosLike({ inputs: { x: imagPart }, backend });\n        const result = complex({ inputs: { real: r, imag: i }, backend });\n        backend.disposeIntermediateTensorInfo(realPart);\n        backend.disposeIntermediateTensorInfo(r);\n        backend.disposeIntermediateTensorInfo(imagPart);\n        backend.disposeIntermediateTensorInfo(i);\n        return result;\n    }\n    else {\n        return fill({\n            attrs: {\n                shape: x.shape,\n                dtype: x.dtype,\n                value: x.dtype === 'string' ? '' : 0\n            },\n            backend\n        });\n    }\n}\nexport const zerosLikeConfig = {\n    kernelName: ZerosLike,\n    backendName: 'webgl',\n    kernelFunc: zerosLike\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiWmVyb3NMaWtlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1plcm9zTGlrZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLFNBQVMsRUFBa0IsTUFBTSx1QkFBdUIsQ0FBQztBQUl2RyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBRTVCLE1BQU0sVUFBVSxTQUFTLENBQ3JCLElBQTBEO0lBQzVELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbkIsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFdBQVcsRUFBRTtRQUMzQixNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUNyRCxNQUFNLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztRQUV0RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRTlELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6QyxPQUFPLE1BQU0sQ0FBQztLQUNmO1NBQU07UUFDTCxPQUFPLElBQUksQ0FBQztZQUNWLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLO2dCQUNkLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO2FBQ3JDO1lBQ0QsT0FBTztTQUNSLENBQUMsQ0FBQztLQUNKO0FBQ0gsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGVBQWUsR0FBaUI7SUFDM0MsVUFBVSxFQUFFLFNBQVM7SUFDckIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLFNBQTZCO0NBQzFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBaZXJvc0xpa2UsIFplcm9zTGlrZUlucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcblxuaW1wb3J0IHtjb21wbGV4fSBmcm9tICcuL0NvbXBsZXgnO1xuaW1wb3J0IHtmaWxsfSBmcm9tICcuL0ZpbGwnO1xuaW1wb3J0IHtpbWFnfSBmcm9tICcuL0ltYWcnO1xuaW1wb3J0IHtyZWFsfSBmcm9tICcuL1JlYWwnO1xuXG5leHBvcnQgZnVuY3Rpb24gemVyb3NMaWtlKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFplcm9zTGlrZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG5cbiAgaWYgKHguZHR5cGUgPT09ICdjb21wbGV4NjQnKSB7XG4gICAgY29uc3QgcmVhbFBhcnQgPSByZWFsKHtpbnB1dHM6IHtpbnB1dDogeH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCByID0gemVyb3NMaWtlKHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2Uoe2lucHV0czoge3g6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZpbGwoe1xuICAgICAgYXR0cnM6IHtcbiAgICAgICAgc2hhcGU6IHguc2hhcGUsXG4gICAgICAgIGR0eXBlOiB4LmR0eXBlLFxuICAgICAgICB2YWx1ZTogeC5kdHlwZSA9PT0gJ3N0cmluZycgPyAnJyA6IDBcbiAgICAgIH0sXG4gICAgICBiYWNrZW5kXG4gICAgfSk7XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHplcm9zTGlrZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBaZXJvc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB6ZXJvc0xpa2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { OnesLike } from '@tensorflow/tfjs-core';\nimport { complex } from './Complex';\nimport { fill } from './Fill';\nimport { imag } from './Imag';\nimport { real } from './Real';\nimport { zerosLike } from './ZerosLike';\nexport function onesLike(args) {\n    const { inputs, backend } = args;\n    const { x } = inputs;\n    if (x.dtype === 'string') {\n        throw new Error('onesLike is not supported under string dtype');\n    }\n    else if (x.dtype === 'complex64') {\n        const realPart = real({ inputs: { input: x }, backend });\n        const r = onesLike({ inputs: { x: realPart }, backend });\n        const imagPart = imag({ inputs: { input: x }, backend });\n        const i = zerosLike({ inputs: { x: imagPart }, backend });\n        const result = complex({ inputs: { real: r, imag: i }, backend });\n        backend.disposeIntermediateTensorInfo(realPart);\n        backend.disposeIntermediateTensorInfo(r);\n        backend.disposeIntermediateTensorInfo(imagPart);\n        backend.disposeIntermediateTensorInfo(i);\n        return result;\n    }\n    else {\n        // TODO(cais, smilkov): Add WebGL shader for onesLike:\n        //   https://github.com/tensorflow/tfjs/issues/1293\n        return fill({ attrs: { shape: x.shape, dtype: x.dtype, value: 1 }, backend });\n    }\n}\nexport const onesLikeConfig = {\n    kernelName: OnesLike,\n    backendName: 'webgl',\n    kernelFunc: onesLike\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiT25lc0xpa2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvT25lc0xpa2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixRQUFRLEVBQTZCLE1BQU0sdUJBQXVCLENBQUM7QUFJckcsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLElBQUksRUFBQyxNQUFNLFFBQVEsQ0FBQztBQUM1QixPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sYUFBYSxDQUFDO0FBRXRDLE1BQU0sVUFBVSxRQUFRLENBQ3BCLElBQXlEO0lBQzNELE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFFbkIsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsRUFBRTtRQUN4QixNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7S0FDakU7U0FBTSxJQUFJLENBQUMsQ0FBQyxLQUFLLEtBQUssV0FBVyxFQUFFO1FBQ2xDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBQ3JELE1BQU0sQ0FBQyxHQUFHLFNBQVMsQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO1FBRXRELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBQyxDQUFDLENBQUM7UUFFOUQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2hELE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN6QyxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDaEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpDLE9BQU8sTUFBTSxDQUFDO0tBQ2Y7U0FBTTtRQUNMLHNEQUFzRDtRQUN0RCxtREFBbUQ7UUFDbkQsT0FBTyxJQUFJLENBQUMsRUFBQyxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUMzRTtBQUNILENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQWlCO0lBQzFDLFVBQVUsRUFBRSxRQUFRO0lBQ3BCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxRQUE0QjtDQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgT25lc0xpa2UsIE9uZXNMaWtlSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuXG5pbXBvcnQge2NvbXBsZXh9IGZyb20gJy4vQ29tcGxleCc7XG5pbXBvcnQge2ZpbGx9IGZyb20gJy4vRmlsbCc7XG5pbXBvcnQge2ltYWd9IGZyb20gJy4vSW1hZyc7XG5pbXBvcnQge3JlYWx9IGZyb20gJy4vUmVhbCc7XG5pbXBvcnQge3plcm9zTGlrZX0gZnJvbSAnLi9aZXJvc0xpa2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gb25lc0xpa2UoXG4gICAgYXJnczoge2lucHV0czogT25lc0xpa2VJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuXG4gIGlmICh4LmR0eXBlID09PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignb25lc0xpa2UgaXMgbm90IHN1cHBvcnRlZCB1bmRlciBzdHJpbmcgZHR5cGUnKTtcbiAgfSBlbHNlIGlmICh4LmR0eXBlID09PSAnY29tcGxleDY0Jykge1xuICAgIGNvbnN0IHJlYWxQYXJ0ID0gcmVhbCh7aW5wdXRzOiB7aW5wdXQ6IHh9LCBiYWNrZW5kfSk7XG4gICAgY29uc3QgciA9IG9uZXNMaWtlKHtpbnB1dHM6IHt4OiByZWFsUGFydH0sIGJhY2tlbmR9KTtcbiAgICBjb25zdCBpbWFnUGFydCA9IGltYWcoe2lucHV0czoge2lucHV0OiB4fSwgYmFja2VuZH0pO1xuICAgIGNvbnN0IGkgPSB6ZXJvc0xpa2Uoe2lucHV0czoge3g6IGltYWdQYXJ0fSwgYmFja2VuZH0pO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gY29tcGxleCh7aW5wdXRzOiB7cmVhbDogciwgaW1hZzogaX0sIGJhY2tlbmR9KTtcblxuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVhbFBhcnQpO1xuICAgIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocik7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpbWFnUGFydCk7XG4gICAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhpKTtcblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgLy8gVE9ETyhjYWlzLCBzbWlsa292KTogQWRkIFdlYkdMIHNoYWRlciBmb3Igb25lc0xpa2U6XG4gICAgLy8gICBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZmpzL2lzc3Vlcy8xMjkzXG4gICAgcmV0dXJuIGZpbGwoe2F0dHJzOiB7c2hhcGU6IHguc2hhcGUsIGR0eXBlOiB4LmR0eXBlLCB2YWx1ZTogMX0sIGJhY2tlbmR9KTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3Qgb25lc0xpa2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogT25lc0xpa2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBvbmVzTGlrZSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pack, util } from '@tensorflow/tfjs-core';\nimport { concat } from './Concat';\nimport { expandDims } from './ExpandDims';\nexport function pack(args) {\n    const { inputs, backend, attrs } = args;\n    const { axis } = attrs;\n    if (inputs.length === 1) {\n        return expandDims({ inputs: { input: inputs[0] }, backend, attrs: { dim: axis } });\n    }\n    const shape = inputs[0].shape;\n    const dtype = inputs[0].dtype;\n    inputs.forEach(t => {\n        util.assertShapesMatch(shape, t.shape, 'All tensors passed to stack must have matching shapes');\n        util.assert(dtype === t.dtype, () => 'All tensors passed to stack must have matching dtypes');\n    });\n    const intermediateTensorInfos = [];\n    const expandedTensors = inputs.map(t => {\n        const expandedT = expandDims({ inputs: { input: t }, backend, attrs: { dim: axis } });\n        intermediateTensorInfos.push(expandedT);\n        return expandedT;\n    });\n    const result = concat({ inputs: expandedTensors, backend, attrs: { axis } });\n    intermediateTensorInfos.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return result;\n}\nexport const packConfig = {\n    kernelName: Pack,\n    backendName: 'webgl',\n    kernelFunc: pack\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFjay5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9QYWNrLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFxQyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUc5RyxPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sVUFBVSxDQUFDO0FBQ2hDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxjQUFjLENBQUM7QUFFeEMsTUFBTSxVQUFVLElBQUksQ0FDaEIsSUFBdUU7SUFFekUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsSUFBSSxNQUFNLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUN2QixPQUFPLFVBQVUsQ0FDYixFQUFDLE1BQU0sRUFBRSxFQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsR0FBRyxFQUFFLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztLQUNoRTtJQUVELE1BQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7SUFDOUIsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztJQUU5QixNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1FBQ2pCLElBQUksQ0FBQyxpQkFBaUIsQ0FDbEIsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLEVBQ2QsdURBQXVELENBQUMsQ0FBQztRQUM3RCxJQUFJLENBQUMsTUFBTSxDQUNQLEtBQUssS0FBSyxDQUFDLENBQUMsS0FBSyxFQUNqQixHQUFHLEVBQUUsQ0FBQyx1REFBdUQsQ0FBQyxDQUFDO0lBQ3JFLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSx1QkFBdUIsR0FBaUIsRUFBRSxDQUFDO0lBQ2pELE1BQU0sZUFBZSxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUU7UUFDckMsTUFBTSxTQUFTLEdBQ1gsVUFBVSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxHQUFHLEVBQUUsSUFBSSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ2xFLHVCQUF1QixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QyxPQUFPLFNBQVMsQ0FBQztJQUNuQixDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxFQUFDLE1BQU0sRUFBRSxlQUFlLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztJQUV6RSx1QkFBdUIsQ0FBQyxPQUFPLENBQzNCLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFbkQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBQYWNrLCBQYWNrQXR0cnMsIFBhY2tJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge2NvbmNhdH0gZnJvbSAnLi9Db25jYXQnO1xuaW1wb3J0IHtleHBhbmREaW1zfSBmcm9tICcuL0V4cGFuZERpbXMnO1xuXG5leHBvcnQgZnVuY3Rpb24gcGFjayhcbiAgICBhcmdzOiB7aW5wdXRzOiBQYWNrSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogUGFja0F0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtheGlzfSA9IGF0dHJzO1xuXG4gIGlmIChpbnB1dHMubGVuZ3RoID09PSAxKSB7XG4gICAgcmV0dXJuIGV4cGFuZERpbXMoXG4gICAgICAgIHtpbnB1dHM6IHtpbnB1dDogaW5wdXRzWzBdfSwgYmFja2VuZCwgYXR0cnM6IHtkaW06IGF4aXN9fSk7XG4gIH1cblxuICBjb25zdCBzaGFwZSA9IGlucHV0c1swXS5zaGFwZTtcbiAgY29uc3QgZHR5cGUgPSBpbnB1dHNbMF0uZHR5cGU7XG5cbiAgaW5wdXRzLmZvckVhY2godCA9PiB7XG4gICAgdXRpbC5hc3NlcnRTaGFwZXNNYXRjaChcbiAgICAgICAgc2hhcGUsIHQuc2hhcGUsXG4gICAgICAgICdBbGwgdGVuc29ycyBwYXNzZWQgdG8gc3RhY2sgbXVzdCBoYXZlIG1hdGNoaW5nIHNoYXBlcycpO1xuICAgIHV0aWwuYXNzZXJ0KFxuICAgICAgICBkdHlwZSA9PT0gdC5kdHlwZSxcbiAgICAgICAgKCkgPT4gJ0FsbCB0ZW5zb3JzIHBhc3NlZCB0byBzdGFjayBtdXN0IGhhdmUgbWF0Y2hpbmcgZHR5cGVzJyk7XG4gIH0pO1xuXG4gIGNvbnN0IGludGVybWVkaWF0ZVRlbnNvckluZm9zOiBUZW5zb3JJbmZvW10gPSBbXTtcbiAgY29uc3QgZXhwYW5kZWRUZW5zb3JzID0gaW5wdXRzLm1hcCh0ID0+IHtcbiAgICBjb25zdCBleHBhbmRlZFQgPVxuICAgICAgICBleHBhbmREaW1zKHtpbnB1dHM6IHtpbnB1dDogdH0sIGJhY2tlbmQsIGF0dHJzOiB7ZGltOiBheGlzfX0pO1xuICAgIGludGVybWVkaWF0ZVRlbnNvckluZm9zLnB1c2goZXhwYW5kZWRUKTtcbiAgICByZXR1cm4gZXhwYW5kZWRUO1xuICB9KTtcblxuICBjb25zdCByZXN1bHQgPSBjb25jYXQoe2lucHV0czogZXhwYW5kZWRUZW5zb3JzLCBiYWNrZW5kLCBhdHRyczoge2F4aXN9fSk7XG5cbiAgaW50ZXJtZWRpYXRlVGVuc29ySW5mb3MuZm9yRWFjaChcbiAgICAgIHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZXhwb3J0IGNvbnN0IHBhY2tDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUGFjayxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBhY2sgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class PadProgram {\n    constructor(xShape, paddings, constantValue) {\n        this.variableNames = ['x'];\n        this.customUniforms = [{ name: 'value', type: 'float' }];\n        this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */);\n        const rank = xShape.length;\n        const type = getCoordsDataType(rank);\n        const start = paddings.map(p => p[0]).join(',');\n        const end = paddings.map((p, i) => p[0] + xShape[i]).join(',');\n        const unpackedCoords = ['coords[0]', 'coords[1]', 'coords[2]', 'coords[3]'].slice(0, rank);\n        if (rank === 1) {\n            this.userCode = `\n        int start = ${start};\n        int end = ${end};\n\n        void main() {\n          int outC = getOutputCoords();\n          if (outC < start || outC >= end) {\n            setOutput(value);\n          } else {\n            setOutput(getX(outC - start));\n          }\n        }\n      `;\n            return;\n        }\n        this.userCode = `\n      ${type} start = ${type}(${start});\n      ${type} end = ${type}(${end});\n\n      void main() {\n        ${type} outC = getOutputCoords();\n        if (any(lessThan(outC, start)) || any(greaterThanEqual(outC, end))) {\n          setOutput(value);\n        } else {\n          ${type} coords = outC - start;\n          setOutput(getX(${unpackedCoords}));\n        }\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcGFkX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsaUJBQWlCLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRSxNQUFNLE9BQU8sVUFBVTtJQU1yQixZQUNJLE1BQWdCLEVBQUUsUUFBaUMsRUFDbkQsYUFBcUI7UUFQekIsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLG1CQUFjLEdBQUcsQ0FBQyxFQUFDLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQXNCLEVBQUMsQ0FBQyxDQUFDO1FBSy9ELElBQUksQ0FBQyxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FDM0IsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDdEUsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztRQUMzQixNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUVyQyxNQUFNLEtBQUssR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sR0FBRyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sY0FBYyxHQUNoQixDQUFDLFdBQVcsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFeEUsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFO1lBQ2QsSUFBSSxDQUFDLFFBQVEsR0FBRztzQkFDQSxLQUFLO29CQUNQLEdBQUc7Ozs7Ozs7Ozs7T0FVaEIsQ0FBQztZQUNGLE9BQU87U0FDUjtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUc7UUFDWixJQUFJLFlBQVksSUFBSSxJQUFJLEtBQUs7UUFDN0IsSUFBSSxVQUFVLElBQUksSUFBSSxHQUFHOzs7VUFHdkIsSUFBSTs7OztZQUlGLElBQUk7MkJBQ1csY0FBYzs7O0tBR3BDLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZSwgVW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFBhZFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICd2YWx1ZScsIHR5cGU6ICdmbG9hdCcgYXMgVW5pZm9ybVR5cGV9XTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHhTaGFwZTogbnVtYmVyW10sIHBhZGRpbmdzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPixcbiAgICAgIGNvbnN0YW50VmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgIChwLCBpKSA9PiBwWzBdIC8qIGJlZm9yZVBhZCAqLyArIHhTaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgIGNvbnN0IHJhbmsgPSB4U2hhcGUubGVuZ3RoO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcblxuICAgIGNvbnN0IHN0YXJ0ID0gcGFkZGluZ3MubWFwKHAgPT4gcFswXSkuam9pbignLCcpO1xuICAgIGNvbnN0IGVuZCA9IHBhZGRpbmdzLm1hcCgocCwgaSkgPT4gcFswXSArIHhTaGFwZVtpXSkuam9pbignLCcpO1xuICAgIGNvbnN0IHVucGFja2VkQ29vcmRzID1cbiAgICAgICAgWydjb29yZHNbMF0nLCAnY29vcmRzWzFdJywgJ2Nvb3Jkc1syXScsICdjb29yZHNbM10nXS5zbGljZSgwLCByYW5rKTtcblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICBpbnQgc3RhcnQgPSAke3N0YXJ0fTtcbiAgICAgICAgaW50IGVuZCA9ICR7ZW5kfTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgaW50IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgICBpZiAob3V0QyA8IHN0YXJ0IHx8IG91dEMgPj0gZW5kKSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQodmFsdWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZ2V0WChvdXRDIC0gc3RhcnQpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIGA7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAke3R5cGV9IHN0YXJ0ID0gJHt0eXBlfSgke3N0YXJ0fSk7XG4gICAgICAke3R5cGV9IGVuZCA9ICR7dHlwZX0oJHtlbmR9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3R5cGV9IG91dEMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaWYgKGFueShsZXNzVGhhbihvdXRDLCBzdGFydCkpIHx8IGFueShncmVhdGVyVGhhbkVxdWFsKG91dEMsIGVuZCkpKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KHZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAke3R5cGV9IGNvb3JkcyA9IG91dEMgLSBzdGFydDtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke3VucGFja2VkQ29vcmRzfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class PadPackedProgram {\n    constructor(xShape, paddings, constantValue) {\n        this.variableNames = ['x'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.customUniforms = [{ name: 'value', type: 'float' }];\n        this.outputShape = paddings.map((p, i) => p[0] /* beforePad */ + xShape[i] + p[1] /* afterPad */);\n        const rank = xShape.length;\n        const dtype = getCoordsDataType(rank);\n        const start = paddings.map(p => p[0]).join(',');\n        const end = paddings.map((p, i) => p[0] + xShape[i]).join(',');\n        const coords = getChannels('rc', rank);\n        const source = getChannels('source', rank);\n        const cLimit = `${coords[rank - 1]} < ${this.outputShape[rank - 1]}`;\n        const innerDims = rank === 1 ? 'source' : `vec2(${source.slice(-2).join()})`;\n        const componentSetup = [\n            `${dtype} rc = outputLoc;`, `${coords[rank - 1]} += 1;\n       if(${cLimit}) {\n      `,\n            rank === 1 ? '' : `}\n       rc = outputLoc;\n       ${coords[rank - 2]} += 1;\n       if(${coords[rank - 2]} < ${this.outputShape[rank - 2]}) {`,\n            rank === 1 ? '' : `  ${coords[rank - 1]} += 1;\n         if(${cLimit}) {`\n        ];\n        const paddingArea = rank === 1 ?\n            'rc < start || rc >= end' :\n            'any(lessThan(rc, start)) || any(greaterThanEqual(rc, end))';\n        let mainLoop = '';\n        for (let i = 0, j = rank === 1 ? 2 : 4; i < j; i++) {\n            mainLoop += `\n        ${componentSetup[i]}\n        if (${paddingArea}) {\n          result[${i}] = float(value);\n        } else {\n          ${dtype} source = rc - start;\n          result[${i}] = getChannel(getX(${source.join()}), ${innerDims});\n        }\n      `;\n        }\n        mainLoop += (rank === 1 ? `} ` : `}}`);\n        this.userCode = `\n      const ${dtype} start = ${dtype}(${start});\n      const ${dtype} end = ${dtype}(${end});\n\n      void main() {\n        ${dtype} outputLoc = getOutputCoords();\n        vec4 result = vec4(0.);\n        ${mainLoop}\n        setOutput(result);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFkX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3BhZF9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUMsaUJBQWlCLEVBQWMsTUFBTSxtQkFBbUIsQ0FBQztBQUVqRSxNQUFNLE9BQU8sZ0JBQWdCO0lBUTNCLFlBQ0ksTUFBZ0IsRUFBRSxRQUFpQyxFQUNuRCxhQUFxQjtRQVR6QixrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFDcEIsaUJBQVksR0FBRyxJQUFJLENBQUM7UUFHcEIsbUJBQWMsR0FBRyxDQUFDLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQyxDQUFDLENBQUM7UUFLL0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUMzQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUN0RSxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXRDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDaEQsTUFBTSxHQUFHLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN2QyxNQUFNLE1BQU0sR0FBRyxXQUFXLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ3JFLE1BQU0sU0FBUyxHQUNYLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztRQUUvRCxNQUFNLGNBQWMsR0FBRztZQUNyQixHQUFHLEtBQUssa0JBQWtCLEVBQUUsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztZQUN6QyxNQUFNO09BQ1g7WUFDRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDOztTQUVmLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1lBQ2IsTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSztZQUMzRCxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUM7Y0FDL0IsTUFBTSxLQUFLO1NBQ3BCLENBQUM7UUFFRixNQUFNLFdBQVcsR0FBRyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUM7WUFDNUIseUJBQXlCLENBQUMsQ0FBQztZQUMzQiw0REFBNEQsQ0FBQztRQUNqRSxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUM7UUFDbEIsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDbEQsUUFBUSxJQUFJO1VBQ1IsY0FBYyxDQUFDLENBQUMsQ0FBQztjQUNiLFdBQVc7bUJBQ04sQ0FBQzs7WUFFUixLQUFLO21CQUNFLENBQUMsdUJBQXVCLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxTQUFTOztPQUVoRSxDQUFDO1NBQ0g7UUFDRCxRQUFRLElBQUksQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXZDLElBQUksQ0FBQyxRQUFRLEdBQUc7Y0FDTixLQUFLLFlBQVksS0FBSyxJQUFJLEtBQUs7Y0FDL0IsS0FBSyxVQUFVLEtBQUssSUFBSSxHQUFHOzs7VUFHL0IsS0FBSzs7VUFFTCxRQUFROzs7S0FHYixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGUsIFVuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBQYWRQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAndmFsdWUnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfV07XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICB4U2hhcGU6IG51bWJlcltdLCBwYWRkaW5nczogQXJyYXk8W251bWJlciwgbnVtYmVyXT4sXG4gICAgICBjb25zdGFudFZhbHVlOiBudW1iZXIpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gcGFkZGluZ3MubWFwKFxuICAgICAgICAocCwgaSkgPT4gcFswXSAvKiBiZWZvcmVQYWQgKi8gKyB4U2hhcGVbaV0gKyBwWzFdIC8qIGFmdGVyUGFkICovKTtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHJhbmspO1xuXG4gICAgY29uc3Qgc3RhcnQgPSBwYWRkaW5ncy5tYXAocCA9PiBwWzBdKS5qb2luKCcsJyk7XG4gICAgY29uc3QgZW5kID0gcGFkZGluZ3MubWFwKChwLCBpKSA9PiBwWzBdICsgeFNoYXBlW2ldKS5qb2luKCcsJyk7XG4gICAgY29uc3QgY29vcmRzID0gZ2V0Q2hhbm5lbHMoJ3JjJywgcmFuayk7XG4gICAgY29uc3Qgc291cmNlID0gZ2V0Q2hhbm5lbHMoJ3NvdXJjZScsIHJhbmspO1xuICAgIGNvbnN0IGNMaW1pdCA9IGAke2Nvb3Jkc1tyYW5rIC0gMV19IDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAxXX1gO1xuICAgIGNvbnN0IGlubmVyRGltcyA9XG4gICAgICAgIHJhbmsgPT09IDEgPyAnc291cmNlJyA6IGB2ZWMyKCR7c291cmNlLnNsaWNlKC0yKS5qb2luKCl9KWA7XG5cbiAgICBjb25zdCBjb21wb25lbnRTZXR1cCA9IFtcbiAgICAgIGAke2R0eXBlfSByYyA9IG91dHB1dExvYztgLCBgJHtjb29yZHNbcmFuayAtIDFdfSArPSAxO1xuICAgICAgIGlmKCR7Y0xpbWl0fSkge1xuICAgICAgYCxcbiAgICAgIHJhbmsgPT09IDEgPyAnJyA6IGB9XG4gICAgICAgcmMgPSBvdXRwdXRMb2M7XG4gICAgICAgJHtjb29yZHNbcmFuayAtIDJdfSArPSAxO1xuICAgICAgIGlmKCR7Y29vcmRzW3JhbmsgLSAyXX0gPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDJdfSkge2AsXG4gICAgICByYW5rID09PSAxID8gJycgOiBgICAke2Nvb3Jkc1tyYW5rIC0gMV19ICs9IDE7XG4gICAgICAgICBpZigke2NMaW1pdH0pIHtgXG4gICAgXTtcblxuICAgIGNvbnN0IHBhZGRpbmdBcmVhID0gcmFuayA9PT0gMSA/XG4gICAgICAgICdyYyA8IHN0YXJ0IHx8IHJjID49IGVuZCcgOlxuICAgICAgICAnYW55KGxlc3NUaGFuKHJjLCBzdGFydCkpIHx8IGFueShncmVhdGVyVGhhbkVxdWFsKHJjLCBlbmQpKSc7XG4gICAgbGV0IG1haW5Mb29wID0gJyc7XG4gICAgZm9yIChsZXQgaSA9IDAsIGogPSByYW5rID09PSAxID8gMiA6IDQ7IGkgPCBqOyBpKyspIHtcbiAgICAgIG1haW5Mb29wICs9IGBcbiAgICAgICAgJHtjb21wb25lbnRTZXR1cFtpXX1cbiAgICAgICAgaWYgKCR7cGFkZGluZ0FyZWF9KSB7XG4gICAgICAgICAgcmVzdWx0WyR7aX1dID0gZmxvYXQodmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICR7ZHR5cGV9IHNvdXJjZSA9IHJjIC0gc3RhcnQ7XG4gICAgICAgICAgcmVzdWx0WyR7aX1dID0gZ2V0Q2hhbm5lbChnZXRYKCR7c291cmNlLmpvaW4oKX0pLCAke2lubmVyRGltc30pO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH1cbiAgICBtYWluTG9vcCArPSAocmFuayA9PT0gMSA/IGB9IGAgOiBgfX1gKTtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCAke2R0eXBlfSBzdGFydCA9ICR7ZHR5cGV9KCR7c3RhcnR9KTtcbiAgICAgIGNvbnN0ICR7ZHR5cGV9IGVuZCA9ICR7ZHR5cGV9KCR7ZW5kfSk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gb3V0cHV0TG9jID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICR7bWFpbkxvb3B9XG4gICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, PadV2, util } from '@tensorflow/tfjs-core';\nimport { PadProgram } from '../pad_gpu';\nimport { PadPackedProgram } from '../pad_packed_gpu';\nimport { fill } from './Fill';\nexport const padV2 = (args) => {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { paddings, constantValue } = attrs;\n    if (util.sizeFromShape(x.shape) === 0) {\n        // Short-circuit the computation, since x doesn't have value, only\n        // the shape is used to compute output shape to pad.\n        const outputShape = paddings.map((p, i) => p[0] /* beforePad */ + x.shape[i] + p[1] /* afterPad */);\n        return fill({\n            backend,\n            attrs: { shape: outputShape, value: constantValue, dtype: x.dtype }\n        });\n    }\n    const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n        new PadPackedProgram(x.shape, paddings, constantValue) :\n        new PadProgram(x.shape, paddings, constantValue);\n    const customValues = [[constantValue]];\n    return backend.runWebGLProgram(program, [x], x.dtype, customValues);\n};\nexport const padV2Config = {\n    kernelName: PadV2,\n    backendName: 'webgl',\n    kernelFunc: padV2\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUGFkVjIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUGFkVjIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBNEIsS0FBSyxFQUF1QyxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUd0SCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sWUFBWSxDQUFDO0FBQ3RDLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBQ25ELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFFNUIsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLENBQUMsSUFBeUUsRUFDM0QsRUFBRTtJQUNYLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxRQUFRLEVBQUUsYUFBYSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXhDLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3JDLGtFQUFrRTtRQUNsRSxvREFBb0Q7UUFDcEQsTUFBTSxXQUFXLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FDNUIsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FDTCxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsZUFBZSxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ2pFLE9BQU8sSUFBSSxDQUFDO1lBQ1YsT0FBTztZQUNQLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBQztTQUNsRSxDQUFDLENBQUM7S0FDSjtJQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFFBQVEsRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDO1FBQ3hELElBQUksVUFBVSxDQUFDLENBQUMsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sWUFBWSxHQUFHLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ3RFLENBQUMsQ0FBQztBQUVWLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQXlCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFBhZFYyLCBQYWRWMkF0dHJzLCBQYWRWMklucHV0cywgVGVuc29ySW5mbywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UGFkUHJvZ3JhbX0gZnJvbSAnLi4vcGFkX2dwdSc7XG5pbXBvcnQge1BhZFBhY2tlZFByb2dyYW19IGZyb20gJy4uL3BhZF9wYWNrZWRfZ3B1JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcblxuZXhwb3J0IGNvbnN0IHBhZFYyID1cbiAgICAoYXJnczoge2lucHV0czogUGFkVjJJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBQYWRWMkF0dHJzfSk6XG4gICAgICAgIFRlbnNvckluZm8gPT4ge1xuICAgICAgICAgIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gICAgICAgICAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICAgICAgICAgIGNvbnN0IHtwYWRkaW5ncywgY29uc3RhbnRWYWx1ZX0gPSBhdHRycztcblxuICAgICAgICAgIGlmICh1dGlsLnNpemVGcm9tU2hhcGUoeC5zaGFwZSkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFNob3J0LWNpcmN1aXQgdGhlIGNvbXB1dGF0aW9uLCBzaW5jZSB4IGRvZXNuJ3QgaGF2ZSB2YWx1ZSwgb25seVxuICAgICAgICAgICAgLy8gdGhlIHNoYXBlIGlzIHVzZWQgdG8gY29tcHV0ZSBvdXRwdXQgc2hhcGUgdG8gcGFkLlxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U2hhcGUgPSBwYWRkaW5ncy5tYXAoXG4gICAgICAgICAgICAgICAgKHAsIGkpID0+XG4gICAgICAgICAgICAgICAgICAgIHBbMF0gLyogYmVmb3JlUGFkICovICsgeC5zaGFwZVtpXSArIHBbMV0gLyogYWZ0ZXJQYWQgKi8pO1xuICAgICAgICAgICAgcmV0dXJuIGZpbGwoe1xuICAgICAgICAgICAgICBiYWNrZW5kLFxuICAgICAgICAgICAgICBhdHRyczoge3NoYXBlOiBvdXRwdXRTaGFwZSwgdmFsdWU6IGNvbnN0YW50VmFsdWUsIGR0eXBlOiB4LmR0eXBlfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgICAgICAgICAgbmV3IFBhZFBhY2tlZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpIDpcbiAgICAgICAgICAgICAgbmV3IFBhZFByb2dyYW0oeC5zaGFwZSwgcGFkZGluZ3MsIGNvbnN0YW50VmFsdWUpO1xuICAgICAgICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9IFtbY29uc3RhbnRWYWx1ZV1dO1xuICAgICAgICAgIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbeF0sIHguZHR5cGUsIGN1c3RvbVZhbHVlcyk7XG4gICAgICAgIH07XG5cbmV4cG9ydCBjb25zdCBwYWRWMkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBQYWRWMixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBhZFYyIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Pow } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_PACKED } from '../binaryop_packed_gpu';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst POW = `\n  if(a < 0.0 && floor(b) < b){\n    return NAN;\n  }\n  if (b == 0.0) {\n    return 1.0;\n  }\n  return (round(mod(b, 2.0)) != 1) ?\n      pow(abs(a), b) : sign(a) * pow(abs(a), b);\n`;\nconst POW_PACKED = `\n  // isModRound1 has 1 for components with round(mod(b, 2.0)) == 1, 0 otherwise.\n  vec4 isModRound1 = vec4(equal(round(mod(b, 2.0)), ivec4(1)));\n  vec4 multiplier = sign(a) * isModRound1 + (vec4(1.0) - isModRound1);\n  vec4 result = multiplier * pow(abs(a), b);\n\n  // Ensure that a^0 = 1, including 0^0 = 1 as this correspond to TF and JS\n  bvec4 isExpZero = equal(b, vec4(0.0));\n  result.r = isExpZero.r ? 1.0 : result.r;\n  result.g = isExpZero.g ? 1.0 : result.g;\n  result.b = isExpZero.b ? 1.0 : result.b;\n  result.a = isExpZero.a ? 1.0 : result.a;\n\n  bvec4 isNaN1 = lessThan(a, vec4(0.0));\n  bvec4 isNaN2 = lessThan(floor(b), b);\n  bvec4 isNaN = bvec4(isNaN1.x && isNaN2.x, isNaN1.y && isNaN2.y, isNaN1.z && isNaN2.z, isNaN1.w && isNaN2.w);\n  ` +\n    CHECK_NAN_SNIPPET_PACKED + `\n  return result;\n`;\nexport const pow = binaryKernelFunc({ opSnippet: POW, packedOpSnippet: POW_PACKED });\nexport const powConfig = {\n    kernelName: Pow,\n    backendName: 'webgl',\n    kernelFunc: pow\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUG93LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Bvdy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLEdBQUcsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXBFLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRXBFLE1BQU0sR0FBRyxHQUFHOzs7Ozs7Ozs7Q0FTWCxDQUFDO0FBRUYsTUFBTSxVQUFVLEdBQUc7Ozs7Ozs7Ozs7Ozs7Ozs7R0FnQmhCO0lBQ0Msd0JBQXdCLEdBQUc7O0NBRTlCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxHQUFHLEdBQ1osZ0JBQWdCLENBQUMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO0FBRXBFLE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBdUI7Q0FDcEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFBvd30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9QQUNLRUR9IGZyb20gJy4uL2JpbmFyeW9wX3BhY2tlZF9ncHUnO1xuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgUE9XID0gYFxuICBpZihhIDwgMC4wICYmIGZsb29yKGIpIDwgYil7XG4gICAgcmV0dXJuIE5BTjtcbiAgfVxuICBpZiAoYiA9PSAwLjApIHtcbiAgICByZXR1cm4gMS4wO1xuICB9XG4gIHJldHVybiAocm91bmQobW9kKGIsIDIuMCkpICE9IDEpID9cbiAgICAgIHBvdyhhYnMoYSksIGIpIDogc2lnbihhKSAqIHBvdyhhYnMoYSksIGIpO1xuYDtcblxuY29uc3QgUE9XX1BBQ0tFRCA9IGBcbiAgLy8gaXNNb2RSb3VuZDEgaGFzIDEgZm9yIGNvbXBvbmVudHMgd2l0aCByb3VuZChtb2QoYiwgMi4wKSkgPT0gMSwgMCBvdGhlcndpc2UuXG4gIHZlYzQgaXNNb2RSb3VuZDEgPSB2ZWM0KGVxdWFsKHJvdW5kKG1vZChiLCAyLjApKSwgaXZlYzQoMSkpKTtcbiAgdmVjNCBtdWx0aXBsaWVyID0gc2lnbihhKSAqIGlzTW9kUm91bmQxICsgKHZlYzQoMS4wKSAtIGlzTW9kUm91bmQxKTtcbiAgdmVjNCByZXN1bHQgPSBtdWx0aXBsaWVyICogcG93KGFicyhhKSwgYik7XG5cbiAgLy8gRW5zdXJlIHRoYXQgYV4wID0gMSwgaW5jbHVkaW5nIDBeMCA9IDEgYXMgdGhpcyBjb3JyZXNwb25kIHRvIFRGIGFuZCBKU1xuICBidmVjNCBpc0V4cFplcm8gPSBlcXVhbChiLCB2ZWM0KDAuMCkpO1xuICByZXN1bHQuciA9IGlzRXhwWmVyby5yID8gMS4wIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNFeHBaZXJvLmcgPyAxLjAgOiByZXN1bHQuZztcbiAgcmVzdWx0LmIgPSBpc0V4cFplcm8uYiA/IDEuMCA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzRXhwWmVyby5hID8gMS4wIDogcmVzdWx0LmE7XG5cbiAgYnZlYzQgaXNOYU4xID0gbGVzc1RoYW4oYSwgdmVjNCgwLjApKTtcbiAgYnZlYzQgaXNOYU4yID0gbGVzc1RoYW4oZmxvb3IoYiksIGIpO1xuICBidmVjNCBpc05hTiA9IGJ2ZWM0KGlzTmFOMS54ICYmIGlzTmFOMi54LCBpc05hTjEueSAmJiBpc05hTjIueSwgaXNOYU4xLnogJiYgaXNOYU4yLnosIGlzTmFOMS53ICYmIGlzTmFOMi53KTtcbiAgYCArXG4gICAgQ0hFQ0tfTkFOX1NOSVBQRVRfUEFDS0VEICsgYFxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHBvdyA9XG4gICAgYmluYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBQT1csIHBhY2tlZE9wU25pcHBldDogUE9XX1BBQ0tFRH0pO1xuXG5leHBvcnQgY29uc3QgcG93Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFBvdyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHBvdyBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Prod, sumOutType, util } from '@tensorflow/tfjs-core';\nimport { reduce } from '../kernel_utils/reduce';\nimport { prodImplCPU } from '../kernel_utils/shared';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport function prod(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { axis, keepDims } = attrs;\n    const xRank = x.shape.length;\n    const toDispose = [];\n    const origAxes = util.parseAxisParam(axis, x.shape);\n    let axes = origAxes;\n    const permutedAxes = backend_util.getAxesPermutation(axes, xRank);\n    let permutedX = x;\n    if (permutedAxes != null) {\n        permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutedAxes } });\n        axes = backend_util.getInnerMostAxes(axes.length, xRank);\n        toDispose.push(permutedX);\n    }\n    backend_util.assertAxesAreInnerMostDims('prod', axes, xRank);\n    let res;\n    if (backend.shouldExecuteOnCPU([permutedX])) {\n        const xVals = backend.texData.get(permutedX.dataId).values;\n        const { outVals, outShape, outDtype } = prodImplCPU(permutedX.shape, permutedX.dtype, xVals, axes);\n        res = backend.makeTensorInfo(outShape, outDtype, outVals);\n    }\n    else {\n        const [outShape, reduceShape] = backend_util.computeOutAndReduceShapes(permutedX.shape, axes);\n        const inSize = util.sizeFromShape(reduceShape);\n        const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n        const outputDType = sumOutType(x.dtype);\n        const reduced = reduce(a2D, outputDType, 'prod', backend);\n        res = reshape({ inputs: { x: reduced }, backend, attrs: { shape: outShape } });\n        toDispose.push(a2D);\n        toDispose.push(reduced);\n    }\n    if (keepDims) {\n        toDispose.push(res);\n        const newShape = backend_util.expandShapeToKeepDim(res.shape, origAxes);\n        res = reshape({ inputs: { x: res }, backend, attrs: { shape: newShape } });\n    }\n    toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return res;\n}\nexport const prodConfig = {\n    kernelName: Prod,\n    backendName: 'webgl',\n    kernelFunc: prod\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJvZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Qcm9kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQTRCLElBQUksRUFBeUIsVUFBVSxFQUEwQixJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUdwSixPQUFPLEVBQUMsTUFBTSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRW5ELE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLFVBQVUsSUFBSSxDQUNoQixJQUF1RTtJQUV6RSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUUvQixNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQztJQUM3QixNQUFNLFNBQVMsR0FBRyxFQUFFLENBQUM7SUFFckIsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ3BELElBQUksSUFBSSxHQUFHLFFBQVEsQ0FBQztJQUNwQixNQUFNLFlBQVksR0FBRyxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ2xFLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLFlBQVksSUFB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SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFByb2QsIFByb2RBdHRycywgUHJvZElucHV0cywgc3VtT3V0VHlwZSwgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmVkdWNlfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvcmVkdWNlJztcbmltcG9ydCB7cHJvZEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5pbXBvcnQge3Jlc2hhcGV9IGZyb20gJy4vUmVzaGFwZSc7XG5pbXBvcnQge3RyYW5zcG9zZX0gZnJvbSAnLi9UcmFuc3Bvc2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gcHJvZChcbiAgICBhcmdzOiB7aW5wdXRzOiBQcm9kSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogUHJvZEF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2F4aXMsIGtlZXBEaW1zfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG4gIGNvbnN0IHRvRGlzcG9zZSA9IFtdO1xuXG4gIGNvbnN0IG9yaWdBeGVzID0gdXRpbC5wYXJzZUF4aXNQYXJhbShheGlzLCB4LnNoYXBlKTtcbiAgbGV0IGF4ZXMgPSBvcmlnQXhlcztcbiAgY29uc3QgcGVybXV0ZWRBeGVzID0gYmFja2VuZF91dGlsLmdldEF4ZXNQZXJtdXRhdGlvbihheGVzLCB4UmFuayk7XG4gIGxldCBwZXJtdXRlZFggPSB4O1xuICBpZiAocGVybXV0ZWRBeGVzICE9IG51bGwpIHtcbiAgICBwZXJtdXRlZFggPSB0cmFuc3Bvc2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3Blcm06IHBlcm11dGVkQXhlc319KTtcbiAgICBheGVzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoYXhlcy5sZW5ndGgsIHhSYW5rKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChwZXJtdXRlZFgpO1xuICB9XG5cbiAgYmFja2VuZF91dGlsLmFzc2VydEF4ZXNBcmVJbm5lck1vc3REaW1zKCdwcm9kJywgYXhlcywgeFJhbmspO1xuXG4gIGxldCByZXM7XG4gIGlmIChiYWNrZW5kLnNob3VsZEV4ZWN1dGVPbkNQVShbcGVybXV0ZWRYXSkpIHtcbiAgICBjb25zdCB4VmFscyA9IGJhY2tlbmQudGV4RGF0YS5nZXQocGVybXV0ZWRYLmRhdGFJZCkudmFsdWVzIGFzIFR5cGVkQXJyYXk7XG4gICAgY29uc3Qge291dFZhbHMsIG91dFNoYXBlLCBvdXREdHlwZX0gPVxuICAgICAgICBwcm9kSW1wbENQVShwZXJtdXRlZFguc2hhcGUsIHBlcm11dGVkWC5kdHlwZSwgeFZhbHMsIGF4ZXMpO1xuICAgIHJlcyA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0U2hhcGUsIG91dER0eXBlLCBvdXRWYWxzKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCBbb3V0U2hhcGUsIHJlZHVjZVNoYXBlXSA9XG4gICAgICAgIGJhY2tlbmRfdXRpbC5jb21wdXRlT3V0QW5kUmVkdWNlU2hhcGVzKHBlcm11dGVkWC5zaGFwZSwgYXhlcyk7XG4gICAgY29uc3QgaW5TaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHJlZHVjZVNoYXBlKTtcbiAgICBjb25zdCBhMkQgPSByZXNoYXBlKFxuICAgICAgICB7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICAgIGNvbnN0IG91dHB1dERUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcbiAgICBjb25zdCByZWR1Y2VkID0gcmVkdWNlKGEyRCwgb3V0cHV0RFR5cGUsICdwcm9kJywgYmFja2VuZCk7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVkdWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuXG4gICAgdG9EaXNwb3NlLnB1c2goYTJEKTtcbiAgICB0b0Rpc3Bvc2UucHVzaChyZWR1Y2VkKTtcbiAgfVxuXG4gIGlmIChrZWVwRGltcykge1xuICAgIHRvRGlzcG9zZS5wdXNoKHJlcyk7XG4gICAgY29uc3QgbmV3U2hhcGUgPSBiYWNrZW5kX3V0aWwuZXhwYW5kU2hhcGVUb0tlZXBEaW0ocmVzLnNoYXBlLCBvcmlnQXhlcyk7XG4gICAgcmVzID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogbmV3U2hhcGV9fSk7XG4gIH1cblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCBwcm9kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFByb2QsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBwcm9kIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RaggedGather } from '@tensorflow/tfjs-core';\nimport { raggedGatherImplCPU } from '../kernel_utils/shared';\nexport function raggedGather(args) {\n    const { inputs, backend, attrs } = args;\n    const { paramsNestedSplits, paramsDenseValues, indices } = inputs;\n    const { outputRaggedRank } = attrs;\n    const $paramsNestedSplits = paramsNestedSplits.map(t => backend.readSync(t.dataId));\n    const $paramsNestedSplitsShapes = paramsNestedSplits.map(t => t.shape);\n    const $paramsDenseValues = backend.readSync(paramsDenseValues.dataId);\n    const $indices = backend.readSync(indices.dataId);\n    const [outputNestedSplits, outputDenseValues, outputDenseValuesShape] = raggedGatherImplCPU($paramsNestedSplits, $paramsNestedSplitsShapes, $paramsDenseValues, paramsDenseValues.shape, paramsDenseValues.dtype, $indices, indices.shape, outputRaggedRank);\n    const outputNestedSplitsTensors = outputNestedSplits.map((splits) => backend.makeTensorInfo([splits.length], 'int32', splits));\n    const outputDenseValuesTensor = backend.makeTensorInfo(outputDenseValuesShape, paramsDenseValues.dtype, outputDenseValues);\n    return outputNestedSplitsTensors.concat([outputDenseValuesTensor]);\n}\nexport const raggedGatherConfig = {\n    kernelName: RaggedGather,\n    backendName: 'webgl',\n    kernelFunc: raggedGather,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkR2F0aGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1JhZ2dlZEdhdGhlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFlBQVksRUFBZ0UsTUFBTSx1QkFBdUIsQ0FBQztBQUc1SSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUUzRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBSTVCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxrQkFBa0IsRUFBRSxpQkFBaUIsRUFBRSxPQUFPLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDaEUsTUFBTSxFQUFDLGdCQUFnQixFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRWpDLE1BQU0sbUJBQW1CLEdBQ3JCLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBZSxDQUFDLENBQUM7SUFDMUUsTUFBTSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDdkUsTUFBTSxrQkFBa0IsR0FDcEIsT0FBTyxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUM3RCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUVoRSxNQUFNLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsc0JBQXNCLENBQUMsR0FDakUsbUJBQW1CLENBQ2YsbUJBQW1CLEVBQUUseUJBQXlCLEVBQUUsa0JBQWtCLEVBQ2xFLGlCQUFpQixDQUFDLEtBQUssRUFBRSxpQkFBaUIsQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUMxRCxPQUFPLENBQUMsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFFekMsTUFBTSx5QkFBeUIsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQ3BELENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRTFFLE1BQU0sdUJBQXVCLEdBQUcsT0FBTyxDQUFDLGNBQWMsQ0FDbEQsc0JBQXNCLEVBQUUsaUJBQWlCLENBQUMsS0FBSyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFFeEUsT0FBTyx5QkFBeUIsQ0FBQyxNQUFNLENBQUMsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIyIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJhZ2dlZEdhdGhlciwgUmFnZ2VkR2F0aGVyQXR0cnMsIFJhZ2dlZEdhdGhlcklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmFnZ2VkR2F0aGVySW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiByYWdnZWRHYXRoZXIoYXJnczoge1xuICBpbnB1dHM6IFJhZ2dlZEdhdGhlcklucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFJhZ2dlZEdhdGhlckF0dHJzXG59KTogVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3BhcmFtc05lc3RlZFNwbGl0cywgcGFyYW1zRGVuc2VWYWx1ZXMsIGluZGljZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7b3V0cHV0UmFnZ2VkUmFua30gPSBhdHRycztcblxuICBjb25zdCAkcGFyYW1zTmVzdGVkU3BsaXRzID1cbiAgICAgIHBhcmFtc05lc3RlZFNwbGl0cy5tYXAodCA9PiBiYWNrZW5kLnJlYWRTeW5jKHQuZGF0YUlkKSBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3QgJHBhcmFtc05lc3RlZFNwbGl0c1NoYXBlcyA9IHBhcmFtc05lc3RlZFNwbGl0cy5tYXAodCA9PiB0LnNoYXBlKTtcbiAgY29uc3QgJHBhcmFtc0RlbnNlVmFsdWVzID1cbiAgICAgIGJhY2tlbmQucmVhZFN5bmMocGFyYW1zRGVuc2VWYWx1ZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkaW5kaWNlcyA9IGJhY2tlbmQucmVhZFN5bmMoaW5kaWNlcy5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgW291dHB1dE5lc3RlZFNwbGl0cywgb3V0cHV0RGVuc2VWYWx1ZXMsIG91dHB1dERlbnNlVmFsdWVzU2hhcGVdID1cbiAgICAgIHJhZ2dlZEdhdGhlckltcGxDUFUoXG4gICAgICAgICAgJHBhcmFtc05lc3RlZFNwbGl0cywgJHBhcmFtc05lc3RlZFNwbGl0c1NoYXBlcywgJHBhcmFtc0RlbnNlVmFsdWVzLFxuICAgICAgICAgIHBhcmFtc0RlbnNlVmFsdWVzLnNoYXBlLCBwYXJhbXNEZW5zZVZhbHVlcy5kdHlwZSwgJGluZGljZXMsXG4gICAgICAgICAgaW5kaWNlcy5zaGFwZSwgb3V0cHV0UmFnZ2VkUmFuayk7XG5cbiAgY29uc3Qgb3V0cHV0TmVzdGVkU3BsaXRzVGVuc29ycyA9IG91dHB1dE5lc3RlZFNwbGl0cy5tYXAoXG4gICAgICAoc3BsaXRzKSA9PiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtzcGxpdHMubGVuZ3RoXSwgJ2ludDMyJywgc3BsaXRzKSk7XG5cbiAgY29uc3Qgb3V0cHV0RGVuc2VWYWx1ZXNUZW5zb3IgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgb3V0cHV0RGVuc2VWYWx1ZXNTaGFwZSwgcGFyYW1zRGVuc2VWYWx1ZXMuZHR5cGUsIG91dHB1dERlbnNlVmFsdWVzKTtcblxuICByZXR1cm4gb3V0cHV0TmVzdGVkU3BsaXRzVGVuc29ycy5jb25jYXQoW291dHB1dERlbnNlVmFsdWVzVGVuc29yXSk7XG59XG5cbmV4cG9ydCBjb25zdCByYWdnZWRHYXRoZXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmFnZ2VkR2F0aGVyLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmFnZ2VkR2F0aGVyIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { RaggedTensorToTensor } from '@tensorflow/tfjs-core';\nimport { raggedTensorToTensorImplCPU } from '../kernel_utils/shared';\nexport function raggedTensorToTensor(args) {\n    const { inputs, backend, attrs } = args;\n    const { shape, values, defaultValue, rowPartitionTensors } = inputs;\n    const { rowPartitionTypes } = attrs;\n    const $shape = backend.readSync(shape.dataId);\n    const $values = backend.readSync(values.dataId);\n    const $defaultValue = backend.readSync(defaultValue.dataId);\n    const $rowPartitionValues = rowPartitionTensors.map(t => backend.readSync(t.dataId));\n    const rowPartitionValuesShapes = rowPartitionTensors.map(t => t.shape);\n    const [outputShape, output] = raggedTensorToTensorImplCPU($shape, shape.shape, $values, values.shape, values.dtype, $defaultValue, defaultValue.shape, $rowPartitionValues, rowPartitionValuesShapes, rowPartitionTypes);\n    return backend.makeTensorInfo(outputShape, values.dtype, output);\n}\nexport const raggedTensorToTensorConfig = {\n    kernelName: RaggedTensorToTensor,\n    backendName: 'webgl',\n    kernelFunc: raggedTensorToTensor,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFnZ2VkVGVuc29yVG9UZW5zb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUmFnZ2VkVGVuc29yVG9UZW5zb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixvQkFBb0IsRUFBZ0YsTUFBTSx1QkFBdUIsQ0FBQztBQUdwSyxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRSxNQUFNLFVBQVUsb0JBQW9CLENBQUMsSUFJcEM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLG1CQUFtQixFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2xFLE1BQU0sRUFBQyxpQkFBaUIsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVsQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUM1RCxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUM5RCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUMxRSxNQUFNLG1CQUFtQixHQUNyQixtQkFBbUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQWUsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sd0JBQXdCLEdBQUcsbUJBQW1CLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEdBQUcsMkJBQTJCLENBQ3JELE1BQU0sRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsYUFBYSxFQUN2RSxZQUFZLENBQUMsS0FBSyxFQUFFLG1CQUFtQixFQUFFLHdCQUF3QixFQUNqRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ3ZCLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUNuRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQWlCO0lBQ3RELFVBQVUsRUFBRSxvQkFBb0I7SUFDaEMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLG9CQUF3QztDQUNyRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgUmFnZ2VkVGVuc29yVG9UZW5zb3IsIFJhZ2dlZFRlbnNvclRvVGVuc29yQXR0cnMsIFJhZ2dlZFRlbnNvclRvVGVuc29ySW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtyYWdnZWRUZW5zb3JUb1RlbnNvckltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmFnZ2VkVGVuc29yVG9UZW5zb3IoYXJnczoge1xuICBpbnB1dHM6IFJhZ2dlZFRlbnNvclRvVGVuc29ySW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmFnZ2VkVGVuc29yVG9UZW5zb3JBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2hhcGUsIHZhbHVlcywgZGVmYXVsdFZhbHVlLCByb3dQYXJ0aXRpb25UZW5zb3JzfSA9IGlucHV0cztcbiAgY29uc3Qge3Jvd1BhcnRpdGlvblR5cGVzfSA9IGF0dHJzO1xuXG4gIGNvbnN0ICRzaGFwZSA9IGJhY2tlbmQucmVhZFN5bmMoc2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkdmFsdWVzID0gYmFja2VuZC5yZWFkU3luYyh2YWx1ZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVmYXVsdFZhbHVlID0gYmFja2VuZC5yZWFkU3luYyhkZWZhdWx0VmFsdWUuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkcm93UGFydGl0aW9uVmFsdWVzID1cbiAgICAgIHJvd1BhcnRpdGlvblRlbnNvcnMubWFwKHQgPT4gYmFja2VuZC5yZWFkU3luYyh0LmRhdGFJZCkgYXMgVHlwZWRBcnJheSk7XG4gIGNvbnN0IHJvd1BhcnRpdGlvblZhbHVlc1NoYXBlcyA9IHJvd1BhcnRpdGlvblRlbnNvcnMubWFwKHQgPT4gdC5zaGFwZSk7XG5cbiAgY29uc3QgW291dHB1dFNoYXBlLCBvdXRwdXRdID0gcmFnZ2VkVGVuc29yVG9UZW5zb3JJbXBsQ1BVKFxuICAgICAgJHNoYXBlLCBzaGFwZS5zaGFwZSwgJHZhbHVlcywgdmFsdWVzLnNoYXBlLCB2YWx1ZXMuZHR5cGUsICRkZWZhdWx0VmFsdWUsXG4gICAgICBkZWZhdWx0VmFsdWUuc2hhcGUsICRyb3dQYXJ0aXRpb25WYWx1ZXMsIHJvd1BhcnRpdGlvblZhbHVlc1NoYXBlcyxcbiAgICAgIHJvd1BhcnRpdGlvblR5cGVzKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0U2hhcGUsIHZhbHVlcy5kdHlwZSwgb3V0cHV0KTtcbn1cblxuZXhwb3J0IGNvbnN0IHJhZ2dlZFRlbnNvclRvVGVuc29yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJhZ2dlZFRlbnNvclRvVGVuc29yLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcmFnZ2VkVGVuc29yVG9UZW5zb3IgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Range } from '@tensorflow/tfjs-core';\nimport { rangeImplCPU } from '../kernel_utils/shared';\nexport const range = (args) => {\n    const { backend, attrs } = args;\n    const { start, stop, step, dtype } = attrs;\n    const values = rangeImplCPU(start, stop, step, dtype);\n    return backend.makeTensorInfo([values.length], dtype, values);\n};\nexport const rangeConfig = {\n    kernelName: Range,\n    backendName: 'webgl',\n    kernelFunc: range\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmFuZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUmFuZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixLQUFLLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFHOUYsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FDZCxDQUFDLElBQW9ELEVBQWMsRUFBRTtJQUNuRSxNQUFNLEVBQUMsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUM5QixNQUFNLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsS0FBSyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3pDLE1BQU0sTUFBTSxHQUFHLFlBQVksQ0FBQyxLQUFLLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUN0RCxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ2hFLENBQUMsQ0FBQztBQUVOLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQXlCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5nZSwgUmFuZ2VBdHRycywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7cmFuZ2VJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGNvbnN0IHJhbmdlID1cbiAgICAoYXJnczoge2JhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBSYW5nZUF0dHJzfSk6IFRlbnNvckluZm8gPT4ge1xuICAgICAgY29uc3Qge2JhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gICAgICBjb25zdCB7c3RhcnQsIHN0b3AsIHN0ZXAsIGR0eXBlfSA9IGF0dHJzO1xuICAgICAgY29uc3QgdmFsdWVzID0gcmFuZ2VJbXBsQ1BVKHN0YXJ0LCBzdG9wLCBzdGVwLCBkdHlwZSk7XG4gICAgICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbdmFsdWVzLmxlbmd0aF0sIGR0eXBlLCB2YWx1ZXMpO1xuICAgIH07XG5cbmV4cG9ydCBjb25zdCByYW5nZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSYW5nZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJhbmdlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Reciprocal } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst RECIPROCAL = `return 1.0 / x;`;\nexport const reciprocal = unaryKernelFunc({ opSnippet: RECIPROCAL });\nexport const reciprocalConfig = {\n    kernelName: Reciprocal,\n    backendName: 'webgl',\n    kernelFunc: reciprocal,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVjaXByb2NhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZWNpcHJvY2FsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxVQUFVLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUMvRCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxVQUFVLEdBQUcsaUJBQWlCLENBQUM7QUFFckMsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUMsQ0FBQyxDQUFDO0FBRW5FLE1BQU0sQ0FBQyxNQUFNLGdCQUFnQixHQUFpQjtJQUM1QyxVQUFVLEVBQUUsVUFBVTtJQUN0QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsVUFBVTtDQUN2QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgUmVjaXByb2NhbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgUkVDSVBST0NBTCA9IGByZXR1cm4gMS4wIC8geDtgO1xuXG5leHBvcnQgY29uc3QgcmVjaXByb2NhbCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBSRUNJUFJPQ0FMfSk7XG5cbmV4cG9ydCBjb25zdCByZWNpcHJvY2FsQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlY2lwcm9jYWwsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZWNpcHJvY2FsLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst RELU = CHECK_NAN_SNIPPET + `\n  return (x < 0.0) ? 0.0 : x;\n`;\nconst RELU_PACKED = `\n  vec4 result = x * vec4(greaterThanEqual(x, vec4(0.0)));\n  bvec4 isNaN = isnan(x);\n\n  result.r = isNaN.r ? x.r : result.r;\n  result.g = isNaN.g ? x.g : result.g;\n  result.b = isNaN.b ? x.b : result.b;\n  result.a = isNaN.a ? x.a : result.a;\n\n  return result;\n`;\nexport const relu = unaryKernelFunc({ opSnippet: RELU, packedOpSnippet: RELU_PACKED });\nexport const reluConfig = {\n    kernelName: Relu,\n    backendName: 'webgl',\n    kernelFunc: relu\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFDckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWpELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixHQUFHOztDQUVoQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUc7Ozs7Ozs7Ozs7Q0FVbkIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FDYixlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZWx1fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBSRUxVID0gQ0hFQ0tfTkFOX1NOSVBQRVQgKyBgXG4gIHJldHVybiAoeCA8IDAuMCkgPyAwLjAgOiB4O1xuYDtcblxuY29uc3QgUkVMVV9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0geCAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHJlbHUgPVxuICAgIHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBSRUxVLCBwYWNrZWRPcFNuaXBwZXQ6IFJFTFVfUEFDS0VEfSk7XG5cbmV4cG9ydCBjb25zdCByZWx1Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlbHUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZWx1IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Relu6 } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { CHECK_NAN_SNIPPET } from '../unaryop_gpu';\nconst RELU6 = CHECK_NAN_SNIPPET + `\n  return (x < 0.0) ? 0.0 : min(6.0, x);\n`;\nconst RELU6_PACKED = `\n  vec4 result = min(x, vec4(6.)) * vec4(greaterThanEqual(x, vec4(0.0)));\n  bvec4 isNaN = isnan(x);\n\n  result.r = isNaN.r ? x.r : result.r;\n  result.g = isNaN.g ? x.g : result.g;\n  result.b = isNaN.b ? x.b : result.b;\n  result.a = isNaN.a ? x.a : result.a;\n\n  return result;\n`;\nexport const relu6 = unaryKernelFunc({ opSnippet: RELU6, packedOpSnippet: RELU6_PACKED });\nexport const relu6Config = {\n    kernelName: Relu6,\n    backendName: 'webgl',\n    kernelFunc: relu6\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVsdTYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUmVsdTYudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLGlCQUFpQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFFakQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLEdBQUc7O0NBRWpDLENBQUM7QUFFRixNQUFNLFlBQVksR0FBRzs7Ozs7Ozs7OztDQVVwQixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUNkLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLFlBQVksRUFBQyxDQUFDLENBQUM7QUFFdkUsTUFBTSxDQUFDLE1BQU0sV0FBVyxHQUFpQjtJQUN2QyxVQUFVLEVBQUUsS0FBSztJQUNqQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsS0FBeUI7Q0FDdEMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlbHU2fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVH0gZnJvbSAnLi4vdW5hcnlvcF9ncHUnO1xuXG5jb25zdCBSRUxVNiA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICByZXR1cm4gKHggPCAwLjApID8gMC4wIDogbWluKDYuMCwgeCk7XG5gO1xuXG5jb25zdCBSRUxVNl9QQUNLRUQgPSBgXG4gIHZlYzQgcmVzdWx0ID0gbWluKHgsIHZlYzQoNi4pKSAqIHZlYzQoZ3JlYXRlclRoYW5FcXVhbCh4LCB2ZWM0KDAuMCkpKTtcbiAgYnZlYzQgaXNOYU4gPSBpc25hbih4KTtcblxuICByZXN1bHQuciA9IGlzTmFOLnIgPyB4LnIgOiByZXN1bHQucjtcbiAgcmVzdWx0LmcgPSBpc05hTi5nID8geC5nIDogcmVzdWx0Lmc7XG4gIHJlc3VsdC5iID0gaXNOYU4uYiA/IHguYiA6IHJlc3VsdC5iO1xuICByZXN1bHQuYSA9IGlzTmFOLmEgPyB4LmEgOiByZXN1bHQuYTtcblxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHJlbHU2ID1cbiAgICB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogUkVMVTYsIHBhY2tlZE9wU25pcHBldDogUkVMVTZfUEFDS0VEfSk7XG5cbmV4cG9ydCBjb25zdCByZWx1NkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBSZWx1NixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlbHU2IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeBilinearProgram {\n    constructor(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n        this.variableNames = ['A'];\n        this.outputShape = [];\n        const [batch, oldHeight, oldWidth, depth] = inputShape;\n        this.outputShape = [batch, newHeight, newWidth, depth];\n        const effectiveInSize = [\n            (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n            (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n        ];\n        const effectiveOutSize = [\n            (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n            (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n        ];\n        let sourceFracIndexRC;\n        if (halfPixelCenters) {\n            sourceFracIndexRC =\n                `(vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC` +\n                    ` - vec2(0.5)`;\n        }\n        else {\n            sourceFracIndexRC = `vec2(yRC) * effectiveInputOverOutputRatioRC`;\n        }\n        this.userCode = `\n      const vec2 effectiveInputOverOutputRatioRC = vec2(\n          ${effectiveInSize[0] / effectiveOutSize[0]},\n          ${effectiveInSize[1] / effectiveOutSize[1]});\n      const vec2 inputShapeRC = vec2(${oldHeight}.0, ${oldWidth}.0);\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int d = coords[3];\n        ivec2 yRC = coords.yz;\n\n        // Fractional source index.\n        vec2 sourceFracIndexRC = ${sourceFracIndexRC};\n\n        // Compute the four integer indices.\n        ivec2 sourceFloorRC = ivec2(max(sourceFracIndexRC, vec2(0.0)));\n        ivec2 sourceCeilRC = ivec2(\n          min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n        float topLeft = getA(b, sourceFloorRC.x, sourceFloorRC.y, d);\n        float bottomLeft = getA(b, sourceCeilRC.x, sourceFloorRC.y, d);\n        float topRight = getA(b, sourceFloorRC.x, sourceCeilRC.y, d);\n        float bottomRight = getA(b, sourceCeilRC.x, sourceCeilRC.y, d);\n\n        vec2 fracRC = sourceFracIndexRC - vec2(sourceFloorRC);\n\n        float top = topLeft + (topRight - topLeft) * fracRC.y;\n        float bottom = bottomLeft + (bottomRight - bottomLeft) * fracRC.y;\n        float newValue = top + (bottom - top) * fracRC.x;\n\n        setOutput(newValue);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcmVzaXplX2JpbGluZWFyX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8scUJBQXFCO0lBS2hDLFlBQ0ksVUFBNEMsRUFBRSxTQUFpQixFQUMvRCxRQUFnQixFQUFFLFlBQXFCLEVBQUUsZ0JBQXlCO1FBTnRFLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQU16QixNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2RCxNQUFNLGVBQWUsR0FBcUI7WUFDeEMsQ0FBQyxZQUFZLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELENBQUMsWUFBWSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6RCxDQUFDO1FBRUYsTUFBTSxnQkFBZ0IsR0FBcUI7WUFDekMsQ0FBQyxZQUFZLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELENBQUMsWUFBWSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6RCxDQUFDO1FBRUYsSUFBSSxpQkFBeUIsQ0FBQztRQUM5QixJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLGlCQUFpQjtnQkFDYiwyREFBMkQ7b0JBQzNELGNBQWMsQ0FBQztTQUNwQjthQUFNO1lBQ0wsaUJBQWlCLEdBQUcsNkNBQTZDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOztZQUVSLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDeEMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQzt1Q0FDYixTQUFTLE9BQU8sUUFBUTs7Ozs7Ozs7O21DQVM1QixpQkFBaUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBb0IvQyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICBsZXQgc291cmNlRnJhY0luZGV4UkM6IHN0cmluZztcbiAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPVxuICAgICAgICAgIGAodmVjMih5UkMpICsgdmVjMigwLjUpKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgICtcbiAgICAgICAgICBgIC0gdmVjMigwLjUpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMih5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgZm91ciBpbnRlZ2VyIGluZGljZXMuXG4gICAgICAgIGl2ZWMyIHNvdXJjZUZsb29yUkMgPSBpdmVjMihtYXgoc291cmNlRnJhY0luZGV4UkMsIHZlYzIoMC4wKSkpO1xuICAgICAgICBpdmVjMiBzb3VyY2VDZWlsUkMgPSBpdmVjMihcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBjZWlsKHNvdXJjZUZyYWNJbmRleFJDKSkpO1xuXG4gICAgICAgIGZsb2F0IHRvcExlZnQgPSBnZXRBKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tTGVmdCA9IGdldEEoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCk7XG4gICAgICAgIGZsb2F0IHRvcFJpZ2h0ID0gZ2V0QShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkKTtcbiAgICAgICAgZmxvYXQgYm90dG9tUmlnaHQgPSBnZXRBKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueSwgZCk7XG5cbiAgICAgICAgdmVjMiBmcmFjUkMgPSBzb3VyY2VGcmFjSW5kZXhSQyAtIHZlYzIoc291cmNlRmxvb3JSQyk7XG5cbiAgICAgICAgZmxvYXQgdG9wID0gdG9wTGVmdCArICh0b3BSaWdodCAtIHRvcExlZnQpICogZnJhY1JDLnk7XG4gICAgICAgIGZsb2F0IGJvdHRvbSA9IGJvdHRvbUxlZnQgKyAoYm90dG9tUmlnaHQgLSBib3R0b21MZWZ0KSAqIGZyYWNSQy55O1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IHRvcCArIChib3R0b20gLSB0b3ApICogZnJhY1JDLng7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeBilinearPackedProgram {\n    constructor(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = [];\n        const [batch, oldHeight, oldWidth, depth] = inputShape;\n        this.outputShape = [batch, newHeight, newWidth, depth];\n        const effectiveInSize = [\n            (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n            (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n        ];\n        const effectiveOutSize = [\n            (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n            (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n        ];\n        let sourceFracIndexRC;\n        if (halfPixelCenters) {\n            sourceFracIndexRC = `(vec3(yRC) + vec3(0.5)) * ` +\n                `effectiveInputOverOutputRatioRC - vec3(0.5)`;\n        }\n        else {\n            sourceFracIndexRC = `vec3(yRC) * effectiveInputOverOutputRatioRC`;\n        }\n        this.userCode = `\n      const vec3 effectiveInputOverOutputRatioRC = vec3(\n          ${effectiveInSize[0] / effectiveOutSize[0]},\n          ${effectiveInSize[1] / effectiveOutSize[1]},\n          ${effectiveInSize[1] / effectiveOutSize[1]});\n      const vec3 inputShapeRC = vec3(${oldHeight}.0, ${oldWidth}.0,\n                                     ${oldWidth}.0);\n\n      float getAValue(int b, int r, int c, int d) {\n        return getChannel(getA(b, r, c, d), vec2(c, d));\n      }\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int d = coords[3];\n        // Calculate values for next column in yRC.z.\n        ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n        // Fractional source index.\n        vec3 sourceFracIndexRC = ${sourceFracIndexRC};\n\n        // Compute the four integer indices.\n        ivec3 sourceFloorRC = ivec3(max(sourceFracIndexRC, vec3(0.0)));\n        ivec3 sourceCeilRC = ivec3(\n          min(inputShapeRC - 1.0, ceil(sourceFracIndexRC)));\n\n        // Should we calculate next column and row elements in 2x2 packed cell.\n        bool hasNextCol = d < ${depth - 1};\n        bool hasNextRow = coords.z < ${newWidth - 1};\n\n        // In parallel, construct four corners for all four components in\n        // packed 2x2 cell.\n        vec4 topLeft = vec4(\n          getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d),\n          hasNextCol ? getAValue(b, sourceFloorRC.x, sourceFloorRC.y, d + 1)\n                     : 0.0,\n          hasNextRow ? getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d)\n                     : 0.0,\n          (hasNextRow && hasNextCol) ?\n            getAValue(b, sourceFloorRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n        vec4 bottomLeft = vec4(\n          getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d),\n          hasNextCol ? getAValue(b, sourceCeilRC.x, sourceFloorRC.y, d + 1)\n                     : 0.0,\n          hasNextRow ? getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d)\n                     : 0.0,\n          (hasNextRow && hasNextCol) ?\n            getAValue(b, sourceCeilRC.x, sourceFloorRC.z, d + 1) : 0.0);\n\n        vec4 topRight = vec4(\n          getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d),\n          hasNextCol ? getAValue(b, sourceFloorRC.x, sourceCeilRC.y, d + 1)\n                     : 0.0,\n          hasNextRow ? getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d)\n                     : 0.0,\n          (hasNextRow && hasNextCol) ?\n            getAValue(b, sourceFloorRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n        vec4 bottomRight = vec4(\n          getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d),\n          hasNextCol ? getAValue(b, sourceCeilRC.x, sourceCeilRC.y, d + 1)\n                     : 0.0,\n          hasNextRow ? getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d)\n                     : 0.0,\n          (hasNextRow && hasNextCol) ?\n            getAValue(b, sourceCeilRC.x, sourceCeilRC.z, d + 1) : 0.0);\n\n        vec3 fracRC = sourceFracIndexRC - vec3(sourceFloorRC);\n\n        vec4 top = mix(topLeft, topRight, fracRC.yyzz);\n        vec4 bottom = mix(bottomLeft, bottomRight, fracRC.yyzz);\n        vec4 newValue = mix(top, bottom, fracRC.x);\n\n        setOutput(newValue);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyX3BhY2tlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3Jlc2l6ZV9iaWxpbmVhcl9wYWNrZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUlILE1BQU0sT0FBTywyQkFBMkI7SUFPdEMsWUFDSSxVQUE0QyxFQUFFLFNBQWlCLEVBQy9ELFFBQWdCLEVBQUUsWUFBcUIsRUFBRSxnQkFBeUI7UUFSdEUsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBTXpCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsR0FBRyxVQUFVLENBQUM7UUFDdkQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBRXZELE1BQU0sZUFBZSxHQUFxQjtZQUN4QyxDQUFDLFlBQVksSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDM0QsQ0FBQyxZQUFZLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO1NBQ3pELENBQUM7UUFFRixNQUFNLGdCQUFnQixHQUFxQjtZQUN6QyxDQUFDLFlBQVksSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDM0QsQ0FBQyxZQUFZLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO1NBQ3pELENBQUM7UUFFRixJQUFJLGlCQUF5QixDQUFDO1FBQzlCLElBQUksZ0JBQWdCLEVBQUU7WUFDcEIsaUJBQWlCLEdBQUcsNEJBQTRCO2dCQUM1Qyw2Q0FBNkMsQ0FBQztTQUNuRDthQUFNO1lBQ0wsaUJBQWlCLEdBQUcsNkNBQTZDLENBQUM7U0FDbkU7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOztZQUVSLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDeEMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQztZQUN4QyxlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO3VDQUNiLFNBQVMsT0FBTyxRQUFRO3VDQUN4QixRQUFROzs7Ozs7Ozs7Ozs7OzttQ0FjWixpQkFBaUI7Ozs7Ozs7O2dDQVFwQixLQUFLLEdBQUcsQ0FBQzt1Q0FDRixRQUFRLEdBQUcsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0tBZ0Q5QyxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcblxuZXhwb3J0IGNsYXNzIFJlc2l6ZUJpbGluZWFyUGFja2VkUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgcGFja2VkSW5wdXRzID0gdHJ1ZTtcbiAgcGFja2VkT3V0cHV0ID0gdHJ1ZTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICBsZXQgc291cmNlRnJhY0luZGV4UkM6IHN0cmluZztcbiAgICBpZiAoaGFsZlBpeGVsQ2VudGVycykge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgKHZlYzMoeVJDKSArIHZlYzMoMC41KSkgKiBgICtcbiAgICAgICAgICBgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyAtIHZlYzMoMC41KWA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYHZlYzMoeVJDKSAqIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkNgO1xuICAgIH1cblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICBjb25zdCB2ZWMzIGVmZmVjdGl2ZUlucHV0T3Zlck91dHB1dFJhdGlvUkMgPSB2ZWMzKFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzBdIC8gZWZmZWN0aXZlT3V0U2l6ZVswXX0sXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMV0gLyBlZmZlY3RpdmVPdXRTaXplWzFdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzMgaW5wdXRTaGFwZVJDID0gdmVjMygke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke29sZFdpZHRofS4wKTtcblxuICAgICAgZmxvYXQgZ2V0QVZhbHVlKGludCBiLCBpbnQgciwgaW50IGMsIGludCBkKSB7XG4gICAgICAgIHJldHVybiBnZXRDaGFubmVsKGdldEEoYiwgciwgYywgZCksIHZlYzIoYywgZCkpO1xuICAgICAgfVxuXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG4gICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZXMgZm9yIG5leHQgY29sdW1uIGluIHlSQy56LlxuICAgICAgICBpdmVjMyB5UkMgPSBjb29yZHMueXp6ICsgaXZlYzMoMCwgMCwgMSk7XG5cbiAgICAgICAgLy8gRnJhY3Rpb25hbCBzb3VyY2UgaW5kZXguXG4gICAgICAgIHZlYzMgc291cmNlRnJhY0luZGV4UkMgPSAke3NvdXJjZUZyYWNJbmRleFJDfTtcblxuICAgICAgICAvLyBDb21wdXRlIHRoZSBmb3VyIGludGVnZXIgaW5kaWNlcy5cbiAgICAgICAgaXZlYzMgc291cmNlRmxvb3JSQyA9IGl2ZWMzKG1heChzb3VyY2VGcmFjSW5kZXhSQywgdmVjMygwLjApKSk7XG4gICAgICAgIGl2ZWMzIHNvdXJjZUNlaWxSQyA9IGl2ZWMzKFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGNlaWwoc291cmNlRnJhY0luZGV4UkMpKSk7XG5cbiAgICAgICAgLy8gU2hvdWxkIHdlIGNhbGN1bGF0ZSBuZXh0IGNvbHVtbiBhbmQgcm93IGVsZW1lbnRzIGluIDJ4MiBwYWNrZWQgY2VsbC5cbiAgICAgICAgYm9vbCBoYXNOZXh0Q29sID0gZCA8ICR7ZGVwdGggLSAxfTtcbiAgICAgICAgYm9vbCBoYXNOZXh0Um93ID0gY29vcmRzLnogPCAke25ld1dpZHRoIC0gMX07XG5cbiAgICAgICAgLy8gSW4gcGFyYWxsZWwsIGNvbnN0cnVjdCBmb3VyIGNvcm5lcnMgZm9yIGFsbCBmb3VyIGNvbXBvbmVudHMgaW5cbiAgICAgICAgLy8gcGFja2VkIDJ4MiBjZWxsLlxuICAgICAgICB2ZWM0IHRvcExlZnQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUZsb29yUkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUZsb29yUkMueCwgc291cmNlRmxvb3JSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgYm90dG9tTGVmdCA9IHZlYzQoXG4gICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VGbG9vclJDLnksIGQpLFxuICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VGbG9vclJDLnosIGQpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICAoaGFzTmV4dFJvdyAmJiBoYXNOZXh0Q29sKSA/XG4gICAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUZsb29yUkMueiwgZCArIDEpIDogMC4wKTtcblxuICAgICAgICB2ZWM0IHRvcFJpZ2h0ID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VDZWlsUkMueSwgZCksXG4gICAgICAgICAgaGFzTmV4dENvbCA/IGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlRmxvb3JSQy54LCBzb3VyY2VDZWlsUkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VGbG9vclJDLngsIHNvdXJjZUNlaWxSQy56LCBkICsgMSkgOiAwLjApO1xuXG4gICAgICAgIHZlYzQgYm90dG9tUmlnaHQgPSB2ZWM0KFxuICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VDZWlsUkMueCwgc291cmNlQ2VpbFJDLnksIGQpLFxuICAgICAgICAgIGhhc05leHRDb2wgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy55LCBkICsgMSlcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIGhhc05leHRSb3cgPyBnZXRBVmFsdWUoYiwgc291cmNlQ2VpbFJDLngsIHNvdXJjZUNlaWxSQy56LCBkKVxuICAgICAgICAgICAgICAgICAgICAgOiAwLjAsXG4gICAgICAgICAgKGhhc05leHRSb3cgJiYgaGFzTmV4dENvbCkgP1xuICAgICAgICAgICAgZ2V0QVZhbHVlKGIsIHNvdXJjZUNlaWxSQy54LCBzb3VyY2VDZWlsUkMueiwgZCArIDEpIDogMC4wKTtcblxuICAgICAgICB2ZWMzIGZyYWNSQyA9IHNvdXJjZUZyYWNJbmRleFJDIC0gdmVjMyhzb3VyY2VGbG9vclJDKTtcblxuICAgICAgICB2ZWM0IHRvcCA9IG1peCh0b3BMZWZ0LCB0b3BSaWdodCwgZnJhY1JDLnl5enopO1xuICAgICAgICB2ZWM0IGJvdHRvbSA9IG1peChib3R0b21MZWZ0LCBib3R0b21SaWdodCwgZnJhY1JDLnl5enopO1xuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gbWl4KHRvcCwgYm90dG9tLCBmcmFjUkMueCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, ResizeBilinear } from '@tensorflow/tfjs-core';\nimport { ResizeBilinearProgram } from '../resize_bilinear_gpu';\nimport { ResizeBilinearPackedProgram } from '../resize_bilinear_packed_gpu';\nexport function resizeBilinear(args) {\n    const { inputs, backend, attrs } = args;\n    const { images } = inputs;\n    const { alignCorners, halfPixelCenters, size } = attrs;\n    const [newHeight, newWidth] = size;\n    const program = env().getBool('WEBGL_PACK_IMAGE_OPERATIONS') ?\n        new ResizeBilinearPackedProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters) :\n        new ResizeBilinearProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters);\n    return backend.runWebGLProgram(program, [images], 'float32');\n}\nexport const resizeBilinearConfig = {\n    kernelName: ResizeBilinear,\n    backendName: 'webgl',\n    kernelFunc: resizeBilinear\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUmVzaXplQmlsaW5lYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLEdBQUcsRUFBNEIsY0FBYyxFQUF3RCxNQUFNLHVCQUF1QixDQUFDO0FBRzNJLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQzdELE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLCtCQUErQixDQUFDO0FBRTFFLE1BQU0sVUFBVSxjQUFjLENBQUMsSUFJOUI7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN4QixNQUFNLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRCxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUVuQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksMkJBQTJCLENBQzNCLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQ3JFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSxxQkFBcUIsQ0FDckIsTUFBTSxDQUFDLEtBQXlDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFDckUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQy9ELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxvQkFBb0IsR0FBaUI7SUFDaEQsVUFBVSxFQUFFLGNBQWM7SUFDMUIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLGNBQWtDO0NBQy9DLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52LCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZUJpbGluZWFyLCBSZXNpemVCaWxpbmVhckF0dHJzLCBSZXNpemVCaWxpbmVhcklucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaXplQmlsaW5lYXJQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfZ3B1JztcbmltcG9ydCB7UmVzaXplQmlsaW5lYXJQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfcGFja2VkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVCaWxpbmVhcihhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXNpemVCaWxpbmVhckF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXN9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzLCBzaXplfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtuZXdIZWlnaHQsIG5ld1dpZHRoXSA9IHNpemU7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfSU1BR0VfT1BFUkFUSU9OUycpID9cbiAgICAgIG5ldyBSZXNpemVCaWxpbmVhclBhY2tlZFByb2dyYW0oXG4gICAgICAgICAgaW1hZ2VzLnNoYXBlIGFzIFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQsIG5ld1dpZHRoLFxuICAgICAgICAgIGFsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycykgOlxuICAgICAgbmV3IFJlc2l6ZUJpbGluZWFyUHJvZ3JhbShcbiAgICAgICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG5ld0hlaWdodCwgbmV3V2lkdGgsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZXNdLCAnZmxvYXQzMicpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplQmlsaW5lYXJDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmVzaXplQmlsaW5lYXIsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVCaWxpbmVhciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeBilinearBackpropProgram {\n    constructor(dyShape, inputShape, alignCorners) {\n        this.variableNames = ['dy'];\n        this.outputShape = [];\n        this.outputShape = inputShape;\n        const [, xHeight, xWidth,] = inputShape;\n        const [, yHeight, yWidth] = dyShape;\n        // In the backwards pass, we want to find the pixels that were generated for\n        // each pixel in the input image the forward pass and add the corresponding\n        // coefficient from dy to the gradient (with some interpolation).\n        const effectiveXSize = [\n            (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight,\n            (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth\n        ];\n        const effectiveYSize = [\n            (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight,\n            (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth\n        ];\n        const heightScale = effectiveXSize[0] / effectiveYSize[0];\n        const widthScale = effectiveXSize[1] / effectiveYSize[1];\n        const invHeightScale = 1 / heightScale;\n        const invWidthScale = 1 / widthScale;\n        // This defines the size of the window of values around a particular\n        // index in dy that we want to search for contributions to dx.\n        const winHeight = (Math.ceil(invHeightScale) * 2) + 2;\n        const winWidth = (Math.ceil(invWidthScale) * 2) + 2;\n        this.userCode = `\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int d = coords[3];\n        int r = coords[1];\n        int c = coords[2];\n\n        float accumulator = 0.0;\n\n        const float heightScale = float(${heightScale});\n        const float widthScale = float(${widthScale});\n\n        const float invHeightScale = float(${invHeightScale});\n        const float invWidthScale = float(${invWidthScale});\n\n        const int winHeight = int(${winHeight});\n        const int winWidth = int(${winWidth});\n\n        // Compute bounds for where in dy we will look\n        float startRLerp = floor(float(r) * invHeightScale);\n        int startDyR = int(startRLerp - float(winHeight / 2));\n\n        float startCLerp = floor(float(c) * invWidthScale);\n        int startDyC = int(startCLerp - float(winWidth / 2));\n\n        // Loop over dy\n        for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n          int dyR = dyROffset + startDyR;\n\n          // Guard against the window exceeding the bounds of dy\n          if (dyR < 0 || dyR >= ${yHeight}) {\n            continue;\n          }\n\n          for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n            int dyC = dyCOffset + startDyC;\n\n            // Guard against the window exceeding the bounds of dy\n            if (dyC < 0 || dyC >= ${yWidth}) {\n              continue;\n            }\n\n            float dxR = float(dyR) * heightScale;\n            int topDxRIndex = int(floor(dxR));\n            int bottomDxRIndex = int(min(ceil(dxR), ${xHeight - 1}.0));\n            float dxRLerp = dxR - float(topDxRIndex);\n            float inverseDxRLerp = 1.0 - dxRLerp;\n\n            float dxC = float(dyC) * widthScale;\n            int leftDxCIndex = int(floor(dxC));\n            int rightDxCIndex = int(min(ceil(dxC), ${xWidth - 1}.0));\n            float dxCLerp = dxC - float(leftDxCIndex);\n            float inverseDxCLerp = 1.0 - dxCLerp;\n\n            if (r == topDxRIndex && c == leftDxCIndex) {\n              // topLeft\n              accumulator +=\n                getDy(b, dyR, dyC, d) * inverseDxRLerp * inverseDxCLerp;\n            }\n\n            if (r == topDxRIndex && c == rightDxCIndex) {\n              // topRight\n              accumulator += getDy(b, dyR, dyC, d) * inverseDxRLerp * dxCLerp;\n            }\n\n            if (r == bottomDxRIndex && c == leftDxCIndex) {\n              // bottomLeft\n              accumulator += getDy(b, dyR, dyC, d) * dxRLerp * inverseDxCLerp;\n            }\n\n            if (r == bottomDxRIndex && c == rightDxCIndex) {\n              // bottomRight\n              accumulator += getDy(b, dyR, dyC, d) * dxRLerp * dxCLerp;\n            }\n          }\n        }\n        // End loop over dy\n\n        setOutput(accumulator);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX2JpbGluZWFyX2JhY2twcm9wX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcmVzaXplX2JpbGluZWFyX2JhY2twcm9wX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sNkJBQTZCO0lBS3hDLFlBQ0ksT0FBeUMsRUFDekMsVUFBNEMsRUFBRSxZQUFxQjtRQU52RSxrQkFBYSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFNekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxVQUFVLENBQUM7UUFDOUIsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRyxHQUFHLFVBQVUsQ0FBQztRQUN6QyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsTUFBTSxDQUFDLEdBQUcsT0FBTyxDQUFDO1FBRXBDLDRFQUE0RTtRQUM1RSwyRUFBMkU7UUFDM0UsaUVBQWlFO1FBRWpFLE1BQU0sY0FBYyxHQUFxQjtZQUN2QyxDQUFDLFlBQVksSUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU87WUFDckQsQ0FBQyxZQUFZLElBQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNO1NBQ25ELENBQUM7UUFFRixNQUFNLGNBQWMsR0FBcUI7WUFDdkMsQ0FBQyxZQUFZLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3JELENBQUMsWUFBWSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtTQUNuRCxDQUFDO1FBRUYsTUFBTSxXQUFXLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMxRCxNQUFNLFVBQVUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRXpELE1BQU0sY0FBYyxHQUFHLENBQUMsR0FBRyxXQUFXLENBQUM7UUFDdkMsTUFBTSxhQUFhLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUVyQyxvRUFBb0U7UUFDcEUsOERBQThEO1FBQzlELE1BQU0sU0FBUyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUVwRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7OzBDQVVzQixXQUFXO3lDQUNaLFVBQVU7OzZDQUVOLGNBQWM7NENBQ2YsYUFBYTs7b0NBRXJCLFNBQVM7bUNBQ1YsUUFBUTs7Ozs7Ozs7Ozs7Ozs7a0NBY1QsT0FBTzs7Ozs7Ozs7b0NBUUwsTUFBTTs7Ozs7O3NEQU1ZLE9BQU8sR0FBRyxDQUFDOzs7Ozs7cURBTVosTUFBTSxHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztLQThCMUQsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVCaWxpbmVhckJhY2twcm9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ2R5J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IFtdO1xuICB1c2VyQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgZHlTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzOiBib29sZWFuKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGlucHV0U2hhcGU7XG4gICAgY29uc3QgWywgeEhlaWdodCwgeFdpZHRoLCBdID0gaW5wdXRTaGFwZTtcbiAgICBjb25zdCBbLCB5SGVpZ2h0LCB5V2lkdGhdID0gZHlTaGFwZTtcblxuICAgIC8vIEluIHRoZSBiYWNrd2FyZHMgcGFzcywgd2Ugd2FudCB0byBmaW5kIHRoZSBwaXhlbHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCBmb3JcbiAgICAvLyBlYWNoIHBpeGVsIGluIHRoZSBpbnB1dCBpbWFnZSB0aGUgZm9yd2FyZCBwYXNzIGFuZCBhZGQgdGhlIGNvcnJlc3BvbmRpbmdcbiAgICAvLyBjb2VmZmljaWVudCBmcm9tIGR5IHRvIHRoZSBncmFkaWVudCAod2l0aCBzb21lIGludGVycG9sYXRpb24pLlxuXG4gICAgY29uc3QgZWZmZWN0aXZlWFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlIZWlnaHQgPiAxKSA/IHhIZWlnaHQgLSAxIDogeEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgeVdpZHRoID4gMSkgPyB4V2lkdGggLSAxIDogeFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZVlTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB5SGVpZ2h0IC0gMSA6IHlIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geVdpZHRoIC0gMSA6IHlXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBoZWlnaHRTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzBdIC8gZWZmZWN0aXZlWVNpemVbMF07XG4gICAgY29uc3Qgd2lkdGhTY2FsZSA9IGVmZmVjdGl2ZVhTaXplWzFdIC8gZWZmZWN0aXZlWVNpemVbMV07XG5cbiAgICBjb25zdCBpbnZIZWlnaHRTY2FsZSA9IDEgLyBoZWlnaHRTY2FsZTtcbiAgICBjb25zdCBpbnZXaWR0aFNjYWxlID0gMSAvIHdpZHRoU2NhbGU7XG5cbiAgICAvLyBUaGlzIGRlZmluZXMgdGhlIHNpemUgb2YgdGhlIHdpbmRvdyBvZiB2YWx1ZXMgYXJvdW5kIGEgcGFydGljdWxhclxuICAgIC8vIGluZGV4IGluIGR5IHRoYXQgd2Ugd2FudCB0byBzZWFyY2ggZm9yIGNvbnRyaWJ1dGlvbnMgdG8gZHguXG4gICAgY29uc3Qgd2luSGVpZ2h0ID0gKE1hdGguY2VpbChpbnZIZWlnaHRTY2FsZSkgKiAyKSArIDI7XG4gICAgY29uc3Qgd2luV2lkdGggPSAoTWF0aC5jZWlsKGludldpZHRoU2NhbGUpICogMikgKyAyO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaW50IHIgPSBjb29yZHNbMV07XG4gICAgICAgIGludCBjID0gY29vcmRzWzJdO1xuXG4gICAgICAgIGZsb2F0IGFjY3VtdWxhdG9yID0gMC4wO1xuXG4gICAgICAgIGNvbnN0IGZsb2F0IGhlaWdodFNjYWxlID0gZmxvYXQoJHtoZWlnaHRTY2FsZX0pO1xuICAgICAgICBjb25zdCBmbG9hdCB3aWR0aFNjYWxlID0gZmxvYXQoJHt3aWR0aFNjYWxlfSk7XG5cbiAgICAgICAgY29uc3QgZmxvYXQgaW52SGVpZ2h0U2NhbGUgPSBmbG9hdCgke2ludkhlaWdodFNjYWxlfSk7XG4gICAgICAgIGNvbnN0IGZsb2F0IGludldpZHRoU2NhbGUgPSBmbG9hdCgke2ludldpZHRoU2NhbGV9KTtcblxuICAgICAgICBjb25zdCBpbnQgd2luSGVpZ2h0ID0gaW50KCR7d2luSGVpZ2h0fSk7XG4gICAgICAgIGNvbnN0IGludCB3aW5XaWR0aCA9IGludCgke3dpbldpZHRofSk7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBib3VuZHMgZm9yIHdoZXJlIGluIGR5IHdlIHdpbGwgbG9va1xuICAgICAgICBmbG9hdCBzdGFydFJMZXJwID0gZmxvb3IoZmxvYXQocikgKiBpbnZIZWlnaHRTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5UiA9IGludChzdGFydFJMZXJwIC0gZmxvYXQod2luSGVpZ2h0IC8gMikpO1xuXG4gICAgICAgIGZsb2F0IHN0YXJ0Q0xlcnAgPSBmbG9vcihmbG9hdChjKSAqIGludldpZHRoU2NhbGUpO1xuICAgICAgICBpbnQgc3RhcnREeUMgPSBpbnQoc3RhcnRDTGVycCAtIGZsb2F0KHdpbldpZHRoIC8gMikpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBkeVxuICAgICAgICBmb3IgKGludCBkeVJPZmZzZXQgPSAwOyBkeVJPZmZzZXQgPCB3aW5IZWlnaHQ7IGR5Uk9mZnNldCsrKSB7XG4gICAgICAgICAgaW50IGR5UiA9IGR5Uk9mZnNldCArIHN0YXJ0RHlSO1xuXG4gICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49ICR7eUhlaWdodH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IGR5Q09mZnNldCA9IDA7IGR5Q09mZnNldCA8IHdpbldpZHRoOyBkeUNPZmZzZXQrKykge1xuICAgICAgICAgICAgaW50IGR5QyA9IGR5Q09mZnNldCArIHN0YXJ0RHlDO1xuXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSAke3lXaWR0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IGR4UiA9IGZsb2F0KGR5UikgKiBoZWlnaHRTY2FsZTtcbiAgICAgICAgICAgIGludCB0b3BEeFJJbmRleCA9IGludChmbG9vcihkeFIpKTtcbiAgICAgICAgICAgIGludCBib3R0b21EeFJJbmRleCA9IGludChtaW4oY2VpbChkeFIpLCAke3hIZWlnaHQgLSAxfS4wKSk7XG4gICAgICAgICAgICBmbG9hdCBkeFJMZXJwID0gZHhSIC0gZmxvYXQodG9wRHhSSW5kZXgpO1xuICAgICAgICAgICAgZmxvYXQgaW52ZXJzZUR4UkxlcnAgPSAxLjAgLSBkeFJMZXJwO1xuXG4gICAgICAgICAgICBmbG9hdCBkeEMgPSBmbG9hdChkeUMpICogd2lkdGhTY2FsZTtcbiAgICAgICAgICAgIGludCBsZWZ0RHhDSW5kZXggPSBpbnQoZmxvb3IoZHhDKSk7XG4gICAgICAgICAgICBpbnQgcmlnaHREeENJbmRleCA9IGludChtaW4oY2VpbChkeEMpLCAke3hXaWR0aCAtIDF9LjApKTtcbiAgICAgICAgICAgIGZsb2F0IGR4Q0xlcnAgPSBkeEMgLSBmbG9hdChsZWZ0RHhDSW5kZXgpO1xuICAgICAgICAgICAgZmxvYXQgaW52ZXJzZUR4Q0xlcnAgPSAxLjAgLSBkeENMZXJwO1xuXG4gICAgICAgICAgICBpZiAociA9PSB0b3BEeFJJbmRleCAmJiBjID09IGxlZnREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyB0b3BMZWZ0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9XG4gICAgICAgICAgICAgICAgZ2V0RHkoYiwgZHlSLCBkeUMsIGQpICogaW52ZXJzZUR4UkxlcnAgKiBpbnZlcnNlRHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gdG9wRHhSSW5kZXggJiYgYyA9PSByaWdodER4Q0luZGV4KSB7XG4gICAgICAgICAgICAgIC8vIHRvcFJpZ2h0XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKSAqIGludmVyc2VEeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHIgPT0gYm90dG9tRHhSSW5kZXggJiYgYyA9PSBsZWZ0RHhDSW5kZXgpIHtcbiAgICAgICAgICAgICAgLy8gYm90dG9tTGVmdFxuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBkeFJMZXJwICogaW52ZXJzZUR4Q0xlcnA7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChyID09IGJvdHRvbUR4UkluZGV4ICYmIGMgPT0gcmlnaHREeENJbmRleCkge1xuICAgICAgICAgICAgICAvLyBib3R0b21SaWdodFxuICAgICAgICAgICAgICBhY2N1bXVsYXRvciArPSBnZXREeShiLCBkeVIsIGR5QywgZCkgKiBkeFJMZXJwICogZHhDTGVycDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5kIGxvb3Agb3ZlciBkeVxuXG4gICAgICAgIHNldE91dHB1dChhY2N1bXVsYXRvcik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeBilinearGrad } from '@tensorflow/tfjs-core';\nimport { ResizeBilinearBackpropProgram } from '../resize_bilinear_backprop_gpu';\nexport function resizeBilinearGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { images, dy } = inputs;\n    const { alignCorners } = attrs;\n    const program = new ResizeBilinearBackpropProgram(dy.shape, images.shape, alignCorners);\n    return backend.runWebGLProgram(program, [dy], dy.dtype);\n}\nexport const resizeBilinearGradConfig = {\n    kernelName: ResizeBilinearGrad,\n    backendName: 'webgl',\n    kernelFunc: resizeBilinearGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplQmlsaW5lYXJHcmFkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyR3JhZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLGtCQUFrQixFQUFnRSxNQUFNLHVCQUF1QixDQUFDO0FBR2xKLE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLGlDQUFpQyxDQUFDO0FBRTlFLE1BQU0sVUFBVSxrQkFBa0IsQ0FBQyxJQUlsQztJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsTUFBTSxFQUFFLEVBQUUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUM1QixNQUFNLEVBQUMsWUFBWSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRTdCLE1BQU0sT0FBTyxHQUFHLElBQUksNkJBQTZCLENBQzdDLEVBQUUsQ0FBQyxLQUF5QyxFQUM1QyxNQUFNLENBQUMsS0FBeUMsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUVwRSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzFELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx3QkFBd0IsR0FBaUI7SUFDcEQsVUFBVSxFQUFFLGtCQUFrQjtJQUM5QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsa0JBQXNDO0NBQ25ELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXNpemVCaWxpbmVhckdyYWQsIFJlc2l6ZUJpbGluZWFyR3JhZEF0dHJzLCBSZXNpemVCaWxpbmVhckdyYWRJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Jlc2l6ZUJpbGluZWFyQmFja3Byb3BQcm9ncmFtfSBmcm9tICcuLi9yZXNpemVfYmlsaW5lYXJfYmFja3Byb3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJlc2l6ZUJpbGluZWFyR3JhZChhcmdzOiB7XG4gIGlucHV0czogUmVzaXplQmlsaW5lYXJHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmVzaXplQmlsaW5lYXJHcmFkQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlcywgZHl9ID0gaW5wdXRzO1xuICBjb25zdCB7YWxpZ25Db3JuZXJzfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgUmVzaXplQmlsaW5lYXJCYWNrcHJvcFByb2dyYW0oXG4gICAgICBkeS5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSxcbiAgICAgIGltYWdlcy5zaGFwZSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgYWxpZ25Db3JuZXJzKTtcblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2R5XSwgZHkuZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplQmlsaW5lYXJHcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZUJpbGluZWFyR3JhZCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlc2l6ZUJpbGluZWFyR3JhZCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeNearestNeighborProgram {\n    constructor(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n        this.variableNames = ['A'];\n        this.outputShape = [];\n        const [batch, oldHeight, oldWidth, depth] = inputShape;\n        this.outputShape = [batch, newHeight, newWidth, depth];\n        const effectiveInSize = [\n            (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n            (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n        ];\n        const effectiveOutSize = [\n            (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n            (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n        ];\n        // When align corners is false, we rounds the value with floor.\n        const roundBase = alignCorners ? '0.5' : '0.0';\n        let sourceFracIndexRC;\n        if (halfPixelCenters) {\n            sourceFracIndexRC =\n                `max((vec2(yRC) + vec2(0.5)) * effectiveInputOverOutputRatioRC` +\n                    `, vec2(0.0))`;\n        }\n        else {\n            sourceFracIndexRC = `vec2(yRC) * effectiveInputOverOutputRatioRC`;\n        }\n        this.userCode = `\n      const vec2 effectiveInputOverOutputRatioRC = vec2(\n          ${effectiveInSize[0] / effectiveOutSize[0]},\n          ${effectiveInSize[1] / effectiveOutSize[1]});\n      const vec2 inputShapeRC = vec2(${oldHeight}.0, ${oldWidth}.0);\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int d = coords[3];\n        ivec2 yRC = coords.yz;\n\n        // Fractional source index.\n        vec2 sourceFracIndexRC = ${sourceFracIndexRC};\n\n        // Compute the coordinators of nearest neighbor point.\n        ivec2 sourceNearestRC = ivec2(\n          min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${roundBase})));\n        float newValue = getA(b, sourceNearestRC.x, sourceNearestRC.y, d);\n\n        setOutput(newValue);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3JfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLDRCQUE0QjtJQUt2QyxZQUNJLFVBQTRDLEVBQUUsU0FBaUIsRUFDL0QsUUFBZ0IsRUFBRSxZQUFxQixFQUFFLGdCQUF5QjtRQU50RSxrQkFBYSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDdEIsZ0JBQVcsR0FBYSxFQUFFLENBQUM7UUFNekIsTUFBTSxDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEtBQUssQ0FBQyxHQUFHLFVBQVUsQ0FBQztRQUN2RCxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFFdkQsTUFBTSxlQUFlLEdBQXFCO1lBQ3hDLENBQUMsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUMzRCxDQUFDLFlBQVksSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7U0FDekQsQ0FBQztRQUVGLE1BQU0sZ0JBQWdCLEdBQXFCO1lBQ3pDLENBQUMsWUFBWSxJQUFJLFNBQVMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUztZQUMzRCxDQUFDLFlBQVksSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7U0FDekQsQ0FBQztRQUVGLCtEQUErRDtRQUMvRCxNQUFNLFNBQVMsR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1FBRS9DLElBQUksaUJBQXlCLENBQUM7UUFDOUIsSUFBSSxnQkFBZ0IsRUFBRTtZQUNwQixpQkFBaUI7Z0JBQ2IsK0RBQStEO29CQUMvRCxjQUFjLENBQUM7U0FDcEI7YUFBTTtZQUNMLGlCQUFpQixHQUFHLDZDQUE2QyxDQUFDO1NBQ25FO1FBQ0QsSUFBSSxDQUFDLFFBQVEsR0FBRzs7WUFFUixlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7dUNBQ2IsU0FBUyxPQUFPLFFBQVE7Ozs7Ozs7OzttQ0FTNUIsaUJBQWlCOzs7OzhEQUlVLFNBQVM7Ozs7O0tBS2xFLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVzaXplTmVhcmVzdE5laWdoYm9yUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ0EnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbnB1dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSwgbmV3SGVpZ2h0OiBudW1iZXIsXG4gICAgICBuZXdXaWR0aDogbnVtYmVyLCBhbGlnbkNvcm5lcnM6IGJvb2xlYW4sIGhhbGZQaXhlbENlbnRlcnM6IGJvb2xlYW4pIHtcbiAgICBjb25zdCBbYmF0Y2gsIG9sZEhlaWdodCwgb2xkV2lkdGgsIGRlcHRoXSA9IGlucHV0U2hhcGU7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaCwgbmV3SGVpZ2h0LCBuZXdXaWR0aCwgZGVwdGhdO1xuXG4gICAgY29uc3QgZWZmZWN0aXZlSW5TaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG9sZEhlaWdodCAtIDEgOiBvbGRIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBvbGRXaWR0aCAtIDEgOiBvbGRXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVPdXRTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiBuZXdIZWlnaHQgPiAxKSA/IG5ld0hlaWdodCAtIDEgOiBuZXdIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld1dpZHRoID4gMSkgPyBuZXdXaWR0aCAtIDEgOiBuZXdXaWR0aFxuICAgIF07XG5cbiAgICAvLyBXaGVuIGFsaWduIGNvcm5lcnMgaXMgZmFsc2UsIHdlIHJvdW5kcyB0aGUgdmFsdWUgd2l0aCBmbG9vci5cbiAgICBjb25zdCByb3VuZEJhc2UgPSBhbGlnbkNvcm5lcnMgPyAnMC41JyA6ICcwLjAnO1xuXG4gICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDOiBzdHJpbmc7XG4gICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID1cbiAgICAgICAgICBgbWF4KCh2ZWMyKHlSQykgKyB2ZWMyKDAuNSkpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2AgK1xuICAgICAgICAgIGAsIHZlYzIoMC4wKSlgO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb3VyY2VGcmFjSW5kZXhSQyA9IGB2ZWMyKHlSQykgKiBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDYDtcbiAgICB9XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzIgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzIoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19KTtcbiAgICAgIGNvbnN0IHZlYzIgaW5wdXRTaGFwZVJDID0gdmVjMigke29sZEhlaWdodH0uMCwgJHtvbGRXaWR0aH0uMCk7XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgaXZlYzIgeVJDID0gY29vcmRzLnl6O1xuXG4gICAgICAgIC8vIEZyYWN0aW9uYWwgc291cmNlIGluZGV4LlxuICAgICAgICB2ZWMyIHNvdXJjZUZyYWNJbmRleFJDID0gJHtzb3VyY2VGcmFjSW5kZXhSQ307XG5cbiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgY29vcmRpbmF0b3JzIG9mIG5lYXJlc3QgbmVpZ2hib3IgcG9pbnQuXG4gICAgICAgIGl2ZWMyIHNvdXJjZU5lYXJlc3RSQyA9IGl2ZWMyKFxuICAgICAgICAgIG1pbihpbnB1dFNoYXBlUkMgLSAxLjAsIGZsb29yKHNvdXJjZUZyYWNJbmRleFJDICsgJHtyb3VuZEJhc2V9KSkpO1xuICAgICAgICBmbG9hdCBuZXdWYWx1ZSA9IGdldEEoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKTtcblxuICAgICAgICBzZXRPdXRwdXQobmV3VmFsdWUpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeNearestNeighborPackedProgram {\n    constructor(inputShape, newHeight, newWidth, alignCorners, halfPixelCenters) {\n        this.variableNames = ['A'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        this.outputShape = [];\n        const [batch, oldHeight, oldWidth, depth] = inputShape;\n        this.outputShape = [batch, newHeight, newWidth, depth];\n        const effectiveInSize = [\n            (alignCorners && newHeight > 1) ? oldHeight - 1 : oldHeight,\n            (alignCorners && newWidth > 1) ? oldWidth - 1 : oldWidth\n        ];\n        const effectiveOutSize = [\n            (alignCorners && newHeight > 1) ? newHeight - 1 : newHeight,\n            (alignCorners && newWidth > 1) ? newWidth - 1 : newWidth\n        ];\n        // When align corners is false, we rounds the value with floor.\n        const roundBase = alignCorners ? '0.5' : '0.0';\n        let sourceFracIndexRC;\n        if (halfPixelCenters) {\n            sourceFracIndexRC = `max((vec3(yRC) + vec3(0.5)) * ` +\n                `effectiveInputOverOutputRatioRC, vec3(0.0))`;\n        }\n        else {\n            sourceFracIndexRC = `vec3(yRC) * effectiveInputOverOutputRatioRC`;\n        }\n        this.userCode = `\n      const vec3 effectiveInputOverOutputRatioRC = vec3(\n          ${effectiveInSize[0] / effectiveOutSize[0]},\n          ${effectiveInSize[1] / effectiveOutSize[1]},\n          ${effectiveInSize[1] / effectiveOutSize[1]});\n      const vec3 inputShapeRC = vec3(${oldHeight}.0, ${oldWidth}.0,\n                                     ${oldWidth}.0);\n\n      float getAValue(int b, int r, int c, int d) {\n        return getChannel(getA(b, r, c, d), vec2(c, d));\n      }\n\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int d = coords[3];\n        // Calculate values for next column in yRC.z.\n        ivec3 yRC = coords.yzz + ivec3(0, 0, 1);\n\n        // Fractional source index.\n        vec3 sourceFracIndexRC = ${sourceFracIndexRC};\n\n        // Compute the coordinators of nearest neighbor point.\n        ivec3 sourceNearestRC = ivec3(\n          min(inputShapeRC - 1.0, floor(sourceFracIndexRC + ${roundBase})));\n\n        // Should we calculate next column and row elements in 2x2 packed cell.\n        bool hasNextCol = d < ${depth - 1};\n        bool hasNextRow = coords.z < ${newWidth - 1};\n\n        vec4 newValue = vec4(\n          getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d),\n          hasNextCol ? getAValue(b, sourceNearestRC.x, sourceNearestRC.y, d + 1)\n                     : 0.0,\n          hasNextRow ? getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d)\n                     : 0.0,\n          (hasNextRow && hasNextCol) ?\n            getAValue(b, sourceNearestRC.x, sourceNearestRC.z, d + 1) : 0.0);\n\n        setOutput(newValue);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3JfcGFja2VkX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcmVzaXplX25lYXJlc3RfbmVpZ2hib3JfcGFja2VkX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sa0NBQWtDO0lBTzdDLFlBQ0ksVUFBNEMsRUFBRSxTQUFpQixFQUMvRCxRQUFnQixFQUFFLFlBQXFCLEVBQUUsZ0JBQXlCO1FBUnRFLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN0QixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQUNwQixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQU16QixNQUFNLENBQUMsS0FBSyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEdBQUcsVUFBVSxDQUFDO1FBQ3ZELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsQ0FBQztRQUV2RCxNQUFNLGVBQWUsR0FBcUI7WUFDeEMsQ0FBQyxZQUFZLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELENBQUMsWUFBWSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6RCxDQUFDO1FBRUYsTUFBTSxnQkFBZ0IsR0FBcUI7WUFDekMsQ0FBQyxZQUFZLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQzNELENBQUMsWUFBWSxJQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtTQUN6RCxDQUFDO1FBRUYsK0RBQStEO1FBQy9ELE1BQU0sU0FBUyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFDL0MsSUFBSSxpQkFBeUIsQ0FBQztRQUM5QixJQUFJLGdCQUFnQixFQUFFO1lBQ3BCLGlCQUFpQixHQUFHLGdDQUFnQztnQkFDaEQsNkNBQTZDLENBQUM7U0FDbkQ7YUFBTTtZQUNMLGlCQUFpQixHQUFHLDZDQUE2QyxDQUFDO1NBQ25FO1FBRUQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7WUFFUixlQUFlLENBQUMsQ0FBQyxDQUFDLEdBQUcsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3hDLGVBQWUsQ0FBQyxDQUFDLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7WUFDeEMsZUFBZSxDQUFDLENBQUMsQ0FBQyxHQUFHLGdCQUFnQixDQUFDLENBQUMsQ0FBQzt1Q0FDYixTQUFTLE9BQU8sUUFBUTt1Q0FDeEIsUUFBUTs7Ozs7Ozs7Ozs7Ozs7bUNBY1osaUJBQWlCOzs7OzhEQUlVLFNBQVM7OztnQ0FHdkMsS0FBSyxHQUFHLENBQUM7dUNBQ0YsUUFBUSxHQUFHLENBQUM7Ozs7Ozs7Ozs7Ozs7S0FhOUMsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDE5IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBSZXNpemVOZWFyZXN0TmVpZ2hib3JQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBwYWNrZWRJbnB1dHMgPSB0cnVlO1xuICBwYWNrZWRPdXRwdXQgPSB0cnVlO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGlucHV0U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLCBuZXdIZWlnaHQ6IG51bWJlcixcbiAgICAgIG5ld1dpZHRoOiBudW1iZXIsIGFsaWduQ29ybmVyczogYm9vbGVhbiwgaGFsZlBpeGVsQ2VudGVyczogYm9vbGVhbikge1xuICAgIGNvbnN0IFtiYXRjaCwgb2xkSGVpZ2h0LCBvbGRXaWR0aCwgZGVwdGhdID0gaW5wdXRTaGFwZTtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gW2JhdGNoLCBuZXdIZWlnaHQsIG5ld1dpZHRoLCBkZXB0aF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVJblNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gb2xkSGVpZ2h0IC0gMSA6IG9sZEhlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG9sZFdpZHRoIC0gMSA6IG9sZFdpZHRoXG4gICAgXTtcblxuICAgIGNvbnN0IGVmZmVjdGl2ZU91dFNpemU6IFtudW1iZXIsIG51bWJlcl0gPSBbXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIG5ld0hlaWdodCA+IDEpID8gbmV3SGVpZ2h0IC0gMSA6IG5ld0hlaWdodCxcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgbmV3V2lkdGggPiAxKSA/IG5ld1dpZHRoIC0gMSA6IG5ld1dpZHRoXG4gICAgXTtcblxuICAgIC8vIFdoZW4gYWxpZ24gY29ybmVycyBpcyBmYWxzZSwgd2Ugcm91bmRzIHRoZSB2YWx1ZSB3aXRoIGZsb29yLlxuICAgIGNvbnN0IHJvdW5kQmFzZSA9IGFsaWduQ29ybmVycyA/ICcwLjUnIDogJzAuMCc7XG4gICAgbGV0IHNvdXJjZUZyYWNJbmRleFJDOiBzdHJpbmc7XG4gICAgaWYgKGhhbGZQaXhlbENlbnRlcnMpIHtcbiAgICAgIHNvdXJjZUZyYWNJbmRleFJDID0gYG1heCgodmVjMyh5UkMpICsgdmVjMygwLjUpKSAqIGAgK1xuICAgICAgICAgIGBlZmZlY3RpdmVJbnB1dE92ZXJPdXRwdXRSYXRpb1JDLCB2ZWMzKDAuMCkpYDtcbiAgICB9IGVsc2Uge1xuICAgICAgc291cmNlRnJhY0luZGV4UkMgPSBgdmVjMyh5UkMpICogZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQ2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIGNvbnN0IHZlYzMgZWZmZWN0aXZlSW5wdXRPdmVyT3V0cHV0UmF0aW9SQyA9IHZlYzMoXG4gICAgICAgICAgJHtlZmZlY3RpdmVJblNpemVbMF0gLyBlZmZlY3RpdmVPdXRTaXplWzBdfSxcbiAgICAgICAgICAke2VmZmVjdGl2ZUluU2l6ZVsxXSAvIGVmZmVjdGl2ZU91dFNpemVbMV19LFxuICAgICAgICAgICR7ZWZmZWN0aXZlSW5TaXplWzFdIC8gZWZmZWN0aXZlT3V0U2l6ZVsxXX0pO1xuICAgICAgY29uc3QgdmVjMyBpbnB1dFNoYXBlUkMgPSB2ZWMzKCR7b2xkSGVpZ2h0fS4wLCAke29sZFdpZHRofS4wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7b2xkV2lkdGh9LjApO1xuXG4gICAgICBmbG9hdCBnZXRBVmFsdWUoaW50IGIsIGludCByLCBpbnQgYywgaW50IGQpIHtcbiAgICAgICAgcmV0dXJuIGdldENoYW5uZWwoZ2V0QShiLCByLCBjLCBkKSwgdmVjMihjLCBkKSk7XG4gICAgICB9XG5cbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgaXZlYzQgY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgIGludCBiID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgZCA9IGNvb3Jkc1szXTtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIHZhbHVlcyBmb3IgbmV4dCBjb2x1bW4gaW4geVJDLnouXG4gICAgICAgIGl2ZWMzIHlSQyA9IGNvb3Jkcy55enogKyBpdmVjMygwLCAwLCAxKTtcblxuICAgICAgICAvLyBGcmFjdGlvbmFsIHNvdXJjZSBpbmRleC5cbiAgICAgICAgdmVjMyBzb3VyY2VGcmFjSW5kZXhSQyA9ICR7c291cmNlRnJhY0luZGV4UkN9O1xuXG4gICAgICAgIC8vIENvbXB1dGUgdGhlIGNvb3JkaW5hdG9ycyBvZiBuZWFyZXN0IG5laWdoYm9yIHBvaW50LlxuICAgICAgICBpdmVjMyBzb3VyY2VOZWFyZXN0UkMgPSBpdmVjMyhcbiAgICAgICAgICBtaW4oaW5wdXRTaGFwZVJDIC0gMS4wLCBmbG9vcihzb3VyY2VGcmFjSW5kZXhSQyArICR7cm91bmRCYXNlfSkpKTtcblxuICAgICAgICAvLyBTaG91bGQgd2UgY2FsY3VsYXRlIG5leHQgY29sdW1uIGFuZCByb3cgZWxlbWVudHMgaW4gMngyIHBhY2tlZCBjZWxsLlxuICAgICAgICBib29sIGhhc05leHRDb2wgPSBkIDwgJHtkZXB0aCAtIDF9O1xuICAgICAgICBib29sIGhhc05leHRSb3cgPSBjb29yZHMueiA8ICR7bmV3V2lkdGggLSAxfTtcblxuICAgICAgICB2ZWM0IG5ld1ZhbHVlID0gdmVjNChcbiAgICAgICAgICBnZXRBVmFsdWUoYiwgc291cmNlTmVhcmVzdFJDLngsIHNvdXJjZU5lYXJlc3RSQy55LCBkKSxcbiAgICAgICAgICBoYXNOZXh0Q29sID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueSwgZCArIDEpXG4gICAgICAgICAgICAgICAgICAgICA6IDAuMCxcbiAgICAgICAgICBoYXNOZXh0Um93ID8gZ2V0QVZhbHVlKGIsIHNvdXJjZU5lYXJlc3RSQy54LCBzb3VyY2VOZWFyZXN0UkMueiwgZClcbiAgICAgICAgICAgICAgICAgICAgIDogMC4wLFxuICAgICAgICAgIChoYXNOZXh0Um93ICYmIGhhc05leHRDb2wpID9cbiAgICAgICAgICAgIGdldEFWYWx1ZShiLCBzb3VyY2VOZWFyZXN0UkMueCwgc291cmNlTmVhcmVzdFJDLnosIGQgKyAxKSA6IDAuMCk7XG5cbiAgICAgICAgc2V0T3V0cHV0KG5ld1ZhbHVlKTtcbiAgICAgIH1cbiAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, ResizeNearestNeighbor } from '@tensorflow/tfjs-core';\nimport { ResizeNearestNeighborProgram } from '../resize_nearest_neighbor_gpu';\nimport { ResizeNearestNeighborPackedProgram } from '../resize_nearest_neighbor_packed_gpu';\nexport function resizeNearestNeighbor(args) {\n    const { inputs, backend, attrs } = args;\n    const { images } = inputs;\n    const { alignCorners, halfPixelCenters, size } = attrs;\n    const [newHeight, newWidth] = size;\n    const program = env().getBool('WEBGL_PACK_IMAGE_OPERATIONS') ?\n        new ResizeNearestNeighborPackedProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters) :\n        new ResizeNearestNeighborProgram(images.shape, newHeight, newWidth, alignCorners, halfPixelCenters);\n    return backend.runWebGLProgram(program, [images], images.dtype);\n}\nexport const resizeNearestNeighborConfig = {\n    kernelName: ResizeNearestNeighbor,\n    backendName: 'webgl',\n    kernelFunc: resizeNearestNeighbor\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsR0FBRyxFQUE0QixxQkFBcUIsRUFBc0UsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSyxPQUFPLEVBQUMsNEJBQTRCLEVBQUMsTUFBTSxnQ0FBZ0MsQ0FBQztBQUM1RSxPQUFPLEVBQUMsa0NBQWtDLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUV6RixNQUFNLFVBQVUscUJBQXFCLENBQUMsSUFJckM7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLE1BQU0sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUN4QixNQUFNLEVBQUMsWUFBWSxFQUFFLGdCQUFnQixFQUFFLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyRCxNQUFNLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBQyxHQUFHLElBQUksQ0FBQztJQUVuQyxNQUFNLE9BQU8sR0FBRyxHQUFHLEVBQUUsQ0FBQyxPQUFPLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxDQUFDO1FBQzFELElBQUksa0NBQWtDLENBQ2xDLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQ3JFLFlBQVksRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7UUFDckMsSUFBSSw0QkFBNEIsQ0FDNUIsTUFBTSxDQUFDLEtBQXlDLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFDckUsWUFBWSxFQUFFLGdCQUFnQixDQUFDLENBQUM7SUFDeEMsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRSxDQUFDLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUNsRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sMkJBQTJCLEdBQWlCO0lBQ3ZELFVBQVUsRUFBRSxxQkFBcUI7SUFDakMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLHFCQUF5QztDQUN0RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXNpemVOZWFyZXN0TmVpZ2hib3IsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckF0dHJzLCBSZXNpemVOZWFyZXN0TmVpZ2hib3JJbnB1dHMsIFRlbnNvckluZm99IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1Jlc2l6ZU5lYXJlc3ROZWlnaGJvclByb2dyYW19IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2dwdSc7XG5pbXBvcnQge1Jlc2l6ZU5lYXJlc3ROZWlnaGJvclBhY2tlZFByb2dyYW19IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX3BhY2tlZF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gcmVzaXplTmVhcmVzdE5laWdoYm9yKGFyZ3M6IHtcbiAgaW5wdXRzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW1hZ2VzfSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVycywgaGFsZlBpeGVsQ2VudGVycywgc2l6ZX0gPSBhdHRycztcblxuICBjb25zdCBbbmV3SGVpZ2h0LCBuZXdXaWR0aF0gPSBzaXplO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBlbnYoKS5nZXRCb29sKCdXRUJHTF9QQUNLX0lNQUdFX09QRVJBVElPTlMnKSA/XG4gICAgICBuZXcgUmVzaXplTmVhcmVzdE5laWdoYm9yUGFja2VkUHJvZ3JhbShcbiAgICAgICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG5ld0hlaWdodCwgbmV3V2lkdGgsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKSA6XG4gICAgICBuZXcgUmVzaXplTmVhcmVzdE5laWdoYm9yUHJvZ3JhbShcbiAgICAgICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIG5ld0hlaWdodCwgbmV3V2lkdGgsXG4gICAgICAgICAgYWxpZ25Db3JuZXJzLCBoYWxmUGl4ZWxDZW50ZXJzKTtcbiAgcmV0dXJuIGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKHByb2dyYW0sIFtpbWFnZXNdLCBpbWFnZXMuZHR5cGUpO1xufVxuXG5leHBvcnQgY29uc3QgcmVzaXplTmVhcmVzdE5laWdoYm9yQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvcixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJlc2l6ZU5lYXJlc3ROZWlnaGJvciBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class ResizeNearestNeigborBackpropProgram {\n    constructor(dyShape, inputShape, alignCorners) {\n        this.variableNames = ['dy'];\n        this.outputShape = [];\n        this.outputShape = inputShape;\n        const [, xHeight, xWidth,] = inputShape;\n        const [, yHeight, yWidth] = dyShape;\n        // In the backwards pass, we want to find the pixels that were generated for\n        // each pixel in the input image the forward pass and add the corresponding\n        // coefficient from dy to the gradient (with some interpolation).\n        const effectiveXSize = [\n            (alignCorners && yHeight > 1) ? xHeight - 1 : xHeight,\n            (alignCorners && yWidth > 1) ? xWidth - 1 : xWidth\n        ];\n        const effectiveYSize = [\n            (alignCorners && yHeight > 1) ? yHeight - 1 : yHeight,\n            (alignCorners && yWidth > 1) ? yWidth - 1 : yWidth\n        ];\n        const heightScale = effectiveXSize[0] / effectiveYSize[0];\n        const widthScale = effectiveXSize[1] / effectiveYSize[1];\n        const invHeightScale = 1 / heightScale;\n        const invWidthScale = 1 / widthScale;\n        // This defines the size of the window of values around a particular\n        // index in dy that we want to search for contributions to dx.\n        const winHeight = (Math.ceil(invHeightScale) * 2) + 2;\n        const winWidth = (Math.ceil(invWidthScale) * 2) + 2;\n        this.userCode = `\n      void main() {\n        ivec4 coords = getOutputCoords();\n        int b = coords[0];\n        int d = coords[3];\n        int r = coords[1];\n        int c = coords[2];\n\n        float accumulator = 0.0;\n\n        const float heightScale = float(${heightScale});\n        const float widthScale = float(${widthScale});\n\n        const float invHeightScale = float(${invHeightScale});\n        const float invWidthScale = float(${invWidthScale});\n\n        const int winHeight = int(${winHeight});\n        const int winWidth = int(${winWidth});\n\n        // Compute bounds for where in dy we will look\n        float startRLerp = floor(float(r) * invHeightScale);\n        int startDyR = int(floor(startRLerp - float(winHeight / 2)));\n\n        float startCLerp = floor(float(c) * invWidthScale);\n        int startDyC = int(floor(startCLerp - float(winWidth / 2)));\n\n        // Loop over dy\n        for (int dyROffset = 0; dyROffset < winHeight; dyROffset++) {\n          int dyR = dyROffset + startDyR;\n\n          // Guard against the window exceeding the bounds of dy\n          if (dyR < 0 || dyR >= ${yHeight}) {\n            continue;\n          }\n\n          for (int dyCOffset = 0; dyCOffset < winWidth; dyCOffset++) {\n            int dyC = dyCOffset + startDyC;\n\n            // Guard against the window exceeding the bounds of dy\n            if (dyC < 0 || dyC >= ${yWidth}) {\n              continue;\n            }\n\n            float sourceFracRow =\n              float(${effectiveXSize[0]}) *\n                (float(dyR) / float(${effectiveYSize[0]}));\n\n            float sourceFracCol =\n                float(${effectiveXSize[1]}) *\n                  (float(dyC) / float(${effectiveYSize[1]}));\n\n            int sourceNearestRow = int(min(\n                float(int(${xHeight}) - 1),\n                ${alignCorners} ? float(round(sourceFracRow)) :\n                                  float(floor(sourceFracRow))));\n\n            int sourceNearestCol = int(min(\n                float(int(${xWidth}) - 1),\n                ${alignCorners} ? float(round(sourceFracCol)) :\n                                  float(floor(sourceFracCol))));\n\n            if (r == sourceNearestRow && c == sourceNearestCol) {\n              accumulator += getDy(b, dyR, dyC, d);\n            }\n          }\n        }\n        // End loop over dy\n\n        setOutput(accumulator);\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzaXplX25lYXJlc3RfbmVpZ2hib3JfYmFja3Byb3BfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9yZXNpemVfbmVhcmVzdF9uZWlnaGJvcl9iYWNrcHJvcF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBSUgsTUFBTSxPQUFPLG1DQUFtQztJQUs5QyxZQUNJLE9BQXlDLEVBQ3pDLFVBQTRDLEVBQUUsWUFBcUI7UUFOdkUsa0JBQWEsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3ZCLGdCQUFXLEdBQWEsRUFBRSxDQUFDO1FBTXpCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBQzlCLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUcsR0FBRyxVQUFVLENBQUM7UUFDekMsTUFBTSxDQUFDLEVBQUUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLE9BQU8sQ0FBQztRQUVwQyw0RUFBNEU7UUFDNUUsMkVBQTJFO1FBQzNFLGlFQUFpRTtRQUVqRSxNQUFNLGNBQWMsR0FBcUI7WUFDdkMsQ0FBQyxZQUFZLElBQUksT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPO1lBQ3JELENBQUMsWUFBWSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtTQUNuRCxDQUFDO1FBRUYsTUFBTSxjQUFjLEdBQXFCO1lBQ3ZDLENBQUMsWUFBWSxJQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztZQUNyRCxDQUFDLFlBQVksSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU07U0FDbkQsQ0FBQztRQUVGLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDMUQsTUFBTSxVQUFVLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUV6RCxNQUFNLGNBQWMsR0FBRyxDQUFDLEdBQUcsV0FBVyxDQUFDO1FBQ3ZDLE1BQU0sYUFBYSxHQUFHLENBQUMsR0FBRyxVQUFVLENBQUM7UUFFckMsb0VBQW9FO1FBQ3BFLDhEQUE4RDtRQUM5RCxNQUFNLFNBQVMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3RELE1BQU0sUUFBUSxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFcEQsSUFBSSxDQUFDLFFBQVEsR0FBRzs7Ozs7Ozs7OzswQ0FVc0IsV0FBVzt5Q0FDWixVQUFVOzs2Q0FFTixjQUFjOzRDQUNmLGFBQWE7O29DQUVyQixTQUFTO21DQUNWLFFBQVE7Ozs7Ozs7Ozs7Ozs7O2tDQWNULE9BQU87Ozs7Ozs7O29DQVFMLE1BQU07Ozs7O3NCQUtwQixjQUFjLENBQUMsQ0FBQyxDQUFDO3NDQUNELGNBQWMsQ0FBQyxDQUFDLENBQUM7Ozt3QkFHL0IsY0FBYyxDQUFDLENBQUMsQ0FBQzt3Q0FDRCxjQUFjLENBQUMsQ0FBQyxDQUFDOzs7NEJBRzdCLE9BQU87a0JBQ2pCLFlBQVk7Ozs7NEJBSUYsTUFBTTtrQkFDaEIsWUFBWTs7Ozs7Ozs7Ozs7O0tBWXpCLENBQUM7SUFDSixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgUmVzaXplTmVhcmVzdE5laWdib3JCYWNrcHJvcFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydkeSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW10gPSBbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIGR5U2hhcGU6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyLCBudW1iZXJdLFxuICAgICAgaW5wdXRTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVyczogYm9vbGVhbikge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBpbnB1dFNoYXBlO1xuICAgIGNvbnN0IFssIHhIZWlnaHQsIHhXaWR0aCwgXSA9IGlucHV0U2hhcGU7XG4gICAgY29uc3QgWywgeUhlaWdodCwgeVdpZHRoXSA9IGR5U2hhcGU7XG5cbiAgICAvLyBJbiB0aGUgYmFja3dhcmRzIHBhc3MsIHdlIHdhbnQgdG8gZmluZCB0aGUgcGl4ZWxzIHRoYXQgd2VyZSBnZW5lcmF0ZWQgZm9yXG4gICAgLy8gZWFjaCBwaXhlbCBpbiB0aGUgaW5wdXQgaW1hZ2UgdGhlIGZvcndhcmQgcGFzcyBhbmQgYWRkIHRoZSBjb3JyZXNwb25kaW5nXG4gICAgLy8gY29lZmZpY2llbnQgZnJvbSBkeSB0byB0aGUgZ3JhZGllbnQgKHdpdGggc29tZSBpbnRlcnBvbGF0aW9uKS5cblxuICAgIGNvbnN0IGVmZmVjdGl2ZVhTaXplOiBbbnVtYmVyLCBudW1iZXJdID0gW1xuICAgICAgKGFsaWduQ29ybmVycyAmJiB5SGVpZ2h0ID4gMSkgPyB4SGVpZ2h0IC0gMSA6IHhIZWlnaHQsXG4gICAgICAoYWxpZ25Db3JuZXJzICYmIHlXaWR0aCA+IDEpID8geFdpZHRoIC0gMSA6IHhXaWR0aFxuICAgIF07XG5cbiAgICBjb25zdCBlZmZlY3RpdmVZU2l6ZTogW251bWJlciwgbnVtYmVyXSA9IFtcbiAgICAgIChhbGlnbkNvcm5lcnMgJiYgeUhlaWdodCA+IDEpID8geUhlaWdodCAtIDEgOiB5SGVpZ2h0LFxuICAgICAgKGFsaWduQ29ybmVycyAmJiB5V2lkdGggPiAxKSA/IHlXaWR0aCAtIDEgOiB5V2lkdGhcbiAgICBdO1xuXG4gICAgY29uc3QgaGVpZ2h0U2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVswXSAvIGVmZmVjdGl2ZVlTaXplWzBdO1xuICAgIGNvbnN0IHdpZHRoU2NhbGUgPSBlZmZlY3RpdmVYU2l6ZVsxXSAvIGVmZmVjdGl2ZVlTaXplWzFdO1xuXG4gICAgY29uc3QgaW52SGVpZ2h0U2NhbGUgPSAxIC8gaGVpZ2h0U2NhbGU7XG4gICAgY29uc3QgaW52V2lkdGhTY2FsZSA9IDEgLyB3aWR0aFNjYWxlO1xuXG4gICAgLy8gVGhpcyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSB3aW5kb3cgb2YgdmFsdWVzIGFyb3VuZCBhIHBhcnRpY3VsYXJcbiAgICAvLyBpbmRleCBpbiBkeSB0aGF0IHdlIHdhbnQgdG8gc2VhcmNoIGZvciBjb250cmlidXRpb25zIHRvIGR4LlxuICAgIGNvbnN0IHdpbkhlaWdodCA9IChNYXRoLmNlaWwoaW52SGVpZ2h0U2NhbGUpICogMikgKyAyO1xuICAgIGNvbnN0IHdpbldpZHRoID0gKE1hdGguY2VpbChpbnZXaWR0aFNjYWxlKSAqIDIpICsgMjtcblxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBpbnQgYiA9IGNvb3Jkc1swXTtcbiAgICAgICAgaW50IGQgPSBjb29yZHNbM107XG4gICAgICAgIGludCByID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgYyA9IGNvb3Jkc1syXTtcblxuICAgICAgICBmbG9hdCBhY2N1bXVsYXRvciA9IDAuMDtcblxuICAgICAgICBjb25zdCBmbG9hdCBoZWlnaHRTY2FsZSA9IGZsb2F0KCR7aGVpZ2h0U2NhbGV9KTtcbiAgICAgICAgY29uc3QgZmxvYXQgd2lkdGhTY2FsZSA9IGZsb2F0KCR7d2lkdGhTY2FsZX0pO1xuXG4gICAgICAgIGNvbnN0IGZsb2F0IGludkhlaWdodFNjYWxlID0gZmxvYXQoJHtpbnZIZWlnaHRTY2FsZX0pO1xuICAgICAgICBjb25zdCBmbG9hdCBpbnZXaWR0aFNjYWxlID0gZmxvYXQoJHtpbnZXaWR0aFNjYWxlfSk7XG5cbiAgICAgICAgY29uc3QgaW50IHdpbkhlaWdodCA9IGludCgke3dpbkhlaWdodH0pO1xuICAgICAgICBjb25zdCBpbnQgd2luV2lkdGggPSBpbnQoJHt3aW5XaWR0aH0pO1xuXG4gICAgICAgIC8vIENvbXB1dGUgYm91bmRzIGZvciB3aGVyZSBpbiBkeSB3ZSB3aWxsIGxvb2tcbiAgICAgICAgZmxvYXQgc3RhcnRSTGVycCA9IGZsb29yKGZsb2F0KHIpICogaW52SGVpZ2h0U2NhbGUpO1xuICAgICAgICBpbnQgc3RhcnREeVIgPSBpbnQoZmxvb3Ioc3RhcnRSTGVycCAtIGZsb2F0KHdpbkhlaWdodCAvIDIpKSk7XG5cbiAgICAgICAgZmxvYXQgc3RhcnRDTGVycCA9IGZsb29yKGZsb2F0KGMpICogaW52V2lkdGhTY2FsZSk7XG4gICAgICAgIGludCBzdGFydER5QyA9IGludChmbG9vcihzdGFydENMZXJwIC0gZmxvYXQod2luV2lkdGggLyAyKSkpO1xuXG4gICAgICAgIC8vIExvb3Agb3ZlciBkeVxuICAgICAgICBmb3IgKGludCBkeVJPZmZzZXQgPSAwOyBkeVJPZmZzZXQgPCB3aW5IZWlnaHQ7IGR5Uk9mZnNldCsrKSB7XG4gICAgICAgICAgaW50IGR5UiA9IGR5Uk9mZnNldCArIHN0YXJ0RHlSO1xuXG4gICAgICAgICAgLy8gR3VhcmQgYWdhaW5zdCB0aGUgd2luZG93IGV4Y2VlZGluZyB0aGUgYm91bmRzIG9mIGR5XG4gICAgICAgICAgaWYgKGR5UiA8IDAgfHwgZHlSID49ICR7eUhlaWdodH0pIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGZvciAoaW50IGR5Q09mZnNldCA9IDA7IGR5Q09mZnNldCA8IHdpbldpZHRoOyBkeUNPZmZzZXQrKykge1xuICAgICAgICAgICAgaW50IGR5QyA9IGR5Q09mZnNldCArIHN0YXJ0RHlDO1xuXG4gICAgICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHRoZSB3aW5kb3cgZXhjZWVkaW5nIHRoZSBib3VuZHMgb2YgZHlcbiAgICAgICAgICAgIGlmIChkeUMgPCAwIHx8IGR5QyA+PSAke3lXaWR0aH0pIHtcbiAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZsb2F0IHNvdXJjZUZyYWNSb3cgPVxuICAgICAgICAgICAgICBmbG9hdCgke2VmZmVjdGl2ZVhTaXplWzBdfSkgKlxuICAgICAgICAgICAgICAgIChmbG9hdChkeVIpIC8gZmxvYXQoJHtlZmZlY3RpdmVZU2l6ZVswXX0pKTtcblxuICAgICAgICAgICAgZmxvYXQgc291cmNlRnJhY0NvbCA9XG4gICAgICAgICAgICAgICAgZmxvYXQoJHtlZmZlY3RpdmVYU2l6ZVsxXX0pICpcbiAgICAgICAgICAgICAgICAgIChmbG9hdChkeUMpIC8gZmxvYXQoJHtlZmZlY3RpdmVZU2l6ZVsxXX0pKTtcblxuICAgICAgICAgICAgaW50IHNvdXJjZU5lYXJlc3RSb3cgPSBpbnQobWluKFxuICAgICAgICAgICAgICAgIGZsb2F0KGludCgke3hIZWlnaHR9KSAtIDEpLFxuICAgICAgICAgICAgICAgICR7YWxpZ25Db3JuZXJzfSA/IGZsb2F0KHJvdW5kKHNvdXJjZUZyYWNSb3cpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQoZmxvb3Ioc291cmNlRnJhY1JvdykpKSk7XG5cbiAgICAgICAgICAgIGludCBzb3VyY2VOZWFyZXN0Q29sID0gaW50KG1pbihcbiAgICAgICAgICAgICAgICBmbG9hdChpbnQoJHt4V2lkdGh9KSAtIDEpLFxuICAgICAgICAgICAgICAgICR7YWxpZ25Db3JuZXJzfSA/IGZsb2F0KHJvdW5kKHNvdXJjZUZyYWNDb2wpKSA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQoZmxvb3Ioc291cmNlRnJhY0NvbCkpKSk7XG5cbiAgICAgICAgICAgIGlmIChyID09IHNvdXJjZU5lYXJlc3RSb3cgJiYgYyA9PSBzb3VyY2VOZWFyZXN0Q29sKSB7XG4gICAgICAgICAgICAgIGFjY3VtdWxhdG9yICs9IGdldER5KGIsIGR5UiwgZHlDLCBkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gRW5kIGxvb3Agb3ZlciBkeVxuXG4gICAgICAgIHNldE91dHB1dChhY2N1bXVsYXRvcik7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { ResizeNearestNeighborGrad } from '@tensorflow/tfjs-core';\nimport { ResizeNearestNeigborBackpropProgram } from '../resize_nearest_neighbor_backprop_gpu';\nexport function resizeNearestNeighborGrad(args) {\n    const { inputs, backend, attrs } = args;\n    const { images, dy } = inputs;\n    const { alignCorners } = attrs;\n    const program = new ResizeNearestNeigborBackpropProgram(dy.shape, images.shape, alignCorners);\n    return backend.runWebGLProgram(program, [dy], dy.dtype);\n}\nexport const resizeNearestNeighborGradConfig = {\n    kernelName: ResizeNearestNeighborGrad,\n    backendName: 'webgl',\n    kernelFunc: resizeNearestNeighborGrad\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIseUJBQXlCLEVBQThFLE1BQU0sdUJBQXVCLENBQUM7QUFHdkssT0FBTyxFQUFDLG1DQUFtQyxFQUFDLE1BQU0seUNBQXlDLENBQUM7QUFFNUYsTUFBTSxVQUFVLHlCQUF5QixDQUFDLElBSXpDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxNQUFNLEVBQUUsRUFBRSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzVCLE1BQU0sRUFBQyxZQUFZLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFN0IsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQ0FBbUMsQ0FDbkQsRUFBRSxDQUFDLEtBQXlDLEVBQzVDLE1BQU0sQ0FBQyxLQUF5QyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BFLE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDMUQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFpQjtJQUMzRCxVQUFVLEVBQUUseUJBQXlCO0lBQ3JDLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSx5QkFBNkM7Q0FDMUQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsIFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRBdHRycywgUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7UmVzaXplTmVhcmVzdE5laWdib3JCYWNrcHJvcFByb2dyYW19IGZyb20gJy4uL3Jlc2l6ZV9uZWFyZXN0X25laWdoYm9yX2JhY2twcm9wX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkKGFyZ3M6IHtcbiAgaW5wdXRzOiBSZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtpbWFnZXMsIGR5fSA9IGlucHV0cztcbiAgY29uc3Qge2FsaWduQ29ybmVyc30gPSBhdHRycztcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFJlc2l6ZU5lYXJlc3ROZWlnYm9yQmFja3Byb3BQcm9ncmFtKFxuICAgICAgZHkuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBpbWFnZXMuc2hhcGUgYXMgW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sIGFsaWduQ29ybmVycyk7XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShwcm9ncmFtLCBbZHldLCBkeS5kdHlwZSk7XG59XG5cbmV4cG9ydCBjb25zdCByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiByZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class ReverseProgram {\n    constructor(xShape, axis) {\n        this.variableNames = ['x'];\n        const rank = xShape.length;\n        if (rank > 4) {\n            throw new Error(`WebGL backend: Reverse of rank-${rank} tensor is not yet supported`);\n        }\n        this.outputShape = xShape;\n        if (rank === 1) {\n            this.userCode = `\n        void main() {\n          int coord = getOutputCoords();\n          setOutput(getX(${xShape[0]} - coord - 1));\n        }\n      `;\n            return;\n        }\n        const getInCoord = (i) => {\n            if (axis.indexOf(i) !== -1 && xShape[i] !== 1) {\n                return `${xShape[i]} - coords[${i}] - 1`;\n            }\n            return `coords[${i}]`;\n        };\n        const inCoords = xShape.map((_, i) => getInCoord(i)).join(',');\n        const type = getCoordsDataType(rank);\n        this.userCode = `\n      void main() {\n        ${type} coords = getOutputCoords();\n        setOutput(getX(${inCoords}));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3JldmVyc2VfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxjQUFjO0lBS3pCLFlBQVksTUFBZ0IsRUFBRSxJQUFjO1FBSjVDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUtwQixNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzNCLElBQUksSUFBSSxHQUFHLENBQUMsRUFBRTtZQUNaLE1BQU0sSUFBSSxLQUFLLENBQ1gsa0NBQWtDLElBQUksOEJBQThCLENBQUMsQ0FBQztTQUMzRTtRQUNELElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1FBRTFCLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLElBQUksQ0FBQyxRQUFRLEdBQUc7OzsyQkFHSyxNQUFNLENBQUMsQ0FBQyxDQUFDOztPQUU3QixDQUFDO1lBQ0YsT0FBTztTQUNSO1FBQ0QsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFTLEVBQUUsRUFBRTtZQUMvQixJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDN0MsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQzthQUMxQztZQUNELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQztRQUN4QixDQUFDLENBQUM7UUFDRixNQUFNLFFBQVEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sSUFBSSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXJDLElBQUksQ0FBQyxRQUFRLEdBQUc7O1VBRVYsSUFBSTt5QkFDVyxRQUFROztLQUU1QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFJldmVyc2VQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoeFNoYXBlOiBudW1iZXJbXSwgYXhpczogbnVtYmVyW10pIHtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBpZiAocmFuayA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2ViR0wgYmFja2VuZDogUmV2ZXJzZSBvZiByYW5rLSR7cmFua30gdGVuc29yIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG5cbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGludCBjb29yZCA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHNldE91dHB1dChnZXRYKCR7eFNoYXBlWzBdfSAtIGNvb3JkIC0gMSkpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBjb25zdCBnZXRJbkNvb3JkID0gKGk6IG51bWJlcikgPT4ge1xuICAgICAgaWYgKGF4aXMuaW5kZXhPZihpKSAhPT0gLTEgJiYgeFNoYXBlW2ldICE9PSAxKSB7XG4gICAgICAgIHJldHVybiBgJHt4U2hhcGVbaV19IC0gY29vcmRzWyR7aX1dIC0gMWA7XG4gICAgICB9XG4gICAgICByZXR1cm4gYGNvb3Jkc1ske2l9XWA7XG4gICAgfTtcbiAgICBjb25zdCBpbkNvb3JkcyA9IHhTaGFwZS5tYXAoKF8sIGkpID0+IGdldEluQ29vcmQoaSkpLmpvaW4oJywnKTtcbiAgICBjb25zdCB0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke3R5cGV9IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBzZXRPdXRwdXQoZ2V0WCgke2luQ29vcmRzfSkpO1xuICAgICAgfVxuICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getChannels } from './packing_util';\nimport { getCoordsDataType } from './shader_compiler';\nexport class ReversePackedProgram {\n    constructor(xShape, axis) {\n        this.variableNames = ['x'];\n        this.packedInputs = true;\n        this.packedOutput = true;\n        const rank = xShape.length;\n        if (rank > 4) {\n            throw new Error(`WebGL backend: Reverse of rank-${rank} tensor is not yet supported`);\n        }\n        this.outputShape = xShape;\n        const channels = getChannels('rc', rank);\n        const nextColumn = `${channels[rank - 1]} + 1 < ${this.outputShape[rank - 1]}`;\n        const nextRow = `${channels[rank - 2]} + 1 < ${this.outputShape[rank - 2]}`;\n        const type = getCoordsDataType(rank);\n        if (rank === 1) {\n            this.userCode = `\n        void main(){\n          int rc = getOutputCoords();\n          vec4 result = vec4(0.);\n          result.r = getChannel(getX(${xShape[0]} - rc - 1),\n            ${xShape[0]} - rc - 1);\n          if(${nextColumn}){\n              result.g = getChannel(getX(${xShape[0]} - (rc  + 1) - 1),\n                ${xShape[0]} - (rc  + 1) - 1);\n          }\n          setOutput(result);\n        }\n      `;\n        }\n        else {\n            this.userCode = `\n        void main() {\n          ${type} rc = getOutputCoords();\n          vec4 result = vec4(0.);\n          result.r = ${getR(channels.slice())};\n          if(${nextColumn}){\n            result.g = ${getG(channels.slice())};\n          }\n          if(${nextRow}) {\n            result.b = ${getB(channels.slice())};\n            if(${nextColumn}) {\n              result.a = ${getA(channels.slice())};\n            }\n          }\n          setOutput(result);\n        }\n    `;\n        }\n        function getR(channels) {\n            return getChannel(channels);\n        }\n        function getG(channels) {\n            channels[rank - 1] = '(' + channels[rank - 1] + ` + 1)`;\n            return getChannel(channels);\n        }\n        function getB(channels) {\n            channels[rank - 2] = '(' + channels[rank - 2] + ` + 1)`;\n            return getChannel(channels);\n        }\n        function getA(channels) {\n            channels[rank - 1] = '(' + channels[rank - 1] + ` + 1)`;\n            channels[rank - 2] = '(' + channels[rank - 2] + ` + 1)`;\n            return getChannel(channels);\n        }\n        function getChannel(channels) {\n            const inCoordsArray = xShape.map((_, i) => getInCoord(i, channels));\n            const inCoords = inCoordsArray.join(',');\n            const innerDims = inCoordsArray.slice(-2).join(',');\n            return `getChannel(getX(${inCoords}), vec2(${innerDims}))`;\n        }\n        function getInCoord(i, channels1) {\n            if (axis.indexOf(i) !== -1 && xShape[i] !== 1) {\n                return `${xShape[i]} - ${channels1[i]} - 1`;\n            }\n            else {\n                return `${channels1[i]}`;\n            }\n        }\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV2ZXJzZV9wYWNrZWRfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9yZXZlcnNlX3BhY2tlZF9ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBR0gsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxvQkFBb0I7SUFPL0IsWUFBWSxNQUFnQixFQUFFLElBQWM7UUFONUMsa0JBQWEsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBR3RCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBQ3BCLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBR2xCLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7UUFDM0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ1osTUFBTSxJQUFJLEtBQUssQ0FDWCxrQ0FBa0MsSUFBSSw4QkFBOEIsQ0FBQyxDQUFDO1NBQzNFO1FBQ0QsSUFBSSxDQUFDLFdBQVcsR0FBRyxNQUFNLENBQUM7UUFDMUIsTUFBTSxRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN6QyxNQUFNLFVBQVUsR0FDWixHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxNQUFNLE9BQU8sR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLFVBQVUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RSxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLElBQUksS0FBSyxDQUFDLEVBQUU7WUFDZCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7O3VDQUlpQixNQUFNLENBQUMsQ0FBQyxDQUFDO2NBQ2xDLE1BQU0sQ0FBQyxDQUFDLENBQUM7ZUFDUixVQUFVOzJDQUNrQixNQUFNLENBQUMsQ0FBQyxDQUFDO2tCQUNsQyxNQUFNLENBQUMsQ0FBQyxDQUFDOzs7O09BSXBCLENBQUM7U0FDSDthQUFNO1lBQ0wsSUFBSSxDQUFDLFFBQVEsR0FBRzs7WUFFVixJQUFJOzt1QkFFTyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2VBQzlCLFVBQVU7eUJBQ0EsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7ZUFFaEMsT0FBTzt5QkFDRyxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDO2lCQUM5QixVQUFVOzJCQUNBLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7O0tBSzVDLENBQUM7U0FDRDtRQUVELFNBQVMsSUFBSSxDQUFDLFFBQWtCO1lBQzlCLE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxTQUFTLElBQUksQ0FBQyxRQUFrQjtZQUM5QixRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQztZQUN4RCxPQUFPLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsU0FBUyxJQUFJLENBQUMsUUFBa0I7WUFDOUIsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsR0FBRyxPQUFPLENBQUM7WUFDeEQsT0FBTyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELFNBQVMsSUFBSSxDQUFDLFFBQWtCO1lBQzlCLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3hELFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsR0FBRyxHQUFHLFFBQVEsQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDLEdBQUcsT0FBTyxDQUFDO1lBQ3hELE9BQU8sVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzlCLENBQUM7UUFFRCxTQUFTLFVBQVUsQ0FBQyxRQUFrQjtZQUNwQyxNQUFNLGFBQWEsR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sUUFBUSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekMsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNwRCxPQUFPLG1CQUFtQixRQUFRLFdBQVcsU0FBUyxJQUFJLENBQUM7UUFDN0QsQ0FBQztRQUVELFNBQVMsVUFBVSxDQUFDLENBQVMsRUFBRSxTQUFtQjtZQUNoRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDN0MsT0FBTyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsTUFBTSxTQUFTLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzthQUM3QztpQkFBTTtnQkFDTCxPQUFPLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7YUFDMUI7UUFDSCxDQUFDO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q2hhbm5lbHN9IGZyb20gJy4vcGFja2luZ191dGlsJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFJldmVyc2VQYWNrZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsneCddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHBhY2tlZElucHV0cyA9IHRydWU7XG4gIHBhY2tlZE91dHB1dCA9IHRydWU7XG5cbiAgY29uc3RydWN0b3IoeFNoYXBlOiBudW1iZXJbXSwgYXhpczogbnVtYmVyW10pIHtcbiAgICBjb25zdCByYW5rID0geFNoYXBlLmxlbmd0aDtcbiAgICBpZiAocmFuayA+IDQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICBgV2ViR0wgYmFja2VuZDogUmV2ZXJzZSBvZiByYW5rLSR7cmFua30gdGVuc29yIGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSB4U2hhcGU7XG4gICAgY29uc3QgY2hhbm5lbHMgPSBnZXRDaGFubmVscygncmMnLCByYW5rKTtcbiAgICBjb25zdCBuZXh0Q29sdW1uID1cbiAgICAgICAgYCR7Y2hhbm5lbHNbcmFuayAtIDFdfSArIDEgPCAke3RoaXMub3V0cHV0U2hhcGVbcmFuayAtIDFdfWA7XG4gICAgY29uc3QgbmV4dFJvdyA9IGAke2NoYW5uZWxzW3JhbmsgLSAyXX0gKyAxIDwgJHt0aGlzLm91dHB1dFNoYXBlW3JhbmsgLSAyXX1gO1xuICAgIGNvbnN0IHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZShyYW5rKTtcbiAgICBpZiAocmFuayA9PT0gMSkge1xuICAgICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCl7XG4gICAgICAgICAgaW50IHJjID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgdmVjNCByZXN1bHQgPSB2ZWM0KDAuKTtcbiAgICAgICAgICByZXN1bHQuciA9IGdldENoYW5uZWwoZ2V0WCgke3hTaGFwZVswXX0gLSByYyAtIDEpLFxuICAgICAgICAgICAgJHt4U2hhcGVbMF19IC0gcmMgLSAxKTtcbiAgICAgICAgICBpZigke25leHRDb2x1bW59KXtcbiAgICAgICAgICAgICAgcmVzdWx0LmcgPSBnZXRDaGFubmVsKGdldFgoJHt4U2hhcGVbMF19IC0gKHJjICArIDEpIC0gMSksXG4gICAgICAgICAgICAgICAgJHt4U2hhcGVbMF19IC0gKHJjICArIDEpIC0gMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNldE91dHB1dChyZXN1bHQpO1xuICAgICAgICB9XG4gICAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHt0eXBlfSByYyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIHZlYzQgcmVzdWx0ID0gdmVjNCgwLik7XG4gICAgICAgICAgcmVzdWx0LnIgPSAke2dldFIoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgIGlmKCR7bmV4dENvbHVtbn0pe1xuICAgICAgICAgICAgcmVzdWx0LmcgPSAke2dldEcoY2hhbm5lbHMuc2xpY2UoKSl9O1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZigke25leHRSb3d9KSB7XG4gICAgICAgICAgICByZXN1bHQuYiA9ICR7Z2V0QihjaGFubmVscy5zbGljZSgpKX07XG4gICAgICAgICAgICBpZigke25leHRDb2x1bW59KSB7XG4gICAgICAgICAgICAgIHJlc3VsdC5hID0gJHtnZXRBKGNoYW5uZWxzLnNsaWNlKCkpfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KHJlc3VsdCk7XG4gICAgICAgIH1cbiAgICBgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldFIoY2hhbm5lbHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIHJldHVybiBnZXRDaGFubmVsKGNoYW5uZWxzKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBnZXRHKGNoYW5uZWxzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgICBjaGFubmVsc1tyYW5rIC0gMV0gPSAnKCcgKyBjaGFubmVsc1tyYW5rIC0gMV0gKyBgICsgMSlgO1xuICAgICAgcmV0dXJuIGdldENoYW5uZWwoY2hhbm5lbHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEIoY2hhbm5lbHM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIGNoYW5uZWxzW3JhbmsgLSAyXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAyXSArIGAgKyAxKWA7XG4gICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0QShjaGFubmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgY2hhbm5lbHNbcmFuayAtIDFdID0gJygnICsgY2hhbm5lbHNbcmFuayAtIDFdICsgYCArIDEpYDtcbiAgICAgIGNoYW5uZWxzW3JhbmsgLSAyXSA9ICcoJyArIGNoYW5uZWxzW3JhbmsgLSAyXSArIGAgKyAxKWA7XG4gICAgICByZXR1cm4gZ2V0Q2hhbm5lbChjaGFubmVscyk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0Q2hhbm5lbChjaGFubmVsczogc3RyaW5nW10pOiBzdHJpbmcge1xuICAgICAgY29uc3QgaW5Db29yZHNBcnJheSA9IHhTaGFwZS5tYXAoKF8sIGkpID0+IGdldEluQ29vcmQoaSwgY2hhbm5lbHMpKTtcbiAgICAgIGNvbnN0IGluQ29vcmRzID0gaW5Db29yZHNBcnJheS5qb2luKCcsJyk7XG4gICAgICBjb25zdCBpbm5lckRpbXMgPSBpbkNvb3Jkc0FycmF5LnNsaWNlKC0yKS5qb2luKCcsJyk7XG4gICAgICByZXR1cm4gYGdldENoYW5uZWwoZ2V0WCgke2luQ29vcmRzfSksIHZlYzIoJHtpbm5lckRpbXN9KSlgO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdldEluQ29vcmQoaTogbnVtYmVyLCBjaGFubmVsczE6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICAgIGlmIChheGlzLmluZGV4T2YoaSkgIT09IC0xICYmIHhTaGFwZVtpXSAhPT0gMSkge1xuICAgICAgICByZXR1cm4gYCR7eFNoYXBlW2ldfSAtICR7Y2hhbm5lbHMxW2ldfSAtIDFgO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGAke2NoYW5uZWxzMVtpXX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, Reverse, util } from '@tensorflow/tfjs-core';\nimport { ReverseProgram } from '../reverse_gpu';\nimport { ReversePackedProgram } from '../reverse_packed_gpu';\nimport { identity } from './Identity';\nexport function reverse(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { dims } = attrs;\n    const xRank = x.shape.length;\n    const $dims = util.parseAxisParam(dims, x.shape);\n    if (xRank === 0) {\n        return identity({ inputs: { x }, backend });\n    }\n    const program = env().getBool('WEBGL_PACK_ARRAY_OPERATIONS') ?\n        new ReversePackedProgram(x.shape, $dims) :\n        new ReverseProgram(x.shape, $dims);\n    return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const reverseConfig = {\n    kernelName: Reverse,\n    backendName: 'webgl',\n    kernelFunc: reverse\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUmV2ZXJzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9SZXZlcnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQTRCLE9BQU8sRUFBMkMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHNUgsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxvQkFBb0IsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRTNELE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxZQUFZLENBQUM7QUFFcEMsTUFBTSxVQUFVLE9BQU8sQ0FBQyxJQUl2QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQ2pELElBQUksS0FBSyxLQUFLLENBQUMsRUFBRTtRQUNmLE9BQU8sUUFBUSxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztLQUN6QztJQUVELE1BQU0sT0FBTyxHQUFHLEdBQUcsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUM7UUFDMUQsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDMUMsSUFBSSxjQUFjLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztJQUV2QyxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQ3hELENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxhQUFhLEdBQWlCO0lBQ3pDLFVBQVUsRUFBRSxPQUFPO0lBQ25CLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxPQUEyQjtDQUN4QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2VudiwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSZXZlcnNlLCBSZXZlcnNlQXR0cnMsIFJldmVyc2VJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1JldmVyc2VQcm9ncmFtfSBmcm9tICcuLi9yZXZlcnNlX2dwdSc7XG5pbXBvcnQge1JldmVyc2VQYWNrZWRQcm9ncmFtfSBmcm9tICcuLi9yZXZlcnNlX3BhY2tlZF9ncHUnO1xuXG5pbXBvcnQge2lkZW50aXR5fSBmcm9tICcuL0lkZW50aXR5JztcblxuZXhwb3J0IGZ1bmN0aW9uIHJldmVyc2UoYXJnczoge1xuICBpbnB1dHM6IFJldmVyc2VJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBSZXZlcnNlQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7ZGltc30gPSBhdHRycztcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0ICRkaW1zID0gdXRpbC5wYXJzZUF4aXNQYXJhbShkaW1zLCB4LnNoYXBlKTtcbiAgaWYgKHhSYW5rID09PSAwKSB7XG4gICAgcmV0dXJuIGlkZW50aXR5KHtpbnB1dHM6IHt4fSwgYmFja2VuZH0pO1xuICB9XG5cbiAgY29uc3QgcHJvZ3JhbSA9IGVudigpLmdldEJvb2woJ1dFQkdMX1BBQ0tfQVJSQVlfT1BFUkFUSU9OUycpID9cbiAgICAgIG5ldyBSZXZlcnNlUGFja2VkUHJvZ3JhbSh4LnNoYXBlLCAkZGltcykgOlxuICAgICAgbmV3IFJldmVyc2VQcm9ncmFtKHguc2hhcGUsICRkaW1zKTtcblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHJldmVyc2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogUmV2ZXJzZSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHJldmVyc2UgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class RotateProgram {\n    constructor(imageShape, fillValue) {\n        this.variableNames = ['Image'];\n        this.outputShape = [];\n        this.customUniforms = [{ name: 'params', type: 'vec4' }];\n        const imageHeight = imageShape[1];\n        const imageWidth = imageShape[2];\n        this.outputShape = imageShape;\n        let fillSnippet = '';\n        if (typeof fillValue === 'number') {\n            fillSnippet = `float outputValue = ${fillValue.toFixed(2)};`;\n        }\n        else {\n            fillSnippet = `\n        vec3 fill = vec3(${fillValue.join(',')});\n        float outputValue = fill[coords[3]];`;\n        }\n        this.userCode = `\n        void main() {\n          ivec4 coords = getOutputCoords();\n          int x = coords[2];\n          int y = coords[1];\n          float coordXFloat = (float(x) - params[0]) * params[3] -\n            (float(y) - params[1]) * params[2];\n          float coordYFloat = (float(x) - params[0]) * params[2] +\n            (float(y) - params[1]) * params[3];\n          int coordX = int(round(coordXFloat + params[0]));\n          int coordY = int(round(coordYFloat + params[1]));\n          ${fillSnippet}\n          if(coordX >= 0 && coordX < ${imageWidth} && coordY >= 0 && coordY < ${imageHeight}) {\n            outputValue = getImage(coords[0], coordY, coordX, coords[3]);\n          }\n          setOutput(outputValue);\n        }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm90YXRlX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvcm90YXRlX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFLSCxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUNJLFVBQTRDLEVBQzVDLFNBQTBDO1FBTjlDLGtCQUFhLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMxQixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUUzQixtQkFBYyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSxNQUFxQixFQUFDLENBQUMsQ0FBQztRQUkvRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEMsTUFBTSxVQUFVLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBRTlCLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUNyQixJQUFJLE9BQU8sU0FBUyxLQUFLLFFBQVEsRUFBRTtZQUNqQyxXQUFXLEdBQUcsdUJBQXVCLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztTQUM5RDthQUFNO1lBQ0wsV0FBVyxHQUFHOzJCQUNPLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDOzZDQUNELENBQUM7U0FDekM7UUFFRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7OztZQVdSLFdBQVc7dUNBQ2dCLFVBQVUsK0JBQ3pDLFdBQVc7Ozs7O0tBS2QsQ0FBQztJQUNKLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBSb3RhdGVQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnXTtcbiAgb3V0cHV0U2hhcGU6IG51bWJlcltdID0gW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIGN1c3RvbVVuaWZvcm1zID0gW3tuYW1lOiAncGFyYW1zJywgdHlwZTogJ3ZlYzQnIGFzIFVuaWZvcm1UeXBlfV07XG4gIGNvbnN0cnVjdG9yKFxuICAgICAgaW1hZ2VTaGFwZTogW251bWJlciwgbnVtYmVyLCBudW1iZXIsIG51bWJlcl0sXG4gICAgICBmaWxsVmFsdWU6IG51bWJlcnxbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0pIHtcbiAgICBjb25zdCBpbWFnZUhlaWdodCA9IGltYWdlU2hhcGVbMV07XG4gICAgY29uc3QgaW1hZ2VXaWR0aCA9IGltYWdlU2hhcGVbMl07XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IGltYWdlU2hhcGU7XG5cbiAgICBsZXQgZmlsbFNuaXBwZXQgPSAnJztcbiAgICBpZiAodHlwZW9mIGZpbGxWYWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIGZpbGxTbmlwcGV0ID0gYGZsb2F0IG91dHB1dFZhbHVlID0gJHtmaWxsVmFsdWUudG9GaXhlZCgyKX07YDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmlsbFNuaXBwZXQgPSBgXG4gICAgICAgIHZlYzMgZmlsbCA9IHZlYzMoJHtmaWxsVmFsdWUuam9pbignLCcpfSk7XG4gICAgICAgIGZsb2F0IG91dHB1dFZhbHVlID0gZmlsbFtjb29yZHNbM11dO2A7XG4gICAgfVxuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgIGludCB4ID0gY29vcmRzWzJdO1xuICAgICAgICAgIGludCB5ID0gY29vcmRzWzFdO1xuICAgICAgICAgIGZsb2F0IGNvb3JkWEZsb2F0ID0gKGZsb2F0KHgpIC0gcGFyYW1zWzBdKSAqIHBhcmFtc1szXSAtXG4gICAgICAgICAgICAoZmxvYXQoeSkgLSBwYXJhbXNbMV0pICogcGFyYW1zWzJdO1xuICAgICAgICAgIGZsb2F0IGNvb3JkWUZsb2F0ID0gKGZsb2F0KHgpIC0gcGFyYW1zWzBdKSAqIHBhcmFtc1syXSArXG4gICAgICAgICAgICAoZmxvYXQoeSkgLSBwYXJhbXNbMV0pICogcGFyYW1zWzNdO1xuICAgICAgICAgIGludCBjb29yZFggPSBpbnQocm91bmQoY29vcmRYRmxvYXQgKyBwYXJhbXNbMF0pKTtcbiAgICAgICAgICBpbnQgY29vcmRZID0gaW50KHJvdW5kKGNvb3JkWUZsb2F0ICsgcGFyYW1zWzFdKSk7XG4gICAgICAgICAgJHtmaWxsU25pcHBldH1cbiAgICAgICAgICBpZihjb29yZFggPj0gMCAmJiBjb29yZFggPCAke2ltYWdlV2lkdGh9ICYmIGNvb3JkWSA+PSAwICYmIGNvb3JkWSA8ICR7XG4gICAgICAgIGltYWdlSGVpZ2h0fSkge1xuICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSBnZXRJbWFnZShjb29yZHNbMF0sIGNvb3JkWSwgY29vcmRYLCBjb29yZHNbM10pO1xuICAgICAgICAgIH1cbiAgICAgICAgICBzZXRPdXRwdXQob3V0cHV0VmFsdWUpO1xuICAgICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util } from '@tensorflow/tfjs-core';\nimport { RotateWithOffset } from '@tensorflow/tfjs-core';\nimport { RotateProgram } from '../rotate_gpu';\nexport const rotateWithOffsetConfig = {\n    kernelName: RotateWithOffset,\n    backendName: 'webgl',\n    kernelFunc: ({ inputs, attrs, backend }) => {\n        const { image } = inputs;\n        const { radians, fillValue, center } = attrs;\n        const webglBackend = backend;\n        const program = new RotateProgram(image.shape, fillValue);\n        const [centerX, centerY] = backend_util.getImageCenter(center, image.shape[1], image.shape[2]);\n        const customValues = [[centerX, centerY, Math.sin(radians), Math.cos(radians)]];\n        const output = webglBackend.runWebGLProgram(program, [image], image.dtype, customValues);\n        return output;\n    }\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm90YXRlV2l0aE9mZnNldC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Sb3RhdGVXaXRoT2Zmc2V0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQXlCLE1BQU0sdUJBQXVCLENBQUM7QUFDM0UsT0FBTyxFQUFDLGdCQUFnQixFQUFnRCxNQUFNLHVCQUF1QixDQUFDO0FBR3RHLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFNUMsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQWlCO0lBQ2xELFVBQVUsRUFBRSxnQkFBZ0I7SUFDNUIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLENBQUMsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxFQUFFLEVBQUU7UUFDdkMsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQWdDLENBQUM7UUFDakQsTUFBTSxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFDLEdBQUcsS0FBb0MsQ0FBQztRQUMxRSxNQUFNLFlBQVksR0FBRyxPQUEyQixDQUFDO1FBRWpELE1BQU0sT0FBTyxHQUFHLElBQUksYUFBYSxDQUFFLEtBQWtCLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sQ0FBQyxPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQ3BCLFlBQVksQ0FBQyxjQUFjLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLE1BQU0sWUFBWSxHQUNkLENBQUMsQ0FBQyxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLGVBQWUsQ0FDdkMsT0FBTyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQztRQUNqRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgVGVuc29yNER9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge1JvdGF0ZVdpdGhPZmZzZXQsIFJvdGF0ZVdpdGhPZmZzZXRBdHRycywgUm90YXRlV2l0aE9mZnNldElucHV0c30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7Um90YXRlUHJvZ3JhbX0gZnJvbSAnLi4vcm90YXRlX2dwdSc7XG5cbmV4cG9ydCBjb25zdCByb3RhdGVXaXRoT2Zmc2V0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJvdGF0ZVdpdGhPZmZzZXQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiAoe2lucHV0cywgYXR0cnMsIGJhY2tlbmR9KSA9PiB7XG4gICAgY29uc3Qge2ltYWdlfSA9IGlucHV0cyBhcyBSb3RhdGVXaXRoT2Zmc2V0SW5wdXRzO1xuICAgIGNvbnN0IHtyYWRpYW5zLCBmaWxsVmFsdWUsIGNlbnRlcn0gPSBhdHRycyBhcyB7fSBhcyBSb3RhdGVXaXRoT2Zmc2V0QXR0cnM7XG4gICAgY29uc3Qgd2ViZ2xCYWNrZW5kID0gYmFja2VuZCBhcyBNYXRoQmFja2VuZFdlYkdMO1xuXG4gICAgY29uc3QgcHJvZ3JhbSA9IG5ldyBSb3RhdGVQcm9ncmFtKChpbWFnZSBhcyBUZW5zb3I0RCkuc2hhcGUsIGZpbGxWYWx1ZSk7XG4gICAgY29uc3QgW2NlbnRlclgsIGNlbnRlclldID1cbiAgICAgICAgYmFja2VuZF91dGlsLmdldEltYWdlQ2VudGVyKGNlbnRlciwgaW1hZ2Uuc2hhcGVbMV0sIGltYWdlLnNoYXBlWzJdKTtcbiAgICBjb25zdCBjdXN0b21WYWx1ZXMgPVxuICAgICAgICBbW2NlbnRlclgsIGNlbnRlclksIE1hdGguc2luKHJhZGlhbnMpLCBNYXRoLmNvcyhyYWRpYW5zKV1dO1xuICAgIGNvbnN0IG91dHB1dCA9IHdlYmdsQmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICAgIHByb2dyYW0sIFtpbWFnZV0sIGltYWdlLmR0eXBlLCBjdXN0b21WYWx1ZXMpO1xuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Round } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst ROUND = `\n  // OpenGL ES does not support round function.\n  // The algorithm is based on banker's rounding.\n  float base = floor(x);\n  if ((x - base) < 0.5) {\n    return floor(x);\n  } else if ((x - base) > 0.5) {\n    return ceil(x);\n  } else {\n    if (mod(base, 2.0) == 0.0) {\n      return base;\n    } else {\n      return base + 1.0;\n    }\n  }\n`;\nexport const round = unaryKernelFunc({ opSnippet: ROUND });\nexport const roundConfig = {\n    kernelName: Round,\n    backendName: 'webgl',\n    kernelFunc: round,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUm91bmQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUm91bmQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLEtBQUssRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzFELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLEtBQUssR0FBRzs7Ozs7Ozs7Ozs7Ozs7O0NBZWIsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFDLENBQUMsQ0FBQztBQUV6RCxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQWlCO0lBQ3ZDLFVBQVUsRUFBRSxLQUFLO0lBQ2pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxLQUFLO0NBQ2xCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBSb3VuZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgUk9VTkQgPSBgXG4gIC8vIE9wZW5HTCBFUyBkb2VzIG5vdCBzdXBwb3J0IHJvdW5kIGZ1bmN0aW9uLlxuICAvLyBUaGUgYWxnb3JpdGhtIGlzIGJhc2VkIG9uIGJhbmtlcidzIHJvdW5kaW5nLlxuICBmbG9hdCBiYXNlID0gZmxvb3IoeCk7XG4gIGlmICgoeCAtIGJhc2UpIDwgMC41KSB7XG4gICAgcmV0dXJuIGZsb29yKHgpO1xuICB9IGVsc2UgaWYgKCh4IC0gYmFzZSkgPiAwLjUpIHtcbiAgICByZXR1cm4gY2VpbCh4KTtcbiAgfSBlbHNlIHtcbiAgICBpZiAobW9kKGJhc2UsIDIuMCkgPT0gMC4wKSB7XG4gICAgICByZXR1cm4gYmFzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJhc2UgKyAxLjA7XG4gICAgfVxuICB9XG5gO1xuXG5leHBvcnQgY29uc3Qgcm91bmQgPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogUk9VTkR9KTtcblxuZXhwb3J0IGNvbnN0IHJvdW5kQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJvdW5kLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcm91bmQsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Rsqrt } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { rsqrtImplCPU } from '../kernel_utils/shared';\nconst RSQRT = `return inversesqrt(x);`;\nexport const rsqrt = unaryKernelFunc({ opSnippet: RSQRT, cpuKernelImpl: rsqrtImplCPU });\nexport const rsqrtConfig = {\n    kernelName: Rsqrt,\n    backendName: 'webgl',\n    kernelFunc: rsqrt\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUnNxcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvUnNxcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixLQUFLLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN0RSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXBELE1BQU0sS0FBSyxHQUFHLHdCQUF3QixDQUFDO0FBRXZDLE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FDZCxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUMsQ0FBQyxDQUFDO0FBRXJFLE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBaUI7SUFDdkMsVUFBVSxFQUFFLEtBQUs7SUFDakIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEtBQXlCO0NBQ3RDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSc3FydH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7cnNxcnRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuY29uc3QgUlNRUlQgPSBgcmV0dXJuIGludmVyc2VzcXJ0KHgpO2A7XG5cbmV4cG9ydCBjb25zdCByc3FydCA9XG4gICAgdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFJTUVJULCBjcHVLZXJuZWxJbXBsOiByc3FydEltcGxDUFV9KTtcblxuZXhwb3J0IGNvbnN0IHJzcXJ0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFJzcXJ0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogcnNxcnQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class ScatterProgram {\n    constructor(updateSize, sliceDim, indicesRank, updatesRank, strides, shape, summingDupeIndex = true) {\n        this.variableNames = ['updates', 'indices', 'defaultValue'];\n        this.outputShape = shape;\n        const stridesType = getCoordsDataType(strides.length);\n        const dtype = getCoordsDataType(shape.length);\n        let indicesString = '';\n        if (indicesRank === 1) {\n            indicesString = 'i';\n        }\n        else if (indicesRank === 2) {\n            indicesString = 'i, j';\n        }\n        const indicesSnippet = `getIndices(${indicesString})`;\n        let updatesString = '';\n        if (updatesRank === 1) {\n            updatesString = 'i';\n        }\n        else if (updatesRank === 2) {\n            updatesString = 'i, coords[1]';\n        }\n        const updatesSnippet = `getUpdates(${updatesString})`;\n        const strideString = sliceDim > 1 ? 'strides[j]' : 'strides';\n        this.userCode = `\n        ${stridesType} strides = ${stridesType}(${strides});\n\n        void main() {\n          ${dtype} coords = getOutputCoords();\n          float sum = 0.0;\n          bool found = false;\n          for (int i = 0; i < ${updateSize}; i++) {\n            int flattenedIndex = 0;\n            for (int j = 0; j < ${sliceDim}; j++) {\n              int index = round(${indicesSnippet});\n              flattenedIndex += index * ${strideString};\n            }\n            if (flattenedIndex == coords[0]) {\n              sum += ${updatesSnippet};\n              found = true;\n            }\n          }\n          setOutput(mix(getDefaultValue(), sum, float(found)));\n        }\n      `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NhdHRlcl9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3NjYXR0ZXJfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxjQUFjO0lBS3pCLFlBQ0ksVUFBa0IsRUFBRSxRQUFnQixFQUFFLFdBQW1CLEVBQ3pELFdBQW1CLEVBQUUsT0FBaUIsRUFBRSxLQUFlLEVBQ3ZELGdCQUFnQixHQUFHLElBQUk7UUFQM0Isa0JBQWEsR0FBRyxDQUFDLFNBQVMsRUFBRSxTQUFTLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFRckQsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDekIsTUFBTSxXQUFXLEdBQUcsaUJBQWlCLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sS0FBSyxHQUFHLGlCQUFpQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM5QyxJQUFJLGFBQWEsR0FBRyxFQUFFLENBQUM7UUFDdkIsSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO1lBQ3JCLGFBQWEsR0FBRyxHQUFHLENBQUM7U0FDckI7YUFBTSxJQUFJLFdBQVcsS0FBSyxDQUFDLEVBQUU7WUFDNUIsYUFBYSxHQUFHLE1BQU0sQ0FBQztTQUN4QjtRQUNELE1BQU0sY0FBYyxHQUFHLGNBQWMsYUFBYSxHQUFHLENBQUM7UUFFdEQsSUFBSSxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksV0FBVyxLQUFLLENBQUMsRUFBRTtZQUNyQixhQUFhLEdBQUcsR0FBRyxDQUFDO1NBQ3JCO2FBQU0sSUFBSSxXQUFXLEtBQUssQ0FBQyxFQUFFO1lBQzVCLGFBQWEsR0FBRyxjQUFjLENBQUM7U0FDaEM7UUFDRCxNQUFNLGNBQWMsR0FBRyxjQUFjLGFBQWEsR0FBRyxDQUFDO1FBRXRELE1BQU0sWUFBWSxHQUFHLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLEdBQUc7VUFDVixXQUFXLGNBQWMsV0FBVyxJQUFJLE9BQU87OztZQUc3QyxLQUFLOzs7Z0NBR2UsVUFBVTs7a0NBRVIsUUFBUTtrQ0FDUixjQUFjOzBDQUNOLFlBQVk7Ozt1QkFHL0IsY0FBYzs7Ozs7O09BTTlCLENBQUM7SUFDTixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuaW1wb3J0IHtnZXRDb29yZHNEYXRhVHlwZX0gZnJvbSAnLi9zaGFkZXJfY29tcGlsZXInO1xuXG5leHBvcnQgY2xhc3MgU2NhdHRlclByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd1cGRhdGVzJywgJ2luZGljZXMnLCAnZGVmYXVsdFZhbHVlJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICAgIHVwZGF0ZVNpemU6IG51bWJlciwgc2xpY2VEaW06IG51bWJlciwgaW5kaWNlc1Jhbms6IG51bWJlcixcbiAgICAgIHVwZGF0ZXNSYW5rOiBudW1iZXIsIHN0cmlkZXM6IG51bWJlcltdLCBzaGFwZTogbnVtYmVyW10sXG4gICAgICBzdW1taW5nRHVwZUluZGV4ID0gdHJ1ZSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaGFwZTtcbiAgICBjb25zdCBzdHJpZGVzVHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHN0cmlkZXMubGVuZ3RoKTtcbiAgICBjb25zdCBkdHlwZSA9IGdldENvb3Jkc0RhdGFUeXBlKHNoYXBlLmxlbmd0aCk7XG4gICAgbGV0IGluZGljZXNTdHJpbmcgPSAnJztcbiAgICBpZiAoaW5kaWNlc1JhbmsgPT09IDEpIHtcbiAgICAgIGluZGljZXNTdHJpbmcgPSAnaSc7XG4gICAgfSBlbHNlIGlmIChpbmRpY2VzUmFuayA9PT0gMikge1xuICAgICAgaW5kaWNlc1N0cmluZyA9ICdpLCBqJztcbiAgICB9XG4gICAgY29uc3QgaW5kaWNlc1NuaXBwZXQgPSBgZ2V0SW5kaWNlcygke2luZGljZXNTdHJpbmd9KWA7XG5cbiAgICBsZXQgdXBkYXRlc1N0cmluZyA9ICcnO1xuICAgIGlmICh1cGRhdGVzUmFuayA9PT0gMSkge1xuICAgICAgdXBkYXRlc1N0cmluZyA9ICdpJztcbiAgICB9IGVsc2UgaWYgKHVwZGF0ZXNSYW5rID09PSAyKSB7XG4gICAgICB1cGRhdGVzU3RyaW5nID0gJ2ksIGNvb3Jkc1sxXSc7XG4gICAgfVxuICAgIGNvbnN0IHVwZGF0ZXNTbmlwcGV0ID0gYGdldFVwZGF0ZXMoJHt1cGRhdGVzU3RyaW5nfSlgO1xuXG4gICAgY29uc3Qgc3RyaWRlU3RyaW5nID0gc2xpY2VEaW0gPiAxID8gJ3N0cmlkZXNbal0nIDogJ3N0cmlkZXMnO1xuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICR7c3RyaWRlc1R5cGV9IHN0cmlkZXMgPSAke3N0cmlkZXNUeXBlfSgke3N0cmlkZXN9KTtcblxuICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgJHtkdHlwZX0gY29vcmRzID0gZ2V0T3V0cHV0Q29vcmRzKCk7XG4gICAgICAgICAgZmxvYXQgc3VtID0gMC4wO1xuICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTtcbiAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7dXBkYXRlU2l6ZX07IGkrKykge1xuICAgICAgICAgICAgaW50IGZsYXR0ZW5lZEluZGV4ID0gMDtcbiAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgJHtzbGljZURpbX07IGorKykge1xuICAgICAgICAgICAgICBpbnQgaW5kZXggPSByb3VuZCgke2luZGljZXNTbmlwcGV0fSk7XG4gICAgICAgICAgICAgIGZsYXR0ZW5lZEluZGV4ICs9IGluZGV4ICogJHtzdHJpZGVTdHJpbmd9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGZsYXR0ZW5lZEluZGV4ID09IGNvb3Jkc1swXSkge1xuICAgICAgICAgICAgICBzdW0gKz0gJHt1cGRhdGVzU25pcHBldH07XG4gICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgc2V0T3V0cHV0KG1peChnZXREZWZhdWx0VmFsdWUoKSwgc3VtLCBmbG9hdChmb3VuZCkpKTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, ScatterNd } from '@tensorflow/tfjs-core';\nimport { ScatterProgram } from '../scatter_gpu';\nimport { reshape } from './Reshape';\nexport function scatterNd(args) {\n    const { inputs, backend, attrs } = args;\n    const { indices, updates } = inputs;\n    const { shape } = attrs;\n    const { sliceRank, numUpdates, sliceSize, strides, outputSize } = backend_util.calculateShapes(updates, indices, shape);\n    const flattenShape = [outputSize / sliceSize, sliceSize];\n    if (outputSize === 0) {\n        return backend.makeTensorInfo(shape, indices.dtype);\n    }\n    const flattenIndices = reshape({ inputs: { x: indices }, backend, attrs: { shape: [numUpdates, sliceRank] } });\n    const flattenX = reshape({ inputs: { x: updates }, backend, attrs: { shape: [numUpdates, sliceSize] } });\n    const defaultValue = backend.makeTensorInfo([], 'float32', new Float32Array([0])); // scalar(0)\n    const program = new ScatterProgram(numUpdates, sliceRank, flattenIndices.shape.length, flattenX.shape.length, strides, flattenShape);\n    const res = backend.runWebGLProgram(program, [flattenX, flattenIndices, defaultValue], flattenX.dtype);\n    const reshaped = reshape({ inputs: { x: res }, backend, attrs: { shape } });\n    backend.disposeIntermediateTensorInfo(flattenIndices);\n    backend.disposeIntermediateTensorInfo(flattenX);\n    backend.disposeIntermediateTensorInfo(res);\n    backend.disposeIntermediateTensorInfo(defaultValue);\n    return reshaped;\n}\nexport const scatterNdConfig = {\n    kernelName: ScatterNd,\n    backendName: 'webgl',\n    kernelFunc: scatterNd\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2NhdHRlck5kLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NjYXR0ZXJOZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixTQUFTLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHckksT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzlDLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFFbEMsTUFBTSxVQUFVLFNBQVMsQ0FBQyxJQUl6QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsT0FBTyxFQUFFLE9BQU8sRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNsQyxNQUFNLEVBQUMsS0FBSyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBRXRCLE1BQU0sRUFBQyxTQUFTLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFDLEdBQ3pELFlBQVksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUxRCxNQUFNLFlBQVksR0FBRyxDQUFDLFVBQVUsR0FBRyxTQUFTLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFFekQsSUFBSSxVQUFVLEtBQUssQ0FBQyxFQUFFO1FBQ3BCLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO0tBQ3JEO0lBRUQsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUMxQixFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxPQUFPLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBQzlFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FDcEIsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsRUFBRSxTQUFTLENBQUMsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUU5RSxNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsY0FBYyxDQUN2QyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUUsWUFBWTtJQUN4RCxNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FDOUIsVUFBVSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFDekUsT0FBTyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQzNCLE1BQU0sR0FBRyxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQy9CLE9BQU8sRUFBRSxDQUFDLFFBQVEsRUFBRSxjQUFjLEVBQUUsWUFBWSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXZFLE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxHQUFHLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXRFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsNkJBQTZCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsT0FBTyxDQUFDLDZCQUE2QixDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUVwRCxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sZUFBZSxHQUFpQjtJQUMzQyxVQUFVLEVBQUUsU0FBUztJQUNyQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsU0FBNkI7Q0FDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2NhdHRlck5kLCBTY2F0dGVyTmRBdHRycywgU2NhdHRlck5kSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtTY2F0dGVyUHJvZ3JhbX0gZnJvbSAnLi4vc2NhdHRlcl9ncHUnO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2NhdHRlck5kKGFyZ3M6IHtcbiAgaW5wdXRzOiBTY2F0dGVyTmRJbnB1dHMsXG4gIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsXG4gIGF0dHJzOiBTY2F0dGVyTmRBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdXBkYXRlc30gPSBpbnB1dHM7XG4gIGNvbnN0IHtzaGFwZX0gPSBhdHRycztcblxuICBjb25zdCB7c2xpY2VSYW5rLCBudW1VcGRhdGVzLCBzbGljZVNpemUsIHN0cmlkZXMsIG91dHB1dFNpemV9ID1cbiAgICAgIGJhY2tlbmRfdXRpbC5jYWxjdWxhdGVTaGFwZXModXBkYXRlcywgaW5kaWNlcywgc2hhcGUpO1xuXG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9IFtvdXRwdXRTaXplIC8gc2xpY2VTaXplLCBzbGljZVNpemVdO1xuXG4gIGlmIChvdXRwdXRTaXplID09PSAwKSB7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8oc2hhcGUsIGluZGljZXMuZHR5cGUpO1xuICB9XG5cbiAgY29uc3QgZmxhdHRlbkluZGljZXMgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IGluZGljZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VSYW5rXX19KTtcbiAgY29uc3QgZmxhdHRlblggPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHVwZGF0ZXN9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBbbnVtVXBkYXRlcywgc2xpY2VTaXplXX19KTtcblxuICBjb25zdCBkZWZhdWx0VmFsdWUgPSBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgW10sICdmbG9hdDMyJywgbmV3IEZsb2F0MzJBcnJheShbMF0pKTsgIC8vIHNjYWxhcigwKVxuICBjb25zdCBwcm9ncmFtID0gbmV3IFNjYXR0ZXJQcm9ncmFtKFxuICAgICAgbnVtVXBkYXRlcywgc2xpY2VSYW5rLCBmbGF0dGVuSW5kaWNlcy5zaGFwZS5sZW5ndGgsIGZsYXR0ZW5YLnNoYXBlLmxlbmd0aCxcbiAgICAgIHN0cmlkZXMsIGZsYXR0ZW5TaGFwZSk7XG4gIGNvbnN0IHJlcyA9IGJhY2tlbmQucnVuV2ViR0xQcm9ncmFtKFxuICAgICAgcHJvZ3JhbSwgW2ZsYXR0ZW5YLCBmbGF0dGVuSW5kaWNlcywgZGVmYXVsdFZhbHVlXSwgZmxhdHRlblguZHR5cGUpO1xuXG4gIGNvbnN0IHJlc2hhcGVkID0gcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZX19KTtcblxuICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKGZsYXR0ZW5JbmRpY2VzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhmbGF0dGVuWCk7XG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzKTtcbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhkZWZhdWx0VmFsdWUpO1xuXG4gIHJldHVybiByZXNoYXBlZDtcbn1cblxuZXhwb3J0IGNvbnN0IHNjYXR0ZXJOZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTY2F0dGVyTmQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzY2F0dGVyTmQgYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env } from '@tensorflow/tfjs-core';\nexport class SearchSortedProgram {\n    constructor(batchSize, numInputs, numValues, side) {\n        this.variableNames = ['sortedSequence', 'values'];\n        this.customUniforms = [{ name: 'numInputs', type: 'int' }];\n        this.outputShape = [batchSize, numValues];\n        const webGL2LoopHead = 'while (left < right) {';\n        // WebGL1 doesn't accept non constant loop conditions, so upper bound loop\n        // iterations.\n        const webGL1LoopHead = `for (int i = 0; i < ${Math.ceil(Math.log2(numInputs + 1))}; ++i) { if (left >= right) break;`;\n        const loopHead = env().getNumber('WEBGL_VERSION') === 2 ? webGL2LoopHead :\n            webGL1LoopHead;\n        // left corresponds to lower bound and right to upper bound.\n        const boundComparator = side === 'left' ? '<' : '<=';\n        this.userCode = `\n       int findBound(int batch, float value) {\n         int left = 0;\n         int right = numInputs;\n         int mid;\n         ${loopHead}\n           mid = (left + right) / 2;\n           if (getSortedSequence(batch, mid) ${boundComparator} value) {\n             left = mid + 1;\n           } else {\n             right = mid;\n           }\n         }\n         return right;\n       }\n\n       void main() {\n         ivec2 coords = getOutputCoords();\n         int batch = coords[0];\n         int valueIndex = coords[1];\n\n         float value = getValues(batch, valueIndex);\n\n         setOutput(float(findBound(batch, value)));\n       }\n     `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoX3NvcnRlZF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3NlYXJjaF9zb3J0ZWRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkxQyxNQUFNLE9BQU8sbUJBQW1CO0lBTTlCLFlBQ0ksU0FBaUIsRUFBRSxTQUFpQixFQUFFLFNBQWlCLEVBQ3ZELElBQW9CO1FBUHhCLGtCQUFhLEdBQUcsQ0FBQyxnQkFBZ0IsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUc3QyxtQkFBYyxHQUFHLENBQUMsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFvQixFQUFDLENBQUMsQ0FBQztRQUtqRSxJQUFJLENBQUMsV0FBVyxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBRTFDLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDO1FBQ2hELDBFQUEwRTtRQUMxRSxjQUFjO1FBQ2QsTUFBTSxjQUFjLEdBQUcsdUJBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsb0NBQW9DLENBQUM7UUFDNUUsTUFBTSxRQUFRLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUM7WUFDaEIsY0FBYyxDQUFDO1FBRXpFLDREQUE0RDtRQUM1RCxNQUFNLGVBQWUsR0FBRyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztRQUNyRCxJQUFJLENBQUMsUUFBUSxHQUFHOzs7OztXQUtULFFBQVE7OytDQUU0QixlQUFlOzs7Ozs7Ozs7Ozs7Ozs7Ozs7TUFrQnhELENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMiBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7ZW52fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5pbXBvcnQge1VuaWZvcm1UeXBlfSBmcm9tICcuL3NoYWRlcl9jb21waWxlcic7XG5cbmV4cG9ydCBjbGFzcyBTZWFyY2hTb3J0ZWRQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnc29ydGVkU2VxdWVuY2UnLCAndmFsdWVzJ107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcbiAgY3VzdG9tVW5pZm9ybXMgPSBbe25hbWU6ICdudW1JbnB1dHMnLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX1dO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgICAgYmF0Y2hTaXplOiBudW1iZXIsIG51bUlucHV0czogbnVtYmVyLCBudW1WYWx1ZXM6IG51bWJlcixcbiAgICAgIHNpZGU6ICdsZWZ0J3wncmlnaHQnKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IFtiYXRjaFNpemUsIG51bVZhbHVlc107XG5cbiAgICBjb25zdCB3ZWJHTDJMb29wSGVhZCA9ICd3aGlsZSAobGVmdCA8IHJpZ2h0KSB7JztcbiAgICAvLyBXZWJHTDEgZG9lc24ndCBhY2NlcHQgbm9uIGNvbnN0YW50IGxvb3AgY29uZGl0aW9ucywgc28gdXBwZXIgYm91bmQgbG9vcFxuICAgIC8vIGl0ZXJhdGlvbnMuXG4gICAgY29uc3Qgd2ViR0wxTG9vcEhlYWQgPSBgZm9yIChpbnQgaSA9IDA7IGkgPCAke1xuICAgICAgICBNYXRoLmNlaWwoTWF0aC5sb2cyKG51bUlucHV0cyArIDEpKX07ICsraSkgeyBpZiAobGVmdCA+PSByaWdodCkgYnJlYWs7YDtcbiAgICBjb25zdCBsb29wSGVhZCA9IGVudigpLmdldE51bWJlcignV0VCR0xfVkVSU0lPTicpID09PSAyID8gd2ViR0wyTG9vcEhlYWQgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWJHTDFMb29wSGVhZDtcblxuICAgIC8vIGxlZnQgY29ycmVzcG9uZHMgdG8gbG93ZXIgYm91bmQgYW5kIHJpZ2h0IHRvIHVwcGVyIGJvdW5kLlxuICAgIGNvbnN0IGJvdW5kQ29tcGFyYXRvciA9IHNpZGUgPT09ICdsZWZ0JyA/ICc8JyA6ICc8PSc7XG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgICBpbnQgZmluZEJvdW5kKGludCBiYXRjaCwgZmxvYXQgdmFsdWUpIHtcbiAgICAgICAgIGludCBsZWZ0ID0gMDtcbiAgICAgICAgIGludCByaWdodCA9IG51bUlucHV0cztcbiAgICAgICAgIGludCBtaWQ7XG4gICAgICAgICAke2xvb3BIZWFkfVxuICAgICAgICAgICBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7XG4gICAgICAgICAgIGlmIChnZXRTb3J0ZWRTZXF1ZW5jZShiYXRjaCwgbWlkKSAke2JvdW5kQ29tcGFyYXRvcn0gdmFsdWUpIHtcbiAgICAgICAgICAgICBsZWZ0ID0gbWlkICsgMTtcbiAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICByaWdodCA9IG1pZDtcbiAgICAgICAgICAgfVxuICAgICAgICAgfVxuICAgICAgICAgcmV0dXJuIHJpZ2h0O1xuICAgICAgIH1cblxuICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgaW50IHZhbHVlSW5kZXggPSBjb29yZHNbMV07XG5cbiAgICAgICAgIGZsb2F0IHZhbHVlID0gZ2V0VmFsdWVzKGJhdGNoLCB2YWx1ZUluZGV4KTtcblxuICAgICAgICAgc2V0T3V0cHV0KGZsb2F0KGZpbmRCb3VuZChiYXRjaCwgdmFsdWUpKSk7XG4gICAgICAgfVxuICAgICBgO1xuICB9XG59XG4iXX0=","/**\n * @license\n * Copyright 2022 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SearchSorted } from '@tensorflow/tfjs-core';\nimport { SearchSortedProgram } from '../search_sorted_gpu';\nexport function searchSorted(args) {\n    const { inputs, backend, attrs } = args;\n    const { sortedSequence, values } = inputs;\n    const { side } = attrs;\n    const program = new SearchSortedProgram(sortedSequence.shape[0], sortedSequence.shape[1], values.shape[1], side);\n    const customValues = [[sortedSequence.shape[1]]];\n    return backend.runWebGLProgram(program, [sortedSequence, values], 'int32', customValues);\n}\nexport const searchSortedConfig = {\n    kernelName: SearchSorted,\n    backendName: 'webgl',\n    kernelFunc: searchSorted,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VhcmNoU29ydGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NlYXJjaFNvcnRlZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFlBQVksRUFBb0QsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBSTVCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxjQUFjLEVBQUUsTUFBTSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hDLE1BQU0sRUFBQyxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFckIsTUFBTSxPQUFPLEdBQUcsSUFBSSxtQkFBbUIsQ0FDbkMsY0FBYyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxjQUFjLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDN0UsTUFBTSxZQUFZLEdBQUcsQ0FBQyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FDMUIsT0FBTyxFQUFFLENBQUMsY0FBYyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCO0lBQzlDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxZQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjIgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2VhcmNoU29ydGVkLCBTZWFyY2hTb3J0ZWRBdHRycywgU2VhcmNoU29ydGVkSW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtTZWFyY2hTb3J0ZWRQcm9ncmFtfSBmcm9tICcuLi9zZWFyY2hfc29ydGVkX2dwdSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzZWFyY2hTb3J0ZWQoYXJnczoge1xuICBpbnB1dHM6IFNlYXJjaFNvcnRlZElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFNlYXJjaFNvcnRlZEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtzb3J0ZWRTZXF1ZW5jZSwgdmFsdWVzfSA9IGlucHV0cztcbiAgY29uc3Qge3NpZGV9ID0gYXR0cnM7XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTZWFyY2hTb3J0ZWRQcm9ncmFtKFxuICAgICAgc29ydGVkU2VxdWVuY2Uuc2hhcGVbMF0sIHNvcnRlZFNlcXVlbmNlLnNoYXBlWzFdLCB2YWx1ZXMuc2hhcGVbMV0sIHNpZGUpO1xuICBjb25zdCBjdXN0b21WYWx1ZXMgPSBbW3NvcnRlZFNlcXVlbmNlLnNoYXBlWzFdXV07XG4gIHJldHVybiBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtzb3J0ZWRTZXF1ZW5jZSwgdmFsdWVzXSwgJ2ludDMyJywgY3VzdG9tVmFsdWVzKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNlYXJjaFNvcnRlZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTZWFyY2hTb3J0ZWQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzZWFyY2hTb3J0ZWQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class SelectProgram {\n    constructor(cRank, shape, rank) {\n        this.variableNames = ['c', 'a', 'b'];\n        this.outputShape = shape;\n        let cCoords;\n        let abCoords;\n        if (rank > 4) {\n            throw Error(`Where for rank ${rank} is not yet supported`);\n        }\n        if (rank === 1) {\n            abCoords = `resRC`;\n            cCoords = `resRC`;\n        }\n        else {\n            const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w'];\n            const cCoordVars = [];\n            const abCoordVars = [];\n            for (let i = 0; i < shape.length; i++) {\n                abCoordVars.push(`${currentCoords[i]}`);\n                if (i < cRank) {\n                    cCoordVars.push(`${currentCoords[i]}`);\n                }\n            }\n            cCoords = cCoordVars.join();\n            abCoords = abCoordVars.join();\n        }\n        const dtype = getCoordsDataType(rank);\n        this.userCode = `\n      void main() {\n        ${dtype} resRC = getOutputCoords();\n        float cVal = getC(${cCoords});\n        if (cVal >= 1.0) {\n          setOutput(getA(${abCoords}));\n        } else {\n          setOutput(getB(${abCoords}));\n        }\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0X2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvc2VsZWN0X2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFHSCxPQUFPLEVBQUMsaUJBQWlCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUVwRCxNQUFNLE9BQU8sYUFBYTtJQUt4QixZQUFZLEtBQWEsRUFBRSxLQUFlLEVBQUUsSUFBWTtRQUp4RCxrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztRQUs5QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLE9BQU8sQ0FBQztRQUNaLElBQUksUUFBUSxDQUFDO1FBQ2IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1lBQ1osTUFBTSxLQUFLLENBQUMsa0JBQWtCLElBQUksdUJBQXVCLENBQUMsQ0FBQztTQUM1RDtRQUVELElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLFFBQVEsR0FBRyxPQUFPLENBQUM7WUFDbkIsT0FBTyxHQUFHLE9BQU8sQ0FBQztTQUNuQjthQUFNO1lBQ0wsTUFBTSxhQUFhLEdBQUcsQ0FBQyxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztZQUNuRSxNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7WUFDdEIsTUFBTSxXQUFXLEdBQUcsRUFBRSxDQUFDO1lBQ3ZCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO2dCQUNyQyxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztnQkFDeEMsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFO29CQUNiLFVBQVUsQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUN4QzthQUNGO1lBQ0QsT0FBTyxHQUFHLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUM1QixRQUFRLEdBQUcsV0FBVyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQy9CO1FBRUQsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDLFFBQVEsR0FBRzs7VUFFVixLQUFLOzRCQUNhLE9BQU87OzJCQUVSLFFBQVE7OzJCQUVSLFFBQVE7OztLQUc5QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFNlbGVjdFByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWydjJywgJ2EnLCAnYiddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoY1Jhbms6IG51bWJlciwgc2hhcGU6IG51bWJlcltdLCByYW5rOiBudW1iZXIpIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICBsZXQgY0Nvb3JkcztcbiAgICBsZXQgYWJDb29yZHM7XG4gICAgaWYgKHJhbmsgPiA0KSB7XG4gICAgICB0aHJvdyBFcnJvcihgV2hlcmUgZm9yIHJhbmsgJHtyYW5rfSBpcyBub3QgeWV0IHN1cHBvcnRlZGApO1xuICAgIH1cblxuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICBhYkNvb3JkcyA9IGByZXNSQ2A7XG4gICAgICBjQ29vcmRzID0gYHJlc1JDYDtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudyddO1xuICAgICAgY29uc3QgY0Nvb3JkVmFycyA9IFtdO1xuICAgICAgY29uc3QgYWJDb29yZFZhcnMgPSBbXTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhcGUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYWJDb29yZFZhcnMucHVzaChgJHtjdXJyZW50Q29vcmRzW2ldfWApO1xuICAgICAgICBpZiAoaSA8IGNSYW5rKSB7XG4gICAgICAgICAgY0Nvb3JkVmFycy5wdXNoKGAke2N1cnJlbnRDb29yZHNbaV19YCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNDb29yZHMgPSBjQ29vcmRWYXJzLmpvaW4oKTtcbiAgICAgIGFiQ29vcmRzID0gYWJDb29yZFZhcnMuam9pbigpO1xuICAgIH1cblxuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUocmFuayk7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSByZXNSQyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICBmbG9hdCBjVmFsID0gZ2V0Qygke2NDb29yZHN9KTtcbiAgICAgICAgaWYgKGNWYWwgPj0gMS4wKSB7XG4gICAgICAgICAgc2V0T3V0cHV0KGdldEEoJHthYkNvb3Jkc30pKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzZXRPdXRwdXQoZ2V0Qigke2FiQ29vcmRzfSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Select, upcastType } from '@tensorflow/tfjs-core';\nimport { SelectProgram } from '../select_gpu';\nexport function select(args) {\n    const { inputs, backend } = args;\n    const { condition, t, e } = inputs;\n    const program = new SelectProgram(condition.shape.length, t.shape, t.shape.length);\n    return backend.runWebGLProgram(program, [condition, t, e], upcastType(t.dtype, e.dtype));\n}\nexport const selectConfig = {\n    kernelName: Select,\n    backendName: 'webgl',\n    kernelFunc: select\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsZWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NlbGVjdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLE1BQU0sRUFBNEIsVUFBVSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHN0csT0FBTyxFQUFDLGFBQWEsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUU1QyxNQUFNLFVBQVUsTUFBTSxDQUFDLElBQXVEO0lBRTVFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUVqQyxNQUFNLE9BQU8sR0FDVCxJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDdkUsT0FBTyxPQUFPLENBQUMsZUFBZSxDQUMxQixPQUFPLEVBQUUsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUFFLFVBQVUsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU2VsZWN0LCBTZWxlY3RJbnB1dHMsIFRlbnNvckluZm8sIHVwY2FzdFR5cGV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge1NlbGVjdFByb2dyYW19IGZyb20gJy4uL3NlbGVjdF9ncHUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc2VsZWN0KGFyZ3M6IHtpbnB1dHM6IFNlbGVjdElucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtjb25kaXRpb24sIHQsIGV9ID0gaW5wdXRzO1xuXG4gIGNvbnN0IHByb2dyYW0gPVxuICAgICAgbmV3IFNlbGVjdFByb2dyYW0oY29uZGl0aW9uLnNoYXBlLmxlbmd0aCwgdC5zaGFwZSwgdC5zaGFwZS5sZW5ndGgpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0oXG4gICAgICBwcm9ncmFtLCBbY29uZGl0aW9uLCB0LCBlXSwgdXBjYXN0VHlwZSh0LmR0eXBlLCBlLmR0eXBlKSk7XG59XG5cbmV4cG9ydCBjb25zdCBzZWxlY3RDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2VsZWN0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc2VsZWN0IGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, Selu } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SELU = `\n  // Stable and Attracting Fixed Point (0, 1) for Normalized Weights.\n  // see: https://arxiv.org/abs/1706.02515\n  float scaleAlpha = ${backend_util.SELU_SCALEALPHA};\n  float scale = ${backend_util.SELU_SCALE};\n  return (x >= 0.0) ? scale * x : scaleAlpha * (exp(x) - 1.0);\n`;\nexport const selu = unaryKernelFunc({ opSnippet: SELU });\nexport const seluConfig = {\n    kernelName: Selu,\n    backendName: 'webgl',\n    kernelFunc: selu,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2VsdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TZWx1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWdCLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRXZFLE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLElBQUksR0FBRzs7O3VCQUdVLFlBQVksQ0FBQyxlQUFlO2tCQUNqQyxZQUFZLENBQUMsVUFBVTs7Q0FFeEMsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLElBQUksR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUFJO0NBQ2pCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7YmFja2VuZF91dGlsLCBLZXJuZWxDb25maWcsIFNlbHV9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU0VMVSA9IGBcbiAgLy8gU3RhYmxlIGFuZCBBdHRyYWN0aW5nIEZpeGVkIFBvaW50ICgwLCAxKSBmb3IgTm9ybWFsaXplZCBXZWlnaHRzLlxuICAvLyBzZWU6IGh0dHBzOi8vYXJ4aXYub3JnL2Ficy8xNzA2LjAyNTE1XG4gIGZsb2F0IHNjYWxlQWxwaGEgPSAke2JhY2tlbmRfdXRpbC5TRUxVX1NDQUxFQUxQSEF9O1xuICBmbG9hdCBzY2FsZSA9ICR7YmFja2VuZF91dGlsLlNFTFVfU0NBTEV9O1xuICByZXR1cm4gKHggPj0gMC4wKSA/IHNjYWxlICogeCA6IHNjYWxlQWxwaGEgKiAoZXhwKHgpIC0gMS4wKTtcbmA7XG5cbmV4cG9ydCBjb25zdCBzZWx1ID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNFTFV9KTtcblxuZXhwb3J0IGNvbnN0IHNlbHVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2VsdSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNlbHUsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sigmoid } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { sigmoidImplCPU } from '../kernel_utils/shared';\nconst SIGMOID = CHECK_NAN_SNIPPET_UNARY + `\n  return 1.0 / (1.0 + exp(-1.0 * x));\n`;\nconst SIGMOID_PACKED = `\n  vec4 result = 1.0 / (1.0 + exp(-1.0 * x));\n  bvec4 isNaN = isnan(x);\n\n  result.r = isNaN.r ? x.r : result.r;\n  result.g = isNaN.g ? x.g : result.g;\n  result.b = isNaN.b ? x.b : result.b;\n  result.a = isNaN.a ? x.a : result.a;\n\n  return result;\n`;\nexport const sigmoid = unaryKernelFunc({\n    opSnippet: SIGMOID,\n    packedOpSnippet: SIGMOID_PACKED,\n    cpuKernelImpl: sigmoidImplCPU\n});\nexport const sigmoidConfig = {\n    kernelName: Sigmoid,\n    backendName: 'webgl',\n    kernelFunc: sigmoid,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbW9pZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TaWdtb2lkLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxPQUFPLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUU1RCxPQUFPLEVBQUMsdUJBQXVCLEVBQUUsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBRXRELE1BQU0sT0FBTyxHQUFHLHVCQUF1QixHQUFHOztDQUV6QyxDQUFDO0FBRUYsTUFBTSxjQUFjLEdBQUc7Ozs7Ozs7Ozs7Q0FVdEIsQ0FBQztBQUNGLE1BQU0sQ0FBQyxNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUM7SUFDckMsU0FBUyxFQUFFLE9BQU87SUFDbEIsZUFBZSxFQUFFLGNBQWM7SUFDL0IsYUFBYSxFQUFFLGNBQWM7Q0FDOUIsQ0FBQyxDQUFDO0FBRUgsTUFBTSxDQUFDLE1BQU0sYUFBYSxHQUFpQjtJQUN6QyxVQUFVLEVBQUUsT0FBTztJQUNuQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsT0FBTztDQUNwQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU2lnbW9pZH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVF9VTkFSWSwgdW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcbmltcG9ydCB7c2lnbW9pZEltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5jb25zdCBTSUdNT0lEID0gQ0hFQ0tfTkFOX1NOSVBQRVRfVU5BUlkgKyBgXG4gIHJldHVybiAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7XG5gO1xuXG5jb25zdCBTSUdNT0lEX1BBQ0tFRCA9IGBcbiAgdmVjNCByZXN1bHQgPSAxLjAgLyAoMS4wICsgZXhwKC0xLjAgKiB4KSk7XG4gIGJ2ZWM0IGlzTmFOID0gaXNuYW4oeCk7XG5cbiAgcmVzdWx0LnIgPSBpc05hTi5yID8geC5yIDogcmVzdWx0LnI7XG4gIHJlc3VsdC5nID0gaXNOYU4uZyA/IHguZyA6IHJlc3VsdC5nO1xuICByZXN1bHQuYiA9IGlzTmFOLmIgPyB4LmIgOiByZXN1bHQuYjtcbiAgcmVzdWx0LmEgPSBpc05hTi5hID8geC5hIDogcmVzdWx0LmE7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbmA7XG5leHBvcnQgY29uc3Qgc2lnbW9pZCA9IHVuYXJ5S2VybmVsRnVuYyh7XG4gIG9wU25pcHBldDogU0lHTU9JRCxcbiAgcGFja2VkT3BTbmlwcGV0OiBTSUdNT0lEX1BBQ0tFRCxcbiAgY3B1S2VybmVsSW1wbDogc2lnbW9pZEltcGxDUFVcbn0pO1xuXG5leHBvcnQgY29uc3Qgc2lnbW9pZENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTaWdtb2lkLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc2lnbW9pZCxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sign } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\n// Sign does not propagate NANs.\nconst SIGN = `\n  if (isnan(x)) { return 0.0; }\n  return sign(x);\n`;\nexport const sign = unaryKernelFunc({ opSnippet: SIGN });\nexport const signConfig = {\n    kernelName: Sign,\n    backendName: 'webgl',\n    kernelFunc: sign,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2lnbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TaWduLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUV6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsZ0NBQWdDO0FBQ2hDLE1BQU0sSUFBSSxHQUFHOzs7Q0FHWixDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUMsQ0FBQyxDQUFDO0FBRXZELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQUk7Q0FDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNpZ259IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuLy8gU2lnbiBkb2VzIG5vdCBwcm9wYWdhdGUgTkFOcy5cbmNvbnN0IFNJR04gPSBgXG4gIGlmIChpc25hbih4KSkgeyByZXR1cm4gMC4wOyB9XG4gIHJldHVybiBzaWduKHgpO1xuYDtcblxuZXhwb3J0IGNvbnN0IHNpZ24gPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogU0lHTn0pO1xuXG5leHBvcnQgY29uc3Qgc2lnbkNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTaWduLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc2lnbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sin } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET_UNARY, unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SIN = CHECK_NAN_SNIPPET_UNARY + `\n  return sin(x);\n`;\nexport const sin = unaryKernelFunc({ opSnippet: SIN });\nexport const sinConfig = {\n    kernelName: Sin,\n    backendName: 'webgl',\n    kernelFunc: sin,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Npbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLHVCQUF1QixFQUFFLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRTVGLE1BQU0sR0FBRyxHQUFHLHVCQUF1QixHQUFHOztDQUVyQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sR0FBRyxHQUFHLGVBQWUsQ0FBQyxFQUFDLFNBQVMsRUFBRSxHQUFHLEVBQUMsQ0FBQyxDQUFDO0FBRXJELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBaUI7SUFDckMsVUFBVSxFQUFFLEdBQUc7SUFDZixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsR0FBRztDQUNoQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU2lufSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge0NIRUNLX05BTl9TTklQUEVUX1VOQVJZLCB1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBTSU4gPSBDSEVDS19OQU5fU05JUFBFVF9VTkFSWSArIGBcbiAgcmV0dXJuIHNpbih4KTtcbmA7XG5cbmV4cG9ydCBjb25zdCBzaW4gPSB1bmFyeUtlcm5lbEZ1bmMoe29wU25pcHBldDogU0lOfSk7XG5cbmV4cG9ydCBjb25zdCBzaW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU2luLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc2luLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sinh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SINH = `\n  float e2x = exp(x);\n  return (e2x - 1.0 / e2x) / 2.0;\n`;\nexport const sinh = unaryKernelFunc({ opSnippet: SINH });\nexport const sinhConfig = {\n    kernelName: Sinh,\n    backendName: 'webgl',\n    kernelFunc: sinh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2luaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TaW5oLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxJQUFJLEdBQUc7OztDQUdaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU2luaH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU0lOSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKHgpO1xuICByZXR1cm4gKGUyeCAtIDEuMCAvIGUyeCkgLyAyLjA7XG5gO1xuXG5leHBvcnQgY29uc3Qgc2luaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTSU5IfSk7XG5cbmV4cG9ydCBjb25zdCBzaW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNpbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzaW5oLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Softplus } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SOFTPLUS = `\n  float epsilon = 1.1920928955078125e-7;\n  float threshold = log(epsilon) + 2.0;\n\n  bool too_large = x > -threshold;\n  bool too_small = x < threshold;\n\n  float result;\n  float exp_x = exp(x);\n\n  if (too_large){\n    result = x;\n  }\n  else if (too_small){\n    result = exp_x;\n  }\n  else{\n    result = log(exp_x + 1.0);\n  }\n  return result;\n`;\nexport const softplus = unaryKernelFunc({ opSnippet: SOFTPLUS });\nexport const softplusConfig = {\n    kernelName: Softplus,\n    backendName: 'webgl',\n    kernelFunc: softplus,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU29mdHBsdXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU29mdHBsdXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLFFBQVEsRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBQzdELE9BQU8sRUFBQyxlQUFlLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUVuRSxNQUFNLFFBQVEsR0FBRzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Q0FvQmhCLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxRQUFRLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLFFBQVEsRUFBQyxDQUFDLENBQUM7QUFFL0QsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFpQjtJQUMxQyxVQUFVLEVBQUUsUUFBUTtJQUNwQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsUUFBUTtDQUNyQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU29mdHBsdXN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IFNPRlRQTFVTID0gYFxuICBmbG9hdCBlcHNpbG9uID0gMS4xOTIwOTI4OTU1MDc4MTI1ZS03O1xuICBmbG9hdCB0aHJlc2hvbGQgPSBsb2coZXBzaWxvbikgKyAyLjA7XG5cbiAgYm9vbCB0b29fbGFyZ2UgPSB4ID4gLXRocmVzaG9sZDtcbiAgYm9vbCB0b29fc21hbGwgPSB4IDwgdGhyZXNob2xkO1xuXG4gIGZsb2F0IHJlc3VsdDtcbiAgZmxvYXQgZXhwX3ggPSBleHAoeCk7XG5cbiAgaWYgKHRvb19sYXJnZSl7XG4gICAgcmVzdWx0ID0geDtcbiAgfVxuICBlbHNlIGlmICh0b29fc21hbGwpe1xuICAgIHJlc3VsdCA9IGV4cF94O1xuICB9XG4gIGVsc2V7XG4gICAgcmVzdWx0ID0gbG9nKGV4cF94ICsgMS4wKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xuYDtcblxuZXhwb3J0IGNvbnN0IHNvZnRwbHVzID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFNPRlRQTFVTfSk7XG5cbmV4cG9ydCBjb25zdCBzb2Z0cGx1c0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTb2Z0cGx1cyxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNvZnRwbHVzLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SpaceToBatchND, util } from '@tensorflow/tfjs-core';\nimport { padV2 } from './PadV2';\nimport { reshape } from './Reshape';\nimport { transpose } from './Transpose';\nexport const spaceToBatchND = (args) => {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { blockShape, paddings } = attrs;\n    util.assert(x.shape.length <= 4, () => 'spaceToBatchND for rank > 4 with a WebGL backend not ' +\n        'implemented yet');\n    const prod = blockShape.reduce((a, b) => a * b);\n    const completePaddings = [[0, 0]];\n    completePaddings.push(...paddings);\n    for (let i = 1 + blockShape.length; i < x.shape.length; ++i) {\n        completePaddings.push([0, 0]);\n    }\n    const toDispose = [];\n    const paddedX = padV2({\n        inputs: { x },\n        backend,\n        attrs: { paddings: completePaddings, constantValue: 0 }\n    });\n    const reshapedPaddedShape = backend_util.getReshaped(paddedX.shape, blockShape, prod, false);\n    const permutedReshapedPaddedPermutation = backend_util.getPermuted(reshapedPaddedShape.length, blockShape.length, false);\n    const flattenShape = backend_util.getReshapedPermuted(paddedX.shape, blockShape, prod, false);\n    const reshapedPaddedX = reshape({ inputs: { x: paddedX }, backend, attrs: { shape: reshapedPaddedShape } });\n    const paddedXT = transpose({\n        inputs: { x: reshapedPaddedX },\n        backend,\n        attrs: { perm: permutedReshapedPaddedPermutation }\n    });\n    const result = reshape({ inputs: { x: paddedXT }, backend, attrs: { shape: flattenShape } });\n    toDispose.push(paddedX);\n    toDispose.push(reshapedPaddedX);\n    toDispose.push(paddedXT);\n    toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return result;\n};\nexport const spaceToBatchNDConfig = {\n    kernelName: SpaceToBatchND,\n    backendName: 'webgl',\n    kernelFunc: spaceToBatchND\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhY2VUb0JhdGNoTkQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3BhY2VUb0JhdGNoTkQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFDLFlBQVksRUFBNEIsY0FBYyxFQUF5RCxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUkxSixPQUFPLEVBQUMsS0FBSyxFQUFDLE1BQU0sU0FBUyxDQUFDO0FBQzlCLE9BQU8sRUFBQyxPQUFPLEVBQUMsTUFBTSxXQUFXLENBQUM7QUFDbEMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQUV0QyxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxJQUk5QixFQUFjLEVBQUU7SUFDZixNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLENBQUMsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUNuQixNQUFNLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQyxJQUFJLENBQUMsTUFBTSxDQUNQLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFDbkIsR0FBRyxFQUFFLENBQUMsdURBQXVEO1FBQ3pELGlCQUFpQixDQUFDLENBQUM7SUFFM0IsTUFBTSxJQUFJLEdBQUcsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztJQUVoRCxNQUFNLGdCQUFnQixHQUE0QixDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDM0QsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLEdBQUcsUUFBbUMsQ0FBQyxDQUFDO0lBQzlELEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxFQUFFO1FBQzNELGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0tBQy9CO0lBRUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUM7UUFDWCxPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsUUFBUSxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxDQUFDLEVBQUM7S0FDdEQsQ0FBQyxDQUFDO0lBRUgsTUFBTSxtQkFBbUIsR0FDckIsWUFBWSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFFckUsTUFBTSxpQ0FBaUMsR0FBRyxZQUFZLENBQUMsV0FBVyxDQUM5RCxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU0sRUFBRSxLQUFLLENBQUMsQ0FBQztJQUUxRCxNQUFNLFlBQVksR0FDZCxZQUFZLENBQUMsbUJBQW1CLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTdFLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FDM0IsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsT0FBTyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBQyxFQUFDLENBQUMsQ0FBQztJQUUxRSxNQUFNLFFBQVEsR0FBRyxTQUFTLENBQUM7UUFDekIsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLGVBQWUsRUFBQztRQUM1QixPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUMsSUFBSSxFQUFFLGlDQUFpQyxFQUFDO0tBQ2pELENBQUMsQ0FBQztJQUVILE1BQU0sTUFBTSxHQUNSLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLFlBQVksRUFBQyxFQUFDLENBQUMsQ0FBQztJQUU1RSxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3hCLFNBQVMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDaEMsU0FBUyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUV6QixTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFFakUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sb0JBQW9CLEdBQWlCO0lBQ2hELFVBQVUsRUFBRSxjQUFjO0lBQzFCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxjQUFrQztDQUMvQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFjZVRvQmF0Y2hORCwgU3BhY2VUb0JhdGNoTkRBdHRycywgU3BhY2VUb0JhdGNoTkRJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7cGFkVjJ9IGZyb20gJy4vUGFkVjInO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHt0cmFuc3Bvc2V9IGZyb20gJy4vVHJhbnNwb3NlJztcblxuZXhwb3J0IGNvbnN0IHNwYWNlVG9CYXRjaE5EID0gKGFyZ3M6IHtcbiAgaW5wdXRzOiBTcGFjZVRvQmF0Y2hORElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFNwYWNlVG9CYXRjaE5EQXR0cnNcbn0pOiBUZW5zb3JJbmZvID0+IHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7YmxvY2tTaGFwZSwgcGFkZGluZ3N9ID0gYXR0cnM7XG5cbiAgdXRpbC5hc3NlcnQoXG4gICAgICB4LnNoYXBlLmxlbmd0aCA8PSA0LFxuICAgICAgKCkgPT4gJ3NwYWNlVG9CYXRjaE5EIGZvciByYW5rID4gNCB3aXRoIGEgV2ViR0wgYmFja2VuZCBub3QgJyArXG4gICAgICAgICAgJ2ltcGxlbWVudGVkIHlldCcpO1xuXG4gIGNvbnN0IHByb2QgPSBibG9ja1NoYXBlLnJlZHVjZSgoYSwgYikgPT4gYSAqIGIpO1xuXG4gIGNvbnN0IGNvbXBsZXRlUGFkZGluZ3M6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+ID0gW1swLCAwXV07XG4gIGNvbXBsZXRlUGFkZGluZ3MucHVzaCguLi5wYWRkaW5ncyBhcyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPik7XG4gIGZvciAobGV0IGkgPSAxICsgYmxvY2tTaGFwZS5sZW5ndGg7IGkgPCB4LnNoYXBlLmxlbmd0aDsgKytpKSB7XG4gICAgY29tcGxldGVQYWRkaW5ncy5wdXNoKFswLCAwXSk7XG4gIH1cblxuICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcblxuICBjb25zdCBwYWRkZWRYID0gcGFkVjIoe1xuICAgIGlucHV0czoge3h9LFxuICAgIGJhY2tlbmQsXG4gICAgYXR0cnM6IHtwYWRkaW5nczogY29tcGxldGVQYWRkaW5ncywgY29uc3RhbnRWYWx1ZTogMH1cbiAgfSk7XG5cbiAgY29uc3QgcmVzaGFwZWRQYWRkZWRTaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWQocGFkZGVkWC5zaGFwZSwgYmxvY2tTaGFwZSwgcHJvZCwgZmFsc2UpO1xuXG4gIGNvbnN0IHBlcm11dGVkUmVzaGFwZWRQYWRkZWRQZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRQZXJtdXRlZChcbiAgICAgIHJlc2hhcGVkUGFkZGVkU2hhcGUubGVuZ3RoLCBibG9ja1NoYXBlLmxlbmd0aCwgZmFsc2UpO1xuXG4gIGNvbnN0IGZsYXR0ZW5TaGFwZSA9XG4gICAgICBiYWNrZW5kX3V0aWwuZ2V0UmVzaGFwZWRQZXJtdXRlZChwYWRkZWRYLnNoYXBlLCBibG9ja1NoYXBlLCBwcm9kLCBmYWxzZSk7XG5cbiAgY29uc3QgcmVzaGFwZWRQYWRkZWRYID0gcmVzaGFwZShcbiAgICAgIHtpbnB1dHM6IHt4OiBwYWRkZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogcmVzaGFwZWRQYWRkZWRTaGFwZX19KTtcblxuICBjb25zdCBwYWRkZWRYVCA9IHRyYW5zcG9zZSh7XG4gICAgaW5wdXRzOiB7eDogcmVzaGFwZWRQYWRkZWRYfSxcbiAgICBiYWNrZW5kLFxuICAgIGF0dHJzOiB7cGVybTogcGVybXV0ZWRSZXNoYXBlZFBhZGRlZFBlcm11dGF0aW9ufVxuICB9KTtcblxuICBjb25zdCByZXN1bHQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGFkZGVkWFR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBmbGF0dGVuU2hhcGV9fSk7XG5cbiAgdG9EaXNwb3NlLnB1c2gocGFkZGVkWCk7XG4gIHRvRGlzcG9zZS5wdXNoKHJlc2hhcGVkUGFkZGVkWCk7XG4gIHRvRGlzcG9zZS5wdXNoKHBhZGRlZFhUKTtcblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5leHBvcnQgY29uc3Qgc3BhY2VUb0JhdGNoTkRDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhY2VUb0JhdGNoTkQsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcGFjZVRvQmF0Y2hORCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseFillEmptyRows } from '@tensorflow/tfjs-core';\nimport { sparseFillEmptyRowsImplCPU } from '../kernel_utils/shared';\nexport function sparseFillEmptyRows(args) {\n    const { inputs, backend } = args;\n    const { indices, values, denseShape, defaultValue } = inputs;\n    if (denseShape.shape.length !== 1) {\n        throw new Error(`Dense shape must be a vector, saw:\n         ${denseShape.shape}`);\n    }\n    if (indices.shape.length !== 2) {\n        throw new Error(`Indices must be a matrix, saw:\n         ${indices.shape}`);\n    }\n    if (values.shape.length !== 1) {\n        throw new Error(`Values must be a vector, saw:\n         ${values.shape}`);\n    }\n    if (defaultValue.shape.length !== 0) {\n        throw new Error(`Default value must be a scalar, saw:\n        ${defaultValue.shape}`);\n    }\n    const $indices = backend.readSync(indices.dataId);\n    const $values = backend.readSync(values.dataId);\n    const $denseShape = backend.readSync(denseShape.dataId);\n    const $defaultValue = backend.readSync(defaultValue.dataId)[0];\n    const [outputIndices, outputIndicesShape, outputValues, emptyRowIndicator, reverseIndexMap] = sparseFillEmptyRowsImplCPU($indices, indices.shape, indices.dtype, $values, values.dtype, $denseShape, $defaultValue);\n    return [\n        backend.makeTensorInfo(outputIndicesShape, indices.dtype, outputIndices),\n        backend.makeTensorInfo([outputIndicesShape[0]], values.dtype, outputValues),\n        backend.makeTensorInfo([emptyRowIndicator.length], 'bool', new Uint8Array(emptyRowIndicator.map((value) => Number(value)))),\n        backend.makeTensorInfo([reverseIndexMap.length], indices.dtype, new Int32Array(reverseIndexMap)),\n    ];\n}\nexport const sparseFillEmptyRowsConfig = {\n    kernelName: SparseFillEmptyRows,\n    backendName: 'webgl',\n    kernelFunc: sparseFillEmptyRows,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlRmlsbEVtcHR5Um93cy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsbUJBQW1CLEVBQW9ELE1BQU0sdUJBQXVCLENBQUM7QUFHdkksT0FBTyxFQUFDLDBCQUEwQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFbEUsTUFBTSxVQUFVLG1CQUFtQixDQUFDLElBR25DO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLFlBQVksRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDO1dBQ1QsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDNUI7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDO1dBQ1QsT0FBTyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDekI7SUFDRCxJQUFJLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM3QixNQUFNLElBQUksS0FBSyxDQUFDO1dBQ1QsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDeEI7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNuQyxNQUFNLElBQUksS0FBSyxDQUFDO1VBQ1YsWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0I7SUFFRCxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUNoRSxNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUM5RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUN0RSxNQUFNLGFBQWEsR0FDZixPQUFPLENBQUMsUUFBUSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQVcsQ0FBQztJQUV2RCxNQUFNLENBQUMsYUFBYSxFQUFFLGtCQUFrQixFQUFFLFlBQVksRUFDL0MsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEdBQ3RDLDBCQUEwQixDQUN0QixRQUFRLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxFQUM3RCxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7SUFDcEMsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFBRSxhQUFhLENBQUM7UUFDeEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDO1FBQ3hELE9BQU8sQ0FBQyxjQUFjLENBQ2xCLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEVBQUUsTUFBTSxFQUNsQyxJQUFJLFVBQVUsQ0FDVixpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFjLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbEUsT0FBTyxDQUFDLGNBQWMsQ0FDbEIsQ0FBQyxlQUFlLENBQUMsTUFBTSxDQUFDLEVBQUUsT0FBTyxDQUFDLEtBQUssRUFDdkMsSUFBSSxVQUFVLENBQUMsZUFBZSxDQUFDLENBQUM7S0FDckMsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBaUI7SUFDckQsVUFBVSxFQUFFLG1CQUFtQjtJQUMvQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsbUJBQXVDO0NBQ3BELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VGaWxsRW1wdHlSb3dzLCBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzcGFyc2VGaWxsRW1wdHlSb3dzSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VGaWxsRW1wdHlSb3dzKGFyZ3M6IHtcbiAgaW5wdXRzOiBTcGFyc2VGaWxsRW1wdHlSb3dzSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7aW5kaWNlcywgdmFsdWVzLCBkZW5zZVNoYXBlLCBkZWZhdWx0VmFsdWV9ID0gaW5wdXRzO1xuICBpZiAoZGVuc2VTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlbnNlIHNoYXBlIG11c3QgYmUgYSB2ZWN0b3IsIHNhdzpcbiAgICAgICAgICR7ZGVuc2VTaGFwZS5zaGFwZX1gKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDIpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgbXVzdCBiZSBhIG1hdHJpeCwgc2F3OlxuICAgICAgICAgJHtpbmRpY2VzLnNoYXBlfWApO1xuICB9XG4gIGlmICh2YWx1ZXMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBWYWx1ZXMgbXVzdCBiZSBhIHZlY3Rvciwgc2F3OlxuICAgICAgICAgJHt2YWx1ZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlZmF1bHRWYWx1ZS5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYERlZmF1bHQgdmFsdWUgbXVzdCBiZSBhIHNjYWxhciwgc2F3OlxuICAgICAgICAke2RlZmF1bHRWYWx1ZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHZhbHVlcyA9IGJhY2tlbmQucmVhZFN5bmModmFsdWVzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJGRlbnNlU2hhcGUgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbnNlU2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkZGVmYXVsdFZhbHVlID1cbiAgICAgIGJhY2tlbmQucmVhZFN5bmMoZGVmYXVsdFZhbHVlLmRhdGFJZClbMF0gYXMgbnVtYmVyO1xuXG4gIGNvbnN0IFtvdXRwdXRJbmRpY2VzLCBvdXRwdXRJbmRpY2VzU2hhcGUsIG91dHB1dFZhbHVlcyxcbiAgICAgICAgIGVtcHR5Um93SW5kaWNhdG9yLCByZXZlcnNlSW5kZXhNYXBdID1cbiAgICAgIHNwYXJzZUZpbGxFbXB0eVJvd3NJbXBsQ1BVKFxuICAgICAgICAgICRpbmRpY2VzLCBpbmRpY2VzLnNoYXBlLCBpbmRpY2VzLmR0eXBlLCAkdmFsdWVzLCB2YWx1ZXMuZHR5cGUsXG4gICAgICAgICAgJGRlbnNlU2hhcGUsICRkZWZhdWx0VmFsdWUpO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0SW5kaWNlc1NoYXBlLCBpbmRpY2VzLmR0eXBlLCBvdXRwdXRJbmRpY2VzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbb3V0cHV0SW5kaWNlc1NoYXBlWzBdXSwgdmFsdWVzLmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgIFtlbXB0eVJvd0luZGljYXRvci5sZW5ndGhdLCAnYm9vbCcsXG4gICAgICAgIG5ldyBVaW50OEFycmF5KFxuICAgICAgICAgICAgZW1wdHlSb3dJbmRpY2F0b3IubWFwKCh2YWx1ZTogYm9vbGVhbikgPT4gTnVtYmVyKHZhbHVlKSkpKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFxuICAgICAgICBbcmV2ZXJzZUluZGV4TWFwLmxlbmd0aF0sIGluZGljZXMuZHR5cGUsXG4gICAgICAgIG5ldyBJbnQzMkFycmF5KHJldmVyc2VJbmRleE1hcCkpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlRmlsbEVtcHR5Um93c0NvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VGaWxsRW1wdHlSb3dzLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlRmlsbEVtcHR5Um93cyBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseReshape } from '@tensorflow/tfjs-core';\nimport { sparseReshapeImplCPU } from '../kernel_utils/shared';\nexport function sparseReshape(args) {\n    const { inputs, backend } = args;\n    const { inputIndices, inputShape, newShape } = inputs;\n    if (inputIndices.shape.length !== 2) {\n        throw new Error(`Input indices should be a matrix but received shape ${inputIndices.shape}`);\n    }\n    if (inputShape.shape.length !== 1) {\n        throw new Error(`Input shape should be a vector but received shape ${inputShape.shape}`);\n    }\n    if (newShape.shape.length !== 1) {\n        throw new Error(`Target shape should be a vector but received shape ${newShape.shape}`);\n    }\n    const $inputShape = Array.from(backend.readSync(inputShape.dataId));\n    const $inputIndices = backend.readSync(inputIndices.dataId);\n    const targetShape = Array.from(backend.readSync(newShape.dataId));\n    const [newIndices, indicesShape, outputShape] = sparseReshapeImplCPU($inputIndices, inputIndices.shape, inputIndices.dtype, $inputShape, targetShape);\n    return [\n        backend.makeTensorInfo(indicesShape, inputIndices.dtype, newIndices),\n        backend.makeTensorInfo([outputShape.length], newShape.dtype, new Int32Array(outputShape)),\n    ];\n}\nexport const sparseReshapeConfig = {\n    kernelName: SparseReshape,\n    backendName: 'webgl',\n    kernelFunc: sparseReshape,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlUmVzaGFwZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcGFyc2VSZXNoYXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxhQUFhLEVBQThDLE1BQU0sdUJBQXVCLENBQUM7QUFHL0csT0FBTyxFQUFDLG9CQUFvQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFNUQsTUFBTSxVQUFVLGFBQWEsQ0FDekIsSUFBOEQ7SUFFaEUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDL0IsTUFBTSxFQUFDLFlBQVksRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3BELElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ25DLE1BQU0sSUFBSSxLQUFLLENBQUMsdURBQ1osWUFBWSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDM0I7SUFDRCxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUNaLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ3pCO0lBRUQsSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FDWCxzREFBc0QsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDN0U7SUFFRCxNQUFNLFdBQVcsR0FDYixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBZSxDQUFDLENBQUM7SUFDbEUsTUFBTSxhQUFhLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDMUUsTUFBTSxXQUFXLEdBQ2IsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQWUsQ0FBQyxDQUFDO0lBRWhFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsWUFBWSxFQUFFLFdBQVcsQ0FBQyxHQUFHLG9CQUFvQixDQUNoRSxhQUFhLEVBQUUsWUFBWSxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsS0FBSyxFQUFFLFdBQVcsRUFDbEUsV0FBVyxDQUFDLENBQUM7SUFDakIsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDO1FBQ3BFLE9BQU8sQ0FBQyxjQUFjLENBQ2xCLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxFQUFFLFFBQVEsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7S0FDdkUsQ0FBQztBQUNKLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBaUI7SUFDL0MsVUFBVSxFQUFFLGFBQWE7SUFDekIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLGFBQWE7Q0FDMUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFNwYXJzZVJlc2hhcGUsIFNwYXJzZVJlc2hhcGVJbnB1dHMsIFRlbnNvckluZm8sIFR5cGVkQXJyYXl9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NwYXJzZVJlc2hhcGVJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwYXJzZVJlc2hhcGUoXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlUmVzaGFwZUlucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFtUZW5zb3JJbmZvLCBUZW5zb3JJbmZvXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmR9ID0gYXJncztcbiAgY29uc3Qge2lucHV0SW5kaWNlcywgaW5wdXRTaGFwZSwgbmV3U2hhcGV9ID0gaW5wdXRzO1xuICBpZiAoaW5wdXRJbmRpY2VzLnNoYXBlLmxlbmd0aCAhPT0gMikge1xuICAgIHRocm93IG5ldyBFcnJvcihgSW5wdXQgaW5kaWNlcyBzaG91bGQgYmUgYSBtYXRyaXggYnV0IHJlY2VpdmVkIHNoYXBlICR7XG4gICAgICAgIGlucHV0SW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoaW5wdXRTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYElucHV0IHNoYXBlIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGUgJHtcbiAgICAgICAgaW5wdXRTaGFwZS5zaGFwZX1gKTtcbiAgfVxuXG4gIGlmIChuZXdTaGFwZS5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBUYXJnZXQgc2hhcGUgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZSAke25ld1NoYXBlLnNoYXBlfWApO1xuICB9XG5cbiAgY29uc3QgJGlucHV0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKGlucHV0U2hhcGUuZGF0YUlkKSBhcyBUeXBlZEFycmF5KTtcbiAgY29uc3QgJGlucHV0SW5kaWNlcyA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXRJbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgdGFyZ2V0U2hhcGUgPVxuICAgICAgQXJyYXkuZnJvbShiYWNrZW5kLnJlYWRTeW5jKG5ld1NoYXBlLmRhdGFJZCkgYXMgVHlwZWRBcnJheSk7XG5cbiAgY29uc3QgW25ld0luZGljZXMsIGluZGljZXNTaGFwZSwgb3V0cHV0U2hhcGVdID0gc3BhcnNlUmVzaGFwZUltcGxDUFUoXG4gICAgICAkaW5wdXRJbmRpY2VzLCBpbnB1dEluZGljZXMuc2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgJGlucHV0U2hhcGUsXG4gICAgICB0YXJnZXRTaGFwZSk7XG4gIHJldHVybiBbXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhpbmRpY2VzU2hhcGUsIGlucHV0SW5kaWNlcy5kdHlwZSwgbmV3SW5kaWNlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgW291dHB1dFNoYXBlLmxlbmd0aF0sIG5ld1NoYXBlLmR0eXBlLCBuZXcgSW50MzJBcnJheShvdXRwdXRTaGFwZSkpLFxuICBdO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlUmVzaGFwZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcGFyc2VSZXNoYXBlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3BhcnNlUmVzaGFwZSxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseSegmentMean } from '@tensorflow/tfjs-core';\nimport { sparseSegmentReductionImplCPU } from '../kernel_utils/shared';\nexport function sparseSegmentMean(args) {\n    const { inputs, backend } = args;\n    const { data, indices, segmentIds } = inputs;\n    if (data.shape.length < 1) {\n        throw new Error(`Data should be at least 1 dimensional but received scalar`);\n    }\n    if (indices.shape.length !== 1) {\n        throw new Error(`Indices should be a vector but received shape\n              ${indices.shape}`);\n    }\n    if (segmentIds.shape.length !== 1) {\n        throw new Error(`Segment ids should be a vector but received shape\n              ${segmentIds.shape}`);\n    }\n    const $data = backend.readSync(data.dataId);\n    const $indices = backend.readSync(indices.dataId);\n    const $segmentIds = backend.readSync(segmentIds.dataId);\n    const [outputData, outputDataShape] = sparseSegmentReductionImplCPU($data, data.shape, data.dtype, $indices, $segmentIds, true);\n    return backend.makeTensorInfo(outputDataShape, data.dtype, outputData);\n}\nexport const sparseSegmentMeanConfig = {\n    kernelName: SparseSegmentMean,\n    backendName: 'webgl',\n    kernelFunc: sparseSegmentMean,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudE1lYW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3BhcnNlU2VnbWVudE1lYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixpQkFBaUIsRUFBa0QsTUFBTSx1QkFBdUIsQ0FBQztBQUduSSxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVyRSxNQUFNLFVBQVUsaUJBQWlCLENBQzdCLElBQWtFO0lBRXBFLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxJQUFJLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUMzQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtRQUN6QixNQUFNLElBQUksS0FBSyxDQUNYLDJEQUEyRCxDQUFDLENBQUM7S0FDbEU7SUFDRCxJQUFJLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUM5QixNQUFNLElBQUksS0FBSyxDQUFDO2dCQUNKLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzlCO0lBQ0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQztnQkFDSixVQUFVLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNqQztJQUVELE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQzFELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBQ2hFLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBZSxDQUFDO0lBRXRFLE1BQU0sQ0FBQyxVQUFVLEVBQUUsZUFBZSxDQUFDLEdBQUcsNkJBQTZCLENBQy9ELEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztJQUNoRSxPQUFPLE9BQU8sQ0FBQyxjQUFjLENBQUMsZUFBZSxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDekUsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHVCQUF1QixHQUFpQjtJQUNuRCxVQUFVLEVBQUUsaUJBQWlCO0lBQzdCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxpQkFBcUM7Q0FDbEQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFNwYXJzZVNlZ21lbnRNZWFuLCBTcGFyc2VTZWdtZW50TWVhbklucHV0cywgVGVuc29ySW5mbywgVHlwZWRBcnJheX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlU2VnbWVudE1lYW4oXG4gICAgYXJnczoge2lucHV0czogU3BhcnNlU2VnbWVudE1lYW5JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGF0YSwgaW5kaWNlcywgc2VnbWVudElkc30gPSBpbnB1dHM7XG4gIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICAke2luZGljZXMuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKHNlZ21lbnRJZHMuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBTZWdtZW50IGlkcyBzaG91bGQgYmUgYSB2ZWN0b3IgYnV0IHJlY2VpdmVkIHNoYXBlXG4gICAgICAgICAgICAgICR7c2VnbWVudElkcy5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRkYXRhID0gYmFja2VuZC5yZWFkU3luYyhkYXRhLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJGluZGljZXMgPSBiYWNrZW5kLnJlYWRTeW5jKGluZGljZXMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICBjb25zdCAkc2VnbWVudElkcyA9IGJhY2tlbmQucmVhZFN5bmMoc2VnbWVudElkcy5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG5cbiAgY29uc3QgW291dHB1dERhdGEsIG91dHB1dERhdGFTaGFwZV0gPSBzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVShcbiAgICAgICRkYXRhLCBkYXRhLnNoYXBlLCBkYXRhLmR0eXBlLCAkaW5kaWNlcywgJHNlZ21lbnRJZHMsIHRydWUpO1xuICByZXR1cm4gYmFja2VuZC5tYWtlVGVuc29ySW5mbyhvdXRwdXREYXRhU2hhcGUsIGRhdGEuZHR5cGUsIG91dHB1dERhdGEpO1xufVxuXG5leHBvcnQgY29uc3Qgc3BhcnNlU2VnbWVudE1lYW5Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudE1lYW4sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VTZWdtZW50TWVhbiBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SparseSegmentSum } from '@tensorflow/tfjs-core';\nimport { sparseSegmentReductionImplCPU } from '../kernel_utils/shared';\nexport function sparseSegmentSum(args) {\n    const { inputs, backend } = args;\n    const { data, indices, segmentIds } = inputs;\n    if (data.shape.length < 1) {\n        throw new Error(`Data should be at least 1 dimensional but received scalar`);\n    }\n    if (indices.shape.length !== 1) {\n        throw new Error(`Indices should be a vector but received shape\n             ${indices.shape}`);\n    }\n    if (segmentIds.shape.length !== 1) {\n        throw new Error(`Segment ids should be a vector but received shape\n             ${segmentIds.shape}`);\n    }\n    const $data = backend.readSync(data.dataId);\n    const $indices = backend.readSync(indices.dataId);\n    const $segmentIds = backend.readSync(segmentIds.dataId);\n    const [outputData, outputDataShape] = sparseSegmentReductionImplCPU($data, data.shape, data.dtype, $indices, $segmentIds);\n    return backend.makeTensorInfo(outputDataShape, data.dtype, outputData);\n}\nexport const sparseSegmentSumConfig = {\n    kernelName: SparseSegmentSum,\n    backendName: 'webgl',\n    kernelFunc: sparseSegmentSum,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlU2VnbWVudFN1bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcGFyc2VTZWdtZW50U3VtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsZ0JBQWdCLEVBQWlELE1BQU0sdUJBQXVCLENBQUM7QUFHakksT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsTUFBTSxVQUFVLGdCQUFnQixDQUM1QixJQUFpRTtJQUVuRSxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUMvQixNQUFNLEVBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDM0MsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDekIsTUFBTSxJQUFJLEtBQUssQ0FDWCwyREFBMkQsQ0FBQyxDQUFDO0tBQ2xFO0lBQ0QsSUFBSSxPQUFPLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQztlQUNMLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQzdCO0lBQ0QsSUFBSSxVQUFVLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQztlQUNMLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0tBQ2hDO0lBRUQsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDMUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFlLENBQUM7SUFDaEUsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFlLENBQUM7SUFFdEUsTUFBTSxDQUFDLFVBQVUsRUFBRSxlQUFlLENBQUMsR0FBRyw2QkFBNkIsQ0FDL0QsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFDMUQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3pFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBaUI7SUFDbEQsVUFBVSxFQUFFLGdCQUFnQjtJQUM1QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsZ0JBQW9DO0NBQ2pELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGFyc2VTZWdtZW50U3VtLCBTcGFyc2VTZWdtZW50U3VtSW5wdXRzLCBUZW5zb3JJbmZvLCBUeXBlZEFycmF5fSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50UmVkdWN0aW9uSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzcGFyc2VTZWdtZW50U3VtKFxuICAgIGFyZ3M6IHtpbnB1dHM6IFNwYXJzZVNlZ21lbnRTdW1JbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0x9KTpcbiAgICBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZH0gPSBhcmdzO1xuICBjb25zdCB7ZGF0YSwgaW5kaWNlcywgc2VnbWVudElkc30gPSBpbnB1dHM7XG4gIGlmIChkYXRhLnNoYXBlLmxlbmd0aCA8IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEYXRhIHNob3VsZCBiZSBhdCBsZWFzdCAxIGRpbWVuc2lvbmFsIGJ1dCByZWNlaXZlZCBzY2FsYXJgKTtcbiAgfVxuICBpZiAoaW5kaWNlcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEluZGljZXMgc2hvdWxkIGJlIGEgdmVjdG9yIGJ1dCByZWNlaXZlZCBzaGFwZVxuICAgICAgICAgICAgICR7aW5kaWNlcy5zaGFwZX1gKTtcbiAgfVxuICBpZiAoc2VnbWVudElkcy5zaGFwZS5sZW5ndGggIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYFNlZ21lbnQgaWRzIHNob3VsZCBiZSBhIHZlY3RvciBidXQgcmVjZWl2ZWQgc2hhcGVcbiAgICAgICAgICAgICAke3NlZ21lbnRJZHMuc2hhcGV9YCk7XG4gIH1cblxuICBjb25zdCAkZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YS5kYXRhSWQpIGFzIFR5cGVkQXJyYXk7XG4gIGNvbnN0ICRpbmRpY2VzID0gYmFja2VuZC5yZWFkU3luYyhpbmRpY2VzLmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgY29uc3QgJHNlZ21lbnRJZHMgPSBiYWNrZW5kLnJlYWRTeW5jKHNlZ21lbnRJZHMuZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuXG4gIGNvbnN0IFtvdXRwdXREYXRhLCBvdXRwdXREYXRhU2hhcGVdID0gc3BhcnNlU2VnbWVudFJlZHVjdGlvbkltcGxDUFUoXG4gICAgICAkZGF0YSwgZGF0YS5zaGFwZSwgZGF0YS5kdHlwZSwgJGluZGljZXMsICRzZWdtZW50SWRzKTtcbiAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0RGF0YVNoYXBlLCBkYXRhLmR0eXBlLCBvdXRwdXREYXRhKTtcbn1cblxuZXhwb3J0IGNvbnN0IHNwYXJzZVNlZ21lbnRTdW1Db25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3BhcnNlU2VnbWVudFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNwYXJzZVNlZ21lbnRTdW0gYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SparseToDense, util } from '@tensorflow/tfjs-core';\nimport { scatterImplCPU } from '../kernel_utils/shared';\nimport { ScatterProgram } from '../scatter_gpu';\nimport { reshape } from './Reshape';\nexport function sparseToDense(args) {\n    const { inputs, backend, attrs } = args;\n    const { sparseIndices, sparseValues, defaultValue } = inputs;\n    const { outputShape } = attrs;\n    const { sliceRank, numUpdates, sliceSize, strides, outputSize } = backend_util.calculateShapes(sparseValues, sparseIndices, outputShape);\n    const sumDupeIndices = false;\n    if (sparseValues.dtype === 'string') {\n        const indicesBuf = backend.bufferSync(sparseIndices);\n        const updatesBuf = backend.bufferSync(sparseValues);\n        const $defaultValue = util.decodeString(backend.readSync(defaultValue.dataId)[0]);\n        const outBuf = scatterImplCPU(indicesBuf, updatesBuf, outputShape, outputSize, sliceSize, numUpdates, sliceRank, strides, $defaultValue, sumDupeIndices);\n        return backend.makeTensorInfo(outputShape, outBuf.dtype, outBuf.values);\n    }\n    const program = new ScatterProgram(numUpdates, sliceRank, sparseIndices.shape.length, sparseValues.shape.length, strides, [outputSize, 1], sumDupeIndices);\n    const res = backend.runWebGLProgram(program, [sparseValues, sparseIndices, defaultValue], sparseValues.dtype);\n    const reshaped = reshape({ inputs: { x: res }, backend, attrs: { shape: outputShape } });\n    backend.disposeIntermediateTensorInfo(res);\n    return reshaped;\n}\nexport const sparseToDenseConfig = {\n    kernelName: SparseToDense,\n    backendName: 'webgl',\n    kernelFunc: sparseToDense\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BhcnNlVG9EZW5zZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcGFyc2VUb0RlbnNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxZQUFZLEVBQWtDLGFBQWEsRUFBdUQsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHN0osT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ3RELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUU5QyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBRWxDLE1BQU0sVUFBVSxhQUFhLENBQUMsSUFJN0I7SUFDQyxNQUFNLEVBQUMsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUMsR0FBRyxJQUFJLENBQUM7SUFDdEMsTUFBTSxFQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsWUFBWSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQzNELE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUIsTUFBTSxFQUFDLFNBQVMsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxVQUFVLEVBQUMsR0FDekQsWUFBWSxDQUFDLGVBQWUsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxDQUFDO0lBQzNFLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQztJQUU3QixJQUFJLFlBQVksQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQ25DLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWdCLGFBQWEsQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLENBQWlCLFlBQVksQ0FBQyxDQUFDO1FBQ3BFLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQ25DLE9BQU8sQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBZSxDQUFDLENBQUM7UUFDNUQsTUFBTSxNQUFNLEdBQUcsY0FBYyxDQUN6QixVQUFVLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsU0FBUyxFQUFFLFVBQVUsRUFDdEUsU0FBUyxFQUFFLE9BQU8sRUFBRSxhQUFhLEVBQUUsY0FBYyxDQUFDLENBQUM7UUFDdkQsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLFdBQVcsRUFBRSxNQUFNLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUN6RTtJQUNELE1BQU0sT0FBTyxHQUFHLElBQUksY0FBYyxDQUM5QixVQUFVLEVBQUUsU0FBUyxFQUFFLGFBQWEsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUNqRCxZQUFZLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7SUFFekUsTUFBTSxHQUFHLEdBQUcsT0FBTyxDQUFDLGVBQWUsQ0FDL0IsT0FBTyxFQUFFLENBQUMsWUFBWSxFQUFFLGFBQWEsRUFBRSxZQUFZLENBQUMsRUFBRSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7SUFFOUUsTUFBTSxRQUFRLEdBQ1YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsV0FBVyxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXRFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMzQyxPQUFPLFFBQVEsQ0FBQztBQUNsQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQWlCO0lBQy9DLFVBQVUsRUFBRSxhQUFhO0lBQ3pCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxhQUFpQztDQUM5QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBTcGFyc2VUb0RlbnNlLCBTcGFyc2VUb0RlbnNlQXR0cnMsIFNwYXJzZVRvRGVuc2VJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NjYXR0ZXJJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7U2NhdHRlclByb2dyYW19IGZyb20gJy4uL3NjYXR0ZXJfZ3B1JztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuXG5leHBvcnQgZnVuY3Rpb24gc3BhcnNlVG9EZW5zZShhcmdzOiB7XG4gIGlucHV0czogU3BhcnNlVG9EZW5zZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFNwYXJzZVRvRGVuc2VBdHRyc1xufSk6IFRlbnNvckluZm8ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c3BhcnNlSW5kaWNlcywgc3BhcnNlVmFsdWVzLCBkZWZhdWx0VmFsdWV9ID0gaW5wdXRzO1xuICBjb25zdCB7b3V0cHV0U2hhcGV9ID0gYXR0cnM7XG5cbiAgY29uc3Qge3NsaWNlUmFuaywgbnVtVXBkYXRlcywgc2xpY2VTaXplLCBzdHJpZGVzLCBvdXRwdXRTaXplfSA9XG4gICAgICBiYWNrZW5kX3V0aWwuY2FsY3VsYXRlU2hhcGVzKHNwYXJzZVZhbHVlcywgc3BhcnNlSW5kaWNlcywgb3V0cHV0U2hhcGUpO1xuICBjb25zdCBzdW1EdXBlSW5kaWNlcyA9IGZhbHNlO1xuXG4gIGlmIChzcGFyc2VWYWx1ZXMuZHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgaW5kaWNlc0J1ZiA9IGJhY2tlbmQuYnVmZmVyU3luYzxSYW5rLCAnaW50MzInPihzcGFyc2VJbmRpY2VzKTtcbiAgICBjb25zdCB1cGRhdGVzQnVmID0gYmFja2VuZC5idWZmZXJTeW5jPFJhbmssICdzdHJpbmcnPihzcGFyc2VWYWx1ZXMpO1xuICAgIGNvbnN0ICRkZWZhdWx0VmFsdWUgPSB1dGlsLmRlY29kZVN0cmluZyhcbiAgICAgICAgYmFja2VuZC5yZWFkU3luYyhkZWZhdWx0VmFsdWUuZGF0YUlkKVswXSBhcyBVaW50OEFycmF5KTtcbiAgICBjb25zdCBvdXRCdWYgPSBzY2F0dGVySW1wbENQVShcbiAgICAgICAgaW5kaWNlc0J1ZiwgdXBkYXRlc0J1Ziwgb3V0cHV0U2hhcGUsIG91dHB1dFNpemUsIHNsaWNlU2l6ZSwgbnVtVXBkYXRlcyxcbiAgICAgICAgc2xpY2VSYW5rLCBzdHJpZGVzLCAkZGVmYXVsdFZhbHVlLCBzdW1EdXBlSW5kaWNlcyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0cHV0U2hhcGUsIG91dEJ1Zi5kdHlwZSwgb3V0QnVmLnZhbHVlcyk7XG4gIH1cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBTY2F0dGVyUHJvZ3JhbShcbiAgICAgIG51bVVwZGF0ZXMsIHNsaWNlUmFuaywgc3BhcnNlSW5kaWNlcy5zaGFwZS5sZW5ndGgsXG4gICAgICBzcGFyc2VWYWx1ZXMuc2hhcGUubGVuZ3RoLCBzdHJpZGVzLCBbb3V0cHV0U2l6ZSwgMV0sIHN1bUR1cGVJbmRpY2VzKTtcblxuICBjb25zdCByZXMgPSBiYWNrZW5kLnJ1bldlYkdMUHJvZ3JhbShcbiAgICAgIHByb2dyYW0sIFtzcGFyc2VWYWx1ZXMsIHNwYXJzZUluZGljZXMsIGRlZmF1bHRWYWx1ZV0sIHNwYXJzZVZhbHVlcy5kdHlwZSk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcmVzfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogb3V0cHV0U2hhcGV9fSk7XG5cbiAgYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyhyZXMpO1xuICByZXR1cm4gcmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBzcGFyc2VUb0RlbnNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNwYXJzZVRvRGVuc2UsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcGFyc2VUb0RlbnNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, SplitV, util } from '@tensorflow/tfjs-core';\nimport { slice } from './Slice';\nexport function splitV(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { numOrSizeSplits, axis } = attrs;\n    const $axis = util.parseAxisParam(axis, x.shape)[0];\n    const splitSizes = backend_util.prepareSplitSize(x, numOrSizeSplits, $axis);\n    const xRank = x.shape.length;\n    const begin = new Array(xRank).fill(0);\n    const size = x.shape.slice();\n    return splitSizes.map(s => {\n        const sliceSize = [...size];\n        sliceSize[$axis] = s;\n        const sliceT = slice({ inputs: { x }, backend, attrs: { begin, size: sliceSize } });\n        begin[$axis] += s;\n        return sliceT;\n    });\n}\nexport const splitVConfig = {\n    kernelName: SplitV,\n    backendName: 'webgl',\n    kernelFunc: splitV\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3BsaXRWLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NwbGl0Vi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUE0QixNQUFNLEVBQXlDLElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBR2xJLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsSUFDeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLGVBQWUsRUFBRSxJQUFJLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFdEMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3BELE1BQU0sVUFBVSxHQUFHLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLEVBQUUsZUFBZSxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRTVFLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDO0lBQzdCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRTdCLE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRTtRQUN4QixNQUFNLFNBQVMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDNUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQixNQUFNLE1BQU0sR0FDUixLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDbkUsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQWlCO0lBQ3hDLFVBQVUsRUFBRSxNQUFNO0lBQ2xCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxNQUEwQjtDQUN2QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbCwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTcGxpdFYsIFNwbGl0VkF0dHJzLCBTcGxpdFZJbnB1dHMsIFRlbnNvckluZm8sIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3NsaWNlfSBmcm9tICcuL1NsaWNlJztcblxuZXhwb3J0IGZ1bmN0aW9uIHNwbGl0VihcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBTcGxpdFZJbnB1dHMsIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIGF0dHJzOiBTcGxpdFZBdHRyc30pOlxuICAgIFRlbnNvckluZm9bXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge251bU9yU2l6ZVNwbGl0cywgYXhpc30gPSBhdHRycztcblxuICBjb25zdCAkYXhpcyA9IHV0aWwucGFyc2VBeGlzUGFyYW0oYXhpcywgeC5zaGFwZSlbMF07XG4gIGNvbnN0IHNwbGl0U2l6ZXMgPSBiYWNrZW5kX3V0aWwucHJlcGFyZVNwbGl0U2l6ZSh4LCBudW1PclNpemVTcGxpdHMsICRheGlzKTtcblxuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4UmFuaykuZmlsbCgwKTtcbiAgY29uc3Qgc2l6ZSA9IHguc2hhcGUuc2xpY2UoKTtcblxuICByZXR1cm4gc3BsaXRTaXplcy5tYXAocyA9PiB7XG4gICAgY29uc3Qgc2xpY2VTaXplID0gWy4uLnNpemVdO1xuICAgIHNsaWNlU2l6ZVskYXhpc10gPSBzO1xuICAgIGNvbnN0IHNsaWNlVCA9XG4gICAgICAgIHNsaWNlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtiZWdpbiwgc2l6ZTogc2xpY2VTaXplfX0pO1xuICAgIGJlZ2luWyRheGlzXSArPSBzO1xuICAgIHJldHVybiBzbGljZVQ7XG4gIH0pO1xufVxuXG5leHBvcnQgY29uc3Qgc3BsaXRWQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNwbGl0VixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHNwbGl0ViBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Sqrt } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nimport { sqrtImplCPU } from '../kernel_utils/shared';\nconst SQRT = `return sqrt(x);`;\nexport const sqrt = unaryKernelFunc({ opSnippet: SQRT, packedOpSnippet: SQRT, cpuKernelImpl: sqrtImplCPU });\nexport const sqrtConfig = {\n    kernelName: Sqrt,\n    backendName: 'webgl',\n    kernelFunc: sqrt\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3FydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TcXJ0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFckUsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBQ25FLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUVuRCxNQUFNLElBQUksR0FBRyxpQkFBaUIsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUMvQixFQUFDLFNBQVMsRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsV0FBVyxFQUFDLENBQUMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU3FydH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuaW1wb3J0IHtzcXJ0SW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmNvbnN0IFNRUlQgPSBgcmV0dXJuIHNxcnQoeCk7YDtcblxuZXhwb3J0IGNvbnN0IHNxcnQgPSB1bmFyeUtlcm5lbEZ1bmMoXG4gICAge29wU25pcHBldDogU1FSVCwgcGFja2VkT3BTbmlwcGV0OiBTUVJULCBjcHVLZXJuZWxJbXBsOiBzcXJ0SW1wbENQVX0pO1xuXG5leHBvcnQgY29uc3Qgc3FydENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcXJ0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3FydCBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2019 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Square } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SQUARE = `return x * x;`;\nexport const square = unaryKernelFunc({ opSnippet: SQUARE });\nexport const squareConfig = {\n    kernelName: Square,\n    backendName: 'webgl',\n    kernelFunc: square,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1NxdWFyZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsTUFBTSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFM0QsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxNQUFNLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLE1BQU0sRUFBQyxDQUFDLENBQUM7QUFFM0QsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBTTtDQUNuQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTkgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgU3F1YXJlfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge3VuYXJ5S2VybmVsRnVuY30gZnJvbSAnLi4va2VybmVsX3V0aWxzL2tlcm5lbF9mdW5jc191dGlscyc7XG5cbmNvbnN0IFNRVUFSRSA9IGByZXR1cm4geCAqIHg7YDtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZSA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBTUVVBUkV9KTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTcXVhcmUsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiBzcXVhcmUsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { SquaredDifference } from '@tensorflow/tfjs-core';\nimport { binaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst SQUARED_DIFFERENCE = 'return (a - b) * (a - b);';\nexport const squaredDifference = binaryKernelFunc({ opSnippet: SQUARED_DIFFERENCE, packedOpSnippet: SQUARED_DIFFERENCE });\nexport const squaredDifferenceConfig = {\n    kernelName: SquaredDifference,\n    backendName: 'webgl',\n    kernelFunc: squaredDifference,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3F1YXJlZERpZmZlcmVuY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3F1YXJlZERpZmZlcmVuY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUFlLGlCQUFpQixFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFdEUsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFcEUsTUFBTSxrQkFBa0IsR0FBRywyQkFBMkIsQ0FBQztBQUV2RCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FDN0MsRUFBQyxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsZUFBZSxFQUFFLGtCQUFrQixFQUFDLENBQUMsQ0FBQztBQUUxRSxNQUFNLENBQUMsTUFBTSx1QkFBdUIsR0FBaUI7SUFDbkQsVUFBVSxFQUFFLGlCQUFpQjtJQUM3QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsaUJBQWlCO0NBQzlCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBTcXVhcmVkRGlmZmVyZW5jZX0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtiaW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgU1FVQVJFRF9ESUZGRVJFTkNFID0gJ3JldHVybiAoYSAtIGIpICogKGEgLSBiKTsnO1xuXG5leHBvcnQgY29uc3Qgc3F1YXJlZERpZmZlcmVuY2UgPSBiaW5hcnlLZXJuZWxGdW5jKFxuICAgIHtvcFNuaXBwZXQ6IFNRVUFSRURfRElGRkVSRU5DRSwgcGFja2VkT3BTbmlwcGV0OiBTUVVBUkVEX0RJRkZFUkVOQ0V9KTtcblxuZXhwb3J0IGNvbnN0IHNxdWFyZWREaWZmZXJlbmNlQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFNxdWFyZWREaWZmZXJlbmNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3F1YXJlZERpZmZlcmVuY2UsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Step } from '@tensorflow/tfjs-core';\nimport { CHECK_NAN_SNIPPET, UnaryOpProgram } from '../unaryop_gpu';\nexport function step({ inputs, attrs, backend }) {\n    const { x } = inputs;\n    const opSnippet = CHECK_NAN_SNIPPET + `\n    return x > 0.0 ? 1.0 : float(${attrs.alpha});\n  `;\n    const program = new UnaryOpProgram(x.shape, opSnippet);\n    return backend.runWebGLProgram(program, [x], x.dtype);\n}\nexport const stepConfig = {\n    kernelName: Step,\n    backendName: 'webgl',\n    kernelFunc: step,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RlcC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TdGVwLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsSUFBSSxFQUFxQyxNQUFNLHVCQUF1QixDQUFDO0FBR3pHLE9BQU8sRUFBQyxpQkFBaUIsRUFBRSxjQUFjLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUVqRSxNQUFNLFVBQVUsSUFBSSxDQUNoQixFQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUMrQztJQUV4RSxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sU0FBUyxHQUFHLGlCQUFpQixHQUFHO21DQUNMLEtBQUssQ0FBQyxLQUFLO0dBQzNDLENBQUM7SUFFRixNQUFNLE9BQU8sR0FBRyxJQUFJLGNBQWMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRXZELE9BQU8sT0FBTyxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUM7QUFDeEQsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBaUI7SUFDdEMsVUFBVSxFQUFFLElBQUk7SUFDaEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLElBQXdCO0NBQ3JDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBTdGVwLCBTdGVwQXR0cnMsIFRlbnNvckluZm8sIFVuYXJ5SW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtDSEVDS19OQU5fU05JUFBFVCwgVW5hcnlPcFByb2dyYW19IGZyb20gJy4uL3VuYXJ5b3BfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0ZXAoXG4gICAge2lucHV0cywgYXR0cnMsIGJhY2tlbmR9OlxuICAgICAgICB7aW5wdXRzOiBVbmFyeUlucHV0cywgYXR0cnM6IFN0ZXBBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm8ge1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGNvbnN0IG9wU25pcHBldCA9IENIRUNLX05BTl9TTklQUEVUICsgYFxuICAgIHJldHVybiB4ID4gMC4wID8gMS4wIDogZmxvYXQoJHthdHRycy5hbHBoYX0pO1xuICBgO1xuXG4gIGNvbnN0IHByb2dyYW0gPSBuZXcgVW5hcnlPcFByb2dyYW0oeC5zaGFwZSwgb3BTbmlwcGV0KTtcblxuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0ZXBDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RlcCxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHN0ZXAgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class StridedSliceProgram {\n    constructor(begin, strides, size) {\n        this.variableNames = ['x'];\n        this.outputShape = size;\n        const rank = size.length;\n        const inputDtype = getCoordsDataType(size.length);\n        const dtype = getCoordsDataType(size.length);\n        let newCoords = '';\n        if (rank === 1) {\n            newCoords = 'coords * strides + begin';\n        }\n        else {\n            let outputAxis = 0;\n            newCoords =\n                size.map((_, i) => {\n                    outputAxis++;\n                    return size.length === 1 ?\n                        `coords * strides[${i}] + begin[${i}]` :\n                        `coords[${outputAxis - 1}] * strides[${i}] + begin[${i}]`;\n                })\n                    .join(',');\n        }\n        this.userCode = `\n      ${inputDtype} begin = ${inputDtype}(${begin});\n      ${inputDtype} strides = ${inputDtype}(${strides});\n\n      void main() {\n        ${dtype} coords = getOutputCoords();\n        setOutput(getX(${newCoords}));\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaWRlZF9zbGljZV9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3N0cmlkZWRfc2xpY2VfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxtQkFBbUI7SUFLOUIsWUFBWSxLQUFlLEVBQUUsT0FBaUIsRUFBRSxJQUFjO1FBSjlELGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUtwQixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztRQUN4QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDO1FBQ3pCLE1BQU0sVUFBVSxHQUFHLGlCQUFpQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNsRCxNQUFNLEtBQUssR0FBRyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFN0MsSUFBSSxTQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtZQUNkLFNBQVMsR0FBRywwQkFBMEIsQ0FBQztTQUN4QzthQUFNO1lBQ0wsSUFBSSxVQUFVLEdBQUcsQ0FBQyxDQUFDO1lBQ25CLFNBQVM7Z0JBQ0wsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsQ0FBQztvQkFDYixPQUFPLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQyxDQUFDLENBQUM7d0JBQ3RCLG9CQUFvQixDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDeEMsVUFBVSxVQUFVLEdBQUcsQ0FBQyxlQUFlLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQztnQkFDaEUsQ0FBQyxDQUFDO3FCQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUNwQjtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7UUFDWixVQUFVLFlBQVksVUFBVSxJQUFJLEtBQUs7UUFDekMsVUFBVSxjQUFjLFVBQVUsSUFBSSxPQUFPOzs7VUFHM0MsS0FBSzt5QkFDVSxTQUFTOztLQUU3QixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFN0cmlkZWRTbGljZVByb2dyYW0gaW1wbGVtZW50cyBHUEdQVVByb2dyYW0ge1xuICB2YXJpYWJsZU5hbWVzID0gWyd4J107XG4gIG91dHB1dFNoYXBlOiBudW1iZXJbXTtcbiAgdXNlckNvZGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihiZWdpbjogbnVtYmVyW10sIHN0cmlkZXM6IG51bWJlcltdLCBzaXplOiBudW1iZXJbXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBzaXplO1xuICAgIGNvbnN0IHJhbmsgPSBzaXplLmxlbmd0aDtcbiAgICBjb25zdCBpbnB1dER0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2l6ZS5sZW5ndGgpO1xuICAgIGNvbnN0IGR0eXBlID0gZ2V0Q29vcmRzRGF0YVR5cGUoc2l6ZS5sZW5ndGgpO1xuXG4gICAgbGV0IG5ld0Nvb3JkcyA9ICcnO1xuICAgIGlmIChyYW5rID09PSAxKSB7XG4gICAgICBuZXdDb29yZHMgPSAnY29vcmRzICogc3RyaWRlcyArIGJlZ2luJztcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IG91dHB1dEF4aXMgPSAwO1xuICAgICAgbmV3Q29vcmRzID1cbiAgICAgICAgICBzaXplLm1hcCgoXywgaSkgPT4ge1xuICAgICAgICAgICAgICAgIG91dHB1dEF4aXMrKztcbiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZS5sZW5ndGggPT09IDEgP1xuICAgICAgICAgICAgICAgICAgICBgY29vcmRzICogc3RyaWRlc1ske2l9XSArIGJlZ2luWyR7aX1dYCA6XG4gICAgICAgICAgICAgICAgICAgIGBjb29yZHNbJHtvdXRwdXRBeGlzIC0gMX1dICogc3RyaWRlc1ske2l9XSArIGJlZ2luWyR7aX1dYDtcbiAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgJHtpbnB1dER0eXBlfSBiZWdpbiA9ICR7aW5wdXREdHlwZX0oJHtiZWdpbn0pO1xuICAgICAgJHtpbnB1dER0eXBlfSBzdHJpZGVzID0gJHtpbnB1dER0eXBlfSgke3N0cmlkZXN9KTtcblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICAke2R0eXBlfSBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KGdldFgoJHtuZXdDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, slice_util, StridedSlice, util } from '@tensorflow/tfjs-core';\nimport { stridedSliceImplCPU } from '../kernel_utils/shared';\nimport { StridedSliceProgram } from '../strided_slice_gpu';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nexport function stridedSlice(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask } = attrs;\n    const { finalShapeSparse, finalShape, isIdentity, sliceDim0, isSimpleSlice, begin: $begin, end: $end, strides: $strides } = slice_util.sliceInfo(x.shape, begin, end, strides, beginMask, endMask, ellipsisMask, newAxisMask, shrinkAxisMask);\n    let result;\n    if (isIdentity) {\n        // Optimization #1, slice is a no-op plus reshape\n        result = reshape({ inputs: { x }, backend, attrs: { shape: finalShape } });\n    }\n    else if (sliceDim0 || isSimpleSlice) {\n        // Optimization #2, slice is memory contiguous (only occurs in dim 0)\n        util.assert(x.shape.length >= 1, () => `Input must have rank at least 1, got: ${x.shape.length}`);\n        const size = slice_util.computeOutShape($begin, $end, $strides);\n        // To tolerate begin[0] > end[0] (a 0-output slice), we min(begin, end).\n        const sliced = slice({ inputs: { x }, backend, attrs: { begin: $begin, size } });\n        result =\n            reshape({ inputs: { x: sliced }, backend, attrs: { shape: finalShape } });\n        backend.disposeIntermediateTensorInfo(sliced);\n    }\n    else {\n        const shouldExecuteOnCPU = backend.shouldExecuteOnCPU([x]);\n        if (shouldExecuteOnCPU) {\n            // tslint:disable-next-line: no-unnecessary-type-assertion\n            const values = backend.readSync(x.dataId);\n            // tslint:disable-next-line: no-unnecessary-type-assertion\n            const xBuf = buffer(x.shape, x.dtype, values);\n            const resultValues = stridedSliceImplCPU(finalShapeSparse, xBuf, $strides, $begin);\n            result = backend.makeTensorInfo(finalShape, x.dtype, resultValues.values);\n        }\n        else {\n            const program = new StridedSliceProgram($begin, $strides, finalShapeSparse);\n            result = backend.runWebGLProgram(program, [x], x.dtype);\n        }\n    }\n    const resultReshaped = reshape({ inputs: { x: result }, backend, attrs: { shape: finalShape } });\n    backend.disposeIntermediateTensorInfo(result);\n    return resultReshaped;\n}\nexport const stridedSliceConfig = {\n    kernelName: StridedSlice,\n    backendName: 'webgl',\n    kernelFunc: stridedSlice\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaWRlZFNsaWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1N0cmlkZWRTbGljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsTUFBTSxFQUFrQyxVQUFVLEVBQUUsWUFBWSxFQUErRSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUcxTCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMzRCxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUV6RCxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsTUFBTSxVQUFVLFlBQVksQ0FBQyxJQUk1QjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsQ0FBQyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25CLE1BQU0sRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILE9BQU8sRUFDUCxTQUFTLEVBQ1QsT0FBTyxFQUNQLFlBQVksRUFDWixXQUFXLEVBQ1gsY0FBYyxFQUNmLEdBQUcsS0FBSyxDQUFDO0lBRVYsTUFBTSxFQUNKLGdCQUFnQixFQUNoQixVQUFVLEVBQ1YsVUFBVSxFQUNWLFNBQVMsRUFDVCxhQUFhLEVBQ2IsS0FBSyxFQUFFLE1BQU0sRUFDYixHQUFHLEVBQUUsSUFBSSxFQUNULE9BQU8sRUFBRSxRQUFRLEVBQ2xCLEdBQ0csVUFBVSxDQUFDLFNBQVMsQ0FDaEIsQ0FBQyxDQUFDLEtBQUssRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFlBQVksRUFDOUQsV0FBVyxFQUFFLGNBQWMsQ0FBQyxDQUFDO0lBRXJDLElBQUksTUFBTSxDQUFDO0lBRVgsSUFBSSxVQUFVLEVBQUU7UUFDZCxpREFBaUQ7UUFDakQsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0tBQ3RFO1NBQU0sSUFBSSxTQUFTLElBQUksYUFBYSxFQUFFO1FBQ3JDLHFFQUFxRTtRQUNyRSxJQUFJLENBQUMsTUFBTSxDQUNQLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxJQUFJLENBQUMsRUFDbkIsR0FBRyxFQUFFLENBQUMseUNBQXlDLENBQUMsQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUVyRSxNQUFNLElBQUksR0FBRyxVQUFVLENBQUMsZUFBZSxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDaEUsd0VBQXdFO1FBQ3hFLE1BQU0sTUFBTSxHQUFHLEtBQUssQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztRQUMzRSxNQUFNO1lBQ0YsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEVBQUMsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztLQUMvQztTQUFNO1FBQ0wsTUFBTSxrQkFBa0IsR0FBRyxPQUFPLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNELElBQUksa0JBQWtCLEVBQUU7WUFDdEIsMERBQTBEO1lBQzFELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBZSxDQUFDO1lBQ3hELDBEQUEwRDtZQUMxRCxNQUFNLElBQUksR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBdUIsQ0FBQztZQUNwRSxNQUFNLFlBQVksR0FDZCxtQkFBbUIsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ2xFLE1BQU0sR0FBRyxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUMzRTthQUFNO1lBQ0wsTUFBTSxPQUFPLEdBQ1QsSUFBSSxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDaEUsTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3pEO0tBQ0Y7SUFFRCxNQUFNLGNBQWMsR0FDaEIsT0FBTyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEVBQUMsQ0FBQyxDQUFDO0lBRXhFLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUU5QyxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sa0JBQWtCLEdBQWlCO0lBQzlDLFVBQVUsRUFBRSxZQUFZO0lBQ3hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxZQUFnQztDQUM3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBSYW5rLCBzbGljZV91dGlsLCBTdHJpZGVkU2xpY2UsIFN0cmlkZWRTbGljZUF0dHJzLCBTdHJpZGVkU2xpY2VJbnB1dHMsIFRlbnNvckJ1ZmZlciwgVGVuc29ySW5mbywgVHlwZWRBcnJheSwgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaWRlZFNsaWNlSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5pbXBvcnQge1N0cmlkZWRTbGljZVByb2dyYW19IGZyb20gJy4uL3N0cmlkZWRfc2xpY2VfZ3B1JztcblxuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpZGVkU2xpY2UoYXJnczoge1xuICBpbnB1dHM6IFN0cmlkZWRTbGljZUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmlkZWRTbGljZUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge1xuICAgIGJlZ2luLFxuICAgIGVuZCxcbiAgICBzdHJpZGVzLFxuICAgIGJlZ2luTWFzayxcbiAgICBlbmRNYXNrLFxuICAgIGVsbGlwc2lzTWFzayxcbiAgICBuZXdBeGlzTWFzayxcbiAgICBzaHJpbmtBeGlzTWFza1xuICB9ID0gYXR0cnM7XG5cbiAgY29uc3Qge1xuICAgIGZpbmFsU2hhcGVTcGFyc2UsXG4gICAgZmluYWxTaGFwZSxcbiAgICBpc0lkZW50aXR5LFxuICAgIHNsaWNlRGltMCxcbiAgICBpc1NpbXBsZVNsaWNlLFxuICAgIGJlZ2luOiAkYmVnaW4sXG4gICAgZW5kOiAkZW5kLFxuICAgIHN0cmlkZXM6ICRzdHJpZGVzXG4gIH0gPVxuICAgICAgc2xpY2VfdXRpbC5zbGljZUluZm8oXG4gICAgICAgICAgeC5zaGFwZSwgYmVnaW4sIGVuZCwgc3RyaWRlcywgYmVnaW5NYXNrLCBlbmRNYXNrLCBlbGxpcHNpc01hc2ssXG4gICAgICAgICAgbmV3QXhpc01hc2ssIHNocmlua0F4aXNNYXNrKTtcblxuICBsZXQgcmVzdWx0O1xuXG4gIGlmIChpc0lkZW50aXR5KSB7XG4gICAgLy8gT3B0aW1pemF0aW9uICMxLCBzbGljZSBpcyBhIG5vLW9wIHBsdXMgcmVzaGFwZVxuICAgIHJlc3VsdCA9IHJlc2hhcGUoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBmaW5hbFNoYXBlfX0pO1xuICB9IGVsc2UgaWYgKHNsaWNlRGltMCB8fCBpc1NpbXBsZVNsaWNlKSB7XG4gICAgLy8gT3B0aW1pemF0aW9uICMyLCBzbGljZSBpcyBtZW1vcnkgY29udGlndW91cyAob25seSBvY2N1cnMgaW4gZGltIDApXG4gICAgdXRpbC5hc3NlcnQoXG4gICAgICAgIHguc2hhcGUubGVuZ3RoID49IDEsXG4gICAgICAgICgpID0+IGBJbnB1dCBtdXN0IGhhdmUgcmFuayBhdCBsZWFzdCAxLCBnb3Q6ICR7eC5zaGFwZS5sZW5ndGh9YCk7XG5cbiAgICBjb25zdCBzaXplID0gc2xpY2VfdXRpbC5jb21wdXRlT3V0U2hhcGUoJGJlZ2luLCAkZW5kLCAkc3RyaWRlcyk7XG4gICAgLy8gVG8gdG9sZXJhdGUgYmVnaW5bMF0gPiBlbmRbMF0gKGEgMC1vdXRwdXQgc2xpY2UpLCB3ZSBtaW4oYmVnaW4sIGVuZCkuXG4gICAgY29uc3Qgc2xpY2VkID0gc2xpY2Uoe2lucHV0czoge3h9LCBiYWNrZW5kLCBhdHRyczoge2JlZ2luOiAkYmVnaW4sIHNpemV9fSk7XG4gICAgcmVzdWx0ID1cbiAgICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc2xpY2VkfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogZmluYWxTaGFwZX19KTtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHNsaWNlZCk7XG4gIH0gZWxzZSB7XG4gICAgY29uc3Qgc2hvdWxkRXhlY3V0ZU9uQ1BVID0gYmFja2VuZC5zaG91bGRFeGVjdXRlT25DUFUoW3hdKTtcbiAgICBpZiAoc2hvdWxkRXhlY3V0ZU9uQ1BVKSB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uXG4gICAgICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKSBhcyBUeXBlZEFycmF5O1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby11bm5lY2Vzc2FyeS10eXBlLWFzc2VydGlvblxuICAgICAgY29uc3QgeEJ1ZiA9IGJ1ZmZlcih4LnNoYXBlLCB4LmR0eXBlLCB2YWx1ZXMpIGFzIFRlbnNvckJ1ZmZlcjxSYW5rPjtcbiAgICAgIGNvbnN0IHJlc3VsdFZhbHVlcyA9XG4gICAgICAgICAgc3RyaWRlZFNsaWNlSW1wbENQVShmaW5hbFNoYXBlU3BhcnNlLCB4QnVmLCAkc3RyaWRlcywgJGJlZ2luKTtcbiAgICAgIHJlc3VsdCA9IGJhY2tlbmQubWFrZVRlbnNvckluZm8oZmluYWxTaGFwZSwgeC5kdHlwZSwgcmVzdWx0VmFsdWVzLnZhbHVlcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHByb2dyYW0gPVxuICAgICAgICAgIG5ldyBTdHJpZGVkU2xpY2VQcm9ncmFtKCRiZWdpbiwgJHN0cmlkZXMsIGZpbmFsU2hhcGVTcGFyc2UpO1xuICAgICAgcmVzdWx0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCByZXN1bHRSZXNoYXBlZCA9XG4gICAgICByZXNoYXBlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBmaW5hbFNoYXBlfX0pO1xuXG4gIGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8ocmVzdWx0KTtcblxuICByZXR1cm4gcmVzdWx0UmVzaGFwZWQ7XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpZGVkU2xpY2VDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RyaWRlZFNsaWNlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaWRlZFNsaWNlIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringNGrams } from '@tensorflow/tfjs-core';\nimport { stringNGramsImplCPU } from '../kernel_utils/shared';\nexport function stringNGrams(args) {\n    const { inputs, backend, attrs } = args;\n    const { separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences } = attrs;\n    const { data, dataSplits } = inputs;\n    const $data = backend.readSync(data.dataId);\n    const $dataSplits = backend.readSync(dataSplits.dataId);\n    const [nGrams, nGramsSplits] = stringNGramsImplCPU($data, $dataSplits, separator, nGramWidths, leftPad, rightPad, padWidth, preserveShortSequences);\n    return [\n        backend.makeTensorInfo([nGrams.length], 'string', nGrams),\n        backend.makeTensorInfo(dataSplits.shape, 'int32', nGramsSplits),\n    ];\n}\nexport const stringNGramsConfig = {\n    kernelName: StringNGrams,\n    backendName: 'webgl',\n    kernelFunc: stringNGrams,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nTkdyYW1zLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1N0cmluZ05HcmFtcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQTJCLFlBQVksRUFBb0QsTUFBTSx1QkFBdUIsQ0FBQztBQUdoSSxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUUzRCxNQUFNLFVBQVUsWUFBWSxDQUFDLElBSTVCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFDSixTQUFTLEVBQ1QsV0FBVyxFQUNYLE9BQU8sRUFDUCxRQUFRLEVBQ1IsUUFBUSxFQUNSLHNCQUFzQixFQUN2QixHQUFHLEtBQUssQ0FBQztJQUNWLE1BQU0sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ2xDLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBaUIsQ0FBQztJQUM1RCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQWUsQ0FBQztJQUV0RSxNQUFNLENBQUMsTUFBTSxFQUFFLFlBQVksQ0FBQyxHQUFHLG1CQUFtQixDQUM5QyxLQUFLLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQ3ZFLHNCQUFzQixDQUFDLENBQUM7SUFDNUIsT0FBTztRQUNMLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxFQUFFLE1BQU0sQ0FBQztRQUN6RCxPQUFPLENBQUMsY0FBYyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsT0FBTyxFQUFFLFlBQVksQ0FBQztLQUNoRSxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFpQjtJQUM5QyxVQUFVLEVBQUUsWUFBWTtJQUN4QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsWUFBZ0M7Q0FDN0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN0cmluZ05HcmFtcywgU3RyaW5nTkdyYW1zQXR0cnMsIFN0cmluZ05HcmFtc0lucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaW5nTkdyYW1zSW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdOR3JhbXMoYXJnczoge1xuICBpbnB1dHM6IFN0cmluZ05HcmFtc0lucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmluZ05HcmFtc0F0dHJzXG59KTogW1RlbnNvckluZm8sIFRlbnNvckluZm9dIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge1xuICAgIHNlcGFyYXRvcixcbiAgICBuR3JhbVdpZHRocyxcbiAgICBsZWZ0UGFkLFxuICAgIHJpZ2h0UGFkLFxuICAgIHBhZFdpZHRoLFxuICAgIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXNcbiAgfSA9IGF0dHJzO1xuICBjb25zdCB7ZGF0YSwgZGF0YVNwbGl0c30gPSBpbnB1dHM7XG4gIGNvbnN0ICRkYXRhID0gYmFja2VuZC5yZWFkU3luYyhkYXRhLmRhdGFJZCkgYXMgVWludDhBcnJheVtdO1xuICBjb25zdCAkZGF0YVNwbGl0cyA9IGJhY2tlbmQucmVhZFN5bmMoZGF0YVNwbGl0cy5kYXRhSWQpIGFzIEludDMyQXJyYXk7XG5cbiAgY29uc3QgW25HcmFtcywgbkdyYW1zU3BsaXRzXSA9IHN0cmluZ05HcmFtc0ltcGxDUFUoXG4gICAgICAkZGF0YSwgJGRhdGFTcGxpdHMsIHNlcGFyYXRvciwgbkdyYW1XaWR0aHMsIGxlZnRQYWQsIHJpZ2h0UGFkLCBwYWRXaWR0aCxcbiAgICAgIHByZXNlcnZlU2hvcnRTZXF1ZW5jZXMpO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW25HcmFtcy5sZW5ndGhdLCAnc3RyaW5nJywgbkdyYW1zKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGRhdGFTcGxpdHMuc2hhcGUsICdpbnQzMicsIG5HcmFtc1NwbGl0cyksXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCBzdHJpbmdOR3JhbXNDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogU3RyaW5nTkdyYW1zLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaW5nTkdyYW1zIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringSplit } from '@tensorflow/tfjs-core';\nimport { stringSplitImplCPU } from '../kernel_utils/shared';\nexport function stringSplit(args) {\n    const { inputs, backend, attrs } = args;\n    const { skipEmpty } = attrs;\n    const { input, delimiter } = inputs;\n    if (input.dtype !== 'string') {\n        throw new Error('Input must be of datatype string');\n    }\n    if (input.shape.length !== 1) {\n        throw new Error(`Input must be a vector, got shape: ${input.shape}`);\n    }\n    if (delimiter.shape.length !== 0) {\n        throw new Error(`Delimiter must be a scalar, got shape: ${delimiter.shape}`);\n    }\n    const $input = backend.readSync(input.dataId);\n    const $delimiter = backend.readSync(delimiter.dataId)[0];\n    const [indices, values, shape] = stringSplitImplCPU($input, $delimiter, skipEmpty);\n    const outputSize = values.length;\n    return [\n        backend.makeTensorInfo([outputSize, 2], 'int32', indices),\n        backend.makeTensorInfo([outputSize], 'string', values),\n        backend.makeTensorInfo([2], 'int32', new Int32Array(shape))\n    ];\n}\nexport const stringSplitConfig = {\n    kernelName: StringSplit,\n    backendName: 'webgl',\n    kernelFunc: stringSplit,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nU3BsaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL2tlcm5lbHMvU3RyaW5nU3BsaXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7Ozs7OztHQWVHO0FBRUgsT0FBTyxFQUEyQixXQUFXLEVBQWtELE1BQU0sdUJBQXVCLENBQUM7QUFHN0gsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFMUQsTUFBTSxVQUFVLFdBQVcsQ0FBQyxJQUkzQjtJQUNDLE1BQU0sRUFBQyxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsU0FBUyxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQzFCLE1BQU0sRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBRWxDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxRQUFRLEVBQUU7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO0tBQ3JEO0lBQ0QsSUFBSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7UUFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7S0FDdEU7SUFDRCxJQUFJLFNBQVMsQ0FBQyxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNoQyxNQUFNLElBQUksS0FBSyxDQUNYLDBDQUEwQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztLQUNsRTtJQUVELE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBaUIsQ0FBQztJQUM5RCxNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQWUsQ0FBQztJQUV2RSxNQUFNLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxLQUFLLENBQUMsR0FDMUIsa0JBQWtCLENBQUMsTUFBTSxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUN0RCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQ2pDLE9BQU87UUFDTCxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUM7UUFDekQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxFQUFFLFFBQVEsRUFBRSxNQUFNLENBQUM7UUFDdEQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUM1RCxDQUFDO0FBQ0osQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFpQjtJQUM3QyxVQUFVLEVBQUUsV0FBVztJQUN2QixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsV0FBK0I7Q0FDNUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIFN0cmluZ1NwbGl0LCBTdHJpbmdTcGxpdEF0dHJzLCBTdHJpbmdTcGxpdElucHV0cywgVGVuc29ySW5mb30gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7c3RyaW5nU3BsaXRJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcblxuZXhwb3J0IGZ1bmN0aW9uIHN0cmluZ1NwbGl0KGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdTcGxpdElucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFN0cmluZ1NwbGl0QXR0cnNcbn0pOiBbVGVuc29ySW5mbywgVGVuc29ySW5mbywgVGVuc29ySW5mb10ge1xuICBjb25zdCB7aW5wdXRzLCBiYWNrZW5kLCBhdHRyc30gPSBhcmdzO1xuICBjb25zdCB7c2tpcEVtcHR5fSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXQsIGRlbGltaXRlcn0gPSBpbnB1dHM7XG5cbiAgaWYgKGlucHV0LmR0eXBlICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcignSW5wdXQgbXVzdCBiZSBvZiBkYXRhdHlwZSBzdHJpbmcnKTtcbiAgfVxuICBpZiAoaW5wdXQuc2hhcGUubGVuZ3RoICE9PSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnB1dCBtdXN0IGJlIGEgdmVjdG9yLCBnb3Qgc2hhcGU6ICR7aW5wdXQuc2hhcGV9YCk7XG4gIH1cbiAgaWYgKGRlbGltaXRlci5zaGFwZS5sZW5ndGggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBEZWxpbWl0ZXIgbXVzdCBiZSBhIHNjYWxhciwgZ290IHNoYXBlOiAke2RlbGltaXRlci5zaGFwZX1gKTtcbiAgfVxuXG4gIGNvbnN0ICRpbnB1dCA9IGJhY2tlbmQucmVhZFN5bmMoaW5wdXQuZGF0YUlkKSBhcyBVaW50OEFycmF5W107XG4gIGNvbnN0ICRkZWxpbWl0ZXIgPSBiYWNrZW5kLnJlYWRTeW5jKGRlbGltaXRlci5kYXRhSWQpWzBdIGFzIFVpbnQ4QXJyYXk7XG5cbiAgY29uc3QgW2luZGljZXMsIHZhbHVlcywgc2hhcGVdID1cbiAgICAgIHN0cmluZ1NwbGl0SW1wbENQVSgkaW5wdXQsICRkZWxpbWl0ZXIsIHNraXBFbXB0eSk7XG4gIGNvbnN0IG91dHB1dFNpemUgPSB2YWx1ZXMubGVuZ3RoO1xuICByZXR1cm4gW1xuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW291dHB1dFNpemUsIDJdLCAnaW50MzInLCBpbmRpY2VzKSxcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKFtvdXRwdXRTaXplXSwgJ3N0cmluZycsIHZhbHVlcyksXG4gICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhbMl0sICdpbnQzMicsIG5ldyBJbnQzMkFycmF5KHNoYXBlKSlcbiAgXTtcbn1cblxuZXhwb3J0IGNvbnN0IHN0cmluZ1NwbGl0Q29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFN0cmluZ1NwbGl0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaW5nU3BsaXQgYXMge30gYXMgS2VybmVsRnVuYyxcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { StringToHashBucketFast } from '@tensorflow/tfjs-core';\nimport { stringToHashBucketFastImplCPU } from '../kernel_utils/shared';\nexport function stringToHashBucketFast(args) {\n    const { inputs, backend, attrs } = args;\n    const { numBuckets } = attrs;\n    const { input } = inputs;\n    if (input.dtype !== 'string') {\n        throw new Error('Input must be of datatype string');\n    }\n    if (numBuckets <= 0) {\n        throw new Error(`Number of buckets must be at least 1`);\n    }\n    const $input = backend.readSync(input.dataId);\n    const output = stringToHashBucketFastImplCPU($input, numBuckets);\n    return backend.makeTensorInfo(input.shape, 'int32', output);\n}\nexport const stringToHashBucketFastConfig = {\n    kernelName: StringToHashBucketFast,\n    backendName: 'webgl',\n    kernelFunc: stringToHashBucketFast,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU3RyaW5nVG9IYXNoQnVja2V0RmFzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBMkIsc0JBQXNCLEVBQXdFLE1BQU0sdUJBQXVCLENBQUM7QUFHOUosT0FBTyxFQUFDLDZCQUE2QixFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFFckUsTUFBTSxVQUFVLHNCQUFzQixDQUFDLElBSXRDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxVQUFVLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFDM0IsTUFBTSxFQUFDLEtBQUssRUFBQyxHQUFHLE1BQU0sQ0FBQztJQUV2QixJQUFJLEtBQUssQ0FBQyxLQUFLLEtBQUssUUFBUSxFQUFFO1FBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztLQUNyRDtJQUNELElBQUksVUFBVSxJQUFJLENBQUMsRUFBRTtRQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLHNDQUFzQyxDQUFDLENBQUM7S0FDekQ7SUFFRCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQWlCLENBQUM7SUFFOUQsTUFBTSxNQUFNLEdBQUcsNkJBQTZCLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sT0FBTyxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztBQUM5RCxDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sNEJBQTRCLEdBQWlCO0lBQ3hELFVBQVUsRUFBRSxzQkFBc0I7SUFDbEMsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLHNCQUEwQztDQUN2RCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgU3RyaW5nVG9IYXNoQnVja2V0RmFzdCwgU3RyaW5nVG9IYXNoQnVja2V0RmFzdEF0dHJzLCBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW5wdXRzLCBUZW5zb3JJbmZvfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtzdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW1wbENQVX0gZnJvbSAnLi4va2VybmVsX3V0aWxzL3NoYXJlZCc7XG5cbmV4cG9ydCBmdW5jdGlvbiBzdHJpbmdUb0hhc2hCdWNrZXRGYXN0KGFyZ3M6IHtcbiAgaW5wdXRzOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0SW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogU3RyaW5nVG9IYXNoQnVja2V0RmFzdEF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHtudW1CdWNrZXRzfSA9IGF0dHJzO1xuICBjb25zdCB7aW5wdXR9ID0gaW5wdXRzO1xuXG4gIGlmIChpbnB1dC5kdHlwZSAhPT0gJ3N0cmluZycpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IG11c3QgYmUgb2YgZGF0YXR5cGUgc3RyaW5nJyk7XG4gIH1cbiAgaWYgKG51bUJ1Y2tldHMgPD0gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihgTnVtYmVyIG9mIGJ1Y2tldHMgbXVzdCBiZSBhdCBsZWFzdCAxYCk7XG4gIH1cblxuICBjb25zdCAkaW5wdXQgPSBiYWNrZW5kLnJlYWRTeW5jKGlucHV0LmRhdGFJZCkgYXMgVWludDhBcnJheVtdO1xuXG4gIGNvbnN0IG91dHB1dCA9IHN0cmluZ1RvSGFzaEJ1Y2tldEZhc3RJbXBsQ1BVKCRpbnB1dCwgbnVtQnVja2V0cyk7XG4gIHJldHVybiBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKGlucHV0LnNoYXBlLCAnaW50MzInLCBvdXRwdXQpO1xufVxuXG5leHBvcnQgY29uc3Qgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBTdHJpbmdUb0hhc2hCdWNrZXRGYXN0LFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogc3RyaW5nVG9IYXNoQnVja2V0RmFzdCBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tan } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst TAN = `return tan(x);`;\nexport const tan = unaryKernelFunc({ opSnippet: TAN });\nexport const tanConfig = {\n    kernelName: Tan,\n    backendName: 'webgl',\n    kernelFunc: tan,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Rhbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQWUsR0FBRyxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFFeEQsT0FBTyxFQUFDLGVBQWUsRUFBQyxNQUFNLG9DQUFvQyxDQUFDO0FBRW5FLE1BQU0sR0FBRyxHQUFHLGdCQUFnQixDQUFDO0FBRTdCLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRyxlQUFlLENBQUMsRUFBQyxTQUFTLEVBQUUsR0FBRyxFQUFDLENBQUMsQ0FBQztBQUVyRCxNQUFNLENBQUMsTUFBTSxTQUFTLEdBQWlCO0lBQ3JDLFVBQVUsRUFBRSxHQUFHO0lBQ2YsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLEdBQUc7Q0FDaEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtLZXJuZWxDb25maWcsIFRhbn0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHt1bmFyeUtlcm5lbEZ1bmN9IGZyb20gJy4uL2tlcm5lbF91dGlscy9rZXJuZWxfZnVuY3NfdXRpbHMnO1xuXG5jb25zdCBUQU4gPSBgcmV0dXJuIHRhbih4KTtgO1xuXG5leHBvcnQgY29uc3QgdGFuID0gdW5hcnlLZXJuZWxGdW5jKHtvcFNuaXBwZXQ6IFRBTn0pO1xuXG5leHBvcnQgY29uc3QgdGFuQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRhbixcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHRhbixcbn07XG4iXX0=","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Tanh } from '@tensorflow/tfjs-core';\nimport { unaryKernelFunc } from '../kernel_utils/kernel_funcs_utils';\nconst TANH = `\n  float e2x = exp(-2.0 * abs(x));\n  return sign(x) * (1.0 - e2x) / (1.0 + e2x);\n`;\nexport const tanh = unaryKernelFunc({ opSnippet: TANH });\nexport const tanhConfig = {\n    kernelName: Tanh,\n    backendName: 'webgl',\n    kernelFunc: tanh,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGFuaC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9UYW5oLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBZSxJQUFJLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUN6RCxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFFbkUsTUFBTSxJQUFJLEdBQUc7OztDQUdaLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxJQUFJLEdBQUcsZUFBZSxDQUFDLEVBQUMsU0FBUyxFQUFFLElBQUksRUFBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgVGFuaH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7dW5hcnlLZXJuZWxGdW5jfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMva2VybmVsX2Z1bmNzX3V0aWxzJztcblxuY29uc3QgVEFOSCA9IGBcbiAgZmxvYXQgZTJ4ID0gZXhwKC0yLjAgKiBhYnMoeCkpO1xuICByZXR1cm4gc2lnbih4KSAqICgxLjAgLSBlMngpIC8gKDEuMCArIGUyeCk7XG5gO1xuXG5leHBvcnQgY29uc3QgdGFuaCA9IHVuYXJ5S2VybmVsRnVuYyh7b3BTbmlwcGV0OiBUQU5IfSk7XG5cbmV4cG9ydCBjb25zdCB0YW5oQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRhbmgsXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0YW5oLFxufTtcbiJdfQ==","/**\n * @license\n * Copyright 2017 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { getCoordsDataType } from './shader_compiler';\nexport class TileProgram {\n    constructor(aShape, reps) {\n        this.variableNames = ['A'];\n        const outputShape = new Array(aShape.length);\n        for (let i = 0; i < outputShape.length; i++) {\n            outputShape[i] = aShape[i] * reps[i];\n        }\n        this.outputShape = outputShape;\n        this.rank = outputShape.length;\n        const dtype = getCoordsDataType(this.rank);\n        const sourceCoords = getSourceCoords(aShape);\n        this.userCode = `\n      void main() {\n        ${dtype} resRC = getOutputCoords();\n        setOutput(getA(${sourceCoords}));\n      }\n    `;\n    }\n}\nfunction getSourceCoords(aShape) {\n    const rank = aShape.length;\n    if (rank > 5) {\n        throw Error(`Tile for rank ${rank} is not yet supported`);\n    }\n    if (rank === 1) {\n        return `imod(resRC, ${aShape[0]})`;\n    }\n    const currentCoords = ['resRC.x', 'resRC.y', 'resRC.z', 'resRC.w', 'resRC.u'];\n    const sourceCoords = [];\n    for (let i = 0; i < aShape.length; i++) {\n        sourceCoords.push(`imod(${currentCoords[i]}, ${aShape[i]})`);\n    }\n    return sourceCoords.join();\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGlsZV9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3RpbGVfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUdILE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRXBELE1BQU0sT0FBTyxXQUFXO0lBTXRCLFlBQVksTUFBZ0IsRUFBRSxJQUFjO1FBTDVDLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQU1wQixNQUFNLFdBQVcsR0FBYSxJQUFJLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDdkQsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7WUFDM0MsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDdEM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztRQUMvQixJQUFJLENBQUMsSUFBSSxHQUFHLFdBQVcsQ0FBQyxNQUFNLENBQUM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNDLE1BQU0sWUFBWSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU3QyxJQUFJLENBQUMsUUFBUSxHQUFHOztVQUVWLEtBQUs7eUJBQ1UsWUFBWTs7S0FFaEMsQ0FBQztJQUNKLENBQUM7Q0FDRjtBQUVELFNBQVMsZUFBZSxDQUFDLE1BQWdCO0lBQ3ZDLE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDM0IsSUFBSSxJQUFJLEdBQUcsQ0FBQyxFQUFFO1FBQ1osTUFBTSxLQUFLLENBQUMsaUJBQWlCLElBQUksdUJBQXVCLENBQUMsQ0FBQztLQUMzRDtJQUNELElBQUksSUFBSSxLQUFLLENBQUMsRUFBRTtRQUNkLE9BQU8sZUFBZSxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztLQUNwQztJQUVELE1BQU0sYUFBYSxHQUFHLENBQUMsU0FBUyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0lBRTlFLE1BQU0sWUFBWSxHQUFHLEVBQUUsQ0FBQztJQUN4QixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUN0QyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDOUQ7SUFDRCxPQUFPLFlBQVksQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUM3QixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7Z2V0Q29vcmRzRGF0YVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuZXhwb3J0IGNsYXNzIFRpbGVQcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnQSddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIHJhbms6IG51bWJlcjtcblxuICBjb25zdHJ1Y3RvcihhU2hhcGU6IG51bWJlcltdLCByZXBzOiBudW1iZXJbXSkge1xuICAgIGNvbnN0IG91dHB1dFNoYXBlOiBudW1iZXJbXSA9IG5ldyBBcnJheShhU2hhcGUubGVuZ3RoKTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG91dHB1dFNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvdXRwdXRTaGFwZVtpXSA9IGFTaGFwZVtpXSAqIHJlcHNbaV07XG4gICAgfVxuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRwdXRTaGFwZTtcbiAgICB0aGlzLnJhbmsgPSBvdXRwdXRTaGFwZS5sZW5ndGg7XG4gICAgY29uc3QgZHR5cGUgPSBnZXRDb29yZHNEYXRhVHlwZSh0aGlzLnJhbmspO1xuICAgIGNvbnN0IHNvdXJjZUNvb3JkcyA9IGdldFNvdXJjZUNvb3JkcyhhU2hhcGUpO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgJHtkdHlwZX0gcmVzUkMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgc2V0T3V0cHV0KGdldEEoJHtzb3VyY2VDb29yZHN9KSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXRTb3VyY2VDb29yZHMoYVNoYXBlOiBudW1iZXJbXSk6IHN0cmluZyB7XG4gIGNvbnN0IHJhbmsgPSBhU2hhcGUubGVuZ3RoO1xuICBpZiAocmFuayA+IDUpIHtcbiAgICB0aHJvdyBFcnJvcihgVGlsZSBmb3IgcmFuayAke3Jhbmt9IGlzIG5vdCB5ZXQgc3VwcG9ydGVkYCk7XG4gIH1cbiAgaWYgKHJhbmsgPT09IDEpIHtcbiAgICByZXR1cm4gYGltb2QocmVzUkMsICR7YVNoYXBlWzBdfSlgO1xuICB9XG5cbiAgY29uc3QgY3VycmVudENvb3JkcyA9IFsncmVzUkMueCcsICdyZXNSQy55JywgJ3Jlc1JDLnonLCAncmVzUkMudycsICdyZXNSQy51J107XG5cbiAgY29uc3Qgc291cmNlQ29vcmRzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYVNoYXBlLmxlbmd0aDsgaSsrKSB7XG4gICAgc291cmNlQ29vcmRzLnB1c2goYGltb2QoJHtjdXJyZW50Q29vcmRzW2ldfSwgJHthU2hhcGVbaV19KWApO1xuICB9XG4gIHJldHVybiBzb3VyY2VDb29yZHMuam9pbigpO1xufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { buffer, Tile, util } from '@tensorflow/tfjs-core';\nimport { tileImplCPU } from '../kernel_utils/shared';\nimport { TileProgram } from '../tile_gpu';\nexport function tile(params) {\n    const { inputs, backend, attrs } = params;\n    const { x } = inputs;\n    const { reps } = attrs;\n    // tile gpu program cannot handle rank > 5 case.\n    if (x.dtype === 'string' || x.shape.length > 5) {\n        // Even thought string tensor is always on CPU, just to be consistent on how\n        // to access tensor data.\n        const data = backend.readSync(x.dataId);\n        const value = x.dtype === 'string' ?\n            data.map(d => util.decodeString(d)) :\n            data;\n        const buf = buffer(x.shape, x.dtype, value);\n        const outBuf = tileImplCPU(buf, reps);\n        return backend.makeTensorInfo(outBuf.shape, outBuf.dtype, outBuf.values);\n    }\n    const program = new TileProgram(x.shape, reps);\n    const output = backend.runWebGLProgram(program, [x], x.dtype);\n    return output;\n}\nexport const tileConfig = {\n    kernelName: Tile,\n    backendName: 'webgl',\n    kernelFunc: tile,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVGlsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9UaWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxNQUFNLEVBQXdDLElBQUksRUFBcUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHbEksT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFeEMsTUFBTSxVQUFVLElBQUksQ0FDaEIsTUFBeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ3hDLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsTUFBTSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVyQixnREFBZ0Q7SUFDaEQsSUFBSSxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7UUFDOUMsNEVBQTRFO1FBQzVFLHlCQUF5QjtRQUN6QixNQUFNLElBQUksR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QyxNQUFNLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxLQUFLLFFBQVEsQ0FBQyxDQUFDO1lBQy9CLElBQXFCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdkQsSUFBa0IsQ0FBQztRQUN2QixNQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDdEMsT0FBTyxPQUFPLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUM7S0FDMUU7SUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQy9DLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRTlELE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWlCO0lBQ3RDLFVBQVUsRUFBRSxJQUFJO0lBQ2hCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxJQUF3QjtDQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2J1ZmZlciwgS2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBUaWxlLCBUaWxlQXR0cnMsIFRpbGVJbnB1dHMsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3RpbGVJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7VGlsZVByb2dyYW19IGZyb20gJy4uL3RpbGVfZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHRpbGUoXG4gICAgcGFyYW1zOiB7aW5wdXRzOiBUaWxlSW5wdXRzLCBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLCBhdHRyczogVGlsZUF0dHJzfSk6XG4gICAgVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IHBhcmFtcztcbiAgY29uc3Qge3h9ID0gaW5wdXRzO1xuICBjb25zdCB7cmVwc30gPSBhdHRycztcblxuICAvLyB0aWxlIGdwdSBwcm9ncmFtIGNhbm5vdCBoYW5kbGUgcmFuayA+IDUgY2FzZS5cbiAgaWYgKHguZHR5cGUgPT09ICdzdHJpbmcnIHx8IHguc2hhcGUubGVuZ3RoID4gNSkge1xuICAgIC8vIEV2ZW4gdGhvdWdodCBzdHJpbmcgdGVuc29yIGlzIGFsd2F5cyBvbiBDUFUsIGp1c3QgdG8gYmUgY29uc2lzdGVudCBvbiBob3dcbiAgICAvLyB0byBhY2Nlc3MgdGVuc29yIGRhdGEuXG4gICAgY29uc3QgZGF0YSA9IGJhY2tlbmQucmVhZFN5bmMoeC5kYXRhSWQpO1xuICAgIGNvbnN0IHZhbHVlID0geC5kdHlwZSA9PT0gJ3N0cmluZycgP1xuICAgICAgICAoZGF0YSBhcyBVaW50OEFycmF5W10pLm1hcChkID0+IHV0aWwuZGVjb2RlU3RyaW5nKGQpKSA6XG4gICAgICAgIGRhdGEgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBidWYgPSBidWZmZXIoeC5zaGFwZSwgeC5kdHlwZSwgdmFsdWUpO1xuICAgIGNvbnN0IG91dEJ1ZiA9IHRpbGVJbXBsQ1BVKGJ1ZiwgcmVwcyk7XG4gICAgcmV0dXJuIGJhY2tlbmQubWFrZVRlbnNvckluZm8ob3V0QnVmLnNoYXBlLCBvdXRCdWYuZHR5cGUsIG91dEJ1Zi52YWx1ZXMpO1xuICB9XG5cbiAgY29uc3QgcHJvZ3JhbSA9IG5ldyBUaWxlUHJvZ3JhbSh4LnNoYXBlLCByZXBzKTtcbiAgY29uc3Qgb3V0cHV0ID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW3hdLCB4LmR0eXBlKTtcblxuICByZXR1cm4gb3V0cHV0O1xufVxuXG5leHBvcnQgY29uc3QgdGlsZUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUaWxlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdGlsZSBhcyB7fSBhcyBLZXJuZWxGdW5jLFxufTtcbiJdfQ==","// Based on Algorithm 2 of Bitonic Top K, ref:\n// https://anilshanbhag.in/static/papers/gputopk_sigmod18.pdf\n// The original algorithm is based on computing the top K only, however\n// since for TFJS we require the indices of the top K values as well then the\n// algorithm found here is a bit modified. Rather than producing the values\n// at each step, the indices containing the top K are generated instead.\n// The output values are not generated to reduce the number of outputs in the\n// GPU, the values can easily be retrieved from the indices using a gather\n// op.\nexport class SwapProgram {\n    /**\n     * @param shape desired output shape (can be larger than input shape, output\n     *                                    will be padded with -Infinity)\n     */\n    constructor(shape) {\n        this.variableNames = ['x', 'indices'];\n        // |n| Size of the original input of TopK.\n        // |firstPass|indicates if this is the first time swap is being used which\n        // means no indices input containing the top K is present yet.\n        // |inc| Swaps pairs of indices (0, inc), (1, inc + 1), (2, inc + 2) ...\n        this.customUniforms = [\n            { name: 'n', type: 'int' },\n            { name: 'firstPass', type: 'int' },\n            { name: 'negativeInf', type: 'float' },\n            { name: 'dir', type: 'int' },\n            { name: 'inc', type: 'int' }\n        ];\n        this.outputShape = shape;\n        this.userCode = `\n       void main() {\n         ivec2 coords = getOutputCoords();\n         int batch = coords[0];\n         int elemIdx = coords[1];\n\n         // We compare elements pair-wise within a group of size 2 * inc.\n         // The comparing rule for each group alternates between ascending\n         // and descending. Within each group, we compare each pair at\n         // positions i and i+inc. To decide whether an element at position i\n         // is x0 or x1, we mod it by 2 * inc, if the result is smaller than\n         // inc, it is in the first half of the group, we denote it as x0,\n         // otherwise we denote it as x1.\n         // For example, as shown in the Bitonic top K paper referenced above,\n         // Figure5(a) shows that element[1] is in the\n         // second half of the group when group size is 2, but it is in the\n         // first half of the group when group size is 4.\n\n         bool isFirstInPair = imod(elemIdx, 2 * inc) < inc;\n         int i = isFirstInPair ? elemIdx : elemIdx - inc;\n\n         int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n         int i1 = firstPass == 1 ? i + inc : int(getIndices(batch, i + inc));\n         float x0 = i0 < n ? getX(batch, i0) : negativeInf;\n         float x1 = i1 < n ? getX(batch, i1) : negativeInf;\n\n         // Denotes which direction indices are in (ascending or descending).\n         bool reverse = imod(elemIdx, 2 * dir) >= dir;\n         bool isGreater = x0 > x1 || (x0 == x1 && i1 > i0);\n         if (reverse == isGreater) { // Elements in opposite order of direction\n           int iTemp = i0;\n           i0 = i1;\n           i1 = iTemp;\n         }\n         if (isFirstInPair) {\n            setOutput(float(i0));\n         } else {\n            setOutput(float(i1));\n         }\n       }\n     `;\n    }\n}\nexport class MergeProgram {\n    /**\n     * @param shape desired output shape (must be half of the input size)\n     */\n    constructor(shape) {\n        this.variableNames = ['x', 'indices'];\n        // |n| Size of the original input of TopK\n        // |firstPass| indicates if this is the first time swap is being used which\n        // means no indices input containing the top K is present yet.\n        // |k| Top k elements desired\n        this.customUniforms = [\n            { name: 'n', type: 'int' },\n            { name: 'firstPass', type: 'int' },\n            { name: 'k', type: 'int' }\n        ];\n        this.outputShape = shape;\n        this.userCode = `\n    void main() {\n         // Takes max of indices (0, k), (1, k + 1), (2, k + 2) ...\n         ivec2 coords = getOutputCoords();\n         int batch = coords[0];\n         int elemIdx = coords[1];\n\n         // The output size is half of the previous size.\n         // If the previous sequence is | | | | _ _ _ _  | | | |  _ _ _ _ (k=4),\n         // we only need to output the indices at positions |, the indices at\n         // positions _ can be thrown away, see Figure5(b) After Phase 2\n         // (Merge phase) in the Bitonic Top K paper referenced above.\n         // For example, the paper shows we only need to output the orange bars.\n         // The output sequence should look like this | | | | | | | |.\n         // Because the sequence is halved, to map the output index back\n         // to the previous sequence to find the corresponding value,\n         // we need to double the index. When we double the index,\n         // we basically interpolate a position, so 2i looks like\n         // | _ | _ | _ | _ | _ | _ | _. We move the | to the first k position\n         // of each 2k positions by - elemIdx % k. E.g. for output at\n         // index 4,5,6,7, we want to get the corresponding element at\n         // original index 8,9,10,11, for output at index 8,9,10,11,\n         // we want to get the corresponding element at original index\n         // 16,17,18,19, so on and so forth.\n\n         int i = elemIdx < k ? elemIdx : (elemIdx * 2 - imod(elemIdx, k));\n         int i0 = firstPass == 1 ? i : int(getIndices(batch, i));\n         int i1 = firstPass == 1 ? i + k : int(getIndices(batch, i + k));\n\n         float x0 = getX(batch, i0);\n         float x1 = i1 < n ? getX(batch, i1) : x0;\n\n         setOutput(x0 >= x1 ? float(i0) : float(i1));\n       }\n     `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidG9wX2tfZ3B1LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy90b3Bfa19ncHUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBbUJBLDhDQUE4QztBQUM5Qyw2REFBNkQ7QUFDN0QsdUVBQXVFO0FBQ3ZFLDZFQUE2RTtBQUM3RSwyRUFBMkU7QUFDM0Usd0VBQXdFO0FBQ3hFLDZFQUE2RTtBQUM3RSwwRUFBMEU7QUFDMUUsTUFBTTtBQUNOLE1BQU0sT0FBTyxXQUFXO0lBZ0J0Qjs7O09BR0c7SUFDSCxZQUFZLEtBQWU7UUFuQjNCLGtCQUFhLEdBQUcsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFHakMsMENBQTBDO1FBQzFDLDBFQUEwRTtRQUMxRSw4REFBOEQ7UUFDOUQsd0VBQXdFO1FBQ3hFLG1CQUFjLEdBQUc7WUFDZixFQUFDLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLEtBQW9CLEVBQUM7WUFDdkMsRUFBQyxJQUFJLEVBQUUsV0FBVyxFQUFFLElBQUksRUFBRSxLQUFvQixFQUFDO1lBQy9DLEVBQUMsSUFBSSxFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUUsT0FBc0IsRUFBQztZQUNuRCxFQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLEtBQW9CLEVBQUM7WUFDekMsRUFBQyxJQUFJLEVBQUUsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFvQixFQUFDO1NBQzFDLENBQUM7UUFPQSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Bd0NkLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sWUFBWTtJQWN2Qjs7T0FFRztJQUNILFlBQVksS0FBZTtRQWhCM0Isa0JBQWEsR0FBRyxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUdqQyx5Q0FBeUM7UUFDekMsMkVBQTJFO1FBQzNFLDhEQUE4RDtRQUM5RCw2QkFBNkI7UUFDN0IsbUJBQWMsR0FBRztZQUNmLEVBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsS0FBb0IsRUFBQztZQUN2QyxFQUFDLElBQUksRUFBRSxXQUFXLEVBQUUsSUFBSSxFQUFFLEtBQW9CLEVBQUM7WUFDL0MsRUFBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxLQUFvQixFQUFDO1NBQ3hDLENBQUM7UUFNQSxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUV6QixJQUFJLENBQUMsUUFBUSxHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O01Ba0NkLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMSBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5pbXBvcnQge0dQR1BVUHJvZ3JhbX0gZnJvbSAnLi9ncGdwdV9tYXRoJztcbmltcG9ydCB7VW5pZm9ybVR5cGV9IGZyb20gJy4vc2hhZGVyX2NvbXBpbGVyJztcblxuLy8gQmFzZWQgb24gQWxnb3JpdGhtIDIgb2YgQml0b25pYyBUb3AgSywgcmVmOlxuLy8gaHR0cHM6Ly9hbmlsc2hhbmJoYWcuaW4vc3RhdGljL3BhcGVycy9ncHV0b3BrX3NpZ21vZDE4LnBkZlxuLy8gVGhlIG9yaWdpbmFsIGFsZ29yaXRobSBpcyBiYXNlZCBvbiBjb21wdXRpbmcgdGhlIHRvcCBLIG9ubHksIGhvd2V2ZXJcbi8vIHNpbmNlIGZvciBURkpTIHdlIHJlcXVpcmUgdGhlIGluZGljZXMgb2YgdGhlIHRvcCBLIHZhbHVlcyBhcyB3ZWxsIHRoZW4gdGhlXG4vLyBhbGdvcml0aG0gZm91bmQgaGVyZSBpcyBhIGJpdCBtb2RpZmllZC4gUmF0aGVyIHRoYW4gcHJvZHVjaW5nIHRoZSB2YWx1ZXNcbi8vIGF0IGVhY2ggc3RlcCwgdGhlIGluZGljZXMgY29udGFpbmluZyB0aGUgdG9wIEsgYXJlIGdlbmVyYXRlZCBpbnN0ZWFkLlxuLy8gVGhlIG91dHB1dCB2YWx1ZXMgYXJlIG5vdCBnZW5lcmF0ZWQgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygb3V0cHV0cyBpbiB0aGVcbi8vIEdQVSwgdGhlIHZhbHVlcyBjYW4gZWFzaWx5IGJlIHJldHJpZXZlZCBmcm9tIHRoZSBpbmRpY2VzIHVzaW5nIGEgZ2F0aGVyXG4vLyBvcC5cbmV4cG9ydCBjbGFzcyBTd2FwUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLLlxuICAvLyB8Zmlyc3RQYXNzfGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAvLyB8aW5jfCBTd2FwcyBwYWlycyBvZiBpbmRpY2VzICgwLCBpbmMpLCAoMSwgaW5jICsgMSksICgyLCBpbmMgKyAyKSAuLi5cbiAgY3VzdG9tVW5pZm9ybXMgPSBbXG4gICAge25hbWU6ICduJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnZmlyc3RQYXNzJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9LFxuICAgIHtuYW1lOiAnbmVnYXRpdmVJbmYnLCB0eXBlOiAnZmxvYXQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ2RpcicsIHR5cGU6ICdpbnQnIGFzIFVuaWZvcm1UeXBlfSxcbiAgICB7bmFtZTogJ2luYycsIHR5cGU6ICdpbnQnIGFzIFVuaWZvcm1UeXBlfVxuICBdO1xuXG4gIC8qKlxuICAgKiBAcGFyYW0gc2hhcGUgZGVzaXJlZCBvdXRwdXQgc2hhcGUgKGNhbiBiZSBsYXJnZXIgdGhhbiBpbnB1dCBzaGFwZSwgb3V0cHV0XG4gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBwYWRkZWQgd2l0aCAtSW5maW5pdHkpXG4gICAqL1xuICBjb25zdHJ1Y3RvcihzaGFwZTogbnVtYmVyW10pIHtcbiAgICB0aGlzLm91dHB1dFNoYXBlID0gc2hhcGU7XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgIHZvaWQgbWFpbigpIHtcbiAgICAgICAgIGl2ZWMyIGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgaW50IGVsZW1JZHggPSBjb29yZHNbMV07XG5cbiAgICAgICAgIC8vIFdlIGNvbXBhcmUgZWxlbWVudHMgcGFpci13aXNlIHdpdGhpbiBhIGdyb3VwIG9mIHNpemUgMiAqIGluYy5cbiAgICAgICAgIC8vIFRoZSBjb21wYXJpbmcgcnVsZSBmb3IgZWFjaCBncm91cCBhbHRlcm5hdGVzIGJldHdlZW4gYXNjZW5kaW5nXG4gICAgICAgICAvLyBhbmQgZGVzY2VuZGluZy4gV2l0aGluIGVhY2ggZ3JvdXAsIHdlIGNvbXBhcmUgZWFjaCBwYWlyIGF0XG4gICAgICAgICAvLyBwb3NpdGlvbnMgaSBhbmQgaStpbmMuIFRvIGRlY2lkZSB3aGV0aGVyIGFuIGVsZW1lbnQgYXQgcG9zaXRpb24gaVxuICAgICAgICAgLy8gaXMgeDAgb3IgeDEsIHdlIG1vZCBpdCBieSAyICogaW5jLCBpZiB0aGUgcmVzdWx0IGlzIHNtYWxsZXIgdGhhblxuICAgICAgICAgLy8gaW5jLCBpdCBpcyBpbiB0aGUgZmlyc3QgaGFsZiBvZiB0aGUgZ3JvdXAsIHdlIGRlbm90ZSBpdCBhcyB4MCxcbiAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBkZW5vdGUgaXQgYXMgeDEuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgYXMgc2hvd24gaW4gdGhlIEJpdG9uaWMgdG9wIEsgcGFwZXIgcmVmZXJlbmNlZCBhYm92ZSxcbiAgICAgICAgIC8vIEZpZ3VyZTUoYSkgc2hvd3MgdGhhdCBlbGVtZW50WzFdIGlzIGluIHRoZVxuICAgICAgICAgLy8gc2Vjb25kIGhhbGYgb2YgdGhlIGdyb3VwIHdoZW4gZ3JvdXAgc2l6ZSBpcyAyLCBidXQgaXQgaXMgaW4gdGhlXG4gICAgICAgICAvLyBmaXJzdCBoYWxmIG9mIHRoZSBncm91cCB3aGVuIGdyb3VwIHNpemUgaXMgNC5cblxuICAgICAgICAgYm9vbCBpc0ZpcnN0SW5QYWlyID0gaW1vZChlbGVtSWR4LCAyICogaW5jKSA8IGluYztcbiAgICAgICAgIGludCBpID0gaXNGaXJzdEluUGFpciA/IGVsZW1JZHggOiBlbGVtSWR4IC0gaW5jO1xuXG4gICAgICAgICBpbnQgaTAgPSBmaXJzdFBhc3MgPT0gMSA/IGkgOiBpbnQoZ2V0SW5kaWNlcyhiYXRjaCwgaSkpO1xuICAgICAgICAgaW50IGkxID0gZmlyc3RQYXNzID09IDEgPyBpICsgaW5jIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBpbmMpKTtcbiAgICAgICAgIGZsb2F0IHgwID0gaTAgPCBuID8gZ2V0WChiYXRjaCwgaTApIDogbmVnYXRpdmVJbmY7XG4gICAgICAgICBmbG9hdCB4MSA9IGkxIDwgbiA/IGdldFgoYmF0Y2gsIGkxKSA6IG5lZ2F0aXZlSW5mO1xuXG4gICAgICAgICAvLyBEZW5vdGVzIHdoaWNoIGRpcmVjdGlvbiBpbmRpY2VzIGFyZSBpbiAoYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcpLlxuICAgICAgICAgYm9vbCByZXZlcnNlID0gaW1vZChlbGVtSWR4LCAyICogZGlyKSA+PSBkaXI7XG4gICAgICAgICBib29sIGlzR3JlYXRlciA9IHgwID4geDEgfHwgKHgwID09IHgxICYmIGkxID4gaTApO1xuICAgICAgICAgaWYgKHJldmVyc2UgPT0gaXNHcmVhdGVyKSB7IC8vIEVsZW1lbnRzIGluIG9wcG9zaXRlIG9yZGVyIG9mIGRpcmVjdGlvblxuICAgICAgICAgICBpbnQgaVRlbXAgPSBpMDtcbiAgICAgICAgICAgaTAgPSBpMTtcbiAgICAgICAgICAgaTEgPSBpVGVtcDtcbiAgICAgICAgIH1cbiAgICAgICAgIGlmIChpc0ZpcnN0SW5QYWlyKSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTApKTtcbiAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZXRPdXRwdXQoZmxvYXQoaTEpKTtcbiAgICAgICAgIH1cbiAgICAgICB9XG4gICAgIGA7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE1lcmdlUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnaW5kaWNlcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG4gIC8vIHxufCBTaXplIG9mIHRoZSBvcmlnaW5hbCBpbnB1dCBvZiBUb3BLXG4gIC8vIHxmaXJzdFBhc3N8IGluZGljYXRlcyBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHN3YXAgaXMgYmVpbmcgdXNlZCB3aGljaFxuICAvLyBtZWFucyBubyBpbmRpY2VzIGlucHV0IGNvbnRhaW5pbmcgdGhlIHRvcCBLIGlzIHByZXNlbnQgeWV0LlxuICAvLyB8a3wgVG9wIGsgZWxlbWVudHMgZGVzaXJlZFxuICBjdXN0b21Vbmlmb3JtcyA9IFtcbiAgICB7bmFtZTogJ24nLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdmaXJzdFBhc3MnLCB0eXBlOiAnaW50JyBhcyBVbmlmb3JtVHlwZX0sXG4gICAge25hbWU6ICdrJywgdHlwZTogJ2ludCcgYXMgVW5pZm9ybVR5cGV9XG4gIF07XG5cbiAgLyoqXG4gICAqIEBwYXJhbSBzaGFwZSBkZXNpcmVkIG91dHB1dCBzaGFwZSAobXVzdCBiZSBoYWxmIG9mIHRoZSBpbnB1dCBzaXplKVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc2hhcGU6IG51bWJlcltdKSB7XG4gICAgdGhpcy5vdXRwdXRTaGFwZSA9IHNoYXBlO1xuXG4gICAgdGhpcy51c2VyQ29kZSA9IGBcbiAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAvLyBUYWtlcyBtYXggb2YgaW5kaWNlcyAoMCwgayksICgxLCBrICsgMSksICgyLCBrICsgMikgLi4uXG4gICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgIGludCBiYXRjaCA9IGNvb3Jkc1swXTtcbiAgICAgICAgIGludCBlbGVtSWR4ID0gY29vcmRzWzFdO1xuXG4gICAgICAgICAvLyBUaGUgb3V0cHV0IHNpemUgaXMgaGFsZiBvZiB0aGUgcHJldmlvdXMgc2l6ZS5cbiAgICAgICAgIC8vIElmIHRoZSBwcmV2aW91cyBzZXF1ZW5jZSBpcyB8IHwgfCB8IF8gXyBfIF8gIHwgfCB8IHwgIF8gXyBfIF8gKGs9NCksXG4gICAgICAgICAvLyB3ZSBvbmx5IG5lZWQgdG8gb3V0cHV0IHRoZSBpbmRpY2VzIGF0IHBvc2l0aW9ucyB8LCB0aGUgaW5kaWNlcyBhdFxuICAgICAgICAgLy8gcG9zaXRpb25zIF8gY2FuIGJlIHRocm93biBhd2F5LCBzZWUgRmlndXJlNShiKSBBZnRlciBQaGFzZSAyXG4gICAgICAgICAvLyAoTWVyZ2UgcGhhc2UpIGluIHRoZSBCaXRvbmljIFRvcCBLIHBhcGVyIHJlZmVyZW5jZWQgYWJvdmUuXG4gICAgICAgICAvLyBGb3IgZXhhbXBsZSwgdGhlIHBhcGVyIHNob3dzIHdlIG9ubHkgbmVlZCB0byBvdXRwdXQgdGhlIG9yYW5nZSBiYXJzLlxuICAgICAgICAgLy8gVGhlIG91dHB1dCBzZXF1ZW5jZSBzaG91bGQgbG9vayBsaWtlIHRoaXMgfCB8IHwgfCB8IHwgfCB8LlxuICAgICAgICAgLy8gQmVjYXVzZSB0aGUgc2VxdWVuY2UgaXMgaGFsdmVkLCB0byBtYXAgdGhlIG91dHB1dCBpbmRleCBiYWNrXG4gICAgICAgICAvLyB0byB0aGUgcHJldmlvdXMgc2VxdWVuY2UgdG8gZmluZCB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSxcbiAgICAgICAgIC8vIHdlIG5lZWQgdG8gZG91YmxlIHRoZSBpbmRleC4gV2hlbiB3ZSBkb3VibGUgdGhlIGluZGV4LFxuICAgICAgICAgLy8gd2UgYmFzaWNhbGx5IGludGVycG9sYXRlIGEgcG9zaXRpb24sIHNvIDJpIGxvb2tzIGxpa2VcbiAgICAgICAgIC8vIHwgXyB8IF8gfCBfIHwgXyB8IF8gfCBfIHwgXy4gV2UgbW92ZSB0aGUgfCB0byB0aGUgZmlyc3QgayBwb3NpdGlvblxuICAgICAgICAgLy8gb2YgZWFjaCAyayBwb3NpdGlvbnMgYnkgLSBlbGVtSWR4ICUgay4gRS5nLiBmb3Igb3V0cHV0IGF0XG4gICAgICAgICAvLyBpbmRleCA0LDUsNiw3LCB3ZSB3YW50IHRvIGdldCB0aGUgY29ycmVzcG9uZGluZyBlbGVtZW50IGF0XG4gICAgICAgICAvLyBvcmlnaW5hbCBpbmRleCA4LDksMTAsMTEsIGZvciBvdXRwdXQgYXQgaW5kZXggOCw5LDEwLDExLFxuICAgICAgICAgLy8gd2Ugd2FudCB0byBnZXQgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBhdCBvcmlnaW5hbCBpbmRleFxuICAgICAgICAgLy8gMTYsMTcsMTgsMTksIHNvIG9uIGFuZCBzbyBmb3J0aC5cblxuICAgICAgICAgaW50IGkgPSBlbGVtSWR4IDwgayA/IGVsZW1JZHggOiAoZWxlbUlkeCAqIDIgLSBpbW9kKGVsZW1JZHgsIGspKTtcbiAgICAgICAgIGludCBpMCA9IGZpcnN0UGFzcyA9PSAxID8gaSA6IGludChnZXRJbmRpY2VzKGJhdGNoLCBpKSk7XG4gICAgICAgICBpbnQgaTEgPSBmaXJzdFBhc3MgPT0gMSA/IGkgKyBrIDogaW50KGdldEluZGljZXMoYmF0Y2gsIGkgKyBrKSk7XG5cbiAgICAgICAgIGZsb2F0IHgwID0gZ2V0WChiYXRjaCwgaTApO1xuICAgICAgICAgZmxvYXQgeDEgPSBpMSA8IG4gPyBnZXRYKGJhdGNoLCBpMSkgOiB4MDtcblxuICAgICAgICAgc2V0T3V0cHV0KHgwID49IHgxID8gZmxvYXQoaTApIDogZmxvYXQoaTEpKTtcbiAgICAgICB9XG4gICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { env, TopK, util } from '@tensorflow/tfjs-core';\nimport { topKImplCPU } from '../kernel_utils/shared';\nimport { MergeProgram, SwapProgram } from '../top_k_gpu';\nimport { fill } from './Fill';\nimport { gatherV2 } from './GatherV2';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nfunction disposeIntermediateTensorInfoOrNull(backend, tensorInfo) {\n    if (tensorInfo !== null) {\n        backend.disposeIntermediateTensorInfo(tensorInfo);\n    }\n}\nfunction roundUpToPow2(num) {\n    let pow2 = 1;\n    while (pow2 < num) {\n        pow2 *= 2;\n    }\n    return pow2;\n}\n// Based on Algorithm 2 of Bitonic Top K, ref:\n// https://anilshanbhag.in/static/papers/gputopk_sigmod18.pdf\nexport function topK(args) {\n    const { inputs, backend, attrs } = args;\n    const { x } = inputs;\n    const { k, sorted } = attrs;\n    // Empirically determined constant used to determine last dim threshold for\n    // handing off execution to the CPU.\n    const TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD = env().getNumber('TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD');\n    // Empirically determined constant used to determine k threshold for handing\n    // off execution to the CPU.\n    const TOPK_K_CPU_HANDOFF_THRESHOLD = env().getNumber('TOPK_K_CPU_HANDOFF_THRESHOLD');\n    const xShape = x.shape;\n    const lastDim = xShape[xShape.length - 1];\n    if (backend.shouldExecuteOnCPU([x]) ||\n        lastDim < TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD ||\n        k > TOPK_K_CPU_HANDOFF_THRESHOLD) {\n        const xVals = backend.readSync(x.dataId);\n        const [allTopKVals, allTopKIndices] = topKImplCPU(xVals, xShape, x.dtype, k, sorted);\n        return [\n            backend.makeTensorInfo(allTopKVals.shape, allTopKVals.dtype, allTopKVals.values),\n            backend.makeTensorInfo(allTopKIndices.shape, allTopKIndices.dtype, allTopKIndices.values)\n        ];\n    }\n    if (k === 0) {\n        xShape[xShape.length - 1] = 0;\n        return [\n            backend.makeTensorInfo(xShape, x.dtype, []),\n            backend.makeTensorInfo(xShape, 'int32', [])\n        ];\n    }\n    if (lastDim === 1 /* firstPass */) {\n        return [\n            x, fill({ attrs: { shape: xShape, dtype: 'int32', value: 0 }, backend })\n        ];\n    }\n    // Eagerly unpack x input since it is passed in to all the shaders which\n    // require unpacked inputs.\n    const xtexData = backend.texData.get(x.dataId);\n    const xIsPacked = xtexData !== null && xtexData.isPacked;\n    const xUnPacked = xIsPacked ? backend.unpackTensor(x) : x;\n    // Reshape into a 2d tensor [batch, lastDim] and compute topk along lastDim.\n    const xSize = util.sizeFromShape(xShape);\n    const batch = xSize / lastDim;\n    const x2D = reshape({ inputs: { x: xUnPacked }, attrs: { shape: [batch, lastDim] }, backend });\n    if (xIsPacked) {\n        disposeIntermediateTensorInfoOrNull(backend, xUnPacked);\n    }\n    const kPow2 = roundUpToPow2(k);\n    const lastDimPow2 = roundUpToPow2(lastDim);\n    // Only the indices containing the top K are kept at every step to reduce\n    // number of outputs in the GPU algorithms, so once the final set of indices\n    // is computed then gather is used to grab the corresponding values\n    // from the original input.\n    let indices = null;\n    // GPU algorithm always takes in an indices input but this input is not used\n    // on the first run of a GPU algorithm, therefore if indices is null we simply\n    // pass in x2D instead of it but the value will not actually be used\n    const getInputs = () => indices === null ? [x2D, x2D] : [x2D, indices];\n    const runSwap = (dir, inc, shape) => {\n        const inputs = getInputs();\n        const program = new SwapProgram(shape);\n        const fistPass = indices === null ? 1 : 0;\n        const customValues = [[lastDim], [fistPass], [Number.NEGATIVE_INFINITY], [dir], [inc]];\n        const prevIndices = indices;\n        indices = backend.runWebGLProgram(program, inputs, 'int32', customValues);\n        disposeIntermediateTensorInfoOrNull(backend, prevIndices);\n    };\n    // Step 1: local sort\n    for (let len = 1; len < kPow2; len *= 2) {\n        const dir = len * 2;\n        for (let inc = len; inc >= 1; inc /= 2) {\n            runSwap(dir, inc, [batch, lastDimPow2]);\n        }\n    }\n    // Step 2: merge\n    for (let indicesSize = lastDimPow2; indicesSize > kPow2; indicesSize /= 2) {\n        const inputs = getInputs();\n        const mergeProgram = new MergeProgram([batch, indicesSize / 2]);\n        const firstPass = indices === null ? 1 : 0;\n        const customValues = [[lastDim], [firstPass], [kPow2]];\n        const prevIndices = indices;\n        indices =\n            backend.runWebGLProgram(mergeProgram, inputs, 'int32', customValues);\n        disposeIntermediateTensorInfoOrNull(backend, prevIndices);\n        // Step 3: rebuild\n        const len = kPow2 / 2;\n        const dir = len * 2;\n        for (let inc = len; inc >= 1; inc /= 2) {\n            runSwap(dir, inc, indices.shape);\n        }\n    }\n    // Keep only the requested top K results instead of kPow2\n    let prevIndices = indices;\n    indices = slice({ inputs: { x: indices }, backend, attrs: { begin: 0, size: [batch, k] } });\n    disposeIntermediateTensorInfoOrNull(backend, prevIndices);\n    // Gather values on last dimension\n    let values = gatherV2({ inputs: { x: x2D, indices }, backend, attrs: { axis: 1, batchDims: 1 } });\n    disposeIntermediateTensorInfoOrNull(backend, x2D);\n    // Reshape back to the original input shape, except that the last\n    // dimension is k.\n    const newShape = xShape.slice(0, -1);\n    newShape.push(k);\n    prevIndices = indices;\n    indices = reshape({ inputs: { x: indices }, attrs: { shape: newShape }, backend });\n    disposeIntermediateTensorInfoOrNull(backend, prevIndices);\n    const prevValues = values;\n    values = reshape({ inputs: { x: values }, attrs: { shape: newShape }, backend });\n    disposeIntermediateTensorInfoOrNull(backend, prevValues);\n    return [values, indices];\n}\nexport const topKConfig = {\n    kernelName: TopK,\n    backendName: 'webgl',\n    kernelFunc: topK\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVG9wSy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMva2VybmVscy9Ub3BLLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUVILE9BQU8sRUFBQyxHQUFHLEVBQXlELElBQUksRUFBcUMsSUFBSSxFQUFDLE1BQU0sdUJBQXVCLENBQUM7QUFHaEosT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFDLE1BQU0sY0FBYyxDQUFDO0FBQ3ZELE9BQU8sRUFBQyxJQUFJLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDNUIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLFlBQVksQ0FBQztBQUNwQyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsU0FBUyxtQ0FBbUMsQ0FDeEMsT0FBeUIsRUFBRSxVQUFzQjtJQUNuRCxJQUFJLFVBQVUsS0FBSyxJQUFJLEVBQUU7UUFDdkIsT0FBTyxDQUFDLDZCQUE2QixDQUFDLFVBQVUsQ0FBQyxDQUFDO0tBQ25EO0FBQ0gsQ0FBQztBQUVELFNBQVMsYUFBYSxDQUFDLEdBQVc7SUFDaEMsSUFBSSxJQUFJLEdBQUcsQ0FBQyxDQUFDO0lBQ2IsT0FBTyxJQUFJLEdBQUcsR0FBRyxFQUFFO1FBQ2pCLElBQUksSUFBSSxDQUFDLENBQUM7S0FDWDtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVELDhDQUE4QztBQUM5Qyw2REFBNkQ7QUFDN0QsTUFBTSxVQUFVLElBQUksQ0FDaEIsSUFBdUU7SUFFekUsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxD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LEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE9BQU8sRUFBQyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBRSxPQUFPLEVBQUMsQ0FBQyxDQUFDO0lBQzdFLG1DQUFtQyxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsQ0FBQztJQUUxRCxNQUFNLFVBQVUsR0FBRyxNQUFNLENBQUM7SUFDMUIsTUFBTSxHQUFHLE9BQU8sQ0FBQyxFQUFDLE1BQU0sRUFBRSxFQUFDLENBQUMsRUFBRSxNQUFNLEVBQUMsRUFBRSxLQUFLLEVBQUUsRUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFDLEVBQUUsT0FBTyxFQUFDLENBQUMsQ0FBQztJQUMzRSxtQ0FBbUMsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFFekQsT0FBTyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFpQjtJQUN0QyxVQUFVLEVBQUUsSUFBSTtJQUNoQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsSUFBd0I7Q0FDckMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtlbnYsIEtlcm5lbENvbmZpZywgS2VybmVsRnVuYywgTnVtZXJpY0RhdGFUeXBlLCBUZW5zb3JJbmZvLCBUb3BLLCBUb3BLQXR0cnMsIFRvcEtJbnB1dHMsIFR5cGVkQXJyYXksIHV0aWx9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3RvcEtJbXBsQ1BVfSBmcm9tICcuLi9rZXJuZWxfdXRpbHMvc2hhcmVkJztcbmltcG9ydCB7TWVyZ2VQcm9ncmFtLCBTd2FwUHJvZ3JhbX0gZnJvbSAnLi4vdG9wX2tfZ3B1JztcbmltcG9ydCB7ZmlsbH0gZnJvbSAnLi9GaWxsJztcbmltcG9ydCB7Z2F0aGVyVjJ9IGZyb20gJy4vR2F0aGVyVjInO1xuaW1wb3J0IHtyZXNoYXBlfSBmcm9tICcuL1Jlc2hhcGUnO1xuaW1wb3J0IHtzbGljZX0gZnJvbSAnLi9TbGljZSc7XG5cbmZ1bmN0aW9uIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKFxuICAgIGJhY2tlbmQ6IE1hdGhCYWNrZW5kV2ViR0wsIHRlbnNvckluZm86IFRlbnNvckluZm8pIHtcbiAgaWYgKHRlbnNvckluZm8gIT09IG51bGwpIHtcbiAgICBiYWNrZW5kLmRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvKHRlbnNvckluZm8pO1xuICB9XG59XG5cbmZ1bmN0aW9uIHJvdW5kVXBUb1BvdzIobnVtOiBudW1iZXIpIHtcbiAgbGV0IHBvdzIgPSAxO1xuICB3aGlsZSAocG93MiA8IG51bSkge1xuICAgIHBvdzIgKj0gMjtcbiAgfVxuICByZXR1cm4gcG93Mjtcbn1cblxuLy8gQmFzZWQgb24gQWxnb3JpdGhtIDIgb2YgQml0b25pYyBUb3AgSywgcmVmOlxuLy8gaHR0cHM6Ly9hbmlsc2hhbmJoYWcuaW4vc3RhdGljL3BhcGVycy9ncHV0b3BrX3NpZ21vZDE4LnBkZlxuZXhwb3J0IGZ1bmN0aW9uIHRvcEsoXG4gICAgYXJnczoge2lucHV0czogVG9wS0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFRvcEtBdHRyc30pOlxuICAgIFRlbnNvckluZm9bXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4fSA9IGlucHV0cztcbiAgY29uc3Qge2ssIHNvcnRlZH0gPSBhdHRycztcblxuICAvLyBFbXBpcmljYWxseSBkZXRlcm1pbmVkIGNvbnN0YW50IHVzZWQgdG8gZGV0ZXJtaW5lIGxhc3QgZGltIHRocmVzaG9sZCBmb3JcbiAgLy8gaGFuZGluZyBvZmYgZXhlY3V0aW9uIHRvIHRoZSBDUFUuXG4gIGNvbnN0IFRPUEtfTEFTVF9ESU1fQ1BVX0hBTkRPRkZfU0laRV9USFJFU0hPTEQgPVxuICAgICAgZW52KCkuZ2V0TnVtYmVyKCdUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEJyk7XG5cbiAgLy8gRW1waXJpY2FsbHkgZGV0ZXJtaW5lZCBjb25zdGFudCB1c2VkIHRvIGRldGVybWluZSBrIHRocmVzaG9sZCBmb3IgaGFuZGluZ1xuICAvLyBvZmYgZXhlY3V0aW9uIHRvIHRoZSBDUFUuXG4gIGNvbnN0IFRPUEtfS19DUFVfSEFORE9GRl9USFJFU0hPTEQgPVxuICAgICAgZW52KCkuZ2V0TnVtYmVyKCdUT1BLX0tfQ1BVX0hBTkRPRkZfVEhSRVNIT0xEJyk7XG5cbiAgY29uc3QgeFNoYXBlID0geC5zaGFwZTtcbiAgY29uc3QgbGFzdERpbSA9IHhTaGFwZVt4U2hhcGUubGVuZ3RoIC0gMV07XG5cbiAgaWYgKGJhY2tlbmQuc2hvdWxkRXhlY3V0ZU9uQ1BVKFt4XSkgfHxcbiAgICAgIGxhc3REaW0gPCBUT1BLX0xBU1RfRElNX0NQVV9IQU5ET0ZGX1NJWkVfVEhSRVNIT0xEIHx8XG4gICAgICBrID4gVE9QS19LX0NQVV9IQU5ET0ZGX1RIUkVTSE9MRCkge1xuICAgIGNvbnN0IHhWYWxzID0gYmFja2VuZC5yZWFkU3luYyh4LmRhdGFJZCkgYXMgVHlwZWRBcnJheTtcbiAgICBjb25zdCBbYWxsVG9wS1ZhbHMsIGFsbFRvcEtJbmRpY2VzXSA9XG4gICAgICAgIHRvcEtJbXBsQ1BVKHhWYWxzLCB4U2hhcGUsIHguZHR5cGUgYXMgTnVtZXJpY0RhdGFUeXBlLCBrLCBzb3J0ZWQpO1xuXG4gICAgcmV0dXJuIFtcbiAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oXG4gICAgICAgICAgYWxsVG9wS1ZhbHMuc2hhcGUsIGFsbFRvcEtWYWxzLmR0eXBlLCBhbGxUb3BLVmFscy52YWx1ZXMpLFxuICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyhcbiAgICAgICAgICBhbGxUb3BLSW5kaWNlcy5zaGFwZSwgYWxsVG9wS0luZGljZXMuZHR5cGUsIGFsbFRvcEtJbmRpY2VzLnZhbHVlcylcbiAgICBdO1xuICB9XG5cbiAgaWYgKGsgPT09IDApIHtcbiAgICB4U2hhcGVbeFNoYXBlLmxlbmd0aCAtIDFdID0gMDtcbiAgICByZXR1cm4gW1xuICAgICAgYmFja2VuZC5tYWtlVGVuc29ySW5mbyh4U2hhcGUsIHguZHR5cGUsIFtdKSxcbiAgICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oeFNoYXBlLCAnaW50MzInLCBbXSlcbiAgICBdO1xuICB9XG5cbiAgaWYgKGxhc3REaW0gPT09IDEgLyogZmlyc3RQYXNzICovKSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIHgsIGZpbGwoe2F0dHJzOiB7c2hhcGU6IHhTaGFwZSwgZHR5cGU6ICdpbnQzMicsIHZhbHVlOiAwfSwgYmFja2VuZH0pXG4gICAgXTtcbiAgfVxuXG4gIC8vIEVhZ2VybHkgdW5wYWNrIHggaW5wdXQgc2luY2UgaXQgaXMgcGFzc2VkIGluIHRvIGFsbCB0aGUgc2hhZGVycyB3aGljaFxuICAvLyByZXF1aXJlIHVucGFja2VkIGlucHV0cy5cbiAgY29uc3QgeHRleERhdGEgPSBiYWNrZW5kLnRleERhdGEuZ2V0KHguZGF0YUlkKTtcbiAgY29uc3QgeElzUGFja2VkID0geHRleERhdGEgIT09IG51bGwgJiYgeHRleERhdGEuaXNQYWNrZWQ7XG4gIGNvbnN0IHhVblBhY2tlZCA9IHhJc1BhY2tlZCA/IGJhY2tlbmQudW5wYWNrVGVuc29yKHgpIDogeDtcblxuICAvLyBSZXNoYXBlIGludG8gYSAyZCB0ZW5zb3IgW2JhdGNoLCBsYXN0RGltXSBhbmQgY29tcHV0ZSB0b3BrIGFsb25nIGxhc3REaW0uXG4gIGNvbnN0IHhTaXplID0gdXRpbC5zaXplRnJvbVNoYXBlKHhTaGFwZSk7XG4gIGNvbnN0IGJhdGNoID0geFNpemUgLyBsYXN0RGltO1xuICBjb25zdCB4MkQgPSByZXNoYXBlKFxuICAgICAge2lucHV0czoge3g6IHhVblBhY2tlZH0sIGF0dHJzOiB7c2hhcGU6IFtiYXRjaCwgbGFzdERpbV19LCBiYWNrZW5kfSk7XG5cbiAgaWYgKHhJc1BhY2tlZCkge1xuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHhVblBhY2tlZCk7XG4gIH1cblxuICBjb25zdCBrUG93MiA9IHJvdW5kVXBUb1BvdzIoayk7XG4gIGNvbnN0IGxhc3REaW1Qb3cyID0gcm91bmRVcFRvUG93MihsYXN0RGltKTtcblxuICAvLyBPbmx5IHRoZSBpbmRpY2VzIGNvbnRhaW5pbmcgdGhlIHRvcCBLIGFyZSBrZXB0IGF0IGV2ZXJ5IHN0ZXAgdG8gcmVkdWNlXG4gIC8vIG51bWJlciBvZiBvdXRwdXRzIGluIHRoZSBHUFUgYWxnb3JpdGhtcywgc28gb25jZSB0aGUgZmluYWwgc2V0IG9mIGluZGljZXNcbiAgLy8gaXMgY29tcHV0ZWQgdGhlbiBnYXRoZXIgaXMgdXNlZCB0byBncmFiIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlc1xuICAvLyBmcm9tIHRoZSBvcmlnaW5hbCBpbnB1dC5cbiAgbGV0IGluZGljZXM6IFRlbnNvckluZm8gPSBudWxsO1xuXG4gIC8vIEdQVSBhbGdvcml0aG0gYWx3YXlzIHRha2VzIGluIGFuIGluZGljZXMgaW5wdXQgYnV0IHRoaXMgaW5wdXQgaXMgbm90IHVzZWRcbiAgLy8gb24gdGhlIGZpcnN0IHJ1biBvZiBhIEdQVSBhbGdvcml0aG0sIHRoZXJlZm9yZSBpZiBpbmRpY2VzIGlzIG51bGwgd2Ugc2ltcGx5XG4gIC8vIHBhc3MgaW4geDJEIGluc3RlYWQgb2YgaXQgYnV0IHRoZSB2YWx1ZSB3aWxsIG5vdCBhY3R1YWxseSBiZSB1c2VkXG4gIGNvbnN0IGdldElucHV0cyA9ICgpID0+IGluZGljZXMgPT09IG51bGwgPyBbeDJELCB4MkRdIDogW3gyRCwgaW5kaWNlc107XG5cbiAgY29uc3QgcnVuU3dhcCA9IChkaXI6IG51bWJlciwgaW5jOiBudW1iZXIsIHNoYXBlOiBudW1iZXJbXSkgPT4ge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0cygpO1xuICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU3dhcFByb2dyYW0oc2hhcGUpO1xuICAgIGNvbnN0IGZpc3RQYXNzID0gaW5kaWNlcyA9PT0gbnVsbCA/IDEgOiAwO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlcyA9XG4gICAgICAgIFtbbGFzdERpbV0sIFtmaXN0UGFzc10sIFtOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFldLCBbZGlyXSwgW2luY11dO1xuICAgIGNvbnN0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICBpbmRpY2VzID0gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgaW5wdXRzLCAnaW50MzInLCBjdXN0b21WYWx1ZXMpO1xuICAgIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcbiAgfTtcblxuICAvLyBTdGVwIDE6IGxvY2FsIHNvcnRcbiAgZm9yIChsZXQgbGVuID0gMTsgbGVuIDwga1BvdzI7IGxlbiAqPSAyKSB7XG4gICAgY29uc3QgZGlyID0gbGVuICogMjtcbiAgICBmb3IgKGxldCBpbmMgPSBsZW47IGluYyA+PSAxOyBpbmMgLz0gMikge1xuICAgICAgcnVuU3dhcChkaXIsIGluYywgW2JhdGNoLCBsYXN0RGltUG93Ml0pO1xuICAgIH1cbiAgfVxuXG4gIC8vIFN0ZXAgMjogbWVyZ2VcbiAgZm9yIChsZXQgaW5kaWNlc1NpemUgPSBsYXN0RGltUG93MjsgaW5kaWNlc1NpemUgPiBrUG93MjsgaW5kaWNlc1NpemUgLz0gMikge1xuICAgIGNvbnN0IGlucHV0cyA9IGdldElucHV0cygpO1xuICAgIGNvbnN0IG1lcmdlUHJvZ3JhbSA9IG5ldyBNZXJnZVByb2dyYW0oW2JhdGNoLCBpbmRpY2VzU2l6ZSAvIDJdKTtcbiAgICBjb25zdCBmaXJzdFBhc3MgPSBpbmRpY2VzID09PSBudWxsID8gMSA6IDA7XG4gICAgY29uc3QgY3VzdG9tVmFsdWVzID0gW1tsYXN0RGltXSwgW2ZpcnN0UGFzc10sIFtrUG93Ml1dO1xuICAgIGNvbnN0IHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgICBpbmRpY2VzID1cbiAgICAgICAgYmFja2VuZC5ydW5XZWJHTFByb2dyYW0obWVyZ2VQcm9ncmFtLCBpbnB1dHMsICdpbnQzMicsIGN1c3RvbVZhbHVlcyk7XG4gICAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuXG4gICAgLy8gU3RlcCAzOiByZWJ1aWxkXG4gICAgY29uc3QgbGVuID0ga1BvdzIgLyAyO1xuICAgIGNvbnN0IGRpciA9IGxlbiAqIDI7XG4gICAgZm9yIChsZXQgaW5jID0gbGVuOyBpbmMgPj0gMTsgaW5jIC89IDIpIHtcbiAgICAgIHJ1blN3YXAoZGlyLCBpbmMsIGluZGljZXMuc2hhcGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEtlZXAgb25seSB0aGUgcmVxdWVzdGVkIHRvcCBLIHJlc3VsdHMgaW5zdGVhZCBvZiBrUG93MlxuICBsZXQgcHJldkluZGljZXMgPSBpbmRpY2VzO1xuICBpbmRpY2VzID0gc2xpY2UoXG4gICAgICB7aW5wdXRzOiB7eDogaW5kaWNlc30sIGJhY2tlbmQsIGF0dHJzOiB7YmVnaW46IDAsIHNpemU6IFtiYXRjaCwga119fSk7XG4gIGRpc3Bvc2VJbnRlcm1lZGlhdGVUZW5zb3JJbmZvT3JOdWxsKGJhY2tlbmQsIHByZXZJbmRpY2VzKTtcblxuICAvLyBHYXRoZXIgdmFsdWVzIG9uIGxhc3QgZGltZW5zaW9uXG4gIGxldCB2YWx1ZXMgPSBnYXRoZXJWMihcbiAgICAgIHtpbnB1dHM6IHt4OiB4MkQsIGluZGljZXN9LCBiYWNrZW5kLCBhdHRyczoge2F4aXM6IDEsIGJhdGNoRGltczogMX19KTtcbiAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgeDJEKTtcblxuICAvLyBSZXNoYXBlIGJhY2sgdG8gdGhlIG9yaWdpbmFsIGlucHV0IHNoYXBlLCBleGNlcHQgdGhhdCB0aGUgbGFzdFxuICAvLyBkaW1lbnNpb24gaXMgay5cbiAgY29uc3QgbmV3U2hhcGUgPSB4U2hhcGUuc2xpY2UoMCwgLTEpO1xuICBuZXdTaGFwZS5wdXNoKGspO1xuXG4gIHByZXZJbmRpY2VzID0gaW5kaWNlcztcbiAgaW5kaWNlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IGluZGljZXN9LCBhdHRyczoge3NoYXBlOiBuZXdTaGFwZX0sIGJhY2tlbmR9KTtcbiAgZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm9Pck51bGwoYmFja2VuZCwgcHJldkluZGljZXMpO1xuXG4gIGNvbnN0IHByZXZWYWx1ZXMgPSB2YWx1ZXM7XG4gIHZhbHVlcyA9IHJlc2hhcGUoe2lucHV0czoge3g6IHZhbHVlc30sIGF0dHJzOiB7c2hhcGU6IG5ld1NoYXBlfSwgYmFja2VuZH0pO1xuICBkaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mb09yTnVsbChiYWNrZW5kLCBwcmV2VmFsdWVzKTtcblxuICByZXR1cm4gW3ZhbHVlcywgaW5kaWNlc107XG59XG5cbmV4cG9ydCBjb25zdCB0b3BLQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFRvcEssXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0b3BLIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class TransformProgram {\n    constructor(imageHeight, imageWidth, interpolation, fillMode, fillValue, outShape) {\n        this.variableNames = ['Image', 'Transforms'];\n        this.outputShape = outShape;\n        const interpolationModeId = interpolation === 'nearest' ? 1 : 2;\n        let fillModeId;\n        switch (fillMode) {\n            case 'constant':\n                fillModeId = 1;\n                break;\n            case 'reflect':\n                fillModeId = 2;\n                break;\n            case 'wrap':\n                fillModeId = 3;\n                break;\n            case 'nearest':\n                fillModeId = 4;\n                break;\n            default:\n                fillModeId = 1;\n                break;\n        }\n        this.userCode = `\n            float mapCoord(float outCoord, float len) {\n              float inCoord = outCoord;\n              if(${fillModeId} == 2) {\n                if (inCoord < 0.0) {\n                  if (len <= 1.0) {\n                    inCoord = 0.0;\n                  } else {\n                    float sz2 = 2.0 * len;\n                    if (inCoord < sz2) {\n                      inCoord = sz2 * float(int(float(-inCoord / sz2))) +\n                      inCoord;\n                    }\n                    inCoord = inCoord < -len ? inCoord + sz2 : -inCoord - 1.0;\n                  }\n                } else if (inCoord > len - 1.0) {\n                  if (len <= 1.0) {\n                    inCoord = 0.0;\n                  } else {\n                    float sz2 = 2.0 * len;\n                    inCoord -= sz2 * float(int(float(inCoord / sz2)));\n                    if (inCoord >= len) {\n                      inCoord = sz2 - inCoord - 1.0;\n                    }\n                  }\n                }\n                return clamp(inCoord, 0.0, len - 1.0);\n              } else if (${fillModeId} == 3) {\n                if (inCoord < 0.0) {\n                  if (len <= 1.0) {\n                    inCoord = 0.0;\n                  } else {\n                    float sz = len - 1.0;\n                    inCoord += len * (float(int(float(-inCoord / sz))) + 1.0);\n                  }\n                } else if (inCoord > len - 1.0) {\n                  if (len <= 1.0) {\n                    inCoord = 0.0;\n                  } else {\n                    float sz = len - 1.0;\n                    inCoord -= len * float(int(float(inCoord / sz)));\n                  }\n                }\n                return clamp(inCoord, 0.0, len - 1.0);\n              } else if (${fillModeId} == 4) {\n                return clamp(outCoord, 0.0, len - 1.0);\n              } else {\n                return outCoord;\n              }\n            }\n\n            float readWithFillValue(int batch, int coordY, int coordX,\n              int channel) {\n              float outputValue;\n              if (0 <= coordY && coordY < ${imageHeight} && 0 <= coordX && coordX < ${imageWidth}) {\n                  outputValue = getImage(batch, coordY, coordX, channel);\n              } else {\n                outputValue = float(${fillValue});\n              }\n              return outputValue;\n            }\n\n            void main() {\n              ivec4 coords = getOutputCoords();\n              float outputValue;\n              int batch = coords[0];\n              int x = coords[2];\n              int y = coords[1];\n              int channel = coords[3];\n              float xf = float(x);\n              float yf = float(y);\n              float a1 = getTransforms(batch, 0);\n              float a2 = getTransforms(batch, 1);\n              float a3 = getTransforms(batch, 2);\n              float b1 = getTransforms(batch, 3);\n              float b2 = getTransforms(batch, 4);\n              float b3 = getTransforms(batch, 5);\n              float c1 = getTransforms(batch, 6);\n              float c2 = getTransforms(batch, 7);\n              float projection = c1 * xf + c2 * yf + 1.0;\n              if (projection == 0.0) {\n                outputValue = float(${fillValue});\n              } else {\n                float inX = (a1 * xf + a2 * yf + a3) / projection;\n                float inY = (b1 * xf + b2 * yf + b3) / projection;\n                float mapX = mapCoord(inX, float(${imageWidth}));\n                float mapY = mapCoord(inY, float(${imageHeight}));\n\n                if (${interpolationModeId} == 1) {\n                  int coordY = int(round(mapY));\n                  int coordX = int(round(mapX));\n                  outputValue = readWithFillValue(batch, coordY, coordX,\n                    channel);\n                } else {\n                  float yFloor = floor(mapY);\n                  float xFloor = floor(mapX);\n                  float yCeil = yFloor + 1.0;\n                  float xCeil = xFloor + 1.0;\n                  float valueYFloor = (xCeil - mapX) *\n                  readWithFillValue(batch, int(yFloor), int(xFloor), channel) +\n                  (mapX - xFloor) *\n                  readWithFillValue(batch, int(yFloor), int(xCeil), channel);\n                  float valueYCeil = (xCeil - mapX) *\n                  readWithFillValue(batch, int(yCeil), int(xFloor), channel) +\n                  (mapX - xFloor) *\n                  readWithFillValue(batch, int(yCeil), int(xCeil), channel);\n                  outputValue = (yCeil - mapY) * valueYFloor +\n                  (mapY - yFloor) * valueYCeil;\n                }\n              }\n              setOutput(outputValue);\n            }\n        `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNmb3JtX2dwdS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3RmanMtYmFja2VuZC13ZWJnbC9zcmMvdHJhbnNmb3JtX2dwdS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFJSCxNQUFNLE9BQU8sZ0JBQWdCO0lBSzNCLFlBQ0ksV0FBbUIsRUFBRSxVQUFrQixFQUN2QyxhQUFtQyxFQUNuQyxRQUErQyxFQUFFLFNBQWlCLEVBQ2xFLFFBQTBDO1FBUjlDLGtCQUFhLEdBQUcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7UUFTdEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsTUFBTSxtQkFBbUIsR0FBRyxhQUFhLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNoRSxJQUFJLFVBQVUsQ0FBQztRQUNmLFFBQVEsUUFBUSxFQUFFO1lBQ2hCLEtBQUssVUFBVTtnQkFDYixVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07WUFDUixLQUFLLFNBQVM7Z0JBQ1osVUFBVSxHQUFHLENBQUMsQ0FBQztnQkFDZixNQUFNO1lBQ1IsS0FBSyxNQUFNO2dCQUNULFVBQVUsR0FBRyxDQUFDLENBQUM7Z0JBQ2YsTUFBTTtZQUNSLEtBQUssU0FBUztnQkFDWixVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07WUFDUjtnQkFDRSxVQUFVLEdBQUcsQ0FBQyxDQUFDO2dCQUNmLE1BQU07U0FDVDtRQUNELElBQUksQ0FBQyxRQUFRLEdBQUc7OzttQkFHRCxVQUFVOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7MkJBd0JGLFVBQVU7Ozs7Ozs7Ozs7Ozs7Ozs7OzJCQWlCVixVQUFVOzs7Ozs7Ozs7OzRDQVc3QixXQUFXLCtCQUErQixVQUFVOzs7c0NBR3RCLFNBQVM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztzQ0F3QlQsU0FBUzs7OzttREFJSSxVQUFVO21EQUNWLFdBQVc7O3NCQUV4QyxtQkFBbUI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztTQXdCaEMsQ0FBQztJQUNSLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIxIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtHUEdQVVByb2dyYW19IGZyb20gJy4vZ3BncHVfbWF0aCc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2Zvcm1Qcm9ncmFtIGltcGxlbWVudHMgR1BHUFVQcm9ncmFtIHtcbiAgdmFyaWFibGVOYW1lcyA9IFsnSW1hZ2UnLCAnVHJhbnNmb3JtcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBpbWFnZUhlaWdodDogbnVtYmVyLCBpbWFnZVdpZHRoOiBudW1iZXIsXG4gICAgICBpbnRlcnBvbGF0aW9uOiAnbmVhcmVzdCd8J2JpbGluZWFyJyxcbiAgICAgIGZpbGxNb2RlOiAnY29uc3RhbnQnfCdyZWZsZWN0J3wnd3JhcCd8J25lYXJlc3QnLCBmaWxsVmFsdWU6IG51bWJlcixcbiAgICAgIG91dFNoYXBlOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSkge1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBvdXRTaGFwZTtcbiAgICBjb25zdCBpbnRlcnBvbGF0aW9uTW9kZUlkID0gaW50ZXJwb2xhdGlvbiA9PT0gJ25lYXJlc3QnID8gMSA6IDI7XG4gICAgbGV0IGZpbGxNb2RlSWQ7XG4gICAgc3dpdGNoIChmaWxsTW9kZSkge1xuICAgICAgY2FzZSAnY29uc3RhbnQnOlxuICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdyZWZsZWN0JzpcbiAgICAgICAgZmlsbE1vZGVJZCA9IDI7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnd3JhcCc6XG4gICAgICAgIGZpbGxNb2RlSWQgPSAzO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25lYXJlc3QnOlxuICAgICAgICBmaWxsTW9kZUlkID0gNDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBmaWxsTW9kZUlkID0gMTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICAgIHRoaXMudXNlckNvZGUgPSBgXG4gICAgICAgICAgICBmbG9hdCBtYXBDb29yZChmbG9hdCBvdXRDb29yZCwgZmxvYXQgbGVuKSB7XG4gICAgICAgICAgICAgIGZsb2F0IGluQ29vcmQgPSBvdXRDb29yZDtcbiAgICAgICAgICAgICAgaWYoJHtmaWxsTW9kZUlkfSA9PSAyKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluQ29vcmQgPCAwLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzejIgPSAyLjAgKiBsZW47XG4gICAgICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgc3oyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaW5Db29yZCA9IHN6MiAqIGZsb2F0KGludChmbG9hdCgtaW5Db29yZCAvIHN6MikpKSArXG4gICAgICAgICAgICAgICAgICAgICAgaW5Db29yZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gaW5Db29yZCA8IC1sZW4gPyBpbkNvb3JkICsgc3oyIDogLWluQ29vcmQgLSAxLjA7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbkNvb3JkID4gbGVuIC0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gMC4wO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3oyID0gMi4wICogbGVuO1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkIC09IHN6MiAqIGZsb2F0KGludChmbG9hdChpbkNvb3JkIC8gc3oyKSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5Db29yZCA+PSBsZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gc3oyIC0gaW5Db29yZCAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoaW5Db29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsbE1vZGVJZH0gPT0gMykge1xuICAgICAgICAgICAgICAgIGlmIChpbkNvb3JkIDwgMC4wKSB7XG4gICAgICAgICAgICAgICAgICBpZiAobGVuIDw9IDEuMCkge1xuICAgICAgICAgICAgICAgICAgICBpbkNvb3JkID0gMC4wO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZmxvYXQgc3ogPSBsZW4gLSAxLjA7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgKz0gbGVuICogKGZsb2F0KGludChmbG9hdCgtaW5Db29yZCAvIHN6KSkpICsgMS4wKTtcbiAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluQ29vcmQgPiBsZW4gLSAxLjApIHtcbiAgICAgICAgICAgICAgICAgIGlmIChsZW4gPD0gMS4wKSB7XG4gICAgICAgICAgICAgICAgICAgIGluQ29vcmQgPSAwLjA7XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmbG9hdCBzeiA9IGxlbiAtIDEuMDtcbiAgICAgICAgICAgICAgICAgICAgaW5Db29yZCAtPSBsZW4gKiBmbG9hdChpbnQoZmxvYXQoaW5Db29yZCAvIHN6KSkpO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY2xhbXAoaW5Db29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKCR7ZmlsbE1vZGVJZH0gPT0gNCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBjbGFtcChvdXRDb29yZCwgMC4wLCBsZW4gLSAxLjApO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBvdXRDb29yZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmbG9hdCByZWFkV2l0aEZpbGxWYWx1ZShpbnQgYmF0Y2gsIGludCBjb29yZFksIGludCBjb29yZFgsXG4gICAgICAgICAgICAgIGludCBjaGFubmVsKSB7XG4gICAgICAgICAgICAgIGZsb2F0IG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgICBpZiAoMCA8PSBjb29yZFkgJiYgY29vcmRZIDwgJHtcbiAgICAgICAgaW1hZ2VIZWlnaHR9ICYmIDAgPD0gY29vcmRYICYmIGNvb3JkWCA8ICR7aW1hZ2VXaWR0aH0pIHtcbiAgICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZ2V0SW1hZ2UoYmF0Y2gsIGNvb3JkWSwgY29vcmRYLCBjaGFubmVsKTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBvdXRwdXRWYWx1ZSA9IGZsb2F0KCR7ZmlsbFZhbHVlfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIG91dHB1dFZhbHVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2b2lkIG1haW4oKSB7XG4gICAgICAgICAgICAgIGl2ZWM0IGNvb3JkcyA9IGdldE91dHB1dENvb3JkcygpO1xuICAgICAgICAgICAgICBmbG9hdCBvdXRwdXRWYWx1ZTtcbiAgICAgICAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICAgICAgICBpbnQgeCA9IGNvb3Jkc1syXTtcbiAgICAgICAgICAgICAgaW50IHkgPSBjb29yZHNbMV07XG4gICAgICAgICAgICAgIGludCBjaGFubmVsID0gY29vcmRzWzNdO1xuICAgICAgICAgICAgICBmbG9hdCB4ZiA9IGZsb2F0KHgpO1xuICAgICAgICAgICAgICBmbG9hdCB5ZiA9IGZsb2F0KHkpO1xuICAgICAgICAgICAgICBmbG9hdCBhMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDApO1xuICAgICAgICAgICAgICBmbG9hdCBhMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDEpO1xuICAgICAgICAgICAgICBmbG9hdCBhMyA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDIpO1xuICAgICAgICAgICAgICBmbG9hdCBiMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDMpO1xuICAgICAgICAgICAgICBmbG9hdCBiMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDQpO1xuICAgICAgICAgICAgICBmbG9hdCBiMyA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDUpO1xuICAgICAgICAgICAgICBmbG9hdCBjMSA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDYpO1xuICAgICAgICAgICAgICBmbG9hdCBjMiA9IGdldFRyYW5zZm9ybXMoYmF0Y2gsIDcpO1xuICAgICAgICAgICAgICBmbG9hdCBwcm9qZWN0aW9uID0gYzEgKiB4ZiArIGMyICogeWYgKyAxLjA7XG4gICAgICAgICAgICAgIGlmIChwcm9qZWN0aW9uID09IDAuMCkge1xuICAgICAgICAgICAgICAgIG91dHB1dFZhbHVlID0gZmxvYXQoJHtmaWxsVmFsdWV9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBmbG9hdCBpblggPSAoYTEgKiB4ZiArIGEyICogeWYgKyBhMykgLyBwcm9qZWN0aW9uO1xuICAgICAgICAgICAgICAgIGZsb2F0IGluWSA9IChiMSAqIHhmICsgYjIgKiB5ZiArIGIzKSAvIHByb2plY3Rpb247XG4gICAgICAgICAgICAgICAgZmxvYXQgbWFwWCA9IG1hcENvb3JkKGluWCwgZmxvYXQoJHtpbWFnZVdpZHRofSkpO1xuICAgICAgICAgICAgICAgIGZsb2F0IG1hcFkgPSBtYXBDb29yZChpblksIGZsb2F0KCR7aW1hZ2VIZWlnaHR9KSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHtpbnRlcnBvbGF0aW9uTW9kZUlkfSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICBpbnQgY29vcmRZID0gaW50KHJvdW5kKG1hcFkpKTtcbiAgICAgICAgICAgICAgICAgIGludCBjb29yZFggPSBpbnQocm91bmQobWFwWCkpO1xuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSByZWFkV2l0aEZpbGxWYWx1ZShiYXRjaCwgY29vcmRZLCBjb29yZFgsXG4gICAgICAgICAgICAgICAgICAgIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB5Rmxvb3IgPSBmbG9vcihtYXBZKTtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHhGbG9vciA9IGZsb29yKG1hcFgpO1xuICAgICAgICAgICAgICAgICAgZmxvYXQgeUNlaWwgPSB5Rmxvb3IgKyAxLjA7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB4Q2VpbCA9IHhGbG9vciArIDEuMDtcbiAgICAgICAgICAgICAgICAgIGZsb2F0IHZhbHVlWUZsb29yID0gKHhDZWlsIC0gbWFwWCkgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Rmxvb3IpLCBpbnQoeEZsb29yKSwgY2hhbm5lbCkgK1xuICAgICAgICAgICAgICAgICAgKG1hcFggLSB4Rmxvb3IpICpcbiAgICAgICAgICAgICAgICAgIHJlYWRXaXRoRmlsbFZhbHVlKGJhdGNoLCBpbnQoeUZsb29yKSwgaW50KHhDZWlsKSwgY2hhbm5lbCk7XG4gICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZVlDZWlsID0gKHhDZWlsIC0gbWFwWCkgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Q2VpbCksIGludCh4Rmxvb3IpLCBjaGFubmVsKSArXG4gICAgICAgICAgICAgICAgICAobWFwWCAtIHhGbG9vcikgKlxuICAgICAgICAgICAgICAgICAgcmVhZFdpdGhGaWxsVmFsdWUoYmF0Y2gsIGludCh5Q2VpbCksIGludCh4Q2VpbCksIGNoYW5uZWwpO1xuICAgICAgICAgICAgICAgICAgb3V0cHV0VmFsdWUgPSAoeUNlaWwgLSBtYXBZKSAqIHZhbHVlWUZsb29yICtcbiAgICAgICAgICAgICAgICAgIChtYXBZIC0geUZsb29yKSAqIHZhbHVlWUNlaWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHNldE91dHB1dChvdXRwdXRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIGA7XG4gIH1cbn1cbiJdfQ==","/**\n * @license\n * Copyright 2021 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Transform } from '@tensorflow/tfjs-core';\nimport { TransformProgram } from '../transform_gpu';\nexport function transform(args) {\n    const { inputs, backend, attrs } = args;\n    const { image, transforms } = inputs;\n    const { interpolation, fillMode, fillValue, outputShape } = attrs;\n    const [batch, imageHeight, imageWidth, numChannels] = image.shape;\n    const [outHeight, outWidth] = outputShape != null ? outputShape : [imageHeight, imageWidth];\n    const outShape = [batch, outHeight, outWidth,\n        numChannels];\n    const program = new TransformProgram(imageHeight, imageWidth, interpolation, fillMode, fillValue, outShape);\n    return backend.runWebGLProgram(program, [image, transforms], 'float32');\n}\nexport const transformConfig = {\n    kernelName: Transform,\n    backendName: 'webgl',\n    kernelFunc: transform\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVHJhbnNmb3JtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1RyYW5zZm9ybS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLFNBQVMsRUFBa0MsTUFBTSx1QkFBdUIsQ0FBQztBQUd2SCxPQUFPLEVBQUMsZ0JBQWdCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUVsRCxNQUFNLFVBQVUsU0FBUyxDQUFDLElBSXpCO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUUsVUFBVSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQ25DLE1BQU0sRUFBQyxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFaEUsTUFBTSxDQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsVUFBVSxFQUFFLFdBQVcsQ0FBQyxHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7SUFDbEUsTUFBTSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsR0FDdkIsV0FBVyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsQ0FBQztJQUNsRSxNQUFNLFFBQVEsR0FDVixDQUFDLEtBQUssRUFBRSxTQUFTLEVBQUUsUUFBUTtRQUMxQixXQUFXLENBQXFDLENBQUM7SUFFdEQsTUFBTSxPQUFPLEdBQUcsSUFBSSxnQkFBZ0IsQ0FDaEMsV0FBVyxFQUFFLFVBQVUsRUFBRSxhQUFhLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUMzRSxPQUFPLE9BQU8sQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxFQUFFLFNBQVMsQ0FBQyxDQUFDO0FBQzFFLENBQUM7QUFFRCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQWlCO0lBQzNDLFVBQVUsRUFBRSxTQUFTO0lBQ3JCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxTQUE2QjtDQUMxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjEgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge0tlcm5lbENvbmZpZywgS2VybmVsRnVuYywgVGVuc29ySW5mbywgVHJhbnNmb3JtLCBUcmFuc2Zvcm1BdHRycywgVHJhbnNmb3JtSW5wdXRzfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge01hdGhCYWNrZW5kV2ViR0x9IGZyb20gJy4uL2JhY2tlbmRfd2ViZ2wnO1xuaW1wb3J0IHtUcmFuc2Zvcm1Qcm9ncmFtfSBmcm9tICcuLi90cmFuc2Zvcm1fZ3B1JztcblxuZXhwb3J0IGZ1bmN0aW9uIHRyYW5zZm9ybShhcmdzOiB7XG4gIGlucHV0czogVHJhbnNmb3JtSW5wdXRzLFxuICBiYWNrZW5kOiBNYXRoQmFja2VuZFdlYkdMLFxuICBhdHRyczogVHJhbnNmb3JtQXR0cnNcbn0pOiBUZW5zb3JJbmZvIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge2ltYWdlLCB0cmFuc2Zvcm1zfSA9IGlucHV0cztcbiAgY29uc3Qge2ludGVycG9sYXRpb24sIGZpbGxNb2RlLCBmaWxsVmFsdWUsIG91dHB1dFNoYXBlfSA9IGF0dHJzO1xuXG4gIGNvbnN0IFtiYXRjaCwgaW1hZ2VIZWlnaHQsIGltYWdlV2lkdGgsIG51bUNoYW5uZWxzXSA9IGltYWdlLnNoYXBlO1xuICBjb25zdCBbb3V0SGVpZ2h0LCBvdXRXaWR0aF0gPVxuICAgICAgb3V0cHV0U2hhcGUgIT0gbnVsbCA/IG91dHB1dFNoYXBlIDogW2ltYWdlSGVpZ2h0LCBpbWFnZVdpZHRoXTtcbiAgY29uc3Qgb3V0U2hhcGUgPVxuICAgICAgW2JhdGNoLCBvdXRIZWlnaHQsIG91dFdpZHRoLFxuICAgICAgIG51bUNoYW5uZWxzXSBhcyBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXTtcblxuICBjb25zdCBwcm9ncmFtID0gbmV3IFRyYW5zZm9ybVByb2dyYW0oXG4gICAgICBpbWFnZUhlaWdodCwgaW1hZ2VXaWR0aCwgaW50ZXJwb2xhdGlvbiwgZmlsbE1vZGUsIGZpbGxWYWx1ZSwgb3V0U2hhcGUpO1xuICByZXR1cm4gYmFja2VuZC5ydW5XZWJHTFByb2dyYW0ocHJvZ3JhbSwgW2ltYWdlLCB0cmFuc2Zvcm1zXSwgJ2Zsb2F0MzInKTtcbn1cblxuZXhwb3J0IGNvbnN0IHRyYW5zZm9ybUNvbmZpZzogS2VybmVsQ29uZmlnID0ge1xuICBrZXJuZWxOYW1lOiBUcmFuc2Zvcm0sXG4gIGJhY2tlbmROYW1lOiAnd2ViZ2wnLFxuICBrZXJuZWxGdW5jOiB0cmFuc2Zvcm0gYXMge30gYXMgS2VybmVsRnVuY1xufTtcbiJdfQ==","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the License);\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an AS IS BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unique } from '@tensorflow/tfjs-core';\nimport { uniqueImplCPU } from '../kernel_utils/shared';\nimport { assertNotComplex } from '../webgl_util';\nexport function unique(args) {\n    const { inputs, attrs, backend } = args;\n    const { axis } = attrs;\n    const { x } = inputs;\n    assertNotComplex(x, 'unique');\n    // For now, always forward calculation to the CPU backend.\n    console.warn('WARNING: ', 'UI might be locked temporarily as data is being downloaded');\n    const values = backend.readSync(x.dataId);\n    const { outputValues, outputShape, indices } = uniqueImplCPU(values, axis, x.shape, x.dtype);\n    return [\n        backend.makeTensorInfo(outputShape, x.dtype, outputValues),\n        backend.makeTensorInfo([indices.length], 'int32', indices),\n    ];\n}\nexport const uniqueConfig = {\n    kernelName: Unique,\n    backendName: 'webgl',\n    kernelFunc: unique,\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5pcXVlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1VuaXF1ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLE1BQU0sRUFBNEIsTUFBTSx1QkFBdUIsQ0FBQztBQUc5RyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sd0JBQXdCLENBQUM7QUFDckQsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0sZUFBZSxDQUFDO0FBRS9DLE1BQU0sVUFBVSxNQUFNLENBQ2xCLElBQ3lFO0lBRTNFLE1BQU0sRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBQyxHQUFHLElBQUksQ0FBQztJQUN0QyxNQUFNLEVBQUMsSUFBSSxFQUFDLEdBQUcsS0FBSyxDQUFDO0lBQ3JCLE1BQU0sRUFBQyxDQUFDLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDbkIsZ0JBQWdCLENBQUMsQ0FBQyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBRTlCLDBEQUEwRDtJQUMxRCxPQUFPLENBQUMsSUFBSSxDQUNSLFdBQVcsRUFDWCw0REFBNEQsQ0FBQyxDQUFDO0lBQ2xFLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzFDLE1BQU0sRUFBQyxZQUFZLEVBQUUsV0FBVyxFQUFFLE9BQU8sRUFBQyxHQUN0QyxhQUFhLENBQUMsTUFBTSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUNsRCxPQUFPO1FBQ0wsT0FBTyxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUM7UUFDMUQsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDO0tBQzNELENBQUM7QUFDSixDQUFDO0FBRUQsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFpQjtJQUN4QyxVQUFVLEVBQUUsTUFBTTtJQUNsQixXQUFXLEVBQUUsT0FBTztJQUNwQixVQUFVLEVBQUUsTUFBMEI7Q0FDdkMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgTGljZW5zZSk7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBBUyBJUyBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBVbmlxdWUsIFVuaXF1ZUF0dHJzLCBVbmlxdWVJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5pbXBvcnQge3VuaXF1ZUltcGxDUFV9IGZyb20gJy4uL2tlcm5lbF91dGlscy9zaGFyZWQnO1xuaW1wb3J0IHthc3NlcnROb3RDb21wbGV4fSBmcm9tICcuLi93ZWJnbF91dGlsJztcblxuZXhwb3J0IGZ1bmN0aW9uIHVuaXF1ZShcbiAgICBhcmdzOlxuICAgICAgICB7aW5wdXRzOiBVbmlxdWVJbnB1dHMsIGF0dHJzOiBVbmlxdWVBdHRycywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTH0pOlxuICAgIFRlbnNvckluZm9bXSB7XG4gIGNvbnN0IHtpbnB1dHMsIGF0dHJzLCBiYWNrZW5kfSA9IGFyZ3M7XG4gIGNvbnN0IHtheGlzfSA9IGF0dHJzO1xuICBjb25zdCB7eH0gPSBpbnB1dHM7XG4gIGFzc2VydE5vdENvbXBsZXgoeCwgJ3VuaXF1ZScpO1xuXG4gIC8vIEZvciBub3csIGFsd2F5cyBmb3J3YXJkIGNhbGN1bGF0aW9uIHRvIHRoZSBDUFUgYmFja2VuZC5cbiAgY29uc29sZS53YXJuKFxuICAgICAgJ1dBUk5JTkc6ICcsXG4gICAgICAnVUkgbWlnaHQgYmUgbG9ja2VkIHRlbXBvcmFyaWx5IGFzIGRhdGEgaXMgYmVpbmcgZG93bmxvYWRlZCcpO1xuICBjb25zdCB2YWx1ZXMgPSBiYWNrZW5kLnJlYWRTeW5jKHguZGF0YUlkKTtcbiAgY29uc3Qge291dHB1dFZhbHVlcywgb3V0cHV0U2hhcGUsIGluZGljZXN9ID1cbiAgICAgIHVuaXF1ZUltcGxDUFUodmFsdWVzLCBheGlzLCB4LnNoYXBlLCB4LmR0eXBlKTtcbiAgcmV0dXJuIFtcbiAgICBiYWNrZW5kLm1ha2VUZW5zb3JJbmZvKG91dHB1dFNoYXBlLCB4LmR0eXBlLCBvdXRwdXRWYWx1ZXMpLFxuICAgIGJhY2tlbmQubWFrZVRlbnNvckluZm8oW2luZGljZXMubGVuZ3RoXSwgJ2ludDMyJywgaW5kaWNlcyksXG4gIF07XG59XG5cbmV4cG9ydCBjb25zdCB1bmlxdWVDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVW5pcXVlLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdW5pcXVlIGFzIHt9IGFzIEtlcm5lbEZ1bmMsXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { Unpack } from '@tensorflow/tfjs-core';\nimport { reshape } from './Reshape';\nimport { slice } from './Slice';\nexport function unpack(args) {\n    const { inputs, backend, attrs } = args;\n    const { value } = inputs;\n    let { axis } = attrs;\n    if (axis < 0) {\n        axis += value.shape.length;\n    }\n    const x = value;\n    const xRank = x.shape.length;\n    const num = value.shape[axis];\n    const outShape = new Array(xRank - 1);\n    let outIndex = 0;\n    for (let i = 0; i < xRank; i++) {\n        if (i !== axis) {\n            outShape[outIndex++] = x.shape[i];\n        }\n    }\n    const toDispose = [];\n    const begin = new Array(xRank).fill(0);\n    const size = x.shape.slice();\n    size[axis] = 1;\n    const res = new Array(num);\n    for (let i = 0; i < res.length; i++) {\n        begin[axis] = i;\n        const sliced = slice({ inputs: { x }, backend, attrs: { begin, size } });\n        const reshaped = reshape({ inputs: { x: sliced }, backend, attrs: { shape: outShape } });\n        res[i] = reshaped;\n        toDispose.push(sliced);\n    }\n    toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return res;\n}\nexport const unpackConfig = {\n    kernelName: Unpack,\n    backendName: 'webgl',\n    kernelFunc: unpack\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5wYWNrLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1VucGFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQXVDLE1BQU0sRUFBNEIsTUFBTSx1QkFBdUIsQ0FBQztBQUk5RyxPQUFPLEVBQUMsT0FBTyxFQUFDLE1BQU0sV0FBVyxDQUFDO0FBQ2xDLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFOUIsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsSUFDeUU7SUFFM0UsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxLQUFLLEVBQUMsR0FBRyxNQUFNLENBQUM7SUFDdkIsSUFBSSxFQUFDLElBQUksRUFBQyxHQUFHLEtBQUssQ0FBQztJQUVuQixJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDWixJQUFJLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7S0FDNUI7SUFFRCxNQUFNLENBQUMsR0FBRyxLQUFLLENBQUM7SUFDaEIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixNQUFNLFFBQVEsR0FBYSxJQUFJLEtBQUssQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDaEQsSUFBSSxRQUFRLEdBQUcsQ0FBQyxDQUFDO0lBQ2pCLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxLQUFLLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDOUIsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ2QsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUNuQztLQUNGO0lBRUQsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLE1BQU0sS0FBSyxHQUFHLElBQUksS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN2QyxNQUFNLElBQUksR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0lBQzdCLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDZixNQUFNLEdBQUcsR0FBaUIsSUFBSSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxFQUFFLEVBQUU7UUFDbkMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNoQixNQUFNLE1BQU0sR0FBRyxLQUFLLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUMsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUMsS0FBSyxFQUFFLElBQUksRUFBQyxFQUFDLENBQUMsQ0FBQztRQUNuRSxNQUFNLFFBQVEsR0FDVixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsTUFBTSxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7UUFDdEUsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQztRQUVsQixTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0tBQ3hCO0lBRUQsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLE9BQU8sR0FBRyxDQUFDO0FBQ2IsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBaUI7SUFDeEMsVUFBVSxFQUFFLE1BQU07SUFDbEIsV0FBVyxFQUFFLE9BQU87SUFDcEIsVUFBVSxFQUFFLE1BQTBCO0NBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgMjAyMCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlIFwiTGljZW5zZVwiKTtcbiAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS5cbiAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuICpcbiAqIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMFxuICpcbiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmVcbiAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuIFwiQVMgSVNcIiBCQVNJUyxcbiAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLlxuICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZFxuICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuXG4gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICovXG5cbmltcG9ydCB7S2VybmVsQ29uZmlnLCBLZXJuZWxGdW5jLCBUZW5zb3JJbmZvLCBVbnBhY2ssIFVucGFja0F0dHJzLCBVbnBhY2tJbnB1dHN9IGZyb20gJ0B0ZW5zb3JmbG93L3RmanMtY29yZSc7XG5cbmltcG9ydCB7TWF0aEJhY2tlbmRXZWJHTH0gZnJvbSAnLi4vYmFja2VuZF93ZWJnbCc7XG5cbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7c2xpY2V9IGZyb20gJy4vU2xpY2UnO1xuXG5leHBvcnQgZnVuY3Rpb24gdW5wYWNrKFxuICAgIGFyZ3M6XG4gICAgICAgIHtpbnB1dHM6IFVucGFja0lucHV0cywgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCwgYXR0cnM6IFVucGFja0F0dHJzfSk6XG4gICAgVGVuc29ySW5mb1tdIHtcbiAgY29uc3Qge2lucHV0cywgYmFja2VuZCwgYXR0cnN9ID0gYXJncztcbiAgY29uc3Qge3ZhbHVlfSA9IGlucHV0cztcbiAgbGV0IHtheGlzfSA9IGF0dHJzO1xuXG4gIGlmIChheGlzIDwgMCkge1xuICAgIGF4aXMgKz0gdmFsdWUuc2hhcGUubGVuZ3RoO1xuICB9XG5cbiAgY29uc3QgeCA9IHZhbHVlO1xuICBjb25zdCB4UmFuayA9IHguc2hhcGUubGVuZ3RoO1xuXG4gIGNvbnN0IG51bSA9IHZhbHVlLnNoYXBlW2F4aXNdO1xuICBjb25zdCBvdXRTaGFwZTogbnVtYmVyW10gPSBuZXcgQXJyYXkoeFJhbmsgLSAxKTtcbiAgbGV0IG91dEluZGV4ID0gMDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCB4UmFuazsgaSsrKSB7XG4gICAgaWYgKGkgIT09IGF4aXMpIHtcbiAgICAgIG91dFNoYXBlW291dEluZGV4KytdID0geC5zaGFwZVtpXTtcbiAgICB9XG4gIH1cblxuICBjb25zdCB0b0Rpc3Bvc2UgPSBbXTtcblxuICBjb25zdCBiZWdpbiA9IG5ldyBBcnJheSh4UmFuaykuZmlsbCgwKTtcbiAgY29uc3Qgc2l6ZSA9IHguc2hhcGUuc2xpY2UoKTtcbiAgc2l6ZVtheGlzXSA9IDE7XG4gIGNvbnN0IHJlczogVGVuc29ySW5mb1tdID0gbmV3IEFycmF5KG51bSk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgYmVnaW5bYXhpc10gPSBpO1xuICAgIGNvbnN0IHNsaWNlZCA9IHNsaWNlKHtpbnB1dHM6IHt4fSwgYmFja2VuZCwgYXR0cnM6IHtiZWdpbiwgc2l6ZX19KTtcbiAgICBjb25zdCByZXNoYXBlZCA9XG4gICAgICAgIHJlc2hhcGUoe2lucHV0czoge3g6IHNsaWNlZH0sIGJhY2tlbmQsIGF0dHJzOiB7c2hhcGU6IG91dFNoYXBlfX0pO1xuICAgIHJlc1tpXSA9IHJlc2hhcGVkO1xuXG4gICAgdG9EaXNwb3NlLnB1c2goc2xpY2VkKTtcbiAgfVxuXG4gIHRvRGlzcG9zZS5mb3JFYWNoKHQgPT4gYmFja2VuZC5kaXNwb3NlSW50ZXJtZWRpYXRlVGVuc29ySW5mbyh0KSk7XG4gIHJldHVybiByZXM7XG59XG5cbmV4cG9ydCBjb25zdCB1bnBhY2tDb25maWc6IEtlcm5lbENvbmZpZyA9IHtcbiAga2VybmVsTmFtZTogVW5wYWNrLFxuICBiYWNrZW5kTmFtZTogJ3dlYmdsJyxcbiAga2VybmVsRnVuYzogdW5wYWNrIGFzIHt9IGFzIEtlcm5lbEZ1bmNcbn07XG4iXX0=","/**\n * @license\n * Copyright 2018 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nexport class SegmentOpProgram {\n    constructor(segOpInfo, segOpType) {\n        this.variableNames = ['x', 'segmentIds'];\n        const windowSize = segOpInfo.windowSize;\n        const batchSize = segOpInfo.batchSize;\n        const inSize = segOpInfo.inSize;\n        const numSegments = segOpInfo.numSegments;\n        const outSize = numSegments * Math.ceil(inSize / windowSize);\n        this.outputShape = [batchSize, outSize];\n        const initializationValue = '0.0';\n        const returnValue = `sumValue`;\n        const windowSizeNearestVec4 = Math.floor(windowSize / 4) * 4;\n        const windowSizeVec4Remainder = windowSize % 4;\n        const updateSnippet = `\n        sumValue += dot(values, segFilter);\n    `;\n        let checkValueOutOfBounds = '';\n        if (inSize % windowSize > 0) {\n            checkValueOutOfBounds = `\n        if (inIdx < 0 || inIdx >= ${inSize}) {\n          return initializationValue;\n        }\n      `;\n        }\n        let checkSegmentIdOutOfBounds = '';\n        if (inSize % windowSize > 0) {\n            checkSegmentIdOutOfBounds = `\n        if (inIdx < 0 || inIdx >= ${inSize}) {\n          return -1.0;\n        }\n      `;\n        }\n        this.userCode = `\n      const float initializationValue = ${initializationValue};\n\n      float getValue(int batch, int inIdx) {\n        ${checkValueOutOfBounds}\n        return getX(batch, inIdx);\n      }\n\n      float getSegmentIdAtIndex(int inIdx) {\n        ${checkSegmentIdOutOfBounds}\n        return getSegmentIds(inIdx);\n      }\n\n      void main() {\n        ivec2 coords = getOutputCoords();\n        int batch = coords[0];\n        int outIdx = coords[1];\n        int inOffset = int(floor(float(outIdx) / float(\n          ${numSegments})) * float(${windowSize}));\n        int currentSeg = int(mod(float(outIdx), float(${numSegments})));\n\n        float sumValue = 0.0;\n\n        for (int i = 0; i < ${windowSizeNearestVec4}; i += 4) {\n          int inIdx = inOffset + i;\n          vec4 values = vec4(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1),\n            getValue(batch, inIdx + 2),\n            getValue(batch, inIdx + 3)\n          );\n\n          vec4 segFilter = vec4(\n            int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n            int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n            int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n            int(getSegmentIdAtIndex(inIdx + 3)) == currentSeg ? 1 : 0\n          );\n\n          ${updateSnippet}\n        }\n\n        int inIdx = inOffset + ${windowSizeNearestVec4};\n        if (${windowSizeVec4Remainder === 1}) {\n          vec4 values = vec4(\n            getValue(batch, inIdx),\n            initializationValue,\n            initializationValue,\n            initializationValue\n          );\n\n          int inIdxSeg = int(getSegmentIdAtIndex(inIdx));\n\n          vec4 segFilter = vec4(\n            int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n            0,\n            0,\n            0\n          );\n\n          ${updateSnippet}\n        } else if (${windowSizeVec4Remainder === 2}) {\n          vec4 values = vec4(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1),\n            initializationValue,\n            initializationValue\n          );\n\n          vec4 segFilter = vec4(\n            int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n            int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n              0,\n              0\n          );\n\n          ${updateSnippet}\n        } else if (${windowSizeVec4Remainder === 3}) {\n          vec4 values = vec4(\n            getValue(batch, inIdx),\n            getValue(batch, inIdx + 1),\n            getValue(batch, inIdx + 2),\n            initializationValue\n          );\n\n          vec4 segFilter = vec4(\n            int(getSegmentIdAtIndex(inIdx)) == currentSeg ? 1 : 0,\n            int(getSegmentIdAtIndex(inIdx + 1)) == currentSeg ? 1 : 0,\n            int(getSegmentIdAtIndex(inIdx + 2)) == currentSeg ? 1 : 0,\n            0\n          );\n\n          ${updateSnippet}\n        }\n        setOutput(${returnValue});\n      }\n    `;\n    }\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VnbWVudF9ncHUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3NlZ21lbnRfZ3B1LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUtILE1BQU0sT0FBTyxnQkFBZ0I7SUFLM0IsWUFDSSxTQUE4QyxFQUM5QyxTQUErQjtRQU5uQyxrQkFBYSxHQUFHLENBQUMsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBT2xDLE1BQU0sVUFBVSxHQUFHLFNBQVMsQ0FBQyxVQUFVLENBQUM7UUFDeEMsTUFBTSxTQUFTLEdBQUcsU0FBUyxDQUFDLFNBQVMsQ0FBQztRQUN0QyxNQUFNLE1BQU0sR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDO1FBQ2hDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxXQUFXLENBQUM7UUFDMUMsTUFBTSxPQUFPLEdBQUcsV0FBVyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLFVBQVUsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFFeEMsTUFBTSxtQkFBbUIsR0FBRyxLQUFLLENBQUM7UUFDbEMsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDO1FBRS9CLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzdELE1BQU0sdUJBQXVCLEdBQUcsVUFBVSxHQUFHLENBQUMsQ0FBQztRQUUvQyxNQUFNLGFBQWEsR0FBRzs7S0FFckIsQ0FBQztRQUVGLElBQUkscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1FBQy9CLElBQUksTUFBTSxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDM0IscUJBQXFCLEdBQUc7b0NBQ00sTUFBTTs7O09BR25DLENBQUM7U0FDSDtRQUVELElBQUkseUJBQXlCLEdBQUcsRUFBRSxDQUFDO1FBQ25DLElBQUksTUFBTSxHQUFHLFVBQVUsR0FBRyxDQUFDLEVBQUU7WUFDM0IseUJBQXlCLEdBQUc7b0NBQ0UsTUFBTTs7O09BR25DLENBQUM7U0FDSDtRQUVELElBQUksQ0FBQyxRQUFRLEdBQUc7MENBQ3NCLG1CQUFtQjs7O1VBR25ELHFCQUFxQjs7Ozs7VUFLckIseUJBQXlCOzs7Ozs7Ozs7WUFTdkIsV0FBVyxjQUFjLFVBQVU7d0RBQ1MsV0FBVzs7Ozs4QkFJckMscUJBQXFCOzs7Ozs7Ozs7Ozs7Ozs7O1lBZ0J2QyxhQUFhOzs7aUNBR1EscUJBQXFCO2NBQ3hDLHVCQUF1QixLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7O1lBaUIvQixhQUFhO3FCQUNKLHVCQUF1QixLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7OztZQWV0QyxhQUFhO3FCQUNKLHVCQUF1QixLQUFLLENBQUM7Ozs7Ozs7Ozs7Ozs7OztZQWV0QyxhQUFhOztvQkFFTCxXQUFXOztLQUUxQixDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuXG5pbXBvcnQge2JhY2tlbmRfdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcbmltcG9ydCB7R1BHUFVQcm9ncmFtfSBmcm9tICcuL2dwZ3B1X21hdGgnO1xuXG5leHBvcnQgY2xhc3MgU2VnbWVudE9wUHJvZ3JhbSBpbXBsZW1lbnRzIEdQR1BVUHJvZ3JhbSB7XG4gIHZhcmlhYmxlTmFtZXMgPSBbJ3gnLCAnc2VnbWVudElkcyddO1xuICBvdXRwdXRTaGFwZTogbnVtYmVyW107XG4gIHVzZXJDb2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgICBzZWdPcEluZm86IGJhY2tlbmRfdXRpbC5zZWdtZW50X3V0aWwuU2VnT3BJbmZvLFxuICAgICAgc2VnT3BUeXBlOiAndW5zb3J0ZWRTZWdtZW50U3VtJykge1xuICAgIGNvbnN0IHdpbmRvd1NpemUgPSBzZWdPcEluZm8ud2luZG93U2l6ZTtcbiAgICBjb25zdCBiYXRjaFNpemUgPSBzZWdPcEluZm8uYmF0Y2hTaXplO1xuICAgIGNvbnN0IGluU2l6ZSA9IHNlZ09wSW5mby5pblNpemU7XG4gICAgY29uc3QgbnVtU2VnbWVudHMgPSBzZWdPcEluZm8ubnVtU2VnbWVudHM7XG4gICAgY29uc3Qgb3V0U2l6ZSA9IG51bVNlZ21lbnRzICogTWF0aC5jZWlsKGluU2l6ZSAvIHdpbmRvd1NpemUpO1xuICAgIHRoaXMub3V0cHV0U2hhcGUgPSBbYmF0Y2hTaXplLCBvdXRTaXplXTtcblxuICAgIGNvbnN0IGluaXRpYWxpemF0aW9uVmFsdWUgPSAnMC4wJztcbiAgICBjb25zdCByZXR1cm5WYWx1ZSA9IGBzdW1WYWx1ZWA7XG5cbiAgICBjb25zdCB3aW5kb3dTaXplTmVhcmVzdFZlYzQgPSBNYXRoLmZsb29yKHdpbmRvd1NpemUgLyA0KSAqIDQ7XG4gICAgY29uc3Qgd2luZG93U2l6ZVZlYzRSZW1haW5kZXIgPSB3aW5kb3dTaXplICUgNDtcblxuICAgIGNvbnN0IHVwZGF0ZVNuaXBwZXQgPSBgXG4gICAgICAgIHN1bVZhbHVlICs9IGRvdCh2YWx1ZXMsIHNlZ0ZpbHRlcik7XG4gICAgYDtcblxuICAgIGxldCBjaGVja1ZhbHVlT3V0T2ZCb3VuZHMgPSAnJztcbiAgICBpZiAoaW5TaXplICUgd2luZG93U2l6ZSA+IDApIHtcbiAgICAgIGNoZWNrVmFsdWVPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gaW5pdGlhbGl6YXRpb25WYWx1ZTtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICBsZXQgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9ICcnO1xuICAgIGlmIChpblNpemUgJSB3aW5kb3dTaXplID4gMCkge1xuICAgICAgY2hlY2tTZWdtZW50SWRPdXRPZkJvdW5kcyA9IGBcbiAgICAgICAgaWYgKGluSWR4IDwgMCB8fCBpbklkeCA+PSAke2luU2l6ZX0pIHtcbiAgICAgICAgICByZXR1cm4gLTEuMDtcbiAgICAgICAgfVxuICAgICAgYDtcbiAgICB9XG5cbiAgICB0aGlzLnVzZXJDb2RlID0gYFxuICAgICAgY29uc3QgZmxvYXQgaW5pdGlhbGl6YXRpb25WYWx1ZSA9ICR7aW5pdGlhbGl6YXRpb25WYWx1ZX07XG5cbiAgICAgIGZsb2F0IGdldFZhbHVlKGludCBiYXRjaCwgaW50IGluSWR4KSB7XG4gICAgICAgICR7Y2hlY2tWYWx1ZU91dE9mQm91bmRzfVxuICAgICAgICByZXR1cm4gZ2V0WChiYXRjaCwgaW5JZHgpO1xuICAgICAgfVxuXG4gICAgICBmbG9hdCBnZXRTZWdtZW50SWRBdEluZGV4KGludCBpbklkeCkge1xuICAgICAgICAke2NoZWNrU2VnbWVudElkT3V0T2ZCb3VuZHN9XG4gICAgICAgIHJldHVybiBnZXRTZWdtZW50SWRzKGluSWR4KTtcbiAgICAgIH1cblxuICAgICAgdm9pZCBtYWluKCkge1xuICAgICAgICBpdmVjMiBjb29yZHMgPSBnZXRPdXRwdXRDb29yZHMoKTtcbiAgICAgICAgaW50IGJhdGNoID0gY29vcmRzWzBdO1xuICAgICAgICBpbnQgb3V0SWR4ID0gY29vcmRzWzFdO1xuICAgICAgICBpbnQgaW5PZmZzZXQgPSBpbnQoZmxvb3IoZmxvYXQob3V0SWR4KSAvIGZsb2F0KFxuICAgICAgICAgICR7bnVtU2VnbWVudHN9KSkgKiBmbG9hdCgke3dpbmRvd1NpemV9KSk7XG4gICAgICAgIGludCBjdXJyZW50U2VnID0gaW50KG1vZChmbG9hdChvdXRJZHgpLCBmbG9hdCgke251bVNlZ21lbnRzfSkpKTtcblxuICAgICAgICBmbG9hdCBzdW1WYWx1ZSA9IDAuMDtcblxuICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8ICR7d2luZG93U2l6ZU5lYXJlc3RWZWM0fTsgaSArPSA0KSB7XG4gICAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyBpO1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgZ2V0VmFsdWUoYmF0Y2gsIGluSWR4ICsgMylcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgdmVjNCBzZWdGaWx0ZXIgPSB2ZWM0KFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDEpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDIpKSA9PSBjdXJyZW50U2VnID8gMSA6IDAsXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCArIDMpKSA9PSBjdXJyZW50U2VnID8gMSA6IDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG5cbiAgICAgICAgaW50IGluSWR4ID0gaW5PZmZzZXQgKyAke3dpbmRvd1NpemVOZWFyZXN0VmVjNH07XG4gICAgICAgIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAxfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWVcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaW50IGluSWR4U2VnID0gaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHgpKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAyfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGluaXRpYWxpemF0aW9uVmFsdWUsXG4gICAgICAgICAgICBpbml0aWFsaXphdGlvblZhbHVlXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHZlYzQgc2VnRmlsdGVyID0gdmVjNChcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4KSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgaW50KGdldFNlZ21lbnRJZEF0SW5kZXgoaW5JZHggKyAxKSkgPT0gY3VycmVudFNlZyA/IDEgOiAwLFxuICAgICAgICAgICAgICAwLFxuICAgICAgICAgICAgICAwXG4gICAgICAgICAgKTtcblxuICAgICAgICAgICR7dXBkYXRlU25pcHBldH1cbiAgICAgICAgfSBlbHNlIGlmICgke3dpbmRvd1NpemVWZWM0UmVtYWluZGVyID09PSAzfSkge1xuICAgICAgICAgIHZlYzQgdmFsdWVzID0gdmVjNChcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCksXG4gICAgICAgICAgICBnZXRWYWx1ZShiYXRjaCwgaW5JZHggKyAxKSxcbiAgICAgICAgICAgIGdldFZhbHVlKGJhdGNoLCBpbklkeCArIDIpLFxuICAgICAgICAgICAgaW5pdGlhbGl6YXRpb25WYWx1ZVxuICAgICAgICAgICk7XG5cbiAgICAgICAgICB2ZWM0IHNlZ0ZpbHRlciA9IHZlYzQoXG4gICAgICAgICAgICBpbnQoZ2V0U2VnbWVudElkQXRJbmRleChpbklkeCkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMSkpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIGludChnZXRTZWdtZW50SWRBdEluZGV4KGluSWR4ICsgMikpID09IGN1cnJlbnRTZWcgPyAxIDogMCxcbiAgICAgICAgICAgIDBcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgJHt1cGRhdGVTbmlwcGV0fVxuICAgICAgICB9XG4gICAgICAgIHNldE91dHB1dCgke3JldHVyblZhbHVlfSk7XG4gICAgICB9XG4gICAgYDtcbiAgfVxufVxuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { backend_util, sumOutType, UnsortedSegmentSum, util } from '@tensorflow/tfjs-core';\nimport { SegmentOpProgram } from '../segment_gpu';\nimport { range } from './Range';\nimport { reshape } from './Reshape';\nimport { tile } from './Tile';\nimport { transpose } from './Transpose';\nexport function unsortedSegmentSum(args) {\n    const { inputs, backend, attrs } = args;\n    const { x, segmentIds } = inputs;\n    const { numSegments } = attrs;\n    const xRank = x.shape.length;\n    const toDispose = [];\n    let axis = 0;\n    const permutation = backend_util.getAxesPermutation([axis], xRank);\n    let permutedX = x;\n    if (permutation != null) {\n        permutedX = transpose({ inputs: { x }, backend, attrs: { perm: permutation } });\n        toDispose.push(permutedX);\n        axis = backend_util.getInnerMostAxes(1, xRank)[0];\n    }\n    const outShape = backend_util.segment_util.computeOutShape(permutedX.shape, axis, numSegments);\n    const inSize = util.sizeFromShape([permutedX.shape[axis]]);\n    const a2D = reshape({ inputs: { x: permutedX }, backend, attrs: { shape: [-1, inSize] } });\n    toDispose.push(a2D);\n    const outputDType = sumOutType(x.dtype);\n    const segOpCompute = (x, segOpType, segmentIds, dtype, numSegments) => {\n        const batchSize = x.shape[0];\n        const inSize = x.shape[1];\n        const windowSize = backend_util.segment_util.segOpComputeOptimalWindowSize(inSize, numSegments);\n        const segOpInfo = { windowSize, inSize, batchSize, numSegments };\n        const program = new SegmentOpProgram(segOpInfo, segOpType);\n        const output = backend.compileAndRun(program, [x, segmentIds], dtype);\n        toDispose.push(output);\n        // No need to run another GPGPU program.\n        if (output.shape[1] === numSegments) {\n            return output;\n        }\n        const rangeInfo = range({\n            backend,\n            attrs: { start: 0, stop: numSegments, step: 1, dtype: 'float32' }\n        });\n        const tileInfo = tile({\n            inputs: { x: rangeInfo },\n            backend,\n            attrs: { reps: [inSize / windowSize] }\n        });\n        toDispose.push(rangeInfo);\n        toDispose.push(tileInfo);\n        const result = segOpCompute(output, segOpType, tileInfo, dtype, numSegments);\n        return result;\n    };\n    const segOpResult = segOpCompute(a2D, 'unsortedSegmentSum', segmentIds, outputDType, numSegments);\n    const reshaped = reshape({ inputs: { x: segOpResult }, backend, attrs: { shape: outShape } });\n    let result = reshaped;\n    if (permutation != null) {\n        toDispose.push(reshaped);\n        const perm = backend_util.getUndoAxesPermutation(permutation);\n        result = transpose({ inputs: { x: result }, backend, attrs: { perm } });\n    }\n    toDispose.forEach(t => backend.disposeIntermediateTensorInfo(t));\n    return result;\n}\nexport const unsortedSegmentSumConfig = {\n    kernelName: UnsortedSegmentSum,\n    backendName: 'webgl',\n    kernelFunc: unsortedSegmentSum\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVW5zb3J0ZWRTZWdtZW50U3VtLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vdGZqcy1iYWNrZW5kLXdlYmdsL3NyYy9rZXJuZWxzL1Vuc29ydGVkU2VnbWVudFN1bS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFFSCxPQUFPLEVBQUMsWUFBWSxFQUFzQyxVQUFVLEVBQWMsa0JBQWtCLEVBQXFELElBQUksRUFBQyxNQUFNLHVCQUF1QixDQUFDO0FBRzVMLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLFdBQVcsQ0FBQztBQUNsQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE1BQU0sUUFBUSxDQUFDO0FBQzVCLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxhQUFhLENBQUM7QUFFdEMsTUFBTSxVQUFVLGtCQUFrQixDQUFDLElBSWxDO0lBQ0MsTUFBTSxFQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFDLEdBQUcsSUFBSSxDQUFDO0lBQ3RDLE1BQU0sRUFBQyxDQUFDLEVBQUUsVUFBVSxFQUFDLEdBQUcsTUFBTSxDQUFDO0lBQy9CLE1BQU0sRUFBQyxXQUFXLEVBQUMsR0FBRyxLQUFLLENBQUM7SUFFNUIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFFN0IsTUFBTSxTQUFTLEdBQUcsRUFBRSxDQUFDO0lBRXJCLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQztJQUNiLE1BQU0sV0FBVyxHQUFHLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ25FLElBQUksU0FBUyxHQUFHLENBQUMsQ0FBQztJQUNsQixJQUFJLFdBQVcs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RUFBRSxLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDbEUsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQyxDQUFDO0lBRU4sTUFBTSxXQUFXLEdBQUcsWUFBWSxDQUM1QixHQUFHLEVBQUUsb0JBQW9CLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUVyRSxNQUFNLFFBQVEsR0FDVixPQUFPLENBQUMsRUFBQyxNQUFNLEVBQUUsRUFBQyxDQUFDLEVBQUUsV0FBVyxFQUFDLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxRQUFRLEVBQUMsRUFBQyxDQUFDLENBQUM7SUFFM0UsSUFBSSxNQUFNLEdBQUcsUUFBUSxDQUFDO0lBQ3RCLElBQUksV0FBVyxJQUFJLElBQUksRUFBRTtRQUN2QixTQUFTLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3pCLE1BQU0sSUFBSSxHQUFHLFlBQVksQ0FBQyxzQkFBc0IsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM5RCxNQUFNLEdBQUcsU0FBUyxDQUFDLEVBQUMsTUFBTSxFQUFFLEVBQUMsQ0FBQyxFQUFFLE1BQU0sRUFBQyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBQyxJQUFJLEVBQUMsRUFBQyxDQUFDLENBQUM7S0FDbkU7SUFFRCxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLDZCQUE2QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakUsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELE1BQU0sQ0FBQyxNQUFNLHdCQUF3QixHQUFpQjtJQUNwRCxVQUFVLEVBQUUsa0JBQWtCO0lBQzlCLFdBQVcsRUFBRSxPQUFPO0lBQ3BCLFVBQVUsRUFBRSxrQkFBc0M7Q0FDbkQsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCAyMDIwIEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpO1xuICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLlxuICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0XG4gKlxuICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wXG4gKlxuICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZVxuICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gXCJBUyBJU1wiIEJBU0lTLFxuICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuXG4gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kXG4gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5cbiAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKi9cblxuaW1wb3J0IHtiYWNrZW5kX3V0aWwsIERhdGFUeXBlLCBLZXJuZWxDb25maWcsIEtlcm5lbEZ1bmMsIHN1bU91dFR5cGUsIFRlbnNvckluZm8sIFVuc29ydGVkU2VnbWVudFN1bSwgVW5zb3J0ZWRTZWdtZW50U3VtQXR0cnMsIFVuc29ydGVkU2VnbWVudFN1bUlucHV0cywgdXRpbH0gZnJvbSAnQHRlbnNvcmZsb3cvdGZqcy1jb3JlJztcblxuaW1wb3J0IHtNYXRoQmFja2VuZFdlYkdMfSBmcm9tICcuLi9iYWNrZW5kX3dlYmdsJztcbmltcG9ydCB7U2VnbWVudE9wUHJvZ3JhbX0gZnJvbSAnLi4vc2VnbWVudF9ncHUnO1xuXG5pbXBvcnQge3JhbmdlfSBmcm9tICcuL1JhbmdlJztcbmltcG9ydCB7cmVzaGFwZX0gZnJvbSAnLi9SZXNoYXBlJztcbmltcG9ydCB7dGlsZX0gZnJvbSAnLi9UaWxlJztcbmltcG9ydCB7dHJhbnNwb3NlfSBmcm9tICcuL1RyYW5zcG9zZSc7XG5cbmV4cG9ydCBmdW5jdGlvbiB1bnNvcnRlZFNlZ21lbnRTdW0oYXJnczoge1xuICBpbnB1dHM6IFVuc29ydGVkU2VnbWVudFN1bUlucHV0cyxcbiAgYmFja2VuZDogTWF0aEJhY2tlbmRXZWJHTCxcbiAgYXR0cnM6IFVuc29ydGVkU2VnbWVudFN1bUF0dHJzXG59KTogVGVuc29ySW5mbyB7XG4gIGNvbnN0IHtpbnB1dHMsIGJhY2tlbmQsIGF0dHJzfSA9IGFyZ3M7XG4gIGNvbnN0IHt4LCBzZWdtZW50SWRzfSA9IGlucHV0cztcbiAgY29uc3Qge251bVNlZ21lbnRzfSA9IGF0dHJzO1xuXG4gIGNvbnN0IHhSYW5rID0geC5zaGFwZS5sZW5ndGg7XG5cbiAgY29uc3QgdG9EaXNwb3NlID0gW107XG5cbiAgbGV0IGF4aXMgPSAwO1xuICBjb25zdCBwZXJtdXRhdGlvbiA9IGJhY2tlbmRfdXRpbC5nZXRBeGVzUGVybXV0YXRpb24oW2F4aXNdLCB4UmFuayk7XG4gIGxldCBwZXJtdXRlZFggPSB4O1xuICBpZiAocGVybXV0YXRpb24gIT0gbnVsbCkge1xuICAgIHBlcm11dGVkWCA9IHRyYW5zcG9zZSh7aW5wdXRzOiB7eH0sIGJhY2tlbmQsIGF0dHJzOiB7cGVybTogcGVybXV0YXRpb259fSk7XG4gICAgdG9EaXNwb3NlLnB1c2gocGVybXV0ZWRYKTtcbiAgICBheGlzID0gYmFja2VuZF91dGlsLmdldElubmVyTW9zdEF4ZXMoMSwgeFJhbmspWzBdO1xuICB9XG5cbiAgY29uc3Qgb3V0U2hhcGUgPSBiYWNrZW5kX3V0aWwuc2VnbWVudF91dGlsLmNvbXB1dGVPdXRTaGFwZShcbiAgICAgIHBlcm11dGVkWC5zaGFwZSwgYXhpcywgbnVtU2VnbWVudHMpO1xuICBjb25zdCBpblNpemUgPSB1dGlsLnNpemVGcm9tU2hhcGUoW3Blcm11dGVkWC5zaGFwZVtheGlzXV0pO1xuICBjb25zdCBhMkQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogcGVybXV0ZWRYfSwgYmFja2VuZCwgYXR0cnM6IHtzaGFwZTogWy0xLCBpblNpemVdfX0pO1xuICB0b0Rpc3Bvc2UucHVzaChhMkQpO1xuXG4gIGNvbnN0IG91dHB1dERUeXBlID0gc3VtT3V0VHlwZSh4LmR0eXBlKTtcblxuICBjb25zdCBzZWdPcENvbXB1dGUgPVxuICAgICAgKHg6IFRlbnNvckluZm8sIHNlZ09wVHlwZTogJ3Vuc29ydGVkU2VnbWVudFN1bScsIHNlZ21lbnRJZHM6IFRlbnNvckluZm8sXG4gICAgICAgZHR5cGU6IERhdGFUeXBlLCBudW1TZWdtZW50czogbnVtYmVyKTogVGVuc29ySW5mbyA9PiB7XG4gICAgICAgIGNvbnN0IGJhdGNoU2l6ZSA9IHguc2hhcGVbMF07XG4gICAgICAgIGNvbnN0IGluU2l6ZSA9IHguc2hhcGVbMV07XG4gICAgICAgIGNvbnN0IHdpbmRvd1NpemUgPVxuICAgICAgICAgICAgYmFja2VuZF91dGlsLnNlZ21lbnRfdXRpbC5zZWdPcENvbXB1dGVPcHRpbWFsV2luZG93U2l6ZShcbiAgICAgICAgICAgICAgICBpblNpemUsIG51bVNlZ21lbnRzKTtcbiAgICAgICAgY29uc3Qgc2VnT3BJbmZvID0ge3dpbmRvd1NpemUsIGluU2l6ZSwgYmF0Y2hTaXplLCBudW1TZWdtZW50c307XG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSBuZXcgU2VnbWVudE9wUHJvZ3JhbShzZWdPcEluZm8sIHNlZ09wVHlwZSk7XG4gICAgICAgIGNvbnN0IG91dHB1dCA9IGJhY2tlbmQuY29tcGlsZUFuZFJ1bihwcm9ncmFtLCBbeCwgc2VnbWVudElkc10sIGR0eXBlKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2gob3V0cHV0KTtcbiAgICAgICAgLy8gTm8gbmVlZCB0byBydW4gYW5vdGhlciBHUEdQVSBwcm9ncmFtLlxuICAgICAgICBpZiAob3V0cHV0LnNoYXBlWzFdID09PSBudW1TZWdtZW50cykge1xuICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmFuZ2VJbmZvID0gcmFuZ2Uoe1xuICAgICAgICAgIGJhY2tlbmQsXG4gICAgICAgICAgYXR0cnM6IHtzdGFydDogMCwgc3RvcDogbnVtU2VnbWVudHMsIHN0ZXA6IDEsIGR0eXBlOiAnZmxvYXQzMid9XG4gICAgICAgIH0pO1xuICAgICAgICBjb25zdCB0aWxlSW5mbyA9IHRpbGUoe1xuICAgICAgICAgIGlucHV0czoge3g6IHJhbmdlSW5mb30sXG4gICAgICAgICAgYmFja2VuZCxcbiAgICAgICAgICBhdHRyczoge3JlcHM6IFtpblNpemUgLyB3aW5kb3dTaXplXX1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgdG9EaXNwb3NlLnB1c2gocmFuZ2VJbmZvKTtcbiAgICAgICAgdG9EaXNwb3NlLnB1c2godGlsZUluZm8pO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgICAgICBzZWdPcENvbXB1dGUob3V0cHV0LCBzZWdPcFR5cGUsIHRpbGVJbmZvLCBkdHlwZSwgbnVtU2VnbWVudHMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfTtcblxuICBjb25zdCBzZWdPcFJlc3VsdCA9IHNlZ09wQ29tcHV0ZShcbiAgICAgIGEyRCwgJ3Vuc29ydGVkU2VnbWVudFN1bScsIHNlZ21lbnRJZHMsIG91dHB1dERUeXBlLCBudW1TZWdtZW50cyk7XG5cbiAgY29uc3QgcmVzaGFwZWQgPVxuICAgICAgcmVzaGFwZSh7aW5wdXRzOiB7eDogc2VnT3BSZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3NoYXBlOiBvdXRTaGFwZX19KTtcblxuICBsZXQgcmVzdWx0ID0gcmVzaGFwZWQ7XG4gIGlmIChwZXJtdXRhdGlvbiAhPSBudWxsKSB7XG4gICAgdG9EaXNwb3NlLnB1c2gocmVzaGFwZWQpO1xuICAgIGNvbnN0IHBlcm0gPSBiYWNrZW5kX3V0aWwuZ2V0VW5kb0F4ZXNQZXJtdXRhdGlvbihwZXJtdXRhdGlvbik7XG4gICAgcmVzdWx0ID0gdHJhbnNwb3NlKHtpbnB1dHM6IHt4OiByZXN1bHR9LCBiYWNrZW5kLCBhdHRyczoge3Blcm19fSk7XG4gIH1cblxuICB0b0Rpc3Bvc2UuZm9yRWFjaCh0ID0+IGJhY2tlbmQuZGlzcG9zZUludGVybWVkaWF0ZVRlbnNvckluZm8odCkpO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5leHBvcnQgY29uc3QgdW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnOiBLZXJuZWxDb25maWcgPSB7XG4gIGtlcm5lbE5hbWU6IFVuc29ydGVkU2VnbWVudFN1bSxcbiAgYmFja2VuZE5hbWU6ICd3ZWJnbCcsXG4gIGtlcm5lbEZ1bmM6IHVuc29ydGVkU2VnbWVudFN1bSBhcyB7fSBhcyBLZXJuZWxGdW5jXG59O1xuIl19","/**\n * @license\n * Copyright 2020 Google LLC. All Rights Reserved.\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n * =============================================================================\n */\nimport { registerKernel } from '@tensorflow/tfjs-core';\nimport { _fusedMatMulConfig } from './kernels/_FusedMatMul';\nimport { absConfig } from './kernels/Abs';\nimport { acosConfig } from './kernels/Acos';\nimport { acoshConfig } from './kernels/Acosh';\nimport { addConfig } from './kernels/Add';\nimport { addNConfig } from './kernels/AddN';\nimport { allConfig } from './kernels/All';\nimport { anyConfig } from './kernels/Any';\nimport { argMaxConfig } from './kernels/ArgMax';\nimport { argMinConfig } from './kernels/ArgMin';\nimport { asinConfig } from './kernels/Asin';\nimport { asinhConfig } from './kernels/Asinh';\nimport { atanConfig } from './kernels/Atan';\nimport { atan2Config } from './kernels/Atan2';\nimport { atanhConfig } from './kernels/Atanh';\nimport { avgPoolConfig } from './kernels/AvgPool';\nimport { avgPool3DConfig } from './kernels/AvgPool3D';\nimport { avgPool3DGradConfig } from './kernels/AvgPool3DGrad';\nimport { avgPoolGradConfig } from './kernels/AvgPoolGrad';\nimport { batchMatMulConfig } from './kernels/BatchMatMul';\nimport { batchNormConfig } from './kernels/BatchNorm';\nimport { batchToSpaceNDConfig } from './kernels/BatchToSpaceND';\nimport { bincountConfig } from './kernels/Bincount';\nimport { broadcastArgsConfig } from './kernels/BroadcastArgs';\nimport { castConfig } from './kernels/Cast';\nimport { ceilConfig } from './kernels/Ceil';\nimport { clipByValueConfig } from './kernels/ClipByValue';\nimport { complexConfig } from './kernels/Complex';\nimport { complexAbsConfig } from './kernels/ComplexAbs';\nimport { concatConfig } from './kernels/Concat';\nimport { conv2DConfig } from './kernels/Conv2D';\nimport { conv2DBackpropFilterConfig } from './kernels/Conv2DBackpropFilter';\nimport { conv2DBackpropInputConfig } from './kernels/Conv2DBackpropInput';\nimport { conv3DConfig } from './kernels/Conv3D';\nimport { conv3DBackpropFilterV2Config } from './kernels/Conv3DBackpropFilterV2';\nimport { conv3DBackpropInputConfig } from './kernels/Conv3DBackpropInputV2';\nimport { cosConfig } from './kernels/Cos';\nimport { coshConfig } from './kernels/Cosh';\nimport { cropAndResizeConfig } from './kernels/CropAndResize';\nimport { cumprodConfig } from './kernels/Cumprod';\nimport { cumsumConfig } from './kernels/Cumsum';\nimport { denseBincountConfig } from './kernels/DenseBincount';\nimport { depthToSpaceConfig } from './kernels/DepthToSpace';\nimport { depthwiseConv2dNativeConfig } from './kernels/DepthwiseConv2dNative';\nimport { depthwiseConv2dNativeBackpropFilterConfig } from './kernels/DepthwiseConv2dNativeBackpropFilter';\nimport { depthwiseConv2dNativeBackpropInputConfig } from './kernels/DepthwiseConv2dNativeBackpropInput';\nimport { diagConfig } from './kernels/Diag';\nimport { dilation2DConfig } from './kernels/Dilation2D';\nimport { einsumConfig } from './kernels/Einsum';\nimport { eluConfig } from './kernels/Elu';\nimport { eluGradConfig } from './kernels/EluGrad';\nimport { equalConfig } from './kernels/Equal';\nimport { erfConfig } from './kernels/Erf';\nimport { expConfig } from './kernels/Exp';\nimport { expandDimsConfig } from './kernels/ExpandDims';\nimport { expm1Config } from './kernels/Expm1';\nimport { fftConfig } from './kernels/FFT';\nimport { fillConfig } from './kernels/Fill';\nimport { flipLeftRightConfig } from './kernels/FlipLeftRight';\nimport { floorConfig } from './kernels/Floor';\nimport { floorDivConfig } from './kernels/FloorDiv';\nimport { fromPixelsConfig } from './kernels/FromPixels';\nimport { fusedConv2DConfig } from './kernels/FusedConv2D';\nimport { fusedDepthwiseConv2DConfig } from './kernels/FusedDepthwiseConv2D';\nimport { gatherNdConfig } from './kernels/GatherNd';\nimport { gatherV2Config } from './kernels/GatherV2';\nimport { greaterConfig } from './kernels/Greater';\nimport { greaterEqualConfig } from './kernels/GreaterEqual';\nimport { identityConfig } from './kernels/Identity';\nimport { ifftConfig } from './kernels/IFFT';\nimport { imagConfig } from './kernels/Imag';\nimport { isFiniteConfig } from './kernels/IsFinite';\nimport { isInfConfig } from './kernels/IsInf';\nimport { isNaNConfig } from './kernels/IsNaN';\nimport { leakyReluConfig } from './kernels/LeakyRelu';\nimport { lessConfig } from './kernels/Less';\nimport { lessEqualConfig } from './kernels/LessEqual';\nimport { linSpaceConfig } from './kernels/LinSpace';\nimport { logConfig } from './kernels/Log';\nimport { log1pConfig } from './kernels/Log1p';\nimport { logicalAndConfig } from './kernels/LogicalAnd';\nimport { logicalNotConfig } from './kernels/LogicalNot';\nimport { logicalOrConfig } from './kernels/LogicalOr';\nimport { LRNConfig } from './kernels/LRN';\nimport { LRNGradConfig } from './kernels/LRNGrad';\nimport { maxConfig } from './kernels/Max';\nimport { maximumConfig } from './kernels/Maximum';\nimport { maxPoolConfig } from './kernels/MaxPool';\nimport { maxPool3DConfig } from './kernels/MaxPool3D';\nimport { maxPool3DGradConfig } from './kernels/MaxPool3DGrad';\nimport { maxPoolGradConfig } from './kernels/MaxPoolGrad';\nimport { maxPoolWithArgmaxConfig } from './kernels/MaxPoolWithArgmax';\nimport { meanConfig } from './kernels/Mean';\nimport { minConfig } from './kernels/Min';\nimport { minimumConfig } from './kernels/Minimum';\nimport { mirrorPadConfig } from './kernels/MirrorPad';\nimport { modConfig } from './kernels/Mod';\nimport { multinomialConfig } from './kernels/Multinomial';\nimport { multiplyConfig } from './kernels/Multiply';\nimport { negConfig } from './kernels/Neg';\nimport { nonMaxSuppressionV3Config } from './kernels/NonMaxSuppressionV3';\nimport { nonMaxSuppressionV4Config } from './kernels/NonMaxSuppressionV4';\nimport { nonMaxSuppressionV5Config } from './kernels/NonMaxSuppressionV5';\nimport { notEqualConfig } from './kernels/NotEqual';\nimport { oneHotConfig } from './kernels/OneHot';\nimport { onesLikeConfig } from './kernels/OnesLike';\nimport { packConfig } from './kernels/Pack';\nimport { padV2Config } from './kernels/PadV2';\nimport { powConfig } from './kernels/Pow';\nimport { preluConfig } from './kernels/Prelu';\nimport { prodConfig } from './kernels/Prod';\nimport { raggedGatherConfig } from './kernels/RaggedGather';\nimport { raggedTensorToTensorConfig } from './kernels/RaggedTensorToTensor';\nimport { rangeConfig } from './kernels/Range';\nimport { realConfig } from './kernels/Real';\nimport { realDivConfig } from './kernels/RealDiv';\nimport { reciprocalConfig } from './kernels/Reciprocal';\nimport { reluConfig } from './kernels/Relu';\nimport { relu6Config } from './kernels/Relu6';\nimport { reshapeConfig } from './kernels/Reshape';\nimport { resizeBilinearConfig } from './kernels/ResizeBilinear';\nimport { resizeBilinearGradConfig } from './kernels/ResizeBilinearGrad';\nimport { resizeNearestNeighborConfig } from './kernels/ResizeNearestNeighbor';\nimport { resizeNearestNeighborGradConfig } from './kernels/ResizeNearestNeighborGrad';\nimport { reverseConfig } from './kernels/Reverse';\nimport { rotateWithOffsetConfig } from './kernels/RotateWithOffset';\nimport { roundConfig } from './kernels/Round';\nimport { rsqrtConfig } from './kernels/Rsqrt';\nimport { scatterNdConfig } from './kernels/ScatterNd';\nimport { searchSortedConfig } from './kernels/SearchSorted';\nimport { selectConfig } from './kernels/Select';\nimport { seluConfig } from './kernels/Selu';\nimport { sigmoidConfig } from './kernels/Sigmoid';\nimport { signConfig } from './kernels/Sign';\nimport { sinConfig } from './kernels/Sin';\nimport { sinhConfig } from './kernels/Sinh';\nimport { sliceConfig } from './kernels/Slice';\nimport { softmaxConfig } from './kernels/Softmax';\nimport { softplusConfig } from './kernels/Softplus';\nimport { spaceToBatchNDConfig } from './kernels/SpaceToBatchND';\nimport { sparseFillEmptyRowsConfig } from './kernels/SparseFillEmptyRows';\nimport { sparseReshapeConfig } from './kernels/SparseReshape';\nimport { sparseSegmentMeanConfig } from './kernels/SparseSegmentMean';\nimport { sparseSegmentSumConfig } from './kernels/SparseSegmentSum';\nimport { sparseToDenseConfig } from './kernels/SparseToDense';\nimport { splitVConfig } from './kernels/SplitV';\nimport { sqrtConfig } from './kernels/Sqrt';\nimport { squareConfig } from './kernels/Square';\nimport { squaredDifferenceConfig } from './kernels/SquaredDifference';\nimport { stepConfig } from './kernels/Step';\nimport { stridedSliceConfig } from './kernels/StridedSlice';\nimport { stringNGramsConfig } from './kernels/StringNGrams';\nimport { stringSplitConfig } from './kernels/StringSplit';\nimport { stringToHashBucketFastConfig } from './kernels/StringToHashBucketFast';\nimport { subConfig } from './kernels/Sub';\nimport { sumConfig } from './kernels/Sum';\nimport { tanConfig } from './kernels/Tan';\nimport { tanhConfig } from './kernels/Tanh';\nimport { tileConfig } from './kernels/Tile';\nimport { topKConfig } from './kernels/TopK';\nimport { transformConfig } from './kernels/Transform';\nimport { transposeConfig } from './kernels/Transpose';\nimport { uniqueConfig } from './kernels/Unique';\nimport { unpackConfig } from './kernels/Unpack';\nimport { unsortedSegmentSumConfig } from './kernels/UnsortedSegmentSum';\nimport { zerosLikeConfig } from './kernels/ZerosLike';\n// List all kernel configs here\nconst kernelConfigs = [\n    _fusedMatMulConfig,\n    absConfig,\n    acosConfig,\n    acoshConfig,\n    addConfig,\n    addNConfig,\n    allConfig,\n    anyConfig,\n    argMaxConfig,\n    argMinConfig,\n    asinConfig,\n    asinhConfig,\n    atanConfig,\n    atan2Config,\n    atanhConfig,\n    avgPoolConfig,\n    avgPool3DConfig,\n    avgPool3DGradConfig,\n    avgPoolGradConfig,\n    batchMatMulConfig,\n    batchNormConfig,\n    batchToSpaceNDConfig,\n    bincountConfig,\n    broadcastArgsConfig,\n    castConfig,\n    ceilConfig,\n    clipByValueConfig,\n    complexConfig,\n    complexAbsConfig,\n    concatConfig,\n    conv2DConfig,\n    conv2DBackpropFilterConfig,\n    conv2DBackpropInputConfig,\n    conv3DConfig,\n    conv3DBackpropFilterV2Config,\n    conv3DBackpropInputConfig,\n    cosConfig,\n    coshConfig,\n    cropAndResizeConfig,\n    cumprodConfig,\n    cumsumConfig,\n    denseBincountConfig,\n    depthToSpaceConfig,\n    depthwiseConv2dNativeConfig,\n    depthwiseConv2dNativeBackpropFilterConfig,\n    depthwiseConv2dNativeBackpropInputConfig,\n    diagConfig,\n    dilation2DConfig,\n    einsumConfig,\n    eluConfig,\n    eluGradConfig,\n    equalConfig,\n    erfConfig,\n    expConfig,\n    expandDimsConfig,\n    expm1Config,\n    fftConfig,\n    fillConfig,\n    flipLeftRightConfig,\n    floorConfig,\n    floorDivConfig,\n    fromPixelsConfig,\n    fusedConv2DConfig,\n    fusedDepthwiseConv2DConfig,\n    gatherNdConfig,\n    gatherV2Config,\n    greaterConfig,\n    greaterEqualConfig,\n    identityConfig,\n    ifftConfig,\n    imagConfig,\n    isFiniteConfig,\n    isInfConfig,\n    isNaNConfig,\n    leakyReluConfig,\n    lessConfig,\n    lessEqualConfig,\n    linSpaceConfig,\n    logConfig,\n    log1pConfig,\n    logicalAndConfig,\n    logicalNotConfig,\n    logicalOrConfig,\n    LRNConfig,\n    LRNGradConfig,\n    maxConfig,\n    maximumConfig,\n    maxPoolConfig,\n    maxPool3DConfig,\n    maxPool3DGradConfig,\n    maxPoolGradConfig,\n    maxPoolWithArgmaxConfig,\n    meanConfig,\n    minConfig,\n    minimumConfig,\n    mirrorPadConfig,\n    modConfig,\n    multinomialConfig,\n    multiplyConfig,\n    negConfig,\n    nonMaxSuppressionV3Config,\n    nonMaxSuppressionV4Config,\n    nonMaxSuppressionV5Config,\n    notEqualConfig,\n    oneHotConfig,\n    onesLikeConfig,\n    packConfig,\n    padV2Config,\n    powConfig,\n    preluConfig,\n    prodConfig,\n    raggedGatherConfig,\n    raggedTensorToTensorConfig,\n    rangeConfig,\n    realConfig,\n    realDivConfig,\n    reciprocalConfig,\n    reluConfig,\n    relu6Config,\n    reshapeConfig,\n    resizeBilinearConfig,\n    resizeBilinearGradConfig,\n    resizeNearestNeighborConfig,\n    resizeNearestNeighborGradConfig,\n    reverseConfig,\n    rotateWithOffsetConfig,\n    roundConfig,\n    rsqrtConfig,\n    scatterNdConfig,\n    searchSortedConfig,\n    selectConfig,\n    seluConfig,\n    sigmoidConfig,\n    signConfig,\n    sinConfig,\n    sinhConfig,\n    sliceConfig,\n    softmaxConfig,\n    softplusConfig,\n    spaceToBatchNDConfig,\n    sparseFillEmptyRowsConfig,\n    sparseReshapeConfig,\n    sparseSegmentMeanConfig,\n    sparseSegmentSumConfig,\n    sparseToDenseConfig,\n    splitVConfig,\n    sqrtConfig,\n    squareConfig,\n    squaredDifferenceConfig,\n    stepConfig,\n    stridedSliceConfig,\n    stringNGramsConfig,\n    stringSplitConfig,\n    stringToHashBucketFastConfig,\n    subConfig,\n    sumConfig,\n    tanConfig,\n    tanhConfig,\n    tileConfig,\n    topKConfig,\n    transformConfig,\n    transposeConfig,\n    uniqueConfig,\n    unpackConfig,\n    unsortedSegmentSumConfig,\n    zerosLikeConfig\n];\nfor (const kernelConfig of kernelConfigs) {\n    registerKernel(kernelConfig);\n}\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXJfYWxsX2tlcm5lbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi90ZmpzLWJhY2tlbmQtd2ViZ2wvc3JjL3JlZ2lzdGVyX2FsbF9rZXJuZWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7R0FlRztBQUNILE9BQU8sRUFBZSxjQUFjLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQztBQUVuRSxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUMxQyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0saUJBQWlCLENBQUM7QUFDNUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBQUMsU0FBUyxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzFDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDMUMsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBQyxXQUFXLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sbUJB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QjtJQUNwQix5QkFBeUI7SUFDekIsbUJBQW1CO0lBQ25CLHVCQUF1QjtJQUN2QixzQkFBc0I7SUFDdEIsbUJBQW1CO0lBQ25CLFlBQVk7SUFDWixVQUFVO0lBQ1YsWUFBWTtJQUNaLHVCQUF1QjtJQUN2QixVQUFVO0lBQ1Ysa0JBQWtCO0lBQ2xCLGtCQUFrQjtJQUNsQixpQkFBaUI7SUFDakIsNEJBQTRCO0lBQzVCLFNBQVM7SUFDVCxTQUFTO0lBQ1QsU0FBUztJQUNULFVBQVU7SUFDVixVQUFVO0lBQ1YsVUFBVTtJQUNWLGVBQWU7SUFDZixlQUFlO0lBQ2YsWUFBWTtJQUNaLFlBQVk7SUFDWix3QkFBd0I7SUFDeEIsZUFBZTtDQUNoQixDQUFDO0FBRUYsS0FBSyxNQUFNLFlBQVksSUFBSSxhQUFhLEVBQUU7SUFDeEMsY0FBYyxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQzlCIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IDIwMjAgR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSBcIkxpY2Vuc2VcIik7XG4gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuXG4gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXRcbiAqXG4gKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiAqXG4gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlXG4gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsXG4gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC5cbiAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmRcbiAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLlxuICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqL1xuaW1wb3J0IHtLZXJuZWxDb25maWcsIHJlZ2lzdGVyS2VybmVsfSBmcm9tICdAdGVuc29yZmxvdy90ZmpzLWNvcmUnO1xuXG5pbXBvcnQge19mdXNlZE1hdE11bENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL19GdXNlZE1hdE11bCc7XG5pbXBvcnQge2Fic0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Ficyc7XG5pbXBvcnQge2Fjb3NDb25maWd9IGZyb20gJy4va2VybmVscy9BY29zJztcbmltcG9ydCB7YWNvc2hDb25maWd9IGZyb20gJy4va2VybmVscy9BY29zaCc7XG5pbXBvcnQge2FkZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FkZCc7XG5pbXBvcnQge2FkZE5Db25maWd9IGZyb20gJy4va2VybmVscy9BZGROJztcbmltcG9ydCB7YWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQWxsJztcbmltcG9ydCB7YW55Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQW55JztcbmltcG9ydCB7YXJnTWF4Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXJnTWF4JztcbmltcG9ydCB7YXJnTWluQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXJnTWluJztcbmltcG9ydCB7YXNpbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FzaW4nO1xuaW1wb3J0IHthc2luaENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0FzaW5oJztcbmltcG9ydCB7YXRhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F0YW4nO1xuaW1wb3J0IHthdGFuMkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F0YW4yJztcbmltcG9ydCB7YXRhbmhDb25maWd9IGZyb20gJy4va2VybmVscy9BdGFuaCc7XG5pbXBvcnQge2F2Z1Bvb2xDb25maWd9IGZyb20gJy4va2VybmVscy9BdmdQb29sJztcbmltcG9ydCB7YXZnUG9vbDNEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQXZnUG9vbDNEJztcbmltcG9ydCB7YXZnUG9vbDNER3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2wzREdyYWQnO1xuaW1wb3J0IHthdmdQb29sR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0F2Z1Bvb2xHcmFkJztcbmltcG9ydCB7YmF0Y2hNYXRNdWxDb25maWd9IGZyb20gJy4va2VybmVscy9CYXRjaE1hdE11bCc7XG5pbXBvcnQge2JhdGNoTm9ybUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JhdGNoTm9ybSc7XG5pbXBvcnQge2JhdGNoVG9TcGFjZU5EQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQmF0Y2hUb1NwYWNlTkQnO1xuaW1wb3J0IHtiaW5jb3VudENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0JpbmNvdW50JztcbmltcG9ydCB7YnJvYWRjYXN0QXJnc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Jyb2FkY2FzdEFyZ3MnO1xuaW1wb3J0IHtjYXN0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ2FzdCc7XG5pbXBvcnQge2NlaWxDb25maWd9IGZyb20gJy4va2VybmVscy9DZWlsJztcbmltcG9ydCB7Y2xpcEJ5VmFsdWVDb25maWd9IGZyb20gJy4va2VybmVscy9DbGlwQnlWYWx1ZSc7XG5pbXBvcnQge2NvbXBsZXhDb25maWd9IGZyb20gJy4va2VybmVscy9Db21wbGV4JztcbmltcG9ydCB7Y29tcGxleEFic0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbXBsZXhBYnMnO1xuaW1wb3J0IHtjb25jYXRDb25maWd9IGZyb20gJy4va2VybmVscy9Db25jYXQnO1xuaW1wb3J0IHtjb252MkRDb25maWd9IGZyb20gJy4va2VybmVscy9Db252MkQnO1xuaW1wb3J0IHtjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wRmlsdGVyJztcbmltcG9ydCB7Y29udjJEQmFja3Byb3BJbnB1dENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0NvbnYyREJhY2twcm9wSW5wdXQnO1xuaW1wb3J0IHtjb252M0RDb25maWd9IGZyb20gJy4va2VybmVscy9Db252M0QnO1xuaW1wb3J0IHtjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29udjNEQmFja3Byb3BGaWx0ZXJWMic7XG5pbXBvcnQge2NvbnYzREJhY2twcm9wSW5wdXRDb25maWd9IGZyb20gJy4va2VybmVscy9Db252M0RCYWNrcHJvcElucHV0VjInO1xuaW1wb3J0IHtjb3NDb25maWd9IGZyb20gJy4va2VybmVscy9Db3MnO1xuaW1wb3J0IHtjb3NoQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvQ29zaCc7XG5pbXBvcnQge2Nyb3BBbmRSZXNpemVDb25maWd9IGZyb20gJy4va2VybmVscy9Dcm9wQW5kUmVzaXplJztcbmltcG9ydCB7Y3VtcHJvZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0N1bXByb2QnO1xuaW1wb3J0IHtjdW1zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9DdW1zdW0nO1xuaW1wb3J0IHtkZW5zZUJpbmNvdW50Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVuc2VCaW5jb3VudCc7XG5pbXBvcnQge2RlcHRoVG9TcGFjZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RlcHRoVG9TcGFjZSc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RlcHRod2lzZUNvbnYyZE5hdGl2ZSc7XG5pbXBvcnQge2RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BGaWx0ZXInO1xuaW1wb3J0IHtkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCc7XG5pbXBvcnQge2RpYWdDb25maWd9IGZyb20gJy4va2VybmVscy9EaWFnJztcbmltcG9ydCB7ZGlsYXRpb24yRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0RpbGF0aW9uMkQnO1xuaW1wb3J0IHtlaW5zdW1Db25maWd9IGZyb20gJy4va2VybmVscy9FaW5zdW0nO1xuaW1wb3J0IHtlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9FbHUnO1xuaW1wb3J0IHtlbHVHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRWx1R3JhZCc7XG5pbXBvcnQge2VxdWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXF1YWwnO1xuaW1wb3J0IHtlcmZDb25maWd9IGZyb20gJy4va2VybmVscy9FcmYnO1xuaW1wb3J0IHtleHBDb25maWd9IGZyb20gJy4va2VybmVscy9FeHAnO1xuaW1wb3J0IHtleHBhbmREaW1zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwYW5kRGltcyc7XG5pbXBvcnQge2V4cG0xQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRXhwbTEnO1xuaW1wb3J0IHtmZnRDb25maWd9IGZyb20gJy4va2VybmVscy9GRlQnO1xuaW1wb3J0IHtmaWxsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmlsbCc7XG5pbXBvcnQge2ZsaXBMZWZ0UmlnaHRDb25maWd9IGZyb20gJy4va2VybmVscy9GbGlwTGVmdFJpZ2h0JztcbmltcG9ydCB7Zmxvb3JDb25maWd9IGZyb20gJy4va2VybmVscy9GbG9vcic7XG5pbXBvcnQge2Zsb29yRGl2Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRmxvb3JEaXYnO1xuaW1wb3J0IHtmcm9tUGl4ZWxzQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRnJvbVBpeGVscyc7XG5pbXBvcnQge2Z1c2VkQ29udjJEQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvRnVzZWRDb252MkQnO1xuaW1wb3J0IHtmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0Z1c2VkRGVwdGh3aXNlQ29udjJEJztcbmltcG9ydCB7Z2F0aGVyTmRDb25maWd9IGZyb20gJy4va2VybmVscy9HYXRoZXJOZCc7XG5pbXBvcnQge2dhdGhlclYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR2F0aGVyVjInO1xuaW1wb3J0IHtncmVhdGVyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvR3JlYXRlcic7XG5pbXBvcnQge2dyZWF0ZXJFcXVhbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0dyZWF0ZXJFcXVhbCc7XG5pbXBvcnQge2lkZW50aXR5Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSWRlbnRpdHknO1xuaW1wb3J0IHtpZmZ0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSUZGVCc7XG5pbXBvcnQge2ltYWdDb25maWd9IGZyb20gJy4va2VybmVscy9JbWFnJztcbmltcG9ydCB7aXNGaW5pdGVDb25maWd9IGZyb20gJy4va2VybmVscy9Jc0Zpbml0ZSc7XG5pbXBvcnQge2lzSW5mQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvSXNJbmYnO1xuaW1wb3J0IHtpc05hTkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0lzTmFOJztcbmltcG9ydCB7bGVha3lSZWx1Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTGVha3lSZWx1JztcbmltcG9ydCB7bGVzc0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xlc3MnO1xuaW1wb3J0IHtsZXNzRXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9MZXNzRXF1YWwnO1xuaW1wb3J0IHtsaW5TcGFjZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xpblNwYWNlJztcbmltcG9ydCB7bG9nQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTG9nJztcbmltcG9ydCB7bG9nMXBDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2cxcCc7XG5pbXBvcnQge2xvZ2ljYWxBbmRDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsQW5kJztcbmltcG9ydCB7bG9naWNhbE5vdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL0xvZ2ljYWxOb3QnO1xuaW1wb3J0IHtsb2dpY2FsT3JDb25maWd9IGZyb20gJy4va2VybmVscy9Mb2dpY2FsT3InO1xuaW1wb3J0IHtMUk5Db25maWd9IGZyb20gJy4va2VybmVscy9MUk4nO1xuaW1wb3J0IHtMUk5HcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTFJOR3JhZCc7XG5pbXBvcnQge21heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heCc7XG5pbXBvcnQge21heGltdW1Db25maWd9IGZyb20gJy4va2VybmVscy9NYXhpbXVtJztcbmltcG9ydCB7bWF4UG9vbENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2wnO1xuaW1wb3J0IHttYXhQb29sM0RDb25maWd9IGZyb20gJy4va2VybmVscy9NYXhQb29sM0QnO1xuaW1wb3J0IHttYXhQb29sM0RHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbDNER3JhZCc7XG5pbXBvcnQge21heFBvb2xHcmFkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWF4UG9vbEdyYWQnO1xuaW1wb3J0IHttYXhQb29sV2l0aEFyZ21heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01heFBvb2xXaXRoQXJnbWF4JztcbmltcG9ydCB7bWVhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01lYW4nO1xuaW1wb3J0IHttaW5Db25maWd9IGZyb20gJy4va2VybmVscy9NaW4nO1xuaW1wb3J0IHttaW5pbXVtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTWluaW11bSc7XG5pbXBvcnQge21pcnJvclBhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01pcnJvclBhZCc7XG5pbXBvcnQge21vZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL01vZCc7XG5pbXBvcnQge211bHRpbm9taWFsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTXVsdGlub21pYWwnO1xuaW1wb3J0IHttdWx0aXBseUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL011bHRpcGx5JztcbmltcG9ydCB7bmVnQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTmVnJztcbmltcG9ydCB7bm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL05vbk1heFN1cHByZXNzaW9uVjMnO1xuaW1wb3J0IHtub25NYXhTdXBwcmVzc2lvblY0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvTm9uTWF4U3VwcHJlc3Npb25WNCc7XG5pbXBvcnQge25vbk1heFN1cHByZXNzaW9uVjVDb25maWd9IGZyb20gJy4va2VybmVscy9Ob25NYXhTdXBwcmVzc2lvblY1JztcbmltcG9ydCB7bm90RXF1YWxDb25maWd9IGZyb20gJy4va2VybmVscy9Ob3RFcXVhbCc7XG5pbXBvcnQge29uZUhvdENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL09uZUhvdCc7XG5pbXBvcnQge29uZXNMaWtlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvT25lc0xpa2UnO1xuaW1wb3J0IHtwYWNrQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUGFjayc7XG5pbXBvcnQge3BhZFYyQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUGFkVjInO1xuaW1wb3J0IHtwb3dDb25maWd9IGZyb20gJy4va2VybmVscy9Qb3cnO1xuaW1wb3J0IHtwcmVsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1ByZWx1JztcbmltcG9ydCB7cHJvZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Byb2QnO1xuaW1wb3J0IHtyYWdnZWRHYXRoZXJDb25maWd9IGZyb20gJy4va2VybmVscy9SYWdnZWRHYXRoZXInO1xuaW1wb3J0IHtyYWdnZWRUZW5zb3JUb1RlbnNvckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JhZ2dlZFRlbnNvclRvVGVuc29yJztcbmltcG9ydCB7cmFuZ2VDb25maWd9IGZyb20gJy4va2VybmVscy9SYW5nZSc7XG5pbXBvcnQge3JlYWxDb25maWd9IGZyb20gJy4va2VybmVscy9SZWFsJztcbmltcG9ydCB7cmVhbERpdkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JlYWxEaXYnO1xuaW1wb3J0IHtyZWNpcHJvY2FsQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUmVjaXByb2NhbCc7XG5pbXBvcnQge3JlbHVDb25maWd9IGZyb20gJy4va2VybmVscy9SZWx1JztcbmltcG9ydCB7cmVsdTZDb25maWd9IGZyb20gJy4va2VybmVscy9SZWx1Nic7XG5pbXBvcnQge3Jlc2hhcGVDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNoYXBlJztcbmltcG9ydCB7cmVzaXplQmlsaW5lYXJDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNpemVCaWxpbmVhcic7XG5pbXBvcnQge3Jlc2l6ZUJpbGluZWFyR3JhZENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZUJpbGluZWFyR3JhZCc7XG5pbXBvcnQge3Jlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1Jlc2l6ZU5lYXJlc3ROZWlnaGJvcic7XG5pbXBvcnQge3Jlc2l6ZU5lYXJlc3ROZWlnaGJvckdyYWRDb25maWd9IGZyb20gJy4va2VybmVscy9SZXNpemVOZWFyZXN0TmVpZ2hib3JHcmFkJztcbmltcG9ydCB7cmV2ZXJzZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JldmVyc2UnO1xuaW1wb3J0IHtyb3RhdGVXaXRoT2Zmc2V0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUm90YXRlV2l0aE9mZnNldCc7XG5pbXBvcnQge3JvdW5kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvUm91bmQnO1xuaW1wb3J0IHtyc3FydENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1JzcXJ0JztcbmltcG9ydCB7c2NhdHRlck5kQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2NhdHRlck5kJztcbmltcG9ydCB7c2VhcmNoU29ydGVkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2VhcmNoU29ydGVkJztcbmltcG9ydCB7c2VsZWN0Q29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2VsZWN0JztcbmltcG9ydCB7c2VsdUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NlbHUnO1xuaW1wb3J0IHtzaWdtb2lkQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2lnbW9pZCc7XG5pbXBvcnQge3NpZ25Db25maWd9IGZyb20gJy4va2VybmVscy9TaWduJztcbmltcG9ydCB7c2luQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU2luJztcbmltcG9ydCB7c2luaENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NpbmgnO1xuaW1wb3J0IHtzbGljZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NsaWNlJztcbmltcG9ydCB7c29mdG1heENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NvZnRtYXgnO1xuaW1wb3J0IHtzb2Z0cGx1c0NvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NvZnRwbHVzJztcbmltcG9ydCB7c3BhY2VUb0JhdGNoTkRDb25maWd9IGZyb20gJy4va2VybmVscy9TcGFjZVRvQmF0Y2hORCc7XG5pbXBvcnQge3NwYXJzZUZpbGxFbXB0eVJvd3NDb25maWd9IGZyb20gJy4va2VybmVscy9TcGFyc2VGaWxsRW1wdHlSb3dzJztcbmltcG9ydCB7c3BhcnNlUmVzaGFwZUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVJlc2hhcGUnO1xuaW1wb3J0IHtzcGFyc2VTZWdtZW50TWVhbkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVNlZ21lbnRNZWFuJztcbmltcG9ydCB7c3BhcnNlU2VnbWVudFN1bUNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwYXJzZVNlZ21lbnRTdW0nO1xuaW1wb3J0IHtzcGFyc2VUb0RlbnNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3BhcnNlVG9EZW5zZSc7XG5pbXBvcnQge3NwbGl0VkNvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1NwbGl0Vic7XG5pbXBvcnQge3NxcnRDb25maWd9IGZyb20gJy4va2VybmVscy9TcXJ0JztcbmltcG9ydCB7c3F1YXJlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3F1YXJlJztcbmltcG9ydCB7c3F1YXJlZERpZmZlcmVuY2VDb25maWd9IGZyb20gJy4va2VybmVscy9TcXVhcmVkRGlmZmVyZW5jZSc7XG5pbXBvcnQge3N0ZXBDb25maWd9IGZyb20gJy4va2VybmVscy9TdGVwJztcbmltcG9ydCB7c3RyaWRlZFNsaWNlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RyaWRlZFNsaWNlJztcbmltcG9ydCB7c3RyaW5nTkdyYW1zQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3RyaW5nTkdyYW1zJztcbmltcG9ydCB7c3RyaW5nU3BsaXRDb25maWd9IGZyb20gJy4va2VybmVscy9TdHJpbmdTcGxpdCc7XG5pbXBvcnQge3N0cmluZ1RvSGFzaEJ1Y2tldEZhc3RDb25maWd9IGZyb20gJy4va2VybmVscy9TdHJpbmdUb0hhc2hCdWNrZXRGYXN0JztcbmltcG9ydCB7c3ViQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3ViJztcbmltcG9ydCB7c3VtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvU3VtJztcbmltcG9ydCB7dGFuQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVGFuJztcbmltcG9ydCB7dGFuaENvbmZpZ30gZnJvbSAnLi9rZXJuZWxzL1RhbmgnO1xuaW1wb3J0IHt0aWxlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVGlsZSc7XG5pbXBvcnQge3RvcEtDb25maWd9IGZyb20gJy4va2VybmVscy9Ub3BLJztcbmltcG9ydCB7dHJhbnNmb3JtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNmb3JtJztcbmltcG9ydCB7dHJhbnNwb3NlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVHJhbnNwb3NlJztcbmltcG9ydCB7dW5pcXVlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVW5pcXVlJztcbmltcG9ydCB7dW5wYWNrQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVW5wYWNrJztcbmltcG9ydCB7dW5zb3J0ZWRTZWdtZW50U3VtQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvVW5zb3J0ZWRTZWdtZW50U3VtJztcbmltcG9ydCB7emVyb3NMaWtlQ29uZmlnfSBmcm9tICcuL2tlcm5lbHMvWmVyb3NMaWtlJztcblxuLy8gTGlzdCBhbGwga2VybmVsIGNvbmZpZ3MgaGVyZVxuY29uc3Qga2VybmVsQ29uZmlnczogS2VybmVsQ29uZmlnW10gPSBbXG4gIF9mdXNlZE1hdE11bENvbmZpZyxcbiAgYWJzQ29uZmlnLFxuICBhY29zQ29uZmlnLFxuICBhY29zaENvbmZpZyxcbiAgYWRkQ29uZmlnLFxuICBhZGROQ29uZmlnLFxuICBhbGxDb25maWcsXG4gIGFueUNvbmZpZyxcbiAgYXJnTWF4Q29uZmlnLFxuICBhcmdNaW5Db25maWcsXG4gIGFzaW5Db25maWcsXG4gIGFzaW5oQ29uZmlnLFxuICBhdGFuQ29uZmlnLFxuICBhdGFuMkNvbmZpZyxcbiAgYXRhbmhDb25maWcsXG4gIGF2Z1Bvb2xDb25maWcsXG4gIGF2Z1Bvb2wzRENvbmZpZyxcbiAgYXZnUG9vbDNER3JhZENvbmZpZyxcbiAgYXZnUG9vbEdyYWRDb25maWcsXG4gIGJhdGNoTWF0TXVsQ29uZmlnLFxuICBiYXRjaE5vcm1Db25maWcsXG4gIGJhdGNoVG9TcGFjZU5EQ29uZmlnLFxuICBiaW5jb3VudENvbmZpZyxcbiAgYnJvYWRjYXN0QXJnc0NvbmZpZyxcbiAgY2FzdENvbmZpZyxcbiAgY2VpbENvbmZpZyxcbiAgY2xpcEJ5VmFsdWVDb25maWcsXG4gIGNvbXBsZXhDb25maWcsXG4gIGNvbXBsZXhBYnNDb25maWcsXG4gIGNvbmNhdENvbmZpZyxcbiAgY29udjJEQ29uZmlnLFxuICBjb252MkRCYWNrcHJvcEZpbHRlckNvbmZpZyxcbiAgY29udjJEQmFja3Byb3BJbnB1dENvbmZpZyxcbiAgY29udjNEQ29uZmlnLFxuICBjb252M0RCYWNrcHJvcEZpbHRlclYyQ29uZmlnLFxuICBjb252M0RCYWNrcHJvcElucHV0Q29uZmlnLFxuICBjb3NDb25maWcsXG4gIGNvc2hDb25maWcsXG4gIGNyb3BBbmRSZXNpemVDb25maWcsXG4gIGN1bXByb2RDb25maWcsXG4gIGN1bXN1bUNvbmZpZyxcbiAgZGVuc2VCaW5jb3VudENvbmZpZyxcbiAgZGVwdGhUb1NwYWNlQ29uZmlnLFxuICBkZXB0aHdpc2VDb252MmROYXRpdmVDb25maWcsXG4gIGRlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyQ29uZmlnLFxuICBkZXB0aHdpc2VDb252MmROYXRpdmVCYWNrcHJvcElucHV0Q29uZmlnLFxuICBkaWFnQ29uZmlnLFxuICBkaWxhdGlvbjJEQ29uZmlnLFxuICBlaW5zdW1Db25maWcsXG4gIGVsdUNvbmZpZyxcbiAgZWx1R3JhZENvbmZpZyxcbiAgZXF1YWxDb25maWcsXG4gIGVyZkNvbmZpZyxcbiAgZXhwQ29uZmlnLFxuICBleHBhbmREaW1zQ29uZmlnLFxuICBleHBtMUNvbmZpZyxcbiAgZmZ0Q29uZmlnLFxuICBmaWxsQ29uZmlnLFxuICBmbGlwTGVmdFJpZ2h0Q29uZmlnLFxuICBmbG9vckNvbmZpZyxcbiAgZmxvb3JEaXZDb25maWcsXG4gIGZyb21QaXhlbHNDb25maWcsXG4gIGZ1c2VkQ29udjJEQ29uZmlnLFxuICBmdXNlZERlcHRod2lzZUNvbnYyRENvbmZpZyxcbiAgZ2F0aGVyTmRDb25maWcsXG4gIGdhdGhlclYyQ29uZmlnLFxuICBncmVhdGVyQ29uZmlnLFxuICBncmVhdGVyRXF1YWxDb25maWcsXG4gIGlkZW50aXR5Q29uZmlnLFxuICBpZmZ0Q29uZmlnLFxuICBpbWFnQ29uZmlnLFxuICBpc0Zpbml0ZUNvbmZpZyxcbiAgaXNJbmZDb25maWcsXG4gIGlzTmFOQ29uZmlnLFxuICBsZWFreVJlbHVDb25maWcsXG4gIGxlc3NDb25maWcsXG4gIGxlc3NFcXVhbENvbmZpZyxcbiAgbGluU3BhY2VDb25maWcsXG4gIGxvZ0NvbmZpZyxcbiAgbG9nMXBDb25maWcsXG4gIGxvZ2ljYWxBbmRDb25maWcsXG4gIGxvZ2ljYWxOb3RDb25maWcsXG4gIGxvZ2ljYWxPckNvbmZpZyxcbiAgTFJOQ29uZmlnLFxuICBMUk5HcmFkQ29uZmlnLFxuICBtYXhDb25maWcsXG4gIG1heGltdW1Db25maWcsXG4gIG1heFBvb2xDb25maWcsXG4gIG1heFBvb2wzRENvbmZpZyxcbiAgbWF4UG9vbDNER3JhZENvbmZpZyxcbiAgbWF4UG9vbEdyYWRDb25maWcsXG4gIG1heFBvb2xXaXRoQXJnbWF4Q29uZmlnLFxuICBtZWFuQ29uZmlnLFxuICBtaW5Db25maWcsXG4gIG1pbmltdW1Db25maWcsXG4gIG1pcnJvclBhZENvbmZpZyxcbiAgbW9kQ29uZmlnLFxuICBtdWx0aW5vbWlhbENvbmZpZyxcbiAgbXVsdGlwbHlDb25maWcsXG4gIG5lZ0NvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WM0NvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WNENvbmZpZyxcbiAgbm9uTWF4U3VwcHJlc3Npb25WNUNvbmZpZyxcbiAgbm90RXF1YWxDb25maWcsXG4gIG9uZUhvdENvbmZpZyxcbiAgb25lc0xpa2VDb25maWcsXG4gIHBhY2tDb25maWcsXG4gIHBhZFYyQ29uZmlnLFxuICBwb3dDb25maWcsXG4gIHByZWx1Q29uZmlnLFxuICBwcm9kQ29uZmlnLFxuICByYWdnZWRHYXRoZXJDb25maWcsXG4gIHJhZ2dlZFRlbnNvclRvVGVuc29yQ29uZmlnLFxuICByYW5nZUNvbmZpZyxcbiAgcmVhbENvbmZpZyxcbiAgcmVhbERpdkNvbmZpZyxcbiAgcmVjaXByb2NhbENvbmZpZyxcbiAgcmVsdUNvbmZpZyxcbiAgcmVsdTZDb25maWcsXG4gIHJlc2hhcGVDb25maWcsXG4gIHJlc2l6ZUJpbGluZWFyQ29uZmlnLFxuICByZXNpemVCaWxpbmVhckdyYWRDb25maWcsXG4gIHJlc2l6ZU5lYXJlc3ROZWlnaGJvckNvbmZpZyxcbiAgcmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZENvbmZpZyxcbiAgcmV2ZXJzZUNvbmZpZyxcbiAgcm90YXRlV2l0aE9mZnNldENvbmZpZyxcbiAgcm91bmRDb25maWcsXG4gIHJzcXJ0Q29uZmlnLFxuICBzY2F0dGVyTmRDb25maWcsXG4gIHNlYXJjaFNvcnRlZENvbmZpZyxcbiAgc2VsZWN0Q29uZmlnLFxuICBzZWx1Q29uZmlnLFxuICBzaWdtb2lkQ29uZmlnLFxuICBzaWduQ29uZmlnLFxuICBzaW5Db25maWcsXG4gIHNpbmhDb25maWcsXG4gIHNsaWNlQ29uZmlnLFxuICBzb2Z0bWF4Q29uZmlnLFxuICBzb2Z0cGx1c0NvbmZpZyxcbiAgc3BhY2VUb0JhdGNoTkRDb25maWcsXG4gIHNwYXJzZUZpbGxFbXB0eVJvd3NDb25maWcsXG4gIHNwYXJzZVJlc2hhcGVDb25maWcsXG4gIHNwYXJzZVNlZ21lbnRNZWFuQ29uZmlnLFxuICBzcGFyc2VTZWdtZW50U3VtQ29uZmlnLFxuICBzcGFyc2VUb0RlbnNlQ29uZmlnLFxuICBzcGxpdFZDb25maWcsXG4gIHNxcnRDb25maWcsXG4gIHNxdWFyZUNvbmZpZyxcbiAgc3F1YXJlZERpZmZlcmVuY2VDb25maWcsXG4gIHN0ZXBDb25maWcsXG4gIHN0cmlkZWRTbGljZUNvbmZpZyxcbiAgc3RyaW5nTkdyYW1zQ29uZmlnLFxuICBzdHJpbmdTcGxpdENvbmZpZyxcbiAgc3RyaW5nVG9IYXNoQnVja2V0RmFzdENvbmZpZyxcbiAgc3ViQ29uZmlnLFxuICBzdW1Db25maWcsXG4gIHRhbkNvbmZpZyxcbiAgdGFuaENvbmZpZyxcbiAgdGlsZUNvbmZpZyxcbiAgdG9wS0NvbmZpZyxcbiAgdHJhbnNmb3JtQ29uZmlnLFxuICB0cmFuc3Bvc2VDb25maWcsXG4gIHVuaXF1ZUNvbmZpZyxcbiAgdW5wYWNrQ29uZmlnLFxuICB1bnNvcnRlZFNlZ21lbnRTdW1Db25maWcsXG4gIHplcm9zTGlrZUNvbmZpZ1xuXTtcblxuZm9yIChjb25zdCBrZXJuZWxDb25maWcgb2Yga2VybmVsQ29uZmlncykge1xuICByZWdpc3Rlcktlcm5lbChrZXJuZWxDb25maWcpO1xufVxuIl19","(function (global, factory) {\n  if (typeof define === \"function\" && define.amd) {\n    define(['module'], factory);\n  } else if (typeof exports !== \"undefined\") {\n    factory(module);\n  } else {\n    var mod = {\n      exports: {}\n    };\n    factory(mod);\n    global.regression = mod.exports;\n  }\n})(this, function (module) {\n  'use strict';\n\n  function _defineProperty(obj, key, value) {\n    if (key in obj) {\n      Object.defineProperty(obj, key, {\n        value: value,\n        enumerable: true,\n        configurable: true,\n        writable: true\n      });\n    } else {\n      obj[key] = value;\n    }\n\n    return obj;\n  }\n\n  var _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  function _toConsumableArray(arr) {\n    if (Array.isArray(arr)) {\n      for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) {\n        arr2[i] = arr[i];\n      }\n\n      return arr2;\n    } else {\n      return Array.from(arr);\n    }\n  }\n\n  var DEFAULT_OPTIONS = { order: 2, precision: 2, period: null };\n\n  /**\n  * Determine the coefficient of determination (r^2) of a fit from the observations\n  * and predictions.\n  *\n  * @param {Array<Array<number>>} data - Pairs of observed x-y values\n  * @param {Array<Array<number>>} results - Pairs of observed predicted x-y values\n  *\n  * @return {number} - The r^2 value, or NaN if one cannot be calculated.\n  */\n  function determinationCoefficient(data, results) {\n    var predictions = [];\n    var observations = [];\n\n    data.forEach(function (d, i) {\n      if (d[1] !== null) {\n        observations.push(d);\n        predictions.push(results[i]);\n      }\n    });\n\n    var sum = observations.reduce(function (a, observation) {\n      return a + observation[1];\n    }, 0);\n    var mean = sum / observations.length;\n\n    var ssyy = observations.reduce(function (a, observation) {\n      var difference = observation[1] - mean;\n      return a + difference * difference;\n    }, 0);\n\n    var sse = observations.reduce(function (accum, observation, index) {\n      var prediction = predictions[index];\n      var residual = observation[1] - prediction[1];\n      return accum + residual * residual;\n    }, 0);\n\n    return 1 - sse / ssyy;\n  }\n\n  /**\n  * Determine the solution of a system of linear equations A * x = b using\n  * Gaussian elimination.\n  *\n  * @param {Array<Array<number>>} input - A 2-d matrix of data in row-major form [ A | b ]\n  * @param {number} order - How many degrees to solve for\n  *\n  * @return {Array<number>} - Vector of normalized solution coefficients matrix (x)\n  */\n  function gaussianElimination(input, order) {\n    var matrix = input;\n    var n = input.length - 1;\n    var coefficients = [order];\n\n    for (var i = 0; i < n; i++) {\n      var maxrow = i;\n      for (var j = i + 1; j < n; j++) {\n        if (Math.abs(matrix[i][j]) > Math.abs(matrix[i][maxrow])) {\n          maxrow = j;\n        }\n      }\n\n      for (var k = i; k < n + 1; k++) {\n        var tmp = matrix[k][i];\n        matrix[k][i] = matrix[k][maxrow];\n        matrix[k][maxrow] = tmp;\n      }\n\n      for (var _j = i + 1; _j < n; _j++) {\n        for (var _k = n; _k >= i; _k--) {\n          matrix[_k][_j] -= matrix[_k][i] * matrix[i][_j] / matrix[i][i];\n        }\n      }\n    }\n\n    for (var _j2 = n - 1; _j2 >= 0; _j2--) {\n      var total = 0;\n      for (var _k2 = _j2 + 1; _k2 < n; _k2++) {\n        total += matrix[_k2][_j2] * coefficients[_k2];\n      }\n\n      coefficients[_j2] = (matrix[n][_j2] - total) / matrix[_j2][_j2];\n    }\n\n    return coefficients;\n  }\n\n  /**\n  * Round a number to a precision, specificed in number of decimal places\n  *\n  * @param {number} number - The number to round\n  * @param {number} precision - The number of decimal places to round to:\n  *                             > 0 means decimals, < 0 means powers of 10\n  *\n  *\n  * @return {numbr} - The number, rounded\n  */\n  function round(number, precision) {\n    var factor = Math.pow(10, precision);\n    return Math.round(number * factor) / factor;\n  }\n\n  /**\n  * The set of all fitting methods\n  *\n  * @namespace\n  */\n  var methods = {\n    linear: function linear(data, options) {\n      var sum = [0, 0, 0, 0, 0];\n      var len = 0;\n\n      for (var n = 0; n < data.length; n++) {\n        if (data[n][1] !== null) {\n          len++;\n          sum[0] += data[n][0];\n          sum[1] += data[n][1];\n          sum[2] += data[n][0] * data[n][0];\n          sum[3] += data[n][0] * data[n][1];\n          sum[4] += data[n][1] * data[n][1];\n        }\n      }\n\n      var run = len * sum[2] - sum[0] * sum[0];\n      var rise = len * sum[3] - sum[0] * sum[1];\n      var gradient = run === 0 ? 0 : round(rise / run, options.precision);\n      var intercept = round(sum[1] / len - gradient * sum[0] / len, options.precision);\n\n      var predict = function predict(x) {\n        return [round(x, options.precision), round(gradient * x + intercept, options.precision)];\n      };\n\n      var points = data.map(function (point) {\n        return predict(point[0]);\n      });\n\n      return {\n        points: points,\n        predict: predict,\n        equation: [gradient, intercept],\n        r2: round(determinationCoefficient(data, points), options.precision),\n        string: intercept === 0 ? 'y = ' + gradient + 'x' : 'y = ' + gradient + 'x + ' + intercept\n      };\n    },\n    exponential: function exponential(data, options) {\n      var sum = [0, 0, 0, 0, 0, 0];\n\n      for (var n = 0; n < data.length; n++) {\n        if (data[n][1] !== null) {\n          sum[0] += data[n][0];\n          sum[1] += data[n][1];\n          sum[2] += data[n][0] * data[n][0] * data[n][1];\n          sum[3] += data[n][1] * Math.log(data[n][1]);\n          sum[4] += data[n][0] * data[n][1] * Math.log(data[n][1]);\n          sum[5] += data[n][0] * data[n][1];\n        }\n      }\n\n      var denominator = sum[1] * sum[2] - sum[5] * sum[5];\n      var a = Math.exp((sum[2] * sum[3] - sum[5] * sum[4]) / denominator);\n      var b = (sum[1] * sum[4] - sum[5] * sum[3]) / denominator;\n      var coeffA = round(a, options.precision);\n      var coeffB = round(b, options.precision);\n      var predict = function predict(x) {\n        return [round(x, options.precision), round(coeffA * Math.exp(coeffB * x), options.precision)];\n      };\n\n      var points = data.map(function (point) {\n        return predict(point[0]);\n      });\n\n      return {\n        points: points,\n        predict: predict,\n        equation: [coeffA, coeffB],\n        string: 'y = ' + coeffA + 'e^(' + coeffB + 'x)',\n        r2: round(determinationCoefficient(data, points), options.precision)\n      };\n    },\n    logarithmic: function logarithmic(data, options) {\n      var sum = [0, 0, 0, 0];\n      var len = data.length;\n\n      for (var n = 0; n < len; n++) {\n        if (data[n][1] !== null) {\n          sum[0] += Math.log(data[n][0]);\n          sum[1] += data[n][1] * Math.log(data[n][0]);\n          sum[2] += data[n][1];\n          sum[3] += Math.pow(Math.log(data[n][0]), 2);\n        }\n      }\n\n      var a = (len * sum[1] - sum[2] * sum[0]) / (len * sum[3] - sum[0] * sum[0]);\n      var coeffB = round(a, options.precision);\n      var coeffA = round((sum[2] - coeffB * sum[0]) / len, options.precision);\n\n      var predict = function predict(x) {\n        return [round(x, options.precision), round(round(coeffA + coeffB * Math.log(x), options.precision), options.precision)];\n      };\n\n      var points = data.map(function (point) {\n        return predict(point[0]);\n      });\n\n      return {\n        points: points,\n        predict: predict,\n        equation: [coeffA, coeffB],\n        string: 'y = ' + coeffA + ' + ' + coeffB + ' ln(x)',\n        r2: round(determinationCoefficient(data, points), options.precision)\n      };\n    },\n    power: function power(data, options) {\n      var sum = [0, 0, 0, 0, 0];\n      var len = data.length;\n\n      for (var n = 0; n < len; n++) {\n        if (data[n][1] !== null) {\n          sum[0] += Math.log(data[n][0]);\n          sum[1] += Math.log(data[n][1]) * Math.log(data[n][0]);\n          sum[2] += Math.log(data[n][1]);\n          sum[3] += Math.pow(Math.log(data[n][0]), 2);\n        }\n      }\n\n      var b = (len * sum[1] - sum[0] * sum[2]) / (len * sum[3] - Math.pow(sum[0], 2));\n      var a = (sum[2] - b * sum[0]) / len;\n      var coeffA = round(Math.exp(a), options.precision);\n      var coeffB = round(b, options.precision);\n\n      var predict = function predict(x) {\n        return [round(x, options.precision), round(round(coeffA * Math.pow(x, coeffB), options.precision), options.precision)];\n      };\n\n      var points = data.map(function (point) {\n        return predict(point[0]);\n      });\n\n      return {\n        points: points,\n        predict: predict,\n        equation: [coeffA, coeffB],\n        string: 'y = ' + coeffA + 'x^' + coeffB,\n        r2: round(determinationCoefficient(data, points), options.precision)\n      };\n    },\n    polynomial: function polynomial(data, options) {\n      var lhs = [];\n      var rhs = [];\n      var a = 0;\n      var b = 0;\n      var len = data.length;\n      var k = options.order + 1;\n\n      for (var i = 0; i < k; i++) {\n        for (var l = 0; l < len; l++) {\n          if (data[l][1] !== null) {\n            a += Math.pow(data[l][0], i) * data[l][1];\n          }\n        }\n\n        lhs.push(a);\n        a = 0;\n\n        var c = [];\n        for (var j = 0; j < k; j++) {\n          for (var _l = 0; _l < len; _l++) {\n            if (data[_l][1] !== null) {\n              b += Math.pow(data[_l][0], i + j);\n            }\n          }\n          c.push(b);\n          b = 0;\n        }\n        rhs.push(c);\n      }\n      rhs.push(lhs);\n\n      var coefficients = gaussianElimination(rhs, k).map(function (v) {\n        return round(v, options.precision);\n      });\n\n      var predict = function predict(x) {\n        return [round(x, options.precision), round(coefficients.reduce(function (sum, coeff, power) {\n          return sum + coeff * Math.pow(x, power);\n        }, 0), options.precision)];\n      };\n\n      var points = data.map(function (point) {\n        return predict(point[0]);\n      });\n\n      var string = 'y = ';\n      for (var _i = coefficients.length - 1; _i >= 0; _i--) {\n        if (_i > 1) {\n          string += coefficients[_i] + 'x^' + _i + ' + ';\n        } else if (_i === 1) {\n          string += coefficients[_i] + 'x + ';\n        } else {\n          string += coefficients[_i];\n        }\n      }\n\n      return {\n        string: string,\n        points: points,\n        predict: predict,\n        equation: [].concat(_toConsumableArray(coefficients)).reverse(),\n        r2: round(determinationCoefficient(data, points), options.precision)\n      };\n    }\n  };\n\n  function createWrapper() {\n    var reduce = function reduce(accumulator, name) {\n      return _extends({\n        _round: round\n      }, accumulator, _defineProperty({}, name, function (data, supplied) {\n        return methods[name](data, _extends({}, DEFAULT_OPTIONS, supplied));\n      }));\n    };\n\n    return Object.keys(methods).reduce(reduce, {});\n  }\n\n  module.exports = createWrapper();\n});\n","// @ts-check\n// helper functions\n\n/**\n * Provides requestAnimationFrame in a cross browser way.\n */\nwindow.requestAnimationFrame = window.requestAnimationFrame ||\n    // @ts-ignore\n    window.webkitRequestAnimationFrame ||\n    // @ts-ignore\n    window.mozRequestAnimationFrame ||\n    // @ts-ignore\n    window.oRequestAnimationFrame ||\n    // @ts-ignore\n    window.msRequestAnimationFrame ||\n    /**\n     * @callback\n     * @param {FrameRequestCallback} callback\n     */\n    (callback => window.setTimeout(callback, 1000 / 60))\n\n/**\n * Provides cancelRequestAnimationFrame in a cross browser way.\n */\nwindow.cancelAnimationFrame = window.cancelAnimationFrame ||\n    // @ts-ignore\n    window.webkitCancelRequestAnimationFrame ||\n    // @ts-ignore\n    window.mozCancelRequestAnimationFrame ||\n    // @ts-ignore\n    window.oCancelRequestAnimationFrame ||\n    // @ts-ignore\n    window.msCancelRequestAnimationFrame ||\n    window.clearTimeout\n","/*!\n    localForage -- Offline Storage, Improved\n    Version 1.7.3\n    https://localforage.github.io/localForage\n    (c) 2013-2017 Mozilla, Apache License 2.0\n*/\n(function(f){if(typeof exports===\"object\"&&typeof module!==\"undefined\"){module.exports=f()}else if(typeof define===\"function\"&&define.amd){define([],f)}else{var g;if(typeof window!==\"undefined\"){g=window}else if(typeof global!==\"undefined\"){g=global}else if(typeof self!==\"undefined\"){g=self}else{g=this}g.localforage = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require==\"function\"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error(\"Cannot find module '\"+o+\"'\");throw (f.code=\"MODULE_NOT_FOUND\", f)}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require==\"function\"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nvar Mutation = global.MutationObserver || global.WebKitMutationObserver;\n\nvar scheduleDrain;\n\n{\n  if (Mutation) {\n    var called = 0;\n    var observer = new Mutation(nextTick);\n    var element = global.document.createTextNode('');\n    observer.observe(element, {\n      characterData: true\n    });\n    scheduleDrain = function () {\n      element.data = (called = ++called % 2);\n    };\n  } else if (!global.setImmediate && typeof global.MessageChannel !== 'undefined') {\n    var channel = new global.MessageChannel();\n    channel.port1.onmessage = nextTick;\n    scheduleDrain = function () {\n      channel.port2.postMessage(0);\n    };\n  } else if ('document' in global && 'onreadystatechange' in global.document.createElement('script')) {\n    scheduleDrain = function () {\n\n      // Create a <script> element; its readystatechange event will be fired asynchronously once it is inserted\n      // into the document. Do so, thus queuing up the task. Remember to clean up once it's been called.\n      var scriptEl = global.document.createElement('script');\n      scriptEl.onreadystatechange = function () {\n        nextTick();\n\n        scriptEl.onreadystatechange = null;\n        scriptEl.parentNode.removeChild(scriptEl);\n        scriptEl = null;\n      };\n      global.document.documentElement.appendChild(scriptEl);\n    };\n  } else {\n    scheduleDrain = function () {\n      setTimeout(nextTick, 0);\n    };\n  }\n}\n\nvar draining;\nvar queue = [];\n//named nextTick for less confusing stack traces\nfunction nextTick() {\n  draining = true;\n  var i, oldQueue;\n  var len = queue.length;\n  while (len) {\n    oldQueue = queue;\n    queue = [];\n    i = -1;\n    while (++i < len) {\n      oldQueue[i]();\n    }\n    len = queue.length;\n  }\n  draining = false;\n}\n\nmodule.exports = immediate;\nfunction immediate(task) {\n  if (queue.push(task) === 1 && !draining) {\n    scheduleDrain();\n  }\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{}],2:[function(_dereq_,module,exports){\n'use strict';\nvar immediate = _dereq_(1);\n\n/* istanbul ignore next */\nfunction INTERNAL() {}\n\nvar handlers = {};\n\nvar REJECTED = ['REJECTED'];\nvar FULFILLED = ['FULFILLED'];\nvar PENDING = ['PENDING'];\n\nmodule.exports = Promise;\n\nfunction Promise(resolver) {\n  if (typeof resolver !== 'function') {\n    throw new TypeError('resolver must be a function');\n  }\n  this.state = PENDING;\n  this.queue = [];\n  this.outcome = void 0;\n  if (resolver !== INTERNAL) {\n    safelyResolveThenable(this, resolver);\n  }\n}\n\nPromise.prototype[\"catch\"] = function (onRejected) {\n  return this.then(null, onRejected);\n};\nPromise.prototype.then = function (onFulfilled, onRejected) {\n  if (typeof onFulfilled !== 'function' && this.state === FULFILLED ||\n    typeof onRejected !== 'function' && this.state === REJECTED) {\n    return this;\n  }\n  var promise = new this.constructor(INTERNAL);\n  if (this.state !== PENDING) {\n    var resolver = this.state === FULFILLED ? onFulfilled : onRejected;\n    unwrap(promise, resolver, this.outcome);\n  } else {\n    this.queue.push(new QueueItem(promise, onFulfilled, onRejected));\n  }\n\n  return promise;\n};\nfunction QueueItem(promise, onFulfilled, onRejected) {\n  this.promise = promise;\n  if (typeof onFulfilled === 'function') {\n    this.onFulfilled = onFulfilled;\n    this.callFulfilled = this.otherCallFulfilled;\n  }\n  if (typeof onRejected === 'function') {\n    this.onRejected = onRejected;\n    this.callRejected = this.otherCallRejected;\n  }\n}\nQueueItem.prototype.callFulfilled = function (value) {\n  handlers.resolve(this.promise, value);\n};\nQueueItem.prototype.otherCallFulfilled = function (value) {\n  unwrap(this.promise, this.onFulfilled, value);\n};\nQueueItem.prototype.callRejected = function (value) {\n  handlers.reject(this.promise, value);\n};\nQueueItem.prototype.otherCallRejected = function (value) {\n  unwrap(this.promise, this.onRejected, value);\n};\n\nfunction unwrap(promise, func, value) {\n  immediate(function () {\n    var returnValue;\n    try {\n      returnValue = func(value);\n    } catch (e) {\n      return handlers.reject(promise, e);\n    }\n    if (returnValue === promise) {\n      handlers.reject(promise, new TypeError('Cannot resolve promise with itself'));\n    } else {\n      handlers.resolve(promise, returnValue);\n    }\n  });\n}\n\nhandlers.resolve = function (self, value) {\n  var result = tryCatch(getThen, value);\n  if (result.status === 'error') {\n    return handlers.reject(self, result.value);\n  }\n  var thenable = result.value;\n\n  if (thenable) {\n    safelyResolveThenable(self, thenable);\n  } else {\n    self.state = FULFILLED;\n    self.outcome = value;\n    var i = -1;\n    var len = self.queue.length;\n    while (++i < len) {\n      self.queue[i].callFulfilled(value);\n    }\n  }\n  return self;\n};\nhandlers.reject = function (self, error) {\n  self.state = REJECTED;\n  self.outcome = error;\n  var i = -1;\n  var len = self.queue.length;\n  while (++i < len) {\n    self.queue[i].callRejected(error);\n  }\n  return self;\n};\n\nfunction getThen(obj) {\n  // Make sure we only access the accessor once as required by the spec\n  var then = obj && obj.then;\n  if (obj && (typeof obj === 'object' || typeof obj === 'function') && typeof then === 'function') {\n    return function appyThen() {\n      then.apply(obj, arguments);\n    };\n  }\n}\n\nfunction safelyResolveThenable(self, thenable) {\n  // Either fulfill, reject or reject with error\n  var called = false;\n  function onError(value) {\n    if (called) {\n      return;\n    }\n    called = true;\n    handlers.reject(self, value);\n  }\n\n  function onSuccess(value) {\n    if (called) {\n      return;\n    }\n    called = true;\n    handlers.resolve(self, value);\n  }\n\n  function tryToUnwrap() {\n    thenable(onSuccess, onError);\n  }\n\n  var result = tryCatch(tryToUnwrap);\n  if (result.status === 'error') {\n    onError(result.value);\n  }\n}\n\nfunction tryCatch(func, value) {\n  var out = {};\n  try {\n    out.value = func(value);\n    out.status = 'success';\n  } catch (e) {\n    out.status = 'error';\n    out.value = e;\n  }\n  return out;\n}\n\nPromise.resolve = resolve;\nfunction resolve(value) {\n  if (value instanceof this) {\n    return value;\n  }\n  return handlers.resolve(new this(INTERNAL), value);\n}\n\nPromise.reject = reject;\nfunction reject(reason) {\n  var promise = new this(INTERNAL);\n  return handlers.reject(promise, reason);\n}\n\nPromise.all = all;\nfunction all(iterable) {\n  var self = this;\n  if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n    return this.reject(new TypeError('must be an array'));\n  }\n\n  var len = iterable.length;\n  var called = false;\n  if (!len) {\n    return this.resolve([]);\n  }\n\n  var values = new Array(len);\n  var resolved = 0;\n  var i = -1;\n  var promise = new this(INTERNAL);\n\n  while (++i < len) {\n    allResolver(iterable[i], i);\n  }\n  return promise;\n  function allResolver(value, i) {\n    self.resolve(value).then(resolveFromAll, function (error) {\n      if (!called) {\n        called = true;\n        handlers.reject(promise, error);\n      }\n    });\n    function resolveFromAll(outValue) {\n      values[i] = outValue;\n      if (++resolved === len && !called) {\n        called = true;\n        handlers.resolve(promise, values);\n      }\n    }\n  }\n}\n\nPromise.race = race;\nfunction race(iterable) {\n  var self = this;\n  if (Object.prototype.toString.call(iterable) !== '[object Array]') {\n    return this.reject(new TypeError('must be an array'));\n  }\n\n  var len = iterable.length;\n  var called = false;\n  if (!len) {\n    return this.resolve([]);\n  }\n\n  var i = -1;\n  var promise = new this(INTERNAL);\n\n  while (++i < len) {\n    resolver(iterable[i]);\n  }\n  return promise;\n  function resolver(value) {\n    self.resolve(value).then(function (response) {\n      if (!called) {\n        called = true;\n        handlers.resolve(promise, response);\n      }\n    }, function (error) {\n      if (!called) {\n        called = true;\n        handlers.reject(promise, error);\n      }\n    });\n  }\n}\n\n},{\"1\":1}],3:[function(_dereq_,module,exports){\n(function (global){\n'use strict';\nif (typeof global.Promise !== 'function') {\n  global.Promise = _dereq_(2);\n}\n\n}).call(this,typeof global !== \"undefined\" ? global : typeof self !== \"undefined\" ? self : typeof window !== \"undefined\" ? window : {})\n},{\"2\":2}],4:[function(_dereq_,module,exports){\n'use strict';\n\nvar _typeof = typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; };\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction getIDB() {\n    /* global indexedDB,webkitIndexedDB,mozIndexedDB,OIndexedDB,msIndexedDB */\n    try {\n        if (typeof indexedDB !== 'undefined') {\n            return indexedDB;\n        }\n        if (typeof webkitIndexedDB !== 'undefined') {\n            return webkitIndexedDB;\n        }\n        if (typeof mozIndexedDB !== 'undefined') {\n            return mozIndexedDB;\n        }\n        if (typeof OIndexedDB !== 'undefined') {\n            return OIndexedDB;\n        }\n        if (typeof msIndexedDB !== 'undefined') {\n            return msIndexedDB;\n        }\n    } catch (e) {\n        return;\n    }\n}\n\nvar idb = getIDB();\n\nfunction isIndexedDBValid() {\n    try {\n        // Initialize IndexedDB; fall back to vendor-prefixed versions\n        // if needed.\n        if (!idb) {\n            return false;\n        }\n        // We mimic PouchDB here;\n        //\n        // We test for openDatabase because IE Mobile identifies itself\n        // as Safari. Oh the lulz...\n        var isSafari = typeof openDatabase !== 'undefined' && /(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) && !/Chrome/.test(navigator.userAgent) && !/BlackBerry/.test(navigator.platform);\n\n        var hasFetch = typeof fetch === 'function' && fetch.toString().indexOf('[native code') !== -1;\n\n        // Safari <10.1 does not meet our requirements for IDB support (#5572)\n        // since Safari 10.1 shipped with fetch, we can use that to detect it\n        return (!isSafari || hasFetch) && typeof indexedDB !== 'undefined' &&\n        // some outdated implementations of IDB that appear on Samsung\n        // and HTC Android devices <4.4 are missing IDBKeyRange\n        // See: https://github.com/mozilla/localForage/issues/128\n        // See: https://github.com/mozilla/localForage/issues/272\n        typeof IDBKeyRange !== 'undefined';\n    } catch (e) {\n        return false;\n    }\n}\n\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\n// Abstracts constructing a Blob object, so it also works in older\n// browsers that don't support the native Blob constructor. (i.e.\n// old QtWebKit versions, at least).\nfunction createBlob(parts, properties) {\n    /* global BlobBuilder,MSBlobBuilder,MozBlobBuilder,WebKitBlobBuilder */\n    parts = parts || [];\n    properties = properties || {};\n    try {\n        return new Blob(parts, properties);\n    } catch (e) {\n        if (e.name !== 'TypeError') {\n            throw e;\n        }\n        var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder : typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder : typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder : WebKitBlobBuilder;\n        var builder = new Builder();\n        for (var i = 0; i < parts.length; i += 1) {\n            builder.append(parts[i]);\n        }\n        return builder.getBlob(properties.type);\n    }\n}\n\n// This is CommonJS because lie is an external dependency, so Rollup\n// can just ignore it.\nif (typeof Promise === 'undefined') {\n    // In the \"nopromises\" build this will just throw if you don't have\n    // a global promise object, but it would throw anyway later.\n    _dereq_(3);\n}\nvar Promise$1 = Promise;\n\nfunction executeCallback(promise, callback) {\n    if (callback) {\n        promise.then(function (result) {\n            callback(null, result);\n        }, function (error) {\n            callback(error);\n        });\n    }\n}\n\nfunction executeTwoCallbacks(promise, callback, errorCallback) {\n    if (typeof callback === 'function') {\n        promise.then(callback);\n    }\n\n    if (typeof errorCallback === 'function') {\n        promise[\"catch\"](errorCallback);\n    }\n}\n\nfunction normalizeKey(key) {\n    // Cast the key to a string, as that's all we can set as a key.\n    if (typeof key !== 'string') {\n        console.warn(key + ' used as a key, but it is not a string.');\n        key = String(key);\n    }\n\n    return key;\n}\n\nfunction getCallback() {\n    if (arguments.length && typeof arguments[arguments.length - 1] === 'function') {\n        return arguments[arguments.length - 1];\n    }\n}\n\n// Some code originally from async_storage.js in\n// [Gaia](https://github.com/mozilla-b2g/gaia).\n\nvar DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';\nvar supportsBlobs = void 0;\nvar dbContexts = {};\nvar toString = Object.prototype.toString;\n\n// Transaction Modes\nvar READ_ONLY = 'readonly';\nvar READ_WRITE = 'readwrite';\n\n// Transform a binary string to an array buffer, because otherwise\n// weird stuff happens when you try to work with the binary string directly.\n// It is known.\n// From http://stackoverflow.com/questions/14967647/ (continues on next line)\n// encode-decode-image-with-base64-breaks-image (2013-04-21)\nfunction _binStringToArrayBuffer(bin) {\n    var length = bin.length;\n    var buf = new ArrayBuffer(length);\n    var arr = new Uint8Array(buf);\n    for (var i = 0; i < length; i++) {\n        arr[i] = bin.charCodeAt(i);\n    }\n    return buf;\n}\n\n//\n// Blobs are not supported in all versions of IndexedDB, notably\n// Chrome <37 and Android <5. In those versions, storing a blob will throw.\n//\n// Various other blob bugs exist in Chrome v37-42 (inclusive).\n// Detecting them is expensive and confusing to users, and Chrome 37-42\n// is at very low usage worldwide, so we do a hacky userAgent check instead.\n//\n// content-type bug: https://code.google.com/p/chromium/issues/detail?id=408120\n// 404 bug: https://code.google.com/p/chromium/issues/detail?id=447916\n// FileReader bug: https://code.google.com/p/chromium/issues/detail?id=447836\n//\n// Code borrowed from PouchDB. See:\n// https://github.com/pouchdb/pouchdb/blob/master/packages/node_modules/pouchdb-adapter-idb/src/blobSupport.js\n//\nfunction _checkBlobSupportWithoutCaching(idb) {\n    return new Promise$1(function (resolve) {\n        var txn = idb.transaction(DETECT_BLOB_SUPPORT_STORE, READ_WRITE);\n        var blob = createBlob(['']);\n        txn.objectStore(DETECT_BLOB_SUPPORT_STORE).put(blob, 'key');\n\n        txn.onabort = function (e) {\n            // If the transaction aborts now its due to not being able to\n            // write to the database, likely due to the disk being full\n            e.preventDefault();\n            e.stopPropagation();\n            resolve(false);\n        };\n\n        txn.oncomplete = function () {\n            var matchedChrome = navigator.userAgent.match(/Chrome\\/(\\d+)/);\n            var matchedEdge = navigator.userAgent.match(/Edge\\//);\n            // MS Edge pretends to be Chrome 42:\n            // https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx\n            resolve(matchedEdge || !matchedChrome || parseInt(matchedChrome[1], 10) >= 43);\n        };\n    })[\"catch\"](function () {\n        return false; // error, so assume unsupported\n    });\n}\n\nfunction _checkBlobSupport(idb) {\n    if (typeof supportsBlobs === 'boolean') {\n        return Promise$1.resolve(supportsBlobs);\n    }\n    return _checkBlobSupportWithoutCaching(idb).then(function (value) {\n        supportsBlobs = value;\n        return supportsBlobs;\n    });\n}\n\nfunction _deferReadiness(dbInfo) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Create a deferred object representing the current database operation.\n    var deferredOperation = {};\n\n    deferredOperation.promise = new Promise$1(function (resolve, reject) {\n        deferredOperation.resolve = resolve;\n        deferredOperation.reject = reject;\n    });\n\n    // Enqueue the deferred operation.\n    dbContext.deferredOperations.push(deferredOperation);\n\n    // Chain its promise to the database readiness.\n    if (!dbContext.dbReady) {\n        dbContext.dbReady = deferredOperation.promise;\n    } else {\n        dbContext.dbReady = dbContext.dbReady.then(function () {\n            return deferredOperation.promise;\n        });\n    }\n}\n\nfunction _advanceReadiness(dbInfo) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Dequeue a deferred operation.\n    var deferredOperation = dbContext.deferredOperations.pop();\n\n    // Resolve its promise (which is part of the database readiness\n    // chain of promises).\n    if (deferredOperation) {\n        deferredOperation.resolve();\n        return deferredOperation.promise;\n    }\n}\n\nfunction _rejectReadiness(dbInfo, err) {\n    var dbContext = dbContexts[dbInfo.name];\n\n    // Dequeue a deferred operation.\n    var deferredOperation = dbContext.deferredOperations.pop();\n\n    // Reject its promise (which is part of the database readiness\n    // chain of promises).\n    if (deferredOperation) {\n        deferredOperation.reject(err);\n        return deferredOperation.promise;\n    }\n}\n\nfunction _getConnection(dbInfo, upgradeNeeded) {\n    return new Promise$1(function (resolve, reject) {\n        dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();\n\n        if (dbInfo.db) {\n            if (upgradeNeeded) {\n                _deferReadiness(dbInfo);\n                dbInfo.db.close();\n            } else {\n                return resolve(dbInfo.db);\n            }\n        }\n\n        var dbArgs = [dbInfo.name];\n\n        if (upgradeNeeded) {\n            dbArgs.push(dbInfo.version);\n        }\n\n        var openreq = idb.open.apply(idb, dbArgs);\n\n        if (upgradeNeeded) {\n            openreq.onupgradeneeded = function (e) {\n                var db = openreq.result;\n                try {\n                    db.createObjectStore(dbInfo.storeName);\n                    if (e.oldVersion <= 1) {\n                        // Added when support for blob shims was added\n                        db.createObjectStore(DETECT_BLOB_SUPPORT_STORE);\n                    }\n                } catch (ex) {\n                    if (ex.name === 'ConstraintError') {\n                        console.warn('The database \"' + dbInfo.name + '\"' + ' has been upgraded from version ' + e.oldVersion + ' to version ' + e.newVersion + ', but the storage \"' + dbInfo.storeName + '\" already exists.');\n                    } else {\n                        throw ex;\n                    }\n                }\n            };\n        }\n\n        openreq.onerror = function (e) {\n            e.preventDefault();\n            reject(openreq.error);\n        };\n\n        openreq.onsuccess = function () {\n            resolve(openreq.result);\n            _advanceReadiness(dbInfo);\n        };\n    });\n}\n\nfunction _getOriginalConnection(dbInfo) {\n    return _getConnection(dbInfo, false);\n}\n\nfunction _getUpgradedConnection(dbInfo) {\n    return _getConnection(dbInfo, true);\n}\n\nfunction _isUpgradeNeeded(dbInfo, defaultVersion) {\n    if (!dbInfo.db) {\n        return true;\n    }\n\n    var isNewStore = !dbInfo.db.objectStoreNames.contains(dbInfo.storeName);\n    var isDowngrade = dbInfo.version < dbInfo.db.version;\n    var isUpgrade = dbInfo.version > dbInfo.db.version;\n\n    if (isDowngrade) {\n        // If the version is not the default one\n        // then warn for impossible downgrade.\n        if (dbInfo.version !== defaultVersion) {\n            console.warn('The database \"' + dbInfo.name + '\"' + \" can't be downgraded from version \" + dbInfo.db.version + ' to version ' + dbInfo.version + '.');\n        }\n        // Align the versions to prevent errors.\n        dbInfo.version = dbInfo.db.version;\n    }\n\n    if (isUpgrade || isNewStore) {\n        // If the store is new then increment the version (if needed).\n        // This will trigger an \"upgradeneeded\" event which is required\n        // for creating a store.\n        if (isNewStore) {\n            var incVersion = dbInfo.db.version + 1;\n            if (incVersion > dbInfo.version) {\n                dbInfo.version = incVersion;\n            }\n        }\n\n        return true;\n    }\n\n    return false;\n}\n\n// encode a blob for indexeddb engines that don't support blobs\nfunction _encodeBlob(blob) {\n    return new Promise$1(function (resolve, reject) {\n        var reader = new FileReader();\n        reader.onerror = reject;\n        reader.onloadend = function (e) {\n            var base64 = btoa(e.target.result || '');\n            resolve({\n                __local_forage_encoded_blob: true,\n                data: base64,\n                type: blob.type\n            });\n        };\n        reader.readAsBinaryString(blob);\n    });\n}\n\n// decode an encoded blob\nfunction _decodeBlob(encodedBlob) {\n    var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));\n    return createBlob([arrayBuff], { type: encodedBlob.type });\n}\n\n// is this one of our fancy encoded blobs?\nfunction _isEncodedBlob(value) {\n    return value && value.__local_forage_encoded_blob;\n}\n\n// Specialize the default `ready()` function by making it dependent\n// on the current database operations. Thus, the driver will be actually\n// ready when it's been initialized (default) *and* there are no pending\n// operations on the database (initiated by some other instances).\nfunction _fullyReady(callback) {\n    var self = this;\n\n    var promise = self._initReady().then(function () {\n        var dbContext = dbContexts[self._dbInfo.name];\n\n        if (dbContext && dbContext.dbReady) {\n            return dbContext.dbReady;\n        }\n    });\n\n    executeTwoCallbacks(promise, callback, callback);\n    return promise;\n}\n\n// Try to establish a new db connection to replace the\n// current one which is broken (i.e. experiencing\n// InvalidStateError while creating a transaction).\nfunction _tryReconnect(dbInfo) {\n    _deferReadiness(dbInfo);\n\n    var dbContext = dbContexts[dbInfo.name];\n    var forages = dbContext.forages;\n\n    for (var i = 0; i < forages.length; i++) {\n        var forage = forages[i];\n        if (forage._dbInfo.db) {\n            forage._dbInfo.db.close();\n            forage._dbInfo.db = null;\n        }\n    }\n    dbInfo.db = null;\n\n    return _getOriginalConnection(dbInfo).then(function (db) {\n        dbInfo.db = db;\n        if (_isUpgradeNeeded(dbInfo)) {\n            // Reopen the database for upgrading.\n            return _getUpgradedConnection(dbInfo);\n        }\n        return db;\n    }).then(function (db) {\n        // store the latest db reference\n        // in case the db was upgraded\n        dbInfo.db = dbContext.db = db;\n        for (var i = 0; i < forages.length; i++) {\n            forages[i]._dbInfo.db = db;\n        }\n    })[\"catch\"](function (err) {\n        _rejectReadiness(dbInfo, err);\n        throw err;\n    });\n}\n\n// FF doesn't like Promises (micro-tasks) and IDDB store operations,\n// so we have to do it with callbacks\nfunction createTransaction(dbInfo, mode, callback, retries) {\n    if (retries === undefined) {\n        retries = 1;\n    }\n\n    try {\n        var tx = dbInfo.db.transaction(dbInfo.storeName, mode);\n        callback(null, tx);\n    } catch (err) {\n        if (retries > 0 && (!dbInfo.db || err.name === 'InvalidStateError' || err.name === 'NotFoundError')) {\n            return Promise$1.resolve().then(function () {\n                if (!dbInfo.db || err.name === 'NotFoundError' && !dbInfo.db.objectStoreNames.contains(dbInfo.storeName) && dbInfo.version <= dbInfo.db.version) {\n                    // increase the db version, to create the new ObjectStore\n                    if (dbInfo.db) {\n                        dbInfo.version = dbInfo.db.version + 1;\n                    }\n                    // Reopen the database for upgrading.\n                    return _getUpgradedConnection(dbInfo);\n                }\n            }).then(function () {\n                return _tryReconnect(dbInfo).then(function () {\n                    createTransaction(dbInfo, mode, callback, retries - 1);\n                });\n            })[\"catch\"](callback);\n        }\n\n        callback(err);\n    }\n}\n\nfunction createDbContext() {\n    return {\n        // Running localForages sharing a database.\n        forages: [],\n        // Shared database.\n        db: null,\n        // Database readiness (promise).\n        dbReady: null,\n        // Deferred operations on the database.\n        deferredOperations: []\n    };\n}\n\n// Open the IndexedDB database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage(options) {\n    var self = this;\n    var dbInfo = {\n        db: null\n    };\n\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = options[i];\n        }\n    }\n\n    // Get the current context of the database;\n    var dbContext = dbContexts[dbInfo.name];\n\n    // ...or create a new context.\n    if (!dbContext) {\n        dbContext = createDbContext();\n        // Register the new context in the global container.\n        dbContexts[dbInfo.name] = dbContext;\n    }\n\n    // Register itself as a running localForage in the current context.\n    dbContext.forages.push(self);\n\n    // Replace the default `ready()` function with the specialized one.\n    if (!self._initReady) {\n        self._initReady = self.ready;\n        self.ready = _fullyReady;\n    }\n\n    // Create an array of initialization states of the related localForages.\n    var initPromises = [];\n\n    function ignoreErrors() {\n        // Don't handle errors here,\n        // just makes sure related localForages aren't pending.\n        return Promise$1.resolve();\n    }\n\n    for (var j = 0; j < dbContext.forages.length; j++) {\n        var forage = dbContext.forages[j];\n        if (forage !== self) {\n            // Don't wait for itself...\n            initPromises.push(forage._initReady()[\"catch\"](ignoreErrors));\n        }\n    }\n\n    // Take a snapshot of the related localForages.\n    var forages = dbContext.forages.slice(0);\n\n    // Initialize the connection process only when\n    // all the related localForages aren't pending.\n    return Promise$1.all(initPromises).then(function () {\n        dbInfo.db = dbContext.db;\n        // Get the connection or open a new one without upgrade.\n        return _getOriginalConnection(dbInfo);\n    }).then(function (db) {\n        dbInfo.db = db;\n        if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {\n            // Reopen the database for upgrading.\n            return _getUpgradedConnection(dbInfo);\n        }\n        return db;\n    }).then(function (db) {\n        dbInfo.db = dbContext.db = db;\n        self._dbInfo = dbInfo;\n        // Share the final connection amongst related localForages.\n        for (var k = 0; k < forages.length; k++) {\n            var forage = forages[k];\n            if (forage !== self) {\n                // Self is already up-to-date.\n                forage._dbInfo.db = dbInfo.db;\n                forage._dbInfo.version = dbInfo.version;\n            }\n        }\n    });\n}\n\nfunction getItem(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.get(key);\n\n                    req.onsuccess = function () {\n                        var value = req.result;\n                        if (value === undefined) {\n                            value = null;\n                        }\n                        if (_isEncodedBlob(value)) {\n                            value = _decodeBlob(value);\n                        }\n                        resolve(value);\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Iterate over all items stored in database.\nfunction iterate(iterator, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.openCursor();\n                    var iterationNumber = 1;\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n\n                        if (cursor) {\n                            var value = cursor.value;\n                            if (_isEncodedBlob(value)) {\n                                value = _decodeBlob(value);\n                            }\n                            var result = iterator(value, cursor.key, iterationNumber++);\n\n                            // when the iterator callback retuns any\n                            // (non-`undefined`) value, then we stop\n                            // the iteration immediately\n                            if (result !== void 0) {\n                                resolve(result);\n                            } else {\n                                cursor[\"continue\"]();\n                            }\n                        } else {\n                            resolve();\n                        }\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n\n    return promise;\n}\n\nfunction setItem(key, value, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        var dbInfo;\n        self.ready().then(function () {\n            dbInfo = self._dbInfo;\n            if (toString.call(value) === '[object Blob]') {\n                return _checkBlobSupport(dbInfo.db).then(function (blobSupport) {\n                    if (blobSupport) {\n                        return value;\n                    }\n                    return _encodeBlob(value);\n                });\n            }\n            return value;\n        }).then(function (value) {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n\n                    // The reason we don't _save_ null is because IE 10 does\n                    // not support saving the `null` type in IndexedDB. How\n                    // ironic, given the bug below!\n                    // See: https://github.com/mozilla/localForage/issues/161\n                    if (value === null) {\n                        value = undefined;\n                    }\n\n                    var req = store.put(value, key);\n\n                    transaction.oncomplete = function () {\n                        // Cast to undefined so the value passed to\n                        // callback/promise is the same as what one would get out\n                        // of `getItem()` later. This leads to some weirdness\n                        // (setItem('foo', undefined) will return `null`), but\n                        // it's not my fault localStorage is our baseline and that\n                        // it's weird.\n                        if (value === undefined) {\n                            value = null;\n                        }\n\n                        resolve(value);\n                    };\n                    transaction.onabort = transaction.onerror = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction removeItem(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    // We use a Grunt task to make this safe for IE and some\n                    // versions of Android (including those used by Cordova).\n                    // Normally IE won't like `.delete()` and will insist on\n                    // using `['delete']()`, but we have a build step that\n                    // fixes this for us now.\n                    var req = store[\"delete\"](key);\n                    transaction.oncomplete = function () {\n                        resolve();\n                    };\n\n                    transaction.onerror = function () {\n                        reject(req.error);\n                    };\n\n                    // The request will be also be aborted if we've exceeded our storage\n                    // space.\n                    transaction.onabort = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction clear(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_WRITE, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.clear();\n\n                    transaction.oncomplete = function () {\n                        resolve();\n                    };\n\n                    transaction.onabort = transaction.onerror = function () {\n                        var err = req.error ? req.error : req.transaction.error;\n                        reject(err);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction length(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.count();\n\n                    req.onsuccess = function () {\n                        resolve(req.result);\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction key(n, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        if (n < 0) {\n            resolve(null);\n\n            return;\n        }\n\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var advanced = false;\n                    var req = store.openCursor();\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n                        if (!cursor) {\n                            // this means there weren't enough keys\n                            resolve(null);\n\n                            return;\n                        }\n\n                        if (n === 0) {\n                            // We have the first key, return it if that's what they\n                            // wanted.\n                            resolve(cursor.key);\n                        } else {\n                            if (!advanced) {\n                                // Otherwise, ask the cursor to skip ahead n\n                                // records.\n                                advanced = true;\n                                cursor.advance(n);\n                            } else {\n                                // When we get here, we've got the nth key.\n                                resolve(cursor.key);\n                            }\n                        }\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            createTransaction(self._dbInfo, READ_ONLY, function (err, transaction) {\n                if (err) {\n                    return reject(err);\n                }\n\n                try {\n                    var store = transaction.objectStore(self._dbInfo.storeName);\n                    var req = store.openCursor();\n                    var keys = [];\n\n                    req.onsuccess = function () {\n                        var cursor = req.result;\n\n                        if (!cursor) {\n                            resolve(keys);\n                            return;\n                        }\n\n                        keys.push(cursor.key);\n                        cursor[\"continue\"]();\n                    };\n\n                    req.onerror = function () {\n                        reject(req.error);\n                    };\n                } catch (e) {\n                    reject(e);\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction dropInstance(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    var currentConfig = this.config();\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        var isCurrentDb = options.name === currentConfig.name && self._dbInfo.db;\n\n        var dbPromise = isCurrentDb ? Promise$1.resolve(self._dbInfo.db) : _getOriginalConnection(options).then(function (db) {\n            var dbContext = dbContexts[options.name];\n            var forages = dbContext.forages;\n            dbContext.db = db;\n            for (var i = 0; i < forages.length; i++) {\n                forages[i]._dbInfo.db = db;\n            }\n            return db;\n        });\n\n        if (!options.storeName) {\n            promise = dbPromise.then(function (db) {\n                _deferReadiness(options);\n\n                var dbContext = dbContexts[options.name];\n                var forages = dbContext.forages;\n\n                db.close();\n                for (var i = 0; i < forages.length; i++) {\n                    var forage = forages[i];\n                    forage._dbInfo.db = null;\n                }\n\n                var dropDBPromise = new Promise$1(function (resolve, reject) {\n                    var req = idb.deleteDatabase(options.name);\n\n                    req.onerror = req.onblocked = function (err) {\n                        var db = req.result;\n                        if (db) {\n                            db.close();\n                        }\n                        reject(err);\n                    };\n\n                    req.onsuccess = function () {\n                        var db = req.result;\n                        if (db) {\n                            db.close();\n                        }\n                        resolve(db);\n                    };\n                });\n\n                return dropDBPromise.then(function (db) {\n                    dbContext.db = db;\n                    for (var i = 0; i < forages.length; i++) {\n                        var _forage = forages[i];\n                        _advanceReadiness(_forage._dbInfo);\n                    }\n                })[\"catch\"](function (err) {\n                    (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n                    throw err;\n                });\n            });\n        } else {\n            promise = dbPromise.then(function (db) {\n                if (!db.objectStoreNames.contains(options.storeName)) {\n                    return;\n                }\n\n                var newVersion = db.version + 1;\n\n                _deferReadiness(options);\n\n                var dbContext = dbContexts[options.name];\n                var forages = dbContext.forages;\n\n                db.close();\n                for (var i = 0; i < forages.length; i++) {\n                    var forage = forages[i];\n                    forage._dbInfo.db = null;\n                    forage._dbInfo.version = newVersion;\n                }\n\n                var dropObjectPromise = new Promise$1(function (resolve, reject) {\n                    var req = idb.open(options.name, newVersion);\n\n                    req.onerror = function (err) {\n                        var db = req.result;\n                        db.close();\n                        reject(err);\n                    };\n\n                    req.onupgradeneeded = function () {\n                        var db = req.result;\n                        db.deleteObjectStore(options.storeName);\n                    };\n\n                    req.onsuccess = function () {\n                        var db = req.result;\n                        db.close();\n                        resolve(db);\n                    };\n                });\n\n                return dropObjectPromise.then(function (db) {\n                    dbContext.db = db;\n                    for (var j = 0; j < forages.length; j++) {\n                        var _forage2 = forages[j];\n                        _forage2._dbInfo.db = db;\n                        _advanceReadiness(_forage2._dbInfo);\n                    }\n                })[\"catch\"](function (err) {\n                    (_rejectReadiness(options, err) || Promise$1.resolve())[\"catch\"](function () {});\n                    throw err;\n                });\n            });\n        }\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar asyncStorage = {\n    _driver: 'asyncStorage',\n    _initStorage: _initStorage,\n    _support: isIndexedDBValid(),\n    iterate: iterate,\n    getItem: getItem,\n    setItem: setItem,\n    removeItem: removeItem,\n    clear: clear,\n    length: length,\n    key: key,\n    keys: keys,\n    dropInstance: dropInstance\n};\n\nfunction isWebSQLValid() {\n    return typeof openDatabase === 'function';\n}\n\n// Sadly, the best way to save binary data in WebSQL/localStorage is serializing\n// it to Base64, so this is how we store it to prevent very strange errors with less\n// verbose ways of binary <-> string data storage.\nvar BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';\n\nvar BLOB_TYPE_PREFIX = '~~local_forage_type~';\nvar BLOB_TYPE_PREFIX_REGEX = /^~~local_forage_type~([^~]+)~/;\n\nvar SERIALIZED_MARKER = '__lfsc__:';\nvar SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length;\n\n// OMG the serializations!\nvar TYPE_ARRAYBUFFER = 'arbf';\nvar TYPE_BLOB = 'blob';\nvar TYPE_INT8ARRAY = 'si08';\nvar TYPE_UINT8ARRAY = 'ui08';\nvar TYPE_UINT8CLAMPEDARRAY = 'uic8';\nvar TYPE_INT16ARRAY = 'si16';\nvar TYPE_INT32ARRAY = 'si32';\nvar TYPE_UINT16ARRAY = 'ur16';\nvar TYPE_UINT32ARRAY = 'ui32';\nvar TYPE_FLOAT32ARRAY = 'fl32';\nvar TYPE_FLOAT64ARRAY = 'fl64';\nvar TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;\n\nvar toString$1 = Object.prototype.toString;\n\nfunction stringToBuffer(serializedString) {\n    // Fill the string into a ArrayBuffer.\n    var bufferLength = serializedString.length * 0.75;\n    var len = serializedString.length;\n    var i;\n    var p = 0;\n    var encoded1, encoded2, encoded3, encoded4;\n\n    if (serializedString[serializedString.length - 1] === '=') {\n        bufferLength--;\n        if (serializedString[serializedString.length - 2] === '=') {\n            bufferLength--;\n        }\n    }\n\n    var buffer = new ArrayBuffer(bufferLength);\n    var bytes = new Uint8Array(buffer);\n\n    for (i = 0; i < len; i += 4) {\n        encoded1 = BASE_CHARS.indexOf(serializedString[i]);\n        encoded2 = BASE_CHARS.indexOf(serializedString[i + 1]);\n        encoded3 = BASE_CHARS.indexOf(serializedString[i + 2]);\n        encoded4 = BASE_CHARS.indexOf(serializedString[i + 3]);\n\n        /*jslint bitwise: true */\n        bytes[p++] = encoded1 << 2 | encoded2 >> 4;\n        bytes[p++] = (encoded2 & 15) << 4 | encoded3 >> 2;\n        bytes[p++] = (encoded3 & 3) << 6 | encoded4 & 63;\n    }\n    return buffer;\n}\n\n// Converts a buffer to a string to store, serialized, in the backend\n// storage library.\nfunction bufferToString(buffer) {\n    // base64-arraybuffer\n    var bytes = new Uint8Array(buffer);\n    var base64String = '';\n    var i;\n\n    for (i = 0; i < bytes.length; i += 3) {\n        /*jslint bitwise: true */\n        base64String += BASE_CHARS[bytes[i] >> 2];\n        base64String += BASE_CHARS[(bytes[i] & 3) << 4 | bytes[i + 1] >> 4];\n        base64String += BASE_CHARS[(bytes[i + 1] & 15) << 2 | bytes[i + 2] >> 6];\n        base64String += BASE_CHARS[bytes[i + 2] & 63];\n    }\n\n    if (bytes.length % 3 === 2) {\n        base64String = base64String.substring(0, base64String.length - 1) + '=';\n    } else if (bytes.length % 3 === 1) {\n        base64String = base64String.substring(0, base64String.length - 2) + '==';\n    }\n\n    return base64String;\n}\n\n// Serialize a value, afterwards executing a callback (which usually\n// instructs the `setItem()` callback/promise to be executed). This is how\n// we store binary data with localStorage.\nfunction serialize(value, callback) {\n    var valueType = '';\n    if (value) {\n        valueType = toString$1.call(value);\n    }\n\n    // Cannot use `value instanceof ArrayBuffer` or such here, as these\n    // checks fail when running the tests using casper.js...\n    //\n    // TODO: See why those tests fail and use a better solution.\n    if (value && (valueType === '[object ArrayBuffer]' || value.buffer && toString$1.call(value.buffer) === '[object ArrayBuffer]')) {\n        // Convert binary arrays to a string and prefix the string with\n        // a special marker.\n        var buffer;\n        var marker = SERIALIZED_MARKER;\n\n        if (value instanceof ArrayBuffer) {\n            buffer = value;\n            marker += TYPE_ARRAYBUFFER;\n        } else {\n            buffer = value.buffer;\n\n            if (valueType === '[object Int8Array]') {\n                marker += TYPE_INT8ARRAY;\n            } else if (valueType === '[object Uint8Array]') {\n                marker += TYPE_UINT8ARRAY;\n            } else if (valueType === '[object Uint8ClampedArray]') {\n                marker += TYPE_UINT8CLAMPEDARRAY;\n            } else if (valueType === '[object Int16Array]') {\n                marker += TYPE_INT16ARRAY;\n            } else if (valueType === '[object Uint16Array]') {\n                marker += TYPE_UINT16ARRAY;\n            } else if (valueType === '[object Int32Array]') {\n                marker += TYPE_INT32ARRAY;\n            } else if (valueType === '[object Uint32Array]') {\n                marker += TYPE_UINT32ARRAY;\n            } else if (valueType === '[object Float32Array]') {\n                marker += TYPE_FLOAT32ARRAY;\n            } else if (valueType === '[object Float64Array]') {\n                marker += TYPE_FLOAT64ARRAY;\n            } else {\n                callback(new Error('Failed to get type for BinaryArray'));\n            }\n        }\n\n        callback(marker + bufferToString(buffer));\n    } else if (valueType === '[object Blob]') {\n        // Conver the blob to a binaryArray and then to a string.\n        var fileReader = new FileReader();\n\n        fileReader.onload = function () {\n            // Backwards-compatible prefix for the blob type.\n            var str = BLOB_TYPE_PREFIX + value.type + '~' + bufferToString(this.result);\n\n            callback(SERIALIZED_MARKER + TYPE_BLOB + str);\n        };\n\n        fileReader.readAsArrayBuffer(value);\n    } else {\n        try {\n            callback(JSON.stringify(value));\n        } catch (e) {\n            console.error(\"Couldn't convert value into a JSON string: \", value);\n\n            callback(null, e);\n        }\n    }\n}\n\n// Deserialize data we've inserted into a value column/field. We place\n// special markers into our strings to mark them as encoded; this isn't\n// as nice as a meta field, but it's the only sane thing we can do whilst\n// keeping localStorage support intact.\n//\n// Oftentimes this will just deserialize JSON content, but if we have a\n// special marker (SERIALIZED_MARKER, defined above), we will extract\n// some kind of arraybuffer/binary data/typed array out of the string.\nfunction deserialize(value) {\n    // If we haven't marked this string as being specially serialized (i.e.\n    // something other than serialized JSON), we can just return it and be\n    // done with it.\n    if (value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {\n        return JSON.parse(value);\n    }\n\n    // The following code deals with deserializing some kind of Blob or\n    // TypedArray. First we separate out the type of data we're dealing\n    // with from the data itself.\n    var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);\n    var type = value.substring(SERIALIZED_MARKER_LENGTH, TYPE_SERIALIZED_MARKER_LENGTH);\n\n    var blobType;\n    // Backwards-compatible blob type serialization strategy.\n    // DBs created with older versions of localForage will simply not have the blob type.\n    if (type === TYPE_BLOB && BLOB_TYPE_PREFIX_REGEX.test(serializedString)) {\n        var matcher = serializedString.match(BLOB_TYPE_PREFIX_REGEX);\n        blobType = matcher[1];\n        serializedString = serializedString.substring(matcher[0].length);\n    }\n    var buffer = stringToBuffer(serializedString);\n\n    // Return the right type based on the code/type set during\n    // serialization.\n    switch (type) {\n        case TYPE_ARRAYBUFFER:\n            return buffer;\n        case TYPE_BLOB:\n            return createBlob([buffer], { type: blobType });\n        case TYPE_INT8ARRAY:\n            return new Int8Array(buffer);\n        case TYPE_UINT8ARRAY:\n            return new Uint8Array(buffer);\n        case TYPE_UINT8CLAMPEDARRAY:\n            return new Uint8ClampedArray(buffer);\n        case TYPE_INT16ARRAY:\n            return new Int16Array(buffer);\n        case TYPE_UINT16ARRAY:\n            return new Uint16Array(buffer);\n        case TYPE_INT32ARRAY:\n            return new Int32Array(buffer);\n        case TYPE_UINT32ARRAY:\n            return new Uint32Array(buffer);\n        case TYPE_FLOAT32ARRAY:\n            return new Float32Array(buffer);\n        case TYPE_FLOAT64ARRAY:\n            return new Float64Array(buffer);\n        default:\n            throw new Error('Unkown type: ' + type);\n    }\n}\n\nvar localforageSerializer = {\n    serialize: serialize,\n    deserialize: deserialize,\n    stringToBuffer: stringToBuffer,\n    bufferToString: bufferToString\n};\n\n/*\n * Includes code from:\n *\n * base64-arraybuffer\n * https://github.com/niklasvh/base64-arraybuffer\n *\n * Copyright (c) 2012 Niklas von Hertzen\n * Licensed under the MIT license.\n */\n\nfunction createDbTable(t, dbInfo, callback, errorCallback) {\n    t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' ' + '(id INTEGER PRIMARY KEY, key unique, value)', [], callback, errorCallback);\n}\n\n// Open the WebSQL database (automatically creates one if one didn't\n// previously exist), using any options set in the config.\nfunction _initStorage$1(options) {\n    var self = this;\n    var dbInfo = {\n        db: null\n    };\n\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = typeof options[i] !== 'string' ? options[i].toString() : options[i];\n        }\n    }\n\n    var dbInfoPromise = new Promise$1(function (resolve, reject) {\n        // Open the database; the openDatabase API will automatically\n        // create it for us if it doesn't exist.\n        try {\n            dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version), dbInfo.description, dbInfo.size);\n        } catch (e) {\n            return reject(e);\n        }\n\n        // Create our key/value table if it doesn't exist.\n        dbInfo.db.transaction(function (t) {\n            createDbTable(t, dbInfo, function () {\n                self._dbInfo = dbInfo;\n                resolve();\n            }, function (t, error) {\n                reject(error);\n            });\n        }, reject);\n    });\n\n    dbInfo.serializer = localforageSerializer;\n    return dbInfoPromise;\n}\n\nfunction tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {\n    t.executeSql(sqlStatement, args, callback, function (t, error) {\n        if (error.code === error.SYNTAX_ERR) {\n            t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name = ?\", [dbInfo.storeName], function (t, results) {\n                if (!results.rows.length) {\n                    // if the table is missing (was deleted)\n                    // re-create it table and retry\n                    createDbTable(t, dbInfo, function () {\n                        t.executeSql(sqlStatement, args, callback, errorCallback);\n                    }, errorCallback);\n                } else {\n                    errorCallback(t, error);\n                }\n            }, errorCallback);\n        } else {\n            errorCallback(t, error);\n        }\n    }, errorCallback);\n}\n\nfunction getItem$1(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName + ' WHERE key = ? LIMIT 1', [key], function (t, results) {\n                    var result = results.rows.length ? results.rows.item(0).value : null;\n\n                    // Check to see if this is serialized content we need to\n                    // unpack.\n                    if (result) {\n                        result = dbInfo.serializer.deserialize(result);\n                    }\n\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction iterate$1(iterator, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT * FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var rows = results.rows;\n                    var length = rows.length;\n\n                    for (var i = 0; i < length; i++) {\n                        var item = rows.item(i);\n                        var result = item.value;\n\n                        // Check to see if this is serialized content\n                        // we need to unpack.\n                        if (result) {\n                            result = dbInfo.serializer.deserialize(result);\n                        }\n\n                        result = iterator(result, item.key, i + 1);\n\n                        // void(0) prevents problems with redefinition\n                        // of `undefined`.\n                        if (result !== void 0) {\n                            resolve(result);\n                            return;\n                        }\n                    }\n\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction _setItem(key, value, callback, retriesLeft) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            // The localStorage API doesn't return undefined values in an\n            // \"expected\" way, so undefined is always cast to null in all\n            // drivers. See: https://github.com/mozilla/localForage/pull/42\n            if (value === undefined) {\n                value = null;\n            }\n\n            // Save the original value to pass to the callback.\n            var originalValue = value;\n\n            var dbInfo = self._dbInfo;\n            dbInfo.serializer.serialize(value, function (value, error) {\n                if (error) {\n                    reject(error);\n                } else {\n                    dbInfo.db.transaction(function (t) {\n                        tryExecuteSql(t, dbInfo, 'INSERT OR REPLACE INTO ' + dbInfo.storeName + ' ' + '(key, value) VALUES (?, ?)', [key, value], function () {\n                            resolve(originalValue);\n                        }, function (t, error) {\n                            reject(error);\n                        });\n                    }, function (sqlError) {\n                        // The transaction failed; check\n                        // to see if it's a quota error.\n                        if (sqlError.code === sqlError.QUOTA_ERR) {\n                            // We reject the callback outright for now, but\n                            // it's worth trying to re-run the transaction.\n                            // Even if the user accepts the prompt to use\n                            // more storage on Safari, this error will\n                            // be called.\n                            //\n                            // Try to re-run the transaction.\n                            if (retriesLeft > 0) {\n                                resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));\n                                return;\n                            }\n                            reject(sqlError);\n                        }\n                    });\n                }\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction setItem$1(key, value, callback) {\n    return _setItem.apply(this, [key, value, callback, 1]);\n}\n\nfunction removeItem$1(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function () {\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Deletes every item in the table.\n// TODO: Find out if this resets the AUTO_INCREMENT number.\nfunction clear$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'DELETE FROM ' + dbInfo.storeName, [], function () {\n                    resolve();\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Does a simple `COUNT(key)` to get the number of items stored in\n// localForage.\nfunction length$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                // Ahhh, SQL makes this one soooooo easy.\n                tryExecuteSql(t, dbInfo, 'SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var result = results.rows.item(0).c;\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Return the key located at key index X; essentially gets the key from a\n// `WHERE id = ?`. This is the most efficient way I can think to implement\n// this rarely-used (in my experience) part of the API, but it can seem\n// inconsistent, because we do `INSERT OR REPLACE INTO` on `setItem()`, so\n// the ID of each key will change every time it's updated. Perhaps a stored\n// procedure for the `setItem()` SQL would solve this problem?\n// TODO: Don't change ID on `setItem()`.\nfunction key$1(n, callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName + ' WHERE id = ? LIMIT 1', [n + 1], function (t, results) {\n                    var result = results.rows.length ? results.rows.item(0).key : null;\n                    resolve(result);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys$1(callback) {\n    var self = this;\n\n    var promise = new Promise$1(function (resolve, reject) {\n        self.ready().then(function () {\n            var dbInfo = self._dbInfo;\n            dbInfo.db.transaction(function (t) {\n                tryExecuteSql(t, dbInfo, 'SELECT key FROM ' + dbInfo.storeName, [], function (t, results) {\n                    var keys = [];\n\n                    for (var i = 0; i < results.rows.length; i++) {\n                        keys.push(results.rows.item(i).key);\n                    }\n\n                    resolve(keys);\n                }, function (t, error) {\n                    reject(error);\n                });\n            });\n        })[\"catch\"](reject);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// https://www.w3.org/TR/webdatabase/#databases\n// > There is no way to enumerate or delete the databases available for an origin from this API.\nfunction getAllStoreNames(db) {\n    return new Promise$1(function (resolve, reject) {\n        db.transaction(function (t) {\n            t.executeSql('SELECT name FROM sqlite_master ' + \"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'\", [], function (t, results) {\n                var storeNames = [];\n\n                for (var i = 0; i < results.rows.length; i++) {\n                    storeNames.push(results.rows.item(i).name);\n                }\n\n                resolve({\n                    db: db,\n                    storeNames: storeNames\n                });\n            }, function (t, error) {\n                reject(error);\n            });\n        }, function (sqlError) {\n            reject(sqlError);\n        });\n    });\n}\n\nfunction dropInstance$1(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    var currentConfig = this.config();\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        promise = new Promise$1(function (resolve) {\n            var db;\n            if (options.name === currentConfig.name) {\n                // use the db reference of the current instance\n                db = self._dbInfo.db;\n            } else {\n                db = openDatabase(options.name, '', '', 0);\n            }\n\n            if (!options.storeName) {\n                // drop all database tables\n                resolve(getAllStoreNames(db));\n            } else {\n                resolve({\n                    db: db,\n                    storeNames: [options.storeName]\n                });\n            }\n        }).then(function (operationInfo) {\n            return new Promise$1(function (resolve, reject) {\n                operationInfo.db.transaction(function (t) {\n                    function dropTable(storeName) {\n                        return new Promise$1(function (resolve, reject) {\n                            t.executeSql('DROP TABLE IF EXISTS ' + storeName, [], function () {\n                                resolve();\n                            }, function (t, error) {\n                                reject(error);\n                            });\n                        });\n                    }\n\n                    var operations = [];\n                    for (var i = 0, len = operationInfo.storeNames.length; i < len; i++) {\n                        operations.push(dropTable(operationInfo.storeNames[i]));\n                    }\n\n                    Promise$1.all(operations).then(function () {\n                        resolve();\n                    })[\"catch\"](function (e) {\n                        reject(e);\n                    });\n                }, function (sqlError) {\n                    reject(sqlError);\n                });\n            });\n        });\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar webSQLStorage = {\n    _driver: 'webSQLStorage',\n    _initStorage: _initStorage$1,\n    _support: isWebSQLValid(),\n    iterate: iterate$1,\n    getItem: getItem$1,\n    setItem: setItem$1,\n    removeItem: removeItem$1,\n    clear: clear$1,\n    length: length$1,\n    key: key$1,\n    keys: keys$1,\n    dropInstance: dropInstance$1\n};\n\nfunction isLocalStorageValid() {\n    try {\n        return typeof localStorage !== 'undefined' && 'setItem' in localStorage &&\n        // in IE8 typeof localStorage.setItem === 'object'\n        !!localStorage.setItem;\n    } catch (e) {\n        return false;\n    }\n}\n\nfunction _getKeyPrefix(options, defaultConfig) {\n    var keyPrefix = options.name + '/';\n\n    if (options.storeName !== defaultConfig.storeName) {\n        keyPrefix += options.storeName + '/';\n    }\n    return keyPrefix;\n}\n\n// Check if localStorage throws when saving an item\nfunction checkIfLocalStorageThrows() {\n    var localStorageTestKey = '_localforage_support_test';\n\n    try {\n        localStorage.setItem(localStorageTestKey, true);\n        localStorage.removeItem(localStorageTestKey);\n\n        return false;\n    } catch (e) {\n        return true;\n    }\n}\n\n// Check if localStorage is usable and allows to save an item\n// This method checks if localStorage is usable in Safari Private Browsing\n// mode, or in any other case where the available quota for localStorage\n// is 0 and there wasn't any saved items yet.\nfunction _isLocalStorageUsable() {\n    return !checkIfLocalStorageThrows() || localStorage.length > 0;\n}\n\n// Config the localStorage backend, using options set in the config.\nfunction _initStorage$2(options) {\n    var self = this;\n    var dbInfo = {};\n    if (options) {\n        for (var i in options) {\n            dbInfo[i] = options[i];\n        }\n    }\n\n    dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);\n\n    if (!_isLocalStorageUsable()) {\n        return Promise$1.reject();\n    }\n\n    self._dbInfo = dbInfo;\n    dbInfo.serializer = localforageSerializer;\n\n    return Promise$1.resolve();\n}\n\n// Remove all keys from the datastore, effectively destroying all data in\n// the app's key/value store!\nfunction clear$2(callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var keyPrefix = self._dbInfo.keyPrefix;\n\n        for (var i = localStorage.length - 1; i >= 0; i--) {\n            var key = localStorage.key(i);\n\n            if (key.indexOf(keyPrefix) === 0) {\n                localStorage.removeItem(key);\n            }\n        }\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Retrieve an item from the store. Unlike the original async_storage\n// library in Gaia, we don't modify return values at all. If a key's value\n// is `undefined`, we pass that value to the callback function.\nfunction getItem$2(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var result = localStorage.getItem(dbInfo.keyPrefix + key);\n\n        // If a result was found, parse it from the serialized\n        // string into a JS object. If result isn't truthy, the key\n        // is likely undefined and we'll pass it straight to the\n        // callback.\n        if (result) {\n            result = dbInfo.serializer.deserialize(result);\n        }\n\n        return result;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Iterate over all items in the store.\nfunction iterate$2(iterator, callback) {\n    var self = this;\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var keyPrefix = dbInfo.keyPrefix;\n        var keyPrefixLength = keyPrefix.length;\n        var length = localStorage.length;\n\n        // We use a dedicated iterator instead of the `i` variable below\n        // so other keys we fetch in localStorage aren't counted in\n        // the `iterationNumber` argument passed to the `iterate()`\n        // callback.\n        //\n        // See: github.com/mozilla/localForage/pull/435#discussion_r38061530\n        var iterationNumber = 1;\n\n        for (var i = 0; i < length; i++) {\n            var key = localStorage.key(i);\n            if (key.indexOf(keyPrefix) !== 0) {\n                continue;\n            }\n            var value = localStorage.getItem(key);\n\n            // If a result was found, parse it from the serialized\n            // string into a JS object. If result isn't truthy, the\n            // key is likely undefined and we'll pass it straight\n            // to the iterator.\n            if (value) {\n                value = dbInfo.serializer.deserialize(value);\n            }\n\n            value = iterator(value, key.substring(keyPrefixLength), iterationNumber++);\n\n            if (value !== void 0) {\n                return value;\n            }\n        }\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Same as localStorage's key() method, except takes a callback.\nfunction key$2(n, callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var result;\n        try {\n            result = localStorage.key(n);\n        } catch (error) {\n            result = null;\n        }\n\n        // Remove the prefix from the key, if a key is found.\n        if (result) {\n            result = result.substring(dbInfo.keyPrefix.length);\n        }\n\n        return result;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction keys$2(callback) {\n    var self = this;\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        var length = localStorage.length;\n        var keys = [];\n\n        for (var i = 0; i < length; i++) {\n            var itemKey = localStorage.key(i);\n            if (itemKey.indexOf(dbInfo.keyPrefix) === 0) {\n                keys.push(itemKey.substring(dbInfo.keyPrefix.length));\n            }\n        }\n\n        return keys;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Supply the number of keys in the datastore to the callback function.\nfunction length$2(callback) {\n    var self = this;\n    var promise = self.keys().then(function (keys) {\n        return keys.length;\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Remove an item from the store, nice and simple.\nfunction removeItem$2(key, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        var dbInfo = self._dbInfo;\n        localStorage.removeItem(dbInfo.keyPrefix + key);\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\n// Set a key's value and run an optional callback once the value is set.\n// Unlike Gaia's implementation, the callback function is passed the value,\n// in case you want to operate on that value only after you're sure it\n// saved, or something like that.\nfunction setItem$2(key, value, callback) {\n    var self = this;\n\n    key = normalizeKey(key);\n\n    var promise = self.ready().then(function () {\n        // Convert undefined values to null.\n        // https://github.com/mozilla/localForage/pull/42\n        if (value === undefined) {\n            value = null;\n        }\n\n        // Save the original value to pass to the callback.\n        var originalValue = value;\n\n        return new Promise$1(function (resolve, reject) {\n            var dbInfo = self._dbInfo;\n            dbInfo.serializer.serialize(value, function (value, error) {\n                if (error) {\n                    reject(error);\n                } else {\n                    try {\n                        localStorage.setItem(dbInfo.keyPrefix + key, value);\n                        resolve(originalValue);\n                    } catch (e) {\n                        // localStorage capacity exceeded.\n                        // TODO: Make this a specific error/event.\n                        if (e.name === 'QuotaExceededError' || e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {\n                            reject(e);\n                        }\n                        reject(e);\n                    }\n                }\n            });\n        });\n    });\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nfunction dropInstance$2(options, callback) {\n    callback = getCallback.apply(this, arguments);\n\n    options = typeof options !== 'function' && options || {};\n    if (!options.name) {\n        var currentConfig = this.config();\n        options.name = options.name || currentConfig.name;\n        options.storeName = options.storeName || currentConfig.storeName;\n    }\n\n    var self = this;\n    var promise;\n    if (!options.name) {\n        promise = Promise$1.reject('Invalid arguments');\n    } else {\n        promise = new Promise$1(function (resolve) {\n            if (!options.storeName) {\n                resolve(options.name + '/');\n            } else {\n                resolve(_getKeyPrefix(options, self._defaultConfig));\n            }\n        }).then(function (keyPrefix) {\n            for (var i = localStorage.length - 1; i >= 0; i--) {\n                var key = localStorage.key(i);\n\n                if (key.indexOf(keyPrefix) === 0) {\n                    localStorage.removeItem(key);\n                }\n            }\n        });\n    }\n\n    executeCallback(promise, callback);\n    return promise;\n}\n\nvar localStorageWrapper = {\n    _driver: 'localStorageWrapper',\n    _initStorage: _initStorage$2,\n    _support: isLocalStorageValid(),\n    iterate: iterate$2,\n    getItem: getItem$2,\n    setItem: setItem$2,\n    removeItem: removeItem$2,\n    clear: clear$2,\n    length: length$2,\n    key: key$2,\n    keys: keys$2,\n    dropInstance: dropInstance$2\n};\n\nvar sameValue = function sameValue(x, y) {\n    return x === y || typeof x === 'number' && typeof y === 'number' && isNaN(x) && isNaN(y);\n};\n\nvar includes = function includes(array, searchElement) {\n    var len = array.length;\n    var i = 0;\n    while (i < len) {\n        if (sameValue(array[i], searchElement)) {\n            return true;\n        }\n        i++;\n    }\n\n    return false;\n};\n\nvar isArray = Array.isArray || function (arg) {\n    return Object.prototype.toString.call(arg) === '[object Array]';\n};\n\n// Drivers are stored here when `defineDriver()` is called.\n// They are shared across all instances of localForage.\nvar DefinedDrivers = {};\n\nvar DriverSupport = {};\n\nvar DefaultDrivers = {\n    INDEXEDDB: asyncStorage,\n    WEBSQL: webSQLStorage,\n    LOCALSTORAGE: localStorageWrapper\n};\n\nvar DefaultDriverOrder = [DefaultDrivers.INDEXEDDB._driver, DefaultDrivers.WEBSQL._driver, DefaultDrivers.LOCALSTORAGE._driver];\n\nvar OptionalDriverMethods = ['dropInstance'];\n\nvar LibraryMethods = ['clear', 'getItem', 'iterate', 'key', 'keys', 'length', 'removeItem', 'setItem'].concat(OptionalDriverMethods);\n\nvar DefaultConfig = {\n    description: '',\n    driver: DefaultDriverOrder.slice(),\n    name: 'localforage',\n    // Default DB size is _JUST UNDER_ 5MB, as it's the highest size\n    // we can use without a prompt.\n    size: 4980736,\n    storeName: 'keyvaluepairs',\n    version: 1.0\n};\n\nfunction callWhenReady(localForageInstance, libraryMethod) {\n    localForageInstance[libraryMethod] = function () {\n        var _args = arguments;\n        return localForageInstance.ready().then(function () {\n            return localForageInstance[libraryMethod].apply(localForageInstance, _args);\n        });\n    };\n}\n\nfunction extend() {\n    for (var i = 1; i < arguments.length; i++) {\n        var arg = arguments[i];\n\n        if (arg) {\n            for (var _key in arg) {\n                if (arg.hasOwnProperty(_key)) {\n                    if (isArray(arg[_key])) {\n                        arguments[0][_key] = arg[_key].slice();\n                    } else {\n                        arguments[0][_key] = arg[_key];\n                    }\n                }\n            }\n        }\n    }\n\n    return arguments[0];\n}\n\nvar LocalForage = function () {\n    function LocalForage(options) {\n        _classCallCheck(this, LocalForage);\n\n        for (var driverTypeKey in DefaultDrivers) {\n            if (DefaultDrivers.hasOwnProperty(driverTypeKey)) {\n                var driver = DefaultDrivers[driverTypeKey];\n                var driverName = driver._driver;\n                this[driverTypeKey] = driverName;\n\n                if (!DefinedDrivers[driverName]) {\n                    // we don't need to wait for the promise,\n                    // since the default drivers can be defined\n                    // in a blocking manner\n                    this.defineDriver(driver);\n                }\n            }\n        }\n\n        this._defaultConfig = extend({}, DefaultConfig);\n        this._config = extend({}, this._defaultConfig, options);\n        this._driverSet = null;\n        this._initDriver = null;\n        this._ready = false;\n        this._dbInfo = null;\n\n        this._wrapLibraryMethodsWithReady();\n        this.setDriver(this._config.driver)[\"catch\"](function () {});\n    }\n\n    // Set any config values for localForage; can be called anytime before\n    // the first API call (e.g. `getItem`, `setItem`).\n    // We loop through options so we don't overwrite existing config\n    // values.\n\n\n    LocalForage.prototype.config = function config(options) {\n        // If the options argument is an object, we use it to set values.\n        // Otherwise, we return either a specified config value or all\n        // config values.\n        if ((typeof options === 'undefined' ? 'undefined' : _typeof(options)) === 'object') {\n            // If localforage is ready and fully initialized, we can't set\n            // any new configuration values. Instead, we return an error.\n            if (this._ready) {\n                return new Error(\"Can't call config() after localforage \" + 'has been used.');\n            }\n\n            for (var i in options) {\n                if (i === 'storeName') {\n                    options[i] = options[i].replace(/\\W/g, '_');\n                }\n\n                if (i === 'version' && typeof options[i] !== 'number') {\n                    return new Error('Database version must be a number.');\n                }\n\n                this._config[i] = options[i];\n            }\n\n            // after all config options are set and\n            // the driver option is used, try setting it\n            if ('driver' in options && options.driver) {\n                return this.setDriver(this._config.driver);\n            }\n\n            return true;\n        } else if (typeof options === 'string') {\n            return this._config[options];\n        } else {\n            return this._config;\n        }\n    };\n\n    // Used to define a custom driver, shared across all instances of\n    // localForage.\n\n\n    LocalForage.prototype.defineDriver = function defineDriver(driverObject, callback, errorCallback) {\n        var promise = new Promise$1(function (resolve, reject) {\n            try {\n                var driverName = driverObject._driver;\n                var complianceError = new Error('Custom driver not compliant; see ' + 'https://mozilla.github.io/localForage/#definedriver');\n\n                // A driver name should be defined and not overlap with the\n                // library-defined, default drivers.\n                if (!driverObject._driver) {\n                    reject(complianceError);\n                    return;\n                }\n\n                var driverMethods = LibraryMethods.concat('_initStorage');\n                for (var i = 0, len = driverMethods.length; i < len; i++) {\n                    var driverMethodName = driverMethods[i];\n\n                    // when the property is there,\n                    // it should be a method even when optional\n                    var isRequired = !includes(OptionalDriverMethods, driverMethodName);\n                    if ((isRequired || driverObject[driverMethodName]) && typeof driverObject[driverMethodName] !== 'function') {\n                        reject(complianceError);\n                        return;\n                    }\n                }\n\n                var configureMissingMethods = function configureMissingMethods() {\n                    var methodNotImplementedFactory = function methodNotImplementedFactory(methodName) {\n                        return function () {\n                            var error = new Error('Method ' + methodName + ' is not implemented by the current driver');\n                            var promise = Promise$1.reject(error);\n                            executeCallback(promise, arguments[arguments.length - 1]);\n                            return promise;\n                        };\n                    };\n\n                    for (var _i = 0, _len = OptionalDriverMethods.length; _i < _len; _i++) {\n                        var optionalDriverMethod = OptionalDriverMethods[_i];\n                        if (!driverObject[optionalDriverMethod]) {\n                            driverObject[optionalDriverMethod] = methodNotImplementedFactory(optionalDriverMethod);\n                        }\n                    }\n                };\n\n                configureMissingMethods();\n\n                var setDriverSupport = function setDriverSupport(support) {\n                    if (DefinedDrivers[driverName]) {\n                        console.info('Redefining LocalForage driver: ' + driverName);\n                    }\n                    DefinedDrivers[driverName] = driverObject;\n                    DriverSupport[driverName] = support;\n                    // don't use a then, so that we can define\n                    // drivers that have simple _support methods\n                    // in a blocking manner\n                    resolve();\n                };\n\n                if ('_support' in driverObject) {\n                    if (driverObject._support && typeof driverObject._support === 'function') {\n                        driverObject._support().then(setDriverSupport, reject);\n                    } else {\n                        setDriverSupport(!!driverObject._support);\n                    }\n                } else {\n                    setDriverSupport(true);\n                }\n            } catch (e) {\n                reject(e);\n            }\n        });\n\n        executeTwoCallbacks(promise, callback, errorCallback);\n        return promise;\n    };\n\n    LocalForage.prototype.driver = function driver() {\n        return this._driver || null;\n    };\n\n    LocalForage.prototype.getDriver = function getDriver(driverName, callback, errorCallback) {\n        var getDriverPromise = DefinedDrivers[driverName] ? Promise$1.resolve(DefinedDrivers[driverName]) : Promise$1.reject(new Error('Driver not found.'));\n\n        executeTwoCallbacks(getDriverPromise, callback, errorCallback);\n        return getDriverPromise;\n    };\n\n    LocalForage.prototype.getSerializer = function getSerializer(callback) {\n        var serializerPromise = Promise$1.resolve(localforageSerializer);\n        executeTwoCallbacks(serializerPromise, callback);\n        return serializerPromise;\n    };\n\n    LocalForage.prototype.ready = function ready(callback) {\n        var self = this;\n\n        var promise = self._driverSet.then(function () {\n            if (self._ready === null) {\n                self._ready = self._initDriver();\n            }\n\n            return self._ready;\n        });\n\n        executeTwoCallbacks(promise, callback, callback);\n        return promise;\n    };\n\n    LocalForage.prototype.setDriver = function setDriver(drivers, callback, errorCallback) {\n        var self = this;\n\n        if (!isArray(drivers)) {\n            drivers = [drivers];\n        }\n\n        var supportedDrivers = this._getSupportedDrivers(drivers);\n\n        function setDriverToConfig() {\n            self._config.driver = self.driver();\n        }\n\n        function extendSelfWithDriver(driver) {\n            self._extend(driver);\n            setDriverToConfig();\n\n            self._ready = self._initStorage(self._config);\n            return self._ready;\n        }\n\n        function initDriver(supportedDrivers) {\n            return function () {\n                var currentDriverIndex = 0;\n\n                function driverPromiseLoop() {\n                    while (currentDriverIndex < supportedDrivers.length) {\n                        var driverName = supportedDrivers[currentDriverIndex];\n                        currentDriverIndex++;\n\n                        self._dbInfo = null;\n                        self._ready = null;\n\n                        return self.getDriver(driverName).then(extendSelfWithDriver)[\"catch\"](driverPromiseLoop);\n                    }\n\n                    setDriverToConfig();\n                    var error = new Error('No available storage method found.');\n                    self._driverSet = Promise$1.reject(error);\n                    return self._driverSet;\n                }\n\n                return driverPromiseLoop();\n            };\n        }\n\n        // There might be a driver initialization in progress\n        // so wait for it to finish in order to avoid a possible\n        // race condition to set _dbInfo\n        var oldDriverSetDone = this._driverSet !== null ? this._driverSet[\"catch\"](function () {\n            return Promise$1.resolve();\n        }) : Promise$1.resolve();\n\n        this._driverSet = oldDriverSetDone.then(function () {\n            var driverName = supportedDrivers[0];\n            self._dbInfo = null;\n            self._ready = null;\n\n            return self.getDriver(driverName).then(function (driver) {\n                self._driver = driver._driver;\n                setDriverToConfig();\n                self._wrapLibraryMethodsWithReady();\n                self._initDriver = initDriver(supportedDrivers);\n            });\n        })[\"catch\"](function () {\n            setDriverToConfig();\n            var error = new Error('No available storage method found.');\n            self._driverSet = Promise$1.reject(error);\n            return self._driverSet;\n        });\n\n        executeTwoCallbacks(this._driverSet, callback, errorCallback);\n        return this._driverSet;\n    };\n\n    LocalForage.prototype.supports = function supports(driverName) {\n        return !!DriverSupport[driverName];\n    };\n\n    LocalForage.prototype._extend = function _extend(libraryMethodsAndProperties) {\n        extend(this, libraryMethodsAndProperties);\n    };\n\n    LocalForage.prototype._getSupportedDrivers = function _getSupportedDrivers(drivers) {\n        var supportedDrivers = [];\n        for (var i = 0, len = drivers.length; i < len; i++) {\n            var driverName = drivers[i];\n            if (this.supports(driverName)) {\n                supportedDrivers.push(driverName);\n            }\n        }\n        return supportedDrivers;\n    };\n\n    LocalForage.prototype._wrapLibraryMethodsWithReady = function _wrapLibraryMethodsWithReady() {\n        // Add a stub for each driver API method that delays the call to the\n        // corresponding driver method until localForage is ready. These stubs\n        // will be replaced by the driver methods as soon as the driver is\n        // loaded, so there is no performance impact.\n        for (var i = 0, len = LibraryMethods.length; i < len; i++) {\n            callWhenReady(this, LibraryMethods[i]);\n        }\n    };\n\n    LocalForage.prototype.createInstance = function createInstance(options) {\n        return new LocalForage(options);\n    };\n\n    return LocalForage;\n}();\n\n// The actual localForage object that we expose as a module or via a\n// global. It's extended by pulling in one of our other libraries.\n\n\nvar localforage_js = new LocalForage();\n\nmodule.exports = localforage_js;\n\n},{\"3\":3}]},{},[4])(4)\n});\n","/**\n    * @license\n    * Copyright 2021 Google LLC. All Rights Reserved.\n    * Licensed under the Apache License, Version 2.0 (the \"License\");\n    * you may not use this file except in compliance with the License.\n    * You may obtain a copy of the License at\n    *\n    * http://www.apache.org/licenses/LICENSE-2.0\n    *\n    * Unless required by applicable law or agreed to in writing, software\n    * distributed under the License is distributed on an \"AS IS\" BASIS,\n    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n    * See the License for the specific language governing permissions and\n    * limitations under the License.\n    * =============================================================================\n    */\nimport{tensor2d as t,tensor1d as e,div as n,slice as r,tidy as o,image as i,mul as s,sub as a,squeeze as u,concat2d as c,sigmoid as h,add as l,Tensor as f,browser as d,expandDims as p,cast as m,concat as v,reshape as b,env as y,getBackend as g}from\"@tensorflow/tfjs-core\";import{loadGraphModel as P}from\"@tensorflow/tfjs-converter\";var w=function(){return(w=Object.assign||function(t){for(var e,n=1,r=arguments.length;n<r;n++)for(var o in e=arguments[n])Object.prototype.hasOwnProperty.call(e,o)&&(t[o]=e[o]);return t}).apply(this,arguments)};function x(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{u(r.next(t))}catch(t){i(t)}}function a(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}u((r=r.apply(t,e||[])).next())}))}function E(t,e){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError(\"Generator is already executing.\");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!(o=s.trys,(o=o.length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=e.call(t,s)}catch(t){i=[6,t],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}function k(t,e,n,r){return new(n||(n=Promise))((function(o,i){function s(t){try{u(r.next(t))}catch(t){i(t)}}function a(t){try{u(r.throw(t))}catch(t){i(t)}}function u(t){var e;t.done?o(t.value):(e=t.value,e instanceof n?e:new n((function(t){t(e)}))).then(s,a)}u((r=r.apply(t,e||[])).next())}))}function L(t,e){var n,r,o,i,s={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},\"function\"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(i){return function(a){return function(i){if(n)throw new TypeError(\"Generator is already executing.\");for(;s;)try{if(n=1,r&&(o=2&i[0]?r.return:i[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,i[1])).done)return o;switch(r=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return s.label++,{value:i[1],done:!1};case 5:s.label++,r=i[1],i=[0];continue;case 7:i=s.ops.pop(),s.trys.pop();continue;default:if(!(o=(o=s.trys).length>0&&o[o.length-1])&&(6===i[0]||2===i[0])){s=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){s.label=i[1];break}if(6===i[0]&&s.label<o[1]){s.label=o[1],o=i;break}if(o&&s.label<o[2]){s.label=o[2],s.ops.push(i);break}o[2]&&s.ops.pop(),s.trys.pop();continue}i=e.call(t,s)}catch(t){i=[6,t],r=0}finally{n=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,a])}}}var M=function(t){return{startEndTensor:t,startPoint:r(t,[0,0],[-1,2]),endPoint:r(t,[0,2],[-1,2])}},I={strides:[8,16],anchors:[2,6]};function B(t,n){var i,u,c;if(t.topLeft instanceof f&&t.bottomRight instanceof f){var h=o((function(){return[v([r(a(n-1,t.topLeft),0,1),r(t.topLeft,1,1)]),v([a(n-1,r(t.bottomRight,0,1)),r(t.bottomRight,1,1)])]}));i=h[0],u=h[1],null!=t.landmarks&&(c=o((function(){var r=a(e([n-1,0]),t.landmarks),o=e([1,-1]);return s(r,o)})))}else{var l=t.topLeft,d=l[0],p=l[1],m=t.bottomRight,b=m[0],y=m[1];i=[n-1-d,p],u=[n-1-b,y],null!=t.landmarks&&(c=t.landmarks.map((function(t){return[n-1-t[0],t[1]]})))}var g={topLeft:i,bottomRight:u};return null!=c&&(g.landmarks=c),null!=t.probability&&(g.probability=t.probability instanceof f?t.probability.clone():t.probability),g}function C(t,e){return o((function(){var n;return n=t.hasOwnProperty(\"box\")?t.box:t,u(function(t,e){var n=s(t.startPoint,e),r=s(t.endPoint,e),o=c([n,r],1);return M(o)}(n,e).startEndTensor)}))}var O=function(){function v(n,r,o,i,s,a){this.blazeFaceModel=n,this.width=r,this.height=o,this.maxFaces=i,this.anchorsData=function(t,e,n){for(var r=[],o=0;o<n.strides.length;o++)for(var i=n.strides[o],s=Math.floor((e+i-1)/i),a=Math.floor((t+i-1)/i),u=n.anchors[o],c=0;c<s;c++)for(var h=i*(c+.5),l=0;l<a;l++)for(var f=i*(l+.5),d=0;d<u;d++)r.push([f,h]);return r}(r,o,I),this.anchors=t(this.anchorsData),this.inputSizeData=[r,o],this.inputSize=e([r,o]),this.iouThreshold=s,this.scoreThreshold=a}return v.prototype.getBoundingBoxes=function(e,d,p){return void 0===p&&(p=!0),k(this,void 0,void 0,(function(){var m,v,y,g,P,w,x,E,I,B,C,O,R,T,F=this;return L(this,(function(U){switch(U.label){case 0:return m=o((function(){var t=i.resizeBilinear(e,[F.width,F.height]),o=s(a(n(t,255),.5),2),f=F.blazeFaceModel.predict(o),d=u(f),p=function(t,e,o){var i=r(t,[0,1],[-1,2]),u=l(i,e),h=r(t,[0,3],[-1,2]),f=n(h,o),d=n(u,o),p=n(f,2),m=a(d,p),v=l(d,p),b=s(m,o),y=s(v,o);return c([b,y],1)}(d,F.anchors,F.inputSize),m=r(d,[0,0],[-1,1]);return[d,p,u(h(m))]})),v=m[0],y=m[1],g=m[2],P=console.warn,console.warn=function(){},w=i.nonMaxSuppression(y,g,this.maxFaces,this.iouThreshold,this.scoreThreshold),console.warn=P,[4,w.array()];case 1:return x=U.sent(),w.dispose(),E=x.map((function(t){return r(y,[t,0],[1,-1])})),d?[3,3]:[4,Promise.all(E.map((function(t){return k(F,void 0,void 0,(function(){var e;return L(this,(function(n){switch(n.label){case 0:return[4,t.array()];case 1:return e=n.sent(),t.dispose(),[2,e]}}))}))})))];case 2:E=U.sent(),U.label=3;case 3:for(I=e.shape[1],B=e.shape[2],C=d?n([B,I],this.inputSize):[B/this.inputSizeData[0],I/this.inputSizeData[1]],O=[],R=function(e){var n=E[e],i=o((function(){var o=M(n instanceof f?n:t(n));if(!p)return o;var i,s=x[e];return i=d?r(F.anchors,[s,0],[1,2]):F.anchorsData[s],{box:o,landmarks:b(u(r(v,[s,5],[1,-1])),[6,-1]),probability:r(g,[s],[1]),anchor:i}}));O.push(i)},T=0;T<E.length;T++)R(T);return y.dispose(),g.dispose(),v.dispose(),[2,{boxes:O,scaleFactor:C}]}}))}))},v.prototype.estimateFaces=function(t,e,n,i){return void 0===e&&(e=!1),void 0===n&&(n=!1),void 0===i&&(i=!0),k(this,void 0,void 0,(function(){var a,u,c,h,v,b,y=this;return L(this,(function(g){switch(g.label){case 0:return a=function(t){return t instanceof f?[t.shape[0],t.shape[1]]:[t.height,t.width]}(t),u=a[1],c=o((function(){return t instanceof f||(t=d.fromPixels(t)),p(m(t,\"float32\"),0)})),[4,this.getBoundingBoxes(c,e,i)];case 1:return h=g.sent(),v=h.boxes,b=h.scaleFactor,c.dispose(),e?[2,v.map((function(t){var e=C(t,b),o={topLeft:r(e,[0],[2]),bottomRight:r(e,[2],[2])};if(i){var a=t,c=a.landmarks,h=a.probability,f=a.anchor,d=s(l(c,f),b);o.landmarks=d,o.probability=h}return n&&(o=B(o,u)),o}))]:[2,Promise.all(v.map((function(t){return k(y,void 0,void 0,(function(){var e,r,o,s,a,c,h,l,f,d,p,m=this;return L(this,(function(v){switch(v.label){case 0:return e=C(t,b),i?[3,2]:[4,e.array()];case 1:return a=v.sent(),r={topLeft:a.slice(0,2),bottomRight:a.slice(2)},[3,4];case 2:return[4,Promise.all([t.landmarks,e,t.probability].map((function(t){return k(m,void 0,void 0,(function(){return L(this,(function(e){return[2,t.array()]}))}))})))];case 3:o=v.sent(),s=o[0],a=o[1],c=o[2],h=t.anchor,f=(l=b)[0],d=l[1],p=s.map((function(t){return[(t[0]+h[0])*f,(t[1]+h[1])*d]})),r={topLeft:a.slice(0,2),bottomRight:a.slice(2),landmarks:p,probability:c},function(t){t.startEndTensor.dispose(),t.startPoint.dispose(),t.endPoint.dispose()}(t.box),t.landmarks.dispose(),t.probability.dispose(),v.label=4;case 4:return e.dispose(),n&&(r=B(r,u)),[2,r]}}))}))})))]}}))}))},v}();function R(t){var e=void 0===t?{}:t,n=e.maxFaces,r=void 0===n?10:n,o=e.inputWidth,i=void 0===o?128:o,s=e.inputHeight,a=void 0===s?128:s,u=e.iouThreshold,c=void 0===u?.3:u,h=e.scoreThreshold,l=void 0===h?.75:h,f=e.modelUrl;return k(this,void 0,void 0,(function(){var t;return L(this,(function(e){switch(e.label){case 0:return null==f?[3,2]:[4,P(f)];case 1:return t=e.sent(),[3,4];case 2:return[4,P(\"https://tfhub.dev/tensorflow/tfjs-model/blazeface/1/default/1\",{fromTFHub:!0})];case 3:t=e.sent(),e.label=4;case 4:return[2,new O(t,i,a,r,c,l)]}}))}))}var T={silhouette:[10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109],lipsUpperOuter:[61,185,40,39,37,0,267,269,270,409,291],lipsLowerOuter:[146,91,181,84,17,314,405,321,375,291],lipsUpperInner:[78,191,80,81,82,13,312,311,310,415,308],lipsLowerInner:[78,95,88,178,87,14,317,402,318,324,308],rightEyeUpper0:[246,161,160,159,158,157,173],rightEyeLower0:[33,7,163,144,145,153,154,155,133],rightEyeUpper1:[247,30,29,27,28,56,190],rightEyeLower1:[130,25,110,24,23,22,26,112,243],rightEyeUpper2:[113,225,224,223,222,221,189],rightEyeLower2:[226,31,228,229,230,231,232,233,244],rightEyeLower3:[143,111,117,118,119,120,121,128,245],rightEyebrowUpper:[156,70,63,105,66,107,55,193],rightEyebrowLower:[35,124,46,53,52,65],rightEyeIris:[473,474,475,476,477],leftEyeUpper0:[466,388,387,386,385,384,398],leftEyeLower0:[263,249,390,373,374,380,381,382,362],leftEyeUpper1:[467,260,259,257,258,286,414],leftEyeLower1:[359,255,339,254,253,252,256,341,463],leftEyeUpper2:[342,445,444,443,442,441,413],leftEyeLower2:[446,261,448,449,450,451,452,453,464],leftEyeLower3:[372,340,346,347,348,349,350,357,465],leftEyebrowUpper:[383,300,293,334,296,336,285,417],leftEyebrowLower:[265,353,276,283,282,295],leftEyeIris:[468,469,470,471,472],midwayBetweenEyes:[168],noseTip:[1],noseBottom:[2],noseRightCorner:[98],noseLeftCorner:[327],rightCheek:[205],leftCheek:[425]};function F(t){return[Math.abs(t.endPoint[0]-t.startPoint[0]),Math.abs(t.endPoint[1]-t.startPoint[1])]}function U(t){return[t.startPoint[0]+(t.endPoint[0]-t.startPoint[0])/2,t.startPoint[1]+(t.endPoint[1]-t.startPoint[1])/2]}function S(t,e){void 0===e&&(e=1.5);var n=U(t),r=F(t),o=[e*r[0]/2,e*r[1]/2];return{startPoint:[n[0]-o[0],n[1]-o[1]],endPoint:[n[0]+o[0],n[1]+o[1]],landmarks:t.landmarks}}function D(t){var e=U(t),n=F(t),r=Math.max.apply(Math,n)/2;return{startPoint:[e[0]-r,e[1]-r],endPoint:[e[0]+r,e[1]+r],landmarks:t.landmarks}}var W=[[1,0,0],[0,1,0],[0,0,1]];function z(t,e){var n,r=Math.PI/2-Math.atan2(-(e[1]-t[1]),e[0]-t[0]);return(n=r)-2*Math.PI*Math.floor((n+Math.PI)/(2*Math.PI))}function H(t,e){return[[1,0,t],[0,1,e],[0,0,1]]}function j(t,e){for(var n=0,r=0;r<t.length;r++)n+=t[r]*e[r];return n}function A(t,e){for(var n=[],r=0;r<t.length;r++)n.push(t[r][e]);return n}function V(t,e){for(var n=[],r=t.length,o=0;o<r;o++){n.push([]);for(var i=0;i<r;i++)n[o].push(j(t[o],A(e,i)))}return n}function _(t,e){var n=Math.cos(t),r=Math.sin(t),o=[[n,-r,0],[r,n,0],[0,0,1]],i=V(H(e[0],e[1]),o);return V(i,H(-e[0],-e[1]))}var G=[13,T.midwayBetweenEyes[0]],K=[3,2],N=T.leftEyeLower0,q=[N[0],N[N.length-1]],J=T.rightEyeLower0,Q=[J[0],J[J.length-1]],X=[{key:\"EyeUpper0\",indices:[9,10,11,12,13,14,15]},{key:\"EyeUpper1\",indices:[25,26,27,28,29,30,31]},{key:\"EyeUpper2\",indices:[41,42,43,44,45,46,47]},{key:\"EyeLower0\",indices:[0,1,2,3,4,5,6,7,8]},{key:\"EyeLower1\",indices:[16,17,18,19,20,21,22,23,24]},{key:\"EyeLower2\",indices:[32,33,34,35,36,37,38,39,40]},{key:\"EyeLower3\",indices:[54,55,56,57,58,59,60,61,62]},{key:\"EyebrowUpper\",indices:[63,64,65,66,67,68,69,70]},{key:\"EyebrowLower\",indices:[48,49,50,51,52,53]}];function Y(t,e,n,r){for(var o=0;o<X.length;o++){var i=X[o],s=i.key,a=i.indices,u=T[\"\"+n+s];if(null==r||r.includes(s))for(var c=0;c<a.length;c++){var h=a[c];t[u[c]]=[e[h][0],e[h][1],(e[h][2]+t[u[c]][2])/2]}}}var Z=function(){function e(t,e,n,r,o,i,s){this.regionsOfInterest=[],this.runsWithoutFaceDetector=0,this.boundingBoxDetector=t,this.meshDetector=e,this.irisModel=s,this.meshWidth=n,this.meshHeight=r,this.maxContinuousChecks=o,this.maxFaces=i}return e.prototype.transformRawCoords=function(t,e,n,r){var o,i,s,a,u=this,c=F({startPoint:e.startPoint,endPoint:e.endPoint}),h=[c[0]/this.meshWidth,c[1]/this.meshHeight],l=t.map((function(t){return[h[0]*(t[0]-u.meshWidth/2),h[1]*(t[1]-u.meshHeight/2),t[2]]})),f=_(n,[0,0]),d=l.map((function(t){return function(t,e){return[j(t,e[0]),j(t,e[1])]}(t,f).concat([t[2]])})),p=(i=[[(o=r)[0][0],o[1][0]],[o[0][1],o[1][1]]],s=[o[0][2],o[1][2]],a=[-j(i[0],s),-j(i[1],s)],[i[0].concat(a[0]),i[1].concat(a[1]),[0,0,1]]),m=U({startPoint:e.startPoint,endPoint:e.endPoint}).concat([1]),v=[j(m,p[0]),j(m,p[1])];return d.map((function(t){return[t[0]+v[0],t[1]+v[1],t[2]]}))},e.prototype.getLeftToRightEyeDepthDifference=function(t){return t[q[0]][2]-t[Q[0]][2]},e.prototype.getEyeBox=function(t,e,n,r,o){void 0===o&&(o=!1);var s=D(S(this.calculateLandmarksBoundingBox([t[n],t[r]]),2.3)),a=F(s),u=i.cropAndResize(e,[[s.startPoint[1]/this.meshHeight,s.startPoint[0]/this.meshWidth,s.endPoint[1]/this.meshHeight,s.endPoint[0]/this.meshWidth]],[0],[64,64]);return o&&(u=i.flipLeftRight(u)),{box:s,boxSize:a,crop:u}},e.prototype.getEyeCoords=function(t,e,n,r){void 0===r&&(r=!1);for(var o=[],i=0;i<76;i++){var s=t[3*i],a=t[3*i+1],u=t[3*i+2];o.push([(r?1-s/64:s/64)*n[0]+e.startPoint[0],a/64*n[1]+e.startPoint[1],u])}return{rawCoords:o,iris:o.slice(71)}},e.prototype.getAdjustedIrisCoords=function(t,e,n){var r=t[T[n+\"EyeUpper0\"][3]][2],o=t[T[n+\"EyeLower0\"][4]][2],i=(r+o)/2;return e.map((function(t,e){var n=i;return 2===e?n=r:4===e&&(n=o),[t[0],t[1],n]}))},e.prototype.predict=function(e,r){return x(this,void 0,void 0,(function(){var s,a,c,h,l=this;return E(this,(function(f){switch(f.label){case 0:return this.shouldUpdateRegionsOfInterest()?(!1,!0,[4,this.boundingBoxDetector.getBoundingBoxes(e,!1,!0)]):[3,2];case 1:return s=f.sent(),a=s.boxes,c=s.scaleFactor,0===a.length?(this.regionsOfInterest=[],[2,null]):(h=a.map((function(t){var e,n,r={startPoint:u(t.box.startPoint).arraySync(),endPoint:u(t.box.endPoint).arraySync()},o=D(S((n=c,{startPoint:[(e=r).startPoint[0]*n[0],e.startPoint[1]*n[1]],endPoint:[e.endPoint[0]*n[0],e.endPoint[1]*n[1]]})));return w({},o,{landmarks:t.landmarks.arraySync()})})),a.forEach((function(t){null!=t&&null!=t.startPoint&&(t.startEndTensor.dispose(),t.startPoint.dispose(),t.endPoint.dispose())})),this.updateRegionsOfInterest(h),this.runsWithoutFaceDetector=0,[3,3]);case 2:this.runsWithoutFaceDetector++,f.label=3;case 3:return[2,o((function(){return l.regionsOfInterest.map((function(o,s){var a,c=o.landmarks.length>=468,h=G[0],f=G[1];!1===c&&(h=K[0],f=K[1]),a=z(o.landmarks[h],o.landmarks[f]);var d=U({startPoint:o.startPoint,endPoint:o.endPoint}),p=[d[0]/e.shape[2],d[1]/e.shape[1]],m=e,y=W;0!==a&&(m=i.rotateWithOffset(e,a,0,p),y=_(-a,d));var g={startPoint:o.startPoint,endPoint:o.endPoint},P=n(function(t,e,n){var r=e.shape[1],o=e.shape[2],s=[[t.startPoint[1]/r,t.startPoint[0]/o,t.endPoint[1]/r,t.endPoint[0]/o]];return i.cropAndResize(e,s,[0],n,\"bilinear\",0)}(g,m,[l.meshHeight,l.meshWidth]),255),x=l.meshDetector.predict(P),E=x[1],k=x[2],L=b(k,[-1,3]).arraySync();if(r){var M=l.getEyeBox(L,P,q[0],q[1],!0),I=M.box,B=M.boxSize,C=M.crop,O=l.getEyeBox(L,P,Q[0],Q[1]),R=O.box,T=O.boxSize,F=O.crop,H=l.irisModel.predict(v([C,F])).dataSync(),j=H.slice(0,228),A=l.getEyeCoords(j,I,B,!0),V=A.rawCoords,N=A.iris,J=H.slice(228),X=l.getEyeCoords(J,R,T),Z=X.rawCoords,$=X.iris,tt=l.getLeftToRightEyeDepthDifference(L);Math.abs(tt)<30?(Y(L,V,\"left\"),Y(L,Z,\"right\")):tt<1?Y(L,V,\"left\",[\"EyeUpper0\",\"EyeLower0\"]):Y(L,Z,\"right\",[\"EyeUpper0\",\"EyeLower0\"]);var et=l.getAdjustedIrisCoords(L,N,\"left\"),nt=l.getAdjustedIrisCoords(L,$,\"right\");L=L.concat(et).concat(nt)}var rt=l.transformRawCoords(L,o,a,y),ot=t(rt),it=S(l.calculateLandmarksBoundingBox(rt)),st=D(it);return l.regionsOfInterest[s]=w({},st,{landmarks:ot.arraySync()}),{coords:t(L,[L.length,3]),scaledCoords:ot,box:it,flag:u(E)}}))}))]}}))}))},e.prototype.updateRegionsOfInterest=function(t){for(var e=0;e<t.length;e++){var n=t[e],r=this.regionsOfInterest[e],o=0;if(r&&r.startPoint){var i=n.startPoint,s=i[0],a=i[1],u=n.endPoint,c=u[0],h=u[1],l=r.startPoint,f=l[0],d=l[1],p=r.endPoint,m=p[0],v=p[1],b=Math.max(s,f),y=Math.max(a,d),g=(Math.min(c,m)-b)*(Math.min(h,v)-y);o=g/((c-s)*(h-a)+(m-f)*(v-a)-g)}o<.25&&(this.regionsOfInterest[e]=n)}this.regionsOfInterest=this.regionsOfInterest.slice(0,t.length)},e.prototype.clearRegionOfInterest=function(t){null!=this.regionsOfInterest[t]&&(this.regionsOfInterest=this.regionsOfInterest.slice(0,t).concat(this.regionsOfInterest.slice(t+1)))},e.prototype.shouldUpdateRegionsOfInterest=function(){var t=this.regionsOfInterest.length,e=0===t;return 1===this.maxFaces||e?e:t!==this.maxFaces&&this.runsWithoutFaceDetector>=this.maxContinuousChecks},e.prototype.calculateLandmarksBoundingBox=function(t){var e=t.map((function(t){return t[0]})),n=t.map((function(t){return t[1]}));return{startPoint:[Math.min.apply(Math,e),Math.min.apply(Math,n)],endPoint:[Math.max.apply(Math,e),Math.max.apply(Math,n)]}},e}(),$=[[.499976992607117,.652534008026123],[.500025987625122,.547487020492554],[.499974012374878,.602371990680695],[.482113003730774,.471979022026062],[.500150978565216,.527155995368958],[.499909996986389,.498252987861633],[.499523013830185,.40106201171875],[.289712011814117,.380764007568359],[.499954998493195,.312398016452789],[.499987006187439,.269918978214264],[.500023007392883,.107050001621246],[.500023007392883,.666234016418457],[.5000159740448,.679224014282227],[.500023007392883,.692348003387451],[.499976992607117,.695277988910675],[.499976992607117,.70593398809433],[.499976992607117,.719385027885437],[.499976992607117,.737019002437592],[.499967992305756,.781370997428894],[.499816000461578,.562981009483337],[.473773002624512,.573909997940063],[.104906998574734,.254140973091125],[.365929991006851,.409575998783112],[.338757991790771,.41302502155304],[.311120003461838,.409460008144379],[.274657994508743,.389131009578705],[.393361985683441,.403706014156342],[.345234006643295,.344011008739471],[.370094001293182,.346076011657715],[.319321990013123,.347265005111694],[.297903001308441,.353591024875641],[.24779200553894,.410809993743896],[.396889001131058,.842755019664764],[.280097991228104,.375599980354309],[.106310002505779,.399955987930298],[.2099249958992,.391353011131287],[.355807989835739,.534406006336212],[.471751004457474,.65040397644043],[.474155008792877,.680191993713379],[.439785003662109,.657229006290436],[.414617002010345,.66654098033905],[.450374007225037,.680860996246338],[.428770989179611,.682690978050232],[.374971002340317,.727805018424988],[.486716985702515,.547628998756409],[.485300987958908,.527395009994507],[.257764995098114,.314490020275116],[.401223003864288,.455172002315521],[.429818987846375,.548614978790283],[.421351999044418,.533740997314453],[.276895999908447,.532056987285614],[.483370006084442,.499586999416351],[.33721199631691,.282882988452911],[.296391993761063,.293242990970612],[.169294998049736,.193813979625702],[.447580009698868,.302609980106354],[.392390012741089,.353887975215912],[.354490011930466,.696784019470215],[.067304998636246,.730105042457581],[.442739009857178,.572826027870178],[.457098007202148,.584792017936707],[.381974011659622,.694710969924927],[.392388999462128,.694203019142151],[.277076005935669,.271932005882263],[.422551989555359,.563233017921448],[.385919004678726,.281364023685455],[.383103013038635,.255840003490448],[.331431001424789,.119714021682739],[.229923993349075,.232002973556519],[.364500999450684,.189113974571228],[.229622006416321,.299540996551514],[.173287004232407,.278747975826263],[.472878992557526,.666198015213013],[.446828007698059,.668527007102966],[.422762006521225,.673889994621277],[.445307999849319,.580065965652466],[.388103008270264,.693961024284363],[.403039008378983,.706539988517761],[.403629004955292,.693953037261963],[.460041999816895,.557139039039612],[.431158006191254,.692366003990173],[.452181994915009,.692366003990173],[.475387006998062,.692366003990173],[.465828001499176,.779190003871918],[.472328990697861,.736225962638855],[.473087012767792,.717857003211975],[.473122000694275,.704625964164734],[.473033010959625,.695277988910675],[.427942007780075,.695277988910675],[.426479011774063,.703539967536926],[.423162013292313,.711845993995667],[.4183090031147,.720062971115112],[.390094995498657,.639572978019714],[.013953999616206,.560034036636353],[.499913990497589,.58014702796936],[.413199990987778,.69539999961853],[.409626007080078,.701822996139526],[.468080013990402,.601534962654114],[.422728985548019,.585985004901886],[.463079988956451,.593783974647522],[.37211999297142,.47341400384903],[.334562003612518,.496073007583618],[.411671012639999,.546965003013611],[.242175996303558,.14767599105835],[.290776997804642,.201445996761322],[.327338010072708,.256527006626129],[.399509996175766,.748921036720276],[.441727995872498,.261676013469696],[.429764986038208,.187834024429321],[.412198007106781,.108901023864746],[.288955003023148,.398952007293701],[.218936994671822,.435410976409912],[.41278201341629,.398970007896423],[.257135003805161,.355440020561218],[.427684992551804,.437960982322693],[.448339998722076,.536936044692993],[.178560003638268,.45755398273468],[.247308000922203,.457193970680237],[.286267012357712,.467674970626831],[.332827985286713,.460712015628815],[.368755996227264,.447206974029541],[.398963987827301,.432654976844788],[.476410001516342,.405806005001068],[.189241006970406,.523923993110657],[.228962004184723,.348950982093811],[.490725994110107,.562400996685028],[.404670000076294,.485132992267609],[.019469000399113,.401564002037048],[.426243007183075,.420431017875671],[.396993011236191,.548797011375427],[.266469985246658,.376977026462555],[.439121007919312,.51895797252655],[.032313998788595,.644356966018677],[.419054001569748,.387154996395111],[.462783008813858,.505746960639954],[.238978996872902,.779744982719421],[.198220998048782,.831938028335571],[.107550002634525,.540755033493042],[.183610007166862,.740257024765015],[.134409993886948,.333683013916016],[.385764002799988,.883153975009918],[.490967005491257,.579378008842468],[.382384985685349,.508572995662689],[.174399003386497,.397670984268188],[.318785011768341,.39623498916626],[.343364000320435,.400596976280212],[.396100014448166,.710216999053955],[.187885001301765,.588537991046906],[.430987000465393,.944064974784851],[.318993002176285,.898285031318665],[.266247987747192,.869701027870178],[.500023007392883,.190576016902924],[.499976992607117,.954452991485596],[.366169989109039,.398822009563446],[.393207013607025,.39553701877594],[.410373002290726,.391080021858215],[.194993004202843,.342101991176605],[.388664990663528,.362284004688263],[.365961998701096,.355970978736877],[.343364000320435,.355356991291046],[.318785011768341,.35834002494812],[.301414996385574,.363156020641327],[.058132998645306,.319076001644135],[.301414996385574,.387449026107788],[.499987989664078,.618434011936188],[.415838003158569,.624195992946625],[.445681989192963,.566076993942261],[.465844005346298,.620640993118286],[.49992299079895,.351523995399475],[.288718998432159,.819945991039276],[.335278987884521,.852819979190826],[.440512001514435,.902418971061707],[.128294005990028,.791940987110138],[.408771991729736,.373893976211548],[.455606997013092,.451801002025604],[.499877005815506,.908990025520325],[.375436991453171,.924192011356354],[.11421000212431,.615022003650665],[.448662012815475,.695277988910675],[.4480200111866,.704632043838501],[.447111994028091,.715808033943176],[.444831997156143,.730794012546539],[.430011987686157,.766808986663818],[.406787008047104,.685672998428345],[.400738000869751,.681069016456604],[.392399996519089,.677703022956848],[.367855995893478,.663918972015381],[.247923001646996,.601333022117615],[.452769994735718,.420849978923798],[.43639200925827,.359887003898621],[.416164010763168,.368713974952698],[.413385987281799,.692366003990173],[.228018000721931,.683571994304657],[.468268007040024,.352671027183533],[.411361992359161,.804327011108398],[.499989002943039,.469825029373169],[.479153990745544,.442654013633728],[.499974012374878,.439637005329132],[.432112008333206,.493588984012604],[.499886006116867,.866917014122009],[.49991300702095,.821729004383087],[.456548988819122,.819200992584229],[.344549000263214,.745438992977142],[.37890899181366,.574010014533997],[.374292999505997,.780184984207153],[.319687992334366,.570737957954407],[.357154995203018,.604269981384277],[.295284003019333,.621580958366394],[.447750002145767,.862477004528046],[.410986006259918,.508723020553589],[.31395098567009,.775308012962341],[.354128003120422,.812552988529205],[.324548006057739,.703992962837219],[.189096003770828,.646299958229065],[.279776990413666,.71465802192688],[.1338230073452,.682700991630554],[.336768001317978,.644733011722565],[.429883986711502,.466521978378296],[.455527991056442,.548622965812683],[.437114000320435,.558896005153656],[.467287987470627,.529924988746643],[.414712011814117,.335219979286194],[.37704598903656,.322777986526489],[.344107985496521,.320150971412659],[.312875986099243,.32233202457428],[.283526003360748,.333190023899078],[.241245999932289,.382785975933075],[.102986000478268,.468762993812561],[.267612010240555,.424560010433197],[.297879010438919,.433175981044769],[.333433985710144,.433878004550934],[.366427004337311,.426115989685059],[.396012008190155,.416696012020111],[.420121014118195,.41022801399231],[.007561000064015,.480777025222778],[.432949006557465,.569517970085144],[.458638995885849,.479089021682739],[.473466008901596,.545744001865387],[.476087987422943,.563830018043518],[.468472003936768,.555056989192963],[.433990985155106,.582361996173859],[.483518004417419,.562983989715576],[.482482999563217,.57784903049469],[.42645001411438,.389798998832703],[.438998997211456,.39649498462677],[.450067013502121,.400434017181396],[.289712011814117,.368252992630005],[.276670008897781,.363372981548309],[.517862021923065,.471948027610779],[.710287988185883,.380764007568359],[.526226997375488,.573909997940063],[.895093023777008,.254140973091125],[.634069979190826,.409575998783112],[.661242008209229,.41302502155304],[.688880026340485,.409460008144379],[.725341975688934,.389131009578705],[.606630027294159,.40370500087738],[.654766023159027,.344011008739471],[.629905998706818,.346076011657715],[.680678009986877,.347265005111694],[.702096998691559,.353591024875641],[.75221198797226,.410804986953735],[.602918028831482,.842862963676453],[.719901978969574,.375599980354309],[.893692970275879,.399959981441498],[.790081977844238,.391354024410248],[.643998026847839,.534487962722778],[.528249025344849,.65040397644043],[.525849997997284,.680191040039062],[.560214996337891,.657229006290436],[.585384011268616,.66654098033905],[.549625992774963,.680860996246338],[.57122802734375,.682691991329193],[.624852001667023,.72809898853302],[.513050019741058,.547281980514526],[.51509702205658,.527251958847046],[.742246985435486,.314507007598877],[.598631024360657,.454979002475739],[.570338010787964,.548575043678284],[.578631997108459,.533622980117798],[.723087012767792,.532054007053375],[.516445994377136,.499638974666595],[.662801027297974,.282917976379395],[.70362401008606,.293271005153656],[.830704987049103,.193813979625702],[.552385985851288,.302568018436432],[.607609987258911,.353887975215912],[.645429015159607,.696707010269165],[.932694971561432,.730105042457581],[.557260990142822,.572826027870178],[.542901992797852,.584792017936707],[.6180260181427,.694710969924927],[.607590973377228,.694203019142151],[.722943007946014,.271963000297546],[.577413976192474,.563166975975037],[.614082992076874,.281386971473694],[.616907000541687,.255886018276215],[.668509006500244,.119913995265961],[.770092010498047,.232020974159241],[.635536015033722,.189248979091644],[.77039098739624,.299556016921997],[.826722025871277,.278755009174347],[.527121007442474,.666198015213013],[.553171992301941,.668527007102966],[.577238023281097,.673889994621277],[.554691970348358,.580065965652466],[.611896991729736,.693961024284363],[.59696102142334,.706539988517761],[.596370995044708,.693953037261963],[.539958000183105,.557139039039612],[.568841993808746,.692366003990173],[.547818005084991,.692366003990173],[.52461302280426,.692366003990173],[.534089982509613,.779141008853912],[.527670979499817,.736225962638855],[.526912987232208,.717857003211975],[.526877999305725,.704625964164734],[.526966989040375,.695277988910675],[.572058022022247,.695277988910675],[.573521018028259,.703539967536926],[.57683801651001,.711845993995667],[.581691026687622,.720062971115112],[.609944999217987,.639909982681274],[.986046016216278,.560034036636353],[.5867999792099,.69539999961853],[.590372025966644,.701822996139526],[.531915009021759,.601536989212036],[.577268004417419,.585934996604919],[.536915004253387,.593786001205444],[.627542972564697,.473352015018463],[.665585994720459,.495950996875763],[.588353991508484,.546862006187439],[.757824003696442,.14767599105835],[.709249973297119,.201507985591888],[.672684013843536,.256581008434296],[.600408971309662,.74900496006012],[.55826598405838,.261672019958496],[.570303976535797,.187870979309082],[.588165998458862,.109044015407562],[.711045026779175,.398952007293701],[.781069993972778,.435405015945435],[.587247014045715,.398931980133057],[.742869973182678,.355445981025696],[.572156012058258,.437651991844177],[.55186802148819,.536570012569427],[.821442008018494,.457556009292603],[.752701997756958,.457181990146637],[.71375697851181,.467626988887787],[.66711300611496,.460672974586487],[.631101012229919,.447153985500336],[.6008620262146,.432473003864288],[.523481011390686,.405627012252808],[.810747981071472,.523926019668579],[.771045982837677,.348959028720856],[.509127020835876,.562718033790588],[.595292985439301,.485023975372314],[.980530977249146,.401564002037048],[.573499977588654,.420000016689301],[.602994978427887,.548687994480133],[.733529984951019,.376977026462555],[.560611009597778,.519016981124878],[.967685997486115,.644356966018677],[.580985009670258,.387160003185272],[.537728011608124,.505385041236877],[.760966002941132,.779752969741821],[.801778972148895,.831938028335571],[.892440974712372,.54076099395752],[.816350996494293,.740260004997253],[.865594983100891,.333687007427216],[.614073991775513,.883246004581451],[.508952975273132,.579437971115112],[.617941975593567,.508316040039062],[.825608015060425,.397674977779388],[.681214988231659,.39623498916626],[.656635999679565,.400596976280212],[.603900015354156,.710216999053955],[.81208598613739,.588539004325867],[.56801301240921,.944564998149872],[.681007981300354,.898285031318665],[.733752012252808,.869701027870178],[.633830010890961,.398822009563446],[.606792986392975,.39553701877594],[.589659988880157,.391062021255493],[.805015981197357,.342108011245728],[.611334979534149,.362284004688263],[.634037971496582,.355970978736877],[.656635999679565,.355356991291046],[.681214988231659,.35834002494812],[.698584973812103,.363156020641327],[.941866993904114,.319076001644135],[.698584973812103,.387449026107788],[.584177017211914,.624107003211975],[.554318010807037,.566076993942261],[.534153997898102,.62064003944397],[.711217999458313,.819975018501282],[.664629995822906,.852871000766754],[.559099972248077,.902631998062134],[.871706008911133,.791940987110138],[.591234028339386,.373893976211548],[.544341027736664,.451583981513977],[.624562978744507,.924192011356354],[.88577002286911,.615028977394104],[.551338016986847,.695277988910675],[.551980018615723,.704632043838501],[.552887976169586,.715808033943176],[.555167973041534,.730794012546539],[.569944024085999,.767035007476807],[.593203008174896,.685675978660583],[.599261999130249,.681069016456604],[.607599973678589,.677703022956848],[.631937980651855,.663500010967255],[.752032995223999,.601315021514893],[.547226011753082,.420395016670227],[.563543975353241,.359827995300293],[.583841025829315,.368713974952698],[.586614012718201,.692366003990173],[.771915018558502,.683578014373779],[.531597018241882,.352482974529266],[.588370978832245,.804440975189209],[.52079701423645,.442565023899078],[.567984998226166,.493479013442993],[.543282985687256,.819254994392395],[.655317008495331,.745514988899231],[.621008992195129,.574018001556396],[.625559985637665,.78031200170517],[.680198013782501,.570719003677368],[.64276397228241,.604337990283966],[.704662978649139,.621529996395111],[.552012026309967,.862591981887817],[.589071989059448,.508637011051178],[.685944974422455,.775357007980347],[.645735025405884,.812640011310577],[.675342977046967,.703978002071381],[.810858011245728,.646304965019226],[.72012197971344,.714666962623596],[.866151988506317,.682704985141754],[.663187026977539,.644596993923187],[.570082008838654,.466325998306274],[.544561982154846,.548375964164734],[.562758982181549,.558784961700439],[.531987011432648,.530140042304993],[.585271000862122,.335177004337311],[.622952997684479,.32277899980545],[.655896008014679,.320163011550903],[.687132000923157,.322345972061157],[.716481983661652,.333200991153717],[.758756995201111,.382786989212036],[.897013008594513,.468769013881683],[.732392013072968,.424547016620636],[.70211398601532,.433162987232208],[.66652500629425,.433866024017334],[.633504986763,.426087975502014],[.603875994682312,.416586995124817],[.579657971858978,.409945011138916],[.992439985275269,.480777025222778],[.567192018032074,.569419980049133],[.54136598110199,.478899002075195],[.526564002037048,.546118021011353],[.523913025856018,.563830018043518],[.531529009342194,.555056989192963],[.566035985946655,.582329034805298],[.51631098985672,.563053965568542],[.5174720287323,.577877044677734],[.573594987392426,.389806985855103],[.560697972774506,.395331978797913],[.549755990505219,.399751007556915],[.710287988185883,.368252992630005],[.723330020904541,.363372981548309]];function tt(t){return x(this,void 0,void 0,(function(){var e,n,r,o,i,s,a,u,c,h,l,f,d,p,m,v;return E(this,(function(b){switch(b.label){case 0:return e=t.maxContinuousChecks,n=void 0===e?5:e,r=t.detectionConfidence,o=void 0===r?.9:r,i=t.maxFaces,s=void 0===i?10:i,a=t.iouThreshold,u=void 0===a?.3:a,c=t.scoreThreshold,h=void 0===c?.75:c,l=t.shouldLoadIrisModel,f=void 0===l||l,d=t.modelUrl,p=t.detectorModelUrl,m=t.irisModelUrl,f?[4,Promise.all([et(p,s,u,h),nt(d),rt(m)])]:[3,2];case 1:return v=b.sent(),[3,4];case 2:return[4,Promise.all([et(p,s,u,h),nt(d)])];case 3:v=b.sent(),b.label=4;case 4:return[2,new st(v[0],v[1],n,o,s,f?v[2]:null)]}}))}))}function et(t,e,n,r){return x(this,void 0,void 0,(function(){return E(this,(function(o){return[2,R({modelUrl:t,maxFaces:e,iouThreshold:n,scoreThreshold:r})]}))}))}function nt(t){return x(this,void 0,void 0,(function(){return E(this,(function(e){return null!=t?[2,P(t)]:[2,P(\"https://tfhub.dev/mediapipe/tfjs-model/facemesh/1/default/1\",{fromTFHub:!0})]}))}))}function rt(t){return x(this,void 0,void 0,(function(){return E(this,(function(e){return null!=t?[2,P(t)]:[2,P(\"https://tfhub.dev/mediapipe/tfjs-model/iris/1/default/2\",{fromTFHub:!0})]}))}))}function ot(t,n){if(t.mesh instanceof f){var i=o((function(){var i=e([n-1,0,0]),u=e([1,-1,1]);return o((function(){return[v([a(n-1,r(t.boundingBox.topLeft,0,1)),r(t.boundingBox.topLeft,1,1)]),v([a(n-1,r(t.boundingBox.bottomRight,0,1)),r(t.boundingBox.bottomRight,1,1)]),s(a(i,t.mesh),u),s(a(i,t.scaledMesh),u)]}))})),u=i[0],c=i[1],h=i[2],l=i[3];return Object.assign({},t,{boundingBox:{topLeft:u,bottomRight:c},mesh:h,scaledMesh:l})}return Object.assign({},t,{boundingBox:{topLeft:[n-1-t.boundingBox.topLeft[0],t.boundingBox.topLeft[1]],bottomRight:[n-1-t.boundingBox.bottomRight[0],t.boundingBox.bottomRight[1]]},mesh:t.mesh.map((function(t){var e=t.slice(0);return e[0]=n-1-t[0],e})),scaledMesh:t.scaledMesh.map((function(t){var e=t.slice(0);return e[0]=n-1-t[0],e}))})}var it,st=function(){function t(t,e,n,r,o,i){this.kind=\"MediaPipeFaceMesh\",this.pipeline=new Z(t,e,192,192,n,o,i),this.detectionConfidence=r}return t.getAnnotations=function(){return T},t.getUVCoords=function(){return $},t.prototype.estimateFaces=function(t){return x(this,void 0,void 0,(function(){var n,r,i,s,a,u,c,h,l,v,b,P,w=this;return E(this,(function(k){switch(k.label){case 0:if(n=t.returnTensors,r=void 0!==n&&n,i=t.flipHorizontal,s=void 0!==i&&i,a=t.predictIrises,u=void 0===a||a,c=t.input,u&&null==this.pipeline.irisModel)throw new Error(\"The iris model was not loaded as part of facemesh. Please initialize the model with facemesh.load({shouldLoadIrisModel: true}).\");return h=function(t){return t instanceof f?[t.shape[0],t.shape[1]]:[t.height,t.width]}(c),l=h[1],v=o((function(){return c instanceof f||(c=d.fromPixels(c)),p(m(c,\"float32\"),0)})),\"webgl\"!==g()?[3,2]:(P=y().get(\"WEBGL_PACK_DEPTHWISECONV\"),y().set(\"WEBGL_PACK_DEPTHWISECONV\",!0),[4,this.pipeline.predict(v,u)]);case 1:return b=k.sent(),y().set(\"WEBGL_PACK_DEPTHWISECONV\",P),[3,4];case 2:return[4,this.pipeline.predict(v,u)];case 3:b=k.sent(),k.label=4;case 4:return v.dispose(),null!=b&&b.length>0?[2,Promise.all(b.map((function(t,n){return x(w,void 0,void 0,(function(){var o,i,a,c,h,f,d,p,m,v,b,y,g,P,w=this;return E(this,(function(k){switch(k.label){case 0:return o=t.coords,i=t.scaledCoords,a=t.box,c=t.flag,h=[c],r||(h=h.concat([o,i])),[4,Promise.all(h.map((function(t){return x(w,void 0,void 0,(function(){return E(this,(function(e){return[2,t.array()]}))}))})))];case 1:if(f=k.sent(),d=f[0],c.dispose(),d<this.detectionConfidence&&this.pipeline.clearRegionOfInterest(n),r)return p={kind:\"MediaPipePredictionTensors\",faceInViewConfidence:d,mesh:o,scaledMesh:i,boundingBox:{topLeft:e(a.startPoint),bottomRight:e(a.endPoint)}},s?[2,ot(p,l)]:[2,p];for(P in m=f.slice(1),v=m[0],b=m[1],i.dispose(),o.dispose(),y={kind:\"MediaPipePredictionValues\",faceInViewConfidence:d,boundingBox:{topLeft:a.startPoint,bottomRight:a.endPoint},mesh:v,scaledMesh:b},s&&(y=ot(y,l)),g={},T)(u||!1===P.includes(\"Iris\"))&&(g[P]=T[P].map((function(t){return y.scaledMesh[t]})));return y.annotations=g,[2,y]}}))}))})))]:[2,[]]}}))}))},t}();function at(t,e){return void 0===t&&(t=it.mediapipeFacemesh),void 0===e&&(e={}),x(this,void 0,void 0,(function(){return E(this,(function(n){if(t===it.mediapipeFacemesh)return[2,tt(e)];throw new Error(t+\" is not a valid package name.\")}))}))}!function(t){t.mediapipeFacemesh=\"mediapipe-facemesh\"}(it||(it={}));export{it as SupportedPackages,at as load};\n","// @ts-check\nimport * as faceLandmarksDetection from '@tensorflow-models/face-landmarks-detection'\n\n/**\n * @typedef {Object} TwoEyes\n * @property {import('./worker_scripts/util').Eye} left The left eye\n * @property {import('./worker_scripts/util').Eye} right The right eye\n */\n\nexport class TFFaceMesh {\n  /** @type {Promise<import('@tensorflow-models/face-landmarks-detection').FaceLandmarksDetector>} */\n  model\n  /** @type {boolean} */\n  predictionReady\n  /**\n   * The TFFaceMesh object name\n   * @type {string}\n   */\n  name = 'TFFaceMesh'\n  /**\n   * Global variable for face landmark positions array\n   * @type {import('@tensorflow-models/face-landmarks-detection').FaceLandmarksPrediction['scaledMesh'] | null}\n   **/\n  positionsArray = null\n  /**\n   * Constructor of TFFaceMesh object\n   * @constructor\n   * */\n  constructor () {\n    // Backend options are webgl, wasm, and CPU.\n    // For recent laptops WASM is better than WebGL.\n    this.model = faceLandmarksDetection.load(\n      faceLandmarksDetection.SupportedPackages.mediapipeFacemesh,\n      { maxFaces: 1 }\n    )\n    this.predictionReady = false\n  };\n\n  /**\n   * Isolates the two patches that correspond to the user's eyes\n   * @param  {HTMLVideoElement} video - the video element itself\n   * @param  {HTMLCanvasElement} imageCanvas - canvas corresponding to the webcam stream\n   * @param  {number} width - of imageCanvas\n   * @param  {number} height - of imageCanvas\n   * @return {Promise<TwoEyes | undefined>} the two eye-patches, first left, then right eye\n   */\n  getEyePatches = async (video, imageCanvas, width, height) => {\n    if (imageCanvas.width === 0) return\n\n    const context2D = imageCanvas.getContext('2d')\n    if (!context2D) return\n\n    // Load the MediaPipe facemesh model.\n    const model = await this.model\n\n    // Pass in a video stream (or an image, canvas, or 3D tensor) to obtain an\n    // array of detected faces from the MediaPipe graph.\n    const predictions = await model.estimateFaces({\n      input: video,\n      returnTensors: false,\n      flipHorizontal: false,\n      predictIrises: false\n    })\n\n    if (predictions.length === 0) return\n\n    // Save positions to global variable\n    this.positionsArray = predictions[0].scaledMesh\n    const prediction = predictions[0]\n    if (prediction.kind === 'MediaPipePredictionTensors' || !prediction.annotations) return\n    // Keypoints indexes are documented at\n    // https://github.com/tensorflow/tfjs-models/blob/118d4727197d4a21e2d4691e134a7bc30d90deee/face-landmarks-detection/mesh_map.jpg\n    // https://stackoverflow.com/questions/66649492/how-to-get-specific-landmark-of-face-like-lips-or-eyes-using-tensorflow-js-face\n    const [leftBBox, rightBBox] = [\n      // left\n      {\n        eyeTopArc: prediction.annotations.leftEyeUpper0,\n        eyeBottomArc: prediction.annotations.leftEyeLower0\n      },\n      // right\n      {\n        eyeTopArc: prediction.annotations.rightEyeUpper0,\n        eyeBottomArc: prediction.annotations.rightEyeLower0\n      }\n    ].map(({ eyeTopArc, eyeBottomArc }) => {\n      const topLeftOrigin = {\n        x: Math.round(Math.min(...eyeTopArc.map(v => v[0]))),\n        y: Math.round(Math.min(...eyeTopArc.map(v => v[1])))\n      }\n      const bottomRightOrigin = {\n        x: Math.round(Math.max(...eyeBottomArc.map(v => v[0]))),\n        y: Math.round(Math.max(...eyeBottomArc.map(v => v[1])))\n      }\n\n      return {\n        origin: topLeftOrigin,\n        width: bottomRightOrigin.x - topLeftOrigin.x,\n        height: bottomRightOrigin.y - topLeftOrigin.y\n      }\n    })\n    const leftOriginX = leftBBox.origin.x\n    const leftOriginY = leftBBox.origin.y\n    const leftWidth = leftBBox.width\n    const leftHeight = leftBBox.height\n    const rightOriginX = rightBBox.origin.x\n    const rightOriginY = rightBBox.origin.y\n    const rightWidth = rightBBox.width\n    const rightHeight = rightBBox.height\n\n    if (leftWidth === 0 || rightWidth === 0) {\n      console.log('an eye patch had zero width')\n      return\n    }\n\n    if (leftHeight === 0 || rightHeight === 0) {\n      console.log('an eye patch had zero height')\n      return\n    }\n\n    // Start building object to be returned\n    /** @type {{ left: import('./worker_scripts/util').Eye; right: import('./worker_scripts/util').Eye }} */\n    const eyeObjs = {}\n\n    const leftImageData = context2D.getImageData(leftOriginX, leftOriginY, leftWidth, leftHeight)\n    eyeObjs.left = {\n      patch: leftImageData,\n      imagex: leftOriginX,\n      imagey: leftOriginY,\n      width: leftWidth,\n      height: leftHeight\n    }\n\n    const rightImageData = context2D.getImageData(rightOriginX, rightOriginY, rightWidth, rightHeight)\n    eyeObjs.right = {\n      patch: rightImageData,\n      imagex: rightOriginX,\n      imagey: rightOriginY,\n      width: rightWidth,\n      height: rightHeight\n    }\n\n    this.predictionReady = true\n\n    return eyeObjs\n  }\n\n  /**\n   * Returns the positions array corresponding to the last call to getEyePatches.\n   * Requires that getEyePatches() was called previously, else returns null.\n   */\n  getPositions = () => {\n    return this.positionsArray\n  }\n\n  /**\n   * Reset the tracker to default values\n   */\n  reset = () => {\n    console.log('Unimplemented; Tracking.js has no obvious reset function')\n  }\n\n  /**\n   * Draw TF_FaceMesh_Overlay\n   * @param {CanvasRenderingContext2D} ctx\n   * @param {number[][]} keypoints\n   */\n  drawFaceOverlay = (ctx, keypoints) => {\n  // If keypoints is falsy, don't do anything\n    if (keypoints) {\n      ctx.fillStyle = '#32EEDB'\n      ctx.strokeStyle = '#32EEDB'\n      ctx.lineWidth = 0.5\n\n      for (let i = 0; i < keypoints.length; i++) {\n        const x = keypoints[i][0]\n        const y = keypoints[i][1]\n\n        ctx.beginPath()\n        ctx.arc(x, y, 1 /* radius */, 0, 2 * Math.PI)\n        ctx.closePath()\n        ctx.fill()\n      }\n    }\n  }\n}\n","// @ts-check\n\n/**\n * @typedef {Object} CamConstraints\n * @property {MediaTrackConstraints} video\n */\n\nconst params = {\n\tmoveTickSize: 50,\n\tvideoContainerId: \"webgazerVideoContainer\",\n\tvideoElementId: \"webgazerVideoFeed\",\n\tvideoElementCanvasId: \"webgazerVideoCanvas\",\n\tfaceOverlayId: \"webgazerFaceOverlay\",\n\tfaceFeedbackBoxId: \"webgazerFaceFeedbackBox\",\n\tgazeDotId: \"webgazerGazeDot\",\n\tvideoViewerWidth: 320,\n\tvideoViewerHeight: 240,\n\tfaceFeedbackBoxRatio: 0.66,\n\t// View options\n\tshowVideo: true,\n\tmirrorVideo: true,\n\tshowFaceOverlay: true,\n\tshowFaceFeedbackBox: true,\n\tshowGazeDot: true,\n\t/** @type {CamConstraints} */\n\tcamConstraints: {\n\t\tvideo: {\n\t\t\twidth: { min: 320, ideal: 640, max: 1920 },\n\t\t\theight: { min: 240, ideal: 480, max: 1080 },\n\t\t\tfacingMode: \"user\",\n\t\t},\n\t},\n\tdataTimestep: 50,\n\tshowVideoPreview: true,\n\tapplyKalmanFilter: true,\n\tsaveDataAcrossSessions: false,\n\t// Whether or not to store accuracy eigenValues, used by the calibration example file\n\tshowStoredPoints: false,\n\tstoringPoints: false,\n\n\tgazeDotColor: \"#9a031e\",\n\tgazeDotWidth: \"10px\",\n\tgazeDotHeight: \"10px\",\n\tgazeDotOpacity: \"0.7\",\n\tgazeDotZIndex: \"99999\",\n\tgazeDotBorderRadius: \"100%\",\n\tstoredDotColor: \"#83c5be\",\n\n\ttrackEye: \"both\",\n};\n\nexport default params;\n","// @ts-check\n/**\n * Matrix operations, mostly based on WEKA\n * @see https://github.com/Waikato/weka-3.8/blob/master/weka/src/main/java/weka/core/matrix/Matrix.java\n */\n\n/**\n * @callback operationCallback\n * @param {number} a - an element of matrix A\n * @param {number} b - an element of matrix B\n * @return {number} a ○ b\n */\n/**\n * Apply arithmetic operations to every element of A and B:\n * X = A ○ B, where ○ can be one of +, -, *, /, etc.\n *\n * @param {number[][]} A\n * @param {number[][]} B\n * @param {operationCallback} op - operation to apply, op(a, b) => a ○ b\n * @return {number[][]} A ○ B\n */\nconst applyArithmeticOperation = (A, B, op) => {\n  if (A.length !== B.length || A[0].length !== B[0].length) {\n    throw new Error('Matrix dimensions must agree.')\n  }\n\n  const rows = A.length\n  const cols = A[0].length\n\n  const X = /** @type {number[][]} */(new Array(rows))\n\n  for (let i = 0; i < rows; i++) {\n    X[i] = new Array(cols)\n\n    for (let j = 0; j < cols; j++) {\n      X[i][j] = op(A[i][j], B[i][j])\n    }\n  }\n\n  return X\n}\n\n/**\n * Transposes an m*n array\n * @param {(number[] | Uint8ClampedArray)[]} matrix - of 'M x N' dimensionality\n * @return {number[][]} transposed matrix\n */\nexport const transpose = (matrix) => {\n  const rows = matrix.length\n  const cols = matrix[0].length\n  const transposedMatrix = /** @type {number[][]} */(new Array(cols))\n\n  for (let j = 0; j < cols; j++) {\n    transposedMatrix[j] = new Array(rows)\n\n    for (let i = 0; i < rows; i++) {\n      transposedMatrix[j][i] = matrix[i][j]\n    }\n  }\n\n  return transposedMatrix\n}\n\n/**\n * Get a sub-matrix of matrix\n * @param {number[][]} matrix - original matrix\n * @param {number[]} r - Array of row indices\n * @param {number} j0 - Initial column index\n * @param {number} j1 - Final column index\n * @returns {number[][]} The sub-matrix matrix(r(:),j0:j1)\n */\nexport const getMatrix = (matrix, r, j0, j1) => {\n  const X = /** @type {number[][]} */(new Array(r.length))\n  const m = j1 - j0 + 1\n\n  for (let i = 0, len = r.length; i < len; i++) {\n    X[i] = new Array(m)\n\n    for (let j = j0; j <= j1; j++) {\n      X[i][j - j0] = matrix[r[i]][j]\n    }\n  }\n\n  return X\n}\n\n/**\n * Get a submatrix of matrix\n * @param {number[][]} matrix - original matrix\n * @param {number} i0 - Initial row index\n * @param {number} i1 - Final row index\n * @param {number} j0 - Initial column index\n * @param {number} j1 - Final column index\n * @return {number[][]} The sub-matrix matrix(i0:i1,j0:j1)\n */\nexport const getSubMatrix = (matrix, i0, i1, j0, j1) => {\n  const size = j1 - j0 + 1\n  const X = /** @type {number[][]} */(new Array(i1 - i0 + 1))\n\n  for (let i = i0; i <= i1; i++) {\n    const subI = i - i0\n    X[subI] = new Array(size)\n\n    for (let j = j0; j <= j1; j++) {\n      X[subI][j - j0] = matrix[i][j]\n    }\n  }\n\n  return X\n}\n\n/**\n * Linear algebraic matrix multiplication, X = A * B\n * @param {(number[] | Uint8ClampedArray)[]} matrix1\n * @param {(number[] | Uint8ClampedArray)[]} matrix2\n * @return {number[][]} Matrix product, A * B\n */\nexport const mult = (matrix1, matrix2) => {\n  if (matrix2.length !== matrix1[0].length) {\n    console.log('Matrix inner dimensions must agree:')\n  }\n\n  const X = /** @type {number[][]} */(new Array(matrix1.length))\n  const Bcolj = new Array(matrix1[0].length)\n\n  for (let j = 0; j < matrix2[0].length; j++) {\n    for (let k = 0; k < matrix1[0].length; k++) {\n      Bcolj[k] = matrix2[k][j]\n    }\n    for (let i = 0; i < matrix1.length; i++) {\n      if (j === 0) { X[i] = new Array(matrix2[0].length) }\n\n      const Arowi = matrix1[i]\n      let s = 0\n      for (let k = 0; k < matrix1[0].length; k++) {\n        s += Arowi[k] * Bcolj[k]\n      }\n      X[i][j] = s\n    }\n  }\n  return X\n}\n\n/**\n * Multiply a matrix by a scalar, X = s*A\n * @param {number[][]}  A - matrix\n * @param {number} s - scalar\n * @return {number[][]} s*A\n */\nexport const multScalar = (A, s) => {\n  const rows = A.length\n  const cols = A[0].length\n\n  const X = new Array(rows)\n\n  for (let i = 0; i < rows; i++) {\n    X[i] = new Array(cols)\n\n    for (let j = 0; j < cols; j++) {\n      X[i][j] = A[i][j] * s\n    }\n  }\n\n  return X\n}\n\n/**\n * Linear algebraic matrix addition, X = A * B\n * @param {number[][]} A\n * @param {number[][]} B\n * @return {number[][]} A + B\n */\nexport const add = (A, B) => {\n  return applyArithmeticOperation(A, B, (a, b) => a + b)\n}\n\n/**\n * Linear algebraic matrix subtraction, X = A - B\n * @param {number[][]} A\n * @param {number[][]} B\n * @return {number[][]} A - B\n */\nexport const sub = (A, B) => {\n  return applyArithmeticOperation(A, B, (a, b) => a - b)\n}\n\n/**\n * Matrix inverse or pseudoinverse, based on WEKA code\n * @param {number[][]} A - original matrix\n * @return inverse(A) if A is square, pseudoinverse otherwise.\n */\nexport const inv = A => {\n  return solve(A, identity(A.length, A[0].length))\n}\n\n/**\n * Generate identity matrix, based on WEKA code\n * @param {number} m - number of rows.\n * @param {number} [n] - number of colums, n = m if undefined.\n * @return {number[][]} An m * n matrix with ones on the diagonal and zeros elsewhere.\n */\nexport const identity = (m, n = m) => {\n  const X = /** @type {number[][]} **/(new Array(m))\n\n  for (let i = 0; i < m; i++) {\n    X[i] = new Array(n)\n\n    for (let j = 0; j < n; j++) {\n      X[i][j] = (i === j ? 1.0 : 0.0)\n    }\n  }\n\n  return X\n}\n\n/**\n * Solve A*X = B, based on WEKA code\n * @param {number[][]} A - left matrix of equation to be solved\n * @param {number[][]} B - right matrix of equation to be solved\n * @return {number[][]}  solution if A is square, least squares solution otherwiseis\n */\nexport const solve = (A, B) => {\n  // Use LU if A is square\n  return A.length === A[0].length ? LUDecomposition(A, B) : QRDecomposition(A, B)\n}\n\n/**\n * LUDecomposition to solve A*X = B, based on WEKA code\n * @param {number[][]} A - left matrix of equation to be solved\n * @param {number[][]} B - right matrix of equation to be solved\n * @return {number[][]} X so that L*U*X = B(piv,:)\n */\nconst LUDecomposition = (A, B) => {\n  const LU = /** @type {number[][]} */(new Array(A.length))\n\n  for (let i = 0; i < A.length; i++) {\n    LU[i] = new Array(A[0].length)\n    for (let j = 0; j < A[0].length; j++) {\n      LU[i][j] = A[i][j]\n    }\n  }\n\n  const m = A.length\n  const n = A[0].length\n  const piv = /** @type {number[]} **/(new Array(m))\n  for (let i = 0; i < m; i++) {\n    piv[i] = i\n  }\n  let pivsign = 1\n  let LUrowi = []\n  const LUcolj = /** @type {number[]} **/(new Array(m))\n  // Outer loop.\n  for (let j = 0; j < n; j++) {\n    // Make a copy of the j-th column to localize references.\n    for (let i = 0; i < m; i++) {\n      LUcolj[i] = LU[i][j]\n    }\n    // Apply previous transformations.\n    for (let i = 0; i < m; i++) {\n      LUrowi = LU[i]\n      // Most of the time is spent in the following dot product.\n      const kmax = Math.min(i, j)\n      let s = 0\n      for (let k = 0; k < kmax; k++) {\n        s += LUrowi[k] * LUcolj[k]\n      }\n      LUrowi[j] = LUcolj[i] -= s\n    }\n    // Find pivot and exchange if necessary.\n    let p = j\n    for (let i = j + 1; i < m; i++) {\n      if (Math.abs(LUcolj[i]) > Math.abs(LUcolj[p])) {\n        p = i\n      }\n    }\n    if (p !== j) {\n      for (let k = 0; k < n; k++) {\n        const t = LU[p][k]\n        LU[p][k] = LU[j][k]\n        LU[j][k] = t\n      }\n      const k = piv[p]\n      piv[p] = piv[j]\n      piv[j] = k\n      pivsign = -pivsign\n    }\n    // Compute multipliers.\n    if (j < m && LU[j][j] !== 0) {\n      for (let i = j + 1; i < m; i++) {\n        LU[i][j] /= LU[j][j]\n      }\n    }\n  }\n  if (B.length !== m) {\n    console.log('Matrix row dimensions must agree.')\n  }\n  for (let j = 0; j < n; j++) {\n    if (LU[j][j] === 0) {\n      console.log('Matrix is singular.')\n    }\n  }\n  const nx = B[0].length\n  const X = getMatrix(B, piv, 0, nx - 1)\n  // Solve L*Y = B(piv,:)\n  for (let k = 0; k < n; k++) {\n    for (let i = k + 1; i < n; i++) {\n      for (let j = 0; j < nx; j++) {\n        X[i][j] -= X[k][j] * LU[i][k]\n      }\n    }\n  }\n  // Solve U*X = Y;\n  for (let k = n - 1; k >= 0; k--) {\n    for (let j = 0; j < nx; j++) {\n      X[k][j] /= LU[k][k]\n    }\n    for (let i = 0; i < k; i++) {\n      for (let j = 0; j < nx; j++) {\n        X[i][j] -= X[k][j] * LU[i][k]\n      }\n    }\n  }\n  return X\n}\n\n/**\n * Least squares solution of A*X = B, based on WEKA code\n * @param {number[][]} A - left side matrix to be solved\n * @param {number[][]} B - a matrix with as many rows as A and any number of columns.\n * @return {number[][]} X - that minimizes the two norms of QR*X-B.\n */\nconst QRDecomposition = (A, B) => {\n  // Initialize.\n  const QR = /** @type {number[][]} */(new Array(A.length))\n\n  for (let i = 0; i < A.length; i++) {\n    QR[i] = new Array(A[0].length)\n    for (let j = 0; j < A[0].length; j++) {\n      QR[i][j] = A[i][j]\n    }\n  }\n  const m = A.length\n  const n = A[0].length\n  const Rdiag = /** @type {number[]} **/(new Array(n))\n  let nrm\n\n  // Main loop.\n  for (let k = 0; k < n; k++) {\n    // Compute 2-norm of k-th column without under/overflow.\n    nrm = 0\n    for (let i = k; i < m; i++) {\n      nrm = Math.hypot(nrm, QR[i][k])\n    }\n    if (nrm !== 0) {\n      // Form k-th Householder vector.\n      if (QR[k][k] < 0) {\n        nrm = -nrm\n      }\n      for (let i = k; i < m; i++) {\n        QR[i][k] /= nrm\n      }\n      QR[k][k] += 1\n\n      // Apply transformation to remaining columns.\n      for (let j = k + 1; j < n; j++) {\n        let s = 0\n        for (let i = k; i < m; i++) {\n          s += QR[i][k] * QR[i][j]\n        }\n        s = -s / QR[k][k]\n        for (let i = k; i < m; i++) {\n          QR[i][j] += s * QR[i][k]\n        }\n      }\n    }\n    Rdiag[k] = -nrm\n  }\n  if (B.length !== m) {\n    console.log('Matrix row dimensions must agree.')\n  }\n  for (let j = 0; j < n; j++) {\n    if (Rdiag[j] === 0) { console.log('Matrix is rank deficient') }\n  }\n  // Copy right hand side\n  const nx = B[0].length\n  const X = /** @type {number[][]} **/(new Array(B.length))\n  for (let i = 0; i < B.length; i++) {\n    X[i] = new Array(B[0].length)\n  }\n  for (let i = 0; i < B.length; i++) {\n    for (let j = 0; j < B[0].length; j++) {\n      X[i][j] = B[i][j]\n    }\n  }\n  // Compute Y = transpose(Q)*B\n  for (let k = 0; k < n; k++) {\n    for (let j = 0; j < nx; j++) {\n      let s = 0.0\n      for (let i = k; i < m; i++) {\n        s += QR[i][k] * X[i][j]\n      }\n      s = -s / QR[k][k]\n      for (let i = k; i < m; i++) {\n        X[i][j] += s * QR[i][k]\n      }\n    }\n  }\n  // Solve R*X = Y;\n  for (let k = n - 1; k >= 0; k--) {\n    for (let j = 0; j < nx; j++) {\n      X[k][j] /= Rdiag[k]\n    }\n    for (let i = 0; i < k; i++) {\n      for (let j = 0; j < nx; j++) {\n        X[i][j] -= X[k][j] * QR[i][k]\n      }\n    }\n  }\n  return getSubMatrix(X, 0, n - 1, 0, nx - 1)\n}\n","// @ts-check\n'use strict'\n\nimport params from '../params.mjs'\nimport { add, identity, inv, mult, sub, transpose } from './mat'\n\nconst resizeWidth = 10\nconst resizeHeight = 6\n\n/**\n * @typedef {Object} Point\n * @property {number} x x coordinate\n * @property {number} y y coordinate\n */\n\n/**\n * @typedef {[[number, number], number]} Pupil\n */\n\n/**\n * @typedef {Object} Eye represents an eye patch detected in the video stream\n * @property {ImageData} patch the image data corresponding to an eye\n * @property {number} imagex x-axis offset from the top-left corner of the video canvas\n * @property {number} imagey y-axis offset from the top-left corner of the video canvas\n * @property {number} width width of the eye patch\n * @property {number} height height of the eye patch\n * @property {boolean=} blink is the eye closed\n * @property {Pupil=} pupil coordinate of the bottom right corner and width of the best fitted pupil\n */\n\n// Data Window class\n/**\n * @template T\n * @class\n */\nexport class DataWindow {\n  // operates like an array but 'wraps' data around to keep the array at a fixed windowSize\n  /**\n   * DataWindow class - Operates like an array, but 'wraps' data around to keep the array at a fixed windowSize\n   * @param {number} windowSize - defines the maximum size of the window\n   * @param {Array<T>} data - optional data to seed the DataWindow with\n  **/\n  constructor (windowSize, data = []) {\n    this.windowSize = windowSize\n    this.index = 0\n    this.data = data.slice(data.length - windowSize, data.length)\n    this.length = this.data.length\n  }\n\n  /**\n   * [push description]\n   * @param  {T} entry - item to be inserted. It either grows the DataWindow or replaces the oldest item\n   * @return {DataWindow} this\n   */\n  push = entry => {\n    if (this.data.length < this.windowSize) {\n      this.data.push(entry)\n      this.length = this.data.length\n      return this\n    }\n\n    // replace oldest entry by wrapping around the DataWindow\n    this.data[this.index] = entry\n    this.index = (this.index + 1) % this.windowSize\n    return this\n  }\n\n  /**\n   * Get the element at the ind position by wrapping around the DataWindow\n   * @param  {number} ind index of desired entry\n   * @return {T}\n   */\n  get = ind => {\n    return this.data[this.getTrueIndex(ind)]\n  }\n\n  /**\n   * Gets the true this.data array index given an index for a desired element\n   * @param {number} ind - index of desired entry\n   * @return {number} index of desired entry in this.data\n   */\n  getTrueIndex = ind => {\n    if (this.data.length < this.windowSize) {\n      return ind\n    } else {\n      // wrap around ind so that we can traverse from oldest to newest\n      return (ind + this.index) % this.windowSize\n    }\n  }\n\n  /**\n   * Append all the contents of data\n   * @param {T[]} data - to be inserted\n   */\n  addAll = data => {\n    for (let i = 0; i < data.length; i++) {\n      this.push(data[i])\n    }\n  }\n}\n\n/**\n * Compute eyes size as gray histogram\n * @param {import('../facemesh.mjs').TwoEyes} eyes - The eyes where looking for gray histogram\n * @returns {number[]} The eyes gray level histogram\n */\nexport const getEyeFeats = eyes => {\n  /**\n   * Process an eye and return its gray level histogram\n   * @param {Eye} eye - The eye to be processed\n   * @returns {number[]} The gray level histogram of the eye\n   */\n  const process = (eye) => {\n    const resized = resizeEye(eye, resizeWidth, resizeHeight)\n    const gray = grayscale(resized.data, resized.width, resized.height)\n    const hist = /** @type {number[]} */[]\n    equalizeHistogram(gray, 5, hist)\n    return hist\n  }\n\n  if (params.trackEye === 'left') {\n    return process(eyes.left)\n  } else if (params.trackEye === 'right') {\n    return process(eyes.right)\n  } else {\n    let ret = /** @type {number[]} */[]\n    ret = ret.concat(process(eyes.left), process(eyes.right))\n    return ret\n  }\n}\n\n// Helper functions\n/**\n   * Grayscales an image patch. Can be used for the whole canvas, detected face, detected eye, etc.\n   *\n   * Code from tracking.js by Eduardo Lundgren, et al.\n   * https://github.com/eduardolundgren/tracking.js/blob/master/src/tracking.js\n   *\n   * Software License Agreement (BSD License) Copyright (c) 2014, Eduardo A. Lundgren Melo. All rights reserved.\n   * Redistribution and use of this software in source and binary forms, with or without modification, are permitted provided that the following conditions are met:\n   * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.\n   * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.\n   * The name of Eduardo A. Lundgren Melo may not be used to endorse or promote products derived from this software without specific prior written permission of Eduardo A. Lundgren Melo.\n   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS “AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n   * IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES\n   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n   *\n   * @param  {Uint8ClampedArray} pixels - image data to be grayscaled\n   * @param  {number} width  - width of image data to be grayscaled\n   * @param  {number} height - height of image data to be grayscaled\n   * @return {Uint8ClampedArray} grayscaledImage\n   */\nexport const grayscale = (pixels, width, height) => {\n  const gray = new Uint8ClampedArray(pixels.length >> 2)\n  let p = 0\n  let w = 0\n  for (let i = 0; i < height; i++) {\n    for (let j = 0; j < width; j++) {\n      const value = pixels[w] * 0.299 + pixels[w + 1] * 0.587 + pixels[w + 2] * 0.114\n      gray[p++] = value\n\n      w += 4\n    }\n  }\n  return gray\n}\n\n/**\n * Increase contrast of an image.\n *\n * Code from Martin Tschirsich, Copyright (c) 2012.\n * https://github.com/mtschirs/js-objectdetect/blob/gh-pages/js/objectdetect.js\n *\n * @param {Uint8ClampedArray} src - grayscale integer array\n * @param {number} step - sampling rate, control performance\n * @param {number[]} dst - array to hold the resulting image\n */\nconst equalizeHistogram = (src, step, dst) => {\n  const srcLength = src.length\n  if (!dst) dst = Array.from(src)\n  if (!step) step = 5\n\n  // Compute histogram and histogram sum:\n  const hist = /** @type {number[]} */(Array(256).fill(0))\n\n  for (let i = 0; i < srcLength; i += step) {\n    ++hist[src[i]]\n  }\n\n  // Compute integral histogram:\n  const norm = 255 * step / srcLength\n  let prev = 0\n  for (let i = 0; i < 256; ++i) {\n    let h = hist[i]\n    prev = h += prev\n    hist[i] = h * norm // For non-integer src: ~~(h * norm + 0.5);\n  }\n\n  // Equalize image:\n  for (let i = 0; i < srcLength; ++i) {\n    dst[i] = hist[src[i]]\n  }\n  return dst\n}\n\n/**\n * Set all values above the provided threshold to 255, set the other values to 0\n * @param {number[]} data The list of numbers to split\n * @param {number} threshold The threshold value\n * @returns {(255|0)[]} the list of 255/0 values\n */\nexport const threshold = (data, threshold) => {\n  for (let i = 0; i < data.length; i++) {\n    data[i] = (data[i] > threshold) ? 255 : 0\n  }\n  return /** @type {(255|0)[]} **/(data)\n}\n\n/**\n * Evaluate the similarities between 2 list of data\n * (should we use levenstein algorithme for more accurate results?)\n * @param {number[]} data1 The first list\n * @param {number[]} data2 The second list\n * @returns {number} The ratio of similarities (between 0 and 1)\n */\nexport const correlation = (data1, data2) => {\n  const length = Math.min(data1.length, data2.length)\n  let count = 0\n  for (let i = 0; i < length; i++) {\n    if (data1[i] === data2[i]) {\n      count++\n    }\n  }\n  return count / Math.max(data1.length, data2.length)\n}\n\n/**\n * Gets an Eye object and resizes it to the desired resolution\n * @param  {Eye} eye - patch to be resized\n * @param  {number} resizeWidth - desired width\n * @param  {number} resizeHeight - desired height\n * @return {ImageData} resized eye patch\n */\nexport const resizeEye = (eye, resizeWidth, resizeHeight) => {\n  const canvas = document.createElement('canvas')\n  canvas.width = eye.width\n  canvas.height = eye.height\n  let context2D = canvas.getContext('2d')\n  if (!context2D) return eye.patch // Theoretically impossible\n  context2D.putImageData(eye.patch, 0, 0)\n\n  const tempCanvas = document.createElement('canvas')\n\n  tempCanvas.width = resizeWidth\n  tempCanvas.height = resizeHeight\n\n  // save the canvas into temp canvas\n  context2D = canvas.getContext('2d')\n  if (!context2D) return eye.patch // Theoretically impossible\n  context2D.drawImage(canvas, 0, 0, canvas.width, canvas.height, 0, 0, resizeWidth, resizeHeight)\n\n  return context2D.getImageData(0, 0, resizeWidth, resizeHeight)\n}\n\n/**\n * Checks if the prediction is within the boundaries of the viewport and constrains it\n * @param  {Point} prediction predicted gaze coordinates\n * @return {Point} constrained coordinates\n */\nexport const bound = (prediction) => {\n  if (prediction.x < 0) prediction.x = 0\n  if (prediction.y < 0) prediction.y = 0\n  const w = Math.max(document.documentElement.clientWidth, window.innerWidth || 0)\n  const h = Math.max(document.documentElement.clientHeight, window.innerHeight || 0)\n  if (prediction.x > w) prediction.x = w\n  if (prediction.y > h) prediction.y = h\n  return prediction\n}\n\nexport class DebugBox {\n  /** @type {Record<String, HTMLButtonElement>} */\n  buttons = {}\n  /** @type {Record<String, HTMLCanvasElement>} */\n  canvas = {}\n  /** @type {Record<String, any>} */\n  stats = {}\n  /** @type {HTMLParagraphElement} */\n  para = document.createElement('p')\n  /** @type {HTMLDivElement} */\n  div = document.createElement('div')\n\n  /**\n * Constructor of DebugBox object,\n * it insert an paragraph inside a div to the body, in view to display debug data\n * @constructor\n * @param {number} interval - The log interval\n */\n  constructor (interval) {\n    this.div.appendChild(this.para)\n    document.body.appendChild(this.div)\n\n    const updateInterval = interval || 300\n\n    setInterval(() => {\n      this.para.innerText = Object.entries(this.stats).map(([key, value]) => `${key}: ${value}`).join('\\n')\n    }, updateInterval)\n  }\n\n  /**\n   * Add stat data for log\n   * @param {string} key - The data key\n   * @param {*} value - The value\n   */\n  set = (key, value) => {\n    this.stats[key] = value\n  }\n\n  /**\n   * Initialize stats in case where key does not exist, else\n   * increment value for key\n   * @param {string} key - The key to process\n   * @param {number} incBy - Value to increment for given key (default: 1)\n   * @param {number} init - Initial value in case where key does not exist (default: 0)\n   */\n  inc = (key, incBy, init) => {\n    if (!this.stats[key]) this.stats[key] = init || 0\n    this.stats[key] += incBy || 1\n  }\n\n  /**\n   * Create a button and register the given function to the button click event\n   * @param {string} name - The button name to link\n   * @param {(event: MouseEvent) => void} func - The onClick callback\n   */\n  addButton = (name, func) => {\n    if (!this.buttons[name]) {\n      this.buttons[name] = document.createElement('button')\n      this.div.appendChild(this.buttons[name])\n    }\n    const button = this.buttons[name]\n    this.buttons[name] = button\n    button.addEventListener('click', func)\n    button.innerText = name\n  }\n\n  /**\n   * Search for a canvas element with name, or create on if not exist.\n   * Then send the canvas element as callback parameter.\n   * @param {string} name - The canvas name to send/create\n   * @param {(canvas: HTMLCanvasElement) => void} func - The callback function where send canvas\n   */\n  show = (name, func) => {\n    if (!this.canvas[name]) {\n      this.canvas[name] = document.createElement('canvas')\n      this.div.appendChild(this.canvas[name])\n    }\n    const canvas = this.canvas[name]\n    const context2D = canvas.getContext('2d')\n    if (context2D) context2D.clearRect(0, 0, canvas.width, canvas.height)\n    func(canvas)\n  }\n}\n\nexport class KalmanFilter {\n  /** @type {number[][]} */\n  F\n  /** @type {number[][]} */\n  Q\n  /** @type {number[][]} */\n  H\n  /** @type {number[][]} */\n  R\n  /** @type {number[][]} */\n  P\n  /** @type {number[][]} */\n  X\n  /**\n   * Kalman Filter constructor\n   * Kalman filters work by reducing the amount of noise in a models.\n   * https://blog.cordiner.net/2011/05/03/object-tracking-using-a-kalman-filter-matlab/\n   * @constructor\n   * @param {number[][]} F - transition matrix\n   * @param {number[][]} Q - process noise matrix\n   * @param {number[][]} H - maps between measurement vector and noise matrix\n   * @param {number[][]} R - defines measurement error of the device\n   * @param {number[][]} pInitial - the initial state\n   * @param {number[][]} xInitial - the initial state of the device\n   */\n  constructor (F, H, Q, R, pInitial, xInitial) {\n    this.F = F // State transition matrix\n    this.Q = Q // Process noise matrix\n    this.H = H // Transformation matrix\n    this.R = R // Measurement Noise\n    this.P = pInitial // Initial covariance matrix\n    this.X = xInitial // Initial guess of measurement\n  }\n\n  /**\n   * Get Kalman next filtered value and update the internal state\n   * @param {number[]} z - the new measurement\n   * @return {number[]}\n   */\n  update = (z) => {\n    // TODO cache variables like the transpose of H\n\n    // prediction: X = F * X  |  P = F * P * F' + Q\n    const xP = mult(this.F, this.X) // Update state vector\n    const pP = add(mult(mult(this.F, this.P), transpose(this.F)), this.Q) // Predicted covaraince\n    const yColumnVector = []\n\n    // Calculate the update values\n    const transposedZ = transpose([z])\n    const y = sub(transposedZ, mult(this.H, xP)) // This is the measurement error (between what we expect and the actual value)\n    const S = add(mult(mult(this.H, pP), transpose(this.H)), this.R) // This is the residual covariance (the error in the covariance)\n\n    // kalman multiplier: K = P * H' * (H * P * H' + R)^-1\n    const K = mult(pP, mult(transpose(this.H), inv(S))) // This is the Optimal Kalman Gain\n\n    // We need to change Y into it's column vector form\n    // const line = y[0]\n    for (let i = 0; i < y.length; i++) {\n      yColumnVector[i] = [y[i]]\n    }\n\n    // Now we correct the internal values of the model\n    // correction: X = X + K * (m - H * X)  |  P = (I - K * H) * P\n    this.X = add(xP, mult(K, y))\n    this.P = mult(sub(identity(K.length), mult(K, this.H)), pP)\n    return transpose(mult(this.H, this.X))[0] // Transforms the predicted state back into it's measurement form\n  }\n}\n","// @ts-check\nimport params from './params.mjs'\nimport { identity, mult, multScalar, solve, transpose } from './worker_scripts/mat'\nimport { DataWindow, KalmanFilter, getEyeFeats } from './worker_scripts/util'\n\n/**\n * Performs ridge regression, according to the Weka code.\n * @param {number[][]} y - corresponds to screen coordinates (either x or y) for each of n click events\n * @param {number[][]} X - corresponds to gray pixel features (120 pixels for both eyes) for each of n clicks\n * @param {number} k - ridge parameter\n * @return {number[]} regression coefficients\n */\nexport const ridge = (y, X, k) => {\n  const nc = X[0].length\n  const mCoefficients = /** @type {number[]} */(new Array(nc))\n  const xt = transpose(X)\n  let solution = []\n  let success = true\n  const result = []\n  do {\n    const ss = mult(xt, X)\n    // Set ridge regression adjustment\n    for (let i = 0; i < nc; i++) {\n      ss[i][i] = ss[i][i] + k\n    }\n\n    // Carry out the regression\n    const bb = mult(xt, y)\n    for (let i = 0; i < nc; i++) {\n      mCoefficients[i] = bb[i][0]\n    }\n    try {\n      const n = (mCoefficients.length !== 0 ? mCoefficients.length / mCoefficients.length : 0)\n      if (mCoefficients.length * n !== mCoefficients.length) {\n        console.log('Array length must be a multiple of m')\n      }\n      solution = solve(ss, bb)\n\n      for (let i = 0; i < nc; i++) {\n        // Should it be solution[i][i] or solution[i][0]\n        result[i] = solution[i][0]\n      }\n      success = true\n    } catch (ex) {\n      k *= 10\n      console.log(ex)\n      success = false\n    }\n  } while (!success)\n  return result\n}\n\n/**\n * @typedef {Object} DataSet\n * @property {import('./facemesh.mjs').TwoEyes} eyes eyes where extract data to add\n * @property {[number, number]} screenPos The current screen point\n * @property {'click' | 'move' | 'blink'} type The type of performed action\n */\n\nconst dataWindow = 700\nconst trailDataWindow = 10\n\nexport class Ridge {\n  /**\n   * The RidgeReg object name\n   * @type {string}\n   */\n  name = 'ridge'\n\n  ridgeParameter = Math.pow(10, -5)\n  trailTime = 1000\n  trailDataWindow = this.trailTime / params.moveTickSize\n\n  /** @type {DataWindow<number[]>} */\n  screenXClicksArray = new DataWindow(dataWindow)\n  /** @type {DataWindow<number[]>} */\n  screenYClicksArray = new DataWindow(dataWindow)\n  /** @type {DataWindow<number[]>} */\n  eyeFeaturesClicks = new DataWindow(dataWindow)\n\n  // sets to one second worth of cursor trail\n  /** @type {DataWindow<number[]>} */\n  screenXTrailArray = new DataWindow(trailDataWindow)\n  /** @type {DataWindow<number[]>} */\n  screenYTrailArray = new DataWindow(trailDataWindow)\n  /** @type {DataWindow<number[]>} */\n  eyeFeaturesTrail = new DataWindow(trailDataWindow)\n  /** @type {DataWindow<number>} */\n  trailTimes = new DataWindow(trailDataWindow)\n\n  /** @type {DataWindow<DataSet>} */\n  dataClicks = new DataWindow(dataWindow)\n  /** @type {DataWindow<DataSet>} */\n  dataTrail = new DataWindow(trailDataWindow)\n\n  /** @type {KalmanFilter} */\n  kalman\n  /**\n   * Constructor of RidgeReg object,\n   * this object allow to perform ridge regression\n   * @constructor\n   */\n  constructor () {\n    // Not used anywhere\n    // this.errorXArray = new DataWindow(dataWindow)\n    // this.errorYArray = new DataWindow(dataWindow)\n\n    // Initialize Kalman filter [20200608 xk] what do we do about parameters?\n    // [20200611 xk] unsure what to do w.r.t. dimensionality of these matrices. So far at least\n    // by my own anecdotal observation a 4x1 x vector seems to work alright\n    const F = [[1, 0, 1, 0],\n      [0, 1, 0, 1],\n      [0, 0, 1, 0],\n      [0, 0, 0, 1]]\n\n    // Parameters Q and R may require some fine tuning\n    let Q = [[1 / 4, 0, 1 / 2, 0],\n      [0, 1 / 4, 0, 1 / 2],\n      [1 / 2, 0, 1, 0],\n      [0, 1 / 2, 0, 1]]// * delta_t\n    const deltaT = 1 / 10 // The amount of time between frames\n    Q = multScalar(Q, deltaT)\n\n    const H = [[1, 0, 0, 0],\n      [0, 1, 0, 0]]\n    const pixelError = 47 // We will need to fine tune this value [20200611 xk] I just put a random value here\n\n    // This matrix represents the expected measurement error\n    const R = multScalar(identity(2), pixelError)\n\n    const PInitial = multScalar(identity(4), 0.0001) // Initial covariance matrix\n    const xInitial = [[500], [500], [0], [0]] // Initial measurement matrix\n\n    this.kalman = new KalmanFilter(F, H, Q, R, PInitial, xInitial)\n  }\n\n  // This is not being used anywhere...?\n  // getCurrentFixationIndex = () => {\n  //   const recentX = this.screenXTrailArray.get(0)\n  //   const recentY = this.screenYTrailArray.get(0)\n  //   let i\n  //   for (i = this.screenXTrailArray.length - 1; i >= 0; i--) {\n  //     const currX = this.screenXTrailArray.get(i)\n  //     const currY = this.screenYTrailArray.get(i)\n  //     const euclideanDistance = Math.sqrt(Math.pow((currX - recentX), 2) + Math.pow((currY - recentY), 2))\n  //     if (euclideanDistance > 72) {\n  //       return i + 1\n  //     }\n  //   }\n  //   return i\n  // }\n\n  /**\n   * Add given data to current data set then,\n   * replace current data member with given data\n   * @param {DataSet[]} data - The data to set\n   */\n  setData = (data) => {\n    for (let i = 0; i < data.length; i++) {\n      // Clone data array\n      const leftData = new Uint8ClampedArray(data[i].eyes.left.patch.data)\n      const rightData = new Uint8ClampedArray(data[i].eyes.right.patch.data)\n      // Duplicate ImageData object\n      data[i].eyes.left.patch = new ImageData(leftData, data[i].eyes.left.width, data[i].eyes.left.height)\n      data[i].eyes.right.patch = new ImageData(rightData, data[i].eyes.right.width, data[i].eyes.right.height)\n\n      // Add those data objects to model\n      this.addData(data[i])\n    }\n  }\n\n  /**\n   * Data to be added\n   * @param {DataSet} data\n   * @returns {void}\n   */\n  addData = data => {\n    const { eyes, screenPos, type } = data\n    if (!eyes) return\n\n    // not doing anything with blink at present\n    // if (eyes.left.blink || eyes.right.blink) {\n    //     return;\n    // }\n    if (type === 'click') {\n      this.screenXClicksArray.push([screenPos[0]])\n      this.screenYClicksArray.push([screenPos[1]])\n      this.eyeFeaturesClicks.push(getEyeFeats(eyes))\n      this.dataClicks.push({ eyes, screenPos, type })\n    } else if (type === 'move') {\n      this.screenXTrailArray.push([screenPos[0]])\n      this.screenYTrailArray.push([screenPos[1]])\n\n      this.eyeFeaturesTrail.push(getEyeFeats(eyes))\n      this.trailTimes.push(performance.now())\n      this.dataTrail.push({ eyes, screenPos, type })\n    }\n\n    // [20180730 JT] Why do we do this? It doesn't return anything...\n    // But as JS is pass by reference, it still affects it.\n    //\n    // Causes problems for when we want to call 'addData' twice in a row on the same object, but perhaps with different screenPos or types (think multiple interactions within one video frame)\n    // eyes.left.patch = Array.from(eyes.left.patch.data);\n    // eyes.right.patch = Array.from(eyes.right.patch.data);\n  }\n\n  /**\n   * Return the data\n   * @returns {DataSet[]}\n   */\n  getData = () => {\n    return this.dataClicks.data\n  }\n}\n","// @ts-check\nimport { Ridge, ridge } from './util_regression.mjs'\nimport params from './params.mjs'\nimport { getEyeFeats } from './worker_scripts/util'\n\nexport class RidgeReg extends Ridge {\n  /**\n   * Try to predict coordinates from pupil data\n   * after apply linear regression on data set\n   * @param {import('./facemesh.mjs').TwoEyes | undefined} eyesObj - The current user eyes object\n   * @returns {{ x: number; y: number } | undefined}\n   */\n  predict = eyesObj => {\n    if (!eyesObj || this.eyeFeaturesClicks.length === 0) return\n    const acceptTime = performance.now() - this.trailTime\n    /** @type {number[][]} */\n    const trailX = []\n    /** @type {number[][]} */\n    const trailY = []\n    /** @type {number[][]} */\n    const trailFeat = []\n    for (let i = 0; i < this.trailDataWindow; i++) {\n      if (this.trailTimes.get(i) > acceptTime) {\n        trailX.push(this.screenXTrailArray.get(i))\n        trailY.push(this.screenYTrailArray.get(i))\n        trailFeat.push(this.eyeFeaturesTrail.get(i))\n      }\n    }\n\n    const screenXArray = this.screenXClicksArray.data.concat(trailX)\n    const screenYArray = this.screenYClicksArray.data.concat(trailY)\n    const eyeFeatures = this.eyeFeaturesClicks.data.concat(trailFeat)\n\n    const coefficientsX = ridge(screenXArray, eyeFeatures, this.ridgeParameter)\n    const coefficientsY = ridge(screenYArray, eyeFeatures, this.ridgeParameter)\n\n    const eyeFeats = getEyeFeats(eyesObj)\n    let predictedX = 0\n    for (let i = 0; i < eyeFeats.length; i++) {\n      predictedX += eyeFeats[i] * coefficientsX[i]\n    }\n    let predictedY = 0\n    for (let i = 0; i < eyeFeats.length; i++) {\n      predictedY += eyeFeats[i] * coefficientsY[i]\n    }\n\n    predictedX = Math.floor(predictedX)\n    predictedY = Math.floor(predictedY)\n\n    if (params.applyKalmanFilter) {\n    // Update Kalman model, and get prediction\n      let newGaze = [predictedX, predictedY] // [20200607 xk] Should we use a 1x4 vector?\n      newGaze = this.kalman.update(newGaze)\n\n      return {\n        x: newGaze[0],\n        y: newGaze[1]\n      }\n    } else {\n      return {\n        x: predictedX,\n        y: predictedY\n      }\n    }\n  }\n}\n","// @ts-check\nimport { Ridge, ridge } from './util_regression.mjs'\nimport params from './params.mjs'\nimport { getEyeFeats } from './worker_scripts/util'\n\nexport class RidgeWeightedReg extends Ridge {\n  /**\n   * The RidgeWeightedReg object name\n   * @type {string}\n   */\n  name = 'ridgeWeighted'\n\n  /**\n   * Try to predict coordinates from pupil data\n   * after apply linear regression on data set\n   * @param {import('./facemesh.mjs').TwoEyes | undefined} eyesObj - The current user eyes object\n   * @returns {import('./worker_scripts/util').Point | undefined}\n   */\n  predict = eyesObj => {\n    if (!eyesObj || this.eyeFeaturesClicks.length === 0) return\n    const acceptTime = performance.now() - this.trailTime\n    const trailX = []\n    const trailY = []\n    const trailFeat = []\n    for (let i = 0; i < this.trailDataWindow; i++) {\n      if (this.trailTimes.get(i) > acceptTime) {\n        trailX.push(this.screenXTrailArray.get(i))\n        trailY.push(this.screenYTrailArray.get(i))\n        trailFeat.push(this.eyeFeaturesTrail.get(i))\n      }\n    }\n\n    const len = this.eyeFeaturesClicks.data.length\n    const weightedEyeFeats = Array(len)\n    const weightedXArray = Array(len)\n    const weightedYArray = Array(len)\n    for (let i = 0; i < len; i++) {\n      const weight = Math.sqrt(1 / (len - i)) // access from oldest to newest so should start with low weight and increase steadily\n      // abstraction is leaking...\n      const trueIndex = this.eyeFeaturesClicks.getTrueIndex(i)\n      for (let j = 0; j < this.eyeFeaturesClicks.data[trueIndex].length; j++) {\n        const val = this.eyeFeaturesClicks.data[trueIndex][j] * weight\n        if (weightedEyeFeats[trueIndex] !== undefined) {\n          weightedEyeFeats[trueIndex].push(val)\n        } else {\n          weightedEyeFeats[trueIndex] = [val]\n        }\n      }\n      weightedXArray[i] = this.screenXClicksArray.get(i).slice(0, this.screenXClicksArray.get(i).length)\n      weightedYArray[i] = this.screenYClicksArray.get(i).slice(0, this.screenYClicksArray.get(i).length)\n      weightedXArray[i][0] = weightedXArray[i][0] * weight\n      weightedYArray[i][0] = weightedYArray[i][0] * weight\n    }\n\n    const screenXArray = weightedXArray.concat(trailX)\n    const screenYArray = weightedYArray.concat(trailY)\n    const eyeFeatures = weightedEyeFeats.concat(trailFeat)\n\n    const coefficientsX = ridge(screenXArray, eyeFeatures, this.ridgeParameter)\n    const coefficientsY = ridge(screenYArray, eyeFeatures, this.ridgeParameter)\n\n    const eyeFeats = getEyeFeats(eyesObj)\n    let predictedX = 0\n    for (let i = 0; i < eyeFeats.length; i++) {\n      predictedX += eyeFeats[i] * coefficientsX[i]\n    }\n    let predictedY = 0\n    for (let i = 0; i < eyeFeats.length; i++) {\n      predictedY += eyeFeats[i] * coefficientsY[i]\n    }\n\n    predictedX = Math.floor(predictedX)\n    predictedY = Math.floor(predictedY)\n\n    if (params.applyKalmanFilter) {\n      // Update Kalman model, and get prediction\n      let newGaze = [predictedX, predictedY] // [20200607 xk] Should we use a 1x4 vector?\n      newGaze = this.kalman.update(newGaze)\n\n      return {\n        x: newGaze[0],\n        y: newGaze[1]\n      }\n    } else {\n      return {\n        x: predictedX,\n        y: predictedY\n      }\n    }\n  }\n}\n","// @ts-check\nimport params from './params.mjs'\nimport { Ridge } from './util_regression.mjs'\nimport { getEyeFeats } from './worker_scripts/util'\n\n/**\n * @typedef {Object} Weights\n * @property {number[]} X\n * @property {number[]} Y\n */\n\nexport class RidgeRegThreaded extends Ridge {\n  /**\n   * The RidgeWeightedReg object name\n   * @type {string}\n   */\n  name = 'ridgeThreaded'\n\n  /** @type {Weights} */\n  weights = { X: [0], Y: [0] }\n  /** @type {Worker} */\n  worker\n  /**\n   * Constructor of RidgeRegThreaded object,\n   * it retrieve data window, and prepare a worker,\n   * this object allow to perform threaded ridge regression\n   * @constructor\n   */\n  constructor () {\n    super()\n\n    // Place the src/ridgeworker.js file into the same directory as your html file.\n    if (!this.worker) {\n      this.worker = new Worker('ridgeWorker.worker.mjs', { type: 'module' }) // [20200708] TODO: Figure out how to make this inline\n      this.worker.onerror = err => console.log(err.message)\n      this.worker.onmessage = /** @type {(evt: MessageEvent<Weights>) => void} */evt => {\n        this.weights.X = evt.data.X\n        this.weights.Y = evt.data.Y\n      }\n      console.log('initialized worker')\n    }\n  }\n\n  /**\n   * Data to be added\n   * @param {import('./util_regression.mjs').DataSet} data\n   * @returns\n   */\n  addData = data => {\n    const { eyes, screenPos, type } = data\n    if (!eyes) return\n    if (type === 'click') this.dataClicks.push(data)\n    this.worker.postMessage(/** @type {import('./ridgeWorker.worker.mjs').EyeData} */({ eyes: getEyeFeats(eyes), screenPos, type }))\n  }\n\n  /**\n   * Return the data\n   * @returns {import('./util_regression.mjs').DataSet[]}\n   */\n  getData = () => {\n    return this.dataClicks.data\n  }\n\n  /**\n * Try to predict coordinates from pupil data\n * after apply linear regression on data set\n * @param {import('./facemesh.mjs').TwoEyes | undefined} eyesObj - The current user eyes object\n * @returns {import('./worker_scripts/util').Point | undefined}\n */\n  predict = eyesObj => {\n    // console.log('LOGGING..');\n    if (!eyesObj) return\n    const coefficientsX = this.weights.X\n    const coefficientsY = this.weights.Y\n\n    const eyeFeats = getEyeFeats(eyesObj)\n    let predictedX = 0; let predictedY = 0\n    for (let i = 0; i < eyeFeats.length; i++) {\n      predictedX += eyeFeats[i] * coefficientsX[i]\n      predictedY += eyeFeats[i] * coefficientsY[i]\n    }\n\n    predictedX = Math.floor(predictedX)\n    predictedY = Math.floor(predictedY)\n\n    if (params.applyKalmanFilter) {\n      // Update Kalman model, and get prediction\n      let newGaze = [predictedX, predictedY] // [20200607 xk] Should we use a 1x4 vector?\n      newGaze = this.kalman.update(newGaze)\n\n      return {\n        x: newGaze[0],\n        y: newGaze[1]\n      }\n    } else {\n      return {\n        x: predictedX,\n        y: predictedY\n      }\n    }\n  }\n}\n","// @ts-check\nimport \"@tensorflow/tfjs\";\n\nimport \"regression\";\nimport \"./dom_util.mjs\";\nimport localforage from \"localforage\";\nimport { TFFaceMesh } from \"./facemesh.mjs\";\nimport { RidgeReg } from \"./ridgeReg.mjs\";\nimport { RidgeWeightedReg } from \"./ridgeWeightedReg.mjs\";\nimport { RidgeRegThreaded } from \"./ridgeRegThreaded.mjs\";\nimport params from \"./params.mjs\";\nimport { DataWindow, bound } from \"./worker_scripts/util\";\n\n// PRIVATE VARIABLES\n\n// video elements\n/** @type {MediaStream} */\nlet videoStream;\n/** @type {HTMLDivElement} */\nlet videoContainerElement;\n/** @type {HTMLVideoElement} */\nlet videoElement;\n/** @type {HTMLCanvasElement} */\nlet videoElementCanvas;\n/** @type {HTMLCanvasElement} */\nlet faceOverlay;\n/** @type {HTMLCanvasElement} */\nlet faceFeedbackBox;\n/** @type {HTMLDivElement} */\nlet gazeDot;\n// Why is this not in webgazer.params ?\n/** @type {MediaStream} */\nlet debugVideoLoc;\n\n/**\n * Initialises variables used to store accuracy eigenValues\n * This is used by the calibration example file\n * @type {number[]}\n */\nconst xPast50 = new Array(50);\n/** @type {number[]} */\nconst yPast50 = new Array(50);\n/** @type {string[]} */\nconst past50PredictedTimestamp = new Array(50);\n\n/**\n * @typedef {Object} PredictionResult\n * @property {number} x\n * @property {number} y\n * @property {import('./facemesh.mjs').TwoEyes=} eyeFeatures\n * @property {(import('./worker_scripts/util').Point | undefined)[]=} all\n */\n\n// loop parameters\nlet clockStart = performance.now();\n/** @type {import('./facemesh.mjs').TwoEyes | undefined} */\nlet latestEyeFeatures;\n/** @type {PredictionResult | undefined} */\nlet latestGazeData;\nlet paused = false;\n// registered callback for loop\nconst nopCallback = () => {};\n/** @type {(data: PredictionResult | undefined, elapsedTime: number) => void} */\nlet gazeListener = nopCallback;\n\n/**\n * Types that regression systems should handle\n * Describes the source of data so that regression systems may ignore or handle differently the various generating events\n * @type {('click' | 'move')[]}\n **/\nconst eventTypes = [\"click\", \"move\"];\n\n// movelistener timeout clock parameters\nlet moveClock = performance.now();\n// currently used tracker and regression models, defaults to clmtrackr and linear regression\nlet curTracker = new TFFaceMesh();\n/** @type {(RidgeReg | RidgeWeightedReg | RidgeRegThreaded)[]} */\nlet regs = [new RidgeReg()];\n// var blinkDetector = new webgazer.BlinkDetector();\n\n// lookup tables\nconst curTrackerMap = {\n\tTFFaceMesh: () => new TFFaceMesh(),\n};\nconst regressionMap = {\n\tridge: () => new RidgeReg(),\n\tridgeWeighted: () => new RidgeWeightedReg(),\n\tridgeThreaded: () => new RidgeRegThreaded(),\n};\n\n// localstorage name\nconst localstorageDataLabel = \"webgazerGlobalData\";\nconst localstorageSettingsLabel = \"webgazerGlobalSettings\";\n// settings object for future storage of settings\nlet settings = {};\nlet data = [];\nconst defaults = {\n\tdata: [],\n\tsettings: {},\n};\n\nexport const clearAll = () => {\n\tremoveMouseEventListeners();\n\tregs = [];\n};\n\n// PRIVATE FUNCTIONS\n\n/**\n * Computes the size of the face overlay validation box depending on the size of the video preview window.\n * @returns {[number, number, number, number]} The dimensions of the validation box as top, left, width, height.\n */\nconst computeValidationBoxSize = () => {\n\tconst vw = videoElement.videoWidth;\n\tconst vh = videoElement.videoHeight;\n\tconst pw = parseInt(videoElement.style.width);\n\tconst ph = parseInt(videoElement.style.height);\n\n\t// Find the size of the box.\n\t// Pick the smaller of the two video preview sizes\n\tconst smaller = Math.min(vw, vh);\n\tconst larger = Math.max(vw, vh);\n\n\t// Overall scalar\n\tconst scalar = vw === larger ? pw / vw : ph / vh;\n\n\t// Multiply this by 2/3, then adjust it to the size of the preview\n\tconst boxSize = smaller * params.faceFeedbackBoxRatio * scalar;\n\n\t// Set the boundaries of the face overlay validation box based on the preview\n\tconst topVal = (ph - boxSize) / 2;\n\tconst leftVal = (pw - boxSize) / 2;\n\n\t// top, left, width, height\n\treturn [topVal, leftVal, boxSize, boxSize];\n};\n\n/**\n * Checks if the pupils are in the position box on the video\n */\nfunction checkEyesInValidationBox() {\n\tif (faceFeedbackBox != null && latestEyeFeatures) {\n\t\tconst w = videoElement.videoWidth;\n\t\tconst h = videoElement.videoHeight;\n\n\t\t// Find the size of the box.\n\t\t// Pick the smaller of the two video preview sizes\n\t\tconst smaller = Math.min(w, h);\n\t\tconst boxSize = smaller * params.faceFeedbackBoxRatio;\n\n\t\t// Set the boundaries of the face overlay validation box based on the preview\n\t\tconst topBound = (h - boxSize) / 2;\n\t\tconst leftBound = (w - boxSize) / 2;\n\t\tconst rightBound = leftBound + boxSize;\n\t\tconst bottomBound = topBound + boxSize;\n\n\t\t// get the x and y positions of the left and right eyes\n\t\tconst eyeLX = latestEyeFeatures.left.imagex;\n\t\tconst eyeLY = latestEyeFeatures.left.imagey;\n\t\tconst eyeRX = latestEyeFeatures.right.imagex;\n\t\tconst eyeRY = latestEyeFeatures.right.imagey;\n\n\t\tlet xPositions = false;\n\t\tlet yPositions = false;\n\n\t\t// check if the x values for the left and right eye are within the\n\t\t// validation box\n\t\t// add the width when comparing against the rightBound (which is the left edge on the preview)\n\t\tif (\n\t\t\teyeLX > leftBound &&\n\t\t\teyeLX + latestEyeFeatures.left.width < rightBound\n\t\t) {\n\t\t\tif (\n\t\t\t\teyeRX > leftBound &&\n\t\t\t\teyeRX + latestEyeFeatures.right.width < rightBound\n\t\t\t) {\n\t\t\t\txPositions = true;\n\t\t\t}\n\t\t}\n\n\t\t// check if the y values for the left and right eye are within the\n\t\t// validation box\n\t\tif (\n\t\t\teyeLY > topBound &&\n\t\t\teyeLY + latestEyeFeatures.left.height < bottomBound\n\t\t) {\n\t\t\tif (\n\t\t\t\teyeRY > topBound &&\n\t\t\t\teyeRY + latestEyeFeatures.right.height < bottomBound\n\t\t\t) {\n\t\t\t\tyPositions = true;\n\t\t\t}\n\t\t}\n\n\t\t// if the x and y values for both the left and right eye are within\n\t\t// the validation box then the box border turns green, otherwise if\n\t\t// the eyes are outside of the box the colour is red\n\t\tif (xPositions && yPositions) {\n\t\t\tfaceFeedbackBox.style.border = \"solid green\";\n\t\t} else {\n\t\t\tfaceFeedbackBox.style.border = \"solid red\";\n\t\t}\n\t} else {\n\t\tfaceFeedbackBox.style.border = \"solid black\";\n\t}\n}\n\n/**\n * This draws the point (x,y) onto the canvas in the HTML\n * @param {string} colour - The colour of the circle to plot\n * @param {number} x - The x co-ordinate of the desired point to plot\n * @param {number} y - The y co-ordinate of the desired point to plot\n */\nfunction drawCoordinates(colour, x, y) {\n\tconst canvas = /** @type {HTMLCanvasElement | null} */ (\n\t\tdocument.getElementById(\"plotting_canvas\")\n\t);\n\tif (!canvas) return;\n\tconst ctx = canvas.getContext(\"2d\", {\n\t\twillReadFrequently: true,\n\t});\n\tif (!ctx) return;\n\tctx.fillStyle = colour;\n\tctx.beginPath();\n\tctx.arc(x, y, 5, 0, Math.PI * 2, true);\n\tctx.fill();\n}\n\n/**\n * Gets the pupil features by following the pipeline which threads an eyes object through each call:\n * curTracker gets eye patches -> blink detector -> pupil detection\n * @param {HTMLCanvasElement} canvas - a canvas which will have the video drawn onto it\n * @param {Number} width - the width of canvas\n * @param {Number} height - the height of canvas\n */\nfunction getPupilFeatures(canvas, width, height) {\n\tif (!canvas) return;\n\ttry {\n\t\treturn curTracker.getEyePatches(videoElement, canvas, width, height);\n\t} catch (err) {\n\t\tconsole.log(\"can't get pupil features \", err);\n\t}\n}\n\n/**\n * Gets the most current frame of video and paints it to a resized version of the canvas with width and height\n * @param {HTMLCanvasElement} canvas - the canvas to paint the video on to\n * @param {number} width - the new width of the canvas\n * @param {number} height - the new height of the canvas\n */\nfunction paintCurrentFrame(canvas, width, height) {\n\tif (canvas.width !== width) {\n\t\tcanvas.width = width;\n\t}\n\tif (canvas.height !== height) {\n\t\tcanvas.height = height;\n\t}\n\n\tconst ctx = canvas.getContext(\"2d\", {\n\t\twillReadFrequently: true,\n\t});\n\tctx && ctx.drawImage(videoElement, 0, 0, canvas.width, canvas.height);\n}\n\n/**\n * Paints the video to a canvas and runs the prediction pipeline to get a prediction\n * @param {number=} regModelIndex - The prediction index we're looking for\n * @returns {Promise<PredictionResult | undefined>}\n */\nasync function getPrediction(regModelIndex) {\n\t/** @type {(import('./worker_scripts/util').Point | undefined)[]} */\n\tconst predictions = [];\n\t// [20200617 xk] TODO: this call should be made async somehow. will take some work.\n\tlatestEyeFeatures = await getPupilFeatures(\n\t\tvideoElementCanvas,\n\t\tvideoElementCanvas.width,\n\t\tvideoElementCanvas.height\n\t);\n\n\tif (regs.length === 0) {\n\t\tconsole.log(\"regression not set, call setRegression()\");\n\t\treturn;\n\t}\n\tfor (const reg in regs) {\n\t\tpredictions.push(regs[reg].predict(latestEyeFeatures));\n\t}\n\tif (regModelIndex !== undefined) {\n\t\tconst prediction = predictions[regModelIndex];\n\t\treturn (\n\t\t\tprediction && {\n\t\t\t\tx: prediction.x,\n\t\t\t\ty: prediction.y,\n\t\t\t\teyeFeatures: latestEyeFeatures,\n\t\t\t}\n\t\t);\n\t} else {\n\t\treturn (\n\t\t\tpredictions[0] && {\n\t\t\t\tx: predictions[0].x,\n\t\t\t\ty: predictions[0].y,\n\t\t\t\teyeFeatures: latestEyeFeatures,\n\t\t\t\tall: predictions,\n\t\t\t}\n\t\t);\n\t}\n}\n\n/**\n * Runs every available animation frame if webgazer is not paused\n */\nconst smoothingVals = /** @type {DataWindow<PredictionResult>} */ (\n\tnew DataWindow(4)\n);\nlet k = 0;\n\nconst loop = async () => {\n\tif (!paused) {\n\t\t// [20200617 XK] TODO: there is currently lag between the camera input and the face overlay. This behavior\n\t\t// is not seen in the facemesh demo. probably need to optimize async implementation. I think the issue lies\n\t\t// in the implementation of getPrediction().\n\n\t\t// Paint the latest video frame into the canvas which will be analyzed by WebGazer\n\t\t// [20180729 JT] Why do we need to do this? clmTracker does this itself _already_, which is just duplicating the work.\n\t\t// Is it because other trackers need a canvas instead of an img/video element?\n\t\tpaintCurrentFrame(\n\t\t\tvideoElementCanvas,\n\t\t\tvideoElementCanvas.width,\n\t\t\tvideoElementCanvas.height\n\t\t);\n\n\t\t// Count time\n\t\tconst elapsedTime = performance.now() - clockStart;\n\n\t\t// Draw face overlay\n\t\tif (params.showFaceOverlay) {\n\t\t\t// Get tracker object\n\t\t\tconst tracker = getTracker();\n\t\t\tconst ctx = faceOverlay.getContext(\"2d\", {\n\t\t\t\twillReadFrequently: true,\n\t\t\t});\n\t\t\tif (!ctx) return;\n\t\t\tctx.clearRect(0, 0, videoElement.videoWidth, videoElement.videoHeight);\n\t\t\tconst positions =\n\t\t\t\t/** @type {import('@tensorflow-models/face-landmarks-detection/dist/mediapipe-facemesh/util').Coords3D} */ (\n\t\t\t\t\ttracker.getPositions()\n\t\t\t\t);\n\n\t\t\ttracker.drawFaceOverlay(ctx, positions);\n\t\t}\n\n\t\t// Feedback box\n\t\t// Check that the eyes are inside of the validation box\n\t\tif (params.showFaceFeedbackBox) {\n\t\t\tcheckEyesInValidationBox();\n\t\t}\n\n\t\t// Get gaze prediction (ask clm to track; pass the data to the regressor; get back a prediction)\n\t\tlatestGazeData = await getPrediction();\n\n\t\t// [20200623 xk] callback to function passed into setGazeListener(fn)\n\t\tgazeListener(latestGazeData, elapsedTime);\n\n\t\tif (latestGazeData) {\n\t\t\t// [20200608 XK] Smoothing across the most recent 4 predictions, do we need this with Kalman filter?\n\t\t\tsmoothingVals.push(latestGazeData);\n\t\t\tconst { x, y } = smoothingVals.data\n\t\t\t\t.map((_, i) => smoothingVals.get(i))\n\t\t\t\t.reduce(\n\t\t\t\t\t(result, val) => ({\n\t\t\t\t\t\tx: result.x + val.x,\n\t\t\t\t\t\ty: result.y + val.y,\n\t\t\t\t\t}),\n\t\t\t\t\t{ x: 0, y: 0 }\n\t\t\t\t);\n\n\t\t\tconst len = smoothingVals.length;\n\t\t\tconst pred = bound({ x: x / len, y: y / len });\n\t\t\tconst predTimestamp = new Date().toISOString();\n\n\t\t\tif (params.storingPoints) {\n\t\t\t\tif (params.showStoredPoints) {\n\t\t\t\t\tdrawCoordinates(params.storedDotColor, pred.x, pred.y); // draws the previous predictions\n\t\t\t\t}\n\n\t\t\t\t// store the position of the past fifty occuring tracker preditions\n\t\t\t\tstorePoints(pred.x, pred.y, predTimestamp, k);\n\t\t\t\tk++;\n\t\t\t\tif (k === 50) {\n\t\t\t\t\tk = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// GazeDot\n\t\t\tif (params.showGazeDot) {\n\t\t\t\tgazeDot.style.display = \"block\";\n\t\t\t}\n\t\t\tgazeDot.style.transform =\n\t\t\t\t\"translate3d(\" + pred.x + \"px,\" + pred.y + \"px,0)\";\n\t\t} else {\n\t\t\tgazeDot.style.display = \"none\";\n\t\t}\n\n\t\trequestAnimationFrame(loop);\n\t}\n};\n\n// is problematic to test\n// because latestEyeFeatures is not set in many cases\n\n/**\n * Records screen position data based on current pupil feature and passes it\n * to the regression model.\n * @param {number} x - The x screen position\n * @param {number} y - The y screen position\n * @param {'click' | 'move'} eventType - The event type to store\n * @returns {void}\n */\nexport const recordScreenPosition = (x, y, eventType = eventTypes[0]) => {\n\tif (paused) return;\n\tif (regs.length === 0) {\n\t\tconsole.log(\"regression not set, call setRegression()\");\n\t\treturn;\n\t}\n\tfor (const reg in regs) {\n\t\tif (latestEyeFeatures)\n\t\t\tregs[reg].addData({\n\t\t\t\teyes: latestEyeFeatures,\n\t\t\t\tscreenPos: [x, y],\n\t\t\t\ttype: eventType,\n\t\t\t});\n\t}\n};\n\n/**\n * Records click data and passes it to the regression model\n * @param {MouseEvent} event - The listened event\n */\nconst clickListener = async (event) => {\n\trecordScreenPosition(event.clientX, event.clientY, eventTypes[0]); // eventType[0] === 'click'\n\n\tif (params.saveDataAcrossSessions) {\n\t\t// Each click stores the next data point into localforage.\n\t\tawait setGlobalData();\n\n\t\t// // Debug line\n\t\t// console.log('Model size: ' + JSON.stringify(await localforage.getItem(localstorageDataLabel)).length / 1000000 + 'MB');\n\t}\n};\n\n/**\n * Records mouse movement data and passes it to the regression model\n * @param {MouseEvent} event - The listened event\n */\nconst moveListener = (event) => {\n\tif (paused) {\n\t\treturn;\n\t}\n\n\tconst now = performance.now();\n\tif (now < moveClock + params.moveTickSize) {\n\t\treturn;\n\t} else {\n\t\tmoveClock = now;\n\t}\n\trecordScreenPosition(event.clientX, event.clientY, eventTypes[1]); // eventType[1] === 'move'\n};\n\n/**\n * Add event listeners for mouse click and move.\n */\nconst addMouseEventListeners = () => {\n\t// third argument set to true so that we get event on 'capture' instead of 'bubbling'\n\t// this prevents a client using event.stopPropagation() preventing our access to the click\n\tdocument.addEventListener(\"click\", clickListener, true);\n\tdocument.addEventListener(\"mousemove\", moveListener, true);\n};\n\n/**\n * Remove event listeners for mouse click and move.\n */\nexport const removeMouseEventListeners = () => {\n\t// must set third argument to same value used in addMouseEventListeners\n\t// for this to work.\n\tdocument.removeEventListener(\"click\", clickListener, true);\n\tdocument.removeEventListener(\"mousemove\", moveListener, true);\n};\n\n/**\n * Loads the global data and passes it to the regression model\n */\nconst loadGlobalData = async () => {\n\t// Get settings object from localforage\n\t// [20200611 xk] still unsure what this does, maybe would be good for Kalman filter settings etc?\n\tsettings = await localforage.getItem(localstorageSettingsLabel);\n\tsettings = settings || defaults;\n\n\t// Get click data from localforage\n\tlet loadData = await localforage.getItem(localstorageDataLabel);\n\tloadData = loadData || defaults;\n\n\t// Set global var data to newly loaded data\n\tdata = loadData;\n\n\t// Load data into regression model(s)\n\tfor (const reg in regs) {\n\t\tregs[reg].setData(loadData);\n\t}\n\n\tconsole.log(\"loaded stored data into regression model\");\n};\n\n/**\n * Adds data to localforage\n */\nconst setGlobalData = async () => {\n\t// Grab data from regression model\n\tconst storeData = regs[0].getData() || data; // Array\n\n\t// Store data into localforage\n\tlocalforage.setItem(localstorageSettingsLabel, settings); // [20200605 XK] is 'settings' ever being used?\n\tlocalforage.setItem(localstorageDataLabel, storeData);\n\t// TODO data should probably be stored in webgazer object instead of each regression model\n\t//     -> requires duplication of data, but is likely easier on regression model implementors\n};\n\n/**\n * Clears data from model and global storage\n */\nexport const clearData = () => {\n\t// Removes data from localforage\n\tlocalforage.clear();\n\n\t// Create fresh instances of the regression models\n\tregs = regs.map((reg) => regressionMap[reg.name]());\n};\n\n/**\n * Initializes all needed dom elements and begins the loop\n * @param {MediaStream} stream - The video stream to use\n */\nconst init = async (stream) => {\n\t/// ///////////////////////\n\t// Video and video preview\n\t/// ///////////////////////\n\tconst topDist = \"0px\";\n\tconst leftDist = \"0px\";\n\n\t// create a video element container to enable customizable placement on the page\n\tvideoContainerElement = document.createElement(\"div\");\n\tvideoContainerElement.id = params.videoContainerId;\n\n\tvideoContainerElement.style.position = \"fixed\";\n\tvideoContainerElement.style.top = topDist;\n\tvideoContainerElement.style.left = leftDist;\n\tvideoContainerElement.style.width = params.videoViewerWidth + \"px\";\n\tvideoContainerElement.style.height = params.videoViewerHeight + \"px\";\n\thideVideoElement(videoContainerElement);\n\n\tvideoElement = document.createElement(\"video\");\n\tvideoElement.setAttribute(\"playsinline\", \"\");\n\tvideoElement.id = params.videoElementId;\n\tvideoElement.srcObject = stream;\n\tvideoElement.autoplay = true;\n\tvideoElement.style.position = \"absolute\";\n\t// We set these to stop the video appearing too large when it is added for the very first time\n\tvideoElement.style.width = params.videoViewerWidth + \"px\";\n\tvideoElement.style.height = params.videoViewerHeight + \"px\";\n\thideVideoElement(videoElement);\n\t// videoElement.style.zIndex=\"-1\";\n\n\t// used for stopVideo() and setCameraConstraints()\n\tvideoStream = stream;\n\n\t// Canvas for drawing video to pass to clm tracker\n\tvideoElementCanvas = document.createElement(\"canvas\");\n\tvideoElementCanvas.id = params.videoElementCanvasId;\n\tvideoElementCanvas.style.display = \"none\";\n\n\t// Face overlay\n\t// Shows the CLM tracking result\n\tfaceOverlay = document.createElement(\"canvas\");\n\tfaceOverlay.id = params.faceOverlayId;\n\tfaceOverlay.style.display = params.showFaceOverlay ? \"block\" : \"none\";\n\tfaceOverlay.style.position = \"absolute\";\n\n\t// Mirror video feed\n\tif (params.mirrorVideo) {\n\t\tvideoElement.style.setProperty(\"-moz-transform\", \"scale(-1, 1)\");\n\t\tvideoElement.style.setProperty(\"-webkit-transform\", \"scale(-1, 1)\");\n\t\tvideoElement.style.setProperty(\"-o-transform\", \"scale(-1, 1)\");\n\t\tvideoElement.style.setProperty(\"transform\", \"scale(-1, 1)\");\n\t\tvideoElement.style.setProperty(\"filter\", \"FlipH\");\n\t\tfaceOverlay.style.setProperty(\"-moz-transform\", \"scale(-1, 1)\");\n\t\tfaceOverlay.style.setProperty(\"-webkit-transform\", \"scale(-1, 1)\");\n\t\tfaceOverlay.style.setProperty(\"-o-transform\", \"scale(-1, 1)\");\n\t\tfaceOverlay.style.setProperty(\"transform\", \"scale(-1, 1)\");\n\t\tfaceOverlay.style.setProperty(\"filter\", \"FlipH\");\n\t}\n\n\t// Feedback box\n\t// Lets the user know when their face is in the middle\n\tfaceFeedbackBox = document.createElement(\"canvas\");\n\tfaceFeedbackBox.id = params.faceFeedbackBoxId;\n\tfaceFeedbackBox.style.display = params.showFaceFeedbackBox ? \"block\" : \"none\";\n\tfaceFeedbackBox.style.border = \"solid\";\n\tfaceFeedbackBox.style.position = \"absolute\";\n\n\t// Gaze dot\n\t// Starts offscreen\n\tgazeDot = document.createElement(\"div\");\n\tgazeDot.id = params.gazeDotId;\n\tgazeDot.style.display = params.showGazeDot ? \"block\" : \"none\";\n\tgazeDot.style.position = \"fixed\";\n\tgazeDot.style.zIndex = params.gazeDotZIndex;\n\tgazeDot.style.left = \"-5px\";\n\tgazeDot.style.top = \"-5px\";\n\tgazeDot.style.background = params.gazeDotColor;\n\tgazeDot.style.borderRadius = params.gazeDotBorderRadius;\n\tgazeDot.style.opacity = params.gazeDotOpacity;\n\tgazeDot.style.width = params.gazeDotWidth;\n\tgazeDot.style.height = params.gazeDotHeight;\n\n\t// Add other preview/feedback elements to the screen once the video has shown and its parameters are initialized\n\tvideoContainerElement.appendChild(videoElement);\n\tdocument.body.appendChild(videoContainerElement);\n\tconst videoPreviewSetup = /** @type {Promise<void>} */ (\n\t\tnew Promise((resolve) => {\n\t\t\tfunction setupPreviewVideo(e) {\n\t\t\t\t// All video preview parts have now been added, so set the size both internally and in the preview window.\n\t\t\t\tsetInternalVideoBufferSizes(\n\t\t\t\t\tvideoElement.videoWidth,\n\t\t\t\t\tvideoElement.videoHeight\n\t\t\t\t);\n\t\t\t\tsetVideoViewerSize(params.videoViewerWidth, params.videoViewerHeight);\n\n\t\t\t\tvideoContainerElement.appendChild(videoElementCanvas);\n\t\t\t\tvideoContainerElement.appendChild(faceOverlay);\n\t\t\t\tvideoContainerElement.appendChild(faceFeedbackBox);\n\t\t\t\tdocument.body.appendChild(gazeDot);\n\n\t\t\t\t// Run this only once, so remove the event listener\n\t\t\t\te.target.removeEventListener(e.type, setupPreviewVideo);\n\n\t\t\t\t// Draw face overlay\n\t\t\t\tif (params.showFaceOverlay) {\n\t\t\t\t\t// Get tracker object\n\t\t\t\t\tconst tracker = getTracker();\n\t\t\t\t\tconst ctx = faceOverlay.getContext(\"2d\", {\n\t\t\t\t\t\twillReadFrequently: true,\n\t\t\t\t\t});\n\t\t\t\t\tif (!ctx) return;\n\t\t\t\t\tctx.clearRect(\n\t\t\t\t\t\t0,\n\t\t\t\t\t\t0,\n\t\t\t\t\t\tvideoElement.videoWidth,\n\t\t\t\t\t\tvideoElement.videoHeight\n\t\t\t\t\t);\n\t\t\t\t\tconst positions =\n\t\t\t\t\t\t/** @type {import('@tensorflow-models/face-landmarks-detection/dist/mediapipe-facemesh/util').Coords3D} */ (\n\t\t\t\t\t\t\ttracker.getPositions()\n\t\t\t\t\t\t);\n\n\t\t\t\t\ttracker.drawFaceOverlay(ctx, positions);\n\t\t\t\t}\n\n\t\t\t\tresolve();\n\t\t\t}\n\t\t\tvideoElement.addEventListener(\"loadeddata\", setupPreviewVideo);\n\t\t})\n\t);\n\n\taddMouseEventListeners();\n\n\t// BEGIN CALLBACK LOOP\n\tpaused = false;\n\tclockStart = performance.now();\n\tawait videoPreviewSetup;\n\tawait loop();\n};\n\n/**\n * Initializes navigator.mediaDevices.getUserMedia\n * depending on the browser capabilities\n *\n * @return Promise\n */\nconst setUserMediaVariable = () => {\n\tif (navigator.mediaDevices === undefined) {\n\t\tObject.assign(navigator.mediaDevices, {});\n\t}\n\n\tif (navigator.mediaDevices.getUserMedia === undefined) {\n\t\tnavigator.mediaDevices.getUserMedia = async function (constraints) {\n\t\t\t// gets the alternative old getUserMedia is possible\n\t\t\tconst getUserMedia =\n\t\t\t\t// @ts-ignore\n\t\t\t\tnavigator.webkitGetUserMedia || navigator.mozGetUserMedia;\n\n\t\t\t// set an error message if browser doesn't support getUserMedia\n\t\t\tif (!getUserMedia) {\n\t\t\t\treturn Promise.reject(\n\t\t\t\t\tnew Error(\n\t\t\t\t\t\t\"Unfortunately, your browser does not support access to the webcam through the getUserMedia API. Try to use the latest version of Google Chrome, Mozilla Firefox, Opera, or Microsoft Edge instead.\"\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\t}\n\n\t\t\t// uses navigator.getUserMedia for older browsers\n\t\t\treturn new Promise(function (resolve, reject) {\n\t\t\t\tgetUserMedia.call(navigator, constraints, resolve, reject);\n\t\t\t});\n\t\t};\n\t}\n};\n\n// PUBLIC FUNCTIONS - CONTROL\n\n/**\n * Starts all state related to webgazer -> dataLoop, video collection, click listener\n * If starting fails, call `onFail` param function.\n * @param {() => void} onFail - Callback to call in case it is impossible to find user camera\n * @returns {*}\n */\nexport const begin = (onFail) => {\n\tif (\n\t\twindow.location.protocol !== \"https:\" &&\n\t\twindow.location.hostname !== \"localhost\" &&\n\t\t/** @type {any} */ (window).chrome\n\t) {\n\t\talert(\n\t\t\t\"WebGazer works only over https. If you are doing local development, you need to run a local server.\"\n\t\t);\n\t}\n\n\t// Load model data stored in localforage.\n\tif (params.saveDataAcrossSessions) loadGlobalData();\n\n\tonFail = onFail || (() => console.log(\"No stream\"));\n\n\t// debugVideoLoc is a static video file used instead of webcam video\n\tif (debugVideoLoc) {\n\t\tinit(debugVideoLoc);\n\t\treturn;\n\t}\n\n\t/// ////////////////////\n\t// SETUP VIDEO ELEMENTS\n\t// Sets .mediaDevices.getUserMedia depending on browser\n\tsetUserMediaVariable();\n\n\t// Request webcam access under specific constraints\n\t// WAIT for access\n\treturn navigator.mediaDevices\n\t\t.getUserMedia(params.camConstraints)\n\t\t.then(init)\n\t\t.catch(onFail);\n};\n\n/**\n * Checks if webgazer has finished initializing after calling begin()\n * [20180729 JT] This seems like a bad idea for how this function should be implemented.\n * @returns {boolean} if webgazer is ready\n */\nexport const isReady = () => {\n\tif (!videoElementCanvas) return false;\n\treturn videoElementCanvas.width > 0;\n};\n\n/**\n * Stops collection of data and predictions\n * @return {void}\n */\nexport const pause = () => {\n\tpaused = true;\n};\n\n/**\n * Resumes collection of data and predictions if paused\n * @return {Promise<void>}\n */\nexport const resume = async () => {\n\tif (!paused) return;\n\tpaused = false;\n\tawait loop();\n};\n\n/**\n * stops collection of data and removes dom modifications, must call begin() to reset up\n * @return {void}\n */\nexport const end = () => {\n\t// loop may run an extra time and fail due to removed elements\n\tpaused = true;\n\n\tif (videoStream) {\n\t\tstopVideo(); // uncomment if you want to stop the video from streaming\n\t}\n\n\t// remove video element and canvas\n\tif (videoContainerElement) {\n\t\tvideoContainerElement.remove();\n\t}\n\n\tif (gazeDot) {\n\t\tgazeDot.remove();\n\t}\n};\n\n/**\n * Stops the video camera from streaming and removes the video outlines\n * @return {void}\n */\nexport const stopVideo = () => {\n\t// Stops the video from streaming\n\tvideoStream.getTracks()[0].stop();\n\n\t// Removes the outline of the face\n\tvideoContainerElement.removeChild(faceOverlay);\n\n\t// Removes the box around the face\n\tvideoContainerElement.removeChild(faceFeedbackBox);\n};\n\n// PUBLIC FUNCTIONS - DEBUG\n\n/**\n * Returns if the browser is compatible with webgazer\n * @return {boolean} if browser is compatible\n */\nexport const detectCompatibility = () => {\n\tconst getUserMedia =\n\t\tnavigator.mediaDevices.getUserMedia ||\n\t\t// @ts-ignore\n\t\tnavigator.getUserMedia ||\n\t\t// @ts-ignore\n\t\tnavigator.webkitGetUserMedia ||\n\t\t// @ts-ignore\n\t\tnavigator.mozGetUserMedia;\n\n\treturn getUserMedia !== undefined;\n};\n\n/**\n * Set whether to show any of the video previews (camera, face overlay, feedback box).\n * If true: visibility depends on corresponding params (default all true).\n * If false: camera, face overlay, feedback box are all hidden\n * @param {boolean} val\n * @return {void}\n */\nexport const showVideoPreview = (val) => {\n\tparams.showVideoPreview = val;\n\tshowVideo(val && params.showVideo);\n\tshowFaceOverlay(val && params.showFaceOverlay);\n\tshowFaceFeedbackBox(val && params.showFaceFeedbackBox);\n};\n\n/**\n * hides a video element (videoElement or videoContainerElement)\n * uses display = 'none' for all browsers except Safari, which uses opacity = '1'\n * because Safari optimizes out video element if display = 'none'\n * @param {HTMLElement} val\n * @return {void}\n */\nexport const hideVideoElement = (val) => {\n\tif (\n\t\t(navigator.vendor && navigator.vendor.indexOf(\"Apple\") > -1) ||\n\t\t(navigator.userAgent && navigator.userAgent.search(\"Firefox\") > -1)\n\t) {\n\t\tval.style.opacity = params.showVideo ? \"1\" : \"0\";\n\t\tval.style.display = \"block\";\n\t} else {\n\t\tval.style.display = params.showVideo ? \"block\" : \"none\";\n\t}\n};\n\n/**\n * Set whether the camera video preview is visible or not (default true).\n * @param {boolean} bool\n * @return {void}\n */\nexport const showVideo = (bool) => {\n\tparams.showVideo = bool;\n\tif (videoElement) {\n\t\thideVideoElement(videoElement);\n\t}\n\tif (videoContainerElement) {\n\t\thideVideoElement(videoContainerElement);\n\t}\n};\n\n/**\n * Set whether the face overlay is visible or not (default true).\n * @param {boolean} bool\n * @return {void}\n */\nexport const showFaceOverlay = (bool) => {\n\tparams.showFaceOverlay = bool;\n\tif (faceOverlay) faceOverlay.style.display = bool ? \"block\" : \"none\";\n};\n\n/**\n * Set whether the face feedback box is visible or not (default true).\n * @param {boolean} bool\n * @return {void}\n */\nexport const showFaceFeedbackBox = (bool) => {\n\tparams.showFaceFeedbackBox = bool;\n\tif (faceFeedbackBox) faceFeedbackBox.style.display = bool ? \"block\" : \"none\";\n};\n\n/**\n * Set whether the gaze prediction point(s) are visible or not.\n * Multiple because of a trail of past dots. Default true\n * @param {boolean} showGazeDot\n */\nexport const showPredictionPoints = (showGazeDot) => {\n\tparams.showGazeDot = showGazeDot;\n\tif (gazeDot) {\n\t\tgazeDot.style.display = showGazeDot ? \"block\" : \"none\";\n\t}\n};\n\n/**\n * Set whether the gaze prediction point(s) are visible or not.\n * Multiple because of a trail of past dots. Default true\n * @param {boolean} showPoints\n */\nexport const toggleShowStoredPoints = (showPoints) => {\n\tparams.showStoredPoints = showPoints;\n};\n\n/**\n * Sets store_points to true, so all the occuring prediction\n * points are stored\n */\nexport const startStoringPoints = () => {\n\tparams.storingPoints = true;\n};\n\n/**\n * Sets store_points to false, so prediction points aren't\n * stored any more\n */\nexport const stopStoringPoints = () => {\n\tparams.storingPoints = false;\n\n\tif (params.showStoredPoints) {\n\t\tconst canvas = /** @type {HTMLCanvasElement | null} */ (\n\t\t\tdocument.getElementById(\"plotting_canvas\")\n\t\t);\n\n\t\tif (canvas) {\n\t\t\tconst ctx = canvas.getContext(\"2d\", {\n\t\t\t\twillReadFrequently: true,\n\t\t\t});\n\t\t\tif (ctx) {\n\t\t\t\tctx.clearRect(0, 0, canvas.width, canvas.height);\n\t\t\t}\n\t\t}\n\t}\n};\n\n/**\n * Set the color of the gaze prediction point(s). Default is red.\n * @param {string} color\n * @return {void}\n * @example\n * webgazer.setGazeDotColor('blue');\n * webgazer.setGazeDotColor('rgb(0, 0, 255)');\n */\nexport const setGazeDotColor = (color) => {\n\tparams.gazeDotColor = color;\n\tif (gazeDot) {\n\t\tgazeDot.style.background = color;\n\t}\n};\n\n/**\n * Set the opacity of the gaze prediction point(s). Default is 0.5.\n * @param {string} color\n * @return {void}\n */\nexport const setStoredDotColor = (color) => {\n\tparams.storedDotColor = color;\n};\n\n/**\n * Set whether previous calibration data (from localforage) should be loaded.\n * Default true.\n *\n * NOTE: Should be called before webgazer.begin() -- see www/js/main.js for example\n *\n * @param {boolean} val\n */\nexport const saveDataAcrossSessions = (val) => {\n\tparams.saveDataAcrossSessions = val;\n};\n\n/**\n * Set whether a Kalman filter will be applied to gaze predictions (default true);\n * @param {boolean} val\n */\nexport const applyKalmanFilter = (val) => {\n\tparams.applyKalmanFilter = val;\n};\n\n/**\n * Define constraints on the video camera that is used. Useful for non-standard setups.\n * This can be set before calling webgazer.begin(), but also mid stream.\n *\n * @param {import('./params.mjs').CamConstraints} constraints Example constraints object:\n * { width: { min: 320, ideal: 1280, max: 1920 }, height: { min: 240, ideal: 720, max: 1080 }, facingMode: \"user\" };\n *\n * Follows definition here:\n * https://developer.mozilla.org/en-US/docs/Web/API/Media_Streams_API/Constraints\n *\n * Note: The constraints set here are applied to the video track only. They also _replace_ any constraints, so be sure to set everything you need.\n * Warning: Setting a large video resolution will decrease performance, and may require\n */\nexport const setCameraConstraints = async (constraints) => {\n\t/** @type {MediaStreamTrack | undefined} */\n\tlet videoTrack;\n\t/** @type {MediaTrackSettings | undefined} */\n\tlet videoSettings;\n\tparams.camConstraints = constraints;\n\n\t// If the camera stream is already up...\n\tif (videoStream) {\n\t\tpause();\n\t\tvideoTrack = videoStream.getVideoTracks()[0];\n\t\ttry {\n\t\t\tawait videoTrack.applyConstraints(params.camConstraints.video);\n\t\t\tvideoSettings = videoTrack.getSettings();\n\t\t\tsetInternalVideoBufferSizes(\n\t\t\t\tvideoSettings.width || 0,\n\t\t\t\tvideoSettings.height || 0\n\t\t\t);\n\t\t} catch (err) {\n\t\t\tconsole.log(err);\n\t\t\treturn;\n\t\t}\n\t\t// Reset and recompute sizes of the video viewer.\n\t\t// This is only to adjust the feedback box, say, if the aspect ratio of the video has changed.\n\t\tsetVideoViewerSize(params.videoViewerWidth, params.videoViewerHeight);\n\t\tgetTracker().reset();\n\t\tawait resume();\n\t}\n};\n\n/**\n * Does what it says on the tin.\n * @param {number} width\n * @param {number} height\n */\nfunction setInternalVideoBufferSizes(width, height) {\n\t// Re-set the canvas size used by the internal processes\n\tif (videoElementCanvas) {\n\t\tvideoElementCanvas.width = width;\n\t\tvideoElementCanvas.height = height;\n\t}\n\n\t// Re-set the face overlay canvas size\n\tif (faceOverlay) {\n\t\tfaceOverlay.width = width;\n\t\tfaceOverlay.height = height;\n\t}\n}\n\n/**\n *  Set a static video file to be used instead of webcam video\n *  @param {MediaStream} videoLoc - video file location\n */\nexport const setStaticVideo = (videoLoc) => {\n\tdebugVideoLoc = videoLoc;\n};\n\n/**\n * Set the size of the video viewer\n * @param {number} w width\n * @param {number} h height\n */\nexport const setVideoViewerSize = (w, h) => {\n\tparams.videoViewerWidth = w;\n\tparams.videoViewerHeight = h;\n\n\t// Change the video viewer\n\tvideoElement.style.width = w + \"px\";\n\tvideoElement.style.height = h + \"px\";\n\n\t// Change video container\n\tvideoContainerElement.style.width = w + \"px\";\n\tvideoContainerElement.style.height = h + \"px\";\n\n\t// Change the face overlay\n\tfaceOverlay.style.width = w + \"px\";\n\tfaceOverlay.style.height = h + \"px\";\n\n\t// Change the feedback box size\n\t// Compute the boundaries of the face overlay validation box based on the video size\n\tconst tlwh = computeValidationBoxSize();\n\t// Assign them to the object\n\tfaceFeedbackBox.style.top = tlwh[0] + \"px\";\n\tfaceFeedbackBox.style.left = tlwh[1] + \"px\";\n\tfaceFeedbackBox.style.width = tlwh[2] + \"px\";\n\tfaceFeedbackBox.style.height = tlwh[3] + \"px\";\n};\n\n/**\n * Stores the position of the fifty most recent tracker preditions\n * @param {number} x - The x screen position\n * @param {number} y - The y screen position\n * @param {string} predictedTimestamp - The timestamp of the prediction\n * @param {number} k - The index of the prediction\n * @return {void}\n **/\nexport const storePoints = function (x, y, predictedTimestamp, k) {\n\txPast50[k] = x;\n\tyPast50[k] = y;\n\tpast50PredictedTimestamp[k] = predictedTimestamp;\n};\n\n// SETTERS\n/**\n * Sets the tracking module\n * @param {string} name - The name of the tracking module to use\n */\nexport const setTracker = (name) => {\n\tif (curTrackerMap[name] === undefined) {\n\t\tconsole.log(\"Invalid tracker selection\");\n\t\tconsole.log(\"Options are: \");\n\t\tfor (const t in curTrackerMap) {\n\t\t\tconsole.log(t);\n\t\t}\n\t} else {\n\t\tcurTracker = curTrackerMap[name]();\n\t}\n};\n\n/**\n * Sets the regression module and clears any other regression modules\n * @param {string} name - The name of the regression module to use\n */\nexport const setRegression = (name) => {\n\tif (regressionMap[name] === undefined) {\n\t\tconsole.log(\"Invalid regression selection\");\n\t\tconsole.log(\"Options are: \");\n\t\tfor (const reg in regressionMap) {\n\t\t\tconsole.log(reg);\n\t\t}\n\t} else {\n\t\tdata = regs[0].getData();\n\t\tregs = [regressionMap[name]()];\n\t\tregs[0].setData(data);\n\t}\n};\n\n/**\n * Adds a new tracker module so that it can be used by setTracker()\n * @param {string} name - the new name of the tracker\n * @param {() => void} constructor - the constructor of the curTracker object\n */\nexport const addTrackerModule = (name, constructor) => {\n\tcurTrackerMap[name] = function () {\n\t\treturn new constructor();\n\t};\n};\n\n/**\n * Adds a new regression module so that it can be used by setRegression() and addRegression()\n * @param {string} name - the new name of the regression\n * @param {() => void} constructor - the constructor of the regression object\n */\nexport const addRegressionModule = (name, constructor) => {\n\tregressionMap[name] = function () {\n\t\treturn new constructor();\n\t};\n};\n\n/**\n * Adds a new regression module to the list of regression modules, seeding its data from the first regression module\n * @param {string} name - the string name of the regression module to add\n */\nexport const addRegression = (name) => {\n\tconst newReg = regressionMap[name]();\n\tdata = regs[0].getData();\n\tnewReg.setData(data);\n\tregs.push(newReg);\n};\n\n/**\n * Sets a callback to be executed on every gaze event (currently all time steps)\n * @param {(data: PredictionResult | undefined, elapsedTime: number) => void} listener - The callback function to call (it must be like function(data, elapsedTime))\n */\nexport const setGazeListener = (listener) => {\n\tgazeListener = listener;\n};\n\n/**\n * Removes the callback set by setGazeListener\n */\nexport const clearGazeListener = () => {\n\tgazeListener = nopCallback;\n};\n\n/**\n * Set the video element canvas; useful if you want to run WebGazer on your own canvas (e.g., on any random image).\n * @param {HTMLCanvasElement} canvas\n * @return {HTMLCanvasElement} The current video element canvas\n */\nexport const setVideoElementCanvas = (canvas) => {\n\tvideoElementCanvas = canvas;\n\treturn videoElementCanvas;\n};\n\n// GETTERS\n/**\n * Returns the tracker currently in use\n * @return {TFFaceMesh} an object following the tracker interface\n */\nexport const getTracker = () => {\n\treturn curTracker;\n};\n\n/**\n * Returns the regression currently in use\n * @return {(RidgeReg | RidgeWeightedReg | RidgeRegThreaded)[]} an array of regression objects following the regression interface\n */\nexport const getRegression = () => {\n\treturn regs;\n};\n\n/**\n * Requests an immediate prediction\n * @return {object} prediction data object\n */\nexport const getCurrentPrediction = (regIndex) => {\n\treturn getPrediction(regIndex);\n};\n\n/**\n * returns the different event types that may be passed to regressions when calling regression.addData()\n * @return {typeof eventTypes} array of strings where each string is an event type\n */\nexport const getEventTypes = () => [...eventTypes];\n\n/**\n * Get the video element canvas that WebGazer uses internally on which to run its face tracker.\n * @return The current video element canvas\n */\nexport const getVideoElementCanvas = () => {\n\treturn videoElementCanvas;\n};\n\n/**\n * @return array [a,b] where a is width ratio and b is height ratio\n */\nexport const getVideoPreviewToCameraResolutionRatio = function () {\n\treturn [\n\t\tparams.videoViewerWidth / videoElement.videoWidth,\n\t\tparams.videoViewerHeight / videoElement.videoHeight,\n\t];\n};\n\n/**\n * Gets the fifty most recent tracker predictions\n * @return {[number[], number[]]}\n **/\nexport const getStoredPoints = () => {\n\treturn [xPast50, yPast50];\n};\n\n/**\n * Gets the fifty most recent tracker predictions\n * @return {[number[], number[], string[]]}\n **/\nexport const getStoredPointsWithTimestamp = () => {\n\treturn [xPast50, yPast50, past50PredictedTimestamp];\n};\n\nexport { params };\n"],"names":["EPSILON_FLOAT32","EPSILON_FLOAT16","DataStorage","backend","dataMover","dataId","value","KernelBackend","notYetImplemented","f","options","force","values","shape","dtype","refCount","kernelName","shuffle","array","counter","index","swap","clamp","min","x","max","nearestLargerEven","val","object","left","right","temp","sum","arr","i","assert","expr","msg","assertShapesMatch","shapeA","shapeB","errorMessagePrefix","arraysEqual","assertNonNull","a","flatten","result","skipTypedArray","isTypedArray","sizeFromShape","size","n1","n2","isInt","sizeToSquarishShape","width","rightPad","repeatedTry","checkFn","delayFn","maxCounter","scheduleFn","resolve","reject","tryCount","tryFn","nextBackoff","inferFromImplicitShape","shapeProd","implicitIdx","newShape","parseAxisParam","axis","rank","ax","squeezeShape","keptDims","isEmptyArray","axes","j","getTypedArrayFromDType","getArrayFromDType","checkConversionForErrors","vals","num","isValidDtype","hasEncodingLoss","oldType","newType","bytesPerElement","bytesFromStringArray","bytes","isString","isBoolean","isNumber","inferDtype","isFunction","nearestDivisor","start","computeStrides","strides","createNestedArray","offset","isComplex","ret","d","rest","len","acc","toNestedArray","c","makeOnesTypedArray","makeZerosTypedArray","makeZerosNestedTypedArray","prev","curr","assertNonNegativeIntegerDimensions","dimSize","locToIndex","locs","indexToLoc","isPromise","TENSORFLOWJS_FLAGS_PREFIX","Environment","global","getQueryParams","platformName","platform","env","flagName","evaluationFn","setHook","flagValue","flags","urlParams","keyValue","key","parseValue","queryString","params","s","t","decodeParam","name","ENV","setEnvironmentGlobal","environment","globalNameSpace","getGlobalNamespace","ns","getGlobalMap","getGlobal","init","globalMap","singleton","Abs","Acos","Acosh","Add","AddN","All","Any","ArgMax","ArgMin","Asin","Asinh","Atan","Atanh","Atan2","AvgPool","AvgPoolGrad","AvgPool3D","AvgPool3DGrad","BatchMatMul","BatchToSpaceND","Bincount","BroadcastTo","BroadcastArgs","Cast","Ceil","ClipByValue","Complex","ComplexAbs","Concat","Conv2D","Conv2DBackpropFilter","Conv2DBackpropInput","Conv3D","Conv3DBackpropFilterV2","Conv3DBackpropInputV2","Cos","Cosh","Cumprod","Cumsum","CropAndResize","DenseBincount","DepthToSpace","DepthwiseConv2dNative","DepthwiseConv2dNativeBackpropFilter","DepthwiseConv2dNativeBackpropInput","Diag","Dilation2D","Dilation2DBackpropInput","Dilation2DBackpropFilter","RealDiv","Einsum","Elu","EluGrad","Erf","Equal","Exp","ExpandDims","Expm1","FFT","Fill","FlipLeftRight","Floor","FloorDiv","FusedBatchNorm","GatherV2","GatherNd","Greater","GreaterEqual","Identity","IFFT","Imag","IsFinite","IsInf","IsNan","LeakyRelu","Less","LessEqual","LinSpace","Log","Log1p","LogicalAnd","LogicalNot","LogicalOr","LogSoftmax","LRN","LRNGrad","Max","Maximum","MaxPool","MaxPoolGrad","MaxPool3D","MaxPool3DGrad","MaxPoolWithArgmax","Mean","Min","Minimum","MirrorPad","Mod","Multinomial","Multiply","Neg","NotEqual","NonMaxSuppressionV3","NonMaxSuppressionV4","NonMaxSuppressionV5","OnesLike","OneHot","Pack","PadV2","Pow","Prelu","Prod","RaggedGather","RaggedTensorToTensor","Range","Real","Reciprocal","Relu","Reshape","ResizeNearestNeighbor","ResizeNearestNeighborGrad","ResizeBilinear","ResizeBilinearGrad","Relu6","Reverse","Round","Rsqrt","ScatterNd","SearchSorted","Select","Selu","Slice","Sin","Sinh","Sign","Sigmoid","Softplus","Sqrt","Sum","SpaceToBatchND","SplitV","Softmax","SparseFillEmptyRows","SparseReshape","SparseSegmentMean","SparseSegmentSum","SparseToDense","SquaredDifference","Square","StridedSlice","StringNGrams","StringSplit","StringToHashBucketFast","Sub","Tan","Tanh","Tile","TopK","Transform","Transpose","Unique","Unpack","UnsortedSegmentSum","ZerosLike","Step","FromPixels","RotateWithOffset","_FusedMatMul","FusedConv2D","FusedDepthwiseConv2D","warn","log","kernelRegistry","gradRegistry","getKernel","backendName","makeKey","getGradient","getKernelsForBackend","it","done","config","registerKernel","log.warn","registerGradient","long","Long","wasm","low","high","unsigned","isLong","obj","INT_CACHE","UINT_CACHE","fromInt","cachedObj","cache","fromBits","fromNumber","UZERO","ZERO","TWO_PWR_64_DBL","MAX_UNSIGNED_VALUE","TWO_PWR_63_DBL","MIN_VALUE","MAX_VALUE","TWO_PWR_32_DBL","lowBits","highBits","pow_dbl","fromString","str","radix","p","radixToPower","power","fromValue","TWO_PWR_16_DBL","TWO_PWR_24_DBL","TWO_PWR_24","ONE","UONE","NEG_ONE","LongPrototype","radixLong","div","rem1","rem","remDiv","intval","digits","bit","other","thisNeg","otherNeg","addend","a48","a32","a16","a00","b48","b32","b16","b00","c48","c32","c16","c00","subtrahend","multiplier","divisor","approx","res","halfThis","log2","delta","approxRes","approxRem","numBits","le","hi","lo","Long$1","long$1","LongExports","hexToLong","hex","k0","k1","k2","shiftMix","fetch","numBytes","fetch64","fetch32","rotate64","shift","hashLen16","u","v","mul","b","weakHashLen32WithSeeds","w","y","z","weakHashLen32WithSeedsStr","hashLen0to16","hashLen17to32","hashLen33to64","e","g","h","fingerPrint64","seed","end","last64","createScalarValue","encodeString","toTypedArray","noConversionNeeded","base.flatten","base.checkConversionForErrors","bool","now","encoding","decodeString","Profiler","backendTimer","logger","Logger","inputs","outputs","holdResultWrapperFn","timer","util.now","output","tensorVals","checkComputationForErrors","timing","kernelProfile","timeMs","extraInfo","valueContainer","time","util.rightPad","paddedName","inputShapesDescription","input","inputShape","inputRank","getFilteredNodesXToY","tape","xs","tensorsFromX","nodesFromX","node","nodeInputs","inputName","anyInputFromX","tensorsLeadToY","nodesToY","filteredTape","prunedInputs","nodeInput","prunedNode","backpropagateGradients","tensorAccumulatedGradientMap","tidy","add","dys","o","gradTensor","inputGradients","dx","util.arraysEqual","curGradient","FORMAT_LIMIT_NUM_VALS","FORMAT_NUM_FIRST_LAST_VALS","FORMAT_NUM_SIG_DIGITS","tensorToString","verbose","padPerCol","computeMaxSizePerColumn","valsLines","subTensorToString","lines","l","n","numCols","valuesOrTuples","createComplexTuples","row","valToString","pad","valStr","boolNumToString","isLast","storagePerElement","complexTuple","firstValsSize","firstVals","lastVals","subshape","substrides","stride","sep","newLineSep","complexTuples","TensorBuffer","util.sizeFromShape","util.assert","util.getArrayFromDType","loc","trackerFn","opHandler","setTensorTracker","fn","setOpHandler","handler","Tensor","id","data","util.decodeString","trainable","instance","getGlobalTensorClass","Variable","initialValue","tensorId","newValue","Rank","UpcastInt32AndMap","UpcastBoolAndMap","UpcastFloat32AndMap","UpcastComplex64AndMap","upcastTypeMap","upcastType","typeA","typeB","sumOutType","type","makeTypesMatch","assertTypesMatch","getTensorsInContainer","list","walkTensorContainer","container","seen","isIterable","iterable","k","isRegisteredKernelInvocation","kernelInvocation","EngineState","variableName","Engine","sortedBackends","asyncInit","factory","priority","success","kernel","registryFactoryEntry","promiseId","backendInstance","err","info","srcBackend","nameOrFn","ex","ENGINE","grad","dy","gradInputs","attrs","saved","numDataIdsBefore","outInfos","numDataIdsAfter","numOutputDataIds","numMoves","dataIdsLeaked","kernelParams","isTapeOn","startingBytecount","startingNumTensors","kernelFunc","out","kernelOrScopeName","outTensors","outInfo","tensorsToSave","forwardFunc","saveFunc","tensors","tensor","outs","backwardsFunc","item","gradConfig","inputsToSave","outputsToSave","inputTensorsToSave","outputTensorsToSave","_","backendVals","util.isString","util.encodeString","newBytes","tensorInfo","util.bytesPerElement","varName","query","startBytes","startNumTensors","gradientsFunc","tapeNode","util.makeZerosTypedArray","scopeInfo","tensorsToTrackInParent","tensorsToTrackInParentSet","oldScope","allowNoGradients","accumulatedGradientMap","ones","grads","util.isFunction","inputMap","save","gradRes","gradMap","timingInfo","getOrMakeEngine","_isNavigatorDefined","isMobile","nav","navAny","isBrowser","ENV$3","debugValue","device_util.isBrowser","inferShape","firstElem","deepAssertShapeConsistency","indices","subShape","assertDtype","expectedDtype","actualDType","argName","functionName","convertToTensor","parseAsDtype","inferredDtype","inferredShape","convertToTensorArray","arg","OP_SCOPE_SUFFIX","op","keys","opName","f2","args","complex_","real","imag","$real","$imag","util.assertShapesMatch","complex","makeTensor","providedSize","inferredSize","inferred","flatDimsDontMatch","DTYPE_VALUE_SIZE_MAP","NUM_BYTES_STRING_LENGTH","encodeWeights","group","specs","dataPromises","names","spec","utf8bytes","totalNumBytes","bytesOfLength","tensorValues","concatenateTypedArrays","decodeWeights","buffer","float16Decode","quantization","quantizationSizeFactor","byteBuffer","quantizedArray","getFloat16Decoder","byteLength","dtypeFactor","image","realTensor","imageTensor","totalByteLength","normalizedXs","useNodeBuffer","stringByteLength","arrayBufferToBase64String","buf","base64StringToArrayBuffer","concatenateArrayBuffers","buffers","basename","path","SEPARATOR","items","getModelJSONForModelArtifacts","artifacts","manifest","getModelArtifactsForJSONSync","modelJSON","weightSpecs","weightData","modelArtifacts","getModelArtifactsForJSON","loadWeights","getModelArtifactsInfoForJSON","getWeightSpecs","weightsManifest","entry","computeFloat16MantisaTable","convertMantissa","m","mantisaTable","computeFloat16ExponentTable","exponentTable","computeFloat16OffsetTable","offsetTable","bufferUint32View","float16Bits","float32Bits","IORouterRegistry","saveRouter","loadRouter","url","loadOptions","handlerType","validHandlers","router","registerSaveRouter","loudRouter","registerLoadRouter","getSaveHandlers","getLoadHandlers","DATABASE_NAME","DATABASE_VERSION","MODEL_STORE_NAME","INFO_STORE_NAME","getIndexedDBFactory","theWindow","setUpDatabase","openRequest","db","BrowserIndexedDB","modelPath","modelTx","getRequest","error","modelArtifactsInfo","infoTx","infoStore","putInfoRequest","putModelRequest","deleteInfoRequest","indexedDBRouter","browserIndexedDB","maybeStripScheme","BrowserIndexedDBManager","tx","getAllInfoRequest","getInfoRequest","deleteModelData","deleteModelRequest","PATH_SEPARATOR","PATH_PREFIX","INFO_SUFFIX","MODEL_TOPOLOGY_SUFFIX","WEIGHT_SPECS_SUFFIX","WEIGHT_DATA_SUFFIX","MODEL_METADATA_SUFFIX","getModelKeys","removeItems","getModelPathFromKey","BrowserLocalStorage","topology","metadata","metadataString","weightDataBase64","localStorageRouter","browserLocalStorage","BrowserLocalStorageManager","prefix","suffix","URL_SCHEME_SUFFIX","ModelStoreManagerRegistry","scheme","manager","registry","parseURL","cloneModelInternal","sourceURL","destURL","deleteSource","loadHandlers","loadHandler","saveHandlers","saveHandler","sourceScheme","sourcePath","sameMedium","saveResult","listModels","schemes","schemeOut","removeModel","schemeAndPath","copyModel","moveModel","PlatformBrowser","text","functionRef","delay","event","getNodeFetch","systemFetch","PlatformNode","requestInits","util.assertNonNegativeIntegerDimensions","cast_","$x","util.isValidDtype","cast","clone_","clone","print","DEFAULT_FILE_NAME_PREFIX","DEFAULT_JSON_EXTENSION_NAME","DEFAULT_WEIGHT_DATA_EXTENSION_NAME","defer","BrowserDownloads","fileNamePrefix","weightsURL","modelJsonURL","jsonAnchor","weightDataAnchor","BrowserFiles","files","jsonReader","modelTopology","modelArtifactsPromise","paths","pathToFile","promises","file","weightFileReader","basenames","fileNames","pathBasename","browserDownloadsRouter","browserDownloads","browserFiles","monitorPromisesProgress","onProgress","startFraction","endFraction","checkPromises","checkFraction","resolvedPromise","registerMonitor","promise","fraction","loadWeightsAsArrayBuffer","fetchURLs","fetchFunc","requests","fetchURL","bufferPromises","response","filePathPrefix","weightNames","requestInit","weightsLoaderFactory","fetchUrls","fetchWeightsFunction","groupIndicesToFetchMap","groupWeightsToFetch","weightsFound","allManifestWeightNames","manifestGroupConfig","groupIndex","groupOffset","weightsEntry","rawDtype","weightsBytes","enqueueWeightsForFetchingFn","weightName","weightIndex","found","weightsNotFound","groupIndicesToFetch","accumulator","shouldFetch","filepath","fetchUrl","weightsTensorMap","bufferIndexOffset","numBuffers","groupBytes","groupBuffer","groupByteBuffer","groupBufferOffset","nameToTensorMap","OCTET_STREAM_MIME_TYPE","JSON_TYPE","HTTPRequest","modelTopologyAndWeightManifest","modelConfigRequest","message","weightPath","parseUrl","pathPrefix","urlPromises","weightsGroup","lastSlash","lastSearchParam","isHTTPScheme","httpRouter","isHTTP","urlItem","http","browserHTTPRequest","PassthroughLoader","PassthroughSaver","PassthroughAsync","fromMemory","trainingConfig","fromMemorySync","withSaveHandler","withSaveHandlerSync","matMul_","transposeA","transposeB","$a","$b","matMul","oneHot_","depth","onValue","offValue","oneHot","engine","memory","dispose","keep","getBackend","registerBackend","imag_","neg_","neg","real_","transpose_","perm","conjugate","transpose","getBroadcastDims","inShape","outShape","inRank","dims","dim","getReductionAxes","inDim","outAxis","outDim","assertAndGetBroadcastShape","errMsg","tensor3d","fromPixels2DContext","fromPixels_","pixels","numChannels","isPixelData","isImageData","isVideo","isImage","isCanvasLike","isImageBitmap","height","numPixels","channel","fromPixels","prepareAndValidate","tensorRank","indicesRank","indicesShape","sliceRank","nResult","resultShape","sliceSize","validateUpdateShape","updates","sliceDim","batchDim","shapeError","validateInput","calculateShapes","totalNd","safeSliceDim","numUpdates","outputSize","NEW_AXIS","SHRINK_AXIS","assertParamsValid","begin","maskToAxes","mask","computeOutShape","stridesWithElidedDims","ellipsisInsertionIndex","numElidedAxes","newStrides","unnormalizeAxis","normalizedAxis","getElidedAxes","elidedAxes","getNormalizedAxes","ellipsisAxes","numInterpolatedAxes","beginMask","endMask","ellipsisMask","normalizedBegin","normalizedEnd","normalizedStrides","fullIndex","startIndicesWithElidedDims","stopIndicesWithElidedDims","startForAxis","stopForAxis","stridesForAxis","originalBegin","newIndices","originalAxis","originalValue","originalEnd","axisSize","util.clamp","startIndices","stopIndices","stop","isSliceContinous","firstNonOneAxis","computeFlatOffset","flatOffset","parseSliceParams","begin_","xRank","size_","sliceInfo","xShape","newAxisMask","shrinkAxisMask","stridesNonNull","ellipsisSeen","sparseSpec","denseSpec","buildDenseSpec","isIdentity","sliceDim0","isSimpleSlice","processingShape","finalShape","shrinkI","dimI","masks","validRange","beginAndEndMasked","xFwd","canonical","takeAllInDimension","intervalLength","knownInterval","sizeI","denseDim","gatherIndex","sparse","dense","nextIndex","strideI","Serializable","cls","SerializationMap","registerClass","add_","floorDiv_","floorDiv","div_","mul_","abs_","abs","acos_","acos","acosh_","acosh","addN_","$tensors","firstTensor","addN","all_","keepDims","all","any_","any","argMax_","argMax","argMin_","argMin","asin_","asin","asinh_","asinh","atan_","atan","atan2_","atan2","atanh_","atanh","computeDilation2DInfo","filterShape","dataFormat","dilations","inputChannels","$filterShape","$dataFormat","convertConv2DDataFormat","computeConv2DInfo","computePool2DInfo","filterSize","roundingMode","filterHeight","filterWidth","parseTupleParam","computePool3DInfo","filterDepth","parse3TupleParam","computeConv3DInfo","depthwise","batchSize","inHeight","inWidth","inChannels","filterChannels","strideHeight","strideWidth","dilationHeight","dilationWidth","effectiveFilterHeight","getEffectiveFilterSize","effectiveFilterWidth","padInfo","outHeight","outWidth","getPadAndOutInfo","outChannels","inDepth","strideDepth","dilationDepth","effectiveFilterDepth","outDepth","get3DPadAndOutInfo","computeOutputShape2D","fieldSize","zeroPad","computeDefaultPad","inputRows","inputCols","outputRows","round","outputCols","computeOutputShape4D","inputDepth","outputDepths","dilation","effectiveFieldSize","param","padAlongHeight","padAlongWidth","top","bottom","padAlongDepth","front","back","tupleValuesAreOne","dimA","dimB","dimC","eitherStridesOrDilationsAreOne","checkPadOnDimRoundingMode","opDesc","dimRoundingMode","util.isInt","reshape_","reshape","avgPool_","conv_util.eitherStridesOrDilationsAreOne","x4D","reshapedTo4D","conv_util.checkPadOnDimRoundingMode","avgPool","avgPool3d_","x5D","reshapedTo5D","avgPool3d","concat_","attr","concat","sigmoid_","sigmoid","slice_","slice","tanh_","tanh","basicLSTMCell_","forgetBias","lstmKernel","lstmBias","$forgetBias","$lstmKernel","$lstmBias","$data","$c","$h","combined","weighted","sliceCols","newC","newH","basicLSTMCell","batchToSpaceND_","blockShape","crops","prod","batchToSpaceND","xAs4D","batchNorm_","mean","variance","scale","varianceEpsilon","$mean","$variance","$scale","$offset","batchNorm","batchNorm2d_","batchNorm2d","batchNorm3d_","batchNorm3d","batchNorm4d_","batchNorm4d","bincount_","weights","$weights","bincount","broadcastArgs_","s0","s1","shape1Input","shape2Input","broadcastArgs","broadcastTo_","reps","broadcastTo","ceil_","ceil","fill","clipByValue_","clipValueMin","clipValueMax","clipByValue","concat1d_","concat1d","concat2d_","concat2d","concat3d_","concat3d","concat4d_","concat4d","conv2d_","filter","$filter","conv2d","conv1d_","x3D","reshapedTo3D","filter4D","input4D","conv1d","conv2DBackpropInput_","xShape4D","dy4D","conv2DBackpropInput","conv2dTranspose_","outputShape","conv2dTranspose","conv3d_","conv3d","conv3DBackpropInput_","xShape5D","dy5D","conv3DBackpropInput","conv3dTranspose_","conv3dTranspose","cos_","cos","cosh_","cosh","cumprod_","exclusive","reverse","cumprod","cumsum_","cumsum","denseBincount_","binaryOutput","denseBincount","depthToSpace_","blockSize","inputHeight","inputWidth","depthToSpace","depthwiseConv2d_","depthwiseConv2d","diag_","diag","dilation2d_","dilation2d","equal_","equal","where_","condition","$condition","broadcastShape","$broadcastedCondition","$broadcastedA","$broadcastedB","where","zerosLike_","zerosLike","divNoNan_","divResult","zeros","bEqualsZero","divNoNan","dot_","t1","t2","$t1","$t2","t1Inner","t2Inner","t12D","t22D","t1t2","dot","einsum_","equation","einsum","elu_","elu","erf_","erf","axesAreInnerMostDims","combineLocations","outputLoc","reduceLoc","outIdx","reduceIdx","computeOutAndReduceShapes","aShape","reduceShape","expandShapeToKeepDim","reduceSubShape","assertAxesAreInnerMostDims","getAxesPermutation","getUndoAxesPermutation","getInnerMostAxes","numAxes","max_","min_","pow_","base","exp","$base","$exp","pow","scalar","sqrt_","sqrt","square_","square","sum_","norm_","ord","norm","normImpl","keepDimsShape","axis_util.expandShapeToKeepDim","euclideanNorm_","euclideanNorm","exp_","expandDims_","expandDims","expm1_","expm1","tile_","tile","eye_","numRows","numColumns","batchShape","buff","eye","floor_","floor","gather_","batchDims","$indices","gather","greater_","greater","greaterEqual_","greaterEqual","isFinite_","isFinite","isInf_","isInf","isNaN_","isNaN","leakyRelu_","alpha","leakyRelu","less_","less","lessEqual_","lessEqual","linspace","localResponseNormalization_","depthRadius","bias","beta","localResponseNormalization","log_","log1p_","log1p","variableGrads","varList","specifiedVarList","specifiedNonTrainable","variable","originalVarCount","namedGrads","customGrad","softplus_","softplus","logSigmoid_","logSigmoid","sub_","sub","logSoftmax_","logits","$logits","xMax","shifted","softmax","logSoftmax","logSumExp_","logSumExp","logicalAnd_","logicalAnd","logicalNot_","logicalNot","logicalOr_","logicalOr","logicalXor_","logicalXor","INT32_MAX","searchSorted_","sortedSequence","side","$sortedSequence","$values","sequenceSize","valuesSize","$sortedSequence2D","$values2D","searchSorted","lowerBound","maxPool_","maxPool","maxPool3d_","maxPool3d","maxPoolWithArgmax_","includeBatchInIndex","maxPoolWithArgmax","maximum_","maximum","mean_","meshgrid","indexing","$y","minimum_","minimum","mirrorPad_","paddings","mode","shapeOffset","mirrorPad","mod_","mod","moments_","xMean","devSquared","moments","multiRNNCell_","lstmCells","newStates","multiRNNCell","multinomial_","numSamples","normalized","numOutcomes","origRank","multinomial","notEqual_","notEqual","onesLike_","onesLike","outerProduct_","v1","v2","$v1","$v2","v12D","v22D","outerProduct","pad_","constantValue","pad1d_","pad1d","pad2d_","pad2d","pad3d_","pad3d","pad4d_","pad4d","spaceToBatchND_","spaceToBatchND","pool_","windowShape","poolingType","convInfo","conv_util.computePool2DInfo","basePadding","withSpaceToBatchBasePaddings","isDilationOne","adjustedPadding","adjustedCrops","requiredSpaceToBatchPaddings","convertedPad","convertedX","padStart","origPadEnd","fullInputShape","padEndExtra","padEnd","padExtraShape","padExtraStart","padExtraEnd","pool","prelu_","$alpha","prelu","prod_","raggedGather_","paramsNestedSplits","paramsDenseValues","outputRaggedRank","$paramsNestedSplits","$paramsDenseValues","raggedGather","raggedTensorToTensor_","defaultValue","rowPartitionTensors","rowPartitionTypes","$shape","$defaultValue","$rowPartitionTensors","raggedTensorToTensor","rand_","randFunction","rand","module","define","Alea","me","mash","Mash","copy","impl","opts","xg","state","prng","this","XorGen","strseed","bot","X","limit","math","chunks","rngname","startdenom","significance","overflow","nodecrypto","seedrandom","callback","shortseed","mixkey","tostring","autoseed","arc4","ARC4","is_math_call","keylen","count","r","typ","prop","stringseed","smear","browser","plugins","require$$0","alea","xor128","require$$1","xorwow","require$$2","xorshift7","require$$3","xor4096","require$$4","tychei","require$$5","sr","require$$6","MPRandGauss","stdDeviation","truncated","seedValue","seedrandom.alea","resultX","resultY","isValid","RandGamma","x2","v0","UniformRandom","randomGamma_","rgamma","randomGamma","randomNormal_","stdDev","randGauss","randomNormal","randomStandardNormal_","randomStandardNormal","randomUniform_","minval","maxval","random","randomUniform","range","step","reciprocal_","reciprocal","relu_","relu","relu6_","relu6","reverse_","reverse1d_","reverse1d","reverse2d_","reverse2d","reverse3d_","reverse3d","reverse4d_","reverse4d","round_","rsqrt_","rsqrt","selu_","selu","separableConv2d_","depthwiseFilter","pointwiseFilter","$depthwiseFilter","$pointwiseFilter","channelMultiplier","separableConv2d","setdiff1dAsync_","xVals","yVals","ySet","setdiff1dAsync","sign_","sign","sin_","sin","sinh_","sinh","slice1d_","slice1d","slice2d_","slice2d","slice3d_","slice3d","slice4d_","slice4d","softmax_","fft_","fft","ifft_","ifft","irfft_","innerDimensionSize","batch","complexInput","realInput","imagInput","realConjugate","imagConjugate","irfft","split_","numOrSizeSplits","split","rfft_","fftLength","adjustedInput","zerosShape","zerosInput","half","realValues","imagValues","realComplexConjugate","imagComplexConjugate","rfft","squaredDifference_","squaredDifference","squeeze_","squeeze","stack_","stack","step_","stridedSlice_","stridedSlice","tan_","tan","tensor1d","tensor2d","tensor4d","tensor5d","tensor6d","topk_","sorted","lastDim","topk","truncatedNormal_","truncatedNormal","unique_","unique","unsortedSegmentSum_","segmentIds","numSegments","$segmentIds","unsortedSegmentSum","unstack_","unstack","upperBound","whereImpl","condShape","condVals","inBuffer","whereAsync_","whereAsync","booleanMaskAsync_","$tensor","$mask","axisFrom","maskDim","tensorShape","leadingSize","targetTensorShape","reshapedTensor","reshapedMask","positivePositions","booleanMaskAsync","movingAverage_","decay","zeroDebias","$v","$decay","one","oneMinusDecay","update","$step","movingAverage","scatterND_","$updates","scatter_nd_util.validateInput","scatterND","sparseIndices","sparseValues","defaultValues","numElems","numDims","numValues","sparseToDense_","$sparseIndices","$sparseValues","sparse_to_dense.validateInput","sparseToDense","gatherND_","gatherND","getNoiseShape","noiseShape","newDimension","dropout_","rate","$noiseShape","keepProb","dropout","enclosingPowerOfTwo","cosineWindow","windowLength","even","newValues","cosArg","inTopKAsync_","predictions","targets","$predictions","$targets","predictionsVals","targetsVals","precision","valAndInd","inTopKAsync","conv2DBackpropFilter_","conv2DBackpropFilter","getFusedDyActivation","activation","getFusedBiasGradient","dyActivation","reduceAxes","broadcast_util.getReductionAxes","applyActivation","preluActivationWeights","leakyreluAlpha","shouldFuse","gradientDepth","fusedConv2d_","unfusedConv2d","conv_util.computeConv2DInfo","$bias","broadcast_util.assertAndGetBroadcastShape","$preluActivationWeights","alphaShape","conv_util.tupleValuesAreOne","xDer","filterDer","der","biasDer","depthwiseConv2dNativeBackpropFilter_","depthwiseConv2dNativeBackpropFilter","depthwiseConv2dNativeBackpropInput_","depthwiseConv2dNativeBackpropInput","fusedDepthwiseConv2d_","unfusedDepthwiseConv2d","fusedMatMul_","unfusedMatMul","innerShapeA","innerShapeB","outerShapeA","outerShapeB","outerDimsA","outerDimsB","batchDimA","batchDimB","a3D","b3D","aDer","bDer","hammingWindow_","hammingWindow","hannWindow_","hannWindow","frame_","signal","frameLength","frameStep","padValue","padLen","frame","stft_","windowFn","framedSignal","windowedSignal","stft","cropAndResize_","boxes","boxInd","cropSize","method","extrapolationValue","$image","$boxes","$boxInd","numBoxes","cropAndResize","flipLeftRight_","flipLeftRight","grayscaleToRGB_","lastDimsIdx","lastDims","grayscaleToRGB","rotateWithOffset_","radians","fillValue","center","rotateWithOffset","nonMaxSuppSanityCheck","scores","maxOutputSize","iouThreshold","scoreThreshold","softNmsSigma","nonMaxSuppression_","$scores","nonMaxSuppression","binaryInsert","element","comparator","binarySearch","insertionPoint","target","binarySearch_","defaultComparator","middle","compareResult","nonMaxSuppressionV3Impl","nonMaxSuppressionImpl_","nonMaxSuppressionV4Impl","padToMaxOutputSize","nonMaxSuppressionV5Impl","returnScoresTensor","returnValidOutputs","candidates","ascendingComparator","selectedIndices","selectedScores","candidate","originalScore","boxIndex","suppressBeginIndex","ignoreCandidate","iou","intersectionOverUnion","suppressWeight","validOutputs","elemsToPad","iCoord","jCoord","yminI","xminI","ymaxI","xmaxI","yminJ","xminJ","ymaxJ","xmaxJ","areaI","areaJ","intersectionYmin","intersectionXmin","intersectionYmax","intersectionXmax","intersectionArea","weight","c1","c2","nonMaxSuppressionAsync_","boxesAndScores","boxesVals","scoresVals","nonMaxSuppressionAsync","nonMaxSuppressionWithScore_","nonMaxSuppressionWithScore","nonMaxSuppressionWithScoreAsync_","nonMaxSuppressionWithScoreAsync","nonMaxSuppressionPadded_","$maxOutputSize","$iouThreshold","$scoreThreshold","nonMaxSuppressionPadded","nonMaxSuppressionPaddedAsync_","nonMaxSuppressionPaddedAsync","resizeBilinear_","images","alignCorners","halfPixelCenters","$images","batchImages","resizeBilinear","resizeNearestNeighbor_","resizeNearestNeighbor","threshold_","inverted","threshValue","RED_INTENCITY_COEF","GREEN_INTENCITY_COEF","BLUE_INTENCITY_COEF","totalPixelsInImage","$threshold","grayscale","$r","$g","$histogram","otsu","invCondition","histogram","total","bestThresh","bestInBetVar","cInBetVar","classFirst","classSecond","meanFirst","meanSec","weightForeground","weightBack","meanFirstDivA","meanSecFill","meanSecAdd","meanSecMul","cInBetVarSubA","cInBetVarSubB","cInBetVarMul","threshold","transform_","transforms","interpolation","fillMode","$transforms","transform","bandPart_","numLower","numUpper","M","N","ij","inBand","zero","mat","bandPart","gramSchmidt_","inputIsTensor2D","ys","xs1d","proj","gramSchmidt","qr_","fullMatrices","qr2d","outerDimsProd","x2ds","q2ds","r2ds","x2d","q2d","r2d","q","one2D","iters","rTemp","wTemp","qTemp","rjEnd1","normX","rjj","u1","wPre","tau","rjEndAll","tauTimesW","wT","rTimesTau","tawTimesWT","qAllJEnd","qTimesTau","qr","Reduction","computeWeightedLoss_","losses","reduction","$losses","weightedLoss","broadcastFactor","broadcastedWeights","numNonZeros","computeWeightedLoss","absoluteDifference_","labels","$labels","absoluteDifference","cosineDistance_","cosineDistance","hingeLoss_","hingeLoss","huberLoss_","deltaScalar","quadratic","linear","huberLoss","logLoss_","epsilon","epsilonScalar","l1","l2","logLoss","meanSquaredError_","meanSquaredError","sigmoidCrossEntropyWithLogits_","maxOutput","outputXTarget","sigmoidOutput","sigmoidCrossEntropy_","multiClassLabels","labelSmoothing","$multiClassLabels","labelSmoothingScalar","sigmoidCrossEntropy","softmaxCrossEntropyWithLogits_","lse","logResult","costVector","dyShape","softmaxCrossEntropy_","onehotLabels","$onehotLabels","numClasses","softmaxCrossEntropy","sparseFillEmptyRows_","denseShape","$denseShape","sparseFillEmptyRows","sparseReshape_","inputIndices","$inputIndices","$inputShape","$newShape","sparseReshape","sparseSegmentMean_","sparseSegmentMean","sparseSegmentSum_","sparseSegmentSum","stringNGrams_","dataSplits","separator","nGramWidths","leftPad","padWidth","preserveShortSequences","$dataSplits","stringNGrams","stringSplit_","delimiter","skipEmpty","$input","$delimiter","stringSplit","stringToHashBucketFast_","numBuckets","stringToHashBucketFast","spectral","linalg","string","Optimizer","returnCost","gradArray","weightValues","AdadeltaOptimizer","learningRate","rho","variableGradients","gradient","accumulatedGrad","accumulatedUpdate","newAccumulatedGrad","newAccumulatedUpdate","variables","variableCount","AdagradOptimizer","initialAccumulatorValue","AdamOptimizer","beta1","beta2","varNames","oneMinusAccBeta1","oneMinusAccBeta2","firstMoment","secondMoment","newFirstMoment","newSecondMoment","biasCorrectedFirstMoment","biasCorrectedSecondMoment","AdamaxOptimizer","variableNames","lr","weightedInfNorm","ut0","ut1","newWeightedInfNorm","SGDOptimizer","MomentumOptimizer","momentum","useNesterov","accumulation","newAccumulation","RMSPropOptimizer","centered","accumulatedMeanSquare","accumulatedMoments","newAccumulatedMeanSquare","accumulatedMeanGrad","newAccumulatedMeanGrad","gradContribution","newAccumulatedMoments","OptimizerConstructors","train","delayCallback","nextFrame","assertParamsConsistent","shapes","firstShape","RowPartitionType","combineRaggedTensorToTensorShapes","raggedRank","valueShape","valueDim","outputShapeDimIndex","outputShapeDim","getRowPartitionTypesHelper","rowPartitionTypeStrings","stringToType","typeStr","getRaggedRank","validateDefaultValueShape","defaultValueShape","defaultNDims","valuesNDims","defaultDim","PARALLELIZE_THRESHOLD","computeOptimalWindowSize","inSize","getImageCenter","imageHeight","imageWidth","centerX","centerY","getReshaped","batchToSpace","reshaped","spatialLength","getPermuted","reshapedRank","blockShapeRank","permuted","permutedBeforeBatch","permutedAfterBatch","getReshapedPermuted","reshapedPermuted","getSliceBeginCoords","sliceBeginCoords","getSliceSize","uncroppedShape","SELU_SCALEALPHA","SELU_SCALE","ERF_P","ERF_A1","ERF_A2","ERF_A3","ERF_A4","ERF_A5","mergeRealAndImagArrays","splitRealAndImagArrays","complexWithEvenIndex","complexWithOddIndex","getComplexWithIndex","assignToTypedArray","exponents","inverse","exponent","ARROW","ARROW_REGEX","COMMA","ELLIPSIS","decodeEinsumEquation","numTensors","numArrows","inputString","outputString","inputTerms","numInputs","allDims","dimName","inputTerm","idDims","numOutDims","summedDims","getEinsumPermutation","nDims","permutationIndices","checkEinsumDimSizes","dimSizes","getEinsumComputePath","steps","nSteps","computedTermIndices","summedDim","termIndices","findTermsWithDim","termIndex","isIdentityPermutation","prepareSplitSize","splitSizes","numOfNegs","negIndex","getSparseFillEmptyRowsIndicesDenseShapeMismatch","indicesLength","getSparseFillEmptyRowsNegativeIndexErrorMessage","getSparseFillEmptyRowsOutOfRangeIndexErrorMessage","getSparseReshapeMultipleNegativeOneOutputDimErrorMessage","dim1","dim2","getSparseReshapeNegativeOutputDimErrorMessage","getSparseReshapeEmptyTensorZeroOutputDimErrorMessage","getSparseReshapeInputOutputMultipleErrorMessage","inputSize","getSparseReshapeInputOutputMismatchErrorMessage","getSparseSegmentReductionNegativeSegmentIdsErrorMessage","getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage","getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage","segmentId","getSparseSegmentReductionIndicesOutOfRangeErrorMessage","indexValue","segOpComputeOptimalWindowSize","collectGatherOpShapeInfo","outerSize","fromUint8ToStringArray","fromStringArrayToUint8","strings","absGradConfig","acosGradConfig","acoshGradConfig","addGradConfig","addNGradConfig","ders","argMaxGradConfig","argMinGradConfig","asinGradConfig","asinhGradConfig","atan2GradConfig","atanGradConfig","atanhGradConfig","avgPool3dGrad_","$dy","input5D","avgPool3dGrad","avgPool3DGradConfig","avgPoolGrad_","avgPoolGrad","avgPoolGradConfig","batchMatMulGradConfig","batchToSpaceNDGradConfig","broadcastToGradConfig","broadCastToAttrs","castGradConfig","ceilGradConfig","clipByValueGradConfig","complexAbsGradConfig","concatGradConfig","$axis","sizeSplits","conv2DGradConfig","conv2DBackpropInputGradConfig","ddx","conv3DBackpropFilter_","conv3DBackpropFilter","conv3DGradConfig","cosGradConfig","coshGradConfig","cumsumGradConfig","permutation","depthwiseConv2dNativeGradConfig","$dilations","dilation2dGradConfig","inputInputs","filterInputs","eluGradConfig","erfGradConfig","expGradConfig","expandDimsGradConfig","expm1GradConfig","floorGradConfig","floorDivGradConfig","tmp","fusedBatchNormGradConfig","scaleValue","reductionAxes","tileShape","xMinusMean","dyTimesScaleValue","oneOverSqrtVariance","minusHalfRCube","meanDer","varianceDer","xMinusMean2TimesRsqrt","scaleDer","offsetDer","gatherGradConfig","parsedAxis","paramsShape","indicesSize","outerShape","outerDims","innerShape","innerDims","outerAxesIndices","arrayRange","innerAxesIndices","valuesShape","arrayConcat","reshapedIndices","transposeDims","valuesTranspose","paramsGrad","invertTransposeDims","arrays","greaterEqualGradConfig","identityGradConfig","isFiniteGradConfig","isInfGradConfig","isNanGradConfig","leakyReluGradConfig","log1pGradConfig","logGradConfig","logSoftmaxGradConfig","localResponseNormalizationBackprop_","localResponseNormalizationBackprop","lrnGradConfig","gradForMinAndMax","xOrig","origAxes","maxGradConfig","maxAttrs","reductionIndices","util.parseAxisParam","maxGrad","maximumGradConfig","maxPool3dGrad_","$output","output5D","maxPool3dGrad","maxPool3DGradConfig","maxPoolGrad_","maxPoolGrad","maxPoolGradConfig","meanGradConfig","reduceSize","expandedDyShape","expandedDy","minGradConfig","minAttrs","minGrad","minimumGradConfig","mirrorPadGradConfig","modGradConfig","multiplyGradConfig","negGradConfig","oneHotGradConfig","onesLikeGradConfig","packGradConfig","padV2GradConfig","powGradConfig","expFloat","logBase","preluGradConfig","prodGradFn_","expandedYShape","xCumProd","xCumRevProd","prodsGradFn_","finalProdAxis","xPermutation","backend_util.getAxesPermutation","permutedX","endPartShape","reshapedPermutedX","prodGrad","undoPermutation","backend_util.getUndoAxesPermutation","prodGradConfig","axisArr","divGradConfig","reciprocalGradConfig","relu6GradConfig","reluGradConfig","reshapeGradConfig","resizeBilinearGradConfig","resizeNearestNeighborGradConfig","reverseGradConfig","roundGradConfig","rsqrtGradConfig","selectGradConfig","seluGradConfig","scaleAlpha","greaterThanZeroDer","lessEqualZeroDer","sigmoidGradConfig","signGradConfig","sinGradConfig","sinhGradConfig","sliceGradConfig","softmaxGradConfig","dyTimesY","softplusGradConfig","spaceToBatchNDGradConfig","splitVGradConfig","sqrtGradConfig","squareGradConfig","squaredDifferenceGradConfig","two","stepGradConfig","subGradConfig","sumGradConfig","derX","tanGradConfig","tanhGradConfig","tileGradConfig","xGrad","transposeGradConfig","transposeAttrs","undoPerm","axis_util.getUndoAxesPermutation","unpackGradConfig","unpackAttrs","unsortedSegmentSumGradConfig","gatherDropNegatives","zeroClippedIndices","gathered","isPositive","numIters","zeroSlice","zerosLikeGradConfig","gradConfigs","gradientConfig","rows","columns","depth2","depth3","padding","dilationRate","newShape2D","halfFloatCenters","tensorsToBeStacked","AttributeError","RuntimeError","ValueError","NotImplementedError","AssertionError","LruCache","maxEntries","keyToDelete","pyListRepeat","newArray","refernce","singletonOrArray","toList","toSnakeCase","insecure","toCamelCase","identifier","p1","_GLOBAL_CUSTOM_OBJECTS","serializeKerasObject","dict","convertNDArrayScalarsInConfig","configItem","fields","field","deserializeKerasObject","moduleObjects","customObjects","printableModuleName","fastWeightInit","className","fromConfig","customObjectsCombined","nestedConfig","backupCustomObjects","returnObj","numberCompare","reverseNumberCompare","isObjectEmpty","checkStringTypeUnionValue","label","checkArrayTypeAndLength","expectedType","minLength","maxLength","assertPositiveInteger","formatAsFriendlyString","debounce","waitMs","nowFunc","lastTime","lastResult","mapActivationToFusedKernel","activationName","_nextUniqueTensorId","getNextUniqueTensorId","_uidPrefixes","getUid","VALID_DATA_FORMAT_VALUES","VALID_INTERPOLATION_FORMAT_VALUES","VALID_PADDING_MODE_VALUES","VALID_POOL_MODE_VALUES","VALID_BIDIRECTIONAL_MERGE_MODES","nameMap","checkDataFormat","checkInterpolationFormat","checkPaddingMode","checkPoolMode","_nameScopeStack","_nameScopeDivider","nameScope","currentNameScopePrefix","getScopedTensorName","tensorName","isValidTensorName","getUniqueTensorName","scopedName","tensorNameRegex","isInteger","arrayProd","_epsilon","imageDataFormat","tfc.cast","tfc.reshape","repeat","math_utils.arrayProd","batchFlatten","sliceAlongFirstAxis","tfc.slice1d","tfc.slice2d","tfc.slice3d","tfc.slice4d","tfc.slice","sliceAlongLastAxis","sliceAlongAxis","concatenate","tfc.concat","concatAlongFirstAxis","tfc.concat1d","tfc.concat2d","tfc.concat3d","tfc.concat4d","tfc.tile","stddev","tfc.randomNormal","xLastDim","ySecondLastDim","tfc.fused.matMul","reshapeBias","aFirstDims","aLastDim","bShape","bLastDim","yOtherDims","tfc.transpose","reference","tfc.gather","tfc.mul","biasShape","biasAdd","tfc.add","tfc.elu","softsign","tfc.div","tfc.abs","level","tfc.dropout","hardSigmoid","tfc.clipByValue","inTrainPhase","alt","training","VALID_FAN_MODE_VALUES","VALID_DISTRIBUTION_VALUES","checkFanMode","checkDistribution","Initializer","serialization.Serializable","Zeros","Ones","Constant","RandomUniform","RandomNormal","K.randomNormal","TruncatedNormal","computeFans","fanIn","fanOut","receptiveFieldSize","VarianceScaling","fans","GlorotUniform","GlorotNormal","HeNormal","HeUniform","LeCunNormal","LeCunUniform","Orthogonal","normalizedShape","INITIALIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP","deserializeInitializer","serialization.SerializationMap","serializeInitializer","initializer","getInitializer","isArrayOfShapes","normalizeShapeList","getExactlyOneTensor","getExactlyOneShape","countParamsInWeights","DEFAULT_VARIABLE_NAME_PREFIX","LayerVariable","constraint","tfc.variable","newVal","checkShapesMatch","batchGetValue","batchSetValue","variablesAndValues","variableAndValue","InputSpec","SymbolicTensor","sourceLayer","callArgs","outputTensorIndex","_nextNodeID","Node","layer","inboundNames","_nextLayerID","Layer","generic_utils.toSnakeCase","batchInputShape","nodeIndex","attrName","generic_utils.singletonOrArray","lossFn","built","generic_utils.toList","inputSpec","inputIndex","ndim","xShapeAtAxis","specDim","kwargs","callHook","inputsList","allAreSymbolic","noneAreSymbolic","inputShapes","xElem","outputList","outputListCopy","collectInputShape","outputDType","guessOutputDType","dimMismatch","dimension","allOutputShapes","shapeString","outputShapes","variable_utils.countParamsInWeights","trainableOnly","weightValueTuples","paramValues","pv","regularizer","getInitializerFunc","initValue","maskElement","inputTensors","outputTensors","inputMasks","outputMasks","inputTensorList","types_utils.normalizeShapeList","inboundLayers","nodeIndices","tensorIndices","numDisposedVariables","getSourceInputs","sourceTensors","previousSources","InputLayer","inputTensor","Input","assertFeedCompatibility","FeedDict","feeds","feed","cachedSorted","cachedRecipientCounts","updateCacheMaxEntries","execute","fetches","feedDict","probe","arrayFetches","fetchArray","outputNames","finalOutputs","feedNames","outputName","fetchAndFeedKey","recipientCounts","getTopologicalSortAndRecipientCounts","internalFeedDict","symbolic","srcLayer","inputValues","tensorsToDispose","maskExists","outputMask","layerOutputs","getNodeOutputs","outputSymbolicTensors","finalSorted","finalRecipientMap","getTopologicalSortAndRecipientCountsForOneFetch","visited","recipientMap","symbolicTensor","recipient","recipientMap2Counts","marks","topIsMarked","outputTensor","calcL2Norms","tfc.sqrt","tfc.sum","Constraint","MaxNorm","norms","desired","UnitNorm","NonNeg","tfc.relu","MinMaxNorm","CONSTRAINT_IDENTIFIER_REGISTRY_SYMBOL_MAP","serializeConstraint","deserializeConstraint","getConstraint","resolveScalarsInLogs","logs","scalarsToDispose","valueScalar","disposeTensorsInLogs","ModelLoggingVerbosity","DEFAULT_YIELD_EVERY_MS","BaseCallback","epoch","model","CallbackList","callbacks","queueLength","BaseLogger","oldTotalsToDispose","History","valueArray","CustomCallback","yieldEvery","util.isNumber","generic_utils.debounce","ps","standardizeCallbacks","callbackConfig","CallbackConstructorRegistry","verbosityLevel","callbackConstructor","levelName","ctor","constructors","configureCallbacks","epochs","initialEpoch","numTrainSamples","stepsPerEpoch","doValidation","callbackMetrics","history","actualCallbacks","callbackList","deserialize","l2Normalize","squareSum","K.square","epsilonTensor","tfc.fill","tfc.maximum","yTrue","yPred","tfc.mean","tfc.sub","meanAbsoluteError","meanAbsolutePercentageError","diff","clippedTrue","absResult","meanSquaredLogarithmicError","clippedPred","firstLog","tfc.log","secondLog","squaredHinge","maxResult","hinge","categoricalHinge","pos","tfc.max","logcosh","predictionDiff","logcoshResult","tfc.softplus","categoricalCrossentropy","fromLogits","tfc.softmax","outputSum","tfc.neg","sparseCategoricalCrossentropy","flatTarget","tfc.floor","K.flatten","oneHotTarget","tfc.oneHot","sigmoidCrossEntropyWithLogits","reluLogits","negAbsLogits","tfc.log1p","tfc.exp","binaryCrossentropy","kullbackLeiblerDivergence","poisson","logPred","cosineProximity","trueNormalized","predNormalized","trueXPred","lossesMap","get","identifierOrFn","binaryAccuracy","tfc.onesLike","yPredThresholded","K.cast","tfc.greater","tfc.equal","categoricalAccuracy","tfc.argMax","truePositives","tfc.logicalAnd","falsePositives","tp","fp","denominator","tfc.where","lossBinaryCrossentropy","sparseCategoricalAccuracy","tfc.squeeze","mse","MSE","mae","MAE","mape","MAPE","categoricalCrossentropyLoss","cosine","sparseCategoricalCrossentropyLoss","metricsMap","getLossOrMetricName","fnName","getOptimizer","optimizerMap","MAX_USER_DEFINED_METADATA_SERIALIZED_LENGTH","checkUserDefinedMetadata","userDefinedMetadata","modelName","checkSize","plainObjectCheck","xType","printSummary","lineLength","positions","printFn","sequentialLike","isModelSequentialLike","toDisplay","relevantNodes","printRow","layers","printLayerSummary","printLayerSummaryWithConnections","trainableCount","countTrainableParams","nonTrainableCount","nodesByDepth","nodes","depthNodes","flag","line","connections","inboundLayer","inboundLayerIndex","inboundTensorIndex","firstConnection","isArrayItemInputOrOutputName","convertPythonicToTs","pythonicConfig","generic_utils.toCamelCase","tsArray","arrayLength","tsDict","pythonicKey","pythonicValue","tsKey","convertTsToPythonic","tsConfig","pyArray","pyDict","tsValue","pyKey","version","Container","generic_utils.unique","tensorIndex","generic_utils.assert","nodesDepths","nodeIDToNode","layersDepths","layerIDToLayer","layerIndices","nodesInDecreasingDepth","buildMapOfGraph","finishedNodes","nodesInProgress","numInboundLayers","reversedNodesInDecreasingDepth","previousDepth","inboundNode","nodeID","layersByDepth","layerID","depthKeys","generic_utils.reverseNumberCompare","layersForDepth","aIndex","bIndex","computableTensors","layersWithCompleteInput","allNames","numOccurrences","trainableWeights","strict","nameToWeight","totalWeightsCount","validatedName","tokens","unsetNames","theConfig","modelConfig","layersVersion","unused","returnString","generic_utils.pyListRepeat","layersToOutputShapes","shapeKey","outputShapeKeys","tensorMap","referenceInputTensors","referenceOutputTensors","computedData","computedTensors","computedMasks","computedTensor","computedMask","nodeConversionMap","keptNodes","originalNodeIndex","nodeKey","layerConfigs","layerClassName","layerConfig","filteredInboundNodes","nodeData","newNodeIndex","modelInputs","modelOutputs","createdLayers","unprocessedNodes","addUnprocessedNode","processNode","inputData","inboundLayerName","inboundNodeIndex","processLayer","layerData","layerName","deserializeLayer","layersFromConfig","generic_utils.isObjectEmpty","currentUnprocessedNodesForLayer","inputLayersFromConfig","layerOutputTensors","outputLayersFromConfig","standardizeSampleOrClassWeights","xWeight","weightType","numOutputs","standardizeClassWeights","classWeight","standardizeWeights","sampleWeight","sampleWeightMode","yClasses","yClassIndices","classSampleWeight","classIndex","sampleWeights","DEFAULT_VALIDATION_BATCH_SIZE","standardizeDataIteratorOutput","iteratorOut","iteratorOutObj","tfc.util.assert","flattenedXs","flattenTensorOrArrayOrMap","flattenedYs","xIndex","yIndex","inputOrOutput","tfc.Tensor","standardizeTensorValidationData","fitDataset","dataset","hasBatchesPerEpoch","valXs","valYs","isDatasetObject","validationData","trainFunction","outLabels","getStepsPerEpoch","dataIterator","epochLogs","stepsDone","batchIndex","batchLogs","standardClassWeights","ins","tfc.dispose","tfc.keep","valOuts","isLazyIteratorObject","iterator","evaluateDataset","hasBatches","numExamples","tfc.tidy","xsAndYs","batchOuts","batchOut","oldScalar","checkBatchSize","sliceArrays","sliceArraysByIndices","makeBatches","batchStart","batchEnd","fitLoop","valF","valIns","validationSteps","indexArray","util.shuffle","epochIndexArray1D","batches","batchIds","insBatch","fitTensors","originalInputs","originalTargets","inputValX","inputValY","valX","valY","standardizedOuts","valStandardized","splitAt","originalBatchSize","valFunction","disposeNewTensors","ensureTensorsRank2OrHigher","refTensors","oldTensorIds","oldTensor","isDataTensor","isDataArray","isDataDict","standardizeInputData","checkBatchAxis","exceptionPrefix","gotUnexpectedData","refDim","checkArrayLengths","setX","setY","checkLossAndTargetCompatibility","lossFns","keyLosses","losses.meanSquaredError","losses.binaryCrossentropy","losses.categoricalCrossentropy","loss","slicedYShape","slicedShape","targetDim","checkInputData","collectMetrics","metrics","wrappedMetrics","nestedMetrics","outputMetrics","LAYERS_MODEL_FORMAT_NAME","LayersModel","optimizers.getOptimizer","lossFunctions","losses.get","lossFunction","skipTargetIndices","appendMetric","outputIndex","metricName","metricTensor","metricNamePrefix","accFn","weightedMetricFn","metric","Metrics.binaryAccuracy","Metrics.binaryCrossentropy","losses.sparseCategoricalCrossentropy","Metrics.sparseCategoricalAccuracy","Metrics.sparseCategoricalCrossentropy","Metrics.categoricalAccuracy","Metrics.categoricalCrossentropy","Metrics.get","Metrics.getLossOrMetricName","metricResult","testOuts","stepsName","outputsIsArray","tensorValue","executeOutputs","symbolicTensorNames","outputsRemaining","layerOutputNames","remainingNames","outsBatches","xsRank2OrHigher","standardXs","standardYs","standardSampleWeights","classWeights","K.sliceAlongFirstAxis","dedupedOutLabels","newLabel","dupIndex","lossValues","metricsValues","totalLossFunction","totalLoss","meanLoss","weightedMetric","regularizerLoss","valOutputs","meanMetric","standardizeOut","namedWeights","optimizer","numTensorsBeforeOptmizerDisposal","tfc.memory","lossNames","metricsIdentifiers","lossEntry","handlerOrURL","handlers","io.getSaveHandlers","weightDataAndSpecs","io.encodeWeights","optimizerWeightData","optimizerWeightSpecs","io.concatenateArrayBuffers","Functional","Sequential","isLayerModelInstance","modelLayer","lastLayerIndex","configArray","extraModelConfig","conf","Activation","K.elu","tfc.selu","tfc.minimum","Linear","tfc.sigmoid","HardSigmoid","K.hardSigmoid","Softsign","K.softsign","tfc.tanh","tfc.logSoftmax","Swish","Mish","serializeActivation","deserializeActivation","getActivation","assertObjectArgs","Regularizer","L1L2","regularization","REGULARIZER_IDENTIFIER_REGISTRY_SYMBOL_MAP","serializeRegularizer","deserializeRegularizer","getRegularizer","ReLU","baseConfig","LeakyReLU","PReLU","paramShape","ELU","ThresholdedReLU","softmaxActivation","normalizeArray","singleValue","convOutputLength","inputLength","dilatedFilterSize","outputLength","deconvLength","strideSize","kernelSize","preprocessConv2DInput","preprocessConv3DInput","conv1dWithBias","tfc.conv1d","K.biasAdd","conv2dWithBiasActivation","tfc.fused.conv2d","conv3dWithBias","tfc.conv3d","BaseConv","generic_utils.assertPositiveInteger","generic_utils.checkArrayTypeAndLength","Conv","channelAxis","inputDim","kernelShape","biasValue","fusedActivationName","generic_utils.mapActivationToFusedKernel","newSpace","space","newDim","Conv2DTranspose","hAxis","wAxis","kernelH","kernelW","strideH","strideW","tfc.conv2dTranspose","heightAxis","widthAxis","Conv3DTranspose","dAxis","kernelD","strideD","tfc.conv3dTranspose","depthAxis","SeparableConv","depthwiseKernelShape","pointwiseKernelShape","tfc.separableConv2d","SeparableConv2D","Conv1D","Cropping2D","hSliced","K.sliceAlongAxis","UpSampling2D","resized","tfc.image","depthwiseKernel","tfc.depthwiseConv2d","DepthwiseConv2D","cols","outFilters","outRows","outCols","standardizeArgs","initialState","constants","numConstants","toListOrNull","rnn","stepFunction","initialStates","goBackwards","unroll","needPerStepOutputs","math_utils.range","tfc.expandDims","tfc.reverse","perStepOutputs","lastOutput","states","timeSteps","perStepInputs","tfc.unstack","perStepMasks","currentInput","stepOutputs","maskedOutputs","stepMask","negStepMask","tfc.stack","RNN","cell","StackedRNNCells","numStates","stateSize","outputDim","stateShape","stateMask","stepInputShape","tfc.zeros","expectedShape","standardized","additionalInputs","additionalSpecs","fullInput","fullInputSpec","originalInputSpec","cellCallKwargs","rnnOutputs","K.expandDims","K.tile","cellConfig","RNNCell","SimpleRNNCell","math_utils.min","math_utils.max","prevOutput","generateDropoutMask","dpMask","recDpMask","K.dot","SimpleRNN","GRUCell","hTMinus1","hh","matrixX","recurrentKernelValue","rk1","rk2","tfc.split","matrixInner","xZ","xR","xH","recurrentZ","recurrentR","recurrentH","GRU","LSTMCell","_a","biasInitializer","capturedBiasInit","capturedUnits","bI","bF","bCAndH","K.concatAlongFirstAxis","cTMinus1","z0","z1","z2","z3","LSTM","nestedStates","newNestedStates","callInputs","cellStates","getCellConfig","cells","tuples","numParams","inputWeights","dropoutFunc","droppedInputs","K.dropout","createMask","K.inTrainPhase","__rest","ConvRNN2D","filters","isChannelsFirst","hOut","wOut","ConvLSTM2DCell","numOfKernels","recurrentKernelShape","biasI","biasF","tfc.ones","biasCAndO","K.concatenate","dropoutMask","applyDropout","xI","xF","xC","xO","recDropoutMask","hI","hF","hC","hO","kernelChannelAxis","kernelI","kernelF","kernelC","kernelO","biasC","biasO","recKernelI","recKernelF","recKernelC","recKernelO","tfc.conv2d","ConvLSTM2D","Dropout","SpatialDropout1D","Dense","inputLastDim","Flatten","K.batchFlatten","RepeatVector","K.repeat","errorMsg","known","unknown","originalSize","anyUnknownDims","Permute","expectedSortedIndices","Masking","booleanMask","Embedding","inLens","s2","K.gather","Merge","shape1","shape2","batchSizes","allRanks","reshapedInputs","inputDims","maxNDim","mathUtils.max","xNDim","transposed","xTransposed","mathUtils.arrayProd","mathUtils.range","yNDim","yShape","Average","Concatenate","allNoneShape","shapeSet","shapeWithoutConcatAxis","exists","allNullMasks","concatenatedMasks","tfc.all","interpretAxis","batchDot","axesArray","diffShape","adjX","adjY","tfc.matMul","idx","squeezeAxes","Dot","x1","GaussianNoise","GaussianDropout","AlphaDropout","alphaP","keptIdx","batchNormalization","gamma","tfc.batchNorm2d","tfc.batchNorm3d","tfc.batchNorm4d","regularNormalizeBatchInTraining","meanAndVariance","tfc.moments","broadcastNormalizeBatchInTraining","targetShape","broadcastMean","broadcastVariance","broadcastGamma","broadcastBeta","normalizeBatchInTraining","BatchNormalization","sortedReductionAxes","needsBroadcasting","normalizeInference","broadcastMovingMean","broadcastMovingVariance","normedTraining","doMovingAverage","origValue","updateDelta","LayerNormalization","broadcast","momentsTiling","scaleOffsetTiling","spatial2dPadding","pattern","tfc.pad","ZeroPadding2D","heightPadding","widthPadding","pool2d","poolSize","poolMode","paddingString","tfc.maxPool","tfc.avgPool","pool3d","tfc.maxPool3d","tfc.avgPool3d","Pooling1D","length","MaxPooling1D","AveragePooling1D","Pooling2D","MaxPooling2D","AveragePooling2D","Pooling3D","depths","MaxPooling3D","AveragePooling3D","GlobalPooling1D","GlobalAveragePooling1D","GlobalMaxPooling1D","GlobalPooling2D","GlobalAveragePooling2D","GlobalMaxPooling2D","Wrapper","newConfig","TimeDistributed","childInputShape","childOutputShape","timesteps","checkBidirectionalMergeMode","generic_utils.checkStringTypeUnionValue","DEFAULT_BIDIRECTIONAL_MERGE_MODE","Bidirectional","forwDict","backDict","numWeights","numeightsOver2","layerShapes","stateSpecs","isSymbolicTensor","yRev","forwardState","backwardState","rnnLayer","Rescaling","DataType","SaverDef","CheckpointFormatVersion","CUSTOM_OPS","getRegisteredOp","getParamValue","paramName","context","resourceManager","inputParam","getTensor","util.toNestedArray","attrParam","tensorsMap","nodeName","parseNodeName","contextId","getNodeNameWithContextId","getTensorsForCurrentContenxt","getNodeNameAndIndex","parts","getPadding","explicitPadding","cloneTensor","OperationMapper","ops","arithmetic","basicMath","control","convolution","creation","dynamic","evaluation","graph","hashTable","logical","matrices","normalization","sliceJoin","transformation","mappersJson","map","mapper","signature","tfNodes","placeholders","initNodes","inputNodeNameToKey","outputNodeNameToKey","allNodes","inputNode","functions","func","entries","newNode","getStringParam","getStringArrayParam","getNumberParam","getNumericArrayParam","getBoolParam","getBoolArrayParam","getTensorShapeParam","getTensorShapeArrayParam","getDtypeParam","getDtypeArrayParam","getFuncParam","functionDef","parseDtypeParam","returnNodeMap","decodeBase64","parseStringParam","keepCase","def","tensorflow.DataType","parseTensorShapeParam","NodeValueImpl","executeOp","tfOps","assertShapesMatchAllowUndefinedSize","dim0","fullDefinedShape","elementShape","inferElementShape","listElementShape","partialShape","mergeElementShape","notfullDefinedShape","elementShapeA","elementShapeB","TensorArray","maxSize","identicalElementShapes","dynamicSize","clearAfterRead","keepIds","tensorWithState","maxIndex","totalLength","cumulativeLengths","elementPerRow","sizes","TensorList","elementDtype","maxNumElements","numElements","outputElementShape","reshapedTensors","destTensorList","elementIndex","fromTensor","tensorElementShape","tensorList","reserve","scatter","shapeWithoutFirstDim","thenFunc","elseFunc","cond","bodyFunc","condFunc","condResult","argIds","condValue","origResult","resultIds","pred","frameId","tensorArray","writeTensor","writeTensorArray","readId","readIndex","gatherId","gatherIndices","gatherDtype","scatterId","scatterIndices","scatterTensor","scatterTensorArray","concatId","concatTensorArray","concatDtype","splitId","splitTensor","lengths","splitTensorArray","sizeId","sizeTensorArray","closeId","closeTensorArray","idTensor","elementDType","numElementsParam","fusedConvAndDepthWiseParams","extraOp","activationFunc","isBiasAdd","noBiasAdd","isPrelu","isBatchNorm","numArgs","biasArg","preluArg","indexes","nmsParams","snapshot","summarize","HashTable","keyDType","valueDType","tfOps.scalar","$keys","keysLength","valuesLength","handle","squeezedShape","mapped","sameShape","outputIndices","outputValues","emptyRowIndicator","reverseIndexMap","nGrams","nGramsSplits","arithmetic.executeOp","basicMath.executeOp","control.executeOp","convolution.executeOp","creation.executeOp","dynamic.executeOp","evaluation.executeOp","image.executeOp","graph.executeOp","logical.executeOp","matrices.executeOp","normalization.executeOp","reduction.executeOp","sliceJoin.executeOp","sparse.executeOp","spectral.executeOp","string.executeOp","transformation.executeOp","hashTable.executeOp","opMapper","tfc.util.isPromise","ExecutionContext","weightMap","tensorArrayMap","tensorListMap","functionMap","frameName","contexts","getExecutionSubgraph","usedNodes","missingInputs","dynamicNode","syncInputs","inputNodeNames","initNodeNames","frontier","isControlFlow","isDynamicShape","isHashTable","child","getNodesInTopologicalOrder","executionInfo","inputNodes","orderedNodes","CONTROL_FLOW_OPS","DYNAMIC_SHAPE_OPS","HASH_TABLE_OPS","GraphExecutor","parent","weightIds","sortedInputs","sortedOutputs","outNames","inNames","outputNodeNames","outputNodes","compilationKey","tensorsToKeep","intermediateTensorConsumerCount","util.isPromise","ids","isFunctionExecution","results","outputIds","inputIds","mappedInputs","added","missingOutputs","alternativeMsg","currentContext","childNode","match","notInGraph","normalizedName","ResourceManager","hashTableNameToHandle","hashTableMap","TFHUB_SEARCH_PARAM","DEFAULT_MODEL_NAME","GraphModel","modelUrl","tfio","io","loadResult","outputTensorsArray","outputTensorMap","newMap","loadGraphModel","getTFHubUrl","ZipMismatchMode","assertNotComplex","kernel_impls.whereImpl","MathBackendCPU","backend_util.warn","outId","encodedValues","tensorData","complexTensorInfos","backend_util.mergeRealAndImagArrays","simpleAbsImpl","resultValues","absConfig","cpuBackend","createSimpleBinaryKernelImpl","aVals","bVals","backend_util.assertAndGetBroadcastShape","resultRank","resultStrides","util.computeStrides","resultSize","util.getTypedArrayFromDType","aRank","bRank","aStrides","bStrides","aBroadcastDims","backend_util.getBroadcastDims","bBroadcastDims","util.indexToLoc","aLoc","util.locToIndex","bLoc","realVals","imagVals","complexInfo","complexConfig","identity","identityConfig","realVal","realConfig","castImpl","inputType","util.toTypedArray","resultData","zerosTensorInfo","floatX","realPart","util.hasEncodingLoss","resultType","castConfig","binaryKernelFunc","simpleImpl","complexImpl","decodedAVals","backend_util.fromUint8ToStringArray","decodedBVals","$dtype","$aComplex","$aComplexVals","aReal","aImag","aRealVals","aImagVals","$bComplex","$bComplexVals","bReal","bImag","bRealVals","bImagVals","resultRealData","resultImagData","resultReal","resultImag","createComplexBinaryKernelImpl","resultRealVals","resultImagVals","aIdx","bIdx","opResult","addImpl","addComplexImpl","addConfig","bincountImpl","weightsVals","weightsDtype","weightsShape","weightsSize","outVals","bincountReduceImpl","xBuf","weightsBuf","outBuf","createSimpleUnaryImpl","unaryKernelFunc","xSize","unaryKernelFuncFromImpl","unaryImpl","ceilImpl","xi","ceilConfig","concatImpl","simplyConcat","colOffset","decodedData","tIdx","resIdx","col","equalImpl","equalConfig","expImpl","expConfig","expm1Impl","expm1Config","floorImpl","floorConfig","gatherNdImpl","indicesData","paramsBuf","numSlices","paramsSize","flattenIndex","gatherV2Impl","indicesBuf","flattenOutputShape","originalLoc","batchIdx","indicesIdx","indicesIndex","originalIndex","greaterImpl","greaterConfig","greaterEqualImpl","greaterEqualConfig","lessImpl","lessConfig","lessEqualImpl","lessEqualConfig","linSpaceImpl","logImpl","logConfig","maxImpl","maximumImpl","aValue","bValue","maximumConfig","minimumImpl","minimumConfig","multiplyImpl","multiplyComplexImpl","multiply","multiplyConfig","negImpl","xDtype","minusOne","util.createScalarValue","negConfig","notEqualImpl","notEqualConfig","transposeImpl","xStrides","newLoc","newIndex","transposeConfig","prodImpl","backend_util.computeOutAndReduceShapes","outDtype","intermediateTensorInfos","backend_util.getInnerMostAxes","backend_util.expandShapeToKeepDim","prodConfig","validateIndices","locString","validateSplits","numParamsDenseValues","splits","lastSplit","makeSplits","valueSlices","numSplits","outSplits","nrows","rowLength","outSplitsOutDim","getSplits","splitsOut","computeFlatOuterDims","orig","outDims","writeValueSlices","paramsDenseValuesShape","valueSize","denseM","valuesM","outPos","getValues","paramsDenseValuesDType","valuesOut","raggedGatherImpl","paramsNestedSplitsShapes","outputNestedSplits","outputDenseValues","backend_util.RowPartitionType","RaggedTensorToTensorOp","shapeShape","valuesDType","rowPartitionValues","rowPartitionValuesShapes","backend_util.getRowPartitionTypesHelper","backend_util.getRaggedRank","rowPartitionTensor","rowSplit","tensorLength","maxWidth","currentWidth","valueRowIds","indexLength","firstEqualIndex","firstEqualIndexValue","tShape","isPartial","makeShape","firstDim","backend_util.validateDefaultValueShape","backend_util.combineRaggedTensorToTensorShapes","firstDimension","outputIndexMultiplier","firstDimensionOutput","minDimension","currentOutputIndex","parentOutputIndex","rowSplitSize","realLength","parentOutputIndexCurrent","indexSize","currentOutputColumn","currentValueRowId","nextValueRowId","partitionType","firstPartitionTensor","firstPartitionType","valuesBase","outputBase","valueElementSize","outputIndexSize","srcShape","defaultValueTensor","srcStart","dstStart","dstEnd","srcI","dstI","src","dst","nVals","copyArray","raggedTensorToTensorImpl","shapesShape","rangeImpl","sameStartStop","increasingRangeNegativeStep","decreasingRangePositiveStep","rsqrtImpl","rsqrtConfig","scatterImpl","sumDupeIndices","flattenShape","updatesData","sigmoidImpl","sigmoidConfig","sliceImpl","isContinous","slice_util.isSliceContinous","slice_util.computeFlatOffset","inBuf","outLoc","inLoc","backend_util.fromStringArrayToUint8","$begin","$size","slice_util.parseSliceParams","slice_util.assertParamsValid","sliceConfig","sparseFillEmptyRowsImpl","indicesDType","indicesCount","denseRows","backend_util.getSparseFillEmptyRowsIndicesDenseShapeMismatch","rowsAreOrdered","lastIndicesRow","csrOffset","backend_util.getSparseFillEmptyRowsNegativeIndexErrorMessage","backend_util.getSparseFillEmptyRowsOutOfRangeIndexErrorMessage","allRowsFull","rowEmpty","fullIndicesCount","filledCount","outputI","startingIndex","sparseReshapeImpl","inputIndicesShape","inputDType","denseSize","nnz","outputRank","product","unknownIndex","backend_util\n                    .getSparseReshapeMultipleNegativeOneOutputDimErrorMessage","backend_util.getSparseReshapeNegativeOutputDimErrorMessage","backend_util.getSparseReshapeEmptyTensorZeroOutputDimErrorMessage","missing","backend_util.getSparseReshapeInputOutputMultipleErrorMessage","backend_util.getSparseReshapeInputOutputMismatchErrorMessage","inputStrides","outputStrides","sparseSegmentReductionImpl","isMean","numIndices","inputFlat","numCol","backend_util.getSparseSegmentReductionNegativeSegmentIdsErrorMessage","uninitializedIndex","outIndex","backend_util\n                    .getSparseSegmentReductionNonIncreasingSegmentIdsErrorMessage","backend_util.getSparseSegmentReductionSegmentIdOutOfRangeErrorMessage","backend_util.getSparseSegmentReductionIndicesOutOfRangeErrorMessage","sqrtImpl","sqrtConfig","squaredDifferenceImpl","squaredDifferenceConfig","stridedSliceImpl","StringNGramsOp","nGramWidth","splitIndex","outputStartIndex","numNGrams","nGramIndex","leftPadding","rightPadding","numTokens","dataStartIndex","nGramSize","numSeparators","nGram","nextNGramIndex","appendToNGram","inputDataSize","splitsSize","prevSplit","validSplits","numBatchItems","empty","outputStartIdx","dataLength","stringNGramsImpl","delimiters","token","tokenStart","stringSplitImpl","maxNumEntries","prevTokensLength","nEntries","stringToHashBucketFastImpl","util.fingerPrint64","subImpl","subComplexImpl","subConfig","tileImpl","comparePair","valueDiff","select","sd","newLeft","newRight","util.swap","topKImpl","allTopKVals","allTopKIndices","outOffset","topKVals","topKIndices","uniqueImpl","uniqueElements","inputBuffer","uniqueIndices","is1DTensor","axisValues","uniqueIndex","outputTmpShape","outputBuffer","uniqueElementIndex","eluConfig","leakyReluConfig","preluImpl","xValue","preluConfig","reluConfig","relu6Config","util.inferFromImplicitShape","$xSize","xData","reshapeConfig","batchMatMul","a3dShape","b3dShape","a3d","b3d","sharedDim","leftDim","rightDim","a3dValues","b3dValues","a3dStrides","b3dStrides","aBatch","aOuterStep","aInnerStep","bInnerStep","bOuterStep","bBatch","resVals","bi","i0","j0","iBlock","jBlock","kBlock","batchOffsetA","batchOffsetB","aVal","bVal","batchMatMulConfig","_fusedMatMul","current","addRes","activationRes","intermediates","_fusedMatMulConfig","acosConfig","acoshConfig","currVals","addNConfig","permutedAxes","backend_util.assertAxesAreInnerMostDims","expandedShape","reshapedResult","allConfig","anyVal","anyConfig","outSize","argMaxConfig","minIndex","argMinConfig","asinConfig","asinhConfig","atanConfig","atan2Impl","atan2Config","atanhConfig","xValues","poolType","padTop","padLeft","outputVals","outputBatchStrides","outputRowStrides","outputColStrides","outputBatchOffset","inputBatchOffset","yR","xRCorner","xRMin","xRMax","outputRowOffset","yC","xCCorner","xCMin","xCMax","minMaxValue","avgValue","xROffset","xCOffset","pixel","outputOffset","maxPoolPositions","flattenPositions","maxPositions","maxValue","maxPosition","wR","wC","padFront","outputDepthStrides","yDepth","xDepthCorner","xDepthMin","xDepthMax","outputDepthOffset","yRow","xRowCorner","xRowMin","xRowMax","yCol","xColCorner","xColMin","xColMax","outputColOffset","xDepth","xDepthOffset","xRow","xRowOffset","xCol","xColOffset","maxPool3dPositions","wDepth","wRow","wCol","backend_util.eitherStridesOrDilationsAreOne","backend_util.computePool2DInfo","avgPoolConfig","avgPool3D","backend_util.computePool3DInfo","avgPool3DConfig","avgPool3DGrad","avgMultiplier","dyBuf","dxDepth","dxRow","dxCol","dyDepthCorner","dyRowCorner","dyColCorner","dotProd","dyDepth","dyRow","dyCol","dyData","dxR","dxC","dyRCorner","dyCCorner","dyR","dyC","mVals","varVals","sVals","offVals","offValsLength","sValsLength","varValsLength","mValsLength","offi","mi","si","vi","batchNormConfig","backend_util.getReshaped","backend_util.getPermuted","backend_util.getReshapedPermuted","backend_util.getSliceBeginCoords","backend_util.getSliceSize","xReshaped","xTransposedReshaped","batchToSpaceNDConfig","bincountConfig","s0Vals","s1Vals","broadcastArgsConfig","clipAttrs","clipByValueConfig","complexAbsConfig","complexVals","imagVal","imagConfig","backend_util.assertParamsConsistent","backend_util.computeOutShape","$inputs","reals","imags","realConcated","imagConcated","inputs2D","inputsValShapes","finalOutShape","concatConfig","conv2D","backend_util.convertConv2DDataFormat","backend_util.computeConv2DInfo","isChannelsLast","filterStrides","xBatchStride","xRowStride","xColStride","xChannelStride","yBatchStride","yRowStride","yColStride","yChannelStride","wVals","xOffset1","yOffset1","yOffset2","wOffset1","xOffset2","yOffset3","wOffset2","xOffset3","wOffset3","d1","xVal","d2","conv2DConfig","dW","topPad","dyVals","yRMin","yRMax","yCMin","yCMax","conv2DBackpropFilterConfig","dyStrides","dxValues","dyValues","fltValues","fltS0","fltS1","fltS2","dyOffset","fltOffset","dxOffset","conv2DBackpropInputConfig","conv3D","backend_util.computeConv3DInfo","yF","xFCorner","wF","yOffset4","xOffset4","wOffset4","conv3DConfig","conv3DBackpropFilterV2","dw","dwValues","dwS0","dwS1","dwS2","dwS3","dyS0","dyS1","dyS2","dyS3","xS0","xS1","xS2","xS3","frontPad","yFMin","yFMax","conv3DBackpropFilterV2Config","conv3DBackpropInputV2","dxS0","dxS1","dxS2","dxS3","fltS3","xFMin","conv3DBackpropInputV2Config","cosConfig","coshConfig","cropHeight","cropWidth","boxVals","boxIndVals","imageVals","inStride","outStride","startInd","y1","y2","bInd","heightScale","widthScale","yInd","ind","topInd","bottomInd","yLerp","xInd","leftInd","rightInd","xLerp","topLeft","topRight","bottomLeft","bottomRight","closestX","closestY","inInd","outInd","cropAndResizeConfig","permutedAxis","resultDtype","util.makeOnesTypedArray","finalDim","indexAdjuster","prevIdx","reversePermutation","reverseTransposedResult","cumprodConfig","cumsumConfig","denseBincountConfig","outputHeight","outputWidth","outputDepth","outputIdx","inH","offsetH","inW","offsetW","offsetD","inputIdx","depthToSpaceConfig","depthwiseConv2dNative","chMul","depthwiseConv2dNativeConfig","dm","depthwiseConv2dNativeBackpropFilterConfig","depthwiseConv2dNativeBackpropInputConfig","diagConfig","dilation2DConfig","filterVals","filterRank","backend_util.computeDilation2DInfo","outRank","hBeg","wBeg","curVal","hIn","wIn","filterIndex","dilation2DBackpropFilterConfig","gradients","util.makeZerosNestedTypedArray","hMax","wMax","dilation2DBackpropInputConfig","hInMax","wInMax","backend_util.upcastType","oldResult","sumConfig","backend_util.decodeEinsumEquation","backend_util.checkEinsumDimSizes","backend_util.getEinsumComputePath","numDimsRemaining","idTerm","dimsToExpand","backend_util.getEinsumPermutation","backend_util.isIdentityPermutation","einsumConfig","eluGrad","backend_util.ERF_P","a1","backend_util.ERF_A1","a2","backend_util.ERF_A2","a3","backend_util.ERF_A3","a4","backend_util.ERF_A4","a5","backend_util.ERF_A5","erfConfig","$dim","expandDimsConfig","realDivImpl","realDivConfig","fftBatch","innerDim","inputVals","real2D","imag2D","fftImpl","backend_util.getComplexWithIndex","$realInfo","$imagInfo","isExponentOf2","fftRadix2","realInfo","imagInfo","sizeInfo","sizeInfoCopy","divRealInfo","divImagInfo","divRealVals","divImagVals","rawOutput","fourierTransformByMatmul","backend_util.splitRealAndImagArrays","evenComplex","backend_util.complexWithEvenIndex","evenRealVals","evenImagVals","evenShape","evenRealInfo","evenImagInfo","evenTensorInfo","oddComplex","backend_util.complexWithOddIndex","oddRealVals","oddImagVals","oddShape","oddRealInfo","oddImagInfo","oddTensorInfo","$evenComplex","$evenRealVals","$evenImagVals","$evenShape","$evenRealInfo","$evenImagInfo","$evenTensorInfo","$oddComplex","$oddRealVals","$oddImagVals","$oddShape","$oddRealInfo","$oddImagInfo","$oddTensorInfo","backend_util.exponents","eShape","eRealInfo","eImagInfo","exponentInfo","addPart","subPart","addPartReal","subPartReal","addPartImag","subPartImag","$realVals","$imagVals","backend_util.exponent","term","backend_util.assignToTypedArray","input2D","resultReshaped","fftConfig","util.inferDtype","fillValues","fillConfig","flipLeftRightConfig","batchOffset","rowOffset","coordX","outputValue","rotatedColOffset","imageIdx","floorDivImpl","floorDivConfig","fusedConv2D","resultOld","reshapedBias","reshapedAlpha","fusedConv2DConfig","fusedDepthwiseConv2D","fusedDepthwiseConv2DConfig","gatherNd","backend_util.prepareAndValidate","gatherNdConfig","gatherV2","indicesVals","axisDim","$batchDims","shapeInfo","backend_util.segment_util.collectGatherOpShapeInfo","flattenX","gatherV2Config","ifftConfig","isFiniteConfig","isInfConfig","isNaNConfig","linSpace","linSpaceConfig","log1pConfig","logicalAndImpl","logicalAndConfig","logicalNotConfig","logicalOrImpl","logicalOrConfig","lRN","channels","maxD","sumAcrossChannels","currentChannel","beginSumOffset","endSumOffset","LRNConfig","lRNGrad","dySize","yValues","depthBegin","depthEnd","dyi","LRNGradConfig","maxOutShape","maxConfig","maxPoolConfig","maxPool3D","maxPool3DConfig","maxPool3DGrad","inputBuf","maxPosBuf","maxPos","curPos","maxPoolWithArgmaxImpl","maxPools","maxPoolWithArgmaxConfig","pooled","pooledDataId","indexesDataId","toDispose","reduceSizeScalar","meanConfig","minConfig","coords","inIndex","mirrorPadConfig","modImpl","modConfig","logitsRank","maxLogit","maxLogitReshaped","sumExp","sumReshaped","softmaxConfig","probabilities","numEvents","probVals","resShape","cdf","sampleId","multinomialConfig","kernel_impls.nonMaxSuppressionV3Impl","nonMaxSuppressionV3","nonMaxSuppressionV3Config","kernel_impls.nonMaxSuppressionV4Impl","nonMaxSuppressionV4","nonMaxSuppressionV4Config","kernel_impls.nonMaxSuppressionV5Impl","nonMaxSuppressionV5","maxOutputSizeVal","iouThresholdVal","scoreThresholdVal","softNmsSigmaVal","nonMaxSuppressionV5Config","indicesVal","oneHotConfig","imagPart","zerosLikeConfig","onesLikeConfig","pack","expandedTensors","expandedT","packConfig","padV2","outCoords","padV2Config","powImpl","powConfig","$paramsNestedSplitsShapes","outputDenseValuesShape","outputNestedSplitsTensors","outputDenseValuesTensor","raggedGatherConfig","$rowPartitionValues","raggedTensorToTensorConfig","rangeConfig","reciprocalConfig","imagesStrides","newHeight","newWidth","oldHeight","oldWidth","effectiveInputSize","effectiveOutputSize","effectiveRowSizeRatio","effectiveColSizeRatio","sourceFracRow","sourceRowFloor","rowFrac","sourceRowCeil","topRowOffset","botRowOffset","sourceFracCol","sourceColFloor","colFrac","sourceColCeil","topLeftOffest","botLeftOffset","topRightOffset","botRightOffest","resizeBilinearConfig","resizeBilinearGrad","xHeight","xWidth","yHeight","yWidth","effectiveXSize","effectiveYSize","bOffset","topDxRIndex","bottomDxRIndex","topDxROffset","bottomDxROffset","dxRLerp","inverseDxRLerp","leftDxCIndex","rightDxCIndex","dxCLerp","inverseDxCLerp","topLeftRCOffset","topRightRCOffset","bottomLeftRCOffset","bottomRightRCOffset","inverseDxRLerpTimesInverseDxCLerp","inverseDxRLerpTimesDxCLerp","dxRLerpTimesInverseDxCLerp","dxRLerpTimesDxCLerp","dyVal","sourceNearestRow","sourceNearestCol","resizeNearestNeighborConfig","resizeNearestNeighborGrad","invHeightScale","invWidthScale","winHeight","winWidth","startRLerp","startDyR","startCLerp","startDyC","accum","dyRIndex","dyROffset","dyCIndex","dyCOffset","$dims","reverseConfig","rotateWithOffsetConfig","backend_util.getImageCenter","fullOpacityValue","sinFactor","cosFactor","coordY","rotatedRowOffset","roundConfig","scatterNd","backend_util.calculateShapes","updatesBuf","scatterNdConfig","mid","searchSortedImpl","sortedInputsSlice","searchSortedConfig","conditionRank","tValues","eValues","selectConfig","backend_util.SELU_SCALEALPHA","backend_util.SELU_SCALE","seluConfig","signConfig","sinConfig","sinhConfig","tooLarge","tooSmall","expX","softplusConfig","completePaddings","paddedX","reshapedPaddedShape","permutedReshapedPaddedPermutation","paddedXReshaped","paddedXT","spaceToBatchNDConfig","outputIndicesShape","sparseFillEmptyRowsConfig","sparseReshapeConfig","outputData","outputDataShape","sparseSegmentMeanConfig","sparseSegmentSumConfig","sparseToDenseConfig","splitV","backend_util.prepareSplitSize","sliceT","splitVConfig","squareConfig","stepAttrs","stepConfig","finalShapeSparse","$end","$strides","slice_util.sliceInfo","slice_util.computeOutShape","sliced","stridedSliceConfig","stringNGramsConfig","stringSplitConfig","stringToHashBucketFastConfig","tanConfig","tanhConfig","tileConfig","topK","topKConfig","inStrides","batchInStride","rowInStride","colInStride","outStrides","batchOutStride","rowOutStride","colOutStride","transformVals","outY","outX","projection","inX","inY","mapCoord","nearestInterpolation","bilinearInterpolation","transformConfig","outCoord","mapCoordReflect","mapCoordWrap","mapCoordNearest","mapCoordConstant","inCoord","sz2","sz","readWithFillValue","batchStride","rowStride","colStride","yFloor","xFloor","yCeil","xCeil","valueYFloor","valueYCeil","uniqueConfig","unpack","valueRank","tempRes","unpackConfig","segmentIdsRank","expanded","scalarValue","maskCasted","sumTensorInfo","unsortedSegmentSumConfig","kernelConfigs","kernelConfig","WEBGL_ATTRIBUTES","setWebGLContext","webGLVersion","gl","getWebGLContext","customCanvas","newCtx","getWebGLRenderingContext","createCanvas","canvas","ev","PackingScheme","TextureUsage","PhysicalTextureType","getUnpackedMatrixTextureShapeWidthHeight","getUnpackedArraySizeFromMatrixSize","matrixSize","channelsPerTexture","getDenseTexShape","texelsNeeded","util.sizeToSquarishShape","getPackedMatrixTextureShapeWidthHeight","getPackedRGBAArraySizeFromMatrixShape","getTextureConfig","textureHalfFloatExtension","glany","internalFormatFloat","internalFormatHalfFloat","internalFormatPackedHalfFloat","internalFormatPackedFloat","textureFormatFloat","downloadTextureFormat","downloadUnpackNumChannels","defaultNumChannels","textureTypeHalfFloat","textureTypeFloat","callAndCheck","returnValue","checkWebGLError","getWebGLErrorMessage","MIN_FLOAT16","MAX_FLOAT16","canBeRepresented","status","getExtensionOrThrow","extensionName","throwIfNull","createVertexShader","vertexShaderSource","vertexShader","createFragmentShader","fragmentShaderSource","fragmentShader","logShaderSourceAndInfoLog","lineNumberRegex","shaderSource","shaderInfoLog","lineNumberRegexResult","lineNumber","shaderLines","linesWithLineNumbers","maxLineLength","beforeErrorLines","errorLine","afterErrorLines","createProgram","linkProgram","program","validateProgram","createStaticVertexBuffer","createStaticIndexBuffer","createTexture","validateTextureSize","maxTextureSize","requested","createFramebuffer","bindVertexBufferToProgramAttribute","attribute","arrayEntriesPerItem","itemStrideInBytes","itemOffsetInBytes","bindTextureUnit","texture","textureUnit","validateTextureUnit","getProgramUniformLocationOrThrow","uniformName","getProgramUniformLocation","bindTextureToProgramUniformSampler","uniformSamplerLocation","bindColorTextureToFramebuffer","framebuffer","unbindColorTextureFromFramebuffer","validateFramebuffer","getFramebufferErrorMessage","returnTOrNull","failureMessage","tOrNull","maxTextureUnit","glTextureUnit","textureUnitRange","getBatchDim","dimsToSkip","getRowsCols","getShapeAs3D","shapeAs3D","getTextureShapeFromLogicalShape","logShape","isPacked","maxTexSize","maxSizeForNarrowTex","util.nearestLargerEven","util.squeezeShape","textureShape","isLongNarrowTex","isEven","isReshapeFree","shape1Cols","shape2Cols","MAX_TEXTURE_SIZE","MAX_TEXTURES_IN_SHADER","getWebGLMaxTextureSize","getMaxTexturesInShader","getWebGLDisjointQueryTimerVersion","queryTimerVersion","hasExtension","isWebGLVersionEnabled","isCapableOfRenderingToFloatTexture","createFloatTextureAndBindToFramebuffer","isDownloadFloatTextureEnabled","COLOR_BUFFER_HALF_FLOAT","createHalfFloatTextureAndBindToFramebuffer","texConfig","frameBuffer","isFrameBufferComplete","isWebGLFenceEnabled","device_util.isMobile","getGlslDifferences","varyingVs","varyingFs","texture2D","defineOutput","defineSpecialNaN","defineSpecialInf","defineRound","getLogicalCoordinatesFromFlatIndex","line1","line2","getOutputLogicalCoordinatesFromFlatIndexByUniform","symbolicallyComputeStrides","indicesArr","numCoords","getLogicalCoordinatesFromFlatIndexByUniform","indicesArray","getFlatIndexFrom3D","getFlatIndexFrom3DOutput","ENCODE_FLOAT_SNIPPET","backend_util","makeShader","inputsInfo","prefixSnippets","uniformShape","getUniformInfoFromShape","inputPrefixSnippet","inputSamplingSnippet","getInputSamplingSnippet","outTexShape","glsl","floatTextureSampleSnippet","getFloatTextureSampleSnippet","outputSamplingSnippet","floatTextureSetOutputSnippet","shaderPrefix","getShaderPrefix","getPackedOutputSamplingSnippet","getFloatTextureSetRGBASnippet","getOutputSamplingSnippet","getFloatTextureSetRSnippet","SHADER_PACKED_PREFIX","getSamplerFromInInfo","inInfo","enableShapeUniforms","getSamplerScalar","getSampler1D","getSampler2D","getSampler3D","getSampler4D","getSampler5D","getSampler6D","getPackedSamplerFromInInfo","getPackedSamplerScalar","getPackedSampler1D","getPackedSampler2D","getPackedSampler3D","getPackedSamplerND","outShapeInfo","usesPackedTextures","getPackedSamplerAtOutputCoords","getSamplerAtOutputCoords","getOutputScalarCoords","getOutputPacked1DCoords","getOutputPacked2DCoords","getOutputPacked3DCoords","getOutputPackedNDCoords","getOutput1DCoords","getOutput2DCoords","getOutput3DCoords","getOutput4DCoords","getOutput5DCoords","getOutput6DCoords","SAMPLE_1D_SNIPPET","SAMPLE_2D_SNIPPET","SAMPLE_3D_SNIPPET","texShape","packedTexShape","texelsInLogicalRow","texelsInBatch","shader_util.getOutputLogicalCoordinatesFromFlatIndexByUniform","coordsFromIndexSnippet","shader_util.getLogicalCoordinatesFromFlatIndex","texelsInBatchN","getFlatOffsetUniformName","texName","inputInfo","funcName","texNumR","texNumC","tNumR","tNumC","getUniformSampler","valuesPerRow","newInputInfo","squeezeInputInfo","getSqueezedParams","stride0","stride1","stride2","stride2Str","stride1Str","stride0Str","stride3","stride4","texFuncSnippet","broadcastDims","getCoordsDataType","rankDiff","coordsSnippet","unpackedCoordsSnippet","isInputScalar","isOutputScalar","inTexShape","useSqueezePackedShape","useSqueezeShape","compileProgram","gpgpu","inputInfos","inShapeInfos","source","shader_compiler.makeShader","webGLProgram","getUniformLocations","uniformLocations","inShapesLocations","inTexShapesLocations","customUniformLocations","outShapeLocation","outTexShapeLocation","outShapeStridesLocation","infLoc","nanLoc","shouldThrow","validateBinaryAndProgram","shapeInfos","texShapeA","texShapeB","runProgram","binary","customUniformValues","outTex","varLoc","varOffsetLoc","varShapeLoc","varTexShapeLoc","shader_compiler.getUniformInfoFromShape","outShapeLoc","customLoc","customValue","makeShaderKey","keyInputs","hasOffset","xTexShape","rank1","rank2","rank34","isLogicalShapTexShapeEqual","isScalar","isInOutTexShapeEqual","isTexShapeGreaterThanOne","keyUserCode","useShapeUniforms","DecodeMatrixProgram","DecodeMatrixPackedProgram","EncodeFloatProgram","EncodeFloatPackedProgram","EncodeMatrixProgram","inputIsUnsignedByte","shader_util.getFlatIndexFrom3DOutput","shader_util.getFlatIndexFrom3D","EncodeMatrixPackedProgram","mainLoop","webgl_util.createVertexShader","createVertexBuffer","vertexArray","webgl_util.createStaticVertexBuffer","createIndexBuffer","triangleVertexIndices","webgl_util.createStaticIndexBuffer","createAndConfigureTexture","internalFormat","textureFormat","textureType","webgl_util.validateTextureSize","webgl_util.createTexture","tex2d","webgl_util.callAndCheck","getInternalFormatForFloat32MatrixTexture","textureConfig","createFloat32MatrixTexture","tex_util.getUnpackedMatrixTextureShapeWidthHeight","getInternalFormatForFloat16MatrixTexture","createFloat16MatrixTexture","getInternalFormatForUnsignedBytesMatrixTexture","createUnsignedBytesMatrixTexture","getInternalFormatForPackedMatrixTexture","createPackedMatrixTexture","tex_util.getPackedMatrixTextureShapeWidthHeight","getInternalFormatForFloat16PackedMatrixTexture","createFloat16PackedMatrixTexture","bindVertexProgramAttributeStreams","vertexBuffer","webgl_util.bindVertexBufferToProgramAttribute","uploadDenseMatrixToTexture","dataForUpload","texelDataType","uploadPixelDataToTexture","createBufferFromOutputTexture","gl2","bufferSizeBytes","downloadFloat32MatrixFromBuffer","downloadTarget","downloadByteEncodedFloatMatrixFromOutputTexture","tex_util.getUnpackedArraySizeFromMatrixSize","downloadPackedMatrixFromBuffer","physicalRows","physicalCols","tex_util.getPackedRGBAArraySizeFromMatrixShape","downloadMatrixFromPackedOutputTexture","packedRGBA","GPGPUContext","glVersion","COLOR_BUFFER_FLOAT","TEXTURE_FLOAT","TEXTURE_HALF_FLOAT","webgl_util.getExtensionOrThrow","webgl_util.hasExtension","gpgpu_util.createVertexBuffer","gpgpu_util.createIndexBuffer","webgl_util.createFramebuffer","tex_util.getTextureConfig","gpgpu_util.createFloat32MatrixTexture","gpgpu_util.createFloat16MatrixTexture","gpgpu_util.createUnsignedBytesMatrixTexture","gpgpu_util.uploadPixelDataToTexture","gpgpu_util.uploadDenseMatrixToTexture","gpgpu_util.createFloat16PackedMatrixTexture","gpgpu_util.createPackedMatrixTexture","webgl_util.unbindColorTextureFromFramebuffer","gpgpu_util.downloadByteEncodedFloatMatrixFromOutputTexture","gpgpu_util.downloadPackedMatrixFromBuffer","gpgpu_util.downloadFloat32MatrixFromBuffer","gpgpu_util.createBufferFromOutputTexture","fenceContext","isFencePassed","sync","gpgpu_util.downloadMatrixFromPackedOutputTexture","gpgpu_util.createVertexShader","webgl_util.createProgram","webgl_util.linkProgram","webgl_util.validateProgram","gpgpu_util.bindVertexProgramAttributeStreams","webgl_util.getProgramUniformLocationOrThrow","webgl_util.getProgramUniformLocation","inputMatrixTexture","uniformLocation","webgl_util.bindTextureToProgramUniformSampler","outputMatrixTexture","outputPackedMatrixTexture","startRow","startColumn","webgl_util.validateFramebuffer","ext","util.repeatedTry","available","linearSearchLastTrue","resolveFn","isDoneFn","webgl_util.bindColorTextureToFramebuffer","downloadAndDecode","outputMatrixTextureMaybePacked","addImplCPU","bincountImplCPU","bincountReduceImplCPU","castImplCPU","ceilImplCPU","concatImplCPU","equalImplCPU","expImplCPU","expm1ImplCPU","floorImplCPU","gatherNdImplCPU","gatherV2ImplCPU","greaterImplCPU","greaterEqualImplCPU","lessImplCPU","lessEqualImplCPU","linSpaceImplCPU","logImplCPU","maxImplCPU","maximumImplCPU","minimumImplCPU","multiplyImplCPU","negImplCPU","notEqualImplCPU","prodImplCPU","raggedGatherImplCPU","raggedTensorToTensorImplCPU","rangeImplCPU","rsqrtImplCPU","scatterImplCPU","sigmoidImplCPU","simpleAbsImplCPU","sliceImplCPU","sparseFillEmptyRowsImplCPU","sparseReshapeImplCPU","sparseSegmentReductionImplCPU","sqrtImplCPU","stridedSliceImplCPU","stringNGramsImplCPU","stringSplitImplCPU","stringToHashBucketFastImplCPU","subImplCPU","tileImplCPU","topKImplCPU","transposeImplCPU","uniqueImplCPU","shared","getVecChannels","getChannels","getSourceCoords","PackProgram","outOfBoundsCondition","setup","coord","sourceCoords","ReshapePackedProgram","thisRC","getReshapedInputCoords","shader_util.getLogicalCoordinatesFromFlatIndexByUniform","TextureManager","shapeRC","usage","physicalTexType","getPhysicalFromLogicalTextureType","getKeyFromTextureShape","texBytes","computeBytes","newTexture","logicalTexType","deleteTexThreshold","texList","texIndex","freeRatio","tex","numBytesForInternalFormat","internalFormatForPhysicalTexType","packedWidth","packedHeight","getPhysicalTextureForRendering","shapeRowsCol","UnaryOpProgram","opSnippet","CHECK_NAN_SNIPPET","LINEAR","ABS","RELU","RELU6","CLONE","SIGMOID","UnaryOpPackedProgram","UnpackProgram","binaryCaches","getBinaryCache","CPU_HANDOFF_SIZE_THRESHOLD","BEFORE_PAGING_CONSTANT","numMBBeforeWarning","MathBackendWebGL","gpuResource","newGPGPU","texData","unary_op.CLONE","shouldTimeProgram","subscribers","tmpDownloadTarget","tmpData","tex_util.getDenseTexShape","dTypeVals","gpuResouorce","tmpTarget","tensorRef","webgl_util.canBeRepresented","shouldUsePackedProgram","webgl_util.getShapeAs3D","oldActiveTimers","newActiveTimers","outerMostTime","flattenedActiveTimerQueries","util.flatten","flattenedActiveTimerNames","kernelMs","util.sum","timerQuery","sizeThreshold","outValues","unary_op.ABS","afterShape","input3DShape","webgl_util.getBatchDim","webgl_util.getRowsCols","input3D","afterShapeAs3D","preventEagerUnpackingOfOutput","customValues","customTexShape","texSize","outputDtype","outData","tex_util.PackingScheme","texelShape","dataToDispose","inputsData","webgl_util.isReshapeFree","savedInput","gpgpu_math.makeShaderKey","gpgpu_math.compileProgram","gpgpu_math.runProgram","glFlushThreshold","unpacked","getBinary","debugFlag","underflowCheckValue","webgl_util.getTextureShapeFromLogicalShape","isByteArray","tempDenseInputTexShape","tempDenseInputHandle","tempDenseInputTexData","encodedOutputTarget","outputTexData","float32Values","float32ToTypedArray","texType","mb","webgl_util.logShaderSourceAndInfoLog","BinaryOpProgram","CHECK_NAN_SNIPPET_PACKED","BinaryOpPackedProgram","checkOutOfBounds","checkOutOfBoundsString","realTensorInfo","imagTensorInfo","LEAKYRELU","LEAKYRELU_PACKED","PRELU","PRELU_PACKED","CHECK_NAN_SNIPPET_UNARY","packedOpSnippet","cpuKernelImpl","webglBackend","supportsComplex","aData","bData","complexParts","aPart","bPart","aHandle","bHandle","complexOutput","mapActivationToShaderProgram","packed","unary_packed_op.LINEAR","unary_op.LINEAR","unary_packed_op.RELU","unary_op.RELU","unary_packed_op.ELU","unary_op.ELU","unary_packed_op.RELU6","unary_op.RELU6","unary_packed_op.SIGMOID","unary_op.SIGMOID","MatMulPackedProgram","addBias","hasPreluActivation","hasLeakyreluActivation","sharedDimensionPacked","aSample","bSample","aSwizzle","bSwizzle","activationSnippet","applyActivationSnippet","addBiasSnippet","batchASnippet","batchBSnippet","COMPLEX_MULTIPLY","BinaryOpComplexProgram","MUL","realProgram","binaryop_complex_gpu.COMPLEX_MULTIPLY","imagProgram","cpuMultiply","packedReshape","xTexData","MeanProgram","reduceInfo","windowSize","windowSizeNearestVec4","windowSizeVec4Remainder","updateSnippet","ReduceProgram","reduceType","initializationValue","compareOp","vecType","getReductionStages","stages","backend_util.computeOptimalWindowSize","reduce","reductionType","reductionStages","previousResult","TransposeProgram","switched","getSwitchedCoords","originalOrder","switchedCoords","TransposePackedProgram","outputOrder","switchedOrder","nextColumn","getc","sumImpl","sumInputIsTransposed","sumInput","sumOutShape","reshapedInput","outType","reduced","cpuTranspose","MATMUL_SHARED_DIM_THRESHOLD","batchMatMulImpl","hasBias","hasPreluActivationWeights","hasLeakyreluAlpha","fusedActivation","containsFusedOps","aVec","bVec","shouldReshapeA","shouldReshapeB","aVec3d","bVec3d","$leakyreluAlpha","outReshaped","ACOS","ACOSH","ADD","addKernelFunc","cpuAdd","AddNProgram","snippets","operation","AddNPackedProgram","midIndex","leftSide","rightSide","a2D","ArgMinMaxProgram","firstPass","compOp","indexSnippet","ArgMinMaxPackedProgram","sourceLocSetup","sourceRank","sourceLocDType","inChannel","intChannels","srcRCoords","srcGCoords","srcBCoords","srcACoords","fetchCandidateIdx","fetchValue","getBestIndicesAChannelSnippet","argReduce","bestIndicesA","argReducePacked","argMinMaxReduce","xtexData","xIsPacked","xUnPacked","ASIN","ASINH","ATAN","ATAN2","ATAN2_PACKED","ATANH","Pool2DProgram","computePositions","isAvgPool","batchFlattenPositionStr","flattenPositionStr","filterWidthNearestVec4","filterWidthVec4Remainder","Pool3DProgram","avgPoolProgram","AvgPool2DBackpropProgram","AvgPool3DBackpropProgram","avgPoolBackpropProgram","BatchNormProgram","meanShape","varianceShape","offsetShape","scaleShape","offsetSnippet","scaleSnippet","BatchNormPackedProgram","finalInputs","SliceProgram","destSize","getCoords","body","coordSum","SlicePackedProgram","sourceLoc","getChannel","upperRow","lowerRow","shallowSlice","newTexData","reshapedIntermediate","transposedIntermediate","reshapedIntermediate2","TO_INT","int","zerosTensor","tf.zeros","CEIL","ClipProgram","ClipPackedProgram","ComplexAbsProgram","makeComplexComponentTensorInfo","complexTensor","complexPart","complexAbs","programInputs","ConcatProgram","offsets","lastIndex","lastShift","ConcatPackedProgram","lastChannels","allChannels","getValueSnippet","shiftedChannels","channelIdx","runOnCpu","tensors2D","maxTexturesInShader","reducedInputs","subArray","computeTensors2D","Conv2DProgram","inputDepthNearestVec4","inputDepthVec4Remainder","rowDim","colDim","channelDim","Conv3DProgram","Conv2DPackedProgram","hasLeakyReluAlpha","texelsAcross","texelC","colIndex","nextTexelOffset","Im2ColPackedProgram","boundsCheckingSnippet","unrolled","getShapeForBatchMatMul","conv2dByMatMul","sharedMatMulDim","outerShapeX","outerShapeFilter","originalXTexDataShape","filterReshaped","pointwiseConv","pointwiseConvTexData","conv2dWithIm2Row","x2ColShape","w2Row","im2ColProgram","im2Col","im2ColReshaped","matmulProgram","Conv2DDerFilterProgram","Conv2DDerInputProgram","Conv3DDerFilterProgram","Conv3DDerInputProgram","conv3DBackpropInputConfig","COS","CropAndResizeProgram","imageShape","boxShape","methodId","inputHeightFloat","inputWidthFloat","heightRatio","widthRatio","CumOpType","CumProgram","initVal","idxString","getFinalCoord","cumImpl","prevResult","DepthToSpaceProgram","DepthwiseConv2DProgram","channelMul","DepthwiseConvPacked2DProgram","DepthwiseConv2DDerFilterProgram","DepthwiseConv2DDerInputProgram","DiagProgram","flat","Dilation2DProgram","dilation2D","ELU_DER","ELU_DER_PACKED","ERF","EXP","EXPM1","FFTProgram","component","exponentMultiplierSnippet","resultDenominator","opString","complexOutputReshaped","FillProgram","FlipLeftRightProgram","FLOOR","FromPixelsProgram","FromPixelsPackedProgram","fromPixelsConfig","willReadFrequently","newWillReadFrequently","tempPixelHandle","fusedConv2d","prepareInputs","alignInputWithDataFormat","alignedInput","shouldPackDepthwiseConv","GatherNDProgram","flattenIndices","outValue","GatherProgram","currentCoords","LOG","LOG1P","LRNProgram","radius","rad","powOperator","basis","LRNPackedProgram","LRNGradProgram","reshapedOutput","maxInputIsTransposed","shouldExecuteOnCPU","maxInput","maxInputValues","maxInputData","MAXIMUM","MAXIMUM_PACKED","maxPoolProgram","MaxPool2DBackpropProgram","MaxPool3DBackpropProgram","maxPool3dPositionsProgram","maxPoolBackpropProgram","getPositions","maxPoolPositionsProgram","maxPoolBackPropProgram","poolOutput","indexOutput","meanImpl","meanInputIsTransposed","meanInput","meanInputValues","meanInputData","meanOutShape","MINIMUM","MINIMUM_PACKED","MirrorPadProgram","unpackedCoords","MirrorPadPackedProgram","cLimit","padSetup","MOD","MOD_PACKED","MultinomialProgram","realDiv","SUB","cpuSub","maxLogitsReshaped","sumExpReshaped","probs","NEG","NEG_PACKED","OneHotProgram","PadProgram","PadPackedProgram","componentSetup","paddingArea","POW","POW_PACKED","ResizeBilinearProgram","effectiveInSize","effectiveOutSize","sourceFracIndexRC","ResizeBilinearPackedProgram","ResizeBilinearBackpropProgram","ResizeNearestNeighborProgram","roundBase","ResizeNearestNeighborPackedProgram","ResizeNearestNeigborBackpropProgram","ReverseProgram","getInCoord","inCoords","ReversePackedProgram","nextRow","getR","getG","getB","getA","inCoordsArray","channels1","RotateProgram","fillSnippet","ScatterProgram","updateSize","updatesRank","summingDupeIndex","stridesType","indicesString","indicesSnippet","updatesString","updatesSnippet","strideString","SearchSortedProgram","webGL2LoopHead","webGL1LoopHead","loopHead","boundComparator","SelectProgram","cRank","cCoords","abCoords","cCoordVars","abCoordVars","SELU","SIN","reshapedPaddedX","SQRT","SQUARED_DIFFERENCE","StridedSliceProgram","inputDtype","newCoords","outputAxis","TileProgram","SwapProgram","MergeProgram","disposeIntermediateTensorInfoOrNull","roundUpToPow2","pow2","TOPK_LAST_DIM_CPU_HANDOFF_SIZE_THRESHOLD","TOPK_K_CPU_HANDOFF_THRESHOLD","x2D","kPow2","lastDimPow2","getInputs","runSwap","dir","inc","prevIndices","mergeProgram","prevValues","TransformProgram","interpolationModeId","fillModeId","SegmentOpProgram","segOpInfo","segOpType","checkValueOutOfBounds","checkSegmentIdOutOfBounds","backend_util.segment_util.computeOutShape","segOpCompute","backend_util.segment_util.segOpComputeOptimalWindowSize","rangeInfo","tileInfo","segOpResult","_defineProperty","_extends","_toConsumableArray","arr2","DEFAULT_OPTIONS","determinationCoefficient","observations","observation","ssyy","difference","sse","prediction","residual","gaussianElimination","order","matrix","coefficients","maxrow","_j","_k","_j2","_k2","number","factor","methods","run","rise","intercept","predict","points","point","coeffA","coeffB","lhs","rhs","_l","coeff","_i","createWrapper","supplied","require","_dereq_","exports","Mutation","scheduleDrain","called","observer","nextTick","scriptEl","draining","queue","oldQueue","immediate","task","INTERNAL","REJECTED","FULFILLED","PENDING","Promise","resolver","safelyResolveThenable","onRejected","onFulfilled","unwrap","QueueItem","self","tryCatch","getThen","thenable","then","onError","onSuccess","tryToUnwrap","reason","resolved","allResolver","resolveFromAll","race","_typeof","_classCallCheck","Constructor","getIDB","idb","isIndexedDBValid","isSafari","hasFetch","createBlob","properties","Builder","builder","Promise$1","executeCallback","executeTwoCallbacks","errorCallback","normalizeKey","getCallback","DETECT_BLOB_SUPPORT_STORE","supportsBlobs","dbContexts","toString","READ_ONLY","READ_WRITE","_binStringToArrayBuffer","bin","_checkBlobSupportWithoutCaching","txn","blob","matchedChrome","matchedEdge","_checkBlobSupport","_deferReadiness","dbInfo","dbContext","deferredOperation","_advanceReadiness","_rejectReadiness","_getConnection","upgradeNeeded","createDbContext","dbArgs","openreq","_getOriginalConnection","_getUpgradedConnection","_isUpgradeNeeded","defaultVersion","isNewStore","isDowngrade","isUpgrade","incVersion","_encodeBlob","reader","base64","_decodeBlob","encodedBlob","arrayBuff","_isEncodedBlob","_fullyReady","_tryReconnect","forages","forage","createTransaction","retries","_initStorage","initPromises","ignoreErrors","getItem","transaction","store","req","iterate","iterationNumber","cursor","setItem","blobSupport","removeItem","clear","advanced","dropInstance","currentConfig","isCurrentDb","dbPromise","newVersion","dropObjectPromise","_forage2","dropDBPromise","_forage","asyncStorage","isWebSQLValid","BASE_CHARS","BLOB_TYPE_PREFIX","BLOB_TYPE_PREFIX_REGEX","SERIALIZED_MARKER","SERIALIZED_MARKER_LENGTH","TYPE_ARRAYBUFFER","TYPE_BLOB","TYPE_INT8ARRAY","TYPE_UINT8ARRAY","TYPE_UINT8CLAMPEDARRAY","TYPE_INT16ARRAY","TYPE_INT32ARRAY","TYPE_UINT16ARRAY","TYPE_UINT32ARRAY","TYPE_FLOAT32ARRAY","TYPE_FLOAT64ARRAY","TYPE_SERIALIZED_MARKER_LENGTH","toString$1","stringToBuffer","serializedString","bufferLength","encoded1","encoded2","encoded3","encoded4","bufferToString","base64String","serialize","valueType","marker","fileReader","blobType","matcher","localforageSerializer","createDbTable","_initStorage$1","dbInfoPromise","tryExecuteSql","sqlStatement","getItem$1","iterate$1","_setItem","retriesLeft","sqlError","setItem$1","removeItem$1","clear$1","length$1","key$1","keys$1","getAllStoreNames","storeNames","dropInstance$1","operationInfo","dropTable","storeName","operations","webSQLStorage","isLocalStorageValid","_getKeyPrefix","defaultConfig","keyPrefix","checkIfLocalStorageThrows","localStorageTestKey","_isLocalStorageUsable","_initStorage$2","clear$2","getItem$2","iterate$2","keyPrefixLength","key$2","keys$2","itemKey","length$2","removeItem$2","setItem$2","dropInstance$2","localStorageWrapper","sameValue","includes","searchElement","isArray","DefinedDrivers","DriverSupport","DefaultDrivers","DefaultDriverOrder","OptionalDriverMethods","LibraryMethods","DefaultConfig","callWhenReady","localForageInstance","libraryMethod","_args","extend","_key","LocalForage","driverTypeKey","driver","driverName","driverObject","complianceError","driverMethods","driverMethodName","isRequired","configureMissingMethods","methodNotImplementedFactory","methodName","_len","optionalDriverMethod","setDriverSupport","support","getDriverPromise","serializerPromise","drivers","supportedDrivers","setDriverToConfig","extendSelfWithDriver","initDriver","currentDriverIndex","driverPromiseLoop","oldDriverSetDone","libraryMethodsAndProperties","localforage_js","E","L","I","B","C","O","P","R","T","F","U","d.fromPixels","S","D","W","H","A","V","G","K","J","Q","Y","Z","$","tt","et","nt","rt","ot","st","at","TFFaceMesh","__publicField","video","imageCanvas","context2D","leftBBox","rightBBox","eyeTopArc","eyeBottomArc","topLeftOrigin","bottomRightOrigin","leftOriginX","leftOriginY","leftWidth","leftHeight","rightOriginX","rightOriginY","rightWidth","rightHeight","eyeObjs","leftImageData","rightImageData","ctx","keypoints","faceLandmarksDetection.load","faceLandmarksDetection.SupportedPackages","applyArithmeticOperation","transposedMatrix","getMatrix","j1","getSubMatrix","i1","subI","mult","matrix1","matrix2","Bcolj","Arowi","multScalar","inv","solve","LUDecomposition","QRDecomposition","LU","piv","LUrowi","LUcolj","kmax","nx","QR","Rdiag","nrm","resizeWidth","resizeHeight","DataWindow","getEyeFeats","eyes","process","resizeEye","gray","hist","equalizeHistogram","srcLength","tempCanvas","bound","KalmanFilter","pInitial","xInitial","xP","pP","transposedZ","ridge","nc","mCoefficients","xt","solution","ss","bb","dataWindow","trailDataWindow","Ridge","leftData","rightData","screenPos","deltaT","PInitial","RidgeReg","eyesObj","acceptTime","trailX","trailY","trailFeat","screenXArray","screenYArray","eyeFeatures","coefficientsX","coefficientsY","eyeFeats","predictedX","predictedY","newGaze","RidgeWeightedReg","weightedEyeFeats","weightedXArray","weightedYArray","trueIndex","RidgeRegThreaded","evt","videoStream","videoContainerElement","videoElement","videoElementCanvas","faceOverlay","faceFeedbackBox","gazeDot","debugVideoLoc","xPast50","yPast50","past50PredictedTimestamp","clockStart","latestEyeFeatures","latestGazeData","paused","nopCallback","gazeListener","eventTypes","moveClock","curTracker","regs","curTrackerMap","regressionMap","localstorageDataLabel","localstorageSettingsLabel","settings","defaults","clearAll","removeMouseEventListeners","computeValidationBoxSize","vw","vh","pw","ph","smaller","larger","boxSize","topVal","leftVal","checkEyesInValidationBox","topBound","leftBound","rightBound","bottomBound","eyeLX","eyeLY","eyeRX","eyeRY","xPositions","yPositions","drawCoordinates","colour","getPupilFeatures","paintCurrentFrame","getPrediction","regModelIndex","reg","smoothingVals","loop","elapsedTime","tracker","getTracker","predTimestamp","storePoints","recordScreenPosition","eventType","clickListener","setGlobalData","moveListener","addMouseEventListeners","loadGlobalData","localforage","loadData","storeData","clearData","stream","topDist","leftDist","hideVideoElement","videoPreviewSetup","setupPreviewVideo","setInternalVideoBufferSizes","setVideoViewerSize","setUserMediaVariable","constraints","getUserMedia","onFail","isReady","pause","resume","stopVideo","detectCompatibility","showVideoPreview","showVideo","showFaceOverlay","showFaceFeedbackBox","showPredictionPoints","showGazeDot","toggleShowStoredPoints","showPoints","startStoringPoints","stopStoringPoints","setGazeDotColor","color","setStoredDotColor","saveDataAcrossSessions","applyKalmanFilter","setCameraConstraints","videoTrack","videoSettings","setStaticVideo","videoLoc","tlwh","predictedTimestamp","setTracker","setRegression","addTrackerModule","constructor","addRegressionModule","addRegression","newReg","setGazeListener","listener","clearGazeListener","setVideoElementCanvas","getRegression","getCurrentPrediction","regIndex","getEventTypes","getVideoElementCanvas","getVideoPreviewToCameraResolutionRatio","getStoredPoints","getStoredPointsWithTimestamp"],"mappings":"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AAIC,EAAU,EAAE,EAC5BD,EAAa3oC,GAAW2oC,EAAY,EAAI,CAAC,EAE7CA,EAAaxkC,GAAWwkC,EAAYv6D,GAAKs6D,EAAS,MAAO,MAAM,CAAC,EAChE,MAAMG,EAAY7sC,GAAU0sC,CAAQ,EACpC,OAAO5sC,GAAM6sC,EAAYD,EAAUG,CAAS,CAChD,CCnDA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAkBO,MAAMC,GAAsB,CAC/B,WAAYjwE,GACZ,SAAWmS,IACA,CAAE,EAAG,IAAMgxB,GAAUhxB,CAAE,CAAC,EAEvC,ECvBA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAuHA,MAAM+9D,GAAc,CAChB3M,GACAC,GACAC,GACAC,GACAC,GACAE,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAK,GACAG,GACAC,GACAC,GACAC,GACAE,GACAC,GACAC,GACAC,GACAC,GACAI,GACAD,GACAK,GACAC,GACAC,GACAC,GACAE,GACAE,GACA4G,GACAzG,GACAC,GACAC,GACAC,GACAC,GACAE,GACAD,GACAG,GACAa,GACAmB,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAG,GACAI,GACAA,GACAK,GACAK,GACAG,GACAC,GACAI,GACAG,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAA,GACAC,GACAG,GACAe,GACAG,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAC,GACAI,GACAC,GACAC,GACAC,GACAC,GACAC,GACAE,GACAC,GACAA,GACAC,GACAA,GACAC,GACAE,GACAD,GACAG,GACAC,GACAC,GACAE,GACAC,GACAC,GACAE,GACAI,GACAE,GACAO,EACJ,EACA,UAAWE,KAAkBD,GACzB7uE,GAAiB8uE,CAAc,ECnOnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;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AC5D/F,CACX,CACO,MAAMgjK,GAA2B,CACpC,WAAYjyJ,GACZ,YAAa,MACb,WAAY6+C,EAChB,EChEA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GA4LA,MAAMqzG,GAAgB,CAClBttB,GACA1a,GACA2a,GACAC,GACArW,GACAuW,GACAK,GACAE,GACAE,GACAE,GACAC,GACAC,GACAC,GACAE,GACAC,GACA6D,GACAG,GACAxlE,GACAG,GACA0/D,GACA4H,GACAQ,GACAC,GACAG,GACArgB,GACAkD,GACAqd,GACArhB,GACAshB,GACAc,GACA2B,GACAQ,GACAW,GACAS,GACAmB,GACAQ,GACAC,GACAC,GACA+B,GACAS,GACAC,GACAC,GACAW,GACAG,GACAE,GACAC,GACAC,GACAC,GACAW,GACAK,GACAc,GACAhX,GACAv7D,GACA6pD,GACAupB,GACArpB,GACAupB,GACArpB,GACA8tB,GACAG,GACAC,GACAhuB,GACAwuB,GACAK,GACAE,GACAG,GACAQ,GACA1uB,GACAE,GACA/F,GACAw0B,GACAjT,GACAkT,GACAC,GACAC,GACAze,GACAjQ,GACAE,GACA0uB,GACAvuB,GACAwuB,GACAE,GACAC,GACAE,GACAQ,GACAO,GACAE,GACAzvB,GACA0vB,GACAE,GACA53E,GACAG,GACAi4E,GACAM,GACAC,GACAzwB,GACA4wB,GACAE,GACAa,GACAvxB,GACAK,GACAqxB,GACAG,GACAO,GACA7xB,GACA+xB,GACAG,GACAI,GACAG,GACAE,GACA9jB,GACAjO,GACAoyB,GACAE,GACAC,GACAz6B,GACAguB,GACA0M,GACAtkB,GACAC,GACAI,GACAylB,GACA56E,GACA08E,GACAz8E,GACAy9E,GACAC,GACAO,GACAzxB,GACA6xB,GACAI,GACAI,GACAG,GACAlyB,GACAmyB,GACAC,GACAC,GACAxxB,GACA6oB,GACA+I,GACAO,GACAE,GACAC,GACAG,GACAC,GACAC,GACAI,GACAlwB,GACAmwB,GACAjwB,GACAmw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,GACAhX,GACAv7D,GACA6pD,GACAupB,GACArpB,GACAupB,GACArpB,GACA8tB,GACAG,GACAC,GACAhuB,GACAwuB,GACAupC,GACAlpC,GACAE,GACAG,GACAQ,GACA1uB,GACAE,GACA/F,GACAw0B,GACAjT,GACAkT,GACAC,GACAC,GACAze,GACAjQ,GACAE,GACA0uB,GACAvuB,GACAwuB,GACAE,GACAC,GACAE,GACAQ,GACAO,GACAE,GACAzvB,GACA0vB,GACAE,GACA53E,GACAG,GACAi4E,GACAM,GACAC,GACAzwB,GACA4wB,GACAE,GACAa,GACAvxB,GACAK,GACAqxB,GACAG,GACAO,GACA7xB,GACA+xB,GACAG,GACAI,GACAG,GACAE,GACA9jB,GACAjO,GACAoyB,GACAE,GACAC,GACAz6B,GACAguB,GACA0M,GACAtkB,GACAC,GACAI,GACAylB,GACA56E,GACA08E,GACAz8E,GACAy9E,GACAC,GACAO,GACAzxB,GACA6xB,GACAI,GACAI,GACAG,GACAlyB,GACAmyB,GACAC,GACAC,GACAxxB,GACA6oB,GACA+I,GACAO,GACAE,GACAC,GACAG,GACAC,GACAC,GACAI,GACAlwB,GACAmwB,GACAjwB,GACAmwB,GACAO,GACAC,GACAC,GACAC,GACAxuB,GACAgY,GACAyW,GACAC,GACAC,GACAE,GACAkB,GACA18B,GACA69B,GACAI,GACAM,GACA3M,EACJ,EACA,UAAW6M,KAAgBD,GACvB9wJ,GAAe+wJ,CAAY,sCCjW9B,SAAUp+J,EAAQud,EAAS,CAIxBA,EAAQ4hC,CAAM,CAQlB,GAAGY,GAAM,SAAUZ,EAAQ,CAGzB,SAASo/I,EAAgBxwL,EAAKnN,EAAKlI,EAAO,CACxC,OAAIkI,KAAOmN,EACT,OAAO,eAAeA,EAAKnN,EAAK,CAC9B,MAAOlI,EACP,WAAY,GACZ,aAAc,GACd,SAAU,EAClB,CAAO,EAEDqV,EAAInN,CAAG,EAAIlI,EAGNqV,CACR,CAED,IAAIywL,EAAW,OAAO,QAAU,SAAUhpI,EAAQ,CAChD,QAASl7D,EAAI,EAAGA,EAAI,UAAU,OAAQA,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AAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,eAAe,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,eAAe,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,eAAe,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,eAAe,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,eAAe,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,eAAe,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,eAAe,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,eAAe,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,cAAc,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,gBAAgB,gBAAgB,EAAE,CAAC,eAAe,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,EAAE,CAAC,iBAAiB,gBAAgB,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","x_google_ignoreList":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000,1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1011,1012,1013,1014,1015,1016,1017,1018,1019,1020,1021,1022,1023,1024,1025,1026,1027,1028,1029,1030,1031,1032,1033,1034,1035,1036,1037,1038,1039,1040,1041,1042,1043,1044,1045,1046,1047,1048,1049,1050,1051,1052,1053,1054,1055,1056,1057,1058,1059,1060,1061,1062,1063,1064,1065,1066,1067,1068,1069,1070,1071,1072,1073,1074,1075,1076,1077,1078,1079,1080,1081,1082,1083,1084,1085,1086,1087,1088,1089,1090,1091,1092,1093,1094,1095,1096,1097,1098,1099,1100,1101,1102,1103,1104,1105,1106,1107,1108,1109,1110,1111,1112,1113,1114,1115,1116,1117,1118,1119,1120,1121,1122,1123,1124,1125,1126,1127,1128,1129,1130,1131,1132,1133,1134,1135,1136,1137,1138,1139,1140,1141,1142,1143,1144,1145,1146,1147,1148,1149,1150,1151,1152,1153,1154,1155,1156,1157,1158,1159,1160,1161,1162,1163,1164,1165,1166,1167,1168,1169,1170,1171,1172,1173,1174,1176,1177]}